+
    VN÷hRR ã                   óV
  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^R	IHt ^R
IHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIH t  ^RIH!t! ^RIH"t" ^RIH#t# ^RIH$t$ ^RIH%t% ^RIH&t& ^RIH't' ^RIH(t( ^RIH)t) ^RIH*t* ^RIH+t+ . R{Ot,]-! ]	R4      '       dX   ],P]                  ]/! ]4       U u. uF5  q Pa                  R4      '       g   K  V Pc                  4       '       g   K3  V NK7  	  up 4       Rt2]Pf                  Pi                  R ]Pj                  ! 4        R!24      t6]Pf                  Pi                  R ]Pj                  ! 4        R"24      t7]-! ]R#4      t8]-! ]R$4      t9]Pt                  ! R%4      t;]Px                  ! 4       t=]P|                  R&8H  t?]@! 4       tAR'tB]P†                  ! R(R)]D! ]
PŠ                  4      /4      tF]FPŽ                  tG ! R* R+]P†                  4      tH]I! 4       P•                  ]HP–                  4       R,]P˜                  R-]Pš                  R.]Pœ                  R/]Pž                  R0]P                   R1]P¢                  R2]P¤                  R3]P¤                  R4]P¦                  R5]P¨                  R6]Pª                  R7]P¬                  /tWR8]P°                  R9]P²                  R:]P´                  R;]P¶                  R<]P¸                  R=]Pº                  R>]P¼                  R?]P¾                  R@]PÀ                  RA]PÂ                  RB]PÄ                  /tc]! RC. R|O4      td]! RD. R}O4      te]! RE. R~O4      tf]! RFRG4      tg]! RH]gPÐ                  R,           4      ti]! RI. R€O4      tj]! RJRKRLP×                  ]jPÐ                  4      ,           4      tl]! RM. R�O4      tm]! RN. R‚O4      tnRO toRP tpRQ tq]$RR 4       tr ]r! RS4       RX tvRY twRZ txR[ tyR\ tzR] t{R^ t|R_ t}R` t~]Pf                  Pi                  Ra4      '       g"   ]Pf                  Pi                  Rb4      '       d   Rc tMRd t]EP                   t€ ! Re Rf]s4      t� ! Rg Rh4      t‚]‚! 4       tƒRƒRi lt„Rj t…Rk t†]EP                  t‡R„Rl ltˆ ! Rm Rn4      t‰R„Ro ltŠRp t‹Rq tŒRr t�Rs tŽRt t�Ru t�Rv t‘Rw t’Rx t“ ! Ry Rz4      t”R# u up i   ]s d)   tt] ! RT]t: 24       ]! RURV4      ! RWRWRW4      su RttAtELRttAtii ; i)…zLinux platform implementation.N)Údefaultdict)Ú
namedtuple)Ú_common)Ú_psposix)Ú_psutil_linux)Ú_psutil_posix)ÚENCODING)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)ÚAccessDenied)ÚNoSuchProcess)ÚZombieProcess)Úbcat)Úcat)Údebug)Údecode)Úget_procfs_path)Úisfile_strict)Úmemoize)Úmemoize_when_activated)Úopen_binary)Ú	open_text)Úparse_environ_block)Úpath_exists_strict)Úsupports_ipv6)Úusage_percentÚprlimitÚRLIMz/sys/class/power_supplyú/proc/ú/smapsú/smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ
SC_CLK_TCKÚlittlei   ÚAddressFamilyÚAF_LINKc                   ó&   € ] tR t^jt^ t^t^t^tRtR# )Ú
IOPriority© N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚ__static_attributes__r*   ó    Ú1/usr/lib/python3/dist-packages/psutil/_pslinux.pyr)   r)   j   s   † ØÐØ€OØ€OØÔr4   r)   ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚPÚ01Ú02Ú03Ú04Ú05Ú06Ú07Ú08Ú09Ú0AÚ0BÚsvmemÚsdiskioÚ	popenfileÚpmemz"rss vms shared text lib data dirtyÚpfullmemÚpmmap_groupedÚ	pmmap_extzaddr perms Ú ÚpioÚ	pcputimesc                óö   € \        V \        4      '       g   Q V 4       h\        P                  ! V 4      p V P	                  R4      ^ ,          p V P                  R4      '       d   \        V 4      '       g   V RR p V # )zWrapper around os.readlink().Ú ú
 (deleted)Néöÿÿÿ)Ú
isinstanceÚstrÚosÚreadlinkÚsplitÚendswithr   )Úpaths   &r5   r^   r^   Æ   si   € ä�dœC× Ò Ð& $Ó&Ð Ü�;Š;�tÓ€Dð �:‰:�fÓ˜aÕ €Dð ‡}�}�\×"Ò"Ô+=¸d×+CÒ+CØ�D�SˆzˆØ€Kr4   c                ó|  € \         P                  R\         P                  R\         P                  R/pW\         P                  \         P                  ,          \         P                  ,          ,          ,          pV \         P                  ,          '       d   VP                  RR^4      pVP                  RR4      pV# )zRConvert file's open() flags into a readable string.
Used by Process.open_files().
ÚrÚwzw+Úazr+)r]   ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)ÚflagsÚ	modes_mapÚmodes   &  r5   Úfile_flags_to_modern   Ú   s{   € ô —‘˜c¤2§;¡;°´R·Y±YÀÐE€IØœbŸk™k¬B¯K©KÕ7¼"¿)¹)ÕCÕDÕE€DØŒr�{‰{×ÔØ�|‰|˜C  aÓ(ˆØ�<‰<˜˜dÓ#€Dà€Kr4   c                óœ   € V P                  RR4      p RpV'       d   RV  2pMRV  R2p\        P                  ! V\        P                  4      # )zÌReturn True if the given name refers to a root device (e.g.
"sda", "nvme0n1") as opposed to a logical partition (e.g.  "sda1",
"nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram")
return True.
Ú/Ú!Tz/sys/block/z/device)rj   r]   ÚaccessÚF_OK)ÚnameÚincluding_virtualra   s   &  r5   Úis_storage_devicerv   ç   sL   € ð �<‰<˜˜SÓ!€DØÐßØ˜T˜FÐ#‰à˜T˜F 'Ð*ˆÜ�9Š9�Tœ2Ÿ7™7Ó#Ð#r4   c                óz  € \        V  R24      ;_uu_ 4       pVP                  4       P                  4       R,          pRRR4       . ROp\        X4      pV^8¼  d   VP	                  R4       V^	8¼  d   VP	                  R4       V^
8¼  d   VP	                  R4       \        RV4      sR#   + '       g   i     Lu; i)	zäSet a namedtuple of variable fields depending on the CPU times
available on this Linux kernel version which may be:
(user, nice, system, idle, iowait, irq, softirq, [steal, [guest,
 [guest_nice]]])
Used by cpu_times() function.
ú/stat:é   NNNÚstealÚguestÚ
guest_niceÚ	scputimes)ÚuserÚniceÚsystemÚidleÚiowaitÚirqÚsoftirq)r   Úreadliner_   ÚlenÚappendr   r}   )Úprocfs_pathÚfÚvaluesÚfieldsÚvlens   &    r5   Úset_scputimes_ntupler�   ú   s’   € ô 
˜�} EÐ*×	+Ô	+¨qØ—‘“×#Ñ#Ó% bÕ)ˆ÷ 
,âK€FÜˆv‹;€DØˆq„yà�‰�gÔØˆq„yà�‰�gÔØˆr„zà�‰�lÔ#Ü˜;¨Ó/‚I÷ 
,×	+ús   —&B*Â*B:	ú/proczignoring exception on import: r}   zuser system idleç        c                ó  € V R,          pWP                  R^ 4      ,           p V R,          pV R,          pV R,          p \	        \        4        R24      p^ pT;_uu_ 4        T FS  p	T	P                  4       p	T	P                  R	4      '       g   K,  T\        T	P                  4       ^,          4      ,          pKU  	  RRR4       T\        ,          pY,
          p
Y4,           pT\        T^,          T4      ,          pY«,          p
Y¥\        TR
,          T4      ,
          ,          p
\        T
4      #   \         d,   p\        TP                  ^ ,           R24       Tu Rp?# Rp?ii ; i  \         d    Tu # i ; i  + '       g   i     LÆ; i)a9  Fallback for kernels < 3.14 where /proc/meminfo does not provide
"MemAvailable", see:
https://blog.famzah.net/2014/09/24/.

This code reimplements the algorithm outlined here:
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
    commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

We use this function also when "MemAvailable" returns 0 (possibly a
kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
In that case this routine matches "free" CLI tool result ("available"
column).

XXX: on recent kernels this calculation may differ by ~1.5% compared
to "MemAvailable:", as it's calculated slightly differently.
It is still way more realistic than doing (free + cached) though.
See:
* https://gitlab.com/procps-ng/procps/issues/42
* https://github.com/famzah/linux-memavailable-procfs/issues/2
ó   MemFree:ó   Cached:s   Active(file):s   Inactive(file):ó   SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfos   lowg       @)ÚgetÚKeyErrorr   Úargsr   r   ÚOSErrorÚstripÚ
startswithÚintr_   ÚPAGESIZEÚmin)ÚmemsÚfreeÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrr‰   Úwatermark_lowÚlineÚavailÚ	pagecaches   &           r5   Úcalculate_avail_vmemr¨      sc  € ð< �Õ€DØ—h‘h˜z¨1Ó-Õ-€Hð	ØÐ/Õ0ˆØ Ð!3Õ4ÐØÐ 0Õ1ÐðÜœ?Ó,Ð-¨YÐ7Ó8ˆð €Mß	
ŠÛˆDØ—:‘:“<ˆDØ�‰˜v×&Ô&Ø¤ T§Z¡Z£\°!¥_Ó!5Õ5’ñ ÷ 
ð
 ”XÕ€MàÕ €EØÕ3€IØ”�Y •] MÓ2Õ2€IØ	Õ€EØ	¤Ð$4°sÕ$:¸MÓ JÕJÕJ€EÜˆu‹:Ðøô1 ô ÜØ�x‰x˜�{ˆmð >ð >ô	
ð �ûðûô ô ØŠðú÷ 
�ús@   £D- ¿E& Á!*E9Â+E9Ä-E#Ä8 EÅE#ÅE#Å&E6Å5E6Å9F		c                 óÒ  € . p / p\        \        4        R24      ;_uu_ 4       pV F5  pVP                  4       p\        V^,          4      R,          W^ ,          &   K7  	  RRR4       VR,          pVR,          p VR,          p VR,          pW�P                  R	^ 4      ,          p VR,          p	 TR,          p
 TR,          p TR,          p TR,          pT^ 8X  d   \        T4      pT^ 8  d   ^ pT P                  R4       MYÕ8”  d   TpY],
          p\        Y],
          T^R7      pT '       dQ   RP                  RP                  T 4      \        T 4      ^8X  d   RMR4      p\        P                  ! T\        ^R7       \        TTTTTT
TTTT	T4      #   + '       g   i     EL?; i  \         d    ^ pT P                  R4        ELGi ; i  \         d    ^ pT P                  R
4        ELJi ; i  \         d5     TR,          p	 EL\  \         d    ^ p	T P                  R4         EL~i ; ii ; i  \         d    ^ p
T P                  R4        EL�i ; i  \         dQ     TR,          TR,          ,           TR,          ,           p ELË  \         d    ^ pT P                  R4         ELíi ; ii ; i  \         d    ^ p ELûi ; i  \         d    \        T4      p ELüi ; i)a  Report virtual memory stats.
This implementation mimics procps-ng-3.3.12, aka "free" CLI tool:
https://gitlab.com/procps-ng/procps/blob/
    24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
The returned values are supposed to match both "free" and "vmstat -s"
CLI tools.
ú/meminfoé   Ns	   MemTotal:r‘   s   Buffers:Úbuffersr’   r“   Úcacheds   Shmem:s
   MemShared:Úshareds   Active:Úactives	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:Úinactives   Slab:s   MemAvailable:Ú	available©Úround_z6{} memory stats couldn't be determined and {} set to 0z, ÚwasÚwere©Ú
stacklevel)r   r   r_   rš   r•   r‡   r”   r¨   r   ÚformatÚjoinr†   ÚwarningsÚwarnÚRuntimeWarningrM   )Úmissing_fieldsr�   r‰   r¥   r‹   Útotalrž   r¬   r­   r®   r¯   r°   Úslabr¦   ÚusedÚpercentÚmsgs                    r5   Úvirtual_memoryrÃ   _  sý  € ð €NØ€DÜ	œÓ)Ð*¨(Ð3×	4Ô	4¸ÛˆDØ—Z‘Z“\ˆFÜ! &¨¥)›n¨tÕ3ˆD˜•‹Oñ ÷ 
5ð �Õ€EØ�Õ€Dð)Ø�{Õ#ˆð
0Ø�jÕ!ˆð 	—(‘(Ð+¨QÓ/Õ/ˆð,Ø�i•ˆð(Ø�jÕ!ˆð
.Ø˜Õ%ˆðØ�H�~ˆð
/ØÐ%Õ&ˆð �AŒ:ô
 )¨Ó.ˆEàˆq„yØˆØ×Ñ˜kÕ*Ø	Œð ˆà�=€Dä˜U�]¨U¸1Ô=€G÷ ØF×MÑMØ�I‰I�nÓ%Ü˜Ó(¨AÔ-‰E°6ó
ˆô 	�Š�cœ>°aÕ8äØØØØØØØØØØØóð ÷Q 
5×	4Ð	4ûô ô )àˆØ×Ñ˜i×(ð)ûô ô (ØˆØ×Ñ˜h×'ð(ûô ô ,ð	,Ø˜-Õ(‹FøÜô 	,ØˆFØ×!Ñ! (×+Ð+ð	,úð,ûô ô (ØˆØ×Ñ˜h×'ð(ûô ô 	.ð	.à�_Õ%Ø�Õ'õ(àÐ(Õ)õ*ó øô
 ô 	.ØˆHØ×!Ñ! *×-Ð-ð	.úð	.ûô ô Ø‹ðûô ô +Ü$ TÓ*‹ð+ús¹   £<FÁ:	F) Â	G Â&	G3 Â0	H5 Â:	I Ã	J8 Ã	K ÆF&	Æ)GÇ
GÇG0Ç/G0Ç3H2Ç?	HÈH.È)H2È-H.È.H2È5IÉIÉJ5É&%JÊJ1Ê,J5Ê0J1Ê1J5Ê8K	ËK	ËK&Ë%K&c                 ó„  € / p \        \        4        R24      ;_uu_ 4       pV F5  pVP                  4       p\        V^,          4      R,          W^ ,          &   K7  	  RRR4        V R,          pV R,          pWE,
          p\        W„^R7      p	 \        \        4        R24      pT;_uu_ 4        R;r«V Fœ  pVP                  R4      '       d1   \        VP                  R	4      ^,          4      ^,          R,          p
MFVP                  R
4      '       d0   \        VP                  R	4      ^,          4      ^,          R,          pV
f   K–  Vf   Kœ   M-	  RpVR,          p\        P                  ! V\        ^R7       ^ ;r«RRR4       \        P                  ! YHYYX
X4      #   + '       g   i     ELL; i  \         d0    \
        P                  ! 4       w     rdrWYG,          pYW,          p ELui ; i  + '       g   i     Lz; i  \         d1   pRT R2p\        P                  ! T\        ^R7       ^ ;r« Rp?L³Rp?ii ; i)zReturn swap memory metrics.rª   r«   Ns
   SwapTotal:s	   SwapFree:r²   z/vmstats   pswpinó    s   pswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r¶   zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (Ú))r   r   r_   rš   r•   ÚcextÚlinux_sysinfor   r™   rº   r»   r¼   r—   r   Ússwap)r�   r‰   r¥   r‹   r¾   rž   Ú_Úunit_multiplierrÀ   rÁ   ÚsinÚsoutrÂ   r£   s                 r5   Úswap_memoryrÎ   à  sù  € à€DÜ	œÓ)Ð*¨(Ð3×	4Ô	4¸ÛˆDØ—Z‘Z“\ˆFÜ! &¨¥)›n¨tÕ3ˆD˜•‹Oñ ÷ 
5ð Ø�]Õ#ˆØ�LÕ!ˆð �<€DÜ˜D°Ô2€GðÜœ?Ó,Ð-¨WÐ5Ó6ˆ÷ ŠQØÐˆCÛ�ð —?‘? 9×-Ò-Ü˜dŸj™j¨Ó.¨qÕ1Ó2°QÕ6¸Õ=‘CØ—_‘_ Z×0Ò0Ü˜tŸz™z¨$Ó/°Õ2Ó3°aÕ7¸$Õ>�DØ”? tÔ'7Ùñ ð E�ØÐ8Õ8�Ü—’˜c¤>¸aÕ@Ø��÷% ô& �=Š=˜ d°S¸$Ó?Ð?÷c 
5×	4Ð	4ûô ô  Ü37×3EÒ3EÓ3GÑ0ˆˆ1ˆa�˜4ØÕ ˆØÕ‹ð ú÷& �Qûô ô ð0Ø03¨u°Að7ð 	ô 	�Š�cœ>°aÕ8ØˆˆŒdûðúsT   ¡<F Á&F4 ÂH Â.A&G1Ä0G1Å
G1Å/G1Æ F1	Æ46G.Ç-G.Ç1H	ÈH?È&H:È:H?c                 óx  € \        4       p \        V 4       \        V  R24      ;_uu_ 4       pVP                  4       P	                  4       pRRR4       X^\        \        P                  4      ^,            pV Uu. uF  p\        V4      \        ,          NK  	  pp\        V!  #   + '       g   i     La; iu upi )zÙReturn a named tuple representing the following system-wide
CPU times:
(user, nice, system, idle, iowait, irq, softirq [steal, [guest,
 [guest_nice]]])
Last 3 fields may not be available on all Linux kernel versions.
rx   N)
r   r�   r   r…   r_   r†   r}   Ú_fieldsÚfloatÚCLOCK_TICKS)rˆ   r‰   rŠ   r‹   r=   s        r5   Ú	cpu_timesrÓ     s•   € ô "Ó#€KÜ˜Ô%Ü	˜�} EÐ*×	+Ô	+¨qØ—‘“×#Ñ#Ó%ˆ÷ 
,à�AœœI×-Ñ-Ó.°Õ2Ð3€FÙ.4Ó5©f¨Œe�A‹hœ×$Ð$©f€FÐ5Ü�fÑÐ÷	 
,×	+üò 6s   ¬B$Á:B7Â$B4	c            	     óð  € \        4       p \        V 4       . p\        V  R24      ;_uu_ 4       pVP                  4        V FŽ  pVP	                  R4      '       g   K  VP                  4       pV^\        \        P                  4      ^,            pV Uu. uF  p\        V4      \        ,          NK  	  pp\        V!  pVP                  V4       K�  	  VuuRRR4       # u upi   + '       g   i     R# ; i)z^Return a list of namedtuple representing the CPU times
for every CPU available on the system.
rx   s   cpuN)r   r�   r   r…   r™   r_   r†   r}   rÐ   rÑ   rÒ   r‡   )rˆ   Úcpusr‰   r¥   rŠ   r‹   r=   Úentrys           r5   Úper_cpu_timesr×   ,  sË   € ô "Ó#€KÜ˜Ô%Ø€DÜ	˜�} EÐ*×	+Ô	+¨qà	�
‰
ŒÛˆDØ�‰˜v×&Ô&ØŸ™›�Ø ¤C¬	×(9Ñ(9Ó$:¸QÕ$>Ð?�Ù:@ÓA¹&°Qœ% ›(¤[×0Ð0¹&�ÐAÜ! 6Ñ*�Ø—‘˜EÖ"ñ ð ÷ 
,Ò	+ùò B÷ 
,×	+Ð	+ús#   ®*C$Á7C$ÂC
Â3!C$ÃC$Ã$C5	c                 óŽ  €  \         P                  ! R4      #   \         Ed!    ^ p \        \	        4        R24      ;_uu_ 4       pT F3  pTP                  4       P                  R4      '       g   K*  T ^,          p K5  	  RRR4       M  + '       g   i     M; iT ^ 8X  d•   \        P                  ! R4      p\        \	        4        R24      ;_uu_ 4       pT F=  pTP                  R4      ^ ,          pTP                  T4      '       g   K4  T ^,          p K?  	  RRR4       M  + '       g   i     M; iT ^ 8X  d    R# T u # i ; i)z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNú/cpuinfos	   processorNzcpu\drx   rT   )r]   ÚsysconfÚ
ValueErrorr   r   Úlowerr™   ÚreÚcompiler   r_   Úmatch)Únumr‰   r¥   Úsearchs       r5   Úcpu_count_logicalrã   @  sÿ   € ðÜ�zŠzÐ/Ó0Ð0øÜõ àˆÜœOÓ-Ð.¨hÐ7×8Ô8¸AÛ�Ø—:‘:“<×*Ñ*¨<×8Ô8Ø˜1•H’Cñ ÷ 9×8×8Ð8úð �!Œ8Ü—Z’Z Ó)ˆFÜœoÓ/Ð0°Ð6×7Ô7¸1Û�DØŸ:™: c›?¨1Õ-�DØ—|‘| D×)Ô)Ø˜q�šñ ÷ 8×7×7Ð7úð �!Œ8âØŠ
ð-úsR   ‚ ˜,EÁ(BÁ1BÁ>	EÂBÂAEÃ2D"ÄD"Ä	EÄ"D2Ä-EÄ?EÅEc                 ó`  € \        4       p RpRp\        P                  ! V4      ;'       g    \        P                  ! V4       FL  p\        V4      ;_uu_ 4       pV P                  VP	                  4       P                  4       4       RRR4       KN  	  \        V 4      pV^ 8w  d   V# / p/ p\        \        4        R24      ;_uu_ 4       pV Fz  pVP                  4       P                  4       pV'       g    VR,          WgR,          &   / pK@  VP                  R4      '       g   KY  VP                  R^4      w  rš\        V
4      Wy&   K|  	  RRR4       \        VP                  4       4      pT;'       g    R#   + '       g   i     EKF  ; i  \         d     L‘i ; i  + '       g   i     L[; i)	z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNrÚ   ó	   cpu coresó   physical ids   	:)ræ   rå   )ÚsetÚglobr   ÚaddÚreadr˜   r†   r   rÝ   r•   r™   r_   rš   ÚsumrŠ   )ÚlsÚp1Úp2ra   r‰   ÚresultÚmappingÚcurrent_infor¥   ÚkeyÚvalues              r5   Úcpu_count_coresrô   ]  sb  € ô 
‹€Bð 
E€BØ	J€BÜ—	’	˜"“×.Ð.¤§¢¨2£Ò.ˆÜ˜×Ô !Ø�F‰F�1—6‘6“8—>‘>Ó#Ô$÷ Ññ /ô �‹W€FØ�„{Øˆð €GØ€LÜ	œÓ)Ð*¨(Ð3×	4Ô	4¸ÛˆDØ—:‘:“<×%Ñ%Ó'ˆDßðØ<HØ$õ=�G¨Õ8Ñ9ð
  "’Ø—‘Ð!?×@Ô@à!ŸZ™Z¨°Ó2‘
