
    "e                        d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlZ	 d dlmZ e j4                  j7                  e j4                  j7                  e            Z ej<                         Zed	        Z d
 Z!d@dZ" G d dejF                        Z$d Z%d Z&d Z'd Z(d Z)dAdZ*d Z+d Z,d Z- G d de.      Z/d Z0d Z1d Z2d@dZ3d Z4d Z5d Z6d  Z7d! Z8d" Z9d# Z:d$ Z;d% Z<d& Z=d' Z>d( Z?d) Z@d* ZAd+ ZBd, ZCd- ZDd. ZEd/ ZFd0 ZGd1 ZHd2 ZId3 ZJd4 ZK G d5 d6      ZL G d7 d8      ZMeLaNd9 ZO eO       ZPd: ZQd; ZRd< ZSd= ZTd> ZUd? ZVy# e$ r dZY "w xY w)B    N)	threading)get_global_debugger
IS_WINDOWS	IS_JYTHONget_current_thread_idsorted_dict_reprset_global_debuggerDebugInfoHolder)	pydev_log)contextmanager)pydevd_constantspydevd_defaults)PydevdCustomization)Pathc               #   b   K   dt         _        	 d  dt         _        y # dt         _        w xY ww)NFT)
_arg_patchapply_arg_patching     </usr/lib/python3/dist-packages/_pydev_bundle/pydev_monkey.pyskip_subprocess_arg_patchr      s&     $)J!-(,
%
%s   / /,/c                  $    t        t        dd      S )Nr   T)getattrr   r   r   r   _get_apply_arg_patchingr   %   s    :3T::r   c                    | i } | j                         } | j                  t        j                  d        | j                  t        j                  d        | j                  t        j
                  d        |s%t        j                         | t        j                  <   t        j                         }|t        j                  k(  rd| t        j                  <   n|t        j                  k(  rd| t        j                  <   nd|t        j                  k(  rd| t        j
                  <   n=|t        j                  k(  rd| t        j                  <   nt        j                   d|       t"        j$                  j&                  }|r|| d<   t"        j$                  j(                  }|r|| d<   t*        j,                  rt*        j,                  | d<   t*        j.                  rt*        j.                  | d<   | S )NTzUnexpected protocol: %sz
debug-mode	preimportzlog-filez	log-level)copypopr   ARGUMENT_HTTP_JSON_PROTOCOLARGUMENT_JSON_PROTOCOLARGUMENT_QUOTED_LINE_PROTOCOLosgetpidARGUMENT_PPIDget_protocolHTTP_JSON_PROTOCOLJSON_PROTOCOLQUOTED_LINE_PROTOCOLHTTP_PROTOCOLARGUMENT_HTTP_PROTOCOLr   debugr   r   
DEBUG_MODE	PREIMPORTr
   PYDEVD_DEBUG_FILEDEBUG_TRACE_LEVEL)setupis_execprotocolmoder   s        r   )_get_setup_updated_with_protocol_and_ppidr4   )   s   }JJLE 
II::DA	II55t<	II<<dC 13		,,-,,.H#666>B::;	%33	39=556	%::	:@D<<=	%33	39=556 	18<..99D"l33==I&k((+==j((,>>kLr   c                       e Zd Zd Zd Zy)_LastFutureImportFinderc                     d | _         y N)last_future_import_foundselfs    r   __init__z _LastFutureImportFinder.__init__[   s
    (,%r   c                 2    |j                   dk(  r|| _        y y )N
__future__)moduler9   )r;   nodes     r   visit_ImportFromz(_LastFutureImportFinder.visit_ImportFrom^   s    ;;,&,0D) 'r   N)__name__
__module____qualname__r<   rA   r   r   r   r6   r6   Y   s    -1r   r6   c                     d}t        | j                  d            D ]!  \  }}||k(  r	||z  }|c S |t        |      z  }# y)Nr   T)	enumerate
splitlineslen)codelinecoloffsetiline_contentss         r   _get_offset_from_line_colrP   c   sR    F%dood&;< )=9cMFMc-((F) r   c                    	 t        j                  | dd      }t               }|j                  |       |j                  d| fS |j                  }d}t        |d      r5t        |d      r)|j                  |j                  }}t        | |dz
  |      }nz|j                  |j                  }}t        | |dz
  |      }|d	k\  rM|j                  rA|j                  d   j                  }| j                  ||      }|d	k  rd}n|t        |      z   }|d	k\  ryt        |t        |             D ]  }| |   d
