
    -Ph              
         U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZddl	m
Z
 ddl	mZ ddl	mZ ddl	mZ ddl	mZ dd	lmZmZ dd
lmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZm Z  ddlm!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z( ej)        rddl*m+Z+ ddlm,Z, ddlm-Z-m.Z. ddl/m0Z0m1Z1 ddl*m2Z2 ddlm3Z3 d dl4m5Z5m6Z6  G d de5          Z7 G d de5          Z8 G d de5          Z9 G d de9e0          Z: G d  d!e9          Z; G d" d#e;          Z< G d$ d%e;e0          Z= G d& d'e;e0          Z> G d( d)e0          Z? G d* d+e0e1          Z@ G d, d-e5          ZA G d. d/ejB                  ZC G d0 d1ed2                   ZD ed3 eeEeF          d4g 5          ZGd6eHd7<    ed8 eeEejI                  d4g 5          ZJd9eHd:<    ed; eeEe
jK        e
jL        e
jM        f          d4g 5          ZNd<eHd=<    ed> eeEe
jO                  g d4?          ZPd@eHdA<    edBeF eeEeF          fdCeEdDidE F          ZQdGeHdH<    edIeRdJK          ZS edLeFdCK          ZT edMeRdJdNO          ZUeGeJePeQeSgZVdPeHdQ<   eTeGeJePeSeU e&jW        dRdJS          gZXdPeHdT<    e&jW        dUdJS          geVZYdPeHdV<    e&jW        dNdJS          ZZ G dW dXedY                   Z[dS )Z    )annotationsN   )build)dependencies)options)mesonlib)mlog)SUFFIX_TO_LANG	RunResult)CompileCheckMode)ObjectHolder	noPosargsnoKwargs
FeatureNewFeatureNewKwargsdisablerIfNotFoundInterpreterException)ContainerTypeInfotyped_kwargs	KwargInfotyped_pos_args)	OptionKey   )extract_required_kwargextract_search_dirs)REQUIRED_KWin_set_validatorNoneType)Interpreter)Compiler)TYPE_varTYPE_kwargs)ExtractRequiredExtractSearchDirs)SourceOutputs)TV_LoggableList)	TypedDictLiteralc                      e Zd ZU ded<   dS )GetSupportedArgumentKwz!Literal['warn', 'require', 'off']checkedN__name__
__module____qualname____annotations__     _/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mesonbuild/interpreter/compiler.pyr*   r*   &   s         222222r2   r*   c                  .    e Zd ZU ded<   ded<   ded<   dS )AlignmentKwstrprefixT.List[str]argsT.List[dependencies.Dependency]r   Nr,   r1   r2   r3   r5   r5   *   s3         555555r2   r5   c                  .    e Zd ZU ded<   ded<   ded<   dS )BaseCompileKWboolno_builtin_argsT.List[build.IncludeDirs]include_directoriesr8   r9   Nr,   r1   r2   r3   r<   r<   0   s6         6666r2   r<   c                  .    e Zd ZU ded<   ded<   ded<   dS )	CompileKWr6   namer:   r   r=   werrorNr,   r1   r2   r3   rB   rB   5   s.         			5555r2   rB   c                  $    e Zd ZU ded<   ded<   dS )CommonKWr6   r7   r:   r   Nr,   r1   r2   r3   rF   rF   ;   s'         555555r2   rF   c                  .    e Zd ZU ded<   ded<   ded<   dS )ComputeIntKWzT.Optional[int]guesshighlowNr,   r1   r2   r3   rH   rH   @   s6         r2   rH   c                      e Zd ZdS )HeaderKWNr-   r.   r/   r1   r2   r3   rM   rM   F           r2   rM   c                      e Zd ZdS )HasKWNrN   r1   r2   r3   rQ   rQ   I   rO   r2   rQ   c                      e Zd ZdS )HasArgumentKWNrN   r1   r2   r3   rS   rS   L   rO   r2   rS   c                  j    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   dS )FindLibraryKWr=   disablerr8   has_headersstaticheader_argsr:   header_dependenciesr?   header_include_directoriesheader_no_builtin_argsr6   header_prefixz(T.Union[bool, options.UserFeatureOption]header_requiredNr,   r1   r2   r3   rU   rU   O   sz              	!   <<<<====$$$$AAAAAAr2   rU   c                  B    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   dS )PreprocessKWr6   outputr8   compile_argsr?   r@   r:   r   zOT.List[T.Union[build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]]dependsNr,   r1   r2   r3   r`   r`   ^   sK         !!!!66665555``````r2   r`   c                      e Zd ZdZdZdZdS )	_TestModez/Whether we're doing a compiler or linker check.r   r   N)r-   r.   r/   __doc__COMPILERLINKERr1   r2   r3   re   re   f   s        99HFFFr2   re   c                       e Zd Zd fdZeedd                        Zeedd                        Zeedd                        Zeedd                        Z	 xZ
S )TryRunResultHolderres'RunResult'interpreter'Interpreter'c                    t                                          ||           | j                            | j        | j        | j        | j        d           d S )N)
returncodecompiledstdoutstderr)super__init__methodsupdatereturncode_methodcompiled_methodstdout_methodstderr_method)selfrk   rm   	__class__s      r3   ru   zTryRunResultHolder.__init__o   sb    k***4+A)-)='+'9'+'9  	  	  	  	  	 r2   r9   T.List['TYPE_var']kwargs'TYPE_kwargs'returnintc                    | j         j        S N)held_objectrp   r|   r9   r   s      r3   rx   z$TryRunResultHolder.returncode_methodw   s     **r2   r=   c                    | j         j        S r   )r   rq   r   s      r3   ry   z"TryRunResultHolder.compiled_method|   s     ((r2   r6   c                    | j         j        S r   )r   rr   r   s      r3   rz   z TryRunResultHolder.stdout_method        &&r2   c                    | j         j        S r   )r   rs   r   s      r3   r{   z TryRunResultHolder.stderr_method   r   r2   )rk   rl   rm   rn   )r9   r~   r   r   r   r   r9   r~   r   r   r   r=   r9   r~   r   r   r   r6   )r-   r.   r/   ru   r   r   rx   ry   rz   r{   __classcell__r}   s   @r3   rj   rj   n   s                    + + + X Y+ ) ) ) X Y) ' ' ' X Y' ' ' ' X Y' ' ' ' 'r2   rj   r   r9   TlistifydefaultzKwargInfo[T.List[str]]_ARGS_KWr   z,KwargInfo[T.List['dependencies.Dependency']]_DEPENDENCIES_KWrc   zZKwargInfo[T.List[T.Union[build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]]]_DEPENDS_KWr@   )r   r   z$KwargInfo[T.List[build.IncludeDirs]]_INCLUDE_DIRS_KWr7    z1.0.0c                Z    t          | t                    rd                    |           n| S )N
)
isinstancelistjoin)xs    r3   <lambda>r      s#    
1d(;(;B		! r2   )r   since_values	convertorzKwargInfo[str]
_PREFIX_KWr>   Fr   rC   rD   1.3.0r   sincezT.List[KwargInfo]_COMMON_KWS1.5.0)r   r   _COMPILES_KWS0.50.0_HEADER_KWSc                  P    e Zd ZU  ej        ej                  Zded<   d fdZ	e
dd	            ZddZeedd                        Zeedd                        Zej        fddZdddZ ed e           ed eee          dd$                        Z ed%eej        f           ed%geR  dd)                        Zeedd*                        Z ee e!d+d,          dd-                                    Z"eedd.                        Z# ed/ee           ed/e$ge%R  dd2                        Z& ed3eed45           ed3e$ge%R  dd7                        Z' ed8e           ed8e$ge%R  dd9                        Z( ed:e           ed:e$ge%R  dd;                        Z) e!d<d=           ed<e           ed< e*d>e+e,f           e*d?e+e,f           e*d@e+e,f          ge%R  ddB                                    Z- edCe           edCge%R  ddE                        Z. e!dFd=           edFe           edFge%R  ddG                                    Z/ e!dHdI           edHe           edHge%R  ddJ                                    Z0 edKeej        f           edKgeR  ddL                        Z1 edMeej        f           edMgeR  ddN                        Z2 e!dOdP           edOe           edOge3R  ddR                                    Z4ddTZ5 edUe           edUge3R  ddV                        Z6 edWee           edWge3R  ddX                        Z7dd[Z8e9 ed\e           ed\ e*d]e:e;j<        fd^_           e*d` e=e>e          d^g dab           e*dce:e,fdde           e*dfe:ddgh           e*di e=e>e          d^g j          gdk e3D             R  ddm                                    Z?e@jA        dnfddsZB edte           edte$          ddv                        ZC edwex           edwe$           e!dwdy          dd{                                    ZD e!d|d}           ed|ex           ed| e*d~edd eEh d                              dd                                    ZFe edex          dd                        ZG e!dd           ede           ede$          dd                                    ZH e!dd           edex           ede$          dd                                    ZI e!dd          e edex          dd                                    ZJ e!dd          e edex          dd                                    ZKdddZL e!dd           ede           ede$          dd                                    ZM e!dd          e edex          dd                                    ZN e!ddg          eedd                                    ZO e!dd           ePdddgd           edeej        eQjR        eQjS        eQjT        fd45           ed e*ded_           e*d e=e>e          d^g j          eUeV                    de          eWV                    de                    dd                                                ZX xZYS )CompilerHolderzT.Dict[str, itertools.count]preprocess_uidcompiler
'Compiler'rm   rn   c                   t                                          ||           | j        | _        | j                            i d| j        d| j        d| j        d| j	        d| j
        d| j        d| j        d| j        d	| j        d
| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        i d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j         d| j!        d| j"        d| j#        d| j$        d | j%        d!| j&                   d S )"Ncompileslinksget_idget_linker_idcompute_intsizeof
get_define
has_definecheck_header
has_headerhas_header_symbolrunhas_function
has_memberhas_membershas_type	alignmentversion	cmd_arrayfind_libraryhas_argumenthas_function_attribute!get_supported_function_attributeshas_multi_argumentsget_supported_argumentsfirst_supported_argumenthas_link_argumenthas_multi_link_argumentsget_supported_link_argumentsfirst_supported_link_argumentsymbols_have_underscore_prefixget_argument_syntax
preprocess)'rt   ru   envenvironmentrv   rw   compiles_methodlinks_methodget_id_methodget_linker_id_methodcompute_int_methodsizeof_methodget_define_methodhas_define_methodcheck_header_methodhas_header_methodhas_header_symbol_method
run_methodhas_function_methodhas_member_methodhas_members_methodhas_type_methodalignment_methodversion_methodcmd_array_methodfind_library_methodhas_argument_methodhas_func_attribute_method(get_supported_function_attributes_methodhas_multi_arguments_methodget_supported_arguments_methodfirst_supported_argument_methodhas_link_argument_methodhas_multi_link_arguments_method#get_supported_link_arguments_method$first_supported_link_argument_method%symbols_have_underscore_prefix_methodget_argument_syntax_methodpreprocess_method)r|   r   rm   r}   s      r3   ru   zCompilerHolder.__init__   sD   ;///8 !Z)= !$d&7!%t'9! -d.G! +D,C	!
 &t'9! *4+A! *4+A! ,T-E! *4+A! 1$2O! #DO! ,T-E! *4+A! +D,C! ()=!  )$*?!! !" '(;#!$ )$*?%!& ,T-E'!( ,T-E)!* 6t7U+!, A$Bo-!. 3D4S/!0 78[1!2 89]3!4 1$2O5!6 89]7!8 <T=e9!: =d>g;!< >t?i=!> 3D4S?!@ *4+AA! ! !	  !	  !	  !	  !	 r2   r   c                    | j         S r   )r   )r|   s    r3   r   zCompilerHolder.compiler   s    r2   deps!T.List['dependencies.Dependency']compile_onlyr=   endlr6   c                   d}d}g }|D ]}t          |t          j                  r#t          j        dd| j        | j                   ?t          |t          j                  r|r\d|j        z   }n|j        }|	                    |           |s|S t          |          dk    r|n|}	|d}|	                    d	                    |                    |z   S )
Nzwith dependency {}zwith dependencies {}z6compiler method "dependencies" kwarg with internal depz0.57.0locationz-lr   r   , )r   r   InternalDependencyr   
single_use
subprojectcurrent_nodeExternalLibraryrC   appendlenformatr   )
r|   r   r   r   
msg_singlemsg_manynamesdrC   tpls
             r3   _dep_msgzCompilerHolder._dep_msg   s   )
) 	 	A!\<== %&^`hjnjy/3/@B B B B!\9::  af}vLL 	Ke**q..hhj<Dzz$))E**++d22r2   r9   r~   r   r   c                    | j         j        S r   )r   r   r   s      r3   r   zCompilerHolder.version_method        }$$r2   r8   c                    | j         j        S r   )r   exelistr   s      r3   r   zCompilerHolder.cmd_array_method  r  r2   r<   moder   c                $   g }|d         D ]w}|                     | j                                        | j                                                  D ]0}|                    | j                            |d                     1x|d         s|| j                            d | j        j        | j	                  z  }|| j        
                    d | j        j        | j	                  z  }|t          j        u r>|                    | j                            d | j        j        | j	                             |                    dd          r,|                    | j                                                   |                    |d                    |S )Nr@   Fr>   rD   r9   )to_string_listr   get_source_dirget_build_dirextendr   get_include_argsget_option_compile_argsrm   r   get_option_std_argsr   LINKget_option_link_argsgetget_werror_args)r|   r   r  r9   iidirs         r3   _determine_argszCompilerHolder._determine_args	  sy   -. 	I 	IA(()9)H)H)J)JDL\LjLjLlLlmm I IDM::4GGHHHHI'( 	uDM99$@P@\^b^mnnnDDM55dD<L<XZ^ZijjjD',,,DM>>tTEUEacgcrssttt::h&& 	9KK5577888F6N###r2   F:/T.Tuple[T.List['dependencies.Dependency'], str]c                \    t          j        |          }||                     |||          fS r   )r   get_leaf_external_dependenciesr
  )r|   r   r   r   s       r3   _determine_dependenciesz&CompilerHolder._determine_dependencies  s-    :4@@T]]4t<<<<r2   zcompiler.alignmentT.Tuple[str]'AlignmentKw'r   c           
        |d         }|                      |d         | j        j                  \  }}| j                            ||d         | j        |d         |          \  }}|rt          j        d          nd}t          j        d	t          j        |d
          |t          j        t          |                    |           |S )Nr   r   r   r7   r9   
extra_argsr   (cached)r   zChecking for alignment ofT)
r#  r   is_crossr   r   r	   bluelogboldr6   )	r|   r9   r   typenamer   msgresultcached
cached_msgs	            r3   r   zCompilerHolder.alignment_method  s     7001GVZVcVl0mm	c006(;KTM]<B6N>B 1 D D /5<TYz***"
,8T**C3v;;1G1G	U 	U 	Ur2   zcompiler.run T.Tuple['mesonlib.FileOrString']'CompileKW'rl   c           	        | j         j        dvr=t          j        d| j                                          dd| j        | j                   |d         }|d         }t          || j        d	          \  }}}|rT|r>t          j	        d
t          j
        |d          ddt          j
        |          d           t          ddddd          S t          |t          j                  rV| j                            |           t          j                            |                    | j        j                            }t+          j        | j        |          }|                     |d         dd           \  }	}
| j                             || j        ||	          }|r!|j        dk    rt7          d|r|nd           |r|j        st          j        d          }n=|j        dk    rt          j        d          }nt          j        d|j         d          }t          j	        d
t          j
        |d          |
d|           |S )N>   cr  cppobjcobjcppfortranzcompiler.run for z	 languager   r   r   rC   Fr   Checking ifTzruns:skipped: featuredisabledr   )rq   rp   rr   rs   r2  r   r   r   r(  zCould not run codezDID NOT COMPILEYESzNO ())r   languager   r   get_display_languager   r   r   r	   r-  r.  r   r   r   Filerm   add_build_def_filefrom_absolute_filerel_to_builddirr   
source_dir	functoolspartialr  r#  r   rp   r   rq   redgreen)r|   r9   r   r@  testnamer>  requiredfeaturer)  r   r0  r1  hs                r3   r   zCompilerHolder.run_method/  sl    =!)WWW!"edm6X6X6Z6Z"e"e"e")4?TEVX X X XAw&>&<VT_^c&d&d&d#(G 	^ @	(D(A(A7L^`d`ijq`r`rt~dqBW\]]]]dHM** 	C//555=33$$T%5%@AAC CD&t';VDD
001GV[bf0gg	c""4)9j04 # 6 6 	\)Q..&'ZH8XRX'Z'Z[[[ 	P? :H.//"a''Ju%%H8F$588899H]DIh$=$=sGQOOOr2   c                4    | j                                         S r   )r   r   r   s      r3   r   zCompilerHolder.get_id_methodS  s     }##%%%r2   zcompiler.get_linker_idz0.53.0c                4    | j                                         S r   )r   r   r   s      r3   r   z#CompilerHolder.get_linker_id_methodX  s     }**,,,r2   c                @    | j                             | j                  S )z
        Check if the compiler prefixes _ (underscore) to global C symbols
        See: https://en.wikipedia.org/wiki/Name_mangling#C
        )r   r   r   r   s      r3   r   z4CompilerHolder.symbols_have_underscore_prefix_method^  s     };;D<LMMMr2   zcompiler.has_memberT.Tuple[str, str]'HasKW'c           
     ,   |\  }}t          || j        d          \  }}}|rTt          j        dt          j        |d          dt          j        |d          dt          j        |          d           dS t          j        | j        |          }|                     |d                   \  }	}
| j	        
                    ||g|d	         | j        ||	
          \  }}|rt          j        d          nd}|r1|s/t          | j	                                         d|d|d          |rt          j        d          }nt          j        d          }t          j        dt          j        |d          dt          j        |d          |
||           |S )NFr   TypeTz
has memberr=  r>  r   r7   r(  r*  r   z member 	 of type  not usablerA  NOChecking whether type)r   r   r	   r-  r.  rJ  rK  r  r#  r   r   r   r,  r   rD  rM  rL  )r|   r9   r   r/  
membernamer>  rO  rP  r)  r   r0  hadr2  r3  hadtxts                  r3   r   z CompilerHolder.has_member_methodg  s     $*&<VT_^c&d&d&d#(G 	HVTYx66diPZ\`FaFacuw{  xA  BI  xJ  xJ  LV  W  W  W5&t';VDD
001GHH	cm//:,xHX040@;E=A 0 C CV /5<TYz***"
 	$C 	$&$-*L*L*N*N  (G  (GXb  (G  (Gow  (G  (G  (G  H  H  H 	$Z&&FFXd^^F($)Hd*C*CtyT::C	U 	U 	U
r2   zcompiler.has_membersr   )varargsmin_varargsT.Tuple[str, T.List[str]]c           
     @   |\  }}t          j        d                    d |D                                 }t          || j        d          \  }}}|rAt          j        dt          j        |d          d|dt          j        |          d	           dS t          j        | j        |          }	| 	                    |d
                   \  }
}| j
                            |||d         | j        |	|
          \  }}|rt          j        d          nd}|r1|s/t          | j
                                         d|d|d          |rt          j        d          }nt          j        d          }t          j        dt          j        |d          d||||           |S )Nr   c                    g | ]}d | d 	S )"r1   ).0ms     r3   
<listcomp>z5CompilerHolder.has_members_method.<locals>.<listcomp>  s     &E&E&EAx1xxx&E&E&Er2   Fr   rX  Tzhas membersr=  r>  r   r7   r(  r*  r   z	 members rY  rZ  rA  r[  r\  )r	   r.  r   r   r   r-  rJ  rK  r  r#  r   r   r   r,  r   rD  rM  rL  )r|   r9   r   r/  membernamesmembersr>  rO  rP  r)  r   r0  r^  r2  r3  r_  s                   r3   r   z!CompilerHolder.has_members_method  s    !%+)DII&E&E&E&E&EFFGG&<VT_^c&d&d&d#(G 	HVTYx66wPbdhdmnudvdv  yC  D  D  D5&t';VDD
001GHH	cm//+vhGW040@;E=A 0 C CV /5<TYz***"
 	$C 	$&$-*L*L*N*N  (I  (IYd  (I  (Iqy  (I  (I  (I  J  J  J 	$Z&&FFXd^^F($)Hd*C*Cfj	B 	B 	B
r2   zcompiler.has_functionc                   |d         }t          || j        d          \  }}}|r?t          j        dt          j        |d          dt          j        |          d           dS |                     |          }|                     |d         d	          \  }}	| j                            ||d
         | j	        ||          \  }
}|rt          j
        d          nd}|r.|
s,t          | j                                         d|d          |
rt          j        d          }nt          j        d          }t          j        dt          j        |d          |	||           |
S )Nr   Fr   zHas functionTr=  r>  r   r'  r7   r(  r*  r   z
 function rZ  rA  r[  zChecking for function)r   r   r	   r-  r.  r  r#  r   r   r   r,  r   rD  rM  rL  )r|   r9   r   funcnamer>  rO  rP  r)  r   r0  r^  r2  r3  r_  s                 r3   r   z"CompilerHolder.has_function_method  s    7&<VT_^c&d&d&d#(G 	H^TYx%>%>@RTXT]^eTfTfhrsss5))&11
001GV[0\\	cm006(;KTM]<F>B 1 D DV /5<TYz***"
 	$C 	$&$-*L*L*N*N'q'qZb'q'q'qrrr 	$Z&&FFXd^^F($)Hd*C*CS&R\]]]
r2   zcompiler.has_typec                   |d         }t          || j        d          \  }}}|r?t          j        dt          j        |d          dt          j        |          d           dS t          j        | j        |          }|                     |d                   \  }}	| j	        
                    ||d	         | j        ||
          \  }
}|rt          j        d          nd}|r.|
s,t          | j	                                         d|d          |
rt          j        d          }nt          j        d          }t          j        dt          j        |d          |	||           |
S )Nr   Fr   zHas typeTr=  r>  r   r7   r(  r*  r   z type rZ  rA  r[  zChecking for type)r   r   r	   r-  r.  rJ  rK  r  r#  r   r   r   r,  r   rD  rM  rL  )r|   r9   r   r/  r>  rO  rP  r)  r   r0  r^  r2  r3  r_  s                 r3   r   zCompilerHolder.has_type_method  sx    7&<VT_^c&d&d&d#(G 	HZ8T!:!:<NPTPYZaPbPbdnooo5&t';VDD
001GHH	cm,,Xvh7GIY8BQU - W WV.4<TYz***"
 	$C 	$&$-*L*L*N*N'm'mV^'m'm'mnnn 	$Z&&FFXd^^F$di$&?&?fjYYY
r2   zcompiler.compute_intz0.40.0rK   rJ   rI   'ComputeIntKW'c           
     p   |d         }t          j        | j        |          }|                     |d         | j        j                  \  }}| j                            ||d         |d         |d         |d         | j        ||          }t          j	        d	t          j
        |d
          ||           |S )Nr   r   r'  rK   rJ   rI   r7   r(  zComputing int ofT)rJ  rK  r  r#  r   r+  r   r   r	   r-  r.  )r|   r9   r   
expressionr)  r   r0  rk   s           r3   r   z!CompilerHolder.compute_int_method  s     !W
&t';VDD
001GVZVcVl0mm	cm''
F5M6&>(.w9I(,(8Z59 ( ; ; 	#TYz4%@%@#sKKK
r2   zcompiler.sizeof
'CommonKW'c           
        |d         }t          j        | j        |          }|                     |d         | j        j                  \  }}| j                            ||d         | j        ||          \  }}|rt          j	        d          nd}	t          j
        dt          j        |d	          |t          j        t          |                    |	           |S )
Nr   r   r'  r7   r(  r*  r   zChecking for size ofT)rJ  rK  r  r#  r   r+  r   r   r	   r,  r-  r.  r6   )
r|   r9   r   elementr)  r   r0  esizer2  r3  s
             r3   r   zCompilerHolder.sizeof_method  s     q'&t';VDD
001GVZVcVl0mm	c,,WfX6FHX8BQU - W Wv.4<TYz***"
'7D))3	#e**0E0Ez	S 	S 	Sr2   zcompiler.get_definec                z   |d         }t          j        | j        |          }|                     |d                   \  }}| j                            ||d         | j        ||          \  }}|rt          j        d          nd}	|dn|}
t          j	        dt          j
        |d	          ||
|	           ||ndS )
Nr   r   r7   r(  r*  r   z(undefined)zFetching value of defineT)rJ  rK  r  r#  r   r   r   r	   r,  r-  r.  )r|   r9   r   rs  r)  r   r0  valuer2  r3  	value_msgs              r3   r   z CompilerHolder.get_define_method  s     q'&t';VDD
001GHH	c00&:JDL\<F>B 1 D Dv /5<TYz***"
%*]MM	+TYw-E-EsIWabbb)uur1r2   zcompiler.has_definer   c                   |d         }t          j        | j        |          }|                     |d         d           \  }}| j                            ||d         | j        ||          \  }}|rt          j        d          nd}	|t          j	        d          nt          j
        d	          }
t          j        d
t          j        |d          |d|
|	           |d uS )Nr   r   r   r7   r(  r*  r   rA  r[  zChecking if defineTzexists:)rJ  rK  r  r#  r   r   r   r	   r,  rM  rL  r-  r.  )r|   r9   r   define_namer)  r   r0  rv  r2  r3  rQ  s              r3   r   z CompilerHolder.has_define_method  s     1g&t';VDD
001Gd0SS	c00fX>NPTP`<F>B 1 D Dv /5<TYz***"
!&!2DJu%tyd'C'CS)UVXbcccD  r2   zcompiler.compilesc           	        |d         }|d         }t          || j        d          \  }}}|rB|r>t          j        dt          j        |d          ddt          j        |          d	           dS t          |t          j                  r|j        r"t          j
        d
