<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    Œ=Ý_jf  ã            N   @   s8  d Z ddlmZm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 ydd	lmZ W n ek
rÀ   dZY nX ydd
lmZ W n ek
rê   dZY nX e
jdkrddlZndZe
jd dkZdddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZgNZejd[kZejd\kZe
j d]¡Ze
j d^¡Z e Z!e
j d_¡Z"e
j d`¡Z#e
j da¡Z$e"pe#pe$Z%e
j db¡Z&e
j dc¡Z'ddZ(deZ)dfZ*dgZ+dhZ,diZ-djZ.dkZ/dlZ0dmZ1dnZ2doZ3dpZ4dqZ5drZ6dsZ7dtZ8duZ9dvZ:dwZ;dxZ<dyZ=dzZ>d{Z?d|Z@d}ZAedkr°d~ZBdZCdZDn G d€d„ dejEƒZFeGƒ  HeFjI¡ edkräd‚ZJdƒZKn G d„d…„ d…ejEƒZLeGƒ  HeLjI¡ e
 M¡ ZNesd†ZOn2ye
 P¡ ZOW n$ eQk
rH   er@d‡nd†ZOY nX edHdˆd‰dŠd‹dŒdgƒZRedDdˆd‰dŠd‹gƒZSedBdŽddd‘d’d“gƒZTedCd”d•d–d—d˜d™gƒZUedEdšd›dœddždŸd d¡gƒZVedId¢d£d¤d¥d¦gƒZWed@d§d¨d©dªd«d¬d¦gƒZXedFd¨d­d®d¯d°gƒZYedGd±d²d³d´gƒZZedAdµd¶d·d¸gƒZ[ed¹dºd»d¼gƒZ\ed½d¾dºd¿dÀgƒZ]edÁd‹dÂdÃgƒZ^edÄd¾dºgƒZ_ed8dÅdÆdÇdÈgƒZ`ed=dÉd§gƒZaed>dÊdËdÌgƒZbed?dÍdÎdÏgƒZced:dÍdÎdÏgƒZded;dŽddd‘gƒZeed<dÐdÑgƒZfed9dÒdÓgƒZged7d§d¨d©dªd«d¬gƒZhedÔdÕdÖgƒZieeegeegfeegegfegegfeegegfegegfeegeegfegeegfegeegfd×œZjedk	rej HegegfegegfdØœ¡ edk	r²ej HdÙegeegfi¡ G dÚdÛ„ dÛekƒZlG dÜdÝ„ dÝelƒZmG dÞdß„ dßemƒZnG dàdá„ dáelƒZoG dâdã„ dãelƒZpddädP„ZqdådM„ Zrdædç„ ZsdèdL„ ZtdédO„ ZuerdêdQ„ ƒZvdëdN„ ZwdìdR„ ZxdídS„ ZyddîdV„ZzdïdK„ Z{G dðdñ„ dñƒZ|dòdT„ Z}e|ƒ Z~e~je}_e~j€e}_€dódô„ Zdõdö„ Z‚ddødU„Zƒdùdú„ Z„erÆdûdü„ Z…ndýdü„ Z…ere
j†fdþdY„ƒZ‡dd dX„Zˆddÿe
j†fddZ„Z‰eŠe ‹dd¡ƒr*ddlŒZŒddW„ Zn
ddW„ ZdS (	  z9Common objects shared by __init__.py and _ps*.py modules.é    )ÚdivisionÚprint_functionN)Údefaultdict)Ú
namedtuple)ÚAF_INET)Ú
SOCK_DGRAM)ÚSOCK_STREAM)ÚAF_INET6)ÚAF_UNIX)é   é   r   ÚFREEBSDÚBSDÚLINUXÚNETBSDÚOPENBSDÚMACOSÚOSXÚPOSIXÚSUNOSÚWINDOWSÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_CLOSINGÚCONN_ESTABLISHEDÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_LAST_ACKÚCONN_LISTENÚ	CONN_NONEÚCONN_SYN_RECVÚCONN_SYN_SENTÚCONN_TIME_WAITÚNIC_DUPLEX_FULLÚNIC_DUPLEX_HALFÚNIC_DUPLEX_UNKNOWNÚSTATUS_DEADÚSTATUS_DISK_SLEEPÚSTATUS_IDLEÚSTATUS_LOCKEDÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_STOPPEDÚSTATUS_SUSPENDEDÚSTATUS_TRACING_STOPÚSTATUS_WAITINGÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_ZOMBIEÚSTATUS_PARKEDÚENCODINGÚENCODING_ERRSr	   ÚpconnÚ	pcputimesÚpctxswÚpgidsÚpioÚpioniceÚ	popenfileÚpthreadÚpuidsÚsconnÚ	scpustatsÚsdiskioÚ	sdiskpartÚ
sdiskusageÚsnetioÚsnicaddrÚ	snicstatsÚsswapÚsuserÚ	conn_tmapÚdeprecated_methodÚisfile_strictÚmemoizeÚparse_environ_blockÚpath_exists_strictÚusage_percentÚsupports_ipv6Úsockfam_to_enumÚsocktype_to_enumÚwrap_numbersÚbytes2humanÚconn_to_ntupleÚdebugÚhiliteÚterm_supports_colorsÚprint_colorÚposixÚntÚlinuxÚdarwinÚfreebsdZopenbsdZnetbsd)ÚsunosÚsolarisÚaixÚrunningÚsleepingz
disk-sleepÚstoppedztracing-stopÚzombieÚdeadz	wake-killÚwakingÚidleÚlockedÚwaitingÚ	suspendedÚparkedÚESTABLISHEDÚSYN_SENTÚSYN_RECVÚ	FIN_WAIT1Ú	FIN_WAIT2Ú	TIME_WAITÚCLOSEÚ
CLOSE_WAITÚLAST_ACKÚLISTENÚCLOSINGÚNONEé   é   c               @   s   e Zd ZdZdZdZdS )Ú	NicDuplexry   rz   r   N)Ú__name__Ú
__module__Ú__qualname__r#   r$   r%   © r   r   úA/opt/alt/python37/lib64/python3.7/site-packages/psutil/_common.pyr{   ‡   s   r{   éÿÿÿÿéþÿÿÿc               @   s   e Zd ZdZdZdS )ÚBatteryTimer   r‚   N)r|   r}   r~   ÚPOWER_TIME_UNKNOWNÚPOWER_TIME_UNLIMITEDr   r   r   r€   rƒ   “   s   rƒ   ÚreplaceÚsurrogateescapeÚtotalÚusedÚfreeÚpercentÚsinÚsoutÚ
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚ	read_timeÚ
write_timeÚdeviceÚ
mountpointÚfstypeÚoptsÚmaxfileÚmaxpathÚ
bytes_sentÚ
bytes_recvÚpackets_sentÚpackets_recvÚerrinÚerroutÚdropinÚdropoutÚnameÚterminalÚhostÚstartedÚpidÚfdÚfamilyÚtypeÚladdrÚraddrÚstatusÚaddressÚnetmaskÚ	broadcastÚptpÚisupÚduplexÚspeedÚmtuÚctx_switchesÚ
interruptsÚsoft_interruptsÚsyscallsÚscpufreqÚcurrentÚminÚmaxÚshwtempÚlabelÚhighÚcriticalÚsbatteryÚsecsleftÚpower_pluggedÚsfanÚuserÚsystemÚchildren_userÚchildren_systemÚpathÚidÚ	user_timeÚsystem_timeÚrealÚ	effectiveÚsavedÚioclassÚvalueÚ	voluntaryÚinvoluntaryÚaddrÚipÚport)ÚallÚtcpÚtcp4ÚudpÚudp4ÚinetÚinet4Úinet6)Útcp6Úudp6Úunixc               @   s*   e Zd ZdZdZd	dd„Zdd„ ZeZdS )
ÚErrorzQBase exception class. All other psutil exceptions inherit
    from this one.
    ÚpsutilÚ c             C   s   t  | |¡ || _d S )N)Ú	ExceptionÚ__init__Úmsg)Úselfrç   r   r   r€   ræ     s    zError.__init__c             C   s   d| j j| jf }| ¡ S )Nzpsutil.%s %s)Ú	__class__r|   rç   Ústrip)rè   Úretr   r   r€   Ú__repr__  s    zError.__repr__N)rä   )r|   r}   r~   Ú__doc__ræ   rì   Ú__str__r   r   r   r€   râ     s
   
