
    e\                   &   U 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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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 c m!Z" dd	l#m$Z$ dd
l#m%Z% ddl#m&Z& ddl'm(Z(m)Z) ddl'm*Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ej=        rej>        d         Z?dZ@dZAdZBg dZCdeDd<   ejE        dk    reCF                    g d           d eCD             ZG ejH        ddI                    eG          z   dz             ZJdd!ZKdd"ZLd#dd#dddd$ZMdd(ZNdd)ZOdd-ZPdd.ZQdd1ZRdd4ZSdd6ZTd7 ZUd8eDd9<    eK            sejV        ZUdd<ZW G d= d>e-          ZXejY         G d? d@ejZ                              Z[ejY         G dA dBejZ                              Z\ G dC dD          Z] G dE dF          Z^ G dG dHe^          Z_ G dI dJe^          Z` G dK dLe_          Za G dM dNe_          Zb G dO dPe^          Zc G dQ dR          Zd G dS dTed          Zeeeedjf        e;jg        <    G dU dVee          Zhehedjf        e;ji        <    G dW dXed          Zjejedjf        e;jk        <    G dY dZed          Zleledjf        e;jm        <   dd\Zndd_ZoddeZpddgZqddjZrddnZsddqZt	 dddvZu G dw dx          Zv G dy dz          Zw G d{ d|          Zxdd~ZyddZzddZ{ddZ|dS )    )annotations)Path)deque)suppress)deepcopy)fnmatchN   )build)environment)mlog)MesonVersionMismatchExceptionmajor_versions_differversion)MesonException	OptionKey
OrderedSetRealPathActionget_wine_shortpath	join_args
split_argssetup_vsenv)get_infodirload_info_file)ExternalProgram)TestProtocolTestSerialisation)TAPParser.TestTAPParser.ErrorTAPParser.VersionTAPParser.PlanTAPParser.UnknownLineTAPParser.BailoutM   c      ))r      )      )      )      )      )i  i  )i  i  zT.List[T.Tuple[int, int]]UNENCODABLE_XML_UNICHRSi   ))i i )i i )i i )i i )i i )i i )i i )i i )i	 i	 )i
 i
 )i i )i i )i i )i i )i i )i i c                V    g | ]&\  }}t          |           d t          |           'S )-)chr).0lowhighs      5/usr/lib/python3.11/site-packages/mesonbuild/mtest.py
<listcomp>r8   [   s6    ddd[c4#c((88SYY88ddd    z([ z])returnboolc                 X    t          j                                                    } | dk    S )Nwindows)platformsystemlower)platnames    r7   
is_windowsrC   _   s&      &&((Hy  r9   c                 "    t           j        dk    S )Ncygwin)sysr?    r9   r7   	is_cygwinrH   c   s    <8##r9      )FHWNaNAsstrintc                \    d}| D ]&}t          j        |          }|t          |         z  }'|S )Nr   )unicodedataeast_asian_widthUNIWIDTH_MAPPING)rP   resultcws       r7   uniwidthrZ   g   s=    F & &(++"1%%Mr9   c                     d} | t           j        v rF	 t          t           j        |                    }nL# t          $ r t	          d|  d           d}Y n+w xY w	 t          j                    }n# t          $ r d}Y nw xY w|S )NMESON_TESTTHREADSzInvalid value in z, using 1 thread.r	   )osenvironrR   
ValueErrorprintmultiprocessing	cpu_count	Exception)varnamenum_workerss     r7   determine_worker_countrf   n   s    !G"*	bj122KK 	 	 	@g@@@AAAKKK		 *355KK 	 	 	KKK	s!   2 AAA, ,A;:A;parserargparse.ArgumentParserNonec                   |                      ddt          d           |                      dddt          d	           |                      d
ddd           |                      ddddd           |                      dddd           |                      ddddd           |                      dd dt          d	           |                      ddt          d            |                      d!g d"d#d$d%&           |                      d'g d(d#d$d)&           |                      d*d+d,d-d.           |                      d/ddd0           |                      d1ddd2           |                      d3d4d56           |                      d7d8t	                      t          d9           |                      d:d;ddd<           |                      d=d>ddd?           |                      d@dAt
          d dBC           |                      dDd dEdF           |                      dGg t          dH           |                      dIdJdKL           d S )MNz	--maxfailr   zbNumber of failing tests before aborting the test run. (default: 0, to disable aborting on failure))defaulttypehelpz--repeatr	   repeatz!Number of times to run the tests.)rk   destrl   rm   z--no-rebuildF
store_truez$Do not rebuild before running tests.)rk   actionrm   z--gdbgdbzRun test under gdb.)rk   ro   rq   rm   z
--gdb-pathgdb_pathz&Path to the gdb binary (default: gdb).)rk   ro   rm   z--listlistzList available tests.z	--wrapperwrapperz)wrapper to run tests with (e.g. Valgrind)-Cwdz#directory to cd into before running)ro   rq   rm   z--suiteinclude_suitesappendSUITEz,Only run tests belonging to the given suite.)rk   ro   rq   metavarrm   z
--no-suiteexclude_suitesz.Do not run tests belonging to the given suite.z--no-stdsplitTsplitstore_falsez,Do not split stderr and stdout in test logs.z--print-errorlogsz%Whether to print failing tests' logs.z--benchmarkz Run benchmarks instead of tests.z	--logbasetestlogzBase name for log file.)rk   rm   z-jz--num-processesz#How many parallel processes to use.z-vz	--verbosez!Do not redirect stdout and stderrz-q--quietz$Produce less output to the terminal.z-tz--timeout-multiplierzDefine a multiplier for test timeout, for example  when running tests in particular conditions they might take more time to execute. (<= 0 to disable timeout))rl   rk   rm   z--setupsetupzWhich test setup to use.z--test-argsz7Arguments to pass to the specified test(s) or all testsargs*zOptional list of test names to run. "testname" to run all tests with that name, "subprojname:testname" to specifically run "testname" from "subprojname", "subprojname:" to run all tests defined by "subprojname".)nargsrm   )add_argumentrR   r   r   rf   float)rg   s    r7   add_argumentsr      s   
QSQ  R R R 
AH3@  B B B
lC  E E E
U<2  4 4 4
e*E  G G G
%f\4  6 6 6
T	
H  J J J
4B  D D D
	24DX_fK  M M M
