
    div                    6   U d dl mZ d dlZd dlmZ d dlmZ ej        dk    rd dlm	Z	 n	 d dl
m	Z	 n# e$ r d Z	Y nw xY w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 dd
lmZmZmZmZmZm Z m!Z! eez  ez  ez  ez  Z"de#d<   e	 G d d                      Z$ G d d          Z%e	 G d de%                      Z&e	 G d de%                      Z'e	 G d de%                      Z(e	 G d de%                      Z)e	 G d de%                      Z*e	 G d de%                      Z+e	 G d de%                      Z,e	 G d d e%                      Z-e	 G d! d"e%                      Z. ed#$          d4d*            Z/ ed+$          	 d5d6d3            Z0dS )7    )annotationsN)	lru_cache)	getLogger)      )finalc                    | S )N )clss    S/var/www/html/volatility/venv/lib/python3.11/site-packages/charset_normalizer/md.pyr   r      s    J       )COMMON_CJK_CHARACTERSCOMMON_SAFE_ASCII_CHARACTERSTRACEUNICODE_SECONDARY_RANGE_KEYWORD_ACCENTUATED_ARABIC_ARABIC_ISOLATED_FORM_CJK_HANGUL	_HIRAGANA	_KATAKANA_LATIN_THAI)_character_flagsis_emoticonis_punctuationis_separator	is_symbolremove_accentunicode_rangeint_GLYPH_MASKc                  &    e Zd ZdZdZd
dZddZd	S )CharInfou{  Pre-computed character properties shared across all detectors.

    Instantiated once and reused via :meth:`update` on every character
    in the hot loop so that redundant calls to str methods
    (``isalpha``, ``isupper``, …) and cached utility functions
    (``_character_flags``, ``is_punctuation``, …) are avoided when
    several plugins need the same information.
    	character	printablealphaupperlowerspacedigitis_asciicase_variableflagsaccentuatedlatinis_cjk	is_arabicis_glyphpunctsymreturnNonec                    d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d S )N Fr   r'   selfs    r   __init__zCharInfo.__init__N   s     $ 
 
 
 
 
##(
!& 
!$# 
r   r(   strc                   || _         t          |          }|dk     r@d| _        d| _        d| _        d| _        d| _        d|cxk    rdk    rWn nTd| _        d| _        d| _	        d| _
        d| _        d| _        d| _        t          | _        d| _        d| _        d| _        dS d|cxk    rdk    rWn nTd| _        d| _        d| _	        d| _
        d| _        d| _        d| _        t          | _        d| _        d| _        d| _        dS d|cxk    rd	k    rRn nOd| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d
| _        d| _        d| _        d| _        dS |dk    sd|cxk    rdk    rVn nSd| _        d| _        d| _	        d| _
        d| _        |dk    | _        d| _        d
| _        d| _        d| _        d| _        dS |                                | _        d| _        d| _        d| _	        d| _
        d| _        d| _        d
| _        d| _        | j        rt)          |          nd| _        | j        rt+          |          nd| _        dS d| _        |                                | _        |                                | _        |                                | _        |                                | _	        |                                | _
        |                                | _        | j	        | j        k    | _        | j        rt7          |          }nd
}|| _        t9          |t:          z            | _        t9          |t          z            | _        t9          |t<          z            | _        t9          |t>          z            | _        t9          |t@          z            | _        | j        rt)          |          nd| _        | j        rt+          |          nd| _        dS )zBUpdate all properties for *character* (called once per character).   TFA   Z   a   z   0   9   r       	      N)!r(   ordr/   r2   r4   r5   r6   r*   r+   r,   r-   r.   r)   r0   r   r1   r3   r7   r8   isprintabler   r    isalphaisupperislowerisspaceisdigitr   boolr   r   r   r$   )r>   r(   or1   s       r   updatezCharInfo.updatea   s   " Ys77 DM$DDK"DN!DMQ}}}}"}}}}}!
!
"
"
"
!%%)"#
!
"
 qC!
"
!
"
"
!%%)"#
!
"
 qB"
"
"
"
!
!%%*"
"
"
 bQ!\\\\r\\\\\"
"
"
!
"
!"b%*"
"
"
  "+!6!6!8!8"
