§
    §A¾j:@ ã                   óð  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dl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 d dlmZ d dlmZ d dlmZ d dlmZ 	 d dlZ ej        ¦   «          n## e$ rZ ee¦  «          e d¦  «        ‚dZ[ww xY wd d	l!m"Z" d d
l!m#Z# d dl!m$Z$ d dl!m%Z% d dl!m&Z& d dl!m'Z' d dl!m(Z( d dl!m)Z) d dl!m*Z* d dl!m+Z+ d dl,m-Z- d dl.m/Z/ d dl.m0Z0 d dl1m2Z2 d dl3m4Z4 	 d dl5m6Z6 n# e7$ r  G d„ de8¦  «        Z6Y nw xY wdZ9dZ:dZ;dZ<dZ=e	j>         ?                    d d!¦  «        Z@d"ZA ejB        d#¦  «        ZCd$ZDe	jE         F                    d%¦  «        pd&ZGd'ZHdZId(ZJe	jE         F                    d)¦  «        ZKe	jE         F                    d)¦  «        ZLd*ZMe	jE         F                    d+d,¦  «        ZNd-ZOejP        jQ        › d.ejP        jR        › �ZSd/ZT G d0„ d1¦  «        ZU eU¦   «         ZVd2eWd3eWd4dfd5„ZXd2eWd3eWd4dfd6„ZYdÕd2eWd7e(e"eW                  d3eWd4dfd8„ZZd9eWd4dfd:„Z[ e
j\        ¦   «         › d; e
j]        ¦   «         › �Z^d<Z_d=Z`d>Zad?Zbd@ZcdAZddBZedCZfdDZg G dE„ dF¦  «        ZhdGeWd4eWfdH„Zi eie^¦  «        ZjdIZkdJZldKZmdLZnenemdMœZo	 dÖdNe'eW         dOe(eW         dPe(e'eW                  d4epfdQ„ZqdRe'eW         d4e'eW         fdS„ZrdPe'eW         d4e%eWeWf         fdT„Zsd×dVeWdWetd4e*eteWf         fdX„ZudYetdWetdZetd4dfd[„Zvd\eWd4dfd]„ZwdVeWd^eWd4dfd_„Zxd`eWd4e*e(eW         eWf         fda„Zy	 	 	 dØd`eWdVeWdbe(e$etetetgdf                  dce(ep         dde(e         d4e*eWe4f         fde„Zzd`eWd^eWd4e+de{f         fdf„Z|dgeWdheWd4dfdi„Z}d\eWdjetd4dfdk„Z~ G dl„ dme¦  «        Z G dn„ doe¦  «        Z€ G dp„ dqe¦  «        Z� G dr„ dse‚¦  «        Zƒej„         G dt„ due‚¦  «        ¦   «         Z… edvg dw¢¦  «        Z† G dx„ dye‚¦  «        Z‡ G dz„ d{e¦  «        Zˆ G d|„ d}¦  «        Z‰ G d~„ d¦  «        ZŠ G d€„ d�¦  «        Z‹d4e%eWe‡f         fd‚„ZŒdƒ„ Z�d„e(e%eWe‡f                  fd…„ZŽd4e*eWeWf         fd†„Z�d4eWfd‡„Z�d4e*eWeWeWeWf         fdˆ„Z‘d‰e'eW         d4e'eW         fdŠ„Z’d‹e'eW         dŒed�e'eW         d4e'eW         fdŽ„Z“d�eWd4e'eW         fd�„Z”d‘eŠd�eWd4e'eW         fd’„Z•d“eWd4eWfd”„Z–d‘eŠd•eWd4e'eW         fd–„Z—d4e'eW         fd—„Z˜d‘eŠd„e%eWe‡f         d4e%eWe‡f         fd˜„Z™d3e'eW         d™e%eWe#f         d4eWfdš„Zšd3e'eW         d4dfd›„Z›d3e'eW         d4e*eWeWf         fdœ„Zœd3e'eW         d4e*eWeWf         fd�„Z�d4eWfdž„ZždŸ„ ZŸd „ Z d¡„ Z¡d¢„ Z¢d£e‡d¤eWd¥eWd¦eWd4e*e£e¤f         f
d§„Z¥d£e‡d¤eWd4dfd¨„Z¦d£e‡d¤eWd©eWd¦eWd4df
dª„Z§d£e‡d¤eWd3e j¨        d©eWd¦eWd4e*e£e¤e©f         fd«„Zªd¬eWd­eWd4dfd®„Z«d3e#d4dfd¯„Z¬deMfd3e#d°eWd4eWfd±„Z­d3e#d²eWd4eWfd³„Z®d²eWd4eWfd´„Z¯	 dÙdµeWd�e'eW         d‹e'eW         d¶e©d4e*e'eW         e%eWe‡f         f         f
d·„Z°d¸„ Z±d¹„ Z²d4e(eW         fdº„Z³d»eWd4e'eW         fd¼„Z´dÚd­eWd¾e©d4eWfd¿„Zµd\eWd4dfdÀ„Z¶dÁ„ Z·dÂ„ Z¸ G dÃ„ dÄ¦  «        Z¹ G dÅ„ dÆe¦  «        Zº G dÇ„ dÈ¦  «        Z»d3e#d4dfdÉ„Z¼dÊ„ Z½d3e#d4dfdË„Z¾dÌ„ Z¿dÍ„ ZÀd3e#d4dfdÎ„ZÁd3e#d4dfdÏ„ZÂdÐe'eW         d4dfdÑ„ZÃeÄdÒk    r9dÓe	jE        v r eXdÔ¦  «          e d¦  «        ‚ eÃejÅ        dd…         ¦  «         dS dS )Ûé    N)ÚOrderedDict)Ú
namedtuple)ÚJSONEncoder)Ú
SSLContext)ÚTarFile)ÚZipFileé   )ÚIO)ÚAny)ÚCallable)ÚDict)ÚIterator)ÚList)ÚOptional)ÚSet)ÚTuple)ÚUnion)ÚContentTooShortError)Úurljoin)Úurlparse)Úurlopen)Ú
addinfourl)ÚWindowsErrorc                   ó   — e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© ó    úC/home/lighthouse/esp32-dev/.cache/esp-idf-v5.5.4/tools/idf_tools.pyr   r   W   s   € € € € € Øˆr   r   ztools/tools.jsonztools/tools_schema.jsonztools/tools.new.jsonzidf-env.jsoné   ú~z
.espressifÚunknownz\${TOOL_PATH}z\1ÚIDF_MAINTAINERFÚTODOú,ÚIDF_TOOLS_INSTALL_CMDz#https://dl.espressif.com/dl/esp-idfÚIDF_PIP_WHEELS_URLzhttps://dl.espressif.com/pypizidf{}_py{}_envú.zidf_version.txtc                   óŒ   ‡ — e Zd ZU dZdZed          ed<   ddgZg d¢Zde	de	d	d fˆ fd
„Z
dd„Zded	e	fd„Zdede	d	dfˆ fd„Zˆ xZS )ÚGlobalVarsStorez»
    Pythonic way how to handle global variables.
    One global instance of this class is initialized and used as an entrypoint (store)
    It handles string and boolean properties.
    NÚ	_instanceÚquietÚnon_interactive)Úidf_pathÚidf_tools_pathÚ
tools_jsonÚargsÚkwargsÚreturnc                 ó¤   •— | j         sB t          t          | ¦  «        j        | g|¢R i |¤Ž| _         | j                              ¦   «          | j         S ©N)r,   Úsuperr+   Ú__new__Ú_initialize_properties)Úclsr2   r3   Ú	__class__s      €r    r8   zGlobalVarsStore.__new__|   sW   ø€ ØŒ}ð 	3Ø?�E¥/°3Ñ7Ô7Ô?ÀÐUÀdÐUÐUÐUÈfÐUÐUˆCŒMØŒM×0Ò0Ñ2Ô2Ð2ØŒ}Ðr   c                 ó~   — | j         D ]}t          | d|› �d¦  «         Œ| j        D ]}t          | d|› �d ¦  «         Œd S )NÚ_F)Ú_bool_propertiesÚsetattrÚ_string_properties)ÚselfÚprops     r    r9   z&GlobalVarsStore._initialize_properties‚   sf   € àÔ)ð 	-ð 	-ˆDÝ�D˜*˜d˜*˜* eÑ,Ô,Ð,Ð,àÔ+ð 	,ð 	,ˆDÝ�D˜*˜d˜*˜* dÑ+Ô+Ð+Ð+ð	,ð 	,r   Únamec                 ó®   — || j         | j        z   v r3t          | d|› �¦  «        }|€|| j        v rt          d|› d�¦  «        ‚|S t	          |› d�¦  «        ‚)Nr=   z	Variable z  accessed before initialization.z is not a valid attribute)r>   r@   ÚgetattrÚReferenceErrorÚAttributeError)rA   rC   Úvalues      r    Ú__getattr__zGlobalVarsStore.__getattr__Š   su   € Ø�4Ô(¨4Ô+BÑBÐBÐBÝ&-¨d°J¸°J°JÑ&?Ô&?ˆEØˆ} ¨Ô)@Ð!@Ð!@Ý$Ð%W°Ð%WÐ%WÐ%WÑXÔXÐXØˆLÝ Ð?Ð?Ð?Ñ@Ô@Ð@r   rH   c                 ó¼   •— || j         | j        z   v r't          ¦   «                              d|› �|¦  «         d S t          ¦   «                              ||¦  «         d S )Nr=   )r>   r@   r7   Ú__setattr__)rA   rC   rH   r;   s      €r    rK   zGlobalVarsStore.__setattr__’   s_   ø€ Ø�4Ô(¨4Ô+BÑBÐBÐBÝ‰GŒG×Ò 
 D 
 
¨EÑ2Ô2Ð2Ð2Ð2å‰GŒG×Ò  eÑ,Ô,Ð,Ð,Ð,r   ©r4   N)r   r   r   Ú__doc__r,   r   Ú__annotations__r>   r@   r   r8   r9   ÚstrrI   rK   Ú__classcell__)r;   s   @r    r+   r+   q   sþ   ø€ € € € € € ðð ð .2€IˆxÐ)Ô*Ð1Ð1Ñ1ØÐ!2Ð3ÐØEÐEÐEÐð˜Cð ¨3ð Ð3Dð ð ð ð ð ð ð,ð ,ð ,ð ,ðA ð A¨ð Að Að Að Að- ð -¨Cð -°Dð -ð -ð -ð -ð -ð -ð -ð -ð -ð -r   r+   Útextr2   r4   c                 óX   — t           j        st          j        j        d| › d�g|¢R Ž  dS dS )z-
    Writes ERROR: + text to sys.stderr.
    zERROR: ú
N©Úgr-   ÚsysÚstderrÚwrite©rQ   r2   s     r    ÚfatalrZ   œ   sE   € õ Œ7ð 4ÝŒ
ÔÐ+ 4Ð+Ð+Ð+Ð3¨dÐ3Ð3Ð3Ð3Ð3Ð3ð4ð 4r   c                 óX   — t           j        st          j        j        d| › d�g|¢R Ž  dS dS )z/
    Writes WARNING: + text to sys.stderr.
    z	WARNING: rS   NrT   rY   s     r    Úwarnr\   ¤   sE   € õ Œ7ð 6ÝŒ
ÔÐ- TÐ-Ð-Ð-Ð5°Ð5Ð5Ð5Ð5Ð5Ð5ð6ð 6r   Úfc                 ó`   — t           j        s!|€t          j        } |j        | › d�g|¢R Ž  dS dS )zQ
    Writes text to a stream specified by second arg, sys.stdout by default.
    NrS   )rU   r-   rV   ÚstdoutrX   )rQ   r]   r2   s      r    Úinfor`   ¬   sJ   € õ Œ7ð $Øˆ9Ý”
ˆAØˆŒ�4���Ð#˜dÐ#Ð#Ð#Ð#Ð#Ð#ð$ð $r   Úerrc                 ó"  — t          d¦  «         d| v rZt          d¦  «         t          d¦  «         t          j        dk    rt          d¦  «         t          dt          j        › d�¦  «         t          j        d	k    rt          d
¦  «         dS dS )z]
    Prints hint on download error. Tries to specify the message depending on the error.
    z8Please make sure you have a working Internet connection.ÚCERTIFICATEz[Certificate issues are usually caused by an outdated certificate database on your computer.zNPlease check the documentation of your operating system for how to upgrade it.ÚdarwinzJRunning "./Install\ Certificates.command" might be able to fix this issue.z	Running "zM -m pip install --upgrade certifi" can also resolve this issue in some cases.Úwin32z„By downloading and using the offline installer from https://dl.espressif.com/dl/esp-idf you might be able to work around this issue.N)r`   rV   ÚplatformÚ
executable)ra   s    r    Úprint_hints_on_download_errorrh   ¶   s¬   € õ 	Ð	CÑDÔDÐDà˜ÐÐÝÐjÑkÔkÐkÝÐ]Ñ^Ô^Ð^åŒ<˜8Ò#Ð#ÝÐ^Ñ_Ô_Ð_åÐv�œÐvÐvÐvÑwÔwÐwõ „|�wÒÐÝð;ñ	
ô 	
ð 	
ð 	
ð 	
ð Ðr   ú-re   Úwin64Úmacoszmacos-arm64z
linux-i686zlinux-amd64zlinux-armelzlinux-armhfzlinux-arm64c                   óŒ  — e Zd ZdZi ee“de“de“de“ee“de“de“de“de“ee“d	e“d
e“de“de“ee“de“de“i de“ee“de“de“de“de“e	e	“de	“de	“de	“de	“de	“e
e
“de
“de
“de
“de
“¥eedeeededed ei¥Zd!gZed"ee         d#ee         fd$„¦   «         Zed%ee         d#efd&„¦   «         Zed'ed#efd(„¦   «         Zd)S )*Ú	Platformszå
    Mappings from various other names these platforms are known as, to the identifiers above.
    This includes strings produced from "platform.system() + '-' + platform.machine()", see PYTHON_PLATFORM
    definition above.
    zWindows-i686zWindows-x86zi686-w64-mingw32zWindows-x86_64zWindows-AMD64zx86_64-w64-mingw32zWindows-ARM64Úosxrd   zDarwin-x86_64zx86_64-apple-darwinzDarwin-arm64zaarch64-apple-darwinzarm64-apple-darwinÚlinux64zLinux-x86_64zFreeBSD-amd64zx86_64-linux-gnuÚlinux32z
Linux-i686zFreeBSD-i386zi586-linux-gnuzi686-linux-gnuzLinux-arm64zLinux-aarch64zLinux-armv8lÚaarch64zarm-linux-gnueabihfzarm-linux-gnueabizLinux-armv7lz	Linux-armzLinux-armv6lÚsupposed_platformr4   c                 óø  — | t           t          t          fvr| S t          t          j        d¦  «        5 }t                               |                     d¦  «        t          j	        ¦  «        t                               dt          j	        ¦  «        k    r| cddd¦  «         S | 
                    d¦  «         t                               |                     d¦  «        t          j	        ¦  «        }|dk    rt          } ng|dk    ra| 
                    d	¦  «         t                               |                     d¦  «        t          j	        ¦  «        }|d
z  rt          } nt           } ddd¦  «         n# 1 swxY w Y   | S )aR  
        We probe the python binary to check exactly what environment the script is running in.

        ARM platform may run on armhf hardware but having armel installed packages.
        To avoid possible armel/armhf libraries mixing need to define user's
        packages architecture to use the same
        See note section in https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#index-mfloat-abi

        ARM platform may run on aarch64 hardware but having armhf installed packages
        (it happens if a docker container is running on arm64 hardware, but using an armhf image).
        Úrbé   s   ELFNé   é   é·   é(   é$   i   )ÚPLATFORM_LINUX_ARM32ÚPLATFORM_LINUX_ARMHFÚPLATFORM_LINUX_ARM64ÚopenrV   rg   ÚintÚ
from_bytesÚreadÚ	byteorderÚseek)rr   r]   Ú	e_machineÚe_flagss       r    Údetect_linux_arm_platformz#Platforms.detect_linux_arm_platform  s‡  € ð Õ%9Õ;OÕQeÐ$fÐfÐfØ$Ð$õ •#”. $Ñ'Ô'ð 	=¨1õ �~Š~˜aŸfšf Q™iœi­¬Ñ7Ô7½3¿>º>È*ÕVYÔVcÑ;dÔ;dÒdÐdØ(ð		=ð 	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð
 �FŠF�2‰JŒJˆJÝŸš q§v¢v¨a¡y¤yµ#´-Ñ@Ô@ˆIØ˜CÒÐÝ$8Ð!Ð!Ø˜b’�Ø—’�r‘
”
�
ÝŸ.š.¨¯ª°©¬µC´MÑBÔB�Ø˜U‘?ð =Ý(<Ð%Ð%å(<Ð%ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð" !Ð s   ³A!E/Â!CE/Å/E3Å6E3Úplatform_aliasc                 óP  — | st          d¦  «        ‚| t          j        v rt          d| › d�¦  «        ‚| dk    rt          rt          } t          j                             | d¦  «        }t          j        dk    rt                               |¦  «        }|st          d| › d�¦  «        ‚|S )	zN
        Get a proper platform name based on PLATFORM_FROM_NAME dict.
        z(System platform could not be identified.z
Platform 'z' is not supported by ESP-IDF.ÚanyNÚlinuxzSupport for platform 'z' hasn't been added yet.)	Ú
ValueErrorrm   ÚUNSUPPORTED_PLATFORMSÚCURRENT_PLATFORMÚPLATFORM_FROM_NAMEÚgetrV   rf   r†   )r‡   Úplatform_names     r    r�   zPlatforms.get<  s»   € ð
 ð 	IÝÐGÑHÔHÐHà�YÔ<Ð<Ð<ÝÐX¨.ÐXÐXÐXÑYÔYÐYà˜UÒ"Ð"Õ'7Ð"Ý-ˆNÝ!Ô4×8Ò8¸ÈÑNÔNˆÝŒ<˜7Ò"Ð"Ý%×?Ò?ÀÑNÔNˆMàð 	`ÝÐ^°nÐ^Ð^Ð^Ñ_Ô_Ð_àÐr   Ú	file_namec                 ó¤   — d}t           j        D ](}|| v r"t          |¦  «        t          |¦  «        k     r|}Œ)t                                |¦  «        S )zB
        Guess the right platform based on the file name.
        Ú )rm   rŽ   Úlenr�   )r‘   Úfound_aliasr‡   s      r    Úget_by_filenamezPlatforms.get_by_filenameR  sX   € ð
 ˆÝ'Ô:ð 	-ð 	-ˆNà Ð*Ð*­s°;Ñ/?Ô/?Å#ÀnÑBUÔBUÒ/UÐ/UØ,�øÝ�}Š}˜[Ñ)Ô)Ð)r   N)r   r   r   rM   ÚPLATFORM_WIN32ÚPLATFORM_WIN64ÚPLATFORM_MACOSÚPLATFORM_MACOS_ARM64ÚPLATFORM_LINUX64ÚPLATFORM_LINUX32r}   r|   r{   rŽ   rŒ   Ústaticmethodr   rO   r†   r�   r–   r   r   r    rm   rm   Ü   sº  € € € € € ðð ð,à˜ð,ð 	˜ð,ð 	�~ð	,ð
 	˜Nð,ð 	˜ð,ð 	˜.ð,ð 	˜ð,ð 	˜nð,ð 	˜ð,ð 	˜ð,ð 	ˆ~ð,ð 	�.ð,ð 	˜ð,ð  	˜~ð!,ð" 	Ð2ð#,ð$ 	Ð,ð%,ð& 	Ð 4ð',ð ,ð( 	Ð2ð),ð, 	Ð*ð-,ð. 	Ð#ð/,ð0 	Ð(ð1,ð2 	Ð)ð3,ð4 	Ð,ð5,ð6 	Ð*ð7,ð8 	Ð#ð9,ð: 	Ð&ð;,ð< 	Ð(ð=,ð> 	Ð*ð?,ð@ 	Ð*ðA,ðB 	Ð2ðC,ðD 	Ð+ðE,ðF 	Ð-ðG,ðH 	Ð,ðI,ðJ 	Ð'ðK,ð ,ðL 	Ð2ØÐ3ØÐ2ØÐ1ØÐ,ØÐ)ðW,ð ,Ðð^ ,Ð,Ðàð!!°X¸c´]ð !!ÀxÐPSÄ}ð !!ð !!ð !!ñ „\ð!!ðF ð˜H SœMð ¨cð ð ð ñ „\ðð* ð	* 3ð 	*¨3ð 	*ð 	*ð 	*ñ „\ð	*ð 	*ð 	*r   rm   Úplatform_strc                 ó¸   — 	 t                                | ¦  «        }n=# t          $ r0}t          t	          |¦  «        ¦  «         t          d¦  «        ‚d}~ww xY w|S )z’
    Parses platform from input string and checks whether it is a valid platform.
    If not, raises SystemExit exception with error message.
    r	   N)rm   r�   r‹   rZ   rO   Ú
SystemExit)rž   rf   Úes      r    Úparse_platform_argr¢   _  s]   € ð
Ý—=’= Ñ.Ô.ˆˆøÝð ð ð Ý�c�!‰fŒf‰ŒˆÝ˜‰mŒmÐøøøøðøøøð €Os   ‚ �
A§+AÁAÚshellz	key-valuea;  
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
a  
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
MrY=
-----END CERTIFICATE-----
)zdl.espressif.comz
github.comÚcmdÚ
input_textÚextra_pathsc                 ó8  — |r‰d}dg}t           j        dk    r|                     d¦  «         |D ]\}|D ]S}t          j                             || d         |z   ¦  «        }t          j                             |¦  «        r	|| d<   d} nŒT|r nŒ]	 d}|r|                     ¦   «         }t          j	        | t          j
        t          j
        d|¬¦  «        }	|	j        |	j        z   S # t          t          f$ r§ t          j        | t          j
        t          j
        t          j
        ¬	¦  «        }
|
                     |¦  «        \  }}|
j        dk    rF	 t          j        |
j        | ||¦  «        ‚# t          $ r t          j        |
j        | |¦  «        ‚w xY w||z   cY S w xY w)
a$  
    Runs command and checks output for exceptions. If AttributeError or TypeError occurs, function re-runs the process.
    If return code was not 0, subprocess.CalledProcessError is raised, otherwise, the original error is masked.
    Returns both stdout and stderr of the run command.
    Fr“   re   z.exer   TN)r_   rW   ÚcheckÚinput)r_   ÚstdinrW   )rV   rf   ÚappendÚosÚpathÚjoinÚexistsÚencodeÚ
subprocessÚrunÚPIPEr_   rW   rG   Ú	TypeErrorÚPopenÚcommunicateÚ
returncodeÚCalledProcessError)r¤   r¥   r¦   ÚfoundÚ
extensionsr­   ÚextÚfullpathÚinput_bytesÚresultÚpr_   rW   s                r    Úrun_cmd_check_outputrÀ   ª  sÐ  € ð ð ØˆØ�Tˆ
ÝŒ<˜7Ò"Ð"Ø×Ò˜fÑ%Ô%Ð%Øð 	ð 	ˆDØ!ð ð �Ýœ7Ÿ<š<¨¨c°!¬f°s©lÑ;Ô;�Ý”7—>’> (Ñ+Ô+ð Ø%�C˜‘FØ �EØ�Eðð ð Ø�ððØˆØð 	.Ø$×+Ò+Ñ-Ô-ˆKÝ” ­J¬OÅJÄOÐ[_ÐgrÐsÑsÔsˆØŒ}˜vœ}Ñ,Ð,øÝ�IÐ&ð ð ð ÝÔ˜S­¬Å
ÄÕXbÔXgÐhÑhÔhˆØŸš {Ñ3Ô3‰ˆ�ØŒ<˜1ÒÐðOÝ Ô3°A´LÀ#ÀvÈvÑVÔVÐVøÝð Oð Oð OÝ Ô3°A´LÀ#ÀvÑNÔNÐNðOøøøà˜‰ÐÐÐðøøøs&   ÂAC! Ã!A*FÅE(Å(&FÆFÆFÚ
paths_listc                 ó>   — t           j        dk    rd„ | D ¦   «         } | S )zL
    Converts / (linux)  to \ (Windows) if called under win32 platform.
    re   c                 ó‚   — g | ]<}t           j        j        |v r%|                     d t           j        j        ¦  «        n|‘Œ=S )ú/)r¬   r­   ÚsepÚreplace)Ú.0r¿   s     r    ú
<listcomp>z+to_shell_specific_paths.<locals>.<listcomp>Ú  s>   € ÐaÐaÐaÐQRµR´W´[ÀAÐ5EÐ5E�a—i’i ¥R¤W¤[Ñ1Ô1Ð1È1ÐaÐaÐar   ©rV   rf   )rÁ   s    r    Úto_shell_specific_pathsrÊ   Õ  s+   € õ „|�wÒÐØaÐaÐV`ÐaÑaÔaˆ
àÐr   c                 ó¶   — t           j                             ¦   «         }t           j                             | ¦  «        t           j        z   |d         z   }||d<   |S )zƒ
    Return a copy of environment variables dict, prepending paths listed in extra_paths
    to the PATH environment variable.
    ÚPATH)r¬   ÚenvironÚcopyÚpathsepr®   )r¦   Úenv_argÚnew_paths      r    Úget_env_for_extra_pathsrÒ   ß  sF   € õ
 Œj�oŠoÑÔ€GÝŒz�Š˜{Ñ+Ô+­b¬jÑ8¸7À6¼?ÑJ€HØ€GˆF�OØ€Nr   é   ÚfilenameÚ
block_sizec                 ó*  ‡‡— t          j        ¦   «         }d}t          | d¦  «        5 Št          ˆˆfd„d¦  «        D ])}|                     |¦  «         |t          |¦  «        z  }Œ*	 ddd¦  «         n# 1 swxY w Y   ||                     ¦   «         fS )z(
    Gets file size and its sha256.
    r   rt   c                  ó.   •— ‰                      ‰ ¦  «        S r6   )r�   )rÕ   r]   s   €€r    ú<lambda>z&get_file_size_sha256.<locals>.<lambda>ñ  s   ø€  !§&¢&¨Ñ"4Ô"4€ r   r   N)ÚhashlibÚsha256r~   ÚiterÚupdater”   Ú	hexdigest)rÔ   rÕ   rÚ   ÚsizeÚblockr]   s    `   @r    Úget_file_size_sha256rà   ê  sâ   øø€ õ Œ^ÑÔ€FØ€DÝ	ˆh˜Ñ	Ô	ð  ÝÐ4Ð4Ð4Ð4Ð4°cÑ:Ô:ð 	ð 	ˆEØ�MŠM˜%Ñ Ô Ð Ø•C˜‘J”JÑˆDˆDð	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �×!Ò!Ñ#Ô#Ð#Ð#s   ¨?A4Á4A8Á;A8ÚcountÚ
total_sizec                 óÖ   — t          | |z  dz  |z  ¦  «        }t          d|¦  «        }t          j                             d|z  ¦  «         t          j                             ¦   «          dS )zL
    Prints progress (count * block_size * 100 / total_size) to stdout.
    éd   z%d%%N)r   ÚminrV   r_   rX   Úflush)rá   rÕ   râ   Úpercents       r    Úreport_progressrè   ÷  sd   € õ �%˜*Ñ$ sÑ*¨ZÑ7Ñ8Ô8€GÝ�#�wÑÔ€GÝ„J×Ò�X Ñ'Ñ(Ô(Ð(Ý„J×ÒÑÔÐÐÐr   r­   c                 óÊ   — 	 t          j        | ¦  «         dS # t          $ r@}|j        t          j        k    st           j                             | ¦  «        s‚ Y d}~dS d}~ww xY w)zz
    Makes directory in given path.
    Suppresses error when directory is already created or path is a path to file.
    N)r¬   ÚmakedirsÚOSErrorÚerrnoÚEEXISTr­   Úisdir)r­   Úexcs     r    Úmkdir_prð     su   € ð
