
    dr                         d Z ddgZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlZdZ G d d          Zd	 Zd
 Z G d d          Zd Zd ZddZd Z G d d          Zd Zedk    r e             dS dS )a  program/module to trace Python program or function execution

Sample use, command line:
  trace.py -c -f counts --ignore-dir '$prefix' spam.py eggs
  trace.py -t --ignore-dir '$prefix' spam.py eggs
  trace.py --trackcalls spam.py eggs

Sample use, programmatically
  import sys

  # create a Trace object, telling it what to ignore, and whether to
  # do tracing or line-counting or both.
  tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,],
                       trace=0, count=1)
  # run the new command using the given tracer
  tracer.run('main()')
  # make a report, placing output in /tmp
  r = tracer.results()
  r.write_results(show_missing=True, coverdir="/tmp")
TraceCoverageResults    N)	monotonicz#pragma NO COVERc                       e Zd ZddZd ZdS )_IgnoreNc                     |st                      nt          |          | _        |sg nd |D             | _        ddi| _        d S )Nc                 L    g | ]!}t           j                            |          "S  )ospathnormpath.0ds       /croot/python-split_1694437901252/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/python3.11/trace.py
<listcomp>z$_Ignore.__init__.<locals>.<listcomp>H   s8     *9 *9 *9./ +-'*:*:1*=*= *9 *9 *9    z<string>   )set_mods_dirs_ignore)selfmodulesdirss      r   __init__z_Ignore.__init__F   sX    ");SUUUs7||
# 9RR *9 *937*9 *9 *9
#Q(r   c                 \   || j         v r| j         |         S || j        v rd| j         |<   dS | j        D ]'}|                    |dz             rd| j         |<    dS (|d| j         |<   dS | j        D ]1}|                    |t          j        z             rd| j         |<    dS 2d| j         |<   dS )Nr   .r   )r   r   
startswithr   r   sep)r   filename
modulenamemodr   s        r   namesz_Ignore.namesL   s    %%<
++ ##'(DL$1 : 	 	C $$S3Y// +,Z(qq
 '(DL$1  
	 
	A ""1rv:.. +,Z(qq
 $%Z qr   NN)__name__
__module____qualname__r   r$   r
   r   r   r   r   E   s7        ) ) ) )) ) ) ) )r   r   c                     t           j                            |           }t           j                            |          \  }}|S ),Return a plausible module name for the path.)r   r   basenamesplitext)r   baser!   exts       r   _modnamer/   w   s7     7D!!DG$$T**MHcOr   c                    t           j                            |           }d}t          j        D ]{}t           j                            |          }|                    |          rE|t          |                   t           j        k    r"t          |          t          |          k    r|}||r| t          |          dz   d         }n| }t           j                            |          \  }}|                    t           j        d          }t           j	        r |                    t           j	        d          }t           j        
                    |          \  }}|                    d          S )r*    r   Nr   )r   r   normcasesysr   lenr    
splitdrivereplacealtsepr,   lstrip)r   comparepathlongestdirr-   driver!   r.   s           r   _fullmodnamer=   ~   s0    '""4((KGx  gs##!!#&& 	;s3xx+@BF+J+J3xx#g,,&& CLL1$%%&'$$T**KE4<<$$D	y ,||BIs++G$$T**MHc??3r   c                   6    e Zd Z	 	 d	dZd Zd Zd
dZddZdS )r   Nc                    || _         | j         i | _         | j                                         | _        || _        | j        i | _        | j                                        | _        || _        | j        i | _        | j                                        | _        || _        || _        | j        r	 t          | j        d          5 }t          j	        |          \  }}}d d d            n# 1 swxY w Y   | 
                    |                     |||                     d S # t          t          t          f$ r1}t          d| j        d|t           j                   Y d }~d S d }~ww xY wd S )Nrb)callerszSkipping counts file : file)countscopycountercalledfuncsrA   infileoutfileopenpickleloadupdate	__class__OSErrorEOFError