"
"
"
"
%*"
"
:>.S^I666e
37>L9Y///u "DM&2244DN"**,,DJ"**,,DJ"**,,DJ"**,,DJ"**,,DJ!%tz!9D z (33DJ#EL$899Defn--DJut|,,DK!%'/22DN !455DM 7;nO	222%DJ/3~Hy+++5DHHHr   Nr9   r:   )r(   r@   r9   r:   )__name__
__module____qualname____doc__	__slots__r?   rU   r
   r   r   r&   r&   /   sY         I(   &jI jI jI jI jI jIr   r&   c                  >    e Zd ZdZdZdd	Zdd
Zedd            ZdS )MessDetectorPluginzy
    Base abstract class used for mess detection plugins.
    All detectors MUST extend and implement given methods.
    r
   r(   r@   infor&   r9   r:   c                    t           )z
        The main routine to be executed upon character.
        Insert the logic in witch the text would be considered chaotic.
        NotImplementedErrorr>   r(   r^   s      r   	feed_infozMessDetectorPlugin.feed_info   s
    
 "!r   c                    t           )zB
        Permit to reset the plugin to the initial state.
        r`   r=   s    r   resetzMessDetectorPlugin.reset   s
     "!r   floatc                    t           )z
        Compute the chaos ratio based on what your feed() has seen.
        Must NOT be lower than 0.; No restriction gt 0.
        r`   r=   s    r   ratiozMessDetectorPlugin.ratio   s
     "!r   Nr(   r@   r^   r&   r9   r:   rV   r9   rf   )	rW   rX   rY   rZ   r[   rc   re   propertyrh   r
   r   r   r]   r]      sm         
 I" " " "" " " " " " " X" " "r   r]   c                  B    e Zd ZdZddZdd	Zdd
Zedd            ZdS ) TooManySymbolOrPunctuationPlugin_punctuation_count_symbol_count_character_count_last_printable_char_frenzy_symbol_in_wordr9   r:   c                L    d| _         d| _        d| _        d | _        d| _        d S Nr   Frn   r=   s    r   r?   z)TooManySymbolOrPunctuationPlugin.__init__   s0    '("#%&04!,1###r   r(   r@   r^   r&   c                    | xj         dz  c_         || j        k    rN|t          vrE|j        r| xj        dz  c_        n-|j        s&|j        rt          |          s| xj        dz  c_        || _        dS )1Optimized feed using pre-computed character info.r      N)	rq   rr   r   r7   ro   r.   r8   r   rp   rb   s      r   rc   z*TooManySymbolOrPunctuationPlugin.feed_info   s    " 222!===z (''1,'''Z (DH ([5K5K (""a'""$-!!!r   c                0    d| _         d| _        d| _        d S Nr   )ro   rq   rp   r=   s    r   re   z&TooManySymbolOrPunctuationPlugin.reset  s     "# !r   rf   c                ^    | j         dk    rdS | j        | j        z   | j         z  }|dk    r|ndS )Nr           333333?)rq   ro   rp   )r>   ratio_of_punctuations     r   rh   z&TooManySymbolOrPunctuationPlugin.ratio  sK     A%%3 #d&88!'" (<s'B'B##Kr   NrV   ri   rj   	rW   rX   rY   r[   r?   rc   re   rk   rh   r
   r   r   rm   rm      s}        I2 2 2 2. . . .   
 L L L XL L Lr   rm   c                  B    e Zd ZdZddZdd	Zdd
Zedd            ZdS )TooManyAccentuatedPluginrq   _accentuated_countr9   r:   c                "    d| _         d| _        d S rz   r   r=   s    r   r?   z!TooManyAccentuatedPlugin.__init__"  s    %&'(r   r(   r@   r^   r&   c                X    | xj         dz  c_         |j        r| xj        dz  c_        dS dS rw   r   N)rq   r2   r   rb   s      r   rc   z"TooManyAccentuatedPlugin.feed_info&  sE    " 	)##q(####	) 	)r   c                "    d| _         d| _        d S rz   r   r=   s    r   re   zTooManyAccentuatedPlugin.reset-  s     !"#r   rf   c                N    | j         dk     rdS | j        | j         z  }|dk    r|ndS )Nr   r|   gffffff?r   )r>   ratio_of_accentuations     r   rh   zTooManyAccentuatedPlugin.ratio1  s<     1$$3'+'>AV'V(=(E(E$$3Nr   NrV   ri   rj   r   r
   r   r   r   r     s{        :I) ) ) )) ) ) )$ $ $ $ O O O XO O Or   r   c                  B    e Zd ZdZddZdd	Zdd