b7GPXbiM  O O O
GMK  M M M
+U<D  F F F
u\?  A A A
Y6  8 8 8
/9O9Q9QX[B  D D D
k5@  B B B
i|C  E E E
45$K  L L L 	4g7  9 9 9
r
V  X X X
cT  U U U U Ur9   c                    | d         dk    rdnd}	 t          | |           d S # t          $ r? |                     dd                              d          } t          | |           Y d S w xY w)N
r:   endasciibackslashreplaceerrors)r`   UnicodeEncodeErrorencodedecode)rP   r   s     r7   
print_safer      s    """4CaS   HHW%7H88??HHaSs   % AA.-A.abc                "    | s|S |s| S | dz   |z   S Nr   rG   )r   r   s     r7   
join_linesr      s*      t8a<r9   dashcolsc                z    | s||z  S d| z   dz   } t          |           }||z
  dz  }||z  | z   } | |||z
  |z
  z  z   S )N rI   )rZ   )rP   r   r   widthfirsts        r7   dashesr      sa     d{a#AQKKEE\aEuqAtte|e+,,,r9   retcodec                   | dk     r8|  }	 t          j        |          j        }n# t          $ r d}Y nw xY wd| d| S | dk    rd|  S | dz
  }	 t          j        |          j        }n# t          $ r d}Y nw xY wd|  d| d| d	S )
Nr   
SIGinvalidzkilled by signal r      zexit status z(exit status z or signal ))signalSignalsnamer_   )r   signumsignames      r7   returncode_to_statusr      s     {{	#nV,,1GG 	# 	# 	#"GGG	#5655G555#~~'g'''s]F.((-   B7BBvBBBBBBs   % 44A* *A98A9c                    | S NrG   )xs    r7   <lambda>r      s    Q r9   zT.Callable[[str], str]sh_quoteenvT.Iterable[T.Tuple[str, str]]c                @    d                     d | D                       S )Nr:   c                Z    g | ](\  }}d                      |t          |                    )S )z{}={} )formatr   )r4   kvs      r7   r8   z$env_tuple_to_str.<locals>.<listcomp>   s0    DDD1HOOAx{{33DDDr9   )join)r   s    r7   env_tuple_to_strr      s#    77DDDDDEEEr9   c                      e Zd ZdS )TestExceptionN)__name__
__module____qualname__rG   r9   r7   r   r      s        Dr9   r   c                      e Zd ZdZdZdZdS )ConsoleUserr   r	   rI   N)r   r   r   LOGGERGDBSTDOUTrG   r9   r7   r   r      s#         F C FFFr9   r   c                      e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
Zedd            ZddZddZddZddZddZddZddZdS ) 
TestResultPENDINGRUNNINGOKTIMEOUT	INTERRUPTSKIPFAILEXPECTEDFAILUNEXPECTEDPASSERRORr;   rR   c                     dS )Nr*   rG   rG   r9   r7   maxlenzTestResult.maxlen  s    rr9   r<   c                6    | t           j        t           j        hv S r   )r   r   r   selfs    r7   is_okzTestResult.is_ok  s    
z'>???r9   c                x    | t           j        t           j        t           j        t           j        t           j        hv S r   )r   r   r   r   r   r   r   s    r7   is_badzTestResult.is_bad  s0    
);Z=Q"1:3CE E 	Er9   c                6    | t           j        t           j        hvS r   )r   r   r   r   s    r7   is_finishedzTestResult.is_finished  s    J.
0BCCCr9   c                6    | t           j        t           j        fv S r   )r   r   r   r   s    r7   
was_killedzTestResult.was_killed  s    
*J,@AAAr9   rP   rQ   mlog.AnsiDecoratorc                   |                                  rt          j        }nT| t          j        t          j        fv rt          j        }n-|                                 rt          j        }nt          j	        } ||          S r   )
r   r   redr   r   r   yellowr   greenblue)r   rP   	decorators      r7   colorizezTestResult.colorize  sk    ;;== 	"IIjoz'>???II 	"
II	Iy||r9   r   c                    d                     | j        |                                           }|                     |                              |          S )Nz{res:{reslen}})resreslen)r   valuer   r   get_text)r   r   
result_strs      r7   r   zTestResult.get_text(  sD    %,,DKKMM,RR
}}Z((11(;;;r9   c                F    t          |                     d                    S )Nz>>> )rQ   r   r   s    r7   get_command_markerzTestResult.get_command_marker,  s    4==(()))r9   Nr;   rR   r;   r<   )rP   rQ   r;   r   )r   r<   r;   rQ   r;   rQ   )r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   rG   r9   r7   r   r      s        GG	BGIDD!L%NE   \@ @ @ @E E E ED D D DB B B B	 	 	 	< < < <* * * * * *r9   r   c                  X   e Zd ZU  G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d	 d
ej                  Z	 G d dej                  Z
dZdZdZ ej        d          Z ej        d          Z ej        dej        z             Z ej        dej        z             Z ej        d          Z ej        d          Z ej        d          ZdZdZdZded<   dZdZdZded<   dZeZ dZ!d6d+Z"d7d/Z#d8d3Z$d9d5Z%dS ):	TAPParserc                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )	r!   rR   	num_testsr<   lateskippedT.Optional[str]explanationNr   r   r   __annotations__rG   r9   r7   PlanzTAPParser.Plan1  s9         


$$$$$$r9   r   c                      e Zd ZU ded<   dS )r#   rQ   messageNr   rG   r9   r7   BailoutzTAPParser.Bailout7           r9   r   c                  @    e Zd ZU ded<   ded<   ded<   ded<   dd
ZdS )r   rR   numberrQ   r   r   rW   r   r   r;   c                H    | j          d| j                                         S )Nr   )r   r   stripr   s    r7   __str__zTAPParser.Test.__str__@  s&    k//DI//55777r9   Nr   )r   r   r   r   r  rG   r9   r7   TestzTAPParser.Test:  sT         			$$$$	8 	8 	8 	8 	8 	8r9   r  c                      e Zd ZU ded<   dS )r   rQ   r   Nr   rG   r9   r7   ErrorzTAPParser.ErrorC  r   r9   r  c                  $    e Zd ZU ded<   ded<   dS )r"   rQ   r   rR   linenoNr   rG   r9   r7   UnknownLinezTAPParser.UnknownLineF  s"         r9   r	  c                      e Zd ZU ded<   dS )r    rR   r   Nr   rG   r9   r7   VersionzTAPParser.VersionJ  r   r9   r  r	   rI   r&   zBail out!\s*(.*)z<(?:\s*\#\s*([Ss][Kk][Ii][Pp]\S*|[Tt][Oo][Dd][Oo])\b\s*(.*))?z1\.\.([0-9]+)z'((?:not )?ok)\s*(?:([0-9]+)\s*)?([^#]*)zTAP version ([0-9]+)z
(\s+)---.*z\s+\.\.\.\s*FNzT.Optional[Plan]planr   T.Optional[int]yaml_linenor:   r)   okr<   numrR   r   rQ   	directiver   r   r;   ET.Generator[T.Union['TAPParser.Test', 'TAPParser.Error'], None, None]c              #    K   |                                 }|r|                                 nd }||                                }|                    d          r)|r&|                     ||t          j        |          V  d S nU|dk    r4|                     |||rt          j        nt          j        |          V  d S |                     d| d          V  |                     |||rt          j	        nt          j
        |          V  d S )Nr   TODOzinvalid directive "")r  upper
startswithr  r   r   r   r   r  r   r   )r   r  r  r   r  r   s         r7   
parse_testzTAPParser.parse_testc  s#     zz||-8Bk'')))d !))I##F++ E ))CzLLLLLF f$$iiT+g:+D+DPZPgituuuuujj!Cy!C!C!CDDDDDiiTB#K:==JO[YYYYYYYr9   linesT.AsyncIterator[str]T.AsyncIterator[TYPE_TAPResult]c                  K   |2 3 d {V }|                      |          D ]}|W V  %6 |                      d           D ]}|W V  d S r   
parse_line)r   r  lineevents       r7   parse_asynczTAPParser.parse_asyncu  s       	 	 	 	 	 	 	$..     __T** 	 	EKKKKK	 	s   *ioT.Iterator[str]T.Iterator[TYPE_TAPResult]c              #     K   |D ]}|                      |          E d {V  |                      d           E d {V  d S r   r  )r   r"  r  s      r7   parsezTAPParser.parse|  sf       	- 	-Dt,,,,,,,,,,??4(((((((((((r9   r  c           	   #  B  K   || xj         dz  c_         |                                }| j        | j        k    rh| j        dk    rP| j                            |          }|r4| j        | _        | j         | _        |	                    d          | _
        d S | j        | _        n| j        | j        k    rp| j                            |          r| j        | _        d S |                    | j
                  rd S |                     d| j         d          V  | j        | _        | j        | j        k    sJ |r|                    d          rd S | j                            |          }|r%| j        r1| j        j        r%| j        s|                     d          V  d| _        | xj        dz  c_        |	                    d          | j        n!t)          |	                    d                    }|| j        k    r|                     d	          V  |                     |	                    d          d
k    ||	                    d          |	                    d          |	                    d                    E d {V  | j        | _        d S | j                            |          }|r| j        r|                     d          V  nt)          |	                    d                    }|dk    }|	                    d          rq|	                    d                                                              d          r |dk    r|                     d          V  d}n|                     d          V  |                     || j        dk    ||	                    d                    | _        | j        V  d S | j                            |          }|r3|                     |	                    d                    V  d| _        d S | j                            |          }|r| j         dk    r|                     d          V  d S t)          |	                    d                    | _        | j        dk     r|                     d          V  n|                     | j                  V  d S |                     || j                   V  d S | j        | j        k    r |                     d| j         d          V  | j        s| j        r| j        | j        j        k    rw| j        | j        j        k     r/|                     d| j        j         d| j         d          V  d S |                     d| j        j         d| j         d          V  d S d S d S d S )Nr	      z+YAML block not terminated (started on line r   #zunexpected test after late planTrI   zout of order test numbersr  r&         zmore than one plan foundr   r   zinvalid SKIP directive for planzinvalid directive for plan)r   r   r   r   z(version number must be on the first linez$version number should be at least 13r   zToo few tests run (expected z, got zToo many tests run (expected )r  rstripstate_AFTER_TESTr   _RE_YAML_STARTmatch_YAMLr  groupyaml_indent_MAIN_RE_YAML_ENDr  r  _RE_TESTr  r   found_late_testr   rR   r  _RE_PLANr  r   _RE_BAILOUTr   
bailed_out_RE_VERSIONr  r	  )r   r  mr  r   r   s         r7   r  zTAPParser.parse_line  s     KK1KK;;==D zT---<2%%+11$77A %)Z
+/;(+,771::(!Z

tz))$**400 !%DJF??4#344 Fjj!btO_!b!b!bccccc!Z
:++++ 4??3// ##D))A 9 0 08L 0**%FGGGGG+/D(!#()

(:dnnAGGAJJ$.((**%@AAAAA??1771::+=s+,771::qwwqzz1771::O O O O O O O O O!-
##D))A 9 $**%?@@@@@@ #AGGAJJI'1nGwwqzz K771::++--88@@ K(1}}&*jj1R&S&S S S S&*GG"&**-I"J"JJJJ $		IT^VWEW29qwwqzz !* !S !SDI)OOO &&t,,A ll1771::....."& &&t,,A 
;!##**%OPPPPPF"1771::<"$$**%KLLLLLL,,t|,<<<<< ""45555555 zTZ''jj!btO_!b!b!bccccc? sty sT^tyGZ5Z5Z>DI$777**%pDIDW%p%p_c_m%p%p%pqqqqqqq**%qTYEX%q%q`d`n%q%q%qrrrrrrr	s s s s5Z5Zr9   )r  r<   r  rR   r   rQ   r  r   r   r   r;   r  )r  r  r;   r  )r"  r#  r;   r$  )r  r   r;   r$  )&r   r   r   T
NamedTupler   r   r  r  r	  r  r4  r.  r1  recompiler9  _RE_DIRECTIVEpatternr8  r6  r;  r/  r5  r7  r:  r  r   r  r   r  r3  r-  r   r  r!  r&  r  rG   r9   r7   r   r   0  s`        % % % % %q| % % %    !,   8 8 8 8 8q| 8 8 8           al       !,    EKE"*011KBJ^__Mrz*]-BBCCHrzD}G\\]]H"*455KRZ..N2:o..LOJ!D!!!!FI#'K''''KEGZ Z Z Z$   ) ) ) )
\s \s \s \s \s \sr9   r   c                  F    e Zd ZddZddZdd	ZddZddZddZddZ	dS )
TestLoggerr;   ri   c                    d S r   rG   r   s    r7   flushzTestLogger.flush      r9   harness'TestHarness'c                    d S r   rG   r   rH  s     r7   startzTestLogger.start  rG  r9   test	'TestRun'c                    d S r   rG   r   rH  rM  s      r7   
start_testzTestLogger.start_test  rG  r9   rP   rQ   r   r   c                    d S r   rG   )r   rH  rM  rP   r   s        r7   log_subtestzTestLogger.log_subtest  rG  r9   rW   c                    d S r   rG   )r   rH  rW   s      r7   logzTestLogger.log  rG  r9   c                
   K   d S r   rG   rK  s     r7   finishzTestLogger.finish  s      r9   c                    d S r   rG   r   s    r7   closezTestLogger.close  rG  r9   Nr;   ri   rH  rI  r;   ri   rH  rI  rM  rN  r;   ri   )
rH  rI  rM  rN  rP   rQ   r   r   r;   ri   rH  rI  rW   rN  r;   ri   )
r   r   r   rF  rL  rQ  rS  rU  rW  rY  rG   r9   r7   rD  rD    s                               r9   rD  c                       e Zd Zd
ddZddZd	S )TestFileLoggerreplacefilenamerQ   r   r;   ri   c                D    || _         t          |dd|          | _        d S )NrY   utf-8encodingr   )ra  openfile)r   ra  r   s      r7   __init__zTestFileLogger.__init__  s%     3HHH			r9   c                X    | j         r"| j                                          d | _         d S d S r   )rg  rY  r   s    r7   rY  zTestFileLogger.close  s3    9 	IOODIII	 	r9   N)r`  )ra  rQ   r   rQ   r;   ri   rZ  )r   r   r   rh  rY  rG   r9   r7   r_  r_    sF        I I I I I     r9   r_  c                      e Zd Zg dZg dZdZdZdZddZdd	Z	ddZ
ddZd dZd dZd!dZd"dZd#dZd$dZd#dZd dZdS )%ConsoleLogger)z..z:.z.:)u   🌑u   🌒u   🌓u   🌔u   🌕u   🌖u   🌗u   🌘u   ✀ u   ―u   ▶ r;   ri   c                   t                      | _        d | _        d | _        d| _        d| _        |  d| _        d| _        d| _        d| _	        	 t          j        d          \  | _        }d| _        n# t          $ r d| _        d| _        Y nw xY wt          | j        | j        | j        dz
            | _        t          d| j        | j        dz
            | _        | j        | _        | j        | _        	 | j                            t2          j        j        pd           d S # t8          $ rS t          d	d
| j        dz
            | _        t          dd
| j        dz
            | _        d| _        | j        | _        Y d S w xY w)Nr   Fr:   r	   TP   rI   r   z8<r2   z| )r   running_testsprogress_testprogress_taskmax_left_widthstopshould_erase_line
test_countstarted_testsspinner_indexr]   get_terminal_sizer   is_ttyOSErrorr   SCISSORSHLINEoutput_start
output_endRTRIsubSPINNERspinnerr   rF   stdoutre  r   ASCII_SPINNER)r   _s     r7   rh  zConsoleLogger.__init__
  s   4>LL489=	 	"!#	 /22LDIqDKK 	  	  	 DIDKKK	  #4=$*di!mLL TZQ??9|	.$$SZ%8%CGDDDDD! 	. 	. 	. &tS$)a- @ @D$Rdi!m<<DODH-DLLLL		.s%   #A3 3BB5+D" "AE?>E?c                R    | j         rt          | j         d           d| _         d S d S )Nr:   r   )rs  r`   r   s    r7   rF  zConsoleLogger.flush*  s;    ! 	($(b1111%'D"""	( 	(r9   r  rQ   c                D    t          | j        |dd           d| _        d S )Nr:   )sepr   z[K)r`   rs  )r   r  s     r7   print_progresszConsoleLogger.print_progress/  s*    d$d====!)r9   c                8    | j                                          d S r   )updatesetr   s    r7   request_updatezConsoleLogger.request_update3  s    r9   rH  rI  c                   | j         |                                  d S t          | j                  dk    r| j         d| j         }n>d                    | j        t          | j                  z
  dz   | j        | j                  }d                    || j        | j                           }| j        dz   t          | j                  z  | _        d                    dt          
                                z  t          t          j                    | j         j        z
            |j                  }| j         j        r)|d                    | j         j        |j        	          z  }|d
z  }| j                                         }|r|d|z   z  }|                    | j         d| j        ||          }|                     |           d S )Nr	   /z{}-{}/{}z[{}] {} z{spaces} {dur:{durlen}}r   )spacesdurdurlenz/{timeout:{durlen}})timeoutr  rP      T)r   rq  leftright)ro  rF  lenrn  ru  rt  r   r  rv  r   r   rR   time	starttimeduration_max_lenr  get_detailsrq  r  )r   rH  countr  r  detailsr  s          r7   emit_progresszConsoleLogger.emit_progress6  s   %JJLLLFt!""a'')==DO==EE%%d&83t?Q;R;R&RUV&V&*&8$/K KE   T5G(HII"014DL8I8II)00**,,,DIKK$"4">>??+ 1 - - % 	1*11*2/ 2 1 1 1E 	$0022 	%UW_$E~~d04-1-@#'u  6 6 	D!!!!!r9   c                b    d fd}t          j                     _        j         _        t	           j        j        dz              _         j        rVj        sQdt          t           j                            z  dz    _        t          j         |                       _        d S d S d S )Nr;   ri   c                   K   t          j                    } d}                                 j        sj                                         d {V  j                                         |                                 |k    r9d _        |                                 dz   }| 	                    |j                   j        rj        j
        t          j        urd _        j        sGj        sƉj                            d          _        j                            j                                                  j                                         d S )Ng        r	   Flast)asyncioget_running_loopr  rr  r  waitclearr  ro  call_atr   r   r   rn  popaddr  rF  )loopnext_updaterH  r   s     r7   report_progressz,ConsoleLogger.start.<locals>.report_progressW  s^     +--DK!!!i ,k&&(((((((((!!### 99;;+--)-D&"&))++/KLLd.ABBB& .*.j6HHH)-D&) ?- ! )-);)?)?U)?)K)KD&&**4+=>>>""7+++- i ,. JJLLLLLr9      r&   r'   rZ  )r  Eventr  rt  maxr   rq  rx  need_consoler  rQ   ensure_futurerp  )r   rH  r  s   `` r7   rL  zConsoleLogger.startV  s    	 	 	 	 	 	 	: moo!,	7#9B#>??	; 	Jw3 	J"#c#do*>*>&?&?"?!"CD!(!67H7H!I!ID	J 	J 	J 	Jr9   rM  rN  c                   |j         r|j        r|                                  t          |                    |t          j                    | j        |j        	                    t          j                                                   t          |j        
                                |j        z              |j        rt          | j        d           n|j        st          d           | xj        dz  c_        | j                            |           | j                            |d           |                                  d S )N)rq  r  TrF  r	   Fr  )verbosecmdlinerF  r`   r   r   colorize_consolerq  r   r   r   direct_stdoutr|  needs_parsingru  rn  r  move_to_endr  rP  s      r7   rQ  zConsoleLogger.start_test}  sA   < 		"DL 		"JJLLL'..t'<'>'>040C'+x'8'89N9P9P'Q'Q ! S S T T T $(--//$,>???! "d't44444' "D!!!!at$$$&&t%&888r9   rW   c                h   |j         s|j        j        sdS |                    t	          j                    |j                  }|j         r|S |                                }t          |          dk     r|S t          t	          j
        d                    d                    |dd                    z   S )Nr:   )stderr_onlyd   z1Listing only the last 100 lines from a long log.