Ý
Œ�DÑÔÐÐÐøÝð ð ð ØŒ9�œÒ$Ð$­B¬G¯MªM¸$Ñ,?Ô,?Ð$Øð %Ð$Ð$Ð$Ð$Ð$øøøøðøøøs   ‚ ˜
A"¢5AÁA"Údestinationc                 óÒ  — t          d| › d|› �¦  «         |                      d¦  «        rt          j        | d¦  «        }nŠ|                      d¦  «        rt          j        | d¦  «        }n_|                      d¦  «        rt          j        | d¦  «        }n4|                      d	¦  «        rt	          | ¦  «        }nt          d
¦  «        ‚t          |t          j        ¦  «        r0t          j	        dd…         dk    r| 
                    |d¬¦  «         n| 
                    |¦  «         t          j        dk    r§|                      d	¦  «        r”t          |t          ¦  «        r�|                     ¦   «         D ]n}t          j                             ||j        ¦  «        }|j        dz	  dz  }t          j                             |¦  «        rt          j        ||¦  «         ŒidS dS dS dS )zU
    Extracts file specified by filename into destination depending on its type.
    zExtracting ú to )ú.tar.gzz.tgzzr:gzú.tar.xzzr:xzz.tar.bz2zr:bz2ÚzipzUnsupported archive typeNrw   )r!   é   Útar)Úfilterre   é   iÿ  )r`   ÚendswithÚtarfiler~   r   ÚNotImplementedErrorÚ
isinstancer   rV   Úversion_infoÚ
extractallrf   Úinfolistr¬   r­   r®   rÔ   Úexternal_attrr¯   Úchmod)rÔ   rñ   Úarchive_objÚ	file_infoÚextracted_fileÚextracted_permissionss         r    Úunpackr    sô  € õ 	Ð	2�xÐ	2Ð	2 [Ð	2Ð	2Ñ3Ô3Ð3Ø×ÒÐ,Ñ-Ô-ð 	>Ý/6¬|¸HÀfÑ/MÔ/MˆˆØ	×	Ò	˜IÑ	'Ô	'ð >Ý”l 8¨VÑ4Ô4ˆˆØ	×	Ò	˜JÑ	(Ô	(ð >Ý”l 8¨WÑ5Ô5ˆˆØ	×	Ò	˜5Ñ	!Ô	!ð >Ý˜hÑ'Ô'ˆˆå!Ð"<Ñ=Ô=Ð=õ �+�wœÑ/Ô/ð ,µCÔ4DÀRÀaÀRÔ4HÈGÒ4SÐ4Sà×Ò˜{°5ÐÑ9Ô9Ð9Ð9à×Ò˜{Ñ+Ô+Ð+õ „|�wÒÐ 8×#4Ò#4°UÑ#;Ô#;ÐÅ
È;ÕX_Ñ@`Ô@`ÐØ$×-Ò-Ñ/Ô/ð 	@ð 	@ˆIÝœWŸ\š\¨+°yÔ7IÑJÔJˆNØ$-Ô$;¸rÑ$AÀEÑ$IÐ!ÝŒw�~Š~˜nÑ-Ô-ð @Ý”˜Ð)>Ñ?Ô?Ð?øð ÐÐÐÐÐð	@ð 	@r   Úurlc                 ó¨   — t          j        d| t           j        ¦  «        }|r-|                     ¦   «         \  }}|                     ¦   «         |fS d| fS )zI
    Splits given url into its type (e.g. https, file) and the rest.
    z([^/:]+):(.*)N)ÚreÚmatchÚDOTALLÚgroupsÚlower)r	  r  ÚschemeÚdatas       r    Ú	splittyper  .  sO   € õ ŒH�_ c­2¬9Ñ5Ô5€EØð $Ø—|’|‘~”~‰ˆ�Ø�|Š|‰~Œ~˜tÐ#Ð#Ø�ˆ9Ðr   Ú
reporthookr  Úcontextc                 óø  — t          | ¦  «        \  }}i }|r||d<   t          j        t          | |fi |¤Ž¦  «        5 }|                     ¦   «         }	|dk    r/|s-t
          j                             |¦  «        |	fcddd¦  «         S t          |d¦  «        }
|
5  ||	f}d}t          |	 
                    dd¦  «        ¦  «        }d}d}|r ||||¦  «         	 |                     |¦  «        }|sn<|t          |¦  «        z  }|
                     |¦  «         |d
z  }|r ||||¦  «         ŒT	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |dk    r||k     rt          d||fz  |¦  «        ‚|S )zu
    Retrieve data from given URL. An alternative version of urlretrieve which takes SSL context as an argument.
    r  ÚfileNÚwbi    zcontent-lengthéÿÿÿÿr   Tr	   z1retrieval incomplete: got only %i out of %i bytes)r  Ú
contextlibÚclosingr   r`   r¬   r­   Únormpathr~   r   r�   r�   r”   rX   r   )r	  rÔ   r  r  r  Úurl_typer­   Úextra_urlopen_argsÚfpÚheadersÚtfpr¾   ÚbsrÞ   r�   Úblocknumrß   s                    r    Úurlretrieve_ctxr#  9  sf  € õ ˜s‘^”^�N€Hˆdð ÐØð 0Ø(/Ð˜9Ñ%Ý	Ô	�G C¨ÐDÐDÐ1CÐDÐDÑ	EÔ	Eð 3ÈØ—'’'‘)”)ˆð �vÒÐ hÐÝ”7×#Ò# DÑ)Ô)¨7Ð2ð3ð 3ð 3ð 3ñ 3ô 3ð 3ð 3õ �8˜TÑ"Ô"ˆàð 	3ð 	3Ø˜wÐ&ˆFØˆBÝ�w—{’{Ð#3°RÑ8Ô8Ñ9Ô9ˆDØˆDØˆHàð /Ø�
˜8 R¨Ñ.Ô.Ð.ð3ØŸš ™œ�Øð ØØ�˜E™
œ
Ñ"�Ø—	’	˜%Ñ Ô Ð Ø˜A‘�Øð 3Ø�J˜x¨¨TÑ2Ô2Ð2ð3ð ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð> ˆq‚y€y�T˜D’[�[Ý"Ð#VÐZ^Ð`dÐYeÑ#eÐgmÑnÔnÐnà€Ms<   ¼=EÂEÂBD7Ä+EÄ7D;	Ä;EÄ>D;	Ä?EÅEÅEc                 ól  — t          d| › �¦  «         t          d|› �¦  «         	 t                               ¦   «         D ]4\  }}|| v r+t          j        ¦   «         }|                     |¬¦  «          nŒ5d}t          | |t          j        st          nd|¬¦  «         t          j                             d¦  «         	 t          j                             ¦   «          dS # t          $ r*}|cY d}~t          j                             ¦   «          S d}~ww xY w# t          j                             ¦   «          w xY w)zB
    Download from given url and save into given destination.
    úDownloading zDestination: )ÚcadataN)r  zDone
)r`   ÚDL_CERT_DICTÚitemsÚsslÚcreate_default_contextÚload_verify_locationsr#  rU   r.   rè   rV   r_   rX   ræ   Ú	Exception)r	  rñ   ÚsiteÚcertÚctxr¡   s         r    Údownloadr0  n  sS  € õ 	Ð	˜Ð	Ð	ÑÔÐÝÐ	&˜Ð	&Ð	&Ñ'Ô'Ð'ðÝ&×,Ò,Ñ.Ô.ð 	ð 	‰JˆD�$ð �sˆ{ˆ{ÝÔ0Ñ2Ô2�Ø×)Ò)°Ð)Ñ6Ô6Ð6Ø�ð ð
 ˆCå˜˜[ÅÔARÐ*\­/¨/ÐX\ÐfiÐjÑjÔjÐjÝŒ
×Ò˜Ñ$Ô$Ð$Øõ
 	Œ
×ÒÑÔÐÐÐøõ	 ð ð ð àˆˆˆˆˆåŒ
×ÒÑÔÐÐøøøøð	øøøøõ 	Œ
×ÒÑÔÐÐøøøs0   ¦BC Ã
DÃ&DÃ'DÃ(D ÄDÄD Ä D3Ú	path_fromÚpath_toc                 óV  — t           j                             d¦  «        rdnd}t          |¦  «        D ]u}	 t	          j        | |¦  «          dS # t          $ rN d| › d|› d�}||dz
  k    rt          |› d�¦  «         ‚ t          |› d	�¦  «         t          j
        d
¦  «         Y Œrw xY wdS )aD  
    Sometimes renaming a directory on Windows (randomly?) causes a PermissionError.
    This is confirmed to be a workaround:
    https://github.com/espressif/esp-idf/issues/3819#issuecomment-515167118
    https://github.com/espressif/esp-idf/issues/4063#issuecomment-531490140
    https://stackoverflow.com/a/43046729
    Úwiné   r	   NzRename ró   z failedz[. Antivirus software might be causing this. Disabling it temporarily could solve the issue.z, retrying...g      à?)rV   rf   Ú
startswithÚranger¬   Úrenamerë   rZ   r\   ÚtimeÚsleep)r1  r2  Úretry_countÚretryÚmsgs        r    Úrename_with_retryr>  ‰  sî   € õ œ×/Ò/°Ñ6Ô6Ð=�"�"¸A€KÝ�{Ñ#Ô#ð ð ˆð	ÝŒI�i Ñ)Ô)Ð)ØˆFˆFøÝð 		ð 		ð 		Ø;˜IÐ;Ð;¨7Ð;Ð;Ð;ˆCØ˜ a™Ò'Ð'ÝØÐwÐwÐwñô ð ð Ý�CÐ&Ð&Ð&Ñ'Ô'Ð'åŒJ�s‰OŒOˆOˆOˆOð		øøøð	ð s   ¶AÁAB&Â%B&Úlevelsc                 ó*  — |dk    sJ ‚| › d�}t           j                             |¦  «        rt          j        |¦  «         t          | |¦  «         t          j        | ¦  «         |}t          |¦  «        D ]Ÿ}t          j        |¦  «        }t          |¦  «        dk    rt          d|› d|› �¦  «        ‚t           j                             ||d         ¦  «        }t           j                             |¦  «        st          d|› d|d         › d�¦  «        ‚Œ t          j        |¦  «        }|D ]R}t           j                             ||¦  «        }t           j                             | |¦  «        }t          ||¦  «         ŒSt          j        |¦  «         dS )	z·
    The number of top directory levels specified by levels argument will be removed when extracting.
    E.g. if levels=2, archive path a/b/c/d.txt will be extracted as c/d.txt.
    r   ú.tmpr	   z	at level z, expected 1 entry, got ú, z is not a directoryN)r¬   r­   r¯   ÚshutilÚrmtreer>  Úmkdirr7  Úlistdirr”   ÚRuntimeErrorr®   rî   )	r­   r?  Útmp_pathÚ	base_pathÚlevelÚcontentsrC   Ú	move_fromÚmove_tos	            r    Údo_strip_container_dirsrN  ¢  s‰  € ð
 �AŠ:ˆ:ˆ:ˆ:àˆ}ˆ}ˆ}€HÝ	„w‡~‚~�hÑÔð  ÝŒ�hÑÔÐÝ�d˜HÑ%Ô%Ð%Ý„HˆT�N„N€NØ€Iå�v‘”ð Vð VˆÝ”:˜iÑ(Ô(ˆÝˆx‰=Œ=˜1ÒÐÝÐT¨5ÐTÐTÈ(ÐTÐTÑUÔUÐUÝ”G—L’L ¨H°Q¬KÑ8Ô8ˆ	ÝŒw�}Š}˜YÑ'Ô'ð 	VÝÐT¨5ÐTÐT°H¸Q´KÐTÐTÐTÑUÔUÐUð	Võ Œz˜)Ñ$Ô$€HØð .ð .ˆÝ”G—L’L ¨DÑ1Ô1ˆ	Ý”'—,’,˜t TÑ*Ô*ˆÝ˜) WÑ-Ô-Ð-Ð-Ý
„M�(ÑÔÐÐÐr   c                   ó   — e Zd ZdZdS )ÚToolNotFoundErrorzK
    Raise when the tool is not found (not present in the paths etc.).
    N©r   r   r   rM   r   r   r    rP  rP  À  ó   € € € € € ðð ð 	€Dr   rP  c                   ó   — e Zd ZdZdS )ÚToolExecErrorzA
    Raise when  the tool returns with a non-zero exit code.
    NrQ  r   r   r    rT  rT  È  rR  r   rT  c                   ó   — e Zd ZdZdS )ÚToolBinaryErrorzN "
    Raise when an error occurred when running any version of the tool.
    NrQ  r   r   r    rV  rV  Ð  rR  r   rV  c                   ó2   — e Zd ZdZdedededededdfd	„ZdS )
ÚIDFToolDownloadzT
    Structure to store all the relevant information about particular download.
    r�   r	  rÞ   rÚ   Úrename_distr4   Nc                 óL   — || _         || _        || _        || _        || _        d S r6   )r�   r	  rÞ   rÚ   rY  ©rA   r�   r	  rÞ   rÚ   rY  s         r    Ú__init__zIDFToolDownload.__init__Ý  s-   € Ø*ˆÔØˆŒØˆŒ	ØˆŒØ&ˆÔÐÐr   )r   r   r   rM   rO   r   r\  r   r   r    rX  rX  Ø  s^   € € € € € ðð ð' cð '°ð '¸3ð 'Èð 'ÐZ]ð 'Ðbfð 'ð 'ð 'ð 'ð 'ð 'r   rX  c                   óÞ   — e Zd ZdZdZdZdZeeegZdededdfd	„Z	d
d de
fd„Zd
ede
fd„Zddedededededdfd„Zdee         dee         fd„Zefdee         de
fd„Zdee         fd„ZdS )ÚIDFToolVersionzý
    Used for storing information about version; status (recommended, supported, deprecated)
    and easy way of comparing different versions. Also allows platform compatibility check
    and getting right download for given platform, if available.
    ÚrecommendedÚ	supportedÚ
deprecatedÚversionÚstatusr4   Nc                 óV   — || _         || _        t          ¦   «         | _        d| _        d S ©NF)rb  rc  r   Ú	downloadsÚlatest)rA   rb  rc  s      r    r\  zIDFToolVersion.__init__ó  s&   € ØˆŒØˆŒÝ<G¹M¼MˆŒØˆŒˆˆr   Úotherc                 óº   — | j         |j         k    r| j         |j         k    S | j         t          j        k    r|j         t          j        k    rJ ‚| j        |j        k     S r6   )rc  r^  ÚSTATUS_RECOMMENDEDrb  ©rA   rh  s     r    Ú__lt__zIDFToolVersion.__lt__ù  sW   € ØŒ;˜%œ,Ò&Ð&Ø”; ¤Ò-Ð-ð ”�~Ô@Ò@Ð@ÀUÄ\ÕUcÔUvÒEvÐEvÐEvÐEvà”< %¤-Ò/Ð/r   c                 óz   — t          |t          ¦  «        st          S | j        |j        k    o| j        |j        k    S r6   )rþ   r^  ÚNotImplementedrc  rb  rk  s     r    Ú__eq__zIDFToolVersion.__eq__  s7   € Ý˜%¥Ñ0Ô0ð 	"Ý!Ð!ØŒ{˜eœlÒ*ÐL¨t¬|¸u¼}Ò/LÐLr   r“   r�   r	  rÞ   rÚ   rY  c                 ó<   — t          |||||¦  «        | j        |<   dS )zQ
        Add download entry of type IDFToolDownload into self.downloads.
        N)rX  rf  r[  s         r    Úadd_downloadzIDFToolVersion.add_download  s(   € õ )8¸ÀsÈDÐRXÐZeÑ(fÔ(fˆŒ�}Ñ%Ð%Ð%r   c                 óþ   — 	 t                                |¦  «        }|| j                             ¦   «         v r| j        |         S n# t          $ r Y nw xY wd| j                             ¦   «         v r| j        d         S dS )zT
        Get download for given platform if usable download already exists.
        r‰   N)rm   r�   rf  Úkeysr‹   ©rA   r�   s     r    Úget_download_for_platformz(IDFToolVersion.get_download_for_platform  s�   € ð	Ý%ŸMšM¨-Ñ8Ô8ˆMØ ¤× 3Ò 3Ñ 5Ô 5Ð5Ð5Ø”~ mÔ4Ð4ð 6øõ ð 	ð 	ð 	ØˆDð	øøøà�D”N×'Ò'Ñ)Ô)Ð)Ð)Ø”> %Ô(Ð(Øˆts   ‚AA Á
AÁAc                 ó0   — |                       |¦  «        duS )zT
        Check whether this version is compatible with given platform name.
        N)ru  rt  s     r    Úcompatible_with_platformz'IDFToolVersion.compatible_with_platform  s   € ð ×-Ò-¨mÑ<Ô<ÀDÐHÐHr   c                 óN   — t          | j                             ¦   «         ¦  «        S )zW
        Get all platforms for which this version has a valid download record.
        )Úsetrf  rs  ©rA   s    r    Úget_supported_platformsz&IDFToolVersion.get_supported_platforms"  s    € õ �4”>×&Ò&Ñ(Ô(Ñ)Ô)Ð)r   ©r“   )r   r   r   rM   rj  ÚSTATUS_SUPPORTEDÚSTATUS_DEPRECATEDÚSTATUS_VALUESrO   r\  Úboolrl  Úobjectro  r   rq  r   rX  ru  ÚPYTHON_PLATFORMrw  r   r{  r   r   r    r^  r^  å  s‰  € € € € € ðð ð 'ÐØ"ÐØ$Ðà'Ð)9Ð;LÐM€Mð ð ¨Sð °Tð ð ð ð ð0Ð,ð 0°ð 0ð 0ð 0ð 0ðM˜Fð M tð Mð Mð Mð Mð
gð g¨#ð g°Cð g¸sð gÈCð gÐ^að gÐkoð gð gð gð gð°xÀ´}ð ÈÐRaÔIbð ð ð ð ð GVð Ið I°h¸s´mð IÐZ^ð Ið Ið Ið Ið*¨¨S¬ð *ð *ð *ð *ð *ð *r   r^  ÚIDFToolOptions)Úversion_cmdÚversion_regexÚversion_regex_replaceÚis_executableÚtool_info_fileÚexport_pathsÚexport_varsÚinstallÚinfo_urlÚlicenseÚstrip_container_dirsÚsupported_targetsc                   ó  — e Zd ZdZdZdZdZ	 	 	 	 d;d	ed
ededededee         dedee         de	e         de
dededdfd„Zdedd fd„Zd<d„Zd<d„Zdeddfd„Zdefd„Zdedefd„Zdedee         fd„Zdedeeef         fd „Zd!edefd"„Zd=d#e	ee                  d$e	e         defd%„Zdedefd&„Zdedefd'„Zd$e	e         defd(„Zdeegdf         fd)„Zdee         fd*„Zd+ee         defd,„Zdefd-„Z de!e         fd.„Z"de	e         fd/„Z#de	e         fd0„Z$d<d1„Z%de	e         fd2„Z&deddfd3„Z'deddfd4„Z(e)d5e*d6edefd7„¦   «         Z+e,d8eee-eee         eeef         f         f         dd fd9„¦   «         Z.d:„ Z/dS )>ÚIDFToolzª
    Used to store info about IDF tools from tools.json file in a Python-accesible form.
    The term "IDF tool" is used for e.g. CMake, ninja, QUEMU and toolchains.
    ÚalwaysÚ
on_requestÚneverNr   Tr“   rC   Údescriptionr‹  rŒ  Úlicr„  r…  r�  r†  rŽ  r‡  rˆ  r4   c                 ó8  — || _         || _        |                      ¦   «          d | _        g | _        |	€t
          }	t          |||	||g t          ¦   «         ||||
|¦  «        | _        g | _	        t          | _        |                      ¦   «          || _        || _        d S r6   )rC   r•  Údrop_versionsÚversion_in_pathÚversions_installedÚVERSION_REGEX_REPLACE_DEFAULTrƒ  r   ÚoptionsÚplatform_overridesr�   Ú	_platformÚ_update_current_optionsr‡  rˆ  )rA   rC   r•  r‹  rŒ  r–  r„  r…  r�  r†  rŽ  r‡  rˆ  s                r    r\  zIDFTool.__init__G  s³   € ð ˆŒ	Ø&ˆÔØ×ÒÑÔÐØ.2ˆÔØ-/ˆÔØ Ð(Ý$AÐ!Ý%ØØØ!ØØØÝ‰MŒMØØØØ Øñ
ô 
ˆŒð 9;ˆÔÝ)ˆŒØ×$Ò$Ñ&Ô&Ð&Ø*ˆÔØ,ˆÔÐÐr   rf   c                 ód   — t          j        | ¦  «        }||_        |                     ¦   «          |S )zg
        Copy the IDFTool record in respect to given platform (e.g. apply platform overrides).
        )rÎ   Údeepcopyrž  rŸ  )rA   rf   r¾   s      r    Úcopy_for_platformzIDFTool.copy_for_platformq  s2   € õ ”˜tÑ$Ô$ˆØ#ˆÔØ×&Ò&Ñ(Ô(Ð(Øˆr   c                 óÊ   — t          | j        Ž | _        | j        D ]G}| j        r| j        |d         vrŒ|                     ¦   «         }|d=  | j        j        di |¤Ž| _        ŒHdS )zc
        Update current options by platform overrides, if applicable for current platform.
        Ú	platformsNr   )rƒ  rœ  Ú_current_optionsr�  rž  rÎ   Ú_replace)rA   ÚoverrideÚoverride_dicts      r    rŸ  zIDFTool._update_current_optionsz  s‡   € õ !/°´Ð =ˆÔØÔ/ð 	Tð 	TˆHØŒ~ð  $¤.¸ÀÔ8MÐ"MÐ"MØØ$ŸMšM™OœOˆMØ˜kÐ*Ø$B DÔ$9Ô$BÐ$SÐ$SÀ]Ð$SÐ$SˆDÔ!Ð!ð	Tð 	Tr   c                 ó,   — t          ¦   «         | _        dS )z1
        Clear self.versions dictionary.
        N)r   Úversionsrz  s    r    r˜  zIDFTool.drop_versions†  s   € õ 4?±=´=ˆŒˆˆr   rb  c                 óT   — t          |¦  «        t          u sJ ‚|| j        |j        <   dS )z6
        Add new IDFVersion to self.versions.
        N)Útyper^  rª  rb  ©rA   rb  s     r    Úadd_versionzIDFTool.add_versionŒ  s/   € õ �G‰}Œ}¥Ð.Ð.Ð.Ð.Ø)0ˆŒ�g”oÑ&Ð&Ð&r   c                 ób   — t           j                             t          j        d| j        ¦  «        S )z;
        Returns path where the tool is installed.
        Útools)r¬   r­   r®   rU   r0   rC   rz  s    r    Úget_pathzIDFTool.get_path“  s!   € õ Œw�|Š|�AÔ,¨g°t´yÑAÔAÐAr   c                 ó|   — || j         v sJ ‚t          j                             |                      ¦   «         |¦  «        S )z=
        Returns path for the tool of given version.
        )rª  r¬   r­   r®   r±  r­  s     r    Úget_path_for_versionzIDFTool.get_path_for_version™  s5   € ð ˜$œ-Ð'Ð'Ð'Ð'ÝŒw�|Š|˜DŸMšM™OœO¨WÑ5Ô5Ð5r   c                 ó^   ‡— |                       |¦  «        Šˆfd„| j        j        D ¦   «         S )zC
        Returns a list of paths that need to be exported.
        c                 ó>   •— g | ]}t          j        j        ‰g|¢R Ž ‘ŒS r   ©r¬   r­   r®   )rÇ   r¿   Ú	tool_paths     €r    rÈ   z,IDFTool.get_export_paths.<locals>.<listcomp>¥  s-   ø€ ÐXÐXÐX°•””˜YÐ+¨Ð+Ð+Ð+ÐXÐXÐXr   )r³  r¥  r‰  )rA   rb  r·  s     @r    Úget_export_pathszIDFTool.get_export_paths   s8   ø€ ð ×-Ò-¨gÑ6Ô6ˆ	ØXÐXÐXÐX°TÔ5JÔ5WÐXÑXÔXÐXr   c                 óŠ  — i }| j         j                             ¦   «         D ]¡\  }}|                      |¦  «                             dd¦  «        }t          j        t          ||¦  «        }||k    rt          |g¦  «        d         }t          j
                             |¦  «        }t          j        dk    s|�||k    r|||<   Œ¢|S )z¿
        Get the dictionary of environment variables to be exported, for the given version.
        Expands:
        - ${TOOL_PATH} => the actual path where the version is installed.
        ú\ú\\r   re   )r¥  rŠ  r(  r³  rÆ   r  ÚsubÚSUBST_TOOL_PATH_REGEXrÊ   r¬   rÍ   r�   rV   rf   )rA   rb  r¾   ÚkÚvÚreplace_pathÚv_replÚold_vs           r    Úget_export_varszIDFTool.get_export_vars§  s½   € ð ˆØÔ)Ô5×;Ò;Ñ=Ô=ð 	#ð 	#‰DˆAˆqØ×4Ò4°WÑ=Ô=×EÒEÀdÈFÑSÔSˆLÝ”VÕ1°<ÀÑCÔCˆFØ˜Š{ˆ{Ý0°&°Ñ:Ô:¸1Ô=�Ý”J—N’N 1Ñ%Ô%ˆEåŒ|˜wÒ&Ð&¨%¨-¸5ÀFº?¸?Ø"��q‘	øØˆr   Úver_strc                 óÌ   — t          j        | j        j        |¦  «        }|st          S t          j        | j        j        | j        j        |                     d¦  «        ¦  «        S )z£
        Extract the version string from the provided input and return it as a result.
        Returns 'unknown' if  version string can not be extracted..
        r   )r  Úsearchr¥  r…  ÚUNKNOWN_VERSIONr¼  r†  Úgroup)rA   rÄ  r  s      r    Úparse_tool_versionzIDFTool.parse_tool_version¹  sY   € õ
 ”	˜$Ô/Ô=¸wÑGÔGˆØð 	#Ý"Ð"ÝŒv�dÔ+Ô9¸4Ô;PÔ;fÐhm×hsÒhsÐtuÑhvÔhvÑwÔwÐwr   r¦   Úexecutable_pathc           
      óæ  — | j         t          k    sJ ‚| j        j        }|r||d<   |d         st	          d| j        › d�¦  «        ‚	 t          |d|¦  «        }nr# t          $ r}t	          d| j        › d|› �¦  «        ‚d}~wt          j	        $ r9}t          d|j        › d|j                             dd	¬
¦  «        › �¦  «        ‚d}~ww xY w|                      |                     d¦  «        ¦  «        S )aš  
        Execute the tool, optionally prepending extra_paths to PATH,
        extract the version string and return it as a result.
        Raises ToolNotFoundError if the tool is not found (not present in the paths).
        Raises ToolExecError if the tool returns with a non-zero exit code.
        Returns 'unknown' if tool returns something from which version string
        can not be extracted.
        r   úTool z
 not foundNz not found with error: znon-zero exit code (z) with message: úutf-8Úignore)Úerrors)rž  r�   r¥  r„  rP  rC   rÀ   rë   r±   r¸   rT  r·   rW   ÚdecoderÉ  )rA   r¦   rÊ  r¤   Úversion_cmd_resultr¡   s         r    Úget_versionzIDFTool.get_versionÃ  s5  € ð Œ~Õ!1Ò1Ð1Ð1Ð1ØÔ#Ô/ˆØð 	%Ø$ˆC�‰Fà�1Œvð 	Cõ $Ð$A¨D¬IÐ$AÐ$AÐ$AÑBÔBÐBð	Ý!5°c¸4ÀÑ!MÔ!MÐÐøÝð 	Sð 	Sð 	Så#Ð$Q¨D¬IÐ$QÐ$QÈaÐ$QÐ$QÑRÔRÐRøøøøÝÔ,ð 	ð 	ð 	ÝØp q¤|ÐpÐpÀQÄXÇ_Â_ÐU\ÐemÀ_ÑEnÔEnÐpÐpñô ð øøøøð	øøøð
 ×&Ò&Ð'9×'@Ò'@ÀÑ'IÔ'IÑJÔJÐJs$   ÁA Á
CÁ#A=Á=CÂ4CÃCc                 ó¤  — | j         t          k    sJ ‚t          j        j        | j                             d¦  «        Ž }t          j                             |                      |¦  «        |¦  «        }t          j                             |¦  «        st          d| j
        › d�¦  «        ‚t          |dd¬¦  «        5 }	 t          j        |¦  «        }n2# t          j        t          f$ r t          d| j
        › d�¦  «        ‚w xY w	 ddd¦  «         n# 1 swxY w Y   d	|vrt          d| j
        › d
�¦  «        ‚|                      |d	         ¦  «        S )z�
        Extract the version string from tool info file and return it as a result.
        Returns 'unknown' if version string can not be extracted.
        rÄ   rÌ  z not found: No info file.ÚrrÍ  ©Úencodingz not found: Bad info file.Nrb  z$ not found: No version in info file.)rž  r�   r¬   r­   r®   rˆ  Úsplitr³  r¯   rP  rC   r~   ÚjsonÚloadÚJSONDecodeErrorÚUnicodeDecodeErrorrÉ  )rA   rb  Úinfo_file_pathr]   Ú	tool_infos        r    Úget_version_from_filezIDFTool.get_version_from_fileä  s¤  € ð Œ~Õ!1Ò1Ð1Ð1Ð1åœœ tÔ':×'@Ò'@ÀÑ'EÔ'EÐFˆÝœŸš d×&?Ò&?ÀÑ&HÔ&HÈ.ÑYÔYˆÝŒw�~Š~˜nÑ-Ô-ð 	RÝ#Ð$P¨D¬IÐ$PÐ$PÐ$PÑQÔQÐQÝ�. #°Ð8Ñ8Ô8ð 	W¸AðWÝ œI a™LœL�	�	øÝÔ(Õ*<Ð=ð Wð Wð WÝ'Ð(U°´	Ð(UÐ(UÐ(UÑVÔVÐVðWøøøð ð	Wð 	Wð 	Wñ 	Wô 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wøøøð 	Wð 	Wð 	Wð 	Wð ˜IÐ%Ð%Ý#Ð$[¨D¬IÐ$[Ð$[Ð$[Ñ\Ô\Ð\à×&Ò& y°Ô';Ñ<Ô<Ð<s*   Â:DÂ<CÃDÃ/D Ä DÄDÄDc           	      ód  — | j         sdS 	 | j        r|                      |¦  «        }n(|                      |                      |¦  «        ¦  «        }n<# t
          t          f$ r(}t          d| j        › d|› d|› �¦  «         Y d }~dS d }~ww xY w||k    rt          d| j        › d|› d|› �¦  «         dS )NTútool ú	 version z" is installed, but getting error: Fz% is installed, but reporting version )
r‡  rˆ  rÞ  rÒ  r¸  rP  rT  rZ   rC   r\   )rA   rb  rÄ  r¡   s       r    Úcheck_binary_validzIDFTool.check_binary_validû  sñ   € ØÔ!ð 	Ø�4ð	ØÔ"ð KØ×4Ò4°WÑ=Ô=��à×*Ò*¨4×+@Ò+@ÀÑ+IÔ+IÑJÔJ�øøÝ!¥=Ð1ð 	ð 	ð 	ÝÐ\˜$œ)Ð\Ð\¨gÐ\Ð\ÐYZÐ\Ð\Ñ]Ô]Ð]Ø�5�5�5�5�5øøøøð	øøøð �gÒÐåÐd˜œÐdÐd¨WÐdÐdÐ[bÐdÐdÑeÔeÐeØˆts   ‹AA ÁB
Á"BÂB
c                 ó@   — |                       |¬¦  «        }|| j        v S )z]
        Check if tool's version from executable path is in self.version dictionary.
        )rÊ  )rÒ  rª  )rA   rÊ  rb  s      r    Úcheck_versionzIDFTool.check_version  s'   € ð ×"Ò"°?Ð"ÑCÔCˆØ˜$œ-Ð'Ð'r   c                 ó   — | j         j        S )zV
        Returns whether the tools are installed always, on request or never.
        )r¥  r‹  rz  s    r    Úget_install_typezIDFTool.get_install_type  s   € ð Ô$Ô,Ð,r   c                 ó   — | j         j        S )zI
        Returns list of supported targets with current options.
        )r¥  r�  rz  s    r    Úget_supported_targetszIDFTool.get_supported_targets  s   € ð Ô$Ô6Ð6r   Útargetsc                 óp   ‡— |                       ¦   «         }t          ˆfd„|D ¦   «         ¦  «        p|dgk    S )z`
        Checks whether the tool is suitable for at least one of the specified targets.
        c              3   ó    •K  — | ]}|‰v V — Œ	d S r6   r   ©rÇ   Úitemré  s     €r    ú	<genexpr>z:IDFTool.is_supported_for_any_of_targets.<locals>.<genexpr>#  s'   øè è € ÐAÐA t�4˜7�?ÐAÐAÐAÐAÐAÐAr   Úall)rè  r‰   )rA   ré  r�  s    ` r    Úis_supported_for_any_of_targetsz'IDFTool.is_supported_for_any_of_targets  sJ   ø€ ð !×6Ò6Ñ8Ô8ÐÝÐAÐAÐAÐAÐ/@ÐAÑAÔAÑAÔAÐaÐEVÐ[`ÐZaÒEaÐar   c                 ób   — t          d„ | j                             ¦   «         D ¦   «         ¦  «        S )zZ
        Checks whether this tool (any version) is compatible  with the platform.
        c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   ©rw  )rÇ   r¿  s     r    rÈ   z4IDFTool.compatible_with_platform.<locals>.<listcomp>)  s$   € ÐQÐQÐQ°Q�A×.Ò.Ñ0Ô0ÐQÐQÐQr   )r‰   rª  Úvaluesrz  s    r    rw  z IDFTool.compatible_with_platform%  s/   € õ ÐQÐQ¸$¼-×:NÒ:NÑ:PÔ:PÐQÑQÔQÑRÔRÐRr   c                 ó¨   — t          ¦   «         }| j                             ¦   «         D ])}|                     |                     ¦   «         ¦  «         Œ*|S )za
        Return set of platforms that are supported by at least one version of the tool.
        )ry  rª  rô  rÜ   r{  )rA   r¾   r¿  s      r    r{  zIDFTool.get_supported_platforms+  sP   € õ ‘”ˆØ”×%Ò%Ñ'Ô'ð 	7ð 	7ˆAØ�MŠM˜!×3Ò3Ñ5Ô5Ñ6Ô6Ð6Ð6Øˆr   c                 ó�   ‡ — ˆ fd„‰ j                              ¦   «         D ¦   «         }t          |¦  «        dk    sJ ‚|r|d         S dS )zz
        Get all recommended versions of the tool. If more versions are recommended, highest version is returned.
        c                 óx   •— g | ]6\  }}|j         t          j        k    ¯|                     ‰j        ¦  «        ¯4|‘Œ7S r   )rc  r^  rj  rw  rž  )rÇ   r¾  r¿  rA   s      €r    rÈ   z3IDFTool.get_recommended_version.<locals>.<listcomp>8  sN   ø€ ð  
