
    8xdJl                        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	m
Z
 d dlmZmZmZ d dlmZ d dlZd dlZ	 d dlZn#  d dlZY nxY w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 m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(  e%e)          Z* G d dej+                  Z, G d dej-                  Z.	 	 	 	 d2dZ/	 	 	 	 d2dZ0d Z1de2de3de2de2fdZ4	 	 	 d3dZ5i a6	 	 	 	 	 	 	 d4dZ7	 d5d Z8	 	 	 	 	 	 d6d!Z9d" Z:d5d#Z;d5d$Z<d5d%Z=d7d&Z>d' Z?ej@        ejA        ejA        e?d(ZBd)ed*e2defd+ZC	 d8ddddd,d-e2d*ee2         fd.ZDd/e2d*e2fd0ZE	 	 	 	 d9d1ZFdS ):    N)partial)StringIO
TextIOBase)IOAnyOptionalwarn   )_load_setup_py_data)get_dict)CondaBuildException)get_env_dependencies)HashableDictapply_pin_expressionscheck_call_env	copy_intoensure_valid_specget_installed_packages
get_loggerrm_rf)DEFAULT_COMPILERSc                       e Zd ZdZg Zdej        j        dej        j	        fdZ
d xZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZ Z!d Z"d xZ#Z$d Z%d Z&d	 Z'd
 Z(d Z)ddZ*dS )UndefinedNeverFaila  
    A class for Undefined jinja variables.
    This is even less strict than the default jinja2.Undefined class,
    because it permits things like {{ MY_UNDEFINED_VAR[:2] }} and
    {{ MY_UNDEFINED_VAR|int }}. This can mask lots of errors in jinja templates, so it
    should only be used for a first-pass parse, when you plan on running a 'strict'
    second pass later.

    Note:
        When using this class, any usage of an undefined variable in a jinja template is recorded
        in the (global) all_undefined_names class member.  Therefore, after jinja rendering,
        you can detect which undefined names were used by inspecting that list.
        Be sure to clear the all_undefined_names list before calling template.render().
    Nc                 L    t           j                            | ||||           d S N)jinja2	Undefined__init__)selfhintobjnameexcs        9lib/python3.11/site-packages/conda_build/jinja_context.pyr   zUndefinedNeverFail.__init__;   s)     	!!$c4=====    c                 6    |                      | j                  S r   )_return_undefined_undefined_name)r    argskwargss      r%   <lambda>zUndefinedNeverFail.<lambda>n   s    4;Q;Q< < r&   c                     	 t                               | |          S # t          $ r$ |                     | j        dz   |z              Y d S w xY w)N.)object__getattr__AttributeErrorr(   r)   )r    ks     r%   r0   zUndefinedNeverFail.__getattr__t   sg    	C%%dA... 	C 	C 	C""4#7##=#ABBBBBB	Cs    *A
Ac                 ,    |                      d          S N _return_valuer    s    r%   r,   zUndefinedNeverFail.<lambda>|   s    d&8&8&<&< r&   c                 ,    |                      d          S r4   r6   r8   s    r%   r,   zUndefinedNeverFail.<lambda>}   s    t11"55 r&   c                 ,    |                      d          S )Nr   r6   r8   s    r%   r,   zUndefinedNeverFail.<lambda>~   s    4--a00 r&   c                 ,    |                      d          S )Ng        r6   r8   s    r%   r,   zUndefinedNeverFail.<lambda>   s    T//44 r&   c                 ,    |                      d          S )NFr6   r8   s    r%   r,   zUndefinedNeverFail.<lambda>   s    t11%88 r&   c                     t           j                            | j                   t          | j        | j        || j                  S )N)r!   r"   r#   r$   )r   all_undefined_namesappendr)   _undefined_hint_undefined_obj_undefined_exception)r    result_names     r%   r(   z$UndefinedNeverFail._return_undefined   sH    .55d6JKKK!%#)	
 
 
 	
