U
    (c:                     @   s  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ej'j(Z(e) Z*d Z+d!d" Z,G d#d$ d$eZ-G d%d& d&e-Z.e/e d'G d(d) d)eZ0G d*d+ d+eZ1e2d,krdd-l3m4Z4 e4e5 dS ).a  
Tests for detecting function memory leaks (typically the ones
implemented in C). It does so by calling a function many times and
checking whether process memory usage keeps increasing between
calls or over time.
Note that this may produce false positives (especially on Windows
for some reason).
PyPy appears to be completely unstable for this framework, probably
because of how its JIT handles memory, so tests are skipped.
    )print_functionN)LINUX)MACOS)OPENBSD)POSIX)SUNOS)WINDOWS)ProcessLookupError)super)HAS_CPU_AFFINITY)HAS_CPU_FREQ)HAS_ENVIRON)
HAS_IONICE)HAS_MEMORY_MAPS)HAS_NET_IO_COUNTERS)HAS_PROC_CPU_NUM)HAS_PROC_IO_COUNTERS)
HAS_RLIMIT)HAS_SENSORS_BATTERY)HAS_SENSORS_FANS)HAS_SENSORS_TEMPERATURES)TestMemoryLeak)create_sockets)
get_testfn)process_namespace)skip_on_access_denied)spawn_testproc)system_namespace)	terminate   c                  C   s   dd } | S )zsDecorator for those Linux functions which are implemented in pure
    Python, and which we want to run faster.
    c                    s   t   fdd}|S )Nc                    sJ   t r6| jj}zt| j_ | f||W S || j_X n | f||S d S N)r   	__class__times	FEW_TIMES)selfargskwargsbeforefun >/tmp/pip-unpacked-wheel-l83rk7k5/psutil/tests/test_memleaks.pywrapperC   s    z5fewtimes_if_linux.<locals>.decorator.<locals>.wrapper)	functoolswraps)r)   r,   r*   r(   r+   	decoratorB   s    
z$fewtimes_if_linux.<locals>.decoratorr*   )r/   r*   r*   r+   fewtimes_if_linux>   s    r0   c                   @   s  e Zd ZdZeZdd Ze dd Ze dd Z	e dd	 Z
e d
d Zee de dd Zee de dd Ze dd Zdd Zdd Zee ddd Zee ddd Zee de dd Zeeddd  Ze d!d" Ze eed#d$d% Zee d&d'd( Zee de d)d* Z e d+d, Z!e eed#d-d. Z"e d/d0 Z#e ee$ dd1d2 Z%e d3d4 Z&e d5d6 Z'ee de d7d8 Z(d9d: Z)e d;d< Z*ee+ dd=d> Z,ee+ dd?d@ Z-e dAdB Z.ee/ de dCdD Z0ee1 dEee2 ddFdG Z3ee1 dEee2 ddHdI Z4e eedJdKdL Z5ee6 ddMdN Z7ee d&dOdP Z8dQS )RTestProcessObjectLeaksz$Test leaks of Process class methods.c                 C   s    t d }|| |j|j  d S r    )r   test_class_coverageZgettersZsettersr$   nsr*   r*   r+   test_coverage\   s    z$TestProcessObjectLeaks.test_coveragec                 C   s   |  | jj d S r    )executeprocnamer$   r*   r*   r+   	test_name`   s    z TestProcessObjectLeaks.test_namec                 C   s   |  | jj d S r    )r6   r7   Zcmdliner9   r*   r*   r+   test_cmdlined   s    z#TestProcessObjectLeaks.test_cmdlinec                 C   s   |  | jj d S r    )r6   r7   Zexer9   r*   r*   r+   test_exeh   s    zTestProcessObjectLeaks.test_exec                 C   s   |  | jj d S r    )r6   r7   Zppidr9   r*   r*   r+   	test_ppidl   s    z TestProcessObjectLeaks.test_ppidz
POSIX onlyc                 C   s   |  | jj d S r    )r6   r7   Zuidsr9   r*   r*   r+   	test_uidsp   s    z TestProcessObjectLeaks.test_uidsc                 C   s   |  | jj d S r    )r6   r7   Zgidsr9   r*   r*   r+   	test_gidsu   s    z TestProcessObjectLeaks.test_gidsc                 C   s   |  | jj d S r    )r6   r7   statusr9   r*   r*   r+   test_statusz   s    z"TestProcessObjectLeaks.test_statusc                 C   s   |  | jj d S r    )r6   r7   nicer9   r*   r*   r+   	test_nice~   s    z TestProcessObjectLeaks.test_nicec                    s    t    fdd d S )Nc                      s   j  S r    )r7   rB   r*   Znicenessr$   r*   r+   <lambda>       z6TestProcessObjectLeaks.test_nice_set.<locals>.<lambda>)thisprocrB   r6   r9   r*   rD   r+   test_nice_set   s    z$TestProcessObjectLeaks.test_nice_setnot supportedc                 C   s   |  | jj d S r    )r6   r7   ionicer9   r*   r*   r+   test_ionice   s    z"TestProcessObjectLeaks.test_ionicec                    sZ   t r"t   fdd n4  fdd ttjt	 dd} 
t| d S )Nc                      s    j S r    )r7   rJ   r*   r$   valuer*   r+   rE      rF   z8TestProcessObjectLeaks.test_ionice_set.<locals>.<lambda>c                      s    j tjS r    )r7   rJ   psutilZIOPRIO_CLASS_NONEr*   r9   r*   r+   rE      rF   r   )r   rG   rJ   r6   r-   partialcextZproc_ioprio_setosgetpidexecute_w_excOSErrorr$   r)   r*   rL   r+   test_ionice_set   s    z&TestProcessObjectLeaks.test_ionice_setc                 C   s   |  | jj d S r    )r6   r7   Zio_countersr9   r*   r*   r+   test_io_counters   s    z'TestProcessObjectLeaks.test_io_counterszworthless on POSIXc                 C   s   t    | | jj d S r    )rN   Processusernamer6   r7   r9   r*   r*   r+   test_username   s    z$TestProcessObjectLeaks.test_usernamec                 C   s   |  | jj d S r    )r6   r7   Zcreate_timer9   r*   r*   r+   test_create_time   s    z'TestProcessObjectLeaks.test_create_time)Zonly_ifc                 C   s   |  | jj d S r    )r6   r7   Znum_threadsr9   r*   r*   r+   test_num_threads   s    z'TestProcessObjectLeaks.test_num_threadsWINDOWS onlyc                 C   s   |  | jj d S r    )r6   r7   Znum_handlesr9   r*   r*   r+   test_num_handles   s    z'TestProcessObjectLeaks.test_num_handlesc                 C   s   |  | jj d S r    )r6   r7   Znum_fdsr9   r*   r*   r+   test_num_fds   s    z#TestProcessObjectLeaks.test_num_fdsc                 C   s   |  | jj d S r    )r6   r7   Znum_ctx_switchesr9   r*   r*   r+   test_num_ctx_switches   s    z,TestProcessObjectLeaks.test_num_ctx_switchesc                 C   s   |  | jj d S r    )r6   r7   threadsr9   r*   r*   r+   test_threads   s    z#TestProcessObjectLeaks.test_threadsc                 C   s   |  | jj d S r    )r6   r7   	cpu_timesr9   r*   r*   r+   test_cpu_times   s    z%TestProcessObjectLeaks.test_cpu_timesc                 C   s   |  | jj d S r    )r6   r7   Zcpu_numr9   r*   r*   r+   test_cpu_num   s    z#TestProcessObjectLeaks.test_cpu_numc                 C   s   |  | jj d S r    )r6   r7   Zmemory_infor9   r*   r*   r+   test_memory_info   s    z'TestProcessObjectLeaks.test_memory_infoc                 C   s   |  | jj d S r    )r6   r7   Zmemory_full_infor9   r*   r*   r+   test_memory_full_info   s    z,TestProcessObjectLeaks.test_memory_full_infoc                 C   s   |  | jj d S r    )r6   r7   Zterminalr9   r*   r*   r+   test_terminal   s    z$TestProcessObjectLeaks.test_terminalc                 C   s$   t rtn| j}| j| jj|d d S )Nr"   )r   r#   r"   r6   r7   resumer$   r"   r*   r*   r+   test_resume   s    z"TestProcessObjectLeaks.test_resumec                 C   s   |  | jj d S r    )r6   r7   cwdr9   r*   r*   r+   test_cwd   s    zTestProcessObjectLeaks.test_cwdc                 C   s   |  | jj d S r    )r6   r7   cpu_affinityr9   r*   r*   r+   test_cpu_affinity   s    z(TestProcessObjectLeaks.test_cpu_affinityc                    s4   t    fdd tfdd d S )Nc                      s   j  S r    r7   rp   r*   Zaffinityr$   r*   r+   rE      rF   z>TestProcessObjectLeaks.test_cpu_affinity_set.<locals>.<lambda>c                      s    j dgS NrO   rr   r*   r9   r*   r+   rE      rF   )rG   rp   r6   rT   
ValueErrorr9   r*   rs   r+   test_cpu_affinity_set   s     
z,TestProcessObjectLeaks.test_cpu_affinity_setc              	   C   s*   t t d | | jj W 5 Q R X d S )Nw)openr   r6   r7   Z
open_filesr9   r*   r*   r+   test_open_files   s    z&TestProcessObjectLeaks.test_open_filesc                 C   s   |  | jj d S r    )r6   r7   Zmemory_mapsr9   r*   r*   r+   test_memory_maps   s    z'TestProcessObjectLeaks.test_memory_mapsz
LINUX onlyc                    s      fdd d S )Nc                      s    j tjS r    r7   rlimitrN   RLIMIT_NOFILEr*   r9   r*   r+   rE      rF   z4TestProcessObjectLeaks.test_rlimit.<locals>.<lambda>r6   r9   r*   r9   r+   test_rlimit   s    z"TestProcessObjectLeaks.test_rlimitc                    s<   t tj  fdd ttffdd d S )Nc                      s   j tj S r    r{   r*   limitr$   r*   r+   rE      rF   z8TestProcessObjectLeaks.test_rlimit_set.<locals>.<lambda>c                      s    j dS rt   )r7   r|   r*   r9   r*   r+   rE      rF   )rG   r|   rN   r}   r6   rT   rU   ru   r9   r*   r   r+   test_rlimit_set   s    z&TestProcessObjectLeaks.test_rlimit_setzworthless on WINDOWSc              	      s6   t  & trdnd  fdd W 5 Q R X d S )NZinetallc                      s   j  S r    )r7   connectionsr*   kindr$   r*   r+   rE     rF   z9TestProcessObjectLeaks.test_connections.<locals>.<lambda>)r   r   r6   r9   r*   r   r+   test_connections   s    z'TestProcessObjectLeaks.test_connectionsc                 C   s   |  | jj d S r    )r6   r7   environr9   r*   r*   r+   test_environ  s    z#TestProcessObjectLeaks.test_environc                 C   s   |  dd  d S )Nc                   S   s   t t S r    )rQ   	proc_inforR   rS   r*   r*   r*   r+   rE   
  rF   z7TestProcessObjectLeaks.test_proc_info.<locals>.<lambda>r~   r9   r*   r*   r+   test_proc_info  s    z%TestProcessObjectLeaks.test_proc_infoN)9__name__
