
     h                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
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mZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z< ddl:m=Z= dZ> G d d          Z? G d de?          Z@ G d de?          ZA G d deA          ZB G d deA          ZC G d de?          ZD G d d eD          ZE G d! d"eD          ZF G d# d$          ZG G d% d&eD          ZH G d' d(e?          ZI G d) d*e@          ZJ G d+ d,e@          ZK G d- d.e?          ZL G d/ d0eL          ZM G d1 d2e@          ZN G d3 d4e?          ZO G d5 d6eO          ZP G d7 d8          ZQ G d9 d:e?          ZR G d; d<eR          ZS G d= d>eR          ZT G d? d@eT          ZU G dA dBe?          ZV G dC dDe?          ZW G dE dFeR          ZX G dG dHeW          ZY G dI dJe@          ZZ G dK dLe@          Z[ G dM dNe@          Z\ G dO dPe]          Z^ G dQ dRe]          Z_ G dS dTe@          Z`dS )Uz
Field classes.
    N)DecimalDecimalException)BytesIO)urlsplit
urlunsplit)
validators)ValidationError
BoundField)from_current_timezoneto_current_timezone)FILE_INPUT_CONTRADICTIONCheckboxInputClearableFileInput	DateInputDateTimeInput
EmailInput	FileInputHiddenInputMultipleHiddenInputNullBooleanSelectNumberInputSelectSelectMultipleSplitDateTimeWidgetSplitHiddenDateTimeWidgetTextarea	TextInput	TimeInputURLInput)formats)parse_datetimeparse_duration)duration_string)MAX_IPV6_ADDRESS_LENGTHclean_ipv6_address)_lazy_re_compile)gettext_lazy)ngettext_lazy)Field	CharFieldIntegerField	DateField	TimeFieldDateTimeFieldDurationField
RegexField
EmailField	FileField
ImageFieldURLFieldBooleanFieldNullBooleanFieldChoiceFieldMultipleChoiceField
ComboFieldMultiValueField
FloatFieldDecimalFieldSplitDateTimeFieldGenericIPAddressFieldFilePathField	JSONField	SlugFieldTypedChoiceFieldTypedMultipleChoiceField	UUIDFieldc                        e Zd ZeZeZg Zd ed          iZ	 e
ej                  Zdddddddddddd fd	
Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )r*   requiredzThis field is required.TN F )rG   widgetlabelinitial	help_texterror_messagesshow_hidden_initialr   localizedisabledlabel_suffixc                   |||c| _         | _        | _        || _        || _        |
| _        || _        |p| j        }t          |t                    r |            }nt          j        |          }|	| _        | j        rd|_        | j         |_        |                     |          }|r|j                            |           || _        i }t%          | j        j                  D ]&}|                    t+          |di                      '|                    |pi            || _        g | j        || _        t3                                                       d S )NTdefault_error_messages)rG   rK   rL   rO   rM   rQ   rR   rJ   
isinstancetypecopydeepcopyrP   is_localizedis_requiredwidget_attrsattrsupdatereversed	__class____mro__getattrrN   default_validatorsr   super__init__)selfrG   rJ   rK   rL   rM   rN   rO   r   rP   rQ   rR   extra_attrsmessagescr_   s                  R/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/forms/fields.pyrd   zField.__init___   si   L 3;E7/tz4<#6 " (&4;fd## 	+VXXFF]6**F != 	'"&F "] ''// 	-L,,,$.011 	F 	FAOOGA'?DDEEEE,"---&AD3AjA    c                     |S NrI   re   values     ri   prepare_valuezField.prepare_value       rj   c                     |S rl   rI   rm   s     ri   	to_pythonzField.to_python   rp   rj   c                 b    || j         v r#| j        rt          | j        d         d          d S d S NrG   code)empty_valuesrG   r	   rN   rm   s     ri   validatezField.validate   s@    D%%%$-%!$"5j"A
SSSS &%%%rj   c                 :   || j         v rd S g }| j        D ]t}	  ||           # t          $ rY}t          |d          r%|j        | j        v r| j        |j                 |_        |                    |j                   Y d }~md }~ww xY w|rt          |          d S )Nrv   )	rw   r   r	   hasattrrv   rN   messageextend
error_list)re   rn   errorsves        ri   run_validatorszField.run_validators   s    D%%%F 	, 	,A,%" , , ,1f%% <!&D4G*G*G $ 3AF ;AIal++++++++,  	*!&)))	* 	*s   $
BABBc                     |                      |          }|                     |           |                     |           |S )z
        Validate the given value and return its "cleaned" value as an
        appropriate Python object. Raise ValidationError for any errors.
        )rr   rx   r   rm   s     ri   cleanzField.clean   s@    
 u%%eE"""rj   c                     | j         r|S |S )a'  
        Return the value that should be shown for this field on render of a
        bound form, given the submitted POST data for the field and the initial
        data, if any.

        For most fields, this will simply be data; FileFields need to handle it
        a bit differently.
        rQ   re   datarL   s      ri   
bound_datazField.bound_data   s     = 	Nrj   c                     i S )z
        Given a Widget instance (*not* a Widget class), return a dictionary of
        any HTML attributes that should be added to the Widget, based on this
        Field.
        rI   )re   rJ   s     ri   r[   zField.widget_attrs   s	     	rj   c                     | j         rdS 	 |                     |          }t          | d          r,|                     |          |                     |          k    S n# t          $ r Y dS w xY w||nd}||nd}||k    S )z)Return True if data differs from initial.F_coerceTNrH   )rQ   rr   rz   r   r	   )re   rL   r   initial_value
data_values        ri   has_changedzField.has_changed   s     = 	5	>>$''DtY'' C||D))T\\'-B-BBBC 	 	 	44	
 $+#6B!-TT2

**s   AA 
A+*A+c                 $    t          || |          S )zu
        Return a BoundField instance that will be used when accessing the form
        field in a template.
        r
   )re   form
field_names      ri   get_bound_fieldzField.get_bound_field   s    
 $j111rj   c                     t          j         |           }||t          |           <   t          j        | j        |          |_        | j                                         |_        | j        d d          |_        |S rl   )rW   idrX   rJ   rN   r   )re   memoresults      ri   __deepcopy__zField.__deepcopy__   sb    4RXXdk488 $ 3 8 8 : : OAAA.rj   )__name__
__module____qualname__r   rJ   r   hidden_widgetrb   _rT   listr   EMPTY_VALUESrw   rd   ro   rr   rx   r   r   r   r[   r   r   r   __classcell__r_   s   @ri   r*   r*   R   sI       F   	AA/00 4
/00L
 !H H H H H H HT    T T T* * *      + + +&2 2 2      rj   r*   c                   :     e Zd Zddddd fd
Zd Z fdZ xZS )r+   NTrH   )
max_length
min_lengthstripempty_valuec                   || _         || _        || _        || _         t	                      j        di | |9| j                            t          j        t          |                               |9| j                            t          j
        t          |                               | j                            t          j                               d S NrI   )r   r   r   r   rc   rd   r   appendMinLengthValidatorintMaxLengthValidatorProhibitNullCharactersValidator)re   r   r   r   r   kwargsr_   s         ri   rd   zCharField.__init__  s     %$
&""6"""!O"":#@Z#Q#QRRR!O"":#@Z#Q#QRRRzIKKLLLLLrj   c                     || j         vr*t          |          }| j        r|                                }|| j         v r| j        S |S )Return a string.)rw   strr   r   rm   s     ri   rr   zCharField.to_python  sN    )))JJEz &D%%%##rj   c                     t                                          |          }| j        |j        st	          | j                  |d<   | j        |j        st	          | j                  |d<   |S )N	maxlength	minlength)rc   r[   r   	is_hiddenr   r   re   rJ   r\   r_   s      ri   r[   zCharField.widget_attrs  sg    $$V,,?&v/?&!$T_!5!5E+?&v/?&!$T_!5!5E+rj   )r   r   r   rd   rr   r[   r   r   s   @ri   r+   r+     sz         T2M M M M M M M          rj   r+   c                   p     e Zd ZeZd ed          iZ ed          Zdddd fd
Z	 fdZ
 fdZ xZS )	r,   invalidzEnter a whole number.z\.0*\s*$N)	max_value	min_value	step_sizec                   |||c| _         | _        | _        |                    d          r7| j        t
          k    r'|                    dt                      j                    t                      j        di | |,| j	        
                    t          j        |                     |,| j	        
                    t          j        |                     |.| j	        
                    t          j        |                     d S d S )NrP   rJ   rI   )r   r   r   getrJ   r   
