
    .`iR                        d dl mZ d dlmZmZmZ d dlmZmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ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+m,Z, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z<m=Z= ddl>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZE ddlFmGZGmHZHmIZImJZJmKZK ddlLmMZM  G d de<          ZN G d dejO                  ZP G d dejO                  ZQ G d  d!e
          ZR G d" d#e
          ZS G d$ d%e4          ZT ed&eT'          ZU G d( d)e2eU                   ZV G d* d+eT          ZW G d, d-e3eW                   ZXd.e5d/eTfd0ZYdd1d2eUd3e2eU         d4e(dz  d/e3fd5ZZd6eRd/e[fd7Z\dd8d9d6eRd:e"dz  d;e]dz  d<e^d/eEf
d=Z_ e&j`        eZeYeV>           G d? d@ejO        e@eAeB                      ZadS )A    )abstractmethod)IterableMappingSequence)	AnnotatedFinalLiteralProtocolTypeVarN)BatchFeatureMistral3ConfigPixtralVisionConfigPretrainedConfig)PixtralProcessor)
VllmConfig)BaseDummyOptions)
get_act_fn)RMSNorm)ColumnParallelLinearRowParallelLinear)QuantizationConfig)MultiModelKeys)MULTIMODAL_REGISTRY)BaseMultiModalProcessorCache)MultiModalDataDictMultiModalFieldConfigMultiModalKwargsItems)ImageProcessorItems	ImageSizeMultiModalDataItems)BaseDummyInputsBuilderBaseMultiModalProcessorBaseProcessingInfoInputProcessingContextPromptReplacementPromptUpdatePromptUpdateDetails)IntermediateTensors)TensorSchemaTensorShape   )MultiModalEmbeddingsSupportsLoRASupportsMultiModal
SupportsPP)PixtralHFEncoderInfoPixtralHFVisionModel)AutoWeightsLoaderWeightsMapperget_layer_indexinit_vllm_registered_modelmaybe_prefix)get_vision_encoder_infoc            
           e Zd ZU dZdZed         ed<   eej	        e
ej	                 z   eddddddh          f         ed	<   d
S )Mistral3ImagePixelInputsz
    Dimensions:
        - bn: Batch size * number of images
        - c: Number of channels (3)
        - h: Height of each image
        - w: Width of each image
    pixel_values_pixtraltypebn   hw)dynamic_dimspixel_valuesN)__name__
__module____qualname____doc__r;   r	   __annotations__r   torchTensorlistr*        w/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/model_executor/models/mistral3.pyr9   r9   >   s           -CD'(
)BBB tEL))D!S#S#J???	A     rK   r9   c                   b     e Zd ZdZdededef fdZdej        dej        dej        fd	Z xZ	S )
Mistral3PatchMergerz<
    Learned merging of spatial_merge_size ** 2 patches
    vision_hidden_sizespatial_merge_size
patch_sizec                     t                                                       || _        || _        || _        t          j        || j        dz  z  |d          | _        d S )N   F)bias)super__init__rO   rP   rQ   nnLinearmerging_layer)selfrO   rP   rQ   	__class__s       rL   rV   zMistral3PatchMerger.__init__V   sg     	"4"4$Y!8!!;;
 
 
rK   image_featuresimage_sizesreturnc                      fd|D             }d |D             }|j         d         }g }t          |                    |                    D ]\  }}||         \  }}	|                    ||	|                              ddd                              d          }
t          j        j        	                    |
 j
         j
                  }|                    | j
        dz  z  d                                          }|                    |           t          j        |d          }                     |          }|S )	Nc                 P    g | ]"}|d          j         z  |d         j         z  f#S )r   r+   )rQ   ).0
image_sizerZ   s     rL   
<listcomp>z/Mistral3PatchMerger.forward.<locals>.<listcomp>g   sD     
 
 
 ]do-z!}/OP
 
 