râ   c               @   s   e Zd ZdZdZddd„ZdS )ÚNoSuchProcesszXException raised when a process with a certain PID doesn't
    or no longer exists.
    rã   Nc             C   sX   t  | |¡ || _|| _|| _|d krT|r@d| jt| jƒf }n
d| j }d| | _d S )Nz(pid=%s, name=%s)z(pid=%s)zprocess no longer exists )râ   ræ   r¦   r¢   rç   Úrepr)rè   r¦   r¢   rç   Údetailsr   r   r€   ræ   '  s    
zNoSuchProcess.__init__)NN)r|   r}   r~   rí   ræ   r   r   r   r€   rï   !  s   rï   c               @   s   e Zd ZdZdZddd„ZdS )ÚZombieProcessa1  Exception raised when querying a zombie process. This is
    raised on macOS, BSD and Solaris only, and not always: depending
    on the query the OS may be able to succeed anyway.
    On Linux all zombie processes are querable (hence this is never
    raised). Windows doesn't have zombie processes.
    rã   Nc             C   s~   t  | |¡ || _|| _|| _|| _|d krzd| g}|rN| dt| jƒ ¡ |rb| d| j ¡ dd |¡ }d| | _d S )Nzpid=%szname=%szppid=%sz(%s)z, z'process still exists but it's a zombie )	rï   ræ   r¦   Úppidr¢   rç   Úappendrð   Újoin)rè   r¦   r¢   ró   rç   Úargsrñ   r   r   r€   ræ   =  s    