__module____qualname____doc__rG   r7   r5   r0   r:   r;   r<   r=   unittestskipIfr   r>   r?   rA   rC   rH   r   rK   rW   r   rX   r[   r\   r   r   r]   r   r_   r`   ra   rc   re   r   rf   rg   rh   ri   rm   ro   r   rq   rv   ry   r   rz   r   r   r   r   r   r   r   r   r*   r*   r*   r+   r1   W   s   






	













r1   c                       sp   e Zd ZdZe fddZe fddZdd Zerhdd	 Z	d
d Z
dd Zdd Zdd Zdd Z  ZS )TestTerminatedProcessLeakszRepeat the tests above looking for leaks occurring when dealing
    with terminated processes raising NoSuchProcess exception.
    The C functions are still invoked but will follow different code
    paths. We'll check those code paths.
    c                    s:   t    t | _t| jj| _| j  | j	  d S r    )
r
   
setUpClassr   subprN   rY   pidr7   killwaitclsr!   r*   r+   r     s
    

z%TestTerminatedProcessLeaks.setUpClassc                    s   t    t| j d S r    )r
   tearDownClassr   r   r   r   r*   r+   r     s    
z(TestTerminatedProcessLeaks.tearDownClassc                 C   s&   z
|  W n t jk
r    Y nX d S r    )rN   ZNoSuchProcessrV   r*   r*   r+   call!  s    
zTestTerminatedProcessLeaks.callc                 C   s   |  | jj d S r    )r6   r7   r   r9   r*   r*   r+   	test_kill)  s    z$TestTerminatedProcessLeaks.test_killc                 C   s   |  | jj d S r    )r6   r7   r   r9   r*   r*   r+   test_terminate,  s    z)TestTerminatedProcessLeaks.test_terminatec                 C   s   |  | jj d S r    )r6   r7   Zsuspendr9   r*   r*   r+   test_suspend/  s    z'TestTerminatedProcessLeaks.test_suspendc                 C   s   |  | jj d S r    )r6   r7   rk   r9   r*   r*   r+   rm   2  s    z&TestTerminatedProcessLeaks.test_resumec                 C   s   |  | jj d S r    )r6   r7   r   r9   r*   r*   r+   	test_wait5  s    z$TestTerminatedProcessLeaks.test_waitc                    s    fdd}  | d S )Nc                      s*   zt  jjW S  tk
r$   Y nX d S r    )rQ   r   r7   r   r	   r*   r9   r*   r+   r   :  s    z7TestTerminatedProcessLeaks.test_proc_info.<locals>.callr~   )r$   r   r*   r9   r+   r   8  s    z)TestTerminatedProcessLeaks.test_proc_info)r   r   r   r   classmethodr   r   r   r   r   r   r   rm   r   r   __classcell__r*   r*   r   r+   r     s   r   r^   c                   @   s   e Zd Zdd Zdd ZdS )TestProcessDualImplementationc                 C   s   |  dd  d S )Nc                   S   s   t jt ddS )NTZuse_pebrQ   Zproc_cmdlinerR   rS   r*   r*   r*   r+   rE   G  rF   zETestProcessDualImplementation.test_cmdline_peb_true.<locals>.<lambda>r~   r9   r*   r*   r+   test_cmdline_peb_trueF  s    z3TestProcessDualImplementation.test_cmdline_peb_truec                 C   s   |  dd  d S )Nc                   S   s   t jt ddS )NFr   r   r*   r*   r*   r+   rE   J  rF   zFTestProcessDualImplementation.test_cmdline_peb_false.<locals>.<lambda>r~   r9   r*   r*   r+   test_cmdline_peb_falseI  s    z4TestProcessDualImplementation.test_cmdline_peb_falseN)r   r   r   r   r   r*   r*   r*   r+   r   C  s   r   c                   @   s  e Zd ZdZdd Ze dd Ze dd Ze dd	 Ze d
d Z	e dd Z
e eeope dkdee ddd Zee ddd Zdd Zeeddd Zdd Zdd Zdd  Zeeoejd! d"e d#d$ Ze d%d& Ze ee  dd'd( Z!e eeoBe" d)kd*d+d, Z#d-d. Z$d/d0 Z%e ee& dd1d2 Z'e ee( dd3d4 Z)e ee* dd5d6 Z+e d7d8 Z,d9d: Z-d;d< Z.erd=d> Z/d?d@ Z0dAdB Z1dCdD Z2dEdF Z3dGS )HTestModuleFunctionsLeaksz&Test leaks of psutil module functions.c                 C   s   t  }|| |j d S r    )r   r2   r   r3   r*   r*   r+   r5   U  s    z&TestModuleFunctionsLeaks.test_coveragec                 C   s   |  dd  d S )Nc                   S   s   t jddS )NTlogicalrN   	cpu_countr*   r*   r*   r+   rE   ]  rF   z9TestModuleFunctionsLeaks.test_cpu_count.<locals>.<lambda>r~   r9   r*   r*   r+   test_cpu_count[  s    z'TestModuleFunctionsLeaks.test_cpu_countc                 C   s   |  dd  d S )Nc                   S   s   t jddS )NFr   r   r*   r*   r*   r+   rE   a  rF   z?TestModuleFunctionsLeaks.test_cpu_count_cores.<locals>.<lambda>r~   r9   r*   r*   r+   test_cpu_count_cores_  s    z-TestModuleFunctionsLeaks.test_cpu_count_coresc                 C   s   |  tj d S r    )r6   rN   rd   r9   r*   r*   r+   re   c  s    z'TestModuleFunctionsLeaks.test_cpu_timesc                 C   s   |  dd  d S )Nc                   S   s   t jddS )NT)Zpercpu)rN   rd   r*   r*   r*   r+   rE   i  rF   z=TestModuleFunctionsLeaks.test_per_cpu_times.<locals>.<lambda>r~   r9   r*   r*   r+   test_per_cpu_timesg  s    z+TestModuleFunctionsLeaks.test_per_cpu_timesc                 C   s   |  tj d S r    )r6   rN   Z	cpu_statsr9   r*   r*   r+   test_cpu_statsk  s    z'TestModuleFunctionsLeaks.test_cpu_statsZarm64zskipped due to #1892rI   c                 C   s   |  tj d S r    )r6   rN   Zcpu_freqr9   r*   r*   r+   test_cpu_freqo  s    z&TestModuleFunctionsLeaks.test_cpu_freqr^   c                 C   s   t   | t j d S r    )rN   
getloadavgr6   r9   r*   r*   r+   test_getloadavgw  s    z(TestModuleFunctionsLeaks.test_getloadavgc                 C   s   |  tj d S r    )r6   rN   Zvirtual_memoryr9   r*   r*   r+   test_virtual_memory~  s    z,TestModuleFunctionsLeaks.test_virtual_memoryz&worthless on SUNOS (uses a subprocess)c                 C   s   |  tj d S r    )r6   rN   Zswap_memoryr9   r*   r*   r+   test_swap_memory  s    z)TestModuleFunctionsLeaks.test_swap_memoryc                 C   s$   t rtn| j}| jdd |d d S )Nc                   S   s   t t S r    )rN   Z
pid_existsrR   rS   r*   r*   r*   r+   rE     rF   z:TestModuleFunctionsLeaks.test_pid_exists.<locals>.<lambda>rj   r   r#   r"   r6   rl   r*   r*   r+   test_pid_exists  s    z(TestModuleFunctionsLeaks.test_pid_existsc                 C   s$   t rtn| j}| jdd |d d S )Nc                   S   s
   t dS )N.)rN   
disk_usager*   r*   r*   r+   rE     rF   z:TestModuleFunctionsLeaks.test_disk_usage.<locals>.<lambda>rj   r   rl   r*   r*   r+   test_disk_usage  s    z(TestModuleFunctionsLeaks.test_disk_usagec                 C   s   |  tj d S r    )r6   rN   Zdisk_partitionsr9   r*   r*   r+   test_disk_partitions  s    z-TestModuleFunctionsLeaks.test_disk_partitionsz/proc/diskstatsz3/proc/diskstats not available on this Linux versionc                 C   s   |  dd  d S )Nc                   S   s   t jddS NF)Znowrap)rN   Zdisk_io_countersr*   r*   r*   r+   rE     rF   z@TestModuleFunctionsLeaks.test_disk_io_counters.<locals>.<lambda>r~   r9   r*   r*   r+   test_disk_io_counters  s    z.TestModuleFunctionsLeaks.test_disk_io_countersc                 C   s   |  tj d S r    )r6   rN   Zpidsr9   r*   r*   r+   	test_pids  s    z"TestModuleFunctionsLeaks.test_pidsc                 C   s   |  dd  d S )Nc                   S   s   t jddS r   )rN   Znet_io_countersr*   r*   r*   r+   rE     rF   z?TestModuleFunctionsLeaks.test_net_io_counters.<locals>.<lambda>r~   r9   r*   r*   r+   test_net_io_counters  s    z-TestModuleFunctionsLeaks.test_net_io_countersr   zneed root accessc              	   C   s0   t jdd t  | dd  W 5 Q R X d S )Nr   r   c                   S   s   t jddS )Nr   r   )rN   net_connectionsr*   r*   r*   r+   rE     rF   z?TestModuleFunctionsLeaks.test_net_connections.<locals>.<lambda>)rN   r   r   r6   r9   r*   r*   r+   test_net_connections  s    z-TestModuleFunctionsLeaks.test_net_connectionsc                 C   s"   t rdn| j}| jtj|d d S )Ni @ )	tolerance)r   r   r6   rN   Znet_if_addrs)r$   r   r*   r*   r+   test_net_if_addrs  s    z*TestModuleFunctionsLeaks.test_net_if_addrsc                 C   s   |  tj d S r    )r6   rN   Znet_if_statsr9   r*   r*   r+   test_net_if_stats  s    z*TestModuleFunctionsLeaks.test_net_if_statsc                 C   s   |  tj d S r    )r6   rN   Zsensors_batteryr9   r*   r*   r+   test_sensors_battery  s    z-TestModuleFunctionsLeaks.test_sensors_batteryc                 C   s   |  tj d S r    )r6   rN   Zsensors_temperaturesr9   r*   r*   r+   test_sensors_temperatures  s    z2TestModuleFunctionsLeaks.test_sensors_temperaturesc                 C   s   |  tj d S r    )r6   rN   Zsensors_fansr9   r*   r*   r+   test_sensors_fans  s    z*TestModuleFunctionsLeaks.test_sensors_fansc                 C   s   |  tj d S r    )r6   rN   Z	boot_timer9   r*   r*   r+   test_boot_time  s    z'TestModuleFunctionsLeaks.test_boot_timec                 C   s   |  tj d S r    )r6   rN   Zusersr9   r*   r*   r+   
test_users  s    z#TestModuleFunctionsLeaks.test_usersc                 C   s   |  dd  d S )Nc                   S   s
   t dS )NF)rN   Z
_set_debugr*   r*   r*   r+   rE     rF   z9TestModuleFunctionsLeaks.test_set_debug.<locals>.<lambda>r~   r9   r*   r*   r+   test_set_debug  s    z'TestModuleFunctionsLeaks.test_set_debugc                 C   s   |  tj d S r    )r6   rQ   Zwinservice_enumerater9   r*   r*   r+   test_win_service_iter  s    z.TestModuleFunctionsLeaks.test_win_service_iterc                 C   s   d S r    r*   r9   r*   r*   r+   test_win_service_get  s    z-TestModuleFunctionsLeaks.test_win_service_getc                    s&   t t   |  fdd d S )Nc                      s
   t  S r    )rQ   Zwinservice_query_configr*   r8   r*   r+   rE     rF   zFTestModuleFunctionsLeaks.test_win_service_get_config.<locals>.<lambda>nextrN   Zwin_service_iterr8   r6   r9   r*   r   r+   test_win_service_get_config  s    z4TestModuleFunctionsLeaks.test_win_service_get_configc                    s&   t t   |  fdd d S )Nc                      s
   t  S r    )rQ   Zwinservice_query_statusr*   r   r*   r+   rE     rF   zFTestModuleFunctionsLeaks.test_win_service_get_status.<locals>.<lambda>r   r9   r*   r   r+   test_win_service_get_status  s    z4TestModuleFunctionsLeaks.test_win_service_get_statusc                    s&   t t   |  fdd d S )Nc                      s
   t  S r    )rQ   Zwinservice_query_descrr*   r   r*   r+   rE     rF   zKTestModuleFunctionsLeaks.test_win_service_get_description.<locals>.<lambda>r   r9   r*   r   r+    test_win_service_get_description  s    z9TestModuleFunctionsLeaks.test_win_service_get_descriptionN)4r   r   r   r   r5   r0   r   r   re   r   r   r   r   r   platformmachiner   r   r   r   r   r   r   r   r   r   r   rR   pathexistsr   r   r   r   getuidr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   r   R  sx   









r   __main__)run_from_name)6r   
__future__r   r-   rR   r   r   rN   Zpsutil._commonr   r   r   r   r   r   Zpsutil._compatr	   r
   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_psplatformrQ   rY   rG   r#   r0   r1   r   r   r   r   r   Zpsutil.tests.runnerr   __file__r*   r*   r*   r+   <module>   sb    76 