r   i)r  optionsprint_errorlogsget_logr   r  r  
splitlinesr  rQ   boldr   )r   rH  rW   rU  r  s        r7   shorten_logzConsoleLogger.shorten_log  s    ~ 	go&E 	2nnT244)/)=  ? ?> 	J  u::Jty!UVVWWZ^ZcZcdijnjojodpZqZqqqr9   c                z   |j         sb|j        }|s0t          |j                                        |j        z              d S t          |j                                        |z              |                     ||          }|r9t          | j                   t          |           t          | j	                   d S d S r   )
r  r  r`   r   r   stdor  r|  r   r}  )r   rH  rW   r  rU  s        r7   	print_logzConsoleLogger.print_log  s    ~ 	=nG fj3355CDDD&*//11G;<<<w// 	#$#$$$sOOO$/"""""	# 	#r9   rP   r   c                ~   |j         s |j        j        r|                                r|                                  t          |                    |t          j                    | j	        | j
        ||                    t          j                                        d           |                                  d S d S d S )N)rq  prefixmiddler  Tr  )r  r  r  r   rF  r`   r   r   r  rq  r  r   r  )r   rH  rM  rP   rW   s        r7   rS  zConsoleLogger.log_subtest  s    < 	"GO; 	" 	"JJLLL'..t'<'>'>tOb(,()'-t7L7N7N'O'O ! Q Q Y]^ ^ ^ ^
 !!!!!	" 	" 	" 	"r9   c                   | j                             |           |j        t          j        u rF|j        s|j        j        r3|                                  t          |j
         d|j         d           |j        j        r|j                                        sW|                                  |j        rW|j        rPt          | j                   t          |                    |t%          j                    | j                             nst          |                    |t%          j                    | j                  d           |j        s|j                                        r|                     ||           |j        r;t          d           |j        D ]}t          |d           t          d           |j        s|j                                        rt          d           |                                  d S )Nz time out (After z	 seconds))rq  Tr  )rn  remover   r   r   r  r  r  rF  r`   r   r  quietr   r  r  r}  r   r   r  rq  r   r  warningsr  )r   rH  rW   rY   s       r7   rU  zConsoleLogger.log  s   !!&))):++++181P ,JJLLLV[LL6>LLLMMM$ 	"FJ,<,<,>,> 	"JJLLL~ 4&"6 4do&&&gnnVT-B-D-DUYUhniijjjjgnnVT-B-D-DUYUhnii " " " "> 4VZ%6%6%8%8 4NN7F333 "D!!!! ) )A!4(((((D!!!!~ "!2!2!4!4 "D!!!!r9   c                  K   d| _         |                                  | j        r| j         d {V  |j        rv|j        j        s|j        j        r^t          d           t          |j        d          D ]9\  }}t          |	                    |t          j                                         :t          |                                           d S )NTz
Summary of Failures:
r	   )rr  r  rp  collected_failuresr  r  r  r`   	enumerater   r   r  summaryr   rH  irW   s       r7   rW  zConsoleLogger.finish  s      	 	%$$$$$$$$% 	G0	G4;O4K	G,---&w'A1EE G G	6gnnVT-B-D-DEEFFFFgoo     r9   NrZ  )r  rQ   r;   ri   r[  r\  )rH  rI  rW   rN  r;   rQ   r]  )
rH  rI  rM  rN  rP   rQ   rW   r   r;   ri   )r   r   r   r  r  rz  r{  r~  rh  rF  r  r  r  rL  rQ  r  r  rS  rU  rW  rG   r9   r7   rk  rk    s?       &&&MG G GG HED. . . .@( ( ( (
* * * *   " " " "@%J %J %J %JN   "r r r r# # # #" " " "   6! ! ! ! ! !r9   rk  c                  &    e Zd ZddZddZdd	Zd
S )TextLogfileBuilderrH  rI  r;   ri   c                0   | j                             dt          j                                                                         d           t          t          j                                                  }| j                             d| d           d S )NzLog of Meson test suite run on 

zInherited environment: )	rg  writedatetimenow	isoformatr   r]   r^   items)r   rH  inherit_envs      r7   rL  zTextLogfileBuilder.start  s~    	c(:K:O:O:Q:Q:[:[:]:]cccddd&rz'7'7'9'9::	C+CCCDDDDDr9   rW   rN  c                .   |j          d|j         }| j                            t	          |dd          dz              | j                            d|j        z   dz              t          j        dt          j        |j	                            }| j                            d|z   dz              | j                            dd	|j
        z  z   dz              | j                            d