�Ü$'¨£J�Ó!ñ ÷ 
5ô" �—‘Ó!Ó"€FØ�>ˆ>�TÐ÷7 ×Ñûô$  ô Ùðú÷ 
5×	4úsB   Á.E7Ã	,FÃ6FÄFÄ%%FÅ7F	ÆF	ÆFÆF	ÆFÆF-	c                 ó<  € \        \        4        R24      ;_uu_ 4       p RpRpRpV  F¼  pVP                  R4      '       d"   \        VP	                  4       ^,          4      pMoVP                  R4      '       d"   \        VP	                  4       ^,          4      pM7VP                  R4      '       d!   \        VP	                  4       ^,          4      pVf   K°  Vf   K¶  Vf   K¼   M	  RRR4       ^ p\
        P                  ! XXXV4      #   + '       g   i     L+; i)z*Return various CPU stats as a named tuple.rx   Ns   ctxts   intrs   softirq)r   r   r™   rš   r_   r   Ú	scpustats)r‰   Úctx_switchesÚ
interruptsÚsoft_interruptsr¥   Úsyscallss         r5   Ú	cpu_statsrû   ‡  sâ   € ä	œÓ)Ð*¨%Ð0×	1Ô	1°QØˆØˆ
ØˆÛˆDØ�‰˜w×'Ò'Ü" 4§:¡:£<°¥?Ó3‘Ø—‘ ×)Ò)Ü  §¡£¨a¥Ó1‘
Ø—‘ ×,Ò,Ü"% d§j¡j£l°1¥oÓ"6�àÔ(Ø#Ô/ØÔ*áñ ÷	 
2ð" €HÜ×ÒØ�j /°8óð ÷% 
2×	1ús*   ŸADÁ:7DÂ2!DÃDÃDÃ$DÄD	c                 ó8  € \        \        4        R24      ;_uu_ 4       p V  Uu. uFL  pVP                  4       P                  R4      '       g   K*  \	        VP                  R^4      ^,          4      NKN  	  upuuRRR4       # u upi   + '       g   i     R# ; i)z7Return current CPU frequency from cpuinfo if available.rÚ   s   cpu mhzó   :N)r   r   rÝ   r™   rÑ   r_   )r‰   r¥   s     r5   Ú_cpu_get_cpuinfo_freqrþ      s{   € ä	œÓ)Ð*¨(Ð3×	4Ô	4¸ñ ó
á�Ø�z‰z‹|×&Ñ& z×2ô *ŒE�$—*‘*˜T 1Ó% aÕ(Ö)Ùñ
÷ 
5Ò	4ùò
÷ 
5×	4Ð	4ús"   ŸB¤'BÁ&BÁ6BÂBÂB	z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	     óR  € \        4       p \        P                  ! R4      ;'       g    \        P                  ! R4      pVP                  R R7       . p\        P                  P
                  p\        V4       EF)  w  rE\        V4      \        V 4      8X  d   W,          R,          pM\        V! VR4      RR7      pVfg   \        V! VR	4      RR7      pVfO   R
V R2p\        VRR7      R8X  d*   VP                  \        P                  ! RRR4      4       K   Rp\        V4      h\        V4      R,          p\        \        V! VR4      4      4      R,          p	\        \        V! VR4      4      4      R,          p
VP                  \        P                  ! WjV	4      4       EK,  	  V# )zjReturn frequency metrics for all CPUs.
Contrarily to other OSes, Linux updates these values in
real-time.
z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc                 ó^   € \        \        P                  ! R V 4      P                  4       4      # )z[0-9]+)rš   rÞ   râ   Úgroup©r=   s   &r5   Ú<lambda>Úcpu_freq.<locals>.<lambda>·  s   € ¤¤R§Y¢Y¨y¸!Ó%<×%BÑ%BÓ%DÔ!Er4   )rò   iè  Úscaling_cur_freqN©rŸ   Úcpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
r�   z!can't find current frequency fileÚscaling_max_freqÚscaling_min_freq)rþ   rè   Úsortr]   ra   r¹   Ú	enumerater†   r   r   r‡   r   ÚscpufreqÚNotImplementedErrorrš   )Úcpuinfo_freqsÚpathsÚretÚpjoinÚira   ÚcurrÚonline_pathrÂ   Úmax_Úmin_s              r5   Úcpu_freqr  ®  sr  € ô
 .Ó/ˆÜ—	’	Ø:ó
÷ Dð Dä�YŠYÐBÓCð 	ð 	�
‰
ÑEˆ
ÔFØˆÜ—‘—‘ˆÜ  ×'‰GˆAÜ�5‹zœS Ó/Ô/ð %Õ'¨$Õ.‘ä™E $Ð(:Ó;ÀdÔK�ØŠ|ô ™E $Ð(:Ó;ÀdÔK�Ø’<Ø$?À¸sÀ'Ð"J�Kä˜;°Ô6¸%Ô?ØŸ
™
¤7×#3Ò#3°C¸¸cÓ#BÔCÙ Ø=�CÜ-¨cÓ2Ð2Ü�t“9˜tÕ#ˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÕDˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÕDˆDØ�J‰J”w×'Ò'¨°DÓ9×:ñ- (ð. ˆ
r4   c                 ól   € \        4        U u. uF  p \        P                  ! V RR4      NK  	  up # u up i )zmAlternate implementation using /proc/cpuinfo.
min and max frequencies are not available and are set to None.
r�   )rþ   r   r  r  s    r5   r  r  Õ  s1   € ô 8MÔ7NÓOÑ7N°!”× Ò   C¨Ö-Ñ7NÑOÐOùÒOs   �!1c                   ó   € ] tR tRtRtR# )Ú_Ipv6UnsupportedErroriä  r*   N)r+   r,   r-   r.   r3   r*   r4   r5   r  r  ä  s   † Ûr4   r  c                   óx   a € ] tR tRt o RtR tR tR t]R 4       t	]RR l4       t
]RR	 l4       tRR
 ltRtV tR# )ÚNetConnectionsiè  a[  A wrapper on top of /proc/net/* files, retrieving per-process
and system-wide open connections (TCP, UDP, UNIX) similarly to
"netstat -an".

Note: in case of UNIX sockets we're only able to determine the
local endpoint/path, not the one it's connected to.
According to [1] it would be possible but not easily.