r&   c                 N    t           j                            | j                   |S r   )r   r>   r?   r)   )r    values     r%   r7   z UndefinedNeverFail._return_value   s!    .55d6JKKKr&   r   )+__name__
__module____qualname____doc__r>   r   runtimemissing
exceptionsUndefinedErrorr   __add____radd____mul____rmul____div____rdiv____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pos____neg____call____getitem____lt____le____gt____ge____complex____pow____rpow__r0   __str____repr____unicode____int__	__float____nonzero__r(   r7    r&   r%   r   r   )   s          N",> > > >f Q*G ** 	*
 	* 	* 	* 	* 	* 	*" 	#*& 	'** 	+*. 	/*2 	3*6 	7*: 	;*> 	?*B 	C*F 	G*J 	K*N 	O*P 	(C C C =<<Gh55K00G44I88K
 
 
     r&   r   c                       e Zd ZdZd Zd ZdS )FilteredLoaderz
    A pass-through for the given loader, except that the loaded source is
    filtered according to any metadata selectors in the source text.
    c                 :    || _         |j        | _        || _        d S r   )_unfiltered_loaderlist_templatesconfig)r    unfiltered_loaderrq   s      r%   r   zFilteredLoader.__init__   s     "3/>r&   c                     ddl m}m} | j                            ||          \  }}} || || j                  t          | j        j                            ||fS )Nr   )get_selectorsselect_lines)variants_in_place)metadatart   ru   ro   
get_sourcerq   boolvariant)r    environmenttemplatert   ru   contentsfilenameuptodates           r%   rx   zFilteredLoader.get_source   s    99999999'+'>'I'I(
 (
$(H Ldk**"&t{':";";  
 
 	
r&   N)rF   rG   rH   rI   r   rx   rk   r&   r%   rm   rm      s<         
  

 
 
 
 
r&   rm   setup.pyFTc                    d }t           j                            t           j                            t                    d          }t           j                            | j        j        d          }t          ||           t          |           }d|d<   t           j        	                    | j        j
                  r| j        j
        || j        j        |g}	|r8|s
J d            |	                    d           |	                    d|g           |r|	                    d           t          |	|           t          t           j                            | j        j        d	                    5 }
t          j        |
          }d d d            n# 1 swxY w Y   n	 t#          j        |||| j        j        |
          }nh# t&          t(          f$ r Y nUt*          $ rI}|rt,                              d           n"t1          d                    |                    Y d }~nd }~ww xY wt5          t           j                            | j        j        d                     |r|ni S )Nz_load_setup_py_data.pyRENDERCONDA_BUILD_STATEz1recipe_dir must be set if from_recipe_dir is Truez--from-recipe-dirz--recipe-dirz--permit-undefined-jinja)envz conda_build_loaded_setup_py.json)from_recipe_dir
recipe_dirwork_dirpermit_undefined_jinjazReading setup.py failed due to missing modules.  This is probably OK, since it may succeed in later passes.  Watch for incomplete recipe info, though.zTCould not render recipe - need modules installed in root env.  Import error was "{}")ospathjoindirname__file__rq   r   r   get_environisfilebuild_pythonr?   extendr   openjsonloadr   load_setup_py_data	TypeErrorOSErrorImportErrorlogdebugr   formatr   )m
setup_filer   r   r   _setuptools_dataorigin_setup_scriptdest_setup_scriptr   r*   fes               r%   r   r      s    ',,
!!#;  QX%68PQQ!#4555
a..C'C	w~~ah+,, %%'8!(:KZX 	6RRRRRRKK+,,,KK4555! 	4KK2333t%%%%GLL*,NOO
 
 	,#y||	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,
	2E /%*'=      7# 	 	 	D 	 	 	% 
		$    *DDJF1II      	 
"',,qx(*B
C
CDDD/7R7s0   /FFF#G H&	H&?H!!H&c                 T    t          dt                     t          | ||||          S )Nzconda_build.jinja_context.load_setuptools is pending deprecation in a future release. Use conda_build.jinja_context.load_setup_py_data instead.)r   r   r   r   )r
   PendingDeprecationWarningr   )r   r   r   r   r   s        r%   load_setuptoolsr      sG     		D!  
 	'5   r&   c                      ddd} t          di | 5 }t          j        |          cd d d            S # 1 swxY w Y   d S )Nrzutf-8)modeencodingpackage.json)r   )r   r   r   )	mode_dictpkgs     r%   load_npmr      s    '22I		*	*		*	* cy~~                 s   377	file_namer   r   returnc                    t           j                            |           r| }n|r@|r>t           j                            t           j                            ||                     }nIt           j                            |j                  r%t           j                            |j        |           }t           j                            |          st          d|           |S )zGet the path to the given file which may be in the work_dir
    or in the recipe_dir.

    Note, the returned file name may not exist.
    zNo such file: )	r   r   isabsabspathr   existsr   r   FileNotFoundError)r   r   r   rq   r   s        r%   