|                                z   dz              |j        r%| j                            d|j        z   dz              |j        r[|j        j        rdnd}| j                            t	          |dd          dz              | j                            |j                   |j        rK| j                            t	          ddd          dz              | j                            |j                   | j                            t	          ddd          dz              d S )Nr  =N   r   ztest:         z%H:%M:%Szstart time:   zduration:     z%.2fszresult:       zcommand:      r  outputr2   stderrr:   r  )r  rt  rg  r  r   r   r  strftimegmtimer  durationget_exit_statusr  r  r  r}   stde)r   rH  rW   titlestarttime_strr   s         r7   rU  zTextLogfileBuilder.log  s   :44 244	uc2..5666	(6;6=>>>j$+f>N2O2OPP	(=84?@@@	(7V_+DDtKLLL	(6+A+A+C+CCdJKKK> 	FIOO,v~=DEEE; 	)&4B88(DIOOF4b11D8999IOOFK(((; 	)IOOF8S"55<===IOOFK(((	r3++f455555r9   c                j  K   |j         rf| j                            d           t          |j         d          D ]6\  }}| j                            |                    |d          dz              7| j                            |                                           t          d| j                    d S )Nz
Summary of Failures:

r	   Fr   zFull log written to )r  rg  r  r  r   r  r`   ra  r  s       r7   rW  zTextLogfileBuilder.finish  s      % 	FIOO8999&w'A1EE F F	6	vu = = DEEEE	))***4T]4455555r9   Nr[  r]  )r   r   r   rL  rU  rW  rG   r9   r7   r  r    sT        E E E E
6 6 6 6&6 6 6 6 6 6r9   r  c                      e Zd Zd	dZdS )
JsonLogfileBuilderrH  rI  rW   rN  r;   ri   c           	         |j         |j        |j        j        |j        |j        |j        |j        |j        d}|j	        r
|j	        |d<   | j
                            t          j        |          dz              d S )N)r   r  rW   r  r  
returncoder   commandr  r   )r   r  r   r   r  r  r  r   cmdr  rg  r  jsondumps)r   rH  rW   jresults       r7   rU  zJsonLogfileBuilder.log  s|    Kkj&) +:z	'
 	'
 ; 	, &GH	
7++d233333r9   Nr]  )r   r   r   rU  rG   r9   r7   r  r    s(        4 4 4 4 4 4r9   r  c                  *    e Zd ZdZddZddZddZdS )JunitBuildera  Builder for Junit test results.

    Junit is impossible to stream out, it requires attributes counting the
    total number of tests, failures, skips, and errors in the root element
    and in each test suite. As such, we use a builder class to track each
    test case, and calculate all metadata before writing it out.

    For tests with multiple results (like from a TAP test), we record the
    test as a suite with the project_name.test_name. This allows us to track
    each result separately. For tests with only one result (such as exit-code
    tests) we record each one into a suite with the name project_name. The use
    of the project_name allows us to sort subproject tests separately from
    the root project.
    ra  rQ   r;   ri   c                \    || _         t          j        dddd          | _        i | _        d S )N
testsuites0testsr   failures)ra  etElementrootsuites)r   ra  s     r7   rh  zJunitBuilder.__init__$  s5     JC#? ? ?	/1r9   rH  rI  rM  rN  c                   |j         |j                             d          D ]}d                    |j        |j        |j        d                   |j        d<   |                    d          D ]
}|j        d= |                    d          D ]
}|j        d= |                    d	          D ]
}|j        d
= |                    d          D ]
}|j        d= | j                            |           dS |j        r|j         d|j         }|| j	        vs|j
        j        dk    s
J d            t          j        d|t          t          |j                            t          t!          d |j        D                                 t          t!          d |j        D                                 t          t!          d |j        D                                 t          |j                            x}| j	        |<   |j        D ]X}t          j        |dt          |          |          }|j        t(          j        u rt          j        |d           n|j        t(          j        u rt          j        |d           n|j        t(          j        u rt          j        |d           n|j        t(          j        u rt          j        |d          }d|_        n_|j        t(          j        u rt          j        |d          }d|_        n/|j        t(          j        u rt          j        |d          }d|_        |j        r|j        t          j        |d          _        Z|j        r@t          j        |d          }	t=          |j                                                  |	_        |j         rBt          j        |d          }
t=          |j                                                   |
_        dS dS |j        | j	        vrBt          j        d|j        dd d d t          |j                            x}| j	        |j        <   nD| j	        |j                 }t          tC          |j        d!                   dz             |j        d!<   t          j        |d|j        |j        t          |j                  "          }|j"        t(          j        u rHt          j        |d           t          tC          |j        d                   dz             |j        d<   n|j"        t(          j        u rHt          j        |d           t          tC          |j        d#                   dz             |j        d#<   nZ|j"        t(          j        u rGt          j        |d           t          tC          |j        d$                   dz             |j        d$<   |j        r@t          j        |d          }	t=          |j                                                  |	_        |j         rBt          j        |d          }
t=          |j                                                   |
_        dS dS )%zLog a single test case.Nz.//testsuitez{}.{}.{}r   z.//testcase[@result]rW   z.//testcase[@timestamp]	timestampz.//testcase[@file]rg  z.//testcase[@line]r  .r	   zduplicate suite	testsuitec              3  X   K   | ]%}|j         t          j        t          j        hv !d V  &dS r	   N)rW   r   r   r   r4   rs     r7   	<genexpr>z#JunitBuilder.log.<locals>.<genexpr>H  sX       I IQ!( * 4j6FG;H ;Hq ;H ;H ;H ;H I Ir9   c              3  n   K   | ]0}|j         t          j        t          j        t          j        hv ,d V  1dS r  )rW   r   r   r   r   r  s     r7   r  z#JunitBuilder.log.<locals>.<genexpr>J  s\       !c !cqAH",/:3LjN`!a=b =b =b =b =b =b !c !cr9   c              3  @   K   | ]}|j         t          j        u d V  dS r  rW   r   r   r  s     r7   r  z#JunitBuilder.log.<locals>.<genexpr>L  s0      WWa18z;V;V;V;V;V;VWWr9   )r   r  r   r  r   r  testcase)r   	classnamer   errorfailurezTest unexpected passed.zTest was interrupted by user.z.Test did not finish before configured timeout.z
system-outz
system-err1r  r  )r   r  r  r   r  )#junitfindallr   projectr   attribr  ry   resultsr  r  rn   r  r  rQ   r  sumr  
SubElementrW   r   r   r   r   r   textr   r   r   r  replace_unencodable_xml_charsr,  r  rR   r   )r   rH  rM  suitecase	suitenamesubtestr  failouterrs              r7   rU  zJunitBuilder.log*  sD   :!++N;; ( ('1'8'8tyRWR^_eRf'g'gV$ "MM*@AA . .DH--!MM*CDD 1 1DK00!MM*>?? , ,DF++!MM*>?? , ,DF++	  ''''F
 < D	M<55$)55IDK//7?3IA3M3M3MO`3M3M3M-/Z#dl++,,3 I I$, I I I I I J JS !c !cDL !c !c !c c c d dCWW4<WWWWWXX''
. 
. 
. 
EDK	*  < U U =
WYbccc>Z_44M(I6666^z'777M(G4444^z66M(I6666^z'@@@=9==D 9DII^z';;;=7;;D ?DII^z'999=7;;D PDI& UAHATBM(L99>y MmE<8889I9I9K9KLLy MmE<8889I9I9K9KLLM M |4;..46Jdl#c #C4F4F5H 5H 5H HDL11 DL1(+CW0E,F,F,J(K(KW%}UJTY/3|#dmBTBTV V VHx:?**h	222*-c%,y2I.J.JQ.N*O*OY''Z---h000),Sh1G-H-H1-L)M)MX&&Z_,,h	222+.s5<
3K/L/Lq/P+Q+QZ(y MmHl;;89I9I9K9KLLy MmHl;;89I9I9K9KLLM Mr9   c           	       K   | j                                         D ]u}| j                            |           dD ]V}t	          t          | j        j        |                   t          |j        |                   z             | j        j        |<   Wvt          j        | j                  }t          | j
        d          5 }|                    |dd           ddd           dS # 1 swxY w Y   dS )z9Calculate total test counts and write out the xml result.r  wbrc  T)re  xml_declarationN)r  valuesr  ry   rQ   rR   r  r  ElementTreerf  ra  r  )r   rH  r  attrtreefs         r7   rW  zJunitBuilder.finish  sD     ['')) 	d 	dEIU###7 d d),S1A$1G-H-H3u|\`OaKbKb-b)c)c	 &&d ~di(($-&& 	B!JJq7DJAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs    C&&C*-C*N)ra  rQ   r;   ri   r\  r[  )r   r   r   __doc__rh  rU  rW  rG   r9   r7   r  r    si         2 2 2 2ZM ZM ZM ZMx
B 
B 
B 
B 
B 
Br9   r  c                       e Zd ZU dZi Zded<   d. fd
Zd/dZd0dZe	d1d            Z
e	d2d            Zd3dZd3dZd3dZd4dZe	d5d!            Zd4d"Zd4d#Zd6d7d'Ze	d2d(            Zd8d-Z xZS )9TestRunr   z'T.Dict[TestProtocol, T.Type['TestRun']]PROTOCOL_TO_CLASSrM  r   r   T.Anykwargsr;   c                p    t                                          t          j        |j                           S r   )super__new__r*  r+  protocol)clsrM  r   r-  	__class__s       r7   r0  zTestRun.__new__  s#    www8GHHHr9   test_envT.Dict[str, str]r   rQ   r  r  is_parallelr<   r  c                F   t           j        | _        || _        d | _        || _        || _        g | _        d | _        d | _	        d | _
        d| _        d| _        d| _        d | _        || _        |j        | _        |j        | _        d | _        || _        || _        g | _        d S Nr:   )r   r   r   rM  _numr   r  r  r  r  r  r  r  additional_errorr  r   should_failproject_namer  r  r6  r  r  )r   rM  r4  r   r  r6  r  s          r7   rh  zTestRun.__init__  s    %	%)		/1+/,0+/		 ",0+(15
&%'r9   r  T.List[str]ri   c                f    t           j        | _        t          j                    | _        || _        d S r   )r   r   r   r  r  r  )r   r  s     r7   rL  zTestRun.start  s$    %r9   rR   c                j    | j         &t          xj        dz  c_        t          j        | _         | j         S Nr	   )r9  r*  TEST_NUMr   s    r7   r  zTestRun.num  s0    9!(DIyr9   c                0    | j         o| j         o| j         S r   )r  r6  r  r   s    r7   r  zTestRun.direct_stdout  s     |OD$4 4OT=O9OOr9   c                    | j         rOt          d | j         D                       }t          d | j         D                       }||k    r| dS | d| dS dS )Nc              3  H   K   | ]}|j                                         V  d S r   )rW   r   r4   r   s     r7   r  z&TestRun.get_results.<locals>.<genexpr>  s.      @@a))@@@@@@r9   c              3  <   K   | ]}|j         t          j        uV  d S r   r
  rE  s     r7   r  z&TestRun.get_results.<locals>.<genexpr>  s+      LL!ahjo5LLLLLLr9   z subtests passedr  r:   )r  r  )r   passedrans      r7   get_resultszTestRun.get_results  s|    < 	9@@4<@@@@@FLLt|LLLLLC}} 2222 8838888rr9   c                *    t          | j                  S r   )r   r  r   s    r7   r  zTestRun.get_exit_status  s    #DO444r9   c                    | j         t          j        u rdS | j        r|                                 S |                                 S r8  )r   r   r   r  r  rI  r   s    r7   r  zTestRun.get_details  sE    8z)))2? 	*'')))!!!r9   c                :   | j         t          j        k    rt          j        | _         t	          | j         t                    sJ | j        rO| j         t          j        t          j        fv r0| j         t          j        u rt          j        nt          j        | _         | j	        r*| j	        
                    d          s| xj	        dz  c_	        | j        r*| j        
                    d          s| xj        dz  c_        t          j                    | j        z
  | _        d S r   )r   r   r   r   
isinstancer;  r   r   r   r  endswithr  r  r  r  r   s    r7   	_completezTestRun._complete  s    8z)))!}DH$(J///// 	kZ]JO,L L L48H
4M4Mz00S]SjDH9 	TY//55 	IIII9 	TY//55 	IIII	dn4r9   r   c                    | j         sd S t          | j                                                  t          t          j                                                  z
  }t          |          d                    d | j         D                       z   S )Nr   c              3  4   K   | ]}t          |          V  d S r   )r   rE  s     r7   r  z"TestRun.cmdline.<locals>.<genexpr>  s(      33QXa[[333333r9   )r  r  r   r  r]   r^   r   r   )r   test_only_envs     r7   r  zTestRun.cmdline  sz    x 	4DHNN,,--BJ4D4D4F4F0G0GG..HH33$(333334 	4r9   c                    t          j                     | _        t          | _        t          j        | _        |                                  d S r   )r  r  GNU_SKIP_RETURNCODEr  r   r   r   rO  r   s    r7   complete_skipzTestRun.complete_skip  s5    -?r9   c                .    |                                   d S r   )rO  r   s    r7   completezTestRun.complete  s    r9   Fr   r  c                   |rdn| j         }| j        s| j        rd}|rE|t          j        d                              |          dz   z  }||z  }|dd          dk    r|dz  }|t          j        d                              |          dz   z  }|t          | j        | j                  z  }n|}|r|dd          dk    r|dz  }|S )Nr:   zstdout:r   r   zstderr:)r  r  r:  r   cyanr   r   )r   r   r  r  r   s        r7   r  zTestRun.get_log  s     /rrdi9 
	- 
	C  ty++44X>>EEtrss8t##4KC49Y''00::TAAC:di)>???CCC 	3rss8t##4KC
r9   c                    dS )NFrG   r   s    r7   r  zTestRun.needs_parsing  s    ur9   rH  rI  r  r  c                    K   |2 3 d {V }6 d S r   rG   )r   rH  r  ls       r7   r&  zTestRun.parse  s:       	 	 	 	 	 	 	! uus   )rM  r   r   r,  r-  r,  r;   r,  )rM  r   r4  r5  r   rQ   r  r  r6  r<   r  r<   )r  r=  r;   ri   r   r   r   rZ  r;   r   )FF)r   r<   r  r<   r;   rQ   rH  rI  r  r  r;   ri   )r   r   r   rA  r+  r   r0  rh  rL  propertyr  r  rI  r  r  rO  r  rU  rW  r  r  r&  __classcell__r3  s   @r7   r*  r*    s        HACCCCCI I I I I I( ( ( (.   
    X P P P XP	 	 	 	5 5 5 5" " " "
5 
5 
5 
5 4 4 4 X4          "    X       r9   r*  c                        e Zd Zd fdZ xZS )TestRunExitCoder;   ri   c                ^   | j         t          j        k    rnu| j        t          k    rt          j        | _         nS| j        t          k    rt          j        | _         n1t          | j                  rt          j	        nt          j
        | _         t                                                       d S r   )r   r   r   r  rT  r   GNU_ERROR_RETURNCODEr   r<   r   r   r/  rW  r   r3  s    r7   rW  zTestRunExitCode.complete  s    8z)))_ 333!DHH_ 444!'DHH*.t*?*?RzZ]DHr9   rZ  r   r   r   rW  r`  ra  s   @r7   rc  rc    s=        	 	 	 	 	 	 	 	 	 	r9   rc  c                        e Zd Zd fdZ xZS )TestRunGTestr;   ri   c                   | j         j         d}| j         j        r*t          j                            | j         j        |          }	 t          |ddd          5 }t          j        |          | _	        d d d            n# 1 swxY w Y   nA# t          $ r Y n5t          j        $ r$}t          j        d| d|           Y d }~nd }~ww xY wt                                                       d S )N.xmlr  utf8r`  rd  zUnable to parse : )rM  r   workdirr]   pathr   rf  r  r&  r  FileNotFoundError
ParseErrorr   r  r/  rW  )r   ra  r'  er3  s       r7   rW  zTestRunGTest.complete  sC   in***9 	Aw||DI$5x@@H
	=hfYGGG )1Xa[[
) ) ) ) ) ) ) ) ) ) ) ) ) ) )  	 	 	 D} 	= 	= 	=J;(;;a;;<<<<<<<<	= 	sB   B B5B BB B	B 
CC'CCrZ  rg  ra  s   @r7   ri  ri    s=                 r9   ri  c                  @     e Zd Zedd            Zd fdZdd
Z xZS )
TestRunTAPr;   r<   c                    dS NTrG   r   s    r7   r  zTestRunTAP.needs_parsing5      tr9   ri   c                    | j         dk    rQ| j                                        s8t          j        | _        | j        pd| _        | xj        d| j          dz  c_        t                                                       d S )Nr   r:   z'
(test program exited with status code r   )r  r   r   r   r   r  r/  rW  rf  s    r7   rW  zTestRunTAP.complete9  st    ?a(;(;(=(=!'DH	RDIIIVDOVVVVIIr9   rH  rI  r  r  c           	       K   d }g }d}t                                          |          2 3 d {V }t          |t           j                  r|j        })t          |t           j                  r)t          j        }|                    | |j	        |           lt          |t           j
                  rk| j                            |           |j                                        rt          j        }|                    | |j        p	d|j         |j                   t          |t           j                  r|                    |           "t          |t           j                  r$| xj        d|j	        z   z  c_        t          j        }b6 |rt+          t-          j        d                    }t1          t+          t3          d |D                                           }|D ]1}	| j                            d|	j        | d| d|	j	                    2|dk    r| j                            d	           n<| j                            t+          t-          j        d
                    dz              t;          d | j        D                       rt          j        }|r| j        t          j         k    r|| _        d S d S d S )Nr)   zsubtest zTAP parsing error: UNKNOWNc              3  $   K   | ]}|j         V  d S r   )r  )r4   r  s     r7   r  z#TestRunTAP.parse.<locals>.<genexpr>X  s$      ;;Q;;;;;;r9   zstdout: rm  r(  zUnknown TAP output lines have been ignored. Please open a feature request to
implement them, or prefix them with a # if they are not TAP syntax.r   z: Unknown TAP output lines for a supported TAP version.
This is probably a bug in the test; if they are not TAP syntax, prefix them with a #c              3  <   K   | ]}|j         t          j        u V  d S r   r
  r4   ts     r7   r  z#TestRunTAP.parse.<locals>.<genexpr>a  +      AAqqx:?*AAAAAAr9   )!r   r!  rM  r  r   r   r   r   rS  r   r  r  ry   rW   r   r   r   r   r	  r  r:  rQ   r   r   r  r  r  r  r   allr   r   r   )
r   rH  r  r   r  r   r  unknownr   rY   s
             r7   r&  zTestRunTAP.parse@  s     24 {{..u55 	' 	' 	' 	' 	' 	' 	'!!Y.// ')Ay011 ' &##D!)S9999Ay~.. 	'##A&&&8??$$ *$/C##D!&*I4Iqx4I4I18TTTTAy455 '""""Ay// '%%)>)JJ%% & 6"  
	}$+i0011GC;;(;;;;;<<==E \ \$$%Z%%Z%Z%ZG%Z%Zqy%Z%Z[[[[||$$ &k l l l l $$S'):):%;%; ?| &| } } }AADLAAAAA 	"/C 	48z111DHHH	 	11s   Fr   rZ  r^  )r   r   r   r_  r  rW  r&  r`  ra  s   @r7   rt  rt  4  so           X     & & & & & & & &r9   rt  c                  .    e Zd Zedd            Zdd	Zd
S )TestRunRustr;   r<   c                    dS rv  rG   r   s    r7   r  zTestRunRust.needs_parsingl  rw  r9   rH  rI  r  r  ri   c                  K   dd}d	}|2 3 d {V }|                     d
          r|                     d          s|                                                    d          \  }}}}|                    dd          } ||||          }	| j                            |	           |                    | ||	j                   |d	z  }6 d }
t          d | j        D                       rt          j
        }
nUt          d | j        D                       rt          j        }
n*t          d | j        D                       rt          j        }
|
r| j        t          j        k    r|
| _        d S d S d S )NnrR   r   rQ   rW   r;   r   c                d   |dk    r't                               | |t          j        d           S |dk    r't                               | |t          j        d           S |dk    r't                               | |t          j        d           S t                               | |t          j        d|           S )Nr  ignoredFAILEDz#Unsupported output from rust test: )r   r  r   r   r   r   r   )r  r   rW   s      r7   	parse_resz$TestRunRust.parse.<locals>.parse_resq  s    ~~ ~~az}dCCC9$$ ~~azEEE8## ~~azEEE>>!T:+;"P"P"PR R Rr9   r	   ztest ztest resultr   z::r  c              3  <   K   | ]}|j         t          j        u V  d S r   r
  r}  s     r7   r  z$TestRunRust.parse.<locals>.<genexpr>  r  r9   c              3  <   K   | ]}|j         t          j        u V  d S r   )rW   r   r   r}  s     r7   r  z$TestRunRust.parse.<locals>.<genexpr>  s,      DD!Z--DDDDDDr9   c              3  <   K   | ]}|j         t          j        u V  d S r   )rW   r   r   r}  s     r7   r  z$TestRunRust.parse.<locals>.<genexpr>  s+      CCZ_,CCCCCCr9   )r  rR   r   rQ   rW   rQ   r;   r   )r  r,  r}   r`  r  ry   rS  rW   r  r   r   anyr   r   r   r   )r   rH  r  r  r  r  r  r   rW   r~  r   s              r7   r&  zTestRunRust.parsep  s     	R 	R 	R 	R  	 	 	 	 	 	 	$w'' 0N0N %)[[]]%8%8%=%="4F||D#..Iav..##A&&&##D$999Q   AADLAAAAA 	"/CCDDt|DDDDD 	""CCCCdlCCCCC 	"/C 	48z111DHHH	 	11s   CNr   r^  )r   r   r   r_  r  r&  rG   r9   r7   r  r  k  sF           X           r9   r  original_strc                >    d }t                               ||           S )Nc                T    t          |                                           dd         S )Nr	   r   )reprr2  )illegal_chrs    r7   r   z/replace_unencodable_xml_chars.<locals>.<lambda>  s#    T+2C2C2E2E-F-Fqt-L r9   )UNENCODABLE_XML_CHRS_REr  )r  replacement_lambdas     r7   r  r    s%     ML"&&'9<HHHr9   streamT.Union[None, bytes]c                    | dS 	 |                      d          S # t          $ r |                      dd          cY S w xY w)Nr:   rc  z
iso-8859-1ignorer   )r   UnicodeDecodeError)r  s    r7   r   r     sZ    ~r<}}W%%% < < <}}\(};;;;;<s    !??readerasyncio.StreamReaderqueue,T.Optional['asyncio.Queue[T.Optional[str]]']console_modec                L  K   g }	 |                                  s	 |                     d           d {V }nZ# t          j        $ r}|j        }Y d }~n?d }~wt          j        $ r*}|                     |j                   d {V }Y d }~nd }~ww xY w|rat          |          }|	                    |           |t          j        u rt          |dd           |r|                    |           d {V  |                                  d                    |          |r|                    d            d {V  S S # t          j        $ r6 d                    |          cY |r|                    d            d {V  S S w xY w# |r|                    d            d {V  w w xY w)N   
r:   T)r   rF  )at_eof	readuntilr  IncompleteReadErrorpartialLimitOverrunErrorreadexactlyconsumedr   ry   r   r   r`   putr   CancelledError)r  r  r  
stdo_lines
line_bytesrr  r  s          r7   read_decoder    s<      J"--// 	*B#)#3#3E#:#:::::::

. ' ' 'Y





, B B B#)#5#5aj#A#AAAAAAA





B *j))!!$''';#555$Bd3333 *))D//))))))) --// 	* wwz""  	"))D//!!!!!!!!	" ! # # #wwz"""" 	"))D//!!!!!!!!	"#  	"))D//!!!!!!!!	"s\   D; 7 D; BAD; B$ B	D; 	BBD; ;$F F ?F  F  F#fnamec                f    |                      d          ot                      pt                       S )Nz.exe)rN  rC   rH   )r  s    r7   run_with_monor    s)    >>&!!G:<<+F9;;&GGr9   objsT.List[TestSerialisation]c                j   t          | t                    st          dt                    | D ]}t          |t                    st          dt                    t          |d          st          dt                    t          |j        t                    rt          |j        t                    | S )Nz	<unknown>r   )rM  rt   r   coredata_versionr   hasattrr   r   )r  objs     r7   check_testdatar    s    dD!! K+K9IJJJ O O#011 	O/=MNNNsI&& 	O/=MNNN .>?? 	O/=MNNN	OKr9   q 'asyncio.Queue[T.Optional[str]]'r  c               x   K   	 |                                   d {V }|                                  |d S |W V  8r   )get	task_done)r  items     r7   
queue_iterr    sK      UUWW}}}}}}	<E