ð  
ð  
á��1ØŒx�>Ô<Ò<Ð<À×A[ÒA[Ð\`Ô\jÑAkÔAkÐ<ð à<Ð<Ð<r   r	   r   N)rª  r(  r”   )rA   Úrecommended_versionss   ` r    Úget_recommended_versionzIDFTool.get_recommended_version4  sn   ø€ ð 
ð  
ð  
ð  
àœ×+Ò+Ñ-Ô-ð 
ñ  
ô  
Ðõ
 Ð'Ñ(Ô(¨AÒ-Ð-Ð-Ð-Øð 	+Ø'¨Ô*Ð*Øˆtr   c           	      ó®  ‡ — 	 ‰                       ¦   «          n# t          $ r Y nw xY w‰                      ¦   «         ‰ j        v r‰                      ¦   «         S ˆ fd„‰ j        D ¦   «         }t	          |ˆ fd„d¬¦  «        }|rTt          d                     d|d         › d‰ j        › d	�d
‰                      ¦   «         › d�g¦  «        ¦  «         |d         S dS )z»
        Get the preferred installed version of the tool.
        If more versions installed, return recommended version if exists, otherwise return the highest supported version
        c                 óž   •— g | ]I}‰j         |         j        t          j        k    ¯"‰j         |                              ‰j        ¦  «        ¯G|‘ŒJS r   )rª  rc  r^  r}  rw  rž  )rÇ   r¾  rA   s     €r    rÈ   z;IDFTool.get_preferred_installed_version.<locals>.<listcomp>P  s[   ø€ ð (
ð (
ð (
àØŒ}˜QÔÔ&­.Ô*IÒIÐIØ”˜aÔ ×9Ò9¸$¼.ÑIÔIð Jð àIÐIÐIr   c                 ó   •— ‰j         |          S r6   )rª  )ÚxrA   s    €r    rØ   z9IDFTool.get_preferred_installed_version.<locals>.<lambda>W  s   ø€ ¸¼ÀaÔ8H€ r   T©ÚkeyÚreverser“   zUsing supported version r   ú
 for tool ú zas recommended version z is not installed.N)Úfind_installed_versionsrV  rù  rš  Úsortedr\   r®   rC   )rA   Úsupported_installed_versionsÚ#sorted_supported_installed_versionss   `  r    Úget_preferred_installed_versionz'IDFTool.get_preferred_installed_versionB  s?  ø€ ð	Ø×(Ò(Ñ*Ô*Ð*Ð*øÝð 	ð 	ð 	ØˆDð	øøøð ×'Ò'Ñ)Ô)¨TÔ-DÐDÐDØ×/Ò/Ñ1Ô1Ð1ð(
ð (
ð (
ð (
àÔ,ð(
ñ (
ô (
Ð$õ /5Ø(Ð.HÐ.HÐ.HÐ.HÐRVð/
ñ /
ô /
Ð+ð /ð 		:ÝØ—’àqÐ3VÐWXÔ3YÐqÐqÐeiÔenÐqÐqÐqØd°$×2NÒ2NÑ2PÔ2PÐdÐdÐdðñô ñô ð ð 7°qÔ9Ð9Øˆts   ƒ ˜
%¤%c           
      óþ  — | j         t          k    sJ ‚d}| j        s[	 |                      ¦   «         }|| _        n># t
          $ r Y n2t          $ r&}t          d| j        › d|› �¦  «         d}Y d}~nd}~ww xY wg | _	        | j
                             ¦   «         D �][\  }}|                     ¦   «         sŒ|                      |¦  «        }t          j                             |¦  «        sŒP| j        s| j	                             |¦  «         Œr	 | j        r|                      |¦  «        }n(|                      |                      |¦  «        ¦  «        }||k    rt+          d| j        › d|› d|› �¦  «         | j	                             |¦  «         Œö# t
          $ r(}t+          d| j        › d|› d	|› �¦  «         Y d}~�Œ#d}~wt          $ r*}t          d| j        › d|› d
|› �¦  «         d}Y d}~�ŒUd}~ww xY w|rt,          ‚dS )a  
        Checks whether the tool can be found in PATH and in GlobalVarsStore.idf_tools_path.
        Writes results to self.version_in_path and self.versions_installed.

        Raises ToolBinaryError if an error occurred when running any version of the tool.
        Frà  z# is found in PATH, but has failed: TNrá  z( is installed, but has reported version zdirectory for tool z. is present, but the tool has not been found: z" is installed, but cannot be run: )rž  r�   rˆ  rÒ  r™  rP  rT  rZ   rC   rš  rª  r(  rw  r³  r¬   r­   r¯   r‡  r«   rÞ  r¸  r\   rV  )rA   Ú
tool_errorrÄ  r¡   rb  Úversion_objr·  s          r    r  zIDFTool.find_installed_versionse  s´  € ð Œ~Õ!1Ò1Ð1Ð1Ð1Øˆ
ØÔ"ð 	/ð	/Ø×*Ò*Ñ,Ô,�ð (/�Ô$Ð$øõ %ð ð ð à�Ý ð "ð "ð "ÝÐO˜dœiÐOÐOÈAÐOÐOÑPÔPÐPØ!�
�
�
�
�
�
øøøøð"øøøð #%ˆÔØ$(¤M×$7Ò$7Ñ$9Ô$9ð 	8ñ 	8Ñ ˆG�[Ø×7Ò7Ñ9Ô9ð ØØ×1Ò1°'Ñ:Ô:ˆIÝ”7—>’> )Ñ,Ô,ð àØÔ%ð ØÔ'×.Ò.¨wÑ7Ô7Ð7Øð8ØÔ&ð OØ"×8Ò8¸ÑAÔA�G�Gà"×.Ò.¨t×/DÒ/DÀWÑ/MÔ/MÑNÔN�Gð ˜gÒ%Ð%ÝÐo ¤ÐoÐo°WÐoÐoÐfmÐoÐoÑpÔpÐpØÔ'×.Ò.¨wÑ7Ô7Ð7Ð7øõ %ð ð ð ÝØx¨$¬)ÐxÐx¸gÐxÐxÐuvÐxÐxñô ð ð ð ð ð ñ øøøøõ !ð "ð "ð "ÝÐ`˜dœiÐ`Ð`°'Ð`Ð`Ð]^Ð`Ð`ÑaÔaÐaØ!�
�
�
�
�
‘
øøøøð"øøøð ð 	"Ý!Ð!ð	"ð 	"s@   �9 ¹
A4Á	A4ÁA/Á/A4Ä
AFÆ
G1ÆF:Æ:G1ÇG,Ç,G1c                 ó¼  ‡‡— |                       ¦   «         Št          j                             ‰¦  «        sdS t          j        ‰¦  «        }ˆfd„|D ¦   «         }t          |d¬¦  «        D ]pŠˆˆfd„| j        j        D ¦   «         }	 | j        r|  	                    ‰¦  «        }n|  
                    |¦  «        }n# t          t          f$ r Y Œbw xY w|‰k    rŒm‰c S dS )zt
        Get the latest installed tool version by directly checking the
        tool's version directories.
        Nc                 óŽ   •— g | ]A}t           j                             t           j                             ‰|¦  «        ¦  «        ¯?|‘ŒBS r   )r¬   r­   rî   r®   )rÇ   Údr·  s     €r    rÈ   z4IDFTool.latest_installed_version.<locals>.<listcomp>¤  s<   ø€ ÐQÐQÐQ�a¥r¤w§}¢}µR´W·\²\À)ÈQÑ5OÔ5OÑ'PÔ'PÐQ�ÐQÐQÐQr   T)r   c                 ó@   •— g | ]}t          j        j        ‰‰g|¢R Ž ‘ŒS r   r¶  )rÇ   r¿   r·  rb  s     €€r    rÈ   z4IDFTool.latest_installed_version.<locals>.<listcomp>©  s/   ø€ ÐfÐfÐf¸a•R”W”\ )¨WÐ9°qÐ9Ð9Ð9ÐfÐfÐfr   )r±  r¬   r­   r¯   rF  r  r¥  r‰  rˆ  rÞ  rÒ  rP  rT  )rA   ÚdentriesÚdirsÚpathsrÄ  r·  rb  s        @@r    Úlatest_installed_versionz IDFTool.latest_installed_version›  s  øø€ ð
 —M’M‘O”Oˆ	ÝŒw�~Š~˜iÑ(Ô(ð 	Ø�4Ý”:˜iÑ(Ô(ˆØQÐQÐQÐQ˜8ÐQÑQÔQˆÝ˜d¨DÐ1Ñ1Ô1ð 	ð 	ˆGð gÐfÐfÐfÐfÀ4ÔCXÔCeÐfÑfÔfˆEðØÔ&ð 6Ø"×8Ò8¸ÑAÔA�G�Gà"×.Ò.¨uÑ5Ô5�GøøÝ%¥}Ð5ð ð ð Ø�ðøøøà˜'Ò!Ð!ØØˆNˆNˆNàˆts   Â2B:Â:CÃCc                 ót  — || j         v sJ ‚| j         |                              | j        ¦  «        }|s/t          d| j        › d| j        › d�¦  «         t          d¦  «        ‚|j        }|j        r|j        nt          j	         
                    |¦  «        }t          j	                             t          j        d|¦  «        }t          t          j	                             |¦  «        ¦  «         t          j	                             |¦  «        rS|                      ||¦  «        s(t%          d|› d�¦  «         t          j        |¦  «         nt)          d|› d	�¦  «         d
S d}|› d�}t+          t,          ¦  «        D ]�}t/          ||¦  «        }	t          j	                             |¦  «        r|                      ||¦  «        s(t%          d|	› �¦  «         t%          d|› d|› �¦  «         Œot1          ||¦  «         d} |s:t          d¦  «         t3          t5          |	¦  «        ¦  «         t          d¦  «        ‚d
S )zT
        Download archive of the tool for platform given by self._platform.
        zNo packages for tool z
 platform ú!r	   Údistzremoving downloaded file z and downloading againzfile z is already downloadedNFrA  úDownload failure: úFailed to download ró   Tú/Failed to download, and retry count has expired)rª  ru  rž  rZ   rC   r    r	  rY  r¬   r­   Úbasenamer®   rU   r0   rð   ÚdirnameÚisfileÚcheck_download_filer\   Úunlinkr`   r7  ÚDOWNLOAD_RETRY_COUNTr0  r>  rh   rO   )
rA   rb  Údownload_objr	  Úarchive_nameÚ
local_pathÚ
downloadedÚlocal_temp_pathr<  ra   s
             r    r0  zIDFTool.download·  sH  € ð ˜$œ-Ð'Ð'Ð'Ð'Ø”} WÔ-×GÒGÈÌÑWÔWˆØð 	 ÝÐP¨$¬)ÐPÐP¸t¼~ÐPÐPÐPÑQÔQÐQÝ˜Q‘-”-ÐàÔˆØ3?Ô3KÐf�|Ô/Ð/ÕQSÔQX×QaÒQaÐbeÑQfÔQfˆÝ”W—\’\¥!Ô"2°F¸LÑIÔIˆ
Ý•”—’ 
Ñ+Ô+Ñ,Ô,Ð,åŒ7�>Š>˜*Ñ%Ô%ð 	Ø×+Ò+¨L¸*ÑEÔEð ÝÐU°ÐUÐUÐUÑVÔVÐVÝ”	˜*Ñ%Ô%Ð%Ð%åÐA˜\ÐAÐAÐAÑBÔBÐBØ�àˆ
Ø'Ð-Ð-Ð-ˆÝÕ/Ñ0Ô0ð 	ð 	ˆEÝ˜3 Ñ0Ô0ˆCÝ”7—>’> /Ñ2Ô2ð ¸$×:RÒ:RÐS_ÐapÑ:qÔ:qð ÝÐ/¨#Ð/Ð/Ñ0Ô0Ð0ÝÐE¨3ÐEÐE°OÐEÐEÑFÔFÐFØÝ˜o¨zÑ:Ô:Ð:ØˆJØØð 	 ÝÐCÑDÔDÐDÝ)­#¨c©(¬(Ñ3Ô3Ð3Ý˜Q‘-”-Ðð	 ð 	 r   c                 ó6  — || j         v sJ ‚| j         |                              | j        ¦  «        }|€J ‚|j        r|j        n#t          j                             |j        ¦  «        }t          j                             t          j
        d|¦  «        }t          j                             |¦  «        sJ ‚|                      |¦  «        }t          j                             |¦  «        r#t          d¦  «         t          j        |¦  «         t#          |¦  «         t%          ||¦  «         | j        j        rt+          || j        j        ¦  «         |                      |¦  «        s5t/          d|› �¦  «         t          j        |¦  «         t1          d¦  «        ‚dS )z­
        Unpack archive to destination directory and remove given number of top-level folder if specified.
        Should always be called after IDFTool.download().
        Nr  z)destination path already exists, removingz=Failed to check the tool while installed. Removing directory r	   )rª  ru  rž  rY  r¬   r­   r  r	  r®   rU   r0   r  r³  r¯   r\   rC  rD  rð   r  r¥  rŽ  rN  râ  rZ   r    )rA   rb  r  r   Úarchive_pathÚdest_dirs         r    r‹  zIDFTool.installÞ  s}  € ð ˜$œ-Ð'Ð'Ð'Ð'Ø”} WÔ-×GÒGÈÌÑWÔWˆØÐ'Ð'Ð'Ø3?Ô3KÐs�|Ô/Ð/ÕQSÔQX×QaÒQaÐbnÔbrÑQsÔQsˆÝ”w—|’|¥AÔ$4°f¸lÑKÔKˆÝŒw�~Š~˜lÑ+Ô+Ð+Ð+Ð+Ø×,Ò,¨WÑ5Ô5ˆÝŒ7�>Š>˜(Ñ#Ô#ð 	$ÝÐ<Ñ=Ô=Ð=ÝŒM˜(Ñ#Ô#Ð#Ý�ÑÔÐÝˆ|˜XÑ&Ô&Ð&ØÔ Ô5ð 	ZÝ# H¨dÔ.CÔ.XÑYÔYÐYØ×&Ò& wÑ/Ô/ð 	 ÝÐ\ÐRZÐ\Ð\Ñ]Ô]Ð]ÝŒM˜(Ñ#Ô#Ð#Ý˜Q‘-”-Ðð	 ð 	 r   r  r!  c                 óÆ   — | j         }| j        }t          |¦  «        \  }}||k    rt          d|› d|› d|› �¦  «         dS ||k    rt          d|› d|› d|› �¦  «         dS dS )zX
        Compare the computed sha256 to sha256 specified by downloaded archive.
        zfile size mismatch for z, expected z, got Fzhash mismatch for T)rÚ   rÞ   rà   r\   )r  r!  Úexpected_sha256Úexpected_sizeÚ	file_sizeÚfile_sha256s         r    r  zIDFTool.check_download_fileø  s›   € ð
 'Ô-ˆØ$Ô)ˆÝ!5°jÑ!AÔ!AÑˆ	�;Ø˜Ò%Ð%ÝÐb¨:ÐbÐbÀ-ÐbÐbÐW`ÐbÐbÑcÔcÐcØ�5Ø˜/Ò)Ð)ÝÐa jÐaÐa¸_ÐaÐaÐT_ÐaÐaÑbÔbÐbØ�5Øˆtr   Ú	tool_dictc                 óØ  — |                      d¦  «        }t          |t          ¦  «        st          d¦  «        ‚|                      d¦  «        }t          |t          ¦  «        st          d¦  «        ‚|                      dd¦  «        }t          |t          ¦  «        st          d|› d�¦  «        ‚|                      d	d
¦  «        }t          |t          ¦  «        st          d|› d�¦  «        ‚|                      d¦  «        }t          |¦  «        t          urt          d|› d�¦  «        ‚|                      d¦  «        }t          |t          ¦  «        r|s|rt          d|› d�¦  «        ‚|                      d¦  «        }|r(t          |t          ¦  «        st          d|› d�¦  «        ‚|                      d¦  «        }	t          |	¦  «        t          urt          d|› d�¦  «        ‚|                      di ¦  «        }
t          |
¦  «        t          urt          d|› d�¦  «        ‚|                      d¦  «        }t          |¦  «        t          urt          d|› d�¦  «        ‚|                      dd¦  «        }t          |t          ¦  «        st          d |› d�¦  «        ‚|                      d!d¦  «        }t          |t          ¦  «        st          d"|› d�¦  «        ‚|                      d#d¦  «        }t          |t          ¦  «        st          d$|› d�¦  «        ‚|                      d%d&¦  «        }|r)t          |¦  «        t          urt          d'|› d(�¦  «        ‚|                      d)g ¦  «        }t          |¦  «        t          urt          d*|› d�¦  «        ‚|                      d+¦  «        }t          |t          ¦  «        st          d,|› d�¦  «        ‚ | ||||||||||||¦  «        }|	D ]!}|j	        j
                             |¦  «         Œ"|
                     ¦   «         D ]\  }}||j	        j        |<   Œt          |¦  «        D �]ä\  }}|                      d-¦  «        }t          |¦  «        t          urt          d.||fz  ¦  «        ‚|                      d¦  «        }|�)t          |t          ¦  «        st          d0||fz  ¦  «        ‚|                      d¦  «        }|�*t          |¦  «        t          urt          d1||fz  ¦  «        ‚|                      d¦  «        }|�+t          |t          ¦  «        r|st          d2||fz  ¦  «        ‚|                      d¦  «        }|�)t          |t          ¦  «        st          d3||fz  ¦  «        ‚|                      d¦  «        }	|	�*t          |	¦  «        t          urt          d4||fz  ¦  «        ‚|                      d¦  «        }
|
�*t          |
¦  «        t          urt          d5||fz  ¦  «        ‚|j                             |¦  «         �Œæi }|D �]�}|                      d¦  «        }t          |t          ¦  «        st          d6|› d�¦  «        ‚|                      d7¦  «        }t          |t          ¦  «        s*|t           j        vrt          d8||t           j        ¦  «        ‚t!          ||¦  «        }|                     ¦   «         D ]¿\  }}|d9v rŒ
	 t$                                |¦  «         n&# t&          $ r t          d:|›d;|›d<|›�¦  «        ‚w xY w|                     ||d=         |d>         |d?         |                      d@d
¦  «        ¦  «         |t           j        k    r$||vrg ||<   ||                              |¦  «         ŒÀ|                     |¦  «         �Œ�|                     ¦   «         D ]w\  }} t/          | ¦  «        dAk    r&t          dB|› dC|› dDt/          |¦  «        › dE�¦  «        ‚|t0          j        k    r)t/          |¦  «        d&k    rt          dF|› dC|› dG�¦  «        ‚Œx|                     ¦   «          |S )HzC
        Create IDFTool class instance form its JSON dump.
        rC   ztool_name is not a stringr•  zdescription is not a stringr‡  Tzis_executable for tool z is not a boolrˆ  r“   ztool_info_file for tool z is not a stringr„  zversion_cmd for tool z is not a list of stringsr…  zversion_regex for tool z is not a non-empty stringr†  zversion_regex_replace for tool r‰  zexport_paths for tool z is not a listrŠ  zexport_vars for tool z is not a mappingrª  zversions for tool z is not an arrayr‹  Fzinstall for tool rŒ  zinfo_url for tool r�  zlicense for tool rŽ  r   zstrip_container_dirs for tool z is not an intr�  zplatform_overrides for tool r�  zsupported_targets for tool r¤  z2platforms for override %d of tool %s is not a listNz2install for override %d of tool %s is not a stringz?version_cmd for override %d of tool %s is not a list of stringszBversion_regex for override %d of tool %s is not a non-empty stringz@version_regex_replace for override %d of tool %s is not a stringz5export_paths for override %d of tool %s is not a listz7export_vars for override %d of tool %s is not a mappingzversion name for tool rc  z*tool {} version {} status is not one of {}©rC   rc  zinvalid platform r  rá  r	  rÞ   rÚ   rY  r	   rà  z for platform z has z recommended versionszrequired/optional tool z has no recommended versions)r�   rþ   rO   rG  r€  r¬  ÚlistÚdictr   rœ  r‰  r«   r(  rŠ  Ú	enumerater�  r^  r  rm   r‹   rq  rj  r®  r”   r‘  ÚINSTALL_NEVERrŸ  )!r:   r,  Ú	tool_namer•  r‡  rˆ  r„  r…  r†  r‰  rŠ  rª  r‹  rŒ  r–  rŽ  Úoverrides_listr�  Útool_objr­   rC   rH   Úindexr§  Úplatforms_listrø  Úversion_dictrb  Úversion_statusr
  Úplatform_idÚplatform_dictÚversion_lists!                                    r    Ú	from_jsonzIDFTool.from_json  s~	  € ð —M’M &Ñ)Ô)ˆ	Ý˜)¥SÑ)Ô)ð 	<ÝÐ:Ñ;Ô;Ð;à—m’m MÑ2Ô2ˆÝ˜+¥sÑ+Ô+ð 	>ÝÐ<Ñ=Ô=Ð=à!Ÿš o°tÑ<Ô<ˆÝ˜-­Ñ.Ô.ð 	TÝÐR¸ÐRÐRÐRÑSÔSÐSà"ŸšÐ'7¸Ñ<Ô<ˆÝ˜.­#Ñ.Ô.ð 	WÝÐU¸)ÐUÐUÐUÑVÔVÐVà—m’m MÑ2Ô2ˆÝ�ÑÔ¥DÐ(Ð(ÝÐ[°yÐ[Ð[Ð[Ñ\Ô\Ð\à!Ÿš oÑ6Ô6ˆÝ˜-­Ñ-Ô-ð 	`°mð 	`Èð 	`ÝÐ^¸Ð^Ð^Ð^Ñ_Ô_Ð_à )§¢Ð.EÑ FÔ FÐØ ð 	^­Ð4IÍ3Ñ)OÔ)Oð 	^ÝÐ\ÀÐ\Ð\Ð\Ñ]Ô]Ð]à —}’} ^Ñ4Ô4ˆÝ�ÑÔ¥TÐ)Ð)ÝÐQ¸	ÐQÐQÐQÑRÔRÐRà—m’m M°2Ñ6Ô6ˆÝ�ÑÔ¥DÐ(Ð(ÝÐS°yÐSÐSÐSÑTÔTÐTà—=’= Ñ,Ô,ˆÝ�‰>Œ>¥Ð%Ð%ÝÐO°IÐOÐOÐOÑPÔPÐPà—-’- 	¨5Ñ1Ô1ˆÝ˜'¥3Ñ'Ô'ð 	PÝÐN°9ÐNÐNÐNÑOÔOÐOà—=’= ¨UÑ3Ô3ˆÝ˜(¥CÑ(Ô(ð 	QÝÐO°IÐOÐOÐOÑPÔPÐPà�mŠm˜I uÑ-Ô-ˆÝ˜#�sÑ#Ô#ð 	PÝÐN°9ÐNÐNÐNÑOÔOÐOà(Ÿ}š}Ð-CÀQÑGÔGÐØð 	[¥DÐ)=Ñ$>Ô$>ÅcÐ$IÐ$IÝÐYÀ	ÐYÐYÐYÑZÔZÐZà"ŸšÐ';¸RÑ@Ô@ˆÝ�ÑÔ¥tÐ+Ð+ÝÐW¸iÐWÐWÐWÑXÔXÐXà%ŸMšMÐ*=Ñ>Ô>ÐÝÐ+­TÑ2Ô2ð 	cÝÐa¸YÐaÐaÐaÑbÔbÐbð "˜cØØØØØØØØØ!Ø ØØñ
ô 
ˆð !ð 	7ð 	7ˆDØÔÔ)×0Ò0°Ñ6Ô6Ð6Ð6à&×,Ò,Ñ.Ô.ð 	7ð 	7‰KˆD�%Ø16ˆHÔÔ(¨Ñ.Ð.å(¨Ñ8Ô8ð "	9ñ "	9‰OˆE�8Ø%Ÿ\š\¨+Ñ6Ô6ˆNÝ�NÑ#Ô#­4Ð/Ð/Ý"Ð#WÐ[`ÐbkÐZlÑ#lÑmÔmÐmà—l’l 9Ñ-Ô-ˆGØÐ"­:°g½sÑ+CÔ+CÐ"Ý"Ð#WÐ[`ÐbkÐZlÑ#lÑmÔmÐmà"Ÿ,š, }Ñ5Ô5ˆKØÐ&­4°Ñ+<Ô+<ÅDÐ+HÐ+HÝ"ØUÐY^Ð`iÐXjÑjñô ð ð %ŸLšL¨Ñ9Ô9ˆMØÐ(µ*¸]ÍCÑ2PÔ2PÐ(ÐXeÐ(Ý"ØXÐ\aÐclÐ[mÑmñô ð ð %-§L¢LÐ1HÑ$IÔ$IÐ!Ø$Ð0½ÐDYÕ[^Ñ9_Ô9_Ð0Ý"ØVÐZ_ÐajÐYkÑkñô ð ð $Ÿ<š<¨Ñ7Ô7ˆLØÐ'­D°Ñ,>Ô,>ÅdÐ,JÐ,JÝ"Ð#ZÐ^cÐenÐ]oÑ#oÑpÔpÐpà"Ÿ,š, }Ñ5Ô5ˆKØÐ&­4°Ñ+<Ô+<ÅDÐ+HÐ+HÝ"Ð#\Ð`eÐgpÐ_qÑ#qÑrÔrÐrØÔ'×.Ò.¨xÑ8Ô8Ð8Ñ8à57ÐØ$ð !	.ñ !	.ˆLØ"×&Ò& vÑ.Ô.ˆGÝ˜g¥sÑ+Ô+ð YÝ"Ð#W¸IÐ#WÐ#WÐ#WÑXÔXÐXà)×-Ò-¨hÑ7Ô7ˆNÝ˜n­cÑ2Ô2ð °~Í^ÔMiÐ7iÐ7iÝ"Ø@À)ÈWÕVdÔVrñô ð õ )¨°.ÑAÔAˆKØ.:×.@Ò.@Ñ.BÔ.Bð Fð FÑ*�˜]ØÐ"4Ð4Ð4ØðyÝ—M’M +Ñ.Ô.Ð.Ð.øÝ!ð yð yð yÝ&˜,ÐWbÐWbÐWbÐdmÐdmÐdmÐovÐovÐ'wÑxÔxÐxðyøøøð ×(Ò(ØØ! %Ô(Ø! &Ô)Ø! (Ô+Ø!×%Ò% m°RÑ8Ô8ñô ð ð "¥^Ô%FÒFÐFØ"Ð*>Ð>Ð>Ø<>Ð,¨[Ñ9Ø(¨Ô5×<Ò<¸WÑEÔEÐEøà× Ò  Ñ-Ô-Ð-Ñ-Ø)=×)CÒ)CÑ)EÔ)Eð 	ð 	Ñ%ˆK˜Ý�<Ñ Ô  1Ò$Ð$Ý"Øw˜IÐwÐw°[ÐwÐwÅsÐK_ÑG`ÔG`ÐwÐwÐwñô ð ð �'Ô/Ò/Ð/µCÐ8LÑ4MÔ4MÐQRÒ4RÐ4RÝ"Øp¨iÐpÐpÀ{ÐpÐpÐpñô ð øð 	×(Ò(Ñ*Ô*Ð*Øˆs   Û>\Ü#\<c                 ó  — g }| j                              ¦   «         D ]�\  }}||j        dœ}|j                             ¦   «         D ]C\  }}|j        r|j        |j        |j        |j        dœ||<   Œ+|j        |j        |j        dœ||<   ŒD|                     |¦  «         Œ‚| j	        }| j
        | j        | j        j        | j        j        | j        j        | j        j        | j        j        | j        j        | j        j        | j        j        |dœ}| j        j        t,          k    r| j        j        |d<   |r||d<   | j        j        r| j        j        |d<   | j        j        du r| j        j        |d	<   | j        j        r| j        j        |d
<   |S )z+
        Make a JSON dump of self.
        r.  )r	  rÞ   rÚ   rY  )r	  rÞ   rÚ   )rC   r•  r‰  rŠ  r‹  rŒ  r�  r„  r…  r�  rª  r†  r�  rŽ  Fr‡  rˆ  )rª  r(  rc  rf  rY  r	  rÞ   rÚ   r«   r�  rC   r•  rœ  r‰  rŠ  r‹  rŒ  r�  r„  r…  r�  r†  r›  rŽ  r‡  rˆ  )	rA   Úversions_arrayrb  r
  Úversion_jsonr:  r0  Úoverrides_arrayÚ	tool_jsons	            r    Úto_jsonzIDFTool.to_json¸  sÉ  € ð ˆØ$(¤M×$7Ò$7Ñ$9Ô$9ð 	0ð 	0Ñ ˆG�[Ø$+°{Ô7IÐJÐJˆLØ)4Ô)>×)DÒ)DÑ)FÔ)Fð 	xð 	xÑ%�˜XØÔ'ð xà'œ|Ø (¤Ø"*¤/Ø'/Ô';ð	1ð 1�L Ñ-Ð-ð 9A¼ÈhÌmÐgoÔgvÐ0wÐ0w�L Ñ-Ð-Ø×!Ò! ,Ñ/Ô/Ð/Ð/ØÔ1ˆð ”IØÔ+Ø œLÔ5Øœ<Ô3Ø”|Ô+ØœÔ-Ø”|Ô+Øœ<Ô3Ø!œ\Ô7Ø!%¤Ô!?Ø&ð
ð 
ˆ	ð Œ<Ô-Õ1NÒNÐNØ15´Ô1SˆIÐ-Ñ.Øð 	>Ø.=ˆIÐ*Ñ+ØŒ<Ô,ð 	RØ04´Ô0QˆIÐ,Ñ-ØŒ<Ô%¨Ð.Ð.Ø)-¬Ô)CˆI�oÑ&ØŒ<Ô&ð 	FØ*.¬,Ô*EˆIÐ&Ñ'ØÐr   )Nr   Tr“   rL   ©NN)0r   r   r   rM   ÚINSTALL_ALWAYSÚINSTALL_ON_REQUESTr2  rO   r   r   r   r€  r\  r¢  rŸ  r˜  r^  r®  r±  r³  r¸  r   rÃ  rÉ  rÒ  rÞ  râ  rä  r   ræ  rè  rð  rw  r   r{  rù  r  r  r  r0  r‹  r�   rX  r  Úclassmethodr   r=  rC  r   r   r    r‘  r‘  <  sÎ  € € € € € ðð ð €NØ%ÐØ€Mð 04Ø$%Ø"Ø ð(-ð (-àð(-ð ð(-ð ð	(-ð
 ð(-ð ð(-ð ˜#”Yð(-ð ð(-ð   œ9ð(-ð  (¨œ}ð(-ð "ð(-ð ð(-ð ð(-ð 
ð(-ð (-ð (-ð (-ðT¨#ð °)ð ð ð ð ð
Tð 
Tð 
Tð 
TðAð Að Að Að1 >ð 1°dð 1ð 1ð 1ð 1ðB˜#ð Bð Bð Bð Bð6¨Cð 6°Cð 6ð 6ð 6ð 6ðY¨ð Y°°S´	ð Yð Yð Yð Yð sð ¨t°C¸°H¬~ð ð ð ð ð$x¨#ð x°#ð xð xð xð xðKð K x°°S´	Ô':ð KÐT\Ð]`ÔTað KÐmpð Kð Kð Kð KðB=¨Sð =°Sð =ð =ð =ð =ð.¨#ð °$ð ð ð ð ð (¨X°c¬]ð (¸tð (ð (ð (ð (ð- (¨C¨5°$¨;Ô"7ð -ð -ð -ð -ð7 t¨C¤yð 7ð 7ð 7ð 7ðb°t¸C´yð bÀTð bð bð bð bðS¨$ð Sð Sð Sð Sð¨¨S¬ð ð ð ð ð¨°#¬ð ð ð ð ð!°¸#´ð !ð !ð !ð !ðF4"ð 4"ð 4"ð 4"ðl¨(°3¬-ð ð ð ð ð8%  ð % ¨ð % ð % ð % ð % ðN ˜sð   tð  ð  ð  ð  ð4 ð¨/ð Àsð Ètð ð ð ñ „\ðð ðm $ s¨E°#°t¸C´yÀ$ÀsÈCÀxÄ.Ð2PÔ,QÐ'QÔ"Rð mÐW`ð mð mð mñ „[ðmð^+ð +ð +ð +ð +r   r‘  c                   ó   — e Zd ZdZd„ ZdS )ÚIDFEnvEncoderzü
    IDFEnvEncoder is used for encoding IDFEnv, IDFRecord, SelectedIDFRecord classes to JSON in readable format.
    Not as (__main__.IDFRecord object at '0x7fcxx').
    Additionally remove first underscore with private properties when processing.
    c                 óX   — d„ t          |¦  «                             ¦   «         D ¦   «         S )Nc                 ó@   — i | ]\  }}|                      d ¦  «        |“ŒS )r=   )Úlstrip©rÇ   r¾  r¿  s      r    ú
