§
    øžyj6  ã                  ó²   — d Z ddlmZ ddlZddlmZmZmZmZ ddl	m
Z
 d&d
„Zd'd„Zd(d„Zd)d„Zd*d„Zd+d„Zd,d„Zd-d„Zd,d„Zd.d„Zd,d„Zd,d„Zd/d$„Zd,d%„ZdS )0ug  
hermes fallback â€” manage the fallback provider chain.

Fallback providers are tried in order when the primary model fails with
rate-limit, overload, or connection errors. See:
https://hermes-agent.nousresearch.com/docs/user-guide/features/fallback-providers

Subcommands:
  hermes fallback [list]   Show the current fallback chain (default when no subcommand)
  hermes fallback add      Pick provider + model via the same picker as `hermes model`,
                           then append the selection to the chain
  hermes fallback remove   Pick an entry to delete from the chain
  hermes fallback clear    Remove all fallback entries

Storage: ``fallback_providers`` in ``~/.hermes/config.yaml`` (top-level, list of
``{provider, model, base_url?, api_mode?}`` dicts).  The legacy single-dict
``fallback_model`` format is migrated to the new list format on first add.
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional©Úget_fallback_chainÚconfigúDict[str, Any]ÚreturnúList[Dict[str, Any]]c                ó    — t          | ¦  «        S )uy  Return the normalized fallback chain as a list of dicts.

    Accepts both the new list format (``fallback_providers``) and the legacy
    ``fallback_model`` format. When both are present, the effective chain is
    merged with ``fallback_providers`` entries kept first. The returned list is
    always a fresh copy â€” callers can mutate without touching the config dict.
    r   )r
   s    ú=/home/ragecks/.hermes/hermes-agent/hermes_cli/fallback_cmd.pyÚ_read_chainr      s   € õ ˜fÑ%Ô%Ð%ó    ÚchainÚNonec                óH   — || d<   d| v r|                       dd¦  «         dS dS )zAPersist the chain to ``fallback_providers`` and clear legacy key.Úfallback_providersÚfallback_modelN)Úpop)r
   r   s     r   Ú_write_chainr   *   s;   € à#(€FÐÑ à˜6Ð!Ð!Ø�
Š
Ð# TÑ*Ô*Ð*Ð*Ð*ð "Ð!r   ÚentryÚstrc                ó¬   — |                       dd¦  «        }|                       dd¦  «        }|                       d¦  «        }|rd|› d�nd}|› d|› d	|› �S )
z6One-line human-readable rendering of a fallback entry.Úproviderú?ÚmodelÚbase_urlz  [Ú]Ú ú  (via ú))Úget)r   r   r   ÚbaseÚsuffixs        r   Ú_format_entryr'   2   sk   € à�yŠy˜ SÑ)Ô)€HØ�IŠI�g˜sÑ#Ô#€EØ�9Š9�ZÑ Ô €DØ"Ð*ˆ]�4ˆ]ˆ]ˆ]ˆ]¨€FØÐ/Ð/˜HÐ/Ð/ vÐ/Ð/Ð/r   Ú	model_cfgr   úOptional[Dict[str, Any]]c                óØ  — t          | t          ¦  «        sdS |                      d¦  «        pd                     ¦   «         }|                      d¦  «        p|                      d¦  «        pd                     ¦   «         }|r|sdS ||dœ}|                      d¦  «        pd                     ¦   «         }|r||d<   |                      d¦  «        pd                     ¦   «         }|r||d<   |S )	z^Pull the ``{provider, model, base_url?, api_mode?}`` dict from a ``config["model"]`` snapshot.Nr   r!   Údefaultr   )r   r   r   Úapi_mode)Ú
isinstanceÚdictr$   Ústrip)r(   r   r   r   r   r,   s         r   Ú _extract_fallback_from_model_cfgr0   ;   sü   € å�i¥Ñ&Ô&ð ØˆtØ—’˜jÑ)Ô)Ð/¨R×6Ò6Ñ8Ô8€Hà�]Š]˜9Ñ%Ô%ÐE¨¯ª°wÑ)?Ô)?ÐEÀ2×LÒLÑNÔN€EØð ˜5ð ØˆtØ)1¸EÐBÐB€EØ—’˜jÑ)Ô)Ð/¨R×6Ò6Ñ8Ô8€HØð %Ø$ˆˆjÑØ—’˜jÑ)Ô)Ð/¨R×6Ò6Ñ8Ô8€HØð %Ø$ˆˆjÑØ€Lr   c                 óp   — 	 ddl m}   | ¦   «         }|                     d¦  «        S # t          $ r Y dS w xY w)zRReturn the current ``active_provider`` in auth.json, or a sentinel if unavailable.r   )Ú_load_auth_storeÚactive_providerN)Úhermes_cli.authr2   r$   Ú	Exception)r2   Ústores     r   Ú_snapshot_auth_active_providerr7   N   s\   € ðØ4Ð4Ð4Ð4Ð4Ð4Ø Ð Ñ"Ô"ˆØ�yŠyÐ*Ñ+Ô+Ð+øÝð ð ð Øˆtˆtðøøøs   ‚$' §
5´5Úvaluec                ó¸   — 	 ddl m}m}m}  |¦   «         5   |¦   «         }| |d<    ||¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t          $ r Y dS w xY w)z>Write back a previously snapshotted ``active_provider`` value.r   )Ú_auth_store_lockr2   Ú_save_auth_storer3   N)r4   r:   r2   r;   r5   )r8   r:   r2   r;   r6   s        r   Ú_restore_auth_active_providerr<   X   sè   € ð
ØXÐXÐXÐXÐXÐXÐXÐXÐXÐXØÐÑÔð 	$ð 	$Ø$Ð$Ñ&Ô&ˆEØ',ˆEÐ#Ñ$ØÐ˜UÑ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øõ ð ð ð ð 	ˆˆð	øøøs1   ‚A –>±A ¾AÁA ÁAÁA Á
AÁAc           	     ó’  — ddl m}  |¦   «         }t          |¦  «        }t          ¦   «          |s<t          d¦  «         t          ¦   «          t          d¦  «         t          ¦   «          dS t	          |¦  «        }|r t          d|› �¦  «         t          ¦   «          t          dt          |¦  «        › dt          |¦  «        d	k    rd
nd› d�¦  «         t          |d	¦  «        D ]'\  }}t          d|› dt          |¦  «        › �¦  «         Œ(t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          dS )z!Print the current fallback chain.r   )Úload_configz#  No fallback providers configured.z$  Add one with:  hermes fallback addNz  Primary:   z  Fallback chain (Ú é   r   Úentriesú):ú    ú. zM  Tried in order when the primary fails (rate-limit, 5xx, connection errors).zY  Docs: https://hermes-agent.nousresearch.com/docs/user-guide/features/fallback-providers)Úhermes_cli.configr>   r   ÚprintÚ_describe_primaryÚlenÚ	enumerater'   )Úargsr>   r
   r   ÚprimaryÚir   s          r   Úcmd_fallback_listrM   k   s\  € à-Ð-Ð-Ð-Ð-Ð-àˆ[‰]Œ]€FÝ˜ÑÔ€Eå	�G„G€GØð ÝÐ3Ñ4Ô4Ð4Ý‰ŒˆÝÐ4Ñ5Ô5Ð5Ý‰ŒˆØˆå Ñ'Ô'€GØð ÝÐ'˜gÐ'Ð'Ñ(Ô(Ð(Ý‰ŒˆÝ	Ð