setdefaultrc   rd   r   r   MaxValueValidatorMinValueValidatorStepValueValidator)re   r   r   r   r   r_   s        ri   rd   zIntegerField.__init__.  s    9BIy6::j!! 	8dk[&@&@h777""6""" O"":#?	#J#JKKK O"":#?	#J#JKKK O"":#@#K#KLLLLL ! rj   c                 f   t                                          |          }|| j        v rdS | j        rt	          j        |          }	 t          | j                            dt          |                              }n1# t          t          f$ r t          | j        d         d          w xY w|S )z~
        Validate that int() can be called on the input. Return the result
        of int() or None for empty values.
        NrH   r   ru   )rc   rr   rw   rP   r!   sanitize_separatorsr   
re_decimalsubr   
ValueError	TypeErrorr	   rN   re   rn   r_   s     ri   rr   zIntegerField.to_python<  s    
 !!%((D%%%4= 	7/66E	R++BE

;;<<EEI& 	R 	R 	R!$"5i"@yQQQQ	Rs   
5B   .B.c                     t                                          |          }t          |t                    r3| j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   |S )Nminmaxstep)rc   r[   rU   r   r   r   r   r   s      ri   r[   zIntegerField.widget_attrsM  sj    $$V,,fk** 	/~)#~e~)#~e~) $frj   )r   r   r   r   rJ   r   rT   r'   r   rd   rr   r[   r   r   s   @ri   r,   r,   '  s        F11,-- "!+..J$(DD M M M M M M M    "	 	 	 	 	 	 	 	 	rj   r,   c                   L     e Zd Zd ed          iZ fdZ fdZ fdZ xZS )r<   r   Enter a number.c                 (   t          t          |                               |          }|| j        v rdS | j        rt          j        |          }	 t          |          }n1# t          t          f$ r t          | j        d         d          w xY w|S )z
        Validate that float() can be called on the input. Return the result
        of float() or None for empty values.
        Nr   ru   )rc   r,   rr   rw   rP   r!   r   floatr   r   r	   rN   r   s     ri   rr   zFloatField.to_python^  s    
 lD))33E::D%%%4= 	7/66E	R%LLEEI& 	R 	R 	R!$"5i"@yQQQQ	Rs   A! !.Bc                     t                                          |           || j        v rd S t          j        |          st          | j        d         d          d S Nr   ru   )rc   rx   rw   mathisfiniter	   rN   r   s     ri   rx   zFloatField.validaten  sh    D%%%F}U## 	R!$"5i"@yQQQQ	R 	Rrj   c                     t                                          |          }t          |t                    r=d|j        vr4| j        t          | j                  }nd}|                    d|           |S )Nr   any)rc   r[   rU   r   r\   r   r   r   re   rJ   r\   r   r_   s       ri   r[   zFloatField.widget_attrsu  sq    $$V,,fk** 	+vV\/I/I~)4>**VT***rj   )	r   r   r   r   rT   rr   rx   r[   r   r   s   @ri   r<   r<   Y  s        11&''     R R R R R        rj   r<   c                   ^     e Zd Zd ed          iZddddd fd
Zd Z fdZ fdZ xZ	S )	r=   r   r   N)r   r   
max_digitsdecimal_placesc                    ||c| _         | _         t                      j        d||d| | j                            t	          j        ||                     d S )N)r   r   rI   )r   r   rc   rd   r   r   DecimalValidator)re   r   r   r   r   r   r_   s         ri   rd   zDecimalField.__init__  sc     0:>,,L9	LLVLLLz::~VVWWWWWrj   c                     || j         v rdS | j        rt          j        |          }	 t	          t          |                    }n*# t          $ r t          | j        d         d          w xY w|S )a  
        Validate that the input is a decimal number. Return a Decimal
        instance or None for empty values. Ensure that there are no more
        than max_digits in the number and no more than decimal_places digits
        after the decimal point.
        Nr   ru   )	rw   rP   r!   r   r   r   r   r	   rN   rm   s     ri   rr   zDecimalField.to_python  s     D%%%4= 	7/66E	RCJJ''EE 	R 	R 	R!$"5i"@yQQQQ	Rs   A 'A,c                     t                                          |           || j        v rd S |                                st	          | j        d         dd|i          d S )Nr   rn   rv   params)rc   rx   rw   	is_finiter	   rN   r   s     ri   rx   zDecimalField.validate  sw    D%%%F   	!#I.'   	 	rj   c                 T   t                                          |          }t          |t                    rpd|j        vrg| j        Ht          t          d                              | j                             	                                }nd}|
                    d|           |S )Nr      r   )rc   r[   rU   r   r\   r   r   r   scaleblowerr   r   s       ri   r[   zDecimalField.widget_attrs  s    $$V,,fk** 	+vV\/I/I". 71::,,d.A-ABBCCIIKKVT***rj   )
r   r   r   r   rT   rd   rr   rx   r[   r   r   s   @ri   r=   r=     s        11&'' X X X X X X X  "	 	 	 	 	
 
 
 
 
 
 
 
 
rj   r=   c                   0     e Zd Zdd fd
Zd Zd Z xZS )BaseTemporalFieldN)input_formatsc                P     t                      j        di | |	|| _        d S d S r   )rc   rd   r   )re   r   r   r_   s      ri   rd   zBaseTemporalField.__init__  s<    ""6"""$!.D %$rj   c                     |                                 }| j        D ]1}	 |                     ||          c S # t          t          f$ r Y .w xY wt          | j        d         d          r   )r   r   strptimer   r   r	   rN   re   rn   formats      ri   rr   zBaseTemporalField.to_python  s    ( 	 	F}}UF33333	*   d1)<9MMMMs   7A
Ac                      t          d          )Nz#Subclasses must define this method.NotImplementedErrorr   s      ri   r   zBaseTemporalField.strptime  s    !"GHHHrj   )r   r   r   rd   rr   r   r   r   s   @ri   r   r     sm        (, / / / / / / /
N N NI I I I I I Irj   r   c                   b     e Zd ZeZ ej        d          Zd ed          iZ	 fdZ
d Z xZS )r-   DATE_INPUT_FORMATSr   Enter a valid date.c                     || j         v rdS t          |t          j                  r|                                S t          |t          j                  r|S t	                                          |          S )zs
        Validate that the input can be converted to a date. Return a Python
        datetime.date object.
        N)rw   rU   datetimedaterc   rr   r   s     ri   rr   zDateField.to_python  sl    
 D%%%4eX.// 	 ::<<eX]++ 	Lww  '''rj   c                 f    t           j                             ||                                          S rl   )r   r   r   r   s      ri   r   zDateField.strptime  '     ))%88==???rj   )r   r   r   r   rJ   r!   get_format_lazyr   r   rT   rr   r   r   r   s   @ri   r-   r-     s~        F+G+,@AAM11*++( ( ( ( (@ @ @ @ @ @ @rj   r-   c                   b     e Zd ZeZ ej        d          Zd ed          iZ	 fdZ
