
    <[jO              
          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adadFdZdFdZ	d Z
dZdZdZd	Zd ZdZdZdZd	Ze
ej        eej        eej        eej        eej        iZd
                    d          dfd                    d          dfd                    d          dfd                    d          dffZ e            Zej        Zedk    r.e                    ej         !                    d                     ndev r;dD ]7Z"	 e                    ej         !                    e"                     1#  Y 5xY wng	 e                    ej         !                    d                     n8# e#$ r0 e                    ej         !                    d                     Y nw xY w G d dej$                  Z% G d dej$                  Z& ej'        e%          Z( ej'        e&          Z)ej*        fdZ+ e+dg e(            e+de(gd            e+de(gd            e+d g e)            e+d!e)gd            e+d"e(ej*        gd           d	Z, e+d#e(e(gej*                    e+d$e(gej*                    e+d%e(e(e(g            e+d&e(e(e(g            e+d'e(e(e(e)g            e+d(e(e(e(e(e)g            e+d)e(e(e(e(e)g            e+d*e(ej*        ej*        ej*        g            e+d+e(ej-        g            e+d,ej-        ej*        e(ge(            e+d- ej'        e(          ej-        g            e+d.e(gej-                    e+d/ej-        g            e+d0ej-        ej*        g           d1 Z.d2 Z/d3 Z0d4 Z1d5 Z2d6 Z3d7 Z4d8 Z5d9 Z6d: Z7d; Z8d< Z9d= Z:d> Z;d? Z<e
eddd	dfd@Z= G dA dB          Z> G dC dD          Z? e@ e jA        dE          dE           dS )G    NFTc                 
    | a d S N)_rfc5054_compatenables    R/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/srp/_ctsrp.pyrfc5054_enabler	      s    OOO    c                 
    | a d S r   )_no_username_in_xr   s    r   no_username_in_xr      s    r
                  EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE48E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B297BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9AFD5138FE8376435B9FC61D2FC0EB06E3ascii   2   AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73   FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF   5   FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AACC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFFs   13darwinzlibssl.32.dylibwin)zlibeay32.dllzlibssl32.dllzssleay32.dllzlibssl.so.1.1.0z	libssl.soc                   b    e Zd Zdej        fdej        fdej        fdej        fdej        fgZdS )BIGNUM_StructdtopdmaxnegflagsN)__name__
__module____qualname__ctypesc_void_pc_int_fields_ r
   r   r   r      sG        6?+6<(6<(6<(6<(	+HHHr
   r   c                   "    e Zd Zdej        fgZdS )BN_CTX_Struct_N)r"   r#   r$   r%   c_byter(   r)   r
   r   r+   r+      s        v}%'HHHr
   r+   c                     t           j        t                   j        }d }t          D ]/}	 t          ||           }||_        ||_        ||| <    d S #  Y -xY wt          d          )Nz/Unable to load required functions from SSL dlls)	sysmodulesr"   __dict__dllsgetattrargtypesrestypeImportError)nameargsreturnsr   fdlls         r   	load_funcr<      st    X(AA  	T""AAJ AIAtIFF	D