r9   futureasyncio.Futurec                H   K   	 |  d{V  dS # t           j        $ r Y dS w xY w)z?Wait for completion of the given future, ignoring cancellation.N)r  r  )r  s    r7   rW  rW    sE      !   s    !!futuresT.Iterable[asyncio.Future]r  T.Optional[T.Union[int, float]]c                H  K   d	d}t          j                    }|dn|                                |z   }| r`||dk    rXt          j        | |t           j                   d{V \  }}  ||           |r||                                z
  }| r|R|dk    X ||            dS )
a9  Wait for completion of all the given futures, ignoring cancellation.
       If timeout is not None, raise an asyncio.TimeoutError after the given
       time has passed.  asyncio.TimeoutError is only raised if some futures
       have not completed and none have raised exceptions, even if timeout
       is zero.r  r  r;   ri   c                    d}| D ]A}|                                 sd}|                                s|                                 B|rt          j        d S NFT)done	cancelledrW   r  TimeoutError)r  r  r'  s      r7   check_futuresz#complete_all.<locals>.check_futures  sf     	 	A6688 [[]] 


 	'&&	' 	'r9   Nr   )r  return_when)r  r  r;   ri   )r  r  r  r  FIRST_EXCEPTION)r  r  r  r  deadliner  s         r7   complete_allr    s      	' 	' 	' 	' #%%DttDIIKK',AH
 -w'A++%l7G7>7NP P P P P P P P Pgd 	-,G  -w'A++ M'r9   c                  :    e Zd Z	 ddd	ZddZddZddZddZdS )TestSubprocessNpasyncio.subprocess.Processr  r  r  postwait_fnT.Callable[[], None]c                v    || _         || _        || _        d | _        d | _        || _        g | _        d | _        d S r   )_processr  r  	stdo_task	stde_taskr  all_futuresr  )r   r  r  r  r  s        r7   rh  zTestSubprocess.__init__  sB     9=9=&35AE


r9   r;   r  c                Z    t          j                    | _        t          | j                  S r   )r  Queuer  r  r   s    r7   stdout_lineszTestSubprocess.stdout_lines  s    ]__
$*%%%r9   rM  rN  r  r   CT.Tuple[T.Optional[T.Awaitable[str]], T.Optional[T.Awaitable[str]]]c                    d fd	}dd
} j         V j        O || j        j        |          }t          j        |           _          j                             j                     j        i j        t          j        j	        k    rO || j        j        |          }t          j        |           _
         j                             j
                    j          j
        fS )NrM  rN  r  r  r  r   r;   ri   c                N   K   t          |j        |           d {V | _        d S r   )r  r  r  )rM  r  r  r   s      r7   collect_stdoz0TestSubprocess.communicate.<locals>.collect_stdo  s4       *&$*lKKKKKKKKDIIIr9   c                B   K   t          |d |           d {V | _        d S r   )r  r  )rM  r  r  s      r7   collect_stdez0TestSubprocess.communicate.<locals>.collect_stde  s1       *&$EEEEEEEEDIIIr9   )rM  rN  r  r  r  r   r;   ri   )r  r  r  r  r  r  ry   r  