d Z xZS )r.   TIME_INPUT_FORMATSr   Enter a valid time.c                     || j         v rdS t          |t          j                  r|S t	                                          |          S )zs
        Validate that the input can be converted to a time. Return a Python
        datetime.time object.
        N)rw   rU   r   timerc   rr   r   s     ri   rr   zTimeField.to_python  sI    
 D%%%4eX]++ 	Lww  '''rj   c                 f    t           j                             ||                                          S rl   )r   r   r   r   s      ri   r   zTimeField.strptime  r   rj   )r   r   r   r   rJ   r!   r   r   r   rT   rr   r   r   r   s   @ri   r.   r.     s|        F+G+,@AAM'+@)A)AB	( 	( 	( 	( 	(@ @ @ @ @ @ @rj   r.   c                       e Zd Zd ZdS )DateTimeFormatsIteratorc              #   r   K   t          j        d          E d {V  t          j        d          E d {V  d S )NDATETIME_INPUT_FORMATSr   )r!   
get_formatre   s    ri   __iter__z DateTimeFormatsIterator.__iter__  sT      %&>?????????%&:;;;;;;;;;;;rj   N)r   r   r   r  rI   rj   ri   r   r     s#        < < < < <rj   r   c                   \     e Zd ZeZ e            Zd ed          iZd Z	 fdZ
d Z xZS )r/   r   zEnter a valid date/time.c                 X    t          |t          j                  rt          |          }|S rl   )rU   r   r   rm   s     ri   ro   zDateTimeField.prepare_value  s)    eX.// 	/'..Erj   c                    || j         v rdS t          |t          j                  rt          |          S t          |t          j                  r4t          j        |j        |j        |j                  }t          |          S 	 t          |	                                          }n*# t          $ r t          | j        d         d          w xY w|s!t                                          |          }t          |          S )z{
        Validate that the input can be converted to a datetime. Return a
        Python datetime.datetime object.
        Nr   ru   )rw   rU   r   r   r   yearmonthdayr"   r   r   r	   rN   rc   rr   )re   rn   r   r_   s      ri   rr   zDateTimeField.to_python  s    
 D%%%4eX.// 	0(///eX]++ 	1&uz5;	JJF(000	R#EKKMM22FF 	R 	R 	R!$"5i"@yQQQQ	R 	.WW&&u--F$V,,,s   !B' ''Cc                 B    t           j                             ||          S rl   )r   r   r   s      ri   r   zDateTimeField.strptime!  s     ))%888rj   )r   r   r   r   rJ   r   r   r   rT   ro   rr   r   r   r   s   @ri   r/   r/     s        F++--M11/00  
- - - - -(9 9 9 9 9 9 9rj   r/   c                   H    e Zd Z ed           ed          dZd Zd ZdS )r0   zEnter a valid duration.z=The number of days must be between {min_days} and {max_days}.)r   overflowc                 X    t          |t          j                  rt          |          S |S rl   )rU   r   	timedeltar$   rm   s     ri   ro   zDurationField.prepare_value+  s*    eX/00 	*"5)))rj   c                    || j         v rd S t          |t          j                  r|S 	 t	          t          |                    }ng# t          $ rZ t          | j        d         	                    t          j        j
        j        t          j        j        j                  d          w xY w|t          | j        d         d          |S )Nr  )min_daysmax_daysru   r   )rw   rU   r   r  r#   r   OverflowErrorr	   rN   r   r   daysr   rm   s     ri   rr   zDurationField.to_python0  s    D%%%4eX/00 	L		"3u::..EE 	 	 	!#J/66%/38%/38 7       	 =!$"5i"@yQQQQs   A A$B*N)r   r   r   r   rT   ro   rr   rI   rj   ri   r0   r0   %  s[        1.//AUVV 
  
    rj   r0   c                   B     e Zd Z fdZd Zd Z eee          Z xZS )r1   c                     |                     dd            t                      j        di | |                     |           dS )zW
        regex can be either a string or a compiled regular expression object.
        r   FNrI   )r   rc   rd   
_set_regex)re   regexr   r_   s      ri   rd   zRegexField.__init__E  sP     	'5)))""6"""rj   c                     | j         S rl   )_regexr  s    ri   
_get_regexzRegexField._get_regexM  s
    {rj   c                 R   t          |t                    rt          j        |          }|| _        t          | d          r-| j        | j        v r| j                            | j                   t          j	        |          | _        | j        
                    | j                   d S )N_regex_validator)r  )rU   r   recompiler  rz   r  r   removeRegexValidatorr   )re   r  s     ri   r  zRegexField._set_regexP  s    eS!! 	&Ju%%ED,--	:%88O""4#8999 * 9 F F Ft455555rj   )	r   r   r   rd   r  r  propertyr  r   r   s   @ri   r1   r1   D  s]              
6 
6 
6 HZ,,EEEEErj   r1   c                   2     e Zd ZeZej        gZ fdZ xZ	S )r2   c                 j    |                     dd            t                      j        dddi| d S )Nr   i@  r   TrI   )r   rc   rd   re   r   r_   s     ri   rd   zEmailField.__init__c  sC     	,,,,..t.v.....rj   )
r   r   r   r   rJ   r   validate_emailrb   rd   r   r   s   @ri   r2   r2   _  sI        F$34/ / / / / / / / /rj   r2   c                        e Zd ZeZ ed           ed           ed           eddd           ed          dZd	d
d fd
Zd Z	d fd	Z
d Zd Z xZS )r3   z;No file was submitted. Check the encoding type on the form.zNo file was submitted.zThe submitted file is empty.zGEnsure this filename has at most %(max)d character (it has %(length)d).zHEnsure this filename has at most %(max)d characters (it has %(length)d).r   zBPlease either submit a file or check the clear checkbox, not both.)r   missingemptyr   contradictionNF)r   allow_empty_filec                V    || _         || _         t                      j        di | d S r   )r   r,  rc   rd   )re   r   r,  r   r_   s       ri   rd   zFileField.__init__z  s5    $ 0""6"""""rj   c                    || j         v rd S 	 |j        }|j        }n*# t          $ r t	          | j        d         d          w xY w| j        Lt          |          | j        k    r4| j        t          |          d}t	          | j        d         d|          |st	          | j        d         d          | j        s|st	          | j        d         d          |S )Nr   ru   )r   lengthr   r   r*  )	rw   namesizeAttributeErrorr	   rN   r   lenr,  )re   r   	file_name	file_sizer   s        ri   rr   zFileField.to_python  s   4$$$4	R	I	II 	R 	R 	R!$"5i"@yQQQQ	R ?&3y>>DO+K+K!_IGGF!#L1V     	R!$"5i"@yQQQQ$ 	NY 	N!$"5g">WMMMMs	    'Ac                     |t           u rt          | j        d         d          |du r| j        sdS d }|s|r|S t	                                          |          S )Nr+  ru   F)r   r	   rN   rG   rc   r   )re   r   rL   r_   s      ri   r   zFileField.clean  s~    +++!#O4?   
 5=== u D 	 	Nww}}T"""rj   c                     |S rl   rI   )re   r   rL   s      ri   r   zFileField.bound_data  s    rj   c                     | j          o|d uS rl   r   re   rL   r   s      ri   r   zFileField.has_changed  s    = 5T%55rj   rl   )r   r   r   r   rJ   r   r)   rT   rd   rr   r   r   r   r   r   s   @ri   r3   r3   j  s        F1RSS1-..122#mUV
 

 P
 
  &*E # # # # # # #
  .# # # # # #*  6 6 6 6 6 6 6rj   r3   c                   R     e Zd Zej        gZd ed          iZ fdZ fdZ	 xZ
S )r4   invalid_imagezYUpload a valid image. The file you uploaded was either not an image or a corrupted image.c                    t                                          |          }|dS ddlm} t	          |d          r|                                }nGt	          |d          r"t          |                                          }nt          |d                   }	 |                    |          }|	                                 ||_
        |j                            |j                  |_        n/# t          $ r"}t!          | j        d         d          |d}~ww xY wt	          |d	          r)t%          |j                  r|                    d           |S )
z
        Check that the file-upload field data contains a valid image (GIF, JPG,
        PNG, etc. -- whatever Pillow supports).
        Nr   )Imagetemporary_file_pathreadcontentr;  ru   seek)rc   rr   PILr=  rz   r>  r   r?  openverifyimageMIMEr   r   content_type	Exceptionr	   rN   callablerA  )re   r   fr=  filerE  excr_   s          ri   rr   zImageField.to_python  se   
 GGd##94 4.// 	0++--DDtV$$ 0tyy{{++tI//	 JJt$$ELLNNN AG #Z^^EL99ANN 	 	 	!#O4$   	 1f 	(16"2"2 	FF1IIIs   AC/ /
D9DDc                     t                                          |          }t          |t                    rd|j        vr|                    dd           |S )Nacceptzimage/*)rc   r[   rU   r   r\   r   r   s      ri   r[   zImageField.widget_attrs  sS    $$V,,fi(( 	2XV\-I-IXy111rj   )r   r   r   r   validate_image_file_extensionrb   r   rT   rr   r[   r   r   s   @ri   r4   r4     s|        $BC*
 
) ) ) ) )V        rj   r4   c                   f     e Zd ZeZd ed          iZ ej                    gZ	 fdZ
 fdZ xZS )r5   r   zEnter a valid URL.c                 >     t                      j        dddi| d S )Nr   TrI   )rc   rd   r&  s     ri   rd   zURLField.__init__  s+    ..t.v.....rj   c                      fd}t                                          |          }|rW ||          }|d         sd|d<   |d         s(|d         |d<   d|d<    |t          |                    }t          |          }|S )Nc                     	 t          t          |                     S # t          $ r t          j        d         d          w xY w)z
            Return a list of url parts via urlparse.urlsplit(), or raise
            ValidationError for some malformed URLs.
            r   ru   )r   r   r   r	   rN   )urlre   s    ri   	split_urlz%URLField.to_python.<locals>.split_url  sY    
VHSMM*** V V V &d&9)&D9UUUUVs	    'Ar   httpr      rH   )rc   rr   r   )re   rn   rU  
url_fieldsr_   s   `   ri   rr   zURLField.to_python  s    
	V 
	V 
	V 
	V 
	V !!%(( 	+"5))Ja= ' &
1a= ? !+1
1 "
1 'Yz*'='=>>
z**Erj   )r   r   r   r    rJ   r   rT   r   URLValidatorrb   rd   rr   r   r   s   @ri   r5   r5     s        F11)** 2*1334/ / / / /        rj   r5   c                   .     e Zd ZeZ fdZd Zd Z xZS )r6   c                     t          |t                    r|                                dv rd}nt          |          }t	                                          |          S )zReturn a Python boolean object.)false0F)rU   r   r   boolrc   rr   r   s     ri   rr   zBooleanField.to_python  sS     eS!! 	 ekkmm~&E&EEEKKEww  '''rj   c                 T    |s#| j         rt          | j        d         d          d S d S rt   )rG   r	   rN   rm   s     ri   rx   zBooleanField.validate%  sH     	T 	T!$"5j"A
SSSS	T 	T 	T 	Trj   c                 l    | j         rdS |                     |          |                     |          k    S )NF)rQ   rr   r9  s      ri   r   zBooleanField.has_changed)  s6    = 	5 ~~g&&$..*>*>>>rj   )	r   r   r   r   rJ   rr   rx   r   r   r   s   @ri   r6   r6     s^        F
( 
( 
( 
( 
(T T T? ? ? ? ? ? ?rj   r6   c                   "    e Zd ZdZeZd Zd ZdS )r7   za
    A field whose valid values are None, True, and False. Clean invalid values
    to None.
    c                     |dv rdS |dv rdS dS )a  
        Explicitly check for the string 'True' and 'False', which is what a
        hidden field will submit for True and False, for 'true' and 'false',
        which are likely to be returned by JavaScript serializations of forms,
        and for '1' and '0', which is what a RadioField will submit. Unlike
        the Booleanfield, this field must check for True because it doesn't
        use the bool() function.
        )TTruetrue1T)FFalser\  r]  FNrI   rm   s     ri   rr   zNullBooleanField.to_python9  s+     ///444454rj   c                     d S rl   rI   rm   s     ri   rx   zNullBooleanField.validateI      rj   N)r   r   r   __doc__r   rJ   rr   rx   rI   rj   ri   r7   r7   1  sC         
 F       rj   r7   c                       e Zd Zd Zd ZdS )CallableChoiceIteratorc                     || _         d S rl   choices_func)re   rn  s     ri   rd   zCallableChoiceIterator.__init__N  s    (rj   c              #   >   K   |                                  E d {V  d S rl   rm  r  s    ri   r  zCallableChoiceIterator.__iter__Q  s0      $$&&&&&&&&&&&rj   N)r   r   r   rd   r  rI   rj   ri   rk  rk  M  s2        ) ) )' ' ' ' 'rj   rk  c                        e Zd ZeZd ed          iZdd fd
Z fdZd Z	d Z
 ee	e
          Zd	 Z fd
Zd Z xZS )r8   invalid_choiceESelect a valid choice. %(value)s is not one of the available choices.rI   )choicesc                H     t                      j        di | || _        d S r   )rc   rd   rs  )re   rs  r   r_   s      ri   rd   zChoiceField.__init__]  s+    ""6"""rj   c                     t                                          |          }t          j        | j        |          |_        |S rl   )rc   r   rW   rX   _choicesre   r   r   r_   s      ri   r   zChoiceField.__deepcopy__a  s4    %%d++-t<<rj   c                     | j         S rl   )rv  r  s    ri   _get_choiceszChoiceField._get_choicesf  s
    }rj   c                     t          |          rt          |          }nt          |          }|x| _        | j        _        d S rl   )rI  rk  r   rv  rJ   rs  rm   s     ri   _set_choiceszChoiceField._set_choicesi  sC     E?? 	 *511EEKKE.33+++rj   c                 6    || j         v rdS t          |          S )r   rH   )rw   r   rm   s     ri   rr   zChoiceField.to_pythonv  s!    D%%%25zzrj   c                     t                                          |           |r4|                     |          s!t          | j        d         dd|i          dS dS )z+Validate that the input is in self.choices.rq  rn   r   N)rc   rx   valid_valuer	   rN   r   s     ri   rx   zChoiceField.validate|  sz     	))%00 	!#$45%'   	 	 	 	rj   c                     t          |          }| j        D ]c\  }}t          |t          t          f          r&|D ]"\  }}||k    s|t          |          k    r  dS #G||k    s|t          |          k    r dS ddS )z5Check to see if the provided value is a valid choice.TF)r   rs  rU   r   tuple)re   rn   
text_valuekr   k2v2s          ri   r~  zChoiceField.valid_value  s    ZZ
L 	  	 DAq!dE]++   $ $FB{{jCGG&;&;#ttt '<$ A::s1vv!5!544 "6urj   )r   r   r   r   rJ   r   rT   rd   r   ry  r{  r#  rs  rr   rx   r~  r   r   s   @ri   r8   r8   U  s        F!!S
 
 #%           
  	4 	4 	4 h|\22G            rj   r8   c                   8     e Zd Zd dd fd
Zd Z fdZ xZS )rC   c                     | S rl   rI   vals    ri   <lambda>zTypedChoiceField.<lambda>      S rj   rH   )coercer   c                V    || _         || _         t                      j        di | d S r   )r  r   rc   rd   )re   r  r   r   r_   s       ri   rd   zTypedChoiceField.__init__  s5    &""6"""""rj   c                     || j         k    s	|| j        v r| j         S 	 |                     |          }n:# t          t          t
          f$ r  t          | j        d         dd|i          w xY w|S )zZ
        Validate that the value can be coerced to the right type (if not empty).
        rq  rn   r   )r   rw   r  r   r   r	   rN   rm   s     ri   r   zTypedChoiceField._coerce  s     D$$$1B(B(B##	KK&&EEI7 	 	 	!#$45%'   	 s	   3 7A*c                 p    t                                          |          }|                     |          S rl   rc   r   r   r   s     ri   r   zTypedChoiceField.clean  *    e$$||E"""rj   )r   r   r   rd   r   r   r   r   s   @ri   rC   rC     sq        !0b # # # # # # #
   # # # # # # # # #rj   rC   c                   V    e Zd ZeZeZ ed           ed          dZd Z	d Z
d ZdS )r9   rr  Enter a list of values.)rq  invalid_listc                     |sg S t          |t          t          f          st          | j        d         d          d |D             S )Nr  ru   c                 ,    g | ]}t          |          S rI   r   ).0r  s     ri   
<listcomp>z1MultipleChoiceField.to_python.<locals>.<listcomp>  s    ***SC***rj   )rU   r   r  r	   rN   rm   s     ri   rr   zMultipleChoiceField.to_python  s_     	IED%=11 	!#N3.    +*E****rj   c                     | j         r|st          | j        d         d          |D ]6}|                     |          st          | j        d         dd|i          7dS )z+Validate that the input is a list or tuple.rG   ru   rq  rn   r   N)rG   r	   rN   r~  )re   rn   r  s      ri   rx   zMultipleChoiceField.validate  s    = 	T 	T!$"5j"A
SSSS 	 	C##C(( %'(89)#S>   	 	rj   c                     | j         rdS |g }|g }t          |          t          |          k    rdS d |D             }d |D             }||k    S )NFTc                 ,    h | ]}t          |          S rI   r  r  rn   s     ri   	<setcomp>z2MultipleChoiceField.has_changed.<locals>.<setcomp>  s    777es5zz777rj   c                 ,    h | ]}t          |          S rI   r  r  s     ri   r  z2MultipleChoiceField.has_changed.<locals>.<setcomp>  s    1115CJJ111rj   )rQ   r3  )re   rL   r   initial_setdata_sets        ri   r   zMultipleChoiceField.has_changed  sr    = 	5?G<Dw<<3t99$$477w77711D111;&&rj   N)r   r   r   r   r   r   rJ   r   rT   rr   rx   r   rI   rj   ri   r9   r9     sz        'MF!S
 
 344	 + + +  ' ' ' ' 'rj   r9   c                   @     e Zd Zd d fd