Zedd            ZdS )UnprintablePlugin_unprintable_countrq   r9   r:   c                "    d| _         d| _        d S rz   r   r=   s    r   r?   zUnprintablePlugin.__init__>  s    '(%&r   r(   r@   r^   r&   c                z    |j         s#|j        s|dk    r|dk    r| xj        dz  c_        | xj        dz  c_        dS )rw   u   ﻿r   N)r-   r)   r   rq   rb   s      r   rc   zUnprintablePlugin.feed_infoB  s^     
	)N	) V##X%%##q(##"r   c                    d| _         d S rz   )r   r=   s    r   re   zUnprintablePlugin.resetM  s    "#r   rf   c                @    | j         dk    rdS | j        dz  | j         z  S )Nr   r|   r   )rq   r   r=   s    r   rh   zUnprintablePlugin.ratioP  s+     A%%3'!+t/DDDr   NrV   ri   rj   r   r
   r   r   r   r   :  s{        :I' ' ' '	# 	# 	# 	#$ $ $ $ E E E XE E Er   r   c                  B    e Zd ZdZddZdd	Zdd
Zedd            ZdS )SuspiciousDuplicateAccentPlugin_successive_countrq   _last_latin_character_last_was_accentuatedr9   r:   c                >    d| _         d| _        d | _        d| _        d S ru   r   r=   s    r   r?   z(SuspiciousDuplicateAccentPlugin.__init__a  s(    &'%&15"+0"""r   r(   r@   r^   r&   c                @   | xj         dz  c_         | j        s|j        rl| j        re|j        r)| j                                        r| xj        dz  c_        t          |          t          | j                  k    r| xj        dz  c_        || _        |j        | _        dS r   )rq   r   r2   r   r+   rO   r   r!   rb   s      r   rc   z)SuspiciousDuplicateAccentPlugin.feed_infoh  s    "&2  3* 3 z ,d8@@BB ,&&!+&&Y''=9S+T+TTT&&!+&&%."%)%5"""r   c                >    d| _         d| _        d | _        d| _        d S ru   r   r=   s    r   re   z%SuspiciousDuplicateAccentPlugin.resetw  s(    !" !%)"%*"""r   rf   c                @    | j         dk    rdS | j        dz  | j         z  S )Nr   r|   rx   )rq   r   r=   s    r   rh   z%SuspiciousDuplicateAccentPlugin.ratio}  s+     A%%3&*d.CCCr   NrV   ri   rj   r   r
   r   r   r   r   X  s}        I1 1 1 16 6 6 6+ + + + D D D XD D Dr   r   c                  B    e Zd ZdZddZdd	Zdd
Zedd            ZdS )SuspiciousRange"_suspicious_successive_range_countrq   _last_printable_seen_last_printable_ranger9   r:   c                >    d| _         d| _        d | _        d | _        d S rz   r   r=   s    r   r?   zSuspiciousRange.__init__  s(    78/%&04!15"""r   r(   r@   r^   r&   c                D   | xj         dz  c_         |j        s|j        s	|t          v rd| _        d| _        dS | j        || _        t          |          | _        dS | j        }t          |          }t          ||          r| xj        dz  c_        || _        || _        dS r   )	rq   r-   r7   r   r   r   r"    is_suspiciously_successive_ranger   )r>   r(   r^   unicode_range_aunicode_range_bs        r   rc   zSuspiciousRange.feed_info  s    ": 	 	y4P'P'P(,D%)-D&F$,(1D%)6y)A)AD&F&*&@&3I&>&>+O_MM 	933q833$-!%4"""r   c                >    d| _         d| _        d | _        d | _        d S rz   )rq   r   r   r   r=   s    r   re   zSuspiciousRange.reset  s(     !23/$(!%)"""r   rf   c                D    | j         dk    rdS | j        dz  | j         z  }|S )NrK   r|   rx   )rq   r   )r>   ratio_of_suspicious_range_usages     r   rh   zSuspiciousRange.ratio  s8     B&&3 3a7!2"' /.r   NrV   ri   rj   r   r
   r   r   r   r     sw        I6 6 6 65 5 5 5.* * * * / / / X/ / /r   r   c                  B    e Zd ZdZddZdd	Zdd