d| j        d| j                   | j                            |           t          j                            |                    | j        j        | j        j                            }t'          j        | j        |          }|                     |d         d           \  }	}
| j                            || j        ||	          \  }}|r|st3          d|           |ro|rt          j        d          }nt          j        d          }|rt          j        d          nd}t          j        dt          j        |d          |
d||           |S )Nr   rC   Fr   r<  Tz	compiles:r=  r>  z1compiler.compiles with file created at setup time1.2.03It was broken and either errored or returned false.r   ry  r(  zCould not compile rA  r[  r*  r   )r   r   r	   r-  r.  r   r   rE  is_builtr   r   r   rm   rF  rG  absolute_pathr   rI  	build_dirrJ  rK  r  r#  r   r   r   rM  rL  r,  )r|   r9   r   r@  rN  r>  rO  rP  r)  r   r0  r1  r2  rQ  r3  s                  r3   r   zCompilerHolder.compiles_method  s,    Aw&>&<VT_^c&d&d&d#(G 	 D	(D(A(A;Pbdhdmnudvdv  yC  D  D  D5dHM** 	]} p%&Y[bdhds&[]a]np p p//555=33""4#3#>@P@Z[[] ]D&t';VDD
001Gd0SS	c//d6F;E=A 0 C C  	HF 	H&'FH'F'FGGG 	` #Ju%%HTNN28@:...bJH]DIh$=$=sKQRT^___r2   zcompiler.linksc           	     t   |d         }|d         }t          || j        d          \  }}}|rB|r>t          j        dt          j        |d          ddt          j        |          d	           dS d }t          |t          j                  r>|j        r"t          j
        d
d| j        d| j                   | j                            |           t          j                            |                    | j        j        | j        j                            }|j        }	|	| j        j        vr| j        j        }
| j        j        j        |
         }|	t2          vrt          j        d|            n[t2          |	         |vr9t          j        dt2          |	          d|
                                 d           n|t2          |	                  }t9          j        | j        |          }|                     |d         dd           \  }}| j                             || j        |||          \  }}|r|stC          d|r|nd           |ro|rt          j"        d          }nt          j#        d          }|rt          j$        d          nd}t          j        dt          j        |d          |d||           |S )Nr   rC   Fr   r<  Tzlinks:r=  r>  z.compiler.links with file created at setup timer|  r}  zUnknown suffix for test file zPassed z+ source to links method, not specified for z	 machine.r   r?  )r   r)  r   zCould not link r@  rA  r[  r*  r   )%r   r   r	   r-  r.  r   r   rE  r~  r   r   r   rm   rF  rG  r  r   rI  r  suffixr   file_suffixesfor_machinecoredata	compilersr
   warningget_lower_case_namerJ  rK  r  r#  r   r   rM  rL  r,  )r|   r9   r   r@  rN  r>  rO  rP  r   r  r  clistr)  r   r0  r1  r2  rQ  r3  s                      r3   r   zCompilerHolder.links_method,  s    Aw&>&<VT_^c&d&d&d#(G 	 A	(D(A(A8M_aeajkrasasu  A  A  A5dHM** 	=} p%&VX_aeap&[]a]np p p//555=33""4#3#>@P@Z[[] ]D[FT]888"m7(1;KH//L!G!G!GHHHH#F+588L  "[>&+A  "[  "[ny  oN  oN  oP  oP  "[  "[  "[  \  \  \  \$^F%;<H&t';VDD