_find_filer     s     
w}}Y 8	 8Z 8wrw||J	BBCC		(	( 8w||FOY777>>$ @ > > >???Kr&   c                 2   	 t          ||||           }t          |          5 }t          j        ||                                          cd d d            S # 1 swxY w Y   d S # t
          $ r(}|r t                              |           Y d }~d S  d }~ww xY wr   )r   r   researchreadr   r   r   )rq   	load_fileregex_patternr   r   r   lfiler   s           r%   load_file_regexr     s    	:y/:vNN	 )__ 	:9]EJJLL99	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:    ! 	IIaLLL44444	s.   A$ 'AAA$
B.BBBx.x.x.x.x.xxc	                 x   d}	|s|s|                                  t          | j        j                  f}
|
t          v rt          |
         }n| j        r'| j        s t          | d| j        j                  \  }}}nZt          | d| j        j                  \  }}}| j        r4t          | d| j        j                  \  }}}|                    |           |t          |
<   d |D             }|r|r1|	                    |          rd
                    ||                   }	n|p|	                    |          }|rrt          |d          rt          |t                    s	|d         }nt          |          }|r"|s|rdt          |          z   d	z   }	|	d
| z  }	nt          |||          }	|	st|sr|spt          j        d                    |                    }|                    |                                           r"t)          d                    |                    |	d
                    ||	f          n|S )aU  dynamically pin based on currently installed version.

    only mandatory input is package_name.
    upper_bound is the authoritative upper bound, if provided.  The lower bound is the the
        currently installed version.
    pin expressions are of the form 'x.x' - the number of pins is the number of x's separated
        by ``.``.
    r5   hostbuildc                 |    i | ]9}|                     d           d         |                     d           dd         :S ) r   r   N)split).0ps     r%   
<dictcomp>z"pin_compatible.<locals>.<dictcomp>W  s;    DDD!AGGCLLOQWWS\\!""%5DDDr&   r   __iter__r   z>=,<zpin_compatible\s*\(\s*["]{}["]z]Could not get compatibility information for {} package.  Is it one of your host dependencies?)r#   r   rq   rz   cached_env_dependenciesis_crossbuild_is_hostr   r   getr   hasattr
isinstancestrr   r   compiler   r   extract_requirements_textRuntimeError)r   package_namelower_boundupper_boundmin_pinmax_pinr   exactbypass_env_checkcompatibilitykeypins_	host_pinsversionsversionchecks                    r%   pin_compatibler   .  s   ( M  !Y$: !Y
 vvxxah&6778)))*3/DDz +!/ +1!VQX=MNN
a1!Wah>NOO
a? +&:1fahFV&W&WOIq!KK	***+/#C(DDtDDD 	Y Yl33 Y #,)? @ @%Cl)C)C 
Yw
33 /JwPS<T<T /")!*"%g,," Y" Fk F,03w<<,?#,EM%):[):)::(=gwPW(X(X !7 @P 
BII,WWXX<<335566 	77=vl7K7K   $ 	,.///r&   c                 V    d }|rt          |          dk    r	|d         }	nt          |          dk    r{d }	|D ]v\  }
t                                                    t           j        j                                                  z  }|rt           fd|D                       r|
f}	 nw|	|v r||	         d         }|r|                                sd }n|rrd                    |                                |                                |s|	                                n t          |                                          g          }nXd                    |                                t          |                                ||                    }n|d         d         }|S )Nr   r   c              3   P   K   | ] }|         j         j        |         k    V  !d S r   )rq   rz   )r   svrw   rz   s     r%   	<genexpr>z1pin_subpackage_against_outputs.<locals>.<genexpr>  sG       * *CEGBK8?#:2#>>* * * * * *r&   r   z{} {})lensetkeysrq   rz   allr   r   r#   build_idr   build_numberr   r   )rw   matching_package_keysoutputsr   r   r   r   skip_build_idpinr   pkg_nameshared_varssp_mrz   s   `            @r%   pin_subpackage_against_outputsr   w  s    C ). $%%**'*CC&''!++C%: 
 