[1] http://serverfault.com/a/417946
c                ó˜  € R \         P                  \         P                  3pR\         P                  \         P                  3pR\         P                  \         P                  3pR\         P                  \         P                  3pR\         P
                  R3pRWW4V3R W3RV3RV3RW43RV3RV3RV3R	WW43R
W3RW$3/V n        RV n        R# )ÚtcpÚtcp6ÚudpÚudp6ÚunixNÚallÚtcp4Úudp4ÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)Úselfr$  r  r%  r!  r"  s   &     r5   Ú__init__ÚNetConnections.__init__ô  sÔ   € ð ”v—~‘~¤v×'9Ñ'9Ð:ˆØœŸ™¬×);Ñ);Ð<ˆØ”v—~‘~¤v×'8Ñ'8Ð9ˆØœŸ™¬×):Ñ):Ð;ˆØœŸ™¨Ð-ˆà�D ¨DÐ1Ø�D�<Ø�T�GØ�T�GØ�D�<Ø�T�GØ�T�GØ�T�GØ�T Ð,Ø�d�\Ø�d�\ð
ˆŒ	ð !ˆÖr4   c                ó@  € \        \        4      p\        P                  ! V P                   R V R24       Fh  p \        V P                   R V RV 24      pVP                  R4      '       d1   VR,          RR pW$,          P                  V\        V4      34       Kh  Kj  	  V#   \        \        3 d     K‚  \         d\   pTP                  \        P                  8X  d    Rp?K±  TP                  \        P                  8X  d   \        T4        Rp?Ká  h Rp?ii ; i)rp   ú/fdú/fd/zsocket:[:é   NNNéÿÿÿÿ)r   Úlistr]   Úlistdirr0  r^   r™   r‡   rš   ÚFileNotFoundErrorÚProcessLookupErrorr—   ÚerrnoÚEINVALÚENAMETOOLONGr   )r1  ÚpidÚinodesÚfdÚinoder£   s   &&    r5   Úget_proc_inodesÚNetConnections.get_proc_inodes  s÷   € ÜœTÓ"ˆÜ—*’* × 1Ñ 1Ð2°!°C°5¸Ð<Ö=ˆBð9Ü  D×$5Ñ$5Ð#6°a¸°u¸DÀÀÐ!EÓF�ð  ×#Ñ# J×/Ò/à! "�I c r˜N�EØ•M×(Ñ(¨#¬s°2«w¨Ö8ñ 0ñ% >ð, ˆøô' &Ô'9Ð:ô ò Üô Ø—9‘9¤§¡Ô,åØ—9‘9¤× 2Ñ 2Ô2ä˜#”JÝØûðús/   ºB$Â$DÂ8DÃDÃDÃ'*DÄDÄDc                ó¨   € / p\        4        F$  p VP                  V P                  V4      4       K&  	  V#   \        \        \
        3 d     KC  i ; i©N)ÚpidsÚupdaterD  r;  r<  ÚPermissionError)r1  rA  r@  s   &  r5   Úget_all_inodesÚNetConnections.get_all_inodes%  sT   € ØˆÜ–6ˆCð
Ø—‘˜d×2Ñ2°3Ó7Ö8ñ ð ˆøô &Ô'9¼?ÐKô ò ðús   ‘ 7·AÁAc           
     ó€  € V P                  R4      w  r#\        V^4      pV'       g   R# VP                  R4      pV\        P                  8X  do   \
        '       d7   \        P                  ! V\        P                  ! V4      RRR1,          4      pMñ\        P                  ! V\        P                  ! V4      4      pMÅ\        P                  ! V4      p \
        '       dR   \        P                  ! \        P                  \        P                  ! R.\        P                  ! RV4      O5!  4      pMQ\        P                  ! \        P                  \        P                  ! R.\        P                  ! RV4      O5!  4      p \         P"                  ! W#4      #   \         d    \        4       '       g   \        Rhh i ; i)a.  Accept an "ip:port" address as displayed in /proc/net/*
and convert it into a human readable form, like:

"0500000A:0016" -> ("10.0.0.5", 22)
"0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)

The IP address portion is a little or big endian four-byte
hexadecimal number; that is, the least significant byte is listed
first, so we need to reverse the order of the bytes to convert it
to an IP address.
The port is represented as a two-byte hexadecimal number.

Reference:
http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
Ú:ÚasciiNz>4Iz<4Ir*   r8  )r_   rš   Úencoder)  r*  ÚLITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoder,  ÚstructÚpackÚunpackrÜ   r   r  r   Úaddr)rX  ÚfamilyÚipÚports   &&  r5   Údecode_addressÚNetConnections.decode_address5  s@  € ð" —:‘:˜c“?‰ˆÜ�4˜‹}ˆ÷ ØˆIØ�Y‰Y�wÓˆØ”V—^‘^Ô#ç‹}Ü×%Ò% f¬f×.>Ò.>¸rÓ.BÁ4ÀRÀ4Õ.HÓI‘ä×%Ò% f¬f×.>Ò.>¸rÓ.BÓC‘ä×!Ò! "Ó%ˆBðç “=Ü×)Ò)ÜŸ™ÜŸš EÐE¬F¯MªM¸%ÀÓ,DÓEó‘Bô
  ×)Ò)ÜŸ™ÜŸš EÐE¬F¯MªM¸%ÀÓ,DÓEó‘Bô �|Š|˜BÓ%Ð%øô ô ä$—’Ü/°TÐ9Øð	ús   ÃF Ã!AF Ä2AF Æ$F=Nc              #  ó   "  € V P                  R4      '       d(   \        P                  P                  V 4      '       g   R# \	        V 4      ;_uu_ 4       pVP                  4        \        V^4       F²  w  rg VP                  4       R,          w
  r‰r«    rŒYÃ9   d   Y<,          ^ ,          w  rïMRRrþTe	   YN8w  d   KL  T\        P                  8X  d   \        T,          pM\        P                  p \        P!                  Y‘4      p	\        P!                  Y¡4      p