Zedd            ZdS )SuperWeirdWordPlugin_word_count_bad_word_count_foreign_long_count_is_current_word_bad_foreign_long_watchrq   _bad_character_count_buffer_length_buffer_last_char_buffer_last_char_accentuated_buffer_accent_count_buffer_glyph_count_buffer_upper_countr9   r:   c                    d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d| _	        d| _
        d| _        d| _        d S ru   r   r=   s    r   r?   zSuperWeirdWordPlugin.__init__  sp     !$%() */!). %&)*!#$-138*)*!() ()   r   r(   r@   r^   r&   c                   |j         r| xj        dz  c_        || _        |j        r| xj        dz  c_        |j        | _        |j        r| xj        dz  c_        | j        s|j	        r|j        r|j
        sd| _        |j
        r| xj        dz  c_        dS | j        sdS |j        s|j        st          |          rH| xj        dz  c_        | j        }| xj        |z  c_        |dk    r{| j        |z  dk    rd| _        ne| j        r<| j                                        r#| j        |k    r| xj        dz  c_        d| _        n"| j        dk    rd| _        | xj        dz  c_        |dk    r9| j        r2| j        dk    o| j        |z  dk    }|s| xj        dz  c_        d| _        | j        r'| xj        dz  c_        | xj        |z  c_        d	| _        d	| _        d| _        d| _        d	| _        d| _        d| _        d| _        dS |d
vr5|j        s0|j        r+d| _        | xj        dz  c_        || _        d	| _        dS dS dS dS )rw   r   TN         ?   r   r}   F>   _-<=>|~)r*   r   r   r+   r   r2   r   r   r   r3   r6   r   r-   r7   r   r   rq   r   rO   r   r   r   r.   r8   )r>   r(   r^   buffer_lengthprobable_camel_caseds        r   rc   zSuperWeirdWordPlugin.feed_info  s   : 	1$%.D"z .((A-((151AD. /))Q.)),00'+'70 0
 ,0(} .((A-((F" 	F: 1	7 1	7|I'>'> 1	7!!%!4M!!]2!!!!,}<CC04D--6	2.6688	2 0MAA,,1,,04D---2204D-,,1,,""t'?",q0 H0=@CG %
 , 5,,1,,04D-( 2$$)$$))]:)),1)',D$"#D%)D"16D.()D%'(D$'(D$$$@@@J A A )-D%1$%.D"16D... A@@@@@r   c                    d| _         d | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d S ru   )r   r   r   r   r   r   r   rq   r   r   r   r   r   r=   s    r   re   zSuperWeirdWordPlugin.reset,  sp    !%-2*$)!#(   !$%!#$ $%!#$ #$   r   rf   c                P    | j         dk    r| j        dk    rdS | j        | j        z  S )N
   r   r|   )r   r   r   rq   r=   s    r   rh   zSuperWeirdWordPlugin.ratio;  s3    r!!d&>!&C&C3(4+@@@r   NrV   ri   rj   r   r
   r   r   r   r     s        I * * * *$I7 I7 I7 I7V% % % % A A A XA A Ar   r   c                  F    e Zd ZdZdZddZdd
ZddZedd            Z	dS )CjkUncommonPluginz<
    Detect messy CJK text that probably means nothing.
    rq   _uncommon_countr9   r:   c                "    d| _         d| _        d S rz   r   r=   s    r   r?   zCjkUncommonPlugin.__init__K  s    %&$%r   r(   r@   r^   r&   c                \    | xj         dz  c_         |t          vr| xj        dz  c_        dS dS r   )rq   r   r   rb   s      r   rc   zCjkUncommonPlugin.feed_infoO  sD    "111  A%     21r   c                "    d| _         d| _        d S rz   r   r=   s    r   re   zCjkUncommonPlugin.resetV  s     ! r   rf   c                T    | j         dk     rdS | j        | j         z  }|dk    r|dz  ndS )Nr   r|   r   r   r   )r>   uncommon_form_usages     r   rh   zCjkUncommonPlugin.ratioZ  sC     1$$3%)%9D<Q%Q ,?+D+D"R''#Mr   NrV   ri   rj   )