rK   c                     g | ]
\  }}||z  S rJ   rJ   )ra   r>   r?   s      rL   rc   z/Mistral3PatchMerger.forward.<locals>.<listcomp>l   s     :::daAE:::rK   rS   r   r+   )kernel_sizestride)dim)shape	enumeratesplitviewpermute	unsqueezerG   rW   
functionalunfoldrP   tappendcatrY   )rZ   r\   r]   tokens_per_imagedpermuted_tensorimage_indeximage_tokensr>   r?   
image_gridgrids   `           rL   forwardzMistral3PatchMerger.forwardd   sj   
 
 
 
)
 
 

 ;:k::: $)2  !122*
 *
 	) 	)%K {+DAq%**1a33;;Aq!DDNNqQQJ8&-- 3. .  D
 99Q!8!!;;R@@BBDDD""4((((?:::++N;;rK   )
rB   rC   rD   rE   intrV   rG   rH   r{   __classcell__r[   s   @rL   rN   rN   Q   s         
"%
;>
LO
 
 
 
 
 
#l9>	       rK   rN   c                   ~     e Zd Z	 	 ddedededededed	edz  d
ef fdZdej	        dej	        dej	        fdZ
 xZS )Mistral3MultiModalProjectorN rO   text_hidden_sizerP   rQ   projector_hidden_actmultimodal_projector_biasquant_configprefixc	                 :   t                                                       t          |d          | _        t	          |||          | _        t          ||||| d          | _        t          |          | _	        t          ||||| d          | _        d S )Ngh㈵>)eps)rO   rP   rQ   z	.linear_1)rT   r   r   z	.linear_2)rU   rV   r   normrN   patch_mergerr   linear_1r   actr   linear_2)
rZ   rO   r   rP   rQ   r   r   r   r   r[   s
            rL   rV   z$Mistral3MultiModalProjector.__init__   s     	.D999	/11!
 
 
 -*%'''
 
 
 233)*%'''
 
 
rK   r\   r]   r^   c                     |                      |          }|                     ||          }|                     |          \  }}|                     |          }|                     |          \  }}|S N)r   r   r   r   r   )rZ   r\   r]   hidden_states_s        rL   r{   z#Mistral3MultiModalProjector.forward   sm     >22**>;GG==88q//==77qrK   )Nr   )rB   rC   rD   r|   strboolr   rV   rG   rH   r{   r}   r~   s   @rL   r   r      s         37"
 "
"
 "
  	"

 "
 ""
 $("
 )4/"
 "
 "
 "
 "
 "
 "
H#l9>	       rK   r   c                   z    e Zd ZU ee         ed<   ee         ed<   ee         ed<   eeee         z           ed<   dS )LlavaLikeConfigvision_configimage_token_indexvision_feature_select_strategyvision_feature_layerN)	rB   rC   rD   r   r   rF   r|   r   rI   rJ   rK   rL   r   r      s]         )****Sz!!!$)#J...d3i000000rK   r   c                   &    e Zd ZU ee         ed<   dS )LlavaLikeProcessorimage_tokenN)rB   rC   rD   r   r   rF   rJ   rK   rL   r   r      s"         srK   r   c                       e Zd ZdefdZd Zededefd            Z	de
eedz  f         fdZded	edefd
ZdefdZdS )BaseLlavaProcessingInfor^   c                 @    | j                             t                    S r   )ctxget_hf_configr   rZ   s    rL   r   z%BaseLlavaProcessingInfo.get_hf_config   s    x%%n555rK   c                 D    t          |                                           S r   )r7   r   r   s    rL   r7   z/BaseLlavaProcessingInfo.get_vision_encoder_info   s    &t'9'9';';<<<rK   kwargsc                     t           r   )NotImplementedErrorrZ   r   s     rL   get_hf_processorz(BaseLlavaProcessingInfo.get_hf_processor   s    !!rK   Nc                 
    dd iS )NimagerJ   r   s    rL   get_supported_mm_limitsz/BaseLlavaProcessingInfo.get_supported_mm_limits   s    rK   image_widthimage_heightc                X    |                                  }|                    ||          S )Nr   r   )r7   get_num_image_tokens)rZ   r   r   vision_encoder_infos       rL   r   z,BaseLlavaProcessingInfo.get_num_image_tokens   s9     #::<<"77#% 8 
 
 	
rK   c                 x    |                                  }|                                x}}t          ||          S )N)widthheight)r7   get_image_sizer   )rZ   r   r   r   s       rL   !get_image_size_with_most_featuresz9BaseLlavaProcessingInfo.get_image_size_with_most_features   s=    "::<<,;;===uV4444rK   )rB   rC   rD   r   r   r7   r   objectr   r   r   r   r|   r   r   r   r   rJ   rK   rL   r   r      s        6 6 6 6 6= = = " "4F " " " ^"cDj)A    

 

 	


 


 

 

 

59 5 5 5 5 5 5rK   r   _I)boundc            	       p    e Zd Zdeeef         defdZ	 ddedeeef         deeef         dz  defdZ	dS )	Mistral3DummyInputsBuilder	mm_countsr^   c                 x    |                     dd          }| j                                        }|j        }||z  S )Nr   r   )getinfor   r   )rZ   r   
num_images	processorr   s        rL   get_dummy_textz)Mistral3DummyInputsBuilder.get_dummy_text   s;    ]]7A..
I..00	+Z''rK   Nseq_len
mm_optionsc                     |                     dd          }| j                                        \  }}|r|                     d          nd }d|                     ||||          iS )Nr   r   )r   r   r   	overrides)r   r   r   _get_dummy_images)rZ   r   r   r   r   target_widthtarget_heightimage_overridess           rL   get_dummy_mm_dataz,Mistral3DummyInputsBuilder.get_dummy_mm_data   s|     ]]7A..
&*i&Q&Q&S&S#m5?I*..111T T++"$%)	 ,  
 	
rK   r   )
rB   rC   rD   r   r   r|   r   r   r   r   rJ   rK   rL   r   r      s        (S(9 (c ( ( ( ( =A	
 

 38$
 C!112T9	

 

 
 
 
 
 
rK   r   c                       e Zd ZdefdZdS )Mistral3ProcessingInfor   c                 2     | j         j        t          fi |S r   )r   r   r   r   s     rL   r   z'Mistral3ProcessingInfo.get_hf_processor  s     (tx()9DDVDDDrK   N)rB   rC   rD   r   r   rJ   rK   rL   r   r      s6        E E E E E E ErK   r   c            
            e Zd Zdedeeef         deeef         deeef         def
 fdZdedeeef         deeef         fd	Z	d
e
deeef         dedee         fdZ xZS )Mistral3MultiModalProcessorpromptmm_data	mm_kwargs
tok_kwargsr^   c                    t                                          ||||          }|                    d          }|G|d         }t          |          t          |          k    sJ d t	          ||          D             |d<   |S )N)r   r   r   r   rA   r]   c                 <    g | ]\  }\  }}|d d d |d |f         S r   rJ   )ra   pr>   r?   s       rL   rc   zBMistral3MultiModalProcessor._call_hf_processor.<locals>.<listcomp>  sC     1 1 1!*FQ!!!RaR!)1 1 1rK   )rU   _call_hf_processorr   lenzip)	rZ   r   r   r   r   processed_outputsrA   r]   r[   s	           rL   r   z.Mistral3MultiModalProcessor._call_hf_processor  s     "GG66!	 7 
 
 ),,^<<# ,M:K|$$K(8(888881 1.1,.L.L1 1 1n- ! rK   	hf_inputshf_processor_mm_kwargsc                 l    t          t          j        d          t          j        d                    S )Nr   )rA   image_embeds)dictr   batched)rZ   r   r   s      rL   _get_mm_fields_configz1Mistral3MultiModalProcessor._get_mm_fields_config!  s7    
 .6w??.6w??
 
 
 	
rK   mm_itemsout_mm_kwargsc                   	
  | j         j        di |}| j                                         }| j                                         }|                                }||j                 
|j        ||j                 t          |j	        t                    sJ t          |          	dt          f	
fd}t          dg|          gS )Nitem_idxc                     
                     dt                    }|                    |           }                    |j        |j                  \  }}	g|z  gz   |z  }|d<   t          j        |	          S )Nr   r   re   )	get_itemsr   r   get_patch_grid_sizer   r   r'   select_token_id)r   imagesrb   ncolsnrowstokensencoder_infoimage_break_idimage_end_idimage_token_idr   s         rL   get_replacementzHMistral3MultiModalProcessor._get_prompt_updates.<locals>.get_replacement=  s    ''1DEEF..x88J';;&,'. <  LE5
 &&..1AAUJF%F2J&6v~NNNrK   r   )modalitytargetreplacementrJ   )r   r   r   get_tokenizer	get_vocabimage_break_tokenr   image_end_token
isinstancer   r   r0   r|   r%   )rZ   r   r   r   r   	hf_config	tokenizervocabr   r   r   r   r   s    `       @@@@rL   _get_prompt_updatesz/Mistral3MultiModalProcessor._get_prompt_updates+  s    /DI.HH1GHH	I++--	I++--	##%%y:;"4Y67)13FGGGGG+I66	Oc 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O  &'+  
 	
