
    DvgL                        d 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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  G d dej                  Z G d dej                  Z G d de          Z  G d dej!                  Z" G d de"          Z# G d dej$                  Z% G d dej&                  Z' G d dej(                  Z)d Z* G d  d!ej+                  Z, G d" d#e,          Z- G d$ d%ej.                  Z/ G d& d'ej0                  Z1 G d( d)ej+                  Z2 G d* d+ej3                  Z4 G d, d-ej5                  Z6 G d. d/ej7                  Z8 G d0 d1e8          Z9 G d2 d3ej+                  Z:d4 d5D             Z;e;<                    d6d7d8           d9 Z= G d: d;          Z> G d< d=e>ej?                  Z@ G d> d?e>ej                  ZAdS )@z8
Form Widget classes specific to the Django admin site.
    N)forms)settings)ValidationError)URLValidator)CASCADE	UUIDField)reverse)NoReverseMatch)smart_urlquote)	urlencode)	Truncator)get_language)gettextc                   H     e Zd ZdZ G d d          Zd fd	Z fdZ xZS )	FilteredSelectMultiplez
    A SelectMultiple with a JavaScript filter interface.

    Note that the resulting JavaScript assumes that the jsi18n
    catalog has been loaded in the page
    c                       e Zd Zg dZdS )FilteredSelectMultiple.Media)zadmin/js/core.jszadmin/js/SelectBox.jszadmin/js/SelectFilter2.jsN__name__
__module____qualname__js     Y/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/contrib/admin/widgets.pyMediar      s        
 
 
r   r   Nr   c                 h    || _         || _        t                                          ||           d S N)verbose_name
is_stackedsuper__init__)selfr   r    attrschoices	__class__s        r   r"   zFilteredSelectMultiple.__init__%   s2    ($(((((r   c                 (   t                                          |||          }d|d         d         d<   | j        r|d         d         dxx         dz  cc<   | j        |d         d         d<   t	          | j                  |d         d         d<   |S )Nselectfilterwidgetr$   classstackeddata-field-namezdata-is-stacked)r!   get_contextr    r   intr#   namevaluer$   contextr&   s        r   r-   z"FilteredSelectMultiple.get_context*   s    ''%%dE599.<'"7+? 	=Hg&w///9<///8<8I'"#458;DO8L8L'"#45r   )Nr   )r   r   r   __doc__r   r"   r-   __classcell__r&   s   @r   r   r      s         
 
 
 
 
 
 
 
) ) ) ) ) )
        r   r   c                   :     e Zd Z G d d          Zd fd	Z xZS )BaseAdminDateWidgetc                       e Zd ZddgZdS )BaseAdminDateWidget.Mediaadmin/js/calendar.js#admin/js/admin/DateTimeShortcuts.jsNr   r   r   r   r   r9   5           "1
r   r   Nc                 `    ddd|pi }t                                          ||           d S )N
vDateField10r*   sizer$   formatr!   r"   r#   r$   rC   r&   s      r   r"   zBaseAdminDateWidget.__init__;   s<    &FF"FuV44444r   NNr   r   r   r   r"   r4   r5   s   @r   r7   r7   4   e        
 
 
 
 
 
 
 
5 5 5 5 5 5 5 5 5 5r   r7   c                       e Zd ZdZdS )AdminDateWidgetzadmin/widgets/date.htmlNr   r   r   template_namer   r   r   rJ   rJ   @           -MMMr   rJ   c                   :     e Zd Z G d d          Zd fd	Z xZS )BaseAdminTimeWidgetc                       e Zd ZddgZdS )BaseAdminTimeWidget.Mediar:   r;   Nr   r   r   r   r   rQ   E   r<   r   r   Nc                 `    ddd|pi }t                                          ||           d S )N
vTimeField8r@   rB   rD   rE   s      r   r"   zBaseAdminTimeWidget.__init__K   s<    &EEEuV44444r   rF   rG   r5   s   @r   rO   rO   D   rH   r   rO   c                       e Zd ZdZdS )AdminTimeWidgetzadmin/widgets/time.htmlNrK   r   r   r   rV   rV   P   rM   r   rV   c                   .     e Zd ZdZdZddZ fdZ xZS )AdminSplitDateTimezF
    A SplitDateTime Widget that has some admin-specific styling.
    z!admin/widgets/split_datetime.htmlNc                 d    t           t          g}t          j                            | ||           d S r   )r7   rO   r   MultiWidgetr"   )r#   r$   widgetss      r   r"   zAdminSplitDateTime.__init__[   s0    &(;< 	""4%88888r   c                     t                                          |||          }t          d          |d<   t          d          |d<   |S )NzDate:
date_labelzTime:
time_label)r!   r-   _r/   s        r   r-   zAdminSplitDateTime.get_contexta   sC    ''%%dE599 !'

 !'

r   r   )r   r   r   r3   rL   r"   r-   r4   r5   s   @r   rX   rX   T   s]          8M9 9 9 9        r   rX   c                       e Zd ZdZdS )AdminRadioSelectzadmin/widgets/radio.htmlNrK   r   r   r   ra   ra   h   s        .MMMr   ra   c                       e Zd ZdZdS )AdminFileWidgetz'admin/widgets/clearable_file_input.htmlNrK   r   r   r   rc   rc   l   s        =MMMr   rc   c                 p   i }| rt          | d          r|                                 D ]\  }}t          |          r
 |            }t          |t          t
          f          r d                    d |D                       }n-t          |t                    r	d|         }nt          |          }|||<   |S )z
    Convert the type of lookups specified in a ForeignKey limit_choices_to
    attribute to a dictionary of query parameters
    items,c              3   4   K   | ]}t          |          V  d S r   str.0xs     r   	<genexpr>z.url_params_from_lookup_dict.<locals>.<genexpr>{   s(      //SVV//////r   )01)	hasattrre   callable
isinstancetuplelistjoinboolri   )lookupsparamskvs       r   url_params_from_lookup_dictr{   p   s    
 F 
77G,, 
MMOO 		 		DAq{{ ACC!eT]++ HH//Q/////At$$ qMFFF1IIMr   c                   D     e Zd ZdZdZd	 fd	Z fdZd Zd Zd Z	 xZ
S )
ForeignKeyRawIdWidgetzj
    A Widget for displaying ForeignKeys in the "raw_id" interface rather than
    in a <select> box.
    z%admin/widgets/foreign_key_raw_id.htmlNc                 t    || _         || _        || _        t                                          |           d S r   )rel
admin_sitedbr!   r"   )r#   r   r   r$   usingr&   s        r   r"   zForeignKeyRawIdWidget.__init__   s6    $r   c                    t                                          |||          }| j        j        }| j                            |          rt          d|j        j        d|j        j	        d| j        j
                  }|                                 }|r|dt          |          z   z  }||d<   t          d          |d<   d	}t          | j                                        t                     r|d
z  }|d         d                             d|           nd |d<   |d         d         r|                     |          \  |d<   |d<   nd |d<   |S )Nzadmin:r_   _changelist)current_app?related_urlLookup
link_titlevForeignKeyRawIdAdminFieldz vUUIDFieldr)   r$   r*   r1   
link_labellink_url)r!   r-   r   modelr   is_registeredr	   _meta	app_label
model_namer0   url_parametersr   r_   rr   get_related_fieldr   
setdefaultlabel_and_url_for_value)
r#   r0   r1   r$   r2   rel_tor   rx   	css_classr&   s
            r   r-   z!ForeignKeyRawIdWidget.get_context   sw   ''%%dE599?((00 	*!' L***L+++
 !O0  K ((**F 7sYv%6%666%0GM"$%hKKGL!4I$(4466	BB +]*	Hg&11'9EEEE%)GM"8W% 	)9=9U9U: :6GL!7:#6#6 %)GL!r   c                 j    | j         j        }t          |          r
 |            }t          |          S r   )r   limit_choices_torq   r{   )r#   r   s     r   base_url_parametersz)ForeignKeyRawIdWidget.base_url_parameters   s<    84$%% 	2//11*+;<<<r   c                     ddl m} |                                 }|                    || j                                        j        i           |S )Nr   )TO_FIELD_VAR)django.contrib.admin.views.mainr   r   updater   r   r0   )r#   r   rx   s      r   r   z$ForeignKeyRawIdWidget.url_parameters   sR    @@@@@@))++|TX%?%?%A%A%FGHHHr   c                    | j                                         j        }	  | j         j        j                            | j                  j        di ||i}n(# t          | j         j        j	        t          f$ r Y dS w xY w	 t          | j        j        d|j        j        d|j        j        d|j        f          }n# t"          $ r d}Y nw xY wt%          |                              d          |fS )	N r   :r_   _change)argsr      r   )r   r   r0   r   _default_managerr   r   get
ValueErrorDoesNotExistr   r	   r   r   r   r   pkr
   r   words)r#   r1   keyobjurls        r   r   z-ForeignKeyRawIdWidget.label_and_url_for_value   s   h((**/	D$(.177@@DTTU|TTCCDHN7I 	 	 	66		 O(((I'''I(((	 fY  CC  	 	 	CCC	 ~~##B'',,s#   6A !A<;A< >B? ?CCrF   )r   r   r   r3   rL   r"   r-   r   r   r   r4   r5   s   @r   r}   r}      s         
 <M                    D= = =  - - - - - - -r   r}   c                   >     e Zd ZdZdZ fdZd Zd Zd Zd Z	 xZ