Zd Z fdZ fdZ xZS )rD   c                     | S rl   rI   r  s    ri   r  z!TypedMultipleChoiceField.<lambda>  r  rj   )r  c                ~    || _         |                    dg           | _         t                      j        di | d S )Nr   rI   )r  popr   rc   rd   )re   r  r   r_   s      ri   rd   z!TypedMultipleChoiceField.__init__  sC    !::mR88""6"""""rj   c                    || j         k    s	|| j        v r| j         S g }|D ]e}	 |                    |                     |                     ,# t          t
          t          f$ r  t          | j        d         dd|i          w xY w|S )zl
        Validate that the values are in self.choices and can be coerced to the
        right type.
        rq  rn   r   )r   rw   r   r  r   r   r	   rN   )re   rn   	new_valuechoices       ri   r   z TypedMultipleChoiceField._coerce  s    
 D$$$1B(B(B##	 	 	F  V!4!45555	?;   %'(89)#V,    s   (A7Bc                 p    t                                          |          }|                     |          S rl   r  r   s     ri   r   zTypedMultipleChoiceField.clean  r  rj   c                     || j         k    r#t                                          |           d S | j        rt	          | j        d         d          d S rt   )r   rc   rx   rG   r	   rN   r   s     ri   rx   z!TypedMultipleChoiceField.validate  sa    D$$$GGU#####] 	T!$"5j"A
SSSS	T 	Trj   )r   r   r   rd   r   r   rx   r   r   s   @ri   rD   rD     s        !0 # # # # # # #
  &# # # # #T T T T T T T T Trj   rD   c                   ,     e Zd ZdZ fdZ fdZ xZS )r:   zL
    A Field whose clean() method calls multiple Field clean() methods.
    c                 `     t                      j        di | |D ]	}d|_        
|| _        d S )NFrI   )rc   rd   rG   fields)re   r  r   rJ  r_   s       ri   rd   zComboField.__init__  sE    ""6"""  	 	AAJJrj   c                     t                                          |           | j        D ]}|                    |          }|S )zr
        Validate the given value against all of self.fields, which is a
        list of Field instances.
        )rc   r   r  )re   rn   fieldr_   s      ri   r   zComboField.clean  sD    
 	e[ 	' 	'EKK&&EErj   )r   r   r   ri  rd   r   r   r   s   @ri   r:   r:     s[                     rj   r:   c                   x     e Zd ZdZ ed           ed          dZdd fd
Z fdZd	 Zd
 Z	d Z
d Z xZS )r;   a  
    Aggregate the logic of multiple Fields.

    Its clean() method takes a "decompressed" list of values, which are then
    cleaned into a single value according to self.fields. Each value in
    this list is cleaned by the corresponding field -- the first value is
    cleaned by the first field, the second value is cleaned by the second
    field, etc. Once all fields are cleaned, the list of clean values is
    "compressed" into a single value.

    Subclasses should not have to implement clean(). Instead, they must
    implement compress(), which takes a list of valid values and returns a
    "compressed" version of those values -- a single value.

    You'll probably want to use this with MultiWidget.
    r  zEnter a complete value.)r   