001GV[bf0gg	c,,T43C6>8B:> - @ @  	]F 	]&'[X9YSY'['[\\\ 	] #Ju%%HTNN28@:...bJH]DIh$=$=sHaQ[\\\r2   zcompiler.check_headerz0.47.0
'HeaderKW'c                   |d         }t          || j        d          \  }}}|r?t          j        dt          j        |d          dt          j        |          d           dS t          j        | j        |          }|                     |d                   \  }}	| j	        
                    ||d	         | j        ||
          \  }
}|rt          j        d          nd}|r.|
s,t          | j	                                         d|d          |
rt          j        d          }nt          j        d          }t          j        dt          j        |d          |	||           |
S )Nr   Fr   zCheck usable headerTr=  r>  r   r7   r(  r*  r    header rZ  rA  r[  )r   r   r	   r-  r.  rJ  rK  r  r#  r   r   r   r,  r   rD  rM  rL  )r|   r9   r   hnamer>  rO  rP  r)  r   r0  hazr2  r3  rQ  s                 r3   r   z"CompilerHolder.check_header_method^  s{    Q&<VT_^c&d&d&d#(G 	H*DIeT,B,BDVX\XabiXjXjlvwww5&t';VDD
001GHH	cm00x8H$JZ<F>B 1 D DV /5<TYz***"
 	C 	&$-*L*L*N*N'l'lX]'l'l'lmmm 	