S )ManyToManyRawIdWidgetzv
    A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
    in a <select multiple> box.
    z&admin/widgets/many_to_many_raw_id.htmlc                     t                                          |||          }| j                            | j        j                  rd|d         d         d<   |S )NvManyToManyRawIdAdminFieldr)   r$   r*   )r!   r-   r   r   r   r   r/   s        r   r-   z!ManyToManyRawIdWidget.get_context   sT    ''%%dE599?((88 	O2NGHg&w/r   c                 *    |                                  S r   )r   r#   s    r   r   z$ManyToManyRawIdWidget.url_parameters   s    '')))r   c                     dS )Nr   r   r#   r1   s     r   r   z-ManyToManyRawIdWidget.label_and_url_for_value   s    vr   c                 ^    |                     |          }|r|                    d          S d S )Nrf   )r   split)r#   datafilesr0   r1   s        r   value_from_datadictz)ManyToManyRawIdWidget.value_from_datadict   s5     	$;;s###	$ 	$r   c                 H    |rd                     d |D                       ndS )Nrf   c              3   4   K   | ]}t          |          V  d S r   rh   )rk   rz   s     r   rm   z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>   s(      ..1A......r   r   )ru   r   s     r   format_valuez"ManyToManyRawIdWidget.format_value   s-    27?sxx........R?r   )r   r   r   r3   rL   r-   r   r   r   r   r4   r5   s   @r   r   r      s         
 =M    * * *  $ $ $
@ @ @ @ @ @ @r   r   c                       e Zd ZdZdZ	 	 	 	 ddZd Zed             Zed             Z	ed	             Z
e
j        d
             Z
d Zd Zd Zd Zd ZdS )RelatedFieldWidgetWrapperzd
    This class is a wrapper to a given widget to add the add icon for the
    admin interface.
    z)admin/widgets/related_widget_wrapper.htmlNFc                 x   |j         | _         |j        | _        || _        || _        ||                    |j                  }|| _        t          |dd          }t          |t                    s
d| j        d<   | o|| _
        t          |dd           t          u }	| o|	 o|| _        | o|| _        || _        d S )Nallow_multiple_selectedFzavailable-sourcezdata-context	on_delete)needs_multipart_formr$   r)   r   r   r   can_add_relatedgetattrrr   AutocompleteMixincan_change_relatedr   can_delete_relatedcan_view_relatedr   )
r#   r)   r   r   r   r   r   r   multiplecascades
             r   r"   z"RelatedFieldWidgetWrapper.__init__   s     %+$?!\
 "(66syAAO.6#<eDD&"344 	<);DJ~&&.,"E3E#{D11W<&.,"Uw;"UCU$, A1A$r   c                     t          j         |           }t          j        | j        |          |_        | j        j        |_        ||t	          |           <   |S r   )copydeepcopyr)   r$   id)r#   memor   s      r   __deepcopy__z&RelatedFieldWidgetWrapper.__deepcopy__  sD    ioo]4;55
K%	RXX
r   c                     | j         j        S r   )r)   	is_hiddenr   s    r   r   z#RelatedFieldWidgetWrapper.is_hidden$  s    {$$r   c                     | j         j        S r   )r)   mediar   s    r   r   zRelatedFieldWidgetWrapper.media(  s    {  r   c                     | j         j        S r   r)   r%   r   s    r   r%   z!RelatedFieldWidgetWrapper.choices,  s    {""r   c                     || j         _        d S r   r   r   s     r   r%   z!RelatedFieldWidgetWrapper.choices0  s    #r   c                 H    t          d||fz   z  | j        j        |          S )Nzadmin:%s_%s_%s)r   r   )r	   r   r0   )r#   infoactionr   s       r   get_related_urlz)RelatedFieldWidgetWrapper.get_related_url4  s3    y 01,
 
 
 	