incompleteT)require_all_fieldsc                    || _          t                      j        di | |D ]D}|j                            d| j        d                    | j        rd|_        | j         rd|_        E|| _        d S )Nr  TFrI   )r  rc   rd   rN   r   rQ   rG   r  )re   r  r  r   rJ  r_   s        ri   rd   zMultiValueField.__init__2  s    "4""6""" 	# 	#A''d6I,6WXXX} "!
& # #
rj   c                     t                                                    }t          fd| j        D                       |_        |S )Nc              3   B   K   | ]}|                               V  d S rl   )r   )r  xr   s     ri   	<genexpr>z/MultiValueField.__deepcopy__.<locals>.<genexpr>B  s/      HHqannT22HHHHHHrj   )rc   r   r  r  rw  s    ` ri   r   zMultiValueField.__deepcopy__@  sF    %%d++HHHHDKHHHHHrj   c                     d S rl   rI   rm   s     ri   rx   zMultiValueField.validateE  rh  rj   c                 2    g }g  j         r/t          |t                    s j                            |          }|rt          |t          t
          f          rI|r fd|D             s8 j        rt           j        d         d           	                    g           S nt           j        d         d          t           j                  D ]\  }}	 ||         }n# t          $ r d}Y nw xY w| j        v rb j        r$ j        rt           j        d         d          n7|j        r0|j        d         vr                     |j        d                    	 |                    |                    |                     # t          $ r0}                    fd|j        D                        Y d}~d}~ww xY wrt                     	                    |          }                     |                                |           |S )aI  
        Validate every value in the given list. A value is validated against
        the corresponding Field in self.fields.

        For example, if this MultiValueField was instantiated with
        fields=(DateField(), TimeField()), clean() would call
        DateField.clean(value[0]) and TimeField.clean(value[1]).
        c                 &    g | ]}|j         v|S rI   )rw   )r  r   re   s     ri   r  z)MultiValueField.clean.<locals>.<listcomp>V  s&     P P PqQd>O5O5O5O5O5Orj   rG   ru   r   Nr  c              3   $   K   | ]
}|v|V  d S rl   rI   )r  mr~   s     ri   r  z(MultiValueField.clean.<locals>.<genexpr>y  s'      IIA&aIIrj   )rQ   rU   r   rJ   
decompressr  rG   r	   rN   compress	enumerater  
IndexErrorrw   r  r   r   r|   r}   rx   r   )	re   rn   
clean_datair  field_valuer   outr~   s	   `       @ri   r   zMultiValueField.cleanH  s    
= 	2E4!8!8 	2K**511E 		R
54-88 		R - P P P PE P P P -= -)+J7j     ==,,,- "$"5i"@yQQQQ!$+.. 	J 	JHAu##Ah # # #"#d///*  } - /
;*    ^  +L9GGe&:<&HIIIJ!!%++k":":;;;;" J J J IIIIIIIIIIIIIII	J
  	*!&)))mmJ''cC   