ValueErrorprintr3   stderr)r   rE   rH   rI   rA   rJ   ferrs           r   r   zCoverageResults.__init__   s   ;DK{''))&#!D+0022<DL|((**; 	NN$+t,, B39;q>>0FKB B B B B B B B B B B B B B BDNN6;NPPQQQQQXz2 N N N)-cc;BE*N N N N N N N N N NN	N 	Ns<   0D" C*D" *C..D" 1C.2.D" "E*9&E%%E*c                 V    |                     d          o|                    d          S )z_Return True if the filename does not refer to a file
        we want to have reported.
        <>)r   endswith)r   r!   s     r   is_ignored_filenamez#CoverageResults.is_ignored_filename   s+     ""3''BH,=,=c,B,BBr   c                     | j         }| j        }| j        }|j         }|j        }|j        }|D ]$}|                    |d          ||         z   ||<   %|D ]}d||<   |D ]}d||<   dS )z.Merge in the data from another CoverageResultsr   r   N)rE   rH   rA   get)	r   otherrE   rH   rA   other_countsother_calledfuncsother_callerskeys	            r   rN   zCoverageResults.update   s    &,|!- 	A 	AC **S!,,|C/@@F3KK$ 	! 	!C K  	 	CGCLL	 	r   TFc                    | j         rRt                       t          d           | j         }t          |          D ]\  }}}t          d|d|d|           | j        rt                       t          d           dx}}	t          | j                  D ]o\  \  }
}}\  }}}|
|k    r#t                       t          d|
d           |
}d}	||
k    r|	|k    rt          d|           |}	t          d	|d
|d|d
|           pi }| j        D ]2\  }}|                    |i           x}||<   | j        ||f         ||<   3i }|                                D ]\  }}|                     |          r|                    d          r
|dd         }|Lt          j
                            t          j
                            |                    }t          |          }nD|}t          j
                            |          st          j        |           t!          |          }|rt#          |          }ni }t%          j        |          }t          j
                            ||dz             }t+          |d          5 }t-          j        |j                  \  }}ddd           n# 1 swxY w Y   |                     |||||          \  }}|r |rt5          d|z  |z            }||||f||<   |rH|rFt          d           t          |          D ]'}||         \  }}}}t          d||         z             (| j        r	 t+          | j        d          5 } t9          j        | j        | j         | j        f| d           ddd           dS # 1 swxY w Y   dS # t<          $ r)}!t          d|!z  t>          j                    Y d}!~!dS d}!~!ww xY wdS )af  
        Write the coverage results.

        :param show_missing: Show lines that had no hits.
        :param summary: Include coverage summary per module.
        :param coverdir: If None, the results of each module are placed in its
                         directory, otherwise it is included in the directory
                         specified.
        zfunctions called:z
filename: z, modulename: , funcname: zcalling relationships:r1   z***z  -->z    r   z -> z.pycNz.coverr@   d   zlines   cov%   module   (path)z%5d   %3d%%   %s   (%s)wbr   z"Can't save counts files because %srC   )!rH   rS   sortedrA   rE   r]   itemsr[   rZ   r   r   dirnameabspathr/   existsmakedirsr=   _find_executable_linenos	linecachegetlinesjoinrK   tokenizedetect_encodingreadlinewrite_results_fileintrJ   rL   dumprP   r3   rT   )"r   show_missingsummarycoverdircallsr!   r"   funcnamelastfile	lastcfilepfilepmodpfunccfilecmodcfuncper_filelineno	lines_hitsumscountr;   lnotabsource	coverpathfpencoding_n_hitsn_linespercentmrU   rV   s"                                     r   write_resultszCoverageResults.write_results   s     	<GGG%&&&$E28-- < <.*h"((JJJ: < < < < < 	IGGG*+++#%%Hydl++
I 
I<%%u';tUH$$GGG%...$H "IE>>i5&8&8'5))) %IdddEEE444GHHHH  $ 	@ 	@Hf-5\\(B-G-GGI* $Xv,> ?If '~~// 	J 	JOHe''11   (( )#CRC=goobgooh&?&?@@%h//

w~~c** %K$$$)(33
  1(;;'11FS*x*?@@Ih%% D&6r{CC!D D D D D D D D D D D D D D D"55i6<eXO OOFG J7 JcFlW455#*GZ#IZ   	;t 	;2333D\\ ; ;9=a6*h/$q'9::::< 	SS$,-- &Kd.> M !1& & && & & & & & & & & & & & & & & & & &  S S S:S@szRRRRRRRRRRS	S 	SsN    J))J-	0J-	N )NN NN NN 
O(OOc                 4   	 t          |d|          }n:# t          $ r-}t          d|d|dt          j                   Y d}~dS d}~ww xY wd	}d	}	|5  t          |d
          D ]\  }
}|
|v r)|                    d||
         z             |	d