YñY)Y«T3x € K´  	  RRR4       R#   \         d    RT  RT RT: 2p\        T4      Rhi ; i  \"         d     Kõ  i ; i  + '       g   i     R# ; i5i)z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6NºNé
   Núerror while parsing ú; malformed line rT   r8  )r`   r]   ra   Úexistsr   r…   r  r_   rÜ   ÚRuntimeErrorr)  r+  ÚTCP_STATUSESr   Ú	CONN_NONEr  r\  r  )ÚfilerY  Útype_rA  Ú
filter_pidr‰   Úlinenor¥   rÊ   ÚladdrÚraddrÚstatusrC  rÂ   r@  rB  s   &&&&&           r5   Úprocess_inetÚNetConnections.process_ineth  se  é € ð �=‰=˜×Ò¤b§g¡g§n¡n°T×&:Ò&:áÜ�t�_Œ_ Ø�J‰JŒLÜ )¨!¨Q¦‘�ð	6àŸ
™
› SÕ)ñ B�A˜e¨Q°°1°a¸ð ”?ð %�m¨AÕ.‘G�C˜à" B˜ØÒ)¨jÔ.?Ùà¤× 2Ñ 2Ô2Ü!-¨fÕ!5™ä!(×!2Ñ!2˜ð!Ü .× =Ñ =¸eÓ L˜Ü .× =Ñ =¸eÓ L˜ð  u°UÀCÐHÔHñC !0÷ ‰_øô "ô 6à.¨t¨fð 5Ø"˜8 1 T¡Hð.ð ô ' sÓ+°Ð5ð6ûô4 1ô !Ú ð!ú÷C �_ˆ_üs_   ‚<E>¿E>Á"E*Á7D1ÂAE*Ã1*EÄE*Ä'
E>Ä1$E	ÅE*ÅE'	Å#E*Å&E'	Å'E*Å*E;	Å5	E>c              #  ó6  "  € \        V 4      ;_uu_ 4       pVP                  4        V F¡  pVP                  4       p VR,          w     rxryY’9   d
   Y),          pMR.pT Ff  w  rÍTe	   Y<8w  d   K  \        T4      ^8X  d
   TR,          MRp\        P                  ! \        T4      4      pRp\        P                  pYÑYŽTTT3x € Kh  	  K£  	  RRR4       R#   \         d     RT9  d    KÄ  RT  RT: 2p
\	        T
4      hi ; i  + '       g   i     R# ; i5i)	zParse /proc/net/unix files.:é    é   NrT   rb  rc  NÚ r8  )Nr8  )
r   r…   r_   rÜ   re  r†   r   Úsocktype_to_enumrš   rg  )rh  rY  rA  rj  r‰   r¥   ÚtokensrÊ   ri  rC  rÂ   Úpairsr@  rB  ra   rm  rn  s   &&&&             r5   Úprocess_unixÚNetConnections.process_unix“  s  é € ô �t�_Œ_ Ø�J‰JŒLÛ�ØŸ™›�ð	,Ø28¸µ+Ñ/�A�q˜!˜Q qð ”?ð #�M‘Eà'˜L�EÛ$‘G�CØ!Ò-°*Ô2CÙ ä-0°«[¸AÔ-=˜v bžzÀ2˜Ü '× 8Ò 8¼¸U»Ó D˜ð !#˜Ü!(×!2Ñ!2˜Ø!¨5¸¸vÀsÐKÔKó  %ñ% ÷ ‰_øô "ô ,Ø $”â à.¨t¨fÐ4EÀdÁXÐNð ô ' sÓ+Ð+ð,ú÷ �_ˆ_üs@   ‚D–&D½CÁBDÃ
DÃD	Ã*DÃ-D	ÄDÄD	Ä	Dc                óR  € \        4       V n        Ve   V P                  V4      pV'       g   . # MV P                  4       p\	        4       pV P
                  V,           F½  w  rVpV P                   RV 2pV\        P                  \        P                  09   d   V P                  W†WsVR7      p	MV P                  W†W2R7      p	V	 FS  w  r¦r{rÍpV'       d   \        P                  ! W¦W{WÍ4      pM\        P                  ! W¦W{WÍV4      pVP                  V4       KU  	  K¿  	  \        V4      # )Nz/net/)rj  )r   r0  rD  rK  rç   r/  r)  r*  r,  ro  rx  r   ÚpconnÚsconnré   r9  )r1  Úkindr@  rA  r  Ú
proto_namerY  ri  ra   rì   rB  rl  rm  rn  Ú	bound_pidÚconns   &&&             r5   ÚretrieveÚNetConnections.retrieve·  s  € Ü+Ó-ˆÔØŠ?Ø×)Ñ)¨#Ó.ˆFßà�	ð ð ×(Ñ(Ó*ˆFÜ‹eˆØ)-¯©°4¯¨Ñ%ˆJ Ø×'Ñ'Ð(¨¨j¨\Ð:ˆDØœ&Ÿ.™.¬&¯/©/Ð:Ô:Ø×&Ñ&Ø %¸Cð 'ó ‘ð ×&Ñ& t°VÐ&ÓL�ÛFHÑB�˜E¨%¸ßÜ"Ÿ=š=Ø E°%ó‘Dô #Ÿ=š=Ø E°%Àó�Dð —‘˜–ó GIñ *9ô$ �C‹yÐr4   )r0  r/  rG  )r+   r,   r-   r.   Ú__doc__r2  rD  rK  Ústaticmethodr\  ro  rx  r�  r3   Ú__classdictcell__©Ú__classdict__s   @r5   r  r  è  sf   ø‡ € ñ	ò!ò.ò4ð  ñ0&ó ð0&ðd ó(Ió ð(IðT ó!Ló ð!L÷Fò r4   r  c                ó,   € \         P                  V 4      # )z$Return system-wide open connections.)Ú_net_connectionsr�  )r}  s   &r5   Únet_connectionsrŠ  Ù  s   € ä×$Ñ$ TÓ*Ð*r4   c                 óÜ  € \        \        4        R24      ;_uu_ 4       p V P                  4       pRRR4       / pXR,           F’  pVP                  R4      pV^ 8”  g   Q \	        V4      4       hVRV P                  4       pW4^,           R P                  4       P                  4       p\        \        V4      w  ppp	p
ppppppppppppVVVVV	VV
V3W%&   K”  	  V#   + '       g   i     L³; i)zkReturn network I/O statistics for every network interface
installed on the system as a dict of raw tuples.
z/net/devNºé   NNrN  )	r   r   Ú	readlinesÚrfindÚreprr˜   r_   Úmaprš   )r‰   ÚlinesÚretdictr¥   Úcolonrt   r‹   Ú
bytes_recvÚpackets_recvÚerrinÚdropinÚ_fifoinÚ_frameinÚ_compressedinÚ_multicastinÚ
bytes_sentÚpackets_sentÚerroutÚdropoutÚ_fifooutÚ_collisionsoutÚ_carrieroutÚ_compressedouts                          r5   Únet_io_countersr¥  Þ  s  € ô 
”oÓ'Ð(¨Ð1×	2Ô	2°aØ—‘“ˆ÷ 
3à€GØ�b—	�	ˆØ—
‘
˜3“ˆØ�qŒyÐ$œ$˜t›*Ó$ˆyØ�F�Uˆ|×!Ñ!Ó#ˆØ˜a•i�kÐ"×(Ñ(Ó*×0Ñ0Ó2ˆô* ”�VÓñ'	
àØØØØØØØàØØØØØØØð ØØØØØØØð	
ˆ‹ñ7 ðJ €N÷Q 
3×	2ús   ŸCÃC+	c                 óH  € \         P                  \        \         P                  \        \         P
                  \        /p \        4       P                  4       p/ pV F  p \        P                  ! V4      p\        P                  ! V4      p\         P                  ! V4      w  rgRP                  V4      pRV9   p	\        P                  ! W�V,          WtV4      W#&   K�  	  V#   \          d7   p
T
P"                  \"        P$                  8w  d   h \'        T
4        Rp
?
KÁ  Rp
?
ii ; i)z)Get NIC stats (isup, duplex, speed, mtu).Ú,ÚrunningN)rÇ   ÚDUPLEX_FULLr	   ÚDUPLEX_HALFr
   ÚDUPLEX_UNKNOWNr   r¥  ÚkeysÚ
cext_posixÚ
net_if_mtuÚnet_if_flagsÚnet_if_duplex_speedr¹   r   Ú	snicstatsr—   r=  ÚENODEVr   )Ú
duplex_mapÚnamesr  rt   Úmturk   ÚduplexÚspeedÚoutput_flagsÚisupr£   s              r5   Únet_if_statsrº    sò   € ô 	×Ñœ/Ü×Ñœ/Ü×ÑÔ/ð€Jô
 Ó×"Ñ"Ó$€EØ
€CÛˆð	Ü×'Ò'¨Ó-ˆCÜ×+Ò+¨DÓ1ˆEÜ ×4Ò4°TÓ:‰MˆFð Ÿ8™8 E›?ˆLØ Ñ%ˆDÜ×)Ò)Ø Õ(¨%°lóˆC‹Iñ ð  €Jøô ô 	à�y‰yœEŸL™LÔ(ØÜ�#�JŠJûð		ús   ÁAC Ã D!Ã++DÄD!c                ó°  € R pR p\         P                  P                  \        4        R24      '       d	   V! 4       pME\         P                  P                  R4      '       d	   V! 4       pM\        4        R2p\	        V4      h/ pV FJ  pVw
  rxršr¼rÞppV '       g   \        V4      '       g   K'  V
\        ,          p
V\        ,          pW‰W«WÍWïV3	WW&   KL  	  V# )z[Return disk I/O statistics for every disk installed on the
system as a dict of raw tuples.
c               3   óv  "  € \        \        4        R 24      ;_uu_ 4       p V P                  4       pRRR4       X Fä  pVP                  4       p\	        V4      pV^8X  d;   V^,          p\        V^,          4      p\        \
        VR,          4      w
  rxršprÍrïpM{V^8X  g   V^8¼  d)   V^,          p\        \
        VR,          4      w  rgr‰r«rÍrïpMEV^8X  d.   V^,          p\        \
        VR,          4      w  rhr¬^ ;p	;p;p;r¿MRV: 2p\        V4      hWVW¨WÉVW{V3
x € Kæ  	  R#   + '       g   i     Lü; i5i)ú
/diskstatsN:é   é   N:é   r¿  N:rÀ  NNznot sure how to interpret line )r   r   rŽ  r_   r†   rš   r‘  rÜ   )r‰   r’  r¥   r‹   Úflenrt   ÚreadsÚreads_mergedÚrbytesÚrtimeÚwritesÚwrites_mergedÚwbytesÚwtimerÊ   Ú	busy_timerÂ   s                    r5   Úread_procfsÚ%disk_io_counters.<locals>.read_procfs6  s4  é € ô" œ/Ó+Ð,¨JÐ7×8Ô8¸AØ—K‘K“MˆE÷ 9ãˆDØ—Z‘Z“\ˆFÜ�v“;ˆDà�rŒzà˜a•y�Ü˜F 1�I›�ä69¼#¸vÀd½|Ó6Lñ4� u°mØ 1±Ø˜”˜t rœzà˜a•y�ä69¼#¸vÀd½|Ó6Lñ4� f°VØ 1±Ø˜”à˜a•y�Ü03´C¸À½Ó0DÑ-�˜vØKLÐL�ÐL˜ÐL ÐL¨}¸yà7¸±xÐ@�Ü  “oÐ%Ø °¸uØ°	ð;ô ;ó/ ÷ 9×8üs   ‚D9¡D&²C4D9Ä&D6	Ä1D9c               3   óR  "  € \         P                  ! R 4       Fõ  p \         P                  ! \         P                  P	                  R V 4      4       Fº  w  rpRV9  d   K  \        \         P                  P	                  VR4      4      ;_uu_ 4       pVP                  4       P                  4       P                  4       pRRR4       \         P                  P                  V4      p\        \        XR,          4      w
  rxršr¼rÞr/WgW¹WÚWèWÏ3
x € K¼  	  K÷  	  R#   + '       g   i     L_; i5i)ú
/sys/blockÚstatNr`  )r]   r:  Úwalkra   r¹   r   rê   r˜   r_   Úbasenamer‘  rš   )ÚblockÚrootrÊ   Úfilesr‰   r‹   rt   rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  s                   r5   Ú
read_sysfsÚ$disk_io_counters.<locals>.read_sysfsd  sÚ   é € Ü—Z’Z Ö-ˆEÜ"$§'¢'¬"¯'©'¯,©,°|ÀUÓ*KÖ"L‘�˜Ø Ô&ÙÜœrŸw™wŸ|™|¨D°&Ó9×:Ô:¸aØŸV™V›XŸ^™^Ó-×3Ñ3Ó5�F÷ ;ä—w‘w×'Ñ'¨Ó-�ô 47´s¸FÀ3½KÓ3Hñ1� f°VØ 1Ø F°FØ¨MðFô Fó #Mó .÷ ;×:üs   ‚BD'Â-D	Â=AD'ÄD$ÄD'r½  rÎ  z6/diskstats nor /sys/block are available on this system)r]   ra   rd  r   r  rv   ÚDISK_SECTOR_SIZE)ÚperdiskrË  rÕ  ÚgenrÂ   r“  rÖ   rt   rÂ  rÆ  rÄ  rÈ  rÅ  rÉ  rÃ  rÇ  rÊ  s   &                r5   Údisk_io_countersrÚ  1  sâ   € ò
+;ò\Fô 
‡w�w‡~�~œÓ*Ð+¨:Ð6×7Ò7Ù‹m‰Ü	�‰�‰˜×	%Ò	%Ù‹l‰ô Ó Ð!ð "ð ð 	ô " #Ó&Ð&à€GÛˆð ).ñ	&ˆ�f f°UØ˜9ßÔ0°×6Ò6ñ àÔ"Õ"ˆØÔ"Õ"ˆØ¨¸Ø%°iðAˆ‹ñ) ð0 €Nr4   c                   óJ   a € ] tR tRt o RtRR.tR tR tR tR t	R	 t
R
tV tR# )ÚRootFsDeviceFinderiš  a2  disk_partitions() may return partitions with device == "/dev/root"
or "rootfs". This container class uses different strategies to try to
obtain the real device path. Resources:
https://bootlin.com/blog/find-root-device/
https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/.
ÚmajorÚminorc                ó²   € \         P                  ! R 4      P                  p\         P                  ! V4      V n        \         P                  ! V4      V n        R# )rp   N)r]   rÏ  Úst_devrÝ  rÞ  )r1  Údevs   & r5   r2  ÚRootFsDeviceFinder.__init__¤  s3   € Ü�gŠg�c‹l×!Ñ!ˆÜ—X’X˜c“]ˆŒ
Ü—X’X˜c“]ˆŽ
r4   c                óL  € \        \        4        R 24      ;_uu_ 4       pVP                  4       R,           FÍ  pVP                  4       p\	        V4      ^8  d   K%  V^ ,          P                  4       '       d   \        V^ ,          4      MRpV^,          P                  4       '       d   \        V^,          4      MRpV^,          pW@P                  8X  g   K¢  WPP                  8X  g   K´  V'       g   K¾  RV 2u uuRRR4       # 	  RRR4       R#   + '       g   i     R# ; i)z/partitionsrŒ  Nú/dev/)	r   r   rŽ  r_   r†   Úisdigitrš   rÝ  rÞ  )r1  r‰   r¥   r‹   rÝ  rÞ  rt   s   &      r5   Úask_proc_partitionsÚ&RootFsDeviceFinder.ask_proc_partitions©  sÏ   € Üœ/Ó+Ð,¨KÐ8×9Ô9¸QØŸ™› b×)Ð)�ØŸ™›�Ü�v“; ”?ÙØ*0°­)×*;Ñ*;×*=Ò*=œ˜F 1�IœÀ4�Ø*0°­)×*;Ñ*;×*=Ò*=œ˜F 1�IœÀ4�Ø˜a•y�ØŸJ™JÖ&¨5·J±JÖ+>ß‘tØ!& t f˜~Ñ-÷ :Ò9Ù)÷ :×9×9Ò9ús0   ŸADÁ90DÂ**DÃDÃ+DÃ5DÄDÄD#	c                ób  € R V P                    RV P                   R2p\        V4      ;_uu_ 4       pV F[  pVP                  R4      '       g   K  VP	                  4       P                  R4      ^,          pV'       g   KL  RV 2u uuRRR4       # 	  RRR4       R#   + '       g   i     R# ; i)z/sys/dev/block/rN  z/ueventzDEVNAME=rä  N)rÝ  rÞ  r   r™   r˜   Ú
rpartition)r1  ra   r‰   r¥   rt   s   &    r5   Úask_sys_dev_blockÚ$RootFsDeviceFinder.ask_sys_dev_block¶  s   € Ø  §¡ ¨A¨d¯j©j¨\¸ÐAˆÜ�t�_Œ_ Û�Ø—?‘? :×.Ô.ØŸ:™:›<×2Ñ2°:Ó>¸qÕA�Dß‘tØ!& t f˜~Ñ-÷ Š_Ù÷ �_�_Š_ús   ±BÁ+BÂ BÂBÂB.	c                óè  € V P                    R V P                   2p\        P                  ! R4      pV F”  p \	        V4      pT;_uu_ 4        VP                  4       P                  4       pWQ8X  dN   \        P                  P                  \        P                  P                  V4      4      pRV 2uuRRR4       u #  RRR4       K–  	  R#   + '       g   i     K«  ; i  \         d     K¼  i ; i)rN  z/sys/class/block/*/devrä  N)rÝ  rÞ  rè   Úiglobr   rê   r˜   r]   ra   rÑ  Údirnamer;  )r1  ÚneedlerÔ  rh  r‰   Údatart   s   &      r5   Úask_sys_class_blockÚ&RootFsDeviceFinder.ask_sys_class_block¿  s·   € Ø—J‘J�<˜q §¡ Ð-ˆÜ—
’
Ð3Ó4ˆÛˆDð	.Ü˜d“O�÷ ’QØŸ6™6›8Ÿ>™>Ó+�DØ”~Ü!Ÿw™w×/Ñ/´·±·±ÀÓ0EÓF˜Ø!& t f˜~÷	 ”Qà%÷ ‘Qó ÷ —Q�Qûô %ô Úðús   ¸C"ÁA%CÃCÃ"C1Ã0C1c                ó´  € R pVf    V P                  4       pVf    V P                  4       pVf    V P	                  4       pVe*   \
        P                  P                  V4      '       d   V# R # R #   \         d   p\        T4        R p?LtR p?ii ; i  \         d   p\        T4        R p?L‚R p?ii ; i  \         d   p\        T4        R p?L�R p?ii ; irG  )ræ  r—   r   rê  rñ  r]   ra   rd  )r1  ra   r£   s   &  r5   ÚfindÚRootFsDeviceFinder.findÎ  sÉ   € ØˆØŠ<ðØ×/Ñ/Ó1�ð Š<ðØ×-Ñ-Ó/�ð Š<ðØ×/Ñ/Ó1�ð
 Ò¤§¡§¡¨t× 4Ò 4ØˆKñ !5Ñøô ô Ü�c—
‘
ûðûô
 ô Ü�c—
‘
ûðûô
 ô Ü�c—
‘
ûðúsE   ˆA1 �B ²B7 Á1BÁ<BÂBÂB4ÂB/Â/B4Â7CÃCÃC)rÝ  rÞ  N)r+   r,   r-   r.   rƒ  Ú	__slots__r2  ræ  rê  rñ  rô  r3   r…  r†  s   @r5   rÜ  rÜ  š  s4   ø‡ € ñð ˜'Ð"€Iò#ò
.ò.ò.÷ð r4   rÜ  c                ó¶  € \        4       p\        4       pV '       g£   \        V R24      ;_uu_ 4       pV F}  pVP                  4       pVP	                  R4      '       g"   VP                  VP                  4       4       KK  VP                  R4      ^,          pVR8X  g   Kl  VP                  R4       K  	  RRR4       VR8X  dF   \        P                  P                  R4      '       d!   \        P                  P                  R4      pM"\        P                  P                  V R24      p. p\        P                  ! V4      pV Fz  p	V	w  r«r\V
R	8X  d   R
p
V
R9   d#   \        4       P                  4       ;'       g    T
p
V '       g   V
'       d   WQ9  d   KR  \        P                   ! W«W\4      pVP#                  V4       K|  	  V#   + '       g   i     EL; i)z8Return mounted disk partitions as a list of namedtuples.z/filesystemsÚnodevÚ	ÚzfsNrŽ   z	/etc/mtabz/self/mountsÚnonert  >   Úrootfsú	/dev/root)rç   r   r   r˜   r™   ré   r_   r]   ra   ÚisfileÚrealpathrÇ   Údisk_partitionsrÜ  rô  r   Ú	sdiskpartr‡   )r#  Úfstypesrˆ   r‰   r¥   ÚfstypeÚmounts_pathÚretlistÚ
partitionsÚ	partitionÚdeviceÚ
mountpointÚoptsÚntuples   &             r5   r   r   å  sm  € ä‹e€GÜ!Ó#€KßÜ˜+˜ lÐ3×4Ô4¸Û�Ø—z‘z“|�Ø—‘ w×/Ò/Ø—K‘K §
¡
£Ö-ð "ŸZ™Z¨Ó-¨aÕ0�FØ –ØŸ™ EÖ*ñ ÷ 5ð �gÔ¤"§'¡'§.¡.°×"=Ò"=Ü—g‘g×&Ñ& {Ó3‰ä—g‘g×&Ñ&¨+¨°lÐ'CÓDˆà€GÜ×%Ò% kÓ2€JÛˆ	Ø+4Ñ(ˆ˜FØ�VÔØˆFØÐ,Ô,Ü'Ó)×.Ñ.Ó0×:Ð:°FˆFßß˜VÔ2ÙÜ×"Ò" 6°vÓDˆØ�‰�vÖñ  ð €N÷? 5×4Ð4ús   ³A*GÂ"GÇG	c            	     óª	  € \         P                  ! \        4      p \        P                  ! R4      pVP	                  \        P                  ! R4      4       \        V Uu0 uF  q"P                  R4      ^ ,          kK  	  up4      p\        P                  ! R4      p\        P                  ! R4      pV F.  pVP                  RV4      pWa9  g   K  VP                  V4       K0  	  V EF  p VR,           p\        \        V4      4      R,          p	\        P                  P                  \        P                  P!                  V4      R	4      p\#        V4      P%                  4       p
\        TR
,           RR7      p\        TR,           RR7      p\#        TR,           RR7      P%                  4       pTe    \        T4      R,          pTe    \        T4      R,          pY
,          P                  YÙY¼34       EK  	  V'       Eg'   \        P                  ! R4      p\        \+        V4      4      pV EFõ  p \        P                  P                  VR4      p\        \        V4      4      R,          p	\        P                  P                  VR4      p\#        V4      P%                  4       p
\        P                  ! TR,           4      pT Uu0 uFG  pRP                  \        P                  P/                  T4      P                  R4      R,          4      kKI  	  ppRpRpT Fè  p\        P                  P                  TTR,           4      p\#        TRR7      P%                  4       pTR8X  d4   \        \        P                  P                  TTR,           4      RR7      pM9TR8X  d3   \        \        P                  P                  TTR,           4      RR7      pTe    \        T4      R,          pTf   KÕ   \        T4      R,          pKê  	  Y
,          P                  RY›T34       EKø  	  \1        V 4      # u upi   \&        \(        3 d     EKi  i ; i  \(         d    Rp EL�i ; i  \(         d    Rp ELši ; i  \&        \(        3 d   p\-        T4        Rp?EKn  Rp?ii ; iu upi   \(         d    Rp LÌi ; i  \(         d    Rp EK°  i ; i)aÐ  Return hardware (CPU and others) temperatures as a dict
including hardware name, label, current, max and critical
temperatures.

