
    .`i[                     n   d dl mZmZmZ d dlmZmZ d dlZd dlm	Z	 d dl
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 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&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z: ddl;m<Z< ddl;m=Z> ddl?m@Z@mAZAmBZB ddlCmDZDmEZEmFZF ddlGmHZHmIZImJZJmKZK  G d de9          ZL G d d e>eB          ZM G d! d"e	jN                  ZO G d# d$e	jN                  ZP G d% d&e          ZQ G d' d(e	jN                  ZR G d) d*eD          ZS G d+ d,eFeB          ZT G d- d.e3          ZU G d/ d0e1eU                   ZV G d1 d2e2eU                   ZW e)jX        eWeUeV3           G d4 d5e	jN        eA                      ZYdS )6    )IterableMappingSequence)	AnnotatedLiteralN)
AriaConfigAriaTextConfigBatchFeature)AriaCrossAttention)AriaProcessor)
VllmConfig)BaseDummyOptions)get_tensor_model_parallel_rank)
get_act_fn)SharedFusedMoE)ColumnParallelLinearRowParallelLinear)LogitsProcessor)QuantizationConfig)ParallelLMHead)default_weight_loadermaybe_remap_kv_scale_name)MULTIMODAL_REGISTRY)MultiModalDataDictMultiModalFieldConfigMultiModalKwargsItems)MultiModalDataItems)BaseDummyInputsBuilderBaseMultiModalProcessorBaseProcessingInfoPromptReplacementPromptUpdate)IntermediateTensors)TensorSchemaTensorShape   )Idefics2VisionConfig)Idefics2VisionTransformer)MultiModalEmbeddingsSupportsMultiModalSupportsQuant)LlamaDecoderLayerLlamaMLP
LlamaModel)AutoWeightsLoaderWeightsMapperis_pp_missing_parametermaybe_prefixc                       e Zd ZU dZed         ed<   eej         e	dddd          f         ed<   eej        dz   e	ddd          f         ed	<   dS )
AriaImagePixelInputsz
    Dimensions:
        - b: Batch size
        - n: Number of images
        - c: Number of channels
        - h: Height of each image
        - w: Width of each image
    pixel_valuestypebn   hwN
pixel_mask)
__name__
__module____qualname____doc__r   __annotations__r   torchTensorr%        s/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/model_executor/models/aria.pyr4   r4   8   s           .
!!!!D!S#&&	(   
 tD#s##	%     rD   r4   c            	            e Zd Zdg diZ	 	 ddededz  deddf fd	Zd
ee	ee
j        f                  dee         fdZ xZS )AriaVisionTransformerqkv_projq_projk_projv_projN configquant_configprefixreturnc                     t                                          |||           t          j                    | _        d S )NrO   rP   )super__init__nnIdentitypost_layernormselfrN   rO   rP   	__class__s       rE   rU   zAriaVisionTransformer.__init__R   s:     	l6JJJ !kmmrD   weightsc                    g d}t          |                                           }t                      }|D ]\  }}d|v r
|D ]>\  }}}	||vr|                    ||          }||         }
|
j        } ||
||	            n*||         }
t          |
dt                    } ||
|           |                    |           |S )N))rH   rJ   q)rH   rK   k)rH   rL   vrX   weight_loader)dictnamed_parameterssetreplacera   getattrr   add)rZ   r\   stacked_params_mappingparams_dictloaded_paramsnameloaded_weight
param_nameweight_nameshard_idparamra   s               rE   load_weightsz"AriaVisionTransformer.load_weights^   s   "
 "
 "
 4002233"%%%#* 	$ 	$D-4''5K 4 41
Kd**||K<<#D) % 3e]H===#D) '@U V Ve]333d####rD   )NrM   )r<   r=   r>   packed_modules_mappingr'   r   strrU   r   tuplerA   rB   rd   rq   __classcell__r[   s   @rE   rG   rG   O   s        (*H*H*HI
 37	
, 
,$
, )4/
, 	
,
 

, 
, 
, 
, 
, 
,HU33D-E$F 3s8        rD   rG   c                   \     e Zd Z	 ddededededdf
 fdZd	ej        dej        fd
Z xZ	S )AriaProjectorMLPrM   in_featureshidden_features
output_dimrP   rQ   Nc                     t                                                       t          ||d| d          | _        t	          ||d| d          | _        t          d          | _        d S )NFz
.linear_in)biasrP   z.linear_outgelu_new)rT   rU   r   	linear_inr   
linear_outr   act)rZ   ry   rz   r{   rP   r[   s        rE   rU   zAriaProjectorMLP.__init__}   s     	-u=R=R=R
 
 
 ,Zev<R<R<R
 
 
 j))rD   hidden_statesc                     |                      |          \  }}|                     |          }|                     |          \  }}|S N)r   r   r   )rZ   r   _s      rE   forwardzAriaProjectorMLP.forward   sE    >>-88q//??=99qrD   rM   )
r<   r=   r>   intrs   rU   rA   rB   r   ru   rv   s   @rE   rx   rx   |   s         * ** * 	*
 * 
* * * * * *"U\ el        rD   rx   c                   n     e Zd ZdZddededdf fdZ	 ddej        d	ej        dz  dej        fd
Z	 xZ
S )AriaProjectora  
    A projection module with one cross attention layer and one FFN layer, which
    projects ViT's outputs into MoE's inputs.

    Args:
        config: [AriaConfig](https://huggingface.co/docs/transformers/main/model_doc/aria#transformers.AriaConfig)
            containing projector configuration parameters.

    Outputs:
        A tensor with the shape of (batch_size, query_number, output_dim)
    rM   rN   rP   rQ   Nc                 .   t                                                       |j        | _        |j        j        | _        |j        j        | _        |j        j        | _	        |j
        j        | _        |j
        j        | _        t          j        t          j        |j        | j                            | _        t'          |          | _        t          j        | j                  | _        t/          | j        | j        | j        | d          | _        d S )Nz.feed_forwardrP   )rT   rU   projector_patch_to_query_dictpatch_to_query_dictvision_confighidden_sizery   num_attention_heads	num_headskv_dimtext_configrz   r{   rV   	ParameterrA   empty'max_value_projector_patch_to_query_dictqueryr   
cross_attn	LayerNorm
layer_normrx   feed_forward)rZ   rN   rP   r[   s      rE   rU   zAriaProjector.__init__   s    #)#G !/;-A*6%1= ,8\K>@P 
 

 -V44,t'788, O+++	
 
 
rD   x	attn_maskc                 b   |j         d         |j         d         }}|| j        vr-t          d| d| j                                         d          | j        |         }| j        d |                             d                              |dd          }|X|                    | j        d          }|                    d          	                    d|
                    d          d          }|                     |||          }|                     |                     |                    }|S )Nr   r&   zNumber of patches z: not found in patch_to_query_dict amongst possible values .)r   )shaper   KeyErrorkeysr   	unsqueezerepeatrepeat_interleaver   expandsizer   r   r   )	rZ   r   r   
batch_sizenum_patches	query_numqueriesattention_outouts	            rE   r   zAriaProjector.forward   s1   
 #$'!*agajK
d6666[ 6 6+00226 6 6   ,[9	*ZiZ(22155<<ZANN !33DNAFFI!++A..55b',,q//2NNI7iHH > >??
rD   r   r   )r<   r=   r>   r?   r   rs   rU   rA   rB   r   ru   rv   s   @rE   r   r      s        
 

 
z 
3 
 
 
 
 
 
 
: *. < <$& 
	       rD   r   c                   :    e Zd Zdej        dej        deddfdZdS )AriaFusedMoErp   rl   ro   rQ   Nc                    t                      }|dk    r| j        dk    r|                    dd          \  }}|                    | j        d          |         }|                    | j        d          |         }t          j        ||gd                              dd          }	|j                            |	           d S |j                            |                    dd                     d S |dk    r| j        dk    rR|                    | j        d          |         }
|j                            |
                    dd                     d S |j                            |                    dd                     d S d S )Nw13r&      r   dimw2)r   tp_sizechunkrA   cat	transposedatacopy_)rZ   rp   rl   ro   tp_rankupgateup_current_rankgate_current_rankup_and_gatedown_current_ranks              rE   ra   zAriaFusedMoE.weight_loader   s    122u |a(..qb.99D"$((4<R("@"@"I$(JJt|J$D$DW$M!#i$&78b  )Aq//  
  -----
  !8!8A!>!>????? |a$1$7$7!$7$L$LW$U!
  !2!<!<Q!B!BCCCCC
  !8!8A!>!>????? rD   )	r<   r=   r>   rV   r   rA   rB   rs   ra   rC   rD   rE   r   r      sV        @\@27,@JM@	@ @ @ @ @ @rD   r   c            	       b     e Zd ZdZ	 ddededz  deddf fdZd	ej	        dej	        fd
Z
 xZS )AriaTextMoELayera  
    Mixture of Experts (MoE) Layer for the AriaMoE model.

    This layer implements the MoE mechanism, which routes input tokens to
    different experts based on a routing algorithm, processes them through the
    experts, and then combines the outputs.
    rM   rN   rO   NrP   rQ   c                    t                                                       || _        t          j        t          j        | j        j        | j        j        f                    | _	        t          |j        |j        |j        z  d||j                  | _        t          | j        |j        |j        |j        |j        |d| d          | _        d S )Nsilu)rO   r}   Tz.experts)shared_expertsnum_expertstop_kr   intermediate_sizerO   reduce_resultsrP   )rT   rU   rN   rV   r   rA   r   moe_num_expertsr   router_weightr-   r   moe_num_shared_expertsmlp_biasr   r   moe_topkexpertsrY   s       rE   rU   zAriaTextMoELayer.__init__  s     	\K4dk6MNOO
 
 '$v'DD%
 
 
 $../*$6%&&&	
 	
 	
rD   r   c                     t           j        j                            || j                  }|                     ||          }| j        |d         |d         z   S |S )a  
        Forward pass of the MoE Layer.

        Args:
            hidden_states: Input tensor of shape
                (batch_size, sequence_length, hidden_size).

        Returns:
            torch.Tensor: Output tensor after passing through the MoE layer.
        Nr   r&   )rA   rV   
functionallinearr   r   r   )rZ   r   router_outputsparse_expert_outputs       rE   r   zAriaTextMoELayer.forward"  sZ     +22=$BTUU#||M=II*'*-A!-DDD''rD   r   )r<   r=   r>   r?   r	   r   rs   rU   rA   rB   r   ru   rv   s   @rE   r   r      s          	
 

 )4/
 	

 

 
 
 
 
 
@(U\ (el ( ( ( ( ( ( ( (rD   r   c                   2     e Zd ZdZddededdf fdZ xZS )	AriaTextDecoderLayerz
    Custom Decoder Layer for the AriaMoE model which modifies the standard
    `LlamaDecoderLayer` by replacing the traditional MLP with a Mixture of
    Experts (MoE) Layer.
    rM   vllm_configrP   rQ   Nc                     t                                          ||           |j        j        }|j        }t          ||| d          | _        d S )Nz.mlprS   )rT   rU   model_config	hf_configrO   r   mlp)rZ   r   rP   rN   rO   r[   s        rE   rU   zAriaTextDecoderLayer.__init__?  sW    f---)3"/#ooo
 
 
rD   r   )r<   r=   r>   r?   r   rs   rU   ru   rv   s   @rE   r   r   8  sa         
 
J 
 
T 
 
 
 
 
 
 
 
 
 
rD   r   c                        e Zd ZdZg dddgdgdgdZdd	d
edef fdZdee	ee
j        f                  dee         fdZ xZS )AriaTextModelz
    Custom LlamaModel for the AriaMoE model which modifies the standard
    LlamaModel by replacing the `LlamaDecoderLayer` with `MoEDecoderLayer`.
    rI   	gate_projup_projexperts.fc1.weightexperts.fc2.weight)rH   gate_up_projexperts.w13_weightexperts.w2_weightrM   r   r   rP   c                Z    t                                          ||t                     d S )N)r   rP   
layer_type)rT   rU   r   )rZ   r   rP   r[   s      rE   rU   zAriaTextModel.__init__W  s6    #F?S 	 	
 	
 	
 	
 	
rD   r\   rQ   c                 ~   g d}t          |                                           }t                      }|D ]\  }}d|v rd|v sd|v r| j        ~| j                            |          x}rb||         }t          |dt                    }	|                                dk    r|n|d         } |	||           |                    |           |D ]i\  }
}}||vr|	                    ||
          }|
                    d          r||vr;t          ||           rL||         }|j        }	 |	|||            nk|
                    d          r||vr t          ||          }|4t          ||           rF||         }t          |dt                    }	 |	||           |                    |           |S )N))	.qkv_projz.q_projr^   )r   z.k_projr_   )r   z.v_projr`   ).gate_up_projz
