3 ”Re«nã@s,ddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddlmZddlmZddlmZddlmZddlmZmZdd lmZmZmZmZmZdd l m!Z"dd l#m$Z%dd l&m'Z'dd l(m)Z)ddl*m+Z+m,Z,m-Z-m.Z.ddl/m0Z0m1Z1m2Z2m3Z3ddl4m5Z5m6Z6ddl7m8Z8m9Z9e�r`ddlm:Z;n ddlm;Z;e5�rÌddlZ>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHddlImJZJeFeKeKeKfZLeGdƒZMdddddddddd d!d"d#d$gZNejOePƒZQd%d&„ZRd'd(„ZSd)d"„ZTd*d „ZUed+d,d-�dšd/d„ƒZVd0d1„ZWd2d3„ZXd4d„ZYd›d6d„ZZd7d8„Z[d9d:„Z\d;d„Z]dd?„Z_d@d„Z`dAdB„ZadCd„ZbejcfdDdE„ZddœdGd„ZedHd„ZfdId„ZgdJdK„ZhdLdM„ZidNdO„ZjdPdQ„ZkdRdS„ZldTdU„ZmdFe2dFd.d.dfdVdW„ZndXdY„ZodZd[„Zpd\d]„Zqd^d_„Zrd`da„ZsGdbdc„dcetƒZuGddde„dee;ƒZvejwdfdg„ƒZxdhd!„Zydidj„Zzd�dkd#„Z{dldm„Z|dndo„Z}dpdq„Z~dždsdt„Zdudv„Z€dwdx„Z�dydz„Z‚d{d|„Zƒd}d~„Z„dd€„Z…d�d‚„Z†dƒd$„Z‡d„d…„ZˆGd†d‡„d‡etƒZ‰dˆd‰„ZŠdŠd‹„Z‹dŒd�„ZŒdŽd�„Z�d d’d“„ZŽd”d•„Z�d–d—„Z�d˜d™„Z‘dS)¡é)Úabsolute_importN)Údeque)Útee)Ú pkg_resources)Úcanonicalize_name)Úretry)ÚPY2Ú text_type)ÚfilterÚ filterfalseÚinputÚmapÚ zip_longest)Úparse)Úunquote)Ú __version__)Ú CommandError)Údistutils_schemeÚget_major_minor_versionÚ site_packagesÚ user_site)ÚWINDOWSÚ expanduserÚ stdlib_pkgsÚstr_to_display)ÚMYPY_CHECK_RUNNINGÚcast)Úrunning_under_virtualenvÚvirtualenv_no_global)ÚBytesIO)ÚStringIO) ÚAnyÚAnyStrÚCallableÚ ContainerÚIterableÚIteratorÚListÚOptionalÚTextÚTupleÚTypeVarÚUnion)Ú DistributionÚTÚrmtreeÚ display_pathÚ backup_dirÚaskÚsplitextÚ format_sizeÚis_installable_dirÚnormalize_pathÚrenamesÚget_progÚcaptured_stdoutÚ ensure_dirÚget_installed_versionÚremove_auth_from_urlcCs4tjjtjjtƒddƒ}tjj|ƒ}djt|tƒƒS)Nz..zpip {} from {} (python {})) ÚosÚpathÚjoinÚdirnameÚ__file__ÚabspathÚformatrr)Ú pip_pkg_dir©rEú‡/builddir/build/BUILDROOT/alt-python36-pip-20.2.4-5.el8.x86_64/opt/alt/python36/lib/python3.6/site-packages/pip/_internal/utils/misc.pyÚget_pip_versionOs rGcCsDt|ƒdkr"|dt|ƒd7}nt|ƒdkr:|dd…}td|ƒS)ax Convert a tuple of ints representing a Python version to one of length three. :param py_version_info: a tuple of ints representing a Python version, or None to specify no version. The tuple can have any length. :return: a tuple of length three if `py_version_info` is non-None. Otherwise, return `py_version_info` unchanged (i.e. None). érNÚ VersionInfo)r)Úlenr)Úpy_version_inforErErFÚnormalize_version_info[s   rLcCsPytj|ƒWn<tk rJ}z |jtjkr:|jtjkr:‚WYdd}~XnXdS)z os.path.makedirs without EEXIST.N)r=ÚmakedirsÚOSErrorÚerrnoÚEEXISTÚ ENOTEMPTY)r>ÚerErErFr:os c CsNy.tjjtjdƒ}|dkr(djtjƒS|SWnttt fk rHYnXdS)Nrú __main__.pyú-cz {} -m pipÚpip)rSrT) r=r>ÚbasenameÚsysÚargvrCÚ executableÚAttributeErrorÚ TypeErrorÚ IndexError)ÚprogrErErFr8zs i¸ iô)Ústop_max_delayÚ wait_fixedFcCstj||td�dS)N)Ú ignore_errorsÚonerror)Úshutilr/Úrmtree_errorhandler)Údirr`rErErFr/ˆsc CsVytj|ƒjtj@ }Wnttfk r0dSX|rPtj|tjƒ||ƒdS‚dS)zÑOn Windows, the files in .svn are read-only, so when rmtree() tries to remove them, an exception is thrown. We catch that here, remove the read-only attribute, and hopefully continue without problems.N)r=ÚstatÚst_modeÚS_IWRITEÚIOErrorrNÚchmod)Úfuncr>Úexc_infoÚhas_attr_readonlyrErErFrc�srcc Csd|dkr dSt|tƒr|Sy|jtjƒdƒ}Wn0tk r^trRtdj|ƒƒ}nt |ƒ}YnX|S)zû Convert a bytes (or text) path to text (unicode in Python 2) for display and logging purposes. This function should never error out. Also, this function is mainly needed for Python 2 since in Python 3 str paths are already text. NÚstrictzb{!r}) Ú isinstancer ÚdecoderWÚgetfilesystemencodingÚUnicodeDecodeErrorrrrCÚascii)r>r0rErErFÚpath_to_display£s  rscCsttjjtjj|ƒƒ}tjddkrB|jtjƒdƒ}|jtj ƒdƒ}|j tj ƒtjj ƒrpd|t tj ƒƒd…}|S)zTGives the display value for a given path, making it relative to cwd if possible.réÚreplaceÚ.N)r=r>ÚnormcaserBrWÚ version_infororpÚencodeÚgetdefaultencodingÚ startswithÚgetcwdÚseprJ)r>rErErFr0Åsú.bakcCs:d}|}x(tjj||ƒr0|d7}|t|ƒ}q W||S)z\Figure out the name of a directory to back up the given dir to (adding .bak, .bak2, etc)é)r=r>ÚexistsÚstr)rdÚextÚnÚ extensionrErErFr1Òs cCs2x&tjjddƒjƒD]}||kr|SqWt||ƒS)NÚPIP_EXISTS_ACTIONÚ)r=ÚenvironÚgetÚsplitr2)ÚmessageÚoptionsÚactionrErErFÚask_path_existsÞsr�cCstjjdƒrtdj|ƒƒ‚dS)z&Raise an error if no input is allowed.Ú PIP_NO_INPUTz7No input was expected ($PIP_NO_INPUT set); question: {}N)r=r‡rˆÚ ExceptionrC)rŠrErErFÚ_check_no_inputæs r�cCsJxDt|ƒt|ƒ}|jƒjƒ}||kr>tdj|dj|ƒƒƒq|SqWdS)z@Ask the message interactively, with the given possible responsesz>Your response ({!r}) was not one of the expected responses: {}z, N)r�r ÚstripÚlowerÚprintrCr?)rŠr‹ÚresponserErErFr2ðs cCst|ƒt|ƒS)zAsk for input interactively.)r�r )rŠrErErFÚ ask_inputsr•cCst|ƒtj|ƒS)z!Ask for a password interactively.)r�Úgetpass)rŠrErErFÚ ask_passwordsr—cCs\|dkrdj|ddƒS|d kr4djt|dƒƒS|dkrJdj|dƒSdjt|ƒƒSdS) Nièz {:.1f} MBg@�@é z{} kBz {:.1f} kBz{} bytesi@Bi')rCÚint)ÚbytesrErErFr4scs@dd„|Dƒ}dd„t|ddiŽDƒ‰‡fdd„|Dƒ}|ˆfS)z¸Return a list of formatted rows and a list of column sizes. For example:: >>> tabulate([['foobar', 2000], [0xdeadbeef]]) (['foobar 2000', '3735928559'], [10, 4]) cSsg|]}ttt|ƒƒ‘qSrE)Útupler r�)Ú.0ÚrowrErErFú #sztabulate..cSsg|]}ttt|ƒƒ‘qSrE)Úmaxr rJ)rœÚcolrErErFrž$sÚ fillvaluer†cs$g|]}djttj|ˆƒƒjƒ‘qS)ú )r?r r�ÚljustÚrstrip)rœr�)ÚsizesrErFrž%s)r)ÚrowsÚtablerE)r¥rFÚtabulates r¨cCsPtjj|ƒsdStjj|dƒ}tjj|ƒr.dStjj|dƒ}tjj|ƒrLdSdS)zBIs path is a directory containing setup.py or pyproject.toml? Fzsetup.pyTzpyproject.toml)r=r>Úisdirr?Úisfile)r>Úsetup_pyÚpyproject_tomlrErErFr5)s   ccs x|j|ƒ}|sP|VqWdS)z7Yield pieces of data from a file-like object until EOF.N)Úread)ÚfileÚsizeÚchunkrErErFÚ read_chunks8s  r±TcCs2t|ƒ}|rtjj|ƒ}n tjj|ƒ}tjj|ƒS)zN Convert a path to its canonical, case-normalized, absolute version. )rr=r>ÚrealpathrBrw)r>Úresolve_symlinksrErErFr6As  cCs@tj|ƒ\}}|jƒjdƒr8|dd…|}|dd…}||fS)z,Like os.path.splitext, but take off .tar tooz.taréNéüÿÿÿrµ)Ú posixpathr3r’Úendswith)r>Úbaser‚rErErFr3Os  c Cs|tjj|ƒ\}}|r0|r0tjj|ƒ r0tj|ƒtj||ƒtjj|ƒ\}}|rx|rxytj|ƒWntk rvYnXdS)z7Like os.renames(), but handles renaming across devices.N) r=r>r‰r€rMrbÚmoveÚ removedirsrN)ÚoldÚnewÚheadÚtailrErErFr7Ys  cCstƒs dS|jttjƒƒS)zü Return True if path is within sys.prefix, if we're running in a virtualenv. If we're not in a virtualenv, all paths are considered "local." Caution: this function assumes the head of path has been normalized with normalize_path. T)rr{r6rWÚprefix)r>rErErFÚis_localks rÀcCs tt|ƒƒS)z� Return True if given Distribution object is installed locally (i.e. within current virtualenv). Always True if we're not in a virtualenv. )rÀÚ dist_location)ÚdistrErErFÚ dist_is_localzs rÃcCst|ƒjttƒƒS)zF Return True if given Distribution is installed in user site. )rÁr{r6r)rÂrErErFÚdist_in_usersite†srÄcCst|ƒjttƒƒS)z[ Return True if given Distribution is installed in sysconfig.get_python_lib(). )rÁr{r6r)rÂrErErFÚdist_in_site_packagesŽsrÅcCs,tt|ƒƒ}|jttdƒdjdƒdƒƒS)zf Return True if given Distribution is installed in path matching distutils_scheme layout. r†ÚpurelibÚpythonr)r6rÁr{rr‰)rÂÚ norm_pathrErErFÚdist_in_install_path—s rÉcCs8x2tjD](}tjj||jdƒ}tjj|ƒrdSqWdS)zC Return True if given Distribution is an editable install. z .egg-linkTF)rWr>r=r?Ú project_namerª)rÂÚ path_itemÚegg_linkrErErFÚdist_is_editable¡s   rÍcs€|rtj|ƒ}ntj}|r t‰ndd„‰|r6dd„‰ndd„‰|rLdd„‰ndd„‰|r^t‰nd d „‰‡‡‡‡‡fd d „|DƒS) a^ Return a list of installed Distribution objects. If ``local_only`` is True (default), only return installations local to the current virtualenv, if in a virtualenv. ``skip`` argument is an iterable of lower-case project names to ignore; defaults to stdlib_pkgs If ``include_editables`` is False, don't report editables. If ``editables_only`` is True , only report editables. If ``user_only`` is True , only report installations in the user site directory. If ``paths`` is set, only report the distributions present at the specified list of locations. cSsdS)NTrE)ÚdrErErFÚ local_testÑsz/get_installed_distributions..local_testcSsdS)NTrE)rÎrErErFÚ editable_testÕsz2get_installed_distributions..editable_testcSs t|ƒ S)N)rÍ)rÎrErErFrÐØscSst|ƒS)N)rÍ)rÎrErErFÚeditables_only_testÜsz8get_installed_distributions..editables_only_testcSsdS)NTrE)rÎrErErFrÑßscSsdS)NTrE)rÎrErErFÚ user_teståsz.get_installed_distributions..user_testcs:g|]2}ˆ|ƒr|jˆkrˆ|ƒrˆ|ƒrˆ|ƒr|‘qSrE)Úkey)rœrÎ)rÐrÑrÏÚskiprÒrErFržès  z/get_installed_distributions..)rÚ WorkingSetÚ working_setrÃrÄ)Ú local_onlyrÔÚinclude_editablesÚeditables_onlyÚ user_onlyÚpathsrÖrE)rÐrÑrÏrÔrÒrFÚget_installed_distributions­s    rÜcCs4t|ƒ}tdfddddd�}dd„|Dƒ}|j|ƒS)zÓFind a distribution matching the ``req_name`` in the environment. This searches from *all* distributions available in the environment, to match the behavior of ``pkg_resources.get_distribution()``. FTN)r×rÔrØrÙrÚrÛcSsi|]}|t|jƒ“qSrE)rrÓ)rœÚprErErFú sz(_search_distribution..)rrÜrˆ)Úreq_nameÚpackagesÚpkg_dictrErErFÚ_search_distributionñs râc Cs<t|ƒ}|s4ytjj|ƒWntjk r2dSXt|ƒS)zÕGiven a requirement name, return the installed Distribution object. This searches from *all* distributions available in the environment, to match the behavior of ``pkg_resources.get_distribution()``. N)rârrÖÚrequireÚDistributionNotFound)rßrÂrErErFÚget_distributions  råcCszg}tƒr,|jtƒtƒ rDtrD|jtƒntr:|jtƒ|jtƒx0|D](}tjj||jƒd}tjj |ƒrJ|SqJWdS)a Return the path for the .egg-link file if it exists, otherwise, None. There's 3 scenarios: 1) not in a virtualenv try to find in site.USER_SITE, then site_packages 2) in a no-global virtualenv try to find in site_packages 3) in a yes-global virtualenv try to find in site_packages, then site.USER_SITE (don't look in global location) For #1 and #3, there could be odd cases, where there's an egg-link in 2 locations. This method will just return the first one found. z .egg-linkN) rÚappendrrrr=r>r?rÊrª)rÂÚsitesÚsiteÚegglinkrErErFÚ egg_link_path$s       rêcCst|ƒ}|rt|ƒSt|jƒS)aO Get the site-packages location of this distribution. Generally this is dist.location, except in the case of develop-installed packages, where dist.location is the source code location, and we want to know where the egg-link file is. The returned location is normalized (in particular, with symlinks removed). )rêr6Úlocation)rÂrÌrErErFrÁHs rÁcGstj|f|žŽdS)N)ÚloggerÚinfo)ÚmsgÚargsrErErFÚ write_outputXsrðc@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚFakeFilezQWrap a list of lines in an object with readline() to make ConfigParser happy.cCst|ƒ|_dS)N)ÚiterÚ_gen)ÚselfÚlinesrErErFÚ__init__`szFakeFile.__init__c Cs$y t|jƒStk rdSXdS)Nr†)ÚnextróÚ StopIteration)rôrErErFÚreadlinecs zFakeFile.readlinecCs|jS)N)ró)rôrErErFÚ__iter__iszFakeFile.__iter__N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rörùrúrErErErFrñ]srñc@s$eZdZedd„ƒZedd„ƒZdS)Ú StreamWrappercCs ||_|ƒS)N)Ú orig_stream)ÚclsrrErErFÚ from_streamoszStreamWrapper.from_streamcCs|jjS)N)rÚencoding)rôrErErFruszStreamWrapper.encodingN)rûrürýÚ classmethodrÚpropertyrrErErErFrÿms rÿc cs@tt|ƒ}tt|tj|ƒƒztt|ƒVWdtt||ƒXdS)zËReturn a context manager used by captured_stdout/stdin/stderr that temporarily replaces the sys stream *stream_name* with a StringIO. Taken from Lib/support/__init__.py in the CPython repo. N)ÚgetattrrWÚsetattrrÿr)Ú stream_nameÚ orig_stdoutrErErFÚcaptured_outputzs  r cCstdƒS)zÜCapture the output of sys.stdout: with captured_stdout() as stdout: print('hello') self.assertEqual(stdout.getvalue(), 'hello ') Taken from Lib/support/__init__.py in the CPython repo. Ústdout)r rErErErFr9‰s cCstdƒS)z See captured_stdout(). Ústderr)r rErErErFÚcaptured_stderr•sr cCs4tjj|ƒ}|dkrtjƒ}|j|ƒ}|r0|jSdS)zCGet the installed version of dist_name avoiding pkg_resources cacheN)rÚ RequirementrrÕÚfindÚversion)Ú dist_namerÖÚreqrÂrErErFr;œs   cCst|dd�dS)zConsume an iterable at C speed.r)ÚmaxlenN)r)ÚiteratorrErErFÚconsume®srcOs@tt|tt|ƒƒƒf|Ž}dd„|jƒDƒ}||d<tdf|ƒS)NcSsi|]\}}||“qSrErE)rœrÓÚvaluerErErFrÞ¶szenum..Úreverse_mappingÚEnum)ÚdictÚzipÚrangerJÚitemsÚtype)Ú sequentialÚnamedÚenumsÚreverserErErFÚenum´sr"cCs*|dkr |Sd|krdj|ƒ}dj||ƒS)z. Build a netloc from a host-port pair Nú:z[{}]z{}:{})rC)ÚhostÚportrErErFÚ build_netloc»s  r&ÚhttpscCs4|jdƒdkr(d|kr(d|kr(dj|ƒ}dj||ƒS)z) Build a full URL from a netloc. r#rtú@ú[z[{}]z{}://{})ÚcountrC)ÚnetlocÚschemerErErFÚbuild_url_from_netlocÈs r-cCst|ƒ}tj|ƒ}|j|jfS)z2 Return the host-port pair from a netloc. )r-Ú urllib_parseÚurlparseÚhostnamer%)r+ÚurlÚparsedrErErFÚ parse_netlocÓs r3cCsXd|kr|dfS|jddƒ\}}d|kr6|jddƒ}n|df}tdd„|Dƒƒ}||fS)zp Parse out and remove the auth information from a netloc. Returns: (netloc, (username, password)). r(Nrr#css"|]}|dkrdnt|ƒVqdS)N)Úurllib_unquote)rœÚxrErErFú ósz)split_auth_from_netloc..)NN)Úrsplitr‰r›)r+ÚauthÚ user_passrErErFÚsplit_auth_from_netlocÝsr:cCsLt|ƒ\}\}}|dkr|S|dkr.d}d}ntj|ƒ}d}dj|||d�S)zÞ Replace the sensitive data in a netloc with "****", if it exists. For example: - "user:pass@example.com" returns "user:****@example.com" - "accesstoken@example.com" returns "****@example.com" Nz****r†z:****z{user}{password}@{netloc})ÚuserÚpasswordr+)r:r.ÚquoterC)r+r;r<rErErFÚ redact_netlocùs  r>cCs@tj|ƒ}||jƒ}|j|d|j|j|jf}tj|ƒ}||fS)aRTransform and replace netloc in a url. transform_netloc is a function taking the netloc and returning a tuple. The first element of this tuple is the new netloc. The entire tuple is returned. Returns a tuple containing the transformed url as item 0 and the original tuple returned by transform_netloc as item 1. r)r.Úurlsplitr+r,r>ÚqueryÚfragmentÚ urlunsplit)r1Útransform_netlocÚpurlÚ netloc_tupleÚ url_piecesÚsurlrErErFÚ_transform_urls   rHcCst|ƒS)N)r:)r+rErErFÚ _get_netloc$srIcCs t|ƒfS)N)r>)r+rErErFÚ_redact_netloc(srJcCst|tƒ\}\}}|||fS)z† Parse a url into separate netloc, auth, and url with no auth. Returns: (url_without_auth, netloc, (username, password)) )rHrI)r1Úurl_without_authr+r8rErErFÚsplit_auth_netloc_from_url,srLcCst|tƒdS)z7Return a copy of url with 'username:password@' removed.r)rHrI)r1rErErFr<7scCst|tƒdS)z.Replace the password in a given url with ****.r)rHrJ)r1rErErFÚredact_auth_from_url?srMc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) Ú HiddenTextcCs||_||_dS)N)ÚsecretÚredacted)rôrOrPrErErFröFszHiddenText.__init__cCsdjt|ƒƒS)Nz)rCr�)rôrErErFÚ__repr__OszHiddenText.__repr__cCs|jS)N)rP)rôrErErFÚ__str__SszHiddenText.__str__cCs t|ƒt|ƒkrdS|j|jkS)NF)rrO)rôÚotherrErErFÚ__eq__XszHiddenText.__eq__cCs ||k S)NrE)rôrSrErErFÚ__ne__cszHiddenText.__ne__N)rûrürýrörQrRrTrUrErErErFrNEs   rNcCs t|dd�S)Nz****)rP)rN)rrErErFÚ hide_valuehsrVcCst|ƒ}t||d�S)N)rP)rMrN)r1rPrErErFÚhide_urlmsrWcCszddjtjdƒdjtjdd…Žg}|oBtoBtjjtjdƒ|k}|rvtjddgtjd d…}t d jd j |ƒƒƒ‚dS) z�Protection of pip.exe from modification on Windows On Windows, any operation modifying pip should be run as: python -m pip ... zpip.exez pip{}.exerz pip{}.{}.exeNrtz-mrUrz3To modify pip, please run the following command: {}r¢) rCrWrxrr=r>rVrXrYrr?)Ú modifying_pipÚ pip_namesÚshould_show_use_python_msgÚ new_commandrErErFÚ(protect_pip_from_modification_on_windowsss r\cCstjdk otjjƒS)z!Is this console interactive? N)rWÚstdinÚisattyrErErErFÚis_console_interactive‘sr_réc CsVtjƒ}d}t|dƒ�2}x*t||d�D]}|t|ƒ7}|j|ƒq&WWdQRX||fS)z:Return (hash, length) for path using hashlib.sha256() rÚrb)r¯N)ÚhashlibÚsha256Úopenr±rJÚupdate)r>Ú blocksizeÚhÚlengthÚfÚblockrErErFÚ hash_file˜s  rkc Cs&y ddl}Wntk r dSXdS)z8 Return whether the wheel package is installed. rNFT)ÚwheelÚ ImportError)rlrErErFÚis_wheel_installed¦s  rncCst|ƒ}t||ƒS)zb Return paired elements. For example: s -> (s0, s1), (s2, s3), (s4, s5), ... )ròr)ÚiterablerErErFÚpairwise²srpcCs t|ƒ\}}t||ƒt||ƒfS)z¡ Use a predicate to partition entries into false entries and true entries, like partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 )rr r )ÚpredroÚt1Út2rErErFÚ partition¾s rt)F)r~)T)N)r'é)ru)’Ú __future__rÚ contextlibrOr–rbÚioÚloggingr=r¶rbrerWÚ collectionsrÚ itertoolsrÚ pip._vendorrZpip._vendor.packaging.utilsrÚpip._vendor.retryingrZpip._vendor.sixrr Úpip._vendor.six.movesr r r r rZpip._vendor.six.moves.urllibrr.Ú"pip._vendor.six.moves.urllib.parserr4rUrÚpip._internal.exceptionsrÚpip._internal.locationsrrrrÚpip._internal.utils.compatrrrrÚpip._internal.utils.typingrrÚpip._internal.utils.virtualenvrrrr Útypingr!r"r#r$r%r&r'r(r)r*r+r,Zpip._vendor.pkg_resourcesr-r™rIr.Ú__all__Ú getLoggerrûrìrGrLr:r8r/rcrsr0r1r�r�r2r•r—r4r¨r5ÚDEFAULT_BUFFER_SIZEr±r6r3r7rÀrÃrÄrÅrÉrÍrÜrârårêrÁrðÚobjectrñrÿÚcontextmanagerr r9r r;rr"r&r-r3r:r>rHrIrJrLr<rMrNrVrWr\r_rkrnrprtrErErErFÚsÚ           8      "          >$      #