Implementation notes:
- /sys/class/hwmon looks like the most recent interface to
  retrieve this info, and this implementation relies on it
  only (old distros will probably use something else)
- lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
- /sys/class/thermal/thermal_zone* is another one but it's more
  difficult to parse
z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*rÊ   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg     @�@rt   Ú_maxNr  Ú_critÚ_labelrt  z /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*:rr  rÀ  NÚ_typeÚcriticalÚ_tempÚhigh)Úcollectionsr   r9  rè   ÚextendÚsortedr_   rÞ   rß   Úsubr‡   rÑ   r   r]   ra   r¹   rî  r   r˜   r—   rÜ   rç   r   rÑ  Údict)r  Ú	basenamesr=   Ú
basenames2Úreplrt   ÚaltnameÚbasera   ÚcurrentÚ	unit_namer  r  Úlabelr£   Ú
trip_pathsÚpÚtrip_pointsÚ
trip_pointÚ	trip_types                       r5   Úsensors_temperaturesr)    s  € ô ×
!Ò
!¤$Ó
'€CÜ—	’	Ð;Ó<€Ið ×Ñ”T—Y’YÐGÓHÔIÜ±Ó;±¨AŸ™ › QŸ˜±Ñ;Ó<€Iô —’Ø?ó€Jô �:Š:Ð@ÓA€DÛˆØ—(‘(Ð.°Ó5ˆØÖ#Ø×Ñ˜TÖ"ñ ô
 ˆð	Ø˜(•?ˆDÜœD ›JÓ'¨&Õ0ˆGÜ—7‘7—<‘<¤§¡§¡°Ó 5°vÓ>ˆDÜ˜D›	Ÿ™Ó)ˆIô �D˜6•M¨DÔ1ˆÜ˜˜w�°Ô6ˆÜ�D˜8•O¨bÔ1×7Ñ7Ó9ˆàÒðÜ˜T“{ VÕ+�ð Òð Ü  ›?¨VÕ3�ð 	�×Ñ˜u¨tÐ>×?ñA ÷F ˆ9Ü—I’IÐ@ÓAˆ	Üœ3˜y›>Ó*ˆ	äˆDðÜ—w‘w—|‘| D¨&Ó1�Ü¤ T£
Ó+¨fÕ4�Ü—w‘w—|‘| D¨&Ó1�Ü ›IŸO™OÓ-�	ô
 Ÿš 4¨.Õ#8Ó9ˆJñ $óá#�Að —‘œŸ™×)Ñ)¨!Ó,×2Ñ2°3Ó7¸Õ<Ö=Ù#ð ð ð ˆHØˆDÛ)�
Ü—w‘w—|‘| D¨*°wÕ*>Ó?�Ü ¨rÔ2×8Ñ8Ó:�	Ø 
Ô*Ü#ÜŸ™Ÿ™ T¨:¸Õ+?Ó@È4ô ‘Hð  &Ô(ÜÜŸ™Ÿ™ T¨:¸Õ+?Ó@È4ô�Dð Ò#ð$Ü$ T›{¨VÕ3˜ð Ô'ð(Ü#(¨£?°VÕ#;šñ' *ð. �N×!Ñ! 2 w°hÐ"?×@ñQ ôT �‹9ÐùòA <øô* œÐ$ô 		ó ð		ûô$ ô Ø“ðûô
 ô  Ø“ð ûô  œZÐ(ô Ü�c”
Þûðüò
øô* &ô $Ø#šð$ûô
 &ô (Ø#'œð(ús�   Á P7Ã-A:P<Æ6QÇQ)È7A4Q=ËAR(ÏR-Ï7S Ð<QÑQÑQ&Ñ%Q&Ñ)Q:Ñ9Q:Ñ=R%ÒR Ò R%Ò-R=Ò<R=Ó SÓSc                 óò  € \         P                  ! \        4      p \        P                  ! R4      pV'       g   \        P                  ! R4      p\	        V Uu0 uF  q"P                  R4      ^ ,          kK  	  up4      pV FÀ  p \        \        VR,           4      4      p\        \        P                  P                  \        P                  P                  T4      R4      4      P                  4       p\        TR,           RR	7      P                  4       pY,          P!                  \"        P$                  ! Yt4      4       KÂ  	  \'        V 4      # u upi   \         d   p\        T4        Rp?Kð  Rp?ii ; i)
ak  Return hardware fans info (for CPU and other peripherals) as a
dict including hardware label and current speed.

Implementation notes:
- /sys/class/hwmon looks like the most recent interface to
  retrieve this info, and this implementation relies on it
  only (old distros will probably use something else)
- lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*rÊ   r  Nrt   r  rt  r  )r  r   r9  rè   r  r_   rš   r   r—   r   r   r]   ra   r¹   rî  r˜   r‡   r   Úsfanr  )r  r  r=   r   r!  r£   r"  r#  s           r5   Úsensors_fansr,  ‡  s  € ô ×
!Ò
!¤$Ó
'€CÜ—	’	Ð:Ó;€Ißô —I’IÐEÓFˆ	ä±Ó;±¨AŸ™ › QŸ˜±Ñ;Ó<€IÛˆð	Üœ$˜t h�Ó/Ó0ˆGô œŸ™Ÿ™¤R§W¡W§_¡_°TÓ%:¸FÓCÓD×JÑJÓLˆ	Ü�D˜8•O¨bÔ1×7Ñ7Ó9ˆØ�×ÑœgŸlšl¨5Ó:Ö;ñ ô �‹9Ðùò <øô ô 	Ü�#ŒJÝûð	ús   Á EÂEÅE6Å E1Å1E6c                 ón  a€ \        4       oV3R lp  \        P                  ! \        4       Uu. uF3  pVP	                  R4      '       g   RVP                  4       9   g   K1  VNK5  	  ppT'       g   R# \        P                  P                  \        \        T4      4      pT ! TR,           TR,           4      pT ! TR,           TR,           4      pT ! TR	,           TR
,           4      pT ! TR,           4      pTe   Te    RT,          T,          pM&\        \        TR,           RR7      4      pTR8X  d   R# Rp	T ! \        P                  P                  \        R4      \        P                  P                  \        R4      4      p
T
e   T
^8H  p	MC\        TR,           RR7      P                  4       P                  4       pTR8X  d   Rp	M	TR9   d   Rp	T	'       d   \        P                  pMjTe)   Te%    \        T\!        T4      ,          R,          4      pM>Te+   \        T^<,          4      pT^ 8  d   \        P"                  pM\        P"                  p\        P$                  ! YŒT	4      # u upi   \         d     R# i ; i  \         d    Rp EL]i ; i  \         d    \        P"                  p L_i ; i)zïReturn battery information.
Implementation note: it appears /sys/class/power_supply/BAT0/
directory structure may vary and provide files with the same
meaning but under different names, see:
https://github.com/giampaolo/psutil/issues/966.
c                 ó¤   <€ V  F%  p\        VSR7      pVS8w  g   K   \        V4      u # 	  R#   \         d    TP                  4       u u # i ; i)zfAttempt to read the content of multiple files which may
not exist. If none of them exist return None.
r  N)r   rš   rÜ   r˜   )r  ra   r  Únulls   *  €r5   Ú
multi_bcatÚ#sensors_battery.<locals>.multi_bcat¯  sR   ø€ ó ˆDÜ�t dÔ+ˆCØ�dŽ{ð'Ü˜s›8’Oñ	 ñ øô "ô 'ØŸ9™9›;Ô&ð'ús   ž
/¯AÁAÚBATÚbatteryNz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r�   z	/capacityr  z
AC0/onlinez	AC/onlineú/statusrt  ÚdischargingFTi  r8  >   ÚfullÚcharging)Úobjectr]   r:  ÚPOWER_SUPPLY_PATHr™   rÝ   r;  ra   r¹   rœ   ÚZeroDivisionErrorrš   r   r˜   r   ÚPOWER_TIME_UNLIMITEDÚabsÚPOWER_TIME_UNKNOWNÚsbattery)r0  r=   ÚbatsrÓ  Ú
energy_nowÚ	power_nowÚenergy_fullÚtime_to_emptyrÁ   Úpower_pluggedÚonlinern  Úsecsleftr/  s                @r5   Úsensors_batteryrG  ¦  sk  ø€ ô ‹8€Dõðô —Z’ZÔ 1Ô2ó
á2�Ø�|‰|˜E×"Ò" i°1·7±7³9Ñ&<÷ ˆAÙ2ð 	ð 
÷ Ùô �7‰7�<‰<Ô)¬3¨t«9Ó5€Dñ ˜D =Õ0°$¸Õ2FÓG€JÙ˜4 ,Õ.°°~Õ0EÓF€IÙ˜T NÕ2°D¸>Õ4IÓJ€KÙ˜tÐ&:Õ:Ó;€Mð Ò :Ò#9ð	Ø˜jÕ(¨;Õ6‰Gô ”c˜$ Õ,°rÔ:Ó;ˆØ�bŒ=Ùð
 €MÙÜ
