Ë
    [hF  ã                   ó0  — d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ ddlmZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZ dZ ejB                   G d„ dejD                  «      «       Z#ejB                   G d„ dejD                  «      «       Z$ejB                   G d„ dejD                  «      «       Z% e&e%jN                  e%jP                  e%jR                  e%jT                  g«      Z+ G d„ de«      Z,dZ-dee.   de/de.fd„Z0d.d„Z1de#de$dee.e.f   fd„Z2de,fd„Z3de4fd„Z5de/fd „Z6dee%e.f   fd!„Z7de/fd"„Z8de/de/fd#„Z9de/fd$„Z:de#fd%„Z;de.fd&„Z<d'„ Z=d(„ Z>deeef   fd)„Z?	 d/d*ee   de/de,fd+„Z@d,„ ZAeBd-k(  r eA«        yy)0zGDefine 'status' utility and handler as part of cloud-init command line.é    N)Údeepcopy)ÚgmtimeÚsleepÚstrftime)ÚAnyÚDictÚListÚ
NamedTupleÚOptionalÚTuple)ÚsafeyamlÚsubp)Úread_cfg_paths)Úuses_systemd)ÚPaths)Úget_cmdlineÚ	load_jsonÚload_text_filez/etc/cloud/cloud-init.disabledc                   ó    — e Zd ZdZdZdZdZdZy)ÚRunningStatusz=Enum representing user-visible cloud-init application status.znot startedÚrunningÚdoneÚdisabledN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNOT_STARTEDÚRUNNINGÚDONEÚDISABLED© ó    ú6/usr/lib/python3/dist-packages/cloudinit/cmd/status.pyr   r      s   „ áGà€KØ€GØ€DØ�Hr#   r   c                   ó   — e Zd ZdZdZdZdZy)ÚConditionStatusz;Enum representing user-visible cloud-init condition status.ÚerrorÚdegradedÚhealthyN)r   r   r   r   ÚERRORÚDEGRADEDÚPEACHYr"   r#   r$   r&   r&   %   s   „ áEà€EØ€HØ�Fr#   r&   c                   ó0   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)ÚEnabledStatusz<Enum representing user-visible cloud-init boot status codes.zdisabled-by-generatorzdisabled-by-kernel-command-linezdisabled-by-marker-filez disabled-by-environment-variablezenabled-by-generatorzenabled-by-kernel-command-linezenabled-by-sysvinitÚunknownN)r   r   r   r   ÚDISABLED_BY_GENERATORÚDISABLED_BY_KERNEL_CMDLINEÚDISABLED_BY_MARKER_FILEÚDISABLED_BY_ENV_VARIABLEÚENABLED_BY_GENERATORÚENABLED_BY_KERNEL_CMDLINEÚENABLED_BY_SYSVINITÚUNKNOWNr"   r#   r$   r.   r.   .   s4   „ áFà3ÐØ!BÐØ7ÐØAÐØ1ÐØ @ÐØ/ÐØ�Gr#   r.   c                   óŽ   — e Zd ZU eed<   eed<   eed<   eed<   ee   ed<   e	eee   f   ed<   eed<   e
e   ed<   e	eef   ed	<   y
)ÚStatusDetailsÚrunning_statusÚcondition_statusÚboot_status_codeÚdescriptionÚerrorsÚrecoverable_errorsÚlast_updateÚ
datasourceÚv1N)r   r   r   r   Ú__annotations__r&   r.   Ústrr	   r   r   r   r"   r#   r$   r9   r9   F   sU   … Ø!Ó!Ø%Ó%Ø#Ó#ØÓØ�‰IÓØ˜S $ s¡)˜^Ñ,Ó,ØÓØ˜‘ÓØˆS�#ˆX‰Ôr#   r9   z›extended_status: {extended_status}
boot_status_code: {boot_code}
{last_update}detail: {description}
errors:{errors}
recoverable_errors:{recoverable_errors}Úsystemctl_argsÚwaitÚreturnc                ó¶   — 	 	 t        j                   dg| ¢«      j                  j                  «       S # t         j                  $ r |s‚ t	        d«       Y nw xY wŒY)z-Query systemd with retries and return output.Ú	systemctlç      Ð?)r   ÚstdoutÚstripÚProcessExecutionErrorr   )rE   rF   s     r$   Úquery_systemctlrN   Z   sY   € ð ð	Ü—9‘9˜kÐ;¨NÐ;Ó<×CÑC×IÑIÓKÐKøÜ×)Ñ)ò 	ÙØÜ�$ŽKð	úð s   ƒ/3 ³!AÁAc                 óÈ   — | st        j                  dd¬«      } | j                  dt        g d¢dd¬«       | j                  d	d
ddd¬«       | j                  ddddd¬«       | S )a%  Build or extend an arg parser for status utility.

    @param parser: Optional existing ArgumentParser instance representing the
        status subcommand which will be extended to support the args of
        this utility.

    @returns: ArgumentParser with proper argument configuration.
    ÚstatuszReport run status of cloud init)Úprogr=   z--format)ÚjsonÚtabularÚyamlrS   z5Specify output format for cloud-id (default: tabular))ÚtypeÚchoicesÚdefaultÚhelpz-lz--longÚ