r   c                 j   ddl m}m} | j        j        j        }|j        |j        f}| j                                        j	        }d
                    d ||f|dffD                       }	| j                            |||          | j        ||	|j        |j        | j        | j        | j        | j        | j        j        d}
| j        r|                     |d          |
d<   | j        r|                     |d	d
          |
d<   | j        s| j        r$| d| |
d<   |                     |dd
          |
d<   |
S )Nr   )IS_POPUP_VARr   &c              3       K   | ]	}d |z  V  
dS )z%s=%sNr   )rk   params     r   rm   z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>A  s:       
 
 eO
 
 
 
 
 
r      )rendered_widgetr   r0   
url_paramsr   r   r   r   r   r   model_has_limit_choices_toaddadd_related_urldelete__fk__delete_related_template_url=view_related_url_paramschangechange_related_template_url)r   r   r   r   r   r   r   r   r   r0   ru   r)   renderr   r   r   r   r   r   r   r   )r#   r0   r1   r$   r   r   rel_optsr   related_field_namer   r2   s              r   r-   z%RelatedFieldWidgetWrapper.get_context;  s   NNNNNNNN8>'"H$78!X7799>XX 
 
 12q!
 
 
 
 

  ${11$uEE$*"-#3"&"9"&"9 $ 5*.(*C
 
  	K)-)=)=dE)J)JG%&" 	595I5Ih6 6G12   	D$; 	4@1W1WCU1W1WG-.595I5Ih6 6G12 r   c                 :    | j                             |||          S r   )r)   r   r#   r   r   r0   s       r   r   z-RelatedFieldWidgetWrapper.value_from_datadictb  s    {..tUDAAAr   c                 :    | j                             |||          S r   )r)   value_omitted_from_datar   s       r   r   z1RelatedFieldWidgetWrapper.value_omitted_from_datae  s    {224EEEr   c                 6    | j                             |          S r   )r)   id_for_label)r#   id_s     r   r   z&RelatedFieldWidgetWrapper.id_for_labelh  s    {'',,,r   )NFFF)r   r   r   r3   rL   r"   r   propertyr   r   r%   setterr   r-   r   r   r   r   r   r   r   r      s        
 @M   % % % %>   % % X% ! ! X! # # X# ^$ $ ^$
 
 
