
    ؄_`                        d 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	 Z
 G d
 de          Z G d de          Z G d de          Z G d de          Z G d dee          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Zd S )!zThe internals for the unit of work system.

The session's flush() process passes objects to a contextual object
here, which assembles flush tasks based on mappers and their properties,
organizes them in order of dependency, and executes.

   
attributes)exc)persistence)util   )event)topologicalc                     |j         fd}fd}fd}t          j        | d|dd           t          j        | d|dd           t          j        | d|dd           d	S )
z\Establish event listeners on object attributes which handle
    cascade-on-set/append.

    c                 @   |d S | j         }|r|j        r|                    d           | j        j        j                 }t          j        |          }|j        j	        r<|j
        s|j        k    r*|                    |          s|                    |           |S )Nzcollection append)session_warn_on_events_flush_warningmanagermapper_propsr   instance_state_cascadesave_updatecascade_backrefskey_contains_state_save_or_update_statestateitem	initiatorsessprop
item_stater   s         ^/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/orm/unitofwork.pyappendz$track_cascade_events.<locals>.append    s     <F} 	7# 9##$7888='.s3D#2488J)7*7.1Y].B.B,,Z88 /C **:666    c                    |d S | j         }| j        j        j                 }|r%|j        r|                    |j        rdnd           ||t          j        uru|t          j	        uri|j
        j        r_t          j        |          }|j                            |          r3|r ||j        v r|                    |           d S d|_        d S d S d S d S d S d S )Nzcollection removezrelated attribute deleteT)r   r   r   r   r   r   uselistr   	NEVER_SETPASSIVE_NO_RESULTr   delete_orphanr   
_is_orphan_newexpunge_orphaned_outside_of_sessionr   s         r!   removez$track_cascade_events.<locals>.remove6   s#   <F}}#*3/ 	D( 	<0##/   J000J888+ 9 $2488J{%%j11 C CJ$)33LL&&&&& ?CJ;;;! 008888C Cr#   c                 6   ||u r|S | j         }|r|j        r|                    d           | j        j        j                 }|\t          j        |          }|j        j	        r<|j
        s|j        k    r*|                    |          s|                    |           |t|t          j        urf|t          j        urX|j        j        rLt          j        |          }||j        v r/|j                            |          r|                    |           |S )Nzrelated attribute set)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r'   r(   r*   r)   r+   )	r   newvalueoldvaluer   r   r   newvalue_stateoldvalue_stater   s	           r!   set_z"track_cascade_events.<locals>.set_X   sB    xO} 	+# =##$;<<<='.s3D#!+!:8!D!DM-?.?252F2F 00@@ 3G ..~>>> $J$888J$@@@M/ A ",!:8!D!D!TY..4;3I3I"4 4. LL***r#   r"   T)rawretvalr-   setN)r   r	   listen)
descriptorr   r"   r-   r3   r   s        @r!   track_cascade_eventsr9      s    
 (C    , C  C  C  C  CD# # # # #J 
LXv4EEEE	LXv4EEEE	LUDd4@@@@@@r#   c                       e Zd Zd Zed             Zd Zd Zd Zd Z	e
j        fdZd Zd	 Z	 	 	 	 	 ddZd Zd Zej        d             Zd Zd Zd Zd Zd ZdS )UOWTransactionc                    || _         i | _        t          j        t                    | _        t          j        t                    | _        i | _        i | _        t	                      | _	        i | _
        t          j        d           | _        d S )Nc                  :    t                      t                      fS N)r6    r#   r!   <lambda>z)UOWTransaction.__init__.<locals>.<lambda>   s    CEE355> r#   )r   r   r   defaultdictr6   depsmapperspresort_actionspostsort_actionsdependenciesstatespost_update_states)selfr   s     r!   __init__zUOWTransaction.__init__   s      $S))	
 ',,
  "
 !#  EE
  #'"23I3I"J"Jr#   c                 *    t          | j                  S r>   )boolrG   rI   s    r!   has_workzUOWTransaction.has_work   s    DK   r#   c                     |j         rS	 |                    |t          j                   n1# t          j        $ r | j                            |g           Y dS w xY wdS )zZReturn ``True`` if the given state is expired and was deleted
        previously.
        TF)expired_load_expiredr   PASSIVE_OFForm_excObjectDeletedErrorr   _remove_newly_deletedrI   r   s     r!   was_already_deletedz"UOWTransaction.was_already_deleted   ss     = 	##E:+ABBBB-   22E7;;;tt us    * *AAc                 :    || j         v o| j         |         d         S )z[Return ``True`` if the given state is marked as deleted
        within this uowtransaction.    rG   rV   s     r!   
is_deletedzUOWTransaction.is_deleted   s"     #=E(:1(==r#   c                 Z    || j         v r| j         |         S  |            x| j         |<   }|S r>   r   )rI   r   	callable_rets       r!   memozUOWTransaction.memo   s8    $/!!?3'')24DOC 3Jr#   c                 D    | j         |         d         }|df| j         |<   dS )z;Remove pending actions for a state from the uowtransaction.rY   TNrZ   )rI   r   isdeletes      r!   remove_state_actionsz#UOWTransaction.remove_state_actions   s,     ;u%a(&-Er#   c                 6   d||f}|| j         v r| j         |         \  }}}|t           j        z  s|t           j        z  rr|j        |         j        }|                    ||j        t           j        t           j        z            }|r|j        r|	                                }n|}|||f| j         |<   nh|j        |         j        }|                    ||j        |t           j        z            }|r|j        r|	                                }n|}|||f| j         |<   |S )zOFacade to attributes.get_state_history(), including
        caching of results.history)
r   SQL_OKr   implget_historydictrR   LOAD_AGAINST_COMMITTEDuses_objectsas_state)	rI   r   r   passivehashkeyrd   state_historycached_passiverf   s	            r!   get_attribute_historyz$UOWTransaction.get_attribute_history   sN    eS) do%%59_W5M2G]N
 #Z%66Mj//M }S).**J*Z-NN 
  ,t0 ,$+$4$4$6$6MM$+M,3]G+L(=%*D &&uz7Z-N#N G  (4, ( ' 0 0 2 2 '(/'HDOG$r#   c                     |df| j         v S )NT)rD   )rI   	processors     r!   has_depzUOWTransaction.has_dep  s    4 D$888r#   c                 T    ||f}|| j         vrt          ||          | j         |<   d S d S r>   )rD   
Preprocess)rI   rr   
fromparentr   s       r!   register_preprocessorz$UOWTransaction.register_preprocessor  s?    *%d***(29j(I(ID %%% +*r#   FNc           	         | j                             |          s;|j        s2|0t          j        dt          j        |          d|d|d           dS || j        vrW|j        j	        }|| j
        vr|                     |           | j
        |                             |           ||f| j        |<   n|s|s|r|df| j        |<   dS )NzObject of type z not in session, z operation along 'z' will not proceedFT)r   r   deletedr   warnorm_utilstate_class_strrG   r   r   rC   _per_mapper_flush_actionsadd)rI   r   ra   listonlycancel_delete	operationr   r   s           r!   register_objectzUOWTransaction.register_object  s    |++E22 
	 = Y%:		  /6666			444I  
 5##])FT\))..v666L $$U+++"*H!5DK 7 7] 7&.%6E"tr#   c                     |j         j        j        }| j        |         \  }}|                    |           |                    |           d S r>   )r   r   base_mapperrH   r~   update)rI   r   post_update_colsr   rG   colss         r!   register_post_updatez#UOWTransaction.register_post_update-  sK    %1.v6

5$%%%%%r#   c                 ,   t          | |j                  }t          | |j                  }| j                            ||f           |j        D ]}|                    |            |j        D ]&}|j        r
|j	        }|                    |            'd S r>   )
SaveUpdateAllr   	DeleteAllrF   r~   _dependency_processorsper_property_preprocessorsrelationshipsviewonly_dependency_processor)rI   r   savesdeletesdepr   s         r!   r}   z(UOWTransaction._per_mapper_flush_actions3  s    dF$677D&"455ug.///0 	1 	1C**40000( 	1 	1D} ,C**40000		1 	1r#   c                 ,    t          j        d           S )a  return a dynamic mapping of (Mapper, DependencyProcessor) to
        True or False, indicating if the DependencyProcessor operates
        on objects of that Mapper.

        The result is stored in the dictionary persistently once
        calculated.

        c                 r    | d         j                             | d         j                  | d         j        u S )NrY   r   )r   getr   r   )tups    r!   r@   z0UOWTransaction._mapper_for_dep.<locals>.<lambda>L  s+    A))#a&*55QD r#   )r   PopulateDictrM   s    r!   _mapper_for_depzUOWTransaction._mapper_for_depA  s      DD
 
 	
r#   c                 2    | j         fd|D             S )zmFilter the given list of InstanceStates to those relevant to the
        given DependencyProcessor.

        c                 <    g | ]}|j         j        f         |S r?   )r   r   ).0sr   mapper_for_deps     r!   
<listcomp>z8UOWTransaction.filter_states_for_dep.<locals>.<listcomp>U  s-    MMMa^QY5Es4K%LMMMMr#   )r   )rI   r   rG   r   s    ` @r!   filter_states_for_depz$UOWTransaction.filter_states_for_depO  s+    
 -MMMMM6MMMMr#   c              #   z   K   ||f}|j         j        D ]'}| j        |         D ]}| j        |         |k    r|V  (d S r>   )r   self_and_descendantsrC   rG   )rI   r   ra   r   checktupr   s         r!   states_for_mapper_hierarchyz*UOWTransaction.states_for_mapper_hierarchyW  sf      h'(= 	  	 Ff-    ;u%11KKK 	  	 r#   c                 
    	 d}t           j                                                  D ]}|                               rd}|snFt	          j         j        t           j                                                            x _        }|r1t           fd|D                       }t           j                  D ] }d|v s/|d         j
        s"|d         j
        s|                    |          r j                            |           Q|d         |v rN j                            |           ||d                  D ]$} j                            ||d         f           %|d         |v rM j                            |           ||d                  D ]$} j                            |d         |f           %t          d  j                                        D                                           |          S )z}Generate the full, unsorted collection of PostSortRecs as
        well as dependency pairs for this UOWTransaction.

        TFc              3   `   K   | ](}|t          |                                        fV  )d S r>   )r6   per_state_flush_actions)r   recrI   s     r!   	<genexpr>z3UOWTransaction._generate_actions.<locals>.<genexpr>v  sO        BEc#55d;;<<=     r#   NrY   r   c                      g | ]}|j         	|S r?   disabled)r   as     r!   r   z4UOWTransaction._generate_actions.<locals>.<listcomp>  s    III1ajIQIIIr#   )listrD   valuesexecuter
   find_cyclesrF   rE   cyclesrh   r   
issupersetr-   r~   r6   
difference)rI   r^   actionr   convertedger   s   `      r!   _generate_actionsz UOWTransaction._generate_actions^  sV   	Ct3::<<==  >>$'' C 	  +6tD$9$@$@$B$BCC 
  
 	
f  	>     IO    G T.// > >DLLAw' !Aw' ! ((.. !
 %,,T2222!W&&%,,T222&tAw/ > >)--sDGn====>!W&&%,,T222&tAw/ > >)--tAwn====II-4466III
 