store_trueFzJReport long format of statuses including run stage name and error messages)ÚactionrW   rX   z-wz--waitz'Block waiting on cloud-init to complete)ÚargparseÚArgumentParserÚadd_argumentrD   ©Úparsers    r$   Ú
get_parserr`   i   s’   € ñ Ü×(Ñ(ØÐ'Hô
ˆð ×ÑØÜÚ+ØØDð ô ð ×ÑØØØØðð ô 	ð ×ÑØØØØØ6ð ô ð €Mr#   r   Ú	conditionc                 óJ  — |t         j                  k(  rd|j                  › d| j                  › �fS |t         j                  k(  rI| t        j
                  t        j                  fv r'| j                  |j                  › d| j                  › �fS | j                  | j                  fS )zžTranslate running and condition status to human readable strings.

    Returns (status, extended_status).
    Much of this is for backwards compatibility
    r'   z - ú )r&   r*   Úvaluer+   r   r    r   )r   ra   s     r$   Útranslate_statusre   ‘   s•   € ð ”O×)Ñ)Ò)Ø˜9Ÿ?™?Ð+¨3¨w¯}©}¨oÐ>Ð>Ð>à	”o×.Ñ.Ò	.°7Ü×ÑÜ×Ñð?ñ 4ð �}‰} §¡Ð 1°°7·=±=°/ÐBÐBÐBØ�=‰=˜'Ÿ-™-Ð'Ð'r#   Údetailsc                 ó   — t        |j                  |j                  «      \  }}|j                  |j                  j
                  |||j                  |j                  |j                  |j                  dœ|j                  ¥}| j                  dk(  �rd}|d   }t        |› d|› �«       | j                  rÞ|j                  d«      r
d|d   › d�}nd}|d	   rd
d
j                  |d	   «      z   nd}|d   rmddj                  |d   j!                  «       D �	�
�cg c]:  \  }	}
|	› d�d
j                  |
D �cg c]  }|j#                  dd«      ‘Œ c}«      z   ‘Œ< c}}
}	«      z   nd}t        t$        j                  |d   ||d   |d   |||¬«      «       yy| j                  dk(  r#t        t'        j(                  |ddd¬«      «       y| j                  dk(  rt        t+        j(                  |«      «       yyc c}w c c}}
}	w )zPrint status out to the CLI.)rA   r<   rP   Úextended_statusÚdetailr>   r?   r@   rS   Ú rP   zstatus: r@   zlast_update: ú
r>   z
	- z []r?   z:
	- rc   z {}rh   r<   ri   )rh   ÚprefixÚ	boot_coder=   r@   r>   r?   rR   é   T)ú,z: )ÚindentÚ	sort_keysÚ
separatorsrT   N)re   r:   r;   rA   r<   rd   r=   r>   r?   r@   rB   ÚformatÚprintÚlongÚgetÚjoinÚitemsÚreplaceÚTABULAR_LONG_TMPLrR   Údumpsr   )Úargsrf   rP   rh   Údetails_dictrl   Ústater@   Úerrors_outputÚkÚvÚiÚrecoverable_errors_outputs                r$   Úprint_statusr„   ¥   s1  € ä.Ø×Ñ × 8Ñ 8óÑ€FˆOð ×(Ñ(Ø#×4Ñ4×:Ñ:ØØ*Ø×%Ñ%Ø—.‘.Ø%×8Ñ8Ø×*Ñ*ñ
$ð �*‰*ð
$€Lð ‡{�{�iÓØˆð ˜XÑ&ˆÜ��˜  Ð(Ô)Ø�9Š9Ø×Ñ Ô.Ø -¨l¸=Ñ.IÐ-JÈ"ÐM‘à �ð   Ò)ð ˜8Ÿ=™=¨°hÑ)?Ó@Ò@àð ð  Ð 4Ò5ð Ø—)‘)ð %1Ð1EÑ$F×$LÑ$LÓ$N÷ð ñ !˜A˜qð ˜#˜W˜Ø"Ÿ-™-ÀqÖ(IÀ!¨¯©°4¸Õ)=Ò(IÓJóKôóòð ð &ô Ü!×(Ñ(Ø$0Ð1BÑ$CØ!Ø*Ð+=Ñ>Ø ,¨XÑ 6Ø +Ø(Ø'@ð )ó õ
ð- ðB 
�‰˜Ò	ÜÜ�J‰JØ Q°$À;ôõ	
ð
 
�‰˜Ò	ÜŒh�n‰n˜\Ó*Õ+ð 
ùò1 )Jùôs   ÄG9Ä2G4ÅG9Ç4G9c                 óx  — t        «       }t        ||j                  «      }|j                  rÆ|j                  t        j
                  t        j                  fv rš|j                  dk(  r=t        j                  j                  d«       t        j                  j                  «        t        ||j                  «      }t        d«       |j                  t        j
                  t        j                  fv rŒšt        ||«       |j                  t        j                   k(  ry|j                  t        j"                  k(  ryy)z4Handle calls to 'cloud-init status' as a subcommand.rS   ú.rJ   é   rn   r   )r   Úget_status_detailsrF   r:   r   r   r   rs   ÚsysrK   ÚwriteÚflushr   r„   r;   r&   r*   r+   )Únamer|   Úpathsrf   s       r$   Úhandle_status_argsrŽ   ç   sõ   € ô Ó€EÜ  ¨¯	©	Ó2€GØ‡y‚yØ×$Ñ$Ü×%Ñ%Ü×!Ñ!ð)
ñ 
ð �{‰{˜iÒ'Ü—
‘
× Ñ  Ô%Ü—
‘
× Ñ Ô"Ü(¨°·	±	Ó:ˆGÜ�$ŒKð ×$Ñ$Ü×%Ñ%Ü×!Ñ!ð)
ò 
ô ��wÔð ×Ñ¤?×#8Ñ#8Ò8Øà	×	!Ñ	!¤_×%=Ñ%=Ò	=ØØr#   c                 ód   — 	 t        dg| ¬«      }d|v S # t        j                  $ r d}Y d|v S w xY w)z?Return whether cloud-init is disabled via environment variable.zshow-environment©rF   rj   úcloud-init=disabled)rN   r   rM   )rF   Úenvs     r$   Ú_disabled_via_environmentr“     sK   € ðÜÐ1Ð2¸Ô>ˆð ! CÐ'Ð'øô ×%Ñ%ò Ø‰Ø  CÐ'Ð'ðús   ‚ ”/®/c                 óž  — t        «       j                  «       }t        «       st        j                  }d}||fS d|v rt        j
                  }d}||fS t        j                  j                  | «      r%t        j                  }dj                  | «      }||fS d|v rt        j                  }d}||fS dt        j                  j                  dd«      v st        «       r"t        |¬	«      rt        j                  }d
}||fS t        j                  j                  t        j                  j!                  |j"                  d«      «      rt        j$                  }d}||fS t        j                  j                  t        j                  j!                  |j"                  d«      «      rt        j&                  }d}||fS t        j(                  }d}||fS )aX  Report whether cloud-init current boot status

    @param disable_file: The path to the cloud-init disable file.
    @param paths: An initialized cloudinit.helpers.Paths object.
    @param wait: If user has indicated to wait for cloud-init to complete.
    @returns: A tuple containing (code, reason) about cloud-init's status and
    why.
    zCloud-init enabled on sysvinitzcloud-init=enabledz<Cloud-init enabled by kernel command line cloud-init=enabledzCloud-init disabled by {0}r‘   z;Cloud-init disabled by kernel parameter cloud-init=disabledÚKERNEL_CMDLINErj   r�   zNCloud-init disabled by environment variable KERNEL_CMDLINE=cloud-init=disabledr   z+Cloud-init disabled by cloud-init-generatorÚenabledz2Cloud-init enabled by systemd cloud-init-generatorz'Systemd generator may not have run yet.)r   Úsplitr   r.   r6   r5   ÚosÚpathÚexistsr2   rs   r1   Úenvironrv   r“   r3   rw   Úrun_dirr0   r4   r7   )Údisable_filer�   rF   Úcmdline_partsÚbootstatus_codeÚreasons         r$   Úget_bootstatusr¡     s¨  € ô  “M×'Ñ'Ó)€MÜŒ>Ü'×;Ñ;ˆØ1ˆð6 ˜VÐ$Ð$ð5 
 Ñ	.Ü'×AÑAˆØOˆð0 ˜VÐ$Ð$ô/ 
�‰�‰˜Ô	%Ü'×?Ñ?ˆØ-×4Ñ4°\ÓBˆð* ˜VÐ$Ð$ð) 
 -Ñ	/Ü'×BÑBˆØNˆð$ ˜VÐ$Ð$ð# 
¤"§*¡*§.¡.Ð1AÀ2Ó"FÑ	FÜŒÔ4¸$Õ?ä'×@Ñ@ˆð1ð 	ð ˜VÐ$Ð$ô 
�‰�‰œŸ™Ÿ™ U§]¡]°JÓ?Ô	@Ü'×=Ñ=ˆØ>ˆð ˜VÐ$Ð$ô 
�‰�‰œŸ™Ÿ™ U§]¡]°IÓ>Ô	?Ü'×<Ñ<ˆØEˆð ˜VÐ$Ð$ô (×/Ñ/ˆØ:ˆØ˜VÐ$Ð$r#   c                  óH   — t        t        «       «      j                  t        vS ©N)rˆ   r   r<   ÚDISABLED_BOOT_CODESr"   r#   r$   Úis_cloud_init_enabledr¥   5  s    € äœ>Ó+Ó,×=Ñ=Ü"ð	#ðr#   c                 ó0  — dD ]½  }	 t        dd|g| ¬«      }t        |j                  «       D ��cg c]/  }|j                  d	«      D �cg c]  }|j                  «       ‘Œ c}‘Œ1 c}}«      }|d
   j                  d«      s
|d
   dk(  s y|d   dk(  r|d   dk(  rŒ—|d   dk(  r
|d   dk(  r y y|d   dk(  s|d   dk(  r y y y# t        j                  $ r3}t        d|j                  › �t
        j                  ¬«       Y d}~ yd}~ww xY wc c}w c c}}w )z2Return if systemd units report a cloud-init error.)zcloud-final.servicezcloud-config.servicezcloud-init.servicezcloud-init-local.serviceÚshowz5--property=ActiveState,UnitFileState,SubState,MainPIDr�   z^Failed to get status from systemd. Cloud-init status may be inaccurate. Error from systemctl: )ÚfileNFú=ÚUnitFileStater–   ÚstaticTÚActiveStateÚactiveÚSubStateÚexitedr   ÚMainPIDÚ0Úfailed)rN   r   rM   rt   Ústderrr‰   ÚdictÚ
splitlinesr—   rL   Ú
startswith)rF   ÚservicerK   ÚeÚrÚxÚstatess          r$   Úsystemd_failedr¼   <  sK  € ðò 2ˆð	Ü$àØKØðð
 ôˆFô" Ø8>×8IÑ8IÓ8K×L°1 §¡¨£Ö.˜Aˆa�g‰g�iÔ.ÓLó
ˆð �?Ñ#×.Ñ.¨yÔ9Ø�oÑ&¨(Ò2ñ Ø�MÑ" hÒ.Ø�jÑ! XÒ-àØ˜
Ñ# yÒ0°V¸IÑ5FÈ#Ò5Mñ ñ ð �=Ñ! XÒ-°¸
Ñ1CÀxÒ1Oáñ ðe2ðj øôM ×)Ñ)ò 	äð)à)*¯©¨
ð4ô —Z‘Zõ	õ ûð	üò /ùÓLs.   ‡C¯DÁDÁDÃD
Ã(DÄD
ÄDc                 ó„   — t         j                  j                  | «      xr  t         j                  j                  |«       S )z%Return True if cloud-init is running.)r˜   r™   rš   )Ústatus_fileÚresult_files     r$   Ú
is_runningrÀ   v  s*   € ä�7‰7�>‰>˜+Ó&ÒJ¬r¯w©w¯~©~¸kÓ/JÐ+JÐJr#   c                 ó´   — |t         v rt        j                  S t        | |«      rt        j                  S |dkD  rt        j
                  S t        j                  S )z(Return the running status of cloud-init.r   )r¤   r   r!   rÀ   r   r    r   )r¾   r¿   r<   Úlatest_events       r$   Úget_running_statusrÃ   {  sO   € ð Ô.Ñ.Ü×%Ñ%Ð%Ü	�K Ô	-Ü×$Ñ$Ð$Ø	˜Ò	Ü×!Ñ!Ð!ä×(Ñ(Ð(r#   c                 ó˜   — | j                  dd«      }|r5|j                  d«      \  }}}|j                  «       j                  dd«      }|S )zyGet the datasource from status.json.

    Return a lowercased non-prefixed version. So "DataSourceEc2" becomes "ec2"
    rA   rj   rc   )rv   Ú	partitionÚlowerry   )Ú	status_v1rA   ÚdsÚ_s       r$   Úget_datasourcerÊ   ‰  sK   € ð
 —‘˜|¨RÓ0€JÙØ×'Ñ'¨Ó,‰ˆˆAˆqØ—X‘X“Z×'Ñ'¨°bÓ9ˆ
ØÐr#   c                 ób   — | j                  d«      }|r|S | j                  d«      rd| d   › �S |S )z¼Return a description of the current status.

    If we have a datasource, return that. If we're running in a particular
    stage, return that. Otherwise, return the boot_description.
    rA   ÚstagezRunning in stage: )rv   )rÇ   Úboot_descriptionrA   s      r$   Úget_descriptionrÎ   •  s@   € ð —‘˜|Ó,€JÙØÐØ	�‰�wÔ	Ø# I¨gÑ$6Ð#7Ð8Ð8àÐr#   c                 ó¼   — d}| j                  «       D ]F  }t        |t        «      sŒt        ||j	                  d«      xs d|j	                  d«      xs d«      }ŒH |S )z,Return the latest event time from status_v1.r   ÚstartÚfinished)ÚvaluesÚ
isinstancer´   Úmaxrv   )rÇ   rÂ   Ú
stage_infos      r$   Úget_latest_eventrÖ   ¤  s`   € à€LØ×&Ñ&Ó(ò ˆ
Ü�j¤$Õ'ÜØØ—‘˜wÓ'Ò,¨1Ø—‘˜zÓ*Ò/¨aó‰Lðð Ðr#   c                 ó`  — g }i }t        | j                  «       «      D ]‹  \  }}t        |t        «      sŒ|j	                  |j                  dg «      «       |j                  di «      }|j                  «       D ]/  }||vrt        ||   «      ||<   Œ||   j	                  ||   «       Œ1 Œ� ||fS )z>Return a list of errors and recoverable_errors from status_v1.r>   r?   )Úsortedrx   rÓ   r´   Úextendrv   Úkeysr   )rÇ   r>   r?   Ú_keyrÕ   Úcurrent_recoverable_errorsÚerr_types          r$   Ú
get_errorsrÞ   ±  sÊ   € à€FØÐÜ" 9§?¡?Ó#4Ó5ò ÑˆˆjÜ�j¤$Õ'Ø�M‰M˜*Ÿ.™.¨°2Ó6Ô7ð *4¯©Ø$ bó*Ð&ð 7×;Ñ;Ó=ò �ØÐ#5Ñ5Ü3;Ø2°8Ñ<ó4Ð& xÒ0ð ' xÑ0×7Ñ7Ø2°8Ñ<õñðð" Ð%Ð%Ð%r#   r�   c                 ó’  — t         j                  }| xs
 t        «       } t        j                  j                  | j                  d«      }t        j                  j                  | j                  d«      }t        t        | |«      \  }}i }t        j                  j                  |«      r$t        t        |«      «      j                  di «      }t        |«      }t        ||«      }	t        |«      }