v r|dz  } n | d| }| |d }	|j!                  d      r|dd }d|	z   }	|j!                  d      r|j!                  d      s|dz  }||	fS t#        j$                  d||        d| fS #  t#        j&                  d|        d| fcY S xY w)a  
    :param code:
        The code from where we want to get the __future__ imports (note that it's possible that
        there's no such entry).

    :return tuple(str, str):
        The return is a tuple(future_import, code).

        If the future import is not available a return such as ('', code) is given, otherwise, the
        future import will end with a ';' (so that it can be put right before the pydevd attach
        code).
    z<string>execN rF   
end_linenoend_col_offset   r   ) 	;)
r[   rY   z"Unable to find line %s in code:
%rz.Error getting from __future__ imports from: %r)astparser6   visitr9   hasattrrT   rU   rP   lineno
col_offsetnamesnamefindrI   rangeendswithr   info	exception)
rJ   r@   visitorrM   rK   rL   from_future_import_namerN   future_importcode_remainders
             r   _separate_future_importsrm   o   s   7yyz62)+d++3t8O//4&749I+J)<)<#D.tTAXsCF
 T__#D.tTAXsCF{tzz*.**R.*=*='II5v>q5F%<!==FQ;63t9- 799aKF	 !&MM!&']N
  ((. -cr 2!%!6  ((. !))#.$ .00 	<dDI4xLdS4xs   AF& D,F& 1F& F& &Gc                     t        |      }||n
t        |      }d}d|v rt        |      \  }}|dt        dt	        j
                         dt        j                  d| d|d|j                  d	      d
