
    ,h4X                     l   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Z	d dl
Z
d dlmZ d dlZd dlmZ d dlmZm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 d
dlmZ d dlZ  G d d      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d d      Z&d Z'd Z(d Z)d Z*d Z+d Z,d  Z-d! Z.y)"    N)ConfigParser)product)cast)Path)sdist)find_package_pathfind_parent_package)Distribution)PackageDiscoveryError   )quiet)get_sdist_membersget_wheel_membersrun)DALSc                       e Zd Zd Zd Zy)TestFindParentPackagec                     |dz  j                  dd       |dz  j                          |dz  j                          g d}t        |ddi|      d	k(  sJ y )
Nzsrc/namespace/pkg/nestedTexist_okparentsz$src/namespace/pkg/nested/__init__.pyzsrc/namespace/pkg/__init__.py)	namespacenamespace.pkgznamespace.pkg.nested srcr   mkdirtouchr	   )selftmp_pathpackagess      h/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/setuptools/tests/test_config_discovery.pytest_single_packagez)TestFindParentPackage.test_single_package   s_    	.	.55tT5R	:	:AAC	3	3::<I"8b%[(CVVV    c                     g d}|D ]2  }|d| z  j                  dd       |d| dz  j                          4 t        |ddi|      J y )N)pkgpkg1pkg2src/Tr   z/__init__.pyr   r   r   )r   r    multiplenames       r"   test_multiple_toplevelz,TestFindParentPackage.test_multiple_toplevel!   sk     + 	;D$tf%,,dD,I$tfL1188:	; #8b%[(CKKKr$   N)__name__
__module____qualname__r#   r,    r$   r"   r   r      s    WLr$   r   c                      e Zd ZdZddidgddddiiddgid	dgidd
dgii i i i d	ZddgddgddgdgdgdZd Zej                  j                  dej                               d        Zej                  j                  dej                               d        Z ed       ed       ed       ed      dZej                  j                  d eg d dd	gej                                     d!        Zej                  j                  d"d#gdhfd$gdd%hfd&gdd'hfd(gh d)fd*gdd+hfd,gdhfd-gdhfg      d.        Zej                  j                  d/d0gd1gg      d2        Zd3 Zd4 Zd5 Zy6)7 TestDiscoverPackagesAndPyModuleszMake sure discovered values for ``packages`` and ``py_modules`` work
    similarly to explicit configuration for the simple scenarios.
    r   r   r&   )package_dirr!   r3   libr!   
py_modulesnszns.pkg)	zexplicit-srczvariation-libzexplicit-flatzexplicit-single_modulezexplicit-namespacezautomatic-srczautomatic-flatzautomatic-single_modulezautomatic-namespacesrc/pkg/__init__.pyzsrc/pkg/main.pyzlib/pkg/__init__.pyzlib/pkg/main.pyzpkg/__init__.pyzpkg/main.pypkg.pyzns/pkg/__init__.py)r   r4   flatsingle_moduler   c                 p    |j                  d      \  }}}| j                  |   }| j                  |   }||fS )N-)	partitionFILESOPTIONS)r   circumstance_layoutfilesoptionss         r"   	_get_infoz*TestDiscoverPackagesAndPyModules._get_infoF   s>    #--c21f

6",,|,g~r$   r@   c                 ,  	 | j                  |      \  }}t        |||       t        ||      \  }}|j                  j                  D cg c]"  }|j                  t        j                  d      $ }}|D ]  	t        	fd|D              rJ  y c c}w )N/c              3   @   K   | ]  }|j                          y wN)endswith).0ffiles     r"   	<genexpr>zGTestDiscoverPackagesAndPyModules.test_sdist_filelist.<locals>.<genexpr>U   s     :Aqzz$':s   )	rE   _populate_project_dir_run_sdist_programaticallyfilelistrC   replaceossepany)
r   r    r@   rC   rD   rA   cmdrL   manifestrM   s
            @r"   test_sdist_filelistz4TestDiscoverPackagesAndPyModules.test_sdist_filelistL   s    5whw7+Hg>347LL4F4FGqAIIbffc*GG 	;D::::	; Hs   