Y�s 5™zœzÐ
YÐ
Yµs¸5±z´zÀQ²°¨G¨GÈIÐ
YÐ
YÐ
YÑZÔZÐZÝ˜e QÑ'Ô'ð 2ð 2‰ˆˆ5ÝÐ0�QÐ0Ð0�-¨Ñ.Ô.Ð0Ð0Ñ1Ô1Ð1Ð1Ý	�G„G€GÝ	Ð
YÑZÔZÐZÝ	Ð
eÑfÔfÐfÝ	�G„G€G€G€Gr   úOptional[str]c                óº  — |                       d¦  «        }t          |t          ¦  «        rs|                      d¦  «        pd                     ¦   «         pd}|                      d¦  «        p|                      d¦  «        pd                     ¦   «         pd}|› d|› d�S t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S dS )z?One-line description of the primary model for display purposes.r   r   r   r+   r"   r#   N)r$   r-   r.   r/   r   )r
   r(   r   r   s       r   rG   rG   ‡   sÔ   € à—
’
˜7Ñ#Ô#€IÝ�)�TÑ"Ô"ð ,Ø—M’M *Ñ-Ô-Ð4°×;Ò;Ñ=Ô=ÐDÀˆØ—’˜yÑ)Ô)ÐJ¨Y¯]ª]¸7Ñ-CÔ-CÐJÀs×QÒQÑSÔSÐZÐWZˆØÐ+Ð+ Ð+Ð+Ð+Ð+Ý�)�SÑ!Ô!ð ! i§o¢oÑ&7Ô&7ð !Ø�ŠÑ Ô Ð Øˆ4r   c           
     ó¶  — ddl m}m} ddlm}m}  |d¦  «          |¦   «         }t          j        |                     d¦  «        ¦  «        }t          ¦   «         }t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          	  || ¬¦  «         n-# t          $ r  t          |¦  «         t          |¦  «         ‚ w xY w |¦   «         }|                     d¦  «        }	t          |	¦  «        }
|
s=t          |¦  «         t          |¦  «         t          ¦   «          t          d	¦  «         d
S ddlm}m} |                     |
                     d¦  «        |
                     d¦  «        |
                     d¦  «        ¬¦  «        }t          |¦  «        }|r¸ ||                     |                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «        |¦  «        r]t          |¦  «         t          |¦  «         t          ¦   «          t          dt'          |