<dictcomp>z)IDFEnvEncoder.default.<locals>.<dictcomp>î  s(   € Ð?Ð?Ð?¡T Q¨�—’˜‘”˜qÐ?Ð?Ð?r   )Úvarsr(  )rA   Úobjs     r    ÚdefaultzIDFEnvEncoder.defaultí  s&   € Ø?Ð?­T°#©Y¬Y¯_ª_Ñ->Ô->Ð?Ñ?Ô?Ð?r   N)r   r   r   rM   rQ  r   r   r    rI  rI  æ  s2   € € € € € ðð ð@ð @ð @ð @ð @r   rI  c                   óJ  — e Zd ZdZdd„Zd„ Zdefd„Zdefd„Zde	de
fd	„Zde	de
fd
„Zedee         fd„¦   «         Zddeedf         deedf         ddfd„Zdd„Zedee         fd„¦   «         Zdee         ddfd„Zedd„¦   «         Zedeeef         dd fd„¦   «         ZdS )Ú	IDFRecorda©  
    IDFRecord represents one record of installed ESP-IDF on system.
    Contains:
        * version - actual version of ESP-IDF (example '5.0')
        * path - absolute path to the ESP-IDF
        * features - features using ESP-IDF
        * targets - ESP chips for which are installed needed toolchains (example ['esp32' , 'esp32s2'])
                  - Default value is [], since user didn't define any targets yet
    r4   Nc                 ó@   — d| _         d| _        dg| _        g | _        d S )Nr“   Úcore)rb  r­   Ú	_featuresÚ_targetsrz  s    r    r\  zIDFRecord.__init__ü  s$   € ØˆŒØˆŒ	Ø%+ HˆŒØ#%ˆŒˆˆr   c              #   óp   K  — | j         | j        | j        | j        dœ                     ¦   «         E d {V —† d S )N©rb  r­   Úfeaturesré  )rb  r­   rV  rW  r(  rz  s    r    Ú__iter__zIDFRecord.__iter__  s\   è è € à”|Ø”IØœØ”}ð	
ð 
÷
 Š%‰'Œ'ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r   c                 óJ   — t          j        t          | ¦  «        dd¬¦  «        S )NFru   ©Úensure_asciiÚindent)rØ  Údumpsr0  rz  s    r    Ú__str__zIDFRecord.__str__
  s   € ÝŒz�$˜t™*œ*°5ÀÐCÑCÔCÐCr   c                 ó*   — |                       ¦   «         S r6   ©ra  rz  s    r    Ú__repr__zIDFRecord.__repr__  ó   € Ø�|Š|‰~Œ~Ðr   rh  c                 ól   ‡ ‡— t          ‰t          ¦  «        sdS t          ˆˆ fd„dD ¦   «         ¦  «        S )NFc              3   ó\   •K  — | ]&}t          ‰|¦  «        t          ‰|¦  «        k    V — Œ'd S r6   )rE   )rÇ   rý  rh  rA   s     €€r    rî  z#IDFRecord.__eq__.<locals>.<genexpr>  s<   øè è € ÐmÐm¸Q•7˜4 Ñ#Ô#¥w¨u°aÑ'8Ô'8Ò8ÐmÐmÐmÐmÐmÐmr   rY  )rþ   rS  rï  rk  s   ``r    ro  zIDFRecord.__eq__  sB   øø€ Ý˜%¥Ñ+Ô+ð 	Ø�5ÝÐmÐmÐmÐmÐmÐBlÐmÑmÔmÑmÔmÐmr   c                 ó\   — t          |t          ¦  «        sdS |                      |¦  «         S re  )rþ   rS  ro  rk  s     r    Ú__ne__zIDFRecord.__ne__  s.   € Ý˜%¥Ñ+Ô+ð 	Ø�5Ø—;’;˜uÑ%Ô%Ð%Ð%r   c                 ó   — | j         S r6   )rV  rz  s    r    rZ  zIDFRecord.features  s
   € àŒ~Ðr   r   Úadd.Úremovec                 ód  — t          |¦  «        }t          |¦  «        }|                     |¦  «        }|                     |¦  «        }t          | j        ¦  «        }|                     |¦  «         |                     |¦  «         |                     d¦  «         t          |¦  «        | _        d S )NrU  )ry  Ú
differencerV  rÜ   Údifference_updaterk  r/  )rA   rk  rl  Úadd_setÚ
remove_setÚfeatures_to_addÚfeatures_to_removerZ  s           r    Úupdate_featureszIDFRecord.update_features  sš   € õ �c‘(”(ˆÝ˜‘[”[ˆ
à!×,Ò,¨ZÑ8Ô8ˆØ'×2Ò2°7Ñ;Ô;Ðå�t”~Ñ&Ô&ˆØ�Š˜Ñ(Ô(Ð(Ø×"Ò"Ð#5Ñ6Ô6Ð6Ø�Š�VÑÔÐÝ˜h™œˆŒˆˆr   c           	      ó  — d}| j         D ]l}t          j                             t	          |¦  «        ¦  «        s>t          d                     dt	          |¦  «        › d�d|› �g¦  «        ¦  «         ||fz  }Œm|                      |¬¦  «         dS )zw
        Check if feature requirements files exist.
        If not, remove the feature from the features list.
        r   rS   zFeature file 'z' does not exist.zRemoving feature )rl  N)rV  r¬   r­   r  Úfeature_to_requirements_pathr`   r®   rt  )rA   rs  Úfeatures      r    Ú check_feature_requirements_filesz*IDFRecord.check_feature_requirements_files-  s²   € ð
 /1ÐØ”~ð 
	1ð 
	1ˆGÝ”7—>’>Õ">¸wÑ"GÔ"GÑHÔHð 	1ÝØ—I’IàeÕ-IÈ'Ñ-RÔ-RÐeÐeÐeØ9°Ð9Ð9ðñô ñô ð ð # w jÑ0Ð"øØ×ÒÐ$6ÐÑ7Ô7Ð7Ð7Ð7r   c                 ó   — | j         S r6   )rW  rz  s    r    ré  zIDFRecord.targets@  s
   € àŒ}Ðr   ré  c                 óX   — t          t          || j        z   ¦  «        ¦  «        | _        d S r6   )r/  ry  rW  )rA   ré  s     r    Úextend_targetszIDFRecord.extend_targetsD  s$   € å�S ¨4¬=Ñ!8Ñ9Ô9Ñ:Ô:ˆŒˆˆr   c                 ób   —  | ¦   «         }t          ¦   «         |_        t          j        |_        |S r6   )Úget_idf_versionrb  rU   r/   r­   )r:   Úidf_record_objs     r    Úget_active_idf_recordzIDFRecord.get_active_idf_recordH  s+   € à˜™œˆÝ!0Ñ!2Ô!2ˆÔÝœjˆÔØÐr   Úrecord_dictc                 ó0  —  | ¦   «         }	 |d         |_         |d         |_        n# t          $ r t          d¦  «        ‚w xY w|                     |                     dg ¦  «        ¦  «         |                     |                     dg ¦  «        ¦  «         |S )Nrb  r­   zInconsistent recordrZ  ré  )rb  r­   ÚKeyErrorr‹   rt  r�   r{  )r:   r€  r~  s      r    Úget_idf_record_from_dictz"IDFRecord.get_idf_record_from_dictO  s§   € à˜™œˆð	4Ø%0°Ô%;ˆNÔ"Ø"-¨fÔ"5ˆNÔÐøÝð 	4ð 	4ð 	4õ Ð2Ñ3Ô3Ð3ð	4øøøð
 	×&Ò& {§¢°zÀ2Ñ'FÔ'FÑGÔGÐGØ×%Ò% k§o¢o°iÀÑ&DÔ&DÑEÔEÐEàÐs	   Œ' §ArL   )r   r   )r4   rS  )r   r   r   rM   r\  r[  rO   ra  rd  r�  r€  ro  ri  Úpropertyr   rZ  r   rt  rx  ré  r{  rG  r  r   r   rƒ  r   r   r    rS  rS  ñ  së  € € € € € ðð ð&ð &ð &ð &ðð ð ðD˜ð Dð Dð Dð Dð˜#ð ð ð ð ðn˜Fð n tð nð nð nð nð
&˜Fð & tð &ð &ð &ð &ð
 ð˜$˜sœ)ð ð ð ñ „Xðð(ð ( 5¨¨c¨¤?ð (ÀÀsÈCÀxÄð (ÐZ^ð (ð (ð (ð (ð8ð 8ð 8ð 8ð& ð˜˜cœð ð ð ñ „Xðð; d¨3¤ið ;°Dð ;ð ;ð ;ð ;ð ðð ð ñ „[ðð ð°4¸¸S¸´>ð Àkð ð ð ñ „[ðð ð r   rS  c                   ód   — e Zd ZdZdd„Zd„ Zdefd„Zdefd„Zdd„Z	de
fd	„Zedd
„¦   «         ZdS )ÚIDFEnva  
    IDFEnv represents ESP-IDF Environments installed on system and is responsible
    for loading and saving structured data.
    All information is saved and loaded from IDF_ENV_FILE.
    Contains:
        * idf_installed - all installed environments of ESP-IDF on system.
    r4   Nc                 ób   — t          ¦   «         }|t                               ¦   «         i| _        d S r6   )Úactive_repo_idrS  r  Úidf_installed)rA   Úactive_idf_ids     r    r\  zIDFEnv.__init__i  s,   € Ý&Ñ(Ô(ˆØ4AÅ9×CbÒCbÑCdÔCdÐ3eˆÔÐÐr   c              #   óL   K  — d| j         i                     ¦   «         E d {V —† d S )NÚidfInstalled)r‰  r(  rz  s    r    r[  zIDFEnv.__iter__m  sI   è è € à˜DÔ.ð
ç
Š%‰'Œ'ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r   c                 óV   — t          j        t          | ¦  «        t          dd¬¦  «        S )NFru   ©r:   r^  r_  )rØ  r`  r0  rI  rz  s    r    ra  zIDFEnv.__str__r  s"   € ÝŒz�$˜t™*œ*­-ÀeÐTUÐVÑVÔVÐVr   c                 ó*   — |                       ¦   «         S r6   rc  rz  s    r    rd  zIDFEnv.__repr__u  re  r   c                 óÚ  — |                       ¦   «         |                      ¦   «                               ¦   «         k    �r-t          j                             t
          j        t          ¦  «        }	 t
          j        rt          t
          j        ¦  «         t          |dd¬¦  «        5 }t          d|› �¦  «         t          j        t          | ¦  «        |t          dd¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t          t           f$ rZ t          j        t
          j        t          j        ¦  «        st!          d	t
          j        › d
�¦  «        ‚t!          d|› d�¦  «        ‚w xY wdS )zt
        Diff current class instance with instance loaded from IDF_ENV_FILE and save only if are different.
        ÚwrÍ  rÕ  z	Updating Fru   rŽ  NzIDF_TOOLS_PATH zA is not accessible to write. Required changes have not been savedzFile zN is not accessible to write or corrupted. Required changes have not been saved)r  Úget_idf_envr¬   r­   r®   rU   r0   ÚIDF_ENV_FILErð   r~   r`   rØ  Údumpr0  rI  ÚIOErrorrë   ÚaccessÚW_OK)rA   Úidf_env_file_pathr‘  s      r    ÚsavezIDFEnv.savex  sË  € ð
 ×%Ò%Ñ'Ô'¨4×+;Ò+;Ñ+=Ô+=×+SÒ+SÑ+UÔ+UÒUÑUÝ "¤§¢­QÔ-=½|Ñ LÔ LÐðÝÔ#ð .å�AÔ,Ñ-Ô-Ð-ÝÐ+¨S¸7ÐCÑCÔCð ^ÀqÝÐ8Ð%6Ð8Ð8Ñ9Ô9Ð9Ý”I�d 4™jœj¨!µÈUÐ[\Ð]Ñ]Ô]Ð]ð^ð ^ð ^ñ ^ô ^ð ^ð ^ð ^ð ^ð ^ð ^ð ^øøøð ^ð ^ð ^ð ^ð ^ð ^øõ �WÐ%ð 	ð 	ð 	Ý”y¥Ô!1µ2´7Ñ;Ô;ð Ý!ð?­!Ô*:ð ?ð ?ð ?ñô ð õ ð;Ð-ð ;ð ;ð ;ñô ð ð	øøøð VÐUs1   Á.7C= Â%>C0Ã#C= Ã0C4Ã4C= Ã7C4Ã8C= Ã=A+E(c                 ó4   — | j         t          ¦   «                  S r6   )r‰  rˆ  rz  s    r    r  zIDFEnv.get_active_idf_record‘  s   € ØÔ!¥.Ñ"2Ô"2Ô3Ð3r   c                 ót  —  | ¦   «         }	 t           j                             t          j        t
          ¦  «        }t          |dd¬¦  «        5 }t          j        |¦  «        }	 |d         }| 	                    dd¦  «         i }|D ]U}	 t                               ||         ¦  «        ||<   Œ'# t          $ r"}t          |› d|› d|› d	�¦  «         Y d}~ŒNd}~ww xY wt          |j        fi |¤Ž|_        n# t           $ r Y nw xY wddd¦  «         n# 1 swxY w Y   n# t"          t$          t          f$ r Y nw xY w|S )
z±
        IDFEnv class is used to process IDF_ENV_FILE file.
        The constructor is therefore called only in this method that loads the file and checks its contents.
        rÔ  rÍ  rÕ  rŒ  ÚshaNz "z" found in z, removing this record.)r¬   r­   r®   rU   r0   r“  r~   rØ  rÙ  ÚpoprS  rƒ  r‹   r\   r0  r‰  r‚  r•  rë   )	r:   Úidf_env_objr˜  Úidf_env_fileÚidf_env_jsonr‰  Úidf_installed_verifiedÚidfra   s	            r    r’  zIDFEnv.get_idf_env”  sí  € ð �c‘e”eˆð	Ý "¤§¢­QÔ-=½|Ñ LÔ LÐÝÐ'¨°wÐ?Ñ?Ô?ð jÀ<Ý#œy¨Ñ6Ô6�ðjØ$0°Ô$@�Mð "×%Ò% e¨TÑ2Ô2Ð2ØCEÐ*Ø,ð gð g˜ðgÝ:C×:\Ò:\Ð]jÐknÔ]oÑ:pÔ:pÐ2°3Ñ7Ð7øÝ)ð gð gð gÝ  CÐ!eÐ!e¨3Ð!eÐ!eÐ;LÐ!eÐ!eÐ!eÑfÔfÐfÐfÐfÐfÐfÐføøøøðgøøøõ
 15°[Ô5NÐ0iÐ0iÐRhÐ0iÐ0i�KÔ-Ð-øõ!  ð ð ð ð �Dðøøøðjð jð jñ jô jð jð jð jð jð jð jøøøð jð jð jð jøøõ. �¥*Ð-ð 	ð 	ð 	àˆDð	øøøð Ðs„   ŒAD ÁDÁ#C3Á+DÂ#B,Â+DÂ,
CÂ6CÃDÃCÃDÃ3
D Ã=DÃ?D Ä DÄD ÄDÄD ÄDÄD ÄD5Ä4D5rL   )r4   r†  )r   r   r   rM   r\  r[  rO   ra  rd  r™  rS  r  rG  r’  r   r   r    r†  r†  `  sÏ   € € € € € ðð ðfð fð fð fðð ð ð
W˜ð Wð Wð Wð Wð˜#ð ð ð ð ðð ð ð ð24 yð 4ð 4ð 4ð 4ð ð#ð #ð #ñ „[ð#ð #ð #r   r†  c                   óx   — e Zd ZdZdZej                             ed¦  «        Zd	d„Z	e
d
d„¦   «         Zdefd„ZdS )ÚENVStatea�  
    ENVState is used to handle IDF global variables that are set in environment and
    need to be removed when switching between ESP-IDF versions in opened shell.
    Every opened shell/terminal has it's own temporary file to store these variables.
    The temporary file's name is generated automatically with suffix 'idf_ + opened shell ID'.
    Path to this tmp file is stored as env global variable (env_key).
    The shell ID is crucial, since in one terminal can be opened more shells.
    * env_key - global variable name/key
    * deactivate_file_path - global variable value (generated tmp file name)
    * idf_variables - loaded IDF variables from file
    ÚIDF_DEACTIVATE_FILE_PATHr“   r4   Nc                 ó   — i | _         d S r6   )Úidf_variablesrz  s    r    r\  zENVState.__init__Ë  s   € Ø-/ˆÔÐÐr   c                 óö   —  | ¦   «         }| j         rg	 t          | j         dd¬¦  «        5 }t          j        |¦  «        |_        d d d ¦  «         n# 1 swxY w Y   n# t
          t          t          f$ r Y nw xY w|S )NrÔ  rÍ  rÕ  )Údeactivate_file_pathr~   rØ  rÙ  r§  r•  rë   r‹   )r:   Úenv_state_objr  s      r    Úget_env_statezENVState.get_env_stateÎ  sÕ   € à˜™œˆàÔ#ð 	ðÝ˜#Ô2°CÀ'ÐJÑJÔJð @ÈbÝ26´)¸B±-´-�MÔ/ð@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @øøå�W¥jÐ1ð ð ð Ø�ðøøøàÐs4   “A ªAÁA ÁAÁA ÁAÁA ÁA6Á5A6c                 óT  — 	 | j         rMt          | j         dd¬¦  «        5 }t          j        | j        |dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   n�t          j        ddt          t          j	        ¦   «         ¦  «        › �¬¦  «        5 }|j
        | _         |                     t          j        | j        dd¬¦  «                             d¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   n/# t          t          f$ r t!          d	| j         › d
�¦  «         Y nw xY w| j         S )Nr‘  rÍ  rÕ  Fru   r]  Úidf_)ÚdeleteÚsuffixzFile storing IDF env variables zV is not accessible to write. Potentional switching ESP-IDF versions may cause problems)r©  r~   rØ  r”  r§  ÚtempfileÚNamedTemporaryFilerO   r¬   ÚgetppidrC   rX   r`  r°   r•  rë   r\   )rA   r‘  r  s      r    r™  zENVState.saveÚ  sè  € ð	ØÔ(ð kÝ˜$Ô3°SÀ7ÐKÑKÔKð SÈqÝ”I˜dÔ0°!À%ÐPQÐRÑRÔRÐRðSð Sð Sñ Sô Sð Sð Sð Sð Sð Sð Søøøð Sð Sð Sð Søõ Ô0¸ÐF`ÍSÕQSÔQ[ÑQ]ÔQ]ÑM^ÔM^ÐF`ÐF`ÐaÑaÔað kÐegØ02´�DÔ-Ø—H’H�TœZ¨Ô(:ÈÐWXÐYÑYÔY×`Ò`ÐahÑiÔiÑjÔjÐjðkð kð kñ kô kð kð kð kð kð kð køøøð kð kð kð køøõ �Ð!ð 	ð 	ð 	ÝðL°$Ô2Kð Lð Lð Lñô ð ð ð ð	øøøð
 Ô(Ð(sX   ‚C4  A
¾C4 Á
AÁC4 ÁAÁ;C4 ÂAC(ÃC4 Ã(C,Ã,C4 Ã/C,Ã0C4 Ã4)D ÄD rL   )r4   r¤  )r   r   r   rM   Úenv_keyr¬   rÍ   r�   r©  r\  rG  r«  rO   r™  r   r   r    r¤  r¤  »  sŠ   € € € € € ð
ð 
ð )€GØœ:Ÿ>š>¨'°2Ñ6Ô6Ðð0ð 0ð 0ð 0ð ð	ð 	ð 	ñ „[ð	ð)�cð )ð )ð )ð )ð )ð )r   r¤  c                  ó´   — t           j        } t          | dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   t          |¦  «        S )zZ
    Load tools metadata from tools.json, return a dictionary: tool name - tool info.
    rÔ  rÍ  rÕ  N)rU   r1   r~   rØ  rÙ  Úparse_tools_info_json)Útool_versions_file_namer]   Ú
tools_infos      r    Úload_tools_infor¸  ë  s‘   € õ
  œlÐå	Ð% s°WÐ	=Ñ	=Ô	=ð "ÀÝ”Y˜q‘\”\ˆ
ð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "õ ! Ñ,Ô,Ð,s   ŸA Á AÁAc                 óè   — t          ¦   «         }|                      d¦  «        }t          |¦  «        t          urt	          d¦  «        ‚|D ]&}t
                               |¦  «        }|||j        <   Œ'|S )zŸ
    Parse and validate the dictionary obtained by loading the tools.json file.
    Returns a dictionary of tools (key: tool name, value: IDFTool object).
    r°  z)tools property is missing or not an array)r   r�   r¬  r/  rG  r‘  r=  rC   )r·  Ú
tools_dictÚtools_arrayr,  Útools        r    rµ  rµ  ø  sw   € õ
 ‘”€Jà—.’. Ñ)Ô)€KÝˆKÑÔ¥Ð$Ð$ÝÐFÑGÔGÐGà ð %ð %ˆ	Ý× Ò  Ñ+Ô+ˆØ $ˆ
�4”9ÑÐàÐr   r·  c                 ó  — g }| re|                       ¦   «         D ].\  }}|                     ¦   «         }|                     |¦  «         Œ/t          |dœ}t	          j        |ddd¬¦  «        S t	          j        i ddd¬¦  «        S )z'
    Dump all the tools into JSON.
    )rb  r°  rw   )r&   ú: T)r_  Ú