5!!AAA&	%(>(>Q
SSS
r2   r  c                   t          || j        d          \  }}}|r?t          j        dt          j        |d          dt          j        |          d           dS t          j        | j        |          }|                     |d                   \  }}| j	        
                    ||d         | j        ||	          \  }	}
|
rt          j        d
          nd}|r.|	s,t          | j	                                         d|d          |	rt          j        d          }nt          j        d          }t          j        dt          j        |d          |||           |	S )NFr   z
Has headerTr=  r>  r   r7   r(  r*  r   r  z
 not foundrA  r[  )r   r   r	   r-  r.  rJ  rK  r  r#  r   r   r   r,  r   rD  rM  rL  )r|   r  r   r>  rO  rP  r)  r   r0  r  r2  r3  rQ  s                r3   _has_header_implzCompilerHolder._has_header_implv  sj   &<VT_^c&d&d&d#(G 	H\49UD#9#9;MtyY`OaOacmnnn5&t';VDD
001GHH	cm..ufX6FHX:DSW / Y YV.4<TYz***"
 	C 	&$-*L*L*N*N'k'kX]'k'k'klll 	
5!!AAAty55sAzJJJ
r2   zcompiler.has_headerc                :    |                      |d         |          S Nr   )r  r   s      r3   r   z CompilerHolder.has_header_method  s     $$T!Wf555r2   zcompiler.has_header_symbolc           
     (   |\  }}t          || j        d          \  }}}|rTt          j        dt          j        |d          dt          j        |d          dt          j        |          d           dS t          j        | j        |          }|                     |d                   \  }	}