% % %NB B BF F F- - - - -r   r   c                         e Zd Zd fd	Z xZS )AdminTextareaWidgetNc                 X    t                                          ddi|pi            d S )Nr*   vLargeTextFieldr$   rD   r#   r$   r&   s     r   r"   zAdminTextareaWidget.__init__m  s3    ):Lu{LMMMMMr   r   r   r   r   r"   r4   r5   s   @r   r   r   l  sG        N N N N N N N N N Nr   r   c                         e Zd Zd fd	Z xZS )AdminTextInputWidgetNc                 X    t                                          ddi|pi            d S Nr*   
vTextFieldr   rD   r  s     r   r"   zAdminTextInputWidget.__init__r  2    G%+2GHHHHHr   r   r  r5   s   @r   r  r  q  G        I I I I I I I I I Ir   r  c                         e Zd Zd fd	Z xZS )AdminEmailInputWidgetNc                 X    t                                          ddi|pi            d S r  rD   r  s     r   r"   zAdminEmailInputWidget.__init__w  r  r   r   r  r5   s   @r   r  r  v  r	  r   r  c                   2     e Zd ZdZdef fd	Z fdZ xZS )AdminURLFieldWidgetzadmin/widgets/url.htmlNc                 v    t                                          ddi|pi             |            | _        d S )Nr*   	vURLFieldr   )r!   r"   	validator)r#   r$   validator_classr&   s      r   r"   zAdminURLFieldWidget.__init__~  s?    F"FGGG(**r   c                 N   	 |                      |r|nd           d}n# t          $ r d}Y nw xY wt                                          |||          }t	          d          |d<   t	          d          |d<   |rt          |d         d	                   nd|d         d
<   ||d<   |S )Nr   TFz
Currently:current_labelzChange:change_labelr)   r1   href	url_valid)r  r   r!   r-   r_   r   )r#   r0   r1   r$   r  r2   r&   s         r   r-   zAdminURLFieldWidget.get_context  s    	NNE155r222II 	 	 	III	''%%dE599#$\?? "#I,,:CKN78,W5666 	&!  )s    ..)r   r   r   rL   r   r"   r-   r4   r5   s   @r   r  r  {  s`        ,M!< + + + + + +        r   r  c                   $     e Zd ZdZd fd	Z xZS )AdminIntegerFieldWidgetvIntegerFieldNc                 b    t                                          d| j        i|pi            d S )Nr*   r   )r!   r"   
class_namer  s     r   r"   z AdminIntegerFieldWidget.__init__  s4    JU[bJKKKKKr   r   )r   r   r   r  r"   r4   r5   s   @r   r  r    sL         JL L L L L L L L L Lr   r  c                       e Zd ZdZdS )AdminBigIntegerFieldWidgetvBigIntegerFieldN)r   r   r   r  r   r   r   r  r    s        #JJJr   r  c                         e Zd Zd fd	Z xZS )AdminUUIDInputWidgetNc                 X    t                                          ddi|pi            d S )Nr*   
vUUIDFieldr   rD   r  s     r   r"   zAdminUUIDInputWidget.__init__  r  r   r   r  r5   s   @r   r!  r!    r	  r   r!  c                 8    i | ]}|                                 |S r   )lowerrj   s     r   
<dictcomp>r&    s2     1 1 1	 GGIIq1 1 1r   )-arazbgcacsdadeeleneseteufafifrglhehihrhur   isitjakmkoltlvmkmsnbnlplzpt-BRptroruskzsr-Cyrlsrsvthtrukvizzh-CNzzh-TW)zzh-hanszzh-hantc                  "   t                      } t                              |           }|d| bd }|                     dd|          x}dk    rCt                              | d |                   x}r|S |                     dd|          x}dk    C|S )N-r   )r   SELECT2_TRANSLATIONSr   rfind)	lang_codesupported_codeis      r   get_select2_languagerY    s    I)--i88N)"7 OOCA...q"44!5!9!9)BQB-!H!HH~ &%% OOCA...q"44 r   c                   T     e Zd ZdZdZd
dZd Zd fd	ZddZe	d	             Z
 xZS )r   z
    Select widget mixin that loads options from AutocompleteJsonView via AJAX.

    Renders the necessary data attributes for select2 and adds the static form
    media.
    z%s:autocompleteNr   c                     || _         || _        || _        || _        |i n|                                | _        t                      | _        d S r   )fieldr   r   r%   r   r$   rY  	i18n_name)r#   r\  r   r$   r%   r   s         r   r"   zAutocompleteMixin.__init__  sF    
$ =RRejjll
-//r   c                 D    t          | j        | j        j        z            S r   )r	   url_namer   r0   r   s    r   get_urlzAutocompleteMixin.get_url  s    t}t';;<<<r   c                    t                                          ||          }|                    dd           |                    ddd|                                 | j        j        j        j        | j        j        j        j	        | j        j
        dt          j        | j                   d| j        |d         |d         rdndz   dz   d	           |S )
z
        Set select2's AJAX attributes.

        Attributes can be set using the html5 data attribute.
        Nested attributes require a double dash as per
        https://select2.org/configuration/data-attributes#nested-subkey-options
        )extra_attrsr*   r   true   GETzadmin-autocomplete )zdata-ajax--cachezdata-ajax--delayzdata-ajax--typezdata-ajax--urlzdata-app-labelzdata-model-namer,   z