rK   )rB   rC   rD   r   r   r   r   r   r   r   r    r   r   r&   r   r}   r~   s   @rL   r   r     s       !! f%! 3;'	!
 CK(! 
! ! ! ! ! !6

 !(V 4
 
++	,	
 
 
 
&
%&
 !(V 4&
 -	&

 
,	&
 &
 &
 &
 &
 &
 &
 &
rK   r   r   r^   c                     |                      t                    }t          |j        t                    sJ t          |           S r   )r   r   r   r   r   r   )r   r   s     rL   _build_mistral3_infor  T  s?     !!.11Ii-/BCCCCC!#&&&rK   cacher   dummy_inputsr  c                T    t          | t                    sJ t          | ||          S )Nr  )r   r   r   )r   r  r  s      rL   _build_mistral3_processorr  \  s;     d233333&   rK   r   c                 "   | j         }| j        j        t          |t                    rt          |          S t          |t          t          f          rt          fd|D                       S t          dt          |           d          )zDetermine the number of hidden layers to initialize up to in the
    visual encoder.

    Args:
        hf_config: Model config with vision feature layer(s).
    c              3   8   K   | ]}t          |          V  d S r   )r4   )ra   idxnum_hidden_layerss     rL   	<genexpr>z)_get_num_hidden_layers.<locals>.<genexpr>x  s.      UUs?3(9::UUUUUUrK   zvision_layer_feature type: z is not supported)r   r   r
  r   r|   r4   rI   tuplemax	TypeErrorr;   )r   feature_layersr
  s     @rL   _get_num_hidden_layersr  j  s     3N!/A.#&& V~/@AAA	NT5M	2	2 VUUUUnUUUUUU