.gate_projr   )r   z.up_projr&   )r   r   r   )r   r   r   zrotary_emb.inv_freqzrotary_emb.cos_cachedzrotary_emb.sin_cachedra   r   z.bias)rb   rc   rd   rO   get_cache_scalerf   r   r   rg   re   endswithr1   ra   r   )rZ   r\   rh   ri   rj   rk   rl   
scale_namerp   ra   rm   rn   ro   s                rE   rq   zAriaTextModel.load_weights^  s?   	"
 	"
 	"
 4002233"%%%#* 1	$ 1	$D-$,,&$..2IT2Q2Q  ,"/??EEE
 - $J/ '@U V V%2%6%6%8%8A%=%=MM=QRCS  e]333!!*---5K 4 41
Kd**||K<<==)) d+.E.E*466 #D) % 3e]H=== ==)) d+.E.E0{CC<*466 #D) '@U V Ve]333d####rD   )r<   r=   r>   r?   rr   r   rs   rU   r   rt   rA   rB   rd   rq   ru   rv   s   @rE   r   r   J  s          322$i03423	  BD 
 
 
z 
3 
 
 
 
 
 
?HU33D-E$F ?3s8 ? ? ? ? ? ? ? ?rD   r   c                   T    e Zd Zd Zd ZdefdZdeee	dz  f         fdZ
de	fdZdS )	AriaProcessingInfoc                 @    | j                             t                    S r   )ctxget_hf_configr   rZ   s    rE   r   z AriaProcessingInfo.get_hf_config  s    x%%j111rD   c                 4    |                                  j        S r   )r   r   r   s    rE   get_vision_configz$AriaProcessingInfo.get_vision_config  s    !!##11rD   kwargsc                 2     | j         j        t          fi |S r   )r   get_hf_processorr   )rZ   r   s     rE   r   z#AriaProcessingInfo.get_hf_processor  s    (tx(AA&AAArD   rQ   Nc                 
    dd iS )NimagerC   r   s    rE   get_supported_mm_limitsz*AriaProcessingInfo.get_supported_mm_limits  s    rD   c                 v    |                                  }t          |j                                                  S r   )r   maxr   values)rZ   r   s     rE   get_num_image_tokensz'AriaProcessingInfo.get_num_image_tokens  s0    &&((	9:AACCDDDrD   )r<   r=   r>   r   r   objectr   r   rs   r   r   r  rC   rD   rE   r   r     s        2 2 22 2 2B B B B BcDj)A    Ec E E E E E ErD   r   c            	       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 )	AriaDummyInputsBuilder	mm_countsrQ   c                     |                     dd          }| j                                        }|j        j        }||z  S )Nr   r   )getinfor   	tokenizerimage_token)rZ   r  
