
    h`              "         U d dl mZ g dZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZ d dlmZ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 d	d
lmZmZm Z  d	dl!m"Z"m#Z# d	dl$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 er d	dl!m6Z6 ddl&m7Z7 ddl+m8Z8 ddl-m9Z9m:Z: ddl;m<Z< ed         Z=ed         Z> e?d          Z@ eA            ZBdeCd<   dd!ZDdd%ZEddd(ZFdd+ZG eHd,          ZIdd.ZJdd/ZK	 ddd6ZLddd9ZMddd;ZNdd>ZOdddAZPddCZQddFZRg dddg g ddeBdGdHg ddg ddIddddddGd&ddddd dddddJ!ddZSdS )    )annotations)HttpVersionLiteralset_curl_optionsnot_setN)Counter)BytesIO)dumps)TYPE_CHECKINGAnyCallableFinalLiteralOptionalUnioncast)ParseResult	parse_qslquote	urlencodeurljoinurlparse   )CurlHttpVersionCurlOptCurlSslVersion)CURL_WRITEFUNC_ERRORCurlMime)CurlCffiWarning   )Cookies)ImpersonateError
InvalidURL)Headers)TLS_CIPHER_NAME_MAPTLS_EC_CURVES_MAPTLS_VERSION_MAPExtraFingerprintsnormalize_browser_typetoggle_extension)Request)Curl)CookieTypes)HeaderTypes)BrowserTypeLiteralExtraFpDict)	ProxySpec)	GETPOSTPUTDELETEOPTIONSHEADTRACEPATCHQUERY)v1v2v2tlsv2_prior_knowledgev3v3onlyz!#$%&'()*+,/:;=?@[]~z
Final[Any]r   version*Union[CurlHttpVersion, HttpVersionLiteral]returnr   c                    | dk    rt           j        S | dk    rt           j        S | dk    rt           j        S | dk    rt           j        S | dk    rt           j        S | dk    rt           j        S | S )Nr:   r>   r?   r;   r<   r=   )r   V1_1V3V3ONLYV2_0V2TLSV2_PRIOR_KNOWLEDGE)r@   s    V/var/www/html/marketdash/venv/lib/python3.11/site-packages/curl_cffi/requests/utils.pynormalize_http_versionrK   4   s|     $##	D!!	H		%%	D##	G		$$	(	(	(11N    urlstrboolc                V    t          |           }t          |j        o|j                  S )z,Check if the provided url is an absolute url)r   rO   schemehostname)rM   
parsed_urls     rJ   is_absolute_urlrT   G   s&    #J
!9j&9:::rL    	quote_strc                `   d                     t          t          |          z
            }t          |           }t	          |j        d          }t          |d|          }t          |j        |j	        t          |j        |          |j        ||j                                                  S )NrU   Tkeep_blank_values)doseqsafer[   )join
SAFE_CHARSsetr   r   queryr   r   rQ   netlocr   pathparamsfragmentgeturl)rM   rV   r[   rS   parsed_get_argsencoded_get_argss         rJ   quote_path_and_paramsrh   M   s    77:I.//D#J
 0DIIIO 4HHHjoD)))  fhhrL   rc   Union[dict, list, tuple]c                  	 t          |           }t          |j        d          }t          d |D                       }t	          |t
                    r!t          |                                          }t          d |D                       }|D ]\  	t	          	t          t
          f          rt          	          	|
                              dk    r)|
                              dk    r	fd|D             }r|                    	f           t          |d          }t          |j        |j        |j        |j        ||j                                                  }|S )a  Add URL query params to provided URL being aware of existing.

    Args:
        url: string of target URL
        params: dict containing requested params to be added

    Returns:
        string with updated URL

    >> url = 'http://stackoverflow.com/test?answers=true'
    >> new_params = {'answers': False, 'data': ['some','values']}
    >> update_url_params(url, new_params)
    'http://stackoverflow.com/test?data=some&data=values&answers=false'
    TrX   c              3  &   K   | ]}|d          V  dS r   N .0xs     rJ   	<genexpr>z$update_url_params.<locals>.<genexpr>r   s&      ==qt======rL   c              3  &   K   | ]}|d          V  dS rl   rm   rn   s     rJ   rq   z$update_url_params.<locals>.<genexpr>u   s&      44qt444444rL   r   c                4    g | ]}|d          k    r|nfS )r   rm   )ro   rp   keyvalues     rJ   
