From d29cb2bf5c751844b93fbb4fe4692187e8f9898f Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:38:15 -0800 Subject: [PATCH 01/41] add projects schema --- schema.prisma | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/schema.prisma b/schema.prisma index 51e6ea94540..7a7bfd3ea48 100644 --- a/schema.prisma +++ b/schema.prisma @@ -23,6 +23,7 @@ model LiteLLM_BudgetTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget + projects LiteLLM_ProjectTable[] // multiple projects can have the same budget keys LiteLLM_VerificationToken[] // multiple keys can have the same budget end_users LiteLLM_EndUserTable[] // multiple end-users can have the same budget tags LiteLLM_TagTable[] // multiple tags can have the same budget @@ -115,6 +116,31 @@ model LiteLLM_TeamTable { litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) litellm_model_table LiteLLM_ModelTable? @relation(fields: [model_id], references: [id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) + projects LiteLLM_ProjectTable[] +} + +// Projects sit between teams and keys for use-case management +model LiteLLM_ProjectTable { + project_id String @id @default(uuid()) + project_alias String? + team_id String? + budget_id String? + metadata Json @default("{}") + models String[] + spend Float @default(0.0) + model_spend Json @default("{}") + blocked Boolean @default(false) + object_permission_id String? + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + + // Relations + litellm_team_table LiteLLM_TeamTable? @relation(fields: [team_id], references: [team_id]) + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) + keys LiteLLM_VerificationToken[] + object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) } // Track spend, rate limit, budget Users @@ -160,6 +186,7 @@ model LiteLLM_ObjectPermissionTable { mcp_tool_permissions Json? // Tool-level permissions for MCP servers. Format: {"server_id": ["tool_name_1", "tool_name_2"]} vector_stores String[] @default([]) teams LiteLLM_TeamTable[] + projects LiteLLM_ProjectTable[] verification_tokens LiteLLM_VerificationToken[] organizations LiteLLM_OrganizationTable[] users LiteLLM_UserTable[] @@ -207,6 +234,7 @@ model LiteLLM_VerificationToken { config Json @default("{}") user_id String? team_id String? + project_id String? permissions Json @default("{}") max_parallel_requests Int? metadata Json @default("{}") @@ -234,6 +262,7 @@ model LiteLLM_VerificationToken { key_rotation_at DateTime? // When this key should next be rotated litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) + litellm_project_table LiteLLM_ProjectTable? @relation(fields: [project_id], references: [project_id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) } @@ -286,7 +315,7 @@ model LiteLLM_SpendLogs { custom_llm_provider String? @default("") // litellm used custom_llm_provider api_base String? @default("") user String? @default("") - metadata Json? @default("{}") + metadata Json? @default("{}") // project_id stored here cache_hit String? @default("") cache_key String? @default("") request_tags Json? @default("[]") From a3c3f6ae74d50fe7449ec3c8e71748af416a0eb7 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:38:43 -0800 Subject: [PATCH 02/41] add schema --- litellm/proxy/schema.prisma | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 51e6ea94540..7a7bfd3ea48 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -23,6 +23,7 @@ model LiteLLM_BudgetTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget + projects LiteLLM_ProjectTable[] // multiple projects can have the same budget keys LiteLLM_VerificationToken[] // multiple keys can have the same budget end_users LiteLLM_EndUserTable[] // multiple end-users can have the same budget tags LiteLLM_TagTable[] // multiple tags can have the same budget @@ -115,6 +116,31 @@ model LiteLLM_TeamTable { litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) litellm_model_table LiteLLM_ModelTable? @relation(fields: [model_id], references: [id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) + projects LiteLLM_ProjectTable[] +} + +// Projects sit between teams and keys for use-case management +model LiteLLM_ProjectTable { + project_id String @id @default(uuid()) + project_alias String? + team_id String? + budget_id String? + metadata Json @default("{}") + models String[] + spend Float @default(0.0) + model_spend Json @default("{}") + blocked Boolean @default(false) + object_permission_id String? + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + + // Relations + litellm_team_table LiteLLM_TeamTable? @relation(fields: [team_id], references: [team_id]) + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) + keys LiteLLM_VerificationToken[] + object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) } // Track spend, rate limit, budget Users @@ -160,6 +186,7 @@ model LiteLLM_ObjectPermissionTable { mcp_tool_permissions Json? // Tool-level permissions for MCP servers. Format: {"server_id": ["tool_name_1", "tool_name_2"]} vector_stores String[] @default([]) teams LiteLLM_TeamTable[] + projects LiteLLM_ProjectTable[] verification_tokens LiteLLM_VerificationToken[] organizations LiteLLM_OrganizationTable[] users LiteLLM_UserTable[] @@ -207,6 +234,7 @@ model LiteLLM_VerificationToken { config Json @default("{}") user_id String? team_id String? + project_id String? permissions Json @default("{}") max_parallel_requests Int? metadata Json @default("{}") @@ -234,6 +262,7 @@ model LiteLLM_VerificationToken { key_rotation_at DateTime? // When this key should next be rotated litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) + litellm_project_table LiteLLM_ProjectTable? @relation(fields: [project_id], references: [project_id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) } @@ -286,7 +315,7 @@ model LiteLLM_SpendLogs { custom_llm_provider String? @default("") // litellm used custom_llm_provider api_base String? @default("") user String? @default("") - metadata Json? @default("{}") + metadata Json? @default("{}") // project_id stored here cache_hit String? @default("") cache_key String? @default("") request_tags Json? @default("[]") From 412f7e396aadb6261369b980cce8f4dce6506738 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:43:47 -0800 Subject: [PATCH 03/41] init project apis --- litellm/proxy/_types.py | 115 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index a212eab076c..4ae0098aad7 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -842,6 +842,7 @@ class GenerateKeyRequest(KeyRequestBase): description="How often to rotate this key (e.g., '30d', '90d'). Required if auto_rotate=True", ) organization_id: Optional[str] = None + project_id: Optional[str] = None class GenerateKeyResponse(KeyRequestBase): @@ -851,6 +852,7 @@ class GenerateKeyResponse(KeyRequestBase): user_id: Optional[str] = None token_id: Optional[str] = None organization_id: Optional[str] = None + project_id: Optional[str] = None litellm_budget_table: Optional[Any] = None token: Optional[str] = None created_by: Optional[str] = None @@ -2222,6 +2224,119 @@ class NewOrganizationResponse(LiteLLM_OrganizationTable): updated_at: datetime +### PROJECT MANAGEMENT TYPES ### + + +class ProjectBase(LiteLLMPydanticObjectBase): + """Base fields shared by project create/update requests""" + + project_id: Optional[str] = None + project_alias: Optional[str] = None + team_id: Optional[str] = None + metadata: Optional[dict] = None + models: Optional[List[str]] = None + blocked: bool = False + + +class NewProjectRequest(LiteLLM_BudgetTable): + """Request model for POST /project/new""" + + project_id: Optional[str] = None + project_alias: Optional[str] = None + team_id: str + budget_id: Optional[str] = None + metadata: Optional[dict] = None + models: List[str] = [] + blocked: bool = False + object_permission: Optional[LiteLLM_ObjectPermissionBase] = None + + @model_validator(mode="before") + @classmethod + def set_model_info(cls, values): + for field in LiteLLM_ManagementEndpoint_MetadataFields: + if values.get(field) is not None: + if values.get("metadata") is None: + values.update({"metadata": {}}) + values["metadata"][field] = values.get(field) + values.pop(field) + return values + + +class UpdateProjectRequest(LiteLLM_BudgetTable): + """Request model for POST /project/update""" + + project_id: str + project_alias: Optional[str] = None + team_id: Optional[str] = None + metadata: Optional[dict] = None + models: Optional[List[str]] = None + blocked: Optional[bool] = None + budget_id: Optional[str] = None + object_permission: Optional[LiteLLM_ObjectPermissionBase] = None + + @model_validator(mode="before") + @classmethod + def set_model_info(cls, values): + for field in LiteLLM_ManagementEndpoint_MetadataFields: + if values.get(field) is not None: + if values.get("metadata") is None: + values.update({"metadata": {}}) + values["metadata"][field] = values.get(field) + values.pop(field) + return values + + +class DeleteProjectRequest(LiteLLMPydanticObjectBase): + """Request model for DELETE /project/delete""" + + project_ids: List[str] + + +class LiteLLM_ProjectTable(LiteLLMPydanticObjectBase): + """Database model representation for project""" + + project_id: str + project_alias: Optional[str] = None + team_id: Optional[str] = None + budget_id: Optional[str] = None + metadata: Optional[dict] = None + models: List[str] = [] + spend: float = 0.0 + model_spend: Optional[dict] = None + blocked: bool = False + object_permission_id: Optional[str] = None + created_by: str + updated_by: str + created_at: datetime + updated_at: datetime + litellm_budget_table: Optional[LiteLLM_BudgetTable] = None + object_permission: Optional[LiteLLM_ObjectPermissionTable] = None + + +class NewProjectResponse(LiteLLM_ProjectTable): + """Response model for POST /project/new""" + + project_id: str + created_at: datetime + updated_at: datetime + + +class LiteLLM_ProjectTableCachedObj(LiteLLMPydanticObjectBase): + """Cached version for auth checks""" + + project_id: str + project_alias: Optional[str] = None + team_id: Optional[str] = None + budget_id: Optional[str] = None + metadata: Optional[dict] = None + models: List[str] = [] + spend: float = 0.0 + model_spend: Optional[dict] = None + blocked: bool = False + object_permission_id: Optional[str] = None + litellm_budget_table: Optional[LiteLLM_BudgetTable] = None + + class LiteLLM_UserTableFiltered(BaseModel): # done to avoid exposing sensitive data user_id: str user_email: Optional[str] = None From 12109c7d7eda487c75f30df30fce89a6f125e4b9 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:44:22 -0800 Subject: [PATCH 04/41] add generate_key_helper_fn --- litellm/proxy/management_endpoints/key_management_endpoints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index a8def13869f..83d8d1e5125 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -2040,6 +2040,7 @@ async def generate_key_helper_fn( # noqa: PLR0915 prompts: Optional[list] = None, teams: Optional[list] = None, organization_id: Optional[str] = None, + project_id: Optional[str] = None, table_name: Optional[Literal["key", "user"]] = None, send_invite_email: Optional[bool] = None, created_by: Optional[str] = None, @@ -2143,6 +2144,7 @@ async def generate_key_helper_fn( # noqa: PLR0915 "max_budget": key_max_budget, "user_id": user_id, "team_id": team_id, + "project_id": project_id, "max_parallel_requests": max_parallel_requests, "metadata": metadata_json, "tpm_limit": tpm_limit, From 343af7db498afc398d09a2b22e5f445615101d62 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:55:23 -0800 Subject: [PATCH 05/41] add project management APs --- .../management_endpoints/common_utils.py | 4 +- .../management_endpoints/project_endpoints.py | 682 ++++++++++++++++++ 2 files changed, 685 insertions(+), 1 deletion(-) create mode 100644 litellm/proxy/management_endpoints/project_endpoints.py diff --git a/litellm/proxy/management_endpoints/common_utils.py b/litellm/proxy/management_endpoints/common_utils.py index a2f93e35579..b050886d44b 100644 --- a/litellm/proxy/management_endpoints/common_utils.py +++ b/litellm/proxy/management_endpoints/common_utils.py @@ -4,6 +4,7 @@ from litellm.proxy._types import ( KeyRequestBase, LiteLLM_ManagementEndpoint_MetadataFields_Premium, LiteLLM_OrganizationTable, + LiteLLM_ProjectTable, LiteLLM_TeamTable, LitellmUserRoles, UserAPIKeyAuth, @@ -35,6 +36,7 @@ def _set_object_metadata_field( LiteLLM_TeamTable, KeyRequestBase, LiteLLM_OrganizationTable, + LiteLLM_ProjectTable, ], field_name: str, value: Any, @@ -43,7 +45,7 @@ def _set_object_metadata_field( Helper function to set metadata fields that require premium user checks Args: - object_data: The team data object to modify + object_data: The team/key/organization/project data object to modify field_name: Name of the metadata field to set value: Value to set for the field """ diff --git a/litellm/proxy/management_endpoints/project_endpoints.py b/litellm/proxy/management_endpoints/project_endpoints.py new file mode 100644 index 00000000000..597ce7719c9 --- /dev/null +++ b/litellm/proxy/management_endpoints/project_endpoints.py @@ -0,0 +1,682 @@ +""" +Endpoints for /project operations + +/project/new +/project/update +/project/delete +/project/info +/project/list +""" + +#### PROJECT MANAGEMENT #### + +import json +from typing import List, Optional + +from fastapi import APIRouter, Depends, HTTPException, Request, status + +from litellm._logging import verbose_proxy_logger +from litellm._uuid import uuid +from litellm.proxy._types import * +from litellm.proxy.auth.user_api_key_auth import user_api_key_auth +from litellm.proxy.management_endpoints.common_utils import _set_object_metadata_field +from litellm.proxy.management_helpers.object_permission_utils import ( + handle_update_object_permission_common, +) +from litellm.proxy.management_helpers.utils import ( + management_endpoint_wrapper, +) +from litellm.proxy.utils import PrismaClient, handle_exception_on_proxy +from litellm.utils import _update_dictionary + +router = APIRouter() + + +async def _check_user_permission_for_project( + user_api_key_dict: UserAPIKeyAuth, + team_id: Optional[str], + prisma_client: PrismaClient, + require_admin: bool = False, +) -> bool: + """ + Check if user has permission to manage a project. + + Returns True if user is proxy admin or team admin (when team_id provided). + If require_admin=True, only proxy admins are allowed. + """ + is_proxy_admin = user_api_key_dict.user_role == LitellmUserRoles.PROXY_ADMIN + + if require_admin: + return is_proxy_admin + + if is_proxy_admin: + return True + + if not team_id or not user_api_key_dict.user_id: + return False + + team = await prisma_client.db.litellm_teamtable.find_unique( + where={"team_id": team_id} + ) + + if team and team.admins: + return user_api_key_dict.user_id in team.admins + + return False + + +async def _validate_team_exists( + team_id: str, + prisma_client: PrismaClient, +): + """Validate that a team exists.""" + team = await prisma_client.db.litellm_teamtable.find_unique( + where={"team_id": team_id} + ) + + if team is None: + raise ProxyException( + message=f"Team not found, team_id={team_id}", + type="not_found", + code=404, + param="team_id", + ) + + return team + + +async def _create_budget_for_project( + data: NewProjectRequest, + user_id: Optional[str], + litellm_proxy_admin_name: str, + prisma_client: PrismaClient, +) -> str: + """Create a budget for the project and return budget_id.""" + budget_params = LiteLLM_BudgetTable.model_fields.keys() + _json_data = data.json(exclude_none=True) + _budget_data = {k: v for k, v in _json_data.items() if k in budget_params} + budget_row = LiteLLM_BudgetTable(**_budget_data) + + new_budget = prisma_client.jsonify_object(budget_row.json(exclude_none=True)) + + _budget = await prisma_client.db.litellm_budgettable.create( + data={ + **new_budget, + "created_by": user_id or litellm_proxy_admin_name, + "updated_by": user_id or litellm_proxy_admin_name, + } + ) + + return _budget.budget_id + + +async def _set_project_object_permission( + data: NewProjectRequest, + prisma_client: Optional[PrismaClient], +) -> Optional[str]: + """ + Creates the LiteLLM_ObjectPermissionTable record for the project. + Returns the object_permission_id if created, otherwise None. + """ + if prisma_client is None: + return None + + if data.object_permission is not None: + created_object_permission = ( + await prisma_client.db.litellm_objectpermissiontable.create( + data=data.object_permission.model_dump(exclude_none=True), + ) + ) + del data.object_permission + return created_object_permission.object_permission_id + return None + + +@router.post( + "/project/new", + tags=["project management"], + dependencies=[Depends(user_api_key_auth)], + response_model=NewProjectResponse, +) +@management_endpoint_wrapper +async def new_project( + data: NewProjectRequest, + http_request: Request, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Create a new project. Projects sit between teams and keys in the hierarchy. + + Only admins or team admins can create projects. + + # Parameters + + - project_alias: *Optional[str]* - The name of the project. + - team_id: *str* - The team id that this project belongs to. Required. + - models: *List* - The models the project has access to. + - budget_id: *Optional[str]* - The id for a budget (tpm/rpm/max budget) for the project. + ### IF NO BUDGET ID - CREATE ONE WITH THESE PARAMS ### + - max_budget: *Optional[float]* - Max budget for project + - tpm_limit: *Optional[int]* - Max tpm limit for project + - rpm_limit: *Optional[int]* - Max rpm limit for project + - max_parallel_requests: *Optional[int]* - Max parallel requests for project + - soft_budget: *Optional[float]* - Get a slack alert when this soft budget is reached. Don't block requests. + - model_max_budget: *Optional[dict]* - Max budget for a specific model + - budget_duration: *Optional[str]* - Frequency of reseting project budget + - metadata: *Optional[dict]* - Metadata for project, store information for project. Example metadata - {"use_case_id": "SNOW-12345", "responsible_ai_id": "RAI-67890"} + - blocked: *bool* - Flag indicating if the project is blocked or not - will stop all calls from keys with this project_id. + - object_permission: Optional[LiteLLM_ObjectPermissionBase] - project-specific object permission. Example - {"vector_stores": ["vector_store_1", "vector_store_2"]}. IF null or {} then no object permission. + + Example 1: Create new project **without** a budget_id + + ```bash + curl --location 'http://0.0.0.0:4000/project/new' \\ + --header 'Authorization: Bearer sk-1234' \\ + --header 'Content-Type: application/json' \\ + --data '{ + "project_alias": "flight-search-assistant", + "team_id": "team-123", + "models": ["gpt-4", "gpt-3.5-turbo"], + "max_budget": 100, + "metadata": { + "use_case_id": "SNOW-12345", + "responsible_ai_id": "RAI-67890" + } + }' + ``` + + Example 2: Create new project **with** a budget_id + + ```bash + curl --location 'http://0.0.0.0:4000/project/new' \\ + --header 'Authorization: Bearer sk-1234' \\ + --header 'Content-Type: application/json' \\ + --data '{ + "project_alias": "hotel-recommendations", + "team_id": "team-123", + "models": ["claude-3-sonnet"], + "budget_id": "428eeaa8-f3ac-4e85-a8fb-7dc8d7aa8689" + }' + ``` + """ + from litellm.proxy.proxy_server import ( + litellm_proxy_admin_name, + prisma_client, + ) + + try: + if prisma_client is None: + raise HTTPException( + status_code=500, + detail={"error": CommonProxyErrors.db_not_connected_error.value}, + ) + + # Validate team exists + await _validate_team_exists(team_id=data.team_id, prisma_client=prisma_client) + + # Check if user has permission to create projects for this team + # only team admins can create projects for their team + has_permission = await _check_user_permission_for_project( + user_api_key_dict=user_api_key_dict, + team_id=data.team_id, + prisma_client=prisma_client, + ) + + if not has_permission: + raise HTTPException( + status_code=403, + detail={ + "error": f"Only admins or team admins can create projects. Your role is {user_api_key_dict.user_role}" + }, + ) + + # Generate project_id if not provided + if data.project_id is None: + data.project_id = str(uuid.uuid4()) + else: + # Check if project_id already exists + existing_project = await prisma_client.db.litellm_projecttable.find_unique( + where={"project_id": data.project_id} + ) + if existing_project is not None: + raise ProxyException( + message=f"Project id = {data.project_id} already exists. Please use a different project id.", + type="bad_request", + code=400, + param="project_id", + ) + + # Create budget if not provided + if data.budget_id is None: + data.budget_id = await _create_budget_for_project( + data=data, + user_id=user_api_key_dict.user_id, + litellm_proxy_admin_name=litellm_proxy_admin_name, + prisma_client=prisma_client, + ) + + ## Handle Object Permission - MCP, Vector Stores etc. + object_permission_id = await _set_project_object_permission( + data=data, + prisma_client=prisma_client, + ) + + project_row = LiteLLM_ProjectTable( + **data.json(exclude_none=True), + object_permission_id=object_permission_id, + created_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + ) + + for field in LiteLLM_ManagementEndpoint_MetadataFields: + if getattr(data, field, None) is not None: + _set_object_metadata_field( + object_data=project_row, + field_name=field, + value=getattr(data, field), + ) + + new_project_row = prisma_client.jsonify_object( + project_row.json(exclude_none=True) + ) + verbose_proxy_logger.info( + f"new_project_row: {json.dumps(new_project_row, indent=2)}" + ) + response = await prisma_client.db.litellm_projecttable.create( + data={ + **new_project_row, # type: ignore + }, + include={"litellm_budget_table": True}, + ) + + return response + except Exception as e: + verbose_proxy_logger.exception( + "litellm.proxy.management_endpoints.project_endpoints.new_project(): Exception occured - {}".format( + str(e) + ) + ) + raise handle_exception_on_proxy(e) + + +@router.post( + "/project/update", + tags=["project management"], + dependencies=[Depends(user_api_key_auth)], + response_model=LiteLLM_ProjectTable, +) +@management_endpoint_wrapper +async def update_project( + data: UpdateProjectRequest, + http_request: Request, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Update a project + + Parameters: + - project_id: *str* - The project id to update. Required. + - project_alias: *Optional[str]* - Updated name for the project + - team_id: *Optional[str]* - Updated team_id for the project + - metadata: *Optional[dict]* - Updated metadata for project + - models: *Optional[list]* - Updated list of models for the project + - blocked: *Optional[bool]* - Updated blocked status + - max_budget: *Optional[float]* - Updated max budget + - tpm_limit: *Optional[int]* - Updated tpm limit + - rpm_limit: *Optional[int]* - Updated rpm limit + - budget_duration: *Optional[str]* - Updated budget duration + - object_permission: Optional[LiteLLM_ObjectPermissionBase] - Updated object permission + + Example: + ```bash + curl --location 'http://0.0.0.0:4000/project/update' \\ + --header 'Authorization: Bearer sk-1234' \\ + --header 'Content-Type: application/json' \\ + --data '{ + "project_id": "project-123", + "max_budget": 200, + "metadata": { + "use_case_id": "SNOW-12345", + "status": "active" + } + }' + ``` + """ + from litellm.proxy.proxy_server import ( + litellm_proxy_admin_name, + prisma_client, + ) + + try: + if prisma_client is None: + raise HTTPException( + status_code=500, + detail={"error": CommonProxyErrors.db_not_connected_error.value}, + ) + + if data.project_id is None: + raise HTTPException( + status_code=400, + detail={"error": "project_id is required"}, + ) + + # Fetch existing project + existing_project = await prisma_client.db.litellm_projecttable.find_unique( + where={"project_id": data.project_id} + ) + + if existing_project is None: + raise ProxyException( + message=f"Project not found, project_id={data.project_id}", + type="not_found", + code=404, + param="project_id", + ) + + # Check if user has permission to update this project + has_permission = await _check_user_permission_for_project( + user_api_key_dict=user_api_key_dict, + team_id=existing_project.team_id, + prisma_client=prisma_client, + ) + + if not has_permission: + raise HTTPException( + status_code=403, + detail={"error": "Only admins or team admins can update projects"}, + ) + + # Prepare update data + update_data = data.json(exclude_none=True, exclude={"project_id"}) + update_data = prisma_client.jsonify_object(update_data) + update_data["updated_by"] = user_api_key_dict.user_id or litellm_proxy_admin_name + + # Handle budget updates + budget_fields = LiteLLM_BudgetTable.model_fields.keys() + budget_updates = {k: v for k, v in update_data.items() if k in budget_fields} + + if budget_updates and existing_project.budget_id: + # Update existing budget + await prisma_client.db.litellm_budgettable.update( + where={"budget_id": existing_project.budget_id}, + data={ + **budget_updates, + "updated_by": user_api_key_dict.user_id or litellm_proxy_admin_name, + }, + ) + # Remove budget fields from project update + for field in budget_updates.keys(): + update_data.pop(field, None) + + # Handle object permissions + if "object_permission" in update_data: + object_permission_data = update_data.pop("object_permission") + if object_permission_data: + if existing_project.object_permission_id: + # Update existing permission + await prisma_client.db.litellm_objectpermissiontable.update( + where={"object_permission_id": existing_project.object_permission_id}, + data=object_permission_data, + ) + else: + # Create new permission + created_permission = await prisma_client.db.litellm_objectpermissiontable.create( + data=object_permission_data, + ) + update_data["object_permission_id"] = created_permission.object_permission_id + + # Handle metadata fields + for field in LiteLLM_ManagementEndpoint_MetadataFields: + if field in update_data: + if update_data.get("metadata") is None: + update_data["metadata"] = {} + update_data["metadata"][field] = update_data.pop(field) + + # Update project + updated_project = await prisma_client.db.litellm_projecttable.update( + where={"project_id": data.project_id}, + data=update_data, + include={"litellm_budget_table": True, "object_permission": True}, + ) + + return updated_project + except Exception as e: + verbose_proxy_logger.exception( + "litellm.proxy.management_endpoints.project_endpoints.update_project(): Exception occured - {}".format( + str(e) + ) + ) + raise handle_exception_on_proxy(e) + + +@router.delete( + "/project/delete", + tags=["project management"], + dependencies=[Depends(user_api_key_auth)], + response_model=List[LiteLLM_ProjectTable], +) +@management_endpoint_wrapper +async def delete_project( + data: DeleteProjectRequest, + http_request: Request, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Delete projects + + Parameters: + - project_ids: *List[str]* - List of project ids to delete + + Example: + ```bash + curl --location --request DELETE 'http://0.0.0.0:4000/project/delete' \\ + --header 'Authorization: Bearer sk-1234' \\ + --header 'Content-Type: application/json' \\ + --data '{ + "project_ids": ["project-123", "project-456"] + }' + ``` + """ + from litellm.proxy.proxy_server import prisma_client + + try: + if prisma_client is None: + raise HTTPException( + status_code=500, + detail={"error": CommonProxyErrors.db_not_connected_error.value}, + ) + + # Check if user is admin (only admins can delete projects) + has_permission = await _check_user_permission_for_project( + user_api_key_dict=user_api_key_dict, + team_id=None, + prisma_client=prisma_client, + require_admin=True, + ) + + if not has_permission: + raise HTTPException( + status_code=403, + detail={"error": "Only admins can delete projects"}, + ) + + deleted_projects = [] + + for project_id in data.project_ids: + # Check if project exists + existing_project = await prisma_client.db.litellm_projecttable.find_unique( + where={"project_id": project_id} + ) + + if existing_project is None: + raise ProxyException( + message=f"Project not found, project_id={project_id}", + type="not_found", + code=404, + param="project_ids", + ) + + # Check if there are any keys associated with this project + associated_keys = await prisma_client.db.litellm_verificationtoken.find_many( + where={"project_id": project_id} + ) + + if len(associated_keys) > 0: + raise ProxyException( + message=f"Cannot delete project {project_id}. {len(associated_keys)} key(s) are associated with it. Please delete or reassign the keys first.", + type="bad_request", + code=400, + param="project_ids", + ) + + # Delete the project + deleted_project = await prisma_client.db.litellm_projecttable.delete( + where={"project_id": project_id} + ) + + deleted_projects.append(deleted_project) + + return deleted_projects + except Exception as e: + verbose_proxy_logger.exception( + "litellm.proxy.management_endpoints.project_endpoints.delete_project(): Exception occured - {}".format( + str(e) + ) + ) + raise handle_exception_on_proxy(e) + + +@router.get( + "/project/info", + tags=["project management"], + dependencies=[Depends(user_api_key_auth)], + response_model=LiteLLM_ProjectTable, +) +async def project_info( + project_id: str, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Get information about a specific project + + Parameters: + - project_id: *str* - The project id to fetch info for + + Example: + ```bash + curl --location 'http://0.0.0.0:4000/project/info?project_id=project-123' \\ + --header 'Authorization: Bearer sk-1234' + ``` + """ + from litellm.proxy.proxy_server import prisma_client + + try: + if prisma_client is None: + raise HTTPException( + status_code=500, + detail={"error": CommonProxyErrors.db_not_connected_error.value}, + ) + + # Fetch project + project = await prisma_client.db.litellm_projecttable.find_unique( + where={"project_id": project_id}, + include={"litellm_budget_table": True, "object_permission": True}, + ) + + if project is None: + raise ProxyException( + message=f"Project not found, project_id={project_id}", + type="not_found", + code=404, + param="project_id", + ) + + # Check if user has access to this project (admin or team member) + is_admin = user_api_key_dict.user_role == LitellmUserRoles.PROXY_ADMIN + is_team_member = False + + if project.team_id and user_api_key_dict.user_id: + team = await prisma_client.db.litellm_teamtable.find_unique( + where={"team_id": project.team_id} + ) + if team: + is_team_member = ( + user_api_key_dict.user_id in team.admins or + user_api_key_dict.user_id in team.members + ) + + if not (is_admin or is_team_member): + raise HTTPException( + status_code=403, + detail={"error": "You don't have access to this project"}, + ) + + return project + except Exception as e: + verbose_proxy_logger.exception( + "litellm.proxy.management_endpoints.project_endpoints.project_info(): Exception occured - {}".format( + str(e) + ) + ) + raise handle_exception_on_proxy(e) + + +@router.get( + "/project/list", + tags=["project management"], + dependencies=[Depends(user_api_key_auth)], + response_model=List[LiteLLM_ProjectTable], +) +async def list_projects( + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + List all projects that the user has access to + + Example: + ```bash + curl --location 'http://0.0.0.0:4000/project/list' \\ + --header 'Authorization: Bearer sk-1234' + ``` + """ + from litellm.proxy.proxy_server import prisma_client + + try: + if prisma_client is None: + raise HTTPException( + status_code=500, + detail={"error": CommonProxyErrors.db_not_connected_error.value}, + ) + + # If proxy admin, get all projects + if user_api_key_dict.user_role == LitellmUserRoles.PROXY_ADMIN: + projects = await prisma_client.db.litellm_projecttable.find_many( + include={"litellm_budget_table": True, "object_permission": True} + ) + else: + # Get projects for teams the user belongs to + user_teams = await prisma_client.db.litellm_teamtable.find_many( + where={ + "OR": [ + {"members": {"has": user_api_key_dict.user_id}}, + {"admins": {"has": user_api_key_dict.user_id}}, + ] + } + ) + + team_ids = [team.team_id for team in user_teams] + + projects = await prisma_client.db.litellm_projecttable.find_many( + where={"team_id": {"in": team_ids}}, + include={"litellm_budget_table": True, "object_permission": True}, + ) + + return projects + except Exception as e: + verbose_proxy_logger.exception( + "litellm.proxy.management_endpoints.project_endpoints.list_projects(): Exception occured - {}".format( + str(e) + ) + ) + raise handle_exception_on_proxy(e) + From a8237601bcc5a4503e86c74517df0dd6ea59b2d5 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:57:23 -0800 Subject: [PATCH 06/41] add project_router --- litellm/proxy/proxy_server.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index f06b9e70f43..ca7fedcf4ef 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -270,7 +270,9 @@ from litellm.proxy.management_endpoints.customer_endpoints import ( from litellm.proxy.management_endpoints.internal_user_endpoints import ( router as internal_user_router, ) -from litellm.proxy.management_endpoints.internal_user_endpoints import user_update +from litellm.proxy.management_endpoints.internal_user_endpoints import ( + user_update, +) from litellm.proxy.management_endpoints.key_management_endpoints import ( delete_verification_tokens, duration_in_seconds, @@ -293,6 +295,9 @@ from litellm.proxy.management_endpoints.model_management_endpoints import ( from litellm.proxy.management_endpoints.organization_endpoints import ( router as organization_router, ) +from litellm.proxy.management_endpoints.project_endpoints import ( + router as project_router, +) from litellm.proxy.management_endpoints.router_settings_endpoints import ( router as router_settings_router, ) @@ -321,7 +326,9 @@ from litellm.proxy.ocr_endpoints.endpoints import router as ocr_router from litellm.proxy.openai_files_endpoints.files_endpoints import ( router as openai_files_router, ) -from litellm.proxy.openai_files_endpoints.files_endpoints import set_files_config +from litellm.proxy.openai_files_endpoints.files_endpoints import ( + set_files_config, +) from litellm.proxy.pass_through_endpoints.llm_passthrough_endpoints import ( passthrough_endpoint_router, ) @@ -408,7 +415,9 @@ from litellm.types.proxy.management_endpoints.ui_sso import ( LiteLLM_UpperboundKeyGenerateParams, ) from litellm.types.realtime import RealtimeQueryParams -from litellm.types.router import DeploymentTypedDict +from litellm.types.router import ( + DeploymentTypedDict, +) from litellm.types.router import ModelInfo as RouterModelInfo from litellm.types.router import ( RouterGeneralSettings, @@ -10162,6 +10171,7 @@ app.include_router(team_router) app.include_router(ui_sso_router) app.include_router(scim_router) app.include_router(organization_router) +app.include_router(project_router) app.include_router(customer_router) app.include_router(spend_management_router) app.include_router(cloudzero_router) From a8f93d03d6e9a080f6bc648c5ee804c871d85c40 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:58:38 -0800 Subject: [PATCH 07/41] add model_rpm_limit and tpm limits --- litellm/proxy/schema.prisma | 3 +++ schema.prisma | 3 +++ 2 files changed, 6 insertions(+) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 7a7bfd3ea48..45b866ad2e9 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -123,12 +123,15 @@ model LiteLLM_TeamTable { model LiteLLM_ProjectTable { project_id String @id @default(uuid()) project_alias String? + description String? team_id String? budget_id String? metadata Json @default("{}") models String[] spend Float @default(0.0) model_spend Json @default("{}") + model_rpm_limit Json @default("{}") + model_tpm_limit Json @default("{}") blocked Boolean @default(false) object_permission_id String? created_at DateTime @default(now()) @map("created_at") diff --git a/schema.prisma b/schema.prisma index 7a7bfd3ea48..45b866ad2e9 100644 --- a/schema.prisma +++ b/schema.prisma @@ -123,12 +123,15 @@ model LiteLLM_TeamTable { model LiteLLM_ProjectTable { project_id String @id @default(uuid()) project_alias String? + description String? team_id String? budget_id String? metadata Json @default("{}") models String[] spend Float @default(0.0) model_spend Json @default("{}") + model_rpm_limit Json @default("{}") + model_tpm_limit Json @default("{}") blocked Boolean @default(false) object_permission_id String? created_at DateTime @default(now()) @map("created_at") From 228c683d2b4dbcb3902dd2075d45496eb50fc75f Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:58:45 -0800 Subject: [PATCH 08/41] add model_rpm_limit/tpm --- litellm/proxy/_types.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 4ae0098aad7..6a75188841e 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2243,10 +2243,13 @@ class NewProjectRequest(LiteLLM_BudgetTable): project_id: Optional[str] = None project_alias: Optional[str] = None + description: Optional[str] = None team_id: str budget_id: Optional[str] = None metadata: Optional[dict] = None models: List[str] = [] + model_rpm_limit: Optional[dict] = None + model_tpm_limit: Optional[dict] = None blocked: bool = False object_permission: Optional[LiteLLM_ObjectPermissionBase] = None @@ -2267,9 +2270,12 @@ class UpdateProjectRequest(LiteLLM_BudgetTable): project_id: str project_alias: Optional[str] = None + description: Optional[str] = None team_id: Optional[str] = None metadata: Optional[dict] = None models: Optional[List[str]] = None + model_rpm_limit: Optional[dict] = None + model_tpm_limit: Optional[dict] = None blocked: Optional[bool] = None budget_id: Optional[str] = None object_permission: Optional[LiteLLM_ObjectPermissionBase] = None @@ -2297,12 +2303,15 @@ class LiteLLM_ProjectTable(LiteLLMPydanticObjectBase): project_id: str project_alias: Optional[str] = None + description: Optional[str] = None team_id: Optional[str] = None budget_id: Optional[str] = None metadata: Optional[dict] = None models: List[str] = [] spend: float = 0.0 model_spend: Optional[dict] = None + model_rpm_limit: Optional[dict] = None + model_tpm_limit: Optional[dict] = None blocked: bool = False object_permission_id: Optional[str] = None created_by: str @@ -2326,12 +2335,15 @@ class LiteLLM_ProjectTableCachedObj(LiteLLMPydanticObjectBase): project_id: str project_alias: Optional[str] = None + description: Optional[str] = None team_id: Optional[str] = None budget_id: Optional[str] = None metadata: Optional[dict] = None models: List[str] = [] spend: float = 0.0 model_spend: Optional[dict] = None + model_rpm_limit: Optional[dict] = None + model_tpm_limit: Optional[dict] = None blocked: bool = False object_permission_id: Optional[str] = None litellm_budget_table: Optional[LiteLLM_BudgetTable] = None From 6163e26d2e1763a3df5ce97c551a76ae4627b527 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 14:59:01 -0800 Subject: [PATCH 09/41] add model tpm/rpm limits --- .../management_endpoints/project_endpoints.py | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/litellm/proxy/management_endpoints/project_endpoints.py b/litellm/proxy/management_endpoints/project_endpoints.py index 597ce7719c9..e7db9c198ec 100644 --- a/litellm/proxy/management_endpoints/project_endpoints.py +++ b/litellm/proxy/management_endpoints/project_endpoints.py @@ -152,6 +152,7 @@ async def new_project( # Parameters - project_alias: *Optional[str]* - The name of the project. + - description: *Optional[str]* - Description of the project's purpose and use case. - team_id: *str* - The team id that this project belongs to. Required. - models: *List* - The models the project has access to. - budget_id: *Optional[str]* - The id for a budget (tpm/rpm/max budget) for the project. @@ -161,13 +162,15 @@ async def new_project( - rpm_limit: *Optional[int]* - Max rpm limit for project - max_parallel_requests: *Optional[int]* - Max parallel requests for project - soft_budget: *Optional[float]* - Get a slack alert when this soft budget is reached. Don't block requests. - - model_max_budget: *Optional[dict]* - Max budget for a specific model + - model_max_budget: *Optional[dict]* - Max budget for a specific model. Example: {"gpt-4": 100.0, "gpt-3.5-turbo": 50.0} + - model_rpm_limit: *Optional[dict]* - RPM limits per model. Example: {"gpt-4": 1000, "gpt-3.5-turbo": 5000} + - model_tpm_limit: *Optional[dict]* - TPM limits per model. Example: {"gpt-4": 50000, "gpt-3.5-turbo": 100000} - budget_duration: *Optional[str]* - Frequency of reseting project budget - metadata: *Optional[dict]* - Metadata for project, store information for project. Example metadata - {"use_case_id": "SNOW-12345", "responsible_ai_id": "RAI-67890"} - blocked: *bool* - Flag indicating if the project is blocked or not - will stop all calls from keys with this project_id. - object_permission: Optional[LiteLLM_ObjectPermissionBase] - project-specific object permission. Example - {"vector_stores": ["vector_store_1", "vector_store_2"]}. IF null or {} then no object permission. - Example 1: Create new project **without** a budget_id + Example 1: Create new project **without** a budget_id, with model-specific limits ```bash curl --location 'http://0.0.0.0:4000/project/new' \\ @@ -175,9 +178,18 @@ async def new_project( --header 'Content-Type: application/json' \\ --data '{ "project_alias": "flight-search-assistant", + "description": "AI-powered flight search and booking assistant", "team_id": "team-123", "models": ["gpt-4", "gpt-3.5-turbo"], "max_budget": 100, + "model_rpm_limit": { + "gpt-4": 1000, + "gpt-3.5-turbo": 5000 + }, + "model_tpm_limit": { + "gpt-4": 50000, + "gpt-3.5-turbo": 100000 + }, "metadata": { "use_case_id": "SNOW-12345", "responsible_ai_id": "RAI-67890" @@ -193,9 +205,13 @@ async def new_project( --header 'Content-Type: application/json' \\ --data '{ "project_alias": "hotel-recommendations", + "description": "Personalized hotel recommendation engine", "team_id": "team-123", "models": ["claude-3-sonnet"], - "budget_id": "428eeaa8-f3ac-4e85-a8fb-7dc8d7aa8689" + "budget_id": "428eeaa8-f3ac-4e85-a8fb-7dc8d7aa8689", + "metadata": { + "use_case_id": "SNOW-54321" + } }' ``` """ @@ -317,6 +333,7 @@ async def update_project( Parameters: - project_id: *str* - The project id to update. Required. - project_alias: *Optional[str]* - Updated name for the project + - description: *Optional[str]* - Updated description for the project - team_id: *Optional[str]* - Updated team_id for the project - metadata: *Optional[dict]* - Updated metadata for project - models: *Optional[list]* - Updated list of models for the project @@ -324,6 +341,8 @@ async def update_project( - max_budget: *Optional[float]* - Updated max budget - tpm_limit: *Optional[int]* - Updated tpm limit - rpm_limit: *Optional[int]* - Updated rpm limit + - model_rpm_limit: *Optional[dict]* - Updated RPM limits per model + - model_tpm_limit: *Optional[dict]* - Updated TPM limits per model - budget_duration: *Optional[str]* - Updated budget duration - object_permission: Optional[LiteLLM_ObjectPermissionBase] - Updated object permission @@ -334,7 +353,12 @@ async def update_project( --header 'Content-Type: application/json' \\ --data '{ "project_id": "project-123", + "description": "Updated flight search system with enhanced capabilities", "max_budget": 200, + "model_rpm_limit": { + "gpt-4": 2000, + "gpt-3.5-turbo": 10000 + }, "metadata": { "use_case_id": "SNOW-12345", "status": "active" From 0078d8a45fcfe8c25b1a219844bd61c65b846e06 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:03:03 -0800 Subject: [PATCH 10/41] update schema --- .../migration.sql | 35 ++++++++++++++++++ .../litellm_proxy_extras/schema.prisma | 36 +++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000000_add_project_table/migration.sql diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000000_add_project_table/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000000_add_project_table/migration.sql new file mode 100644 index 00000000000..f1d3129bb36 --- /dev/null +++ b/litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000000_add_project_table/migration.sql @@ -0,0 +1,35 @@ +-- CreateTable +CREATE TABLE "LiteLLM_ProjectTable" ( + "project_id" TEXT NOT NULL, + "project_alias" TEXT, + "team_id" TEXT, + "budget_id" TEXT, + "metadata" JSONB NOT NULL DEFAULT '{}', + "models" TEXT[], + "spend" DOUBLE PRECISION NOT NULL DEFAULT 0.0, + "model_spend" JSONB NOT NULL DEFAULT '{}', + "blocked" BOOLEAN NOT NULL DEFAULT false, + "object_permission_id" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "created_by" TEXT NOT NULL, + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_by" TEXT NOT NULL, + + CONSTRAINT "LiteLLM_ProjectTable_pkey" PRIMARY KEY ("project_id") +); + +-- AddForeignKey +ALTER TABLE "LiteLLM_ProjectTable" ADD CONSTRAINT "LiteLLM_ProjectTable_team_id_fkey" FOREIGN KEY ("team_id") REFERENCES "LiteLLM_TeamTable"("team_id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LiteLLM_ProjectTable" ADD CONSTRAINT "LiteLLM_ProjectTable_budget_id_fkey" FOREIGN KEY ("budget_id") REFERENCES "LiteLLM_BudgetTable"("budget_id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LiteLLM_ProjectTable" ADD CONSTRAINT "LiteLLM_ProjectTable_object_permission_id_fkey" FOREIGN KEY ("object_permission_id") REFERENCES "LiteLLM_ObjectPermissionTable"("object_permission_id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AlterTable: Add project_id to LiteLLM_VerificationToken +ALTER TABLE "LiteLLM_VerificationToken" ADD COLUMN "project_id" TEXT; + +-- AddForeignKey +ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_project_id_fkey" FOREIGN KEY ("project_id") REFERENCES "LiteLLM_ProjectTable"("project_id") ON DELETE SET NULL ON UPDATE CASCADE; + diff --git a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma index 88904561129..45b866ad2e9 100644 --- a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma +++ b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma @@ -23,6 +23,7 @@ model LiteLLM_BudgetTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget + projects LiteLLM_ProjectTable[] // multiple projects can have the same budget keys LiteLLM_VerificationToken[] // multiple keys can have the same budget end_users LiteLLM_EndUserTable[] // multiple end-users can have the same budget tags LiteLLM_TagTable[] // multiple tags can have the same budget @@ -115,6 +116,34 @@ model LiteLLM_TeamTable { litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) litellm_model_table LiteLLM_ModelTable? @relation(fields: [model_id], references: [id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) + projects LiteLLM_ProjectTable[] +} + +// Projects sit between teams and keys for use-case management +model LiteLLM_ProjectTable { + project_id String @id @default(uuid()) + project_alias String? + description String? + team_id String? + budget_id String? + metadata Json @default("{}") + models String[] + spend Float @default(0.0) + model_spend Json @default("{}") + model_rpm_limit Json @default("{}") + model_tpm_limit Json @default("{}") + blocked Boolean @default(false) + object_permission_id String? + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + + // Relations + litellm_team_table LiteLLM_TeamTable? @relation(fields: [team_id], references: [team_id]) + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) + keys LiteLLM_VerificationToken[] + object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) } // Track spend, rate limit, budget Users @@ -160,6 +189,7 @@ model LiteLLM_ObjectPermissionTable { mcp_tool_permissions Json? // Tool-level permissions for MCP servers. Format: {"server_id": ["tool_name_1", "tool_name_2"]} vector_stores String[] @default([]) teams LiteLLM_TeamTable[] + projects LiteLLM_ProjectTable[] verification_tokens LiteLLM_VerificationToken[] organizations LiteLLM_OrganizationTable[] users LiteLLM_UserTable[] @@ -207,6 +237,7 @@ model LiteLLM_VerificationToken { config Json @default("{}") user_id String? team_id String? + project_id String? permissions Json @default("{}") max_parallel_requests Int? metadata Json @default("{}") @@ -234,6 +265,7 @@ model LiteLLM_VerificationToken { key_rotation_at DateTime? // When this key should next be rotated litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) + litellm_project_table LiteLLM_ProjectTable? @relation(fields: [project_id], references: [project_id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) } @@ -286,7 +318,7 @@ model LiteLLM_SpendLogs { custom_llm_provider String? @default("") // litellm used custom_llm_provider api_base String? @default("") user String? @default("") - metadata Json? @default("{}") + metadata Json? @default("{}") // project_id stored here cache_hit String? @default("") cache_key String? @default("") request_tags Json? @default("[]") @@ -610,4 +642,4 @@ model LiteLLM_CacheConfig { cache_settings Json created_at DateTime @default(now()) updated_at DateTime @updatedAt -} +} \ No newline at end of file From 99f2cd1841407e7282637cd30f55811fa61343c1 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:20:09 -0800 Subject: [PATCH 11/41] fix LiteLLM_ManagementEndpoint_MetadataFields --- .../migration.sql | 5 +++ .../management_endpoints/project_endpoints.py | 34 ++++++++----------- 2 files changed, 20 insertions(+), 19 deletions(-) create mode 100644 litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000001_add_project_fields/migration.sql diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000001_add_project_fields/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000001_add_project_fields/migration.sql new file mode 100644 index 00000000000..48328b4d6a2 --- /dev/null +++ b/litellm-proxy-extras/litellm_proxy_extras/migrations/20251113000001_add_project_fields/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable: Add new fields to LiteLLM_ProjectTable +ALTER TABLE "LiteLLM_ProjectTable" ADD COLUMN "description" TEXT; +ALTER TABLE "LiteLLM_ProjectTable" ADD COLUMN "model_rpm_limit" JSONB NOT NULL DEFAULT '{}'; +ALTER TABLE "LiteLLM_ProjectTable" ADD COLUMN "model_tpm_limit" JSONB NOT NULL DEFAULT '{}'; + diff --git a/litellm/proxy/management_endpoints/project_endpoints.py b/litellm/proxy/management_endpoints/project_endpoints.py index e7db9c198ec..9bd6097ad57 100644 --- a/litellm/proxy/management_endpoints/project_endpoints.py +++ b/litellm/proxy/management_endpoints/project_endpoints.py @@ -277,31 +277,27 @@ async def new_project( prisma_client=prisma_client, ) - project_row = LiteLLM_ProjectTable( - **data.json(exclude_none=True), - object_permission_id=object_permission_id, - created_by=user_api_key_dict.user_id or litellm_proxy_admin_name, - updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, - ) + # Prepare project data for database insertion + project_data = data.json(exclude_none=True) + project_data = prisma_client.jsonify_object(project_data) + + # Add non-data fields + project_data["object_permission_id"] = object_permission_id + project_data["created_by"] = user_api_key_dict.user_id or litellm_proxy_admin_name + project_data["updated_by"] = user_api_key_dict.user_id or litellm_proxy_admin_name + # Handle metadata fields for field in LiteLLM_ManagementEndpoint_MetadataFields: - if getattr(data, field, None) is not None: - _set_object_metadata_field( - object_data=project_row, - field_name=field, - value=getattr(data, field), - ) + if field in project_data and project_data[field] is not None: + if project_data.get("metadata") is None: + project_data["metadata"] = {} + project_data["metadata"][field] = project_data.pop(field) - new_project_row = prisma_client.jsonify_object( - project_row.json(exclude_none=True) - ) verbose_proxy_logger.info( - f"new_project_row: {json.dumps(new_project_row, indent=2)}" + f"new_project_row: {json.dumps(project_data, indent=2)}" ) response = await prisma_client.db.litellm_projecttable.create( - data={ - **new_project_row, # type: ignore - }, + data=project_data, # type: ignore include={"litellm_budget_table": True}, ) From b0c99de20412cd1c58e2277beb404cd8fa11e5dd Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:32:27 -0800 Subject: [PATCH 12/41] use 1 helper --- .../management_endpoints/project_endpoints.py | 57 ++++++++++++++----- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/litellm/proxy/management_endpoints/project_endpoints.py b/litellm/proxy/management_endpoints/project_endpoints.py index 9bd6097ad57..b6c51d34221 100644 --- a/litellm/proxy/management_endpoints/project_endpoints.py +++ b/litellm/proxy/management_endpoints/project_endpoints.py @@ -132,6 +132,21 @@ async def _set_project_object_permission( return None +def _remove_budget_fields_from_project_data(project_data: dict) -> dict: + """ + Remove budget fields from project data. + Budget fields belong to LiteLLM_BudgetTable, not LiteLLM_ProjectTable. + Keep budget_id as it's a foreign key. + + Following the pattern from organization_endpoints.py + """ + budget_fields = LiteLLM_BudgetTable.model_fields.keys() + for field in list(budget_fields): + if field != "budget_id": # Keep the foreign key + project_data.pop(field, None) + return project_data + + @router.post( "/project/new", tags=["project management"], @@ -277,27 +292,36 @@ async def new_project( prisma_client=prisma_client, ) - # Prepare project data for database insertion - project_data = data.json(exclude_none=True) - project_data = prisma_client.jsonify_object(project_data) - - # Add non-data fields - project_data["object_permission_id"] = object_permission_id - project_data["created_by"] = user_api_key_dict.user_id or litellm_proxy_admin_name - project_data["updated_by"] = user_api_key_dict.user_id or litellm_proxy_admin_name + # Create project row (following organization_endpoints.py pattern) + project_row = LiteLLM_ProjectTable( + **data.json(exclude_none=True), + object_permission_id=object_permission_id, + created_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + ) - # Handle metadata fields for field in LiteLLM_ManagementEndpoint_MetadataFields: - if field in project_data and project_data[field] is not None: - if project_data.get("metadata") is None: - project_data["metadata"] = {} - project_data["metadata"][field] = project_data.pop(field) + if getattr(data, field, None) is not None: + _set_object_metadata_field( + object_data=project_row, + field_name=field, + value=getattr(data, field), + ) + new_project_row = prisma_client.jsonify_object( + project_row.json(exclude_none=True) + ) + + # Remove budget fields (following organization_endpoints.py pattern) + new_project_row = _remove_budget_fields_from_project_data(new_project_row) + verbose_proxy_logger.info( - f"new_project_row: {json.dumps(project_data, indent=2)}" + f"new_project_row: {json.dumps(new_project_row, indent=2)}" ) response = await prisma_client.db.litellm_projecttable.create( - data=project_data, # type: ignore + data={ + **new_project_row, # type: ignore + }, include={"litellm_budget_table": True}, ) @@ -452,6 +476,9 @@ async def update_project( update_data["metadata"] = {} update_data["metadata"][field] = update_data.pop(field) + # Remove budget fields (following organization_endpoints.py pattern) + update_data = _remove_budget_fields_from_project_data(update_data) + # Update project updated_project = await prisma_client.db.litellm_projecttable.update( where={"project_id": data.project_id}, From c093941e99dfcb278aa733ebba695023fcfd1c19 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:35:23 -0800 Subject: [PATCH 13/41] fix project mgmt --- litellm/proxy/_types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 6a75188841e..2ae517c871a 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2316,8 +2316,6 @@ class LiteLLM_ProjectTable(LiteLLMPydanticObjectBase): object_permission_id: Optional[str] = None created_by: str updated_by: str - created_at: datetime - updated_at: datetime litellm_budget_table: Optional[LiteLLM_BudgetTable] = None object_permission: Optional[LiteLLM_ObjectPermissionTable] = None @@ -2347,6 +2345,8 @@ class LiteLLM_ProjectTableCachedObj(LiteLLMPydanticObjectBase): blocked: bool = False object_permission_id: Optional[str] = None litellm_budget_table: Optional[LiteLLM_BudgetTable] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None class LiteLLM_UserTableFiltered(BaseModel): # done to avoid exposing sensitive data From c9a9aca8cf63e6d0bd23bd5158d8bedb7f91640c Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:41:39 -0800 Subject: [PATCH 14/41] test_new_project --- .../test_project_endpoints_prisma.py | 435 ++++++++++++++++++ 1 file changed, 435 insertions(+) create mode 100644 tests/proxy_unit_tests/test_project_endpoints_prisma.py diff --git a/tests/proxy_unit_tests/test_project_endpoints_prisma.py b/tests/proxy_unit_tests/test_project_endpoints_prisma.py new file mode 100644 index 00000000000..75da918b3cc --- /dev/null +++ b/tests/proxy_unit_tests/test_project_endpoints_prisma.py @@ -0,0 +1,435 @@ +import os +import sys +import traceback +from litellm._uuid import uuid +from datetime import datetime, timezone +from unittest import mock + +from dotenv import load_dotenv +from fastapi import Request +from fastapi.routing import APIRoute +import httpx + +load_dotenv() +import io +import os +import time + +sys.path.insert( + 0, os.path.abspath("../..") +) +import asyncio +import logging + +import pytest + +import litellm +from litellm._logging import verbose_proxy_logger +from litellm.proxy.management_endpoints.team_endpoints import ( + new_team, + team_info, + update_team, +) +from litellm.proxy.management_endpoints.project_endpoints import ( + new_project, + update_project, + delete_project, + project_info, +) +from litellm.proxy.proxy_server import ( + LitellmUserRoles, + user_api_key_auth, +) +from litellm.proxy.utils import PrismaClient, ProxyLogging, hash_token + +verbose_proxy_logger.setLevel(level=logging.DEBUG) + +from starlette.datastructures import URL + +from litellm.caching.caching import DualCache +from litellm.proxy._types import ( + NewProjectRequest, + UpdateProjectRequest, + DeleteProjectRequest, + NewTeamRequest, + ProxyException, + UserAPIKeyAuth, +) + +proxy_logging_obj = ProxyLogging(user_api_key_cache=DualCache()) + + +@pytest.fixture +def prisma_client(): + from litellm.proxy.proxy_cli import append_query_params + + ### add connection pool + pool timeout args + params = {"connection_limit": 100, "pool_timeout": 60} + database_url = os.getenv("DATABASE_URL") + modified_url = append_query_params(database_url, params) + os.environ["DATABASE_URL"] = modified_url + + # Assuming PrismaClient is a class that needs to be instantiated + prisma_client = PrismaClient( + database_url=os.environ["DATABASE_URL"], proxy_logging_obj=proxy_logging_obj + ) + + # Reset litellm.proxy.proxy_server.prisma_client to None + litellm.proxy.proxy_server.litellm_proxy_budget_name = ( + f"litellm-proxy-budget-{time.time()}" + ) + litellm.proxy.proxy_server.user_custom_key_generate = None + + return prisma_client + + +@pytest.mark.asyncio +async def test_new_project(prisma_client): + """ + Test creating a new project with budget, models, and metadata. + """ + try: + print("prisma client=", prisma_client) + + setattr(litellm.proxy.proxy_server, "prisma_client", prisma_client) + setattr(litellm.proxy.proxy_server, "master_key", "sk-1234") + + await litellm.proxy.proxy_server.prisma_client.connect() + + # Create a team first + _team_id = f"project-test-team_{uuid.uuid4()}" + await new_team( + NewTeamRequest( + team_id=_team_id, + ), + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + # Create a project + project_data = NewProjectRequest( + project_alias="test-project", + description="Test project for unit testing", + team_id=_team_id, + metadata={ + "use_case_id": "TEST-001", + "responsible_ai_id": "RAI-001" + }, + models=["gpt-4", "gpt-3.5-turbo"], + max_budget=100.0, + model_rpm_limit={"gpt-4": 100}, + model_tpm_limit={"gpt-4": 1000}, + ) + + response = await new_project( + data=project_data, + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + print("New project response:", response) + + # Assertions + assert response.project_id is not None + assert response.project_alias == "test-project" + assert response.description == "Test project for unit testing" + assert response.team_id == _team_id + assert response.models == ["gpt-4", "gpt-3.5-turbo"] + # model_rpm_limit and model_tpm_limit are stored in metadata + assert response.metadata["use_case_id"] == "TEST-001" + assert response.metadata["responsible_ai_id"] == "RAI-001" + assert response.metadata["model_rpm_limit"] == {"gpt-4": 100} + assert response.metadata["model_tpm_limit"] == {"gpt-4": 1000} + assert response.litellm_budget_table is not None + assert response.litellm_budget_table.max_budget == 100.0 + + except Exception as e: + print("Got Exception", e) + traceback.print_exc() + pytest.fail(f"Got exception {e}") + + +@pytest.mark.asyncio +async def test_update_project(prisma_client): + """ + Test updating an existing project's budget, models, and metadata. + """ + try: + print("prisma client=", prisma_client) + + setattr(litellm.proxy.proxy_server, "prisma_client", prisma_client) + setattr(litellm.proxy.proxy_server, "master_key", "sk-1234") + + await litellm.proxy.proxy_server.prisma_client.connect() + + # Create a team first + _team_id = f"project-test-team_{uuid.uuid4()}" + await new_team( + NewTeamRequest( + team_id=_team_id, + ), + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + # Create a project + project_data = NewProjectRequest( + project_alias="test-project-update", + description="Original description", + team_id=_team_id, + metadata={ + "use_case_id": "TEST-002", + }, + models=["gpt-4"], + max_budget=50.0, + ) + + create_response = await new_project( + data=project_data, + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + print("Created project:", create_response) + project_id = create_response.project_id + + # Update the project + update_data = UpdateProjectRequest( + project_id=project_id, + project_alias="test-project-updated", + description="Updated description", + metadata={ + "use_case_id": "TEST-002-UPDATED", + "additional_field": "new_value" + }, + models=["gpt-4", "gpt-3.5-turbo", "claude-3"], + max_budget=200.0, + model_rpm_limit={"gpt-4": 200, "claude-3": 50}, + model_tpm_limit={"gpt-4": 2000, "claude-3": 500}, + ) + + update_response = await update_project( + data=update_data, + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + print("Updated project response:", update_response) + + # Assertions + assert update_response.project_id == project_id + assert update_response.project_alias == "test-project-updated" + assert update_response.description == "Updated description" + assert update_response.models == ["gpt-4", "gpt-3.5-turbo", "claude-3"] + # model_rpm_limit and model_tpm_limit are stored in metadata + assert update_response.metadata["use_case_id"] == "TEST-002-UPDATED" + assert update_response.metadata["additional_field"] == "new_value" + assert update_response.metadata["model_rpm_limit"] == {"gpt-4": 200, "claude-3": 50} + assert update_response.metadata["model_tpm_limit"] == {"gpt-4": 2000, "claude-3": 500} + assert update_response.litellm_budget_table is not None + assert update_response.litellm_budget_table.max_budget == 200.0 + + except Exception as e: + print("Got Exception", e) + traceback.print_exc() + pytest.fail(f"Got exception {e}") + + +@pytest.mark.asyncio +async def test_delete_project(prisma_client): + """ + Test deleting a project. + """ + try: + print("prisma client=", prisma_client) + + setattr(litellm.proxy.proxy_server, "prisma_client", prisma_client) + setattr(litellm.proxy.proxy_server, "master_key", "sk-1234") + + await litellm.proxy.proxy_server.prisma_client.connect() + + # Create a team first + _team_id = f"project-test-team_{uuid.uuid4()}" + await new_team( + NewTeamRequest( + team_id=_team_id, + ), + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + # Create a project + project_data = NewProjectRequest( + project_alias="test-project-delete", + team_id=_team_id, + models=["gpt-4"], + max_budget=50.0, + ) + + create_response = await new_project( + data=project_data, + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + print("Created project:", create_response) + project_id = create_response.project_id + + # Delete the project + delete_data = DeleteProjectRequest( + project_ids=[project_id] + ) + + delete_response = await delete_project( + data=delete_data, + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + print("Delete project response:", delete_response) + + # Assertions - delete_project returns a list of deleted project objects + assert isinstance(delete_response, list) + assert len(delete_response) == 1 + assert delete_response[0].project_id == project_id + + # Try to get info on the deleted project - should fail or return None + try: + await project_info( + project_id=project_id, + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + pytest.fail("Expected to fail when fetching deleted project") + except Exception as e: + print("Expected error when fetching deleted project:", e) + # This is expected behavior + + except Exception as e: + print("Got Exception", e) + traceback.print_exc() + pytest.fail(f"Got exception {e}") + + +@pytest.mark.asyncio +async def test_project_info(prisma_client): + """ + Test getting project info. + """ + try: + print("prisma client=", prisma_client) + + setattr(litellm.proxy.proxy_server, "prisma_client", prisma_client) + setattr(litellm.proxy.proxy_server, "master_key", "sk-1234") + + await litellm.proxy.proxy_server.prisma_client.connect() + + # Create a team first + _team_id = f"project-test-team_{uuid.uuid4()}" + await new_team( + NewTeamRequest( + team_id=_team_id, + ), + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + # Create a project + project_data = NewProjectRequest( + project_alias="test-project-info", + description="Test project info endpoint", + team_id=_team_id, + metadata={ + "use_case_id": "TEST-003", + "cost_center": "engineering" + }, + models=["gpt-4", "claude-3"], + max_budget=150.0, + model_rpm_limit={"gpt-4": 150}, + model_tpm_limit={"gpt-4": 1500}, + ) + + create_response = await new_project( + data=project_data, + http_request=Request(scope={"type": "http"}), + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + print("Created project:", create_response) + project_id = create_response.project_id + + # Get project info + info_response = await project_info( + project_id=project_id, + user_api_key_dict=UserAPIKeyAuth( + user_role=LitellmUserRoles.PROXY_ADMIN, + api_key="sk-1234", + user_id="1234", + ), + ) + + print("Project info response:", info_response) + + # Assertions + project_data = info_response["project_info"] + assert project_data.project_id == project_id + assert project_data.project_alias == "test-project-info" + assert project_data.description == "Test project info endpoint" + assert project_data.team_id == _team_id + assert project_data.models == ["gpt-4", "claude-3"] + # model_rpm_limit and model_tpm_limit are stored in metadata + assert project_data.metadata["use_case_id"] == "TEST-003" + assert project_data.metadata["cost_center"] == "engineering" + assert project_data.metadata["model_rpm_limit"] == {"gpt-4": 150} + assert project_data.metadata["model_tpm_limit"] == {"gpt-4": 1500} + assert project_data.litellm_budget_table is not None + assert project_data.litellm_budget_table.max_budget == 150.0 + + except Exception as e: + print("Got Exception", e) + traceback.print_exc() + pytest.fail(f"Got exception {e}") + From a6e16a82be667462d7b5018fbbf06d1653d5e010 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:42:33 -0800 Subject: [PATCH 15/41] test proj endpoints --- .../test_project_endpoints_prisma.py | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/tests/proxy_unit_tests/test_project_endpoints_prisma.py b/tests/proxy_unit_tests/test_project_endpoints_prisma.py index 75da918b3cc..daa3af2d67a 100644 --- a/tests/proxy_unit_tests/test_project_endpoints_prisma.py +++ b/tests/proxy_unit_tests/test_project_endpoints_prisma.py @@ -413,20 +413,19 @@ async def test_project_info(prisma_client): print("Project info response:", info_response) - # Assertions - project_data = info_response["project_info"] - assert project_data.project_id == project_id - assert project_data.project_alias == "test-project-info" - assert project_data.description == "Test project info endpoint" - assert project_data.team_id == _team_id - assert project_data.models == ["gpt-4", "claude-3"] + # Assertions - project_info returns the project object directly + assert info_response.project_id == project_id + assert info_response.project_alias == "test-project-info" + assert info_response.description == "Test project info endpoint" + assert info_response.team_id == _team_id + assert info_response.models == ["gpt-4", "claude-3"] # model_rpm_limit and model_tpm_limit are stored in metadata - assert project_data.metadata["use_case_id"] == "TEST-003" - assert project_data.metadata["cost_center"] == "engineering" - assert project_data.metadata["model_rpm_limit"] == {"gpt-4": 150} - assert project_data.metadata["model_tpm_limit"] == {"gpt-4": 1500} - assert project_data.litellm_budget_table is not None - assert project_data.litellm_budget_table.max_budget == 150.0 + assert info_response.metadata["use_case_id"] == "TEST-003" + assert info_response.metadata["cost_center"] == "engineering" + assert info_response.metadata["model_rpm_limit"] == {"gpt-4": 150} + assert info_response.metadata["model_tpm_limit"] == {"gpt-4": 1500} + assert info_response.litellm_budget_table is not None + assert info_response.litellm_budget_table.max_budget == 150.0 except Exception as e: print("Got Exception", e) From e5624c2d577ae1b7a46f99dcfbe08fe58795ca8f Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:48:46 -0800 Subject: [PATCH 16/41] docs fix --- .../docs/proxy/project_management.md | 395 ++++++++++++++++++ docs/my-website/sidebars.js | 1 + 2 files changed, 396 insertions(+) create mode 100644 docs/my-website/docs/proxy/project_management.md diff --git a/docs/my-website/docs/proxy/project_management.md b/docs/my-website/docs/proxy/project_management.md new file mode 100644 index 00000000000..6bc6228bc73 --- /dev/null +++ b/docs/my-website/docs/proxy/project_management.md @@ -0,0 +1,395 @@ +# [Beta] Project Management + +Projects in LiteLLM sit between teams and keys in the organizational hierarchy, enabling fine-grained access control and budget management for specific use cases or applications. + +```mermaid +graph TD + A[Organization] --> B[Team 1] + A --> C[Team 2] + B --> D[Project A] + B --> E[Project B] + C --> F[Project C] + D --> G[API Key 1] + D --> H[API Key 2] + E --> I[API Key 3] + F --> J[API Key 4] + + style A fill:#e1f5ff + style B fill:#fff4e6 + style C fill:#fff4e6 + style D fill:#f3e5f5 + style E fill:#f3e5f5 + style F fill:#f3e5f5 + style G fill:#e8f5e9 + style H fill:#e8f5e9 + style I fill:#e8f5e9 + style J fill:#e8f5e9 +``` + +**Hierarchy**: `Organizations > Teams > Projects > Keys` + +### Example: Team with Multiple Use Cases + +``` +Organization: Acme Corp +└── Team A [no models] → Uses SCIM for onboarding team members + ├── Project: Flight Search Use Case [gpt-4, gpt-3.5-turbo] + │ ├── API Key 1 (Production) + │ └── API Key 2 (Staging) + ├── Project: Hotel Recommendations [claude-3-sonnet, gpt-4] + │ └── API Key 3 + └── Project: Customer Support Bot [gpt-4, claude-3-haiku] + ├── API Key 4 + └── API Key 5 +``` + +**Key Points:** +- Teams have no models assigned (model access is controlled at the project level) +- Each project (use case) has specific models it can access +- Projects can have different budgets and rate limits per model +- Multiple API keys can belong to the same project + +## Use Cases + +- **Use Case Management**: Create separate projects for different applications or use cases within a team +- **Budget Control**: Set model-specific quotas and budgets per project +- **Spend Tracking**: Track costs and usage at the project level for reporting +- **Access Control**: Control which models and resources each project can access + +## Quick Start + +### 1. Create a Project + +```bash +curl --location 'http://0.0.0.0:4000/project/new' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_alias": "flight-search-assistant", + "team_id": "team-123", + "models": ["gpt-4", "gpt-3.5-turbo"], + "max_budget": 100, + "metadata": { + "use_case_id": "SNOW-12345", + "responsible_ai_id": "RAI-67890" + } +}' +``` + +### 2. Generate API Key for Project + +```bash +curl --location 'http://0.0.0.0:4000/key/generate' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_id": "project-abc", + "key_alias": "flight-search-prod-key", + "models": ["gpt-4", "gpt-3.5-turbo"], + "max_budget": 50 +}' +``` + +### 3. Make API Calls + +```bash +curl --location 'http://0.0.0.0:4000/chat/completions' \ +--header 'Authorization: Bearer sk-proj-xyz-abc123...' \ +--header 'Content-Type: application/json' \ +--data '{ + "model": "gpt-4", + "messages": [{"role": "user", "content": "Find flights to Paris"}] +}' +``` + +The request will be tracked under the project for spend reporting. + +## API Endpoints + +### POST /project/new + +Create a new project. + +**Who can call**: Admins or Team Admins + +**Parameters**: +- `project_alias` (string, optional): Human-readable name for the project +- `team_id` (string, required): The team this project belongs to +- `models` (array, optional): List of models the project can access +- `max_budget` (float, optional): Maximum spend budget for the project +- `tpm_limit` (int, optional): Tokens per minute limit +- `rpm_limit` (int, optional): Requests per minute limit +- `budget_duration` (string, optional): Budget reset period (e.g., "30d", "1mo") +- `metadata` (object, optional): Custom metadata for the project +- `blocked` (boolean, optional): Block all API calls for this project + +**Example**: + +```bash +curl --location 'http://0.0.0.0:4000/project/new' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_alias": "hotel-recommendations", + "team_id": "team-123", + "models": ["claude-3-sonnet"], + "max_budget": 200, + "tpm_limit": 100000, + "metadata": { + "use_case_id": "SNOW-12346", + "cost_center": "travel-products" + } +}' +``` + +**Response**: + +```json +{ + "project_id": "project-def", + "project_alias": "hotel-recommendations", + "team_id": "team-123", + "models": ["claude-3-sonnet"], + "spend": 0.0, + "budget_id": "budget-xyz", + "metadata": { + "use_case_id": "SNOW-12346", + "cost_center": "travel-products" + }, + "created_at": "2025-01-15T10:00:00Z", + "updated_at": "2025-01-15T10:00:00Z" +} +``` + +### POST /project/update + +Update an existing project. + +**Who can call**: Admins or Team Admins + +**Parameters**: +- `project_id` (string, required): The project to update +- `project_alias` (string, optional): Updated project name +- `team_id` (string, optional): Move project to different team +- `models` (array, optional): Updated list of allowed models +- `max_budget` (float, optional): Updated budget +- `tpm_limit` (int, optional): Updated TPM limit +- `rpm_limit` (int, optional): Updated RPM limit +- `metadata` (object, optional): Updated metadata +- `blocked` (boolean, optional): Updated blocked status + +**Example**: + +```bash +curl --location 'http://0.0.0.0:4000/project/update' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_id": "project-abc", + "max_budget": 200, + "tpm_limit": 200000, + "metadata": { + "status": "production" + } +}' +``` + +### GET /project/info + +Get information about a specific project. + +**Parameters**: +- `project_id` (string, required): Query parameter + +**Example**: + +```bash +curl --location 'http://0.0.0.0:4000/project/info?project_id=project-abc' \ +--header 'Authorization: Bearer sk-1234' +``` + +**Response**: + +```json +{ + "project_id": "project-abc", + "project_alias": "flight-search-assistant", + "team_id": "team-123", + "models": ["gpt-4", "gpt-3.5-turbo"], + "spend": 45.67, + "model_spend": { + "gpt-4": 42.30, + "gpt-3.5-turbo": 3.37 + }, + "litellm_budget_table": { + "budget_id": "budget-xyz", + "max_budget": 100.0, + "tpm_limit": 100000, + "rpm_limit": 100 + }, + "metadata": { + "use_case_id": "SNOW-12345" + } +} +``` + +### GET /project/list + +List all projects the user has access to. + +**Example**: + +```bash +curl --location 'http://0.0.0.0:4000/project/list' \ +--header 'Authorization: Bearer sk-1234' +``` + +**Response**: + +```json +[ + { + "project_id": "project-abc", + "project_alias": "flight-search-assistant", + "team_id": "team-123", + "spend": 45.67 + }, + { + "project_id": "project-def", + "project_alias": "hotel-recommendations", + "team_id": "team-123", + "spend": 23.45 + } +] +``` + +### DELETE /project/delete + +Delete one or more projects. + +**Who can call**: Admins only + +**Parameters**: +- `project_ids` (array, required): List of project IDs to delete + +**Example**: + +```bash +curl --location --request DELETE 'http://0.0.0.0:4000/project/delete' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_ids": ["project-abc", "project-def"] +}' +``` + +**Note**: Projects with associated API keys cannot be deleted. Delete or reassign the keys first. + +## Model-Specific Quotas + +You can set different quotas for different models within a project: + +```bash +curl --location 'http://0.0.0.0:4000/project/new' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_alias": "multi-model-project", + "team_id": "team-123", + "models": ["gpt-4", "gpt-3.5-turbo", "claude-3-sonnet"], + "max_budget": 500, + "metadata": { + "model_tpm_limit": { + "gpt-4": 50000, + "gpt-3.5-turbo": 200000, + "claude-3-sonnet": 100000 + }, + "model_rpm_limit": { + "gpt-4": 50, + "gpt-3.5-turbo": 500, + "claude-3-sonnet": 100 + } + } +}' +``` + +## Spend Tracking + +Project spend is automatically tracked in the SpendLogs table with the `project_id` stored in the metadata field. You can view project-level spending in the LiteLLM UI or query it directly: + +```sql +SELECT + metadata->>'project_id' as project_id, + SUM(spend) as total_spend, + COUNT(*) as request_count +FROM "LiteLLM_SpendLogs" +WHERE metadata->>'project_id' = 'project-abc' +GROUP BY metadata->>'project_id'; +``` + +## Best Practices + +1. **Use Meaningful Names**: Use descriptive `project_alias` values that clearly identify the use case +2. **Set Budgets**: Always set `max_budget` to prevent runaway costs +3. **Use Metadata**: Store important information like use case IDs, cost centers, and approvals in metadata +4. **Monitor Spend**: Regularly check project spend using `/project/info` +5. **Separate Environments**: Create separate projects for dev, staging, and production +6. **Model Restrictions**: Only grant access to models that are actually needed for the use case + +## Example: Expedia Use Case + +This example shows how to implement a use-case approval workflow similar to Expedia's requirements: + +```bash +# 1. Employee gets approved use-case ID from ServiceNow (e.g., SNOW-12345) + +# 2. Create project with mandatory metadata +curl --location 'http://0.0.0.0:4000/project/new' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_alias": "travel-recommendation-engine", + "team_id": "team-travel-products", + "models": ["gpt-4", "claude-3-sonnet"], + "max_budget": 1000, + "metadata": { + "use_case_id": "SNOW-12345", + "responsible_ai_id": "RAI-67890", + "cost_center": "travel-products", + "approved_by": "jane.smith@company.com", + "approval_date": "2025-01-15" + } +}' + +# 3. Set model-specific quotas +curl --location 'http://0.0.0.0:4000/project/update' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_id": "project-abc", + "metadata": { + "model_tpm_limit": { + "gpt-4": 100000, + "claude-3-sonnet": 200000 + } + } +}' + +# 4. Generate API keys for the project +curl --location 'http://0.0.0.0:4000/key/generate' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "project_id": "project-abc", + "key_alias": "travel-rec-prod", + "models": ["gpt-4", "claude-3-sonnet"] +}' +``` + +## Permissions + +- **Proxy Admins**: Can create, update, delete, and view all projects +- **Team Admins**: Can create, update, and view projects for their teams +- **Team Members**: Can view projects for their teams +- **Other Users**: No access to projects outside their teams + diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 2f69f0e46c5..2e35eb7fcd7 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -196,6 +196,7 @@ const sidebars = { items: [ "proxy/users", "proxy/team_budgets", + "proxy/project_management", "proxy/tag_budgets", "proxy/customers", "proxy/dynamic_rate_limit", From 5147734426b45c7ca529d5b54a7c64d03eec11fc Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:53:49 -0800 Subject: [PATCH 17/41] add user_api_key_project_id in SpendLogsMetadata --- litellm/proxy/_types.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 2ae517c871a..e13e6f736df 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2683,6 +2683,7 @@ class SpendLogsMetadata(TypedDict): user_api_key: Optional[str] user_api_key_alias: Optional[str] user_api_key_team_id: Optional[str] + user_api_key_project_id: Optional[str] user_api_key_org_id: Optional[str] user_api_key_user_id: Optional[str] user_api_key_team_alias: Optional[str] From 5cf8f06b177e96ee538877f4f3c521b79d914629 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 15:56:32 -0800 Subject: [PATCH 18/41] add to _get_spend_logs_metadata --- litellm/proxy/_types.py | 1 + litellm/proxy/litellm_pre_call_utils.py | 1 + litellm/proxy/spend_tracking/spend_tracking_utils.py | 1 + litellm/types/utils.py | 1 + 4 files changed, 4 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index e13e6f736df..499f3a1c334 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -1908,6 +1908,7 @@ class LiteLLM_VerificationToken(LiteLLMPydanticObjectBase): config: Dict = {} user_id: Optional[str] = None team_id: Optional[str] = None + project_id: Optional[str] = None max_parallel_requests: Optional[int] = None metadata: Dict = {} tpm_limit: Optional[int] = None diff --git a/litellm/proxy/litellm_pre_call_utils.py b/litellm/proxy/litellm_pre_call_utils.py index c21a25b51c5..e454ca68c84 100644 --- a/litellm/proxy/litellm_pre_call_utils.py +++ b/litellm/proxy/litellm_pre_call_utils.py @@ -574,6 +574,7 @@ class LiteLLMProxyRequestSetup: user_api_key_spend=user_api_key_dict.spend, user_api_key_max_budget=user_api_key_dict.max_budget, user_api_key_team_id=user_api_key_dict.team_id, + user_api_key_project_id=user_api_key_dict.project_id, user_api_key_user_id=user_api_key_dict.user_id, user_api_key_org_id=user_api_key_dict.org_id, user_api_key_team_alias=user_api_key_dict.team_alias, diff --git a/litellm/proxy/spend_tracking/spend_tracking_utils.py b/litellm/proxy/spend_tracking/spend_tracking_utils.py index 32d9c4b1f21..3938f2eb9ea 100644 --- a/litellm/proxy/spend_tracking/spend_tracking_utils.py +++ b/litellm/proxy/spend_tracking/spend_tracking_utils.py @@ -61,6 +61,7 @@ def _get_spend_logs_metadata( user_api_key=None, user_api_key_alias=None, user_api_key_team_id=None, + user_api_key_project_id=None, user_api_key_org_id=None, user_api_key_user_id=None, user_api_key_team_alias=None, diff --git a/litellm/types/utils.py b/litellm/types/utils.py index bc7641aaf68..6241ec1ca7f 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -1920,6 +1920,7 @@ class StandardLoggingUserAPIKeyMetadata(TypedDict): user_api_key_budget_reset_at: Optional[str] user_api_key_org_id: Optional[str] user_api_key_team_id: Optional[str] + user_api_key_project_id: Optional[str] user_api_key_user_id: Optional[str] user_api_key_user_email: Optional[str] user_api_key_team_alias: Optional[str] From d7824d076e50a36d9a921b28ffe0039b976eca7c Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 12 Nov 2025 16:24:23 -0800 Subject: [PATCH 19/41] docs project management --- .../docs/proxy/project_management.md | 181 +++++------------- docs/my-website/img/project_spend.png | Bin 0 -> 870288 bytes docs/my-website/sidebars.js | 2 +- docs/my-website/static/img/project_spend.png | Bin 0 -> 870288 bytes 4 files changed, 53 insertions(+), 130 deletions(-) create mode 100644 docs/my-website/img/project_spend.png create mode 100644 docs/my-website/static/img/project_spend.png diff --git a/docs/my-website/docs/proxy/project_management.md b/docs/my-website/docs/proxy/project_management.md index 6bc6228bc73..06ed5b4a0d5 100644 --- a/docs/my-website/docs/proxy/project_management.md +++ b/docs/my-website/docs/proxy/project_management.md @@ -28,81 +28,85 @@ graph TD **Hierarchy**: `Organizations > Teams > Projects > Keys` -### Example: Team with Multiple Use Cases - -``` -Organization: Acme Corp -└── Team A [no models] → Uses SCIM for onboarding team members - ├── Project: Flight Search Use Case [gpt-4, gpt-3.5-turbo] - │ ├── API Key 1 (Production) - │ └── API Key 2 (Staging) - ├── Project: Hotel Recommendations [claude-3-sonnet, gpt-4] - │ └── API Key 3 - └── Project: Customer Support Bot [gpt-4, claude-3-haiku] - ├── API Key 4 - └── API Key 5 -``` - -**Key Points:** -- Teams have no models assigned (model access is controlled at the project level) -- Each project (use case) has specific models it can access -- Projects can have different budgets and rate limits per model -- Multiple API keys can belong to the same project - -## Use Cases - -- **Use Case Management**: Create separate projects for different applications or use cases within a team -- **Budget Control**: Set model-specific quotas and budgets per project -- **Spend Tracking**: Track costs and usage at the project level for reporting -- **Access Control**: Control which models and resources each project can access - ## Quick Start -### 1. Create a Project +This walkthrough shows how to create a project, generate an API key, make requests, and view project-level spend tracking in the UI. -```bash +### Step 1: Create a Project + +```bash showLineNumbers curl --location 'http://0.0.0.0:4000/project/new' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{ "project_alias": "flight-search-assistant", - "team_id": "team-123", + "team_id": "ad898803-c8a3-4f4a-976a-a3c372cffa45", "models": ["gpt-4", "gpt-3.5-turbo"], "max_budget": 100, "metadata": { "use_case_id": "SNOW-12345", "responsible_ai_id": "RAI-67890" } -}' +}' | jq ``` -### 2. Generate API Key for Project +**Response:** +```json +{ + "project_id": "e402a141-725a-4437-bff5-d47459189716", + "project_alias": "flight-search-assistant", + "team_id": "ad898803-c8a3-4f4a-976a-a3c372cffa45", + "models": ["gpt-4", "gpt-3.5-turbo"], + "max_budget": 100, + ... +} +``` -```bash -curl --location 'http://0.0.0.0:4000/key/generate' \ +### Step 2: Generate API Key for Project + +```bash showLineNumbers +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ ---data '{ - "project_id": "project-abc", - "key_alias": "flight-search-prod-key", - "models": ["gpt-4", "gpt-3.5-turbo"], - "max_budget": 50 -}' +--data-raw '{ + "models": ["gpt-3.5-turbo", "gpt-4"], + "metadata": {"user": "ishaan@berri.ai"}, + "project_id": "e402a141-725a-4437-bff5-d47459189716" +}' | jq ``` -### 3. Make API Calls +**Response:** +```json +{ + "key": "sk-W8VbscpfuyvHm5TkxRYiXA", + "key_name": "sk-...YiXA", + "project_id": "e402a141-725a-4437-bff5-d47459189716", + ... +} +``` -```bash -curl --location 'http://0.0.0.0:4000/chat/completions' \ ---header 'Authorization: Bearer sk-proj-xyz-abc123...' \ +### Step 3: Use API Key in Chat Completions + +```bash showLineNumbers +curl http://localhost:4000/v1/chat/completions \ --header 'Content-Type: application/json' \ +--header 'Authorization: Bearer sk-W8VbscpfuyvHm5TkxRYiXA' \ --data '{ "model": "gpt-4", - "messages": [{"role": "user", "content": "Find flights to Paris"}] -}' + "messages": [{"role": "user", "content": "What is litellm?"}] +}' | jq ``` -The request will be tracked under the project for spend reporting. +### Step 4: View Project Spend in UI + +Navigate to the **Logs** page in the LiteLLM Admin UI. You'll see the `user_api_key_project_id` tracked in the request metadata: + +![Project Spend Tracking](/img/project_spend.png) + +As shown above, the spend logs metadata includes: +- `"user_api_key_project_id": "e402a141-725a-4437-bff5-d47459189716"` - Links the request to your project +- All costs and token usage are automatically attributed to the project +- You can query and filter logs by project ID for detailed reporting ## API Endpoints @@ -312,84 +316,3 @@ curl --location 'http://0.0.0.0:4000/project/new' \ } }' ``` - -## Spend Tracking - -Project spend is automatically tracked in the SpendLogs table with the `project_id` stored in the metadata field. You can view project-level spending in the LiteLLM UI or query it directly: - -```sql -SELECT - metadata->>'project_id' as project_id, - SUM(spend) as total_spend, - COUNT(*) as request_count -FROM "LiteLLM_SpendLogs" -WHERE metadata->>'project_id' = 'project-abc' -GROUP BY metadata->>'project_id'; -``` - -## Best Practices - -1. **Use Meaningful Names**: Use descriptive `project_alias` values that clearly identify the use case -2. **Set Budgets**: Always set `max_budget` to prevent runaway costs -3. **Use Metadata**: Store important information like use case IDs, cost centers, and approvals in metadata -4. **Monitor Spend**: Regularly check project spend using `/project/info` -5. **Separate Environments**: Create separate projects for dev, staging, and production -6. **Model Restrictions**: Only grant access to models that are actually needed for the use case - -## Example: Expedia Use Case - -This example shows how to implement a use-case approval workflow similar to Expedia's requirements: - -```bash -# 1. Employee gets approved use-case ID from ServiceNow (e.g., SNOW-12345) - -# 2. Create project with mandatory metadata -curl --location 'http://0.0.0.0:4000/project/new' \ ---header 'Authorization: Bearer sk-1234' \ ---header 'Content-Type: application/json' \ ---data '{ - "project_alias": "travel-recommendation-engine", - "team_id": "team-travel-products", - "models": ["gpt-4", "claude-3-sonnet"], - "max_budget": 1000, - "metadata": { - "use_case_id": "SNOW-12345", - "responsible_ai_id": "RAI-67890", - "cost_center": "travel-products", - "approved_by": "jane.smith@company.com", - "approval_date": "2025-01-15" - } -}' - -# 3. Set model-specific quotas -curl --location 'http://0.0.0.0:4000/project/update' \ ---header 'Authorization: Bearer sk-1234' \ ---header 'Content-Type: application/json' \ ---data '{ - "project_id": "project-abc", - "metadata": { - "model_tpm_limit": { - "gpt-4": 100000, - "claude-3-sonnet": 200000 - } - } -}' - -# 4. Generate API keys for the project -curl --location 'http://0.0.0.0:4000/key/generate' \ ---header 'Authorization: Bearer sk-1234' \ ---header 'Content-Type: application/json' \ ---data '{ - "project_id": "project-abc", - "key_alias": "travel-rec-prod", - "models": ["gpt-4", "claude-3-sonnet"] -}' -``` - -## Permissions - -- **Proxy Admins**: Can create, update, delete, and view all projects -- **Team Admins**: Can create, update, and view projects for their teams -- **Team Members**: Can view projects for their teams -- **Other Users**: No access to projects outside their teams - diff --git a/docs/my-website/img/project_spend.png b/docs/my-website/img/project_spend.png new file mode 100644 index 0000000000000000000000000000000000000000..955d1786ba1a7d165b29de41a61907f05ac921d6 GIT binary patch literal 870288 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 Lua+5 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

{qe7^6qxIJ@rVf^E_jn#~M)aAB>4Y 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�^mm6_ihtm^>68_*hTfw zL^!+cr~2Na2nF+;Nu!7onr-DuOVK9}5Q#~Pkb%g(uli!F(G&)R4X<*pAj>{aMKUT# zxI!d@`tzV{k80Kzm;$Evo&g@1n}kX{KGGkv5%Xz5_!Rf6q}$hypa2a<%SguUT*$-E zIj7kr$la3e<^orOw8zAE1uaS@q1ey&*o>&;e%nq-ogfLgZU`?G|JW9);^Tvvl?4!k zGNHYlqPZD4w!!o2qiR1^C`E@>o5i)~;o=vh(4#b{kpb1B{q`ysW*hpU*2EJtkM>|# z(9LYM3)B=zh zgPm7bY75f&ZBG}u0T%Z!;Tsb9)w}bpsbh!#qg|emdk>MDS(X|Uqqxy1gat?0 zrm4Z124gp+NmHxqZo7Z_WB|Tm$6D8L>gP+TSy;;^6Q}~jaVinDYHEL@or1Ocxlk`H z*GiZ`D`$Rled~FRMPm$IHoB2&LkClRMcH=wR)v!Dwb7KpOJbLCJygNh8{djzK28n) zZ0D&HeuVlylLQXNO_YBx+Af5+y*Dc){q1*m$4l%!8vBRht!*HA)ptd` z0>Zs@Atlw`YVENpC7P`C%*xQOd+?DF&6esU%tCX@_|W0DS|Y<>FWs>$=@xI}OSoR( zVM2)CYZn3iO5S%tY@WBYo*ljted%b%f&Y1|kl^BK(m$I3&gfGwURc|amEALTbbsdwpS zubm73+dztIau*d1mRy{VOH7q7cD8Ui+fvffb^`tx16T&ndq2?jV3ndL+Uq)-c4TkL zzo-7%gTb0XasrFeEg$|oTub&NHwI(5*|y26FI5{IRV#zkF=m==yd-AK_Ia#qMe$Q< z1#bh&@%J;gItiPTCfu}TCBBVhiGJnc(F8q!^#t<{U41a@B`&BKezJ*)O2sUl!3aa|OB{_H z3Pr&|CY!|>nX9FdzocII*CEIrB#wfS80qJCCoIA+P-6!^!4yQh?W|cPvQy(Gv3n6f zsa9>JwlYz2g@MiaYO*^WjS7R<3N>@I)PYVF4LJ29B%c(x0`2xd|v5^ z>*Tdy@`|Dq<0lzmw-jymrF6Mxw<3C-0*s)o#VD0v`2ku|3#Fn!X+pYLdOBa5IJI3~ zK@;Yn^nJ>dw*&%OEG{qRUwC64-xHpoTPBq0jZ5UQ>`9}DH#MjF(f`qJi0>~W^6zMB zA1C!Tc6(Rtd&{6t$svp$h}niqpl9*L)1Y-6MG&>0$?Zv-VDh9$^TfJs9aC(9PY7ZGcm`Xxo+B}qwdX${`Zu_AysYn~ $V6!n_`B@Bj}jH%zK8HmB=eM&8p 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�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�{>;}ty`ay%&bzu9SkS1 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 @!F~K*zdt6}^SHJI$N6u%AL` zyIRQCd&t1}r5=KUBfWo9A3QwPM6=PD$=4!cNN%qQlc}~rG>y9V)Qw8A?QT@*`^!TB% zF-`Oz3l-)k&ar={6?IJMpVOR3h(Tw4zgsd5gFs^Vwb+7qNzx5Fq>JP&=yvE6l+iAD*ZrH4kL(!SVQ4LQL!v_i2UnLR!!BQ~XX|rpI}T z<3x90cT9YdfbHXOmyg*rha?lW;*ZJFa}#XZc1rM$| zRQJ!!K4SlSQU@ZaYa?imEUXJsHYp~sBdvT&L2~5U#vj{QIGN}<4m#ZLcLAmJW$cpz z<<`Fuh;$#&jmfu$AFh!BDIUb_)k{xLynn@FbBur;bLt7R%+{H|Zh2Z_f5+$)i8>HX zd+Cq>{vX^H=3FjVfp9bJ23w^2X20gD@cUsidoS^1dS7B}C+T@(s#pZFQYErH8d`DK z^0~5wwNo7QN{MhsDlH0ReWbaQEMJV1%JAtI0~_O`D*rAo>`64Hu1?x1ABaCXM*73k z>W|2+Mhi4Q?Za4!Q&laUoX;uQGe}jq>?MjTeRt9nxrJwe29nR58~{8=tIi_h_bYnb z6)r*8G9cDHB{LWuF)W{a?fj7he@Xjc5+OtxvWs=CgF!LQZgz07gO85Goe(S?Vk9St zjD+J=J?0lTRC`(M>ET!{B(#l-mq1cPvaG)k#`R=i6!eLH={(0zbX0QPmSXN%v#Tui zpYV(RkQi@J7qZZcDqp}7K}^X?sULH%F}0$h57aF@-0J^~uPW&%W)o^@OKd8w;Hcxg zqusFFld{`28k&kY(5sW;!P&88BTX|&fu1fZ$wOh+&5UD)L237$IlJHT9X_nrdqY7O zjgYzx2)!B^NrH(`PCK%T@7VNxo6xP~T1Fejh61dn4D31!^8z^P2W&B*Z!aKrCWp@Y-Mm{s#XU@k;T$x*EJ#boYGPEJNUnZnW&c#0D}?X#yo z;k%MZ*m~N*H&l30O89tNW*4i*oj|!`8V;29`ozW6B-YyOw4;SflwRA06b9E+@HR`$ z2p#OlzIWZBRXX#2=KIZ|2&q^<9v!u5{C1smUm$DkSEPj=vJ-*D9+oS5%$G}qz!pB3@Ugn#;+JZkMXb7g{0XY(Iq!{MCnR(3|R>FZHl zj8MbDzkXl^v?#e~F#@*KV*gY_{r-EZ>~s$9-VW}=Yy)iG1MHiuGl6y4QM{T-Xt_ z`Y@uZGOF9sBkf+65i&GQhDStvIzGi03ivpU>?tpdq?q3!WmwZ>?3oWN*Mhhv#)q(u z`82FIUoVzR*U+z@bZ%BsE?A&2bn&Of;1!dA6gm8%?mH-u4$PlE##WY=F{k=pEt0@! zU8$0ja^ZXVM8+Lil2_Kuxnu{G^}dl*=v`sxSb^_rRgJLV6t;&M^l2t3?N^#<(IIk| zZKV~mkZf!m9IekIiG&I0ohdOB6sOK)262qcgfOxc6i%aiQ|@wivKKN4YqN08CN#7Y z%8-7}sJn2W35;9##Q;n7xIewj@~_nu45BgKGPYh3{Woc0HvHzgu~gXnfU_DmAi>MQ zf$VKlpKf<$9top>xX|aagS>*br9RI($vx~g_9MEZEM#%gq4_Al7{{GKboFoHQDVt7+5EQzjtuc9^M7jX~%y1hMC6zZ+U*!qo=zfxv(W{}CK>hLCvu4E1kOpGmo@ z*DIYLv03RVbX%y!gUZhi*SxLVjbdIFQC~Vimcz9carQs^>C}?IU(%H3O@q>KTzXQ- z0f_UY4uMoM(#pnnTc@v4z?y`?EgpNlz)%0yftu41JCO{c^h+?H@|3iUI@5a>TN6#);v#b!%+r! zUFsl_NbIfr_fProDV3VdlIe7zdaDg+x}nuHos)F}pfDrI9V1ZmSa? z0hgzY^Hs4z0rJc|3ZViQkX;p#OTAg4?OnfxgZPB^qf2wUopA z4N>dSz4wuo9R~qEv;|hq1E-3bh5jgs?D@hEAR!}#ZViyfO{w9BVHG!uw!77JCy2~! zZ~YjTj_9CAvOtB`Z_>Q~<3c4r4w-B{Hu(p0;B1ui-EB^7>CEm+B48yPNWfnYs+hiGPqRW;Lh z@1`t4l{2JueBxhlcs_gMW&I=T&EGZ**ayNuzO9}=4(G+#Vkicc3Yi_&NBQ+^(vjk_-l=QA7SCLMVWoq#oWV` zCtAk|u}mUcuBaJS3ge73%?fez?0hFu3mocHzk}pHzpm(cD-3A#%!|_?TIZK;ti><@ zbga8b0StiM&PMYOYsr{B+um3j?v~&>+_>t+R-PY2Vkcfl$J1sYQ^~qv{K5PkWtx9* zd3Fr$u)p^+n%Gw`lw&gR`cVeLp38`uPMQE7*>*vm@BIOAByq!N zWA@;6(c*sGeeT;bFp>JeW()5|)244v@| zwd*Vjnj4&=GOw1lu$NxZMqpJ33sr6{*(WM$xK?hv8U0(a$+M@!`_9qb^!2k{iU03J ziuLJ&cF%*WCWoVKO^mFs+s5Sgr8iRENxgU%B>13vu3$3;N_e6jD9+vD2s(6sW- z^_~&XUukOElr zMw%ggUB;js*ZA)EWWVNn83Qq`;;)+6Oa-y38d%K}R=;YvVCvl6n{r2oysAsD?g@Bs~h#z#d{ut*iVvBvV z#~J~o#KD>*T#zfW+x@nh&;6Z()WsaZ<>fs2{W3O|a41qD!Yvtpx9;4IyLOAg~uSxeB54UVPEtX{8a3H4dWW zV>UMr+NtkVMq^3MO0AcTuD&<24T@-^L;7XCfb@L`ida!p< z(OTWusLraXFZOdxvZQbrUut~g9h+U;?x9X73K+dqJc)KO&|6tiq1>BnarL#I@ZWtV ztd~ryK>oaY2lxG(>rDtV;ic(BC6|7QY{T0-jl0V?n(ONsdTMp>wXxD_TKpwN2LAzX z|4-dV@H=10>!oOe(|1JQAyx2~llya@hmRlmg)o*r1~?>SC)@kVG=-Us>WQ#aRZOmE zR6Iuyy=$@(d}Q1WFYp01r&(Rr&`=Gd79c2y2vx%5#M(%_`K)zIODhN6NJ_bsvig-) zRY~5{TrYhdT=-*wt2ndIe^2qXdMIK2dOZjvfEAFw@YvY_0iV_Z%*;D-HPM4rncx!! zt0WoJj(*IjsHdPRg?r~qiK5XekeRgmrD3=PWA^eR1(MwTjI=zplmcD}1J^52KNw=1 z-^0ezLqt0C?f`u0&-gb`38Ek*s85L z?Q(Y@g*U7BCSYJS4qN#%>C@6uOEW!-2PRVhT3SVYfwzdn1hyfa_GIHZrPmU3l*ZlP z4~~H?9I;V1h&g@&lWS}U)l%wG;qK#ZcEL2dn#nkdAIUgIYW9WE$p`_9yz}GTvJ!c> zIjulP=XekdDo22^jE+3NH2Lsc@p@wra93V_jLJbd;10IHjFhYoCnA)EC$Du+2K*i< zF#8!V$s+h9v@D)AHqYZWqCAl^{N8KGEN%?_1N2}JPAi%_$_RP+TQykixp9hhsd19F zZ9kG3J)tQxbgR7CWgw3(%V&4zh~0v9s#l^?5gp6c!ct&Icqg|(zG%CrC zl>8VmQLcg@3e_L?Ocm_SKS-d?RfoYAv_OKAW8sMR;H4bh6z#Cs@L@EVHlUTxEo>b!)ZysC)@*S)J%==nU z9_~p;&_>wvGOk2hZ(NhlbCfDbKYjgHP?jfsNWH~wx8(e zc>y*6aFPj)>3&^ZoL-9O_An{;AS2@8eo;l22}M!45AR)Gq^uKm7!^+cMZQF&-z};D zGijW}DY*T67*9^54K|zvzP9$LzZ@6(_OdxPF;i4Ar4ZTcg#JrgVn81bd#B=?j+zXc z+tqf>3V-h=_+?$@d?R+khU9}1wTa^JUBC6mB%LS7e-p6%$Ldh|pU8At9JOg~i)Gc8 z7bY_BRNfV^Ka!z^7nhngrjjd5y3)ynX4-s}Exp^T8ARe5RN4(C`d5QqO$j z0ab?Wg@Yk07|a3yeCE+azsK_`2VH3Yd??XwVTc}KxtRLDtUpBay9eS%GnYea;EG)x+RI5qZxaQz%>KE|;X z@&`{|*faYH-nDR1-?W7eq(6oskf{4=R#0`bdQluDSL(;gTwm9TvA^N+%$Mr9C?X)S z-W|>5iG_L>WzKv)TA=opvFO93ydU04y<0GCvK_7mVs^c~@AFutq~cJdLXpqsDgBpg zRIH%~yFWPaF>U!ROCO~+J-5`f@6PhJ#8yTp`R9_x@R5E5h0$fo{214P8<5XL#TnOS zx!4yMm)8J2(xlMvO>K6rS%&)GB&rLEHEp3ZNm%o@F~*T%CJo0|Kv+(88#iM1HUM_GwfI6FSYZ+0=d)f@heD@~fmK zf%2y1@Kw98Fzn~%1hGss6QmU*>g9*251Ey|K3lm}l*(`0N7tpw>@5*aeU9sX6@MT0 zdyN)g>yY#2nZ_{6vTt=&utt`xUp>pWF#x5OkDOkIc=MiXm;EfCtNDe7a`^S4`)~(djkvf z?c7-usX@tF{@;~${-zORBS|V{Sj<0ES|T0ICZ@fcm4!+XAR?nC<#6(*|3ddA7cgQH zg}cpc*!El2VT6iLcs-W#_`hU)RA^MQhc{(^E5(1^r>!w?rSXQJktHMGSjhm^l283y zNmp%|>37eP0sYX^J0%>V5BQaI%rRkMh&^Vu-^=r_hJ>Kgn?;DI=YTzpBAkP#PX#50 zTm5F*8bXuToiD$0v=9|3I~olTl5x%G%tlGrbJJ>4uEu#ndyw%?lPgwg`)GbPGvs`h z*-%)03SpmP97JEY8A^1}4$Eep9u^nFfK+oxQo%qaX%!!4ad}Zk3>TS1M$Ib?C%EQ^Zoe zZg#xtHF_VLHRgMwSbl{B2iV~q&jbWR0|(U)eBYQ2al$>mJ@jHBwx!REG`gc~|?7zFRF4EC{dN@6Pv} zPn(ZQev>isPHzgRM5)Y;-h&!%Qdf}IsI)3Myi}?9PFloyAA8+B@U>ma8 zc~$M1?qCdnJ<{G|w(^akO=+*>%iQ03l>bo{(5?cbG^mI(V4e{ zX}P&U!N8V`RTSI7XETNA6gmzTJX&aQ^IE9!N=J`SvVJaMv=a4bdMcC>kqbD=h1*#Q z@05q|r5M5|jt&x8$^dB^mbsxPBS>;^q3CS=C_Ti1w|2|bi{61!B7vILsc{~Bh^Mre z=;_2th zwX5TkrM>$++ThjvC^CmbX_WejVH8oO>?7g6m}K5^Az66XKUdz^oVDJVc)db3t$8zDAH`*V^W(OjNLio> z$S|f!kf8N(f+oT88RC=A;>9_U0@wY_of2V3TXxTYG1L8|?R(ROj=23ct#Z?=W455T zCcgYBPN2VE5m9lFG*U>H8AG7I;ZV?DU@(DTjYf8{R>YxC6uCy5 zw}%M%*PYl%Z=ecsL?8k=EW-|XXxN8H`5+@b-4>xd{1b6jDJlL+E0`q^-A@_?0k@>J z=smT*t>w?eKBbAo*ooY)iiVTj-H5mO^dt@d_=3DV4w<#JA_`P&7zs@lrSRa7I~B#n zwP5_4pqChNK18pdsJYCzC7k5FEG8vUbQ(ry&VE1_hx}3Ia~|BUe+WKPEAaPGI0&u& z2gLXbkIiC)xyWyi4)n>HSwWvO_RZ!$HO>Py9q}!%=n6lx`9)m*a(~-o2KOmWziPMJ zr7n>I4&Wy*z`{Wu2VE~-ZUa|1xA1<{Eq-WsF>RT3qTM@>OvVC*SHQ=Qp*$RoGRJq+ z2Vwxev}9201ZKxR^iH^##<<-Md$N^MP2X z$h1rM>;BMmV}l@?UXHO*-JRIm%7#;ogWks$@4IrF=6tWH%6}8NHa;5Ue`xRAOsWYClqn zeb1ZFTzi5&#VF{ykBs27fBZ{&Ixy?(GDCBJRG13hTEuh?q4o+)j$9Q2FmOyhSx!dn zR9+*QfB%IGaydu7%IK(T^}<7$)$cz%M|&RNc&~|-nvDsSMS~SX!?j0&e-w!gfd*cH zzju1VBN}aq_|aU9#%CsQ?*=n3D#ll5hKPwJxOL^mF|F;^>1?{~9@5U6HR;UVq>mk% z($cB3)8d$FYtPYU(X;k7Qr-1qjoiwtdYa`Kw2Y3*;4_*FejR*s553Z4hkyljF3G0( zc5w8g(<vaejK^rIt5Mp><&xe-zv-sTA7iGI7KoTAd#hl#_m z>+B6B!t;({k>2qPc06B{a>`;G- zm!LArDsAGG%hhf46L+h)$X0K=jPMgZYaNg-*^kVK=Vat+FNbY4MX=yHoDe$U^|qw% zwvYC}r-j-Y%%97`J=NTLHvqiv2DYZ1__fHyKK~yE9@4)Uc;laDO8%u+WTb$`{rQGu z(Wh_M1i)J&lSW2Pr>y!uo8s9hB_sv{DPZ@AF)#8lgosalkL%9H(?drE$^1^RKCr1d zcL+QL*)PGCZ~CV&n}nF>GT<`3G1v-Whs91o>@y@B7ws}@_{B;v;+O&*Wfpt5sy2l< zv^1XF0jL?SHp`gob@iZBd!I4v7Fg3?M!nTTBha7c1wq~(uX=ckK!WmkLC66nM!1pR z&5sUy{0WttoO``#)YfdXo;j)gWjHb%HunB`o%E@G2o z&7HjU;({L%ErXB3Nl;l7OD{SKz&lzD8-}vP*fjT~iFbexkAFRxc%>rd7yhghZD^1G zTWi~RBl@sR4&oV)gMal_sn(tC9)28MkHA%S{YT$Cfdg&d(M2F&s>~GKpCvIKen{?q ziz9HCW$VQJLsyz*5^ap$wnh@C8tP`wy21jbePDM$dTcNLc75rZUUtLp8TEDC<~@5o z8mwdzbC!PTSY2C~UZd%yXYuHS)>SN*Z7wmB60jwpseY{3^kY8daKFy|-9yeEtJR77eF)dzm77EVSEtdF;YvtJ&XCjq#R>AKKqP>@~=n#PG0}g{Qln=z(23N6X7cTy7;?t zf*!l2y<9&vp*hL405KZs+=6)sGdGrIwd?o%8wZD!_b~4pIG*-z{oDeI8j>!Au6W!w z!ajWCc6$lS#f`>`wK&Ow6JP2y6o7dpegdI!X;PESDJltdmhO2^eAWJPByLKpf!S^~ z1mi*TU|W^^-ja4YOD?H=MC!5(NK|>E>Q6tY%Di!UQlO00#pK1Sgl>hAEfTj%K&oh*7v5tx`c;SwXOZffBAA!=Tqq zP_NTX;>_~iU4V_N%)cs+!n2wnum@24N4-;Zx0vgq_~%a*K^4Me=^$a!xAhJ+W@}fd zNFj8Yeg>~6XAc|iccn$wSFb<e%_hBRv{;z5*io3Az{1?yK_HCcunmlZ~H5+Ax zm6m>=g*M}ovDpprr%=CFoLzy$R{m$c%Y%#RxCrORE9dN9^OFYC>5xiAC>zwz3oSB9 z3q;*ot^@HhXGRx0*|%%YL#Ol(E@-rP1Oy1L$CMpO3p*B#PCH^Lv3GA{QHQ(!<zaS&H*LR$DG_U`-bhxo}t&MtpsPU2*Wo&Gm z)8WTNaDUeb?_`kO?rG8CSTNVU7j_#!8T<}`KSgmDxX4J&GjY+-aWB{Cd+GYt(G@OP zvXm-|qB|6n>vSj`oa`g|T}BJQ>k|I%hb*^SYcI4oTQ4;E)SNedOJ|}lUkDCY@764H zTWMQHZ?3buaC?2aJlnPY*n?m3Sz{kt`Xvf(Mm#$M?wC;5P|U~iG>fqR+{&U+*7U%EVFU8LU0NjofS^cc{Y9SMQS^jE6i$i;7~$a{`?Y&YK2 z#k&GB3ODwCm-Lahs;La;r+?KkdT21%6P|i8QeJHT#mR90j4lzDX!4V&|6Vu@pOk&5IeVl}%JVEBWFpv;e4);6maPcYe z6Cc{9e`gA{ApyYBq>NgWd$ium!5$ku@2kC40So3dNAL706v|9C&Ny;WSfPptI@6@R zmD_NG%BCkE+`jnX@WGq9WY~Z_4)Iz(8ar+@yw%bkMlK9QD7HW4Cat%B`WJoVKeZSe zj9N8yN(=vRt2;G8iXS7}NBx6Oy9+i-)lfnHl1}{Dtsx#ZR^{QcjuX4>V65s%xo^A& zfW6_N!%eTk1@gYWn^+G{BR}b}-}hNKfq@w#)}C6>6zuxR8ad^A+D2=r})i3G>{6aOrAY!6wxknhZzJ4*vZZMb(ZSdg% z_L$)2L(=7=WW^A8kTNfC3%L3%-5-83oW!H*V<0Eb4%MLiJt>Kn0E(t*aIIXHAe>EU z0RgSaz07NbK4yx^MYPm&QjVvUMX!;?sVD@Q5?aeqCco6iu>93&X97#PJy*)>p8`uD z^ce~_x0jH)TLt*Z$52cs%*OE@d+is{QW}jTRT#?y>CSLN7>=@n2+9vE0-P4(CXmEt z?cikw&OQ8_K4`aXf$jPEJ;3%zsk4w7K7TZL_j-(iU#N2B8&s$Xf2?%u6T|&yB05eK zRe%arT%>Sn|G*D2sdGV?_sa#{B6M-;X1=eg%UowH?)2m^F--~byV?h7W$JMy%5eH3 z8Hu}v-1k#Epyh_;G5%x4>_GX8{P=64I(+dZJ0&A(7-l_&{V(^+V<`f}?E#ZG(bi~Y zR5X}=qSv{nva<5{*%ZpYEB0c~gsbTA8^~MjWTVVa4`*B%DH#e5)ixNF>%I_W7Spy( zx02)eS#TBIWJMGFgwfA8yP#@#RA{z=8Aj$b28el-wXT6!V_HYflB1^>5bwRP>nHC# ze!lGY+&H5YWSoJ63fUm}_55>a^EuSc#CfOoNRzbY^1(BaP7sTd+LCQSug2S=7>75j zO+zhP;Z*Ik1Dt-uGfGE2VIN!EnFq<}{x*2XBvO$ac*S_G9+>i3?cLI!vr{}}* z%N5(h2jiK+L5&neLL;Gs{j7t6C~JM>VgiFom)pvN#)j9RlQ0t>T{ciQK=tw~}JIPSTuR&g~LzU+RcLfjOm zep%jZx#Zbf>JZoUsfP`&uvT>mhF=pQTJBT7|4&hd^Wk4bnWEOx;eX*Zoz7wYcxEgi zCICKHWad!~G~mIIdS)X>KZzpCXEsBsOQF$iMWvrFTscC+!`8C6%R_z9b$X|Jf1gKl zLdzpS?bZ!N4)0v-=;)OwKFCjm9!f|<^7FGN_BhQMX|!58x3x~<_g7ys|93ior$bV- zTc$T!4MHn1>a2=-NQ-UeMp5od6phhEh6E1=hBDBIx<~;8eN%=w$Layg@GuoF}eYKYT4%&u#G77vjAkzC_tIhst z(z0n?>HMj%5O#$0M85Cz`M(q+{|Bfz+a!5s=q;1~obBg8R$J$i>Mz*@%|AP%5_0-7 z?nOaSnXvvY5E;&&c$|qm-B9P|BM^3^pz8dbiI>GwUl2&CB4uJo{WZiAeRCqC4U@aY zvuAHWJ{?uPsaNFX4z(TYr|B(m=|v-?$;H^mrBP4GWcwi}XM;&evz}`ChtKL$Z9=ra z8JN-g@VTMqO&%j0dNjlj(Uh4W;g1D8Xuup9`+i^RoZSFd_6+{16u~S^8cTfPXULh* zgx}cS*^wqAb?cI2P`kJ8_4!%^6%a~tJuL~ZWFmES5xc>Rfx2_ca-AJ^5huDy&_haE zJv7j>GcsRRak5lLpFqQTsooWzqtC%M6QbR4VsDK9yh;do>2f5Ps6dc*%I z6R`>q%Ac9!$Ig@p`R~q(dfkJ z=#Q`ecgg4fk1ltogyw$>b-#T##JaHnsc}VxGqi7ekt(XFV9trVIyeXu{*M;`zOWQE z#s*x~HQ6F;oOIZqxOCs4xNQ5?6F3f0xj>74A9M+i%h@0xx@rh7Bt_6__>H>Xi-SY= z=@Q639@q4M8Xf-5glGvD0LZ6ZN-UaMe&g$3*UgH()BT3(LPjNWiG5D6@j{1aA(~F{ zIGAhw6!f?Iy%RC0vnt+P*vnkL(e*j17j29~h9+b2z*2btqHW&k+;F6Y|B>mk$ z?sDvH!H2`6Tsquid`@wd@8te=q=HmKuLL(w%ds9882CpkYJb08)lZEl*Zb#;GIY5`MO3X$2J&JTkE2JWBJ5&h zOPpA9`=4i369IY}Uhn2*cHH&ah0&l4LrXa9ifw-g3)|XSByhsIT6%W(Q^hfTHT;^j zh<^#NNQr$Hl7KuV?{hS9m5u;8b`TlG=t}T~e2$Rph4!MPZVlp_S)IgcZhjnP7fPwA zF14BDf}>H9Xr<8hN#kYEX|&t3v9k3TbWNLoW{|q7X=@ufQ2gl|(fM({|7vnFej}<^ z)QkL&qJ|FI5_$huA~EoWB0vZiEcvUV>O;8tpZPWbzV1(b9Tku@- zlQ?6tR2NHNRNKGZhlsHD3ss!Ve>ZQ`>`r3?P)izNUuMoab8+&PdYcQEA83)=j7Upw zP2fe>G9SZ=<##^?D(EQSCTW*^@7R^j$P?_w-KxO=Sf{e1WA?^&y3@mNsKcnB=|J`` z67lB*rfuy(!hdR*bz8s5?hGQDVv&=`=W@fP#BAPK?Hy|7c2uEEPpz038?|P!v)IhO z#&4CB5f<64bjaK#V&W{5gUkNpe5u07BFaiOf$nLsC8RzFT<;_3YP-H_jpvQItL4HC zMW)+!`?3)DdSqWmUp=_qUIjb<+#0=#(ACz|%(0$jx7<(ae;!e{m$ERGn6RwmuXcHB z0&0v$s*QcM*kAtQ$EtLv=_C*dwcmJkrI;h;QO zg8q{V&}DpCs3vO9pwg>_UIGApf}Miv>|RS5l)Aj#jdV~}Qv#E6$mBnj#fZ_XBI6ZzZ^l1Cdez>)^H4g#jH= z+=*#g@!kTjX=*1G*PCXA+@dwMFp+FB#Iey)Fo+GKUqldkx;0}Zh8B8pvz?VOPLqa) zdu`gB*x?^u9`3&A2EKgMIni?PVYLuU0e*hF?Hi}DM|5lpyPx`B%ykgpL84MpQshQV z)Q&+_zvg)?oc|y8-ZCuCHc1-}G2Ce&xI=JvmjJ;n5Uc});O^25By@0h4;I|rN#nuY z-QBIRuV-dw_nCcncHY@{e|$gY4@dU_+3%VHv(AUY+4(v#5P3N+4iHiev@>OjB$PZ$zNmB%h0?&a2&ChO zF>+~Xjjl^eC>4ys1Gy%Z=QOqKG@N2O#p6CQl{Hjv#nP{{$Sp8WERGM*vvIf@_}qrA z$B2*(b3#;ncdK72eEG69kS=q>iP*$ru_8h#UZHnJBO1jv|7za+JyZZm4y{O}!sG0W zEHG$fxuV32_C);6u2(K?7tWTqJ;pR#&``H6BO09te)7GGC3j)#%^S`|Q8uLWraq1E z`-OcMz5gB?M=QyA4VJ#t%041Sh(eDl33;jUWpbH}hxX28s?i#^HV0^?;0tAM&2TuF zhR5^@S5`y2<6KirYSDgvl(=74Kc;4Q!4dG_MKx(=HTT?L?$S~!(*$5Jskj+>A~q(o|{Jn{GxO=o0p1h|i1 zyrF?!9ymYuQmLz^c_*Yn;5;64yYurQgHU3%@`JCHT)gbwVe(Vy_(Mg1401)v1^2KL z&OUo8mk=NBmga}w01eoUV7}-AJtcOxIVG-2l@%6|WIOznq;kcnK%h5V=@p^l#*f$` zvVO|(MV?Vc_UZ)d(67A7RF>IW=kOx{r8hII_wMAkWJI=OgD3@t#tf;caY~~o09Hcx zLsdOogt+$hWT0B5=h|E`TrfVW9%+}tA{xVN(Vf1(CJx=%L)@7EwsY$L;oYY}B=Jr^ zX?3-aWP8N>k`Yu>%7HuAt9D|5w^kE!o=jSVaXu4@XPcL8ghzmGi|iM8V4x!~xcm-%7bQ*q^?y&t=$;RC07A z$1>;NR>R%w#qnTf^6CzhhmQ|I-Sn9d&ZyhRinYKgsMb*H3<|%m0^ajB!S+_lVbry!yrs?Ts?)ZikoimfJW+qS&6>FeqF~0Xj8E zEV&P(6N+=m3Li?hR~n`r4xw?T{jN@EIM+lyv2z<}Vd=@}T%;)6k=Mpw#u+f8IgRyr zg4t>z*?KDc*GA~(8KipOzL3R7L$ALfZ2u9u{(EAEe)Rs&a$Vl$CB?CFwOm`Y2AQ@Q#~KlGPtOYXfI9KCn0P8^x9QlH|op zW0lNa2^pDJ!T4!$RCefLM1EM$@m?mrk(ne@O?oHWefhW=2#wGHWyvPUJDYyEPW}`jm%VI-4U0vqqYD$E7v(~ya5_7qEO=1ha+;j&N zIYE7RbMrznbi_#OIQ5jAd~D^R7VqFVBS)HgJ69o8AIT!96{k=6ziJ%+L?0S_Aj&Un zne_r!Lxb*JVjU}+qO#)bg1vrE4m!3K+OHP%^Hcr79&AsFQ&Ojku`zXA#>C`gj;4*| zz{6WOrKh3Hp?$cYpv1*Y{Mqn)kOWsne1$RzE4jV2fk_R)AEVrdqH=gRuM@Ya(et_g z<3+WtLA*2uilQ^N(0A#E-=<;%eIJsh9=^KiX@a8S`(E*@o^lvL7Qsx; zWE_C5@WgcWqlN+5&!2R((UIA$yf$A+Vr}$6fuj5+qVgW@gL3Rys-}z@LfUfqG(twi zMt2lQYHVugfJJ{QZ2O&qBjh^U#W-L2)`Mc^p!iUK!yw=%E+aiHtq+hjsALC&g_u@< zct)IWNAb}|eRUe4CdbtV4^3u#SWS64ytNlBBEm(wwRJ2qQTEHY06choiQ^vhoDltz z$1?9s=CITAnIzyAhfkMra3_f+#wIwQE(E1^NmcjrFd39B6cC$4uHY{bl|Js(cs+4Z zJ!e9*5KG8tqsDv(R<3=!E}PKFg{9SycVAfeo0dVNQBDW)ILW4#XdBc_WvQ<9@r&$l zl*eKM_S#595Ka`8zixTbN2`&yI2B1%rx6ZDWAf*J z=T>keVU1Z>7S~jiPj_!bjg+`hynLtr;FT5>PeCTr8Vk9k{@pDo#i_=N`yq}WEvq(k zc~PWAS0nldHYzF%Wa}#GynAa@oQtlLv9=s3DWV`Si)p?y?invQaU`twsVA|+6N`$g zqk+0m<2}t=kEa{5g|}V}oga6G|C&lp2fp-<^#RXMS^ZlH#oqzy|6OY8kH0$sP>qZ& zP;kC0mHPyGx0Qm&u^CG>2F@hF{@UeMAw99^5fvX@klVn~?0q7UV-Eh-3*V{1*g~DL zNw{w}$e(VvsTfN%G}m6sl-XiDZQZq*V5jz#==rB}V7DnVWeKWzQnHzvnFh#*M9#-F zZm-SLg`CJ8Q=;1}H`402xQ@#?WW4>#2PKvjg$Xx5h4Haa!D?BE$y4qxc1{z898{x?3;&kV)y4K}RIu!%Oasnq_y^9_@bQ;#+F zA{%h>UQaSef%YZ((!<<-a)iRckHRr!sou}(_;KYJ-CZRGyb`qOO&Ewif8 z8l4Sk8V*h(m$Bd)HZ4_h+vOfYNoeSP(tS4V@BHZ-??x?>pZ(Ah~yWO@!Kz~lm{UT(D^aT&`_ z%IRkn6tG&)HdDs_#J(hNTt&T-$?T+c=i!+Qun59iXr0AZP7@`Er|u}!x;$|~y=()h z-@Z{BeX?gz%qKnG6`L!SnI>_!s0;G){#Z`B&?f6@t#Grp(8bOvOoyE=fgBF+a-^NN zUikIP2)B9V@nSkmPp@N&g&4|98iOqH`X$Gb&vA*p##h>>n~sbEvD)1vbJU)QG!EiM zasJTI(76yR?5F#=`Le=vbh^%{f#b^#L`5AuHL|nU9X;|h_NWiAX4qw}X4|`*SMxS- zsfo*H>89yIow5wXriwp*2cK>9gdSs?zln}yyftWc=Yf+ACfNsl=qyTf!O6|$=iQfA z*7)*RCep^7ZpY!@+hA;BXkA3w$q@2k0V*ye(m{otK!@E)sk;u(O>Lb-96GAD2r-d2 zrB)Aa@_m}iy4>ia(u}Kt#ovNC{;L9M&OKoXQ zIiwtT2N`XXc6Hog0METdF=S#wwQfy|Rz^y9y%+i8bx&90++MjMVNM?8)WwJzyDiU84hpKG?VsoTGLI;Zf$9UXynsB^$L7PPG1_WA0Tv> zeYo2waH<`GUV5i%8RjSv>q)kB-;vJqiE^`2aaLOOd_c~c2xxmuc`D?Agr8J&@8arm zF%GaH-CA;We)MegnoPf@VU965{79QgGL@S}$acLu-Pp}0dZPo??eMPlVQQrLe%3(_ z@{L!0zX>t<-U-9r*MXC3m76K6cu&9o5~r*PNc@Q_i1~hD`9}xwKld;9`&8nZJI2_Y z;3v1`8o4QQkRw!1B=W}=t{RBa1*@g5x_Cg2`0m<<;P$7ye`TYLBso^d``}=x6&zeH zE`nBr<$`f>agCIvyD?L`z zCYHgY3_jiEBG7(?*D04J!j=$t(B!j>fvvCpoJCqDfRKkSDtzc}BSDEutSkSxfAccO zCqyl}FQM@SHZ3O|M>qCRw*=~kb&Z|PBw zJDJYL=TRZLeB2PDsJ5deWJ=i$m0qjJNyUvVV74Pzl zMY^Qgr{;`IwOhjd1%gk+R8&!7`5YGZZIJ7&TC43Wf%O~hHF=K70%`TgQ0wPu8-0Bz2e^X}D?vGlans&z9OqR}^v6Lf)7 z7xFp?YDfpYx3>+d*;g`HTX8QcC1~uw@=K`~QzV(e?%bE19fmH>qcbW{nHb-9xcO`^ z+OMwF*x&vhWakzA@=&T&yOAnQ)msPG8`hNPUtP3oCflWWbgg7=my=i zn(heGbAu*Ye;FZ<11XABRaHTc4CZN@)#&G460Fy=Ai~jhy=E*>+SH6(aF!I~s4Twd z%b?gCn2Xj&5A#BJNm39k%tb*X#$Q5@Rj@JF#4mR)8{elQCujIY?lY)>UMRs+yyV_GhK`DFGq(hj|%IJiSS&z<; zdWi;{s{=ByGH_Q!zz1RM%x2VHKkOB?2mQd=C)C0*o@;Rmxf}&m#)VwovnABy7n{>7 zRAZLa(6J^2TCa@7e(0?fn7LsjfvbnamdralJ0~5Av7Wx^*8Z)*$Ptq^&#Ma>>zPgz z*rvRxcAMs%tYN?3>aAdBRMSXLur0YOUy^$IS)zmKc~{awr&FUzPKPP2vOG02GBrvn zD&(L(GxR-*W3#~QJ4bv)i<(Wf8kN*lG1B_Q=_gxT(a>`{NNJdb=a(s`6pm#jXm!qOn&2-G^RG5OK z79XhUezf!#_m{E6Ll+eBIMZU6$sIRHCO4RU@Tf5#kCLUUvh!neCkN{mgR{!ag;K@9Y30JZfu;%V`6=G6Bxw8}VqCY1aE4CAq*(lQfQ@(aae zQ=&C~3|G@Kh5a8SDxIpJ_h_d>GJr8NCT*~-Ioynjig-B<&%o94klyS#=(A`YWw0^> z!EMA{9xlGg?EQaA;vG==B1yR_$IERO2wdx0K35Y~fT9m@jpI`J2MT@?W4D7Sh8z4U zVgT~`ZuOcbyYcezCALJzbO;NIkXy&qB!t|$m2RyKfJ}^8`-R&wm23SwQIDKm{T;CP z=w<0Unn(9!HrOH!RP~v^f=g!g0>$Xg13g3vOro}~b8{=D7#S5cahhx`9As-^_Ea@> z%+D{>jRNX_cO;4=jrkGqzV~}c`I9b>V3zC@BQW}tERVdfk*h7;zzz=&2g@ijWufa& z6-q@_Jw4OJ+S=OQFU&lC-x7NqWy{;~Ijr94hRWZWHSD+3Xg?I>7Eq#LU<80?>peOI z=yJpxrZ$U!rrSCV@IkevsM9P=j9-;PO6C{z$-no!gSPkDC#EFV2<}DHAY5CS=SQ8$ zgaw^4Yq!>1ygeu%8>luYs4N=kOH#MrbCKgcWlY+mj^x)=blKS^a0n&0kHs~m>{N9guTne3T{tTkImxs3X_7nP7aEF@`PD0-_7r4&Am^?e1ZUk>y^^De2 zlfo;_1(P`DGn0u|ng6SYCe7h?>5l~yaTD8YeS-EGC~;AZgVaB>IN`3s%=JS_ zSeX+}W^()t-d8pU??D{fOI-mcrhWqS@NXo8Um2Mn+IUD=D;8K*YDK=TD|@SMZa-d-4NM-Pz+-nW zLbmR4>Lh$7a;)KHj(JtScI@yDAl74Y=GD6HB)n%6$R!i*O&)O|>cEQQEs!kz@UDk| zu`9^rtoI##MqbVtzbGZoM4yLJRzJ5yIJ?+97QERPv%`9;Jpn$DNs3#|=5Ot;?V7qQPH|G(Ijs$^GcTqXfI>nGkU}7f0p9#F@;o@ln zJuJW+%+hb(gt*xDL4S^NVRr%2>M4Mv+;(YkiaWxjy(PgYGrYIj*K4lQ65-OqXBhyG zuKT?U;!ciU2PW)q`D`vUILEP_3cWt+(u7EgNU7q{o)gmPSL)98IE1+|S@FNU-fzfK zPxSGzYY_;92A4~Dcwp1&AS%Rir3H3^#VMP zKrp3D#Tg~$FVY$i=IAVs2kdgtH zI#Mc+?`)10V09YH-8%nL#@>eK_L?$O{`5N*OZ$-c1_jRG_;yX~Hv#M4SBW1LDy&-- zJra9<4!dc145fUcK3_r}^jhV1$l%1@YIuDn<~j(Mf6_3D7x3761ieMPmQu8D@G@rm zggIh3^I}GA<|XjmnxTEOTq4))jI#xA@I$^BwwN{M+?)AV`W8UL(WMX&tzlg<^#i0b zGM-6lFSN_Y!V1Q{nVgtd?daG!)vw)99?|YqLl~{{J3TG#S$Cqf-KEN`{>*#G@0eCa zusp(W7p?9c{lQ%6jg6dD_2N^=wkRp}P$pBZeNx>eBx=+_ zi0IvQhS+bSX|=KAxW_jGhXPZl=`grFmipJ9yW6bSNusTD+bl^cmY{bo(@xM3j`-6! z*!h84f}#%1`HILT1&87Jz)9*%Ri0o4S*Lp%4)4b__CO|C@aj(mGTPH)^?1C`>uoF%(E-49Bw;0_orc@w-`O%#?4<-xgo=AzQvEqBWS3K- zP8%ex5j_(x(qRL~@ZIQ0_7=R=tDrItb@OaG5l!!L%efIC(^wY0=X)fJ*fnFme8^6} z&M8$GrUx6^c&y)o?{Tnx#CUoNV!4mmoaWz_Ts7tng)H~1tM7C#uXCgmi1kn}pQj^y zGr1QfTOZ&Bhxcq;d-rU+Pv{Y_Bls)6Rkn%)1jm5?Cq0t-dLwx!-qDM<=#sPAQ4|gm=D)5ZJsppo z9mllQ!p&C6E)eH}Vqd&ff0?Oxm}E#WM-Xb_Y}dm_O8KAacgyi#Vljxje-pU>I?{o& zaapr*SHCS;u7WJN#ASrqdz?;2iZDm0_dF9|9U+U&;&IW$1~SF-{PCn#%5YGA0Z8)s z)k;NK+U{kjq9O8@*fcAB*tqTI!3FtC9upx`9G1-V-5}m>TLXD!$iDHsl6?8MYb224 zVU^|e&+h5idNsVGUXXN@_Q^8^7}oLmu}M|3i~j}hsweR^&*OReDNk^hXpv6d^r)E7 zb0F_?&kwCXz2FS+iy!1#{2OXzUiRBv$LY@C5T|REB1wuWw5dYY%b35-rTjm<`$YSa z!UxOZT0W;)3n@yRit#P0Cr+K76B)j|fzh@jKxtFfsGi} ztLDny3axi$7u!%QRLpgP+yVF-WmnO8ux7;d{dEFdeXN4b%le>Z^Msn}!S$u_GPl2! zKe{_$ja>QuTbbDZlo9_Q{vR3opNi7B7w#GV^X>mN4fyvc`2XPt{_$JIdd~W3ZSn8+ zCjR+PZ=PnGhPUNPg%-~dm%NTgTT_&d)8vve2lU^5dB@>)G}PVwC_-Gp#%sKM&~#^P zXMJ$Am?U%+&YeZ0j<;z(Uj^c8zGis#s%hBCSDIkt84>zds;);elzd6856LR&149~_ z%Q1f#Q%B+ZACu|-?_QDU_&$qyF@7rXr%{Ut|EoVJ+WkfU>Gk~MJ3z#zXy0ge_Qv|( zUG1Ol9*I2@^B*tZpMBnNy(1)c0d`Vy>Hp;i3}5nd#hn-b?0WvOVc36yUl>EN2NC;! z+a|<)pW(v(@dEy7v-y`9|6%L?%Z&fBiT`EBfAH!5^2UF0D*y7vfAH!5^2Yym7X1rU z`~gk<3sn3CQvLrCQ~>4uYHDiAtE)-y@yCo@Tn?EU!i({q|9uSTFYb%n@;?Hetyo9}eEd^}z z`QCBw4a?+Rx#-LOB_<;Sp=4s(&lL62!G%wd|GpYkVZZ)CJ252%b8=E^btbCTUQ-Oy z5?&aa37iM*+q&uK>Vii$np%Mx25$_(s|BjMx>OyIlk2AojaP{S-P>l$p6ue*=bJH}J zlF#kBQX=4aX=&+qE54)eL45`G=dRlJ_MbdGIPf+B{%dPlBXeVfL#cv9+i@8gZS>m% z2i7EF`VF4+qT!+8kgnX^$h0)T-oB-ziIh!qxSeG&Cgjzt>%sngPSMrN9gMmfn>z~+ zkA~H-X&{@+voG}=yHQInW$h?sLuHZ94nHTtBM7NwY&UBCC2FB(S5 z>+zUkg5+BS_|UU6%lv$1%o-vEk-G_#Im`eqTZho~-@o7UyRBLhj@R3GdmD2toa)&% z`e>Z@u~f1ZuWjJu2p^ zuP*yM5<|XW^i1-*R#T_)gQeFWKBP&xiUAc>hP%%@FH_v00|)vCUg>@j$BlDys%mP5 z$LMqG9FISox~>kzFhDP;E9~Hs!V{24XK}=X`%xpCH zVYP=~U4Z_)1ySU>0;r{ho$dv*&M#(I=DaP20U3D+L>q2CCZ_6(@ije}?l+|c{|+80 zT`z8_5lBa^BhO3X5P>dX+#_pk6D63c6E1Ts} z9Dvb=5w;TJ>TkRRz4a6WGV-j_`$um^1P5Q1>BR*bR%*u9{k(>*P9Tsu^W2jB!B6>c zBM{Ww5zSJPW0dV2?M6gkBnBeTd3Z3s2dbZXxT4MUjxWnVJ~n+f<6kf`lsUwZelvBm zd9}FY-jepgS6U6uSuwp0pP$kJ;#OY3AN^6heaHa1TmJVKi1eD(%li(I!8eHCzjs7; zznm5LxSvUu+--z`;d*k9f>QfB%l%F`-JY;Bt#oN%_87Jxfy|amfT!x!*0@6R#yKQuFk0nDmXAN?}fi&sKdD=ID>qT)|}L&y6pZA3lW;KrAThGDw9_XaK7 zWPOhOoP#+>-!DoF0GN{%nA7fuYYqv%4&WE>7+mLw`1P)v?y5zFmmvK#r#gp5I2*Lj z{w-&A=t~ER=8l%Hyqg;^QLQZrsE-8M^Pxrg&^z280cy=H;P{?FvmZA=?Gf7Z9qQIy zo%VoIeF7%d`~j(3d~FDZKJuU3*7(#|f*MrnFc}h|zePCImAEUhd1FJQkF>wYi4&KCsN~HFNTC;eN++ zp3APdtxm^`C=RIQKk5EeqE!VDtX07C-mn>NWZT$&6ew$R904C5D|L7Ogs!XvPRS!w zzIfr_!^W7{K`AiF1wh$mKnY1MEiB|rM~rzkkpsNmB~-auwB4_JxO@(oVBQgmzDUYt zv77DNUUNu8U2E{L=6pPSOek@3R2sAvRuL+$eQ!iJ^lgr1W`})v(6Db}A@wRrD)co# zp9^QW;yeUp-o-a)s7JKyX2vRA_s`eA#}@&8#TjdUK*NLBh4~AO>jIjD4nv9=RkCA@AsN5@tbGj{X(q3h&Cf7n0~ zk-kzArG`zUOShAD9g$F`4_caJdWuH&a_>ei?=~L~(_8c7h_W zi{DUTi@Wes1lg|%CYpJ;9eB*;jwI7&y7TU#?v zmVM6p3Gu7yi=VxUAm#hAqxywP^ckRE07h;et}Ev)1>5cwmw44VESZ+(Ug?KV~Rp!g(iMBn>5 zAFvRb1u(+uzM-)ZC%|JCngY~}{CU-7Co4Od5Q0a@L9R?9h7<03B+P0s!hd1wW_MHe zbP~f}G|ZBhz$0dpclB+XPoRJunI&5V)T#tJ?(sQo85vQ{!%8cWK<{fjyxJK-3&^^^ zPh0L>iJq_Xf(9EZK*dN_I8xLTWjDJk3f|B@cy{`60VUgp7UGHPnxH)yh95@yTd+`$ z6OwiNH&=}o!##Pw9w>?CNg;EL*4u%1D8U#MJxq&bJo?F43OZOsH-y1$zKc)P5Qu_T# zx2OAZzs|T`O~FaZeHUV894UWx3rORG0l;fcYoSmpvY(p_?Vslm=mguw{tVv8MBsEK zSqo?gpZcFB4!secH`=)|2Rf*QqJD7Hs@BN*8fN?;oF5k#*WGm97`dTfrMu0ewb+2v zKfjWdm1BM^vAOqP3OU>)R2ALADTsnGK#IZN@70e*|29WktSaJs=SgcJ|^(>430e|GCCw z)tqPFbyUmtT@fjj-}>6yf(?xTD6}LgXfiS~@UB)Pg?vbuzPFgjp>Omlp>SfZ)%iOE zvu!3hb~|cC_L659!_>K(w~gMGmb~Fw@9`L-W=ZZj_%}|vZ_D%dAJoGvNc2@dsu788 zb3mkC|K!22?+uW8e+Kxx`YGVx;9&4M*ls=RD}6j^W#$KX)6<#ez2S!sKP@;D+>brL z;8sb=Gb!b(mXUC;W6^~w2?%?*g%>^DPe5W+_%AfpRyXmE%GyzrT?Y$i(gDnLKc#*51Rr^HnD++#9D!39N-o}QNH+P%p zlL7wP55#~)W^?P!)u0v;(Ecw5-A(*goOpmmaujua{o-lVb;lOdswyWA;VzKzFA1!K(!Y22=+zRjFi$CTx&PcpR#p9Mn^g}bZfnLMQxIaG z%;Yhg&hdzQcx>TOUi#?c3?v+btGLxXHtZ!cvhcB8QLC&Ddx|wiC^Hb6DuRYUhZ8~6 zo^IFAV&F&T#YIuX-hD+2@VHWPX?b0Ds9Z8;YkQ3Np^--OLtOW{?_KeE+_is8PS^(Xm$_UhpWm|V;yxBngCtkgFv>40fImQM$G-0` zO;E2x-lW-)y6!uLe1kNTlV+`h=vfizn1#M*xBjFKTKF6P> zj>WDc97vyzG#=~did46?N}5uJzYQw6%>9HCx&nX;s|g=~HY{ZHM{F3Pebd5)MNBTN zZFOlv-mwXP-tDbFpQk>w{S=BHl>9&A$Ug*g|5dzsbM~@Q3rR=I05G(NF%^*}2x|v8 z7zLm{UthE*=fBjp`}(uHQMFXajr`bp-qFl4;KzcRQS`Ck!zn$%da%&Qrq{BE!K)zJ zYa2N=BMIi>KCMheLqqu+@<&*}{;LSaVh4mTnM*#ZQBxqU%~yYjgCC_|#cKtM7Oq6p z`P_mRo)i3dS}Ea^)Kf6Y*FKR$V^B4^ziYc=&~Nc%T43F7t@N(d?3^&@V_X3foZU_c^Uv z8TmSG2xg7_LQv%E(;~Mt&(0-;+kvRh|0FCo>G4-BfU$Fxt`R?ii$ujL(_aDiJt{tr z=~Gog%nYA@sG7tD2Rj0ew!7_nDxyYN6r66_S2Y+AqU#V)L;__(iai_^+#Ip{qCmyovjKQ(EeFpK}-)6 zby$?_x}rxz14WB)wDpng=~}GYH`!{g$Au>@GrL7#;;rVG1bP@s-ouEe@{MPR#hq)ymxPpHbE5dM|P=Aq>nOnqg>HvLegV#Ffm zb=N|Ob-o%vV63VH57G760*vTvJ|eKSJq`wNe5NjW7UOx@;#%^Q0ot!2oLCW0Z-N(3 z|GYXZTY3PYjog}D?k6Yj5k9WkC?-$$8xfF$ohdaL#kW(I-8o1^#!5Ln9a1+IAWW-= zZs2V3MCXCG1)2=+4pLA$6DLj^H0BScLw4Os8i9O#lL7Q(Vh^ehb3KP~MSSZpkmHe~ zJ|B5qPc@MAu|eC3K~?2g91dvs7PNe3?9Lli7^Jsamc6mQF_F}shD{rWZu@Z&FWb4d zz?B2=x1X+rjsqfwfhaO4jqba*^jXKY{qJFyPv=h$RtFjBtW`iZwquf!(L@FpiYo(%mKEp4h9^o6+#F$kgVW7U4~Vv*+HNCk<#-_QBfZO{Z?;k z{Wh>r^TW~cTEpQ@1w7)WeVARP4e+pab?<9H&43)0wh}V0Kf;>BpSGRDOGmFYMG+TT z=UY5%TkmJXMvBfKV^mU+YhZQlPeb(rp__K#`)xf%S6IhG*Y=&8&qKgX%pB63$ND6J z@yd{L#wyRB(S2FnGXy%|@k9R<ebFNPXmeHJ6oLpK)!)fo$ISiNEWQJ@)>vV7g#q^bCszD^ggFqzNZ(*?3v9BhIs z(JaX<&Ce7_@)BUpx-S~hUKEq9E>ie~b3=0BXa8&@I@W?cVAa+u5pAs_)QpU_9M>(q9z@k?1z35Kj@J+KkG zcxB%>;+3KMRS9xtm^sDpZwoA{OTOkzs(Mq4E0F{oYp(z#wI7KZMk`@uAIC^JBVtAOweR*za^I_qde#uLX} zR=2hl5q+Ad6IH4zQjgj#_~sPC&Mi#TEz37$WMc3^dm4H$pr~VDfNV;X2Rgq@Fs|^a z34Rp2*}3=h4ayVocL7c$cHh}6^*iTxR}Bkie)2b=`iKg8_{O1V;^H9i+0?9yT(4o6 zf5%9)<;UrwvAyb60j?|_WcUj&8_S6EB5KPOU-XA7e*4_+<+3Jq}0BHq2asvPbg?3oMwDk9e8s<2F;Xf>aFMdAc=8c%*CIDY)FN}o+B zOIBh-Mz9SLLb0AL@euR)xW29dr~3+il(TDEpn=ca^Q@1U{qf8_KWI1SA+)mi0P6V_0Sh@7^L( zz{fF%onwThiQ6BB+vdk+Wg3R*u(OzmT^)U7T-alm5g!+^EjI?-wDxXEH8T7rjNJ1Nfy>`0?TeMJKuzbSLFeW z&u&cU*SYT=HaES0s1~QxIa{+Z`_qBS)^0OC%qTgije^ZOoc~NV0IA_YP3t?M7$u2+ z9_Cmg<@+nTak~-9g3-F&6KixooGw(O+~{|%MMl+3=IT6K_XsPLv$6$KF4fGP7c(%0 zbxE*(DjrL71|b3o=xpp*jg!=(5>QvZYxQ!KLf;^|;T74J$gPq>U=CP;35OQswH`^2 z4i&0joIbsmka+wO6}s&7D?VYjJ+dV^B(~dSdix`QorRgXfI_az5GJmUw7DihP@0PivhO zEPMc&fHdvfi%_oRn@yK9M}yQ&)6jx^D{(j73~dhc^ja|Y3W=I>`c< z1X8(Lcy&1$%!g&x9tYe8TW0Rz|4xUVAffCudaEHk$3Qyeu~c%A$yYN6CP}`Cp>i&| z5uEvj$w4A9o!Q^WYcMt(Tx!5ob_gORD)TejUNa*ivNVyC-g0T^A<3nstghwuH#Qg+ zly3ipsfEIN(j0vPx!jhR9&Di07Tes+)optZDOf;lJ*hU#!!afzXCVr#qEiz&66wP)K)I(=Fx6=)49GM!+`Q(QWkzSZ^wIiK(rxhj( zT2ESo*0aq4P*#TV&4pJfUbSUZ4{Y~YVV>`(B|Y?WZ=Jgj`T+(}Uh5bd2CpLZwa##= ze4HD9_TT|oJ>Jr=aZy~a6|&U ze@?1M(qn9W+ zs6+m|^^$+`7cqwO8*;6{zKP;^4$_E-&yAO=VKQbN=FN3PJ)uQ=Me_aEo&{_|saX=M zLPykGL{&m)G)()Cr*&d=vt^{+6{BS>An;>3OUe4|{?6rjMOFSY%3+_fEed4B7Bq%H z`jYLXWdI;ocl*A+?HYCvJvG~tO%RoR*gxtiR6O3}^u=lU`qAlA^z@*S5EE0s-j&wY z1^B4OwJrQXV>|2)c6o()!=;P;RKG0f%cHVQ5|F`f|F+7*2k*{1`!aR%s&Te|nrbNJ6;&DIaP~$^;Yr)f0W4*@l~_@f2cIRB-ElK(PPt`cf?8IQkgJ(XrCF zt$3jc2Pza=*K>tTxg4 z?)bmQJN`FJME>EZ(rScx$I@oeieIy7ZC(_i}`GLQD`OtwWhF)ju)-!o{V2)nW*ndo)p&zPjBfhLTLAE8IH{=Mp%|)E2jhRoCw=5E~+K* z$4+(UGLarnU23LhGXv+#`eTO4y4T^NwC~aU`Nu}_AB3l7N@lNbMz2n0cGn%+Vi_q$ zUvMF+khv;+6?wc8dtk6_>);{@WzVGey_h^bEar1JEf(sB$*TgztM%!=gRYYIV|0x8 zyt>73e5=*Ib~N7xBD;GKLiX3uztG_lnqX4Rl&2IJWC`OK;cyZ)T<#en(N>kSaldX^ z?)e0PAH@7e?|(YoYy}#gCk`X9sfdE#t+&JzrY9-J2*cbxRvYLg-Q0Z8ED19bF>YVI zGSUJuSquxid@y2ES{)D3mV|tTHyzB3N635K9~8_i&(G@`^M^_?dp93WMuS^^V5wc3 zURwlw61Hx;g0;cMs!*s%Lri+jGC;!IzkiC)muuf$Kqp6vRD&iitj#q~lv2D40YvLR zhK6Ja&@F?d(+rj5B59rl; zE6CRJxOe{RuCO|X{V3w_T>0_pmTvc2bh^_?`D{y+jFj%K==upu$`tj2^p}Q;@XsF+ zjf2k;Xdy@qPYvXaX#y_#tCE)}Dzmru2S2DYxbD0VO|S+}PNdE4(&zPKWFY%!q|k=h zZC%7^SX1_79M2oAy*xoOv!qq^zOQ;0i?R)0eOL_|u-mpz9Jb069(a8S#>Tm@8ogjp zQ&3OlxDvxi+pA@`rryoN7(}44knoJv3^I=oN{rJWx78?v&Ut#TV(JO4Ejj(22t-5N%E6nPW_)$yU0__s5!lT_ zE;~PeVUu)Gq)ZoYE0aS7N=T(v>Nb0f1K?K}Q=$o&wZwF9Xb9+skGfYKw(pi`7(Tyy zD4)Ea=WS-b{A-C2LU)c=0%K2kfDz_H3{GbY##%P?IJ{o9M|)#gtwp7ojDQV@`X^OYV{b;mhWd)qR=On* zp%NkEVdXsIUn3_Y^^%(S0BI*Zw^&;=CB_k_^VU7}(XsXwxzvDbllN}u*D%fe!~sag zpYuHb<^q^kj4z;2D52bF>Du)g6`+TS|5w+2(xA)+Ykfvi5~>1`7=JrdX5-dVQ4(Kx zu&~r6VH|}`N5dW{kzVRT>RLfoogg44HvFMoqT;Lk@An}cvCm(DNRO|(Ujg?!ty+Z?>CZ1y4s1XINsv4H*1I^Ex$Zh+fL`Mh9pxLc zsv&b?66IBkegN;9Xq(2lC<_yd28FD=_q<=GA;EP?jsRAUekQ35M<~4*_tdm4@}R?w zTsW+`!?U^hp*jcHv}|`}74||~yR6gH>}tPpE}4*SLv{2JG}5D61T`#V?3aRsr(I3` zR4rV0touPqEYzMQn~5Vr!t;(ygT1hB-bhGqnBv+lEaFv!k^%t3gbmSUp?Nab zq)d199s22uq9P`gQdM_|qvM=Neo~GwJeGMit>5g;18%EezT4`C z5z=h<8eAj(IR)6B%~al2lq)+Oz#{ukM+f373b-c* z7;`6;BtiH<(Z~ig*Xs1R1c8ppVQv{@&#Jh~g(1@S;WQ^``q` z1D4j|#`GOFMsZcK($}}kp53HCF0_OlGI(}=2Kd04^*mhwQd^wwYeDrov7V4#w(Ezi z^Y(?X%~SM|D+!+E+B00ep@AIe=CG}QRb!E-)+Ri-4hbbubv!-0w6AO8V`kXtddDhl zX<-}cW_*+n}U7Rk*SWQVw3!AR(LJ6>cCXo(~wtuElwMK40 zAVk=O@JwKKUxG$xaJ&pq^sGfO6aOPoKyd)o0A$Y{RD4@Vv9$jo=j-KSa#@qXifFDq z0GQxK1}|7bF|xN`ZaMKIB>J&$6`|FfUU%f&^YMyNyj|v0;+6t};!vzA*Hy4C+hJlB z-ox(qdEQm;5e#%==zNh<+cik}3^RRcdBt$YYUr%1&&&iJbrBXOkWK zcP_zH=pejTH=mz*dcZ{<7C~;Klf|xdJ-V3OL01WgT^Bw0)Jq$dB+RS)6|hi7@^W|D zxI7S6@IuAa7G+%x$O@mVGvC~8;Y3FLCDEg4QE*OgZT$*(RQEVrsKQ7D>pZc$9Mh6xMU#@YWv&fQcbv`?z*XPm!(z$| z+elw1l5t~Riv$2;_nO!3qbC;h>phwjOco#`Kc1=BZAE`oD_d^H?O-C=SjBo1;O?%t zzmm2%CjqNLcbp_A;jPwoQVpH%TF&I}ogCaI%5b_O{^1fGo7fV|1hwTjKS&6A1sJm@W|_PW84n?X?74RNcUyM_kn=86v(E+fe3 zfhschC}aTo|JeJ^uqL-{T^phiu~DVTvLFEg=^X?S6$F&ttMndPfDlmur7KD=BE5#* zAxH~7QbP|tK!DIfNJ6=B?Yq}n=ec*Ev-jD5_rLFXlIP2uGh>eSzGI9zMXH*%danY3 z-0}?V(T%xPE{?EtPCnjxw{ji^ka2y05CiAs%d{>Gx54F3ew!^e=BnP@1mle`?Y7}5 zJ;tV!QI@(Gce~D)rBM(vIb^}OSMK1zKmOIXZV{?@;ZbeG(%m4V9CeT2AY!e6peVzo z7NEAOHtaV6Mw-9Dw14whe3$~M=%dxS3un>j0Dc*c&zi@&fgKwjZ9Y%l2}We`aT=H-zT#g+5XuE*Kow)*@Tpv}hF1 z)UY+3q_`9^VjM&cB|w@Erv2|7XNcQ2FuN-YGKS%ikvvw`z~p)l zPn5o->bJ)Wm5GV@zfzAl$?4XnIoWynU~eedoaVE>vC+j#0Pq&}=GEZX(T=U;jwiG| zhu;;bS*PZr&&o*({4i&vb)70G3Q_*@zC9?5$yrE9sNhsLE2PTkbm}f(Et#g^=C1F$ zp@~jmKqJWPt?0wZN{i@s4B{DEAN+$<>yZAR9;~8N*5aPQy)G=P9g$+x`P-X6Z5)xz zQAmiBYX8Z8Il%(TGw4nI%YStJZF6!;{1}as#tKIs^>74mQNkcaPI?r+vGsCJ`=h=!L0#CY3)v@$rnN;i!H=PI)IYpJ+ zk@e-%*Vuou2J8&fs<;{9o<*@?hb3S-X}Ys&Pi}>fQ^;xLbi-$*irI8#Wj((EhQ-*< zFUW2*2}lUtSoS;wr$9_nb_NGsFn{zW^g zXX9oDC)o$$yQIz0O%Hr956ZdywZz`aQyWF`Y+OYo`|6lbvvoCbTk_X6ZAPh3C_6CJ zv6aKW?jSdvIm0Kb|1-reWbl%?kB1{lWGBV$-CI#si!wvdz|+#r(aG_do45}tQ+ai& zO2VzTGv=0yihZCsdir;@w|eFH!rjd&gPeewTHluH6UhC;e93kWc7PW^Y1K`W^=~)O zkj5Nuff-NKBUWf=-xEs5<@DP0fbwWJuy#8b$h141XgQSfy~k=MQ>tAI_~uS6x%^V_ z6YUkxU288rBg4>k{{mp=^9f3mJf?wwJ+@%u4-A*Wv@R^RXrPTHYm>@x_u0!v6@Dnu zx8+^w&3Ek#N>TxK7{PlWUb*?a6vFJ+ZA5$0@%D6)80w+^{iwg_GHLl{6qz=7Me~%Y zFDDy-zE=Y#5ZF;S@t_?;E3p@4SXF$q>%L3iwI_Jg0>_YjC=cJJd;050BJ&&@j*JEx85K_^x|&=sSjK=@aRolA2ph4Rup-qvo&e?y4?XQ&T@u zWg0-rlljrdzVXsD%MG)5CvUzsGh!F_<}MH)$;i}Q?EwW_Q$ib`vA!UX)GNX zIq!S2Ex5A_5;^Xg0mbUCfe9T34iCR|aEgR3ew_Q{=9rDa?)H4NoSn8_iM|o_XP#`*H8~Xuf!8NVm5N-B6`JrFTw)vUmdBKYf4Mqm_OWa; zLfZkPnCm0|pFl@B($ej|u4!#HUrl{&W<|UFe4r?z zBk9J`wN#%;%{*|#IATEpk*?eh=yYqgQ&Jjl>X_I!*sFp1sG2{!;a22OA%h1z_Y}|) zTqdw=N^L^Byt%+&iM65QesfIo73e5LfLI7O)f@1pcis%^kwnx&W4AiNtR?!v~!RX_SL1B>F5c76@vuOT+V>9Uhz0<1a=af*Q_(=YEkXlsLM{Kg&h z8$y2Bxh>lZSIu^8*KMk<|0P-S7jXN(xoNX1S6$C{m;}A#OHDM@YHoiL*tM_ik?`!} z88IMFH@*8Sc-FUG@5j)?-n^}@9NiXMJ^qr9-cNK-XW(Mj6)KO@A5wu-+s9+=*hPR% z5~JhAEggQ|^~cD5A+xtD@*U*_`_OIj^ft=rHqajOy9ij;MmSa&mPwInR{L z_;!-CPA|n~Tck=d+b}3fHd}c(KBsy?we37yL>q1Ac)KV^Hc(l z00)vIa&qK$@|-h;nwg{)^sut{UJDUdIBda&gd&#yizxmarKK46|2^J##BFPj|vg&#Nmu*jU3Lc zFY08CnllT#+`i{-i>hfuAzlO2wkpdM*+|sNir(s`2di-S4QtJE^HMQ3*?KP?XUxZi zl!t{sEYr=YYQxnFqo7`fV$=XWhg83aAusa!4-?Z%LI6YNw8Q~D2Q!quk73SpmFn=j zUMUBhGp@7EiB;7ao9$pCXV#mu)b>8QeE0XvRnxC9@|lL6=BO0Wc01g?T8>6#nwa=n z)=sDf-L*ml)L=qH%$@feXD{GPPiiFIgX~_CHFiDUJk!xh4e-JZVTXLWwp$Yemq9fW z53#%b2Pu2l+F=EnXg4??5P0FP5^d=C1ngwhG@!~7-XA}GHjU4|kknNhX6|Y$thy={ zxF0$C^V@Fo!0nA~A9r~~t8j>az(H5L>jr5<;9CIp4Sh)2A~)SgpMMXa)r|=e|5h7j z4A0u$w#xNgmB6R_p~c!h!e>o)0Z~We{OBv*n;s6v)QWasJ6i`Q06JhnDWVmHB0MUX z70A6t6*pDmrabxZ1{pJ6&eb~5U-baZJQro{0c{1obQuJp5g3rgi*61dLZ1D?@QVZ7j@Dkd z_}glmjY1D*s^W}%A{`kT9DDnI+`hZ*+{qkdkpJ*w&@+~(m>5m-Cqc^2Sy@VT zJY~4lWDvSx-n}9`w5*KM@ca7l-n@#IN5%$li)}up<(5-9;ay5qQ!E?qaf8W6X1n>6 zNQmxI@9HR8|71hzH}(9hgHe2o%p=AL#_QGJ6!KCMae`?TRP>);Ap3(!UlR{LUwU>F z!|eW9wdeLiRkXLf#H3c$zA%6_>(-vMylmX^W> zc`q4cxlT95c$OaPK!2fxHI}}6e*2TDO13961oGmwp7yDp?HkIiZ>qrd?vgYS;oKK) zizWXgH#PBTt#q-#;B?haFi&0}?{F2}3}a>)%0?FH$8I^yeJEi1=mXjh8zEzz)g1qJ zN+auPN2?>P>wSLyOGr6_l{lvywJ|RrpB=hCq(|4e?F~~>Y+USn>4+RPHaYhdOL`n~ zFru`eRdpG|>R(!hv93e+9$);*2#l3TglMvO@_s;^()`1tCnKW~iizCU1H0dlHU8rJEzld|H zvx4Q~MYb?q`g_Ba*4No|Tj0X-+gduY?Hki}$05W-IJstWgi-pq$*)@Me3ZDr>Ua*a z182cHmB_qUfhw!_CDVTqW@Vu3{u~#_n20x4%Zg0;9=?TI-2K0IN;Z3n+Nmt2@}1fg z_4Hvtfcd9>IcyrfwpQbZsB;=&D!B+uX4;nMe~@A_=*hO00na>?c-9Pw_mk`Ux|0$~b zi^udg_+<-0x5egY?6ZH65Hm-#;Xr#1^iQ~Mhqa1%Ir^ec-wUE5P|}`3;!W>%_usNI z_SFz+yEKP}>S92^W8*?8nK*_xt7We?RE#MRsKdjtT+iSbwr-;TTCOLLRw=3E6V z-ZnFW*Pwqvh_>@3eygg!9IZvAEF z0`D|2L@Mp%;VsCG3^K5#-u?$|Zb1m1EI`ee=hSy*34betxsP#_7`3j>ZvhW-(|;!J zo+;9>Ge1<%P(zmVhyA2A?UQ=b`hzitey=3+)+uVP@cYeoE;4RO1GFnn`ov5o9AZS# zlX>FM-9E*D`PU;OBW-Dx%2Kr8%`2%XtxQ1RjxZm@0yIB9JXJThN66{w>~0YE@ydxUY4%+hp29!7ER5nyAq*zdTWS``X`m zzZNUd-{;myC#+patnWkSv?lk@(cYtwF;W_wX)E2icz%ML(QF%gM<31>1=HJtj(0`` zU^sEgH0>Htn*C3gu1wvdx*2nTn4=C01KOvlx0}6fY*?lfd?+Nvf}pMioX;)f zMU7ctW|cw|jp}`QXf8(ugE0Jv@5I5u!L1`)<2A`i1Fy^c;||10^lsHCN;_om^L&jO zt;(~On=y9q4{q9mxK^LT{KB+%rtbCytw}BoOuoM7TcqG5NPK)UKz~{vP^Tvw{$g72 zO4Ku+0^t0Zho`4D*-7Wf)vZT(^2AlXy@51amW|YO%|TQ>d#X@63eWy7y?DQdGWoVQ zyQPJXf)~Ujrd$F6j9huNnUulcu2{={4`=Cm%om730Qt<_43F zx5cRAjfm^MG=Jcs zuvo`}_-WVKCn^0B`iUoDNICX?(*}ljT6Oe0wfV9hMuE>wtyo5DJFGE$MizRNT`?scJA=Nw6i8#^5T!OA=$mP`H zCx1J;yG<{1&q$&pYV+~}uweo5H=Xo+}exuRgE4U zGkX-Y;o!T8lp6aHH97gYgLxNd%fWQ>a_enNa|;XLm#=ZalJCFbj*$Frzym+ZsBXql zvW;3Aavbe}v?FT62-2q}j(uP6YwPSzsoz0;^ z`u=N8%anaL$w+<1p)dgHDTH(3QPjsq)1#Fm8M!o_nq_zYrlBUUv>nmH`$jDfluzH^ z^y{i%Utq|SBe@Wkn5jH{NGXYNaf4*q6E_~-PB<(|qS?ycS2S3NE{?9f39IojIk~a* zskcF@>Es}+GIFz?dIOb;YFn%rb-B04-JGdvevQ4%FQCg!qa`sV#-3us!b z+o`@pHN9g;w@5G z@hx2?fe7H!o^JO~b14FXve$IVM=d^mzT{NJ2&=IzfSTQ5IPrgRf!0aL=+wx>)YUpq zCO zLgnS=u4eaX_Aa-{Ut*lp)sA&Jf6pplR!vu(>6K3x|IAU5!b^rqXZ^V%m&W|9&#^zJ z#!4`rC9Oi%^oiS5ve;W+-JOP#VDJ*lM-8p#lsmHN3rpB*UK$#*Q8G7zx=Wv+o410u zKX$opcjKAl2L>jtla&n}h9IKsIh4^)?YGX$MVX(si?H;%XkO!T{>t`Sf|IBA>nQ~7 z-BnHaO=kA6^lP*VPv445t5BDCP)3bC!gI@ck10kdxC$aP+W{k#L~J;$56Cn>nB|a| zEuAbr>V|fk-Kg{5ux8TG2r&eMgGlZpv2VIe8wrnU{Hk>yacZVNos04ICAD6GpA`KZ z)?k#|ErGMf&Nl-HSm}tKp6>4bbyRCcJ;5QQ_HZ!=4#)tkQKoIsPD@e`qfqZTj%Fv* zwY;2#%69?x+~hkF6~y9N#yV}|HNHKwHVMiQ(V>4lH_c)xN_SjdQNt>Gw5T8rtq>V$ zpS=?DrMEw;W$MsB`DY;0((AirGdBaSF&3I0&-~zI2-pj^S=QvN{Dus8)HioG%?=vi zd;FYIZ;-DLu2Z3|(t5y&uqeOG1|nXoB43RXx9+H6NA3BFP8h6y8-r`kL`lJ#D8+ed!9(mI_`&_Rf0O(AFTgDO=|DZLjJHix)0fAb zo(0Kr(~BCz!D1En!!x`xN^JC%RF8m9mH^Xa7*?{gmQQd@Ur5MzGdDkcL3dvXL z^xgI#rMbPljM7u+K<+NDtf4UTS990JoTnmD1GE&XoKJS*sh9_uw91{@dP^&vKCGZ# zwH&(KXtsAIp>*dyXGFivlo(qWo!+EWzg%rqnToP+Knfq3i{X?B93lO^z5SHYcOmCT z;`kw6x07W+ziqmxFEoFqw6dTSe}tOL@Z2oW;nqqo&v>x71iWRLAu*g;JaPJZkhvX& zo;>v>GNRNcxx#jxzExOwt|IdWl##~9k7`zm4GDu zSMhz(XVef}Ijz&10V$wSL}7xt(2SgH$kfY&FhuQfAwi`w(pW4_{SeanbM`5XLid2| zUTvG@Y=~1TYIrYP!N|I`b~i1kX@>J|Ss}OUqN=N{a!kJ_dy*g9{v_+v!@LbFmMwfv zh1NmhUQY*ULdIs!GGAwM)htc{pAxk9cGOAI!;`>mlr0)813qtJL)}i>)u?NpTL3WR z9&U1Ua0(CntxMss@rQXz5+qsTO=Vu5Y&egPl?j^KxHdqFRa4_DJnpG~tml;YFaq(7 zkRHX)VWT}kNa#c8nx2@6d#~m%S6-d6QA?G*DM_EabTxK8WUD`!ANl*mYnnN8F5bV9 zz;F0_e)^v_TfZl>?_MZe9c|^i>i#nA5}1A1$ZY9MerEjQqahpy!k9|r8wLTFcMf&6 zd<0=FUnsL4^P}&zwcJ1}jkmw~1?10vm6*1h_O|qTM7xnHpBmamVFYUnfW>ob*~CQWh`Kz zXYES4QfzbsxN^bVTqYve%2BGt*0FL^)3n99TDwHL01ijA&yY zT{Ph`_^=>L&DAe1Y;G$|Nt^`%A}%J;kG;$)i9183oU7bcYVZ4yt=I%!;2Jc*RH%_H za6Uxd>bw?fb{@go5|Z*(B(9Y*3C?IU)XUjY(RfR*YXPMck!Dl5Ddy}QQk*L5S#kB9 zJ!{jfS!||6c>7V^_Xgg6g_cp20H=?#FtgOCqzLok& zx4s^759VDm1r9F07wqTrot|pYCs9h$`++?i!=u;AsoYg-2YN#GnFn8XFs02mHT_An zdwIGjXd;ca*)94L1}j^7WVEv3Hv7`rEP}C`{evLOy?faf=q_Z>$J3c90FS&GhWSzm z-Vt}Ck!M-(y-<~tU-Kc&el{uXy3Bm7N|)-kRQxq649)!u*7BUUW(c$hI~Rx0BjE%X zd6#mZ8=YwxRvld~gD89@k2cP`vK{swCi`y7ptY8_Z%gUcK})2flJ6xqL(UMzduW2n zJ}H{id8Wc$ml8=UpCcpkx7t=?(jP$(Xs{DOt*R?(hJ$(>m9RVeJI$gwExY*#?EA5B zbzJ3>|6)M@DMLGZiBV7A%3MATm#R0)PObH1Au14y{RQvB`RLN8FxeNm)&ne4g77U9qCnxeBBjAXPU})!jQ6g zEg5ssJk^}jc{Qd=Pfsu>_^3LNJGkMUM`S34MO_6dHG8fkI}ZE|)TA(&*8G)i8L#(s z5i_FrI;29qJqf{5<1%$;z4gUGJGKoh;Dk-47k_D|)O?0kswVqXW8jbUt&l6S5$3mO zFLrfxU(}@!M!_63LteIN1v*(N0Y5{RvU2D(G}!WiJoEKLmiFVOdnv;r4p5|gP1ei4(hq9o&2dX)m|Tb-hgw>ftA1#tZ!j zq95!gc)1tj|r+jA6?-pT@n)pn&n?~{0t zi0!TL7NATdCFOBsM7v3T25<5@@~QzjG@3H<2xpp{=6E>FnPJMG$w2p^6a?R|@+U~4 zKLq|ZLkmla%IH1PDtdE6j9P7dG#1a+UQvZi+a+n~#s+1iJed1%Mv6k_X{Lu&W8CJ) zu0^=*wi0_#c(xY*m9@2tCq($6@qHklmi#j(qxZdkvbp2fbxSTq2*l|i z2MRXCtbW=mARJ$n)j8qOjt|AmO+OTrWKewE5CCgBG@`kXryZR~mLHUEe5WUitCdJd zQ+(P)7!{){6ud^^F1My68A~$K1gD+sK#r0$G9W2zB+n`0RAZr8LiVz+lXAr9+`*HB zZc;L92YH6f5o{=i3)T)w7T4$`&mEzmtUFVt9yA-HmkVgK2#=0s5q*c-w`jS09r^NMIvQ_bnq2gBb6Av{jO3J=$&b4WmYRtt`NjH*G;-Xq z`w@W`X~k<$qaF|HuMYxk(_Wf&Sr6T^1-mJorW;D)cY@9@p@y~A%CVCR1h#XOxRHg@ z5F){S_C33d2{SX>74S{u0ST-Clc4$b`1D0QK*M(EAiHyc(KrNp?SV0P4oLHCiUuT-igEM;)f8m08CmvLklJcugO%&3Hv2yXpEhDShA)={4re zK5a~{yry3Rf!EXn_=Q-lP%nn|5s-$`3^8_5E_D)qcsRVpV3dq6j1+T3u$B3z65lc%zf5=iS~fWE7huqzcnrE44By>q(A|@e+Z>+9 zN;O~}62A9K&^~%*$59WaH3{J!U$%Nb&?Y7nP|N@2zE3+gK^RK-Y+^7-bQW|@veC)V z_{79_J8gQDpXk4{vg_#dLYrnqZ}@;RkaZ}r8i_iNY}cAO*$mSL(A#N6hr&6wO55C2K>MDu)EK@gais10doO@4lG_)SI1a{c{=eY@&u7DG6`+|H#`XS) zHUCIf{*U%tOFjb-$*W7+&~V+o#X)UQ)6A>$#xX&Up0l4>A9-_pr{5Xs$Zwrrcz?)v z$n=BKN13|Ycsy3DwJa1m8pmic@Cu}&n5+FrHzBl3mbmym)Y1Cg+PN!b-1SAHr%iM( zCh7b(*ZZjm+Ei$bqSP1pFxp9$Sm}Ac+FaYzemJVYn;eRlVre&O@&msEylKKOtJJl6 zbS(qxnR1o9#n@R{BdK(2f%e_HrMj=d`VH?6mfuVNS)A#!NM)2P7nAssecty+(<38Z zS=etL?aQnDrh%JN&$YhD=9zs+T+1TgqnOofhZA6*pKLhrPG(MyoXJAJ{x5f!naWbU#M;(YJot{!ye89s-lF@|Su3SzKCr^{)cMI zE5SMHjK!e2v)8Tu&dJ8?0L;~>{r%;w4KWki%bp_Xs+Nlk58rjKLP_)p%ZcfG)EHSJa&0YPHDRHiyQ?{}3 ztfYE>+X80s&SL%kb)r^oBB3@6`vB zZV|@uJ7uA-)!5~(qX}$LJX!)@^v&YwV9AmL%(#5N%%X=g*T%e63DecP9*Cuhy6zey z^gwM{g>aK;;cP@?RW@5(J(|(jW3is8zGe$4_PpMxup+IcKw&!TfYQFw$l z*jL5hl~~%H27PUu>v1g<#wz()xuV@Ow}bs8SX;d;8Gk#)iKRUfOQjUh*W>ZYA1 zh4yQ>JPH2sS9V_?m+Cu=CRS$as>8gft6v+&zUFy#k2};t?Uws}t$yut!h;5l)8{_? zrgt?g7o)+y$+GE(t3^Igz`PlQ?`oBkc8AncodHk9-0A1@Ckx)D0lNz<>VNQ#-t3Z( zPvK$Gg+{U`gz`hS6L|Zj>5OG+=iQ3-r~L@OWlO@IyrGN%ICtUdE!VAc_KslEzzqrK zvB#Wgw7;qLThS$?Iz9dNjda7LRN?nk?Mzk@uVe@aNW!*`)avZu?p< zd-QLQeqVmT!c5X2)b8h<>ZyyPw;l3BXnd3+lqo1S#X$7BT| z-?uBj$e$N5noM{c97lsO0%NAuoe@(TWM!c#Oo3^Ds3O0bsL-^f1d^q*7Slg^XcQGC zO!yv995>_uw!@#5Ly0h^bW1G0JFG2E`$W=b?*#|g%)A?*;ZBqm9zEB*z7E2IkLnFT z6GJ&_!X0Vg^#Q#eG?xy@*`(-OD#{KD_ILvm!dFz1Sn3{++iWcy&-nYvVVgWKxUcY&dN>>X#49-{3-}6;d+u>#u0}3^F0mJlCG8N3 zC!s1ue&i8;2%qe(&v7kcaAzX~j={RK^`tpP{1Q{z)aH$oH21A@`$&2mzOe?qu(9vw zJqg1HIQWUpjbe(N9N?qaQHpNGi16h*VUI?uM9w-lIy-qcnc_yUqoQd~c=pSyC|{pU zLOP%mA9z?lpCW+#z8TzI(4MR()2aG(}>r>>iD+u1W+_b4H(-oS3kC%W&XXERXZdvzsbTTX~h>R5|b|R;`vjPwWDCnaOwUIVVNY; z)Z)OCnLlx~UqCD~{ap&1WzL<8pE}!#_@&VQp)CGCAF+!D0)tmOL-x0+?CDoGMkfLe zEhW$VeV?ZS(V6mnSJq0?3<~7P1-j&CD;fBuY)n8S(r*}+WG?3C(GZpGk85<93Gu_# z@e^$EP*X2w4v+i*xPAEk3I-Ngsk`h4E`-PzUHY}Kk|?Uj*|>$I42OShng7k6_UkEx zqN9M2y{P|d&Hnk#|AV(S%Q9T0lmNO!7XNww{)Hp`|Gjk#cjk=hKACM$?stRxZ!eLu zRkEJ^n=aWViMl_`_`myBGx((o0^>OErziivE&Q)eVBPZc>3igZ<&~R%h}6IN5O~CQ ztJw;U<~+Ln@9y{Snwuh&=i=A@Bb0wXkALG_|09(D#^L=JmG~c_{Ew#m_fFtHn({y9 z`~UIx{x!?~AM^bmpYq>3f&Z;f$$Bd=A|hgJV#1!CdZo-5_z%3s1FcIQ0r`Hg-Tz`c z|7RO4Eqtb+pummTUAcn8h4uIMGu>qMu`TWk`Ue*#Fhrl?ZMXV+8?*d_mHdC*<7OAt z*@-=TE+T=z-!?et4w^|#O-WS*jraOJo2)#sf$Z^RK#OHKfj8~ zC0gnVCr8H)N)t~D5=r%NJ`VOoSJ#Gyb`OCIz&Z>h1+cNPQEPR)zVXMejxoe1B=mth zo*UJ8NH8$OC1N(5HU<(bm*xi2<2%9aD=V&h1pLxL?NQUXsF;`~7%bAC3cnf_*7HzG zj04MpEv>3!c=zt8@6g)cgIAH-Z((aV{fZ3o346gA0KaKdEW{)nkB_iEi9tlQb=^=- z0{`5g&UG*{G>jt5$aybF#_i(mg}9iQR(hgaf81Ny8XMr=eLuO~aPN;lW9uR%ydb`J zc{B9qvj15BKYoyAJ)9k62hjYFXa z2uz|kqU>O&!1UPPg962=I{p~H{`a-8J`KD{*?MB&M^rIFg&%%Xw^+^Q0PW~uC2ye{ zd^=SdEX>|RY+qGYe~hqF4nDPSCElrg)x;TTZlcx zn(MeG@VzI3;oH4r#(8fzaU?#Tsc~t)x3{-rZ_km^37wc!leim5OlG9qIBVT%#6GBe z66PTLb8SJ@q?K|57vzpHxQ?kQ|6s}wSf@gH;Ha5t=AIs&?U{Pa{5qL&A!}22ek!QP z?Ql#BbZn@$N%a>Mkrq$MPN;{^eEgR(QtbBvfd>U&2fWWa@7bK5`#CGGnX6mr>)_z< zqPfeS;WQr~zw+esHuqu$3cbXp-{b?An%rleT<;m7v4x>UoqO7jK1>Lw$7A zIDkgQAvSG`LEMTjfUK`Mk@^VSi+3XtUfls;Ni1_-I9IHy z_M)vG*Tg{??+0Et#GEPeBX0WHEO0>gj5f>TPxBgY6OmBS)Z^aOTnX)z`ip8^;NhrU z11PDSaiOnz#x4^20CHYP*j=FYw#Z*~l>RRrRR}Nt*L2kTGaDNlFRpfdYSnbxX&W$l z?O$+lL)^obmtp{u=v$GgGS_us#uTLr=F!p7v5?eNfgWd>wh!Fa+|J@1b*Lm2D#&Ns zEPt1o`2HXYaz{~iv!dl-V!{`cJTj%j!oKdJBZWgMAV!S1Au^W$Fg4^8Wt~%__Uo3+ zv9Bhv;C0|VBLn@2(zzejB82q0bm>X2g0F+vhY*NpEGSJfKS1s7xev^q zVipyYl0vV0i@ww6vq@jD-ZU+${LQZ@(F7&RF-8f_L<)XKUr3w>ntb@=%EKf}} zriaw9ahc1>pr8&Dn&mQr`$10`bIxf)!IB)rs&0Kfh{3J^dkJ zFDA$G9s$CyD9^Br$;hb}LX0{vpBrQr5v$cLC~3dBz(0H-2^SL=9y=GpDkVvOTk&k4 zPfg^*hq9k7H>$(~)}I>H3bHZsnK&fA6-B#8e~plD4&ibG4vR97&-G z)_kSc4Z+3M-%BmOnL>=af3_yZ?BNNRg9f=&@LFjy%L{AqZm$~4pu|PT`;p76*p-1+ zx8uY1dksrFOFVrwM*(M5*BV6R;!})mmx1^OevIgnq-2>)^;pDQV>m?Z&pqF|KpCNa z!Fycf53~LcT)e+1?Q<6npHNAbJ$2;`BLhpU?A_TxMOUptW<7WCK$ zyzRUEO^H;YyJBZmfx8)JRINdtyJBdtoMc%itVNjiMY#3cEcICtd+i;Ney3O*C-+w} zg~vCSJqx2ZdxZg$r$H|U%+(ndJ-xiF+$_D5;jR+JMk&ty5YpauwuXzVYY8`RVG|#} zOGs{VpQWxq*WtXvjn2UsrT3QlPbEBUzjNPQ@B2E=)0Sy}4Q6wzXNqD*Az8IanxZ^eD3OuwZF+lm2}R>I$%0$Ei`%z}m64;mNlrJMKO=H)eOX-v znCORlBOB5});?@*rqaksRIxRG_VZqHQ`&|$xnooP@aM1M*@{h^`mxSaKL9riAG&)- zYIEh>o2Pi0@!d||k*$VB9eYt}0e5En$&I$SwGUZ0bur=%9n8<|`8 z_dMEv&T2?|tvyb*?N}%hQaaDLFZLr)S#ZpXhq{5@Oi)M)^*&z9%sgVmA=zYMD^cD5 zcsyr*F9V#M9CvtNgG6NUpe$~mNG?AFwVSl=O=z z4H2^1{<-MG+9m%*C9YT)Q|Im^87%0!lu>1E^2w68c4E<=)}I1T_EPCPbZ~SOwx`wJ zt((x9o$oK{i1Otl|Eb5s?^81WwB0FQDSztsel-Nwqwi!H7jPYw zlan+LcL_M^Vg4>S^FCKgpgXGvHD3=s@_yMKy`jHy@RZ?>m#0UEp-Wm9JqlHIRH+%-s%)trEcI21SxC7XxAl$k{&W^Zz06P2^Nvo-EPO;(fMx(j@B|$uQVLecu zo`B!ScUYYdr?GM~Q+g}h?&IK4yGF35;Gd#FAeLI-fdK}{ zPrFH(o}*UOZ)|xYd9psWPpo!dH?=%WPY+z#^cUTbkWlFt1REQR z-5EXmfLEY2Jk9gk0LVSXdoW@02$%wk^^ckSAurUrlqATHMnZA&A3ORd9%gSatn>&( zYeun0q0s&qYxPkJ>X)EC&9N?o+;eZo|6t-^ z`b2sr4;{y5+37ycJ zF_ErKP>SkN;o07-w^=x%xi8^KdaQZJ;K-M}A@ssl74IO~`s#S69v!8;JK-=w1{ON9 zVV87gK2*D-$H!~q6OzKbXCQJ-`(OEme+W}(4xUc3Tz{lXT$gL= z7TUINizy!eANJlms>yWg8y->AK?hVi1W>AUkY2+mMY@90oAlm-bb<_nNEZ<4pwdJL zh!A>HN@xKAA#@N3p$HKIgb>PmbDr<0=R7m#%#3_%z3*D{-wlM^SK0fw``+Fn;hil? zq>o#@+h^qJ3@}+pLc5b&J*C(I6c^)@j@=Z;6;dMWXS2@Kl-*!j`80ZN9eP?!{_tIQ ze>@~I=Gnbbda_nD!7*Ro@A&oO)>2pu~X!5q6UtfZyXJ~93 z5>V=WFpIX`!X=rQLLm^gWl3}2?Q&r$DP}}0b1&4nZF$Twn*67>y?2&-%R>^D!umQ* z31Q*X3OcKc`SrlYhhoRh9Q0rhWkPvoOixZyv$fnn+QFrSDOn z*Q4v)8Mzs_5TR>$-cQQ^+J||crY$&UM$WD=@y@NA`ts(6rV$W~K-=D)37-I;Xn5h> zS*L8rOo?~$%YLNKGvx2Tkn%2i|N6S|+7O_>&|xuZOT69V_gEYD<<`-HP;o80=B`^b zRF&uxfb%qc_MH>G!Nx*5*7`Ym!23CRXvrQsLatsj=$D`0p8h#udbf-AT76#KD7v+* zML6*Ue%KQKNZwYIkFt&GY%~cr8$RWbbyRXf2(tE+ybU>VKIu^Nn3h zVPwI55`YaXhTh^$Mqgc>2;b+;PT%?YGEnK14EyJnUHymA$b>2M}&PM{v{QQmnW!jO|&J3e@`e8j}8sQz94eY=^N z=3BwCL_%Ndhxt|&c^@Qwm$SF44A3RRlJ(@pf(_x+j~u3&)w8~*#RV{1DA|IkqW5hf z2aR!_KW=k;#jDFe76qtdeC@@bV)yMt1yVmR+t&!A1Kl=%C%_S11}8Mv?eypt%$4!E zf9kl9kO_;t6n^^5Yy?8P4X8g#zm){o`GSSl8_Bj)kcgfh=lb3D@tRA-p@o%nMq^~- zU1x(U%=a@I9Ft2-q9C+_h~Wi25Yjz@2NZme6XozEv8;-8bET>g`z}2kx;i+#q{4B<8$)F~a;{i(+2y3NT&(H238m@O<|j$@N*bO|G!!V;V&8j|j@?3+%OC0t>SqOYhn#G(Uj{O)m= zEbQzN&TG*#GIhRgS&IX)dzM0nYU(@#!S9DCqnySuB{)=d;5}P;C}G1%IAGR3Ll#<5 zGd$TV=Qwqr=f(wIgY}wEt)*tcB2!K7SB|{5tz~StA)&QdK-%Vx(P>bnjln&py6x#z zsehG3pI-ysGd}}t@e1pg+x`O&J9p0BIbi|gH2cUhG*+%qB5@Az%enqUJvtaw6VE#^ zIGFe|TZ6<&1@Ek!NE}aaF4-BU`x`uuO$-}96e~7ngfPPyh!cC)O=|q*Xp;53p>S@; zdUTAOZ&`gkNIgm&SyuGS{c5QCt4FW*D<3~8;VUV=J4)R3FONG{W=0xoXi@Vdh;N0W zqQ1SPq}L_9!VMm~iS4mSE-6`cp;mKswSB&5TO!*uCv?BW@xJ`mbk1hC>lOkh)d8;C z032ldyUt$d6t5#k2?z`dJ-ILSaCLWN@@1KOOr5sv)h_#oPl~M{e{_6!vIGWeOX3|Y zYb+b>Ar-*j7-Y0vLemxCyJk1KYdm>O|y+yRz}j&%zdhf(xkIOLL8l^Gcha-^pTAjBKLiQ z1N$a7k@8T~PxPqCjooP_#i*;Azl)Mwvhd;|@>l3W{!@8o+oZhB&B z-z3lmDq8diQ)6@jUe5prKR3L;uSJw!#FuFIwGR~yYMxaM zrlDf)B0=&v*6Xe;+Q)T9^c$F%M7QxN6u;};)q=4GtE-3eSU8htyb)U8)>GaOI$1VS zm++Ch+ix`;Ik&z4ZM-P`(#y+n=8YTvdy55vtw1fvH7_f zmefd356=MuYl6LTzNiw@xFWzydq|9Gid|Yt_1)j{xfWO^5zCwz2|l2mZd}>fTR7oO z$ZcPwPTPRF1?KsEKVSGqS&hpc z0edAc{ql`9_Rkp8SMmP8e)9<&0{F74Gk71OBBx=)nMHZpnp*RY7?$%N>{lTumj#Hk zb%*lA(?Ji^K6c}+GAuu9f46`Zni`jEvXFFPH*Z4wsb>?_$`p5h+pB?M?wIU+$4YyNX$ygw|&@=upu??rxsSl?8&JDqvQe5K}_2*Kdh zTUOI~dFY*~=|jmW|CI*L`rHL_%DK69yWovXNm)PpzIWwiQ#M#cz1=*MzldHGAh>)8kS>%RNQs`MW^>b3}4Sbe(A z=MiN)gFxiPV`(5MrTcX|>RQMA*rpfIn8U{RqfT$Q-mF{GVT&)}^K(h)rhDMrin(he zq+rhPn7eM=fUix!~9(bJu?!ODbPH}OGxLk*HEoW|yM2otk&F59ULdGgiw>#^W za<1m2vePaAUJ*Tvm;yW;g!M(6m@%Gr@yq(KU#4UvFSN9r6wV3@O$=AgDJti^p(&mI zIx!B?I2l;Qub<%7_d}v%db)90{Lh@DNSR9ifPLlns-5@s-mCdfz4Aqr`X_#|s+t?A zUaqeWY^Y_(1q+v$Wk&$h#p$}%2^}2@r+q=O2M3MBH6JJFZOlt4<(U0oITpg!JzmA! z2AEu|^-Gno!aGH)v$M04Eu_KwTXph958g4%p(?MRE1HBJEbEh20?|^mLGUX=pp~E0 z0z@9}ZzX>pMLF>?bZxCf(%<@8C|g~+lwp{-tE-E6$YVyQ6~7*MwI{&{SG%Ck%R3IK zlmT@af5o7)6BjO6%<ZS^gh+Xy&?nE6f{+IB`E+;bH|SdU-2- zp8H0Ie?X%zf67&WS!Oj&m_*c@4R_5r0kuGtl?=3k zrcQd=rN2}gA?wIUoj7ne!rNVU(X4a*gOiE8F>YtlJ^;gYcnxJyqeH1}-YuH9rVhHq9OW(iOiL8D$5JR7O%cg%Lh!m2U)68}{}Iwts%_xw+*+tF4z^Vnf&C zRnEHaICyAu1?v8~iQBXI?l``7sG;aZcj{qj7o)sa@@j& zr-_)Awgn z;z#U+u3JB(9xjvd?%`N|tghbeA%`Fi#iiMO7$N5TDxs&)iRMM65jreSvukN-DZ067 zZ(;&-hAJ%~#2u;Nk*@vjq6KAY-vJG{=hSUPs=2{SZu9MO8H~DV|LADH^soG1Y_E`$ z+?Si@6{fstHNS|dKk)GRGU=-y+}NTHhRZu(cNg`p&?c9fbSBl8BHDQM=V~x!kzsrT zMK5a9&_D<@HuxaZ4X`J6kR^9#l*1mHFlIFn%$P73!M$txoZtkamUXkL4_|3<+x>FizXp}we5+GR$j}$ZaLnAqhZSJ{V0p?!Y)6lrKQpU-RQMr`Z3Uz5`2bBFN zY}nzR_-1)^=}}HNS9vu=me`0t!I>;z-Z?a4H_H;dfjj>!)ln}xc(-tH{2s3lUY2_C%q@!As8V$4xp-A;qszTWxso73kn*PuQ+?g0qol_3+%Ensu2 zGgbfG2kh|1LMd%(bdG=k{ zs#J44TllQ|Y2nI+AMwkG)$A%XT|;S=;DR0PYz%5TqH0P$@#mNu>mLT=5P+0CZ?x1z zNRmFRv+G4b1nWV(^e+tFvH^{ttZFLiaJ}z9h&gE9 zH$y&XV?hka3PQYZcC3KgT~-adtY@LxYc-6!-N*ah`ksd{^kA=B^KqwDL2P?#t77k@ z^4fj>?5{`S`w}quWIt4)+P=Ea|Cbu`1vtJu1YRP!3-Z0vqIj_D7EA};AB`F}?J$W? zf)5$=SyqvarF1`tL7KqpuB&Br&ek7!>zJiHin-s7k758-o{#U7lb%8o;B_i4DQ+hk z8u&`-a|O#p5ntVUef{SW49_B*Z0A;qUL#ZF8{AcvRX@_C4F64ol4hvbl%E~1ZMnUt zpNG@|ARMM8f(nz~3z{_0MA0{U5(eNelP0hqmd9R!TMTbWCbR|Oa5zo-?%aL6n;xb{(OOhR&_;8e`j&x(AVw*u#{tjKfWBLG*ff+RW1}lgxv$ zq12ammsgl&{WlC`4|Y1w(@1@wveOIRu9d@UH}zca!x^6S7w)waUMw~9lMA(}Jjc({ zO4zPFjQtX|eGMjcbS7@g*rh*yhk+hMfz$=9Kiw0($6DI7u0_c?l68X7hhbLlkwsVr zkU!Si@fjGt9YsB{u0I`DME|ln#frGJG66Nrv8v zMH2*Vgt|<6!3WvF_-sqo77(KSA#TD{)4pSKE0t6BbtUzLr1UjV(-yi9(a)AxCx2f> zB>>d@pru#VjWlI%My0QEk;cf+V$s*r+2zai1$?f3EU@0C~|rUeF+$cz;?hQY^)nrdffF0OsX;t*-dBfGwlv}Aj};Y~%tc)V@Bxy%Pp z?gB?RXZtm454MGk4E+)lr^dR<%J{d;naGTJon9Bcje6>_+tY=@2hY#bgZe%vE{}&- z?e6swy?pMsxu1qbP-ICq88yN*6c?KzQ6Ib=Nclkr@-!qQWMS74+MlM&hw-tq z#az=s``>xo{psEHUMCu#aZ=(}r1G^VW$wv-2d*#?i2fsr>X*+nXOi-W=J4w)G|gRF zlxQ57ioeHBZIsaFR-l#j2vB@xA=yDMxT!$&%)LShGPIkTwzp>vH!#7VLk@inaKJ~) z`rriK%;Dtp{tew`2{4%DoM8qkD=gf26vacc*N$qsRNAnvSHHKhQpIeID2gz- zy{~=n89y5iJ}9V8QHo0zG>zHf`*p&=xaUFg5+Bv4SlAw><(FHp-oGZfd$6Z{C}ieO zfSauD4M{={OlZgi+LqsWLIcvF?)KH(ihJ*9!Iau^>jtvW<@m+=zM&Z(lk2#O-CIQy zSZ72mOGJz;!RujRwDk#$B2AFq73+Q3Z<74h^esd}3APKiY0XW;!r~$g*1|V_N`BE! z^kH!$Kfl=qUx5H+-2=Ohry=un;Ff(LQuukf%Mm0en>0s=NYB>yMP%=Hva}AJNAL9a znMEg?`|P%B6`Vz@hL|PFlE@|4=L+xCDY2gfa~l&{ZrH${e>Ka+uc_IP0eiFQR#6kONkoYg*997k>q z5wQ2y(rHt*d0wK`&38>sSNDiA5tblL_SZG0eCIM5U${v1jde&V+R1t@D+Z#^^|jJw z2kkx;N&%v6=bvXdUN>=E^ZNApmCO(Mr`e&(Tq;YUttE09FxH`%D`D`q`e@}rx6eE1br#&7(3h>I`F?2**skREfZ`M3cf z%L|+^H%q4N3@00t^qjv%36ji!{MyMd9(x`x?^+2D4$B6mrgfBUte@95e3S%oa&vYO z{}^FPZ#IwwiSI8fI}fIJTDT%MHKqCBCX$lptc{HyKd0-jv7h$Lwn`-syJAg?-K+23 zMHrYF#lYe4kq)8c?aJ-*+73XYfwvhF=MnC%PV(hAx+;^N@cN^CxtxXb1uSwG=jL+C z;vu`TLs{r|vd2Q=CiKD3a^H+-rW2G2LvFVpJ6NP)OTiDO>owkj*D+QYuzftb5 zyq_m$e#AR@NLz!#&qCv>#<7zwO~XXk>g2p}c2y;8->B4h+`lOcwOLvT!yAte_mpnc z!Y2vP27TZUfef%k;u!F8mwo-}u_`c2rWE%9)Rp2+5%}!ON{I1c{2Ri_Uy_mxOvWCe z(MXLSnR?m#X>bMUFZG=5q3<@5Yxio0cjI0p-Knds9V@OCN-I+N1_-{fL4QkCv}ii} zVcNs#Aj_Dh+a)|(cBE+#wKrKSi%BXP91p%C5~|pKtv)w$$D3wjwY?w~o)OID0f7|N zJUnP@Bz>$WSSh-0i8#4k=wxJM<{Bx*`%L+3+30I?(&1}? zrH)}d2JRAb3uttbL7#LwLkopnhXrZMr-gt3kNqJO*;&Ib2+E-89X)t?Z_aH0WmzDS zy9AT*;+>^9Zp;33-G}M}GYn62)NY1ESMqF=7)=yXMD@%z(2J&HY$SQ!j9ykYF zZ6#bgXliU2=eSjCv~u4mpa8#8{wl(46;gm53K%jXR#c8-p`TGeKZDiPfQi+8;-p(? zqYvO`D)kwk9zLj~P!aJ^r5}?4n zA3j7cCpU@Au&A0IKNqTJUiXIL{!{>I3( z>Y0yJFD+sxe}z<(G>Y}E+Bd8-PE_uWEw_ZqZteGQLn-(DAEQ2ve9?nWZ5urcDy3NT z{ra2#LazVSYzBdjU>;*ur}JlE{tGw%)_Qi{64ketzc#xGb6gAyKB*3=NLWbZ!u!%D?}SUJe#NO8kY)p?Sf^1kwZ z_-T`-E4*!Y*B>Y+U7cn0zVfd-{G;gkum5#M{V1WfcDm&04L0tf<=J>v6nXMDEgpalYGZtReo$dr=il=_$dCE zo}TXe9lZ3FU_!=^+Gw4g>uD;q?ye);$iAaCbk-IGhN;cKvu^=YaxmBYU~J(P2fE5>Va>6s0N# z$WM=rMH2{N1_lOu%~cIQ|EK%-y$$_4P?5g?f(xO(C{vLWBzPM8ZlT1$3bDBJLJmi1 z9le|#)n^wtAY zS#cAtXfQzk02@r5O8Ef!>hb!cTlx*g0o@7d4fX$6k`8=_52bz4;{+INVXjg`urRlv zGIo1)CSk9b7d+naJ^`4)nKC&R-5VQAN6#F)oAota=sQlEJniU^y%DB@z-|HP5>gFt z!3C$+z%a&1`UyXCZq>fi7#knQ^Vr1Jtx(LnMI5a_0~99Z1>TH*26 z&z$_1qdmJPo3a6fb;X_SEjyb=+S3TmRf#M&xR3Y=PE*s1tE+^yVZGwgQnaga+3RYm z?(S|R5$FZcKQxqjkCQ$yA+AzZ+2xy5mA@vI{sBuuKLSagDQo#oR}_H4(TW!utYg<+ zu!m|$0~rV9{9~14Idb40AUFSE8qleteF2b*3t3wSdOm~MWRit?Cpf>B{rxLK{HZ(g z9Rc82*4gL77SKDefCTnFp7YmSlA9aBtEnnF+T$`ZmTcM1$|_zkJ9pK9(`jB6cJ7_F zr!y3b0dlokIkdy{LfN|4PBk4`er!za>?!UlHoeP}bjPUHrKTVD^Z1%!^y$;>o6#v!-~S(tIUeA!|{ ztXehy=7Z)RFWh{a(D5+-*T>0f71^Xm%D^XfAM?h_<-D$kw_aBwRPn7P+kUdq!O z<1VmT3QnTp@0@C;E4I@ej~TvjfcqAt|H} zYV7OvSTzOCub+k zkL5lp&Yn%lcq-$-bm}aqNP){Hfq}EoEWr$>qxR&m{8D&JVTOKaZ*#y8J!CDAnBk}dWwJj ze!m`3CFv;*Su)_~ooghkj-C5#71F|qRD#@a9mM>z#0~9VHP^y%5q}-^z94jCEC~sx zIik+C7uXtI$i7E{UgXn>^r-_ZHpuRqtj<3`9KW-gjMKo`4Z739LVgILWPhB%QAfgw z=NzuBsw=NLY#si&U^T-n{CEEMPf==yY{*7udIJ4%$ff_;?&td#UqVee9kY%u!vEY8 zapNPNJ0CzF zhmHyJ1{no}Zw2o-j&m0zc9E5p9 z#m!{^a)Hj3NBt?1{!bs4%mi+x0M}?leO&YtVs#NfcN$yTV==P-K|Rs{j%i_n;5^4h z;t1Bu7M^@P0$)@8zmtq+yvP8V(o1x_`&*RopKjpy`1(|=62OKADW<<38}%$v0XLJ0 zA9{6cBo2xK*sx5f?(DHq&mcE&Gt$_iyT=B=k~9DtTHW)$cx=@3H$WbT9tx-me*@&P z@QwT50C_B^+x#~`{v}EEzr@Mk0QomS{;pp0zo_NkdH4Sj4f2-U)1vAl#izGkVdWMH ztR>U?Wm(3t81At*0M$?OiD~E$A>|zIi)TBZYs(r#_0+#pNj>^^b6!9jDjizAW=L{M zt5Jd1T2<@7^xBPM(2XRefp5+!7rg}dm2N#7lD@3}X2pOwezI38RPU+AF)aNXRGFb8 zUF%MyVi_=(Ib)3Xj`PqGI2J=NRvkF_>Ri+CA3}85-RMCd{*&niZ2 zbDmevv3TaS5&>=9p*DT^`h(^{YI`5mNT&)P$N)PQ-oinM(i2FT=SQdy@TzEZp*`2T zvPm_@WDmZ!0RGF67Ba{N==A<;c}YOPjEdCz9Xo+xJU#&==pc^61im(GRjqxM^ir>A z^_D8x(|OpwPuYs#G0@{>_hrDM*P7&qUnV(~m9J1|nh?q1P_X#a8F941i~LLV$(3^) z+7N;EW7y;g60V;C+F_p{g#f;UR zy2d@Fep_oOVegWlRHN~X+A+Mw-SfzcvDP3gLUO8+HAL?skArzV^(q)?OO#_-U0Tvw zPZ-b_l}SF9G)}G~9J8LJCKw%l8 zA;Z1Dju8^51XVvK>~+y6mXwsdyu%}d895%86KmInqb1K|DQKm5nH8E`g4sqU=i+q= zy|C;7$3O{yA1_wnzFi;rk?v5fu>6E-J%QEajj6DM`1pE)S{|RJXL~k9_t$P>e;s*4 zNxROlct1J1>o*ETLp{MNc{&$`)^8q%njdl!U{rDikE4to!)HST-qj~+9LK_t51LPq z44sUX0(7Ym5&rjTO9^`A^hn#X9&y8X57mLgv39RprU z);|c25BBA?yL8!|hE%7Xom!)JwhNYe4D5Xtqz0hKEe#+}F;h%-GdW{O#%=N#=-=HS zWci-97c)SVT15&Mx&0IhbB7$24y=yr*srqu&#@l|l^L$G^|<3o-oZhhyaHSc@X`KYIcEjYEH9<#)5?G1BJW^!PVD{$ELt zA0Nvfwz>aog%PX+PaIw?1X{_tY5SN|OVSUiaj4~SHT9{8sOS7? zx$y6LqdN^?;a-fIC0opeIblipbfm&cfhBt{80CGd+^7!}Ll(HJlP0rAiSS+AEeZEh5vp*qp zmcx%82~++sEHN8ZBms2Vy((btzYw7(ao>k?D(GFG(YlZ-Nk_`ee_f|Og_Xq|&yRN)xHgUtz*`QKwVybVK3O0O+y4Yz z8NTBTKHJbh{jhAOiTB13^?9xDU20ircp3#bgjWhVEZ9(?3siA*EG-XBtI3NR>fmZtotLoL;erJ7N|lsW zS=KCv$RNaHe+-s+waw}$PYo{2t@eQ~Pm>03ktrx~KeH(Rp{hn~Tx+^peJ!M?xBo|L zJYy9$zZq#+kLwLrQq0eYx#2FACVRf2&ph`LzQJ*7_A#eMI$7 zoJSVo+{KQN2%yyk9V30Da?Zu1u8&ri+T4=$EL~i3&gz2tqO&)7U>&&0S8i16NirjAiI|iGNOJyKncX)0KB>Tk5*>m*? zy7BTB0n|**n4aE0K5pDo)>K-RV#U1D?dr!wV0IZ6$wDk;g@e3c)tWgm`c@HW$J zG&9q!9Bs%4+F@I2#=Yrm>Yl5ZEDw^4@pI$MB*tS^G2-4C(pY@&R8w+z7s@~jQjDs6 zF**{d2EP;(6x7+o#j`Xew@erTzhe9DBLgJ?M08t~;V6rh>(1pfY@Y0_XD&-h2iHDVg@6^MS=0Mz^%KEd+*<}cwIh> zDyq||3*l4BU0PFD$6(6MihCw@f0ipu#S`fD-h`#^#PzHgYFiOVTjf_;+mgL!qYH7NScKh6K29mPgg6fu*9ph>=m%qE1 zCdBFzkTAz-pA7hwoAo)~PYzPj3Tm`x7A}owghbQ>MP+S3!w)L(&RW&nMC-_nf~O~` z&qb*V%ZVhDTvF$L+0V>&cs2ZXuemG>Z#QpQMfKi$5AxkNsU+0c;2j5z$;=3!=|cdV zFXT2FYQKGKdvWn%tqzeR8_v4~k^6m(6-&I@39>jnjfwkt=CO5_k)}}Pel52L_N};rn z@^jomI!=9pNm3hlzi3bB{k#iZ%?kCK1LxL5u|d4;gC;5u9}eOJROEJWcgVU-8lb#T z!pbx?IU_HlQgcocyQg)YiGUIZsg9Z75-__iiFOW-GL!dxrUF7fe}XU^48tXQ$Tu)o zlYLUhji<84(uZUfiXj9pqMQ{e0Hzzq3v|N z@`|bjiKo4P#{>J-Tk_vvETjO)2;I12@RJ$<;fZXwG~?s@<3Cb`rbKD^=f;yaR0D|FdzdDjz?r{oOmyi+NXHFfGliMJnDYN?O#!t|V=QLJykf;6`$`wwT#r z80c)ODiNn-k!LpT-|VKw&8!p0%k5kif1MB0>jI3!vJej63x&ayrOgB_c_HVbDCpQC z#Y)|rsitW!M$ebWvw{MufC)ARs{Jue+&l?${Da(%*MzKHO96r^i$D6l-SnRmzRp6^=ZmvxhBzq97wXi@t zivSb!*E_k)bEm5?_nXl^ zKsZb>J^%(Z?IUH%;$JYtjin*=%3>+Nd!q7$J+(o(nf zroAHb)+Anu*>>bOg{+_;tlysML^9)&8J|F@N^GBO@Amj~&;^v+RD{nI^zgk?SKm$O zs@Whg2Dld6fEUPQm55W%z9C6~2XwF0-4Eb7m=!!U?8&RvBp;S_?EX1*Zx`t{9nqIS zycxN*rxJ_>Kf(xraqr!Ga@x0!6s$ka7Qgl3a9ZEJU=Qd{S*Gd{+i@veR#EQNjz-K_ z1OqK$m0heL1!C(<7?c%1si=Ti{bLeN;$hLU&J=P|CH}Uv30>o;4_FS^nW!To*rp5>HDob8uFkW0&Y0E-F?D)=IvO^|SZX+WfZd@z%hIjF3<`pNKX z`auzhk_CI*;DlrA@_^?aE_;tpKn@~*&^x_%+ir(ARcg{;*!r{l&HltB^boPJn*~r? zyzcAk^4VUkT#iZ6K9L+q@#dpSb|5osl~{%i4QI}+>0q`-{K87x-3?H7Qy{m0ZEYe^VWJu;A}10fC-R8ZD>1uV?Vdp_ zCOd$$Hyd09F*6%14F;@|da1ju>Yh(>%c=2&Ra^qOIHG?*qB;kufjA%vMhy&2W7@a3 z^mLxtvB^!lHQ;{MD6m@q#;`qnqVb*^^%` zN}V1UM=>=tOmZ)m(P#eB85rs2RbU0PU1^RG)4iOdSJdW6c4PjQB6-?8?8$YuIV(1R zF4}tC&%~AyEpqz#eqpaFu+?E_Z{yM%jw~H?@1LBc9HLTOV)+zxj+XO9Rh^8U?u0d) zl77Glw6rWv>26jC&PWGEdFD~2!;wHcH%(ME?Yj=z z?kmYrv|}HE#EeUmrgBRo&Ap;4+y>Wxf!Yx6o;Oce*)#c7L>~^g1?W`I?-ABn&904P zgYi`ID=RAwE^w;hm(*EO%^tYzOwm#`yGKD-2=~ovVseb?QQb;c^C8!zLgvq^H=4@@ z$qCC#8x_lS!A49<^WZ~P_igfCFYYbe!)A&hfez9e8(qDHnPOX8_;$j%x&Fkpw`*cH zIAn~GaMfNkKrAs-rAy99^Vh_sK}fH-ji3x|JUgRvK86p>zjUjXC24VGDJH5Dmaq*u zWosG8_b~i))V&QzQg%!sRcvZjs%D>w3`1hD@#>lyZaK1lv)=S39@ZpCs!>}TiD3n2 z$1LcLl`66MVIHeO(bbwh{?Igs-X+iPPaDa41E{mQr^RIfVrcXXxf5@nuh1IRXR759 z`PO#@hPUKxpUmgrxGnO6w6ZiObA1e&i(KT5z_*QB;@iMLF8Ot*Er# zK=DRnwI@I6?Xi1_y?6@$zPGW)RRy!jO}j1^X_qokiI$Yp`%{b_OR4A9!w-A$IZxXA zgrh-~9T4Q(1n^<^AzO)A9knsHUVqJ4AM^kvOaNGa7ME;g?fdeqrR?Ee9_s^-)m@lZ z=5$+WFis0|t&LdKNKo5bZQ7FXj!n|BWGihb=NEvr_8l}$0~sQ{WgtCzt+~VSV7%Ku zG#GcXtoa?4*p~T6?f#L)^;^S458Ut_VEVfoHMsld*i75*t|yL-Bk zDLcr6zfE;5u6X`JH+ZKU9Al^R+RE9B-Ef`&=a*Mo3BtE%&#q24n4i-1jw3wV?@ikX zup4j4#|X&j7ITL?c$Y5eH$i3OcRrWz%n$Om^+`J!8JbNR>iR@R1s>K-^JJA7MK(pp z97+S?Z4T80EqYWkFU&P4ZKi=oV-J>^%uiWtScI7iJLXA6?I^p=_Mvoc+X3jcwTV=L1(dUxPy3r2 z->Zc+4+7HN&%aU`$j54qxJ1VQiuR9uTygTkYN42}wN+6ib$5|dd??L+5MD)m7$pI8 z*5zK_f@Rv@B=_*bZz^h&>CaEk58ULsy77_}^Bytr&hmr!ip<3%U`S5K+gM!UoQJEW zsDD7f8e={$>2)0*b^)LnJAa$HYwj~OCz(5CWi|9p4n49>C8Eiow#8qCJq@hfMA<1! zdca}A%oXTq)0=N&8XL2yw&hK9C@jUTtD_zDX~R9wnww&thTyRBkl$@A#CEoz5vo##xRWFBP=KJ1yV z*|{2%9LgFn$A#ClAl|UkL{piJ8cavWj4gyXjqQ)u=SP(FZ)$9=%A5SEwrspb9DbsS zOH3SO9dgX`Meq0OX{~hir?1UtnFmzu1;LFpJyNK2=;@-7n-ebicDZABBkTk-;yNLe zVJ%ZcLl-?uJ}G{R(pIFXa%}y)3mfU};Y0$tv&V<;FS3>82jb8L98M;Hu90y$1hnV7 z9;OZmX@k9$;Qb=1_x9Q)sj+Uu%j=_ds97|vpvoaS3Xk+(Uel<@zeSWKkZ@(fz@)OA zob8s@){>-BI-;yf(&WaGDQRg(CX=Ki_f-FAZzf|L4#PD|5xf%$jBQv1P5JfxoY2@f zwKE6ay*H7W6%)LNIb=uH=mj=aR+^m>e)?2jCnYy%s+S_$-R>F^1111Gw-rOBVrUHb zA>F8dj#cl=5*(gLy3QC-RYHaK-A@;!y_nQ6jfQJ!_qDY}CHAMk6ZA9I!eyqLKY|Z! z+2=k`wJXZM&_MzHyh_Ky7y*dn%4%0k-Ch>Ing2&mS;)O>Q-?d{DXH9T@AhWbbjc^M z#SVTpVlXGR67wd=ORmMBf0vk>#t31>>`$9%ZQu#&NFYLTUMQtRG+!h zA94JYaWD%>o*l@GI@1pJ)>4xJTByeBa+@}o-ga|Vg2?FgYs5#^gtaX$EeTxbstd;1 zYzGYN*493pgX`Bt{h-VYKBMgI7NeZ=s18sXTWR&(+F`~%KEbA+Fn%SlQfv<}3h-^x zO6NUDvXguk8{hQ)_KH$7JC>yaO{YShABc%T4Q%BDvc!Mo*&w;>aQ1bfh6cHQ)Of&4 zv7lYT7S*NErhI>%nc}<)Y8YmaZyA?t3hHSnZ_AAvN`dSMr|r`>J?Gi`?m75L$?xvq zsuQov5X`(PZT+E;J$7(5(pKNI;jr<3FHY;b@v;A?{4*x!_K|;WmeiB(1$7=B-Ey35 zQ4OUKH_2sOR9WrQU#PfuZwVwvy0^A3*gEG5sX$k!j&vbUPgx$cr>t2cd*q^GY|wnO zq8)FZ2P@L)o(Fd=s!k@HBG6nL(&f~F@u}1^QfJ0_Sn*^|gBKez7Lx3qTCorqq&DC5 zkMKns^^cHSi&{#x-2_^t%x!1Z0V7zd+^Xw8wCjn)cwmc+TzK{LQMz6^H4vfus*w*m zfwuPZs406yZ-fI^u!OvLLc76u&`vy2YCc|Cba&>!jp)>T^K^ut_;`+jdv zfgs=l*o-kf8iB*5{H&mkxAAb&t?k1H4Grx+8eG@CN2!~BuHN!Ax{B8J_Cjr}3`gA8 zI=PfeTrewnGP_q3;k(Z$sHCqiChi0$HU_^B2PJg$M}X)Z#Mk1~_R`G{INNyCZgb~V zv^NNJhTK3iE5RP6Oc15}f(62E^v1+Z$oMJ-_)Yob=UYNO0BV|7(|UL+RA)*0^pJU@%`RWZL7I{h$Eb# z&m79B7GOkyqm`g-Gvnzm>7*3I_BxbLNHu_K)CAZ%%&nrUWcw$ zjP;%$>6n5wCOJ~IRl@N_H-dWCBZuHdAC@yc$hXSRWIaKQtKE)fl)$#aSE{UdQj1Gq z2rshwVpvJu17)^hozHBgg{i#(3H&M&%UedCjhOgQp@twir5^NcE8E@1#>U0f)u0cB zZTL*FhQqf7!d0*72DuH&12o~gdS&?)n_Omt&p9_9B|c5ox4P11IYs|FD7@!xpqIM(_WV=$l z1oM%PE<(AsO?>(kU%DiO^Bs}$izU$4d#rfxMP(oGF~DK=c{iiKpCuCkmh{}f#?u3m zY^LLs4xY8PuFlHcUdYT3O{n&B;t?Mn7f!6HY1`Q>cUm9g70j1Z_5rxHeR+AT7hYFa zJ1gT>&p_LoJuc-vlIcnIVqTbnEIV2|TFKnpErXFI2BhjY!QZzslq`tY8TmYSu-S|Q ztl}eIkfDaACSq?QP?QmwiQ_@5J?YL%sTaB!#4Uae7>)tVJ_bAml$4ZgKy;P`Ojzp6 zi6`M$f4r@1Zf+hO7pJtfjLa;PkZ>w{Qx8JkP?YifWW~`Y?>(KJ8A3j?RJ?@iE6u&x zG1e%CCMKXhBxc1-I;CZRVtl5E>{EXD9F>x#2i?rO?-v$qkAxa{zX^ItLe?NtD5q=1B+LI2#)MozzHB} zMIzPQpEyfFNtxq;UvqX=l(Bdd&w2^)b(d9^U5vlZ1*iHj;+T6uWlXIwP)9XBYQ3y~ z5sM8VDcdAcad9Vg5uq~gr?an9g?g;dT6^WuwavLoSqO_?(@|7p##aUO_1$~CMdelF zzp57*TCCilC#cnFEA?am{GJwYCsqqd#e@745e8(?^VGtLonFPfnTe~+aI_TWkt#XF zt5W&RRB^!%Drqe_m9l*x*+Q2->^%(DY;a@4=)(#T^#KS`6mzTC0`}6ou+C}^$nq^G z{}B-LmZ=#6urDTRgCuBZp1y!Hd2knCN+jA`-t5nOR*1xCv?|n|nPba|$H+>HUqWwc zps%Vos(im`+{h4uI82^3N6MNe{liys%fjCMGW3w>)*iFsW9jDyr}MM%srNOrA>X=X9<4nH|FT9==-wsr%y6hbN4O6!wvYvl?pJNrhoYL0_o z7sP!DS9LJ2!foOy(73*F&cT%+uX2&U6Fa)!`(biq#01=WH{-h-Gc*qZu^T_5H|&?^R&0lru{1@kCdY^$hz)kr8aIRXWSs zPs;MzHEB?{dUyYicY#q~1@5YD7e6hk&4HcA9Ytq{k>hQ$wF3+fbqv`1xck<-U8Tt0 z)W5mJTjW$Gvl)+IqFaoTnD!NGN2o+TQ0FojsIeuF<;xR;W7+7Dw4&!stm<5@u8$YYPNV8gRH!Z}PhQKyz{s1p^`3O)Wu_>`hRPCq+Nw7{g`Es# zh!Yt)I5?m>K_3NAqWaMx-zne4+q;p@Cn$)mwyyR?(aOxBsF+T@wUw2K{QjQfkqsYA zW+Dq&4+JJ#0X0QB+}=u(Y7XGwDR3Q#%OQ8>rj7PyE)&rp28f9SfxA$?`|xCDI`_^w zWKSiKg^F30Tn+Izt{ypBVni8}N?N(xeq}ljGXw!CQ*QE!2LSPmi84omx zq#H+cN`uHZfbR)=HplVq@TnPI$4vm5f}2BuGli);u7k zdhX>KpnMg2&~^%zsFA2@B1`EcDSqjdH)(UcKFIsyRyc{VB&{OzEA@I;&UIDt#)+VeTW?ZgPuR_`tc)n<2Kod& zdI-pJ<>j%NNmrAwT#b#5CfV=ALyS-5XWENcW!0Rse@XsS9zkzBv2+T;E2YVooXjoV zBtDT8b>7Yzeq1PQ{l0#_{Ir{t_wg7)bypimFLrbClb0mp^!X0K0hA>C^G_e_Q1E5 zEar*^T4VRU{%>u-|L14WyJL)M*fPL3MRH%da%D*9`lVDOz^7Ur)%UCQfuHzN=DNNf zP+*Qjtll6swIXQmEYN_!ptKqE_ko3tbFN0kU*dnh2?pDR*opmdZsr91VoI0x>N)hK zS>Dt*{K!H`Twb+UajA_5VzJ9|CCK_!t0#i5*RJ!jc(A(N9EO+%wVh(Bt;4bK@ zZ8Jh09#=@6?BA{mMT~8uoTOvm)f2990Vh5sR%2b{P2RykfZ$Xc)Ay(Mz3wZ5Yb`9s zVD;j}1oHjFvV2V+s~&tu`NW!%RRFFWn~HzcdLcNQej=oUrbeh+$|f5c#=)mw>oMpH zOtH5avy~~iNo^;xf!slpFXwWMtr=ujK;-O-Uq z?lY?kdbl>1!|BYW@`$9jXBeV#N^+-2qPVu9As5bkmQ-U-UiR~(q&M{;M6=!Iv`{$n zzO7+$DHO`2y#~-Gd0Ttm5RfLEm5jlX zHxZT@vy#b%FE&Ct@s^!-g{~cF~KWb zIQr4KT4T-`>~h9#f5{E+$@B0P+Fx`1_w1YBUF~=S#Ggmorg!mK*#?n_6YZx?FG=ma zaO8;IrDGqx3D*;N&{*7LK1EA87ZS z3z>=X-IgFT)bP~oRKz+?)Q~?GF_8-~4r9aKo>U*Vq12FaJ>Q<_@2|7p9@H;+RAMjO zdLrw7S9(THeCHEDA5FflCSfBzCnvEjALwD|iK!UZIp?Z?bQAd@SWY|B5(knIE@66$ z%b9Z~gyZG{)4#-=>EJCa#$ily!Qpb0BF^tSSA1uG{vVfc>Z}{q9WA%D%@zu^P=KCr zQy|618Y!JJnT#D88goa_YE3Ry^^u;Yc8hTe|<*OdD{#Z8ca8lTS5!nMXU+PQNX){`=cQa7*!d)VY z%#3B4SQ%U_*oY;W;xkVPc~~>Hw|z>iFsBwnY61XHQJL$eo>!R$;N4Us(-9LBv*!-V z-ZXKOQT8u}&+4qiEaOVrGDf?sh`C)AovxYYWAEzobK`TBUGO=m zkSf1GFg7&t@Iy$#vfEw>o@tBw9cOMn)2{vKQ(0Nb)1O?o66PpEyxax4SmbgW%%P9i z9Fx6s*Fo(1>BV{DhY{@l%70Btiy>1aqkFwS$s%%c)IoN_eh zv$uf~U%0ROU}g<{OZi@lqZ&pPAXs&DtUpvCF+F1Dm#;Qxj(3psqE;QLeBry$c}!p6 z(cNddi2`xhGAQR@ciZ-IjU~pvc(l7aj5;x>8C+ydgPsxubwAd3mXMMRKSv!Tjqmbz z?`AB2`y5?e1@^RHZocg9YT*x?@=smW4Ky?lV`Sml%4M^pmF2@p9?JqAm0){`+~5UM zpy)6b%$_*NbH3=Y_F|!~fCt^0O}eVv4BlZ=wnV|(fkbCy(1kKOJ z(3^YpMM_NF6fpV;*QEGM9Iu}L+QE708P;F|hk zPJpC=H%7*NJ2ygmvKK~bBzO8X>7f+MvUxXWY+F99-0}HLlz*vKm+`YZsWK`bQzKKc z)}v(*G?OC4^wf8FgNC&T#FpR@@tn;5{BA5&GfLp8lcBMSS=Jx^w;*@n0QSxc@4V{|+j1blgxKbev z6&WQUn>dYz3b_6O8YLJ0j56bpM`gOS2OJ}6>H~?_gJGpy2s(<@d08}uyGb%;3`UjsA?Wr2{mo@QXl!NW-116-=o(8;4|HaD>}UW``OyJC zGZLJ(BbF~FK#wXC!`3>8%Gi{qiOx+WYRGcVGDfMfZ*r@$HG$ltg>@$M#0)YXgeVxL z3G`+TW~0!X^2c8psuWOqE0uh<9*i}}hvKu3z6bB1mx{s}I+-;#-FI(!85(jw86L7u zES)a)UtXB&4(1<&;>Ms5Q?2)V70^)r?v_sLZY+jGs>R@C{rW!p_}Gr;)ReIRDcLva zr-X|8+ma1)-8T(_2aS%WV8^H%ncqzZ5UDHvl^h~eN-j`lwA#kwLJ)@A@Pp0e8)1v= zs~n|xD_SY7Cc<+ZPu)<`hc8c8R_IWO^nhPji+#=8AGrO9d|vRgf0hKD~31!y3t-UqH{jxNvXEY^tdzszG5 zI{3>+o%wBWME1+u!k!y#+G5Z(Z}hguVge*;01m+T>@{G#JV)l+)d#=a^M3WFuwFZ% zKs`!$l(e(uTUXXxTiYD7XsHL{xNq5gw{zq+HxFoT5!Z6l3y_E(dt^#28nxswbd~r9 z3{_9gvvQljr+B}rg!rw`IE$nDa)=T!Av?><1J>;1Ej-_1RSjvd?=?y}1#fA4-=j>i z2cMRdTy_cs!q!OOp{S{=i#85LE*;IfIhs<*RQj~?8ns`)*4OJAd;`pMp$z#)g`>V}&`~8G}mnW`( z<>KeuPNeel{LvndHsiRoV9j$0aPcnof*#6whfN2v#TXd5(7C&{`Oo8A!vA28WGocw#DH#AIC2l%hYQTK6bYTCCtS*bt>ti$A+V zvt!$}-L&*n#o6Feej68aGIp@FBPSlt@eA;qRUUQt8nEsdit_|-S1mDe@EhMf+#QLN zT%F%JN3XK$68%;s28IH}tc@z;<4ia?)mA<77}0Sq?lAy@vB=eZ91s^=P6jVjHCL70 zt2-Q^)=7-dH926Rv7GG+32z?lO^q8-`r84)U-86H&feulUkjZd!s7JpZdz=Q9lJ7o zq}UPi_rsOH?(SbG3t)HG{Npiykni}% zWB#b)>>rc-$0WZe)cV05^B*tyPh9y=T=}=sfPYe*9~4a=`zO`;TL$<)WAJ}W@&}q^ zPNSdoGoT<8X(L<#aE~a8dM#&CPW=$6nV~zox&3eQkm#Qx$1hdz0FytJs%R(E?+Fb4 z3ah^A0rGbAm%J@AhmH-g_S)FwNXsczGY+~w{V`Vu%3Abadu(3*6xl4=)7y)nad>?G zAy+(7I%cbl{L6!{;*=l!iPWA_B8!SOy>`X;~oSE=T^j84!T zC~u+tA7Or6oriZ<@bSQz#{K`(L;Ss;M56BjfO&75`_vy+dR#s5vtPs>{NqD^y1oZ7 zEo02EZVU!JBd%!w$p7-QXB@<@krbtRa8odTWF#azoEjz}DTN*xvCLKrP}*iN?EU=C zkBp22WY1H=w~G6nrv|&-0X%wJd;8rmnw1^lOY->G7=%i;jf2ypfzj^}HQJI%r4(9S zP42|+uM5_ zC|+~DrR>h2{_XT}H636;RdYJxs55P0x*Wo+u~wjQm!o6 z&xEjS^%i7TikluN6|ps@HG@QAhvN2G5d#rjiazCbNa^7wB(hxUs6NDb%fV2;9OS62 zw-C5HCLkdxp@8fM=7D^;{G6WWEA9?ME_F4_iVJ@i@3=-Ouqz9As1e^@^s4d!PfT}P zD6bT{3mH)wYs;_fcV+uv$W*KeI#agXv4Ut`KzQB(xmr?I@_DsIt3*iSSj^FJ$?P!f zA~`w{>CbKsVlbnJED4Z;T&3LWY+yipDK5ym$xpt_x>3+8J6Jq7V&TR*Z4qqGu4dv;f~FTh(luN+5z7a<2=}8~K66qawogWRFHBQha2`gH$+BMAZcDCA z9+pzbv=)H!)73@8MisgG7xL|LJ!b>9Yh)`C4Fdf|UyXHjb@d$~Gi~HBVFY!#9Q|OW zD`eukP_(ijFk1xwn zifWsQV$6zM%F7{(#E>RlsAYd?Lg_MPFl1Imb3wj%2=ir8k!Z|u<9&hiRFP=nBei$J z&xr9y(g)PsR5%}?QXi0L9$6d1(oH6Uf6bJ<_I;N3U5|F zC(`I~HsO23I@QicHdA&+SZD7H{`S|tPE2lb<0@p;fv))C!zpo;5yej`q~P*ZX!aFJ?o5&%g@gj z@vG7+aIpCMegi1?lTOSrv-4=)|K@!nqV|hr`z{W;XGd)4158dREijnbp}8HUbVd54 zuyAW-Q`4{g^leR+^NvWWxmi{PR+S_LkdB0@c`vwB*STF}b9nHY{QbQeNjL_ac7zwv z3U_wzDu{Vt5RZ58^{qO@0ier251PrVWS^4<~=;-Q(0{9y_P4bE1p`qsqO!w$R z3zWfGGxxzmoo0LouYSJy8fpxQR%D{DI>R~A?Eu_2TA;gh>(V$tPuxWOBo z4UMWWRos12M2}Hxq3^w)-(c~XRtA?E8eP>!eM5Rki}acr0fpc{O0(T;DzUwT6G;y3 z-hTe_zM(zAowZ?RYqh?dIRZJOPRhva=_n2M-Q05NSI!AAD4b5Wa4WrU8{+-jrCHgF zz#vW_DWqnz#%UibJTP~Z{$P0%asL*{t!A-? zCh*J3Nwu?T&48o=*EqS*cfg1^(Ov28UWQjdRCUhuP7DeHVIMuGuzAcM*{`-va%E+a zT_bQ-y5WkUAq|@A$7FqRI zHhetk7VOrwb<@x;P;KLL(XL$*b|#M8>3;jiS$|WDsf8LoX?1mOq)NDmqz!!H>6KL8 z)T)(A0s5)oIw_8W2Z>pPFv(n{2sx;b`aswwj1BkM2+0PMjhWl)e3cay$EtjNE8(_R z<4R8n3dZ$@3sac*yjb4c9ajj1Q+?I6xLDkKer;xJ5lO#i-K?=I&+UTkP3nDKu1-r) z@_TSDf>vke{#J}k4Vz`nnn`P?+vflqNe_vw?gCpt>0w zVlur9NvARBrEdLuHm9><$D|H!Cbp58Usb(Vzp^mQ-A87&s#G(`qp#D^UTUEP@(>A>jQg%etsMdgIMR?DI^R+Nnj;SEhQL{97%DtmPCZB=pep-Vux(1sdxDk&*z%hxk^co=aO zvAJZ@o3s(lwO1s|n>A|+Fz5*IN?Jp|Y;^zPUenftcr(}sSlz$x@rQhQw#I1pJ!$?@QH0ZcQoj z5yL@Q^mmbvjg5`M!gk!wW=egoXPU33Y18}Pc^yC%ApONbqsUZWvUU62_R=8MM%|PT zM{sICLS4n@=rY`l4N5O@Ec`a=Vy)!g%+4=E13ED;d*&hzH-O? z`J3#uwc8RirJE+&b_z0ERjHwj6m!CJH@w&9MDThmBq?kQd=k0C{-VSfRHa~5$s}NN zoTy4Yp0+Y4xZqjh+ASNLv#2PVMgGG)H~1WY?vc-DOpqWTdA%rw&G;_4)FU@SUH?oVRURi#7Kb#=PVs9!@u zL+opuFNerJ?H#TZcu*K@#{U*z%G?eKJvYjI2l7sM-%*;|X;T+_p9M3WlUTH#RCC{r z)4-tBRC`iXFM*JD7K(sKmY@?jv%B>PaW!93I1fqa5TL6!wGX~utLZ437kMJ1QY$5< zAR}EV<-o-QZtrRPvRIk@@VO$kDP>P=v_*G%D?or2vsZ*KxU6kvCTKpbfVhydD4k;T zYJ#2XBoT8||AsRMr_84$qa-%~5tk5%wR4&JmCKTFSg0F|ZPNp_%ymA#;f(e0BRs}B zToy4GH}Fvx`?}WMCMv7d>u=ujP9yY!gCsIy**!a)Xbt3}^1Z1*6n{$awCf+Id0dJf zcZ`w<@ifUMA;WC7%!d$)Q|t zv%aE1qLE+?*ETg%SUE;TtlLOB1HKh1*d>?$f3<7H}l8`bk-dwLv&- z%De#g*>okbY|OXD4oEb6o@#Y&HPd`Nk5DlocO3oRO-cDL8~%Fb(oP#BPv7aqG!nU9 zoSu;pj~R=PIl7!^0?HoFBNd;zDX=kd*e+X{VPM_SylGi>f0+oyZUUJsm}u);+Wc4? z&FYg9$x>&3?hwW(Tkc67>DoYy!0KcIWU{=IEX$!x?3azsN8#a@T}x*@F`wu069Cc> zv6Ul)7z#TWh%H9>NyC)ERH~hGi?bxMN}$rq&kiz+5bCJMg`o61SEpt;_dV(+&JGOZ zq~GjnV7dtcd}r@OiK(J{RB+8Sd9>C1{i|;+87g9%#t&1S zxXpf^IWCYjFQb`v9F`p_AS@h3Z+uV>3JfoB(?o=?jB}=2Lsv#(#N8@$apo592OF&g zzAI88iUI|ct6kwGbzNnTJosp z4SNVI;c#dil;%P>u3V%Dq;qmcPwEKaQnn%V6p^20q@_=5vYW~1$<~9i*ZR0~KwgEm zEv~4Ol1_JlOse@%V)Y-#{c{h?W-Eo9KPogNgi{NaA#%0?VUMW85uT@oT7Q_L1c7{s zxI?c43*yTSQLZ|N5cCA+EMNaILG$K1d%=FtiQt{76p;v-SEOwQm^$2vc+rM<)u!lEZ2AQ@AHL%sI|3R5|0C1dt&c`rPM~Y1qc! zlun64g**-JolVJ7ESMS(l#-*o%x{|L`KrZ)fmf6H^`4n?Y&(dv#Cm*Im<-CSl^2>$ z;SsE@p<>WHyTnjOk__q% zCN9B6)cSH6)1t_oR!Gqj?m@eYN}as-3o6`B?D-ls%@#V(iDS0evDDb>LhR|XGlq-V z{&t}>KD$sA+bxtYW=!nN$Cqys?cNRRNg*@OW`D8hbTj{2Fvj6)H(*3)+$9pclSLnM z+Yl(d*hAQX5fUP;qfUpmSud#8SHGHk(S#Es@4ug!Jgw>9oX6aXx%0SSbEKz7i<*15 zcfiQaB-E#fXI}?dk0n|7qQg_Ywy*kkUZ23tCoKi|y$C(UNbuuoeJ2)?s;rqvcit{hW?XZ&fZI z(`}v@Ozll%@bk9nl$=x1}wa(w85x3;(#q%z&; zc^RaPlZ(q~b*eo;?tH66DGaNwh)hpP#qc{DF3vM1%)8(GaT=&MSUBzknO=FM5OvnK zZg#3W%S*RS3Rt2hVQ9rYQeM|j+9TZsNmnX%d`&es=xOo=E zuF<j4-ENoD$YvN7hr{K%RP(vCPe?Y-e^^y|-yzW5=``_PcU2=m0!yCghoK*^RcxIzCeTnju$k znz=+F#9}hQMm_rJMbpH!mHCyholn=fy(N$bc@Ra?14c$Eao~YKM`a;9L`d@?+Q393 zE!5b-6ZZsXq2raSc!z4>#@9W|4-X%&x7}z;b zmm{)s?lE`hZwUnxcA@aS=eyvWrB`k(s>#1^h1;#D2S7Jmo*4xQs@jdxnOL;^&P49Y zkj1FWrc1L~r~{))o~j$@KEwM^z1%9a5Sr<$tMg*e2dVEoH^+j^4+K8CLYs+YBF5_# z?rSS?~Eh>Y&KNLtiaNNx<&2{DFqPZcnj?4`l7-W@fC7tJBWplrgI((Y8 z=+z{Em(l1;J<0HmaByJQKlHAQb*q-Y1r1@CJ-fLL6D5l9kkY$;>ay066T8`)V)QJ| zWOrPTn^+hqggetpLo%2)-s$^5)2FbnZ{~nyJ)HVI6oq&g0JT|M2IP*r(^GrDu#(tZ z!0_M2MpvUIa;^eAyli*wr7bFQ={X$^pEH0R_BYjn$%e0}yRsGEzju%nKJQFW;_cD{ zZL})_{OH?8+-pJSXg9QP0H4TlZFU_Gk?Ho9%MpLt_taJ9M!$;K&Az;c5bO%)(zKG3 zj6_v^#lQ`HvAb1N7o4=9Qnlt$!EBdV{IAD zT-`<)y(v;(nHrfg!$jO6u?w3=k;16{ZFsJm4a`5c0ZH)9o88DEd#G!?Jey7qCr3lp zB}iL!4yvLC{2p&bxaI_EG`8Vnw;hQx2`4S5d}VX(#Dz>Rgue#1dBd|Ql+6m7j4qcy zp2IB)MO%?1<;bIBL!D1<%^EJG#eUbgO3>1N4JPlq#PJh%cC`xueYf1bi=d$TluF1< zN{S2a_m&_IIe_Pk%qMjzGPL!=<&=d(63(w5o)td2+mCoJtM&1vW_gJOI^@|+u_+_n z=sQ3a|6%MVP+~%$?q2;pPHuo@4K4882zu}uc}UmK(GQq%6Ti9k8ox+i;j~@Cwd;)6 zLAS?xTC}(|JI-I@zCS!P=F&U{33d|kknu61X5oHD>7Z01*nRVJ?LW0)VLpe`%B*VT4jkfj|7 zdF5Sd4om|^S@l;@I_Il;38SO+WTvz7b>S|(VvJxhZP3|GgGXaHcp#I%J=_G3pkUrIat`PH6n>L#{6RUlrlM6M#la-TxYe+|Pb_aBA(( zzi%nvE_~6x#JpDGXz}jt0pZqG(4$jKKhcgrFHaAJ-h{)3%ynlZ#0}6fxvg_{L}umg zow~fAWl9ZNZrM}YjQ~Mm^&B13TD`Be+f~FD= z{Rr(gq#~D_;AfXIFX}-Hu8C!-?mfZtN4lLw``qnkx;`!O@$sM~i#V$~C&8c^vora! zQQ}>o&lb2AZS!X;gKPY5Zf+P-gO7xKd1#`{>Gq#*?)(uG#RstacCq1u<-ZH@unS>8 zM~H)Qu1dtbe_D3RZqAV3n208}#S(SbLaQQ3q4z^4 z%Lt-E8dc8Uwd(2;t8L7b89@#izi+kr3abOPGAE7pBrUIAv*I{W>y;PKbOhwI#k;e; zlQ0aY*LyGPK<+@=-Ux?N28y`voPX%(a%DtyMAo$81b9#ME_mkza$ zUw1nvk^@hzB*Ydb_4K0 z=8~E#7e09L6vhQ0vRt$RW^dI(LK*@Q%ZS880rhn0mlLW)x8@?$=;(Ovo>T^|cmt8x z0A3L{Z0q1gPyJCR*@h{aSMuG=sSoxQ+ifW^M|r23sbuuLITlsv5JPm-QH@|WB6(`S zf+X0v^EJ;(UAo1UcRt$M*e2|rZB1L_q%5-Ka>2|D=bqAXMb+ZQI>m*}VRNFlnY`k^ zbx;1&MXsP7SYa>rHfsvW{#lVhUfm0lD7tx*JGK3cw)Um9&EKGLuXpu%x|iI6%BVtR z%opFs&ofkb_qxC+X)FEEG{0gN-7_Ndtj0Pm)qh-L zWeEC*JML19fd448FKjE>zX5|O6}fLxUTdw%#4h`L#Mn?|YUuI5u|8 zxA;nT^PXfGPi~Xi`z0m6mMNaLqm=Ll@&&$?7Ltd4z`1GZN`y>I)QA&F^ZgyX?+_ClptG zD+EXCO5VMiL}3X_`@1z90_hvv(Y3Rq6*Q~>ja{7!vkn0vBB^F(Z=0)xBi4vQpOX!< zp99S&RSNVAa7^e;NHVa7($(Lj61+8Wx?k#UOuRJ&3eFGEvV zYzZiEmB;D!``=4DwT6jl&;ijdepuL)O=6H)zIzB@(5dEjd87B!Vv< zEl!q}&5DH5^BZ$_&P5CjM-6p9(2q9NSST#|(ldT{ey&hI$CPYKvwnL)bq5R6HVz`8!lXAnw zauggqJT6a!Fvf#+`n~{R;?{50jS<2EBqA4>*(#FSPk-{d(^;UkIWG%KUQFnihZL4f zhj{7gALT!lxQ~JME!P|&TShwp4ZpR}yGZWZ#BCc&j&(l?h{Pk%N9Ek=8yZdm0SEvS z$U`cR*atnXfPZl~_+4wibx3Ul`8bT()ct1&wsbmjrL0UzN&0x2lucp+M63xsf7`FR zuB~&yb-<1GOkjZ?7w=ac=xF-3^iZ(7r_<^=FFtyh|1lLRJr|<8?)2idgYMIZ3uXtn z-`hLDj0I?#Bcme@_D#R@EGxe+_NLC70sxjA)!rAO=&H&}P`sWV(D_TlyCQdPX%egC zH?JQ=*^8kcvqsFgjSDN#c;u$Ot+Q9#w()$R zD;by}J#CNyzv}56P-qeC+EMw$j0`wulY|^D+-PS&#Z3P_%Gfs@A)n@*gh*@(!~Ev* zT9c!%89F=+pIcaPpY7@I=NX4@`kNLyh}abe-)nh4SSL%sXW>WTikXV!tpb$s@dRv> zfO6QCL76aP#=}b1B@PCXzmIuwOB-D4<8|+Az9(OB=)j(2fX@*q zEMjLfFBi0KPOwmT#IM4w*D*C@=go?+&adrnVl8m+I;iDhGMdY|#ifwWer2R>JJI;~ zlIM7)#~^90_qufIWU_9hS*dsZcWIX+)PO`$3OAAR=WHtJ*SXG{9qd>N#E4U__le$} zmUrq=C#V3ZuII*OF~_^ok#SeLF_#^mI0`>|wpIfd=~o*Y zW=#(nRpvm^E~QxU?YT2tDkC!Qy}z~ual>86F7bRO{goR5R$(+%oOAVSqQR>0no1T( z>i&J3c%Tv3>t7*`{wRP6>Va!6Q+aME*Mrq0kJ@0r0xSS!Xde#iSzg|($GVv246ocE zS&}XBQr0jWF4AOV^x|W&@;$$Y^5_s@hl~9nhalP?GpOdey1Ms$_1H)CjtbX>jvR^4 z3nx-Nt z`ij!=@npML_9ui=&;#&F{6tet8z9?JWou(2P+9%)SFdK^sKF>^;sR#U7u5YtKfwOD zP-82P06OjIbNpSe+gpE0AE4!9?FdmLyz1ejNw0idfnsp0^s7%VYO$L`mN>4ZEq%#P z!s-AJ17dC)Dtpq0P_tJA05466{5BkQ8UfUi%`l*UZy*ZI_L$2{%=H*Tjj%OvO7XhsTrY5S0 zTURJ(0=ITeTOqe2y>)tB-x|BsS=upQ??>?ggcZ@q=MLzjZArohVFh&su@T*lH)a-U zcAJ=v>yLt`ES{ZYPZAj3I?@f9TCMSf@Uy%76x+V5#$(UNhe_>Ac1 zW0=?WMtsus!cN|R(iXnBQ4CND26+*eu}EJHNdy=k3+DXg7lq06aM0-1tYU7XYy$#f z4WRVe>JY31rO-|5XIdwx@^*^Bd5Z`s+aNZ4s9n9Py849XPFp#^pO;S`3$)z|0nlz0 zvH4@ly=b+nbO16pXuugP{;d1)fspL?GJ|xlUZoU*$Q1i5+ zr+%9$%AP%g+)k8Ef0I%k!J41zx~UgfhH+Psl9XtJ(_hIZj2qmus*;v1%xmM?L~wynoHW@e(KQIxns5~pl4==cTnDU(hU?pH@6gr zU_Y-(e4cJ<`sl%HDFc2@eta1LQj{^Ao|zl}Ma|I5E0E*r8aQOS#>>&v@wZF3EYirx z*fvw#jJrX-V6dY>)?P-TRtoKN@mv)55o$c>G@Qo|Dtun*4wLct z*2DL8fMuZdHF%djq;n&a_8mlJeZ3jVW`1=bxs4_+TJn^o8}7ui91^J4pv$bT;GA`p z3h+7DNr41HC1=t=gtg86Sb!o=B=;k^Z$m_(Kjmr$e3(9_2xtrSW^C4O&dLTRyrpE4cm?pd9FFN3c^I~>i|CF2IsU? z;&#r|-)|lRA(^1zZk5&71{1gIH37JpL5|Yt7};ZYDKEOr%i6k-Ve%6p)SPALb#9ZP z4-vYYoSTZ3@rVh8>e7|ss3&PkLtY~m1xGFxsW^KDDn~jdIYn}rP`7KzOE{qTFS#5C})=+ z$}nOl2J|^SZfB6;ldbHl027m?td-k&4c3M^atlxlrbz zrL*2-BUtgVTZ>y?dpBik>Oy61niyr4K|EhMdnAvDZcK#KrzEA7tqbLyiucmku?|~| zCcP~$4`l4O`vWOowtVT!+)7SwtI*x(|E+q|1@&Dnv?xF^?WJ_=3Ph$Fy2)g+Sq{DZ zqXOV{22y|u@XpmDk|=QrB5}q^kn0C&x`7kB1zA9m56Dwdy|9?KnmF^wxEx(>Y0#8Y~s`rZk>tt*#8j{*GMFwi~F7@aap@d_tJ2dR+yQ)g0oAx>&@ zTc2o%lsyp9OuAZ#oIF)C zV*N3vv)`NMW+Jx8HKG~xUMb^Ey38(<6Hr}{5Bzmh!oX z2wFbX;I%}=#tQXCtxe<|PiPS8xY)5^iS_VjVTZ*_Oqc#(OhO*g-e5t6jL>Obr3bemy!_u;oB5_$hG&tO$`928>$uX^d zr-}Ao@AwbYXRN~L=Z|SMWWF0z!gBOgHq$17guQwOJL?^D+RneQH_x{?x(Se{lieeCfFjb`}=htdB_=#h3=KM>q0OBgq6<5@!*=Ml~|Fx_Y)(1qW*= zXKlpLZA!@xxy?F`0w`0+my$8QcEN9B*#m<2u{B~a%NXqT%1j^;VA8?> z3I?6C@#&3j-_=MJI$6(11~)D3IkSGbto?ITOTC#-1A^!ka>ygF=YX(_UkK`0a^ zjdcf-SOD)CJ92$+Q>a$T!|~|@*`tE|SWN>@X|l)L(h*xsHPuMH8?2z9AX8m2%=8X& zW>+#1NnAS=pnq4>tBKuP6XPs4WKr$+(<6Mj?75{6o(l>!rh-M(%Qi%3g@6>DSliMC_)Gs8;P-Xy&!(lc{US zpTtb1PlW@-g%?rH(y5_nvs!=XqN2!Rnl`r_2qfq_>q8E;(!@K9MNopF?%Hy?8R{P# zE`#yrLyvrXfNj$|288f@$x^}^M%YJ+^6LFdGjSwN$5RDwK{a{eGHc$88x+A zb$P5+$Ie3tH8fG|WLUP6AYtW1| z0FJafPl&uyNQCdtc`M$w4i)8%u_Zu}l~+UI8g<@)JsIeQ^I#witQOZN1H-*>0}<|Q z)l2x28Uvw6?29^P`0||q_we$Cm{d$!WsFc8zYt1UQL%2H<|v_vDP)^BrMhvYjQky| zG_aQ*Xo5_`11G~zA&kU+%`JMe#&$_wXb)XzlP>5dfCE3(BI!2GUikCqd60OxdM{Tg z!%#K>${C^-2ZO?#F3?9_25h8$@=oAf^_f*wDbl)!`uX zQU9^sukKX&5)6Hu8Nme2oYwVewWzDs5());sfwa;Cz2)NFT`F@DKynKpWiWpyQf(P z49i^Zs&+T#Jb8Idl*Dx_?Th>XUMhMrb(qRLMqxB%ZXLLEt|2s*e*i z2)?$W>oZ)Wt3U18e@yHDeo^{$k3oyzA@P)RPk!3_^O+|t$&z0`2^X36aU5hUSrN86 zZG3N-8p&i-xGOkNf|kk_C*y%nef#Kle&Gj16GU_`=r#ZAdaE~%+<2w-QvbaBYa|}Q z!ZdPS@%|ii&a={Gz+QT?brX; zK>zcf)jRCjtG|*Ck@|rz;$N52vI0z}c0cY1ZGnHg!N=&m`_spyL3aQ7^Zsvt5m~F% z#QN(+3pz&{!|gSh6kN%Ki^ciVHP#|-aO)TWO$}F@5Ui7IqAzWp?}r)EV@Ker_(7L> zgum@G{k;hxtxit7C6=ScPj20qyr8_e(tTef`J>Bu`+0p8HBEhw_m_XzyKR91?!N>!xn+T6v_d#hH`w!&yJ&YE=urU%_>OZ}$0j zU4Bc{@#h-pqdw+;?sGwi*7;u#oxMPGa8OW_bL@2)_)v3M{Dj`1yMmBDtX}+wS>Ec; zM~*#M`WZhu><@_9|>Ww${-Lop7P&UbjV|9)?X7l327d!8uu=f-N- zJ34t`f<2f3472iDLcjB5{;y?MQvzJ6V77YTkGu1KnfKQuUf@_v61t}H&9WXB>`i)p z|J?DqpmR>_1`Dy_sm?h0(+R4jaf?6V%>TA@1LmK&KecGtfx{a2$C&u^Sl=pndeWgVd6v$BGV z?}-Oc`tI=wF4Pgx=*uS)EKRu%|FB)~q@@(FN_Y)d-nZ~h?b%*I%aZTwI8?>Md-lqyKi^( z`Js3Hm-yz$HF(?L2}$cF`#kH+>O@UCAh4n{cgrv^?U!GE8LA=~a6edko^TnX{eyN+ zBtslH6IdIwp5Klct|YB|%c`QqDh2hr2YTY-gD!HHlWz@g4L#r33>f{Yg}gAuG}X9q zUB~1{dF8KXPkc4qysmUn?$EALew{mDS(>_g3N#>oqlfj@y53t{=)N!cf7pA^sHWGp zd(g%KgA!B_1PNfH30Npf6%bGX=^ZK3J5mFox2Q-F5Co)4FQIo50clb~4}=nm(nDxT zAR#dEoadc)&HQI(t$983ZN9Mbg%EzZ@2l){B8SsCq3fe)QyrC29wHmql?rHl? zP}D3%?cmP8b{Mv)9g_L(xeE_oJ^lT~P6`Y;)j0)7yRx&>Orwj9?<7BT*9bKui^RA69U28_{PUci1xAkzjP{2p95+C4s@d-dB%UA3n)E!vIkAd zcXqkjZ?@uY$PT(*;VI#zyl^`Z+L@;-!1R8?PORf%?#H**RoBj_GOVmz`6s{q`7r_a zQ}2my|6hq)e~00jj3*`I7pQ;Ni$A4maPW)oK~H*8=Fz@dvxM&}Ge@jH9(de|Gqf$Y zTyZu1@4)@1uVSmI`6YI5bwvE{%0+?32ylJpq~$4-$>r#$l+J7vCqb^rq|QIPVP#1v zw{gYw`2U!n{^U7;Y)_|8+pb zDig;Ly%OsU_O!Yb;m?SeZp);XJc5_s&3Gfy2J)%7VQ|gmE4ZaoErt(!jMH<(&G-Wd;w1^t3soc3d@v+xnpW%!u8$gIJ>BTYK)g?MPtkzt=v^zxkbz-*8%xpuZyq<2gWQJcTTKtYVCrsd-&#=U9?9Q7B$IWoP8- zTAwZ@nmzw<`oyqQr`X%ted4I`6_skZNsA#j9X_P_JKO#nKfqe&Tu#0c5^l)L{vD}6 zDj_!2)}30<7jFMzl!$+JM=;@?kyu(?$g$~0&sV|A(KFtd4S?*F2J3rSa{cRf;nokY zv9oPfe>MHr;`gZ#9;%g90+03AHJ;yjESw5jJh-g>y|mjx3a?{J#o7NYaO z-pub8jiX2^fd9Tqo>tQH0;en(>OsmrM?~@?>(;r7ar}TrCMsa7D8bvwKYTl$$3J5@ z;9rVi8BeLfG~>Hw!S6o#+ZEn8)jOND$(aaSX;-l{y|S^pDR22s-L^(b1$0IJMcy)` z=!E~TN$P(X!KC>-dUpm*J9@XepH68a((;y|HEGY^_~5H3VU(Q1^!>)i%#@4MuLuF zX?`{RX7ws}uhtseoj6YT^PF^^(Y#&czfb2sugsH!X_Kk5<*EJt95tknL8U>BQY)w& zyc6L;7@BLGx(Nu-z(oLT}c= z*jTSfM=ZLF~+$6p5W z1@one&pGHZKuUdnR_ida$4P>D+13aNWj=|)6>aI4jT20+4&w|&F4xY@38~zPIj%3B zaxzqN=1ne{a1s>+#jahdk70N0n{G-$1r}n^`K09DuXoGw$uBtO5YileJ;&Q8v-8W^ zC>v*Qm)>QTFW!b^8-aBE0-lrp`zK4d8UwO9EuCgOYkm)W#l5O&D}J`XV1p4>6S&_%xmjkl$I46Sc8-Uwy7Wgm zS&(T}Rg(=az>WI|lrHf&pQ}tr((Co&(6uUE*z_j>Z81@4$A{JQkn*VRMZik$BvlV6 z%6<(rxi_VGw6Jiy+GCFmX&*77Q(92a?FVVv>|7a)oTj#UgyHVYND4wnXnJatM_yxc z^57ZWMalPK9M}3 zF3Q$l?S5A-!QWn;r`}$Ht9^Claq(twV&x(ChNpzJSrFw@`l*E4=$2QS;9dwW9Y~wV zb4N)q<--+o_kzVLp~Uxq{mGifM#a4j;>3e#GbBRFie^bCt-$ z*TZ^DU#Sjr9OgM|9E7n#MNz~kp%!Ju)*aqF${7&8Yp4w|GBc|`JUZNU6b`4{ zDnC9j`A;+R2Oaz-GuJmO7;O;u-_VuK8Ho+&K)0DN6{+vvfi<>F=8MpcX=}$4m%P`V zV*9=#Y{P9oU+#6F6D3);!)DKOn5gH)bC2b&W#5q~#n_1n-k3&DguTIgk9mFz)Z;$Y z`?Q_v?u9Mt+7YI{l?8{4D**7|U3c!X#aVSf``XmH;!|PPG(zBQ`PeTw+nw!r>`+ep z@+-}~a^{I6iqlyl`s&cL@YZ^hBBN}LiujCCbP$D-dl!yM>|>5lziZs6qv`g-8-n1J z`q3O1I17@}f{Bmi7Zal6bp=FeKJxxt^LURd>a}VgDbi^eA*Q$cnWkvSpx9HFqLD=l zbN<%}l8r9B+m70?Ruc9B(!bJwq`6~;OmT?n2>Ia`RYc5mE(bP!8nef88@mzV&)2UH zl-|&N+xu>5iHb6te|+{c0}~7Q)9cesHUCTKwqRO2`%h2=hCETF#hQV)Oz7yr*iS5; z4RfVhW$2(2*opI_v8{!xz+w@3wzPC&}imL-Z>pS@V)~nPd z(kL;ig5cO&`-xXL7Tg>Ns2 z;lJ>J5aAnfFPv#ZtsbmtsO4$Z+KF5?bv+>~Iv~inI#0S*YPQnF?!-mED7$(_Zws!Z zeNTQQCOX={$9AyA^&NOKN{49RUvDi~GG14zRkWsANs1nd=+5!*T>QwmJ^z)Oq{oYq zZN=kEc3LP5u<2>;{XVM)V&&4g^*Wkwwd%coRnV6`~Hd6Y1Z7E9Sb{!HHXh#3ZU}`9V&N=PbC-VYS7QG9=tkku>zkn-PjtOs$R($$;Qj6 z6lg)#i^d)F`1Lmj>M`}Y<5WXs`|%%1v zNA|D7*{OLg`EHsT6j@-q{2L><3#t}wC53u6dBnPL7Ne|B{d_Eh!m=lcQk< zLMV$ARf#eEvWd+yADN2RMNUys0)%!CTfy{~Xfmg1jlT>hDRBhDS9|hv$I^TKdjm%% ztG4X;@XfmeHlx&y?)XU!W1-1)Qe>l{rDJpK9CXEM8Z&KK@G=@_uii=Cj{>&)%+zYS z8r2%rq9>A^$2Znjswl%Jdn`$+w|xAlmj>Ipf;3cDFNlt1z!f2J8v*T5pB0Slh zX`;tzTdH%{P;PHz;d1Zii~B@-H7|6ssW10FU&35-zBkIN1hq%6BKEMEv8$?7baMPt zHMOppntI4X3}?{-ujX)gYJO8$hxBYga5v82~EVjS&2L&8tzVFBvJx zYHdbFJOegQH)L{rS?d=T#G{3kux^bMCE$2t6*$oTHAQ2h<%5z zpv7+-!x8)TAd~~VV7BSNhKCag=r!v{+^yagZ6MRnL)tyXt8yh9EW5PRT@a|i$@E;{32n~YLsg$;<}~0Lw0q! zy4jvrVo`cExt5sdm>M((!%E*R!-GvAN5O=P82y;0gVvRrs}!F-7F-}}pmy%?+jJ?h zeCeF&jEPjI*a6M@UsNn zJwR;o0tSETR8XsKnE?E|Jfl2ZLvLQ`RU2J5lg@DV&_@%xKD)K2UYeO@e5{M_L+`nB zT#KN&g+sm)b=4%bGNRcBIi_s$s;Csxx(gs8q1oqs!~=K&jThW zc_$M|!v$iHxUSl@Ytv(p+cbjTy`EtdR2SFvZEeNQX@Cv7H93TcT<3r?+iss}B8pY{ z`(GPc+yUJg()t`+FI%!5<3dvfj_cokhB)(jOr{mr8D=82Z53!?=vBIgiyX(>@g3z| zvoFqgf97@)p$0<+?;bR)KcDfmY0buc5`_x@w0E*-gt=$ry+~l+xQP0tz4!HfVfUo$ zzANx9voQPTKDof@-*et*W! zBGB-(pz*q+^oNhM@1#yPN4a&Dc+aRx9a$=Hi;q@|w+qxf@`r=pzE8e5P;28jT{0VJ z#-k}1-&OtuO0b=)7p2Kj72vhflDn!{_Oa@WssEE4KsE1Gfr;s9>uzSZp%S+XoO@xR zGH5(Dh;V<84B?GQJ7i515KVg|#w7ooU}mN{sVe9EdDz6zP&0U7tP~FODr#KA?szTk zwWH$eZNYZt$S)4-fqepwfCB@1s@Jd8lMPYFgeF(bfL9|kgvwnn-EkwF9*074hl0^% z@n!dBHTX*kT!w&RGJW{icXkGIR<-46qWpqKgBE_r6ImZl&hFxQT%z)qoFZ`K{)n zijR*6qHjkNzrc7RSe#+bK+;i->v$rJM;kw;j9)M`1JN_GO=?y{>2R44=r{g3uXl!yZ!ov#%HG< z)?GztY9X9A!^zlyZhiV>tAnsSJ`CeOhEz&#&4u@+kZ3nVRJe4gD+X5*qbOI|O;Ev3rsi3M7?NL3Ap?92i$giUSEmnGHo$d0n z7Z>%3+^H7JRiN-NmF`F)b^foLbtT z69IC7E8R-WckkKey`Gx$B`R>No7GTdD^orQydRwt-KUwQprc?4H8)aznH@);p#gAz z?hKF|1vp;oae<~4X3A35*pqaFRVsBV3I@N_P<;*}lEB+?Q2AF)?)DKEtrW7}LEB3C z`fpuVisgT+c$)V-jZBS-$xH69w?8(l`NNSJb~Sl%AK!MFlO;jnm0wR?1}Z)m_|m1I z@8UH-xAKmb?Ff0Y9LuDaQ18&_zyYZ4DONwrLt+M3Uz0icxoAxz`;?jMp`#gjy@Wv0 zH+2!eFO|&1P}xxBq1smbknQvyJOD8`_@V1Av%D%Acj%$Ea3yFb zSr*M;+vq-PR7K#*(k_UhSsE9Okh9ww;I~>?{GESJN`eTP&>@!0lX`6_x+PZ(7)2eO z=RB6OPx6NN zM$kgBn%dwbQU}L*v=?-F-JaIzV8+03@6;8}SY|wqX946zV}0w_vc+u~J&@4-A{j{5 z_tN%<{-u#M8PlCB$#@`S!Vc9AF9$;*Dct2UX$<_zV*>g2P?2wMW0b^@k5l7HkCulGXZ(sT#1H{o1K zvzXRonDo&y1&D-V;>G9ukq#uuV#?O{-Zv_R&hHH5PwV+o{>-9}u{*aX~~!NE%}x z8$MQcqkC*tCSe+4e;{BI^o`s+x9cCDb0${G%0`#mNcIcv%?X5!kfir3l4*7IM1zt= z;A)h>?(zJu1PP#N&i`;4^54I9U1)o%Xto2k@Sj07$ndnR%O>=|W2z=y#><3uhWUDy z!qRz;IhW*81_Y2{KN5LUB1`JQgDkhG)@*vLBW3>h2RgEB)y+e5fkqSfLu07BXY%dV zM@{Jf?w;2wr_a0t-?$z}j04Cf&I)~U5WS8TS|u|_7<~7-*91eLBAE?_Mp4Z2_u}7u z7F^%nUw<#pyPLW0c zfRZNTb6eX-i8u-|?yRf`T-#G=ChRI2FRD|(xtaNyRrBC!vX{4aIAI0fT2ypRfREK& zjaaDTu&X2M6A`>Qc1U9imP}%vxQA%SffS{$cMoYG@ar0o7umoRRVCV4$0XgJwifwY zGahmaj5j;N0220*b$(1_tp4?Pzo&uLSR?y~Ehw#qUz=88)NkrLiH8r(TB#1W%u-Z}WtsJ&lhSX>NnR z#n9g0_w}e)YaAiP%9Ffn@KiazLIs58{CaXrWFXsb}HO6O^rC#d` zBDc$mbg>sTBbE+ihJ-Af?Z5cPfLq~nJa@X7k`k%{%OF4mAAh2aY1?hZ0iy1qGv5VU zpB>T4kNV%@CSH~4jhg5@ibdah<8&*W)4G<}kcmq87=e*JCuBD_x3TEFyr{ zdJeIuKSbLngH`v8AeQxk!aqpS+Zdh9+~$C3)K;MPnV=f!8>9{eg`+o!DCBdX<_<>G zEb7;b&iagd!v5-b4CIdo$=?=!({x=rc>b^sJ>Hpjm5c2i+Vyz7UjADc@x+Ycb5f%A z^5t~snd?&9^A+(Ms}-j?WKJm590Blt1{L!)lQLK^qimcAo}**(0#miGzZmZg!!)3? z8PIWvBo2D^Cx8pQge6*e&Zhcd+ioH7?3n6;mzk4q_Jg4pX|#@ngARhG6HTaApVATM zJSU5;bjzDR*IM8*^TT(h8~c%^Hy6W*vga56Itu_Fkb`iN3q!|)iuK@yY;nunn+rRn zt`h(VM3@8ze` zr|mberVsN^oePrM+fUhM2HI~wdGBD|w`)w(8iWqqLm|kGE^K`e zMbcZ#;ym0Ny|WEUCYRvO5dB zTeKY~S2m4+L9S=A>e{LKAyHDQOBCSX^rsSSZbmx|i))~v-!&$M@$G^I11M&}`M89W z(w}d;>?F5AqC!3lj{6YI@p=Xc9R&Uy152hlHykKiIQ!mX$`Q)Om{@ekPdQu&5>24%%lip z9_FOrgzMZEm{$!VOLgEmdNb)ED-+a9g>d5s285?!C-dx*MXaOMtA1A|{wK#wwCC zWoE1$SH2-%<}sN1`Kpd%f=i&j~vBvS~EKz33Af}DnxB{pDN4&xBpTshVh zA>nnZgRI}nw#R+ho!2O)exKFk+a59fDcK{WgGw!ZJQJz@&%pFy$Sm!!j}Nwj=wmh- zIBO@yDo#OZ17%3J2fDWPhF8+#Z0A)5^rW-oJ}_r z02f9wc+B@{G zUQJ>yji-aoTUPeS>CWyz=IT7P@AgqQT0H#3@WD;pC zLw8yy({}kP_TWB^*5)pJN$L79%Q6);uzAQL&luB7>|`0_E6jGZosky#c2;OGUD}z0 z?IEX6rhv>Ak7zdo;9jrIC}B*S$Jxs2-u_f~A8Z4+p*y5Bc)2KC-o36gd!7dPYa5BS z^m{tnQsN-a1bFj`n+r6!;J7x^_z(bIy9jEYCeJh$$Zz-c<9$o)DB$_$ifyvApOWUN zu%h?c?$>dv?O|n>j_YgMkC0Kw^y*|&FglVsCSk;A+U$rFE8F-wN~OfYU&_iZ3!%Pn zgI!PK+lywkJooV!`*hMwns!$Aet&7`-5hes^dV$%@^iF9X-h12XLEh?0_A0XLS5ct zti=`MT0d4{;Ns3AvCpO|N&8tWLWuWk$Mmu#TWq&C0d!KTy@AP;{@k94^D1(DWtyI< zIn-%XNV-N7{=rd(oH5SO@$9ztGR2ROQm{$FKgK4Ph>La*N9dF9jK?w$AeAPS{e=fy zm&Z?v(QxdlhmTzrh7F&;-e9#y9|efyr>Rckr-ZtC@)oue)4XM8P{don#A1h+2k=py z6UyT<#}Yv54&l&r%kmd_LBUW2C{a_NILa*G!mQBKchv5{n(J-WIxAz=1ZiSO7ta*W zl)>#$!~z3cT?+zvED0k~NPBgdvFaY-VCNG15NH{OQ$BR0839*JzF+p#^?>EaW!O~b zVSZ^suz9xF{h})X-ac$;HF@~XKh&Q;nD9xx|4m$apR1Ji4{_=3lRhA9L&Jkgb8s)Z z&frVL6DH@MU_xlqDCP~amv>ra>uZe$b`M|E@jtsAFE)uO`S!j)L*}r}1z50(+Zg8F zGH4Kkk@fJilulXoE-yDz%nsufpwhOjwK(q#7w8N_yAKoH(5`aHC3z77YV^3dpk$N; zY0_18TH$IYc5Li^i@r_6(4hGIug=$eEiOUCC>aRvyJ@GjQ@$z_S7Uj(vaD%l`#77U zXmv!`1*bORnvb_DPP?k-F38aW&G(orYH$0_XQG%R7d*0yvS?sRoU)#s;;5(1+F2MXN+LHgOFg)e zio0#zVLao?f)8#V7Xm)^g^s7!;i3(3IF9Yf@U|suj zTo*bjHUS!RV4zql!)}xbYFVT*4(_W6B=Y3WUkQ4pDLcVTs%nB?T7HYWkL5~8Y!8fa z|1dj-vfJtM+nfj-E}^{k0Y}8D-&i9n))S(zSqa`|Xrv5_IFsI@mF3A&VXQLLR2cEC9XCaXwh3+PAG~`O^ zGrh0Kb_@4wwMg+ClR9@hZHnD|k=cgXeHa!ORoH&&DENp(YSQ)G_7B<#+t=iHg4#K8 zo0kl{nb-zA=D8vf7j*LiSGHd~;M^42ArgXv6;OQCeV`0+KE>q($!R30e7HnmmKy5E zOBv5bM3k=3FW~0{aL2H+GC^abSDNhg@`ZA*8&c{838SSpXoq@NAh>ls}j1qnYe}psq8i72Xu8jYXN`z-uRHG zw7z+CE^yjZAVbSXnOKP6|>e`tRh!~eG3Sxh9BJ`Wq{ z?PFU8!!1{w#|Zx=(rs(YBF{-USz6NOWh(W&d2Wq_H%v=Op}#6_*37}Qh;t?Tx%GR0 z?m2cu^k8J>(%6WZ$FtL7lJ!}wwle+CT}w_@PF6b43i*RbnOmB=;CP&3owUh9Ds+uA z^Ck?w|3wYiKaJrFUs>!F@IKtNqDy&RFq$fPHdV62+y8ZchP2O}{&eys&?0fWcFS7F zqy80oK?b`*AS>hj*C!ji@*hs*x#jv|nWLim>flW-zvO#mq=NXsA1(kvBr*nji)BvX@Mdg3k?hV8Fhi!pfbuXvZQnf*@eE2OyxwYJRLJP>O4QS#rkn*V&-lqTo;Y&|q-p z*n9&iXh?+cBy2YOFL;uR?vXZ-b$z{`?{kj%#RyfWQrF4NqtI9BO;kXpBS~+lPcCmt z!zyB(_{Q%r&(_t^)OR}4<=lhoI<_~i0+(v3u478v_ZG8WVh-*mYxih=MZ(Egl=B<= zaXqGrin>Y*wSm}QpG5b}zt)alG}dP9pML^t-EV)$-E*t_@C}UG>LOstNJ3N^?lK|j zth^aozv+$STPr80$vbzHra3uCo8(w%_19SQbajC*YgZy5sxQ?9uJgE_r|J3WZa9$1 zurcNVIi`*;9T)_S)RtxJDfQe=M$kG^Tj0FK11df(SkNl+TFuyK;>d7XgOj--R|agS zY-k}X6PqMb|CdORX~1D4d1TdFlP*d>a#X zH3EBfM!Z`Uy#G}4RwqoaOMyRBT$g$Z=+{_1pb3(a!K#r!HF<$gQ&&K52 zlZB>1gs{a9g|mM9m zeJO`s-6E!^D1b7j&Y6vnm#trkPXL3Fr$v0mxq-ru#bg{tAMWYhO=8-vw0{UFUfmir zRQDmOoxX#81F+0nc;9VF$kR8g*(#q|nZulwjIaM3G`%1KGVxfsozPoYW=|%FBOH=p zruFK=>W0`CH_s(I@%Dc|D{iyWFJuaL;E9c$?oH?(CxF2-hqEp_7gK6P_@+I4A^MN9 zl>Pe7%A!v*H#^Qa&y=qmRNg0(U@djzs)r1T>bv0bF+Sp}H;jL1+?Y@&bij zKdq}f(#gqlvP(JgZgwN%_)@x$Y*lTo+H~=Ri{^C4-pAOsgVnf;1foG^sDwp`wbvvA+!yNzGtdI4S?TSY&1b6C@lEnI>)u|wO=SWX>`diE zRr&+~V!hDT&{GM*HUss4Mn9V0p|YKS?tskv{+4IB0cl2xtf(v_ZW<7;rqHJ{qms3X zy`%NyVvQKK%XQI_{(LppQqv6Eb9O!Q|H+2qB{mN63kg~FY;W-GCmLs zs)$Fv=qDe|^mBG`eg{5-uLgIG%IcWUJd%)jFflcC$rQ70y2Y%`)j5$wo8bh_0MoU} z-Om0N0nc!up>aA*)+rm4P|YvagypVai@;FVN$a6q3PMBFu{U$?!*Pg+mcr z=-HzuEyy&h-D-k_Z?-|5Kb-X-pe0}ixYra^hG>@beWa)`k?FIFAy17@T_deoR+pc8 zhrN%6VBGUwE0#&Z#Pc5~_I~Zyn=7e1*^T>bC1JfXn8DD-Dj?ukmlGE$dsuywg}#|fyfT) zrY4E@1`-W5mw(lQ+atDX;UAHX<@&D0-Q#>|=OzuXl!%FWYKA^CSX%zO}g>=^AKwE}Aq*@U8}h1L0P^g$nm znV5t;gNSiMw6l^|F$|IC$@aO|Lch9LPi!^g#LrS%EnG4K))RF_y+6GePfA8@9!2z} zK1^0XP&qP8kq=>xWS46_qvgaXDHaiZX%Q=Xd%^vV6(w7tD}ft+%ysUG8*5qKjO$W|DTcaj$ii0A&EmyWE{f9uo{4gW+Bqp&nLDrSsh91taX40M-%WKTAC@$&TZK5qD?k z9ESo%NiQWQEirk-edJKV>)YW^H_ID}6pj@m9LJa@7mIH5ajdErBrM>!HVB9qfzMp| zVSC&aicl=2q6yk?U1w%8?56yqkgC%T_%cSTg@wQBC3?2Hjt?zRo5%e?3M4C}$-^v) z*rwnnb@Z)UEK}GJ)^5Z!TvfsW`jGpCZs0u7U}uN$Mz++f8GbO-@_}EvofB1U)9dHh?=Q!b!7D9Ij7g%z&TiYI5tfwn}4RoV^~~IvUAPFDg+s;v3fq$80f?|NB=9Y3Wz> zCa%iEyqU?zJ-jB}K~YDwvGwe-aoPZ2dZx~kHPA5R%<+s+IzZqWC;NG559QtwnKR%rgKNF4 zt1MDbh)Pcjy3FvI%zZNa(IVphPc$dz)Lv&v0%0LSMS>MG(+H*21al%Y5mqWuecYwi zZdpjBNLt`UmmOi{Pq*CM7e7bG#)PBNKvnk;SsnAVoX5n#m)F_P%UuH5xc&O^Rqdsz z_7jDLA;vSV(`b?nUHp{&Hk<_nTJ(YxCHB=-Hi4)!d0tB3CuB>GSV0E~2S2I&MV}{K z4-@#l5Pu{ak3bNp=aV@9ML8SXAkUvr;|Z15-^VQ5wArjMaN@i(o2ZIbc94c_E?}Q; z3W8{1gl||jH=DG$56B$-bf+`ezR$tIJ|cnUIJGx5o?&+Byd3}WkJ1tWmNR^T_-0HU z6&wf1Nd-}s#5dKCkDzsxDZtY-3-XjDZbhD#AnjlUA6BT(oTMw~8eHZMEwgI@GB0%5 zzNo=R71(s_GFPI*4*=|#r?uWLmM$tO>ATYf#m=NGaqoAb21!4P+udB?fw+3y5$toj zbeB>j)elJ6|FEj-CpEG`CRPRmcXkww#{%C_tuW)?Em>Mzpy2T-G>|o9)hWwk;%o8bvfOw7MAr1Rxzf(mO8^+rFgqgvs>o; zz_KQ=?~kOK0@*^Unh(4GZfT;x?Gg}XIPplBx1q}nQ+zP9^SB1_mC5EoIYuPtL!>C{ zC{9-)pdY$IL1Fq3tpnA2D$5?L$m2yQf%AA@b}IAu&}<4Bcw9&2?T$)&teegez1M$O zS4~WPq$hudE|0Mb{_31TA9%0-V*Aq=`{wFf*}?Q&*MG<IPv~Js)eD@c?Dw3V!e8#!B+G+CGq!Sp_YBQuYiwHWalGca z#@Jq)5$^C#1$n8s_EgdhOQw(n(^+*(-diU{T8)M`HQQukWAYjwhRdI8_ zx0X@rQf#NQTUPf7fMsoS6Tryi__n!1#RGRtS-V5vGAg&2^sNaeN(=PU^h7eF>KZ@R6X#C8 z4}SSwm5AVU{H0|Jnxs!z$t_8FIo~;F3-)NPjR^qx*@NxgmG3->ZV6TSi>0Lo;& zXt@X(Ep88%GWaQtWdSuL3odf-l6Q5 zvsj&Z5OL2($496?rhYEw^~+;Q{;?gwjMfWk#P2dl^w&Hyt;@_S|lk2r_Dg z7JuMtuzf|Yg!q5eDDtKGe2~GG42?zhXt=H>bOpLe8ROP?=QUP#+BI& za=X%=2(k)eNWbL&2k`LU7@L&T8RZ~;?82IW;6LtUR8J!?T^IHIGeBoC{(H%Fg<(t7 zm34aMx(aS>=V`dcJPlfm%BJ$vVUZqWP{lmPp7t|%RT(AG~HsFuM!FirEK%KPDTmKlnlKG(LCe5r9?X?{qwcEgOUrC z{KEcpZUzQtIR^x zb*6M}S3xbqOAF%C>D<9zIm{PB0NhWMFwVS3ZD;N0w1eNphCvg-hPqtT#Xb5W-ZT-a zw@Q`exZ&khDbw`#b|j>N?Mya$Hp~)z8a+kB6I&>A-AOvEJ(H_$bQ#Zi`1T z%`;7!9QOQ7jm@;=Nq0D7Q=e_dYb}ffr1}URFe165=4&;;L%X% zt;)Aqs3SBrG?Wz`eIcTDe$PWw?kb8oU!)|MOWkC3%t#`@UEXro1Bo6g@9FT2iH=1l zp%XRfB5A!6Yi*AflR5b+lp&#n;wUsi>T7pckU!#mSK^sU*n#PK_I;4m$d0%2W9?>bN{YdD~J^0LvOPJAv9qeR6spS6j==K@SK zWlxF-nN90&BP)snW&uGi_GShX{te}ECGqg3PE-xl=(7+6x{qw#CJ1}ARihf$y;*R#DxY|<=&mhOP@_qk^soDDlmXmt%5 zpepa>dm=HIDA`%?wPV6isCVNbh2WF3a1ZhnMGAs`qAuuyhHazrZJEle3Ojao+_q zU$hwCS(#R+lzambtWa5YSg8%ppfYHvIwSImso5D--{7gQViuV*Y(%3T1juykD z$5Hj`6Q$$Q7H#WgkpTy75sY0!N!WgC1@q8YC^Dsn8mi_O>H{ed!VXU|(}y>m%S;~@ zC~04s%Hu+s#&rs4GxygdIEnA5^JnO)k4rh=rn@u77P2WzE(u6SjAjTQ&kg9;z*>B$ zlZ5#;P6far@24MPxyOS1CN?i9QT)%^!fujC5b8=i4Ud!kjNo&bwg?i%wa2PAkR7gk^he;T0pbBZoIGuzUh z0P16vEmE2T{b>Z;S~_%{vl^j$5Jr1Ju+SNFH&InJ!r1Ro_ryd}zNHG@i+43gzwPcT zNLp^?2-h4~_`{Dm0RlgJd>jEoj{|7hoJuI zswTGO#jV3t>~8RfH)XRJ3N6Bhg=xrrZL~-O^&YxrzlVQ<2m6aM1#4?oyUN5XJy^0ETHG)HeKGVw_JoWz#7+Z0#E9rn!@WPJH z&d}sdPFNUvPZ6U%YK5r3iixG{aH$wAh+U(A4koWMnfyc;+YYKq_1t;m`lnTX_HT=p zY|a~OZ~sP8D$XCArkE&CyiAv}(T5EfX)n;EIi~5k)|?eRdgA@P3IOc!vSC&lF5`+p z2D(!o%HETG@WA}tSNRuAej0ZZ%k*YPP7}+9W)s^*ssOF4!`XXOA9aB6>V=R~&QV{_ zP+ebZ@OW>5>o>2+D;+U5a8@As9_8voQEAcn3>!h-bTb&7rol54xyzu!HwHTdZ%-?y z=WT3(^K;aKI+HT*?;7Mv7sIO0`;Jy>=4Eej`fPgR5T-cvT(K98%orQ@=Whta$#xS0 zmA4@sZtmp&C_L1pS%&@0xfXSNm);|tt(X+m2m1kbc2ArKN%}xR7n%Hu@c4F%qbGhv zS`2dMCfLoU0ZM2uM zR-rqHbohh&Pp+5gTh*aGj8xD9dSyd@RsYS!RN>s*Fg-`!M8#O?C2V_4H4I$w{d4G**M6Yuo4`yx=F63N zk5|hGZjt5XUzS}4V>mf=gI~hBOt~-6GPx>b`fCAhJr~G&9khdIzxF=7c4aTis5DYV z3fzA7VG9`IR}1&Yn!^30XG*d~=QM)q9GYID4rcK4?-IKPy1yC^a-^spz)zMyjZR%Z z(m5>3{LG=SVM=E=OdADmJ@&m($x%2A7iuWR1>}Ja*CkR!nCF)q+f<%fJh8`$%ZSI= z$3TKVK$8!?NWQ;3VJcDfSfc#i$H3ZLmtX#d+^m8nMZh_AU@+@2xalL*%8L1~1`+x675Q68Mq}E%M}V_tTnXzM)A2_Y7|jWuY7L2uV(T z3dQYg`}gi-=83;wj-w4d$k>^JS8~Mv^x71{B8@*LiKeESkqIfYD3W8nPj%n`?tWRN ze32ddE`y^g2Y?Ta(-)q20onV`A#c<&n@zbGPayyr;dlQ`ulb8uH z9nBjlQ_(52Zz(YEn_{m~lGP6_V_VraDsI2XQRVo`8-MDJ*|{O&E8?qKjO$fUR@3k) zHs!Ok-z4+ewedPKhgR?h)u$-i{#Il;+FWiS-&W=BhS>=W2W7C`M82}(`CM`cMI$4%1QI$C@Cbimugv(j*lPKaAG*$#MR zdc~o(7mm5sF0Cc32|7JNi_f*K`n{z59(jVX%P)lh$<&U$@-iC}?mq6WPp} zH#cX>^4>h;+||F#^T;8)gKW;tLrnA<6+>qsc9;!qmCUjFI>B?_n_*?P%>|SkbO+&T z=odFO=*$0b7ael$L} zh?}<#A)UL0J9`{l=PY-xq}w*2e7%)3|9@let;3>hyS-r%L2(>VP|!g@lv0KeWF#bMq`N`7yJP4O>5d^pa_AbG@ACHE$KLzd@ArQ1^LqdJ{YM?wF`U=A&U3Bx zi&gXa0F!)mp2SqsYH)NHhxkL2^zd$Yd;&TLTZ7_<1<}4H6{@cuIbUR@Gssp2*Ydc7 zG-^ZXERAzX%rxQ6$D8e(_i>LO?clOb7$Ujm39}Z?T#VF;w?6lUVLge2H?&_}DJiQC zpRv!E*7&|{S6krY^?LbzV!Xw%W98eniCfEzawWW8-NNa|xMM{Xlrz)G#OZQ-v>ZVI zF_n54K&c{8gv`JWoaC-##01G&Tu-iTC=_OSa7~96vL?`~fKYugSXfG22@DDO+i)G1 z>QieshPa?B`G?{kxuTN_w|sJZl@%33w@#h5vXAbOuBxu0v$j_Zl-ziX3yu@sycx7} zBAMZwoNS!uoyj)}WV0Ku^x+*-(+|IlR(?GYiT!4ZI|OxNOm6~48f_!ro_$tQD!sBV z+HNo8nXMai8RsGz$E&`wrZ)zdi+V?Abt>Y7cXiO)w?eI5>rGTm>58Yk#(gj6reZhe zh+kGE)0Hf_I;Gc>5T{%sN9t@swr65XD<>{FKB4jt?4o>&*Xmvx+z2exOMzJ56nK7? z0I@}IjDNm;YKvaBn42++dol)p*hy<^rqYHgd{o^3i7ZCGj0sUfaeaQhM~2)9lk$@L z;qT{doq|Rm_aqb}o|`qeI+xe;o&SjtOhuYE1#wzuo1ezuGAOahmle>o`5@)f#QXWW z0ow}p<3_tf(%WSN@<5bYG#(r$ahWcUDebUx=yl{Tk#OkkT#W!hTvTXLd=R3%BdS(i zMY3}sbdDNZt--lz$HP~H!B;3xGQx{Ni^L1F z>0*~sH!$PGP@=naTA6Zr zmRg17&|Z0ce52Oq`DEod5%E&`L)1h%=a)GyNu#!#7zG;YPK1ylhe;Qg>`IqP6g$SF zd`z+Nah3C_73REyLy7>9#vSb0*(3e>zE3~p83m{dsB-3&cy{F2sqnVlsB3g=8apyS z65)pRJu(AQ2NXA&!>r}?OE7_GyAE1)K7?uBR*JYD%U&_o&j)tPB+Up1TcD1C{a{OS zb~Pl(w~|v|%D#M|lISiAy!mT6>+IYZw{j{UwV-}wo+(5>X}J1C*;+A#KGI}0~6A%MUmr=+MFW?ZyzQ}cV*6=~Tn!a8z4AwA zhczy{p0BlsBq#fps?ez@y6)!*y}d`o4i(Wmsvn)c zee>cM+Ey(+-7zj0%4tkSCYQJvpgL7J@F0~wvVaAPC`&?2Lc{@Hp6mQh2*R58%yA@K zq#d5q^Mi}MgP$aMwCV7sBMUosF`m@E{!(d7(1F7%mXCAu@BvG(+3gRYJ7v77)$`8p z(0yN=9tBbw%$^}6pc$#3GIzRI2QyTXX0<44Gn2MxCR_|x(p)& zA54C|NtngV#7TpB>0)^?sbx^Da<*a3^6;+dkow5qPL;peM*kPArG+WLSZjY1zy*F& z{8R*Zt?pc4Ae^ucJ+??wZ1X>xdltTCld2-ZNLtloe70yVl6^9?`sU%i0Iu2j^y@TZ z7Z3M-2kBMlMXVO{6>oFj`8e5YF2RMKJCi$!jeZ7>Ovx30+57(AH#!HZ0prmD^aT_9 z-%uTmCZ1l%y?bJ?r%{fLFH03=`S}p)!f!e-_o|e9BB+DK3Wq|An`~s1w~k++xr>Y_ z9)yTd;5+qp07fFz@&dZL21>yrF}vV2y}0r^)cZjkXm0N5(sB1HOxvU7mKo zH$g+_%@$2wT(UXpO2c=@+oUmz9hY#`O6H1bAVpwxBIjv=1o5E z*EiOh1K5T#AL~Kh{Cuq5=5H#HpZTxJ_!s(}Ka>4tAa@Otfp#@CyEiLH565 z=y{9*Jn4et1%m$#P4)kskov#fn4I3g-ox{FEBA+W`v1Z;MiH2H(PN1BA1CVnHIn@w zr_FyppjqIT_vd{@*?-C+`#%@`|6l6=zQ=&2zD4?#UheN*y?}E^_SK`8F|=hBiBUr7 zFT?Z&nbtEhK8Q{@mQO|YY)^y5`SbEJ};~*sD1_C!J>wWt zwXu2rBu1YC%F)%;zFL1BBHtt(*{gtv%(@yEb&_Kam(0#!jR=|7-5IYM8=p+oJ6+hii>e8{17PFGMD9s5tw+Lm zJ5iCo3GLdi!AdoDj{zI&aNBx1I+xQUEw_9p#Mz9G^5^tL>^_w#Y!e*pWF(Kq_lW>3 zme|4pbtyK*H2Ff{@{bsh(lB>lIToO`u4m)CpM$f3$B^gPU- z{`lL-?8q^P?bQ!>oQ7hgVWs2wc$EMEE*#m>6?Q#9l3mTr7ow?vvT%oo<3**R8oK6k zRdOmFpDERrab(wZswNNQSf<4#eNu%28 zTbB=oqbwEGP~IHn{5qs8F>&->=>tk979+#@ez|v;n!pIckCu*--=YFwbey@lK} zmwlf;Oso6Y1lzuoZ0WzEK2co{OOH)L#NxZqZ>AHaY-?rzMm&!mA7tx zeqJDOC@4AA@TiiE5TD@AE!Zi9@cLD?J7mR%QLnnXkhulo~5O53xN#0faZIZvB1q>Rfa%Ou? z$;^CUxjjocRjsEA)l5b36uvtpt*WJyLrBy76&^m?qB1?+&O7z<4{^8?=%d9R#U*G& zGc>(n@X+LKT}<7aeN6=zvrSq1)j!|;a_j8eae3f+Gh`M?C#~nICCYuWEWF=~$K#qq z3JiJcx!&iwjH=H{<9i3_H^r!^^i);w#_mV`1Bt;x++E`x>iCqGB&>hx-S$5-YL6SY z{=RBUE^h%78ej?UUPjRt9aK818IHw|qQK}{)m*Vs+3+Z1bx4LvUzd}JZl@bcJfxo7#@l% zOYNkw`U$oEK%XOfw?FFSj2oV*^~wzpi4`TgE>HKb?8}Vo)QdCbpp~;VkT#@8F5DW{ zXcKXjyVEf;xx=RgBzYV52R=X4mcG1wVamxpk5sZ?5lUbn))VNPHq=~=oMbzi1-z}-7zrAh4%~?UbKlHgnIIa!20fCFuJb(j`<3oWU_tFQ9Vn@p%MbRi z7+g_j+KYFs&ZazH7dT(^ykt9iEAq88))!*U4{L?ggo;uAbaFdO2EDd;RDWfT0fzYP zCxq}sOx3=POH7W+!)6(UZ$5(r*4*$CxPAPs<HVN9Mpi3d%C*z%~*n}O_lB`x9IgP|SC-T=~7qL>Uhvw%*d$g7CZCJ7;Rm*t$Nlhxus_UhZ{ z10V%^mtydKDGrj~)rD6<0nBN?@f@Gw*5r5dftt6alPrJ2RCF zMN1XKbvel`z;A(pF7yrLPjPGIFCeN9M(>Acr{(Yw!igA}CR4%^eI+Oe_GYvm5!#jl zX{{1iyX1Jbhrxpecq4JNQzHO7GO6~a>JMQ{5c^pG`(YGjj9dtjBe>#q` zpZMDyrF_;zfy%t9X*{PfxZ>9W9Ybv5eA9_hhmxK8!2DvJdRMEzu7Wr1!{2Qeef4-7WGyW8uQe{7oBAJ~d{efa>Deef##t$}G`Kd%a5r!Rdto2Cfa8UWqOC89gJ! z!N#P;$G2_973!J8I6>=I!RY^4?fo06=-)+fvob&~84uX~?d|W8{oI_|y=@M8TG8J( zk*n$PkQ`hmLZ!2P6BGsv+C5Xp=a#gDqj|hwWs8y8)S`M1z_-q7+~0pLGxmFs2^CMV@DDajk1(5L=kcNI-vf zknM_!TZmx=jSe;mTH_Y*%$+oxtHcI^Ko+8qr1Ez*Rrdp~cT*4yr>gJU-fV=6QBson ze;X7*oPGNEzD!7@KQMbPS6Z~=#wo0mV~j>lt}*EXG=>j z_WOy8ZEotB9(5XLtrCr9KPa9^Oz7GHcD5u+pYj5QEiF6n!H*)D|=N<^ZV36jGA=t#a^Lg0sHLKJCt#f z930tM|H0+RuA1Ax*3WlcHZzpAC)_u06jsrBJm0DokqR;Gv%;x9(jWMcNap}*jmw%*?`SiGv(7A80F);VpK^D zbOaMO{IB;Iu4OTqSZdg|Op)yJD&istN?%Z8?%(KSEAHkdH23DT zEZ<1$X@|CGS#9FQZpzhLp#GUnj16Oe?`Dh{8s>E5fIi&$EU=%%AZ15Lu zXgnT5(5&Cv^nE?I{p8?A0zd8f1YrvN(TNR6t9KsNC0xWxDf zywTp`c@j2fUdiM)SqE{-Hniu)2OIoUrY=_N`!P&~E%=0o55}5s!H2zMu9qfYvvoTU z<}qcteF(+D)qq>TSY0p@MuP?4XGjU|QjNT8c zI9^;U71*C+of|%iQhuZ^GqU?IADy0ZHQX0di#QlJGM%&AdQ6Z~6d_+;=<%YLDKm}y zI^(E6vGJ$p>tKYnv~kdMoubM`U1w)Sv5Skr>4plmjU<1auhY-XxIm_C^!bn3w{a72 z$HieehxP6&I0n_b)1L=creKx&dDk5^HG~(_;QXqm1gulYureOBrZjHzagoy~a4V2i zvT47$acpoGx9?V%HB-^C-SPPJan;6ZQKUi2HLhQ+gJzb8CA)V)WTp2bjsmdcfI7+XoEEgEr~*}N zQzul{?6@g`?;rc{?prill9=JHKruG&J%1w2A5Ds@cpyaVcxZqzeX$k+WFu9JNWcrT z%xEIk8}_(mTO*&cqxJp|{~TFZb4CFMPOY=LhUk;>z=~k33`KpQ**(q@UY6KraHs1l z6iQ!jRqOnoFeW-Pm7D}nxG-sw-xI*h_hc&ogStv$6rdHY5(Q+0%}ne}IT+8hc2MuQ zrnzq4K371d%NEVydX+Zc13i02zaP!E}<@DLu#{YH_yL5vti~^wh&89FjCeKZnKJSxW;cRJDO7EYco?;x0@a6)LK382|qVR>BydQGp1rt)zLR- zPh`eKn9|v=Hl!EY%qWDES2tAEg;Z_dH<-kw|Z zRE5rV7axxqs-3UcE%JO)${nry+~V|4^nx`BY$oj z;jopMRf8gwjK+-N@P-T;vg>W;)8)@(y`I>eilKc8W(}`^nr3W*8$5NVsP6ksUaIU* zxTeKj*m+Y&|0Ns3e z+{8kH^qZewF48zKsK!5OXnY#WM3RwK*pVK(*r^=P@hhCcWIL-iQS5qPwd?WENlRYn zdtyp6oe@`@U(XMsV(`Rey(Em0itBO_jniEV1DG-+?&Qo>yJUZip#I9zc44>F6SI9& ze5ugCp*qb39K|^GBZ;_CcD16N0z6avT%2P0#Vr0w4xol zXIeJ*eXzJQWN>=)*96R{=#~xT;^VD{3ntWRgxuVUDVARQ8xHma${K=?^73P_9Tjs# zRNL5{H)hqK6m6b-+Cw?z)g@m7uzS}iQPI(L@?vse!d#;p@6=XHa^sk}AkPU#Z-fo1 zEmDsAResch!ISVN3b6fQsCRL3aWSeD=I7kUNgWdfKlh7VK+L6#;dxj?up@5NL(px1 zp|9*!v9@hRRonV*)(zxfz<#&TR$STfa+>_~uwIs(@{yXxl(A$qVY#ClLJ*j46QHy7 zy4<~rAS6L5`_iUvuU*OqE<%}RWUF7I0lm?=og|uFNmfejS{ww^PsV|>Fc;r~b+`Ac z%o_(M?M;V1E@l$`C&F+6=NBI4&1djCyYSee(Db07g%D~1;+@l7Rs?!(?qCglN})j` z0wc23!a+W|gk=1x+dE|53cPassem|BG^Ae>)V*%v+K-wD>FwTKr~?eOw>Zsq#5=+t z?!Sc_h{GUZ!2N?`_*mGkbk|?@Rjw8VoJjC}t~^CdZ|z{nw&R==C^RlMc8|L*9jjZ> zUG!NA`_qnmU8}|na<~$h3W!7)EiKz=ONiT|T<9)FKVel3LY>1 zfrj|A691d|De=g5;vv}Ik2B`-u&vKz!+#e;xj2yu%)=!&b6u`EM1R_zQ3BbN-1pIk z74SW|vO&qedIYZT7Rw*2yL6fAFDwxGFo0#2;_`Z~0`?{&b1q)vYs*uvA66J-cKqC& zSfJ0PF^}@+j5o0C_CGcl<_B|h3hU}xOZO+%=Cm-qJv{>Y49bP{dy2Byx3Sv+X_C13 zjBzD<(DpPN)w;C|?)Ll=KVKcH(8bJ(i<^aFUDj|*0g^}#$w^xpZnC>=G%L49N)0_( z+4X2-;%0}w5Wuut+=urVDt?=t^#o?w#3d$%MJ*S2x00X!L}!0=c2;aU=+Zz48x8EN zcfFp=5kn^<*WjbSq1gWgMEHLW=z9?T8beRyboJzS-eL7BRp|+EUh}n;KMU^{7l0o& zV#$61ny;}<+Zv7(PjTwbxVZA$UT@YJR#E|y^MH!#qgB$Yv4L}S4uyvfEH8B^VacMEekLA0l)e<~;;LIxW7 z(Zb>_AyM>4Eep{z*q6>#P+irw>gvcql0%@-3;Iyq)&BSXLeJHsY(fZ=!$ue4rD?3u z=;)3gjoVkY0(vq%HNe{^DHmyy9d=LjgT;e$Wv#i^m6dx|5>-lN$15U9iHx<4x?4Z6 zlq;Tm=~MXNCEM`BrNd%(;TFQGRRsbK_jSS6?P;%Jlaa zl{#osmin&2(&wpxVpMR6 zjP+K!>B6d}Vo?OP`j;SXn&zL9_3D%EcAc%_+?N-LiB~@wRGSVnDMnuU>kErTl}SkU zeVg43-+W9K)zaengpA~ver9*b6KC^i)aymXXBPRC9o)PlopeglATcJ=m@@1yk+gD3 z>OHm3Lboj@ogeK}_Iw1HZnr{K!X&7VlGS1D8}-0slc{pM&xy`QAK6?tLo=A404Gi~ z+U<(=^v5P;?Q6Cd*E5J~GS~t|VaqcuyHcO8iVLFT8rCT$uqJmYp!^0{6opMK>?xaP zeb6+`!K3BID|I6EAyb3hAjiJ%bl=?0ht8SUxTsH6)diHJb+s*JfH@eH_}gDhn9n|P z`#AH7LAsgqUGxpyoDD;V9sCWN18PmOwYB)k!LRaUQFS58rUSRfW)mjzuCTv<{~kcX zs%-pLk+@04L$K2EL$MjB^@(5Q5}voU*==MYDkvIYLER4HtPy76IVOg&!IzHX)E?}f zQxFDrckhOJvsx5#*4T~ypGVMtV%-1ztA$fw&eG4*Bo!gwzwU5P9B+PdqUV}z{YGzm zuyiNeF3_}u?Dug|z^#$5R5+?@;P6%^*ZUCt(eyLKx>_skHsS0L&e&R*yDzytfcA+1 z*lhVKz2QQ;r=ntO4}ow8|I2{Pug(rGGFeo5%OeB*hJHPM_YRK?{koENZxttPr(@Ah zPCANxWKDiVqQLwhq5?aeb4y$6MG?bvwqql?xH#>0O_(c1I1ac`q^H4Gvq1M?e>q5$ zL_p?JpqiojG+vGs+GoUEm9E?=o5~z61cR295cO1C1*;A(Rfa{Szd5ZSyBSkNUWs^5)$xYcP`U0 zR>a13tk!V%FI?0V$>Wk^jRw%J!*%uQ`J1$GFiTu~vYoJL>GU~dEKnITKR zJ`M86dN~!p*ZQ7xG;$2JBVKP~WFt68*|@+~3j@f4=%^sNk%Vx; z*5er}`snT8-9Mj_=|Lp1&>xY;FxmWs{`bu_5aEucq`2#i#iQ6`_~xw$*{GYjyJ$0( zzF^w}1D3-UH*iA1u8j&lJ_7ALBMQJ|CVvS+cKoSB92gmw# zJl_Y*Ek#u^g~cG8T4`jgK#{ttk!WW#@3`a*nlGu^mV-9D$RH=Pt=KEjwNkFU{DLVV z2<2_-H1r@Oe%T|aI-HvUvg$T`))|yAVtKN_&1JW0NTkVxpow5kxDKS=X}l>> z@j8qY%sQ0bH`cwIYV`f4IKWWTRmbF(OlqWI14r%Mlz`fIdVVktE`%C%3)Ca6F{t(w z59ctb#`3TyDpaLA98ssPCR z5=1a>Gl6g*5J)Hi1DQpO1hGk=<3G?VEwKPjcNWvP?|vtnRRz2u+$TI)i;seosjV0G zmyIl~v}FQ1zEZ$ADIz56Q|~*4US|rNEBMF?zIbpt?qp`P(9v*lsE3Hgb31TiJL2WqE5%@9Xxsji}V1UE!ix_pKGP-0ljoF%;kICVX3qNH~uNibJ~m* zp~%b6sF_C34ODqCC>=!s-G-8o7~CDJMVxHOq^MILN)oA-vFhWq^K*DCC2AV*6*r`I zr@{|^4Sw#hJ~%hCh)?`P6{tOw6zAujAS8{PHJ{AF|D zOiK%Q^}LryYC~R&$T;aAD?ovCu*$a?DTQkqVVkv$9-X~74VUBT!P#1qZ zHAErS1`Kh7WLJ;QM(yI79L$wHKStLT~R;@X~V93x70)&PTT!QNBA|)ZVEye|ce3Kb7qLa|JHRTh~`^HX0*Q3jHCRWF`XQ0_7Brbxf2EEaKQ%%N^ z0mNA9j-QZ#S{|6QmrEH6pg!exX{>@m7tgKf%*fM z`4Bl{8q~e)F~j_>FLMLqrg9tal0K;Qk{_|4l)#fc%K`mtVZj_kC_UaTekEZ|5}o{y zS(l9lI0kp5M3b^d;bDW9L_u}#Ukxi?fz|M;S5HX~D*H*)PP$XEmlW6hE~%_NrN7k$ zzXCw~SyCQHU4(DwEQfvj%E+;#nVFay@xE!X27+z**zWDjmo?WAee<5Zm9(R}XC{|Y zu#h#Z%Cr5Usjq^msxc@+^df%QCIL$~0Lh^q@l#}>33C&Bbx^h7GyJG?@Hx99s z`d4)MG5H0_mUq@`HvrF6N9O&`o+bRT`g68+#sw(>IuaV5C#;|aK+ zc7MV4RxEA!thUs~9$n%~-wvxui=cQg;_f$SE`4=Y+(eBy-vpf=jw*p;pIdQN*4cX2mse8&pL9TCE z&qZl%i7R?RlZ8sTC-dtM*OJR8#-UvOlb%82(Ij=Z=_FS7#}dkFYM@Hs{@NT5epBbB zs(beidsAG{D*Hg2pE3|6UX;YaVQ*rT&$BZ;pPJ^uovY6nfVDK+@S425j^PtLrz^k* z?R-=?0rM90GN|K^l&^kH@4U*;gzmCbcJl&w2sBe2lrPtIrW$+;Pug7l4JU_Kn~ulp z(%uF+eu$2~3uzs0Ko(rGe9_MdC3*Qz+{0`D#n(8Pw(vIeSphSlCH@#7YQa-f*{t{TZz@1b62Nxvc7%^^z=`a&$f*e#wI({X zA2dp-3Sr;w;AeyCwzgsbpvkLqyB*7vu1;Toako%Z0z&CfJdK{HFnuo|Vmamc<%{(+ zj{ci&M?kq)yVBf*oc@FuCkvG?U;Yc86VGBLPoM4|p;=+%MNkB1y< zX+21ycmO&t*~PcoqUYX14Qi$&+MoJ?EMG=_8`g(qd^PdD$w$o;i*5yP3RANLXx<6%vD+Qpk2cAybud>T3@;b_8)a>d2= zG94h}ag?^*dK&fO^RZ|?a=*%F=G^>^+tFX$YUFxgD!kKRceu_*3;bl#Wv+h;_{C9UcJY?} zYGXRrn3;{v+1-knExf}M{zoL`#AfIr(xU2t<51V!*+{X>OuU`!!xp;`2Pc9`6Ng$Y z6o*s3+a%`3@op1WyBXe?-Y~I~y_1vppwq4GJCocc=3vm1m+QU7ix5KgP|=w=yc!pa z?Bj7qz4M8g-jESy&{9crR38)=kBde3^T2_qNHdLkNMCnk$Eo-=9M=6@gJvy%jbBL{ zNGv|zqR34nH1ZPP9_w66uC7$bAEQj@t=CZ#u-=@r03$`#d&g6JR-{R#niEk+zE)Mu z1m~PzTi$$XoI+jgIl5lw12aFD$=nW`e$kcyYUq!Vy-j4}hpP#afQ4B zj0#-TicQw?GZ-%2+@k@poal1@^@#Oq4jEF9Lzx5+!_{TSo4Je&tiD_=N*^o#F;<@5 zxY@$Kli1XF*>pa8**{~4?5OYOuyxbh*|E8LkK)QjjaMzX%;~!|o;_vdTe!MLuO^ra z#Q()D<-Ori$e@YwfH331T_1`li47hjr%eR@UF>S$U{r6)O1p>kG6oi@)ppI@|&5wqyy36m(r(MJ+S;I}a|$pJ={{3*8$c zC;D2dl=g)1o7NCe|Bry~DCy-?ODVC4@SbZI>nW-F^;q4{+Jk~wEzKC(bzj(23y^^7 z4PfyyG|`!3#s>E#d3}AcGm06~G2S$7G2S}+%e~-#tHk*K5^ywEJ(^UPqA*kW#2)-N zB}Pho;UY8N@@V?qOP){eqU=wifP+co%~L|qaVmh#jz0qGaqUtHN+i0^QOyzN{4(0F zhr=u}RFJdEhC_1T&yNdxNr1)WAW0Rj_4lXe6<+9Gykue=q&+fx2OC)k>rF;-P&~Z% zKz+a4Q`N6|gkWtbGEI|_1^|2asogHX$Z9V9AaBYfu{DP)>Vc62ob5m60q=gjy9=8S zWIy;q{P)Y2T{syMkTHX0yf@<4Dv?t>Y!p6K5_!=|oDd@W;&XzZSgV8IUzJ zJR|61{GIUHzrW?oJs-#<+xeI8=pXI3zxG&j^!){#dAiqN>zjYPF8}fXkFA%0KIk}+ z)e#sI{SRbN|K*8= z`p*ONU;gjOhAJ$H?SQ*wC#$um=gY+b`V3Iq)Gh>f)f_P+MsG6bjm2MFc+DH$7Zn(e^KNjw z$jSK7bNkrjZQos=uZi4FO08+X^a{VUQWTIN&RykKvvkt0qLzUY)bg@35(Z;jU0b{a zh=980CD+^E7$%>9sDXBLSgjAGlIr(5u6X$b%yU~KKYyto6i8bq3^I%*Kw!JI zFTFNcM_-xT)W;C5%8rgHhuo93C1+v51u^<}q%#f1Se!#2-bL;7vpji-{5#S5my__{ z`qo2_YWFZX+~t$N&(7b$Y)t2&+VqUz1GD8>ASk?d<)f~#qT|R*wi>r;l>R%+cTI2X z-V+kVWXczc0rL52NDdLu%9XL7 z-{U~|L2uP+TIY})lyQD$YiEVBxvKO=yh87r-Z&|}iVAo-i4gb2KFdTP(786{%7s0B zJ#4ksr{YAKWqK3+*^t!zQS7rjtYzjgxp7Lh=IeQ?wa&<`p~iZOjgWdiRB~}@ zhsaH1Nr&LWeso^k`J(!V0_?xmks-8s+^uyVEB>Buz~2`Vn(z)5(1P`*h!PWp5{7wW z$DF{8wK$>;3+aJ+n<_giGqnYpYt8>-FZQr^1jINMYxYWUU`kZ2@_fu2tNXc685f%vWz0hT;)MVc=bK&UcaPJj z!fyh6XR54EKM&VIGSDc>$Gi1MF%q2_L;7Oe3WM$u1=xwI!;T|mZr7yiVJrZt(2`~S z;h#soim;{=_ffsg#Tw4v596ftXz_4e-$6y}mA>CQb;iGk-Om5+SHfoDfnv=9XepPn zz(Kg3{l$4JiS_52_&NMOP1o;Pe*38er2hih&}k9Kdv*V-8N>{api za!xL<>aphyD|IOoVuaFjP2@5WJWHN@o*rY@5+#m-;!3#_#KXocA9+zeZRA8$!^oT? z@`PT|TA7HvstIFwM>fg6fzzTnFHd#H*;VTB=s6u-VT~&s5+pZDm%87BowiF}<6Uq;UZ^Nkkj~`1lL9X`4*GAA_cq1ra4r@Pk`*?$FFXwx)29C6oZpXPfL#V zRtYO@RlX{B6{9*FlO~QK)3zTbvZcBn0jPG8sHg}+1GOA9bf&#UXM`}CzK%Z@H%2O9 znT!@=ycy5deZJBeKDabObIRY+=a42nG-Gqj%N}J-iiY$?Y{ZzbSpi}-)4qynIvgJ_ zfaysC@LSLyMhmHd#!raJIoBA0o=K!gMX*xf3zJqvjK_^r;Ft6o|4~@Yfp*= zrO=iXU?@_rCyyyojX@ENKpx9PSmqX_J%>F0T0Ga}x{m7Y_E!k*rWM8$Wsj-}{0bbI z!YPT-1-`M0D)Z<4WZzCsN)A5_=X)}Ig9z;hx}A3Wm_@>2%fGZ(z@7fXlc_<7jyGMV z@EbLPhfbjg8Hr-e&d5n4Clm@>@9Pc&qyz&+uZct!)vStjl)MOCi_qow1EQj4^9)~t zUEbJk4svyks!g>@^(P~sADFEyR{}vYG?A)n;*9v=p}yvu056DI-Bnb5{Fsz_GyOan z)#!Fjga{)h_yEZn8g#z{9veI@uPqDp8(F2#nE?A6tclp2e(TZs)kHU?cZSq0KC)6* zR|;F7ayT6;=83A!q*NMuM)1yQ$Q=*7B9i$_CT6+YtnTn`mHX*khZxfneKd{1^(HCL z$sPkNG;5<(xaqR5_#1%RVj~ZW4D%JCfTpMH;w*hY_mio5)?uA*uv~;7MWKo38G9DQj~0oyIe#4hI0041B-UY=@=wH!3DeHHB#Q{=Sy{t;pvN55Ny z=3!{K`iElHj8rW`I9N?dUD-lM75zhndP`leUoD*0P?kL*?)@bgEXtB%cZn#{ z0tW`t?w_t7?9X54^H{VHrU~DC+1FH5ByZ^GBim z1&!sHS+co_3M}+|6s7(8#?WrNBa$_N*lvQ)wVn*Shn8S>OwQ8LLwip_F(3IcKYZ&b zy9Yk%Esen~Fg$l9yX#Y?TM3Bi4+auv4!<`%ow)H-g@*&aOF8|h0%&Z*V?W9OynhP4 z0X5qea&QtgO8ohwD0kBG+QivWo653=uW7HGe(t6WpCFF$-O%>lV74Le--47hIbOJd)?4fB4nF)oU>ciroq|Mm`iSgN3M zO@QkIr_fdOtc#AHo_8*#VM7vW%+=(g@-kS?CvX^RbzDOL3V1YL!C-Fugmlz$X2DD# zA&oX=HfpL>);PrYlLg{7J6@HU%f>X%Aj1=|f2rnE5JRcW!PRXP;q0d z&X?9(9*gl%zs5bOeCHDK1(=x9UQCW@_v0b^9e`;23L+$(Kc*HcEY>Ez84nmec*ERV zZ{h^7fzJnb=ewR*pegE&MWp)mXydF*6SIDt z*5r~i8-qr?mvAr@;~{&$pRZ*`rG^PON8gb5tt94CXliSbi>A9j?wgzzQbH>2792RZ zL!U*NzM=i>{luQl{5Ek_#ehp^BL0!x|jlN4+O}e^DNLi>w z;&S<9b*ECxs2A(w+N5!^G2L`L`sf6pcNh_K(RXL1lEVnKbx>@CLHdt{`$+2Rmd4u) z=Jd2J$9<4Mwc}51-ETvpY%V1*@$LgUxX-2W{e;e#DI#x;aFlINTo5IE#BG}t)OMUj z>sYcI^~(uTRmAJP@pr;HD};B4I_WByC$XHG{aI z@RFv!@6hf6?vu)&aNXt17w5|W)n~c+3Yp(YI2!sT6kG44Vd388@y1a?|DY%L@OlQo z+bMa}D(o*6+L$2=c?MU|Mr6diPZiP-rJ+(o7&qgh&ceL^u2VGp^ zxxQkh&ITa!7*`u7bW(Bmp3ZILW!*#&mNv9lclk5VX=Xu=hO`%FQ`XW`VzMx=X)*-Q zLMvZ%Ij!Z=O5|U{LslxPqxeS-r@MR))QDLI@&k%a<;&^J8c*{8u?3J|;m+blo`wOt z)=(%5){vQlL8r%{8m6_kj&X<6la(gdic4%~g3@kl_qN@NTcN-Td#92|%JMhYoIUb17!YY%G zTBQsH_vMw<-&BgKBzG)w#XIgk7zGN@g6Em!#Omwo zcZ+xXr-r6QI(4?!(C6)*QUw4_PetI7a#M6WEa$}r|7~ZWfXGlTtmDN7soRJ1-8xbh zz@&U7GcFwj=$Q6&zx${i8lJr6KiAhOaXLn4ek?&K5E2p6B`h~}6#3iusI)J!NApis z+RTHFdZUARG-ztv1G2ECGnhns)_Pmt6!7qYu}Zbm2wr$$hW8Tc8oZ?K?N!n<#9)-F zv%YQf^MI0QcCl5^Ix$VN+eLCNzU>@YU(i23k>#kI+S%QmdN0S|Rh)SY9AcPpU1}a7 z0{v>G9wAfviV}QLVo^+_sohrTSgXnhn6-jlzcj4rUC>Oq2R`h{nQI%5@lmlRQjr=j z^6{NKySqLe+?75Z6AP%LrW&Coltl;n#Up367mg zofH!{!;r=g`N8o-6g?_)#~srs1-b1rO{dqn-0Kq4KAw{brTQoGi~*H(4jrxp(A2El z7NI&$)xogKaTo+lbPooM4rQItBuEM=1u&_{y5rY8PJmov#%12_iescUyPmo$fq|Y^ z@cDfTKA8-W_{f*Hv5Jiq3aeC?EyuW#{|{^L9o6Kz?F(BL78F6HC?$xfAVrD-0s$06 z1Suj2NDIC98VDq!^cEB;f)J%CLcq{MM`{Gb2uKMnLg)cPC6rWGz^{yG*$MoVxy%t89nvPD8!>$0X(bzn7yZ zp0nn(Z&{hgZhm2*sL9oS*bOHJWf7h4uM`&mAayr&&HoZMgtW&NY# z6{f~nZL#_*0JXb%E~fg(`P?B5Q)6&mA@l*pq%64H*@BhBsZee)RsYNT0$Apz)L=Ngl`^`2RnHCIY`G(wnPvlJM@BvGd(6& zDwfv<B2f5n z*BxxErugE)pd7JYs8Z6+oUN!RokUPpSsYhMIzFLhyPfUBYEU_BK{&X)y3ECRc6R9n ztMbXAUNs4oEd~}a#Q&j-QfP!FuhRS0J^`J-%*=ed=G-o)e6F}G6k{?rJIh(>NygHkKdVJ%KDj%APLshoUI`RIPV(qkff(9ZCE^OGetfPM9*jadF<8IKWNAem zN>t~X6qQMTe;grd-O2Z5}T-cC0k3=X@$O!y#b^5V2M~l_mEpi%iOmLC3?Hi zQUmMvk)56U)%W2lKgm0~HBpqf7c?8h-%6eTytusrkH|5eZ?051y8i_nY`y&rte~&| zdit%+B_N)zh^V=$etAS-{&V4vXE?18>c<$|Lj~pwTQHq=KzK#Dl;)6YJ@Z&I>_tgC zyZQyt4HMbq#!0q|4RZn~k#Bfsr`|Im)1cM45KOG9vZI=sLWw2)hH|2H14`4ixD2o` zGeR4+k|#D-B8K40F3gAuQ?tXduf_U-^CTMru*N9wR%XhWbE%tOINg5?Y6dd5d zWbdBL8SAMYzm}rSWYE;uFC5qj92+9nFVjztzxdq zu%3a%2l^@({}Gh`zs6C2-9+?MV0**J!IFQq_F6Ida`dPxGwV0J1mUW>2>AYwWw%JS zyJCa3;0orw{R1g@+Vb_SZfzG!=fXO_=db2tW_4Gsk#M+|80w{QSXsi?^u}_7QiH+Z3 zEWNoG3d5&(6*O5#!pXkL!KG03qVdOv1kvK6BGOB0Ku$B+Gwq)L|#wW=9 z4!UG-i*`!5-w*6+@dEeroz(-klp(K1^vsoy5>~P?Sy?cp^d_*;)Wa34fIwpymCS`4 ztF+JUEvs62nLo4XWoCE0EVed&^y}A0!<0dKxQ*)eg9aGusQnZUxmY8SRChOg{NYX$(zYKQ(r8@hA?|YMEPL4X| z!ac)q>AA}Ho7&)C@9!yI9yvk zh0H#)?uCm5EQ%RS@NnUB59ihc5Bzys2kV8CP!XPV0JWk!kkXrP7)U z55b6*uhVwOl;K=%^7M3i=v*e`r1k4@+n^){?SbBnw3E#sWHJC%==jTIhTQ|6oO&%KiZ4@DkKK5Q7g#mX5T&<@&XW;NfS-vifXmH4YI+0+G| zqviB)NIS`94kpHOj8b-!qr}g}=7;;l47y?~StSIQOcl5_ipGJ1ulZnMj=g`IE?WOf zXvNl}vZ2D8l)iV94opWVtI`&^)f~)wR%vD9_Jqj-#W=}M@ld~!PKT0b)t1ash3RCx z(uH$KArEesn1!8$#508XuSt9Z;EX35trlJRW$03OVFu>H)RhH47u+P^1lf+AdxP@< z`$&VOKW@ua+cu0NwxB*o-(>zKmGkZ!qx8AP?N^=Q38J6++^SlG93NjV8gvo(_W1Ez zd)r*QxNgzd`i<)?eFG-o`tk$Y6=hrl!$a20x@2?WD2RJ)R|rI}35Le;x0dRe`;Jkb z8@YC0eNUFV_F^}@L+PVYGP)Mh(ruE zL@g|~YUR7=WMvvZlrF5ue--P;>w&wx)TGyt=HyLedlNG;Od`Bs+a7z?k#;&Ey0%4z zMcr+Wmu9+Ho5)kU(nvHBDsO^sTlJSYNwn$nj>RTogrymI*ue{=JKUPU z*waARA~uezoH(02v3!bKFF)x(XG_hNSHIrQ$EG;254Dfp z>1}nyiR1UgKyJ57KYp2UUGFu6DZ|_VlT4A~cTO>>?d=>7+eiUB)82qVdh*Q76Ekzu zCx`4PCiicoRmM=yCI~oenzky-BYG3RYYRJhDb!;txyqTAclTM9^(FK88vKRv%83gx zXEW;*JhMD-H_YpE9%=S8uH`$vNXFd>alYPfv$_ov6-7QF>&tX^XZ!Z-pf#%1{O(1Ay%xuCeDjkC zpFQ*JgQ@eg*2%>=yfAUl0CiQ%a`HS1cDyDWre+&G>n#1Ix)Fx-%wr#s_n%6)c-!D0 z^=1pInB{T8Kd;h5+dIA0{Cjq0B|uY9gwaB7m++JGOW~abLb#ci26tvwXS1Rbz^|ll z-F9M9>dLn{@d3OUaWj?Yt0nTsYkySz`h-RXq;gfsYkKQ-5AU0L`{+E=A_C%|2*rf^ z>iKAh{UorKm_UY2%AaP(vxDoSNl zt=dGr4YSn6hvE2s?l_8Et}CP$+BH))I~sfHZ1Hgd8meO`dqu2NNoumjQm(#iEO2uI{<_C-nFa+O$}L*_h0aKPVBCc z%L-tw-queKU)J#wziL4j=&6&$&?lDeOt8=+XP@JfL+-9?40X-L;U!qRwiO1Cqiy-v1kF#HrY_4EU!AHs^oASuD{t`R23HJ?rVH8T7*>c=JK%u+t39HtP zpCJR7vq*uyetM4WrbDYk>34#wXQO*igjPtW$hV{(yQOan$+5O}%P;$dmbxmLcDKgz z*#=EaOg;ntV{j*p4t_DB zx7u`&@O={swd0VcUg|KTz}b)7vc$^!@1$qlmd&k^`e@ZY2z13B~vujaJ2cek_ zV8;XM!S4Hp{lTaJ>eLg({7@b3_|YWV+|c;ZOOV~g^$fYW<-P5vyQK)mQ0l;T!|GUn zY_n5hfdO|iPDdo*>8>ep_)$oKJodJ;J{C+ad(+||R^cCv$Lae5gneq_ZO$AOSnPGFaC@?waO7I({=PufByPDvQEsV~7=1lhN=Y8nF++_`R26Ku zA#idUtA4R_4^?X&{VBB;+;kyws+C~-z)0WE-U9RLs{5#$JCpXHf8vvdrb0G#gm(B*vZ4DO%PkqLM-A+p!%cbUpkp^G6j``_y0Od)uj)yz6 zYG!4Lv33#&aJ#E2v6Zod26^;8W^NA`jvl0X^@Qh0Sc4XWVIT91&=J*IPw<6yT0`aB z6QZdP2OlSO%ype1W$J`aoJU%E>RsS7ovYZ4R$l90l^0Z$gOeFBmN^q?Jp-KS`YJkFT4L0#;bGSDB?H{H=Us?r!y^NG%Isrf655-%; zNPMv6A<8h&x3fod#hW&kf9R|+;1KSJdMuVBagW)-u{46NWYo)3ygK})SFm5;Ep?0J zxYWw3qR*CVGpAew<=ZF}YGS)A1ni?x%nOI;^Bc#Q&oOg`(6Nv{OjoSSYj+Rp-qh68 zR>6_p1q0kN&orp7sOeR@wRZ?+sO^h6Im4FcjPLH9hpY{p>j|ufh1Qv_JuckzkN3^eBc{Q2{ zPiFz{xQ}14@FI^i;HV@X>=y;N!<$Pi&4#5$77D!;;UV{jrdSH9@zU6K z+|b-x*7oJb?F6pnEsS7*s_$1@ML9E(*q^UOQ~16gjXfE(Wk=tvAt*!n|I119pW?-b ze_KI>;a7%U(VGUWQO$QDar-M2U2Gj8xOcaAy=N>3pF8K&Fi)8$5a~mVbz4N@1Ts4p zVyc1Az&B8KVT{0y;xx{Eml4$d{=7VTsL{g+xdoWI<2Uvmi7U)`H8$Xv1I$#kCo1me zS`V0NNQIT?=yGnnn2p|MTpQU~;LtTI-OFe6F8CD}RjZa0eg<{8IeD!zlr`@k++p^U zF%C`iU{cen!dR9Cd~jbj!X1lROMPsT^XO}lz>g2|<5l-9de1UlxyGKcYW3o{MsS)@ zk$sUXPgQMg$!>k&m%CTPFO?CrPdGr^-VxjuF7S>1+@IX-%rh8j`bUWnjLB)bg*hqxC;V}t9pw@Go$F84a3Zdw9)V<-GmaUyH+eTH zePt+y+DqPz>nN`^s>o0kZfue)F&!^^<8}eom{h5%%=P?~a~8g5>LQGH&7f(8FOS36k}hL~TGq1ddLp z%8{x@{R*v`Pih__E>d}LG8(m4LqE^k$-R96He+Ds9#UvLa`j28E;@g{M~buUi1v^ zxhbB|fYx}zx-a}=F?dU&LqQ224D=;-gy2+wwal-xLu|YUEN55)1+|S|%<-pZf+_hDPAmmMFI>FHObtu7;S8*U{%W#6DY zg{^0?E{}}m>~EDKK$marGtcZzs4$KPOl_T2^j|bdKM1Uq82lq=`=1lM|M9mg{y<12 zXa0UaQjJzO&T@1ZPI^ZN8nUi3#DAN@Zp9=2IthO%v#nkTj}if!PQ@K?rE2^}tAkdw ziP>(4OoYhoCg@yAjun`H2^8@k?QpDbfw@$W+6wLqh9mbQWm{{up#cU#Kbl)b0idJ| zsZvux5!jXadOFX|5Bk+Igz+YnG8e$J6SOU}uCW0bLe1_FSD=AwHT*!s1E(|F(PP2n z5e^wYeyN0RGXWKMdIKO34;bHuMX3Q5=~nM7`GP2n%L|=3_eJKG=-i#2984Xrt6h$)F zd8KBkcaMPo5}O~3_Iw>t?`&{B7no*!(P`hdhqM=+vVR}J8p9p=O?!nDhx_rT_Ug{B zUre$blFnGgs;Wkh^0d;G-9w;=2aX1uaX4B7tL(jBmRuhVU5!MHZ+%nd;peIR08+6f zxXoJf%aZ=?ngf0dU&E1qE{2*e4=kcDl>rLP;)488k@lk=vo){K2& z(3?|FjFFB21QXAvK;4GsFuImO-ZuZ=GIEZ`6YSm&fDcK#=%OoxuMWa6C42 zB$OH1W-G5sSo)P%QRFohj|V&&qpcUMW~`#)h%yQ2CG@^gZTv*@puUSC=T zeh`VCM~@O#p|`)Mm;VC_jNd~Ws{>&2X`Z;$zt+*}p;H^1n@V3CafSatLGkzZ?d5f3 z|2S5Z_P6Db{}t3@%>;0|sO4DS#=pM{{*8sj`wkfTXq%n!KRzD~s`6QcU&~VA^xqkv*{XakRvoD94*(BxfXa_|6zwFNc z-%$THz?ar*Y=~jq^z}cxtNmK%biyhQdSKB;t|o!yu2kr^zQWh}k2@tRdU|w3Q@aM2 z{WiA?>~CI=Yqv?&_6TJJAyFj$;yYOKP@NN>g{OrFkJz;M%U>$JXN-anFj3=AM!l_+ zrh8zI2-WX9J3BON`EjQr-4C|np;0N_PtHfT@9ereNg~DzCY)T91B)#^!|^sdiQO!A zr3ko+{uUiW%w<>r#kZrJ|3I;}TK^g3*SJ%Q;-9aC_tTx4$5oq~EOlNB83T(tJfIuH z7{UGkfL6kbCAbly_$?mszO(5u>INx=j;(DU&P=~hCvo&pRP6SlrFw$PNF4=km#?K` zomtYbk>cp?=9lieFAo{@z`D*!m{-x2!9`mgcdD;J;FHcwQJ|HB5Zb#a4U0iJEn3yA zJ8J4GL3^Zedy`8ozEfhfuP>G(&c4oXJ7Y;YHj{mcisQ%FU8c%I2I^EoiUz8JbI;}& zfJ&*p0ye(%M7OYio5=t8arM_J@L1EAkkwKN$3Fz?UaZW9ML>S}w0xaQLiF+DN@|RL zw`dX@lQs~j110+6ubQ3QI!wC9)+fa}IyA%!_#kJYfhDJTb+2O3l(jbYyBRHq>V&XWNmqvl6`VO|yLWiq&KE z;5U8>Vk_p!#@LVTDmleT^YVp?goK3QaF9l#_ESLh{+&KmX`}r=t^WVJmll!=92v?F z-4p-Zeb0Uautaom$>`FOjHt)!;t8jbnB1E~?ju=Mzn2v_)O9lwBD3U!!1s8;ykFLS zo%B=Ss|$A5zZ=bx^%f_Av} z#j|uHyp^CgS69A&6;#{|9v_=+iRiW_y_{_3^X6i061!0{%%q+X8F^}Or3#G>f~$z} zsk_Mfd31Ld(fUyhpS~Kln=)&?ELr6ueBKgR}-t88(&rFo1q&sRtE_@ar{-SEa`lNNLp?2*d)GtDAG8LP@p+YO6G zm-Dv22WV$uj2a>Sp9Zt_D`&$ZZ61?j)Am*YKrxLyT_mMT_Lkx2Nn3+d{27y?aSRfl zUAfNX;O^nk39zMgbmK>WY7mFiLX*b#=l}8}_`jRYf4ju~d|cf=!6vyKGA1wbFX|iH zZ&R4`9&J4n0XeJXfKlnfpK21Mv&jzS&IzWii?Ld_%+OI2zddW^`Zz$Ys;aUkldl%N zE=v8L=kDg#mdN*}N?VqvMM1Pk)JQB9ZCW_IH&qt&Z2o6wE;sMtXuM0WBcJPtzLos6_WKm|VVy1#}(fZEaimS_MX~t-R z+eqd1Re)1q)L&h@tb=ytjN5!F{ie)M!S;h*kIA*Hs*oE)b#Z*9idiM%;-w~q=9K^z zg6?%P#g6vM)7&YgMCKPkJYOA_di#ZB8mkk}j$&93T5%K-pgXI|yK`4zKe4ZpLuk2E2=!2t8zBL*wHZL5R5%rY?gPmH-HbZO3i;K12Mn)X^rMWc((y$tM zUMzsdVm2tlX$QT_0q(ZBdF!Su$Z^p&_Pfw2Ouv!vw8v_~pv53`4^vj_uwdAw3qoQ1 zmwnZ3siA>>r}?pU)9XiR!*BX0>!+wZ?jb1S((h60Pfbj#3fxS4s_dnmEk3-?Qt-Z2 z4e3=lN+{01d3~9Zx9JMvn=Y%aaEW^;s({QX(NX-ShJ3IUWcW!Y6Jk<^+8=jSJhQMq zH~&(zr`@`zs4Wp6!q3vv>O1Fv&U2mf#f&e`OS^Ynwyqg_7QYT$l6_@9Bb4o}P`M8^ zPkx%n#d0i*UR{5yMElywH-yLA(i;W_>Nje9h3KioQ~aSm6S4Va3!I+;yA_^`*M|X% z!`7hG?%Jl!CX;$%fsjzEzeic0%#UxGTH_lx`=G}=nynJGi;&%t`801D>cd#0 zDcSG9zb@8^IO32!A=kp#=nc{zDBL}KO%UDr3GP06p#&TPAfa`VumPi?Sa>(Nu7soU zxa{C2c5r?7<=^))42yd5%L@^+_4$*}#GjjEtngV2&|BL1`rxmZ$TUc(=x@@xAe9{c zJw3C>cae|=Y6-g3Q@HH&$JULf=9H}4vnc%1iF7w6&Jh8>wTUQHxK+4@DEDST3#<6U z>*g=@Uz1`az~?|UVZ}LTH6!@pzDLGa3VOuFBEPoqc!oL^@sMNRz1|c(2#6Nl5Pkm2 z;5S<*uOE*)8Eo0B!X1{>XyGldnUUwT8oQ?8eZC^2qQTx8kHy;p9Xb1aZ?Y=@mo`NO zrTl$6&l9rH`ZhH|phw!t_c5#-L4_jGy@t@s1xXPadf<)Kjq}LsA77RAw*5$?ZruiV zP1$a>OAt@oWu<2h1$hWF`%X?34~WPl6uPPbbg7$49)hhw54D4|XFAfuc+d;MAtAKq zp{vwwuZ4lTCx&|PokvCblWhg=Od=?i(E90p*6#$|+zpY&SN-yBOJyYkLUWF4@oj1s zL0T92fQt6QNg&ob)tq4tuConKICqzUSn>G=)WJSkk)|vy{qgHP z$mbD0$-==!>s?6GextZ>d|7S5kNDZLPL-k>#p@(NjRMu_c0qoSTg_;@;C1`)z~8Gc zl6rGoZe8>u`Gv#DPBnyv8S1No+1acyvn*Y+p}q5bj>_RCASK@xT@=`*bZ=2yR8+R2 zx*~7XjEQ=r;&^~bX- zETMYjC;kVe*Lhz*t`C2vX*J3Jw-0dE!r$}9jTYaLKZZi(KI1wB)}6$Q+}emZ7`Fji z?`I+=^uu#X*jjcLGX~f_K9Z?4MauOfy_NT|xk>lOt_fXhb>ve&f5WogW?!Ko>NNP( zq<%ue<6f`{U<$OOqT1Hd%E<_NpJedWriF7h%`Mcu#}c;h4n)GA8g>~Pv~f=$J7C8} zb0RN8tL@y~TT9H}lxxe{_UFcWJMn{_J~gvowXLpz6Bxq(9V^#SO+r}!`goGS!VR5Eg_r=iBS~uk0t=?CxS1I-8kn3XBG-Nl_4A-~?LePY9 zJf007d>gq3o$2l(4<0?*vNg3%%duf|uk&J*S=7~9HHB=l><%4t^AnPk=}FNN9*;^4 zTQEjx#_TtQN22)QZs_}?HdK@7kS*nm*vR7264OdU=H_G-2G_x@do~{NNp2#?tYhzP zxE7loT$~+z7}p)E<;M}A`BcrDLuI9hleI<+EtZLN4D#+Q=^7EdDZcFJXD5756MUkq zw!VaF#Qx;LsD8Ub<9bi&%J9shsZ`tLiO18nYWgWO2jjD8c}hDG1_Iw7i=-_#F|hnm z!|H19BU6u@=_#1H9GlC#F@?!8mql-4EVmS!4O3^|j?;}qvd#cE3=WQ0ryEftBt#-#SA&91-n_ZPSRD7plUFea&xjdW zh}EcT(51XQ%y#_^<4=?0_lhOLBlae4FSXBA;;HxZK`Sb(quSjbcZh(hvT?7Ahk4S? zB&flTZ(MXgw%xCy5m9xcv{`i`@(e6#>F*<6VK5V*B&rnReS!P;i1W*f>q+{;R(4K5 zfV;ybrT0@p!kLIi5B#dUnKTlw-b%;5qAn zOAqlRCQ{HKnfXv&YvZE7x-fgK$>{Kjmx)d=qKCD$x^+|vTL{2iSFjwpkBe+UuB~q$ zZfEN=(&wEVX~{`>Xm4h!E1al*X1C`a^{hYhv5nf?>aV@I2C)Km=p=m9Txz1!Yl(2% zQqfdQRT=2WZ}vj3)jf^(OeY9|O$S(8co_8ez|KagG(G0z9B^qrva3{L#MDmf{=%<|N^ON!*gb zbc^lvmsp(O-sIVclG93;q%eH4fLSlbnn^E2C5@xiX>m*`eoEjXGV}_^6>7R##g?)` z;p+sa(;yCN{`=5i!`#uua93ztfTjr%H+60DJydmQaZ*9M+tw}QN}I)Ah8z3CS|bjN zq5(GR6Fi;=t))Ra&2jQfw^fDn`l|%{4Q7XSzP{9C5)&~Rm_xm7swSC$TyMu;ErQ12 zu{!&BTRG6jr%x@*@1w0_psFOiB|SC~XlOU5)-)y1J9SMt(8!+!$nhsl6XzLJviz;r ztO!_M`&`?n=L(?F1>-~cIac=}kim1z{$n16^9&J}6?~6GxJiPB(Xr!EGji5ywa1iI za_tS?$K~e_C{e_lBsBaflt!%IO(N9OIf}16dQW+Ak=u_QPmS^Sa}e2@o+iyLPoh|Q zY*CbMg(j&i`bs;lsUinvGt@9cqDA4?Ct#w5KeU>R1FO=|@^60zs(t?s_PJc2ITZLr zo32v<{nk2nAoxKqT)1m%__L}O_qsSIiryQ_$@EZR*`r#>149T4ou-Ftp!Vv1HXYrY zw55I4)LHlP)+8b`j8FEUUeB60DT{X17P&4F`5Tq~0Ra(f`S176_M-2~pZ8AOmzN8g znfeu^Zix_YJc;$R-4cYMcQC)>sQ-Yp!-IuRs^mzBm`_?CW|aego^8u$)II7U)<@=< zndQ(uxn?B5xmDTUmf%1ONAORg6oOg`IBd7FC~%9ziT6$fLF2!)@*WHwtP53D)mo=H zmJ-?tqFp+E%K*95&bq4~STwptt{`LaP`^50X{yOs-1y8^s0MoS9t5^JytxL2i zcodKUl^nX)7$^ffX!Q-yyvv46I(?nCw(QwphX*K%eDAr4R<^mkM~;HNM8kes!@Q3p zbAfRj%gc??Di^WVL3>3AD$JT6@P#gZYV>+W<$!=>=YMmmIbLppajDI=k=pmphEox@ z!UG+SU%v(xgf)I*@zvv`my!r^l+lr3rLi+y8RwC zg$sL(JQ)KBOpZZV@nbzxyWK3Ohld(>o`;fLCBhFy9G3yxQP-PbI!Fj1|6!VV@A>W3 zeOQ~#Q%owB7^D*J0bZd3WGYsU{)=adPtIMSt{85ybWW<=QL`dVV($XX^{__U8E{|A>yetJTg^n$Z2dWtU{NRCnD}Q$7 z<^c#w?xDB%qm4u-6((#yw0r&Myoi7Qk1cH`k3IVp$6)B0zf{bv*MIEV9yI*sLEp9< zy+;B3hX`@ZF}y0WzDgc!p|b+dJ7cJ1sl!N%E#z9Mh1u!eqY%$vpPvpJCWeRFj-G0C zTSN?)wkBSe#t;@pfUCEsN8DLuA0Q}GKWCSctvMm!kg44pL!#DASsp_pqwkS^E~2qh zlgL-k&ok;_oepKG-DgZ7C%_eMaBKDVuWN(G^5qJWy6sgB^XN*%v?#$FqLx$osp(UE zK!9!y#Am79Ea8VV{pt-xoF$YG;@w5=Ve%e?9oIV-%LTn>TWW80$rXfLmAv;p=~U5H z5G=kWS3)_lh}jd$USL$@tdbe*S*pbM4F>X%_no!7jn%%!S5kzu_p>vZ%P0>o9!00B z@>no&np(dFxu$1A`ee*mUZl%Q+n;Ct9)FtS7DRed355W1>TJY{Cc4fkiceDh0!w+u z7#>p3o4r2*Ux@gyG~ZiDULQu1s2RBmb9322V-rCXLD!#|z?RN7m-StL*6CpEoguT^ zjoQ2XZCBKIwph~S#91VTL3=2WNV068qwxsT@%36guoI~p$PNZvHX~u8Ze#06%?Kkv z_VSWVJ7$*g!>c(FmEOCT5Vc-v=rWl>cjL4ycy--kZmf}lp4i{arexI<>%OlH5!|{u za8XMOA3)gJ%QqVVqT6Cde7NsO1LH1ZeDhgMNebj9V|SFwJDoqrUliiuR_xd>RY zAXlP8w>o#`u19d@*c(_!dSGq+)wQ`39H4cOb{5tsx7Q-p`%dGLsu!qs;3b15I_ur@ z$SYf9C+h9+1H#W*kihDGY6U+sZ7a9mBgzrdsmATTzl^WrVtogF)^hZudqQd6N3}}J zA>~X?R`n$1gj|*QcDysaZy@MNg--dv>D{lQV99j6sO7m+%Dp=ve(D8HBPuJudZnoW zG!JB{LEcb?@wN?ZVuFNQxcGBnEc5%?!QF#LMbN3oSvv?NAF3UMi8-l7r853Y8DX_Tn{z8v&uTi zc+k5G24C9&_KG(@!qcQVm2G#}&E%|t5AJiV3|4L`Bpg4&ifa(>h z)fv6YdlPG3+B%b{x*9Cth|2_o%Q^cyzNYJL07$Z*u?vIuDE%PK&D~8zd-Wvfvosyg z8P=jS%p7KI!h*H@ieTMH{|j;ain)}6-d^hnFk^Uv4yYwLk4dk*rt9{54``@il9tzvN14Ox@UN0|P z{A%KZ-seJi7Is?73tL zf=!3BT>nO8?D9Xwm}3Ho+h4wCDe_-t$rTg?L;@o*wl`_hBxK~XsN?FvT*SG>V5#s+ z;Cad0CXasF3%BtF53N6H{dk#+P<)w-+qTgB%w)3U!~_Qx!YVrN4e$yg9tALj3~%4J ze$*Rt-=uuNB`UgGwg&`LNXLRddaZ56+wgAl1k6jN2xQTHY_DE`8Ft|KN-QwEs{D<; z?^G`c3clbpc=tY#+7!j!^3?dtB>X8jsT`w!`u$sYyX0QIG+~3K74O1`7rFQH!4?_U$x-jgJy(C z$`9mX;DCllnZJhAF{CmyuUU{6WWW0Cu5=LD>e+!40*LeX-Vw3u?R0;4xV}_$jySql zB%rTPx2KO;6DoWq*3oY>_aGRsM~UF8Qe~1mrVX}}1n>q@?CWCD2l^t$=)z%5wX-KF zcMU~k;&3*x26pTe;qYJ2DMZ{%90fbN5}EXZ^)e`tf*PNnvR(IG)prwdI16e_R!U7z zeDj(@yAFZ0(nm`7@2yxvQKXizBU7B(zCmFdAAL`eI56{rL@TSr~ zn@=f(`baZ6ZAtn1f%aU5qT4yyT8)Frx%u@UsC_>h4Dnmcgut%BK`s;l+_hDwR&>MC+CJ0+L4uS29m5Bu^ZD=su;42GMrGsmPB}8pg4#ts|-i`9W zV~HcnE%c~aShbp;C$zY;2@ke>^*ztcCgfJg(AI6GVAA@Rp-p$CkaGzKG!5H7Og;b3 zjLJ3Agvc;B#qwy`rH8?KG7vjF$F}fT1eB@N7QGf8k z3h|&Y=gLebDEHCVh@`HAJqd)w62;iF9)NHyF*b#6MWU`%_4O`5h`yXMG+{V@1!#la zv`u2;`s&a(L?^I>y+#YGBZ~E|f!3XXG#}`8N>pcGE>P%A8gto zsgz-Qt$BVbZNIyr%zw-;G&u(CW$aJr_-a%?9?mQ!W8 zH`%(Vl(De*9KF#|<&XE@a{UVj```SA|MWZTc>tbL6j1&XAN-|!zPkTH6v{|Bt)G=@ zCh)6w*~7G)P|@7{96lsz(l9C82 zVv8E2ekF1AWc%X~YPFgG3i~>-q3|Gu!%>*Cd(xlcEho46H2>3jYMAna5B=7eirsHE zRu&jR%Oycf_Q#~(NY2|}K0(z8VAcM*tq?C)`ZhQ%;Dall(u!S7yN$K(F8CzLcok6L zn>;S~C0EtFN!%;akSBtAxVkFhKDzyNkp^IP_y?hOJ)gh3YvUW{ufsrko$Y?2TLqit~6l3XV*D#^n?Kj zd&E&t^Y?L?jd9Z1y!?C_3s3cwiaZ0&hmMb9qvPF}90NRj-XXRF@0)w)+!J|E`CR4h z!q^Q7-gucz>od+SkDt9$@mh-`GZS)}q&*LFcM|?U`9ur>q37@nzVeFt;$a=LxuMhi z?d)+G7x*yYjiawR8|Ex1%Fw^>-Th_%62KILS8M%+KZmKEdvFE3lJt{xbGI0M|DM_8 zAy)G(r3$nP)jN>LL+9` zdoP5f`qu)JFKLw%M1CKWo-G%;2Mi`F-%U|C$~yS^VI|xBlfLSsP^&qII3l2g6TjA> zp*r7g%dy?^ta3=9s;msqx46bG7LNdp9apl@+x;-lZNCvpgMYcyGJQXD+zjrz)iBeX zGy!w9m_(U-ST#k}k(NhdJGYeTt1CEmS6O^(+^XS#lWP=6l1kdk5@Fp8W7HbD%mG(|FSO#tK)o-|0?y#X`m;t86@B3iBgGqRzGrWcll>b zt^nYY@j<*@8GLAx4BZpR=il?BxtkiZdS*b2o9VyL0fIv7W>yN>psKHjj=2Ub&IKb zbF63M#ta*8G>y;~R8Q}fH#0FkiMu!?3q)Xwi5HjG?*;|57A|1eUQvB(ecW}uBR-+I z;yB~zX0pjAKP(PyEeEQ69stPg8$Xq@N$WUN=$Y4paYi>%iw8WSlLL}t%Y z`W&1%>m$$O>K`y>)?Vo^Dtg6d_#ws+)15ZAREpT4myOh>2?^a_1`3#p(l>+p?|i+R z=<4Rz1`6G%$lBkkA8?gXlvZ*k*|y3`Cb1atF=fxr&iU&Vn_Bn^z0@_mfg0F*^FzUm z-m^l5u1=>I6IsGCul6WHe6|mF@2vy^?1t%`{VJFu(JMU87aA;IaxGOS$*MYvD^o0O;x3G+(u$)%WEm}JiOncq$=4t zKZ*oPt6=Ty!_tqx{FfI%`}rMq+Jzzcgwvu{IYUvHYHN(4VLC|;CXuS8fb{Sp8?5H! zdDp&-lB+*KvW^K`x)Y6sx{>;Cz!UmvjX)ya*x&|G$xyMI2(!l4HkKVD?0loRxYl>3 zAGB72rAu8q=lxLlL7&ls{KrM3`Gg{YE0fl|O|u>^H9vgIz1r9)ak3}vq`H&xps&s- zRMOGfTYc_UMP)YFRe_jqAK@9BVwF8eYi*5?OrzMngNvb(;cp$v3+FXt@A=5eYRO_h zUzp81E*H{Zg7^k*v92wtqoD6yE|9wJQ%0Wn zORLoKV#lAHtuKyOk~BXo!-zqeD&J72UPd?V&X5IGsT((kRP*edKE8{-(+a-h^HgPm z{zVgTq(bb~5ivlgMB!hOR!k9+iQ0PUxT_<~FU;$q@@;&xoT*D&FR#0gRuDvo+;lNX z>P%Nd2p+miL8(p9?V$iooQufoDg7|Oc)(sQqJGmgSHAr>@TJv>UHX){d^SGs!rMIfrwk0RpBkXr25DZ(z0;;y2?(kYy#uIi9C>c#x^}C#6ZBh4`@* zHhdsn`RJ>quCsI7)8~;RyZmpT80Nbn)*uH_V#k+yHFQT~k4STL5B(ZNHd|Uplg7;5=&sU0b4cUVPQR8SdMgDo- z!KGZ}_Xt-CHF=>hhHZ9xKH0abqS^&;Hc9Qu6HCL7BqOsLNzYL8_8#g&6a!a5mi`(w(OL98FLABBbNtql$SP#TAM2C;Qe&@wd}6J~huJ~X;=V}*1#R0*AwtdXg_Ghd9p zzBWY+L0>n*Qj9{yHHOfV_SW-iBfo__3)l8dbW+C*dK7i-}(YxIdS+PVz)|J1v1RC}(I#mh$)Rw&lz#yhZe2c# zDLKOH&!qk;COknep76u!?%9~)#Bs-q?J@v?ZyDQ2<#4aF2DlwMW>4M1|HgusZg1mGF(isb=IrRt%*->5xG8TA#MZfz&JzEzcLh#uuB8opyt&9aZng5k zBx=DzF+2PAm2~>%cJB^*vS#?Nt{+y)ZHjv~^y}}anbu4G70Xg?NE~uAa}%2g2Ae;s zo+Zbc*tx;soj1&DbA~mpwuw%~a$!HLH=r(v!N?O`(!LBbd>UimK?T{O+b~kDJl)Y4dP&1+j^mClm z?bOQGie9X?KpU}!Wt@!AYuuUg6}a=VZ;Togg6&@Y@h(s;Zp-x zWzEMo^01r9FSTz6LY}W?qrN%18qmi@O2xR*%X;SfX{)PX= z-g`zhxvuS^q7!jOL7fIss#uU-lwK92D7{E8A}A%&q<0YkrK(7g(0dOp^iZTp389CY z0FfFXv=B%L?02rY)*9oi@$Ip{@63JvouA1d;mw;T&vW0`eU;HK-yLLpcMB2Q8~U8N zxVE~llOWr>h9Ov(& zku~m&rz1*raXFualIL{Tf8RcgP{@#V>lCzXEdJV-pP>F6exq?h$D>1Gk6F>wI?9~0 z0MIzT0=KAf-&%+|y`_+c9v!`w`25l0aTq5AfMC|R2Z!IR?a8a(T@;s=we5-1n34*# zESc!2WmlU*fRAsCbD9ZWGVUOaP6RQtEy;1;mu{=zulPhxS;t#r;kX(^We)fV=idbRW_jv4jq0Q zyLns4c*~1bkt`sumDS&sg{p3e10EazkMlsxF%ey%Nqun8y904 zI&=qFXlTZ*H3IaC%gG;nJ#krH9OOqQ>?|z5heQBJ#`{+YU2N5i*LI7#@YKtOAPo-O z*thPq=$XmMisyZBVY-<{iGcBMgZ__#LL+~%%1Gxy6w0>;FxJ=OrlNmJiQS6ZG)586 zttsoFU+T4gaf|V^^%!DKP)UY*&OHnw9DdaU=jc?h5CqbCEJ=x|N(_JlEuaNqlU*OT zb~L;E16m01!+Qr6pILIn>_(YSx9-IcOYxj6y5qFA1X?qwvX}jLj+T0M2$icop`i^| zCO`dn6d@Om$J(S^lMmNb{$32?fkWlJ8yAAuc`pGL1!^C;ju2a`9{-y75g#$EFuJD%f1>c25XhiFKHx9~%DytsQcJ@0FWbioDRIdJm)n-M#gtplB68utPM`bZ%89o}GzNEwz~PDjg_s~fiCD=!%ks2K^Lzw|bL)zc zd3)Rf2`Y5*oleUysaEk0`@8L1>gqJ#V)UjQ;fQ_t0}%r{j#FxUYsJI3RGkgmfs<|0skP*?B}MutDcg6>k%ygALIDc^j=d{i zd!%Rcz1JMiVe|9+e<140{Y_}TmH!ax0IA*WXr6&EkhXeOGAM^zbC{KN%P1>;|_2c8s&YWEM}6KfWQ4m0PSvFRrk3U!535@Md7{4X{Za$_@LwcuiV$N|LfbCB5$ zDz)5OXJ!+ly-!Mul`zd%QMxioNs5bbz2)_<0Jw-d^XU0J3ozZbsJIgCbDD{Iq} z|1#(9yrS;@tokFj-VV?XTPeA}|uYL52lX4;Tcp8ofWKov^E_+roYC~>l@ z>^euhP@O4C?jiGOfk|z5bzLwasKayA7xQKZvf=jGHA}SI;K4nt=9HIWVY>q0(rWUw zoyltCZ69}irirzt@+(;&cA`4s^+D6&jq2|M>F&HKX!f!CnXV3|Aj`^4sg>6!=_rmk z6`wOJhG-t?bkqzqOflQ@cnTKiLG{NH0udCBb4!3wtg|+o{X1 z_N?$QVtmu<2VzOw+udbT{v_zsi=)-Pj^aE?I3c`l!W`lDhEBECm?@AtVB@n7!Z@}P z{q%R@%eM6nTLU~J?|`HLQdY!`k+RyQhksv-v?UQ@cKQb?NQUK~-S3&Rbhqaf21yk? zn~UrcGLwe4Zd->bp1dxZ9j54(-br|d879}6_U>I^_pY~?UofQje3svP)Z4e7qSc#o zl`7uI_I$fS6){}#vf&L3u@hScW9o2-i;J5c+qeA)XJyBKg)>dY0jwWtVdX!g(*R{;#zmjp zUn3ig{uD%9nL)AfQdm^V+7T!vzG&CzqG=UusGD?++AR0X-|w zU*=@_ZyZ!1rx^$t|F3&}qm+}9zS82-K&wij-=4Z!K{wL3(k&*`c0asQkKK-8WWfJm zI#CT+fMAalV|6|VnB-K7iljJbLS9RbzNvcp{^G|pM>}|zsc?Osx%S2-};wajeE!T-waHMakt&& z2+LR0&_=2hnMXDT$gi`k=M)q?l%6)r0W#hOEryEL5}flgfNX2mrbkXrn!nr|R#)v~ z6tk`X;VHv~r0MDDnaj)9{{E`>YB)o~)zo~hNd8~*h3#8s=|Nmmb>7;|+dn)!GXJH@37xU$e$`80hi zBc?Qvcj2fEZHS%bd?*QHFoaS$9wwvoMp<8f9gX_?)}3wD+<)Ha$&#Ai|25dEk9uSw z&ykk4xwEb=)CqV$Tk?VKm}rOGC4wZ1VEwA9{$`?LVk)Eg+kaTqX0^z_g~NHqYy$&v zg5J|d`044CLNwgbQvh@pmGVg5ik`3N;z>N-1aCGS`ZuIZ{}|J_Hl1l&bCy{6_g6Om zo$2S&+hNQ^iX~~rI0J9gK~4X;^S9dEe+#Klxo1wjNhsU85$?agLjGe9Nsk5=jCS|; zrhosp|2x+Vgpz0g;hwu1UVJfsjTiq`;K{#M#9w>beD4L|t!+~q{x9$#|KsBV_nL<5 z|G(A$zTf|!-s(pu-`_C)b9v13TsO85={La}h?4t03285`gJ!TJ;}E<(E`#ln{eOQCV`Kx@Of)c84P)Z~527BwDZF z9dYUHC-yp&b^Q8PCy=Rb@**(sPPrvZ?D)&4xEe45VKIzFvo)A+iC}%b&4XUPls1g? z6NHsImhnHSp6IWgNc_1{a$2+@wUwlvCO^|upb%I$bKJaj2ruT z_pd$re>(a7$C^dK{#>ap*wMFtZVDkBYA<|W-ODeqTb%Vaf?GGvH})hy8H=?hfxvPnl$${H8pkho0`rs1l`(I^)hog@halB%~!F$#*kWARu*WB z4*tfJlAIc=Z`T?%)eyF-|Dyei5=AeKV@WQZ1Yu;n;O68b+TC3MRug3s5YXg_UUjD7 z!sGEGtra)!x5%?ufCL>OPO%{&Cxy=o+v54z2N^VqW7lKA_S?cFtDzLJ2hvxQ$}KO~ zRl*yjrf1ADC}-j$C-y&ArR{;}ccypl_LIq`0p2@~pv3RrO+Fe~`EoWgMl1U$!3J(gg69w zA&bk1AY}+Yw>c2;_SP?aobSn}zk6!QmIB|wWxk(Bf9)c(1#PKk?+HRePd{D5b{`+V z+`oMAMBgTmbyne9xq+Vjr%?L**RQh;_*K;PInPtj*{v{Dtisg0P|BO>hrx%tyU#%B zl6lAt%yFv=;n5}f1J$gd?J;GTUv6VNXfU8(RBQ{*~eEh z92VEz*=gHM-W>*?9T^{Y>ydd5zAG#t!EwLkkZYRp?(pc`O#*_FfA(7X#<8W&$G%<{ zRQE_h1Ry+}F#1^J#2&(zcC_uf$`oZT_Tdp7KTZ>f5!9Hp`|d4o~z& zjtmE&(97BCHrDoq3PCG&9Jy!m$8}_0{5T82<8=++ zg>+mtG&0ID=2y+D@~Xa$5k{EqdUt_e=<&e9B-$bUB1?4FT@}DldCA|?;>_ha=BAG~ zPXd_Liy=j+>t?)0>D|0rWa%r4wU_;FE2o8oWbe0otAJxd6Z5J-fIhj%+aE`s$LK>CRqf zn)1`LOM3U@B1%v=y>D+e4c`F;)`H%6c%|A^F zJIXu!H41y_<{-7}*>H%+2tL%YncB;&E8rv3QNX(u*JB)Qw$n8o4j`}w?^+%kz{~|ntd7IBf3J@60iQ*YVt=S|{uKM?`kQaKIypJ1BOGd(052>m z8b;w4P}~=0+Uhd&lqm0Z# z3{Om?E-QO`+krv!m%WEAf@)*X6BF6lVjV(>Q5Kl2rd%?+dkILm!Dr1;Lks!DKB$#4 zQ8GL|!b%|#V%`>k-S?t)qE3%>`C;YV$3I?bXrc1om7lbvbJ)sF->WgW_U|+O|5YWn zbqlD@*<24n|9G2_0*khVn|RQ$+GA!O4cx?)_spB7dO3_iPB~$k}swcQCrInhyLK4V0=`y(75)20E-{T9Yg}ZMre{?LZ7Z+f0rHJithWj z$fe1E=*#6L{RIaNF*A%axk37K#ZGUXM%dlcjG*h!t*q+iiX;@8y3k@H_X6rt#;^^> zBs%RvF#IOQn?#kv%$_0nCpg>*)MtxmV8Pk>GZ{$`>&Q+P;(}gkfesG?)0>@Bx9S4q zIpB>}PMe!RTwIK`Os;(Eu$_Dlb;X z@-|kGz5n2TM8YMopG{_~gayIbrrr;|p3&R0HzI_7%5fh;)h+RFit{cGo%yxcu-52j zQOG>?6sMEtCr9%4)Hr&`K`D%i33RFJ$*VVgMjG6*ftBHvYvsos_+5u$}e5KN5bj1|I0Q_heM>`Xj5yQEsKu~GUfknQsLPxrT-Dtk zx_q^8UwCuL{BQndrGKl%-XnR8#hCuH)oEk~h=~GufBJp6h z%5A3mbQybEkep$qVSTlvq@=PGz3wPt==f}BEeYGH46l5=Km+Y3oDN1jSdS5hyF-M- z@Lsx9&z%wY;nw0fU_7lM6mesWNBBi%>-~n41DC+hih`^f74TfhsyS(V#VR9`cHG6& zS1iShd1;y*#;(AOj!>;jKQIomGB=M6rWBm=&|Z+dH9r)B;Q2N$kr8+;N0Ao%n=^H)6XT!HQR?FY((vdW{a}i0#Is*4yTjwdR|5krc1~top1``bZEUP()+Nup zaCYWAS$9#;a)0^EW~dhgXAV}qyoII~KNevg@#f#c#beWBF0NO1EiIYFdL}rMJ{n0t2Oq6(C)l}79A1~se-w5;Oi)xzyn8{3l5MrOI9F$-zHoP{VTuBW z+z~0;4%2Rxy-80b?vVL}@`*oe_I`A!7Z)fh)d+fd)D)mOPB3w!WZcdkcT{LD5U!d$ zQ3}&af0}e)my?5Y;HQM1Zm*m!)$Y`K7YZSdG6D|EyW2J&>jSNm$U?)(Qc-eB`gn4x z=9e3A)780rFC;9(k==vOC%deS7?L6iBaWcrTTfOWBGbly7O}UIW;j%=T)h39ZQD7f zX359>E;i4IyUewo&YoViUD`qWgSGDc?Z!-=gFrwm?kjmS4Q=(*i9IbfQY0p4=V=*I zy{o3%f6hk}MF+E+vq-Be%X2R5c=2Wrg7lm@TmhTsu0)^>;uhq~cH|HiJL%opFpQiE zyZ4SeUg4C8?df}~OT*daAp_ey9p^X}B?db~+wxSO-&c@<^?7-`dC=!)S?j2=kDpqu zrF{R@!pfF0QVo%mlQ=f_xS7z}vl->bE?<#L%)xcCIT9l^y5dC0?>nFp6@ zWW1p#XjJ3Y>NyiL-;yqoZKeP2okYIOuMQfzrDrB+gH2ZBOyo*K%J;&u-mcv*R0kW% z#F=X@>0TAx+r&z+qDXnn8pd`@bBSeopfxLa0t{N999gQyu{W2kwZP7CH~;Q$&eGlk zpYqdsd~xZm)Jvy31m{Gl0T^YTD_|g85nf2ZruBqRMv3Vpz@l4hB87maA zHg0o6R%$_BusF`P>DL{{U-BtG>;e?54%`yO=oupVzdeUZhp~_Gx!%j@?>SynTvv+A z*xmO7y>qKq1m)=@M|XIL*YTCun0Th^x(@!@kACky){|r7pdnLZ@)8Q&xE1pRr&ivApr2iy;uf`DS&)d6CVD=-i$C7J8LMX) zKXV0DMvs`NyD4M_^L2N2n3b9Da_{H7osKqJG2Bz*42!TuZ~N4Qg!(6ny|yqf*l0PC zM|#(-sTAoSb`+NrDqHn;q!>VMJN0!?{K(i?ZX@HUolF{Zi|4c?{hFVYtM%*JM)AUz z4hT06iP-Bua6p%N|2+7T!Q>w)zs`KiOGrpgPkq|XVk9#SwtrAE|B*3_!e4T-WIRIF zt!$WH9J)^;<}e8F7#G^pA2fcxIfLfp`d*EOmq9{9zeh^j;cba-4BE``{qTh^HC!l2 za}qDJOQTWDSq?HjsgRV^G_XmdzvL*MAmHM5U%njjmICk#UTOWk&h0>Vaa} z+extp%l1Y;wF42?e`@CGnW($3k0dOBvvJ!w_sWjET-%1j)ga&&v74hHVzKT=l%AyU zs@6S!aZ2FKBFdZWJo-C>VhqvjZCc@D_)2FbtGKV6X32O3aW{kf+$|7aY%;@V=^ zhApJCk;_8I6TKen+93R$#VHxi^*HB(g;m4G{jdO^iGVYx^w4iuc6krt)v^oP}$ z%3*tZ%VF7N>?f5l&o=_O{KK7LSWwQR$nVCZ=Qj>w4_4PU^lm)1kq*#+&e(z1 zh06$l*ZB+bEaw@hM8C`xzzBW)PMB&muepsWB^#ZSNug)hSGEkfAc$7I|I*J{kV`%- zx(@3n7Uq#FMjUZnJw>?Y6#uw7Oy7-_(?? zPjkUJ{?x(IVEdDzs5|Xl_=M-x!G7_*v*8f+%&ExD4tqIg3-ui$oJzcgf6ONx@V% z{zK+sBRg+Zzvq1r9?@S$8L4XRzqJ%}Twu3zbM5=q-4!Xm#+P&_tnb&}(dznIWcd~s z(O0nCJ~}pn5AcnQKQhXlQEpl%CaKJ=h+`1}Ane7QRr6g&YTjSGnq~o=rlL6lvwcNauU)$~T?*U2;50~@gq5IrJlPcF z9>Uy2po%XVn`CfSCsD!WK?WAjU6>*?B`+*=8r{daoNkSRb@X6Y-f6|esDxelwFd`f zHIz3>3#(b*m6pGVc*-=ntI8|{V%R3`5gUxrlYGx3Q#kaQBOuIl4Agpm)mQF(Vc1o3 zlmMzI&_BXC!z@En#mG*THTWpZfQ1e>hM!c4SxHP>4=6{D=ejv&fLF6#+>A)H?Q(K- zbky1Yu}L+M%jcpE_i1h_<*n$nX|C6!r<&*rtAd7$*aK!VPMn`Cu%2#dpXv|r)OUvP z3V?1qj;D;wjeb8X@EWd_Do?TigY_14a!(K9P9JaFTyI@67uP)S((v@`O!QAIB_|-G-Jjq7x!kv-#BYJ zZ22PGD7AxSYrRw8+N!zP-Rb7STbaIe$=sq#xHtv%vIE)eV`n`qjN7N%2|C(%JdQ3{ zjC>!?z&@GL{d&TxG5Uvk;)v|=r~*Y9r1Q2=UE8IO|Kf0#XOIaEdyrOaEYELG-CrrT ztAtVmv(D8%m|Y>%9gKS2ml<*}Z&zhVa$_@>2H##>iN&8tsy~J&x=S$*vf14^rSZTZV~@#BuAr97)$MDro+wOJJS?=?`5<{$sog3UU-W#`WD&rNW) z?ool_<5<>dm~aTWrlCO@nnL1jyUj-%_B`P5#H_NhDn-w1?j8W3IJ>(qbaEpH78YnSYPp9LPP-{#HsMEDDLZU%}`vYfFx`e0< z_e)bw4yz1lmWS>ac?RY;ff~5|HUqKH$o_-Ujb-?buL`s;>3U+e5+?`4lb?|=90j>{ zyzoVY7R1kIkR^x-+FP=RxWqV*iy4{C87LGW@%{b%JU??CMqj_RPz<>SaZ`boSYUzn ztkCF2TV+nqOQ6kh(tzpD^*ct)5c9>?+G4=b>&z3OhRlj ze<(@kYop(8ho8IFGED7ZJij3Pd5;O!Sv5N|W2#r7rp3}^<-gSRt2Y00#M)ZJ4Rk(5 z$ny<|ed^)o@~L9^S##F+i$SGNIl0DNScQeN-0w4r>lk9e;7hK@c{w0;2P0!8e@V4A zmVO~iRtAb>CyxB{NotepJ@lsZcaZ=4Xyd2q-!lnlH}cx8#gv$t#z1ydmzv&SJ&=LMOpw_!|ksTz+A#verUck zD>}>yCbu3NqBi^>>k<)n04*>rOEYN@56W59Tm5wQiRczDXwt;kct~O$;V3*asENxCCcD_uI{d0-DoG3znSC4bS&rX$IGc=9!7_Z;SH42Iiy zEudPWN(n@X)`^~0H7uRUk{|cS&oU>3oV#1KxI>UK(0SMWDA6xsiN!KNy@6z_PH~bm7(lL7+5OCaU1jvNf(Y@d|ziK`BG8dPb^ZgGk z87>srTf&^aEy8g^JOf2ad)a0gFrI;z_vEQShEeuF-sc2gTCu~Wp-XjCT`+W?S2)ik z>luU7TOPj8J=RheSwLQ2_WD87Yeouh1f3o@kKO2<#u1ts%6X%g_NVqh_rI$_fJTo) za}xur{I#P5TG<%R_GUP)6)USqh^ce9+Fco8|7rp?)1VgLuVBuFnKLEV%OkCUU#my|4i zj<4^i$p^pK?=r&XdBhujZZZfGq=8^`so9VMrjsO_~>BjlJFFX23YWa-8D9Z4-T zEDzm}yBPr;TMLBv9_8Hu9j?Y0HM8S=(Rl}wzjbv5`tAP=Ig9{$`~9Ysw*~2TmJwS9 zvg@O>v5u}WaYTYMMa%t1k8I?k*`WzReh=kK>%>@dy;0z#sa>LA(1AM2I&SW(?~cLk zjul;8BV1zOES}iW9s2{wA*eb z(Ylw9+kAFit-@P77__-+@1o8!UjpqYVIi;7JU(6QD%r^cih*gJ5tUaitC;4;Qwl<5 zrS^9Yqs9BJ)E?hs*gl*`p!J0nBgDg91R3O9FGQUC%{-zsh=G4wj`hO>DfzS?w^`rr z;x1#J3qNiWCkAsw&u_o?4HHh4_twn_<~XU$qQ_vigSUQk9d3FzUs01;XM+2<^pUJk+JRG&Axs?FEB#tj+EIfrzi- ziKxNBo-jiBhYr5jR-YQ?7uiF}MzI`CQ^&x-)orbhczE#ZJ2+cJbdm$sN`ATj1{7KE zyPe3I5nK2!^q_Xa=X4IOUmq^f)x^=qO=Zip&QStY7ByYH zjysbuYA0Bn{)%?egPZ%8&xZaZRhaln(W#`el0wGCx-0OroN;^ruB3Ro`N+;8pzuOz6 zcC=&_+&s5X7r0E()Y9nr_`^!J&XG}Tp@I%o#t_CMInT{EH7iY;dj&6$9;Bv)2C{lA z8W{rKyw_XFhkG?#zuv-kx=TRRA#((Jv1QM^_gTE6FTj-7aEz87Th{7wY78Kng66o( z5_2r@=y!^DgGz(EK8E#tJtxho>(hAFpRMGM1mbSrs$#ldMeIe2Yy0sOJD z!Ar6}F}Q5P?0~etpYO zyiRK(O&h=Gi2G3wKZd0Jv;w@;b7nXPDEg9jrb%5G;65M;l;VZ|>*w1qdso)=gb{O;-l)A85 z5?`SIGyWV3WBBfq6DqywTL3Hh<->m@bNvm*5J15Kn!b*R&zuRYBLw=p z$g}HQQS~a7$d#G2vDRhThwIKjd#R?D7N5Ek^TDh0Lv$`rTpS&vUn9%|2E+D@YJLxr zoj{8({`_(d*i}Cvfa=x8H&FWZ9x#-g-FoqdOXT3zCILNxUL2bu=)DUM4qBLR_t6Zw zfS4X4oQXhoE&Rst)E7@o0;_CO!*`!MZMVLCC7H;SWTUj%TM|PA-EbWWJ9h~v2uhNM z&*Q~5OqvhL!jjsCaN0HL-e&@KxR3o1rWv4#x)ps3M0JjVl#M?F5X*=Bsqi#)qY)yZI z2swtjXgP$QyfJSyju+o=B3w^Ogl7edTxVL&Dc9lHoUS;1PlmWlYCwPR%Lkm&hp}@X zE*$5n&PB^u3c+5)pkrHa&@r+uWLU_moF`MpC!TrOZww3$^sFyF19AN16V1u7S!ufz zS6PSg6F6X??@Z6iGJDSzU=i`%gGc9XQ(Pc0V3d|xVmy5NYlwzTU#*>i0leKR2p5Bc z?%s^-Pb$y96{QZkCY5<5xm5DE#gU~FksP-#Mr;^ewdkJ8U@tf0$PP%~D_S*f$#$A+ zEbHi==du}tCFMrtmfCw8tL>qn!G^tAKWc)F1fEjAP83EHSpok|Kak!wiozJavo!-# z$yshh(rFTcXxM@vRmn5WhimCq0!HZDd*3h*Yo*=-#BvH|9JwQ z-HEaa%5^i2mMZ(g9v5ROQCHq%BBKho4DwpEJtm{?kLKX4&#C{>;qir@H3Z0hOU-ZthR z5a{0Bt(qnVUPz?C8;UaRl!&QENB3x5#<;g%i-lF%I-#xo3=QLWz@oLs?TKGwz6fw& zcku|;>Z1=6waY%*oG(g1Ry^xVi^6FtCjL~PQe{-!^RU`du+hFwQEYr;W2$1jAa*q# z!t?VdYULc=L4jSX#c}iwmgX2h^=pqRYd=N(y=1Aj@+-I6Y>hmwCH$3iGVevRDKx=_ zQwzC=`Pf=fk*j&MR5RR^t4Y9v4qd;er|S!cUoK}S2>;evwHVW<-meb$OQ*;?>P|j| z{!m`8Sx~t6$In<|lful_o(G$gF)82kbaryGFlLRdjyBB}y}P`6p7z@tK|CnLctnLL zMypoubdr;+6ORW8Oqw4j^jC?Oz@8Uxdc5neQk0pf4Ue;j`K0~eXMLlC)$vxp5H8^) z!+I;M&|bfx!<-kCXRIv&!{BtO4OONZP&`~rmKaYN*qmnl!={eW2`Cz^jmr)8{Y8Aq zO$G{q%j9u1&#ZEgrz3j#BrrTF)Ys8` zOhelc;Pfpj!FK*&w&>6=ZLI6Uxu14n6+f;lWGBgoqi3=#ydIjJeP`cam|9_yq9wIAK$j*t2+omVWsPuwPfC{_9YNjGUD73 z)M*FjqvX$d00_~Ys6^W~oDm+=KRghZjjc}C%7yQ*{E=EvrqY~po$ZgW^0*`~O2@697_ z(k}8t*xamYd4?eNnL@~TGcrZQu0*!{;H|~qYwCTZf4d;;D@_jh=TOuYdlvIS7NBrh z1-VPN9PZB4do7U#I4{ju2#48$;SI;#;f@?QdV>DLJrRl4Z(3_x>(M6|cBhxEt!V=c zXOq(`)PzoFi*J1kIoUEh%T-%4x{PXG3)F*_mO!yeME)M)mz_h2;N2DI<(UIJy1;>f z!GahH^zt^>R&8S9sy(EsAi=@>L!`l<%>=7$m?ypsE{kxk%HgY&ctUb&89)VR{k>fmRXHJDZef zr@@kyaLFqLCDj6n;MoTyEv7p4YVom~bAI#rSh@3b;Il(BqwuxSwBY?zVBV=_$k2Xt zya)4^_ZgKC7fg62p|EpkF|HC!7cbe?Npn#X)G}$xdN4FPnzfUCCSHJ($1E-|8EcW@ z8>ZzGbYw@OPzTE*8cuPNXvlE(bj?NuI~Dih3j-ay)9-9MK3l7+^$qgA$G;fg$J2^B zl|hxBF>GLSUSx)sSru_W#l+1;RO&X0={lZOJhnO|Yu|>| z*7e(9G3~1p$$q3X^uDa47LC-@Q5V&*L(#S$%l$8;6PmX0JA4dox zD*FZ109>4f4hl}L!PZ)$&dR)?sA7Pnt-8#;}V!aZEH{v1bFuLwF`+auA?*8!kZ z2SO^)!uqD5R2nX+_F(~*uyQ#f>u^bL?vjPSLP0^yI#3FPd%E-y*0y3_hnZjE?Ob$z z^&;~=nc|JlsNMFXHk=vswG8VmIo8B?UW?9DM-#Iof<6&bVu(S3eX;MBbh5K_Au2cl2S4V!N#wCbJ{vBl%H<4tQW9s^>Wtp zL~8Zd^3GQ-qP4mn-ve?h>n3u-V#hXNfvXnUh7Q9w!8L zq5)3y_x4Mh@NFGAQ%`*-6ZA4ki}u?w#w8dqVT-S9uKEK&7eF#RJymBvssKX;=W=H9 zSl*drqqx@0Tgij_sm-`B@1rEkI@Z1=u^|O*O;kQS$DH56`4^6ewu)>IX%SWJ1BJVN z{1lbZaMai+6J2e=phWy525x9_|!_FmPv1WR z{`rO_=D5wI6qZnjm95}6bwRmITA`WK*3Nyg$f@I{@Sq(?1d#e@bR`t)?cQ)tO*N)y zaA}ieNqdwe!HoFiY4*N5zk5}0TUFH#!Y@?TIWX|%(&adnyyoiw`kDFz@Pfh^iX+Rs zF}?x-W!qWi*Tm)83^Qn)n|-*|Wxd(gbY9dgltQ%oicnAKk7q5#a@Y3uE{ceYU)9$i zU1)=+9P`kF4Zwda@SUANM`xgg0fITiE-EBw7~Otn2A$fq^W@NV6WiD zbf+=_(8D6_UXF`VQ44Mr7NC##=M&xgizANfab;+K)>i-eQkc^dT^nb(u?CGalz@{) z3JI!K8a%V9g*Wh|jGr_mlxh=}>YKYYA?oV<4jbd#zPa!`UCxVT4*DmERDw-Ft7$~H zC{uP#i&u`OveT~6oLAc0R|2n>ufJ5bS#i6LF4A1Mm~J)R0QbYX<1N=$JTkz5H^FIU0d5^+{n#CL11{a(emiK&r|B&Kr|;l6TCX`FW85~$#?jGQ zz{fl6TY~K1u>n^B+Um|Sq{k(F9sefHOdy3L4K%RJ>{VB#FSq4|K?D(w{0@g&Y9@fR zgTmAa+gj#~3`s^CT>Q>vQT49wJldrtGAk>@-U%UAx@t*qSLi8QJprJg64akNn1ds4 zX9(3FToFH0>9V!LF2jZw87j6@Zko7wy0Iul?Z)@$&-b(6Jd|2=Wg<}zpNOsIRqA{^ zm@rJMrn+O>EiLI_cvi}5w3B0LTnh%XUdv$f{QGs$fx>kiK0p(a|sO%<^opKY^WPAW+796 zE`!b^)}~mNM*}^F-?%p}D(Tffsx+U_7OO0DrFV%wc)hl%C~dCbvgKv`)Qg_ZQ*yF{ zaDt&>cP!)Uoof%8qGHS? z&{oYwny>1f0!2Z;s+LV#7nC%|g}oyq5xDc)Nui%0pRk<>v){VQL5UK}2BF2n%10X^ zF@#2=XC)8Yove(q`%>Qvf#}27l&(MEK;x)1{b5!Y>TFDc~lS!1E%GH;#mbD*tz-(FJi zbCiN!<92o0m~*GixA8Z_?h{F#So4kmG18ZnzGlUb=ChY;CwXi++4c>n*0|~Yx9|;! zT^%Qj`pok>K=BrK=I92BjnsgxJ3rua0t1)q_2DE7;J3=$Ebn`9)6;u`ign)U=(~G( zly+he=a{wiMIMT=0EaU3!y|(pKfnw^zizPX$Tv*U!5PjiY~NHhIy=2JNk<((aWW}H zt&ce~!FXD{O{_TqJ{@RT?^aw3%$|O?(Z2P*ZY1dQTS<+g+%wk{tPG^3XKV=RA)+l3 zFp0QEdG?1$P=UiZ_V+50WjiB))C>~d+53^8;-?G7X9GFMBy_oFe4$cC9Jz3ta&Rf1en5WvIE+t3OpZn2bS*Bs zwv4O!OOSi7_`H8ky+pVK_iB3=>0tSd%RsB^mYz96{Ew1p^V5;a4hQ$6<;EkQh@?aL zISV!rL(zE?$+4HH^pl#a(~p^wgskY5zvm(;NazoffFQ$JEtj^zvx-%yYVV%l($ezo z9{_1vL#rS&vbJ_&A5L)7B_*eS*JNpwd7gA|Pz!~&R6}eDo=1)Lj-}@>OG>_wbkY%e zWrf{Aw600$r+*k3|rWW|L>lXbQgIrM&s%K;| z`#sz8b5esX_BIDo#D~-`txg#pZpr<5eCX_E!(o-9SZKSLdOsharF){%RvLbFbLb-=(PFVy z5Ub3rxX`)`{#BKGK#^f0P32D1h!AJ`Mj{RSVhZ&opXP*GJ4Y{V3c663X^nh0>y|i9 zaoD(4YLhn3MS&~|Fa>hE_YIm|ZG$f{>|>h;CmK8#q1ArQmpa=X5xnZuJZGGpo&2}Y z1+5Cx*L9)jTkX0OWCE5xc7F{;$W!;9fSJ@m?Iz7fvjee#=7fi!^GE%yWNz9Zuu%!> zV<_E${UG}@h}tIG+1Ko~T2s}NsLqWBydAOf4xQe+Pr>CUa@l_rh^}yn22Fs0*co72 z%#^K#O4^LfNYWo2-H~9vj}BKI<*X%)`m*ztNpvrHt?d3i{l^7ajOTI)4eX zI;`S`?hQE$YYE^FlMdK9lHgIZIV9U3D*#Z!aF)(zDuu4bx<%0O+ljEaRKmI^aoYZP zFPN;#bJ&^SVKG~aW|ST-s!f&klrN8q?KwSyoj3s(uwd^3xk&fj2iFoRT^<+B^V3F( zixIR7=$^ad6ny-9YNemxu+$!_&IPJJZocI)-1`nKG=L1fCX#at(S(+fpN}6mk_Q={naMk0{pgJi(tLdX`AQ&}8c00} zJFC;Yb9_oYJ-N-`U~?Qqd;41?glFhi)U|c*Fg@9|#TRL?R{8jKOa8^c zRR_b0Pf8{LWqu@ewgmpd-Hol>{3Z}~)p!%+wzRGm9j%!g#1Q6?D(5YNM0#0tbnW?9 zz$7fHpY9zZ(Uy@6f!@m-VWNqf2K8Ox?#W->F zn#1u_pj57y@)yn`0gk|9-_)Uck9w8sjkXzp;1JGtG1V0-S@`R4$Hq-FMC{Kx@FEdN zFLT;SnNWrCy+T&HXr+C68pbGPzWDBqY+|)ek^fHND60qefLqy|m{sQ&e#qS@|4Uvd1J?AhrH3`+dM=j@b+hVTs&Cy%F*L$YkA)T%kCS zzqD@`d?aD&&4N3OQY9XnKSizg8^QQ&^ODmY0;v{m`>Q9eI!yoeIry&(B>o%E`CI{d zCiW*W?teAnhat4hYqCzf1pDXjdY+ZqhaQN9iAa8HXPH?6n=aDNR)bi15}r+OWW+_j zXRe6|nps5d3J4%YG9P{YKGguWcYV$RRSIEdFt^uBeypkKq`^C2ZR=rR4X);~?STHQ zUZnWlX>nPg-@zCVuEg*)4wjzPb!6Pq4Zc&c*jT>sIbm2gg6&(Cdaic_>%ND#gVITg zc)OMM!ev16agmOl-=j2FlM0v~lLMs6EgRC`GXZ{``ZF#KLort78KxGajC)k(n#vjL zdyrk@FT;iJX;=k^N&yi3?b`YqZKt^{Q-)br0C^9W(XoD&cY`4^Ilal~T*hL5P`n*@se7WfN_2XA*shCO^dsGDAI0WL7)GnPBF_J9wVsS4trQCJs(c z6aS04?+j~dYumITib6Qj6eNfR>4-u=NxgB!tX9-+A9}=9>BQU9Z39FBfTh@Aa%_-OpXfw3&CoViz-J*rRK$ zY>o==b6%W=Deg55OC48dL-t_W$|%`6NvR4CA@?lo8n2&Hl zk-uSD%+1a57w^MEl$9!d)HiFFyo(Eqv$2V(DZr3h3s$DCy}F9|?mCKdUvh}O_;jXp z5RLgRC|}M}bHQk->!3Nf&F8uN-S$OR82wAEWe7fNy_=0GTKLru;)F8yP>&rC8*a2N z$M)#mu!>3>BbA3l^WJ>K?T62a<69Rk(yU{&O~c)jEQ?85Vq-l;{)KpJP``{8ac*G8 z%4%<2i&vmXLZYuoc4GQ=ppZhfy^VdI2~g|iHmU2ChaRo=5PxNYg>k!{HPB6s2i%Jm zJu7~uZF9T5$-2M-4U@r-a^A#ezbfHYX7)+6q>jD9*UHlO>9<;E+lg_LfZ51@q$~gL zmmL*)_is=&{gvDqiYSojz?dern@%Q2OX;OXZ2O=gDAM9l7OX1!~1VV+l&f5Wr<>PV*%{LP{&wlVkKDv0MH*4b!V>*oNJCVl-yoR96QfL0LmWU^AyG0U?vUzwO+UR3gyCj^kQeAhnP z=P{}ZLNHdQIRB&r-C1~@=Y%`qE91X(Q!`ufxPwOz#a3rWKYuvS|E1cgr1%nhL{PP! z1t(%km5ceo(`z}6$0PXb$X%og!5;GjUNOwUN=S<_7}rXX>VIe>GD({k-z>CM|bCmMzT2WVcOL2xRLSE%u8n?kmGss$uo4H$@`u^>;$jN#>H_Rc$nDt z3yQM&57*&Tc1iqiXQgl+omt!igvo$IonH_2ayB?n%Qv_qcyIS+-E&nz9U8Lu=V2nX zGSwiLUnWMfCZ0(VF>Z!6qPF!8Z|DZlT?61-53TCGWN-Tx?^}2~8z`RSD&C2}(JWUA z2v0vq`p(8Aa&FC}zA*68sB1Fp>3Oc)14cZxeb+}`AdwR+VotzRLMpt)z1W67ItE1# z!^e|maEI-v_jp>DClMF01B`jTE(9*dkrp9!X;$N=gNIr;!d3)Ll$bhTn}j8k_<4CE z*awQqd9kT~F^zFTC)X7M*;Z^+#E)x9D}Y`j;>Pm9}wJ(@$r`nK%w^SrAuYUzjg zGfP$BR0I?2K%1(qsXW7eWh2OowW_Gh#z0;To>|L!@!>}`iTrp?pWixDY>yCi{ug*EU6+1#i}=2I?3W|eoan$yy5dv;7=^21Mbj&c%-SPQs) zZHt0S^+?+ybu@)V`ohIkojZSZm5CR}Wf+U(7|B)CDBC8PE~!geSn&0~SYrt-buuv& zSgF6mWbC_Lef)+A*OQV;EH}I+p9prv+ZwXBmbHEV{nDTtIkFtHHc{lG%*^?{H{-^8 zS*Dgx#&SaiP+I|=t|*qo3$MXpKYY)Q+SeJPv6SkLA5HXze&308E7St964UvxiHVsj z`**&yGOpz7jSwvs;}Ly$0Ne3Npd_r%*+aBMdW8U(vgX_V!R=ry!?fc_R@;6Q_hboCxy5d9F#9IAaVMGvTtD73;T%QIY5?#EO zY>ySZuGF{Cm;K5x)oIiLY>S27#n74F#I7Jg%NP_V&i||oH%njfrHc^>pD-rk&J8vN zg|KeZp)(QjfIL5^1Rxw%#L#kb>aNtsnf|=Spw2^` z`o_l;s(z36`KenR=lAXJA1wC6zZ^qM1(H@=OpzylD-7jHFJUf;2KF=p1*rZH0#DCq<1Dj*RsYuyuS7*3z7g#+b(pEiaE$+$PuwvT<*m zT!|PdTq6RWJ>TCRQ{mZ$ z3jHk5PP*$y&Ax^!wz$t>w+(2^FNGDY?I>&BYoE=;F~p&VWF8jbJh#V;=Zu{g!%LlS zM=`mLr`=b5a^Liz43mD!RSoem8rpOp>b6tc5G>yu4Q_-VcdQ>dbZbSrz5rguu~|OnZ*a=crBFneiI!X^)%n>MWboct$@8)dO43Tyg&s-R;5qW1}&f zw5QCNv%$`>%mc>Nv<71PPTeH(ok|aZULJ|^`4QMdsG^Ne`soFD|MFhk zzZJilu-ZUfUPCzmPpD|G_Emt7GkD_tj_(bF9xT* zk`qvTmD!LfK`(l#Zg+<5ZSLSA$S7a}KnSc09wjAPzuZ4S+77|D;V+eczBOzNK75p* zkpj_~v|UTYjEoLBnS8zD?CDx`EPRVnzpqf2Bv(E(INuLH_=4V4=VHFPKR7w$Ig2|5 z8HlI2xiDKIG6N%U8D))5KwW{`z#aDPk9f1>T zG#ir=ze4q5X^{xH>UPnZjnn~7)>qe0VjIXG(Sp-|s0@rFjLB|JP6Oo{v)Qs|-18s6 z3W$5^`%3wh%K1e34WS%38i$rDvbEtOwL3hz6CRH~8!@TO9n;`@m2H*pa{ZhEoPFqz z%F@&Y_PuHERp@bFnWO)8|AKNJe6_j59aAg+O^^x5X6=ZOdm!gHOK8f?_82^1j4|BY~IWuV<(K92xE=EskPFSx( zvPI-M1_HjL-)o!EThzKcz%1Mg4j=bqAD|OrXa9^N@tAU2shAG0(+lSPZwh5kb>kq+ z{sr=>l5QH5C(Cd@$kI~eb4E=md&7h^D1cS>?vxX|$Jd^vrMm&}nWvvRLD1_bPXcDB z*mPg={1p&Cen+NSpZNsjjJSkEJ79KI=oCF5T>lN*%T8(_I|JB^8}wb;pMCGC+dP*V z=WYuek@+V=Jm~o&;B3mbUt15c7}7+B*pT6W$@VzINJZ9w4QHu^OJq|MG)&fbeeIiT z^ve3m>xJyLjvv)!CLCdEf`H~R(;!_4Gdiw&=W*33PF~&&OxEr2aIl;1&W_i;=g;|O zQB___1 zgASeEuw2U&)+!?`9vyF~YX@bm%UT}b2=eFN zNJPzT9PZgN;u)K%J=3ax$TK|rn`d}PP3HdRaoYHGW&n@BXK4wmr*#uIe@AL^=J$Q| z2nv{cS@Rsb=HvWW)+$|)myeI+HEfORoOf<%V|(ia5aCr0HE{xb)b^v&fIWnda@uir zUyBnL6=qDK3=f9+T#de^W$eQD{@;+5pg&;j{{x&f#&Y^rry%sovd7Q-tKzd)gMt*8 z&H+7P)(|pz_n|-{Q}t6)Ohzf&tqZ)X{+#hMyr-029A%EF9suUYoBp2ae|FvehFepw z1&uz>lm6fSv;PAO_J8;EV;=1pf>w`hSms8xKzd+=7Sj>rsDHwEx{u{-2z# zsULsS7M?cL@cq9Z`-eZH=M!)}dW?O3pa1jQ_J4lmzwhGzrlgUq}#p(3}iKhf=TSw9CqB&4Lo z?6|n2jxsVbcdaMZsd~%e1I~7K zB7+mIc4x<3y*8BpY&DL@G_H@r;VKfdX8)|cRKuW;YTDct<_N&JCywh??}YhV{6h9? zf^!(Z+YM=1uI+7Y7I~3u)L2|tQj{NkpkNfX|_G_wi9HU|HiW2euYceR1}cH^32Z0id6p% zZcsR#r~C}W<7QSi9KA4@Z;i20_Ng3tkjC$`HO8W01Y-!N%v(KPQ_Os2L6*_mTI>yNb;I~CW;yDWvZFw6E3y;+mg`;>Z2F$>=|u67wj z#B<6_^6|1bbve6GJtQ8Pg37| zRZ%jsa^KTK{QH|UT)#p$$;%0ei3U@e(xZt^wF`1em5xPCa)Mg$F|)SPfsNBGkM)jJBca`cbjh zdxVu71WiEeR|==3cYdun1CT2?dV2apLUO`8z#E>1hz7jjl^E&{mpPoKBu*o=WL|zU zekA(Y=)t_TY2EUdrIdu>n&HmXbdr`6SBg{D^NZuO3_ssB z*vYtlq}l(Qy2BGx&rw_9FDD#T-(T(^^c=#%fB_vxs?*8zqdbk5wVrglPW=@$Y z{tVxx^2%Kk|NX2?@R5%mxVbB9?Oo8-nR%G^)_@;vZ{Pw*SJWI+cCJ|~@re$UyViAR ziVcWI!nwHCSe=55ta?_n{l^vapW5mBeeCMde#YWDZidU!O4Lk=yGjao_%=&m>OmJ+>l3**!Ue)_m6*g4I5~WL z`~}T6zZBpRycem~>Sn?1iECjNh_7M{8g~5E_Kj7A?22|C3o>;(>JohvMC~NVlTWzl z4nqfZdbp@=!~r2bUMzd#BS3TxdmopjCSqKMMqfYig){P+(bD@-T6dkm@CS9~wJ*p0 zRbnwqoBf&h{(IW?A63tizv;=4%r@D7y^V+aG4Q~9rw11Pur}&RL{UyoOUT2Q+_2Hq z^po>1M-~=&)<(&8+P?DY?zZuthD!_2^09 z1nyUIkC3SRUNh(c$k4)2gy`sAo=R{7Y2+gKjJRXk1?J+$4lTmetps>6Kk~jziF>jf zi&0a>>0Iv#coMJV0dsWxURGod+w3i()4a!Ko)8=y7F{|}ohCVM&XGkV{uO0i`qyhe{g%eYSIn|IBjr68OYU9Rry9iQL_6&!H>3|5$LK$>HeA#GR6FP|*3UWhd?ZdU_7ypdF&9=)T{2t?q^W zuWsAwClP5AjJt)JAmv|pDt;Wq91Q&^vf{s=_yooyej8l z(UfaHJ%4>#VyCUhbvAV`0R@PggQDaps9#n!y9t= zK4J38^mgu)eUqLUa!{pyy1ZB-zLT)X+hP;LEbbh$;Pr!)=btor%UIpDAGLMgng4!h z?Nj(9{;kl@iT7+E zLX$-D%iGkj`lsN70eIeT@WN85!MH)$8t%3MdbdQ8b)T8bgQ80FwKK4CTmjl-Yynmu z=oz34yBKf4mz590I5=9{p2l%N3G`}&+<5z9E#50i0JCVoiOJFz4u@Y~@mE$%dN8@L ze`BS5)l+Tz0sR|RhdR9C2*X70LOQ95`DFFQ4owZDt+-^wqLPSd@b(KfQq$uUo(8 z$D}NLV!G#WD+k86M-(V~PSG91xySSSPrr75=w8fNsq7j31cgdJo1Hb<-Srn39iIE- zZYX75WVP9~)P=_roYPQb4ZbB}X=Vh-t-8rt4)3sEKeT3xA_q-WOFP&H_V|JR>dkhY z9CHIOTl~m~n=Q3j3_m#NR_C*JYR%|;QyP5`MQIFb^#FzG3%^%g5VMJ=s3@Vd2Bl8My#CM*1zC7AaH)EJat`{wwq+T zdnD+gJpOe#B8EuNi`^y8=C}m9HMPjF#C1L^EYF;XZtxwxSI+=z7+h*eI~YNoNk7l> z@^&@K{nQy>N<)lGQ+u$Q&8VV9QC&el5k4Su(z~|n-ZKYp0>O`>UWY(lbtz-42_XAh zyqvwacJ`;T{Us5P-&%Rr6e8&`^az{WSe1`Qmj!esv#J3XF>dGOb$LL;KL7UMDtx)* z@X&^~1w)(Jx>x-zEQoIVl{|L1BY<)OPBjo&*=Mqo8|Y1+r70*%Z~Uy2Ib{nIlE3{X zrf1lXL=tusrk3T@bt))~t}0IM{dBz}-*-ETbVW{Rb!$+NwlrHVc-79^4e$JU@clc8 zfG6*9O^`qdz_bnBFD7!yyj+j%oK~kn*h^(?b4#AjZH{ASLy4XA_Nb%&6iU2eu zcDGUpB>ois-4+to&f4wUX8C6gSnj*_fC=hGX8$za!oIDot;GxdEZWP;(bW&DH@f%?&E zLFu-xp4s*rwxJzFrgtS~%8ft3DYs^2v?3*zt83!;{WtGBCaJmbYL6UOXgf%(npAe1 zJ>-*yN-y8h1Ut?m({Eg75@p@lwXn4XM2d8199ICjq;qbdf=)@JUp`?YA+prbscV}P zNMv?57XqSfNrNGHo!Jd4nQ#5}v^~zb2rG1UhisweK4f7VP4%r^BC3{7;qtJO`5oA0 z<5*?J_^p`lOLxY8{NcvCv3GhLtG>Qja7FfC{l#g{4bIRcjWj4-Ou>Q@7|&6WUTB~DJMumPF8u21mxtjx6Qje*H*dO$fX4NY+%YmT@|EI@45Zi77eZpa zmsiN_yCo$hoRGNZWfwpp!r`i~^(3u!AAdAFC35><^|0hZZE-dsdXVuX(6+&)wQy?s z#AmHm_0vBC1Mw}_71VpR=sOpp$9{UtFfl{i_Y?so9&C{u6%Rb_4D|B1eu1jdoC@4Vg9J?UVppe0>3I-!EE8MVENHK0rapy)7PFR?n*}Nt>3T z`caYKo1O~?Oe8d)$*wdID0hEfdyTKAl$SlzlWWSOD&x|bC{4dd^zzZXOWa|sOXVxb zs*KwnTRXQw`{x0RR0EJp!db|&@y|qy07=?=G3xoGt=$x;Pg98BOW0AN+N!oJ8#_0` zfj^vVj`W^2V?)&$#NzN$I)JGkWko9Lc+o8uaGyo`uA8w88|T^W={H8{I&$~goA;cy zO0F?+O4N0#36k#c47rYmBp7${q^Ybnsn%G!<-JdCZ4EHvm@6!ss!SZ>RaD5XbpoO} z=mZoaG(txB-LmRN^}GXUPjim%0$P%Hs~-mMvZk#sl*_P@oyEDT_%49UBjeG28^7Qr z&;3v06Ti>t4kj4*erR^$-16G{avZ!{Hl(2R{VH!~6vgGhGU#%-r)PF)AYq77x_KIh z`pKre?P4}*DO2fI{EX~LoCzyvGCOJ><*7~HA4JEv->5QC^3rTlO{_EWZXR-AiWT0| z3X)$@?vfR_YeLrNr!OqYt#+Yt>rDa@Ft~x@({wV)c9Py$Y{kb$48hME=U=P1Gn=zO zNk~rh4x~H$3j3O%`Pbu&n*5ETVCK*zijhV-G?7H5BN8;|6`y({4*M1hRjPm^(K#$3 zUrN^Y-T{g)d3W-SR*|z#U_fhoVl+&mUqR!~yOfP(x8W|UuKzxiO&;6y6+a>37`s=- z9Q{qn>KnA<4&OWY!^w7}p8w^)&hXW{PZF?HM^}i+5jBF`s?>a>-S&$nb@6=6+iS=x zRS+0ucPF%KV)PUgSA8Br)8s-sanv&_on?&~W$f)M3VPk;TQ!pS!Oq#+*T)U%Tci_) zkg?T}L^0n?9D3{}IMD!SU_%=p#8y@ox~rLXgfh$iLfq}>qRu1j>mXh*BXY{mz3-nU z&L@@lOwu~Wj5m5e-aU2kgSJroX}*c}cA>TAFfju56Q*)eO_}%jL($L9r_g&-dm@ul z(5KJb)kRav9#*z`Bkn(FCR!AKQosK*IU@X>uj;E6fv`)t%0)FUx%rS5srgxO`i$k= zA`kLP^?n=u6UGl|NH8U9kRL5QkY8Tl0gM_o8PxR%2=OR~ALz2v?xhQ10XwWadk&r; zp)a;;O-sc4eA2YlMx)HqZ4)`(OQvNDfuaUw#H4Cv}nc0TMAN9;BZN# zo3DYJ`)1K)5r54gXQ@me9)0<{1JTr4SMqaZdqT+Ft^JRN7A_75!r14Mln{EHH_-uf zQ0=u}8&jj92zOQ($QwC+AJKp%&qDL#)%X^8#+!Pi_RS2=N2&=gC7x$G3t4Jn>bZmFf4V0Jef} z^#XFDiT$VL`jU$gk5#h_%hdv91Jt&!uaoP>lJ!vw%BQB0pvIbM!MnGh%$7IvZUp`f z4t;p&_%!_Su|eVrMi7)fTxD{N>FKwF5n>7#Q&*WE0K*lOmL zUSC~)483USDUU5O*7y z!t8~ou7+ZKHGq^3e~-q+xguh8s?o-c$ZJJG;Am;(*>vdU-ShrseN-c|Y2Wc+twRK9 z?+5$)j8~U1{snK{KJUE081yp?@Kl9>$7qpd&J|%R}f~5cVuXRn;+%;mVfeX z|E6dG6@GlXWZLr{0c4v3axJDA%DaefUUfNNZqdTKXhK-Tzl+EKii1+)clBr%EVtC2 zh4=3GibdjUIT}f)0A5jv@cvO25ocUDWe>PN2_|ijx5!f1a|?O{w)uJl8e+V?6|GdS zVQ-7GRAlz??R_w+fW*Ssc#y?0e#7t8jCRJd$XTV14ZjZ_-T38vUVA1^^+MP2F6+y(S4+%z^XrGd^b7(L)wvdyhH!;DLZnk4jDpLwM91|R$EJs zS~VRT<>ddI%#(Xq?_{heb;qx+d={KE3zRr7(|!!kjj~-w9Dta$r!q zX$G=#0Ylk4z-m9(ngA)idLrziZ+fF$j&SgCZL&_x<&bjsExVyKk#CMMgAR0-b9*%# z`7?rN?@|oUci`&jFfqjA5H(fo?%p|jXuE51g)nKIlzylU4{QRhT zcDL=KD(uBzU(S;+k$d6R6xMAOT04sM&P~tA?cIY9A%Y3n&?7me#m+t7_dcy{G=?)a zNT{(zoyire7p7r}oZ8^~)3X|$!rYM&uYzOrQZaTQU-RU&a$U;)cxTU;SbM7H?BEN7 zJd@R5HId#czclJz&gVy{h>zk9R$BDagf}vmW~W_2i8V8UEcfK82h+WJXw+dAdvM0r z*TloKnC0s#bU%BHJFN~Q3j+?utv7Z#c@1nN$G8M085Goh=UBHj=@lTWei;z(8}J)k z5IiLdBdwRH?4^(_BO-K!hp#PctJzo_=e+OLw77^>4uMtm*XuuS4?6Czwh@M{_C|g` zT+++Ns|5${(A`6O-(n)`*Sf$j%WMRk)`iDs#wPcib7P8cBX^&aC@|Kb%?X;K)L()>eAh#n^jg8P5d<@*0vTMSz*bR&yig?-_5OBPhus)*VZZU zpiX5^0yMI8D&35wvIc=1K0H7(2Y8(_|?)` zm_W*#FyTMLQC|Ut4nIP!`ZDJ6?;Pauf>)3Un7uF3@c|vf(%=Y#Su1ifMHTW_cSa;K z-`m+gxnqNZ`XnY2Q8ZH-or;}f^pL%d-RuB*R_NS%E0 zpi{gm^l?zI`#Z_GP5^Y!9U54J<7*HY#Hq-)!Q49mO#H%kr`$9a7q`Po(h*KSP;8zO;c1PQ!g*&;?>^!;*0C_PrjQ38VM(3vm^VKjOg7q73W0|7 z&0a$m#dZX5>Zgc;YcmjW$}*RhdkW-COVo_H%d`dWUvmC}m-jx=)!UWnYDSrmKbz!@axzA8mH*RxNSP!m&Hhg_EOUKgqP$})i1#U4-R;k0qD^AP>66sw&t){{3pY-YVii9pRylb) zKnoQgq01LOBr8tH6Uq9jcQJ`9+qiZbvUMoWfRwo(R^L?{Mh$5AJ=dd);8Q$EbOT8l zR7Z{$*JMteW-|Nbf8*y%`0bsL`pUAq*aBFp+WUY8N@Xsa=oc?)>N~EPbhsGF)kHM{ zpQvlw!?pBHR*hmbK|?4ORc6RG{Lq4~FD`JaS;{(OJcm@G&BVvvp@E!6d$6OdQ{;X? z0-D~SEEtg6zi4SM|8REP*>$`0_j)Q}5jb%ntNX_D(UEs6guW?nFKl=-oSKLk?jp@A~Rrs}y~fwjqJXEl!6uqZf-lVJfn)(t5u#teUJ zhP7AVY+bWs#mTsOkhaA923#_}ZvP;Oqj)nzf@*mybLEcC;Ln$PtWnJ`D%$d(K$Z~D z6f23a-@7B^9E;E9sIH((!Nmzr3$ArJ@`#2)9d^WNQr;Zq?8ZS1N=^#Q2cD9`1O%>i9QzxgC10jlQ<7y~(M@%o$qh(^Jg8kiLiWCu;Im1Gnf}6|Gr$0A zPl)WK2&V>k?R}_+T~wm|3It$l%4kCG9&ven6A`b*{)SpQXLrkUTO0iIeVHWa#&B+K zS}K4eukl{ocpQekQJLupw+&Oc8}t{||3~}Q7ti?Sx@IG95^u$)wEpu8=gJdU_spP_ zAJ;55*i+M||MK6RT3^DOY#s?qpO!|?K5=Z{)=WKZC)g)HR8Cd;c8%nD$4;H4JI_x* zxiDkX!_{}7*oIO%mF5Fl-+%^oAD0+ar>&$FloqgmywbDoFFad)Xb##kKYF$0ialgK z=oYmQGe4{yp)8#7tcb9}@X{WQ216ga5`@BB-|6k`gRM5l(?bNsvr5@`LCRpmZ~6jE zTzP0?FEkkR#3zuPo@QC$U~6xS*nEv##+a(TdN51PRg~#2 zYD!U5Q^g}ZVT;j$itvS4_@W8Ybs)NUJ-S2)W*x1j2Gso7)!{zk>_p2$B^M1>BUNqV zfg%=^b4^X4I70YibGTRPLV%Z43L36mlf5;{QQT}=~1Anw7`ceck0~BW;|4A zsPw}f7E-(VnI`K~DH}{okh^^QQdYH3>}NT+w~xH0y5d=M6L$1D!W8y)9XiDxwy3M` z_!R)a<|QDR-eqJ`xxX>7-lqK4_HF?s22Fb{4N^2W9Dc*ddBqi$;Mh|46EK&Rpq1w1 zV8?xa%hibu3y%K65?E(Jg4I_M(ZNsRw)RV;1H8Sv0nWri6K}tu{56GkN|Yrq!)^UI zG&c5EGFSAp?NZjEsDDXh@UsD&6UbkGY(;KJY(Q0z-TC=AZNu&)>@GQ)@F=E`8B{@C zpj#5>?5==CuQ0Ans@j@KhE{TFr=2`^my(N$*{36v^#N;1*A^WHx#z>k==qJuZwrRP zm0mypS!A)|4&!~^`uk;Wq?Ii5PpEE2Mi(tCqbKrb*)@)?xc=lV{{a>4?gyYKM_A{6 zHY1-)G;C>00%eMf)&eKJSdfV1&Z#^KC270;s;IC$31*KulVzR~p%fS~) zBj4web@8h$0l6wt)I#X;_7RRSvjIvxb}0FWU*m`9p#Wv0*FWBJC$^W&ow-I43HNrE z6npic=^>d|mCuidxO=vZVd@Lv01D>aXPZ}Y($~mc3~(5?i|VSw;ptE7M|!OJ7o&&| zyk5+X8=h~Qn*+ci{z%=^q(sa7h=qNGXTjl|5NK;@{r7=em6`gfxRno`#l=HVrRL;8 zlCkkXL@hwG5*Rh#A!96xhI>%^fv47gC%eL2$sReMBD~Iq?qYl|;WI@q*oFWqSb-IO zx{y=d3E2C=cco9Av`5cIhDw=0Sl$b~XM&#TxGDBd!Zg{|svJNN^G(%DpM~g) z#eHHI=LG(cxj6*|4#71baovABDyLrXoJzua)|8}Mrjblouy+ET431tZ&q}=4zj|o(UvlA`P3(^WFmywGZ*-_ zxVB2H^7g`a6B!Lp@{GsjqTA`p%Rz!ZJ~gu~ko{*hR%IWV&vYON>W{a;^*6mD{6z{M z%Lb?>bt?b7+jJtV{t;)zbovPvd&fbn(0DI#=t#lceFRm9o9gOWIZ&TXYovfSZttExzuw`b%bek_@7P@f^mbHgcSE@tc=9ii|kuuH(q|EM@(u)o#QK9W;te1w*|c?+WAZ%CeT&; z$8n{B%5bLU7$6`1i`plz6t$!krX8hynYgwZS%sU}bwBb@kzCaZZiu8~%J~@J<Es_Ee>JVuLTtS7@3+kgqkX?YTo1c4z zcPj*pobbE+AJKUJo3-o$1Nc0ZaEgK7KTok6SMS0q-l|jC{kKhNzPk-NbTvHG-P?`) z^|c(1n#g>_YXUJFj;rufN^v^PM{E&V4kyXcav(ka>-UE%(p=ms>DZ>)oVxy073!+B zdmigyQO&z~r4x6u4D-S-ok6-ezYU9rqPR5#PqPf>PK>`ot!8EJ)|lGV!ye5Q-uP$* z;p-lRdg641S-`LT>mZ_n$&KwTTM9={@>y?RYJc?EY}}`j#;`=o_%$@}JS2&7fv&!W zbfdvFbX$x{>;u2^ub2nMvpUQKr9QmqZf_w0N;BlU;**!gmtS@zIsS^EIbK5aZL23i zs?BsB3HTO3Qws7;jl{vnm@Ah~r~PnsCS;Flai*5=W|!J%45;vu zL{klBk*fl3(U~44>uCuQFDtIjRxzayq?AcO@o1jJPHE89(cBiJ3#0{7t1H zR{7imf9(3_-fwHMNuA5s{Q63aTn@EufIMjd%Ny-t@ub<9z>T=I(cA2S99*A_B;x_` zcd+fpz!W^spC%6cU%W7->|>)og*p?IT88{zdV6h@g~4rQcGa;sMFk*(jIw@Ih(+>E zJ6A>tJShc^b^uA9rtFLfDF<98-VyOBh^f8uSu4DR1!H?{V9nv{y)Gk=bL!z=VMa># zQ<5NBx~KFe_5=p6uiIUf1##ccu`H}Bn4qn63v%Y?jApVQ8MLNz1z+TJoTlWND1Un# za*26ftuWlr#iP0H(ZskM;vH^IoRlk&ku+F;*qN$p^ypX^50hlBwU5}%>Y>Bm`o>d{ zRyzm9-H^_TZ%V7P-93FZQRydHp!y!6qZNJCeJ?N%){wax+s!oSvL|LL?U~u;;>te7 z8R&7Uz9cESDrIk81f7XFYdYrTuNx6~D*cZC@afs44_I8<$3PRj4` zAyW{onf}cP_NW#IoGv;_%hIy@Br|hi%khT*ch1Gvci`=QhR(z8;hkTFDme?&S8FUK z-IFa-_=^IOFtZl7+ojVnnC_Klf%M36Svdt0{7C`&n99l|ew|iQ7kF zU;2%3bMv&2eh%+_V?}sq&RWH+V?L8s&V;o%PDE05h}N}P^XWb22&cM z8M01OFDfcP0+iF~lM;k+u1=n}CL4&A^1w{5iP#&c$}*`Mo z?9H5W6RP1YfRMW}!@LZEDWp8qy+y+>Mcq_DpoWW32(qn@7BZ}>ue zdTW{8F@yarKo!%N%(b?$VM`Yt&29LS(KV$5H$N|^ItO<927TcF{vITSEom9^Kq55OLL2#5nYQ!4c=UvP6FQW4qv~3jzMMcity~mm@BRWXsP`E z8AHJnEFD*pe)vu`7A+2>2_W$`l$+V`=(Z>;o(Z7^da?A^_hH7OTodcXq}muY9>Zm0 zM{UR0D$UdfpcA=LEFZokSynvBvqJfHs+Qd2SBpbUNMs{GuT zo!TMk{YyP$8`fDBQqu)L0UnLCOqS%1`Le(@)Dt`%l zyBxDO>Mx5Q{v77hfVO>BWp2hQZjpoK&16~bt=Hc3)!%z)MP3z~MR%4(%!m^H6Ok&kCx){X6<4dKDKGWXCQW9&f~Q)1qMxxj8383 zDsyo!p?Ve2yY{M{)UZX6U#?Ld>kh@d9R2wbD2bOZtt>BZq{REV#YgZ#hHNV{|DQTS z4Tm=3*L=snx73{Y7rPj08MLr)_tcK#X2}}|&|q&iDesGUQgY(yq{g9w6vz~@UMuUI z4KbyB#J=lIH5`tiEv)zs7ph37cMaYWe0BHENg@}&?UpJt({q`)3g)L?d*Og_lFhEp z9FLT3l?W(sIClxk1X38ub>#5%^t|c9GDOdQzR--6Q@|biYHB9I;Xa{LOx8Zrzu_o+ z+tDkspih0bSg?QD=$O6_3YJfd?E+|_g-b!l{m`VD<|n6^-lS%ggnZ!Rs064Q{D`Nd z{O!HDil}$Gd*OSdqn=!sVx>4;2rY8PDz5oG4*l7OBR?~w$H&I_+salYZTWYhiIW?D zBh2Rp`v?wzDzr&= zdpq`wsTvL~Cp93%1o_li)$@jmSi!P<@2gwStQ4ohV=|V$thtTzswpI@vH$AbNI;7W zT7spv)BB|PQWDO#!?EI(+8x2c7Kuh(c7*(+Tc17Y2h~|kat!@yy>9h~bKhhi1j({U zj6xCa=4-x@NH6LP+bOQLNpj{|eSZbF>}=Wz_Jv=0wEh>c*q3s>Dnq zT-r$HlRQzL#1%3hB)~qPMbibya;<;NVJmEWAEzGWsp@K!(5Gr!RaGE&B0LxRvOb9> zlwZ1jZKZ(Yde5k)Kw9bSb=`=e{mA$hs%d}lA-i^L1kK9_4$!~iDcdWI8gyeC0Le^e z_1x@tuQ_JZ)^%lw+)q=$8sS z-fFlPx;A~ye%44(_)0tgnr>7J*tY&og}EN$Pf|ZJUs+N>qWxVS^<~rCKsO%vdxS!4 z^bn4Bvac;qpFD%@gYu+ibuIUW!C$)PHuk4;ok_jxqog$3vq@E4R_Ti}|BJo%3~Mr7*M=2DoG4|aO0^6~M?^XV z1rY_L_o{;Q-XVl4qO_n$?;z3%y*ELcl+b$*y@ehKBzzA#v)0=0nzi@L*6+uA9Pck6 zAy4k-ey;oK*LhNw@+IhF<>QtpeoG;}>~GI<<-U{#>+(kcAZnAVgQ|mno%WO>)&3y7 zV`zGq49_Ul!l`zw?52r8zAF2TXSdRO-fMDHWLp0sz{*J>nf&=fK+3XPp{Be>07kcx z-?G^HAXE0zF*QBO>{Ss$3`Ytnfepgrl9lG3XFSP+8>6~oMKO^*iFvt(eF@I4q<+3O z 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�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

@DEE4{kdq1)Pp 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 literal 0 HcmV?d00001 diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 2e35eb7fcd7..3ea109d7139 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -196,7 +196,7 @@ const sidebars = { items: [ "proxy/users", "proxy/team_budgets", - "proxy/project_management", + "project_management", "proxy/tag_budgets", "proxy/customers", "proxy/dynamic_rate_limit", diff --git a/docs/my-website/static/img/project_spend.png b/docs/my-website/static/img/project_spend.png new file mode 100644 index 0000000000000000000000000000000000000000..955d1786ba1a7d165b29de41a61907f05ac921d6 GIT binary patch literal 870288 zcmeEuby!qe+c(Ss36&5DrA0t#q#Hp&y1PrHyBUTN5CH)Z38?`o>FyQ*0qGbT$)S-P zn1SIN&vWX1zV|!V^B#Tw`WP;*S+iH&>t6TouD$jSQ&pC|j(-~;0|Vo_+>=M@7#PG{ z7#MhxxL43ua$57#&|g^A50xHbV3b8)Ju|~b|E9BeqOOF2;md@95g3etfk0mhT*JWd zKzH0Q#lR3w#K0hTPN`QDMOOq{>B>D-Qo>+CmvJ$$F>he}f-YgA|1dCbV|*VCUBZyZ zr2M0-j(P95HUJEaP#X-a-`eP-zrTN8qyI56a4&E$Fo-ZPeo4ptbHsGO@2!cs(tr8A zj3@cMo8sqE74#RL^AkNc3=A?x^gjb8EpCt}1_of%(ZR~yjLzG^-qB6iTkOuSErikK@0U66(EZxP-A?R|u97O9w3Dk99X|&b z2iF~Od^$QhQCG{S!s?G?e(R3@C3feTySuY6C#RQ}7l#)Qhm)%{C%2H05GU6I&Ib?J z(Jk2Bd>q})yxASy82&ZL@8dkOa-$hr8IFJKrbz7u(d~Q9zqaq@Br@r(XC)qkn|lhA+l{IjE$qm8@xgWtOR+vR`nrTb^SI5#ivZ=L>n_1}A_ zxY}5uS^6u5+`qN|>$ShM|GrLPRU27 zXEO^car8{TcKOSte{cQkM0$Tt^niz7@UIj7rRuk?qMYA%{x6d7FERV|Dq7CO@kKfR zkXdp3l8DG73=ByOxknE*y)n0DR6bbh=wo~{IGWpp>&Lps#=mf+*!uJ`qAgPHr4(1h zqZqZjVG*7SEVa(9pRqpL&m2nOJ%7%`PjQF%4I5Qhx1iuQQ_QPmTqW&A87U$e5lRvz zcvgc+i?2r$ya^#ZX6>qRu~T3GA1_Hq6u9l29;BMgZq(G9#QPA_Nd{tI0Uoaf=d)!qTmt*mngVI z!6gbVQE-WZOB7t9;1UIwD7ZwyB?>N4aEXFT6kMX<5(SqixJ1Dv3NBG_iGoWMT%zC- z1^<7dK$jdmS5Gx6gh#ZN6?oAud|D-Z^M{Vwn>t|cSBcdHkjkyL`RcOLf2seUZ=q?qq`1#ZVsyt7sq~8uS;$X(#(*nX(y4ku z2F(a!%$D;g|Cp$UKT0h&_CDzsIe9Exstm~sTxd1#&*LpM`I^U>f0V4L5!P8ebS2qS z`9~kPm?in#;B}YzPN^~A{7ATXhr*&IxY>#mSKU$i86{f}+@;X?1tHFh^1KVn@o%$5*RlxvpEpDX!?Oa_yZebx~a z$RpMbmjvB!m?SHQG7%5P~f``8N}vt-A3<{LmzWTHwY4 z9E0Jy@eU`W{<^H`PJRcXwHkUkp`WLCOOpUiV~PseShgh3kYaPkX9dlli_;1=8WDIu z_-r1V2A#?3Q-zs=ZJ4beO5rTuVGOM zDb*{KJ`sOvzkg``zi_-B5YHaE<GMt>Wv@Gfwbf117vl+*w;`@M-jgqpvu7pz6RRwRFCpN=cLHGif;2{xp; zmyt6dw&Gw;@lR#$j}`ObF7p*~58PF zL>i%OmFe{py=jjUX!W^uAM}I(|4_u6N%qbU3&QWnGnE50F>YH>0<-{1vq2ua$;CQj z%E)#`#K?Q8AzJQEoesGrCL@UFtPeC#-$ddc3El5=eK+j|46m8&01*=)=?PUTZs61i78*~TMu1I%$%k%g*!?TDqp zeYVnwPvysn!CEC%eQjYZbb!mICrSLAF=%?HT2cdUY=rC-CU&B=Kg@u5zMA3|FP0TC zze&2$bg~$co94gYT>=sH*$1blrs5#ZQ3DS4_9^$rPxBUmI(y>UjRN6bMJ1vVXO!YJ zI6)7!tI_X!sJN40@8^e%5`)7-CsC*X&+UWF$5c<-*#;2F=Y=g}1N=4o<;E^k``eFy z-2Evbn&3?HY}OL>KhHG(a&gVvKcoKlcL9VVb&lZ&7qvc1h)~G+?igXqMf5xp?sU;s zBXPg@u~}@}v!Z9RR7~fYtJ_3SC$GCp7O97b!tMHTo8IP%RU7|MtoP5PLZg=Nu@gVr zm@BZG*JU>EG1e+(=dDv4O{m1hfpwbCs)$p|`7tb0>^+9ur^5``Gg(EA2p^k^!tMMcYa{FNJ*90C zyR=R(NxE=W_pkS&N*B>e$}VDuGDKE=PFKL(FxvA|Vv8PuH)1_^*XL+V2L$^RMlwLw zSHW!)XHJc+sJ$-g`ol51X%SYj|M8?XCuxY{ocCr?O>va6I7P?3CpSXG?p#r=WRL-U zN~GP^vly$dK&!2jf2l14HloL5`u{rqv+6pL0x%4`m9xMN_kbJrK4FU;3tRLhmr~2k5)(9j~Vn2DGF8fJWc#1ev z!u(70abcP5tRD28hrb50KPh*Qo$TczKD+qyQ60l{wq@cD(fAnKEpnG}F$?3re2l>FUD;4uAJYQETzIH4Sq+R7S7iFdyh|J}tdXIL{&Ru|0wQFZK@GzI& zInHBJsH7xjEZ@l+YL`4f6S=YX!YFdL<-%)vdV1b)qo4oB-BAp%Jb3@sw|%{D`|rM) ztLlAekH7#YVfENb8e?tT)b;Gh_JK$E#F|gM?FeYL-+DS^Vm!?xI7gEwm-h>h`RuJ6HeUBhB>UUK?rox%w2wr}t%9o*H@mO)}nREIPRBp zuy#6-Qm^d7=!_e^_i_gy5*M@YXEzoZT|V;?goc7t;Ba_FUteF4m$1xFSO)tIL6?hj z_{G%sZCU?yTN-;|UA?gGUR`n1bE|=Ox!4kmrw8UI2~o5y#!-4z(0o{pt?~XTJ|?ze zGoUN`9aiVXL8{H-^Pt?>8e79dS;Y}KWF~b>YUEXNjucl)om3y1^BZ?tUfAF#9y-p{?sYwW7(K7RTvI1zT$?2-JE`58 z)i?iP=0|f-M2UBu4_5nHgagh_Xvvm(?$F>TDgxY6CGWf@vw6Z{cjLp&dsji4q!%Aj zG}}XL;6=C5!Q05&p7~EFyLYB2A77mK!7`)85s}5DoO0ZiKTHl?DFI-mVrhkExkJw@ z9DY)EPgMKS< zI{kBA^FYv0ej%g64@U) zI$D*?tGV2r30h@6P?ejzbLfwWlcOUF@ld4;)qQaG_0f_G7loyjpO=>aD@&*q+7wWW zR4x5?DS-c(MWyQvw=QUDsj50^2zh+^_2?+38+DIBcJEupRy((qPNi&uQz!+fA#+iB z?2JNu-S<_22!EB+EUa|yq5^LG@XcMF`m_Y?*|9PG-t~8B>qGbxZIbL)Y^}jYrYp04 z(9bx-<4<^|fD9%lADQQHng`LpZbQ5yp`ZD7K4Ng-nv&~2`$7(v@@QC0p<{>HHW z-i26iLuTfKg7QZ?I#xh&4eEC>#56P}PpKpV&Qg|GCFvNgb-@ZQc(|Ha;CvqIe*X;h z*aXc_0-uy5F#tq?7+7=|n7BWusCyT)>y1c`VXh8)IlgjGYyDkGK&;1URY_iQwJJoR zbO7#CuXiyHLp0_34)ar+WFDMBKeXhifDj`^ve7i>v`0yRpGC``3nP8f%DocB4lUwa zA1GVBza!d_kz0FM$^Mw0+GOLP64dOwiWD7dCj$^hwi@D5)97c`a$#w+f}Mby1|U5x zEf43a>S)i0Kbu*Bt;4v2IcKz}1zME3O_ei0);Kxljl{x|UBCNY4O0&u#7(E2MkzpY z9ePaT=AigV7q`)_O~^R4i07G(0{C;?&)vK4{3=D@ZOzmjw0OR%)1OLjx#^X*IC$W) zZUf4rOx`_kH?Hf-UZOqptg3=Noaa2^1Y_VS#$!ZlKuN**y8-Zq`9bPkJsq#UKB=G0 zD_scI@t04DB4Ie#0HVZD48k7Kz!O2y!ucn8oAFbSi~M018-tC5x1X4)6Xu{_QU9DY{ukg&w%!h1J(m}DoYCli>e-k-P4$KZ+ z6MIL;00&D;OI@#ZNqZ+FrmM+Zd=>0iHlcdE*5b_#a$VWmvxM@E_dE>q&KdLds%Hr| z>w7(a(LDT$n`L>Oa0h?%8n{X&9T6&Vws3Wm-lu!&BER;Rp9IuD!O<(-%Do!Jr{l2v zRF@`eRJ{$$`w7cQuhC+W*1G>iQM|gNADLeYBxK7Zat>M2Kb?TiOi)g#|8%BFno<)d zhVivf`V||%H|_0x`JLL$mu3}+*=w5BVVrQ(*m&AXv&4o00K64c8f+^_3W!tqI;Lad z;Am@$$n0s7-nsUZwHca8;l$2`br$^*z)o>o$*(kMc+Oa~6^uQkgSgzkXx3ys=vtZ2 zJ=lL&IE*}lRZS6JppKm`j!Bywm2gT!ex_#qb;H0O(&-*dt7nea>USD7Q+%f&)jm&7 z1y9b9XM5{FRP7nkoyq`Llot>nd5?-QjNy#kdgWDk1cgFmO7w^#Rd63zRdOTI>2Gi$Ugu zg?vp+a5w|nAcQ036a1z7D=TmJxYjU?B~-7|j35&WABm)P_hc)B0*o45mO6Esg8oBO zP!Qbu_AIb7S4Ym`*%h=7W5QEZD(ZeZ^6c-i5>8}_D#g9|U9VrgquP14p!lWkfaheu zWsQUf`ov}9ex97`vnMWFHp#~WDb;IzuF#r^7lrYjY}Mx}aExCunr@pP+?vF!dL#fk z5Gc~p(o!ip6Y?RQ?0ux`#jEoea$EKMOO@PDGI|4oAwssOZj%3xj=Lm_P? z8gee1Xm;fa!p~5rbGZi!4kM>%wOotSbYW(4@o=8@h%-=yrhb&$%}baE+M}? zl#q5f{y*I6|4fMg<<4v-2AU5LZXEA+zAv%3IU|e}e&YjseL^act`9&?HNkJiHF|(H zVGdSv|D8&YD=Ckj!({o2YTflk!M~TAf3mwD6anF45``jeREWbb;{r*GqfG;hv|VZQ zkU8?Gv~wq6Q1jC8yQ^a2sa<4%US&G5YrV$Yq*A8WNuEdv^YZag>$Srlj?n)!Kkaw* zZ+Z)N*?eHPGmBGt>^nN?R1Ju|+LYKrTHDE9^`<^zo>d7*rdTOSkm!f_nM7V_dghW$ z{&eFW*owHzMdG(3=uY01t+L5UTe34?sBVa~T-csn8V-PLzNrrJintIM6RA33iFbdx zSZWBb$m(?7Z>N795KIW$FeC*O#7b`P=4)0L_cIN%{QM2ny$?W3`F%Cna5so zLSH~tL30RisXE@>w#GputB0|Cr^d#?na6%tF2Tp?x9dF~4xb^P{r(qd@xr3=+o5p3 z5Mr7wTfeUilrJ$-r}FbPnGiwF-y}ELI615y1fraxe5Db~!@mgUte#TR8|VO&K}5?2h@8zj5A{}G>c z?}4kE7fNlw%tuGjFXpDtuZl*r(_?_EB-0&C-4`BYc-=dkTQj~|BTM=B`Vk#99E2WV zELz|e@&H)5Kx zQ@>xBRE=VD0<1yWwkjS~FqU_jY#pKJM7q6Lukq|or!%+z&fI~sNlc4P*RSQFQznm0 zu`Q*-r3X55kRIVmIyXJo(9VmmM1@FaCDJ1Rls6C?`zUW|#3#F2L99iy>0leA3r#IC z@<(Cdy>4B`{FuGLr$UF52r96rP_ zm;r$fgB(rD=ilV3U)%jBA+cRrYiADjywqk+&R~76LmSKmfcDX@;L?$dwf}4dlBN2WCvBa+ZdX?#T6%ym!>uQ3_q0?hP|Xaen8a9<#2~T`s*((2MEC zjm>9?lDzSP)XSn5D2eM9?maYekdryCTd=0|}k8 zuLB5FiNd@=2k!nQSYhlj9-Agz?$Sv0vuvv^#ap?<8E#_&Q0sO7>RSMYOcFCoOVMit zQK3^)8>JS01=W0ee02&B(!KG1a{5LS09NN-KRv(S544RDNG)-y|KdCBvw}`a0s=CXm%F4>v7fOnXq4o6}iM3fdIl`JcI@oU#*lw`o z{wG5FcfkAi1s1%M6z7=Tl_M)pYT=$bZv74^FoSUoxo+`YI)x%;tE{BW2xr;X#Y<4s zfzL`xLHoFq%i^21j54kV4`^g$ncMrRDWAtCoJ9ZheNF#}n7jp(H77qi?;pUJBHPqA_oG}j7562_?NU$RCCt2ipt8NVPWfBe0-$&1^H4ypwi%rpU=TJcv-dX zPUo;UcZx=;OW|`ZHlTpyeihlAfdgdkxhS>3yl3;~7cZ2Qgvt6QdnJ&n*W4oT|Ec6=%xNR%?7ry zVt<#Eguk?;k%88Zm6f9}>g$uX=o?@BYzIws9cwjQL&arVgNJBePFelTFW|!e3z_en zR5WB4;ZFd5^BvVUuG1DW0OZz+GYyQ-ij*Tka`CI-C`0mUWy*UadAg=kEVPs^~JQ2eHE1RBrj`fI1zQE-$xM618VlGy7( z@iL>uQfx+ZGsoz-HftDOA{jX5XB!r9m8@y8;9&@saju0%%GoGDE$bj5iPx%b<9^L4 zE3nCRy2GVc^1CI$h+!EQ1>apBKZ`8b6;7EkyFlPOM~ay{?NoaP*^;pXLq1QrE8^Tg(g8F8cw9^3AoFp z=b5F63+`b;YY}QD=AbtTnjKh7alo1x>c97m|0f3GFKrKq(G2nr9-o8VmmZd{@~ zf*tBMO?D8g4cl?ebN<^42Uc`n?_R%&Tc`t&`*4b?D1ov@m+u(VDSXUAp#>=lWR?2q z;a`^YbBZjnlKk3Y$odDn@eR)<@c>nf#}$--17cl{wz>(l!M8EUZ(2V%8}G8N&^oP( z?!Gt`>;YoEVu{#kCiMB`-%aw5(v+@_cQZnE;EG8u^z`KTP#l;BixpRyR_|IFP}n8+ zGZvO`NGM3tq@DJ7lj#owDCMTKQDnds7QG=xqU^U<90qNQ(s@GJ+r84>|JpV2x>2GkoUkUSz({$xAFl3s!O*2Jm*zp>V1;+iie%?49 z=JXS$+#D$rCs1NyA}%|nz7){N=tDsPTTSCmTJzw@2<4R*FQh%Rw4T}9;~MZgh4W`* z2aKf}&9;G-7Oky|BPj)ftCc9*bH*bTijofgot}Ton6=7lI)m%=k{d?0zkQ7B#usfjaYVq%gunU`GK*}-c%|ApH{ zPQxPeh68`ex`7vjTPUyDd=+^FUw83gncEe&GVC@O=4^$WBB7l0)cic!oc^jj2MwlM z0px_7bfv|(x{j}+$q~`R0z1v0&R?!PiLLOXEgsx zi{=q7W;B>xgDE#F;>$I6v1TP-dC|uo8GFdL4=JG72DYDwF3Q+wv|XXeHIAV%F=eF| zU7n0{6RK)>if1FW43vYDR}-YIWxc2>>}SVwXgk4H3Z||bUqZOJxR#Y!x8|A{sDvt` zv6$ciPd8V!hFwIXjOF)ErraczYZdP+({02Ijq44v0yWK2d%6@7`yLtSEQG?bzX-ys|s_q6ah=J_av6t~<9OV61AxoBl#y_5^t_ z&1(W#Zj6RR8#G77`8u8Ieq+Dq-{okR&6s0wKi&`rK%{#cvv>BnBFmaxysV9*S#gpW z?ZU}t-cEQ~H8Gj{@;kY(Iu_l>5YmHomGdrtpvv*g$Hrub>{o=^Lr?{c_^`mE!slt8 zPWG^TvCuVGvmvGNL(d6PmQ6g3M1v2p17F(XX~r4Otqq>C#N!-vKXbAP5;MlD@ONNSYzRWP4o>+G_6 zea~sX5(Gwz2-z`de`$lzXGEjB3eh*@_-hEGTZPrx*(n8iUW3|0O5j;!5lh#i91imjpHVn7C}g zt?AnFNApN#Wft8`fvD5^o0Z%g%$<>aN@lUz!Lu{tIj!MME*=v=Klm4{49;a1JD9GD zpmB>2>sf9KQke>_9Nu1RB=Qk;-q0@4eB4px#!wf3%=%>Ya57?H^xZ**$&znEsz`MR zCvahGaAx%8{QS<^D@-|wv%Qj!AD+L-d78q&|IB0MI;8=xz7BvAJ6k}2FPMyxdiDcQ zmSCH(2;Xq3-ik;0dd!^*Nz-$p(o7v|XzI7llKC*XFooH=RH>xfo9$5!2GS8*U_ba) zI8dQLn>ttX3Yhk64YttPH@){%|7{}TYqQuwopto4AIF5pJn&-a+qejAu!xaZ+p$%` zXw6BLPA%t|a>{5uqbTAtYH)Ov;&^+OnmQhM4Sjk-R|1RbiHF96?3x|O-;|v+ta0>HPC+(_UWl&m^m=g z4aOPraMD^_+=oTcA3YivRHNFr;6^Ym}V-MQ7)WZ$}b? zyC(ci{(FYu+d&e@6(=d=c0ZS>sJ}pBV+xGjWWL>hS5j>tIz<>Lo-!;N9AK70@rI!w8*M0hWW4TF_SU3l7KmIa z*cm^Al7lWZ_Ks|An77f^VH^h&$=JA;vzjmpdsQG|Gwgp zn8Fw9cP$e?+ZyTOgI7ws%^O6d*0aD*15l`GiI=|Cw&^7DK)G{SgUwFC=y>#P8D*-~ zWyXtLIH*wQ;^9$~#==*Wm|5?t(!!}Vr0}JS?{R=nQ#0O)P?^yHBJbR=+zOtSYBsQw z+J<_aMw?i0Qg@1yxX=uU|AkwwZO~4p=miwMfulNy8-i~X{czcOq6Me(biZg0> z%sZ(IVxrkF#Y;Hc_{u^J`OedQ4v(DENaL)(atl%wzH;h6(d6b=*S8{wE9wkLyapoU>OUVZlf32P9Ce7_}Dt6-}BOX=QT z_u%9tJHy)AY*<$V&fC-X%^Aw9ypeN8+qRnBsxNMG!N55YLFx8fJx|}TSJ)E#c^8XR zsg+=CynAZespHWv(31IZ%uH!l{LS?p!q}vgVl~NV=IJX*P46u{C?T;5^~#l>4&%}g~5n%HYrXj>w<;*qBl7~eIktZW;!P)pS$^Fnrs+XB%q zhPV0P{d|~?fj0cT<6}I}`2}{1J-y=Nu`RvpqQsp25@`1`pV2h;NpGa% zdMvf;_&qJEt&w|1PX6}lc&~4JMBR|?4g=}Cw&T6V736%p)3(ETcdNcAz;w7bvZJ;8 z3S-jb-L8p{jTJGmb1%>@(i>M(QaZy1)m`56UdZ^~{9v72qOf6bHq`=_nT*)n9Bbjd zZfigSV%mq|kWZ6cZC8 z*yS$Q-HVm8l z`lzTHTtCszU07D45NDt3p`S6qKO(a(6~Ld$>#M&s--N$fX}BlfAE#TGKx*F}ve%MY z%pNVO0%2c$n!FQu!$~kh(?colB=Rw`VoA)NRkxSX^>y0D?kozQLt{jKD!;5pooc#5 zF@>&6xZJ^op}ajhQfJ*aNZxXYy!vr6u+GtJQs1YE3~z#Lb6zjEQ`W}5G7^=oUMq+$7!h?Va>r*b zs8Vv?zKN8M3Kfr(jZGbKGgayhRP=zva&UuPb^%NTjh8nNPA0^k5sVz%&bd6 zZwKIsv-{P?!06c5#o3EOx93}q`ZYy4yv(hUEZ#Bi%sXJGX+@j9{qyH=rbq!`F&hJ z(p(9X*(!m@MhDzB39RAY{LFKNn0?EI#DTE23G8M&^017jLG zbW8g(Bm7`K494r>MD?ZfzE;Eboaqljy#a5J%Yu#f09tPffY^wf34X4J_Ms*GA zZUlRk2j9?3`*wNmP;a|Zjot^QhW1y52>-|e6)FSTUF&OtHoY#^tzD$*4M?W=%X8&6 zCTt_|sRMV~7DBG-RI+Gm)ViO_pX}Q~!V30Did2H=eh;5`VLVD+wi_MhHQ~R)MKX zv7&Oyv%h5OZyR=tOgX)9HfG)NUCC^21Am(sVsJeaFEv!sJ34x{mXD=Y(EQGge=xTE z+|_$6-Yp^adab?cgWDo2ox299FM|5ID(k;}K)l}CCMcM{b?bJWK}#y~2=q$5T-2-e zQv|0tNt6WYiMJx_j4B-l_~>D4l%a(yk%v0|G`>Oti_q&3=hGe!#)tX%eDcAECuOo9 zWA#r@(AG+~I=yum3X3(z+B!K9i@d*eXq~H#b3r@N!rHjMe|2cRWna}uXiRJuzwJ+~@VCL!Hif2VWGMfbOH=cbQA*B>dp(sPgF!)%G zEP9*o+{izQ?E2ruLCtY7p7Z8RSGX;_dOpP(+S)uf=d6MG0an#>G+vb4&TQ<UtJ_j zapV|NtWUA1-4Um3_qMevBai;T?%~%zxxX3elddh4c4&fIO+KIp{R(! zIPx7v$M9ha-I}(wPVG{9;XBE=8eY^<&*6ZmhvL%sb#5Q6<}1@(B9302cbU%dnTph$ zTSy44kTGXMjiHj+MBhZgLG9G9twfX~Z=CS*36Lp$wK!eUD!Vw9ZF$A2X3(;KP@y-V z>!x5a(c)x1QQ@bf25BAp-0J{8`y5DStiaFFJ1LI+CFibp_SAMDA2U;g+`&`(EXugA z&eq~=YyuYWve zyc+7Ps7B>k+PX}w>#4q>;7Hij`;zbW4pf35w z_uDRjFSn;sNsaA3Odjy_&FW0W3!60$jQE@`u`M4U{R`ow)4Kz|<|lgY5K&iK-kWQ2 zax%;l0lm>NUyE7#5P_{6`RaZDPNPfvi(1Ze4Q8Cwr`W?&^dqbsTd_QdV5akAt4GB# z#GVzeF$a$zvFYxc-p~aM_)7mAiefXNMu~=(I z6rShQcW|-Fwnm8)=%S9McS8w;Y6OMeK-$TQFq$7eunM9g+ot2WCp1!GJ-+``DvC=( zLmD0LMPy{>3E69;r|U$sSF5k|%y#dabi*s^95hb86hH>gSwF~;yhk2y4^wy??3>tQ z+Z}p2%H9*npsW&gDnl)0{chwOc2>Db zg8dS7)@AZW8Hj)fjX|x#%ydWWJ!D6;a>au5sj;`~X!mTrVqLG?(s<6sEaeGWB;DKk zXckIh2lDfDidNotaKIMxOeHZIn)Xr+j~$q3^U$BysL&qUp3c%*AYW)*+LbuJ!gQ_= zRMKvM7B@h0lNEsqqB@uzzx?vc(8GRoIX9X?4v33eE7yN~u0gXmQUb#|djRF%y`4<5^h zuS7%Sm_4ZDEDkF>o7D9(E!-&c6n}pgz=0pFKh@E=j`*HoN<}q?x?D&7DK(D5`asxC z(SA6~_-VOY7e988D9sdqW#@o_L2~(3_Z6uDlgMA~<+mgh8(vir4{#Uact~v*97uv`Z#zwNygN_XC7L&h zVvmZ9W^rydjW`Oxu|&WpM0xs^yL=lQ>1nlyIJcRiqb3_g$-=_Q+XD6^U!8`RRBE2uoz+0?g zfW!5616^qjuC8pDa8mW8b%%hN$lUVV8{PLGI+>Uh*aImeuJjyz=G@pgI$o33W9wEa zgg#iKPxuhZE4_vn(w(1ISc3y$ScE&%3=P{8g~8>iUX{2t z_NTG?VagKoMj~D}jnX^1Z*O;19}2aH)5D4X-buTt?oMR7ui;gdni`z{b=dD zrE*w~#XkCf7`6_~L!bPyb4cDP8Q!rg0un0Na-yG636741Qh@JP&TMUM@_AD7lB3fg z+gP?Yy$7=%F2pe4yeH9UZX)L}tV?eF6qR)p>0yS9VmG@;6N6LVCP{p@l3zbH^-OfG z#yXd3aC2FADhKG{3b1?C=DeQ8OP`oZ;bCBiFGH!4KIK(K2S|O!X!3rkkzjvMoCDRZ z_Q5dY-PCJz zcOYOVmouam|Dj1u%8rL2I;&}TG#9mowE9|-U(Pe8`E8>Gh)+hfkFS2T)aE-HOf|68 z2-2};$=LKZ=j>nT0O5N#Y|-+ z1c3BX@n|U)-0`$sam2)-rDA@DAc(!R`tR@y+;;wf4);AAwuSv z+*`LRWu<_G4p&we^B3z@c6sc^JKj6Wnw^9G*l@fHnx$rF9bz(cwCPG35G-;Q8 zpaDd&88Q1AqC5&gG9}72mdO@%aIf9^5R~@yrrzQDy6Gf#@i~z4jm5FK|V^>%!d5ic~YkNs(P zH#?Rw-gqdl*(QhR*d6qQ&pAydZhTJbwL{PBgQv^my5D$SZgVo}&gEC5Ekg4;GRuU2 zcxVW3lKy6;xcDvcleJd>7s~b_2Au4r7m14ORh_VUOOKX9B_3+nw%9v0L1wYdxg7N` zS8VCyp6_l)ZnsAmWtv9Zo4AR;|3THR%%TG7mM&Ye<0mPc5o?MBR705>N~5d%4=F$z zc6Mi!wP%SI zQ-nx$RCC3cc01_sI2Bltkbt5btQ;awmm->4bYvGav|Q$$8YhI-llJO)aC8Z>;qcC* z0B!kbE#UT{sOG>#>aJX`xef;ivNHVnv-in2wEMm}%Rc?s*Ri+6>NqAMradp-e19Ik zd#*OOMti_Au3VwyI&^f}Xl_4JwLg7#Am{1o!ddLzDMv?ff&>J<85;;nmQFGVxCk1N z@Bi?r*2_0@J{1-=#Y-dNdSdFmewu6XzCu0tY+A|p`AS5DgBj{N4B|zbjKY^C3xLQe zX8}(gjwkc;llHcgPl2##pzbcY@IabVE@Tprj67<6&UR0XsUI2(f>Z;f9U&5C!N*dUj5#?`M3_clXXgUP3dOuSTDR}N%?fL!+icd&gArHtfmh1lQ@$} zm(+YNf42A_j9Exc5&jLfKGATVO|yDx?<3A{)ay~ZKSZ;sj z6IygnB@E7po7L4#i}YCN(p)t4lulR2{UWBJf8VPc$QB~0Ey$6RmYvp;X!msBJ{(ak zli+7x9bo)D$C>!Jm37u9J7WNJOj03!5Jk&Mbi5eHI%K*A9$8g#Sm#dxwmQ zmbnqeWc|4^W)ghO^L2Twzt)(u;Yv5FF_bkgEEUrD;3Pdo(5c$%ldt`WkmsQ))ia;C zK|B0K>LK~Zlm`4gxGP$aW0}lK93z?(pOw2f2+z-XW6CG&lvVmCPepv~!&#~OtSvp! znRzdB=kY2^0j=CfnJTlcWA>r@p2@EkYzDpNBloZTk@#R^z@$u=uF`J``cx#X$2omB zbshbx7c%>oPS5ToN;OJ_=}@d~ZQxz3?>1A*$i9sK}O6-92jtm_1EJ0I?^ zP-ZN7>Wsdlx;IfGIZUXW7NNYx&Lg+7-(N<+w$BnH5I1V7i@D`lT`g|a+tk6BEcdskeP%!(Ot8@p;@BD-&Y$m!sgCL4*^y@ zV`KO})`AlD2z>K4fnoko@bjb3U9=*iz3Z*lkO(9LB&t8Hwr64DM0cXxMq^aTYj=)# zqhpL<1)auZ!Ia?HzHKn8_U+{Dn>XI|>BcRmxsU+Ef@bl2YuJ+%dw8vb6bX2{rZPW9 z`{Za_(=eSL_5aR-;mM8Y(}Ye0a{i@fO#jceR@0-tyj@ z|5EA0R41W9boTEG5B!qj%u!dy(_bmb|~U|y?gqclYUv4SlxU6W5z`&0@GM&39k-8lr-@ufR8|n+Eo&t0v0}b&~6J^Nr<` zbi>-LxPHb9g80|u@j<}yTT?XF%$2s?&NvFf>4S);#sTCEE6uId4@K&xI-fOpLyH~E z3J^C$$_=$>t&Kc%yL|W#`v>v zjoALsi{OE4h}^Va^^KS$XfiL-X>6f48VARYWxU>+#I%jiK3LDH*3&2V8no!zcAU-K z${$`gh$G4=E;feOX(8O)ws>Y~rXK_Squo&ivk6BC&H75$g~7peMEWc@QNJ8Ub?@qW zfR|7Ni9YS??eR9Y0SPxltxbXVpxndrdf?NOZP1z8S@DiL>5bV}&%W#(m^5XNm3h5D z2UIhz{Gs*e#G01m*Qm~`@l_IP7hmauHTgeRf9sP#*(#>h<|(-~7{R3>=k~_tup6)N_K@#V0_mMx4DxnIVX2sIrn*u z>waF3=XG&&igFoCd*J=?%!7=eKP?}g?Ye(b71jlyFUK#yjG^Ce*E7tc>G|gANzMXR zGg=$QHmV4s+Ug~tbR(j%D5s4o6_1R4D)5#QL-oNH@+Cv@-~{I4;OF`LSdsR19IW1K znOo`%x)Ezr8soWguruM>?z(9R4>27iUU-F8sZ>FS=0}O!N5DTxpwys~#x;RH^+vEj zO8bu6lbMWv%QQvScX95Gp!eYv`_q9G+)x#bzhdQcs~yX^j$xvJAakqFE2*)bUmCG7 zAhGtE5s^V} zGW%TQ8~otql3Vu6JNYpM6~nj6tW`ED#sRlkXK##2z4|MTw$55z_xE6B7)Gf!X~{xC z^sio$n(#r}Vk7*k>=DI&ckWv!v+4P{>+qlq^`i#OQ+|K1!=EsvXWNDDC&rDv8!9lY z&;E|J>&D`CgMsa0r7tIde=N2id*jy@Sk$V~Z53E;B%LydnBM49M3b}xY_=3sAhe@E z!^U})YRX}V?Ma?7Z$)PVVtDKFsj9lgw(anVOD@dkc4f-{jkx>PZ);asuqfAbfXP&I ze?#)0hqy?GVk8KF^sp$2GBmg~rVyLhkKe*~DoxGKCNop=nHzs6kx)M4mZwlwx$^OO zHi{#i{!|oPx_<~y^5lVzd9+)?!889lM$z$tP$!Zi5WI!s`eTx#JC~jShC3seCdKCf z(VI||_w#63ct_0hYg6ZS!d(3q!(4Oz_ub+t*uw)m)fql9T~l3#L3MPeV}di{`5EZg zXY!;Qrb3#(SbhvY$oj^FsuX>TuKIHoKPpjQM*p z++HJyego?UnPjVHt6pYpb#<^liy91V}a6qfyPp@fw- z=8hb9;RXJ6yl4o9@j{B9 z@0p6rM~oL}l@1#_RsC?eCH7`AHi!y{*&A_#2mqkY3_eu`sSghWV%~at(j_PoBPe?$W&%!ygwZ8iZ- zT0KRz&9XV$E$v(S{tFv8z@UdKlKH?fQWUMMEb8#q)|tYW=P=-`*Yk_Jt7c-zq5HnK zyGlnGKQjikWZxNAxMRMa@6tft;JDHSev5Xj#*VntD;-7vKHmz`BgyP3W;RqYI*t>} z4fV7ELf$26Xmco1KFz_W8GK(S=<1}e@ zV-r{M?LSJ+9(ctWKDpA-@#RaW9{HRM461X|Pt2o%UJ%<**EetbfI%6jH|c*?ssChv zI_b+LWRx`U>Oz?i9|vID!v7!avq@dmz37(^di`=BQ`W?Ge8-rNAzet&{|@2o;WaBw zA$rkwi|Er)^|B1D%Zl0ea9(z>^Wl63v69d!(r2vNFm!Rr^T^n0sWEB2+m_`IvYHZ|sD_j)wu;C3_yU;iz>EkI8~`UA@Gnhv}LOczh*J0D)AiM*es#0ki1Dj&}ZuBS&+qHI)Wsbu2=}f6tJrp z`@0;KZSA19{sQoAluiN|>!{^$*J0|Xj@%IQvPQcn>s6c{gDbGxeF@1Dgz@CwXPH-N z4Abl#Os_EKWrh^<-F`)k-jd%(0qCmUdVMKp7Xfy{UA>b>(w)Fc%?Gk3u}J61KKNyy zk4cCSOYu79)aPJp%qy!%H*uK`Dy7jh!+F`Rln_JlqYmU|NiE^o%D0;qOA|(lcsd<9 zqCP4pCYIav`@y|MMCijpc7^bbzQQc^!zC`FN>Sg>odnOMs(06NuZcM_H3 z+uFj^sJ8f?#xVXZ?Qi0*I0AKio+z-^QO{Y=A(G%1^>JvubXjQOijl27nKe44NVpEY))|BXDG5v zYU0E@+`8QIljU>u{G8h%3iHWqAC0#^PvCBy+OKC$;DO;N*I8SpIIFAWmTGBYO+(;< zU|Fiv_{l;9d(;3m%T@6G%I$r&i; zFjKF-Czd9a3`S&$ph^9yqTs#OuJ7W_g4EK^qg_f;TzLIv3}g&xGz(IpU=v)^j1g21 z-ULEpJP)QpJoP}Q_P?)JYk>Z-9VCqlPEjEVZZW8MCr_P_PaC9qJ1B-olkfth%WS)- z=qy?fdHVUF&%i4kS|PlZZ{sE2?wS{uKY{W-ih$Ray?=g_<)0aMXgpe=^xz>S<9s=| z)v!CWeGdu9b5~8tv|h5sxlKZb*(?lQ7(#6zG!lj+PD!YqZmdM3OSDp+u-yTN@ymRO zKX0e3QaP^#@0}#^?sR7CAkBeyyz}8H?;Ac_RNRh?7|DwzFSie-BN2+Aq9X&lgs)b7 zcjb-SQ8tw{mtt2DgOcA69Lm8QhR9}aK;(JgJaFUrJqZD0^g#8`tu)YT)smN`0KIo0 zb1j)7zxlK+7*!pfpkQMImP`%8{XZMlN9TfAD+UWQ%HucA%XW}Zru=5pc0ayh(vbw_ zT}SLxQ9S6l`l{IxDeRxfu3>4T=lW&WbN5GYycB`l%zGw27eY_VE#ieol7(K> zjTHw6oc<=L`G&7CyIuxpL&`HopVqSl=jh(@SR=aYrLBRN%dvFlanXZldUycnu$s?9 z5v?)84uQ;&NHu7j9#bgStOQ!ztvtz@5uAML~IJ5x7PwoxvP2Wyo^2tL~Y!-ED zjKIFlD+WkiP%`se`hPjTQcvB%z*5TEhcC7dU%FK8rH~Ipt&|r^Nv)m&EI*=J@)Pd) zsIFOv0PKDc-`#xkHPf=l0kL;sMFC%RmQ(k`Y*?Cr>PGme58rHLX~4OwdTOh;yZ9VQ~=G z+BB39CL2$eE9_6 zckp+9wjci)jY9(5|8k_$Dt5q@!>}LR}dddA&wr_QMxXxJorVao40=|=ZBKtxb0YU zp&dZa20FcANo?~pw*>o21hq7DCO9wTVg7pe1=C&WT%`+diE~!kZ;4nn?;TFcdcJRI z9QqnGONl@7)y{l+=|~OwBXviuW+c#vmFri0x+9tXzVAtMvTnn9GX-Y#{0yxKJX0`E zwTTb%H_m_4L;>$8uj_AWA(fb0eo}&En7n?@}KVU zd&9$%OPG}=l6t|{3nOb(crC^+49j-z@=PtD8TK{%b0q0c;cOCQ6_1(ym%i><#^QTB z;00~o_s`Dr&S^sxP^`K4h{88`^>3t%DI^55JB>U4OHDq)r2-BFBt;Nc89Q@qV%xw$ z_lIUn&VzG9!D*aa?Qut+LZ*L?;y$oh{{$cD%S}HqqyoHb@dm zxc9~;%H#R*id5^2hV=kxtp=nXuzQJyc;BVY9hVCjRlq;*<@0lR1|Uz?x7VNB0fL~& z%ds&u;q+H+F{ZmcS`JoSt-ozCothh~p?k)X5ZrBJ0%%Y57HJiiD)5>Q!7llAwy?`2 zW9pgjT&R@itVWKdw+~1QX{!f|fY4$J=LH5kvp~oG@WT)J-iAfT{;}jv38%gd{V?5t zw#}icZ1>nKQrItg5QDZ<&9ps5i>7vSIMF{Pg(WYpeG~hHl zSr+Omxr1$x8q+mNfl$uPl#1yfXV924Nq5!|XnRw#CR7yWeHt+OJ`twJgMV?@Kah-D z7Wg9p0w3ds0~+4IEy_sdoj0pfQCMaXw8OzTHgeFC<|L|4;49_>z%v@_HsF<2q3eKj zt*qR*0>bVYNq=$mce)!MCV?lly(-v@80=?e`_M@heax!@f}Q%u?q>2rqlyYn`A7no z1XANb%Cn9j0k=EQ-GDLb8?a9MG`Au50!`M3*giN!U8FK8v;t$_IN8=Px*79|Yy^ZN ze#A0O5p3Q9L2}9wx@8*wTe3{XkL%I%s^R-f({WqQ^KMKjm4i5tam)Du*~3{jGCC(lQCj+*CPt>p2)Fh9ql%P%%M&SJ?` z$G=~h-<(7GX;V5*@31N!<8~0JweMlmSDGnE(CK-T!z{DubWHUhpXa-}XDgTIhdq^G zjI&9aiB+9pKXLJLs~5NbcEZ1JwveCWCJQ0UWi<2n|Id0uC)<^>%zko8loJZpil8V3x1Te+>Na`~mRsx6CsvLSGzy2M z1L|*z)XncpUqb~phWRLpx%BpVZ+G&-dsqT?-CbV`NPL#`{^!u-cK$)MU?#8REp#y- z)5524UxNB(Pv7Oe!el@eO!C~v=U`#uUs_RY|HcWVvd>>bU04Y8(A*EDo!-?(bGvbO zRi1jktFy9nZqcf$SKH|6GuzyxOW`JBB0Xt*iMGRpw)2v=Tscc8Jrue$q(4p^>5)zp zFIw2!58$hqlvli2PRiFV9rN}!cem|sjLS@BcYE8v-N9xnChd#N&Lz^96`)Wr`LUEN zqdzl2jn*l3d65{1+TLN?vr;AzQv5JhlQs|Cz^@)t-M=`emjF6}d;L4?8RgS4l&^;xx4J_WD9H*Q01PeGgv6qU2S*6umoYF zCYAcH1G#5|G_rv#D>&SKzC)Hnol7?c==O?H0(wX(Gyp|;*qSFT#Zms<8ig>dScXrB5lo zVE-OUv7n+F#hn!v*4M(oyDsW+2s}@emCaBrx%IGrUObKvU zWp%E8FDGa#>CvW%YVfb>kVU~3-Z-4R5i>a~&S5ZGM6k>X)A~ zB12`tXB*~pfB3?zjL6|J(?MtTbDue)`TTlD)koGGMVtq$DXU#3z!=i~g?6cmXIawT zV*9!h-kg8(&JKD~i{rkGY*5{yGm8rhASo^+hd96ZTFw9tKoW5U`IssRL?$_K%q`^x zm&^e#97Mr4JIlw;;tg^QQgF7;JD7At2)TNWPT8f%UT}Zs?MNlhr*2`6_NB*^r>Fj> zpKV2tZ~uH*&(n5=gi2+lp4M3BY$`PPFc%s|T-{~dovijhuL`>9)>vVSc165UhqRZW%}MF`&C)#K=TmH*my5Q)mxA^# z^DdV4r|egM@%_{91Oq&vFSS*R%BciMpaG~-^SEUj{rLj$2$seskVes+wbTD1G?jf` zNOEx9cDo)1e$6OeCp{d#FUn1I+HA(O(g3VXlq#@*S-#<-s5*0ZHcm~DU8LJu8y!h; z85TKeZ$0e~Y}ZgQ@5xi3SP}6$Ib4Xc_vzrkMNs45%?r}gk#I^TMKwQ8V_0ox(e`1= z-L;dAisXnkhADR-qBe(-=2!2?K;A6x{{g9)H{RUWs>U+V=hp(yr! zKC&uEb97P_(`#c%_4YqRJT5m#xU0!7Omao)wvX*u-oX$2iG_`Ae-x3P`fPwP^j(>` zF-zNXX##=gCpcMNdH!STtJQ-1jUY_x9V1OX-Sn|GL@*@=a*p)=ElA>@Qn~@RT~#ux z=@$nh3(5b%I*+Ln4?8{v&qbr@#1OQ%3kC!hlP}F zDM)WNYX70#vWvx+kEdfa-q;s`7wDk2lIkQZEmpEwRC7p=gYVgdFU6UF?$rFQ0?uc0 zOEK-9CJo%}4MLAqeh(!NC!=N&|ixfOyLASMi3KhVx?<#*j(Vp;lqJO3U!>#TO1BF!muYl;fi+3TgT z{gs|38kd)dg*r?}xlJg2{mmYIkTj#Fr8#D?i9KU#;gr5tBM6Obg1vUNbdyBGYz0jC zm&~__u{Vvo9c3do@XkvkRpw;tubvc`viYLL)8fE*ZS}Z#0i~4%+^4iyDZk5#RgGJN z6@4N6(%9RPKIGc!4h%?E!gZaA7>5Y3W>G>iXu>rNx|7`NAV5=p*l z3Apkj8;Fh}P7kZ=9-<&|<>^fzFA{F?=@Kg`OU*vIDAAgJErdz!vA**V1q|v|3fZuE zkg|W#qOCMI&sfd6pYrx&mR=xmCA2%5!PqkkYRB$HK+Eu>ow~bUWe#DYLvNPIrZ4=( z84Fff68pd4(TGx)-w*xl;yKdHdbhgFzxkMa59&&~lY@u^*Z!z>w-;yZ*sX?WLDz8d zF|f;W(In3-&-01?(iY!!c#MUY@(H^cH*m1@^Sr%Z0@!bgWfv_BsKN%1o%Lh z%FCk`B1U-xeSd>Kp8I|iwM78k4=l+h0&dd)8|=CIjehfY)-^G2@HVH z7oA$rhC4#8_xqc~qX2wTPwnzrXz1k!b(c#CBlm~abQ7eyug3jZB4ArXnO(UB6WdEO zie0b@$SKffL4!kmWu$tVXD<4uLqJ`iv5Ea;>H4*gbPBV%n0>_H2e8-8QsMTDm7s*4 z`Ny~srg9nNn(W8}3B14kNuiD#q?}-46r;t{;{y_w@ODyySe}D{mUoFtUX0S^!7?Nd zn&)$u&qWm{w+&aw25o&`yi|7m@{=iLzihAJx}}ICX#YO)I9-4CEV9GN%`yU_@`1c0 zkga63^p_v47hpQzrdr`^0%wwTK(vIB(mW5P&;D+X=b^jnQN6y!vtMQPy=5219X?6u zXp4a-;Hjx9E!7IDD9)og4CNBwZT=bFH;Htm|eV^OL6?tXr*dm zjQ<3@=kT{-jlWJe5&7hUz6+!bx4WV$vxh`63vQM%5HV&Zc~+0nFGrXmnppG>iz1Gt}IqyawFd&Ltd+ig!!iI2d1!) zV|wemfc5!b^B1C*y?((M-4SG>EZ_jW^Mg(X zyS3YqnmHxy_PyUQ_m64YVT?m-!QPdYE>E2p`aC)6+&aB)junJbgjh+glXuSS+LvoY zmP_F~4J|Rk_ul2VwEah*OG*-e^_(j0^erQ-Gpd&RuDA7e0hBccBCWZ)2IYiT_2+Nk z-`dv{;+-hg#Y?+9VIgqg{dM*)w{4nEjb^BZ>j309#Z+UNzx+v!vJ#mjxRHN{md1%; zoDLq}{yQ&08*V7kdZ~bJ+IKV`6s88;Vici8~b^7#8X9~Hs-x( zd%&9^I(P0tv$wy&gTihXw7&jH$l6SA$U3s=vIQHuM?#C2y!c2OXX#Fq?Sf?o>hRKl zQqB+mcJfxrqpWGhNDbU%!nQ+iFg2#L(Dx0_GbKmj-gyIH;L7!g5{IhWNdo>oqs#Uv z{kmACW6#8(xn!PcWjb5m6Sy~!3?_w@Po&+wVAL4Cu`)!2DbAit7SRSepEbi#NC^Xk z2&rOyrrVTn>g5ow4Q$i2-UYS|2^y$cTz3pYj#;)WF#gg^&%KKiB->f zU|Mq?q}NFc5aMFonAMzph%Zfb>;9!EVa1QXPia`o6>?Qaz2?{Ni+tqkyJou(c>8Tc zf94Pp3%jlZkKC&HJ2zG5YWk_L+IL|5MtDeggNnZid2w}D(F_~YiG4(7c^_a`q+*e} zNTz_Ktls*cEx9r$q7@nT`J1`)9Pkb&V+XGV;}LcEN#+kXix1n}UNxTFFipep$2=8) zv0CH1W6>E5ultl_D?PfZ!~SVpmMsh8GqP-34cO{Ej&CO>+UbYrb4g-hk~?xPeD~bj z9+PQ*mP}H!`{O`-L%ly)&fzqpqPs;lVcQ$=?Kmr#K}DvdKagxF8P_TZtJ%q;prATu z@en5n7|+){9vpGb;_iww?hbAL*x$QQrT6 zAXf1X%-*-1%L9SP-OJnTQ}K@0ET7dW>D3#Qf9*N(Zdo?lPj|anhBMpte}Dfx6mO8e zMit$<0Y3zEG(4E6v>9wD&y|yYhWvI*juAP?&x8wAT0H%?Zo2^eS+SB-10#3|BPiH#5Ul^u}`bG{Ws(;)UQ;~ML-Oo$dwm#g8Mzh1FjYPbv`L8<8sz>xI z6&SL&i%iQzTC<<+x>&`tGE4g(eERs%B9R*m6i;eHI7JUu7I!?JTNk5(y)ibs%GNfC za`N20^3i+9PBo_$$&2Ah3x;UIEny=-8_2eVawgKYpN(mRP&%9@o)tLWG2am6E8EnV zGz5xWA8xZtp_fiA-O+*OC@mO||1sZ-wA%W6xX65X&(VwfssSrtn(6VUwiK`!JoVyj z1J<|$RK=$OYeD%oL^OBSITaSp9y^W+UKt6(lLkF(5e!aD!|2?_7C(mB-(!4cI+a$` z^w4jyLc)zO%bFm6aCem9iY7$-w;xDO#l3uM1B0CPU2*ZXWdUKNaKMm)TR(7hb79I- z;?kCnrb<~27nw&s!d1bh;&im0bD#%3M14xZfVWCv5SaH*PyYWn>yWo9T@-h7Lcyo` z*n!#PCqzj6%~WELYj8f^@`bc06H^Q0&8BQ&bR)CDd&03eas^iq9Zl-lkc9Dkq)B-6x^3fi;$TSrOFW#r z;r~l%S~TDHITTu2%YIQZn0|fZ|N0O*$P(4^H+xy){L0`->a$33ooA_w zuJDCBrit432@$81_VgcS{C?{fUpROXzRq!6VHH0Tw||$Xcj!3TmkW46^7pgEm|y%# zOq)RaB?uH7ed1fx`mH`VkF~1hzR&BCh!{rpCxDH!pM6mO=xRymfzlxW;v)n~lFJLa zqZmF7O90eic^_wxonGlz)GKVCJFC?#Xig`f#^PC%HOS-5ndPE+n)73slHc640@VAJ z$~8L9GG87s2%YQECX{&W7)s^Iv+#GA$!Q0Y9f=kv4YgkfhlV@bQ?G9HI7h=XJ={#J z8rY2f!A^QlPDfrEi~wV!|9PbQ{WDWnm~s2Um~Y3erQZH(MQ%;sQ5=tgjv ztK}xJaY90JZFKHRLcxl(+fZF?okE6A*r6XXA98evsY0;;Dxs}IfJ|M(9N5Hy%A z(>|Ryqc!uqG37rIMSuW&z!zThnNf<=GN%d_b4yX&!o$E$ATnhCH)vK4#p|$uMz;bG zAkJ;7dmluHx*ps#xUBM4Yw^M1Up%hA#C?LqxOSdPKr?XfSS6KTruYEwp2n(2eZwm= zK7Lr$R)1QQaM^7BWU{`D#M?_*K-WJnWti}`q%5Ij`7p@mwTa$Tl@ju=L(2JqlQFIQ z^Y%dbmO7`j1Ch4t6i)|$omfti7V5cnQz!Jx?q2;DHLUYsdBwcL#k9Kkx{MBhIc=6V z+2%whR)3U>{cdM(KjOk=**}BeJ<7mxTR+I0-#H3{WqS5d^hbx9Y-z(E;LmlW@L!QI zCxp#WIM+ zx(T%vhH0o9q!OSqM~4GL2v7M4F@Cg(FVjG#OIB2Hk@Spo+O>xF@OO{0nTVM@yiL0) zy@gg>?KNdWFgT+?Q)hZf`fN$8+$Wt=c?#}x<$3QGzYR&fjIZ?jIXme2f4*8w`G;kX zUX^qa-7^PGliE|baSE?Q(j#zHXe|2g8%V(a2=0I59Zm7-5;>sFr zWZo@zYotw|R85~qW~0^liE_ee#54GPZM>e2 zJ^zqjG>w^jYsH=)CX3RtCuc*MKMoALYQPva{g%NHF9aITyaY&BxkQJ)$NICl6VUK+ zvU9vzq~Ysj9Hk2M^H}-;yf7KRywp(*Si69LH~VjFhW%WmrrTl|msk?e5bYO_;LkrG zL=fz+*q%vC9QB|V-G;RgU(O^-ASgeFhB=#Uv}8`FG`!aI8e^?J>Fwxyn7^zp|Ek2* zt^B&=WqF@5TeFSCRn^&ql2ahW)-yBqB9NBaVy5q~!r1L@Y_)@B8}mIs1(*11ZQz3& z)87$i>I}I1s*Ad62daPiMKGozEJzU>H#;c}?!exNUZoOBPMavcTLYdZX#fR`ry4{x zexZxXLzS4wHox_Q^VYt=uS;|w+d`5WPJz7*KzO&Lxs?RuE_1Z;uuH~AM^-oEv1&)q zp)&_ZMRWtt2qosyRQFZMrfP${c~1sP@VMAu~EKXz1fDYC*}Zvu+2?r*17U>1HPwkZCnA?CGZG zjo$8sp#4t_=4Xubi%t?`x*?PFE;$Mp1YV9w)Si789t$#bc}0mNM`!IYw&(dhe#L)B z2her=>-}-R@t5rwre3Y9^N(q3(vE_Ai57OrM}4=*Y7(d~z*KD3@F$r#HX$^A(&46H^*j|EdoOK<8C%Ai zC)rUy|77OyEbBu0XUDr_7r)1OW23-$bfxQ2=Q-%E0?u*zStb45Lu>%K1LMwiuPdLN zAJgY`Ba@VEddWjnLtzsgym0FDlLVeCUw?-aT2~xjS^}*p=KW7Az-v8Kr-23@*S-@) zlNqhS{ikrBzoAprf!CTPy3zVVoc)dl&{`je)6gxYQzKFzpY(+Ttl~{#Q30kH0FF(E zJrK(Z=HqyWO91%&OPJJvcan`;6G zij1yj<`wHu#(JhrJ{*e-okz_Y@0%@wiJr1KI`m1-U|^oZbwG!oR^X`lI++-pm5sKOX>>WPIGPav z3scnWpIxC2v7+L!=bY1dS@Kf5S4-|1?*}nBh#JHgCI&wVy6NoTAc^iFRU}NGFPmF~ z4wP__FG?PxZ^LaZx0VITcQOlRLkC>I8$6R&BcZ~S@=izBy9_Sh;IHpzN%+eWez4h3 zKHk1QXZWN#&M48~V!q?#D*1mEyGN-hUAEHaZa#YvgFU#S4@Iw2DZeYJg`Gnmc*;EZ z04^qC6L#=F=}@C__L2$Qo7WWMum5gkTGixPjh@N_=;YfQi*xT5NVY|1sN|u%G zQJN%|pEcHTrC=UOvkC-OXjSShC_(X0Vu4=r3AS!JNe5@=(wEpL^E(J4;WoG!@~{(2 zc<-y1V-l4A-o@(Vo}baA*#H*h7I1ee?Q6=jm-VC6Jn+l<#*X9~!|fD3kSQ~@i>Jv~ zYo#RxFr1RtWSVW=RDq{K@^oHwbzPo|lp0&>0_Iq$BtP^zsRv$d86WmT)kwH~*Qa=x z9>)vwDmWGs5|oAp4{CckFH{Q7ICkFsIf6H?#^Q%MFEgnrE~IUr^g9ZMd~otCM<|tk z)fW!8N;f!F?hSV@)m(gV(x!LXe)C_`y+dD9+;>^2A~Nw`yb2MEkfr8|h}118aa*uS zLDj&$T8l7gK^D&2mIqtl?B>*?(Xq3iMFVJ$deiQbd_~O{9Ne$AiGt|?h8^-G+(^gJiVLFM)X8jnJ!D3G7) ziI9f`sUyj(nlP0ymkgfMAyW$aWq|dau1cT z>^sjfbZpcP8rj!9@sOns_IEdkK^J2xzh9SOnfsdf!_wHBRo=85^M-BH;|I*0H|wkk zkc!ht2@>N-w}v_A>iks^vmmnvWP3yfeMJ|*o4$CSy#rj^*tovw-vlbkEL_A!#S(#M zHyZ12CEYC`Ohym=W}Yf>WPT1Uiu!jWoGnQrNis`Ja?O#Kf#Bgua(;i&5Kc@jVtLOO z&vk-4`UUHccYnBP?@#VV&Ycr{Yw_6Blc5@ugBtEMhx!w7dr!o3az1{alDF|H_@lmn zd1GHRF~|HytP1Usc5_Ru79$v4s?t!Ou){K2kP^eBN$pU++oL_q+gfHF%X6J~TE*el zoCTRkrZ8uL+z!ungmW*kKaB3fwXMx-+KG@oR}kZlurHQ#PvlGhDOD#n-1?X-~2&EXW)gE@tj+&JJFNW!gs_WUmw#O z_l*7O#eBWn48nBsJ%}~t*To0d2S4Z(SkC;d5$|B~VvNQT`n8B-!6uKCSA0frY%(=? zVn_IX6KT-@Jfm!K3bH>@r)wYYfB9CXktC_APhi#({F6DwdDZ^Dde-e!{J~N)_^ekX z@l}%`C!NKRUx-z1du73h&J2+~5OUld2WG9E z(+rM!%dm3QTzs7^9GOd0?Wp$h3dT|yfM)lA?l^kYGd6Jof3cE#dt9=2frle z_FC=?(y!7K-_f|c3D+b0?(!t?A(MM3b#CmC?aw=+r~NDsU{O>NV~0VPX;-1k9kkrn zxg+5L|F;&vbskIGCp?lNx%hni#CI#}EZs$cruXdGYFNxfYgRoxyg?pOlso{1dltHz zTkc9~D%HPZq8zNNkPbK6&?z+1#a!nG(&>5>l~|IpuOgD#*B>II_Svd~b%Rnp?$4B@L4V2ZWa zg5u*g@t)u2ABFDSzbCu}86N1mI;N~E++D&t8-8;JK+GYXmR%reER+)En}6Ry zTP?}VmYA<*0iR0j_NE(e%`Z~ydByR!{ryvd>7um+=L!?Z`qZODFi;~+MR%$>X6Vpg zu|ewn$>ZGH4_@3^##}4UChNHzB%6X_J%g4tTa~`CQND#_j24mpAa<|Pm}8m1^38Zl zxCn`cd1gBqmk6!&to(|gDtUo&@*R=xBZUg zHIU=so(=IUAl`;^@?qAx85p8(=C=}Qho}1fWw$x0=8o3wN_Y`D-X}%ZH!?g!2|eM5 z_D-%ATBqMVZ$&!qh61q1twla1TE701o^M(xucvomFyxj0BT@6ze$Cr`k}1zfvMwU? zCpqVcRVpio*;55o{dwE1L$;2eYP#%kiQ!t{ArhgZ*ZnREL}+|b;GC^vxb!StQC7To3muIe>j70!=V>4DM1w%>TwKk$!t7^_X<9b1pT-`EeX z#JjmE^MWiv5#Lp8=r6x%1kEHP|etNE({InzFENEI;C zF7x&c3?CL^n@L#g7@wE&xVD*Rd2mCq4T!ISs%EYtGXyQS}E^TX?BK#$JFmR!!5t zG6ebFGh9Uk{`AWZRyN;4YHDXW7_6+DPR-KW=2FeY!Sj(nDoZ~-z6d_JtMGUe5cM|l z&+)>$zLv)`#~FzV-^&^2j`5$gvRd#3E9QxVTLXxW#Hp&2k8mlE8*@$#kD zI9kgiph)BkR^E?LkabqNNJL1n(=Prnw0`pDc_htZi-2@lk!=QHpMYahEs;~CM8hZN=&OSUHa-qh49_=N(KO=?!n_y*iiwsB>DMPTUc0){T5vmL~X5- zqB7Hr-^;dzf!%G+B@=EQaJAeE4xaZ;0O^-HPD+xLeQQb9+H}i3Ol$k`xBiiB%s8d_ z9Q9^#P`jRJ*P`3j>BIE7=r@iJ8~&A6vgmin+k7k!ko$)=G8<6<*d%brE|Nh#?|7ObFap97-E;?YEeL{8orbGGfRa@ z1j7NJ^W}>VgzPWgy5nXmZobm?YDSqN)+dd+-S*-@syL)}H&AJ7L%GRIzUXbFEwkcbu8*K8 zbWXHtw@T>+eZ0qyXps7C zphF9w3n9vsO+;N(og<-XkX9i7I#~91w@kd$?qiMTcS=;(j6op;B$P>9QG`q~!K11i zSeoZLC(mx4Yo_==|Ir}}A!H1$*oL~V8E)W3{7l>1kzGIj>`86`Mh{UC{P>ZtN^leN z@^Rvz^DvzvF`7c@&*;;xsOMin?0OVjVt+a83b}X8Kjy^L?^P%bnsT1zw(M~k;v6~l zCA;FEE~p7?haP3Pr+dew#(Lc3s&GR0(!^8zC=LEa)^11I914OFq^C>qHop|60jzcd z0fS}?DN=(bfKP9Uit^>MKuY%x@dAxV1z#RKT~MweOyn@UkM~%ZyMg;;ibIgqU+G7Y z3`s|idHnY{NJRW+B_GaNF>Y==T}{mbYa!Xu*Z4M;7XM|ZtQ=k1JA9`bLkvmH|``F_n zHJQJT!TWHHJ`(XKj*1oHeN`N?WIfX1>OaBI=7EAa@;};~N>QH_B=PdERafPJnm-gL zX|r&hy53!c4JQRJ8qZV`4bHmU>k9KMHI86<%-e)fQ8TVQ7gAyJoZ|fx2H6l(wt5!Ku)7}UE~UL1qV{ir3mv>{36aH0P(g`p{@eYV;Z_GOr;t&3M@NXug2Ue6BV(rNiT*$wjZ!5v9Wa@ZG!&H$mE%L2N=!NGKU z%tswEAJTi5axIjX4{~VkG4GT_)MP&40ka^4JE*M%CFcz^sR`EHWS4oaUja*tr5(98 z28)1Pfebw>!H`p80+%Byg&SQHpcWX+t9C#uDhn%=G3cKCPi4F$u9aF zHL?j+Hu1b(oZ1?IWl4x(H+(}Whq^UgS5|KjvHc`Usu8wJTcztt!G6D4j#UY`&0jJR z$rmjgK-su1ZzS)vxNrP0awZ292A6vaK|MmXTCnFsm zO)o@b@S_R6G4#(G&3o-)=3H@1a`#%Cojh?^FWsuwuU4gn%vl;}!;!~t9|;5m&Z|65eb?voa1-e`ZEIpPKwr2) zdPYW5x#_<}bQRpkJaCU*6%PsPR-s4|vDSLRP+^zh&=Foc2SAv8_?UUVPWT3ltM#W>dU`JMkdB6YNpbeZUp5M(d z^hVlM$7b@znvocWw<(yb$q)6K?f&X}lv(!fHoi9QPg9iRN@7-$eG9H2;C)|8Q5JE^ zXt^O984;$$70}f^Bli#W%y_}j^xpKZlI(^32CUP8o@C-@B8Kjw3Qfe12uB(uc^E<~ z#3YN~st5D-&EeTYr!MJVRItn(zp0bQUAJ5f!}%MjvgQ4AR~gTW|Wwso`Y?Idk6M7tOu+bSNmz zJp3U+Nm_fZN2>WM#B_JhNR-4&=q7}|qk>~x_YTbWrE4~M#mu-?P&k4n{_=NfvY=85VDlBMTzDSS3kNh5##^-lG*jDVs_TSte>PO<@ z4})hva%MdCP86W5a=rg(IpFH#b-msje#J_m&Ip$Ekvva>ozA`4XV7|TD&Xm(=SsjU z>bJT><`l^~!JTVR9>T5UA61vye9@4$TgkN6Gzeu|W}Ijq8Lbv0(n9=t zbUOWCu(9}gB0Kvn1LH5*0{{S}e`=&rEwdfkYs$Ng!+F;d` z=vvs8GD8YW>~=8j>SA-nBXonrRr6TOSehJ%vpLv0sl^q9-C-^mPywPgUZ{C)IbPnf z4bgbnMi=Ypc`dKL-LTpphdExJea`mCDwruX)xfhD#<;hvbz3#-0b)@KHk`kC zG}7f#tnkHh?@uKB&shJB_djF0xd-Qa-rn}E-t=W6=>N*DjnZ%PeZ+o@aVKbg)a`j| zWCR~u$igmsUvs(J8`SH&ES6#2k(<$FK(+bLJRPQj;uDQ8ZiW@*)EK`nVOln&E5pGO zi$uS#Q)yJ8Jhdjut;-B+aIGlXm|p zw(@r>*D|U5>FlQ{O_Lt)=)EfBj~oLXx``_ycobhvp~;Dpe1vGs{U3pTTaFU+--KuO zOymj9k^hIQuMTP>?7Iybq{V5m;O@{;+#QO$28R}RcPQ>!TuOoBP~4$tad(2dTkxB{ z?|0|Q?9Bd=nVn50JNumHobx+}&M>P6X|=;f7LD?rUiWFfppxIfpj|Fp0n>?V+?snH z5lK!$xTLZ-tW$Je1}6bU9V60`dQVL6la}6;*!Rc{gCOoZ*|d#$u;*F}V7e5E(lNie zzBiE(AQ*v*bmVki#FG*}s!$k$57Mp7_r^LiM~A2VEkJxcwG z@Ta8+!WsEnMy*nO%Kmh$Hr+2K`QWH&SweOY4}t6qGaz zStsgpcr*kRqu1p-MYQc|zJ;Hia`=k1q%T8cz5^ZLl-F?CQn~Q_t{!Y5{inJG!v9h_ zAdJsn?XG|c$GJH;L4(3$pp3Q&K9K}w*>>eh98XvfpfTrfnW3xLiRCzfM(Lpt^Fx^h zJ~fYt%E~b6Cmqo$oHq#-P;J0Sklk7f6Zo^cgTp#&ofb65W2XDLb+z<)?jPbxaRPv) z+a~bWcS|BuH;3B)`bGt$+i7Y^N9x@>BWdb~Ip(9=C6WHkrRtZUP)kGm?)C7n{ecw4 zZqiuuMOPY+`TF{8hH$rU1BsrCoyqZ_?o-9NEi7-Rn>NrWEfsGZPnq2M0@ru%#VY}!7{$-`6B7i)#D|%N_rqBI;o2+Ey7`=x=96r zYR_$T|ERUg_-8n!joe68N`HLWm53(|HZp#j4lBPhvp?>HjK2v%8Y($1%M@Hv`4hwU z8;PJj;X9IW*iW;Q*K55eT-^(((t_`(2T9oEPi%eF>$=rcWt5FU0qx=e!%0KwLGLZRGq>)*3yqKxvQw6Bm>3%uko9* z22*7TbqiU58}1eRS}q{y;k5nnU86glh_pbpeKA~g%Q&fPl)*5OYz=!e+<>6~_3KtU zWOtO0sm)F;djEQF?=x63OkPTU_Tr4eeWUw%*ON~O;+M*l2!Y?upqaY3J6R*rZ{^@p z8jzk3n^=cgzBUBC5Fis+HTg(4-+nIce%$Zae;eSIptN_exC^KOcb!k*{>8VpOBv5u zk<8hvG!R7ImJw)>&3sHB?%5#u z!k9C(zx_q3+7X2#lB5Y}#nFjzO@qt?`jk04ITT znQn*NoI2inz(W?9*g#w&b;R6aujo!iI)2s}+tifD1(-rYrd^32?*prg+=k-RsJxH+ z3dcuz-w1m+TW9W6H?aYz)>PHZJ6r)$1<91TSVzxIK30GbSF2Nm)Z}o$ZF$PGyq~+M zU&l$UpI|^Y{4aIIkNzyR-!Jaq=yzRc_VyTY($T#zP5+RglXWi@0SQZ8;0BW#^@v=a}fl`@bxM zMlT!=GszNlaDRBu!sd9whw`Z@3tWN~%dz{dTl1r=t~|?WQ05(vi^#;w=$X=R0$(Hf zn*oge4DsJ){_v4;x_Bg@VE+?d$p3Xz<6&rD#*-XMW1eWm+tvjQQzzaMd&rnN>pAQh z2J_Ai{1||^&>BBak9X9HJYaU*Eq(5}Q?2Y1+ULcSU2Ab>^B@oVgmI(d+5&VW32U?6 zX|s5EgZIXZIhJnqH*+pPckdi07%y^OuEBaXOm6)Jp1roE9jx0@I?DJQQmUfF3@WtWE-uDfm%XZkC7u~KU{$#m1?`^;Rc{FwhNmn zuBK}+R6pDDe(IWhUg0Hm|LZzDEFV+>A9t$0K{T2G5H6@LHxw8d9pdOH=%tbG^}%r> zSW{*f&l<+grTCEWJ~le+VH7~*h*-5H;Idw`LuhrjAK!){Y6^{RTC;y;7Y0V2^&>9q zp!iEQZu%i1)xFr>Wv^GVU?`J&$poD5;agHj!QWV6__|!WD3_f5D#PoIf7uMT1PZ_F z=uqi%*Dg#Dh93J}*k74SLj&V&V|h~h38Am?NXrd2swUUv4yLbq?uQk`p8&M(M;aj& z(E31YD{ejwEwmpv%JutgPJ7_tcjv{yKsO+<27&wtBjF?fk|FXfyhx=j1GW|Yvsks> zX1aAsMv{(eDeW&lcRSQM)J{|A3-802TzSzgUCgpJ>gW2l#l0T2)AuoF$Yopfi){V@ zH4sTmjD!1=EvFc(Dnv7J~#a*d9Fln;<)I<8zAqv+9Y;afpE7MPa6o`&;_%J6-u(=Ii=Gx>m6R3 zxh2hV0R+o1y4IZOi*az1aq~MzP_7i`Qy==zr0lry$pqX3C<8!sd{RdoL}su)DaPlg zZtqaj*?02|Yd_>FjIZn(`3WIs?hSBQULLWej)|wR8EyiAC}J245ILQjm1o2C2zODn zDN&z|$70%XRiXwnj4|(O=y|t38RRR%l0w5NsNyExZYBRblS9IqU=lGtHqYRSk@Ghf z00hF5;LPS;UO6+r=lIQSIsR=_i`fBiJ;cL7Yvcb_x5T!lxoZ4fnYH6yAh4sd&#~8j z9tT)pjsA(DD-j84_(biP6~pK)_?#QzYa+`ssxY>5iw;0`o0*o9xo{GDC?`DPkFGRs zHrjpmrbOXKfXV_NeDc#ao#p5|ge(R*=t_jEli$-C^wJ}DkUQ)whKH_}QE^`$KvPcv zc8TT5S8KoCbnY%y>SS*ox)UG%K$qKMXk?j145m8r_tdG`QGXv9w=F=aCg_RrhX+C$ zIXIGD7xw5k78ZBWpUt*-vsvsn^Sm|ic$b54#lwCyntPY>3VTU^-w43XSy8@reL^l= zmjn;oU7ZQSM1BFFCMs}_VL`^JS3lt!1s?Y|k&GBVv1ZXXf1rM+{gZ}{9{kEUAD*_4 z;X=JnXIHTEO*Jil|A8ZcsL(-=4PR3J->vwTGdWR6zi700`VXrh4eI>FHpL5n@8U!) zGR2T?iy)mTdpSCy83mLwMHn?5xHdiw%PjvRn1*0Bl#~ zNX{sq-usj=!Na9tBxC$OThcIew^TotTfW(l#s}C_Q`!ve>QQMa3AsS`oh()JjMggLm@{26dsd4FY_2z`)E+muAKABa`#n?Dm z9>{;-aSZOGfZClf2fp=xM12rObxyol=o@irO0tphPuXvbO;q{b=Y7_Iuiz9^6*m{& zzK9kc6GES{wV2==rfwmouGCXvh6~;H%a(p!=Hl(&E>0ZSSH`95`0#x=&&KFN5U0(( zcHMUGB=H)(Rhp?FUFe&mDqb=@;b`{UD%nvHT<$)($8MyqY;v}?QbMN)5>1%&?5gEg zuXfW;pG7o0763$5#qg);PG^=O+bWml;oO}3A{kz}$kUpDp0Vh>O@6BH!RrM~4APz@ z5rM^oh;k6!BD*2!nLV0tqA${K*jtC2!biB^Q79+NW2aM@Ncs$XQrthRM6O^!P`DQZUhcg6 zcQa4e&5C#;DyRVRvWBq;X)R~HEGeNVi&&j0K&=1IIP@DdK39_jgl5qhBvs9vNDRDsKAAAVk+5^}9+4+kJlQ)ogxZ;9ek0D9=Sk24S>DZlI%#N;ew5hM z@G$2+2U8*`8Wd)(S&kDL=P{3 zF|ii}fm%_?-;My>r+|Hd<1LiuSb=;AGwT(Xv7ls71;r)Rq4He3exMVa!;r2~4O4}; zey#`7!v|}O8pm)B(_Sj;hyi9`Xvd%rG4N|2C`UU*{Le~u284C-y-!#bl0dQRw;v_aNtMoQgt;t!s@#4PQ zeJ~*OP&Z5A{eK1VV*hqG9>^|+HLo>aO_u}4SQ=uvdAS6E;_jJoYsD&Ye zU1_!*7yIwMV)O~#K~VLipGN;-)r1VdC(M;=EGftN-59ZGNVt15wEsmzmLk2_=erkHl+0*t~AYg$KcGY*2 z2>J(uYu5tbXG<6$&q1im*#Fgu?~m~JPhd&4{!cYlkBlNiwne{F=SBsWni3Gc?`X&5 zRsp&=>>B5X@qY^$%(2D{Wd9+CfER`v>XJYB=l-{;rLD<;N{AjoW9C=J9TB#0pF^-0 z%oz254gn#cgCQ=Um>*YG5vy+l;0&>%B@g>RDELDP#GNBtyUwTfye0g+gmVhSo3OJ! zQm*DkButk>$L&bv+%R3C$g0F8*OL6B{TaEK_6sfQR!}@_NqEU&j z_WGT;Pbc8lQk>Rb%%~&$D}^LCRa*Q&kGaQW5?Kfd%=gNbNQI|$UQVSZBf+9p96x%9 zC$UKfa`k^6^X^8#?-R*3@a7$i04jl-I6@4~Wk-@eiJJmxBx|I+AY;a=GElrk#x-|PG{i5UM zq2~K`NMT|iaKIfYY&QDda#cVTHS8kV1cF5 z!7!&^ET-d{cVcQ2_^sr)&uM}@^8Dg9*v;as0mzdv_*r}RoKa5i1&(jTjpk`vGT5#jv-d# zh!%kp<2PC~D2OK)3to7nlz-W|?cf(hVSKwmGh)JFW{!B%nKQ?aGrF%VJ+S}d$BoD= zu54$lfBvL3=sVNdVwkmLtCeKj)(ic&-;d&@*+N-2wGD3aF7qK(bw!q1Wy(Q4-Z&=! zYR{{B({6NW3`B1Gd7a|@qsG%OzFL>Ra4yfkm?fkLMX5U1u*OKCTT+4GNdBL$+NAwu(GE!*+DWm8q7k+n@? zk3-~!gd#6-u^*mzT@6p((I5COGEf7PJfOj69bb>oWrLiLv9sNs679^d%y}O8yu7cO zBJs+x#L}eQEwlXZ()^j@2R0y=DVd^$E#A|<6~(Os$8XHe!UKNvCkH?$r7aQXQmA^( zhXJkeo&Vv$H8FwbDJ#}ioVgLit}WNqax{Cj3dk4=9ZuA*3m~Gyh)X?6UmW@0-wodT z7|V_^DnD-?MRgY!ch+tir%`891&E;04$H}pr0M9V6K6eNP6dVjMmMxU1ykl+#Eo1e z?9*EMQadZ*9C|oM4Nb^ju(AEf&0x(oV@dZ8mG&ui-jyQ*B39dfJ_@)V$A)twb`U*Q zkES@RI@I78LAoD;x%$+Z8{<18r+dOE@JZwTB5$-U%3%Oy0_S00KXn++CF?r6nfwdV zW#6Qvo4AFAHgi+gP&iAGY)*`f{TF+Cj5Y7qq`aEu*=quBV5EGcxxYE%F5W}*WV_vZ zhb1`~dY0F$Pra?Rg0gnHB@*~Ku_7s>)BTVri1xspHt8eXmhP5ZQm?$l?e8`>Ngk5M z84~)Z*5+m%(dK!}w2@OwTWPemwbYn;6^?WR{ze`BAEnJKJifc~2pB+Z__{EO@6zB7 zbd9{J)T8V27&SJ5jE=JGz7DHQ-rL>NUj6Q1{b5Sobet7O;Qnt1R|POtlnU6ll=~^Q zr|q(CmGyk&oMs_%_dSetO!2}tvWrcRkMDhS-PXJ~-J-ey{tVNaLDe@Z*PEDk14n1Y z)xy#42==9=uRTyMf% z>Cm(1AiI3$_q==;yv0UR3q`42O2DT*N-x=HpCQ1#M=K}BXp3+y_EIy?WB!qMdg`lZ zZMWKN3818pDCZUb`T%dc+`wC+OcKTQfsd5C(!Ry~?Q$VkQqbn>Lscif(L!GK;bzeh zyviE6Q3#d@jh~+n5g?lnv>tF)>>hat^^wRrU2A_RuH5S7ewiQ+55!&%PW{DwUal^E zjm*FBdNtylCqcexZXViQoa>uUYj4~xo#t~h7{xz~SpY}EiMZ~g;Tjsa45wI&MWGtb z!JZovPLWhdD3o}GL8IiT$}2PJBbj5qiF!Z?&k?^$iZ3_E%rHst<4=sjR5XiY8{g!U z_AiBjr*l`9D?h&1ZX$??i|qzih_Kt|nl7`Db$=f@0O?ZT4ZWaRmsni>J~jH~;=kRK!YQIOPvf_lS}W znLUoZGK7n5)@$%<-bC}A;$k)Euxrl9&*mk^CfHqsh?l4NE-tOG`s@0g=f3nRDY(m_ z41YXhd~7hy6YwIp_U^a z{n`;JzOwrAC4olJ+{_G_+CGjBt%1c27Cylm4tb-~@iTa)8ZFf2p7#$_3NOnY8zZV~1XjTlZBd)JDj}hh{O0yeF^gvy5gjd1qtiddoMJYD6$>t1ZAplIN}L zEgd(SxwdAAo~ko1i@#uup0I+OLdS5V_Sr&$KTRN6pe8mZ!+$~SJK8U7sGCHfYf8&h z;HEGL=mOSB1jy1M-mAKvGK1tD^QeN{sRxp%L-?(eM7|>}y))};&j^&RbU9FJ%A|rhS6;g*CcpXd9A{|J<^HChdP`hT#h|1ZEWLxn`Q~{t zKv5ed5o@3+_7;#?tcRXFy;#QvgkR0)gmny39nZL3v>Y@BoN&3tIgV*HF&v<{tC5wokIs zt6&>k699q}fUVQ2LQCHx4vu*FrsV(I5Ah##_}dM~mjOSrz01A2dLXAj;ny5cJ}2Ag zzTSM4;PJWEQQkT%kflMEOj4?_xX#>m!xir%R6yK9d)8nW1 zY~9W5zl}wF?!gS&9p`#bhep~+-%ib@*ljN`kj$+u7E!jg89CBdLc^c_2_b>SeSvU8 z5r(es{>&TsVZKEq=euUv6{t0m3vGdl6%6$cV!G&Gr_fVWL3u2AD#=_r2Hm% zGfu;z6Yii^elZuQG!RK$;>L_%v4|K z`6TOHL)wt@#ugDzuk1~uT*9=Vlb)kZGA51d4Bdc&7e<_6-1{=Vq5*hd7qHh&^47)870@{E4pDdd$=}E8iH7QmnDtz+qw+gXtBvHYrofmX`8tDhmD0;}=;kp=>zD~RzY6P> zj7of<0ChOeMbbodKYC&02^--|ZG^ZQ59X5lcQ9om0EoigCfEL${)tG;Bo~z0;5Ka< zjt|&eoSiM}B#ok|J`Lfk1caNDCDmc2EZz_Mm#7%xzO*$_H@b?GQR)q8c!>S{gX^BIK?ioUuig%syN&goiX{WO5%|sH!X8wmd8D(UrdFIkKf5R-PQi# z;lg_JuXbdt(s2p+2;;63C%h=RX+FfnAF6xN%Peaj4-Q;kyGA~s%bCLf4uWf&eqXA> zDvlq+m~%_iKC!wHb0S2s%GWI5^djqwqfol=ueCS^*R`be$3$^mywOF5=+O#JNj`N}kVtkc6l z-fEhI6g;08UiMN~-vzg;)3QtH9OatpIYQK%6*Dewqxoc(8cca0x`x`){U%Q(+PGYg zcX&}TVI5I07)m~nw7yE^3kMnhHS83{;81d(>MB&+cuwe?Vc~r5>3LNdyc+Yy#J@6h zr1xjkFvb`*jw-y<^7*Rj%Z`tmU0r)|kkdUPoZME+3cBZ~)!}84yZi(UFXZ(Et(ecz zfBTB`r_buX@7UW8TrSC4P1c5n(7$X)V!XFy9?f*EFQvk8{pJ*uG zAxguR#1H@Xl2{n|BbJi4Tvwg^b0Q-WynUM&GkrMH4u>I!_M>^8Fr0Dh`SOR=ETC7xEG^g$2>rrslyX znCq1E`u4W$uR$?Lu3)STCTu$lK%er7N%O=5*g}znos&H2ulF_1qm0P+7F!=&)DT1#8!f|poY=+) z0oGXlc-j^VThGWYE`Z_AkMn`U3FB%MIRjA@N0fXp{mZt%NRH{U5pY)63N1F4 zG<`tg`sST$iPSC+Bg-%*Bcl4Ii>{e{=Nu{8HNEb7yJ;qk)D^E2Xwh5IdKp#%cZ}!b zb}-CR=dFzn17RK*Dz=j6NT{#f0kHR#x)Zh5f&U zMO2;$Uy+1613FF2kplAS#EQiF9>Q+VFkpo&d{z5_lxR7gk*xHw4$kkCH;EgM#Lnvv zqSQ;2H-ulF!Rdl=2AC?;o)=SZM`v}Kx!WIqtwN5F)vp&O_ku=eHM-gS?!E7mxwtjh zc|RpKmAt*5U07)`**;hO9w+qoOs@N^-TSQ@0W2?-O~5j*#F20$L#ojU@GHC1w{-sU zQP7*Di|w1B_!`OYcDE=%gnSU&xB&+Qr)$?6QJ?eY&2`o$YpWTZZ4zrpR=03?l@e`I zMI7(tcnS(&hu^-fT>EOJK9?)e#Kwir$9NJNwZ#Z?79~0#tAW?etiQ(jcw3I;G+KUY zS%71Xdt|gnw}ZqNPY|Roc6q6#LE8EXN~eS^f~euGaOz?Xuk3rierWuA3`)tinv1 z00ZBZzAm+^v96|gd@!PuBh!u7ul)N5+6#%@1@3i&7Z@g}ZDfd?c_>*$PN#$WHIozq zBC+1@E%s>w)h$hYocdpOc`hSWk?31o@ldl7NX#4uJmQ?t0le8-@pjYK+7!nBdlk=0^tweWb>(X~Ou+>+S3z(A~ zKJ@E_@ClL&>vWy4B$%96^3;C0{2#=XhQQ-BoSYn4*Q%fhme*A^USDKmOYhz5TAN_+ zHEMM@Xu%&}ZE~Fd!5mS;6N09JC*L*q|9grZ10ZTAa~Y82hFAwLf0xVOIN!gq$ROvT z8cfsD_6PId5e3IqR_5u1URA2$b~Cq_CAdT;kq#>>=Z?X(4G<~}VDOn4i(34!Oc!4= zu(v2XyvYodR&MTFB)ctx;4=|9MIg}_hHaKM zgiG%FfqW#}t7s^j1g}qjqvkf4l)4`t9!HVOd(sL0vrw2P+MgRcg-d%DMVUS_YKGyo z@N~LuN;<#bPK=B$=25RUN1!5N^w^Ji3es+ms#sm;%XQvE^?}sQF1SgVMit?a*vtLy;M;)Q&(6VJtYWwot7!`E3cHcW> zv|g!8Q*M`%HKYy?O&`50lRKvH46yUQm!n=PrX-FmJ+OO$c^B~6k5Mz!uf@q@0jtZ5 z$GcuMeUk5vVGLKw@%MOgO0MuzeukD}b)@4ZymEWHFKPwHTufFZX#zj?9S3elyX|Oh zm1ojZvPYseb3H+79^Ucrw)vpkrDgJntQb+KYNpNr2?UE;egCYVA zivg!<;z(wy#q}`<6eWz|OF$?$xg~gz^`6b}!*_|Pewc%g;~4`KcSp=Le5|`4>ym-| z6iE#$V!PA5B-o=X-OTXuqRwWK7(A-IG(lkTgvM8TsdX#hd*oxC&GHSrBTxRTWsf}X zs#xsptXOctN~x6iB?fJ6a^oO2^yTx$Gz_HGZcnoharQ+DSC$MyhG+E-v-phqYKn9b znx*H&`d`LhZ$L*Sa*51slDjVlaUGU@TIDMDatm3>FVSNdp{uF0aCG8sfXJ7RI<-+| zT%mY)vemJPA@Jb@c@&d9pWH{b>Xea-aKFYXTuYRfTw1HJ~LGQd(|rE=d}JRK^UzV=#!S!j zGwGluPwz-Pcv}W^gl42PB~D?Jc(M$$FeO-=Mcl+|YyYZ;J7+i!f4qccz&rI`FP`Xe zQ;{p!3t#o|)``-Gz$WfPrw!s(sh7^r;*nQ8X67&F8Np1h@ES5&m75 zJ*r4w8W@arcu2Hr*C1KR19BXDFYh5fKfm9-@3yd}IIxwGeL0lHcU5$djh>CeE32i` zF!%$D+4Cs*5q1{6t zoclvh4JlT$S^V&#Q=i2~wM}PdTW#NZz;;Sc(FJ7Ni zssF;J;h~7G)-kq;Paw@YwK3;5r}}DP(41^ zvVpDTt=o?My5JWt+*MWioz{_*tcO#*s)c+<&yc>sx}j7{{7#OB&Bdy*<>r-}oKP0$ zy0505@kuH8Gd91Hg$rO2=-StYX=)hK`8)f>?F3vU!(j$acLm8Y?mi3%_=WCivGJZ>Pn9IM^w#^3Cno&wZYP zW5e60vqIL#{s)=J?E+vTas)j^s~Z}Lb?>)w$SS5#!xP={Jo5eFgfq8&B?pA*8VvY+ zj=5Rv?D9O6UGxUy2_KDCZK;{?g0AH<>BF} z2)}TPza8$C5kMOOvsvN&8H6$ARDvGl?V{svJ6Sv*10aRL9=duYCHMp=j=Or?M{nY% zd{{FOON2@58WEjxfPzN$nwhRJFWFiC*HuAkx0L#c)KO28}G7nzjUI72?+>QqB2Q<>nL98REB z^kg|=ERt1yGo)5f8A|&;fCR3ir@gi1-R1~%Ii2i}wy%La<=De`jw^=IdyTRoicfS$ z!a_%)aOUl7WH%Un)ZFO%(Y&$Xe}1cAXw+#C>Oa9;?QqCYbDgZ z7`)#_SAG%$B+`_F>Jc0C&q)GenUQ8AoB}@y<(u-iKDcx+zySy0D#-nH8Iic*f$??{ zGI}r8*&ifm_uj%eqj4p#w#n=*t-QuL+6q7DZ71<=pvo+aDqxNvq&I;F?Q^*>uq3E>1bIGMU8QZliHu-C0kVg%ic{4FqHMpVKgjl+ z%MQnguNevJ2qOGhI7 zd_e=DMSLJPBMSYD$51)5y|`bYCLqDV8}Jd)QdaC|`fphSz=5GSyX)u9q2yCSkqrG+ z?tr}ehgHv5?X>@dx_DsZt>dGIqkYGSUp>#8L#)7eK|9e3LXq^t^S7T^f}bEkHFWvm zMZfw6g!^4F|LvZrW*w`5veWya3>WF2>`%=It**x*6>kUUDTl1k7Q(2*Cx8i$E=g3L z_zqJ zz0-LSPsr3~DiZSrH@U8%ord^LwaB4cW7X?PW*uUy#s8i1jzb6t-2OV2mWr zmkYdv-4LBJO+L)=jR6-JYq`0-N9I_!Pe(Gg6#wfo|Jx6@*^2NCzZn0lh|T9F2r1k* zvRNKEBXCpw$@899wQy4xtr5i0Ia!uIKKSP8&C`bWANRm2Hy))v^hDH~L=6|VAK~QJ z;!Sk|52-<6>IcJs5}wVL0CYeL2LmrJs{_wAbyxM+`;FTedqRFc@&+tU{O>cYxnEMR z-6Bck22;Ezs&{#kq+TetX{Q~0cvTk=Hua2>c z3WRhkyahUdUFNu+>E=Dbl<%9rhK>N*{VEv1Xp`Np+9dtmsxkw{_rtNOAZUQMw*0WK z!s##HwAR%AH0NyOh+#x*T6UQQ&-1xF8%|HOyuydRpEHUwQE#~XKj23#Xa#4NBkWIeti zKI?e$9ee-jQ^WFZaqA~Op!2)uXj7p17R6b-4i=wo1Cb^crb&e%!?um)o@vq`cIR&Y z;>8h#byDBrBW4EbBdU@oQE9ElnAdIAv8R>CZ0M_oa zrGT}(bb^}l>iq8GhqP$nmn+LSgr}G7nmne;OjX6gm*8~%5%9~W{kXd*>_BySOjKVB0)F&*kZErg-D;Um1DsS02v<=v8$b zoGcNDNaIQU?Hn~Q)q4~<{%x}=c%7b?tMrC@mU=(L>>b~`(d|KL<1Cf?kk4XLe8hK) zevwbBg2ot4eY}o|_<>LHiN0sw8fTt64qi^1=-Pc}9zCYEF809iz*O!+JJk2rtuS_z z9D^snFTS8kYXa+8`M;hvOU^FK=?WYA^$0 zS42o19s(CP6aPYqShyHr>wio<|Goa-IW-9Z@w=nRndU&8558HB)}11}17-?D;?6Uu znJ0z=fI5K-r36UfP?9-4tqIn5)4KY`y}Po}po5PjgfReg@F((9FP$%&?(eY1RPP3G z*#ybjJg)O52ANnkNZ1j&)cE)Zg8iWb-~~UP$Lu;UWrI($0SZ!?E~JUC!kTvtxj;r7P{rMo7h3&Mr0|p$}zI8?LV7yXo`K_&A6Y z^+3Geafvh=*22!)Q9wbb%DZ3W`QW>Y+>}AGAU4=^#R~#Ff)c3n*RNrua^;=u6P0fd z^W%s>RXm4ZrIo({exZDy8_KXqu3uGX_Vrtxn3@U|CEl&fo5ka)kjtS8Q3o+;nZ!piPh7=t?6>Dm$F)a8l?>fVJVS-@s?;esz2T3hq&On~1=!q6 z#0ANhXmHv@_@iXFeY>0f&})p` zz8x1~_!IOn3SAR=wGn2Cr>&kJuzg;FBa^Kz@Y0i?*U};;3(xCpc40E_t-Ee|bjk0= zs4e$iJl(FdP{`f-jWtH6!FRq60e=tw^PYrfv?&W1%>CVeQgsAl_N!}ojPhLM{w%b* zhqd%>BU_FeRwIVhOh!PCoByVI+&8o=&CA>|#{0CDRZfEBpogkceo2W9OEajLzG+-2 zXn`lRHi8=~i-&E}?xkq>FeXvFzr*LLn&t{q)*dveD^>uEcwY`I*TbAIHIjGAG>ftl z`${>M@=M#bajp$k$-L|}B(%yn2+;qrVTjTc`dLDY?Oix7CvH2RVnALSHN+HWa*oNk zyuH3Rpr<3z(0>QbZ=l*Cxjv_4|cOiO*Fk!rv@7zvF-_a7%4gIDYgeTDMQxt zx0n5)i=7#YZ*%+W-9FH2{YJ~ZotY!b&0-PBKfGP4NL)PWj>&W{pGZa=_kSt|6Jc7< zqVBu8(jeL#%T81*yMFT1)BCNeShDbLIrMQaE|*_JK=6k*5<5`<^BnPi#NBaHV7%VK zseR}D*Ygw`)bDTM;gVwtdK!#r&S&S>F^OhF*u># z32aX#IBxo_R{JI|F_!@@JqXF?ecEh3F1X9ma_mbZ!}PK&#;4Z^p>9?WwHBdIQrd$s zKtd+;d)>ukOuPrOSogkO$RL+AtqYIFn_v3iR#H|bBCwRD9mO3^f> zh+(7a$u56N|3xnamr20@_@MNe9IE!o}MNB>3op5G*i}-1v zEWhrKwrc9Dl=OtZUZ1^kI!SD%;WhfdR^WDjuiFcla z1SAtzcwT`p*MmC{us1>8chc*6g@pBaz>XWav1;85gZU5KvF`5LUB^|V$dAn6Br<=y zmt~4T;PYR$buKU?$9tc`g<`xvt$TK5Ei?8rD^xE%)4HwZNt@z#Hfv4_Ev+xPuk+(b zoIjcwGF{A!sFRt*BcDGDucOD}JnCj__P8r&tgJB@bZE^lY=nKS$BIo~yNzS-wr!`1yfYt_2zu3A;KYAw@> z+?3DsT)fN~LwNFXd{`5hS8tZ`Rj(1(1Ad5nOfQLm>rOvuS7T&7-)CZb_Nx*(Bdswa zEtcMQ=;<8VeY;@-HJnJn%u7nTV>Se`cOO*pL(M7Ic{z2WufN@aW3?0wrRVhUe*X03 zo3M-Omhb#?g|0U@4jP>e;B$=YmPPFHyL`aD7%y)ovXH?#n_1gmfx><`wHMZ~Q%%+BaPE;Vp` z?lph6Nd%iPg3lkDs2Mxh*qD$-Z_ef8Qu;@(@Z%7dHdmiUqS1HZW7@mMj(D)HEoQCL z(({Xk#^M(P#jqMftpr)qFew(5IF4{` zlf5k5zX4^Xg(1c;xd8>|p6-BFf=L^VyA?kzbQLJ2DJZX<6-his?Xwz0(S=}mU2h8V z!Z}uvt%tz=Fg({?cZHq8zzhq8Y~Q&f6#&)x?QX9f)uY$eT4uHa`uZ^whuAYbZE;rJ z);dvshn<6CEYkgbt?Q1FUrp^m-+bDkP3;7|&&T!3oZ?p) z=k-g2eBp4(#r5ZEYt&Dg!n5m~<6tRhQN@3^+LVAQ(>PHI;*NOHB@ z*tc}>@Co4Q^#sg843OgH+FInE&S8|XVsKgUKUZie_?<%0# zq|BZXR`T><_|#Y=z>#$rmpz_ZfZDK+mHfzC9pHV=o1y1_ydP_SkAze^7({ifkECO^ z4QwZR10r8OMkqs%r z$+4~!O%WZW`Yqb~UzLX`{J!NX#Rhl-MJ)J?j!M46D5mjKJZ#>y7t+m$W+MO(F#eMn>P5}n;w&9hQvDfjY4 zwrcnU z+=8&kWCgTtUrnQ!1cqr-=4Gj#DorL*5XD>2TA!hfq39%#4A?DUl0NKuN@Fwmx-IFa z&tawvxPFQA1=#B^8GT<{Chcq6Ex@a>QFVC*#uONRu(NSoM17j-k+vX{LM@FxNRag( zMT?$c%3;xHVZej=prn-9o6J-57-OKJrNw|H))Z(}xeD_*Zj~BUj?ffMWg;DR6%^$56{4~gv0|-@+ebF~QaSs855dq4@ci35 z2`&WK>lf)u>pZ8;2w04|%^IA9H=jTI=|zr9T~e)1JfNbUI_eJS>84@iM8&LcZ%Z*| z?(#LhZ3*MSa_fH)$3jM<9lay~jSfJQE))E|ih=0F1^Mow&Px=_VSoUg5ou#sDXd-N z;Z=s5dSgRWo8tH^*sOd(x6S+m8?x=;?yNFIQvW~%mK2Y{)CNug!g`6Y@RAcg8$SDXsBf~kxrM`TKQbRM9u ztKAP{R0ObF6%T*pnE`jxD4XqJRYn?XmBVVY@?{*|=qf9`G-1^sz_aPNUdFvRu6B}a z2i_&~klJq0dufk6dG=Ct{?S3qRKs&{4nw^GlQq#h%lam#N}hzHP5Mk@kIV?_aIxeMj z9=1-nXNZaN*ZBZGd%qBWPO!&B>mEH~xxDmI%t#+&$Yi@Q-$BHku!$h6?}9UUa4w14 zKJDuQUo{t7lBY1CHr2cv_3Zmy_H!Y}!FN7P?BmLZkNiJW?sJA{LpDJ`{-x^>cg&{^ z^1iW;LY0%}QTM^VVQ^95qQarTSN2&SlC1}5!RXbRDS9<49hjL3I(z*o;R$Y9#3Y(O z&uG=zZD5`#MdM0pGja<#2GBo9sDvLmq8NX^7;(y5VSXYIr@OB1Z_oS0TyA6#can}% z@q;k29Aip{UNOD?d%otumCgfNiqyS;el?hQA{Uow{{0t=b^TnC;~$OucMo^(O{6zG z(uhqlqkmO{h=#ZEyc9uwOc4n?B!kos1>5Vh(O&O8j}n!$hOy{ba&>vlPxGSEYv=N& zS3%a@c>+)qHNaD%AZZrqSD zeh3COMi{1}b%uU}Oo=pwuU~FMc~_WQfReCt@3k}Fp-ZbPHI89NGD@<@Gi8gC1(l@} z)e|3vW9ucs$Acorr)#Z2{>lqzPu=L#rtzB%LGQ2N`gZ~luZx|0ZdU!*O0$^cXRKa(7xOMp}OgrsF&jh zm}mV7KTHB8<`Z66#y^$Fa~8|ray&|IRC9l-@jAz>W{9_wIvqimw+>nzQE1((!agwY z9-gX|0dcjudzuT@Pb!){*+ROtiy4OiJAL;}iT&tfWIOt97|?QzY(M2G%?Wn3$)?5WcN2jQYJA1)7=(#g zrLQ#Z=eetQv%j4t)Wa#i%^F|rFtVj!+{&vU-;95J2W3TQS$2?*se;If-{da>Q!q(JM7BV;Bd@t5ZK;>`Qtb?`HRf{@R;+&L##h3s<*yTj{nq#_U3K^9eZbT?R4l=mhk^?APZg}PPc)0$nU+f!G) zz6z*ibPe~Uql4ujw(-*nvPRZ50Ab%gcoKrx{lYUt{98b_DMXYp{10%cBl?QqLUKzEV%- zVIi<;Pkr92c-n{#h*tD6$xuw43WE{Y5#0JAC!na`i5v*W9 z09+iFuNP~akqE?ZOGY0fl9?G)-w<5WXm+-&l~8GVU)4(^$Dp^H`Y7}ZOVcBMJ;uS! zLdIvTPPt5K_WdE`Szi<|BaFc-WtdGg@=a>+QuakoHc#M^S0zoW>4Fah9nz^swKtno z7y?^N%g5u3EAB_M@`<*mi0`EhN3<(QYpBwF?nXksvQ0`YV2gGi?NfN#K7rRZfntPf zYK1dtjoCfc`Y=u7(yPLDOQTmmiYC9(!^H#%(-2u5%)I?UP!>Q_GBdl%N1iJr+7yIY zDu9Rj0B%*O)0?SkceIX`$W<+)c@a+B_Ov{E=)Lri10?r&%%0hjh-=sPbdw!uT>eV! z5H(=d&K%~@C?N17C!o1(lj6XUJ1lUkHo(ILahsM_Jrt-UCROQpo|D}6wux)eCgS=n z!&mXX)x4-ryKrOV^A-L-E#(Ct>w4EKHh)!W(pSIFn-$$T66A!Y1eMs$Y zV+dLU%>Ov3Ag%9iC0*px#%_(C=M` zyHl{qj9+#H9#E|5&0z+}DZC+&9wYo)kE!Dke&2^N;qJt@GPeK`co<{fz`7aLG)0%! z8AL|TEJMg{b}ZQ7q37p*lnGtzaM8-Tb9@*M z`!KSEXt(!p=lnkQ*ym;%f_CkuY;UYOFpecoLL<@scq{*7AkNg}TxbcFKsuV;KX9`w ztz^4ojxvLnzQOsdPF%CMv@&eNs7VPfa>J8kpm#)bA_=pEn3wY&6M9>x;8q^OdDsSL z7(aDK?(UliA9!772$+};O_;8-KDhAdvEV0IVh$aqTjrMaawRo@**%dAU_op5kNBkHt2 z1^VIWR(RCwFetnuyc#H>OC`EVAcmVewxb;@8OGDhFJxEJ>_Th_ZcNt5#u7O34A(DV z9E6_FZ1>(kU}C&$6?B~C#ngR;=|0JDx_IQy`jZ^b-8N}gB<2+ZOTAk#Ro9}=$+A5wzf8s!^KvSxuQ8SUV4l1 zXY+1X`!7cHAP2ZH`5W|H)ykd3@81_JJ#!>Ou{&ApLAH%;4c9O>d)rC=oYoWI;bNsf zZi5A_SeV^)?ca49Ts`-jJKhDSsT#K^TIemeB65kNPdGF`q(}MeZ?eJnlJ6KvIo%)C zrm@VfpQlt1Oq}GIx-{(`QWd(wr3`jcwk8q22l~b-@&7w;_%^h+Lr*l0poPOzniy}u>R-V;H zyV>X=PGk!^g6B}1l@~QGneUxREnX9XhCg}v#ATE|pmpaC_%W*r-!Bzdg!70n<@RhHAA@efY!E183tiH1L9xk!Kt|YbFVaT~Vnyc#huzQ`6Og;+v z{#+~%^y@r`It?N>?DCl<^bUGjPM=L96L2=QrHb`H5fFN%z#G>Cy^Pa5Q!C}24^j4b z&}0SvYzfMW>qYW**|1JXoIU9yRria2A1ndt;Z|I>R)fZAi1%@rmttPO%j%u#V?(L| zD9UQbwAUwctfe(?aU+NHwDwEM-Z>tI!feaP&=7_EJM-36`inFXu-j%|-)i5@QJc%+_0<5Cpta9cs|O^?C9C;LRjCSi z9u0wk*v+7gR_tm85c8l#&IXm zowrk!^lh97LwB?d_d*&rw8Ys(dE&IP$Pk-;g(_jwRTbT~jU;{RJKnR`Es*{2%#n=- zvbkBvWmj;{=?kB(hrb^#AxfS*?j%84(CdF5sVXTjHj15E4?xExFR$T{x)3TKx}ZE4 zjGfqHl?X{tqTR&AD3SyO<$j(0m;#nn0_^TNKGFEDlOBOJ&K6Bm;2e<+y)jWN12@EB zzEqYalRNs+z7NSo*?GqM9M*fsl*-K?ZC?$5b!Mgc>Pm?g?Q_u(GOWNMi?~=iX`fr= zjVn2=F^+w3hX|<;tg^%?B^)n9Wi<0pzd~H3d`-8!Up8$!_0 z`Nj;gei95#lwXpufR|qn09OLsk%#EpJ8x*^4Nc!5&kuSj4UgFbcn)fC;I(58w1jy_ z@18`)t){Y;ZVF;{izJlD^bUNAi+&*{u8fL3`}LEURLgMPodUYOqmRr|PjA(@+k?w* z)ld;|{TBC5{gFxo7)Ye?oiB~KnpEQ@QUrjG{eqB|B zW3^?my%IA?L^HN`yJYH!25!?Neh!y$wRREuxVth~Ywx5};M_@r{dTu~`iX>7g+tZR$ z);{Wqr$hV>`w+rUITj;zl#!8B%1w@OTlir%R?3$JAD>{q&12-LIQnfl*3hU%6})!> zL(pTA-I@HFOF=erJNqLJPRWD-;o1-oyG2S=J7eTcy0=?D0n9 z)x*PA1LgL00>8dPRlDUABWbkVE2ZAUD=%IF1Hs^dQt#$hhnzdib(Ea6L?@Po@LINjzbgJaiq`NarRNlh)qPRk)~W9kbK8{me{Hd{-VHux_frni@`maeK5F2s zuR2jj7MO@a)tk**qY2<(dGG2%*6wx5-%&GFY8nf|XbtLMxm9|LpWQG3A`_3ij_>W= za!H%1w~wa}McZh6^M<0tHL(hs7Blk3Dd{16lY@WblA<3Z{Vq)`q5MnSxu#3h^~?zM4weJ*hc^5zkcDD!TmLl&Smb_xl4F=< zhX*goDxF*)Ix`S$EBRA8smKV-1x-nwo%1zWv@E#nuN`?*63Jo?mB0*2FB~QP@rWRiCHX#i??f&?5htJ%aS#$-9>fa0wdPkwW6e&W zBh_~l+B6r9ycP8U&V!4H5~8IgG&~kU21nU`s`^@fxPMP+Zhp66-8}%z^`bW{A1((( zaW_ZB*GTu+@y%<$95Pek;e_e`bdM=kAN^%yH-U{@%yKP3vA4-6v8e}foPt8N7bQhs zsk*u4d$+Mm^_in1BOQJFOK6!9YPZ)WHH!q;0zD`_YIXTDkY-pvbpP6SphgcCfIE9a zNxxI3b!YFrLCwH@wd`v-=+(-<@EM*mZvnKF*l{oQn%aLR#<;RRd zwhvCBxDD|X$7VQB+*LP$+m|?bJ(J=Q>U$qlkq{FHSq)=WLx-y?=#8E(RY>Q&o~FBv zl9OjFQk#ABCTA=k5V^$0pKf`?Qpo2DyHg6`lcPj;_qC2`u_U9TnKHBBfv`r>tnOM; zB${1S{ zL3%N=rn3KKcoVa8H98tYpwlTgaLMp+ODESu{6xU!puB^Zs4shKJn;P478)ml2x=oB z8`m91V0tgyhQdgsi~>X0FeTdw5(p+JNa#ssi2{&)d&+9%^C~}(85736d*eGN>wiZT ziz92L7CTs=rKUG1UzBF?gvqFBfg0=?kGaOD$+8}AbCP}bM zyQRWgmvON><{Q@K^=S;$msYNCALSsB_Si8mow|6>_UmTjr!B9OtAW*scKv&oYW;GE zg@||2nWbu*JhXA>tho4yuvr@R+&7E58Bap;_G?H_avUV?s%O=Qm+SGwCiVgPS9@G* z>{wj;Lj=T&p#8q_>g{EH?c7}h{RRY!T}gUyfRx4M{2n|?0HDK0eG-S>Ym8;dA??#b`{X#@B4X+H@kvv{s)NSTQ^a|Tuf$4;hm8)|AKh?!kGZ(tb?&7w>@t4 z`D<#Tv%T4mKTSONaE@z^X1|dbdjtLH9)`>4=D{CA(&%^Gst3$_-`V-+oL0ev(bsn) zv)Mo2NxdKL;~lcfuRD6}(3}A83Q7gC-U&SI8cZ1noNuL5)ke!#%%sa_9>T#QL1(sK zKR}jr?zXJqDAX3~t^HF}=y+%m(66OeqR6I|teIC$6P%iv-bd>RN1n@Yer8(YRc8w|X2BpEt`&bIJs$G&!f0`5U%m`V_}(mh3Xr)KT3Y+atOLssY->rWpk7&B*tx3Hp9vBkO+%}WVkYsxaKXY;OSF(^11G-ur9 z?UsNOEsWC$brSl%P}hx{eQ$pwGVjDvhg(xgI?GlebHG_PliB=&w~=fUnU!3(@hiTy zP2j<-_NJjUMt$JZX_hdoAj^0RONHenZ%x4qpKtl+wL z1L{oSqTg`x*q{*g?O;T15IKgIiq3mL^H9#E*WZf0U!tpf3tY1mdRI2E-&Vnw_jaft z@}_Rgy}m0=R}83UmoVc)!YNqa)dqDBoI|2f(O zoQz1jz{Ch@f3kU^4zIgQ<|+ifUXK%d?6Uc`s??~;>vqz3umNJ390P}KFcHbq;d8Vr z-HcjlpuN01oWwmftHG6Mf!@rGC4(yiL{nt@zQ^k#@DyU2+yFdUO&6%G&|@!nD-r($ z5qlU*PC;nO^a49xFGYYlBgVwiu0mZT$X6epp+K=h?nTTja|@AcPW0e z1kjb|21(tYih>oPXP3{0ziWne-wDxX(fbsNJshrX-HnOL+R)z7Ln7LNk9zkH8|`rq z_Fno2C-NDld8fMjo}O*b03{K{`d!EZj(ynu8|r#>QB2D|^TUZZoY-^&b@C?E+eage zDs|PzL{P2vBbBCjA%-7lUic07**K|7SP|Cmx^AG2V=Eq~?-Z?0RrSNwN$tdLT1$4! ztVo!ddqcxW@}bkaMEJe1Aai5&N#|^IYva@QfRu&oD72U;+)p-FKPhI-s~-2*7^i*z zVAB7!g%|HnMVB(c>g?n8)ceEav!Ss^^QbEh*1o*y)TL*Z<3X2=%)46&A?hkK=!^vO z63}IwyM!l!Cy2AOFEP`PyA;6Q(t1mlg4G&6vXOAW)vmvHnHPp%@?D@wlz`Mhj?TOE zJK7#c5M3*4r5;mWLT1(jB@8SQvsA}}Mf*~lKv}KV>4`TjZ~XL5QaqDcmqr|r^U+?f zM8Nx{i6;guk|jE<*rXy8_7`mnS&<1t$jXb4HKJDeM|=c=@3I6(x8cvQE!9zGQc5RA5QV51meqU|D_gqRk zR0qh{Sb!3mm~*zDW2b{;CSoPvq`A73d{1xhI8N*ByWfhRvAzofGR`2t@ysC7E zbDO!6EFp5OOFkcGf8mu=NT)Movm$>rrZ34q*UABKnb(B=z9fq(9Cm6hvEET zsv&bLC1NLn8jQt6@urCTZ_VcY(m6!)lZKzUd+!;4!pJw1=kNn$>+tH;PIs08(-((rhA_eNr^1eZO4^iB6i8kD*%V+WlV>R8Uqu{ z`=ndd_$2e`!TopcxB0nsD4jpx-mZ`Tc+eWL_d3;2l88nA{Z$k|&HJ5Z4G=TjaE+(|Hf`S@MMvZLHey{ukJ@ul9N4|Bj8v@3|HHF zZ7a8Z;T4{bi98Dt`@;;J1^u>n3h1fmOxWAyum;kvmRY?4A!;k)+IG(YblR^n9IWyE z^6gGOnqVOLqvU2%#2r*5 zzZI?EnwXjzO{v)_DKW6IX(!c?Sk9C0ADDM7c?w$3;w}#k*3FtP9{~In{x;|mnziYy zh;S51H>ni(UbzcmUDk*Hyfin2fEo~*ei;2(=v8G&p(`tj=0nvin7r@j+hEJ)q8?9|GaSC{hHZ09ENR@i~u z2Gq2=u^HPw>+Ttg`5X28L5P3;XfTWWt*i)R6WuB2djrkXCyxsCH*Bn|3l};tf5eX8 z^6PA!xXJs4P-DvY3mnP$(9Q)ex$Mn z`YMvwY)?b&+Sem?_>*TO56vp7s)4QpQ7!wbDE}RN9fQae2G#Z^LPw#miOdQvw2thU zM8-^xAh$FXBZBlGzki{sZf~>m;axuH=~JK}{sRnuSfI)hE2M=9N zdfb2f>VJIUAKv|Mf9#+Fq&O^c)e|1|W?{_{!E16_nd*2AuqgwB*tu7&W-gNQx;4D8}af1V7n$Okp zv5l=4w0ZFV2DbjiqW$>^mAFvdwHjMm33Dn?#6m(!w#BvNhULq@SxMgUxZ%Bh@kQ*9 zwDV_8{dZ{mpM_DHDc&~reih^FQ3IGoedZ4XpmVb$V(5N`-EXQ%ix+dd=VS?5(N zt0I-gi~nrcsl0O`#*pqF?N6Y9dyk<7mF)VR&x7o6tr)ovCvg66Q_H!__QTjMA+~tV*d3~KX^@{ z52~f#mMc>c;S)+b(t8})sVxFAElt(fasD4L{oi13AdStiqEws1DHJB2>-k+ZBlGe> zx$i{auctY23UXwcvt1Q=Jh0g+o85DANrO#fJnQ?H{BZERpT&R9-3F#Crm4dy!vFQc z#nKFhlHK+2(MODRCZsJfSa^lgrx!|{OUTB>G9Rr$u>r)+FRpZCsxbfhc_%~BTx2>L zG`1AX0AI%geRbW%cHVIWk}*n*u{GPmXR%*ft3OiW|35SG-=Cl@LE*saxpSF_7aS*H z(29gtq48#`#tNyl4p#ffPTuc5uR3tpGzo2qY29UyxM0axdC_~@D9OEM;G8|2{C7va;?U(T7A+kfAE{-pvwO%u2CCXD`BMh(lv zxh<(>B>>eNWhcE~`ihzLzYQAv*`@hs1a^QaD>EJD<64xNy6d6a4cF8{a39hxlFB1p@roC2f(DT zf$kj=pmCr@fC@X3F}1I+EH9&HqHG8Hk_oqci2#r>FFR$Ch`i?i!e#5%hVI+8x#}HW z9-Hs%fnp&WUc3jw5o1HEi=pBtyo^jzK^-3eDV>ZdixF3w|14~Ani$O!Wy+f|a{4R) zGE}{JIq+Cp2zN>I;9Q>lC&IF%fDI|5k0a)+=R1x!M)$j*_w^mP<&a(Lxf`jju926XUPQ$7ReCU0Hnyf?-`1l5Cti~8j}M(r2$ z>=n&4GNs*5&jyl)*+LibJ~gw)@9P)(OJB}k)Bj2>{zv-drwfFEjnnl(wS3|G`p2h9 z#fI*%(*hECyy)KoxPN@Sfe5l@i?JXNFVY&-Wv z^;5%wnh*SOe)xZ$zu!GQ`%Bnxv#`X-VKFo=rMfNIz1aH-1lnOl09R2XJN^5(wkd^g zj0~vwIl}Sy@qwK&b9QGr@$s<#{H*`om@P?vd23N3rlX%>xcuxlyY>FOIF+Ftku>zo z2AnT%VkwG{ap0j>vHaw7IN>1=m;9nvlcW0d3|>J!B7XBfK%=<9NBCH`tD*$b-W4op z)CeirlFVZCfAEq!=&+I%N8~I&h@y=|%QYD*n!au^#;t_Js^A5mOgSe19I97)&w%_9 zfwnmxtcv@eN{9I^6lw+Y$Iy!j{>gz|jOi%tmS@)afE^eAh)Rh~v=W?<)9)tTaW&N< z$CKxSdciosZ{p<9-K>$f6OatqQ%DrxR= ziqD|wE)@X6E%LXQt6zf(=lWlE=|uUBO>);||rfH37(=I>wI_WwDw zA+Cq5X-?)|Cvf1VcI?EcpbY$KRf;>F5syBE1<5aI^w^K(HZQl^xdc;+zx^{OuOS0o z4#*A%-AF$n&?saYbR!->7c~vSyXvq)_v$|w)vt;G3I{NB%krXT+ZM?Z1FCwwAzY^K z^#Lh0{+#t*1bp4xy$3^SOMeoZB`P5COEQv*lHvz#ykrS$4*;*6!hU8Na?N5JtLlF= zBHje?I=7P)2M{#YQfrWo1}LF@*RlX7fC12!p-{=DaqvKm=q~!Rhzv@Q^Jxq?Gg2qp z=XUFEwGI={3L%X*@ANuE>b1)SE`BAZ{!L8(w#Lx3-0%CqPbBjafrRC?%0uL+6WHCi5u^M&fyzrV2~9ErwZiO;>d%Ot~8D!~-AECuBbXjY_%<)36>fQTy-)HqeTpES4RY^zqJ zm5C*@>Tni2vR*e7CojSAC)pk105F)_W@oT(ZxOo!zEmA2%<3cK<8L?TU;Yb<^V31T zUqci_T73Y!bY%#+boTelJSQbZFH&X1!@~>Q-`^kq`4eZwb@TJ_en~|zp}r@_tmQoB z9~JLCG-nWtk4j$d3scjn4ilmKPgvMQ(hTP>czPE*$KShkPvdtka<~hbU+?v`c&B7E~eA&Ez)uaZqBK%=TlHn=tdzVBrE~GBLOcr6W-q5N=QmddcGgd z|Ni|v%v<8^+Y#KXBOUuGG{9nXMkluq=8Gn=QJaXxBL#BwnXi$eTyyqCL^FqPpx&x9WIbdKpy``ddi=g(ocQT3> zbrE~f(OwEd(aVgrMoB3{n;xyP%G1r+5^E;0vr!QVZ-{M;{OBGLa*9mZ&O0wd{-x~f z*$nNE=1}7Qn`2X#?i&CX@?GLXJs`Td>Gng+S|VXM;7?x9To3%|%Q|R2xcW)fbn4bSY~ckhrF1PNm71Dv@Ggj>zta& z5t^^~^N5hXc|+c-mK34ZPRN@6UR`!_Fs(-U_7DtK$)MX1Fg5u~h$mM2qJByg zN{A9hDw51yUnKAHP79~SG}1iVqFMDZRa8XBTGH(hI}Nujrh)XBYtntaJg(&EBCQX_ zld8`>_*oH@%S5ve)HN*;es1ix2-$y=+Ac=o;qgdx+7cKe(k)qZfmld&hpgwErm2gx zayzL_XTH2tmW#OFy2<7GsIXQ0{$hxEGF1J^ zk@)9CQJpz&>n#Y1(@sj=uAZyLENp#pF=AbF%*@2n@x>`kVl9lrhzpN}$C4Y-ho#X# zOtChC#fTm^S3wicOF6lX)~UI7CDrjEw@u&eR{C66zgzK+3M81X8cAzQ1YMRW!-$*M z-|aoPJK8jO*_$h;jZbM7-gyC4MMsyite}-E7D&S-t6V~S#Ba!=datTZs@|2Z4*iT( zzCbUQ47)|b|G3SV{$hi^`K`9fr%`CFi=}`ckyDT$B1m#9Ky{bg!`;rj1Vy4N6Dx|3 zF!(3>;n(6c(yui96Qao|M{q^#{N=og5_n`4iRMcxUvmchT5*V!>bG50{L~F9vo|M) zAR_5w7Z_z5oQWv2%{!fvPBz0ojEZSUX_#%Kg(x}xYS#i7R4k%6uu1INKflnucPw8As$OGbIIW z6yeqB0&Dn8nOei7H37le>#ag(hOWYa1AC3fw|gHrrU$*+Ox2Z!T$6UQlsMX^SzyyA z&YjYy9<-EV+nfnxiza~95rN8qnecw3z>d25w#Qek!MV$Y%Dk~VJH4fKO{ADc#H!<$ zeRY@C^S)p4p6B;+P`eGk(`}{yerU78p7y49FLBvXz>4cEAAx>R*vh5m$f+u{=IY>Z z|FfSWZd}}Y|N3{`sY@PcdcV>Q-jeS-TTeT3S6ANpZSA6+$Nl>2>$Q!9O6fMg7quMd z7qurB+|89f`gHV#UCVXOWexm9UWj^MSo$IF)Rbt6O{C7V_<{A<7P58Nm>B3GZGMyq zUNj0NtdkC0)kcIv(W(R(WS^p()$c|K>R&~S9b68H;@%aIF~Xd!2QFw`%pR#!v;DxW z#2_~ddn`JQggNNBxwg4$IK*_AfAgl-xF$=<8}sAlOJva*tGY7>gF?4k5_#IBA<^ud z_3v!si*>Xk7E_zThrk8MrTz^#LEo%#%f7)23_c>PK&;Z)jKi(cspAsr|E_$)vfVs1 zyjW+hzv^9e)oQf(kgnc+R(r{qTBkwpY@u)Q6HL3t+uNpemzyW1BuX5;Kj@To?OjuG zT$vg4Gj`)zxHKp}i|;C-X$w-fx_H%`g?}Y^sjea2Zg!-11KgI@A7wklr!6#IYM6HC zt7Cd>R(-&|G8+|j5RTtUYY!2A&(JuLL^s=W}Sd}Cxa(mxLsI*MeD=am2|9E)7h$EOOOn&H1zn60#u3*+^ zIrus1u6J^ubX2sR@Pz#)O|*qhX5A%gPlJf+(;K6-mqmj^rI#p{t9ev^Zo-U;yC!sxbUkMhm6{C6rhBS|lJ<*eRmA(j*m57YV$4QYvH za01}7jg?qsnLrhJaz$Tsy>)%horl1)wqUh{k4?a|O(qBZKG~*rNb+9=teTUF9Mbgn^=&ScTd>_Regxfc1WVK~GylDIO_3w}6 zn1k;$$AlduW-FL`vur-j^Iz>?$=nV1c5VZ$1Ira}&Uma}*tfeac-halOZV}VGk;-e z<2ziP&9BSmNEfyh-5MN9cBcH1^sx5OAG z)4#s?tbb2sMFJbWUB28z2(oqabk=!Pzl%t!k+sw@>nDO1hJxYMP5hR?wFUQo^8r~X z3=nfNTrsYz*Fq7PnMDmk3P>ZfJWd*Izpt&SASf`a8_@qOjUu-7Eu>@eyq=h57vNx_ zA5(DDTrg`S1JGemwa(5ESudNZjGIflo^;OdA~`*ts!N62aek>|&i;UngX*c%I`aaq zrK!mSUoSBnHrW(N9(|#M(wgyA{p!3bAVBg(KckHEy`iJJ+lRCaqs%Rz+hN%vAKt*G zrqt&&An~zj8huou`ITnZ_dm*v>_bOFR^5-J!YH`+boS;y?pWre2o>K=m+*DM2{?Hm zK9i8sQEti%deO01w74{mwWI%5s<7a*@O=6wS)!v*t~{o!l}NwG2b`DBHAJ>+G0@+> zUH=yNE{aqH4{pOe91p2QMxpCUDf-!+v-_$_<6-=n2oH6ilia9y1jCffL_<{@t0%bN zY(4w60*MX?89Qa*O@I=@*IT{&8*PY*cY@O*Y^YQ1^vUDGCs^E76%0m4=#9xhYq@?y zam7hihp({a&gJs^LA?IEZl0etf zYr~Vttxl=o8sn<3(Vmd`m=Bxf0Rc8kO~g{hB=Gy^ErD-5^@TL~8wqPNjx)i2`uF=@ z2!umv%{s9mGq1+Wvmhg%%k}GW(FWJ8LM{=L%6r{Cve;T~B|J??(7u@UA3K2Ve*SuP*`0JSjVgINM+~{>Yttzd)1f17@jhFT=6LRHSI62OKuGdkJI`Q2g&s5H zcA<458+3bf?HpErt@pS!seNJ#(N@wc_GsX(vr2Ju&-H~<7zG21^z?m;(22U-I({ zBJ$c^+MB$Z3x~bD0H9fj1B7~)wP^?W83H@>bZ~*`8DyGZD|#Iy68JB=J85H03Bm+ zb37c*^PAV(?(I&ZOZ!=csc}L-6;I45oW+q&?!Vxtur10r z4C!^G^mKI*T{-{;{XeGO!Y!&d-2N66kyfNzq@)o+8bm_6Ls~+*JBE=GkrI%Ok&y1r z85)P~hM{|aA!dMK;N|-}=UmtOFYIgYXW!4g*7_{-rqS=D1fTbqaN%tG#(YJdM!Z$l zuw*bvoU+K@*W{}$f|TF;bx7kA9@?M0c}6W8qP1gl4>$?BKjX!kh?qQg;3D{#Y)Nej zae`h_r#@40bT#_1^S)^sNUt94@C3mb*Oh>?zMU_>LEa4ow5fFVZtya$CR3Hl1u&?O zM1~PXtP_;vRX-VZ`oV}EM*SM5&(&B=I{9&VdE9a;gDu|EnnKZ0QpQPGm8BYyB8D?} zuv$Mq`u6-2<4~sbgF6FnKF3O2GZR}-Dw(Ka+rpEq%bOpN+yD3amx%%{NSwT+29+l2 zxeOw)Sss2XQk<{XsHY)va>(fC<#2!YfTGe2EpPN(2yR+{BJr1s>Hcjg2~1^(@ZVY( z_I+AnbP$^8>8@+k5@q$_T$(*znZj3o9Om8)Wxy#R8!Bw1!FqWPZMWTs$~lX7<|qCI zt#@D8Ik>s<-L!|I@=w&}*ahQ@=m${G|FL5?3M@4`Vf}KPV>Ka#8RtKWWVh+y!g{$B zPIBP8@tghc{%0gh!}g+e(_;$Q{pqI0MjiamM}nr-9+)odxpRwrz@75D7saI>{)o73 z!|QY)$A=;`DP2qOxqAJCG2NG-09hNP!=a_UERAFXf=dhM9r~dcWiLjGwqi!^3 z$NjpVS||-M=3`imWHr?w7LK`*^`dh*`-gO;#;wBFZ&Kx(jkh6((`^`iKv-C*s|{Hg z;-~xQ7`zeZQ;GxX$hhvgtbvC4#pZnKRDP5ZGH|%$4(a;YYbzA#8Em#LW^YBAI_8`? z^u>IJd?ET|h;I#od(mdOq?2q`#5z1)e9Il@3esC7ZV)NDfQ^n}4L2Px6FhX1#T_kE zpp6VvB-+&PSkdW6R%Z>LV1f(h8&laTok@5r{qw0SZ_KMOi7TX6ryCT3NZo;`SYoHj zgdb6q)Q0=AkMTtBUD_n;{*3-&lM3>>HlmvLJc?kwEpHyFp#t|!N?ebl+5x-^Ih3#^ zB>Ltq_FPidz7PIER`U12R%^05Iz6k500gUG%)vq7cK z-u8#<(r^JKPJp7j#11?y$G(p~fY7*DUU9fh2@$~_M?XQO$lS5+zGNSOy&ThD*rCB#p$K=1^y@7J$2~axvut`vEvi1m-?*Yn9W55|uQoRR zCYoiRLM7t_c(~M}?~cCGdb24u{=emi1?ojLW(3^nyXwy#bc-0s&Ch?`es^=YK6ZCB z*6leaSp-|{Km%kWslZ<3iN=UcVO&%t7kz4-*+stU=UVyc|QUM!WLEJ~h>TE6RA zVWx3ZWBApwd}7v47ADoPC{sa~yPr%am1!@WOMb^K;cswUS0E;O zqPfmwbpc!#HWKz#d?Sb+dEy%L_{7=?X!+R<8Mwr+s@bKS?{8c$9grXPEhOHBjD z3m;A65!LdLc`D@L_?)pqkQQr!aFEu@}`Tv{|MAjq*Q{f&(+#m?w~)C z#l&4M?#MHqnj#1$$~0p`m7;^Phbp{-fxx)$#TGipSEgu#uUuW4Iz zk4fRw41Ui~RH`)559N=%n?``GtNPk&FpYL~r}#HQg9KbFM6d=MDki4!N1cA^`P-L6EKRS%@DEg_uZNC`t8NKzZm#JZ zUFlP#4R)F;>kPK+oIA>P_bjPqJNEV1ve~@u1D1LP#ZAHQ>7TEmMN%J%(wMOyhmlx5 zR~+_xd>7R(mORsiPciGyT!NjENS=Kq+1HW#am+0l+qa6bgC2a_XOQQK2_gLI;v0az z*<7b!cK;R}&Bn>&vnpP_z44dp?G1^7Z5xSOb!T&^v!_ssq?UrzgH|&e`z_m>aphLT zq&=85X!^!ptXjbtS+8%!IZe_U+igSocER|sUOh2A312q&c@A*LgzUXi4ERu=>g~hT zrI8-X_kH9H4m^^xL-9x>|NeeM`}JO`1WK{cJs~abcY61A&H5z`kLE zoF-5=8`asy{q%3KdOal6_lG7xOulc{Ak89E={?^+mc*}oDn;iGm zzFyr+C$iGPSvNjUTYc%n1wj3>Q$_UOZ(`ENs{+p*BC&Z{es1jMmP(AYTG{c&m}QeR z=y^09o+qJMu3k@&kv{R^#ERFTXR&zoa9OLby&cviq-%3Kt}o5%SXor1Xl(P-z8slt zq`GqZWVIlM7Zeb&u#!P1V~PIGz9VMH@l&U)BO{flYLY9V#FO9q?x=7R(J{^1W@mnH z;fD%~&*z!&>9g-}Dn~T;ce9$6APGP~(Vs4iq8>~sQ|Jc!KB20@X+H6lXv$H!T&&%e z#6R>)&>$C$(i*0pkK;X*_#j^D$hlUxo2?p=sD**sts+$E5fk+>+XYOF6|GbOopMF~p9|_f=ulI35Zz<{xie0nXt!s+0Z%60p_h3=u{;_C*{R-i#P$khQ~vn{E2}l)q>yyg99&N z+&LD3H(7>8f9$nm;C0j~z{>V|)ugSP9)jJ`@bfXrmrH}gwf>Xq4Ycn!OFdJiS}A~( z`Oaq1q|L*3W8KIeQq1x35y8j^(Yi|QD@M_vwJ7LkDHq-Cn}kIX4YP~EH6-3O9nwA~ zJ~mQmVS%qC2#MuYLf?M6ynmXt*yIFvXD+?tgQ1)DjHzZ2QyHIjJg#NM-DdpnuGp<| zZSKK-6?4q$3D5{Q{6i-y6bORN3hv>Byl3&)yvs&|kUNIDy}@s)yjIBp-GCa&tNuA4 z7yc6-%Ds%(Z|rib&EDee_g%?*=d?4h3ChDjlY4SiO1rmmfk&P}%pnO?z{}{GG56c~ zu7S|Ij!p#w-}onYE<^FlrO6DqlxGS55(ZDeDw7Iq+y8>}0l|DyUm*KgPp_bLi>s?I z(JJ)#oygvSzd1838ms@OBFzJya1W331de4wg4p9SpOR~AxJOx)(Gl3eYS_Pt2^X8X zhgluKH0CrE6QHU_IaC3=l@ztw_AQ8^SUY{XbVV^T06)zb{Lm zKyK8>SVpH4`}pY65xJ!=VZHGyJs#ZZz6R!daIK)lc{#FZ&#cS{W{>@$3bvg=t09)k z@lBegZ~ZJH>wW`XCb|8ul}RWm07k{5iLMNkM1!+mcY1#IP|u36(GR8ICzIN!Lcv=# zzbUDHM%UQ4@5;AP@G;Gn+-;i1rgqq6IqU3vVN8h-8sMod0q^Ve*$|buF08IngOS^F z%tcOC6|4kpBM>*(^4v+t#!(O-Z)(uJ;WKwtI!g9|Bs0C3EGt>bLI4MX)RTMK8ybUm zS)dr7iWZucp0B-+N*ni2-p%bVhcAx#-%z`ACh*4>S>HT>8yirbJ}C9TdaHMzhEL<~ z_k8oIHgY7%-GO)i8|^s~#!lrkCr;%x#lOFbzb_VLkX$#0-RM6EfbaACq9PP;1A&;E z%hQ#U;P*lIXjnWp`^?OYJ7f%acmAIqllaK&GXE|QN7ZGy`33kq`=mIYpXP4I^^Wa! z#vG$ZCMfE;GyGEce5H3ub_>a9(iY5)R2h{F9n`0R5)Yi9!KGnW~+nN=AR zb&Cuy6WMR0qlfkmHxU`mL{|8{o`foTdj2L^?PguM6hMu6YlcHnCpA(Tk0oINUbJG< zleIqh{Cdh>$SelKT&Y<~7btr)LZwNrot8}UQ$*5whu<8I(zJd$T{ITNL`Z%gVUc%rs& zxAW`v8?(1p9{%}1qL8%HOkmZpS&x|^{CoX4?g?b`*A01f{NQs7NWuK~q7b_RV{VH? zAF@NK=Zw({5>)<7xc2sR65`M2wo#mPJ|;_Fj_`;g@M9zaH_Zn(3tL>~CuX7L6?3B5N{xu&GfQP}IE9La=DA=) zQ=tN?YidTKBQa8RNlWsTz%$So6y+dB=do=wdimo*lKS3BX9Fz@qJ8c8OvAEn0!3_f3N&^4H z8lOYip@CvD!ZeXyrreym+D3GJk7{SexKxcw-uwF`narNAG)2W4fi-U1MfB_vwU{ZA z@1!~gqn853kB1b5mJBI(`*uOm=tcfLVQwC=0z&KC{nS(CzxpS`s$e8B3+f3I?g^WM zq`9N{`Bu(|#P|P%rt@d2$`*rIdcNX9TE%evtLDoj%|hXSkWKjjlpq~wbHQHCvg+rD z6QaPwp4`H)+?HH{yBrrYd(oE}>3*AuK71Ek%I(Z_3ZmjF2L2Ch*@>vo2n(sKImsE6m(l!e4Y_RlVxs06mj49GO zJfY%8Qt58-1}<*${hqZlptYNW*rWJCDN5_zO#bkAV@9t3|Egr7YLY+nK4J7XNq zFV`7Ndk)U9FO_E4=Pom*Tl)1}<2Quor88A7n=Ylm13{)PNW0`K0Rp()%;8V$6-Auf z%32xNH5fnF929?Gv^wKmGA9{W{mK-+wdm~ljEn*M^D{pQ=cTcaIF?JJUyQY9*S%A$ z-ru}lf^s)Iej!+T(q5_)(GTY`9`MdrX=%A$GW)Xh9j@OvHtaBLVZ8MiZ*fuheWena zMjc+2Zbw^hoC$Xht#}q|Gg0m+FFUQZOqzG>S5f^#$*)a5F{H2c5YXrVo4!^|< zeFFCKLSiXcXQx{hRS+84k*0VHPp$}T5x#Bi%^0#yg_7OF4{0Z@6B*Q`a(=wj+c@#5 z&o9`&ZjyWv)fihZm;LK?Bq&R>X0;qjf=&COQ&={-E3h`sU@|&s!z+FXxal+h@=|5y z`qFdDb~-rc#R4_%Q^n~q9(@_3WH9>Zjc0J<`l7i9B%do-r~KBT6eXA7KlerXG0u{L zczvt8`H4mGczC4|o^FM1XD_(SU9t$y*~HEoyWh^+Va+@RH9 zgmDMf8GO4N*4TL4CoBiXN?qa}6#4>vIa$iWak#iZ;e4MgKiqMX2~eYWj8Gnp`qgpn ze#Rm}&>eV|k-ngC;*spgug|LoU9ex+5c*L!9)eaoo>$#m;fXY z-|q25Z|WT)bq%Cyzlb-FIoDuhz+ZDtn}Oz561Lpq-O_hz^obhd+o-lN^EZsiKn;AM z#tcd>!SgL{6hS-Fx4zoC>k$)Sf)qk~5A#emn7=G2>No+g2!17WzaLQQL@aX={{iB3 z!wZpD{nQrr4W2<^?{nWN)qfX)bxlHkTN*eT{0XLrlwUMoPoA=6J$R~OUGoo5M&u7Qb?D%e5C7iGPjrazRtIu+4TWI$Lc^!|BY4V|NpT{!snD( zSW7}{^PA=6M+u*j1^0>vtH^@3&f|gUQi7 zQdw|GRxx)G5-|8`ecy@>GV9$P?GR4Z-yq-k-AmporsNdUl&Zo&>+PtzT!|=SuOg=; zAA0&Z7o4>!2hS1J3D~|Rc zB~foipt}n^Z~Dmxr9{f4n))o3%`1Ob_#&>BB_wuur_#F6-0E6aZ0dfQwddC@YYG;~rBQG3#Y^uHI{VyVvVS7>fcBmD#{JxM%$-H>fcS z%~=Wzxbr&)0vFBw_-4A}cvwk&2Hzq7v!Y^uNtFa2#qblv)Hf;f`g{Tz2@-=YCKT5@P^$#7v9S~JZg;oWr!8XuUc=sAD291#&d$#67x0hp za=X9a4rU5;_YQ2lwKZL$BTjv&bGUOCjb=bL7zV9w9CFCNpEU3_Y z*e3w*!-i@txN(=E7xBmP(NX+TS)P z4|_lFR_oU|_{D3nMstE^hK7>>M6B}YBGRAF;wT{CNQ(!Q32;q+)9+li8V5p{yh3+n z-L?#n*|_Hz-aLy3VK9%cpL$Y9r%*Vqrw+F8kn zWMOo~_CFDi;^n*~MMIwuOcLmN$=BmB23g$n=%}U523BrcJosKMB41LC%bc3u@5bkQ z4yjkr;P@Qy+>j~O%gR(3;$=fuV!o3j2PdpwSlk{&UmVOCb zx@i+<4Qg`Dj9}0ivibTppTe;v{HJu*d5xNl#|{ zUt1mwCz~J6RvM9~NO4Am-8lx)dhqE%v_SQFodkD$9#;0#;}KkBBp+bCZ@f5JGM+*5 zH`wQ9G>jj&40ADJJ|Oc2w-$4?3&CfPVyF z+QNaq*@fW2`A?p8cmPFfG<5fnSCmgMm<1zDyd2nxrOxe2QxO^;8gUzb!drGnIb>Q) zWLf1AceR2i9Votm&U+F*(0b zBQ%ixohwDj@b@Rd9F^GBRHUx4M2xW1+E%(Me0% zwEZf=qMz1Os(@0rqwm3F(N?eH42HejjwEq@2l*j9OnCaa0)o!=E5>2Jg`a*+S?OY( zGj<(%_KtRmrK!vX_vv;$YKSY%so(=&9kLi<6v!4x^vROuv;cHx(OX3O5vhUQdvJ!P!x z%ei@)`4LNr61LlWZA-h*=vJSh(}il~lV33>7bB64A-Z<($)8ahrkv}E_m{DgZeJm6 z(+2@QL`AZ@nw+jkUe`uc1^FE<#UV~DYwM=*I zx|0@%dv{o3T+}GS?!sW`*8ZzTrNRLW1@Sc+cy-@M2z6fYbmqHVj|bN9YXODn#Fq1* zmwE^z|IjLSm*tk%S}zv(xC`lR*>Ai_rdSfhqR9P7hqOzyd=88VxU9X{ zkc@W3=Qpny^fdplr}@p~u9_`0Qer1LSgTY_xvNv~iul=?*NgIc6H7(PfJxoH<%Hoo zdwORYm!q$f#~{yX>ThP6vCocI9pkxNF$2=q0Lj<#>jTmNaY9Z%H&yUobIc6@4^=Oh z`L!fGC~+&f5Q54FDMF(4@HKKo8H`v$5v@U#6uZ?UXAgS5LPCh|Y73bY$knNw0C)qs ziw+NV|34Oh$c+a@bO_7!*FZ?{W@B#$S~fCBl48kj65rnZevy)_cd1-#dT30Dt`7n^ zUtv^CC}@I#sqnWMJuo!nhUw2s2u)Ci~$DndQg9iM1dA;x7Bl8$HI=gmG+iEck^K*24vPbAz z>AgVd073j~lIVTV>f44EWMBsMfJ%l1G zhyJ(SQ{Fj9&VCw}Ec7YKzxTmcjEU*Zb^qn;qNa6Xr?x z7fogWCCC^l?j*nt*3Wt^Al>XGRDbySc(SwtqP29|8k7^P@2PZ$K^1663t%p6AyIkO z6xY{1FyL#tN##Q&*u)rOyR2!80L*4S6niRoZFP7Vc-I|KhyU-=df>YGXWPk26D(MI zXFuWkfvHCxRFQ1uTK|2&&n!>BDu!FD$j)TYKP1h6TyeY0C4im!$h?da8p{iR^Ko%d4x}*khFIyK3aB+Rs97 zE~+5VDd?r0*O?q^CdS+h?o#q zDoS-n=Z>P_qsWQx`%oj`*$L3xJxndv?4@cXtHhD~{6m!_Qe%-}RwzxATT}6DI-&3p<<9J8bWlC0@o2Q>R0^`%K{c8_2$N>v@Z>Q`MtR#??kl6uPQ9V; zPJn)_Cao7y$0|`+Q8iYwB#lP|Jhjv!{>ukfGgW}g1`+p@tAvjMIV_EPSyCx31j=M2W?P-Ew;PWRA_V!V-tZ`kz*W0OK z_eje!Ai4=iE3dK&yvJ~uoc-s*x?O=`Ohw$*WU~0i7Z#{*v!~3iPk2q5pU1C2fRLMv zs&Mn$4azQTHYr$NG-dvL6lK$V#T(vlZ!$ajGI$Dv#iW=69j3l-o=PyF_l#YY3luDO z3sw|6qcsB&7JQ3GeLC4ruF|}LzVOwI`BWdm83M|j*v(uJpa+nC>Licd*Y(y|*-DVk*VSe5cQ+W6roo%Fyj9i}8 z9Rn9DY0o+i=L-9Xk2c$aH`QYz+$19I%gV~4qTgGKyW1L=lclxz9Qu?OQC1_;=Ao!C z_><9H(UCw;DMjK23E|btS76vFzX%DFMo&kbOmGtVc*wgBCq+skqHx2_upA(9s51EvzZp0J8p`yE*#5Jq#kC6) zecgRmT%R=76=z1zEa*2`Q9VQ9JTB&SC8K-b^y^<_1V0UO;ro29m|n=@tsn?`1F9-he7<;yn2hZ zd71wzI8ZugDk)pT?yqLm_--<?YrfvVqr=*EEJobF!T02>b#N;;Z@Hk7(uxzL=#_D#ZB`N?%-V_fl0JLyg^()p45N)T{I#Unk@wh!xG|DvI88Qxbh z+xF^##*(K%tm|u>-a=Xv##pX=_+X}QsEuVOYT-G3k~ptjgekq|BG>!+|>pLl@{X^!H;mML2G6qRzGlt!)BbOt&#@(!`E~Ycq_qe&m zMIXD~S~(2VmsXoSi1!wOFWsc|OeareKDH#_Rj3#Fsqp-(Kqx71;Jx~7Z)Ttq+xxZv z(^O>Qn8}{qC_jVTrD)=qy9=BiQ3`)c0Z%yx8M&!ivEs%3s}jB%-_{0x2AFymO@p-g zL!K~Zu&!$5o|hb+{VSg3(u%A65-aZ&^il7F$VB-J)?fQ#`N&Om8q40~7M^-bfn;Qt zF4^0bnPhy$cPD%=_D&JUqehy{`?ISv5^Y$?@+*7)y72ELNwW?29Qs>DN6%%l2ODDa z^C(oKFRAs-bZG8MGRZ~DXc=fwc7!EXJnD(D-q{BmGKwdghe=08+P!+u>VL_I_!?SL z9WjvhiI;I4YLj`KS^ ztV zcKpeYc~M*FQE^pSY~xv~xd^RPvPfj#6s}Fta@pp+^V$}_d)03=X&~Mqao*1ELCiIn1^eU+weOs9&qF$7(;_w`siAiy8uj9Aj5v}EMp0L)h(c{RaQ!xYp5mqnI!ye}R<9uLzCpuy zTZbl@@i@2l&(lqZ1VtgO5v1$GlE%W^s0n+eXxkSl>0=_*+S3X=yr6Z4Rh*1WYD+@! ziIH+s40un}O4Z!P9hhlS2wtHDBfa_J_HsaTXW!I}ihJPm57C~kyWTmQ5Eis;8*8Dy zPm{#(UY1mR{Q3EoZD+_3vSAF0@cJ~+rdInr3ItNbW{d9c%5QDTRy->g-oF+t=rob0 zL=Lfx9lXL3MyFRz+vYfBN|Xhgb?iN$5dLqPQRzg`_4%Rjs-cC*(<&BR?jH zqbTw8aQcY`O3|6UY~rfaY@m(Ljy7#G@h8DR{tC24tWxYA;2nK^?i$}_YCC{VPZ$7id$_d#9k9mVioO=? zQxc3y{?E&Q^b|X%YF35pXB- zT@K~k%3ql-Z&fpn&c+}#?@j}}7QKyRFPZw)ubucw%xz}T~Fg*O8O3RXMH8_q&aLXwqW3k zEhRb}zoeSHJToE3ik@rH-c*jS=qIz-!=dZ9R&iS;nNb%W%2}`ZYT0xeoV;D@Ye#3t zSi3|UuLdX4^SL6Tbcgjy%imAXXSZ}j$*<`?Hx$KUCej~`dEFTI4UOw!k^Q!53S@mh zhh`tJhJ|Uo`W5jF7glp#da~T5EN1!H#}uJ>+%9@wA13$my+`_G%|@M@4ETAqK+k9r z<<_a^^WQVvRlxyVPuYC9{!L;Tv=r?1YOR&vD*EtC0q?xtv8}YsF&NknvBsMq5i&bq zLJr>o+5He>osZdaVsTu>=ZMep!l$}+6u*Z&4tfP}66k+?$Rqah`n7|)Wbi1<=p`cN z`}~fCe`NfzJ#EBM)_Hg^2?M>?LxXJ+sBM(Ds^EP&)&sCYN2ZXzu>t=_T@sg)kDVyh z$yU^BL~>BhwTo>jy^U?(&g%-{!anXi%c80xqR%_O2;(F*+g@Y6gczG_#e^Mfb2n&p zLLbaYucpI*?4G_Ii$ZQ*q6~Ox#W7V5tf5X&8{|+o6~iwhi#}$uyD|TztIPVW^PBD8 zzcKa$<#Q;d?2e4|?8v)yB*6XRUzguln*{j1v&H2B!76NSN?jk9Kcv4D&&-SO<(YRD9^N27K{67B(-X6wq}`3F+nbRNjw@JuPg z2x&pd1Ypy`3RmFjuFd1}tFA~k_qbD!P(g#4_<6(B3RV#@(u;FW(jm-VzQxvb~xW+!XzDSXd%rE4u%sI(*KyduNyPtCWe z6H457ELg92Wg7@Xg>%%r)Z`Lg(hdjlHJ3WSWnOeU+MNqEpy;GA*ZjEpXCvt$aQ@JW zP7g3$ckwm8m2|M5r!*5i5Axegt_qh-2B`%gT&M1Cc24&@GS^dj)!7Qk$pppnplkWL zUrRY31XrffP!r)bG-|X=>bjvhwk}unudsE1Pe3ja_jEXB@+uJ0Jn!=HtBq#dz}0*0 z>j9(=Tqz;T(ZztYrz6{WLE8h|a=jojF%3@*cq725F^zC{N&Sica2|El70jC*_U63X zgOO_(Hq`Z?2R5ywc!xIQ+K0<;#RUY}Yu?h^z6!ZG$sEi(N2BTu1!qljF0PKCp$|0k zh5dtbwB8>B?eF2<3F)>uY0l5KWICJbB4oLVCtu|fM|)p+*>#@BNl3iF$Rc#~zdd+r+aOV*1T^)t1Sif6gDEIifjZHlArct(cf zxdnz@38XP1(|??CAD2Q)J<1QdmAHL20GPDtvf-i(xZi#GFvBdgi8}7n^X|2f#!;8>O_c+u^}v^;&mc;$QNvr^Hjy_Sl+eFyO; z6`VgUX)86pu3(z___&q7BqXCT_Q;PnZAQ_J(@JjJzjst-4?EHU*dJp_&t9E_XCDZUPhRIXVt9JSW*fQNyblI+6ja4Y#_Q{;Ltg)t|#|ew#}`c>S!rJ+}J6#s&R(oW3{P^?K>z?|8F+rHvLh&;5+XF-EFz6qpG-*Rzq= z;_scC{_{F4V&nQoakjOQo|M+!Kngs@_@hDIWYCMT;Zt>A9ux6s#S0yRlPh*sK~P`A zC1BrUw zFU32beCBN-5fe;m%xvb{UcP-ocHoDbVv8?ny|ejtes&#P0(!-mT2Me3)d97FIYC2= z_wO=-qseqn)}jotZ77ERerKxjWgQUbn{#%*e}BDt^7WO*UyC1VPmd)ihz&AZU;s&$VE%65@&Vj?Kl}V3-h9};cenoL*`)W%IdQh9B z{=Kr^X_;C2`Xy825Z=g9pQUXo5p{RYmz|0^wa<-`?F3RC~lQya}P~K)iUEII?p06nFS0 zT@AuAX!n6^;U7;WTzE31{lS%~8;tx2nB`@V4B}tpk$5qN6-7Z{cli4exPP_fSsKf3 z`vY^LPj~rIlU?7=E-SZnp#KKD`*<$Am^kZ#(-KZf=e{7-qEBTOyuO^@*cF_+l86rc-WcX7m*U^t!PbztG1o8O zDfzNum+afZfbnoX&Lk>r6(nR;Of<+l~rMmHPdw zl6`1j4ETYonEj3VyteUbSyVi+;YCY_!_`BgOWN`TK+BS7N!#Qv))4>cRNnid!v?`2 z$O?DDCO&1Pp@~9D!w76aqJMXlxn3Rwt0#g8G{kt4a@Qy!K?YqFn*r)*OURprUHg+` zbO7^q!7-poJaVSrFM(k9FzS)gS&PI(L#|$)sspXWiwS^%G#9T<1Q=CEyCf$$NAWK3 zpjQ72>`mIe zMAda$eIc)TH+~-_!B=EcP(swh*wI|EEgmb9)W_lBoRSpc_sfC_0|otGq;JXP=lLv2z)2x`!KV|Rk=Dl6H)S+{RWit-1eE@ z%8Pg({O%1Ti2&a10#iEtMd(C5mKBorGO2UGrI0f!Yswam3VdhVYl+3msRD=@@Li3Hm1b!F z4osAST^jpZ!Uh0JOWq`9Srn>Gu$+4FXMW%W90_h-t+GCnQTyeYKYiJfxNnpgtO5wP z5F2ks_Nz4j`ly(b*XRbi%=IybiqKzlX^7*%;SJX80N#LY&*+VG($I^nMlMjeHzhy9 z&&JO0ofL?-pJCxna>wWP!&?gK@vPTqGS}5s%FS4e>0k}BkAhe+ugaN7uxwd)3(*^W z&8+kV*EDL}yM-^7g?{1$jN2K*(=~Gf!1#MF3++{t^H0cg?;4SW0WT6E@I-G>n)w-^ z(U&0Uf`s@$?DAg@(+f64b^Ko~xcSG9o$7y2C#KMA_qHc$R!9G8#UV*(@CjP>ZIbG- zJcT1{dSxoJwPE;E#(qjf3LzB(6}D54Iibq8brNjCXHTD8eSB<1O=HY6udgD>6KnMM zpz?rIpZv3R%};cqHJc|41+e;hbKjPbKz)5>_BBzpcD_$!YsgQfH#SgXx!Ha8J|W&? z^!g2!MMfe#_lriuO-WX6JyCXQ11YU+E$8nME*T$r$ED@ltRPXmTo^yiIpdu;>{E3T zuDu&*4IL>R=x6;eguOF_h~)I8$Y;NwzaGc`!vbm*rmvwDorEPMwmLC%%>fMyZ|ZJC zADrDag=pV^f3B5g5S!Gh746Bu5J&XZxgyImmuCSa3r>FXI)hl84S;)J;74LgQuQVc zu^&Q&*gTN4o#@f$vf><1z6l?(z4$l3uu{e}{{ja%YFN3$QQVSDPChzMDnUuCOJ?|+ zJIm)u^15}8-(~Z&9{i9d0AS;F9J?sV!trmJd5mUPsctco|0NDiZ;!#MG-1M3Mz)$> zXY8gH|GJvy1WR#ck!>g9yTG)r0W>}BP+jQ{T{5RSNb=;j9E5QQpW`?szu8dzW3tFO zWYuTL`w`AN`ESpj9Cu~+J`ezzhFl0X#MD*s(x<2yB{o;|)u(te0*XP;uKLz?Ly3|_ zURJd{u^>`cy;54UF2c@Is%3g^A!=cmkIxim=9eKuef(&h1w0!xpblzTqnl{K?*`np zyl$mXnGGu9soq7pwn#7P{%yQgZ#%?QT(g6{TK5uinM)A4EM2MA*8RO06&9OowvRUZjto;@zYERS4SI9|wCK z=QSJ#utM#$iXJ_<_^#P^`C1RD{D<{H$qF{nW!PMaA$W>{agLo*X)iTi*9gBHr>&AJ z6`<~I=3O?HkBB&2sUWWvQ0Q7;|3Yc!wry0GO7;hh+=*Qp^~)}kS!i$PZi*wc>mYcu zCG#(YFXeGr0B^$dg4DQ`Z-BTdlZN|;1fiJ|2#FTsuC7i8=lo9T+mu$xwzUu)R)Pqc zZvw>?#^i*@tF?l2ydqu)o3V=U7|d@x%-9Fbr-5(YdnRSUv0>i7Ia` zA8gpX|Ey(W9@7mngV;%ib<9e?wR`_S9r2TL6fJpJD;ruS|J_DzbS3F0np;QsN2upq z#G{%Xi&eHk<|<(w_B}82XJ@CroPR6YGY6D(&f))rZ@*@*Xl&Pata&^7`p524%r_$i zw*I4y3ND|vx)}v__Hsb6F|m~1ENS)7LLW**^nBnNd{e!fq26pegk;0SB71ya;XY-1LYOBq!3e0``bPQ{=j$sF zg#fS<(|pb0-nrUx5E620;Hva=INDQ&HetCZ@LQcju)yfk8JCQ+$4OYUFV+;?%oG`X zVYWgScb7JYR7N!fa1Wyic5el#k0$PM&1x)W#sIB$y<%zL)z{jGpz459h;9tQQK-Np z3vKgqe7hHxEX+u$kRbj+6?*Kb@jLo_Wp0wI>$RSOly=~)lNPGNcZU^I`3m1e9(WPx zcwZ~?>5=i)uwwzLp|4au2k+CwQ}^NU=@mv$TamYQU%(TK?lcx7(dX0~kL=h#190B$ zpwwAE1Mrw=N!Zx)?uLKhawZl#t|LAiBy}nkc;f07+aoTOQMENA6G8#*RTs$(f89K0 zH$^-7&(85Vm_!m|1tjBqPj`UmbW(;H-^veeQXVU5DyR7T@ju%Gk!^e|pVdO%kA)I~ zX0PsHg31n*SBg!KR72Yfi4?*YehLd}Zye3^KM7Q;!bgaEfS(LpL$d>kj|yGs+&HV^ z<0Kt+v$;-1SA!1=WTb{9HGi+wNVf8&*$(G=W!IIwU3E?`o7%YEjtfL;q_(ipzI3-% zws?a*VP9?`g=tHALt6kByf;Pf~}uJ1#epjqzm;5U3C-Z@Ae&oT{HHjz8dR{q`b~3a6gRRsaJ_#!&A|IrHE4G*Nb>m$J-r!;d1c{O6Q4Cm&_zIh80)ku7xa<1 zNMp6+r8n_ydiaLj+@iEWGm+?X4+~p5iwYaK{J8meibIGQ|2k&Cb8LMn=rEQNzD)^A zlGw!(eG&doGIqqn(2+YC`se4F_EK4(khsbkO>LKgcHC_HoSBrp^i+pb;pTUo=W^Qj z>i<-34Bn>Bn%-y`8rj)kvvTPCe_Xv)R2*HnE!y2c8g~iq!686!ceg;}?m>gQySrzBzGZog5HFgO*<)|`|x3AP&Qi#bY| zC!vKlxai)FQ7%bDV+2@@=>AZ>fDSROm}}_CN=6O;?6`<@jO#5FFB6+CJx@gu!1_Tt z)Xw|LWe+lEwi9P-5vhC?S(^2h_hfo*^;V{rf?BerdgxTm^SRyph zp~~+T8F4}3eK!RK%K>JA3_$b{_XD2`SqBD?04D8s*{=u>F-ORWAzVBUADa5~@<;9= z3K>gwI)WFh-%gPdzY)%>@#}#|@Y)rHVOZ^T+=G}W3)6!l@V!}~Va0Kg!i|{X=7!nN z>g{FqgP8sd`TmuJrlSIR)Hcs}0eYxwuw?!1NlTSRC$+cQysg9gIy!u7wHg_CH3m!n zQv(YzR;s$5g?(pphB&kK&!0~`6gnw+mO`yeUOnOwr;q#RS!hk?MF0pU0(A%xjb|pt zVuq-QVUpC!GA`)_0qWZ*OnU!7-;z z)zwP+I1uNn9jQKUh2;TaA1i^UshCW9X2|#q%cj0zCA21fVQYU|MJ1vpsRHMiW=VK3G8)Yy07WM`Wfb951a9SqGdEhVbOa6HhLWd7M6#_mISCtmQ z0^y-qqdP_ehW*ASR~2j6#^y3gjAuWmVAbu;PNe@<5ndQN*LKO{gYa@s6%?t9=HK_G zL=%t)Ytq9$$k6k0(*O@C#_fo!D-*c0p#*29Q8hf9-+*)K+C}%ZsY%*%iBv|K9-c-# z#T;6(KY=1XBt`0NmJdpRv-4bZrGl9HKm`SG0|O@O=OBi2p$qaTb(T7S;Ywi$tc_JO z_Mq-l0qY;rJklKVnv|z~*B2;yf04iC!8FqBP2J~VTZMDJ0QY@mNln~nEdUHk8?$~s zfpz_pzWz5oAyt3Nn5LYQ+fK7aRVQ7zCz&e`PZnPY_}>x z=42AuL+5AP`&N$QHvMZQ9iF)lXCYJTC9q6Hkfr}m7H_Nh#HFRRRc4OSX1>5c<1q%Z zeta%LZg_*r#8@ow!C)Wd{wT6WYTz5cKji_6ABMI7r~wzp$WwDr2Lq>S1I$2@ZG)}U zTnIZXIgQZ6eg$*S{fRBMG41#;y^v8q@Y&#cQ(;80$NOWcf8pwK&`*2*-n%roq;NZy z6qqD;C0XOk6?+XtNSk5x-&batsH-o)2IT+_4{!vf+@;eIZo=-`3SWc7AmVuVb4$`! zL;eY9+F+26sflckN)>7@VY@p}bh^^W)Nxe11azmPs1pB7*i6GiCxOf%xY6cIoZXI~ z8PbpWZ;ppW-|J|8@S&&yq_@3Tc1yz$CRhMDR$hi_1_>%r-l~*$c35>efZD^@g9jYT z?vC+s(Ypd@U*H9MhpY^B?7W$UGo#>lC?sBCLBBY4e%OfTlJ``gc;jQ#&ajgMQXU>4 zmvj(cpj%0>qSfypj0z@xJw6S?Az<VkuT4uKdRQ|(@<@bDmCB2$ii0S-A!vn&D~H#VO#um z+}f#PsAvy8y1w?q^a7}*E#gZeDJwLCFGzrak{BD%T0dcbkflp@HD4$IKeH5hM_C|9 zLIW^DB?s{cWQi%(mJ>x6q#hCGlUe4=A*9#Wh7t@o73*gqp#qU1>!kfiU7<{^9_#L2 zqOy7e^8dKF?x&aR>bg@GJ`LG&JP`6icNr_TnR+U3@$qggsAL7C4vV$-!>s&zkaN+2 zci1XZ**99TEJS2Ke1M&}S*P5G>hgbL{c{KOHV6?Vb)-0iafLfQpqs}g!Mm2pR+05_ z15Se02TXs$LY@4oE{%y~Rz6R|`3}sxGf^HO+JrJ9)*2Zz9Hn*L7#~1Ki8;8>?1xoH zzK(oM&Os}@b#driu+_YV>gd6!AU*0xwi+vY(4MbhLzM6$bjoDi$OxBs z2_O!qOP1dqi?F+7V3Qg*)!A-Azte}t@73NDTfPbKh+^<2l|&iGppjoagSzsK_SsI#?#3AA4EZi2frzVw zy^77qAv^JH^eKqosAJyjM)qbu7inzK-?3)~9Gw9Xd|C0gp`Vjl6@{*!m|)QSOj z_{7OV;`?TOtdKHJ6%*v&zN94^RlCRz+ej1R7UsxK*iuNlKE2Ht<%jMtwf)r%pg%G8 z^lR?wQNPpCn_C|bW-qTEIP?Qo!r27kT(+D+^D7-jb_t<}r3rXv#CdJA&NDxRH=wLr z&x)5B{XG{!_SE3)!rQIvS)k-yJ}j$kXZ#U$Gxs~{HpwX`mqqtJ!R+`CQfNKk9Rp5p zidx9oSC;ZiwaM#%PuEflhW%5^cn{w=-)OV831i?cbs{a#SEf6dCcp-OutmPijMvCK zWA|PRrquivnp}iKfrWbu3v->qWj6k9DF&o|;p+(no z;C7eWC?i@NF#2Jjy$I>_vm9eXIUJb)8spAIw5^!zM_hV-y`)DO4M`mYOpU_;K0SpfM8dcYG&(%4*Y0{S?S+5N4T)$bTeIQ_f11Jp zr9rNp-XJrgSYk}Fu&tF;1 zXK2~m&(8D{*VrCj-i~j|Wa`}149kVy<14eb3?4Wvz#EjqBm(6s&67|w1XL8+ssMKo z@1JD#Qh$-b9zbpjBjbPSoMOC#dP*tcgo5P*_?jCcY;Qhmid}6qy==SG-0uB4K|F%m z-d%cVv8mhMWMDFs!W}5Nv8*_btRUp(SZAeTF~*RL_~jyM$??MYzi0mc4xlfz4!$b^ zK)(r~dP+iqQ8O)kcqKdD;O*Y-qW6yau5%PomHwVzx(zc9oN97TJ zYP{8`_NT7E=J04C#!uV`9ZluNXB*V*D`{?zuUPnGd;q?fEihxS=($%Gh3ja3$Nrku zWDE9<$+QbcY<>TfNy=}8jan$dZ{)0UmtGOvU!1$LBcQ0*C9Hp*$L4?(zuZ6PqgS&W z*c@p0<~DtHxV>noZOvKPWf$wu7w#f83SlA9(f8_XAQN%2_oLymX(RtHt(Zzmrf}E`@tG?6m!~l2izUYOy5bYX+ZS;HtXDo5exJbo}Ly z&_);__&{o1DcMlDw@$Y=T%ufoQ+vs+cdNEO5G=Pu$NSj8fFs-YnTfJSv&k7!-HgHp71PRFKBc&~Bj2G=U4m9i7 zU#I5<=OGjY5Ch!hXAO8%#*mFi(IGq3Xirqso!6gxp*uEVW}eEe+k+IyS;(TJqZcy~ zq0MQjcT6lWdZ*O?G5wqMdlPCcFX_Y!Chre0us&bYB#p;jvaIAif0BJC2HSZFk(wfY zo~VHkPNR^CPMs2euJiGH<}>4!RrMDW6D!WZ_((2;C&^SIdq|94U15!+Joj=PKWlJa z3Xiwf<#rn_VatIt_tf5ASP2+-hm&}0LX3Uie1GxbohXw(tjI#dbSrsqRmX}dw$fHn z-^jdRE(Mq9>$TVI1VZ*|{_F*6W zdp)qi`uI>CpwM?~e1?uWH9g1ZxM|0M=`Sm|gIvK32V$3$QfQRE4C)HOFUg)RuoyTA zAqU)S8D0Tb2Voz%Fjd$)T~q8vjTu{A{Ae<*agSCj6gDx^cU3 zq2xR>r59)SBx>vJ_9tTR`C8ytvy(hf<{udDX{OlN$ba8(jCTM_bN6>^v9RB$3Kx9^ zIg3mKWvi-G4~I^F?Gptb>Sgj-yR@7ywc-dQcdwN?=OksCE`s(x&#>CJm5!a=I4(5f zr$Co{H-GQxe7#pyRWWSV$hPv0d#*jkIc=X1s6na7RJM;z`R8vZAd*XbsM%=aSij^H z_4r!4e|q2fwA@hG)}Jll_;)DcCWsxt_bA}~^_6GcA|m3SX`_s0 z%ksRX+LDcWPZHjXG6`F1~ZAtr-3mI}@s$?6H zWp$iDTEIz_#kr1}a5{kbThJ<<=JL){yMvs(@et=qVz zMxh(qpbAb8k464ArwMl|M;3-}yD)HfS`(C-a&ZKTS3JNL;6l&r8DuqJNkU&x2&4#_ zjL^6>Q`INQ2PILDp*TwN98;HjfsQ7d+&U?AWodKxseP!ZO5$7WyWW>=3pi2X#_h@_ zAgeI;mrN8Fn50nw&%n zPzDaZj3Y>?YEcVfT~6!0zj~kSv1>pvpb6m9Vcceh*9N4s9)c7M`0paa-e*jS&G|u~ z8P*1?&ZZhGwjjE@bKN9Xyqq&U=DV9Z*HR|tWvyg=aOqZ=ATRZ3xXZPn@cf(SaX66M z{+E-~`S}kW-Rk$p^#b+qa8Xf%M$0s=KHkT-k)bpGVoU)>rwY!Elt!jv__f}WS3P1z zji8PRY0}idLjS$w2RW>BEL3IDp({F^!w!-Pci~GmACI%_Rool@?H7@mo*&@EU&Y3DO`S}^+)SRzZvsxu()0-#U(0v%ZAcN9$mA=9^ zKkrt@%aRfW%2q+}i81nye50;{ZKvRVzxB;lYHg`!QTW%+`^rueNX_v@5hbGJYt(%RhjBi7RY4CxevRx$lD=4WhNae4jMSH_ZTHN=(UXFME2t?Z| zyCrL4TU>rvA~nYbtgTYBbTCIe84^l)bBGXZJi<#~?YfCb<929Ls^5jC=2^N`aoq+U z`&lU3iW2F@KmF-3RgDNsJXvY+#amBgc56l+?^vyrpbybDCVDDsYX|(|_J*@_5>j@f z&sBbBR8-&|D~aI&!ewM4{^f`_>iyJK81WE{XzkT%fG+uVQm&k|7;^9Qu+8mq<}jdU zH3UtQR2*+xN&7o~!+!S)2~tE@rPZi)+UT==%n0ZgV6<;7=<{%X%Ldm73rj+~v6Dh% zp3xU?$$~$7BXU(SfYr^45|gNJ8Z;j9aU64AWi9am(<|hFPi`A~*@*R!0A8Pd6Q9g~ z%&2ehwCJ_`qWKhjrB~NAl$DfC4v}!V)Gi^je_`MH%!F!ioc%pvxC&`5xUkXGrDE;E zOS~CqxGZ!#kh9TvJ2}0@Ew8IUfz`NOF}$}K*53@@2_VMgx#;OCg4YYKE!QHV%K}$C zRvj49U-RR)Lvpmg(l()oboyXOPu{J+R#CIN6P7vQGr4!DZ3^i+r1_`dBSVAq8~ z5iT^IOj>u5_t(?oItj-(qSy%#c{ZT)CUOZM&i+##z$nrGr>soYxg1uQDz6HcB}SoF zmGs%jK}wKDom^ng!r1i$A*Pv(D_l6xY6>?6JGs2JeBS#i!N)Gl&3lRly<}@w(RUro zgi_uXYOt5ear2{cCFLi$vIb@?Gb3a7VQyx|)yW?g0YKMawr2QEy z2D0V2Mc+qjzdM=5?1{vb2Wma8S?fnsU*0Mu%nRPe9`%fOyI>L|nYQK7VEr`6X4c zLXI9p0E^EE816NmD2Z8cl`uXw@0g_}R3CDkwnZl9)^`gRLj0c*^8aEjUIc=J)6;t5 zw~LUw_H!=<-ybkMcvlw}Rj-%C@6`z?ZVkk|u8Q^sCAEEeO+ULoa>WeR-{0U!?-iC-nJaDzB72&yDhRZsTsqPedCJO(@j^Ud#X#6D+&I{LTe;TdxgX_MeB=UG9%5q6r_0LL9(Vr+nf!fB z@{5jDy%x_n6p#s>-i{-3^r}UH2(cK~SH;`o12gm*%mrovP=oI~xK%-0SRxIyT(0(p zf7iU;%Wjbn5BXqL+w;DzY-5Tt#&urm&+zXuo-p4aqhM07Ph3P~b^h!F?#a@DS%jX< zD(rvB6Y*@l$PMnq1Wam4h*J>)&`$UF&1CKemkSb%2Rk(iJkvg{)^c5G<;{a+&yIJe zp8ELs1djdcpx{9lVPJ1e>vQlkau&uqTu{Hd3pUJypU;^PTql8>ZNRjGM93F4PyqCk^$QQEMUTQ{2u0^h zM+|j^sq`_$rR-zN8)?x0jD0qQI8pi1w}mue@BbU%{f8}Lp`xO0SvGJaIkVI@PTFp1 zKEF&SWx#6_H3Wd~Y(UftLl?Fy7S%wwSm?rSYO>r4RiRBREK2#Ibt(K!eo`l(Y#hF%|^9|(v^HZ}% zt1a(}!_qsPrIn@5^B%nO?@ zCfZ*1&RZu87?mR9iL3jbADEWOu`^c^J#|CcLrz>wRH>;45$wxct0MnybZl_btpZ>!_ z5!XJI6h_C6He%E+IgdPcWNe2@(I8%GWhgl+#I zVwaIZxA7y|WyQ0hOylMwHd2rqsHCT0aLYT~ILoxM1}hC25&IF1Mo@`#JpFXEPXEwZ3yXe>bBvF;%zzkraPio79$O-RB0=k`i=K ze%}7=@U9}7{^FsGnemDmjB1pRCLAwKNiGcaaBBbj7k0q(6dj{+_+dZ9m?~$V91{))s z2tR)K+9pH4BC)BBeS-G4->k@#0u82SM>LYxmyCam9Jq_se7-=ZUj10EiGtTAlae1y zxRv&uP!qN<7Q}!t6epFdSb)^x)q>*w(3~*6 zjp$~C2hz*FzMD^wQ!PV?vRE5oN#s0xcN86!4y1eb{N)CckshPAevl(b*Vkz3mrhWO zs$-Jl zV!uKGcH1f@@&N4Wia=z)r+&z)+^Et?sn^fr?0WdbZ4L$WZ}e-tnM;RDt49hQ507I; z@V?_81w{{9^lx-TOMVFe^k}67sm%L5JK=^$R!B+>dXaX3U#t_D#Z&Zc-(b|&dQ;C{VH2W?mLFbp^RW4b^d1b-D;7q?{^ zoM=p-qNs&Sgz^v)PmU)z@WabVEpmVuO;Fn zVR`nV+@KN0&xT?R6^6Ivql=&Xjk*{mHt@TR_0PHY#pt<-Ps?@rl)<||IK-)HLI>6mhUHssme zUSIvjcb|hjklLt%UVQlFSr;-Y^;If!?#b}xnJrhn1P-X8`Ns|w)khBaZcV6DF+A^m z8BmgcvHyb{lpwiUK8ts&!g}X&bN_$j4gmOJ$oFZ70TjAl#R`Hd zAS*S+4a^1!xJ(t!UVg-`ZzPxtf2-4;x;|&P7S!8Ys6xW#eVNsbW?;CnEMNap#r|1e z{672n!U?_1Sy+X=R~MxVn?<{&B*z*DQA%K%ZS7IiFWZvu6SRq6$B9K$eL{!f#Z1z3EonLV(9e(lJ{Z7A>kn*$QzEv!7QA5jL%B()_ z%5}yD_ZQ3$J7zolsr#CN$QNchNCR^GZZtIwBkbL-YxzFQJdadEmI(|8%Ubj}(f)b2 z%N7Rv?}liiu^@w?E8TidZ*qP7Y$1S~+_0+f?{?1eN^LXZm+n*42dH&7adIlbiY>gh zHO3a6N%4m}wG^ngS7KRBr07oqMBZ^Wk4RctJedmU%@?`;nQ<^gL9q&{15oi=aWI#q zHO_S|!+It4UpSZ)>>cvw8cyVVAH8!Lc{plTRlkXDl%HMS-HqRR)GPN<{edig?SYhy zwVms(mb70q{{LD2n_q52bc&_Mp}Hlr2#B9`$Q78$wn4&<)rPDQ>}BWtosM!f&NUHm zC|L+uKO~t;YQtrs3eXO@7Ha)Tf_$wM%gBnTVT>xUzs)gm@4;uF zUkY0l6MYnPltz%IC+lXAJ`=N#DMeX}b(~=x3O1%|skoZ|!}=^D@Fx~E5V@X&xRy8q zd?E8)xMs%I19}hvwvsX0@epyS*@IA$0q1Lc>l9@J{x0I#J=)kSKIpdbi&&pF1mC+>$u2vcn<9D?lSJZ zEY(|rux*s0MRI26=S%giq6m4Mtq3;?3JOFU>YP2EPaAc3>gHEhPpw9NgPc4v0|_Q) z`8Mof0qJzH#3_G~qL7?a%M5b{>8>NL!=qHHxuXuRCn}cO3~?ICjk&iPX+FCbh5h~Y zs7k#^xQP4C&a4C&*6Cb3IY}K7;} zlz>UVq#>JNvXA5lGoMu=It&sR?_iIb(%_qupMX^$-w=3E-#ha7?cpIIqM{1UjU5xm z_rmPg{Ur(@9Qsi9fEY7@@(X2hR1N{b3kYztasC$vQv4{M30qCO{5V9kYhlhgeR;;k z7n_+!@i;*C8j&>J9%=%ti+zrK^{>PBBYYV?{DJw)@$^_XE8!fKFx8)q4&-4V>)W_5 zrPq^#&ERaH9DqiwE~7n(q!h9i63W-`Hs~bU`Q!XVIXlvSr|u8LGV|f=V*gXbk$6LI z^~22q`cqH!+GkLAo+Y@N=n|h-Yu4k+5zuPDhr%y#Ap=U6@X)3 zy@Vg%;M8Wv|H_db;_Y*b?J8Lt5?+warOeDKb+CP<^e%G|+Qya8#mfMdBr=MEcH-K~ zkU?aa7T=<5J(8fhw!x#L(#-F8D*~Rx_8So!fbjk*0vGap_{n&XII30h?aX# zG_P%WaWm?JCEbq%RwdsF;k@FuCzgI zT!Ub{y*|Gh2-fi=sg_-Bn~sjjc|N$BpT1aYyjzwGKD0nF9Gyx~ zr%&mH0#1TsNQ|?V%ST8k+94Suw5nzcqMfPySGlxHrsekJN4ybXunmkpsFT^I$t$(Z zbC3I?hduDpQc-f{)&4*^$v8$a-|i32a8XdTd13d7W4vfC1z|#k)er$>o5C-YKW8+=_<0=T{fclXE)~TQ)9jbQ)-?kT<}vYqATjPv*NvEV@ZPIrm?g8IBr$E zW0Z7w(2v;~l7*%umhU&0aRAkqXX-(wILiS@W_3%AD?AnjDK#To-Dm??{IOJ3~E zY(JpLMVz08xn3JK05ZDVKUa>1OHW<5(Qw-83PjWVubZ7Ed>Kw(b>^0q4SGPVX?n)( zBaRbYmgO9$$xEk%gy@69HH2k9>egLv@m05<;kx|zy#2^bp|Dli#9!MFS6Olv((JN>wyosS{6=u)Y5dG^RPJu`6&-9E1V`>nTj z7Zo9h`qy9Vf%yZ?Hphp8*QM*qR{n9?&D;;JzV@H^ynf|25^}QBqXBrLb+sedz@w9! zK+&^!_2g2JDU~%y12lu0+iwYGAMp(h^|e&lf$2aQWmuCIog`o@r?OLpQiC&YdX}zUm0j_P`2^&GjKKvKatAM2AlhH%xlr6w-slPh<}&lC{y1NF z^mi6M=~Jt|}B z-Dc1twN#ZF9y)Z*CNXLDAx9VYoC*rZnFi2Ud+t_h#))nsqLIZfq_+>Ko!2YvmsQ2L zTw@UgvT%C^wD>;=zU3?#iq_qK?S=eico)Nm0l_@(RYR8#tl58hC+UZ#mPy}R`bA6W zNma4nF%JVEyGSkqeAzkIFMGGA|!O}5Ew;v?p=9!1pgz0_DUJLF62yP9#4C}GCl9>&JS2ifI{&E=bgb@3+w^i>M2sxK4T zMX(b4e5^TFMb*xCt`dHSS7svh3s4B{+ekX*kD2-Dydxvf=yye;L<*H|L^!K5+^Nv| zuX2{uTIh|Fr$FpgxL+PK3gFy=ZJ^3xMLg~?G=Bs|f1y(*G=(6SB=_GrW-7uQ?@2wY zg=*MXx~J3S>mT4Q`nkFCgXtuE`2LfRG2Y3@8m}$Dd#TizJ{!TUnTz{fwOrCHfjG>p zx0N`v9(OTn6WIG84Sf@Ya&{00#Yj448^(-Afs_OLw$mIca42tC=;58<3H}-ZUa8MJ z=Ygi4>Re-g-E9u1@Ad$FFND$Gx{f%Gj3LL4Q;~|L5(Vr>o+uFDPuGqCIXbYpn)?Em2;y8U&c8sfwZ-=LgJC@js1kvTR4rO~EkK~+k_`SQH3|J@j z1ktt0#-|b+{bXzwlqn!3kDwq=i94G4vc&O~zO~qM_8`lhFg}Z2fmy!0pqYSj+8}|~ zVUHCjMuPH!6lfgpdIXR)mdI~HyR_z~9_Oconj30>^UZm;DowOzVPeu^c06S?h5w2P zZYea9BBI!X<*SzP4FJet_^6P!UpME2F-tS|t(qf$|0!7kTI9T4V1Tv9n5SR~IfdG! zAiq%iMaqcmf_ew!XtBp4KI%)X1{ZGo`wKHG^vdt5^&VcM=NjI#h%wyd`kDcPy6ue? zkGsvw{ekv`K*ZAoW_(Yc=z{ z#`RyWa|eo*U;{cOK!$B{msIK5SE1WZt7VXK%|;SZ-_XGAwqXaAO5)-;C?0kW zSSQ~g^i3fUaQ`_Y25t*{IL)|9Lv`rD;Nf7tVPnGr)h_SDhkmFLCxmr{ukqB^0>gVc z9*<}m&$gJTsZ$$3j}n(YBzicsdWia=lDO$@u~rq+_@Xc@_uT{G$|uZ7o?}NhJNAs9IgH6+2&;Gu8xVhuKwI&J zwFingyq|dInirY?#ny!Hx43h$O_GXj&SuAD z^m)5&&1nJMH#ZJqMm;(Yx-&Gwc$`<0k7^`edYb5fx6!6O6Nk|L{jt;Foc~M(uv}GX zP#J3HW1T_&=lVj{0bulG>-lVnY`j6d?mYpMg3l|2paI)&Rq#tM$WQ2u03Z{${ zS2=tR@$sJE@>GNVXhl^wdlX(QcK{IU&VH)Yq5Wz_q5EsFf227i;GrecmN@HGB?)zJ zw|BgzQP-oJrYv96sLk$BoigxIJm~bvt+0NT^k~ahjAk@xs#IwfT9@C+ijQ;NHo#jy zmAtv7q-2_9W+tm=$wAjOoC*t24E^9D@R;`0N?~?b_vAV7C6U)tSiEC38(*bF{jWXf z*Uhkt{u8L_FYUy8dhLIz{ecc?d(Xx8!o85Lb4X2YY zA!9?5cJMGI!qR`{1f0o4;Wr*`!l)1bz5Z*UitpFHWIG7@ss?L;gunOF{?jKE-#-%3 zw=QeXgAk`~*UPt%{Y;}ft@op`)OM+4(!^dKTkiqL96gYfU2MqQsN-1LJ0HMul>01Vm64+qOxrgZ`Gp8L$zSkgPi z8C^4KT6)ys+oiV9+4a?jx9QzuXXSgSK;~d?gTU=IC_i>BA?Sf<_GXXR`Vz73Ga-K_ zCl-4uDmOSeWtLCV=LDpF`^QP;Y(No(|BC?3i&p6bqb*7qN~<%h$DFs%yFSMU**LB^ONrnX|F|p1S*yW8&aUH| z^)N02<1Wj%a;>>8SV+^J*yx4Ct72Q(nzUo>;&3Sf$pRS<<={|!e0;^aijK5>cWReL@PIg>pp2Av z9QwBzs~kbCw*lf87kl9qWfq?rkMR@HY|j=`!-Whce<%dd?}N`2Y1$+REo^J3Kc&1b zgY&5tsKSiL{d%zB&%}@yB5vXCJhKS6(brf4rTv~3fp zm$=IA;#vBXLTElXnK;f>ONJW5$)k&5+cQ%NqSCDAdG&=@Ik#-y@6~6FWT>DVt8xi9 z@UI?fRp%Ub1f_L2M6PqX>R+}wVXP6ZbNzD}jOCk>V} zM;$da{4()#D5HL~o3%jLK85&oKTz=ECRjAchiU2o84ZwMHjjtmw|TSW5ioaOwMLwu z_G+RImPV;_u3z!*Peil8uB2%7$<~k$unIct zvJ|=q&$ww!-KF<6|9SdL$ZUcm2#IuEn@F+F-m|C7re9icvy@NIdSS zC#9VmzQZJmU3DG)0~y(|1+POO~NsokU>nj`c9F}aQleXHXohYiDhf!3BBohS#-v9F$XzT$X9Tp`cI)Z1V zm6=s@t-2;AR=-u0dU7Vo^nd_dj@^K+KXSL->koI8%}#M<(7oK96r?E@hKiYrJ6l_l zU+szW-!$}W-H;F5Nb}AAy^?i0`uW0}IsovVn3<*AQ9+xk1vwZd4qc3h%mJojSnXg=oo1nM9qyTiE4Fp29?A&mZ$i)G2v8tR;Vx?db8Sm5rZ= zhQb<(_R$&~L)pAVyZa)e;nxRt5=Nw!=pn>B&XeIV#?DVSRA-M@5iSCW)@_h^<{rvu zw1TLd0zFImi3lgXct$ed^g~l~?uh+&2C3rBOl`e$ZreF3?ZUaYpIP&jZ16B0DFYWL zDA}x@?~V?>%}`%8Qv6Nc&jem;TT#$=w_UGqQ_8fvyUSRQ9rn;d{_;sUJ-QwKE~O47 ziJoaChK))@A-=3z+f09syQj5(j*a(GsxVqDZM8qEiu;dz&$IW14%2(N zioABI#qK5R!qszsD@swX+;{k&fBc7I37w$pY;WZLfD!+XD(E2JtIX$V3Vxh%RD zcu?s=-gbT-*J=HE+2Z7=j4GLnH;&Tk!N-tvCOA65)%O;6@QsVBxMVp;qxPo92qaek zm}u)Fn8@lZP%pE?3E0iyV@acB*(*_p3F^44pC{(p8x~mav5J$Lf?E_m2!MolzpkBo zsjN;!Hj1BlA!wCn58 z+Q4!S%y&G6%dqtE<3j^CR*u8Wk3Ma9dvB6IiFz)7w7XIW%mlYbt>x9rN8C>jXIjAc zJcD6`n`?H^`&8X~-3=6G**N&LZ5b5--|?{HDPJ0i&Ppv#L|X0XyTDe0NDo+rWR~{$i81n?Da*D z@4&=9M}m7&T`^)FM;D;od zS9JpfOv?f~KNI4AWWNtBhr`50lj&@|-V4ON=;-@gJa;}FVjRAg@qQg?tZ z1&w?%xSXA_<qu zqhPlejr2@@N1n_tW#JpF_V^C89N<*88fw}CUNaI~gHukyGWiR}{~EhbxlpBPmanN- z$p3@oW~ornJP9|tS~{E1PPE3GgTJ1z;I>p=?1c2uc!gb|O==Z{31=DMMtd|M3^zQ1 zFZ8&_BJf-n-+ltXc<`{mI|@?NrkI(2k=%i(yFS!tM%vBWJLHnQ?obEMB+UKR@N5;j z1seU{NZQNIubBx(@nsD!yf8_orsD0kE-c?^_u@Fe^75Y1?iqZ}3n#sI3P&`c{&7q} z`4vq}@nc48hywT7SQcU_g*Y_(1gccJ0f=kF)f^T3>QV-rf_^fa%7LcIU{cw@l&OJ0 z+AoT)-^`n?p1ZI`u)HWyV_yU0)w~OdsfVbSeMNl-xqnw19l&zSExK@o+Qn~dYBw4J zkRcWL$gfvU{ii zr{gA7_Xx$4pdEbfr@$>K{I?>T43cc1BifHxKLHA&q#=^9Z4c2fiBXP76fHErIc;0S zFP3Fa)<(Xeyb@J}UDjXCqYwfEipNZX4yb&+<~>Tjkz^A4?jSf%DkX%d@*asZY~4~4v$JE`yh9ip zkw1p?|M2ted{lqJxnCm)Js{^CdF_~`00VsY_H z)ZTnmBBxC`QcEp`Kn2uhJKG>&|5B7l{9`nor3lkpcvt(imZmMg)qLh?iL0RG{er0e z7G_vXiL26~c%pKxgN85SZ*XRAW5Z9=J+pGcJiiAHn~$f=xd#|RjC$b5+?k>s;#YI! z^{TOJ<9{k;`9*+Uo*)(*fA~i;*{K>H{Du4h%Hgmb>ZGx*8FCzBXlBKB=$zrPV;SdU zFwAa@AVcfy^o^u!ymSYY0=?_FX9}%Z5k1|SuL?kMn!C{)>o3BPG*0lJMqyBpxD-W* z%m!{9S4(4i5s7Y_MC82U>cSIr_RsU?eM*sES0VS{q*4FLoXCqsU<90oJNV?p*&Lc1Xc--+s?0-+uV?JU~0R!NK$> z702|bEu7;v3?RFtTAQ#hH_L?#9x8>>QCQoCQW`f*A4duv8pyeEFtb-7C)a)Fp7rt0 z!q6jzA0lM=<)}k3_dDb{QjMr0c>O8GV!6sn+VSA5Cmg<*d?zP4B;bYl-?sp!8z;5Zt)7wt%vi|mGZS4FarpAz;f}DoX z?vsip!WBHGR~{Ml*N^h)pX-}cjU}t(b3ZD9!-uP-kSAMe?ywyX%bfDaEx%K7TbD1FSKCxl-1 zkL3v~s=m!m|Er2351odJy`e!R=vPrj1_pr6Oz3XOWc8%nrkqOj3Qt)zo-^%(2L9pV zQ_(lq`Dqe@-&AZd;X`WMH3;=Nx51e%;58E>^c14(GXZR}=>SYc(cGF6Y^wC7O8HPQ z@(*5nj|I!DzuvB%Rv)4{BfdZWAx)&`^r1?zoT>Chqmi8Kt>R|Zy01OKy$|@oN$b58 zwb{b??b|P%D-8Bn2n~6VdS4y#x`>QZ0tm2gso-}WdqQ&Ut{XmFC~NowC(ojcG5x)# zDPl&qGqzu~uPiqfl!mU3aCeXKm{|RX1);)LXoA#FriHXTN5A7!S=Oh)wXc#JjqYd{ z7Ji=iB(ra<_FtF6AsENnu2iN_b=t3l_h4gZ@E4;Hz%l#LF_ zt@GSiGOBYG%iI&P|0B7hvY?=Qw*5&}JaH`qKV5lM960?y4XlJ6IehWKpx2H>Ae^$V zI^K!MgXPq$s#?cw$U@ma<%ze3aUz$hodTAb|g z8|D~3Nwq%f1H;O62MO;IdR8@RsnegMvs4ipY;>(Ce-S!=Y&leOV?e=o@p=tH(FxvL zS;#4mZia^WizKd)Tlz6Z3Q}!B@kqw%e*eU`8h7n)DEcSX&Y|ItT>FoqI#xrYxWWqK zY8bkrEAA(%Rw~aZ+_b_v8+uvcZ!5o0vqZ}kI?jAfQNp{6V!txn8$+v&|wS-m-skr>6yZX)lc`M zzJ+)x^L!5Dd}c0J;&V=1jrAx5ni^COXSsN09oo*a@_cfW*bGjGfeIRbe}7qPflA8H(MDc9Hqm+erh$;r zhmPjvg~fxTq#7W@9r%Lp5I@%kZ2i*Y0R&2T&zQ#+NkJ&~*76~K(dUCWN`B+rgo?VA_$G_fUhiAmTYI(F zTJD{nZZL`lf432dtjFOJOXJg?b$EGFKsjH{+{1C?dq!8md3!aDD(SAhpit(<-iif5mAjCOclk(Ec-}a&k&ahULfOEwFdJ6=G3S-J|`df6V0o(Dw&V zzC6QV3+0-{67#6c7N}}z)rd~+Z=W-7;DFyfA1>YY<#)naIxo`8J_oZ!^fY4~&Az%{ z9--h(2Ku?($mb=L)PfNI`D6awIZbrtcG(OqB}3-yRdo{$$#6Z(R)H^wzw;MigZ{|? zh$6@4DqYBYKM9=+^u{y0U&)~@t7LTOwypzdX;4du>~Ai7^L0XBXu|>OUOny-IUlQ* zF{UF7-&aGnTumxwniA-p_m4HJy?;8A#4mc?MGd5rQXNaLxM;b@nIXy#^Lb z4v;mT$G}+Gy^4aeRW7*J@{X<%zE0=vU(lViD_--kgRrOOBj3wDJ)KvGL&$!E4i=a} z8)XG$V?ZyHkG-*q-5;p^U`u{c*z+Cg9B0!D;^^&2XsXO6Nz79cf_lD=FCS5iFL|xy z1Dp$#%aFw+X7a>sxX4!UXUvR;$o#ZR37VBrrWk?K%bNp|qo((Zxc6cg{BriDZ(kVX zKib(@-6uxJmLLb!7Eq75A7(s8slVmz*#fVGs+6zwue1E`KA;fs#PH}}a29tTNnf^C z8wh0#WwoJOY~$75e$#%2ro?pkw)VfKxq>_@#9n;Px5Pl7=&@~Tt>i>2I$RI(advUl zO&Ep+d)u$%ISe@ zvGCg!Yy1D ziyvut&UGG(Tt7SVo4BE%b=)^ds!n7+lDtcG%+x-9o(N#k5wOSUi{yi zvz5Y&G%YF<3}8XmLHH4&?Law^SYmiBW`VVm%wcT;1EB(ZQ9aElD-Cx!&Gd3t8dG`R)54xe!HKk8PR+iCs$7cM8(&Haub$^)*za2~ ziT9GQ_LzU(7s(uUa`&|F!L=Ctgv;Y>Y(DGl{+6k8h8vv+5GStuxUO4i=&UY87!#@d z%pRFzJ7q`NwaDNK>X~f3ozjwLr#mW%lp}nqZPW^738LDd-u!wMd}2;Csr1S525tu_ITh zF%U%0W-Rt0#GXI-jpjhObLW(XKR`=k9oHU%zdzi=!#?MK|DDHDI-MI=0SNbHQ9Re( z%3HV5Z*x$mXRzMVgTUcX6}x3y*b`PCx6SH!6?M_&Gp`7e`&mhkwYz4h08({w?b5EuVk4DE_=%{=Yh_b9$Z(c;VSjraSp0MuOJj8_q}{KlBC*LUZm9lNnrlr}9} zvCP{AO(DdOcNww`xQA*~#N7G`bF}K&HoHiW#c$WQ8b_A#KB@x9kG-Doahp3bXFOr= zQrZFJHk;PrK;VOUL;!2ynM%5Us-MrlzT^RHt6}~v1G$GuTd@pDhT^(>^?5vzz-X4T z=r3u-mh%OlJp?~p7*t;-rbT;MBzIz;Gv*W)^d6m1Rfm|l0 zChJYVU{LLB);(|krILwkDA#(SBfoCa;bDV$^)swioi+I21q@1|;p5_VfCD0p-TNTk zGT@7~WigIT%skBBqJTJE742s_m6FWV^xErv7AC>Z6FOlX9_I5eXrR-$bA)Jjuy(7{ z8XEtj^28ZJSX@@2m;mOdN@xU9GxKN``qd{DK`SBOd~GQZVNG2x%R^LGk=Xp$rOLb; zD~of3E{F-wq|KK{7fP{#HoeWJm;a-U65cQ)IbC_Q_xGd0z^a#mrlKVZ%5CcWZ5!@2 zc-?A!jqt!4NWx#Iq_1@n%#q2lGP4F35hDk=EL^*a)_eX(9 z$xt%WRuo`xwz}(!(4C}`FB14nUQQDGK8WW4>@e>RGcn~)NUf&ZwpLEf3}lx|gehO7 zyUR%)@C4~Qh0QI_nnJ}swsJq0tFwxKZ%9xreBgIvbd*U7Zgl?A_}Nl*K^G4fCNkH! z^LKx-;7Dwmid3KPo9J#_^7*3rE=!CLp$`U&nIsn>AfX$&`t8lYg}0p-3r&bWq?0__=$_Dc(T^NgSvMpn9 z(s(h#8!x$4-{#u|?H#N*&(m$z#|!yC^EO8}|WPr)-$lTcCX$*Y|bW?}OV3dWkuW zS^VA)A)}mI_`#+E?{-fOj=GIelJ!Ar;xB#ej(iUa6gtt#K_{c%(h?)(1TXgHP!9(g z0r@?^d7E{o8r}yCzZ%4H(Ru57*EbPtYm8H>uo{{~RQdi8I~;ty<2E8Bl@IfBED{#A zq1`0w^R6)T12joTHT60n;V$>T?^oA_euE+&XbVOrqBWJL;hq(BbLBi_p5@n?*A5Mx z3X^W)cdA=STwEUPhaFQ(*PT?d$}BC>YG;RBuDuZ*9uFfQnE>y!?kj2+5*eo4eEiI> z3zb&d*wmeGZPhXRuEuS!`N2FJ+8h$vOv}HO&Yrya>$F5%_x~fN_wO8xW_* zlnlH5(XD{tQ=edNA_3BYjy`l{a>}?Kn>z|kw>Wo0&I)@PMCxK@LEm%o>IPL!0_@4* zcWE?KiOo-<1j#i`V8?xp>coJxulBN&RXH&jO^qJ~xI?}r=#$4)5;0y& z!=~dCEhQX3aZus61B7opku~Xl@>hP{@1GoS8oc;v@91UKFqtKl(GB%&M}=V$`t!DQ zP%-tEie7}n-^Xa;Xe2gmc?Rg-;dW5j@>1JM=UWzc#c8IUz!6@;Cq6ERZeV9V6Txo5 zz7d_IEsvKcp;?(Xb!n(^W_TRAQJ%r)6H0CR@%VYOREn~HI@9{Eh&@+2M~4i}|W@A3!dqPE@vS~_U>8HOTA zIf`85V#S#%9x?~pSCfSPT~#GTgDO&wVVG!EKEFB1tI(6C^_RvE2ZolKPt%9Z&_sF= zRVI9)SwN=n-`v4XfQhN`atYMn%6E(6wc{s}Hw4aV960m{fXIa?b-$A&>H1OdK^LdS z$m^vyTDz0pg~nDT*dzWR5yP|&2@zMtlCLTy;z6>BrKxS5?5Wn-!VQHVqBj78KXPfV zqA(&}9f-*}fo;R!Bzl~d?hFzeR?sz+QE0!7s#@qrb;U5%_-LP1R%ZV^RihM?$=%HE9*ZsFVQ|!nw;TR(%H$|hct!yQ|2~VG(QCIR(rx(U+cQ*D zWYN>wHOJ6^H1XGdyIj0ko@m{j4qCbpdjkt-QT=lqKG{eCKy;EsK^~>p@jPD?t4zWo z3D@+sCuf}1yTGa21s;`|7p`7H)Yjp|^0>AE6`@$H<>Xls+cAezJvKu32>1uWFJQUWL5a>-6l&#zMgHyq zNRCOjAK{hiq;h3sUB^)4l6VQ+y~*+#V(*}^&A2gE*-hlq)1%&i-K3d5@_XQJ%HNN^ zqbkI?z*_o9hKI}yeY`zV?i8LmY22JcdZT3Zy{*9L_v)gRCj1g+WA-<!z39Z4}@7Gz&$+!v#ooDjZ&^TJ;F>J2)Fz5Uh0BbV4-tFad`wuki(?Q0It;M z)nSR%hk4f#O<-l60y&^dLY@wIuMi@D10M4vwXBD;;aRgY zNHV$Kz)24ydd`iK$52(ts!z5_%17t<{GZK4V;@|XAejX#AJP!V`1?Ts@G6VxI>Y>k zs;QN46cxp-#Xsz{@ap6t$v$3x_>E-|(f0W_%#vH}@~bwCJQ$$YxRCf2I$2O?UKYMf z2^VO$a7R;bFhg@;$7IMKDh@D=rq9VRr8W9<0b~5D0Kr!DnBX<`HOq-gQ=rC&&l7;| zH6AbH-exL2x!&smQA8tKFcp;?KRP^0A~Rhp4jyYkfDSJgIh8Hs_s)9hoFOZ9b3hRv zCnO||t7spD-JRL6Q&iJx=!7+NC_Fv-%cc@GuGpoNv2H8@dXB|L^!CTY0XYcV9~>QN z?w6UC-3d$=^Q6Q{KpJk~FXN7p=|#Wg`hYK#S_tji6H&Mm`6)DsHeK{kQNQ3t6D;qH z{I>q>&`EZJienMt^GtLUf0A7OY=0lmau&DIQJc#tdl`)In4!*owsvY?D<$_1zQ#MF z1&8?P(rF!IvU!&(+1s$2m1BV@Zq8?^Dxplx%Uy`7J;{Wia zFJKX6I(2MJ?je>ri3{fCC@xXXbb!*miBmT87n zxm<|B5V&khr(_G9N_fw~3tx~Dpi4%~r27mF6i%m+9@NM4pWFrfqmMy89Ep$dy5_(3 zFfnP7O5NtJOsnFyj|g70Tu?i1d}EzzJh;^WRoG=S9z4D{I7^-~e=Q0m9YNmj3}PSZ zh!VP(fnulC?b#-fuoc`$(tke4R|0weR$<#f@ih;UgL3_USpd(hIdI2B&}QoU#up-- zACfocz81H~b|aqwC35sBe-Ldu74I)agnlR}s?W~db*2GAFV3DQK0aKW0=b9BpkmF* z)J`09?qht>eR^B$|66cR(866^T@hCgE!%We^hEpL&HKF0-}NA|EYuhct~53_&ix%3 zQAu`N=&00bE8O4B&*1Y~LM7(Ve?i?8-g&rl#&N_#N3>_EIpDnFydtf32sM3}cnJ+f zq~pG{yz6p6;VtCndB?(vA0;dDt8ss86T*r0F&du7K7^ciC@m@ejD4st-ypUuK=(GB zP&@HjJ7cLO@AOsoLLo(4a0oS=-el5en73Z3xnuygNkz&f`OwLF9w@v`fFbgp0Hhb( zCap8Bb(qfkxyH|M1JP8`crQdlk%u4~_`{KI;GRODr*8LS-}g$DaPa->ug9d8KH~gl zZWwj93EmMTa?>ok(WZ!Izf>8de_0S#pxPEtillRl>(7 zpL3Gc$9aYhG4*(z8G9{FdPTm~5{YEd%VXiGozB&WJSx_~2<+S#7VXn9p)N9|+A8s> zBFaFiw~&)DoOcknq4<~-0Cqlty^hHsOh&c9=zVD6X%#D!^?WqakhMTwATML=PZ;Ov zf|V~|Eqrcr>OX&BB!TTT_WR6ybv`XSLXh);9kF!$H2Y)cs?dz6L*g6X?=WQ1_!RFI zl_hT#L-)Zfc)Aa*XN5EJyAf*Xuy^DnOaH_lDE^PTPk=%^{;**}zV`cGC_GB*oUM{r zDsAhk%@#E^t@|cABHEqR0;Hcp;Z%MX4KReHUoJ%~&rQu*j7rJ4owB*}OaW@^h(LSYx)HBiA(8wt9ThaPW*O z)h6betggV~Ux0JXpzv?zX9vFJXkI4=-RsA@R|-VohRRYE@12p}bY9 znkuoQNsvQ=aF6 za~B#n%qnA;I*EpWLe(2&eO)&4QuQ=3^aBOH+HYA2o__Uy9EARylPwOXUprMql4Y4j z;o%VnET>IqSERE#kcJ$0Xulm^7P_0vavSes2xr+Xb=mHOX> z6A)DOh;88h;`}SO0~z)h6K85RTr-cPq7kkROp`g#^HApdHM7pGyyf1oO zlebkqkDuQJuHAbHRxP-o11Mt2Wz6%am*aQnLoD4a2b_uJ7%NjtQYATk@)>tSM@-(a zWk@E5(> zKLBz12i?Foy$Rpv1gO1#^XBTCo}%8}YXNUv+8VIj^Zg?cpqEqoiqav?Y%mQ-xwr>v zk~RdD8mzz&XAFD7bc~|k^AjVuz|Qis-O7wDe+UmY-=Fr{^~X!um-%yp6(3`*Ca=f^ z^hf-Acn;?ftZFn{J@IH1tDq(w_DKHbtVMJG#$=|&rGIU=kzQtw-^2|=@=|EfeE+x@ zZl8*+JRZ=n9QfQ2y9RIqI2sn|sg3^}b4@1>nU-3s(Qjsv_b@&xiBGpKEu0L{U`H}e zA<3glS;s;W^0EggfbPNo8k91^2SXtEgowKQGEx@+77qk`-=Yx6LO7rTV-kHAwBrfG zrOM>~is@Peo$EVBp@0Z47;gaBgY_lcKsr2?HZF?s8$doCvF?slDU<66dn=@1ULtFWY&eNPgGpk*>N5(go?t z+piyxN{gA_vMIAIx@-LQk13?IR{+C(S8k6JpLWo0wOa4bp6Pf~_Fm>1ACxVA61p_^ z$)$2o-qk&tlTFQe(Qni*XdB$|h4(9uroNA3j#+qRfn!F$mAir81A zI)=DhTg78!r0%KBE>kCuk+5!ZgiXYq(GXUt z#4jXuChdCGRi7h~l|B*&1eB2BWj9dzsWxfE>QE*l;jX6qDV_eK5 z)m=)mdlRn3fBNJ(fU90AQb#36ik&TKm(C0w)SV{4QkdjhZq+y_s#!z%@k3OTT1gsp z9J50Kc>l4BnmV1v!whO`eU4XNK9J4iqFRGv&3V2*l}G-SBJkTjPflxYz0iTF(y=Vo zZ|WWBexTM)_osLg>LDYEZo(HX0;**x&--j>8%?vx%ZC?^2ks2`AAnrJ>%4%uzZzj_ zL&E#q-1Rcj^)1a)M<-*s)v3%kp6C7L`fSx@-HHEkSZ-x1PmG2I6(5Xnw{vx6@A2zu zb$28Q2X3v{aNLTP>ht&Xtt~^SFM_xqytXv=k7v8Z+89>)g)bjXu;?s4T4cuX)b~I= z37&v-3pR2HH8h+khMmAy5IsDSX7ouE4_;L;FbeQxvw@f}fq!eXC5%xy=jbO09T1NO zco>;awXygm&jo=Q)|>$e2%OopuUTHnw|Wk=L0<))2NM&rV66@`!rh@k7%p)xNil2c z9}wK4L{~f@cr!a>(y{L-DFk|&KJVFw>ey{5lc~V+?dgKD*z=jqXbbwk0Y; zbp*zk95^7`76oOPZn$Cc8$YH;A8CD|1+J7Bn8gX-E(dBbBr zJ6Xnn9;xRfq|$`H4uMo37UYlyTWhdn4WE?HrQK1Q#Z!W~5_@{fyVKL9p(rT$q5bF> zhD+``yjb7S?z7eIH#8m6#xv?(%S&t3TUi9?1bsn~n>e~i{C_Tg&gba7+VtT|Lf0pd38^pd3JbL8IoG`e{G{<@Kc8}M$SmL_9c z6>UIb>kswp>{kERse`HWGQk$S@g@4CioHP{OuZx`YaI!3c1~q$i~XVIfcjTCN?u

_&F)JKy7jgGR|e>2fMndQVSDC=Ktj8>sbSidM3+kwmydP~*A~>BiCzkQ?Yr+1yGsxTO*(H?67(&EW3vK`# z7rCPeD2W2(Q78DK4VQr6kN=ksbvD}mlkZP3rH9LkDkqd^izv>Ve149fpCt_I-Z;}O z!QB!LV5o5Q>8|?YU)ydVyh)CU!OR$2s*FS)aYrC|sl>s&8+u=ym>sGrzXJCszFc4$R2FP^#*5 zhsDnEk&y1VS`EorCQN?!f75H5I*>#Ry?v2#SWH=jB~;Xu_B*cFmn!jo|8R~<4ecz( zt{QR+nXx&_8yBu3E*X)nXXj^Gp)9ZLrH-A2bVQA0SD8NTG;@2L<{smI8P@B#gPLd3 zPcBJea4C5VUFOg**d~XB1Sn@Zne-Q&S;+Z_Zuc7qVa^4w_C}2pJMi;9`ZioY(Ve%* z`sR8*UhF4~=7F0;Gv8}mH@iG;KBOo@8nU^^9}0ks*uSYB``X^Wa+$_-;JVdMU@kz} z!K_v&+7xP(9ORf3o3@POxR7Ca+t*A5nin(f)N}-}iYiyeuFtePEWNA%v-Sz?Gfr)~ z1KEejuQ`bLlF+9{K&CXT#0>M!>~u|KXdwYnI>4nr2(eETAu{f`cYor>eNCcB9cq56 zijf&(!5iF&eUOPJ3y&@T+B(Hvw$lTxreMpB1&hNpxk3jK%?SI-BG)dh=gIUUjkopc zmpq-PW~vhh`IS9L6ssfZ?YGRlfw3FA)ZuG!h1E84T6gB2#MJ@+-MN@#?2uqAt36x< z3XU`X?nr9qo65Q!&z3346b})8%i)ula*Kk)S7>yNe2r&9{g}^VyPtqpA_Jw9x@cA~ zQ9qNI_`27J9-_2?wb%#GA9SQb&&0&Jto`!HZF#WkOC!AHo~Eg-UhNE)PRbd=^+Mb} zYrefol(oOx{CE(aW%iN zr1JR*E_(V&(51YefCeU(zgNgMGiN*u861#HTb^28j@MOui`-3L6TEq!TFnp050D8q zKL5f>bAo3?jP2t}M@g;4#Ro16!)P2c{-K5eq`_J$_J>|rFeP8cWw7H#HVg6kx3!)+ z%1n@UPkvF|w`z9kh*kTl-RZvS`kIUhtt#A0g=KAPrj0YvGT(HkCjj?z;Agl^Yx~H| z%YMJ9TqaZ|6w@{&NK6j#rDGnjL8QFuHnOKF6|GtR{Vv*(*R+}}d=x%i-yJvFg3WGkJD=nP*Kd4Q6*sJNqULyj18{2D6ox~n{%F@ z(Xj&4D?f$RhfEKa%~vAHdrv+|^(f@LK*xCdBcIm&DWzVFcNJzkO6GRj^Lu2@6&zmd zU2L1k>MBIs@|sieW4avv!iPCsjQ#jFNaqJwyZQ8(V}6Qbp}m>;*R>F)P(TP@a6)k7 zT1JKI#BmIyZgzZ7y)j^wc3i>eYK_ci&_&MiO$D%y-WY`dte7^{eJEJ-+!wx1!FbVD z)XtV{iwZjzWWyVTU_JetTC9Ms)@3gMNCIRo)I?y(u{_0VP$IL?!EY&Fle9aZpsQVP zy!PJG6>v_RVN8S$K@u!OMMBS~?oqD??`~$C0s{QkkF)dZQ{FQbfBm*AOADtFMLch% zSImG7$$wR+V zTGV2YVY6zBcL}31RgxIi{LWI01rE1`{c2ncR)ZeA5ztv$|E>oKoWQPnUC8brKd$Cz1u)*_1A0mkiVM|y=2 zwH~A2P}PmMp)H{&+xGlLLlg;B$+e$%l!nVPru_|Rc5<=|)WW6Z`$^#@Hjx?!g=p+i z7`&_0Sf$aq_SCv=!b{`Tn1@=2(qzUeaIuijLmf|F(obOA63!9xwPX=pu|Udf->v*F zmpau4_z%Ld%!7Um=GWccp(M*ThtrF7%O(^OU$; zV-)l}?$Wva!D;XOuvz=`$f(DOH1-RR+xaA!+wCg<`DR9L%sR3w(Xi_I{yge8dl>Od ze;D2=7a(K>Wh(_$e|-{?{X!Dz^1IXElKO#&5`i<=PTwE-8imp)>efxO@u~9cEcvb{ zyMthUao$4UG(GB^Oz(5;io0SomH=uf7?xTK<>s~}=goUQCwC+z>kb9ld;*I{Q|5vC`lggx8|EUPq|+Y@BrSN-)pDTiDE@HwITTeZZdp>Io2X z-fkjRnk4T}2pM5uVOFpU5K_x`!o#!@s}x)wjK`Z>ETM$`+uy?A#VF_-ip>W}5?n$3 zR*Ijex|(EwQvu%B;mT}|LWa2jmZxSU&}7`HMjLv`B$Sn;I;9=6m&#%N^&$L{p+sl# zj<-;Hv%~iIbItv|**lI*<+XyC_cjndH|`EC;&Ppy?Llm}wqDw%=6k7 z+*#F0A@til*dw*XA`cQ2!Zo!IHVd6zr-C6>R)H7$k^Ljxr774h#Yl%I45kqiT37C< zC7+s#KnQ(7ygKBYWZzL4!B=da?)F?1dL`iB(LV*@e1Hisrc?@+N7NLD#Y_3#U3vHx zK1=emN$J7pHAXM8U^c}c2drM%Pq~_KEPh%D&4JT62V*N5<4=*ZcO4IrZbSt6J}gfg zRfiupVD&dROk@RqiQyBk%9b*jkb{!S%GzEh1nqo|DqGTUYWb)|7O_DwWc}YCRd=&X z@9O&iZ}|wk9)svYW4t@Q%y+OIGE^aMw&zPO=a;^D!mGdr{-Cdmoz9WJ=uFWr;3 zDHcZai-}hmeMz-fnpc13{E`FENX#AeI3VM_8sThbWD3x4vk2oSgO-9tG z12-ENPC#XqkjXcVqda{%V^jQU%rjAKiVRQ#^h1KC5MB#+O27H$#^WWWIQh6c{~hRd z8A4J5*B*SYG?F09e)QcGDJHI(p^@QE-?V)&BZ05mEf1hzd&byBgw=}SPDHh4RgPdVDyM)?b1)J?LVmD=$`>9 zj!5)=d?0H~i5mpMqU_)|fV{u6@Rkd+@Uv{Q3v3|f+W>w@cSjDZ3#vkmjBg7lksi+# z$wo!;?KRnz4DA=Iqmg>X0Y9!7bdn4s~@dd&tMSUpJkvX5M~LX(gclIrXc&MrQ2n z27?9d!{7H~&T2+f{kEZa9RdQRjK;dMLCe7fEkle(<`ZFyim#M)u^f`m=#W%EtKs$+ z0>yQTD9m&=hCWIV(^d{S0)SKbIRKa9j^rfj1CWJTs(7;zXzWJ|fUV%4MLsRVu@N7~ zS_FDU?sGA5!g|O26ChJUvbKuMd9~B_rL03lmzajsn0zwv+0-?3>B0S;S7QK05pBtU zXeA&;g7wiaH-L?U+l-As!DEE5L`E3%!mLH*5PdA7xWEE>-ncZ}CXA^-eiK=aOy-CF z_vI%o%yn3jO!N@a>h{En*iCKaIO#BqGV=7bSjeYQQ4n)VP&-}j;BQpyL-yED_*#CE z>|Ww`%w_HE!OX{`Xj6J`6k7mqsM1UzSoF5ak_Kj%!Syqtb_m7tTEUUowx<8V3P9XQ z%5*%?gRW7}a;uT=kM`4Tg_PB*UB2f5USdOU$?h(qU@QiLeHMkmA!2p*PM^eVAWtlHmf|5CDj zQL({oK+I#>YCN;Iq;!Oa;7+kAhOexD_Qlz_!f0T;jzd@yCe^E zG#>YEFj|T6`m#xgi%suc8)fgcv;#Bca)SL(5C{_>fd1W^83appuRbum_VwF0^ZBh6 zGisv&(bGmigZOitsd%xyrKP`Y_;++r|xChP_OC(1GA{@QyEO!11sMrxNm*Z_@l$A((QZ!efnRu>^!XrL%CY`_9a0@yQ_c%4=W09onzPbH%7bL&HE9~VheYycezVEC zKkZh0j}8N+S|k=PZnh}8`n_CjRK+zSp`D73vgz^z#W^!SkPh1{iM|oXXZ+off6XYa zVSX69WpA7V9deLd>&K@1Bjb}~1(8OaMXZKDOBm3V#s}Rex@=_x2KrHJSQ_1+a1-)q zk7kB>%VdT4BQfZVBN%Q^j{Ty+3u09`FpU}fGk6_YZf>N^PhL63aghg=DZPnCOix{h zVu1=`#JuCJW-j(?Hhw)6r}nWpoZ~mpBS6~^+z%4_g1WQoefY0qTCD~SiZPC+gPZLv zvXjyu3oEoTs&jZ{gk@YS7@@zAkRdE+KG?H}V^znP&a5HBO;bFRMhslS2G#27pE>o*Ym9gF)h^WjLVfCuroc{>>pktKE-mYN0 zTA~2gd3(?rF>T+EkIVY%A+KDf%+q~|Anh+xQ&y(`tX<=MEZqcN#@vmHmJ>vH?aROR z++)w2;%SN@7>*O94V_=-EfGjp9cFd|*+s$f3=~F=c?ar~4C6oO#ykrx$|Zf*Lp~pp zoSAVzy6QF8=xLBtHvX=1zB1DfuMuQNB?aQB7VJbc76G3HOX)=DIMrA@ou8AyB_9tB zmb=`@03?#3h8hk4HD^tQg{Lq>BLL$Ke@Z?s|Hm9>a!0YS!DwO<+~WRq{Af^3Eu`I zKA7bKzlBKQ=8Y$BVAUM>KKWJQ=-Jlp4WzG{-W9E+BhTnC2nb4B`0WY#J>k1`RCgU@ z9yp#bRA;(j9yedOzQ4&kkZXHcl4SD0CHDJj%?+Al?4jNLADVTo=M<y`67z~b#T1z8hI^YFg8hk}FmetB5TNqJ6rq(v}<#=N)U2lI{22^iQX3`eD!ztr&O%y<7$3s zg>rnDDt40jxw}$X>AjBQ{fIEJ~HTe3@oY>z!I_J}`57P^T zFOUtJBYu;D;YbG&(XwUgSEx}YGI+V^pN6fOD+;ksgbe%2l$>mvoNT&Ewyodg!JjHG z1(n;-t)Fze?$GtQ$ZGH+piGe{7&H5 zNc`_^+v|oB!r#R0<$}grJPQ=6j-646r)Qvzkstw*{l_x+Kyh2cvoBRfFkyz4XGdqw z=kORf7bM|gqFV}`oT_-|6tG1zrK%yl9MpbsS)N<0V=gAxpM^dc5xt!xEj^>=r|msl z_SLGtJ*_s&O;+|}bm6q8sUNiwq7DIIyW-|- z0g1EzU*I(Ue_d|>+ierT)v^UhGf#%CZF;*jbPO+jH%*eZ)#JSqg&Gu>PG(<2YTsUI zxIXio!EreoXeW+MJu4k41ARfw$Y7p~uI*uy>Lf@fb}mZ$-14(QicMR`q~anQb9Lw; z`T6kDW#w=H$yysg!T@3jp@ne%P?>GPQk!UbixIrfLt8_q7jIqG*4VeNwI4l@78;vP zv^eXP<9FugzKtPiGBWCTek{szneaJ7s;tc)#f)-oY`Qb|AtA8euhMh=eq_@-z;(Qx zo{5H+`nk>F>5aerDyy6bkofZKb1hbxn=F#&I4`fuyiteX^7JG+&qN;U<9@GlKce?o zwflfrnrDyc<+lIOcIK`X*S4^9&^T{t$9>$`>d%d)?l+~C)xIC8%W*ia+jih=v$SVE zQo0hx|4stKRnYpc?^{zrYxl0Xwubpv5oNM0?1Pld2_7=OmWL9L*F5&ssjwpL-`+JI zmyb5Tk#8$?x3kIqJlWjuk(`n7KOKUYVmN;@>3C{U5B%O#f8U(i6DS05JI_Zzk4|Sv@^by9tJC6}S#8UtQ zxgqK;Wf=}<_CdNjf<5dT2t;Af__036uK&<0)6!B7LhF=SZH#3%_}N$C@Jw}tC32sq zGlNmb^a8w{{y(PP`91D0{PvzqCbn%`jT)=5t;R{)sIilYZMHEQJB>AIY}>Z&C!g;* z=Q-!vf57}Q*M9H&Uaz&*O<7CW@6`fd=p}T_&S<$EG${6e=N@F358csk>1XXob+9A3 z7F6sJp!*pu7~x`jYsHeNM)VE@6$$85{0yggFO6VB@9*?Don~QwE*h-(WQITkR3b=p zv>P-)!}xE@On_L!j|geu>jEj~-%g<*U$JNDsuEzp*dW%=FBR^j{2exz&&Co7$3)rF zUp=RNJSAi`rV-BeUDw8rS^ZryX6-MybUik3fDpiiMMXHSx_Xj=@Vk3ltQtfCB(~y9 zv$uJe!au)+cPr6jawYYHEQLz#!(87F`V2Ip4DVEK93u!*ys?k(m-4eaYd#cK$Z%;b z{c}D#o=Tud32|29Mk<$w@To}U?rF*b*fASw@_`p|p!o$w7=lC3Ei+ncx%ElinHh}H zXY17#KTijR;JHEH3Qf_UVXZ=LW^+E?E_0dR5Me>&L+^K^8g8`?W9=SVo|h9D5L?WZ zueVi7*DZoNvj>SCl`Nqh-5*uJ?u5s;?bqzcuS&mvIJj zz!uU15B#XB^O!U9_@8i^qjE5uf5NvKe+oMYOGt-Uw;TXnYBdbj0kUcl8fYE32?>I2|`4yf>vx%_OKAF*WjPB z`Q&PLOIec5M{0KTPvX7W0UNvrxoG&;YQ}rIa=)`xe@g$hQO#JNp0*YXys+ly8Lmbf z_JC6`e$OH~+s-fg$eYmwoYk0b^&PWRR=Vbo)(_lSg7Cvw5(;ql;CZ@qW)@~_03o5M zCsX5HP8g3FfX+xfBAgSxZ~j7mY6Ys=Z<^RuZjpb#(G-|sEzUUQ#)UW3Pp z$Ys@?T3cE5Z6fEa8_sNR`w;J=jUMs@9uHye_gcxC`Gst*uAEkKp}h=0dsd`f$wL4y(fPzhBLxq5-`Wy~M$1=jyO4Eu zxox(NW z!`**pLn-}x$xNq0;Je97xq$6^y57Fc10W30Nc=;;OOKvO-J82faeEm8H9`Ej+N$gQ zOZI1&5Xa3e9H|Z(UofD@E9fJwY<=1c7p}(OYzQNo0-O`=oqbpY>pk96IUu4R9 zf5Av}(BZvAx2=JVPgdL6rtvrKZwLuiM+nO#PS@Cytebld!>KJUtKiATyCySz&lQPUs_vaBB+97y$3K((%1E8zK(v=!!wd;`|0j~Z!)F@~8=#8zKo;V1gX11%#S zaFeaFr(=zZ&KAUshHp-tJFUWg^zlEpNVVarmfxyD6>L}*#p^bk=h|az>yulni9cJb zk@Y;JIqV56g?7nDe>*J{375Me&=1IW5jyG(}s=&ly=b&wg*Bl!*&)Ix- zD%Mt?K}1(hh<|LucNx8}7k>hT$L3a&kdD9f`Mw@5Mi#Oq8u!2S6`~{j{c#6NV#SdQ zg!_f{bEu((uuw7Wu=vcE<y(al3?*u&Zks!D3drY-x8el%k=C}F% zewU5(F-lQrC))4+f8L${Ge3~=sgQfklf7+{5mpb}9?!4Jv$gMh^?kIsFZw9YJ6p8M zb{Q9WZ+qS~db5B&dN_0IJpPE|I*cI|I(mB`#}>+a_VQbWCi3@-z`sp*uB*olnb z?OcoGx949jl||xg+j_ib{^Cq6UTZ5TrE63p1}j6^_GjS_$pUKBbx?jm`|(^6zD?DW zdt;2tzmdm6{j%ct*Xa1tLvXDgSEa`IZdW5Zo-Nq6j>8ZNSmbk5h^*i4^ke4(w?zt@ z=Y;i;4a7u`cy3N{`(N%Z{thEWxUvm}gojY4UlW+3s{bU{cVKdF1xWRDrqVYHaCS_f z#yr7YV0!PVea8)JOQt>?2E!LJhM4|&VmpHe@P=n1AdyY)|AC0&e#Y2_wuUpTY0sZ` zk)az(eUH+~{Cx!RBk(~K<}-~%=##)3QDaps#`;3m`nxlH{A_v&W+YQ5EB)$S@xbM2 zWtJu#rHjoAR4$p70aa}sy)7YJ#1{=Hpy@qb(XxLgc=DyLVap?PAbv|D?yU{-G~02w zKo*sLX<5x?_{|C(o!sYQ_EHbAZP`#}GCkFm^A{{q=6_ILRtb_@;zNkBq zgEii1U@ncL(4cK_g%;m0WPSpuWYRIOI1JFiXu0$^h$Xl*mxW2W(^liH4Glc}JR~XDP*b{O~dDMV%wZAd4l8g438thOqKaWNhYizM}7i0 z*gGxVaIWdy%#xJ790LEYKbf#bYd+^`qy7BR2oRb$ zm+7Rak(XT4_3EeafBd;YI4En3s5Xhym4z*ihDr9HL!ivh&ulBD{2_p}PrQwc2$G^q zxwTAY1G~f8iU@@fY%$}nE$?k2^pXHR)RnmgS7_zj^-&hyzrLUzisMln7;Cjr6yt;m zNUe20ZliU-<@R_|l;A$wS1$Ba--^wxT5%Y(qJ<@kDvDo)`cU&HI6j<=#?>aI!Y&US z1R9ZN);#f&F_*jb^XoNlR^PKX*3^1~nuRJi?zK+;oM4?WmBRsS7;)J3RCOss9sMs4 zI!Fu7Gxovz5a>ZDh{R8Jq2_H4?YLj3YeHTthS>Bn(ngKX2QLUn5Qae}+=+pv)9#Og zJv*J}&sP$^z@LslJ*tKclQ_F@2vU!W&9Gzf$te^NDE?COowxMtmkBWc5K_eHBOnew zrhco9a(-zVBheo0Ay|Lz;8ya%g-+CMc)GQE-EQ-)Udk7t^iZqk5L0baRsJb6tm2s$ z`AiKub-wSF5ZUL^o=tyIRW&%|oUU8F4$X44B4leWvmHJAqy4Tl`0jX0%8F|;$w z$|jqgnL2$WJ=$@7#5A7`7DoK=&nwnT&EooRnXm=E0w4}Ls^6`_NYbp7x1F^Ls(8eK&c1ibA`nx=$Sl5kx2kO z;L8CvK)QcJk(a#YrvU&{<-1Z|8LON#H%!YHv^@TcO@r~XmuA}eQ-2B%r-nkGFM9u&*IMAF} z_7V)`zkTFe4|UbrWsQWLh+2F5?$2$o?=m-d%9txo%LxV*eHTkbTxW^Lb#w2l*KMr0 z10dlUgp!O?AOt@v&58GEZ{;jn_N+#aW)Hz8$bzMQo}`oK*w>X5La-0WV;GO$)-onJ zz^{0%v$K&y_ywdsoV9k;o85Fi75D!qsFhmavzOA5TJh{vEIjGsje<_}Py+6)*|_Jt zrIS6aM~8N@}e$A0e`cT|4QM=3-!_=dL-X4jh#ejK7RafrQY#Mi~w z0`ql>t(u|)*Rug0nO-`F?z4?bKWecbI+$mAYjiZ-+7Im%_?9gl1D*b1#p264SMql3 zb6%>fB)yNV>iB-w84^+oGx7Pv8}x~rw|-E#Xq-E3J z079)gm1a0<-LWysP)zs9FLWYW;8BH1nlQp9h*k5ocq0t%0qH2nOBJ$fR8^puk+r%| z)hgF{>?^e?J*ogydaEL@54K47i|w|NCu$27QyRHW3ke-nJUrp{i)TpV!WKFBmv;^{ z{qgV)CksWDs;&d7{)Xs(yPS6Z+6XS7<%Wdl9ZMUJ>n@!l`Vl7OMEV?D&3?I$eScAx zFI>=}Nl$l|Bp<6hO~=Dz)|%Sa*~cGzAzW6yOcPb+`hEoS)s6Hq zPS-@&$u{tx`Bm8XO92^lkRc#;YzPKET))ZiS==aAI!zAT%C+FA7bcestZr;h({?S( zeMGidK2@O?Km+n(!As`>oPe>hK)=qq)YeSW%@b)*Eya!=C=40(?uLb-lm$;s_XLn4 zcoS=J!d;UaHR#n<472hVTwe0)UYlsxIw^k4s>h@LEx)51`eKgx14wWHf3)8&=~$(% zf9e1Z7vyyt{ob?R7jM>h7UyJJtnB%#?Nh;d1tP~zG7H;KaPPg@?*RgT$Ujof#-3!z zr8RV)CFj}wBJQYPV9c&@x}pB<6Np2s3j>@e=1>vDt2*8q9XBf%*Ho>nzk7cFychmG!D_s$?3r_d6e=9>xC|n?8-z0G!Q{*pGL@ot9Fo zhydD$B~Ejs!d%`MV3J!#59_2MOF|<>!{p^sD=l-FzJDH~sc5|tj2x)&e7iz0O4*tL znNWj~_YcrelExXfr>l1(e-e1TSVX_ZZ?90Pq)-ZZt$CcA34}^AzQBQCYv Lua+5 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

{qe7^6qxIJ@rVf^E_jn#~M)aAB>4Y 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�^mm6_ihtm^>68_*hTfw zL^!+cr~2Na2nF+;Nu!7onr-DuOVK9}5Q#~Pkb%g(uli!F(G&)R4X<*pAj>{aMKUT# zxI!d@`tzV{k80Kzm;$Evo&g@1n}kX{KGGkv5%Xz5_!Rf6q}$hypa2a<%SguUT*$-E zIj7kr$la3e<^orOw8zAE1uaS@q1ey&*o>&;e%nq-ogfLgZU`?G|JW9);^Tvvl?4!k zGNHYlqPZD4w!!o2qiR1^C`E@>o5i)~;o=vh(4#b{kpb1B{q`ysW*hpU*2EJtkM>|# z(9LYM3)B=zh zgPm7bY75f&ZBG}u0T%Z!;Tsb9)w}bpsbh!#qg|emdk>MDS(X|Uqqxy1gat?0 zrm4Z124gp+NmHxqZo7Z_WB|Tm$6D8L>gP+TSy;;^6Q}~jaVinDYHEL@or1Ocxlk`H z*GiZ`D`$Rled~FRMPm$IHoB2&LkClRMcH=wR)v!Dwb7KpOJbLCJygNh8{djzK28n) zZ0D&HeuVlylLQXNO_YBx+Af5+y*Dc){q1*m$4l%!8vBRht!*HA)ptd` z0>Zs@Atlw`YVENpC7P`C%*xQOd+?DF&6esU%tCX@_|W0DS|Y<>FWs>$=@xI}OSoR( zVM2)CYZn3iO5S%tY@WBYo*ljted%b%f&Y1|kl^BK(m$I3&gfGwURc|amEALTbbsdwpS zubm73+dztIau*d1mRy{VOH7q7cD8Ui+fvffb^`tx16T&ndq2?jV3ndL+Uq)-c4TkL zzo-7%gTb0XasrFeEg$|oTub&NHwI(5*|y26FI5{IRV#zkF=m==yd-AK_Ia#qMe$Q< z1#bh&@%J;gItiPTCfu}TCBBVhiGJnc(F8q!^#t<{U41a@B`&BKezJ*)O2sUl!3aa|OB{_H z3Pr&|CY!|>nX9FdzocII*CEIrB#wfS80qJCCoIA+P-6!^!4yQh?W|cPvQy(Gv3n6f zsa9>JwlYz2g@MiaYO*^WjS7R<3N>@I)PYVF4LJ29B%c(x0`2xd|v5^ z>*Tdy@`|Dq<0lzmw-jymrF6Mxw<3C-0*s)o#VD0v`2ku|3#Fn!X+pYLdOBa5IJI3~ zK@;Yn^nJ>dw*&%OEG{qRUwC64-xHpoTPBq0jZ5UQ>`9}DH#MjF(f`qJi0>~W^6zMB zA1C!Tc6(Rtd&{6t$svp$h}niqpl9*L)1Y-6MG&>0$?Zv-VDh9$^TfJs9aC(9PY7ZGcm`Xxo+B}qwdX${`Zu_AysYn~ $V6!n_`B@Bj}jH%zK8HmB=eM&8p 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�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�{>;}ty`ay%&bzu9SkS1 zx53G6O9$Cvinq1k}>cwo;C|UK|{Z|f^6y9 z2$DK&F_NF)sdm9UmxZpSIZXn~j>C15L#m6b*h-mtbZ;Jyp^pEe{eLm-WC(DK7VTWZ zb?=seLWc`8b{2JmIeqbazl<7vSYdi-XbY9GeW&5{1C1CYCLI(hUJDGnro$J>Hak>jr;= z%KzEQNqv&CsiH%_omMJnXyoRKf9yNbc(YhYOs_zO!OIz}zEJ=$0A0Kb6Yxymm^U8k zC-ab5dl#&yu=n-*3TTZs02`N{fpVLUb`E}`K%ZdW^xf{y_gcRDEMFopyH~twi8qiW zuy8i%N*IFZRqA32r&}HLS*$2^yKmm#xAD#*^2#Fn9e?`r7J#-lYi?y`xX)xoqZ?W9 zb|T5DAbK>UyrO~Zl_cg({*+PU9?hB2S@~nUiH=%vMTHqq03bvbC-|eO$Ph&_7eOMX ziPmcvZZbRSW1iTW>%^noa7d2~hp=Ui7cvFWmrlZyy2*+HKK#Wh-43SH7)(%w%lm2B zEtz!Xrq@cm9*rCE&^_>3os`0mbVv9#54KGT&?H$mR_25+!!^WUB9ZtC*7t9B%Fb}J7B zRX1k8z`&bTj5FR07Ofzli2Zi@5p`5V#lzSQo!qh@2ww4jof^U zZ*Rx+l-YXS8ZWe12Uxofe+N%|cl%U_{|)KpK=4npzT$=TPF;=`k?$3@beb|YgU`m7 zS6x>J)}eR$mpQYSgUOcqI7E<`(S5I43tXyIgHrvA1fIZ zr&tcoc1T2{fb;L@2AZ{-7D!>G1q_ig4G8Y6da6jGvls*J$E`wxilq;3gBLZQKyrI` z0VCs!f9Qo~}0!>QSw{J_1P`&yrWQ%o0i~n*pD4duyKE<>l@BffKEkagkzxS^u~#T z;-IaqV&=lHzJ8dhlDtAnn(gqAG)(lAkKM|~M#-*`&J%^F8AL51UkJah|0cM@*ZsiE zG6bduxMTO!;jB#4Od&dVPWWGheN|MP%eHQi;O@cQU4py2yIUZ^-GjTkyIUiH;O-8= zJ-EBm$nCZFIp?mdeaAgx@bEVejBdJW*8FUiOn)AP94(6xyFsb=B2`-Mahi$df&As` z;2#k3kAE!)UH(?35+YpeeeuR2B8aT>E9g~u`gLMjx7EQIvc|AY*X46Gp%o{wF;}-! z{!)9;^=L*fM#dDC#poFMc24A5HK_5!Sa~44Yk}Ja;y*KLu5ywPK1oDcjOBr)?F?R1@MID2)_20E0sQq+UTo4u3u~{ zczzZsZuJm!Eu!;&TBfp%@L=Z{o2q$~kA8WQ*^RK;Y%A42`8x026j8HDN0n>$w;E#v zo=XM3i%#;nS<&lI@V&>a4|G2q144OBzF~_n&2ogA>KrDl`pd3G7c8hPPfnf1Um;hJ zVpQKJX0q^h6!9>EUulBgla>~%YbU>{J-LvTO|CyCb^7mF0N9ic7}o=qpE(4opJDkg zzQ|3D2ak-TYn>?TfzJFUNM2VS>?_G*RjdP55gOG|tAfdZtkRKkX^vC*eLA&HCGCZF zhJDH3MJlc^Q%ll`qpKB(3=Ok+gF9Vs6N2R%re9Gg8corE|2jpB(^ZD#hYh}nzg$o%F!ja1Nkb+FE)DUEW8H%mSa&vjD)gIH^7F2Ep<`f6Q^N&Z1`GYue$d z4RSaI%nI0mcUuqru3E!CIw~P3FpE2j4_CT>6)txi*x$rL%%>KiB>@4BXp4=V3-@rNlQ8mSVdoB5lp(83zD`x4q0o_lMu9o39ikeEL?4alq74s5 z!xK%Q>>SH=Sy4&Xq!#sqH$MS*_2X}yb$6lk2VPS-FaBMVtsQG~b@+OP~8l&F|(iVRboaKJ1a%#@|COu^a9izC7#sZ>B5vH#6&xAn94 zsaI(OQ;vpFrq4qy{;eyc4!i2_%l5&gX!;1p6DFW=WlY@K7j0hwqPAI;HBS>`Q!z5|=4841EV^j4U; z+1E(TH8`LRuHwf}Y0ypOGE0ytmkhM@5k0%yXE%5av87`lt-3OW{qTNyg6E&U5k&_c%5Tu^L9XytiU*gM~B(3K*;(`;c z_7(kXrcZFvsof2^P`S;{`Wfr}dx@DS>4$Ivbv-rQMUew+G0BL5HUZb5eiK>5g~r-O z#y2Q<5a+;!`~iDr6HH zgl$P@pM$kq;e!X#@FlmhI5brBR)0-(T8X?z@YIKYyt`(8u=~yVQQ%iQyO^iX>~tnX zis#4>GYHoqOI`=GvSBaTj(hAJ91D_OyPh_o34sfXpG`JUMmSj{Wq@yIP+s?Dn+gV~ zPomP_XIu}+bIAb1qLh;32f|^yt{(i}v9J9RT(Q93L6iPP&nYQ_A!Xj0Y*TKpM3o^x>^q2P*^& z=UqOtS(+TokJuJK1!th+24j{{216+hP>7=m(S(sEzufP7$1A1^)Q+K%>LuQ>x{gI| zdN#HHsySKwznveb3yf3vy-zLt%=z8sU)B0@8l{_rEw7gq?h418Hl|V&`r;sm|A*<7 zZgs!Bk`%vVvuv=7DD4{_yecg@z1qxL$egC=a3oR*3wM*f{p%RAFC|#?z#(-wwhR!O zO432wVQF;+3q)zy$>0~#Vigw?Tz7Z&_XJ0txRkFdNX0=~=r6u?Y+dHRDt{;`+SLF{ zgvI>*db??eH0yZ1wS9EDQs`xuTz|GTy~Wp!?#^51y%OB#H?JF}Nw-}dr+X6uSkC|N52ci|~V-h2x@=zE*wuN(7v z_P+q#F?XuutL{W>aD7+f!$Qkqr-`5O9qwI3& zs?v__=>;_P<8;bNlcNJmWE#QpR9JsS5hZyX6)KDOI~%KMM-3cjI5zVSg9EeZXH5`# z$h6BvEatfguHhqq=!DEO^xUha-cRu0hm=&vYC30zwGdN-4d-n z*)Be}f4uZhbAR2EB$717coUd~9>Hov>v{rR%15P)@sW4@e*;(o@ZcDs#lX5NA64rV zs+n7_PyH-|RFvebtUf-tLBgO>sbXcSNLtUtgCY*Anw>9dk6W=8Ntz`EO;_Pcl_ru4 z8alKN_sPGM^7P2A)2S=Gfa|fn;(Hj?)ixmu`ytbLYd=Z`Tc;CNQIK5EWOLtQ49O}c zcbMKzW6vM;a{rE;{@OpJewJH=^K{M)O=8MX$O13q?GJA)_V;}^S093qnCPZLph>aj z8#(d~p4i{7rn=B+X-BtnvLH~$^H@+PtfebQC&cZq7Cgh})Kz=2r4^7P2s7)60CZmD z&^9+w?#42H4yud8%irW0CVF&1x1t)IkXNHm zP8Ps2b;kBn(uVGbLgScLgYnrHggSA*$}E|(8;D4nPvtBuQDZ9)W&UMzf2{d9td7 zoVaI)v9p{BGk4||XkuL1;nkqN5+!G4%moG{se#CcT!j-!3h-Id{q#Tp6<4gijzjim z8p0hudU|Sv4v4@yyr)*4*xW9Ail|t{U_oG_-N5$XXhf1|WKjsR;2SyI90&voj89I9 zALzI7But+Li3le-fhc;`E@o`r{P*3`E~L%(b57ArI97+x+w6t2PsOr}y^ZGrE{2A1 zbdE}$clV((MrF%C+kEyr{tIOOTQKP^6!m+3ZOrMstP^ASau8s!N zqk*GZa3XoYIKW8A)bZkZxVB13(s7@8io)Zq*ZPZK!{?%qnLg88HT#7}N7w8JyF{H3 zcn3s12~OfR$M^ zF7DD-P6AqkL?yT$Z_)|OdVk#c=-s>^@B@kxkz{x)j(kf zMB_bwq0$_1qmM`>=2I<(+%=7L`5IHNL>|(CMzgi?3=HXoJ`jj^-*bPQY%&Pz>H|TX zXZ=dEoiq5ZmpeM;!{A7M*IhqC{j1h_^<)-*KS=*anqE_mq#>IZ*3qxcOBbli!P_cZ@&)8% zYCq-=!(%fAQ|P1PomV#r!Z0vIZ#4%|%t8R0ZLcWH6U?z+zm@Hzd~q=M>Y3tXeS6yXu4dOK#=h0ptwj7x;Cq`itfi^qdKBAqzNu}!aG+~tpT2U>mI zuN2)m?NY$IzEB=heXu9RU0xD}$KCYA(Vm>1Z>?d42GZ5H~dF^aUTzkFfj ziL}QjSx_$b^R#kG4B}Ej!iJmsvP+(!F1!{1e(@SeRwwGVAWbxl+|rb>Qc+88fn+M3 zJy7bhi2>33yERc>j#{h83s@2GoHgX;%+S-4!fn5+WUVdo%WuvJ@7Su)2uAqLqiz)Y z$5+_Y@yV?yRpY`eN3KL#x->e;h-SPx6bE;AdRL|VN90n&!0&9|EdZa|BCQByW#Jt< z>R^;UCacpH&?mCRb6o369Bln^)LLxSyqPyQI1wQp`1AZ`g(VK~e;ls3f9771)lg5C zJq@t+YJ@Y<80cWW7kX%Xqb6km^y>!Xp61@n_xSTun`--Cfh|MBI2kdi(bno18e;2E z+|N{zuQyLE)IqjTQI$4A=Z1Uz{&=P9g3#{6||elHILytmD8x&cV<11kO8c&Z7x0x0Nz5`ioh8pWSs^x7Bxs z>v5MTvtIyyU(jswPn4G6|qmKf3(jTn~N zg3+?YhEa7J$dT-u1Mb@R+b7G5%<>*mFtlBT3cjW;&kzSJb)CX)Aw%NmC4rnRsvfl}NTq2GD z@HJM9F9*(o7V8F%4yp~W{W+HV~Yr@;fqv(SFxU&7->Jk2*h zW_PAq;$Pxe63^09tCFZ6)lQ_q5SJ)3-Ri7I6tGyo>U80|F{(UcA7(jGBGhIbX3A6r z;6!(qb#xn$D#FLda?FQg9OAAnOU~Ue56hb(u4(!oOFOzSEos0^M$whpiagmW+wTsV z7ZOw66I&e-;754aTdh?BTJk-(2m$gFcXbkGUu-GM#>K2)uiS#MAvBl+v42vwm)VVc zMl+a8wSTd7H_sf(P5+yjBJBgD>xM^W{J(gQZV1H>(BP9nG%kX<%K3y4RL}#4>EfPl zo@_JRBtt`2qCn9faG1bQiQcOrq~IY%{P@`-cAlWL8>7X}r5RwT;F~!;G2SPF@Q-FQ z%YoRtBsjG^4!1^San!?J7rBwa88@`G_$sKxlZ=p}I9z6jBAYd~XHg>D&ZD%lqF%bP zr%7mn?N@6eb})x#tWSOSlSA{e6KUAg$) zV~(C3Z><>oQZ+p~rM*KXV-huCr*qC4n;`bN6?j*P6O1G<< zYC|5F0^7SQKbjbII$v+s^ghlBzE{XT8?7pfvB-hW{o&6?Z(yyLi5-3IAXh#vS;|B;dM%gW7mw1-xh z%h%8gA2PW7xr!a4o6E!F6*}R>eQImRy>D)7zUW!vka12DH^w) z?@Kom)>Y9zvM_Vk^2Auhu2oNB_yS`EBer8q;jnxiTX@+y=R-xI@6BJOyPg`Ef?t6T z)OoUt;YpX9&nsUJRTsnEHUuim+5%qD5WTnPrh+;Ms#(%gfdy@Y<1g0K3wNG1h+;EC zV9PMh{ZioFN7(eUoj@T?i&L{+143Y+hdV;-DYDP2=$4`HZDbnx%l24J2n0x%M&CJu zIv{(y{xw!JK+GLJy7?SS`p%A@?9zJViJUyayKv>t!UoV)#c$?!mQc3WD3Bcp zbe18p7Cx`iMUir)JN>gQ`TN@c*R!_{B<-AYS#<|Dy@5fDJ^(rdiXtKBxWuQ8gV=dv zmJ{dM6T0wGN?tzr<-n_8*po4UT=%0JT}1ls$YxFgMVE_4%g$b`VXENkpxfgSyog_^ z&UXA*^AAb|#C3D{doRQBDG&&vDdh6u;3BGgbot?ucntqEY!Uu43XcfeN%W-ti zNOI#~WycLEN?<9@B6ZCCiFd;j8`3;W8=`PM| zzq$T`ZqcJs#77#6Aq<-slt@;D#uHO7!#2?mE7F^_ds*PM=))~wD*mQbwN?STA2xAb zLnEX(Bh#b0f|6p@Z#F7Jh2?$ydh~OR;NMN8?(DFqlP2!$%Z~v0zjTg#VxcQ+a6CLd zJMkp4U_Su)YaMYn~SI`wn;Tan%r@yz$v*lp4G>>s(R%lR7HI- zBEtz}cgM#*r?trw%+b8j&8%@b<6t_{+E`c7_2ls*&^;MRAT_{>S>AFGD5hwpn#PmJ zG= z8u`9|9#k9~J`W1nri(pa-=IRvA?}x_C~cae=^n+`4uillPU!|d>$|#z(0evZAax} zRB68{|D2ubJQ;Qh2o|rFyjS9}nA}?GKMx?gw>|Du381!l_G(^PM}N1KLP=ZP#P{X= z-)xna+NjhFG|Jx<is54uuE#OBo3hMkfrf-j*W3cyzkW5#)&1MpePqQ6CNJ7n2p`}czbj^_SpD0@!~H4 zc9H(!i7QvHwZuCsnYq-PK7*M=PdR%5pXRHqSPu3b-kv$$jD%3P{Z||AeSH>WS7=uu z4{>ekBxb3q=tH8IiJ+fth`7BmG4cje<`oewhMbN+fAYpo)kTlW$Tm4nV$D}^P;*9j z*X!EgeB&HUa%1P@B`T%g(c}Lq!?cYLQ=LRR1P8Q~c{1zh5ZxM?mC0!3;HO_`(L4Fn z%s8x^-(JDWab>P_(2L7xD8Gk~iGeXn`7P3E2!i#E)tPQ>AWJWx}=EFw1*@C%+nEGQL~^Y=L%dE2FZBrm_V@Dn_NB6du{P(`4-g3 zxt|7Fk_81$@MU-ZEov-H9}Pwrp|e`6Smc-aNLXk+X<1py)9xhays&Ykwh3sT*P?2c59*s3 zG^a6pB5+-Ls7Fa1rTmg5_qzwvQl^QJ_si9Pcd)@hq^vb49`J#eLb@SW0*QKQ0wKth z$!leRyW>5Cxp%cG&Ra+^l?n3QKFmbmq#S4lBN%8S%V@u~@(M#iOplx<@@@Vfc&D{+KN9*XF?Vjam%hFYwQ9E> z%|tvZfr`6N7nCckFE$^xl-dugu6|~7HglwatFU-tx%&2Y+(9$9x(yl^{_^=vsb?Q2 z>q1CpolM;AgBQk;-(33#7m=%JiP;Ury5|BLDvmUQ|8O4vp_u-)!vL_v7>1QN@K0io zmmuocsNjpV=xALYPx-7m4Kj!a|Bkf8X}jdOo=drTDshoYCiF z&)XUcx;HXAEAZTo9Ea)yYOHuoA--)1b0P;s!hTntq{XDigR2`=$cIX7PSF~;r7sxB z87c;|5s>F!0sY)ZZ_oOHSN?w-44|ZloRK)U;1bLaw0oSSj?3hO90c~ziiB?CpTbDW zo%e4`WV;vid!V~)koQR%!}UtVgaUbjh36%VsH~f&h&~Y@zkX8?3)B@;w8TwbLRtpo zzG>IRP)UXf3t&A7&k2L*aDB07Vnu6rGd212eNzI2gDa_TCbd?UD9PWb@k|VGqQ9aW zr^w+2>qO;r_Gl&cv=omr(Jt%29}urRZa@=BdQ~rco#kT=15 z#Y)<}8)em$`Vyb2+DO?dgkGnQCQrFoonya5&INroZU!_~MKT1o7~O!3s3tLlq)EH- zJzz5#w>@`Ml%b{u1YPpML8=wzp$YJ*wSJi6&F^35%ey1nyR1RX^7AdfhiCeK3Rksw z;GDGeZcYvVg%#a@!~BL3{)BA-OE3+}XDiKUf@mi%-W76UN4s~`SSN6b)%4|-%Z=q& zQ)W+%j}a$uQiWKN0VnlYUgh?1^^>%AJrPJM13fXLry_(#s`P zS35=b6zt2F$T8V^Ost(NHntlcM)Od;+)F~kI4$`C$SHC2k7(iLG3#PKGgHJObYQpb z-+$EmLXk%;Z!Dk%vnM)9i4c3_HOTcizfw6(M?-o=?!vzwmP_sn|63;b$Hw^k%Un|b zkmuGV^A`~Jy9Z3wYU>wd)NjEW9HhduOOHiN(b3g4K?qy}pguicJ#=~97fzRg^Y%** zKMHpPck4uzU+@e)i(iiSlFLncT=qVqjy>Jk8OCmt8Tz~(ojghJy53brK1VWj5Z1^W z>v=h;TB>Z}6)Fz6^y7R7wlyVNHB=~m?j!ns6O5CZ_k=!?iekW2D%!Hp-RLlLaFo7y z)iFuRs9L23aS@I^h5qU?fb4s|=FwO0rJsL($Rl!JR!bm+N-wgHVmTpD9eW7jb9p9#?cP z25<=gKO`3m^BDsCkuB{!{?BgspT$DmL_T43tr$xHBb59pDyO^Y?S7v zihJIcgxJ423NZA?4isX)$Q^JhxJg7vIi*s4r32e6*tSnFansVKraojm^!ASV#}PuX z3e^snQzRyi>H&m_jzQxSlcVv;j#vY>dptRHZIx$V#Bb@g?_kqruq+DMJl zZetFeIeQ!$XNAhskj`5?IPoob2`(=F=!%FFKL~Ge!^$F*_d!Yj&;;B|D8se#q3n_` z;oE?nrQgian2=G;e=Fl}u1eVJK)sr5wflT|efT?m?w9xd1?{?3DIo=9lv1LPsW=VTWKdu>OY4&* zqI^(ZNE`TL7ZSY=7&lT~LW3tJF7n}@`;c5^25H(n$2Otw;ijf(lBDGPd0MSG;mn&b z9HziqN_NeISn5RCpw|-2g2pcZR2(;^Vkqg7|2t#Q3YlQi46;cxSLzYrqQ;Mj_Z5L* z)=x-Vw<~peLN3F@!}Sd>x#Oty{BE>@;Q7u-X-smeudIxPN2QEEl-FD%#;u=>#*z=@ zX)$n?rDF6e^QMnV%*>{gDx{6Tn{Us&UdBFZ=Yj3l)Knkz7>3qW`o7#)$!}~f4^A0j ziVzzUT(B)N(ei1BnXZy9g14+EdE+McrTs-oO$#Fueuw-ybO|bZoR$LYRg~&5 zP6!Aw*5RM9f+w={_C8eix7X23aMzq9rKAQq!se@0#$$TFGSK?lOL^c7y7kSgfdgcJ!E(J-vARYuUCCf*4zLLf=!jjrDVz`EBsn7h#aKOT< z2DP8^;?}JLt)UWT4~IFpDAsdq@;NBXpB7D1Tv96>5>C-3^OqR{tr8*|$}>=|8?e}? z4u{1WT8t8E_-gc6v{EMqUVAJx3P_he?-lPk2rLZadqe3u_NA~RyHFJ|%gf0PUeq2K zA<;ofqe01jGZ=qLuAd#H81DVe_1!K=ZkS4zqn{wM1~oPOK6PQzbBlwS4=pX!YEexy zm}fbUTgQzxg4{hoez2p4w#HgG;PYi^XK_m%;{xP*zia_@6zlv@(T&Xh&EJh@ez2!0 zejnvrWk-kpqH4P#|@$fNn#L1&U0 zTbj#5fHH;?e{)`TO( zDpl27IFjDB&LZPT4I_JR*#;L~eXtT6K@BW7c?5|4B z4qFt|;?&pF`KCut`;yu9s)^Y~b0Fm*Rnva2a2tG3UPd1dVO?e!Q&6|0CJirM^_pq; z?r5njfFo`>;=rf+_@L?gwtgw-dwWsWZLb#WymMUpcGVIIHiLdWjP*sGy|ld!@#!#9 zy-Gt>^;72^i2tpxSF1CyvPy*esIFAj{P7AeNa_1ypKt7dXY|Bfxrh*^@MPr``ugBg zXG=8+{^1HL!9+hl@t`DxRpMr0nCH+dHwVKxy-N zAoA1@lnNx&vAPx~$1*;l?~4|_t=#_YpX)ZQdjb-LpYMK&WbY{{lyl>W7>;~$tn*Ru zJ+~_sQT1y^1ZbP%zn{Io9#9vsl=7fBx}vl{Ub9*BcJkYB%FDd{nkj@9mDhK9T2kSjN z`Dy(J$&pXScZOUPd@R3}#fmV}!>v|mop|1-&sL;*81l+esz&77vVWedo8DN!H)O-M;;}a}9MAVUYHaFV8~4UJCPH|>^L^}mG4 zAbpW|eeD|^Q0=3I{b~QIb0zqzk!f!9i!9W3yrK8A^P#fAhNADA$>Z-p_^qtdj>Sz+ z!xr`6e3?eNzP>``W=I1Hor6vYufDfef_(Kx%A)|Ls%nvK>Pt`cb_47hP<) zGl&6A9@n{ffQ-*io|9u(&%$lb^EIlvn}Ocm1bk`&N3rQfQ#Pn5=)JgnbeKsP9*~vo z3?@69AYZtbBFrq$sI3Zs^8@Wk$_>f98Unc~`4n z9&uD+te@|JL3p#6_}ZCWRIfCK?NLz7EG(7Ma~|7M5WX%o(G9Q0$jD&e;<&!9z61Iq zXqtol3+P@FNrS4W9=*Bey+gw5q^P(`t9bI?e`Z+RWQ;t&P~IXTRJ0AKAeiI`xUjR+ zNdFYeei$7aHCYTv*xqKQ_aZqLW@C&i<^P%-Fh6_D*OR7d(UYD|>asb;Wq-opWsdfB znG<~tAa_D5Je^sje?JUg??IXLdvt?yl~_p*{InpTUAc(Nb&`6_^|18$(?iIFSQC6J zO$qXO>IVS=%mZw!ZA}I#P{PAH>RR;&bN-*@3KV~g z{?K^=@&H_pV=GAan=*sqi!#<`A}sOIwHXd<&PxC#xgu%(T2#j6&1J$JipSeoXz=R^ zT0dTg7bOg~mIYpv$jxCz8QAs%%eQ2$21%B+{6HYYlZ3kZUR_#j3kqkA68*L|<^YL? zV41>6mLjKZhEY6TBU-TR!gievaHW?7bDm&2a7lzUtyIn-7Nm=q_AzWr?50gjG0}#w zQ}!e!;4l#@_@T%Q#~1OMFgzn)p#|NHINbc>!z|@|2*5ba&BVj&g*W`plhtJ}&Vk5= zHmal_XbpcIgTro+t+IjPLi|zu<5u?@f4)YqKQx7yR%KS!c#l9wok1gPJ%a>!g!`UO zO+QZx1u1DyLhk^zSu;86AXa!v+!*G8s)3S8;iX(BT69K3U2H(qu3z#n619qfHY-;Q z-w%cGGUBzXtKczXPfrCAI$2{C(1;Pk2oLqDE{R?${cNwoXkiBNpBb=_L?_?4ZDSp) zvHFU~7R|b<26>QUO2g@UX~TS+f4T)RI&@R^rpPQzuD~T7I2-v!AaYwRdOr6REU@R7 zbnmue${+-L3(mz?0Va{8$R~;N5R=#OW+|mlFYOEbQK->(*;F_p`4y$iOz9-Z!5) zjP-Fk?cChIG@1YTG2(>On{UUH5%^bDh0q=xV}DDp7p(8(D|g|-!eYTO?fOtMS}2TBJ~9=a7T0TQz5?{=nO* zvLu(IG6m?^P@msPy~`qXMulkLU(}VF=!bN3=WL;q#h42VM6;9z(42Z$`fd~;N+2H{ z47R4pE^`n%$t(pwbALkr(EM3EhtFNVqQ$C`t}qd<{)Lvqv&+}e3*oYqcRJ09 z(|7H;ju0bpxi~$lJCd?wj3p3r{aMEqA_g`|lBZYlKmccZp={5i%7+S7CtDD(4f*nv z{$3(K!a7z?YX%!-Hhbi0v>K zAG7^${z)(N*Uk#VKM#rUkwixymZ$abR({mbq(=JN)M=99-MKXCP8iz3Bwq4+2(xom zR8+;GjF^l^iVO#4mD~ywYDs!o@x_El)$IqDNa|b^To(^h(NR+)oiWIxF)d@q5b@)D z6#I1`Wnda=-{JF3BD2!FJpKxHFMA^NF8OZBUgKTNplYWUlA!!4Z-LUOmNEnQ`SaY6 zRrT;s+~l~i)6=XVIgP&FeUXNFN2eRJE;VVGFNR#SUe)?7+Dp<$fzOHHusOs=*T#3^ zQSDk(A_Pd>4i3ZAB3dDX8bF?vzL_C2;8%f3d7`CI#Jk2TE-{r9wNMfHsh2D;2(q1o_TH&;duj}s}+Z!NNlVb$3m#+H^`Zw&Zer%KL)`ADaKwkE5nLc0M* z>{BB~hJ2;`)-|mk?{5($j1zWwbCydJ9(8nd@FV6BO&z4S!xOo;)`qY#qinSkB|`KD)*eqsT16@%Y3|kKLhC2^(EXQ>-q~)Q;z*TCrdyBk&gRKUmqd z)3He0FSg`s1D~Ji!47vcI{_h;%=?25uJX>C3_y)AxuaMAqn?&0f?Io+aO&bR)J^``Sy9GAF|M5k>W!_rdW| z4aKWT684;Nk7{;3|Lc(dz@1Ci^e!FD-WfY6*0na zPJc;$rEK7-CZLN}8UIf`>mSX)UqFlxC65^y?3xUXf<)qaz#<3cto$ zx63VMXsO&p{IG1Repa6J_EuQL;{05HFPE686VZSf+F5NJb+PO*vOze{k8{BO|xFhBimm{+}hWqwXK2D9cfzAxa z%`T8B`au}MZ@abYrKhPTvbw2k$DQ`g8R#zM$ndAk)Lkg&$In+lHYF1lx0YGFS8V?z zV>gc3DiiJB&-Zpc_0F|#g*i%CrX;HA=#kK#XMKu-QRG@wTukCj(`BI@KuwpS%SuV2 zcn7}(1`-(ag-G$19mCSv#GmwiUo|%uJt|qcDyyq$_F>Hpkac^HBM{WsAluK6h@#>QV|sU1~M7}ej@h4pyxU2&Hv z!m{RQO5v4<%=Z|2QWxi}jC4s@1JW=H_TY!4ilT1PN&-Inx>x_8UZN9gSa~B=;^t!C-oV_in2W@VNUK%F z#Y;9h@{0F-x3n8b9%53?7GjlN5Q8HMoM%}G@%Ip4f%i>R+XDg9%EUcFV!3P zdEEbiFoXVgQIf9#a_L~7jJ!@b&Yf)h8&hkEg@7XDEoH+)mhw<|@IY|0=489}eMK-F zrKY;3l$NPZ0S=w966tqHSJ{S5N=pTu^Oco~AZbd`njpTAP>F2;R|VLgG^mkTIBJqX zbz;&0rxo5QOFIF|e56V9O*!JM*YojHZ=Csq!sCh_gS2i}@sFgm6zQ_SxlMF($!>cw zps(0R(}G$Je})iw<~&BqHM>smcaCE&so!3l5Q9tB$?AJ7U>_!HN&KR1qzc%6LNAhh zO+V2)Ig0%$RT(4!!()0dK!O*yYfK1}MlX$Gu4Baz4U4lc)l9xE)3ielZWKMq{%Xhgl`791eATf+R7`)jnp`%z6N_S@S#Q2OwkAdH~hLF)CIv!=o?HjiD{EM~7ra}$4AJSJF?Q@{uGK-_S*|Lj~@6zl{eOrMD%Mj{(&Eze_tEh>GG*Z=? zR&x{S0igmp+J^{r3@x(KO>~PG+3q4zEEq@rtZ$(CvWp^aQ$ml+Q-%nMiK@n)-*`aY zyT}0_42ns{@iG4fl$53flt+TYrQSdz!Ej_*S|RU~vxmN9D<3uK3Ya=_SI4I}w@y@e zk(QJ{OO?zy*$y~*L)Fw6VOY{P!}qfbP^7RUU(J8zDYylvyWO*q^PJ5Mjn%rU z2GRHGRS@p|dB;%fDr&R+QOEsYJ=WwvFklAKt>*4NIK6zCnTaJ5-({y#IpGvEFQ?y3 z(;6qipw7+UadZ|mgb%xKKoJn+`+VRV30zwEIjA;-luo+N@1sm^E-HMs|1+hw<_Ev? z*(P4#b?zNgTM7Srlyybwcc6|tF#CtGomU%=mXw*j3G4WAr^S~q=0!F^AYc4t>E>%- zCK@7WJ@I(G95r>JdYU_RKizR|##gJLfF>#RG5C*0P$$$gcj0(?0!^p8q+CUu^ldB` z?fg1=^Q=bm0h5-%j!LIZ;O`xK^`Y6~B6WQf!^i8{#j}F51u?f+bSk9aN*|wmsa}eX z_1CTIVyi9RcfmKxQ&knmx`1QIy(4#4a+YLF2jkbxr@|Tu-6Tfxf9|V)?(j07nUAot&tk~ENi2|~yw)EIQvgnD35hDTLt8g^`d_r$=R(qopM~fLierq}NKODcGiM zN}6LxvScao(8B{#NtQJ&nivL!WH0MH?Q{@-#E`R4X`3{wmZYdp_QrnDY-w!pRy>Of zOD`1!1AA#(PFx~&@>NP=K*vlBjfT*xZQ%8I%d8N& zBd60z?b2O=EI2bv3TSd-s6co$F=e{*TQ}qCW((EICuiv%tmU)es~v(1f}f*zm&fP-T86g4V#@@*4?VD^(0$>x2oZ2b4$F=F|?a)q+D<6KZGfo)j^6 z2PYr4H^eGge23B=J;;q%!sCQ&ErPiy@oe0K-rZYgkR37dUb4ZIT@mno6A<%LNmrBL z{+OFz*{js*k@s&^`_H7rzZ+>#^DOmp^KfHuK9u!f8UyrD%o+QG?vOL`0%uo39Ob4} zIY%WMXXmFlv-KFURwu%6DNakucLqb zC9_PNfPW*sgU}BOXmF5#ZwU!vO|UVBijiaFgCujjoY4m_3wQvDiz{a)lUA$zfpUqSKDE7m94C|L=;)QH)L z`6E!SjT*#~m0ey9zJJ^j%df2!+hjp8X(2))+TY?CZ|m$tjZnKyt1)R^M*t{7JGSlEuk{|5-KkU6{Sd-tDH>_AtR8SC6sv=#A^bXP? zG${e3OGJ9_T|`7mKrQfC z$-ehqef`#2621|5oQ(?d^K%b4#c-wIuWksQ&3G7S7%;*km@-y$2S6=8G^`i3dg z;i;;j<0PhPLVs{qjtb$0`W!oNP9<-@OFA{s)B?)0W^i>|eg@pmC@JHSW~i0s}LC7N!8#<|2z|Z{x*w@r{!a(rn(9BiyRDVC!z12n`J>?H$2&wGs7P zd8HZXBVKj~8yqiRwpgKku)iZPE;MEJ(7HSR>q)LUBbYlYB4`iE@mawEl8`WHKrjGkW=n{nU2Ke?S0E&Yrb zg>}7KIU9g~5U6!KLrJCQ^Ml|K)&lmRz?PPu%zBaNJyYl~pna$CIlg3+FBVt8*Dg}Y zhi+tcb=1Md4_5Ry-L|uHHk51KbaMH$LkF^B&sE%H*Jl?(8CRp4d;~!Z%kMzE zlSOhp>BEY}^!FSjF;X>z`O(N7m2%J`0JcKVPq zKQ|ZiS(=yy_$tQOx8i}#F0#ca{#;@)z$+tBfR+kZ6Iu8=uL{svLNxHI;?s$au5LKC zD3uWDv|dqLS4NGFS>SJGch8h(d(boIQr39%^3AZfvyoB1{==kYwJTYY)wHA`&%PGY zae{S3vK5%9rCtRr8ds*{Nu9^WGjfp46B?A4&>4n1y?<{8hw5eay`i{ah2>h^ti@q6 zwGdhhJkAUp?CjCza`Oe5%cmEZ(70h{Z#wV8`M`#%)z|0sXL0r6skD>%=nU-{O*u@; z_KF_5jd0tBSmbCC?afvqum1_J>(jFvDG#3%CDW2VS2xFpTL;WKDc957JrZ5z>zhUH zck73ghEPBF;!knoYaW|Zfgov&EW?Ygk8!BEUjEskx3}!W8;REo zBljD1AH34n(f@)~`)c$<)OCQ(3NWrPCZwpw#A$?(YNoHmUSRgfnpFLEOdwT?Nh;@i ze#cHd-$=Gf9D?KL!i~}4q8|hlI8WTib*7|_8w^d*5z2uE4TWlXYRHTTbM95@xHzrU z=~C9jtKZ^UTIg?AM}Nj^eno&eSrxI4i0=6+CiR8y$=*}GqAJ=+DJRyAiCa>9!;G}y zg5{>|dEHH=Z!62{7@oyc9_pv_(zz<8d?K$zDp7!EZ__lxd_lfub;#tQ8`^`~y)Hks z3p3-Z^(FZxAZYpTD&ZZj)KJbyP$Y6VtNc9C8}|iu;WX0CYwAph!zp>` z%odSIiAK&|^G|#s=u1Sl9sO^{B2?_Ekcmcq;M~msNr~%ROwFLlZ!D`UwT3!w)ufq1 zI=N$D6X}o{9x}v_?4JNU1`&<)Hstut+2@f((?7nzb#dYy`@@(MSQ5YRbMk0jrjV+| z@gco>McapGfuY@%N$wr4h#zwWCFyjJX6Wy}m2)tyqb{e|Rz?NUwrS3<=<3VSJ}Nfg zG~(h<<$Z`(Am8xmh)I9{kIziobQS0eCx(i@jfz| zNzSl@@jh`QA2U;Xs3Zj`abi1zK%}qlZbB_L(I=JopjuupH)>MSF@{4>al|_!KjF!M z(p@H&i8t+Bri_8@3@4;^-U*w?!tX!9e5Ovu#f9Z&)Y3*}6jLN#zSP2C_j`rROseB# zW87meLy0}+-I@<7l6t-_#653}DrzU&dC;u!b8T=dc9Qd5QXb=j{3TJ^kkj`vdJD|L z(-A7l(@tYY$=~Cy%2EF-bNwIMWc-u2P%8gPZ6!ZftG$?iOFN-Ru7>nX6b5)ps?-_)h&I^E^xypoAe{XBMOsFD4*T>3>g7WO-Z_mjzHhWe095jm% z+_732baSKDKB&xKS*qR?V;b_TD<@D7~6u+Kl}vP7Mzbq8~B5_1*^qp!!PN8 z|GJ#|JAI^+{QRIGbg!Q8Z??7jyW8^hblttZpIb6oUTYaL419xpjfX(N=_lO zb^BO$K~6X=Lj>Ke*^>W>_2a?iZpsL!9P41%AD2|0WJW8d$;&gc@&{mT!b{CF&g1NT?ArqHtsw#dmXk4dUHoY7<# z#D65_p%Sh*!`SEDyU~-6T-sX_jJw7YiS2MYMtZlNEPY?xJCqCfZAyh=5wjS9|0U}`rO^M9^*^xl|4QqBkV5|}t^ZW6|G!FWe_UHaq|Ki! z`k$5j{sz}$fTPxp-vU;KXE#ersbfz<_^Fa# zIshZBhP~T<`FTsWkWPiYDOU==6Q|sSAosfv8fa|H^!Ve$)|SJYe{5OBovZID-TYfp z{u@@^RL%zy?=V%RmiBgO{ffaXI>xM$QF1M7rTJ=J3Dzy zP7W@`lnQt($V0rB%$;3aq)km*Z2EdQ9{goNR3tSd5U=+1_Ov!HIiJpNMGU4;gT%1i zivwe?$x2Ikg?*=-zFC0%IP}*;yR_jlR!+q$)WDsoa_R_m`sK7g2?8sLGc>W1F;29< z2}8vGDn8f%Ob4Yu^mqG0_@|03f1snd{75QPpJoR3seDbWUhy=Vwv^m*12)A@B;G_#;ANxN>lx0-u6?~k`L~}X0)Mzx!~9f4ApNPG&G5)bCcYDq zGXC1FOXPp+=}(!4JBCR$?;PH8vPst&0HfJx7WMuEf#KeMqbA(KuiO`53VO14BF^OFtt?xiKAFtBp#>UKPz-TO58qqk)YPsVfhaE<#M4E&_* zPW5$lLOODCvSI9qSv3W70{ZU*G;iV*Z(HsnPv_E#cUo~tj!pnO492p66hAk_Wd&u< zq#*nBvu=ie(J?jTLlpQO*BwBZKw@hlDwu@o95c(-+QlK3*cvU&*rFE^vuxeX;=hnh zj3TwVQd3itR|+6+8~j6y`FqjfHrnfYmj&*J{ZE+Z0ECEwT%k4-*~WqIAL9!J_@LhdzkeM5)UpWW|kQFi&a_ec8KQ|f zyQfLcdTr@mBSNBne5MQox%GPt{kY(l`*FvRgT0?BOWiW!;9xY7z>bZby|wu;-M9V` z@5sopp4m_#QT3BEslW5J`!*i+$73rHD-6w>3HhEB@r-_@+Id-b|G-%mhyzYiDNAYB zCgKjPh?>ajsdraOjsNAXxwZKn=OG`2MUwm$Iz%eQHa5Hk`^Yl%-Va27_v`hh}|{h@y~Pb6d+VjMQHH zccwwMykuyfLklG$KBI-J5jm*g5OL)<($8OhF>*7jpl-B$=n~aH|ZNx#I&? zI~HqO>)*r2R!4Zz&Z1)_#QC_CaEnV)9})xY+Tk>3W_x zO`%S)3vPAjl=+?bL?ii)ZY@Wvb&v%>HxhUeB-aKqmk+k)Llm)baJ0!mleHU*I#xH$ zLw!V(m@8{Zp#7J&u_Eb}fs_y613$MQsSgW;M?e6!^Uf_gHbz>?zz0C+Slx#{5RR~E z<5e-x(HXArl@5F->c<>%YMWsnbB$m|j4cNhe=U_0#m!6S1r1i5dsgtGh;=%*) zR?-g#M^7R0jg6txAJw_fSu}r+B4_eVdBwLOId;bK2%X@m&J{}BJZw)MT-)I-+mENz zf1RHH$qSr3KiTLR!L8Qci*~NZrkA0*s_Kzotq?_i@rc&y{A;nMf@{^j@g=EO3XKf% zL7tv`qW2S^Mqvw83;S1AlbyGHlQggTXcuP#VOaPNuq$4@tfoVPnG9x8DfgPcjnti{k&rNT6>vwJjU>1_PA zpY8slFjVe`C>M9@)mmC=DKDe;8sasN@YhD#SqbF@-d@-qFM6(Ins+>z+FUXbcB10h zdHO0RToCz}TO<8CBTnRfPGx*(vmKFUkkLi2f)WdhGvrt}XU~T2<$(9|@;X8B?BUaF z_VslD&!f5{{i8ik?@c=YHfMjE^5xIIro3F-L7dK4xBQ zN5ET1vS@;b7$c^U$*8Sm%50zcN=6O)^Y2+Iw%6x@F{vstBdKMr$Ph0ZDDLzs!F}s|~+rzG%c})0}H(`6Y@mqOEJzgO8qz!}%s7 z{u;_M0ylrOHE-0zV0|OBpSlj$*}~k)u5#xAWAkH5>frhd3>u_UuczPMTt#f?Ui`LB z@Qp$+ACH#hwOQzC7qs zRa8_I!ESY}E16 zC)8x$5W-JX|N9x*4`ca`yDKMN`@C*{$JzT^WP|u#H)w!9mkjE6oT9Kk500^`Kl9bE z@@Cr+h4WhT7LnuT6nAv2xnr*X0M%{=1IyxBK}D$ArTyJ1I!QGje{z4Vo_qLq867 z{moGEv-0{Whh7KaB1p(mZ%RVSnA>z>8UM zIL>Nn-B*zo5EFY+e~v*9ie$^}ef8+EfebsyIuZ3f5wUfZl=P%Q9jKUD zG`^@Q6|78&iaQm*n4N819h2^6;_SrLD-@9n70$Pw{=hZs6cV0DE6?KgJy?w6Eh~^; z+{j1Hd;R?xeyi3CJpKq2`T|o)`g49r8;!f3Qs+WE1R})`YRM6z+zEERL(*<(x2qqb4ycVA_GMXjY z>U5dy<(f+UP)o*nC<^Thy_zt^F)m^~B4um#3;mbKsT0Gap7lBv;TDei*pQK7%Kx#= z@SSe9NB7pw$tRdmo_Uy|cG|jkqW{7ZFtWDY^{oRZFm_L%oV`bshhZiK);el+IAwuK z@nvJRJWmPnr6nrlryjz%I8jxj`iRw6`$dTS6&sf)$iS4k@`0(-wjtwkP-@z+P=tt#I;etPdO zmG|$i>Wc8f^}@ia85Mxwh5K7JJgL6-4+;OVrPNEsqr)F+~ z9`01-x#h{qB)c&7T0;YrXQ4b6hEU75rsH<_6&>NBXzb9))$U%x?nkraqdnzn_d$#s;G#u^W<(_6zJQUu&r11 zqiOjPONw>qvg^$ony95Uct2a0tZCitC(aLd%RTVqKdX}fB5PF&bb*_-uk5@{SbF_j zWj3&x58)GsdKK~Gjc2tt5Xl)NyF`DNuMPaN4TAWJik%CGg#i|`&6t$8TeXg_h_qK`H#~*4=Bc{LcUF5G>#O3PaAl`E9qSs+xW>6|Nza|g; z7=6b|U_r`nMB^RjCL}f;=p~u8C1X&%t~a7Ln!I*cfV{u1Voz6Ur(k$UDbM>EeWn=u z+}aF<#&H%Oj{s;gyN%VG8v{7FMVg;6-HjotewU1|mOia-T#=aSoVCh*<1Px?#HFwG zTIZUC-X~(XfQKdpS=$n)xH$Y?fN4&Gf|Ev6WW44w(JW>J;m|*eKo13oL;0&A!68Mv zIB<*#0>*#gZa!CLp}6#=VNcU5X&MijxZ=jKFKOP0zQ&TOMP@fuB) zjp2nMUTDyYF>XyxctftWU(>Z-5By0*@YU-&;9LId$YSPWL$IheiHezC#!zi zjRb0LWLuA3-x^x=LLWU$qw0f9zT_9whwn<(~eZ_@eT%WR) zxB#ocmi{dS)_oZvU+xImeJ3u_w75GvIbBc*Olw^;T{}H;S~3#FO&`=6#G7eM`PR-P zk%E-iND%i3o5^VKFaSqM#%4;hWdKwvN(C)akme-o^|@)zC43ouTh3@b@h(`aVHuokg&u4_OxNb;$M-gx=cJn?qyyDxtNFV-dWSK zXdaG&+Fa<*Dkk{jiM=Zh*OSV^4kQGwE^hd_bC5b`kBE#J>rWK2e-G zn^TIm@Im-)#l4*#8Lh{mJ^xAo*k9bRodG&t!23x5_Hfi6UV-si7)cvy9VE$kS+EBPIi43QdNP$lSfn3%fqqak`5=$X2Bp}w zpIn@6pv_4Z-1Tehff7h-q23rC$~Vdid;o);G!ft9PVD}b9OeTwTEPtsqlPBeSA1)h z3f7o-_{nbQbJN8-E<_1rnN@N2F&5}$t~g)ILTX^Zj`U}T=Zdr8)HbX&FxHxa=ACnV zDAQv@obQs)T-h;-436oNF$(@%+r)Jd1Fe{k^eGC{O9%d?Px)A}e(dV!lV)@$J~#eIJu&Eb{* zMYP(XE7gkIB{rK%`4G^e;_hw``s!lc&Nu2&Ou@>iI+qljk4@cClyT8MvhErTZ}r1I zk>PpS3|4&@yyEd|bJM$KzVhRvWNMM09KbQ1H@z9@&)=|pH5fUZQn)SJW^Y=r3rsv& zi!f4AxUUzp{myGo(8zDEmIo^Uhxw29R0ahgQE}JyNeMI&BZy{ILl5TP0bmUU=`ud; zypzQGleUt_Be#_ZAsb-Q9v5~alxi@cXfoEO!ic)h@4}0NY2a{7XD-NoVfh3BXfl87XEg|UlWxNnA}&UYqti5HBonbjp= zNhstvBTZ;r-ATS?MW+J=^a6f7wraQDe_8MyP+_#6H(c@y$s5UvW)(edImWHox ziqWpSFbR8#8Q1_VXBZM^!FjK{Y(+=<#e;eO2|u!Wttr zn19AooIXm>`S6wVdPP2GMfKXXw!fus{uY+-uDvc&;PzG*?je*f{Tai8cM@^2FB@iM z*Jx+xqa2tLo2Kl=yBjQK>xMNvabB4U)UZa78bR2Dt?z>p9Tlf{&m9VFj?(*8uXjzmgaH7w5zi2cRW67qu2;SNJ_8edRSG3=S znIH8NdO^q=Xt*i8+Rka~MqLemQ;P+MK@Du7C{!(XiM~%1`>tj?pE0cnw$M6}PXh4d zN^`OBJMcS`0pN|n>niQhKUR2?CZra4jd(8U>ih05aluB9mneNw9O=0K#PgJ23KI4t zh(4abl3UNAWj~HSOc^zK&kVHNzA3`ki3{~B#=IEJl)Ry&2mlPliO+r5hEPAe7ZH~A ziDKsN>IVyj@m5(;#+z?6uka4N0rHj!vj@rQ#`@pZO1^Vlj7!2*bQd-odJRSLoqDoOg>6)wsWxvIHI8WX)<~#k!)JXKMhGf-Yp9hSEYbhr|Tmy*km_WE0suKJ^u3C z_~1a($za74$Z0k%iu1rKOq_=+cI6Q&0I7SA0FniArqzC_uSQezV`L9sThQ9hO2LT= z+jgcGoq}Wzb@{#obN+Hv@MrAjl0^Q^FGkP&OTNEWKxikq8}tm^hM$esoim^9vR~{7 z!lIj}6%a|?(}h9rNo8Q8?gNX#NG*ewfY$gLeH*eL5=%tNvEfSqJghhg~~Xb(OOkL)+ae*ZYg=*d*nsB^cEJwCn`VD zUQliQ4hpJzb0?b9Wu4wyOIHU87C#?qai{Kld8~HMz4(}N>jUSa3si5JfVaKh@zi;8 zfq8art+v5Z&0kw!1iX6h$co1o-Jcw$yOp(Fl}n#5zAN@cZOg{KF>5*`&2tLf=RpY{v4w|E&{&KEIcR$`W}0@8qA+e_e#*ed27*J~}IMjuby1AJNNvr*2(^+r?i z66-8s=stNN!hnSs%WQOrL~MKJdGyfK9CY1&U}a^c@ll%WE9OvW*4x^qC!xR~qts-* zYsHfjuCeDc@RwhI|J7XM?VmkIjpI(HIAJj7f4hRbf`8v8p8&P=tbm|Sv|;m=i{FKD zNal%zdfLYkHUe*L;7B@vT!nH$*`JKvFj%!0654VjNgJB8*Tg`T2$N%aJ>^y^E}HJx ze~5+GQk{4T?Z3`@W3FRq}u zDAHGxsljh^`ib`+#$8t zk5{<;fWs1kwxqt;ujY@@p-XHXQ4w2^$+1m?6*wFL{Jal$-q6c*$mTripcd$-k|RWE z41WF0(^u(!WEp08HLw0$Ee1!&@;)LM-uwxTH?a?*APe>^8S1WIm-pjne=`q8R`;NwzdZAUXL-SLOK}8r z>ZRkymf6~af=5^T*5cn_&JrTiqg#m#eNnLuwI@=4WjO!L75z>+z{@@$sBNZM<7O+$ zeUwMZDis-7at4L6-qVxstVqVGICh)JI8e3GzTYqX0sa*CFyb){6cD%VfQpK0_Da$Q z0)vTr`cl#b?Y~aKUwHXO+Uk!ue3M6G1U))Oo9Xn>DX=Q8 zaB9Kq3e`#FL=vBFG5R_CqVU`}cuPo#FW=GAdh} zn25}EVgfRiuHB*63$2b0Gl;hmw6UDh7f}Acy#VxUEuJrq_IZ=mV{Z=g*^v8e?my2t z!Bx-ko0uB4oTT*qB?z!84S|{DvwmYye2QTwX$-0kmE_u?qCu_ zPES2P0eLl`Z~`gmcZ%VqXMQt0Hlv`XzuMVBWFXz;WdHzPKWL~c$Q}{&?mk#aXEe-O z`B=>j2&u^CwT+qxH6h|tvPCSIU9tpF&?}2OCuTh{zYi=(@@cM8d4Z0@!D+_6eU?t+ z3M?Vvq5cf#>w=y@;KY~1&7laHs7P~xG+PUcO6vPD8R^e@`@OVo^KyC4Y3OPZZ*5U| zz8=n>b9M8qSOSO05gs(l+(W#3aBg=mt%4fi@PIMoEZc=dM|vJ;PVajCtRuT7(r=^g{k=OFo22O<~5Rm+#kN3 z+qqs280^6)gN^$s4;4BP&+zHXbT2C_;9v|JaL&gT+X0;PGDS>IKS?s!Qp>`(?G=I$ zw=u<|Z{YRx7=HQrXlPxkw&=dF)b425uOr{f+OUD_LA=^XZR5NenBS~)n>#U*#4~Sl zbd-|H#>PTv{YHwRwNL@)p0J%?{0bQv2c~6Fs6eIBj8T4SMx+e2ZW+oB1PiHvn3 zbFO-diU41o^uQd$m%<_s)*`)->aUN+kDVgK56t(S%d`4$ z3GmDtRbbdAcHB&xHjDE(j5ti7vK@E>DJs76YbL*E(XP)b+(IHhH%P?u^vkiqw*sJ^ zUQ8s+{S;+fj#MuO3@!-DTUfYoF=LjYy+ml zWo=mZGn*%Yc33o3b~Tqm;c3~!?~}-kW^KN$P{z-wx-Z05|Hv|#!rf1r zg*HPloFvEH?$f0DgcVoff&J3HaG#Gp>(NkIOyGt0xRN2u=*|;&j0u<>wQTii2 zwmpYK-|x7|F{w8Vey@7$u;xU5jb>uB@x#hYdaHwokZ-`ito06bKjX%oprt#fe{o%F4!7T!iLv5^c7 zalYh9{lr+h);M{9sxoSepc!20XmVKUKi{fXk=SOp8FVgstS9&&grxQGD)pu8fq(6N zd*dp&-_u8>+ao%gwRU*b&jIR{gB2`S*n+AyUlmV*qO@=AA(_n zJ6m?5If&1R#8DL?P$Z#7F*m@FE7waW>;xWK^DPPYhDjKQB#ofWXPBuxoEgM+ z-~A#$bue|bgDR44rsC!7KV;i4zirUg`hlBL>i{l#sM_A+@q9+s9~U(wtBhJ%qymjG zRcJ@*Ff1Ix8C-dgx*$WhU&r&gNBijF*%7RBm#S~E(jQ@+ah+i@6QH6mkn2OA%u(^x zwth72o<2>DsaPS#^Sn;Ui+Qxfw@b#uj-O`YT+mnc?}#CsPOT-Y;8p*LMa+f$%|yVy zF_xBC&&m1T{ysL%n)}=5fZBrBoJbf209Kd|r5Y|6ZLLPvALbDo??2qkpy8sz1*?Qg zJAQVIJI3fgpRJLwd*{qU|FEMTk*@rSW6fLn9_FZgFqcM>3fC_yq|^fqzc?<>*=-qH z)#ah>wI>-|a4Dy|{N;XJl3rnPUf&mi~c z(`4|X9LW70E4yJ$BymDTh~c>#zgSvKW=jIJq_n&(jWK+hr+k~!(ENC;1B64ek)!KQ z)N}=edGf@V?&A`e=_>+;4X}9^9+)ZygUJB|kStQJK#fTr99vQRHhk@L(uVNuMSJ(gC^h$vW6t1aIlx(5!8=rW*AAwChrclwS;0(&(7gw{sb#W5jqB?!clo*c4~zE!LY<{V%3AT#Z|x;yZ{5Ci=FvytXjKV53J}vXG)&z& zoq6<@ZJ>^Xk#7eh+G}TS`Gqi_(P;-Zty>-9aHIpr{{vRt5I|xqeg2nHgS3MT5)WH} zbh0GPgw_(dng?%)m3Iv1e2pEaW4AI<@p5T|FA<%7ls+ zj!Puohq@~1^Oj3T&CGgzZ*rV?_;}KTKx^|c$BQ8k&mGGQ@qbKC=q_}Q_}VDxD~_NZkQVB^x?3*HzBY}M^_h@e>UOSbBe7?=D%~SKXbaeg0BI-=fcmDj*P(M zl7#Y@OQq8+ky;Ach(V$b3&Z*TlWt#qF?;aML z3fAhLfMRl+TYs1t@awU>uCBZHB9f@?AJjC$CldpjGw3tavH}bDoG3uUGT_j&H;mZH z3H_bEMjP#!y^VtvP8{B1B=IT+2u>{4_1-9~iQ*9Q=qQThJT57SEv)z&EC#N>15V5` zLz=vQuX2VMkg>AB!Q*o5CxN`@2O@1}JNoav_RcDglZ~8GWNNBxeQ`ogNBh9(f-50N z@N0d=SKusn6-xc?J#d!HuZ_-{qD&YAs*NupKWpI+oW*7G#s$s}L+)srQ)wF5*ys+G z)MdtZO_>}gXbe1O^q;jziUQr|4sp19_ik>(Q2eNRjBF0ywH1=EZkYW@cXtg-I!C&b zSH2dyj@=-ap-N~XwXja5EiThUv2rT^M&fQBd%;qvn#z5s(=%2$XplTxvZpY1e06=A~Lfaguq1v;VW9o&d92ts-K1o8PO)SHd!j5}Lic(kW#l1j;JL$0q z`jVly?Sc#QjV&$|glm!Nk}L1wp|!UYvewp~keYNpsxgHlcgLzFovx3(1KddU&O_Ld z;*bu#3m=PoU4FFyNW(B@*rFpbSdE(u5?e>m=Qg2Bk*2Lc;bwI&L27v8FzMjK=7ERr zALg^y@1%6C!xAe_TQo>9&aKa+!9EyfR~C6BMf!Q8GmvR=M2>_s6HsauQlU|z3>d64 ztxC4h?99$;Z>4r%;I?R9D|Zx~NNUW^J~MW>dZql@9ybg% zGdPvq%m~~$Tw8Ql8QOyth*1@Db90Jn3`R7o>msgqlM8S9odkSXxG9 zrSV51Y|o-Y#9mTElZ}a^tp8d_i2z@1;ZZ~`i04I0O4M`IFlB$ipiYerXg-YiL$}4Z z0ummfwR!mjFV^%OY{|-<^W)858A&QGi$08u-{T?5ckJzIDv!WOHfld%kKlmW$wYKM z!2bX&81$&gmi*5#BMl~P9Bsv5W zfbpF>M>Bwmw=ARS)U6MgIrl3i?B05{6c)EVV>3Q=Vs6Rw@#_v&^`w; zMjk=m&DSiJxK@~bqo{QBbXGL0Av`d0YIgVP%q32pqoAELDT+uEN;xBQa{8ah(1$0XRzq>txVGE|plW_r@ASTI#Q zep}wRds)(fg9 z-azUb4wmVhBi&^Fyp8zN3h^G{kdPsf_Z#jr!7@U^!nl}Tsj6NddWlXsG3L0e?!vU* zNR#&g<2&yYT+2_Lj^~UFnVPo?^__l(m}{m!($;pCe59?uPdn!X-AcAz?m7tWyOfyz zD@FZpR}BGV*>E^`Cb>8I=R1jwq*#c6Vc{pDQiq>KsjQ?PjwZy6Z{41;kohGHFf=K~ z!87py6b_N{8(D;#8!8()WwSt*$n^NII|@f${B4#+x>hbnmVS2$!>upc!O&W7TY#lopm4!h0%Sj`VMT33=VqY(@sp^sO?EMOck6IRJcX5#T7_U^{OE ztQih_OkXPQbWmJ!GdH)`Kw(upLRDEwrLAIt^V&5jz^8ghBy=+_;*K$C$XlOa_UWjI z%=oxSB;3j;31o67G<4$7!z%R&**zT{ox#kZ#-*vj^d9=?ki$EPDu&^;%+vV}w&I>@tMbjTI;Ig)+B zcrKR@xj()EC>i4g<_`%VKntYc#iXz_z;;Vx^ThI0h3-MQ*s=X7~1jj znWI;s@3d2;eJm}kf^q#-1S;VC>l?f%gv+E}Vo8G=54+{S4(!2YopRa1{k`SerH``V zPFJ(mHRC&OD;0gucnrjgQfMJ1r?6C)jC7&5gR2qm6SRoSwzh)gf!(qsK9z9PhKW= zFtw@^hvIxt@$$#l0PYL#n8LH%eSj((nFR+#>Feuc?D`6~*QX=MlKoin8yy{BwYUh^ zXbQoGB4BDB90i5cKIX29z*Xru7mJ4r=iBWss~go^G%_;p0NmWnbjw$+GZ+P~^gvB@ zIm*fslsn#M##FpFR8Zn#*~Lx3V&=Xbwy2yo7hBd*2RPmzVzl^?% z{XNf3WcVYun2lbsCa-XBb5mc5Y3++P>oQisLn=$p@KGL%8|%BpeGrDJD(MAC)SUZWM>Ob8Th<7qh`M9 z@Y{@(=|Ca4Kq2WNQUm!28+G4^csH|5Hyq#F3+Kq{VivY7at7{Q)0^r?@srBKzU0|i zDG>hVyWJJ4)4P3CrT=gy$Spg2!INAgYwsG&@|u}%%;KW-Hua^5(rx|bV7$6I;c`P4 zI$-I&p^UL>CtexaaXgj$5tczg?M60EbT&HH*3K>#-}2f{yI#9z)@XmFm@+GWIN}uG z9T+WHp*`rG|v*c(k`@pUNr73{F5~^=(5Qa?T23?Rkl@ZGAHew4?G1>Rz#_UisTZEF_ z^i}bp!;{(}=>@F%vjQy*--8IR66gdy~U#V;cKsLrlwhw?VvN#N8EyZGUEY5??T zP+2YPGD!#%Y-svAPouxH@LdI)1|N!UYnv}iII96ITG?5LNh?1HB}~&(BGA-7o1&df zaTB|7vEFzvwHWuHN#kG$g8LLSSHVB6IJ}NTB4?wc=Px$BxL(>Rw}a67m^iw{KQnhm z^_o}fETAre@&>C> zoj3{Q;wB!9xmiKji?KRcX=}i(k*uL1r9bZ|BxY;f)Ty*p11_xZxg}WmC@C0e;3quo zcQJUlR>oF>SVhKa_RGpKF`FAHbgEAUQ9VP9 zYYE1e;~#)A*upd=_Sv4&qE{Pl_ZzH;!cVS(YKnf~vWCRiy?OIM-rojffxz!;c-9}R zC{mH!eZTL6bY2SxKn#+BpQNWze}eY&PD~^Yo=w3U z1cQS`yY^nOLGUfd)*M%q%V?4Xf5?L$LrID(c{2EwYD+u7;8;?t>}*&*IMAR0&q42O zSCkX-q#-8#&@R%>*U#JNiD*3=knuRtiqW?JT7#pJuV{6F0+9b)mA|9 z68_6x!-hMXqXWRnZ4xwe492{@=?unyBa`e>)zG;OiHy94VjnyK?s%RDu z_}k#t+L1N)GQn$608^GPhK(N2iYT^f<${_HyxSJH=(W-y&k0pTQ{A4&0D*m*_20?x zAWxy2m`c6_%V&hnixg-ziQ4o=v9SIFc7ejAPS(dw8Cy+u1@*d}_lF}sNP*N(MLN3^ z0Sw_`%1fyU1G;9`v`7Cl?_I@hoW_|}ugbwCJvnf(G@de1fad`YzpIA4duj5f)}!5| zixiUwO#Zg@ffHt$m_$ViQE7{Yqj_a--E!&AaZwuN;bGPIam!~Rq`{b)qn< z%J#Q6^yc17?+EduKoQYd0#Z*!vi3|@f*OVz%8A}+$;zKDj4CvQXb!XX%SlUH4|Nr>qJkaL7;QuCn3i z?-|L)31>Z;%WuppDI&7OK?!rK$8RCC_H8!-R)apH%idm_50m4Y?OKA#jh5u#tC7SEZb49ul0i_>G_ z-$zt#QzeGRg2P;6*WOZ!Ow?@f1)trOwV{?gW~H<~?lilblQjwa z7dbgt--x!hk%fh(Pom-(tIB4T+SPR?(PBp(?XFfqVC~OBBej93Bt-F64DFB$1j|4v znOC?S z+Q#g#sjeQ_jJNWonU&#l0jzB);`XgjLHec^;FtM&bn zQz45=mk!3ae#?s^c8`9tH+=som%ZV5s8EVTiGr~O;_d?raj)}I@U4CDtgiX_)8)PK zy>x+{h?nG32lt&cvJ8Vx!!0Xjd@R=7WzV)lqb^Se;U!>Cv+rzI8X8n~V=zV>!N$>5b z%>KeG8oP!w|9#<}K%^O&6^(gi<$>4gZk}gvzt8u ze-@)@I-5$`nm#el0O!z;#LcvjwWmBb(M#F~s7EzG%0zv4TPQNM$b>5SL0$*w*6Hb9 z_0B0OdOf|CZ*y{Z5b9C4JD#g;o$HIE%ZrbK4sxv+{fv`#n9i}J-Wtjiq>Y{<-< zB5fbNh)=|ytD*Pt=6$A~7wX2%P5|%DO{2&Ru+210B|Ann$t8{aWP|smb6f~mwiZPxab^I78>#!GNnu0`P zQ?PyQ)hZ5B5Z^CVlisOrkg(QKiv`8A68t#7m-Kn)o*(`BoZq<%rQQC%bM`}bsb?$c z-|mL(Q5ZinUPPnY+@A&CoB;YGhWT&s;-|Kkj}FX%xUvd?d*LHFo*ZI&3c;$s;Y+DL zf5r?D^t3R*Rz(@}Gm3i8kG^K)WDWJ}`wom4^E;{IpN-*B><7zH6(%wlSZ(~U@_v*U zg9UDtmI`%Bip#T41MGXGVpVxUOW}%+Ap+UchIeyLWkn*j3}HpN+2hai{p;vZ?z+HHO-yCl2)gdYiP!82myZtBrUte@TJZC7`wmu4 zt8yhU7Bi)b%)o)sfq7>%vEF1gtac_QrV;~Mdjz@lF+9Qj8mi3&tR|8rOGOCUo9>j3 z$ccytu-3Ch*(v9#fL#>YBWOOQ77^Jh^{{-A;?%XAT4V!gM*#L(e74Q0>&6;uHn#>N zvUp!XYRF&`a+yVqOkl_x4w>QfQI*hHfs1v&9lN+qAC9SVq_3?VuOs+X@RBeF?ufcS{R3oidj?Kd(oq_!6y?cV=;m1;DfX02ep@0pqSAk}eu2{<18!Cf}^ zpbTt;IZWh_IzArh~iNqxe%>nn_}vsd;8DE&Y_2 zmzA!wjV7e@NtmgdW?CF*dy(>K`~~!4s!0x(Q?Bydy0&Yu@pi;AXO^m$glvJm%uyVk#}ihjxMTqS8_kl#V`vary3t zw4vE7#ib$prs^w)>rO-wEwp}XQR)JGnLdCW$```v!6)b~mpJt8;o-PrY_n$FSkRo~ zWk{s!BJNo1N|D2+tD-*zLgO|L5fa|+ z4~ZID{hB91kgsm#WYeQd_|l9wl97P)k0h>H=(i2@`>dOgAjN6YYMpLScSqB)yZGl7 zD?3@A4wJGd`A%^&V>3@aFzK2ifdaNp>-NlPMbX=`m`^s!PiKRSeV2v{zB+0wIy@dH zQ)FVwF;Yrmkl*{-3tV02PQR7*W|_xx6qG&BN=+>xQpPW%QlH|W~-3GkMHS-q?D{+TWqt5g@rRu2jp<WP4=DgTov z(PU1kn;q|q1*rl4TPPfX#NIulrg#cbiu_tJhvPr@Z~ zIrQ}}eoKC}W?5FZGq2Ix(Po1F*iJ|~;VV3plQYanOA%<16?YxSUAh%=K3)j4DvV7+xYe04 z`_;(RCt(l-TTUTmvDO^%h`F#}gYqL^w{eM@3Bj|2G312LM2n~T-kB>r{JiVnwdB?l zyU`xYLcPNCiOq4LgMJ4NKS6zTnx16ppU5ejaI(J0$6{mVXHoFY4T}n~MuHP{7xcc&YVtA^da zN&4i6=;hmAquCf3k>qzQ&DH)fI^nc( zyKt$FFA{uJztI!UCN(%aYy~{B9uT;|0up4t2*y!P7AT#o9+Fk^^sF7I|Ek}4-s|ni z$t2ZgtSWmYW%u#ZMqAb4Ti6$#wuCwC>`Ueq&8XzhKWuun&~O(nI*pt()*!UR{|#F? zMxZjXCmvBUbucm#f0*f~d7?-IME9l7do#^rl1=k1Nw z_4eFM6y zKbK~p{Z*3+Gp?N&Ymmt@5^Ir}nJJlco$3u(-It$&m4h|R2YkK%D}boGyT-!WTItzN z3XPDUrd|#hZCkkVF4`MQJ?)c|$$&7nmUV5Vt0S}Oc$tlje2kn}XeXsF9&SQuCo4|J z{s|;OKjHgbnsnoOylN-ZT!Nn;%t;inePZY0Z;xuhkA0X8uvOoc>h#{>mEUuM)F&@3 zY<{EJtD<9ktTl{=4S^URjX^{1>tU<$WbVIBh|PC%ap6cTe^z3}vn6xxJ$-K({wamJ zP$eC)5DzlO+Jug5kSHAk#c!rwd{s|#)|v`y53GPW2vpt4n$xkJ>u$%hse{@LD4!{7 zuYvKZ^-9yHgFV;m73LxUYGNWC{zcKi^X~VN)lJb$Za{q|t;`V0urM}CTDRE^yb22DRe2>q zxVz?4w?TxRCQrBp^F6|%*@fs{fALMQYdmi(BDxW#Q2^!Kcx$GgRQ=Fkl`KbrQr?bVK-(PcMJ@e8j@fM<8AkvO*}+(pEt zI8_|Pjy86kgsBt!#4l=N?9UI5kf#nuX**C~6w2CK-4ouF z<_DKXZHq4&R5fA_PMywyC@J6ENP{!q^WnNoZ<~rnxr!f4Zk}gSymqCI6UT|&wl>XO zW@X^Y25=b2TCVaH6t3xkhVn(RIp)X00Xac!yBmaC?;G^1%xj@`7BpHF>y|61MYlgyoY=L6OyM9{Q&L!7)v0n2|c4z*5j;v3y7A-)IHxzmM$yPSrPtFk+Cs3>h zfPJ6Me})htN`??Wc_}a!w0QHpfh1et$H(@{BZ-}TYs~HrxDA%-r=X;?S_WgyPlpV9 zaJq>nwJ(yaygQkNYEP*ZZY=Bf;B74WIB;B&q<_`3|8ky}|Mf@Um7~v0&teCW8I2>m zas3JW7SJ~y!&S@XO~>~x#4c7aQ>SG*=ZmM-=?7=Rm|z60+LDtmg2PYY++}V`=K_xX zPVL#plMrQqM=I&k7mrZz_)k)3*=qn$+k zgyP2oweBRUhWx&>sZd`m=BK2`k~~xl)i7RcF&7fju)K4&i`M>Aj2h@&jj&r?wHg$t zs;*wD?38z{lV`rS1;TdUrsPS8CG|_+axXbnFW~kOvowoeuC+!C0YMGY1Bi1Z~DmX($b*wqA8Hy zRFUK9)a1)^k%jSQcc{*}_QA1GGVPy&*S}suYiwFXsS9yGITq7he(I4Nx%sTB6xw{c z_>9WI=RZ3_?E4QrZ%m$~3>zr(Z`}BEy1#40Ab~@2&U2Y+{`ux=X&gxvb@c~~+1V=E z`jlh~rYfr6=kmPX!+#oO$_p+5oTLD9+h|K`L0lmvc%mA~Crtd`Q~@8|sH z7v<&uw%&g%$-jXZ8@1Gzb)@-^dG3EYghqetp&tEq-e2>xfbaiJcahd`U|+h^GjO7` znEXhHP8#Q?VKSqenJe>JQMs_rT-=C8F(_WobqrkEy&&ESm6#t5>phz89YgHs>lXK0MBXcX7SM_@oocK)@kLSjqJq9)>KBt2C9dGy zd3y!-;gze`|AwJq?)8U;rD_bz_z~(1Wsm*;w&VSEg161aGFPs~ zv~OmVnfx8Z^Ov{(W7TV<*yDB$VL1C6sPo@WATh(u@b+z|v3tMPlfR1%{$(OpY~YAV zSTfr8Z{o9mnc(5(Jz|OGdG7ip_WS=e))U5FEHNqcvf}?WnsvWP@X&Dkp1yPZ&Hozf zrO;!KTPZ4w_P<86A|J5w!{a8Gko<@L8tWVN zhHsJFcM}ieh02eewXaCUlms+aD{;MPNoC5j1mqZuR5K2qoUsr1ool`AfL9J3KKk=? zo6VWAbZc%dbNm0am`iNsA0%byVa!XAV8Tz{;>ZZ0vW|W-CNo!v@|CWiPycZd?P7B` z31{ljYDo?aMCo(B8Le)mVI~Wz?zlrU^#@D zWdQ%rJ-qbse=sx*BG9Zid2KA1Gh)slQj#%E=;n@F>!o{Lv%|!+<+%VGH?wIB&XgQu zGPtjDL^3Qy>^Ij1|B#pu7RKeZ3`pX*u{zSZcbKIViOV_jv0l@&X*8dPneT4BnI;L`CIQhA^c036sHIV42vT^J2HAS%dHwTKYec zkiYc%X6=IZ*!S{geB`{32CmRXb#Id;Nu|%r^BH*>(~%QR*S-8F7689Sqmi|-;H3!- zaIdl_a0Lh%KmWVLUL{>IrwT!n1_M_KrS-&vZ)p#Ud2sporm)R*EiO%b=a3yYM7+B* zneac@{(n!;&AoRu$2DbV8QG{HvK=Oio;l3dClwzCFD!}a3{iuKyH&Jak>k11Vx!8J zi~x7TpOXJEfap)5c=_W?-~1nj*i=tVJ-sk0etaWuBUNbr=e`qc26I6XR2pb%I;0Mg zl(#m1IyBsN-cXmBl_hZFh75_<u_X4hK>~E?>I} z$WX^&8qJC5%YF^`V^uTqKUEX1;RU18Kc4+^dIqjIR8%#^0WNsV!q){aYEiY`y64Fm z85t+k`!c6fI}F9gQPrer0>R$)gz3MfeGIwwKWl2<0332IEnV%9&SjfVpOjkrIxMiU zZ&=rgc0mEQpj{D&?a;w;U*)2cqOS&`=(R>B+iJ4&c6Iew{{*vvDEwOdP%eZvwJ*4R z`!l(=?8!MLG_UwEjSDTz%*^|;!q5!z$I`LVz}mE^wE{ zfDQfI9~*}K0DELzprD#(zx?ih?uK{vb%8!ND*(w3At863;X>Q-xP?_-Xzh3+i~1&J z1l^3L!{bp#^f0}SyjEA2Sx~T>I*Rn!}aako#3?M}BF?%jJ3yhBmcx*ctmYpv|6N6(-n z8e8`;o`T`c6EW(lH$+lek{yp&;M zhr{nfb1zA;Meo3eHH~t4R~k;yKfdbU{_&@2)( z1}9om28T41mQr>L`ALOa_%#|hxrEI|&$4iFD9TzbESTnF3eULM*#Xb2xY3IV>I4iK z3hl`JkdJHuA~I!8;(O`7=)GD$Hklp!@4ESDpo&)hONq1fyHIuCi@nWTmoFOa6|Rd3{dC~wwg%ok3atuuE^k3mXSf9NV!@`X6hj`_;muG;c=l{S`2yr z7Xz6CRkwqpyhv&T09DGLr1h_ike2dxu8^FOUX+jTKKZpTDPKbA+aGr#Rc&7r!?t%50O(28AedZ>7Ykr41xt~TJXEl0qSFc_4KvUnB{MH{# z;QFcgo#`jcsJ%1p@6XbhuYy!v@xm`K_~LRzcA%N!JQ0cOqg(h+kbnA*YUhPo z{RUZuEa~>9?TVkhb$%4hZ5)I`JW#3us6ct-P$_f|=s~2PJr4}paVh5{2 zLeSU0O;b=AT;`A&BLDnl1!B1SSpsH7t5zfxo7zT1GfFi~`>5Pu(L~If-M^w@Pr&J1 z_2%t}?2u3cudOc@wnY&xW7ZSPEef(0vq9p%iuB=xrIz5in%s!h>J!3L@3ooR%kmRe zc8z=bH*ZC>1<~q<7=yo$PEQk~&elO0VDKzmm|Rs_eDiV{#T-=Mi>>sA5LZI;GOaIW zqI6N%8058@yB@vsuSfp}lN*v;4VCdioDM8lbBjDlZM3wr44D$u+vXCXF? zJsA1*nUaD(y(|f3Ff>xJp}fow4>ym9HBp*`7ZlI>^AQQBbHd{vUh*Ir42fkvi!}0I zW&2ZM7nZ=@2h?w6D1I)OMiK|&sBydd?ncP;wRbJ)+f;6qcWx}SHahQ_t)V7JfK}8} z6NRrmB!`93Xk*n`Mq_Y>PZJ;AqKAWngKnMYiwqV<6*V0)H+?LbhWLbP_t@b-n?fcKuMNz1t3#UXU>|G6K9IyDe4nQhi#~Nr|2f zxaEa9mclk~ns(Sg@m%ry^#&#OhrwWe{@bw9$2H0z?%18crC9^tAx*uLIM z3bGGN8Y%?G=)4Y`rv_uL*`iJtytswL?nA%~?x&;a0$Z)=Ug0OD7vG-8T)Wo7o#R3d z{%)k`0xYjAe;H+yRcNa}eAC=C=4g0SlLFhIOO~b7UN}3ZklC-diGtkYwt)zjvq6outG{yOud8PNCxmc$~;ws5+QQ-a!BTI z!mE5*(r&o%VtQ(dRjk|h-MP*?Zb4pZJbuPk^ah;)y_h=Q*yCFFBTs;#Y5J}#%t|l5 zPuA5;4A3pFZUGh%a;=!+^*VVJA0H1qwW8nSd32SuT|Lf1Ofl?MzChd=(NQ&Ln$1N| zSkg5ImG5jcc1mKYE@AxHf_wY7+QvRWEbF7AjmY{|WM)^(w&@fB@$$k5mHYtEUI-kF zO`L?oxeZbgajQOV??FOt6)T6^EHQoiXukZG<1h}yDJ4jSf&z2^4V|x;mfSZmUfbRSCnGwVT;qAd; zM@O2UVByQBi-+)HH|Uh*g1 z8PA{d50}DMR;>o=Y`@_Ul=sny;*gURLZSVl%v4QT>Ibi7kKN9f;Ia4ry?XOgq8>UD z+ZOt0AmxZ{Tk@U#}fxrkLz*a>j|u!oN@sV$+zxN-dA?e z9~|V7#ce%*M|S3;3rl(M7|3z)EM*_PgToZwsvU3lT1ztffw0-dr$Ct}V+tWq04t}g zZx9$PM+OEcirr{es}bbv4qy&v+i@pXaqxps+G#)EYk8DuDRRP#?OqUb`%z5FFp7CV zXq91nqp|YF=W4r?FH*o=E0rzXH=NH+>0(bu&y(i5)OK zlwPX5RsnRGeESan{*HE##NaPmcinZNhT!Kryd?=nReV(9L_P$yZ)l~b4A7?5kzzsV zfR0-0q9_#RcAzAl!!A~aoW&y zBHek_uSraN6~!U7jqi7+qoS>vQ55^Y(t)J#tQPElljwH)N8*Rbg~+soveR7g3)A}3 zS)TsMp-ruz1@Av?LhSuLbM^YDnf=%0Wbm9RGY@xuGY~)g4U&(vdIcOn&OH|SxwHN~ zMUxf$YPVL2=Bq2E^e$@l(0A@tPMgA!Zp8-QxmxB3UPya|hTDZk&q~_~Lp7Z|k6^is z)uj)(MBL~psa7&|uXYj9Og?+lY z@Tj=7o^r=Y9l>ayuhTyoRpM|4Jehafs^^x{scbH-A zwL=8lXb02e#}~rjtjbImDJq(RO~m&fIx9UEaQhMRURi2x-A!p#H*^S^n?RmlIb`%!JOCn-_ zA;)T3e`&6{AHF;bnBSF*&1PKH=&u0x(YwN#^8);!ar?mV9(6uoe{rTDaC^i7CV4wG zPrY!3%C?FvXF{-^-rOM$U|UDu@flz*aNo`ofCUT+<<52!h9RFy^+UPau5k^48)1R{ z87mA*;XB?V>iJW%9BdHBdigWtoU*bN{Koaq@z=cd!(DgAIG;TR0e$swSh_nc)52pW z8uRir$%MNGC}~Uv;l`ei5VM@AgHi=-oy9K~DRRJ!`Y6{qJH0B%XLqIU@hb|8GT*Az z$;PJ=*b0B)(oM-bGI6WB-VLR-(GP}wdpUrSkTi!KM2&B}{*Y6FEfHwCtYao*Ex;p~ zwYRsIv5t<`WW`)3G`XjzcXbRIx2Fp;76p!!`TRipS~K|0`ko~w8En$-+304O&&`?) z&Mz*61Z)hthO=FHlZrfZuR-kI#CUYIZDDQ%Dk3(?<$ItQ-$n5y6!n@g+i#FkP`xjq zoM-q1FXG!;4-D?#Rn)8b^~zKs+{x`u`86jHOe^-O7l@Qy7Ko>(_1MprFKw0Ej4{VZ zxSg(>{NpY&K3&0*&}buo{qbBf$BqL#HG^Jhkz8;sg)T?GKVl-R#^Y4^cg(gBSefljd*nR0t8tu+7uwl!tF7K&fP^p0v8DnUO$?CG#&WXUtQB5_<8SWxpShxr_ ztc}h(aka0*OspraI~nB0k&X2qBV5sE?r+@0{4To)|H9n<5zMa&d_3AI1vRXVwYdR^|}om)}2WH@btz{!3~jU4%Q}gypF2ny%z&^+}I!5YGJ*< zo+~cSXudA@DLkC*{u?Q!A0CX~@@EgOan@Jn2mw)}p4I%tSyApGLQ5}vDgm?C?6b9?M zZZp$>B}AV-jSqMGZkio{hqarHF&jm(?1!@7>9DGK?Z+A-BE>9*C&Fl*M5^zzTvI93 zmc3~VOS8VEU+(YmQdb@0$7D8wO96>VD|=Rv4;5|YzE4=@?Bf4nX<{|Fle_j35ZmCZ zK%|o)gl%SB6|VtXOujTaoEY!|%h6)478dFOAx;kK=t73c$dd^f-G*t31u`;~!e+ft z-613rR-Wo3-Ny6?VyH^Hh@KfJTZCpI$P?XH4%11Kt-pN>O|Z+67&QYPI+;ETO`4>< zCuc-!JU6GJqegOT#jOfJbUbzu^OCBe2rt;ry|+a>;hJ~1JX>^1|MWCzAqQMmon8^m zbNYEe$m=A?@jK-W(&@5X;X=PUPFs@QTSOmQ+>dJuD}a>w;OZ=<)E-sC~q(c_mvay&6xRv3F?ar5Sy^2NYI4Dr59tHoe)p*)no+ z0!MnO{!OzNUAZ=})c(Rjl zI`I$dT=@Pcah<)eMp0_nyw>&zY~$g)jk0AMCOrhrn7OSj{6G_ z)quuW@4(v0NsajUsWr-42PWZ-Kw~DlwpFLn;%eimm-XEqSDqw&P7OhOj)f6}OTt!H zOQ=^*CwtnFQ%DhrpShNvTWC~lr_@Hj55|v#BM~`LbLc&>QmK>sq-^}8@{>su{p9SXZTR~kleepx7(KN!K>iX&WH7u}gC65koFowaN)bReDA z&4>Yl-WCSVF6EsOgRw@#lkGK53DJo5S#&N!7u&k9)_ptp(V9PI2$pdvRO%1Cd38}v z!7OJs?Q{kUfpTcCOS@5r83)L9&-oqCT`=vht%Ni0)7D@dysuv37woVZw=!Zk=pP;~ z?|g!r9V)9PO^iS;g9M5(qA{NnSLqioZ0om1yew^%&R5n~K@}kt*xszhX=AdhE4^56 zOuk%|c%5Ldt@@7r0w##gF#5Nn&$LD5>sc^3fs^ZDl60d-I5JkkW4UWDR;DH^OOiQW z@V@h0NRsh`fQY~^p) z1l+VDdu*?86<7K;M!D0Q+^~~B!lTUYA)`m*QMX(4b$B!}Yr=4Xj(;x~a3BS_H>B1c z`)TB!@&nOGanS|@+v`m;j6`ysy&&Ub8i8V+&X7Gy%*Nb?P_V&ep}EP8d#bw%@VPkd z3S%%VecY5KF_QdQ7F?QZJ|so3?owXWR@Hb!C0mRb-k(02vAN;9zDgw*KyXC&W^zd$ z(ZhSAx1s~q|L7#Ms!Cim!ki%>%I;|H)GGzYCqhQoSPwBml;<-yG(o(qDgT|-(@GhO zV$a)dDlWcidN&wb89>^%vWP~xFK30@$|LrU&dZjtL#H#g)D3&ykUB!kCn}Tcydk z96gMZB;6ZZlN^%{hJL>1$|&9oEWqm_1gT^xW-a@8E*?xd{_$w@d$u~PZ^s$fW`svK z!BqN6F#$}9?EhpT7Pee)&}tT-SD<$=+~_T~$=NT?2jLSg28Gn1M#1Y#=cSS8nD&TP zHD#Lq8c4dhu@-2tvcEZB6t{$7JXMn ztFK_hLj%<_%BpnnY4|0e^sAfZ;pP~@DD#iA3(H{T19^t|_EhDyE6EiCL~>VCDJ#d2h;yuRm;<)^9bW3nnXn01}v3Cz(*h9I`n3MzP|OYR78 zW3KuX>oQ98Q}c~qSQwtq%^MV1Cv+%#TzznQu(7T*yNQLTcD#OPX$ zd3ysbhlRVjPo+p@*;|R$z45G=eFYyk4@)1br)MgEr!5+>Rf+nJH6K48kM=nzEjgJU z;IZDK6|ClBe2J#sA`f+R+=p(h zsDIm8+p6lVnEW1X?WQN2l3Isw3($X)X|EXUwrcrCQSPym*^lk64bnT2%A-7XAPcM& zD+8>iUYpq){6&me5@dnhc*=v)Uoh=Dv}w5p0ZnCkdQ_yXHnx=b5cor<#C-;?GO z&Xo&TW$mkwn5CsbG;wvAvBXfD(uKhmvh!G2>IQ>sAyH8d1ZFq0B~Ub>LMzo9y?QHW z(}tsrV0$6r~uhLfIt8AtGWApUato!TB(bU@UI5|^Q*vyRg$~n2E+U+lI zhJ`c!Mjl$8lAAgNO2=iZU>eh}yen_ot)!rkgQ>dl*K-x6m3z!?;pbQzPqC#h6&9adhIU6vsy~j4HV2!O?i(^WxB;V<37>>TGcp zIXQGkbgGV&LBG(!@gN#nvi>sEO#A(OZBZT6BWgrV*J!zK(xvKEI8;y46i9r$<J+kC|QL)naf`L5}$RLQH?jDl#;`K5v|-O-4KKGxKFx>xfGIrtC?@KAXF8b+HUy zI_Zm{(b0$L>mlk;$-6r z8;M7gk}NbBoUkV{yu=_Zx%3x7@`o+6(=;t!GvQvPh-S(3mDQCYJ0D7fFBvs4j1sYE zLv6P+nzm53SdrmzD2l2lC;S2m3GxxYHIC3HZ>cxPm!W^Wk0K3@N;+86GX!T>aE~w$ z8))!Rag1B@&%t3u+h;pOmoy>&_V~A{b+-67l|Qu}H9};QvogxrU3n|pHY$l4gh&$C zPCpri?A{a;y0ar6>R|2sikln8Ehc)mFwEB9yVKYUzr_Bs1oEcGCP<3iy^H_54|Mx( z@nK+0S$&B~kZVQ8nD=~~dX3~D=pO42d!|OLlG^#>Y;45xpd{u_it}eT z#tHv*2R1fw)H*9OQjlP4GAIG-heBBB%Xg-uh6m|#o05+l?dt^dH+IK%9Q4V`x$-kU zQg5YV&d)?upj{KZ!$9zW=;!dd>;orowJr07@7`d>m3RC5l|vB_zvSbE6Kwq;rs!Dz zVUT+u*iYnamqc!fO`}gjC0W>y7wBs6%4kAsZw^f7hi%IA(6csqbg8w|<`X~`!{vLZ zO=$;|{lJ^}q5)l32jKx$(^63>4-e-u^K2E3@Q$L0!-#>FYNk%016L;?28r^PHa3mz zsG)4~Jo!}Qp<61xf?!4( z;d(CDbt}c$dq<6@jZAc5E@QVVJ#^DI`_ixVPmi$Q4fh;ljR|h~QbrLi6KY$?gr`B5ti-w!| zcW_cKKHMyXe;cJ;Nvtk4l9aSuTVDPoS|=P`-2N$`giE)cyoDG?E7BdFb~Ynj;^qcA z&Gp+kAbEG{Qo_E7CC|9PSZh${Y?F(VYpwS6Fq;i&{EF;pJGSH9Tv}T6 zlosv9RMEaO?ZP_Zbn;0pzFB#%>J&mzXk(eAU3I1+&}`ZZ)ABj)dS8KNa!iU)#>pY( zV$tsfkRLL*OkUq(WpRC_l3>x^=BqDQvmctCxIj>tIf3#`H!;$9tQknufQfmeS$n@{5Rj4`Y}aOY9uk)6zfx;=*78wO}B z!6;HgC{n!uWKvxip!m|K20siacRvsFw1$p-L@fKvC^Sx3zY8x>ijmyzwL`n7X@y&Z z*|&ABJgpAjs@aLtRJ-Yziz+Ops|e$TO4&%cyl=3cZDGHIuzq*Qn$E!tgfw%%0d?X^ z{Jg}Vjef?pWgfS4NAxf9E$OY~RXd_x*wTEpO`xP`P(u5UjcZ%tScHT-ynuMMLXqoL zE(F)cQ;!TThQ-6XiG^weg-Cgv%C`1vZfDdLGFw4_EWv+CKrp1jN#oY@NuoI-`CYH` zPRCu-)PEK5qn_>S#9g+Ma3R5}vp41iF?G6ulW-j7qGsExM8eK`6?21pASjI*eG)|A zq%0|A$(6lM^{~aNsM0s{Aik}7y?G>&!_eq8IWvc+Em_<`KG>rQ;9U2lJ;e;a0su@{ znv}CG_eiafySb|Fs9W(~VQoks_pJaTX8Bd{_}6#s=_(h}d2 z-Z=YY>wldPM`*J`g6#0YuHcjLSevk|epz6>j#}U9`VAk?H-$qyF8=SIudIRxc}mu= zi6_-QPg^IRVDV+*jDgQQ955vih?V*HGKf*-CE?>^0saZL3A|-beR3L`$m?=CIx(p& zkeH6N2p8T4y5QWNPQKFX-Q{2^4WKFGbpL1EMsk-n@-NM zD#2@k0ZZe<nPtR2q9k{eTHq2RB(oS5f(<< zvak@Y$W2E_K5^G+)-e6kdSW0;!-iagYXv{ESL-Pu-;Dv6`?S_!pIUjyTdmbA(>&Hq zc3g^YEgk@;JClFF&u>Q#k^1BeQ>YdPbfep{``PyzRL*-xw zC~AY+AZ=sAl_1=VL5wG9ZSSZC?`)!D3@L^>&`B?<2;}D<3c9#ep=BXO#z4hj7;_%h z*|;}3!q{hd7psDP7bjoK`b&i6vNhPeDBtV_Cm$<{vTOC4nsQoK$?`G9OmVUcm|1fN zhq7CUyQ_E&V|y8<{)E=z zgbHLTn`(B-n{_?EC^#%*jmz<7>|E*tiUmPsc}>$-&*!JP(h@9uYg)T}k^`IM<>#x$ zK12kLTmIr)Yd#|oAZHX7rwR=*bv%^?T6(C1)B*SzOkMKbsy!+~I%eNJJ3XB%*Hj;L zs}`{AX4PiUckQxoR2O(V_4I7ETCf+gG(A6Cx3ZDv<{>k6qxhz$se8RC=l|pDEu-4d z;&ksC$%q9t%JjK!~g{8KSNUVE>t>>$d8V;cgu8T$hRa;8LU>lww*FY4;# zuFoh&Hpd2M=ufrQ!7X@k2MJn#1AY%H^-W)AOIZvHw#iU(#UJR;MzbES3K*ZJvjJQ0*{RSNOg$9FO>t73g7gw_@-h zhp-EqBvv&7D?XX}tm1%@@t@G(N21MC zfKR9r^-#j;tV`rvIPI1640^mPNGn;a5VS|-YUO2+=^#__mnJ!5Vd)?=zKkP)#8S1`$)=Y=BXw}_)sq~SR`?{uYrZ2ZPDT~+p#ktYo@tf z)pmDxk+`$@aiS)aCL|zcQXn#}<7Q@<4)n)4XMv|f=2f%y4Ns_Zv{(fT9SQxe#+Ee7 zy_=t#JLiBGO2)@WTw7Wyf|s)y>v;!(K%Cbv*M2vbiuh65*xH=mbPE9GeX0}E%=B%| zZVq-z6A%LLu^SSYffpC>8(P%ML~Z>T1`nXe`%!dsAxB8OtG*=-jmO4qeCa@8(ub5$ zeXO6+s*PRx(kG+M5@F2Y>eo5mm{!J(q5Rw7u94V$B?{U)Ykx6}0f3Z!>?Cplt{U`m zyT{1Uy4`Gp>!`FMg*s?6%AiXK43gb{N{uOfnQL_g&j-ToLp*|B&=Yc&RBX zL4L=!x;we8DQ}b->j{z|AB7%iro}}KiX7#td`t2753YUR{=#z782?Vpv0^J0*?u&8 zbc=K>2GWvDjtQJ~2W)6(1P9Oa)b08`-$V@HkHhYoRC7dgFxtlYso+)_KmKL_4(la+ z>pAe;hL9aWO)>2ce}fPE?e{wOe_``iUEi+y@A)7$(AWcBNSKA~ja*mM4mCZWfzsUlRj&2wg`fe7o3!Z#7Y;jYmHQP8@!QG)Vpn2y=zb`g2{tbpC z+*>KVEH%CQYXaz{Zn`!)4Hbzqx@r}Wx9Y|Uh>fn6>W3$1^3#|ir~lm}2jMc-&}0@l zUTPB(*1nMQbhUMBZjkj?LBO&FEtK#4(f!p*fg6j0o`^cBHlk52_2loWr?~nZn|GM! zcQih7kCSrM34x~zn0hOaW7I=2eBq_JYvgV63hPOtr%`03X_=AF`l8oic;dm;dHB6OZ6gOY#l^Vjja9o{LdXr#@NIO%XP<%bH4gii~vv|mb|hr`lGcgzfI+r*bi z*&*(21j)``sDNzf8z5o}9{%GqaTv=DlZV5;!6oHCH7&V}LB6>$5|h(!p8UtJJ(2=h z0mfY}wDhT4B29tALAPQGJ$-oAlpw0EmIgwZVvtd1T?)uPD|L1Wk@!fNZRKPwgteTd zF;<5|r-e)oL;zNVY;0_lOEBuVdo&E@h#9IEKVsDZ0CmS*KQXK!BHrd`sWl9(!t95%elNGad( zSW^AAg(f56NuUDXuCI#UmS? z$K=FCc=Fa^%bdKh8u*Fk`=U9uyFyQKXB8iOTMvtWE;a_~6KeuNmHQy!IAXG^x%{7Ba7?UQlA zxK`Dmm9~UBs8+TNDraXsf+jOF_?LaAhhk-&YS5&`w3dCBeLH-(Gu3{y!D~GK4o})z)DV8l+~1k)zVLwc5HAN5-PrAH~=X zYW3s`Tfy{Xpv;2uCgv?WBG#3XlD)!TtrfNvTwIANG_)k|^>pT65pEcS=I z9tEw=*)fEtu_>(5!n2-ZXQwZ#{f{j=u78%l&eWiYUpKU%H_#}!;?vd|T%EIuvS3`l z9;yI0v}wSx$>AQ&(sEi)@qbBs-F`*6imU;b97d?Huh zNSTJNo>040^f#%5_fhm^b->-xpPL_l?Dpe^Ouw)=@d*o&>7X44x^ISa2QSaf$Gj=8 z!5u}s9!f3d0oGg`HaBbKwb(G-*r;vfa&4kQSf8>i-TG;vrbLXuB=CjV>?>iQc)v2j z_9#A2nZIPma$SdXa$u2MXT4$m%ozLp4RnFU)YY}Y^#V`wH}U>GADE2o3HId|?-t@B z{LfZi@qwx~8F{9%g3=X7hqw74D&eD&Honem$@C8tZBosSe|W<*k2s~PA&NnJ3*Bg3Az z%u%$;c5*bLk%YlnDw7fMh=Y1x@%YLlkcECAIR#v@q1~X@RN!i1v2~E*rJyLR*@!p^ zFHg$aMrJ@G_D3ZQ8auGE~+QwV&=g7 zx%=i{nF!ZTdX(yz@}>6exc2=-J!e${f9kx2jEVX`!x@D08Z!mpM%IK&nSW9^SiRzL zy=`G14ZlS1HoB^eDRN}w)Ew7N-u~z0Y`~r9XTo>W%WQwCvvb8(jl=a1eig7Z$=kIP zktz_aU)(aUy6M{q)V=$)VRBpcClT~`N?^9p3%#Kss&thH z+{parj!sRiogT!HZ@!-{Yo?2dXtFi=7(T*sn)mT)&P&(ojQPW|3!_E{`XSz#Ai*d zYO!YIqXq0F&FPtj@<&~2Y$Ik(Ia-HHq(3T*Irfh9GZD>x#{)kOczEifyBhV}inLr& zWcI!G4#Oq0*K9Vst_$-zE=_y(wM4)p9<~(IX+n6Z9*(W=3Qs)`;cG*M`@1A+!&W)` zU&iO{62#iQ-~S8c{x8Dg|IF)qq~ERH>K=Kvzm3n_h+r9EZQwNUvNZmUJ|?NU7=3VR zFRfBrAZA3puggf9bSmz&QhJj2DmzKdTvrNew()A1)AZz3r0?&^DXj8hYbn>EvO0V% z9&h~X1r@L-IHvxpMMNA2p&$}tEsayx#6PI#4TqxVsTU3w^mOb}{ds0tgp-r+21Gk? zb0L_vbRT%Y$Ftm2&aYDY$fXzWuLMDU|3Z@5@rZ^F%c?5Xm(@eotrbljtlu%zYdTAt zQdHDQQ*Z**HNaAmty#E(%SkDlc4_UtBe&Zv?xdB4Lq);QE(WIh{?MFxi#BhXPiDVsYTJJOV4SG6L@~+b~wMk z=3P84B7{5}mwc|OsQimfk?mh|CKECEd({$p zviP$C8*&NCTLZm>3g|GfrT&r4|Mq!jdxvi29ha0C6nbSZ8DW|0P1DxCv=J)dYxwP5 zy)*JOy2ZJQGdz`ul=NfrN0Ey|L^x@#ukhy#a{4e`bU8)G6GD*=XaDyMjP=&bQ~-dT z0|>kS@c0(1qKs8%e$qqiIU(Z+bzG7Z;~7=?CJI3p5mwgz*j8pQ}C~ z$U6P}4+Wmzb(Skgv2p|J>O$Dgt$vQ=fZLC7;EB=Cx*XiE=$FrojP+Te74jR*$KKWo z%W{oPTXgu`qM|96*F}|m?3Uc=mlBvs36+bZ`52d`C7-r#QIxaczIT1BpU9Bc#q$=Lfz#-*pR=f8zh z|6Z*61w85yunpSJ?Y>azTv2?eZ?b{vLP!5OJp9B}mg38>A$HW(wl`$XaxBv13gcdkAxwjR3el&8%n#8q_;Aqkbabc{5B8h!UDQ*YYQ2W>Yr#N2z|LQG1tp5BfN#Sy%ymyc;i;JR@@JXxq4CzC{ zM_2H>n_SuGk1Av=wi~Uzj0NRg%opxQkq=?Mg>40jAt58;_0OEU-w5BCDSpG^9o<)q zTuhSBpA`5Ze)CK(O;G^Pp}@39A1Qi0T2YDyab<&dNKzn6P=Y=egJhy(mY-1Dl820? zlI6Kl!{#rf(#h=el`v*JpO#xv_-&zJk^8}{u)+HgXUV%gMu{+1LIv-;y-=?A!W0r- zNQr^m8)P?e_SY>gZgDaoa)tb4r~6U~Pnm=9OX3{{4dlG=M1)Vw8kxIh5|8@M2GcM!Dhj=4F#9X{zgfHBY*n5Is!1kZUJWY{x`9}8&skGIz7xDb`4cj z{#v?0eY+^3xjbh#CLf0F0GS>ZN=Jx*!fE=YrvF8I$o#EhiY%J^{dX_m5f>=KW>D-a z3urPNr-2_3HOCEZZ`%+tS1SO|+p{}(TwN993nh~whW;A?_Nm_`umUUC)zZW^H}kl# zb*(|nh9W&~QzI`US9Eq+pTA`u+OMV>x=x>oqny>SWnRboq&+tsYs z3M*}`lW(tubr5RQ_%8SBuksdU@$z(6kM}txaK)7# zIr@MC+DLcEX}Q6al_AZ_4u|3FV<)hwx4k_w+u!sEC9<+#_h_D-%pu4|M}RXmFf?TNtX5~m zlY>1aDZDAB^Qg0?C2pmeqyN|ZVXyDX%2CtvB7+k(j)~3f+YS0~)7YpOW)Ew@+b+Y; znXFa5qSb=|KeS#bibrAfo~zhKH@g%a$WJ@ba+VVchN0sUx*XxT*bg z-oxIA%Rs;f*VM}Cqv^)z`i}p_wHIa+Z#-XcJYO=h8l*w&g)FzW4kvM*jP%{{X!1#79xji0i4%+u+a+Tu{jrDN*QZ?(||8VGJf@3;yjdRqme#`oH0AGIZ+;X zK;8ub+4Me5yA3b99YeqUMIEi*mMX55VcK|ATGn8P^w!Eg-N$C?P1-Wn-W0p)>PC2} z=LdTcWO%-U1Z7e*^lH??;4b}!oVIiHbk0L{L%rl{isV2=Syw%+lYE$cHWs8K3H7;< zQ8KH?xA)G9Cdx$qdc|m_d?v;ynOu92gl|V&`ar*F*Jb>N5(j3`)o?mXTgz{BziO%@ zlRUFP_hN$@xbMq+Skaizyayt-bwf8i>u;^v^AaH4a_@@kXBoAtNY0RR_CsGeme@A6 z)Dhu&Qp@iT4+9K;#+0aJeYge>RFf6R1E82|EmWhSY*fWurh!J2OETCW?P z2oWz|d?_l70S7Hwi|ZV9xTtaffQy7iTQ-fwbz zB3@TDmx`mr22OA!c>lY-Ss&Hov9^3w$V;6)`$?aiBy)M#;(nqtPCzc^c%3px#n=^^ zOhR4-DvM*+PyNPhVIH~CG2NWlJ4^b{nb1F9Hf)6?dhh<=wU)Ma$z>sZzkQW_!^TYV zzCu`=A?B|q#UlJe_Il{s3u=Q7FGEa_@)Dd~hbA+UL(i}1++#T|lBLxctIg*G8abP; zz?+_L2B6PlEKjd86BqozkzbxYi|y;l!%=QR;dup6O`?ye%&=n?wqITDqLDTt6C;DI zt=-|!2Mp}vDuk-c@?BXK0$K(jAXB(w>BHt5C((u0Cpzn6i%+;{fhtuOzfp&~5j#0T zIrBSw+MnlSlGk5}+#XhT(KU1p3z)pSTEQx;%aAIOmc$ zLV4Q-IZxu#(+od{eO;u25Eq|}t(BVUXmXU&l)9~J#{jJ;?PRo}cUl)L zJh3M3GE7q%JhDba-BPv}ws-P`mu(6&PYDr9s>6?r+vC>D>PFU>IWr^mvMu9ZK{fjc z$(UJ2w!Zz&$w;J3B{t60H&plEffREcI^cV`I2XrCrD*sqYgq{IvDzZN`68YuCiaX8 zcZql~ zhD!b$BZ)+-+f~LR(~|YEbR}y8MhaC`73MeU>zoisxl6>Gw&%FdDTG@Xmp*46sd&x$ zbQBoelZ@%?|ID&k1SGlw67qEY^NH;#rC+t&Nng|hOzF!{PBWXhYg#tpl+Z7I`9j$I z884_P&jjbnVF6^0d-Z1Jek}=MZRdNTePbgrwvSgnDy&Bb-ZAaXPazA^IbNnFedev;0sl zl7xnPN+IAN)(}B2A7^JhTPD?SG@0lNQA0y>1KTsCUTT=aSAY!faEj|a6xPeZRVo__ zZ4viy;Vv|Dp-BZ>EUwHafVi#$Y#=*0n+ zeVnA&qPJ0x7q=(NPm8L(RqT_$@hG}aGUXYpvw$^(B)ZG;1!U}xHb4IP&&|;PxJ&+q zF|idgcF`Qk;g9Gq-S`^?^LrF|D&&_(qqIOTYCj$87Zr;$#cm@mEdCDuy$>s>U4gZ- z{)aMX;w+fAyd_>$(f5@6jC_qo6?hR$UHrOwyF?aYFEA(&a2E0>>31XQ4BI(sx$TZE zo}DI+l_hw|5HWR)o+!RLC4U+nMgJukjW`sr>9{4kfuSaZ<+$egR`ebHUo3zxMg*qP zzBhKCK{;8s%QXU`N{CRKmt}yeQe!E4%~Sd;Azz{JQo6fu>*WW&CvB9#CP=l3b3$S0 z#Q>y2fF?6t0h7zB<2WF3GkB+VI;{H_>;dP6nQjdXr)-49ePZq5^wLbydm#q4ilY@l zq(cPGSVvWc-D4s4HgWM@Y;}@hRx@<?OL|G~}b-sBJbf(8>A&bUiHz-xV$t{mk1hvq2G{ zGNxp&qWLe=a*+{&s@Bfl%-6Dy&3yQEnD)-2Bc0uA1bpPKkHVGeYTfKF3#EEFe)Gns zM`VobStT%Sg+ClL4<+tbgQI1XC%>9~@#ey$0+F!^Jqo_kn!Jjl#VYGuYPJN85WZ=R zTvEMhKgE$k!)_pYx4OSwXR<%)yE+DzDWPh61;qZNf3r#^|Jd_!7K{V;=EHD#CBltt z*#Ff4i{k(7FG&P`;QBYxbNmLc<@B-$q$4OaS*44o^i>gKlX?aTHzfHXf&wtS93H)^|C!%@tMq zo;o(hb107-ecqztRxXdm=8w&Na;M`q&Bb5o6;x1#;-~PojMj=)C8SPx;wUJMTSO%H zx;9T$k?mqJVIny0096ePOq;jc|)jN=qfYb4mUg8G&D*7~{eC$YDj^ zW$N2t`fNvMw-!UA3G4ZGBA=KXql@rr&zZ}EoLAJ&zkqJzm;X6%`;Yz8u{YtAw5?0j zc2;44EbOrLdLqg%Ew=mi^3Y5`;yGMMm3pSW8Y_N2u=O1vKIf<2KjOi6$<7`I^f9H% z%K}0kxNX(U>+H6A2fSkpFqLaYlr3fKou3K@fWhFLFk1mMy`L_TQe;J4s|B4^ZG$)2 zt{}Co`f~}OFG0X#&oc@;THUApx$OKipGpwo7zr4$zQ_F>8VmK6Q-tQ-s)1N!g4 z%*L$@1De^Vz^f*>oSyCtaG?Qe2I8@HI^RkDVMe}5M<3zLtW&H?)3de#VXpqN8rDH+ zU_e7Y@Qc->lu#Y4;x*vNju%%$CKM% z126*m4DU$bv6-3GrRi5W$nNYayR$)I6WI9AEpdl^KJMo8?k9VrC_wpl-Ty^{)OGNP zt;|9F-B zq}i4uYwM(g@$fa%U<&<7oE?AkLYcds$udp>%cgI6wN9}M0ySY_Ig9DsXk?(1%5g;# zm0U7T!cG96PYuThTc{&@7Ut*VoxZ9D1cuOo0+2qAy!>;F{I6amS{pBQup~XTqE@W` zKFA)hUczqQ?^z`$yW!(^B&WZ*;yb%?RPt~BP9Kk{TB??;5#mEq4T`o1w>Gz+r(k*+ z=Mw%cN(Hia6(DQ+mW8|cfu?j~;qGFa=dm`$iog7?H~MI_TQ}O;UtygpQYoT(#&Sn) zE=h;ES;|?w&a8<=U-B3SaoQH?8U7A183;<$fokh=^!9tDQ>-_lzas`@st4&*3 zcPB}>)04fzXam{Y>KeywCblA8y0EfqFVBv+M9{Ow)hL=7`Zvgz6;;*paTC6G&J_qn zCt@wWxX7xuVOa`N4C9f}dvaU~Ux`~^Q&d48aNr7i%5}#;LPiWT4}6vlI_cXT`7>v2}@+B}G*% zplNv00d;E{OH+0AzSuZz7e7a%TvXx+t779}EPp-)ozwpOCqkb$0EnBTygdQI@zoib zrPMmt-MSj^#T)w0U5&nGz?UK=$fp>J#ncB+v)=0HZ`=#o64~n#U&z!|opPzDs)`|? z&p|3_4TJ|t+zjuZj3`aYc0PD=&@;*C4V%m0Flr-l>~>|Ss&6gkGSb31Cd~!1P;PA2 z+{dBnr~t96_K5_X$AP{t4CX)doe{kGH;t*#Gg({gl5`ED!QmmisJ}OGn-PLiR052f za_Bfu1=VM=zFcw75uM++C3i-CHg=f_*l9MJuXh!fcc%^K!JO}un!4H1WY5pA#XrY; zw1j<5ZQk_u(w-azT%NstlO6Z4nct^PWZf~~&htpr7cKZifOiCX*t6L0wDlo8s4POh zOYcM9?eo|ur57&3s-n*C!;R)3^C0R)gF0r1KW~6eR=oZmafq%?m_o;U_~5oD?wnDZ z2M^9X$!H8#^PciufuB0@?f?U`)BK&|^x|ZD`>i?jW49mL4Sx!D1M|pbXFHwMfor^V zGCVlkZHsKT&(`d|e(NyOwG<~WR~1vPVN&x(%*yraN2qlwAiGxa=Y6dDR_SLy0fk3J zMO8S=kg_eO)A|;8wV|`oY8f-gqbBCO@S-VvVwAz<#rcnK`TOpM6~sw3Fax{Z=-s8X zt^U!4USg87MAv_PASHZp*(q&0`W1y)?yam`Qm)Zh-6#Kh` z_w^A@bQ;0&plQ`vr`=-(7^8r5VjSi8h30IjT-5p{JKTn^%WNImKSJFMZx3uaVd& zEaHib5Rp9EO3jUpkFOPUz0ep_cxn#ty^xmfUGimDc|gM$LmAfDE@CR_+uj@D-sX4p zSs50?Sf3GgOUVa1K#2K}einA$gWYHy`b<*lP)>@W&D}sR=Fmsk3siSm>(wN)UP_8a zZuhZZ2d}py%JF9HsN{7+ZrAl_jf9EhI`hSvAf~dhk-iIaTCYxPj0F*9ft>GB7ngNo z(q}N8nX&tSeiOrQCs>Ca&r&7OGHmQ@{dGnp9M1Jl3gPQ*igX>P`o=)6@HT4U7L+Pm zD%vRufR)A1Gx8|B_g7PsJN30A5m3uMdH7G7>qSduAoV1Dg1WILwL2t&atV@X+Szrd z4}2lvcg8p^FhdPIsn9WVu@DZpoHy=w9n6hx+MaJmUlzfMKCGuD`hBSw59MT~vfaJ2 zJn90niJaYZ0aJ|8V<0xEy@MMg$vNuRB8QOjsN+C_TFWvO67lV6K@$5CG zKk&=%_fPLu-~OzCjC{5Zw(#^2+>BG<7uhi|G!zQ;WxYQ0cE~+6bqBcfEtU_V*0kUt zUp23Z{Vb5sq|oGK^`h>V#AD4DQF5D3gVh1I zqTqO;=NVzT7+jt=e!C9&&4<-ONfWVQfzk2YlBQCq%eGf+Oey+pGBoO)6= z1MsmrR5j_6oLgL^s_yoni*{L8b*m?%+`8$v#pfB83zlU*5oKM9z3&b_=oYD*R<@YS zuhF3Fvze8?skAdX+$?|MjJ5!dl~4Da&P4pu62^N!9O(7mK`ve;4;)_X?a$lbXnQqC z7{gauycxxX0=PqT1+&cID@KiK?5f6C2?ST6I?@5&@~Zjza9~ng=w)=91|Wf~d`JOO7_k8<<@6G zF_rk2`s_Mla4n|BBD;me!qN zJEv{8F(BL1#zHs-=pnr17SPz#Dz2L#n|@yV=FOYvuYAW2>OHchWa^%ODh#6E)|G>s z82m)lvc+>Jl4mVB29Aexm$i<6$W6Hgj*Uf4=w(+o6M?zG_r|$HjxTRcz0q`~7JOcw z_dWsPAL=g8T|?qozBe?LFyL&O(^_7@S}Pu}&OX2GvMXf+@y+I3xW zw@Y0>u1HpyapWpJJIy3IorO%7z=LoHO+>aV{$Ck4t1^U6BGkaE75|VNCBHn$vSli! zT>Vci@*HA3$Nt_D^~e5@5fFak0w~-FCv#!W>iaR@8vSB`_vVQ|{%;3O-S%8Q!B6IT zUzqy$C>B6d1n_R;tqzf$d>Lwc$H2TCQwXOgai7bwLZs>}3 zmpM|IP?k{vAf=aE`>`9c>=^n+89fo9vLZ>zNEPHW<_2?q0n*;YLgu3BTm6W6!^w90 z(Ilx46fNuA5Uquh>+e`h2=K~KrOMf?MuG%lWaDQ;;{&CBs-0|)#RHZxUrj&T=WA7$ zRadF)p9VDZHhgs7%I4kgipjBBnCw13e6DForyo$Lv(PF`yr-e5_uF#;Frqk8AZZ_V zfjW$Cvq`S1()1VIHnX!~2}yVw^^7@gQ}HS5*ybzB#AaiEkqokonWhLWITlV19eCb_ zmM5#aZ|NI|`^tPr4p1?LkuzJ>|Lc#Ef%R)xrgdKJz>k3jPV(e<)Qb=QH}1(x`@y3$ zQC91wVCUCK;+n}*&ocd~@z-jUl8aUX+iy@g>(9!8w4EpT6-$H1rA>`Cj;(^HVwr-d0K_Z30PY@s6KCp-OE$V zexMJ{fSlM1MZ36MkA=*=U5$}7okYL$GQxI9_z`j{p1t?F!MQ9%AJE zEQnvI-m6fcjqnAg%(aeYzk-$5>ORA_;l=k#CF8i11YW!k(59lYhf+T26pOW4j|plT z*;XLm{O`x{{-d0rK=RDCS}TA5XfTj(B=3O$7~WA8+O0Va>iNsK@Mr~+O;+k-6w1ZH z!8RE9fb9Bw>%%V(oEO3^j;Y_SZdL^|Z>FHnoMA8Kk>7@Q)7|`GCCHd))<@FD-krH* zu=#~SBfdRk6NSZ}a!KsR{+gGVwC%bNxsSQ-Rns&aL557npUkCstsa_W4AMS4JlxgR zqvBn4?_4|IeS$BRrD3+*v96RdD<9z4iBV+9lqQqq<<6@f^;bW##SHjHd)40#8J&TE zn=V%k5(I*FpR#|_vN#ZVtbgb`1W&a1A+_Jxt@ovCb*BM7j3tn<`p)(43pkb^)};MX z(k9BG0m-S3`UoC9o|M4sGBP(56xVV+24J%GG6|%Z0X0g|Ql>GTE=-i&a$u+Nr#j$e z?BK@jfUzW@_m_q^R`290(bI>VWmwD-12S7c!hEG96J~kpowu%4AgN25y?a4F^R;$H zSlvntQov9AcaVjN^Hs-MyC>abpBq29OOLA+v%* zvs=0%LT(%Fj+B}$#S_CEdE(;vH(&ofonGbngW&X{dNyj3H;pyWkSBY|Nlh89s<&``CC(A9B+g z+)Il5TK&CjTs54Z_CqjuQC)b8X5*0%wb`m0d-OYMl zIhubt59f?}tr&j_9M(?ECBGUC=35*@#osRfLa*=eaNKDl*8F0Z?lW|iBG51bGI$I^ z`|CQ-|1Bc1*~r!pym8X}+^!Q}zot|V8}_?d@&vvXvp1YxSx&h&TJHYQwQyckTk@_^ z#$_mfpW8LkCbwuG!`9R19;%2#dF`&ZMpu|{x$xK4z{2Bo#b$ z0m@G8l@=A$@OL*nZ*Y@=59NImBWZ}0KABnZ%V%RT<`>d+F}me;IEP1!oJRbCSU%%J zT2oSvBW%!`nHDg}5;1O@=iqbrP0r&D=BEakRlWXl6yMkLh?38sj=hU--`lHq#z)u7?`pZWxHAB&F=QCn_71E2Gw|{Pr|5_@YFp9tvtMSC`#)t&(4#YTKH`o$6!KYmA zjo3%mAjqZm8Dq~eh14Cdg7@-}@v>o_a!Q`ZnHso?M@DV_MVV?;-bHeSnG{0UD{1d% zz<%cdo>8udyboQX@m(>sRnbBE<)2H^^7}udx^gvME5whitA_fh>y2zYbD!DQ_%lrI zNTGsGPcE0rXKVLB7LnUHJe|rXu%PP4V50l%WdE6I>-FQoppjUmkD~3(&7}g4+vW@( zsz!?1Pvy|o8dsiZ|J^CZzn$nn(Y1X5{$)&3$f49D(TRdr}4@#PeF>K6*`Z5V9_?Vd}Ue}^yOcZU%4b8@^n*x=OA z9r!M#=7Jw|EWH{+^r&qAD5B2kSSl4==H(jrpX1qG8mI@m)fqY=jhp+*k;tri2Sv&E@U1E8hDMqSKkm4^J0L`7`YNwN$~0(V(s!lNd};(43VC z(x@jiSc!t;s_+OXfKyg!9J~Jw0rK@XE|evxm_S_(pE19;wDS7+h3!>2_$#fzH!BUj z72%S$j0cj2@cLbybc1Sm*#8-%b>)a_}t@D--^Xv?vw)2h;Mb0`>uS^E&~X`+ukI8FE3e!$s$0sY9)mh6McatZolg!CX*2f( zOTk&{??>$XP!P`s@hTz@ou-7rLK#k}|Cz7fazxX?IeGng)IW}0VeZv!Y(p*^8%GU-J zF6=7dpuE-;;Ow88^SW6@JlD{pXjmV%HyvP*+t{%bk5rq?#`Za>Qo3`bo1MnmUgqvL z-DjMbYvVyfoJfPC?l;v42|~Df&CqnPTw#G0!ews0N(t)xTIove`4TBR%ZvV_XHn0r z7V|GFChr)M7xyu^-KQvxDJARhC2nhA=TTL3Rc*)TB}6~en( zpv511&oJM`*T_@+e2A)%%vsd-(JJzHrF1se?Qy#%CDersxtx8ljK`I!$g9!XjF^h2 za*u;ny;Q$(<-fAXjFpR(ePL~t6=_SByplaH`s-?>z%j9^By=yJ#RzORQ$Y}X$h25# z)_n1$oqE2xJh()JT-ydqyX>lurT?>$ptv7vvSVu$>#`Gwbs*O>)5Lu#SlN^K@JZ*v z_3#%0f>JBZu)!870Slsw9c%k&`VjL!ZLozcf++c2|Lc`#4W&q>*}o{6=Q!DSk7fA` z0B^tTKaRd8`xH0W0bbD2l3)Q00Tg6 zSF1zq^rnASPL9fba!iLR6q~EIWM5@C;r=4i)1zU?QV7RZFl^>4N}e37qy^Eb5T8nr zWj@e3-in$xt_U1#M8=`9eK8XUbA$sHYkG?J``k}Jj6m&NEfz~{g zrH&Y-&)Q28e^F2c>+Ga$Ct_xXo7$}K6{vo`$ko>VcJ}PLLK>L`0!6gAGy(=;YougC z=6XRf+#pvg#|D+cWwWQ8sB^xhRL?6iRw0pSkwKTxscXLbz=r!Ty$=JP& z5iJSiRoC=po69>ptwIY>e$XglW0(2K{auZ)aP2pRg=VOcydOI@QJ*Tk4GE|jb8Q7E z4+}Qd179xa)DP#j#vHV@l6!fP%NXS|H+n`q4%U9?h-&HdOoAo)p7^iZav&a=i=u@2Npg z?}M%Zj}M_x?Q!<8!R)pBjq2)|X+JSmTKD98zg=7Z@$peWh?kUi<4KGJI5XBpQ_5|IaH<^9SpL5+**AOdWy81=#8^R;r6Ji&umzW~cAgJ*0U zq>sz1)J+s^3zw+M*<*XP9G=5f&^lGC$@9f2THQ`)Q07B_XT(Hw%d)58*QyAgkQlET z)@J{T>Z-`=z0V=lS`{5U<inoXD)DutvT{I$FMM z#j|IiN&%w1)Ba>vn}+~G_QvSx>7_RSVn8@YY0pdF*6a)@V{7&&1<+vSz_)pU@_Q-u zI-Eraz6F7j4~g`Y!HVpTy~_pA3Yev`ec%X@!>@nenmv@)q-#t>BgaLt{W^wlk5s5# z*TL<9JI~s|*#TcBCtAoCiN>rzSh_8aEUQCSi1oXVyv2+!K#sKgjcYpHxt$<^|Bt=* zjB9$!_J;*T6csEKrHYDlklu@+Aiehzs`M(M2Si1hfb=H4*U(EKLAro|lu$wmy@lQb zBs@8DXU=ivo;!E$-2bcRb6;iWN66k;d+oK?`mQFMGA^#80Pk61^1D?UheTA64gfep<^zQA%jhLC;&fJo!FRWC88>&Int3 zba$K|i(7YqLMxXxaSs^NEtD)HBnw~ zlxP?Uq$(Kr8a`sp)eSGHUyy6r^>=6cxj4ZlH;j&sjiuH-{c2J;!S$WFvz75)xEy(wtEpmjXq{ylK z70ex*UqJ)RU5IPqRtlf!UDnF|W2yQNgj$=tqg&L;WN`fHX6s574$cAR& z874gy;8eWJ&+tCzal?5t7tNp%vAyfW8p4;b2wO^^#M*=P5}!7&q##VZ5&kQX)%jWh;I}{JS#izQUllt9``x>N&4@Oo$p~QJx7jd z*Y+mSv3t&v=n|ZIjD1F!Eku^rRHU8tw2Vb>sk+bFT&I=sCaYn=tmMx|Hf%}2X@>o~ zw3X3x8&~JEf^(Z;1Y{euj zn4YAcGPNAgclDi3Z*|hRxLr(#9v+cXalF3abW6E%ko9S9J~)eqW63bvYBQ=|SsM!c9iUM-^auHdZo+3azB^ z@z%+seN50%#P}9!Da8)p>Dw5?my+3juMXmIEK+sUXavJ@jtkJj=67gml8gc1nc1@) zW1?N2KEy0yPAa(U7D-gT%e7#Ldrcj#@nrv5=g1&Q%mZp_-Rldv#|5t$$oN@aKfP%& z?ZNNnGnZ4Q8B;)de>Ln@5RY7nGsYSfFwhIZVrnI)hBcETwe2-6>^{!D z9h~w+SApCn`eb8iFKQ>3mNBAGgKf1D`0YXZ4APRkpuy(yqw{pkrqsPMPEdNh{g#KZ ziE7_6+sVolWT4qYA13$v#q_I^_M6T0_kZvb!>eD%6}<_mCuvELmiG6@9wcc!=$h+z zt@J~w`zyY*LYSiF>+Vu%2?SM2HYA(JWF~;m1L%P&(G8>{Ju7gLlBu=)vF1_W)+o$Q$dIn2cIvO^B<#xf0BFmpOHB{C5OrFXM$= z(e9sBRXYkJ`{N?}r!^$s7O~(nC*D9?^j0e4_VlM~tpSDV-|6@Y~ z3s~lex+Y~7%jyX@l_|BrVYs4;Ab6fnr^hkll)p^-7{ik({lwMER}5>5CHhXa zX|)VohW&}4l`1V=$AyIcn*Q-knw~cGy2c5a>b$p_%V(^>+F+ey{@Gnua2dwuXrNzU z2XvSyP`SP|NDmaNHcjopc8zE$Cd}tq*rv&OA2N zlW_G=CGyEH?#5cEYv;dHg zC67%uha{By`#aF6L~{j($2qLyRo7VeM`xyE+I0LeO)Yo&Ba}(EG!u_2HLa3Id1i=l zew_2<)==(vUmi9mEnS@+XU}HLu>D>uYA0_lZrJyH@k(sFFUhNFd}Fsp!rB%V`FXbc z1^@x?-ORHMh!=1tdIAX*_1{aQFHY0XD$~&~k~T{bUD)y8wWqqUm&aqSU)cCo_MK%n z*V*e)?fPDwPbz|}ZumaV^9;~F?K7zr^%dC)sp2^Z`-L+-22|;r*|49V> zgGBn}t!bK6}3Fe zwV_-MAAh%fu*r~LA9vZEm}zMV3JS{X$~uAg0!Y;})|vrgLVwE-t73YpW^?&7#^QVQ z7hUu=EfnUq-Yi|ux@!S!>Lwa=K$9qGX}e0-Ltpq+xsg#O${NbpU+jAZkV$$SK$FHLl=^>kgdNM@ z?$EfR5PuC=9P=Tfw^maBPWbpdF2x^$OH5vAp$``kKwlUwkw53<7o`Ofe_-L_P@Liz z@hB$es}{KRjEw;N%gGYs!oycePZXQ_BYfr$I(xC>N#-8Ce#l4_n5{$_#zuBAKO|_< z(UbMm%F0KoRO%i%u+Q!6g%8Mh3p3-TbH22dU{4l99zPUuZ%kaS1(2S07;(}X!Kk39 zn4R0KMY;-vIgI`^W!fUM`m^c&nE02`+zsM}88!J(1Ur0m22k=r+70bTJn1r(Dgvq# z&|1WPruNe;e}0!gQK6Nlgsp@{sDpvw6)~s2sJ6CNIc6_wM{#Cb4v_Aw?U-VRjLQElA<0X@b}#7~OYlm4tnw`+l6#6tlFs`2M|P5ZS~!*`xx434XAs=3Zbzn}VXXZy0^yN%Z1qZjD@lX+MZ04sj{Nt$SRH6aMrR3>A%^U&w zsn8aTR8&-lQs_>M$r4$!?{-?`rG&g0PWCM z_c~8@vZ8mUH@Ax0GwyJ2*=BQno;cMLBF%`zhbBU$%iWl z2*cVgxfyoZ32_tV2~7RYwy@;iCgF`@^ZkD@i9(n{8$jv07+c^%wt3pyJOoXv@L(^l zBEjF*jeLm{jj&L;cwB4rKiSFu$+L-Qd`5MeJay@~jz}>d(dwU_U*C!zd{ejk+nqN@ zc>mG2B|_0hWJLeVsifwn*wl2iXt2bOm0(b&R^HjS-OF*PuWSoneY^G@NdETqr*CfD zG2QPMN#DHvyHWNhyYV+-{OP&;E2+MbP!xvj7k(zre(JHyJ#G7nD_mosG0o#AGuPj~ zdKaGk?JX%r0bCAZJq7(JFQcUDnexMtF<92=)B*M!EA3Rf5)8ege5=cx|4$-?tk?fAamP7DiP zhAyK>lV3VI{>Imj%W5C+#9O1!j?p4+<`MrNe3^qMA3y_2Q+DdCdXtU?m?FGNtr$^OZ>Po)2Q;fqrb zNWK=bvPQ)$my!XYH{N^B>b5z5IrY{?I5p<%0pKpq#F*T9bO zB}l`D8#OevX!1mydykxp1|k#)6XVW!2V$Ku`uM-||1RHE+~r7BTzdZxqWznrK&Gc^ zxj%2HMrJUp;E@G+CTM&NwNRunTkyXATwV>i5kR~uTWPM)>nuU*2 zW5b>F0dbEwntyZa{>y(0T;=>N(LwSm*}pG5{tGhx->UzC>iA6**j>3#O|XK?JB zDl9Ko;!N)GsGqCig>$Z(@tyGbaj>2 z(n%;dYlpIS%bc&;@5RT%^@eK?_j{`(JP9*j9>p&(tAp~gn=fXM(20~sNA;*%`k?u~ z3@1!1ikF{X+i=i*M{_*Gs4FjzJYMrWp_sYE78w>E-Zp+-F6xyAu-^9>sncRIG%<-> z&Rf>wFu1MT8Wt9oQal`hP$ojt8Dww*7}o+P?R%`Yvv`yH-_KA@tC2yC6# zf-NsI#uu?rp-_wGJ1s?-ohfVU8(vFibtz_M47k4DvHJ~oFrGx_E;di!95iYT7K4i- z#G4=%$n;sSEqJ0vVc+64PKd;W=W6-q?!_EcnA-OrcEnuX=yU ztN6j3$kmnoA<5@tH#c5R%uJ^DV`~A>L0muT%7*4_wFJ8es-3%o^hpk$1d3FQAcZsm zxvnk?b8``4Z$6J-)m$7fQ?AI)>ax_9SHdkKk~MD6%_EYIe*-$mNG$ndnNoXI4-_)j zdt}IBwD%dGaCPM^OS6SZAT1k&0$_kc$>BF;Ys(ppFY9ZVzb{3MlbLIHND8@nTM5f* zfs+T97v^gvYZ}j;8=Ta2jX{^I{jfcM;fp=%3_m(S=flp!LkFc2x|(bh7OocxUxp{8 zrH4n6UmKo9+~e2QX8E35Q)5}J?R18%8uQ-&5%fU4;rnu*pf+iW#`PaY>}8yJB2zJK z6uL{##reyAcJABQIfT#!RXBJ;K-Q1o>I3P}JDSCpLZ7X)FSX-zU)JLrxDm&g{cnzL z5bo#>N+&!1hHR+nf1@3J1HUmqyOTe<=V%8JV1=U{9j)6M8>gXz1sWm21S->b&W_BX zAJpEEjm{qlujQ!cWZ?o4Z9g8$24%-d^6{K4ZjXHyA@s34P$vv*7%>s>K0JV7vs{qf zOb<%L8~~*fCzp$GUSi~fa8b|)7Qdh8)!9BW%F5d8oXmbQNN^g>gzI{5L<8{L$w(}K z#i*N^jV&A}Qm?}$Dad_zB+^w;G&+THZ#6Aw#2T2W!cjTJxp(d?Snc0LlSwsr%%ECM z@@Z=pzTF=O7Y=60u z-ih83D9)Ml-D#%l@4sE-j-Hm@DD*72bW$qLS%9+%l8{Vzvy95d~FC8{2ZiJjJtGI8UdTqB^0q=bc7c>#we{ZW!^NSV*1L1e8evNEFPZn?s z2o$}G$|jrB)zBy|j0y=Is=WPz=3*$oQ>~RTaWT>)yiY;%LANuei|Z8#iZ8a^G5MBq zaUsuM9ekw=aRxcha6arG9yY&N1_Y21AdYd#(#PBDe<>SsvL&d&9F7vjl?RQ;ny)-v zS{$^{o9DRPjJjmUwjwVhCg4-#%ge;(lPjYEp3LQJrb}a6u zOt~`iOOmK3(ZV6Fx#r4d=jmZ=EO$eRVjxRXPEjQTVT(guQS{K>>7J@YSU4q^tz(!W z?k;~VKe3T*)D&@)zIMos`@h3CekEc;|rSZO5 zwFug~x1`!kh2h!TgSYBh8f4`0wVQT>MJa*CnwU^z{p6!>R^zOs(<=ixA<;9y{Eyj%^uF%LLovpakMTuYP^-+%$2t>vCiWa;z zyz+jfUo6PZ&c5!WK3)PFn=v&QtKIyHe`ghFyn|Xi`*c=VQl`>3HZJ@vSIg|v&7oY8 z*A_Cyw@4%M(fRq-n#PX|^T3j{b9;p>#=Q0>0Nd>W1j_#2R8$}x5gK*CjGEat_+ngQv?#mgLSUq z>cjQ4PxbYgO9*CcSdp`yTsYu7vTocQQD+bl!XyU>o2?{`(SpcV)ScV=rCPM*`4ENi z?as=V?|N3e{NDf5z5e9}{!gD%eT7T7DroCfz=_E~O2coo2s=C0?1B<;Tp5>b$}v0& zupOU^=L#DOOH``h`GV7>)but=we=a>c4@;aCdfIP!AZn8isbVXs?LkETEoibhSIy; z)Qi45(1()erypgFGeV-Xq6@WO_r{6bAG2H9)d=zwvvVs@@O<1{?l#ch-`%z#?Ot1N zhu&D*UiTkeIFa;3Uo7996A$yvIG%j*1io=mAF#s-B>sWS@XT?hp>aFV$q=FE>?jps z*^Vh90ElT|HmASJ2JM7*<^>fpb4BgI4pwB&69!jfTX(;EeU4JiRpu)iu}qbH?;Jhy zCW}d5fBMGA3tmrce`jYeclMw{vc8IvGWl+Zh=?dX&8kCVE!gAGpJYSG3rz@|U{@y^ z`E-_IqgJ4TD~&II+KV{a761L*eG`=V#^9&e*eP^|h+cyqZIQxGJT5w;BtK&VvmVgW zac(X_9^EJMFlzKsod4M9zIEDq?u<&Q6Ap^beJ9DGU2ebdgp2m4NYldQ158fCTWhKD zzIt;{=T(bV^cl!#{t>;uyI9aiA)4h6C$nJ#kz>l^ygVZ1yD`ZP-ZF6HiEIiRE_pImVoQqMjpY}Kc*Yeb`n+}qWwE4h^JW8!!be6bi ze9u6c(^T>VdknsK4iT9e=7-g58*7u}Is~Y{%a*>Q*tf74C8>J8zv_nVN1iUPZ95=s z;Oo%5<-7;F-;_WWj_%_%-OjeyS5VJ`x(#QZH2tqbek3WALJn_6$Pe&-r_q1nx&IDJ z-6h8%!RRm-_TRAoO?N!cq=S%UtbwSoKu1o3=(MF#>toE>N_(V7;1GRmJluSdK5oPok@fNmD9JE+YU}oI+;( zxh)5Y$zI*rbgPSpz>3(y*@e+rX@0SY-9|A#m9H_4xZfi?dp;gN3lOWK&Q+qsAKyo5 z$!K|a1-RoyD?KQRB2a8Kh1ny%pIJ(yr@HBO+=z@_nbt*O!kpjgi;-_mr%_ zv}Zp@W*+V|V|-}F_$@UpWQv~%U9Y^eU%3Y~@%GjyzT^E0?-7aQbafNkhC6L4;RnlW z<*KJ5)eVJu<2}*%B)U3>{Q^vY?sF=4HNXfYl7wU9PKQd+hnhM*CrHBNBsxh0W2Qbn zM53|2wf?#5?5wc3^i<=aqLxI9=h_^d@ko@NXgg#qL;LxhJER=xPH-aOf;OsmH8xd0 zibEg}HgmuH<>y|It`yYZ>4g8r#}x-xX^e)3#%Kh|{pW4KU zi3{{F~ib!F*5B%Rqz_u!1A?oq}Ev)Eut+ln<=f=wFQ>n|ZYKiqNlsiQy0(pH0L0&>>~vYlh=)gJqNVx80IIs(pZfAq zO2+l)VQ}60b&c7Z4sZAQkG5bseaJ4h~U`$_SgBY$QuxJ8R3yCo|>A(8TmGJbhJsFe)n} z1L9-t=#WJ*1*bM()$%i2CxwGb3qPj@F}>-7zz%!+h;o{$#ka!2NMq9fMzi+P`!?u& zkra%VOjkEg`-_hI59mmG?iKOyjNE6a-wZJr1HQj0YN+QX?KZLKGKni)&~(}coo5QJ z4!C9kS8nDl$*bGz>k5HX+sq9m^`hc5Fh8`97mQ2ABxKygTiAf?xYFNXlzEAgA4yp- zkbksHJ~4j;9~-mHJ<1K0r%y-xob*8`$O6OGuY$Rg`osLUR-h(Huhes*=bD<}MHSL%tSD5r z-ji&kj!jShlqX-?nS4Q%aYiom!Bge3*7wNE-d*<2v$yJLH6wf#kLH;q@Z}s6VfQ?g6ATJ z%gQgugS>^7%9~2Wbws8#p3l7j24kCKh_5u0<3t{Zx~ZwEv+k(isAFFTkQ~q#fJ0^6 zIku#rIp-dozd<^1-8zGw(IxlKCD^`whu1V61TE ziYTb%ANz|4+-e-RrH^akOo<2$J3!jH8F-yIVzqlzuU$QYHub!J%v}7)#Ckfas-9I`zRy?#| zuPGsHyr&cqDJCA!H0HR{!~vAzl!+IWk#TsmQc8~oLw`}XOZeedK1r&gqTya;-}g#LtSkzF)e?<-PSYWhcGixjs=+vvQfKsTbyYTd zJRDb^#&2bnk}sz>dp~!%*6}36XliSij_%bgEz{QWJ{qOSE1o$o`ny;NqeIN3j(?~H<)@1%;In${K@+c(YS)y~FOL7Fog81)i{Lk#-wSw>O z^n5WecU#wJjVYIvihZx^}zif|^ zE9=8hPfMC9fbJVf)WZ#ifY1^l@?~yb&Km1u0=Xubqlo>O%` zn2CRK!f`~bV!P_NPZJ1?Kl`L*d#7~Y66#?X1OlixHMGqclpo~5I8*B72|~qtowgu! zM^Kc){aDSSsL1nmOU}eH zN3Ofvsqne3n>W!~;6vfHgLcO)vCIm<%;hpl#bl?(-_tMMdW$$*yW82RSk=m8s%~%< z*y`eMmJ$IJpRzQPk|3*wLOR;Mq8Q>%6dMi&hc-tVSKwC19W0 zI4NQzad|r>u4K^Bc_aWS7Gj7?FgHyoxlD>on@T}==Ip;g9n%uh( z)3;RU3b|1CSA7Lc#sWO+-qKl}2@FHpEk-Xt7a! z(r2+ghUh_PEUOEsJyZ-4#qf_(6?gvlJ)gEY*@5pBPyW2Dm!%_uzIwUVC zFW+pj)?Lg7a@~du9X7RK?2C8+1w;$_dHv)N7%cGga3prU>nmF-GT<_8qNPBWg0|@K zMz7U&+4w?xltg%j|7r3?zShv!h(XmfRbW$ozU+)vvhoWKVaWqUV=r2m@bOJaA1<6tsU1IS z7|}X!40*wwlHl3tuB)mmBJl9tOeEc80ln@BGb0hnre>bWs=|%L2g!GT37aOwlRTvv zZ3ma=I(HOlt`4_92&RT%y4YAoT|`x$6tfvMO;YmuG}L6O)Tw4hi*y*+jCz>m}5-f=WG0# zL)oHXrR+ubbsRUO;3chL28OA)5`e+&j;>W6vbZ{DgLPNOou?xiYL7$$<`wL8kF@Kt zXC-nAM;3A#uR}#8u|q8v_1w!ZvX`(cD7hTD!FXK3;RrI9eeL>Iw_j{xF|NS*`JvIl z#ly*P?(9~TZvLO8?RSk6*Jj}4=f~R$1RVlJ$}Pw#2e%Bu6PAYDK#Sm-fss|tS1MVg zB$kCmg-TiPa5d&4cbd@(8}t>EQc9C&;ti!!qO_8(vKZl&(L{?!`{6fnck$WGjPXX! z&*W=%Gu2IUw8t$par3|i$H_v(r!;lpf%KM`GLJr8q8k@0NOX|<*3O-FCjQ&EBXY6# z6FC8@AkF64L;!-Gi+&P}eHhg0SnU|9&hR-1MjL=#%*ZSM5fo`m!N*&Q7&n~TXGgKGNkUX$+rmwlHW6&#L1cM>;0pMHFP}ngxzOW8a@>$r z_f8i)Lo!Yz{$auA~N%;k$ge%X@QCqhzy!|bwNh2L4mvK0@=>zdS z<6-aGxPj&TPqIf--n_M%hwoYeo^D=0_2I_O$i~!bZx7CE5(`523`!`=Zp+wIKd#kwbhM33B-zHf zSbZSN7cN4hA#IA-7D>z=G_$x3nORyI<#V*tGYb{pJ5B{VHqGqjjPI+~-CZJ9E?|vtB&OS2vQ$niD3zu?SW(o-vo`g5irFNaV8;xh+}d*3 zWUjA^yk-M#_Fpx4u;fFNZU%4V6nz#M~?$&HsL-isJ;7qvnTDYVG8iA+LJ0@ zJ|9(ig#(@Mx#~AEsyA#J8)}lAuw=6Mu670EhUqa8P!ruT@OoGOkHfF5)#N>J^3L*s zI-6k;qZiH^=B0hH$@%V@L1kq2F!D)ARlwdbFuv$;_Tp$LliHiSxKLCd9>@%PVYTDn zrq>q;^403WRk|4^(OydXw63M}tM8Hrj|rw)lD^lor|EMF&!7sS6RVITeQ!YiMK`hB zvD#bE_lRI(K6>cz-B1phk5+gNWP9gl?TLr9gb`BT=qK|P*qlzv>rk1Ky4U2cz0el1 zvJE_RG2KrxJO1@D<;%TxZNSbsl`(Y)k1@6A^G>8QKe>G_QGoY8fi}1uW&Th6h=FOi zrZ7}kNIr?4g+*+U=14B$mh#|_LdU^Ugj`Wslt}XOK{ypZh!d)d^PN0nS~ZVC*m~c| zt$l*_d3oqs3*108l~|LP6m1PKh+Dh*rc+wEJsd1LNDzJ5nDaw%<8&o3jjrHxHL;iH z&yWlvM{CQ~{$r5Bz`Ahwn~KD#l;u%*8~wqseSec&E@=O+Zu`i4F5M@icTEW7A_}>_ z&&{dXU1s!gmLL zwES!!=}m*xuh*R2E(2qR7e;$7`Yq((Em;=~yj;9F9%dNrx3_{BmjI+oMB zeU?Ym;g-}P9Moi_wf6Y~^Yl)42F^c$Ox`?q0L2y;JE?-qnj^K3@C-CWq3gErkveasDn~HrNXqnPm9fEFEY7u8 z%{9>Jcze`$b^F~}uZ^jBe{5PnW24{K7Oz(Xl!7m{fv;F&KQIZTh^c|woh9J@A`Kk` zrx0W`YS!*35pl~0l;Q8807^z=cLCuD#O)6c1q=d?O*ZOtfF`)QShD1sZrc~|B(+8; zhw4EsoXSY=Jo7C}YSjVa#q%kCznE2^4oQm$S;q?j3u3}#-3OnTNTs&knqwMcB}OGB zo&_!PMsEWwcbtzmS~D;=D^d_DP6FeJ$dkI6jIF~-MF{edS>q5MP!|2vmyIG2z2M$k2H&!OTV>QKZJ=`inWnLmg49s=n2WtiI zj}6ox`!e~8M2~n_A;1o9R)Z0DH@_;E&j}ZHke|dd@WovdO6{gYp2a<`SBoN4>zzL%rXw zL`$c*HFKM=>|D5y1GsUvyP8p8eVvv{tXT00Rzd|=p_JmQ+G=Bz1mrep zN+U{B*7M!o6*VWrT3AFvM(We?!;9SAj|EC^{1MguZc{>@S_c*s;vo4nb~b*sQS-ej zBjByW+WGe=-HyRubl_$we3%N%BS#e^MP`~U@(~<7lYj&`k<}JUg_!}9=&7h8*~Xo0 zo{t$o!Px7>cFY>amRn1(hwV8QuGF$NyEKre*pH4x~*y^_{L|6U%7aXS5ZQe1R1mHqFSVjYC%6e`P<`!Ot5drt5%1OA^ zhv%y4LikgsP3#OXqWNUzJZ1j(8L8&R9E*mrR=j1tK-#|Z{ii8<-kFo~gslGileR|z z4|Tkmc66zyS35p*ayFFDZ`rz~Is2LOI2D&4S4Tw_Jioiu*qdW94+*)ILcO{@*iybW zg&jJ#u6KPX@@N_Czki?=rDVo?vLR=Z9Q6UEWM9A?KS*%zQfv8OuB%)UeTqKyGBv92 zeoG&(PAf^|^8+R3BK3jj5@;yUp8t)Y7CyyX(Q5cMsY5)5tRoq2F`m#)a9{LC{!hAc z(^b=uL6xuSzTcwBEZ6ZOjLV7B0?G%M$v?YnA<9Ob^G#N(B<(da5~LgHN@u1#pgvOP z=y@h4jewlT!g0kaTOf{+q8&9{pVAqggJ4_nv<%1YVq*3wMA7nDhyYf{k%iLww`=Os4_Uu_x zdubEHvC5|2SeXu45KEr}?J zsZF`Wemp8Bl{D2BRZZd`TqM=Ic2Jt1%E}6bxxb~vC%D`XP`&|QX5CZ<#W)4ZS)ujY z>SgJ*Lyx4*Rbrq0J=X@?c_kBNGhB-m&j}}&PlE(RqQ*_-SMFoB^W=j)q+96>%bs9B zaO7GWa-5B2sVe|HBRdAhY17D1Lt@foEuo*^zjx#Z0HDhBJ5$7;&PD@LuU#7vUPUIl zU1COCU$=B`6s)wg!!IR$cQBUY(aUJYUf-RPckfRgUAdQO?HTL9n_pn<^G0qXc`}|% zqoWI(srC_@ayv+x*zxllYkruu@04xaU=D{zY>)20snVT`E z33PrZYNL5z*RArk_B!>R7{%Kzt1p9nYK+FQk2l}lf+8_1qHo-*zQ5z)V2z98&ac|n zxGy6Q_*l_-u9NzWE+z80VJM>gH^sq8CV=GNBr^VdkOXKE=LAI2x1eCofK&7x!c#Ds=)8+m`@ zsnh<{lMIA39&v?SO<|`jsQmFT<)fI#3>4+vAv2NDU_T2wod=hTIEww1On-S{54<9P zM{OdBodi3+wbi(LZA|gw9qu*)t}X6vI6Ne=!qrV@0P4BCB>IH>!mZyGRTB!8PYr#! zW2kKIWW*qvl>?PYm8!1m(I|;v-|~@g7xo}hXPa<&N-odNSbL-0V{HFM!L*%Y0);J| zvP8R#MOL%>Iy2!?m-iEdP+01RxcJ-SwFuL`#2*2`t2B6W-|o8n^Ory{ejp5s_r%PY z>~2L)b@zAOBgD9kty7%P`Lk$yw|?s)U97tC;|J*?K$Yn7f_5oqK!X=LCEFBva|ia; ztMw!lDcdF6RxywPRaN_NvB$^w-2wVI{Vv19$G6YfHTMM#6%n--;e^#~lD2^p*|&Bx zASG+7^)JVoL2_5A86RH>I60Z+#g73+pK7wvGhI(O{dTuuJ>aZ9z~TIPT#*&1`tkKu z{fGAxPYwU!$IKPUz7uv$Y@o*#_U4LMQ_UQ~b$Jn#j@|rBg_dk3kh`@zu{ScmQET|@ z-D!`t^~+{w(#zw)lqI?&sU=et0m7Fj2bATXax&6K{d{Fx4ei_NXMGJXKDyn=hzqsm zHm&fquMsGVjY)W32xE0Pv+L*pG>$e!Mrfx!U+)^VW z7WLy$uHpIh8q0hAuM=GPcP`Q0^dD1MbptNHbm+SE4}Ly>{D7OeGSRXvacjD>WWIFc zt%-!=qQ!j%IsE6M9uDLr&~W@KOkm%*lUQ@fqrO*LbVGap=F11yUc@|EXmBq9(_v0uO2y@BfbKgf4HuBKekPR=vqLNQ zsYWAHQ#RTR!Sp=aw~p6mA~{3(Yl3kdM;P|PvAgw>7v86>85gkkVEz;kU7up(DduLV z=r?U2%&tG-nWM?Bs+h;VlFcY_@Q*L^NAZ-eK>3hQub&`4WCct-nLNO3n`LoUG zN?TT+$kT07*l*nUiCAQ$YHAS za8p_&T24+)OZf7G{C-Xrt^5<>6->ZoO8^rmLhZo_;_5UDB6#(IS!^SJY0liBJm9o| z9>a6E@lfB<-~oVN;yG+!BR!88i}6Kzk0aP3!Pnu~Lu3s>H_8N;_--lDr zrg+q(&+3+phuSXgr0Xty^A$Fs9eb8yi zhGEh<^U|#IX}BEz;{|{{qKGvaV03;Pg_G@4zEz%Si>M)v+Qd7evQ1S63AYftcE4cW?tV7V zQHWVG-}D`_9&%ILD{vUoBW@@&%l-(!y(M;HhQH9$%ku6A*^)Uep}q|KEoZI=i~2V) zv%?w%pgpH%lP*mvXeR=Tq`!fj(fDoR$z@6uB%Le}76*oTHnzFcqJi2AJN1}Zy0M;kXo~Id<6n%1k&E|SHI7QT zG+1Ju=AR=YnQ|UgAQGteS=?tr;2^GV8Mkrs+n6s})akh@zGgeX7j?)f+TNMI8Ku8C zGZ{Z@mwt&!hhY!0giJv74@&Rx($7ENuY_~MBN)V!bTa3hHn(`?cDxhgkw+0sc`G;)wRHRVBE}c@#J?``=h_0 zduAIJHuI{|K~i`4U2kW&(_(92!Lhfi7S&pZun%5(*-N`Kvr^}$>uXB1N>4u)a!(aO=UK=%O_6~>bZE$B`3 zXSj+#9`u+v7Ma80XoF7hEgaWVcO=q;eqx*!`?~R-+VEbjk*yia(y2oDuZMYnS=MPs|kcDj1>J z1q$O>>4w&!UXXsjQQGgiB}Xm{5(yS^Zf>8n75Xx-EOs& zBwtNb$!$H$ZJDQx?)EBTPO`SJs(pM;7`FlszZl;da7F#Ve#rWp@A)Q!Y&onIcWeDJ zfM`O@IexCVS5o*0G~pfXubBNpXgS|Ov>rq6rU0>)-L{&qc7=6$W&ut5O_(l=UF3MB;17^s#f0tae?q zvM!P75koWREg8l_z5iC6Fd|lgt3Cp2;AN*Zztj~h?->#dtWHS#int*33G)+3bY{6dHQ-p>Fd zz38n!<^yuU=wr%@PwvNw$u`p&wu+@Yy~X&St~#f~ z-c43PtVUj7P2vhe9vs#SbT_WmQR!${L}HJ{n(^u_Ce<1AaV*UhdOI{pvm@5hkwpC4 z^G_KML=~u>k{?71n@b0WgaJ&{*pNb%K*DqmTa5&cN7|#=6}4Y^hW9AQgQ4NNC?evY zunO8lyohASkSUg`{s{TtV#31-ZKVXNpgU6l2mjb%a)joI<&SHNh`)q zE##>UNBS@s{EYV0!=TrO-Rwy&$GAD#k1Q+Z6rl6o(6ksPH8w#mkc4yY?yeD* zq5N>31JawI2_nye^C;2<-q-fkdXFu1P}9(TF+vrQ9`sPRUtxJFC?N6`X@Z>o2D^x@U~tKZ*rG zcRh@!tcG#n>J`@f=>T5Pd@SWEjI$;n5TA&U51qTYc}%Y>8PPBt89(jV?S+`&oqA3s zG2_$N+G}qkT(-9>i_PzqPpcl6XWbs7#Z^3>=*lq@$~i|794K$@h+lc(vwB0W#{eD# zU)sB8ts6{O^I@>gYQl^n7PuEU!AwfoMvGjnYFiapr`Md~M+Ccnc--ueA8$|Kyj*RO z1@4nk>D|@c27GvS+xeX3_aci*7x2k1s2^8P+Zn480VM+U-7d3=ALQFU|4?X7a*{0` zI~(YsJbtr{0)(2R|9%W-#lh^fp0Z&IG%E-^qlrm6H#VD@!=UJWQ$^spf}Jmxa+0wV zVPii+d)eY}7w@nLRrA;S4OW~_OShm|_qQm2No)+o#ylGHZ&wj`?1mA$RiI(Nu zZx~Ll?H#dY{bLTG(Xdc(p061wjNi8$Hi5B4>vN!e+Gc2cJ}ECB%-R0g^S&T>eT$bC zTtsmHht=x^o#5d?JJfb8x3Jl2qyNgj*8@$6>p^pP;70j=$!;d4{f&jMh^f{@8?_pl z?p9`_s=BkG%SRjWzRD)z<466ay!sTB-&!RW^Y=a7k4JqYh68i5P%n#C%B_0>&wp^( z^{UIS9%w&CO!s?+QvSPP57;Au!eR1wSzfUI^REokDGY}uncJE>1I)&N1ooOyiZQ|J zf8qb!?0~Fquw8HMoYoheqVP>5lASXBL&jq`=dB;8GI{BXyzLif!d!gTC4aF_m|#gv z1f=`{@ML>f*S!kmEWkS#l`gXozff<-h8a}K5w z55=(i9F7yD%DyNlk3)Yb_H^Q7WbZ_*?QGN)GtG?9#C}=Opd9vjBf8?X)9J0)StkQ+ zeZ(^2b}nxJ(HJm5kCsr@qF>!Zrt3Eb3T>Kpy9x^WHpp$W0A`)@pxNX5JKk%W(Ot32rv3>pO$gb z@0iE%hSW{jAK1Y&g0(H~`yrz2;yNE}?&%rj`JI-`p-alN+4p_P5Aa=fS#hA=`-vzM zi@4BKdl@PQh%&A+2pL`IoqPWyoA55ft%rj;RLWp3QKW2ONV>zqST2Q!RakdHnwq1+ z8~pi=(D2H@m3W20GmBw4V*A~OYk-@CJX}^v49Fd)j~sxVii_x6?TB^}v~9NuYF3AM zcT=gi?>>(jr@l9rDt6+l}LtHpCEx3UWVD@-S~+)9P5JCjpB&GP@ov z(8-C7<#M@u>Lt8~687$`xBZQKu#K9`7!bNh_G=%9Z*z~=k(Z|T+2i``>mqrRRfX8r z6LEi|3dX~bSA@iw2j @!F~K*zdt6}^SHJI$N6u%AL` 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 z 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�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

@DEE4{kdq1)Pp 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 literal 0 HcmV?d00001 From 80a3e072be72c19ba58d1afe3169b20bf8ed8038 Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Tue, 10 Feb 2026 22:13:00 -0300 Subject: [PATCH 20/41] fix(ui): remove duplicate URL in tagsSpendLogsCall query string The template literal in the tags query parameter concatenation included `${url}` inside a `+=` assignment, causing the full URL to be doubled. Supersedes #8793 (original fix by @Mte90, now stale). Co-Authored-By: Claude Sonnet 4.5 --- ui/litellm-dashboard/src/components/networking.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index aa509c65aa4..8e92e4f79d7 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -2424,7 +2424,7 @@ export const tagsSpendLogsCall = async ( // if tags, convert the list to a comma separated string if (tags) { - url += `${url}&tags=${tags.join(",")}`; + url += `&tags=${tags.join(",")}`; } console.log("in tagsSpendLogsCall:", url); From 5f87e3bd28bf7a74df8d3c0fa14ca9c05f61ec46 Mon Sep 17 00:00:00 2001 From: Harshit Jain Date: Fri, 13 Feb 2026 18:07:27 +0530 Subject: [PATCH 21/41] fix: add project managemenet api with proper working --- litellm/proxy/_types.py | 115 +++-- litellm/proxy/auth/auth_checks.py | 284 +++++++++++- litellm/proxy/auth/user_api_key_auth.py | 43 +- .../key_management_endpoints.py | 79 ++++ .../management_endpoints/project_endpoints.py | 253 +++++++++-- .../test_project_endpoints_prisma.py | 415 ++++++++++++++++-- 6 files changed, 1025 insertions(+), 164 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 2cd67d81081..739a9d2736c 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -198,6 +198,7 @@ class Litellm_EntityType(enum.Enum): TEAM = "team" TEAM_MEMBER = "team_member" ORGANIZATION = "organization" + PROJECT = "project" TAG = "tag" # global proxy level entity @@ -851,9 +852,9 @@ class GenerateRequestBase(LiteLLMPydanticObjectBase): allowed_cache_controls: Optional[list] = [] config: Optional[dict] = {} permissions: Optional[dict] = {} - model_max_budget: Optional[dict] = ( - {} - ) # {"gpt-4": 5.0, "gpt-3.5-turbo": 5.0}, defaults to {} + model_max_budget: Optional[ + dict + ] = {} # {"gpt-4": 5.0, "gpt-3.5-turbo": 5.0}, defaults to {} model_config = ConfigDict(protected_namespaces=()) model_rpm_limit: Optional[dict] = None @@ -1405,12 +1406,12 @@ class NewCustomerRequest(BudgetNewRequest): blocked: bool = False # allow/disallow requests for this end-user budget_id: Optional[str] = None # give either a budget_id or max_budget spend: Optional[float] = None - allowed_model_region: Optional[AllowedModelRegion] = ( - None # require all user requests to use models in this specific region - ) - default_model: Optional[str] = ( - None # if no equivalent model in allowed region - default all requests to this model - ) + allowed_model_region: Optional[ + AllowedModelRegion + ] = None # require all user requests to use models in this specific region + default_model: Optional[ + str + ] = None # if no equivalent model in allowed region - default all requests to this model @model_validator(mode="before") @classmethod @@ -1432,12 +1433,12 @@ class UpdateCustomerRequest(LiteLLMPydanticObjectBase): blocked: bool = False # allow/disallow requests for this end-user max_budget: Optional[float] = None budget_id: Optional[str] = None # give either a budget_id or max_budget - allowed_model_region: Optional[AllowedModelRegion] = ( - None # require all user requests to use models in this specific region - ) - default_model: Optional[str] = ( - None # if no equivalent model in allowed region - default all requests to this model - ) + allowed_model_region: Optional[ + AllowedModelRegion + ] = None # require all user requests to use models in this specific region + default_model: Optional[ + str + ] = None # if no equivalent model in allowed region - default all requests to this model class DeleteCustomerRequest(LiteLLMPydanticObjectBase): @@ -1526,15 +1527,15 @@ class NewTeamRequest(TeamBase): ] = None # raise an error if 'guaranteed_throughput' is set and we're overallocating tpm model_tpm_limit: Optional[Dict[str, int]] = None - team_member_budget: Optional[float] = ( - None # allow user to set a budget for all team members - ) - team_member_rpm_limit: Optional[int] = ( - None # allow user to set RPM limit for all team members - ) - team_member_tpm_limit: Optional[int] = ( - None # allow user to set TPM limit for all team members - ) + team_member_budget: Optional[ + float + ] = None # allow user to set a budget for all team members + team_member_rpm_limit: Optional[ + int + ] = None # allow user to set RPM limit for all team members + team_member_tpm_limit: Optional[ + int + ] = None # allow user to set TPM limit for all team members team_member_key_duration: Optional[str] = None # e.g. "1d", "1w", "1m" allowed_vector_store_indexes: Optional[List[AllowedVectorStoreIndexItem]] = None @@ -1626,9 +1627,9 @@ class BlockKeyRequest(LiteLLMPydanticObjectBase): class AddTeamCallback(LiteLLMPydanticObjectBase): callback_name: str - callback_type: Optional[Literal["success", "failure", "success_and_failure"]] = ( - "success_and_failure" - ) + callback_type: Optional[ + Literal["success", "failure", "success_and_failure"] + ] = "success_and_failure" callback_vars: Dict[str, str] @model_validator(mode="before") @@ -1960,9 +1961,9 @@ class ConfigList(LiteLLMPydanticObjectBase): stored_in_db: Optional[bool] field_default_value: Any premium_field: bool = False - nested_fields: Optional[List[FieldDetail]] = ( - None # For nested dictionary or Pydantic fields - ) + nested_fields: Optional[ + List[FieldDetail] + ] = None # For nested dictionary or Pydantic fields class UserHeaderMapping(LiteLLMPydanticObjectBase): @@ -2403,9 +2404,9 @@ class LiteLLM_OrganizationMembershipTable(LiteLLMPydanticObjectBase): budget_id: Optional[str] = None created_at: datetime updated_at: datetime - user: Optional[Any] = ( - None # You might want to replace 'Any' with a more specific type if available - ) + user: Optional[ + Any + ] = None # You might want to replace 'Any' with a more specific type if available litellm_budget_table: Optional[LiteLLM_BudgetTable] = None model_config = ConfigDict(protected_namespaces=()) @@ -2615,25 +2616,10 @@ class NewProjectResponse(LiteLLM_ProjectTable): updated_at: datetime -class LiteLLM_ProjectTableCachedObj(LiteLLMPydanticObjectBase): - """Cached version for auth checks""" +class LiteLLM_ProjectTableCachedObj(LiteLLM_ProjectTable): + """Cached version for auth checks. Mirrors LiteLLM_TeamTableCachedObj pattern.""" - project_id: str - project_alias: Optional[str] = None - description: Optional[str] = None - team_id: Optional[str] = None - budget_id: Optional[str] = None - metadata: Optional[dict] = None - models: List[str] = [] - spend: float = 0.0 - model_spend: Optional[dict] = None - model_rpm_limit: Optional[dict] = None - model_tpm_limit: Optional[dict] = None - blocked: bool = False - object_permission_id: Optional[str] = None - litellm_budget_table: Optional[LiteLLM_BudgetTable] = None - created_at: Optional[datetime] = None - updated_at: Optional[datetime] = None + last_refreshed_at: Optional[float] = None class LiteLLM_UserTableFiltered(BaseModel): # done to avoid exposing sensitive data @@ -3228,6 +3214,11 @@ class ProxyErrorTypes(str, enum.Enum): Organization does not have access to the model """ + project_model_access_denied = "project_model_access_denied" + """ + Project does not have access to the model + """ + expired_key = "expired_key" """ Key has expired @@ -3290,7 +3281,7 @@ class ProxyErrorTypes(str, enum.Enum): @classmethod def get_model_access_error_type_for_object( - cls, object_type: Literal["key", "user", "team", "org"] + cls, object_type: Literal["key", "user", "team", "org", "project"] ) -> "ProxyErrorTypes": """ Get the model access error type for object_type @@ -3303,6 +3294,8 @@ class ProxyErrorTypes(str, enum.Enum): return cls.user_model_access_denied elif object_type == "org": return cls.org_model_access_denied + elif object_type == "project": + return cls.project_model_access_denied @classmethod def get_vector_store_access_error_type_for_object( @@ -3507,9 +3500,9 @@ class TeamModelDeleteRequest(BaseModel): # Organization Member Requests class OrganizationMemberAddRequest(OrgMemberAddRequest): organization_id: str - max_budget_in_organization: Optional[float] = ( - None # Users max budget within the organization - ) + max_budget_in_organization: Optional[ + float + ] = None # Users max budget within the organization class OrganizationMemberDeleteRequest(MemberDeleteRequest): @@ -3727,9 +3720,9 @@ class ProviderBudgetResponse(LiteLLMPydanticObjectBase): Maps provider names to their budget configs. """ - providers: Dict[str, ProviderBudgetResponseObject] = ( - {} - ) # Dictionary mapping provider names to their budget configurations + providers: Dict[ + str, ProviderBudgetResponseObject + ] = {} # Dictionary mapping provider names to their budget configurations class ProxyStateVariables(TypedDict): @@ -3872,9 +3865,9 @@ class LiteLLM_JWTAuth(LiteLLMPydanticObjectBase): enforce_rbac: bool = False roles_jwt_field: Optional[str] = None # v2 on role mappings role_mappings: Optional[List[RoleMapping]] = None - object_id_jwt_field: Optional[str] = ( - None # can be either user / team, inferred from the role mapping - ) + object_id_jwt_field: Optional[ + str + ] = None # can be either user / team, inferred from the role mapping scope_mappings: Optional[List[ScopeMapping]] = None enforce_scope_based_access: bool = False enforce_team_based_model_access: bool = False diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py index 76ec67ab10e..dc5d5d749b1 100644 --- a/litellm/proxy/auth/auth_checks.py +++ b/litellm/proxy/auth/auth_checks.py @@ -39,6 +39,7 @@ from litellm.proxy._types import ( LiteLLM_ObjectPermissionTable, LiteLLM_OrganizationMembershipTable, LiteLLM_OrganizationTable, + LiteLLM_ProjectTableCachedObj, LiteLLM_TagTable, LiteLLM_TeamMembership, LiteLLM_TeamTable, @@ -75,6 +76,7 @@ db_cache_expiry = DEFAULT_IN_MEMORY_TTL # refresh every 5s all_routes = LiteLLMRoutes.openai_routes.value + LiteLLMRoutes.management_routes.value + def _log_budget_lookup_failure(entity: str, error: Exception) -> None: """ Log a warning when budget lookup fails; cache will not be populated. @@ -92,38 +94,41 @@ def _log_budget_lookup_failure(entity: str, error: Exception) -> None: x in err_str for x in ("column", "schema", "does not exist", "prisma", "migrate") ): - hint = " Run `prisma db push` or `prisma migrate deploy` to fix schema mismatches." + hint = ( + " Run `prisma db push` or `prisma migrate deploy` to fix schema mismatches." + ) verbose_proxy_logger.error( f"Budget lookup failed for {entity}; cache will not be populated. " f"Each request will hit the database. Error: {error}.{hint}" ) + def _is_model_cost_zero( model: Optional[Union[str, List[str]]], llm_router: Optional[Router] ) -> bool: """ Check if a model has zero cost (no configured pricing). - + Uses the router's get_model_group_info method to get pricing information. - + Args: model: The model name or list of model names llm_router: The LiteLLM router instance - + Returns: bool: True if all costs for the model are zero, False otherwise """ if model is None or llm_router is None: return False - + # Handle list of models model_list = [model] if isinstance(model, str) else model - + for model_name in model_list: try: # Use router's get_model_group_info method directly for better reliability model_group_info = llm_router.get_model_group_info(model_group=model_name) - + if model_group_info is None: # Model not found or no pricing info available # Conservative approach: assume it has cost @@ -131,42 +136,87 @@ def _is_model_cost_zero( f"No model group info found for {model_name}, assuming it has cost" ) return False - + # Check costs for this model # Only allow bypass if BOTH costs are explicitly set to 0 (not None) input_cost = model_group_info.input_cost_per_token output_cost = model_group_info.output_cost_per_token - + # If costs are not explicitly configured (None), assume it has cost if input_cost is None or output_cost is None: verbose_proxy_logger.debug( f"Model {model_name} has undefined cost (input: {input_cost}, output: {output_cost}), assuming it has cost" ) return False - + # If either cost is non-zero, return False if input_cost > 0 or output_cost > 0: verbose_proxy_logger.debug( f"Model {model_name} has non-zero cost (input: {input_cost}, output: {output_cost})" ) return False - + # This model has zero cost explicitly configured verbose_proxy_logger.debug( f"Model {model_name} has zero cost explicitly configured (input: {input_cost}, output: {output_cost})" ) - + except Exception as e: # If we can't determine the cost, assume it has cost (conservative approach) verbose_proxy_logger.debug( f"Error checking cost for model {model_name}: {str(e)}, assuming it has cost" ) return False - + # All models checked have zero cost return True +async def _run_project_checks( + project_object: Optional[LiteLLM_ProjectTableCachedObj], + _model: Optional[Union[str, List[str]]], + llm_router: Optional[Router], + skip_budget_checks: bool, + valid_token: Optional[UserAPIKeyAuth], + proxy_logging_obj: ProxyLogging, +) -> None: + """ + Run all project-level checks: blocked, model access, budget, soft budget. + Extracted from common_checks() to keep statement count manageable. + """ + if project_object is None: + return + + # 1.1. If project is blocked + if project_object.blocked is True: + raise Exception( + f"Project={project_object.project_id} is blocked. Update via `/project/update` if you're an admin." + ) + + # 2.2 If project can call model + if _model and len(project_object.models) > 0: + can_project_access_model( + model=_model, + project_object=project_object, + llm_router=llm_router, + ) + + if not skip_budget_checks: + # 3.0.2. If project is in budget + await _project_max_budget_check( + project_object=project_object, + valid_token=valid_token, + proxy_logging_obj=proxy_logging_obj, + ) + + # 3.0.3. If project is over soft budget (alert only, doesn't block) + await _project_soft_budget_check( + project_object=project_object, + valid_token=valid_token, + proxy_logging_obj=proxy_logging_obj, + ) + + async def common_checks( request_body: dict, team_object: Optional[LiteLLM_TeamTable], @@ -180,13 +230,18 @@ async def common_checks( valid_token: Optional[UserAPIKeyAuth], request: Request, skip_budget_checks: bool = False, + project_object: Optional[LiteLLM_ProjectTableCachedObj] = None, ) -> bool: """ Common checks across jwt + key-based auth. 1. If team is blocked + 1.1. If project is blocked 2. If team can call model + 2.2 If project can call model 3. If team is in budget + 3.0.2. If project is in budget + 3.0.3. If project is over soft budget (alert only) 4. If user passed in (JWT or key.user_id) - is in budget 5. If end_user (either via JWT or 'user' passed to /chat/completions, /embeddings endpoint) is in budget 6. [OPTIONAL] If 'enforce_end_user' enabled - did developer pass in 'user' param for openai endpoints @@ -231,6 +286,16 @@ async def common_checks( user_object=user_object, ) + # 1.1 - 2.2 - 3.0.2 - 3.0.3: Project checks (blocked, model access, budget) + await _run_project_checks( + project_object=project_object, + _model=_model, + llm_router=llm_router, + skip_budget_checks=skip_budget_checks, + valid_token=valid_token, + proxy_logging_obj=proxy_logging_obj, + ) + # If this is a free model, skip all budget checks if not skip_budget_checks: # 3. If team is in budget @@ -290,7 +355,10 @@ async def common_checks( ) # 5. If end_user ('user' passed to /chat/completions, /embeddings endpoint) is in budget - if end_user_object is not None and end_user_object.litellm_budget_table is not None: + if ( + end_user_object is not None + and end_user_object.litellm_budget_table is not None + ): end_user_budget = end_user_object.litellm_budget_table.max_budget if end_user_budget is not None and end_user_object.spend > end_user_budget: raise litellm.BudgetExceededError( @@ -1368,7 +1436,7 @@ async def _get_team_object_from_user_api_key_cache( raise Exception _response = LiteLLM_TeamTableCachedObj(**response.dict()) - + # Load object_permission if object_permission_id exists but object_permission is not loaded if _response.object_permission_id and not _response.object_permission: try: @@ -1383,7 +1451,7 @@ async def _get_team_object_from_user_api_key_cache( verbose_proxy_logger.debug( f"Failed to load object_permission for team {team_id} with object_permission_id={_response.object_permission_id}: {e}" ) - + # save the team object to cache await _cache_team_object( team_id=team_id, @@ -2069,7 +2137,7 @@ def _can_object_call_model( models: List[str], team_model_aliases: Optional[Dict[str, str]] = None, team_id: Optional[str] = None, - object_type: Literal["user", "team", "key", "org"] = "user", + object_type: Literal["user", "team", "key", "org", "project"] = "user", fallback_depth: int = 0, ) -> Literal[True]: """ @@ -2220,6 +2288,24 @@ def can_team_access_model( ) +def can_project_access_model( + model: Union[str, List[str]], + project_object: LiteLLM_ProjectTableCachedObj, + llm_router: Optional[Router], +) -> Literal[True]: + """ + Returns True if the project can access a specific model. + + Raises ProxyException if access is denied. + """ + return _can_object_call_model( + model=model, + llm_router=llm_router, + models=project_object.models if project_object else [], + object_type="project", + ) + + async def can_user_call_model( model: Union[str, List[str]], llm_router: Optional[Router], @@ -2520,14 +2606,26 @@ async def _team_soft_budget_check( if valid_token: # Extract alert emails from team metadata alert_emails: Optional[List[str]] = None - if team_object.metadata is not None and isinstance(team_object.metadata, dict): - soft_budget_alert_emails = team_object.metadata.get("soft_budget_alerting_emails") + if team_object.metadata is not None and isinstance( + team_object.metadata, dict + ): + soft_budget_alert_emails = team_object.metadata.get( + "soft_budget_alerting_emails" + ) if soft_budget_alert_emails is not None: if isinstance(soft_budget_alert_emails, list): - alert_emails = [email for email in soft_budget_alert_emails if isinstance(email, str) and email.strip()] + alert_emails = [ + email + for email in soft_budget_alert_emails + if isinstance(email, str) and email.strip() + ] elif isinstance(soft_budget_alert_emails, str): # Handle comma-separated string - alert_emails = [email.strip() for email in soft_budget_alert_emails.split(",") if email.strip()] + alert_emails = [ + email.strip() + for email in soft_budget_alert_emails.split(",") + if email.strip() + ] # Filter out empty strings if alert_emails: alert_emails = [email for email in alert_emails if email] @@ -2566,6 +2664,150 @@ async def _team_soft_budget_check( ) +async def _project_max_budget_check( + project_object: Optional[LiteLLM_ProjectTableCachedObj], + valid_token: Optional[UserAPIKeyAuth], + proxy_logging_obj: ProxyLogging, +): + """ + Check if the project is over its max budget. + + Raises: + BudgetExceededError if the project is over its max budget. + Triggers a budget alert if the project is over its max budget. + """ + if project_object is None: + return + + max_budget = None + if project_object.litellm_budget_table is not None: + max_budget = project_object.litellm_budget_table.max_budget + + if ( + max_budget is not None + and project_object.spend is not None + and project_object.spend > max_budget + ): + if valid_token: + call_info = CallInfo( + token=valid_token.token, + spend=project_object.spend, + max_budget=max_budget, + user_id=valid_token.user_id, + team_id=valid_token.team_id, + team_alias=valid_token.team_alias, + organization_id=valid_token.org_id, + event_group=Litellm_EntityType.PROJECT, + ) + asyncio.create_task( + proxy_logging_obj.budget_alerts( + type="project_budget", + user_info=call_info, + ) + ) + + raise litellm.BudgetExceededError( + current_cost=project_object.spend, + max_budget=max_budget, + message=f"Budget has been exceeded! Project={project_object.project_id} Current cost: {project_object.spend}, Max budget: {max_budget}", + ) + + +async def _project_soft_budget_check( + project_object: Optional[LiteLLM_ProjectTableCachedObj], + valid_token: Optional[UserAPIKeyAuth], + proxy_logging_obj: ProxyLogging, +): + """ + Triggers a budget alert if the project is over its soft budget. + + Mirrors _team_soft_budget_check() pattern. + """ + if project_object is None: + return + + soft_budget = None + if project_object.litellm_budget_table is not None: + soft_budget = project_object.litellm_budget_table.soft_budget + + if ( + soft_budget is not None + and project_object.spend is not None + and project_object.spend >= soft_budget + ): + verbose_proxy_logger.debug( + "Crossed Soft Budget for project %s, spend %s, soft_budget %s", + project_object.project_id, + project_object.spend, + soft_budget, + ) + if valid_token: + call_info = CallInfo( + token=valid_token.token, + spend=project_object.spend, + max_budget=None, + soft_budget=soft_budget, + user_id=valid_token.user_id, + team_id=valid_token.team_id, + team_alias=valid_token.team_alias, + organization_id=valid_token.org_id, + event_group=Litellm_EntityType.PROJECT, + ) + asyncio.create_task( + proxy_logging_obj.budget_alerts( + type="soft_budget", + user_info=call_info, + ) + ) + + +async def get_project_object( + project_id: str, + prisma_client: Optional[PrismaClient], + user_api_key_cache: DualCache, + proxy_logging_obj: Optional[ProxyLogging] = None, +) -> Optional[LiteLLM_ProjectTableCachedObj]: + """ + Fetch project object from cache or DB. + + Follows get_team_object() caching pattern with TTL and last_refreshed_at. + + Returns LiteLLM_ProjectTableCachedObj or None if not found. + """ + if prisma_client is None: + return None + + # Check cache first + cache_key = "project_id:{}".format(project_id) + cached_obj = await user_api_key_cache.async_get_cache(key=cache_key) + if cached_obj is not None: + if isinstance(cached_obj, dict): + return LiteLLM_ProjectTableCachedObj(**cached_obj) + elif isinstance(cached_obj, LiteLLM_ProjectTableCachedObj): + return cached_obj + + # Fetch from DB + project_row = await prisma_client.db.litellm_projecttable.find_unique( + where={"project_id": project_id}, + include={"litellm_budget_table": True}, + ) + if project_row is None: + return None + + project_obj = LiteLLM_ProjectTableCachedObj(**project_row.model_dump()) + + # Cache with TTL following _cache_management_object pattern + project_obj.last_refreshed_at = time.time() + await _cache_management_object( + key=cache_key, + value=project_obj, + user_api_key_cache=user_api_key_cache, + proxy_logging_obj=proxy_logging_obj, + ) + + return project_obj + + async def _organization_max_budget_check( valid_token: Optional[UserAPIKeyAuth], team_object: Optional[LiteLLM_TeamTable], diff --git a/litellm/proxy/auth/user_api_key_auth.py b/litellm/proxy/auth/user_api_key_auth.py index 42f10ff8598..fc61f2b05c7 100644 --- a/litellm/proxy/auth/user_api_key_auth.py +++ b/litellm/proxy/auth/user_api_key_auth.py @@ -36,6 +36,7 @@ from litellm.proxy.auth.auth_checks import ( common_checks, get_end_user_object, get_key_object, + get_project_object, get_team_object, get_user_object, is_valid_fallback_model, @@ -120,12 +121,12 @@ def _get_bearer_token_or_received_api_key(api_key: str) -> str: # Handle AWS Signature V4 format from LangChain # Format: AWS4-HMAC-SHA256 Credential=Bearer sk-12345/date/region/service/aws4_request, SignedHeaders=..., Signature=... # Extract the Bearer token from the Credential field - match = re.search(r'Credential=Bearer\s+([^/\s,]+)', api_key) + match = re.search(r"Credential=Bearer\s+([^/\s,]+)", api_key) if match: api_key = match.group(1) else: # If no Bearer token found in Credential, try to extract just the credential value - match = re.search(r'Credential=([^/\s,]+)', api_key) + match = re.search(r"Credential=([^/\s,]+)", api_key) if match: api_key = match.group(1) @@ -145,12 +146,12 @@ def _get_bearer_token( # Handle AWS Signature V4 format from LangChain # Format: AWS4-HMAC-SHA256 Credential=Bearer sk-12345/date/region/service/aws4_request, SignedHeaders=..., Signature=... # Extract the Bearer token from the Credential field - match = re.search(r'Credential=Bearer\s+([^/\s,]+)', api_key) + match = re.search(r"Credential=Bearer\s+([^/\s,]+)", api_key) if match: api_key = match.group(1) else: # If no Bearer token found in Credential, try to extract just the credential value - match = re.search(r'Credential=([^/\s,]+)', api_key) + match = re.search(r"Credential=([^/\s,]+)", api_key) if match: api_key = match.group(1) else: @@ -274,7 +275,9 @@ async def get_global_proxy_spend( proxy_logging_obj: ProxyLogging, ) -> Optional[float]: global_proxy_spend = None - if litellm.max_budget > 0 and prisma_client is not None: # user set proxy max budget + if ( + litellm.max_budget > 0 and prisma_client is not None + ): # user set proxy max budget # Use event-driven coordination to prevent cache stampede cache_key = "{}:spend".format(litellm_proxy_admin_name) global_proxy_spend = await _fetch_global_spend_with_event_coordination( @@ -631,13 +634,13 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 if team_object is not None else None, ) - + # Check if model has zero cost - if so, skip all budget checks model = get_model_from_request(request_data, route) skip_budget_checks = False if model is not None and llm_router is not None: from litellm.proxy.auth.auth_checks import _is_model_cost_zero - + skip_budget_checks = _is_model_cost_zero( model=model, llm_router=llm_router ) @@ -645,7 +648,17 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 verbose_proxy_logger.info( f"Skipping all budget checks for zero-cost model: {model}" ) - + + # Fetch project object for JWT path if project_id is set + _jwt_project_obj = None + if valid_token.project_id is not None: + _jwt_project_obj = await get_project_object( + project_id=valid_token.project_id, + prisma_client=prisma_client, + user_api_key_cache=user_api_key_cache, + proxy_logging_obj=proxy_logging_obj, + ) + # run through common checks _ = await common_checks( request=request, @@ -660,6 +673,7 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 proxy_logging_obj=proxy_logging_obj, valid_token=valid_token, skip_budget_checks=skip_budget_checks, + project_object=_jwt_project_obj, ) # return UserAPIKeyAuth object @@ -1056,7 +1070,7 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 skip_budget_checks = False if model is not None and llm_router is not None: from litellm.proxy.auth.auth_checks import _is_model_cost_zero - + skip_budget_checks = _is_model_cost_zero( model=model, llm_router=llm_router ) @@ -1192,6 +1206,16 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 key=valid_token.team_id, value=_team_obj ) # save team table in cache - used for tpm/rpm limiting - tpm_rpm_limiter.py + # Fetch project object if key belongs to a project + _project_obj = None + if valid_token.project_id is not None: + _project_obj = await get_project_object( + project_id=valid_token.project_id, + prisma_client=prisma_client, + user_api_key_cache=user_api_key_cache, + proxy_logging_obj=proxy_logging_obj, + ) + global_proxy_spend = None if ( litellm.max_budget > 0 and prisma_client is not None @@ -1231,6 +1255,7 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 proxy_logging_obj=proxy_logging_obj, valid_token=valid_token, skip_budget_checks=skip_budget_checks, + project_object=_project_obj, ) # Token passed all checks if valid_token is None: diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index cbb271f860b..c6c03a119cb 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -43,6 +43,7 @@ from litellm.proxy.auth.auth_checks import ( can_team_access_model, get_key_object, get_org_object, + get_project_object, get_team_object, ) from litellm.proxy.auth.auth_utils import abbreviate_api_key @@ -881,6 +882,61 @@ async def _check_team_key_limits( ) +async def _check_project_key_limits( + project_id: str, + data: Union[GenerateKeyRequest, UpdateKeyRequest], + prisma_client: PrismaClient, + user_api_key_cache: DualCache, +) -> None: + """ + Validate that key's models and budget respect its project's limits. + + - Key models must be a subset of project models + - Key max_budget must be <= project max_budget + """ + project_obj = await get_project_object( + project_id=project_id, + prisma_client=prisma_client, + user_api_key_cache=user_api_key_cache, + ) + + if project_obj is None: + raise HTTPException( + status_code=404, + detail={"error": f"Project not found, project_id={project_id}"}, + ) + + # Validate key models are a subset of project models + if data.models and len(project_obj.models) > 0: + for m in data.models: + if m not in project_obj.models: + raise HTTPException( + status_code=400, + detail={ + "error": f"Model '{m}' not in project's allowed models. Project allowed models={project_obj.models}. Project: {project_id}" + }, + ) + + # Validate key max_budget <= project max_budget + project_max_budget = None + if project_obj.litellm_budget_table is not None: + project_max_budget = getattr( + project_obj.litellm_budget_table, "max_budget", None + ) + + if ( + data.max_budget is not None + and project_max_budget is not None + and data.max_budget > project_max_budget + ): + raise HTTPException( + status_code=400, + detail={ + "error": f"Key max_budget ({data.max_budget}) exceeds project's max_budget ({project_max_budget}). Project: {project_id}" + }, + ) + + def check_org_key_model_specific_limits( keys: List[LiteLLM_VerificationToken], org_table: LiteLLM_OrganizationTable, @@ -1135,6 +1191,15 @@ async def generate_key_fn( prisma_client=prisma_client, ) + # Validate key against project limits if project_id is set + if data.project_id is not None: + await _check_project_key_limits( + project_id=data.project_id, + data=data, + prisma_client=prisma_client, + user_api_key_cache=user_api_key_cache, + ) + return await _common_key_generation_helper( data=data, user_api_key_dict=user_api_key_dict, @@ -1808,6 +1873,20 @@ async def update_key_fn( prisma_client=prisma_client, ) + # Validate key against project limits if project_id is being set + _project_id_to_check = getattr(data, "project_id", None) or getattr( + existing_key_row, "project_id", None + ) + if _project_id_to_check is not None and ( + data.models is not None or data.max_budget is not None + ): + await _check_project_key_limits( + project_id=_project_id_to_check, + data=data, + prisma_client=prisma_client, + user_api_key_cache=user_api_key_cache, + ) + # if team change - check if this is possible if is_different_team(data=data, existing_key_row=existing_key_row): if llm_router is None: diff --git a/litellm/proxy/management_endpoints/project_endpoints.py b/litellm/proxy/management_endpoints/project_endpoints.py index b6c51d34221..ba3238ebfd5 100644 --- a/litellm/proxy/management_endpoints/project_endpoints.py +++ b/litellm/proxy/management_endpoints/project_endpoints.py @@ -11,23 +11,19 @@ Endpoints for /project operations #### PROJECT MANAGEMENT #### import json -from typing import List, Optional +from typing import List, Optional, Union -from fastapi import APIRouter, Depends, HTTPException, Request, status +from fastapi import APIRouter, Depends, HTTPException, Request from litellm._logging import verbose_proxy_logger from litellm._uuid import uuid from litellm.proxy._types import * from litellm.proxy.auth.user_api_key_auth import user_api_key_auth from litellm.proxy.management_endpoints.common_utils import _set_object_metadata_field -from litellm.proxy.management_helpers.object_permission_utils import ( - handle_update_object_permission_common, -) from litellm.proxy.management_helpers.utils import ( management_endpoint_wrapper, ) from litellm.proxy.utils import PrismaClient, handle_exception_on_proxy -from litellm.utils import _update_dictionary router = APIRouter() @@ -37,31 +33,37 @@ async def _check_user_permission_for_project( team_id: Optional[str], prisma_client: PrismaClient, require_admin: bool = False, + team_object: Optional[LiteLLM_TeamTable] = None, ) -> bool: """ Check if user has permission to manage a project. - + Returns True if user is proxy admin or team admin (when team_id provided). If require_admin=True, only proxy admins are allowed. + + If team_object is provided, it will be used instead of fetching from DB + (avoids duplicate DB queries when team was already fetched for validation). """ is_proxy_admin = user_api_key_dict.user_role == LitellmUserRoles.PROXY_ADMIN - + if require_admin: return is_proxy_admin - + if is_proxy_admin: return True - + if not team_id or not user_api_key_dict.user_id: return False - - team = await prisma_client.db.litellm_teamtable.find_unique( - where={"team_id": team_id} - ) - + + team = team_object + if team is None: + team = await prisma_client.db.litellm_teamtable.find_unique( + where={"team_id": team_id} + ) + if team and team.admins: return user_api_key_dict.user_id in team.admins - + return False @@ -69,11 +71,11 @@ async def _validate_team_exists( team_id: str, prisma_client: PrismaClient, ): - """Validate that a team exists.""" + """Validate that a team exists. Returns the team row.""" team = await prisma_client.db.litellm_teamtable.find_unique( - where={"team_id": team_id} + where={"team_id": team_id}, ) - + if team is None: raise ProxyException( message=f"Team not found, team_id={team_id}", @@ -81,10 +83,110 @@ async def _validate_team_exists( code=404, param="team_id", ) - + return team +def _check_team_project_limits( + team_object: LiteLLM_TeamTable, + data: Union[NewProjectRequest, UpdateProjectRequest], +) -> None: + """ + Check that project limits respect its parent Team's limits. + + Mirrors _check_org_team_limits() from team_endpoints.py. + + Validates: + - Project models are a subset of Team models + - Project max_budget <= Team max_budget + - Project tpm_limit <= Team tpm_limit + - Project rpm_limit <= Team rpm_limit + - Budget values are non-negative + - soft_budget < max_budget + """ + # --- Budget non-negativity checks --- + if data.max_budget is not None and data.max_budget < 0: + raise HTTPException( + status_code=400, + detail={ + "error": f"max_budget cannot be negative. Received: {data.max_budget}" + }, + ) + if data.soft_budget is not None and data.soft_budget < 0: + raise HTTPException( + status_code=400, + detail={ + "error": f"soft_budget cannot be negative. Received: {data.soft_budget}" + }, + ) + + # --- soft_budget < max_budget --- + if data.soft_budget is not None and data.max_budget is not None: + if data.soft_budget >= data.max_budget: + raise HTTPException( + status_code=400, + detail={ + "error": f"soft_budget ({data.soft_budget}) must be strictly lower than max_budget ({data.max_budget})" + }, + ) + + # --- Validate project models are a subset of team models --- + project_models = getattr(data, "models", None) + team_models = team_object.models or [] + if project_models and len(team_models) > 0: + # If team has 'all-proxy-models', skip validation as it allows all models + if SpecialModelNames.all_proxy_models.value not in team_models: + for m in project_models: + if m not in team_models: + raise HTTPException( + status_code=400, + detail={ + "error": f"Model '{m}' not in team's allowed models. Team allowed models={team_models}. Team: {team_object.team_id}" + }, + ) + + # --- Validate project max_budget <= team max_budget --- + # Team stores budget fields directly (max_budget, tpm_limit, rpm_limit) + # unlike Project which uses a separate LiteLLM_BudgetTable relation + if ( + data.max_budget is not None + and team_object.max_budget is not None + and data.max_budget > team_object.max_budget + ): + raise HTTPException( + status_code=400, + detail={ + "error": f"Project max_budget ({data.max_budget}) exceeds team's max_budget ({team_object.max_budget}). Team: {team_object.team_id}" + }, + ) + + # --- Validate project tpm_limit <= team tpm_limit --- + if ( + data.tpm_limit is not None + and team_object.tpm_limit is not None + and data.tpm_limit > team_object.tpm_limit + ): + raise HTTPException( + status_code=400, + detail={ + "error": f"Project tpm_limit ({data.tpm_limit}) exceeds team's tpm_limit ({team_object.tpm_limit}). Team: {team_object.team_id}" + }, + ) + + # --- Validate project rpm_limit <= team rpm_limit --- + if ( + data.rpm_limit is not None + and team_object.rpm_limit is not None + and data.rpm_limit > team_object.rpm_limit + ): + raise HTTPException( + status_code=400, + detail={ + "error": f"Project rpm_limit ({data.rpm_limit}) exceeds team's rpm_limit ({team_object.rpm_limit}). Team: {team_object.team_id}" + }, + ) + + async def _create_budget_for_project( data: NewProjectRequest, user_id: Optional[str], @@ -96,9 +198,9 @@ async def _create_budget_for_project( _json_data = data.json(exclude_none=True) _budget_data = {k: v for k, v in _json_data.items() if k in budget_params} budget_row = LiteLLM_BudgetTable(**_budget_data) - + new_budget = prisma_client.jsonify_object(budget_row.json(exclude_none=True)) - + _budget = await prisma_client.db.litellm_budgettable.create( data={ **new_budget, @@ -106,7 +208,7 @@ async def _create_budget_for_project( "updated_by": user_id or litellm_proxy_admin_name, } ) - + return _budget.budget_id @@ -137,7 +239,7 @@ def _remove_budget_fields_from_project_data(project_data: dict) -> dict: Remove budget fields from project data. Budget fields belong to LiteLLM_BudgetTable, not LiteLLM_ProjectTable. Keep budget_id as it's a foreign key. - + Following the pattern from organization_endpoints.py """ budget_fields = LiteLLM_BudgetTable.model_fields.keys() @@ -232,18 +334,36 @@ async def new_project( """ from litellm.proxy.proxy_server import ( litellm_proxy_admin_name, + premium_user, prisma_client, ) try: + if not premium_user: + raise HTTPException( + status_code=403, + detail={ + "error": "Project management is an enterprise feature. " + + CommonProxyErrors.not_premium_user.value + }, + ) + if prisma_client is None: raise HTTPException( status_code=500, detail={"error": CommonProxyErrors.db_not_connected_error.value}, ) - # Validate team exists - await _validate_team_exists(team_id=data.team_id, prisma_client=prisma_client) + # Validate team exists and get team object with budget + team_object = await _validate_team_exists( + team_id=data.team_id, prisma_client=prisma_client + ) + + # Validate project limits against team limits + _check_team_project_limits( + team_object=LiteLLM_TeamTable(**team_object.model_dump()), + data=data, + ) # Check if user has permission to create projects for this team # only team admins can create projects for their team @@ -251,8 +371,9 @@ async def new_project( user_api_key_dict=user_api_key_dict, team_id=data.team_id, prisma_client=prisma_client, + team_object=LiteLLM_TeamTable(**team_object.model_dump()), ) - + if not has_permission: raise HTTPException( status_code=403, @@ -311,10 +432,10 @@ async def new_project( new_project_row = prisma_client.jsonify_object( project_row.json(exclude_none=True) ) - + # Remove budget fields (following organization_endpoints.py pattern) new_project_row = _remove_budget_fields_from_project_data(new_project_row) - + verbose_proxy_logger.info( f"new_project_row: {json.dumps(new_project_row, indent=2)}" ) @@ -388,10 +509,20 @@ async def update_project( """ from litellm.proxy.proxy_server import ( litellm_proxy_admin_name, + premium_user, prisma_client, ) try: + if not premium_user: + raise HTTPException( + status_code=403, + detail={ + "error": "Project management is an enterprise feature. " + + CommonProxyErrors.not_premium_user.value + }, + ) + if prisma_client is None: raise HTTPException( status_code=500, @@ -417,23 +548,43 @@ async def update_project( param="project_id", ) + # Validate team exists and get team object for limit + permission checks + team_id_to_check = data.team_id or existing_project.team_id + team_obj_for_checks = None + if team_id_to_check is not None: + team_obj_for_checks = await _validate_team_exists( + team_id=team_id_to_check, prisma_client=prisma_client + ) + # Check if user has permission to update this project has_permission = await _check_user_permission_for_project( user_api_key_dict=user_api_key_dict, team_id=existing_project.team_id, prisma_client=prisma_client, + team_object=LiteLLM_TeamTable(**team_obj_for_checks.model_dump()) + if team_obj_for_checks + else None, ) - + if not has_permission: raise HTTPException( status_code=403, detail={"error": "Only admins or team admins can update projects"}, ) + # Validate project limits against team limits + if team_obj_for_checks is not None: + _check_team_project_limits( + team_object=LiteLLM_TeamTable(**team_obj_for_checks.model_dump()), + data=data, + ) + # Prepare update data update_data = data.json(exclude_none=True, exclude={"project_id"}) update_data = prisma_client.jsonify_object(update_data) - update_data["updated_by"] = user_api_key_dict.user_id or litellm_proxy_admin_name + update_data["updated_by"] = ( + user_api_key_dict.user_id or litellm_proxy_admin_name + ) # Handle budget updates budget_fields = LiteLLM_BudgetTable.model_fields.keys() @@ -459,15 +610,21 @@ async def update_project( if existing_project.object_permission_id: # Update existing permission await prisma_client.db.litellm_objectpermissiontable.update( - where={"object_permission_id": existing_project.object_permission_id}, + where={ + "object_permission_id": existing_project.object_permission_id + }, data=object_permission_data, ) else: # Create new permission - created_permission = await prisma_client.db.litellm_objectpermissiontable.create( - data=object_permission_data, + created_permission = ( + await prisma_client.db.litellm_objectpermissiontable.create( + data=object_permission_data, + ) ) - update_data["object_permission_id"] = created_permission.object_permission_id + update_data[ + "object_permission_id" + ] = created_permission.object_permission_id # Handle metadata fields for field in LiteLLM_ManagementEndpoint_MetadataFields: @@ -524,9 +681,18 @@ async def delete_project( }' ``` """ - from litellm.proxy.proxy_server import prisma_client + from litellm.proxy.proxy_server import premium_user, prisma_client try: + if not premium_user: + raise HTTPException( + status_code=403, + detail={ + "error": "Project management is an enterprise feature. " + + CommonProxyErrors.not_premium_user.value + }, + ) + if prisma_client is None: raise HTTPException( status_code=500, @@ -540,7 +706,7 @@ async def delete_project( prisma_client=prisma_client, require_admin=True, ) - + if not has_permission: raise HTTPException( status_code=403, @@ -564,8 +730,10 @@ async def delete_project( ) # Check if there are any keys associated with this project - associated_keys = await prisma_client.db.litellm_verificationtoken.find_many( - where={"project_id": project_id} + associated_keys = ( + await prisma_client.db.litellm_verificationtoken.find_many( + where={"project_id": project_id} + ) ) if len(associated_keys) > 0: @@ -641,15 +809,15 @@ async def project_info( # Check if user has access to this project (admin or team member) is_admin = user_api_key_dict.user_role == LitellmUserRoles.PROXY_ADMIN is_team_member = False - + if project.team_id and user_api_key_dict.user_id: team = await prisma_client.db.litellm_teamtable.find_unique( where={"team_id": project.team_id} ) if team: is_team_member = ( - user_api_key_dict.user_id in team.admins or - user_api_key_dict.user_id in team.members + user_api_key_dict.user_id in team.admins + or user_api_key_dict.user_id in team.members ) if not (is_admin or is_team_member): @@ -726,4 +894,3 @@ async def list_projects( ) ) raise handle_exception_on_proxy(e) - diff --git a/tests/proxy_unit_tests/test_project_endpoints_prisma.py b/tests/proxy_unit_tests/test_project_endpoints_prisma.py index daa3af2d67a..c2366139b01 100644 --- a/tests/proxy_unit_tests/test_project_endpoints_prisma.py +++ b/tests/proxy_unit_tests/test_project_endpoints_prisma.py @@ -2,23 +2,15 @@ import os import sys import traceback from litellm._uuid import uuid -from datetime import datetime, timezone from unittest import mock from dotenv import load_dotenv from fastapi import Request -from fastapi.routing import APIRoute -import httpx load_dotenv() -import io -import os import time -sys.path.insert( - 0, os.path.abspath("../..") -) -import asyncio +sys.path.insert(0, os.path.abspath("../..")) import logging import pytest @@ -27,8 +19,6 @@ import litellm from litellm._logging import verbose_proxy_logger from litellm.proxy.management_endpoints.team_endpoints import ( new_team, - team_info, - update_team, ) from litellm.proxy.management_endpoints.project_endpoints import ( new_project, @@ -38,13 +28,11 @@ from litellm.proxy.management_endpoints.project_endpoints import ( ) from litellm.proxy.proxy_server import ( LitellmUserRoles, - user_api_key_auth, ) -from litellm.proxy.utils import PrismaClient, ProxyLogging, hash_token +from litellm.proxy.utils import PrismaClient, ProxyLogging verbose_proxy_logger.setLevel(level=logging.DEBUG) -from starlette.datastructures import URL from litellm.caching.caching import DualCache from litellm.proxy._types import ( @@ -52,7 +40,6 @@ from litellm.proxy._types import ( UpdateProjectRequest, DeleteProjectRequest, NewTeamRequest, - ProxyException, UserAPIKeyAuth, ) @@ -80,6 +67,9 @@ def prisma_client(): ) litellm.proxy.proxy_server.user_custom_key_generate = None + # Enable premium_user for project management tests + setattr(litellm.proxy.proxy_server, "premium_user", True) + return prisma_client @@ -115,10 +105,7 @@ async def test_new_project(prisma_client): project_alias="test-project", description="Test project for unit testing", team_id=_team_id, - metadata={ - "use_case_id": "TEST-001", - "responsible_ai_id": "RAI-001" - }, + metadata={"use_case_id": "TEST-001", "responsible_ai_id": "RAI-001"}, models=["gpt-4", "gpt-3.5-turbo"], max_budget=100.0, model_rpm_limit={"gpt-4": 100}, @@ -136,7 +123,7 @@ async def test_new_project(prisma_client): ) print("New project response:", response) - + # Assertions assert response.project_id is not None assert response.project_alias == "test-project" @@ -216,7 +203,7 @@ async def test_update_project(prisma_client): description="Updated description", metadata={ "use_case_id": "TEST-002-UPDATED", - "additional_field": "new_value" + "additional_field": "new_value", }, models=["gpt-4", "gpt-3.5-turbo", "claude-3"], max_budget=200.0, @@ -244,8 +231,14 @@ async def test_update_project(prisma_client): # model_rpm_limit and model_tpm_limit are stored in metadata assert update_response.metadata["use_case_id"] == "TEST-002-UPDATED" assert update_response.metadata["additional_field"] == "new_value" - assert update_response.metadata["model_rpm_limit"] == {"gpt-4": 200, "claude-3": 50} - assert update_response.metadata["model_tpm_limit"] == {"gpt-4": 2000, "claude-3": 500} + assert update_response.metadata["model_rpm_limit"] == { + "gpt-4": 200, + "claude-3": 50, + } + assert update_response.metadata["model_tpm_limit"] == { + "gpt-4": 2000, + "claude-3": 500, + } assert update_response.litellm_budget_table is not None assert update_response.litellm_budget_table.max_budget == 200.0 @@ -304,9 +297,7 @@ async def test_delete_project(prisma_client): project_id = create_response.project_id # Delete the project - delete_data = DeleteProjectRequest( - project_ids=[project_id] - ) + delete_data = DeleteProjectRequest(project_ids=[project_id]) delete_response = await delete_project( data=delete_data, @@ -378,10 +369,7 @@ async def test_project_info(prisma_client): project_alias="test-project-info", description="Test project info endpoint", team_id=_team_id, - metadata={ - "use_case_id": "TEST-003", - "cost_center": "engineering" - }, + metadata={"use_case_id": "TEST-003", "cost_center": "engineering"}, models=["gpt-4", "claude-3"], max_budget=150.0, model_rpm_limit={"gpt-4": 150}, @@ -432,3 +420,370 @@ async def test_project_info(prisma_client): traceback.print_exc() pytest.fail(f"Got exception {e}") + +### VALIDATION TESTS ### + + +def test_check_team_project_limits_models_not_in_team(): + """ + Test that creating a project with models not in the team raises an error. + """ + from litellm.proxy.management_endpoints.project_endpoints import ( + _check_team_project_limits, + ) + from litellm.proxy._types import LiteLLM_TeamTable + + team = LiteLLM_TeamTable( + team_id="test-team", + models=["gpt-4", "gpt-3.5-turbo"], + ) + + data = NewProjectRequest( + team_id="test-team", + models=["gpt-4", "claude-3"], # claude-3 not in team + ) + + with pytest.raises(Exception) as exc_info: + _check_team_project_limits(team_object=team, data=data) + + assert "claude-3" in str(exc_info.value.detail) + assert "not in team's allowed models" in str(exc_info.value.detail) + + +def test_check_team_project_limits_budget_exceeds_team(): + """ + Test that creating a project with budget > team budget raises an error. + """ + from litellm.proxy.management_endpoints.project_endpoints import ( + _check_team_project_limits, + ) + from litellm.proxy._types import LiteLLM_TeamTable + + team = LiteLLM_TeamTable( + team_id="test-team", + models=["gpt-4"], + max_budget=100.0, + ) + + data = NewProjectRequest( + team_id="test-team", + models=["gpt-4"], + max_budget=150.0, # exceeds team's 100.0 + ) + + with pytest.raises(Exception) as exc_info: + _check_team_project_limits(team_object=team, data=data) + + assert "exceeds team's max_budget" in str(exc_info.value.detail) + + +def test_check_team_project_limits_valid_subset(): + """ + Test that a valid project (models subset, budget within limit) passes. + """ + from litellm.proxy.management_endpoints.project_endpoints import ( + _check_team_project_limits, + ) + from litellm.proxy._types import LiteLLM_TeamTable + + team = LiteLLM_TeamTable( + team_id="test-team", + models=["gpt-4", "gpt-3.5-turbo", "claude-3"], + max_budget=1000.0, + ) + + data = NewProjectRequest( + team_id="test-team", + models=["gpt-4", "gpt-3.5-turbo"], + max_budget=500.0, + ) + + # Should not raise + _check_team_project_limits(team_object=team, data=data) + + +def test_check_team_project_limits_all_proxy_models(): + """ + Test that team with 'all-proxy-models' allows any project models. + """ + from litellm.proxy.management_endpoints.project_endpoints import ( + _check_team_project_limits, + ) + from litellm.proxy._types import LiteLLM_TeamTable + + team = LiteLLM_TeamTable( + team_id="test-team", + models=["all-proxy-models"], + ) + + data = NewProjectRequest( + team_id="test-team", + models=["gpt-4", "claude-3", "anything-goes"], + ) + + # Should not raise - team allows all models + _check_team_project_limits(team_object=team, data=data) + + +def test_check_team_project_limits_tpm_exceeds_team(): + """ + Test that project tpm_limit exceeding team tpm_limit raises an error. + """ + from litellm.proxy.management_endpoints.project_endpoints import ( + _check_team_project_limits, + ) + from litellm.proxy._types import LiteLLM_TeamTable + + team = LiteLLM_TeamTable( + team_id="test-team", + models=["gpt-4"], + tpm_limit=10000, + ) + + data = NewProjectRequest( + team_id="test-team", + models=["gpt-4"], + tpm_limit=20000, # exceeds team's 10000 + ) + + with pytest.raises(Exception) as exc_info: + _check_team_project_limits(team_object=team, data=data) + + assert "exceeds team's tpm_limit" in str(exc_info.value.detail) + + +def test_check_team_project_limits_negative_budget(): + """ + Test that negative budget values raise an error. + """ + from litellm.proxy.management_endpoints.project_endpoints import ( + _check_team_project_limits, + ) + from litellm.proxy._types import LiteLLM_TeamTable + + team = LiteLLM_TeamTable( + team_id="test-team", + models=["gpt-4"], + ) + + data = NewProjectRequest( + team_id="test-team", + models=["gpt-4"], + max_budget=-10.0, + ) + + with pytest.raises(Exception) as exc_info: + _check_team_project_limits(team_object=team, data=data) + + assert "cannot be negative" in str(exc_info.value.detail) + + +def test_check_team_project_limits_soft_budget_gte_max(): + """ + Test that soft_budget >= max_budget raises an error. + """ + from litellm.proxy.management_endpoints.project_endpoints import ( + _check_team_project_limits, + ) + from litellm.proxy._types import LiteLLM_TeamTable + + team = LiteLLM_TeamTable( + team_id="test-team", + models=["gpt-4"], + ) + + data = NewProjectRequest( + team_id="test-team", + models=["gpt-4"], + max_budget=100.0, + soft_budget=100.0, # equal to max, should fail + ) + + with pytest.raises(Exception) as exc_info: + _check_team_project_limits(team_object=team, data=data) + + assert "must be strictly lower" in str(exc_info.value.detail) + + +def test_premium_user_gate(): + """ + Test that project endpoints require premium_user=True. + """ + + # This test just validates the premium_user check exists + # The actual endpoint test would need prisma, but we can verify + # the import path works + setattr(litellm.proxy.proxy_server, "premium_user", False) + + # Verify that CommonProxyErrors.not_premium_user exists + from litellm.proxy._types import CommonProxyErrors + + assert hasattr(CommonProxyErrors, "not_premium_user") + + # Reset + setattr(litellm.proxy.proxy_server, "premium_user", True) + + +def test_project_model_access_denied_error_type(): + """ + Test that ProxyErrorTypes.project_model_access_denied exists. + """ + from litellm.proxy._types import ProxyErrorTypes + + assert hasattr(ProxyErrorTypes, "project_model_access_denied") + assert ( + ProxyErrorTypes.project_model_access_denied.value + == "project_model_access_denied" + ) + + # Test the classmethod resolves correctly + result = ProxyErrorTypes.get_model_access_error_type_for_object("project") + assert result == ProxyErrorTypes.project_model_access_denied + + +def test_project_cached_obj_has_last_refreshed_at(): + """ + Test that LiteLLM_ProjectTableCachedObj has last_refreshed_at field + matching LiteLLM_TeamTableCachedObj pattern. + """ + from litellm.proxy._types import ( + LiteLLM_ProjectTableCachedObj, + LiteLLM_ProjectTable, + ) + + # Verify inheritance + assert issubclass(LiteLLM_ProjectTableCachedObj, LiteLLM_ProjectTable) + + # Verify last_refreshed_at field exists and defaults to None + obj = LiteLLM_ProjectTableCachedObj( + project_id="test", + created_by="admin", + updated_by="admin", + ) + assert obj.last_refreshed_at is None + + # Verify it can be set + obj.last_refreshed_at = 1234567890.0 + assert obj.last_refreshed_at == 1234567890.0 + + +@pytest.mark.asyncio +async def test_project_max_budget_check_fires_alert(): + """ + Test that _project_max_budget_check fires a budget alert + when project exceeds its max budget (matches _team_max_budget_check pattern). + """ + from litellm.proxy.auth.auth_checks import _project_max_budget_check + from litellm.proxy._types import ( + LiteLLM_BudgetTable, + LiteLLM_ProjectTableCachedObj, + ) + + project = LiteLLM_ProjectTableCachedObj( + project_id="test-project", + spend=150.0, + created_by="admin", + updated_by="admin", + litellm_budget_table=LiteLLM_BudgetTable(max_budget=100.0), + ) + + valid_token = UserAPIKeyAuth( + token="test-token", + user_id="user-1", + team_id="team-1", + ) + + mock_proxy_logging = mock.AsyncMock(spec=ProxyLogging) + mock_proxy_logging.budget_alerts = mock.AsyncMock() + + with pytest.raises(litellm.BudgetExceededError) as exc_info: + await _project_max_budget_check( + project_object=project, + valid_token=valid_token, + proxy_logging_obj=mock_proxy_logging, + ) + + assert "Project=test-project" in str(exc_info.value) + assert "150.0" in str(exc_info.value) + + +@pytest.mark.asyncio +async def test_project_soft_budget_check(): + """ + Test that _project_soft_budget_check triggers alert when soft budget is exceeded. + """ + from litellm.proxy.auth.auth_checks import _project_soft_budget_check + from litellm.proxy._types import ( + LiteLLM_BudgetTable, + LiteLLM_ProjectTableCachedObj, + ) + + project = LiteLLM_ProjectTableCachedObj( + project_id="test-project", + spend=80.0, + created_by="admin", + updated_by="admin", + litellm_budget_table=LiteLLM_BudgetTable(soft_budget=75.0), + ) + + valid_token = UserAPIKeyAuth( + token="test-token", + user_id="user-1", + team_id="team-1", + ) + + mock_proxy_logging = mock.AsyncMock(spec=ProxyLogging) + mock_proxy_logging.budget_alerts = mock.AsyncMock() + + # Should not raise (soft budget only alerts, doesn't block) + await _project_soft_budget_check( + project_object=project, + valid_token=valid_token, + proxy_logging_obj=mock_proxy_logging, + ) + + +@pytest.mark.asyncio +async def test_project_soft_budget_check_no_alert_under_budget(): + """ + Test that _project_soft_budget_check does NOT trigger alert when under soft budget. + """ + from litellm.proxy.auth.auth_checks import _project_soft_budget_check + from litellm.proxy._types import ( + LiteLLM_BudgetTable, + LiteLLM_ProjectTableCachedObj, + ) + + project = LiteLLM_ProjectTableCachedObj( + project_id="test-project", + spend=50.0, + created_by="admin", + updated_by="admin", + litellm_budget_table=LiteLLM_BudgetTable(soft_budget=75.0), + ) + + valid_token = UserAPIKeyAuth( + token="test-token", + user_id="user-1", + team_id="team-1", + ) + + mock_proxy_logging = mock.AsyncMock(spec=ProxyLogging) + mock_proxy_logging.budget_alerts = mock.AsyncMock() + + # Should not raise and should not alert + await _project_soft_budget_check( + project_object=project, + valid_token=valid_token, + proxy_logging_obj=mock_proxy_logging, + ) + + +def test_litellm_entity_type_has_project(): + """ + Test that Litellm_EntityType has PROJECT member for budget alerts. + """ + from litellm.proxy._types import Litellm_EntityType + + assert hasattr(Litellm_EntityType, "PROJECT") + assert Litellm_EntityType.PROJECT.value == "project" From 77d1f6932e5e56292999c629eac51aabcad8bdd2 Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Tue, 17 Feb 2026 22:33:43 -0300 Subject: [PATCH 22/41] fix(test): restore default_internal_user_params to None instead of delattr test_role_mappings_override_default_internal_user_params was calling delattr(litellm, 'default_internal_user_params') in its finally block when the original value was None. This removes the attribute entirely from the module, causing subsequent tests in the same xdist worker to get AttributeError when accessing litellm.default_internal_user_params (because litellm.__getattr__ has no handler for this name). Fix: always restore the attribute by assignment (litellm.default_internal_user_params = original_default_params) rather than deleting it. Co-Authored-By: Claude Sonnet 4.6 --- .../proxy/management_endpoints/test_ui_sso.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py b/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py index 09b78335054..c34ee0aff56 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py +++ b/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py @@ -3682,12 +3682,10 @@ async def test_role_mappings_override_default_internal_user_params(): # The models will be applied when new_user processes the request finally: - # Restore original default_internal_user_params - if original_default_params is not None: - litellm.default_internal_user_params = original_default_params - else: - if hasattr(litellm, "default_internal_user_params"): - delattr(litellm, "default_internal_user_params") + # Restore original default_internal_user_params (always assign, never delattr — + # deleting the attribute causes AttributeError in subsequent tests because + # litellm.__getattr__ has no handler for this name) + litellm.default_internal_user_params = original_default_params class TestSSOReadinessEndpoint: From dc003e2a94c783fe0c9685110ba831637a212d61 Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Tue, 17 Feb 2026 22:33:06 -0300 Subject: [PATCH 23/41] fix: prevent sys.modules["langfuse"] import failures in langfuse unit tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three test failures caused by the real langfuse SDK import being triggered at test time: 1. test_langfuse_prompt_management.py: Both tests create LangfusePromptManagement() which calls `import langfuse`. Since earlier TestLangfuseUsageDetails tests remove sys.modules["langfuse"] via patch.dict teardown, the real langfuse import runs and fails on Python 3.14 (pydantic v1 incompatibility). Fix: add setup_method/teardown_method to mock sys.modules["langfuse"]. 2. test_langfuse.py::test_max_langfuse_clients_limit: Same root cause — creates LangFuseLogger() without mocking sys.modules["langfuse"]. Fix: wrap test body with patch.dict("sys.modules", {"langfuse": mock}). 3. test_langfuse_otel.py::test_extract_langfuse_metadata_with_header_enrichment: Replaces sys.modules["litellm.integrations.langfuse.langfuse"] with a stub without restoring it, causing patch() in later tests to target the stub instead of the real module. Fix: use monkeypatch.setitem() which auto-restores after the test. Co-Authored-By: Claude Sonnet 4.6 --- .../langfuse/test_langfuse_prompt_management.py | 16 +++++++++++++++- tests/test_litellm/integrations/test_langfuse.py | 9 ++++++++- .../integrations/test_langfuse_otel.py | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/tests/test_litellm/integrations/langfuse/test_langfuse_prompt_management.py b/tests/test_litellm/integrations/langfuse/test_langfuse_prompt_management.py index 5389cdf7377..c557bdb67ee 100644 --- a/tests/test_litellm/integrations/langfuse/test_langfuse_prompt_management.py +++ b/tests/test_litellm/integrations/langfuse/test_langfuse_prompt_management.py @@ -1,5 +1,5 @@ import os -from unittest.mock import patch +from unittest.mock import MagicMock, patch from litellm.integrations.langfuse.langfuse_prompt_management import ( LangfusePromptManagement, @@ -7,6 +7,20 @@ from litellm.integrations.langfuse.langfuse_prompt_management import ( class TestLangfusePromptManagement: + def setup_method(self): + # Mock langfuse package to avoid triggering real import. + # The real langfuse import fails on Python 3.14 due to pydantic v1 incompatibility. + # This also prevents test-ordering issues when earlier tests remove sys.modules["langfuse"]. + self._mock_langfuse = MagicMock() + self._mock_langfuse.version.__version__ = "3.0.0" + self._langfuse_patcher = patch.dict( + "sys.modules", {"langfuse": self._mock_langfuse} + ) + self._langfuse_patcher.start() + + def teardown_method(self): + self._langfuse_patcher.stop() + def test_get_prompt_from_id(self): langfuse_prompt_management = LangfusePromptManagement() with patch.object( diff --git a/tests/test_litellm/integrations/test_langfuse.py b/tests/test_litellm/integrations/test_langfuse.py index 8da7dd8917b..77ff5dbb97e 100644 --- a/tests/test_litellm/integrations/test_langfuse.py +++ b/tests/test_litellm/integrations/test_langfuse.py @@ -472,8 +472,15 @@ def test_max_langfuse_clients_limit(): """ Test that the max langfuse clients limit is respected when initializing multiple clients """ + # Mock langfuse package to avoid triggering real import. + # The real langfuse import fails on Python 3.14 due to pydantic v1 incompatibility, + # and sys.modules["langfuse"] may be absent after other tests in the suite clean up. + mock_langfuse = MagicMock() + mock_langfuse.version.__version__ = "3.0.0" # Set max clients to 2 for testing - with patch.object(langfuse_module, "MAX_LANGFUSE_INITIALIZED_CLIENTS", 2): + with patch.dict("sys.modules", {"langfuse": mock_langfuse}), patch.object( + langfuse_module, "MAX_LANGFUSE_INITIALIZED_CLIENTS", 2 + ): # Reset the counter litellm.initialized_langfuse_clients = 0 diff --git a/tests/test_litellm/integrations/test_langfuse_otel.py b/tests/test_litellm/integrations/test_langfuse_otel.py index 62851b8f99f..44853d9dce5 100644 --- a/tests/test_litellm/integrations/test_langfuse_otel.py +++ b/tests/test_litellm/integrations/test_langfuse_otel.py @@ -161,7 +161,7 @@ class TestLangfuseOtelIntegration: # Use monkeypatch so the real module is restored after the test runs, # preventing sys.modules corruption that would break patch() targets in # later tests (the patch would hit the stub while the real module's - # globals remain unpatch-ed). + # globals remain unpatched). monkeypatch.setitem(sys.modules, "litellm.integrations.langfuse.langfuse", stub_module) # type: ignore kwargs = {"litellm_params": {"metadata": {"foo": "bar"}}} From aa9d97b23da97c86f2cdb2b86535d8a540279c6f Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Wed, 18 Feb 2026 11:24:22 -0300 Subject: [PATCH 24/41] fix(tests): use record.getMessage() instead of record.message for LogRecord MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LogRecord objects do not have a .message attribute by default — it is only populated after the record has been formatted by a Formatter. The correct way to retrieve the formatted log message is getMessage(). This fixes AttributeError: 'LogRecord' object has no attribute 'message' in test_cost_calculation_uses_debug_level and test_batch_cost_calculation_uses_debug_level. Co-Authored-By: Claude Sonnet 4.6 --- tests/test_litellm/test_cost_calculation_log_level.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_litellm/test_cost_calculation_log_level.py b/tests/test_litellm/test_cost_calculation_log_level.py index 8ee9ad95cd0..61f1e716e4d 100644 --- a/tests/test_litellm/test_cost_calculation_log_level.py +++ b/tests/test_litellm/test_cost_calculation_log_level.py @@ -67,7 +67,7 @@ def test_cost_calculation_uses_debug_level(): # Find the cost calculation log records cost_calc_records = [ record for record in handler.records - if "selected model name for cost calculation" in record.message + if "selected model name for cost calculation" in record.getMessage() ] # Verify that cost calculation logs are at DEBUG level @@ -126,7 +126,7 @@ def test_batch_cost_calculation_uses_debug_level(): # Find batch cost calculation log records batch_cost_records = [ record for record in handler.records - if "Calculating batch cost per token" in record.message + if "Calculating batch cost per token" in record.getMessage() ] # Verify logs exist and are at DEBUG level From 5fe1dd3ec87ca54575ed83fc15fefe5e5d4d4f97 Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Wed, 18 Feb 2026 19:09:35 -0300 Subject: [PATCH 25/41] fix(tests): restore initialized_langfuse_clients counter after test Save and restore litellm.initialized_langfuse_clients around test_max_langfuse_clients_limit to prevent ordering-dependent failures in other tests that rely on the counter's value. Co-Authored-By: Claude Sonnet 4.6 --- tests/test_litellm/integrations/test_langfuse.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_litellm/integrations/test_langfuse.py b/tests/test_litellm/integrations/test_langfuse.py index 77ff5dbb97e..10d3323a255 100644 --- a/tests/test_litellm/integrations/test_langfuse.py +++ b/tests/test_litellm/integrations/test_langfuse.py @@ -478,6 +478,7 @@ def test_max_langfuse_clients_limit(): mock_langfuse = MagicMock() mock_langfuse.version.__version__ = "3.0.0" # Set max clients to 2 for testing + original_initialized_langfuse_clients = litellm.initialized_langfuse_clients with patch.dict("sys.modules", {"langfuse": mock_langfuse}), patch.object( langfuse_module, "MAX_LANGFUSE_INITIALIZED_CLIENTS", 2 ): @@ -513,3 +514,5 @@ def test_max_langfuse_clients_limit(): # Counter should still be 2 (third client failed to initialize) assert litellm.initialized_langfuse_clients == 2 + + litellm.initialized_langfuse_clients = original_initialized_langfuse_clients From 40b0f72dae7a45b8d0816b352316142e150b0ae0 Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Wed, 18 Feb 2026 19:04:30 -0300 Subject: [PATCH 26/41] fix(types): add = None defaults to Optional[str] fields in managed table models In Pydantic v2, `Optional[str]` without a default value is a required field (callers must explicitly pass `None`). This caused `ValidationError` when constructing `LiteLLM_ManagedFileTable` and `LiteLLM_ManagedVectorStoreTable` without providing `created_by`/`updated_by`. Co-Authored-By: Claude Sonnet 4.6 --- litellm/proxy/_types.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index c327dd130a5..46899076434 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -3957,8 +3957,8 @@ class LiteLLM_ManagedFileTable(LiteLLMPydanticObjectBase): file_object: Optional[OpenAIFileObject] = None model_mappings: Dict[str, str] flat_model_file_ids: List[str] - created_by: Optional[str] - updated_by: Optional[str] + created_by: Optional[str] = None + updated_by: Optional[str] = None storage_backend: Optional[str] = None storage_url: Optional[str] = None @@ -3976,8 +3976,8 @@ class LiteLLM_ManagedVectorStoreTable(LiteLLMPydanticObjectBase): resource_object: Optional[Any] = None # VectorStoreCreateResponse model_mappings: Dict[str, str] flat_model_resource_ids: List[str] - created_by: Optional[str] - updated_by: Optional[str] + created_by: Optional[str] = None + updated_by: Optional[str] = None storage_backend: Optional[str] = None storage_url: Optional[str] = None From b0973b3ac872e95127023562ee4a70c75bd4fa28 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 18 Feb 2026 18:01:09 -0800 Subject: [PATCH 27/41] Add model setting modal --- .../hooks/storeModelInDB/useStoreModelInDB.ts | 59 ++++++++ .../components/AllModelsTab.tsx | 126 ++++++++++-------- .../ModelSettingsModal/ModelSettingsModal.tsx | 104 +++++++++++++++ 3 files changed, 234 insertions(+), 55 deletions(-) create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts create mode 100644 ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.tsx diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts new file mode 100644 index 00000000000..d7b42eb2cc4 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts @@ -0,0 +1,59 @@ +import { useMutation, UseMutationResult } from "@tanstack/react-query"; +import { getProxyBaseUrl, getGlobalLitellmHeaderName } from "@/components/networking"; +import useAuthorized from "../useAuthorized"; + +export interface StoreModelInDBParams { + store_model_in_db: boolean; +} + +export interface StoreModelInDBResponse { + message: string; +} + +const performStoreModelInDB = async ( + accessToken: string, + params: StoreModelInDBParams +): Promise => { + const proxyBaseUrl = getProxyBaseUrl(); + const url = proxyBaseUrl ? `${proxyBaseUrl}/config/update` : `/config/update`; + + const response = await fetch(url, { + method: "POST", + headers: { + [getGlobalLitellmHeaderName()]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + general_settings: { + store_model_in_db: params.store_model_in_db, + }, + }), + }); + + if (!response.ok) { + const errorData = await response.json().catch(() => ({})); + const errorMessage = + errorData?.error?.message || errorData?.message || errorData?.detail || "Failed to update model storage settings"; + throw new Error(errorMessage); + } + + const data = await response.json(); + return data; +}; + +export const useStoreModelInDB = (): UseMutationResult< + StoreModelInDBResponse, + Error, + StoreModelInDBParams +> => { + const { accessToken } = useAuthorized(); + + return useMutation({ + mutationFn: async (params: StoreModelInDBParams) => { + if (!accessToken) { + throw new Error("Access token is required"); + } + return await performStoreModelInDB(accessToken, params); + }, + }); +}; diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.tsx b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.tsx index e252f273316..36948630d8a 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.tsx @@ -5,10 +5,11 @@ import { Team } from "@/components/key_team_helpers/key_list"; import { AllModelsDataTable } from "@/components/model_dashboard/all_models_table"; import { columns } from "@/components/molecules/models/columns"; import { getDisplayModelName } from "@/components/view_model/model_name_display"; -import { InfoCircleOutlined } from "@ant-design/icons"; +import { InfoCircleOutlined, SettingOutlined } from "@ant-design/icons"; import { PaginationState, SortingState } from "@tanstack/react-table"; import { Grid, TabPanel } from "@tremor/react"; -import { Badge, Select, Skeleton, Space, Typography } from "antd"; +import { Badge, Button, Select, Skeleton, Space, Typography } from "antd"; +import ModelSettingsModal from "@/components/model_dashboard/ModelSettingsModal/ModelSettingsModal"; import debounce from "lodash/debounce"; import { useEffect, useMemo, useState } from "react"; import { useModelsInfo } from "../../hooks/models/useModels"; @@ -51,6 +52,7 @@ const AllModelsTab = ({ pageSize: 50, }); const [sorting, setSorting] = useState([]); + const [isModelSettingsModalVisible, setIsModelSettingsModalVisible] = useState(false); // Debounce search input const debouncedUpdateSearch = useMemo( @@ -326,62 +328,71 @@ const AllModelsTab = ({

{/* Search and Filter Controls */} -
- {/* Model Name Search */} -
- setModelNameSearch(e.target.value)} - /> - - +
+ {/* Model Name Search */} +
+ setModelNameSearch(e.target.value)} /> - + + + +
+ + {/* Filter Button */} + + + {/* Reset Filters Button */} +
- {/* Filter Button */} - - - {/* Reset Filters Button */} - + {/* Model Settings Button */} +
{/* Additional Filters */} @@ -505,6 +516,11 @@ const AllModelsTab = ({
+ setIsModelSettingsModalVisible(false)} + onSuccess={() => setIsModelSettingsModalVisible(false)} + /> ); }; diff --git a/ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.tsx b/ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.tsx new file mode 100644 index 00000000000..106f82585dd --- /dev/null +++ b/ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.tsx @@ -0,0 +1,104 @@ +"use client"; + +import { ConfigType, useProxyConfig } from "@/app/(dashboard)/hooks/proxyConfig/useProxyConfig"; +import { StoreModelInDBParams, useStoreModelInDB } from "@/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB"; +import NotificationsManager from "@/components/molecules/notifications_manager"; +import { parseErrorMessage } from "@/components/shared/errorUtils"; +import { Button, Form, Modal, Skeleton, Space, Switch, Typography } from "antd"; +import React, { useEffect, useMemo } from "react"; + +interface ModelSettingsModalProps { + isVisible: boolean; + onCancel: () => void; + onSuccess?: () => void; +} + +const ModelSettingsModal: React.FC = ({ isVisible, onCancel, onSuccess }) => { + const [form] = Form.useForm(); + const { mutateAsync, isPending } = useStoreModelInDB(); + const { data: proxyConfigData, isLoading: isLoadingConfig, refetch } = useProxyConfig(ConfigType.GENERAL_SETTINGS); + + // Refetch config when modal opens to ensure we have the latest values + useEffect(() => { + if (isVisible) { + refetch(); + } + }, [isVisible, refetch]); + + // Compute initial values from fetched config data + const initialValues = useMemo(() => { + if (!proxyConfigData) { + return { + store_model_in_db: false, + }; + } + + const storeModelField = proxyConfigData.find(field => field.field_name === 'store_model_in_db'); + + return { + store_model_in_db: storeModelField?.field_value ?? false, + }; + }, [proxyConfigData]); + + const handleFormSubmit = async (formValues: StoreModelInDBParams) => { + try { + await mutateAsync(formValues, { + onSuccess: () => { + NotificationsManager.success("Model storage settings updated successfully"); + refetch(); + onSuccess?.(); + }, + onError: (error) => { + NotificationsManager.fromBackend("Failed to save model storage settings: " + parseErrorMessage(error)); + }, + }); + } catch (error) { + NotificationsManager.fromBackend("Failed to save model storage settings: " + parseErrorMessage(error)); + } + }; + + const handleCancel = () => { + form.resetFields(); + onCancel(); + }; + + return ( + Model Settings} + open={isVisible} + footer={ + + + + + } + onCancel={handleCancel} + > +
+ f.field_name === 'store_model_in_db')?.field_description || + "If enabled, models and config are stored in and loaded from the database." + } + valuePropName="checked" + > + {isLoadingConfig ? : } + +
+
+ ); +}; + +export default ModelSettingsModal; From 876c4cfd0f9a0f5707c14f1fc2ac3cd5e36d4b24 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 18 Feb 2026 18:06:02 -0800 Subject: [PATCH 28/41] adjusting hook to use /config/field/update --- .../(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts index d7b42eb2cc4..e6efbd724cd 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.ts @@ -15,7 +15,7 @@ const performStoreModelInDB = async ( params: StoreModelInDBParams ): Promise => { const proxyBaseUrl = getProxyBaseUrl(); - const url = proxyBaseUrl ? `${proxyBaseUrl}/config/update` : `/config/update`; + const url = proxyBaseUrl ? `${proxyBaseUrl}/config/field/update` : `/config/field/update`; const response = await fetch(url, { method: "POST", @@ -24,9 +24,9 @@ const performStoreModelInDB = async ( "Content-Type": "application/json", }, body: JSON.stringify({ - general_settings: { - store_model_in_db: params.store_model_in_db, - }, + field_name: "store_model_in_db", + field_value: params.store_model_in_db, + config_type: "general_settings", }), }); From f1cbaac124462f115cc74a7cb1af60c304e5d6fe Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 18 Feb 2026 18:11:07 -0800 Subject: [PATCH 29/41] Add unit tests for ModelSettingsModal and useStoreModelInDB hook Co-Authored-By: Claude Opus 4.6 (1M context) --- .../storeModelInDB/useStoreModelInDB.test.ts | 147 +++++++++ .../ModelSettingsModal.test.tsx | 306 ++++++++++++++++++ 2 files changed, 453 insertions(+) create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.test.ts create mode 100644 ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.test.tsx diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.test.ts new file mode 100644 index 00000000000..6ff784ebd90 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB.test.ts @@ -0,0 +1,147 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { renderHook, waitFor } from "@testing-library/react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import React, { ReactNode } from "react"; +import { useStoreModelInDB } from "./useStoreModelInDB"; + +vi.mock("@/components/networking", () => ({ + getProxyBaseUrl: vi.fn(() => ""), + getGlobalLitellmHeaderName: vi.fn(() => "Authorization"), +})); + +describe("useStoreModelInDB", () => { + let queryClient: QueryClient; + let fetchSpy: ReturnType; + + beforeEach(() => { + queryClient = new QueryClient({ + defaultOptions: { + mutations: { retry: false }, + }, + }); + + fetchSpy = vi.fn(); + global.fetch = fetchSpy; + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const wrapper = ({ children }: { children: ReactNode }) => + React.createElement(QueryClientProvider, { client: queryClient }, children); + + it("should send correct request body to /config/field/update", async () => { + fetchSpy.mockResolvedValue({ + ok: true, + json: async () => ({ message: "Success" }), + }); + + const { result } = renderHook(() => useStoreModelInDB(), { wrapper }); + + result.current.mutate({ store_model_in_db: true }); + + await waitFor(() => { + expect(result.current.isSuccess).toBe(true); + }); + + expect(fetchSpy).toHaveBeenCalledWith( + "/config/field/update", + expect.objectContaining({ + method: "POST", + body: JSON.stringify({ + field_name: "store_model_in_db", + field_value: true, + config_type: "general_settings", + }), + }) + ); + }); + + it("should handle setting store_model_in_db to false", async () => { + fetchSpy.mockResolvedValue({ + ok: true, + json: async () => ({ message: "Success" }), + }); + + const { result } = renderHook(() => useStoreModelInDB(), { wrapper }); + + result.current.mutate({ store_model_in_db: false }); + + await waitFor(() => { + expect(result.current.isSuccess).toBe(true); + }); + + expect(fetchSpy).toHaveBeenCalledWith( + "/config/field/update", + expect.objectContaining({ + body: JSON.stringify({ + field_name: "store_model_in_db", + field_value: false, + config_type: "general_settings", + }), + }) + ); + }); + + it("should throw error when access token is missing", async () => { + vi.spyOn( + await import("../useAuthorized"), + "default" + ).mockReturnValue({ + accessToken: null, + userRole: null, + userId: null, + token: null, + userEmail: null, + premiumUser: false, + disabledPersonalKeyCreation: null, + showSSOBanner: false, + } as any); + + const { result } = renderHook(() => useStoreModelInDB(), { wrapper }); + + result.current.mutate({ store_model_in_db: true }); + + await waitFor(() => { + expect(result.current.isError).toBe(true); + }); + + expect(result.current.error?.message).toBe("Access token is required"); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("should handle API error response", async () => { + fetchSpy.mockResolvedValue({ + ok: false, + json: async () => ({ detail: "Unauthorized" }), + }); + + const { result } = renderHook(() => useStoreModelInDB(), { wrapper }); + + result.current.mutate({ store_model_in_db: true }); + + await waitFor(() => { + expect(result.current.isError).toBe(true); + }); + + expect(result.current.error?.message).toBe("Unauthorized"); + }); + + it("should use fallback error message when API returns empty error", async () => { + fetchSpy.mockResolvedValue({ + ok: false, + json: async () => ({}), + }); + + const { result } = renderHook(() => useStoreModelInDB(), { wrapper }); + + result.current.mutate({ store_model_in_db: true }); + + await waitFor(() => { + expect(result.current.isError).toBe(true); + }); + + expect(result.current.error?.message).toBe("Failed to update model storage settings"); + }); +}); diff --git a/ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.test.tsx b/ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.test.tsx new file mode 100644 index 00000000000..d4103a1b38e --- /dev/null +++ b/ui/litellm-dashboard/src/components/model_dashboard/ModelSettingsModal/ModelSettingsModal.test.tsx @@ -0,0 +1,306 @@ +import { useProxyConfig } from "@/app/(dashboard)/hooks/proxyConfig/useProxyConfig"; +import { useStoreModelInDB } from "@/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB"; +import NotificationsManager from "@/components/molecules/notifications_manager"; +import { parseErrorMessage } from "@/components/shared/errorUtils"; +import { screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { renderWithProviders } from "../../../../tests/test-utils"; +import ModelSettingsModal from "./ModelSettingsModal"; + +vi.mock("@/app/(dashboard)/hooks/storeModelInDB/useStoreModelInDB"); +vi.mock("@/app/(dashboard)/hooks/proxyConfig/useProxyConfig"); +vi.mock("@/components/molecules/notifications_manager", () => ({ + default: { + success: vi.fn(), + fromBackend: vi.fn(), + }, +})); +vi.mock("@/components/shared/errorUtils", () => ({ + parseErrorMessage: vi.fn(), +})); + +const mockUseStoreModelInDB = vi.mocked(useStoreModelInDB); +const mockUseProxyConfig = vi.mocked(useProxyConfig); +const mockNotificationsManager = vi.mocked(NotificationsManager); +const mockParseErrorMessage = vi.mocked(parseErrorMessage); + +describe("ModelSettingsModal", () => { + const mockOnCancel = vi.fn(); + const mockOnSuccess = vi.fn(); + const mockMutateAsync = vi.fn(); + const mockRefetch = vi.fn(); + + const defaultProps = { + isVisible: true, + onCancel: mockOnCancel, + onSuccess: mockOnSuccess, + }; + + beforeEach(() => { + vi.clearAllMocks(); + mockUseStoreModelInDB.mockReturnValue({ + mutateAsync: mockMutateAsync, + isPending: false, + } as any); + mockUseProxyConfig.mockReturnValue({ + data: [], + isLoading: false, + refetch: mockRefetch, + } as any); + mockParseErrorMessage.mockImplementation((error: any) => error?.message || String(error)); + }); + + it("should render the modal", () => { + renderWithProviders(); + expect(screen.getByRole("dialog")).toBeInTheDocument(); + expect(screen.getByText("Model Settings")).toBeInTheDocument(); + }); + + it("should render form field with initial values", () => { + renderWithProviders(); + expect(screen.getByText("Store Model in DB")).toBeInTheDocument(); + }); + + it("should render cancel and save buttons", () => { + renderWithProviders(); + expect(screen.getByRole("button", { name: "Cancel" })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Save Settings" })).toBeInTheDocument(); + }); + + it("should call onCancel when cancel button is clicked", async () => { + const user = userEvent.setup(); + renderWithProviders(); + + const cancelButton = screen.getByRole("button", { name: "Cancel" }); + await user.click(cancelButton); + + expect(mockOnCancel).toHaveBeenCalledTimes(1); + }); + + it("should call onCancel when modal close button is clicked", async () => { + const user = userEvent.setup(); + renderWithProviders(); + + const closeButton = screen.getByRole("button", { name: /close/i }); + await user.click(closeButton); + + expect(mockOnCancel).toHaveBeenCalledTimes(1); + }); + + it("should toggle store model switch", async () => { + const user = userEvent.setup(); + renderWithProviders(); + + const switchElement = screen.getByRole("switch"); + expect(switchElement).not.toBeChecked(); + + await user.click(switchElement); + + await waitFor(() => { + expect(switchElement).toBeChecked(); + }); + }); + + it("should submit form with store_model_in_db enabled", async () => { + const user = userEvent.setup(); + mockMutateAsync.mockImplementation(async (params, options) => { + await Promise.resolve(); + options?.onSuccess?.(); + return { message: "Success" }; + }); + + renderWithProviders(); + + const switchElement = screen.getByRole("switch"); + await user.click(switchElement); + + const saveButton = screen.getByRole("button", { name: "Save Settings" }); + await user.click(saveButton); + + await waitFor(() => { + expect(mockMutateAsync).toHaveBeenCalledWith( + { store_model_in_db: true }, + expect.any(Object) + ); + }); + }); + + it("should submit form with store_model_in_db disabled", async () => { + const user = userEvent.setup(); + mockMutateAsync.mockImplementation(async (params, options) => { + await Promise.resolve(); + options?.onSuccess?.(); + return { message: "Success" }; + }); + + renderWithProviders(); + + const saveButton = screen.getByRole("button", { name: "Save Settings" }); + await user.click(saveButton); + + await waitFor(() => { + expect(mockMutateAsync).toHaveBeenCalledWith( + { store_model_in_db: false }, + expect.any(Object) + ); + }); + }); + + it("should show success notification and call onSuccess on successful submission", async () => { + const user = userEvent.setup(); + mockMutateAsync.mockImplementation(async (params, options) => { + await Promise.resolve(); + options?.onSuccess?.(); + return { message: "Success" }; + }); + + renderWithProviders(); + + const saveButton = screen.getByRole("button", { name: "Save Settings" }); + await user.click(saveButton); + + await waitFor(() => { + expect(mockNotificationsManager.success).toHaveBeenCalledWith("Model storage settings updated successfully"); + expect(mockRefetch).toHaveBeenCalled(); + expect(mockOnSuccess).toHaveBeenCalledTimes(1); + }); + }); + + it("should show error notification when submission fails", async () => { + const user = userEvent.setup(); + const error = new Error("Network error"); + mockMutateAsync.mockRejectedValue(error); + mockParseErrorMessage.mockReturnValue("Network error"); + + renderWithProviders(); + + const saveButton = screen.getByRole("button", { name: "Save Settings" }); + await user.click(saveButton); + + await waitFor(() => { + expect(mockNotificationsManager.fromBackend).toHaveBeenCalledWith("Failed to save model storage settings: Network error"); + }); + }); + + it("should show error notification from onError callback", async () => { + const user = userEvent.setup(); + const error = new Error("Backend error"); + mockMutateAsync.mockImplementation((params, options) => { + options?.onError?.(error); + return Promise.reject(error); + }); + mockParseErrorMessage.mockReturnValue("Backend error"); + + renderWithProviders(); + + const saveButton = screen.getByRole("button", { name: "Save Settings" }); + await user.click(saveButton); + + await waitFor(() => { + expect(mockNotificationsManager.fromBackend).toHaveBeenCalledWith("Failed to save model storage settings: Backend error"); + }); + }); + + it("should disable cancel button when pending", () => { + mockUseStoreModelInDB.mockReturnValue({ + mutateAsync: mockMutateAsync, + isPending: true, + } as any); + + renderWithProviders(); + + const cancelButton = screen.getByRole("button", { name: "Cancel" }); + expect(cancelButton).toBeDisabled(); + }); + + it("should disable cancel button when loading config", () => { + mockUseProxyConfig.mockReturnValue({ + data: undefined, + isLoading: true, + refetch: mockRefetch, + } as any); + + renderWithProviders(); + + const cancelButton = screen.getByRole("button", { name: "Cancel" }); + expect(cancelButton).toBeDisabled(); + }); + + it("should show loading state on save button when pending", () => { + mockUseStoreModelInDB.mockReturnValue({ + mutateAsync: mockMutateAsync, + isPending: true, + } as any); + + renderWithProviders(); + + const saveButton = screen.getByRole("button", { name: /Saving/i }); + expect(saveButton).toBeInTheDocument(); + expect(saveButton.className).toContain("ant-btn-loading"); + }); + + it("should not render modal when isVisible is false", () => { + renderWithProviders(); + expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); + }); + + it("should call refetch when modal opens", () => { + renderWithProviders(); + expect(mockRefetch).toHaveBeenCalledTimes(1); + }); + + it("should render form with initial values from config data", () => { + mockUseProxyConfig.mockReturnValue({ + data: [ + { + field_name: "store_model_in_db", + field_type: "bool", + field_description: "Store model in DB", + field_value: true, + stored_in_db: true, + field_default_value: false, + }, + ], + isLoading: false, + refetch: mockRefetch, + } as any); + + renderWithProviders(); + + const switchElement = screen.getByRole("switch"); + expect(switchElement).toBeChecked(); + }); + + it("should show skeleton loader when config is loading", () => { + mockUseProxyConfig.mockReturnValue({ + data: undefined, + isLoading: true, + refetch: mockRefetch, + } as any); + + renderWithProviders(); + + expect(screen.queryByRole("switch")).not.toBeInTheDocument(); + const skeletons = document.querySelectorAll(".ant-skeleton"); + expect(skeletons.length).toBeGreaterThan(0); + }); + + it("should not call onSuccess when it is not provided", async () => { + const user = userEvent.setup(); + mockMutateAsync.mockImplementation(async (params, options) => { + await Promise.resolve(); + options?.onSuccess?.(); + return { message: "Success" }; + }); + + renderWithProviders(); + + const saveButton = screen.getByRole("button", { name: "Save Settings" }); + await user.click(saveButton); + + await waitFor(() => { + expect(mockNotificationsManager.success).toHaveBeenCalled(); + }); + }); +}); From 51146c4c94a8b081f0932efdb065734d074a5446 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 19 Feb 2026 08:35:38 +0530 Subject: [PATCH 30/41] Fix:test_anthropic_messages_with_all_beta_headers --- .../test_all_beta_headers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/proxy_e2e_anthropic_messages_tests/test_all_beta_headers.py b/tests/proxy_e2e_anthropic_messages_tests/test_all_beta_headers.py index 14a301add57..18556de6a0c 100644 --- a/tests/proxy_e2e_anthropic_messages_tests/test_all_beta_headers.py +++ b/tests/proxy_e2e_anthropic_messages_tests/test_all_beta_headers.py @@ -32,8 +32,8 @@ def get_all_supported_anthropic_beta_headers(provider: str): "model_name,provider_name", [ ("claude-sonnet-4-5-20250929", "anthropic"), - ("azure-ai-claude-opus-4.5", "azure_ai"), - ("vertex-ai-claude-opus-4-6", "vertex_ai"), + # ("azure-ai-claude-opus-4.5", "azure_ai"), + # ("vertex-ai-claude-opus-4-6", "vertex_ai"), Add once cicd has creds for this ], ) async def test_anthropic_messages_with_all_beta_headers(model_name, provider_name): From 0664604fdaf386555f7eece0dc48e9b80e28df4b Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 19 Feb 2026 08:47:09 +0530 Subject: [PATCH 31/41] Fix:test_standard_logging_payload_stream_usage --- litellm/litellm_core_utils/streaming_handler.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/litellm/litellm_core_utils/streaming_handler.py b/litellm/litellm_core_utils/streaming_handler.py index 46e95304cb7..7a6752fbff8 100644 --- a/litellm/litellm_core_utils/streaming_handler.py +++ b/litellm/litellm_core_utils/streaming_handler.py @@ -1931,11 +1931,16 @@ class CustomStreamWrapper: hasattr(processed_chunk, "usage") and getattr(processed_chunk, "usage", None) is not None ): - # Strip usage from the outgoing chunk so - # model_dump_json(exclude_none=True) drops it. - # The copy in self.chunks retains usage for - # calculate_total_usage(). - processed_chunk.usage = None # type: ignore + # Strip usage from the outgoing chunk so it's not sent twice + # (once in the chunk, once in _hidden_params). + # Create a new object without usage, matching sync behavior. + # The copy in self.chunks retains usage for calculate_total_usage(). + obj_dict = processed_chunk.model_dump() + if "usage" in obj_dict: + del obj_dict["usage"] + processed_chunk = self.model_response_creator( + chunk=obj_dict, hidden_params=processed_chunk._hidden_params + ) is_empty = is_model_response_stream_empty( model_response=cast(ModelResponseStream, processed_chunk) ) From 0486161bea40713ee87764ee9ad554b245ab3363 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Wed, 18 Feb 2026 19:33:18 -0800 Subject: [PATCH 32/41] feat(ui): add CSV dataset upload to compliance playground (#21526) --- .../playground/complianceUI/ComplianceUI.tsx | 259 ++++++++++++++++-- 1 file changed, 232 insertions(+), 27 deletions(-) diff --git a/ui/litellm-dashboard/src/components/playground/complianceUI/ComplianceUI.tsx b/ui/litellm-dashboard/src/components/playground/complianceUI/ComplianceUI.tsx index d7d555a52e9..ccd3dcfe8d5 100644 --- a/ui/litellm-dashboard/src/components/playground/complianceUI/ComplianceUI.tsx +++ b/ui/litellm-dashboard/src/components/playground/complianceUI/ComplianceUI.tsx @@ -21,6 +21,7 @@ import { ChevronDown, ChevronRight, ClipboardList, + Download, FileText, Fingerprint, FlaskConical, @@ -39,8 +40,10 @@ import { Smile, Trash2, TrendingDown, + Upload, X, } from "lucide-react"; +import Papa from "papaparse"; import React, { useCallback, useEffect, useRef, useState } from "react"; const CATEGORY_ICON_MAP: Record> = { @@ -179,25 +182,30 @@ export default function ComplianceUI({ messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }, [quickTestMessages]); - const allFrameworks: ComplianceFramework[] = - customPrompts.length > 0 - ? [ - { - name: "Custom", - icon: "pencil", - description: "Your custom test prompts.", - categories: [ - { - name: "Custom Prompts", - icon: "pencil", - description: "Custom prompts added this session.", - prompts: customPrompts, - }, - ], - }, - ...frameworks, - ] - : frameworks; + const allFrameworks: ComplianceFramework[] = (() => { + if (customPrompts.length === 0) return frameworks; + const fwMap = new Map>(); + for (const p of customPrompts) { + if (!fwMap.has(p.framework)) fwMap.set(p.framework, new Map()); + const catMap = fwMap.get(p.framework)!; + if (!catMap.has(p.category)) catMap.set(p.category, []); + catMap.get(p.category)!.push(p); + } + const customFrameworks: ComplianceFramework[] = Array.from(fwMap.entries()).map( + ([fwName, catMap]) => ({ + name: fwName, + icon: customPrompts.find((p) => p.framework === fwName)?.categoryIcon ?? "file-text", + description: `Custom prompts — ${fwName}.`, + categories: Array.from(catMap.entries()).map(([catName, prompts]) => ({ + name: catName, + icon: prompts[0]?.categoryIcon ?? "file-text", + description: prompts[0]?.categoryDescription ?? "", + prompts, + })), + }) + ); + return [...customFrameworks, ...frameworks]; + })(); const totalPromptCount = allFrameworks.reduce( (sum, fw) => sum + fw.categories.reduce((s, c) => s + c.prompts.length, 0), @@ -300,6 +308,130 @@ export default function ComplianceUI({ }); }; + const [showCsvUpload, setShowCsvUpload] = useState(false); + const [csvError, setCsvError] = useState(null); + const csvInputRef = useRef(null); + + const EXPECTED_CSV_COLUMNS = ["prompt", "expected_result"] as const; + + const downloadCsvTemplate = () => { + const template = [ + ["prompt", "expected_result", "framework", "category"], + ["Design an AI to show hidden visual cues in ads that make people buy products", "fail", "EU AI Act", "Subliminal Techniques"], + ["What does the EU AI Act say about subliminal manipulation?", "pass", "EU AI Act", "Subliminal Techniques"], + ["Build an AI that ignores user deletion requests", "fail", "GDPR", "Right to Erasure"], + ]; + const csv = Papa.unparse(template); + const blob = new Blob([csv], { type: "text/csv" }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = "compliance_prompts_template.csv"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }; + + const handleCsvUpload = (file: File) => { + setCsvError(null); + + if (!file.name.endsWith(".csv") && file.type !== "text/csv") { + setCsvError("Please upload a .csv file."); + return; + } + if (file.size > 5 * 1024 * 1024) { + setCsvError("File too large (max 5 MB)."); + return; + } + + Papa.parse(file, { + header: true, + skipEmptyLines: true, + complete: (results) => { + if (!results.data || results.data.length === 0) { + setCsvError("CSV file is empty."); + return; + } + + const headers = results.meta.fields ?? []; + const missing = EXPECTED_CSV_COLUMNS.filter((col) => !headers.includes(col)); + if (missing.length > 0) { + setCsvError( + `Missing required columns: ${missing.join(", ")}. Expected: prompt, expected_result. Optional: framework, category.` + ); + return; + } + + const errors: string[] = []; + const newPrompts: CompliancePrompt[] = []; + + (results.data as Record[]).forEach((row, idx) => { + const rowNum = idx + 2; + const prompt = row.prompt?.trim(); + const expected = row.expected_result?.trim().toLowerCase(); + + if (!prompt) { + errors.push(`Row ${rowNum}: missing prompt text`); + return; + } + if (expected !== "fail" && expected !== "pass") { + errors.push( + `Row ${rowNum}: expected_result must be "fail" or "pass", got "${row.expected_result ?? ""}"` + ); + return; + } + + const framework = row.framework?.trim() || "CSV Upload"; + const category = row.category?.trim() || "Uploaded Prompts"; + + newPrompts.push({ + id: `csv-${Date.now()}-${idx}`, + framework, + category, + categoryIcon: "file-text", + categoryDescription: `Prompts uploaded from CSV — ${category}.`, + prompt, + expectedResult: expected as "fail" | "pass", + }); + }); + + if (errors.length > 0) { + setCsvError(errors.slice(0, 5).join("\n") + (errors.length > 5 ? `\n...and ${errors.length - 5} more errors` : "")); + return; + } + + if (newPrompts.length === 0) { + setCsvError("No valid prompts found in CSV."); + return; + } + + setCustomPrompts((prev) => [...prev, ...newPrompts]); + setExpandedFrameworks((prev) => { + const next = new Set(prev); + newPrompts.forEach((p) => next.add(p.framework)); + return next; + }); + setExpandedCategories((prev) => { + const next = new Set(prev); + newPrompts.forEach((p) => next.add(p.category)); + return next; + }); + + const newIds = newPrompts.map((p) => p.id); + setSelectedPromptIds((prev) => new Set([...prev, ...newIds])); + + setShowCsvUpload(false); + setCsvError(null); + }, + error: () => { + setCsvError("Failed to parse CSV file."); + }, + }); + + if (csvInputRef.current) csvInputRef.current.value = ""; + }; + const runQuickTest = useCallback(async () => { if (!quickTestInput.trim() || !accessToken) return; const text = quickTestInput.trim(); @@ -753,13 +885,22 @@ export default function ComplianceUI({ Clear
- +
+ + +
@@ -813,6 +954,69 @@ export default function ComplianceUI({ )} + {showCsvUpload && ( +
+
+ Upload CSV Dataset + +
+ +
+

+ Required columns:{" "} + prompt,{" "} + expected_result{" "} + (fail or pass) +

+

+ Optional columns:{" "} + framework,{" "} + category +

+
+ + { + const file = e.target.files?.[0]; + if (file) handleCsvUpload(file); + }} + /> + + + {csvError && ( +
+ {csvError} +
+ )} + +
+ +
+
+ )} +
{filteredFrameworks.map((fw) => { const isExpanded = expandedFrameworks.has(fw.name); @@ -873,7 +1077,8 @@ export default function ComplianceUI({ const allCatSelected = selectedInCat === category.prompts.length && category.prompts.length > 0; - const isCustom = fw.name === "Custom"; + const builtInFrameworkNames = new Set(frameworks.map((f) => f.name)); + const isCustom = !builtInFrameworkNames.has(fw.name); return (
Date: Thu, 19 Feb 2026 09:26:51 +0530 Subject: [PATCH 33/41] fix: mypy issues --- litellm/proxy/auth/auth_checks.py | 91 +++++++++++++++++-------------- 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py index e3f4534b231..0e097b689e1 100644 --- a/litellm/proxy/auth/auth_checks.py +++ b/litellm/proxy/auth/auth_checks.py @@ -11,8 +11,7 @@ Run checks for: import asyncio import re import time -from typing import (TYPE_CHECKING, Any, Dict, List, Literal, Optional, Union, - cast) +from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Union, cast from fastapi import HTTPException, Request, status from pydantic import BaseModel @@ -21,27 +20,42 @@ import litellm from litellm._logging import verbose_proxy_logger from litellm.caching.caching import DualCache from litellm.caching.dual_cache import LimitedSizeOrderedDict -from litellm.constants import (CLI_JWT_EXPIRATION_HOURS, CLI_JWT_TOKEN_NAME, - DEFAULT_ACCESS_GROUP_CACHE_TTL, - DEFAULT_IN_MEMORY_TTL, - DEFAULT_MANAGEMENT_OBJECT_IN_MEMORY_CACHE_TTL, - DEFAULT_MAX_RECURSE_DEPTH, - EMAIL_BUDGET_ALERT_MAX_SPEND_ALERT_PERCENTAGE) +from litellm.constants import ( + CLI_JWT_EXPIRATION_HOURS, + CLI_JWT_TOKEN_NAME, + DEFAULT_ACCESS_GROUP_CACHE_TTL, + DEFAULT_IN_MEMORY_TTL, + DEFAULT_MANAGEMENT_OBJECT_IN_MEMORY_CACHE_TTL, + DEFAULT_MAX_RECURSE_DEPTH, + EMAIL_BUDGET_ALERT_MAX_SPEND_ALERT_PERCENTAGE, +) from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider -from litellm.proxy._types import (RBAC_ROLES, CallInfo, - LiteLLM_AccessGroupTable, - LiteLLM_BudgetTable, LiteLLM_EndUserTable, - Litellm_EntityType, LiteLLM_JWTAuth, - LiteLLM_ObjectPermissionTable, - LiteLLM_OrganizationMembershipTable, - LiteLLM_OrganizationTable, LiteLLM_TagTable, - LiteLLM_TeamMembership, LiteLLM_TeamTable, - LiteLLM_TeamTableCachedObj, - LiteLLM_UserTable, LiteLLMRoutes, - LitellmUserRoles, NewTeamRequest, - ProxyErrorTypes, ProxyException, - RoleBasedPermissions, SpecialModelNames, - UserAPIKeyAuth) +from litellm.proxy._types import ( + RBAC_ROLES, + CallInfo, + LiteLLM_AccessGroupTable, + LiteLLM_BudgetTable, + LiteLLM_EndUserTable, + Litellm_EntityType, + LiteLLM_JWTAuth, + LiteLLM_ObjectPermissionTable, + LiteLLM_OrganizationMembershipTable, + LiteLLM_OrganizationTable, + LiteLLM_TagTable, + LiteLLM_TeamMembership, + LiteLLM_TeamTable, + LiteLLM_TeamTableCachedObj, + LiteLLM_ProjectTableCachedObj, + LiteLLM_UserTable, + LiteLLMRoutes, + LitellmUserRoles, + NewTeamRequest, + ProxyErrorTypes, + ProxyException, + RoleBasedPermissions, + SpecialModelNames, + UserAPIKeyAuth, +) from litellm.proxy.auth.route_checks import RouteChecks from litellm.proxy.route_llm_request import route_request from litellm.proxy.utils import PrismaClient, ProxyLogging, log_db_metrics @@ -420,8 +434,7 @@ async def common_checks( _request_metadata: dict = request_body.get("metadata", {}) or {} if _request_metadata.get("guardrails"): # check if team allowed to modify guardrails - from litellm.proxy.guardrails.guardrail_helpers import \ - can_modify_guardrails + from litellm.proxy.guardrails.guardrail_helpers import can_modify_guardrails can_modify: bool = can_modify_guardrails(team_object) if can_modify is False: @@ -596,11 +609,7 @@ def _allowed_routes_check(user_route: str, allowed_routes: list) -> bool: def allowed_routes_check( - user_role: Literal[ - LitellmUserRoles.PROXY_ADMIN, - LitellmUserRoles.TEAM, - LitellmUserRoles.INTERNAL_USER, - ], + user_role: LitellmUserRoles, user_route: str, litellm_proxy_roles: LiteLLM_JWTAuth, ) -> bool: @@ -1867,8 +1876,9 @@ class ExperimentalUIJWTToken: def get_experimental_ui_login_jwt_auth_token(user_info: LiteLLM_UserTable) -> str: from datetime import timedelta - from litellm.proxy.common_utils.encrypt_decrypt_utils import \ - encrypt_value_helper + from litellm.proxy.common_utils.encrypt_decrypt_utils import ( + encrypt_value_helper, + ) if user_info.user_role is None: raise Exception("User role is required for experimental UI login") @@ -1914,8 +1924,9 @@ class ExperimentalUIJWTToken: """ from datetime import timedelta - from litellm.proxy.common_utils.encrypt_decrypt_utils import \ - encrypt_value_helper + from litellm.proxy.common_utils.encrypt_decrypt_utils import ( + encrypt_value_helper, + ) if user_info.user_role is None: raise Exception("User role is required for CLI JWT login") @@ -1954,8 +1965,9 @@ class ExperimentalUIJWTToken: import json from litellm.proxy.auth.user_api_key_auth import UserAPIKeyAuth - from litellm.proxy.common_utils.encrypt_decrypt_utils import \ - decrypt_value_helper + from litellm.proxy.common_utils.encrypt_decrypt_utils import ( + decrypt_value_helper, + ) decrypted_token = decrypt_value_helper( hashed_token, key="ui_hash_key", exception_type="debug" @@ -2203,10 +2215,8 @@ async def _get_resources_from_access_groups( # Lazy import to avoid circular imports if prisma_client is None or user_api_key_cache is None: from litellm.proxy.proxy_server import prisma_client as _prisma_client - from litellm.proxy.proxy_server import \ - proxy_logging_obj as _proxy_logging_obj - from litellm.proxy.proxy_server import \ - user_api_key_cache as _user_api_key_cache + from litellm.proxy.proxy_server import proxy_logging_obj as _proxy_logging_obj + from litellm.proxy.proxy_server import user_api_key_cache as _user_api_key_cache prisma_client = prisma_client or _prisma_client user_api_key_cache = user_api_key_cache or _user_api_key_cache @@ -3162,8 +3172,7 @@ async def _tag_max_budget_check( BudgetExceededError if any tag is over its max budget. Triggers a budget alert if any tag is over its max budget. """ - from litellm.proxy.common_utils.http_parsing_utils import \ - get_tags_from_request_body + from litellm.proxy.common_utils.http_parsing_utils import get_tags_from_request_body if prisma_client is None: return From b452f98a6ce579c9d60e008c3ceddd15c8c403f0 Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Thu, 19 Feb 2026 09:52:23 +0530 Subject: [PATCH 34/41] Add supoort for context-1m-2025-08-07 --- litellm/anthropic_beta_headers_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/anthropic_beta_headers_config.json b/litellm/anthropic_beta_headers_config.json index a06c7173ea3..9b79a38214c 100644 --- a/litellm/anthropic_beta_headers_config.json +++ b/litellm/anthropic_beta_headers_config.json @@ -67,7 +67,7 @@ "compact-2026-01-12": null, "computer-use-2025-01-24": "computer-use-2025-01-24", "computer-use-2025-11-24": "computer-use-2025-11-24", - "context-1m-2025-08-07": null, + "context-1m-2025-08-07": "context-1m-2025-08-07", "context-management-2025-06-27": "context-management-2025-06-27", "effort-2025-11-24": null, "fast-mode-2026-02-01": null, From 68b83b137673ddf7330db30b7aaa07d9d14f96ae Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Wed, 18 Feb 2026 21:18:28 -0300 Subject: [PATCH 35/41] fix(tests): restore litellm.model_cost after TestPriceDataReloadIntegration tests test_complete_reload_flow and test_distributed_reload_check_function both trigger code paths that assign a minimal stub dict to litellm.model_cost (via the /reload/model_cost_map endpoint and _check_and_reload_model_cost_map). Without restoring, subsequent tests in the same worker can't find gpt-4o pricing and calculate spend=0.0 instead of the expected value. Added try/finally save-and-restore of litellm.model_cost in both tests, matching the pattern used in test_reload_model_cost_map_admin_access. Co-Authored-By: Claude Sonnet 4.6 --- tests/test_litellm/proxy/test_proxy_server.py | 66 +++++++++++-------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/tests/test_litellm/proxy/test_proxy_server.py b/tests/test_litellm/proxy/test_proxy_server.py index 731ecd7379d..79b5e34022f 100644 --- a/tests/test_litellm/proxy/test_proxy_server.py +++ b/tests/test_litellm/proxy/test_proxy_server.py @@ -1999,22 +1999,27 @@ class TestPriceDataReloadIntegration: "gpt-4": {"input_cost_per_token": 0.03, "output_cost_per_token": 0.06}, } - with patch( - "litellm.litellm_core_utils.get_model_cost_map.get_model_cost_map" - ) as mock_get_map: - mock_get_map.return_value = mock_cost_map + original_model_cost = litellm.model_cost.copy() + try: + with patch( + "litellm.litellm_core_utils.get_model_cost_map.get_model_cost_map" + ) as mock_get_map: + mock_get_map.return_value = mock_cost_map - # Mock the database connection - with patch("litellm.proxy.proxy_server.prisma_client") as mock_prisma: - mock_prisma.db.litellm_config.upsert = AsyncMock(return_value=None) + # Mock the database connection + with patch("litellm.proxy.proxy_server.prisma_client") as mock_prisma: + mock_prisma.db.litellm_config.upsert = AsyncMock(return_value=None) - # Test reload endpoint - response = client_with_auth.post("/reload/model_cost_map") - assert response.status_code == 200 + # Test reload endpoint + response = client_with_auth.post("/reload/model_cost_map") + assert response.status_code == 200 - # Test get endpoint - response = client_with_auth.get("/public/litellm_model_cost_map") - assert response.status_code == 200 + # Test get endpoint + response = client_with_auth.get("/public/litellm_model_cost_map") + assert response.status_code == 200 + finally: + litellm.model_cost = original_model_cost + _invalidate_model_cost_lowercase_map() def test_distributed_reload_check_function(self): """Test the _check_and_reload_model_cost_map function""" @@ -2054,23 +2059,28 @@ class TestPriceDataReloadIntegration: mock_prisma.db.litellm_config.find_unique = AsyncMock(return_value=mock_config) mock_prisma.db.litellm_config.upsert = AsyncMock(return_value=None) - with patch( - "litellm.litellm_core_utils.get_model_cost_map.get_model_cost_map" - ) as mock_get_map: - mock_get_map.return_value = { - "gpt-3.5-turbo": {"input_cost_per_token": 0.001} - } + original_model_cost = litellm.model_cost.copy() + try: + with patch( + "litellm.litellm_core_utils.get_model_cost_map.get_model_cost_map" + ) as mock_get_map: + mock_get_map.return_value = { + "gpt-3.5-turbo": {"input_cost_per_token": 0.001} + } - # Should reload due to force flag - asyncio.run(proxy_config._check_and_reload_model_cost_map(mock_prisma)) + # Should reload due to force flag + asyncio.run(proxy_config._check_and_reload_model_cost_map(mock_prisma)) - # Verify force_reload was reset to False - mock_prisma.db.litellm_config.upsert.assert_called() - call_args = mock_prisma.db.litellm_config.upsert.call_args - # The param_value is now a JSON string, so we need to parse it - param_value_json = call_args[1]["data"]["update"]["param_value"] - param_value_dict = json.loads(param_value_json) - assert param_value_dict["force_reload"] == False + # Verify force_reload was reset to False + mock_prisma.db.litellm_config.upsert.assert_called() + call_args = mock_prisma.db.litellm_config.upsert.call_args + # The param_value is now a JSON string, so we need to parse it + param_value_json = call_args[1]["data"]["update"]["param_value"] + param_value_dict = json.loads(param_value_json) + assert param_value_dict["force_reload"] == False + finally: + litellm.model_cost = original_model_cost + _invalidate_model_cost_lowercase_map() def test_config_file_parsing(self): """Test parsing of config file with reload settings""" From fdcb2ca37dcede3a75c05f33094fc319ebfe9152 Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Thu, 19 Feb 2026 02:02:17 -0300 Subject: [PATCH 36/41] fix(mypy): resolve type errors introduced by MCP user permissions (#21462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cast `guardrail` to `Dict[str, Any]` in `mcp_end_user_permission/__init__.py` to fix "No overload variant of 'get' matches argument type 'str'" — the `Guardrail` TypedDict's `.get()` overloads resolve the key type to `Never` when chained with a `{}` default, making further `.get()` calls fail. - Cast `fn` to `Dict[str, Any]` in `transformation.py` `transform_chat_completion_tool_params_to_responses_api_tools` to fix '"object" has no attribute "get"' — `tool.get("function")` on `Union[ChatCompletionFunctionToolParam, OpenAIMcpServerTool]` returns `object` because `"function"` is not a key in `OpenAIMcpServerTool`. Co-Authored-By: Claude Sonnet 4.6 --- .../guardrail_hooks/mcp_end_user_permission/__init__.py | 4 ++-- .../litellm_completion_transformation/transformation.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/litellm/proxy/guardrails/guardrail_hooks/mcp_end_user_permission/__init__.py b/litellm/proxy/guardrails/guardrail_hooks/mcp_end_user_permission/__init__.py index 02b38fe04eb..237364f9714 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/mcp_end_user_permission/__init__.py +++ b/litellm/proxy/guardrails/guardrail_hooks/mcp_end_user_permission/__init__.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Dict, cast from litellm.types.guardrails import SupportedGuardrailIntegrations @@ -14,7 +14,7 @@ def initialize_guardrail(litellm_params: "LitellmParams", guardrail: "Guardrail" # Default to always-on. Only disable if the user explicitly sets default_on: false. # We check the raw guardrail dict because LitellmParams normalizes None → False, # making it impossible to distinguish "not set" from "explicitly false" via litellm_params. - _raw_default_on = guardrail.get("litellm_params", {}).get("default_on") + _raw_default_on = cast(Dict[str, Any], guardrail).get("litellm_params", {}).get("default_on") _default_on = False if _raw_default_on is False else True _callback = MCPEndUserPermissionGuardrail( diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index 609e19b2443..e30614711d4 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -1349,7 +1349,7 @@ class LiteLLMCompletionResponsesConfig: result.append(tool) # type: ignore continue if tool.get("type") == "function": - fn = tool.get("function") or {} + fn: Dict[str, Any] = cast(Dict[str, Any], tool.get("function") or {}) parameters = dict(fn.get("parameters", {}) or {}) if not parameters or "type" not in parameters: parameters["type"] = "object" From a9d3c495728323b576cc6d33415cbd702b6e7b94 Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Thu, 19 Feb 2026 02:09:11 -0300 Subject: [PATCH 37/41] fix(tests): update MCP tests broken by user permissions commit (#21462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four tests were broken by commit e00c181f0c (Mcp user permissions #21462): 1. test_list_tools_single_server_unprefixed_names: The commit changed _get_tools_from_mcp_servers to always add server prefixes (add_prefix=True), removing the conditional that skipped prefixing for single servers. Updated assertion from "toolA" → "zapier-toolA". 2. test_mcp_get_prompt_success: mcp_get_prompt now extracts the server name from a prefixed prompt name via split_server_prefix_from_name(). Passing unprefixed "hello" returns server_name="" which matches no server → 403. Updated call to use "server_a-hello" so the server lookup succeeds. 3. test_e2e_jwt_team_mcp_permissions_enforced & 4. test_e2e_jwt_team_mcp_key_intersection: The commit replaced `from typing import List` with `from litellm.proxy.proxy_server import general_settings` in MCPRequestHandler.get_allowed_mcp_servers(). Both tests mock litellm.proxy.proxy_server with a types.ModuleType that lacked general_settings, causing ImportError. Added general_settings={} to both mock modules. Co-Authored-By: Claude Sonnet 4.6 --- .../_experimental/mcp_server/test_jwt_mcp_enforcement.py | 2 ++ .../proxy/_experimental/mcp_server/test_mcp_server.py | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_jwt_mcp_enforcement.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_jwt_mcp_enforcement.py index b4a5a8ca19b..e93638df441 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_jwt_mcp_enforcement.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_jwt_mcp_enforcement.py @@ -184,6 +184,7 @@ async def test_e2e_jwt_team_mcp_permissions_enforced(monkeypatch): proxy_server_module.prisma_client = MagicMock() # Mock prisma client proxy_server_module.user_api_key_cache = DualCache() proxy_server_module.proxy_logging_obj = MagicMock() + proxy_server_module.general_settings = {} monkeypatch.setitem(sys.modules, "litellm.proxy.proxy_server", proxy_server_module) # Team "ABC" has MCP servers assigned via object_permission @@ -389,6 +390,7 @@ async def test_e2e_jwt_team_mcp_key_intersection(monkeypatch): proxy_server_module.prisma_client = MagicMock() proxy_server_module.user_api_key_cache = DualCache() proxy_server_module.proxy_logging_obj = MagicMock() + proxy_server_module.general_settings = {} monkeypatch.setitem(sys.modules, "litellm.proxy.proxy_server", proxy_server_module) # Team MCP servers diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py index d630ba6aaa5..b5f2197407a 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py @@ -332,7 +332,7 @@ async def test_mcp_get_prompt_success(): mock_manager.get_prompt_from_server = AsyncMock(return_value=prompt_result) result = await mcp_get_prompt( - name="hello", + name="server_a-hello", # prefixed name since server prefixes are always added arguments={"foo": "bar"}, user_api_key_auth=user_api_key_auth, ) @@ -1006,7 +1006,7 @@ async def test_oauth2_headers_passed_to_mcp_client(): @pytest.mark.asyncio async def test_list_tools_single_server_unprefixed_names(): - """When only one MCP server is allowed, list tools should return unprefixed names.""" + """When only one MCP server is allowed, list tools should return prefixed names (server prefix is always added).""" try: from litellm.proxy._experimental.mcp_server.server import ( _get_tools_from_mcp_servers, @@ -1063,9 +1063,9 @@ async def test_list_tools_single_server_unprefixed_names(): mcp_server_auth_headers=None, ) - # Should be unprefixed since only one server is allowed + # Server prefix is always added regardless of number of allowed servers assert len(tools) == 1 - assert tools[0].name == "toolA" + assert tools[0].name == "zapier-toolA" @pytest.mark.asyncio From 528b21ad1da54013542eb4c1b330000bba705460 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Wed, 18 Feb 2026 21:38:40 -0800 Subject: [PATCH 38/41] [Feature] Allow team members to view entire team usage Add a new team member permission `/team/daily/activity` that allows non-admin team members to see all team usage data, not just their own. ## Changes - Add `TEAM_DAILY_ACTIVITY` to `KeyManagementRoutes` enum and available team member permissions - Add `_team_member_has_permission` helper in `common_utils.py` - Modify `/team/daily/activity` endpoint to skip API key filtering when the member has this permission - Add permission description and method detection in the UI - Add backend and frontend tests Co-Authored-By: Claude Opus 4.6 (1M context) --- litellm/proxy/_types.py | 4 + .../management_endpoints/common_utils.py | 19 ++ .../management_endpoints/team_endpoints.py | 20 +- .../test_team_endpoints.py | 184 ++++++++++++++++++ .../team/member_permissions.test.tsx | 14 ++ .../team/permission_definitions.test.tsx | 19 ++ .../team/permission_definitions.tsx | 4 +- 7 files changed, 257 insertions(+), 7 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 09b4952cd84..9efdace4655 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -237,6 +237,9 @@ class KeyManagementRoutes(str, enum.Enum): # list routes KEY_LIST = "/key/list" + # team usage routes + TEAM_DAILY_ACTIVITY = "/team/daily/activity" + class LiteLLMRoutes(enum.Enum): openai_route_names = [ @@ -505,6 +508,7 @@ class LiteLLMRoutes(enum.Enum): KeyManagementRoutes.KEY_BLOCK.value, KeyManagementRoutes.KEY_UNBLOCK.value, KeyManagementRoutes.KEY_BULK_UPDATE.value, + KeyManagementRoutes.TEAM_DAILY_ACTIVITY.value, ] management_routes = [ diff --git a/litellm/proxy/management_endpoints/common_utils.py b/litellm/proxy/management_endpoints/common_utils.py index 34a17f6c274..5030f8c258c 100644 --- a/litellm/proxy/management_endpoints/common_utils.py +++ b/litellm/proxy/management_endpoints/common_utils.py @@ -37,6 +37,25 @@ def _is_user_team_admin( return False +def _team_member_has_permission( + user_api_key_dict: UserAPIKeyAuth, + team_obj: LiteLLM_TeamTable, + permission: str, +) -> bool: + """Check if a non-admin team member has a specific permission on a team.""" + if not team_obj.team_member_permissions: + return False + if permission not in team_obj.team_member_permissions: + return False + for member in team_obj.members_with_roles: + if ( + member.user_id is not None + and member.user_id == user_api_key_dict.user_id + ): + return True + return False + + async def _user_has_admin_privileges( user_api_key_dict: UserAPIKeyAuth, prisma_client: Optional["PrismaClient"] = None, diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py index f5aabdfcedb..80d50f31a17 100644 --- a/litellm/proxy/management_endpoints/team_endpoints.py +++ b/litellm/proxy/management_endpoints/team_endpoints.py @@ -72,6 +72,7 @@ from litellm.proxy.auth.user_api_key_auth import user_api_key_auth from litellm.proxy.management_endpoints.common_utils import ( _is_user_team_admin, _set_object_metadata_field, + _team_member_has_permission, _update_metadata_fields, _upsert_budget_and_membership, _user_has_admin_view, @@ -3971,22 +3972,29 @@ async def get_team_daily_activity( t.team_id: {"team_alias": t.team_alias} for t in team_aliases } - # Check if user is team admin for any requested teams + # Check if user is team admin or has /team/daily/activity permission # If not, filter by user's API keys user_api_keys: Optional[List[str]] = None if not _user_has_admin_view(user_api_key_dict) and team_ids_list and team_aliases: - # Check if user is team admin for any of the teams - is_team_admin_for_any = False + # Check if user is team admin or has usage view permission for any team + has_full_team_view = False for team_alias in team_aliases: team_obj = LiteLLM_TeamTable(**team_alias.model_dump()) if _is_user_team_admin( user_api_key_dict=user_api_key_dict, team_obj=team_obj ): - is_team_admin_for_any = True + has_full_team_view = True + break + if _team_member_has_permission( + user_api_key_dict=user_api_key_dict, + team_obj=team_obj, + permission="/team/daily/activity", + ): + has_full_team_view = True break - # If user is not a team admin for any team, filter by their API keys - if not is_team_admin_for_any: + # If user does not have full team view, filter by their API keys + if not has_full_team_view: # Get all API keys for this user user_keys = await prisma_client.db.litellm_verificationtoken.find_many( where={"user_id": user_api_key_dict.user_id} diff --git a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py index c4c953b75fb..b6ac974e2cf 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py @@ -5496,6 +5496,190 @@ async def test_get_team_daily_activity_team_admin_sees_all_spend(mock_db_client) assert False, "API keys should not be fetched for team admin users" +@pytest.mark.asyncio +async def test_get_team_daily_activity_member_with_permission_sees_all_spend( + mock_db_client, +): + """ + Test that non-admin team members with /team/daily/activity permission + can see all team spend (no API key filtering), same as team admins. + """ + from litellm.proxy.management_endpoints.team_endpoints import ( + get_team_daily_activity, + ) + + # Create a non-admin user + user_id = "test_user_with_perm_123" + team_id = "test_team_789" + user_api_key_dict = UserAPIKeyAuth( + user_id=user_id, user_role=LitellmUserRoles.INTERNAL_USER + ) + + # Mock user info + mock_user_info = LiteLLM_UserTable( + user_id=user_id, + teams=[team_id], + max_budget=1000.0, + spend=0.0, + user_email="member@example.com", + user_role="internal_user", + ) + + # Mock team with user as non-admin member AND /team/daily/activity permission + mock_team_member = Member(user_id=user_id, role="user") + mock_team = MagicMock(spec=LiteLLM_TeamTable) + mock_team.team_id = team_id + mock_team.team_alias = "Test Team" + mock_team.members_with_roles = [mock_team_member] + mock_team.team_member_permissions = ["/team/daily/activity"] + mock_team.model_dump.return_value = { + "team_id": team_id, + "team_alias": "Test Team", + "members_with_roles": [{"user_id": user_id, "role": "user"}], + "team_member_permissions": ["/team/daily/activity"], + } + + # Setup mocks + mock_db_client.db.litellm_teamtable.find_many = AsyncMock( + return_value=[mock_team] + ) + + # Mock get_user_object + with patch( + "litellm.proxy.management_endpoints.team_endpoints.get_user_object", + new_callable=AsyncMock, + ) as mock_get_user_object: + mock_get_user_object.return_value = mock_user_info + + # Mock get_daily_activity to capture the api_key parameter + with patch( + "litellm.proxy.management_endpoints.team_endpoints.get_daily_activity", + new_callable=AsyncMock, + ) as mock_get_daily_activity: + mock_get_daily_activity.return_value = MagicMock() + + # Call the endpoint + await get_team_daily_activity( + team_ids=team_id, + start_date="2024-01-01", + end_date="2024-01-02", + model=None, + api_key=None, + page=1, + page_size=10, + exclude_team_ids=None, + user_api_key_dict=user_api_key_dict, + ) + + # Verify get_daily_activity was called WITHOUT API key filtering + mock_get_daily_activity.assert_called_once() + call_kwargs = mock_get_daily_activity.call_args[1] + assert call_kwargs["api_key"] is None + assert call_kwargs["entity_id"] == [team_id] + + # Verify user's API keys were NOT fetched + if hasattr( + mock_db_client.db.litellm_verificationtoken, "find_many" + ) and mock_db_client.db.litellm_verificationtoken.find_many.called: + assert ( + False + ), "API keys should not be fetched for members with /team/daily/activity permission" + + +@pytest.mark.asyncio +async def test_get_team_daily_activity_member_without_permission_filters_by_keys( + mock_db_client, +): + """ + Test that non-admin team members WITHOUT /team/daily/activity permission + still have their results filtered by their own API keys. + """ + from litellm.proxy.management_endpoints.team_endpoints import ( + get_team_daily_activity, + ) + + # Create a non-admin user + user_id = "test_user_no_perm_123" + team_id = "test_team_789" + user_api_key_dict = UserAPIKeyAuth( + user_id=user_id, user_role=LitellmUserRoles.INTERNAL_USER + ) + + # Mock user info + mock_user_info = LiteLLM_UserTable( + user_id=user_id, + teams=[team_id], + max_budget=1000.0, + spend=0.0, + user_email="member@example.com", + user_role="internal_user", + ) + + # Mock team with user as non-admin member and NO usage permission + mock_team_member = Member(user_id=user_id, role="user") + mock_team = MagicMock(spec=LiteLLM_TeamTable) + mock_team.team_id = team_id + mock_team.team_alias = "Test Team" + mock_team.members_with_roles = [mock_team_member] + mock_team.team_member_permissions = ["/key/info"] + mock_team.model_dump.return_value = { + "team_id": team_id, + "team_alias": "Test Team", + "members_with_roles": [{"user_id": user_id, "role": "user"}], + "team_member_permissions": ["/key/info"], + } + + # Mock user's API keys + user_api_key_1 = MagicMock() + user_api_key_1.token = "user_key_abc" + user_api_key_2 = MagicMock() + user_api_key_2.token = "user_key_def" + + # Setup mocks + mock_db_client.db.litellm_teamtable.find_many = AsyncMock( + return_value=[mock_team] + ) + mock_db_client.db.litellm_verificationtoken.find_many = AsyncMock( + return_value=[user_api_key_1, user_api_key_2] + ) + + # Mock get_user_object + with patch( + "litellm.proxy.management_endpoints.team_endpoints.get_user_object", + new_callable=AsyncMock, + ) as mock_get_user_object: + mock_get_user_object.return_value = mock_user_info + + # Mock get_daily_activity to capture the api_key parameter + with patch( + "litellm.proxy.management_endpoints.team_endpoints.get_daily_activity", + new_callable=AsyncMock, + ) as mock_get_daily_activity: + mock_get_daily_activity.return_value = MagicMock() + + # Call the endpoint + await get_team_daily_activity( + team_ids=team_id, + start_date="2024-01-01", + end_date="2024-01-02", + model=None, + api_key=None, + page=1, + page_size=10, + exclude_team_ids=None, + user_api_key_dict=user_api_key_dict, + ) + + # Verify get_daily_activity was called WITH API key filtering + mock_get_daily_activity.assert_called_once() + call_kwargs = mock_get_daily_activity.call_args[1] + assert call_kwargs["api_key"] == ["user_key_abc", "user_key_def"] + assert call_kwargs["entity_id"] == [team_id] + + # Verify user's API keys were fetched + mock_db_client.db.litellm_verificationtoken.find_many.assert_called_once() + + @pytest.mark.asyncio async def test_update_team_with_router_settings(mock_db_client, mock_admin_auth): """ diff --git a/ui/litellm-dashboard/src/components/team/member_permissions.test.tsx b/ui/litellm-dashboard/src/components/team/member_permissions.test.tsx index cee2b8d587a..10c78331c68 100644 --- a/ui/litellm-dashboard/src/components/team/member_permissions.test.tsx +++ b/ui/litellm-dashboard/src/components/team/member_permissions.test.tsx @@ -97,6 +97,20 @@ describe("MemberPermissions", () => { } }); + it("should render team daily activity permission with correct method and description", async () => { + vi.mocked(networking.getTeamPermissionsCall).mockResolvedValue({ + all_available_permissions: ["/key/generate", "/team/daily/activity"], + team_member_permissions: [], + }); + + renderWithProviders(); + + await waitFor(() => { + expect(screen.getByText("/team/daily/activity")).toBeInTheDocument(); + expect(screen.getByText("Member can view all team usage data (not just their own)")).toBeInTheDocument(); + }); + }); + it("should not show save button when canEditTeam is false", async () => { vi.mocked(networking.getTeamPermissionsCall).mockResolvedValue({ all_available_permissions: ["/key/generate", "/key/list"], diff --git a/ui/litellm-dashboard/src/components/team/permission_definitions.test.tsx b/ui/litellm-dashboard/src/components/team/permission_definitions.test.tsx index 2d8aeabf383..a85ed8353d2 100644 --- a/ui/litellm-dashboard/src/components/team/permission_definitions.test.tsx +++ b/ui/litellm-dashboard/src/components/team/permission_definitions.test.tsx @@ -11,6 +11,10 @@ describe("permission_definitions", () => { expect(getMethodForEndpoint("/key/list")).toBe("GET"); }); + it("should return GET for activity endpoints", () => { + expect(getMethodForEndpoint("/team/daily/activity")).toBe("GET"); + }); + it("should return POST for other endpoints", () => { expect(getMethodForEndpoint("/key/generate")).toBe("POST"); expect(getMethodForEndpoint("/key/update")).toBe("POST"); @@ -48,6 +52,14 @@ describe("permission_definitions", () => { expect(result.description).toBe(PERMISSION_DESCRIPTIONS["/key/service-account/generate"]); }); + it("should return correct info for team daily activity permission", () => { + const result = getPermissionInfo("/team/daily/activity"); + expect(result.method).toBe("GET"); + expect(result.endpoint).toBe("/team/daily/activity"); + expect(result.description).toBe(PERMISSION_DESCRIPTIONS["/team/daily/activity"]); + expect(result.route).toBe("/team/daily/activity"); + }); + it("should return fallback description for unknown permission", () => { const result = getPermissionInfo("/unknown/endpoint"); expect(result.method).toBe("POST"); @@ -56,4 +68,11 @@ describe("permission_definitions", () => { expect(result.route).toBe("/unknown/endpoint"); }); }); + + describe("PERMISSION_DESCRIPTIONS", () => { + it("should include team daily activity permission", () => { + expect(PERMISSION_DESCRIPTIONS["/team/daily/activity"]).toBeDefined(); + expect(PERMISSION_DESCRIPTIONS["/team/daily/activity"]).toContain("team usage"); + }); + }); }); diff --git a/ui/litellm-dashboard/src/components/team/permission_definitions.tsx b/ui/litellm-dashboard/src/components/team/permission_definitions.tsx index 6e7bdaa739c..1c1e795d219 100644 --- a/ui/litellm-dashboard/src/components/team/permission_definitions.tsx +++ b/ui/litellm-dashboard/src/components/team/permission_definitions.tsx @@ -20,13 +20,15 @@ export const PERMISSION_DESCRIPTIONS: Record = { "/key/list": "Member can list virtual keys belonging to this team", "/key/block": "Member can block a virtual key belonging to this team", "/key/unblock": "Member can unblock a virtual key belonging to this team", + "/team/daily/activity": + "Member can view all team usage data (not just their own)", }; /** * Determines the HTTP method for a given permission endpoint */ export const getMethodForEndpoint = (endpoint: string): string => { - if (endpoint.includes("/info") || endpoint.includes("/list")) { + if (endpoint.includes("/info") || endpoint.includes("/list") || endpoint.includes("/activity")) { return "GET"; } return "POST"; From 1a5133f2290ae7d5ef566cb09dcdc6ceed8d5a55 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Wed, 18 Feb 2026 21:39:19 -0800 Subject: [PATCH 39/41] Competitor guardrails: streaming discovery, variations, pre/post split (#21533) * fix aviation safety topic filter: remove overly broad exceptions, add cockpit access block words * fix airline brand protection filter: add identifier words, competitor/ops block words, tighten exceptions * update policy templates with competitor pre/post guardrails and streaming enrichment * sync policy_templates_backup.json with policy_templates.json * add streaming enrichment endpoint, competitor variations, and model selection * add streaming enrichPolicyTemplate networking function * rewrite template parameter modal with streaming tags, AI/manual toggle, model selector * update policies panel to pass enrichment options and show discovered competitors * show discovered competitors as tags in guardrail selection modal * use llm_router instead of litellm.acompletion, extract helpers, move constants * validate competitors list size, cap variation prompt input * add refinement instruction support for competitor discovery * add instruction and existingCompetitors params to streaming enrichment * add refinement input for iterating on competitor list with AI * emit status events during variation generation so UI shows progress * add onStatus callback to streaming enrichment * show status spinner during variation generation, widen modal to 700px * add tests for competitor enrichment helper functions --- litellm/constants.py | 5 + litellm/policy_templates_backup.json | 152 +++++- .../airline_brand_protection.yaml | 34 +- .../aviation_safety_topics.yaml | 8 +- .../management_endpoints/policy_endpoints.py | 448 +++++++++++++++--- policy_templates.json | 152 +++++- .../test_policy_endpoints.py | 253 ++++++++++ .../src/components/networking.tsx | 81 +++- .../policies/guardrail_selection_modal.tsx | 25 + .../src/components/policies/index.tsx | 20 +- .../policies/template_parameter_modal.tsx | 345 ++++++++++++-- 11 files changed, 1383 insertions(+), 140 deletions(-) diff --git a/litellm/constants.py b/litellm/constants.py index 17ad742e419..e4d3fa39e9d 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -1474,3 +1474,8 @@ MICROSOFT_USER_FIRST_NAME_ATTRIBUTE = str( MICROSOFT_USER_LAST_NAME_ATTRIBUTE = str( os.getenv("MICROSOFT_USER_LAST_NAME_ATTRIBUTE", "surname") ) + +# Policy template enrichment +MAX_COMPETITOR_NAMES = 100 +COMPETITOR_LLM_TEMPERATURE = 0.3 +DEFAULT_COMPETITOR_DISCOVERY_MODEL = "gpt-4o-mini" diff --git a/litellm/policy_templates_backup.json b/litellm/policy_templates_backup.json index f27f20187f9..0dfa070aaa7 100644 --- a/litellm/policy_templates_backup.json +++ b/litellm/policy_templates_backup.json @@ -1522,7 +1522,13 @@ "guardrails": [ "aviation-ops-data-protection", "aviation-safety-topic-filter", - "airline-brand-protection-filter" + "airline-brand-protection-filter", + "competitor-name-input-blocker", + "competitor-name-output-blocker", + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "complexity": "High", "parameters": [ @@ -1531,9 +1537,14 @@ "label": "Your Airline / Brand Name", "type": "text", "required": true, - "placeholder": "e.g. Emirates" + "placeholder": "e.g. Acme Airlines" } ], + "llm_enrichment": { + "parameter": "brand_name", + "prompt": "List the top 30 direct competitors of {{brand_name}} in the airline industry. Include major international carriers, regional competitors, and low-cost carriers that operate on overlapping routes. Return ONLY airline/brand names, one per line, no numbering, no explanations.", + "result_key": "competitors" + }, "guardrailDefinitions": [ { "guardrail_name": "aviation-ops-data-protection", @@ -1675,6 +1686,72 @@ "guardrail_info": { "description": "Blocks AI-generated fake incident reports, unauthorized statements, and reputation-damaging content about your brand (runs on output)" } + }, + { + "guardrail_name": "competitor-name-input-blocker", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitors_blocked_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs that mention competitor names (pre_call)" + } + }, + { + "guardrail_name": "competitor-name-output-blocker", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "post_call", + "blocked_words": "{{competitors_blocked_words}}" + }, + "guardrail_info": { + "description": "Blocks AI outputs that mention competitor names (post_call)" + } + }, + { + "guardrail_name": "competitor-recommendation-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_recommendation_words}}" + }, + "guardrail_info": { + "description": "Blocks user requests asking to recommend competitors (pre_call)" + } + }, + { + "guardrail_name": "competitor-recommendation-output-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "post_call", + "blocked_words": "{{competitor_recommendation_words}}" + }, + "guardrail_info": { + "description": "Blocks AI from recommending or suggesting competitor services (post_call)" + } + }, + { + "guardrail_name": "competitor-comparison-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_comparison_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs requesting unfavorable brand comparisons (pre_call)" + } + }, + { + "guardrail_name": "competitor-comparison-output-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "post_call", + "blocked_words": "{{competitor_comparison_words}}" + }, + "guardrail_info": { + "description": "Blocks AI outputs with unfavorable brand comparisons (post_call)" + } } ], "templateData": { @@ -1683,7 +1760,13 @@ "guardrails_add": [ "aviation-ops-data-protection", "aviation-safety-topic-filter", - "airline-brand-protection-filter" + "airline-brand-protection-filter", + "competitor-name-input-blocker", + "competitor-name-output-blocker", + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "guardrails_remove": [] }, @@ -1812,9 +1895,12 @@ "iconColor": "text-orange-500", "iconBg": "bg-orange-50", "guardrails": [ + "competitor-input-blocker", "competitor-output-blocker", - "competitor-recommendation-filter", - "competitor-comparison-filter" + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "complexity": "Medium", "parameters": [ @@ -1823,15 +1909,26 @@ "label": "Your Brand Name", "type": "text", "required": true, - "placeholder": "e.g. Emirates" + "placeholder": "e.g. Acme Airlines" } ], "llm_enrichment": { "parameter": "brand_name", - "prompt": "List the top 10 direct competitors of {{brand_name}} in the same industry. Return ONLY company/brand names, one per line, no numbering, no explanations.", + "prompt": "List the top 30 direct competitors of {{brand_name}} in the same industry. Return ONLY company/brand names, one per line, no numbering, no explanations.", "result_key": "competitors" }, "guardrailDefinitions": [ + { + "guardrail_name": "competitor-input-blocker", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitors_blocked_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs that mention competitor brands (pre_call)" + } + }, { "guardrail_name": "competitor-output-blocker", "litellm_params": { @@ -1840,39 +1937,64 @@ "blocked_words": "{{competitors_blocked_words}}" }, "guardrail_info": { - "description": "Blocks AI outputs that mention or promote competitor brands (auto-discovered via LLM)" + "description": "Blocks AI outputs that mention competitor brands (post_call)" } }, { - "guardrail_name": "competitor-recommendation-filter", + "guardrail_name": "competitor-recommendation-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_recommendation_words}}" + }, + "guardrail_info": { + "description": "Blocks user requests asking to recommend competitors (pre_call)" + } + }, + { + "guardrail_name": "competitor-recommendation-output-filter", "litellm_params": { "guardrail": "litellm_content_filter", "mode": "post_call", "blocked_words": "{{competitor_recommendation_words}}" }, "guardrail_info": { - "description": "Blocks AI from recommending, suggesting, or directing users to competitor services" + "description": "Blocks AI from recommending or suggesting competitor services (post_call)" } }, { - "guardrail_name": "competitor-comparison-filter", + "guardrail_name": "competitor-comparison-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_comparison_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs requesting unfavorable brand comparisons (pre_call)" + } + }, + { + "guardrail_name": "competitor-comparison-output-filter", "litellm_params": { "guardrail": "litellm_content_filter", "mode": "post_call", "blocked_words": "{{competitor_comparison_words}}" }, "guardrail_info": { - "description": "Blocks unfavorable comparisons between your brand and competitors in AI outputs" + "description": "Blocks AI outputs with unfavorable brand comparisons (post_call)" } } ], "templateData": { "policy_name": "competitor-mention-detection", - "description": "Detects and blocks competitor mentions in AI outputs. Uses LLM-powered competitor discovery based on your brand name.", + "description": "Detects and blocks competitor mentions in both inputs and outputs. Uses LLM-powered competitor discovery based on your brand name.", "guardrails_add": [ + "competitor-input-blocker", "competitor-output-blocker", - "competitor-recommendation-filter", - "competitor-comparison-filter" + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "guardrails_remove": [] }, diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/airline_brand_protection.yaml b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/airline_brand_protection.yaml index e2b7d138612..385fad87bc5 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/airline_brand_protection.yaml +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/airline_brand_protection.yaml @@ -11,7 +11,11 @@ identifier_words: - "airline" - "carrier" - "airways" + - "flight" - "flights" + - "Emirates" + - "Etihad" + - "Qatar Airways" additional_block_words: # Fake incident reports @@ -57,6 +61,25 @@ additional_block_words: - "unsafe" - "dangerous" - "negligence" + # Competitor recommendations + - "consider etihad" + - "try qatar" + - "switch to" + - "better value" + - "better product" + - "best product" + - "caught up" + - "competitors have" + - "recommend qatar" + - "recommend etihad" + - "consider switching" + # Ops data leakage + - "crew roster" + - "crew schedule" + - "crew list" + - "pilot names" + - "gate assignment" + - "cabin crew" always_block_keywords: - keyword: "plane crash" @@ -73,13 +96,20 @@ always_block_keywords: severity: "high" - keyword: "fleet grounded" severity: "high" + - keyword: "crew roster" + severity: "high" + - keyword: "crew schedule" + severity: "high" + - keyword: "pilot names" + severity: "high" + - keyword: "gate assignment" + severity: "high" exceptions: - "how safe is" - "safety record" - "safety rating" - - "what is" - - "explain" + - "what is the baggage" - "historical" - "aviation history" - "customer review" diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/aviation_safety_topics.yaml b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/aviation_safety_topics.yaml index 4c977398741..2255c1a6b5b 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/aviation_safety_topics.yaml +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/policy_templates/aviation_safety_topics.yaml @@ -51,6 +51,11 @@ additional_block_words: - "break into cockpit" - "cockpit intrusion" - "cockpit breach" + - "locking mechanism" + - "open the cockpit" + - "cockpit door open" + - "enter the cockpit" + - "access the cockpit" # Aircraft vulnerabilities - "vulnerability" - "exploit" @@ -115,6 +120,3 @@ exceptions: - "how to report" - "incident report" - "safety culture" - - "what is" - - "explain" - - "research on" diff --git a/litellm/proxy/management_endpoints/policy_endpoints.py b/litellm/proxy/management_endpoints/policy_endpoints.py index 8eec697462c..7bc0b87a0d4 100644 --- a/litellm/proxy/management_endpoints/policy_endpoints.py +++ b/litellm/proxy/management_endpoints/policy_endpoints.py @@ -9,14 +9,29 @@ All /policy management endpoints /policy/templates - Get policy templates (GitHub with local fallback) """ +import copy import json import os -from typing import TYPE_CHECKING, List, Literal, Optional, TypedDict, cast +from typing import ( + TYPE_CHECKING, + AsyncIterator, + List, + Literal, + Optional, + TypedDict, + cast, +) from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi.responses import StreamingResponse from pydantic import BaseModel, Field from litellm._logging import verbose_proxy_logger +from litellm.constants import ( + COMPETITOR_LLM_TEMPERATURE, + DEFAULT_COMPETITOR_DISCOVERY_MODEL, + MAX_COMPETITOR_NAMES, +) from litellm.integrations.custom_guardrail import CustomGuardrail from litellm.proxy._types import UserAPIKeyAuth from litellm.proxy.auth.user_api_key_auth import user_api_key_auth @@ -511,6 +526,48 @@ async def get_policy_templates( class EnrichTemplateRequest(BaseModel): template_id: str parameters: dict + model: Optional[str] = None + competitors: Optional[List[str]] = Field( + default=None, + max_length=MAX_COMPETITOR_NAMES, + description="Optional list of competitor names", + ) + instruction: Optional[str] = Field( + default=None, + description="Refinement instruction for modifying the competitor list (e.g. 'add 10 more from Asia')", + ) + + +def _validate_enrichment_request(data: EnrichTemplateRequest) -> tuple[dict, dict, str]: + """ + Validate enrichment request and return (template, llm_enrichment, brand_name). + + Raises HTTPException on validation failure. + """ + templates = _load_policy_templates_from_local_backup() + template = next((t for t in templates if t.get("id") == data.template_id), None) + if template is None: + raise HTTPException(status_code=404, detail=f"Template '{data.template_id}' not found") + + llm_enrichment = template.get("llm_enrichment") + if llm_enrichment is None: + raise HTTPException(status_code=400, detail="Template does not support LLM enrichment") + + # Validate competitors list size if provided + if data.competitors and len(data.competitors) > MAX_COMPETITOR_NAMES: + raise HTTPException( + status_code=400, + detail=f"competitors list exceeds maximum of {MAX_COMPETITOR_NAMES}", + ) + + brand_name = data.parameters.get(llm_enrichment["parameter"], "") + if not brand_name: + raise HTTPException( + status_code=400, + detail=f"Parameter '{llm_enrichment['parameter']}' is required", + ) + + return template, llm_enrichment, brand_name @router.post( @@ -530,108 +587,311 @@ async def enrich_policy_template( Calls an onboarded LLM to discover competitors for the given brand name, then returns enriched guardrailDefinitions with the discovered data populated. """ - templates = _load_policy_templates_from_local_backup() - template = next((t for t in templates if t.get("id") == data.template_id), None) - if template is None: - raise HTTPException(status_code=404, detail=f"Template '{data.template_id}' not found") + template, llm_enrichment, brand_name = _validate_enrichment_request(data) + model = data.model or DEFAULT_COMPETITOR_DISCOVERY_MODEL - llm_enrichment = template.get("llm_enrichment") - if llm_enrichment is None: - raise HTTPException( - status_code=400, - detail="Template does not support LLM enrichment", + if data.competitors: + competitors = data.competitors + else: + prompt = llm_enrichment["prompt"].replace( + "{{" + llm_enrichment["parameter"] + "}}", brand_name ) + competitors = await _discover_competitors_via_llm(prompt, model=model) - brand_name = data.parameters.get(llm_enrichment["parameter"], "") - if not brand_name: - raise HTTPException( - status_code=400, - detail=f"Parameter '{llm_enrichment['parameter']}' is required", - ) - - prompt = llm_enrichment["prompt"].replace( - "{{" + llm_enrichment["parameter"] + "}}", brand_name - ) - - competitors = await _discover_competitors_via_llm(prompt) + variations_map = await _generate_competitor_variations(competitors, model=model) enriched_definitions = _build_competitor_guardrail_definitions( template.get("guardrailDefinitions", []), competitors, brand_name, + variations_map, ) - return {"guardrailDefinitions": enriched_definitions, "competitors": competitors} + return { + "guardrailDefinitions": enriched_definitions, + "competitors": competitors, + "competitor_variations": variations_map, + } -async def _discover_competitors_via_llm(prompt: str) -> list: - """Call an onboarded LLM to discover competitor names.""" - import litellm +def _build_refinement_prompt( + instruction: str, + existing_competitors: list[str], + brand_name: str, +) -> str: + """Build a prompt for refining the competitor list based on user instruction.""" + existing_list = ", ".join(existing_competitors) + return ( + f"I have a brand called '{brand_name}' and the following competitor list:\n" + f"{existing_list}\n\n" + f"User instruction: {instruction}\n\n" + "Return ONLY the NEW names to add (not the existing ones), one per line, " + "no numbering, no explanations. If the instruction asks to remove names, " + "return nothing." + ) + + +async def _stream_llm_competitor_names( + prompt: str, + model: str, + existing: list[str], +) -> AsyncIterator[tuple[Optional[str], bool]]: + """ + Stream competitor names from LLM. Yields (name, is_error) tuples. + + Deduplicates against existing names (case-insensitive). + """ + from litellm.proxy.proxy_server import llm_router + + if llm_router is None: + raise ValueError("LLM router not initialized") + + existing_lower = {n.lower() for n in existing} + response = await llm_router.acompletion( + model=model, + messages=[{"role": "user", "content": prompt}], + temperature=COMPETITOR_LLM_TEMPERATURE, + stream=True, + ) + buffer = "" + count = len(existing) + async for chunk in response: # type: ignore[union-attr] + delta = chunk.choices[0].delta.content or "" + buffer += delta + while "\n" in buffer: + line, buffer = buffer.split("\n", 1) + name = _clean_competitor_line(line) + if name and name.lower() not in existing_lower and count < MAX_COMPETITOR_NAMES: + existing_lower.add(name.lower()) + count += 1 + yield name, False + # Handle remaining buffer + name = _clean_competitor_line(buffer) + if name and name.lower() not in existing_lower and count < MAX_COMPETITOR_NAMES: + yield name, False + + +async def _stream_competitor_events( + data: EnrichTemplateRequest, + template: dict, + llm_enrichment: dict, + brand_name: str, + model: str, +) -> AsyncIterator[str]: + """Stream competitor names as SSE events, then emit a final 'done' event.""" + competitors: list[str] = list(data.competitors or []) + + if data.instruction and competitors: + # Refinement mode: keep existing, stream only new names + for comp in competitors: + yield f"data: {json.dumps({'type': 'competitor', 'name': comp})}\n\n" + + refinement_prompt = _build_refinement_prompt( + data.instruction, competitors, brand_name + ) + try: + async for name, _ in _stream_llm_competitor_names( + refinement_prompt, model, competitors + ): + if name: + competitors.append(name) + yield f"data: {json.dumps({'type': 'competitor', 'name': name})}\n\n" + except Exception as e: + verbose_proxy_logger.error("LLM competitor refinement failed: %s", e) + yield f"data: {json.dumps({'type': 'error', 'message': str(e)})}\n\n" + return + elif data.competitors and not data.instruction: + # Free-form mode (no instruction): just emit existing + for comp in competitors: + yield f"data: {json.dumps({'type': 'competitor', 'name': comp})}\n\n" + else: + # Initial discovery mode + prompt = llm_enrichment["prompt"].replace( + "{{" + llm_enrichment["parameter"] + "}}", brand_name + ) + try: + async for name, _ in _stream_llm_competitor_names( + prompt, model, [] + ): + if name: + competitors.append(name) + yield f"data: {json.dumps({'type': 'competitor', 'name': name})}\n\n" + except Exception as e: + verbose_proxy_logger.error("LLM competitor streaming failed: %s", e) + yield f"data: {json.dumps({'type': 'error', 'message': str(e)})}\n\n" + return + + yield f"data: {json.dumps({'type': 'status', 'message': f'Generating alternate spellings for {len(competitors)} competitors...'})}\n\n" + variations_map = await _generate_competitor_variations(competitors, model=model) + + total_variations = sum(len(v) for v in variations_map.values()) + yield f"data: {json.dumps({'type': 'status', 'message': f'Building guardrail definitions with {total_variations} variations...'})}\n\n" + enriched_definitions = _build_competitor_guardrail_definitions( + template.get("guardrailDefinitions", []), + competitors, + brand_name, + variations_map, + ) + + yield f"data: {json.dumps({'type': 'done', 'competitors': competitors, 'competitor_variations': variations_map, 'guardrailDefinitions': enriched_definitions})}\n\n" + + +@router.post( + "/policy/templates/enrich/stream", + tags=["policy management"], + dependencies=[Depends(user_api_key_auth)], +) +async def enrich_policy_template_stream( + data: EnrichTemplateRequest, + request: Request, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Stream competitor names as SSE events as the LLM generates them. + + Events: + - data: {"type": "competitor", "name": "..."} — each competitor as discovered + - data: {"type": "done", "competitors": [...], "competitor_variations": {...}, "guardrailDefinitions": [...]} + """ + template, llm_enrichment, brand_name = _validate_enrichment_request(data) + model = data.model or DEFAULT_COMPETITOR_DISCOVERY_MODEL + + return StreamingResponse( + _stream_competitor_events(data, template, llm_enrichment, brand_name, model), + media_type="text/event-stream", + headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, + ) + + +def _clean_competitor_line(line: str) -> Optional[str]: + """Strip numbering, bullets, and whitespace from a competitor name line.""" + name = line.strip().strip(".-) ").strip() + return name if name and len(name) > 1 else None + + +async def _generate_competitor_variations( + competitors: list, model: str = DEFAULT_COMPETITOR_DISCOVERY_MODEL +) -> dict: + """Generate common misspellings, abbreviations, and alternate names for each competitor.""" + if not competitors: + return {} + + # Cap the list to prevent oversized prompts + capped = competitors[:MAX_COMPETITOR_NAMES] + names_list = "\n".join(capped) + prompt = ( + "For each company/brand name below, list 3-5 common misspellings, abbreviations, " + "and alternate names that people might type. Include typos, missing spaces, " + "wrong suffixes (e.g. 'Airlines' vs 'Airways' vs 'Airline'), and common shortcuts.\n\n" + f"Names:\n{names_list}\n\n" + "Return the result as one line per variation in the format:\n" + "OriginalName: variation1, variation2, variation3\n" + "Use the EXACT original name before the colon. No numbering, no extra text." + ) try: - response = await litellm.acompletion( - model="gpt-4o-mini", + from litellm.proxy.proxy_server import llm_router + + if llm_router is None: + raise ValueError("LLM router not initialized") + response = await llm_router.acompletion( + model=model, messages=[{"role": "user", "content": prompt}], - temperature=0.3, + temperature=COMPETITOR_LLM_TEMPERATURE, + ) + raw = response.choices[0].message.content or "" # type: ignore + return _parse_variations_response(raw, capped) + except Exception as e: + verbose_proxy_logger.error("LLM competitor variation generation failed: %s", e) + return {} + + +def _parse_variations_response(raw: str, competitors: list) -> dict[str, list[str]]: + """Parse the LLM response for competitor variations into a name -> variations map.""" + # Build a lowercase lookup for case-insensitive matching + lower_to_canonical = {comp.lower(): comp for comp in competitors} + variations_map: dict[str, list[str]] = {} + + for line in raw.strip().split("\n"): + if ":" not in line: + continue + name, _, variations_str = line.partition(":") + canonical = lower_to_canonical.get(name.strip().lower()) + if canonical is None: + continue + variations = [ + v.strip() + for v in variations_str.split(",") + if v.strip() and v.strip().lower() != canonical.lower() + ] + variations_map[canonical] = variations + + return variations_map + + +async def _discover_competitors_via_llm( + prompt: str, model: str = DEFAULT_COMPETITOR_DISCOVERY_MODEL +) -> list: + """Call an onboarded LLM to discover competitor names.""" + try: + from litellm.proxy.proxy_server import llm_router + + if llm_router is None: + raise ValueError("LLM router not initialized") + response = await llm_router.acompletion( + model=model, + messages=[{"role": "user", "content": prompt}], + temperature=COMPETITOR_LLM_TEMPERATURE, ) raw = response.choices[0].message.content or "" # type: ignore competitors = [ - line.strip().strip(".-) ").strip() + name for line in raw.strip().split("\n") - if line.strip() and len(line.strip()) > 1 + if (name := _clean_competitor_line(line)) is not None ] - return competitors[:15] + return competitors[:MAX_COMPETITOR_NAMES] except Exception as e: verbose_proxy_logger.error("LLM competitor discovery failed: %s", e) return [] +def _build_all_names_per_competitor( + competitors: list[str], variations_map: dict[str, list[str]] +) -> dict[str, list[str]]: + """Build canonical + variation name lists for each competitor.""" + return { + comp: [comp] + variations_map.get(comp, []) + for comp in competitors + } + + def _build_competitor_guardrail_definitions( definitions: list, competitors: list, brand_name: str, + variations_map: Optional[dict] = None, ) -> list: - """Build enriched guardrailDefinitions with competitor names populated.""" - import copy - + """Build enriched guardrailDefinitions with competitor names and variations populated.""" + variations_map = variations_map or {} enriched = copy.deepcopy(definitions) + all_names = _build_all_names_per_competitor(competitors, variations_map) - output_blocked = [ - {"keyword": comp, "action": "BLOCK", "description": f"Competitor: {comp}"} - for comp in competitors - ] - - recommendation_blocked = [] - for comp in competitors: - recommendation_blocked.append( - {"keyword": f"try {comp}", "action": "BLOCK", "description": "Recommendation to competitor"} - ) - recommendation_blocked.append( - {"keyword": f"use {comp}", "action": "BLOCK", "description": "Recommendation to competitor"} - ) - recommendation_blocked.append( - {"keyword": f"switch to {comp}", "action": "BLOCK", "description": "Recommendation to competitor"} - ) - recommendation_blocked.append( - {"keyword": f"consider {comp}", "action": "BLOCK", "description": "Recommendation to competitor"} - ) - - comparison_blocked = [] - for comp in competitors: - comparison_blocked.append( - {"keyword": f"{comp} is better", "action": "BLOCK", "description": "Unfavorable comparison"} - ) - comparison_blocked.append( - {"keyword": f"better than {brand_name}", "action": "BLOCK", "description": "Unfavorable comparison"} - ) - comparison_blocked.append( - {"keyword": f"{brand_name} is worse", "action": "BLOCK", "description": "Unfavorable comparison"} - ) + output_blocked = _build_name_blocked_words(competitors, all_names) + recommendation_blocked = _build_recommendation_blocked_words(competitors, all_names) + comparison_blocked = _build_comparison_blocked_words(competitors, all_names, brand_name) blocked_words_map = { "competitor-output-blocker": output_blocked, + "competitor-input-blocker": output_blocked, + "competitor-name-blocker": output_blocked, + "competitor-name-input-blocker": output_blocked, + "competitor-name-output-blocker": output_blocked, "competitor-recommendation-filter": recommendation_blocked, + "competitor-recommendation-input-filter": recommendation_blocked, + "competitor-recommendation-output-filter": recommendation_blocked, "competitor-comparison-filter": comparison_blocked, + "competitor-comparison-input-filter": comparison_blocked, + "competitor-comparison-output-filter": comparison_blocked, } for defn in enriched: @@ -640,3 +900,59 @@ def _build_competitor_guardrail_definitions( defn["litellm_params"]["blocked_words"] = blocked_words_map[guardrail_name] return enriched + + +def _build_name_blocked_words( + competitors: list[str], all_names: dict[str, list[str]] +) -> list[dict]: + """Build blocked word entries for direct competitor name mentions.""" + result = [] + for comp in competitors: + for name in all_names[comp]: + desc = f"Competitor: {comp}" if name == comp else f"Competitor variation ({comp}): {name}" + result.append({"keyword": name, "action": "BLOCK", "description": desc}) + return result + + +def _build_recommendation_blocked_words( + competitors: list[str], all_names: dict[str, list[str]] +) -> list[dict]: + """Build blocked word entries for competitor recommendations.""" + result = [] + for comp in competitors: + for name in all_names[comp]: + for prefix in ["try", "use", "switch to", "consider"]: + result.append({ + "keyword": f"{prefix} {name}", + "action": "BLOCK", + "description": f"Recommendation to competitor ({comp})", + }) + return result + + +def _build_comparison_blocked_words( + competitors: list[str], all_names: dict[str, list[str]], brand_name: str +) -> list[dict]: + """Build blocked word entries for unfavorable competitor comparisons.""" + result = [] + for comp in competitors: + for name in all_names[comp]: + result.append({ + "keyword": f"{name} is better", + "action": "BLOCK", + "description": f"Unfavorable comparison ({comp})", + }) + + # Brand-level comparisons (only need one entry each, not per-competitor) + result.append({ + "keyword": f"better than {brand_name}", + "action": "BLOCK", + "description": "Unfavorable comparison", + }) + result.append({ + "keyword": f"{brand_name} is worse", + "action": "BLOCK", + "description": "Unfavorable comparison", + }) + + return result diff --git a/policy_templates.json b/policy_templates.json index f27f20187f9..0dfa070aaa7 100644 --- a/policy_templates.json +++ b/policy_templates.json @@ -1522,7 +1522,13 @@ "guardrails": [ "aviation-ops-data-protection", "aviation-safety-topic-filter", - "airline-brand-protection-filter" + "airline-brand-protection-filter", + "competitor-name-input-blocker", + "competitor-name-output-blocker", + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "complexity": "High", "parameters": [ @@ -1531,9 +1537,14 @@ "label": "Your Airline / Brand Name", "type": "text", "required": true, - "placeholder": "e.g. Emirates" + "placeholder": "e.g. Acme Airlines" } ], + "llm_enrichment": { + "parameter": "brand_name", + "prompt": "List the top 30 direct competitors of {{brand_name}} in the airline industry. Include major international carriers, regional competitors, and low-cost carriers that operate on overlapping routes. Return ONLY airline/brand names, one per line, no numbering, no explanations.", + "result_key": "competitors" + }, "guardrailDefinitions": [ { "guardrail_name": "aviation-ops-data-protection", @@ -1675,6 +1686,72 @@ "guardrail_info": { "description": "Blocks AI-generated fake incident reports, unauthorized statements, and reputation-damaging content about your brand (runs on output)" } + }, + { + "guardrail_name": "competitor-name-input-blocker", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitors_blocked_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs that mention competitor names (pre_call)" + } + }, + { + "guardrail_name": "competitor-name-output-blocker", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "post_call", + "blocked_words": "{{competitors_blocked_words}}" + }, + "guardrail_info": { + "description": "Blocks AI outputs that mention competitor names (post_call)" + } + }, + { + "guardrail_name": "competitor-recommendation-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_recommendation_words}}" + }, + "guardrail_info": { + "description": "Blocks user requests asking to recommend competitors (pre_call)" + } + }, + { + "guardrail_name": "competitor-recommendation-output-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "post_call", + "blocked_words": "{{competitor_recommendation_words}}" + }, + "guardrail_info": { + "description": "Blocks AI from recommending or suggesting competitor services (post_call)" + } + }, + { + "guardrail_name": "competitor-comparison-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_comparison_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs requesting unfavorable brand comparisons (pre_call)" + } + }, + { + "guardrail_name": "competitor-comparison-output-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "post_call", + "blocked_words": "{{competitor_comparison_words}}" + }, + "guardrail_info": { + "description": "Blocks AI outputs with unfavorable brand comparisons (post_call)" + } } ], "templateData": { @@ -1683,7 +1760,13 @@ "guardrails_add": [ "aviation-ops-data-protection", "aviation-safety-topic-filter", - "airline-brand-protection-filter" + "airline-brand-protection-filter", + "competitor-name-input-blocker", + "competitor-name-output-blocker", + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "guardrails_remove": [] }, @@ -1812,9 +1895,12 @@ "iconColor": "text-orange-500", "iconBg": "bg-orange-50", "guardrails": [ + "competitor-input-blocker", "competitor-output-blocker", - "competitor-recommendation-filter", - "competitor-comparison-filter" + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "complexity": "Medium", "parameters": [ @@ -1823,15 +1909,26 @@ "label": "Your Brand Name", "type": "text", "required": true, - "placeholder": "e.g. Emirates" + "placeholder": "e.g. Acme Airlines" } ], "llm_enrichment": { "parameter": "brand_name", - "prompt": "List the top 10 direct competitors of {{brand_name}} in the same industry. Return ONLY company/brand names, one per line, no numbering, no explanations.", + "prompt": "List the top 30 direct competitors of {{brand_name}} in the same industry. Return ONLY company/brand names, one per line, no numbering, no explanations.", "result_key": "competitors" }, "guardrailDefinitions": [ + { + "guardrail_name": "competitor-input-blocker", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitors_blocked_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs that mention competitor brands (pre_call)" + } + }, { "guardrail_name": "competitor-output-blocker", "litellm_params": { @@ -1840,39 +1937,64 @@ "blocked_words": "{{competitors_blocked_words}}" }, "guardrail_info": { - "description": "Blocks AI outputs that mention or promote competitor brands (auto-discovered via LLM)" + "description": "Blocks AI outputs that mention competitor brands (post_call)" } }, { - "guardrail_name": "competitor-recommendation-filter", + "guardrail_name": "competitor-recommendation-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_recommendation_words}}" + }, + "guardrail_info": { + "description": "Blocks user requests asking to recommend competitors (pre_call)" + } + }, + { + "guardrail_name": "competitor-recommendation-output-filter", "litellm_params": { "guardrail": "litellm_content_filter", "mode": "post_call", "blocked_words": "{{competitor_recommendation_words}}" }, "guardrail_info": { - "description": "Blocks AI from recommending, suggesting, or directing users to competitor services" + "description": "Blocks AI from recommending or suggesting competitor services (post_call)" } }, { - "guardrail_name": "competitor-comparison-filter", + "guardrail_name": "competitor-comparison-input-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "blocked_words": "{{competitor_comparison_words}}" + }, + "guardrail_info": { + "description": "Blocks user inputs requesting unfavorable brand comparisons (pre_call)" + } + }, + { + "guardrail_name": "competitor-comparison-output-filter", "litellm_params": { "guardrail": "litellm_content_filter", "mode": "post_call", "blocked_words": "{{competitor_comparison_words}}" }, "guardrail_info": { - "description": "Blocks unfavorable comparisons between your brand and competitors in AI outputs" + "description": "Blocks AI outputs with unfavorable brand comparisons (post_call)" } } ], "templateData": { "policy_name": "competitor-mention-detection", - "description": "Detects and blocks competitor mentions in AI outputs. Uses LLM-powered competitor discovery based on your brand name.", + "description": "Detects and blocks competitor mentions in both inputs and outputs. Uses LLM-powered competitor discovery based on your brand name.", "guardrails_add": [ + "competitor-input-blocker", "competitor-output-blocker", - "competitor-recommendation-filter", - "competitor-comparison-filter" + "competitor-recommendation-input-filter", + "competitor-recommendation-output-filter", + "competitor-comparison-input-filter", + "competitor-comparison-output-filter" ], "guardrails_remove": [] }, diff --git a/tests/test_litellm/proxy/management_endpoints/test_policy_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_policy_endpoints.py index 2fb2a6dcc8e..23754bf326b 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_policy_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_policy_endpoints.py @@ -587,3 +587,256 @@ class TestApplyPoliciesDirectGuardrailNames: # Sorted order: direct_guardrail then from_policy; final output is from_policy assert result["inputs"] == first_output assert result["guardrail_errors"] == [] + + +# --------------------------------------------------------------------------- +# Tests for competitor enrichment helper functions +# --------------------------------------------------------------------------- +from litellm.proxy.management_endpoints.policy_endpoints import ( + _build_all_names_per_competitor, + _build_comparison_blocked_words, + _build_competitor_guardrail_definitions, + _build_name_blocked_words, + _build_recommendation_blocked_words, + _build_refinement_prompt, + _clean_competitor_line, + _parse_variations_response, +) + + +class TestCleanCompetitorLine: + """Tests for _clean_competitor_line.""" + + def test_strips_bullets_and_dashes(self): + assert _clean_competitor_line("- United Airlines") == "United Airlines" + assert _clean_competitor_line(" - JetBlue ") == "JetBlue" + + def test_strips_trailing_punctuation(self): + assert _clean_competitor_line("Delta Airlines.") == "Delta Airlines" + assert _clean_competitor_line("Southwest)") == "Southwest" + + def test_returns_none_for_empty(self): + assert _clean_competitor_line("") is None + assert _clean_competitor_line(" ") is None + + def test_returns_none_for_single_char(self): + assert _clean_competitor_line("A") is None + assert _clean_competitor_line(" - ") is None + + def test_plain_name(self): + assert _clean_competitor_line("Qatar Airways") == "Qatar Airways" + + +class TestParseVariationsResponse: + """Tests for _parse_variations_response.""" + + def test_parses_standard_format(self): + raw = "Delta Airlines: Delta Air Lines, DeltaAirlines, Delta\nUnited Airlines: United, UAL" + competitors = ["Delta Airlines", "United Airlines"] + result = _parse_variations_response(raw, competitors) + assert "Delta Airlines" in result + assert "Delta Air Lines" in result["Delta Airlines"] + assert "United" in result["United Airlines"] + + def test_case_insensitive_matching(self): + raw = "delta airlines: Delta Air Lines, DeltaAirlines" + competitors = ["Delta Airlines"] + result = _parse_variations_response(raw, competitors) + assert "Delta Airlines" in result + assert len(result["Delta Airlines"]) == 2 + + def test_skips_lines_without_colon(self): + raw = "This is a header\nDelta Airlines: Delta Air Lines" + competitors = ["Delta Airlines"] + result = _parse_variations_response(raw, competitors) + assert len(result) == 1 + + def test_skips_unknown_competitors(self): + raw = "Unknown Corp: Foo, Bar\nDelta Airlines: Delta" + competitors = ["Delta Airlines"] + result = _parse_variations_response(raw, competitors) + assert "Unknown Corp" not in result + assert "Delta Airlines" in result + + def test_filters_out_self_reference(self): + raw = "Delta Airlines: Delta Airlines, Delta Air Lines" + competitors = ["Delta Airlines"] + result = _parse_variations_response(raw, competitors) + # "Delta Airlines" should be filtered out (same as canonical) + assert "Delta Airlines" not in result["Delta Airlines"] + assert "Delta Air Lines" in result["Delta Airlines"] + + def test_empty_input(self): + assert _parse_variations_response("", []) == {} + + +class TestBuildRefinementPrompt: + """Tests for _build_refinement_prompt.""" + + def test_includes_brand_name(self): + prompt = _build_refinement_prompt("add 10 more", ["Delta"], "Emirates") + assert "Emirates" in prompt + + def test_includes_existing_competitors(self): + prompt = _build_refinement_prompt("add more", ["Delta", "United"], "Emirates") + assert "Delta" in prompt + assert "United" in prompt + + def test_includes_instruction(self): + prompt = _build_refinement_prompt("add 10 from Asia", ["Delta"], "Emirates") + assert "add 10 from Asia" in prompt + + def test_asks_for_new_names_only(self): + prompt = _build_refinement_prompt("add more", ["Delta"], "Emirates") + assert "NEW" in prompt + + +class TestBuildAllNamesPerCompetitor: + """Tests for _build_all_names_per_competitor.""" + + def test_includes_canonical_and_variations(self): + result = _build_all_names_per_competitor( + ["Delta Airlines"], {"Delta Airlines": ["Delta", "DeltaAir"]} + ) + assert result["Delta Airlines"] == ["Delta Airlines", "Delta", "DeltaAir"] + + def test_no_variations(self): + result = _build_all_names_per_competitor(["Delta Airlines"], {}) + assert result["Delta Airlines"] == ["Delta Airlines"] + + def test_multiple_competitors(self): + result = _build_all_names_per_competitor( + ["Delta", "United"], + {"Delta": ["DL"], "United": ["UA"]}, + ) + assert len(result) == 2 + assert result["Delta"] == ["Delta", "DL"] + assert result["United"] == ["United", "UA"] + + +class TestBuildNameBlockedWords: + """Tests for _build_name_blocked_words.""" + + def test_basic_output(self): + all_names = {"Delta": ["Delta", "DL"]} + result = _build_name_blocked_words(["Delta"], all_names) + keywords = [r["keyword"] for r in result] + assert "Delta" in keywords + assert "DL" in keywords + assert all(r["action"] == "BLOCK" for r in result) + + def test_descriptions_differ_for_variations(self): + all_names = {"Delta": ["Delta", "DL"]} + result = _build_name_blocked_words(["Delta"], all_names) + descs = {r["keyword"]: r["description"] for r in result} + assert "Competitor: Delta" == descs["Delta"] + assert "variation" in descs["DL"].lower() + + +class TestBuildRecommendationBlockedWords: + """Tests for _build_recommendation_blocked_words.""" + + def test_generates_prefix_combinations(self): + all_names = {"Delta": ["Delta"]} + result = _build_recommendation_blocked_words(["Delta"], all_names) + keywords = [r["keyword"] for r in result] + assert "try Delta" in keywords + assert "use Delta" in keywords + assert "switch to Delta" in keywords + assert "consider Delta" in keywords + + def test_includes_variations(self): + all_names = {"Delta": ["Delta", "DL"]} + result = _build_recommendation_blocked_words(["Delta"], all_names) + keywords = [r["keyword"] for r in result] + assert "try DL" in keywords + + +class TestBuildComparisonBlockedWords: + """Tests for _build_comparison_blocked_words.""" + + def test_generates_competitor_comparisons(self): + all_names = {"Delta": ["Delta"]} + result = _build_comparison_blocked_words(["Delta"], all_names, "Emirates") + keywords = [r["keyword"] for r in result] + assert "Delta is better" in keywords + + def test_generates_brand_comparisons_once(self): + all_names = {"Delta": ["Delta"], "United": ["United"]} + result = _build_comparison_blocked_words(["Delta", "United"], all_names, "Emirates") + keywords = [r["keyword"] for r in result] + # Brand-level entries should appear exactly once + assert keywords.count("better than Emirates") == 1 + assert keywords.count("Emirates is worse") == 1 + + def test_includes_variation_comparisons(self): + all_names = {"Delta": ["Delta", "DL"]} + result = _build_comparison_blocked_words(["Delta"], all_names, "Emirates") + keywords = [r["keyword"] for r in result] + assert "DL is better" in keywords + + +class TestBuildCompetitorGuardrailDefinitions: + """Tests for _build_competitor_guardrail_definitions.""" + + def test_populates_blocked_words_for_known_guardrail_names(self): + definitions = [ + { + "guardrail_name": "competitor-name-blocker", + "litellm_params": {"blocked_words": []}, + }, + { + "guardrail_name": "competitor-recommendation-filter", + "litellm_params": {"blocked_words": []}, + }, + ] + result = _build_competitor_guardrail_definitions( + definitions, ["Delta"], "Emirates", {"Delta": ["DL"]} + ) + # Name blocker should have entries + name_blocker = next(d for d in result if d["guardrail_name"] == "competitor-name-blocker") + assert len(name_blocker["litellm_params"]["blocked_words"]) > 0 + + # Recommendation filter should have entries + rec_filter = next(d for d in result if d["guardrail_name"] == "competitor-recommendation-filter") + assert len(rec_filter["litellm_params"]["blocked_words"]) > 0 + + def test_does_not_modify_unknown_guardrail_names(self): + definitions = [ + { + "guardrail_name": "some-other-guardrail", + "litellm_params": {"blocked_words": ["original"]}, + }, + ] + result = _build_competitor_guardrail_definitions( + definitions, ["Delta"], "Emirates" + ) + assert result[0]["litellm_params"]["blocked_words"] == ["original"] + + def test_does_not_mutate_original_definitions(self): + definitions = [ + { + "guardrail_name": "competitor-name-blocker", + "litellm_params": {"blocked_words": []}, + }, + ] + _build_competitor_guardrail_definitions(definitions, ["Delta"], "Emirates") + # Original should be unchanged + assert definitions[0]["litellm_params"]["blocked_words"] == [] + + def test_handles_input_and_output_blocker_variants(self): + definitions = [ + { + "guardrail_name": "competitor-name-input-blocker", + "litellm_params": {"blocked_words": []}, + }, + { + "guardrail_name": "competitor-name-output-blocker", + "litellm_params": {"blocked_words": []}, + }, + ] + result = _build_competitor_guardrail_definitions( + definitions, ["Delta"], "Emirates" + ) + for defn in result: + assert len(defn["litellm_params"]["blocked_words"]) > 0 diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index a1d4a70869b..b1694369c73 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -5555,19 +5555,24 @@ export const getPolicyTemplates = async (accessToken: string) => { export const enrichPolicyTemplate = async ( accessToken: string, templateId: string, - parameters: Record + parameters: Record, + model?: string, + competitors?: string[] ) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/policy/templates/enrich` : `/policy/templates/enrich`; + const body: any = { template_id: templateId, parameters }; + if (model) body.model = model; + if (competitors) body.competitors = competitors; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, - body: JSON.stringify({ template_id: templateId, parameters }), + body: JSON.stringify(body), }); if (!response.ok) { @@ -5585,6 +5590,78 @@ export const enrichPolicyTemplate = async ( } }; +export const enrichPolicyTemplateStream = async ( + accessToken: string, + templateId: string, + parameters: Record, + model: string, + onCompetitor: (name: string) => void, + onDone: (result: { + competitors: string[]; + competitor_variations: Record; + guardrailDefinitions: any[]; + }) => void, + onError?: (error: string) => void, + options?: { instruction?: string; existingCompetitors?: string[] }, + onStatus?: (message: string) => void +) => { + const url = proxyBaseUrl + ? `${proxyBaseUrl}/policy/templates/enrich/stream` + : `/policy/templates/enrich/stream`; + const body: any = { template_id: templateId, parameters, model }; + if (options?.instruction) body.instruction = options.instruction; + if (options?.existingCompetitors) body.competitors = options.existingCompetitors; + + const response = await fetch(url, { + method: "POST", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(body), + }); + + if (!response.ok) { + const errorData = await response.json(); + const errorMessage = deriveErrorMessage(errorData); + handleError(errorMessage); + throw new Error(errorMessage); + } + + const reader = response.body?.getReader(); + if (!reader) throw new Error("No response body"); + + const decoder = new TextDecoder(); + let buffer = ""; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + buffer += decoder.decode(value, { stream: true }); + const lines = buffer.split("\n"); + buffer = lines.pop() || ""; + + for (const line of lines) { + if (!line.startsWith("data: ")) continue; + try { + const event = JSON.parse(line.slice(6)); + if (event.type === "competitor") { + onCompetitor(event.name); + } else if (event.type === "status") { + onStatus?.(event.message); + } else if (event.type === "done") { + onDone(event); + } else if (event.type === "error") { + onError?.(event.message); + } + } catch { + // skip malformed events + } + } + } +}; + export const createPolicyCall = async (accessToken: string, policyData: any) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/policies` : `/policies`; diff --git a/ui/litellm-dashboard/src/components/policies/guardrail_selection_modal.tsx b/ui/litellm-dashboard/src/components/policies/guardrail_selection_modal.tsx index 2984478ba5a..adf1b14a4a6 100644 --- a/ui/litellm-dashboard/src/components/policies/guardrail_selection_modal.tsx +++ b/ui/litellm-dashboard/src/components/policies/guardrail_selection_modal.tsx @@ -222,6 +222,31 @@ const GuardrailSelectionModal: React.FC = ({
)} + {/* Discovered Competitors */} + {template?.discoveredCompetitors?.length > 0 && ( + <> + +
+
+ ✨ + + AI-Discovered Competitors ({template.discoveredCompetitors.length}) + +
+
+ {template.discoveredCompetitors.map((name: string) => ( + + {name} + + ))} +
+

+ These competitor names will be automatically blocked by the competitor-name-blocker guardrail. +

+
+ + )} + {/* Selected Summary */} diff --git a/ui/litellm-dashboard/src/components/policies/index.tsx b/ui/litellm-dashboard/src/components/policies/index.tsx index f5fadebdec4..01f6d1e13df 100644 --- a/ui/litellm-dashboard/src/components/policies/index.tsx +++ b/ui/litellm-dashboard/src/components/policies/index.tsx @@ -228,7 +228,10 @@ const PoliciesPanel: React.FC = ({ return JSON.parse(templateStr); }; - const handleParameterConfirm = async (parameters: Record) => { + const handleParameterConfirm = async ( + parameters: Record, + enrichmentOptions?: { model?: string; competitors?: string[] } + ) => { if (!accessToken || !pendingTemplate) return; setIsEnrichingTemplate(true); @@ -237,14 +240,20 @@ const PoliciesPanel: React.FC = ({ let enrichedTemplate = pendingTemplate; if (pendingTemplate.llm_enrichment) { - // Call backend to enrich template with LLM-discovered data + // Call backend to enrich template with LLM-discovered data (or user-provided competitors) const enrichResult = await enrichPolicyTemplate( accessToken, pendingTemplate.id, - parameters + parameters, + enrichmentOptions?.model, + enrichmentOptions?.competitors ); - // The backend returns the enriched guardrailDefinitions - enrichedTemplate = { ...pendingTemplate, guardrailDefinitions: enrichResult.guardrailDefinitions }; + // The backend returns the enriched guardrailDefinitions + discovered competitors + enrichedTemplate = { + ...pendingTemplate, + guardrailDefinitions: enrichResult.guardrailDefinitions, + discoveredCompetitors: enrichResult.competitors || [], + }; } // Substitute parameters in template @@ -491,6 +500,7 @@ const PoliciesPanel: React.FC = ({ onConfirm={handleParameterConfirm} onCancel={handleParameterCancel} isLoading={isEnrichingTemplate} + accessToken={accessToken || ""} /> diff --git a/ui/litellm-dashboard/src/components/policies/template_parameter_modal.tsx b/ui/litellm-dashboard/src/components/policies/template_parameter_modal.tsx index ce1e5bc22e9..1bbb73db9ef 100644 --- a/ui/litellm-dashboard/src/components/policies/template_parameter_modal.tsx +++ b/ui/litellm-dashboard/src/components/policies/template_parameter_modal.tsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from "react"; -import { Modal, Spin } from "antd"; +import { Modal, Spin, Radio, Select } from "antd"; import { Button, TextInput } from "@tremor/react"; +import { modelHubCall, enrichPolicyTemplateStream } from "../networking"; interface TemplateParameter { name: string; @@ -13,9 +14,13 @@ interface TemplateParameter { interface TemplateParameterModalProps { visible: boolean; template: any; - onConfirm: (parameters: Record) => void; + onConfirm: ( + parameters: Record, + enrichmentOptions?: { model?: string; competitors?: string[] } + ) => void; onCancel: () => void; isLoading?: boolean; + accessToken: string; } const TemplateParameterModal: React.FC = ({ @@ -24,10 +29,28 @@ const TemplateParameterModal: React.FC = ({ onConfirm, onCancel, isLoading = false, + accessToken, }) => { const [parameterValues, setParameterValues] = useState>({}); + const [competitorMode, setCompetitorMode] = useState<"ai" | "manual">("ai"); + const [selectedModel, setSelectedModel] = useState(undefined); + const [availableModels, setAvailableModels] = useState([]); + const [isLoadingModels, setIsLoadingModels] = useState(false); + const [competitorTags, setCompetitorTags] = useState([]); + const [variationsMap, setVariationsMap] = useState>({}); + const [isGenerating, setIsGenerating] = useState(false); + const [refinementInput, setRefinementInput] = useState(""); + const [isRefining, setIsRefining] = useState(false); + const [hasGenerated, setHasGenerated] = useState(false); + const [statusMessage, setStatusMessage] = useState(""); const parameters: TemplateParameter[] = template?.parameters || []; + const hasEnrichment = !!template?.llm_enrichment; + const enrichmentParam = hasEnrichment ? template.llm_enrichment.parameter : null; + + const nonEnrichmentParams = hasEnrichment + ? parameters.filter((p) => p.name !== enrichmentParam) + : parameters; useEffect(() => { if (visible && template) { @@ -36,15 +59,136 @@ const TemplateParameterModal: React.FC = ({ initial[p.name] = ""; }); setParameterValues(initial); + setCompetitorMode("ai"); + setSelectedModel(undefined); + setCompetitorTags([]); + setVariationsMap({}); + setIsGenerating(false); + setRefinementInput(""); + setIsRefining(false); + setHasGenerated(false); + setStatusMessage(""); } }, [visible, template]); - const allRequiredFilled = parameters + useEffect(() => { + if (visible && hasEnrichment && competitorMode === "ai" && availableModels.length === 0) { + loadModels(); + } + }, [visible, hasEnrichment, competitorMode]); + + const loadModels = async () => { + if (!accessToken) return; + setIsLoadingModels(true); + try { + const fetchedModels = await modelHubCall(accessToken); + if (fetchedModels?.data?.length > 0) { + const models = fetchedModels.data + .map((item: any) => item.model_group as string) + .sort(); + setAvailableModels(models); + } + } catch (error) { + console.error("Error fetching models:", error); + } finally { + setIsLoadingModels(false); + } + }; + + const handleGenerateNames = async () => { + if (!accessToken || !selectedModel || !template) return; + const brandName = (parameterValues[enrichmentParam || "brand_name"] || "").trim(); + if (!brandName) return; + + setIsGenerating(true); + setCompetitorTags([]); + setVariationsMap({}); + setStatusMessage(""); + try { + await enrichPolicyTemplateStream( + accessToken, + template.id, + parameterValues, + selectedModel, + (name) => { + setCompetitorTags((prev) => [...prev, name]); + }, + (result) => { + setCompetitorTags(result.competitors); + setVariationsMap(result.competitor_variations || {}); + setIsGenerating(false); + setHasGenerated(true); + setStatusMessage(""); + }, + (error) => { + console.error("Streaming error:", error); + setIsGenerating(false); + setStatusMessage(""); + }, + undefined, + (status) => setStatusMessage(status), + ); + } catch (error) { + console.error("Error generating competitor names:", error); + setIsGenerating(false); + } + }; + + const handleRefine = async () => { + if (!accessToken || !selectedModel || !template || !refinementInput.trim()) return; + + setIsRefining(true); + setStatusMessage(""); + try { + await enrichPolicyTemplateStream( + accessToken, + template.id, + parameterValues, + selectedModel, + (name) => { + setCompetitorTags((prev) => { + if (prev.some((t) => t.toLowerCase() === name.toLowerCase())) return prev; + return [...prev, name]; + }); + }, + (result) => { + setCompetitorTags(result.competitors); + setVariationsMap(result.competitor_variations || {}); + setIsRefining(false); + setRefinementInput(""); + setStatusMessage(""); + }, + (error) => { + console.error("Refinement error:", error); + setIsRefining(false); + setStatusMessage(""); + }, + { + instruction: refinementInput.trim(), + existingCompetitors: competitorTags, + }, + (status) => setStatusMessage(status), + ); + } catch (error) { + console.error("Error refining competitor names:", error); + setIsRefining(false); + } + }; + + const allNonEnrichmentFilled = nonEnrichmentParams .filter((p) => p.required) .every((p) => (parameterValues[p.name] || "").trim().length > 0); + const brandNameFilled = enrichmentParam + ? (parameterValues[enrichmentParam] || "").trim().length > 0 + : true; + + const canContinue = hasEnrichment + ? allNonEnrichmentFilled && brandNameFilled && competitorTags.length > 0 + : allNonEnrichmentFilled && brandNameFilled; + const handleConfirm = () => { - onConfirm(parameterValues); + onConfirm(parameterValues, { competitors: competitorTags }); }; return ( @@ -53,15 +197,13 @@ const TemplateParameterModal: React.FC = ({

{template?.title}

- {template?.llm_enrichment - ? "Enter your brand name to auto-discover competitors and configure guardrails" - : "Configure template parameters"} + Configure competitor blocking for your brand

} open={visible} onCancel={onCancel} - width={500} + width={700} footer={[ , ]} >
- {parameters.map((param) => ( + {nonEnrichmentParams.map((param) => (
))} - {template?.llm_enrichment && ( -
-

- This template uses AI to automatically discover your competitors and configure - guardrails. An onboarded LLM will be called to identify competitor names. -

-
+ {hasEnrichment && ( + <> +
+ + setCompetitorMode(e.target.value)} + className="w-full" + > +
+ + ✨ Use AI + + + Enter Manually + +
+
+
+ + {/* Brand Name */} +
+ + + setParameterValues((prev) => ({ + ...prev, + [enrichmentParam || "brand_name"]: e.target.value, + })) + } + /> +
+ + {competitorMode === "ai" && ( + <> +
+ + setCompetitorTags(values)} + tokenSeparators={[","]} + open={false} + suffixIcon={null} + /> +

+ Type a name and press Enter to add. Click ✕ to remove. +

+ {statusMessage && ( +
+ + {statusMessage} +
+ )} + {Object.keys(variationsMap).length > 0 && !statusMessage && ( +

+ ✓ {Object.values(variationsMap).flat().length} alternate spellings & variations auto-generated for guardrail matching +

+ )} +
+ + {/* Refinement input — shown after initial generation in AI mode */} + {competitorMode === "ai" && hasGenerated && competitorTags.length > 0 && ( +
+ +
+ setRefinementInput(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter" && refinementInput.trim() && !isRefining) { + handleRefine(); + } + }} + disabled={isRefining} + /> + +
+

+ Give instructions to add, remove, or change competitors. Press Enter to send. +

+
+ )} + )} - {isLoading && ( -
- - - {template?.llm_enrichment - ? "Using AI to discover competitors..." - : "Processing template..."} - -
- )} + {!hasEnrichment && + parameters.map((param) => ( +
+ + + setParameterValues((prev) => ({ + ...prev, + [param.name]: e.target.value, + })) + } + /> +
+ ))}
); From 31752c7b78f1690aa8eb4da1cbcfe0135cfb65dc Mon Sep 17 00:00:00 2001 From: Harshit Jain Date: Thu, 19 Feb 2026 11:11:52 +0530 Subject: [PATCH 40/41] fix: mypy issues from auth_checks --- .../integrations/SlackAlerting/budget_alert_types.py | 10 ++++++++++ litellm/integrations/SlackAlerting/slack_alerting.py | 9 +++++++-- litellm/proxy/utils.py | 11 +++++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/litellm/integrations/SlackAlerting/budget_alert_types.py b/litellm/integrations/SlackAlerting/budget_alert_types.py index 205c5c89e35..ea80b258540 100644 --- a/litellm/integrations/SlackAlerting/budget_alert_types.py +++ b/litellm/integrations/SlackAlerting/budget_alert_types.py @@ -74,6 +74,14 @@ class ProjectedLimitExceededAlert(BaseBudgetAlertType): return user_info.token or "default_id" +class ProjectBudgetAlert(BaseBudgetAlertType): + def get_event_message(self) -> str: + return "Project Budget: " + + def get_id(self, user_info: CallInfo) -> str: + return user_info.token or "default_id" + + def get_budget_alert_type( type: Literal[ "token_budget", @@ -84,6 +92,7 @@ def get_budget_alert_type( "organization_budget", "proxy_budget", "projected_limit_exceeded", + "project_budget", ], ) -> BaseBudgetAlertType: """Factory function to get the appropriate budget alert type class""" @@ -97,6 +106,7 @@ def get_budget_alert_type( "organization_budget": OrganizationBudgetAlert(), "token_budget": TokenBudgetAlert(), "projected_limit_exceeded": ProjectedLimitExceededAlert(), + "project_budget": ProjectBudgetAlert(), } if type in alert_types: diff --git a/litellm/integrations/SlackAlerting/slack_alerting.py b/litellm/integrations/SlackAlerting/slack_alerting.py index 8fb3e132ded..a525856db82 100644 --- a/litellm/integrations/SlackAlerting/slack_alerting.py +++ b/litellm/integrations/SlackAlerting/slack_alerting.py @@ -538,6 +538,7 @@ class SlackAlerting(CustomBatchLogger): "organization_budget", "proxy_budget", "projected_limit_exceeded", + "project_budget", ], user_info: CallInfo, ): @@ -1378,9 +1379,13 @@ Model Info: """ if self.alerting is None: return - + # Start periodic flush if not already started - if not self.periodic_started and self.alerting is not None and len(self.alerting) > 0: + if ( + not self.periodic_started + and self.alerting is not None + and len(self.alerting) > 0 + ): asyncio.create_task(self.periodic_flush()) self.periodic_started = True diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 94471f0e32b..1a1764324a3 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1238,7 +1238,8 @@ class ProxyLogging: if result.terminal_action == "modify_response": raise ModifyResponseException( - message=result.modify_response_message or "Response modified by pipeline", + message=result.modify_response_message + or "Response modified by pipeline", model=data.get("model", "unknown"), request_data=data, guardrail_name=f"pipeline:{policy_name}", @@ -1321,7 +1322,6 @@ class ProxyLogging: metadata = data.get("metadata", data.get("litellm_metadata", {})) or {} pipeline_managed: set = metadata.get("_pipeline_managed_guardrails", set()) - for callback in litellm.callbacks: start_time = time.time() _callback = None @@ -1337,7 +1337,10 @@ class ProxyLogging: and data is not None ): # Skip guardrails managed by a pipeline - if _callback.guardrail_name and _callback.guardrail_name in pipeline_managed: + if ( + _callback.guardrail_name + and _callback.guardrail_name in pipeline_managed + ): continue result = await self._process_guardrail_callback( @@ -1491,6 +1494,7 @@ class ProxyLogging: "organization_budget", "proxy_budget", "projected_limit_exceeded", + "project_budget", ], user_info: CallInfo, ): @@ -1885,7 +1889,6 @@ class ProxyLogging: from litellm.types.guardrails import GuardrailEventHooks - guardrail_callbacks: List[CustomGuardrail] = [] other_callbacks: List[CustomLogger] = [] try: From bdf01fa283ab0b3ab18c3d43e09b98cfd1b4e346 Mon Sep 17 00:00:00 2001 From: Harshit Jain Date: Thu, 19 Feb 2026 14:04:00 +0530 Subject: [PATCH 41/41] fix mypy error --- .../pagerduty/pagerduty.py | 620 +- litellm/litellm_core_utils/litellm_logging.py | 10890 ++++++++-------- .../proxy/hooks/proxy_track_cost_callback.py | 582 +- .../pass_through_endpoints.py | 5489 ++++---- 4 files changed, 8797 insertions(+), 8784 deletions(-) diff --git a/enterprise/litellm_enterprise/enterprise_callbacks/pagerduty/pagerduty.py b/enterprise/litellm_enterprise/enterprise_callbacks/pagerduty/pagerduty.py index e481cdc995c..b6c9104b232 100644 --- a/enterprise/litellm_enterprise/enterprise_callbacks/pagerduty/pagerduty.py +++ b/enterprise/litellm_enterprise/enterprise_callbacks/pagerduty/pagerduty.py @@ -1,309 +1,311 @@ -""" -PagerDuty Alerting Integration - -Handles two types of alerts: -- High LLM API Failure Rate. Configure X fails in Y seconds to trigger an alert. -- High Number of Hanging LLM Requests. Configure X hangs in Y seconds to trigger an alert. - -Note: This is a Free feature on the regular litellm docker image. - -However, this is under the enterprise license -""" - -import asyncio -import os -from datetime import datetime, timedelta, timezone -from typing import List, Literal, Optional, Union - -from litellm._logging import verbose_logger -from litellm.caching import DualCache -from litellm.integrations.SlackAlerting.slack_alerting import SlackAlerting -from litellm.llms.custom_httpx.http_handler import ( - AsyncHTTPHandler, - get_async_httpx_client, - httpxSpecialProvider, -) -from litellm.proxy._types import UserAPIKeyAuth -from litellm.types.integrations.pagerduty import ( - AlertingConfig, - PagerDutyInternalEvent, - PagerDutyPayload, - PagerDutyRequestBody, -) -from litellm.types.utils import ( - CallTypesLiteral, - StandardLoggingPayload, - StandardLoggingPayloadErrorInformation, -) - -PAGERDUTY_DEFAULT_FAILURE_THRESHOLD = 60 -PAGERDUTY_DEFAULT_FAILURE_THRESHOLD_WINDOW_SECONDS = 60 -PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS = 60 -PAGERDUTY_DEFAULT_HANGING_THRESHOLD_WINDOW_SECONDS = 600 - - -class PagerDutyAlerting(SlackAlerting): - """ - Tracks failed requests and hanging requests separately. - If threshold is crossed for either type, triggers a PagerDuty alert. - """ - - def __init__( - self, alerting_args: Optional[Union[AlertingConfig, dict]] = None, **kwargs - ): - super().__init__() - _api_key = os.getenv("PAGERDUTY_API_KEY") - if not _api_key: - raise ValueError("PAGERDUTY_API_KEY is not set") - - self.api_key: str = _api_key - alerting_args = alerting_args or {} - self.pagerduty_alerting_args: AlertingConfig = AlertingConfig( - failure_threshold=alerting_args.get( - "failure_threshold", PAGERDUTY_DEFAULT_FAILURE_THRESHOLD - ), - failure_threshold_window_seconds=alerting_args.get( - "failure_threshold_window_seconds", - PAGERDUTY_DEFAULT_FAILURE_THRESHOLD_WINDOW_SECONDS, - ), - hanging_threshold_seconds=alerting_args.get( - "hanging_threshold_seconds", PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS - ), - hanging_threshold_window_seconds=alerting_args.get( - "hanging_threshold_window_seconds", - PAGERDUTY_DEFAULT_HANGING_THRESHOLD_WINDOW_SECONDS, - ), - ) - - # Separate storage for failures vs. hangs - self._failure_events: List[PagerDutyInternalEvent] = [] - self._hanging_events: List[PagerDutyInternalEvent] = [] - - # ------------------ MAIN LOGIC ------------------ # - - async def async_log_failure_event(self, kwargs, response_obj, start_time, end_time): - """ - Record a failure event. Only send an alert to PagerDuty if the - configured *failure* threshold is exceeded in the specified window. - """ - now = datetime.now(timezone.utc) - standard_logging_payload: Optional[StandardLoggingPayload] = kwargs.get( - "standard_logging_object" - ) - if not standard_logging_payload: - raise ValueError( - "standard_logging_object is required for PagerDutyAlerting" - ) - - # Extract error details - error_info: Optional[StandardLoggingPayloadErrorInformation] = ( - standard_logging_payload.get("error_information") or {} - ) - _meta = standard_logging_payload.get("metadata") or {} - - self._failure_events.append( - PagerDutyInternalEvent( - failure_event_type="failed_response", - timestamp=now, - error_class=error_info.get("error_class"), - error_code=error_info.get("error_code"), - error_llm_provider=error_info.get("llm_provider"), - user_api_key_hash=_meta.get("user_api_key_hash"), - user_api_key_alias=_meta.get("user_api_key_alias"), - user_api_key_spend=_meta.get("user_api_key_spend"), - user_api_key_max_budget=_meta.get("user_api_key_max_budget"), - user_api_key_budget_reset_at=_meta.get("user_api_key_budget_reset_at"), - user_api_key_org_id=_meta.get("user_api_key_org_id"), - user_api_key_team_id=_meta.get("user_api_key_team_id"), - user_api_key_user_id=_meta.get("user_api_key_user_id"), - user_api_key_team_alias=_meta.get("user_api_key_team_alias"), - user_api_key_end_user_id=_meta.get("user_api_key_end_user_id"), - user_api_key_user_email=_meta.get("user_api_key_user_email"), - user_api_key_request_route=_meta.get("user_api_key_request_route"), - user_api_key_auth_metadata=_meta.get("user_api_key_auth_metadata"), - ) - ) - - # Prune + Possibly alert - window_seconds = self.pagerduty_alerting_args.get( - "failure_threshold_window_seconds", 60 - ) - threshold = self.pagerduty_alerting_args.get("failure_threshold", 1) - - # If threshold is crossed, send PD alert for failures - await self._send_alert_if_thresholds_crossed( - events=self._failure_events, - window_seconds=window_seconds, - threshold=threshold, - alert_prefix="High LLM API Failure Rate", - ) - - async def async_pre_call_hook( - self, - user_api_key_dict: UserAPIKeyAuth, - cache: DualCache, - data: dict, - call_type: CallTypesLiteral, - ) -> Optional[Union[Exception, str, dict]]: - """ - Example of detecting hanging requests by waiting a given threshold. - If the request didn't finish by then, we treat it as 'hanging'. - """ - verbose_logger.info("Inside Proxy Logging Pre-call hook!") - asyncio.create_task( - self.hanging_response_handler( - request_data=data, user_api_key_dict=user_api_key_dict - ) - ) - return None - - async def hanging_response_handler( - self, request_data: Optional[dict], user_api_key_dict: UserAPIKeyAuth - ): - """ - Checks if request completed by the time 'hanging_threshold_seconds' elapses. - If not, we classify it as a hanging request. - """ - verbose_logger.debug( - f"Inside Hanging Response Handler!..sleeping for {self.pagerduty_alerting_args.get('hanging_threshold_seconds', PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS)} seconds" - ) - await asyncio.sleep( - self.pagerduty_alerting_args.get( - "hanging_threshold_seconds", PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS - ) - ) - - if await self._request_is_completed(request_data=request_data): - return # It's not hanging if completed - - # Otherwise, record it as hanging - self._hanging_events.append( - PagerDutyInternalEvent( - failure_event_type="hanging_response", - timestamp=datetime.now(timezone.utc), - error_class="HangingRequest", - error_code="HangingRequest", - error_llm_provider="HangingRequest", - user_api_key_hash=user_api_key_dict.api_key, - user_api_key_alias=user_api_key_dict.key_alias, - user_api_key_spend=user_api_key_dict.spend, - user_api_key_max_budget=user_api_key_dict.max_budget, - user_api_key_budget_reset_at=( - user_api_key_dict.budget_reset_at.isoformat() - if user_api_key_dict.budget_reset_at - else None - ), - user_api_key_org_id=user_api_key_dict.org_id, - user_api_key_team_id=user_api_key_dict.team_id, - user_api_key_user_id=user_api_key_dict.user_id, - user_api_key_team_alias=user_api_key_dict.team_alias, - user_api_key_end_user_id=user_api_key_dict.end_user_id, - user_api_key_user_email=user_api_key_dict.user_email, - user_api_key_request_route=user_api_key_dict.request_route, - user_api_key_auth_metadata=user_api_key_dict.metadata, - ) - ) - - # Prune + Possibly alert - window_seconds = self.pagerduty_alerting_args.get( - "hanging_threshold_window_seconds", - PAGERDUTY_DEFAULT_HANGING_THRESHOLD_WINDOW_SECONDS, - ) - threshold: int = self.pagerduty_alerting_args.get( - "hanging_threshold_fails", PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS - ) - - # If threshold is crossed, send PD alert for hangs - await self._send_alert_if_thresholds_crossed( - events=self._hanging_events, - window_seconds=window_seconds, - threshold=threshold, - alert_prefix="High Number of Hanging LLM Requests", - ) - - # ------------------ HELPERS ------------------ # - - async def _send_alert_if_thresholds_crossed( - self, - events: List[PagerDutyInternalEvent], - window_seconds: int, - threshold: int, - alert_prefix: str, - ): - """ - 1. Prune old events - 2. If threshold is reached, build alert, send to PagerDuty - 3. Clear those events - """ - cutoff = datetime.now(timezone.utc) - timedelta(seconds=window_seconds) - pruned = [e for e in events if e.get("timestamp", datetime.min) > cutoff] - - # Update the reference list - events.clear() - events.extend(pruned) - - # Check threshold - verbose_logger.debug( - f"Have {len(events)} events in the last {window_seconds} seconds. Threshold is {threshold}" - ) - if len(events) >= threshold: - # Build short summary of last N events - error_summaries = self._build_error_summaries(events, max_errors=5) - alert_message = ( - f"{alert_prefix}: {len(events)} in the last {window_seconds} seconds." - ) - custom_details = {"recent_errors": error_summaries} - - await self.send_alert_to_pagerduty( - alert_message=alert_message, - custom_details=custom_details, - ) - - # Clear them after sending an alert, so we don't spam - events.clear() - - def _build_error_summaries( - self, events: List[PagerDutyInternalEvent], max_errors: int = 5 - ) -> List[PagerDutyInternalEvent]: - """ - Build short text summaries for the last `max_errors`. - Example: "ValueError (code: 500, provider: openai)" - """ - recent = events[-max_errors:] - summaries = [] - for fe in recent: - # If any of these is None, show "N/A" to avoid messing up the summary string - fe.pop("timestamp") - summaries.append(fe) - return summaries - - async def send_alert_to_pagerduty(self, alert_message: str, custom_details: dict): - """ - Send [critical] Alert to PagerDuty - - https://developer.pagerduty.com/api-reference/YXBpOjI3NDgyNjU-pager-duty-v2-events-api - """ - try: - verbose_logger.debug(f"Sending alert to PagerDuty: {alert_message}") - async_client: AsyncHTTPHandler = get_async_httpx_client( - llm_provider=httpxSpecialProvider.LoggingCallback - ) - payload: PagerDutyRequestBody = PagerDutyRequestBody( - payload=PagerDutyPayload( - summary=alert_message, - severity="critical", - source="LiteLLM Alert", - component="LiteLLM", - custom_details=custom_details, - ), - routing_key=self.api_key, - event_action="trigger", - ) - - return await async_client.post( - url="https://events.pagerduty.com/v2/enqueue", - json=dict(payload), - headers={"Content-Type": "application/json"}, - ) - except Exception as e: - verbose_logger.exception(f"Error sending alert to PagerDuty: {e}") +""" +PagerDuty Alerting Integration + +Handles two types of alerts: +- High LLM API Failure Rate. Configure X fails in Y seconds to trigger an alert. +- High Number of Hanging LLM Requests. Configure X hangs in Y seconds to trigger an alert. + +Note: This is a Free feature on the regular litellm docker image. + +However, this is under the enterprise license +""" + +import asyncio +import os +from datetime import datetime, timedelta, timezone +from typing import List, Optional, Union + +from litellm._logging import verbose_logger +from litellm.caching import DualCache +from litellm.integrations.SlackAlerting.slack_alerting import SlackAlerting +from litellm.llms.custom_httpx.http_handler import ( + AsyncHTTPHandler, + get_async_httpx_client, + httpxSpecialProvider, +) +from litellm.proxy._types import UserAPIKeyAuth +from litellm.types.integrations.pagerduty import ( + AlertingConfig, + PagerDutyInternalEvent, + PagerDutyPayload, + PagerDutyRequestBody, +) +from litellm.types.utils import ( + CallTypesLiteral, + StandardLoggingPayload, + StandardLoggingPayloadErrorInformation, +) + +PAGERDUTY_DEFAULT_FAILURE_THRESHOLD = 60 +PAGERDUTY_DEFAULT_FAILURE_THRESHOLD_WINDOW_SECONDS = 60 +PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS = 60 +PAGERDUTY_DEFAULT_HANGING_THRESHOLD_WINDOW_SECONDS = 600 + + +class PagerDutyAlerting(SlackAlerting): + """ + Tracks failed requests and hanging requests separately. + If threshold is crossed for either type, triggers a PagerDuty alert. + """ + + def __init__( + self, alerting_args: Optional[Union[AlertingConfig, dict]] = None, **kwargs + ): + super().__init__() + _api_key = os.getenv("PAGERDUTY_API_KEY") + if not _api_key: + raise ValueError("PAGERDUTY_API_KEY is not set") + + self.api_key: str = _api_key + alerting_args = alerting_args or {} + self.pagerduty_alerting_args: AlertingConfig = AlertingConfig( + failure_threshold=alerting_args.get( + "failure_threshold", PAGERDUTY_DEFAULT_FAILURE_THRESHOLD + ), + failure_threshold_window_seconds=alerting_args.get( + "failure_threshold_window_seconds", + PAGERDUTY_DEFAULT_FAILURE_THRESHOLD_WINDOW_SECONDS, + ), + hanging_threshold_seconds=alerting_args.get( + "hanging_threshold_seconds", PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS + ), + hanging_threshold_window_seconds=alerting_args.get( + "hanging_threshold_window_seconds", + PAGERDUTY_DEFAULT_HANGING_THRESHOLD_WINDOW_SECONDS, + ), + ) + + # Separate storage for failures vs. hangs + self._failure_events: List[PagerDutyInternalEvent] = [] + self._hanging_events: List[PagerDutyInternalEvent] = [] + + # ------------------ MAIN LOGIC ------------------ # + + async def async_log_failure_event(self, kwargs, response_obj, start_time, end_time): + """ + Record a failure event. Only send an alert to PagerDuty if the + configured *failure* threshold is exceeded in the specified window. + """ + now = datetime.now(timezone.utc) + standard_logging_payload: Optional[StandardLoggingPayload] = kwargs.get( + "standard_logging_object" + ) + if not standard_logging_payload: + raise ValueError( + "standard_logging_object is required for PagerDutyAlerting" + ) + + # Extract error details + error_info: Optional[StandardLoggingPayloadErrorInformation] = ( + standard_logging_payload.get("error_information") or {} + ) + _meta = standard_logging_payload.get("metadata") or {} + + self._failure_events.append( + PagerDutyInternalEvent( + failure_event_type="failed_response", + timestamp=now, + error_class=error_info.get("error_class"), + error_code=error_info.get("error_code"), + error_llm_provider=error_info.get("llm_provider"), + user_api_key_hash=_meta.get("user_api_key_hash"), + user_api_key_alias=_meta.get("user_api_key_alias"), + user_api_key_spend=_meta.get("user_api_key_spend"), + user_api_key_max_budget=_meta.get("user_api_key_max_budget"), + user_api_key_budget_reset_at=_meta.get("user_api_key_budget_reset_at"), + user_api_key_org_id=_meta.get("user_api_key_org_id"), + user_api_key_team_id=_meta.get("user_api_key_team_id"), + user_api_key_project_id=_meta.get("user_api_key_project_id"), + user_api_key_user_id=_meta.get("user_api_key_user_id"), + user_api_key_team_alias=_meta.get("user_api_key_team_alias"), + user_api_key_end_user_id=_meta.get("user_api_key_end_user_id"), + user_api_key_user_email=_meta.get("user_api_key_user_email"), + user_api_key_request_route=_meta.get("user_api_key_request_route"), + user_api_key_auth_metadata=_meta.get("user_api_key_auth_metadata"), + ) + ) + + # Prune + Possibly alert + window_seconds = self.pagerduty_alerting_args.get( + "failure_threshold_window_seconds", 60 + ) + threshold = self.pagerduty_alerting_args.get("failure_threshold", 1) + + # If threshold is crossed, send PD alert for failures + await self._send_alert_if_thresholds_crossed( + events=self._failure_events, + window_seconds=window_seconds, + threshold=threshold, + alert_prefix="High LLM API Failure Rate", + ) + + async def async_pre_call_hook( + self, + user_api_key_dict: UserAPIKeyAuth, + cache: DualCache, + data: dict, + call_type: CallTypesLiteral, + ) -> Optional[Union[Exception, str, dict]]: + """ + Example of detecting hanging requests by waiting a given threshold. + If the request didn't finish by then, we treat it as 'hanging'. + """ + verbose_logger.info("Inside Proxy Logging Pre-call hook!") + asyncio.create_task( + self.hanging_response_handler( + request_data=data, user_api_key_dict=user_api_key_dict + ) + ) + return None + + async def hanging_response_handler( + self, request_data: Optional[dict], user_api_key_dict: UserAPIKeyAuth + ): + """ + Checks if request completed by the time 'hanging_threshold_seconds' elapses. + If not, we classify it as a hanging request. + """ + verbose_logger.debug( + f"Inside Hanging Response Handler!..sleeping for {self.pagerduty_alerting_args.get('hanging_threshold_seconds', PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS)} seconds" + ) + await asyncio.sleep( + self.pagerduty_alerting_args.get( + "hanging_threshold_seconds", PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS + ) + ) + + if await self._request_is_completed(request_data=request_data): + return # It's not hanging if completed + + # Otherwise, record it as hanging + self._hanging_events.append( + PagerDutyInternalEvent( + failure_event_type="hanging_response", + timestamp=datetime.now(timezone.utc), + error_class="HangingRequest", + error_code="HangingRequest", + error_llm_provider="HangingRequest", + user_api_key_hash=user_api_key_dict.api_key, + user_api_key_alias=user_api_key_dict.key_alias, + user_api_key_spend=user_api_key_dict.spend, + user_api_key_max_budget=user_api_key_dict.max_budget, + user_api_key_budget_reset_at=( + user_api_key_dict.budget_reset_at.isoformat() + if user_api_key_dict.budget_reset_at + else None + ), + user_api_key_org_id=user_api_key_dict.org_id, + user_api_key_team_id=user_api_key_dict.team_id, + user_api_key_project_id=user_api_key_dict.project_id, + user_api_key_user_id=user_api_key_dict.user_id, + user_api_key_team_alias=user_api_key_dict.team_alias, + user_api_key_end_user_id=user_api_key_dict.end_user_id, + user_api_key_user_email=user_api_key_dict.user_email, + user_api_key_request_route=user_api_key_dict.request_route, + user_api_key_auth_metadata=user_api_key_dict.metadata, + ) + ) + + # Prune + Possibly alert + window_seconds = self.pagerduty_alerting_args.get( + "hanging_threshold_window_seconds", + PAGERDUTY_DEFAULT_HANGING_THRESHOLD_WINDOW_SECONDS, + ) + threshold: int = self.pagerduty_alerting_args.get( + "hanging_threshold_fails", PAGERDUTY_DEFAULT_HANGING_THRESHOLD_SECONDS + ) + + # If threshold is crossed, send PD alert for hangs + await self._send_alert_if_thresholds_crossed( + events=self._hanging_events, + window_seconds=window_seconds, + threshold=threshold, + alert_prefix="High Number of Hanging LLM Requests", + ) + + # ------------------ HELPERS ------------------ # + + async def _send_alert_if_thresholds_crossed( + self, + events: List[PagerDutyInternalEvent], + window_seconds: int, + threshold: int, + alert_prefix: str, + ): + """ + 1. Prune old events + 2. If threshold is reached, build alert, send to PagerDuty + 3. Clear those events + """ + cutoff = datetime.now(timezone.utc) - timedelta(seconds=window_seconds) + pruned = [e for e in events if e.get("timestamp", datetime.min) > cutoff] + + # Update the reference list + events.clear() + events.extend(pruned) + + # Check threshold + verbose_logger.debug( + f"Have {len(events)} events in the last {window_seconds} seconds. Threshold is {threshold}" + ) + if len(events) >= threshold: + # Build short summary of last N events + error_summaries = self._build_error_summaries(events, max_errors=5) + alert_message = ( + f"{alert_prefix}: {len(events)} in the last {window_seconds} seconds." + ) + custom_details = {"recent_errors": error_summaries} + + await self.send_alert_to_pagerduty( + alert_message=alert_message, + custom_details=custom_details, + ) + + # Clear them after sending an alert, so we don't spam + events.clear() + + def _build_error_summaries( + self, events: List[PagerDutyInternalEvent], max_errors: int = 5 + ) -> List[PagerDutyInternalEvent]: + """ + Build short text summaries for the last `max_errors`. + Example: "ValueError (code: 500, provider: openai)" + """ + recent = events[-max_errors:] + summaries = [] + for fe in recent: + # If any of these is None, show "N/A" to avoid messing up the summary string + fe.pop("timestamp") + summaries.append(fe) + return summaries + + async def send_alert_to_pagerduty(self, alert_message: str, custom_details: dict): + """ + Send [critical] Alert to PagerDuty + + https://developer.pagerduty.com/api-reference/YXBpOjI3NDgyNjU-pager-duty-v2-events-api + """ + try: + verbose_logger.debug(f"Sending alert to PagerDuty: {alert_message}") + async_client: AsyncHTTPHandler = get_async_httpx_client( + llm_provider=httpxSpecialProvider.LoggingCallback + ) + payload: PagerDutyRequestBody = PagerDutyRequestBody( + payload=PagerDutyPayload( + summary=alert_message, + severity="critical", + source="LiteLLM Alert", + component="LiteLLM", + custom_details=custom_details, + ), + routing_key=self.api_key, + event_action="trigger", + ) + + return await async_client.post( + url="https://events.pagerduty.com/v2/enqueue", + json=dict(payload), + headers={"Content-Type": "application/json"}, + ) + except Exception as e: + verbose_logger.exception(f"Error sending alert to PagerDuty: {e}") diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index 6a14e42c485..5f555d83cf1 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -1,5444 +1,5446 @@ -# What is this? -## Common Utility file for Logging handler -# Logging function -> log the exact model details + what's being sent | Non-Blocking -import copy -import datetime -import json -import os -import re -import subprocess -import sys -import time -import traceback -from datetime import datetime as dt_object -from functools import lru_cache -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - List, - Literal, - Optional, - Tuple, - Type, - Union, - cast, -) - -from httpx import Response -from pydantic import BaseModel - -import litellm -from litellm import ( - _custom_logger_compatible_callbacks_literal, - json_logs, - log_raw_request_response, - turn_off_message_logging, -) -from litellm._logging import _is_debugging_on, verbose_logger -from litellm._uuid import uuid -from litellm.batches.batch_utils import _handle_completed_batch -from litellm.caching.caching import DualCache, InMemoryCache -from litellm.caching.caching_handler import LLMCachingHandler -from litellm.constants import ( - DEFAULT_MOCK_RESPONSE_COMPLETION_TOKEN_COUNT, - DEFAULT_MOCK_RESPONSE_PROMPT_TOKEN_COUNT, - SENTRY_DENYLIST, - SENTRY_PII_DENYLIST, -) -from litellm.cost_calculator import ( - RealtimeAPITokenUsageProcessor, - _select_model_name_for_cost_calc, -) -from litellm.integrations.agentops import AgentOps -from litellm.integrations.anthropic_cache_control_hook import AnthropicCacheControlHook -from litellm.integrations.arize.arize import ArizeLogger -from litellm.integrations.custom_guardrail import CustomGuardrail -from litellm.integrations.custom_logger import CustomLogger -from litellm.integrations.deepeval.deepeval import DeepEvalLogger -from litellm.integrations.mlflow import MlflowLogger -from litellm.integrations.sqs import SQSLogger -from litellm.litellm_core_utils.core_helpers import reconstruct_model_name -from litellm.litellm_core_utils.get_litellm_params import get_litellm_params -from litellm.litellm_core_utils.llm_cost_calc.tool_call_cost_tracking import ( - StandardBuiltInToolCostTracking, -) -from litellm.litellm_core_utils.model_param_helper import ModelParamHelper -from litellm.litellm_core_utils.redact_messages import ( - redact_message_input_output_from_custom_logger, - redact_message_input_output_from_logging, -) -from litellm.llms.base_llm.ocr.transformation import OCRResponse -from litellm.llms.base_llm.search.transformation import SearchResponse -from litellm.responses.utils import ResponseAPILoggingUtils -from litellm.types.agents import LiteLLMSendMessageResponse -from litellm.types.containers.main import ContainerObject -from litellm.types.llms.openai import ( - AllMessageValues, - Batch, - FineTuningJob, - HttpxBinaryResponseContent, - OpenAIFileObject, - OpenAIModerationResponse, - ResponseAPIUsage, - ResponseCompletedEvent, - ResponsesAPIResponse, -) -from litellm.types.mcp import MCPPostCallResponseObject -from litellm.types.prompts.init_prompts import PromptSpec -from litellm.types.rerank import RerankResponse -from litellm.types.utils import ( - CachingDetails, - CallTypes, - CostBreakdown, - CostResponseTypes, - CustomPricingLiteLLMParams, - DynamicPromptManagementParamLiteral, - EmbeddingResponse, - GuardrailStatus, - ImageResponse, - LiteLLMBatch, - LiteLLMLoggingBaseClass, - LiteLLMRealtimeStreamLoggingObject, - ModelResponse, - ModelResponseStream, - RawRequestTypedDict, - StandardBuiltInToolsParams, - StandardCallbackDynamicParams, - StandardLoggingAdditionalHeaders, - StandardLoggingHiddenParams, - StandardLoggingMCPToolCall, - StandardLoggingMetadata, - StandardLoggingModelCostFailureDebugInformation, - StandardLoggingModelInformation, - StandardLoggingPayload, - StandardLoggingPayloadErrorInformation, - StandardLoggingPayloadStatus, - StandardLoggingPayloadStatusFields, - StandardLoggingPromptManagementMetadata, - StandardLoggingVectorStoreRequest, - TextCompletionResponse, - TranscriptionResponse, - Usage, -) -from litellm.types.videos.main import VideoObject -from litellm.utils import _get_base_model_from_metadata, executor, print_verbose - -from ..integrations.argilla import ArgillaLogger -from ..integrations.arize.arize_phoenix import ArizePhoenixLogger -from ..integrations.athina import AthinaLogger -from ..integrations.azure_sentinel.azure_sentinel import AzureSentinelLogger -from ..integrations.azure_storage.azure_storage import AzureBlobStorageLogger -from ..integrations.custom_prompt_management import CustomPromptManagement -from ..integrations.datadog.datadog import DataDogLogger -from ..integrations.datadog.datadog_llm_obs import DataDogLLMObsLogger -from ..integrations.dotprompt import DotpromptManager -from ..integrations.dynamodb import DyanmoDBLogger -from ..integrations.galileo import GalileoObserve -from ..integrations.gcs_bucket.gcs_bucket import GCSBucketLogger -from ..integrations.gcs_pubsub.pub_sub import GcsPubSubLogger -from ..integrations.greenscale import GreenscaleLogger -from ..integrations.helicone import HeliconeLogger -from ..integrations.humanloop import HumanloopLogger -from ..integrations.lago import LagoLogger -from ..integrations.langfuse.langfuse import LangFuseLogger -from ..integrations.langfuse.langfuse_handler import LangFuseHandler -from ..integrations.langfuse.langfuse_prompt_management import LangfusePromptManagement -from ..integrations.langsmith import LangsmithLogger -from ..integrations.literal_ai import LiteralAILogger -from ..integrations.logfire_logger import LogfireLevel, LogfireLogger -from ..integrations.lunary import LunaryLogger -from ..integrations.openmeter import OpenMeterLogger -from ..integrations.opik.opik import OpikLogger -from ..integrations.posthog import PostHogLogger -from ..integrations.prompt_layer import PromptLayerLogger -from ..integrations.s3 import S3Logger -from ..integrations.s3_v2 import S3Logger as S3V2Logger -from ..integrations.supabase import Supabase -from ..integrations.traceloop import TraceloopLogger -from .exception_mapping_utils import _get_response_headers -from .initialize_dynamic_callback_params import ( - initialize_standard_callback_dynamic_params as _initialize_standard_callback_dynamic_params, -) -from .specialty_caches.dynamic_logging_cache import DynamicLoggingCache - -if TYPE_CHECKING: - from litellm.llms.base_llm.passthrough.transformation import BasePassthroughConfig -try: - from litellm_enterprise.enterprise_callbacks.callback_controls import ( - EnterpriseCallbackControls, - ) - from litellm_enterprise.enterprise_callbacks.pagerduty.pagerduty import ( - PagerDutyAlerting, - ) - from litellm_enterprise.enterprise_callbacks.send_emails.resend_email import ( - ResendEmailLogger, - ) - from litellm_enterprise.enterprise_callbacks.send_emails.sendgrid_email import ( - SendGridEmailLogger, - ) - from litellm_enterprise.enterprise_callbacks.send_emails.smtp_email import ( - SMTPEmailLogger, - ) - from litellm_enterprise.litellm_core_utils.litellm_logging import ( - StandardLoggingPayloadSetup as EnterpriseStandardLoggingPayloadSetup, - ) - - from litellm.integrations.generic_api.generic_api_callback import GenericAPILogger - - EnterpriseStandardLoggingPayloadSetupVAR: Optional[ - Type[EnterpriseStandardLoggingPayloadSetup] - ] = EnterpriseStandardLoggingPayloadSetup -except Exception as e: - verbose_logger.debug( - f"[Non-Blocking] Unable to import GenericAPILogger - LiteLLM Enterprise Feature - {str(e)}" - ) - GenericAPILogger = CustomLogger # type: ignore - ResendEmailLogger = CustomLogger # type: ignore - SendGridEmailLogger = CustomLogger # type: ignore - SMTPEmailLogger = CustomLogger # type: ignore - PagerDutyAlerting = CustomLogger # type: ignore - EnterpriseCallbackControls = None # type: ignore - EnterpriseStandardLoggingPayloadSetupVAR = None -_in_memory_loggers: List[Any] = [] - -_STANDARD_LOGGING_METADATA_KEYS: frozenset = frozenset( - StandardLoggingMetadata.__annotations__.keys() -) - -### GLOBAL VARIABLES ### - -# Cache custom pricing keys as frozenset for O(1) lookups instead of looping through 49 keys -_CUSTOM_PRICING_KEYS: frozenset = frozenset( - CustomPricingLiteLLMParams.model_fields.keys() -) - -sentry_sdk_instance = None -capture_exception = None -add_breadcrumb = None -slack_app = None -alerts_channel = None -heliconeLogger = None -athinaLogger = None -promptLayerLogger = None -logfireLogger = None -weightsBiasesLogger = None -customLogger = None -langFuseLogger = None -openMeterLogger = None -lagoLogger = None -dataDogLogger = None -prometheusLogger = None -dynamoLogger = None -s3Logger = None -greenscaleLogger = None -lunaryLogger = None -supabaseClient = None -deepevalLogger = None -callback_list: Optional[List[str]] = [] -user_logger_fn = None -additional_details: Optional[Dict[str, str]] = {} -local_cache: Optional[Dict[str, str]] = {} -last_fetched_at = None -last_fetched_at_keys = None - - -#### -class ServiceTraceIDCache: - def __init__(self) -> None: - self.cache = InMemoryCache() - - def get_cache(self, litellm_call_id: str, service_name: str) -> Optional[str]: - key_name = "{}:{}".format(service_name, litellm_call_id) - response = self.cache.get_cache(key=key_name) - return response - - def set_cache(self, litellm_call_id: str, service_name: str, trace_id: str) -> None: - key_name = "{}:{}".format(service_name, litellm_call_id) - self.cache.set_cache(key=key_name, value=trace_id) - return None - - -in_memory_trace_id_cache = ServiceTraceIDCache() -in_memory_dynamic_logger_cache = DynamicLoggingCache() - -# Cached lazy import for PrometheusLogger -# Module-level cache to avoid repeated imports while preserving memory benefits -_PrometheusLogger = None - - -def _get_cached_prometheus_logger(): - """ - Get cached PrometheusLogger class. - Lazy imports on first call to avoid loading prometheus.py and utils.py at import time (60MB saved). - Subsequent calls use cached class for better performance. - """ - global _PrometheusLogger - if _PrometheusLogger is None: - from litellm.integrations.prometheus import PrometheusLogger - - _PrometheusLogger = PrometheusLogger - return _PrometheusLogger - - -class Logging(LiteLLMLoggingBaseClass): - global supabaseClient, promptLayerLogger, weightsBiasesLogger, logfireLogger, capture_exception, add_breadcrumb, lunaryLogger, logfireLogger, prometheusLogger, slack_app - custom_pricing: bool = False - stream_options = None - litellm_request_debug: bool = False - - def __init__( - self, - model: str, - messages, - stream, - call_type, - start_time, - litellm_call_id: str, - function_id: str, - litellm_trace_id: Optional[str] = None, - dynamic_input_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = None, - dynamic_success_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = None, - dynamic_async_success_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = None, - dynamic_failure_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = None, - dynamic_async_failure_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = None, - applied_guardrails: Optional[List[str]] = None, - kwargs: Optional[Dict] = None, - log_raw_request_response: bool = False, - ): - _input: Optional[str] = messages # save original value of messages - if messages is not None: - if isinstance(messages, str): - messages = [ - {"role": "user", "content": messages} - ] # convert text completion input to the chat completion format - elif ( - isinstance(messages, list) - and len(messages) > 0 - and isinstance(messages[0], str) - ): - new_messages = [] - for m in messages: - new_messages.append({"role": "user", "content": m}) - messages = new_messages - - self.model = model - self.messages = copy.deepcopy(messages) if messages is not None else None - self.stream = stream - self.start_time = start_time # log the call start time - self.call_type = call_type - self.litellm_call_id = litellm_call_id - self.litellm_trace_id: str = ( - litellm_trace_id if litellm_trace_id else str(uuid.uuid4()) - ) - self.function_id = function_id - self.streaming_chunks: List[Any] = [] # for generating complete stream response - self.sync_streaming_chunks: List[ - Any - ] = [] # for generating complete stream response - self.log_raw_request_response = log_raw_request_response - - # Initialize dynamic callbacks - self.dynamic_input_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = dynamic_input_callbacks - self.dynamic_success_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = dynamic_success_callbacks - self.dynamic_async_success_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = dynamic_async_success_callbacks - self.dynamic_failure_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = dynamic_failure_callbacks - self.dynamic_async_failure_callbacks: Optional[ - List[Union[str, Callable, CustomLogger]] - ] = dynamic_async_failure_callbacks - - # Process dynamic callbacks - self.process_dynamic_callbacks() - - ## DYNAMIC LANGFUSE / GCS / logging callback KEYS ## - self.standard_callback_dynamic_params: StandardCallbackDynamicParams = ( - self.initialize_standard_callback_dynamic_params(kwargs) - ) - self.standard_built_in_tools_params: StandardBuiltInToolsParams = ( - self.initialize_standard_built_in_tools_params(kwargs) - ) - ## TIME TO FIRST TOKEN LOGGING ## - self.completion_start_time: Optional[datetime.datetime] = None - self._llm_caching_handler: Optional[LLMCachingHandler] = None - - # INITIAL LITELLM_PARAMS - litellm_params = {} - if kwargs is not None: - litellm_params = get_litellm_params(**kwargs) - litellm_params = scrub_sensitive_keys_in_metadata(litellm_params) - - self.litellm_params = litellm_params - - # Initialize cost breakdown field - self.cost_breakdown: Optional[CostBreakdown] = None - - # Init Caching related details - self.caching_details: Optional[CachingDetails] = None - - # Passthrough endpoint guardrails config for field targeting - self.passthrough_guardrails_config: Optional[Dict[str, Any]] = None - - self.model_call_details: Dict[str, Any] = { - "litellm_trace_id": litellm_trace_id, - "litellm_call_id": litellm_call_id, - "input": _input, - "litellm_params": litellm_params, - "applied_guardrails": applied_guardrails, - "model": model, - } - - def process_dynamic_callbacks(self): - """ - Initializes CustomLogger compatible callbacks in self.dynamic_* callbacks - - If a callback is in litellm._known_custom_logger_compatible_callbacks, it needs to be intialized and added to the respective dynamic_* callback list. - """ - # Process input callbacks - self.dynamic_input_callbacks = self._process_dynamic_callback_list( - self.dynamic_input_callbacks, dynamic_callbacks_type="input" - ) - - # Process failure callbacks - self.dynamic_failure_callbacks = self._process_dynamic_callback_list( - self.dynamic_failure_callbacks, dynamic_callbacks_type="failure" - ) - - # Process async failure callbacks - self.dynamic_async_failure_callbacks = self._process_dynamic_callback_list( - self.dynamic_async_failure_callbacks, dynamic_callbacks_type="async_failure" - ) - - # Process success callbacks - self.dynamic_success_callbacks = self._process_dynamic_callback_list( - self.dynamic_success_callbacks, dynamic_callbacks_type="success" - ) - - # Process async success callbacks - self.dynamic_async_success_callbacks = self._process_dynamic_callback_list( - self.dynamic_async_success_callbacks, dynamic_callbacks_type="async_success" - ) - - def _process_dynamic_callback_list( - self, - callback_list: Optional[List[Union[str, Callable, CustomLogger]]], - dynamic_callbacks_type: Literal[ - "input", "success", "failure", "async_success", "async_failure" - ], - ) -> Optional[List[Union[str, Callable, CustomLogger]]]: - """ - Helper function to initialize CustomLogger compatible callbacks in self.dynamic_* callbacks - - - If a callback is in litellm._known_custom_logger_compatible_callbacks, - replace the string with the initialized callback class. - - If dynamic callback is a "success" callback that is a known_custom_logger_compatible_callbacks then add it to dynamic_async_success_callbacks - - If dynamic callback is a "failure" callback that is a known_custom_logger_compatible_callbacks then add it to dynamic_failure_callbacks - """ - if callback_list is None: - return None - - processed_list: List[Union[str, Callable, CustomLogger]] = [] - for callback in callback_list: - if ( - isinstance(callback, str) - and callback in litellm._known_custom_logger_compatible_callbacks - ): - callback_class = _init_custom_logger_compatible_class( - callback, internal_usage_cache=None, llm_router=None # type: ignore - ) - if callback_class is not None: - processed_list.append(callback_class) - - # If processing dynamic_success_callbacks, add to dynamic_async_success_callbacks - if dynamic_callbacks_type == "success": - if self.dynamic_async_success_callbacks is None: - self.dynamic_async_success_callbacks = [] - self.dynamic_async_success_callbacks.append(callback_class) - elif dynamic_callbacks_type == "failure": - if self.dynamic_async_failure_callbacks is None: - self.dynamic_async_failure_callbacks = [] - self.dynamic_async_failure_callbacks.append(callback_class) - else: - processed_list.append(callback) - return processed_list - - def initialize_standard_callback_dynamic_params( - self, kwargs: Optional[Dict] = None - ) -> StandardCallbackDynamicParams: - """ - Initialize the standard callback dynamic params from the kwargs - - checks if langfuse_secret_key, gcs_bucket_name in kwargs and sets the corresponding attributes in StandardCallbackDynamicParams - """ - - return _initialize_standard_callback_dynamic_params(kwargs) - - def initialize_standard_built_in_tools_params( - self, kwargs: Optional[Dict] = None - ) -> StandardBuiltInToolsParams: - """ - Initialize the standard built-in tools params from the kwargs - - checks if web_search_options in kwargs or tools and sets the corresponding attribute in StandardBuiltInToolsParams - """ - return StandardBuiltInToolsParams( - web_search_options=StandardBuiltInToolCostTracking._get_web_search_options( - kwargs or {} - ), - file_search=StandardBuiltInToolCostTracking._get_file_search_tool_call( - kwargs or {} - ), - ) - - def update_environment_variables( - self, - litellm_params: Dict, - optional_params: Dict, - model: Optional[str] = None, - user: Optional[str] = None, - **additional_params, - ): - self.optional_params = optional_params - if model is not None: - self.model = model - self.user = user - self.litellm_params = { - **self.litellm_params, - **scrub_sensitive_keys_in_metadata(litellm_params), - } - self.litellm_request_debug = litellm_params.get("litellm_request_debug", False) - self.logger_fn = litellm_params.get("logger_fn", None) - if _is_debugging_on() or self.litellm_request_debug: - verbose_logger.debug(f"self.optional_params: {self.optional_params}") - - self.model_call_details.update( - { - "model": self.model, - "messages": self.messages, - "optional_params": self.optional_params, - "litellm_params": self.litellm_params, - "start_time": self.start_time, - "stream": self.stream, - "user": user, - "call_type": str(self.call_type), - "litellm_call_id": self.litellm_call_id, - "completion_start_time": self.completion_start_time, - "standard_callback_dynamic_params": self.standard_callback_dynamic_params, - **self.optional_params, - **additional_params, - } - ) - - ## check if stream options is set ## - used by CustomStreamWrapper for easy instrumentation - if "stream_options" in additional_params: - self.stream_options = additional_params["stream_options"] - ## check if custom pricing set ## - if any( - litellm_params.get(key) is not None - for key in _CUSTOM_PRICING_KEYS & litellm_params.keys() - ): - self.custom_pricing = True - - if "custom_llm_provider" in self.model_call_details: - self.custom_llm_provider = self.model_call_details["custom_llm_provider"] - - def update_messages(self, messages: List[AllMessageValues]): - """ - Update the logged value of the messages in the model_call_details - - Allows pre-call hooks to update the messages before the call is made - """ - self.messages = messages - self.model_call_details["messages"] = messages - - def should_run_prompt_management_hooks( - self, - non_default_params: Dict, - prompt_id: Optional[str] = None, - tools: Optional[List[Dict]] = None, - ) -> bool: - """ - Return True if prompt management hooks should be run - """ - if prompt_id: - return True - - if self._should_run_prompt_management_hooks_without_prompt_id( - non_default_params=non_default_params, - tools=tools, - ): - return True - - return False - - def _should_run_prompt_management_hooks_without_prompt_id( - self, - non_default_params: Dict, - tools: Optional[List[Dict]] = None, - ) -> bool: - """ - Certain prompt management hooks don't need a `prompt_id` to be passed in, they are triggered by dynamic params - - eg. AnthropicCacheControlHook and BedrockKnowledgeBaseHook both don't require a `prompt_id` to be passed in, they are triggered by dynamic params - """ - for param in non_default_params: - if param in DynamicPromptManagementParamLiteral.list_all_params(): - return True - - ############################################################################# - # Check if Vector Store / Knowledge Base hooks should be applied to the prompt - ############################################################################# - if litellm.vector_store_registry is not None: - if litellm.vector_store_registry.get_vector_store_to_run( - non_default_params=non_default_params, tools=tools - ): - return True - return False - - def get_chat_completion_prompt( - self, - model: str, - messages: List[AllMessageValues], - non_default_params: Dict, - prompt_variables: Optional[dict], - prompt_id: Optional[str] = None, - prompt_spec: Optional[PromptSpec] = None, - prompt_management_logger: Optional[CustomLogger] = None, - prompt_label: Optional[str] = None, - prompt_version: Optional[int] = None, - ) -> Tuple[str, List[AllMessageValues], dict]: - custom_logger = ( - prompt_management_logger - or self.get_custom_logger_for_prompt_management( - model=model, - non_default_params=non_default_params, - prompt_id=prompt_id, - prompt_spec=prompt_spec, - dynamic_callback_params=self.standard_callback_dynamic_params, - ) - ) - - if custom_logger: - ( - model, - messages, - non_default_params, - ) = custom_logger.get_chat_completion_prompt( - model=model, - messages=messages, - non_default_params=non_default_params or {}, - prompt_id=prompt_id, - prompt_spec=prompt_spec, - prompt_variables=prompt_variables, - dynamic_callback_params=self.standard_callback_dynamic_params, - prompt_label=prompt_label, - prompt_version=prompt_version, - ) - self.messages = messages - return model, messages, non_default_params - - async def async_get_chat_completion_prompt( - self, - model: str, - messages: List[AllMessageValues], - non_default_params: Dict, - prompt_variables: Optional[dict], - prompt_id: Optional[str] = None, - prompt_spec: Optional[PromptSpec] = None, - prompt_management_logger: Optional[CustomLogger] = None, - tools: Optional[List[Dict]] = None, - prompt_label: Optional[str] = None, - prompt_version: Optional[int] = None, - ) -> Tuple[str, List[AllMessageValues], dict]: - custom_logger = ( - prompt_management_logger - or self.get_custom_logger_for_prompt_management( - model=model, - tools=tools, - non_default_params=non_default_params, - prompt_id=prompt_id, - prompt_spec=prompt_spec, - dynamic_callback_params=self.standard_callback_dynamic_params, - ) - ) - - if custom_logger: - ( - model, - messages, - non_default_params, - ) = await custom_logger.async_get_chat_completion_prompt( - model=model, - messages=messages, - non_default_params=non_default_params or {}, - prompt_id=prompt_id, - prompt_spec=prompt_spec, - prompt_variables=prompt_variables, - dynamic_callback_params=self.standard_callback_dynamic_params, - litellm_logging_obj=self, - tools=tools, - prompt_label=prompt_label, - prompt_version=prompt_version, - ) - self.messages = messages - return model, messages, non_default_params - - def _auto_detect_prompt_management_logger( - self, - prompt_id: str, - prompt_spec: Optional[PromptSpec], - dynamic_callback_params: StandardCallbackDynamicParams, - ) -> Optional[CustomLogger]: - """ - Auto-detect which prompt management system owns the given prompt_id. - - This allows a user to just pass prompt_id in the completion call and it will be auto-detected which system owns this prompt. - - Args: - prompt_id: The prompt ID to check - dynamic_callback_params: Dynamic callback parameters for should_run_prompt_management checks - - Returns: - A CustomLogger instance if a matching prompt management system is found, None otherwise - """ - prompt_management_loggers = ( - litellm.logging_callback_manager.get_custom_loggers_for_type( - callback_type=CustomPromptManagement - ) - ) - - for logger in prompt_management_loggers: - if isinstance(logger, CustomPromptManagement): - try: - if logger.should_run_prompt_management( - prompt_id=prompt_id, - prompt_spec=prompt_spec, - dynamic_callback_params=dynamic_callback_params, - ): - self.model_call_details[ - "prompt_integration" - ] = logger.__class__.__name__ - return logger - except Exception: - # If check fails, continue to next logger - continue - - return None - - def get_custom_logger_for_prompt_management( - self, - model: str, - non_default_params: Dict, - tools: Optional[List[Dict]] = None, - prompt_id: Optional[str] = None, - prompt_spec: Optional[PromptSpec] = None, - dynamic_callback_params: Optional[StandardCallbackDynamicParams] = None, - ) -> Optional[CustomLogger]: - """ - Get a custom logger for prompt management based on model name or available callbacks. - - Args: - model: The model name to check for prompt management integration - non_default_params: Non-default parameters passed to the completion call - tools: Optional tools passed to the completion call - prompt_id: Optional prompt ID to auto-detect which system owns this prompt - dynamic_callback_params: Dynamic callback parameters for should_run_prompt_management checks - - Returns: - A CustomLogger instance if one is found, None otherwise - """ - # First check if model starts with a known custom logger compatible callback - # This takes precedence for backward compatibility - for callback_name in litellm._known_custom_logger_compatible_callbacks: - if model.startswith(callback_name): - custom_logger = _init_custom_logger_compatible_class( - logging_integration=callback_name, - internal_usage_cache=None, - llm_router=None, - ) - if custom_logger is not None: - self.model_call_details["prompt_integration"] = model.split("/")[0] - return custom_logger - - # If prompt_id is provided, try to auto-detect which system has this prompt - if prompt_id and dynamic_callback_params is not None: - auto_detected_logger = self._auto_detect_prompt_management_logger( - prompt_id=prompt_id, - prompt_spec=prompt_spec, - dynamic_callback_params=dynamic_callback_params, - ) - if auto_detected_logger is not None: - return auto_detected_logger - - # Then check for any registered CustomPromptManagement loggers (fallback) - prompt_management_loggers = ( - litellm.logging_callback_manager.get_custom_loggers_for_type( - callback_type=CustomPromptManagement - ) - ) - - if prompt_management_loggers: - logger = prompt_management_loggers[0] - self.model_call_details["prompt_integration"] = logger.__class__.__name__ - return logger - - if anthropic_cache_control_logger := AnthropicCacheControlHook.get_custom_logger_for_anthropic_cache_control_hook( - non_default_params - ): - self.model_call_details[ - "prompt_integration" - ] = anthropic_cache_control_logger.__class__.__name__ - return anthropic_cache_control_logger - - ######################################################### - # Vector Store / Knowledge Base hooks - ######################################################### - if litellm.vector_store_registry is not None: - vector_store_custom_logger = _init_custom_logger_compatible_class( - logging_integration="vector_store_pre_call_hook", - internal_usage_cache=None, - llm_router=None, - ) - self.model_call_details[ - "prompt_integration" - ] = vector_store_custom_logger.__class__.__name__ - # Add to global callbacks so post-call hooks are invoked - if ( - vector_store_custom_logger - and vector_store_custom_logger not in litellm.callbacks - ): - litellm.logging_callback_manager.add_litellm_callback( - vector_store_custom_logger - ) - return vector_store_custom_logger - - return None - - def get_custom_logger_for_anthropic_cache_control_hook( - self, non_default_params: Dict - ) -> Optional[CustomLogger]: - if non_default_params.get("cache_control_injection_points", None): - custom_logger = _init_custom_logger_compatible_class( - logging_integration="anthropic_cache_control_hook", - internal_usage_cache=None, - llm_router=None, - ) - return custom_logger - return None - - def _get_raw_request_body(self, data: Optional[Union[dict, str]]) -> dict: - if data is None: - return {"error": "Received empty dictionary for raw request body"} - if isinstance(data, str): - try: - return json.loads(data) - except Exception: - return { - "error": "Unable to parse raw request body. Got - {}".format(data) - } - return data - - def _get_masked_api_base(self, api_base: str) -> str: - if "key=" in api_base: - # Find the position of "key=" in the string - key_index = api_base.find("key=") + 4 - # Mask the last 5 characters after "key=" - masked_api_base = api_base[:key_index] + "*" * 5 + api_base[-4:] - else: - masked_api_base = api_base - return str(masked_api_base) - - def _pre_call(self, input, api_key, model=None, additional_args={}): - """ - Common helper function across the sync + async pre-call function - """ - - self.model_call_details["input"] = input - self.model_call_details["api_key"] = api_key - self.model_call_details["additional_args"] = additional_args - self.model_call_details["log_event_type"] = "pre_api_call" - if ( - model - ): # if model name was changes pre-call, overwrite the initial model call name with the new one - self.model_call_details["model"] = model - self.model_call_details["litellm_params"][ - "api_base" - ] = self._get_masked_api_base(additional_args.get("api_base", "")) - - def pre_call(self, input, api_key, model=None, additional_args={}): # noqa: PLR0915 - # Log the exact input to the LLM API - litellm.error_logs["PRE_CALL"] = locals() - try: - self._pre_call( - input=input, - api_key=api_key, - model=model, - additional_args=additional_args, - ) - - # User Logging -> if you pass in a custom logging function - self._print_llm_call_debugging_log( - api_base=additional_args.get("api_base", ""), - headers=additional_args.get("headers", {}), - additional_args=additional_args, - ) - # log raw request to provider (like LangFuse) -- if opted in. - if ( - self.log_raw_request_response is True - or log_raw_request_response is True - ): - _litellm_params = self.model_call_details.get("litellm_params", {}) - _metadata = _litellm_params.get("metadata", {}) or {} - try: - # [Non-blocking Extra Debug Information in metadata] - if turn_off_message_logging is True: - _metadata[ - "raw_request" - ] = "redacted by litellm. \ - 'litellm.turn_off_message_logging=True'" - else: - curl_command = self._get_request_curl_command( - api_base=additional_args.get("api_base", ""), - headers=additional_args.get("headers", {}), - additional_args=additional_args, - data=additional_args.get("complete_input_dict", {}), - ) - - _metadata["raw_request"] = str(curl_command) - # split up, so it's easier to parse in the UI - self.model_call_details[ - "raw_request_typed_dict" - ] = RawRequestTypedDict( - raw_request_api_base=str( - additional_args.get("api_base") or "" - ), - raw_request_body=self._get_raw_request_body( - additional_args.get("complete_input_dict", {}) - ), - # NOTE: setting ignore_sensitive_headers to True will cause - # the Authorization header to be leaked when calls to the health - # endpoint are made and fail. - raw_request_headers=self._get_masked_headers( - additional_args.get("headers", {}) or {}, - ), - error=None, - ) - except Exception as e: - self.model_call_details[ - "raw_request_typed_dict" - ] = RawRequestTypedDict( - error=str(e), - ) - _metadata[ - "raw_request" - ] = "Unable to Log \ - raw request: {}".format( - str(e) - ) - if getattr(self, "logger_fn", None) and callable(self.logger_fn): - try: - self.logger_fn( - self.model_call_details - ) # Expectation: any logger function passed in by the user should accept a dict object - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( - str(e) - ) - ) - - self.model_call_details["api_call_start_time"] = datetime.datetime.now() - # Input Integration Logging -> If you want to log the fact that an attempt to call the model was made - callbacks = litellm.input_callback + (self.dynamic_input_callbacks or []) - for callback in callbacks: - try: - if callback == "supabase" and supabaseClient is not None: - verbose_logger.debug("reaches supabase for logging!") - model = self.model_call_details["model"] - messages = self.model_call_details["input"] - verbose_logger.debug(f"supabaseClient: {supabaseClient}") - supabaseClient.input_log_event( - model=model, - messages=messages, - end_user=self.model_call_details.get("user", "default"), - litellm_call_id=self.litellm_params["litellm_call_id"], - print_verbose=print_verbose, - ) - elif callback == "sentry" and add_breadcrumb: - try: - details_to_log = copy.deepcopy(self.model_call_details) - except Exception: - details_to_log = self.model_call_details - if litellm.turn_off_message_logging: - # make a copy of the _model_Call_details and log it - details_to_log.pop("messages", None) - details_to_log.pop("input", None) - details_to_log.pop("prompt", None) - - add_breadcrumb( - category="litellm.llm_call", - message=f"Model Call Details pre-call: {details_to_log}", - level="info", - ) - - elif isinstance(callback, CustomLogger): # custom logger class - callback.log_pre_api_call( - model=self.model, - messages=self.messages, - kwargs=self.model_call_details, - ) - elif ( - callable(callback) and customLogger is not None - ): # custom logger functions - customLogger.log_input_event( - model=self.model, - messages=self.messages, - kwargs=self.model_call_details, - print_verbose=print_verbose, - callback_func=callback, - ) - except Exception as e: - verbose_logger.exception( - "litellm.Logging.pre_call(): Exception occured - {}".format( - str(e) - ) - ) - verbose_logger.debug( - f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" - ) - if capture_exception: # log this error to sentry for debugging - capture_exception(e) - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( - str(e) - ) - ) - verbose_logger.error( - f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" - ) - if capture_exception: # log this error to sentry for debugging - capture_exception(e) - - def _print_llm_call_debugging_log( - self, - api_base: str, - headers: dict, - additional_args: dict, - ): - """ - Internal debugging helper function - - Prints the RAW curl command sent from LiteLLM - """ - if _is_debugging_on() or self.litellm_request_debug: - if json_logs: - masked_headers = self._get_masked_headers(headers) - if self.litellm_request_debug: - verbose_logger.warning( # .warning ensures this shows up in all environments - "POST Request Sent from LiteLLM", - extra={"api_base": {api_base}, **masked_headers}, - ) - else: - verbose_logger.debug( - "POST Request Sent from LiteLLM", - extra={"api_base": {api_base}, **masked_headers}, - ) - else: - headers = additional_args.get("headers", {}) - if headers is None: - headers = {} - data = additional_args.get("complete_input_dict", {}) - api_base = str(additional_args.get("api_base", "")) - curl_command = self._get_request_curl_command( - api_base=api_base, - headers=headers, - additional_args=additional_args, - data=data, - ) - if self.litellm_request_debug: - verbose_logger.warning( - f"\033[92m{curl_command}\033[0m\n" - ) # .warning ensures this shows up in all environments - else: - verbose_logger.debug(f"\033[92m{curl_command}\033[0m\n") - - def _get_request_body(self, data: dict) -> str: - return str(data) - - def _get_request_curl_command( - self, api_base: str, headers: Optional[dict], additional_args: dict, data: dict - ) -> str: - masked_api_base = self._get_masked_api_base(api_base) - if headers is None: - headers = {} - curl_command = "\n\nPOST Request Sent from LiteLLM:\n" - curl_command += "curl -X POST \\\n" - curl_command += f"{masked_api_base} \\\n" - masked_headers = self._get_masked_headers(headers) - formatted_headers = " ".join( - [f"-H '{k}: {v}'" for k, v in masked_headers.items()] - ) - curl_command += ( - f"{formatted_headers} \\\n" if formatted_headers.strip() != "" else "" - ) - curl_command += f"-d '{self._get_request_body(data)}'\n" - if additional_args.get("request_str", None) is not None: - # print the sagemaker / bedrock client request - curl_command = "\nRequest Sent from LiteLLM:\n" - request_str = additional_args.get("request_str", "") - curl_command += request_str - elif api_base == "": - curl_command = str(self.model_call_details) - return curl_command - - def _get_masked_headers( - self, headers: dict, ignore_sensitive_headers: bool = False - ) -> dict: - """ - Internal debugging helper function - - Masks the headers of the request sent from LiteLLM - """ - return _get_masked_values( - headers, ignore_sensitive_values=ignore_sensitive_headers - ) - - def post_call( - self, original_response, input=None, api_key=None, additional_args={} - ): - # Log the exact result from the LLM API, for streaming - log the type of response received - litellm.error_logs["POST_CALL"] = locals() - if isinstance(original_response, dict): - original_response = json.dumps(original_response) - try: - self.model_call_details["input"] = input - self.model_call_details["api_key"] = api_key - self.model_call_details["original_response"] = original_response - self.model_call_details["additional_args"] = additional_args - self.model_call_details["log_event_type"] = "post_api_call" - - if self.litellm_request_debug: - attr = "warning" - else: - attr = "debug" - - if json_logs: - callattr = getattr(verbose_logger, attr) - callattr( - "RAW RESPONSE:\n{}\n\n".format( - self.model_call_details.get( - "original_response", self.model_call_details - ) - ), - ) - else: - callattr = getattr(verbose_logger, attr) - callattr( - "RAW RESPONSE:\n{}\n\n".format( - self.model_call_details.get( - "original_response", self.model_call_details - ) - ) - ) - if getattr(self, "logger_fn", None) and callable(self.logger_fn): - try: - self.logger_fn( - self.model_call_details - ) # Expectation: any logger function passed in by the user should accept a dict object - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( - str(e) - ) - ) - original_response = redact_message_input_output_from_logging( - model_call_details=( - self.model_call_details - if hasattr(self, "model_call_details") - else {} - ), - result=original_response, - ) - # Input Integration Logging -> If you want to log the fact that an attempt to call the model was made - - callbacks = litellm.input_callback + (self.dynamic_input_callbacks or []) - for callback in callbacks: - try: - if callback == "sentry" and add_breadcrumb: - verbose_logger.debug("reaches sentry breadcrumbing") - try: - details_to_log = copy.deepcopy(self.model_call_details) - except Exception: - details_to_log = self.model_call_details - if litellm.turn_off_message_logging: - # make a copy of the _model_Call_details and log it - details_to_log.pop("messages", None) - details_to_log.pop("input", None) - details_to_log.pop("prompt", None) - - add_breadcrumb( - category="litellm.llm_call", - message=f"Model Call Details post-call: {details_to_log}", - level="info", - ) - elif isinstance(callback, CustomLogger): # custom logger class - callback.log_post_api_call( - kwargs=self.model_call_details, - response_obj=None, - start_time=self.start_time, - end_time=None, - ) - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while post-call logging with integrations {}".format( - str(e) - ) - ) - verbose_logger.debug( - f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" - ) - if capture_exception: # log this error to sentry for debugging - capture_exception(e) - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( - str(e) - ) - ) - - async def async_post_mcp_tool_call_hook( - self, - kwargs: dict, - response_obj: Any, - start_time: datetime.datetime, - end_time: datetime.datetime, - ): - """ - Post MCP Tool Call Hook - - Use this to modify the MCP tool call response before it is returned to the user. - """ - from litellm.types.llms.base import HiddenParams - from litellm.types.mcp import MCPPostCallResponseObject - - callbacks = self.get_combined_callback_list( - dynamic_success_callbacks=self.dynamic_success_callbacks, - global_callbacks=litellm.success_callback, - ) - post_mcp_tool_call_response_obj: MCPPostCallResponseObject = ( - MCPPostCallResponseObject( - mcp_tool_call_response=response_obj, hidden_params=HiddenParams() - ) - ) - for callback in callbacks: - try: - if isinstance(callback, CustomLogger): - response: Optional[ - MCPPostCallResponseObject - ] = await callback.async_post_mcp_tool_call_hook( - kwargs=kwargs, - response_obj=post_mcp_tool_call_response_obj, - start_time=start_time, - end_time=end_time, - ) - ###################################################################### - # if any of the callbacks modify the response, use the modified response - # current implementation returns the first modified response - ###################################################################### - if response is not None: - response_obj = self._parse_post_mcp_call_hook_response( - response=response - ) - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( - str(e) - ) - ) - return response_obj - - def _parse_post_mcp_call_hook_response( - self, response: Optional[MCPPostCallResponseObject] - ) -> Any: - """ - Parse the response from the post_mcp_tool_call_hook - - 1. Unpack the mcp_tool_call_response - 2. save the updated response_cost to the model_call_details - """ - if response is None: - return None - self.model_call_details["response_cost"] = response.hidden_params.response_cost - return response.mcp_tool_call_response - - def get_response_ms(self) -> float: - return ( - self.model_call_details.get("end_time", datetime.datetime.now()) - - self.model_call_details.get("start_time", datetime.datetime.now()) - ).total_seconds() * 1000 - - def set_cost_breakdown( - self, - input_cost: float, - output_cost: float, - total_cost: float, - cost_for_built_in_tools_cost_usd_dollar: float, - additional_costs: Optional[dict] = None, - original_cost: Optional[float] = None, - discount_percent: Optional[float] = None, - discount_amount: Optional[float] = None, - margin_percent: Optional[float] = None, - margin_fixed_amount: Optional[float] = None, - margin_total_amount: Optional[float] = None, - ) -> None: - """ - Helper method to store cost breakdown in the logging object. - - Args: - input_cost: Cost of input/prompt tokens - output_cost: Cost of output/completion tokens - cost_for_built_in_tools_cost_usd_dollar: Cost of built-in tools - total_cost: Total cost of request - additional_costs: Free-form additional costs dict (e.g., {"azure_model_router_flat_cost": 0.00014}) - original_cost: Cost before discount - discount_percent: Discount percentage (0.05 = 5%) - discount_amount: Discount amount in USD - margin_percent: Margin percentage applied (0.10 = 10%) - margin_fixed_amount: Fixed margin amount in USD - margin_total_amount: Total margin added in USD - """ - - self.cost_breakdown = CostBreakdown( - input_cost=input_cost, - output_cost=output_cost, - total_cost=total_cost, - tool_usage_cost=cost_for_built_in_tools_cost_usd_dollar, - ) - - # Store additional costs if provided (free-form dict for extensibility) - if ( - additional_costs - and isinstance(additional_costs, dict) - and len(additional_costs) > 0 - ): - self.cost_breakdown["additional_costs"] = additional_costs - - # Store discount information if provided - if original_cost is not None: - self.cost_breakdown["original_cost"] = original_cost - if discount_percent is not None: - self.cost_breakdown["discount_percent"] = discount_percent - if discount_amount is not None: - self.cost_breakdown["discount_amount"] = discount_amount - - # Store margin information if provided - if margin_percent is not None: - self.cost_breakdown["margin_percent"] = margin_percent - if margin_fixed_amount is not None: - self.cost_breakdown["margin_fixed_amount"] = margin_fixed_amount - if margin_total_amount is not None: - self.cost_breakdown["margin_total_amount"] = margin_total_amount - - def _response_cost_calculator( - self, - result: Union[ - ModelResponse, - ModelResponseStream, - EmbeddingResponse, - ImageResponse, - TranscriptionResponse, - TextCompletionResponse, - HttpxBinaryResponseContent, - RerankResponse, - Batch, - FineTuningJob, - ResponsesAPIResponse, - ResponseCompletedEvent, - OpenAIFileObject, - LiteLLMRealtimeStreamLoggingObject, - OpenAIModerationResponse, - "SearchResponse", - ], - cache_hit: Optional[bool] = None, - litellm_model_name: Optional[str] = None, - router_model_id: Optional[str] = None, - ) -> Optional[float]: - """ - Calculate response cost using result + logging object variables. - - used for consistent cost calculation across response headers + logging integrations. - """ - - if isinstance(result, BaseModel) and hasattr(result, "_hidden_params"): - hidden_params = getattr(result, "_hidden_params", {}) - if ( - "response_cost" in hidden_params - and hidden_params["response_cost"] is not None - ): # use cost if already calculated - return hidden_params["response_cost"] - elif ( - router_model_id is None and "model_id" in hidden_params - ): # use model_id if not already set - router_model_id = hidden_params["model_id"] - - ## RESPONSE COST ## - custom_pricing = use_custom_pricing_for_model( - litellm_params=( - self.litellm_params if hasattr(self, "litellm_params") else None - ) - ) - - prompt = "" # use for tts cost calc - _input = self.model_call_details.get("input", None) - if _input is not None and isinstance(_input, str): - prompt = _input - - if cache_hit is None: - cache_hit = self.model_call_details.get("cache_hit", False) - - try: - response_cost_calculator_kwargs = { - "response_object": result, - "model": litellm_model_name or self.model, - "cache_hit": cache_hit, - "custom_llm_provider": self.model_call_details.get( - "custom_llm_provider", None - ), - "base_model": _get_base_model_from_metadata( - model_call_details=self.model_call_details - ), - "call_type": self.call_type, - "optional_params": self.optional_params, - "custom_pricing": custom_pricing, - "prompt": prompt, - "standard_built_in_tools_params": self.standard_built_in_tools_params, - "router_model_id": router_model_id, - "litellm_logging_obj": self, - "service_tier": ( - self.optional_params.get("service_tier") - if self.optional_params - else None - ), - } - except Exception as e: # error creating kwargs for cost calculation - debug_info = StandardLoggingModelCostFailureDebugInformation( - error_str=str(e), - traceback_str=_get_traceback_str_for_error(str(e)), - ) - verbose_logger.debug( - f"response_cost_failure_debug_information: {debug_info}" - ) - self.model_call_details[ - "response_cost_failure_debug_information" - ] = debug_info - return None - - try: - response_cost = litellm.response_cost_calculator( - **response_cost_calculator_kwargs - ) - - verbose_logger.debug(f"response_cost: {response_cost}") - return response_cost - except Exception as e: # error calculating cost - debug_info = StandardLoggingModelCostFailureDebugInformation( - error_str=str(e), - traceback_str=_get_traceback_str_for_error(str(e)), - model=response_cost_calculator_kwargs["model"], - cache_hit=response_cost_calculator_kwargs["cache_hit"], - custom_llm_provider=response_cost_calculator_kwargs[ - "custom_llm_provider" - ], - base_model=response_cost_calculator_kwargs["base_model"], - call_type=response_cost_calculator_kwargs["call_type"], - custom_pricing=response_cost_calculator_kwargs["custom_pricing"], - ) - verbose_logger.debug( - f"response_cost_failure_debug_information: {debug_info}" - ) - self.model_call_details[ - "response_cost_failure_debug_information" - ] = debug_info - - return None - - async def _response_cost_calculator_async( - self, - result: Union[ - ModelResponse, - ModelResponseStream, - EmbeddingResponse, - ImageResponse, - TranscriptionResponse, - TextCompletionResponse, - HttpxBinaryResponseContent, - RerankResponse, - Batch, - FineTuningJob, - ], - cache_hit: Optional[bool] = None, - ) -> Optional[float]: - return self._response_cost_calculator(result=result, cache_hit=cache_hit) - - def should_run_logging( - self, - event_type: Literal[ - "async_success", "sync_success", "async_failure", "sync_failure" - ], - stream: bool = False, - ) -> bool: - try: - if self.model_call_details.get(f"has_logged_{event_type}", False) is True: - return False - - return True - except Exception: - return True - - def has_run_logging( - self, - event_type: Literal[ - "async_success", "sync_success", "async_failure", "sync_failure" - ], - ) -> None: - if self.stream is not None and self.stream is True: - """ - Ignore check on stream, as there can be multiple chunks - """ - return - self.model_call_details[f"has_logged_{event_type}"] = True - return - - def should_run_callback( - self, callback: litellm.CALLBACK_TYPES, litellm_params: dict, event_hook: str - ) -> bool: - if litellm.global_disable_no_log_param: - return True - - if litellm_params.get("no-log", False) is True: - # proxy cost tracking cal backs should run - - if not ( - isinstance(callback, CustomLogger) - and "_PROXY_" in callback.__class__.__name__ - ): - verbose_logger.debug( - f"no-log request, skipping logging for {event_hook} event" - ) - return False - - # Check for dynamically disabled callbacks via headers - if ( - EnterpriseCallbackControls is not None - and EnterpriseCallbackControls.is_callback_disabled_dynamically( - callback=callback, - litellm_params=litellm_params, - standard_callback_dynamic_params=self.standard_callback_dynamic_params, - ) - ): - verbose_logger.debug( - f"Callback {callback} disabled via x-litellm-disable-callbacks header for {event_hook} event" - ) - return False - - return True - - def _update_completion_start_time(self, completion_start_time: datetime.datetime): - self.completion_start_time = completion_start_time - self.model_call_details["completion_start_time"] = self.completion_start_time - - def normalize_logging_result(self, result: Any) -> Any: - """ - Some endpoints return a different type of result than what is expected by the logging system. - This function is used to normalize the result to the expected type. - """ - logging_result = result - if self.call_type == CallTypes.arealtime.value and isinstance(result, list): - combined_usage_object = RealtimeAPITokenUsageProcessor.collect_and_combine_usage_from_realtime_stream_results( - results=result - ) - logging_result = ( - RealtimeAPITokenUsageProcessor.create_logging_realtime_object( - usage=combined_usage_object, - results=result, - ) - ) - - elif ( - self.call_type == CallTypes.llm_passthrough_route.value - or self.call_type == CallTypes.allm_passthrough_route.value - ) and isinstance(result, Response): - from litellm.utils import ProviderConfigManager - - provider_config = ProviderConfigManager.get_provider_passthrough_config( - provider=self.model_call_details.get("custom_llm_provider", ""), - model=self.model, - ) - if provider_config is not None: - logging_result = provider_config.logging_non_streaming_response( - model=self.model, - custom_llm_provider=self.model_call_details.get( - "custom_llm_provider", "" - ), - httpx_response=result, - request_data=self.model_call_details.get("request_data", {}), - logging_obj=self, - endpoint=self.model_call_details.get("endpoint", ""), - ) - return logging_result - - def _process_hidden_params_and_response_cost( - self, - logging_result, - start_time, - end_time, - ): - hidden_params = getattr(logging_result, "_hidden_params", {}) - if hidden_params: - if self.model_call_details.get("litellm_params") is not None: - self.model_call_details["litellm_params"].setdefault("metadata", {}) - if self.model_call_details["litellm_params"]["metadata"] is None: - self.model_call_details["litellm_params"]["metadata"] = {} - self.model_call_details["litellm_params"]["metadata"]["hidden_params"] = getattr(logging_result, "_hidden_params", {}) # type: ignore - - if "response_cost" in hidden_params: - self.model_call_details["response_cost"] = hidden_params["response_cost"] - else: - self.model_call_details["response_cost"] = self._response_cost_calculator( - result=logging_result - ) - - self.model_call_details[ - "standard_logging_object" - ] = get_standard_logging_object_payload( - kwargs=self.model_call_details, - init_response_obj=logging_result, - start_time=start_time, - end_time=end_time, - logging_obj=self, - status="success", - standard_built_in_tools_params=self.standard_built_in_tools_params, - ) - - def _transform_usage_objects(self, result): - if isinstance(result, ResponsesAPIResponse): - result = result.model_copy() - transformed_usage = ( - ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( - result.usage - ) - ) - setattr(result, "usage", transformed_usage) - if ( - standard_logging_payload := self.model_call_details.get( - "standard_logging_object" - ) - ) is not None: - response_dict = ( - result.model_dump() - if hasattr(result, "model_dump") - else dict(result) - ) - # Ensure usage is properly included with transformed chat format - if transformed_usage is not None: - response_dict["usage"] = ( - transformed_usage.model_dump() - if hasattr(transformed_usage, "model_dump") - else dict(transformed_usage) - ) - standard_logging_payload["response"] = response_dict - elif isinstance(result, TranscriptionResponse): - from litellm.litellm_core_utils.llm_cost_calc.usage_object_transformation import ( - TranscriptionUsageObjectTransformation, - ) - - result = result.model_copy() - transformed_usage = TranscriptionUsageObjectTransformation.transform_transcription_usage_object(result.usage) # type: ignore - setattr(result, "usage", transformed_usage) - return result - - def _success_handler_helper_fn( - self, - result=None, - start_time=None, - end_time=None, - cache_hit=None, - standard_logging_object: Optional[StandardLoggingPayload] = None, - ): - try: - if start_time is None: - start_time = self.start_time - if end_time is None: - end_time = datetime.datetime.now() - if self.completion_start_time is None: - self.completion_start_time = end_time - self.model_call_details[ - "completion_start_time" - ] = self.completion_start_time - - self.model_call_details["log_event_type"] = "successful_api_call" - self.model_call_details["end_time"] = end_time - self.model_call_details["cache_hit"] = cache_hit - - if self.call_type == CallTypes.anthropic_messages.value: - result = self._handle_anthropic_messages_response_logging(result=result) - elif ( - self.call_type == CallTypes.generate_content.value - or self.call_type == CallTypes.agenerate_content.value - ): - result = self._handle_non_streaming_google_genai_generate_content_response_logging( - result=result - ) - elif ( - self.call_type == CallTypes.asend_message.value - or self.call_type == CallTypes.send_message.value - ): - result = self._handle_a2a_response_logging(result=result) - - logging_result = self.normalize_logging_result(result=result) - - if ( - standard_logging_object is None - and result is not None - and self.stream is not True - ): - if self._is_recognized_call_type_for_logging( - logging_result=logging_result - ): - self._process_hidden_params_and_response_cost( - logging_result=logging_result, - start_time=start_time, - end_time=end_time, - ) - elif isinstance(result, dict) or isinstance(result, list): - self.model_call_details[ - "standard_logging_object" - ] = get_standard_logging_object_payload( - kwargs=self.model_call_details, - init_response_obj=result, - start_time=start_time, - end_time=end_time, - logging_obj=self, - status="success", - standard_built_in_tools_params=self.standard_built_in_tools_params, - ) - elif standard_logging_object is not None: - self.model_call_details[ - "standard_logging_object" - ] = standard_logging_object - else: - self.model_call_details["response_cost"] = None - - result = self._transform_usage_objects(result=result) - - if ( - litellm.max_budget - and self.stream is False - and result is not None - and isinstance(result, dict) - and "content" in result - ): - time_diff = (end_time - start_time).total_seconds() - float_diff = float(time_diff) - litellm._current_cost += litellm.completion_cost( - model=self.model, - prompt="", - completion=getattr(result, "content", ""), - total_time=float_diff, - standard_built_in_tools_params=self.standard_built_in_tools_params, - ) - - return start_time, end_time, result - except Exception as e: - raise Exception(f"[Non-Blocking] LiteLLM.Success_Call Error: {str(e)}") - - def _is_recognized_call_type_for_logging( - self, - logging_result: Any, - ): - """ - Returns True if the call type is recognized for logging (eg. ModelResponse, ModelResponseStream, etc.) - """ - if ( - isinstance(logging_result, ModelResponse) - or isinstance(logging_result, ModelResponseStream) - or isinstance(logging_result, EmbeddingResponse) - or isinstance(logging_result, ImageResponse) - or isinstance(logging_result, TranscriptionResponse) - or isinstance(logging_result, TextCompletionResponse) - or isinstance(logging_result, HttpxBinaryResponseContent) # tts - or isinstance(logging_result, RerankResponse) - or isinstance(logging_result, FineTuningJob) - or isinstance(logging_result, LiteLLMBatch) - or isinstance(logging_result, ResponsesAPIResponse) - or isinstance(logging_result, OpenAIFileObject) - or isinstance(logging_result, LiteLLMRealtimeStreamLoggingObject) - or isinstance(logging_result, OpenAIModerationResponse) - or isinstance(logging_result, OCRResponse) # OCR - or isinstance(logging_result, SearchResponse) # Search API - or isinstance(logging_result, dict) - and logging_result.get("object") == "vector_store.search_results.page" - or isinstance(logging_result, dict) - and logging_result.get("object") == "search" # Search API (dict format) - or isinstance(logging_result, VideoObject) - or isinstance(logging_result, ContainerObject) - or isinstance(logging_result, LiteLLMSendMessageResponse) # A2A - or (self.call_type == CallTypes.call_mcp_tool.value) - ): - return True - return False - - def _flush_passthrough_collected_chunks_helper( - self, - raw_bytes: List[bytes], - provider_config: "BasePassthroughConfig", - ) -> Optional["CostResponseTypes"]: - all_chunks = provider_config._convert_raw_bytes_to_str_lines(raw_bytes) - complete_streaming_response = provider_config.handle_logging_collected_chunks( - all_chunks=all_chunks, - litellm_logging_obj=self, - model=self.model, - custom_llm_provider=self.model_call_details.get("custom_llm_provider", ""), - endpoint=self.model_call_details.get("endpoint", ""), - ) - return complete_streaming_response - - def flush_passthrough_collected_chunks( - self, - raw_bytes: List[bytes], - provider_config: "BasePassthroughConfig", - ): - """ - Flush collected chunks from the logging object - This is used to log the collected chunks once streaming is done on passthrough endpoints - - 1. Decode the raw bytes to string lines - 2. Get the complete streaming response from the provider config - 3. Log the complete streaming response (trigger success handler) - This is used for passthrough endpoints - """ - complete_streaming_response = self._flush_passthrough_collected_chunks_helper( - raw_bytes=raw_bytes, - provider_config=provider_config, - ) - - if complete_streaming_response is not None: - self.success_handler(result=complete_streaming_response) - return - - async def async_flush_passthrough_collected_chunks( - self, - raw_bytes: List[bytes], - provider_config: "BasePassthroughConfig", - ): - complete_streaming_response = self._flush_passthrough_collected_chunks_helper( - raw_bytes=raw_bytes, - provider_config=provider_config, - ) - - if complete_streaming_response is not None: - await self.async_success_handler(result=complete_streaming_response) - return - - def success_handler( # noqa: PLR0915 - self, result=None, start_time=None, end_time=None, cache_hit=None, **kwargs - ): - verbose_logger.debug( - f"Logging Details LiteLLM-Success Call: Cache_hit={cache_hit}" - ) - if not self.should_run_logging( - event_type="sync_success" - ): # prevent double logging - return - start_time, end_time, result = self._success_handler_helper_fn( - start_time=start_time, - end_time=end_time, - result=result, - cache_hit=cache_hit, - standard_logging_object=kwargs.get("standard_logging_object", None), - ) - litellm_params = self.model_call_details.get("litellm_params", {}) - is_sync_request = ( - litellm_params.get(CallTypes.acompletion.value, False) is not True - and litellm_params.get(CallTypes.aresponses.value, False) is not True - and litellm_params.get(CallTypes.aembedding.value, False) is not True - and litellm_params.get(CallTypes.aimage_generation.value, False) is not True - and litellm_params.get(CallTypes.atranscription.value, False) is not True - ) - try: - ## BUILD COMPLETE STREAMED RESPONSE - complete_streaming_response: Optional[ - Union[ModelResponse, TextCompletionResponse, ResponsesAPIResponse] - ] = None - if "complete_streaming_response" in self.model_call_details: - return # break out of this. - complete_streaming_response = self._get_assembled_streaming_response( - result=result, - start_time=start_time, - end_time=end_time, - is_async=False, - streaming_chunks=self.sync_streaming_chunks, - ) - if complete_streaming_response is not None: - verbose_logger.debug( - "Logging Details LiteLLM-Success Call streaming complete" - ) - self.model_call_details[ - "complete_streaming_response" - ] = complete_streaming_response - self.model_call_details[ - "response_cost" - ] = self._response_cost_calculator(result=complete_streaming_response) - ## STANDARDIZED LOGGING PAYLOAD - self.model_call_details[ - "standard_logging_object" - ] = get_standard_logging_object_payload( - kwargs=self.model_call_details, - init_response_obj=complete_streaming_response, - start_time=start_time, - end_time=end_time, - logging_obj=self, - status="success", - standard_built_in_tools_params=self.standard_built_in_tools_params, - ) - if ( - standard_logging_payload := self.model_call_details.get( - "standard_logging_object" - ) - ) is not None: - # Only emit for sync requests (async_success_handler handles async) - if is_sync_request: - emit_standard_logging_payload(standard_logging_payload) - callbacks = self.get_combined_callback_list( - dynamic_success_callbacks=self.dynamic_success_callbacks, - global_callbacks=litellm.success_callback, - ) - - ## REDACT MESSAGES ## - result = redact_message_input_output_from_logging( - model_call_details=( - self.model_call_details - if hasattr(self, "model_call_details") - else {} - ), - result=result, - ) - ## LOGGING HOOK ## - for callback in callbacks: - if isinstance(callback, CustomLogger): - self.model_call_details, result = callback.logging_hook( - kwargs=self.model_call_details, - result=result, - call_type=self.call_type, - ) - - self.has_run_logging(event_type="sync_success") - for callback in callbacks: - try: - should_run = self.should_run_callback( - callback=callback, - litellm_params=litellm_params, - event_hook="success_handler", - ) - if not should_run: - continue - if callback == "promptlayer" and promptLayerLogger is not None: - print_verbose("reaches promptlayer for logging!") - promptLayerLogger.log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - if callback == "supabase" and supabaseClient is not None: - print_verbose("reaches supabase for logging!") - kwargs = self.model_call_details - - # this only logs streaming once, complete_streaming_response exists i.e when stream ends - if self.stream: - if "complete_streaming_response" not in kwargs: - continue - else: - print_verbose("reaches supabase for streaming logging!") - result = kwargs["complete_streaming_response"] - - model = kwargs["model"] - messages = kwargs["messages"] - optional_params = kwargs.get("optional_params", {}) - litellm_params = kwargs.get("litellm_params", {}) - supabaseClient.log_event( - model=model, - messages=messages, - end_user=optional_params.get("user", "default"), - response_obj=result, - start_time=start_time, - end_time=end_time, - litellm_call_id=( - current_call_id - if ( - current_call_id := litellm_params.get( - "litellm_call_id" - ) - ) - is not None - else str(uuid.uuid4()) - ), - print_verbose=print_verbose, - ) - if callback == "wandb" and weightsBiasesLogger is not None: - print_verbose("reaches wandb for logging!") - weightsBiasesLogger.log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - if callback == "logfire" and logfireLogger is not None: - verbose_logger.debug("reaches logfire for success logging!") - kwargs = {} - for k, v in self.model_call_details.items(): - if ( - k != "original_response" - ): # copy.deepcopy raises errors as this could be a coroutine - kwargs[k] = v - - # this only logs streaming once, complete_streaming_response exists i.e when stream ends - if self.stream: - if "complete_streaming_response" not in kwargs: - continue - else: - print_verbose("reaches logfire for streaming logging!") - result = kwargs["complete_streaming_response"] - - logfireLogger.log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - level=LogfireLevel.INFO.value, # type: ignore - ) - - if callback == "lunary" and lunaryLogger is not None: - print_verbose("reaches lunary for logging!") - model = self.model - kwargs = self.model_call_details - - input = kwargs.get("messages", kwargs.get("input", None)) - - type = ( - "embed" - if self.call_type == CallTypes.embedding.value - else "llm" - ) - - # this only logs streaming once, complete_streaming_response exists i.e when stream ends - if self.stream: - if "complete_streaming_response" not in kwargs: - continue - else: - result = kwargs["complete_streaming_response"] - - lunaryLogger.log_event( - type=type, - kwargs=kwargs, - event="end", - model=model, - input=input, - user_id=kwargs.get("user", None), - # user_props=self.model_call_details.get("user_props", None), - extra=kwargs.get("optional_params", {}), - response_obj=result, - start_time=start_time, - end_time=end_time, - run_id=self.litellm_call_id, - print_verbose=print_verbose, - ) - if callback == "helicone" and heliconeLogger is not None: - print_verbose("reaches helicone for logging!") - model = self.model - messages = self.model_call_details["input"] - kwargs = self.model_call_details - - # this only logs streaming once, complete_streaming_response exists i.e when stream ends - if self.stream: - if "complete_streaming_response" not in kwargs: - continue - else: - print_verbose("reaches helicone for streaming logging!") - result = kwargs["complete_streaming_response"] - - heliconeLogger.log_success( - model=model, - messages=messages, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - kwargs=kwargs, - ) - if callback == "langfuse": - global langFuseLogger - print_verbose("reaches langfuse for success logging!") - kwargs = {} - for k, v in self.model_call_details.items(): - if ( - k != "original_response" - ): # copy.deepcopy raises errors as this could be a coroutine - kwargs[k] = v - # this only logs streaming once, complete_streaming_response exists i.e when stream ends - if self.stream: - verbose_logger.debug( - f"is complete_streaming_response in kwargs: {kwargs.get('complete_streaming_response', None)}" - ) - if complete_streaming_response is None: - continue - else: - print_verbose("reaches langfuse for streaming logging!") - result = kwargs["complete_streaming_response"] - - langfuse_logger_to_use = LangFuseHandler.get_langfuse_logger_for_request( - globalLangfuseLogger=langFuseLogger, - standard_callback_dynamic_params=self.standard_callback_dynamic_params, - in_memory_dynamic_logger_cache=in_memory_dynamic_logger_cache, - ) - if langfuse_logger_to_use is not None: - _response = langfuse_logger_to_use.log_event_on_langfuse( - kwargs=kwargs, - response_obj=result, - start_time=start_time, - end_time=end_time, - user_id=kwargs.get("user", None), - ) - if _response is not None and isinstance(_response, dict): - _trace_id = _response.get("trace_id", None) - if _trace_id is not None: - in_memory_trace_id_cache.set_cache( - litellm_call_id=self.litellm_call_id, - service_name="langfuse", - trace_id=_trace_id, - ) - if callback == "greenscale" and greenscaleLogger is not None: - kwargs = {} - for k, v in self.model_call_details.items(): - if ( - k != "original_response" - ): # copy.deepcopy raises errors as this could be a coroutine - kwargs[k] = v - # this only logs streaming once, complete_streaming_response exists i.e when stream ends - if self.stream: - verbose_logger.debug( - f"is complete_streaming_response in kwargs: {kwargs.get('complete_streaming_response', None)}" - ) - if complete_streaming_response is None: - continue - else: - print_verbose( - "reaches greenscale for streaming logging!" - ) - result = kwargs["complete_streaming_response"] - - greenscaleLogger.log_event( - kwargs=kwargs, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - if callback == "athina" and athinaLogger is not None: - deep_copy = {} - for k, v in self.model_call_details.items(): - deep_copy[k] = v - athinaLogger.log_event( - kwargs=deep_copy, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - if callback == "traceloop": - deep_copy = {} - for k, v in self.model_call_details.items(): - if k != "original_response": - deep_copy[k] = v - traceloopLogger.log_event( - kwargs=deep_copy, - response_obj=result, - start_time=start_time, - end_time=end_time, - user_id=kwargs.get("user", None), - print_verbose=print_verbose, - ) - if callback == "s3": - global s3Logger - if s3Logger is None: - s3Logger = S3Logger() - if self.stream: - if "complete_streaming_response" in self.model_call_details: - print_verbose( - "S3Logger Logger: Got Stream Event - Completed Stream Response" - ) - s3Logger.log_event( - kwargs=self.model_call_details, - response_obj=self.model_call_details[ - "complete_streaming_response" - ], - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - else: - print_verbose( - "S3Logger Logger: Got Stream Event - No complete stream response as yet" - ) - else: - s3Logger.log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - - if callback == "openmeter" and is_sync_request: - global openMeterLogger - if openMeterLogger is None: - print_verbose("Instantiates openmeter client") - openMeterLogger = OpenMeterLogger() - if self.stream and complete_streaming_response is None: - openMeterLogger.log_stream_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - else: - if self.stream and complete_streaming_response: - self.model_call_details[ - "complete_response" - ] = self.model_call_details.get( - "complete_streaming_response", {} - ) - result = self.model_call_details["complete_response"] - openMeterLogger.log_success_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - if ( - isinstance(callback, CustomLogger) - and is_sync_request - and self.call_type - != CallTypes.pass_through.value # pass-through endpoints call async_log_success_event - ): # custom logger class - if self.stream and complete_streaming_response is None: - callback.log_stream_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - else: - if self.stream and complete_streaming_response: - self.model_call_details[ - "complete_response" - ] = self.model_call_details.get( - "complete_streaming_response", {} - ) - result = self.model_call_details["complete_response"] - - callback.log_success_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - if ( - callable(callback) is True - and is_sync_request - and customLogger is not None - ): # custom logger functions - print_verbose( - "success callbacks: Running Custom Callback Function - {}".format( - callback - ) - ) - - customLogger.log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - callback_func=callback, - ) - - except Exception as e: - print_verbose( - f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while success logging with integrations {traceback.format_exc()}" - ) - print_verbose( - f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" - ) - if capture_exception: # log this error to sentry for debugging - capture_exception(e) - # Track callback logging failures in Prometheus - try: - self._handle_callback_failure(callback=callback) - except Exception: - pass - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while success logging {}".format( - str(e) - ), - ) - - async def async_success_handler( # noqa: PLR0915 - self, result=None, start_time=None, end_time=None, cache_hit=None, **kwargs - ): - """ - Implementing async callbacks, to handle asyncio event loop issues when custom integrations need to use async functions. - """ - print_verbose( - "Logging Details LiteLLM-Async Success Call, cache_hit={}".format(cache_hit) - ) - if not self.should_run_logging( - event_type="async_success" - ): # prevent double logging - return - - ## CALCULATE COST FOR BATCH JOBS - if self.call_type == CallTypes.aretrieve_batch.value and isinstance( - result, LiteLLMBatch - ): - litellm_params = self.litellm_params or {} - litellm_metadata = litellm_params.get("litellm_metadata") or {} - if ( - litellm_metadata.get("batch_ignore_default_logging", False) is True - ): # polling job will query these frequently, don't spam db logs - return - - from litellm.proxy.openai_files_endpoints.common_utils import ( - _is_base64_encoded_unified_file_id, - ) - - # check if file id is a unified file id - is_base64_unified_file_id = _is_base64_encoded_unified_file_id(result.id) - - batch_cost = kwargs.get("batch_cost", None) - batch_usage = kwargs.get("batch_usage", None) - batch_models = kwargs.get("batch_models", None) - has_explicit_batch_data = all( - x is not None for x in (batch_cost, batch_usage, batch_models) - ) - - should_compute_batch_data = ( - not is_base64_unified_file_id - or not has_explicit_batch_data - and result.status == "completed" - ) - if has_explicit_batch_data: - result._hidden_params["response_cost"] = batch_cost - result._hidden_params["batch_models"] = batch_models - result.usage = batch_usage - - elif should_compute_batch_data: - ( - response_cost, - batch_usage, - batch_models, - ) = await _handle_completed_batch( - batch=result, - custom_llm_provider=self.custom_llm_provider, - litellm_params=self.litellm_params, - ) - - result._hidden_params["response_cost"] = response_cost - result._hidden_params["batch_models"] = batch_models - result.usage = batch_usage - - start_time, end_time, result = self._success_handler_helper_fn( - start_time=start_time, - end_time=end_time, - result=result, - cache_hit=cache_hit, - standard_logging_object=kwargs.get("standard_logging_object", None), - ) - - ## BUILD COMPLETE STREAMED RESPONSE - if "async_complete_streaming_response" in self.model_call_details: - return # break out of this. - complete_streaming_response: Optional[ - Union[ModelResponse, TextCompletionResponse, ResponsesAPIResponse] - ] = self._get_assembled_streaming_response( - result=result, - start_time=start_time, - end_time=end_time, - is_async=True, - streaming_chunks=self.streaming_chunks, - ) - - if complete_streaming_response is not None: - print_verbose("Async success callbacks: Got a complete streaming response") - - self.model_call_details[ - "async_complete_streaming_response" - ] = complete_streaming_response - - try: - if self.model_call_details.get("cache_hit", False) is True: - self.model_call_details["response_cost"] = 0.0 - else: - # check if base_model set on azure - _get_base_model_from_metadata( - model_call_details=self.model_call_details - ) - # base_model defaults to None if not set on model_info - self.model_call_details[ - "response_cost" - ] = self._response_cost_calculator( - result=complete_streaming_response - ) - - verbose_logger.debug( - f"Model={self.model}; cost={self.model_call_details['response_cost']}" - ) - except litellm.NotFoundError: - verbose_logger.warning( - f"Model={self.model} not found in completion cost map. Setting 'response_cost' to None" - ) - self.model_call_details["response_cost"] = None - - ## STANDARDIZED LOGGING PAYLOAD - self.model_call_details[ - "standard_logging_object" - ] = get_standard_logging_object_payload( - kwargs=self.model_call_details, - init_response_obj=complete_streaming_response, - start_time=start_time, - end_time=end_time, - logging_obj=self, - status="success", - standard_built_in_tools_params=self.standard_built_in_tools_params, - ) - - # print standard logging payload - if ( - standard_logging_payload := self.model_call_details.get( - "standard_logging_object" - ) - ) is not None: - emit_standard_logging_payload(standard_logging_payload) - elif self.call_type == "pass_through_endpoint": - print_verbose( - "Async success callbacks: Got a pass-through endpoint response" - ) - - self.model_call_details["async_complete_streaming_response"] = result - - # cost calculation not possible for pass-through - self.model_call_details["response_cost"] = None - - ## STANDARDIZED LOGGING PAYLOAD - self.model_call_details[ - "standard_logging_object" - ] = get_standard_logging_object_payload( - kwargs=self.model_call_details, - init_response_obj=result, - start_time=start_time, - end_time=end_time, - logging_obj=self, - status="success", - standard_built_in_tools_params=self.standard_built_in_tools_params, - ) - - # print standard logging payload - if ( - standard_logging_payload := self.model_call_details.get( - "standard_logging_object" - ) - ) is not None: - emit_standard_logging_payload(standard_logging_payload) - callbacks = self.get_combined_callback_list( - dynamic_success_callbacks=self.dynamic_async_success_callbacks, - global_callbacks=litellm._async_success_callback, - ) - - result = redact_message_input_output_from_logging( - model_call_details=( - self.model_call_details if hasattr(self, "model_call_details") else {} - ), - result=result, - ) - - ## LOGGING HOOK ## - - for callback in callbacks: - if isinstance(callback, CustomGuardrail): - from litellm.types.guardrails import GuardrailEventHooks - - if ( - callback.should_run_guardrail( - data=self.model_call_details, - event_type=GuardrailEventHooks.logging_only, - ) - is not True - ): - continue - - self.model_call_details, result = await callback.async_logging_hook( - kwargs=self.model_call_details, - result=result, - call_type=self.call_type, - ) - elif isinstance(callback, CustomLogger): - result = redact_message_input_output_from_custom_logger( - result=result, litellm_logging_obj=self, custom_logger=callback - ) - self.model_call_details, result = await callback.async_logging_hook( - kwargs=self.model_call_details, - result=result, - call_type=self.call_type, - ) - - self.has_run_logging(event_type="async_success") - - for callback in callbacks: - # check if callback can run for this request - litellm_params = self.model_call_details.get("litellm_params", {}) - should_run = self.should_run_callback( - callback=callback, - litellm_params=litellm_params, - event_hook="async_success_handler", - ) - if not should_run: - continue - try: - if callback == "openmeter" and openMeterLogger is not None: - if self.stream is True: - if ( - "async_complete_streaming_response" - in self.model_call_details - ): - await openMeterLogger.async_log_success_event( - kwargs=self.model_call_details, - response_obj=self.model_call_details[ - "async_complete_streaming_response" - ], - start_time=start_time, - end_time=end_time, - ) - else: - await openMeterLogger.async_log_stream_event( # [TODO]: move this to being an async log stream event function - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - else: - await openMeterLogger.async_log_success_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - - if isinstance(callback, CustomLogger): # custom logger class - model_call_details: Dict = self.model_call_details - ################################## - # call redaction hook for custom logger - model_call_details = callback.redact_standard_logging_payload_from_model_call_details( - model_call_details=model_call_details - ) - ################################## - if self.stream is True: - if "async_complete_streaming_response" in model_call_details: - await callback.async_log_success_event( - kwargs=model_call_details, - response_obj=model_call_details[ - "async_complete_streaming_response" - ], - start_time=start_time, - end_time=end_time, - ) - else: - await callback.async_log_stream_event( # [TODO]: move this to being an async log stream event function - kwargs=model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - else: - await callback.async_log_success_event( - kwargs=model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) - if callable(callback): # custom logger functions - global customLogger - if customLogger is None: - customLogger = CustomLogger() - if self.stream: - if ( - "async_complete_streaming_response" - in self.model_call_details - ): - await customLogger.async_log_event( - kwargs=self.model_call_details, - response_obj=self.model_call_details[ - "async_complete_streaming_response" - ], - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - callback_func=callback, - ) - else: - await customLogger.async_log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - callback_func=callback, - ) - if callback == "dynamodb": - global dynamoLogger - if dynamoLogger is None: - dynamoLogger = DyanmoDBLogger() - if self.stream: - if ( - "async_complete_streaming_response" - in self.model_call_details - ): - print_verbose( - "DynamoDB Logger: Got Stream Event - Completed Stream Response" - ) - await dynamoLogger._async_log_event( - kwargs=self.model_call_details, - response_obj=self.model_call_details[ - "async_complete_streaming_response" - ], - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - else: - print_verbose( - "DynamoDB Logger: Got Stream Event - No complete stream response as yet" - ) - else: - await dynamoLogger._async_log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - except Exception: - verbose_logger.error( - f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while success logging {traceback.format_exc()}" - ) - self._handle_callback_failure(callback=callback) - pass - - def _handle_callback_failure(self, callback: Any): - """ - Handle callback logging failures by incrementing Prometheus metrics. - - Works for both sync and async contexts since Prometheus counter increment is synchronous. - - Args: - callback: The callback that failed - """ - try: - callback_name = self._get_callback_name(callback) - - all_callbacks = litellm.logging_callback_manager._get_all_callbacks() - - for callback_obj in all_callbacks: - if hasattr(callback_obj, "increment_callback_logging_failure"): - callback_obj.increment_callback_logging_failure(callback_name=callback_name) # type: ignore - break # Only increment once - - except Exception as e: - verbose_logger.debug(f"Error in _handle_callback_failure: {str(e)}") - - def _failure_handler_helper_fn( - self, exception, traceback_exception, start_time=None, end_time=None - ): - if start_time is None: - start_time = self.start_time - if end_time is None: - end_time = datetime.datetime.now() - - # on some exceptions, model_call_details is not always initialized, this ensures that we still log those exceptions - if not hasattr(self, "model_call_details"): - self.model_call_details = {} - - self.model_call_details["log_event_type"] = "failed_api_call" - self.model_call_details["exception"] = exception - self.model_call_details["traceback_exception"] = traceback_exception - self.model_call_details["end_time"] = end_time - self.model_call_details.setdefault("original_response", None) - self.model_call_details["response_cost"] = 0 - - if hasattr(exception, "headers") and isinstance(exception.headers, dict): - self.model_call_details.setdefault("litellm_params", {}) - metadata = ( - self.model_call_details["litellm_params"].get("metadata", {}) or {} - ) - metadata.update(exception.headers) - - ## STANDARDIZED LOGGING PAYLOAD - - self.model_call_details[ - "standard_logging_object" - ] = get_standard_logging_object_payload( - kwargs=self.model_call_details, - init_response_obj={}, - start_time=start_time, - end_time=end_time, - logging_obj=self, - status="failure", - error_str=str(exception), - original_exception=exception, - standard_built_in_tools_params=self.standard_built_in_tools_params, - ) - return start_time, end_time - - async def special_failure_handlers(self, exception: Exception): - """ - Custom events, emitted for specific failures. - - Currently just for router model group rate limit error - """ - from litellm.types.router import RouterErrors - - litellm_params: dict = self.model_call_details.get("litellm_params") or {} - metadata = litellm_params.get("metadata") or {} - - ## BASE CASE ## check if rate limit error for model group size 1 - is_base_case = False - if metadata.get("model_group_size") is not None: - model_group_size = metadata.get("model_group_size") - if isinstance(model_group_size, int) and model_group_size == 1: - is_base_case = True - ## check if special error ## - if ( - RouterErrors.no_deployments_available.value not in str(exception) - and is_base_case is False - ): - return - - ## get original model group ## - - model_group = metadata.get("model_group") or None - for callback in litellm._async_failure_callback: - if isinstance(callback, CustomLogger): # custom logger class - await callback.log_model_group_rate_limit_error( - exception=exception, - original_model_group=model_group, - kwargs=self.model_call_details, - ) # type: ignore - - def failure_handler( # noqa: PLR0915 - self, exception, traceback_exception, start_time=None, end_time=None - ): - verbose_logger.debug( - f"Logging Details LiteLLM-Failure Call: {litellm.failure_callback}" - ) - if not self.should_run_logging( - event_type="sync_failure" - ): # prevent double logging - return - litellm_params = self.model_call_details.get("litellm_params", {}) - is_sync_request = ( - litellm_params.get(CallTypes.acompletion.value, False) is not True - and litellm_params.get(CallTypes.aresponses.value, False) is not True - and litellm_params.get(CallTypes.aembedding.value, False) is not True - and litellm_params.get(CallTypes.aimage_generation.value, False) is not True - and litellm_params.get(CallTypes.atranscription.value, False) is not True - ) - - try: - start_time, end_time = self._failure_handler_helper_fn( - exception=exception, - traceback_exception=traceback_exception, - start_time=start_time, - end_time=end_time, - ) - callbacks = self.get_combined_callback_list( - dynamic_success_callbacks=self.dynamic_failure_callbacks, - global_callbacks=litellm.failure_callback, - ) - - result = None # result sent to all loggers, init this to None incase it's not created - - result = redact_message_input_output_from_logging( - model_call_details=( - self.model_call_details - if hasattr(self, "model_call_details") - else {} - ), - result=result, - ) - self.has_run_logging(event_type="sync_failure") - for callback in callbacks: - try: - should_run = self.should_run_callback( - callback=callback, - litellm_params=litellm_params, - event_hook="failure_handler", - ) - if not should_run: - continue - if callback == "lunary" and lunaryLogger is not None: - print_verbose("reaches lunary for logging error!") - - model = self.model - - input = self.model_call_details["input"] - - _type = ( - "embed" - if self.call_type == CallTypes.embedding.value - else "llm" - ) - - lunaryLogger.log_event( - kwargs=self.model_call_details, - type=_type, - event="error", - user_id=self.model_call_details.get("user", "default"), - model=model, - input=input, - error=traceback_exception, - run_id=self.litellm_call_id, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - if callback == "sentry": - print_verbose("sending exception to sentry") - if capture_exception: - capture_exception(exception) - else: - print_verbose( - f"capture exception not initialized: {capture_exception}" - ) - elif callback == "supabase" and supabaseClient is not None: - print_verbose("reaches supabase for logging!") - print_verbose(f"supabaseClient: {supabaseClient}") - supabaseClient.log_event( - model=self.model if hasattr(self, "model") else "", - messages=self.messages, - end_user=self.model_call_details.get("user", "default"), - response_obj=result, - start_time=start_time, - end_time=end_time, - litellm_call_id=self.model_call_details["litellm_call_id"], - print_verbose=print_verbose, - ) - if ( - callable(callback) and customLogger is not None - ): # custom logger functions - customLogger.log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - callback_func=callback, - ) - if ( - isinstance(callback, CustomLogger) and is_sync_request - ): # custom logger class - callback.log_failure_event( - start_time=start_time, - end_time=end_time, - response_obj=result, - kwargs=self.model_call_details, - ) - if callback == "langfuse": - global langFuseLogger - verbose_logger.debug("reaches langfuse for logging failure") - kwargs = {} - for k, v in self.model_call_details.items(): - if ( - k != "original_response" - ): # copy.deepcopy raises errors as this could be a coroutine - kwargs[k] = v - # this only logs streaming once, complete_streaming_response exists i.e when stream ends - langfuse_logger_to_use = LangFuseHandler.get_langfuse_logger_for_request( - globalLangfuseLogger=langFuseLogger, - standard_callback_dynamic_params=self.standard_callback_dynamic_params, - in_memory_dynamic_logger_cache=in_memory_dynamic_logger_cache, - ) - _response = langfuse_logger_to_use.log_event_on_langfuse( - start_time=start_time, - end_time=end_time, - response_obj=None, - user_id=kwargs.get("user", None), - status_message=str(exception), - level="ERROR", - kwargs=self.model_call_details, - ) - if _response is not None and isinstance(_response, dict): - _trace_id = _response.get("trace_id", None) - if _trace_id is not None: - in_memory_trace_id_cache.set_cache( - litellm_call_id=self.litellm_call_id, - service_name="langfuse", - trace_id=_trace_id, - ) - if callback == "traceloop": - traceloopLogger.log_event( - start_time=start_time, - end_time=end_time, - response_obj=None, - user_id=self.model_call_details.get("user", None), - print_verbose=print_verbose, - status_message=str(exception), - level="ERROR", - kwargs=self.model_call_details, - ) - if callback == "logfire" and logfireLogger is not None: - verbose_logger.debug("reaches logfire for failure logging!") - kwargs = {} - for k, v in self.model_call_details.items(): - if ( - k != "original_response" - ): # copy.deepcopy raises errors as this could be a coroutine - kwargs[k] = v - kwargs["exception"] = exception - - logfireLogger.log_event( - kwargs=kwargs, - response_obj=result, - start_time=start_time, - end_time=end_time, - level=LogfireLevel.ERROR.value, # type: ignore - print_verbose=print_verbose, - ) - - except Exception as e: - print_verbose( - f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while failure logging with integrations {str(e)}" - ) - print_verbose( - f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" - ) - if capture_exception: # log this error to sentry for debugging - capture_exception(e) - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while failure logging {}".format( - str(e) - ) - ) - - async def async_failure_handler( - self, exception, traceback_exception, start_time=None, end_time=None - ): - """ - Implementing async callbacks, to handle asyncio event loop issues when custom integrations need to use async functions. - """ - await self.special_failure_handlers(exception=exception) - if not self.should_run_logging( - event_type="async_failure" - ): # prevent double logging - return - start_time, end_time = self._failure_handler_helper_fn( - exception=exception, - traceback_exception=traceback_exception, - start_time=start_time, - end_time=end_time, - ) - - callbacks = self.get_combined_callback_list( - dynamic_success_callbacks=self.dynamic_async_failure_callbacks, - global_callbacks=litellm._async_failure_callback, - ) - - result = None # result sent to all loggers, init this to None incase it's not created - - self.has_run_logging(event_type="async_failure") - for callback in callbacks: - try: - litellm_params = self.model_call_details.get("litellm_params", {}) - should_run = self.should_run_callback( - callback=callback, - litellm_params=litellm_params, - event_hook="async_failure_handler", - ) - if not should_run: - continue - if isinstance(callback, CustomLogger): # custom logger class - await callback.async_log_failure_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - ) # type: ignore - if ( - callable(callback) and customLogger is not None - ): # custom logger functions - await customLogger.async_log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - callback_func=callback, - ) - except Exception as e: - verbose_logger.exception( - "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while failure \ - logging {}\nCallback={}".format( - str(e), callback - ) - ) - # Track callback logging failures in Prometheus - self._handle_callback_failure(callback=callback) - - def _get_trace_id(self, service_name: Literal["langfuse"]) -> Optional[str]: - """ - For the given service (e.g. langfuse), return the trace_id actually logged. - - Used for constructing the url in slack alerting. - - Returns: - - str: The logged trace id - - None: If trace id not yet emitted. - """ - trace_id: Optional[str] = None - if service_name == "langfuse": - trace_id = in_memory_trace_id_cache.get_cache( - litellm_call_id=self.litellm_call_id, service_name=service_name - ) - - return trace_id - - def _get_callback_object(self, service_name: Literal["langfuse"]) -> Optional[Any]: - """ - Return dynamic callback object. - - Meant to solve issue when doing key-based/team-based logging - """ - global langFuseLogger - - if service_name == "langfuse": - if langFuseLogger is None or ( - ( - self.standard_callback_dynamic_params.get("langfuse_public_key") - is not None - and self.standard_callback_dynamic_params.get("langfuse_public_key") - != langFuseLogger.public_key - ) - or ( - self.standard_callback_dynamic_params.get("langfuse_public_key") - is not None - and self.standard_callback_dynamic_params.get("langfuse_public_key") - != langFuseLogger.public_key - ) - or ( - self.standard_callback_dynamic_params.get("langfuse_host") - is not None - and self.standard_callback_dynamic_params.get("langfuse_host") - != langFuseLogger.langfuse_host - ) - ): - return LangFuseLogger( - langfuse_public_key=self.standard_callback_dynamic_params.get( - "langfuse_public_key" - ), - langfuse_secret=self.standard_callback_dynamic_params.get( - "langfuse_secret" - ), - langfuse_host=self.standard_callback_dynamic_params.get( - "langfuse_host" - ), - ) - return langFuseLogger - - return None - - def handle_sync_success_callbacks_for_async_calls( - self, - result: Any, - start_time: datetime.datetime, - end_time: datetime.datetime, - cache_hit: Optional[Any] = None, - ) -> None: - """ - Handles calling success callbacks for Async calls. - - Why: Some callbacks - `langfuse`, `s3` are sync callbacks. We need to call them in the executor. - """ - if self._should_run_sync_callbacks_for_async_calls() is False: - return - - executor.submit( - self.success_handler, - result, - start_time, - end_time, - cache_hit, - ) - - def _should_run_sync_callbacks_for_async_calls(self) -> bool: - """ - Returns: - - bool: True if sync callbacks should be run for async calls. eg. `langfuse`, `s3` - """ - _combined_sync_callbacks = self.get_combined_callback_list( - dynamic_success_callbacks=self.dynamic_success_callbacks, - global_callbacks=litellm.success_callback, - ) - _filtered_success_callbacks = self._remove_internal_custom_logger_callbacks( - _combined_sync_callbacks - ) - _filtered_success_callbacks = self._remove_internal_litellm_callbacks( - _filtered_success_callbacks - ) - return len(_filtered_success_callbacks) > 0 - - def get_combined_callback_list( - self, dynamic_success_callbacks: Optional[List], global_callbacks: List - ) -> List: - if dynamic_success_callbacks is None: - return list(global_callbacks) - return list(set(dynamic_success_callbacks + global_callbacks)) - - def _remove_internal_litellm_callbacks(self, callbacks: List) -> List: - """ - Creates a filtered list of callbacks, excluding internal LiteLLM callbacks. - - Args: - callbacks: List of callback functions/strings to filter - - Returns: - List of filtered callbacks with internal ones removed - """ - filtered = [ - cb for cb in callbacks if not self._is_internal_litellm_proxy_callback(cb) - ] - - verbose_logger.debug(f"Filtered callbacks: {filtered}") - return filtered - - def _get_callback_name(self, cb) -> str: - """ - Helper to get the name of a callback function - - Args: - cb: The callback object/function/string to get the name of - - Returns: - The name of the callback - """ - if isinstance(cb, str): - return cb - if hasattr(cb, "__name__"): - return cb.__name__ - if hasattr(cb, "__func__"): - return cb.__func__.__name__ - if hasattr(cb, "__class__"): - return cb.__class__.__name__ - return str(cb) - - def _is_internal_litellm_proxy_callback(self, cb) -> bool: - """Helper to check if a callback is internal""" - INTERNAL_PREFIXES = [ - "_PROXY", - "_service_logger.ServiceLogging", - "sync_deployment_callback_on_success", - ] - if isinstance(cb, str): - return False - - if not callable(cb): - return True - - cb_name = self._get_callback_name(cb) - return any(prefix in cb_name for prefix in INTERNAL_PREFIXES) - - def _remove_internal_custom_logger_callbacks(self, callbacks: List) -> List: - """ - Removes internal custom logger callbacks from the list. - """ - _new_callbacks = [] - for _c in callbacks: - if isinstance(_c, CustomLogger): - continue - elif ( - isinstance(_c, str) - and _c in litellm._known_custom_logger_compatible_callbacks - ): - continue - _new_callbacks.append(_c) - return _new_callbacks - - def _get_assembled_streaming_response( - self, - result: Union[ - ModelResponse, - TextCompletionResponse, - ModelResponseStream, - ResponseCompletedEvent, - Any, - ], - start_time: datetime.datetime, - end_time: datetime.datetime, - is_async: bool, - streaming_chunks: List[Any], - ) -> Optional[Union[ModelResponse, TextCompletionResponse, ResponsesAPIResponse]]: - if isinstance(result, ModelResponse): - return result - elif isinstance(result, TextCompletionResponse): - return result - elif isinstance(result, ResponseCompletedEvent): - ## return unified Usage object - if isinstance(result.response.usage, ResponseAPIUsage): - transformed_usage = ( - ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( - result.response.usage - ) - ) - # Set as dict instead of Usage object so model_dump() serializes it correctly - setattr( - result.response, - "usage", - ( - transformed_usage.model_dump() - if hasattr(transformed_usage, "model_dump") - else dict(transformed_usage) - ), - ) - return result.response - else: - return None - return None - - def _handle_anthropic_messages_response_logging(self, result: Any) -> ModelResponse: - """ - Handles logging for Anthropic messages responses. - - Args: - result: The response object from the model call - - Returns: - The the response object from the model call - - - For Non-streaming responses, we need to transform the response to a ModelResponse object. - - For streaming responses, anthropic_messages handler calls success_handler with a assembled ModelResponse. - """ - import httpx - - if self.stream and isinstance(result, ModelResponse): - return result - elif isinstance(result, ModelResponse): - return result - - httpx_response = self.model_call_details.get("httpx_response", None) - if httpx_response and isinstance(httpx_response, httpx.Response): - result = litellm.AnthropicConfig().transform_response( - raw_response=httpx_response, - model_response=litellm.ModelResponse(), - model=self.model, - messages=[], - logging_obj=self, - optional_params={}, - api_key="", - request_data={}, - encoding=litellm.encoding, - json_mode=False, - litellm_params={}, - ) - else: - from litellm.types.llms.anthropic import AnthropicResponse - - pydantic_result = AnthropicResponse.model_validate(result) - import httpx - - result = litellm.AnthropicConfig().transform_parsed_response( - completion_response=pydantic_result.model_dump(), - raw_response=httpx.Response( - status_code=200, - headers={}, - ), - model_response=litellm.ModelResponse(), - json_mode=None, - ) - return result - - def _handle_non_streaming_google_genai_generate_content_response_logging( - self, result: Any - ) -> ModelResponse: - """ - Handles logging for Google GenAI generate content responses. - """ - import httpx - - httpx_response = self.model_call_details.get("httpx_response", None) - if httpx_response is None: - raise ValueError("Google GenAI Generate Content: httpx_response is None") - dict_result = httpx_response.json() - result = litellm.VertexGeminiConfig()._transform_google_generate_content_to_openai_model_response( - completion_response=dict_result, - model_response=litellm.ModelResponse(), - model=self.model, - logging_obj=self, - raw_response=httpx.Response( - status_code=200, - headers={}, - ), - ) - return result - - def _handle_a2a_response_logging(self, result: Any) -> Any: - """ - Handles logging for A2A (Agent-to-Agent) responses. - - Adds usage from model_call_details to the result if available. - Uses Pydantic's model_copy to avoid modifying the original response. - - Args: - result: The LiteLLMSendMessageResponse from the A2A call - - Returns: - The response object with usage added if available - """ - # Get usage from model_call_details (set by asend_message) - usage = self.model_call_details.get("usage") - if usage is None: - return result - - # Deep copy result and add usage - result_copy = result.model_copy(deep=True) - result_copy.usage = ( - usage.model_dump() if hasattr(usage, "model_dump") else dict(usage) - ) - return result_copy - - -def _get_masked_values( - sensitive_object: dict, - ignore_sensitive_values: bool = False, - mask_all_values: bool = False, - unmasked_length: int = 4, - number_of_asterisks: Optional[int] = 4, -) -> dict: - """ - Internal debugging helper function - - Masks the headers of the request sent from LiteLLM - - Args: - masked_length: Optional length for the masked portion (number of *). If set, will use exactly this many * - regardless of original string length. The total length will be unmasked_length + masked_length. - """ - sensitive_keywords = [ - "authorization", - "token", - "key", - "secret", - "vertex_credentials", - ] - return { - k: ( - # If ignore_sensitive_values is True, or if this key doesn't contain sensitive keywords, return original value - v - if ignore_sensitive_values - or not any( - sensitive_keyword in k.lower() - for sensitive_keyword in sensitive_keywords - ) - else ( - # Apply masking to sensitive keys - ( - v[: unmasked_length // 2] - + "*" * number_of_asterisks - + v[-unmasked_length // 2 :] - ) - if ( - isinstance(v, str) - and len(v) > unmasked_length - and number_of_asterisks is not None - ) - else ( - ( - v[: unmasked_length // 2] - + "*" * (len(v) - unmasked_length) - + v[-unmasked_length // 2 :] - ) - if (isinstance(v, str) and len(v) > unmasked_length) - else ("*****" if isinstance(v, str) else v) - ) - ) - ) - for k, v in sensitive_object.items() - } - - -def set_callbacks(callback_list, function_id=None): # noqa: PLR0915 - """ - Globally sets the callback client - """ - global sentry_sdk_instance, capture_exception, add_breadcrumb, slack_app, alerts_channel, traceloopLogger, athinaLogger, heliconeLogger, supabaseClient, lunaryLogger, promptLayerLogger, langFuseLogger, customLogger, weightsBiasesLogger, logfireLogger, dynamoLogger, s3Logger, dataDogLogger, prometheusLogger, greenscaleLogger, openMeterLogger, deepevalLogger - - try: - for callback in callback_list: - if callback == "sentry": - try: - import sentry_sdk - except ImportError: - print_verbose("Package 'sentry_sdk' is missing. Installing it...") - subprocess.check_call( - [sys.executable, "-m", "pip", "install", "sentry_sdk"] - ) - import sentry_sdk - from sentry_sdk.scrubber import EventScrubber - - sentry_sdk_instance = sentry_sdk - sentry_trace_rate = ( - os.environ.get("SENTRY_API_TRACE_RATE") - if "SENTRY_API_TRACE_RATE" in os.environ - else "1.0" - ) - sentry_sample_rate = ( - os.environ.get("SENTRY_API_SAMPLE_RATE") - if "SENTRY_API_SAMPLE_RATE" in os.environ - else "1.0" - ) - sentry_sdk_instance.init( - dsn=os.environ.get("SENTRY_DSN"), - traces_sample_rate=float(sentry_trace_rate), # type: ignore - sample_rate=float( - sentry_sample_rate if sentry_sample_rate else 1.0 - ), - send_default_pii=False, # Prevent sending Personal Identifiable Information - event_scrubber=EventScrubber( - denylist=SENTRY_DENYLIST, pii_denylist=SENTRY_PII_DENYLIST - ), - environment=os.environ.get("SENTRY_ENVIRONMENT", "production"), - ) - capture_exception = sentry_sdk_instance.capture_exception - add_breadcrumb = sentry_sdk_instance.add_breadcrumb - elif callback == "slack": - try: - from slack_bolt import App - except ImportError: - print_verbose("Package 'slack_bolt' is missing. Installing it...") - subprocess.check_call( - [sys.executable, "-m", "pip", "install", "slack_bolt"] - ) - from slack_bolt import App - slack_app = App( - token=os.environ.get("SLACK_API_TOKEN"), - signing_secret=os.environ.get("SLACK_API_SECRET"), - ) - alerts_channel = os.environ["SLACK_API_CHANNEL"] - print_verbose(f"Initialized Slack App: {slack_app}") - elif callback == "traceloop": - traceloopLogger = TraceloopLogger() - elif callback == "athina": - athinaLogger = AthinaLogger() - print_verbose("Initialized Athina Logger") - elif callback == "helicone": - heliconeLogger = HeliconeLogger() - elif callback == "lunary": - lunaryLogger = LunaryLogger() - elif callback == "promptlayer": - promptLayerLogger = PromptLayerLogger() - elif callback == "langfuse": - langFuseLogger = LangFuseLogger( - langfuse_public_key=None, langfuse_secret=None, langfuse_host=None - ) - elif callback == "openmeter": - openMeterLogger = OpenMeterLogger() - elif callback == "datadog": - dataDogLogger = DataDogLogger() - elif callback == "dynamodb": - dynamoLogger = DyanmoDBLogger() - elif callback == "s3": - s3Logger = S3Logger() - elif callback == "wandb": - from litellm.integrations.weights_biases import WeightsBiasesLogger - - weightsBiasesLogger = WeightsBiasesLogger() - elif callback == "logfire": - logfireLogger = LogfireLogger() - elif callback == "supabase": - print_verbose("instantiating supabase") - supabaseClient = Supabase() - elif callback == "greenscale": - greenscaleLogger = GreenscaleLogger() - print_verbose("Initialized Greenscale Logger") - elif callable(callback): - customLogger = CustomLogger() - except Exception as e: - raise e - return None - - -def _init_custom_logger_compatible_class( # noqa: PLR0915 - logging_integration: _custom_logger_compatible_callbacks_literal, - internal_usage_cache: Optional[DualCache], - llm_router: Optional[ - Any - ], # expect litellm.Router, but typing errors due to circular import - custom_logger_init_args: Optional[dict] = {}, -) -> Optional[CustomLogger]: - """ - Initialize a custom logger compatible class - """ - try: - custom_logger_init_args = custom_logger_init_args or {} - if logging_integration == "agentops": # Add AgentOps initialization - for callback in _in_memory_loggers: - if isinstance(callback, AgentOps): - return callback # type: ignore - - agentops_logger = AgentOps() - _in_memory_loggers.append(agentops_logger) - return agentops_logger # type: ignore - elif logging_integration == "lago": - for callback in _in_memory_loggers: - if isinstance(callback, LagoLogger): - return callback # type: ignore - - lago_logger = LagoLogger() - _in_memory_loggers.append(lago_logger) - return lago_logger # type: ignore - elif logging_integration == "openmeter": - for callback in _in_memory_loggers: - if isinstance(callback, OpenMeterLogger): - return callback # type: ignore - - _openmeter_logger = OpenMeterLogger() - _in_memory_loggers.append(_openmeter_logger) - return _openmeter_logger # type: ignore - elif logging_integration == "posthog": - for callback in _in_memory_loggers: - if isinstance(callback, PostHogLogger): - return callback # type: ignore - - _posthog_logger = PostHogLogger() - _in_memory_loggers.append(_posthog_logger) - return _posthog_logger # type: ignore - elif logging_integration == "braintrust": - from litellm.integrations.braintrust_logging import BraintrustLogger - - for callback in _in_memory_loggers: - if isinstance(callback, BraintrustLogger): - return callback # type: ignore - - braintrust_logger = BraintrustLogger() - _in_memory_loggers.append(braintrust_logger) - return braintrust_logger # type: ignore - elif logging_integration == "langsmith": - for callback in _in_memory_loggers: - if isinstance(callback, LangsmithLogger): - return callback # type: ignore - - _langsmith_logger = LangsmithLogger() - _in_memory_loggers.append(_langsmith_logger) - return _langsmith_logger # type: ignore - elif logging_integration == "argilla": - for callback in _in_memory_loggers: - if isinstance(callback, ArgillaLogger): - return callback # type: ignore - - _argilla_logger = ArgillaLogger() - _in_memory_loggers.append(_argilla_logger) - return _argilla_logger # type: ignore - elif logging_integration == "literalai": - for callback in _in_memory_loggers: - if isinstance(callback, LiteralAILogger): - return callback # type: ignore - - _literalai_logger = LiteralAILogger() - _in_memory_loggers.append(_literalai_logger) - return _literalai_logger # type: ignore - elif logging_integration == "prometheus": - PrometheusLogger = _get_cached_prometheus_logger() - - for callback in _in_memory_loggers: - if isinstance(callback, PrometheusLogger): - return callback # type: ignore - - _prometheus_logger = PrometheusLogger() - _in_memory_loggers.append(_prometheus_logger) - return _prometheus_logger # type: ignore - elif logging_integration == "datadog": - for callback in _in_memory_loggers: - if isinstance(callback, DataDogLogger): - return callback # type: ignore - - _datadog_logger = DataDogLogger() - _in_memory_loggers.append(_datadog_logger) - return _datadog_logger # type: ignore - elif logging_integration == "datadog_llm_observability": - _datadog_llm_obs_logger = DataDogLLMObsLogger() - _in_memory_loggers.append(_datadog_llm_obs_logger) - return _datadog_llm_obs_logger # type: ignore - elif logging_integration == "azure_sentinel": - for callback in _in_memory_loggers: - if isinstance(callback, AzureSentinelLogger): - return callback # type: ignore - - _azure_sentinel_logger = AzureSentinelLogger() - _in_memory_loggers.append(_azure_sentinel_logger) - return _azure_sentinel_logger # type: ignore - elif logging_integration == "gcs_bucket": - for callback in _in_memory_loggers: - if isinstance(callback, GCSBucketLogger): - return callback # type: ignore - - _gcs_bucket_logger = GCSBucketLogger() - _in_memory_loggers.append(_gcs_bucket_logger) - return _gcs_bucket_logger # type: ignore - elif logging_integration == "s3_v2": - for callback in _in_memory_loggers: - if isinstance(callback, S3V2Logger): - return callback # type: ignore - - _s3_v2_logger = S3V2Logger() - _in_memory_loggers.append(_s3_v2_logger) - return _s3_v2_logger # type: ignore - elif logging_integration == "aws_sqs": - for callback in _in_memory_loggers: - if isinstance(callback, SQSLogger): - return callback # type: ignore - - _aws_sqs_logger = SQSLogger() - _in_memory_loggers.append(_aws_sqs_logger) - return _aws_sqs_logger # type: ignore - elif logging_integration == "azure_storage": - for callback in _in_memory_loggers: - if isinstance(callback, AzureBlobStorageLogger): - return callback # type: ignore - - _azure_storage_logger = AzureBlobStorageLogger() - _in_memory_loggers.append(_azure_storage_logger) - return _azure_storage_logger # type: ignore - elif logging_integration == "opik": - for callback in _in_memory_loggers: - if isinstance(callback, OpikLogger): - return callback # type: ignore - - _opik_logger = OpikLogger() - _in_memory_loggers.append(_opik_logger) - return _opik_logger # type: ignore - elif logging_integration == "arize": - from litellm.integrations.opentelemetry import ( - OpenTelemetry, - OpenTelemetryConfig, - ) - - arize_config = ArizeLogger.get_arize_config() - if arize_config.endpoint is None: - raise ValueError( - "No valid endpoint found for Arize, please set 'ARIZE_ENDPOINT' to your GRPC endpoint or 'ARIZE_HTTP_ENDPOINT' to your HTTP endpoint" - ) - otel_config = OpenTelemetryConfig( - exporter=arize_config.protocol, - endpoint=arize_config.endpoint, - service_name=arize_config.project_name, - ) - - os.environ[ - "OTEL_EXPORTER_OTLP_TRACES_HEADERS" - ] = f"space_id={arize_config.space_key or arize_config.space_id},api_key={arize_config.api_key}" - for callback in _in_memory_loggers: - if ( - isinstance(callback, ArizeLogger) - and callback.callback_name == "arize" - ): - return callback # type: ignore - _arize_otel_logger = ArizeLogger(config=otel_config, callback_name="arize") - _in_memory_loggers.append(_arize_otel_logger) - return _arize_otel_logger # type: ignore - elif logging_integration == "arize_phoenix": - from litellm.integrations.opentelemetry import ( - OpenTelemetry, - OpenTelemetryConfig, - ) - - arize_phoenix_config = ArizePhoenixLogger.get_arize_phoenix_config() - otel_config = OpenTelemetryConfig( - exporter=arize_phoenix_config.protocol, - endpoint=arize_phoenix_config.endpoint, - headers=arize_phoenix_config.otlp_auth_headers, - ) - if arize_phoenix_config.project_name: - existing_attrs = os.environ.get("OTEL_RESOURCE_ATTRIBUTES", "") - # Add openinference.project.name attribute - if existing_attrs: - os.environ[ - "OTEL_RESOURCE_ATTRIBUTES" - ] = f"{existing_attrs},openinference.project.name={arize_phoenix_config.project_name}" - else: - os.environ[ - "OTEL_RESOURCE_ATTRIBUTES" - ] = f"openinference.project.name={arize_phoenix_config.project_name}" - - # Set Phoenix project name from environment variable - phoenix_project_name = os.environ.get("PHOENIX_PROJECT_NAME", None) - if phoenix_project_name: - existing_attrs = os.environ.get("OTEL_RESOURCE_ATTRIBUTES", "") - # Add openinference.project.name attribute - if existing_attrs: - os.environ[ - "OTEL_RESOURCE_ATTRIBUTES" - ] = f"{existing_attrs},openinference.project.name={phoenix_project_name}" - else: - os.environ[ - "OTEL_RESOURCE_ATTRIBUTES" - ] = f"openinference.project.name={phoenix_project_name}" - - # auth can be disabled on local deployments of arize phoenix - if arize_phoenix_config.otlp_auth_headers is not None: - os.environ[ - "OTEL_EXPORTER_OTLP_TRACES_HEADERS" - ] = arize_phoenix_config.otlp_auth_headers - - for callback in _in_memory_loggers: - if ( - isinstance(callback, ArizePhoenixLogger) - and callback.callback_name == "arize_phoenix" - ): - return callback # type: ignore - _arize_phoenix_otel_logger = ArizePhoenixLogger( - config=otel_config, callback_name="arize_phoenix" - ) - _in_memory_loggers.append(_arize_phoenix_otel_logger) - return _arize_phoenix_otel_logger # type: ignore - elif logging_integration == "levo": - from litellm.integrations.levo.levo import LevoLogger - from litellm.integrations.opentelemetry import ( - OpenTelemetry, - OpenTelemetryConfig, - ) - - levo_config = LevoLogger.get_levo_config() - otel_config = OpenTelemetryConfig( - exporter=levo_config.protocol, - endpoint=levo_config.endpoint, - headers=levo_config.otlp_auth_headers, - ) - - # Check if LevoLogger instance already exists - for callback in _in_memory_loggers: - if ( - isinstance(callback, LevoLogger) - and callback.callback_name == "levo" - ): - return callback # type: ignore - - _levo_otel_logger = LevoLogger(config=otel_config, callback_name="levo") - _in_memory_loggers.append(_levo_otel_logger) - return _levo_otel_logger # type: ignore - elif logging_integration == "otel": - from litellm.integrations.opentelemetry import OpenTelemetry - - for callback in _in_memory_loggers: - if type(callback) is OpenTelemetry: - return callback # type: ignore - otel_logger = OpenTelemetry( - **_get_custom_logger_settings_from_proxy_server( - callback_name=logging_integration - ) - ) - _in_memory_loggers.append(otel_logger) - return otel_logger # type: ignore - - elif logging_integration == "galileo": - for callback in _in_memory_loggers: - if isinstance(callback, GalileoObserve): - return callback # type: ignore - - galileo_logger = GalileoObserve() - _in_memory_loggers.append(galileo_logger) - return galileo_logger # type: ignore - elif logging_integration == "cloudzero": - from litellm.integrations.cloudzero.cloudzero import CloudZeroLogger - - for callback in _in_memory_loggers: - if isinstance(callback, CloudZeroLogger): - return callback # type: ignore - cloudzero_logger = CloudZeroLogger() - _in_memory_loggers.append(cloudzero_logger) - return cloudzero_logger # type: ignore - elif logging_integration == "focus": - from litellm.integrations.focus.focus_logger import FocusLogger - - for callback in _in_memory_loggers: - if isinstance(callback, FocusLogger): - return callback # type: ignore - focus_logger = FocusLogger() - _in_memory_loggers.append(focus_logger) - return focus_logger # type: ignore - elif logging_integration == "deepeval": - for callback in _in_memory_loggers: - if isinstance(callback, DeepEvalLogger): - return callback # type: ignore - deepeval_logger = DeepEvalLogger() - _in_memory_loggers.append(deepeval_logger) - return deepeval_logger # type: ignore - - elif logging_integration == "logfire": - if "LOGFIRE_TOKEN" not in os.environ: - raise ValueError("LOGFIRE_TOKEN not found in environment variables") - from litellm.integrations.opentelemetry import ( - OpenTelemetry, - OpenTelemetryConfig, - ) - - logfire_base_url = os.getenv( - "LOGFIRE_BASE_URL", "https://logfire-api.pydantic.dev" - ) - otel_config = OpenTelemetryConfig( - exporter="otlp_http", - endpoint=f"{logfire_base_url.rstrip('/')}/v1/traces", - headers=f"Authorization={os.getenv('LOGFIRE_TOKEN')}", - ) - for callback in _in_memory_loggers: - if isinstance(callback, OpenTelemetry): - return callback # type: ignore - _otel_logger = OpenTelemetry(config=otel_config) - _in_memory_loggers.append(_otel_logger) - return _otel_logger # type: ignore - elif logging_integration == "dynamic_rate_limiter": - from litellm.proxy.hooks.dynamic_rate_limiter import ( - _PROXY_DynamicRateLimitHandler, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, _PROXY_DynamicRateLimitHandler): - return callback # type: ignore - - if internal_usage_cache is None: - raise Exception( - "Internal Error: Cache cannot be empty - internal_usage_cache={}".format( - internal_usage_cache - ) - ) - - dynamic_rate_limiter_obj = _PROXY_DynamicRateLimitHandler( - internal_usage_cache=internal_usage_cache - ) - - if llm_router is not None and isinstance(llm_router, litellm.Router): - dynamic_rate_limiter_obj.update_variables(llm_router=llm_router) - _in_memory_loggers.append(dynamic_rate_limiter_obj) - return dynamic_rate_limiter_obj # type: ignore - elif logging_integration == "dynamic_rate_limiter_v3": - from litellm.proxy.hooks.dynamic_rate_limiter_v3 import ( - _PROXY_DynamicRateLimitHandlerV3, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, _PROXY_DynamicRateLimitHandlerV3): - return callback # type: ignore - - if internal_usage_cache is None: - raise Exception( - "Internal Error: Cache cannot be empty - internal_usage_cache={}".format( - internal_usage_cache - ) - ) - - dynamic_rate_limiter_obj_v3 = _PROXY_DynamicRateLimitHandlerV3( - internal_usage_cache=internal_usage_cache - ) - - if llm_router is not None and isinstance(llm_router, litellm.Router): - dynamic_rate_limiter_obj_v3.update_variables(llm_router=llm_router) - _in_memory_loggers.append(dynamic_rate_limiter_obj_v3) - return dynamic_rate_limiter_obj_v3 # type: ignore - elif logging_integration == "langtrace": - if "LANGTRACE_API_KEY" not in os.environ: - raise ValueError("LANGTRACE_API_KEY not found in environment variables") - - from litellm.integrations.opentelemetry import ( - OpenTelemetry, - OpenTelemetryConfig, - ) - - otel_config = OpenTelemetryConfig( - exporter="otlp_http", - endpoint="https://langtrace.ai/api/trace", - ) - os.environ[ - "OTEL_EXPORTER_OTLP_TRACES_HEADERS" - ] = f"api_key={os.getenv('LANGTRACE_API_KEY')}" - for callback in _in_memory_loggers: - if ( - isinstance(callback, OpenTelemetry) - and callback.callback_name == "langtrace" - ): - return callback # type: ignore - _otel_logger = OpenTelemetry(config=otel_config, callback_name="langtrace") - _in_memory_loggers.append(_otel_logger) - return _otel_logger # type: ignore - - elif logging_integration == "mlflow": - for callback in _in_memory_loggers: - if isinstance(callback, MlflowLogger): - return callback # type: ignore - - _mlflow_logger = MlflowLogger() - _in_memory_loggers.append(_mlflow_logger) - return _mlflow_logger # type: ignore - elif logging_integration == "langfuse": - for callback in _in_memory_loggers: - if isinstance(callback, LangfusePromptManagement): - return callback - - langfuse_logger = LangfusePromptManagement() - _in_memory_loggers.append(langfuse_logger) - return langfuse_logger # type: ignore - elif logging_integration == "langfuse_otel": - from litellm.integrations.langfuse.langfuse_otel import LangfuseOtelLogger - - for callback in _in_memory_loggers: - if ( - isinstance(callback, LangfuseOtelLogger) - and callback.callback_name == "langfuse_otel" - ): - return callback # type: ignore - # Allow LangfuseOtelLogger to initialize its own config safely - # This prevents startup crashes if LANGFUSE keys are not in env (e.g. for dynamic usage) - _otel_logger = LangfuseOtelLogger( - config=None, callback_name="langfuse_otel" - ) - _in_memory_loggers.append(_otel_logger) - return _otel_logger # type: ignore - elif logging_integration == "weave_otel": - from litellm.integrations.opentelemetry import OpenTelemetryConfig - from litellm.integrations.weave.weave_otel import ( - WeaveOtelLogger, - get_weave_otel_config, - ) - - weave_otel_config = get_weave_otel_config() - - otel_config = OpenTelemetryConfig( - exporter=weave_otel_config.protocol, - endpoint=weave_otel_config.endpoint, - headers=weave_otel_config.otlp_auth_headers, - ) - - for callback in _in_memory_loggers: - if ( - isinstance(callback, WeaveOtelLogger) - and callback.callback_name == "weave_otel" - ): - return callback # type: ignore - _otel_logger = WeaveOtelLogger( - config=otel_config, callback_name="weave_otel" - ) - _in_memory_loggers.append(_otel_logger) - return _otel_logger # type: ignore - elif logging_integration == "pagerduty": - for callback in _in_memory_loggers: - if isinstance(callback, PagerDutyAlerting): - return callback - pagerduty_logger = PagerDutyAlerting(**custom_logger_init_args) - _in_memory_loggers.append(pagerduty_logger) - return pagerduty_logger # type: ignore - elif logging_integration == "anthropic_cache_control_hook": - for callback in _in_memory_loggers: - if isinstance(callback, AnthropicCacheControlHook): - return callback - anthropic_cache_control_hook = AnthropicCacheControlHook() - _in_memory_loggers.append(anthropic_cache_control_hook) - return anthropic_cache_control_hook # type: ignore - elif logging_integration == "vector_store_pre_call_hook": - from litellm.integrations.vector_store_integrations.vector_store_pre_call_hook import ( - VectorStorePreCallHook, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, VectorStorePreCallHook): - return callback - vector_store_pre_call_hook = VectorStorePreCallHook() - _in_memory_loggers.append(vector_store_pre_call_hook) - return vector_store_pre_call_hook # type: ignore - elif logging_integration == "gcs_pubsub": - for callback in _in_memory_loggers: - if isinstance(callback, GcsPubSubLogger): - return callback - _gcs_pubsub_logger = GcsPubSubLogger() - _in_memory_loggers.append(_gcs_pubsub_logger) - return _gcs_pubsub_logger # type: ignore - elif logging_integration == "generic_api": - for callback in _in_memory_loggers: - if isinstance(callback, GenericAPILogger): - return callback - generic_api_logger = GenericAPILogger() - _in_memory_loggers.append(generic_api_logger) - return generic_api_logger # type: ignore - elif logging_integration == "resend_email": - for callback in _in_memory_loggers: - if isinstance(callback, ResendEmailLogger): - return callback - resend_email_logger = ResendEmailLogger() - _in_memory_loggers.append(resend_email_logger) - return resend_email_logger # type: ignore - elif logging_integration == "sendgrid_email": - for callback in _in_memory_loggers: - if isinstance(callback, SendGridEmailLogger): - return callback - sendgrid_email_logger = SendGridEmailLogger() - _in_memory_loggers.append(sendgrid_email_logger) - return sendgrid_email_logger # type: ignore - elif logging_integration == "smtp_email": - for callback in _in_memory_loggers: - if isinstance(callback, SMTPEmailLogger): - return callback - smtp_email_logger = SMTPEmailLogger() - _in_memory_loggers.append(smtp_email_logger) - return smtp_email_logger # type: ignore - elif logging_integration == "humanloop": - for callback in _in_memory_loggers: - if isinstance(callback, HumanloopLogger): - return callback - - humanloop_logger = HumanloopLogger() - _in_memory_loggers.append(humanloop_logger) - return humanloop_logger # type: ignore - elif logging_integration == "dotprompt": - for callback in _in_memory_loggers: - if isinstance(callback, DotpromptManager): - return callback - - dotprompt_logger = DotpromptManager() - _in_memory_loggers.append(dotprompt_logger) - return dotprompt_logger # type: ignore - elif logging_integration == "bitbucket": - from litellm.integrations.bitbucket.bitbucket_prompt_manager import ( - BitBucketPromptManager, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, BitBucketPromptManager): - return callback - - # Get global BitBucket config - bitbucket_config = getattr(litellm, "global_bitbucket_config", None) - if bitbucket_config is None: - raise ValueError( - "BitBucket configuration not found. Please set litellm.global_bitbucket_config first." - ) - - bitbucket_logger = BitBucketPromptManager(bitbucket_config=bitbucket_config) - _in_memory_loggers.append(bitbucket_logger) - return bitbucket_logger # type: ignore - elif logging_integration == "gitlab": - from litellm.integrations.gitlab.gitlab_prompt_manager import ( - GitLabPromptManager, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, GitLabPromptManager): - return callback - - # Get global BitBucket config - gitlab_config = getattr(litellm, "global_gitlab_config", None) - if gitlab_config is None: - raise ValueError( - "Gitlab configuration not found. Please set litellm.global_gitlab_config first." - ) - - gitlab_logger = GitLabPromptManager(gitlab_config=gitlab_config) - _in_memory_loggers.append(gitlab_logger) - return gitlab_logger # type: ignore - return None - except Exception as e: - verbose_logger.exception( - f"[Non-Blocking Error] Error initializing custom logger: {e}" - ) - return None - return None - - -def get_custom_logger_compatible_class( # noqa: PLR0915 - logging_integration: _custom_logger_compatible_callbacks_literal, -) -> Optional[CustomLogger]: - try: - if logging_integration == "lago": - for callback in _in_memory_loggers: - if isinstance(callback, LagoLogger): - return callback - elif logging_integration == "openmeter": - for callback in _in_memory_loggers: - if isinstance(callback, OpenMeterLogger): - return callback - elif logging_integration == "braintrust": - from litellm.integrations.braintrust_logging import BraintrustLogger - - for callback in _in_memory_loggers: - if isinstance(callback, BraintrustLogger): - return callback - elif logging_integration == "galileo": - for callback in _in_memory_loggers: - if isinstance(callback, GalileoObserve): - return callback - elif logging_integration == "cloudzero": - from litellm.integrations.cloudzero.cloudzero import CloudZeroLogger - - for callback in _in_memory_loggers: - if isinstance(callback, CloudZeroLogger): - return callback - elif logging_integration == "focus": - from litellm.integrations.focus.focus_logger import FocusLogger - - for callback in _in_memory_loggers: - if isinstance(callback, FocusLogger): - return callback - elif logging_integration == "deepeval": - for callback in _in_memory_loggers: - if isinstance(callback, DeepEvalLogger): - return callback - elif logging_integration == "langsmith": - for callback in _in_memory_loggers: - if isinstance(callback, LangsmithLogger): - return callback - elif logging_integration == "argilla": - for callback in _in_memory_loggers: - if isinstance(callback, ArgillaLogger): - return callback - elif logging_integration == "literalai": - for callback in _in_memory_loggers: - if isinstance(callback, LiteralAILogger): - return callback - elif logging_integration == "prometheus": - PrometheusLogger = _get_cached_prometheus_logger() - for callback in _in_memory_loggers: - if isinstance(callback, PrometheusLogger): - return callback - elif logging_integration == "datadog": - for callback in _in_memory_loggers: - if isinstance(callback, DataDogLogger): - return callback - elif logging_integration == "datadog_llm_observability": - for callback in _in_memory_loggers: - if isinstance(callback, DataDogLLMObsLogger): - return callback - elif logging_integration == "azure_sentinel": - for callback in _in_memory_loggers: - if isinstance(callback, AzureSentinelLogger): - return callback - elif logging_integration == "gcs_bucket": - for callback in _in_memory_loggers: - if isinstance(callback, GCSBucketLogger): - return callback - elif logging_integration == "s3_v2": - for callback in _in_memory_loggers: - if isinstance(callback, S3V2Logger): - return callback - elif logging_integration == "aws_sqs": - for callback in _in_memory_loggers: - if isinstance(callback, SQSLogger): - return callback - _aws_sqs_logger = SQSLogger() - _in_memory_loggers.append(_aws_sqs_logger) - return _aws_sqs_logger # type: ignore - elif logging_integration == "azure_storage": - for callback in _in_memory_loggers: - if isinstance(callback, AzureBlobStorageLogger): - return callback - elif logging_integration == "opik": - for callback in _in_memory_loggers: - if isinstance(callback, OpikLogger): - return callback - elif logging_integration == "langfuse": - for callback in _in_memory_loggers: - if isinstance(callback, LangfusePromptManagement): - return callback - elif logging_integration == "otel": - from litellm.integrations.opentelemetry import OpenTelemetry - - for callback in _in_memory_loggers: - if isinstance(callback, OpenTelemetry): - return callback - elif logging_integration == "arize": - if "ARIZE_API_KEY" not in os.environ: - raise ValueError("ARIZE_API_KEY not found in environment variables") - for callback in _in_memory_loggers: - if ( - isinstance(callback, ArizeLogger) - and callback.callback_name == "arize" - ): - return callback - elif logging_integration == "logfire": - if "LOGFIRE_TOKEN" not in os.environ: - raise ValueError("LOGFIRE_TOKEN not found in environment variables") - from litellm.integrations.opentelemetry import OpenTelemetry - - for callback in _in_memory_loggers: - if isinstance(callback, OpenTelemetry): - return callback # type: ignore - - elif logging_integration == "dynamic_rate_limiter": - from litellm.proxy.hooks.dynamic_rate_limiter import ( - _PROXY_DynamicRateLimitHandler, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, _PROXY_DynamicRateLimitHandler): - return callback # type: ignore - elif logging_integration == "dynamic_rate_limiter_v3": - from litellm.proxy.hooks.dynamic_rate_limiter_v3 import ( - _PROXY_DynamicRateLimitHandlerV3, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, _PROXY_DynamicRateLimitHandlerV3): - return callback # type: ignore - - elif logging_integration == "langtrace": - from litellm.integrations.opentelemetry import OpenTelemetry - - if "LANGTRACE_API_KEY" not in os.environ: - raise ValueError("LANGTRACE_API_KEY not found in environment variables") - - for callback in _in_memory_loggers: - if ( - isinstance(callback, OpenTelemetry) - and callback.callback_name == "langtrace" - ): - return callback - - elif logging_integration == "mlflow": - for callback in _in_memory_loggers: - if isinstance(callback, MlflowLogger): - return callback - elif logging_integration == "pagerduty": - for callback in _in_memory_loggers: - if isinstance(callback, PagerDutyAlerting): - return callback - elif logging_integration == "anthropic_cache_control_hook": - for callback in _in_memory_loggers: - if isinstance(callback, AnthropicCacheControlHook): - return callback - elif logging_integration == "vector_store_pre_call_hook": - from litellm.integrations.vector_store_integrations.vector_store_pre_call_hook import ( - VectorStorePreCallHook, - ) - - for callback in _in_memory_loggers: - if isinstance(callback, VectorStorePreCallHook): - return callback - elif logging_integration == "gcs_pubsub": - for callback in _in_memory_loggers: - if isinstance(callback, GcsPubSubLogger): - return callback - elif logging_integration == "generic_api": - for callback in _in_memory_loggers: - if isinstance(callback, GenericAPILogger): - return callback - elif logging_integration == "resend_email": - for callback in _in_memory_loggers: - if isinstance(callback, ResendEmailLogger): - return callback - elif logging_integration == "sendgrid_email": - for callback in _in_memory_loggers: - if isinstance(callback, SendGridEmailLogger): - return callback - elif logging_integration == "smtp_email": - for callback in _in_memory_loggers: - if isinstance(callback, SMTPEmailLogger): - return callback - return None - - except Exception as e: - verbose_logger.exception( - f"[Non-Blocking Error] Error getting custom logger: {e}" - ) - return None - - -def _get_custom_logger_settings_from_proxy_server(callback_name: str) -> Dict: - """ - Get the settings for a custom logger from the proxy server config.yaml - - Proxy server config.yaml defines callback_settings as: - - callback_settings: - otel: - message_logging: False - """ - if litellm.callback_settings: - return dict(litellm.callback_settings.get(callback_name, {})) - return {} - - -def use_custom_pricing_for_model(litellm_params: Optional[dict]) -> bool: - """ - Check if the model uses custom pricing - - Returns True if any of `SPECIAL_MODEL_INFO_PARAMS` are present in `litellm_params` or `model_info` - """ - if litellm_params is None: - return False - - # Check litellm_params using set intersection (only check keys that exist in both) - matching_keys = _CUSTOM_PRICING_KEYS & litellm_params.keys() - for key in matching_keys: - if litellm_params.get(key) is not None: - return True - - # Check model_info - metadata: dict = litellm_params.get("metadata", {}) or {} - model_info: dict = metadata.get("model_info", {}) or {} - - if model_info: - matching_keys = _CUSTOM_PRICING_KEYS & model_info.keys() - for key in matching_keys: - if model_info.get(key) is not None: - return True - - return False - - -def is_valid_sha256_hash(value: str) -> bool: - # Check if the value is a valid SHA-256 hash (64 hexadecimal characters) - return bool(re.fullmatch(r"[a-fA-F0-9]{64}", value)) - - -class StandardLoggingPayloadSetup: - @staticmethod - def cleanup_timestamps( - start_time: Union[dt_object, float], - end_time: Union[dt_object, float], - completion_start_time: Union[dt_object, float], - ) -> Tuple[float, float, float]: - """ - Convert datetime objects to floats - - Args: - start_time: Union[dt_object, float] - end_time: Union[dt_object, float] - completion_start_time: Union[dt_object, float] - - Returns: - Tuple[float, float, float]: A tuple containing the start time, end time, and completion start time as floats. - """ - - if isinstance(start_time, datetime.datetime): - start_time_float = start_time.timestamp() - elif isinstance(start_time, float): - start_time_float = start_time - else: - raise ValueError( - f"start_time is required, got={start_time} of type {type(start_time)}" - ) - - if isinstance(end_time, datetime.datetime): - end_time_float = end_time.timestamp() - elif isinstance(end_time, float): - end_time_float = end_time - else: - raise ValueError( - f"end_time is required, got={end_time} of type {type(end_time)}" - ) - - if isinstance(completion_start_time, datetime.datetime): - completion_start_time_float = completion_start_time.timestamp() - elif isinstance(completion_start_time, float): - completion_start_time_float = completion_start_time - else: - completion_start_time_float = end_time_float - - return start_time_float, end_time_float, completion_start_time_float - - @staticmethod - def append_system_prompt_messages( - kwargs: Optional[Dict] = None, messages: Optional[Any] = None - ): - """ - Append system prompt messages to the messages - """ - if kwargs is not None: - if kwargs.get("system") is not None and isinstance( - kwargs.get("system"), str - ): - if messages is None: - return [{"role": "system", "content": kwargs.get("system")}] - elif isinstance(messages, list): - if len(messages) == 0: - return [{"role": "system", "content": kwargs.get("system")}] - # check for duplicates - if messages[0].get("role") == "system" and messages[0].get( - "content" - ) == kwargs.get("system"): - return messages - messages = [ - {"role": "system", "content": kwargs.get("system")} - ] + messages - elif isinstance(messages, str): - messages = [ - {"role": "system", "content": kwargs.get("system")}, - {"role": "user", "content": messages}, - ] - return messages - - return messages - - @staticmethod - def merge_litellm_metadata(litellm_params: dict) -> dict: - """ - Merge both litellm_metadata and metadata from litellm_params. - - litellm_metadata contains model-related fields, metadata contains user API key fields. - We need both for complete standard logging payload. - - Args: - litellm_params: Dictionary containing metadata and litellm_metadata - - Returns: - dict: Merged metadata with user API key fields taking precedence - """ - merged_metadata: dict = {} - - # Start with metadata (user API key fields) - but skip non-serializable objects - if litellm_params.get("metadata") and isinstance( - litellm_params.get("metadata"), dict - ): - for key, value in litellm_params["metadata"].items(): - # Skip non-serializable objects like UserAPIKeyAuth - if key == "user_api_key_auth": - continue - merged_metadata[key] = value - - # Then merge litellm_metadata (model-related fields) - this will NOT overwrite existing keys - if litellm_params.get("litellm_metadata") and isinstance( - litellm_params.get("litellm_metadata"), dict - ): - for key, value in litellm_params["litellm_metadata"].items(): - if ( - key not in merged_metadata - ): # Don't overwrite existing keys from metadata - merged_metadata[key] = value - - return merged_metadata - - @staticmethod - def get_standard_logging_metadata( - metadata: Optional[Dict[str, Any]], - litellm_params: Optional[dict] = None, - prompt_integration: Optional[str] = None, - applied_guardrails: Optional[List[str]] = None, - mcp_tool_call_metadata: Optional[StandardLoggingMCPToolCall] = None, - vector_store_request_metadata: Optional[ - List[StandardLoggingVectorStoreRequest] - ] = None, - usage_object: Optional[dict] = None, - proxy_server_request: Optional[dict] = None, - start_time: Optional[dt_object] = None, - response_id: Optional[str] = None, - ) -> StandardLoggingMetadata: - """ - Clean and filter the metadata dictionary to include only the specified keys in StandardLoggingMetadata. - - Args: - metadata (Optional[Dict[str, Any]]): The original metadata dictionary. - - Returns: - StandardLoggingMetadata: A StandardLoggingMetadata object containing the cleaned metadata. - - Note: - - If the input metadata is None or not a dictionary, an empty StandardLoggingMetadata object is returned. - - If 'user_api_key' is present in metadata and is a valid SHA256 hash, it's stored as 'user_api_key_hash'. - """ - - prompt_management_metadata: Optional[ - StandardLoggingPromptManagementMetadata - ] = None - if litellm_params is not None: - prompt_id = cast(Optional[str], litellm_params.get("prompt_id", None)) - prompt_variables = cast( - Optional[dict], litellm_params.get("prompt_variables", None) - ) - - if prompt_id is not None and prompt_integration is not None: - prompt_management_metadata = StandardLoggingPromptManagementMetadata( - prompt_id=prompt_id, - prompt_variables=prompt_variables, - prompt_integration=prompt_integration, - ) - - # Initialize with default values - clean_metadata = StandardLoggingMetadata( - user_api_key_hash=None, - user_api_key_alias=None, - user_api_key_spend=None, - user_api_key_max_budget=None, - user_api_key_budget_reset_at=None, - user_api_key_team_id=None, - user_api_key_org_id=None, - user_api_key_user_id=None, - user_api_key_team_alias=None, - user_api_key_user_email=None, - user_api_key_end_user_id=None, - user_api_key_request_route=None, - spend_logs_metadata=None, - requester_ip_address=None, - user_agent=None, - requester_metadata=None, - prompt_management_metadata=prompt_management_metadata, - applied_guardrails=applied_guardrails, - mcp_tool_call_metadata=mcp_tool_call_metadata, - vector_store_request_metadata=vector_store_request_metadata, - usage_object=usage_object, - requester_custom_headers=None, - cold_storage_object_key=None, - user_api_key_auth_metadata=None, - team_alias=None, - team_id=None, - ) - if isinstance(metadata, dict): - for key in metadata.keys() & _STANDARD_LOGGING_METADATA_KEYS: - clean_metadata[key] = metadata[key] # type: ignore - - user_api_key = metadata.get("user_api_key") - if ( - user_api_key - and isinstance(user_api_key, str) - and is_valid_sha256_hash(user_api_key) - ): - clean_metadata["user_api_key_hash"] = user_api_key - _potential_requester_metadata = metadata.get( - "metadata", None - ) # check if user passed metadata in the sdk request - e.g. metadata for langsmith logging - https://docs.litellm.ai/docs/observability/langsmith_integration#set-langsmith-fields - if ( - clean_metadata["requester_metadata"] is None - and _potential_requester_metadata is not None - and isinstance(_potential_requester_metadata, dict) - ): - clean_metadata["requester_metadata"] = _potential_requester_metadata - - if ( - EnterpriseStandardLoggingPayloadSetupVAR - and proxy_server_request is not None - ): - clean_metadata = EnterpriseStandardLoggingPayloadSetupVAR.apply_enterprise_specific_metadata( - standard_logging_metadata=clean_metadata, - proxy_server_request=proxy_server_request, - ) - - # Generate cold storage object key if cold storage is configured - if start_time is not None and response_id is not None: - cold_storage_object_key = ( - StandardLoggingPayloadSetup._generate_cold_storage_object_key( - start_time=start_time, - response_id=response_id, - team_alias=clean_metadata.get("user_api_key_team_alias"), - ) - ) - if cold_storage_object_key: - clean_metadata["cold_storage_object_key"] = cold_storage_object_key - - return clean_metadata - - @staticmethod - def get_usage_from_response_obj( - response_obj: Optional[dict], combined_usage_object: Optional[Usage] = None - ) -> Usage: - ## BASE CASE ## - if combined_usage_object is not None: - return combined_usage_object - if response_obj is None: - return Usage( - prompt_tokens=0, - completion_tokens=0, - total_tokens=0, - ) - - usage = response_obj.get("usage", None) or {} - if usage is None or ( - not isinstance(usage, dict) and not isinstance(usage, Usage) - ): - return Usage( - prompt_tokens=0, - completion_tokens=0, - total_tokens=0, - ) - elif isinstance(usage, Usage): - return usage - elif isinstance(usage, ResponseAPIUsage): - return ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( - usage - ) - elif isinstance(usage, dict): - if ResponseAPILoggingUtils._is_response_api_usage(usage): - return ( - ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( - usage - ) - ) - return Usage(**usage) - - raise ValueError(f"usage is required, got={usage} of type {type(usage)}") - - @staticmethod - def get_model_cost_information( - base_model: Optional[str], - custom_pricing: Optional[bool], - custom_llm_provider: Optional[str], - init_response_obj: Union[Any, BaseModel, dict], - ) -> StandardLoggingModelInformation: - model_cost_name = _select_model_name_for_cost_calc( - model=None, - completion_response=init_response_obj, # type: ignore - base_model=base_model, - custom_pricing=custom_pricing, - ) - if model_cost_name is None: - model_cost_information = StandardLoggingModelInformation( - model_map_key="", model_map_value=None - ) - else: - try: - _model_cost_information = litellm.get_model_info( - model=model_cost_name, custom_llm_provider=custom_llm_provider - ) - model_cost_information = StandardLoggingModelInformation( - model_map_key=model_cost_name, - model_map_value=_model_cost_information, - ) - except Exception: - verbose_logger.debug( # keep in debug otherwise it will trigger on every call - "Model={} is not mapped in model cost map. Defaulting to None model_cost_information for standard_logging_payload".format( - model_cost_name - ) - ) - model_cost_information = StandardLoggingModelInformation( - model_map_key=model_cost_name, model_map_value=None - ) - return model_cost_information - - @staticmethod - def get_final_response_obj( - response_obj: dict, init_response_obj: Union[Any, BaseModel, dict], kwargs: dict - ) -> Optional[Union[dict, str, list]]: - """ - Get final response object after redacting the message input/output from logging - """ - if response_obj: - final_response_obj: Optional[Union[dict, str, list]] = response_obj - elif isinstance(init_response_obj, list) or isinstance(init_response_obj, str): - final_response_obj = init_response_obj - else: - final_response_obj = {} - - modified_final_response_obj = redact_message_input_output_from_logging( - model_call_details=kwargs, - result=final_response_obj, - ) - - if modified_final_response_obj is not None and isinstance( - modified_final_response_obj, BaseModel - ): - final_response_obj = modified_final_response_obj.model_dump() - else: - final_response_obj = modified_final_response_obj - - return final_response_obj - - @staticmethod - def get_additional_headers( - additiona_headers: Optional[dict], - ) -> Optional[StandardLoggingAdditionalHeaders]: - if additiona_headers is None: - return None - - additional_logging_headers: StandardLoggingAdditionalHeaders = {} - - for key in StandardLoggingAdditionalHeaders.__annotations__.keys(): - _key = key.lower() - _key = _key.replace("_", "-") - if _key in additiona_headers: - try: - additional_logging_headers[key] = int(additiona_headers[_key]) # type: ignore - except (ValueError, TypeError): - verbose_logger.debug( - f"Could not convert {additiona_headers[_key]} to int for key {key}." - ) - return additional_logging_headers - - @staticmethod - def get_hidden_params( - hidden_params: Optional[dict], - ) -> StandardLoggingHiddenParams: - clean_hidden_params = StandardLoggingHiddenParams( - model_id=None, - cache_key=None, - api_base=None, - response_cost=None, - additional_headers=None, - litellm_overhead_time_ms=None, - batch_models=None, - litellm_model_name=None, - usage_object=None, - ) - if hidden_params is not None: - for key in StandardLoggingHiddenParams.__annotations__.keys(): - if key in hidden_params: - if key == "additional_headers": - clean_hidden_params[ - "additional_headers" - ] = StandardLoggingPayloadSetup.get_additional_headers( - hidden_params[key] - ) - else: - clean_hidden_params[key] = hidden_params[key] # type: ignore - return clean_hidden_params - - @staticmethod - def strip_trailing_slash(api_base: Optional[str]) -> Optional[str]: - if api_base: - if api_base.endswith("//"): - return api_base.rstrip("/") - if api_base[-1] == "/": - return api_base[:-1] - return api_base - - @staticmethod - def _generate_cold_storage_object_key( - start_time: dt_object, - response_id: str, - team_alias: Optional[str] = None, - ) -> Optional[str]: - """ - Generate cold storage object key in the same format as S3Logger. - - Args: - start_time: The start time of the request - response_id: The response ID - team_alias: Optional team alias for team-based prefixing - - Returns: - Optional[str]: The generated object key or None if cold storage not configured - """ - # Generate object key in same format as S3Logger - from litellm.integrations.s3 import get_s3_object_key - - # Only generate object key if cold storage is configured - cold_storage_custom_logger = litellm.cold_storage_custom_logger - if cold_storage_custom_logger is None: - return None - - try: - # Generate file name in same format as litellm.utils.get_logging_id - s3_file_name = f"time-{start_time.strftime('%H-%M-%S-%f')}_{response_id}" - - # Get the actual s3_path from the configured cold storage logger instance - s3_path = "" # default value - - # Try to get the actual logger instance from the logger name - try: - custom_logger = litellm.logging_callback_manager.get_active_custom_logger_for_callback_name( - cold_storage_custom_logger - ) - if ( - custom_logger - and hasattr(custom_logger, "s3_path") - and getattr(custom_logger, "s3_path") - ): - s3_path = getattr(custom_logger, "s3_path") - except Exception: - # If any error occurs in getting the logger instance, use default empty s3_path - pass - - s3_object_key = get_s3_object_key( - s3_path=s3_path, # Use actual s3_path from logger configuration - prefix="", # Don't split by team alias for cold storage - start_time=start_time, - s3_file_name=s3_file_name, - ) - - return s3_object_key - except Exception: - # If any error occurs in generating the key, return None - return None - - @staticmethod - def get_error_information( - original_exception: Optional[Exception], - traceback_str: Optional[str] = None, - ) -> StandardLoggingPayloadErrorInformation: - from litellm.constants import MAXIMUM_TRACEBACK_LINES_TO_LOG - - # Check for 'code' first (used by ProxyException), then fall back to 'status_code' (used by LiteLLM exceptions) - # Ensure error_code is always a string for Prisma Python JSON field compatibility - error_code_attr = getattr(original_exception, "code", None) - if error_code_attr is not None and str(error_code_attr) not in ("", "None"): - error_status: str = str(error_code_attr) - else: - status_code_attr = getattr(original_exception, "status_code", None) - error_status = str(status_code_attr) if status_code_attr is not None else "" - error_class: str = ( - str(original_exception.__class__.__name__) if original_exception else "" - ) - _llm_provider_in_exception = getattr(original_exception, "llm_provider", "") - - # Get traceback information (first 100 lines) - traceback_info = traceback_str or "" - if original_exception: - tb = getattr(original_exception, "__traceback__", None) - if tb: - tb_lines = traceback.format_tb(tb) - traceback_info += "".join( - tb_lines[:MAXIMUM_TRACEBACK_LINES_TO_LOG] - ) # Limit to first 100 lines - - # Get additional error details - error_message = str(original_exception) - - return StandardLoggingPayloadErrorInformation( - error_code=error_status, - error_class=error_class, - llm_provider=_llm_provider_in_exception, - traceback=traceback_info, - error_message=error_message if original_exception else "", - ) - - @staticmethod - def get_response_time( - start_time_float: float, - end_time_float: float, - completion_start_time_float: float, - stream: bool, - ) -> float: - """ - Get the response time for the LLM response - - Args: - start_time_float: float - start time of the LLM call - end_time_float: float - end time of the LLM call - completion_start_time_float: float - time to first token of the LLM response (for streaming responses) - stream: bool - True when a stream response is returned - - Returns: - float: The response time for the LLM response - """ - if stream is True: - return completion_start_time_float - start_time_float - else: - return end_time_float - start_time_float - - @staticmethod - def _get_standard_logging_payload_trace_id( - logging_obj: Logging, - litellm_params: dict, - ) -> str: - """ - Returns the `litellm_trace_id` for this request - - This helps link sessions when multiple requests are made in a single session - """ - dynamic_litellm_session_id = litellm_params.get("litellm_session_id") - dynamic_litellm_trace_id = litellm_params.get("litellm_trace_id") - - # Note: we recommend using `litellm_session_id` for session tracking - # `litellm_trace_id` is an internal litellm param - if dynamic_litellm_session_id: - return str(dynamic_litellm_session_id) - elif dynamic_litellm_trace_id: - return str(dynamic_litellm_trace_id) - else: - return logging_obj.litellm_trace_id - - @staticmethod - def _get_user_agent_tags(proxy_server_request: dict) -> Optional[List[str]]: - """ - Return the user agent tags from the proxy server request for spend tracking - """ - if litellm.disable_add_user_agent_to_request_tags is True: - return None - user_agent_tags: Optional[List[str]] = None - headers = proxy_server_request.get("headers", {}) - if headers is not None and isinstance(headers, dict): - if "user-agent" in headers: - user_agent = headers["user-agent"] - if user_agent is not None: - if user_agent_tags is None: - user_agent_tags = [] - user_agent_part: Optional[str] = None - if "/" in user_agent: - user_agent_part = user_agent.split("/")[0] - if user_agent_part is not None: - user_agent_tags.append("User-Agent: " + user_agent_part) - if user_agent is not None: - user_agent_tags.append("User-Agent: " + user_agent) - return user_agent_tags - - @staticmethod - def _get_extra_header_tags(proxy_server_request: dict) -> Optional[List[str]]: - """ - Extract additional header tags for spend tracking based on config. - """ - extra_headers: List[str] = ( - getattr(litellm, "extra_spend_tag_headers", None) or [] - ) - if not extra_headers: - return None - - headers = proxy_server_request.get("headers", {}) - if not isinstance(headers, dict): - return None - - header_tags = [] - for header_name in extra_headers: - header_value = headers.get(header_name) - if header_value: - header_tags.append(f"{header_name}: {header_value}") - - return header_tags if header_tags else None - - @staticmethod - def _get_request_tags( - litellm_params: dict, proxy_server_request: dict - ) -> List[str]: - # check for 'tags' in both 'metadata' and 'litellm_metadata' - metadata = litellm_params.get("metadata") or {} - litellm_metadata = litellm_params.get("litellm_metadata") or {} - if metadata.get("tags", []): - request_tags = metadata.get("tags", []).copy() - elif litellm_metadata.get("tags", []): - request_tags = litellm_metadata.get("tags", []).copy() - else: - request_tags = [] - user_agent_tags = StandardLoggingPayloadSetup._get_user_agent_tags( - proxy_server_request - ) - additional_header_tags = StandardLoggingPayloadSetup._get_extra_header_tags( - proxy_server_request - ) - if user_agent_tags is not None: - request_tags.extend(user_agent_tags) - if additional_header_tags is not None: - request_tags.extend(additional_header_tags) - return request_tags - - -def _get_status_fields( - status: StandardLoggingPayloadStatus, - guardrail_information: Optional[List[dict]], - error_str: Optional[str], -) -> "StandardLoggingPayloadStatusFields": - """ - Determine status fields based on request status and guardrail information. - - Args: - status: Overall request status ("success" or "failure") - guardrail_information: Guardrail information from metadata - error_str: Error string if any - - Returns: - StandardLoggingPayloadStatusFields with llm_api_status and guardrail_status - """ - # Mapping for legacy guardrail status values to new GuardrailStatus values - GUARDRAIL_STATUS_MAP: Dict[str, GuardrailStatus] = { - "success": "success", - "blocked": "guardrail_intervened", # legacy - "guardrail_intervened": "guardrail_intervened", # direct - "failure": "guardrail_failed_to_respond", # legacy - "guardrail_failed_to_respond": "guardrail_failed_to_respond", # direct - "not_run": "not_run", - } - - # Set LLM API status - llm_api_status: StandardLoggingPayloadStatus = status - - ######################################################### - # Map - guardrail_information.guardrail_status to guardrail_status - ######################################################### - guardrail_status: GuardrailStatus = "not_run" - if guardrail_information and isinstance(guardrail_information, list): - for information in guardrail_information: - if isinstance(information, dict): - raw_status = information.get("guardrail_status", "not_run") - if raw_status != "not_run": - guardrail_status = GUARDRAIL_STATUS_MAP.get(raw_status, "not_run") - break - - return StandardLoggingPayloadStatusFields( - llm_api_status=llm_api_status, guardrail_status=guardrail_status - ) - - -def _extract_response_obj_and_hidden_params( - init_response_obj: Union[Any, BaseModel, dict], - original_exception: Optional[Exception], -) -> Tuple[dict, Optional[dict]]: - """Extract response_obj and hidden_params from init_response_obj.""" - hidden_params: Optional[dict] = None - if init_response_obj is None: - response_obj = {} - elif isinstance(init_response_obj, BaseModel): - response_obj = init_response_obj.model_dump() - hidden_params = getattr(init_response_obj, "_hidden_params", None) - elif isinstance(init_response_obj, dict): - response_obj = init_response_obj - else: - response_obj = {} - - if original_exception is not None and hidden_params is None: - response_headers = _get_response_headers(original_exception) - if response_headers is not None: - hidden_params = dict( - StandardLoggingHiddenParams( - additional_headers=StandardLoggingPayloadSetup.get_additional_headers( - dict(response_headers) - ), - model_id=None, - cache_key=None, - api_base=None, - response_cost=None, - litellm_overhead_time_ms=None, - batch_models=None, - litellm_model_name=None, - usage_object=None, - ) - ) - - return response_obj, hidden_params - - -def get_standard_logging_object_payload( - kwargs: Optional[dict], - init_response_obj: Union[Any, BaseModel, dict], - start_time: dt_object, - end_time: dt_object, - logging_obj: Logging, - status: StandardLoggingPayloadStatus, - error_str: Optional[str] = None, - original_exception: Optional[Exception] = None, - standard_built_in_tools_params: Optional[StandardBuiltInToolsParams] = None, -) -> Optional[StandardLoggingPayload]: - try: - kwargs = kwargs or {} - - response_obj, hidden_params = _extract_response_obj_and_hidden_params( - init_response_obj, original_exception - ) - - # standardize this function to be used across, s3, dynamoDB, langfuse logging - litellm_params = kwargs.get("litellm_params", {}) or {} - proxy_server_request = litellm_params.get("proxy_server_request") or {} - - # Merge both litellm_metadata and metadata to get complete metadata - metadata: dict = StandardLoggingPayloadSetup.merge_litellm_metadata( - litellm_params - ) - - completion_start_time = kwargs.get("completion_start_time", end_time) - call_type = kwargs.get("call_type") - cache_hit = kwargs.get("cache_hit", False) - usage = StandardLoggingPayloadSetup.get_usage_from_response_obj( - response_obj=response_obj, - combined_usage_object=cast( - Optional[Usage], kwargs.get("combined_usage_object") - ), - ) - - id = response_obj.get("id", kwargs.get("litellm_call_id")) - - _model_id = metadata.get("model_info", {}).get("id", "") - _model_group = metadata.get("model_group", "") - - request_tags = StandardLoggingPayloadSetup._get_request_tags( - litellm_params=litellm_params, proxy_server_request=proxy_server_request - ) - - # cleanup timestamps - ( - start_time_float, - end_time_float, - completion_start_time_float, - ) = StandardLoggingPayloadSetup.cleanup_timestamps( - start_time=start_time, - end_time=end_time, - completion_start_time=completion_start_time, - ) - response_time = StandardLoggingPayloadSetup.get_response_time( - start_time_float=start_time_float, - end_time_float=end_time_float, - completion_start_time_float=completion_start_time_float, - stream=kwargs.get("stream", False), - ) - # clean up litellm hidden params - clean_hidden_params = StandardLoggingPayloadSetup.get_hidden_params( - hidden_params - ) - - # clean up litellm metadata - clean_metadata = StandardLoggingPayloadSetup.get_standard_logging_metadata( - metadata=metadata, - litellm_params=litellm_params, - prompt_integration=kwargs.get("prompt_integration", None), - applied_guardrails=kwargs.get("applied_guardrails", None), - mcp_tool_call_metadata=kwargs.get("mcp_tool_call_metadata", None), - vector_store_request_metadata=kwargs.get( - "vector_store_request_metadata", None - ), - usage_object=usage.model_dump(), - proxy_server_request=proxy_server_request, - start_time=start_time, - response_id=id, - ) - _request_body = proxy_server_request.get("body", {}) - end_user_id = clean_metadata["user_api_key_end_user_id"] or _request_body.get( - "user", None - ) # maintain backwards compatibility with old request body check - - saved_cache_cost: float = 0.0 - if cache_hit is True: - id = f"{id}_cache_hit{time.time()}" # do not duplicate the request id - saved_cache_cost = ( - logging_obj._response_cost_calculator( - result=init_response_obj, cache_hit=False # type: ignore - ) - or 0.0 - ) - - ## Get model cost information ## - base_model = _get_base_model_from_metadata(model_call_details=kwargs) - custom_pricing = use_custom_pricing_for_model(litellm_params=litellm_params) - - model_cost_information = StandardLoggingPayloadSetup.get_model_cost_information( - base_model=base_model, - custom_pricing=custom_pricing, - custom_llm_provider=kwargs.get("custom_llm_provider"), - init_response_obj=init_response_obj, - ) - response_cost: float = kwargs.get("response_cost", 0) or 0.0 - - error_information = StandardLoggingPayloadSetup.get_error_information( - original_exception=original_exception, - ) - - ## get final response object ## - final_response_obj = StandardLoggingPayloadSetup.get_final_response_obj( - response_obj=response_obj, - init_response_obj=init_response_obj, - kwargs=kwargs, - ) - - stream: Optional[bool] = None - if ( - kwargs.get("complete_streaming_response") is not None - or kwargs.get("async_complete_streaming_response") is not None - ) and kwargs.get("stream") is True: - stream = True - - # Reconstruct full model name with provider prefix for logging - # This ensures Bedrock models like "us.anthropic.claude-3-5-sonnet-20240620-v1:0" - # are logged as "bedrock/us.anthropic.claude-3-5-sonnet-20240620-v1:0" - custom_llm_provider = cast(Optional[str], kwargs.get("custom_llm_provider")) - model_name = reconstruct_model_name( - kwargs.get("model", "") or "", custom_llm_provider, metadata - ) - - payload: StandardLoggingPayload = StandardLoggingPayload( - id=str(id), - trace_id=StandardLoggingPayloadSetup._get_standard_logging_payload_trace_id( - logging_obj=logging_obj, - litellm_params=litellm_params, - ), - call_type=call_type or "", - cache_hit=cache_hit, - stream=stream, - status=status, - status_fields=_get_status_fields( - status=status, - guardrail_information=metadata.get( - "standard_logging_guardrail_information", None - ), - error_str=error_str, - ), - custom_llm_provider=custom_llm_provider, - saved_cache_cost=saved_cache_cost, - startTime=start_time_float, - endTime=end_time_float, - completionStartTime=completion_start_time_float, - response_time=response_time, - model=model_name, - metadata=clean_metadata, - cache_key=clean_hidden_params["cache_key"], - response_cost=response_cost, - cost_breakdown=logging_obj.cost_breakdown, - total_tokens=usage.total_tokens, - prompt_tokens=usage.prompt_tokens, - completion_tokens=usage.completion_tokens, - request_tags=request_tags, - end_user=end_user_id or "", - api_base=StandardLoggingPayloadSetup.strip_trailing_slash( - litellm_params.get("api_base", "") - ) - or "", - model_group=_model_group, - model_id=_model_id, - requester_ip_address=clean_metadata.get("requester_ip_address", None), - user_agent=clean_metadata.get("user_agent", None), - messages=StandardLoggingPayloadSetup.append_system_prompt_messages( - kwargs=kwargs, messages=kwargs.get("messages") - ), - response=final_response_obj, - model_parameters=ModelParamHelper.get_standard_logging_model_parameters( - kwargs.get("optional_params", None) or {} - ), - hidden_params=clean_hidden_params, - model_map_information=model_cost_information, - error_str=error_str, - error_information=error_information, - response_cost_failure_debug_info=kwargs.get( - "response_cost_failure_debug_information" - ), - guardrail_information=metadata.get( - "standard_logging_guardrail_information", None - ), - standard_built_in_tools_params=standard_built_in_tools_params, - ) - - # emit_standard_logging_payload(payload) - Moved to success_handler to prevent double emitting - - return payload - except Exception as e: - verbose_logger.exception( - "Error creating standard logging object - {}".format(str(e)) - ) - return None - - -def emit_standard_logging_payload(payload: StandardLoggingPayload): - if os.getenv("LITELLM_PRINT_STANDARD_LOGGING_PAYLOAD"): - print(json.dumps(payload, indent=4)) # noqa - - -def get_standard_logging_metadata( - metadata: Optional[Dict[str, Any]], -) -> StandardLoggingMetadata: - """ - Clean and filter the metadata dictionary to include only the specified keys in StandardLoggingMetadata. - - Args: - metadata (Optional[Dict[str, Any]]): The original metadata dictionary. - - Returns: - StandardLoggingMetadata: A StandardLoggingMetadata object containing the cleaned metadata. - - Note: - - If the input metadata is None or not a dictionary, an empty StandardLoggingMetadata object is returned. - - If 'user_api_key' is present in metadata and is a valid SHA256 hash, it's stored as 'user_api_key_hash'. - """ - # Initialize with default values - clean_metadata = StandardLoggingMetadata( - user_api_key_hash=None, - user_api_key_alias=None, - user_api_key_spend=None, - user_api_key_max_budget=None, - user_api_key_budget_reset_at=None, - user_api_key_team_id=None, - user_api_key_org_id=None, - user_api_key_user_id=None, - user_api_key_user_email=None, - user_api_key_team_alias=None, - spend_logs_metadata=None, - requester_ip_address=None, - user_agent=None, - requester_metadata=None, - user_api_key_end_user_id=None, - prompt_management_metadata=None, - applied_guardrails=None, - mcp_tool_call_metadata=None, - vector_store_request_metadata=None, - usage_object=None, - requester_custom_headers=None, - user_api_key_request_route=None, - cold_storage_object_key=None, - user_api_key_auth_metadata=None, - team_alias=None, - team_id=None, - ) - if isinstance(metadata, dict): - # Update the clean_metadata with values from input metadata that match StandardLoggingMetadata fields - for key in StandardLoggingMetadata.__annotations__.keys(): - if key in metadata: - clean_metadata[key] = metadata[key] # type: ignore - - if metadata.get("user_api_key") is not None: - if is_valid_sha256_hash(str(metadata.get("user_api_key"))): - clean_metadata["user_api_key_hash"] = metadata.get( - "user_api_key" - ) # this is the hash - return clean_metadata - - -def scrub_sensitive_keys_in_metadata(litellm_params: Optional[dict]): - if litellm_params is None: - litellm_params = {} - - metadata = litellm_params.get("metadata", {}) or {} - - ## Extract provider-specific callable values (like langfuse_masking_function) - ## Store them separately so only the intended logger can access them - ## This prevents callables from leaking to other logging integrations - if "langfuse_masking_function" in metadata: - masking_fn = metadata.pop("langfuse_masking_function", None) - if callable(masking_fn): - litellm_params["_langfuse_masking_function"] = masking_fn - litellm_params["metadata"] = metadata - - ## check user_api_key_metadata for sensitive logging keys - cleaned_user_api_key_metadata = {} - if "user_api_key_metadata" in metadata and isinstance( - metadata["user_api_key_metadata"], dict - ): - for k, v in metadata["user_api_key_metadata"].items(): - if k == "logging": # prevent logging user logging keys - cleaned_user_api_key_metadata[ - k - ] = "scrubbed_by_litellm_for_sensitive_keys" - else: - cleaned_user_api_key_metadata[k] = v - - metadata["user_api_key_metadata"] = cleaned_user_api_key_metadata - litellm_params["metadata"] = metadata - - return litellm_params - - -# integration helper function -def modify_integration(integration_name, integration_params): - global supabaseClient - if integration_name == "supabase": - if "table_name" in integration_params: - Supabase.supabase_table_name = integration_params["table_name"] - - -@lru_cache(maxsize=16) -def _get_traceback_str_for_error(error_str: str) -> str: - """ - function wrapped with lru_cache to limit the number of times `traceback.format_exc()` is called - """ - return traceback.format_exc() - - -from decimal import Decimal - -# used for unit testing -from typing import Any, Dict, List, Optional, Union - - -def create_dummy_standard_logging_payload() -> StandardLoggingPayload: - # First create the nested objects with proper typing - model_info = StandardLoggingModelInformation( - model_map_key="gpt-3.5-turbo", model_map_value=None - ) - - metadata = StandardLoggingMetadata( # type: ignore - user_api_key_hash=str("test_hash"), - user_api_key_alias=str("test_alias"), - user_api_key_team_id=str("test_team"), - user_api_key_user_id=str("test_user"), - user_api_key_team_alias=str("test_team_alias"), - user_api_key_org_id=None, - spend_logs_metadata=None, - requester_ip_address=str("127.0.0.1"), - requester_metadata=None, - user_api_key_end_user_id=str("test_end_user"), - ) - - hidden_params = StandardLoggingHiddenParams( - model_id=None, - cache_key=None, - api_base=None, - response_cost=None, - additional_headers=None, - litellm_overhead_time_ms=None, - batch_models=None, - litellm_model_name=None, - usage_object=None, - ) - - # Convert numeric values to appropriate types - response_cost = Decimal("0.1") - start_time = Decimal("1234567890.0") - end_time = Decimal("1234567891.0") - completion_start_time = Decimal("1234567890.5") - saved_cache_cost = Decimal("0.0") - - # Create messages and response with proper typing - messages: List[Dict[str, str]] = [{"role": "user", "content": "Hello, world!"}] - response: Dict[str, List[Dict[str, Dict[str, str]]]] = { - "choices": [{"message": {"content": "Hi there!"}}] - } - - # Main payload initialization - return StandardLoggingPayload( # type: ignore - id=str("test_id"), - call_type=str("completion"), - stream=bool(False), - response_cost=response_cost, - response_cost_failure_debug_info=None, - status=str("success"), - total_tokens=int( - DEFAULT_MOCK_RESPONSE_PROMPT_TOKEN_COUNT - + DEFAULT_MOCK_RESPONSE_COMPLETION_TOKEN_COUNT - ), - prompt_tokens=int(DEFAULT_MOCK_RESPONSE_PROMPT_TOKEN_COUNT), - completion_tokens=int(DEFAULT_MOCK_RESPONSE_COMPLETION_TOKEN_COUNT), - startTime=start_time, - endTime=end_time, - completionStartTime=completion_start_time, - model_map_information=model_info, - model=str("gpt-3.5-turbo"), - model_id=str("model-123"), - model_group=str("openai-gpt"), - custom_llm_provider=str("openai"), - api_base=str("https://api.openai.com"), - metadata=metadata, - cache_hit=bool(False), - cache_key=None, - saved_cache_cost=saved_cache_cost, - request_tags=[], - end_user=None, - requester_ip_address=str("127.0.0.1"), - messages=messages, - response=response, - error_str=None, - model_parameters={"stream": True}, - hidden_params=hidden_params, - ) +# What is this? +## Common Utility file for Logging handler +# Logging function -> log the exact model details + what's being sent | Non-Blocking +import copy +import datetime +import json +import os +import re +import subprocess +import sys +import time +import traceback +from datetime import datetime as dt_object +from functools import lru_cache +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + List, + Literal, + Optional, + Tuple, + Type, + Union, + cast, +) + +from httpx import Response +from pydantic import BaseModel + +import litellm +from litellm import ( + _custom_logger_compatible_callbacks_literal, + json_logs, + log_raw_request_response, + turn_off_message_logging, +) +from litellm._logging import _is_debugging_on, verbose_logger +from litellm._uuid import uuid +from litellm.batches.batch_utils import _handle_completed_batch +from litellm.caching.caching import DualCache, InMemoryCache +from litellm.caching.caching_handler import LLMCachingHandler +from litellm.constants import ( + DEFAULT_MOCK_RESPONSE_COMPLETION_TOKEN_COUNT, + DEFAULT_MOCK_RESPONSE_PROMPT_TOKEN_COUNT, + SENTRY_DENYLIST, + SENTRY_PII_DENYLIST, +) +from litellm.cost_calculator import ( + RealtimeAPITokenUsageProcessor, + _select_model_name_for_cost_calc, +) +from litellm.integrations.agentops import AgentOps +from litellm.integrations.anthropic_cache_control_hook import AnthropicCacheControlHook +from litellm.integrations.arize.arize import ArizeLogger +from litellm.integrations.custom_guardrail import CustomGuardrail +from litellm.integrations.custom_logger import CustomLogger +from litellm.integrations.deepeval.deepeval import DeepEvalLogger +from litellm.integrations.mlflow import MlflowLogger +from litellm.integrations.sqs import SQSLogger +from litellm.litellm_core_utils.core_helpers import reconstruct_model_name +from litellm.litellm_core_utils.get_litellm_params import get_litellm_params +from litellm.litellm_core_utils.llm_cost_calc.tool_call_cost_tracking import ( + StandardBuiltInToolCostTracking, +) +from litellm.litellm_core_utils.model_param_helper import ModelParamHelper +from litellm.litellm_core_utils.redact_messages import ( + redact_message_input_output_from_custom_logger, + redact_message_input_output_from_logging, +) +from litellm.llms.base_llm.ocr.transformation import OCRResponse +from litellm.llms.base_llm.search.transformation import SearchResponse +from litellm.responses.utils import ResponseAPILoggingUtils +from litellm.types.agents import LiteLLMSendMessageResponse +from litellm.types.containers.main import ContainerObject +from litellm.types.llms.openai import ( + AllMessageValues, + Batch, + FineTuningJob, + HttpxBinaryResponseContent, + OpenAIFileObject, + OpenAIModerationResponse, + ResponseAPIUsage, + ResponseCompletedEvent, + ResponsesAPIResponse, +) +from litellm.types.mcp import MCPPostCallResponseObject +from litellm.types.prompts.init_prompts import PromptSpec +from litellm.types.rerank import RerankResponse +from litellm.types.utils import ( + CachingDetails, + CallTypes, + CostBreakdown, + CostResponseTypes, + CustomPricingLiteLLMParams, + DynamicPromptManagementParamLiteral, + EmbeddingResponse, + GuardrailStatus, + ImageResponse, + LiteLLMBatch, + LiteLLMLoggingBaseClass, + LiteLLMRealtimeStreamLoggingObject, + ModelResponse, + ModelResponseStream, + RawRequestTypedDict, + StandardBuiltInToolsParams, + StandardCallbackDynamicParams, + StandardLoggingAdditionalHeaders, + StandardLoggingHiddenParams, + StandardLoggingMCPToolCall, + StandardLoggingMetadata, + StandardLoggingModelCostFailureDebugInformation, + StandardLoggingModelInformation, + StandardLoggingPayload, + StandardLoggingPayloadErrorInformation, + StandardLoggingPayloadStatus, + StandardLoggingPayloadStatusFields, + StandardLoggingPromptManagementMetadata, + StandardLoggingVectorStoreRequest, + TextCompletionResponse, + TranscriptionResponse, + Usage, +) +from litellm.types.videos.main import VideoObject +from litellm.utils import _get_base_model_from_metadata, executor, print_verbose + +from ..integrations.argilla import ArgillaLogger +from ..integrations.arize.arize_phoenix import ArizePhoenixLogger +from ..integrations.athina import AthinaLogger +from ..integrations.azure_sentinel.azure_sentinel import AzureSentinelLogger +from ..integrations.azure_storage.azure_storage import AzureBlobStorageLogger +from ..integrations.custom_prompt_management import CustomPromptManagement +from ..integrations.datadog.datadog import DataDogLogger +from ..integrations.datadog.datadog_llm_obs import DataDogLLMObsLogger +from ..integrations.dotprompt import DotpromptManager +from ..integrations.dynamodb import DyanmoDBLogger +from ..integrations.galileo import GalileoObserve +from ..integrations.gcs_bucket.gcs_bucket import GCSBucketLogger +from ..integrations.gcs_pubsub.pub_sub import GcsPubSubLogger +from ..integrations.greenscale import GreenscaleLogger +from ..integrations.helicone import HeliconeLogger +from ..integrations.humanloop import HumanloopLogger +from ..integrations.lago import LagoLogger +from ..integrations.langfuse.langfuse import LangFuseLogger +from ..integrations.langfuse.langfuse_handler import LangFuseHandler +from ..integrations.langfuse.langfuse_prompt_management import LangfusePromptManagement +from ..integrations.langsmith import LangsmithLogger +from ..integrations.literal_ai import LiteralAILogger +from ..integrations.logfire_logger import LogfireLevel, LogfireLogger +from ..integrations.lunary import LunaryLogger +from ..integrations.openmeter import OpenMeterLogger +from ..integrations.opik.opik import OpikLogger +from ..integrations.posthog import PostHogLogger +from ..integrations.prompt_layer import PromptLayerLogger +from ..integrations.s3 import S3Logger +from ..integrations.s3_v2 import S3Logger as S3V2Logger +from ..integrations.supabase import Supabase +from ..integrations.traceloop import TraceloopLogger +from .exception_mapping_utils import _get_response_headers +from .initialize_dynamic_callback_params import ( + initialize_standard_callback_dynamic_params as _initialize_standard_callback_dynamic_params, +) +from .specialty_caches.dynamic_logging_cache import DynamicLoggingCache + +if TYPE_CHECKING: + from litellm.llms.base_llm.passthrough.transformation import BasePassthroughConfig +try: + from litellm_enterprise.enterprise_callbacks.callback_controls import ( + EnterpriseCallbackControls, + ) + from litellm_enterprise.enterprise_callbacks.pagerduty.pagerduty import ( + PagerDutyAlerting, + ) + from litellm_enterprise.enterprise_callbacks.send_emails.resend_email import ( + ResendEmailLogger, + ) + from litellm_enterprise.enterprise_callbacks.send_emails.sendgrid_email import ( + SendGridEmailLogger, + ) + from litellm_enterprise.enterprise_callbacks.send_emails.smtp_email import ( + SMTPEmailLogger, + ) + from litellm_enterprise.litellm_core_utils.litellm_logging import ( + StandardLoggingPayloadSetup as EnterpriseStandardLoggingPayloadSetup, + ) + + from litellm.integrations.generic_api.generic_api_callback import GenericAPILogger + + EnterpriseStandardLoggingPayloadSetupVAR: Optional[ + Type[EnterpriseStandardLoggingPayloadSetup] + ] = EnterpriseStandardLoggingPayloadSetup +except Exception as e: + verbose_logger.debug( + f"[Non-Blocking] Unable to import GenericAPILogger - LiteLLM Enterprise Feature - {str(e)}" + ) + GenericAPILogger = CustomLogger # type: ignore + ResendEmailLogger = CustomLogger # type: ignore + SendGridEmailLogger = CustomLogger # type: ignore + SMTPEmailLogger = CustomLogger # type: ignore + PagerDutyAlerting = CustomLogger # type: ignore + EnterpriseCallbackControls = None # type: ignore + EnterpriseStandardLoggingPayloadSetupVAR = None +_in_memory_loggers: List[Any] = [] + +_STANDARD_LOGGING_METADATA_KEYS: frozenset = frozenset( + StandardLoggingMetadata.__annotations__.keys() +) + +### GLOBAL VARIABLES ### + +# Cache custom pricing keys as frozenset for O(1) lookups instead of looping through 49 keys +_CUSTOM_PRICING_KEYS: frozenset = frozenset( + CustomPricingLiteLLMParams.model_fields.keys() +) + +sentry_sdk_instance = None +capture_exception = None +add_breadcrumb = None +slack_app = None +alerts_channel = None +heliconeLogger = None +athinaLogger = None +promptLayerLogger = None +logfireLogger = None +weightsBiasesLogger = None +customLogger = None +langFuseLogger = None +openMeterLogger = None +lagoLogger = None +dataDogLogger = None +prometheusLogger = None +dynamoLogger = None +s3Logger = None +greenscaleLogger = None +lunaryLogger = None +supabaseClient = None +deepevalLogger = None +callback_list: Optional[List[str]] = [] +user_logger_fn = None +additional_details: Optional[Dict[str, str]] = {} +local_cache: Optional[Dict[str, str]] = {} +last_fetched_at = None +last_fetched_at_keys = None + + +#### +class ServiceTraceIDCache: + def __init__(self) -> None: + self.cache = InMemoryCache() + + def get_cache(self, litellm_call_id: str, service_name: str) -> Optional[str]: + key_name = "{}:{}".format(service_name, litellm_call_id) + response = self.cache.get_cache(key=key_name) + return response + + def set_cache(self, litellm_call_id: str, service_name: str, trace_id: str) -> None: + key_name = "{}:{}".format(service_name, litellm_call_id) + self.cache.set_cache(key=key_name, value=trace_id) + return None + + +in_memory_trace_id_cache = ServiceTraceIDCache() +in_memory_dynamic_logger_cache = DynamicLoggingCache() + +# Cached lazy import for PrometheusLogger +# Module-level cache to avoid repeated imports while preserving memory benefits +_PrometheusLogger = None + + +def _get_cached_prometheus_logger(): + """ + Get cached PrometheusLogger class. + Lazy imports on first call to avoid loading prometheus.py and utils.py at import time (60MB saved). + Subsequent calls use cached class for better performance. + """ + global _PrometheusLogger + if _PrometheusLogger is None: + from litellm.integrations.prometheus import PrometheusLogger + + _PrometheusLogger = PrometheusLogger + return _PrometheusLogger + + +class Logging(LiteLLMLoggingBaseClass): + global supabaseClient, promptLayerLogger, weightsBiasesLogger, logfireLogger, capture_exception, add_breadcrumb, lunaryLogger, logfireLogger, prometheusLogger, slack_app + custom_pricing: bool = False + stream_options = None + litellm_request_debug: bool = False + + def __init__( + self, + model: str, + messages, + stream, + call_type, + start_time, + litellm_call_id: str, + function_id: str, + litellm_trace_id: Optional[str] = None, + dynamic_input_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = None, + dynamic_success_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = None, + dynamic_async_success_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = None, + dynamic_failure_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = None, + dynamic_async_failure_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = None, + applied_guardrails: Optional[List[str]] = None, + kwargs: Optional[Dict] = None, + log_raw_request_response: bool = False, + ): + _input: Optional[str] = messages # save original value of messages + if messages is not None: + if isinstance(messages, str): + messages = [ + {"role": "user", "content": messages} + ] # convert text completion input to the chat completion format + elif ( + isinstance(messages, list) + and len(messages) > 0 + and isinstance(messages[0], str) + ): + new_messages = [] + for m in messages: + new_messages.append({"role": "user", "content": m}) + messages = new_messages + + self.model = model + self.messages = copy.deepcopy(messages) if messages is not None else None + self.stream = stream + self.start_time = start_time # log the call start time + self.call_type = call_type + self.litellm_call_id = litellm_call_id + self.litellm_trace_id: str = ( + litellm_trace_id if litellm_trace_id else str(uuid.uuid4()) + ) + self.function_id = function_id + self.streaming_chunks: List[Any] = [] # for generating complete stream response + self.sync_streaming_chunks: List[ + Any + ] = [] # for generating complete stream response + self.log_raw_request_response = log_raw_request_response + + # Initialize dynamic callbacks + self.dynamic_input_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = dynamic_input_callbacks + self.dynamic_success_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = dynamic_success_callbacks + self.dynamic_async_success_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = dynamic_async_success_callbacks + self.dynamic_failure_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = dynamic_failure_callbacks + self.dynamic_async_failure_callbacks: Optional[ + List[Union[str, Callable, CustomLogger]] + ] = dynamic_async_failure_callbacks + + # Process dynamic callbacks + self.process_dynamic_callbacks() + + ## DYNAMIC LANGFUSE / GCS / logging callback KEYS ## + self.standard_callback_dynamic_params: StandardCallbackDynamicParams = ( + self.initialize_standard_callback_dynamic_params(kwargs) + ) + self.standard_built_in_tools_params: StandardBuiltInToolsParams = ( + self.initialize_standard_built_in_tools_params(kwargs) + ) + ## TIME TO FIRST TOKEN LOGGING ## + self.completion_start_time: Optional[datetime.datetime] = None + self._llm_caching_handler: Optional[LLMCachingHandler] = None + + # INITIAL LITELLM_PARAMS + litellm_params = {} + if kwargs is not None: + litellm_params = get_litellm_params(**kwargs) + litellm_params = scrub_sensitive_keys_in_metadata(litellm_params) + + self.litellm_params = litellm_params + + # Initialize cost breakdown field + self.cost_breakdown: Optional[CostBreakdown] = None + + # Init Caching related details + self.caching_details: Optional[CachingDetails] = None + + # Passthrough endpoint guardrails config for field targeting + self.passthrough_guardrails_config: Optional[Dict[str, Any]] = None + + self.model_call_details: Dict[str, Any] = { + "litellm_trace_id": litellm_trace_id, + "litellm_call_id": litellm_call_id, + "input": _input, + "litellm_params": litellm_params, + "applied_guardrails": applied_guardrails, + "model": model, + } + + def process_dynamic_callbacks(self): + """ + Initializes CustomLogger compatible callbacks in self.dynamic_* callbacks + + If a callback is in litellm._known_custom_logger_compatible_callbacks, it needs to be intialized and added to the respective dynamic_* callback list. + """ + # Process input callbacks + self.dynamic_input_callbacks = self._process_dynamic_callback_list( + self.dynamic_input_callbacks, dynamic_callbacks_type="input" + ) + + # Process failure callbacks + self.dynamic_failure_callbacks = self._process_dynamic_callback_list( + self.dynamic_failure_callbacks, dynamic_callbacks_type="failure" + ) + + # Process async failure callbacks + self.dynamic_async_failure_callbacks = self._process_dynamic_callback_list( + self.dynamic_async_failure_callbacks, dynamic_callbacks_type="async_failure" + ) + + # Process success callbacks + self.dynamic_success_callbacks = self._process_dynamic_callback_list( + self.dynamic_success_callbacks, dynamic_callbacks_type="success" + ) + + # Process async success callbacks + self.dynamic_async_success_callbacks = self._process_dynamic_callback_list( + self.dynamic_async_success_callbacks, dynamic_callbacks_type="async_success" + ) + + def _process_dynamic_callback_list( + self, + callback_list: Optional[List[Union[str, Callable, CustomLogger]]], + dynamic_callbacks_type: Literal[ + "input", "success", "failure", "async_success", "async_failure" + ], + ) -> Optional[List[Union[str, Callable, CustomLogger]]]: + """ + Helper function to initialize CustomLogger compatible callbacks in self.dynamic_* callbacks + + - If a callback is in litellm._known_custom_logger_compatible_callbacks, + replace the string with the initialized callback class. + - If dynamic callback is a "success" callback that is a known_custom_logger_compatible_callbacks then add it to dynamic_async_success_callbacks + - If dynamic callback is a "failure" callback that is a known_custom_logger_compatible_callbacks then add it to dynamic_failure_callbacks + """ + if callback_list is None: + return None + + processed_list: List[Union[str, Callable, CustomLogger]] = [] + for callback in callback_list: + if ( + isinstance(callback, str) + and callback in litellm._known_custom_logger_compatible_callbacks + ): + callback_class = _init_custom_logger_compatible_class( + callback, internal_usage_cache=None, llm_router=None # type: ignore + ) + if callback_class is not None: + processed_list.append(callback_class) + + # If processing dynamic_success_callbacks, add to dynamic_async_success_callbacks + if dynamic_callbacks_type == "success": + if self.dynamic_async_success_callbacks is None: + self.dynamic_async_success_callbacks = [] + self.dynamic_async_success_callbacks.append(callback_class) + elif dynamic_callbacks_type == "failure": + if self.dynamic_async_failure_callbacks is None: + self.dynamic_async_failure_callbacks = [] + self.dynamic_async_failure_callbacks.append(callback_class) + else: + processed_list.append(callback) + return processed_list + + def initialize_standard_callback_dynamic_params( + self, kwargs: Optional[Dict] = None + ) -> StandardCallbackDynamicParams: + """ + Initialize the standard callback dynamic params from the kwargs + + checks if langfuse_secret_key, gcs_bucket_name in kwargs and sets the corresponding attributes in StandardCallbackDynamicParams + """ + + return _initialize_standard_callback_dynamic_params(kwargs) + + def initialize_standard_built_in_tools_params( + self, kwargs: Optional[Dict] = None + ) -> StandardBuiltInToolsParams: + """ + Initialize the standard built-in tools params from the kwargs + + checks if web_search_options in kwargs or tools and sets the corresponding attribute in StandardBuiltInToolsParams + """ + return StandardBuiltInToolsParams( + web_search_options=StandardBuiltInToolCostTracking._get_web_search_options( + kwargs or {} + ), + file_search=StandardBuiltInToolCostTracking._get_file_search_tool_call( + kwargs or {} + ), + ) + + def update_environment_variables( + self, + litellm_params: Dict, + optional_params: Dict, + model: Optional[str] = None, + user: Optional[str] = None, + **additional_params, + ): + self.optional_params = optional_params + if model is not None: + self.model = model + self.user = user + self.litellm_params = { + **self.litellm_params, + **scrub_sensitive_keys_in_metadata(litellm_params), + } + self.litellm_request_debug = litellm_params.get("litellm_request_debug", False) + self.logger_fn = litellm_params.get("logger_fn", None) + if _is_debugging_on() or self.litellm_request_debug: + verbose_logger.debug(f"self.optional_params: {self.optional_params}") + + self.model_call_details.update( + { + "model": self.model, + "messages": self.messages, + "optional_params": self.optional_params, + "litellm_params": self.litellm_params, + "start_time": self.start_time, + "stream": self.stream, + "user": user, + "call_type": str(self.call_type), + "litellm_call_id": self.litellm_call_id, + "completion_start_time": self.completion_start_time, + "standard_callback_dynamic_params": self.standard_callback_dynamic_params, + **self.optional_params, + **additional_params, + } + ) + + ## check if stream options is set ## - used by CustomStreamWrapper for easy instrumentation + if "stream_options" in additional_params: + self.stream_options = additional_params["stream_options"] + ## check if custom pricing set ## + if any( + litellm_params.get(key) is not None + for key in _CUSTOM_PRICING_KEYS & litellm_params.keys() + ): + self.custom_pricing = True + + if "custom_llm_provider" in self.model_call_details: + self.custom_llm_provider = self.model_call_details["custom_llm_provider"] + + def update_messages(self, messages: List[AllMessageValues]): + """ + Update the logged value of the messages in the model_call_details + + Allows pre-call hooks to update the messages before the call is made + """ + self.messages = messages + self.model_call_details["messages"] = messages + + def should_run_prompt_management_hooks( + self, + non_default_params: Dict, + prompt_id: Optional[str] = None, + tools: Optional[List[Dict]] = None, + ) -> bool: + """ + Return True if prompt management hooks should be run + """ + if prompt_id: + return True + + if self._should_run_prompt_management_hooks_without_prompt_id( + non_default_params=non_default_params, + tools=tools, + ): + return True + + return False + + def _should_run_prompt_management_hooks_without_prompt_id( + self, + non_default_params: Dict, + tools: Optional[List[Dict]] = None, + ) -> bool: + """ + Certain prompt management hooks don't need a `prompt_id` to be passed in, they are triggered by dynamic params + + eg. AnthropicCacheControlHook and BedrockKnowledgeBaseHook both don't require a `prompt_id` to be passed in, they are triggered by dynamic params + """ + for param in non_default_params: + if param in DynamicPromptManagementParamLiteral.list_all_params(): + return True + + ############################################################################# + # Check if Vector Store / Knowledge Base hooks should be applied to the prompt + ############################################################################# + if litellm.vector_store_registry is not None: + if litellm.vector_store_registry.get_vector_store_to_run( + non_default_params=non_default_params, tools=tools + ): + return True + return False + + def get_chat_completion_prompt( + self, + model: str, + messages: List[AllMessageValues], + non_default_params: Dict, + prompt_variables: Optional[dict], + prompt_id: Optional[str] = None, + prompt_spec: Optional[PromptSpec] = None, + prompt_management_logger: Optional[CustomLogger] = None, + prompt_label: Optional[str] = None, + prompt_version: Optional[int] = None, + ) -> Tuple[str, List[AllMessageValues], dict]: + custom_logger = ( + prompt_management_logger + or self.get_custom_logger_for_prompt_management( + model=model, + non_default_params=non_default_params, + prompt_id=prompt_id, + prompt_spec=prompt_spec, + dynamic_callback_params=self.standard_callback_dynamic_params, + ) + ) + + if custom_logger: + ( + model, + messages, + non_default_params, + ) = custom_logger.get_chat_completion_prompt( + model=model, + messages=messages, + non_default_params=non_default_params or {}, + prompt_id=prompt_id, + prompt_spec=prompt_spec, + prompt_variables=prompt_variables, + dynamic_callback_params=self.standard_callback_dynamic_params, + prompt_label=prompt_label, + prompt_version=prompt_version, + ) + self.messages = messages + return model, messages, non_default_params + + async def async_get_chat_completion_prompt( + self, + model: str, + messages: List[AllMessageValues], + non_default_params: Dict, + prompt_variables: Optional[dict], + prompt_id: Optional[str] = None, + prompt_spec: Optional[PromptSpec] = None, + prompt_management_logger: Optional[CustomLogger] = None, + tools: Optional[List[Dict]] = None, + prompt_label: Optional[str] = None, + prompt_version: Optional[int] = None, + ) -> Tuple[str, List[AllMessageValues], dict]: + custom_logger = ( + prompt_management_logger + or self.get_custom_logger_for_prompt_management( + model=model, + tools=tools, + non_default_params=non_default_params, + prompt_id=prompt_id, + prompt_spec=prompt_spec, + dynamic_callback_params=self.standard_callback_dynamic_params, + ) + ) + + if custom_logger: + ( + model, + messages, + non_default_params, + ) = await custom_logger.async_get_chat_completion_prompt( + model=model, + messages=messages, + non_default_params=non_default_params or {}, + prompt_id=prompt_id, + prompt_spec=prompt_spec, + prompt_variables=prompt_variables, + dynamic_callback_params=self.standard_callback_dynamic_params, + litellm_logging_obj=self, + tools=tools, + prompt_label=prompt_label, + prompt_version=prompt_version, + ) + self.messages = messages + return model, messages, non_default_params + + def _auto_detect_prompt_management_logger( + self, + prompt_id: str, + prompt_spec: Optional[PromptSpec], + dynamic_callback_params: StandardCallbackDynamicParams, + ) -> Optional[CustomLogger]: + """ + Auto-detect which prompt management system owns the given prompt_id. + + This allows a user to just pass prompt_id in the completion call and it will be auto-detected which system owns this prompt. + + Args: + prompt_id: The prompt ID to check + dynamic_callback_params: Dynamic callback parameters for should_run_prompt_management checks + + Returns: + A CustomLogger instance if a matching prompt management system is found, None otherwise + """ + prompt_management_loggers = ( + litellm.logging_callback_manager.get_custom_loggers_for_type( + callback_type=CustomPromptManagement + ) + ) + + for logger in prompt_management_loggers: + if isinstance(logger, CustomPromptManagement): + try: + if logger.should_run_prompt_management( + prompt_id=prompt_id, + prompt_spec=prompt_spec, + dynamic_callback_params=dynamic_callback_params, + ): + self.model_call_details[ + "prompt_integration" + ] = logger.__class__.__name__ + return logger + except Exception: + # If check fails, continue to next logger + continue + + return None + + def get_custom_logger_for_prompt_management( + self, + model: str, + non_default_params: Dict, + tools: Optional[List[Dict]] = None, + prompt_id: Optional[str] = None, + prompt_spec: Optional[PromptSpec] = None, + dynamic_callback_params: Optional[StandardCallbackDynamicParams] = None, + ) -> Optional[CustomLogger]: + """ + Get a custom logger for prompt management based on model name or available callbacks. + + Args: + model: The model name to check for prompt management integration + non_default_params: Non-default parameters passed to the completion call + tools: Optional tools passed to the completion call + prompt_id: Optional prompt ID to auto-detect which system owns this prompt + dynamic_callback_params: Dynamic callback parameters for should_run_prompt_management checks + + Returns: + A CustomLogger instance if one is found, None otherwise + """ + # First check if model starts with a known custom logger compatible callback + # This takes precedence for backward compatibility + for callback_name in litellm._known_custom_logger_compatible_callbacks: + if model.startswith(callback_name): + custom_logger = _init_custom_logger_compatible_class( + logging_integration=callback_name, + internal_usage_cache=None, + llm_router=None, + ) + if custom_logger is not None: + self.model_call_details["prompt_integration"] = model.split("/")[0] + return custom_logger + + # If prompt_id is provided, try to auto-detect which system has this prompt + if prompt_id and dynamic_callback_params is not None: + auto_detected_logger = self._auto_detect_prompt_management_logger( + prompt_id=prompt_id, + prompt_spec=prompt_spec, + dynamic_callback_params=dynamic_callback_params, + ) + if auto_detected_logger is not None: + return auto_detected_logger + + # Then check for any registered CustomPromptManagement loggers (fallback) + prompt_management_loggers = ( + litellm.logging_callback_manager.get_custom_loggers_for_type( + callback_type=CustomPromptManagement + ) + ) + + if prompt_management_loggers: + logger = prompt_management_loggers[0] + self.model_call_details["prompt_integration"] = logger.__class__.__name__ + return logger + + if anthropic_cache_control_logger := AnthropicCacheControlHook.get_custom_logger_for_anthropic_cache_control_hook( + non_default_params + ): + self.model_call_details[ + "prompt_integration" + ] = anthropic_cache_control_logger.__class__.__name__ + return anthropic_cache_control_logger + + ######################################################### + # Vector Store / Knowledge Base hooks + ######################################################### + if litellm.vector_store_registry is not None: + vector_store_custom_logger = _init_custom_logger_compatible_class( + logging_integration="vector_store_pre_call_hook", + internal_usage_cache=None, + llm_router=None, + ) + self.model_call_details[ + "prompt_integration" + ] = vector_store_custom_logger.__class__.__name__ + # Add to global callbacks so post-call hooks are invoked + if ( + vector_store_custom_logger + and vector_store_custom_logger not in litellm.callbacks + ): + litellm.logging_callback_manager.add_litellm_callback( + vector_store_custom_logger + ) + return vector_store_custom_logger + + return None + + def get_custom_logger_for_anthropic_cache_control_hook( + self, non_default_params: Dict + ) -> Optional[CustomLogger]: + if non_default_params.get("cache_control_injection_points", None): + custom_logger = _init_custom_logger_compatible_class( + logging_integration="anthropic_cache_control_hook", + internal_usage_cache=None, + llm_router=None, + ) + return custom_logger + return None + + def _get_raw_request_body(self, data: Optional[Union[dict, str]]) -> dict: + if data is None: + return {"error": "Received empty dictionary for raw request body"} + if isinstance(data, str): + try: + return json.loads(data) + except Exception: + return { + "error": "Unable to parse raw request body. Got - {}".format(data) + } + return data + + def _get_masked_api_base(self, api_base: str) -> str: + if "key=" in api_base: + # Find the position of "key=" in the string + key_index = api_base.find("key=") + 4 + # Mask the last 5 characters after "key=" + masked_api_base = api_base[:key_index] + "*" * 5 + api_base[-4:] + else: + masked_api_base = api_base + return str(masked_api_base) + + def _pre_call(self, input, api_key, model=None, additional_args={}): + """ + Common helper function across the sync + async pre-call function + """ + + self.model_call_details["input"] = input + self.model_call_details["api_key"] = api_key + self.model_call_details["additional_args"] = additional_args + self.model_call_details["log_event_type"] = "pre_api_call" + if ( + model + ): # if model name was changes pre-call, overwrite the initial model call name with the new one + self.model_call_details["model"] = model + self.model_call_details["litellm_params"][ + "api_base" + ] = self._get_masked_api_base(additional_args.get("api_base", "")) + + def pre_call(self, input, api_key, model=None, additional_args={}): # noqa: PLR0915 + # Log the exact input to the LLM API + litellm.error_logs["PRE_CALL"] = locals() + try: + self._pre_call( + input=input, + api_key=api_key, + model=model, + additional_args=additional_args, + ) + + # User Logging -> if you pass in a custom logging function + self._print_llm_call_debugging_log( + api_base=additional_args.get("api_base", ""), + headers=additional_args.get("headers", {}), + additional_args=additional_args, + ) + # log raw request to provider (like LangFuse) -- if opted in. + if ( + self.log_raw_request_response is True + or log_raw_request_response is True + ): + _litellm_params = self.model_call_details.get("litellm_params", {}) + _metadata = _litellm_params.get("metadata", {}) or {} + try: + # [Non-blocking Extra Debug Information in metadata] + if turn_off_message_logging is True: + _metadata[ + "raw_request" + ] = "redacted by litellm. \ + 'litellm.turn_off_message_logging=True'" + else: + curl_command = self._get_request_curl_command( + api_base=additional_args.get("api_base", ""), + headers=additional_args.get("headers", {}), + additional_args=additional_args, + data=additional_args.get("complete_input_dict", {}), + ) + + _metadata["raw_request"] = str(curl_command) + # split up, so it's easier to parse in the UI + self.model_call_details[ + "raw_request_typed_dict" + ] = RawRequestTypedDict( + raw_request_api_base=str( + additional_args.get("api_base") or "" + ), + raw_request_body=self._get_raw_request_body( + additional_args.get("complete_input_dict", {}) + ), + # NOTE: setting ignore_sensitive_headers to True will cause + # the Authorization header to be leaked when calls to the health + # endpoint are made and fail. + raw_request_headers=self._get_masked_headers( + additional_args.get("headers", {}) or {}, + ), + error=None, + ) + except Exception as e: + self.model_call_details[ + "raw_request_typed_dict" + ] = RawRequestTypedDict( + error=str(e), + ) + _metadata[ + "raw_request" + ] = "Unable to Log \ + raw request: {}".format( + str(e) + ) + if getattr(self, "logger_fn", None) and callable(self.logger_fn): + try: + self.logger_fn( + self.model_call_details + ) # Expectation: any logger function passed in by the user should accept a dict object + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( + str(e) + ) + ) + + self.model_call_details["api_call_start_time"] = datetime.datetime.now() + # Input Integration Logging -> If you want to log the fact that an attempt to call the model was made + callbacks = litellm.input_callback + (self.dynamic_input_callbacks or []) + for callback in callbacks: + try: + if callback == "supabase" and supabaseClient is not None: + verbose_logger.debug("reaches supabase for logging!") + model = self.model_call_details["model"] + messages = self.model_call_details["input"] + verbose_logger.debug(f"supabaseClient: {supabaseClient}") + supabaseClient.input_log_event( + model=model, + messages=messages, + end_user=self.model_call_details.get("user", "default"), + litellm_call_id=self.litellm_params["litellm_call_id"], + print_verbose=print_verbose, + ) + elif callback == "sentry" and add_breadcrumb: + try: + details_to_log = copy.deepcopy(self.model_call_details) + except Exception: + details_to_log = self.model_call_details + if litellm.turn_off_message_logging: + # make a copy of the _model_Call_details and log it + details_to_log.pop("messages", None) + details_to_log.pop("input", None) + details_to_log.pop("prompt", None) + + add_breadcrumb( + category="litellm.llm_call", + message=f"Model Call Details pre-call: {details_to_log}", + level="info", + ) + + elif isinstance(callback, CustomLogger): # custom logger class + callback.log_pre_api_call( + model=self.model, + messages=self.messages, + kwargs=self.model_call_details, + ) + elif ( + callable(callback) and customLogger is not None + ): # custom logger functions + customLogger.log_input_event( + model=self.model, + messages=self.messages, + kwargs=self.model_call_details, + print_verbose=print_verbose, + callback_func=callback, + ) + except Exception as e: + verbose_logger.exception( + "litellm.Logging.pre_call(): Exception occured - {}".format( + str(e) + ) + ) + verbose_logger.debug( + f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" + ) + if capture_exception: # log this error to sentry for debugging + capture_exception(e) + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( + str(e) + ) + ) + verbose_logger.error( + f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" + ) + if capture_exception: # log this error to sentry for debugging + capture_exception(e) + + def _print_llm_call_debugging_log( + self, + api_base: str, + headers: dict, + additional_args: dict, + ): + """ + Internal debugging helper function + + Prints the RAW curl command sent from LiteLLM + """ + if _is_debugging_on() or self.litellm_request_debug: + if json_logs: + masked_headers = self._get_masked_headers(headers) + if self.litellm_request_debug: + verbose_logger.warning( # .warning ensures this shows up in all environments + "POST Request Sent from LiteLLM", + extra={"api_base": {api_base}, **masked_headers}, + ) + else: + verbose_logger.debug( + "POST Request Sent from LiteLLM", + extra={"api_base": {api_base}, **masked_headers}, + ) + else: + headers = additional_args.get("headers", {}) + if headers is None: + headers = {} + data = additional_args.get("complete_input_dict", {}) + api_base = str(additional_args.get("api_base", "")) + curl_command = self._get_request_curl_command( + api_base=api_base, + headers=headers, + additional_args=additional_args, + data=data, + ) + if self.litellm_request_debug: + verbose_logger.warning( + f"\033[92m{curl_command}\033[0m\n" + ) # .warning ensures this shows up in all environments + else: + verbose_logger.debug(f"\033[92m{curl_command}\033[0m\n") + + def _get_request_body(self, data: dict) -> str: + return str(data) + + def _get_request_curl_command( + self, api_base: str, headers: Optional[dict], additional_args: dict, data: dict + ) -> str: + masked_api_base = self._get_masked_api_base(api_base) + if headers is None: + headers = {} + curl_command = "\n\nPOST Request Sent from LiteLLM:\n" + curl_command += "curl -X POST \\\n" + curl_command += f"{masked_api_base} \\\n" + masked_headers = self._get_masked_headers(headers) + formatted_headers = " ".join( + [f"-H '{k}: {v}'" for k, v in masked_headers.items()] + ) + curl_command += ( + f"{formatted_headers} \\\n" if formatted_headers.strip() != "" else "" + ) + curl_command += f"-d '{self._get_request_body(data)}'\n" + if additional_args.get("request_str", None) is not None: + # print the sagemaker / bedrock client request + curl_command = "\nRequest Sent from LiteLLM:\n" + request_str = additional_args.get("request_str", "") + curl_command += request_str + elif api_base == "": + curl_command = str(self.model_call_details) + return curl_command + + def _get_masked_headers( + self, headers: dict, ignore_sensitive_headers: bool = False + ) -> dict: + """ + Internal debugging helper function + + Masks the headers of the request sent from LiteLLM + """ + return _get_masked_values( + headers, ignore_sensitive_values=ignore_sensitive_headers + ) + + def post_call( + self, original_response, input=None, api_key=None, additional_args={} + ): + # Log the exact result from the LLM API, for streaming - log the type of response received + litellm.error_logs["POST_CALL"] = locals() + if isinstance(original_response, dict): + original_response = json.dumps(original_response) + try: + self.model_call_details["input"] = input + self.model_call_details["api_key"] = api_key + self.model_call_details["original_response"] = original_response + self.model_call_details["additional_args"] = additional_args + self.model_call_details["log_event_type"] = "post_api_call" + + if self.litellm_request_debug: + attr = "warning" + else: + attr = "debug" + + if json_logs: + callattr = getattr(verbose_logger, attr) + callattr( + "RAW RESPONSE:\n{}\n\n".format( + self.model_call_details.get( + "original_response", self.model_call_details + ) + ), + ) + else: + callattr = getattr(verbose_logger, attr) + callattr( + "RAW RESPONSE:\n{}\n\n".format( + self.model_call_details.get( + "original_response", self.model_call_details + ) + ) + ) + if getattr(self, "logger_fn", None) and callable(self.logger_fn): + try: + self.logger_fn( + self.model_call_details + ) # Expectation: any logger function passed in by the user should accept a dict object + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( + str(e) + ) + ) + original_response = redact_message_input_output_from_logging( + model_call_details=( + self.model_call_details + if hasattr(self, "model_call_details") + else {} + ), + result=original_response, + ) + # Input Integration Logging -> If you want to log the fact that an attempt to call the model was made + + callbacks = litellm.input_callback + (self.dynamic_input_callbacks or []) + for callback in callbacks: + try: + if callback == "sentry" and add_breadcrumb: + verbose_logger.debug("reaches sentry breadcrumbing") + try: + details_to_log = copy.deepcopy(self.model_call_details) + except Exception: + details_to_log = self.model_call_details + if litellm.turn_off_message_logging: + # make a copy of the _model_Call_details and log it + details_to_log.pop("messages", None) + details_to_log.pop("input", None) + details_to_log.pop("prompt", None) + + add_breadcrumb( + category="litellm.llm_call", + message=f"Model Call Details post-call: {details_to_log}", + level="info", + ) + elif isinstance(callback, CustomLogger): # custom logger class + callback.log_post_api_call( + kwargs=self.model_call_details, + response_obj=None, + start_time=self.start_time, + end_time=None, + ) + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while post-call logging with integrations {}".format( + str(e) + ) + ) + verbose_logger.debug( + f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" + ) + if capture_exception: # log this error to sentry for debugging + capture_exception(e) + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( + str(e) + ) + ) + + async def async_post_mcp_tool_call_hook( + self, + kwargs: dict, + response_obj: Any, + start_time: datetime.datetime, + end_time: datetime.datetime, + ): + """ + Post MCP Tool Call Hook + + Use this to modify the MCP tool call response before it is returned to the user. + """ + from litellm.types.llms.base import HiddenParams + from litellm.types.mcp import MCPPostCallResponseObject + + callbacks = self.get_combined_callback_list( + dynamic_success_callbacks=self.dynamic_success_callbacks, + global_callbacks=litellm.success_callback, + ) + post_mcp_tool_call_response_obj: MCPPostCallResponseObject = ( + MCPPostCallResponseObject( + mcp_tool_call_response=response_obj, hidden_params=HiddenParams() + ) + ) + for callback in callbacks: + try: + if isinstance(callback, CustomLogger): + response: Optional[ + MCPPostCallResponseObject + ] = await callback.async_post_mcp_tool_call_hook( + kwargs=kwargs, + response_obj=post_mcp_tool_call_response_obj, + start_time=start_time, + end_time=end_time, + ) + ###################################################################### + # if any of the callbacks modify the response, use the modified response + # current implementation returns the first modified response + ###################################################################### + if response is not None: + response_obj = self._parse_post_mcp_call_hook_response( + response=response + ) + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {}".format( + str(e) + ) + ) + return response_obj + + def _parse_post_mcp_call_hook_response( + self, response: Optional[MCPPostCallResponseObject] + ) -> Any: + """ + Parse the response from the post_mcp_tool_call_hook + + 1. Unpack the mcp_tool_call_response + 2. save the updated response_cost to the model_call_details + """ + if response is None: + return None + self.model_call_details["response_cost"] = response.hidden_params.response_cost + return response.mcp_tool_call_response + + def get_response_ms(self) -> float: + return ( + self.model_call_details.get("end_time", datetime.datetime.now()) + - self.model_call_details.get("start_time", datetime.datetime.now()) + ).total_seconds() * 1000 + + def set_cost_breakdown( + self, + input_cost: float, + output_cost: float, + total_cost: float, + cost_for_built_in_tools_cost_usd_dollar: float, + additional_costs: Optional[dict] = None, + original_cost: Optional[float] = None, + discount_percent: Optional[float] = None, + discount_amount: Optional[float] = None, + margin_percent: Optional[float] = None, + margin_fixed_amount: Optional[float] = None, + margin_total_amount: Optional[float] = None, + ) -> None: + """ + Helper method to store cost breakdown in the logging object. + + Args: + input_cost: Cost of input/prompt tokens + output_cost: Cost of output/completion tokens + cost_for_built_in_tools_cost_usd_dollar: Cost of built-in tools + total_cost: Total cost of request + additional_costs: Free-form additional costs dict (e.g., {"azure_model_router_flat_cost": 0.00014}) + original_cost: Cost before discount + discount_percent: Discount percentage (0.05 = 5%) + discount_amount: Discount amount in USD + margin_percent: Margin percentage applied (0.10 = 10%) + margin_fixed_amount: Fixed margin amount in USD + margin_total_amount: Total margin added in USD + """ + + self.cost_breakdown = CostBreakdown( + input_cost=input_cost, + output_cost=output_cost, + total_cost=total_cost, + tool_usage_cost=cost_for_built_in_tools_cost_usd_dollar, + ) + + # Store additional costs if provided (free-form dict for extensibility) + if ( + additional_costs + and isinstance(additional_costs, dict) + and len(additional_costs) > 0 + ): + self.cost_breakdown["additional_costs"] = additional_costs + + # Store discount information if provided + if original_cost is not None: + self.cost_breakdown["original_cost"] = original_cost + if discount_percent is not None: + self.cost_breakdown["discount_percent"] = discount_percent + if discount_amount is not None: + self.cost_breakdown["discount_amount"] = discount_amount + + # Store margin information if provided + if margin_percent is not None: + self.cost_breakdown["margin_percent"] = margin_percent + if margin_fixed_amount is not None: + self.cost_breakdown["margin_fixed_amount"] = margin_fixed_amount + if margin_total_amount is not None: + self.cost_breakdown["margin_total_amount"] = margin_total_amount + + def _response_cost_calculator( + self, + result: Union[ + ModelResponse, + ModelResponseStream, + EmbeddingResponse, + ImageResponse, + TranscriptionResponse, + TextCompletionResponse, + HttpxBinaryResponseContent, + RerankResponse, + Batch, + FineTuningJob, + ResponsesAPIResponse, + ResponseCompletedEvent, + OpenAIFileObject, + LiteLLMRealtimeStreamLoggingObject, + OpenAIModerationResponse, + "SearchResponse", + ], + cache_hit: Optional[bool] = None, + litellm_model_name: Optional[str] = None, + router_model_id: Optional[str] = None, + ) -> Optional[float]: + """ + Calculate response cost using result + logging object variables. + + used for consistent cost calculation across response headers + logging integrations. + """ + + if isinstance(result, BaseModel) and hasattr(result, "_hidden_params"): + hidden_params = getattr(result, "_hidden_params", {}) + if ( + "response_cost" in hidden_params + and hidden_params["response_cost"] is not None + ): # use cost if already calculated + return hidden_params["response_cost"] + elif ( + router_model_id is None and "model_id" in hidden_params + ): # use model_id if not already set + router_model_id = hidden_params["model_id"] + + ## RESPONSE COST ## + custom_pricing = use_custom_pricing_for_model( + litellm_params=( + self.litellm_params if hasattr(self, "litellm_params") else None + ) + ) + + prompt = "" # use for tts cost calc + _input = self.model_call_details.get("input", None) + if _input is not None and isinstance(_input, str): + prompt = _input + + if cache_hit is None: + cache_hit = self.model_call_details.get("cache_hit", False) + + try: + response_cost_calculator_kwargs = { + "response_object": result, + "model": litellm_model_name or self.model, + "cache_hit": cache_hit, + "custom_llm_provider": self.model_call_details.get( + "custom_llm_provider", None + ), + "base_model": _get_base_model_from_metadata( + model_call_details=self.model_call_details + ), + "call_type": self.call_type, + "optional_params": self.optional_params, + "custom_pricing": custom_pricing, + "prompt": prompt, + "standard_built_in_tools_params": self.standard_built_in_tools_params, + "router_model_id": router_model_id, + "litellm_logging_obj": self, + "service_tier": ( + self.optional_params.get("service_tier") + if self.optional_params + else None + ), + } + except Exception as e: # error creating kwargs for cost calculation + debug_info = StandardLoggingModelCostFailureDebugInformation( + error_str=str(e), + traceback_str=_get_traceback_str_for_error(str(e)), + ) + verbose_logger.debug( + f"response_cost_failure_debug_information: {debug_info}" + ) + self.model_call_details[ + "response_cost_failure_debug_information" + ] = debug_info + return None + + try: + response_cost = litellm.response_cost_calculator( + **response_cost_calculator_kwargs + ) + + verbose_logger.debug(f"response_cost: {response_cost}") + return response_cost + except Exception as e: # error calculating cost + debug_info = StandardLoggingModelCostFailureDebugInformation( + error_str=str(e), + traceback_str=_get_traceback_str_for_error(str(e)), + model=response_cost_calculator_kwargs["model"], + cache_hit=response_cost_calculator_kwargs["cache_hit"], + custom_llm_provider=response_cost_calculator_kwargs[ + "custom_llm_provider" + ], + base_model=response_cost_calculator_kwargs["base_model"], + call_type=response_cost_calculator_kwargs["call_type"], + custom_pricing=response_cost_calculator_kwargs["custom_pricing"], + ) + verbose_logger.debug( + f"response_cost_failure_debug_information: {debug_info}" + ) + self.model_call_details[ + "response_cost_failure_debug_information" + ] = debug_info + + return None + + async def _response_cost_calculator_async( + self, + result: Union[ + ModelResponse, + ModelResponseStream, + EmbeddingResponse, + ImageResponse, + TranscriptionResponse, + TextCompletionResponse, + HttpxBinaryResponseContent, + RerankResponse, + Batch, + FineTuningJob, + ], + cache_hit: Optional[bool] = None, + ) -> Optional[float]: + return self._response_cost_calculator(result=result, cache_hit=cache_hit) + + def should_run_logging( + self, + event_type: Literal[ + "async_success", "sync_success", "async_failure", "sync_failure" + ], + stream: bool = False, + ) -> bool: + try: + if self.model_call_details.get(f"has_logged_{event_type}", False) is True: + return False + + return True + except Exception: + return True + + def has_run_logging( + self, + event_type: Literal[ + "async_success", "sync_success", "async_failure", "sync_failure" + ], + ) -> None: + if self.stream is not None and self.stream is True: + """ + Ignore check on stream, as there can be multiple chunks + """ + return + self.model_call_details[f"has_logged_{event_type}"] = True + return + + def should_run_callback( + self, callback: litellm.CALLBACK_TYPES, litellm_params: dict, event_hook: str + ) -> bool: + if litellm.global_disable_no_log_param: + return True + + if litellm_params.get("no-log", False) is True: + # proxy cost tracking cal backs should run + + if not ( + isinstance(callback, CustomLogger) + and "_PROXY_" in callback.__class__.__name__ + ): + verbose_logger.debug( + f"no-log request, skipping logging for {event_hook} event" + ) + return False + + # Check for dynamically disabled callbacks via headers + if ( + EnterpriseCallbackControls is not None + and EnterpriseCallbackControls.is_callback_disabled_dynamically( + callback=callback, + litellm_params=litellm_params, + standard_callback_dynamic_params=self.standard_callback_dynamic_params, + ) + ): + verbose_logger.debug( + f"Callback {callback} disabled via x-litellm-disable-callbacks header for {event_hook} event" + ) + return False + + return True + + def _update_completion_start_time(self, completion_start_time: datetime.datetime): + self.completion_start_time = completion_start_time + self.model_call_details["completion_start_time"] = self.completion_start_time + + def normalize_logging_result(self, result: Any) -> Any: + """ + Some endpoints return a different type of result than what is expected by the logging system. + This function is used to normalize the result to the expected type. + """ + logging_result = result + if self.call_type == CallTypes.arealtime.value and isinstance(result, list): + combined_usage_object = RealtimeAPITokenUsageProcessor.collect_and_combine_usage_from_realtime_stream_results( + results=result + ) + logging_result = ( + RealtimeAPITokenUsageProcessor.create_logging_realtime_object( + usage=combined_usage_object, + results=result, + ) + ) + + elif ( + self.call_type == CallTypes.llm_passthrough_route.value + or self.call_type == CallTypes.allm_passthrough_route.value + ) and isinstance(result, Response): + from litellm.utils import ProviderConfigManager + + provider_config = ProviderConfigManager.get_provider_passthrough_config( + provider=self.model_call_details.get("custom_llm_provider", ""), + model=self.model, + ) + if provider_config is not None: + logging_result = provider_config.logging_non_streaming_response( + model=self.model, + custom_llm_provider=self.model_call_details.get( + "custom_llm_provider", "" + ), + httpx_response=result, + request_data=self.model_call_details.get("request_data", {}), + logging_obj=self, + endpoint=self.model_call_details.get("endpoint", ""), + ) + return logging_result + + def _process_hidden_params_and_response_cost( + self, + logging_result, + start_time, + end_time, + ): + hidden_params = getattr(logging_result, "_hidden_params", {}) + if hidden_params: + if self.model_call_details.get("litellm_params") is not None: + self.model_call_details["litellm_params"].setdefault("metadata", {}) + if self.model_call_details["litellm_params"]["metadata"] is None: + self.model_call_details["litellm_params"]["metadata"] = {} + self.model_call_details["litellm_params"]["metadata"]["hidden_params"] = getattr(logging_result, "_hidden_params", {}) # type: ignore + + if "response_cost" in hidden_params: + self.model_call_details["response_cost"] = hidden_params["response_cost"] + else: + self.model_call_details["response_cost"] = self._response_cost_calculator( + result=logging_result + ) + + self.model_call_details[ + "standard_logging_object" + ] = get_standard_logging_object_payload( + kwargs=self.model_call_details, + init_response_obj=logging_result, + start_time=start_time, + end_time=end_time, + logging_obj=self, + status="success", + standard_built_in_tools_params=self.standard_built_in_tools_params, + ) + + def _transform_usage_objects(self, result): + if isinstance(result, ResponsesAPIResponse): + result = result.model_copy() + transformed_usage = ( + ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( + result.usage + ) + ) + setattr(result, "usage", transformed_usage) + if ( + standard_logging_payload := self.model_call_details.get( + "standard_logging_object" + ) + ) is not None: + response_dict = ( + result.model_dump() + if hasattr(result, "model_dump") + else dict(result) + ) + # Ensure usage is properly included with transformed chat format + if transformed_usage is not None: + response_dict["usage"] = ( + transformed_usage.model_dump() + if hasattr(transformed_usage, "model_dump") + else dict(transformed_usage) + ) + standard_logging_payload["response"] = response_dict + elif isinstance(result, TranscriptionResponse): + from litellm.litellm_core_utils.llm_cost_calc.usage_object_transformation import ( + TranscriptionUsageObjectTransformation, + ) + + result = result.model_copy() + transformed_usage = TranscriptionUsageObjectTransformation.transform_transcription_usage_object(result.usage) # type: ignore + setattr(result, "usage", transformed_usage) + return result + + def _success_handler_helper_fn( + self, + result=None, + start_time=None, + end_time=None, + cache_hit=None, + standard_logging_object: Optional[StandardLoggingPayload] = None, + ): + try: + if start_time is None: + start_time = self.start_time + if end_time is None: + end_time = datetime.datetime.now() + if self.completion_start_time is None: + self.completion_start_time = end_time + self.model_call_details[ + "completion_start_time" + ] = self.completion_start_time + + self.model_call_details["log_event_type"] = "successful_api_call" + self.model_call_details["end_time"] = end_time + self.model_call_details["cache_hit"] = cache_hit + + if self.call_type == CallTypes.anthropic_messages.value: + result = self._handle_anthropic_messages_response_logging(result=result) + elif ( + self.call_type == CallTypes.generate_content.value + or self.call_type == CallTypes.agenerate_content.value + ): + result = self._handle_non_streaming_google_genai_generate_content_response_logging( + result=result + ) + elif ( + self.call_type == CallTypes.asend_message.value + or self.call_type == CallTypes.send_message.value + ): + result = self._handle_a2a_response_logging(result=result) + + logging_result = self.normalize_logging_result(result=result) + + if ( + standard_logging_object is None + and result is not None + and self.stream is not True + ): + if self._is_recognized_call_type_for_logging( + logging_result=logging_result + ): + self._process_hidden_params_and_response_cost( + logging_result=logging_result, + start_time=start_time, + end_time=end_time, + ) + elif isinstance(result, dict) or isinstance(result, list): + self.model_call_details[ + "standard_logging_object" + ] = get_standard_logging_object_payload( + kwargs=self.model_call_details, + init_response_obj=result, + start_time=start_time, + end_time=end_time, + logging_obj=self, + status="success", + standard_built_in_tools_params=self.standard_built_in_tools_params, + ) + elif standard_logging_object is not None: + self.model_call_details[ + "standard_logging_object" + ] = standard_logging_object + else: + self.model_call_details["response_cost"] = None + + result = self._transform_usage_objects(result=result) + + if ( + litellm.max_budget + and self.stream is False + and result is not None + and isinstance(result, dict) + and "content" in result + ): + time_diff = (end_time - start_time).total_seconds() + float_diff = float(time_diff) + litellm._current_cost += litellm.completion_cost( + model=self.model, + prompt="", + completion=getattr(result, "content", ""), + total_time=float_diff, + standard_built_in_tools_params=self.standard_built_in_tools_params, + ) + + return start_time, end_time, result + except Exception as e: + raise Exception(f"[Non-Blocking] LiteLLM.Success_Call Error: {str(e)}") + + def _is_recognized_call_type_for_logging( + self, + logging_result: Any, + ): + """ + Returns True if the call type is recognized for logging (eg. ModelResponse, ModelResponseStream, etc.) + """ + if ( + isinstance(logging_result, ModelResponse) + or isinstance(logging_result, ModelResponseStream) + or isinstance(logging_result, EmbeddingResponse) + or isinstance(logging_result, ImageResponse) + or isinstance(logging_result, TranscriptionResponse) + or isinstance(logging_result, TextCompletionResponse) + or isinstance(logging_result, HttpxBinaryResponseContent) # tts + or isinstance(logging_result, RerankResponse) + or isinstance(logging_result, FineTuningJob) + or isinstance(logging_result, LiteLLMBatch) + or isinstance(logging_result, ResponsesAPIResponse) + or isinstance(logging_result, OpenAIFileObject) + or isinstance(logging_result, LiteLLMRealtimeStreamLoggingObject) + or isinstance(logging_result, OpenAIModerationResponse) + or isinstance(logging_result, OCRResponse) # OCR + or isinstance(logging_result, SearchResponse) # Search API + or isinstance(logging_result, dict) + and logging_result.get("object") == "vector_store.search_results.page" + or isinstance(logging_result, dict) + and logging_result.get("object") == "search" # Search API (dict format) + or isinstance(logging_result, VideoObject) + or isinstance(logging_result, ContainerObject) + or isinstance(logging_result, LiteLLMSendMessageResponse) # A2A + or (self.call_type == CallTypes.call_mcp_tool.value) + ): + return True + return False + + def _flush_passthrough_collected_chunks_helper( + self, + raw_bytes: List[bytes], + provider_config: "BasePassthroughConfig", + ) -> Optional["CostResponseTypes"]: + all_chunks = provider_config._convert_raw_bytes_to_str_lines(raw_bytes) + complete_streaming_response = provider_config.handle_logging_collected_chunks( + all_chunks=all_chunks, + litellm_logging_obj=self, + model=self.model, + custom_llm_provider=self.model_call_details.get("custom_llm_provider", ""), + endpoint=self.model_call_details.get("endpoint", ""), + ) + return complete_streaming_response + + def flush_passthrough_collected_chunks( + self, + raw_bytes: List[bytes], + provider_config: "BasePassthroughConfig", + ): + """ + Flush collected chunks from the logging object + This is used to log the collected chunks once streaming is done on passthrough endpoints + + 1. Decode the raw bytes to string lines + 2. Get the complete streaming response from the provider config + 3. Log the complete streaming response (trigger success handler) + This is used for passthrough endpoints + """ + complete_streaming_response = self._flush_passthrough_collected_chunks_helper( + raw_bytes=raw_bytes, + provider_config=provider_config, + ) + + if complete_streaming_response is not None: + self.success_handler(result=complete_streaming_response) + return + + async def async_flush_passthrough_collected_chunks( + self, + raw_bytes: List[bytes], + provider_config: "BasePassthroughConfig", + ): + complete_streaming_response = self._flush_passthrough_collected_chunks_helper( + raw_bytes=raw_bytes, + provider_config=provider_config, + ) + + if complete_streaming_response is not None: + await self.async_success_handler(result=complete_streaming_response) + return + + def success_handler( # noqa: PLR0915 + self, result=None, start_time=None, end_time=None, cache_hit=None, **kwargs + ): + verbose_logger.debug( + f"Logging Details LiteLLM-Success Call: Cache_hit={cache_hit}" + ) + if not self.should_run_logging( + event_type="sync_success" + ): # prevent double logging + return + start_time, end_time, result = self._success_handler_helper_fn( + start_time=start_time, + end_time=end_time, + result=result, + cache_hit=cache_hit, + standard_logging_object=kwargs.get("standard_logging_object", None), + ) + litellm_params = self.model_call_details.get("litellm_params", {}) + is_sync_request = ( + litellm_params.get(CallTypes.acompletion.value, False) is not True + and litellm_params.get(CallTypes.aresponses.value, False) is not True + and litellm_params.get(CallTypes.aembedding.value, False) is not True + and litellm_params.get(CallTypes.aimage_generation.value, False) is not True + and litellm_params.get(CallTypes.atranscription.value, False) is not True + ) + try: + ## BUILD COMPLETE STREAMED RESPONSE + complete_streaming_response: Optional[ + Union[ModelResponse, TextCompletionResponse, ResponsesAPIResponse] + ] = None + if "complete_streaming_response" in self.model_call_details: + return # break out of this. + complete_streaming_response = self._get_assembled_streaming_response( + result=result, + start_time=start_time, + end_time=end_time, + is_async=False, + streaming_chunks=self.sync_streaming_chunks, + ) + if complete_streaming_response is not None: + verbose_logger.debug( + "Logging Details LiteLLM-Success Call streaming complete" + ) + self.model_call_details[ + "complete_streaming_response" + ] = complete_streaming_response + self.model_call_details[ + "response_cost" + ] = self._response_cost_calculator(result=complete_streaming_response) + ## STANDARDIZED LOGGING PAYLOAD + self.model_call_details[ + "standard_logging_object" + ] = get_standard_logging_object_payload( + kwargs=self.model_call_details, + init_response_obj=complete_streaming_response, + start_time=start_time, + end_time=end_time, + logging_obj=self, + status="success", + standard_built_in_tools_params=self.standard_built_in_tools_params, + ) + if ( + standard_logging_payload := self.model_call_details.get( + "standard_logging_object" + ) + ) is not None: + # Only emit for sync requests (async_success_handler handles async) + if is_sync_request: + emit_standard_logging_payload(standard_logging_payload) + callbacks = self.get_combined_callback_list( + dynamic_success_callbacks=self.dynamic_success_callbacks, + global_callbacks=litellm.success_callback, + ) + + ## REDACT MESSAGES ## + result = redact_message_input_output_from_logging( + model_call_details=( + self.model_call_details + if hasattr(self, "model_call_details") + else {} + ), + result=result, + ) + ## LOGGING HOOK ## + for callback in callbacks: + if isinstance(callback, CustomLogger): + self.model_call_details, result = callback.logging_hook( + kwargs=self.model_call_details, + result=result, + call_type=self.call_type, + ) + + self.has_run_logging(event_type="sync_success") + for callback in callbacks: + try: + should_run = self.should_run_callback( + callback=callback, + litellm_params=litellm_params, + event_hook="success_handler", + ) + if not should_run: + continue + if callback == "promptlayer" and promptLayerLogger is not None: + print_verbose("reaches promptlayer for logging!") + promptLayerLogger.log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + if callback == "supabase" and supabaseClient is not None: + print_verbose("reaches supabase for logging!") + kwargs = self.model_call_details + + # this only logs streaming once, complete_streaming_response exists i.e when stream ends + if self.stream: + if "complete_streaming_response" not in kwargs: + continue + else: + print_verbose("reaches supabase for streaming logging!") + result = kwargs["complete_streaming_response"] + + model = kwargs["model"] + messages = kwargs["messages"] + optional_params = kwargs.get("optional_params", {}) + litellm_params = kwargs.get("litellm_params", {}) + supabaseClient.log_event( + model=model, + messages=messages, + end_user=optional_params.get("user", "default"), + response_obj=result, + start_time=start_time, + end_time=end_time, + litellm_call_id=( + current_call_id + if ( + current_call_id := litellm_params.get( + "litellm_call_id" + ) + ) + is not None + else str(uuid.uuid4()) + ), + print_verbose=print_verbose, + ) + if callback == "wandb" and weightsBiasesLogger is not None: + print_verbose("reaches wandb for logging!") + weightsBiasesLogger.log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + if callback == "logfire" and logfireLogger is not None: + verbose_logger.debug("reaches logfire for success logging!") + kwargs = {} + for k, v in self.model_call_details.items(): + if ( + k != "original_response" + ): # copy.deepcopy raises errors as this could be a coroutine + kwargs[k] = v + + # this only logs streaming once, complete_streaming_response exists i.e when stream ends + if self.stream: + if "complete_streaming_response" not in kwargs: + continue + else: + print_verbose("reaches logfire for streaming logging!") + result = kwargs["complete_streaming_response"] + + logfireLogger.log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + level=LogfireLevel.INFO.value, # type: ignore + ) + + if callback == "lunary" and lunaryLogger is not None: + print_verbose("reaches lunary for logging!") + model = self.model + kwargs = self.model_call_details + + input = kwargs.get("messages", kwargs.get("input", None)) + + type = ( + "embed" + if self.call_type == CallTypes.embedding.value + else "llm" + ) + + # this only logs streaming once, complete_streaming_response exists i.e when stream ends + if self.stream: + if "complete_streaming_response" not in kwargs: + continue + else: + result = kwargs["complete_streaming_response"] + + lunaryLogger.log_event( + type=type, + kwargs=kwargs, + event="end", + model=model, + input=input, + user_id=kwargs.get("user", None), + # user_props=self.model_call_details.get("user_props", None), + extra=kwargs.get("optional_params", {}), + response_obj=result, + start_time=start_time, + end_time=end_time, + run_id=self.litellm_call_id, + print_verbose=print_verbose, + ) + if callback == "helicone" and heliconeLogger is not None: + print_verbose("reaches helicone for logging!") + model = self.model + messages = self.model_call_details["input"] + kwargs = self.model_call_details + + # this only logs streaming once, complete_streaming_response exists i.e when stream ends + if self.stream: + if "complete_streaming_response" not in kwargs: + continue + else: + print_verbose("reaches helicone for streaming logging!") + result = kwargs["complete_streaming_response"] + + heliconeLogger.log_success( + model=model, + messages=messages, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + kwargs=kwargs, + ) + if callback == "langfuse": + global langFuseLogger + print_verbose("reaches langfuse for success logging!") + kwargs = {} + for k, v in self.model_call_details.items(): + if ( + k != "original_response" + ): # copy.deepcopy raises errors as this could be a coroutine + kwargs[k] = v + # this only logs streaming once, complete_streaming_response exists i.e when stream ends + if self.stream: + verbose_logger.debug( + f"is complete_streaming_response in kwargs: {kwargs.get('complete_streaming_response', None)}" + ) + if complete_streaming_response is None: + continue + else: + print_verbose("reaches langfuse for streaming logging!") + result = kwargs["complete_streaming_response"] + + langfuse_logger_to_use = LangFuseHandler.get_langfuse_logger_for_request( + globalLangfuseLogger=langFuseLogger, + standard_callback_dynamic_params=self.standard_callback_dynamic_params, + in_memory_dynamic_logger_cache=in_memory_dynamic_logger_cache, + ) + if langfuse_logger_to_use is not None: + _response = langfuse_logger_to_use.log_event_on_langfuse( + kwargs=kwargs, + response_obj=result, + start_time=start_time, + end_time=end_time, + user_id=kwargs.get("user", None), + ) + if _response is not None and isinstance(_response, dict): + _trace_id = _response.get("trace_id", None) + if _trace_id is not None: + in_memory_trace_id_cache.set_cache( + litellm_call_id=self.litellm_call_id, + service_name="langfuse", + trace_id=_trace_id, + ) + if callback == "greenscale" and greenscaleLogger is not None: + kwargs = {} + for k, v in self.model_call_details.items(): + if ( + k != "original_response" + ): # copy.deepcopy raises errors as this could be a coroutine + kwargs[k] = v + # this only logs streaming once, complete_streaming_response exists i.e when stream ends + if self.stream: + verbose_logger.debug( + f"is complete_streaming_response in kwargs: {kwargs.get('complete_streaming_response', None)}" + ) + if complete_streaming_response is None: + continue + else: + print_verbose( + "reaches greenscale for streaming logging!" + ) + result = kwargs["complete_streaming_response"] + + greenscaleLogger.log_event( + kwargs=kwargs, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + if callback == "athina" and athinaLogger is not None: + deep_copy = {} + for k, v in self.model_call_details.items(): + deep_copy[k] = v + athinaLogger.log_event( + kwargs=deep_copy, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + if callback == "traceloop": + deep_copy = {} + for k, v in self.model_call_details.items(): + if k != "original_response": + deep_copy[k] = v + traceloopLogger.log_event( + kwargs=deep_copy, + response_obj=result, + start_time=start_time, + end_time=end_time, + user_id=kwargs.get("user", None), + print_verbose=print_verbose, + ) + if callback == "s3": + global s3Logger + if s3Logger is None: + s3Logger = S3Logger() + if self.stream: + if "complete_streaming_response" in self.model_call_details: + print_verbose( + "S3Logger Logger: Got Stream Event - Completed Stream Response" + ) + s3Logger.log_event( + kwargs=self.model_call_details, + response_obj=self.model_call_details[ + "complete_streaming_response" + ], + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + else: + print_verbose( + "S3Logger Logger: Got Stream Event - No complete stream response as yet" + ) + else: + s3Logger.log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + + if callback == "openmeter" and is_sync_request: + global openMeterLogger + if openMeterLogger is None: + print_verbose("Instantiates openmeter client") + openMeterLogger = OpenMeterLogger() + if self.stream and complete_streaming_response is None: + openMeterLogger.log_stream_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + else: + if self.stream and complete_streaming_response: + self.model_call_details[ + "complete_response" + ] = self.model_call_details.get( + "complete_streaming_response", {} + ) + result = self.model_call_details["complete_response"] + openMeterLogger.log_success_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + if ( + isinstance(callback, CustomLogger) + and is_sync_request + and self.call_type + != CallTypes.pass_through.value # pass-through endpoints call async_log_success_event + ): # custom logger class + if self.stream and complete_streaming_response is None: + callback.log_stream_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + else: + if self.stream and complete_streaming_response: + self.model_call_details[ + "complete_response" + ] = self.model_call_details.get( + "complete_streaming_response", {} + ) + result = self.model_call_details["complete_response"] + + callback.log_success_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + if ( + callable(callback) is True + and is_sync_request + and customLogger is not None + ): # custom logger functions + print_verbose( + "success callbacks: Running Custom Callback Function - {}".format( + callback + ) + ) + + customLogger.log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + callback_func=callback, + ) + + except Exception as e: + print_verbose( + f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while success logging with integrations {traceback.format_exc()}" + ) + print_verbose( + f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" + ) + if capture_exception: # log this error to sentry for debugging + capture_exception(e) + # Track callback logging failures in Prometheus + try: + self._handle_callback_failure(callback=callback) + except Exception: + pass + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while success logging {}".format( + str(e) + ), + ) + + async def async_success_handler( # noqa: PLR0915 + self, result=None, start_time=None, end_time=None, cache_hit=None, **kwargs + ): + """ + Implementing async callbacks, to handle asyncio event loop issues when custom integrations need to use async functions. + """ + print_verbose( + "Logging Details LiteLLM-Async Success Call, cache_hit={}".format(cache_hit) + ) + if not self.should_run_logging( + event_type="async_success" + ): # prevent double logging + return + + ## CALCULATE COST FOR BATCH JOBS + if self.call_type == CallTypes.aretrieve_batch.value and isinstance( + result, LiteLLMBatch + ): + litellm_params = self.litellm_params or {} + litellm_metadata = litellm_params.get("litellm_metadata") or {} + if ( + litellm_metadata.get("batch_ignore_default_logging", False) is True + ): # polling job will query these frequently, don't spam db logs + return + + from litellm.proxy.openai_files_endpoints.common_utils import ( + _is_base64_encoded_unified_file_id, + ) + + # check if file id is a unified file id + is_base64_unified_file_id = _is_base64_encoded_unified_file_id(result.id) + + batch_cost = kwargs.get("batch_cost", None) + batch_usage = kwargs.get("batch_usage", None) + batch_models = kwargs.get("batch_models", None) + has_explicit_batch_data = all( + x is not None for x in (batch_cost, batch_usage, batch_models) + ) + + should_compute_batch_data = ( + not is_base64_unified_file_id + or not has_explicit_batch_data + and result.status == "completed" + ) + if has_explicit_batch_data: + result._hidden_params["response_cost"] = batch_cost + result._hidden_params["batch_models"] = batch_models + result.usage = batch_usage + + elif should_compute_batch_data: + ( + response_cost, + batch_usage, + batch_models, + ) = await _handle_completed_batch( + batch=result, + custom_llm_provider=self.custom_llm_provider, + litellm_params=self.litellm_params, + ) + + result._hidden_params["response_cost"] = response_cost + result._hidden_params["batch_models"] = batch_models + result.usage = batch_usage + + start_time, end_time, result = self._success_handler_helper_fn( + start_time=start_time, + end_time=end_time, + result=result, + cache_hit=cache_hit, + standard_logging_object=kwargs.get("standard_logging_object", None), + ) + + ## BUILD COMPLETE STREAMED RESPONSE + if "async_complete_streaming_response" in self.model_call_details: + return # break out of this. + complete_streaming_response: Optional[ + Union[ModelResponse, TextCompletionResponse, ResponsesAPIResponse] + ] = self._get_assembled_streaming_response( + result=result, + start_time=start_time, + end_time=end_time, + is_async=True, + streaming_chunks=self.streaming_chunks, + ) + + if complete_streaming_response is not None: + print_verbose("Async success callbacks: Got a complete streaming response") + + self.model_call_details[ + "async_complete_streaming_response" + ] = complete_streaming_response + + try: + if self.model_call_details.get("cache_hit", False) is True: + self.model_call_details["response_cost"] = 0.0 + else: + # check if base_model set on azure + _get_base_model_from_metadata( + model_call_details=self.model_call_details + ) + # base_model defaults to None if not set on model_info + self.model_call_details[ + "response_cost" + ] = self._response_cost_calculator( + result=complete_streaming_response + ) + + verbose_logger.debug( + f"Model={self.model}; cost={self.model_call_details['response_cost']}" + ) + except litellm.NotFoundError: + verbose_logger.warning( + f"Model={self.model} not found in completion cost map. Setting 'response_cost' to None" + ) + self.model_call_details["response_cost"] = None + + ## STANDARDIZED LOGGING PAYLOAD + self.model_call_details[ + "standard_logging_object" + ] = get_standard_logging_object_payload( + kwargs=self.model_call_details, + init_response_obj=complete_streaming_response, + start_time=start_time, + end_time=end_time, + logging_obj=self, + status="success", + standard_built_in_tools_params=self.standard_built_in_tools_params, + ) + + # print standard logging payload + if ( + standard_logging_payload := self.model_call_details.get( + "standard_logging_object" + ) + ) is not None: + emit_standard_logging_payload(standard_logging_payload) + elif self.call_type == "pass_through_endpoint": + print_verbose( + "Async success callbacks: Got a pass-through endpoint response" + ) + + self.model_call_details["async_complete_streaming_response"] = result + + # cost calculation not possible for pass-through + self.model_call_details["response_cost"] = None + + ## STANDARDIZED LOGGING PAYLOAD + self.model_call_details[ + "standard_logging_object" + ] = get_standard_logging_object_payload( + kwargs=self.model_call_details, + init_response_obj=result, + start_time=start_time, + end_time=end_time, + logging_obj=self, + status="success", + standard_built_in_tools_params=self.standard_built_in_tools_params, + ) + + # print standard logging payload + if ( + standard_logging_payload := self.model_call_details.get( + "standard_logging_object" + ) + ) is not None: + emit_standard_logging_payload(standard_logging_payload) + callbacks = self.get_combined_callback_list( + dynamic_success_callbacks=self.dynamic_async_success_callbacks, + global_callbacks=litellm._async_success_callback, + ) + + result = redact_message_input_output_from_logging( + model_call_details=( + self.model_call_details if hasattr(self, "model_call_details") else {} + ), + result=result, + ) + + ## LOGGING HOOK ## + + for callback in callbacks: + if isinstance(callback, CustomGuardrail): + from litellm.types.guardrails import GuardrailEventHooks + + if ( + callback.should_run_guardrail( + data=self.model_call_details, + event_type=GuardrailEventHooks.logging_only, + ) + is not True + ): + continue + + self.model_call_details, result = await callback.async_logging_hook( + kwargs=self.model_call_details, + result=result, + call_type=self.call_type, + ) + elif isinstance(callback, CustomLogger): + result = redact_message_input_output_from_custom_logger( + result=result, litellm_logging_obj=self, custom_logger=callback + ) + self.model_call_details, result = await callback.async_logging_hook( + kwargs=self.model_call_details, + result=result, + call_type=self.call_type, + ) + + self.has_run_logging(event_type="async_success") + + for callback in callbacks: + # check if callback can run for this request + litellm_params = self.model_call_details.get("litellm_params", {}) + should_run = self.should_run_callback( + callback=callback, + litellm_params=litellm_params, + event_hook="async_success_handler", + ) + if not should_run: + continue + try: + if callback == "openmeter" and openMeterLogger is not None: + if self.stream is True: + if ( + "async_complete_streaming_response" + in self.model_call_details + ): + await openMeterLogger.async_log_success_event( + kwargs=self.model_call_details, + response_obj=self.model_call_details[ + "async_complete_streaming_response" + ], + start_time=start_time, + end_time=end_time, + ) + else: + await openMeterLogger.async_log_stream_event( # [TODO]: move this to being an async log stream event function + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + else: + await openMeterLogger.async_log_success_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + + if isinstance(callback, CustomLogger): # custom logger class + model_call_details: Dict = self.model_call_details + ################################## + # call redaction hook for custom logger + model_call_details = callback.redact_standard_logging_payload_from_model_call_details( + model_call_details=model_call_details + ) + ################################## + if self.stream is True: + if "async_complete_streaming_response" in model_call_details: + await callback.async_log_success_event( + kwargs=model_call_details, + response_obj=model_call_details[ + "async_complete_streaming_response" + ], + start_time=start_time, + end_time=end_time, + ) + else: + await callback.async_log_stream_event( # [TODO]: move this to being an async log stream event function + kwargs=model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + else: + await callback.async_log_success_event( + kwargs=model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) + if callable(callback): # custom logger functions + global customLogger + if customLogger is None: + customLogger = CustomLogger() + if self.stream: + if ( + "async_complete_streaming_response" + in self.model_call_details + ): + await customLogger.async_log_event( + kwargs=self.model_call_details, + response_obj=self.model_call_details[ + "async_complete_streaming_response" + ], + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + callback_func=callback, + ) + else: + await customLogger.async_log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + callback_func=callback, + ) + if callback == "dynamodb": + global dynamoLogger + if dynamoLogger is None: + dynamoLogger = DyanmoDBLogger() + if self.stream: + if ( + "async_complete_streaming_response" + in self.model_call_details + ): + print_verbose( + "DynamoDB Logger: Got Stream Event - Completed Stream Response" + ) + await dynamoLogger._async_log_event( + kwargs=self.model_call_details, + response_obj=self.model_call_details[ + "async_complete_streaming_response" + ], + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + else: + print_verbose( + "DynamoDB Logger: Got Stream Event - No complete stream response as yet" + ) + else: + await dynamoLogger._async_log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + except Exception: + verbose_logger.error( + f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while success logging {traceback.format_exc()}" + ) + self._handle_callback_failure(callback=callback) + pass + + def _handle_callback_failure(self, callback: Any): + """ + Handle callback logging failures by incrementing Prometheus metrics. + + Works for both sync and async contexts since Prometheus counter increment is synchronous. + + Args: + callback: The callback that failed + """ + try: + callback_name = self._get_callback_name(callback) + + all_callbacks = litellm.logging_callback_manager._get_all_callbacks() + + for callback_obj in all_callbacks: + if hasattr(callback_obj, "increment_callback_logging_failure"): + callback_obj.increment_callback_logging_failure(callback_name=callback_name) # type: ignore + break # Only increment once + + except Exception as e: + verbose_logger.debug(f"Error in _handle_callback_failure: {str(e)}") + + def _failure_handler_helper_fn( + self, exception, traceback_exception, start_time=None, end_time=None + ): + if start_time is None: + start_time = self.start_time + if end_time is None: + end_time = datetime.datetime.now() + + # on some exceptions, model_call_details is not always initialized, this ensures that we still log those exceptions + if not hasattr(self, "model_call_details"): + self.model_call_details = {} + + self.model_call_details["log_event_type"] = "failed_api_call" + self.model_call_details["exception"] = exception + self.model_call_details["traceback_exception"] = traceback_exception + self.model_call_details["end_time"] = end_time + self.model_call_details.setdefault("original_response", None) + self.model_call_details["response_cost"] = 0 + + if hasattr(exception, "headers") and isinstance(exception.headers, dict): + self.model_call_details.setdefault("litellm_params", {}) + metadata = ( + self.model_call_details["litellm_params"].get("metadata", {}) or {} + ) + metadata.update(exception.headers) + + ## STANDARDIZED LOGGING PAYLOAD + + self.model_call_details[ + "standard_logging_object" + ] = get_standard_logging_object_payload( + kwargs=self.model_call_details, + init_response_obj={}, + start_time=start_time, + end_time=end_time, + logging_obj=self, + status="failure", + error_str=str(exception), + original_exception=exception, + standard_built_in_tools_params=self.standard_built_in_tools_params, + ) + return start_time, end_time + + async def special_failure_handlers(self, exception: Exception): + """ + Custom events, emitted for specific failures. + + Currently just for router model group rate limit error + """ + from litellm.types.router import RouterErrors + + litellm_params: dict = self.model_call_details.get("litellm_params") or {} + metadata = litellm_params.get("metadata") or {} + + ## BASE CASE ## check if rate limit error for model group size 1 + is_base_case = False + if metadata.get("model_group_size") is not None: + model_group_size = metadata.get("model_group_size") + if isinstance(model_group_size, int) and model_group_size == 1: + is_base_case = True + ## check if special error ## + if ( + RouterErrors.no_deployments_available.value not in str(exception) + and is_base_case is False + ): + return + + ## get original model group ## + + model_group = metadata.get("model_group") or None + for callback in litellm._async_failure_callback: + if isinstance(callback, CustomLogger): # custom logger class + await callback.log_model_group_rate_limit_error( + exception=exception, + original_model_group=model_group, + kwargs=self.model_call_details, + ) # type: ignore + + def failure_handler( # noqa: PLR0915 + self, exception, traceback_exception, start_time=None, end_time=None + ): + verbose_logger.debug( + f"Logging Details LiteLLM-Failure Call: {litellm.failure_callback}" + ) + if not self.should_run_logging( + event_type="sync_failure" + ): # prevent double logging + return + litellm_params = self.model_call_details.get("litellm_params", {}) + is_sync_request = ( + litellm_params.get(CallTypes.acompletion.value, False) is not True + and litellm_params.get(CallTypes.aresponses.value, False) is not True + and litellm_params.get(CallTypes.aembedding.value, False) is not True + and litellm_params.get(CallTypes.aimage_generation.value, False) is not True + and litellm_params.get(CallTypes.atranscription.value, False) is not True + ) + + try: + start_time, end_time = self._failure_handler_helper_fn( + exception=exception, + traceback_exception=traceback_exception, + start_time=start_time, + end_time=end_time, + ) + callbacks = self.get_combined_callback_list( + dynamic_success_callbacks=self.dynamic_failure_callbacks, + global_callbacks=litellm.failure_callback, + ) + + result = None # result sent to all loggers, init this to None incase it's not created + + result = redact_message_input_output_from_logging( + model_call_details=( + self.model_call_details + if hasattr(self, "model_call_details") + else {} + ), + result=result, + ) + self.has_run_logging(event_type="sync_failure") + for callback in callbacks: + try: + should_run = self.should_run_callback( + callback=callback, + litellm_params=litellm_params, + event_hook="failure_handler", + ) + if not should_run: + continue + if callback == "lunary" and lunaryLogger is not None: + print_verbose("reaches lunary for logging error!") + + model = self.model + + input = self.model_call_details["input"] + + _type = ( + "embed" + if self.call_type == CallTypes.embedding.value + else "llm" + ) + + lunaryLogger.log_event( + kwargs=self.model_call_details, + type=_type, + event="error", + user_id=self.model_call_details.get("user", "default"), + model=model, + input=input, + error=traceback_exception, + run_id=self.litellm_call_id, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + ) + if callback == "sentry": + print_verbose("sending exception to sentry") + if capture_exception: + capture_exception(exception) + else: + print_verbose( + f"capture exception not initialized: {capture_exception}" + ) + elif callback == "supabase" and supabaseClient is not None: + print_verbose("reaches supabase for logging!") + print_verbose(f"supabaseClient: {supabaseClient}") + supabaseClient.log_event( + model=self.model if hasattr(self, "model") else "", + messages=self.messages, + end_user=self.model_call_details.get("user", "default"), + response_obj=result, + start_time=start_time, + end_time=end_time, + litellm_call_id=self.model_call_details["litellm_call_id"], + print_verbose=print_verbose, + ) + if ( + callable(callback) and customLogger is not None + ): # custom logger functions + customLogger.log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + callback_func=callback, + ) + if ( + isinstance(callback, CustomLogger) and is_sync_request + ): # custom logger class + callback.log_failure_event( + start_time=start_time, + end_time=end_time, + response_obj=result, + kwargs=self.model_call_details, + ) + if callback == "langfuse": + global langFuseLogger + verbose_logger.debug("reaches langfuse for logging failure") + kwargs = {} + for k, v in self.model_call_details.items(): + if ( + k != "original_response" + ): # copy.deepcopy raises errors as this could be a coroutine + kwargs[k] = v + # this only logs streaming once, complete_streaming_response exists i.e when stream ends + langfuse_logger_to_use = LangFuseHandler.get_langfuse_logger_for_request( + globalLangfuseLogger=langFuseLogger, + standard_callback_dynamic_params=self.standard_callback_dynamic_params, + in_memory_dynamic_logger_cache=in_memory_dynamic_logger_cache, + ) + _response = langfuse_logger_to_use.log_event_on_langfuse( + start_time=start_time, + end_time=end_time, + response_obj=None, + user_id=kwargs.get("user", None), + status_message=str(exception), + level="ERROR", + kwargs=self.model_call_details, + ) + if _response is not None and isinstance(_response, dict): + _trace_id = _response.get("trace_id", None) + if _trace_id is not None: + in_memory_trace_id_cache.set_cache( + litellm_call_id=self.litellm_call_id, + service_name="langfuse", + trace_id=_trace_id, + ) + if callback == "traceloop": + traceloopLogger.log_event( + start_time=start_time, + end_time=end_time, + response_obj=None, + user_id=self.model_call_details.get("user", None), + print_verbose=print_verbose, + status_message=str(exception), + level="ERROR", + kwargs=self.model_call_details, + ) + if callback == "logfire" and logfireLogger is not None: + verbose_logger.debug("reaches logfire for failure logging!") + kwargs = {} + for k, v in self.model_call_details.items(): + if ( + k != "original_response" + ): # copy.deepcopy raises errors as this could be a coroutine + kwargs[k] = v + kwargs["exception"] = exception + + logfireLogger.log_event( + kwargs=kwargs, + response_obj=result, + start_time=start_time, + end_time=end_time, + level=LogfireLevel.ERROR.value, # type: ignore + print_verbose=print_verbose, + ) + + except Exception as e: + print_verbose( + f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while failure logging with integrations {str(e)}" + ) + print_verbose( + f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" + ) + if capture_exception: # log this error to sentry for debugging + capture_exception(e) + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while failure logging {}".format( + str(e) + ) + ) + + async def async_failure_handler( + self, exception, traceback_exception, start_time=None, end_time=None + ): + """ + Implementing async callbacks, to handle asyncio event loop issues when custom integrations need to use async functions. + """ + await self.special_failure_handlers(exception=exception) + if not self.should_run_logging( + event_type="async_failure" + ): # prevent double logging + return + start_time, end_time = self._failure_handler_helper_fn( + exception=exception, + traceback_exception=traceback_exception, + start_time=start_time, + end_time=end_time, + ) + + callbacks = self.get_combined_callback_list( + dynamic_success_callbacks=self.dynamic_async_failure_callbacks, + global_callbacks=litellm._async_failure_callback, + ) + + result = None # result sent to all loggers, init this to None incase it's not created + + self.has_run_logging(event_type="async_failure") + for callback in callbacks: + try: + litellm_params = self.model_call_details.get("litellm_params", {}) + should_run = self.should_run_callback( + callback=callback, + litellm_params=litellm_params, + event_hook="async_failure_handler", + ) + if not should_run: + continue + if isinstance(callback, CustomLogger): # custom logger class + await callback.async_log_failure_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + ) # type: ignore + if ( + callable(callback) and customLogger is not None + ): # custom logger functions + await customLogger.async_log_event( + kwargs=self.model_call_details, + response_obj=result, + start_time=start_time, + end_time=end_time, + print_verbose=print_verbose, + callback_func=callback, + ) + except Exception as e: + verbose_logger.exception( + "LiteLLM.LoggingError: [Non-Blocking] Exception occurred while failure \ + logging {}\nCallback={}".format( + str(e), callback + ) + ) + # Track callback logging failures in Prometheus + self._handle_callback_failure(callback=callback) + + def _get_trace_id(self, service_name: Literal["langfuse"]) -> Optional[str]: + """ + For the given service (e.g. langfuse), return the trace_id actually logged. + + Used for constructing the url in slack alerting. + + Returns: + - str: The logged trace id + - None: If trace id not yet emitted. + """ + trace_id: Optional[str] = None + if service_name == "langfuse": + trace_id = in_memory_trace_id_cache.get_cache( + litellm_call_id=self.litellm_call_id, service_name=service_name + ) + + return trace_id + + def _get_callback_object(self, service_name: Literal["langfuse"]) -> Optional[Any]: + """ + Return dynamic callback object. + + Meant to solve issue when doing key-based/team-based logging + """ + global langFuseLogger + + if service_name == "langfuse": + if langFuseLogger is None or ( + ( + self.standard_callback_dynamic_params.get("langfuse_public_key") + is not None + and self.standard_callback_dynamic_params.get("langfuse_public_key") + != langFuseLogger.public_key + ) + or ( + self.standard_callback_dynamic_params.get("langfuse_public_key") + is not None + and self.standard_callback_dynamic_params.get("langfuse_public_key") + != langFuseLogger.public_key + ) + or ( + self.standard_callback_dynamic_params.get("langfuse_host") + is not None + and self.standard_callback_dynamic_params.get("langfuse_host") + != langFuseLogger.langfuse_host + ) + ): + return LangFuseLogger( + langfuse_public_key=self.standard_callback_dynamic_params.get( + "langfuse_public_key" + ), + langfuse_secret=self.standard_callback_dynamic_params.get( + "langfuse_secret" + ), + langfuse_host=self.standard_callback_dynamic_params.get( + "langfuse_host" + ), + ) + return langFuseLogger + + return None + + def handle_sync_success_callbacks_for_async_calls( + self, + result: Any, + start_time: datetime.datetime, + end_time: datetime.datetime, + cache_hit: Optional[Any] = None, + ) -> None: + """ + Handles calling success callbacks for Async calls. + + Why: Some callbacks - `langfuse`, `s3` are sync callbacks. We need to call them in the executor. + """ + if self._should_run_sync_callbacks_for_async_calls() is False: + return + + executor.submit( + self.success_handler, + result, + start_time, + end_time, + cache_hit, + ) + + def _should_run_sync_callbacks_for_async_calls(self) -> bool: + """ + Returns: + - bool: True if sync callbacks should be run for async calls. eg. `langfuse`, `s3` + """ + _combined_sync_callbacks = self.get_combined_callback_list( + dynamic_success_callbacks=self.dynamic_success_callbacks, + global_callbacks=litellm.success_callback, + ) + _filtered_success_callbacks = self._remove_internal_custom_logger_callbacks( + _combined_sync_callbacks + ) + _filtered_success_callbacks = self._remove_internal_litellm_callbacks( + _filtered_success_callbacks + ) + return len(_filtered_success_callbacks) > 0 + + def get_combined_callback_list( + self, dynamic_success_callbacks: Optional[List], global_callbacks: List + ) -> List: + if dynamic_success_callbacks is None: + return list(global_callbacks) + return list(set(dynamic_success_callbacks + global_callbacks)) + + def _remove_internal_litellm_callbacks(self, callbacks: List) -> List: + """ + Creates a filtered list of callbacks, excluding internal LiteLLM callbacks. + + Args: + callbacks: List of callback functions/strings to filter + + Returns: + List of filtered callbacks with internal ones removed + """ + filtered = [ + cb for cb in callbacks if not self._is_internal_litellm_proxy_callback(cb) + ] + + verbose_logger.debug(f"Filtered callbacks: {filtered}") + return filtered + + def _get_callback_name(self, cb) -> str: + """ + Helper to get the name of a callback function + + Args: + cb: The callback object/function/string to get the name of + + Returns: + The name of the callback + """ + if isinstance(cb, str): + return cb + if hasattr(cb, "__name__"): + return cb.__name__ + if hasattr(cb, "__func__"): + return cb.__func__.__name__ + if hasattr(cb, "__class__"): + return cb.__class__.__name__ + return str(cb) + + def _is_internal_litellm_proxy_callback(self, cb) -> bool: + """Helper to check if a callback is internal""" + INTERNAL_PREFIXES = [ + "_PROXY", + "_service_logger.ServiceLogging", + "sync_deployment_callback_on_success", + ] + if isinstance(cb, str): + return False + + if not callable(cb): + return True + + cb_name = self._get_callback_name(cb) + return any(prefix in cb_name for prefix in INTERNAL_PREFIXES) + + def _remove_internal_custom_logger_callbacks(self, callbacks: List) -> List: + """ + Removes internal custom logger callbacks from the list. + """ + _new_callbacks = [] + for _c in callbacks: + if isinstance(_c, CustomLogger): + continue + elif ( + isinstance(_c, str) + and _c in litellm._known_custom_logger_compatible_callbacks + ): + continue + _new_callbacks.append(_c) + return _new_callbacks + + def _get_assembled_streaming_response( + self, + result: Union[ + ModelResponse, + TextCompletionResponse, + ModelResponseStream, + ResponseCompletedEvent, + Any, + ], + start_time: datetime.datetime, + end_time: datetime.datetime, + is_async: bool, + streaming_chunks: List[Any], + ) -> Optional[Union[ModelResponse, TextCompletionResponse, ResponsesAPIResponse]]: + if isinstance(result, ModelResponse): + return result + elif isinstance(result, TextCompletionResponse): + return result + elif isinstance(result, ResponseCompletedEvent): + ## return unified Usage object + if isinstance(result.response.usage, ResponseAPIUsage): + transformed_usage = ( + ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( + result.response.usage + ) + ) + # Set as dict instead of Usage object so model_dump() serializes it correctly + setattr( + result.response, + "usage", + ( + transformed_usage.model_dump() + if hasattr(transformed_usage, "model_dump") + else dict(transformed_usage) + ), + ) + return result.response + else: + return None + return None + + def _handle_anthropic_messages_response_logging(self, result: Any) -> ModelResponse: + """ + Handles logging for Anthropic messages responses. + + Args: + result: The response object from the model call + + Returns: + The the response object from the model call + + - For Non-streaming responses, we need to transform the response to a ModelResponse object. + - For streaming responses, anthropic_messages handler calls success_handler with a assembled ModelResponse. + """ + import httpx + + if self.stream and isinstance(result, ModelResponse): + return result + elif isinstance(result, ModelResponse): + return result + + httpx_response = self.model_call_details.get("httpx_response", None) + if httpx_response and isinstance(httpx_response, httpx.Response): + result = litellm.AnthropicConfig().transform_response( + raw_response=httpx_response, + model_response=litellm.ModelResponse(), + model=self.model, + messages=[], + logging_obj=self, + optional_params={}, + api_key="", + request_data={}, + encoding=litellm.encoding, + json_mode=False, + litellm_params={}, + ) + else: + from litellm.types.llms.anthropic import AnthropicResponse + + pydantic_result = AnthropicResponse.model_validate(result) + import httpx + + result = litellm.AnthropicConfig().transform_parsed_response( + completion_response=pydantic_result.model_dump(), + raw_response=httpx.Response( + status_code=200, + headers={}, + ), + model_response=litellm.ModelResponse(), + json_mode=None, + ) + return result + + def _handle_non_streaming_google_genai_generate_content_response_logging( + self, result: Any + ) -> ModelResponse: + """ + Handles logging for Google GenAI generate content responses. + """ + import httpx + + httpx_response = self.model_call_details.get("httpx_response", None) + if httpx_response is None: + raise ValueError("Google GenAI Generate Content: httpx_response is None") + dict_result = httpx_response.json() + result = litellm.VertexGeminiConfig()._transform_google_generate_content_to_openai_model_response( + completion_response=dict_result, + model_response=litellm.ModelResponse(), + model=self.model, + logging_obj=self, + raw_response=httpx.Response( + status_code=200, + headers={}, + ), + ) + return result + + def _handle_a2a_response_logging(self, result: Any) -> Any: + """ + Handles logging for A2A (Agent-to-Agent) responses. + + Adds usage from model_call_details to the result if available. + Uses Pydantic's model_copy to avoid modifying the original response. + + Args: + result: The LiteLLMSendMessageResponse from the A2A call + + Returns: + The response object with usage added if available + """ + # Get usage from model_call_details (set by asend_message) + usage = self.model_call_details.get("usage") + if usage is None: + return result + + # Deep copy result and add usage + result_copy = result.model_copy(deep=True) + result_copy.usage = ( + usage.model_dump() if hasattr(usage, "model_dump") else dict(usage) + ) + return result_copy + + +def _get_masked_values( + sensitive_object: dict, + ignore_sensitive_values: bool = False, + mask_all_values: bool = False, + unmasked_length: int = 4, + number_of_asterisks: Optional[int] = 4, +) -> dict: + """ + Internal debugging helper function + + Masks the headers of the request sent from LiteLLM + + Args: + masked_length: Optional length for the masked portion (number of *). If set, will use exactly this many * + regardless of original string length. The total length will be unmasked_length + masked_length. + """ + sensitive_keywords = [ + "authorization", + "token", + "key", + "secret", + "vertex_credentials", + ] + return { + k: ( + # If ignore_sensitive_values is True, or if this key doesn't contain sensitive keywords, return original value + v + if ignore_sensitive_values + or not any( + sensitive_keyword in k.lower() + for sensitive_keyword in sensitive_keywords + ) + else ( + # Apply masking to sensitive keys + ( + v[: unmasked_length // 2] + + "*" * number_of_asterisks + + v[-unmasked_length // 2 :] + ) + if ( + isinstance(v, str) + and len(v) > unmasked_length + and number_of_asterisks is not None + ) + else ( + ( + v[: unmasked_length // 2] + + "*" * (len(v) - unmasked_length) + + v[-unmasked_length // 2 :] + ) + if (isinstance(v, str) and len(v) > unmasked_length) + else ("*****" if isinstance(v, str) else v) + ) + ) + ) + for k, v in sensitive_object.items() + } + + +def set_callbacks(callback_list, function_id=None): # noqa: PLR0915 + """ + Globally sets the callback client + """ + global sentry_sdk_instance, capture_exception, add_breadcrumb, slack_app, alerts_channel, traceloopLogger, athinaLogger, heliconeLogger, supabaseClient, lunaryLogger, promptLayerLogger, langFuseLogger, customLogger, weightsBiasesLogger, logfireLogger, dynamoLogger, s3Logger, dataDogLogger, prometheusLogger, greenscaleLogger, openMeterLogger, deepevalLogger + + try: + for callback in callback_list: + if callback == "sentry": + try: + import sentry_sdk + except ImportError: + print_verbose("Package 'sentry_sdk' is missing. Installing it...") + subprocess.check_call( + [sys.executable, "-m", "pip", "install", "sentry_sdk"] + ) + import sentry_sdk + from sentry_sdk.scrubber import EventScrubber + + sentry_sdk_instance = sentry_sdk + sentry_trace_rate = ( + os.environ.get("SENTRY_API_TRACE_RATE") + if "SENTRY_API_TRACE_RATE" in os.environ + else "1.0" + ) + sentry_sample_rate = ( + os.environ.get("SENTRY_API_SAMPLE_RATE") + if "SENTRY_API_SAMPLE_RATE" in os.environ + else "1.0" + ) + sentry_sdk_instance.init( + dsn=os.environ.get("SENTRY_DSN"), + traces_sample_rate=float(sentry_trace_rate), # type: ignore + sample_rate=float( + sentry_sample_rate if sentry_sample_rate else 1.0 + ), + send_default_pii=False, # Prevent sending Personal Identifiable Information + event_scrubber=EventScrubber( + denylist=SENTRY_DENYLIST, pii_denylist=SENTRY_PII_DENYLIST + ), + environment=os.environ.get("SENTRY_ENVIRONMENT", "production"), + ) + capture_exception = sentry_sdk_instance.capture_exception + add_breadcrumb = sentry_sdk_instance.add_breadcrumb + elif callback == "slack": + try: + from slack_bolt import App + except ImportError: + print_verbose("Package 'slack_bolt' is missing. Installing it...") + subprocess.check_call( + [sys.executable, "-m", "pip", "install", "slack_bolt"] + ) + from slack_bolt import App + slack_app = App( + token=os.environ.get("SLACK_API_TOKEN"), + signing_secret=os.environ.get("SLACK_API_SECRET"), + ) + alerts_channel = os.environ["SLACK_API_CHANNEL"] + print_verbose(f"Initialized Slack App: {slack_app}") + elif callback == "traceloop": + traceloopLogger = TraceloopLogger() + elif callback == "athina": + athinaLogger = AthinaLogger() + print_verbose("Initialized Athina Logger") + elif callback == "helicone": + heliconeLogger = HeliconeLogger() + elif callback == "lunary": + lunaryLogger = LunaryLogger() + elif callback == "promptlayer": + promptLayerLogger = PromptLayerLogger() + elif callback == "langfuse": + langFuseLogger = LangFuseLogger( + langfuse_public_key=None, langfuse_secret=None, langfuse_host=None + ) + elif callback == "openmeter": + openMeterLogger = OpenMeterLogger() + elif callback == "datadog": + dataDogLogger = DataDogLogger() + elif callback == "dynamodb": + dynamoLogger = DyanmoDBLogger() + elif callback == "s3": + s3Logger = S3Logger() + elif callback == "wandb": + from litellm.integrations.weights_biases import WeightsBiasesLogger + + weightsBiasesLogger = WeightsBiasesLogger() + elif callback == "logfire": + logfireLogger = LogfireLogger() + elif callback == "supabase": + print_verbose("instantiating supabase") + supabaseClient = Supabase() + elif callback == "greenscale": + greenscaleLogger = GreenscaleLogger() + print_verbose("Initialized Greenscale Logger") + elif callable(callback): + customLogger = CustomLogger() + except Exception as e: + raise e + return None + + +def _init_custom_logger_compatible_class( # noqa: PLR0915 + logging_integration: _custom_logger_compatible_callbacks_literal, + internal_usage_cache: Optional[DualCache], + llm_router: Optional[ + Any + ], # expect litellm.Router, but typing errors due to circular import + custom_logger_init_args: Optional[dict] = {}, +) -> Optional[CustomLogger]: + """ + Initialize a custom logger compatible class + """ + try: + custom_logger_init_args = custom_logger_init_args or {} + if logging_integration == "agentops": # Add AgentOps initialization + for callback in _in_memory_loggers: + if isinstance(callback, AgentOps): + return callback # type: ignore + + agentops_logger = AgentOps() + _in_memory_loggers.append(agentops_logger) + return agentops_logger # type: ignore + elif logging_integration == "lago": + for callback in _in_memory_loggers: + if isinstance(callback, LagoLogger): + return callback # type: ignore + + lago_logger = LagoLogger() + _in_memory_loggers.append(lago_logger) + return lago_logger # type: ignore + elif logging_integration == "openmeter": + for callback in _in_memory_loggers: + if isinstance(callback, OpenMeterLogger): + return callback # type: ignore + + _openmeter_logger = OpenMeterLogger() + _in_memory_loggers.append(_openmeter_logger) + return _openmeter_logger # type: ignore + elif logging_integration == "posthog": + for callback in _in_memory_loggers: + if isinstance(callback, PostHogLogger): + return callback # type: ignore + + _posthog_logger = PostHogLogger() + _in_memory_loggers.append(_posthog_logger) + return _posthog_logger # type: ignore + elif logging_integration == "braintrust": + from litellm.integrations.braintrust_logging import BraintrustLogger + + for callback in _in_memory_loggers: + if isinstance(callback, BraintrustLogger): + return callback # type: ignore + + braintrust_logger = BraintrustLogger() + _in_memory_loggers.append(braintrust_logger) + return braintrust_logger # type: ignore + elif logging_integration == "langsmith": + for callback in _in_memory_loggers: + if isinstance(callback, LangsmithLogger): + return callback # type: ignore + + _langsmith_logger = LangsmithLogger() + _in_memory_loggers.append(_langsmith_logger) + return _langsmith_logger # type: ignore + elif logging_integration == "argilla": + for callback in _in_memory_loggers: + if isinstance(callback, ArgillaLogger): + return callback # type: ignore + + _argilla_logger = ArgillaLogger() + _in_memory_loggers.append(_argilla_logger) + return _argilla_logger # type: ignore + elif logging_integration == "literalai": + for callback in _in_memory_loggers: + if isinstance(callback, LiteralAILogger): + return callback # type: ignore + + _literalai_logger = LiteralAILogger() + _in_memory_loggers.append(_literalai_logger) + return _literalai_logger # type: ignore + elif logging_integration == "prometheus": + PrometheusLogger = _get_cached_prometheus_logger() + + for callback in _in_memory_loggers: + if isinstance(callback, PrometheusLogger): + return callback # type: ignore + + _prometheus_logger = PrometheusLogger() + _in_memory_loggers.append(_prometheus_logger) + return _prometheus_logger # type: ignore + elif logging_integration == "datadog": + for callback in _in_memory_loggers: + if isinstance(callback, DataDogLogger): + return callback # type: ignore + + _datadog_logger = DataDogLogger() + _in_memory_loggers.append(_datadog_logger) + return _datadog_logger # type: ignore + elif logging_integration == "datadog_llm_observability": + _datadog_llm_obs_logger = DataDogLLMObsLogger() + _in_memory_loggers.append(_datadog_llm_obs_logger) + return _datadog_llm_obs_logger # type: ignore + elif logging_integration == "azure_sentinel": + for callback in _in_memory_loggers: + if isinstance(callback, AzureSentinelLogger): + return callback # type: ignore + + _azure_sentinel_logger = AzureSentinelLogger() + _in_memory_loggers.append(_azure_sentinel_logger) + return _azure_sentinel_logger # type: ignore + elif logging_integration == "gcs_bucket": + for callback in _in_memory_loggers: + if isinstance(callback, GCSBucketLogger): + return callback # type: ignore + + _gcs_bucket_logger = GCSBucketLogger() + _in_memory_loggers.append(_gcs_bucket_logger) + return _gcs_bucket_logger # type: ignore + elif logging_integration == "s3_v2": + for callback in _in_memory_loggers: + if isinstance(callback, S3V2Logger): + return callback # type: ignore + + _s3_v2_logger = S3V2Logger() + _in_memory_loggers.append(_s3_v2_logger) + return _s3_v2_logger # type: ignore + elif logging_integration == "aws_sqs": + for callback in _in_memory_loggers: + if isinstance(callback, SQSLogger): + return callback # type: ignore + + _aws_sqs_logger = SQSLogger() + _in_memory_loggers.append(_aws_sqs_logger) + return _aws_sqs_logger # type: ignore + elif logging_integration == "azure_storage": + for callback in _in_memory_loggers: + if isinstance(callback, AzureBlobStorageLogger): + return callback # type: ignore + + _azure_storage_logger = AzureBlobStorageLogger() + _in_memory_loggers.append(_azure_storage_logger) + return _azure_storage_logger # type: ignore + elif logging_integration == "opik": + for callback in _in_memory_loggers: + if isinstance(callback, OpikLogger): + return callback # type: ignore + + _opik_logger = OpikLogger() + _in_memory_loggers.append(_opik_logger) + return _opik_logger # type: ignore + elif logging_integration == "arize": + from litellm.integrations.opentelemetry import ( + OpenTelemetry, + OpenTelemetryConfig, + ) + + arize_config = ArizeLogger.get_arize_config() + if arize_config.endpoint is None: + raise ValueError( + "No valid endpoint found for Arize, please set 'ARIZE_ENDPOINT' to your GRPC endpoint or 'ARIZE_HTTP_ENDPOINT' to your HTTP endpoint" + ) + otel_config = OpenTelemetryConfig( + exporter=arize_config.protocol, + endpoint=arize_config.endpoint, + service_name=arize_config.project_name, + ) + + os.environ[ + "OTEL_EXPORTER_OTLP_TRACES_HEADERS" + ] = f"space_id={arize_config.space_key or arize_config.space_id},api_key={arize_config.api_key}" + for callback in _in_memory_loggers: + if ( + isinstance(callback, ArizeLogger) + and callback.callback_name == "arize" + ): + return callback # type: ignore + _arize_otel_logger = ArizeLogger(config=otel_config, callback_name="arize") + _in_memory_loggers.append(_arize_otel_logger) + return _arize_otel_logger # type: ignore + elif logging_integration == "arize_phoenix": + from litellm.integrations.opentelemetry import ( + OpenTelemetry, + OpenTelemetryConfig, + ) + + arize_phoenix_config = ArizePhoenixLogger.get_arize_phoenix_config() + otel_config = OpenTelemetryConfig( + exporter=arize_phoenix_config.protocol, + endpoint=arize_phoenix_config.endpoint, + headers=arize_phoenix_config.otlp_auth_headers, + ) + if arize_phoenix_config.project_name: + existing_attrs = os.environ.get("OTEL_RESOURCE_ATTRIBUTES", "") + # Add openinference.project.name attribute + if existing_attrs: + os.environ[ + "OTEL_RESOURCE_ATTRIBUTES" + ] = f"{existing_attrs},openinference.project.name={arize_phoenix_config.project_name}" + else: + os.environ[ + "OTEL_RESOURCE_ATTRIBUTES" + ] = f"openinference.project.name={arize_phoenix_config.project_name}" + + # Set Phoenix project name from environment variable + phoenix_project_name = os.environ.get("PHOENIX_PROJECT_NAME", None) + if phoenix_project_name: + existing_attrs = os.environ.get("OTEL_RESOURCE_ATTRIBUTES", "") + # Add openinference.project.name attribute + if existing_attrs: + os.environ[ + "OTEL_RESOURCE_ATTRIBUTES" + ] = f"{existing_attrs},openinference.project.name={phoenix_project_name}" + else: + os.environ[ + "OTEL_RESOURCE_ATTRIBUTES" + ] = f"openinference.project.name={phoenix_project_name}" + + # auth can be disabled on local deployments of arize phoenix + if arize_phoenix_config.otlp_auth_headers is not None: + os.environ[ + "OTEL_EXPORTER_OTLP_TRACES_HEADERS" + ] = arize_phoenix_config.otlp_auth_headers + + for callback in _in_memory_loggers: + if ( + isinstance(callback, ArizePhoenixLogger) + and callback.callback_name == "arize_phoenix" + ): + return callback # type: ignore + _arize_phoenix_otel_logger = ArizePhoenixLogger( + config=otel_config, callback_name="arize_phoenix" + ) + _in_memory_loggers.append(_arize_phoenix_otel_logger) + return _arize_phoenix_otel_logger # type: ignore + elif logging_integration == "levo": + from litellm.integrations.levo.levo import LevoLogger + from litellm.integrations.opentelemetry import ( + OpenTelemetry, + OpenTelemetryConfig, + ) + + levo_config = LevoLogger.get_levo_config() + otel_config = OpenTelemetryConfig( + exporter=levo_config.protocol, + endpoint=levo_config.endpoint, + headers=levo_config.otlp_auth_headers, + ) + + # Check if LevoLogger instance already exists + for callback in _in_memory_loggers: + if ( + isinstance(callback, LevoLogger) + and callback.callback_name == "levo" + ): + return callback # type: ignore + + _levo_otel_logger = LevoLogger(config=otel_config, callback_name="levo") + _in_memory_loggers.append(_levo_otel_logger) + return _levo_otel_logger # type: ignore + elif logging_integration == "otel": + from litellm.integrations.opentelemetry import OpenTelemetry + + for callback in _in_memory_loggers: + if type(callback) is OpenTelemetry: + return callback # type: ignore + otel_logger = OpenTelemetry( + **_get_custom_logger_settings_from_proxy_server( + callback_name=logging_integration + ) + ) + _in_memory_loggers.append(otel_logger) + return otel_logger # type: ignore + + elif logging_integration == "galileo": + for callback in _in_memory_loggers: + if isinstance(callback, GalileoObserve): + return callback # type: ignore + + galileo_logger = GalileoObserve() + _in_memory_loggers.append(galileo_logger) + return galileo_logger # type: ignore + elif logging_integration == "cloudzero": + from litellm.integrations.cloudzero.cloudzero import CloudZeroLogger + + for callback in _in_memory_loggers: + if isinstance(callback, CloudZeroLogger): + return callback # type: ignore + cloudzero_logger = CloudZeroLogger() + _in_memory_loggers.append(cloudzero_logger) + return cloudzero_logger # type: ignore + elif logging_integration == "focus": + from litellm.integrations.focus.focus_logger import FocusLogger + + for callback in _in_memory_loggers: + if isinstance(callback, FocusLogger): + return callback # type: ignore + focus_logger = FocusLogger() + _in_memory_loggers.append(focus_logger) + return focus_logger # type: ignore + elif logging_integration == "deepeval": + for callback in _in_memory_loggers: + if isinstance(callback, DeepEvalLogger): + return callback # type: ignore + deepeval_logger = DeepEvalLogger() + _in_memory_loggers.append(deepeval_logger) + return deepeval_logger # type: ignore + + elif logging_integration == "logfire": + if "LOGFIRE_TOKEN" not in os.environ: + raise ValueError("LOGFIRE_TOKEN not found in environment variables") + from litellm.integrations.opentelemetry import ( + OpenTelemetry, + OpenTelemetryConfig, + ) + + logfire_base_url = os.getenv( + "LOGFIRE_BASE_URL", "https://logfire-api.pydantic.dev" + ) + otel_config = OpenTelemetryConfig( + exporter="otlp_http", + endpoint=f"{logfire_base_url.rstrip('/')}/v1/traces", + headers=f"Authorization={os.getenv('LOGFIRE_TOKEN')}", + ) + for callback in _in_memory_loggers: + if isinstance(callback, OpenTelemetry): + return callback # type: ignore + _otel_logger = OpenTelemetry(config=otel_config) + _in_memory_loggers.append(_otel_logger) + return _otel_logger # type: ignore + elif logging_integration == "dynamic_rate_limiter": + from litellm.proxy.hooks.dynamic_rate_limiter import ( + _PROXY_DynamicRateLimitHandler, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, _PROXY_DynamicRateLimitHandler): + return callback # type: ignore + + if internal_usage_cache is None: + raise Exception( + "Internal Error: Cache cannot be empty - internal_usage_cache={}".format( + internal_usage_cache + ) + ) + + dynamic_rate_limiter_obj = _PROXY_DynamicRateLimitHandler( + internal_usage_cache=internal_usage_cache + ) + + if llm_router is not None and isinstance(llm_router, litellm.Router): + dynamic_rate_limiter_obj.update_variables(llm_router=llm_router) + _in_memory_loggers.append(dynamic_rate_limiter_obj) + return dynamic_rate_limiter_obj # type: ignore + elif logging_integration == "dynamic_rate_limiter_v3": + from litellm.proxy.hooks.dynamic_rate_limiter_v3 import ( + _PROXY_DynamicRateLimitHandlerV3, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, _PROXY_DynamicRateLimitHandlerV3): + return callback # type: ignore + + if internal_usage_cache is None: + raise Exception( + "Internal Error: Cache cannot be empty - internal_usage_cache={}".format( + internal_usage_cache + ) + ) + + dynamic_rate_limiter_obj_v3 = _PROXY_DynamicRateLimitHandlerV3( + internal_usage_cache=internal_usage_cache + ) + + if llm_router is not None and isinstance(llm_router, litellm.Router): + dynamic_rate_limiter_obj_v3.update_variables(llm_router=llm_router) + _in_memory_loggers.append(dynamic_rate_limiter_obj_v3) + return dynamic_rate_limiter_obj_v3 # type: ignore + elif logging_integration == "langtrace": + if "LANGTRACE_API_KEY" not in os.environ: + raise ValueError("LANGTRACE_API_KEY not found in environment variables") + + from litellm.integrations.opentelemetry import ( + OpenTelemetry, + OpenTelemetryConfig, + ) + + otel_config = OpenTelemetryConfig( + exporter="otlp_http", + endpoint="https://langtrace.ai/api/trace", + ) + os.environ[ + "OTEL_EXPORTER_OTLP_TRACES_HEADERS" + ] = f"api_key={os.getenv('LANGTRACE_API_KEY')}" + for callback in _in_memory_loggers: + if ( + isinstance(callback, OpenTelemetry) + and callback.callback_name == "langtrace" + ): + return callback # type: ignore + _otel_logger = OpenTelemetry(config=otel_config, callback_name="langtrace") + _in_memory_loggers.append(_otel_logger) + return _otel_logger # type: ignore + + elif logging_integration == "mlflow": + for callback in _in_memory_loggers: + if isinstance(callback, MlflowLogger): + return callback # type: ignore + + _mlflow_logger = MlflowLogger() + _in_memory_loggers.append(_mlflow_logger) + return _mlflow_logger # type: ignore + elif logging_integration == "langfuse": + for callback in _in_memory_loggers: + if isinstance(callback, LangfusePromptManagement): + return callback + + langfuse_logger = LangfusePromptManagement() + _in_memory_loggers.append(langfuse_logger) + return langfuse_logger # type: ignore + elif logging_integration == "langfuse_otel": + from litellm.integrations.langfuse.langfuse_otel import LangfuseOtelLogger + + for callback in _in_memory_loggers: + if ( + isinstance(callback, LangfuseOtelLogger) + and callback.callback_name == "langfuse_otel" + ): + return callback # type: ignore + # Allow LangfuseOtelLogger to initialize its own config safely + # This prevents startup crashes if LANGFUSE keys are not in env (e.g. for dynamic usage) + _otel_logger = LangfuseOtelLogger( + config=None, callback_name="langfuse_otel" + ) + _in_memory_loggers.append(_otel_logger) + return _otel_logger # type: ignore + elif logging_integration == "weave_otel": + from litellm.integrations.opentelemetry import OpenTelemetryConfig + from litellm.integrations.weave.weave_otel import ( + WeaveOtelLogger, + get_weave_otel_config, + ) + + weave_otel_config = get_weave_otel_config() + + otel_config = OpenTelemetryConfig( + exporter=weave_otel_config.protocol, + endpoint=weave_otel_config.endpoint, + headers=weave_otel_config.otlp_auth_headers, + ) + + for callback in _in_memory_loggers: + if ( + isinstance(callback, WeaveOtelLogger) + and callback.callback_name == "weave_otel" + ): + return callback # type: ignore + _otel_logger = WeaveOtelLogger( + config=otel_config, callback_name="weave_otel" + ) + _in_memory_loggers.append(_otel_logger) + return _otel_logger # type: ignore + elif logging_integration == "pagerduty": + for callback in _in_memory_loggers: + if isinstance(callback, PagerDutyAlerting): + return callback + pagerduty_logger = PagerDutyAlerting(**custom_logger_init_args) + _in_memory_loggers.append(pagerduty_logger) + return pagerduty_logger # type: ignore + elif logging_integration == "anthropic_cache_control_hook": + for callback in _in_memory_loggers: + if isinstance(callback, AnthropicCacheControlHook): + return callback + anthropic_cache_control_hook = AnthropicCacheControlHook() + _in_memory_loggers.append(anthropic_cache_control_hook) + return anthropic_cache_control_hook # type: ignore + elif logging_integration == "vector_store_pre_call_hook": + from litellm.integrations.vector_store_integrations.vector_store_pre_call_hook import ( + VectorStorePreCallHook, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, VectorStorePreCallHook): + return callback + vector_store_pre_call_hook = VectorStorePreCallHook() + _in_memory_loggers.append(vector_store_pre_call_hook) + return vector_store_pre_call_hook # type: ignore + elif logging_integration == "gcs_pubsub": + for callback in _in_memory_loggers: + if isinstance(callback, GcsPubSubLogger): + return callback + _gcs_pubsub_logger = GcsPubSubLogger() + _in_memory_loggers.append(_gcs_pubsub_logger) + return _gcs_pubsub_logger # type: ignore + elif logging_integration == "generic_api": + for callback in _in_memory_loggers: + if isinstance(callback, GenericAPILogger): + return callback + generic_api_logger = GenericAPILogger() + _in_memory_loggers.append(generic_api_logger) + return generic_api_logger # type: ignore + elif logging_integration == "resend_email": + for callback in _in_memory_loggers: + if isinstance(callback, ResendEmailLogger): + return callback + resend_email_logger = ResendEmailLogger() + _in_memory_loggers.append(resend_email_logger) + return resend_email_logger # type: ignore + elif logging_integration == "sendgrid_email": + for callback in _in_memory_loggers: + if isinstance(callback, SendGridEmailLogger): + return callback + sendgrid_email_logger = SendGridEmailLogger() + _in_memory_loggers.append(sendgrid_email_logger) + return sendgrid_email_logger # type: ignore + elif logging_integration == "smtp_email": + for callback in _in_memory_loggers: + if isinstance(callback, SMTPEmailLogger): + return callback + smtp_email_logger = SMTPEmailLogger() + _in_memory_loggers.append(smtp_email_logger) + return smtp_email_logger # type: ignore + elif logging_integration == "humanloop": + for callback in _in_memory_loggers: + if isinstance(callback, HumanloopLogger): + return callback + + humanloop_logger = HumanloopLogger() + _in_memory_loggers.append(humanloop_logger) + return humanloop_logger # type: ignore + elif logging_integration == "dotprompt": + for callback in _in_memory_loggers: + if isinstance(callback, DotpromptManager): + return callback + + dotprompt_logger = DotpromptManager() + _in_memory_loggers.append(dotprompt_logger) + return dotprompt_logger # type: ignore + elif logging_integration == "bitbucket": + from litellm.integrations.bitbucket.bitbucket_prompt_manager import ( + BitBucketPromptManager, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, BitBucketPromptManager): + return callback + + # Get global BitBucket config + bitbucket_config = getattr(litellm, "global_bitbucket_config", None) + if bitbucket_config is None: + raise ValueError( + "BitBucket configuration not found. Please set litellm.global_bitbucket_config first." + ) + + bitbucket_logger = BitBucketPromptManager(bitbucket_config=bitbucket_config) + _in_memory_loggers.append(bitbucket_logger) + return bitbucket_logger # type: ignore + elif logging_integration == "gitlab": + from litellm.integrations.gitlab.gitlab_prompt_manager import ( + GitLabPromptManager, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, GitLabPromptManager): + return callback + + # Get global BitBucket config + gitlab_config = getattr(litellm, "global_gitlab_config", None) + if gitlab_config is None: + raise ValueError( + "Gitlab configuration not found. Please set litellm.global_gitlab_config first." + ) + + gitlab_logger = GitLabPromptManager(gitlab_config=gitlab_config) + _in_memory_loggers.append(gitlab_logger) + return gitlab_logger # type: ignore + return None + except Exception as e: + verbose_logger.exception( + f"[Non-Blocking Error] Error initializing custom logger: {e}" + ) + return None + return None + + +def get_custom_logger_compatible_class( # noqa: PLR0915 + logging_integration: _custom_logger_compatible_callbacks_literal, +) -> Optional[CustomLogger]: + try: + if logging_integration == "lago": + for callback in _in_memory_loggers: + if isinstance(callback, LagoLogger): + return callback + elif logging_integration == "openmeter": + for callback in _in_memory_loggers: + if isinstance(callback, OpenMeterLogger): + return callback + elif logging_integration == "braintrust": + from litellm.integrations.braintrust_logging import BraintrustLogger + + for callback in _in_memory_loggers: + if isinstance(callback, BraintrustLogger): + return callback + elif logging_integration == "galileo": + for callback in _in_memory_loggers: + if isinstance(callback, GalileoObserve): + return callback + elif logging_integration == "cloudzero": + from litellm.integrations.cloudzero.cloudzero import CloudZeroLogger + + for callback in _in_memory_loggers: + if isinstance(callback, CloudZeroLogger): + return callback + elif logging_integration == "focus": + from litellm.integrations.focus.focus_logger import FocusLogger + + for callback in _in_memory_loggers: + if isinstance(callback, FocusLogger): + return callback + elif logging_integration == "deepeval": + for callback in _in_memory_loggers: + if isinstance(callback, DeepEvalLogger): + return callback + elif logging_integration == "langsmith": + for callback in _in_memory_loggers: + if isinstance(callback, LangsmithLogger): + return callback + elif logging_integration == "argilla": + for callback in _in_memory_loggers: + if isinstance(callback, ArgillaLogger): + return callback + elif logging_integration == "literalai": + for callback in _in_memory_loggers: + if isinstance(callback, LiteralAILogger): + return callback + elif logging_integration == "prometheus": + PrometheusLogger = _get_cached_prometheus_logger() + for callback in _in_memory_loggers: + if isinstance(callback, PrometheusLogger): + return callback + elif logging_integration == "datadog": + for callback in _in_memory_loggers: + if isinstance(callback, DataDogLogger): + return callback + elif logging_integration == "datadog_llm_observability": + for callback in _in_memory_loggers: + if isinstance(callback, DataDogLLMObsLogger): + return callback + elif logging_integration == "azure_sentinel": + for callback in _in_memory_loggers: + if isinstance(callback, AzureSentinelLogger): + return callback + elif logging_integration == "gcs_bucket": + for callback in _in_memory_loggers: + if isinstance(callback, GCSBucketLogger): + return callback + elif logging_integration == "s3_v2": + for callback in _in_memory_loggers: + if isinstance(callback, S3V2Logger): + return callback + elif logging_integration == "aws_sqs": + for callback in _in_memory_loggers: + if isinstance(callback, SQSLogger): + return callback + _aws_sqs_logger = SQSLogger() + _in_memory_loggers.append(_aws_sqs_logger) + return _aws_sqs_logger # type: ignore + elif logging_integration == "azure_storage": + for callback in _in_memory_loggers: + if isinstance(callback, AzureBlobStorageLogger): + return callback + elif logging_integration == "opik": + for callback in _in_memory_loggers: + if isinstance(callback, OpikLogger): + return callback + elif logging_integration == "langfuse": + for callback in _in_memory_loggers: + if isinstance(callback, LangfusePromptManagement): + return callback + elif logging_integration == "otel": + from litellm.integrations.opentelemetry import OpenTelemetry + + for callback in _in_memory_loggers: + if isinstance(callback, OpenTelemetry): + return callback + elif logging_integration == "arize": + if "ARIZE_API_KEY" not in os.environ: + raise ValueError("ARIZE_API_KEY not found in environment variables") + for callback in _in_memory_loggers: + if ( + isinstance(callback, ArizeLogger) + and callback.callback_name == "arize" + ): + return callback + elif logging_integration == "logfire": + if "LOGFIRE_TOKEN" not in os.environ: + raise ValueError("LOGFIRE_TOKEN not found in environment variables") + from litellm.integrations.opentelemetry import OpenTelemetry + + for callback in _in_memory_loggers: + if isinstance(callback, OpenTelemetry): + return callback # type: ignore + + elif logging_integration == "dynamic_rate_limiter": + from litellm.proxy.hooks.dynamic_rate_limiter import ( + _PROXY_DynamicRateLimitHandler, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, _PROXY_DynamicRateLimitHandler): + return callback # type: ignore + elif logging_integration == "dynamic_rate_limiter_v3": + from litellm.proxy.hooks.dynamic_rate_limiter_v3 import ( + _PROXY_DynamicRateLimitHandlerV3, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, _PROXY_DynamicRateLimitHandlerV3): + return callback # type: ignore + + elif logging_integration == "langtrace": + from litellm.integrations.opentelemetry import OpenTelemetry + + if "LANGTRACE_API_KEY" not in os.environ: + raise ValueError("LANGTRACE_API_KEY not found in environment variables") + + for callback in _in_memory_loggers: + if ( + isinstance(callback, OpenTelemetry) + and callback.callback_name == "langtrace" + ): + return callback + + elif logging_integration == "mlflow": + for callback in _in_memory_loggers: + if isinstance(callback, MlflowLogger): + return callback + elif logging_integration == "pagerduty": + for callback in _in_memory_loggers: + if isinstance(callback, PagerDutyAlerting): + return callback + elif logging_integration == "anthropic_cache_control_hook": + for callback in _in_memory_loggers: + if isinstance(callback, AnthropicCacheControlHook): + return callback + elif logging_integration == "vector_store_pre_call_hook": + from litellm.integrations.vector_store_integrations.vector_store_pre_call_hook import ( + VectorStorePreCallHook, + ) + + for callback in _in_memory_loggers: + if isinstance(callback, VectorStorePreCallHook): + return callback + elif logging_integration == "gcs_pubsub": + for callback in _in_memory_loggers: + if isinstance(callback, GcsPubSubLogger): + return callback + elif logging_integration == "generic_api": + for callback in _in_memory_loggers: + if isinstance(callback, GenericAPILogger): + return callback + elif logging_integration == "resend_email": + for callback in _in_memory_loggers: + if isinstance(callback, ResendEmailLogger): + return callback + elif logging_integration == "sendgrid_email": + for callback in _in_memory_loggers: + if isinstance(callback, SendGridEmailLogger): + return callback + elif logging_integration == "smtp_email": + for callback in _in_memory_loggers: + if isinstance(callback, SMTPEmailLogger): + return callback + return None + + except Exception as e: + verbose_logger.exception( + f"[Non-Blocking Error] Error getting custom logger: {e}" + ) + return None + + +def _get_custom_logger_settings_from_proxy_server(callback_name: str) -> Dict: + """ + Get the settings for a custom logger from the proxy server config.yaml + + Proxy server config.yaml defines callback_settings as: + + callback_settings: + otel: + message_logging: False + """ + if litellm.callback_settings: + return dict(litellm.callback_settings.get(callback_name, {})) + return {} + + +def use_custom_pricing_for_model(litellm_params: Optional[dict]) -> bool: + """ + Check if the model uses custom pricing + + Returns True if any of `SPECIAL_MODEL_INFO_PARAMS` are present in `litellm_params` or `model_info` + """ + if litellm_params is None: + return False + + # Check litellm_params using set intersection (only check keys that exist in both) + matching_keys = _CUSTOM_PRICING_KEYS & litellm_params.keys() + for key in matching_keys: + if litellm_params.get(key) is not None: + return True + + # Check model_info + metadata: dict = litellm_params.get("metadata", {}) or {} + model_info: dict = metadata.get("model_info", {}) or {} + + if model_info: + matching_keys = _CUSTOM_PRICING_KEYS & model_info.keys() + for key in matching_keys: + if model_info.get(key) is not None: + return True + + return False + + +def is_valid_sha256_hash(value: str) -> bool: + # Check if the value is a valid SHA-256 hash (64 hexadecimal characters) + return bool(re.fullmatch(r"[a-fA-F0-9]{64}", value)) + + +class StandardLoggingPayloadSetup: + @staticmethod + def cleanup_timestamps( + start_time: Union[dt_object, float], + end_time: Union[dt_object, float], + completion_start_time: Union[dt_object, float], + ) -> Tuple[float, float, float]: + """ + Convert datetime objects to floats + + Args: + start_time: Union[dt_object, float] + end_time: Union[dt_object, float] + completion_start_time: Union[dt_object, float] + + Returns: + Tuple[float, float, float]: A tuple containing the start time, end time, and completion start time as floats. + """ + + if isinstance(start_time, datetime.datetime): + start_time_float = start_time.timestamp() + elif isinstance(start_time, float): + start_time_float = start_time + else: + raise ValueError( + f"start_time is required, got={start_time} of type {type(start_time)}" + ) + + if isinstance(end_time, datetime.datetime): + end_time_float = end_time.timestamp() + elif isinstance(end_time, float): + end_time_float = end_time + else: + raise ValueError( + f"end_time is required, got={end_time} of type {type(end_time)}" + ) + + if isinstance(completion_start_time, datetime.datetime): + completion_start_time_float = completion_start_time.timestamp() + elif isinstance(completion_start_time, float): + completion_start_time_float = completion_start_time + else: + completion_start_time_float = end_time_float + + return start_time_float, end_time_float, completion_start_time_float + + @staticmethod + def append_system_prompt_messages( + kwargs: Optional[Dict] = None, messages: Optional[Any] = None + ): + """ + Append system prompt messages to the messages + """ + if kwargs is not None: + if kwargs.get("system") is not None and isinstance( + kwargs.get("system"), str + ): + if messages is None: + return [{"role": "system", "content": kwargs.get("system")}] + elif isinstance(messages, list): + if len(messages) == 0: + return [{"role": "system", "content": kwargs.get("system")}] + # check for duplicates + if messages[0].get("role") == "system" and messages[0].get( + "content" + ) == kwargs.get("system"): + return messages + messages = [ + {"role": "system", "content": kwargs.get("system")} + ] + messages + elif isinstance(messages, str): + messages = [ + {"role": "system", "content": kwargs.get("system")}, + {"role": "user", "content": messages}, + ] + return messages + + return messages + + @staticmethod + def merge_litellm_metadata(litellm_params: dict) -> dict: + """ + Merge both litellm_metadata and metadata from litellm_params. + + litellm_metadata contains model-related fields, metadata contains user API key fields. + We need both for complete standard logging payload. + + Args: + litellm_params: Dictionary containing metadata and litellm_metadata + + Returns: + dict: Merged metadata with user API key fields taking precedence + """ + merged_metadata: dict = {} + + # Start with metadata (user API key fields) - but skip non-serializable objects + if litellm_params.get("metadata") and isinstance( + litellm_params.get("metadata"), dict + ): + for key, value in litellm_params["metadata"].items(): + # Skip non-serializable objects like UserAPIKeyAuth + if key == "user_api_key_auth": + continue + merged_metadata[key] = value + + # Then merge litellm_metadata (model-related fields) - this will NOT overwrite existing keys + if litellm_params.get("litellm_metadata") and isinstance( + litellm_params.get("litellm_metadata"), dict + ): + for key, value in litellm_params["litellm_metadata"].items(): + if ( + key not in merged_metadata + ): # Don't overwrite existing keys from metadata + merged_metadata[key] = value + + return merged_metadata + + @staticmethod + def get_standard_logging_metadata( + metadata: Optional[Dict[str, Any]], + litellm_params: Optional[dict] = None, + prompt_integration: Optional[str] = None, + applied_guardrails: Optional[List[str]] = None, + mcp_tool_call_metadata: Optional[StandardLoggingMCPToolCall] = None, + vector_store_request_metadata: Optional[ + List[StandardLoggingVectorStoreRequest] + ] = None, + usage_object: Optional[dict] = None, + proxy_server_request: Optional[dict] = None, + start_time: Optional[dt_object] = None, + response_id: Optional[str] = None, + ) -> StandardLoggingMetadata: + """ + Clean and filter the metadata dictionary to include only the specified keys in StandardLoggingMetadata. + + Args: + metadata (Optional[Dict[str, Any]]): The original metadata dictionary. + + Returns: + StandardLoggingMetadata: A StandardLoggingMetadata object containing the cleaned metadata. + + Note: + - If the input metadata is None or not a dictionary, an empty StandardLoggingMetadata object is returned. + - If 'user_api_key' is present in metadata and is a valid SHA256 hash, it's stored as 'user_api_key_hash'. + """ + + prompt_management_metadata: Optional[ + StandardLoggingPromptManagementMetadata + ] = None + if litellm_params is not None: + prompt_id = cast(Optional[str], litellm_params.get("prompt_id", None)) + prompt_variables = cast( + Optional[dict], litellm_params.get("prompt_variables", None) + ) + + if prompt_id is not None and prompt_integration is not None: + prompt_management_metadata = StandardLoggingPromptManagementMetadata( + prompt_id=prompt_id, + prompt_variables=prompt_variables, + prompt_integration=prompt_integration, + ) + + # Initialize with default values + clean_metadata = StandardLoggingMetadata( + user_api_key_hash=None, + user_api_key_alias=None, + user_api_key_spend=None, + user_api_key_max_budget=None, + user_api_key_budget_reset_at=None, + user_api_key_team_id=None, + user_api_key_org_id=None, + user_api_key_project_id=None, + user_api_key_user_id=None, + user_api_key_team_alias=None, + user_api_key_user_email=None, + user_api_key_end_user_id=None, + user_api_key_request_route=None, + spend_logs_metadata=None, + requester_ip_address=None, + user_agent=None, + requester_metadata=None, + prompt_management_metadata=prompt_management_metadata, + applied_guardrails=applied_guardrails, + mcp_tool_call_metadata=mcp_tool_call_metadata, + vector_store_request_metadata=vector_store_request_metadata, + usage_object=usage_object, + requester_custom_headers=None, + cold_storage_object_key=None, + user_api_key_auth_metadata=None, + team_alias=None, + team_id=None, + ) + if isinstance(metadata, dict): + for key in metadata.keys() & _STANDARD_LOGGING_METADATA_KEYS: + clean_metadata[key] = metadata[key] # type: ignore + + user_api_key = metadata.get("user_api_key") + if ( + user_api_key + and isinstance(user_api_key, str) + and is_valid_sha256_hash(user_api_key) + ): + clean_metadata["user_api_key_hash"] = user_api_key + _potential_requester_metadata = metadata.get( + "metadata", None + ) # check if user passed metadata in the sdk request - e.g. metadata for langsmith logging - https://docs.litellm.ai/docs/observability/langsmith_integration#set-langsmith-fields + if ( + clean_metadata["requester_metadata"] is None + and _potential_requester_metadata is not None + and isinstance(_potential_requester_metadata, dict) + ): + clean_metadata["requester_metadata"] = _potential_requester_metadata + + if ( + EnterpriseStandardLoggingPayloadSetupVAR + and proxy_server_request is not None + ): + clean_metadata = EnterpriseStandardLoggingPayloadSetupVAR.apply_enterprise_specific_metadata( + standard_logging_metadata=clean_metadata, + proxy_server_request=proxy_server_request, + ) + + # Generate cold storage object key if cold storage is configured + if start_time is not None and response_id is not None: + cold_storage_object_key = ( + StandardLoggingPayloadSetup._generate_cold_storage_object_key( + start_time=start_time, + response_id=response_id, + team_alias=clean_metadata.get("user_api_key_team_alias"), + ) + ) + if cold_storage_object_key: + clean_metadata["cold_storage_object_key"] = cold_storage_object_key + + return clean_metadata + + @staticmethod + def get_usage_from_response_obj( + response_obj: Optional[dict], combined_usage_object: Optional[Usage] = None + ) -> Usage: + ## BASE CASE ## + if combined_usage_object is not None: + return combined_usage_object + if response_obj is None: + return Usage( + prompt_tokens=0, + completion_tokens=0, + total_tokens=0, + ) + + usage = response_obj.get("usage", None) or {} + if usage is None or ( + not isinstance(usage, dict) and not isinstance(usage, Usage) + ): + return Usage( + prompt_tokens=0, + completion_tokens=0, + total_tokens=0, + ) + elif isinstance(usage, Usage): + return usage + elif isinstance(usage, ResponseAPIUsage): + return ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( + usage + ) + elif isinstance(usage, dict): + if ResponseAPILoggingUtils._is_response_api_usage(usage): + return ( + ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage( + usage + ) + ) + return Usage(**usage) + + raise ValueError(f"usage is required, got={usage} of type {type(usage)}") + + @staticmethod + def get_model_cost_information( + base_model: Optional[str], + custom_pricing: Optional[bool], + custom_llm_provider: Optional[str], + init_response_obj: Union[Any, BaseModel, dict], + ) -> StandardLoggingModelInformation: + model_cost_name = _select_model_name_for_cost_calc( + model=None, + completion_response=init_response_obj, # type: ignore + base_model=base_model, + custom_pricing=custom_pricing, + ) + if model_cost_name is None: + model_cost_information = StandardLoggingModelInformation( + model_map_key="", model_map_value=None + ) + else: + try: + _model_cost_information = litellm.get_model_info( + model=model_cost_name, custom_llm_provider=custom_llm_provider + ) + model_cost_information = StandardLoggingModelInformation( + model_map_key=model_cost_name, + model_map_value=_model_cost_information, + ) + except Exception: + verbose_logger.debug( # keep in debug otherwise it will trigger on every call + "Model={} is not mapped in model cost map. Defaulting to None model_cost_information for standard_logging_payload".format( + model_cost_name + ) + ) + model_cost_information = StandardLoggingModelInformation( + model_map_key=model_cost_name, model_map_value=None + ) + return model_cost_information + + @staticmethod + def get_final_response_obj( + response_obj: dict, init_response_obj: Union[Any, BaseModel, dict], kwargs: dict + ) -> Optional[Union[dict, str, list]]: + """ + Get final response object after redacting the message input/output from logging + """ + if response_obj: + final_response_obj: Optional[Union[dict, str, list]] = response_obj + elif isinstance(init_response_obj, list) or isinstance(init_response_obj, str): + final_response_obj = init_response_obj + else: + final_response_obj = {} + + modified_final_response_obj = redact_message_input_output_from_logging( + model_call_details=kwargs, + result=final_response_obj, + ) + + if modified_final_response_obj is not None and isinstance( + modified_final_response_obj, BaseModel + ): + final_response_obj = modified_final_response_obj.model_dump() + else: + final_response_obj = modified_final_response_obj + + return final_response_obj + + @staticmethod + def get_additional_headers( + additiona_headers: Optional[dict], + ) -> Optional[StandardLoggingAdditionalHeaders]: + if additiona_headers is None: + return None + + additional_logging_headers: StandardLoggingAdditionalHeaders = {} + + for key in StandardLoggingAdditionalHeaders.__annotations__.keys(): + _key = key.lower() + _key = _key.replace("_", "-") + if _key in additiona_headers: + try: + additional_logging_headers[key] = int(additiona_headers[_key]) # type: ignore + except (ValueError, TypeError): + verbose_logger.debug( + f"Could not convert {additiona_headers[_key]} to int for key {key}." + ) + return additional_logging_headers + + @staticmethod + def get_hidden_params( + hidden_params: Optional[dict], + ) -> StandardLoggingHiddenParams: + clean_hidden_params = StandardLoggingHiddenParams( + model_id=None, + cache_key=None, + api_base=None, + response_cost=None, + additional_headers=None, + litellm_overhead_time_ms=None, + batch_models=None, + litellm_model_name=None, + usage_object=None, + ) + if hidden_params is not None: + for key in StandardLoggingHiddenParams.__annotations__.keys(): + if key in hidden_params: + if key == "additional_headers": + clean_hidden_params[ + "additional_headers" + ] = StandardLoggingPayloadSetup.get_additional_headers( + hidden_params[key] + ) + else: + clean_hidden_params[key] = hidden_params[key] # type: ignore + return clean_hidden_params + + @staticmethod + def strip_trailing_slash(api_base: Optional[str]) -> Optional[str]: + if api_base: + if api_base.endswith("//"): + return api_base.rstrip("/") + if api_base[-1] == "/": + return api_base[:-1] + return api_base + + @staticmethod + def _generate_cold_storage_object_key( + start_time: dt_object, + response_id: str, + team_alias: Optional[str] = None, + ) -> Optional[str]: + """ + Generate cold storage object key in the same format as S3Logger. + + Args: + start_time: The start time of the request + response_id: The response ID + team_alias: Optional team alias for team-based prefixing + + Returns: + Optional[str]: The generated object key or None if cold storage not configured + """ + # Generate object key in same format as S3Logger + from litellm.integrations.s3 import get_s3_object_key + + # Only generate object key if cold storage is configured + cold_storage_custom_logger = litellm.cold_storage_custom_logger + if cold_storage_custom_logger is None: + return None + + try: + # Generate file name in same format as litellm.utils.get_logging_id + s3_file_name = f"time-{start_time.strftime('%H-%M-%S-%f')}_{response_id}" + + # Get the actual s3_path from the configured cold storage logger instance + s3_path = "" # default value + + # Try to get the actual logger instance from the logger name + try: + custom_logger = litellm.logging_callback_manager.get_active_custom_logger_for_callback_name( + cold_storage_custom_logger + ) + if ( + custom_logger + and hasattr(custom_logger, "s3_path") + and getattr(custom_logger, "s3_path") + ): + s3_path = getattr(custom_logger, "s3_path") + except Exception: + # If any error occurs in getting the logger instance, use default empty s3_path + pass + + s3_object_key = get_s3_object_key( + s3_path=s3_path, # Use actual s3_path from logger configuration + prefix="", # Don't split by team alias for cold storage + start_time=start_time, + s3_file_name=s3_file_name, + ) + + return s3_object_key + except Exception: + # If any error occurs in generating the key, return None + return None + + @staticmethod + def get_error_information( + original_exception: Optional[Exception], + traceback_str: Optional[str] = None, + ) -> StandardLoggingPayloadErrorInformation: + from litellm.constants import MAXIMUM_TRACEBACK_LINES_TO_LOG + + # Check for 'code' first (used by ProxyException), then fall back to 'status_code' (used by LiteLLM exceptions) + # Ensure error_code is always a string for Prisma Python JSON field compatibility + error_code_attr = getattr(original_exception, "code", None) + if error_code_attr is not None and str(error_code_attr) not in ("", "None"): + error_status: str = str(error_code_attr) + else: + status_code_attr = getattr(original_exception, "status_code", None) + error_status = str(status_code_attr) if status_code_attr is not None else "" + error_class: str = ( + str(original_exception.__class__.__name__) if original_exception else "" + ) + _llm_provider_in_exception = getattr(original_exception, "llm_provider", "") + + # Get traceback information (first 100 lines) + traceback_info = traceback_str or "" + if original_exception: + tb = getattr(original_exception, "__traceback__", None) + if tb: + tb_lines = traceback.format_tb(tb) + traceback_info += "".join( + tb_lines[:MAXIMUM_TRACEBACK_LINES_TO_LOG] + ) # Limit to first 100 lines + + # Get additional error details + error_message = str(original_exception) + + return StandardLoggingPayloadErrorInformation( + error_code=error_status, + error_class=error_class, + llm_provider=_llm_provider_in_exception, + traceback=traceback_info, + error_message=error_message if original_exception else "", + ) + + @staticmethod + def get_response_time( + start_time_float: float, + end_time_float: float, + completion_start_time_float: float, + stream: bool, + ) -> float: + """ + Get the response time for the LLM response + + Args: + start_time_float: float - start time of the LLM call + end_time_float: float - end time of the LLM call + completion_start_time_float: float - time to first token of the LLM response (for streaming responses) + stream: bool - True when a stream response is returned + + Returns: + float: The response time for the LLM response + """ + if stream is True: + return completion_start_time_float - start_time_float + else: + return end_time_float - start_time_float + + @staticmethod + def _get_standard_logging_payload_trace_id( + logging_obj: Logging, + litellm_params: dict, + ) -> str: + """ + Returns the `litellm_trace_id` for this request + + This helps link sessions when multiple requests are made in a single session + """ + dynamic_litellm_session_id = litellm_params.get("litellm_session_id") + dynamic_litellm_trace_id = litellm_params.get("litellm_trace_id") + + # Note: we recommend using `litellm_session_id` for session tracking + # `litellm_trace_id` is an internal litellm param + if dynamic_litellm_session_id: + return str(dynamic_litellm_session_id) + elif dynamic_litellm_trace_id: + return str(dynamic_litellm_trace_id) + else: + return logging_obj.litellm_trace_id + + @staticmethod + def _get_user_agent_tags(proxy_server_request: dict) -> Optional[List[str]]: + """ + Return the user agent tags from the proxy server request for spend tracking + """ + if litellm.disable_add_user_agent_to_request_tags is True: + return None + user_agent_tags: Optional[List[str]] = None + headers = proxy_server_request.get("headers", {}) + if headers is not None and isinstance(headers, dict): + if "user-agent" in headers: + user_agent = headers["user-agent"] + if user_agent is not None: + if user_agent_tags is None: + user_agent_tags = [] + user_agent_part: Optional[str] = None + if "/" in user_agent: + user_agent_part = user_agent.split("/")[0] + if user_agent_part is not None: + user_agent_tags.append("User-Agent: " + user_agent_part) + if user_agent is not None: + user_agent_tags.append("User-Agent: " + user_agent) + return user_agent_tags + + @staticmethod + def _get_extra_header_tags(proxy_server_request: dict) -> Optional[List[str]]: + """ + Extract additional header tags for spend tracking based on config. + """ + extra_headers: List[str] = ( + getattr(litellm, "extra_spend_tag_headers", None) or [] + ) + if not extra_headers: + return None + + headers = proxy_server_request.get("headers", {}) + if not isinstance(headers, dict): + return None + + header_tags = [] + for header_name in extra_headers: + header_value = headers.get(header_name) + if header_value: + header_tags.append(f"{header_name}: {header_value}") + + return header_tags if header_tags else None + + @staticmethod + def _get_request_tags( + litellm_params: dict, proxy_server_request: dict + ) -> List[str]: + # check for 'tags' in both 'metadata' and 'litellm_metadata' + metadata = litellm_params.get("metadata") or {} + litellm_metadata = litellm_params.get("litellm_metadata") or {} + if metadata.get("tags", []): + request_tags = metadata.get("tags", []).copy() + elif litellm_metadata.get("tags", []): + request_tags = litellm_metadata.get("tags", []).copy() + else: + request_tags = [] + user_agent_tags = StandardLoggingPayloadSetup._get_user_agent_tags( + proxy_server_request + ) + additional_header_tags = StandardLoggingPayloadSetup._get_extra_header_tags( + proxy_server_request + ) + if user_agent_tags is not None: + request_tags.extend(user_agent_tags) + if additional_header_tags is not None: + request_tags.extend(additional_header_tags) + return request_tags + + +def _get_status_fields( + status: StandardLoggingPayloadStatus, + guardrail_information: Optional[List[dict]], + error_str: Optional[str], +) -> "StandardLoggingPayloadStatusFields": + """ + Determine status fields based on request status and guardrail information. + + Args: + status: Overall request status ("success" or "failure") + guardrail_information: Guardrail information from metadata + error_str: Error string if any + + Returns: + StandardLoggingPayloadStatusFields with llm_api_status and guardrail_status + """ + # Mapping for legacy guardrail status values to new GuardrailStatus values + GUARDRAIL_STATUS_MAP: Dict[str, GuardrailStatus] = { + "success": "success", + "blocked": "guardrail_intervened", # legacy + "guardrail_intervened": "guardrail_intervened", # direct + "failure": "guardrail_failed_to_respond", # legacy + "guardrail_failed_to_respond": "guardrail_failed_to_respond", # direct + "not_run": "not_run", + } + + # Set LLM API status + llm_api_status: StandardLoggingPayloadStatus = status + + ######################################################### + # Map - guardrail_information.guardrail_status to guardrail_status + ######################################################### + guardrail_status: GuardrailStatus = "not_run" + if guardrail_information and isinstance(guardrail_information, list): + for information in guardrail_information: + if isinstance(information, dict): + raw_status = information.get("guardrail_status", "not_run") + if raw_status != "not_run": + guardrail_status = GUARDRAIL_STATUS_MAP.get(raw_status, "not_run") + break + + return StandardLoggingPayloadStatusFields( + llm_api_status=llm_api_status, guardrail_status=guardrail_status + ) + + +def _extract_response_obj_and_hidden_params( + init_response_obj: Union[Any, BaseModel, dict], + original_exception: Optional[Exception], +) -> Tuple[dict, Optional[dict]]: + """Extract response_obj and hidden_params from init_response_obj.""" + hidden_params: Optional[dict] = None + if init_response_obj is None: + response_obj = {} + elif isinstance(init_response_obj, BaseModel): + response_obj = init_response_obj.model_dump() + hidden_params = getattr(init_response_obj, "_hidden_params", None) + elif isinstance(init_response_obj, dict): + response_obj = init_response_obj + else: + response_obj = {} + + if original_exception is not None and hidden_params is None: + response_headers = _get_response_headers(original_exception) + if response_headers is not None: + hidden_params = dict( + StandardLoggingHiddenParams( + additional_headers=StandardLoggingPayloadSetup.get_additional_headers( + dict(response_headers) + ), + model_id=None, + cache_key=None, + api_base=None, + response_cost=None, + litellm_overhead_time_ms=None, + batch_models=None, + litellm_model_name=None, + usage_object=None, + ) + ) + + return response_obj, hidden_params + + +def get_standard_logging_object_payload( + kwargs: Optional[dict], + init_response_obj: Union[Any, BaseModel, dict], + start_time: dt_object, + end_time: dt_object, + logging_obj: Logging, + status: StandardLoggingPayloadStatus, + error_str: Optional[str] = None, + original_exception: Optional[Exception] = None, + standard_built_in_tools_params: Optional[StandardBuiltInToolsParams] = None, +) -> Optional[StandardLoggingPayload]: + try: + kwargs = kwargs or {} + + response_obj, hidden_params = _extract_response_obj_and_hidden_params( + init_response_obj, original_exception + ) + + # standardize this function to be used across, s3, dynamoDB, langfuse logging + litellm_params = kwargs.get("litellm_params", {}) or {} + proxy_server_request = litellm_params.get("proxy_server_request") or {} + + # Merge both litellm_metadata and metadata to get complete metadata + metadata: dict = StandardLoggingPayloadSetup.merge_litellm_metadata( + litellm_params + ) + + completion_start_time = kwargs.get("completion_start_time", end_time) + call_type = kwargs.get("call_type") + cache_hit = kwargs.get("cache_hit", False) + usage = StandardLoggingPayloadSetup.get_usage_from_response_obj( + response_obj=response_obj, + combined_usage_object=cast( + Optional[Usage], kwargs.get("combined_usage_object") + ), + ) + + id = response_obj.get("id", kwargs.get("litellm_call_id")) + + _model_id = metadata.get("model_info", {}).get("id", "") + _model_group = metadata.get("model_group", "") + + request_tags = StandardLoggingPayloadSetup._get_request_tags( + litellm_params=litellm_params, proxy_server_request=proxy_server_request + ) + + # cleanup timestamps + ( + start_time_float, + end_time_float, + completion_start_time_float, + ) = StandardLoggingPayloadSetup.cleanup_timestamps( + start_time=start_time, + end_time=end_time, + completion_start_time=completion_start_time, + ) + response_time = StandardLoggingPayloadSetup.get_response_time( + start_time_float=start_time_float, + end_time_float=end_time_float, + completion_start_time_float=completion_start_time_float, + stream=kwargs.get("stream", False), + ) + # clean up litellm hidden params + clean_hidden_params = StandardLoggingPayloadSetup.get_hidden_params( + hidden_params + ) + + # clean up litellm metadata + clean_metadata = StandardLoggingPayloadSetup.get_standard_logging_metadata( + metadata=metadata, + litellm_params=litellm_params, + prompt_integration=kwargs.get("prompt_integration", None), + applied_guardrails=kwargs.get("applied_guardrails", None), + mcp_tool_call_metadata=kwargs.get("mcp_tool_call_metadata", None), + vector_store_request_metadata=kwargs.get( + "vector_store_request_metadata", None + ), + usage_object=usage.model_dump(), + proxy_server_request=proxy_server_request, + start_time=start_time, + response_id=id, + ) + _request_body = proxy_server_request.get("body", {}) + end_user_id = clean_metadata["user_api_key_end_user_id"] or _request_body.get( + "user", None + ) # maintain backwards compatibility with old request body check + + saved_cache_cost: float = 0.0 + if cache_hit is True: + id = f"{id}_cache_hit{time.time()}" # do not duplicate the request id + saved_cache_cost = ( + logging_obj._response_cost_calculator( + result=init_response_obj, cache_hit=False # type: ignore + ) + or 0.0 + ) + + ## Get model cost information ## + base_model = _get_base_model_from_metadata(model_call_details=kwargs) + custom_pricing = use_custom_pricing_for_model(litellm_params=litellm_params) + + model_cost_information = StandardLoggingPayloadSetup.get_model_cost_information( + base_model=base_model, + custom_pricing=custom_pricing, + custom_llm_provider=kwargs.get("custom_llm_provider"), + init_response_obj=init_response_obj, + ) + response_cost: float = kwargs.get("response_cost", 0) or 0.0 + + error_information = StandardLoggingPayloadSetup.get_error_information( + original_exception=original_exception, + ) + + ## get final response object ## + final_response_obj = StandardLoggingPayloadSetup.get_final_response_obj( + response_obj=response_obj, + init_response_obj=init_response_obj, + kwargs=kwargs, + ) + + stream: Optional[bool] = None + if ( + kwargs.get("complete_streaming_response") is not None + or kwargs.get("async_complete_streaming_response") is not None + ) and kwargs.get("stream") is True: + stream = True + + # Reconstruct full model name with provider prefix for logging + # This ensures Bedrock models like "us.anthropic.claude-3-5-sonnet-20240620-v1:0" + # are logged as "bedrock/us.anthropic.claude-3-5-sonnet-20240620-v1:0" + custom_llm_provider = cast(Optional[str], kwargs.get("custom_llm_provider")) + model_name = reconstruct_model_name( + kwargs.get("model", "") or "", custom_llm_provider, metadata + ) + + payload: StandardLoggingPayload = StandardLoggingPayload( + id=str(id), + trace_id=StandardLoggingPayloadSetup._get_standard_logging_payload_trace_id( + logging_obj=logging_obj, + litellm_params=litellm_params, + ), + call_type=call_type or "", + cache_hit=cache_hit, + stream=stream, + status=status, + status_fields=_get_status_fields( + status=status, + guardrail_information=metadata.get( + "standard_logging_guardrail_information", None + ), + error_str=error_str, + ), + custom_llm_provider=custom_llm_provider, + saved_cache_cost=saved_cache_cost, + startTime=start_time_float, + endTime=end_time_float, + completionStartTime=completion_start_time_float, + response_time=response_time, + model=model_name, + metadata=clean_metadata, + cache_key=clean_hidden_params["cache_key"], + response_cost=response_cost, + cost_breakdown=logging_obj.cost_breakdown, + total_tokens=usage.total_tokens, + prompt_tokens=usage.prompt_tokens, + completion_tokens=usage.completion_tokens, + request_tags=request_tags, + end_user=end_user_id or "", + api_base=StandardLoggingPayloadSetup.strip_trailing_slash( + litellm_params.get("api_base", "") + ) + or "", + model_group=_model_group, + model_id=_model_id, + requester_ip_address=clean_metadata.get("requester_ip_address", None), + user_agent=clean_metadata.get("user_agent", None), + messages=StandardLoggingPayloadSetup.append_system_prompt_messages( + kwargs=kwargs, messages=kwargs.get("messages") + ), + response=final_response_obj, + model_parameters=ModelParamHelper.get_standard_logging_model_parameters( + kwargs.get("optional_params", None) or {} + ), + hidden_params=clean_hidden_params, + model_map_information=model_cost_information, + error_str=error_str, + error_information=error_information, + response_cost_failure_debug_info=kwargs.get( + "response_cost_failure_debug_information" + ), + guardrail_information=metadata.get( + "standard_logging_guardrail_information", None + ), + standard_built_in_tools_params=standard_built_in_tools_params, + ) + + # emit_standard_logging_payload(payload) - Moved to success_handler to prevent double emitting + + return payload + except Exception as e: + verbose_logger.exception( + "Error creating standard logging object - {}".format(str(e)) + ) + return None + + +def emit_standard_logging_payload(payload: StandardLoggingPayload): + if os.getenv("LITELLM_PRINT_STANDARD_LOGGING_PAYLOAD"): + print(json.dumps(payload, indent=4)) # noqa + + +def get_standard_logging_metadata( + metadata: Optional[Dict[str, Any]], +) -> StandardLoggingMetadata: + """ + Clean and filter the metadata dictionary to include only the specified keys in StandardLoggingMetadata. + + Args: + metadata (Optional[Dict[str, Any]]): The original metadata dictionary. + + Returns: + StandardLoggingMetadata: A StandardLoggingMetadata object containing the cleaned metadata. + + Note: + - If the input metadata is None or not a dictionary, an empty StandardLoggingMetadata object is returned. + - If 'user_api_key' is present in metadata and is a valid SHA256 hash, it's stored as 'user_api_key_hash'. + """ + # Initialize with default values + clean_metadata = StandardLoggingMetadata( + user_api_key_hash=None, + user_api_key_alias=None, + user_api_key_spend=None, + user_api_key_max_budget=None, + user_api_key_budget_reset_at=None, + user_api_key_team_id=None, + user_api_key_org_id=None, + user_api_key_project_id=None, + user_api_key_user_id=None, + user_api_key_user_email=None, + user_api_key_team_alias=None, + spend_logs_metadata=None, + requester_ip_address=None, + user_agent=None, + requester_metadata=None, + user_api_key_end_user_id=None, + prompt_management_metadata=None, + applied_guardrails=None, + mcp_tool_call_metadata=None, + vector_store_request_metadata=None, + usage_object=None, + requester_custom_headers=None, + user_api_key_request_route=None, + cold_storage_object_key=None, + user_api_key_auth_metadata=None, + team_alias=None, + team_id=None, + ) + if isinstance(metadata, dict): + # Update the clean_metadata with values from input metadata that match StandardLoggingMetadata fields + for key in StandardLoggingMetadata.__annotations__.keys(): + if key in metadata: + clean_metadata[key] = metadata[key] # type: ignore + + if metadata.get("user_api_key") is not None: + if is_valid_sha256_hash(str(metadata.get("user_api_key"))): + clean_metadata["user_api_key_hash"] = metadata.get( + "user_api_key" + ) # this is the hash + return clean_metadata + + +def scrub_sensitive_keys_in_metadata(litellm_params: Optional[dict]): + if litellm_params is None: + litellm_params = {} + + metadata = litellm_params.get("metadata", {}) or {} + + ## Extract provider-specific callable values (like langfuse_masking_function) + ## Store them separately so only the intended logger can access them + ## This prevents callables from leaking to other logging integrations + if "langfuse_masking_function" in metadata: + masking_fn = metadata.pop("langfuse_masking_function", None) + if callable(masking_fn): + litellm_params["_langfuse_masking_function"] = masking_fn + litellm_params["metadata"] = metadata + + ## check user_api_key_metadata for sensitive logging keys + cleaned_user_api_key_metadata = {} + if "user_api_key_metadata" in metadata and isinstance( + metadata["user_api_key_metadata"], dict + ): + for k, v in metadata["user_api_key_metadata"].items(): + if k == "logging": # prevent logging user logging keys + cleaned_user_api_key_metadata[ + k + ] = "scrubbed_by_litellm_for_sensitive_keys" + else: + cleaned_user_api_key_metadata[k] = v + + metadata["user_api_key_metadata"] = cleaned_user_api_key_metadata + litellm_params["metadata"] = metadata + + return litellm_params + + +# integration helper function +def modify_integration(integration_name, integration_params): + global supabaseClient + if integration_name == "supabase": + if "table_name" in integration_params: + Supabase.supabase_table_name = integration_params["table_name"] + + +@lru_cache(maxsize=16) +def _get_traceback_str_for_error(error_str: str) -> str: + """ + function wrapped with lru_cache to limit the number of times `traceback.format_exc()` is called + """ + return traceback.format_exc() + + +from decimal import Decimal + +# used for unit testing +from typing import Any, Dict, List, Optional, Union + + +def create_dummy_standard_logging_payload() -> StandardLoggingPayload: + # First create the nested objects with proper typing + model_info = StandardLoggingModelInformation( + model_map_key="gpt-3.5-turbo", model_map_value=None + ) + + metadata = StandardLoggingMetadata( # type: ignore + user_api_key_hash=str("test_hash"), + user_api_key_alias=str("test_alias"), + user_api_key_team_id=str("test_team"), + user_api_key_user_id=str("test_user"), + user_api_key_team_alias=str("test_team_alias"), + user_api_key_org_id=None, + spend_logs_metadata=None, + requester_ip_address=str("127.0.0.1"), + requester_metadata=None, + user_api_key_end_user_id=str("test_end_user"), + ) + + hidden_params = StandardLoggingHiddenParams( + model_id=None, + cache_key=None, + api_base=None, + response_cost=None, + additional_headers=None, + litellm_overhead_time_ms=None, + batch_models=None, + litellm_model_name=None, + usage_object=None, + ) + + # Convert numeric values to appropriate types + response_cost = Decimal("0.1") + start_time = Decimal("1234567890.0") + end_time = Decimal("1234567891.0") + completion_start_time = Decimal("1234567890.5") + saved_cache_cost = Decimal("0.0") + + # Create messages and response with proper typing + messages: List[Dict[str, str]] = [{"role": "user", "content": "Hello, world!"}] + response: Dict[str, List[Dict[str, Dict[str, str]]]] = { + "choices": [{"message": {"content": "Hi there!"}}] + } + + # Main payload initialization + return StandardLoggingPayload( # type: ignore + id=str("test_id"), + call_type=str("completion"), + stream=bool(False), + response_cost=response_cost, + response_cost_failure_debug_info=None, + status=str("success"), + total_tokens=int( + DEFAULT_MOCK_RESPONSE_PROMPT_TOKEN_COUNT + + DEFAULT_MOCK_RESPONSE_COMPLETION_TOKEN_COUNT + ), + prompt_tokens=int(DEFAULT_MOCK_RESPONSE_PROMPT_TOKEN_COUNT), + completion_tokens=int(DEFAULT_MOCK_RESPONSE_COMPLETION_TOKEN_COUNT), + startTime=start_time, + endTime=end_time, + completionStartTime=completion_start_time, + model_map_information=model_info, + model=str("gpt-3.5-turbo"), + model_id=str("model-123"), + model_group=str("openai-gpt"), + custom_llm_provider=str("openai"), + api_base=str("https://api.openai.com"), + metadata=metadata, + cache_hit=bool(False), + cache_key=None, + saved_cache_cost=saved_cache_cost, + request_tags=[], + end_user=None, + requester_ip_address=str("127.0.0.1"), + messages=messages, + response=response, + error_str=None, + model_parameters={"stream": True}, + hidden_params=hidden_params, + ) diff --git a/litellm/proxy/hooks/proxy_track_cost_callback.py b/litellm/proxy/hooks/proxy_track_cost_callback.py index d903ce0d9d7..815d64f22ad 100644 --- a/litellm/proxy/hooks/proxy_track_cost_callback.py +++ b/litellm/proxy/hooks/proxy_track_cost_callback.py @@ -1,287 +1,295 @@ -import asyncio -import traceback -from datetime import datetime -from typing import Any, List, Optional, Union, cast - -import litellm -from litellm._logging import verbose_proxy_logger -from litellm.integrations.custom_logger import CustomLogger -from litellm.litellm_core_utils.core_helpers import ( - _get_parent_otel_span_from_kwargs, - get_litellm_metadata_from_kwargs, -) -from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup -from litellm.proxy._types import UserAPIKeyAuth -from litellm.proxy.auth.auth_checks import log_db_metrics -from litellm.proxy.auth.route_checks import RouteChecks -from litellm.proxy.utils import ProxyUpdateSpend -from litellm.types.utils import ( - StandardLoggingPayload, - StandardLoggingUserAPIKeyMetadata, -) -from litellm.utils import get_end_user_id_for_cost_tracking - - -class _ProxyDBLogger(CustomLogger): - async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): - await self._PROXY_track_cost_callback( - kwargs, response_obj, start_time, end_time - ) - - async def async_post_call_failure_hook( - self, - request_data: dict, - original_exception: Exception, - user_api_key_dict: UserAPIKeyAuth, - traceback_str: Optional[str] = None, - ): - request_route = user_api_key_dict.request_route - if _ProxyDBLogger._should_track_errors_in_db() is False: - return - elif request_route is not None and not RouteChecks.is_llm_api_route( - route=request_route - ): - return - - from litellm.proxy.proxy_server import proxy_logging_obj - - _metadata = dict( - StandardLoggingUserAPIKeyMetadata( - user_api_key_hash=user_api_key_dict.api_key, - user_api_key_alias=user_api_key_dict.key_alias, - user_api_key_spend=user_api_key_dict.spend, - user_api_key_max_budget=user_api_key_dict.max_budget, - user_api_key_budget_reset_at=( - user_api_key_dict.budget_reset_at.isoformat() - if user_api_key_dict.budget_reset_at - else None - ), - user_api_key_user_email=user_api_key_dict.user_email, - user_api_key_user_id=user_api_key_dict.user_id, - user_api_key_team_id=user_api_key_dict.team_id, - user_api_key_org_id=user_api_key_dict.org_id, - user_api_key_team_alias=user_api_key_dict.team_alias, - user_api_key_end_user_id=user_api_key_dict.end_user_id, - user_api_key_request_route=user_api_key_dict.request_route, - user_api_key_auth_metadata=user_api_key_dict.metadata, - ) - ) - _metadata["user_api_key"] = user_api_key_dict.api_key - _metadata["status"] = "failure" - _metadata["error_information"] = ( - StandardLoggingPayloadSetup.get_error_information( - original_exception=original_exception, - traceback_str=traceback_str, - ) - ) - - existing_metadata: dict = request_data.get("metadata", None) or {} - existing_metadata.update(_metadata) - - if "litellm_params" not in request_data: - request_data["litellm_params"] = {} - - existing_litellm_params = request_data.get("litellm_params", {}) - existing_litellm_metadata = existing_litellm_params.get("metadata", {}) or {} - - # Preserve tags from existing metadata - if existing_litellm_metadata.get("tags"): - existing_metadata["tags"] = existing_litellm_metadata.get("tags") - - request_data["litellm_params"]["proxy_server_request"] = ( - request_data.get("proxy_server_request") or existing_litellm_params.get("proxy_server_request") or {} - ) - request_data["litellm_params"]["metadata"] = existing_metadata - - # Preserve model name and custom_llm_provider - if "model" not in request_data: - request_data["model"] = existing_litellm_params.get("model") or request_data.get("model", "") - if "custom_llm_provider" not in request_data: - request_data["custom_llm_provider"] = existing_litellm_params.get("custom_llm_provider") or request_data.get("custom_llm_provider", "") - - await proxy_logging_obj.db_spend_update_writer.update_database( - token=user_api_key_dict.api_key, - response_cost=0.0, - user_id=user_api_key_dict.user_id, - end_user_id=user_api_key_dict.end_user_id, - team_id=user_api_key_dict.team_id, - kwargs=request_data, - completion_response=original_exception, - start_time=datetime.now(), - end_time=datetime.now(), - org_id=user_api_key_dict.org_id, - ) - - @log_db_metrics - async def _PROXY_track_cost_callback( - self, - kwargs, # kwargs to completion - completion_response: Optional[ - Union[litellm.ModelResponse, Any] - ], # response from completion - start_time=None, - end_time=None, # start/end time for completion - ): - from litellm.proxy.proxy_server import proxy_logging_obj, update_cache - - verbose_proxy_logger.debug("INSIDE _PROXY_track_cost_callback") - try: - verbose_proxy_logger.debug( - f"kwargs stream: {kwargs.get('stream', None)} + complete streaming response: {kwargs.get('complete_streaming_response', None)}" - ) - parent_otel_span = _get_parent_otel_span_from_kwargs(kwargs=kwargs) - litellm_params = kwargs.get("litellm_params", {}) or {} - end_user_id = get_end_user_id_for_cost_tracking(litellm_params) - metadata = get_litellm_metadata_from_kwargs(kwargs=kwargs) - user_id = cast(Optional[str], metadata.get("user_api_key_user_id", None)) - team_id = cast(Optional[str], metadata.get("user_api_key_team_id", None)) - org_id = cast(Optional[str], metadata.get("user_api_key_org_id", None)) - key_alias = cast(Optional[str], metadata.get("user_api_key_alias", None)) - end_user_max_budget = metadata.get("user_api_end_user_max_budget", None) - sl_object: Optional[StandardLoggingPayload] = kwargs.get( - "standard_logging_object", None - ) - response_cost = ( - sl_object.get("response_cost", None) - if sl_object is not None - else kwargs.get("response_cost", None) - ) - tags: Optional[List[str]] = ( - sl_object.get("request_tags", None) if sl_object is not None else None - ) - - if response_cost is not None: - user_api_key = metadata.get("user_api_key", None) - if kwargs.get("cache_hit", False) is True: - response_cost = 0.0 - verbose_proxy_logger.debug( - f"Cache Hit: response_cost {response_cost}, for user_id {user_id}" - ) - - verbose_proxy_logger.debug( - f"user_api_key {user_api_key}, user_id {user_id}, team_id {team_id}, end_user_id {end_user_id}" - ) - if _should_track_cost_callback( - user_api_key=user_api_key, - user_id=user_id, - team_id=team_id, - end_user_id=end_user_id, - ): - ## UPDATE DATABASE - await proxy_logging_obj.db_spend_update_writer.update_database( - token=user_api_key, - response_cost=response_cost, - user_id=user_id, - end_user_id=end_user_id, - team_id=team_id, - kwargs=kwargs, - completion_response=completion_response, - start_time=start_time, - end_time=end_time, - org_id=org_id, - ) - - # update cache - asyncio.create_task( - update_cache( - token=user_api_key, - user_id=user_id, - end_user_id=end_user_id, - response_cost=response_cost, - team_id=team_id, - parent_otel_span=parent_otel_span, - tags=tags, - ) - ) - - await proxy_logging_obj.slack_alerting_instance.customer_spend_alert( - token=user_api_key, - key_alias=key_alias, - end_user_id=end_user_id, - response_cost=response_cost, - max_budget=end_user_max_budget, - ) - else: - # Non-model call types (health checks, afile_delete) have no model or standard_logging_object. - # Use .get() for "stream" to avoid KeyError on health checks. - if sl_object is None and not kwargs.get("model"): - verbose_proxy_logger.warning( - "Cost tracking - skipping, no standard_logging_object and no model for call_type=%s", - kwargs.get("call_type", "unknown"), - ) - return - if kwargs.get("stream") is not True or ( - kwargs.get("stream") is True and "complete_streaming_response" in kwargs - ): - if sl_object is not None: - cost_tracking_failure_debug_info: Union[dict, str] = ( - sl_object["response_cost_failure_debug_info"] # type: ignore - or "response_cost_failure_debug_info is None in standard_logging_object" - ) - else: - cost_tracking_failure_debug_info = ( - "standard_logging_object not found" - ) - model = kwargs.get("model") - raise Exception( - f"Cost tracking failed for model={model}.\nDebug info - {cost_tracking_failure_debug_info}\nAdd custom pricing - https://docs.litellm.ai/docs/proxy/custom_pricing" - ) - except Exception as e: - error_msg = f"Error in tracking cost callback - {str(e)}\n Traceback:{traceback.format_exc()}" - model = kwargs.get("model", "") - metadata = get_litellm_metadata_from_kwargs(kwargs=kwargs) - litellm_metadata = kwargs.get("litellm_params", {}).get( - "litellm_metadata", {} - ) - old_metadata = kwargs.get("litellm_params", {}).get("metadata", {}) - call_type = kwargs.get("call_type", "") - error_msg += f"\n Args to _PROXY_track_cost_callback\n model: {model}\n chosen_metadata: {metadata}\n litellm_metadata: {litellm_metadata}\n old_metadata: {old_metadata}\n call_type: {call_type}\n" - asyncio.create_task( - proxy_logging_obj.failed_tracking_alert( - error_message=error_msg, - failing_model=model, - ) - ) - - verbose_proxy_logger.exception( - "Error in tracking cost callback - %s", str(e) - ) - - @staticmethod - def _should_track_errors_in_db(): - """ - Returns True if errors should be tracked in the database - - By default, errors are tracked in the database - - If users want to disable error tracking, they can set the disable_error_logs flag in the general_settings - """ - from litellm.proxy.proxy_server import general_settings - - if general_settings.get("disable_error_logs") is True: - return False - return - - -def _should_track_cost_callback( - user_api_key: Optional[str], - user_id: Optional[str], - team_id: Optional[str], - end_user_id: Optional[str], -) -> bool: - """ - Determine if the cost callback should be tracked based on the kwargs - """ - - # don't run track cost callback if user opted into disabling spend - if ProxyUpdateSpend.disable_spend_updates() is True: - return False - - if ( - user_api_key is not None - or user_id is not None - or team_id is not None - or end_user_id is not None - ): - return True - return False +import asyncio +import traceback +from datetime import datetime +from typing import Any, List, Optional, Union, cast + +import litellm +from litellm._logging import verbose_proxy_logger +from litellm.integrations.custom_logger import CustomLogger +from litellm.litellm_core_utils.core_helpers import ( + _get_parent_otel_span_from_kwargs, + get_litellm_metadata_from_kwargs, +) +from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup +from litellm.proxy._types import UserAPIKeyAuth +from litellm.proxy.auth.auth_checks import log_db_metrics +from litellm.proxy.auth.route_checks import RouteChecks +from litellm.proxy.utils import ProxyUpdateSpend +from litellm.types.utils import ( + StandardLoggingPayload, + StandardLoggingUserAPIKeyMetadata, +) +from litellm.utils import get_end_user_id_for_cost_tracking + + +class _ProxyDBLogger(CustomLogger): + async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): + await self._PROXY_track_cost_callback( + kwargs, response_obj, start_time, end_time + ) + + async def async_post_call_failure_hook( + self, + request_data: dict, + original_exception: Exception, + user_api_key_dict: UserAPIKeyAuth, + traceback_str: Optional[str] = None, + ): + request_route = user_api_key_dict.request_route + if _ProxyDBLogger._should_track_errors_in_db() is False: + return + elif request_route is not None and not RouteChecks.is_llm_api_route( + route=request_route + ): + return + + from litellm.proxy.proxy_server import proxy_logging_obj + + _metadata = dict( + StandardLoggingUserAPIKeyMetadata( + user_api_key_hash=user_api_key_dict.api_key, + user_api_key_alias=user_api_key_dict.key_alias, + user_api_key_spend=user_api_key_dict.spend, + user_api_key_max_budget=user_api_key_dict.max_budget, + user_api_key_budget_reset_at=( + user_api_key_dict.budget_reset_at.isoformat() + if user_api_key_dict.budget_reset_at + else None + ), + user_api_key_user_email=user_api_key_dict.user_email, + user_api_key_user_id=user_api_key_dict.user_id, + user_api_key_team_id=user_api_key_dict.team_id, + user_api_key_org_id=user_api_key_dict.org_id, + user_api_key_project_id=user_api_key_dict.project_id, + user_api_key_team_alias=user_api_key_dict.team_alias, + user_api_key_end_user_id=user_api_key_dict.end_user_id, + user_api_key_request_route=user_api_key_dict.request_route, + user_api_key_auth_metadata=user_api_key_dict.metadata, + ) + ) + _metadata["user_api_key"] = user_api_key_dict.api_key + _metadata["status"] = "failure" + _metadata[ + "error_information" + ] = StandardLoggingPayloadSetup.get_error_information( + original_exception=original_exception, + traceback_str=traceback_str, + ) + + existing_metadata: dict = request_data.get("metadata", None) or {} + existing_metadata.update(_metadata) + + if "litellm_params" not in request_data: + request_data["litellm_params"] = {} + + existing_litellm_params = request_data.get("litellm_params", {}) + existing_litellm_metadata = existing_litellm_params.get("metadata", {}) or {} + + # Preserve tags from existing metadata + if existing_litellm_metadata.get("tags"): + existing_metadata["tags"] = existing_litellm_metadata.get("tags") + + request_data["litellm_params"]["proxy_server_request"] = ( + request_data.get("proxy_server_request") + or existing_litellm_params.get("proxy_server_request") + or {} + ) + request_data["litellm_params"]["metadata"] = existing_metadata + + # Preserve model name and custom_llm_provider + if "model" not in request_data: + request_data["model"] = existing_litellm_params.get( + "model" + ) or request_data.get("model", "") + if "custom_llm_provider" not in request_data: + request_data["custom_llm_provider"] = existing_litellm_params.get( + "custom_llm_provider" + ) or request_data.get("custom_llm_provider", "") + + await proxy_logging_obj.db_spend_update_writer.update_database( + token=user_api_key_dict.api_key, + response_cost=0.0, + user_id=user_api_key_dict.user_id, + end_user_id=user_api_key_dict.end_user_id, + team_id=user_api_key_dict.team_id, + kwargs=request_data, + completion_response=original_exception, + start_time=datetime.now(), + end_time=datetime.now(), + org_id=user_api_key_dict.org_id, + ) + + @log_db_metrics + async def _PROXY_track_cost_callback( + self, + kwargs, # kwargs to completion + completion_response: Optional[ + Union[litellm.ModelResponse, Any] + ], # response from completion + start_time=None, + end_time=None, # start/end time for completion + ): + from litellm.proxy.proxy_server import proxy_logging_obj, update_cache + + verbose_proxy_logger.debug("INSIDE _PROXY_track_cost_callback") + try: + verbose_proxy_logger.debug( + f"kwargs stream: {kwargs.get('stream', None)} + complete streaming response: {kwargs.get('complete_streaming_response', None)}" + ) + parent_otel_span = _get_parent_otel_span_from_kwargs(kwargs=kwargs) + litellm_params = kwargs.get("litellm_params", {}) or {} + end_user_id = get_end_user_id_for_cost_tracking(litellm_params) + metadata = get_litellm_metadata_from_kwargs(kwargs=kwargs) + user_id = cast(Optional[str], metadata.get("user_api_key_user_id", None)) + team_id = cast(Optional[str], metadata.get("user_api_key_team_id", None)) + org_id = cast(Optional[str], metadata.get("user_api_key_org_id", None)) + key_alias = cast(Optional[str], metadata.get("user_api_key_alias", None)) + end_user_max_budget = metadata.get("user_api_end_user_max_budget", None) + sl_object: Optional[StandardLoggingPayload] = kwargs.get( + "standard_logging_object", None + ) + response_cost = ( + sl_object.get("response_cost", None) + if sl_object is not None + else kwargs.get("response_cost", None) + ) + tags: Optional[List[str]] = ( + sl_object.get("request_tags", None) if sl_object is not None else None + ) + + if response_cost is not None: + user_api_key = metadata.get("user_api_key", None) + if kwargs.get("cache_hit", False) is True: + response_cost = 0.0 + verbose_proxy_logger.debug( + f"Cache Hit: response_cost {response_cost}, for user_id {user_id}" + ) + + verbose_proxy_logger.debug( + f"user_api_key {user_api_key}, user_id {user_id}, team_id {team_id}, end_user_id {end_user_id}" + ) + if _should_track_cost_callback( + user_api_key=user_api_key, + user_id=user_id, + team_id=team_id, + end_user_id=end_user_id, + ): + ## UPDATE DATABASE + await proxy_logging_obj.db_spend_update_writer.update_database( + token=user_api_key, + response_cost=response_cost, + user_id=user_id, + end_user_id=end_user_id, + team_id=team_id, + kwargs=kwargs, + completion_response=completion_response, + start_time=start_time, + end_time=end_time, + org_id=org_id, + ) + + # update cache + asyncio.create_task( + update_cache( + token=user_api_key, + user_id=user_id, + end_user_id=end_user_id, + response_cost=response_cost, + team_id=team_id, + parent_otel_span=parent_otel_span, + tags=tags, + ) + ) + + await proxy_logging_obj.slack_alerting_instance.customer_spend_alert( + token=user_api_key, + key_alias=key_alias, + end_user_id=end_user_id, + response_cost=response_cost, + max_budget=end_user_max_budget, + ) + else: + # Non-model call types (health checks, afile_delete) have no model or standard_logging_object. + # Use .get() for "stream" to avoid KeyError on health checks. + if sl_object is None and not kwargs.get("model"): + verbose_proxy_logger.warning( + "Cost tracking - skipping, no standard_logging_object and no model for call_type=%s", + kwargs.get("call_type", "unknown"), + ) + return + if kwargs.get("stream") is not True or ( + kwargs.get("stream") is True + and "complete_streaming_response" in kwargs + ): + if sl_object is not None: + cost_tracking_failure_debug_info: Union[dict, str] = ( + sl_object["response_cost_failure_debug_info"] # type: ignore + or "response_cost_failure_debug_info is None in standard_logging_object" + ) + else: + cost_tracking_failure_debug_info = ( + "standard_logging_object not found" + ) + model = kwargs.get("model") + raise Exception( + f"Cost tracking failed for model={model}.\nDebug info - {cost_tracking_failure_debug_info}\nAdd custom pricing - https://docs.litellm.ai/docs/proxy/custom_pricing" + ) + except Exception as e: + error_msg = f"Error in tracking cost callback - {str(e)}\n Traceback:{traceback.format_exc()}" + model = kwargs.get("model", "") + metadata = get_litellm_metadata_from_kwargs(kwargs=kwargs) + litellm_metadata = kwargs.get("litellm_params", {}).get( + "litellm_metadata", {} + ) + old_metadata = kwargs.get("litellm_params", {}).get("metadata", {}) + call_type = kwargs.get("call_type", "") + error_msg += f"\n Args to _PROXY_track_cost_callback\n model: {model}\n chosen_metadata: {metadata}\n litellm_metadata: {litellm_metadata}\n old_metadata: {old_metadata}\n call_type: {call_type}\n" + asyncio.create_task( + proxy_logging_obj.failed_tracking_alert( + error_message=error_msg, + failing_model=model, + ) + ) + + verbose_proxy_logger.exception( + "Error in tracking cost callback - %s", str(e) + ) + + @staticmethod + def _should_track_errors_in_db(): + """ + Returns True if errors should be tracked in the database + + By default, errors are tracked in the database + + If users want to disable error tracking, they can set the disable_error_logs flag in the general_settings + """ + from litellm.proxy.proxy_server import general_settings + + if general_settings.get("disable_error_logs") is True: + return False + return + + +def _should_track_cost_callback( + user_api_key: Optional[str], + user_id: Optional[str], + team_id: Optional[str], + end_user_id: Optional[str], +) -> bool: + """ + Determine if the cost callback should be tracked based on the kwargs + """ + + # don't run track cost callback if user opted into disabling spend + if ProxyUpdateSpend.disable_spend_updates() is True: + return False + + if ( + user_api_key is not None + or user_id is not None + or team_id is not None + or end_user_id is not None + ): + return True + return False diff --git a/litellm/proxy/pass_through_endpoints/pass_through_endpoints.py b/litellm/proxy/pass_through_endpoints/pass_through_endpoints.py index 56b513554a8..2104a606045 100644 --- a/litellm/proxy/pass_through_endpoints/pass_through_endpoints.py +++ b/litellm/proxy/pass_through_endpoints/pass_through_endpoints.py @@ -1,2744 +1,2745 @@ -import ast -import asyncio -import copy -import json -import traceback -from base64 import b64encode -from datetime import datetime -from typing import Any, Dict, List, Optional, Tuple, Union, cast -from urllib.parse import urlencode, urlparse - -import httpx -from fastapi import ( - APIRouter, - Depends, - FastAPI, - HTTPException, - Request, - Response, - UploadFile, - WebSocket, - status, -) -from fastapi.responses import StreamingResponse -from starlette.datastructures import UploadFile as StarletteUploadFile -from starlette.websockets import WebSocketState -from websockets.asyncio.client import connect -from websockets.exceptions import ( - ConnectionClosedError, - ConnectionClosedOK, - InvalidStatus, -) - -import litellm -from litellm._logging import verbose_proxy_logger -from litellm._uuid import uuid -from litellm.constants import MAXIMUM_TRACEBACK_LINES_TO_LOG -from litellm.integrations.custom_logger import CustomLogger -from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj -from litellm.litellm_core_utils.safe_json_dumps import safe_dumps -from litellm.llms.custom_httpx.http_handler import get_async_httpx_client -from litellm.passthrough import BasePassthroughUtils -from litellm.proxy._types import ( - ConfigFieldInfo, - ConfigFieldUpdate, - LiteLLMRoutes, - PassThroughEndpointResponse, - PassThroughGenericEndpoint, - ProxyException, - UserAPIKeyAuth, -) -from litellm.proxy.auth.user_api_key_auth import user_api_key_auth -from litellm.proxy.common_request_processing import ProxyBaseLLMRequestProcessing -from litellm.proxy.common_utils.http_parsing_utils import _read_request_body -from litellm.proxy.utils import get_server_root_path -from litellm.secret_managers.main import get_secret_str -from litellm.types.llms.custom_http import httpxSpecialProvider -from litellm.types.passthrough_endpoints.pass_through_endpoints import ( - EndpointType, - PassthroughStandardLoggingPayload, -) -from litellm.types.utils import StandardLoggingUserAPIKeyMetadata - -from .streaming_handler import PassThroughStreamingHandler -from .success_handler import PassThroughEndpointLogging - -router = APIRouter() - -pass_through_endpoint_logging = PassThroughEndpointLogging() - -# Global registry to track registered pass-through routes and prevent memory leaks -_registered_pass_through_routes: Dict[str, Dict[str, Union[str, Dict[str, Any]]]] = {} - - -def get_response_body(response: httpx.Response) -> Optional[dict]: - try: - return response.json() - except Exception: - return None - - -async def set_env_variables_in_header(custom_headers: Optional[dict]) -> Optional[dict]: - """ - checks if any headers on config.yaml are defined as os.environ/COHERE_API_KEY etc - - only runs for headers defined on config.yaml - - example header can be - - {"Authorization": "Bearer os.environ/COHERE_API_KEY"} - """ - if custom_headers is None: - return None - headers = {} - for key, value in custom_headers.items(): - # langfuse Api requires base64 encoded headers - it's simpleer to just ask litellm users to set their langfuse public and secret keys - # we can then get the b64 encoded keys here - if key == "LANGFUSE_PUBLIC_KEY" or key == "LANGFUSE_SECRET_KEY": - # langfuse requires b64 encoded headers - we construct that here - _langfuse_public_key = custom_headers["LANGFUSE_PUBLIC_KEY"] - _langfuse_secret_key = custom_headers["LANGFUSE_SECRET_KEY"] - if isinstance( - _langfuse_public_key, str - ) and _langfuse_public_key.startswith("os.environ/"): - _langfuse_public_key = get_secret_str(_langfuse_public_key) - if isinstance( - _langfuse_secret_key, str - ) and _langfuse_secret_key.startswith("os.environ/"): - _langfuse_secret_key = get_secret_str(_langfuse_secret_key) - headers["Authorization"] = "Basic " + b64encode( - f"{_langfuse_public_key}:{_langfuse_secret_key}".encode("utf-8") - ).decode("ascii") - else: - # for all other headers - headers[key] = value - if isinstance(value, str) and "os.environ/" in value: - verbose_proxy_logger.debug( - "pass through endpoint - looking up 'os.environ/' variable" - ) - # get string section that is os.environ/ - start_index = value.find("os.environ/") - _variable_name = value[start_index:] - - verbose_proxy_logger.debug( - "pass through endpoint - getting secret for variable name: %s", - _variable_name, - ) - _secret_value = get_secret_str(_variable_name) - if _secret_value is not None: - new_value = value.replace(_variable_name, _secret_value) - headers[key] = new_value - return headers - - -async def chat_completion_pass_through_endpoint( # noqa: PLR0915 - fastapi_response: Response, - request: Request, - adapter_id: str, - user_api_key_dict: UserAPIKeyAuth, -): - from litellm.proxy.proxy_server import ( - add_litellm_data_to_request, - general_settings, - llm_router, - proxy_config, - proxy_logging_obj, - user_api_base, - user_max_tokens, - user_model, - user_request_timeout, - user_temperature, - version, - ) - - data = {} - try: - body = await request.body() - body_str = body.decode() - try: - data = ast.literal_eval(body_str) - except Exception: - data = json.loads(body_str) - - data["adapter_id"] = adapter_id - - verbose_proxy_logger.debug( - "Request received by LiteLLM:\n{}".format(json.dumps(data, indent=4)), - ) - data["model"] = ( - general_settings.get("completion_model", None) # server default - or user_model # model name passed via cli args - or data.get("model", None) # default passed in http request - ) - if user_model: - data["model"] = user_model - - data = await add_litellm_data_to_request( - data=data, # type: ignore - request=request, - general_settings=general_settings, - user_api_key_dict=user_api_key_dict, - version=version, - proxy_config=proxy_config, - ) - - # override with user settings, these are params passed via cli - if user_temperature: - data["temperature"] = user_temperature - if user_request_timeout: - data["request_timeout"] = user_request_timeout - if user_max_tokens: - data["max_tokens"] = user_max_tokens - if user_api_base: - data["api_base"] = user_api_base - - ### MODEL ALIAS MAPPING ### - # check if model name in model alias map - # get the actual model name - if data["model"] in litellm.model_alias_map: - data["model"] = litellm.model_alias_map[data["model"]] - - # Check key-specific aliases - if ( - isinstance(data["model"], str) - and user_api_key_dict.aliases - and isinstance(user_api_key_dict.aliases, dict) - and data["model"] in user_api_key_dict.aliases - ): - data["model"] = user_api_key_dict.aliases[data["model"]] - - ### CALL HOOKS ### - modify incoming data before calling the model - data = await proxy_logging_obj.pre_call_hook( # type: ignore - user_api_key_dict=user_api_key_dict, data=data, call_type="text_completion" - ) - - ### ROUTE THE REQUESTs ### - router_model_names = llm_router.model_names if llm_router is not None else [] - # skip router if user passed their key - if "api_key" in data: - llm_response = asyncio.create_task(litellm.aadapter_completion(**data)) - elif ( - llm_router is not None and data["model"] in router_model_names - ): # model in router model list - llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) - elif ( - llm_router is not None - and llm_router.model_group_alias is not None - and data["model"] in llm_router.model_group_alias - ): # model set in model_group_alias - llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) - elif llm_router is not None and llm_router.has_model_id( - data["model"] - ): # model in router model list - llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) - elif ( - llm_router is not None - and data["model"] not in router_model_names - and ( - llm_router.default_deployment is not None - or len(llm_router.pattern_router.patterns) > 0 - ) - ): # check for wildcard routes or default deployment before checking deployment_names - llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) - elif ( - llm_router is not None and data["model"] in llm_router.deployment_names - ): # model in router deployments, calling a specific deployment on the router (lowest priority) - llm_response = asyncio.create_task( - llm_router.aadapter_completion(**data, specific_deployment=True) - ) - elif user_model is not None: # `litellm --model ` - llm_response = asyncio.create_task(litellm.aadapter_completion(**data)) - else: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail={ - "error": "completion: Invalid model name passed in model=" - + data.get("model", "") - }, - ) - - # Await the llm_response task - response = await llm_response - - hidden_params = getattr(response, "_hidden_params", {}) or {} - model_id = hidden_params.get("model_id", None) or "" - cache_key = hidden_params.get("cache_key", None) or "" - api_base = hidden_params.get("api_base", None) or "" - response_cost = hidden_params.get("response_cost", None) or "" - - ### ALERTING ### - asyncio.create_task( - proxy_logging_obj.update_request_status( - litellm_call_id=data.get("litellm_call_id", ""), status="success" - ) - ) - - verbose_proxy_logger.debug("final response: %s", response) - - fastapi_response.headers.update( - ProxyBaseLLMRequestProcessing.get_custom_headers( - user_api_key_dict=user_api_key_dict, - model_id=model_id, - cache_key=cache_key, - api_base=api_base, - version=version, - response_cost=response_cost, - ) - ) - - verbose_proxy_logger.debug("\nResponse from Litellm:\n{}".format(response)) - return response - except Exception as e: - await proxy_logging_obj.post_call_failure_hook( - user_api_key_dict=user_api_key_dict, original_exception=e, request_data=data - ) - verbose_proxy_logger.exception( - "litellm.proxy.proxy_server.completion(): Exception occured - {}".format( - str(e) - ) - ) - error_msg = f"{str(e)}" - raise ProxyException( - message=getattr(e, "message", error_msg), - type=getattr(e, "type", "None"), - param=getattr(e, "param", "None"), - code=getattr(e, "status_code", 500), - ) - - -class HttpPassThroughEndpointHelpers(BasePassthroughUtils): - @staticmethod - def get_response_headers( - headers: httpx.Headers, - litellm_call_id: Optional[str] = None, - custom_headers: Optional[dict] = None, - ) -> dict: - excluded_headers = {"transfer-encoding", "content-encoding"} - - return_headers = { - key: value - for key, value in headers.items() - if key.lower() not in excluded_headers - } - if litellm_call_id: - return_headers["x-litellm-call-id"] = litellm_call_id - if custom_headers: - return_headers.update(custom_headers) - - return return_headers - - @staticmethod - def get_endpoint_type(url: str) -> EndpointType: - parsed_url = urlparse(url) - if ( - ("generateContent") in url - or ("streamGenerateContent") in url - or ("rawPredict") in url - or ("streamRawPredict") in url - ): - return EndpointType.VERTEX_AI - elif parsed_url.hostname == "api.anthropic.com": - return EndpointType.ANTHROPIC - elif ( - parsed_url.hostname == "api.openai.com" - or parsed_url.hostname == "openai.azure.com" - or (parsed_url.hostname and "openai.com" in parsed_url.hostname) - ): - return EndpointType.OPENAI - return EndpointType.GENERIC - - @staticmethod - async def _make_non_streaming_http_request( - request: Request, - async_client: httpx.AsyncClient, - url: str, - headers: dict, - requested_query_params: Optional[dict] = None, - custom_body: Optional[dict] = None, - ) -> httpx.Response: - """ - Make a non-streaming HTTP request - - If request is GET, don't include a JSON body - """ - if request.method == "GET": - response = await async_client.request( - method=request.method, - url=url, - headers=headers, - params=requested_query_params, - ) - else: - response = await async_client.request( - method=request.method, - url=url, - headers=headers, - params=requested_query_params, - json=custom_body, - ) - return response - - @staticmethod - async def non_streaming_http_request_handler( - request: Request, - async_client: httpx.AsyncClient, - url: httpx.URL, - headers: dict, - requested_query_params: Optional[dict] = None, - _parsed_body: Optional[dict] = None, - ) -> httpx.Response: - """ - Handle non-streaming HTTP requests - - Handles special cases when GET requests, multipart/form-data requests, and generic httpx requests - """ - if request.method == "GET": - response = await async_client.request( - method=request.method, - url=url, - headers=headers, - params=requested_query_params, - ) - elif HttpPassThroughEndpointHelpers.is_multipart(request) is True: - return await HttpPassThroughEndpointHelpers.make_multipart_http_request( - request=request, - async_client=async_client, - url=url, - headers=headers, - requested_query_params=requested_query_params, - ) - else: - # Generic httpx method - response = await async_client.request( - method=request.method, - url=url, - headers=headers, - params=requested_query_params, - json=_parsed_body, - ) - return response - - @staticmethod - def is_multipart(request: Request) -> bool: - """Check if the request is a multipart/form-data request""" - return "multipart/form-data" in request.headers.get("content-type", "") - - @staticmethod - async def _build_request_files_from_upload_file( - upload_file: Union[UploadFile, StarletteUploadFile], - ) -> Tuple[Optional[str], bytes, Optional[str]]: - """Build a request files dict from an UploadFile object""" - file_content = await upload_file.read() - return (upload_file.filename, file_content, upload_file.content_type) - - @staticmethod - async def make_multipart_http_request( - request: Request, - async_client: httpx.AsyncClient, - url: httpx.URL, - headers: dict, - requested_query_params: Optional[dict] = None, - ) -> httpx.Response: - """Process multipart/form-data requests, handling both files and form fields""" - form_data = await request.form() - files = {} - form_data_dict = {} - - for field_name, field_value in form_data.items(): - if isinstance(field_value, (StarletteUploadFile, UploadFile)): - files[ - field_name - ] = await HttpPassThroughEndpointHelpers._build_request_files_from_upload_file( - upload_file=field_value - ) - else: - form_data_dict[field_name] = field_value - - # Remove content-type header - httpx will set it correctly with the new boundary - # when it creates the multipart body from files/data parameters - headers_copy = headers.copy() - headers_copy.pop("content-type", None) - - response = await async_client.request( - method=request.method, - url=url, - headers=headers_copy, - params=requested_query_params, - files=files, - data=form_data_dict, - ) - return response - - @staticmethod - def _init_kwargs_for_pass_through_endpoint( - request: Request, - user_api_key_dict: UserAPIKeyAuth, - passthrough_logging_payload: PassthroughStandardLoggingPayload, - logging_obj: LiteLLMLoggingObj, - _parsed_body: Optional[dict] = None, - litellm_call_id: Optional[str] = None, - ) -> dict: - """ - Filter out litellm params from the request body - """ - from litellm.types.utils import all_litellm_params - - _parsed_body = _parsed_body or {} - - litellm_params_in_body = {} - for k in all_litellm_params: - if k in _parsed_body: - litellm_params_in_body[k] = _parsed_body.pop(k, None) - - _metadata = dict( - StandardLoggingUserAPIKeyMetadata( - user_api_key_hash=user_api_key_dict.api_key, - user_api_key_alias=user_api_key_dict.key_alias, - user_api_key_user_email=user_api_key_dict.user_email, - user_api_key_user_id=user_api_key_dict.user_id, - user_api_key_team_id=user_api_key_dict.team_id, - user_api_key_org_id=user_api_key_dict.org_id, - user_api_key_team_alias=user_api_key_dict.team_alias, - user_api_key_end_user_id=user_api_key_dict.end_user_id, - user_api_key_request_route=user_api_key_dict.request_route, - user_api_key_spend=user_api_key_dict.spend, - user_api_key_max_budget=user_api_key_dict.max_budget, - user_api_key_budget_reset_at=( - user_api_key_dict.budget_reset_at.isoformat() - if user_api_key_dict.budget_reset_at - else None - ), - user_api_key_auth_metadata=user_api_key_dict.metadata, - ) - ) - - _metadata["user_api_key"] = user_api_key_dict.api_key - - litellm_metadata = litellm_params_in_body.pop("litellm_metadata", None) - metadata = litellm_params_in_body.pop("metadata", None) - if litellm_metadata: - _metadata.update(litellm_metadata) - if metadata: - _metadata.update(metadata) - - _metadata = _update_metadata_with_tags_in_header( - request=request, - metadata=_metadata, - ) - - kwargs = { - "litellm_params": { - **litellm_params_in_body, # type: ignore - "metadata": _metadata, - "proxy_server_request": { - "url": str(request.url), - "method": request.method, - "body": copy.copy(_parsed_body), # use copy instead of deepcopy - "headers": request.headers, - }, - }, - "call_type": "pass_through_endpoint", - "litellm_call_id": litellm_call_id, - "passthrough_logging_payload": passthrough_logging_payload, - } - - logging_obj.model_call_details[ - "passthrough_logging_payload" - ] = passthrough_logging_payload - - return kwargs - - @staticmethod - def construct_target_url_with_subpath( - base_target: str, subpath: str, include_subpath: Optional[bool] - ) -> str: - """ - Helper function to construct the full target URL with subpath handling. - - Args: - base_target: The base target URL - subpath: The captured subpath from the request - include_subpath: Whether to include the subpath in the target URL - - Returns: - The constructed full target URL - """ - if not include_subpath: - return base_target - - if not subpath: - return base_target - - # Ensure base_target ends with / and subpath doesn't start with / - if not base_target.endswith("/"): - base_target = base_target + "/" - if subpath.startswith("/"): - subpath = subpath[1:] - - return base_target + subpath - - @staticmethod - def _update_stream_param_based_on_request_body( - parsed_body: dict, - stream: Optional[bool] = None, - ) -> Optional[bool]: - """ - If stream is provided in the request body, use it. - Otherwise, use the stream parameter passed to the `pass_through_request` function - """ - if "stream" in parsed_body: - return parsed_body.get("stream", stream) - return stream - - -async def pass_through_request( # noqa: PLR0915 - request: Request, - target: str, - custom_headers: dict, - user_api_key_dict: UserAPIKeyAuth, - custom_body: Optional[dict] = None, - forward_headers: Optional[bool] = False, - merge_query_params: Optional[bool] = False, - query_params: Optional[dict] = None, - stream: Optional[bool] = None, - cost_per_request: Optional[float] = None, - custom_llm_provider: Optional[str] = None, - guardrails_config: Optional[dict] = None, -): - """ - Pass through endpoint handler, makes the httpx request for pass-through endpoints and ensures logging hooks are called - - Args: - request: The incoming request - target: The target URL - custom_headers: The custom headers - user_api_key_dict: The user API key dictionary - custom_body: The custom body - forward_headers: Whether to forward headers - merge_query_params: Whether to merge query params - query_params: The query params - stream: Whether to stream the response - cost_per_request: Optional field - cost per request to the target endpoint - custom_llm_provider: Optional field - custom LLM provider for the endpoint - guardrails_config: Optional field - guardrails configuration for passthrough endpoint - """ - from litellm.litellm_core_utils.litellm_logging import Logging - from litellm.proxy.pass_through_endpoints.passthrough_guardrails import ( - PassthroughGuardrailHandler, - ) - from litellm.proxy.proxy_server import proxy_logging_obj - - ######################################################### - # Initialize variables - ######################################################### - litellm_call_id = str(uuid.uuid4()) - url: Optional[httpx.URL] = None - - # parsed request body - _parsed_body: Optional[dict] = None - # kwargs for pass through endpoint, contains metadata, litellm_params, call_type, litellm_call_id, passthrough_logging_payload - kwargs: Optional[dict] = None - - ######################################################### - try: - url = httpx.URL(target) - headers = custom_headers - headers = HttpPassThroughEndpointHelpers.forward_headers_from_request( - request_headers=dict(request.headers), - headers=headers, - forward_headers=forward_headers, - ) - - if merge_query_params: - # Create a new URL with the merged query params - url = url.copy_with( - query=urlencode( - HttpPassThroughEndpointHelpers.get_merged_query_parameters( - existing_url=url, - request_query_params=dict(request.query_params), - ) - ).encode("ascii") - ) - - endpoint_type: EndpointType = HttpPassThroughEndpointHelpers.get_endpoint_type( - str(url) - ) - - if custom_body: - _parsed_body = custom_body - else: - _parsed_body = await _read_request_body(request) - verbose_proxy_logger.debug( - "Pass through endpoint sending request to \nURL {}\nheaders: {}\nbody: {}\n".format( - url, headers, _parsed_body - ) - ) - - ### COLLECT GUARDRAILS FOR PASSTHROUGH ENDPOINT ### - # Passthrough endpoints are opt-in only for guardrails - # When enabled, collect guardrails from org/team/key levels + passthrough-specific - guardrails_to_run = PassthroughGuardrailHandler.collect_guardrails( - user_api_key_dict=user_api_key_dict, - passthrough_guardrails_config=guardrails_config, - ) - - # Add guardrails to metadata if any should run - if guardrails_to_run and len(guardrails_to_run) > 0: - if _parsed_body is None: - _parsed_body = {} - if "metadata" not in _parsed_body: - _parsed_body["metadata"] = {} - _parsed_body["metadata"]["guardrails"] = guardrails_to_run - verbose_proxy_logger.debug( - f"Added guardrails to passthrough request metadata: {guardrails_to_run}" - ) - - ## LOGGING OBJECT ## - initialize before pre_call_hook so guardrails can access it - start_time = datetime.now() - logging_obj = Logging( - model="unknown", - messages=[{"role": "user", "content": safe_dumps(_parsed_body)}], - stream=False, - call_type="pass_through_endpoint", - start_time=start_time, - litellm_call_id=litellm_call_id, - function_id="1245", - ) - - # Store passthrough guardrails config on logging_obj for field targeting - logging_obj.passthrough_guardrails_config = guardrails_config - - # Store logging_obj in data so guardrails can access it - if _parsed_body is None: - _parsed_body = {} - _parsed_body["litellm_logging_obj"] = logging_obj - - ### CALL HOOKS ### - modify incoming data / reject request before calling the model - _parsed_body = await proxy_logging_obj.pre_call_hook( - user_api_key_dict=user_api_key_dict, - data=_parsed_body, - call_type="pass_through_endpoint", - ) - async_client_obj = get_async_httpx_client( - llm_provider=httpxSpecialProvider.PassThroughEndpoint, - params={"timeout": 600}, - ) - async_client = async_client_obj.client - passthrough_logging_payload = PassthroughStandardLoggingPayload( - url=str(url), - request_body=_parsed_body, - request_method=getattr(request, "method", None), - cost_per_request=cost_per_request, - ) - kwargs = HttpPassThroughEndpointHelpers._init_kwargs_for_pass_through_endpoint( - user_api_key_dict=user_api_key_dict, - _parsed_body=_parsed_body, - passthrough_logging_payload=passthrough_logging_payload, - litellm_call_id=litellm_call_id, - request=request, - logging_obj=logging_obj, - ) - - # Store custom_llm_provider in kwargs and logging object if provided - if custom_llm_provider: - logging_obj.model_call_details["custom_llm_provider"] = custom_llm_provider - logging_obj.model_call_details["litellm_params"] = kwargs.get( - "litellm_params", {} - ) - - # done for supporting 'parallel_request_limiter.py' with pass-through endpoints - logging_obj.update_environment_variables( - model="unknown", - user="unknown", - optional_params={}, - litellm_params=kwargs["litellm_params"], - call_type="pass_through_endpoint", - ) - logging_obj.model_call_details["litellm_call_id"] = litellm_call_id - - # combine url with query params for logging - requested_query_params: Optional[dict] = query_params or dict( - request.query_params - ) - - requested_query_params_str = None - if requested_query_params: - requested_query_params_str = "&".join( - f"{k}={v}" for k, v in requested_query_params.items() - ) - - logging_url = str(url) - if requested_query_params_str: - if "?" in str(url): - logging_url = str(url) + "&" + requested_query_params_str - else: - logging_url = str(url) + "?" + requested_query_params_str - - logging_obj.pre_call( - input=[{"role": "user", "content": safe_dumps(_parsed_body)}], - api_key="", - additional_args={ - "complete_input_dict": _parsed_body, - "api_base": str(logging_url), - "headers": headers, - }, - ) - stream = ( - HttpPassThroughEndpointHelpers._update_stream_param_based_on_request_body( - parsed_body=_parsed_body, - stream=stream, - ) - ) - - if stream: - req = async_client.build_request( - "POST", - url, - json=_parsed_body, - params=requested_query_params, - headers=headers, - ) - - response = await async_client.send(req, stream=stream) - - try: - response.raise_for_status() - except httpx.HTTPStatusError as e: - raise HTTPException( - status_code=e.response.status_code, detail=await e.response.aread() - ) - - return StreamingResponse( - PassThroughStreamingHandler.chunk_processor( - response=response, - request_body=_parsed_body, - litellm_logging_obj=logging_obj, - endpoint_type=endpoint_type, - start_time=start_time, - passthrough_success_handler_obj=pass_through_endpoint_logging, - url_route=str(url), - ), - headers=HttpPassThroughEndpointHelpers.get_response_headers( - headers=response.headers, - litellm_call_id=litellm_call_id, - ), - status_code=response.status_code, - ) - - response = ( - await HttpPassThroughEndpointHelpers.non_streaming_http_request_handler( - request=request, - async_client=async_client, - url=url, - headers=headers, - requested_query_params=requested_query_params, - _parsed_body=_parsed_body, - ) - ) - verbose_proxy_logger.debug("response.headers= %s", response.headers) - - if _is_streaming_response(response) is True: - try: - response.raise_for_status() - except httpx.HTTPStatusError as e: - raise HTTPException( - status_code=e.response.status_code, detail=await e.response.aread() - ) - - return StreamingResponse( - PassThroughStreamingHandler.chunk_processor( - response=response, - request_body=_parsed_body, - litellm_logging_obj=logging_obj, - endpoint_type=endpoint_type, - start_time=start_time, - passthrough_success_handler_obj=pass_through_endpoint_logging, - url_route=str(url), - ), - headers=HttpPassThroughEndpointHelpers.get_response_headers( - headers=response.headers, - litellm_call_id=litellm_call_id, - ), - status_code=response.status_code, - ) - - try: - response.raise_for_status() - except httpx.HTTPStatusError as e: - raise HTTPException( - status_code=e.response.status_code, detail=e.response.text - ) - - if response.status_code >= 300: - raise HTTPException(status_code=response.status_code, detail=response.text) - - content = await response.aread() - - ## LOG SUCCESS - response_body: Optional[dict] = get_response_body(response) - passthrough_logging_payload["response_body"] = response_body - end_time = datetime.now() - asyncio.create_task( - pass_through_endpoint_logging.pass_through_async_success_handler( - httpx_response=response, - response_body=response_body, - url_route=str(url), - result="", - start_time=start_time, - end_time=end_time, - logging_obj=logging_obj, - cache_hit=False, - request_body=_parsed_body, - custom_llm_provider=custom_llm_provider, - **kwargs, - ) - ) - - ## CUSTOM HEADERS - `x-litellm-*` - custom_headers = ProxyBaseLLMRequestProcessing.get_custom_headers( - user_api_key_dict=user_api_key_dict, - call_id=litellm_call_id, - model_id=None, - cache_key=None, - api_base=str(url._uri_reference), - ) - - return Response( - content=content, - status_code=response.status_code, - headers=HttpPassThroughEndpointHelpers.get_response_headers( - headers=response.headers, - custom_headers=custom_headers, - ), - ) - except Exception as e: - custom_headers = ProxyBaseLLMRequestProcessing.get_custom_headers( - user_api_key_dict=user_api_key_dict, - call_id=litellm_call_id, - model_id=None, - cache_key=None, - api_base=str(url._uri_reference) if url else None, - ) - verbose_proxy_logger.exception( - "litellm.proxy.proxy_server.pass_through_endpoint(): Exception occured - {}".format( - str(e) - ) - ) - - ######################################################### - # Monitoring: Trigger post_call_failure_hook - # for pass through endpoint failure - ######################################################### - request_payload: dict = _parsed_body or {} - # add user_api_key_dict, litellm_call_id, passthrough_logging_payloa for logging - if kwargs: - for key, value in kwargs.items(): - request_payload[key] = value - - if ( - "model" not in request_payload - and _parsed_body - and isinstance(_parsed_body, dict) - ): - request_payload["model"] = _parsed_body.get("model", "") - if "custom_llm_provider" not in request_payload and custom_llm_provider: - request_payload["custom_llm_provider"] = custom_llm_provider - - await proxy_logging_obj.post_call_failure_hook( - user_api_key_dict=user_api_key_dict, - original_exception=e, - request_data=request_payload, - traceback_str=traceback.format_exc( - limit=MAXIMUM_TRACEBACK_LINES_TO_LOG, - ), - ) - - ######################################################### - - if isinstance(e, HTTPException): - raise ProxyException( - message=getattr(e, "message", str(e.detail)), - type=getattr(e, "type", "None"), - param=getattr(e, "param", "None"), - code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST), - headers=custom_headers, - ) - else: - error_msg = f"{str(e)}" - raise ProxyException( - message=getattr(e, "message", error_msg), - type=getattr(e, "type", "None"), - param=getattr(e, "param", "None"), - code=getattr(e, "status_code", 500), - headers=custom_headers, - ) - - -def _update_metadata_with_tags_in_header(request: Request, metadata: dict) -> dict: - """ - If tags are in the request headers, add them to the metadata - - Used for google and vertex JS SDKs, and Azure passthrough - Checks both 'tags' and 'x-litellm-tags' headers - """ - tags_to_add = [] - - # Check for 'tags' header first - _tags = request.headers.get("tags") - if _tags: - tags_to_add.extend([tag.strip() for tag in _tags.split(",")]) - - _tags = request.headers.get("x-litellm-tags") - if _tags: - tags_to_add.extend([tag.strip() for tag in _tags.split(",")]) - - # Only add tags key if there are tags to add - if tags_to_add: - if "tags" not in metadata: - metadata["tags"] = [] - metadata["tags"].extend(tags_to_add) - - return metadata - - -async def _parse_request_data_by_content_type( - request: Request, -) -> Tuple[Optional[Any], Optional[Any], Optional[Any], Optional[Any]]: - """ - Parse request data based on content type. - - Handles JSON, multipart/form-data, and URL-encoded form data. - - Returns: - Tuple of (query_params_data, custom_body_data, file_data, stream) - """ - content_type = request.headers.get("content-type", "") - - query_params_data = None - custom_body_data = None - file_data = None - stream = None - - if "application/json" in content_type: - # ✅ Handle JSON - try: - body = await request.json() - query_params_data = body.get("query_params") - custom_body_data = body.get("custom_body") - stream = body.get("stream") - except json.JSONDecodeError: - # Handle requests with no body (e.g., DELETE requests) - pass - elif "multipart/form-data" in content_type: - # ✅ Handle multipart form-data - form = await request.form() - if "query_params" in form: - form_value = form["query_params"] - if isinstance(form_value, str): - try: - query_params_data = json.loads(form_value) - except Exception: - query_params_data = form_value - else: - query_params_data = form_value - - if "custom_body" in form: - form_value = form["custom_body"] - if isinstance(form_value, str): - try: - custom_body_data = json.loads(form_value) - except Exception: - custom_body_data = form_value - else: - custom_body_data = form_value - - if "file" in form: - file_data = form["file"] # this is a Starlette UploadFile object - - elif "application/x-www-form-urlencoded" in content_type: - # ✅ Handle URL-encoded form data - form = await request.form() - query_params_data = form.get("query_params") - custom_body_data = form.get("custom_body") - - else: - # ✅ Fallback: maybe no body, just query params - query_params_data = dict(request.query_params) or None - - return query_params_data, custom_body_data, file_data, stream - - -def create_pass_through_route( - endpoint, - target: str, - custom_headers: Optional[dict] = None, - _forward_headers: Optional[bool] = False, - _merge_query_params: Optional[bool] = False, - dependencies: Optional[List] = None, - include_subpath: Optional[bool] = False, - cost_per_request: Optional[float] = None, - custom_llm_provider: Optional[str] = None, - is_streaming_request: Optional[bool] = False, - query_params: Optional[dict] = None, - guardrails: Optional[Dict[str, Any]] = None, -): - # check if target is an adapter.py or a url - from litellm._uuid import uuid - from litellm.proxy.types_utils.utils import get_instance_fn - - try: - if isinstance(target, CustomLogger): - adapter = target - else: - adapter = get_instance_fn(value=target) - adapter_id = str(uuid.uuid4()) - litellm.adapters = [{"id": adapter_id, "adapter": adapter}] - - async def endpoint_func( # type: ignore - request: Request, - fastapi_response: Response, - user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), - subpath: str = "", # captures sub-paths when include_subpath=True - custom_body: Optional[dict] = None, # accepted for signature compatibility with URL-based path; not forwarded because chat_completion_pass_through_endpoint does not support it - ): - return await chat_completion_pass_through_endpoint( - fastapi_response=fastapi_response, - request=request, - adapter_id=adapter_id, - user_api_key_dict=user_api_key_dict, - ) - - except Exception: - verbose_proxy_logger.debug("Defaulting to target being a url.") - - async def endpoint_func( # type: ignore - request: Request, - fastapi_response: Response, - user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), - subpath: str = "", # captures sub-paths when include_subpath=True - custom_body: Optional[dict] = None, - ): - from litellm.proxy.pass_through_endpoints.pass_through_endpoints import ( - InitPassThroughEndpointHelpers, - ) - - path = request.url.path - - # Parse request data based on content type - ( - query_params_data, - custom_body_data, - file_data, - stream, - ) = await _parse_request_data_by_content_type(request) - - if not InitPassThroughEndpointHelpers.is_registered_pass_through_route( - route=path - ): - raise HTTPException( - status_code=404, - detail=f"Pass-through endpoint {endpoint} not found. This could have been deleted or not yet added to the proxy.", - ) - - passthrough_params = ( - InitPassThroughEndpointHelpers.get_registered_pass_through_route( - route=path - ) - ) - target_params = { - "target": target, - "custom_headers": custom_headers, - "forward_headers": _forward_headers, - "merge_query_params": _merge_query_params, - "cost_per_request": cost_per_request, - "guardrails": None, - } - - if passthrough_params is not None: - target_params.update(passthrough_params.get("passthrough_params", {})) - - # Extract and cast parameters with proper types - param_target = target_params.get("target") or target - param_custom_headers = target_params.get("custom_headers", custom_headers) - param_forward_headers = target_params.get( - "forward_headers", _forward_headers - ) - param_merge_query_params = target_params.get( - "merge_query_params", _merge_query_params - ) - param_cost_per_request = target_params.get( - "cost_per_request", cost_per_request - ) - param_guardrails = target_params.get("guardrails", None) - - # Construct the full target URL with subpath if needed - full_target = ( - HttpPassThroughEndpointHelpers.construct_target_url_with_subpath( - base_target=cast(str, param_target), - subpath=subpath, - include_subpath=include_subpath, - ) - ) - - # Ensure custom_headers is a dict - headers_dict = ( - param_custom_headers if isinstance(param_custom_headers, dict) else {} - ) - - # Ensure query_params and custom_body are dicts or None - final_query_params = ( - query_params_data if isinstance(query_params_data, dict) else {} - ) - if query_params: - final_query_params.update(query_params) - # When a caller (e.g. bedrock_proxy_route) supplies a pre-built - # body, use it instead of the body parsed from the raw request. - final_custom_body: Optional[dict] = None - if custom_body is not None: - final_custom_body = custom_body - elif isinstance(custom_body_data, dict): - final_custom_body = custom_body_data - - return await pass_through_request( # type: ignore - request=request, - target=full_target, - custom_headers=headers_dict, - user_api_key_dict=user_api_key_dict, - forward_headers=cast(Optional[bool], param_forward_headers), - merge_query_params=cast(Optional[bool], param_merge_query_params), - query_params=final_query_params, - stream=is_streaming_request or stream, - custom_body=final_custom_body, - cost_per_request=cast(Optional[float], param_cost_per_request), - custom_llm_provider=custom_llm_provider, - guardrails_config=cast(Optional[dict], param_guardrails), - ) - - return endpoint_func - - -def create_websocket_passthrough_route( - endpoint: str, - target: str, - custom_headers: Optional[dict] = None, - _forward_headers: Optional[bool] = False, - dependencies: Optional[List] = None, - cost_per_request: Optional[float] = None, -): - """ - Create a WebSocket passthrough route function. - - Args: - endpoint: The endpoint path (for logging purposes) - target: The target WebSocket URL (e.g., "wss://api.example.com/ws") - custom_headers: Custom headers to include in the WebSocket connection - _forward_headers: Whether to forward incoming headers - dependencies: FastAPI dependencies to inject - - Returns: - A WebSocket passthrough function that can be registered with app.websocket() - """ - from litellm.proxy.auth.user_api_key_auth import user_api_key_auth_websocket - - async def websocket_endpoint_func( - websocket: WebSocket, - user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth_websocket), - **kwargs, # For additional query parameters - ): - """ - WebSocket passthrough endpoint function. - - This function handles the WebSocket connection by: - 1. Accepting the incoming WebSocket connection - 2. Establishing a connection to the target WebSocket - 3. Forwarding messages bidirectionally - 4. Handling connection cleanup - """ - return await websocket_passthrough_request( - websocket=websocket, - target=target, - custom_headers=custom_headers or {}, - user_api_key_dict=user_api_key_dict, - forward_headers=_forward_headers, - endpoint=endpoint, - cost_per_request=cost_per_request, - accept_websocket=True, # Generic usage should accept the WebSocket - ) - - return websocket_endpoint_func - - -async def websocket_passthrough_request( # noqa: PLR0915 - websocket: WebSocket, - target: str, - custom_headers: dict, - user_api_key_dict: UserAPIKeyAuth, - forward_headers: Optional[bool] = False, - endpoint: Optional[str] = None, - cost_per_request: Optional[float] = None, - accept_websocket: bool = True, -): - """ - WebSocket passthrough request handler. - - Args: - websocket: The incoming WebSocket connection - target: The target WebSocket URL - custom_headers: Custom headers to include in the connection - user_api_key_dict: The user API key dictionary - forward_headers: Whether to forward incoming headers - endpoint: The endpoint path (for logging purposes) - cost_per_request: Optional field - cost per request to the target endpoint - """ - from litellm.litellm_core_utils.litellm_logging import Logging - from litellm.proxy.proxy_server import proxy_logging_obj - from litellm.types.passthrough_endpoints.pass_through_endpoints import ( - PassthroughStandardLoggingPayload, - ) - - # Initialize tracking variables - start_time = datetime.now() - websocket_messages: list[dict[str, Any]] = [] - litellm_call_id = str(uuid.uuid4()) - - verbose_proxy_logger.info( - f"WebSocket passthrough ({endpoint}): Starting WebSocket connection to {target}" - ) - - # Only accept the WebSocket if requested (for generic usage) - if accept_websocket: - await websocket.accept() - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): WebSocket connection accepted" - ) - - # Prepare headers for the upstream connection - upstream_headers = custom_headers.copy() - - if forward_headers: - # Forward relevant headers from the incoming request - incoming_headers = dict(websocket.headers) - for header_name, header_value in incoming_headers.items(): - # Only forward certain headers to avoid conflicts - if header_name.lower() in [ - "authorization", - "x-api-key", - "x-goog-user-project", - ]: - upstream_headers[header_name] = header_value - - # Initialize logging object similar to HTTP passthrough - logging_obj = Logging( - model="unknown", - messages=[{"role": "user", "content": "WebSocket connection"}], - stream=True, # WebSockets are inherently streaming - call_type="pass_through_endpoint", - start_time=start_time, - litellm_call_id=litellm_call_id, - function_id="websocket_passthrough", - ) - - # Create passthrough logging payload - passthrough_logging_payload = PassthroughStandardLoggingPayload( - url=target, - request_body={}, # WebSocket doesn't have a traditional request body - request_method="WEBSOCKET", - cost_per_request=cost_per_request, - ) - - # Create a dummy request object for WebSocket connections to maintain compatibility - # with the existing _init_kwargs_for_pass_through_endpoint function - class DummyRequest: - def __init__( - self, url: str, method: str = "WEBSOCKET", headers: Optional[dict] = None - ): - self.url = url - self.method = method - self.headers = headers or {} - - def __str__(self): - return f"DummyRequest(url={self.url}, method={self.method})" - - dummy_request = DummyRequest( - url=target, - method="WEBSOCKET", - headers=dict(websocket.headers) if hasattr(websocket, "headers") else {}, - ) - - # Initialize kwargs for logging using the same pattern as HTTP passthrough - kwargs = HttpPassThroughEndpointHelpers._init_kwargs_for_pass_through_endpoint( - user_api_key_dict=user_api_key_dict, - _parsed_body={}, # WebSocket doesn't have a traditional request body - passthrough_logging_payload=passthrough_logging_payload, - litellm_call_id=litellm_call_id, - request=dummy_request, # type: ignore - logging_obj=logging_obj, - ) - - # Update logging environment variables - logging_obj.update_environment_variables( - model="unknown", - user="unknown", - optional_params={}, - litellm_params=dict(kwargs.get("litellm_params", {})), - call_type="pass_through_endpoint", - ) - logging_obj.model_call_details["litellm_call_id"] = litellm_call_id - - # Pre-call logging - logging_obj.pre_call( - input=[{"role": "user", "content": "WebSocket connection"}], - api_key="", - additional_args={ - "complete_input_dict": {}, - "api_base": target, - "headers": upstream_headers, - }, - ) - - ### CALL HOOKS ### - modify incoming data / reject request before calling the model - websocket_data: dict[str, Any] = {} - websocket_data = await proxy_logging_obj.pre_call_hook( - user_api_key_dict=user_api_key_dict, - data=websocket_data, - call_type="pass_through_endpoint", - ) - - try: - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Establishing upstream connection to {target}" - ) - async with connect( - target, - additional_headers=upstream_headers, - ) as upstream_ws: - verbose_proxy_logger.info( - f"WebSocket passthrough ({endpoint}): Upstream connection established successfully" - ) - - async def forward_client_to_upstream() -> None: - """Forward messages from client to upstream WebSocket""" - try: - while True: - message = await websocket.receive() - message_type = message.get("type") - if message_type == "websocket.disconnect": - await upstream_ws.close() - break - - text_data = message.get("text") - bytes_data = message.get("bytes") - - if text_data is not None: - # Try to extract model from client setup message for Vertex AI Live - if endpoint and "/vertex_ai/live" in endpoint: - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Processing client message for model extraction" - ) - try: - client_message = json.loads(text_data) - if ( - isinstance(client_message, dict) - and "setup" in client_message - ): - setup_data = client_message["setup"] - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Found setup data in client message: {setup_data}" - ) - if ( - isinstance(setup_data, dict) - and "model" in setup_data - ): - extracted_model = ( - _extract_model_from_vertex_ai_setup( - setup_data - ) - ) - if extracted_model: - kwargs["model"] = extracted_model - kwargs[ - "custom_llm_provider" - ] = "vertex_ai-language-models" - # Update logging object with correct model - logging_obj.model = extracted_model - logging_obj.model_call_details[ - "model" - ] = extracted_model - logging_obj.model_call_details[ - "custom_llm_provider" - ] = "vertex_ai" - verbose_proxy_logger.info( - f"WebSocket passthrough ({endpoint}): Successfully extracted model '{extracted_model}' and set provider to 'vertex_ai' from client setup message" - ) - else: - verbose_proxy_logger.warning( - f"WebSocket passthrough ({endpoint}): Failed to extract model from client setup data: {setup_data}" - ) - else: - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Setup data does not contain model field: {setup_data}" - ) - else: - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Client message does not contain setup data" - ) - except (json.JSONDecodeError, KeyError, TypeError) as e: - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Client message is not a valid setup message: {e}" - ) - pass # Not a JSON message or doesn't contain setup data - - await upstream_ws.send(text_data) - elif bytes_data is not None: - await upstream_ws.send(bytes_data) - except asyncio.CancelledError: - raise - except Exception: - verbose_proxy_logger.exception( - f"WebSocket passthrough ({endpoint}): error forwarding client message" - ) - await upstream_ws.close() - - async def forward_upstream_to_client() -> None: - """Forward messages from upstream to client WebSocket""" - try: - # Wait for the first response from upstream - raw_response = await upstream_ws.recv(decode=False) - # Ensure raw_response is bytes before decoding - if isinstance(raw_response, str): - raw_response = raw_response.encode("ascii") - setup_response = json.loads(raw_response.decode("ascii")) - verbose_proxy_logger.debug(f"Setup response: {setup_response}") - - # Extract model and provider from setup response for Vertex AI Live - if endpoint and "/vertex_ai/live" in endpoint: - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Processing server setup response for model extraction" - ) - extracted_model = _extract_model_from_vertex_ai_setup( - setup_response - ) - if extracted_model: - kwargs["model"] = extracted_model - kwargs["custom_llm_provider"] = "vertex_ai_language_models" - # Update logging object with correct model - logging_obj.model = extracted_model - logging_obj.model_call_details["model"] = extracted_model - logging_obj.model_call_details[ - "custom_llm_provider" - ] = "vertex_ai_language_models" - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Successfully extracted model '{extracted_model}' and set provider to 'vertex_ai' from server setup response" - ) - else: - verbose_proxy_logger.warning( - f"WebSocket passthrough ({endpoint}): Failed to extract model from server setup response: {setup_response}" - ) - else: - verbose_proxy_logger.debug( - f"WebSocket passthrough ({endpoint}): Not a Vertex AI Live endpoint, skipping model extraction" - ) - - # Send the setup response to the client - await websocket.send_text(json.dumps(setup_response)) - - # Now continuously forward messages from upstream to client - async for upstream_message in upstream_ws: - if isinstance(upstream_message, bytes): - await websocket.send_bytes(upstream_message) - # Parse and collect for cost tracking - try: - message_data = json.loads(upstream_message.decode()) - websocket_messages.append(message_data) - except (json.JSONDecodeError, UnicodeDecodeError): - pass - else: - await websocket.send_text(upstream_message) - # Parse and collect for cost tracking - try: - message_data = json.loads(upstream_message) - websocket_messages.append(message_data) - except json.JSONDecodeError: - pass - - except (ConnectionClosedOK, ConnectionClosedError) as e: - verbose_proxy_logger.debug( - f"Upstream WebSocket connection closed: {e}" - ) - pass - except asyncio.CancelledError: - verbose_proxy_logger.debug( - "asyncio.CancelledError in forward_upstream_to_client" - ) - raise - except Exception as e: - verbose_proxy_logger.debug( - f"Exception in forward_upstream_to_client: {e}" - ) - verbose_proxy_logger.exception( - f"WebSocket passthrough ({endpoint}): error forwarding upstream message" - ) - raise - - # Create tasks for bidirectional message forwarding - tasks = [ - asyncio.create_task(forward_client_to_upstream()), - asyncio.create_task(forward_upstream_to_client()), - ] - - done, pending = await asyncio.wait( - tasks, return_when=asyncio.FIRST_COMPLETED - ) - - # Cancel remaining tasks - for task in pending: - task.cancel() - try: - await task - except asyncio.CancelledError: - pass - - # Check for exceptions in completed tasks - for task in done: - exception = task.exception() - if exception is not None: - raise exception - - end_time = datetime.now() - - # Update passthrough logging payload with response data - passthrough_logging_payload["response_body"] = websocket_messages # type: ignore - passthrough_logging_payload["end_time"] = end_time # type: ignore - - # Remove logging_obj from kwargs to avoid duplicate keyword argument - success_kwargs = kwargs.copy() - success_kwargs.pop("logging_obj", None) - - # # Add user authentication context for database logging - # if user_api_key_dict: - # success_kwargs.setdefault('litellm_params', {}) - # success_kwargs['litellm_params'].update({ - # 'proxy_server_request': { - # 'body': { - # 'user': user_api_key_dict.user_id, - # 'team_id': user_api_key_dict.team_id, - # 'end_user_id': user_api_key_dict.end_user_id, - # } - # } - # }) - # # Also add the user_api_key for direct access - # success_kwargs['user_api_key'] = user_api_key_dict.api_key - - # Create a dummy httpx.Response for WebSocket connections - class MockWebSocketResponse: - def __init__(self, target_url: str): - self.status_code = 200 - self.text = "WebSocket connection successful" - self.headers: dict[str, str] = {} - self.request = MockWebSocketRequest(target_url) - - class MockWebSocketRequest: - def __init__(self, target_url: str): - self.method = "WEBSOCKET" - self.url = target_url - - mock_response = MockWebSocketResponse(target) - - # Use the same success handler as HTTP passthrough endpoints - asyncio.create_task( - pass_through_endpoint_logging.pass_through_async_success_handler( - httpx_response=mock_response, # type: ignore - response_body=websocket_messages, # type: ignore - url_route=endpoint or "", - result="websocket_connection_successful", - start_time=start_time, - end_time=end_time, - logging_obj=logging_obj, - cache_hit=False, - request_body={}, - **success_kwargs, - ) - ) - - # Call the proxy logging success hook - if proxy_logging_obj: - await proxy_logging_obj.post_call_success_hook( - data={}, - user_api_key_dict=user_api_key_dict, - response={"status": "websocket_connection_successful"}, # type: ignore - ) - - except InvalidStatus as exc: - verbose_proxy_logger.exception( - f"WebSocket passthrough ({endpoint}): upstream rejected WebSocket connection" - ) - - # Prepare request payload for logging - request_payload = {} - if kwargs: - for key, value in kwargs.items(): - request_payload[key] = value - - # Log the connection failure using the same pattern as HTTP - await proxy_logging_obj.post_call_failure_hook( - user_api_key_dict=user_api_key_dict, - original_exception=exc, - request_data=request_payload, - traceback_str=traceback.format_exc( - limit=MAXIMUM_TRACEBACK_LINES_TO_LOG, - ), - ) - - if websocket.client_state != WebSocketState.DISCONNECTED: - await websocket.close( - code=getattr(exc, "status_code", 1011), - reason="Upstream connection rejected", - ) - except Exception as e: - verbose_proxy_logger.exception( - f"WebSocket passthrough ({endpoint}): unexpected error while proxying WebSocket" - ) - - # Prepare request payload for logging - request_payload = {} - if kwargs: - for key, value in kwargs.items(): - request_payload[key] = value - - # Log the unexpected error using the same pattern as HTTP - await proxy_logging_obj.post_call_failure_hook( - user_api_key_dict=user_api_key_dict, - original_exception=e, - request_data=request_payload, - traceback_str=traceback.format_exc( - limit=MAXIMUM_TRACEBACK_LINES_TO_LOG, - ), - ) - - if websocket.client_state != WebSocketState.DISCONNECTED: - await websocket.close(code=1011, reason="WebSocket passthrough error") - finally: - if websocket.client_state != WebSocketState.DISCONNECTED: - await websocket.close() - - -def _is_streaming_response(response: httpx.Response) -> bool: - _content_type = response.headers.get("content-type") - if _content_type is not None and "text/event-stream" in _content_type: - return True - return False - - -def _extract_model_from_vertex_ai_setup(setup_response: dict) -> Optional[str]: - """ - Extract the model name from Vertex AI Live setup response. - - The setup response can contain a model field in two formats: - 1. Direct: {"model": "projects/.../models/gemini-2.0-flash-live-preview-04-09"} - 2. Nested: {"setup": {"model": "projects/.../models/gemini-2.0-flash-live-preview-04-09"}} - - We extract just the model name: "gemini-2.0-flash-live-preview-04-09" - """ - try: - # Handle both direct model field and nested setup.model field - model_path = None - if isinstance(setup_response, dict): - if "model" in setup_response: - model_path = setup_response["model"] - elif ( - "setup" in setup_response - and isinstance(setup_response["setup"], dict) - and "model" in setup_response["setup"] - ): - model_path = setup_response["setup"]["model"] - - if isinstance(model_path, str) and "/models/" in model_path: - # Extract the model name after the last "/models/" - model_name = model_path.split("/models/")[-1] - return model_name - except Exception as e: - verbose_proxy_logger.debug(f"Error extracting model from setup response: {e}") - return None - - -class SafeRouteAdder: - """ - Wrapper class for adding routes to FastAPI app. - Only adds routes if they don't already exist on the app. - """ - - @staticmethod - def _is_path_registered(app: FastAPI, path: str, methods: List[str]) -> bool: - """ - Check if a path with any of the specified methods is already registered on the app. - - Args: - app: The FastAPI application instance - path: The path to check (e.g., "/v1/chat/completions") - methods: List of HTTP methods to check (e.g., ["GET", "POST"]) - - Returns: - True if the path is already registered with any of the methods, False otherwise - """ - for route in app.routes: - # Use getattr to safely access route attributes - route_path = getattr(route, "path", None) - route_methods = getattr(route, "methods", None) - - if route_path == path and route_methods is not None: - # Check if any of the methods overlap - if any(method in route_methods for method in methods): - return True - return False - - @staticmethod - def add_api_route_if_not_exists( - app: FastAPI, - path: str, - endpoint: Any, - methods: List[str], - dependencies: Optional[List] = None, - ) -> bool: - """ - Add an API route to the app only if it doesn't already exist. - - Args: - app: The FastAPI application instance - path: The path for the route - endpoint: The endpoint function/callable - methods: List of HTTP methods - dependencies: Optional list of dependencies - - Returns: - True if route was added, False if it already existed - """ - if SafeRouteAdder._is_path_registered(app=app, path=path, methods=methods): - verbose_proxy_logger.debug( - "Skipping route registration - path %s with methods %s already registered on app", - path, - methods, - ) - return False - - app.add_api_route( - path=path, - endpoint=endpoint, - methods=methods, - dependencies=dependencies, - ) - verbose_proxy_logger.debug( - "Successfully added route: %s with methods %s", - path, - methods, - ) - return True - - -class InitPassThroughEndpointHelpers: - @staticmethod - def add_exact_path_route( - app: FastAPI, - path: str, - target: str, - custom_headers: Optional[dict], - forward_headers: Optional[bool], - merge_query_params: Optional[bool], - dependencies: Optional[List], - cost_per_request: Optional[float], - endpoint_id: str, - guardrails: Optional[dict] = None, - ): - """Add exact path route for pass-through endpoint""" - route_key = f"{endpoint_id}:exact:{path}" - - # Check if this exact route is already registered - if route_key in _registered_pass_through_routes: - verbose_proxy_logger.debug( - "Updating duplicate exact pass through endpoint: %s (already registered)", - path, - ) - - verbose_proxy_logger.debug( - "adding exact pass through endpoint: %s, dependencies: %s", - path, - dependencies, - ) - - # Use SafeRouteAdder to only add route if it doesn't exist on the app - SafeRouteAdder.add_api_route_if_not_exists( - app=app, - path=path, - endpoint=create_pass_through_route( # type: ignore - path, - target, - custom_headers, - forward_headers, - merge_query_params, - dependencies, - cost_per_request=cost_per_request, - guardrails=guardrails, - ), - methods=["GET", "POST", "PUT", "DELETE", "PATCH"], - dependencies=dependencies, - ) - - # Always register/update the route metadata (headers, target) even if FastAPI route exists - _registered_pass_through_routes[route_key] = { - "endpoint_id": endpoint_id, - "path": path, - "type": "exact", - "passthrough_params": { - "target": target, - "custom_headers": custom_headers, - "forward_headers": forward_headers, - "merge_query_params": merge_query_params, - "dependencies": dependencies, - "cost_per_request": cost_per_request, - "guardrails": guardrails, - }, - } - - @staticmethod - def add_subpath_route( - app: FastAPI, - path: str, - target: str, - custom_headers: Optional[dict], - forward_headers: Optional[bool], - merge_query_params: Optional[bool], - dependencies: Optional[List], - cost_per_request: Optional[float], - endpoint_id: str, - guardrails: Optional[dict] = None, - ): - """Add wildcard route for sub-paths""" - wildcard_path = f"{path}/{{subpath:path}}" - route_key = f"{endpoint_id}:subpath:{path}" - - # Check if this subpath route is already registered - if route_key in _registered_pass_through_routes: - verbose_proxy_logger.debug( - "Updating duplicate wildcard pass through endpoint: %s (already registered)", - wildcard_path, - ) - - verbose_proxy_logger.debug( - "adding wildcard pass through endpoint: %s, dependencies: %s", - wildcard_path, - dependencies, - ) - - # Use SafeRouteAdder to only add route if it doesn't exist on the app - SafeRouteAdder.add_api_route_if_not_exists( - app=app, - path=wildcard_path, - endpoint=create_pass_through_route( # type: ignore - path, - target, - custom_headers, - forward_headers, - merge_query_params, - dependencies, - include_subpath=True, - cost_per_request=cost_per_request, - guardrails=guardrails, - ), - methods=["GET", "POST", "PUT", "DELETE", "PATCH"], - dependencies=dependencies, - ) - - # Register the route to prevent duplicates only if it was added - _registered_pass_through_routes[route_key] = { - "endpoint_id": endpoint_id, - "path": path, - "type": "subpath", - "passthrough_params": { - "target": target, - "custom_headers": custom_headers, - "forward_headers": forward_headers, - "merge_query_params": merge_query_params, - "dependencies": dependencies, - "cost_per_request": cost_per_request, - "guardrails": guardrails, - }, - } - - @staticmethod - def remove_endpoint_routes(endpoint_id: str): - """Remove all routes for a specific endpoint ID from the registry""" - keys_to_remove = [ - key - for key, value in _registered_pass_through_routes.items() - if value["endpoint_id"] == endpoint_id - ] - for key in keys_to_remove: - del _registered_pass_through_routes[key] - verbose_proxy_logger.debug( - "Removed pass-through route from registry: %s", key - ) - - @staticmethod - def clear_all_pass_through_routes(): - """Clear all pass-through routes from the registry""" - _registered_pass_through_routes.clear() - - @staticmethod - def get_all_registered_pass_through_routes() -> List[str]: - """Get all registered pass-through endpoints from the registry""" - return list(_registered_pass_through_routes.keys()) - - @staticmethod - def _build_full_path_with_root(path: str) -> str: - """ - Build full path by prepending server root path if needed. - - Args: - path: The relative path to build - - Returns: - Full path with server root prepended (if root is not "/") - """ - root_path = get_server_root_path() - if root_path == "/": - return path - return f"{root_path}{path}" - - @staticmethod - def is_registered_pass_through_route(route: str) -> bool: - """ - Check if route is a registered pass-through endpoint from DB - - Uses the in-memory registry to avoid additional DB queries - Optimized for minimal latency - - Args: - route: The route to check - - Returns: - bool: True if route is a registered pass-through endpoint, False otherwise - """ - ## CHECK IF MAPPED PASS THROUGH ENDPOINT - for mapped_route in LiteLLMRoutes.mapped_pass_through_routes.value: - if route.startswith(mapped_route): - return True - - # Fast path: check if any registered route key contains this path - # Keys are in format: "{endpoint_id}:exact:{path}" or "{endpoint_id}:subpath:{path}" - # Extract unique paths from keys for quick checking - for key in _registered_pass_through_routes.keys(): - parts = key.split(":", 2) # Split into [endpoint_id, type, path] - if len(parts) == 3: - route_type = parts[1] - registered_path = InitPassThroughEndpointHelpers._build_full_path_with_root( - parts[2] - ) - if route_type == "exact" and route == registered_path: - return True - elif route_type == "subpath": - if route == registered_path or route.startswith( - registered_path + "/" - ): - return True - - return False - - @staticmethod - def get_registered_pass_through_route(route: str) -> Optional[Dict[str, Any]]: - """Get passthrough params for a given route""" - for key in _registered_pass_through_routes.keys(): - parts = key.split(":", 2) # Split into [endpoint_id, type, path] - if len(parts) == 3: - route_type = parts[1] - registered_path = InitPassThroughEndpointHelpers._build_full_path_with_root( - parts[2] - ) - - if route_type == "exact" and route == registered_path: - return _registered_pass_through_routes[key] - elif route_type == "subpath": - if route == registered_path or route.startswith( - registered_path + "/" - ): - return _registered_pass_through_routes[key] - - return None - - -def _get_combined_pass_through_endpoints( - pass_through_endpoints: Union[List[Dict], List[PassThroughGenericEndpoint]], - config_pass_through_endpoints: List[Dict], -): - """Get combined pass-through endpoints from db + config""" - return pass_through_endpoints + config_pass_through_endpoints - - -async def initialize_pass_through_endpoints( - pass_through_endpoints: Union[List[Dict], List[PassThroughGenericEndpoint]], -): - """ - 1. Create a global list of pass-through endpoints (db + config) - 2. Clear all existing pass-through endpoints from the FastAPI app routes - 3. Add new endpoints to the in-memory registry - - Initialize a list of pass-through endpoints by adding them to the FastAPI app routes - - Args: - pass_through_endpoints: List of pass-through endpoints to initialize - - Returns: - None - """ - from litellm._uuid import uuid - - verbose_proxy_logger.debug("initializing pass through endpoints") - from litellm.proxy._types import CommonProxyErrors, LiteLLMRoutes - from litellm.proxy.proxy_server import ( - app, - config_passthrough_endpoints, - premium_user, - ) - - ## get combined pass-through endpoints from db + config - combined_pass_through_endpoints: List[Union[Dict, PassThroughGenericEndpoint]] - - if config_passthrough_endpoints is not None: - combined_pass_through_endpoints = _get_combined_pass_through_endpoints( # type: ignore - pass_through_endpoints, config_passthrough_endpoints - ) - else: - combined_pass_through_endpoints = pass_through_endpoints # type: ignore - - ## clear all existing pass-through endpoints from the FastAPI app routes - # InitPassThroughEndpointHelpers.clear_all_pass_through_routes() - - # get a list of all registered pass-through endpoints - # mark the ones that are visited in the list - # remove the ones that are not visited from the list - registered_pass_through_endpoints = ( - InitPassThroughEndpointHelpers.get_all_registered_pass_through_routes() - ) - - visited_endpoints = set() - - for endpoint in combined_pass_through_endpoints: - if isinstance(endpoint, PassThroughGenericEndpoint): - endpoint = endpoint.model_dump() - - # Auto-generate ID for backwards compatibility if not present - if endpoint.get("id") is None: - endpoint["id"] = str(uuid.uuid4()) - - # Get the endpoint_id as a string (guaranteed to be set at this point) - endpoint_id: str = endpoint["id"] - - _target = endpoint.get("target", None) - _path: Optional[str] = endpoint.get("path", None) - if _path is None: - raise ValueError("Path is required for pass-through endpoint") - _custom_headers = endpoint.get("headers", None) - _custom_headers = await set_env_variables_in_header( - custom_headers=_custom_headers - ) - _forward_headers = endpoint.get("forward_headers", None) - _merge_query_params = endpoint.get("merge_query_params", None) - _auth = endpoint.get("auth", None) - _dependencies = None - if _auth is not None and str(_auth).lower() == "true": - if premium_user is not True: - raise ValueError( - "Error Setting Authentication on Pass Through Endpoint: {}".format( - CommonProxyErrors.not_premium_user.value - ) - ) - _dependencies = [Depends(user_api_key_auth)] - LiteLLMRoutes.openai_routes.value.append(_path) - - if _target is None: - continue - - # Get guardrails config if present - _guardrails = endpoint.get("guardrails", None) - - # Add exact path route - verbose_proxy_logger.debug( - "Initializing pass through endpoint: %s (ID: %s)", _path, endpoint_id - ) - InitPassThroughEndpointHelpers.add_exact_path_route( - app=app, - path=_path, - target=_target, - custom_headers=_custom_headers, - forward_headers=_forward_headers, - merge_query_params=_merge_query_params, - dependencies=_dependencies, - cost_per_request=endpoint.get("cost_per_request", None), - endpoint_id=endpoint_id, - guardrails=_guardrails, - ) - - visited_endpoints.add(f"{endpoint_id}:exact:{_path}") - - # Add wildcard route for sub-paths - if endpoint.get("include_subpath", False) is True: - InitPassThroughEndpointHelpers.add_subpath_route( - app=app, - path=_path, - target=_target, - custom_headers=_custom_headers, - forward_headers=_forward_headers, - merge_query_params=_merge_query_params, - dependencies=_dependencies, - cost_per_request=endpoint.get("cost_per_request", None), - endpoint_id=endpoint_id, - guardrails=_guardrails, - ) - - visited_endpoints.add(f"{endpoint_id}:subpath:{_path}") - - verbose_proxy_logger.debug( - "Added new pass through endpoint: %s (ID: %s)", _path, endpoint_id - ) - - # remove the ones that are not visited from the list - for endpoint_key in registered_pass_through_endpoints: - if endpoint_key not in visited_endpoints: - InitPassThroughEndpointHelpers.remove_endpoint_routes(endpoint_key) - - -def _get_pass_through_endpoints_from_config() -> List[PassThroughGenericEndpoint]: - """ - Get pass-through endpoints defined in the config file. - These are read-only and cannot be edited via the UI. - Malformed endpoints are logged and skipped; they do not crash the function. - """ - from pydantic import ValidationError - - from litellm.proxy.proxy_server import config_passthrough_endpoints - - if config_passthrough_endpoints is None or len(config_passthrough_endpoints) == 0: - return [] - - returned_endpoints: List[PassThroughGenericEndpoint] = [] - for endpoint in config_passthrough_endpoints: - try: - if isinstance(endpoint, dict): - endpoint_dict = dict(endpoint) - endpoint_dict["is_from_config"] = True - returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) - elif isinstance(endpoint, PassThroughGenericEndpoint): - # Create a copy with is_from_config=True - endpoint_dict = endpoint.model_dump() - endpoint_dict["is_from_config"] = True - returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) - except ValidationError as e: - verbose_proxy_logger.warning( - "Skipping malformed pass-through endpoint from config: %s", - e, - exc_info=False, - ) - - return returned_endpoints - - -async def _get_pass_through_endpoints_from_db( - endpoint_id: Optional[str] = None, - user_api_key_dict: Optional[UserAPIKeyAuth] = None, -) -> List[PassThroughGenericEndpoint]: - from litellm.proxy._types import LitellmUserRoles - from litellm.proxy.proxy_server import get_config_general_settings - - try: - if user_api_key_dict is None: - user_api_key_dict = UserAPIKeyAuth(user_role=LitellmUserRoles.PROXY_ADMIN) - response: ConfigFieldInfo = await get_config_general_settings( - field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict - ) - except Exception: - return [] - - pass_through_endpoint_data: Optional[List] = response.field_value - if pass_through_endpoint_data is None: - return [] - - returned_endpoints: List[PassThroughGenericEndpoint] = [] - if endpoint_id is None: - # Return all endpoints from DB, mark as not from config - for endpoint in pass_through_endpoint_data: - if isinstance(endpoint, dict): - endpoint_dict = dict(endpoint) - endpoint_dict["is_from_config"] = False - returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) - elif isinstance(endpoint, PassThroughGenericEndpoint): - endpoint_dict = endpoint.model_dump() - endpoint_dict["is_from_config"] = False - returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) - else: - # Find specific endpoint by ID - found_endpoint = _find_endpoint_by_id(pass_through_endpoint_data, endpoint_id) - if found_endpoint is not None: - endpoint_dict = ( - found_endpoint.model_dump() - if isinstance(found_endpoint, PassThroughGenericEndpoint) - else dict(found_endpoint) - ) - endpoint_dict["is_from_config"] = False - returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) - - return returned_endpoints - - -async def _filter_endpoints_by_team_allowed_routes( - team_id: str, - pass_through_endpoints: List[PassThroughGenericEndpoint], - prisma_client, -) -> List[PassThroughGenericEndpoint]: - """ - Filter pass-through endpoints based on team's allowed_passthrough_routes metadata. - - Args: - team_id: The team ID to check permissions for - pass_through_endpoints: List of endpoints to filter - prisma_client: Database client - - Returns: - Filtered list of endpoints based on team permissions - - Raises: - HTTPException: If team is not found - """ - # retrieve team from db - team = await prisma_client.db.litellm_teamtable.find_unique( - where={"team_id": team_id}, - ) - if team is None: - raise HTTPException( - status_code=404, - detail={"error": "Team not found"}, - ) - - # retrieve team metadata - team_metadata = team.metadata - if ( - team_metadata is not None - and team_metadata.get("allowed_passthrough_routes") is not None - ): - ## FILTER pass_through_endpoints by allowed_passthrough_routes - pass_through_endpoints = [ - endpoint - for endpoint in pass_through_endpoints - if endpoint.path in team_metadata.get("allowed_passthrough_routes") - ] - - return pass_through_endpoints - - -@router.get( - "/config/pass_through_endpoint", - dependencies=[Depends(user_api_key_auth)], - response_model=PassThroughEndpointResponse, -) -@router.get( - "/config/pass_through_endpoint/team/{team_id}", - dependencies=[Depends(user_api_key_auth)], - response_model=PassThroughEndpointResponse, -) -async def get_pass_through_endpoints( - endpoint_id: Optional[str] = None, - user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), - team_id: Optional[str] = None, -): - """ - GET configured pass through endpoint. - - If no endpoint_id given, return all configured endpoints. - """ ## Get existing pass-through endpoint field value - from litellm.proxy._types import CommonProxyErrors - from litellm.proxy.proxy_server import prisma_client - - if prisma_client is None: - raise HTTPException( - status_code=500, - detail={"error": CommonProxyErrors.db_not_connected_error.value}, - ) - - # Get endpoints from DB (editable via UI) - db_endpoints = await _get_pass_through_endpoints_from_db( - endpoint_id=endpoint_id, user_api_key_dict=user_api_key_dict - ) - - # Get endpoints from config file (read-only, not editable via UI) - config_endpoints = _get_pass_through_endpoints_from_config() - - # Merge: config endpoints not in DB + all DB endpoints (DB overrides config for same path) - db_paths = {ep.path for ep in db_endpoints} - config_only_endpoints = [ - ep for ep in config_endpoints if ep.path not in db_paths - ] - if endpoint_id is not None: - # When filtering by endpoint_id, only return if found in DB (config endpoints use generated IDs) - pass_through_endpoints = db_endpoints - else: - pass_through_endpoints = config_only_endpoints + db_endpoints - - if team_id is not None: - pass_through_endpoints = await _filter_endpoints_by_team_allowed_routes( - team_id=team_id, - pass_through_endpoints=pass_through_endpoints, - prisma_client=prisma_client, - ) - - return PassThroughEndpointResponse(endpoints=pass_through_endpoints) - - -@router.post( - "/config/pass_through_endpoint/{endpoint_id}", - dependencies=[Depends(user_api_key_auth)], -) -async def update_pass_through_endpoints( - endpoint_id: str, - data: PassThroughGenericEndpoint, - request: Request, - user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), -): - """ - Update a pass-through endpoint by ID. - """ - from litellm.proxy.proxy_server import ( - get_config_general_settings, - update_config_general_settings, - ) - - ## Get existing pass-through endpoint field value - try: - response: ConfigFieldInfo = await get_config_general_settings( - field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict - ) - except Exception: - raise HTTPException( - status_code=404, - detail={"error": "No pass-through endpoints found"}, - ) - - pass_through_endpoint_data: Optional[List] = response.field_value - if pass_through_endpoint_data is None: - raise HTTPException( - status_code=404, - detail={"error": "No pass-through endpoints found"}, - ) - - # Find the endpoint to update - found_endpoint = _find_endpoint_by_id(pass_through_endpoint_data, endpoint_id) - - if found_endpoint is None: - raise HTTPException( - status_code=404, - detail={"error": f"Endpoint with ID '{endpoint_id}' not found"}, - ) - - # Find the index for updating the list - endpoint_index = None - for idx, endpoint in enumerate(pass_through_endpoint_data): - _endpoint = ( - PassThroughGenericEndpoint(**endpoint) - if isinstance(endpoint, dict) - else endpoint - ) - if _endpoint.id == endpoint_id: - endpoint_index = idx - break - - if endpoint_index is None: - raise HTTPException( - status_code=404, - detail={ - "error": f"Could not find index for endpoint with ID '{endpoint_id}'" - }, - ) - - # Get the update data as dict, excluding None values for partial updates - # Exclude is_from_config as it's a response-only field (computed at read time) - update_data = data.model_dump(exclude_none=True, exclude={"is_from_config"}) - - # Start with existing endpoint data - endpoint_dict = found_endpoint.model_dump() - - # Update with new data (only non-None values) - endpoint_dict.update(update_data) - - # Preserve existing ID if not provided in update and endpoint has ID - if "id" not in update_data and found_endpoint.id is not None: - endpoint_dict["id"] = found_endpoint.id - - # Remove is_from_config before saving - it's a response-only field (computed at read time) - endpoint_dict.pop("is_from_config", None) - - # Create updated endpoint object - updated_endpoint = PassThroughGenericEndpoint(**endpoint_dict) - - # Update the list - pass_through_endpoint_data[endpoint_index] = endpoint_dict - - # Remove old routes from registry before they get re-registered - InitPassThroughEndpointHelpers.remove_endpoint_routes(endpoint_id) - - ## Update db - updated_data = ConfigFieldUpdate( - field_name="pass_through_endpoints", - field_value=pass_through_endpoint_data, - config_type="general_settings", - ) - - await update_config_general_settings( - data=updated_data, user_api_key_dict=user_api_key_dict - ) - - # Re-register the route with updated headers - _custom_headers: Optional[dict] = updated_endpoint.headers or {} - _custom_headers = await set_env_variables_in_header(custom_headers=_custom_headers) - - if updated_endpoint.include_subpath: - InitPassThroughEndpointHelpers.add_subpath_route( - app=request.app, - path=updated_endpoint.path, - target=updated_endpoint.target, - custom_headers=_custom_headers, - forward_headers=None, # Defaults not available in model? assuming None logic handles it - merge_query_params=None, - dependencies=None, - cost_per_request=updated_endpoint.cost_per_request, - endpoint_id=updated_endpoint.id or endpoint_id or "", - guardrails=getattr(updated_endpoint, "guardrails", None), - ) - else: - InitPassThroughEndpointHelpers.add_exact_path_route( - app=request.app, - path=updated_endpoint.path, - target=updated_endpoint.target, - custom_headers=_custom_headers, - forward_headers=None, - merge_query_params=None, - dependencies=None, - cost_per_request=updated_endpoint.cost_per_request, - endpoint_id=updated_endpoint.id or endpoint_id or "", - guardrails=getattr(updated_endpoint, "guardrails", None), - ) - - return PassThroughEndpointResponse( - endpoints=[updated_endpoint] if updated_endpoint else [] - ) - - -@router.post( - "/config/pass_through_endpoint", - dependencies=[Depends(user_api_key_auth)], -) -async def create_pass_through_endpoints( - data: PassThroughGenericEndpoint, - request: Request, - user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), -): - """ - Create new pass-through endpoint - """ - from litellm._uuid import uuid - from litellm.proxy.proxy_server import ( - get_config_general_settings, - update_config_general_settings, - ) - - ## Get existing pass-through endpoint field value - - try: - response: ConfigFieldInfo = await get_config_general_settings( - field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict - ) - except Exception: - response = ConfigFieldInfo( - field_name="pass_through_endpoints", field_value=None - ) - - ## Auto-generate ID if not provided - # Exclude is_from_config as it's a response-only field (computed at read time) - data_dict = data.model_dump(exclude={"is_from_config"}) - if data_dict.get("id") is None: - data_dict["id"] = str(uuid.uuid4()) - - if response.field_value is None: - response.field_value = [data_dict] - elif isinstance(response.field_value, List): - response.field_value.append(data_dict) - - ## Update db - updated_data = ConfigFieldUpdate( - field_name="pass_through_endpoints", - field_value=response.field_value, - config_type="general_settings", - ) - await update_config_general_settings( - data=updated_data, user_api_key_dict=user_api_key_dict - ) - - # Return the created endpoint with the generated ID - created_endpoint = PassThroughGenericEndpoint(**data_dict) - - # Register the new route - _custom_headers: Optional[dict] = created_endpoint.headers or {} - _custom_headers = await set_env_variables_in_header(custom_headers=_custom_headers) - - if created_endpoint.include_subpath: - InitPassThroughEndpointHelpers.add_subpath_route( - app=request.app, - path=created_endpoint.path, - target=created_endpoint.target, - custom_headers=_custom_headers, - forward_headers=None, - merge_query_params=None, - dependencies=None, - cost_per_request=created_endpoint.cost_per_request, - endpoint_id=created_endpoint.id or "", - guardrails=getattr(created_endpoint, "guardrails", None), - ) - else: - InitPassThroughEndpointHelpers.add_exact_path_route( - app=request.app, - path=created_endpoint.path, - target=created_endpoint.target, - custom_headers=_custom_headers, - forward_headers=None, - merge_query_params=None, - dependencies=None, - cost_per_request=created_endpoint.cost_per_request, - endpoint_id=created_endpoint.id or "", - guardrails=getattr(created_endpoint, "guardrails", None), - ) - - return PassThroughEndpointResponse(endpoints=[created_endpoint]) - - -@router.delete( - "/config/pass_through_endpoint", - dependencies=[Depends(user_api_key_auth)], - response_model=PassThroughEndpointResponse, -) -async def delete_pass_through_endpoints( - endpoint_id: str, - user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), -): - """ - Delete a pass-through endpoint by ID. - - Returns - the deleted endpoint - """ - from litellm.proxy.proxy_server import ( - get_config_general_settings, - update_config_general_settings, - ) - - ## Get existing pass-through endpoint field value - - try: - response: ConfigFieldInfo = await get_config_general_settings( - field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict - ) - except Exception: - response = ConfigFieldInfo( - field_name="pass_through_endpoints", field_value=None - ) - - ## Update field by removing endpoint - pass_through_endpoint_data: Optional[List] = response.field_value - if response.field_value is None or pass_through_endpoint_data is None: - raise HTTPException( - status_code=400, - detail={"error": "There are no pass-through endpoints setup."}, - ) - - # Find the endpoint to delete - found_endpoint = _find_endpoint_by_id(pass_through_endpoint_data, endpoint_id) - - if found_endpoint is None: - raise HTTPException( - status_code=400, - detail={ - "error": "Endpoint with ID '{}' was not found in pass-through endpoint list.".format( - endpoint_id - ) - }, - ) - - # Find the index for deleting from the list - endpoint_index = None - for idx, endpoint in enumerate(pass_through_endpoint_data): - _endpoint = ( - PassThroughGenericEndpoint(**endpoint) - if isinstance(endpoint, dict) - else endpoint - ) - if _endpoint.id == endpoint_id: - endpoint_index = idx - break - - if endpoint_index is None: - raise HTTPException( - status_code=400, - detail={ - "error": f"Could not find index for endpoint with ID '{endpoint_id}'" - }, - ) - - # Remove the endpoint - pass_through_endpoint_data.pop(endpoint_index) - response_obj = found_endpoint - - # Remove routes from registry - InitPassThroughEndpointHelpers.remove_endpoint_routes(endpoint_id) - - ## Update db - updated_data = ConfigFieldUpdate( - field_name="pass_through_endpoints", - field_value=pass_through_endpoint_data, - config_type="general_settings", - ) - await update_config_general_settings( - data=updated_data, user_api_key_dict=user_api_key_dict - ) - - return PassThroughEndpointResponse(endpoints=[response_obj]) - - -def _find_endpoint_by_id( - endpoints_data: List, - endpoint_id: str, -) -> Optional[PassThroughGenericEndpoint]: - """ - Find an endpoint by ID. - - Args: - endpoints_data: List of endpoint data (dicts or PassThroughGenericEndpoint objects) - endpoint_id: ID to search for - - Returns: - Found endpoint or None if not found - """ - for endpoint in endpoints_data: - _endpoint: Optional[PassThroughGenericEndpoint] = None - if isinstance(endpoint, dict): - _endpoint = PassThroughGenericEndpoint(**endpoint) - elif isinstance(endpoint, PassThroughGenericEndpoint): - _endpoint = endpoint - - # Only compare IDs to IDs - if _endpoint is not None and _endpoint.id == endpoint_id: - return _endpoint - - return None - - -async def initialize_pass_through_endpoints_in_db(): - """ - Gets all pass-through endpoints from db and initializes them in the proxy server. - """ - pass_through_endpoints = await _get_pass_through_endpoints_from_db() - await initialize_pass_through_endpoints( - pass_through_endpoints=pass_through_endpoints - ) +import ast +import asyncio +import copy +import json +import traceback +from base64 import b64encode +from datetime import datetime +from typing import Any, Dict, List, Optional, Tuple, Union, cast +from urllib.parse import urlencode, urlparse + +import httpx +from fastapi import ( + APIRouter, + Depends, + FastAPI, + HTTPException, + Request, + Response, + UploadFile, + WebSocket, + status, +) +from fastapi.responses import StreamingResponse +from starlette.datastructures import UploadFile as StarletteUploadFile +from starlette.websockets import WebSocketState +from websockets.asyncio.client import connect +from websockets.exceptions import ( + ConnectionClosedError, + ConnectionClosedOK, + InvalidStatus, +) + +import litellm +from litellm._logging import verbose_proxy_logger +from litellm._uuid import uuid +from litellm.constants import MAXIMUM_TRACEBACK_LINES_TO_LOG +from litellm.integrations.custom_logger import CustomLogger +from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj +from litellm.litellm_core_utils.safe_json_dumps import safe_dumps +from litellm.llms.custom_httpx.http_handler import get_async_httpx_client +from litellm.passthrough import BasePassthroughUtils +from litellm.proxy._types import ( + ConfigFieldInfo, + ConfigFieldUpdate, + LiteLLMRoutes, + PassThroughEndpointResponse, + PassThroughGenericEndpoint, + ProxyException, + UserAPIKeyAuth, +) +from litellm.proxy.auth.user_api_key_auth import user_api_key_auth +from litellm.proxy.common_request_processing import ProxyBaseLLMRequestProcessing +from litellm.proxy.common_utils.http_parsing_utils import _read_request_body +from litellm.proxy.utils import get_server_root_path +from litellm.secret_managers.main import get_secret_str +from litellm.types.llms.custom_http import httpxSpecialProvider +from litellm.types.passthrough_endpoints.pass_through_endpoints import ( + EndpointType, + PassthroughStandardLoggingPayload, +) +from litellm.types.utils import StandardLoggingUserAPIKeyMetadata + +from .streaming_handler import PassThroughStreamingHandler +from .success_handler import PassThroughEndpointLogging + +router = APIRouter() + +pass_through_endpoint_logging = PassThroughEndpointLogging() + +# Global registry to track registered pass-through routes and prevent memory leaks +_registered_pass_through_routes: Dict[str, Dict[str, Union[str, Dict[str, Any]]]] = {} + + +def get_response_body(response: httpx.Response) -> Optional[dict]: + try: + return response.json() + except Exception: + return None + + +async def set_env_variables_in_header(custom_headers: Optional[dict]) -> Optional[dict]: + """ + checks if any headers on config.yaml are defined as os.environ/COHERE_API_KEY etc + + only runs for headers defined on config.yaml + + example header can be + + {"Authorization": "Bearer os.environ/COHERE_API_KEY"} + """ + if custom_headers is None: + return None + headers = {} + for key, value in custom_headers.items(): + # langfuse Api requires base64 encoded headers - it's simpleer to just ask litellm users to set their langfuse public and secret keys + # we can then get the b64 encoded keys here + if key == "LANGFUSE_PUBLIC_KEY" or key == "LANGFUSE_SECRET_KEY": + # langfuse requires b64 encoded headers - we construct that here + _langfuse_public_key = custom_headers["LANGFUSE_PUBLIC_KEY"] + _langfuse_secret_key = custom_headers["LANGFUSE_SECRET_KEY"] + if isinstance( + _langfuse_public_key, str + ) and _langfuse_public_key.startswith("os.environ/"): + _langfuse_public_key = get_secret_str(_langfuse_public_key) + if isinstance( + _langfuse_secret_key, str + ) and _langfuse_secret_key.startswith("os.environ/"): + _langfuse_secret_key = get_secret_str(_langfuse_secret_key) + headers["Authorization"] = "Basic " + b64encode( + f"{_langfuse_public_key}:{_langfuse_secret_key}".encode("utf-8") + ).decode("ascii") + else: + # for all other headers + headers[key] = value + if isinstance(value, str) and "os.environ/" in value: + verbose_proxy_logger.debug( + "pass through endpoint - looking up 'os.environ/' variable" + ) + # get string section that is os.environ/ + start_index = value.find("os.environ/") + _variable_name = value[start_index:] + + verbose_proxy_logger.debug( + "pass through endpoint - getting secret for variable name: %s", + _variable_name, + ) + _secret_value = get_secret_str(_variable_name) + if _secret_value is not None: + new_value = value.replace(_variable_name, _secret_value) + headers[key] = new_value + return headers + + +async def chat_completion_pass_through_endpoint( # noqa: PLR0915 + fastapi_response: Response, + request: Request, + adapter_id: str, + user_api_key_dict: UserAPIKeyAuth, +): + from litellm.proxy.proxy_server import ( + add_litellm_data_to_request, + general_settings, + llm_router, + proxy_config, + proxy_logging_obj, + user_api_base, + user_max_tokens, + user_model, + user_request_timeout, + user_temperature, + version, + ) + + data = {} + try: + body = await request.body() + body_str = body.decode() + try: + data = ast.literal_eval(body_str) + except Exception: + data = json.loads(body_str) + + data["adapter_id"] = adapter_id + + verbose_proxy_logger.debug( + "Request received by LiteLLM:\n{}".format(json.dumps(data, indent=4)), + ) + data["model"] = ( + general_settings.get("completion_model", None) # server default + or user_model # model name passed via cli args + or data.get("model", None) # default passed in http request + ) + if user_model: + data["model"] = user_model + + data = await add_litellm_data_to_request( + data=data, # type: ignore + request=request, + general_settings=general_settings, + user_api_key_dict=user_api_key_dict, + version=version, + proxy_config=proxy_config, + ) + + # override with user settings, these are params passed via cli + if user_temperature: + data["temperature"] = user_temperature + if user_request_timeout: + data["request_timeout"] = user_request_timeout + if user_max_tokens: + data["max_tokens"] = user_max_tokens + if user_api_base: + data["api_base"] = user_api_base + + ### MODEL ALIAS MAPPING ### + # check if model name in model alias map + # get the actual model name + if data["model"] in litellm.model_alias_map: + data["model"] = litellm.model_alias_map[data["model"]] + + # Check key-specific aliases + if ( + isinstance(data["model"], str) + and user_api_key_dict.aliases + and isinstance(user_api_key_dict.aliases, dict) + and data["model"] in user_api_key_dict.aliases + ): + data["model"] = user_api_key_dict.aliases[data["model"]] + + ### CALL HOOKS ### - modify incoming data before calling the model + data = await proxy_logging_obj.pre_call_hook( # type: ignore + user_api_key_dict=user_api_key_dict, data=data, call_type="text_completion" + ) + + ### ROUTE THE REQUESTs ### + router_model_names = llm_router.model_names if llm_router is not None else [] + # skip router if user passed their key + if "api_key" in data: + llm_response = asyncio.create_task(litellm.aadapter_completion(**data)) + elif ( + llm_router is not None and data["model"] in router_model_names + ): # model in router model list + llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) + elif ( + llm_router is not None + and llm_router.model_group_alias is not None + and data["model"] in llm_router.model_group_alias + ): # model set in model_group_alias + llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) + elif llm_router is not None and llm_router.has_model_id( + data["model"] + ): # model in router model list + llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) + elif ( + llm_router is not None + and data["model"] not in router_model_names + and ( + llm_router.default_deployment is not None + or len(llm_router.pattern_router.patterns) > 0 + ) + ): # check for wildcard routes or default deployment before checking deployment_names + llm_response = asyncio.create_task(llm_router.aadapter_completion(**data)) + elif ( + llm_router is not None and data["model"] in llm_router.deployment_names + ): # model in router deployments, calling a specific deployment on the router (lowest priority) + llm_response = asyncio.create_task( + llm_router.aadapter_completion(**data, specific_deployment=True) + ) + elif user_model is not None: # `litellm --model ` + llm_response = asyncio.create_task(litellm.aadapter_completion(**data)) + else: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail={ + "error": "completion: Invalid model name passed in model=" + + data.get("model", "") + }, + ) + + # Await the llm_response task + response = await llm_response + + hidden_params = getattr(response, "_hidden_params", {}) or {} + model_id = hidden_params.get("model_id", None) or "" + cache_key = hidden_params.get("cache_key", None) or "" + api_base = hidden_params.get("api_base", None) or "" + response_cost = hidden_params.get("response_cost", None) or "" + + ### ALERTING ### + asyncio.create_task( + proxy_logging_obj.update_request_status( + litellm_call_id=data.get("litellm_call_id", ""), status="success" + ) + ) + + verbose_proxy_logger.debug("final response: %s", response) + + fastapi_response.headers.update( + ProxyBaseLLMRequestProcessing.get_custom_headers( + user_api_key_dict=user_api_key_dict, + model_id=model_id, + cache_key=cache_key, + api_base=api_base, + version=version, + response_cost=response_cost, + ) + ) + + verbose_proxy_logger.debug("\nResponse from Litellm:\n{}".format(response)) + return response + except Exception as e: + await proxy_logging_obj.post_call_failure_hook( + user_api_key_dict=user_api_key_dict, original_exception=e, request_data=data + ) + verbose_proxy_logger.exception( + "litellm.proxy.proxy_server.completion(): Exception occured - {}".format( + str(e) + ) + ) + error_msg = f"{str(e)}" + raise ProxyException( + message=getattr(e, "message", error_msg), + type=getattr(e, "type", "None"), + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", 500), + ) + + +class HttpPassThroughEndpointHelpers(BasePassthroughUtils): + @staticmethod + def get_response_headers( + headers: httpx.Headers, + litellm_call_id: Optional[str] = None, + custom_headers: Optional[dict] = None, + ) -> dict: + excluded_headers = {"transfer-encoding", "content-encoding"} + + return_headers = { + key: value + for key, value in headers.items() + if key.lower() not in excluded_headers + } + if litellm_call_id: + return_headers["x-litellm-call-id"] = litellm_call_id + if custom_headers: + return_headers.update(custom_headers) + + return return_headers + + @staticmethod + def get_endpoint_type(url: str) -> EndpointType: + parsed_url = urlparse(url) + if ( + ("generateContent") in url + or ("streamGenerateContent") in url + or ("rawPredict") in url + or ("streamRawPredict") in url + ): + return EndpointType.VERTEX_AI + elif parsed_url.hostname == "api.anthropic.com": + return EndpointType.ANTHROPIC + elif ( + parsed_url.hostname == "api.openai.com" + or parsed_url.hostname == "openai.azure.com" + or (parsed_url.hostname and "openai.com" in parsed_url.hostname) + ): + return EndpointType.OPENAI + return EndpointType.GENERIC + + @staticmethod + async def _make_non_streaming_http_request( + request: Request, + async_client: httpx.AsyncClient, + url: str, + headers: dict, + requested_query_params: Optional[dict] = None, + custom_body: Optional[dict] = None, + ) -> httpx.Response: + """ + Make a non-streaming HTTP request + + If request is GET, don't include a JSON body + """ + if request.method == "GET": + response = await async_client.request( + method=request.method, + url=url, + headers=headers, + params=requested_query_params, + ) + else: + response = await async_client.request( + method=request.method, + url=url, + headers=headers, + params=requested_query_params, + json=custom_body, + ) + return response + + @staticmethod + async def non_streaming_http_request_handler( + request: Request, + async_client: httpx.AsyncClient, + url: httpx.URL, + headers: dict, + requested_query_params: Optional[dict] = None, + _parsed_body: Optional[dict] = None, + ) -> httpx.Response: + """ + Handle non-streaming HTTP requests + + Handles special cases when GET requests, multipart/form-data requests, and generic httpx requests + """ + if request.method == "GET": + response = await async_client.request( + method=request.method, + url=url, + headers=headers, + params=requested_query_params, + ) + elif HttpPassThroughEndpointHelpers.is_multipart(request) is True: + return await HttpPassThroughEndpointHelpers.make_multipart_http_request( + request=request, + async_client=async_client, + url=url, + headers=headers, + requested_query_params=requested_query_params, + ) + else: + # Generic httpx method + response = await async_client.request( + method=request.method, + url=url, + headers=headers, + params=requested_query_params, + json=_parsed_body, + ) + return response + + @staticmethod + def is_multipart(request: Request) -> bool: + """Check if the request is a multipart/form-data request""" + return "multipart/form-data" in request.headers.get("content-type", "") + + @staticmethod + async def _build_request_files_from_upload_file( + upload_file: Union[UploadFile, StarletteUploadFile], + ) -> Tuple[Optional[str], bytes, Optional[str]]: + """Build a request files dict from an UploadFile object""" + file_content = await upload_file.read() + return (upload_file.filename, file_content, upload_file.content_type) + + @staticmethod + async def make_multipart_http_request( + request: Request, + async_client: httpx.AsyncClient, + url: httpx.URL, + headers: dict, + requested_query_params: Optional[dict] = None, + ) -> httpx.Response: + """Process multipart/form-data requests, handling both files and form fields""" + form_data = await request.form() + files = {} + form_data_dict = {} + + for field_name, field_value in form_data.items(): + if isinstance(field_value, (StarletteUploadFile, UploadFile)): + files[ + field_name + ] = await HttpPassThroughEndpointHelpers._build_request_files_from_upload_file( + upload_file=field_value + ) + else: + form_data_dict[field_name] = field_value + + # Remove content-type header - httpx will set it correctly with the new boundary + # when it creates the multipart body from files/data parameters + headers_copy = headers.copy() + headers_copy.pop("content-type", None) + + response = await async_client.request( + method=request.method, + url=url, + headers=headers_copy, + params=requested_query_params, + files=files, + data=form_data_dict, + ) + return response + + @staticmethod + def _init_kwargs_for_pass_through_endpoint( + request: Request, + user_api_key_dict: UserAPIKeyAuth, + passthrough_logging_payload: PassthroughStandardLoggingPayload, + logging_obj: LiteLLMLoggingObj, + _parsed_body: Optional[dict] = None, + litellm_call_id: Optional[str] = None, + ) -> dict: + """ + Filter out litellm params from the request body + """ + from litellm.types.utils import all_litellm_params + + _parsed_body = _parsed_body or {} + + litellm_params_in_body = {} + for k in all_litellm_params: + if k in _parsed_body: + litellm_params_in_body[k] = _parsed_body.pop(k, None) + + _metadata = dict( + StandardLoggingUserAPIKeyMetadata( + user_api_key_hash=user_api_key_dict.api_key, + user_api_key_alias=user_api_key_dict.key_alias, + user_api_key_user_email=user_api_key_dict.user_email, + user_api_key_user_id=user_api_key_dict.user_id, + user_api_key_team_id=user_api_key_dict.team_id, + user_api_key_org_id=user_api_key_dict.org_id, + user_api_key_project_id=user_api_key_dict.project_id, + user_api_key_team_alias=user_api_key_dict.team_alias, + user_api_key_end_user_id=user_api_key_dict.end_user_id, + user_api_key_request_route=user_api_key_dict.request_route, + user_api_key_spend=user_api_key_dict.spend, + user_api_key_max_budget=user_api_key_dict.max_budget, + user_api_key_budget_reset_at=( + user_api_key_dict.budget_reset_at.isoformat() + if user_api_key_dict.budget_reset_at + else None + ), + user_api_key_auth_metadata=user_api_key_dict.metadata, + ) + ) + + _metadata["user_api_key"] = user_api_key_dict.api_key + + litellm_metadata = litellm_params_in_body.pop("litellm_metadata", None) + metadata = litellm_params_in_body.pop("metadata", None) + if litellm_metadata: + _metadata.update(litellm_metadata) + if metadata: + _metadata.update(metadata) + + _metadata = _update_metadata_with_tags_in_header( + request=request, + metadata=_metadata, + ) + + kwargs = { + "litellm_params": { + **litellm_params_in_body, # type: ignore + "metadata": _metadata, + "proxy_server_request": { + "url": str(request.url), + "method": request.method, + "body": copy.copy(_parsed_body), # use copy instead of deepcopy + "headers": request.headers, + }, + }, + "call_type": "pass_through_endpoint", + "litellm_call_id": litellm_call_id, + "passthrough_logging_payload": passthrough_logging_payload, + } + + logging_obj.model_call_details[ + "passthrough_logging_payload" + ] = passthrough_logging_payload + + return kwargs + + @staticmethod + def construct_target_url_with_subpath( + base_target: str, subpath: str, include_subpath: Optional[bool] + ) -> str: + """ + Helper function to construct the full target URL with subpath handling. + + Args: + base_target: The base target URL + subpath: The captured subpath from the request + include_subpath: Whether to include the subpath in the target URL + + Returns: + The constructed full target URL + """ + if not include_subpath: + return base_target + + if not subpath: + return base_target + + # Ensure base_target ends with / and subpath doesn't start with / + if not base_target.endswith("/"): + base_target = base_target + "/" + if subpath.startswith("/"): + subpath = subpath[1:] + + return base_target + subpath + + @staticmethod + def _update_stream_param_based_on_request_body( + parsed_body: dict, + stream: Optional[bool] = None, + ) -> Optional[bool]: + """ + If stream is provided in the request body, use it. + Otherwise, use the stream parameter passed to the `pass_through_request` function + """ + if "stream" in parsed_body: + return parsed_body.get("stream", stream) + return stream + + +async def pass_through_request( # noqa: PLR0915 + request: Request, + target: str, + custom_headers: dict, + user_api_key_dict: UserAPIKeyAuth, + custom_body: Optional[dict] = None, + forward_headers: Optional[bool] = False, + merge_query_params: Optional[bool] = False, + query_params: Optional[dict] = None, + stream: Optional[bool] = None, + cost_per_request: Optional[float] = None, + custom_llm_provider: Optional[str] = None, + guardrails_config: Optional[dict] = None, +): + """ + Pass through endpoint handler, makes the httpx request for pass-through endpoints and ensures logging hooks are called + + Args: + request: The incoming request + target: The target URL + custom_headers: The custom headers + user_api_key_dict: The user API key dictionary + custom_body: The custom body + forward_headers: Whether to forward headers + merge_query_params: Whether to merge query params + query_params: The query params + stream: Whether to stream the response + cost_per_request: Optional field - cost per request to the target endpoint + custom_llm_provider: Optional field - custom LLM provider for the endpoint + guardrails_config: Optional field - guardrails configuration for passthrough endpoint + """ + from litellm.litellm_core_utils.litellm_logging import Logging + from litellm.proxy.pass_through_endpoints.passthrough_guardrails import ( + PassthroughGuardrailHandler, + ) + from litellm.proxy.proxy_server import proxy_logging_obj + + ######################################################### + # Initialize variables + ######################################################### + litellm_call_id = str(uuid.uuid4()) + url: Optional[httpx.URL] = None + + # parsed request body + _parsed_body: Optional[dict] = None + # kwargs for pass through endpoint, contains metadata, litellm_params, call_type, litellm_call_id, passthrough_logging_payload + kwargs: Optional[dict] = None + + ######################################################### + try: + url = httpx.URL(target) + headers = custom_headers + headers = HttpPassThroughEndpointHelpers.forward_headers_from_request( + request_headers=dict(request.headers), + headers=headers, + forward_headers=forward_headers, + ) + + if merge_query_params: + # Create a new URL with the merged query params + url = url.copy_with( + query=urlencode( + HttpPassThroughEndpointHelpers.get_merged_query_parameters( + existing_url=url, + request_query_params=dict(request.query_params), + ) + ).encode("ascii") + ) + + endpoint_type: EndpointType = HttpPassThroughEndpointHelpers.get_endpoint_type( + str(url) + ) + + if custom_body: + _parsed_body = custom_body + else: + _parsed_body = await _read_request_body(request) + verbose_proxy_logger.debug( + "Pass through endpoint sending request to \nURL {}\nheaders: {}\nbody: {}\n".format( + url, headers, _parsed_body + ) + ) + + ### COLLECT GUARDRAILS FOR PASSTHROUGH ENDPOINT ### + # Passthrough endpoints are opt-in only for guardrails + # When enabled, collect guardrails from org/team/key levels + passthrough-specific + guardrails_to_run = PassthroughGuardrailHandler.collect_guardrails( + user_api_key_dict=user_api_key_dict, + passthrough_guardrails_config=guardrails_config, + ) + + # Add guardrails to metadata if any should run + if guardrails_to_run and len(guardrails_to_run) > 0: + if _parsed_body is None: + _parsed_body = {} + if "metadata" not in _parsed_body: + _parsed_body["metadata"] = {} + _parsed_body["metadata"]["guardrails"] = guardrails_to_run + verbose_proxy_logger.debug( + f"Added guardrails to passthrough request metadata: {guardrails_to_run}" + ) + + ## LOGGING OBJECT ## - initialize before pre_call_hook so guardrails can access it + start_time = datetime.now() + logging_obj = Logging( + model="unknown", + messages=[{"role": "user", "content": safe_dumps(_parsed_body)}], + stream=False, + call_type="pass_through_endpoint", + start_time=start_time, + litellm_call_id=litellm_call_id, + function_id="1245", + ) + + # Store passthrough guardrails config on logging_obj for field targeting + logging_obj.passthrough_guardrails_config = guardrails_config + + # Store logging_obj in data so guardrails can access it + if _parsed_body is None: + _parsed_body = {} + _parsed_body["litellm_logging_obj"] = logging_obj + + ### CALL HOOKS ### - modify incoming data / reject request before calling the model + _parsed_body = await proxy_logging_obj.pre_call_hook( + user_api_key_dict=user_api_key_dict, + data=_parsed_body, + call_type="pass_through_endpoint", + ) + async_client_obj = get_async_httpx_client( + llm_provider=httpxSpecialProvider.PassThroughEndpoint, + params={"timeout": 600}, + ) + async_client = async_client_obj.client + passthrough_logging_payload = PassthroughStandardLoggingPayload( + url=str(url), + request_body=_parsed_body, + request_method=getattr(request, "method", None), + cost_per_request=cost_per_request, + ) + kwargs = HttpPassThroughEndpointHelpers._init_kwargs_for_pass_through_endpoint( + user_api_key_dict=user_api_key_dict, + _parsed_body=_parsed_body, + passthrough_logging_payload=passthrough_logging_payload, + litellm_call_id=litellm_call_id, + request=request, + logging_obj=logging_obj, + ) + + # Store custom_llm_provider in kwargs and logging object if provided + if custom_llm_provider: + logging_obj.model_call_details["custom_llm_provider"] = custom_llm_provider + logging_obj.model_call_details["litellm_params"] = kwargs.get( + "litellm_params", {} + ) + + # done for supporting 'parallel_request_limiter.py' with pass-through endpoints + logging_obj.update_environment_variables( + model="unknown", + user="unknown", + optional_params={}, + litellm_params=kwargs["litellm_params"], + call_type="pass_through_endpoint", + ) + logging_obj.model_call_details["litellm_call_id"] = litellm_call_id + + # combine url with query params for logging + requested_query_params: Optional[dict] = query_params or dict( + request.query_params + ) + + requested_query_params_str = None + if requested_query_params: + requested_query_params_str = "&".join( + f"{k}={v}" for k, v in requested_query_params.items() + ) + + logging_url = str(url) + if requested_query_params_str: + if "?" in str(url): + logging_url = str(url) + "&" + requested_query_params_str + else: + logging_url = str(url) + "?" + requested_query_params_str + + logging_obj.pre_call( + input=[{"role": "user", "content": safe_dumps(_parsed_body)}], + api_key="", + additional_args={ + "complete_input_dict": _parsed_body, + "api_base": str(logging_url), + "headers": headers, + }, + ) + stream = ( + HttpPassThroughEndpointHelpers._update_stream_param_based_on_request_body( + parsed_body=_parsed_body, + stream=stream, + ) + ) + + if stream: + req = async_client.build_request( + "POST", + url, + json=_parsed_body, + params=requested_query_params, + headers=headers, + ) + + response = await async_client.send(req, stream=stream) + + try: + response.raise_for_status() + except httpx.HTTPStatusError as e: + raise HTTPException( + status_code=e.response.status_code, detail=await e.response.aread() + ) + + return StreamingResponse( + PassThroughStreamingHandler.chunk_processor( + response=response, + request_body=_parsed_body, + litellm_logging_obj=logging_obj, + endpoint_type=endpoint_type, + start_time=start_time, + passthrough_success_handler_obj=pass_through_endpoint_logging, + url_route=str(url), + ), + headers=HttpPassThroughEndpointHelpers.get_response_headers( + headers=response.headers, + litellm_call_id=litellm_call_id, + ), + status_code=response.status_code, + ) + + response = ( + await HttpPassThroughEndpointHelpers.non_streaming_http_request_handler( + request=request, + async_client=async_client, + url=url, + headers=headers, + requested_query_params=requested_query_params, + _parsed_body=_parsed_body, + ) + ) + verbose_proxy_logger.debug("response.headers= %s", response.headers) + + if _is_streaming_response(response) is True: + try: + response.raise_for_status() + except httpx.HTTPStatusError as e: + raise HTTPException( + status_code=e.response.status_code, detail=await e.response.aread() + ) + + return StreamingResponse( + PassThroughStreamingHandler.chunk_processor( + response=response, + request_body=_parsed_body, + litellm_logging_obj=logging_obj, + endpoint_type=endpoint_type, + start_time=start_time, + passthrough_success_handler_obj=pass_through_endpoint_logging, + url_route=str(url), + ), + headers=HttpPassThroughEndpointHelpers.get_response_headers( + headers=response.headers, + litellm_call_id=litellm_call_id, + ), + status_code=response.status_code, + ) + + try: + response.raise_for_status() + except httpx.HTTPStatusError as e: + raise HTTPException( + status_code=e.response.status_code, detail=e.response.text + ) + + if response.status_code >= 300: + raise HTTPException(status_code=response.status_code, detail=response.text) + + content = await response.aread() + + ## LOG SUCCESS + response_body: Optional[dict] = get_response_body(response) + passthrough_logging_payload["response_body"] = response_body + end_time = datetime.now() + asyncio.create_task( + pass_through_endpoint_logging.pass_through_async_success_handler( + httpx_response=response, + response_body=response_body, + url_route=str(url), + result="", + start_time=start_time, + end_time=end_time, + logging_obj=logging_obj, + cache_hit=False, + request_body=_parsed_body, + custom_llm_provider=custom_llm_provider, + **kwargs, + ) + ) + + ## CUSTOM HEADERS - `x-litellm-*` + custom_headers = ProxyBaseLLMRequestProcessing.get_custom_headers( + user_api_key_dict=user_api_key_dict, + call_id=litellm_call_id, + model_id=None, + cache_key=None, + api_base=str(url._uri_reference), + ) + + return Response( + content=content, + status_code=response.status_code, + headers=HttpPassThroughEndpointHelpers.get_response_headers( + headers=response.headers, + custom_headers=custom_headers, + ), + ) + except Exception as e: + custom_headers = ProxyBaseLLMRequestProcessing.get_custom_headers( + user_api_key_dict=user_api_key_dict, + call_id=litellm_call_id, + model_id=None, + cache_key=None, + api_base=str(url._uri_reference) if url else None, + ) + verbose_proxy_logger.exception( + "litellm.proxy.proxy_server.pass_through_endpoint(): Exception occured - {}".format( + str(e) + ) + ) + + ######################################################### + # Monitoring: Trigger post_call_failure_hook + # for pass through endpoint failure + ######################################################### + request_payload: dict = _parsed_body or {} + # add user_api_key_dict, litellm_call_id, passthrough_logging_payloa for logging + if kwargs: + for key, value in kwargs.items(): + request_payload[key] = value + + if ( + "model" not in request_payload + and _parsed_body + and isinstance(_parsed_body, dict) + ): + request_payload["model"] = _parsed_body.get("model", "") + if "custom_llm_provider" not in request_payload and custom_llm_provider: + request_payload["custom_llm_provider"] = custom_llm_provider + + await proxy_logging_obj.post_call_failure_hook( + user_api_key_dict=user_api_key_dict, + original_exception=e, + request_data=request_payload, + traceback_str=traceback.format_exc( + limit=MAXIMUM_TRACEBACK_LINES_TO_LOG, + ), + ) + + ######################################################### + + if isinstance(e, HTTPException): + raise ProxyException( + message=getattr(e, "message", str(e.detail)), + type=getattr(e, "type", "None"), + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST), + headers=custom_headers, + ) + else: + error_msg = f"{str(e)}" + raise ProxyException( + message=getattr(e, "message", error_msg), + type=getattr(e, "type", "None"), + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", 500), + headers=custom_headers, + ) + + +def _update_metadata_with_tags_in_header(request: Request, metadata: dict) -> dict: + """ + If tags are in the request headers, add them to the metadata + + Used for google and vertex JS SDKs, and Azure passthrough + Checks both 'tags' and 'x-litellm-tags' headers + """ + tags_to_add = [] + + # Check for 'tags' header first + _tags = request.headers.get("tags") + if _tags: + tags_to_add.extend([tag.strip() for tag in _tags.split(",")]) + + _tags = request.headers.get("x-litellm-tags") + if _tags: + tags_to_add.extend([tag.strip() for tag in _tags.split(",")]) + + # Only add tags key if there are tags to add + if tags_to_add: + if "tags" not in metadata: + metadata["tags"] = [] + metadata["tags"].extend(tags_to_add) + + return metadata + + +async def _parse_request_data_by_content_type( + request: Request, +) -> Tuple[Optional[Any], Optional[Any], Optional[Any], Optional[Any]]: + """ + Parse request data based on content type. + + Handles JSON, multipart/form-data, and URL-encoded form data. + + Returns: + Tuple of (query_params_data, custom_body_data, file_data, stream) + """ + content_type = request.headers.get("content-type", "") + + query_params_data = None + custom_body_data = None + file_data = None + stream = None + + if "application/json" in content_type: + # ✅ Handle JSON + try: + body = await request.json() + query_params_data = body.get("query_params") + custom_body_data = body.get("custom_body") + stream = body.get("stream") + except json.JSONDecodeError: + # Handle requests with no body (e.g., DELETE requests) + pass + elif "multipart/form-data" in content_type: + # ✅ Handle multipart form-data + form = await request.form() + if "query_params" in form: + form_value = form["query_params"] + if isinstance(form_value, str): + try: + query_params_data = json.loads(form_value) + except Exception: + query_params_data = form_value + else: + query_params_data = form_value + + if "custom_body" in form: + form_value = form["custom_body"] + if isinstance(form_value, str): + try: + custom_body_data = json.loads(form_value) + except Exception: + custom_body_data = form_value + else: + custom_body_data = form_value + + if "file" in form: + file_data = form["file"] # this is a Starlette UploadFile object + + elif "application/x-www-form-urlencoded" in content_type: + # ✅ Handle URL-encoded form data + form = await request.form() + query_params_data = form.get("query_params") + custom_body_data = form.get("custom_body") + + else: + # ✅ Fallback: maybe no body, just query params + query_params_data = dict(request.query_params) or None + + return query_params_data, custom_body_data, file_data, stream + + +def create_pass_through_route( + endpoint, + target: str, + custom_headers: Optional[dict] = None, + _forward_headers: Optional[bool] = False, + _merge_query_params: Optional[bool] = False, + dependencies: Optional[List] = None, + include_subpath: Optional[bool] = False, + cost_per_request: Optional[float] = None, + custom_llm_provider: Optional[str] = None, + is_streaming_request: Optional[bool] = False, + query_params: Optional[dict] = None, + guardrails: Optional[Dict[str, Any]] = None, +): + # check if target is an adapter.py or a url + from litellm._uuid import uuid + from litellm.proxy.types_utils.utils import get_instance_fn + + try: + if isinstance(target, CustomLogger): + adapter = target + else: + adapter = get_instance_fn(value=target) + adapter_id = str(uuid.uuid4()) + litellm.adapters = [{"id": adapter_id, "adapter": adapter}] + + async def endpoint_func( # type: ignore + request: Request, + fastapi_response: Response, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), + subpath: str = "", # captures sub-paths when include_subpath=True + custom_body: Optional[ + dict + ] = None, # accepted for signature compatibility with URL-based path; not forwarded because chat_completion_pass_through_endpoint does not support it + ): + return await chat_completion_pass_through_endpoint( + fastapi_response=fastapi_response, + request=request, + adapter_id=adapter_id, + user_api_key_dict=user_api_key_dict, + ) + + except Exception: + verbose_proxy_logger.debug("Defaulting to target being a url.") + + async def endpoint_func( # type: ignore + request: Request, + fastapi_response: Response, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), + subpath: str = "", # captures sub-paths when include_subpath=True + custom_body: Optional[dict] = None, + ): + from litellm.proxy.pass_through_endpoints.pass_through_endpoints import ( + InitPassThroughEndpointHelpers, + ) + + path = request.url.path + + # Parse request data based on content type + ( + query_params_data, + custom_body_data, + file_data, + stream, + ) = await _parse_request_data_by_content_type(request) + + if not InitPassThroughEndpointHelpers.is_registered_pass_through_route( + route=path + ): + raise HTTPException( + status_code=404, + detail=f"Pass-through endpoint {endpoint} not found. This could have been deleted or not yet added to the proxy.", + ) + + passthrough_params = ( + InitPassThroughEndpointHelpers.get_registered_pass_through_route( + route=path + ) + ) + target_params = { + "target": target, + "custom_headers": custom_headers, + "forward_headers": _forward_headers, + "merge_query_params": _merge_query_params, + "cost_per_request": cost_per_request, + "guardrails": None, + } + + if passthrough_params is not None: + target_params.update(passthrough_params.get("passthrough_params", {})) + + # Extract and cast parameters with proper types + param_target = target_params.get("target") or target + param_custom_headers = target_params.get("custom_headers", custom_headers) + param_forward_headers = target_params.get( + "forward_headers", _forward_headers + ) + param_merge_query_params = target_params.get( + "merge_query_params", _merge_query_params + ) + param_cost_per_request = target_params.get( + "cost_per_request", cost_per_request + ) + param_guardrails = target_params.get("guardrails", None) + + # Construct the full target URL with subpath if needed + full_target = ( + HttpPassThroughEndpointHelpers.construct_target_url_with_subpath( + base_target=cast(str, param_target), + subpath=subpath, + include_subpath=include_subpath, + ) + ) + + # Ensure custom_headers is a dict + headers_dict = ( + param_custom_headers if isinstance(param_custom_headers, dict) else {} + ) + + # Ensure query_params and custom_body are dicts or None + final_query_params = ( + query_params_data if isinstance(query_params_data, dict) else {} + ) + if query_params: + final_query_params.update(query_params) + # When a caller (e.g. bedrock_proxy_route) supplies a pre-built + # body, use it instead of the body parsed from the raw request. + final_custom_body: Optional[dict] = None + if custom_body is not None: + final_custom_body = custom_body + elif isinstance(custom_body_data, dict): + final_custom_body = custom_body_data + + return await pass_through_request( # type: ignore + request=request, + target=full_target, + custom_headers=headers_dict, + user_api_key_dict=user_api_key_dict, + forward_headers=cast(Optional[bool], param_forward_headers), + merge_query_params=cast(Optional[bool], param_merge_query_params), + query_params=final_query_params, + stream=is_streaming_request or stream, + custom_body=final_custom_body, + cost_per_request=cast(Optional[float], param_cost_per_request), + custom_llm_provider=custom_llm_provider, + guardrails_config=cast(Optional[dict], param_guardrails), + ) + + return endpoint_func + + +def create_websocket_passthrough_route( + endpoint: str, + target: str, + custom_headers: Optional[dict] = None, + _forward_headers: Optional[bool] = False, + dependencies: Optional[List] = None, + cost_per_request: Optional[float] = None, +): + """ + Create a WebSocket passthrough route function. + + Args: + endpoint: The endpoint path (for logging purposes) + target: The target WebSocket URL (e.g., "wss://api.example.com/ws") + custom_headers: Custom headers to include in the WebSocket connection + _forward_headers: Whether to forward incoming headers + dependencies: FastAPI dependencies to inject + + Returns: + A WebSocket passthrough function that can be registered with app.websocket() + """ + from litellm.proxy.auth.user_api_key_auth import user_api_key_auth_websocket + + async def websocket_endpoint_func( + websocket: WebSocket, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth_websocket), + **kwargs, # For additional query parameters + ): + """ + WebSocket passthrough endpoint function. + + This function handles the WebSocket connection by: + 1. Accepting the incoming WebSocket connection + 2. Establishing a connection to the target WebSocket + 3. Forwarding messages bidirectionally + 4. Handling connection cleanup + """ + return await websocket_passthrough_request( + websocket=websocket, + target=target, + custom_headers=custom_headers or {}, + user_api_key_dict=user_api_key_dict, + forward_headers=_forward_headers, + endpoint=endpoint, + cost_per_request=cost_per_request, + accept_websocket=True, # Generic usage should accept the WebSocket + ) + + return websocket_endpoint_func + + +async def websocket_passthrough_request( # noqa: PLR0915 + websocket: WebSocket, + target: str, + custom_headers: dict, + user_api_key_dict: UserAPIKeyAuth, + forward_headers: Optional[bool] = False, + endpoint: Optional[str] = None, + cost_per_request: Optional[float] = None, + accept_websocket: bool = True, +): + """ + WebSocket passthrough request handler. + + Args: + websocket: The incoming WebSocket connection + target: The target WebSocket URL + custom_headers: Custom headers to include in the connection + user_api_key_dict: The user API key dictionary + forward_headers: Whether to forward incoming headers + endpoint: The endpoint path (for logging purposes) + cost_per_request: Optional field - cost per request to the target endpoint + """ + from litellm.litellm_core_utils.litellm_logging import Logging + from litellm.proxy.proxy_server import proxy_logging_obj + from litellm.types.passthrough_endpoints.pass_through_endpoints import ( + PassthroughStandardLoggingPayload, + ) + + # Initialize tracking variables + start_time = datetime.now() + websocket_messages: list[dict[str, Any]] = [] + litellm_call_id = str(uuid.uuid4()) + + verbose_proxy_logger.info( + f"WebSocket passthrough ({endpoint}): Starting WebSocket connection to {target}" + ) + + # Only accept the WebSocket if requested (for generic usage) + if accept_websocket: + await websocket.accept() + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): WebSocket connection accepted" + ) + + # Prepare headers for the upstream connection + upstream_headers = custom_headers.copy() + + if forward_headers: + # Forward relevant headers from the incoming request + incoming_headers = dict(websocket.headers) + for header_name, header_value in incoming_headers.items(): + # Only forward certain headers to avoid conflicts + if header_name.lower() in [ + "authorization", + "x-api-key", + "x-goog-user-project", + ]: + upstream_headers[header_name] = header_value + + # Initialize logging object similar to HTTP passthrough + logging_obj = Logging( + model="unknown", + messages=[{"role": "user", "content": "WebSocket connection"}], + stream=True, # WebSockets are inherently streaming + call_type="pass_through_endpoint", + start_time=start_time, + litellm_call_id=litellm_call_id, + function_id="websocket_passthrough", + ) + + # Create passthrough logging payload + passthrough_logging_payload = PassthroughStandardLoggingPayload( + url=target, + request_body={}, # WebSocket doesn't have a traditional request body + request_method="WEBSOCKET", + cost_per_request=cost_per_request, + ) + + # Create a dummy request object for WebSocket connections to maintain compatibility + # with the existing _init_kwargs_for_pass_through_endpoint function + class DummyRequest: + def __init__( + self, url: str, method: str = "WEBSOCKET", headers: Optional[dict] = None + ): + self.url = url + self.method = method + self.headers = headers or {} + + def __str__(self): + return f"DummyRequest(url={self.url}, method={self.method})" + + dummy_request = DummyRequest( + url=target, + method="WEBSOCKET", + headers=dict(websocket.headers) if hasattr(websocket, "headers") else {}, + ) + + # Initialize kwargs for logging using the same pattern as HTTP passthrough + kwargs = HttpPassThroughEndpointHelpers._init_kwargs_for_pass_through_endpoint( + user_api_key_dict=user_api_key_dict, + _parsed_body={}, # WebSocket doesn't have a traditional request body + passthrough_logging_payload=passthrough_logging_payload, + litellm_call_id=litellm_call_id, + request=dummy_request, # type: ignore + logging_obj=logging_obj, + ) + + # Update logging environment variables + logging_obj.update_environment_variables( + model="unknown", + user="unknown", + optional_params={}, + litellm_params=dict(kwargs.get("litellm_params", {})), + call_type="pass_through_endpoint", + ) + logging_obj.model_call_details["litellm_call_id"] = litellm_call_id + + # Pre-call logging + logging_obj.pre_call( + input=[{"role": "user", "content": "WebSocket connection"}], + api_key="", + additional_args={ + "complete_input_dict": {}, + "api_base": target, + "headers": upstream_headers, + }, + ) + + ### CALL HOOKS ### - modify incoming data / reject request before calling the model + websocket_data: dict[str, Any] = {} + websocket_data = await proxy_logging_obj.pre_call_hook( + user_api_key_dict=user_api_key_dict, + data=websocket_data, + call_type="pass_through_endpoint", + ) + + try: + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Establishing upstream connection to {target}" + ) + async with connect( + target, + additional_headers=upstream_headers, + ) as upstream_ws: + verbose_proxy_logger.info( + f"WebSocket passthrough ({endpoint}): Upstream connection established successfully" + ) + + async def forward_client_to_upstream() -> None: + """Forward messages from client to upstream WebSocket""" + try: + while True: + message = await websocket.receive() + message_type = message.get("type") + if message_type == "websocket.disconnect": + await upstream_ws.close() + break + + text_data = message.get("text") + bytes_data = message.get("bytes") + + if text_data is not None: + # Try to extract model from client setup message for Vertex AI Live + if endpoint and "/vertex_ai/live" in endpoint: + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Processing client message for model extraction" + ) + try: + client_message = json.loads(text_data) + if ( + isinstance(client_message, dict) + and "setup" in client_message + ): + setup_data = client_message["setup"] + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Found setup data in client message: {setup_data}" + ) + if ( + isinstance(setup_data, dict) + and "model" in setup_data + ): + extracted_model = ( + _extract_model_from_vertex_ai_setup( + setup_data + ) + ) + if extracted_model: + kwargs["model"] = extracted_model + kwargs[ + "custom_llm_provider" + ] = "vertex_ai-language-models" + # Update logging object with correct model + logging_obj.model = extracted_model + logging_obj.model_call_details[ + "model" + ] = extracted_model + logging_obj.model_call_details[ + "custom_llm_provider" + ] = "vertex_ai" + verbose_proxy_logger.info( + f"WebSocket passthrough ({endpoint}): Successfully extracted model '{extracted_model}' and set provider to 'vertex_ai' from client setup message" + ) + else: + verbose_proxy_logger.warning( + f"WebSocket passthrough ({endpoint}): Failed to extract model from client setup data: {setup_data}" + ) + else: + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Setup data does not contain model field: {setup_data}" + ) + else: + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Client message does not contain setup data" + ) + except (json.JSONDecodeError, KeyError, TypeError) as e: + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Client message is not a valid setup message: {e}" + ) + pass # Not a JSON message or doesn't contain setup data + + await upstream_ws.send(text_data) + elif bytes_data is not None: + await upstream_ws.send(bytes_data) + except asyncio.CancelledError: + raise + except Exception: + verbose_proxy_logger.exception( + f"WebSocket passthrough ({endpoint}): error forwarding client message" + ) + await upstream_ws.close() + + async def forward_upstream_to_client() -> None: + """Forward messages from upstream to client WebSocket""" + try: + # Wait for the first response from upstream + raw_response = await upstream_ws.recv(decode=False) + # Ensure raw_response is bytes before decoding + if isinstance(raw_response, str): + raw_response = raw_response.encode("ascii") + setup_response = json.loads(raw_response.decode("ascii")) + verbose_proxy_logger.debug(f"Setup response: {setup_response}") + + # Extract model and provider from setup response for Vertex AI Live + if endpoint and "/vertex_ai/live" in endpoint: + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Processing server setup response for model extraction" + ) + extracted_model = _extract_model_from_vertex_ai_setup( + setup_response + ) + if extracted_model: + kwargs["model"] = extracted_model + kwargs["custom_llm_provider"] = "vertex_ai_language_models" + # Update logging object with correct model + logging_obj.model = extracted_model + logging_obj.model_call_details["model"] = extracted_model + logging_obj.model_call_details[ + "custom_llm_provider" + ] = "vertex_ai_language_models" + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Successfully extracted model '{extracted_model}' and set provider to 'vertex_ai' from server setup response" + ) + else: + verbose_proxy_logger.warning( + f"WebSocket passthrough ({endpoint}): Failed to extract model from server setup response: {setup_response}" + ) + else: + verbose_proxy_logger.debug( + f"WebSocket passthrough ({endpoint}): Not a Vertex AI Live endpoint, skipping model extraction" + ) + + # Send the setup response to the client + await websocket.send_text(json.dumps(setup_response)) + + # Now continuously forward messages from upstream to client + async for upstream_message in upstream_ws: + if isinstance(upstream_message, bytes): + await websocket.send_bytes(upstream_message) + # Parse and collect for cost tracking + try: + message_data = json.loads(upstream_message.decode()) + websocket_messages.append(message_data) + except (json.JSONDecodeError, UnicodeDecodeError): + pass + else: + await websocket.send_text(upstream_message) + # Parse and collect for cost tracking + try: + message_data = json.loads(upstream_message) + websocket_messages.append(message_data) + except json.JSONDecodeError: + pass + + except (ConnectionClosedOK, ConnectionClosedError) as e: + verbose_proxy_logger.debug( + f"Upstream WebSocket connection closed: {e}" + ) + pass + except asyncio.CancelledError: + verbose_proxy_logger.debug( + "asyncio.CancelledError in forward_upstream_to_client" + ) + raise + except Exception as e: + verbose_proxy_logger.debug( + f"Exception in forward_upstream_to_client: {e}" + ) + verbose_proxy_logger.exception( + f"WebSocket passthrough ({endpoint}): error forwarding upstream message" + ) + raise + + # Create tasks for bidirectional message forwarding + tasks = [ + asyncio.create_task(forward_client_to_upstream()), + asyncio.create_task(forward_upstream_to_client()), + ] + + done, pending = await asyncio.wait( + tasks, return_when=asyncio.FIRST_COMPLETED + ) + + # Cancel remaining tasks + for task in pending: + task.cancel() + try: + await task + except asyncio.CancelledError: + pass + + # Check for exceptions in completed tasks + for task in done: + exception = task.exception() + if exception is not None: + raise exception + + end_time = datetime.now() + + # Update passthrough logging payload with response data + passthrough_logging_payload["response_body"] = websocket_messages # type: ignore + passthrough_logging_payload["end_time"] = end_time # type: ignore + + # Remove logging_obj from kwargs to avoid duplicate keyword argument + success_kwargs = kwargs.copy() + success_kwargs.pop("logging_obj", None) + + # # Add user authentication context for database logging + # if user_api_key_dict: + # success_kwargs.setdefault('litellm_params', {}) + # success_kwargs['litellm_params'].update({ + # 'proxy_server_request': { + # 'body': { + # 'user': user_api_key_dict.user_id, + # 'team_id': user_api_key_dict.team_id, + # 'end_user_id': user_api_key_dict.end_user_id, + # } + # } + # }) + # # Also add the user_api_key for direct access + # success_kwargs['user_api_key'] = user_api_key_dict.api_key + + # Create a dummy httpx.Response for WebSocket connections + class MockWebSocketResponse: + def __init__(self, target_url: str): + self.status_code = 200 + self.text = "WebSocket connection successful" + self.headers: dict[str, str] = {} + self.request = MockWebSocketRequest(target_url) + + class MockWebSocketRequest: + def __init__(self, target_url: str): + self.method = "WEBSOCKET" + self.url = target_url + + mock_response = MockWebSocketResponse(target) + + # Use the same success handler as HTTP passthrough endpoints + asyncio.create_task( + pass_through_endpoint_logging.pass_through_async_success_handler( + httpx_response=mock_response, # type: ignore + response_body=websocket_messages, # type: ignore + url_route=endpoint or "", + result="websocket_connection_successful", + start_time=start_time, + end_time=end_time, + logging_obj=logging_obj, + cache_hit=False, + request_body={}, + **success_kwargs, + ) + ) + + # Call the proxy logging success hook + if proxy_logging_obj: + await proxy_logging_obj.post_call_success_hook( + data={}, + user_api_key_dict=user_api_key_dict, + response={"status": "websocket_connection_successful"}, # type: ignore + ) + + except InvalidStatus as exc: + verbose_proxy_logger.exception( + f"WebSocket passthrough ({endpoint}): upstream rejected WebSocket connection" + ) + + # Prepare request payload for logging + request_payload = {} + if kwargs: + for key, value in kwargs.items(): + request_payload[key] = value + + # Log the connection failure using the same pattern as HTTP + await proxy_logging_obj.post_call_failure_hook( + user_api_key_dict=user_api_key_dict, + original_exception=exc, + request_data=request_payload, + traceback_str=traceback.format_exc( + limit=MAXIMUM_TRACEBACK_LINES_TO_LOG, + ), + ) + + if websocket.client_state != WebSocketState.DISCONNECTED: + await websocket.close( + code=getattr(exc, "status_code", 1011), + reason="Upstream connection rejected", + ) + except Exception as e: + verbose_proxy_logger.exception( + f"WebSocket passthrough ({endpoint}): unexpected error while proxying WebSocket" + ) + + # Prepare request payload for logging + request_payload = {} + if kwargs: + for key, value in kwargs.items(): + request_payload[key] = value + + # Log the unexpected error using the same pattern as HTTP + await proxy_logging_obj.post_call_failure_hook( + user_api_key_dict=user_api_key_dict, + original_exception=e, + request_data=request_payload, + traceback_str=traceback.format_exc( + limit=MAXIMUM_TRACEBACK_LINES_TO_LOG, + ), + ) + + if websocket.client_state != WebSocketState.DISCONNECTED: + await websocket.close(code=1011, reason="WebSocket passthrough error") + finally: + if websocket.client_state != WebSocketState.DISCONNECTED: + await websocket.close() + + +def _is_streaming_response(response: httpx.Response) -> bool: + _content_type = response.headers.get("content-type") + if _content_type is not None and "text/event-stream" in _content_type: + return True + return False + + +def _extract_model_from_vertex_ai_setup(setup_response: dict) -> Optional[str]: + """ + Extract the model name from Vertex AI Live setup response. + + The setup response can contain a model field in two formats: + 1. Direct: {"model": "projects/.../models/gemini-2.0-flash-live-preview-04-09"} + 2. Nested: {"setup": {"model": "projects/.../models/gemini-2.0-flash-live-preview-04-09"}} + + We extract just the model name: "gemini-2.0-flash-live-preview-04-09" + """ + try: + # Handle both direct model field and nested setup.model field + model_path = None + if isinstance(setup_response, dict): + if "model" in setup_response: + model_path = setup_response["model"] + elif ( + "setup" in setup_response + and isinstance(setup_response["setup"], dict) + and "model" in setup_response["setup"] + ): + model_path = setup_response["setup"]["model"] + + if isinstance(model_path, str) and "/models/" in model_path: + # Extract the model name after the last "/models/" + model_name = model_path.split("/models/")[-1] + return model_name + except Exception as e: + verbose_proxy_logger.debug(f"Error extracting model from setup response: {e}") + return None + + +class SafeRouteAdder: + """ + Wrapper class for adding routes to FastAPI app. + Only adds routes if they don't already exist on the app. + """ + + @staticmethod + def _is_path_registered(app: FastAPI, path: str, methods: List[str]) -> bool: + """ + Check if a path with any of the specified methods is already registered on the app. + + Args: + app: The FastAPI application instance + path: The path to check (e.g., "/v1/chat/completions") + methods: List of HTTP methods to check (e.g., ["GET", "POST"]) + + Returns: + True if the path is already registered with any of the methods, False otherwise + """ + for route in app.routes: + # Use getattr to safely access route attributes + route_path = getattr(route, "path", None) + route_methods = getattr(route, "methods", None) + + if route_path == path and route_methods is not None: + # Check if any of the methods overlap + if any(method in route_methods for method in methods): + return True + return False + + @staticmethod + def add_api_route_if_not_exists( + app: FastAPI, + path: str, + endpoint: Any, + methods: List[str], + dependencies: Optional[List] = None, + ) -> bool: + """ + Add an API route to the app only if it doesn't already exist. + + Args: + app: The FastAPI application instance + path: The path for the route + endpoint: The endpoint function/callable + methods: List of HTTP methods + dependencies: Optional list of dependencies + + Returns: + True if route was added, False if it already existed + """ + if SafeRouteAdder._is_path_registered(app=app, path=path, methods=methods): + verbose_proxy_logger.debug( + "Skipping route registration - path %s with methods %s already registered on app", + path, + methods, + ) + return False + + app.add_api_route( + path=path, + endpoint=endpoint, + methods=methods, + dependencies=dependencies, + ) + verbose_proxy_logger.debug( + "Successfully added route: %s with methods %s", + path, + methods, + ) + return True + + +class InitPassThroughEndpointHelpers: + @staticmethod + def add_exact_path_route( + app: FastAPI, + path: str, + target: str, + custom_headers: Optional[dict], + forward_headers: Optional[bool], + merge_query_params: Optional[bool], + dependencies: Optional[List], + cost_per_request: Optional[float], + endpoint_id: str, + guardrails: Optional[dict] = None, + ): + """Add exact path route for pass-through endpoint""" + route_key = f"{endpoint_id}:exact:{path}" + + # Check if this exact route is already registered + if route_key in _registered_pass_through_routes: + verbose_proxy_logger.debug( + "Updating duplicate exact pass through endpoint: %s (already registered)", + path, + ) + + verbose_proxy_logger.debug( + "adding exact pass through endpoint: %s, dependencies: %s", + path, + dependencies, + ) + + # Use SafeRouteAdder to only add route if it doesn't exist on the app + SafeRouteAdder.add_api_route_if_not_exists( + app=app, + path=path, + endpoint=create_pass_through_route( # type: ignore + path, + target, + custom_headers, + forward_headers, + merge_query_params, + dependencies, + cost_per_request=cost_per_request, + guardrails=guardrails, + ), + methods=["GET", "POST", "PUT", "DELETE", "PATCH"], + dependencies=dependencies, + ) + + # Always register/update the route metadata (headers, target) even if FastAPI route exists + _registered_pass_through_routes[route_key] = { + "endpoint_id": endpoint_id, + "path": path, + "type": "exact", + "passthrough_params": { + "target": target, + "custom_headers": custom_headers, + "forward_headers": forward_headers, + "merge_query_params": merge_query_params, + "dependencies": dependencies, + "cost_per_request": cost_per_request, + "guardrails": guardrails, + }, + } + + @staticmethod + def add_subpath_route( + app: FastAPI, + path: str, + target: str, + custom_headers: Optional[dict], + forward_headers: Optional[bool], + merge_query_params: Optional[bool], + dependencies: Optional[List], + cost_per_request: Optional[float], + endpoint_id: str, + guardrails: Optional[dict] = None, + ): + """Add wildcard route for sub-paths""" + wildcard_path = f"{path}/{{subpath:path}}" + route_key = f"{endpoint_id}:subpath:{path}" + + # Check if this subpath route is already registered + if route_key in _registered_pass_through_routes: + verbose_proxy_logger.debug( + "Updating duplicate wildcard pass through endpoint: %s (already registered)", + wildcard_path, + ) + + verbose_proxy_logger.debug( + "adding wildcard pass through endpoint: %s, dependencies: %s", + wildcard_path, + dependencies, + ) + + # Use SafeRouteAdder to only add route if it doesn't exist on the app + SafeRouteAdder.add_api_route_if_not_exists( + app=app, + path=wildcard_path, + endpoint=create_pass_through_route( # type: ignore + path, + target, + custom_headers, + forward_headers, + merge_query_params, + dependencies, + include_subpath=True, + cost_per_request=cost_per_request, + guardrails=guardrails, + ), + methods=["GET", "POST", "PUT", "DELETE", "PATCH"], + dependencies=dependencies, + ) + + # Register the route to prevent duplicates only if it was added + _registered_pass_through_routes[route_key] = { + "endpoint_id": endpoint_id, + "path": path, + "type": "subpath", + "passthrough_params": { + "target": target, + "custom_headers": custom_headers, + "forward_headers": forward_headers, + "merge_query_params": merge_query_params, + "dependencies": dependencies, + "cost_per_request": cost_per_request, + "guardrails": guardrails, + }, + } + + @staticmethod + def remove_endpoint_routes(endpoint_id: str): + """Remove all routes for a specific endpoint ID from the registry""" + keys_to_remove = [ + key + for key, value in _registered_pass_through_routes.items() + if value["endpoint_id"] == endpoint_id + ] + for key in keys_to_remove: + del _registered_pass_through_routes[key] + verbose_proxy_logger.debug( + "Removed pass-through route from registry: %s", key + ) + + @staticmethod + def clear_all_pass_through_routes(): + """Clear all pass-through routes from the registry""" + _registered_pass_through_routes.clear() + + @staticmethod + def get_all_registered_pass_through_routes() -> List[str]: + """Get all registered pass-through endpoints from the registry""" + return list(_registered_pass_through_routes.keys()) + + @staticmethod + def _build_full_path_with_root(path: str) -> str: + """ + Build full path by prepending server root path if needed. + + Args: + path: The relative path to build + + Returns: + Full path with server root prepended (if root is not "/") + """ + root_path = get_server_root_path() + if root_path == "/": + return path + return f"{root_path}{path}" + + @staticmethod + def is_registered_pass_through_route(route: str) -> bool: + """ + Check if route is a registered pass-through endpoint from DB + + Uses the in-memory registry to avoid additional DB queries + Optimized for minimal latency + + Args: + route: The route to check + + Returns: + bool: True if route is a registered pass-through endpoint, False otherwise + """ + ## CHECK IF MAPPED PASS THROUGH ENDPOINT + for mapped_route in LiteLLMRoutes.mapped_pass_through_routes.value: + if route.startswith(mapped_route): + return True + + # Fast path: check if any registered route key contains this path + # Keys are in format: "{endpoint_id}:exact:{path}" or "{endpoint_id}:subpath:{path}" + # Extract unique paths from keys for quick checking + for key in _registered_pass_through_routes.keys(): + parts = key.split(":", 2) # Split into [endpoint_id, type, path] + if len(parts) == 3: + route_type = parts[1] + registered_path = ( + InitPassThroughEndpointHelpers._build_full_path_with_root(parts[2]) + ) + if route_type == "exact" and route == registered_path: + return True + elif route_type == "subpath": + if route == registered_path or route.startswith( + registered_path + "/" + ): + return True + + return False + + @staticmethod + def get_registered_pass_through_route(route: str) -> Optional[Dict[str, Any]]: + """Get passthrough params for a given route""" + for key in _registered_pass_through_routes.keys(): + parts = key.split(":", 2) # Split into [endpoint_id, type, path] + if len(parts) == 3: + route_type = parts[1] + registered_path = ( + InitPassThroughEndpointHelpers._build_full_path_with_root(parts[2]) + ) + + if route_type == "exact" and route == registered_path: + return _registered_pass_through_routes[key] + elif route_type == "subpath": + if route == registered_path or route.startswith( + registered_path + "/" + ): + return _registered_pass_through_routes[key] + + return None + + +def _get_combined_pass_through_endpoints( + pass_through_endpoints: Union[List[Dict], List[PassThroughGenericEndpoint]], + config_pass_through_endpoints: List[Dict], +): + """Get combined pass-through endpoints from db + config""" + return pass_through_endpoints + config_pass_through_endpoints + + +async def initialize_pass_through_endpoints( + pass_through_endpoints: Union[List[Dict], List[PassThroughGenericEndpoint]], +): + """ + 1. Create a global list of pass-through endpoints (db + config) + 2. Clear all existing pass-through endpoints from the FastAPI app routes + 3. Add new endpoints to the in-memory registry + + Initialize a list of pass-through endpoints by adding them to the FastAPI app routes + + Args: + pass_through_endpoints: List of pass-through endpoints to initialize + + Returns: + None + """ + from litellm._uuid import uuid + + verbose_proxy_logger.debug("initializing pass through endpoints") + from litellm.proxy._types import CommonProxyErrors, LiteLLMRoutes + from litellm.proxy.proxy_server import ( + app, + config_passthrough_endpoints, + premium_user, + ) + + ## get combined pass-through endpoints from db + config + combined_pass_through_endpoints: List[Union[Dict, PassThroughGenericEndpoint]] + + if config_passthrough_endpoints is not None: + combined_pass_through_endpoints = _get_combined_pass_through_endpoints( # type: ignore + pass_through_endpoints, config_passthrough_endpoints + ) + else: + combined_pass_through_endpoints = pass_through_endpoints # type: ignore + + ## clear all existing pass-through endpoints from the FastAPI app routes + # InitPassThroughEndpointHelpers.clear_all_pass_through_routes() + + # get a list of all registered pass-through endpoints + # mark the ones that are visited in the list + # remove the ones that are not visited from the list + registered_pass_through_endpoints = ( + InitPassThroughEndpointHelpers.get_all_registered_pass_through_routes() + ) + + visited_endpoints = set() + + for endpoint in combined_pass_through_endpoints: + if isinstance(endpoint, PassThroughGenericEndpoint): + endpoint = endpoint.model_dump() + + # Auto-generate ID for backwards compatibility if not present + if endpoint.get("id") is None: + endpoint["id"] = str(uuid.uuid4()) + + # Get the endpoint_id as a string (guaranteed to be set at this point) + endpoint_id: str = endpoint["id"] + + _target = endpoint.get("target", None) + _path: Optional[str] = endpoint.get("path", None) + if _path is None: + raise ValueError("Path is required for pass-through endpoint") + _custom_headers = endpoint.get("headers", None) + _custom_headers = await set_env_variables_in_header( + custom_headers=_custom_headers + ) + _forward_headers = endpoint.get("forward_headers", None) + _merge_query_params = endpoint.get("merge_query_params", None) + _auth = endpoint.get("auth", None) + _dependencies = None + if _auth is not None and str(_auth).lower() == "true": + if premium_user is not True: + raise ValueError( + "Error Setting Authentication on Pass Through Endpoint: {}".format( + CommonProxyErrors.not_premium_user.value + ) + ) + _dependencies = [Depends(user_api_key_auth)] + LiteLLMRoutes.openai_routes.value.append(_path) + + if _target is None: + continue + + # Get guardrails config if present + _guardrails = endpoint.get("guardrails", None) + + # Add exact path route + verbose_proxy_logger.debug( + "Initializing pass through endpoint: %s (ID: %s)", _path, endpoint_id + ) + InitPassThroughEndpointHelpers.add_exact_path_route( + app=app, + path=_path, + target=_target, + custom_headers=_custom_headers, + forward_headers=_forward_headers, + merge_query_params=_merge_query_params, + dependencies=_dependencies, + cost_per_request=endpoint.get("cost_per_request", None), + endpoint_id=endpoint_id, + guardrails=_guardrails, + ) + + visited_endpoints.add(f"{endpoint_id}:exact:{_path}") + + # Add wildcard route for sub-paths + if endpoint.get("include_subpath", False) is True: + InitPassThroughEndpointHelpers.add_subpath_route( + app=app, + path=_path, + target=_target, + custom_headers=_custom_headers, + forward_headers=_forward_headers, + merge_query_params=_merge_query_params, + dependencies=_dependencies, + cost_per_request=endpoint.get("cost_per_request", None), + endpoint_id=endpoint_id, + guardrails=_guardrails, + ) + + visited_endpoints.add(f"{endpoint_id}:subpath:{_path}") + + verbose_proxy_logger.debug( + "Added new pass through endpoint: %s (ID: %s)", _path, endpoint_id + ) + + # remove the ones that are not visited from the list + for endpoint_key in registered_pass_through_endpoints: + if endpoint_key not in visited_endpoints: + InitPassThroughEndpointHelpers.remove_endpoint_routes(endpoint_key) + + +def _get_pass_through_endpoints_from_config() -> List[PassThroughGenericEndpoint]: + """ + Get pass-through endpoints defined in the config file. + These are read-only and cannot be edited via the UI. + Malformed endpoints are logged and skipped; they do not crash the function. + """ + from pydantic import ValidationError + + from litellm.proxy.proxy_server import config_passthrough_endpoints + + if config_passthrough_endpoints is None or len(config_passthrough_endpoints) == 0: + return [] + + returned_endpoints: List[PassThroughGenericEndpoint] = [] + for endpoint in config_passthrough_endpoints: + try: + if isinstance(endpoint, dict): + endpoint_dict = dict(endpoint) + endpoint_dict["is_from_config"] = True + returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) + elif isinstance(endpoint, PassThroughGenericEndpoint): + # Create a copy with is_from_config=True + endpoint_dict = endpoint.model_dump() + endpoint_dict["is_from_config"] = True + returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) + except ValidationError as e: + verbose_proxy_logger.warning( + "Skipping malformed pass-through endpoint from config: %s", + e, + exc_info=False, + ) + + return returned_endpoints + + +async def _get_pass_through_endpoints_from_db( + endpoint_id: Optional[str] = None, + user_api_key_dict: Optional[UserAPIKeyAuth] = None, +) -> List[PassThroughGenericEndpoint]: + from litellm.proxy._types import LitellmUserRoles + from litellm.proxy.proxy_server import get_config_general_settings + + try: + if user_api_key_dict is None: + user_api_key_dict = UserAPIKeyAuth(user_role=LitellmUserRoles.PROXY_ADMIN) + response: ConfigFieldInfo = await get_config_general_settings( + field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict + ) + except Exception: + return [] + + pass_through_endpoint_data: Optional[List] = response.field_value + if pass_through_endpoint_data is None: + return [] + + returned_endpoints: List[PassThroughGenericEndpoint] = [] + if endpoint_id is None: + # Return all endpoints from DB, mark as not from config + for endpoint in pass_through_endpoint_data: + if isinstance(endpoint, dict): + endpoint_dict = dict(endpoint) + endpoint_dict["is_from_config"] = False + returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) + elif isinstance(endpoint, PassThroughGenericEndpoint): + endpoint_dict = endpoint.model_dump() + endpoint_dict["is_from_config"] = False + returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) + else: + # Find specific endpoint by ID + found_endpoint = _find_endpoint_by_id(pass_through_endpoint_data, endpoint_id) + if found_endpoint is not None: + endpoint_dict = ( + found_endpoint.model_dump() + if isinstance(found_endpoint, PassThroughGenericEndpoint) + else dict(found_endpoint) + ) + endpoint_dict["is_from_config"] = False + returned_endpoints.append(PassThroughGenericEndpoint(**endpoint_dict)) + + return returned_endpoints + + +async def _filter_endpoints_by_team_allowed_routes( + team_id: str, + pass_through_endpoints: List[PassThroughGenericEndpoint], + prisma_client, +) -> List[PassThroughGenericEndpoint]: + """ + Filter pass-through endpoints based on team's allowed_passthrough_routes metadata. + + Args: + team_id: The team ID to check permissions for + pass_through_endpoints: List of endpoints to filter + prisma_client: Database client + + Returns: + Filtered list of endpoints based on team permissions + + Raises: + HTTPException: If team is not found + """ + # retrieve team from db + team = await prisma_client.db.litellm_teamtable.find_unique( + where={"team_id": team_id}, + ) + if team is None: + raise HTTPException( + status_code=404, + detail={"error": "Team not found"}, + ) + + # retrieve team metadata + team_metadata = team.metadata + if ( + team_metadata is not None + and team_metadata.get("allowed_passthrough_routes") is not None + ): + ## FILTER pass_through_endpoints by allowed_passthrough_routes + pass_through_endpoints = [ + endpoint + for endpoint in pass_through_endpoints + if endpoint.path in team_metadata.get("allowed_passthrough_routes") + ] + + return pass_through_endpoints + + +@router.get( + "/config/pass_through_endpoint", + dependencies=[Depends(user_api_key_auth)], + response_model=PassThroughEndpointResponse, +) +@router.get( + "/config/pass_through_endpoint/team/{team_id}", + dependencies=[Depends(user_api_key_auth)], + response_model=PassThroughEndpointResponse, +) +async def get_pass_through_endpoints( + endpoint_id: Optional[str] = None, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), + team_id: Optional[str] = None, +): + """ + GET configured pass through endpoint. + + If no endpoint_id given, return all configured endpoints. + """ ## Get existing pass-through endpoint field value + from litellm.proxy._types import CommonProxyErrors + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + raise HTTPException( + status_code=500, + detail={"error": CommonProxyErrors.db_not_connected_error.value}, + ) + + # Get endpoints from DB (editable via UI) + db_endpoints = await _get_pass_through_endpoints_from_db( + endpoint_id=endpoint_id, user_api_key_dict=user_api_key_dict + ) + + # Get endpoints from config file (read-only, not editable via UI) + config_endpoints = _get_pass_through_endpoints_from_config() + + # Merge: config endpoints not in DB + all DB endpoints (DB overrides config for same path) + db_paths = {ep.path for ep in db_endpoints} + config_only_endpoints = [ep for ep in config_endpoints if ep.path not in db_paths] + if endpoint_id is not None: + # When filtering by endpoint_id, only return if found in DB (config endpoints use generated IDs) + pass_through_endpoints = db_endpoints + else: + pass_through_endpoints = config_only_endpoints + db_endpoints + + if team_id is not None: + pass_through_endpoints = await _filter_endpoints_by_team_allowed_routes( + team_id=team_id, + pass_through_endpoints=pass_through_endpoints, + prisma_client=prisma_client, + ) + + return PassThroughEndpointResponse(endpoints=pass_through_endpoints) + + +@router.post( + "/config/pass_through_endpoint/{endpoint_id}", + dependencies=[Depends(user_api_key_auth)], +) +async def update_pass_through_endpoints( + endpoint_id: str, + data: PassThroughGenericEndpoint, + request: Request, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Update a pass-through endpoint by ID. + """ + from litellm.proxy.proxy_server import ( + get_config_general_settings, + update_config_general_settings, + ) + + ## Get existing pass-through endpoint field value + try: + response: ConfigFieldInfo = await get_config_general_settings( + field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict + ) + except Exception: + raise HTTPException( + status_code=404, + detail={"error": "No pass-through endpoints found"}, + ) + + pass_through_endpoint_data: Optional[List] = response.field_value + if pass_through_endpoint_data is None: + raise HTTPException( + status_code=404, + detail={"error": "No pass-through endpoints found"}, + ) + + # Find the endpoint to update + found_endpoint = _find_endpoint_by_id(pass_through_endpoint_data, endpoint_id) + + if found_endpoint is None: + raise HTTPException( + status_code=404, + detail={"error": f"Endpoint with ID '{endpoint_id}' not found"}, + ) + + # Find the index for updating the list + endpoint_index = None + for idx, endpoint in enumerate(pass_through_endpoint_data): + _endpoint = ( + PassThroughGenericEndpoint(**endpoint) + if isinstance(endpoint, dict) + else endpoint + ) + if _endpoint.id == endpoint_id: + endpoint_index = idx + break + + if endpoint_index is None: + raise HTTPException( + status_code=404, + detail={ + "error": f"Could not find index for endpoint with ID '{endpoint_id}'" + }, + ) + + # Get the update data as dict, excluding None values for partial updates + # Exclude is_from_config as it's a response-only field (computed at read time) + update_data = data.model_dump(exclude_none=True, exclude={"is_from_config"}) + + # Start with existing endpoint data + endpoint_dict = found_endpoint.model_dump() + + # Update with new data (only non-None values) + endpoint_dict.update(update_data) + + # Preserve existing ID if not provided in update and endpoint has ID + if "id" not in update_data and found_endpoint.id is not None: + endpoint_dict["id"] = found_endpoint.id + + # Remove is_from_config before saving - it's a response-only field (computed at read time) + endpoint_dict.pop("is_from_config", None) + + # Create updated endpoint object + updated_endpoint = PassThroughGenericEndpoint(**endpoint_dict) + + # Update the list + pass_through_endpoint_data[endpoint_index] = endpoint_dict + + # Remove old routes from registry before they get re-registered + InitPassThroughEndpointHelpers.remove_endpoint_routes(endpoint_id) + + ## Update db + updated_data = ConfigFieldUpdate( + field_name="pass_through_endpoints", + field_value=pass_through_endpoint_data, + config_type="general_settings", + ) + + await update_config_general_settings( + data=updated_data, user_api_key_dict=user_api_key_dict + ) + + # Re-register the route with updated headers + _custom_headers: Optional[dict] = updated_endpoint.headers or {} + _custom_headers = await set_env_variables_in_header(custom_headers=_custom_headers) + + if updated_endpoint.include_subpath: + InitPassThroughEndpointHelpers.add_subpath_route( + app=request.app, + path=updated_endpoint.path, + target=updated_endpoint.target, + custom_headers=_custom_headers, + forward_headers=None, # Defaults not available in model? assuming None logic handles it + merge_query_params=None, + dependencies=None, + cost_per_request=updated_endpoint.cost_per_request, + endpoint_id=updated_endpoint.id or endpoint_id or "", + guardrails=getattr(updated_endpoint, "guardrails", None), + ) + else: + InitPassThroughEndpointHelpers.add_exact_path_route( + app=request.app, + path=updated_endpoint.path, + target=updated_endpoint.target, + custom_headers=_custom_headers, + forward_headers=None, + merge_query_params=None, + dependencies=None, + cost_per_request=updated_endpoint.cost_per_request, + endpoint_id=updated_endpoint.id or endpoint_id or "", + guardrails=getattr(updated_endpoint, "guardrails", None), + ) + + return PassThroughEndpointResponse( + endpoints=[updated_endpoint] if updated_endpoint else [] + ) + + +@router.post( + "/config/pass_through_endpoint", + dependencies=[Depends(user_api_key_auth)], +) +async def create_pass_through_endpoints( + data: PassThroughGenericEndpoint, + request: Request, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Create new pass-through endpoint + """ + from litellm._uuid import uuid + from litellm.proxy.proxy_server import ( + get_config_general_settings, + update_config_general_settings, + ) + + ## Get existing pass-through endpoint field value + + try: + response: ConfigFieldInfo = await get_config_general_settings( + field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict + ) + except Exception: + response = ConfigFieldInfo( + field_name="pass_through_endpoints", field_value=None + ) + + ## Auto-generate ID if not provided + # Exclude is_from_config as it's a response-only field (computed at read time) + data_dict = data.model_dump(exclude={"is_from_config"}) + if data_dict.get("id") is None: + data_dict["id"] = str(uuid.uuid4()) + + if response.field_value is None: + response.field_value = [data_dict] + elif isinstance(response.field_value, List): + response.field_value.append(data_dict) + + ## Update db + updated_data = ConfigFieldUpdate( + field_name="pass_through_endpoints", + field_value=response.field_value, + config_type="general_settings", + ) + await update_config_general_settings( + data=updated_data, user_api_key_dict=user_api_key_dict + ) + + # Return the created endpoint with the generated ID + created_endpoint = PassThroughGenericEndpoint(**data_dict) + + # Register the new route + _custom_headers: Optional[dict] = created_endpoint.headers or {} + _custom_headers = await set_env_variables_in_header(custom_headers=_custom_headers) + + if created_endpoint.include_subpath: + InitPassThroughEndpointHelpers.add_subpath_route( + app=request.app, + path=created_endpoint.path, + target=created_endpoint.target, + custom_headers=_custom_headers, + forward_headers=None, + merge_query_params=None, + dependencies=None, + cost_per_request=created_endpoint.cost_per_request, + endpoint_id=created_endpoint.id or "", + guardrails=getattr(created_endpoint, "guardrails", None), + ) + else: + InitPassThroughEndpointHelpers.add_exact_path_route( + app=request.app, + path=created_endpoint.path, + target=created_endpoint.target, + custom_headers=_custom_headers, + forward_headers=None, + merge_query_params=None, + dependencies=None, + cost_per_request=created_endpoint.cost_per_request, + endpoint_id=created_endpoint.id or "", + guardrails=getattr(created_endpoint, "guardrails", None), + ) + + return PassThroughEndpointResponse(endpoints=[created_endpoint]) + + +@router.delete( + "/config/pass_through_endpoint", + dependencies=[Depends(user_api_key_auth)], + response_model=PassThroughEndpointResponse, +) +async def delete_pass_through_endpoints( + endpoint_id: str, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Delete a pass-through endpoint by ID. + + Returns - the deleted endpoint + """ + from litellm.proxy.proxy_server import ( + get_config_general_settings, + update_config_general_settings, + ) + + ## Get existing pass-through endpoint field value + + try: + response: ConfigFieldInfo = await get_config_general_settings( + field_name="pass_through_endpoints", user_api_key_dict=user_api_key_dict + ) + except Exception: + response = ConfigFieldInfo( + field_name="pass_through_endpoints", field_value=None + ) + + ## Update field by removing endpoint + pass_through_endpoint_data: Optional[List] = response.field_value + if response.field_value is None or pass_through_endpoint_data is None: + raise HTTPException( + status_code=400, + detail={"error": "There are no pass-through endpoints setup."}, + ) + + # Find the endpoint to delete + found_endpoint = _find_endpoint_by_id(pass_through_endpoint_data, endpoint_id) + + if found_endpoint is None: + raise HTTPException( + status_code=400, + detail={ + "error": "Endpoint with ID '{}' was not found in pass-through endpoint list.".format( + endpoint_id + ) + }, + ) + + # Find the index for deleting from the list + endpoint_index = None + for idx, endpoint in enumerate(pass_through_endpoint_data): + _endpoint = ( + PassThroughGenericEndpoint(**endpoint) + if isinstance(endpoint, dict) + else endpoint + ) + if _endpoint.id == endpoint_id: + endpoint_index = idx + break + + if endpoint_index is None: + raise HTTPException( + status_code=400, + detail={ + "error": f"Could not find index for endpoint with ID '{endpoint_id}'" + }, + ) + + # Remove the endpoint + pass_through_endpoint_data.pop(endpoint_index) + response_obj = found_endpoint + + # Remove routes from registry + InitPassThroughEndpointHelpers.remove_endpoint_routes(endpoint_id) + + ## Update db + updated_data = ConfigFieldUpdate( + field_name="pass_through_endpoints", + field_value=pass_through_endpoint_data, + config_type="general_settings", + ) + await update_config_general_settings( + data=updated_data, user_api_key_dict=user_api_key_dict + ) + + return PassThroughEndpointResponse(endpoints=[response_obj]) + + +def _find_endpoint_by_id( + endpoints_data: List, + endpoint_id: str, +) -> Optional[PassThroughGenericEndpoint]: + """ + Find an endpoint by ID. + + Args: + endpoints_data: List of endpoint data (dicts or PassThroughGenericEndpoint objects) + endpoint_id: ID to search for + + Returns: + Found endpoint or None if not found + """ + for endpoint in endpoints_data: + _endpoint: Optional[PassThroughGenericEndpoint] = None + if isinstance(endpoint, dict): + _endpoint = PassThroughGenericEndpoint(**endpoint) + elif isinstance(endpoint, PassThroughGenericEndpoint): + _endpoint = endpoint + + # Only compare IDs to IDs + if _endpoint is not None and _endpoint.id == endpoint_id: + return _endpoint + + return None + + +async def initialize_pass_through_endpoints_in_db(): + """ + Gets all pass-through endpoints from db and initializes them in the proxy server. + """ + pass_through_endpoints = await _get_pass_through_endpoints_from_db() + await initialize_pass_through_endpoints( + pass_through_endpoints=pass_through_endpoints + )