|
rt!        dt#        |
«      «      nd}t%        |«      \  }}|rt         j&                  }n|rt         j(                  }t+        ||||
«      }|t,        j.                  k(  rIt1        «       r?t3        |¬«      r3t,        j4                  }t         j&                  }d}	|j7                  d«       |j9                  d	d
«       t;        ||||	|||||«	      S )a  Return a dict with status, details and errors.

    @param paths: An initialized cloudinit.helpers.paths object.
    @param wait: If user has indicated to wait for cloud-init to complete.

    Values are obtained from parsing paths.run_dir/status.json.
    zstatus.jsonzresult.jsonrB   z%a, %d %b %Y %H:%M:%S %zrj   r�   z"Failed due to systemd unit failurez‹Failed due to systemd unit failure. Ensure all cloud-init services are enabled, and check 'systemctl' or 'journalctl' for more information.rA   N)r&   r,   r   r˜   r™   rw   rœ   r¡   ÚCLOUDINIT_DISABLED_FILErš   r   r   rv   rÊ   rÎ   rÖ   r   r   rÞ   r*   r+   rÃ   r   r   r   r¼   r    ÚappendÚpopr9   )r�   rF   r;   r¾   r¿   r<   rÍ   rÇ   rA   r=   rÂ   r@   r>   r?   r:   s                  r$   rˆ   rˆ   É  sž  € ô '×-Ñ-ÐØÒ%”^Ó%€EÜ—'‘'—,‘,˜uŸ}™}¨mÓ<€KÜ—'‘'—,‘,˜uŸ}™}¨mÓ<€KÜ)7Ü ¨ó*Ñ&ÐÐ&ð €IÜ	‡w�w‡~�~�kÔ"Üœn¨[Ó9Ó:×>Ñ>¸tÀRÓHˆ	ä 	Ó*€JÜ! )Ð-=Ó>€Kä# IÓ.€Lñ ô 	Ð+¬V°LÓ-AÔBàð ô ",¨IÓ!6Ñ€FÐÙÜ*×0Ñ0ÑÙ	Ü*×3Ñ3Ðä'Ø�[Ð"2°Ló€Nð
 	œ-×/Ñ/Ò/ÜŒNÜ Õ%ä&×+Ñ+ˆÜ*×0Ñ0ÐØ:ˆØ�‰ð$ô	