|j                  d      d|d|S )NrS   r>   z!import sys; sys.path.insert(0, r'z!'); import pydevd; pydevd.config(z, z); pydevd.settrace(host=z, port=z[, suspend=False, trace_only_current_thread=False, patch_multiprocessing=True, access_token=zaccess-tokenz, client_access_token=zclient-access-tokenz, __setup_holder__=z); )	r4   r   rm   pydev_src_dirr   r%   r   r,   get)hostportrJ   argsr0   
setup_reprfuture_importss          r   _get_python_c_argsrv      s    5e<E  -.>u.EJNt  8= ,,."--yy(yy./ r   c                  8    dd l } | j                         \  }}||fS Nr   )pydevddispatch)ry   rq   rr   s      r   _get_host_portr{      s    "JD$:r   c                 @    t        | d      }| j                  |      ryy)Nz	pydevd.pyTF)_get_str_type_compatiblerf   )arg	pydevd_pys     r   _is_managed_argr      s     (k:I
||Ir   c                    t        j                          t        j                  d       | r(t        j                  dt        j                                dd l}d|j                         _	        |j                  |        y )NT)reinitializezpydevd on forked process: %sr   setup_tracing)r   
after_forkr   initialize_debug_streamr+   r"   r#   ry   threadingCurrentThread__pydevd_main_threadsettrace_forked)r   ry   s     r   _on_forked_processr      sY    !%%486		D;?F!!#8
7r   c                 *    | | j                          y y r8   )enable_tracing)global_debuggers    r   _on_set_trace_for_new_threadr      s    "&&( #r   c                    t        |t        t        f      rg }|D ]|  }t        |       t        |      k(  r|j	                  |       ,t        | t
              r!|j	                  |j                  d             ]|j	                  |j                  d             ~ |S t        |       t        |      k(  r|S t        | t
              r|j                  d      S |j                  d      S )zL
    This method converts `args` to byte/unicode based on the `s' type.
    zutf-8)
isinstancelisttupletypeappendbytesencodedecode)srs   retr~   s       r   r}   r}      s     $u& 	4CAw$s)#

3a'JJszz'23JJszz'23	4 
7d4j K!U#{{7++{{7++r   c                 8   t        | ddg      \  }}| j                  |      s| j                  |      r| dt        |       dz
   } t        j                  j                  |       j                         }t        |g d      D ]  }|j                  |      dk7  s y y)N'"rV   )pythonjythonpypyrF   TF)r}   rf   rI   r"   pathbasenamelowerrd   )r   single_quotedouble_quotefilenamerc   s        r   	is_pythonr     s    !9$c
!KL,}}\"dmmL&AAc$i!m$ww%++-H(3OP =="$ r   c                       e Zd Zy)InvalidTypeInArgsExceptionN)rB   rC   rD   r   r   r   r   r     s    r   r   c                    t         j                  dk(  rg }| D ]  }t        t        |t              rt	        |      }n3t        |t
        t        f      st        t	        t        |                  t        |ddg      \  }}||k7  r5t        |      dkD  r'|j                  |      r|j                  |      r|dd }|j                  |        |S g }| D ]m  }t        !t        |t              r|j                         }n3t        |t
        t        f      st        t	        t        |                  |j                  |       o |S )Nwin32r   z""rV   rF   )sysplatformr   r   strr   r   r   r}   rI   
startswithrf   r   as_posix)rs   new_argsxr   two_double_quotess        r   remove_quotes_from_argsr     s   
||w 	AJq$$7F!!eS\24Sa\BB.Fq3PT+.V+L+%%q6A:!,,|"<LAY!BAOOA	  	AJq$$7JJL!!eS\24Sa\BBOOA	 r   c                 
     fd} r"t               j                   |d            s S t        j                   |d       |d              t        j                   |d       |d               |d       z    |d      z   S )Nc                     t        |       S r8   )r}   )r   r~   s    r   <lambda>z!quote_arg_win32.<locals>.<lambda>>  s    1#q9 r   z "	
z(\\*)\"z\1\1\\"z(\\*)$z\1\1r   )setintersectionresub)r~   fix_types   ` r   quote_arg_win32r   =  sz    9H 3s8((*)=>
, &&*%x
';S
AC
&&)$hw&7
=CC=3#..r   c                 ^    t         j                  dk(  rt        t        t        |             S | S )Nr   )r   r   r   mapr   )rs   s    r   
quote_argsr   ^  s%    
||wC.//r   c           	         	 t        j                  d|        | }	 t        |       }~ ddlm} |s|S t        |d         st        j                  d       |S t        d|      }d}t        d	      }d}	d}
d
}d
}d}d
}d
}d}d}d
}d}t        |      D ]  \  }}|rd}|j                  d      r|dk(  rt        j                  d       |c S |j                  |      r||v rd}Sd}t        |      D ]u  \  }}||v s||dz   d }|sd}|dk(  r/|d| }
|
dk(  rd}
|}|s||dz      }	|dz   }n||   |dz   d }	|}d} n-|dk(  r%|d|dz    }|s||dz      }|dz   }n|}|dz   }|}d} n n |s nE||   }|}t        |      rt        j                  d       |c S  n t        j                  d       |S |d
k7  r}t               \  }}|ng }|j                  |d|        |j                  |       |j                  t!        |||||j"                               |j                  ||d        t%        |      S t'        ||      }|d
k(  rt        j                  d       |S ddlm} g }|j                  |d|        |
r|j                  |
       t-        |      dz   }|j                   |t/        |j"                  |      t        d                   |j                  d       |	I|d
