
    ^h:*                     `   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  S,S jr	S,S jr
S,S jrS,S jrS,S	 jrS
 rS rS r\R"                  \R$                  -  S4S jrSSKr\R*                  S   S:  d  \R,                  " 5       S:X  a  \	r\	r\r\
r\	r\	r\	r\4r\r O\
r\r\	r\	r\r\r\r\\!4r\!r \R*                  S   S:  aw  Sr"S-S jr#Sr$SSK%r&\RN                  r'S.S jr(\)r*S r+S r,\RZ                  r-\R\                  r.S/S jr/\R`                  " S\Rb                  5      r2S r3\S 5       r4\S 5       r5S r6OjSr"S-S jr#Sr$SSK7r&SSKr\R`                  " S5      r8S.S  jr(\*r*S! r+S" r,\Rr                  r-S# r.S$ r4S% r6\r'\S& 5       r5\R(                  S':X  a  S0S( jr/OS0S) jr/S* r:S+ r;g)1z=Compatibility tricks for Python 3. Mainly to do with unicode.    N   )DEFAULT_ENCODINGc                     U $ N )xencodings     T/home/james-whalen/.local/lib/python3.13/site-packages/ipython_genutils/py3compat.pyno_coder      s    H    c                 D    U=(       d    [         nU R                  US5      $ Nreplace)r   decodesr	   s     r
   r   r          ++H88Hi((r   c                 D    U=(       d    [         nU R                  US5      $ r   )r   encode)ur	   s     r
   r   r      r   r   c                 F    [        U [        5      (       a  [        X5      $ U $ r   )
isinstancebytesr   r   s     r
   cast_unicoder      s    !Ua""Hr   c                 F    [        U [        5      (       d  [        X5      $ U $ r   )r   r   r   r   s     r
   
cast_bytesr      s    aa""Hr   c                     [        U [        5      (       a  U R                  5       $ [        U [        5      (       d  [        U 5      $ U $ )z+Cast a buffer or memoryview object to bytes)r   
memoryviewtobytesr   )bufs    r
   buffer_to_bytesr!   "   s7    #z""{{}c5!!SzJr   c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )Nc                    > [        U [        5      (       a  S nU nOU nUR                  nT" U5      nU(       a  X!l        U$ U$ r   )r   string_types__doc__)func_or_strfuncdocstr_change_funcs      r
   wrapper)_modify_str_or_docstring.<locals>.wrapper+   sD    k<00DCD,,Cc"LK
r   )	functoolswraps)r)   r*   s   ` r
   _modify_str_or_docstringr.   *   s%    ___% & Nr   c                      [        U 5      $ ! [         a     Of = f [        [        U 5      5      $ ! [         a     Of = f [        [	        U 5      5      $ ! [         a     gf = f)zdunicode(e) with various fallbacks. Used for exceptions, which may not be
safe to call unicode() on.
zUnrecoverably corrupt evalue)unicode_typeUnicodeErrorstr_to_unicodestrrepr)es    r
   safe_unicoder6   <   sr    A c!f%% d1g&& *s*   
 
2 
??A 
A$#A$c                   ^  S n[         R                  R                  T 5      (       a  U" T U5      (       a  T $ gUc.  [         R                  R	                  S[         R
                  5      nU(       d  gUR                  [         R                  5      n[        R                  S:X  a  [         R                  U;  a   UR                  S[         R                  5        [         R                  R	                  SS5      R                  [         R                  5      n[        U 4S jU 5       5      (       a  T /nOU Vs/ s H  nT U-   PM
     nnOT /n[        5       nU Hu  n[         R                  R                  U5      n	X;  d  M)  UR                  U	5        U H5  n
[         R                  R!                  X5      nU" X5      (       d  M1  Us  s  $    Mw     gs  snf )	aN  Given a command, mode, and a PATH string, return the path which
conforms to the given mode on the PATH, or None if there is no such
file.

`mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
of os.environ.get("PATH"), or can be overridden with a custom search
path.

This is a backport of shutil.which from Python 3.4
c                     [         R                  R                  U 5      =(       aA    [         R                  " X5      =(       a$    [         R                  R	                  U 5      (       + $ r   )ospathexistsaccessisdir)fnmodes     r
   _access_check$_shutil_which.<locals>._access_check`   s?    r" *ryy': *b))	+r   NPATHwin32r   PATHEXT c              3   ~   >#    U  H2  nTR                  5       R                  UR                  5       5      v   M4     g 7fr   )lowerendswith).0extcmds     r
   	<genexpr> _shutil_which.<locals>.<genexpr>}   s+     DGSsyy{##CIIK00Gs   :=)r9   r:   dirnameenvirongetdefpathsplitpathsepsysplatformcurdirinsertanysetnormcaseaddjoin)rK   r?   r:   r@   pathextfilesrJ   seendirnormdirthefilenames   `           r
   _shutil_whichrd   R   s_   + 
wwsd##J|zz~~fbjj1::bjj!D
||wyyD KK299% **..B/55bjjA
 DGDDDEE*12'3S3Y'E2E 5D''""3'HHW ww||C1 ,,K !	   3s   9G   
IronPythonTc                 .    [         R                  " U 5      $ r   )builtin_modinputprompts    r
   ri   ri      s      ((r   builtinsFc                 r    U(       a!  [        S U R                  S5       5       5      $ U R                  5       $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr   isidentifierrI   as     r
   rL   isidentifier.<locals>.<genexpr>        =1|A   .)allrR   rp   r   dotteds     r
   rp   rp      s+    ====~~r   c                 4    [        U R                  5       5      $ r   )iteritemsds    r
   	iteritemsr      s    T!'')_,r   c                 4    [        U R                  5       5      $ r   )r{   valuesr}   s    r
   
itervaluesr      s    d188:..r   c                     Ub  UOUn[        U S5       nU=(       d    [        n[        U" UR                  5       U S5      X5        S S S 5        g ! , (       d  f       g = f)Nrbexec)opencompiler   read)fnameglobloccompilerfs        r
   execfiler      sH    ocD%!*7H!&&(E62D> s   2A
Az\bprint (?P<expr>.*)$c                 .    U R                  S5      nSU-  $ )Nexprz	print(%s))groups)matchr   s     r
   _print_statement_subr      s    ||F#T!!r   c                 6    [         R                  [        U 5      $ )zRefactor 'print x' statements in a doctest to print(x) style. 2to3
unfortunately doesn't pick up on our doctests.

Can accept a string or a function, so it can be used as a decorator.)_print_statement_resubr   )r(   s    r
   doctest_refactor_printr      s     #&&';SAAr   c                      U R                  SS9$ )zd"{u}'abc'" --> "'abc'" (Python 3)

Accepts a string or a function, so it can be used as a decorator.rE   r   formatr   s    r
   u_formatr      s    
 xx"x~r   c                     U R                   $ z"Get a function's closure attribute)__closure__r   s    r
   get_closurer      s    }}r   c                 .    [         R                  " U 5      $ r   )rh   	raw_inputrj   s    r
   ri   ri      s    $$V,,r   __builtin__z[a-zA-Z_][a-zA-Z0-9_]*$c                     U(       a!  [        S U R                  S5       5       5      $ [        [        R	                  U 5      5      $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr   ro   rq   s     r
   rL   rs      rt   ru   rv   )rw   rR   bool_name_rer   rx   s     r
   rp   rp      s2    ====HNN1%&&r   c                 "    U R                  5       $ r   )r   r}   s    r
   r   r      s    Q[[]*r   c                 "    U R                  5       $ r   )r   r}   s    r
   r   r      s    alln,r   c                 B    [         R                  " X[        U5      5      $ r   )types
MethodTypetype)r'   instances     r
   r   r      s    X??r   c                     U $ r   r   )r&   s    r
   r   r      s    r   c                     U R                   $ r   )func_closurer   s    r
   r   r      s    ~~r   c                      U R                  SS9$ )ze"{u}'abc'" --> "u'abc'" (Python 2)

Accepts a string or a function, so it can be used as a decorator.r   r   r   r   s    r
   r   r     s    
 xx#xr   rC   c                     Ub  UOUn[         R                  " U 5      R                  5       S-   n[        U [        5      (       a  [        U 5      nOU nU=(       d    [        n[        U" XES5      X5        g N
r   )rh   r   r   r   unicodeunicode_to_strr   r   )r   r   r   r   
scripttextfilenames         r
   r   r     sd    /#C$))%0557=J %)))%0 *7H*7Cr   c                 z   [        U [        5      (       a%  U R                  [        R                  " 5       5      nOU nX4 Vs/ s H	  oUc  M  UPM     nnUc  [
        R                  " U/UQ76   g [
        R                  " U 5      R                  5       R                  5       S-   n[        U" XtS5      X5        g s  snf r   )r   r   r   rT   getfilesystemencodingrh   r   r   r   rstripr   )r   r   r   r   r   nswherer   s           r
   r   r     s    %)) <<(A(A(CD #'+@+BR+E@$$X66(--e499;BBDtK
XjF;TG As   B8B8c                  8   ^  T (       d  [        S5      eU 4S jnU$ )z5Python 3 compatible function annotation for Python 2.z1annotations must be provided as keyword argumentsc                    > [        U S5      (       a)  TR                  5        H  u  pX R                  U'   M     U $ TU l        U $ )N__annotations__)hasattrr|   r   )r   kvkwargss      r
   decannotate.<locals>.dec,  sG    1'(('(!!!$ '  !'Ar   )
ValueError)r   r   s   ` r
   annotater   (  s    LMM Jr   c                     U " SU0 5      $ )z%Create a base class with a metaclass._NewBaser   )metabasess     r
   with_metaclassr   K  s    
E2&&r   r   )rE   )F)NN)NNN)<r%   r,   r9   rT   reshutilr   r	   r   r   r   r   r   r   r!   r.   r6   F_OKX_OKrd   rU   version_infopython_implementationr2   r   str_to_bytesbytes_to_strcast_bytes_py2cast_unicode_py2buffer_to_bytes_py2r3   r$   r0   r   PY3ri   builtin_mod_namerl   rh   whichrp   rangexranger   r   getcwdr   r   r   	MULTILINEr   r   r   r   r   r   r   getcwdur   r   r   r   r
   <module>r      s'   C  	 
 	   &))


$+, GGbgg-D =~ A!x==?<ONNLLN!6LLNNLLN#)>LLA!
C) ""LLE 
 F,.YYF!!J? **%=r||L" B B  
 C- %%zz45H'
 F*,ZZF@ E   ||w
	D
	HF'r   