Ë
    tPêj®_  ã                   ó´   — U d dl Z d dlZd dlmZmZ d dlmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZmZmZmZmZmZmZmZmZmZ d dlmZ dZeed	<    G d
„ d«      Zy)é    N)ÚdatetimeÚtimezone)ÚAnyÚFinal)Úverbose_proxy_logger)Úuuid)
ÚGenerateKeyRequestÚGenerateKeyResponseÚ
KeyRequestÚLiteLLM_AuditLogsÚLitellm_EntityTypeÚLiteLLM_VerificationTokenÚLitellmTableNamesÚRegenerateKeyRequestÚUpdateKeyRequestÚUserAPIKeyAuth)Ú_hash_token_if_neededzlitellm/Ú"LITELLM_PREFIX_STORED_VIRTUAL_KEYSc                   óÎ  — e Zd Ze	 ddededededz  fd„«       Ze	 dde	de
de
dededz  f
d„«       Ze	 ddedz  dededededz  f
d	„«       Ze	 dded
ee   dedededz  f
d„«       Zeddedededz  fd„«       Ze	 ddededededz  fd„«       Zededefd„«       Zed
ee   fd„«       Zededz  dedz  fd„«       Zedefd„«       Zedefd„«       Zedededz  fd„«       Zy)ÚKeyManagementEventHooksNÚdataÚresponseÚuser_api_key_dictÚlitellm_changed_byc              ƒ   ód  K  — ddl m}m}m} ddlm} | j                  du r.	 t        j                  |j                  d¬«      «      ƒ d{  –—†   |«       r«|j                  d¬«      }	t        j                   |t!        t#        t%        j&                  «       «      t)        j*                  t,        j.                  «       ||||¬«      |j0                  t2        j4                  |j6                  xs d	d
|	d¬«	      ¬«      «       	 t        j9                  | j:                  xs d|j6                  › �|j<                  | j>                  ¬«      ƒ d{  –—†  y7 �Œ# t        $ r!}t        j                  d|«       Y d}~�Œ+d}~ww xY w7 Œ5# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)zè
        Hook that runs after a successful /key/generate request

        Handles the following:
        - Sending Email with Key Details
        - Storing Audit Logs for key generation
        - Storing Generated Key in DB
        r   ©Úcreate_audit_log_for_updateÚget_audit_log_changed_byÚis_audit_logging_enabled©Úlitellm_proxy_admin_nameT©Úexclude_noneNz$Failed to send key created email: %s©r   r   r!   Ú Úcreated©	ÚidÚ
updated_atÚ
changed_byÚchanged_by_api_keyÚ
table_nameÚ	object_idÚactionÚupdated_valuesÚbefore_value©Úrequest_dataúvirtual-key-)Úsecret_nameÚsecret_tokenÚteam_idz1Failed to store virtual key in secret manager: %s) Ú+litellm.proxy.management_helpers.audit_logsr   r   r   Úlitellm.proxy.proxy_serverr!   Úsend_invite_emailr   Ú_send_key_created_emailÚ
model_dumpÚ	Exceptionr   ÚwarningÚmodel_dump_jsonÚasyncioÚcreate_taskr   Ústrr   Úuuid4r   Únowr   ÚutcÚapi_keyr   ÚKEY_TABLE_NAMEÚtoken_idÚ$_store_virtual_key_in_secret_managerÚ	key_aliasÚkeyr6   )
r   r   r   r   r   r   r   r!   ÚeÚ_updated_valuess
             ús/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/hooks/key_management_event_hooks.pyÚasync_key_generated_hookz0KeyManagementEventHooks.async_key_generated_hook   sˆ  è ø€ ÷	