k7  sJ |d
k7  sJ |j1                  |d       |j                  |	       |j                  ||dz   d        n=|0|d
k7  sJ |j                  |       |j                  ||dz   d        nt3        d      t%        |      S # t        $ r"}t        j                  d|       |cY d}~S d}~ww xY w#  t        j4                  d       cY S xY w)z
    :param list args:
        Arguments to patch.

    :param bool is_exec:
        If it's an exec, the current process will be replaced (this means we have
        to keep the same ppid).
    zPatching args: %sz[Unable to monkey-patch subprocess arguments because a type found in the args is invalid: %sNr   )SetupHolderz!Process is not python, returning.rS   )z--check-hash-based-pycsz--jit)WXQcmrF   TF-zbUnable to fix arguments to attach debugger on subprocess when reading from stdin ("python ... -").rV   r   r      z8Skipped monkey-patching as pydevd.py is in args already.zNUnable to fix arguments to attach debugger on subprocess (filename not found).zfUnable to fix arguments to attach debugger on subprocess (could not resolve filename nor module name).)setup_to_argvr1   )r?   zcmd-line)
skip_namesz--filez--modulez%Internal error (unexpected condition)z:Error patching args (debugger not attached to subprocess).)r   r+   r   r   rg   ry   r   r   r}   r   rG   r   r   r{   extendr   rv   r0   r   max+_pydevd_bundle.pydevd_command_line_handlingr   rI   r4   insertAssertionErrorrh   ) rs   r1   original_argsunquoted_argser   args_as_str!params_with_value_in_separate_argparams_with_combinable_argmodule_namebefore_module_flagmodule_name_i_startmodule_name_i_endrJ   code_i
code_i_end	code_flagr   
filename_iignore_nextrN   
arg_as_str	break_outjr   	remainderrq   rr   r   first_non_vm_indexr   add_module_ats                                    r   
patch_argsr   e  s   T+T2	!3D9M &  q)*OO?@   /r=A-
)0 &))B%C" 
	