<listcomp>z%update_url_params.<locals>.<listcomp>|   s:       9:adckkU|  rL   )rZ   )r   r   r`   r   
isinstancedictlistitemsrO   r	   getappendr   r   rQ   ra   rb   rc   rd   re   )
rM   rc   rS   rf   old_args_counternew_args_counterrg   new_urlrt   ru   s
           @@rJ   update_url_paramsr   \   s     #J  
 0DIIIO ==_=====&$ &fllnn%%44V44444 
1 
1
UedD\** 	!%LLE$$)).>.B.B3.G.G1.L.L    >M  OO ""C<0000 !===   fhh  NrL   zBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~uric                   |                      d          }t          dt          |                    D ]}||         dd         }t          |          dk    r|                                rt	 t	          t          |d                    }n&# t          $ r}t          d| d          |d}~ww xY w|t          v r|||         dd         z   ||<   d||          ||<   d||          ||<   d		                    |          S )
zUn-escape any percent-escape sequences in a URI that are unreserved
    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
    %r   r   r      z"Invalid percent-escape sequence: ''NrU   )
splitrangelenisalnumchrint
ValueErrorr"   UNRESERVED_SETr]   )r   partsihces         rJ   unquote_unreservedr      s    IIcNNE1c%jj!! & &!HQqSMq66Q;;199;;;SAr

OO S S S !Ja!J!J!JKKQRRS N""uQx|+a)uQx>>a%58~~E!HH775>>s   -B
B.B))B.c                    d}d}	 t          t          |           |          S # t          $ r t          | |          cY S w xY w)zRe-quote the given URI.

    This function passes the given URI through an unquote/quote cycle to
    ensure that it is fully and consistently quoted.
    z!#$%&'()*+,/:;=?@[]~|z!#$&'()*+,/:;=?@[]~|r\   )r   r   r"   )r   safe_with_percentsafe_without_percents      rJ   requote_urir      sk     01	5 ',,3DEEEE 5 5 5 S3444444	5s   $ AAFheader_lines	list[str]rt   ru   replacec                   d}t          |           D ]Q\  }}|                                                    |                                dz             rd}|r
| d| | |<    nR|s|                     | d|            dS dS )z*Update header line list by key value pair.F:T: N)	enumeratelower
startswithr|   )r   rt   ru   r   foundidxlines          rJ   update_header_liner      s     E|,,  	T::<<""399;;#455 	E 6'*$5$5e$5$5S!E		
  /s--e--...../ /rL   qqueue.Queuec                B    	 | j         d         S # t          $ r |cY S w xY wNr   )queue
IndexErrorr   defaults     rJ   
peek_queuer      s7    wqz       asyncio.Queuec                B    	 | j         d         S # t          $ r |cY S w xY wr   )_queuer   r   s     rJ   peek_aio_queuer      s7    x{   r   curlr+   c                ~    h d}||z
  }|D ]}t          | |d           ||z
  }|D ]}t          | |d           d S )N>     r   
         r      #   +   -   3   T)enableF)r)   )r   extension_idsdefault_enabledto_enable_idsext_idto_disable_idss         rJ   toggle_extensions_by_idsr      s{    DDDO!O3M 4 4vd33333 %}4N  5 5ve444445 5rL   ja3permutec                   |                     d          \  }}}}}t          t          |                   }|                     t          j        |t          j        z             |t          j        k    s
J d            g }	|                     d          D ]\}
t          |
          }t          j
        |          }|s t          dt          |           d          |	                    |           ]|                     t          j        d                    |	                     |                    d          r&|dd	         }t#          j        d
t&          d           t)          d |                     d          D                       }t+          | |           |s |                     t          j        |           g }|                     d          D ]3}t          |          }t.          |         }|                    |           4|                     t          j        d                    |                     t          |          dk    s
J d            dS )zu
    Detailed explanation: https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/
    ,zOnly TLS v1.2 works for now.-zCipher z is not foundr   z-21NzPadding(21) extension found in ja3 string, whether to add it should be managed by the SSL engine. The TLS client hello packet may contain or not contain this extension, any of which should be correct.r   
stacklevelc              3  4   K   | ]}t          |          V  d S N)r   )ro   r   s     rJ   rq   z"set_ja3_options.<locals>.<genexpr>  s(      >>1A>>>>>>rL   r   z%Only curve_formats == 0 is supported.)r   r&   r   setoptr   
SSLVERSIONr   MAX_DEFAULTTLSv1_2r$   r{   r!   hexr|   SSL_CIPHER_LISTr]   endswithwarningswarnr   r_   r   TLS_EXTENSION_ORDERr%   SSL_EC_CURVES)r   r   r   tls_versionciphers
extensionscurvescurve_formatscurl_tls_versioncipher_namescipher	cipher_idcipher_namer   curve_namescurvecurve_id
curve_names                     rJ   set_ja3_optionsr      sI    ?Biinn;K*fm&s;'7'78KK"$4~7Q$QRRR~55557U555L--$$ ) )KK	)-i88 	L"#JS^^#J#J#JKKKK((((KK',)?)?@@@5!! 
_
M 	
 	
 	
 	
 >>
(8(8(=(=>>>>>MT=111 =G/<<<Kc"" ' 'u::&x0
:&&&&KK%sxx'<'<===}"""$K"""""rL   akamaic                   |                     d          \  }}}}|                    dd          }|                     t          j        t
          j                   |                     t          j        |           |                     t          j        t          |                     |dk    r |                     t          j
        |           |                     t          j        |                    dd                     dS )z
    Detailed explanation: https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf
    |r   ;0rU   N)r   r   r   r   HTTP_VERSIONr   rG   HTTP2_SETTINGSHTTP2_WINDOW_UPDATEr   HTTP2_STREAMSHTTP2_PSEUDO_HEADERS_ORDER)r   r   settingswindow_updatestreamsheader_orders         rJ   set_akamai_optionsr   #  s     6<\\#5F5F2HmWl S))HKK$o&:;;;KK&111KK+S-?-?@@@#~~G)7333 	KK2L4H4Hb4Q4QRRRRRrL   fpr'   c                   |j         r8|                     t          j        d                    |j                              |                     t          j        |j        t          j        z             |                     t          j	        t          |j                             |                     t          j        t          |j                             |                     t          j        |j                   |                     t          j        |j                   |                     t          j        |j                   |j        r%|                     t          j        |j                   |j        r%|                     t          j        |j                   |j        r'|                     t          j        |j                   d S d S )Nr   )tls_signature_algorithmsr   r   SSL_SIG_HASH_ALGSr]   r   tls_min_versionr   r   
TLS_GREASEr   
tls_greaseSSL_PERMUTE_EXTENSIONStls_permute_extensionsSSL_CERT_COMPRESSIONtls_cert_compressionSTREAM_WEIGHThttp2_stream_weightSTREAM_EXCLUSIVEhttp2_stream_exclusivetls_delegated_credentialTLS_DELEGATED_CREDENTIALStls_record_size_limitTLS_RECORD_SIZE_LIMIThttp2_no_priorityHTTP2_NO_PRIORITY)r   r   s     rJ   set_extra_fpr  9  sk   	" VG-sxx8S/T/TUUUKK"B$69S$STTTKK"C$6$6777KK.B4M0N0NOOOKK,b.EFFFKK%r'=>>>KK("*CDDD	" TG5r7RSSS	 MG123KLLL	 EG-r/CDDDDDE ErL   T   zgzip, deflate, br, zstd)!params_listbase_urldatajsonheaders_listcookies_listfilesauthtimeoutallow_redirectsmax_redirectsproxies_listproxy
proxy_authverify_listrefereraccept_encodingcontent_callbackimpersonater   r   extra_fpdefault_headersr   http_version	interfacecertstreammax_recv_speed	multipartqueue_classevent_classcurl_optionsmethod
HttpMethodr  $list[Union[dict, list, tuple, None]]r  Optional[str]r  AOptional[Union[dict[str, str], list[tuple], str, BytesIO, bytes]]r  Optional[dict | list]r  list[Optional[HeaderTypes]]r  list[Optional[CookieTypes]]r  Optional[dict]r  Optional[tuple[str, str]]r  3Optional[Union[float, tuple[float, float], object]]r  Optional[bool]r  Optional[int]r  list[Optional[ProxySpec]]r  r  r  list[Union[bool, str, None]]r  r  r   Optional[Callable]r!  (Optional[Union[BrowserTypeLiteral, str]]r"  /Optional[Union[ExtraFingerprints, ExtraFpDict]]r#  r   Union[str, Literal[False]]r$  4Optional[Union[CurlHttpVersion, HttpVersionLiteral]]r%  r&  %Optional[Union[str, tuple[str, str]]]r'  r(  r   r)  Optional[CurlMime]r*  r   r+  r,  Optional[dict[CurlOpt, str]]c       !   	     H  HIJ | }$|                                 }|dk    r!|$                    t          j        d           n8|dk    r2|$                    t          j        |                                           |dk    r |$                    t          j        d           |\  }%}&|%rt          ||%          }|&rt          ||&          }|rt          ||          }|rt          ||          }|durt          |          }|$                    t          j        |                                           t          |t          t          t          f          r"t!          |                                          }'nt          |t"                    r|                                }'nVt          |t$                    r|                                }'n,t          |t(                    r|}'n|d}'nt+          d          |#t-          |d	
                                          }'|'s|dv rs|$                    t          j        |'           |$                    t          j        t3          |'                     |dk    r |$                    t          j        |           |\  }(})t          |)t4                    r|)j        nd }*t5          |(|*          }+|+                    |)           |+                    d          },|,;t=          |          }-|,|-j        k    s|,|-j         k    r|+!                    dd            g }.|+"                                D ]Y\  }/}0|0|.#                    |/ d            |0dk    r|.#                    |/ d           ?|.#                    |/ d|0            Z|tI          |.dd           t          |t                    r|dk    rtI          |.dd           t          |t"          t(          f          rtI          |.dd           tI          |.ddd           |$                    t          j%        d |.D                        tM          ||+|          }1|$                    t          j'        d           |$                    t          j(        d           |\  }2}3|2rJ|2)                    |1          D ]4}4|                     t          j(        |4*                                           5|3rYtW          |3          }5|5)                    |1          D ]4}4|                     t          j(        |4*                                           5|	rtY          d          | rt[          t          |pi           .                                D ]E\  }/}0| /                    |/t          |0t"                    r|0                                n|0           F|$                    t          j0        | j1                   |
ri|
\  }6}7|$                    t          j2        |6                                           |$                    t          j3        |7                                           |d}t          |t                    r|\  }8}9|8|9z   }:|$                    t          j4        tk          |8dz                       |s2|$                    t          j6        tk          |:dz                       n$|$                    t          j7        d           |$                    t          j8        ts          j:        |:                     nt          |tj          tv          f          r|s1|$                    t          j6        tk          |dz                       n|$                    t          j4        tk          |dz                       |$                    t          j7        d           |$                    t          j8        ts          j:        |                     |$                    t          j<        tk          |                     |$                    t          j=        |           |\  };}<|r|<rt+          d          |rd |i}<|<|;}<|<r|$                    t          j>        d           t=          |          }=t[          t~          t"                   |<                    |=j@        |<                    d                               }|=j         rB|<                    |=j@         d!|=j          |<                    d"|=j                              p|}||$                    t          jA        |           |=j@        d#k    rf|B                    d$          rt          jD        d%t          d&'           |B                    d(          s |$                    t          jF        d           |ri|\  }6}7|$                    t          jG        |6                                           |$                    t          jH        |7                                           |\  }>}?|?du s|>sB|?@|$                    t          jI        d           |$                    t          jJ        d           t          |?t"                    r |$                    t          jK        |?           |?d)v r5t          |>t"                    r |$                    t          jK        |>           |r2|$                    t          jL        |                                           |2|$                    t          jM        |                                           |r{t          |t"                    r!|$                    t          jN        |           nE|\  }}@|$                    t          jN        |           |$                    t          jO        |@           |r?t          |          }|$Q                    ||*          }A|Adk    rt          d+| d,          |rOt          |t                    rt          d3i |}|rt          jD        d-t          d'           t          |$|           |r||rt          jD        d.t          d'           d}Bt          |t                    r	|jU        rd}Bt          |t                    r|                    d/          rd}Bt          |$||B0           |r.|rt          jD        d1t          d'           t          |$|           |r/t          |          }|$                    t          jY        |           d }Cd Id Hd J|rF |!            I |"            H |"            JHIJfd2}D|$                    t          jZ        |D           nQ|!|$                    t          jZ        |           n.t%                      }C|$                    t          j[        |C           t%                      }E|$                    t          j\        |E           |r2|$                    t          j]        |                                           |$                    t          j^        |           |#r0|#.                                D ]\  }F}G|$                    |F|G           |1|C|EIHJfS )4Nr2   r   r1   r6   )rV   FrL   z3data must be dict/list/tuple, str, BytesIO or bytes)r   r   )
separators)r2   r3   r8   )encodingHostr   rU   r   r   zContent-Typezapplication/jsonz!application/x-www-form-urlencodedzapplication/octet-streamExpectT)r   c                6    g | ]}|                                 S rm   )encode)ro   r   s     rJ   rv   z$set_curl_options.<locals>.<listcomp>  s     !C!C!C!((**!C!C!CrL   ALLzfiles is not supported, use `multipart`. See examples here: https://github.com/lexiforest/curl_cffi/blob/main/examples/upload.py)namer  r   i  z)Cannot specify both 'proxy' and 'proxies'allz://zall://httpszhttps://zMake sure you are using https over https proxy, otherwise, the proxy prefix should be 'http://' not 'https://', see: https://github.com/lexiforest/curl_cffi/issues/6r   r   socks)NT)r#  zImpersonating z is not supportedzBExtra fingerprints was altered after impersonated version was set.z?JA3 fingerprint was altered after impersonated version was set.r   )r   zBAkamai fingerprint was altered after impersonated version was set.c                                                     s                                                                  rt          S                     |            t	          |           S r   )is_setr_   r   
put_nowaitr   )chunkheader_recvedr   quit_nows    rJ   qputzset_curl_options.<locals>.qput  s_     '')) $!!###   ,++LLu::rL   rm   )_upperr   r   r2   CUSTOMREQUESTrJ  NOBODYr   r   rh   r   URLrw   rx   ry   tupler   rN   r   readbytes	TypeErrorr	   
POSTFIELDSPOSTFIELDSIZEr   r#   rF  updater{   r   ra   rR   popmulti_itemsr|   r   
HTTPHEADERr*   
COOKIEFILE
COOKIELISTget_cookies_for_curlto_curl_formatr    NotImplementedErrorr   rz   addpartMIMEPOST_formUSERNAMEPASSWORDCONNECTTIMEOUT_MSr   
TIMEOUT_MSLOW_SPEED_LIMITLOW_SPEED_TIMEmathceilfloatFOLLOWLOCATION	MAXREDIRSPROXY_CREDENTIAL_NO_REUSEr   rQ   PROXYr   r   r   r   HTTPPROXYTUNNELPROXYUSERNAMEPROXYPASSWORDSSL_VERIFYPEERSSL_VERIFYHOSTCAINFOREFERERACCEPT_ENCODINGSSLCERTSSLKEYr(   r!  r!   r'   r  r   r   r   rK   r   WRITEFUNCTION	WRITEDATA
HEADERDATA	INTERFACEMAX_RECV_SPEED_LARGE)Kr   r-  rM   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r   r   r"  r#  r   r$  r%  r&  r'  r(  r)  r*  r+  r,  r   base_paramsrc   bodybase_headersheadersrF  r   host_headerur   kvreqbase_cookiescookiesmorseltemp_cookiesusernamepasswordconnect_timeoutread_timeoutall_timeoutbase_proxiesproxiesr   base_verifyverifyrt   retr   bufferrV  header_bufferoptionsettingrT  r   rU  sK                                                                           @@@rJ   r   r   K  sn   N 	A\\^^F 	q!!!!	5	&888	### &K 2[11 -V,, %h$$ :#C5999E#HHW[#**,,''' $tU+,, O%%''	D#		 	O{{}}	D'	"	" Oyy{{	D%	 	  O	MNNNTj11188::  4v111	#T***	&D		222U??HHW*F333 )L'#-gw#?#?IwTHx000AHHW
 %%--KSMM!(""kQZ&?&?EE&$ L - -191(((("WW1((((1,,,, <9KLLL$ 
&F"2"2.*M	
 	
 	
 $e%% U<9STTT |Xr4@@@@HHW!C!Cl!C!C!CDDD
#q&
!
!C HHW%%%HHW'''(L' E"77<< 	E 	EFKK*F,A,A,C,CDDDD Ew''"77<< 	E 	EFKK*F,A,A,C,CDDDD  
!S
 
 	
  4tzr**0022 	T 	TDAq1As9K9K+R188:::QRSSSS	!9?333  6!(	!8??#4#4555	!8??#4#4555 '5!! A(/%%4	*C$0F,G,GHHH 	EHHW'[4-?)@)@AAAA HHW,a000HHW+TY{-C-CDDDD	Gc5\	*	* A 	AHHW'Wt^)<)<====HHW.GdN0C0CDDDHHW,a000HHW+TYw-?-?@@@ HHW#S%9%9::: HHW... )L' E ECDDD !%. &C
 	
2A666Xc]GKKgkk%>P>P$Q$QRR> 	|8888KK 9 9 9::     HHW]E***|w&&##J// MP (#$    ''00 9HHW4a888  C%/"(.0A0ABBB.0A0ABBB &Kkfn	'+++	'+++ &# )	((( *[#">">	---  4	'.."2"2333 "	(/*@*@*B*BCCC  *dC   	*HHW_d++++ID#HHW_d+++HHW^S)))  T,[99mmKmII!88"#RK#R#R#RSSS  	"h%% 	5(44844H 	MT   
 	Q!!!  1 	MQ   
 h 122 	x7V 	Gh%% 	(,,7O*P*P 	G30000  & 	MT   
 	1f%%%  5-l;;	%|444FAMH ,KMM#;==	 	 	 	 	 	 	 	
&----		%	&(89999	"F+++IIMHHW///  8	"I$4$4$6$6777 HHW)>:::  &+1133 	& 	&OFGHHVW%%%%q-AArL   )r@   rA   rB   r   )rM   rN   rB   rO   )rU   )rM   rN   rV   rN   )rM   rN   rc   ri   rB   rN   )r   rN   rB   rN   )F)r   r   rt   rN   ru   rN   r   rO   r   )r   r   )r   r   )r   r+   )r   r+   r   rN   r   rO   )r   r+   r   rN   )r   r+   r   r'   )Hr   r+   r-  r.  rM   rN   r  r/  r  r0  r  r1  r  r2  r  r3  r  r4  r  r5  r  r6  r  r7  r  r8  r  r9  r  r:  r  r0  r  r6  r  r;  r  r0  r  r0  r   r<  r!  r=  r   r0  r   r0  r"  r>  r#  rO   r   r?  r$  r@  r%  r0  r&  rA  r'  r8  r(  r   r)  rB  r*  r   r+  r   r,  rC  )T
__future__r   __all__asynciors  r   r   collectionsr   ior   r  r	   typingr
   r   r   r   r   r   r   r   urllib.parser   r   r   r   r   r   constr   r   r   r   r   r   utilsr   r  r    
exceptionsr!   r"   r  r#   r!  r$   r%   r&   r'   r(   r)   modelsr*   r+   r,   r-   r.   r/   sessionr0   r.  r   r_   r^   objectr   __annotations__rK   rT   rh   r   	frozensetr   r   r   r   r   r   r   r   r   r  r   rm   rL   rJ   <module>r     sh   " " " " " " "
?
?
?                       V V V V V V V V V V V V V V V V V V V V T T T T T T T T T T T T T T T T < < < < < < < < < < 1 1 1 1 1 1 1 1 # # # # # #       4 4 4 4 4 4 4 4                            #$$$$$$$$$$$$<<<<<<<<"""""" P
 VW S'((
fhh       &; ; ; ;    4 4 4 4v M 
   ,5 5 5 5, DI/ / / / /        5 5 5 5"+L +L +L +L +L\S S S S,E E E E. 9;"NR"&0202 &*CJ&*#%.0,002!%>+/<@ @D (*IM#26!$(15KoB oB oB oB oB oB oB oBrL   