'Bc                 h   | j                  |      \  }}t        |||       |dz  j                          |dz  j                          |dz  j                          |dz  j                          |dz  j                          |dz  j                          |dz  j                          |dz  j                          t	        |       t        t        |j                  d	                  }t        d
       t        dj                  |             |t        |      k\  sJ t        t        |j                  d                  }t        d       t        dj                  |             |D ch c]$  }|j                  dd      j                  dd      & }}||k\  sJ |D ]  }	d|vsJ d|vrJ  y c c}w )Nbuildz	build/libzbuild/bdist.linux-x86_64z build/bdist.linux-x86_64/file.pyzbuild/lib/__init__.pyzbuild/lib/file.pydistzdist/file.pydist/*.tar.gz~~~~~ sdist_members ~~~~~

dist/*.whl~~~~~ wheel_members ~~~~~r)   r   lib/)rE   rO   r   r   
_run_buildr   nextglobprintjoinsetr   rR   )
r   r    r@   rC   rD   sdist_fileswheel_filesrL   
orig_filesrM   s
             r"   test_projectz-TestDiscoverPackagesAndPyModules.test_projectW   s   5whw7 
G	""$	K	&&(	.	.557	6	6==?	+	+224	'	'..0	F	!!#	N	"))+8'X]]?-K(LM)*dii$%c%j(('X]]<-H(IJ)*dii$%INOAaii+33FB?O
Oj((   	'D%''&&	'	 Ps   ))F/z
            [metadata]
            name = myproj
            version = 0.0.0

            [options]
            {param} =
            z
            __import__('setuptools').setup(
                name="myproj",
                version="0.0.0",
                {param}=[]
            )
            z
            [build-system]
            requires = []
            build-backend = 'setuptools.build_meta'

            [project]
            name = "myproj"
            version = "0.0.0"

            [tool.setuptools]
            {param} = []
            zv
            [build-system]
            requires = []
            build-backend = 'setuptools.build_meta'
            )	setup.cfgsetup.pypyproject.tomltemplate-pyproject.toml)config_fileparamr@   )rl   rm   rn   c                    | j                   |   g dz   }t        ||i        |dk(  r|j                  dd      }n'| j                  d   }|dz  j	                  |d       |}| j                  |   j                  |      }||z  j	                  |d       t        |i       }	t        |	|      g k(  sJ d	d
d|   }
t        |	|
      J y )N)zmod.pyzother.pyr7   rn   rA   r<   ro   utf-8encoding)rq   r!   r5   )r5   r!   )r>   rO   rR   PURPOSEFULLY_EMPY
write_textformat	_get_distgetattr)r   r    rp   rq   r@   rC   template_param	pyprojectconfigr[   others              r"   test_purposefully_emptyz8TestDiscoverPackagesAndPyModules.test_purposefully_empty   s     

<(+XXhr2**"]]34N ../HII((44Y4Q"N''4;;.;Q	K	++FW+E2& tU#r)))|DUKtU#+++r$   )extra_filespkgszvenv/bin/simulate_venvzpkg-stubs/__init__.pyiz	pkg-stubszother-stubs/__init__.pyizother-stubsz namespace-stubs/pkg/__init__.pyi>   namespace-stubs.pkgr&   namespace-stubsz&namespace-stubs/pkg-stubs/__init__.pyir   z_hidden/file.pyznews/finalize.pyc                     | j                   d   |z   }t        ||i        t        |i       }t        |j                        |k(  sJ y )Nr9   )r>   rO   ry   rg   r!   )r   r    r   r   rC   r[   s         r"   !test_flat_layout_with_extra_fileszBTestDiscoverPackagesAndPyModules.test_flat_layout_with_extra_files   sF    * 

6"[0hr22&4==!T)))r$   r   zother/__init__.pyzother/finalize.pyc                     | j                   d   |z   }t        ||i        t        j                  t        d      5  t        |i        d d d        y # 1 sw Y   y xY w)Nr9   multiple (packages|modules)matchr>   rO   pytestraisesr   ry   )r   r    r   rC   s       r"   +test_flat_layout_with_dangerous_extra_fileszLTestDiscoverPackagesAndPyModules.test_flat_layout_with_dangerous_extra_files   sR     

6"[0hr2]]08UV 	$h#	$ 	$ 	$s   AAc                     | j                   d   dgz   }t        ||i        t        |i       }t        |j                        dhk(  sJ y )Nr:   zinvalid-module-name.pyr&   )r>   rO   ry   rg   r5   )r   r    rC   r[   s       r"   #test_flat_layout_with_single_modulezDTestDiscoverPackagesAndPyModules.test_flat_layout_with_single_module   sJ    

?+/G.HHhr22&4??#w...r$   c                     | j                   d   dgz   }t        ||i        t        j                  t        d      5  t        |i        d d d        y # 1 sw Y   y xY w)Nr:   zvalid_module_name.pyr   r   r   )r   r    rC   s      r"   &test_flat_layout_with_multiple_moduleszGTestDiscoverPackagesAndPyModules.test_flat_layout_with_multiple_modules   sT    

?+/E.FFhr2]]08UV 	$h#	$ 	$ 	$s   AAc                 p   ddl m} d}|dz  j                  t        |      d       |dz  j	                          t
        j                  j                         j                  |      5  |j                  d       d	d	d	       t        t        |j                  d
                  }d|v sJ y	# 1 sw Y   3xY w)zRegression for issue 3692r   )
build_metaz%[project]
name = "test"
version = "1"rn   rs   rt   zfoo.py.Nz*.whl)
setuptoolsr   rw   r   r   jaracopathDirectoryStackcontextbuild_wheelr   rc   rd   )r   r    r   r|   ri   s        r"   %test_py_modules_when_wheel_dir_is_cwdzFTestDiscoverPackagesAndPyModules.test_py_modules_when_wheel_dir_is_cwd   s    )=		$	$00i70S	H	##%[['')11(; 	(""3'	( (X]]7-C(DE;&&&		( 	(s   (B,,B5N)r-   r.   r/   __doc__r?   r>   rE   r   markparametrizekeysrX   rk   r   rv   r   r   r   r   r   r   r   r0   r$   r"   r2   r2   +   sM    *,U%IB;
 %ug.#/%"9)D(+;<#%!G &'89%'89"M2"*+E [[^W\\^<; =; [[^W\\^<' ='B 	
 
 
 $($
E)V [[07&JJL	
,,, [[&'%1&'%)=>()E=+AB 44A ::)*
   5'* !E7+	
(*)(* [[ ! !	
$$/$'r$   r2   c                       e Zd ZdZdgdgddgddgdgd	gd
Zej                  j                  dej                               d        Z	d Z
y)TestNoConfigz0.0.0zsrc/pkg1.pyzsrc/pkg2/__init__.pyzsrc/pkg3/__init__.pyzsrc/pkg3-stubs/__init__.pyzpkg4/__init__.pyzpkg4-stubs/__init__.pyzsrc/ns/nested/pkg1/__init__.pyzns/nested/pkg2/__init__.py)r'   r(   pkg3pkg4zns.nested.pkg1zns.nested.pkg2examplec                 z    t        || j                  |   i        t        |i       }|j                         |k(  sJ y rI   )rO   EXAMPLESry   get_name)r   r    r   r[   s       r"   test_discover_namezTestNoConfig.test_discover_name  s7    hg(>C2&}}')))r$   c                     dg}t        ||i        t        |d       |d| j                   dz  }|j                         sJ y )Nzsrc/ns/nested/pkg/__init__.py--sdistzdist/ns_nested_pkg-z.tar.gz)rO   rb   DEFAULT_VERSIONis_file)r   r    rC   	dist_files       r"   test_build_with_discovered_namez,TestNoConfig.test_build_with_discovered_name  sM    01hr28Y'!4T5I5I4J'RR	  """r$   N)r-   r.   r/   r   r   r   r   r   r   r   r   r0   r$   r"   r   r     si    O '(')EF#%=>;<78H [[Y8* 9*
#r$   r   c                   l    e Zd Zej                  j                  ddi fddddidfg      d        Zd Zy	)
TestWithAttrDirective)folderoptsr   r4   zfind:where)r!   packages.findc                 *   | ddg}t        |||       |dz  j                  d      }|dddiidd|z   i}t        j                  j	                  ||	       t        |i       }|j                         dk(  sJ |j                         d
k(  sJ |j                  sJ t        d|j                  |      }t        j                  j                  |      sJ |t        |      j                         v sJ t        |d       |dz  }	|	j                         sJ y )Nz/pkg/__init__.pyrl   rs   rt   r&   __init__.pyversion = 42z'[metadata]
version = attr: pkg.version
prefix42r   zdist/pkg-42.tar.gz)rO   	read_textr   r   rZ   ry   r   get_versionr3   r   rS   existsr   partsrb   r   )
r   r    r   r   rC   r}   	overwriter[   package_pathr   s
             r"   test_setupcfg_metadataz,TestWithAttrDirective.test_setupcfg_metadata  s    8+,k:ht4[(33W3EU]N;<DvM
	 	)H52&}}%''!T))(0@0@(Kww~~l++l+113338Y'33	  """r$   c                     t        |dgi        dddiidd}t        j                  j                  ||       t	        |i       }|j                         dk(  sJ |j                  d	d
ik(  sJ y )Nr7   r&   r   r   zh[project]
name = 'pkg'
dynamic = ['version']
[tool.setuptools.dynamic]
version = {attr = 'pkg.version'}
r   rn   r   r   r   r   )rO   r   r   rZ   ry   r   r3   )r   r    r   r[   s       r"   test_pyproject_metadataz-TestWithAttrDirective.test_pyproject_metadata<  s    h)>(?D M>:;P
	 	)H52&!T))B;...r$   N)r-   r.   r/   r   r   r   r   r   r0   r$   r"   r   r     sI    [[BKGU;KLM	
##./r$   r   c                       e Zd Zd Zd Zd Zy)TestWithCExtensionc                 h    g d}t        ||i        d}|dz  j                  t        |      d       y )N)zbenchmarks/file.pyzdocs/Makefilezdocs/requirements.txtzdocs/source/conf.pyzproj/header.hzproj/file.pyzpy/proj.cppzpy/other.cppz
py/file.pyzpy/py.typedzpy/tests/test_proj.pyz
README.rsta^  
            from setuptools import Extension, setup

            ext_modules = [
                Extension(
                    "proj",
                    ["py/proj.cpp", "py/other.cpp"],
                    include_dirs=["."],
                    language="c++",
                ),
            ]
            setup(ext_modules=ext_modules)
        rm   rs   rt   rO   rw   r   )r   r    rC   setup_scripts       r"    _simulate_package_with_extensionz3TestWithCExtension._simulate_package_with_extensionN  s=    
 	hr2 
J	**4+=*Pr$   c                    | j                  |       d}|dz  j                  t        |      d       d}|dz  j                  t        |      d       t        |i       }|j	                         dk(  sJ |j                         dk(  sJ |j                  J |j                  J t        |j                        d
k(  sJ |j                  d   j                  dk(  sJ y	)zEnsure that auto-discovery is not triggered when the project is based on
        C-extensions only, for backward compatibility.
        zr
            [build-system]
            requires = []
            build-backend = 'setuptools.build_meta'
        rn   rs   rt   zQ
            [metadata]
            name = proj
            version = 42
        rl   projr   Nr   r   )r   rw   r   ry   r   r   r5   r!   lenext_modulesr+   )r   r    r|   setupcfgr[   s        r"   *test_skip_discovery_with_setupcfg_metadataz=TestWithCExtension.test_skip_discovery_with_setupcfg_metadatao  s     	--h7	
 
$	$00i70S
 
K	++DNW+M2&}}&((!T))&&}}$$4##$))"''6111r$   c                     | j                  |       d}|dz  j                  t        |      d       t        j                  t
        d      5  t        |i        ddd       y# 1 sw Y   yxY w)a  When opting-in to pyproject.toml metadata, auto-discovery will be active if
        the package lists C-extensions, but does not configure py-modules or packages.

        This way we ensure users with complex package layouts that would lead to the
        discovery of multiple top-level modules/packages see errors and are forced to
        explicitly set ``packages`` or ``py-modules``.
        zT
            [project]
            name = 'proj'
            version = '42'
        rn   rs   rt   r   r   N)r   rw   r   r   r   r   ry   )r   r    r|   s      r"   0test_dont_skip_discovery_with_pyproject_metadatazCTestWithCExtension.test_dont_skip_discovery_with_pyproject_metadata  sg     	--h7	
 
$	$00i70S]]08UV 	$h#	$ 	$ 	$s   A$$A-N)r-   r.   r/   r   r   r   r0   r$   r"   r   r   M  s    QB28$r$   r   c                   
   e Zd Zd ZdZdZdZej                  j                  ddd e
e      ifdd e
e      ifd	d e
e      ifd	d e
e      ifd	d e
e       e
d
      z   ifd	d e
e       e
d      z   ifg      d        Zy)TestWithPackageDatac                 |    | d| d| dg}t        ||i        d}|dz  j                  t        |      d       y )Nz/proj/__init__.py/proj/file1.txt/proj/nested/file2.txtz/
            global-include *.py *.txt
        zMANIFEST.inrs   rt   r   )r   r    src_rootrC   rW   s        r"   !_simulate_package_with_data_filesz5TestWithPackageData._simulate_package_with_data_files  s\    j)*j(j./

 	hr2 
M	!--d8nw-Or$   zd
    [metadata]
    name = proj
    version = 42

    [options]
    include_package_data = True
    z8
    [project]
    name = "proj"
    version = "42"
    z:
    [tool.setuptools]
    package-dir = {"" = "src"}
    )r   rC   r   rl   rn   r   z
                        packages = find:
                        package_dir =
                            =src

                        [options.packages.find]
                        where = src
                        zv
                        [tool.setuptools]
                        package-dir = {"" = "src"}
                        c                 6   t         j                  j                  |t        |             | j	                  ||       t
        j                  j                  | d      j                  t
        j                  d      t
        j                  j                  | d      j                  t
        j                  d      h}t        |       t        t        |j                  d                  }t        d       t        dj                  |             ||k\  sJ t        t        |j                  d                  }t        d	       t        dj                  |             |D ch c]$  }|j                  d
d      j                  dd      & }}||k\  sJ yc c}w )zq
        Make sure auto-discovery does not affect package include_package_data.
        See issue #3196.
        r   r   rG   r   r\   r]   r^   r_   r`   r)   r   ra   N)r   r   rZ   strr   rS   normpathrR   rT   rb   r   rc   rd   re   rf   r   )	r   r    r   rC   expectedrh   ri   rL   rj   s	            r"   test_include_package_dataz-TestWithPackageData.test_include_package_data  sG   T 	%H6..xB GGz9:BB2663OGGz)?@AII"&&RUV

 	8'X]]?-K(LM)*dii$%h&&'X]]<-H(IJ)*dii$%IQRAaii+33FB?R
Rj((( Ss   #)FN)r-   r.   r/   r   EXAMPLE_SETUPCFGEXAMPLE_PYPROJECTPYPROJECT_PACKAGE_DIRr   r   r   r   r   r0   r$   r"   r   r     s    P
 [[;%5 678#T*;%<=>[$'7"89:%t,='>?@&6!7	
"" $d+<&='+!	
$J)K$J)r$   r   c                     g d}t        | |i        t        i       }t               |_        |j	                          |j
                  J |j                  J y )N)zdir1/__init__.pyzdir2/__init__.pyzfile.py)rO   r
   objectconfigurationset_defaultsr5   r!   )r    rC   r[   s      r"   (test_compatible_with_numpy_configurationr      sT    E
 (E2.DD??""==   r$   c                     t         j                  j                  ddi       t        i       }dg|_        |j                          |j                          |j                         dk(  sJ y )Nr8   r   z--namer&   )r   r   rZ   r
   script_argsr   parse_command_liner   )
tmpdir_cwdr[   s     r"   $test_name_discovery_doesnt_break_clir     sX    
KKxn%D zD==?e###r$   c                 r   dddiit        d      d}t        j                  j                  |       t	        i       j
                  j                  fd}|j                  j
                  d|       j                          j                         dk(  sJ t        j                        dhk(  sJ y	)
a
  According to #3545 it seems that ``name`` discovery is running,
    even when the project already explicitly sets it.
    This seems to be related to parsing of dynamic versions (via ``attr`` directive),
    which requires the auto-discovery of ``package_dir``.
    r&   r   z__version__ = 42
z
            [project]
            name = "myproj"  # purposefully different from package name
            dynamic = ["version"]
            [tool.setuptools.dynamic]
            version = {"attr" = "pkg.__version__"}
            r   c                  >              j                         dk(  sJ y )Nmyproj)r   )r[   orig_analyse_names   r"   spy_analyse_namezJtest_preserve_explicit_name_with_dynamic_version.<locals>.spy_analyse_name/  s     	}}(***r$   analyse_namer   N)r   r   r   rZ   r
   r   r   setattrparse_config_filesr   rg   r!   )r   monkeypatchrC   r   r[   r   s       @@r"   0test_preserve_explicit_name_with_dynamic_versionr     s     M#78
 
	E KKeD))66+ ))>;KL%%t}}%(((r$   c                      dddd}t         j                  j                  |        t         |        fd|D        }|D ]/  }|j                  j                  dd       |j                          1 y )	Nz$import setuptools
setuptools.setup()z# Example PackagezCopyright (c) 2018)rm   z	README.mdLICENSEr   c              3   (   K   | ]	  }|z    y wrI   r0   )rK   rL   roots     r"   rN   z(_populate_project_dir.<locals>.<genexpr>F  s     %!TAX%s   Tr   )r   r   rZ   _write_setupcfgparentr   r   )r   rC   rD   basicpathsr   s   `     r"   rO   rO   ;  sq    
 <('E
 KKeD)D'"%u%E 46

r$   c                    |st        d       y t               }|j                  d       |j                         D ]  \  }}|dk(  r,|j                  d|        |d|    j	                  |       7t        |t              rdj                  |      |d   |<   _t        |t              r2dj                  d |j                         D              }d|z   |d   |<   t        |      |d   |<    t        | dz  d	d
      5 }|j                  |       d d d        t        d       t        | dz  j                  d
             y # 1 sw Y   3xY w)Nz~~~~~ **NO** setup.cfg ~~~~~rD   r   zoptions.z, r^   c              3   2   K   | ]  \  }}d | d|   yw)	z = Nr0   )rK   kvs      r"   rN   z"_write_setupcfg.<locals>.<genexpr>Y  s      !KTQBqcQC.!Ks   rl   wrs   rt   z~~~~~ setup.cfg ~~~~~)re   r   add_sectionitemsupdate
isinstancelistrf   dictr   openwriter   )r   rD   r   keyvalue	str_valuerL   s          r"   r   r   L  s=   ,-~H#mmo 
2
U/!  8C5!12xu%&--e4t$'+yy'7HY$t$		!KU[[]!KKI'+i'7HY$'*5zHY$
2 
d[ #	8 Aq	
!"	4+
(
('
(
:; s   ?EEc                 b    t         j                  dddg|t        |       }t        |ddi      S )Nz-mrZ   z--no-isolationDISTUTILS_DEBUGr   )env)sys
executabler   r   )r   flagsrV   s      r"   rb   rb   c  s6    >>4*:
NU
NCI
NCs*B/00r$   c           	         dj                  t        j                  j                  |             }| dz  }|j	                         rEt        |       5  t        t        t        j                  j                  di d            }d d d        nt        |      }|_        d|_        t        |       5  |j                          d d d        |j                          |S # 1 sw Y   MxY w# 1 sw Y   'xY w)NrG   rm   init)
stop_after)rf   rS   r   splitr   r   r   r
   	distutilscore	run_setupr   script_namer   r   )	dist_pathattrsr   scriptr[   s        r"   ry   ry   h  s    88BGGMM),-D#F}})_ 	((RF(KD	 	 E"DM!D	i "!" 	K	 	" "s   1C-C$C!$C-c                 X   t        | |      }t        |      }|j                          |j                  j                  s|j                  j
                  sJ t               5  t        |       5  |j                          d d d        d d d        ||fS # 1 sw Y   xY w# 1 sw Y   ||fS xY wrI   )	ry   r   ensure_finalizeddistributionr!   r5   r   r   r   )r  r  r[   rV   s       r"   rP   rP   ~  s    Y&D
+C$$(8(8(C(CC	 $y/ 	  9   9s$    B,B=BB	BB))/rS   r  configparserr   	itertoolsr   typingr   jaraco.pathr   r   r   r   r   setuptools.command.sdistr   setuptools.discoveryr   r	   setuptools.distr
   setuptools.errorsr   contextsr   integration.helpersr   r   r   textwrapr   distutils.corer  r   r2   r   r   r   r   r   r   r   rO   r   rb   ry   rP   r0   r$   r"   <module>r/     s    	 
 %       * G ( 3  J J  L L&T' T'n# #6-/ -/`O$ O$d^) ^)B!$!)H"<.1
,	r$   