&{3 \	!MAz#$$S)$OO  %I  J(((()JK!%FF&*!	%j1 1"DAq
 66$.q1uv$6	(*.K8
 2<BQ.1S857 223/#,.;AE.B45E 1 /<A.>q1uv.F4G 1(,I!#X
 )36AE(:I#,'4QU';-.U
 (1-.U
%&F(,I! "c1"f 
 )+ 
"8,OO$^_((q\	!v OOlm  R<')JD$gv 67	* 24t]T_TeTe fgjk :;!(++ -@A#OO  E  F  
 	N&9'9:;OO./H)5k6G6GQXY12
 	 	!"&",,,$***OOM:6OOK(OOM*;a*?*@AB!###OOH%OOM*q./:; !!HII(##Y * 	!NNxz{|  	!ZXYsr   N" M4 
N" $N" A4N" /N" ;A/N" +,N" N" 2BN" 4'N" DN" 4	N=NNN" NN" "N=c                 J   g }d}d}d}|}d}d}t        |       }t        |      D ]  }	| |	   }
|
dk(  r|dz  }|dk7  rJ|
dk(  r)|dk\  r|dz  }|dz  }|dk\  r|dk(  r+||k(  r|}|dz  }d}F||k(  r|}|dkD  r|dz  }|dz  }|dkD  r|
dv r!||k(  rl||k(  r|}|j                  |       d}|||fv r|
dk(  r|}|}||
z  }||k(  r,|
dk(  r!|	dz   |k  r| |	dz      dk(  r|dz  }|	dz  }	|}||
z  }t        d       t        |      dkD  s||k7  r|j                  |       |S )	Nr   rV   r   rS   \r   )rW   rX   zIllegal condition)rI   re   r   RuntimeError)rs   resultDEFAULTARGIN_DOUBLE_QUOTEstatebackslashesbufargs_lenrN   chs              r   str_to_args_windowsr   E  s    FG
COEK
C4yH8_ :4!W$J1KQSy!Q&1$K4KC "Q&  1$( #3JC"#K W$E!Ao1$K4KC "Ao  3,c"WcN"Sy'r	o%SyEH$a!e); 3JCFAEr	 233u:4x 3x!|u'cMr   c                     t        |       }|rt        |d         s| S dj                  t        |            } t	        j
                  d|        | S )Nr   rW   zNew args: %s)r   r   joinr   r   r+   )arg_strrs   s     r   patch_arg_str_winr     sE    w'Dya)hhz$'(GOONG,Nr   c                     t        | |      r=d|z   }t        | |      s+t        | |t        | |             t        | | ||             y y y )N	original_)r_   setattrr   )r?   funcnamecreate_funcoriginal_names       r   monkey_patch_moduler     sN    vx #h.v}-FM768+DEFHk-&@A . !r   c                 &    t        t        | |       y r8   )r   r"   )r   r   s     r   monkey_patch_osr     s    Hk2r   c                       y r8   r   r   r   r   warn_multiprocr    s    r   c                       fd}|S )Nc                  D    dd l }t                 t        |      | i |S rx   )r"   r  r   )rs   kwargsr"   r   s      r   new_warn_multiprocz1create_warn_multiproc.<locals>.new_warn_multiproc  s%    )wr=)4:6::r   r   )r   r  s   ` r   create_warn_multiprocr    s    ; r   c                       fd}|S )Nc                     t               r!t        |d      }t                t                 t	        t
              | g| S )z
        os.execl(path, arg0, arg1, ...)
        os.execle(path, arg0, arg1, ..., env)
        os.execlp(file, arg0, arg1, ...)
        os.execlpe(file, arg0, arg1, ..., env)
        Tr   r   r   send_process_created_message!send_process_about_to_be_replacedr   r"   r   rs   r   s     r   	new_execlzcreate_execl.<locals>.new_execl  s<     #$dD1D(*-/)wr=)$666r   r   )r   r  s   ` r   create_execlr    s    7 r   c                       fd}|S )Nc                     t               r!t        |d      }t                t                 t	        t
              | |      S )zD
        os.execv(path, args)
        os.execvp(file, args)
        Tr   r
  r  s     r   	new_execvzcreate_execv.<locals>.new_execv  s9    
 #$dD1D(*-/)wr=)$55r   r   )r   r  s   ` r   create_execvr    s    
6 r   c                       fd}|S )zD
    os.execve(path, args, env)
    os.execvpe(file, args, env)
    c                     t               r!t        |d      }t                t                 t	        t
              | ||      S )NTr   r
  )r   rs   envr   s      r   
new_execvez!create_execve.<locals>.new_execve  s9    "$dD1D(*-/)wr=)$c::r   r   )r   r  s   ` r   create_execver    s    ; r   c                       fd}|S )Nc                 r    t               rt        |      }t                 t        t              | |g| S )zh
        os.spawnl(mode, path, arg0, arg1, ...)
        os.spawnlp(mode, file, arg0, arg1, ...)
        r   r   r  r   r"   r3   r   rs   r   s      r   
new_spawnlz!create_spawnl.<locals>.new_spawnl  s6    
 #$d#D(*)wr=)$<t<<r   r   )r   r  s   ` r   create_spawnlr    s    	= r   c                       fd}|S )Nc                 r    t               rt        |      }t                 t        t              | ||      S )zR
        os.spawnv(mode, path, args)
        os.spawnvp(mode, file, args)
        r  r  s      r   
new_spawnvz!create_spawnv.<locals>.new_spawnv	  s3    
 #$d#D(*)wr=)$d;;r   r   )r   r!  s   ` r   create_spawnvr"    s    	< r   c                       fd}|S )zR
    os.spawnve(mode, path, args, env)
    os.spawnvpe(mode, file, args, env)
    c                 t    t               rt        |      }t                 t        t              | |||      S r8   r  )r3   r   rs   r  r   s       r   new_spawnvez#create_spawnve.<locals>.new_spawnve  s3    "$d#D(*)wr=)$dC@@r   r   )r   r%  s   ` r   create_spawnver&    s    A r   c                       fd}|S )z9
    os.posix_spawn(executable, args, env, **kwargs)
    c                 t    t               rt        |      }t                 t        t              | ||fi |S r8   r  )