rW   rX   rY   rZ   r[   r?   rc   re   rk   rh   r
   r   r   r   r   C  s          8I& & & && & & &! ! ! ! N N N XN N Nr   r   c                  B    e Zd ZdZddZdd	Zdd
Zedd            ZdS )ArchaicUpperLowerPlugin	_buf_character_count_since_last_sep_successive_upper_lower_count#_successive_upper_lower_count_finalrq   _last_alpha_seen_last_alpha_seen_upper_last_alpha_seen_lower_current_ascii_onlyr9   r:   c                    d| _         d| _        d| _        d| _        d| _        d | _        d| _        d| _        d| _        d S )NFr   Tr   r=   s    r   r?   z ArchaicUpperLowerPlugin.__init__t  sO    	45,23*890%&,0,1#,1#)-   r   r(   r@   r^   r&   c                R   |j         o|j        }| }|rn| j        dk    rc| j        dk    r#|j        s| j        s| xj        | j        z  c_        d| _        d| _        d| _        d| _        | xj	        dz  c_	        d| _        dS | j        r|j
        sd| _        | j        J|j        r| j        s|j        r.| j        r'| j        r| xj        dz  c_        d| _        nd| _        nd| _        | xj	        dz  c_	        | xj        dz  c_        || _        |j        | _        |j        | _        dS )rw   r   @   NFr   Trx   )r*   r0   r   r.   r   r   r   r   r   rq   r/   r+   r   r,   r   )r>   r(   r^   is_concerned	chunk_seps        r   rc   z!ArchaicUpperLowerPlugin.feed_info  s   !Z>D,>**	 	=AA4::
 ;0 ; 88688 23D.34D0$(D!DI!!Q&!!'+D$F# 	-DM 	-',D$ ,
 	"t: 	"
	"#:	" 9 %66!;66 %DII $DII!	",,1,, )&*j#&*j###r   c                    d| _         d| _        d| _        d| _        d | _        d| _        d| _        d| _        d| _        d S )Nr   FT)	rq   r   r   r   r   r   r   r   r   r=   s    r   re   zArchaicUpperLowerPlugin.reset  sO     !/0,-.*340 $&+#&+#	#'   r   rf   c                :    | j         dk    rdS | j        | j         z  S )Nr   r|   )rq   r   r=   s    r   rh   zArchaicUpperLowerPlugin.ratio  s&     A%%37$:OOOr   NrV   ri   rj   r   r
   r   r   r   r   f  s~        
I. . . .+1 +1 +1 +1Z	( 	( 	( 	( P P P XP P Pr   r   c                  B    e Zd ZdZddZddZdd
Zedd            ZdS )ArabicIsolatedFormPluginrq   _isolated_form_countr9   r:   c                "    d| _         d| _        d S rz   r   r=   s    r   r?   z!ArabicIsolatedFormPlugin.__init__  s    %&)*!!!r   c                "    d| _         d| _        d S rz   r   r=   s    r   re   zArabicIsolatedFormPlugin.reset  s     !$%!!!r   r(   r@   r^   r&   c                h    | xj         dz  c_         |j        t          z  r| xj        dz  c_        dS dS r   )rq   r1   r   r   rb   s      r   rc   z"ArabicIsolatedFormPlugin.feed_info  sJ    ":-- 	+%%*%%%%	+ 	+r   rf   c                >    | j         dk     rdS | j        | j         z  }|S )Nr   r|   r   )r>   isolated_form_usages     r   rh   zArabicIsolatedFormPlugin.ratio  s,     1$$3%)%>AV%V""r   NrV   ri   rj   )	rW   rX   rY   r[   r?   re   rc   rk   rh   r
   r   r   r   r     su        <I+ + + +& & & &+ + + + # # # X# # #r   r      )maxsizer   
str | Noner   r9   rS   c                   | |dS | |k    rdS d| v rd|v rdS d| v sd|v rdS d| v sd|v r
d| v sd|v rdS |                      d          |                     d          }}|D ]}|t          v r||v r dS | dv |dv }}|s|r
d	| v sd	|v rdS |r|rdS d
| v sd
|v rd	| v sd	|v rdS | dk    s|dk    rdS d	| v sd	|v s| dv r&|dv r"d| v sd|v rdS d| v sd|v rdS | dk    s|dk    rdS dS )za
    Determine if two Unicode range seen next to each other can be considered as suspicious.
    NTFLatin	Emoticons	Combining )HiraganaKatakanaCJKHangulzBasic Latin)r   r   PunctuationForms)splitr   )r   r   keywords_range_akeywords_range_belrange_a_jp_charsrange_b_jp_charss          r   r   r     s    /"9t/))u/!!g&@&@uo%%)G)Gu 	?""g&@&@&&+*H*Hu 	c""c"" '
   000!!!55 "
 	
	

 	33 ' 	 ,   E_$<$<u , u?""h/&A&AO##u'?'?5m++-/O/O5 	  E_$<$<333777O++}/O/O5o%%O)C)C5m++-/O/O54r   i   皙?Fdecoded_sequencer@   maximum_thresholdrf   debugc           	        t          |           }|dk     rd}n|dk     rd}nd}t                      }t                      }t                      }t	                      }t                      }	t                      }