*V

	r#   c                 :   |                                  }| j        rMt          j        | j        |          D ]0}|r,|                                }|                    | |           |,1d S t          j        | j        |          D ]}|                    |            d S r>   )	r   r   r
   sort_as_subsetsrF   popexecute_aggregatesortr   )rI   rE   r3   nr   s        r!   r   zUOWTransaction.execute  s    1133 ; 		"#3!#3  4 4  4

A''d333  44 4 #'(9;KLL " "D!!!!" "r#   c                 >   | j         sdS t          | j                   }t          d | j                                         D                       }|                    |          }|r| j                            |           |r| j                            |           dS dS )zMark processed objects as clean / deleted after a successful
        flush().

        This method is called within the flush() method after the
        execute() method has succeeded and the transaction has been committed.

        Nc              3   *   K   | ]\  }\  }}|
|V  d S r>   r?   )r   r   ra   r   s       r!   r   z8UOWTransaction.finalize_flush_changes.<locals>.<genexpr>  sD       
 
+1*xh

 
 
 
 
 
r#   )rG   r6   itemsr   r   rU   _register_persistent)rI   rG   isdelothers       r!   finalize_flush_changesz%UOWTransaction.finalize_flush_changes  s     { 	FT[!! 
 
/3{/@/@/B/B
 
 
 
 
 !!%(( 	6L..u555 	5L--e44444	5 	5r#   )FFFNN)__name__
__module____qualname__rJ   propertyrN   rW   r[   r_   rb   r   PASSIVE_NO_INITIALIZErp   rs   rw   r   r   r}   r   memoized_propertyr   r   r   r   r   r   r?   r#   r!   r;   r;      sn       +K +K +KZ ! ! X!
 
 
> > >  . . . #-"B- - - -^9 9 9J J J        D& & &1 1 1 

 
 
N N N     2 2 2h" " ",5 5 5 5 5r#   r;   c                       e Zd Zd ZdS )IterateMappersMixinc                       j         r+t           fd j        j        j        D                       S  j        j        j        S )Nc              3   D   K   | ]}j         |j        f         |V  d S r>   )r   dependency_processor)r   mrI   uows     r!   r   z/IterateMappersMixin._mappers.<locals>.<genexpr>  sM        &4+D'EF     r#   )rv   iterr   parentr   r   rI   r   s   ``r!   _mapperszIterateMappersMixin._mappers  sf    ? 	I     29N      ,3HHr#   N)r   r   r   r   r?   r#   r!   r   r     s(        I I I I Ir#   r   c                       e Zd ZdZd Zd ZdS )ru   )r   rv   	processedsetup_flush_actionsc                 V    || _         || _        t                      | _        d| _        d S NF)r   rv   r6   r   r   )rI   r   rv   s      r!   rJ   zPreprocess.__init__  s*    $8!$#(   r#   c                    t                      }t                      }|                     |          D ]i}|j        |                             | j                  D ]A}|j        |         \  }}|s-|r|                    |           ,|                    |           Bj|r5| j                            ||           | j        	                    |           |r5| j        
                    ||           | j        	                    |           |s|rb| j        sY| j                            ||d          s| j                            ||d          r!| j                            |           d| _        dS dS NTF)r6   r   rC   r   r   rG   r~   r   presort_deletesr   presort_savesr   prop_has_changesper_property_flush_actions)rI   r   delete_statessave_statesr   r   ra   r   s           r!   r   zPreprocess.execute  s   eemmC(( 	/ 	/FV,77GG / /'*z%'8$8 / /%))%0000#.../  	1%55c=IIIN!!-000 	/%33CEEEN!!+... 	K 	+ 	0):: 	0 ,==e 		0 )DDSIII+/(45r#   Nr   r   r   	__slots__rJ   r   r?   r#   r!   ru   ru     s9        I) ) )! ! ! ! !r#   ru   c                       e Zd ZdZd Zd ZdS )PostSortRecr   c                     | f|z   }||j         v r|j         |         S t                              |           x|j         |<   }d|_        |S r   )rE   object__new__r   )clsr   argsr   r^   s        r!   r   zPostSortRec.__new__  sS    ftm#&&&',,.4nnS.A.AAC % CLJr#   c                 0    |                      |           d S r>   )r   )rI   r   recss      r!   r   zPostSortRec.execute_aggregate  s    Sr#   N)r   r   r   r   r   r   r?   r#   r!   r   r     s7        I      r#   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )
ProcessAll)r   ra   rv   c                     || _         || _        || _        |j        |j        j                                     |           d S r>   )r   ra   rv   rB   r   r   r~   )rI   r   r   ra   rv   s        r!   rJ   zProcessAll.__init__  sK    $8! $%,89== 	
 	
 	
 	
 	
r#   c                     |                      |          }| j        r| j                            ||           d S | j                            ||           d S r>   )	_elementsra   r   process_deletesprocess_saves)rI   r   rG   s      r!   r   zProcessAll.execute  s\    $$= 	A%55c6BBBBB%33C@@@@@r#   c                      t          g           S r>   )r   r   s     r!   r   z"ProcessAll.per_state_flush_actions  s    
 Bxxr#   c                 @    | j         j        d| j        d| j        dS )N(z, isdelete=))	__class__r   r   ra   rM   s    r!   __repr__zProcessAll.__repr__%  s/    N###%%%MMM
 	