executablers   r  r  r   s       r   new_posix_spawnz+create_posix_spawn.<locals>.new_posix_spawn,  s6    "$d#D(*)wr=)*dCJ6JJr   r   )r   r*  s   ` r   create_posix_spawnr+  '  s    
K r   c                       fd}|S )U
    _posixsubprocess.fork_exec(args, executable_list, close_fds, ... (13 more))
    c                 p    dd l }t               rt        |       } t                 t	        |      | g| S rx   )_posixsubprocessr   r   r  r   )rs   
other_argsr/  r   s      r   new_fork_execz'create_fork_exec.<locals>.new_fork_exec;  s6    "$d#D(*7w'7JzJJr   r   r   r1  s   ` r   create_fork_execr3  6  s    
K r   c                       fd}|S )r-  c                  N    	 dd l }t                 t        |      |  S #  Y y xY wrx   )r/  r  r   )rs   r/  r   s     r   new_warn_fork_execz1create_warn_fork_exec.<locals>.new_warn_fork_execK  s0    	#;7+];TBB	     $r   r   r6  s   ` r   create_warn_fork_execr9  F      
 r   c                       fd}|S )P
    subprocess._fork_exec(args, executable_list, close_fds, ... (13 more))
    c                 p    dd l }t               rt        |       } t                 t	        |      | g| S rx   )
subprocessr   r   r  r   )rs   r0  r>  r   s      r   r1  z2create_subprocess_fork_exec.<locals>.new_fork_exec[  s5    "$d#D(*1wz=1$DDDr   r   r2  s   ` r   create_subprocess_fork_execr?  V  s    
E r   c                       fd}|S )r<  c                  N    	 dd l }t                 t        |      |  S #  Y y xY wrx   )r>  r  r   )rs   r>  r   s     r   r6  z<create_subprocess_warn_fork_exec.<locals>.new_warn_fork_execk  s/    	57:}5t<<	r7  r   r8  s   ` r    create_subprocess_warn_fork_execrB  f  r:  r   c                       fd}|S )(
    CreateProcess(*args, **kwargs)
    c                     	 dd l }t               rt	        |      }t                 t        |      | |g| S # t        $ r dd l}Y Bw xY wrx   )_subprocessImportError_winapir   r   r  r   )app_namecmd_liners   rF  r   s       r   new_CreateProcessz/create_CreateProcess.<locals>.new_CreateProcess{  sR    	* #$(2H(*2w{M28XMMM  	*)	*s   : A
	A
r   r   rK  s   ` r   create_CreateProcessrM  v  s    

N r   c                       fd}|S )rD  c                  f    	 dd l }t                 t	        |      |  S # t        $ r dd l}Y (w xY wrx   )rF  rG  rH  r  r   )rs   rF  r   s     r   rK  z<create_CreateProcessWarnMultiproc.<locals>.new_CreateProcess  s;    	* 	2w{M2D99  	*)	*s     00r   rL  s   ` r   !create_CreateProcessWarnMultiprocrP    s    
: r   c                       fd}|S )Nc                  0   d} t        j                         }t               }d}|o|j                  j                  dk(  rGd|j                  j
                  v r/d}|j                  j                  d      }|d} t        |      rd} n|j                  }|od }t        j                         }t        j                  } t        t                     }|s8| r)|t        _        |t        _        t#        |xr |        |S t%        d        |S | r