subprocessr   r  )r   rM  r  r  r  decode_coros   `     r7   communicatezTestSubprocess.communicate  s    	L 	L 	L 	L 	L 	L
	F 	F 	F 	F >!dk&=&,tT]-A<PPK$2;??DN##DN333;"t{g6H6O'O'O&,tT]-A<PPK$2;??DN##DN333~t~--r9   r   c           	     4  K   | j         }	 t                      r,t          j        ddddt	          |j                  g           nt          j        |j        t          j	                   t          t          j                  5  t          j        |                                d           d {V  d d d            n# 1 swxY w Y   |j        E	 | j        r| j                                         | j        r| j                                         d S d S t          j        |j        t          j                   t          t          j                  5  t          j        |                                d           d {V  d d d            n# 1 swxY w Y   |j        E	 | j        r| j                                         | j        r| j                                         d S d S |                                 t          t          j                  5  t          j        |                                d           d {V  d d d            n# 1 swxY w Y   |j        E	 | j        r| j                                         | j        r| j                                         d S d S 	 | j        r| j                                         | j        r| j                                         dS dS # t*          $ r` |                                 d {V  Y | j        r| j                                         | j        r| j                                         d S d S w xY w# | j        r| j                                         | j        r| j                                         w w xY w)	Ntaskkillz/Fz/Tz/PIDg      ?r  r	   z!Test process could not be killed.)r  rC   r  runrQ   pidr]   killpgr   SIGTERMr   r  r  wait_forr  r  r  cancelr  SIGKILLkillProcessLookupError)r   r  s     r7   _killzTestSubprocess._kill,  s      M)	(|| 1
D$AE

KLLLL 	!%000 g233 B B!*16688SAAAAAAAAAAB B B B B B B B B B B B B B B<+2 ~ (%%'''~ (%%'''''( (3 	!%000'.// < <&qvvxx;;;;;;;;;;< < < < < < < < < < < < < < <|'$ ~ (%%'''~ (%%'''''( ( FFHHH'.// < <&qvvxx;;;;;;;;;;< < < < < < < < < < < < < < <|' ~ (%%'''~ (%%'''''( ( 7 ~ (%%'''~ (%%'''''( ( " 	 	 	 &&((NNNNNNN~ (%%'''~ (%%'''''( (	 ~ (%%'''~ (%%''''(s   A7K' /B=1K' =CK' C
K' =K' /F K' FK' F
K' #-K' /I?K' IK' I
K' '$MM MM ANri   c                  K   | j         }| j                            t          j        |                                                     	 t          | j        |j                   d {V  n# t          j        $ r> |xj	        | 
                                 d {V pdz  c_	        t          j        |_        Y nOt          j        $ r> |xj	        | 
                                 d {V pdz  c_	        t          j        |_        Y nw xY w| j        r|                                  n!# | j        r|                                  w w xY w|j        pd|_        d S )Nr  r:   r   )r  r  ry   r  r  r  r  r  r  r:  r  r   r   r   r  r   r  r  )r   rM  r  s      r7   r  zTestSubprocess.wait\  s}     M 5affhh ? ?@@@	#t/FFFFFFFFFFF# 	* 	* 	*!!4::<<%7%7%7%7%7%7%=2=!!!)DHHH% 	, 	, 	,!!4::<<%7%7%7%7%7%7%=2=!!!+DHHH	,
  #  """  #  """"# ,+!s8   	!A+ *D" +A
D5D" 7A	D D" DD" "E r   )r  r  r  r  r  r  r  r  )r;   r  )rM  rN  r  r   r;   r  r]  )rM  rN  r;   ri   )r   r   r   rh  r  r  r  r  rG   r9   r7   r  r     s         6:
F 
F 
F 
F 
F& & & &. . . .6.( .( .( .(`, , , , , ,r9   r  c                      e Zd Zd#d	Zd$dZd$dZed%d            Zed&d            Zed'd            Z	d(dZ
d)dZd*d!Zd"S )+SingleTestRunnerrM  r   r   r5  r   rQ   r  argparse.Namespacec           	     :   || _         || _        |                                 | _        | j        r| j         j        rt
          j                            | j         j        dgz             |d         z   |d<   g }| j        D ]}|                    |           t
          j	        
                    |                              d          r^t          |d | j         j        D             |                    dd                              d          z   | j         j                  |d<    nd|vs|d         s,|j        s%t#          t%          j        dd	                    |d<   d
|vs|d
         sd|d
<   d|vs|d         sd|d<   | j        j        s| j         j        | j         j        dk    rd }nE| j        j        | j         j        }n,| j        j        dk    rd }n| j         j        | j        j        z  }|j        o| j        j        dk    o| j        j         }|j        s| j        j        o| j        j         }	t7          ||||||	          | _        | j        j        rt:          j        | _        d S | j        j         rt:          j!        | _        d S t:          j"        | _        d S )Nr:   PATHwinec                    g | ]}d |z   S )zZ:rG   )r4   r  s     r7   r8   z-SingleTestRunner.__init__.<locals>.<listcomp>  s    AAAaAAAr9   WINEPATH;MALLOC_PERTURB_r	      ASAN_OPTIONSz0halt_on_error=1:abort_on_error=1:print_summary=1UBSAN_OPTIONSzChalt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1r   )#rM  r  _get_cmdr  extra_pathsr]   pathsepr   ry   ro  basenamer  r   r  r}   rn  	benchmarkrQ   randomrandintrr   r  timeout_multiplierr6  num_processesr  r  r*  runobjr   r   r  r  r   r   )
r   rM  r   r   r  winecmdrX   r  r6  r  s
             r7   rh  zSingleTestRunner.__init__q  s   	==??8 		- 	*//$)*?2$*FGG#f+UCKGX  q!!!7##A&&11&99 &8AA49+@AAACGGJXZD[D[DaDabeDfDff	)' 'C
O
 E S((4E0F(PWPa(%(3)?)?%@%@C!" #%%S-@%"TC3&&c/.B&#hC < 	Jty08DI<MQR<R<RGG\,4i'GG\,11GGi'$,*IIG&b4<+E+IbRVR^RbNb<74<#7SAS=SdCwWMM< 	3 +D[& 	3 + 2D + 2Dr9   r;   T.Optional[T.List[str]]c                   | j         j        d         }| j        j        r>| j         j        r2t
          j                            |          st          d|d          |	                    d          rddg| j         j        z   S | j         j
        st          |          rdg| j         j        z   S | j         j        r| j         j
        r| j         j        r| j         j        d S | j         j        r|| j         j                                        s3d}t          |                    | j         j        j                            | j         j                                        | j         j        z   S | j         j        S )	Nr   zThe test program z7 does not exist. Cannot run tests before building them.z.jarjavaz-jarmonozmThe exe_wrapper defined in the cross file {!r} was not found. Please check the command and/or add it to PATH.)rM  r  r  
no_rebuildcmd_is_builtr]   ro  isfiler   rN  is_cross_builtr  
cmd_is_exeneeds_exe_wrapperexe_wrapperfoundr   r   get_command)r   	testentrymsgs      r7   _get_test_cmdzSingleTestRunner._get_test_cmd  sn   IOA&	<" 	zty'= 	zbgnnU^F_F_ 	z xI x x xyyyf%% 	MF#dio55) 	MmI.F.F 	M8dio--Y! 	Mdi&> 	M49C^ 	My$, t% M y,2244 PTC'

493H3M(N(NOOOy,88::TY_LLyr9   c                v    |                                  }|sd S t                              | j                  |z   S r   )r  TestHarnessget_wrapperr  )r   test_cmds     r7   r  zSingleTestRunner._get_cmd  s;    %%'' 	4&&t|44x??r9   r<   c                    | j         j        S r   )r  r6  r   s    r7   r6  zSingleTestRunner.is_parallel  s    {&&r9   c                    | j         j        S r   )r  r   r   s    r7   visible_namezSingleTestRunner.visible_name  s    {r9   r  c                    | j         j        S r   )r  r  r   s    r7   r  zSingleTestRunner.timeout  s    {""r9   rH  rI  r*  c                z  K   | j         ;d| _        |                    | j                   | j                                         nq| j         | j        j        z   | j        j        z   }| j        	                    |           |                    | j                   | 
                    ||           d {V  | j        S )Nz7Not run because cannot execute cross compiled binaries.)r  r  log_start_testr  rU  rM  cmd_argsr  	test_argsrL  _run_cmd)r   rH  r  s      r7   r  zSingleTestRunner.run  s      8QDI""4;///K%%''''(TY//$,2HHCKc"""""4;///-----------{r9   r   r=  r  r  cwdr   r  c          	     f   	K    j         j        rGt          j        t          j                  	t          j        t          j        t          j                   d fd}d	 fd}t          j        |||||t                      s|nd d d {V }t          |||t                      s|nd           S )Nr;   ri   c                      j         j        r+t          j        t          j        t          j                   d S t          j                     d S r   )r  rr   r   SIGINTSIG_DFLr]   setsidr   s   r7   
preexec_fnz4SingleTestRunner._run_subprocess.<locals>.preexec_fn  s?    |  fmV^<<<<<
 	r9   c                 b    j         j        r!t          j        t          j                    d S d S r   )r  rr   r   r-  )previous_sigint_handlerr   s   r7   r  z5SingleTestRunner._run_subprocess.<locals>.postwait_fn  s8    | Ffm-DEEEEEF Fr9   )r  r  r   r*  r0  )r  r  r  rZ  )
r  rr   r   	getsignalr-  SIG_IGNr  create_subprocess_execrC   r  )
r   r   r  r  r   r*  r0  r  r  r2  s
   `        @r7   _run_subprocessz SingleTestRunner._run_subprocess  s      < 	9&,&6v}&E&E#M&-888		 		 		 		 		 			F 	F 	F 	F 	F 	F 	F
 0$8>8>5858NXll<dJJ`df f f f f f f f f av=G\\*S++tU U U 	Ur9   r  ri   c                  K   | j         t          j        u rd }d }nKt          j        j        }| j        j        s| j        j	        st          j        j
        nt          j        j        }g }| j        j        t          j        u re| j        j        }| j        j        r4t"          j                            | j        j        | j        j                  }|                    d| d           |                     ||z   ||| j        j        | j        j                   d {V }| j        j	        rB| j                            ||                                          }t          j        |          }	nd }	|                    | j        | j                   \  }
}|                    | j                   d {V  |	r|	 d {V  |
r|
 d {V  |r| d {V  | j                                         d S )Nz--gtest_output=xml:rk  )r  r  r   r*  )r  r   r   r  r  PIPEr  r}   r  r  r   rM  r1  r   GTESTr   rn  r]   ro  r   ry   r6  r   r&  r  r  r  r  rW  )r   rH  r  r  r  	extra_cmd	gtestnamer  
parse_coro
parse_taskr  r  s               r7   r)  zSingleTestRunner._run_cmd   s     //FFF',F|)-26+2K-W'..',  "$	9!333	Iy  LGLL):DINKK	B9BBBCCC&&sY.4.4+/;?+/9+<	 ' > > > > > > > > ;$ 	**7ANN4D4DEEJ .z::JJJ }}T[$:KLL	9ffT[!!!!!!!!! 	 	OOOOOOO 	OOOOOOOr9   N)rM  r   r   r5  r   rQ   r  r  )r;   r  r   r   )r;   r  )rH  rI  r;   r*  )r   r=  r  r  r  r  r   r5  r*  r   r;   r  )rH  rI  r  r=  r;   ri   )r   r   r   rh  r  r  r_  r6  r#  r  r  r6  r)  rG   r9   r7   r  r  o  s        63 63 63 63p   .@ @ @ @ ' ' ' X'       X  # # # X#
 
 
 
 U  U  U  UD' ' ' ' ' 'r9   r  c                  l   e Zd ZdPdZdQdZdRdZdRd	ZdSdZdTdZdUdZ	dRdZ
dVdZdWdZdXdZdYd!ZedZd#            ZedZd$            Zd[d&Z	 	 	 	 	 d\d]d2Zd^d3ZdZd4ZdZd5Zed_d8            Zed`d;            Zdad<Zdbd?ZdcdddBZdRdCZdRdDZededE            ZdfdFZ dgdIZ!dhdMZ"didNZ#dgdOZ$d)S )jr  r  r  c                   || _         g | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        g | _        t                      | _        | j                            | j                   d| _        d | _        d | _        | j         j        r| j         j        sd }t(          j                            | j         j        d| j         j                  | _        | j         j        r>t(          j                            |                     | j                   d                   }n,| j         j        r | j         j                            dd          }|r'| xj        d|                    dd          z   z  c_        |                                  |                                  t?                      }| j         D ]!}|j!        D ]}|"                    |           "tG          |          | _$        d S )Nr   Fz
meson-logs:r  r2   r   )%r  r  
fail_countexpectedfail_countunexpectedpass_countsuccess_count
skip_counttimeout_countrt  name_max_lenis_runloggersrk  console_loggerry   r  ninjalogfile_baselogbaserr   r]   ro  r   rw   ru   r  r  r   r`  prepare_buildload_metadatar  r  r  r  rt   r  )r   r  namebasessr~  rP   s         r7   rh  zTestHarness.__init__+  s   35"#$%!+-+ooD/000!"&
-1< 
	F(8 
	FH "T\_lDLL` a aD|# @7++D,<,<T\,J,J1,MNN# @<-55c3?? F!!S8+;+;C+E+E%EE!!UU 	 	AW  q				2hhr9   r;   'ConsoleLogger'c                "    | j         sJ | j         S r   )rJ  r   s    r7   get_console_loggerzTestHarness.get_console_loggerS  s    """"""r9   ri   c                    | j         j        rd S t          j                    | _        | j        s%t          d           t          j        d           d S d S )Nz%Can't find ninja, can't rebuild test.r,   )r  r  r   detect_ninjarK  r`   rF   exitr   s    r7   rN  zTestHarness.prepare_buildW  sZ    <" 	F -//
z 	9:::
 HSMMMMM	 	r9   c                H   t          j                    }	 t          j        | j        j                   | j        j        st          j        | j        ddgz   d          j	        }d|vrd|vr|| j        j
        rt          j        nt          j	        }t          j        | j        dgz   |                                          }|j        dk    rt          d	| j        j                  t!          j        t          j                              | _        | j        j        s| j        j        | j        _        | j        j        r|                     d
          | _        n|                     d          | _        t          j        |           d S # t          j        |           w xY w)Nz-nzbuild.ninjaT)capture_outputs   ninja: no work to do.s   samu: nothing to do)r  r   zCould not configure zmeson_benchmark_setup.datzmeson_test_setup.dat)r]   getcwdchdirr  rw   r  r  r  rK  r  rt   rF   r  filenor  r   r
   load
build_datar   test_setup_default_namer  
load_testsr  )r   startdirteststdor  rets        r7   rO  zTestHarness.load_metadatad  sm   9;;	HT\_%%% <* X%>$*m7L*L]abbbi+8;;@V^f@f@f)-):J3::
D$.}o)Edkkmm\\\C~**+,V4<?,V,VWWW#j55DO<% M%)_%L"|% E!__-HII