s*   C##C21C2!(F


G&F??Gc                      t          d          )aD  
        Return a single value for the given list of values. The values can be
        assumed to be valid.

        For example, if this MultiValueField was instantiated with
        fields=(DateField(), TimeField()), this might return a datetime
        object created by combining the date and time in data_list.
        z&Subclasses must implement this method.r   )re   	data_lists     ri   r  zMultiValueField.compress  s     ""JKKKrj   c                    | j         rdS |(d t          dt          |                    D             }n/t          |t                    s| j                            |          }t          | j        ||          D ]H\  }}}	 |	                    |          }n# t          $ r Y  dS w xY w|                    ||          r dS IdS )NFc                     g | ]}d S )rH   rI   )r  r  s     ri   r  z/MultiValueField.has_changed.<locals>.<listcomp>  s    777ar777rj   r   T)rQ   ranger3  rU   r   rJ   r  zipr  rr   r	   r   )re   rL   r   r  s       ri   r   zMultiValueField.has_changed  s    = 	5?775CII#6#6777GGgt,, :+0099$'Wd$C$C 	 	 E7D//'22"   ttt  $// ttus    B
B%$B%)r   r   r   ri  r   rT   rd   r   rx   r   r  r   r   r   s   @ri   r;   r;     s         $ 1.//a122 
 6:           
  8 8 8t	L 	L 	L      rj   r;   c                   *     e Zd Zddddd fd