t'                |S )NTF_execute_childr>  r)  r   )r   	_getframer   f_codeco_nameco_filenamef_localsrp   r   f_backr   r%   r   r,   r   r"   DEFAULT_PROTOCOLr   r	   r  )	is_new_python_processframeapply_arg_patchis_subprocess_forkr)  r2   
debug_modechild_processr   s	           r   new_forkzcreate_fork.<locals>.new_fork  s    $13"||##'77LELLLdLd<d%)" #^^//=
),1) ,04-LLE  #002(33
2M24$7?#41;#."1[I[E[\ 	 $D)  %,.r   r   )r   ra  s   ` r   create_forkrb    s    &P Or   c                  >    t               } | | j                          y y r8   )r   r  py_dbs    r   r  r    s!    !E**, r   c                  >    t               } | | j                          y y r8   )r   r  rd  s    r   r  r    s!    !E//1 r   c                  F   t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        d	t               t        d
t               t        dt               t        dt               t        dt
               t        dt               t        dt
               t        dt               t        dt               t        sZt        s=t        dt               	 dd l} t        | dt               	 dd l}t        |dt                y 	 dd l}t        |dt(               y y # t        $ r Y :w xY w# t"        $ r Y y w xY w# t        $ r dd l}Y @w xY wNexeclexecleexeclpexeclpeexecvexecveexecvpexecvpespawnlspawnlespawnlpspawnlpespawnvspawnvespawnvpspawnvpeposix_spawnforkr   	fork_exec
_fork_execCreateProcess)r   r  r  r  r  r"  r&  r+  r   r   rb  r/  r   r3  rG  r>  r?  AttributeErrorrF  rH  rM  r/  r>  rF  s      r   patch_new_process_functionsr    sB    G\*Hl+Hl+I|,G\*Hm,Hl+I}- Hm,I}-I}-J.Hm,I~.I}-J/M#56FK0'#$4kCST!#J>YZ
."  _>RS)    "   .-.6   .E2 F F 2	E>=E>	FFF F c                  F   t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        d	t               t        d
t               t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               t        sZt        s=t        dt               	 dd l} t        | dt               	 dd l}t        |dt               y 	 dd l}t        |dt               y y # t        $ r Y :w xY w# t        $ r Y y w xY w# t        $ r dd l}Y @w xY wrh  )r   r  r   r   r/  r   r9  rG  r>  rB  r~  rF  rH  rP  r  s      r   (patch_new_process_functions_with_warningr    sO   G23H34H34I45G23H34H34I45H34I45I45J 56H34I45I45J 56M#89F$9:'#$4kCXY!#J>^_."  _>_`+    "   .-.r  c                       e Zd Zd Zd Zy)_NewThreadStartupWithTracec                 .    || _         || _        || _        y r8   original_funcrs   r  r;   r  rs   r  s       r   r<   z#_NewThreadStartupWithTrace.__init__<      *	r   c           	         t               }d }|t        | j                  dt        | j                  dd             }t        |t        j
                        st	        j                         }t        |dd      s(t        |      }|j                  ||       t        |       t        |dd       	 ddl
m}  |||       	  | j                  | j                  i | j                   }|#|!|j#                          |j%                  |       |S #  t        j                  j                  d       Y qxY w# |%|"|j#                          |j%                  |       w w w xY w)	N__self__im_selfis_pydev_daemon_threadFthread_analyserr   )log_new_threadz-Failed to detect new thread for visualization)r   r   r  r   r   Threadcurrent_threadr   notify_thread_createdr   D_pydevd_bundle.pydevd_concurrency_analyser.pydevd_concurrency_loggerr  r   stderrwriters   r  disable_tracingnotify_thread_not_alive)r;   re  	thread_idtr  r   s         r   __call__z#_NewThreadStartupWithTrace.__call__A  sQ    $%	
 **J@R@RT]_c8deAa!1!12 ,,.16>1!4	++Iq9,U3u/6BVs"5!,	=$$$$dii?4;;?C$$ ))+11)<