separatorsÚ	sort_keys)r(  rC  r«   ÚTOOLS_FILE_VERSIONrØ  r`  )r·  r»  r=   r5  rB  Ú	file_jsons         r    Údump_tools_jsonrÃ  
  s™   € ð €KØð PØ%×+Ò+Ñ-Ô-ð 	*ð 	*‰KˆAˆxØ ×(Ò(Ñ*Ô*ˆIØ×Ò˜yÑ)Ô)Ð)Ð)Ý 2¸[ÐIÐIˆ	ÝŒz˜)¨A¸+ÐQUÐVÑVÔVÐVåŒz˜" Q°;È$ÐOÑOÔOÐOr   c                  ó<   — t           j        dk    rd} d}nd} d}|| fS )z›
    Returns:
    * python executable name (python on Unix, python.exe on Win)
    * subdir in which the executable is (bin for Unix, Scripts for Win)
    re   ÚScriptsz
python.exeÚbinÚpythonrÉ   )ÚsubdirÚ
python_exes     r    Úget_python_exe_and_subdirrÊ    s2   € õ „|�wÒÐØˆØ!ˆ
ˆ
àˆØˆ
Ø�vÐÐr   c            	      óÄ  — d} t           j                             t          j        d¦  «        }t           j                             |¦  «        rjt          |dd¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   t          j	        d|¦  «        }|r| 
                    d¦  «        } | �€'	 t          t           j                             t          j        dd	d
d¦  «        d¬¦  «        5 }t          j        d|                     ¦   «         t          j        t          j        z  ¦  «        }|r>d                     | 
                    d¦  «        | 
                    d¦  «        f¦  «        } nt          d¦  «         t          d¦  «        ‚	 ddd¦  «         n# 1 swxY w Y   n3# t           $ r&}t          d|› �¦  «         t          d¦  «        ‚d}~ww xY w| S )z!
    Return ESP-IDF version.
    Nzversion.txtrÔ  rÍ  rÕ  z^v([0-9]+\.[0-9]+).*r	   Ú
componentsÚ
esp_commonÚincludezesp_idf_version.hzS^#define\s+ESP_IDF_VERSION_MAJOR\s+(\d+).+?^#define\s+ESP_IDF_VERSION_MINOR\s+(\d+)r)   rw   z.Reading IDF version from C header file failed!z1It is not possible to determine the IDF version: )r¬   r­   r®   rU   r/   r¯   r~   r�   r  r  rÈ  rÆ  r  Ú	MULTILINErZ   r    r,  )Úidf_versionÚversion_file_pathÚversion_fileÚidf_version_strr  r]   Úmr¡   s           r    r}  r}  (  s<  € ð "&€KåœŸš¥Q¤Z°Ñ?Ô?ÐÝ	„w‡~‚~Ð'Ñ(Ô(ð )ÝÐ# S°7Ð;Ñ;Ô;ð 	2¸|Ø*×/Ò/Ñ1Ô1ˆOð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2õ ”Ð0°/ÑBÔBˆØð 	)ØŸ+š+ a™.œ.ˆKàÑð	 ÝÝ”—’�QœZ¨°|ÀYÐPcÑdÔdÐovðñ ô ð (àÝ”IØjØ—F’F‘H”HÝ”I¥¤Ñ,ñô �ð
 ð (Ø"%§(¢(¨A¯GªG°A©J¬J¸¿ºÀ¹
¼
Ð+CÑ"DÔ"D�K�KåÐJÑKÔKÐKÝ$ Q™-œ-Ð'ð  ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (øøõ ð 	 ð 	 ð 	 ÝÐIÀaÐIÐIÑJÔJÐJÝ˜Q‘-”-Ðøøøøð	 øøøð ÐsO   ÁA?Á?BÂBÂ:<F- Ã6BF!ÆF- Æ!F%Æ%F- Æ(F%Æ)F- Æ-
GÆ7!GÇGc                  ó†  — t          ¦   «         } t          j        d¦  «        pHt          j                             t
          j        dt                               | t          ¦  «        ¦  «        }t          ¦   «         \  }}t          j                             ||¦  «        }t          j                             ||¦  «        }|||| fS )z†
    Returns tuple of Python environment path, Python env. path with subdir and
    full path from Python (i.e. with executable).
    ÚIDF_PYTHON_ENV_PATHÚ
python_env)r}  r¬   Úgetenvr­   r®   rU   r0   ÚPYTHON_VENV_DIR_TEMPLATEÚformatÚPYTHON_VER_MAJOR_MINORrÊ  )rÐ  Úidf_python_env_pathrÉ  rÈ  Úidf_python_export_pathÚvirtualenv_pythons         r    Úget_python_env_pathrß  L  s¤   € õ
 "Ñ#Ô#€KÝœ)Ð$9Ñ:Ô:ð ½b¼g¿lºlÝ	Ô˜,Õ(@×(GÒ(GÈÕUkÑ(lÔ(lñ?ô ?Ðõ 3Ñ4Ô4Ñ€J�ÝœWŸ\š\Ð*=¸vÑFÔFÐÝœŸšÐ%;¸ZÑHÔHÐàÐ 6Ð8IÈ;ÐVÐVr   Ú	tools_strc                 ó   — | sdgS | S )z=
    Base parsing "tools" arguments: all, required, etc.
    Úrequiredr   )rà  s    r    Úparse_tools_argrã  ]  s   € ð ð Øˆ|ÐàÐr   Ú
tools_specÚoverall_toolsré  c                 ó¾  ‡‡‡‡— g Š| D ]6Š‰                      ˆˆfd„‰                     ¦   «         D ¦   «         ¦  «         Œ7d| v r4‰                      ˆfd„‰                     ¦   «         D ¦   «         ¦  «         n7d| v r3‰                      ˆfd„‰                     ¦   «         D ¦   «         ¦  «         ˆˆfd„‰D ¦   «         Š‰                      d„ | D ¦   «         ¦  «         ‰S )zü
    Expand list of tools 'tools_spec' in according:
        - a tool is in the 'overall_tools' list
        - consider metapackages like "required" and "all"
        - process wildcards in tool names
        - a tool supports chips from 'targets'
    c                 óL   •— g | ] \  }}t          j         |‰¦  «        ¯|‰v¯|‘Œ!S r   )Úfnmatch)rÇ   r¾  r=   Útool_patternr°  s      €€r    rÈ   z$expand_tools_arg.<locals>.<listcomp>s  s;   ø€ ÐqÐqÐq™D˜A˜q½W¼_ÈQÐP\Ñ=]Ô=]ÐqÐbcÐkpÐbpÐbp�aÐbpÐbpÐbpr   râ  c                 óf   •— g | ]-\  }}|                      ¦   «         t          j        k    ¯'|‰v¯+|‘Œ.S r   )ræ  r‘  rE  ©rÇ   r¾  r¿  r°  s      €r    rÈ   z$expand_tools_arg.<locals>.<listcomp>x  sB   ø€ ÐvÐvÐv‘4�1�a°A×4FÒ4FÑ4HÔ4HÍGÔLbÒ4bÐ4bÐghÐpuÐguÐguˆQÐguÐguÐgur   rï  c                 óf   •— g | ]-\  }}|                      ¦   «         t          j        k    ¯'|‰v¯+|‘Œ.S r   )ræ  r‘  r2  rë  s      €r    rÈ   z$expand_tools_arg.<locals>.<listcomp>}  sB   ø€ ÐuÐuÐu‘4�1�a°A×4FÒ4FÑ4HÔ4HÍGÔLaÒ4aÐ4aÐfgÐotÐftÐftˆQÐftÐftÐftr   c                 óJ   •— g | ]}‰|                               ‰¦  «        ¯|‘Œ S r   )rð  )rÇ   r¾  rå  ré  s     €€r    rÈ   z$expand_tools_arg.<locals>.<listcomp>�  s2   ø€ Ð[Ð[Ð[�1 ¨qÔ!1×!QÒ!QÐRYÑ!ZÔ!ZÐ[ˆQÐ[Ð[Ð[r   c                 ó   — g | ]}d |v ¯|‘Œ	S )ú@r   )rÇ   ré  s     r    rÈ   z$expand_tools_arg.<locals>.<listcomp>„  s"   € ÐUÐUÐU <ÀÈÐATÐAT�,ÐATÐATÐATr   )Úextendr(  )rä  rå  ré  ré  r°  s    ``@@r    Úexpand_tools_argrñ  g  s1  øøøø€ ð €Eð #ð sð sˆØ�ŠÐqÐqÐqÐqÐq M×$7Ò$7Ñ$9Ô$9ÐqÑqÔqÑrÔrÐrÐrð �ZÐÐØ�ŠØvÐvÐvÐv˜=×.Ò.Ñ0Ô0ÐvÑvÔvñ	
ô 	
ð 	
ð 	
ð 
�*Ð	Ð	Ø�ŠØuÐuÐuÐu˜=×.Ò.Ñ0Ô0ÐuÑuÔuñ	
ô 	
ð 	
ð
 \Ð[Ð[Ð[Ð[˜Ð[Ñ[Ô[€Eð 
‡L‚LÐUÐU°:ÐUÑUÔUÑVÔVÐVØ€Lr   Útargets_strc                 ój  ‡— t          ¦   «         Šg }|                      ¦   «         } |                      dd¦  «                             d¦  «        }|dgk    r‰S ˆfd„|D ¦   «         }|rKt	          dd                     |¦  «        › dd                     ‰¦  «        › d	�¦  «         t          d
¦  «        ‚|S )z]
    Parse and check if targets_str is a valid list of targets and return a target list.
    ri   r“   r&   rï  c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )rÇ   ÚtÚtargets_from_tools_jsons     €r    rÈ   z%parse_targets_arg.<locals>.<listcomp>”  s$   ø€ ÐRÐRÐR °Ð:QÐ1QÐ1Q˜1Ð1QÐ1QÐ1Qr   z
Targets: "rB  z/" are not supported. Only allowed options are: r)   r	   )Úget_all_targets_from_tools_jsonr  rÆ   r×  r\   r®   r    )rò  Úinvalid_targetsré  rö  s      @r    Úparse_targets_argrù  ˆ  så   ø€ õ >Ñ?Ô?ÐØ€Oà×#Ò#Ñ%Ô%€KØ×!Ò! # rÑ*Ô*×0Ò0°Ñ5Ô5€GØ�5�'ÒÐØ&Ð&àRÐRÐRÐR gÐRÑRÔRˆØð 	 ÝðS˜TŸYšY Ñ7Ô7ð Sð SØ-1¯YªYÐ7NÑ-OÔ-OðSð Sð Sñô ð õ ˜Q‘-”-ÐØˆr   rž  c                 ó    — t          |¦  «        }|                      ¦   «                              |¦  «         |                      ¦   «         j        S )zm
    Define targets from targets_str, check that the target names are valid and add them to idf_env_obj.
    )rù  r  r{  ré  )rž  rò  ré  s      r    Úadd_and_check_targetsrû  ž  sF   € õ   Ñ,Ô,€GØ×%Ò%Ñ'Ô'×6Ò6°wÑ?Ô?Ð?Ø×,Ò,Ñ.Ô.Ô6Ð6r   rw  c                 ób   — t           j                             t          j        ddd| › d�¦  «        S )zd
    Convert feature (ci, core, docs, gdbgui, pytest, ...) to the path to its requirements.txt.
    r°  Úrequirementszrequirements.ú.txt)r¬   r­   r®   rU   r/   )rw  s    r    rv  rv  §  s,   € õ Œ7�<Š<�œ
 G¨^Ð=ZÈWÐ=ZÐ=ZÐ=ZÑ[Ô[Ð[r   Úfeatures_strc                 óà  — g }g }g }d„ |                      d¦  «        D ¦   «         D ]’}|                     d¦  «        }t          j                             t          |¦  «        ¦  «        s||gz  }ŒJ|                     d¦  «        r||                     d¦  «        gz  }Œy||                     d¦  «        gz  }Œ“|r4t          dd                     |¦  «        › �¦  «         t          d¦  «        ‚|  
                    ¦   «                              t          |¦  «        t          |¦  «        ¦  «         |  
                    ¦   «                              ¦   «          |  
                    ¦   «         j        S )	z[
    Check whether new feature is valid. If yes, update features in active IDF record.
    c                 ó   — g | ]
}|d k    ¯|‘ŒS r|  r   ©rÇ   rw  s     r    rÈ   z.process_and_check_features.<locals>.<listcomp>¶  s$   € Ð!bÐ!bÐ!b¨gÐT[Ð_aÒTaÐTa 'ÐTaÐTaÐTar   r&   z-+ri   ú+z/The following selected features are not valid: rB  r	   )r×  rL  r¬   r­   r  rv  r6  rZ   r®   r    r  rt  Útuplerx  rZ  )rž  rÿ  Únew_featuresÚremove_featuresÚinvalid_featuresÚnew_feature_candidateÚsanitized_feats          r    Úprocess_and_check_featuresr
  ®  sv  € ð €LØ€OØÐà!bÐ!b¸×9KÒ9KÈCÑ9PÔ9PÐ!bÑ!bÔ!bð 
@ð 
@Ðà.×5Ò5°dÑ;Ô;ˆÝŒw�~Š~Õ:¸>ÑJÔJÑKÔKð 	Ø Ð 0Ñ0ÐØà ×+Ò+¨CÑ0Ô0ð 	@ØÐ 5× <Ò <¸SÑ AÔ AÐBÑBˆOˆOàÐ2×9Ò9¸#Ñ>Ô>Ð?Ñ?ˆLˆLàð ÝÐ]ÀÇ	Â	ÐJZÑ@[Ô@[Ð]Ð]Ñ^Ô^Ð^Ý˜‰mŒmÐà×%Ò%Ñ'Ô'×7Ò7½¸lÑ8KÔ8KÍUÐSbÑMcÔMcÑdÔdÐdØ×%Ò%Ñ'Ô'×HÒHÑJÔJÐJØ×,Ò,Ñ.Ô.Ô7Ð7r   c                  ó,  — t          ¦   «         } g }|                      ¦   «         D ],\  }}|                     |                     ¦   «         ¦  «         Œ-t	          t          |¦  «        ¦  «        }d|v r|                     d¦  «         t          |¦  «        S )z;
    Returns list of all targets from tools.json file.
    rï  )r¸  r(  rð  rè  r/  ry  rl  r  )r·  rö  r=   r¿  s       r    r÷  r÷  Ë  sŸ   € õ !Ñ"Ô"€JØ)+Ðà× Ò Ñ"Ô"ð Bð B‰ˆˆ1Ø×&Ò& q×'>Ò'>Ñ'@Ô'@ÑAÔAÐAÐAå"¥3Ð'>Ñ#?Ô#?Ñ@Ô@ÐØÐ'Ð'Ð'Ø×&Ò& uÑ-Ô-Ð-ÝÐ)Ñ*Ô*Ð*r   c                 óœ   ‡— |                       ¦   «         j        Š‰s|S ˆfd„|                     ¦   «         D ¦   «         }t          |¦  «        S )zË
    Filter tools info; return only those targets which:
        * are installable (install type is INSTALL_ALWAYS or INSTALL_ON_REQUEST)
        * support at least one target from active IDF record
    c                 ó0  •— i | ]’\  }}|                      ¦   «         t          j        k    s"|                      ¦   «         t          j        k    rIt	          ˆfd „|                     ¦   «         D ¦   «         ¦  «        s|                     ¦   «         dgk    ¯�||“Œ“S )c              3   ó    •K  — | ]}|‰v V — Œ	d S r6   r   rì  s     €r    rî  z/filter_tools_info.<locals>.<dictcomp>.<genexpr>é  s'   øè è € ÐKÐK¨�T˜W�_ÐKÐKÐKÐKÐKÐKr   rï  )ræ  r‘  rE  rF  r‰   rè  )rÇ   r¾  r¿  ré  s      €r    rN  z%filter_tools_info.<locals>.<dictcomp>å  s¯   ø€ ð 
ð 
ð 
á��1Ø×"Ò"Ñ$Ô$­Ô(>Ò>Ð>À!×BTÒBTÑBVÔBVÕZaÔZtÒBtÐBtÝÐKÐKÐKÐK°×1HÒ1HÑ1JÔ1JÐKÑKÔKÑKÔKð CuØOP×OfÒOfÑOhÔOhÐmrÐlsÒOsÐOsð ˆqð PtÐOsÐOsr   )r  ré  r(  r   )rž  r·  Úfiltered_tools_specré  s      @r    Úfilter_tools_infor  Û  sm   ø€ ð ×/Ò/Ñ1Ô1Ô9€GØð 	0ØÐð
ð 
ð 
ð 
à"×(Ò(Ñ*Ô*ð
ñ 
ô 
Ðõ Ð.Ñ/Ô/Ð/r   Únew_idf_varsc           	      óH  — d|v r&|d                               d¦  «        dd…         |d<   |                     dg ¦  «        |d<   t          | ¦  «                             d¦  «        }|r|d         |                      d¦  «        z   n|d         |d<   t                               ¦   «         }|j        rV|j        }t          t          |d         |                     dg ¦  «        z   ¦  «        ¦  «        |d<   t          |fi |¤Ž|_        n||_        | 	                    ¦   «         }|S )zn
    Add IDF global variables that need to be removed when the active esp-idf environment is deactivated.
    rÌ   ú:Nr  Úadd_paths_extras)
r×  r�   rO  r¤  r«  r§  r/  ry  r0  r™  )r2   r  Úargs_add_paths_extrasrª  Úexported_idf_varsr©  s         r    Ú add_variables_to_deactivate_filer  î  s9  € ð �ÐÐà+¨FÔ3×9Ò9¸#Ñ>Ô>¸sÀ¸sÔCˆ�VÑà'×+Ò+¨F°BÑ7Ô7€L�ÑÝ  ™JœJŸNšNÐ+=Ñ>Ô>ÐàCXÐrˆ�VÔÐ4×:Ò:¸3Ñ?Ô?Ñ?Ð?Ð^jÐkqÔ^rð �Ñõ ×*Ò*Ñ,Ô,€MàÔ"ð 3Ø)Ô7ÐÝ#¥C¨°VÔ(<Ð?P×?TÒ?TÐU[Ð]_Ñ?`Ô?`Ñ(`Ñ$aÔ$aÑbÔbˆ�VÑÝ&*Ð+<Ð&MÐ&MÀÐ&MÐ&MˆÔ#Ð#à&2ˆÔ#Ø(×-Ò-Ñ/Ô/ÐàÐr   c                 óˆ  ‡
‡— t                                ¦   «         }|j        sdS |j        Št          j        d¦  «        }|r4d                     ˆfd„|                     d¦  «        D ¦   «         ¦  «        }d„ ‰                     ¦   «         D ¦   «         }t          | ¦  «        \  Š
}|                     ˆ
fd„|D ¦   «         ¦  «        }t          | ¦  «        \  }}| 
                    d|¦  «        }|                     ||g¦  «        }	t          |	¦  «         |j                             ¦   «          |                     ¦   «          dS )zÂ
    Deactivate statement is sequence of commands, that remove IDF global variables from environment,
    so the environment gets to the state it was before calling export.{sh/fish} script.
    NrÌ   r  c                 ó(   •— g | ]}|‰d          v¯|‘ŒS ©rÌ   r   )rÇ   r¾  Ú
unset_varss     €r    rÈ   z.print_deactivate_statement.<locals>.<listcomp>  s*   ø€ Ð$cÐ$cÐ$c¨1ÀqÐPZÐ[aÔPbÐGbÐGb QÐGbÐGbÐGbr   c                 ó   — g | ]
}|d k    ¯|‘ŒS r  r   )rÇ   r¾  s     r    rÈ   z.print_deactivate_statement.<locals>.<listcomp>  s   € Ð>Ð>Ð>˜°!°v²+°+�!°+°+°+r   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   ©rÚ  )rÇ   r¾  Úunset_formats     €r    rÈ   z.print_deactivate_statement.<locals>.<listcomp>  s'   ø€ ÐKÐKÐK¸1 × 3Ò 3°AÑ 6Ô 6ÐKÐKÐKr   )r¤  r«  r§  r¬   rØ  r®   r×  rs  Úget_unset_format_and_separatorÚget_export_format_and_separatorrÚ  ÚprintÚclearr™  )r2   rª  Úenv_pathÚcleared_env_pathÚ
unset_listrÅ   Úunset_statementÚexport_formatÚexport_statementÚdeactivate_statement_strr  r  s             @@r    Úprint_deactivate_statementr+  	  sK  øø€ õ
 ×*Ò*Ñ,Ô,€MØÔ&ð ØˆØÔ,€JÝ œi¨Ñ/Ô/€HØð eØŸ8š8Ð$cÐ$cÐ$cÐ$c°·²¸sÑ0CÔ0CÐ$cÑ$cÔ$cÑdÔdÐà>Ð>˜ZŸ_š_Ñ.Ô.Ð>Ñ>Ô>€JÝ6°tÑ<Ô<Ñ€L�#Ø—h’hÐKÐKÐKÐKÀ
ÐKÑKÔKÑLÔL€Oå8¸Ñ>Ô>Ñ€M�3Ø$×+Ò+¨FÐ4DÑEÔEÐà"Ÿxšx¨Ð:JÐ(KÑLÔLÐå	Ð
"Ñ#Ô#Ð#àÔ×%Ò%Ñ'Ô'Ð'Ø×ÒÑÔÐØ
€Fr   c                 ó8   — t           dt          di| j                 S )zi
    Returns export pattern (formatted string) either for exporting in shell or as a key-value pair.
    )zexport {}="{}"ú;)z{}={}rS   ©ÚEXPORT_SHELLÚEXPORT_KEY_VALUErÚ  ©r2   s    r    r!  r!  &  s   € õ Ð1Õ3CÀ_ÐUÐVZÔVaÔbÐbr   c                 ó8   — t           dt          di| j                 S )zh
    Returns pattern to unset a variable (formatted string) either for shell or for key-value pair.
    )zunset {}r-  )z{}rS   r.  r1  s    r    r   r   -  s   € õ Ð+Õ-=¸|ÐLÈTÌ[ÔYÐYr   c                  óš   — 	 t          t          j        ¦  «        › dt          ¦   «         › �S # t          $ r dt          ¦   «         › �cY S w xY w)z¹
    Function returns unique id of running ESP-IDF combining current idfpath with version.
    The id is unique with same version & different path or same path & different version.
    z-vzUNKNOWN_PATH-v)rO   rU   r/   r}  rF   r   r   r    rˆ  rˆ  4  s^   € ð
4å•a”j‘/”/Ð8Ð8¥_Ñ%6Ô%6Ð8Ð8Ð8øÝð 4ð 4ð 4Ø3¥Ñ 1Ô 1Ð3Ð3Ð3Ð3Ð3ð4øøøs   ‚), ¬A
Á	A
c           
      óÔ  — t          ¦   «         }|                     ¦   «         D �]C\  }}|                     ¦   «         t          j        k    rŒ)|                     ¦   «         t          j        k    rdnd}t          d|› d|j        › |› �¦  «         	 |                     ¦   «          n# t          $ r Y nw xY wd„ |j
                             ¦   «         D ¦   «         }|st          dt          › d�¦  «         ŒÏt          |                     ¦   «         |j
        j        d¬	¦  «        }|D ]C}|j
        |         }t          d
                     ||j        ||j        v rdnd¦  «        ¦  «         ŒD�ŒEdS )z\
    Prints currently installed versions of all tools compatible with current platform.
    z (optional)r“   z* r¾  c                 óB   — i | ]\  }}|                      ¦   «         ¯||“ŒS r   ró  rM  s      r    rN  z list_default.<locals>.<dictcomp>N  ó/   € Ð hÐ hÐ h©$¨!¨QÈ1×KeÒKeÑKgÔKgÐ h  AÐ hÐ hÐ hr   z(  (no versions compatible with platform ú)Trþ  z  - {} ({}{})z, installedN)r¸  r(  ræ  r‘  r2  rF  r`   r•  r  rV  rª  r‚  r  rs  r�   rÚ  rc  rš  )	r2   r·  rC   r¼  Úoptional_strÚversions_for_platformÚversions_sortedrb  r
  s	            r    Úlist_defaultr;  @  s­  € õ !Ñ"Ô"€JØ ×&Ò&Ñ(Ô(ð ñ ‰
ˆˆdØ× Ò Ñ"Ô"¥gÔ&;Ò;Ð;ØØ(,×(=Ò(=Ñ(?Ô(?Å7ÔC]Ò(]Ð(]�}�}ÐceˆÝÐ:�$Ð:Ð:˜$Ô*Ð:¨LÐ:Ð:Ñ;Ô;Ð;ð	Ø×(Ò(Ñ*Ô*Ð*Ð*øÝð 	ð 	ð 	ØˆDð	øøøà hÐ h°$´-×2EÒ2EÑ2GÔ2GÐ hÑ hÔ hÐØ$ð 	ÝÐN½OÐNÐNÐNÑOÔOÐOØÝ Ð!6×!;Ò!;Ñ!=Ô!=À4Ä=ÔCTÐ^bÐcÑcÔcˆØ&ð 	ð 	ˆGØœ-¨Ô0ˆKÝØ×&Ò&Ø˜[Ô/À'ÈTÔMdÐBdÐBd°°Ðjlñô ñô ð ð ñ	ðð s   ÂB$Â$
B1Â0B1c                 ó¸  — t          ¦   «         }|                     ¦   «         D ]¶\  }}|                     ¦   «         t          j        k    rŒ(d„ |j                             ¦   «         D ¦   «         }|sŒN|                     ¦   «         }|sŒet          |                     ¦   «         |j        j	        d¬¦  «        d         }||k     rt          |› d|› d|› �¦  «         Œ·dS )za
    Prints info if currently installed version can be replaced by newer one for every tool.
    c                 óB   — i | ]\  }}|                      ¦   «         ¯||“ŒS r   ró  rM  s      r    rN  z!list_outdated.<locals>.<dictcomp>d  r6  r   Trþ  r   z
: version z is outdated by N)r¸  r(  ræ  r‘  r2  rª  r  r  rs  r�   r`   )r2   r·  rC   r¼  r9  Úversion_installedÚversion_availables          r    Úlist_outdatedr@  \  s  € õ !Ñ"Ô"€JØ ×&Ò&Ñ(Ô(ð \ð \‰
ˆˆdØ× Ò Ñ"Ô"¥gÔ&;Ò;Ð;ØØ hÐ h°$´-×2EÒ2EÑ2GÔ2GÐ hÑ hÔ hÐØ$ð 	ØØ ×9Ò9Ñ;Ô;ÐØ ð 	ØÝ"Ð#8×#=Ò#=Ñ#?Ô#?ÀTÄ]ÔEVÐ`dÐeÑeÔeÐfgÔhÐØÐ0Ò0Ð0Ý�DÐZÐZÐ$5ÐZÐZÐGXÐZÐZÑ[Ô[Ð[øð\ð \r   c                 óT   — | j         rt          | ¦  «         dS t          | ¦  «         dS )z´
    If args.outdated flag is set, prints if currently installed tools can be replaced by their newer version.
    If not, prints currently installed tools with their version.
    N)Úoutdatedr@  r;  r1  s    r    Úaction_listrC  o  s6   € ð
 „}ð Ý�dÑÔÐÐÐå�TÑÔÐÐÐr   c                 ó$  — t          ¦   «         }t          t                               ¦   «         |¦  «        }g }d}t	          d¦  «         |                     ¦   «         D ]ë\  }}|                     ¦   «         t          j        k    rŒ(d}t	          d|› �¦  «         	 | 	                    ¦   «          n# t          $ r d}Y nw xY w|j        rt	          d|j        › �¦  «         d}nt	          d¦  «         |j        D ]}t	          d|› �¦  «         d}Œ|s7|                     ¦   «         t          j        k    r|                     |¦  «         Œì|r4t          dd	                     |¦  «        › �¦  «         t#          d
¦  «        ‚|rt#          d
¦  «        ‚dS )zj
    Checks what tools are installed and if some mandatory tool is missing, exits with return code 1.
    FzChecking for installed tools...zChecking tool Tz    version found in PATH: z    no version found in PATHz*    version installed in tools directory: z-The following required tools were not found: r  r	   N)r¸  r  r†  r’  r`   r(  ræ  r‘  r2  r  rV  r™  rš  rE  r«   rZ   r®   r    )r2   r·  Únot_found_listr	  rC   r¼  Útool_found_somewhererb  s           r    Úaction_checkrG  z  sÔ  € õ !Ñ"Ô"€JÝ"¥6×#5Ò#5Ñ#7Ô#7¸ÑDÔD€JØ€NØ€JÝÐ	*Ñ+Ô+Ð+Ø ×&Ò&Ñ(Ô(ð (ð (‰
ˆˆdØ× Ò Ñ"Ô"¥gÔ&;Ò;Ð;ØØ$ÐÝÐ$˜dÐ$Ð$Ñ%Ô%Ð%ð	Ø×(Ò(Ñ*Ô*Ð*Ð*øÝð 	ð 	ð 	ØˆJˆJˆJð	øøøàÔð 	1ÝÐE¨tÔ/CÐEÐEÑFÔFÐFØ#'Ð Ð åÐ/Ñ0Ô0Ð0àÔ.ð 	(ð 	(ˆGÝÐG¸gÐGÐGÑHÔHÐHØ#'Ð Ð Ø#ð 	(¨×(=Ò(=Ñ(?Ô(?Å7ÔCYÒ(YÐ(YØ×!Ò! $Ñ'Ô'Ð'øØð ÝÐX¸c¿hºhÀ~Ñ>VÔ>VÐXÐXÑYÔYÐYÝ˜‰mŒmÐØð Ý˜‰mŒmÐðð s   ÂB/Â/B>Â=B>r¼  r3  Úversion_to_useÚprefer_system_hintc                 óæ   — |                       |¦  «        }|                      |¦  «        }| j        r=| j        | j        vr/t	          d| j        › d| j        › d�|z   t          j        ¬¦  «         ||fS )zP
    If there is unsupported tools version in PATH, prints info about that.
    z)Not using an unsupported version of tool ú found in PATH: r)   ©r]   )r¸  rÃ  r™  rª  r`   rC   rV   rW   )r¼  r3  rH  rI  Útool_export_pathsÚtool_export_varss         r    Ú!handle_recommended_version_to_userO  Ÿ  s”   € ð ×-Ò-¨nÑ=Ô=ÐØ×+Ò+¨NÑ;Ô;ÐØÔð 
 Ô 4¸D¼MÐ IÐ IÝØj¸¼	ÐjÐjÐSWÔSgÐjÐjÐjØ ñ!åŒjð	
ñ 	
ô 	
ð 	
ð
 Ð.Ð.Ð.r   c                 ój  — | j         | j                 }|j        t          j        k    rZt          d|› d| j        › d�t          j        ¬¦  «         t          d|                      ¦   «         › d�t          j        ¬¦  «         dS |j        t          j	        k    rt          d|› d| j        › �¦  «         dS dS )zb
    Prints info if supported, but not recommended or deprecated version of the tool is used.
    z"Using a supported version of tool rK  r)   rL  z#However the recommended version is z#using a deprecated version of tool N)rª  r™  rc  r^  r}  r`   rV   rW   rù  r~  r\   )r¼  r3  r
  s      r    Ú&handle_supported_or_deprecated_versionrQ  ´  sÉ   € ð #'¤-°Ô0DÔ"E€KØÔ�^Ô<Ò<Ð<ÝÐd°)ÐdÐdÈTÔMaÐdÐdÐdÕhkÔhrÐsÑsÔsÐsÝÐT°4×3OÒ3OÑ3QÔ3QÐTÐTÐTÕX[ÔXbÐcÑcÔcÐcÐcÐcØ	Ô	�~Ô?Ò	?Ð	?ÝÐd°9ÐdÐdÈdÔNbÐdÐdÑeÔeÐeÐeÐeð 
@Ð	?r   Úinstall_cmdc                 ó  — d| j         › d�}dt          j        v rt          |› d�¦  «         nt          |› d|› d�¦  «         | j        r:| j        | j        vr.t          d|› d| j        › d	�|z   t          j        ¬
¦  «         dS dS dS )zc
    Prints the info about missing tool to stderr if tool has no supported versions installed.
    rà  z has no installed versions.ÚNIX_PATHz… The environment indicates that you might be using NixOS. Please see https://nixos.wiki/wiki/ESP-IDF for how to install tools for it.z Please run 'z' to install it.zAn unsupported version of tool z was found in PATH: z. rL  N)	rC   r¬   rÍ   rZ   r™  rª  r`   rV   rW   )r¼  r3  rR  rI  r=  s        r    Úhandle_missing_versionsrU  Á  sá   € ð 9�$”)Ð
8Ð
8Ð
8€CØ•R”ZÐÐÝØð Zð Zð Zñ	
ô 	
ð 	
ð 	
õ
 	�Ð@Ð@ ;Ð@Ð@Ð@ÑAÔAÐAØÔð 
 Ô 4¸D¼MÐ IÐ IÝØe¨iÐeÐeÈTÔMaÐeÐeÐeØ ñ!åŒjð	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð
ð 
Ð IÐ Ir   c                 óV  — d}g }i }|                       ¦   «         }| j        s|r|                      |¦  «        }|||fS |r!|j        st	          | |||¦  «        \  }}|||fS | j        rO| j        | j        vr,|j        r$t          d| j        › d| j        › �¦  «         |||fS nt          | |¦  «         |||fS | j
        sh|                      ¦   «         t          j        k    rAt          j        dd¦  «        dk    rt          d|› d�¦  «         nt!          | |||¦  «         d	}|||fS |||fS )
zç
    Helper function used only in action export.
    Returns:
        * Paths that need to be exported.
        * Dictionary of environment variables that need to be exported for the tool.
        * Flag if any tool was found.
    Tz%using an unsupported version of tool rK  ÚIDF_SKIP_TOOLS_CHECKÚ0Ú1rÌ  zQ is not installed and IDF_SKIP_TOOLS_CHECK is set. This may cause build failures.F)r  r‡  rÃ  Úprefer_systemrO  r™  rª  r\   rC   rQ  rš  ræ  r‘  rE  r¬   rØ  rU  )	r¼  r3  r2   rR  rI  Ú