ñ 	
õ
 	Hð ×!Ñ! TÑ)ðXÜ-×EÑEÀh×FYÑFYÐgkÐFYÓFlÓm×mÐmñ $Ô%Ø%-×%=Ñ%=È4Ð%=Ó%PˆOÜ×ÑÙ+Ü!2ÜœtŸz™z›|Ó,Ü#+§<¡<´·±Ó#=Ù#;Ø/AØ.?Ø5Mô$ð
 ,=×+DÑ+DÜ#4×#CÑ#CØ"*×"3Ñ"3Ò"9°rØ(Ø'6Ø%)ô"ôôð*	aÜ)×NÑNØ ŸN™NÒP°¸X×=NÑ=NÐ<OÐ.PØ%Ÿ\™\ØŸ™ð Oó ÷ ñ ð9 núÜò XÜ$×,Ñ,Ð-SÐUV×WÒWûðXúð6ùô
 ò 	aÜ ×(Ñ(Ð)\Ð^_×`Ñ`ûð	aüs~   ‚F0¢(E Á
EÁE ÁB2F0ÄA
F ÅFÅF ÅF0ÅE Å	E?ÅE:Å4F0Å:E?Å?F0ÆF Æ	F-ÆF(Æ#F0Æ(F-Æ-F0Úexisting_key_rowc              ƒ   ó(  K  — ddl m}m}m} ddlm}  |«       r÷t        j                  | j                  d¬«      t        ¬«      }	|j                  d¬«      }
t        j                  |
t        ¬«      }
t        j                   |t        t        t        j                  «       «      t        j                  t         j"                  «       ||||¬«      |j$                  t&        j(                  t+        | j,                  «      d|	|
¬	«	      ¬
«      «       yy­w)z~
        Post /key/update processing hook

        Handles the following:
        - Storing Audit Logs for key update
        r   r   r    Tr"   )Údefaultr$   Úupdatedr'   r1   N)r7   r   r   r   r8   r!   ÚjsonÚdumpsrA   r?   r@   r   r   rB   r   rC   r   rD   rE   r   rF   r   rJ   )r   rO   r   r   r   r   r   r   r!   rL   Ú_before_values              rM   Úasync_key_updated_hookz.KeyManagementEventHooks.async_key_updated_hookY   sÖ   è ø€ ÷	
ñ 	
õ
 	Há#Ô%Ü%)§Z¡Z°·	±	Àt°	Ó0LÔVYÔ%ZˆOà,×1Ñ1¸tÐ1ÓDˆMÜ ŸJ™J }¼cÔBˆMä×ÑÙ+Ü!2ÜœtŸz™z›|Ó,Ü#+§<¡<´·±Ó#=Ù#;Ø/AØ.?Ø5Mô$ð
 ,=×+DÑ+DÜ#4×#CÑ#CÜ"7¸¿¹Ó"AØ(Ø'6Ø%2ô"ôõð &ùs   ‚DDc              ƒ   óN  K  — ddl m}m}m} ddlm} | �¬|j                  � 	 |j                  xs d|j                  › �}	|j                  xs | j                  xs |	}
t        j                  d|
«       t        |dd «      }t        j                  |	|
|j                  |¬«      ƒ d {  –—†  t        j                  d|
«       	 t        j#                  |j%                  d
¬«      |j                  ¬«      ƒ d {  –—†   |«       rÃ|j                  �¶t'        j(                   |t+        t-        t/        j0                  «       «      t3        j4                  t6        j8                  «       ||||¬«      |j                  t:        j<                  |j                  d|j?                  d
¬«      |j?                  d
¬«      ¬«	      ¬«      «       y y y 7 �Œ # t        $ r!}t        j                   d	|«       Y d }~�Œ-d }~ww xY w7 Œÿ# t        $ r!}t        j                   d|«       Y d }~�Œ"d }~ww xY w­w)Nr   r   r    r3   z1Updating secret in secret manager: secret_name=%sr6   )Úcurrent_secret_nameÚnew_secret_nameÚnew_secret_valuer6   z0Secret updated in secret manager: secret_name=%sz2Failed to rotate virtual key in secret manager: %sTr"   )r   Úexisting_key_aliasz$Failed to send key rotated email: %sr$   Úrotatedr'   r1   ) r7   r   r   r   r8   r!   rG   rI   Útokenr   ÚinfoÚgetattrr   Ú%_rotate_virtual_key_in_secret_managerrJ   r<   r=   Ú_send_key_rotated_emailr;   r?   r@   r   rA   r   rB   r   rC   r   rD   r   rF   r>   )r   rO   r   r   r   r   r   r   r!   Úinitial_secret_namerY   r6   rK   s                rM   Úasync_key_rotated_hookz.KeyManagementEventHooks.async_key_rotated_hookˆ   s  è ø€ ÷	
ñ 	
õ
 	Hð Ð × 1Ñ 1Ð =ðfØ-=×-GÑ-GÒ-rÈ\ÐZj×ZpÑZpÐYqÐKrÐ#Ø)1×);Ñ);Ò)d¸t¿~¹~Ò)dÐQd�Ü$×)Ñ)ØGØ#ôô ")Ð)9¸9ÀdÓ!K�Ü-×SÑSØ(;Ø$3Ø%-§\¡\Ø#ð	 Tó ÷ ð ô %×)Ñ)ØFØ#ôð	TÜ)×AÑAØ!×,Ñ,¸$Ð,Ó?Ø#3×#=Ñ#=ð Bó ÷ ð ñ $Ô%Ð*:×*@Ñ*@Ð*LÜ×ÑÙ+Ü!2ÜœtŸz™z›|Ó,Ü#+§<¡<´·±Ó#=Ù#;Ø/AØ.?Ø5Mô$ð
 ,=×+BÑ+BÜ#4×#CÑ#CØ"2×"8Ñ"8Ø(Ø'/×'?Ñ'?ÈTÐ'?Ó'RØ%5×%EÑ%EÐSWÐ%EÓ%Xô"ôõð +MÐ%ð/úô ò fÜ$×,Ñ,Ð-aÐcd×eÒeûðfúð
ùô ò 	TÜ ×(Ñ(Ð)OÐQR×SÒSûð	Tüsx   ‚H%¢BG	 Â&GÂ'G	 Ã4G8 Ã6G6Ã7G8 Ã;CH%ÇG	 Ç		G3ÇG.Ç(H%Ç.G3Ç3H%Ç6G8 Ç8	H"ÈHÈH%ÈH"È"H%Úkeys_being_deletedc              ƒ   ó  K  — ddl m}m}m} ddlm}  |«       rÇ| j                  �»|D ]¶  }	|	j                  €Œ|	j                  d¬«      }
t        j                   |t        t        t        j                  «       «      t        j                   t"        j$                  «       ||||¬«      |j                  t&        j(                  |	j                  dd	|
¬
«	      ¬«      «       Œ¸ t*        j-                  |¬«      ƒ d{  –—†  y7 Œ­w)z€
        Post /key/delete processing hook

        Handles the following:
        - Storing Audit Logs for key deletion
        r   r   r    NTr"   r$   Údeletedz{}r'   r1   )rd   )r7   r   r   r   r8   r!   Úkeysr]   r>   r?   r@   r   rA   r   rB   r   rC   r   rD   r   rF   r   Ú(_delete_virtual_keys_from_secret_manager)r   rd   r   r   r   r   r   r   r!   rJ   Ú_key_rows              rM   Úasync_key_deleted_hookz.KeyManagementEventHooks.async_key_deleted_hookÍ   sâ   è ø€ ÷	
ñ 	
õ
 	Hñ $Ô%¨$¯)©)Ð*?à)ò �Ø—9‘9Ð$ØØ×.Ñ.¸DÐ.ÓA�ä×#Ñ#Ù/Ü%6Ü"¤4§:¡:£<Ó0Ü'/§|¡|´H·L±LÓ'AÙ'?Ø3EØ2CØ9Qô(ð
 0A×/FÑ/FÜ'8×'GÑ'GØ&)§i¡iØ#,Ø+/Ø)1ô&ôõðô2 &×NÑNÐbtÐNÓu×uÒuús   ‚C8DÃ:D Ã;Dr4   r5   r6   c              ƒ   ó  K  — t         j                  �ét         j                  j                  du rÌddlm} t        t         j                  |«      r«t        t         j                  dd«      }t        t         j                  dd«      }t        j                  |«      ƒ d{  –—† }t        j                  d| ||«       t         j                  j                  t        j                  | «      ||||¬«      ƒ d{  –—†  yyyy7 Œ_7 Œ