Md>&:&:MMM  rK   r   )require_post_normr   r   r  r   c                    | j         }t          |           }t          |t                    sJ t	          |||||          S )N)r   num_hidden_layers_overrider  r   )r   r  r   r   r1   )r   r   r  r   r   r
  s         rL   init_vision_tower_for_llavar  ~  sY     +M /y99m%899999!#4+   rK   )r   r  c                       e Zd Zg dddgdZ eddddd	
          Zededededz  fd            Z	ddde
deddf fdZdededz  fdZdedej        eej        df         z  fdZdedefdZ	 	 d%dej        dej        dedz  dej        dz  dedej        ez  fdZd ej        dej        dz  fd!Zd"eeeej        f                  dee         fd#Zdefd$Z xZS )& Mistral3ForConditionalGeneration)q_projk_projv_proj	gate_projup_proj)qkv_projgate_up_projzlanguage_model.model.zvision_tower.zmulti_modal_projector.zlanguage_model.lm_head.)zmodel.language_model.zmodel.vision_tower.zmodel.multi_modal_projector.zlm_head.)orig_to_new_prefixr   ir^   Nc                 N    |                     d          rd S t          d          )Nr   z Only image modality is supported)
startswith
ValueError)clsr   r  s      rL   get_placeholder_strz4Mistral3ForConditionalGeneration.get_placeholder_str  s,    w'' 	4;<<<rK   r   )r   vllm_configr   c                V   t                                                       |j        j        }|j        }|j        j        }|| _        || _        |j        j        |j        j	        dk    rdg|j        _        |j
        |j        j        dk    rd|_
        |                     |d          5  t          ||dt          |d                    | _        t#          |j        j        |j        j        |j
        |j        |j        j        |j        |t          |d          	          | _        d d d            n# 1 swxY w Y   |                     |          5  t1          ||j        t          |d
                    | _        d d d            n# 1 swxY w Y   | j        j        | _        d S )NmistralMistralForCausalLMgelur   Fvision_tower)r   r  r   multi_modal_projector)rO   r   r   rP   rQ   r   r   r   language_model)r%  r   r   )rU   rV   model_configr   r   multimodal_configconfigtext_configarchitectures