tool_foundrM  rN  Úrecommended_version_to_uses	            r    Úprocess_toolr]  Õ  s¹  € ð €JØ#%ÐØ')Ðà!%×!EÒ!EÑ!GÔ!GÐàÔð ?Ð"<ð ?Ø×/Ò/Ð0JÑKÔKÐØ Ð"2°JÐ>Ð>à!ð ?¨$Ô*<ð ?Ý.OØ�)Ð7Ð9Kñ/
ô /
Ñ+ÐÐ+ð !Ð"2°JÐ>Ð>àÔð CØÔ t¤}Ð4Ð4àÔ!ð ÝÐn¸T¼YÐnÐnÐX\ÔXlÐnÐnÑoÔoÐoØ(Ð*:¸JÐFÐFð õ 3°4¸ÑCÔCÐCØ$Ð&6¸
ÐBÐBàÔ"ð 
?Ø× Ò Ñ"Ô"¥gÔ&<Ò<Ð<ÝŒyÐ/°Ñ5Ô5¸Ò<Ð<ÝØx˜IÐxÐxÐxñô ð ð õ (¨¨i¸ÐFXÑYÔYÐYØ"�
à Ð"2°JÐ>Ð>àÐ.°
Ð:Ð:r   rÜ  rÐ  c           	      ó   — 	 t          t          j                             | t          ¦  «        dd¬¦  «        5 }|                     ¦   «                              ¦   «         }d d d ¦  «         n# 1 swxY w Y   ||k    r(t          d| › d|› d|› d�¦  «         t          d¦  «        ‚d S # t          $ r}t          d	|› d
�¦  «         Y d }~d S d }~ww xY w)NrÔ  rÍ  rÕ  zPython environment is set to z! which was generated for ESP-IDF z instead of the current zü. The issue can be solved by (1) removing the directory and re-running the install script, or (2) unsetting the IDF_PYTHON_ENV_PATH environment variable, or (3) re-runing the install script from a clean shell where an ESP-IDF environment is not active.r	   zaThe following issue occurred while accessing the ESP-IDF version file in the Python environment: z.. (Diagnostic information. It can be ignored.))r~   r¬   r­   r®   ÚVENV_VER_FILEr�   ÚstriprZ   r    rë   r\   )rÜ  rÐ  r]   Úread_idf_versionr¡   s        r    Úcheck_python_venv_compatibilityrb  	  se  € ð
Ý•"”'—,’,Ð2µMÑBÔBÀCÐRYÐZÑZÔZð 	0Ð^_Ø Ÿvšv™xœxŸ~š~Ñ/Ô/Ðð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0à˜{Ò*Ð*ÝðÐ0Cð ð Ø+ðð ØEPðð ð ñô ð õ ˜Q‘-”-Ðð +Ð*øõ ð 
ð 
ð 
åð;Ðpqð ;ð ;ð ;ñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøs:   ‚5B% ·'A*ÁB% Á*A.Á.B% Á1A.Á21B% Â%
CÂ/CÃCc                 óÞ  ‡— | j         rt          | ¦  «         dS t          ¦   «         }t          t                               ¦   «         |¦  «        }d}i }g }t          j        › dt          › | j	        rdnd› �}t          |g¦  «        d         }t          rdnd|› d�}t          rt          t          g¦  «        d         n|› d	�}|                     ¦   «         D ]N\  }}	|	                     ¦   «         t          j        k    rŒ(t#          |	|| ||¦  «        \  }
}}|sd
}||
z  }i |¥|¥}ŒO|st%          d¦  «        ‚t'          j        d¦  «        }t+          ¦   «         \  }}}}t&          j                             |¦  «        rrt          |g¦  «        d         }t'          j        d¦  «        |k    rt          |g¦  «        d         |d<   |r)t          j        dk    s||vr|                     |¦  «         t5          ¦   «         }t'          j        d¦  «        |k    r||d<   t7          ||¦  «         t&          j                             t:          j        d¦  «        }t          |g¦  «        d         }|r)t          j        dk    s||vr|                     |¦  «         t          j        dk    rd}d}nd}d}t?          | ¦  «        \  Š}|rµ|                     t          |¦  «        |gz   ¦  «        |d<   t          j        dk    r||d         › t&          j         d         › �}	 | !                    d¦  «        | !                    d¦  «        k     rtE          d¦  «         n## tF          $ r tI          d|› d�¦  «         Y nw xY w|rutK          | | &                    ¦   «         ¦  «        }||tN          j(        <   |                     ˆfd„|                     ¦   «         D ¦   «         ¦  «        }tS          |¦  «         dS dS )zV
    Exports all necessary environment variables and paths needed for tools used.
    NTr  z --tools-json {args.tools_json}r“   r   z To use it, run 'z export --prefer-system'z installFr	   rÌ   rÖ  re   ÚESP_IDF_VERSIONr°  z%PATH%r-  z$PATHr  z\tools;z\idf-exezIThe PATH is not in correct order (idf-exe should be before esp-idf\tools)zMBoth of the directories (..\idf-exe\.. and ..\tools) has to be in the PATH:

rS   c                 óB   •— g | ]\  }}‰                      ||¦  «        ‘ŒS r   r  )rÇ   r¾  r¿  r(  s      €r    rÈ   z!action_export.<locals>.<listcomp>y	  s-   ø€ Ð,hÐ,hÐ,hÉDÈAÈq¨]×-AÒ-AÀ!ÀQÑ-GÔ-GÐ,hÐ,hÐ,hr   )*Ú
deactivater+  r¸  r  r†  r’  rV   rg   Ú__file__r1   rÊ   ÚIDF_TOOLS_EXPORT_CMDr'   r(  ræ  r‘  r2  r]  r    r¬   rØ  rß  r­   r¯   rf   r«   r}  rb  r®   rU   r/   r!  rÍ   r6  r\   r‹   rZ   r  rÎ   r¤  r³  r"  )r2   r·  Úall_tools_foundrŠ  Úpaths_to_exportÚself_restart_cmdrI  rR  rC   r¼  rM  rN  r[  Úcurrent_pathrÜ  rÝ  rÞ  r=   rÐ  Úidf_tools_dirÚold_pathÚpath_sepÚ
export_sepÚpaths_to_checkr©  Úexport_statementsr(  s                             @r    Úaction_exportrs  "	  s�  ø€ ð „ð Ý" 4Ñ(Ô(Ð(Øˆå Ñ"Ô"€JÝ"¥6×#5Ò#5Ñ#7Ô#7¸ÑDÔD€JØ€OØ"$€KØ€Oåœ.ÐuÐu­8ÐuÐ\`Ô\kÐ5sÐ6WÐ6WÐqsÐuÐuÐÝ.Ð0@Ð/AÑBÔBÀ1ÔEÐÝ3Ðw˜˜Ð9wÐM]Ð9wÐ9wÐ9wÐå?TÐwÕÕ!6Ð 7Ñ8Ô8¸Ô;Ð;Ð]mÐZwÐZwÐZwð ð !×&Ò&Ñ(Ô(ð 	:ð 	:‰
ˆˆdØ× Ò Ñ"Ô"¥gÔ&;Ò;Ð;ØÝ:FØ�$˜˜kÐ+=ñ;
ô ;
Ñ7ÐÐ+¨Zð ð 	$Ø#ˆOØÐ,Ñ,ˆØ9˜Ð9Ð(8Ð9ˆˆàð Ý˜‰mŒmÐå”9˜VÑ$Ô$€LÝH[ÑH]ÔH]ÑEÐÐ/Ð1BÀAÝ	„w‡~‚~Ð'Ñ(Ô(ð ?Ý5Ð7JÐ6KÑLÔLÈQÔOÐÝŒ9Ð*Ñ+Ô+Ð/BÒBÐBÝ1HÐJ]ÐI^Ñ1_Ô1_Ð`aÔ1bˆKÐ-Ñ.Øð 	?åŒ|˜wÒ&Ð&Ð*@ÈÐ*TÐ*TØ×&Ò&Ð'=Ñ>Ô>Ð>å!Ñ#Ô#€KÝ	„yÐ"Ñ#Ô# {Ò2Ð2Ø)4ˆÐ%Ñ&å#Ð$7¸ÑEÔEÐEå”G—L’L¥¤¨WÑ5Ô5€MÝ+¨]¨OÑ<Ô<¸QÔ?€MØð 2åŒ<˜7Ò"Ð" m¸<Ð&GÐ&GØ×"Ò" =Ñ1Ô1Ð1å
„|�wÒÐØˆØˆˆàˆØˆå ?ÀÑ EÔ EÑ€M�:àð Ø&ŸmšmÕ,CÀOÑ,TÔ,TÐX`ÐWaÑ,aÑbÔbˆ�FÑõ Œ<˜7Ò"Ð"Ø!,¨VÔ!4ÐJµb´jÀÔ6HÐJÐJˆNðØ!×'Ò'¨
Ñ3Ô3°n×6JÒ6JÈ;Ñ6WÔ6WÒWÐWÝÐeÑfÔfÐføøÝð ð ð ÝðDØ1?ðDð Dð Dñô ð ð ð ðøøøð ð !å?ÀÀk×FVÒFVÑFXÔFXÑYÔYÐØ(<ˆ•HÔ$Ñ%Ø&ŸOšOÐ,hÐ,hÐ,hÐ,hÐT_×TeÒTeÑTgÔTgÐ,hÑ,hÔ,hÑiÔiÐÝÐÑ Ô Ð Ð Ð ð!ð !s   Ì;M ÍM3Í2M3Údownload_urlc                 óD   — t          | |¦  «        }t          |¦  «        }|S )zÄ
    Returns URL for ESP-IDF download with applied mirrors if available.
    If original URL pointed to Github and IDF_GITHUB_ASSETS is set, change the source to Espressif's download servers.
    )Úapply_mirror_prefix_mapÚapply_github_assets_option)r2   rt  r	  s      r    Ú"get_idf_download_url_apply_mirrorsrx  }	  s%   € õ
 " $¨Ñ
5Ô
5€CÝ
$ SÑ
)Ô
)€CØ€Jr   Úidf_download_urlc                 óØ  — |}d}t          j        d¦  «        }|r|                     d¦  «        }t          r!| r| j        r|rt          d¦  «         | j        }|r�|D ]�}t          |vrt          dt          › d|› �¦  «         Œ&|                     t          d¦  «        \  }}|                     dd	¦  «        }t          j	        |||¦  «        }||k    rt          d
|› d|› �¦  «          nŒŽ|S )z‰
    Rewrite URL for given idf_download_url.
    If --mirror-prefix-map flag or IDF_MIRROR_PREFIX_MAP environment variable is given.
    NÚIDF_MIRROR_PREFIX_MAPr-  z…Both IDF_MIRROR_PREFIX_MAP environment variable and --mirror-prefix-map flag are specified, will use the value from the command line.z)invalid mirror-prefix-map item (missing 'z') r	   rº  r»  zChanged download URL: ú => )r¬   rØ  r×  r$   Úmirror_prefix_mapr\   ÚURL_PREFIX_MAP_SEPARATORrÆ   r  r¼  r`   )r2   ry  Únew_urlr}  Úmirror_prefix_map_envrí  rÆ  rÆ   s           r    rv  rv  ‡	  sA  € ð
 €GØÐÝœIÐ&=Ñ>Ô>ÐØð =Ø1×7Ò7¸Ñ<Ô<ÐÝð 3˜$ð 3 4Ô#9ð 3Øð 	Ýð<ñô ð ð !Ô2ÐØð 
Ø%ð 		ð 		ˆDÝ'¨tÐ3Ð3ÝÐdÕAYÐdÐdÐ^bÐdÐdÑeÔeÐeØØ"ŸjšjÕ)AÀ1ÑEÔE‰OˆF�GØ—o’o d¨FÑ3Ô3ˆGÝ”f˜V WÐ.>Ñ?Ô?ˆGØÐ*Ò*Ð*ÝÐMÐ.>ÐMÐMÀGÐMÐMÑNÔNÐNØ�ð +ð €Nr   c                 óN  — | }t           j                             dd¦  «                             ¦   «         }|s|S d|v rt	          d¦  «         t          d¦  «        ‚|                     d¦  «        }t          j        dd|› d�| ¦  «        }|| k    rt          d	| › d
|› �¦  «         |S )zÂ
    Rewrite URL for given idf_download_url if the download URL is an https://github.com/ URL and the variable
    IDF_GITHUB_ASSETS is set. The github.com part of the URL will be replaced.
    ÚIDF_GITHUB_ASSETSr“   z://zJIDF_GITHUB_ASSETS shouldn't include any URL qualifier, https:// is assumedr	   rÄ   z^https://github.com/úhttps://z$Using GitHub assets mirror for URL: r|  )
r¬   rÍ   r�   r`  rZ   r    Úrstripr  r¼  r`   )ry  r  Úgithub_assetss      r    rw  rw  ¦	  sÇ   € ð
 €GÝ”J—N’NÐ#6¸Ñ;Ô;×AÒAÑCÔC€MØð àˆð �ÐÐÝÐZÑ[Ô[Ð[Ý˜‰mŒmÐð "×(Ò(¨Ñ-Ô-€MåŒfÐ,Ð.I¸Ð.IÐ.IÐ.IÐK[Ñ\Ô\€GØÐ"Ò"Ð"ÝÐSÐ4DÐSÐSÈ'ÐSÐSÑTÔTÐTØ€Nr   Úselected_platformr-   c                 óŠ  — 	 t           j        }|t           _        t          ¦   «         }t          ¦   «         }|                     ¦   «         D ]\  }}|                     | ¦  «        }	|	||<   Œ t          |||¦  «        }t          d| › dd                     |¦  «        › �¦  «         |t           _        n# |t           _        w xY w||fS )a  
    Returns tools_spec list and dict of tools for selected platform in form tool_name : IDFTool object.
    NOTE: If this function is not called from action_download, but is used just for detecting active tools,
          info about downloading is unwanted.
    zDownloading tools for r¾  rB  )	rU   r-   r¸  r   r(  r¢  rñ  r`   r®   )
r†  ré  rä  r-   Úold_global_quietr·  Útools_info_for_platformrC   r5  Útool_for_platforms
             r    Ú get_tools_spec_and_platform_infor‹  ¿	  sÔ   € ð#Ýœ7ÐØ�ŒÝ$Ñ&Ô&ˆ
Ý"-¡-¤-ÐØ(×.Ò.Ñ0Ô0ð 	>ð 	>‰NˆD�(Ø (× :Ò :Ð;LÑ MÔ MÐØ,=Ð# DÑ)Ð)å% jÐ2IÈ7ÑSÔSˆ
ÝÐRÐ&7ÐRÐR¸4¿9º9ÀZÑ;PÔ;PÐRÐRÑSÔSÐSà"�ŒˆøÐ"�ŒÐ"Ð"Ð"Ð"àÐ.Ð.Ð.s   ‚B!B0 Â0B>c                 ó.  — t          | j        ¦  «        }g }d|v sd|v r�t                               ¦   «         }t	          || j        ¦  «        }	 |                     ¦   «          n`# t          $ r?}| j        |v r|                     | j        ¦  «         t          d|› �¦  «         Y d}~nd}~ww xY wt          | j        ¦  «        }t          | j        ¦  «        }t          |||¦  «        \  }}|D �]&}d|vr|}d}	n|                     dd¦  «        \  }}	||vr!t          d|› �¦  «         t!          d¦  «        ‚||         }
|	�-|	|
j        vr$t          d|› d	|	› �¦  «         t!          d¦  «        ‚|	€|
                     ¦   «         }	|	€%t          d
|› d|› d�¦  «         t!          d¦  «        ‚|› d|	› �}t'          d|› �¦  «         |
j        |	                              |¦  «        }t+          | |j        ¦  «        |_        |
                     |	¦  «         �Œ(dS )zñ
    Saves current IDF environment and for every tools in tools_spec,
    downloads the right archive for tools version and target platform, if possible.
    If not, prints appropriate message to stderr and raise SystemExit() exception.
    râ  rï  z=Downloading tools for targets was not successful with error: Nrï  r	   úunknown tool name: úunknown version for tool r¾  rà  z not found for z	 platformr%  )rã  r°  r†  r’  rû  ré  r™  rë   rl  r\   rù  r¢   rf   r‹  r×  rZ   r    rª  rù  r`   ru  rx  r	  r0  )r2   rä  ré  rž  ra   rf   r‰  Ú	tool_specr3  Útool_versionr5  Ú_idf_tool_objs               r    Úaction_downloadr’  Ù	  sŠ  € õ ! ¤Ñ,Ô,€Jà€Gà�ZÐÐ 5¨JÐ#6Ð#6Ý×(Ò(Ñ*Ô*ˆÝ'¨°T´\ÑBÔBˆð	XØ×ÒÑÔÐÐøÝð 	Xð 	Xð 	XØŒ|˜wÐ&Ð&Ø—’˜tœ|Ñ,Ô,Ð,ÝÐVÐQTÐVÐVÑWÔWÐWÐWÐWÐWÐWÐWøøøøð	Xøøøõ $ D¤LÑ1Ô1ˆå! $¤-Ñ0Ô0€Hå*JÈ8ÐU\Ð^hÑ*iÔ*iÑ'€JÐ'Øð (ñ (ˆ	Ø�iÐÐØ!ˆIØˆLˆLà&/§o¢o°c¸1Ñ&=Ô&=Ñ#ˆI�|ØÐ3Ð3Ð3ÝÐ3¨	Ð3Ð3Ñ4Ô4Ð4Ý˜Q‘-”-ÐØ*¨9Ô5ˆØÐ#¨¸HÔ<MÐ(MÐ(MÝÐI¨iÐIÐI¸<ÐIÐIÑJÔJÐJÝ˜Q‘-”-ÐØÐØ#×;Ò;Ñ=Ô=ˆLØÐÝÐG˜)ÐGÐG°HÐGÐGÐGÑHÔHÐHÝ˜Q‘-”-ÐØ Ð1Ð1 <Ð1Ð1ˆ	åÐ'˜IÐ'Ð'Ñ(Ô(Ð(Ø Ô)¨,Ô7×QÒQÐRZÑ[Ô[ˆÝ>¸tÀ]ÔEVÑWÔWˆÔà×Ò˜,Ñ'Ô'Ð'Ñ'ð1(ð (s   ÁA# Á#
B,Á-5B'Â'B,c                 óÐ  — t          | j        ¦  «        }g }d|v sd|v r¶t                               ¦   «         }t	          || j        ¦  «        }	 |                     ¦   «          nL# t          $ r?}| j        |v r|                     | j        ¦  «         t          d|› �¦  «         Y d}~nd}~ww xY wt          dd                     |¦  «        › �¦  «         nt          | j        ¦  «        }t          dt          › �¦  «         t          ¦   «         }t          |||¦  «        }t          dd                     |¦  «        › �¦  «         |D �]ž}d	|vr|}d}n|                     d	d
¦  «        \  }}||vr!t#          d|› �¦  «         t%          d
¦  «        ‚||         }	|	                     ¦   «         s)t#          d|› dt          › �¦  «         t%          d
¦  «        ‚|�-||	j        vr$t#          d|› d|› �¦  «         t%          d
¦  «        ‚|€|	                     ¦   «         }|€J ‚	 |	                     ¦   «          n# t.          $ r Y nw xY w|› d	|› �}||	j        v rt          d|› d�¦  «         �Œ#t          d|› �¦  «         |	j        |                              t4          ¦  «        }
t7          | |
j        ¦  «        |
_        |	                     |¦  «         |	                     |¦  «         �Œ dS )z¯
    Saves current IDF environment and for every tool in tools_spec,
    installs the tool from the archive downloaded before, if possible.
    If not, raises SystemExit.
    râ  rï  z2Installing targets was not successful with error: NzSelected targets are: rB  zCurrent system platform: zInstalling tools: rï  r	   r�  rà  z1 does not have versions compatible with platform rŽ  r¾  z	Skipping z (already installed)zInstalling )rã  r°  r†  r’  rû  ré  r™  rë   rl  r\   r`   r®   rù  r�   r¸  rñ  r×  rZ   r    rw  rª  rù  r  rV  rš  ru  r‚  rx  r	  r0  r‹  )r2   rä  ré  rž  ra   r·  r�  r3  r�  r5  r‘  s              r    Úaction_installr”  
  sq  € õ ! ¤Ñ,Ô,€Jà€Gà�ZÐÐ 5¨JÐ#6Ð#6Ý×(Ò(Ñ*Ô*ˆÝ'¨°T´\ÑBÔBˆð	MØ×ÒÑÔÐÐøÝð 	Mð 	Mð 	MØŒ|˜wÐ&Ð&Ø—’˜tœ|Ñ,Ô,Ð,ÝÐKÀcÐKÐKÑLÔLÐLÐLÐLÐLÐLÐLøøøøð	Møøøõ 	Ð: d§i¢i°Ñ&8Ô&8Ð:Ð:Ñ;Ô;Ð;Ð;õ $ D¤LÑ1Ô1ˆåÐ	7Õ%5Ð	7Ð	7Ñ8Ô8Ð8Ý Ñ"Ô"€JÝ! *¨j¸'ÑBÔB€JÝÐ	5˜dŸiši¨
Ñ3Ô3Ð	5Ð	5Ñ6Ô6Ð6Øð !'ñ !'ˆ	Ø�iÐÐØ!ˆIØˆLˆLà&/§o¢o°c¸1Ñ&=Ô&=Ñ#ˆI�|Ø˜JÐ&Ð&ÝÐ3¨	Ð3Ð3Ñ4Ô4Ð4Ý˜Q‘-”-ÐØ˜iÔ(ˆØ×0Ò0Ñ2Ô2ð 	 ÝÐh˜)ÐhÐhÕVfÐhÐhÑiÔiÐiÝ˜Q‘-”-ÐØÐ#¨¸HÔ<MÐ(MÐ(MÝÐI¨iÐIÐI¸<ÐIÐIÑJÔJÐJÝ˜Q‘-”-ÐØÐØ#×;Ò;Ñ=Ô=ˆLØÐ'Ð'Ð'ð	Ø×,Ò,Ñ.Ô.Ð.Ð.øÝð 	ð 	ð 	ØˆDð	øøøà Ð1Ð1 <Ð1Ð1ˆ	Ø˜8Ô6Ð6Ð6ÝÐ<˜YÐ<Ð<Ð<Ñ=Ô=Ð=ÙåÐ&˜9Ð&Ð&Ñ'Ô'Ð'Ø Ô)¨,Ô7×QÒQÕRaÑbÔbˆÝ>¸tÀ]ÔEVÑWÔWˆÔà×Ò˜,Ñ'Ô'Ð'Ø×Ò˜Ñ&Ô&Ð&Ñ&ðC!'ð !'s*   ÁA# Á#
B,Á-5B'Â'B,ÈH4È4
IÉ Ic                  óÞ   — t          ¦   «         } d}|| vrdS | |         }|                     ¦   «         }|€dS |                     |¦  «        }t          j                             |¦  «        sdS |S )z2
    Gets path for idf-python-wheels package.
    zidf-python-wheelsN)r¸  rù  r³  r¬   r­   r¯   )r·  Úwheels_package_nameÚwheels_packageÚrecommended_versionÚ
wheels_dirs        r    Úget_wheels_dirrš  N
  s‚   € õ !Ñ"Ô"€JØ-ÐØ *Ð,Ð,ØˆtØÐ 3Ô4€NØ(×@Ò@ÑBÔBÐØÐ"ØˆtØ×4Ò4Ð5HÑIÔI€JÝŒ7�>Š>˜*Ñ%Ô%ð ØˆtØÐr   r  c                 ó  — t                                ¦   «         }t          || ¦  «        }	 |                     ¦   «          nB# t          $ r5}| |v r|                     | ¦  «         t          d|› �¦  «         Y d}~nd}~ww xY wd„ |D ¦   «         S )zK
    Returns list of path for requirements.txt for given feature list.
    z1Updating features was not successful with error: Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r   )rv  r  s     r    rÈ   z$get_requirements.<locals>.<listcomp>l
  s!   € ÐJÐJÐJ°gÕ(¨Ñ1Ô1ÐJÐJÐJr   )r†  r’  r
  r™  rë   rl  r\   )r  rž  rZ  ra   s       r    Úget_requirementsr�  `
  s¼   € õ ×$Ò$Ñ&Ô&€KÝ)¨+°|ÑDÔD€HðHØ×ÒÑÔÐÐøÝð Hð Hð HØ˜8Ð#Ð#Ø�OŠO˜LÑ)Ô)Ð)ÝÐFÀÐFÐFÑGÔGÐGÐGÐGÐGÐGÐGøøøøðHøøøð KÐJÀÐJÑJÔJÐJs   «A  Á 
A?Á
+A:Á:A?TÚonlinec                 ó&  — t          ¦   «         }d| › d�}t          j                             t          j        |¦  «        }d                     ||g¦  «        }|› d�}|sBt          j                             |¦  «        r|S t          |› d�¦  «         t          d¦  «        ‚t          t          j         
                    |¦  «        ¦  «         	 t          j                             ¦   «         t          j                             t          j                             |¦  «        ¦  «        z
  }|t          j        d¬¦  «        k     rt#          d|› d	�¦  «         |S n# t$          $ r Y nw xY wt'          t(          ¦  «        D ]Ÿ}t+          ||¦  «        }	t          j                             |¦  «        s(t-          d
|	› �¦  «         t-          d|› d|› �¦  «         ŒYt          j                             |¦  «        rt          j        |¦  «         t1          ||¦  «         |c S t          j                             |¦  «        rt-          d¦  «         |S t          d¦  «         t3          t5          |	¦  «        ¦  «         t#          d¦  «         t          d¦  «        ‚)z¦
    Download constraints file for specified IDF vversion if it was not downloaded recently (1 day),
    check success and place it in constraints file location.
    zespidf.constraints.vrþ  rÄ   rA  z~ doesn't exist. Perhaps you've forgotten to run the install scripts. Please check the installation guide for more information.r	   )ÚdayszSkipping the download of z$ because it was downloaded recently.r  r  ró   zRFailed to download, retry count has expired, using a previously downloaded versionr  zNSee the help on how to disable constraints in order to work around this issue.)rx  r¬   r­   r®   rU   r0   r  rZ   r    rð   r  ÚdatetimeÚdateÚtodayÚfromtimestampÚgetmtimeÚ	timedeltar`   rë   r7  r  r0  r\   rl  r>  rh   rO   )
rÐ  rž  ry  Úconstraint_fileÚconstraint_pathÚconstraint_urlÚ	temp_pathÚager=   ra   s
             r    Úget_constraintsr¬  o
  s“  € õ
 :Ñ;Ô;ÐØ>¨[Ð>Ð>Ð>€OÝ”g—l’l¥1Ô#3°_ÑEÔE€OØ—X’XÐ/°ÐAÑBÔB€NØ"Ð(Ð(Ð(€Iàð  ÝŒ7�>Š>˜/Ñ*Ô*ð 	 Ø"Ð"åØ"ð Mð Mð Mñô ð õ ˜Q‘-”-Ðå�BŒG�OŠO˜IÑ&Ô&Ñ'Ô'Ð'ðÝŒm×!Ò!Ñ#Ô#¥h¤m×&AÒ&AÅ"Ä'×BRÒBRÐSbÑBcÔBcÑ&dÔ&dÑdˆØ•Ô#¨Ð+Ñ+Ô+Ò+Ð+ÝÐb¨_ÐbÐbÐbÑcÔcÐcØ"Ð"ð ,øõ ð ð ð àˆðøøøõ Õ'Ñ(Ô(ð 
ð 
ˆÝ�~ yÑ1Ô1ˆÝŒw�~Š~˜iÑ(Ô(ð 	ÝÐ+ cÐ+Ð+Ñ,Ô,Ð,ÝÐF ~ÐFÐF¸9ÐFÐFÑGÔGÐGØÝŒ7�>Š>˜/Ñ*Ô*ð 	'åŒI�oÑ&Ô&Ð&Ý˜) _Ñ5Ô5Ð5ØÐÐÐå	„w‡~‚~�oÑ&Ô&ð ÝÐaÑbÔbÐbØÐåÐ?Ñ@Ô@Ð@Ý%¥c¨#¡h¤hÑ/Ô/Ð/ÝÐ]Ñ^Ô^Ð^Ý˜‰mŒmÐs   ÃBE Å
E#Å"E#c           	      óJ  — 	 t          j        t          j        dddg¦  «         n?# t           j        $ r- t          dt          j        › d�¦  «         t          d¦  «        ‚w xY wd}	 dd	l}n\# t          $ rO t          d
¦  «         t          j        t          j        dddddgt          j
        t          j        ¬¦  «         d}Y nw xY wd}|sr	 t          |j                             d¦  «        d         ¦  «        }|dk     rt          d|j        › d�¦  «         d}n## t           t"          t$          t&          f$ r Y nw xY wt          d| › �¦  «         dt          j        g}|r|ddgz  }t          j        t          j        ddg|¢| ‘t          j
        t          j        ¬¦  «         d	S )zå
    Checks if pip is installed (and installs it if not),
    checks whether virtualenv is already installed (and in which version),
    and finally creates virtual environment with python -m virtualenv <virtualenv_options>.
    ú-mÚpipú	--versionzPython interpreter at zx doesn't have pip installed. Please check the Getting Started Guides for the steps to install prerequisites for your OS.r	   Fr   NzInstalling virtualenvr‹  z--userÚ