�‰�‰Ô&¨Ó5Ü
�‰�‰Ô&¨Ó4ó€Fð ÒØ !™‰ä�T˜IÕ%°Ô3×9Ñ9Ó;×AÑAÓCˆØ�]Ô"Ø!‰MØÐ+Ô+Ø ˆM÷ Ü×/Ñ/‰Ø	Ò	 IÒ$9ð	2Ü˜:¬¨I«Õ6¸Õ=Ó>‰Hð 
Ò	"Ü�} rÕ)Ó*ˆØ�aŒ<Ü×1Ñ1ˆHøä×-Ñ-ˆä×Ò˜G¨}Ó=Ð=ùòG
øô
 ô Úðûô( !ô 	Ø‹Gð	ûôB !ô 	2Ü×1Ñ1ŠHð	2úsR   “I0 ¯I+ÁI+Á"I+Á(I0 Ã>J Ç3"J É+I0 É0I?É>I?ÊJÊJÊJ4Ê3J4c                 ó¸   € . p \         P                  ! 4       pV F<  pVw  r4rVp\        P                  ! Y4;'       g    RWVV4      pV P	                  V4       K>  	  V # )z:Return currently connected users as a list of namedtuples.N)r­  Úusersr   Úsuserr‡   )	r  ÚrawlistÚitemr~   ÚttyÚhostnameÚtstampr@  Únts	            r5   rI  rI    sV   € à€GÜ×ÒÓ €GÛˆØ+/Ñ(ˆ�8 SÜ�]Š]˜4§ ¨¨hÀÓDˆØ�‰�rÖñ ð €Nr4   c                 ó@  € \        4        R2p \        V 4      ;_uu_ 4       pV FT  pVP                  R4      '       g   K  \        VP	                  4       P                  4       ^,          4      u uuRRR4       # 	  RV  2p\        V4      h  + '       g   i     R# ; i)zAReturn the system boot time expressed in seconds since the epoch.rx   s   btimeNzline 'btime' not found in )r   r   r™   rÑ   r˜   r_   re  )ra   r‰   r¥   rÂ   s       r5   Ú	boot_timerR    s‚   € äÓÐ  Ð&€DÜ	�T×	Ô	˜aÛˆDØ�‰˜x×(Ô(Ü˜TŸZ™Z›\×/Ñ/Ó1°!Õ4Ó5Ñ5÷ 
Ò	Ùð +¨4¨&Ð1ˆÜ˜3ÓÐ÷ 
×	Ð	ús   ¡BÁ /BÁ:BÂB	c                 óÒ   € \        4       P                  \        4      p \        P                  ! V 4       Uu. uF%  qP                  4       '       g   K  \        V4      NK'  	  up# u upi )z7Returns a list of PIDs currently running on the system.)r   rP  r   r]   r:  rå  rš   )ra   r=   s     r5   rH  rH  #  sD   € äÓ×#Ñ#¤HÓ-€DÜŸJšJ tÔ,Ó<Ñ,�q·	±	·ŒFŒC�ŽFÑ,Ñ<Ð<ùÒ<s   ¶A$ÁA$c                ó¸  € \         P                  ! V 4      '       g   R#  \        4        RV  R2p\        V4      ;_uu_ 4       pV FJ  pVP	                  R4      '       g   K  \        VP                  4       ^,          4      pW@8H  u uuRRR4       # 	  RV 2p\        V4      h  + '       g   i     R# ; i  \        \        3 d    T \        4       9   u # i ; i)z[Check for the existence of a unix PID. Linux TIDs are not
supported (always return False).
Frp   r4  s   Tgid:Nz'Tgid' line not found in )
r   Ú
pid_existsr   r   r™   rš   r_   rÜ   r—   rH  )r@  ra   r‰   r¥   ÚtgidrÂ   s   &     r5   rU  rU  )  sÄ   € ô ×Ò˜s×#Ò#Ùð	!ô &Ó'Ð(¨¨#¨¨gÐ6ˆDÜ˜T×"Ô" aÛ�DØ—‘ x×0Ô0Ü" 4§:¡:£<°¥?Ó3˜ð  $™{Ñ*÷ #Ò"Ùð 2°$°Ð8�Ü  “oÐ%÷ #×"Ð"ûô œÐ$ô 	!Øœ$›&‘=Ò ð	!ús;    #B8 ÁB$Á"%B$Â
B8 ÂB$Â$B5	Â/B8 Â5B8 Â8CÃCc                 ó°  € / p \        4       p\        4        Fv  p \        V RV R24      ;_uu_ 4       pVP                  4       pRRR4       XP	                  R4      pWE^,           R P                  4       p\        V^,          4      pWpV&   Kx  	  V #   + '       g   i     LV; i  \        \        3 d     K£  \         d   p\        T4      ThRp?ii ; i)zkObtain a {pid: ppid, ...} dict for all running processes in
one shot. Used to speed up Process.children().
rp   rx   Nó   ))r   rH  r   rê   r�  r_   rš   r;  r<  rJ  r   )	r  rˆ   r@  r‰   rð  ÚrparÚdsetÚppidr£   s	            r5   Úppid_mapr\  J  sÄ   € ð €CÜ!Ó#€KÜŽvˆð	Ü ˜}¨A¨c¨U°%Ð8×9Ô9¸QØ—v‘v“x�÷ :ð —:‘:˜dÓ#ˆDØ˜q�˜
Ð#×)Ñ)Ó+ˆDÜ�t˜A•w“<ˆDØ�‹Hñ ð €J÷ :×9ûä!Ô#5Ð6ô 	ÚÜô 	-Ü˜sÓ#¨Ð,ûð	-ús:   ›B&´BÁB&ÂB#ÂB&Â&CÂ:CÃCÃCÃCc                óF   a € \         P                  ! S 4      V 3R l4       pV# )zdDecorator which translates bare OSError and OSError exceptions
into NoSuchProcess and AccessDenied.
c                 óž  <€ V P                   V P                  rC S! V .VO5/ VB #   \         d   p\        Y44      ThR p?i\         d"   pT P                  4        \        Y44      ThR p?i\         dX   pT P                  4        \        P                  P                  T P                   RT R24      '       g   \        Y44      Thh R p?ii ; i)Nrp   rx   )r@  Ú_namerJ  r   r<  Ú_raise_if_zombier   r;  r]   ra   rd  r0  )r1  r–   Úkwargsr@  rt   r£   Úfuns   &*,   €r5   ÚwrapperÚ wrap_exceptions.<locals>.wrappere  s¹   ø€ à—H‘H˜dŸj™jˆTð	Ù�tÐ-˜dÒ- fÑ-Ð-øÜô 	3Ü˜sÓ)¨sÐ2ûÜ!ô 	4Ø×!Ñ!Ô#Ü Ó*°Ð3ûÜ ô 	Ø×!Ñ!Ô#ô —7‘7—>‘> T×%6Ñ%6Ð$7°q¸¸¸UÐ"C×DÒDÜ# CÓ.°CÐ7Øûð	ús7   š& ¦C±=½CÁ
CÁA'Á'CÁ4CÁ5ACÃC)Ú	functoolsÚwraps)rb  rc  s   f r5   Úwrap_exceptionsrg  `  s'   ø€ ô
 ‡_‚_�SÓôó ðð$ €Nr4   c                   óÊ  a € ] tR tRt o Rt. R<OtR tR tR tR t	]
3R lt]]R 4       4       t]]R	 4       4       t]]R
 4       4       tR tR t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]P2                  P5                  R]P6                  ! 4        R24      '       d	   ]R 4       t]R 4       t]R 4       t]R=R l4       t]R>R l4       t ]R 4       t!]"'       g	   ]#'       dJ   R t$]]%PL                  ! R4      ]%PL                  ! R4      ]%PL                  ! R4      3R l4       t']R  4       t(M]!t(]#'       d	   ]R! 4       t)]R" 4       t*]]%PL                  ! R#4      3R$ l4       t+]]%PL                  ! R%4      3R& l4       t,]R' 4       t-]R( 4       t.]R) 4       t/]0'       d'   ]R* 4       t1]%PL                  ! R+4      3R, lt2]R- 4       t3]4'       d   ]R. 4       t5]R/ 4       t6]7! ]8R04      '       d   ]R=R1 l4       t9]R2 4       t:]R3 4       t;]R?R4 l4       t<]R5 4       t=]R6 4       t>]]%PL                  ! R74      3R8 l4       t?]]%PL                  ! R94      3R: l4       t@R;tAV tBR# )@ÚProcessi{  zLinux process implementation.c                óZ   € Wn         R V n        R V n        R V n        \	        4       V n        R # rG  )r@  r_  Ú_ppidÚ_ctimer   r0  )r1  r@  s   &&r5   r2  ÚProcess.__init__‡  s'   € ØŒØˆŒ
ØˆŒ
ØˆŒÜ+Ó-ˆÖr4   c                óÂ   €  \        V P                   R V P                   R24      pVP                  R4      pW^,           V^,            pVR8H  #   \         d     R# i ; i)rp   rx   rX  ó   ZF)r   r0  r@  r�  r—   )r1  rð  rY  rn  s   &   r5   Ú
_is_zombieÚProcess._is_zombieŽ  si   € ð	"Ü˜4×,Ñ,Ð-¨Q¨t¯x©x¨j¸Ð>Ó?ˆDð —:‘:˜dÓ#ˆDØ �( T¨A¥XÐ.ˆFØ˜T‘>Ð!øô ô 	Úð	ús   ‚%A ÁAÁAc                óˆ   € V P                  4       '       d,   \        V P                  V P                  V P                  4      hR # rG  )rp  r   r@  r_  rk  ©r1  s   &r5   r`  ÚProcess._raise_if_zombiež  s/   € Ø�?‰?×ÒÜ §¡¨$¯*©*°d·j±jÓAÐAñ r4   c                ód   € \         P                  ! V P                   RV P                   24       R# )z+Raise NSP if the process disappeared on us.rp   N)r]   rÏ  r0  r@  rs  s   &r5   Ú_raise_if_not_aliveÚProcess._raise_if_not_alive¢  s&   € ô 	�Š�4×$Ñ$Ð% Q t§x¡x jÐ1Ö2r4   c                óþ   €  \        V4      #   \        \        3 d_    \        P                  P                  T P                   R T P                   24      '       d   T P                  4        T\        Jd   Tu # h i ; i)rp   )
r^   r;  r<  r]   ra   Úlexistsr0  r@  r`  ÚUNSET)r1  ra   rŸ   s   &&&r5   Ú	_readlinkÚProcess._readlink¨  sk   € ð	Ü˜D“>Ð!øÜ!Ô#5Ð6ô 	Ü�w‰w�‰ $×"3Ñ"3Ð!4°A°d·h±h°ZÐ@×AÒAØ×%Ñ%Ô'Ø¤5Ó(Ø#’OØð	ús   ‚
 �AA<ÁA<Á:A<c                ó  € \        V P                   RV P                   R24      pVP                  R4      pWP	                  R4      ^,           V pW^,           R P                  4       p/ pW5R&   V^ ,          VR&   V^,          VR&   V^,          VR	&   V^,          VR
&   V^,          VR&   V^,          VR&   V^,          VR&   V^,          VR&   V^$,          VR&    V^',          VR&   V#   \         d    \        R4       ^ TR&    T# i ; i)a!  Parse /proc/{pid}/stat file and return a dict with various
process info.
Using "man proc" as a reference: where "man proc" refers to
position N always subtract 3 (e.g ppid position 4 in
'man proc' == position 1 in here).
The return value is cached in case oneshot() ctx manager is
in use.
rp   rx   rX  ó   (Nrt   rn  r[  ÚttynrÚutimeÚstimeÚchildren_utimeÚchildren_stimeÚcreate_timeÚcpu_numÚblkio_ticksz&can't get blkio_ticks, set iowait to 0)r   r0  r@  r�  rô  r_   Ú
IndexErrorr   )r1  rð  rY  rt   r‹   r  s   &     r5   Ú_parse_stat_fileÚProcess._parse_stat_file¸  s-  € ô �t×(Ñ(Ð)¨¨4¯8©8¨*°EÐ:Ó;ˆð �z‰z˜$ÓˆØ—I‘I˜d“O aÕ'¨$Ð/ˆØ˜Q•h�jÐ!×'Ñ'Ó)ˆàˆØˆF‰Ø˜q�	ˆˆH‰Ø˜Q•iˆˆF‰Ø˜a•yˆˆG‰Ø˜b•zˆˆG‰Ø˜b•zˆˆG‰Ø & r¥
ˆÐÑØ & r¥
ˆÐÑØ# B�ZˆˆMÑØ �ˆˆI‰ð	#Ø!'¨¥ˆC�Ñð ˆ
øô ô 	#äÐ:Ô;Ø!"ˆC�Òàˆ
ð	#ús   ÃC+ Ã+D
Ä	D
c                óº   € \        V P                   RV P                   R24      ;_uu_ 4       pVP                  4       uuRRR4       #   + '       g   i     R# ; i)zwRead /proc/{pid}/stat file and return its content.
The return value is cached in case oneshot() ctx manager is
in use.
rp   r4  N)r   r0  r@  rê   ©r1  r‰   s   & r5   Ú_read_status_fileÚProcess._read_status_fileß  sB   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸ÐA×BÔBÀaØ—6‘6“8÷ C×B×BÓBús   ®A	Á	A	c                óÖ   € \        V P                   R V P                   R24      ;_uu_ 4       pVP                  4       P	                  4       uuRRR4       #   + '       g   i     R# ; i)rp   r    N)r   r0  r@  rê   r˜   r‹  s   & r5   Ú_read_smaps_fileÚProcess._read_smaps_fileé  sI   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@×AÔAÀQØ—6‘6“8—>‘>Ó#÷ B×A×AÓAús   ®AÁA(	c                ó¨   € V P                   P                  V 4       V P                  P                  V 4       V P                  P                  V 4       R # rG  )rˆ  Úcache_activaterŒ  r�  rs  s   &r5   Úoneshot_enterÚProcess.oneshot_enterï  s>   € Ø×Ñ×,Ñ,¨TÔ2Ø×Ñ×-Ñ-¨dÔ3Ø×Ñ×,Ñ,¨TÖ2r4   c                ó¨   € V P                   P                  V 4       V P                  P                  V 4       V P                  P                  V 4       R # rG  )rˆ  Úcache_deactivaterŒ  r�  rs  s   &r5   Úoneshot_exitÚProcess.oneshot_exitô  s>   € Ø×Ñ×.Ñ.¨tÔ4Ø×Ñ×/Ñ/°Ô5Ø×Ñ×.Ñ.¨tÖ4r4   c                óB   € \        V P                  4       R ,          4      # )rt   )r   rˆ  rs  s   &r5   rt   ÚProcess.nameù  s   € ô �d×+Ñ+Ó-¨fÕ5Ó6Ð6r4   c                ó\   € V P                  V P                   R V P                   R2RR7      # )rp   z/exert  r  ©r{  r0  r@  rs  s   &r5   ÚexeÚProcess.exeþ  ó5   € à�~‰~Ø× Ñ Ð!  4§8¡8 *¨DÐ1¸Bð ó 
ð 	
r4   c                óÚ  € \        V P                   R V P                   R24      ;_uu_ 4       pVP                  4       pRRR4       X'       g   V P	                  4        . # VP                  R4      '       d   RMRpVP                  V4      '       d   VRR pVP                  V4      pVR8X  d)   \        V4      ^8X  d   RV9   d   VP                  R4      pV#   + '       g   i     L£; i)rp   z/cmdlineNrX   rT   r8  )r   r0  r@  rê   r`  r`   r_   r†   )r1  r‰   rð  ÚsepÚcmdlines   &    r5   r¢  ÚProcess.cmdline  sÀ   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@×AÔAÀQØ—6‘6“8ˆD÷ Bçà×!Ñ!Ô#ØˆIð Ÿ™ f×-Ò-‰f°3ˆØ�=‰=˜×ÒØ˜˜�9ˆDØ—*‘*˜S“/ˆð �&Œ=œS ›\¨QÔ.°3¸$´;Ø—j‘j “oˆGØˆ÷- B×Aús   ®CÃC*	c                óÊ   € \        V P                   R V P                   R24      ;_uu_ 4       pVP                  4       pRRR4       \	        X4      #   + '       g   i     L; i)rp   z/environN)r   r0  r@  rê   r   )r1  r‰   rð  s   &  r5   ÚenvironÚProcess.environ  sM   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@×AÔAÀQØ—6‘6“8ˆD÷ Bä" 4Ó(Ð(÷ B×Aús   ®AÁA"	c                ó¢   € \        V P                  4       R ,          4      p\        P                  ! 4       p W!,          #   \         d     R# i ; i)r  N)rš   rˆ  r   Úget_terminal_mapr•   )r1  Útty_nrr/  s   &  r5   ÚterminalÚProcess.terminal$  sG   € ä�T×*Ñ*Ó,¨WÕ5Ó6ˆÜ×(Ò(Ó*ˆð	Ø•<ÐøÜô 	Úð	ús   ·? ¿AÁAr   ú/ioc           	     óf  € V P                    R V P                   R2p/ p\        V4      ;_uu_ 4       pV F>  pVP                  4       pV'       g   K   VP	                  R4      w  rV\        V4      W%&   K@  	  RRR4       V'       g   V R2p\        V4      h \        VR,          VR,          VR,          VR,          VR	,          VR
,          4      #   \         d     K«  i ; i  + '       g   i     Lu; i  \         d/   pTP                  ^ ,          : RT RT: 2p\        T4      RhRp?ii ; i)rp   r¬  s   : Nz file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharz field was not found in z; found fields are )r0  r@  r   r˜   r_   rš   rÜ   re  rU   r•   r–   )	r1  Úfnamer‹   r‰   r¥   rt   ró   rÂ   r£   s	   &        r5   Úio_countersÚProcess.io_counters0  s5  € à×(Ñ(Ð)¨¨4¯8©8¨*°CÐ8ˆEØˆFÜ˜U×#Ô# qÛ�DàŸ:™:›<�Dß‘tð6Ø*.¯*©*°UÓ*;™K˜Dô
 ,/¨u«:˜F›Lñ ÷ $÷ Ø˜˜Ð/�Ü" 3Ó'Ð'ð0ÜØ˜8Õ$Ø˜8Õ$Ø˜=Õ)Ø˜>Õ*Ø˜8Õ$Ø˜8Õ$óð øô  *ô %â$ð%ú÷ $×#ûô0 ô 0à—x‘x •{‘oÐ%=¸e¸Wð E#Ø#)¡*ð.ð ô ! “o¨4Ð/ûð0úsG   ²C$ÁCÁ&C$Â9C7 ÃC!	ÃC$Ã C!	Ã!C$Ã$C4	Ã7D0Ä)D+Ä+D0c                ó^  € V P                  4       p\        VR ,          4      \        ,          p\        VR,          4      \        ,          p\        VR,          4      \        ,          p\        VR,          4      \        ,          p\        VR,          4      \        ,          p\        W#WEV4      # )r€  r�  r‚  rƒ  r†  )rˆ  rÑ   rÒ   rV   )r1  rŠ   r€  r�  r‚  rƒ  r‚   s   &      r5   rÓ   ÚProcess.cpu_timesS  sƒ   € à×&Ñ&Ó(ˆÜ�f˜W•oÓ&¬Õ4ˆÜ�f˜W•oÓ&¬Õ4ˆÜ˜vÐ&6Õ7Ó8¼;ÕFˆÜ˜vÐ&6Õ7Ó8¼;ÕFˆÜ�v˜mÕ,Ó-´Õ;ˆÜ˜ ~ÀvÓNÐNr4   c                óB   € \        V P                  4       R,          4      # )zWhat CPU the process is on.r…  ©rš   rˆ  rs  s   &r5   r…  ÚProcess.cpu_num]  s   € ô �4×(Ñ(Ó*¨9Õ5Ó6Ð6r4   Nc                óX   € \         P                  ! V P                  WP                  4      # rG  )r   Úwait_pidr@  r_  )r1  Útimeouts   &&r5   ÚwaitÚProcess.waitb  s   € ä× Ò  §¡¨7·J±JÓ?Ð?r4   c                óÜ   € V P                   f1   \        V P                  4       R,          4      \        ,          V n         V'       d   V P                   # V P                   \	        4       ,           # )Nr„  )rl  rÑ   rˆ  rÒ   rR  )r1  Ú	monotonics   &&r5   r„  ÚProcess.create_timef  sR   € ð �;‰;Òä�d×+Ñ+Ó-¨mÕ<Ó=ÄÕKð ŒK÷ Ø—;‘;Ðð �{‰{œY›[Õ(Ð(r4   c           	     ó  € \        V P                   R V P                   R24      ;_uu_ 4       pR VP                  4       P	                  4       R,           4       w  r#rErgpRRR4       \        XXXXXXX4      #   + '       g   i     L!; i)rp   z/statmc              3   óN   "  € T F  p\        V4      \        ,          x € K  	  R # 5irG  )rš   r›   )Ú.0r=   s   & r5   Ú	<genexpr>Ú&Process.memory_info.<locals>.<genexpr>…  s    é € ð 8Ù+C a”�A“œ×!Ò!Ó+Cùs   ‚#%:Nrs  NN)r   r0  r@  r…   r_   rP   )	r1  r‰   ÚvmsÚrssr®   ÚtextÚlibrð  Údirtys	   &        r5   Úmemory_infoÚProcess.memory_infow  s~   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@×AÔAÀQñ8Ø+,¯:©:«<×+=Ñ+=Ó+?ÀÖ+Có8Ñ4ˆC�f C¨u÷ Bô �C˜˜f d¨C°°uÓ=Ð=÷	 B×Aús   ®2A9Á9B		c                óF  € ^ ;p;r#\        V P                   RV P                   R24      ;_uu_ 4       pV FÊ  pVP                  R4      '       d1   V\	        VP                  4       ^,          4      R,          ,          pKJ  VP                  R4      '       d*   \	        VP                  4       ^,          4      R,          pKŠ  VP                  R4      '       g   K£  \	        VP                  4       ^,          4      R,          pKÌ  	  RRR4       WV3#   + '       g   i     L; i)rr  rp   r!   s   Private_r«   ó   Pss:ó   Swap:N)r   r0  r@  r™   rš   r_   )r1  ÚussÚpssÚswapr‰   r¥   s   &     r5   Ú_parse_smaps_rollupÚProcess._parse_smaps_rollupŒ  sà   € ð  !Ð ˆCÐ �#ÜØ×$Ñ$Ð% Q t§x¡x j°Ð>÷ô àÛ�DØ—‘ {×3Ò3àœs 4§:¡:£<°¥?Ó3°dÕ:Õ:šØŸ™¨×1Ò1Ü! $§*¡*£,¨q¥/Ó2°TÕ9šØŸ™¨×2Ô2Ü" 4§:¡:£<°¥?Ó3°dÕ:šñ ÷ð ˜dÐ#Ð#÷÷ ús   ³A#DÂ=DÃ+DÄD 	s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                óD  € V P                  4       p\        \        \        VP	                  V4      4      4      R ,          p\        \        \        VP	                  V4      4      4      R ,          p\        \        \        VP	                  V4      4      4      R ,          pWVV3# )r«   )r�  rë   r‘  rš   Úfindall)r1  Ú_private_reÚ_pss_reÚ_swap_reÚ
smaps_datarÍ  rÎ  rÏ  s   &&&&    r5   Ú_parse_smapsÚProcess._parse_smaps£  s€   € ð* ×.Ñ.Ó0ˆJô ”cœ#˜{×2Ñ2°:Ó>Ó?Ó@À4ÕGˆCÜ”cœ#˜wŸ™¨zÓ:Ó;Ó<¸tÕCˆCÜ”sœ3 × 0Ñ 0°Ó <Ó=Ó>ÀÕEˆDØ˜dÐ#Ð#r4   c                ó   € \         '       d    V P                  4       w  rpMV P	                  4       w  rpV P                  4       p\        WAW#3,           !  #   \        \        3 d    T P	                  4       w  rp LGi ; irG  )ÚHAS_PROC_SMAPS_ROLLUPrÐ  r<  r;  rØ  rÈ  rQ   )r1  rÍ  rÎ  rÏ  Ú	basic_mems   &    r5   Úmemory_full_infoÚProcess.memory_full_infoÀ  s}   € ç$Ó$ð9Ø%)×%=Ñ%=Ó%?‘N�C™dð "&×!2Ñ!2Ó!4‘�˜$Ø×(Ñ(Ó*ˆIÜ˜Y¨sÐ)9Õ9Ñ:Ð:øô +Ô,=Ð>ô 9Ø%)×%6Ñ%6Ó%8‘N�Cšdð9ús   ŽA Á$A=Á<A=c                ó�  € R pV P                  4       pV'       g   V P                  4        . # VP                  R4      p. pVP                  ^ 4      pV.pV! W64       EFD  w  rrVP                  R^4      p Vw  ršr¼rÞV'       g   RpMH\        V4      pVP                  4       pVP                  R4      '       d   \        V4      '       g   VRR p\        V	4      \        V
4      VVP                  R^ 4      VP                  R^ 4      VP                  R	^ 4      VP                  R
^ 4      VP                  R^ 4      VP                  R^ 4      VP                  R^ 4      VP                  R^ 4      VP                  R^ 4      VP                  R^ 4      3pVP                  V4       EKG  	  V#   \         d    TR.,           w  ršr¼rÞ ELHi ; i)a˜  Return process's mapped memory regions as a list of named
tuples. Fields are explained in 'man proc'; here is an updated
(Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.

/proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
CONFIG_MMU kernel configuration option is not enabled.
c              3   óÐ  "  € / pV  F}  pVP                  R ^4      pV^ ,          P                  R4      '       g(   VP                  4       V3x € VP                  V4       KZ   \	        V^,          4      R,          W$^ ,          &   K  	  VP                  4       V3x € R #   \
        \        3 d5    T^ ,          P                  R4      '       d    KÉ  RT: 2p\        T4      R hi ; i5i)Nrý   r«   s   VmFlags:z!don't know how to interpret line )r_   r`   Úpopr‡   rš   rÜ   r‡  r™   )r’  Úcurrent_blockrð  r¥   r‹   rÂ   s   &&    r5   Ú