G
H
HHs   #AABN_newBN_freeBN_clear
BN_CTX_newBN_CTX_freeBN_set_flagsBN_cmpBN_num_bitsBN_addBN_subBN_mulBN_div
BN_mod_expBN_rand	BN_bn2bin	BN_bin2bn	BN_hex2bn	BN_bn2hexCRYPTO_free	RAND_seedc                 ,    t          |           dz   dz  S )N      )rD   )as    r   BN_num_bytesrU      s    ^^A!"r
   c                 (    t          d | |||          S r   )rH   )remmr   ctxs       r   BN_modrZ      s    $Q3'''r
   c                 $    | d         j         dk    S )Nr   )r   )ns    r   
BN_is_zeror]      s    Q48q=r
   c                 r    t          j        t          |                     }t          | |           |j        S r   )r%   create_string_bufferrU   rK   raw)r\   bs     r   bn_to_bytesrb      s,    #\!__66AaOOO5Lr
   c                 B    t          |t          |          |            d S r   )rL   len)dest_bnbytess     r   bytes_to_bnrg      s     eSZZ)))))r
   c                      | |                                           }t          j        |          }t          |t	          |          t
                     d S r   )digestr%   r_   rL   rd   dest)
hash_classre   sr   buffs        r   H_strrn      sI    
1A&++DaQr
   c                     t          j        t          |                    }t          ||            | |j                                                  }t          |t          |          |           d S r   )r%   r_   rU   rK   r`   ri   rL   rd   )rk   rj   r\   binr   s        r   H_bnrq      sc    

%|A
8
8Ca
CG$$&&AaQr
   c                     |             }t          j        t          |                    }t          j        t          |                    }t          ||           t          ||           t          r7|                    t          |t          |j                  z
                       |                    |j                   t          r7|                    t          |t          |j                  z
                       |                    |j                   |	                                }t          |t          |          |           d S r   )r%   r_   rU   rK   r   updaterf   rd   r`   ri   rL   )	rk   rj   n1n2widthhbin1bin2r   s	            r   H_bn_bnrz     s   :<<A&R(8(8::D&R(8(8::Db$b$ /	us48}},--...HHdh /	us48}},--...HHdh	

AaQr
   c                 >    |             }t          j        t          |                    }t          ||           |                    |j                   |                    |           |                                }t          |t          |          |           d S r   )	r%   r_   rU   rK   rs   r`   ri   rL   rd   )rk   rj   r\   rl   rw   rp   r   s          r   H_bn_strr|     s    
*,,A

%|A
8
8CaHHcgHHaMMM	

AaQr
   c                 D   t          |d          r|                                n|}t          |d          r|                                n|}t          rd} | |dz   |z                                             }t	          | |||           t          |t                     d S )Nencoder
      :)hasattrr~   r   ri   r|   rB   BN_FLG_CONSTTIME)rk   rj   saltusernamepasswordups         r   calculate_xr     s    $+Hh$?$?Mx   XH$+Hh$?$?Mx   XH 	HtOh.	/	/	6	6	8	8Bj$b***'(((((r
   c                     t          j        t          |                    }t          ||           |                     |j                   d S r   )r%   r_   rU   rK   rs   r`   )rY   r\   rm   s      r   update_hashr   (  sB    &Q99DaJJr
   c                    t          |d          r|                                n|} |             }|                    t          | ||                     |                     | |                                                     t          ||           t          ||           t          ||           |                    |           |                                S )Nr~   )r   r~   rs   HNxorgri   r   )	rk   NgIrl   ABKrw   s	            r   calculate_Mr   .  s    a**1


A
AHHfj!Q((***HHjjmm""$$&&&AAAHHaMMM88::r
   c                      |             }t          ||           |                    |           |                    |           |                                S r   )r   rs   ri   )rk   r   Mr   rw   s        r   calculate_H_AMKr   :  sI    
AAHHaMMMHHaMMM88::r
   c           	      r   t          j        t          |                    }t          j        t          |                    }t          ||           t          ||           t          rt          |          t          |          z
  nd} | |j                                                   | d                    d|z  |j        g                                                    d                    fdt          dt                              D                       
                    d          S )Nr   r
        c              3   T   K   | ]"}t          |         |         z            V  #d S r   )chr).0ihNhgs     r   	<genexpr>zHNxorg.<locals>.<genexpr>N  s7      FFqc2a52a5=**FFFFFFr
   latin1)r%   r_   rU   rK   r   rd   r`   ri   joinranger~   )rk   r   r   bNbgpaddingr   r   s         @@r   r   r   B  s   		$l1oo	7	7B		$l1oo	7	7Baa#29c"ggBG	RV			$	$	&	&B	SXXgrv788	:	:	A	A	C	CBWWFFFFFE!CGG4D4DFFFFFOOPXYYYr
   c           	      J   |t           k     rt          |         \  }}t                      }t                      }t                      }t          ||           t          ||           t	          | |||t          |                     t          rt          ||||           |||fS N)rv   )	NG_CUSTOM	_ng_constr=   rM   rz   rU   r   rZ   )rk   ng_typen_hexg_hexrY   r   r   ks           r   get_ngkr   Q  s     '+uAAAq%q%J1a|A7777 q!Qa7Nr
   c                    |t           k    r||t          d          t                      }t                      }	t                      }
t                      }t          |         }t          |||||          \  }}}t          ||dz  dd           t          ||
|| |           t          |	||
||           t          |          }t          |	          }t          |           t          |	           t          |
           t          |           t          |           t          |           t          |           ||fS )N:Both n_hex and g_hex are required when ng_type = NG_CUSTOMrS   r   )r   
ValueErrorr=   r@   	_hash_mapr   rJ   r   rI   rb   r>   rA   )r   r   hash_algr   r   r   salt_lenk_hexrl   vxrY   rk   r   r   r   r   verifiers                     r   create_salted_verification_keyr   b  s%   )%-UVVV88A88A88A<<CH&J*gueSBBEAaAx!|R###Q8X777q!Q3ADAHAJJJAJJJAJJJAJJJAJJJAJJJ>r
   c                   \    e Zd ZdeeddddfdZd Zd Zd Zd Z	d Z
d Zdd	Zd
 Zd ZdS )VerifierNc                    |t           k    r||t          d          |	r"t          |	          dk    rt          d          t                      | _        d | _        t                      | _        t                      | _        t                      | _        t                      | _	        t                      | _
        t                      | _        t                      | _        t                      | _        || _        d | _        d | _        d| _        d| _        t(          |         }t+          ||||| j                  \  }}}|
t-          ||
           || _        || _        || _        || _        t7          | j	        |           t7          | j
        |           |r|                     |           | j        s|	rt7          | j        |	           nt;          | j        ddd           t=          | j        t>                     tA          | j        || j
        | j                   tC          | j        || j        || j                   tE          | j        | j        | j                   tG          | j        | j        || j                   d S d S )Nr       z32 bytes required for bytes_bF   r   )$r   r   rd   r=   r   r   Sura   rl   r   tmp1tmp2r@   rY   r   r   H_AMK_authenticatedsafety_failedr   r   rM   rk   r   r   r   rg   _set_ArJ   rB   r   rG   rI   rE   rZ   )selfr   bytes_sbytes_vbytes_Ar   r   r   r   bytes_br   rk   r   r   r   s                  r   __init__zVerifier.__init__  s<   iU]emYZZZ 	>s7||r))<===XXXXXXXXXXXXXX	XX	\\
#"*
j'5%KK!Aa$TVW&&&TVW&&& 	!KK   ! 	0 +TVW....Q***!1222 49a222ty!TVQ9994649di00046461dh/////	0 	0r
   c                 2   t          | d          sd S t          | j                   t          | j                   t          | j                   t          | j                   t          | j                   t          | j                   t          | j                   t          | j	                   t          | j
                   t          | j                   t          | j                   t          | j                   t          | j                   d S )Nr   )r   r>   r   r   r   r   ra   rl   r   r   r   r   r   r   rA   rY   r   s    r   __del__zVerifier.__del__  s    tS!! 	F		DHr
   c                     | j         S r   r   r   s    r   authenticatedzVerifier.authenticated      ""r
   c                     | j         S r   )r   r   s    r   get_usernamezVerifier.get_username  s	    vr
   c                 *    t          | j                  S r   )rb   ra   r   s    r   get_ephemeral_secretzVerifier.get_ephemeral_secret      46"""r
   c                 "    | j         r| j        nd S r   r   r   r   s    r   get_session_keyzVerifier.get_session_key      ,6tvv$6r
   c                 d    | j         rdS t          | j                  t          | j                  fS )N)NN)r   rb   rl   r   r   s    r   get_challengezVerifier.get_challenge  s1     	>:''TV)<)<==r
   c                     |r|                      |           t          | d          st          d          | j        s-|                                  || j        k    rd| _        | j        S d S d S )Nr   zRbytes_A must be provided through Verifier constructor or verify_session parameter.T)r   r   r   r   _derive_H_AMKr   r   r   )r   user_Mr   s      r   verify_sessionzVerifier.verify_session  s     	!KK   tS!! 	sqrrr! 	"   &*#z!		" 	"r
   c                     t                      | _        t          | j        |           t          | j        | j        | j        | j                   t          | j                  r	d| _        d S d S NT)	r=   r   rg   rZ   r   r   rY   r]   r   )r   r   s     r   r   zVerifier._set_A  sg    XXTVW&&& 	ty$&$&$(333di   	&!%D	& 	&r
   c           
         t          | j        | j        | j        | j        t          | j                             t          | j        | j	        | j        | j        | j
                   t          | j        | j        | j        | j
                   t          | j        | j        | j        | j        | j
                   |                     t          | j                                                            | _        t%          | j        | j        | j        | j        | j        | j        | j        | j                  | _        t/          | j        | j        | j        | j                  | _        d S r   )rz   rk   r   r   r   rU   r   rI   r   r   rY   rG   r   r   ra   rb   ri   r   r   r   r   rl   r   r   r   r   s    r   r   zVerifier._derive_H_AMK  s   |DF?S?STTTT 	49dfdfdfdh???ty$&$)TX6664649dfdfdh???+df"5"577>>@@ $/46464646SWSY[_[acgcikk$dotvtvtvOO


r
   r   )r"   r#   r$   SHA1NG_2048r   r   r   r   r   r   r   r   r   r   r)   r
   r   r   r     s        <@4Y`hltx  CG  OS 00 00 00 00f  $# # #  # # #7 7 7
> > >	" 	" 	" 	"& & &P P P P Pr
   r   c                   T    e Zd Zee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S )UserNc
                 \   |t           k    r||t          d          |r"t          |          dk    rt          d          || _        || _        t                      | _        t                      | _        t                      | _        t                      | _	        t                      | _
        t                      | _        t                      | _        t                      | _        t                      | _        t                      | _        t                      | _        t#                      | _        d | _        d | _        d | _        d| _        t.          |         }
t1          |
|||| j                  \  }}}|	t3          ||	           |
| _        || _        || _        || _        |rt=          | j        |           nt?          | j        ddd           |rt=          | j        |           d S tA          | j        tB                     tE          | j        || j        || j                   d S )Nr   r   z32 bytes required for bytes_aFr   r   )#r   r   rd   r   r   r=   rT   r   r   rl   r   r   r   r   r   r   tmp3r@   rY   r   r   r   r   r   r   rM   rk   r   r   r   rg   rJ   rB   r   rI   )r   r   r   r   r   r   r   bytes_ar   r   rk   r   r   r   s                 r   r   zUser.__init__  s   iU]emYZZZ 	>s7||r))<===  XXXXXXXXXXXXXXXXXX	XX	XX	\\
#*
j'5%KK!Aa$ 	'****DFCA&&& 	7*****!1222tvq$&!TX66666r
   c                    t          | d          sd S t          | j                   t          | j                   t          | j                   t          | j                   t          | j                   t          | j                   t          | j                   t          | j	                   t          | j
                   t          | j                   t          | j                   t          | j                   t          | j                   t          | j                   t!          | j                   d S )NrT   )r   r>   rT   r   r   rl   r   r   r   r   r   r   r   r   r   r   rA   rY   r   s    r   r   zUser.__del__4  s    tS!! 	F			DHr
   c                     | j         S r   r   r   s    r   r   zUser.authenticatedH  r   r
   c                     | j         S r   )r   r   s    r   r   zUser.get_usernameL  s
    }r
   c                 *    t          | j                  S r   )rb   rT   r   s    r   r   zUser.get_ephemeral_secretP  r   r
   c                 "    | j         r| j        nd S r   r   r   s    r   r   zUser.get_session_keyT  r   r
   c                 8    | j         t          | j                  fS r   )r   rb   r   r   s    r   start_authenticationzUser.start_authenticationX  s    {462233r
   c           
         | j         }| j        }| j        }| j        }t	          | j        |           t	          | j        |           t          | j                  rd S t          || j	        | j
        | j        t          |                     t          | j	                  rd S t          || j        | j        | j        | j                   t!          | j        || j        || j                   t'          | j        | j	        | j        | j                   t+          | j        | j        | j                   t!          | j        || j        || j                   t'          | j        || j        | j                   t3          | j        | j        | j                   t!          | j        | j        | j        || j                    |t7          | j                                                            | _        t=          |||| j        | j        | j
        | j        | j                  | _        tA          || j
        | j        | j                  | _!        | j        S r   )"rk   r   r   r   rg   rl   r   r]   rz   r   r   rU   r   r   r   r   rI   r   rY   rG   r   rE   r   rT   r   rF   r   rb   ri   r   r   r   r   r   )r   r   bytes_Brk   r   r   r   s          r   process_challengezUser.process_challenge]  s   _
FFFTVW&&&TVW&&& df 	4
DFDFDF,q//JJJJ df 	4ZOOO461dfa222 	ty$&$&$(333ty$&$),,,49aDH555ty!TY111ty$&$),,,4649diDH===ZTV!4!466==?? *aDM4646SWSY[_[acc$j$&$&$&JJ
vr
   c                 .    | j         |k    r	d| _        d S d S r   )r   r   )r   	host_HAMKs     r   r   zUser.verify_session  s%    :"""&D #"r
   )r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   r)   r
   r   r   r     s        48'QU]akoy}  FJ +7 +7 +7 +7^  (# # #  # # #7 7 74 4 4
% % %P' ' ' ' 'r
   r   r   )T)Bosr/   hashlibrandomr%   timer   r   r	   r   r   SHA224SHA256SHA384SHA512NG_1024r   NG_4096NG_8192r   sha1sha224sha256sha384sha512r   r~   r   listr2   platformappendcdllLoadLibraryr   OSError	Structurer   r+   POINTERBIGNUMBN_CTXr'   r<   r   c_char_prU   rZ   r]   rb   rg   rn   rq   rz   r|   r   r   r   r   r   r   r   r   r   rP   urandomr)   r
   r   <module>r     s    
			 



            
 
	
	
	
	
	w|w~w~w~w~	(	& (.vg H JPPW & VG__ ),%$J &,VG__ M&SP	p tvv<xKK(():;;====
h=  	KK00335555	D	<V[,,->??AAAA < < <V[,,[99;;;;;<+ + + + +V% + + +( ( ( ( (V% ( ( ( 
	(	(		(	( &,\ I I I I  
	8r6 + + + 		9z4 ) ) ) 		:z4 ) ) ) 		<"f . . . 		=F*d . . . 		>VV\3T ; ; ;  		8FF,fl < < < 		=F*fl 4 4 4 		86663 5 5 5 		86663 5 5 5 		86666; = = = 		866666C E E E 		<66666C E E E 		966<v|M O O O 		;66?4 6 6 6 		;6?FL&BF L L L 		;>6>&116?D F F F 		;6V_ 6 6 6 		=FO- / / / 		;&/6<9 ; ; ;# # #( ( (    * * *         ) ) )  	 	 	  Z Z Z  " BFw^bjnyz  CG    @P P P P P P P PDC' C' C' C' C' C' C' C'T 
	:2:b>>2     s   -D44D8=-E+ +2F F 