!__-CDD
HXBHXs   E F F!	file_namerQ   r  c                (   t          d          |z  }|                                st          d| j        j        d          |                    d          5 }t          t          j        |                    }d d d            n# 1 swxY w Y   |S )Nzmeson-privatez
Directory z- does not seem to be a Meson build directory.rb)	r   is_filer   r  rw   rf  r  pickler]  )r   rd  datafiler'  r  s        r7   r`  zTestHarness.load_tests  s    ((94!! 	o mT\_ m m mnnn]]4   	2A!&+a..11D	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   "BBBrI  c                    | S r   rG   r   s    r7   	__enter__zTestHarness.__enter__  s    r9   exc_typer,  	exc_value	tracebackc                .    |                                   d S r   )close_logfiles)r   rl  rm  rn  s       r7   __exit__zTestHarness.__exit__  s    r9   c                P    | j         D ]}|                                 d | _        d S r   )rI  rY  rJ  r   r\  s     r7   rp  zTestHarness.close_logfiles  s0     	 	AGGIIII"r9   rM  T.Optional[TestSerialisation]build.TestSetupc                   d| j         j        v rV| j         j        | j        j        vr"t	          j        d| j         j         d           | j        j        | j         j                 S |j        dz   | j         j        z   }|| j        j        vr*t	          j        d| j         j         d|j         d           | j        j        |         S )Nr@  zUnknown test setup 'z'.zTest setup 'z' not found from project ')r  r   r^  test_setupsrF   rW  r<  )r   rM  	full_names      r7   get_test_setupzTestHarness.get_test_setup  s    $,$$$|!)DDDF0BFFFGGG?.t|/ABB)C/$,2DDI ;;;k(:kkVZVgkkklll?.y99r9   r   r5  c                ^   |                      |          }|j        s|j        |_        |j        rd|_        |j        |j        |_        |j        |j        |_        n|j        rt          j        d           |j        	                    t          j                                                  S )NTzBConflict: both test setup and command line specify an exe wrapper.)ry  rr   r  r	  ru   r  rF   rW  r   get_envr]   r^   copy)r   r  rM  currents       r7   merge_setup_optionszTestHarness.merge_setup_options  s    %%d++{ 	&!+GK; 	#"GO%-)0)CG& ?"%1GOO  	[HYZZZ{""2:??#4#4555r9   r  c                   |                      |          }t          | j                  }| j        j        r|                     ||          }nt
          j                                        }|j        	                    |          }|
                    |           |j        rP|j        rI|j        rB|j                                        r)t          |j                                                  |d<   t#          ||||          S )NMESON_EXE_WRAPPER)get_pretty_suiter   r  r   r~  r]   r^   r|  r   r{  r  r  r  r  r  r   r  r  )r   rM  r   r  r   r4  s         r7   get_test_runnerzTestHarness.get_test_runner  s    $$T**4<((< 	$**7D99CC*//##C8##C((

8 	QD$: 	Q 	Q%)%5%;%;%=%=	Q'01A1M1M1O1O'P'PC#$c4999r9   rW   r*  c                   |j         t          j        u r| xj        dz  c_        n|j         t          j        u r| xj        dz  c_        n|j         t          j        u r| xj        dz  c_        n|j         t          j        t          j	        t          j
        hv r| xj        dz  c_        nd|j         t          j        u r| xj        dz  c_        n@|j         t          j        u r| xj        dz  c_        nt!          j        d|j                     |j                                         r| j                            |           | j        D ]}|                    | |           d S )Nr	   z!Unknown test result encountered: )r   r   r   rF  r   rE  r   rD  r   r   r   rA  r   rB  r   rC  rF   rW  r   r  ry   rI  rU  )r   rW   r\  s      r7   process_test_resultzTestHarness.process_test_result  sf   :+++!#Z:?**OOq OOOZ:=((!#ZJOZ-=z?STTTOOq OOOZ:222##q(###Z:444%%*%%%HEEEFFF: 	3#**6222 	  	 AEE$	  	 r9   rR   c                D    t          t          | j                            S r   )r  rQ   rt  r   s    r7   numlenzTestHarness.numlen  s    3t''(((r9   c                    d| j         z  dz   S )NrI   )r  r   s    r7   rq  zTestHarness.max_left_width  s    4;""r9   r  c                F    d                     | j        || j                  S )Nz{num:{numlen}}/{testcount} )r  r  	testcount)r   r  rt  )r   r  s     r7   get_test_num_prefixzTestHarness.get_test_num_prefix  s.    ,334;8;>Bo 4 O O 	Or9   r   r:   Nr   r<   rq  r  r  r   r  r  c                   ||                      |j                  }t          || j                  }||j        }|| j        z   dz   t          |          z
  t          |          z
  t          |          z
  }|dt          d|          z  z  }|[d                    |j        	                    |          |j
        | j        dz             }|                                }	|	r|d|	z   z  }||z   |z   |z   S )Nr	   r   z{res} {dur:{durlen}.2f}sr&   )r   r  r  r  )r  r  r  rq  r   rG  rZ   r   r   r   r  r  r  )
r   rW   r   rq  r  r  r  r  extra_mid_widthr  s
             r7   r   zTestHarness.format  s    <++FJ77D ^T-@AA>[F(4+<<q@8FCSCSSV^_cVdVddgopvgwgww#A////=.55J''11O,q0 6 2 2E ((**G )(}v%--r9   c                    t          j        d                              | j        | j        | j        | j        | j        | j                  S )Nz
            Ok:                 {:<4}
            Expected Fail:      {:<4}
            Fail:               {:<4}
            Unexpected Pass:    {:<4}
            Skipped:            {:<4}
            Timeout:            {:<4}
            )	textwrapdedentr   rD  rB  rA  rC  rE  rF  r   s    r7   r  zTestHarness.summary  sL         *D,CT_14?DDVX X	Xr9   c                0    | j         | j        z   | j        z   S r   )rA  rC  rF  r   s    r7   total_failure_countzTestHarness.total_failure_count  s    !::T=OOOr9   c                     j         rt          d          d _                                          }|sdS  j        j        s4t           j         j        j        |          st          j	        d           t           fd|D                        _        t           j        j        t          |           j        j        z             j        _        t!          j                    }	 t!          j         j        j                   g }t'           j        j                  D ]e}|                     fd|D                        |dk    r<t          d |D                        _        t-          d |D                        _        ft          |           _                             |           t!          j        |           n# t!          j        |           w xY w                                 S )	Nz*Test harness object can only be used once.Tr   }   c              3  \   K   | ]&}t                              |                    V  'd S r   )rZ   r  r4   rM  r   s     r7   r  z#TestHarness.doit.<locals>.<genexpr>  s9      XX$)>)>t)D)D E EXXXXXXr9   c              3  B   K   | ]}                     |          V  d S r   )r  r  s     r7   r  z#TestHarness.doit.<locals>.<genexpr>  s1      LLdt33D99LLLLLLr9   c              3  v   K   | ]4}t          t          t          |j        pd                               V  5dS )r%   N)r  rQ   rR   r  r4   runners     r7   r  z#TestHarness.doit.<locals>.<genexpr>   s]       0G 0G4: 14CFN<Pb8Q8Q4R4R0S0S 0G 0G 0G 0G 0G 0Gr9   c              3  <   K   | ]}|j         t          j        uV  d S r   )r  r   r   r  s     r7   r  z#TestHarness.doit.<locals>.<genexpr>#  sI       ,C ,C06 -3,?{GY,Y ,C ,C ,C ,C ,C ,Cr9   )rH  RuntimeError	get_testsr  r  rebuild_depsrK  rw   rF   rW  r  rG  minr
  r  rn   r]   rZ  r[  rangeextendr  r  r  rt  	run_testsr  )r   r  ra  runnersr  s   `    r7   doitzTestHarness.doit  s   ; 	MKLLL   	1|& 	|DJY^/_/_ 	 HSMMMXXXXRWXXXXX%()C),Udl6I)I&K &K"9;;	HT\_%%%02G4<.// C CLLLLeLLLLLL66,/ 0G 0G>E0G 0G 0G -G -GD) ), ,C ,C:A,C ,C ,C )C )CD% "'llDONN7###HXBHX'')))s   )CG Gr  T.Tuple[str, str]c                    d| v r;|                      dd          }t          |          dk    sJ |d         |d         fS | dfS )Nr@  r	   rI   r   r:   )r}   r  )r  r}   s     r7   split_suite_stringzTestHarness.split_suite_string,  sN    %<<KKQ''Eu::????8U1X%%"9r9   r  r=  c                    |D ]g}t                               |          \  }}| j        D ]@}t                               |          \  }}|s
||k    r  dS |r||k    r4|r||k    r=  dS hdS NTF)r  r  r  )rM  r  r  	prj_matchst_matchprjstprjsts           r7   test_in_suiteszTestHarness.test_in_suites5  s     	 	E$/$B$B5$I$I!Y  '::5AA	b    B)OO444  	!1!1 httt34 ur9   c                <   t                               || j        j                  rdS | j        j        r%t                               || j        j                  S | j        j        r7|                     |          }t                               ||j                  rdS dS r  )r  r  r  r|   rx   r   ry  )r   rM  r   s      r7   test_suitablezTestHarness.test_suitableU  s    %%dDL,GHH 	5<& 	Q --dDL4OPPP< 	''--E))$0DEE utr9   r  *T.Generator[TestSerialisation, None, None]c              #  B  K   i }| j         j        D ]<}d|v r+|                    dd          \  }}|dk    rd}|dk    rd}nd|}}d|||f<   =|D ]N}t          |          D ]<\  }}t	          |j        |          r"t	          |j        |          rd|||f<   |V   n=O|                                D ]k\  \  }}}|sa| d| }|D ]E}t	          |j        |          r.t	          |j        |          rt          j	        | d            nFt          | d	          ld
S )a  
        Allow specifying test names like "meson test foo1 foo2", where test('foo1', ...)

        Also support specifying the subproject to run tests from like
        "meson test subproj:" (all tests inside subproj) or "meson test subproj:foo1"
        to run foo1 inside subproj. Coincidentally also "meson test :foo1" to
        run all tests with that name across all subprojects, which is
        identical to "meson test foo1"
        r@  r	   )maxsplitr:   r   FTz( test name is redundant and was not usedz" test name does not match any testN)r  r   r}   rt   r   r<  r   r  r   warningr   )r   r  patternsargsubprojr   r~  was_useds           r7   tests_from_argszTestHarness.tests_from_argse  s      57<$ 	. 	.C czz #		#	 : :2::Db==!G #S(-Hgt_%% 	 	A "&h  1>733 8M8M 04Hgt_-GGGE)1)9)9 	U 	U%OWdX U ))4)) U UA q~w77 GAFD<Q<Q %U%U%UVVV
 )C)S)S)STTT	U 	Ur9   	errorfileT.Optional[T.IO]c                      j         st          d|           g S  fd j         D             } j        j        r"t	                               |                    }|st          d|           g S |S )NzNo tests defined.)rg  c                >    g | ]}                     |          |S rG   )r  )r4   r~  r   s     r7   r8   z)TestHarness.get_tests.<locals>.<listcomp>  s,    @@@q$*<*<Q*?*?@@@@r9   zNo suitable tests defined.)r  r`   r  r   rt   r  )r   r  r  s   `  r7   r  zTestHarness.get_tests  s    z 	%I6666I@@@@DJ@@@< 	6--e4455E 	.Y????Ir9   c                B    | j         D ]}|                                 d S r   )rI  rF  rs  s     r7   flush_logfileszTestHarness.flush_logfiles  s,     	 	AGGIIII	 	r9   c                6   | j         sd S | j                            t          | j         dz                        | j                            t	          | j         dz                        | j                            t          | j         dz   d                     d S )Nz
.junit.xmlz.jsonz.txtsurrogateescaper   )rL  rI  ry   r  r  r  r   s    r7   open_logfileszTestHarness.open_logfiles  s      	FL):\)IJJKKK.t/@7/JKKLLL.t/@6/IRcdddeeeeer9   c                |    g }| j         r!| j        dg}| j        dk    r|g dz  }|dgz  }| j        r
|| j        z  }|S )Nr   r	   )-exr  r  quitz--args)rr   rs   rn   ru   )r  wraps     r7   r  zTestHarness.get_wrapper  sc    ; 	$i0D~!!5555XJD? 	$GO#Dr9   c                   t          | j                  dk    rm|j        rft                              |j        d                   d         }d                    d |j        D                       }|r|dz  }||z   dz   |j        z   S |j        S )Nr	   r   +c              3  V   K   | ]$}t                               |          d          V  %dS r  )r  r  )r4   rP   s     r7   r  z/TestHarness.get_pretty_suite.<locals>.<genexpr>  s5      RR!77::1=RRRRRRr9   r@  z / )r  r  r  r  r  r   r   )r   rM  rvrP   s       r7   r  zTestHarness.get_pretty_suite  s    t{aDJ//
1>>qABRRtzRRRRRA c	6E>DI--9r9   r  T.List[SingleTestRunner]c                B   	 |                                   t          j        dk    r%t          j        t          j                               t          j        |                     |                     |                                  d S # |                                  w xY w)Nwin32)	r  rF   r?   r  set_event_loop_policyWindowsProactorEventLoopPolicyr  
_run_testsrp  )r   r  s     r7   r  zTestHarness.run_tests  s    		"    |w&&-g.T.V.VWWWK00111!!!!!D!!!!s   A0B BrP   r   r   c                J    | j         D ]}|                    | |||           d S r   )rI  rS  )r   rM  rP   r   r\  s        r7   rS  zTestHarness.log_subtest  s8     	. 	.AMM$a----	. 	.r9   c                F    | j         D ]}|                    | |           d S r   )rI  rQ  )r   rM  r\  s      r7   r&  zTestHarness.log_start_test  s4     	% 	%ALLt$$$$	% 	%r9   c                   	
K   t          j         j        j                  t	                      i dt	          t
                    t          j                    d	 fd}dfd
}d fd
d
fd	d	 fd}d	
 fd} j        D ]}|                                t          j
        dk    rt          j        d          t          j                    k    r!                    t          j        |           n                     t          j        |                               t          j        |           	 |D ]}|j        st'                     d {V  t          j         ||                    }                    |           |j        |<   |                    |           |j        st1          |           d {V   j        j        dk    r	 j        r nt'                     d {V  t          j
        dk    r>                    t          j                                       t          j                    j        D ]}|                                d {V  d S # t          j
        dk    r>                    t          j                                       t          j                    j        D ]}|                                d {V  w xY w)NF)r   rM  r  r;   ri   c                  K   4 d {V  sj         j        dk    rj        r	 d d d           d {V  d S |                                d {V }                    |           j         j        }|r.j        |k    r#|j                                        r
              d d d           d {V  d S # 1 d {V swxY w Y   d S r@  )r  rn   rA  r  r  maxfailr   r   )rM  r   r  cancel_all_testsinterruptedr   	semaphores      r7   run_testz(TestHarness._run_tests.<locals>.run_test  s       ' ' ' ' ' ' ' ' 4<#6#:#:t#:' ' ' ' ' ' ' ' ' ' ' ' ' ' !HHTNN******((---,. 't'99cgnn>N>N9$$&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's   B9A,B99
CCr'  r  c                    |                                  s|                                                      |            	 | = d S # t          $ r Y d S w xY wr   )r  rW   r  KeyError)r'  r  rn  s    r7   	test_donez)TestHarness._run_tests.<locals>.test_done  sg    ;;== 


NN1!!$$$   s    A 
AAwarnr<   c                                                    }                    |           | rA                                 t          j        d                    |                              |= |                                 d S )Nz CTRL-C detected, interrupting {})popleftry   r  r   r  r   r  )r  r  r  rn  r   s     r7   cancel_one_testz/TestHarness._run_tests.<locals>.cancel_one_test  s}    __&&FNN6""" _##%%%?FF}U[G\]]^^^f%MMOOOOOr9   c                 .    dr  d           d S d S r  rG   )r  r  rn  s   r7   r  z0TestHarness._run_tests.<locals>.cancel_all_tests  s>    K '&&&   ' ' ' ' 'r9   c                 t    rd S                                   t          j        d                          d S )NzReceived SIGTERM, exiting)r  r   r  )r  r  r   s   r7   sigterm_handlerz/TestHarness._run_tests.<locals>.sigterm_handler
  sH     !!!L4555r9   c                    rd S                                                                 t                    t          k    rId         d         z
  dk     r4                                 t          j        d                          d S r d           d S                                  t          j        d           dd S )Nr   r   r	   zCTRL-C detected, exitingT)ry   r  r  	MAX_CTRLCr  r   r  )r  r  ctrlc_timesr  r  rn  r   s   r7   sigint_handlerz.TestHarness._run_tests.<locals>.sigint_handler  s      tyy{{+++;9,,R;q>1QTU1U1U##%%%7888  """"" #%%%%%##%%%7888"r9   r  r   r	   )rM  r  r;   ri   )r'  r  r;   ri   )r  r<   r;   ri   rZ  )r  	Semaphorer  r
  r   r  r  rI  rL  rF   r?   r]   getpgidgetpidadd_signal_handlerr   r-  r  r6  r  r  ry   r#  add_done_callbackrW  rn   rA  remove_signal_handlerrW  )r   r  r  r  r  r  r\  r  r  r  r  r  r  r  r  rn  r  s   `        @@@@@@@@r7   r  zTestHarness._run_tests  s     %dl&@AA	+07757&+9&=&=&='))	' 	' 	' 	' 	' 	' 	' 	' 	'	 	 	 	 	 	 		 	 	 	 	 	 	 		' 	' 	' 	' 	' 	' 	' 	'	 	 	 	 	 	 	 		# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#$  	 	AGGDMMMM<7""z!}}	++''~FFFF''GGG##FNODDD	%! 
 
) 0&w///////// .xx/?/?@@v&&&(.(;f%((333) +"6*********<&**t*Ew'''''''''|w&&**6=999**6>:::\ % %hhtnn$$$$$$$$% % |w&&**6=999**6>:::\ % %hhtnn$$$$$$$$%s   B<J A5K8)r  r  )r;   rR  rZ  )rd  rQ   r;   r  )r;   rI  )rl  r,  rm  r,  rn  r,  r;   ri   )rM  rt  r;   ru  )r  r  rM  r   r;   r5  )rM  r   r;   r  )rW   r*  r;   ri   r   )r  rR   r;   rQ   )r   r:   NNN)rW   r*  r   r<   rq  rR   r  rQ   r  r   r  r   r  r   r;   rQ   r   )r  rQ   r;   r  )rM  r   r  r=  r;   r<   )rM  r   r;   r<   )r  r  r;   r  r   )r  r  r;   r  )r  r  r;   r=  )rM  r   r;   rQ   )r  r  r;   ri   )rM  r*  rP   rQ   r   r   r;   ri   )rM  r*  r;   ri   )%r   r   r   rh  rT  rN  rO  r`  rk  rq  rp  ry  r~  r  r  r_  r  rq  r  r   r  r  r  r   r  r  r  r  r  r  r  r  r  r  rS  r&  r  rG   r9   r7   r  r  *  s       & & & &P# # # #      6         # # # #
	: 	: 	: 	:6 6 6 6 : : : :       * ) ) ) X) # # # X#O O O O &''+)-(,. . . . .8	X 	X 	X 	XP P P P#* #* #* #*J    \    \>    3U 3U 3U 3Uj       f f f f 
 
 
 \
   