num_images	processorr  s        rE   get_dummy_textz%AriaDummyInputsBuilder.get_dummy_text  s>    ]]7A..
I..00	$.:Z''rD   Nseq_len
mm_optionsc                     | j                                         }|j        }|                    dd          }|r|                    d          nd }d|                     ||||          iS )Nr   r   )widthheightr  	overrides)r	  r   
image_sizer  _get_dummy_images)rZ   r  r  r  r   max_image_sizer  image_overridess           rE   get_dummy_mm_dataz(AriaDummyInputsBuilder.get_dummy_mm_data  s     	3355&1]]7A..
5?I*..111T T++$%%)	 ,  
 	
rD   r   )
r<   r=   r>   r   rs   r   r  r   r   r  rC   rD   rE   r  r    s        (S(9 (c ( ( ( ( =A	
 

 38$
 C!112T9	

 

 
 
 
 
 
rD   r  c            	       v    e Z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dS )	AriaMultiModalProcessor	hf_inputshf_processor_mm_kwargsrQ   c                 l    t          t          j        d          t          j        d                    S )Nr   )r5   r;   )rb   r   batched)rZ   r  r  s      rE   _get_mm_fields_configz-AriaMultiModalProcessor._get_mm_fields_config  s7    
 .6w??,4W==
 
 
 	
rD   mm_itemsout_mm_kwargsc                     | j                                         }|j        }| j                                         }t	          d|g|g|z            gS )Nr   )modalitytargetreplacement)r	  r   image_token_indexr  r!   )rZ   r!  r  r"  r   image_token_idnum_image_tokenss          rE   _get_prompt_updatesz+AriaMultiModalProcessor._get_prompt_updates  sf     I++--	"4999;;  &'+,/??  
 	
