
    h                     2   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddl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 Z e            rd	Z d
Z!dZ"ndZ dZ!dZ" G d d          Z#d Z$d Z% G d d          Z&d Z' G d d          Z( G d d          Z) G d d          Z* G d de*          Z+ G d d          Z, G d  d!e,          Z- G d" d#e,          Z. G d$ d%e,          Z/dLd'Z0d( Z1d) Z2d* Z3d+ Z4d, Z5d- Z6d. Z7d/ Z8d0 Z9d1 Z:d2 Z;dMd3Z<	 	 dMd4Z=d5 Z>	 	 dNd7Z?d8 Z@d9 ZAd: ZBd; ZCd< ZDd= ZEd> ZFdOd?ZGd@ ZHdOdAZIdB ZJ	 	 dPdCZKdD ZLdE ZMeNdFk    rejO        rs ejP        dGH          5 ZQ ejR                      ejS        dI            eTdJ            eM            ZUeQrdKZUddd           n# 1 swxY w Y    ejV        eU           dS  ejV         eM                       dS dS )Qz'
Unit testing infrastructure for Scapy
    N)WINDOWS
BIG_ENDIAN)conf)base64_bytes)DefaultThemeBlackAndWhite)
tex_escapec                  b    	 t           rt          j        j        dk    S dS # t          $ r Y dS w xY w)z,
    Check UTF-8 support for the output
    zutf-8TF)r   sysstdoutencodingAttributeError     W/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/tools/UTscapy.py_utf8_supportr   &   sF     	4J'723t   uus     
..u   └u   ━u   ✓z->z--OKc                       e Zd Zd ZdS )Bunchc                 $    t          | d|          S )N__dict__)setattr)selfkws     r   <lambda>zBunch.<lambda>?   s    '$
B"?"? r   N)__name__
__module____qualname____init__r   r   r   r   r   >   s        ??HHHr   r   c                     d}d}t          d          D ]I}	  |             c S # t          $ r. t          j                    \  }}}t	          j        d           Y Fw xY w|r|r|                    |          dS dS )z2Retries the passed function 3 times before failingN      )range	Exceptionr   exc_infotimesleepwith_traceback)funcvtb_ts        r   
retry_testr.   B   s    A	B1XX  	466MMM 	 	 	|~~HAq"JqMMMMM	 	 #R #r"""# # # #s   	#5AAc                     |                      d          r
| dd         } t          j                            t          j                            t          j                            t                    d|                     S )z/Resolves a path relative to scapy's root folder/r"   Nz../../)
startswithospathabspathjoindirname__file__)fnames    r   
scapy_pathr9   Q   sd     abb	7??27<<
!!8U    r   c                   &    e Zd ZdZddZd Zd ZdS )no_debug_dissectorz3Context object used to disable conf.debug_dissectorFc                     || _         d S N)	new_value)r   reverses     r   r   zno_debug_dissector.__init__\   s     r   c                 J    t           j        | _        | j        t           _        d S r=   )r   debug_dissectorold_dbgr>   r   s    r   	__enter__zno_debug_dissector.__enter___   s    +#~r   c                 (    | j         t          _        d S r=   )rB   r   rA   )r   exc_type	exc_value	tracebacks       r   __exit__zno_debug_dissector.__exit__c   s    #|r   N)F)r   r   r   __doc__r   rD   rI   r   r   r   r;   r;   Z   sL        ==! ! ! !. . ., , , , ,r   r;   c                     |                      d          r
| d d         } 	 t          j        | d          S # t          $ r t          j        |           cY S w xY w)Nz.pyscapy)package)endswith	importlibimport_moduler$   )names    r   rQ   rQ   j   sp    }}U CRCy-&tW==== - - -&t,,,,,-s   7 AAc                   &    e Zd Zd Zd Zd Zd ZdS )Filec                 V    || _         |                    d          | _        || _        d S Nutf8)rR   encodelocalURL)r   rR   rZ   rY   s       r   r   zFile.__init__v   s'    	\\&))
r   c                 N    t          j        t          | j                            S r=   )bz2
decompressr   rY   rC   s    r   	get_localzFile.get_local{   s    ~l4:66777r   c                     | j         S r=   )rZ   rC   s    r   get_URLzFile.get_URL~   s	    xr   c                     |r|dz  }t          || j        z   d          5 }|                    |                                            d d d            d S # 1 swxY w Y   d S )Nr0   wb)openrR   writer^   )r   dirfdescs      r   rd   z
File.write   s     	3JC#	/4(( 	*EKK(()))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   (AAAN)r   r   r   r   r^   r`   rd   r   r   r   rT   rT   u   sP          
8 8 8  * * * * *r   rT   c                   z    e Zd Z eddd          Z eddd          Zd Z ee          Zd Z ee          Zd	S )
External_Filesz
UTscapy.jsz*https://scapy.net/files/UTscapy/UTscapy.jsaE  QlpoOTFBWSZTWWVijKQAAXxfgERUYOvAChIhBAC
/79+qQAH8AFA0poANAMjQAAAGABo0NGEZNBo0
0BhgAaNDRhGTQaNNAYFURJinp
lGaKbRkJiekzSenqmpA0Gm1LFMpRUklVQlK9WUTZYpNFI1IiEWE
FT09Sfj5uO+
qO6S5DQwKIxM92+Zku94wL6V/1KTKan2c66Ug6SmVKy1ZIrgauxMVLF5xLH0lJRQ
u
KlqLF10iatlTzqvw7S9eS3+h4lu3GZyMgoOude3NJ1pQy8eo+X96IYZw+yneh
siPj73m0rnvQ3QX
Z9BJQiZQYQ5/uNcl2WOlC5vyQqV/BWsnr2NZYLYXQLDs/Bf
fk4ZfR4/SH6GfA5Xlek4xHNHqbSsR
bREOgueXo3kcYi94K6hSO3ldD2O/qJXOF
qJ8o3TE2aQahxtQpCVUKQMvODHwu2YkaORYZC6gihEa
llcHDIAtRPScBACAJnU
ggYhLDX6DEko7nC9GvAw5OcEkiyDUbLdiGCzDaXWMC2DuQ2Y6sGf6NcRu
ON7QS
bhHsPc4KKmZ/xdyRThQkGVijKQ=
zUTscapy.cssz+https://scapy.net/files/UTscapy/UTscapy.cssa  QlpoOTFBWSZTWbpATIwAAFpfgHwQSB//+Cpj2Q
C//9/6UAS5t7qcLut3NNDp0gxKMmpqaep6n6iP
1J+pPU0yAAaeoaDI0BJCTJqa
j1BoaGhoAAPSAAAJNSRqmmk8TQmj1DT1Hom1HkQABoNDmmJgATAB
MAAJgACYJI
hDQUzCR5Q0niRoaAGgGmZS+faw7LNbkliDG1Q52WJCd85cxRVVKegld8qCRISoto
GD
EGREFEYRW0CxAgTb13lodjuN7E1aCFgRFVhiEmZAZ/ek+XR0c8DWiAKpBgY2
LNpQ1rOvlnoUI1Al
0ySaP1w2MyFxoQqRicScCm6WnQOxDnufxk8s2deLLKlN+r
fvxyTTCGRAWZONkVGIxVQRZGZLeAwH
bpQXZcYj467i85knEOYWmLcokaqEGYGS
xMCpD+cOIaL7GCxEU/aNSlWFNCvQBvzb915huAgdIdD2
ya9ZQGoqrmtommfAxu
7FGTDBNBfir9UkAMmT1KRzxasJ0n2OE+mlgTZzJnhydbJaMtAk8DJzUuvv
Zpc3
CJLVyr8F3NmIQO5E3SJSY3SQnk1CQwlELqFutXjeWWzmiywo7xJk5rUcVOV9+Ro4
96WmXsUr
kKhNocbnFztqPhesccW5kja+KuNFmzdw4DVOBJ2JPhGOYSwCUiwUe2
kOshYBdULUmwYwToAGdgA9
5n3bSpG85LUFIE0Cw78EYVgY0ESnYW5UdfgBhj1w
PiiXDEG2vAtr38O9kdwg3tFU/0okilEjDYDa
EfkomkLUSokmE8g1fMYBqQyyaP
RWmySO3EtAuMVhQqIuMldOzLqWubl7k1MnhuBaELOgtB2TChcS
0k7jvgdBKIef
UkdAf3t2GO/LVSrDvkcb4l4TrwrI7JeCo8pBvXqZBqZJSqbsAziG7QDQVNqdtFGz