z  }	|d
z  }n=|
|v r$t          |vr|                    d           |d
z  }n|                    d           |                    |                    d                     	 ddd           n# 1 swxY w Y   |	|fS )z'Return a coverage results file in path.wr   ztrace: Could not open z for writing: z - skippingrC   N)r   r   r   r   z%5d: z>>>>>> z          )	rK   rP   rS   r3   rT   	enumeratewritePRAGMA_NOCOVER
expandtabs)r   r   linesr   r   r   rJ   rV   r   r   r   lines               r   ru   z"CoverageResults.write_results_file)  s   	4x888GG 	 	 	E26$$=DGJP P P P44444	
  	2 	2 )% 3 3 2 2 Y&&MM'If,="=>>>aKFqLGGv%%n.D.D MM),,,qLGGMM),,,dooa0011112	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2" ws'    
A"AAB)DDD)NNNNN)TFNN)r&   r'   r(   r   r[   rN   r   ru   r
   r   r   r   r      s        =A'+N N N N4C C C  $ZS ZS ZS ZSx     r   c                 P    i }t          j        |           D ]\  }}||vrd||<   |S )z:Return dict where keys are lines in the line number table.r   )disfindlinestarts)codestrslinenosr   r   s        r   _find_lines_from_coder   I  s?    G'--    	6GFONr   c                     t          | |          }| j        D ]9}t          j        |          r#|                    t          ||                     :|S )z<Return lineno dict for all code objects reachable from code.)r   	co_constsinspectiscoderN   _find_lines)r   r   r   cs       r   r   r   S  sZ     $D$//G ^ 1 1>! 	1NN;q$//000Nr   c                 L   i }t           j        }t          | |          5 }t          j        |j                  }|D ]O\  }}}}	}
|t           j        k    r5|t           j        k    r%|\  }}|	\  }}t          ||dz             D ]}d||<   |}P	 ddd           n# 1 swxY w Y   |S )zReturn a dict of possible docstring positions.

    The dict maps line numbers to strings.  There is an entry for
    line that contains only a string or a part of a triple-quoted
    string.
    r   r   N)tokenINDENTrK   rr   generate_tokensrt   STRINGrange)r!   r   r   
prev_ttyperU   tokttypetstrstartendr   slinescolelineecolis                   r   _find_stringsr   _  s
    	A J	h	*	*	* 	a&qz22-0 	 	)E4T$$--"'KE4"%KE4"5%!)44 ! ! !JJ		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 Hs   A,BB Bc                 j   	 t          j        |           5 }|                                }|j        }ddd           n# 1 swxY w Y   n:# t          $ r-}t          d| d|t          j                   i cY d}~S d}~ww xY wt          || d          }t          | |          }t          ||          S )zAReturn dict where keys are line numbers in the line number table.NzNot printing coverage data for rB   rC   exec)rr   rK   readr   rP   rS   r3   rT   compiler   r   )r!   rU   progr   rV   r   r   s          r   rn   rn   v  s   ]8$$ 	"6688DzH	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"    !)3307:z	C 	C 	C 	C						 46**D8,,DtT"""s=   A
 >A
 AA
 AA
 

B"A<6B<Bc                   `    e Zd Z	 	 	 ddZd ZddZd	 Zd
 Zd Zd Z	d Z
d Zd Zd Zd ZdS )r   r   r   r
   NFc
                    || _         || _        t          ||          | _        i | _        i | _        d| _        || _        i | _        i | _	        i | _
        d| _        |	rt                      | _        |r| j        | _        dS |r| j        | _        dS |r|r| j        | _        | j        | _        dS |r| j        | _        | j        | _        dS |r| j        | _        | j        | _        dS d| _        dS )ax  
        @param count true iff it should count number of times each
                     line is executed
        @param trace true iff it should print out each line that is
                     being counted
        @param countfuncs true iff it should just output a list of
                     (filename, modulename, funcname,) for functions
                     that were called at least once;  This overrides
                     `count' and `trace'
        @param ignoremods a list of the names of modules to ignore
        @param ignoredirs a list of the names of directories to ignore
                     all of the (recursive) contents of
        @param infile file from which to read stored counts to be
                     added into the results
        @param outfile file in which to write the results
        @param timing true iff timing information be displayed
        r   Nr   )rI   rJ   r   ignorerE   pathtobasename	donothingtrace_calledfuncs_callers_caller_cache