rD   N)r<   r=   r>   r
   r   rs   r  r   r   r   r   r   r"   r*  rC   rD   rE   r  r    s        

 !(V 4
 
++	,	
 
 
 

%
 !(V 4
 -	

 
,	
 
 
 
 
 
rD   r  )r	  dummy_inputsc                       e Zd ZdZ edddddddd	i
          Zededededz  fd            Z		 d$de
def fdZdededz  fdZdej        dz  dej        dz  fdZdedeej        ej        f         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                  fd#Z xZS )&AriaForConditionalGenerationz
    Aria model for conditional generation tasks.

    This model combines a vision tower, a multi-modal projector, and a language
    model to perform tasks that involve both image and text inputs.
    zlanguage_model.model.zvision_tower.zmulti_modal_projector.language_modellm_head)zmodel.language_model.zmodel.vision_tower.zmodel.multi_modal_projector.language_model.modelzlanguage_model.lm_headzrouter.weightr   )orig_to_new_prefixorig_to_new_suffixr$  irQ   Nc                 N    |                     d          rdS t          d          )Nr   z#<|fim_prefix|><|img|><|fim_suffix|>z Only image modality is supported)
startswith
ValueError)clsr$  r3  s      rE   get_placeholder_strz0AriaForConditionalGeneration.get_placeholder_str  s-    w'' 	988;<<<rD   rM   r   rP   c           
         t                                                       |j        j        }|j        }|| _        |                     |d          5  t          |j        || d          | _	        t          |t          |d                    | _        d d d            n# 1 swxY w Y   |                     |          5  t          |                    |j                  t          |d                    | _        t%          |j        j        |j        j        |t          |d                    | _        t-          |d	d
          }t/          |j        j        |          | _        d d d            d S # 1 swxY w Y   d S )Nr   z.vision_towerrS   multi_modal_projectorr   r0  )r   rP   r/  logit_scaleg      ?)scale)rT   rU   r   r   rO   rN   _mark_tower_modelrG   r   vision_towerr   r2   r:  _mark_language_modelr   with_hf_configr   r.  r   