¦  «        › d�¦  «         t          d¦  «         d
S t          |¦  «         t          |¦  «          |¦   «         }t)          |¦  «        }|D ]Ž} ||                     |                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «        |¦  «        r1t          ¦   «          t          dt'          |
¦  «        › d�¦  «          d
S Œ�|                     |
¦  «         t-          ||¦  «          ||¦  «         t          ¦   «          t          dt'          |
¦  «        › �¦  «         t          dt/          |¦  «        › dt/          |¦  «        dk    rdnd› d�¦  «         t          ¦   «          t          d¦  «         d
S )zQLaunch the same picker as `hermes model`, then append the selection to the chain.r   )Ú_require_ttyÚselect_provider_and_model©r>   Úsave_configzfallback addr   zG  Adding a fallback provider.  The picker below is the same one used byuH     `hermes model` â€” select the provider + model you want as a fallback.)rJ   z  No fallback added.N)ÚBackendIdentityÚsame_deploymentr   r   )r   r   r   z.  Selected model matches the current primary (z).u;     A provider cannot be a fallback for itself â€” no change.ú  u.    is already in the fallback chain â€” skipped.z  Added fallback: ú  Chain is now r?   r@   r   rA   ú long.zL  Run `hermes fallback list` to view, or `hermes fallback remove` to delete.)Úhermes_cli.mainrQ   rR   rE   r>   rT   ÚcopyÚdeepcopyr$   r7   rF   Ú
SystemExitÚ_restore_model_cfgr<   r0   Úagent.backend_identityrU   rV   Úbuildr'   r   Úappendr   rH   )rJ   rQ   rR   r>   rT   Ú
before_cfgÚmodel_beforeÚactive_provider_beforeÚ	after_cfgÚmodel_afterÚ	new_entryrU   rV   Ú	new_identÚprimary_entryÚ	final_cfgr   Úexistings                     r   Úcmd_fallback_addrl   “   s7  € àGÐGÐGÐGÐGÐGÐGÐGØ:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à€L�Ñ Ô Ð ð �‘”€JÝ”= §¢°Ñ!8Ô!8Ñ9Ô9€LÝ;Ñ=Ô=Ðå	�G„G€GÝ	Ð
SÑTÔTÐTÝ	Ð
TÑUÔUÐUÝ	�G„G€GðØ!Ð! tÐ,Ñ,Ô,Ð,Ð,øÝð ð ð å˜<Ñ(Ô(Ð(Ý%Ð&<Ñ=Ô=Ð=Øð	øøøð �‘”€IØ—-’- Ñ(Ô(€Kå0°Ñ=Ô=€IØð å˜<Ñ(Ô(Ð(Ý%Ð&<Ñ=Ô=Ð=Ý‰ŒˆÝÐ$Ñ%Ô%Ð%Øˆð HÐGÐGÐGÐGÐGÐGÐGà×%Ò%Ø—’˜zÑ*Ô*Ø�mŠm˜GÑ$Ô$Ø—’˜zÑ*Ô*ð &ñ ô €Iõ
 5°\ÑBÔB€MØð ˜˜Ø×ÒØ"×&Ò& zÑ2Ô2Ø×#Ò# GÑ,Ô,Ø"×&Ò& zÑ2Ô2ð 	ñ 	
ô 	
ð
 	ñô ð õ 	˜<Ñ(Ô(Ð(Ý%Ð&<Ñ=Ô=Ð=Ý‰ŒˆÝÐ[½}ÈYÑ?WÔ?WÐ[Ð[Ð[Ñ\Ô\Ð\ÝÐKÑLÔLÐLØˆõ �|Ñ$Ô$Ð$Ý!Ð"8Ñ9Ô9Ð9à�‘”€IÝ˜	Ñ"Ô"€Eð ð ð ˆØˆ?Ø×!Ò!Ø!Ÿš jÑ1Ô1Ø—l’l 7Ñ+Ô+Ø!Ÿš jÑ1Ô1ð "ñ ô ð
 ñ
ô 
ð 
	õ ‰GŒGˆGÝÐ_•} YÑ/Ô/Ð_Ð_Ð_Ñ`Ô`Ð`ØˆFˆFð
	ð 
‡L‚L�ÑÔÐÝ�˜EÑ"Ô"Ð"Ø€K�	ÑÔÐå	�G„G€GÝ	Ð
9�}¨YÑ7Ô7Ð
9Ð
9Ñ:Ô:Ð:Ý	Ð
Z�C ™JœJÐ
ZÐ
ZµC¸±J´JÀ!²O°O¨¨ÈÐ
ZÐ
ZÐ
ZÑ[Ô[Ð[Ý	�G„G€GÝ	Ð
XÑYÔYÐYÐYÐYs   ÂB# Â#*Crc   c                ó    — ddl m}m}  |¦   «         }| €|                     dd¦  «         nt	          j        | ¦  «        |d<    ||¦  «         dS )z>Restore ``config["model"]`` to a previously-captured snapshot.r   rS   Nr   )rE   r>   rT   r   r[   r\   )rc   r>   rT   Úcfgs       r   r^   r^   ú   sk   € à:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à
ˆ+‰-Œ-€CØÐØ�Š�˜ÑÔÐÐå”} \Ñ2Ô2ˆˆG‰Ø€K�ÑÔÐÐÐr   c                ó0  — ddl m}m}  |¦   «         }t          |¦  «        }|s-t	          ¦   «          t	          d¦  «         t	          ¦   «          dS d„ |D ¦   «         }|                     d¦  «         	 ddlm}  |d|d¦  «        }n # t          $ r t          d|¦  «        }Y nw xY w|�|dk     s|t          |¦  «        k    rt	          ¦   «          t	          d	¦  «         dS |                     |¦  «        }t          ||¦  «          ||¦  «         t	          ¦   «          t	          d
t          |¦  «        › �¦  «         |r9t	          dt          |¦  «        › dt          |¦  «        dk    rdnd› d�¦  «         nt	          d¦  «         t	          ¦   «          dS )z+Pick an entry from the chain and remove it.r   rS   u9     No fallback providers configured â€” nothing to remove.Nc                ó,   — g | ]}t          |¦  «        ‘ŒS © )r'   )Ú.0Úes     r   ú
<listcomp>z'cmd_fallback_remove.<locals>.<listcomp>  s    € Ð/Ð/Ð/ A�}˜QÑÔÐ/Ð/Ð/r   ÚCancel)Ú_curses_prompt_choicezSelect a fallback to remove:õ     Cancelled â€” no change.z  Removed fallback: rX   r?   r@   r   rA   rY   z  Fallback chain is now empty.)rE   r>   rT   r   rF   ra   Úhermes_cli.setuprv   r5   Ú_numbered_pickrH   r   r   r'   )	rJ   r>   rT   r
   r   Úchoicesrv   ÚidxÚremoveds	            r   Úcmd_fallback_remover}     sÛ  € à:Ð:Ð:Ð:Ð:Ð:Ð:Ð:àˆ[‰]Œ]€FÝ˜ÑÔ€Eàð Ý‰ŒˆÝÐIÑJÔJÐJÝ‰ŒˆØˆà/Ð/¨Ð/Ñ/Ô/€GØ‡N‚N�8ÑÔÐðFØ:Ð:Ð:Ð:Ð:Ð:Ø#Ð#Ð$BÀGÈQÑOÔOˆˆøÝð Fð Fð FÝÐ;¸WÑEÔEˆˆˆðFøøøð €{�c˜A’g�g ­¨E©
¬
Ò!2Ð!2Ý‰ŒˆÝÐ*Ñ+Ô+Ð+Øˆà�iŠi˜‰nŒn€GÝ�˜ÑÔÐØ€K�ÑÔÐå	�G„G€GÝ	Ð
9¥¨wÑ!7Ô!7Ð
9Ð
9Ñ:Ô:Ð:Øð 0ÝÐ^¥ E¡
¤
Ð^Ð^½¸E¹
¼
Àaº¸¨W¨WÈYÐ^Ð^Ð^Ñ_Ô_Ð_Ð_åÐ.Ñ/Ô/Ð/Ý	�G„G€G€G€Gs   Á3B ÂB$Â#B$c           	     óH  — ddl m}m}  |¦   «         }t          |¦  «        }|s-t	          ¦   «          t	          d¦  «         t	          ¦   «          dS t	          ¦   «          t	          dt          |¦  «        › dt          |¦  «        dk    rdnd	› d
�¦  «         t          |d¦  «        D ]'\  }}t	          d|› dt          |¦  «        › �¦  «         Œ(t	          ¦   «          	 t          d¦  «         	                    ¦   «          
                    ¦   «         }n5# t          t          f$ r! t	          ¦   «          t	          d¦  «         Y dS w xY w|dvrt	          d¦  «         dS t          |g ¦  «          ||¦  «         t	          ¦   «          t	          d¦  «         t	          ¦   «          dS )z0Remove all fallback entries (with confirmation).r   rS   u8     No fallback providers configured â€” nothing to clear.Nz  Current fallback chain (r?   r@   r   rA   rB   rC   rD   z  Clear all entries? [y/N]: z  Cancelled.>   ÚyÚyesrw   z  Fallback chain cleared.)rE   r>   rT   r   rF   rH   rI   r'   Úinputr/   ÚlowerÚKeyboardInterruptÚEOFErrorr   )rJ   r>   rT   r
   r   rL   r   Úresps           r   Úcmd_fallback_clearr†   .  sÅ  € à:Ð:Ð:Ð:Ð:Ð:Ð:Ð:àˆ[‰]Œ]€FÝ˜ÑÔ€Eàð Ý‰ŒˆÝÐHÑIÔIÐIÝ‰ŒˆØˆå	�G„G€GÝ	Ð
a¥s¨5¡z¤zÐ
aÐ
a½sÀ5¹z¼zÈQº¸°G°GÐT]Ð
aÐ
aÐ
aÑbÔbÐbÝ˜e QÑ'Ô'ð 2ð 2‰ˆˆ5ÝÐ0�QÐ0Ð0�-¨Ñ.Ô.Ð0Ð0Ñ1Ô1Ð1Ð1Ý	�G„G€GðÝÐ3Ñ4Ô4×:Ò:Ñ<Ô<×BÒBÑDÔDˆˆøÝ�xÐ(ð ð ð Ý‰ŒˆÝˆnÑÔÐØˆˆðøøøð �<ÐÐÝÐ*Ñ+Ô+Ð+Øˆå�˜ÑÔÐØ€K�ÑÔÐÝ	�G„G€GÝ	Ð
%Ñ&Ô&Ð&Ý	�G„G€G€G€Gs   Ã3D Ä.EÅEÚquestionrz   ú	List[str]úOptional[int]c                ó&  — t          | ¦  «         t          |d¦  «        D ]\  }}t          d|› d|› �¦  «         Œt          ¦   «          	 	 t          dt          |¦  «        › d�¦  «                             ¦   «         }|sdS t          |¦  «        dz
  }d|cxk    rt          |¦  «        k     rn n|S t          d	t          |¦  «        › �¦  «         n@# t          $ r t          d
¦  «         Y n%t          t          f$ r t          ¦   «          Y dS w xY wŒÉ)z9Fallback numbered-list picker when curses is unavailable.r@   rW   rD   Tz
Choice [1-z]: Nr   zPlease enter 1-zPlease enter a number)	rF   rI   r�   rH   r/   ÚintÚ
ValueErrorrƒ   r„   )r‡   rz   rL   ÚcÚvalr{   s         r   ry   ry   Q  sJ  € å	ˆ(�O„O€OÝ˜' 1Ñ%Ô%ð ð ‰ˆˆ1Ýˆm�1ˆmˆm˜ˆmˆmÑÔÐÐÝ	�G„G€Gðð	ÝÐ6¥S¨¡\¤\Ð6Ð6Ð6Ñ7Ô7×=Ò=Ñ?Ô?ˆCØð Ø�tÝ�c‘(”(˜Q‘,ˆCØ�CÐ&Ð&Ò&Ð&�#˜g™,œ,Ò&Ð&Ð&Ð&Ð&Ø�
ÝÐ2¥C¨¡L¤LÐ2Ð2Ñ3Ô3Ð3Ð3øÝð 	+ð 	+ð 	+ÝÐ)Ñ*Ô*Ð*Ð*Ð*Ý!¥8Ð,ð 	ð 	ð 	Ý‰GŒGˆGØ�4�4ð	øøøðs$   Á4C Â0C Â2C ÃDÃ-DÄDc                ó4  — t          | dd¦  «        }|dv rt          | ¦  «         dS |dk    rt          | ¦  «         dS |dv rt          | ¦  «         dS |dk    rt	          | ¦  «         dS t          d|› �¦  «         t          d¦  «         t          d	¦  «        ‚)
z:Top-level dispatcher for ``hermes fallback [subcommand]``.Úfallback_commandN>   Nr!   ÚlsÚlistÚadd>   ÚrmÚremoveÚclearzUnknown fallback subcommand: z$Use one of: list, add, remove, clearé   )ÚgetattrrM   rl   r}   r†   rF   r]   )rJ   Úsubs     r   Úcmd_fallbackrš   k  sÀ   € å
�$Ð*¨DÑ
1Ô
1€CØ
Ð&Ð&Ð&Ý˜$ÑÔÐÐÐØ	�ŠˆÝ˜ÑÔÐÐÐØ	Ð Ð	 Ð	 Ý˜DÑ!Ô!Ð!Ð!Ð!Ø	�ŠˆÝ˜4Ñ Ô Ð Ð Ð åÐ3¨cÐ3Ð3Ñ4Ô4Ð4ÝÐ4Ñ5Ô5Ð5Ý˜‰mŒmÐr   )r
   r   r   r   )r
   r   r   r   r   r   )r   r   r   r   )r(   r   r   r)   )r   r   )r8   r   r   r   )r   r   )r
   r   r   rN   )rc   r   r   r   )r‡   r   rz   rˆ   r   r‰   )Ú__doc__Ú
__future__r   r[   Útypingr   r   r   r   Úhermes_cli.fallback_configr	   r   r   r'   r0   r7   r<   rM   rG   rl   r^   r}   r†   ry   rš   rq   r   r   ú<module>rŸ      s�  ððð ð$ #Ð "Ð "Ð "Ð "Ð "à €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à 9Ð 9Ð 9Ð 9Ð 9Ð 9ð&ð &ð &ð &ð+ð +ð +ð +ð0ð 0ð 0ð 0ðð ð ð ð&ð ð ð ðð ð ð ð&ð ð ð ð8	ð 	ð 	ð 	ðdZð dZð dZð dZðN	ð 	ð 	ð 	ð%ð %ð %ð %ðP ð  ð  ð  ðFð ð ð ð4ð ð ð ð ð r   