!'
 "',,..11C8O8T8T8V8V4W4WW" c * * * * *IT* * * ' '  $W-CE	 '>>3<?D% dllnn  (( IIKK LLNN#0:DMMOOO!$T%6%6%8%8!9!9 CC "..		-dllnngwOO CC
 (*1-CJr&   c           
      H   d}t          | d          s|r}n_t          d          t          | j                                                  }	fd|	D             }
t          | |
| j        |||||          }|s(}|s$|s"t          d                                        |S )a  allow people to specify pinnings based on subpackages that are defined in the recipe.

    For example, given a compiler package, allow it to specify either a compatible or exact
    pinning on the runtime package that is also created by the compiler package recipe
    Nother_outputszoBug in conda-build: we need to have info about other outputs in order to allow pinning to them.  It's not here.c                 ,    g | ]}|d          k    |S )r   rk   )r   r2   subpackage_names     r%   
<listcomp>z"pin_subpackage.<locals>.<listcomp>  s'     L L LqAaDO4K4K4K4K4Kr&   )r   zDidn't find subpackage version info for '{}', which is used in a pin_subpackage expression.  Is it actually a subpackage?  If not, you want pin_compatible instead.)r   
ValueErrorlistr   r   r   r   )rw   r   r   r   r   r   allow_no_other_outputsr   r   r   r   s    `         r%   pin_subpackager     s     C8_-- 
! 	!CCB   H*//1122 L L L LD L L L,!""'	
 	
 	
  % 	.D 	3396/3J3J  
 Jr&   c                 &   | }|j         |j                             d          d         fD ]'}	 t          |         |          } n# t          $ r Y $w xY wt	          |d          r/|                    |j                            dd          d          }|S )N-r   r   pythonnopevs2017)platformr   r   KeyErrorr   r   rz   )languagerq   compilerr  s       r%   native_compilerr
    s    H_fo&;&;C&@&@&CD  	(28<HE 	 	 	H	x   P<< 2 28V D DhOOOs   A
AAc                    t          | |          }d}|j        r^|j                            d|j                  }|  d}|j                            ||          }|j                            |dz             }n|j        }d                    ||g          }|r(d                    ||f          }t          |d          }|S )	a{  Support configuration of compilers.  This is somewhat platform specific.

    Native compilers never list their host - it is always implied.  Generally, they are
    metapackages, pointing at a package that does specify the host.  These in turn may be
    metapackages, pointing at a package where the host is the same as the target (both being the
    native architecture).
    Ntarget_platform	_compiler_versionr   r   Fr	   )r
  rz   r   subdirr   r   )r  rq   r   r	  r   r  language_compiler_keys          r%   r	  r	    s     x00HG~ ( .,,->NN#+ 6 6 6>%%&;XFF.$$%:Z%GHH -
 xx?344H ;88Xw/00$XE:::Or&   c                     | |_         dS )Nccache)ccache_method)methodrq   r   s      r%   r  r    s    !F8r&   c                    d}|j         p|j        }|dk    s|dk    s|dk    s|dk    rd}|}n
|dk    rdnd	}|j        r6|j                            d
|          }|j                            d|          }d| v r`|                     d          d         }|                     d          dd         }|dz   |z   dz   |z   dz   d                    |          z   }n| dz   |z   dz   |z   }|S )a	  Support configuration of Core Dependency Trees.
    We should define CDTs in a single location. The current
    idea is to emit parts of the following to index.json (the
    bits that the solver could make use of) and parts to
    about.json (the other bits).
    "system": {
      "os": {
        "type": "windows", "linux", "bsd", "darwin",
        "os_distribution": "CentOS", "FreeBSD", "Windows", "osx",
        "os_version": "6.9", "10.12.3",
        "os_kernel_version" : "2.6.32",
        "os_libc_family": "glibc",
        "os_libc_version": "2.12",
      }
      "cpu": {
        # Whichever cpu_architecture/cpu_isa we build-out for:
        # .. armv6 is compatible with and uses all CPU features of a Raspberry PI 1
        # .. armv7a is compatible with and uses all CPU features of a Raspberry PI 2
        # .. aarch64 is compatible with and uses all CPU features of a Raspberry PI 3
        "cpu_architecture": "x86", "x86_64",
                            "armv6", "armv7a", "aarch32", "aarch64",
                            "powerpc", "powerpc64",
                            "s390", "s390x",
        "cpu_isa": "nocona", "armv8.1-a", "armv8.3-a",
        # "?" because the vfpu is specified by cpu_architecture + cpu_isa + rules.
        "vfpu": "?",
        "cpu_endianness": "BE", "LE",
      }
      "gpu ?": {
      }
      "compilerflags": {
        # When put into a CDT these should be the base defaults.
        # Package builds can and will change these frequently.
        "CPPFLAGS": "-D_FORTIFY_SOURCE=2",
        "CFLAGS": "-march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -O2 -pipe",
        "CXXFLAGS": "-fvisibility-inlines-hidden -std=c++17 -fmessage-length=0 -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -O2 -pipe",
        "LDFLAGS": "-Wl,-O1,--sort-common,--as-needed,-z,relro",
        "FFLAGS": "-fopenmp",
        # These are appended to the non-DEBUG values:
        "DEBUG_CFLAGS": "-Og -g -Wall -Wextra -fcheck=all -fbacktrace -fimplicit-none -fvar-tracking-assignments",
        "DEBUG_CXXFLAGS": "-Og -g -Wall -Wextra -fcheck=all -fbacktrace -fimplicit-none -fvar-tracking-assignments",
        "DEBUG_FFLAGS": "-Og -g -Wall -Wextra -fcheck=all -fbacktrace -fimplicit-none -fvar-tracking-assignments",
      }
    }
    cos6ppc64leaarch64ppc64s390xcos764x86_64i686cdt_namecdt_archr   r   r   Nr  )	host_archarchrz   r   r   r   )	r   rq   r   r  r"  r   r#   	ver_buildresults	            r%   cdtr%    s    ^ H*v{DyDI--DGOO#t||88~ <>%%j(;;>%%j(;;