vocab_sizer   r/  rf   r   logits_processor)rZ   r   rP   rN   rO   r;  r[   s         rE   rU   z%AriaForConditionalGeneration.__init__  s   
 	)3"/##K99 	 	 5$) ///! ! !D
 *7|F4KLL* * *D&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 &&{33 	 	"/'66v7IJJ#F,BCC# # #D
 *"-".)#FI66	  DL "&-==K$3"-[% % %D!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s&   AB""B&)B&B(E77E;>E;r   c                     |                     dd           }|                     dd           }|d S t          d||          S )Nr5   r;   )r6   r5   r;   )popr4   )rZ   r   r5   r;   s       rE   _parse_and_validate_image_inputz<AriaForConditionalGeneration._parse_and_validate_image_input;  sU     zz.$77ZZd33
4#%!
 
 
 	
rD   r;   c                 6   |d S |                     d| j        j        j        | j        j        j                                       d| j        j        j        | j        j        j                  }|                    d          dk                                    S )Nr&   )	dimensionr   stepr   )r   r   r   )unfoldr>  rN   
patch_sizesumbool)rZ   r;   patches_subgrids      rE   _create_patch_attention_maskz9AriaForConditionalGeneration._create_patch_attention_maskJ  s     4$++")4")4 , 
 
 &")4")4  
 
	 	  ###11A5;;===rD   image_inputc                     |d         }|d         }|                      |          }|                     ||          }d }|)|                    d          }t          j        |          }|                     ||          S )Nr5   r;   )r5   patch_attention_maskr&   )rO  r>  flattenrA   logical_notr:  )rZ   rP  r5   r;   rR  image_outputsimage_attn_maskflattened_masks           rE   _process_image_inputz1AriaForConditionalGeneration._process_image_input\  s     #>2 .