| j	        
                    |||d	         | j        ||	
          \  }}|r0|s.t          | j	                                         d| d|           |rt          j        d          }nt          j        d          }|rt          j        d          nd}t          j        dt          j        |d          dt          j        |d          |
||           |S )NFr   HeaderTz
has symbolr=  r>  r   r7   r(  z symbol z not found in header rA  r[  r*  r   )r   r   r	   r-  r.  rJ  rK  r  r#  r   r   r   r   rD  rM  rL  r,  )r|   r9   r   r  symbolr>  rO  rP  r)  r   r0  r  r2  rQ  r3  s                  r3   r   z'CompilerHolder.has_header_symbol_method  s    v&<VT_^c&d&d&d#(G 	HXty55|TYvW[E\E\^prvr{  }D  sE  sE  GQ  R  R  R5&t';VDD
001GHH	cm55eVVHEUW[WgAKCG 6 I IV  	C 	&$-*L*L*N*N'|'|X^'|'|uz'|'|}}} 	
5!!AAA.4<TYz***"
49UD11<6SWAXAXZ]_`blmmm
r2   libname'dependencies.ExternalLibrary'c                V    t          j        |d | j        | j        j        d          }|S )NT)silent)r   r  r   r   rC  )r|   r  libs      r3   notfound_libraryzCompilerHolder.notfound_library  s5    *7D+/+;+/=+A268 8 8 
r2   zcompiler.find_libraryrO  Tr   rW   r   )r   r   r   rX   z0.51.0)r   rV   z0.49.0r   dirsr   c              #  R   K   | ]"}|                     d |j                   V  #dS )header_)rC   N)evolverC   )rf  ks     r3   	<genexpr>zCompilerHolder.<genexpr>  s;      	A	A!((*!&**(
+
+	A	A	A	A	A	Ar2   'FindLibraryKW'c                V   |d         }t          || j                  \  }}}|rQt          j        dt          j        |          dt          j        |          d           |                     |          S ||d         |d         |d         |d         |d	         d
}|d         D ]/}|                     ||          s|                     |          c S 0t          |          }	| j        j	        j
                            t          d                    }
|d         du rt          j        j        }nA|d         du rt          j        j        }n%|
rt          j        j        }nt          j        j        }| j                            || j        |	|          }|rn|sl|t          j        j        k    rd}n|j                                        }t/          d                    | j                                        ||                    t5          j        ||| j        | j        j                  }|S )Nr   Libraryr=  r>  rY   rZ   r[   r]   r\   )rO  r9   r   r@   r7   r>   rW   prefer_staticrX   TFzshared or staticz{} {} library {!r} not found)r   r   r	   r-  r.  r  r  r   r   r  optstoreget_value_forr   r   LibTypeSTATICSHAREDPREFER_STATICPREFER_SHAREDr   r   rC   lowerr   r  rD  r   r  rC  )r|   r9   r   r  r>  rO  rP  has_header_kwargsrQ  search_dirsr  libtypelinkargs	libtype_sr  s                  r3   r   z"CompilerHolder.find_library_method  sN    q'&<VT_&U&U#(G 	2HY	' 2 24F	RYHZHZ\fggg((111
 !=)"#89#)*F#G_-%&>?)
 )
 & 	6 	6A((,=>> 6,,W555556 *&11(1:HHSbIcIcdd(t##&-GGH&&&-GG 	5&4GG&4G=--gt7GV]^^ 	DH 	D(*888.		#L..00	&'E(.t}/Q/Q/S/S/8')C )CD D D *7Hd>N+/=+AC C
r2   N	argumentsT.Union[str, T.List[str]]re   T.Optional['ExtractRequired']c                   t          |t                    r|g}d| j                                        d                    |t
          j        u rdnd          d                    d                    |                    g}|pddi}t          || j	        d	          \  }}}|r*|d
t          j        |          dgz  }t          j        |  dS |t
          j        u r| j        j        n| j        j        } ||| j                  \  }	}
|r|	s|dgz  }t!          | ||	rt          j        d          nt          j        d          |
rt          j        d          ndgz  }t          j        |  |	S )zIShared implementation for methods checking compiler and linker arguments.zCompiler forz
supports{}z linkr   zarguments {}: rO  Fr   r=  r>  
not usablerA  r[  r*  )r   r6   r   rD  r  re   rh   r   r   r   r	   r.  r-  r   r   r   r   rM  rL  r,  )r|   r  r  r   logargsr>  rO  rP  testr1  r2  s              r3   _has_argument_implz!CompilerHolder._has_argument_impl  s   
 i%% 	$"IM..00493C+C+CLL""388I#6#677	$
 .J.&<VT_^c&d&d&d#(G 	*DIg,>,>
KKGHg59=AQ9Q9Qt}55W[WdWxi)9:: 	1F 	1~%G&00!';DJuTXd^^%+3DIj!!!
 	
 	'r2   zcompiler.has_argument'HasArgumentKW'c                >    |                      |d         g|          S Nr   )r   r  r   s      r3   r   z"CompilerHolder.has_argument_method  s#     &&Qy&@@@r2   zcompiler.has_multi_arguments)r`  z0.37.0T.Tuple[T.List[str]]c                <    |                      |d         |          S r  r  r   s      r3   r   z)CompilerHolder.has_multi_arguments_method
  s!     &&tAwv&>>>r2   z compiler.get_supported_argumentsz0.43.0r+   offz0.59.0>   r  warnrequire)r   r   	validator'GetSupportedArgumentKw'c                2   g }|d         }|d         D ]}|                      |g          sVd| j                                         d| d}|dk    rt          j        |           S|dk    rt          j        |          n|                    |           |S )Nr+   r   Compiler for z does not support "re  r  r  )r  r   rD  r	   r  r   MesonExceptionr  )r|   r9   r   supported_argsr+   argr0  s          r3   r   z-CompilerHolder.get_supported_arguments_method  s     ')#7 	+ 	+C**C511 +edm&H&H&J&Jee_beeef$$L%%%%	))"1#666 * %%c****r2   z!compiler.first_supported_argumentc                    |d         D ]D}|                      |g          r,t          j        dt          j        |                     |gc S Et          j        dt          j        d                     g S )Nr   zFirst supported argument:None)r  r	   r-  r.  rL  r|   r9   r   r  s       r3   r   z.CompilerHolder.first_supported_argument_method&  s~     7 	 	C&&u-- 4dinnEEEu 	,dhv.>.>???	r2   zcompiler.has_link_argumentz0.46.0c                T    |                      |d         gt          j        |          S Nr   )r  r   r  re   rh   r   s      r3   r   z'CompilerHolder.has_link_argument_method0  s)     &&Qyy7GPV&WWWr2   z compiler.has_multi_link_argumentc                R    |                      |d         t          j        |          S r  r  r   s      r3   r   z.CompilerHolder.has_multi_link_arguments_method6  s&     &&tAwY5Ef&UUUr2   z%compiler.get_supported_link_argumentsc                    g }|d         D ]9}|                      |gt          j                  r|                    |           :|S )Nr   r  )r  re   rh   r  )r|   r9   r   r  r  s        r3   r   z2CompilerHolder.get_supported_link_arguments_method<  sW     ')7 	+ 	+C&&u93C&DD +%%c***r2   z-compiler.first_supported_link_argument_methodz&compiler.first_supported_link_argumentc                   |d         D ]P}|                      |gt          j                  r,t          j        dt          j        |                     |gc S Qt          j        dt          j        d                     g S )Nr   r  zFirst supported link argument:r  )r  re   rh   r	   r-  r.  rL  r  s       r3   r   z3CompilerHolder.first_supported_link_argument_methodF  s     7 	 	C&&u93C&DD 949S>>JJJu 	148F3C3CDDD	r2   attrc                   d| j                                          d| dg}|pddi}t          || j        d          \  }}}|r*|dt	          j        |          dgz  }t	          j        |  dS | j                             || j                  \  }}|r|s|d	gz  }t          | ||rt	          j
        d
          nt	          j        d          |rt	          j        d          ndgz  }t	          j        |  |S )z-Common helper for function attribute testing.r  z supports function attribute r  rO  Fr   r=  r>  r  rA  r[  r*  r   )r   rD  r   r   r	   r.  r-  has_func_attributer   r   rM  rL  r,  )	r|   r  r   r  r>  rO  rP  r^  r2  s	            r3   _has_function_attribute_implz+CompilerHolder._has_function_attribute_implQ  s3    gDM>>@@ff_cfff$
 .J.&<VT_^c&d&d&d#(G 	*DIg,>,>