VJJ$$%TU $$ ))+11)<	 % %s   ,D	 <&D/ 	!D,/)ENrB   rC   rD   r<   r  r   r   r   r  r  :  s    
&r   r  c                       e Zd Zd Zd Zy)_NewThreadStartupWithoutTracec                 .    || _         || _        || _        y r8   r  r  s       r   r<   z&_NewThreadStartupWithoutTrace.__init__l  r  r   c                 N     | j                   | j                  i | j                  S r8   r  r:   s    r   r  z&_NewThreadStartupWithoutTrace.__call__q  s"    !t!!499<<<r   Nr  r   r   r   r  r  j  s    
=r   r  c                  v    g } 	 dd l }| j                  |       | j                  t               | S #  dd l}Y 0xY wrx   )thread_threadr   r   )threading_modules_to_patchr  s     r   _get_threading_modules_to_patchr  x  s>    !#  %%g.%%i0%%s   0 8c                 8   t        | dd       =| t        u r!t        | d      sy | j                  x| _        n | j
                  x| _        n| j                   G fdd      } |       j                  }	 | t        u r|| _        y || _        || _        y #  Y y xY w)N_original_start_new_thread_start_new_threadc                       e Zd Zdi f fd	Zy)9patch_thread_module.<locals>.ClassWithPydevStartNewThreadr   c                 ,     t        |||      d      S )z
            We need to replace the original thread_module.start_new_thread with this function so that threads started
            through it and not through the threading module are properly traced.
            r   )_UseNewThreadStartup)r;   functionrs   r  r  s       r   pydev_start_new_threadzPpatch_thread_module.<locals>.ClassWithPydevStartNewThread.pydev_start_new_thread  s    
 ..B8TSY.Z\^__r   N)rB   rC   rD   r  )r  s   r   ClassWithPydevStartNewThreadr    s    8:2 	`r   r  )r   r   r_   r  r  start_new_threadr  	start_new)thread_moduler  r  r  s      @r   patch_thread_moduler    s    }:DAII%=*=>TaTsTss&)QTaTrTrr&)Q%2%M%M"` `" :;RR	 I%.DM+-CM*&<M#s   6B B Bc                  0    t         D ]  } t        |         y r8   )r  r  r  s    r   patch_thread_modulesr    s    ' Ar   c                      t         D ]8  } 	 | j                  | _        	 | j                  | _        	 | j                  | _        : y #  Y +xY w#  Y  xY w#  Y NxY wr8   )r  r  r  r  r  r  s    r   undo_patch_thread_modulesr    se    ' 	!"!=!=A	66AK	"#">">A			s!   AA
AA
AAc                      t         ay)z_
    Can be used to temporarily stop tracing threads created with thread.start_new_thread.
    N)r  r  r   r   r   disable_trace_thread_modulesr    s
    
 9r   c                      t         ay)zZ
    Can be used to start tracing threads created with thread.start_new_thread again.
    N)r  r  r   r   r   enable_trace_thread_modulesr    s
    
 6r   c                 B    	 | j                   S #  | j                  cY S xY wr8   )r  r  )threading_modules    r   get_original_start_new_threadr    s&    1:::1000s    )F)T)Wr"   r   r   "_pydev_bundle._pydev_saved_modulesr   _pydevd_bundle.pydevd_constantsr   r   r   r   r   r	   r
   _pydev_bundler   
contextlibr   _pydevd_bundler   r   _pydevd_bundle.pydevd_defaultsr   r\   pathlibr   rG  r   dirname__file__ro   localr   r   r   r4   NodeVisitorr6   rP   rm   rv   r{   r   r   r   r}   r   	Exceptionr   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r"  r&  r+  r3  r9  r?  rB  rM  rP  rb  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s   	 	 
 8; ; ; # % < > 
  9:Y__
 - -;-`1coo 1	DN8	8)
,8
	 	@/B]@PfB3		&""       ( *Z-29Tx(aV- -`= = 2 
& => (V
$961U&  Ds   E" "E-,E-