#@@LL))%!5 * 
 
 +199!<<N#/??O))-IIIrD   c                 R     | j         di |}|g S |                     |          }|S )NrC   )rE  rX  )rZ   r   rP  multimodal_embeddingss       rE   embed_multimodalz-AriaForConditionalGeneration.embed_multimodalo  s?    :d:DDVDDI $ 9 9+ F F$$rD   	input_ids	positionsintermediate_tensorsinputs_embedsc                 @    |d }|                      ||||          }|S )N)r_  )r.  )rZ   r\  r]  r^  r_  r   r   s          rE   r   z$AriaForConditionalGeneration.forwardv  s=      + M++ '	 , 
 
 rD   r   c                 <    |                      | j        |          }|S r   )rB  r/  )rZ   r   logitss      rE   compute_logitsz+AriaForConditionalGeneration.compute_logits  s      &&t|]CCrD   r\   c                 \    t          |           }|                    || j                   d S )N)mapper)r/   rq   hf_to_vllm_mapper)rZ   r\   loaders      rE   rq   z)AriaForConditionalGeneration.load_weights  s1    "4((GD,BCCCCCrD   r   )NN)r<   r=   r>   r?   r0   rf  classmethodrs   r   r8  r   rU   r  r4   rE  rA   rB   rO  rt   rX  r)   r[  r#   r   rc  r   rq   ru   rv   s   @rE   r-  r-    sm         & &=#2,D$4&/
 
 _
   =3 =3 =3: = = = [= % %% % % % % % %N

		$
 
 
 
>L4'> 
	> > > >$J/J	u|U\)	*J J J J&% %4H % % % % <@-1 < < 2D8	
 |d*  
+	+   (| 
	   DHU33D-E$F D D D D D D D DrD   r-  )Zcollections.abcr   r   r   typingr   r   rA   torch.nnrV   transformersr   r	   r
   &transformers.models.aria.modeling_ariar   (transformers.models.aria.processing_ariar   vllm.configr   vllm.config.multimodalr   vllm.distributedr   %vllm.model_executor.layers.activationr   $vllm.model_executor.layers.fused_moer   !vllm.model_executor.layers.linearr   r   +vllm.model_executor.layers.logits_processorr   'vllm.model_executor.layers.quantizationr   3vllm.model_executor.layers.vocab_parallel_embeddingr   -vllm.model_executor.model_loader.weight_utilsr   r   vllm.multimodalr   vllm.multimodal.inputsr   r   r   vllm.multimodal.parser   vllm.multimodal.processingr   r   r    r!   r"   vllm.sequencer#   vllm.utils.tensor_schemar$   r%   idefics2_vision_modelr'   r(   Idefics3VisionTransformer
interfacesr)   r*   r+   llamar,   r-   r.   utilsr/   r0   r1   r2   r4   rG   Modulerx   r   r   r   r   r   r   r  r  register_processorr-  rC   rD   rE   <module>r     sj   8 7 7 7 7 7 7 7 7 7 % % % % % % % %        A A A A A A A A A A E E E E E E B B B B B B " " " " " " 3 3 3 3 3 3 ; ; ; ; ; ; < < < < < < ? ? ? ? ? ? U U U U U U U U G G G G G G F F F F F F N N N N N N        0 / / / / /         
 6 5 5 5 5 5              . - - - - - > > > > > > > > 7 7 7 7 7 7      P O O O O O O O O O : : : : : : : : : :               <   .* * * * *5} * * *Z    ry   2A A A A ABI A A AH@ @ @ @ @> @ @ @@<( <( <( <( <(ry <( <( <(~
 
 
 
 
, 
 
 
$S S S S SJ S S SlE E E E E+ E E E$
 
 
 
 
34FG 
 
 
@
 
 
 
 
56HI 
 
 
> ('	'  
]D ]D ]D ]D ]D29.@ ]D ]D 
]D ]D ]DrD   