Z xZS )r@   NFT)match	recursiveallow_filesallow_foldersc          
         |||c| _         | _        | _        ||c| _        | _         t                      j        dddi| | j        rg | _        ndg| _        | j        t          j
        | j                  | _        |rNt          t          j        | j                             D ]$\  }}}	| j        rt          |	          D ]t}
| j        | j                            |
          rQt          j                             ||
          }
| j                            |
|
                    |dd          f           u| j        rt          |          D ]{}
|
dk    r	| j        | j                            |
          rQt          j                             ||
          }
| j                            |
|
                    |dd          f           |&ng }t          j        | j                   5 }|D ]}
|
j        dk    r| j        r|
                                s| j        r[|
                                rG| j        | j                            |
j                  r!|                    |
j         |
j        f           	 d d d            n# 1 swxY w Y   |                    t1          j        d                     | j                            |           | j        | j        _        d S )Nrs  rI   )rH   z	---------rH   r   __pycache__)key)pathr  r  r  r  rc   rd   rG   rs  r  r   match_resortedoswalksearchjoinr   replacescandirr0  is_fileis_dirsortoperator
itemgetterr|   rJ   )re   r  r  r  r  r  r   rootdirsfilesrJ  rs  entriesr_   s                ri   rd   zFilePathField.__init__  s    15eY-	4:t~/:M,$,...v...= 	/DLL-.DL:!Jtz22DM 	)%+BGDI,>,>%?%? M M!dE# M#E]] M M:-1E1Ea1H1H- "T1 5 5A L//AIIdB4J4J0KLLL% M#D\\ M M--$:-1E1Ea1H1H- "T1 5 5A L//AIIdB4J4J0KLLLM GDI&& 9'  9 9Av.. )9./iikk9 .93488::9  :-1E1Eaf1M1M-'788899 9 9 9 9 9 9 9 9 9 9 9 9 9 9 LLX033L444L((("ls   *BJJ
J
)r   r   r   rd   r   r   s   @ri   r@   r@     sP        
 2+ 2+ 2+ 2+ 2+ 2+ 2+ 2+ 2+ 2+ 2+rj   r@   c                   b     e Zd ZeZeZ ed           ed          dZddd fd
Z	d Z
 xZS )r>   r   r   )invalid_dateinvalid_timeN)input_date_formatsinput_time_formatsc                @   | j                                         }d|v r|                    |d                    |                    dd          }t	          |d|d         i|          t          |d|d         i|          f} t                      j        |fi | d S )NrN   rP   Fr   r  )r   rN   rP   r  )rT   rW   r]   r   r-   r.   rc   rd   )re   r  r  r   r~   rP   r  r_   s          ri   rd   zSplitDateTimeField.__init__  s    ,1133v%%MM&!12333::j%000 )6.+AB!  
 0 )6.+AB!  
 	**6*****rj   c                     |rx|d         | j         v rt          | j        d         d          |d         | j         v rt          | j        d         d          t          j        j        | }t          |          S d S )Nr   r  ru   r   r  )rw   r	   rN   r   combiner   )re   r  r   s      ri   r  zSplitDateTimeField.compress  s     	1 |t000%'7n    |t000%'7n    &.	:F(000trj   )r   r   r   r   rJ   r   r   r   rT   rd   r  r   r   s   @ri   r>   r>     s         F-M/00/00 
 .2d + + + + + + +&      rj   r>   c                   ,     e Zd Zddd fd
Zd Z xZS )r?   bothF)protocolunpack_ipv4c                    || _         t          j        ||          d         | _        |                    dt
                      t                      j        di | d S )Nr   r   rI   )r  r   ip_address_validatorsrb   r   r%   rc   rd   )re   r  r  r   r_   s       ri   rd   zGenericIPAddressField.__init__  si    &","Bk#
 #