model_typer   r   
hidden_act_mark_tower_modelr  r6   r*  r   hidden_sizerP   rQ   r   r+  _mark_language_modelr5   r,  make_empty_intermediate_tensors)rZ   r%  r   r/  r   r.  r[   s         rL   rV   z)Mistral3ForConditionalGeneration.__init__  s8   )3"/'4F!2
 ,4"-::0D/EF,'/$/699*0F'##K99 	 	 ;)"'#FN;;	! ! !D *E#)#7#C!'!3!?%+%@#)#<!/:*0*J)#F,CDD	* 	* 	*D&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$ &&{33 	 	"<' ,#F,<==# # #D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ? 	,,,s%   ,A>D66D:=D:+FFFr   c                     |                     dd           }|                     dd           }||d S t          d|          S )NrA   r   r:   )r;   rA   )popr9   )rZ   r   rA   r   s       rL   _parse_and_validate_image_inputz@Mistral3ForConditionalGeneration._parse_and_validate_image_input  sW     zz.$77zz.$77L$84''%
 
 
 	
rK   image_input.c                     |d         dk    r|d         S d |d         D             }                      |d                   }t          |t          j                  r                     ||          S  fd|D             }                     t          j        |          |          }t          |          dk    rt          j        ||          }n|f}|S )Nr;   r   datac                 B    g | ]}|j         d          |j         d         fS )re   )ri   )ra   imgs     rL   rc   zIMistral3ForConditionalGeneration._process_image_input.<locals>.<listcomp>  s6     
 
 
/2SYr]CIbM*
 
 
rK   rA   c                 J    g | ]}|j         d          j        j        dz  z   S )r   rS   )ri   r/  rP   )ra   image_featurerZ   s     rL   rc   zIMistral3ForConditionalGeneration._process_image_input.<locals>.<listcomp>  s@     
 
 
 "dk&Da&GG
 
 