" 
" 
" 
". . . .% % % %_% _% _% _% _% _%r9   r  thc                    |                      t          j                  }|D ]$}t          |                     |                     %| S )N)r  )r  rF   r  r`   r  )r  r  r~  s      r7   
list_testsr  A  sM    LL3:L..E & &b!!!$$%%%%9r9   rK  r=  rw   r  c                  
 dfd
t          |           dk    sJ t                      }t                      }i }t          t                    d          D ]}
fd|d	         D             ||d
         <    |D ]A}|j        D ]7}||v r|                    |           |                    ||                    8Bt          j        | dgz   t          |          z             j	        }	|	dk    rt          d            dS dS )Nro  rQ   r;   c                    t           j                            |           } t           j        dk    r |                     t           j        d          } | S )Nr  )r]   ro  relpathr  r`  )ro  rw   s    r7   convert_path_to_targetz,rebuild_deps.<locals>.convert_path_to_targetH  s=    wtR((6S==<<,,Dr9   r   targets)kindc                &    g | ]} |          S rG   rG   )r4   r'  r  s     r7   r8   z rebuild_deps.<locals>.<listcomp>T  s4     ') ') ') #"1%%') ') ')r9   ra  idrv   zCould not rebuild FT)ro  rQ   r;   rQ   )r  r  r   r   dependsr  r  r  sortedr  r`   )rK  rw   r  r  r  intro_targetstargetr~  drc  r  s    `        @r7   r  r  G  sZ         u::>>>>%%G%%G.0M RyAAA ) )') ') ') ')J'') ') ')fTl##  - - 	- 	-AG||NN1NN=+,,,,		- .$+fWoo=
>
>
IC
axx'2''(((u4r9   r  r  c                Z   | j         rd| _        | j        r| j        rt	          d           dS d }| j        r!d| _        | j        rt	          d           dS d}| j        r| j        d         }|9t          |d          }|                                st	          d|           dS t          j
        | j                  }t          j        d	|j        j                            t#          d
                              }t%          |           | j        sV|j        j                            t#          d                    }|dk    rd| _        n|dk    rt	          d           d| _        t)          |           5 }	 | j        rt-          |          cd d d            S |                                cd d d            S # t0          $ rU}t	          d           t2          j                            d          r|t	          |           Y d }~d d d            dS d }~ww xY w# 1 swxY w Y   d S )Nr	   z3Can not be both quiet and verbose at the same time.Tz9Must not specify both a wrapper and gdb at the same time.rr   r   )silentz"Could not find requested program: r<   vsenvbackendnonerK  zEOnly ninja backend is supported to rebuild tests before running them.z!Meson test encountered an error:
MESON_FORCE_BACKTRACE)r  r
  r  r  r`   rr   ru   r   r  r
   r]  rw   r=  castr   coredata
get_optionr   r   r  r  rt   r  r  r   r]   r^   r  )r  	check_binexer   
need_vsenvr  r  rr  s           r7   r  r  e  s    " ! 7= CDDDqI{ ? 	MNNN1	 'OA&	i555yy{{ 	DyDDEEE1
7:A 6 A A)GBTBT U UVVJ
 &-(33Ii4H4HIIf!%GYZZZ!%G	W		 
	| &!"~~        7799	       
  	 	 	6777z~~566 a111       
	         s<   :H <F>F>>
H?HH HH  H$'H$r   c                    t          j        d          }t          |           |                    |           }t	          |          S )Nz
meson test)prog)argparseArgumentParserr   
parse_argsr  )r   rg   r  s      r7   run_with_argsr    sB    $,777F&%%Gw<<r9   r   )rP   rQ   r;   rR   r   )rg   rh   r;   ri   )rP   rQ   r;   ri   )r   rQ   r   rQ   r;   rQ   )rP   rQ   r   rQ   r   rR   r;   rQ   )r   rR   r;   rQ   )r   r   r;   rQ   )r  rQ   r;   rQ   )r  r  r;   rQ   )r  r  r  r  r  r   r;   rQ   )r  rQ   r;   r<   )r  r  r;   r  )r  r  r;   r  )r  r  r;   ri   r   )r  r  r  r  r;   ri   )r  r  r;   r<   )rK  r=  rw   rQ   r  r  r;   r<   )r  r  r;   rR   )r   r=  r;   rR   )}
__future__r   pathlibr   collectionsr   
contextlibr   r|  r   r   r  r  r  enumr  ra   r]   rh  r?   r  r?  r   r  shlexrF   r  r  typingr=  rT   xml.etree.ElementTreeetreer$  r  r:   r
   r   r   r  r   r   r   r  mesonlibr   r   r   r   r   r   r   r   mintror   r   programsr   backend.backendsr   r   TYPE_CHECKINGUnionTYPE_TAPResultrT  re  r  r0   r   
maxunicoder  UNENCODABLE_XML_CHR_RANGESr@  r   r  rC   rH   rV   rZ   rf   r   r   r   r   r   r   quoter   r   uniqueEnumr   r   r   rD  r_  rk  r  r  r  r*  rc  r+  EXITCODEri  r9  rt  TAPr  RUSTr  r   r  r  r  r  rW  r  r  r  r  r  r  r  r  rG   r9   r7   <module>r(     s    # " " " " " "                                        				    				       



           " " " " " " " " "                   J J J J J J J J 1 1 1 1 1 1O O O O O O O O O O O O O O O O O O O O / / / / / / / / % % % % % % = = = = = = = =? 2W 1 2N     	66 66 66  6 6 6 6 >W"" $2 $2 $2 3 3 3 edLcddd $"*TBGG4N,O,O%ORV%VWW ! ! ! !$ $ $ $ !!!DD       &/U /U /U /Ud      - - - -C C C C4 $/; . . . .z|| {HF F F F	 	 	 	 	N 	 	 	 	 	 	 	 	$) 	 	 	 .* .* .* .* .* .* .* .*bms ms ms ms ms ms ms ms^       .    Z   [! [! [! [! [!J [! [! [!| 6  6  6  6  6  6  6  6F4 4 4 4 4 4 4 4"}B }B }B }B }B: }B }B }B@w w w w w w w wt    g    4C ,/ 0    ?   ( 1= ,, -2 2 2 2 2 2 2 2h /9 ,* +% % % % %' % % %N 0; ,+ ,I I I I< < < <" " " "6H H H H
 
 
 
       CG    Bm, m, m, m, m, m, m, m,^x x x x x x x xvU% U% U% U% U% U% U% U%n      <2 2 2 2h     r9   