virtualenv©r_   rW   Tr)   r5  zVirtualenv version z% is old, please consider upgrading itz6Creating a new Python environment using virtualenv in z--pythonz--seeder)r±   Ú
check_callrV   rg   r¸   rZ   r    r±  ÚImportErrorr`   r_   rW   r   Ú__version__r×  r\   r‹   Ú	NameErrorrG   Ú
IndexError)r­   Úvirtualenv_installed_via_pipr±  Úwith_seeder_optionÚ	major_verÚvirtualenv_optionss         r    Ú install_legacy_python_virtualenvr¼  ¥
  s  € ðÝÔ�sœ~¨t°U¸KÐHÑIÔIÐIÐIøÝÔ(ð ð ð Ýðj¥S¤^ð jð jð jñ	
ô 	
ð 	
õ ˜‰mŒmÐðøøøð $)Ð ð,ØÐÐÐÐøÝð ,ð ,ð ,ÝÐ$Ñ%Ô%Ð%ÝÔÝŒ^˜T 5¨)°X¸|ÐLÕUXÔU_ÕhkÔhrð	
ñ 	
ô 	
ð 	
ð (,Ð$Ð$Ð$ð,øøøð ÐØ'ð 	ð	Ý˜JÔ2×8Ò8¸Ñ=Ô=¸aÔ@ÑAÔAˆIØ˜2Š~ˆ~ÝÐh¨:Ô+AÐhÐhÐhÑiÔiÐiØ%*Ð"øøÝ�I¥~µzÐBð 	ð 	ð 	ØˆDð	øøøõ 	Ð	HÀ$Ð	HÐ	HÑIÔIÐIØ$¥c¤nÐ5ÐØð 2Ø˜z¨5Ð1Ñ1ÐåÔÝ	Œ˜˜|ÐGÐ.@ÐGÀ$ÐGÕPSÔPZÕcfÔcmðñ ô ð ð ð s/   ‚"% ¥<A!Á'A, Á,ACÃCÃAD ÄD;Ä:D;c           	      ó
  — | j          }| j        }t          ¦   «         \  }}}}t          j                             d¦  «        }|duo=t          j                             |¦  «        ot          j	                             |¦  «        }| oCt          t          d¦  «        p.t          t          d¦  «        ot          j        t          j	        k    }	|	r?t          j                             |¦  «        r|rt          d¦  «         t          d¦  «        ‚t          j                             |¦  «        �r
	 t          j        |dgt          j        t          j        ¬¦  «         n# t&          t          j        f$ r d	}Y nw xY w	 t          j        |d
ddgt          j        t          j        ¬¦  «         n&# t          j        $ r t+          d¦  «         d	}Y nw xY wt          j        dk    rV	 t          j        |ddgt          j        t          j        ¬¦  «         n&# t          j        $ r t+          d¦  «         d	}Y nw xY w|rEt          j                             |¦  «        r&t+          d|› �¦  «         t/          j        |¦  «         t          j                             |¦  «        rt3          ||¦  «         �nxt          j        t          j        d
ddgdt          j        t          j        ¬¦  «        j        dk    �r%g }
t=          d|› �¦  «         	 t          j        d         }|                     t@           !                    |tD          ¦  «        ¦  «        }|sLtG          j$        t@           !                    dd¦  «        |¦  «        rt+          d|› d|› dtD          › d�¦  «         t          j                             t          j         %                    |tL          ¦  «        ¦  «        s.tG          j$        t@           !                    dd¦  «        |¦  «        r|
 '                    d¦  «         n't          j(        |¦  «        rt=          d|› d�¦  «         n# tR          $ r Y nw xY wt          j        t          j        d
dg|
¢|‘t          j        t          j        ¬¦  «         	 tU          t          j         %                    |tL          ¦  «        d d!¬"¦  «        5 }| +                    |¦  «         ddd¦  «         n# 1 swxY w Y   n.# t&          $ r t+          d#¦  «         Y nw xY wtY          |¦  «         t          j         -                    ¦   «         }d$|d%<   |rt]          |¦  «        nd}t=          d&¦  «         |d
dd'd(dg}|r|d)|gz  }t          j        |t          j        t          j        |¬*¦  «         t=          d+¦  «         |d
dd'd(d,g}|r|d)|gz  }t          j        |t          j        t          j        |¬*¦  «         |d
dd'd-g}t_          | j0        ¦  «        }|D ]	}|d.|gz  }Œ
|r|d(d)|gz  }| j1        r|d/| j1        gz  }| j2        r|d0gz  }| j3        r|d1| j3        gz  }ti          ¦   «         }|�|d/|gz  }t=          d2¦  «         |rt=          d3|› �¦  «         t=          d4¦  «         t=          t          j5         %                    d5„ |D ¦   «         ¦  «        ¦  «         t          j        |t          j        t          j        |¬*¦  «         dS )6zð
    (Re)installs python virtual environment.
    If Python virtualenv is already installed, checks for errors (missing/corrupted python interpreter, pip...)
    and reinstalls if needed. Removes current virtualenv before reinstalling.
    Ú	NIX_STORENÚreal_prefixÚbase_prefixz]This script was called from a virtual environment, can not create a virtual environment againr	   r°  r²  Tr®  r¯  zbpip is not available in the existing virtual environment, new virtual environment will be created.re   ú-czimport curseszDcurses can not be imported, new virtual environment will be created.z,Removing the existing Python environment in Úvenvz-hF)r¨   r_   rW   r   z%Creating a new Python environment in rÖ  z\d+\.\d+zIDF_PYTHON_ENV_PATH is set to z$ but it does not match the detected z! ESP-IDF version and/or the used zµ version of Python. If you have not set IDF_PYTHON_ENV_PATH intentionally then it is recommended to re-run this script from a clean shell where an ESP-IDF environment is not active.z--clearz¢, but it does not appear to be an ESP-IDF Python virtual environment directory. Existing data in this folder will be preserved to prevent unintentional data loss.r‘  rÍ  rÕ  z“The following issue occurred while generating the ESP-IDF version file in the Python environment: {e}. (Diagnostic information. It can be ignored.)ÚnoÚPIP_USERzUpgrading pip...r‹  z	--upgradez--constraint)r_   rW   ÚenvzUpgrading setuptools...Ú
setuptoolsz--no-warn-script-locationú-rz--find-linksú
--no-indexz--extra-index-urlzInstalling Python packagesz Constraint file: z Requirement files:c              3   ó    K  — | ]	}d |› �V — Œ
dS )z  - Nr   ©rÇ   r­   s     r    rî  z,action_install_python_env.<locals>.<genexpr>o  s(   è è € ÐJÐJ¨4˜ ˜˜ÐJÐJÐJÐJÐJÐJr   )6Úno_constraintsÚ	reinstallrß  r¬   rÍ   r�   rV   rÀ  r6  ÚprefixÚhasattrr­   r¯   rZ   r    r±   r³  r_   rW   rë   r¸   r\   rf   rC  rD  rb  r²   rg   ÚDEVNULLr·   r`   rû   rÙ  rÚ  rÛ  r  rÆ  r®   r_  r«   rF  r‚  r~   rX   r¼  rÎ   r¬  r�  rZ  Úextra_wheels_dirÚno_indexÚextra_wheels_urlrš  Úlinesep)r2   Úuse_constraintsrÌ  rÜ  r=   rÞ  rÐ  Ú	nix_storeÚis_nixÚis_virtualenvr»  Úenviron_idf_python_env_pathÚcorrect_env_pathr]   Úenv_copyr§  Úrun_argsÚrequirements_file_listÚrequirement_filer™  s                       r    Úaction_install_python_envrÞ  ×
  s÷  € ð Ô-Ð-€OØ”€IÝ=PÑ=RÔ=RÑ:Ð˜Ð-¨{å”
—’˜{Ñ+Ô+€IØ˜dÐ"Ðq¥s¤×'AÒ'AÀ)Ñ'LÔ'LÐqÕQTÔQ[×QfÒQfÐgpÑQqÔQq€Fà�Jð Ý•�]Ñ#Ô#Ðf­µ°]Ñ(CÔ(CÐ(eÍÌÕ[^Ô[eÒHeð ð ð �bœgŸnšnÐ-@ÑAÔAð ÀYð ÝÐmÑnÔnÐnÝ˜‰mŒmÐå	„w‡~‚~Ð'Ñ(Ô(ñ !ð	ÝÔ!Ð#4°kÐ"BÍ3Ì:Õ^aÔ^hÐiÑiÔiÐiÐiøÝ�Ô6Ð7ð 	ð 	ð 	ð ˆIˆIˆIð	øøøð
	ÝÔ!Ð#4°d¸EÀ;Ð"OÕX[ÔXbÕknÔkuÐvÑvÔvÐvÐvøÝÔ,ð 	ð 	ð 	ÝÐuÑvÔvÐvàˆIˆIˆIð	øøøõ
 Œ<˜7Ò"Ð"ð!ÝÔ%Ð'8¸$ÀÐ&PÕY\ÔYcÕloÔlvÐwÑwÔwÐwÐwøÝÔ0ð !ð !ð !ÝÐ[Ñ\Ô\Ð\Ø �	�	�	ð!øøøð ð +•R”W—^’^Ð$7Ñ8Ô8ð +ÝÐQÐ<OÐQÐQÑRÔRÐRÝŒÐ)Ñ*Ô*Ð*å	„w‡~‚~Ð'Ñ(Ô(ð ABÝ'Ð(;¸[ÑIÔIÐIÑIõ ŒNÝ”  v¨tÐ4¸EÍ*ÔJ\ÕeoÔewðñ ô äØòñ ð "$ÐåÐNÐ9LÐNÐNÑOÔOÐOðÝ.0¬jÐ9NÔ.OÐ+Ø#>×#GÒ#GÝ,×3Ò3°KÕAWÑXÔXñ$ô $Ð ð (ð 	­B¬IÝ,×3Ò3°KÀÑMÔMÐOjñ-ô -ð 	õ ð&Ð9Tð &ð &Ø(3ð&ð &ÝVlð&ð &ð &ñô ð õ ”7—>’>¥"¤'§,¢,Ð/JÍMÑ"ZÔ"ZÑ[Ô[ð 	Õ_aÔ_hÝ,×3Ò3°KÀÑMÔMÐOjñ`ô `ð 	ð '×-Ò-¨iÑ8Ô8Ð8Ð8Ý”ZÐ ;Ñ<Ô<ð ÝðmÐ9Tð mð mð mñô ð øøõ ð ð ð à�ðøøøõ Ô!Ý”  vÐXÐ0BÐXÐDWÐXÝ”zÝ”zðñ ô ð ðÝ�"œ'Ÿ,š,Ð':½MÑJÔJÈCÐZaÐbÑbÔbð )ÐfgØ—G’G˜KÑ(Ô(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )øøåð ð ð ÝðCñô ð ð ð ðøøøõ -Ð-@ÑAÔAÐAåŒz�ŠÑ Ô €Hà€HˆZÑà6EÐO•o kÑ2Ô2Ð2È4€OåÐ	ÑÔÐØ! 4¨°	¸;ÈÐN€HØð 6Ø�^ _Ð5Ñ5ˆÝÔ˜(­3¬:½c¼jÈhÐWÑWÔWÐWåÐ	"Ñ#Ô#Ð#Ø! 4¨°	¸;ÈÐU€HØð 6Ø�^ _Ð5Ñ5ˆÝÔ˜(­3¬:½c¼jÈhÐWÑWÔWÐWà! 4¨°	Ð;VÐW€HÝ-¨d¬mÑ<Ô<ÐØ2ð -ð -ÐØ�TÐ+Ð,Ñ,ˆˆØð CØ�[ .°/ÐBÑBˆØÔð <Ø�^ TÔ%:Ð;Ñ;ˆØ„}ð #Ø�\�NÑ"ˆØÔð AØÐ(¨$Ô*?Ð@Ñ@ˆåÑ!Ô!€JØÐØ�^ ZÐ0Ñ0ˆåÐ	%Ñ&Ô&Ð&Øð 5ÝÐ3 /Ð3Ð3Ñ4Ô4Ð4ÝÐ	ÑÔÐÝ�Œ�ŠÐJÐJÐ3IÐJÑJÔJÑ	JÔ	JÑKÔKÐKÝÔ˜(­3¬:½c¼jÈhÐWÑWÔWÐWÐWÐWs   Ä--E ÅE6Å5E6Å:/F* Æ* GÇGÇ!.H È H3È2H3ÌE Q Ñ
QÑQÒ5S8 Ó
S,Ó S8 Ó,S0Ó0S8 Ó3S0Ó4S8 Ó8TÔTc                 ó  — | j          }t          d¦  «        }t          ¦   «         \  }}}}t          j                             |¦  «        s!t          |› d�¦  «         t          d¦  «        ‚|r#t          |d¬¦  «        }t          d|› �¦  «         t          d¦  «         t          t          j
                             d„ |D ¦   «         ¦  «        ¦  «         t          d	|› �¦  «         |t          j                             t          j        d
d¦  «        g}|r|d|gz  }|D ]	}|d|gz  }Œ
	 t          j        |¦  «        }	|	r|	j        rt          |	j         ¦  «        ‚dS dS # t"          $ r t          d¦  «         t          d¦  «        ‚w xY w)z‚
    Checks if all the dependencies (from requirements, constraints...) are installed properly.
    Raises SystemExit if not.
    r“   zh doesn't exist! Please run the install script or "idf_tools.py install-python-env" in order to create itr	   F)rž  zConstraint file: zRequirement files:c              3   ó    K  — | ]	}d |› �V — Œ
dS )z - Nr   rÊ  s     r    rî  z3action_check_python_dependencies.<locals>.<genexpr>‰  s(   è è € Ð<Ð<¨$˜˜t˜˜Ð<Ð<Ð<Ð<Ð<Ð<r   zPython being checked: r°  zcheck_python_dependencies.pyrÁ  rÇ  zRequirements are not satisfied!N)rË  r�  rß  r¬   r­   r  rZ   r    r¬  r`   rÓ  r®   rU   r/   r±   r²   r·   ÚFileNotFoundError)
r2   rÔ  Ú	req_pathsr=   rÞ  rÐ  Úconstr_pathÚdep_check_cmdÚreq_pathÚrets
             r    Ú action_check_python_dependenciesrç  s  sÛ  € ð
 Ô-Ð-€OÝ  Ñ$Ô$€Iå+>Ñ+@Ô+@Ñ(€A€qÐ
˜[åŒ7�>Š>Ð+Ñ,Ô,ð ÝØ ð Fð Fð Fñ	
ô 	
ð 	
õ ˜‰mŒmÐàð 0Ý% k¸%Ð@Ñ@Ô@ˆÝÐ. Ð.Ð.Ñ/Ô/Ð/åÐ	ÑÔÐÝ�Œ�ŠÐ<Ð<°)Ð<Ñ<Ô<Ñ	<Ô	<Ñ=Ô=Ð=åÐ	5Ð"3Ð	5Ð	5Ñ6Ô6Ð6ð '­¬¯ªµQ´ZÀÐJhÑ(iÔ(iÐj€Màð -Ø˜$ Ð,Ñ,ˆàð *ð *ˆØ˜$ Ð)Ñ)ˆˆðÝŒn˜]Ñ+Ô+ˆØð 	.�3”>ð 	.å˜cœn˜_Ñ-Ô-Ð-ð	.ð 	.ð 	.ð 	.øõ ð ð ð åÐ/Ñ0Ô0Ð0Ý˜‰mŒmÐðøøøs   Ä*2E  Å )F	c                   óX   — e Zd ZdZdee         ddfd„Zdeee	eef                  fd„Z
dS )ÚChecksumCalculatorzM
    A class used to get size/checksum/basename of local artifact files.
    Úfilesr4   Nc                 ó   — || _         d S r6   )rê  )rA   rê  s     r    r\  zChecksumCalculator.__init__§  s   € ØˆŒ
ˆ
ˆ
r   c              #   ó„   K  — | j         D ]5}g t          |¦  «        ¢t          j                             |¦  «        ‘R V — Œ6d S r6   )rê  rà   r¬   r­   r  )rA   r]   s     r    r[  zChecksumCalculator.__iter__ª  sZ   è è € Ø”ð 	Bð 	BˆAØAÕ(¨Ñ+Ô+ÐA­R¬W×-=Ò-=¸aÑ-@Ô-@ÐAÐAÐAÐAÐAÐAð	Bð 	Br   )r   r   r   rM   r   rO   r\  r   r   r   r[  r   r   r    ré  ré  ¢  sv   € € € € € ðð ð˜d 3œið ¨Dð ð ð ð ðB˜( 5¨¨c°3¨Ô#7Ô8ð Bð Bð Bð Bð Bð Br   ré  c                   ó   — e Zd ZdZdS )ÚChecksumParsingErrorz0
    Raised when checksum cannot be parsed.
    NrQ  r   r   r    rî  rî  ¯  rR  r   rî  c                   ód   — e Zd ZdZdededdfd„Zdededefd	„Zdeee	eef                  fd
„Z
dS )ÚChecksumFileParserzè
    A class used to get size/sha256/filename of artifact using checksum-file with format:
        # <artifact-filename>: <size> bytes
        <sha256sum-string> *<artifact-filename>
        ... (2 lines for every artifact) ...
    Úfilename_prefixr	  r4   Nc                 ó  — || _         t          j                             t          j        dd¦  «        }t          j                             |¦  «        }t          |¦  «        j        r|}t          ||¦  «         t          |dd¬¦  «        5 }|                     ¦   «                              ¦   «         | _        d d d ¦  «         n# 1 swxY w Y   t          j                             |¦  «        rt          j        |¦  «         d S d S )Nr°  zadd-version.sha256.tmprÔ  rÍ  rÕ  )rñ  r¬   r­   r®   rU   r0   Úabspathr   r  r0  r~   r�   Ú
splitlinesÚchecksumr  rl  )rA   rñ  r	  Úsha256_file_tmpÚsha256_filer]   s         r    r\  zChecksumFileParser.__init__¿  s  € Ø.ˆÔåœ'Ÿ,š,¥qÔ'7¸ÐBZÑ[Ô[ˆÝ”g—o’o cÑ*Ô*ˆõ �C‰=Œ=Ôð 	'Ø)ˆKÝ�S˜+Ñ&Ô&Ð&å�+˜s¨WÐ5Ñ5Ô5ð 	2¸ØŸFšF™HœH×/Ò/Ñ1Ô1ˆDŒMð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2õ Œ7�>Š>˜/Ñ*Ô*ð 	'ÝŒI�oÑ&Ô&Ð&Ð&Ð&ð	'ð 	's   Â
,CÃCÃ	CÚregexÚlinec                 ó†   — t          j        ||¦  «        }|st          d|› d|› d�¦  «        ‚|                     d¦  «        S )NzCan not parse line "z" with regex "ú"r	   )r  rÆ  rî  rÈ  )rA   rø  rù  r  s       r    Ú	parseLinezChecksumFileParser.parseLineÑ  sO   € Ý”	˜% Ñ&Ô&ˆØð 	\Ý&Ð'Z¸dÐ'ZÐ'ZÐRWÐ'ZÐ'ZÐ'ZÑ[Ô[Ð[Ø�{Š{˜1‰~Œ~Ðr   c              #   ó<  K  — 	 t          | j        dd d…         | j        dd d…         ¦  «        D ]°\  }}|                      d|¦  «        }|                      d|¦  «        }||k    rt          d¦  «         t	          d¦  «        ‚|                     | j        ¦  «        sŒp|                      d|¦  «        }|                      d|¦  «        }t          |¦  «        ||fV — Œ±d S # t          t          f$ r'}t          d	|› d
�¦  «         t	          d¦  «        ‚d }~ww xY w)Nr   rw   r	   z	^# (\S*):z^\S* [\* ](\S*)z8filename in hash-line and in bytes-line are not the samez^# \S*: (\d*) bytesz^(\S*) z*Error while parsing, check checksum file (r7  )
rö   rõ  rü  rZ   r    r6  rñ  r   r´   rG   )rA   Ú	bytes_strÚhash_strÚbytes_filenameÚhash_filenamerÞ   rÚ   ra   s           r    r[  zChecksumFileParser.__iter__Ù  sH  è è € ð	 Ý'*¨4¬=¸¸¸A¸Ô+>ÀÄÈaÈdÐQRÈdÔ@SÑ'TÔ'Tð 7ð 7Ñ#�	˜8Ø!%§¢°¸iÑ!HÔ!H�Ø $§¢Ð/AÀ8Ñ LÔ L�Ø  NÒ2Ð2ÝÐTÑUÔUÐUÝ$ Q™-œ-Ð'ð %×/Ò/°Ô0DÑEÔEð ØØ—~’~Ð&<¸iÑHÔH�ØŸš¨
°HÑ=Ô=�Ý˜$‘i”i ¨Ð6Ð6Ð6Ð6Ð6ð7ð 7øõ �>Ð*ð 	 ð 	 ð 	 ÝÐE¸sÐEÐEÐEÑFÔFÐFÝ˜Q‘-”-Ðøøøøð	 øøøs   „CC# Ã#DÃ4"DÄD)r   r   r   rM   rO   r\  rü  r   r   r   r[  r   r   r    rð  rð  ·  s›   € € € € € ðð ð'¨ð '°#ð '¸$ð 'ð 'ð 'ð 'ð$˜sð ¨#ð °#ð ð ð ð ð ˜( 5¨¨c°3¨Ô#7Ô8ð  ð  ð  ð  ð  ð  r   rð  c           
      óJ  — t          ¦   «         }| j        }|                     |¦  «        }|sWt          d|› �¦  «         t	          |t
          t          j        t
          t
          t
          gt
          t
          g¦  «        }|||<   | j        }t          j	        }| j
        r4t          |j        ¦  «        r |                     ¦   «          t          j        }|j                             |¦  «        }|s,t          d|› �¦  «         t          ||¦  «        }||j        |<   | j        p
dt
          › d�}t          | j        ¦  «        r| j        n|}| j        rt%          || j        ¦  «        nt'          | j        ¦  «        }	g }
|	D ]ë\  }}}|                     dd¦  «        }||
v rŒ!	 t,                               |¦  «        }n)# t0          $ r t          d|› �¦  «         t
          }Y nw xY wt3          ||¦  «        }t          d|› �¦  «         t          d	|› �¦  «         t          d
|› �¦  «         t          d|› �¦  «         |                     ||||¦  «         |
                     |¦  «         Œìt9          |¦  «        }| j        s4t<          j                              tB          j"        tF          ¦  «        | _        tI          | j        dd¬¦  «        5 }| %                    |¦  «         | %                    d¦  «         ddd¦  «         n# 1 swxY w Y   t          d| j        › �¦  «         dS )zl
    Adds new version of the tool to IDFTool entry together with download entry and updating json dump.
    zCreating new tool entry for zCreating new version rƒ  rÄ   rô   rõ   z"Could not guess platform for file zAdding download for platform z    size:   z    SHA256: z    URL:    r‘  rÍ  rÕ  rS   NúWrote output to )&r¸  r¼  r�   r`   r‘  ÚTODO_MESSAGErE  rb  r^  r}  r§  r”   rª  r˜  rj  Ú
url_prefixÚdist_filename_prefixÚchecksum_filerð  ré  Úartifact_filerÆ   rm   r–   r‹   r   rq  r«   rÃ  Úoutputr¬   r­   r®   rU   r/   ÚTOOLS_FILE_NEWr~   rX   )r2   r·  r3  r5  rb  r9  r
  r  rñ  Úchecksum_infoÚupdated_toolsr*  r+  r‘   Úxz_fileÚfound_platformr	  Újson_strr]   s                      r    Úaction_add_versionr  î  s�  € õ !Ñ"Ô"€JØ”	€IØ�~Š~˜iÑ(Ô(€HØð )ÝÐ7¨IÐ7Ð7Ñ8Ô8Ð8ÝØÝÝÔ"ÝÝÝˆNÝÝˆNñ	
ô 	
ˆð !)ˆ
�9ÑØŒl€GÝ#Ô4€NØ„}ð ;�˜XÔ.Ñ/Ô/ð ;Ø×ÒÑ Ô Ð Ý'Ô:ˆØÔ#×'Ò'¨Ñ0Ô0€KØð 1ÝÐ. WÐ.Ð.Ñ/Ô/Ð/Ý$ W¨nÑ=Ô=ˆØ%0ˆÔ˜'Ñ"Ø”Ð>Ð$>­|Ð$>Ð$>Ð$>€JÝ36°tÔ7PÑ3QÔ3QÐ`�dÔ/Ð/ÐW`€Oð Ôð	4Õ˜?¨DÔ,>Ñ?Ô?Ð?å Ô 2Ñ3Ô3ð ð
 €MØ-:ð (ð (Ñ)ˆ	�; 	Ø×#Ò# I¨yÑ9Ô9ˆØ�mÐ#Ð#àð	*Ý&×6Ò6°yÑAÔAˆNˆNøÝð 	*ð 	*ð 	*ÝÐA°iÐAÐAÑBÔBÐBÝ)ˆNˆNˆNð	*øøøõ �j )Ñ,Ô,ˆÝÐ=¨^Ð=Ð=Ñ>Ô>Ð>ÝÐ'˜IÐ'Ð'Ñ(Ô(Ð(ÝÐ)˜KÐ)Ð)Ñ*Ô*Ð*ÝÐ!˜CÐ!Ð!Ñ"Ô"Ð"Ø× Ò  °°iÀÑMÔMÐMØ×Ò˜YÑ'Ô'Ð'Ð'Ý˜zÑ*Ô*€HØŒ;ð ?Ý”g—l’l¥1¤:­~Ñ>Ô>ˆŒÝ	ˆdŒk˜3¨Ð	1Ñ	1Ô	1ð °QØ	�Š�ÑÔÐØ	�Š�‰Œˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ 	Ð	)˜DœKÐ	)Ð	)Ñ*Ô*Ð*Ð*Ð*s$   ÆF:Æ:#G ÇG Ë
+LÌLÌLc                 ó–  — t          ¦   «         }t          |¦  «        }| j        s4t          j                             t          j        t          ¦  «        | _        t          | j        dd¬¦  «        5 }| 
                    |¦  «         | 
                    d¦  «         ddd¦  «         n# 1 swxY w Y   t          d| j        › �¦  «         dS )zZ
    Write JSON dump of all tools from tools_info into file specified by args.output.
    r‘  rÍ  rÕ  rS   Nr  )r¸  rÃ  r	  r¬   r­   r®   rU   r/   r
  r~   rX   r`   )r2   r·  r  r]   s       r    Úaction_rewriter  /  sê   € õ !Ñ"Ô"€JÝ˜zÑ*Ô*€HØŒ;ð ?Ý”g—l’l¥1¤:­~Ñ>Ô>ˆŒÝ	ˆdŒk˜3¨Ð	1Ñ	1Ô	1ð °QØ	�Š�ÑÔÐØ	�Š�‰Œˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ 	Ð	)˜DœKÐ	)Ð	)Ñ*Ô*Ð*Ð*Ð*s   Á0+B'Â'B+Â.B+c                 óÂ  ‡‡— t          ¦   «         Št          j                             t          j        d¦  «        }t          j                             t          j        d¦  «        }t          j                             |¦  «        rt          j        |¦  «        ng }i }|D ]žŠt          j                             t          j                             |‰¦  «        ¦  «        r2t          j        t          j                             |‰¦  «        ¦  «        ng }	 ˆˆfd„|D ¦   «         }n# t          $ r dg}Y nw xY w|r||‰<   ŒŸddg}|D ]Š‰|v r| 	                    ‰¦  «         Œ| j
        rw|rst          d                     d                     |¦  «        t          ¦   «         d	         t          j                             t          j        dd
¦  «        d¦  «        ¦  «         dS |D ]®Š|‰         D ]£}	 |r"t          j                             |‰|¦  «        }	n t          j                             |‰¦  «        }	t          j        |	¦  «         t#          |	› d�¦  «         Œn# t$          $ r)}
t'          |
j        › d|
j        › d�¦  «         Y d}
~
Œœd}
~
ww xY wŒ¯| j        �rGt/          t0          dgdgd¬¦  «        \  }}g }|D ]¦}d|vr|}d}n|                     dd¦  «        \  }}||         }|€|                     ¦   «         }|�%|j        |                              t0          ¦  «        }|�|j        }t          j                             |¦  «        }|                     |¦  «         Œ§t          j        |¦  «        }|D ]j}||vrbt          j         t          j                             ||¦  «        ¦  «         t#          t          j                             ||¦  «        › d�¦  «         ŒidS dS )z¶
    Print or remove installed tools versions, that are not used by active ESP-IDF version anymore.
    Additionally remove all older versions of previously downloaded archives.
    r°  r  c                 óP   •— g | ]"}|‰‰                               ¦   «         k    ¯ |‘Œ#S r   )r  )rÇ   rý  r¼  r·  s     €€r    rÈ   z$action_uninstall.<locals>.<listcomp>M  s4   ø€ ÐsÐsÐs Q¸1À
È4Ô@P×@pÒ@pÑ@rÔ@rÒ;rÐ;r˜qÐ;rÐ;rÐ;rr   r“   zidf-gitz
idf-pythonz6For removing old versions of {} use command '{} {} {}'rB  r   zidf_tools.pyÚ	uninstallNz was removed.z can not be removed because r)   rï  T)r-   rï  r	   )!r¸  r¬   r­   r®   rU   r0   rî   rF  r‚  r�  Údry_runr"  rÚ  rÊ  r/   rC  rD  r`   rë   r\   rÔ   ÚstrerrorÚremove_archivesr‹  r�   r×  r  rª  ru  r	  r  r«   rl  )r2   Ú
tools_pathÚ	dist_pathÚinstalled_toolsÚunused_tools_versionsÚtool_versionsÚunused_versionsÚKEEP_WIN_TOOLSrb  Úpath_to_removeÚerrorrä  r‰  Úused_archivesr�  r3  r�  r5  Úarchive_versionÚarchive_version_urlÚarchiveÚdownloaded_archivesr¼  r·  s                         @@r    Úaction_uninstallr'  =  sQ  øø€ õ
 !Ñ"Ô"€JÝ”—’�aÔ.°Ñ8Ô8€JÝ”—’�QÔ-¨vÑ6Ô6€IÝ02´·²¸jÑ0IÔ0IÐQ•b”j Ñ,Ô,Ð,Èr€OàÐØð :ð :ˆå:<¼'¿-º-ÍÌÏÊÐU_ÐaeÑHfÔHfÑ:gÔ:gÐo�BŒJ•r”w—|’| J°Ñ5Ô5Ñ6Ô6Ð6Ðmoð 	ð	#ØsÐsÐsÐsÐs¨-ÐsÑsÔsˆOˆOøåð	#ð 	#ð 	#ð  "˜dˆOˆOˆOð	#øøøð ð 	:Ø*9Ð! $Ñ'øð   Ð.€NØð ,ð ,ˆØÐ(Ð(Ð(Ø!×%Ò% dÑ+Ô+Ð+øð „|ð 
Ø ð 	ÝØH×OÒOØ—I’IÐ3Ñ4Ô4Ý-Ñ/Ô/°Ô2Ý”G—L’L¥¤¨W°nÑEÔEØñ	ô ñô ð ð 	ˆð &ð 
Wð 
WˆØ,¨TÔ2ð 		Wð 		WˆGðWØð DÝ%'¤W§\¢\°*¸dÀGÑ%LÔ%L�N�Nå%'¤W§\¢\°*¸dÑ%CÔ%C�NÝ”˜nÑ-Ô-Ð-Ý˜Ð5Ð5Ð5Ñ6Ô6Ð6Ð6øÝð Wð Wð WÝ˜œÐUÐUÀEÄNÐUÐUÐUÑVÔVÐVÐVÐVÐVÐVÐVøøøøðWøøøð		Wð Ôñ IÝ.NÝ˜u˜g¨ w°dð/
ñ /
ô /
Ñ+ˆ
Ð+ð ˆð $ð 	*ð 	*ˆIØ˜)Ð#Ð#Ø%�	Ø#��à*3¯/ª/¸#¸qÑ*AÔ*AÑ'�	˜<Ø.¨yÔ9ˆHØÐ#Ø'×GÒGÑIÔI�àÐ'Ø"*Ô"3°LÔ"A×"[Ò"[Õ\lÑ"mÔ"m�ØÐ*Ø&5Ô&9Ð#å”g×&Ò&Ð':Ñ;Ô;ˆGØ× Ò  Ñ)Ô)Ð)Ð)å œj¨Ñ3Ô3ÐØ*ð 	Ið 	IˆGØ˜mÐ+Ð+Ý”	�"œ'Ÿ,š, y°'Ñ:Ô:Ñ;Ô;Ð;Ý�œŸš Y°Ñ8Ô8ÐGÐGÐGÑHÔHÐHøð;Ið Ið4	Ið 	Is+   ÄD"Ä"D2Ä1D2Ç,A*IÉ
J
É!JÊJ
c                 óB  — 	 ddl }n,# t          $ r t          d¦  «         t          d¦  «        ‚w xY wt	          t
          j                             t          j	        t          ¦  «        dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   t	          t
          j                             t          j	        t          ¦  «        dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                     ||¦  «         dS )z=
    Validate whether everything is installed correctly.
    r   Nz>You need to install jsonschema package to use validate commandr	   rÔ  rÍ  rÕ  )Ú
jsonschemar´  rZ   r    r~   r¬   r­   r®   rU   r/   Ú
TOOLS_FILErØ  rÙ  ÚTOOLS_SCHEMA_FILEÚvalidate)r2   r)  Ú
tools_filer1   Úschema_fileÚschema_jsons         r    Úaction_validater0  –  s~  € ðØÐÐÐÐøÝð ð ð ÝÐNÑOÔOÐOÝ˜‰mŒmÐðøøøõ 
�bŒg�lŠl�1œ:¥zÑ2Ô2°CÀ'Ð	JÑ	JÔ	Jð +ÈjÝ”Y˜zÑ*Ô*ˆ
ð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +õ 
�bŒg�lŠl�1œ:Õ'8Ñ9Ô9¸3ÈÐ	QÑ	QÔ	Qð -ÐU`Ý”i Ñ,Ô,ˆð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -à×Ò˜
 KÑ0Ô0Ð0Ð0Ð0s,   ‚ ‡)0Á2BÂBÂBÃC>Ã>DÄDc                 ó0  ‡— | j         Št          ¦   «         }dt          ddfˆfd„} |d¦  «          |d¦  «          |d¦  «         d}|                     ¦   «         D �]¬\  }}|j        j        }|› d	�|v rt          j        |› d