t                      }t                      }t                      }|j
        }|j
        }|j
        }|j
        }|	j
        }|
j
        }|j
        }|j
        }|j
        }t                      }|j        }t          d||          D ]}| |||z            D ]} ||            |||            |||            |||           |j        r |||            |||           |j        rE |||           |j        r |||           |j        r |||           |j        r |||           |j        |j        z   |j        z   |j        z   |	j        z   |
j        z   |j        z   |j        z   |j        z   }||k    r nw |d            |d|            |d|            |d|           |j        |j        z   |j        z   |j        z   |	j        z   |
j        z   |j        z   |j        z   |j        z   }|rt)          d          }|                    t,          d	| d
| d|            |dk    rL|                    t,          d| dd                     |                    t,          d| dd                     |||||	|
|||f	D ],}|                    t,          |j         d|j                    -t1          |d          S )zw
    Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier.
    i  rI   r   r   rB   r   
charset_normalizerzIMess-detector extended-analysis start. intermediary_mean_mess_ratio_calc=z mean_mess_ratio=z maximum_threshold=   zStarting with: NzEnding with: iz: r   )lenrm   r   r   r   r   r   r   r   r   rc   r&   rU   ranger)   r*   r3   r4   r5   rh   r   logr   	__class__round)r  r  r  seq_lenstepd_spd_tad_upd_sdad_srd_swd_cud_aud_ai	d_sp_feed	d_ta_feed	d_up_feed
d_sda_feed	d_sr_feed	d_sw_feed	d_cu_feed	d_au_feed	d_ai_feedr^   info_updateblock_startr(   mean_mess_ratiologgerdts                                 r   
mess_ratior)  *  sW    '((G}}	4 .N-O-OD%=%?%?D/11D-L-N-NE+--D!5!7!7D/11D$;$=$=D%=%?%?D IIIJIIIII ZZD+K Q.. ;
 ;
)+d8J*JK 	/ 	/IK	""" Ii&&&Ii&&&Ii&&& ~ +	)T***	)T*** z 
/	)T***: 0Jy$///; /Ii...> /Ii... Jjj k j	
 j j j j 	 ///E 0 	D	$	$	$ Jjj k j	
 j j j j 	  =/00

5155 5HW5 5!25 5	
 	
 	
 R<<JJuG0@"0EGGHHHJJuG.>suu.EGGHHHtUD$dDI 	= 	=BJJu;;;;<<<<!$$$r   )r   r   r   r   r9   rS   )r  F)r  r@   r  rf   r  rS   r9   rf   )1
__future__r   sys	functoolsr   loggingr   version_infotypingr   typing_extensionsImportErrorconstantr   r   r   r   r   r   r   r   r   r   r   r   r   utilsr   r   r   r   r    r!   r"   r$   __annotations__r&   r]   rm   r   r   r   r   r   r   r   r   r   r)  r
   r   r   <module>r5     s   " " " " " " " 



            v+++++++   	 	 	 	 	                                               '>I-	9EA A A A A [I [I [I [I [I [I [I [I|" " " " " " " "< .L .L .L .L .L'9 .L .L .Lb O O O O O1 O O O6 E E E E E* E E E: )D )D )D )D )D&8 )D )D )DX 4/ 4/ 4/ 4/ 4/( 4/ 4/ 4/n BA BA BA BA BA- BA BA BAJ N N N N N* N N ND YP YP YP YP YP0 YP YP YPx # # # # #1 # # #8 4F F F FR 4IN}% }% }% }% }% }% }%s   2 ==