l!!#&&q) &&s++ABB/	h&,x7#=@S@SS#h.4x?Mr&   c                 v    |dvrt          d          g }|s!|st          | || j        j                  \  }}}|S )aE  Returns the final list of packages that are listed in host or build.
    This include all packages (including the indirect dependencies) that will
    be installed in the host or build environment. An example usage of this
    jinja function can be::

        requirements:
          host:
            - curl 7.55.1
          run_constrained:
          {% for package in resolved_packages('host') %}
            - {{ package }}
          {% endfor %}

    which will render to::

        requirements:
            host:
                - ca-certificates 2017.08.26 h1d4fec5_0
                - curl 7.55.1 h78862de_4
                - libgcc-ng 7.2.0 h7cc24e2_2
                - libssh2 1.8.0 h9cfc8f7_4
                - openssl 1.0.2n hb7f436b_0
                - zlib 1.2.11 ha838bed_2
            run_constrained:
                - ca-certificates 2017.08.26 h1d4fec5_0
                - curl 7.55.1 h78862de_4
                - libgcc-ng 7.2.0 h7cc24e2_2
                - libssh2 1.8.0 h9cfc8f7_4
                - openssl 1.0.2n hb7f436b_0
                - zlib 1.2.11 ha838bed_2
    )r   r   z/Only host and build dependencies are supported.)r   r   rq   rz   )r   r   r   r   package_namesr   s         r%   resolved_packagesr(  V  s\    @ ###JKKKM  M$: M21c18;KLLq!r&   c                     t          | t          t          f          r@t          | t                    r|                                 }n| }t	          j        |          S t	          j        |           S )z%
    Load .toml from a pathname.
    )r   r   r   r   tomllibloadsr   )streamdatas     r%   
_toml_loadr.    sc     &:s+,, #fj)) 	;;==DDD}T""" <r&   )r   yamlymltomlr,  fmtc           
          	 t           |                                         } || g|R i |S # t          $ r: t          d| dt	          t                                                                w xY w)NzUnknown file format: z. Allowed formats: )_file_parserslowerr  r   r   r   )r,  r2  r*   r+   r   s        r%   