�d|¦  «        }d|j        j        › �} |d 	                    ¦   «          
                    || j        t          |¦  «        z  |j        |j        j        ||¬¦  «        ¦  «         t          |                     ¦   «         ¦  «        D ]ä}|                     |¦  «        }	|	                     ¦   «         }
|
t$          j        k    rŒ<|
t$          j        k    rd}n!|
t$          j        k    rd}nt-          ¦   «         ‚|	                     ¦   «         }|	j        |         }|                     |¦  «        } |d                     d¦  «         
                    |||j        |j        ¦  «        ¦  «         Œå |d¦  «         �Œ® |d¦  «         dS )zU
    Prints basic documentation and information about every tool from tool_info.
    rQ   r4   Nc                 ó8   •— ‰                      | › d�¦  «         d S )NrS   )rX   )rQ   r]   s    €r    Ú	print_outz!action_gen_doc.<locals>.print_out°  s!   ø€ Ø	�Š�4���ÑÔÐÐÐr   z.. |zwsp| unicode:: U+200Bz	   :trim:r“   z$https://github.com/espressif/esp-idfz/treez/tree/\w+/(.*)z	:idf:`\1`zhttps://spdx.org/licenses/a6  
.. _tool-{name}:

{name}
{underline}

{description}

.. include:: idf-tools-notes.inc
   :start-after: tool-{name}-notes
   :end-before: ---

License: `{license} <{license_url}>`_

More info: {info_url}

.. list-table::
   :widths: 10 10 80
   :header-rows: 1

   * - Platform
     - Required
     - Download
)rC   Ú	underliner•  r�  Úlicense_urlrŒ  râ  ÚoptionalzX
   * - {}
     - {}
     - {}

       .. rst-class:: tool-sha256

          SHA256: {}
rS   )r	  r¸  rO   r(  rœ  rŒ  r  r¼  r�  r„  rÚ  Úheading_underline_charr”   r•  r  r{  r¢  ræ  r‘  r2  rE  rF  rý   rù  rª  ru  r`  r	  rÚ   )r2   r·  r3  Ú
idf_gh_urlr3  r5  rŒ  r5  r�   Úplatform_toolÚinstall_typeÚinstall_type_strrb  r
  r  r]   s                  @r    Úaction_gen_docr<  ©  sv  ø€ ð 	Œ€AÝ Ñ"Ô"€Jð�ð  ð ð ð ð ð ð ð €IÐ*Ñ+Ô+Ð+Ø€IˆkÑÔÐØ€Iˆb�M„M€Mà7€JØ)×/Ò/Ñ1Ô1ð Gñ GÑˆ	�8ØÔ#Ô,ˆØÐÐÐ 8Ð+Ð+Ý”v Ð<Ð<Ð<¸lÈHÑUÔUˆHàM°8Ô3CÔ3KÐMÐMˆàˆ	ð÷. ‚F�H„H�VŠVØØÔ5½¸I¹¼ÑFØ$Ô0Ø Ô(Ô0Ø'Ø!ð ñ ô ñ1 	
ô  	
ð  	
õD $ H×$DÒ$DÑ$FÔ$FÑGÔGð 	ð 	ˆMØ$×6Ò6°}ÑEÔEˆMØ(×9Ò9Ñ;Ô;ˆLØ�wÔ4Ò4Ð4ØØ¥Ô!7Ò7Ð7Ø#-Ð Ð Ø¥Ô!;Ò;Ð;Ø#-Ð Ð å)Ñ+Ô+Ð+à#×;Ò;Ñ=Ô=ˆGØ'Ô0°Ô9ˆKØ&×@Ò@ÀÑOÔOˆLð ˆIð÷ 
‚Eˆ$�K„K—’�}Ð&6¸Ô8HÈ,ÔJ]Ñ^Ô^ñ
ô 
ð 
ð 
ð 	ˆ	�"‰Œˆ‰Ø€Iˆb�M„M€M€M€Mr   c                 óˆ  — 	 t          ¦   «         }|                     ¦   «         D ]?\  }}|j        | j        k    r*t	          |                     | j        ¦  «        ¦  «          dS Œ@dS # t          t          t          f$ rD}t          d| j        › d| j        › d�¦  «         t          |› ¦  «         t          d¦  «        ‚d}~ww xY w)z—
    Print "True"/"False" to stdout as a result that tool is supported in IDF.
    Print error message to stderr otherwise and set exit code to 1.
    z%Failed to check tool support: (name: z, exec: r7  r	   N)r¸  r(  rC   r3  r"  rä  Ú	exec_pathrG  rP  rT  rZ   r    ©r2   r·  r=   r¿  ra   s        r    Úaction_check_tool_supportedr@    sÚ   € ð
	Ý$Ñ&Ô&ˆ
Ø×$Ò$Ñ&Ô&ð 	ð 	‰DˆAˆqØŒv˜œÒ'Ð'Ý�a—o’o d¤nÑ5Ô5Ñ6Ô6Ð6Ø��ð (ð	ð 	øõ Õ+­]Ð;ð ð ð ÝÐ_°d´nÐ_Ð_ÈdÌnÐ_Ð_Ð_Ñ`Ô`Ð`Ý�ˆh‰ŒˆÝ˜‰mŒmÐøøøøðøøøs   ‚AA& Á#A& Á&CÁ=?B<Â<Cc                 óv  — 	 t          ¦   «         }|                     ¦   «         D ]K\  }}|j        | j        k    r6t	          t          |j                             ¦   «         ¦  «        ¦  «          dS ŒLdS # t          $ r<}t          d| j        › d�¦  «         t          |› ¦  «         t          d¦  «        ‚d}~ww xY w)z{
    Print supported versions of a tool to stdout.
    Print error message to stderr otherwise and set exit code to 1.
    z.Failed to get tool supported versions. (tool: r7  r	   N)r¸  r(  rC   r3  r"  r/  rª  rs  rG  rZ   r    r?  s        r    Ú"action_get_tool_supported_versionsrB    sÎ   € ð
	Ý$Ñ&Ô&ˆ
Ø×$Ò$Ñ&Ô&ð 	ð 	‰DˆAˆqØŒv˜œÒ'Ð'Ý•d˜1œ:Ÿ?š?Ñ,Ô,Ñ-Ô-Ñ.Ô.Ð.Ø��ð (ð	ð 	øõ ð ð ð ÝÐP¸t¼~ÐPÐPÐPÑQÔQÐQÝ�ˆh‰ŒˆÝ˜‰mŒmÐøøøøðøøøs   ‚A+A2 Á/A2 Á2
B8Á<7B3Â3B8Úargvc                 óD  — t          j        ¦   «         }|                     ddd¬¦  «         |                     ddd¬¦  «         |                     dd¬	¦  «         |                     d
d¬	¦  «         |                     d¬¦  «        }|                     dd¬	¦  «        }|                     ddd¬¦  «         |                     dd¬	¦  «         |                     dd¬	¦  «        }|                     dt
          t          gt
          d¬¦  «         |                     ddd¬¦  «         |                     ddd¬¦  «         |                     dt           j        d¬¦  «         |                     dd¬	¦  «         |                     d d!¬	¦  «        }|                     d"d#d$d%gd&¬'¦  «         |                     d(d)d*¬+¦  «         |                     d,d-¬	¦  «        }|                     d.t          d/¬+¦  «         |                     d"d#d$d%gd0¬'¦  «         |                     d(d)d1¬+¦  «         |                     d2d3¬	¦  «        }|                     d4d5d¬¦  «         |                     d6d7d¬¦  «         t          j
                             d8d9¦  «                             ¦   «         d:v }t          r||fD ]}	|	                     d;d$d<¬=¦  «         Œ|                     d>d?¬	¦  «        }
|
                     d@dAd¬¦  «         |
                     dBdC¬	¦  «         |
                     dDdEt          ¬F¦  «         |
                     dGdH¬	¦  «         |
                     dIdJdK¬+¦  «         |
                     dLd|dM¬N¦  «         t          �r“|                     dOdP¬	¦  «        }|                     dQdR¬	¦  «         |                     dSdTdU¬V¦  «         |                     dWdXdU¬V¦  «         |                     dYdZ¬	¦  «         |                     d[dd\¬]¦  «         |                     d^d_d9¬F¦  «         |                     dU¬`¦  «        }|                     dadb¬	¦  «         |                     dcddd$¬e¦  «         |                     dfdg¬	¦  «        }|                     dQdR¬	¦  «         |                     dhdi¬	¦  «         |                     djdk¬	¦  «        }|                     dQt          j        dl¦  «        t"          j        dm¬n¦  «         |                     dodpdq¬F¦  «         |                     drds¬	¦  «        }|                     dLd|dM¬N¦  «         t          j
                             dt¦  «        rv|                     dudv¬	¦  «        }|                     dwdUdx¬y¦  «         |                     dzdUd{¬y¦  «         |                     d|d}¬	¦  «        }|                     dwdUdx¬y¦  «         |                     | ¦  «        }|j        €)|                     ¦   «          |                     d~¦  «         |j        t0          _        |j        t0          _        d|v r|j        rdU|_        |j        p}t          j
                             d€¦  «        p^t          j                             t          j                             t          j                              tB          ¦  «        d�¦  «        ¦  «        t0          _        t0          j        t          j
        d€<   t          j
                             d‚¦  «        p#t          j         "                    tF          ¦  «        t0          _$        t          j
         %                    dƒd ¦  «         t          €'tM          d„tN          › d…�¦  «         tQ          d~¦  «        ‚|j)        r|j)        t0          _)        n9t          j                             t0          j        tT          ¦  «        t0          _)        d†|j         +                    d‡dˆ¦  «        › �}tY          ¦   «         |         } ||¦  «         d S )‰Nz--quietz1Don't output diagnostic messages to stdout/stderrÚ
store_true)ÚhelpÚactionz--non-interactivez/Don't output interactive messages and questionsz--tools-jsonz"Path to the tools.json file to use)rF  z
--idf-pathzESP-IDF path to userG  )Údestr/  z!List tools and versions availablez
--outdatedz#Print only outdated installed toolsr¨   z1Print summary of tools installed or found in PATHÚexportz9Output command for setting tool paths, suitable for shellz--formatzqFormat of the output: shell (suitable for printing into shell), or key-value (suitable for parsing by other tools)ÚchoicesrQ  rF  z--prefer-systemzÃNormally, if the tool is already present in PATH, but has an unsupported version, a version from the tools directory will be used instead. If this flag is given, the version in PATH will be used.z--deactivatezSOutput command for deactivate different ESP-IDF version, previously set with exportz--unsetz--add_paths_extrasz1Add idf-related path extras for deactivate optionr‹  z3Download and install tools into the tools directoryr°  ÚTOOLÚ*râ  a  Tools to install.
To install a specific version use <tool_name>@<version> syntax. To install tools by pattern use wildcards in <tool_name_pattern>. Use empty or 'required' to install required tools, not optional ones. Use 'all' to install all tools, including the optional ones.)ÚmetavarÚnargsrQ  rF  z	--targetsrï  zoA comma separated list of desired chip targets for installing. It defaults to installing all supported targets.)rQ  rF  r0  z*Download the tools into the dist directoryz
--platformz"Platform to download the tools fora  Tools to download. To download a specific version use <tool_name>@<version> syntax. To download tools by pattern use wildcards in <tool_name_pattern> . Use empty or 'required' to download required tools, not optional ones. Use 'all' to download all tools, including the optional ones.zpA comma separated list of desired chip targets for installing.  It defaults to installing all supported targets.r  zHRemove installed tools, that are not used by current version of ESP-IDF.z	--dry-runzPrint unused tools.z--remove-archivesz;Remove old archive versions and archives from unused tools.ÚIDF_PYTHON_CHECK_CONSTRAINTSr“   )rX  ÚnrÃ  z--mirror-prefix-mapzyPattern to rewrite download URLs, with source and replacement separated by comma. E.g. http://foo.com,http://test.foo.com)rN  rF  zinstall-python-envzJCreate Python virtual environment and install the required Python packagesz--reinstallz,Discard the previously installed environmentz--extra-wheels-dirz=Additional directories with wheels to use during installationz--extra-wheels-urlzAdditional URL with wheels)rF  rQ  rÈ  z,Work offline without retrieving wheels indexz
--featuresrU  zqA comma separated list of desired features for installing. It defaults to installing just the core functionality.z--no-constraintsz³Disable constraint settings. Use with care and only when you want to manage package versions by yourself. It can be set with the IDF_PYTHON_CHECK_CONSTRAINTS environment variable.)rG  rQ  rF  zadd-versionz)Add or update download info for a versionz--outputz"Save new tools.json into this filez--toolz"Tool name to set add a version forT)rF  râ  r°  zVersion identifierz--url-prefixz7String to prepend to file names to obtain download URLsz
--overridez$Override tool versions with new data)rG  rF  z--dist-filename-prefixzMPrefix of distro archive name in checksum file. If skipped tool name is used.)râ  z--checksum-filez:URL or path to local file with checksum/size for artifactsz--artifact-filez$File names of the download artifacts)rF  rN  Úrewritez=Load tools.json, validate, and save the result back into JSONr,  z'Validate tools.json against schema filezgen-docz/Write the list of tools as a documentation pager‘  zOutput file name)r¬  rQ  rF  z--heading-underline-charz-Character to use when generating RST sectionsr"   zcheck-python-dependenciesz6Check that all required Python packages are installed.ÚIDF_TOOLS_VERSION_HELPERzcheck-tool-supportedz\Check that selected tool is compatible with IDF. Writes "True"/"False" to stdout in success.z--tool-namezTool name (from tools.json))râ  rF  z--exec-pathz&Full path to executable under the testzget-tool-supported-versionsz*Prints a list of tool's supported versionsr	   ÚunsetÚIDF_PATHz..ÚIDF_TOOLS_PATHÚ__PYVENV_LAUNCHER__z	Platform z appears to be unsupportedÚaction_ri   r=   )-ÚargparseÚArgumentParserÚadd_argumentÚadd_subparsersÚ
add_parserr/  r0  ÚSUPPRESSr�   r¬   rÍ   r�   r  r$   r(   Úadd_mutually_exclusive_groupÚFileTyperV   r_   Ú
parse_argsrG  Ú
print_helpÚexitr-   rU   r.   rS  rf  r/   r­   Úrealpathr®   r  rg  Ú
expanduserÚIDF_TOOLS_PATH_DEFAULTr0   r�  rZ   r‚  r    r1   r*  rÆ   Úglobals)rC  ÚparserÚ
subparsersÚlist_parserrI  r‹  r0  r  Úno_constraints_defaultÚ	subparserÚinstall_python_envr®  Úadd_version_files_grouprQ  Úgen_docÚcheck_python_dependenciesÚcheck_tool_supportedÚget_tool_supported_versionsr2   Úaction_func_nameÚaction_funcs                        r    Úmainrt  %  sK	  € ÝÔ$Ñ&Ô&€Fà
×Ò˜	Ð([ÐdpÐÑqÔqÐqØ
×ÒØÐ"SÐ\hð ñ ô ð ð ×Ò˜Ð-QÐÑRÔRÐRØ
×Ò˜Ð+@ÐÑAÔAÐAà×&Ò&¨HÐ&Ñ5Ô5€JØ×'Ò'¨Ð5XÐ'ÑYÔY€KØ×Ò˜\Ð0UÐ^jÐÑkÔkÐkØ×Ò˜'Ð([ÐÑ\Ô\Ð\Ø×"Ò" 8Ð2mÐ"ÑnÔn€FØ
×ÒØÝÕ/Ð0Ýð@ð ñ ô ð ð ×ÒØðð
 ð ñ 	ô 	ð 	ð ×ÒØØbØð ñ ô ð ð
 ×Ò˜	­Ô(9À,ÐÑOÔOÐOØ
×ÒÐ,Ð3fÐÑgÔgÐgØ×#Ò# IÐ4iÐ#ÑjÔj€GØ×ÒØØØØ�ðKð ñ ô ð ð ×ÒØØð?ð	 ñ ô ð ð ×$Ò$ ZÐ6bÐ$ÑcÔc€HØ×Ò˜,Õ0@ÐGkÐÑlÔlÐlØ×ÒØØØØ�ðLð ñ ô ð ð ×ÒØØð@ð	 ñ ô ð ð ×%Ò%ØÐdð &ñ ô €Ið ×Ò˜;Ð-BÈ<ÐÑXÔXÐXØ×ÒØÐ"_Ðhtð ñ ô ð õ  œZŸ^š^Ð,JÈBÑOÔO×UÒUÑWÔWÐ[kÐkÐåð 	Ø" GÐ,ð 	ð 	ˆIØ×"Ò"Ø%Øð>ð	 #ñ ô ð ð ð $×.Ò.ØÐ$pð /ñ ô Ðð ×#Ò#ØÐJÐS_ð $ñ ô ð ð ×#Ò#ØÐ$cð $ñ ô ð ð ×#Ò#Ð$8Ð?[ÕewÐ#ÑxÔxÐxØ×#Ò# LÐ7eÐ#ÑfÔfÐfØ×#Ò#ØØðEð	 $ñ ô ð ð ×#Ò#ØØØ&ð$ð $ñ 	ô 	ð 	õ ñ 
Ø ×+Ò+¨MÐ@kÐ+ÑlÔlˆØ× Ò  Ð2VÐ ÑWÔWÐWØ× Ò  Ð0TÐ_cÐ ÑdÔdÐdØ× Ò  Ð3GÐRVÐ ÑWÔWÐWØ× Ò  Ð6oÐ ÑpÔpÐpØ× Ò  °lÐIoÐ ÑpÔpÐpØ× Ò Ø$Ø`Øð 	!ñ 	
ô 	
ð 	
ð
 #.×"JÒ"JÐTXÐ"JÑ"YÔ"YÐØ×,Ò,ØÐ$`ð 	-ñ 	
ô 	
ð 	
ð 	 ×,Ò,Ð->ÐEkÐsvÐ,ÑwÔwÐwà×'Ò'¨	Ð8wÐ'ÑxÔxˆØ×Ò˜ZÐ.RÐÑSÔSÐSà×Ò˜jÐ/XÐÑYÔYÐYà×'Ò'¨	Ð8iÐ'ÑjÔjˆØ×Ò˜Z­hÔ.?ÀÑ.DÔ.DÍcÌjÐ_qÐÑrÔrÐrØ×ÒØ&Ð-\Ðfið 	ñ 	
ô 	
ð 	
ð !+× 5Ò 5Ø#Ð*bð !6ñ !ô !Ðð ×*Ò*ØØØ&ð ð	 +ñ ô ð õ 
„z‡~‚~Ð0Ñ1Ô1ð sØ)×4Ò4Ø"Øoð  5ñ  
ô  
Ðð 	×)Ò)¨-À$ÐMjÐ)ÑkÔkÐkØ×)Ò)¨-À$ÐMuÐ)ÑvÔvÐvà&0×&;Ò&;Ø)Ð0\ð '<ñ '
ô '
Ð#ð 	$×0Ò0°ÈÐTqÐ0ÑrÔrÐrà×Ò˜TÑ"Ô"€Dà„{ÐØ×ÒÑÔÐØ�Š�A‰ŒˆàŒj…A„GàÔ,…AÔà�$€€˜4œ:€ØˆŒð 	ŒÐv�œŸš¨
Ñ3Ô3Ðvµr´w×7GÒ7GÍÌÏÊÕUWÔU\×UdÒUdÕemÑUnÔUnÐptÑHuÔHuÑ7vÔ7võ „Jõ œZ…B„JˆzÑå”z—~’~Ð&6Ñ7Ô7Ðe½2¼7×;MÒ;MÕNdÑ;eÔ;e…AÔõ „J‡N‚NÐ(¨$Ñ/Ô/Ð/åÐÝÐE�/ÐEÐEÐEÑFÔFÐFÝ˜‰mŒmÐà„ð <Ø”�Œˆå”w—|’|¥A¤Jµ
Ñ;Ô;�Œà@ ¤×!4Ò!4°S¸#Ñ!>Ô!>Ð@Ð@ÐÝ‘)”)Ð,Ô-€Kà€K�ÑÔÐÐÐr   Ú__main__ÚMSYSTEMz{MSys/Mingw is not supported. Please follow the getting started guide of the documentation to set up a supported environmentr6   rD  )rÓ   )NNN)F)T)ÆrX  r  rÎ   r¡  rì   rè  Ú	functoolsrÙ   rØ  r¬   rf   r  rC  r)  r±   rV   rü   r°  r9  Úcollectionsr   r   r   r   r   Úzipfiler   Úpython_version_checkerr¨   rG  r¡   r"  r    Útypingr
   r   r   r   r   r   r   r   r   r   Úurllib.errorr   Úurllib.parser   r   Úurllib.requestr   Úurllib.responser   Ú
exceptionsr   r´  rë   r*  r+  r
  r“  rÁ  r­   r®   re  rÇ  Úcompiler½  r›  rÍ   r�   r$   r  r  r~  r'   rh  Ú
IDF_DL_URLr(   rÙ  rÿ   ÚmajorÚminorrÛ  r_  r+   rU   rO   rZ   r\   r`   rh   ÚsystemÚmachiner‚  r—   r˜   r™   rš   rœ   r›   r{   r|   r}   rm   r¢   r�   r/  r0  ÚDIGICERT_ROOT_CA_CERTÚDIGICERT_ROOT_G2_CERTr'  ÚbytesrÀ   rÊ   rÒ   r   rà   rè   rð   r  r  r#  r,  r0  r>  rN  rP  rT  rV  r�  rX  Útotal_orderingr^  rƒ  r‘  rI  rS  r†  r¤  r¸  rµ  rÃ  rÊ  r}  rß  rã  rñ  rù  rû  rv  r
  r÷  r  r  r+  r!  r   rˆ  r;  r@  rC  rG  r/  r0  rO  rQ  rU  Ú	Namespacer€  r]  rb  rs  rx  rv  rw  r‹  r’  r”  rš  r�  r¬  r¼  rÞ  rç  ré  rî  rð  r  r  r'  r0  r<  r@  rB  rt  r   rC  r   r   r    ú<module>rŒ     sÐ  ðð< €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðØ!Ð!Ð!Ð!ð !ÐÔ Ñ"Ô"Ð"Ð"øØð ð ð Ø	€Eˆ!�H„H€HØ
ˆ*�Q‰-Œ-Ðøøøøðøøøð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ø  Ð  Ð  Ð  Ð  Ð  Ø !Ð !Ð !Ð !Ð !Ð !Ø "Ð "Ð "Ð "Ð "Ð "Ø &Ð &Ð &Ð &Ð &Ð &ðØ'Ð'Ð'Ð'Ð'Ð'Ð'øØð ð ð ðð ð ð ð �wñ ô ð ð ð ðøøøð  €
Ø-Ð Ø'€Ø€ØÐ ØœŸš c¨<Ñ8Ô8Ð Ø€Ø"˜œ
Ð#3Ñ4Ô4Ð Ø %Ð Ø”—’Ð 0Ñ1Ô1Ð:°U€Ø€ØÐ ØÐ Øœ
ŸšÐ'>Ñ?Ô?Ð Ø”z—~’~Ð&=Ñ>Ô>Ð Ø2€
Ø”Z—^’^Ð$8Ð:YÑZÔZÐ Ø+Ð ØÔ,Ô2ÐMÐM°SÔ5EÔ5KÐMÐMÐ Ø!€ð%-ð %-ð %-ð %-ð %-ñ %-ô %-ð %-ðP €OÑÔ€ð4�ð 4˜Cð 4 Dð 4ð 4ð 4ð 4ð6ˆsð 6˜3ð 6 4ð 6ð 6ð 6ð 6ð$ð $ˆsð $�x  3¤Ô(ð $¸ð $Àð $ð $ð $ð $ð
 sð 
¨tð 
ð 
ð 
ð 
ð0 %�X”_Ñ&Ô&Ð=Ð=Ð)9¨Ô)9Ñ);Ô);Ð=Ð=€ð €Ø€Ø€Ø$Ð ØÐ Ø Ð Ø$Ð Ø$Ð Ø$Ð ð@*ð @*ð @*ð @*ð @*ñ @*ô @*ð @*ðF Sð ¨Sð ð ð ð ð &Ð% oÑ6Ô6Ð ð €ØÐ ðÐ ð4Ð ð2 %:ÐI^Ð_Ð_€ð Z^ð(ð (Ø	ˆcŒð(Ø (¨¤ð(ØCKÈDÐQTÌIÔCVð(à
ð(ð (ð (ð (ðV¨¨S¬	ð °d¸3´ið ð ð ð ð¨¨c¬ð °t¸CÀ¸H´~ð ð ð ð ð
$ð 
$ 3ð 
$°Cð 
$ÀEÈ#ÈsÈ(ÄOð 
$ð 
$ð 
$ð 
$ð˜3ð ¨Cð ¸Sð ÀTð ð ð ð ð	�#ð 	˜$ð 	ð 	ð 	ð 	ð@�Sð @ sð @¨tð @ð @ð @ð @ðB�3ð ˜5 ¨#¤°Ð!3Ô4ð ð ð ð ð =AØ Ø$(ð2ð 2Ø	ð2àð2ð ˜ 3¨¨S /°4Ð"7Ô8Ô9ð2ð �5Œ/ð	2ð
 �jÔ!ð2ð ˆ3�
ˆ?Ôð2ð 2ð 2ð 2ðj�#ð  Cð ¨E°$¸	°/Ô,Bð ð ð ð ð6 ð ¨sð °tð ð ð ð ð2 #ð ¨sð °tð ð ð ð ð<	ð 	ð 	ð 	ð 	˜ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�Lñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�lñ 	ô 	ð 	ð
'ð 
'ð 
'ð 
'ð 
'�fñ 
'ô 
'ð 
'ð Ôð@*ð @*ð @*ð @*ð @*�Vñ @*ô @*ñ Ôð@*ðF �Øðð ð ñô €ð&g
ð g
ð g
ð g
ð g
ˆfñ g
ô g
ð g
ðT@ð @ð @ð @ð @�Kñ @ô @ð @ðlð lð lð lð lñ lô lð lð^Xð Xð Xð Xð Xñ Xô Xð Xðv-)ð -)ð -)ð -)ð -)ñ -)ô -)ð -)ð`
-˜˜c 7˜lÔ+ð 
-ð 
-ð 
-ð 
-ðð ð ð$P ¨¨c°7¨lÔ);Ô <ð Pð Pð Pð Pð 5¨¨c¨¤?ð ð ð ð ð!˜ð !ð !ð !ð !ðHW˜U 3¨¨S°#Ð#5Ô6ð Wð Wð Wð Wð"˜t Cœyð ¨T°#¬Yð ð ð ð ð  c¤ð ¸;ð ÐQUÐVYÔQZð Ð_cÐdgÔ_hð ð ð ð ðB 3ð ¨4°¬9ð ð ð ð ð,7 vð 7¸Cð 7ÀDÈÄIð 7ð 7ð 7ð 7ð\¨#ð \°#ð \ð \ð \ð \ð8¨Fð 8À#ð 8È$ÈsÌ)ð 8ð 8ð 8ð 8ð:+¨¨c¬ð +ð +ð +ð +ð 0 6ð 0°t¸CÀ¸LÔ7Ið 0ÈdÐSVÐX_ÐS_ÔN`ð 0ð 0ð 0ð 0ð& ¨4°¬9ð  ÀDÈÈcÈÄNð  ÐWZð  ð  ð  ð  ð6 T¨#¤Yð °4ð ð ð ð ð:c¨$¨s¬)ð c¸¸cÀ3¸h¼ð cð cð cð cðZ¨¨c¬ð Z°u¸SÀ#¸X´ð Zð Zð Zð Zð	4˜ð 	4ð 	4ð 	4ð 	4ðð ð ð8\ð \ð \ð&ð ð ð!ð !ð !ðJ/Ø
ð/àð/ð ð/ð ð	/ð
 ˆ4�ˆ:Ôð/ð /ð /ð /ð*	f°ð 	fÀSð 	fÈTð 	fð 	fð 	fð 	fð
 'ð 
°cð 
Èð 
Ðadð 
Ðimð 
ð 
ð 
ð 
ð(4;Ø
ð4;Ø!ð4;Ø)1Ô);ð4;ØJMð4;Øcfð4;à
ˆ4��tÐÔð4;ð 4;ð 4;ð 4;ðn
¸ð 
È3ð 
ÐSWð 
ð 
ð 
ð 
ð,X!˜ð X! ð X!ð X!ð X!ð X!ðv 48ÈZð ð ¨Sð Àsð Ð\_ð ð ð ð ð #ð ¸ð Àð ð ð ð ð>°ð ¸ð ð ð ð ð4 V[ð/ð /Øð/Ø%)¨#¤Yð/Ø<@À¼Ið/ØNRð/à
ˆ4�Œ9�d˜3 ˜<Ô(Ð(Ô)ð/ð /ð /ð /ð42(ð 2(ð 2(ðj='ð ='ð ='ð@˜ œð ð ð ð ð$K 3ð K¨4°¬9ð Kð Kð Kð Kð3ð 3 ð 3¨dð 3¸cð 3ð 3ð 3ð 3ðl/¨3ð /°4ð /ð /ð /ð /ðdYXð YXð YXðx,ð ,ð ,ð^
Bð 
Bð 
Bð 
Bð 
Bñ 
Bô 
Bð 
Bð	ð 	ð 	ð 	ð 	˜<ñ 	ô 	ð 	ð4 ð 4 ð 4 ð 4 ð 4 ñ 4 ô 4 ð 4 ðn>+˜Sð >+ Tð >+ð >+ð >+ð >+ðB+ð +ð +ðVI˜3ð VI 4ð VIð VIð VIð VIðr1ð 1ð 1ð&Wð Wð Wðt cð ¨dð ð ð ð ð"¨Sð °Tð ð ð ð ð"gˆt�CŒyð g˜Tð gð gð gð gðT ˆzÒÐØ�B”JÐÐØˆð&ñ	
ô 	
ð 	
ð ˆj˜‰mŒmÐØ€DˆŒ�!�"�"ŒÑÔÐÐÐð Ðs*   Á2B ÂB&ÂB!Â!B&ÄD ÄD!Ä D!