KKGHg5m66tT=MNNV 	1C 	1~%G&00!$8DJu$(4..%+3DIj!!!
 	
 	'
r2   zcompiler.has_function_attributez0.48.0c                :    |                      |d         |          S r  r  r   s      r3   r   z(CompilerHolder.has_func_attribute_methodg  s     00a&AAAr2   z*compiler.get_supported_function_attributesc                ,      fd|d         D             S )Nc                >    g | ]}                     |          |S r1   r  )rf  ar|   s     r3   rh  zKCompilerHolder.get_supported_function_attributes_method.<locals>.<listcomp>q  s,    KKKad&G&G&J&JKKKKr2   r   r1   r   s   `  r3   r   z7CompilerHolder.get_supported_function_attributes_methodm  s$     LKKK47KKKKr2   z#compiler.get_argument_syntax_methodc                4    | j                                         S r   )r   r   r   s      r3   r   z)CompilerHolder.get_argument_syntax_methods  s     }00222r2   zcompiler.preprocessz0.64.0z1.3.2rb   z-compile_args were ignored before this version)extra_messagera   z@PLAINNAME@.i1.1.0z1.4.0(T.Tuple[T.List['mesonlib.FileOrString']]'PreprocessKW'T.List[build.CustomTargetIndex]c                f  	 | j                                         }| j                            |d                   }t	          j        d|          }t          d |D                       r"t          j        dd| j	        | j
                   t          | j        | j        j                           }|dk    r"t          j        dd| j	        | j
                   d| }t          j        || j        j        | j	        | j        ||d	         || j        j        |d
         |d         |d         |d                   	| j                            	j        	           t(          j                            | j        j                            	          | j        j                  	fd	j        D             S )Nr   zT.List[SourceOutputs]c              3  x   K   | ]5}t          |t          j        t          j        t          j        f          V  6d S r   )r   r   CustomTargetCustomTargetIndexGeneratedList)rf  ss     r3   r  z3CompilerHolder.preprocess_method.<locals>.<genexpr>  s=      rrefz!e0%2I5K^_``rrrrrrr2   z*compiler.preprocess with generated sourcesr  r   z'compiler.preprocess used multiple timespreprocessor_ra   rb   r@   r   rc   c           	     v    g | ]5}t          j        t          j                            |                    6S r1   )r   r  ospathr   )rf  oprivate_dirtgs     r3   rh  z4CompilerHolder.preprocess_method.<locals>.<listcomp>  s6    ^^^a'BGLLa,H,HII^^^r2   )r   get_preprocessorrm   source_strings_to_filesTcastanyr   r   r   r   nextr   subdirr   CompileTargetr   backend
add_targetrC   r  r  relpathget_target_private_diroutputs)
r|   r9   r   r   _sourcessources
tg_countertg_namer  r  s
           @@r3   r   z CompilerHolder.preprocess_methody  s    =1133*.*:*R*RSWXYSZ*[*[&0(;;rrjqrrrrr 	>!"NPWY]Yh+/+<> > > > $-d.>.EFGG
>>!"KWVZVe+/+<> > > >.*.. #O8$>"()>"9  	##BGR000 good&6&>&U&UVX&Y&Y[_[k[rss^^^^^SUS]^^^^r2   )r   r   rm   rn   )r   r   )r   r   r   r=   r   r6   r   r6   r   )r9   r~   r   r   r   r8   )r   r<   r  r   r   r8   )Fr  )r   r   r   r=   r   r6   r   r   )r9   r$  r   r%  r   r   )r9   r4  r   r5  r   rl   r   )r9   rU  r   rV  r   r=   )r9   rb  r   rV  r   r=   )r9   r$  r   rV  r   r=   )r9   r$  r   rn  r   r   )r9   r$  r   rq  r   r   )r9   r$  r   rq  r   r6   )r9   r$  r   rq  r   r=   )r9   r4  r   r5  r   r=   )r9   r$  r   r  r   r=   )r  r6   r   r  r   r=   )r9   rU  r   r  r   r=   )r  r6   r   r  )r9   r$  r   r  r   r  )r  r  r  re   r   r  r   r=   )r9   r$  r   r  r   r=   )r9   r  r   r  r   r=   )r9   r  r   r  r   r8   )r9   r  r   r   r   r8   r   )r  r6   r   r  r   r=   )r9   r  r   r  r   r  )Zr-   r.   r/   collectionsdefaultdict	itertoolscountr   r0   ru   propertyr   r
  r   r   r   r   r   r  r  r#  r   r6   r   r   r   r   r   r   rE  r   r   r   r   r   r   _HAS_REQUIRED_KWr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r   r=   r   UserFeatureOptionr   r   r   re   rg   r  r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r  r  r  r   r  r   r   r   r   s   @r3   r   r      s        3J;3J9?3[3[N[[[[$  $  $  $  $  $ L       X 3 3 3 3. % % % X Y% % % % X Y% 2B1F     = = = = = ^(#..\	 	 	 	  /.	 ^NS(-$899\.1=111      21 :9 D & & & X Y& Z((33- - - 43 X Y- N N N X YN ^)344\')9HKHHH   IH 54. ^*C!LLL\(*:I[III   JI ML2 ^+S11\)+;JkJJJ   KJ 21* ^'--\%'7F+FFF   GF .-( Z&11^*C00\	%#x))	&3/**	'C?++	
 
  	 	 	  10 21	 ^%s++\#2k222	 	 	 32 ,+	 Z%x00^)3//\'6+666
2 
2 
2 76 0/ 10
2 Z%w//^)3//\'6+666! ! ! 76 0/ 0/! ^'#x})=>>\%6666      76 ?> D ^$sHM&:;;\"3]333. . . 43 <;.` Z'22^+S11\)8K888   98 21 32*   & ^)3//\'6+6666 6 6 76 0/6 ^0#s;;\.====   >= <;*    ^+S11\	*tW%>?NNN	-!2!24!=!=tUW_ghhh	(T8,H===	*dEBBB	&++D#66bQQQ 
B	A[	A	A	A  - - -  21 -` .7-?CG    > ^+S11\)+;<<A A A =< 21A ^2C@@@\02BCCZ.99? ? ? :9 DC A@? Z2H==^6DDD\*	)S%x,,-G-G-GHH	J 	J 	J 
    ED >= ^7EEE   FE X Z,h77^0#66\.0@AAX X X BA 76 87X Z2H==^6DDD\46FGGV V V HG ED >=V Z7BB^;SIII   JI X CB Z?JJ^<cJJJ   KJ X KJ    , Z18<<^5s;;\35EFFB B B GF <; =<B Z<hGG^@#NNNL L L ON X HGL Z5x@@3 3 3 X Y A@3 Z%x00+W~6F  WF  G  G  G^)CHZ\a\suz  vI  4J  XY  Z  Z  Z\	(C999	."3"3D#">">VXYYYg..)) _ _ _  Z  Z G  G 10_ _ _ _ _r2   r   r    )\
__future__r   r  enumrJ  r  r  typingr  r   r   r   r   r   r	   r  r
   r   compilers.compilersr   interpreterbaser   r   r   r   r   r   r   interpreterbase.decoratorsr   r   r   r   r   interpreterobjectsr   r   type_checkingr   r   r   TYPE_CHECKINGrm   r   r    r!   r"   r   r#   r$   r%   r&   typing_extensionsr'   r(   r*   r5   r<   rB   rF   rH   rM   rQ   rS   rU   r`   Enumre   rj   r   r6   r   r0   
Dependencyr   BuildTargetr  r  r   IncludeDirsr   r   r=   _NO_BUILTIN_ARGS_KW_NAME_KW
_WERROR_KWr   r  r   r   r  r   r1   r2   r3   <module>r     sb   # " " " " " "          				                                       1 1 1 1 1 1 1 1 2 2 2 2 2 25 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 d c c c c c c c c c c c       M M M M M M M M B B B B B B B B B B? Ga))))))$$$$$$77777777::::::::******&&&&&&444444443 3 3 3 3 3 3 36 6 6 6 6i 6 6 6    	   
    M?   6 6 6 6 6= 6 6 6
    x       8_       /          B B B B B): B B Ba a a a ay a a a    	   ' ' ' ' 'k2 ' ' '< $-9
dC  	$ $ $     BKdL344	B B B      ktjsdU.0BED[\]]	k k k     :CdE-..	: : :      'Y

D#
&
&'BBD D D
 D D D D  i 14GGG 9VS"---YxuGDDD
 #+,<>NPZ\o!p p p p p %-h8HJZ\o$.$6K$6We$T$T$T$V V V V V #5+"48U"S"S"S!bVa!b b b b b%;%GUCCC g_ g_ g_ g_ g_\*- g_ g_ g_ g_ g_r2   