zZombieProcess.__init__)NNN)r|   r}   r~   rí   ræ   r   r   r   r€   rò   4  s   rò   c               @   s   e Zd ZdZdZddd„ZdS )ÚAccessDeniedz@Exception raised when permission to perform an action is denied.rã   Nc             C   sj   t  | |¡ || _|| _|| _|d krf|d k	rJ|d k	rJd|t|ƒf | _n|d k	r`d| j | _nd| _d S )Nz(pid=%s, name=%s)z(pid=%s)rä   )râ   ræ   r¦   r¢   rç   rð   )rè   r¦   r¢   rç   r   r   r€   ræ   Q  s    zAccessDenied.__init__)NNN)r|   r}   r~   rí   ræ   r   r   r   r€   r÷   M  s   r÷   c               @   s   e Zd ZdZdZddd„ZdS )ÚTimeoutExpiredzWRaised on Process.wait(timeout) if timeout expires and process
    is still alive.
    rã   Nc             C   sn   t  | d| ¡ || _|| _|| _|d k	rN|d k	rN|  jd|t|ƒf 7  _n|d k	rj|  jd| j 7  _d S )Nztimeout after %s secondsz (pid=%s, name=%s)z	 (pid=%s))râ   ræ   Úsecondsr¦   r¢   rç   rð   )rè   rù   r¦   r¢   r   r   r€   ræ   e  s    zTimeoutExpired.__init__)NN)r|   r}   r~   rí   ræ   r   r   r   r€   rø   _  s   rø   c             C   sD   yt | ƒ| d }W n tk
r(   dS X |dk	r<t||ƒ}|S dS )z5Calculate percentage usage of 'used' against 'total'.éd   g        N)ÚfloatÚZeroDivisionErrorÚround)r‰   rˆ   Úround_rë   r   r   r€   rO   u  s    
c                s2   t  ˆ¡‡ ‡fdd„ƒ}‡ fdd„}i ‰ ||_|S )a  A simple memoize decorator for functions supporting (hashable)
    positional arguments.
    It also provides a cache_clear() function for clearing the cache:

    >>> @memoize
    ... def foo()
    ...     return 1
        ...
    >>> foo()
    1
    >>> foo.cache_clear()
    >>>
    c                 sH   | t t| ¡ ƒƒf}yˆ | S  tk
rB   ˆ| |Ž }ˆ |< |S X d S )N)Ú	frozensetÚsortedÚitemsÚKeyError)rö   ÚkwargsÚkeyrë   )ÚcacheÚfunr   r€   Úwrapper  s    zmemoize.<locals>.wrapperc                  s   ˆ   ¡  dS )zClear cache.N)Úclearr   )r  r   r€   Úcache_clear˜  s    zmemoize.<locals>.cache_clear)Ú	functoolsÚwrapsr	  )r  r  r	  r   )r  r  r€   rL     s
    	c                s6   t  ˆ ¡‡ fdd„ƒ}dd„ }dd„ }||_||_|S )aú  A memoize decorator which is disabled by default. It can be
    activated and deactivated on request.
    For efficiency reasons it can be used only against class methods
    accepting no arguments.

    >>> class Foo:
    ...     @memoize
    ...     def foo()
    ...         print(1)
    ...
    >>> f = Foo()
    >>> # deactivated (default)
    >>> foo()
    1
    >>> foo()
    1
    >>>
    >>> # activated
    >>> foo.cache_activate(self)
    >>> foo()
    1
    >>> foo()
    >>> foo()
    >>>
    c                sP   y| j ˆ  }W n< tk
r&   ˆ | ƒS  tk
rJ   ˆ | ƒ }| j ˆ < Y nX |S )N)Ú_cacheÚAttributeErrorr  )rè   rë   )r  r   r€   r  »  s    z'memoize_when_activated.<locals>.wrapperc             S   s
   i | _ dS )zjActivate cache. Expects a Process instance. Cache will be
        stored as a "_cache" instance attribute.N)r  )Úprocr   r   r€   Úcache_activateÉ  s    z.memoize_when_activated.<locals>.cache_activatec             S   s"   y| ` W n tk