start_time_timeglobaltrace_trackcallersglobaltraceglobaltrace_countfuncsglobaltrace_ltlocaltrace_trace_and_count
localtracelocaltrace_tracelocaltrace_count)
r   r   r   
countfuncscountcallers
ignoremods
ignoredirsrI   rJ   timings
             r   r   zTrace.__init__  s   ( j*55 
 	&#ggDO 	#<D 	#:D 	u 	#2D"=DOOO 	#2D"3DOOO 	#2D"3DOOO DNNNr   c                 J    dd l }|j        }|                     |||           d S )Nr   )__main____dict__runctx)r   cmdr   dicts       r   runz	Trace.run  s/     Ct$$$$$r   c                 x   |i }|i }| j         s2t          j        | j                   t	          j        | j                   	 t          |||           | j         s*t	          j        d            t          j        d            d S d S # | j         s)t	          j        d            t          j        d            w w xY wr   )r   	threadingsettracer   r3   r   )r   r   globalslocalss       r   r   zTrace.runctx  s    ?bG>B6~ 	+t/000L)***	)gv&&&> )T""""4((((() )4> )T""""4(((()s   B 2B9c                    d }| j         st          j        | j                   	  ||i |}| j         st          j        d            n!# | j         st          j        d            w w xY w|S r   )r   r3   r   r   )r   funcargskwresults        r   runfunczTrace.runfunc  s    ~ 	+L)***	#T4&2&&F> #T""" > #T""""#s   A A&c                 <   |j         }|j        }|rt          |          }nd }|j        }d }|| j        v r| j        |         | j        |         }nd | j        |<   d t          j        |          D             }t          |          dk    rd t          j        |d                   D             }t          |          dk    rNd t          j        |d                   D             }	t          |	          dk    r|	d         j        }|| j        |<   ||d|}|||fS )Nc                 :    g | ]}t          j        |          |S r
   )r   
isfunction)r   rU   s     r   r   z1Trace.file_module_function_of.<locals>.<listcomp>  s7     3 3 31#.q113Q 3 3 3r   r   c                 <    g | ]}t          |t                    |S r
   )