ð ‡M�M�, Ô%äØØØØØØØØØó
ð 
r#   c                  ór   — t        «       } t        j                  t        d| j	                  «       «      «       y)z$Tool to report status of cloud-init.rP   N)r`   r‰   ÚexitrŽ   Ú
parse_argsr^   s    r$   Úmainræ     s&   € ä‹\€FÜ‡H�HÔ ¨&×*;Ñ*;Ó*=Ó>Õ?r#   Ú__main__r£   )NF)Cr   r[   ÚenumrR   r˜   r‰   Úcopyr   Útimer   r   r   Útypingr   r   r	   r
   r   r   Ú	cloudinitr   r   Úcloudinit.cmd.develr   Úcloudinit.distrosr   Úcloudinit.helpersr   Úcloudinit.utilr   r   r   rà   ÚuniqueÚEnumr   r&   r.   Ú	frozensetr0   r1   r2   r3   r¤   r9   rz   rD   ÚboolrN   r`   re   r„   ÚintrŽ   r“   r¡   r¥   r¼   rÀ   rÃ   rÊ   rÎ   rÖ   rÞ   rˆ   ræ   r   r"   r#   r$   ú<module>rö      s+  ðñ Nã Û Û Û 	Û 
Ý ß (Ñ (ß ?× ?ç $Ý .Ý *Ý #ß AÑ Aà:Ð ð ‡�ô�D—I‘Ió ó ðð ‡�ô�d—i‘ió ó ðð ‡�ô
�D—I‘Ió 
ó ð
ñ  à×+Ñ+Ø×0Ñ0Ø×-Ñ-Ø×.Ñ.ð	óÐ ô	�Jô 	ð+Ð ðØ˜‘Iðð ðð 	ó	ó%ðP(Øð(Ø'6ð(à
ˆ3�ˆ8�_ó(ð(?, ó ?,ðD có ð6( tó (ð'%°°}ÀcÐ7IÑ1Jó '%ðT˜tó ð7˜ð 7 $ó 7ðtK¨Dó Kð
)àó)ð	 ó 	ò ò
ð&˜U 4¨ :Ñ.ó &ð2 16ñDØ�E‰?ðDØ)-ðDàóDòN@ð ˆzÒÙ…Fð r#   