r   Y nX dS )zDeactivate and clear cache.N)r  r  )r  r   r   r€   Úcache_deactivateÎ  s    z0memoize_when_activated.<locals>.cache_deactivate)r
  r  r  r  )r  r  r  r  r   )r  r€   Úmemoize_when_activated¡  s    r  c          
   C   sV   yt  | ¡}W n6 tk
rD } z|jtjtjfkr4‚ dS d}~X Y nX t |j¡S dS )zœSame as os.path.isfile() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    FN)ÚosÚstatÚOSErrorÚerrnoÚEPERMÚEACCESÚS_ISREGÚst_mode)rÉ   ÚstÚerrr   r   r€   rK   Ú  s    c          
   C   sN   yt  | ¡ W n6 tk
rD } z|jtjtjfkr4‚ dS d}~X Y nX dS dS )zœSame as os.path.exists() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    FNT)r  r  r  r  r  r  )rÉ   r  r   r   r€   rN   é  s    c           	   C   s`   t jrtdkrdS y2t   tt j¡} t | ¡ |  d¡ W dQ R X dS  t jk
rZ   dS X dS )z2Return True if IPv6 is supported on this platform.NF)z::1r   T)ÚsocketÚhas_ipv6r	   r   Ú
contextlibÚclosingÚbindÚerror)Úsockr   r   r€   rP   ø  s    c             C   sz   i }d}t }xh|  d|¡}||kr$P |  d||¡}||krj| ||… }| |d |… }|rb| ¡ }|||< |d }qW |S )zCParse a C environ block of environment variables into a dictionary.r   ú ú=rz   )r   ÚfindÚupper)Údatarë   ÚposÚWINDOWS_Únext_posÚ	equal_posr  rÑ   r   r   r€   rM     s     c             C   s0   t dkr| S y
t | ¡S  tk
r*   | S X dS )zConvert a numeric socket family value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)Úenumr  ÚAddressFamilyÚ
ValueError)Únumr   r   r€   rQ   "  s    
c             C   s0   t dkr| S y
t | ¡S  tk
r*   | S X dS )zConvert a numeric socket type value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)r,  r  Ú
SocketKindr.  )r/  r   r   r€   rR   /  s    
c             C   s   |t jtfkr&|rt|Ž }|r&t|Ž }|t jkrJ|ttfkrJ| |t¡}nt}t|ƒ}t|ƒ}|dkrxt	| |||||ƒS t
| ||||||ƒS dS )z2Convert a raw connection tuple to a proper ntuple.N)r  r   r	   rÔ   r   Úgetr   rQ   rR   r6   r?   )r§   ÚfamÚtype_rª   r«   r¬   Ú
status_mapr¦   r   r   r€   rU   <  s    c                s   ‡ fdd„}|S )zƒA decorator which can be used to mark a method as deprecated
    'replcement' is the method name which will be called instead.
    c                s:   d| j ˆf ‰ | jd krˆ | _t | ¡‡ ‡fdd„ƒ}|S )Nz8%s() is deprecated and will be removed; use %s() insteadc                s    t jˆ tdd t| ˆƒ||ŽS )Nry   )ÚcategoryÚ
stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚgetattr)rè   rö   r  )rç   Úreplacementr   r€   ÚinnerY  s    z/deprecated_method.<locals>.outer.<locals>.inner)r|   rí   r
  r  )r  r<  )r;  )rç   r€   ÚouterS  s    
z deprecated_method.<locals>.outerr   )r;  r=  r   )r;  r€   rJ   O  s    c               @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	d
S )Ú_WrapNumberszNWatches numbers so that they don't overflow and wrap
    (reset to zero).
    c             C   s    t  ¡ | _i | _i | _i | _d S )N)Ú	threadingÚLockÚlockr  Ú	remindersÚreminder_keys)rè   r   r   r€   ræ   f  s    
z_WrapNumbers.__init__c             C   sT   || j kst‚|| jkst‚|| jks*t‚|| j |< ttƒ| j|< ttƒ| j|< d S )N)r  ÚAssertionErrorrB  rC  r   ÚintÚset)rè   Ú
input_dictr¢   r   r   r€   Ú	_add_dictl  s    
z_WrapNumbers._add_dictc             C   sd   | j | }t| ¡ ƒt| ¡ ƒ }x<|D ]4}x"| j| | D ]}| j| |= q<W | j| |= q(W dS )z†In case the number of keys changed between calls (e.g. a
        disk disappears) this removes the entry from self.reminders.
        N)r  rF  ÚkeysrC  rB  )rè   rG  r¢   Úold_dictÚ	gone_keysÚgone_keyÚremkeyr   r   r€   Ú_remove_dead_reminderst  s    

z#_WrapNumbers._remove_dead_remindersc          	   C   s  || j kr|  ||¡ |S |  ||¡ | j | }i }xÌ| ¡ D ]À}|| }y|| }W n tk
rt   |||< w>Y nX g }xvtt|ƒƒD ]f}	||	 }
||	 }||	f}|
|k rÖ| j| |  |7  < | j| |  	|¡ | 
|
| j| |  ¡ qˆW t|ƒ||< q>W || j |< |S )zkCache dict and sum numbers which overflow and wrap.
        Return an updated copy of `input_dict`
        )r  rH  rN  rI  r  ÚrangeÚlenrB  rC  Úaddrô   Útuple)rè   rG  r¢   rJ  Únew_dictr  Úinput_tupleÚ	old_tupleÚbitsÚiÚinput_valueÚ	old_valuerM  r   r   r€   Úrun  s2    


z_WrapNumbers.runNc          	   C   sh   | j X |dkr0| j ¡  | j ¡  | j ¡  n*| j |d¡ | j |d¡ | j |d¡ W dQ R X dS )z>Clear the internal cache, optionally only for function 'name'.N)rA  r  r  rB  rC  Úpop)rè   r¢   r   r   r€   r	  ¦  s    

z_WrapNumbers.cache_clearc          	   C   s"   | j  | j| j| jfS Q R X dS )z5Return internal cache dicts as a tuple of 3 elements.N)rA  r  rB  rC  )rè   r   r   r€   Ú
cache_info²  s    z_WrapNumbers.cache_info)N)
r|   r}   r~   rí   ræ   rH  rN  rZ  r	  r\  r   r   r   r€   r>  a  s   '
r>  c          	   C   s   t j t  | |¡S Q R X dS )zÅGiven an `input_dict` and a function `name`, adjust the numbers
    which "wrap" (restart from zero) across different calls by adding
    "old value" to "new value" and return an updated dict.
    N)Ú_wnrA  rZ  )rG  r¢   r   r   r€   rS   ¸  s    c             K   s   t | df|ŽS )NÚrb)Úopen)Úfnamer  r   r   r€   Úopen_binaryÆ  s    ra  c             K   s*   t r| dt¡ | dt¡ t| df|ŽS )z¨On Python 3 opens a file in text mode by using fs encoding and
    a proper en/decoding errors handler.
    On Python 2 this is just an alias for open(name, 'rt').
    ÚencodingÚerrorsÚrt)ÚPY3Ú
setdefaultr4   r5   r_  )r`  r  r   r   r€   Ú	open_textÊ  s    rg  ú%(value).1f%(symbol)sc             C   sŽ   d}i }x0t |dd… ƒD ]\}}d|d d > ||< qW x>t|dd… ƒD ]*}| || krLt| ƒ||  }|tƒ  S qLW |t|d | d S )zŒUsed by various scripts. See:
    http://goo.gl/zeJZl

    >>> bytes2human(10000)
    '9.8K'
    >>> bytes2human(100001221)
    '95.4M'
    )	ÚBÚKÚMÚGÚTÚPÚEÚZÚYrz   Né
   r   )ÚsymbolrÑ   )Ú	enumerateÚreversedrû   ÚlocalsÚdict)ÚnÚformatÚsymbolsÚprefixrW  Úsrs  rÑ   r   r   r€   rT   Ø  s    	c               C   s   t jd jS )z+Return updated psutil.PROCFS_PATH constant.rã   )ÚsysÚmodulesÚPROCFS_PATHr   r   r   r€   Úget_procfs_pathì  s    r€  c             C   s   | j ttdS )N)rb  rc  )Údecoder4   r5   )r|  r   r   r€   r  ò  s    r  c             C   s   | S )Nr   )r|  r   r   r€   r  õ  s    c             C   s^   t jdkrdS y2dd l}|  ¡ s$t‚| ¡  | d¡dks>t‚W n tk