rK   r+   )r*  r   rG   rH   r+  rs   r   rk   )rZ   r;  r]   r\   feature_sizesr   s   `     rL   _process_image_inputz5Mistral3ForConditionalGeneration._process_image_input  s    v.00v&&
 
6A.6Q
 
 
 **;~+FGGnel33 	K--nkJJJ
 
 
 
!/
 
 

 11In%%{
 
 }!! ;|]CCLL(?LrK   c                 R     | j         di |}|g S |                     |          }|S )NrJ   )r:  rD  )rZ   r   r;  vision_embeddingss       rL   embed_multimodalz1Mistral3ForConditionalGeneration.embed_multimodal  s?    :d:DDVDDI 55kBB  rK   	input_ids	positionsintermediate_tensorsinputs_embedsc                 J    |d}| j                             ||||          }|S )a  Run forward pass for Mistral3.

        One key thing to understand is the `input_ids` already accounts for the
        positions of the to-be-inserted image embeddings.

        Concretely, consider a text prompt:
        `"USER: <image>\nWhat's the content of the image?\nASSISTANT:"`.

        Tokenizer outputs:
        `[1, 3148, 1001, 29901, 29871, 32000, 29871, 13, 5618, 29915, 29879,
        278, 2793, 310, 278, 1967, 29973, 13, 22933, 9047, 13566, 29901]`.

        To reserve space in KV cache, we have to insert placeholder tokens
        before they are inputted to the model, so the input processor prepends
        additional image tokens (denoted as `32000`), resulting in:
        `[1, 3148, 1001, 29901, 29871, 32000, ..., 32000, 29871, 13, 5618,
        29915, 29879, 278, 2793, 310, 278, 1967, 29973, 13, 22933, 9047, 13566,
        29901]`.

        We insert 575 tokens so that including the original image token in the
        input, there are a total of 576 (24 * 24) image tokens, which
        corresponds to the number of image tokens inputted to the language
        model, i.e. the number of image tokens outputted by the visual encoder.

        This way, the `positions` and `attn_metadata` are consistent
        with the `input_ids`.

        Args:
            input_ids: Flattened (concatenated) input_ids corresponding to a
                batch.
            positions: Position indices for the input tokens.
            intermediate_tensors: Intermediate tensors from prior forward pass.
            inputs_embeds: Optional tensor of input embeddings.

        Info:
            [`Mistral3ImagePixelInputs`][vllm.model_executor.models.mistral3.Mistral3ImagePixelInputs]
        N)rK  )r,  model)rZ   rH  rI  rJ  rK  r   r   s          rL   r{   z(Mistral3ForConditionalGeneration.forward  s?    Z  + M+11y"6m 2 
 
 rK   r   c                 6    | j                             |          S r   )r,  compute_logits)rZ   r   s     rL   rO  z/Mistral3ForConditionalGeneration.compute_logitsR  s     "11-@@@rK   weightsc                 X    t          |           }|                    || j                  S )N)mapper)r2   load_weightshf_to_vllm_mapper)rZ   rP  loaders      rL   rS  z-Mistral3ForConditionalGeneration.load_weightsX  s+    "4((""743I"JJJrK   c                 0    t          j        ddd          S )z<
        Get the module prefix in multimodal models
        r,  r+  r*  )r,  	connectortower_model)r   from_string_fieldr   s    rL   get_mm_mappingz/Mistral3ForConditionalGeneration.get_mm_mapping\  s'     /+-&
 
 
 	
rK   )NN)rB   rC   rD   packed_modules_mappingr3   rT  classmethodr   r|   r$  r   rV   r   r9   r:  rG   rH   r  rD  r,   rG  r(   r{   rO  r   setrS  r   rZ  r}   r~   s   @rL   r  r    su        322$i0 
 & &=#2,D1
 
   =3 =3 =3: = = = [= BD 2
 2
 2
z 2
3 2
 2
 2
 2
 2
 2
 2
h

	!D	(
 
 
 
- 
elC/0	0   <! !4H ! ! ! ! <@-14 4<4 <4 2D8	4
 |d*4 4 
+	+4 4 4 4lA|A 
	A A A AKHU33D-E$F K3s8 K K K K
 
 
 
 
 
 
 
 
rK   r  )babcr   collections.abcr   r   r   typingr   r   r	   r
   r   rG   torch.nnrW   transformersr   r   r   r   transformers.models.pixtralr   vllm.configr   vllm.config.multimodalr   %vllm.model_executor.layers.activationr   $vllm.model_executor.layers.layernormr   !vllm.model_executor.layers.linearr   r   'vllm.model_executor.layers.quantizationr   )vllm.model_executor.models.module_mappingr   vllm.multimodalr   vllm.multimodal.cacher   vllm.multimodal.inputsr   r   r   vllm.multimodal.parser   r   r    vllm.multimodal.processingr!   r"   r#   r$   r%   r&   r'   vllm.sequencer(   vllm.utils.tensor_schemar)   r*   
interfacesr,   r-   r.   r/   pixtralr0   r1   utilsr2   r3   r4   r5   r6   visionr7   r9   ModulerN   r   r   r   r   r   r   r   r   r  r  r|   r  r   r   r  register_processorr  rJ   rK   rL   <module>rx     s         7 7 7 7 7 7 7 7 7 7 ? ? ? ? ? ? ? ? ? ? ? ? ? ?                   9 8 8 8 8 8 " " " " " " 3 3 3 3 3 3 < < < < < < 8 8 8 8 8 8 U U U U U U U U F F F F F F D D D D D D / / / / / / > > > > > >         
 V U U U U U U U U U                  . - - - - - > > > > > > > >            @ ? ? ? ? ? ? ?              , + + + + +    |   &/ / / / /") / / /d- - - - -") - - -`1 1 1 1 1h 1 1 1       5 5 5 5 50 5 5 5@ WT0111
 
 
 
 
!7!; 
 
 
>E E E E E4 E E E
L
 L
 L
 L
 L
"9:P"Q L
 L
 L
^'	'' ' ' ' 26	  
(, ($.	
    o #    0 &*  $t+ d{	
     . ('	+  
J
 J
 J
 J
 J
I|/J
 J
 
J
 J
 J
rK   