isinstancer   r   s     r   r   z1Trace.file_module_function_of.<locals>.<listcomp>  s6     5 5 5q *1d 3 35 5 5 5r   r   c                 2    g | ]}t          |d           |S )	__bases__)hasattr)r   r   s     r   r   z1Trace.file_module_function_of.<locals>.<listcomp>  s6     ? ? ?Q&-a&=&=?q ? ? ?r   r   )	f_codeco_filenamer/   co_namer   gcget_referrersr4   r&   )
r   framer   r!   r"   r|   clsnamefuncsdictsclassess
             r   file_module_function_ofzTrace.file_module_function_of  s_   |# 	!(++JJJ<4%%%!$'3,T2'+Dt$3 3 0 6 6 3 3 3E
 5zzQ5 5B$4U1X$>$> 5 5 5u::??? ?"*:58*D*D ? ? ?G7||q((")!*"5
 4;*40")''884HX--r   c                     |dk    r=|                      |          }|                      |j                  }d| j        ||f<   dS dS )zkHandler for call events.

        Adds information about who called who to the self._callers dict.
        callr   N)r   f_backr   )r   r   whyarg	this_funcparent_funcs         r   r   zTrace.globaltrace_trackcallers  sS    
 &==44U;;I66u|DDK67DM;	2333	 =r   c                 T    |dk    r!|                      |          }d| j        |<   dS dS )zoHandler for call events.

        Adds (filename, modulename, funcname) to the self._calledfuncs dict.
        r  r   N)r   r   )r   r   r  r  r  s        r   r   zTrace.globaltrace_countfuncs  s:    
 &==44U;;I+,Di((( =r   c                    |dk    r|j         }|j                            dd          }|rZt          |          }|E| j                            ||          }|s*| j        rt          d|d|j                   | j	        S dS dS dS dS )zHandler for call events.

        If the code block being entered is to be ignored, returns `None',
        else returns self.localtrace.
        r  __file__Nz --- modulename: rd   )
r   	f_globalsr]   r/   r   r$   r   rS   r   r   )r   r   r  r  r   r!   r"   	ignore_its           r   r   zTrace.globaltrace_lt  s     &==<D**:t<<H  &h//
) $ 1 1(J G GI$ /: B!E&0jj$,,$@ B B B#. *)/ / t =r   c           	         |dk    r|j         j        }|j        }||f}| j                            |d          dz   | j        |<   | j        r(t          dt                      | j        z
  z  d           t          j	        
                    |          }t          d||t          j        ||          fz  d           | j        S )	Nr   r   r   %.2f r   
%s(%d): %sr1   )r   r   f_linenorE   r]   r   rS   r   r   r   r+   ro   getliner   )r   r   r  r  r!   r   rb   bnames           r   r   z Trace.localtrace_trace_and_count(  s    &==|/H^FF"C#{sA66:DK Ef$/ 9:DDDDG$$X..E,%"+"3Hf"E"E"G GLNP P P Pr   c           	      2   |dk    r|j         j        }|j        }| j        r(t	          dt                      | j        z
  z  d           t          j                            |          }t	          d||t          j
        ||          fz  d           | j        S )Nr   r  r  r  r  r1   )r   r   r  r   rS   r   r   r   r+   ro   r  r   )r   r   r  r  r!   r   r  s          r   r   zTrace.localtrace_trace7  s    &==|/H^F Ef$/ 9:DDDDG$$X..E,%"+"3Hf"E"E"G GLNP P P Pr   c                     |dk    r=|j         j        }|j        }||f}| j                            |d          dz   | j        |<   | j        S )Nr   r   r   )r   r   r  rE   r]   r   )r   r   r  r  r!   r   rb   s          r   r   zTrace.localtrace_countD  sO    &==|/H^FF"C#{sA66:DKr   c                 \    t          | j        | j        | j        | j        | j                  S )N)rI   rJ   rH   rA   )r   rE   rI   rJ   r   r   )r   s    r   resultszTrace.resultsL  s1    t{4;'+|+/+<'+}6 6 6 	6r   )	r   r   r   r   r
   r
   NNFr%   )r&   r'   r(   r   r   r   r   r   r   r   r   r   r   r   r  r
   r   r   r   r     s        DEDH0 0 0 0d% % %
) ) ) )	 	 	'. '. '.R	8 	8 	8- - -  .      6 6 6 6 6r   c                  *   dd l } |                                 }|                    ddd           |                    dd          }|                    dd	d
d           |                    ddd
d           |                    ddd
d           |                    ddd
d           |                    d          }|                                }|                    ddd
d           |                    ddd
d           |                    ddd            |                    d!d"d#            |                    d$d%d
d&           |                    d'd(d
d)           |                    d*d+d
d,           |                    d-d.          }|                    d/d0g d12           |                    d3d0g d42           |                    d5d
d6d72           |                    d8d9d:;           |                    d<| j        d=;           |                                }|j        r(t          j	        d>          t          j	        d?          fd@dA |j
        D             |_
        fdB|j        D             |_        |j        r]|j        s|                    dC           t          |j        |j        D          }|                    |j        |j        |j                  S t'          |j        |j        |j        |j        g          s|                    dE           |j        r#|j        s|j        r|                    dF           |j        r|j        s|                    dG           |j        |                    dH           t3          |j        |j        |j        |j        |j
        |j        |j        |j        |j        I	  	        }	 |j        rVdd l}|j        }|                    |          \  }	}
}|j        g|j        t@          _!        dJ|j        |
j"        |
j#        |
d dK}n|j        g|j        t@          _!        tH          j%        &                    |j                  t@          j%        d<   tO          j(        |j                  5 }tS          |*                                |j        dL          }d d d            n# 1 swxY w Y   |j        dJd d dM}|+                    |||           nL# tX          $ r4}tA          j-        dNt@          j!        d         dO|           Y d }~nd }~wt\          $ r Y nw xY w|/                                }|j0        s(|                    |j        |j        |j                   d S d S )PNr   z	--versionversionz	trace 2.0)actionr  zMain optionsz(One of these (or --report) must be givenz-cz--count
store_truezCount the number of times each line is executed and write the counts to <module>.cover for each module executed, in the module's directory. See also --coverdir, --file, --no-report below.)r  helpz-tz--tracez3Print each line to sys.stdout before it is executedz-lz--listfuncszKeep track of which functions are executed at least once and write the results to sys.stdout after the program exits. Cannot be specified alongside --trace or --count.z-Tz--trackcallsz^Keep track of caller/called pairs and write the results to sys.stdout after the program exits.	Modifiersz-rz--reportzGenerate a report from a counts file; does not execute any code. --file must specify the results file to read, which must have been created in a previous run with --count --file=FILEz-Rz--no-reportz^Do not generate the coverage report files. Useful if you want to accumulate over several runs.z-fz--filez+File to accumulate counts over several runs)r  z-Cz
--coverdirzDirectory where the report files go. The coverage report for <package>.<module> will be written to file <dir>/<package>/<module>.coverz-mz	--missingz?Annotate executable lines that were not executed with ">>>>>> "z-sz	--summaryz\Write a brief summary for each file to sys.stdout. Can only be used with --count or --reportz-gz--timingzQPrefix each line with the time since the program started. Only used while tracingFilterszCan be specified multiple timesz--ignore-moduleappendzqIgnore the given module(s) and its submodules (if it is a package). Accepts comma separated list of module names.)r  defaultr  z--ignore-dirzWIgnore files in the given directory (multiple directories can be joined by os.pathsep).z--moduleFzTrace a module. progname?zfile to run as main program)nargsr  	argumentszarguments to the programstdlib
platstdlibc                    t           j                            t           j                            |                     } |                     d                              d          } t           j                            |           S )Nz$prefixz$exec_prefix)r   r   
expanduser
expandvarsr6   r   )s_exec_prefix_prefixs    r   parse_ignore_dirzmain.<locals>.parse_ignore_dir  sa    Grw11!4455IIi))11.,OOw"""r   c                 f    g | ].}|                     d           D ]}|                                /S ),)splitstrip)r   r   r#   s      r   r   zmain.<locals>.<listcomp>  sW     O O OO O:= ))++ O O O Or   c                 j    g | ]/}|                     t          j                  D ]} |          0S r
   )r1  r   pathsep)r   r   r+  r.  s      r   r   zmain.<locals>.<listcomp>  s_     N N N9L9LN N45 ('** N N N Nr   z-r/--report requires -f/--file)rI   rJ   zLmust specify one of --trace, --count, --report, --listfuncs, or --trackcallsz8cannot specify both --listfuncs and (--trace or --count)z3--summary can only be used with --count or --reportz3progname is missing: required with the main options)r   r   r   r   rI   rJ   r   r   )r&   r
  __package__
__loader____spec__
__cached__r   )r
  r&   r5  r8  zCannot run file z
 because: )1argparseArgumentParseradd_argumentadd_argument_groupadd_mutually_exclusive_group	REMAINDER
parse_args
ignore_dir	sysconfigget_pathignore_modulereportrD   errorr   r   missingry   rz   anyr   r   	listfuncs
trackcallsr"  r   r   modulerunpy_get_module_detailsr   r%  r3   argvparentloaderr   r   rj   io	open_coder   r   r   rP   exit
SystemExitr  	no_report)r9  parsergrp_grpoptsr  trK  module_namemod_namemod_specr   globsr   rV   r,  r-  r.  s                  @@@r   mainr^  R  sQ   OOO$$&&F
I{KKK

#
#N68 8C T9\&  ' ' '
 T9\F  H H HT=E  F F F T>,7  8 8 8 
#
#K
0
0C++--DdJ|       
 	dM,G  H H H T8>  @ @ @T<2  3 3 3 T;|     T;|=  > > > T:l+  , , , 
#
#I-/ /C&x!  " " " ^HbG  H H H 
</  1 1 1

#.  0 0 0
8+=+  - - - D 8$X.. ),77# # # # # #
O O#'#5O O ODN N N N $N N NDO { Py 	;LL9:::!DIFFF$$T\4<OOO
DJHII 5 4 	5 	5 	5 ~ Q4: Q QOPPP| LDJ LJKKK}JKKKdj$*?t7Ii	5 	5 	5A; 	LLL-K','@'@'M'M$Hh(:4>:CH& ,'&o$" EE 77CH'//$-88CHQKdm,, Arwwyy$-@@A A A A A A A A A A A A A A A !M&#"	 E 	
ue$$$$ H H HSXa[[[##FGGGGGGGG    iikkG> IdlDL$-HHHHHI IsC    C T  )S	T ST S&T 
U*T==UUr   r   )__doc____all__rP  ro   r   r3   rA  r   rr   r   r   r   rL   timer   r   r   r   r   r/   r=   r   r   r   r   rn   r   r^  r&   r
   r   r   <module>rb     s  < ( %
& 				     				 



        				 



  # # # # # #    #0 0 0 0 0 0 0 0d       8m m m m m m m m^  
 
 
   .# # #L6 L6 L6 L6 L6 L6 L6 L6\PI PI PId ZDFFFFF r   