get_blocksÚ'Process.memory_maps.<locals>.get_blocksÛ  sÓ   é € Ø�Û!�DØ!ŸZ™Z¨¨aÓ0�FØ! !�9×-Ñ-¨d×3Ò3à,×0Ñ0Ó2°DÐ9Ò9Ø%×,Ñ,¨TÖ2ð<Ü.1°&¸µ)«n¸tÕ.C˜D¨¥›Oñ "ð %×(Ñ(Ó*¨DÐ1Ô1øô !+¬JÐ7ô <Ø% a�y×3Ñ3°K×@Ò@â (Ø$EÀdÁXÐ"N˜CÜ",¨S£/°tÐ;ð<üs*   ‚AC&Á""BÂC&Â.C#ÃC&ÃC#Ã#C&ó   
Nrt  z[anon]rY   s   Rss:s   Size:rË  s   Shared_Clean:s   Shared_Dirty:s   Private_Clean:s   Private_Dirty:s   Referenced:s
   Anonymous:rÌ  rZ   )r�  r`  r_   rá  rÜ   r   r˜   r`   r   r”   r‡   )r1  rã  rð  r’  rì   Ú
first_linerâ  ÚheaderÚhfieldsrX  ÚpermsÚ_offsetÚ_devÚ_inodera   rL  s   &               r5   Úmemory_mapsÚProcess.memory_mapsÑ  sµ  € ò2ð& ×(Ñ(Ó*ˆD÷ Ø×%Ñ%Ô'Ø�	Ø—J‘J˜uÓ%ˆEØˆBØŸ™ 1›ˆJØ'˜LˆMÙ *¨5× @‘�Ø Ÿ,™, t¨QÓ/�ðNØ?FÑ<�D °÷ Ø#‘Dä! $›<�DØŸ:™:›<�DØ—}‘} \×2Ò2Ô;MØ÷<ò <ð  $ D S˜z˜ä˜4“LÜ˜5“MØØ—H‘H˜W aÓ(Ø—H‘H˜X qÓ)Ø—H‘H˜W aÓ(Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ.°Ó2Ø—H‘HÐ.°Ó2Ø—H‘H˜^¨QÓ/Ø—H‘H˜]¨AÓ.Ø—H‘H˜X qÓ)ð�ð —	‘	˜$—ñ= !Að> ˆIøô7 "ô NØ?FÈ"È½~Ñ<�D °ºðNús   Á6F(Æ(GÇGc                ó\   € V P                  V P                   R V P                   R2RR7      # )rp   z/cwdrt  r  rœ  rs  s   &r5   ÚcwdÚProcess.cwd  rŸ  r4   s   ctxt_switches:\t(\d+)c                ó  € V P                  4       pVP                  V4      pV'       g)   R V P                   RV P                   R2p\	        V4      h\
        P                  ! \        V^ ,          4      \        V^,          4      4      # )zR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in rp   z1/status; the kernel is probably older than 2.6.23)rŒ  rÓ  r0  r@  r  r   Úpctxswrš   )r1  Ú	_ctxsw_rerð  ÚctxswrÂ   s   &&   r5   Únum_ctx_switchesÚProcess.num_ctx_switches  s}   € ð ×%Ñ%Ó'ˆØ×!Ñ! $Ó'ˆßðà×%Ñ%Ð& a¨¯© zð 2.ð.ð ô & cÓ*Ð*Ü�~Š~œc %¨¥(›m¬S°°qµ«]Ó;Ð;r4   s   Threads:\t(\d+)c                ód   € V P                  4       p\        VP                  V4      ^ ,          4      # ©rr  )rŒ  rš   rÓ  )r1  Ú_num_threads_rerð  s   && r5   Únum_threadsÚProcess.num_threads/  s-   € ð ×%Ñ%Ó'ˆÜ�?×*Ñ*¨4Ó0°Õ3Ó4Ð4r4   c                ó  € \         P                  ! V P                   R V P                   R24      pVP	                  4        . pRpV Fô  pV P                   R V P                   RV R2p \        V4      ;_uu_ 4       pVP                  4       P                  4       pRRR4       XTP                  R4      ^,           R pTP                  R4      p\        T^,          4      \        ,          p	\        T^,          4      \        ,          p
\        P                  ! \!        T4      Yš4      pTP#                  T4       Kö  	  V'       d   V P%                  4        V#   + '       g   i     LÅ; i  \        \        3 d    Rp EK<  i ; i)	rp   z/taskFz/task/rx   NTrX  rÅ   )r]   r:  r0  r@  r
  r   rê   r˜   r;  r<  rô  r_   rÑ   rÒ   r   Úpthreadrš   r‡   rv  )r1  Ú
thread_idsr  Ú
hit_enoentÚ	thread_idr®  r‰   ÚstrŠ   r€  r�  r  s   &           r5   ÚthreadsÚProcess.threads5  s>  € ä—Z’Z 4×#4Ñ#4Ð"5°Q°t·x±x°jÀÐ FÓGˆ
Ø�‰ÔØˆØˆ
Û#ˆIØ×(Ñ(Ð)¨¨4¯8©8¨*°F¸9¸+ÀUÐKˆEðÜ  ×'Ô'¨1ØŸ™›Ÿ™Ó)�B÷ (ð �B—G‘G˜D“M AÕ%Ð'Ð(ˆBØ—X‘X˜d“^ˆFÜ˜& �*Ó%¬Õ3ˆEÜ˜& �*Ó%¬Õ3ˆEÜ—_’_¤S¨£^°UÓBˆFØ�N‰N˜6Ö"ñ! $÷" Ø×$Ñ$Ô&Øˆ÷! (×'ûä%Ô'9Ð:ô ð "�
Ûð	ús0   Á*E,Á=EÂE,ÅE)Å$E,Å)E,Å,FÆFc                óB   € \         P                  ! V P                  4      # rG  )r­  Úgetpriorityr@  rs  s   &r5   Únice_getÚProcess.nice_getP  s   € ô ×%Ò% d§h¡hÓ/Ð/r4   c                óD   € \         P                  ! V P                  V4      # rG  )r­  Úsetpriorityr@  )r1  ró   s   &&r5   Únice_setÚProcess.nice_setY  s   € ä×%Ò% d§h¡h°Ó6Ð6r4   c                óB   € \         P                  ! V P                  4      # rG  )rÇ   r#   r@  rs  s   &r5   Úcpu_affinity_getÚProcess.cpu_affinity_get`  s   € ä×-Ò-¨d¯h©hÓ7Ð7r4   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	     ó2  € V P                  4       pVP                  V4      pV'       dK   \        \        \	        V^ ,          ^ ,          4      \	        V^ ,          ^,          4      ^,           4      4      # \        \        \        \        4       4      4      4      # rù  )rŒ  rÓ  r9  Úrangerš   r†   r×   )r1  Ú_rerð  rà   s   &&  r5   Ú_get_eligible_cpusÚProcess._get_eligible_cpusd  sk   € ð ×)Ñ)Ó+ˆDØ—K‘K Ó%ˆEßÜœE¤# e¨A¥h¨q¥kÓ"2´C¸¸a½À½Ó4DÀqÕ4HÓIÓJÐJäœE¤#¤m£oÓ"6Ó7Ó8Ð8r4   c           	     óÐ  €  \         P                  ! V P                  V4       R#   \        \        3 d°   p\        T\        4      '       g    TP                  \        P                  8X  du   T P                  4       p\        \        \        \        4       4      4      4      pT F9  pYT9  d   R T: RT: 2p\	        T4      RhYS9  g   K'  RT RT 2p\	        T4      Th	  h Rp?ii ; i)zinvalid CPU z; choose between NzCPU number z! is not eligible; choose between )rÇ   Úproc_cpu_affinity_setr@  r—   rÜ   r[   r=  r>  r  Útupler  r†   r×   )r1  rÕ   r£   Úeligible_cpusÚall_cpusÚcpurÂ   s   &&     r5   Úcpu_affinity_setÚProcess.cpu_affinity_seto  sÞ   € ðÜ×*Ò*¨4¯8©8°TÖ:øÜœZÐ(ô Ü˜c¤:×.Ò.°#·)±)¼u¿|¹|Ô2KØ$(×$;Ñ$;Ó$=�MÜ$¤U¬3¬}«Ó+?Ó%@ÓA�HÛ#˜ØÔ.à".¨s©gð 6$Ø$1Ñ#4ð!6ð  ô #-¨S£/°tÐ;ØÖ3à"-¨c¨Uð 3,Ø,9¨?ð!<ð  ô #-¨S£/°sÐ:ñ  $ð ûð#ús   ‚!% ¥C%¶BC Ã	C Ã C%c                óˆ   € \         P                  ! V P                  4      w  r\        V4      p\        P
                  ! W4      # rG  )rÇ   r"   r@  r)   r   Úpionice)r1  Úioclassró   s   &  r5   Ú