EvMKOvKvUQ6mJFigLxBnziGQGQDEMQPSGhlV2BwAN6rZEmLwgED0OrEiSxXDcB
MDskp36AV7IbKa
Cila/Wm1BKhBF+ZIqtiFyYpUhI1Q5+JK0zK7aVyLS9y7GaSr
NCRpr7uaa1UgapVKs6wKKQzYCWsV
8iCGrAkgWZEnDMJWCGUZOIpcmMle1UXSAl
d5OoUYXNo0L7WSOcxEkSGjCcRhjvMRP1pAUuBPRCRA
2lhC0ZgLYDAf5V2agMUa
ki1ZgOQDXQ7aIDTdjGRTgnzPML0V1X+tIoSSZmZhrxZbluMWGEkwwky6
0ObWIM
cEbX4cawPPBVc6m5UUPbEmBANyjtNvTKE2ri7oOmBVKIMLqQKm+4rlmisu2uGSxW
zTov5w
qQDp61FkHk40wzQUKk4YcBlbQT1l8VXeZJYAVFjSJIcC8JykBYZJ1yka
I4LDm5WP7s2NaRkhhV7A
FVSD5zA8V/DJzfTk0QHmCT2wRgwPKjP60EqqlDUaST
/i7kinChIXSAmRgA==
c                 H    d | j                                         D             S )Nc                 N    i | ]"\  }}t          |t                    ||j        #S r   )
isinstancerT   rR   .0xys      r   
<dictcomp>z1External_Files.get_local_dict.<locals>.<dictcomp>   s>     ( ( (fq!a&&(16 ( ( (r   r   itemsclss    r   get_local_dictzExternal_Files.get_local_dict   s0    ( ((:(:(<(< ( ( ( 	(r   c                 H    d | j                                         D             S )Nc                 N    i | ]"\  }}t          |t                    ||j        #S r   )rk   rT   rZ   rl   s      r   rp   z/External_Files.get_URL_dict.<locals>.<dictcomp>   s>     ( ( (Vaa&&(15 ( ( (r   rq   rs   s    r   get_URL_dictzExternal_Files.get_URL_dict   s0    ( (s|'9'9';'; ( ( ( 	(r   N)	r   r   r   rT   
UTscapy_jsUTscapy_cssru   classmethodrx   r   r   r   rh   rh      s        l$P	!
" 
"J $}&S K4( ( ( ![00N( ( ( ;|,,LLLr   rh   c                   *    e Zd Zd Z ee          ZdS )	EnumClassc                 @    | j         |                                         S r=   )r   upper)rt   rn   s     r   from_stringzEnumClass.from_string   s    |AGGII&&r   N)r   r   r   r   r{   r   r   r   r}   r}      s,        ' ' '+k**KKKr   r}   c                   &    e Zd ZdZdZdZdZdZdZdS )Formatr"      r!            N)	r   r   r   TEXTANSIHTMLLATEXXUNITLIVEr   r   r   r   r      s,        DDDEEDDDr   r   c                       e Zd Zd Zd ZdS )	TestClassc                 "    t          | |          S r=   )getattr)r   items     r   __getitem__zTestClass.__getitem__   s    tT"""r   c                 R   t          |t                    r|                                g}|D ]y}|                                }|                    d          r4	 | j                            |dd                     O# t          $ r Y [w xY w| j                            |           zd S )N-r"   )rk   strlowerr1   keywordsremoveKeyErroradd)r   kwskwds      r   add_keywordszTestClass.add_keywords   s    c3 	 99;;-C 	' 	'C))++C~~c"" 'M((QRR1111   D !!#&&&&	' 	's   "A<<
B	B	N)r   r   r   r   r   r   r   r   r   r      s2        # # #' ' ' ' 'r   r   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )TestCampaignc                     || _         d | _        d| _        g | _        t	                      | _        d | _        d | _        d | _        d | _	        d| _
        d| _        d| _        d S )N r   Fg        )titlefilenameheadcommentscampaignsetr   crcshapreexecpreexec_outputend_posinterruptedduration)r   r   s     r   r   zTestCampaign.__init__   sa    
" r   c                 x    | j                             |           |j                            | j                   d S r=   )r   appendr   update)r   testsets     r   add_testsetzTestCampaign.add_testset   s7    W%%%.....r   c                 .    | j         d |         | _         d S r=   r   r   indexs     r   trunczTestCampaign.trunc   s    fuf-r   c                 @    | D ]}|D ]}||_         |dz  }|| _        d S )Nr"   )numr   )r   beginpostsr-   s       r   startNumzTestCampaign.startNum   sD     	 	B   A  r   c                 4    | j                                         S r=   )r   __iter__rC   s    r   r   zTestCampaign.__iter__   s    }%%'''r   c              #   &   K   | D ]}|D ]}|V  d S r=   r   )r   r   r-   s      r   	all_testszTestCampaign.all_tests   s>       	 	B  	 	r   N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r      sn          / / /. . .     ( ( (    r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )TestSetc                 r    || _         g | _        d| _        t                      | _        d | _        d| _        d S )Nr   r"   )rR   testscommentsr   r   r   expandr   rR   s     r   r   zTestSet.__init__  s4    	
r   c                 x    | j                             |           |j                            | j                   d S r=   )r   r   r   r   )r   tests     r   add_testzTestSet.add_test  s6    
$T]+++++r   c                 .    | j         d |         | _         d S r=   r   r   s     r   r   zTestSet.trunc  s    Z'


r   c                 4    | j                                         S r=   )r   r   rC   s    r   r   zTestSet.__iter__  s    z""$$$r   N)r   r   r   r   r   r   r   r   r   r   r   r     sP          , , ,( ( (% % % % %r   r   c                   $    e Zd Zd Zd Zd ZeZdS )UnitTestc                     || _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        t                      | _	        d | _
        d| _        d S )Nr   passedr   r"   )rR   r   r   resultfresultr   outputr   r   r   r   r   r   s     r   r   zUnitTest.__init__  sW    		r   c                     | j         dk    r!|                    | j                   | _        d S |                    | j                   | _        d S Nr   )r   successr   fail)r   themes     r   preparezUnitTest.prepare)  sA    ;("" ==55DLLL ::dk22DLLLr   c                     | j         dk    S r   )r   rC   s    r   __nonzero__zUnitTest.__nonzero__/  s    {h&&r   N)r   r   r   r   r   r   __bool__r   r   r   r   r     s@          3 3 3' ' 'HHHr   r   r!   c           	         t          |           5 }t          j        |          |dk    rt          dt          z  |            ddd           n# 1 swxY w Y   fd}t          di d |dg           d |dd          d |dg           d	 |d	d
          d |dd          d |dd          d |dd          d |dd          d |di           d |dd          d |dt          j                  d |dd
          d |dd          d |dg           d |dg           d |dg           d |dd          S )a  Parse provided json to get configuration
    Empty default json:
    {
      "testfiles": [],
      "breakfailed": true,
      "onlyfailed": false,
      "verb": 3,
      "dump": 0,
      "docs": 0,
      "crc": true,
      "preexec": {},
      "global_preexec": "",
      "outputfile": null,
      "local": true,
      "format": "ansi",
      "num": null,
      "modules": [],
      "kw_ok": [],
      "kw_ko": []
    }

    r   z %s Loaded config fileNc                      | v r|          n|S r=   r   )keydefaultdatas     r   get_if_existz'parse_config_file.<locals>.get_if_existR  s    4KKtCyyW4r   	testfilesbreakfailedTremove_testfiles
onlyfailedFverbr!   dumpr   r   r"   docsr   global_preexecr   outfile
outputfilerY   r   moduleskw_okkw_koformatansir   )rc   jsonloadprintarrowr   r   r   )config_pathr   config_filer   r   s       @r   parse_config_filer   6  sz   . 
k		 Aky%%!88*U2K@@@A A A A A A A A A A A A A A A
5 5 5 5 5 8 8 8<<R888 8)\->>>8".,/A2"F"F"F8 )Lu===8 #l61---	8
 #l61---8
 4@<q3I3I3I8 #l61---8 &i4448 !--=r B B B8 &lCJ???8 $|GU3338 "\%...8 &i4448 $|GR0008 $|GR0008 %Xv6668 8s   3AAAc                 >   t          d          }| j        |_        d }d }d}|                                 D ]}|d         dk    r|d         dk    r4|p|p|                    |dd                                                     P|d         dk    r"|dd                                          |_        ~|d         dk    rAt          |dd                                                    }|	                    |           d }|d         dk    rdt          |dd                                                    }||_        |dz  }|d	}t          j        |          |                    |           ;|d         d
k    rR||xj        |dd          z  c_        c||xj        |dd          z  c_        |xj        |dd          z  c_        |:|                                r$t#          d|                                z            |xj        |z  c_        |S )NzTest campaignr   #~r"   %+=z,Please create a test set (i.e. '+' section).*zUnknown content [%s])r   rR   r   	readlinesr   splitstripr   r   r   r   r   getoptGetoptErrorr   r   r   
ValueErrorr   )campaign_filetest_campaignr   r   testnblineerror_ms          r   parse_campaign_filer  h  s6    11M*/MGDF'')) " "7c>>7c>>-W-;;DHNN<L<LMMMM!W^^"&qrr(.."2"2M!W^^d122hnn..//G%%g...DD!W^^DHNN,,--DDHaKFH(111T""""!W^^abb)$  DH,   **d122h6***|::<< L$%;djjll%JKKKL 		T!			r   c                    t          dt          | j                  dz   z             t          d| z             t          dt          | j                  dz   z             | j        r| j        rt          d| z             t          d| z             t                       | D ].}|j        rMt          d|j        ddt          d	d
t          |j                  z
  dz
            z  d|j        d           nCt          d|j        ddt          d	d
t          |j                  z
  dz
            z             |j        r*t          dd                    |j                  z             |D ]`}t          d|z             dx}}|j        rdd                    |j                  z  }|j        rd|z  }|s|rt          d||           a0d S )Nr   r   z## %(title)s ##zCRC=[%(crc)s] SHA=[%(sha)s]zfrom file %(filename)sz+--[]r   r   P      (z)--z  kw=%s,z%(num)03i %(name)sr   zkw=%sz
[%(crc)s] z    )	r   lenr   r   r   rR   maxr   r5   )r	  r   r-   cks        r   dump_campaignr    s   	#]())A-
.///	
m
+,,,	#]())A-
./// =]. =+m;<<<	
"]
2333	GGG + +6 	PErwwwc!R#bg,,=NQS=S6T6T0T0T0TVXV\V\V\]^^^^E#ArCLL7H17L0M0M*M*MNOOO; 	5)chhr{333444 	+ 	+A&*+++JAz 3chhqz222u % 1$ +A +AAqq)***	++ +r   c           	         t          d| z             t          dt          | j                  z             t                       t          | j                  rKt          d| j                                                            dd          z             t                       | D ]}t          d|j        z             t          dt          |j                  z             t                       t          |j                  rKt          d|j                                                            dd          z             t                       |D ]}t          d|j        z             t          dt          |j                  z             t                       t          |j                  rKt          d|j                                                            dd          z             t                       t          d           |j        	                    d          D ];}|
                                                    d	          st          d
|z             <d S )Nz	%(title)sr   %s
r   r   ^zUsage example::z	# no_docsz	%s)r   r  r   r   r  replacerR   r   r   r  rstriprO   )r	  r   r-   r  s       r   docs_campaignr    s   	+
%&&&	#]())
*+++	GGG
=%&& d]/5577??bIIIJJJ ) )dRWncCLL !!!r{ 	$**,,44T2>>>???GGG 
	) 
	)A$-   #AF#$$$GGG1: dQZ--//77bAAABBB#$$$T** ) ){{}}--k:: )&4-((()
	)) )r   c                 R    ddt          j        t          | d                    z  z  S )Nz%08Xl    rW   )zlibcrc32	bytearrayrn   s    r   r"  r"    s&    Z$*Yq&-A-A"B"BBCCr   c                     t          j        |                     d                                                                                    S rV   )hashlibsha1rX   	hexdigestr   r$  s    r   r'  r'    s6    <(())3355;;===r   c                    d}| D ]Z}d}|D ]7}|j                                         }t          |          |_        |d|z   z  }8t          |          |_        |d|z   z  }[t          |          | _        t	          | j                  5 }t          |                                          | _        d d d            d S # 1 swxY w Y   d S )Nr    z )	r   r  r"  r   rc   r   r'  readr   )r	  dcr   dtsr-   dtrf   s          r   compute_campaign_digestsr/    s   	B   	 	AB"IIAE4"9CCs
hnb		M	m$	%	% / ../ / / / / / / / / / / / / / / / / /s   'B<<C C c                 v    r5| D ]}fd|j         D             |_         d | j        D             | _        d S d S )Nc                 &    g | ]}|j         v |S r   )r   )rm   r-   r   s     r   
<listcomp>z+filter_tests_on_numbers.<locals>.<listcomp>  s     <<<aqu|||||r   c                      g | ]}|j         	|S r   r   rm   r   s     r   r2  z+filter_tests_on_numbers.<locals>.<listcomp>  s.     "/ "/ "/%'X"/" "/ "/ "/r   )r   r   )r	  r   r   s    ` r   filter_tests_on_numbersr5    sl    
 / 	= 	=B<<<<28<<<BHH"/ "/}/E "/ "/ "// /r   c                     d r<                                 |rd nd | D ]}fd|j        D             |_        d S d S )Nc                 :    t          fd| D                       S )Nc              3   (   K   | ]}|k    |V  d S r=   r   )rm   r  r   s     r   	<genexpr>z5_filter_tests_kw.<locals>.kw_match.<locals>.<genexpr>  s'      --R1WW1WWWW--r   )any)lstr   s    `r   kw_matchz"_filter_tests_kw.<locals>.kw_match  s&    ----c------r   c                     | S r=   r   r$  s    r   r   z"_filter_tests_kw.<locals>.<lambda>  s    Q r   c                     |  S r=   r   r$  s    r   r   z"_filter_tests_kw.<locals>.<lambda>  s    U r   c                 H    g | ]}  |j                             |S r   )r   )rm   r-   condr   r<  s     r   r2  z$_filter_tests_kw.<locals>.<listcomp>  s6    NNNattHHQZ4L4L/M/MNNNNr   )r   r   )r	  r   keepr   r@  r<  s    `  @@r   _filter_tests_kwrB    s    . . . 
 OXXZZ 	#;DD"?D 	O 	OBNNNNNN28NNNBHHO O	O 	Or   c                 $    t          | |d          S )NTrB  r	  r   s     r   filter_tests_keep_on_keywordsrF    s    M2t444r   c                 $    t          | |d          S )NFrD  rE  s     r   filter_tests_remove_on_keywordsrH    s    M2u555r   c                 2    d | j         D             | _         d S )Nc                      g | ]}|j         	|S r   r   r4  s     r   r2  z)remove_empty_testsets.<locals>.<listcomp>   s    NNNRRXNbNNNr   r   )r	  s    r   remove_empty_testsetsrK    s!    NN=+ANNNMr   c                 F    ddl m} 	  || d||          S # |$ r Y dS w xY w)zRun a test with timeoutr   )StopAutorunTimeouti,  )timeoutr   
my_globals)z-- Test timed out ! --F)scapy.autorunrM  )r   get_interactive_sessionr   rO  rM  s        r   _run_test_timeoutrR    sd    000000/&&t/5,02<> > > 	>  / / /.../s      c                 H   t          j                     }t          | j                                        |||          \  | _        }d| _        	 ||rd| _        | j                            d          rd| _        t          n# t          $ r | xj        dz  c_        | xj        d	                    t          j        t          j                    d	         t          j                    d
         t          j                    d                             z  c_        Y nw xY wt          j                     |z
  | _        | j        dk    rLd	dlm} |j        r?|j        \  }}	| xj        d|j        d|	                                dz  c_        d|_        |                     |           |dk    rt+          d| z             n|d
k    rt+          d| z             n# t          j                     |z
  | _        | j        dk    rLd	dlm} |j        r?|j        \  }}	| xj        d|j        d|	                                dz  c_        d|_        |                     |           |dk    rt+          d| z             w |d
k    rt+          d| z             w w xY wt-          |           S )z1An internal UTScapy function to run a single testr   rO  failedNr   zKeyboardInterrupt
r   z-UTscapy: Error during result interpretation:
r   r   r"   r   )debugz 

PACKET DISSECTION FAILED ON:
 z(bytes.fromhex('z'))z/%(fresult)6s %(crc)s %(duration)06.2fs %(name)sz%(fresult)6s %(crc)s %(name)s)r&   rR  r   r  r   r   rO   KeyboardInterruptr$   r5   rH   format_exceptionr   r%   r   scapy.sendrecvrV  
crashed_onr   hexr   r   bool)
r   rQ  r   r   rO  
start_timeresrV  rt   vals
             r   run_testr`    s    J():):<SZ^kuvvvDKDK:;#;"DK; 566 	$'DK##	$  u u uGGrwwy9#,..:KS\^^\]M^`c`l`n`nop`qsstttu 	j0;("",,,,,, ( +S_b_k_k_kmpmtmtmvmvmvmvww#' U!88CdJKKKKAXX1D8999 	j0;("",,,,,, ( +S_b_k_k_kmpmtmtmvmvmvmvww#' U!88CdJKKKKAXX1D89999  ::s,   3B G BDG DG B;Jc                 :   t           | d<   t          | d<   t          | d<   t          | d<   t          rkddlm}  |             t          j        | d         _        t          j	        j
        | d         j	        _
        t          j        j
        | d         j        _
        dS dS )	z(Adds UTScapy tools directly to a sessionr   r.   r9   r;   r   )_route_add_loopbackr   N)r   r.   r9   r;   r   scapy.arch.windowsrb  r   ifacesrouteroutesroute6)sesrb  s     r   import_UTscapy_toolsri  4  s    CL"C"C 2C 7::::::![F#':#4F $(K$6F!!!7 7r   Fc           	      `   dx}}| j         r/ || j                                         |          d         | _        fd}	 t          |           D ][\  }	}
t          |
          D ]F\  }t	          ||||          r|dz  }n|dz  }|r ||           | xj        j        z  c_        G\nj# t          $ r] |dz  }|
                    |dz              |                     |	dz              d| _        |rt          d           |r ||           Y nw xY w|| _
        || _        |j        |j        gt          |                   }|dk    r0t          d	| z             t           |d
||fz                       n1|r/t          d| z             t           |d
||fz                       |S )Nr   )rO  c                 D    t          j        dj        z  |            d S )NznTest '%s' failed. exit() to stop, Ctrl-D to leave this interpreter and continue with the current test campaign)bannerrY   )codeinteractrR   )	scapy_sesr-   s    r   dropzrun_campaign.<locals>.dropM  s<     >  !v	& .7		8 	8 	8 	8 	8 	8r   rT  r"   TzCampaign interrupted!r   z5Campaign CRC=%(crc)s in %(duration)06.2fs SHA=%(sha)szPASSED=%i FAILED=%iz!Campaign CRC=%(crc)s  SHA=%(sha)s)r   r  r   	enumerater`  r   rW  r   r   r   r   rU  r   r   r\  )r	  rQ  r   drop_to_interpreterr   ro  r   rU  rp  ir   jstyler-   s                @r   run_campaignrv  B  sR    FV '>'>!'')) (
 (
 (
 ($8 8 8 8 8 #M22 		5 		5JAw!'** 5 51A6!%)= = = (aKFFaKF* (Y&&!*4&&&5		5       !a!eAE"""$(! 	 )***"  Y  "M!M]EJ'V5EaxxEUVVVee)VV,<<==>>>>	 ?1MABBBee)VV,<<==>>>Ms   A+B. .A$DDc                    | j         }| j        }|dk    r|                    |d          }n|dk    r|                    |d          }|dt          j        d          d|S dt          j        d          d|d	|S )
N
   zbg_red+whiter   redzRun at z%H:%M:%Sz by UTscapy in  from [z] by UTscapy in )r   r   r   r&   strftime)r	  r   r   r   s       r   	info_liner|  w  s    %H%H"}}<<.99	A<<%00M*%%%%H
 	
  M*%%%%HHH
 	
r   c                 t    | j         }|dt          j                    z  S dt          j                    d|dS )NzKRun %s by <a href="http://www.secdev.org/projects/UTscapy/">UTscapy</a><br>zRun rz  zF] by <a href="http://www.secdev.org/projects/UTscapy/">UTscapy</a><br>)r   r&   ctimer	  r   s     r   html_info_liner    sa    %H`cgcmcocooo  osnxnznznznz  }E  }E  }E  F  	Fr   c                     | j         }|ddt          j                    z  fS dt          |          z  dt          j                    z  fS )Nz
by UTscapyr  zfrom %s by UTscapy)r   r&   r~  r	   r  s     r   latex_info_liner    sI    %HDJLL!888'*X*>*>>4:<<@WWWr   c                    d |j         gt          | j                           }d |j        gt          | j                           }|                    d| z            }|t          dz   t          | |          z   dz   z  }| |dt          z   d| z  z             z  }| |dt          z   d| z  z             z  }|d| z  z  }| D ]7}t          d	 |D                       r|d
|z  z  }|D ]}|j
        r|d|z  z  }8|S )Nc                     | S r=   r   r$  s    r   r   z"campaign_to_TEXT.<locals>.<lambda>       r   c                     | S r=   r   r$  s    r   r   z"campaign_to_TEXT.<locals>.<lambda>  r  r   z
%(title)s
 r  z Passed=%(passed)i
z Failed=%(failed)i
z%(headcomments)s
c              3   $   K   | ]}|j         V  d S r=   )r   )rm   r-   s     r   r9  z#campaign_to_TEXT.<locals>.<genexpr>  s$      ))Aqx))))))r   z(######
## %(name)s
######
%(comments)s

z>###(%(num)03i)=[%(result)s] %(name)s
%(comments)s
%(output)s

)r   r\  r   r   rU  greendashr|  r   r:  r   )r	  r   pthemefthemer   r   r-   s          r   campaign_to_TEXTr    sA   k5=)$}/C*D*DEFk5:&tM,@'A'ABF[[=899F
dSj9]E:::TAAF
ffS5[#9M#IIJJJF
ffS5[#9M#IIJJJF
"]22F  g g))))))) 	gEOOF g g8 gbefffFMr   c                 "    t          | |          S r=   )r  )r	  r   s     r   campaign_to_ANSIr    s    M5111r   c                     d}| D ]`}|D ][}|d|j                             dd          z  z  }|d|j                             dd          z  z  }|d|z  z  }|s|d|z  z  }|dz  }\a|d	z  }|S )
Nz4<?xml version="1.0" encoding="UTF-8" ?>
<testsuite>
z <testcase classname="%s"
"r  z           name="%s"
z           duration="0">
z&<error><![CDATA[%(output)s]]></error>
z</testcase>
z</testsuite>)rR   r  r	  r   r   r-   s       r   campaign_to_xUNITr    s    EF  & & 	& 	&A3gl6J6J3PS6T6TTTF.S1I1IIIF2Q66F HCaGGo%FF	& nFMr   c                    d| z  }| j         | j        |d| z  z  }|dt          |           z   dz   z  }|d                    | j        dd| z  | j        rdndd	g          z  }| D ]~}|d
|z  z  }|j         |d|z  z  }|d|z  z  }|D ]U}|d|z  z  }|j        dk    r	|d|z  z  }n|d|z  z  }|j         |d|z  z  }|d|z  z  }|j        dk     r|dz  }|d|z  z  }V|dz  }|S )Nz
<h1>%(title)s</h1>

<p>
zICRC=<span class=crc>%(crc)s</span> SHA=<span class=crc>%(sha)s</span><br>z<small><em>z</em></small>r   z
<p>z#PASSED=%(passed)i FAILED=%(failed)iz1 <span class=warn_interrupted>INTERRUPTED!</span>z<p>

z<h2>z<span class=crc>%(crc)s</span> z %(name)s</h2>
%(comments)s
<ul>
z'<li class=%(result)s id="tst%(num)il">
r   z
<span id="tst%(num)i+" class="button%(result)s" onClick="show('tst%(num)i')" style="POSITION: absolute; VISIBILITY: hidden;">+%(num)03i+</span>
<span id="tst%(num)i-" class="button%(result)s" onClick="hide('tst%(num)i')">-%(num)03i-</span>
z
<span id="tst%(num)i+" class="button%(result)s" onClick="show('tst%(num)i')">+%(num)03i+</span>
<span id="tst%(num)i-" class="button%(result)s" onClick="hide('tst%(num)i')" style="POSITION: absolute; VISIBILITY: hidden;">-%(num)03i-</span>
z<span class=crc>%(crc)s</span>
z:%(name)s
<span class="comment %(result)s" id="tst%(num)i" z1 style="POSITION: absolute; VISIBILITY: hidden;" z0><br>%(comments)s
<pre>
%(output)s</pre></span>
z
</ul>

)r   r   r  r5   r   r   r   r  s       r   campaign_to_HTMLr    s    	F $):)F]`mmm
mn];;;oMMF
bgg"-=?L?X`;;^`   F !    &7"";"7'AAF7'AA 	 	ADqHHFx1}}   
     u <q@@WZ[[[Fx!||QQ   FF 	-Mr   c                    d}| D ]}|D ]}|D ]
}|d|z  z  }|dz  }||r|ndd}|rt           j                            |j                  }	t          j                            |	           t          j                            |	           |                    t          	                                           n,|                    t          
                                           ||z  }|S )Nam  
<html>
<head>
<title>%(title)s</title>
<h1>UTScapy tests</h1>

<span class=control_button onClick="hide_all('tst')">Shrink All</span>
<span class=control_button onClick="show_all('tst')">Expand All</span>
<span class=control_button onClick="show_passed('tst')">Expand Passed</span>
<span class=control_button onClick="show_failed('tst')">Expand Failed</span>

<p>
zO<span class=button%(result)s onClick="goto_id('tst%(num)il')">%(num)03i</span>
z</p>


<link rel="stylesheet" href="%(UTscapy_css)s" type="text/css">
<script language="JavaScript" src="%(UTscapy_js)s" type="text/javascript"></script>
</head>
<body>
%(data)s
</body></html>
UTScapy testsr   r   )r2   r3   r6   output_filerh   ry   rd   rz   r   ru   rx   )
runned_campaignsr   rY   r   r   r	  r   r-   out_dictr6   s
             r   pack_html_campaignsr    s    F * u u 	u 	uB u upstttu	u   F 'Juu?KKH 7'//-";<<!''000"((111557788883355666
hFMr   c                     d| z  }|t          |           z  }| D ]7}|d|z  z  }|D ]*}t          |j                  |_        |j        r|d|z  z  }+8|S )Nz
\chapter{%(title)s}
Run %%s on \date{%%s}
\begin{description}
\item[Passed:] %(passed)i
\item[Failed:] %(failed)i
\end{description}

%(headcomments)s

z"\section{%(name)s}

%(comments)s

zt\subsection{%(name)s}

Test result: \textbf{%(result)s}\newline

%(comments)s
\begin{alltt}
%(output)s
\end{alltt}

)r  r	   r   r   r  s       r   campaign_to_LATEXr    s    
 
F om,,,F   ;gEE 	 	A#AJ//AJx 
 	 	 		 Mr   c                 &    d}||r|ndd}||z  }|S )Nz
\documentclass{report}
\usepackage{alltt}
\usepackage{xcolor}
\usepackage{a4wide}
\usepackage{hyperref}

\title{%(title)s}

\begin{document}
\maketitle
\tableofcontents

%(data)s
\end{document}\n
r  r  r   )r  r   rY   r   r   r  s         r   pack_latex_campaignsr  <  s0    F" 'Juu?KKH
hFMr   c                  .    t          d           t          )Nap  Usage: UTscapy [-m module] [-f {text|ansi|HTML|LaTeX|xUnit|live}] [-o output_file]
               [-t testfile] [-T testfile] [-k keywords [-k ...]] [-K keywords [-K ...]]
               [-l] [-b] [-d|-D] [-F] [-q[q]] [-i] [-P preexecute_python_code]
               [-c configfile]
-t		: provide test files (can be used many times)
-T		: if -t is used with *, remove a specific file (can be used many times)
-l		: generate local .js and .css files
-F		: expand only failed tests
-b		: don't stop at the first failed campaign
-d		: dump campaign
-D		: dump campaign and stop
-R		: dump campaign as reStructuredText
-C		: don't calculate CRC and SHA
-c		: load a .utsc config file
-i		: drop into Python interpreter if test failed
-q		: quiet mode
-qq		: [silent mode]
-x		: use pyannotate
-n <testnum>	: only tests whose numbers are given (eg. 1,3-7,12)
-N		: force non root
-m <module>	: additional module to put in the namespace
-k <kw1>,<kw2>,...	: include only tests with one of those keywords (can be used many times)
-K <kw1>,<kw2>,...	: remove tests with one of those keywords (can be used many times)
-P <preexecute_python_code>
)r   
SystemExitr   r   r   usager  V  s!    	    2 r   c           
      t   	 t          |           }nY# t          $ rL}t          |                    d| j        d|d                     t          j        d           Y d }~nd }~ww xY w|r||_        |rt          |           t          ||           |D ]}t          ||           |D ]}t          ||           t          |           |r(t          |           |dk    rt          j                     |r"t          |           t          j                     ||_        t!          |||         |||	|          }|
r(|                                D ]}|rd|_        d|_        |t&          j        k    rt+          ||          }n|t&          j        k    rt/          ||          }n|t&          j        k    r%|                    |           t5          |          }nR|t&          j        k    rt9          |          }n2|t&          j        k    rt=          |          }n|t&          j        k    rd}||dk    |fS )	NzError while parsing 'z': ''r"   )rr  r   ro  r   r   r   ) r  r  r   ry  rR   r   exitr   r/  r5  rF  rH  rK  r  r  r  rv  r   r   r   r   r  r   r  r   r   r  r   r  r   r  r   )TESTFILE
OUTPUTFILEPREEXECNUMKW_OKKW_KODUMPDOCSFORMATVERB
ONLYFAILEDCRCINTERPRETERautorun_funcr   	pos_beginro  r	  exr  r   r-   r   s                          r   execute_campaignr  u  s   
+H55   III(---LMM	
 	
 	
 		  ( '  0 /// M3/// 8 8%mQ7777 : :'q9999-(((  m$$$!88HJJJ  m$$$


 !+M|F+U'	  F  ((** 	 	A  !-77	6;		!-77	6;		y)))!-00	6<		"=11	6<		"=11	6;		FaK-//s    
A(AA##A(c                     | d d          D ]O}d|v rI|                      |           |                     t          t          j        |                               P| S )Nr  )r   extendsortedglob)	TESTFILEStfiles     r   resolve_testfilesr    sc    111 7 7%<<U###VDIe$4$455666r   c                     t           j        dd          } t          j        d          }|                    t          j                               t          j        dt                     dd l	}t          t          d|j        dt           j                            d          d         z              t          j        }t           j        }d}d }d	}g }g }	d}
d}d
}d
}d	}d}d}i }g }g }d	}d	}	 t%          j        | d          }|d         D ]\  }}|dk    rt'                       |dk    rd	}$|dk    rd
}-|dk    r|dz  }9|dk    rd}
B|dk    rd}K|dk    rd}
T|dk    rd	}]|dk    rd
}f|dk    rd
}o|dk    r	|d|z   z  }~|dk    rE	 t                              |          }# t*          $ r}t%          j        d|z            d }~ww xY w|dk    r%|                    |           t1          |          }|dk    r|                    |           |dk    rKt5          ||          }|j        }|j        }|j        }|j        }
|j        }|j         }|j!        }|j"        }|j#        }|j$        rdnd}|j%        }|j&        }|'                    |j(                   |	'                    |j)                   	 t                              |j*                  }n)# t*          $ r}t%          j        d|z            d }~ww xY wt1          |          }t1          |j+                  D ]?}	 |                    |           # tX          $ r d |z  }t%          j        |          w xY wc|d!k    rt|}t[          j.        tZ          j/        0                    tZ          j/        1                    |                    tZ          j2                  st%          j        d"|z            |d#k    rd}|d$k    rg }d% |                    d&          D             D ]~}	 |                    tg          |                     &# tX          $ rL d' |                    d(d          D             \  }}|'                    ti          ||dz                        Y {w xY w|d)k    rd
}|d*k    r|                    |           |d+k    r*|'                    |                    d&                     |d,k    r(|	'                    |                    d&                     n.# t$          j        $ r}t          d-|           tj          d }~ww xY w|t          j6        t          j        fv rto                      } ntq                      } 	 |st[          j9                    dk    r5|	                    d.           |dk    rt          dtt          z   d/z              n# tv          $ r Y nw xY wtx          r|	                    d0           tz          j>        st~          r5|	                    d1           |dk    rt          dtt          z   d2z              |	                    d3           |rM	 dd4l@mA}! n# t          $ r t          d5          w xY w|!C                                 |!D                                 |dk    rt          dtt          z   d6z              	 dd7l	mE} nP# t          $ rC}"t          d8|"z             t          jH                     t          jI        d           Y d }"~"nd }"~"ww xY w|D ]b}#	 t          |#          }$t          jL        M                    |$jL                   7# t          $ r}"t%          j        d9|#d:|"          d }"~"ww xY wt          jN        |jO        t          j        |jP        t          jQ        |jR        t          jS        |jT        t          jU        |jO        t          j6        |jV        i}%|dk    rt          dtt          z   d;z              d}&d}'d }(t          |          dk    })t          jX        |          Y                                D ]}*d<|*v r||*         }+||*= t          j[        |*          D ]c},|+\                    d=tZ          j/        ]                    tZ          j/                            |,          d                   d                   }-|-||,<   dd}.g }/dd>l^m_}0  |0            }1t          |1           |D ]}2|dk    r-t          | a                    t          d?|2z  z                        |2|v r||2         n|}3t          |2          5 }t          |||3|||	|
|||||||%| |.t          jX        |1          @          \  }4}5}6d d d            n# 1 swxY w Y   |/                    |6           |6jd        }.|)r|6je        }(|&|4z  }&|5sd}'|r n|dk    rt          t          dAz              |r)|!g                                 |!h                    dB           |t          jQ        k    rt          |/|&||(          }&|t          jS        k    rt          |/|&||(          }&|t           j        k    rt          |&|C           n\t          |dD          5 }7|7k                    dE|7jl        v r|&m                    dFdG          n|&           d d d            n# 1 swxY w Y   |dk    rN|'dk    r#t          | a                    dH                     n%t          | n                    dI|'z                       |dk    r~t          jp                    dk    r/t          dJ           t          t          jq                               dd lr}8|8s                                }9|9rt          dK           t          |9           t           j        t                                 |'S )LNr"   rM   error)categoryr   z UTScapy - Scapy z - r  FTr!   r   z"o:t:T:c:f:hbln:m:k:K:DRdCiFqNP:s:xz-hz-bz-Fz-qz-Dr   z-Rz-dz-Cz-iz-xz-Pr  z-fzUnknown output format %sz-tz-Tz-cz Cannot remove %s from test filesz-ozCannot write to file %sz-lz-nc              3   >   K   | ]}|                                 V  d S r=   )r  )rm   rn   s     r   r9  zmain.<locals>.<genexpr>1  s*      ??!''))??????r   r  c                 ,    g | ]}t          |          S r   )int)rm   es     r   r2  zmain.<locals>.<listcomp>5  s    !B!B!BQ#a&&!B!B!Br   r   z-Nz-mz-kz-KzERROR:
needs_rootz Non-root modelittle_endian_onlynot_libpcapz libpcap modedisabled)collect_typeszPlease install pyannotate !z Booting scapy...)allz#[CRITICAL]: Cannot import Scapy: %szcannot import [z]: z Discovering tests files...r  z%name%)_scapy_builtinsz Loading: %s)r  ro  z* All campaigns executed. Writing output...pyannotate_results)filerb   brW   ignorezUTscapy ended successfullyz UTscapy ended with error code %sz
WARNING: UNFINISHED THREADSz
WARNING: UNFINISHED PROCESSES)ur   argvlogging	getLogger
addHandlerStreamHandlerwarningsfilterwarningsSyntaxWarningrM   r   r  __version__versionr  r   r   r   r  r  r   r   r  r   r  r   r   r   r   r   r   r   r   r   r   r   rY   r   r   r  r   r   r   r   r  r2   accessr3   r6   r4   W_OKr  r#   r  r   r   r   getuidr   r   r   r   use_pcapr   pyannotate_runtimer  ImportErrorinit_types_collectionstartr  r$   rH   	print_excr  rQ   builtinsr   r   r   $autorun_get_text_interactive_session$autorun_get_ansi_interactive_sessionr   $autorun_get_html_interactive_sessionr   %autorun_get_latex_interactive_sessionr   $autorun_get_live_interactive_sessionr  copykeysr  iglobr  splitext
scapy.mainr  ri  r  rc   r  r   r   	checkmarkstop
dump_statsr  r  rd   moderX   ry  	threadingactive_countrq  multiprocessingactive_childrenflush):r  loggerrM   r  r  LOCALr  NON_ROOTr  r  r  r  r  BREAKFAILEDr  r  GLOB_PREEXECPREEXEC_DICTMODULESr  ANNOTATIONS_MODEr  optsoptoptargmsgr   testfiler  r*   v1v2r   r  r  mmodr  glob_outputglob_result
glob_titleUNIQUEprexpycodegl_pycoder  r  r  ro  r  r  r   r   r   fr  	processess:                                                             r   mainr    s   8ABB<Dw''F
g+--... Gm<<<<LLL	$$3;,,S11!44     [FJE
CHEEDD
CKJDLLGIKW}T#GHH7 Q	0 Q	0KCd{{#!

	"#'  v-O#//77FF O O O ,-G#-MNNNO  (((-i88		  (((((66".!_
yyh#|#2!\
 N	!Z.Qh,TZ(((TZ(((O#//<<FF O O O ,-G#-MNNNO-i88	 1$2G H H : :H:!((2222% : : :"Dx"O$0999:: #
y1L1L!M!MrwWW U ,-F-STTTU??V\\#->->??? 6 6A6

3q66****% 6 6 6!B!B!''#q//!B!B!BB

5R!V#4#45555566 v&&&&V\\#..////V\\#..///cQ	0f    h &+v{+++ 	6ry{{a''LL&&&axxcEk$44555     +)***} 1 1]###!88#+/000	LL 	=8888888 	= 	= 	=;<<<	=++---axxcEk//000&&&&&&&   3a7888
  H H	H""C$$S\2222 	H 	H 	H$$AA%FGGG	H 	U?U?U?eAe@U?L axxcEk99:::KKJ^^q F 	,'',,.. + +$;;!$'FT"j&& + + ..273C3CBGMMRTDUDUVWDX3Y3YZ[3\]]#*R  I******!!I###   !88%++d^h%>>??@@@,4,D,D,x((,(^^ 	x'7*gsE5$j#{e#)I..( ( ($FFH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	)))$	 	(!Jv 	K axxDD	
 	
 	
  7  !5666 )*:KPZ[[*+;[%Q[\\
 SZk
+++++*d## 	7qGGaf}}  &&vx888*57 7 7	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7
 axx!%++:;;<<<<%))>LMMNNN axx!##a''1222)%''(((#3355	 	3444)J s  .B!T" F+*T" +
G5GGC.T"  K T"  
L*LL(T" /MT" $M))B2T" "P?>T" ?ART" RBT" "U1UUAW 
W$#W$#Y* *Z[ 
\$!9\\$,3]  
^	*^^	7ff	f	5kkk__main__T)recordr  z### Warning mode enabled ###r"   )r!   )r!   N)Fr!   N)FN)r   N)WrJ   r  r\   r  rm  r  r  r&  rP   r   r  r2   os.pathr   r  r&   rH   r  r!  scapy.constsr   r   scapy.configr   scapy.compatr   scapy.themesr   r   scapy.utilsr	   r   r   r  r  r   r.   r9   r;   rQ   rT   rh   r}   r   r   r   r   r   r   r  r  r  r"  r'  r/  r5  rB  rF  rH  rK  rR  r`  ri  rv  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r   warnoptionscatch_warningscwresetwarningssimplefilterr   r^  r  r   r   r   <module>r!     sT     



            				  



            , , , , , , , ,       % % % % % % 4 4 4 4 4 4 4 4 " " " " " "
	 	 	 =?? EDIIEDI
@ @ @ @ @ @ @ @# # #  
, 
, 
, 
, 
, 
, 
, 
, - - -* * * * * * * **.- .- .- .- .- .- .- .-f+ + + + + + + +    Y   ' ' ' ' ' ' ' '$# # # # #9 # # #L% % % % %i % % %(    y   8-8 -8 -8 -8d' ' 'T+ + +4) ) )8D D D> > >/ / /"/ / /O O O5 5 56 6 6O O O	/ 	/ 	/ 	/ 9:   F7 7 7 230 0 0 0j
 
 
(F F FX X X  (2 2 2  - - -`% % % %P  B   4  B 56#I0 I0 I0 I0X  U U Up z
 $X$D111 	R"H"$$$!H!'***E0111$&&C 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s   9G  G$'G$