­w)	zÁ
        Store a virtual key in the secret manager

        Args:
            secret_name: Name of the virtual key
            secret_token: Value of the virtual key (example: sk-1234)
        NTr   ©ÚBaseSecretManagerÚtagsÚdescriptionz6Creating secret with %s and tags=%s and description=%s)r4   ro   Úsecret_valuern   Úoptional_params)ÚlitellmÚ_key_management_settingsÚstore_virtual_keysÚ+litellm.secret_managers.base_secret_managerrm   Ú
isinstanceÚsecret_manager_clientr_   r   Ú#_get_secret_manager_optional_paramsr   ÚdebugÚasync_write_secretÚ_get_secret_name)r4   r5   r6   rm   rn   ro   rq   s          rM   rH   z<KeyManagementEventHooks._store_virtual_key_in_secret_manager   sö   è ø€ ô ×+Ñ+Ð7Ü×/Ñ/×BÑBÀdÑJõô
 œg×;Ñ;Ð=NÔOÜ")¬'×*JÑ*JÈFÐTXÓ"Y�DÜ)0´×1QÑ1QÐS`ÐbfÓ)g�KÜ3J×3nÑ3nÐovÓ3w×-w�OÜ(×.Ñ.ØPÐR]Ð_cÐepôô "×7Ñ7×JÑJÜ$;×$LÑ$LÈ[Ó$YØ$/Ø%1Ø!Ø(7ð Kó ÷ ñ ð Pð Kð 8ð .xøð
ús%   ‚BDÂC=ÂADÃ4C?Ã5	DÃ?DrX   rY   rZ   c              ƒ   óŽ  K  — t         j                  �­t         j                  j                  du r�ddlm} t        t         j                  |«      rot        j                  |«      ƒ d{  –—† }t         j                  j                  t        j                  | «      t        j                  |«      ||¬«      ƒ d{  –—†  yyyy7 ŒY7 Œ
­w)af  
        Update a virtual key in the secret manager

        Args:
            current_secret_name: Current name of the virtual key
            new_secret_name: New name of the virtual key
            new_secret_value: New value of the virtual key (example: sk-1234)
            team_id: Optional team ID to get team-specific secret manager settings
        NTr   rl   )rX   rY   rZ   rq   )rr   rs   rt   ru   rm   rv   rw   r   rx   Úasync_rotate_secretr{   )rX   rY   rZ   r6   rm   rq   s         rM   r`   z=KeyManagementEventHooks._rotate_virtual_key_in_secret_manager   s¹   è ø€ ô  ×+Ñ+Ð7Ü×/Ñ/×BÑBÀdÑJõô
 œg×;Ñ;Ð=NÔOÜ3J×3nÑ3nÐovÓ3w×-w�OÜ!×7Ñ7×KÑKÜ,C×,TÑ,TÐUhÓ,iÜ(?×(PÑ(PÐQ`Ó(aØ)9Ø(7ð	 Ló ÷ ñ ð Pð Kð 8ð .xøðús%   ‚A%CÁ'CÁ(ACÂ8CÂ9	CÃCÚreturnc                 óÎ   — t         j                  j                  j                  d«      rt         j                  j                  › | › �S t         j                  j                  › d| › �S )Nú/)rr   rs   Úprefix_for_stored_virtual_keysÚendswith)r4   s    rM   r{   z(KeyManagementEventHooks._get_secret_name@  s\   € ä×+Ñ+×JÑJ×SÑSÐTWÔXÜ×6Ñ6×UÑUÐVÐWbÐVcÐdÐdä×6Ñ6×UÑUÐVÐVWÐXcÐWdÐeÐeó    c              ƒ   ó  K  — t         j                  �ñt         j                  j                  du rÔddlm} t        t         j                  |«      r³i }| D ]«  }|j                  �}t        |dd«      }||vr t        j                  |«      ƒ d{  –—† ||<   ||   }t         j                  j                  t        j                  |j                  «      |¬«      ƒ d{  –—†  ŒŒt        j                  d|j                  «       Œ­ yyyy7 Œy7 Œ-­w)z¼
        Deletes virtual keys from the secret manager

        Args:
            keys_being_deleted: List of keys being deleted, this is passed down from the /key/delete operation
        NTr   rl   r6   )r4   rq   z‡KeyManagementEventHooks._delete_virtual_key_from_secret_manager: Key alias not found for key %s. Skipping deletion from secret manager.)rr   rs   rt   ru   rm   rv   rw   rI   r_   r   rx   Úasync_delete_secretr{   r   r=   r]   )rd   rm   Úteam_settings_cacherJ   r6   rq   s         rM   rh   z@KeyManagementEventHooks._delete_virtual_keys_from_secret_managerG  s  è ø€ ô ×+Ñ+Ð7Ü×/Ñ/×BÑBÀdÑJõô œg×;Ñ;Ð=NÔOØPRÐ'Ø1ò ˜ØŸ=™=Ð4Ü&-¨c°9¸dÓ&C˜GØ&Ð.AÑAô +B×*eÑ*eÐfmÓ*n×$nð !4Ø$+ñ!"ð /BÀ'Ñ.J˜OÜ")×"?Ñ"?×"SÑ"SÜ,C×,TÑ,TÐUX×UbÑUbÓ,cØ0?ð #Tó #÷ ñ ô
 1×8Ñ8ð !jØ #§	¡	õñð Pð Kð 8ð %oøðús%   ‚B	D	ÂDÂAD	ÃDÃ,D	ÄD	c              ƒ   óä  K  — | €y 	 ddl m} t        |dd «      }t        |dd «      }|�|€y 	 ddlm}  || ||¬«      ƒ d {  –—† }t        |dd «      }|€y t        |d	«      r|j                  «       }t        |t        «      sy |j                  d
«      }t        |t        «      r|rt        |«      S y # t        $ r Y y w xY w7 Œ# t        $ r!}t        j                  d| |«       Y d }~y d }~ww xY w­w)Nr   )Úproxy_serverÚprisma_clientÚuser_api_key_cache)Úget_team_object)r6   r‰   rŠ   z/Unable to load team metadata for team_id=%s: %sÚmetadatar;   Úsecret_manager_settings)Úlitellm.proxyrˆ   ÚImportErrorr_   Úlitellm.proxy.auth.auth_checksr‹   r<   r   ry   Úhasattrr;   rv   ÚdictÚget)	r6   Úproxy_server_moduler‰   rŠ   r‹   Úteam_objÚexcrŒ   Úteam_settingss	            rM   rx   z;KeyManagementEventHooks._get_secret_manager_optional_paramsk  s  è ø€ ð ˆ?Øð	ÝIô  'Ð':¸OÈTÓRˆÜ$+Ð,?ÐAUÐW[Ó$\ÐàÐ Ð$6Ð$>Øð
	ÝFá$3ØØ+Ø#5ô%÷ ˆHô ˜8 Z°Ó6ˆØÐØä�8˜\Ô*Ø×*Ñ*Ó,ˆHä˜(¤DÔ)Øà'Ÿ|™|Ð,EÓFˆÜ�m¤TÔ*©}Ü˜Ó&Ð&àøôG ò 	Ùð	úðùô
 ò 	Ü ×&Ñ&Ð'XÐZaÐcfÔgÜûð	üsc   ‚C0‡B2 �C0­C ÁCÁC ÁA,C0Â2	B>Â;C0Â=B>Â>C0ÃC Ã	C-ÃC(Ã#C0Ã(C-Ã-C0c                  óÆ   — 	 ddl m}  t        j                  j	                  | ¬«      }t        |«      dkD  ry	 ddlm} d|j                  dg «      v ryy# t        $ r Y Œ'w xY w)	zè
        Check if email sending is enabled via v2 enterprise loggers or v0 alerting config.

        Returns True only if email is actually configured, preventing any email
        processing when the user has not opted in.
        r   ©ÚBaseEmailLogger©Úcallback_typeT)Úgeneral_settingsÚemailÚalertingF)
Ú>litellm_enterprise.enterprise_callbacks.send_emails.base_emailrš   rr   Úlogging_callback_managerÚget_custom_loggers_for_typeÚlenr�   r8   r�   r“   )rš   Úinitialized_email_loggersr�   s      rM   Ú_is_email_sending_enabledz1KeyManagementEventHooks._is_email_sending_enabled™  s|   € ð	õô 07×/OÑ/O×/kÑ/kØ-ð 0ló 0Ð%ô Ð,Ó-°Ò1Øð 2õ 	@àÐ&×*Ñ*¨:°rÓ:Ñ:Øàøô ò 	Ùð	ús   ‚4A Á	A ÁA c              ƒ   ó  K  — t         j                  «       st        j                  d«       yddlm}m} 	 ddlm} ddl	m
} t        j                  j                  |¬«      }t        |«      dkD  r¿ || j                  dd	«      d
t         j"                  d| j                  dd	«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      ¬«
      }|D ])  }t%        ||«      sŒ|j'                  |¬«      ƒ d{  –—†  Œ+ y	 d|j                  dg «      v rµddlm}  |d
t         j"                  d| j                  dd	«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      ¬«	      }t/        j0                  |j2                  j5                  |¬«      «       yy7 ŒÒ# t(        $ r Y Œ×w xY w­w)zè
        Send key created email if email sending is enabled.

        This method is non-blocking - it will return silently if email is not
        configured, and will log warnings instead of raising exceptions on failure.
        z5Email sending not enabled, skipping key created emailNr   )r�   Úproxy_logging_objr™   )ÚSendKeyCreatedEmailEventr›   rJ   r%   Úkey_createdzAPI Key Createdr]   Úspendç        Ú
max_budgetÚuser_idr6   úDefault TeamrI   ©
Úvirtual_keyÚeventÚevent_groupÚevent_messager]   rª   r¬   r­   r6   rI   )Úsend_key_created_email_eventrž   rŸ   )ÚWebhookEvent)	r±   r²   r³   r]   rª   r¬   r­   r6   rI   )Úwebhook_event)r   r¥   r   ry   r8   r�   r§   r    rš   Ú9litellm_enterprise.types.enterprise_callbacks.send_emailsr¨   rr   r¡   r¢   r£   r“   r   ÚKEYrv   Úsend_key_created_emailr�   Úlitellm.proxy._typesrµ   r?   r@   Úslack_alerting_instanceÚ&send_key_created_or_user_invited_email)	r   r�   r§   rš   r¨   r¤   r±   Úemail_loggerrµ   s	            rM   r:   z/KeyManagementEventHooks._send_key_created_email·  sý  è ø€ ô '×@Ñ@ÔBÜ ×&Ñ&Ð'^Ô_ØçRð
	õõô 07×/OÑ/O×/kÑ/kØ-ð 0ló 0Ð%ô Ð,Ó-°Ò1Ù0Ø (§¡¨U°BÓ 7Ø'Ü 2× 6Ñ 6Ø"3Ø"Ÿ,™, w°Ó3Ø"Ÿ,™, w°Ó4Ø'Ÿ|™|¨L¸#Ó>Ø$ŸL™L¨°DÓ9Ø$ŸL™L¨°NÓCØ&Ÿl™l¨;¸Ó=ô�ð %>ò �LÜ! ,°Õ@Ø*×AÑAØ9>ð Bó ÷ ñ ðð
 ð% 2ð2 Ð&×*Ñ*¨:°rÓ:Ñ:Ý9á Ø#Ü.×2Ñ2Ø/Ø—l‘l 7¨BÓ/Ø—l‘l 7¨CÓ0Ø#Ÿ<™<¨°cÓ:Ø Ÿ™ Y°Ó5Ø Ÿ™ Y°Ó?Ø"Ÿ,™, {°DÓ9ô
ˆEô ×ÑØ!×9Ñ9×`Ñ`Ø"'ð aó õð ;ðùô ò 	Ùð	üsB   ‚3H¶CG< ÄG< Ä'G:Ä(G< Ä.CHÇ:G< Ç<	HÈHÈHÈHr[   c              ƒ   óê  K  — t         j                  «       st        j                  d«       y	 ddlm} 	 ddlm}  || j                  dd	«      d
t        j                  d| j                  dd	«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  d|«      ¬«
      }t        j                  j                  |¬«      }t        |«      dkD  r/|D ])  }t!        ||«      sŒ|j#                  |¬«      ƒ d{  –—†  Œ+ yy# t        $ r t        j                  d«       Y yw xY w# t        $ r t        j                  d«       Y yw xY w7 ŒP­w)zè
        Send key rotated email if email sending is enabled.

        This method is non-blocking - it will return silently if email is not
        configured, and will log warnings instead of raising exceptions on failure.
        z5Email sending not enabled, skipping key rotated emailNr   r™   z<Enterprise package not installed, skipping key rotated email)ÚSendKeyRotatedEmailEventz:Enterprise types not available, skipping key rotated emailrJ   r%   Úkey_rotatedzAPI Key Rotatedr]   rª   r«   r¬   r­   r6   r®   rI   r¯   r›   )Úsend_key_rotated_email_event)r   r¥   r   ry   r    rš   r�   r·   r¿   r“   r   r¸   rr   r¡   r¢   r£   rv   Úsend_key_rotated_email)r   r[   rš   r¿   r±   r¤   r½   s          rM   ra   z/KeyManagementEventHooks._send_key_rotated_email  ss  è ø€ ô '×@Ñ@ÔBÜ ×&Ñ&Ð'^Ô_Øð	õð	õñ 0Ø Ÿ™ U¨BÓ/ØÜ*×.Ñ.Ø+Ø—,‘,˜w¨Ó+Ø—,‘,˜w¨Ó,Ø—|‘| L°#Ó6Ø—L‘L ¨DÓ1Ø—L‘L ¨NÓ;Ø—l‘l ;Ð0BÓCô
ˆô  ,3×+KÑ+K×+gÑ+gØ)ð ,hó ,
Ð!ô Ð(Ó)¨AÒ-Ø 9ò �Ü˜l¨OÕ<Ø&×=Ñ=Ø5:ð >ó ÷ ñ ñð .øôA ò 	ä ×&Ñ&Ð'eÔfÙð	ûô ò 	Ü ×&Ñ&Ð'cÔdÙð	úð4úsW   ‚+E3®D) µE »CE3ÄE3Ä E1Ä!E3Ä)E
ÅE3Å	E
Å
E3ÅE.Å+E3Å-E.Å.E3)N)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr	   r
   r   rA   rN   r   r   rV   r   r   rc   r   Úlistr’   rj   rH   r`   r{   rh   rx   Úboolr¥   r:   ra   © rƒ   rM   r   r      sŽ  „ Øð
 *.ñ	:aØ ð:aà%ð:að *ð:að   $™Jò	:aó ð:aðx ð *.ñ,Øð,àð,ð ð,ð *ð	,ð
   $™Jò,ó ð,ð\ ð *.ñBØ" TÑ)ðBà3ðBð &ðBð *ð	Bð
   $™JòBó ðBðH ð *.ñ0vØð0và Ð!:Ñ;ð0vð ð0vð *ð	0vð
   $™Jò0vó ð0vðd ñÀð ÐSVð ÐadÐgkÑakò ó ðð> ð
 #ñ	Ø ðàðð ðð �t‘ò	ó ðð> ðf cð f¨cò fó ðfð ð!Ø Ð!:Ñ;ò!ó ð!ðF ð+Ø�t‘ð+à	�‰ò+ó ð+ðZ ð tò ó ðð: ðH°ò Hó ðHðT ð5°ð 5È#ÐPTÉ*ò 5ó ñ5rƒ   r   )r?   rS   r   r   Útypingr   r   rr   Úlitellm._loggingr   Úlitellm._uuidr   rº   r	   r
   r   r   r   r   r   r   r   r   Úlitellm.proxy.utilsr   r   Ú__annotations__r   rÉ   rƒ   rM   ú<module>rÏ      sG   ðÜ Û ß 'ß ã Ý 1Ý ÷÷ ÷ õ 6ð -7Ð " EÓ 6÷]ò ]rƒ   