ionice_getÚProcess.ionice_get‰  s1   € ä!×1Ò1°$·(±(Ó;‰NˆGÜ  Ó)ˆGÜ—?’? 7Ó2Ð2r4   c                ó  € Vf   ^ pV'       d7   V\         P                  \         P                  09   d   V: R2p\        V4      hV^ 8  g   V^8”  d   Rp\        V4      h\        P
                  ! V P                  W4      # )Nz ioclass accepts no valuezvalue not in 0-7 range)r)   r2   r/   rÜ   rÇ   Úproc_ioprio_setr@  )r1  r  ró   rÂ   s   &&& r5   Ú
ionice_setÚProcess.ionice_set�  sy   € àŠ}Ø�ß˜Ü×,Ñ,Ü×,Ñ,ð%ô ð !™Ð#<Ð=�Ü  “oÐ%Ø�qŒy˜E AœIØ.�Ü  “oÐ%Ü×'Ò'¨¯©°'ÓAÐAr4   r   c                ó˜  € V P                   ^ 8X  d   Rp\        V4      h Vf"   \        P                  ! V P                   V4      # \	        V4      ^8w  d   RV: 2p\        V4      h\        P                  ! V P                   W4       R#   \
         d6   pTP                  \        P                  8X  d   T P                  4        h Rp?ii ; i)rr  z)can't use prlimit() against PID 0 processNz2second argument must be a (soft, hard) tuple, got )	r@  rÜ   Úresourcer   r†   r—   r=  ÚENOSYSr`  )r1  Ú	resource_ÚlimitsrÂ   r£   s   &&&  r5   ÚrlimitÚProcess.rlimit   s²   € ð
 �x‰x˜1Œ}ØA�Ü  “oÐ%ðØ’>ä#×+Ò+¨D¯H©H°iÓ@Ð@ô ˜6“{ aÔ'ð*Ø*0©ð5ð ô )¨›oÐ-Ü×$Ò$ T§X¡X¨yÖAøÜô Ø—9‘9¤§¡Ô,ð ×)Ñ)Ô+Øûðús    $B	 ÁAB	 Â	C	Â0CÃC	c                ó|   € V P                  4       R ,          pVP                  4       p\        P                  VR4      # )rn  Ú?)rˆ  r   ÚPROC_STATUSESr”   )r1  Úletters   & r5   rn  ÚProcess.status¼  s3   € à×&Ñ&Ó(¨Õ2ˆØ—‘“ˆä× Ñ  ¨Ó-Ð-r4   c                ój  € . p\         P                  ! V P                   R V P                   R24      pRpV EF0  pV P                   R V P                   RV 2p \	        V4      pVP                  R 4      '       dì   \        V4      '       dØ   V P                   R V P                   RV 2p \        V4      ;_uu_ 4       p\        VP                  4       P                  4       ^,          4      p\        VP                  4       P                  4       ^,          ^4      p	RRR4       \        X	4      p
\        V\        V4      \        X4      W©4      pVP                  V4       EK-  EK0  EK3  	  V'       d   V P+                  4        V#   + '       g   i     Lq; i  \        \        3 d    Rp EKy  i ; i  \        \        3 d    Rp EK”  \          d^   pTP"                  \"        P$                  8X  d    Rp?EKÄ  TP"                  \"        P&                  8X  d   \)        T4        Rp?EKõ  h Rp?ii ; i)rp   r5  Fr6  z/fdinfo/NT)r]   r:  r0  r@  r^   r™   r   r   rš   r…   r_   rn   rO   r‡   r;  r<  r—   r=  r>  r?  r   rv  )r1  r  rÔ  r   rB  rh  ra   r‰   Úposrk   rm   r  r£   s   &            r5   Ú
open_filesÚProcess.open_filesÃ  sÐ  € àˆÜ—
’
˜d×/Ñ/Ð0°°$·(±(°¸3Ð?Ó@ˆØˆ
ÜˆBØ×'Ñ'Ð(¨¨$¯(©(¨°4¸°tÐ<ˆDð$/Ü “~�ð& —?‘? 3×'Ò'¬M¸$×,?Ò,?à"×/Ñ/Ð0°°$·(±(°¸8ÀBÀ4ÐH�Dð/Ü(¨×.Ô.°!Ü"% a§j¡j£l×&8Ñ&8Ó&:¸1Õ&=Ó">˜CÜ$'¨¯
©
«×(:Ñ(:Ó(<¸QÕ(?ÀÓ$C˜E÷ /ô  2°%Ó8˜Ü!*Ø ¤# b£'¬3¨s«8°Tó"˜ð  Ÿ™ v×.ò! -@Ò'ñ- ÷N Ø×$Ñ$Ô&Øˆ÷ /×.ûô .Ô/AÐBô *ð &*œ
ð*ûô3 &Ô'9Ð:ô à!�
ÛÜô Ø—9‘9¤§¡Ô,æØ—9‘9¤× 2Ñ 2Ô2ä˜#”JÞØûðús[   ÁF4Â,FÂ?AFÄFÆFÆFÆF1Æ0F1Æ4H2ÇH2ÇH2ÇH-Ç;*H-È,H-È-H2c                ód   € \         P                  WP                  4      pV P                  4        V# rG  )r‰  r�  r@  rv  )r1  r}  r  s   && r5   rŠ  ÚProcess.net_connectionsó  s'   € ä×'Ñ'¨¯h©hÓ7ˆØ× Ñ Ô"Øˆ
r4   c                ót   € \        \        P                  ! V P                   R V P                   R24      4      # )rp   r5  )r†   r]   r:  r0  r@  rs  s   &r5   Únum_fdsÚProcess.num_fdsù  s.   € ä”2—:’: ×!2Ñ!2Ð 3°1°T·X±X°J¸cÐBÓCÓDÐDr4   c                óB   € \        V P                  4       R ,          4      # )r[  r´  rs  s   &r5   r[  ÚProcess.ppidý  s   € ä�4×(Ñ(Ó*¨6Õ2Ó3Ð3r4   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                ó¾   € V P                  4       pVP                  V4      ^ ,          w  r4p\        P                  ! \	        V4      \	        V4      \	        V4      4      # rù  )rŒ  rÓ  r   Úpuidsrš   )r1  Ú_uids_rerð  ÚrealÚ	effectiveÚsaveds   &&    r5   ÚuidsÚProcess.uids	  óI   € à×%Ñ%Ó'ˆØ!)×!1Ñ!1°$Ó!7¸Õ!:Ñˆ˜Ü�}Š}œS ›Y¬¨I«¼¸E»
ÓCÐCr4   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                ó¾   € V P                  4       pVP                  V4      ^ ,          w  r4p\        P                  ! \	        V4      \	        V4      \	        V4      4      # rù  )rŒ  rÓ  r   Úpgidsrš   )r1  Ú_gids_rerð  r@  rA  rB  s   &&    r5   ÚgidsÚProcess.gids	  rE  r4   )rl  r_  rk  r0  r@  )Ú_cacherl  r_  rk  r0  r@  rG  ©F©r&  )Cr+   r,   r-   r.   rƒ  rö  r2  rp  r`  rv  rz  r{  rg  r   rˆ  rŒ  r�  r“  r—  rt   r�  r¢  r¥  rª  r]   ra   rd  Úgetpidr¯  rÓ   r…  r¹  r„  rÈ  rÛ  ÚHAS_PROC_SMAPSrÐ  rÞ   rß   rØ  rÝ  rí  rð  rö  rû  r  r  r  ÚHAS_CPU_AFFINITYr  r  r  ÚHAS_PROC_IO_PRIORITYr   r$  Úhasattrr'  r+  rn  r4  rŠ  r9  r[  rC  rI  r3   r…  r†  s   @r5   ri  ri  {  sÙ  ø‡ € Ù'ò€Iò.ò"ò Bò3ð (-ô ð  Øñ#ó ó ð#ðJ Øñó ó ðð Øñ$ó ó ð$ò3ò
5ð
 ñ7ó ð7ð ñ
ó ð
ð
 ñó ðð2 ñ)ó ð)ð
 ñó ðð 
‡w�w‡~�~˜˜rŸyšy›{˜m¨3Ð/×0Ò0à	ñ 	0ó 
ð 	0ðD ñOó ðOð ñ7ó ð7ð ó@ó ð@ð ó)ó ð)ð  ñ>ó ð>÷$ §ò	$ð. 
ð Ÿ
š
Ð#;Ó<Ø—J’JÐ2Ó3Ø—Z’ZÐ 4Ó5ó	$ó 
ð	$ð8 
ñ		;ó 
ñ		;ð 'Ðçà	ñE	ó 
ðE	ðN ñ
ó ð
ð
 àŸ
š
Ð#<Ó=ó<ó ð<ð Ø*,¯*ª*Ð5HÓ*Ió 5ó ð5ð
 ñó ðð4 ñ0ó ð0ð ñ7ó ð7÷ à	ñ	8ó 
ð	8ð —j’jÐ!DÓEô		9ð 
ñ	ó 
ð	÷. à	ñ	3ó 
ð	3ð
 
ñ	Bó 
ð	Bñ ˆx˜×#Ò#à	ó	ó 
ð	ð6 ñ.ó ð.ð ñ-ó ð-ð^ óó ðð
 ñEó ðEð ñ4ó ð4ð ØŸJšJÐ'DÓEó Dó ðDð
 ØŸJšJÐ'DÓEó Dó öDr4   ri  )ÚPROCFS_PATHr/   r0   r1   r2   ÚCONN_ESTABLISHEDÚCONN_SYN_SENTÚCONN_SYN_RECVÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_TIME_WAITÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_LAST_ACKÚCONN_LISTENÚCONN_CLOSING)r¾   r±   rÁ   rÀ   rž   r¯   r°   r¬   r­   r®   r¿   )	Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚ	read_timeÚ
write_timeÚread_merged_countÚwrite_merged_countrÊ  )ra   rB  Úpositionrm   rk   )rÍ  rÎ  rÏ  )ra   rÄ  ÚsizerÎ  Úshared_cleanÚshared_dirtyÚprivate_cleanÚprivate_dirtyÚ
referencedÚ	anonymousrÏ  )r_  r`  ra  rb  Ú
read_charsÚwrite_chars)r~   r€   Úchildren_userÚchildren_systemr‚   rM  rL  )•rƒ  rS  r  Úenumr=  re  rè   r]   rÞ   r'  r)  rU  Úsysrº   r   r   rt  r   r   r   rÇ   r   r­  r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__extra__all__rR  r  Údirr™   Úisupperr9  ra   rd  rN  rO  rÛ  rQ  rP  rÛ   rÒ   Úgetpagesizer›   Ú	byteorderrQ  r8  rz  r×  ÚIntEnumrš   Ú	AF_PACKETr&   r'   r)   ÚglobalsrI  Ú__members__ÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_DISK_SLEEPÚSTATUS_STOPPEDÚSTATUS_TRACING_STOPÚSTATUS_ZOMBIEÚSTATUS_DEADÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_IDLEÚSTATUS_PARKEDr/  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  rf  rM   rN   rO   rP   rÐ   rQ   rR   r¹   rS   rU   rV   r^   rn   rv   r�   Ú	Exceptionr£   r}   r¨   rÃ   rÎ   rÓ   r×   rã   rô   rû   rþ   r  Únet_if_addrsr  r  r‰  rŠ  r¥  rº  Ú
disk_usagerÚ  rÜ  r   r)  r,  rG  rI  rR  rH  rU  r\  rg  ri  r  s   0r5   Ú<module>rŒ     s'  ðñ
 %ó Û Û Û Û Û Û 	Û 	Û Û Û Û 
Û Ý #Ý "å Ý Ý #Ý )Ý Ý $Ý $Ý 'Ý !Ý "Ý "Ý Ý Ý Ý Ý $Ý "Ý Ý +Ý  Ý Ý (Ý 'Ý "Ý "ò	€ñ ˆ8�Y×ÒØ×ÑÙ˜”IÓF‘Iˆq§¡¨f×!5Œ¸!¿)¹)¿+�ˆ‘IÑFôð .Ð Ø—‘—‘ &¨¯ª«¨°VÐ <Ó=€ØŸ™Ÿ™¨°·	²	³¨}¸MÐ'JÓKÐ Ù˜tÐ%6Ó7Ð Ù˜4Ð!8Ó9Ð ð �jŠj˜Ó&€Ø×!Ò!Ó#€Ø—‘ Ñ)€Ù‹€ð Ð à—’Ø�i¡ V×%5Ñ%5Ó!6Ð7ó€ð ×
Ñ
€ô�—‘ô ñ ƒ	× Ñ �×'Ñ'Ô (ð ˆ×	Ñ	Øˆ×	 Ñ	 Øˆ×	"Ñ	"Øˆ×	Ñ	Øˆ×	$Ñ	$Øˆ×	Ñ	Øˆ×	Ñ	Øˆ×	Ñ	Øˆ×	!Ñ	!Øˆ×	Ñ	Øˆ×	Ñ	Øˆ×	Ñ	ð€ð" 	ˆ'×
"Ñ
"Øˆ'×
Ñ
Øˆ'×
Ñ
Øˆ'×
 Ñ
 Øˆ'×
 Ñ
 Øˆ'×
 Ñ
 Øˆ'×
Ñ
Øˆ'×
!Ñ
!Øˆ'×
Ñ
Øˆ'×
Ñ
Øˆ'×
Ñ
ð€ñ, 	Øò Kó	L€ñ Øò ó€ñ ØÒ<ó>€	ñ �&Ð>Ó?€á�j $§,¡,Ð1GÕ"GÓH€áØòJóK€ñ
 Ø� §¡¨-×*?Ñ*?Ó!@Õ@óB€	ñ �ò 6ó 7€ñ �{ò"ó#€	òò(
ò$ð& 	ñ0ó 	ð0ð0KÙ˜Ô!ò<ò~~òB4@òxò ò(ò:'òTò2
ð ‡7�7‡>�>Ð;×<Ò<ÀÇÁÇÁØ*÷Aò Aó#òNPð ×&Ò&€ô	˜Iô 	÷kñ kñ\ "Ó#Ð ô+ò
,ò^ðB × Ò €
ôf÷RHñ HôV$òXsòlò>Z>òDò ò =ò!òBò,÷6P
Dó P
Dùòw1 	Gøðj ô Ká	Ð*¨3©'Ð
2Ô3Ù˜;Ð(:Ô;¸CÀÀcÓJ†IûðKús*   ÄS4ÄS4Ä6S4ÐS9 Ó9T(Ô T#Ô#T(