rT   dS X dS d S )Nr[   Tr   ÚcolorsF)r  r¢   ÚcursesÚisattyrD  Ú	setuptermÚtigetnumrå   )Úfilerƒ  r   r   r€   rX   þ  s    
Fc             C   s   t ƒ s
| S g }tddddddddd	d
	}d|d< y|| }W n( tk
rd   tdt| ¡ ƒ ƒ‚Y nX | |¡ |r~| d¡ dd |¡| f S )z*Return an highlighted version of 'string'.Ú32Ú91Ú33Ú93Ú34Ú35Ú36Ú37Ú30)	ÚgreenÚredÚbrownÚyellowÚblueÚvioletÚ	lightblueÚgreyÚdarkgreyÚ29Nz#invalid color %r; choose between %sÚ1z[%sm%s[0mú;)rX   rw  r  r.  ÚlistrI  rô   rõ   )r|  ÚcolorÚboldÚattrr‚  r   r   r€   rW     s    

c          	   C   s  t ƒ st| |d nêtr.tt| ||ƒ|d nÐddl}d}|jjj}|jjj}t	ddddd}||d< y|| }W n, t
k
rž   td	|t| ¡ ƒf ƒ‚Y nX |r´|dkr´|d
7 }|tjkrÂdnd}	|j|_||	ƒ}
||
|ƒ zt| |d W d||
|ƒ X dS )z$Print a colorized version of string.)r‡  r   Né   ry   r   é   )r‘  r’  r“  r”  z#invalid color %r; choose between %ré   iôÿÿÿiõÿÿÿ)rX   Úprintr   rW   ÚctypesÚwindllÚKernel32ÚGetStdHandleÚSetConsoleTextAttributerw  r  r.  r  rI  r}  ÚstderrÚc_ulongÚrestype)r|  rž  rŸ  r‡  r¥  ÚDEFAULT_COLORr¨  r©  r‚  Ú	handle_idÚhandler   r   r€   rY      s0    