r#   c              #      K   |                      |          D ]3}|j        |         D ]#}|j        |         \  }}|| j        k    r|s|V  $4d S r>   )r   rC   rG   ra   )rI   r   r   r   ra   r   s         r!   r   zProcessAll._elements,  ss      mmC(( 	  	 FV,    '*z%'8$8t},,X,KKK 	  	 r#   N)	r   r   r   r   rJ   r   r   r   r   r?   r#   r!   r   r     sg        @I
 
 
A A A  
 
 
         r#   r   c                       e Zd ZdZd Zd ZdS )PostUpdateAllr   ra   c                 "    || _         || _        d S r>   r   )rI   r   r   ra   s       r!   rJ   zPostUpdateAll.__init__7  s     r#   c                      j          j                 \  }} fd|D             }t          j         j        ||           d S )Nc                 L    g | ] }j         |         d          j        k    |!S rY   )rG   ra   )r   r   rI   r   s     r!   r   z)PostUpdateAll.execute.<locals>.<listcomp>=  s0    IIIsz!}Q'74='H'H!'H'H'Hr#   )rH   r   r   post_update)rI   r   rG   r   s   ``  r!   r   zPostUpdateAll.execute;  sR    -dk:IIIIIVIIIVS$?????r#   Nr   r?   r#   r!   r   r   4  s<        $I! ! !@ @ @ @ @r#   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )r   r   c                 *    || _         ||j        u sJ d S r>   r   r   rI   r   r   s      r!   rJ   zSaveUpdateAll.__init__E  #    +++++++r#   c                 p    t          j        | j        |                    | j        dd          |           d S r   )r   save_objr   r   r   s     r!   r   zSaveUpdateAll.executeI  s@    K++DKFF	
 	
 	
 	
 	