_load_datar6    s    -SYY[[) tF,T,,,V,,,  
 
 
XCXXDASASAUAU<V<VXX
 
 	

s
   - AA1)rq   r   r   r   r~   c                `   	 t          | |||          }t          |          5 }	t          |	|p+t          j        |           j                            d          g|R i |cddd           S # 1 swxY w Y   dS # t          $ r)}
|r!t          	                    |
           i cY d}
~
S  d}
~
ww xY w)zLoads a file and returns the parsed data.

    For example to load file data from a JSON file, you can use any of:

        load_file_data("my_file.json")
        load_file_data("my_json_file_without_ext", "json")
    r.   N)
r   r   r6  pathlibPathsuffixlstripr   r   r   )r~   r2  rq   r   r   r   r*   r+   	file_pathr   r   s              r%   load_file_datar=    s   "x*fMM	 )__ 	3C',x007>>sCCFJ  NT 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	    ! 	IIaLLLIIIIII	s4   A: =A--A14A1:
B-B(!B-'B((B-stringc                 >    t          t          |           |g|R i |S )a+  Parses data from a string

    For example to load string data, you can use any of:

        load_str_data("[{"name": "foo", "val": "bar"}, {"name": "biz", "val": "buz"}]", "json")
        load_str_data("[tool.poetry]\nname = 'foo'", "toml")
        load_str_data("name: foo\nval: bar", "yaml")
    )r6  r   )r>  r2  r*   r+   s       r%   load_str_datar@    s,     hv&&=d===f===r&   c                 .   t          | d|d|          }t          t          j                  }	|	                    t          | |                     |                    t          t          | ||          t          t          | ||          t          t          t          |||          t          t          |||          t          t          t          j                            |j        d                    t          t           | ||          t          t"          | |||	          t          t$          ||
          t          t&          ||
          t          t(          ||
          t          t*          | ||          t,          t.          |	           |S )z
    Return a dictionary to use as context for jinja templates.

    initial_metadata: Augment the context with values from this MetaData object.
                      Used to bootstrap metadata contents via multiple parsing passes.
    FT)r   for_envr   escape_backslashrz   )r   r   )r   r   r   )rq   r   r   z
conda-meta)r   r   )r   r   r   )rq   r   )r   r   r   r   r=  r@  	installedr   r   r	  r%  r  r(  timedatetimeenviron)r   dictr   rG  updater   r   r   r   r   r=  r@  r   r   r   host_prefixr   r   r	  r%  r  r(  rE  rF  )
initial_metadatar   rq   r   r   r   r   rz   ctxrG  s
             r%   context_processorrM    s     
#  C 2:GNN;!1OOOPPPJJ"!#9	
 
 
  !#9	
 
 
 !#9	
 
 
 !#9	
 
 
 $(GLL+\::
 
 #9-	
 
 
 #9#9'
 
 
 V<R
 
 
 C?UVVV6:P
 
 
 "#9-	
 
 
 w  < < <z Jr&   )r   FNT)FNT)NNr   r   FFF)F)r   r   FFFF)FFr   )FFFN)GrF  r   r   r8  r   rE  	functoolsr   ior   r   typingr   r   r   warningsr
   r   r/  r*  tomlir5   r   rG  r   r   rL   r   renderr   utilsr   r   r   r   r   r   r   r   variantsr   rF   r   r   r   
BaseLoaderrm   r   r   r   r   ry   r   r   r   r   r   r   r
  r	  r  r%  r(  r.  r   	safe_loadr4  r6  r=  r@  rM  rk   r&   r%   <module>rX     s|     				  				        # # # # # # # # $ $ $ $ $ $ $ $ $ $        NNNN ! ! ! ! ! ! , , , , , , + + + + + + ( ( ( ( ( (	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ( ' ' ' ' 'jf f f f f) f f fR
 
 
 
 
V& 
 
 
> 88 88 88 88z    *  #  # RU    , : : : :(    
F F F Fb 5 5 5 5v 
  1 1 1 1h     <   
? ? ? ?D* * * *Z       IN>	 -r - - - - - -    	#   >	># 	>C 	> 	> 	> 	>" !W W W W W Ws    A A