ZPSUTIL_DEBUGc             C   s6   t  t  ¡ j¡\}}}}}td||| f tjd dS )z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.zpsutil-debug [%s:%s]> %s)r‡  N)ÚinspectÚgetframeinfoÚcurrentframeÚf_backr¤  r}  rª  )rç   r`  ÚlinenoÚ	func_nameÚlinesÚindexr   r   r€   rV   F  s    c             C   s   d S )Nr   )rç   r   r   r€   rV   M  s    )N)N)rh  )NF)Žrí   Ú
__future__r   r   r  r  r
  r  r  r  r}  r?  r7  Úcollectionsr   r   r   r   r   r	   ÚImportErrorr
   Úversion_infor,  re  Ú__all__r¢   r   r   ÚplatformÚ
startswithr   r   r   r   r   r   r   r   ÚAIXr*   r+   r'   r,   r.   r2   r&   r0   r1   r(   r)   r/   r-   r3   r   r!   r    r   r   r"   r   r   r   r   r   r   r#   r$   r%   ÚIntEnumr{   ÚglobalsÚupdateÚ__members__r„   r…   rƒ   Úgetfilesystemencodingr4   r5   Úgetfilesystemencodeerrorsr  rG   rC   rA   rB   rD   rH   r?   rE   rF   r@   r¹   r½   rÁ   rÄ   r7   r<   r=   r>   r9   r:   r;   r8   r6   rÔ   rI   rå   râ   rï   rò   r÷   rø   rO   rL   r  rK   rN   rP   rM   rQ   rR   rU   rJ   r>  rS   r]  r	  r\  ra  rg  rT   r€  r  ÚstdoutrX   rW   rY   ÚboolÚgetenvr°  rV   r   r   r   r€   Ú<module>   s|  



	

	







	




	 9W	
	"