r#   c              #     K   t          |                    | j        dd                    }| j        j        }t	          ||          }|D ]2}t          ||          }|j                            ||f           |V  3|j        | j                 D ]/}|	                    ||          }|
                    ||d           0d S r   )r   r   r   r   r   SaveUpdateStaterF   r~   rB   r   r   )	rI   r   rG   r   
delete_allr   r   r   states_for_props	            r!   r   z%SaveUpdateAll.per_state_flush_actionsP  s      ++DKFF
 
 k-sK00
 	 	E %S%00F  &*!5666LLLL8DK( 	E 	EC!77VDDO''_eDDDD	E 	Er#   c                 0    | j         j        d| j        dS Nr   r   r   r   r   rM   s    r!   r   zSaveUpdateAll.__repr__a      >222DKKK@@r#   Nr   r   r   r   rJ   r   r   r   r?   r#   r!   r   r   B  s]        I, , ,
 
 
E E E"A A A A Ar#   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )r   r  c                 *    || _         ||j        u sJ d S r>   r  r	  s      r!   rJ   zDeleteAll.__init__h  r
  r#   c                 p    t          j        | j        |                    | j        dd          |           d S r   )r   
delete_objr   r   r   s     r!   r   zDeleteAll.executel  s@    K++DKuEE	
 	
 	
 	
 	
r#   c              #     K   t          |                    | j        dd                    }| j        j        }t	          ||          }|D ]2}t          ||          }|j                            ||f           |V  3|j        | j                 D ]/}|	                    ||          }|
                    ||d           0d S r   )r   r   r   r   r   DeleteStaterF   r~   rB   r   r   )	rI   r   rG   r   save_allr   r   r   r  s	            r!   r   z!DeleteAll.per_state_flush_actionss  s      ++DKuEE
 
 k- k22 	 	E !e,,F  (F!3444LLLL8DK( 	D 	DC!77VDDO''_dCCCC	D 	Dr#   c                 0    | j         j        d| j        dS r  r  rM   s    r!   r   zDeleteAll.__repr__  r  r#   Nr  r?   r#   r!   r   r   e  s]        I, , ,
 
 
D D D"A A A A Ar#   r   c                   $    e Zd ZdZd Zd Zd ZdS )ProcessStater   ra   r   c                 0    || _         || _        || _        d S r>   r   )rI   r   r   ra   r   s        r!   rJ   zProcessState.__init__  s    $8! 


r#   c                 
   | j         | j        | j        fd|D             }|                    |           | j        gd |D             z   }r                    ||           d S                     ||           d S )Nc                 J    g | ]}|j         u r|j        u r|j        u | S r?   )r   r   ra   )r   rcls_r   ra   s     r!   r   z2ProcessState.execute_aggregate.<locals>.<listcomp>  sN     
 
 
{d""&*>>>
h&&	  '&&r#   c                     g | ]	}|j         
S r?   r   r   r$  s     r!   r   z2ProcessState.execute_aggregate.<locals>.<listcomp>       ; ; ;Q ; ; ;r#   )r   r   ra   difference_updater   r   r   )rI   r   r   our_recsrG   r%  r   ra   s        @@@r!   r   zProcessState.execute_aggregate  s    ~#8=
 
 
 
 
 

 
 
 	x(((* ; ;( ; ; ;; 	< 00f===== ..sF;;;;;r#   c                 t    | j         j        d| j        dt          j        | j                  d| j        dS )Nr   z, z	, delete=r   )r   r   r   r{   	state_strr   ra   rM   s    r!   r   zProcessState.__repr__  sE    N###%%%tz****MMM	
 	
r#   Nr   r   r   r   rJ   r   r   r?   r#   r!   r  r    sF        ;I  
< < <$
 
 
 
 
r#   r  c                   $    e Zd ZdZd Zd Zd ZdS )r  r   r   c                 6    || _         |j        j        | _        d S r>   r   r   r   rI   r   r   s      r!   rJ   zSaveUpdateState.__init__      
l.r#   c                     | j         | j        fd|D             }|                    |           t          j        | j        gd |D             z   |           d S )Nc                 8    g | ]}|j         u |j        u |S r?   r   r   r   r$  r%  r   s     r!   r   z5SaveUpdateState.execute_aggregate.<locals>.<listcomp>  8     
 
 
q{d22qx67I7IA7I7I7Ir#   c                     g | ]	}|j         
S r?   r'  r(  s     r!   r   z5SaveUpdateState.execute_aggregate.<locals>.<listcomp>  s    #>#>#>AG#>#>#>r#   )r   r   r*  r   r  r   )rI   r   r   r+  r%  r   s       @@r!   r   z!SaveUpdateState.execute_aggregate  s    ~
 
 
 
 

 
 
 	x(((TZL#>#>X#>#>#>>	
 	
 	
 	
 	
r#   c                 T    | j         j        dt          j        | j                  dS r  r   r   r{   r-  r   rM   s    r!   r   zSaveUpdateState.__repr__  0    N###tz****
 	
r#   Nr.  r?   r#   r!   r  r    sF        !I/ / /	
 	
 	

 
 
 
 
r#   r  c                   $    e Zd ZdZd Zd Zd ZdS )r  r0  c                 6    || _         |j        j        | _        d S r>   r2  r3  s      r!   rJ   zDeleteState.__init__  r4  r#   c                     | j         | j        fd|D             }|                    |           | j        gd |D             z   }t	          j        fd|D                        d S )Nc                 8    g | ]}|j         u |j        u |S r?   r7  r8  s     r!   r   z1DeleteState.execute_aggregate.<locals>.<listcomp>  r9  r#   c                     g | ]	}|j         
S r?   r'  r(  s     r!   r   z1DeleteState.execute_aggregate.<locals>.<listcomp>  r)  r#   c                 :    g | ]}j         |         d          |S r  rZ   )r   r   r   s     r!   r   z1DeleteState.execute_aggregate.<locals>.<listcomp>  s)    ;;;1#*Q-*:;Q;;;r#   )r   r   r*  r   r   r  )rI   r   r   r+  rG   r%  r   s    `   @@r!   r   zDeleteState.execute_aggregate  s    ~
 
 
 
 

 
 
 	x(((* ; ;( ; ; ;;;;;;;;;S	
 	
 	
 	
 	
r#   c                 T    | j         j        dt          j        | j                  dS r  r<  rM   s    r!   r   zDeleteState.__repr__  r=  r#   Nr.  r?   r#   r!   r  r    sF        !I/ / /

 

 


 
 
 
 
r#   r  N)__doc__ r   r   rS   r   r   r{   r	   r
   r9   r   r;   r   ru   r   r   r   r   r   r  r  r  r?   r#   r!   <module>rG     s                                             fA fA fARy5 y5 y5 y5 y5V y5 y5 y5x		I 	I 	I 	I 	I& 	I 	I 	I/ / / / /$ / / /d    &    %  %  %  %  % $k %  %  % P@ @ @ @ @K @ @ @ A  A  A  A  AK  A  A  AF A  A  A  A  A  A  A  AF 
  
  
  
  
;  
  
  
F
 
 
 
 
k 
 
 
2
 
 
 
 
+ 
 
 
 
 
r#   