# 	,(?@@@""6"""""rj   c                     || j         v rdS |                                }|r d|v rt          || j        | j                  S |S )NrH   :)r   )rw   r   r&   r  r   rm   s     ri   rr   zGenericIPAddressField.to_python
  s\    D%%%2 	SE\\%t'DO    rj   )r   r   r   rd   rr   r   r   s   @ri   r?   r?     sV        #)u # # # # # # #      rj   r?   c                   4     e Zd Zej        gZdd fd
Z xZS )rB   F)allow_unicodec                z    || _         | j         rt          j        g| _         t	                      j        di | d S r   )r  r   validate_unicode_slugrb   rc   rd   )re   r  r   r_   s      ri   rd   zSlugField.__init__  sH    * 	I'1'G&HD#""6"""""rj   )r   r   r   r   validate_slugrb   rd   r   r   s   @ri   rB   rB     sQ        $23(- # # # # # # # # # # #rj   rB   c                   >     e Zd Zd ed          iZd Z fdZ xZS )rE   r   zEnter a valid UUID.c                 X    t          |t          j                  rt          |          S |S rl   )rU   uuidUUIDr   rm   s     ri   ro   zUUIDField.prepare_value$  s'    eTY'' 	u::rj   c                    t                                          |          }|| j        v rd S t          |t          j                  s@	 t	          j        |          }n*# t          $ r t          | j        d         d          w xY w|S r   )	rc   rr   rw   rU   r  r  r   r	   rN   r   s     ri   rr   zUUIDField.to_python)  s    !!%((D%%%4%++ 	VV	%(( V V V%d&9)&D9UUUUVs   	A 'B)r   r   r   r   rT   ro   rr   r   r   s   @ri   rE   rE     s_        11*++  
	 	 	 	 	 	 	 	 	rj   rE   c                       e Zd ZdS )InvalidJSONInputNr   r   r   rI   rj   ri   r  r  5          Drj   r  c                       e Zd ZdS )
JSONStringNr   rI   rj   ri   r  r  9  r  rj   r  c                   Z     e Zd Zd ed          iZeZd	 fd	Zd Zd Z	d Z
 fdZ xZS )
rA   r   zEnter a valid JSON.Nc                 V    || _         || _         t                      j        di | d S r   )encoderdecoderrc   rd   )re   r  r  r   r_   s       ri   rd   zJSONField.__init__C  s4    ""6"""""rj   c                 t   | j         r|S || j        v rd S t          |t          t          t
          t          t          f          r|S 	 t          j	        || j
                  }n2# t          j        $ r  t          | j        d         dd|i          w xY wt          |t                    rt          |          S |S )Nclsr   rn   r   )rQ   rw   rU   r   dictr   r   r  jsonloadsr  JSONDecodeErrorr	   rN   r   )re   rn   	converteds      ri   rr   zJSONField.to_pythonH  s    = 	LD%%%4dC
CDD 	L	
5dl;;;II# 	 	 	!#I.'   	 i%% 	i(((s   A" "/Bc                     | j         r|S |d S 	 t          j        || j                  S # t          j        $ r t          |          cY S w xY w)Nr	  )rQ   r  r  r  r  r  r   s      ri   r   zJSONField.bound_data\  si    = 	N<4	*:d5555# 	* 	* 	*#D)))))	*s   * A
Ac                 h    t          |t                    r|S t          j        |d| j                  S )NF)ensure_asciir
  )rU   r  r  dumpsr  rm   s     ri   ro   zJSONField.prepare_valuef  s3    e-.. 	Lz%eFFFFrj   c                     t                                          ||          rdS t          j        |d| j                  t          j        |                     |          d| j                  k    S )NT)	sort_keysr
  )rc   r   r  r  r  rr   )re   rL   r   r_   s      ri   r   zJSONField.has_changedk  sq    77w-- 	4 z'Tt|DDD
NN4  DdlI
 I
 I
 
 	
rj   )NN)r   r   r   r   rT   r   rJ   rd   rr   r   ro   r   r   r   s   @ri   rA   rA   =  s        11*++ F# # # # # #
  (* * *G G G

 
 
 
 
 
 
 
 
rj   rA   )ari  rW   r   r  r   r  r  r  r  decimalr   r   ior   urllib.parser   r   django.corer   django.core.exceptionsr	   django.forms.boundfieldr   django.forms.utilsr   r   django.forms.widgetsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    django.utilsr!   django.utils.dateparser"   r#   django.utils.durationr$   django.utils.ipv6r%   r&   django.utils.regex_helperr'   django.utils.translationr(   r   r)   __all__r*   r+   r,   r<   r=   r   r-   r.   r   r/   r0   r1   r2   r3   r4   r5   r6   r7   rk  r8   rC   r9   rD   r:   r;   r@   r>   r?   rB   rE   r   r  r  rA   rI   rj   ri   <module>r%     s         				 				  - - - - - - - -       - - - - - - - - " " " " " " 2 2 2 2 2 2 . . . . . . I I I I I I I I                                         * !           A A A A A A A A 1 1 1 1 1 1 I I I I I I I I 6 6 6 6 6 6 6 6 6 6 6 6 2 2 2 2 2 2@n n n n n n n nb! ! ! ! ! ! ! !H/ / / / /5 / / /d$ $ $ $ $ $ $ $N8 8 8 8 8< 8 8 8vI I I I I I I I(@ @ @ @ @! @ @ @0@ @ @ @ @! @ @ @(< < < < < < < <!9 !9 !9 !9 !9% !9 !9 !9H    E   >- - - - - - - -6/ / / / / / / /E6 E6 E6 E6 E6 E6 E6 E6P8 8 8 8 8 8 8 8v& & & & &y & & &R? ? ? ? ?5 ? ? ?6    |   8' ' ' ' ' ' ' '= = = = =% = = =@# # # # #{ # # #6+' +' +' +' +'+ +' +' +'\!T !T !T !T !T2 !T !T !TH       2A A A A Ae A A AH3+ 3+ 3+ 3+ 3+K 3+ 3+ 3+l) ) ) ) ) ) ) )X    I   (# # # # #	 # # #    	   ,	 	 	 	 	s 	 	 		 	 	 	 	 	 	 	5
 5
 5
 5
 5
	 5
 5
 5
 5
 5
rj   