ÿØÿàJFIFxxÿÛC      ÿÛC  ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑÿØÿàJFIFxxÿÛC      ÿÛC  ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑB Œ=Ý_ààãE@s”dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZddlZddlmZddlmZdd lmZdd lm Z dd lm!Z!dd lm"Z"dd lm#Z#ddl$m%Z%ddl$m&Z&ddl$m'Z'ddl(m)Z)ddl(m*Z*ddl(m+Z+ddl(m,Z,ddl(m-Z-ddl(m.Z.ddl(m/Z/ddl(m0Z0e+rÔddl1Z1nddl2Z1yddl1m3Z3Wn<e4k r(e 5¡e 6d¡ddl3Z3WdQRXYnXej7dkr@ddl8Z8ndZ8ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gEZ9daej:kZ;de je=pe>Z?ej@ddkZAdeZBdfZCdgZDdhZEe?rFeBdi9ZBeEdi9ZEeCdi9ZCeDdi9ZDe jFdjkr`dke  G¡ZHn dle  G¡ZHe.dmƒZIe+rˆdn Jdodp¡ZKndqZKe L¡ M¡drkZNe jO Pe jO Qe jO ReS¡dsds¡¡ZTe jO QeTdt¡ZUe jO Pe jO ReS¡¡ZVe!oèe" ZWeXejYduƒZZeXedvƒZ[eXedwƒZ\eXejYdxƒZ]eXejYdyƒZ^eXejYdzƒZ_eXed{ƒZ`eXejYd|ƒZaeXejYd}ƒZbeXejYd~ƒZceXedƒZdyedoxeee f¡ƒZgWnehk r–d€ZgYnXeXedƒZieXed‚ƒZjeXejYdƒƒZke sÄeoÎe  l¡dkZmd„d…„ZnenƒZoepe jqd†ƒZre serjt¡d‡dˆ„eueƒDƒZvewed‰exƒƒZyezƒZ{ezƒZ|GdŠd‹„d‹ej}ƒZ~dŒd„ZedËdŽd<„ƒZ€edd>„ƒZdd=„Z‚ed‘d9„ƒZƒed’d“„ƒZ„ej…eEfd”d:„Z†dÌd•d;„Z‡d–dQ„Zˆd—dP„Z‰Gd˜d™„d™exƒZŠeŠej‹deEdšd›dœdS„ƒZŒeŠe*efdeEdšd›dÍdždT„ƒZŽeŠedeEdšd›dŸdR„ƒZd dK„Zd¡d¢„Z‘ej’d£dJ„ƒZ“dÎd¤dL„Z”dÏd¦dO„Z•Gd§d¨„d¨e1j–ƒZ–e–e1_–Gd©dD„dDe–ƒZ—e1 ˜e;dª¡Gd«dC„dCe—ƒƒZ™d¬dG„Zšd­d®„Z›Gd¯dE„dEƒZœGd°dF„dFƒZd±d²„ZžeBfd³dB„ZŸdÐd´d@„Z dÑdµdA„Z¡dÒd·dV„Z¢eedfd¸dW„Z£ejfd¹dX„Z¤dÓd»dY„Z¥d¼dZ„Z¦ej’d½d[„ƒZ§d¾dU„Z¨d¿dÀ„Z©dÁd\„ZªdÂd]„Z«dÃd^„Z¬dÄd`„Z­e!rZej’dÔdÅd_„ƒZ®nej’dÕdÆd_„ƒZ®ejsdÇdÈ„ƒZ¯e!re ej…dÉdÊ„¡dS)Öz Test utilities. é)Úprint_functionN)ÚAF_INET)ÚAF_INET6)Ú SOCK_STREAM)ÚAIX)ÚFREEBSD)ÚLINUX)ÚMACOS)ÚPOSIX)ÚSUNOS)ÚWINDOWS)Ú bytes2human)Ú print_color)Ú supports_ipv6)ÚFileExistsError)ÚFileNotFoundError)ÚPY3)Úrange)Úsuper)Úu)Úunicode)Úwhich)ÚmockÚignore)ééÚAPPVEYORÚDEVNULLÚGLOBAL_TIMEOUTÚTOLERANCE_SYS_MEMÚ NO_RETRIESÚPYPYÚ PYTHON_EXEÚROOT_DIRÚ SCRIPTS_DIRÚ TESTFN_PREFIXÚUNICODE_SUFFIXÚINVALID_UNICODE_SUFFIXÚ CI_TESTINGÚVALID_PROC_STATUSESÚTOLERANCE_DISK_USAGEÚIS_64BITÚHAS_CPU_AFFINITYÚ HAS_CPU_FREQÚ HAS_ENVIRONÚHAS_PROC_IO_COUNTERSÚ HAS_IONICEÚHAS_MEMORY_MAPSÚHAS_PROC_CPU_NUMÚ HAS_RLIMITÚHAS_SENSORS_BATTERYÚ HAS_BATTERYÚHAS_SENSORS_FANSÚHAS_SENSORS_TEMPERATURESZHAS_MEMORY_FULL_INFOÚpyrunÚ terminateÚ reap_childrenÚspawn_testprocÚ spawn_zombieÚspawn_children_pairZThreadTaskunittestÚskip_on_access_deniedÚskip_on_not_implementedÚretry_on_failureÚTestMemoryLeakÚPsutilTestCaseÚprocess_namespaceÚsystem_namespaceÚ print_sysinfoZ install_pipZinstall_test_depsÚchdirÚ safe_rmpathÚ create_exeZ decode_pathZ encode_pathÚ get_testfnÚ get_winverÚkernel_versionÚ call_untilÚ wait_for_pidÚ wait_for_fileÚcheck_net_addressÚ get_free_portÚ bind_socketÚbind_unix_socketÚtcp_socketpairÚunix_socketpairÚcreate_socketsÚ reload_moduleÚimport_module_by_pathÚwarnÚcopyload_shared_libÚ is_namedtupleÚ__pypy__ÚGITHUB_ACTIONSZ CIBUILDWHEELlé iPi érÚjavaz $psutil-%s-z @psutil-%s-u-ƒőősfÀ€Úutf8Úsurrogateescapeuf)Úasciizus-asciiz..ÚscriptsÚ cpu_affinityÚcpu_freqÚ getloadavgÚenvironÚioniceÚ memory_mapsÚnet_io_countersÚcpu_numÚ io_countersÚrlimitÚsensors_batteryFÚ sensors_fansÚsensors_temperaturesÚthreadscCsÄdd„}tr@tr$trtdƒStdƒStr6tj tj ¡StdƒSn€t rš|tj ƒpˆ|tj tj ¡ƒpˆ|tdtj dd…ƒƒpˆ|t   ¡ ¡ƒ}|s–tdƒ‚|Stj tj ¡}tj |¡s¼t|ƒ‚|SdS) NcSs:ytj|dgtjtjdWntk r0dSX|SdS)Nz-V)ÚstdoutÚstderr)Ú subprocessÚ check_callÚPIPEÚ Exception)Úexe©ryúH/opt/alt/python37/lib64/python3.7/site-packages/psutil/tests/__init__.pyÚattemptÄs z_get_py_exe..attemptZpypy3ÚpypyÚpythonz python%s.%séz"can't find python exe real abspath)r\r!rrrÚosÚpathÚrealpathÚsysÚ executabler Ú version_infoÚpsutilÚProcessrxÚ ValueErrorÚexistsÚAssertionError)r{rxryryrzÚ _get_py_exeÃs$   rŠzr+cCs g|]}| d¡rtt|ƒ‘qS)ZSTATUS_)Ú startswithÚgetattrr…)Ú.0Úxryryrzú çsrÚAF_UNIXcsPeZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z ‡Z S)Ú ThreadTaskz6A thread task which does nothing expect staying alive.cs$tƒ ¡d|_d|_t ¡|_dS)NFgü©ñÒMbP?)rÚ__init__Ú_runningÚ _intervalÚ threadingÚEventÚ_flag)Úself)Ú __class__ryrzr’÷s zThreadTask.__init__cCs|jj}d||jt|ƒfS)Nz<%s running=%s at %#x>)r™Ú__name__r“Úid)r˜ÚnameryryrzÚ__repr__ýszThreadTask.__repr__cCs | ¡|S)N)Ústart)r˜ryryrzÚ __enter__szThreadTask.__enter__cOs | ¡dS)N)Ústop)r˜ÚargsÚkwargsryryrzÚ__exit__szThreadTask.__exit__cCs(|jrtdƒ‚tj |¡|j ¡dS)zStart thread and keep it running until an explicit stop() request. Polls for shutdown every 'timeout' seconds. zalready startedN)r“r‡r•ÚThreadržr—Úwait)r˜ryryrzržs zThreadTask.startcCs,d|_|j ¡x|jr&t |j¡qWdS)NT)r“r—ÚsetÚtimeÚsleepr”)r˜ryryrzÚruns zThreadTask.runcCs |jstdƒ‚d|_| ¡dS)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)r“r‡Újoin)r˜ryryrzr szThreadTask.stop) ršÚ __module__Ú __qualname__Ú__doc__r’rrŸr£ržr©r Ú __classcell__ryry)r™rzr‘ôs  r‘cst ˆ¡‡fdd„ƒ}|S)Ncs,y ˆ||ŽStk r&tƒ‚YnXdS)N)rwr:)r¡r¢)ÚfunryrzÚwrapper%s  z&_reap_children_on_err..wrapper)Ú functoolsÚwraps)r¯r°ry)r¯rzÚ_reap_children_on_err$sr³cKsÐ| dt¡| dt¡| dt ¡¡| dtj¡trJd}| d|¡|dkrªtƒ}zDt|ƒd|}td |g}t j |f|Ž}t   |¡t |d d d Wdt|ƒXn"t j |f|Ž}t   |¡t|jƒ|S) a}Creates a python subprocess which does nothing for 60 secs and return it as a subprocess.Popen instance. If "cmd" is specified that is used instead of python. By default stdin and stdout are redirected to /dev/null. It also attemps to make sure the process is in a reasonably initialized state. The process is registered for cleanup on reap_children(). ÚstdinrrÚcwdÚenviÚ creationflagsNz:from time import sleep;open(r'%s', 'w').close();sleep(60);z-cT)ÚdeleteÚempty)Ú setdefaultrrÚgetcwdrgr rIrGr"rtÚPopenÚ_subprocesses_startedÚaddrNrMÚpid)ÚcmdÚkwdsZCREATE_NO_WINDOWÚtestfnZpylineÚsprocryryrzr;/s,        cCs¨d}tt ¡d}zvt dtj |¡tf¡}trDt |dd\}}n t |ƒ\}}t   |j ¡}t t|dddƒ}t |¡t   |¡}||fSt|ƒ|dk r¢t|ƒXdS) aCreate a subprocess which creates another one as in: A (us) -> B (child) -> C (grandchild). Return a (child, grandchild) tuple. The 2 processes are fully initialized and will live for 60 secs and are registered for cleanup on reap_children(). N)Údira; import subprocess, os, sys, time s = "import os, time;" s += "f = open('%s', 'w');" s += "f.write(str(os.getpid()));" s += "f.close();" s += "time.sleep(60);" p = subprocess.Popen([r'%s', '-c', s]) p.wait() r)r·TF)r¸r¹)rIrr»ÚtextwrapÚdedentr€Úbasenamer"r r8r…r†r¿ÚintrNÚ _pids_startedr¾rG)ÚtfilerÂÚsÚsubpÚchildZgrandchild_pidZ grandchildryryrzr=Ws      csÖtjs t‚tƒ}t d|¡}d}t|ƒ}z„| t¡t |ƒ\}}|  ¡\}}zRt   |  ¡gggt¡t | d¡ƒ}t |¡t |¡‰t‡fdd„dƒ|ˆfS| ¡XWd| ¡t|ƒ|dk rÐt|ƒXdS)z±Create a zombie process and return a (parent, zombie) process tuple. In order to kill the zombie parent must be terminate()d first, then zombie must be wait()ed on. a import os, sys, time, socket, contextlib child_pid = os.fork() if child_pid > 0: time.sleep(3000) else: # this is the zombie process s = socket.socket(socket.AF_UNIX) with contextlib.closing(s): s.connect('%s') if sys.version_info < (3, ): pid = str(os.getpid()) else: pid = bytes(str(os.getpid()), 'ascii') s.sendall(pid) Nicsˆ ¡S)N)Ústatusry)ÚzombieryrzÚ ózspawn_zombie..zret == psutil.STATUS_ZOMBIE)r…r r‰rIrÅrÆrRÚ settimeoutrr8ÚacceptÚselectÚfilenorÈÚrecvrÉr¾r†rLÚcloserG)Z unix_fileÚsrcrÊÚsockÚparentÚconnÚ_Zzpidry)rÏrzr<~s,       c Ks†| dd¡| dd¡tƒ}yDt|dƒ}| |¡WdQRXtt|jgf|Ž}t|jƒ||fSt k r€t |ƒ‚YnXdS)zRun python 'src' code string in a separate interpreter. Returns a subprocess.Popen instance and the test file where the source code was written. rrNrsÚwt) rºrIÚopenÚwriter;r"rœrMr¿rwrG)rØrÁÚsrcfileÚfrÌryryrzr8«s    cKsØt|ttfƒrdnd}tr"|r"dnd}| d|¡| dtj¡| dtj¡| dd¡| d |¡tj|f|Ž}t  |¡t r”|j t d \}}n |  ¡\}}|j dkr²t|ƒ‚|r¾t|ƒ| d ¡rÔ|d d …}|S)zUrun cmd in a subprocess and return its output. raises RuntimeError on error. TFirÚshellrrrsÚuniversal_newlinesr·)ÚtimeoutÚ Néÿÿÿÿ)Ú isinstanceÚstrrr rºrtrvr¼r½r¾rÚ communicaterÚ returncodeÚ RuntimeErrorrXÚendswith)rÀrÁrâÚflagsÚprrrsryryrzÚsh¿s&        rïc søtrddlm‰dd„‰dd„‰‡‡‡fdd„}‡‡‡fd d „‰‡‡fd d „}d d„}|}zVt|tƒrp|||ƒSt|tjtjfƒrŒˆ||ƒSt|tjƒr¢|||ƒSt d|ƒ‚Wdt|tjtjfƒrÌ||ƒt|tƒrÚ|n|j }t  |¡ròt |ƒ‚XdS)a˜Terminate a process and wait() for it. Process can be a PID or an instance of psutil.Process(), subprocess.Popen() or psutil.Popen(). If it's a subprocess.Popen() or psutil.Popen() instance also closes its stdin / stdout / stderr fds. PID is wait()ed even if the process is already gone (kills zombies). Does nothing if the process does not exist. Return process exit status. r)Úwait_pidcSsbt|tjƒrts| ¡n | |¡tr^t|tjƒr^yt |j¡ |¡Stj k r\YnXdS)N) rçrtr¼rr¥r r…r†r¿Ú NoSuchProcess)Úprocräryryrzr¥ès  zterminate..waitcSs6trtrtj}tr(|tjkr(| tj¡| |¡dS)N)r r\ÚsignalÚSIGKILLr Ú send_signalÚSIGCONT)ròÚsigryryrzÚsendsigôs  zterminate..sendsigc sZyˆ|ˆƒWn@tk rN}z"tr0|jdkr0n|jtjkr>‚Wdd}~XYnXˆ||ƒS)Né)ÚOSErrorr ÚwinerrorÚerrnoZESRCH)ròräÚerr)rør÷r¥ryrzÚ term_subprocþs zterminate..term_subproccs0yˆ|ˆƒWntjk r$YnXˆ||ƒS)N)r…rñ)ròrä)rør÷r¥ryrzÚ term_psprocs zterminate..term_psproccsByt |¡}Wn$tjk r2tr.ˆ||ƒSYn Xˆ||ƒSdS)N)r…r†rñr )r¿rärò)rÿrðryrzÚterm_pids zterminate..term_pidcSs4|jr|j ¡|jr |j ¡|jr0|j ¡dS)N)rrr×rsr´)ròryryrzÚ flush_popens   zterminate..flush_popenz wrong type %rN) r Zpsutil._psposixrðrçrÈr…r†r¼rtÚ TypeErrorr¿Ú pid_existsr‰)Z proc_or_pidr÷Ú wait_timeoutrþrrrîr¿ry)rør÷rÿr¥rðrzr9Ûs*            cCs t ¡j|d}xtr(t ¡}t|ƒqWxtrBt ¡}t|ƒq,W|rœx|D]}t|ddqNWtj|td\}}x&|D]}t d|ƒt|t j dqzWdS)aTerminate and wait() any subprocess started by this test suite and any children currently running, ensuring that no processes stick around to hog resources. If resursive is True it also tries to terminate and wait() all grandchildren started by this process. )Ú recursiveN)r)räz0couldn't terminate process %r; attempting kill())r÷) r…r†Úchildrenr½Úpopr9rÉÚ wait_procsrrXrórô)rrrÌr¿rîZgoneÚaliveryryrzr:3s      cCs®ts tdƒ‚d}t ¡d}x(|D] }| ¡s6|dkr@||7}q"Pq"W|sVtd|ƒ‚d}d}| d¡}t|dƒ}t|ƒdkrŒt|dƒ}t|ƒdkr¤t|dƒ}|||fS) z"Return a tuple such as (2, 6, 36).z not POSIXÚr~Ú.zcan't parse %rrér) r ÚNotImplementedErrorrÚunameÚisdigitr‡ÚsplitrÈÚlen)rËrÚcÚminorÚmicroÚnumsÚmajorryryrzrKXs&          cCsdts tdƒ‚t ¡}t|dƒr*|jp&d}n(t d|d¡}|rNt|  d¡ƒ}nd}|d|d|fS)Nz not WINDOWSÚservice_pack_majorrz\s\d$rr ) r r r‚ÚgetwindowsversionÚhasattrrÚreÚsearchrÈÚgroup)ZwvÚspÚrryryrzrJps  c@s<eZdZdZeddddfdd„Zdd„Zdd „Zd d „ZdS) ÚretryzA retry decorator.Ngü©ñÒMbP?cCs2|r|rtdƒ‚||_||_||_||_||_dS)Nz/timeout and retries args are mutually exclusive)r‡Ú exceptionräÚretriesÚintervalÚlogfun)r˜r rär!r"r#ryryrzr’‡szretry.__init__ccs`|jr.t ¡|j}xFt ¡|kr*dVqWn.|jrPx&t|jƒD] }dVq@Wn x dVqRWdS)N)rär§r!r)r˜Ústop_atrÜryryrzÚ__iter__–s  zretry.__iter__cCs|jdk rt |j¡dS)N)r"r§r¨)r˜ryryrzr¨¢s z retry.sleepcs"t ˆ¡‡‡fdd„ƒ}ˆ|_|S)Nc std}x^ˆD]V}y ˆ||ŽSˆjk r^}z&|}ˆjdk rDˆ |¡ˆ ¡w Wdd}~XYq Xq Wtrn|‚n‚dS)N)r r#r¨r)r¡r¢ÚexcrÜ)r¯r˜ryrzr°§s    zretry.__call__..wrapper)r±r²Ú decorator)r˜r¯r°ry)r¯r˜rzÚ__call__¦szretry.__call__) ršr«r¬r­rwr’r%r¨r(ryryryrzr„s  rgü©ñÒMbP?)r r#rär"cCst |¡trt d¡dS)z„Wait for pid to show up in the process list then return. Used in the test suite to give time the sub process to initialize. g{®Gáz„?N)r…r†r r§r¨)r¿ryryrzrM¾s Tc Cs:t|dƒ}| ¡}WdQRX|s*|s*t‚|r6t|ƒ|S)z8Wait for a file to be written on disk with some content.ÚrbN)rÞÚreadr‰rG)Úfnamer¸r¹ráÚdataryryrzrNÊs cCs|ƒ}t|ƒst‚|S)zVKeep calling function for timeout secs and exit if eval() expression is True. )Úevalr‰)r¯ÚexprÚretryryrzrL×s cCsndd„}yLt |¡}t |j¡r0t tj|¡}nt tj|¡}t rJ|ƒn||ƒWnt k rhYnXdS)z>Convenience function for removing temporary test files or dirsc Ss€t ¡t}xjt ¡|krvy|ƒStk r4Yn6tk rh}z|}tdt|ƒƒWdd}~XYnXt d¡qW|‚dS)Nz ignoring %sg{®Gáz„?)r§rrZ WindowsErrorrXrèr¨)r¯r$rÜrýryryrzÚ retry_funés "zsafe_rmpath..retry_funN) rÚstatÚS_ISDIRÚst_moder±ÚpartialÚshutilÚrmtreeÚremover r)r€r0Ústr¯ryryrzrGçs   cCs(yt |¡Wntk r"YnXdS)z-Convenience function for creating a directoryN)rÚmkdirr)rÄryryrzÚ safe_mkdirsr:c cs.t ¡}zt |¡dVWdt |¡XdS)z@Context manager which temporarily changes the current directory.N)rr»rF)ÚdirnameÚcurdirryryrzrFs   c CsÎtj |¡rt|ƒ‚|rœtdƒs(tdƒ‚t|tƒr int main() { pause(); return 1; } z.c)ÚsuffixrÝNz-o)rr€rˆr‰rr‡rçÚboolrÅrÆrèrÞrIrßrtrurœrGr5Úcopyfiler"r r1Úchmodr3ÚS_IEXEC)ZoutpathZc_coderár8ryryrzrHs"   r cCs2x,tjt||d}tj |¡stj |¡SqWdS)zîReturn an absolute pathname of a file or dir that did not exist at the time this call is made. Also schedule it for safe deletion at interpreter exit. It's technically racy but probably not really due to the time variant. )Úprefixr>rÄN)ÚtempfileÚmktempr%rr€rˆr)r>rÄrœryryrzrI9s c@s4eZdZdd„Zeejdƒs$ejjZe s0dd„Z dS)ÚTestCasecCs.|jj}| d¡sd|}d||jj|jfS)Nzpsutil.z psutil.tests.z%s.%s.%s)r™r«r‹ršZ_testMethodName)r˜ZfqmodryryrzÚ__str__Ns  zTestCase.__str__ÚassertRaisesRegexcCsdS)Nry)r˜ryryrzÚrunTest\szTestCase.runTestN) ršr«r¬rGrÚunittestrFZassertRaisesRegexprHrrIryryryrzrFJs  rFc@sBeZdZdZddd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dS)rBzUTest class providing auto-cleanup wrappers on top of process test utilities. r NcCst||d}| t|¡|S)N)r>rÄ)rIÚ addCleanuprG)r˜r>rÄr+ryryrzrIis  zPsutilTestCase.get_testfncOst||Ž}| t|¡|S)N)r;rKr9)r˜r¡rÁrÃryryrzr;ns  zPsutilTestCase.spawn_testproccCs*tƒ\}}| t|¡| t|¡||fS)N)r=rKr9)r˜Zchild1Zchild2ryryrzr=ss   z"PsutilTestCase.spawn_children_paircCs*tƒ\}}| t|¡| t|¡||fS)N)r<rKr9)r˜rÚrÏryryrzr<ys   zPsutilTestCase.spawn_zombiecOs*t||Ž\}}| t|¡| t|¡|S)N)r8rKrGr9)r˜r¡rÁrÃràryryrzr8s  zPsutilTestCase.pyruncCsš| tjtj|j¡t|tjtjfƒrn| ¡r2t‚y |  ¡}Wntjk rTYnXtd|ƒ‚|j ddt  |j¡r„t|jƒ‚|  |jt  ¡¡dS)Nz3Process.status() didn't raise exception (status=%s)r)rä)Ú assertRaisesr…rñr†r¿rçr¼Ú is_runningr‰rÎr¥rZ assertNotInÚpids)r˜ròrÎryryrzÚassertProcessGone…s   z PsutilTestCase.assertProcessGone)r N) ršr«r¬r­rIr;r=r<r8rOryryryrzrBds zunreliable on PYPYc@s~eZdZdZdZdZdZer dndZdZ e   ¡Z dd„Z d d „Zd d „Zd d„Zdd„Zdd„Zdd„Zddd„Zdd„ZdS)rAaçTest framework class for detecting function memory leaks, typically functions implemented in C which forgot to free() memory from the heap. It does so by checking whether the process memory usage increased before and after calling the function many times. Note that this is hard (probably impossible) to do reliably, due to how the OS handles memory, the GC and so on (memory can even decrease!). In order to avoid false positives, in case of failure (mem > 0) we retry the test for up to 5 times, increasing call repetitions each time. If the memory keeps increasing then it's a failure. If available (Linux, OSX, Windows), USS memory is used for comparison, since it's supposed to be more precise, see: https://gmpy.dev/blog/2016/real-process-memory-and-environ-in-python If not, RSS memory is used. mallinfo() on Linux and _heapwalk() on Windows may give even more precision, but at the moment are not implemented. PyPy appears to be completely unstable for this framework, probably because of its JIT, so tests on PYPY are skipped. Usage: class TestLeaks(psutil.tests.TestMemoryLeak): def test_fun(self): self.execute(some_function) éÈr]rr^TcCs|j ¡}t|d|jƒS)NZuss)Ú _thisprocÚmemory_full_inforŒZrss)r˜ÚmemryryrzÚ_get_mem¼s zTestMemoryLeak._get_memcCstr|j ¡S|j ¡SdS)N)r rQÚnum_fdsÚ num_handles)r˜ryryrzÚ _get_num_fdsÂs zTestMemoryLeak._get_num_fdscCs|jrt|dtjddS)NÚyellow)ÚcolorÚfile)Úverboserr‚rs)r˜ÚmsgryryrzÚ_logÈszTestMemoryLeak._logcCsx| ¡}| |¡| ¡}||}|dkr8| d|¡‚|dkrttrHdnd}|dkr\|d7}d|||f}| |¡‚dS) z»Makes sure num_fds() (POSIX) or num_handles() (Windows) does not increase after calling a function. Used to discover forgotten close(2) and CloseHandle syscalls. rzHnegative diff %r (gc probably collected a resource from a previous test)ÚfdÚhandler rËz%s unclosed %s after calling %rN)rWÚcallÚfailr )r˜r¯ÚbeforeÚafterÚdiffÚtype_r\ryryrzÚ _check_fdsÌs  zTestMemoryLeak._check_fdscCsbtjdd| ¡}xt|ƒD]}| |¡}~~qWtjdd| ¡}| tjg¡||}|S)z€Get 2 distinct memory samples, before and after having called fun repeadetly, and return the memory difference. r )Z generation)ÚgcZcollectrTrr`Z assertEqualZgarbage)r˜r¯ÚtimesZmem1rŽr/Zmem2rdryryrzÚ _call_ntimesßs   zTestMemoryLeak._call_ntimesc Cs¸g}d}|}x–td|dƒD]„} | ||¡} d| t| ƒt| |ƒ|f} | | ¡| |kp`| |k} | r|| dkrx| | ¡dS| dkrŠtƒ| | ¡||7}| }qW| d |¡¡‚dS)Nrr z,Run #%s: extra-mem=%s, per-call=%s, calls=%sz. )rrir Úappendr]Úprintrarª) r˜r¯rhÚ warmup_timesr!Ú toleranceÚmessagesZprev_memZincreaseÚidxrSr\ÚsuccessryryrzÚ _check_memîs&    zTestMemoryLeak._check_memcCs|ƒS)Nry)r˜r¯ryryrzr`szTestMemoryLeak.callNc Csê|dk r |n|j}|dk r|n|j}|dk r0|n|j}|dk rB|n|j}yD|dksZtdƒ‚|dksjtdƒ‚|dksztdƒ‚|dksŠtdƒ‚Wn.tk rº}ztt|ƒƒ‚Wdd}~XYnX| ||¡| |¡|j |||||ddS) zTest a callable.Nr ztimes must be >= 1rzwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rhrlr!rm) rhrlr!rmr‰r‡rèrirfrq)r˜r¯rhrlr!rmrýryryrzÚexecute s     zTestMemoryLeak.executec s"‡‡‡fdd„}ˆj|f|ŽdS)znConvenience method to test a callable while making sure it raises an exception on every call. csˆ ˆˆ¡dS)N)rLry)r&r¯r˜ryrzr`"sz*TestMemoryLeak.execute_w_exc..callN)rr)r˜r&r¯r¢r`ry)r&r¯r˜rzÚ execute_w_excszTestMemoryLeak.execute_w_exc)NNNN)ršr«r¬r­rhrlrmr(r!r[r…r†rQrTrWr]rfrirqr`rrrsryryryrzrA•s"  cCs´ddl}ddl}ddl}ddl}ddl}ddl}y ddl}Wntk rTd}YnXy ddl}Wntk rzd}YnX|  ¡}t j r t dƒr t dƒ|d<n~t jr¼d| ¡d|d<nbt jrdd tt| ¡ƒ¡|d<t|dƒr|dd | ¡7<nd | ¡| ¡f|d<d  t| ¡ƒ| ¡g¡|d <t jrV| ¡d |d <d  | ¡| ¡|  ¡g¡|d<t!|ddƒ|d<|dk r¦|dd|j"7<t jrþt dƒrÜt ddgƒ} t| ƒ #d¡d|d<nd|d<| $¡d} | rþ| |d<t% &¡|d<| '¡} d| d| df|d<|j (t  )¡¡ *d¡|d<|j +¡ *d¡|d<| ,¡|d<t-j. /d¡|d <t- 0¡|d!<t1|d"<| 2¡|d#<t- 3¡|d$<t  4¡|d%<d&t5d'd(„t  6¡Dƒƒ|d)<t  7¡} d*t8| j9ƒt:| j;ƒt:| j<ƒf|d+<t  =¡} d*t8| j9ƒt:| j;ƒt:| j<ƒf|d,<t>t  ?¡ƒ|d-<t  @¡ A¡}| Bd.d¡| C|¡|d/<tDd0t%jEd1x0| F¡D]$\}}tDd2|d3|ft%jEd1qpWtDd0t%jEd1t%jG H¡dS)4NrZ lsb_releasezlsb_release -d -sZOSz Darwin %szWindows ú Ú win32_editionz, z%s %sÚarchr~Úkernelr}Ú __version__z not installedÚpipz (wheel=%s)r=z --versionrår Úglibcz fs-encodingz%s, %sÚlangz%Y-%m-%d %H:%M:%Sz boot-timer§Úuserú~ÚhomerµZpyexeÚhostnameZPIDZcpusz%.1f%%, %.1f%%, %.1f%%cSsg|]}|t ¡d‘qS)éd)r…Ú cpu_count)rrŽryryrzrpsz!print_sysinfo..Zloadavgz%s%%, used=%s, total=%sZmemoryÚswaprNriròzF======================================================================)rZz%-17s %sú:)IÚ collectionsÚdatetimeÚgetpassÚlocaleÚplatformÚpprintryÚ ImportErrorÚwheelÚ OrderedDictr…rrrïÚOSXÚmac_verr rªÚmaprèÚ win32_verrruÚsystemÚversionÚlistÚ architectureÚmachiner rÚpython_implementationÚpython_versionÚpython_compilerrŒrxrÚlibc_verr‚ÚgetfilesystemencodingÚ getlocaleÚ fromtimestampÚ boot_timeÚstrftimeÚnowZgetuserrr€Ú expanduserr»r"ÚnodeÚgetpidrÚtuplerfÚvirtual_memoryrÈÚpercentr ÚusedÚtotalÚ swap_memoryrrNr†Úas_dictrÚpformatrkrsÚitemsrrÚflush)r„r…r†r‡rˆr‰ryr‹ÚinfoÚoutrËr{rSr‚ZpinfoÚkÚvryryrzrE(s”               ""   cCs6t ¡}t|dƒr| ¡St|dƒr2t | ¡¡SdS)Nrkrdr)r…r†rrkÚrandomÚchoicerd)rîryryrzÚ_get_eligible_cpuƒs   r³c@sBeZdZdZddifddifgZddifddddifd difd difd difd difd difddifddifg Zddifddddifddifddifddifddifddifddifddifddifddifddifddifd difd!difd"difd#difgZerFed$difg7Zed%difg7Zed&difg7Zed'difg7Zer\ed(difg7Ze rred)difg7Ze rŒed*e j fifg7Ze r¢ed+difg7Zer¸ed,difg7ZerÎed-difg7Zeräed.difg7Zerþed/dd0d1ifg7ZgZereddifg7Znede jfifg7Ze rJed*e j d2fifg7Ze r‚erned)e jd3fifg7Zned)e jfifg7Ze ržed+eƒgfifg7Zd4ejfifd5difd6difd7difd8difgZerüed4ejfifg7Zed4ejfifg7ZeeeeZd9d:„ZdDd;d<„Zd=d>„Z e!d?d@„ƒZ"e!dAdB„ƒZ#dCS)ErCaA container that lists all Process class method names + some reasonable parameters to be called with. Utility methods (parent(), children(), ...) are excluded. >>> ns = process_namespace(psutil.Process()) >>> for fun, name in ns.iter(ns.getters): ... fun() Ú cpu_percentryZmemory_percentr©rrTrMZmemory_info_exZoneshotrÚÚparentsr¿r¥)rZcmdlineZ connectionsÚkindÚallÚ cpu_timesZ create_timerµrxrRZ memory_inforœÚniceZnum_ctx_switchesÚ num_threadsZ open_filesÚppidrÎrqÚusernameZuidsZgidsÚterminalrUrlrhrmrdrkrgrVriZgroupedF)iirrõZsuspendZresumer9ÚkillcCs ||_dS)N)Ú_proc)r˜ròryryrzr’ëszprocess_namespace.__init__ccs^t|ƒ}t |¡xF|D]>\}}}|r.| ¡t|j|ƒ}tj|f|ž|Ž}||fVqWdS)z_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)r“r±ÚshuffleÚ clear_cacherŒr¿r±r4)r˜ÚlsrÁÚfun_namer¡rÁr¯ryryrzÚiterîs  zprocess_namespace.itercCs|jj|jjdddS)z&Clear the cache of a Process instance.T)Z _ignore_nspN)r¿Ú_initr¿)r˜ryryrzrÁûszprocess_namespace.clear_cachecCsBx<|D]4\}}}d|}t||ƒsd|jj|f}t|ƒ‚qWdS)z}Given a TestCase instance and a list of tuples checks that the class defines the required test method names. Ztest_z$%r class should define a '%s' methodN)rr™ršÚAttributeError)ÚclsZ test_classrÂrÃrÜZ meth_namer\ryryrzÚtest_class_coverageÿs  z%process_namespace.test_class_coveragecCs`tdd„|jDƒƒ}tdd„|jDƒƒ}tdd„ttjƒDƒƒ}||B|A}|r\td|ƒ‚dS)NcSsg|] }|d‘qS)rry)rrŽryryrzr sz*process_namespace.test..cSsg|] }|d‘qS)rry)rrŽryryrzrscSsg|]}|ddkr|‘qS)rrÜry)rrŽryryrzrsz!uncovered Process class names: %r)r¦r·ÚignoredrÄr…r†r‡)rÇÚthisrÉÚklassZleftoutryryrzÚtest s  zprocess_namespace.testN)T)$ršr«r¬r­ÚutilsrÉÚgettersr r/r0r3r…Z RLIMIT_NOFILEr,r2r.r r1ZsettersZNORMAL_PRIORITY_CLASSrZIOPRIO_CLASS_NONEZ IOPRIO_NORMALr³róÚSIGTERMZkillersZ CTRL_C_EVENTZCTRL_BREAK_EVENTr·r’rÄrÁÚ classmethodrÈrÌryryryrzrCŒs˜         c@s¦eZdZdZddifddddifddddifddifd dd difd dd difd dd difd dddifde ¡fifddddifddifddifddddifde ¡fifddifddifddifddifgZeräeddd difg7Ze røeddifg7Ze reddifg7Ze r$eddifg7Ze r:eddifg7Ze r`ed difg7Zed!d"ifg7Zd#difd$e ¡gfifd%difd&difgZeZed'd(„ƒZejZd)S)*rDzÝA container that lists all the module-level, system-related APIs. Utilities such as cpu_percent() are excluded. Usage: >>> ns = system_namespace >>> for fun, name in ns.iter(ns.getters): ... fun() rryrZlogicalFTZ cpu_statsr¸ZpercpuZdisk_io_countersZperdiskZdisk_partitionsr·Ú disk_usageZnet_connectionsr¶Z net_if_addrsZ net_if_statsrjZpernicrrNr¨Zusersr¤rerfrprornZwin_service_iterZwin_service_get)ZalgZ process_iterrr´Zcpu_times_percentccsPt|ƒ}t |¡x8|D]0\}}}tt|ƒ}tj|f|ž|Ž}||fVqWdS)z_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)r“r±rÀrŒr…r±r4)rÂrÃr¡rÁr¯ryryrzrÄHs   zsystem_namespace.iterN)ršr«r¬r­rr»r¢rÎr-ÚHAS_GETLOADAVGr7r6r4r r…r†rÉr·Ú staticmethodrÄrCrÈryryryrzrDsN           cCst |¡st|ƒ‚d|_|S)zA decorator to mark a TestCase class. When running parallel tests, class' unit tests will be run serially (1 process). T)ÚinspectÚisclassr‰Z _serialrun)rËryryrzÚ serialrunWsrÖcCsdd„}ttd||dS)zZDecorator which runs a test function and retries N times before actually failing. cSstd|tjddS)Nz %r, retrying)rZ)rkr‚rs)r&ryryrzr#esz retry_on_failure..logfunN)r rär!r#)rr‰)r!r#ryryrzr@ascs‡fdd„}|S)z,Decorator to Ignore AccessDenied exceptions.cst ˆ¡‡‡fdd„ƒ}|S)Ncs>y ˆ||ŽStjk r8ˆdk r*ˆs*‚t d¡‚YnXdS)Nzraises AccessDenied)r…Ú AccessDeniedrJÚSkipTest)r¡r¢)r¯Úonly_ifryrzr°os z9skip_on_access_denied..decorator..wrapper)r±r²)r¯r°)rÙ)r¯rzr'ns z(skip_on_access_denied..decoratorry)rÙr'ry)rÙrzr>ls cs‡fdd„}|S)z3Decorator to Ignore NotImplementedError exceptions.cst ˆ¡‡‡fdd„ƒ}|S)NcsFy ˆ||ŽStk r@ˆdk r(ˆs(‚dˆj}t |¡‚YnXdS)Nz4%r was skipped because it raised NotImplementedError)r ršrJrØ)r¡r¢r\)r¯rÙryrzr°s z;skip_on_not_implemented..decorator..wrapper)r±r²)r¯r°)rÙ)r¯rzr'~s z*skip_on_not_implemented..decoratorry)rÙr'ry)rÙrzr?|s ú 127.0.0.1c Cs4t t ¡¡}| |df¡| ¡dSQRXdS)z6Return an unused TCP port. Subject to race conditions.rr N)Ú contextlibÚclosingÚsocketÚbindÚ getsockname)ÚhostrÙryryrzrP”scCs†|dkr|ttfkrd}t ||¡}y>tjdkrB| tjtjd¡| |¡|tj kr`|  d¡|St k r€|  ¡‚YnXdS)zBinds a generic socket.N)r r)ÚntÚcygwinr r^) rrrÝrrœÚ setsockoptÚ SOL_SOCKETÚ SO_REUSEADDRrÞrÚlistenrwr×)ÚfamilyÚtypeÚaddrrÙryryrzrQ›s     cCsrtjs t‚tj |¡rt|ƒ‚t tj|¡}y"| |¡|tj krL|  d¡Wnt k rl|  ¡‚YnX|S)zBind a UNIX socket.r^) r…r r‰rr€rˆrÝrrÞrrærwr×)rœrèrÙryryrzrR¬s   ©r rc Csªt t |t¡¡Ž}| |¡| d¡| ¡}t |t¡}y@| |¡| ¡}x(| ¡\}}||krn||fS|  ¡qRWWnt k rš|  ¡‚YnXWdQRXdS)z^Build a pair of TCP sockets connected to each other. Return a (server, client) tuple. r^N) rÛrÜrÝrrÞrærßÚconnectrÓr×rú)rçréZllrZcaddrÚaryryrzrS»s      cCs’tjs t‚d}}y@t|tjd}| d¡t tjtj¡}| d¡| |¡Wn6t k rˆ|dk rr|  ¡|dk r‚|  ¡‚YnX||fS)zƒBuild a pair of UNIX sockets connected to each other through the same UNIX file name. Return a (server, client) tuple. N)rèr) r…r r‰rRrÝrÚ setblockingrrërwr×)rœÚserverZclientryryrzrTÒs   c csøg}d}}z¬| ttjtjƒ¡| ttjtjƒ¡tƒrd| ttjtjƒ¡| ttjtjƒ¡tr°t r°t ƒ}t ƒ}t |ƒ\}}t |tjd}x|||fD]}| |¡qžW|VWdx|D] }|  ¡qÀWx ||fD]}|dk rÚt|ƒqÚWXdS)z1Open as many socket families / types as possible.N)rè)rjrQrÝrrÚ SOCK_DGRAMrrr ÚHAS_CONNECTIONS_UNIXrIrTrRr×rG)ZsocksZfname1Zfname2Ús1Ús2Zs3rËr+ryryrzrUés*    cCsddl}tr(tr(ts(t|tjƒs(t|ƒ‚|tjkrždd„|  d¡Dƒ}t |ƒdksZt|ƒ‚x*|D]"}d|krxdks`nt|ƒ‚q`Wts’t |ƒ}|  |¡nb|tj krÒt|tƒsºt|ƒ‚tsÆt |ƒ}| |¡n.|tjkröt d|¡dk sôt|ƒ‚n td |ƒ‚dS) z[Check a net address validity. Supported families are IPv4, IPv6 and MAC addresses. rNcSsg|] }t|ƒ‘qSry)rÈ)rrŽryryrzr sz%check_net_address..r réÿz([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r)Ú ipaddressÚenumrr!rçÚIntEnumr‰rÝrrrrZ IPv4AddressrrèZ IPv6Addressr…ZAF_LINKrÚmatchr‡)rérçrôZoctsÚnumryryrzrOs&   "    cCsTdd„}dd„}dd„}dd„}d d „}||ƒ||ƒ||ƒ||ƒ||ƒd S) z*Check validity of a connection namedtuple.cSsÔt|ƒdk}t|ƒdks$tt|ƒƒ‚|d|jks.check_ntuplec Ssð|jtttfkst|jƒ‚tdk r:t|jtjƒsNt|ƒ‚nt|jtƒsNt|ƒ‚|jtkrÌt   |j|j ¡}t   |¡Ry|  |jddf¡Wn2t jk r¾}z|jtjkr®‚Wdd}~XYnXWdQRXn |jtkrì|jtjksìt|jƒ‚dS)Nr)rçrrrr‰rõrçrörÈrÝrèrÛrÜrÞrúÚerrorrüZ EADDRNOTAVAILrÎr…Ú CONN_NONE)rÛrËrýryryrzÚ check_family,s     z-check_connection_ntuple..check_familycSs†ttdtƒƒ}|jtjtj|fks,t|jƒ‚tdk rLt|jtj ƒs`t|ƒ‚nt|jt ƒs`t|ƒ‚|jtjkr‚|j t j ks‚t|j ƒ‚dS)NÚSOCK_SEQPACKET)rŒrÝÚobjectrèrrïr‰rõrçrörÈrÎr…rþ)rÛrryryrzÚ check_typeAs  z+check_connection_ntuple..check_typecSs°xª|j|jfD]š}|jttfkrˆt|tƒs6tt|ƒƒ‚|s.check_addrscSs†t|jtƒst|jƒ‚dd„ttƒDƒ}|j|ks.check_status..) rçrÎrèr‰rÄr…rçrrrèrrþ)rÛZvalidsryryrzÚ check_statusZs z-check_connection_ntuple..check_statusNry)rÛrürÿrrrryryrzÚcheck_connection_ntuples    rcCsLyddl}t|dƒst‚Wn"tk r<ddl}| |¡SX| |¡SdS)z,Backport of importlib.reload of Python 3.3+.rNÚreload)Ú importlibrrŠÚimpr)Úmoduler r ryryrzrVps  cCsœtj tj |¡¡d}tjddkr:ddl}| ||¡Stjdd…dkrfddlm }|||ƒ  ¡Sddl }|j   ||¡}|j  |¡}|j |¡|SdS)Nrr~)rr)ÚSourceFileLoader)rr€ÚsplitextrÇr‚r„r Z load_sourceZimportlib.machineryr Ú load_moduleÚimportlib.utilÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚ exec_module)r€rœr r r ÚspecÚmodryryrzrW}s    cCst |t¡dS)zRaise a warning msg.N)ÚwarningsrXÚ UserWarning)r\ryryrzrX’scCsVt|ƒ}|j}t|ƒdks&|dtkr*dSt|ddƒ}t|tƒsDdStdd„|DƒƒS)z-Check if object is an instance of namedtuple.r rFÚ_fieldsNcss|]}t|ƒtkVqdS)N)rèrè)rÚnryryrzú  sz is_namedtuple..)rèÚ __bases__rr£rŒrçr·)rŽÚtÚbráryryrzrZ—s  c#sttrdnd‰d‰t|ˆd}‡‡fdd„t ¡ ¡Dƒ}t |¡}t ||¡zt   |¡|VWdt |ƒXdS)zÂCtx manager which picks up a random shared CO lib used by this process, copies it in another location and loads it in memory via ctypes. Return the new absolutized path. r|r}z.so)r>cs6g|].}tj |j¡dˆkrˆ|j ¡kr|j‘qS)r )rr€r Úlower)rrŽ)rxÚextryrzr­sz'copyload_shared_lib..N) r!rIr…r†rir±r²r5r@ÚctypesÚCDLLrG)r>ÚdstÚlibsrØry)rxr rzrY¤s     c #sÔddlm}ddlm}d‰t|ˆd}‡fdd„t ¡ ¡Dƒ}trb|sbdd„t ¡ ¡Dƒ}t  |¡}t   ||¡d }zt  |¡}|VWd |d k rÆtj jj}|jg|_||jƒ}|dkrÆ|ƒt|ƒXd S) zÖCtx manager which picks up a random shared DLL lib used by this process, copies it in another location and loads it in memory via ctypes. Return the new absolutized, normcased path. r)Úwintypes)ÚWinErrorz.dll)r>csFg|]>}|j ¡ ˆ¡rdtj |j¡ ¡krd|j ¡kr|j‘qS)r}Zwow64)r€rrìrrÇ)rrŽ)r ryrzrÃsz'copyload_shared_lib..cSs(g|] }dtj |j¡ ¡kr|j‘qS)r|)rr€rÇr)rrŽryryrzrÈsN)r!r%r&rIr…r†rir!r±r²r5r@ZWinDLLÚwindllÚkernel32Ú FreeLibraryZHMODULEÚargtypesÚ_handlerG) r>r%r&r#r$rØÚcfiler)r/ry)r rzrY¸s(         cCstdddS)NT)r)r:ryryryrzÚcleanup_test_procsåsr-cCs t |¡S)N)r‚Úexit)r÷ÚframeryryrzrÐïrÑrÐ)N)F)TF)N)r N)N)N)rÚ)rê)r )r )°r­Ú __future__rÚatexitrÛr!rür±rgrÔrr±rrÔr5rórÝr1rtr‚rDrÅr•r§rrrrr…rrrr r r r Zpsutil._commonr rrZpsutil._compatrrrrrrrrrJZ unittest2rrŠÚcatch_warningsÚ simplefilterr„rõÚ__all__Úbuiltin_module_namesr!rgrr\r(Úmaxsizer+r rr*rrœr¢r%r&Údecoder'ršrZASCII_FSr€rrªr;Ú__file__r#r$ÚHERErðrr†r,r-rÒr.r0r1ZHAS_NET_IO_COUNTERSr2r/r3r4r?rnr5rwr6r7Z HAS_THREADSÚgetuidZ SKIP_SYSCONSrŠr"rÞÚdevnullrÚregisterr×rÄr)rŒrrr¦r½rÉr¤r‘r³r;r=r<r8rïrÏr9r:rKrJrrñrMr‰rNrLrGr:ÚcontextmanagerrFrHrIrFrBZskipIfrArEr³rCrDrÖr@r>r?rPrQrRrSrTrUrOrrVrWrXrZrYr-ryryryrzÚ s†                                                        0  ' '-  X %:   !  1[  B    R   ,