data-themezdata-allow-clearzdata-placeholderlangr*   )r!   build_attrsr   r   r`  r\  r   r   r   r   r0   jsondumpsis_requiredr]  )r#   
base_attrsrb  r$   r&   s       r   rh  zAutocompleteMixin.build_attrs  s     ##JK#HH"%%%$*$'#("&,,.."&*"2"8"B#':#3#9#D#':?2$(J43C/C$D$D$&w.033b2&' 	
 	
 	
$ r   c           
          dg df}|g}d} fd|D             } j         s9 j        s2|d                                                  |dddd                      j        j        j        j        }t           j        j        d|j	        j
                  |                              j
         fd  j        j                             j                  j        d
i d	z  |iD             }	|	D ]o\  }
}t#          |
          |v o
|du p j        }||z  }t%          |d                   }|d         }|                                         ||
|||                     p|S )z9Return selected options based on the ModelChoiceIterator.Nr   Fc                 n    h | ]1}t          |          j        j        j        v"t          |          2S r   )ri   r%   r\  empty_values)rk   rz   r#   s     r   	<setcomp>z.AutocompleteMixin.optgroups.<locals>.<setcomp>  s>     
 
 
SVV4<3E3R%R%RCFF%R%R%Rr   r   r   
field_namec              3   v   K   | ]3}t          |          j        j                            |          fV  4d S r   )r   r%   r\  label_from_instance)rk   r   r#   to_field_names     r   rm   z.AutocompleteMixin.optgroups.<locals>.<genexpr>)  sZ       
 
 S-(($,*<*P*PQT*U*UV
 
 
 
 
 
r   z%s__inr   )rk  r   appendcreate_optionr\  remote_fieldr   r   r   r   attname	get_fieldr%   querysetr   r   filterri   len)r#   r0   r1   attrdefaultgroupshas_selectedselected_choicesremote_model_optsr%   option_valueoption_labelselectedindexsubgrouprt  s   `              @r   	optgroupszAutocompleteMixin.optgroups  s   Q-
 
 
 
!
 
 
  	J(D 	JAJd00r2uaHHIII J39?J#\3D3G3O
 
 *33MBBJ
 
 
 
 
Bt|,2247;;B  m+-=> 
 
 
 +2 	 	&L,<((E1 %E)E  H$L
OOEqzHOO"",6F    
 r   c                     t           j        rdnd}| j        rd| j        z  fnd}t          j        d|z  d|z  f|z   dz   dd	|z  d
fi          S )Nr   z.minz"admin/js/vendor/select2/i18n/%s.jsr   z"admin/js/vendor/jquery/jquery%s.jsz)admin/js/vendor/select2/select2.full%s.js)zadmin/js/jquery.init.jszadmin/js/autocomplete.jsscreenz&admin/css/vendor/select2/select2%s.csszadmin/css/autocomplete.css)r   css)r   DEBUGr]  r   r   )r#   extra	i18n_files      r   r   zAutocompleteMixin.media=  s    n0& ~1DNBDD 	
 {4u<;eC 	
 <uD0
 
 
 	
r   )Nr   Nr   )r   r   r   r3   r_  r"   r`  rh  r  r   r   r4   r5   s   @r   r   r     s          !H0 0 0 0= = =     <! ! ! !F 
 
 X
 
 
 
 
r   r   c                       e Zd ZdS )AutocompleteSelectNr   r   r   r   r   r   r  r  X          Dr   r  c                       e Zd ZdS )AutocompleteSelectMultipleNr  r   r   r   r  r  \  r  r   r  )Br3   r   ri  djangor   django.confr   django.core.exceptionsr   django.core.validatorsr   django.db.modelsr   r   django.urlsr	   django.urls.exceptionsr
   django.utils.htmlr   django.utils.httpr   django.utils.textr   django.utils.translationr   r   r_   SelectMultipler   	DateInputr7   rJ   	TimeInputrO   rV   SplitDateTimeWidgetrX   RadioSelectra   ClearableFileInputrc   r{   	TextInputr}   r   Widgetr   Textarear   r  
EmailInputr  URLInputr  NumberInputr  r  r!  rT  r   rY  r   Selectr  r  r   r   r   <module>r     sU                        2 2 2 2 2 2 / / / / / / / / / / / / / /       1 1 1 1 1 1 , , , , , , ' ' ' ' ' ' ' ' ' ' ' ' 1 1 1 1 1 1 1 1 1 1 1 1    U1   <	5 	5 	5 	5 	5%/ 	5 	5 	5. . . . .) . . .	5 	5 	5 	5 	5%/ 	5 	5 	5. . . . .) . . .    2   (/ / / / /u( / / /> > > > >e. > > >  (Q- Q- Q- Q- Q-EO Q- Q- Q-h@ @ @ @ @1 @ @ @<s- s- s- s- s- s- s- s-lN N N N N%. N N N
I I I I I5? I I I
I I I I IE, I I I
    %.   .L L L L Le/ L L L$ $ $ $ $!8 $ $ $I I I I I5? I I I1 1.1 1 1 d   GDD E E E
 
 
n
 n
 n
 n
 n
 n
 n
 n
b	 	 	 	 	*EL 	 	 		 	 	 	 	!2E4H 	 	 	 	 	r   