
    "e3                        d dl Z d dl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mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZm Z m!Z!m"Z"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l0Z0d d
l1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7Z7d dl8Z8d dl9Z9d dl:m;Z; d dl<Z<d dl=Z=d dl>m?Z?m@Z@ d dlAmBZB d dlCmDZDmEZE d dlFZF	 d dlGZGd ZH G d deJ      ZKd ZLy# eI$ r d ZHY w xY w)    N)	threading)pydevd_utilspydevd_source_mappingset_additional_thread_info)InternalGetThreadStackinternal_get_completionsInternalSetNextStatementThreadinternal_reload_codeInternalGetVariableInternalGetArrayInternalLoadFullValueinternal_get_descriptioninternal_get_frameinternal_evaluate_expressionInternalConsoleExecinternal_get_variable_jsoninternal_change_variableinternal_change_variable_json!internal_evaluate_expression_jsoninternal_set_expression_json#internal_get_exception_details_jsoninternal_step_in_threadinternal_smart_step_into)CMD_THREAD_SUSPENDfile_system_encodingCMD_STEP_INTO_MY_CODECMD_STOP_ON_STARTCMD_SMART_STEP_INTO)get_current_thread_idset_protocolget_protocolHTTP_JSON_PROTOCOLJSON_PROTOCOLDebugInfoHolder
IS_WINDOWS)NetCommandFactoryJson)NetCommandFactory)	pydev_log)LineBreakpoint)get_exception_traceback_str)code_to_bytecode_representation)
DAPGrouperinterrupt_main_thread)run_as_pydevd_daemon_thread)pydevd_find_thread_by_idresume_threadsc                      t         t        j                        sK }t        j                  |      5 }|j                         }d d d        t        |ddd       t               S  fd} |       S # 1 sw Y   0xY w)Nexecr   T)dont_inheritc               3     K   t        j                        D ]	  \  } }|  j                  D ]K  }t        |t        j
                        s|j                  j                  k(  s8t        |      D ]  }|  M y wN)disfindlinestarts	co_consts
isinstancetypesCodeTypeco_filename_get_code_lines)_linenoconstcodes      ;/usr/lib/python3/dist-packages/_pydevd_bundle/pydevd_api.pyiteratez _get_code_lines.<locals>.iterate5   s{      !//5 	6
  %eU^^49J9JdN^N^9^"1%"8 %$%%s   AB B )B )r:   r;   r<   tokenizeopenreadcompiler>   )rB   pathfsrcrD   s   `    rC   r>   r>   -   sp    $/Dt$ ffh3fadCD"4((	% y' s   A33A<c                     t         r6   )NotImplementedError)rB   s    rC   r>   r>   (   s    !!    c                   @   e Zd Z G d de      Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdVdZd Zd Zd ZdWdZdXdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$ G d% d&e      Z%dZ&d'Z'd(Z(d)Z)d*Z* G d+ d,e      Z+	 dYd-Z,d. Z-d/ Z.d0 Z/d1 Z0d2 Z1d3 Z2d4 Z3d5 Z4d6 Z5d7 Z6d8 Z7d9 Z8d: Z9d; Z:d< Z;d= Z<d> Z=d? Z>dd@l?m@Z@ dA ZAdB ZBdC ZCdD ZDdE ZEdF ZFdG ZGeHj                  ZIdH ZJdI ZKdJ ZLdK ZMdL ZNdM ZOdN ZPdO ZQdP ZRdQ ZSdR ZTdS ZUdT ZVdU ZWy)Z	PyDevdAPIc                       e Zd ZddZd Zy)PyDevdAPI.VariablePresentationc                     t         j                  |t         j                  |t         j                  |t         j                  |i| _        y r6   )r-   SCOPE_SPECIAL_VARSSCOPE_FUNCTION_VARSSCOPE_CLASS_VARSSCOPE_PROTECTED_VARS_presentation)selfspecialfunctionclass_	protecteds        rC   __init__z'PyDevdAPI.VariablePresentation.__init__J   s8    --w..++V//	"DrN   c                      | j                   |   S r6   )rX   )rY   scopes     rC   get_presentationz/PyDevdAPI.VariablePresentation.get_presentationR   s    %%e,,rN   N)grouprb   rb   inline)__name__
__module____qualname__r^   ra    rN   rC   VariablePresentationrR   H   s    		-rN   rh   c                     d|_         y NT)ready_to_runrY   py_dbs     rC   runzPyDevdAPI.runU   s
    !rN   c                 $    |j                          y r6   )on_initializerl   s     rC   notify_initializezPyDevdAPI.notify_initializeX       rN   c                 $    |j                          y r6   )on_configuration_donerl   s     rC   notify_configuration_donez#PyDevdAPI.notify_configuration_done[   s    ##%rN   c                 $    |j                          y r6   )on_disconnectrl   s     rC   notify_disconnectzPyDevdAPI.notify_disconnect^   rr   rN   c                     t        |j                                t               t        t        fv rt
        }nt        }t        |j                  |      s |       |_        |j                  j                  |      S r6   )
r!   stripr"   r#   r$   r'   r(   r:   cmd_factorymake_protocol_set_message)rY   rm   seqprotocolcmd_factory_classs        rC   r!   zPyDevdAPI.set_protocola   s`    X^^%&>0-@@ 5 1%++->? 1 3E  ::3??rN   c                     |dk(  rd|_         nd|_         | j                  |       |j                  j                  |      S )zb
        :param ide_os: 'WINDOWS' or 'UNIX'
        :param breakpoints_by: 'ID' or 'LINE'
        IDTF)_set_breakpoints_with_id
set_ide_osr{   make_version_message)rY   rm   r}   ide_osbreakpoints_bys        rC   set_ide_os_and_breakpoints_byz'PyDevdAPI.set_ide_os_and_breakpoints_bym   s?    
 T!-1E*-2E*  55c::rN   c                 .    t        j                  |       y)z4
        :param ide_os: 'WINDOWS' or 'UNIX'
        N)pydevd_file_utilsr   )rY   r   s     rC   r   zPyDevdAPI.set_ide_os{   s     	$$V,rN   c                     ||_         y r6   )_gui_event_loop)rY   rm   gui_event_loops      rC   set_gui_event_loopzPyDevdAPI.set_gui_event_loop   s
     .rN   c                 x    |j                   j                  d|d      }|j                  j                  |       y )Nzpydevd: 
)r{   make_warning_messagewriteradd_command)rY   rm   msgcmds       rC   send_error_messagezPyDevdAPI.send_error_message   s-    44s5LM  %rN   c                     |rd|_         n|j                   rd|_        d|_         t        j                  d|j                          y )NTFzShow return values: %s)show_return_valuesremove_return_values_flagr)   debug)rY   rm   r   s      rC   set_show_return_valuesz PyDevdAPI.set_show_return_values   s;    '+E$''26/',E$0%2J2JKrN   c                 :    |j                   j                  ||      S r6   )r{   make_list_threads_message)rY   rm   r}   s      rC   list_threadszPyDevdAPI.list_threads   s      ::5#FFrN   c                 &   g }|j                         dk(  }|rt        j                         }nA|j                  d      r$t        j
                  j                  d|d       nt        |      g}|D ]  }||j                  |t        |d        y  y )N*
__frame__:zCan't suspend tasklet: r   T)suspend_other_threadsis_pause)
rz   r   get_non_pydevd_threads
startswithsysstderrwriter0   set_suspendr   )rY   rm   	thread_idthreadssuspend_allts         rC   request_suspend_threadz PyDevdAPI.request_suspend_thread   s    oo'3."99;G!!,/JJiIJ 0	:;G 	Ay"&1	   	rN   c                 &    |j                  |       y)aG  
        When disabled, no thread notifications (for creation/removal) will be
        issued until it's re-enabled.

        Note that when it's re-enabled, a creation notification will be sent for
        all existing threads even if it was previously sent (this is meant to
        be used on disconnect/reconnect).
        N)set_enable_thread_notifications)rY   rm   enables      rC   r   z)PyDevdAPI.set_enable_thread_notifications   s     	--f5rN   c                     | j                  |d       | j                  |d       | j                  |       | j                  |       |r| j	                  d       y y )NFr   )r   )r   remove_all_breakpoints remove_all_exception_breakpointsrx   request_resume_thread)rY   rm   r1   s      rC   request_disconnectzPyDevdAPI.request_disconnect   sW    ,,UE:##E3/--e4u%&&&5 rN   c                     t        |       y r6   )r1   )rY   r   s     rC   r   zPyDevdAPI.request_resume_thread   s
    y!rN   c           
      >    |j                  |t        ||||||       y )N)linecolumn)post_method_as_internal_commandr	   )rY   rm   r}   r   frame_idact_tokr   r   s           rC   request_completionszPyDevdAPI.request_completions   s*    --/i7Y]fl 	. 	nrN   Nr   c           
          t        |||t        ||||      }|j                  t        t	        j
                                     r|j                  |       y |j                  |d       y )N)fmttimeoutstart_framelevelsr   )r   r   can_be_executed_byr    r   current_threaddo_itpost_internal_command)	rY   rm   r}   r   r   r   r   r   internal_get_thread_stacks	            rC   request_stackzPyDevdAPI.request_stack   s_    $:E#=3PWepy%A!$778MiNfNfNh8ij%++E2''(A3GrN   c           
      n    |j                  |t        ||||t        |j                  j                         y )N)r   iter_visible_frames_info)r   r   r   r{   _iter_visible_frames_info)rY   rm   requestr   thread
max_framess         rC   request_exception_info_jsonz%PyDevdAPI.request_exception_info_json   s9    --/'A%*%6%6%P%P 	. 		
rN   c                     t        |      }|r|j                  |t        ||t               y |j	                  d      r$t
        j                  j                  d|d       y y )Nr   r   z!Can't make tasklet step command: r   )r0   r   r   r   r   r   r   r   )rY   rm   r   step_cmd_idr   s        rC   request_stepzPyDevdAPI.request_step   s[    $Y/11'+E 2  !!,/JJ	ST 0rN   c                     t        |      }|r |j                  |t        |||t               y |j	                  d      r$t
        j                  j                  d|d       y y )Nr   r   %Can't set next statement in tasklet: r   )r0   r   r   r   r   r   r   r   )rY   rm   r}   r   offsetchild_offsetr   s          rC   request_smart_step_intoz!PyDevdAPI.request_smart_step_into   s^    $Y/113Y  rL 2 M!!,/JJIWX 0rN   c           	      :    | j                  |||t        d ||       y r6   )request_set_nextr   )rY   rm   r}   r   r   	func_names         rC   $request_smart_step_into_by_func_namez.PyDevdAPI.request_smart_step_into_by_func_name   s    eS)5H$PTV_`rN   c                    t        |      }|r|| j                  |      }	t        j                  d|	|       | j	                  |      }|	j
                  t        k(  sJ |j
                  t        k(  sJ |j                  j                  |	|      \  }
}}|rt        j                  d|	|       |}t        |||||      }|j                  ||       y|j                  d      r$t        j                  j                  d|d       yy)az  
        set_next_cmd_id may actually be one of:

        CMD_RUN_TO_LINE
        CMD_SET_NEXT_STATEMENT

        CMD_SMART_STEP_INTO -- note: request_smart_step_into is preferred if it's possible
                               to work with bytecode offset.

        :param Optional[str] original_filename:
            If available, the filename may be source translated, otherwise no translation will take
            place (the set next just needs the line afterwards as it executes locally, but for
            the Jupyter integration, the source mapping may change the actual lines and not only
            the filename).
        Nz1Set next (after path translation) in: %s line: %sz/Set next (after source mapping) in: %s line: %s)r}   r   r   r   )r0   filename_to_serverr)   r   to_str	__class__strsource_mappingmap_to_serverr
   r   r   r   r   r   )rY   rm   r}   r   set_next_cmd_idoriginal_filenamer   r   r   translated_filename_source_mapped_filenamenew_linemulti_mapping_appliedint_cmds                 rC   r   zPyDevdAPI.request_set_next   s     %Y/ ,&*&=&=>O&P# SUhjno KK	2	*44;;; **c111 LQK_K_KmKm'L/H'3H(OO$UWjlpq#D4YQUW`fijG'';!!,/JJIWX 0rN   c                 :    d}|j                  |t        |||       y)z
        :param seq: if -1 no message will be sent back when the reload is done.

        Note: either module_name or filename may be None (but not both at the same time).
        r   N)r   r   )rY   rm   r}   module_namefilenamer   s         rC   request_reload_codezPyDevdAPI.request_reload_code  s&     	 	--+S+x	IrN   c           
      <    |j                  |t        ||||||       yz3
        :param scope: 'FRAME' or 'GLOBAL'
        N)r   r   )rY   rm   r}   r   r   r`   attrvalues           rC   request_change_variablez!PyDevdAPI.request_change_variable+  s'     	--/i5RVX]	_rN   c                 F    t        |||||      }|j                  ||       yr   )r   r   )rY   rm   r}   r   r   r`   attrsr   s           rC   request_get_variablezPyDevdAPI.request_get_variable2  s&     &c9huM##GY7rN   c                 P    t        ||||||||	|
|
      }|j                  ||       y r6   )r   r   )rY   rm   r}   roffsetcoffsetrowscolsr   r   r   r`   r   r   s                rC   request_get_arrayzPyDevdAPI.request_get_array9  s1    "3$c9V^`eglm##GY7rN   c                 D    t        ||||      }|j                  ||       y r6   )r   r   )rY   rm   r}   r   r   varsr   s          rC   request_load_full_valuez!PyDevdAPI.request_load_full_value=  s"    'Y$G##GY7rN   c                 8    |j                  |t        ||||       y r6   )r   r   )rY   rm   r}   r   r   
expressions         rC   request_get_descriptionz!PyDevdAPI.request_get_descriptionA  s    --/i:	WrN   c                 6    |j                  |t        |||       y r6   )r   r   )rY   rm   r}   r   r   s        rC   request_get_framezPyDevdAPI.request_get_frameE  s    --)3	8	ErN   c                 d    |j                   t        k7  rt        d|d|j                   d      |S zD
        -- in py3 raises an error if it's not str already.
        z)Expected to have str on Python 3. Found: z ()r   r   AssertionError)rY   ss     rC   r   zPyDevdAPI.to_strI  s-     ;;# WXZ[ZeZe!fggrN   c                 d    |j                   t        k7  rt        d|d|j                   d      |S r  r  rY   r   s     rC   filename_to_strzPyDevdAPI.filename_to_strQ  s/     $ W_aiasas!tuurN   c                 R    | j                  |      }t        j                  |      }|S r6   )r  r   map_file_to_serverr  s     rC   r   zPyDevdAPI.filename_to_serverY  s'    ''1$77ArN   c                   ,    e Zd ZdZ G d de      Zd Zy)PyDevdAPI._DummyFramez
        Dummy frame to be used with PyDB.apply_files_filter (as we don't really have the
        related frame as breakpoints are added before execution).
        c                       e Zd Zd Zy) PyDevdAPI._DummyFrame._DummyCodec                 .    d| _         || _        d| _        y )N   zinvalid func name )co_firstlinenor=   co_namer  s     rC   r^   z)PyDevdAPI._DummyFrame._DummyCode.__init__f  s    &'##+ 3rN   N)rd   re   rf   r^   rg   rN   rC   
_DummyCoder  d  s    4rN   r  c                 >    | j                  |      | _        i | _        y r6   )r  f_code	f_globalsr  s     rC   r^   zPyDevdAPI._DummyFrame.__init__k  s    //(3DKDNrN   N)rd   re   rf   __doc__objectr  r^   rg   rN   rC   _DummyFramer  ^  s    	
	4 	4	 rN   r  r           c                       e Zd Zg dZd Zy)PyDevdAPI._AddBreakpointResult)
error_codebreakpoint_idr   translated_lineoriginal_linec                 f    t         j                  | _        || _        || _        || _        || _        y r6   )rP   ADD_BREAKPOINT_NO_ERRORr#  r$  r   r%  r&  )rY   r$  r   r%  r&  s        rC   r^   z'PyDevdAPI._AddBreakpointResult.__init__  s/    '??DO!.D':D$#2D !.DrN   N)rd   re   rf   	__slots__r^   rg   rN   rC   _AddBreakpointResultr"  x  s     o		/rN   r*  c                    |j                   t        k(  sJ d|j                          t        j                  |      }t	        j
                  d||       |}||||||||	|
|f
}| j                  |      }t	        j
                  d||       | j                  |      }|j                   t        k(  sJ |j                   t        k(  sJ |j                  j                  ||      \  }}}|rEt	        j
                  d||       | j                  ||||      }|}t        j                  |      }|}nt        j                  |      }t        j                  |      }|rN|j                  d      s=	 t        t!        |            }||vr$t#        j$                  ||      }|dkD  r	||dz
     }	 | j                  ||||      }||f|j(                  ||f<   |j                  d      swt        j*                  |      s| j,                  |_        |S |j0                  rC|j3                         s3|j5                  | j7                  |      |d      r| j8                  |_        |d	k(  r.t;        ||||||	|
|
      }|j<                  }|j>                  }d}nJd}|jA                         }||jC                  d|||||||||
|||      }|d}|\  }}|jD                  }nd}|stG        |      t	        j
                  d|||       |v r||   } ni x} ||<   | |<   |jI                  ||        |jJ                  =|jJ                  jM                         |_'        |jJ                  jQ                  ||| |       |jS                          |S # t&        $ r Y w xY w)a	  
        :param str original_filename:
            Note: must be sent as it was received in the protocol. It may be translated in this
            function and its final value will be available in the returned _AddBreakpointResult.

        :param str breakpoint_type:
            One of: 'python-line', 'django-line', 'jinja2-line'.

        :param int breakpoint_id:

        :param int line:
            Note: it's possible that a new line was actually used. If that's the case its
            final value will be available in the returned _AddBreakpointResult.

        :param condition:
            Either None or the condition to activate the breakpoint.

        :param str func_name:
            If "None" (str), may hit in any context.
            Empty string will hit only top level.
            Any other value must match the scope of the method to be matched.

        :param str expression:
            None or the expression to be evaluated.

        :param suspend_policy:
            Either "NONE" (to suspend only the current thread when the breakpoint is hit) or
            "ALL" (to suspend all threads when a breakpoint is hit).

        :param str hit_condition:
            An expression where `@HIT@` will be replaced by the number of hits.
            i.e.: `@HIT@ == x` or `@HIT@ >= x`

        :param bool is_logpoint:
            If True and an expression is passed, pydevd will create an io message command with the
            result of the evaluation.

        :param bool adjust_line:
            If True, the breakpoint line should be adjusted if the current line doesn't really
            match an executable line (if possible).

        :param callable on_changed_breakpoint_state:
            This is called when something changed internally on the breakpoint after it was initially
            added (for instance, template file_to_line_to_breakpoints could be signaled as invalid initially and later
            when the related template is loaded, if the line is valid it could be marked as valid).

            The signature for the callback should be:
                on_changed_breakpoint_state(breakpoint_id: int, add_breakpoint_result: _AddBreakpointResult)

                Note that the add_breakpoint_result should not be modified by the callback (the
                implementation may internally reuse the same instance multiple times).

        :return _AddBreakpointResult:
        zExpected str, found: z&Request for breakpoint in: %s line: %sz3Breakpoint (after path translation) in: %s line: %sz1Breakpoint (after source mapping) in: %s line: %s<r   r  Fpython-line)hit_conditionis_logpointTNadd_line_breakpoint)r.  r/  add_breakpoint_resulton_changed_breakpoint_statez-Added breakpoint:%s - line:%s - func_name:%s
)*r   r   r   normcase_from_clientr)   r   r   r   r   r   r*  normcaseabsolute_pathcanonical_normalized_pathr   sortedr>   bisectbisect_left	Exceptionapi_received_breakpointsexistsADD_BREAKPOINT_FILE_NOT_FOUNDr#  is_files_filter_enabledget_require_module_for_filtersapply_files_filterr  'ADD_BREAKPOINT_FILE_EXCLUDED_BY_FILTERSr*   breakpointsfile_to_id_to_line_breakpointget_plugin_lazy_initadd_breakpointfile_to_id_to_plugin_breakpoint	NameErrorconsolidate_breakpointspluginhas_line_breakshas_plugin_line_breaksafter_breakpoints_consolidatedon_breakpoints_changed)!rY   rm   r   breakpoint_typer$  r   	conditionr   r   suspend_policyr.  r/  adjust_liner2  original_filename_normalizedr&  api_add_breakpoint_paramsr   source_mapped_filenamer   r   resulttranslated_absolute_filenamecanonical_normalized_filenamelinesidxadded_breakpointfile_to_line_to_breakpointsfile_to_id_to_breakpointsupported_typeadd_plugin_breakpoint_resultrI  id_to_pybreakpoints!                                    rC   rE  zPyDevdAPI.add_breakpoint  s!   r !**c1mPaPkPk3mm1'8'M'MN_'`$@BSUYZ%6X\^gir{%D! #556GHMObdhiKK	*	",,333""c))) CHBVBVBdBdC'?*? !OOOQgiqr
 ..}>OQUWdeF ,B(,=,F,FG],^)D ,=+J+JK^+_(,=,W,WXk,l)#?#J#J3#O	2"?3O#PQE 5($00=7#(q>D..}>OQUWdeFYv  yR  YS&&(Dm'TU+66s; %++,HI$($F$F! 11<<>,,T-=-=>Z-[]y  |A  B %)$P$P!m+-tY	:~er  AL M +0*;*;'','J'J$!N ,0(//1F!/5/D/D)5/C`!4J	Yft*0Ni 0E 0k,
 ,7!%@\= "=+0+P+P(!&O,,HJgimoxy(,DD!9:W!X[]]!9:W!X,<=)%%&CEWYtu<<#+0<<+G+G+IE(LL77?\^p  sN  O$$&[ ! s   *M; ;	NNc                     t        j                  d       t        |j                  j	                               }| j                  |d       |D ]  }|\  }} | j                  |g|   y)z
        Reapplies all the received breakpoints as they were received by the API (so, new
        translations are applied).
        zReapplying breakpoints.r   N)r)   r   listr;  valuesr   rE  )rY   rm   rb  val_new_filenamerS  s         rC   reapply_breakpointszPyDevdAPI.reapply_breakpoints;  sl    
 	12e44;;=>##E3/ 	CC7:4M4DB(AB	CrN   c                    |j                   t        k(  sJ d}|j                  |j                  |j                  g}t        |d      r|j                  |j                         t        |d      r|j                  |j                         |dk(  r7|j                  j                          |D ]  }|s|j                          d} nt        j                  |      }t        |j                  j                               }g }|D ]3  \  }	}
|	\  }}||k(  s|
\  }}|j                  |       |j                  |	= 5 |D ]"  }|D ]  }||v s|j                  |d       d} $ |r|j!                  d       yy)a  
        Removes all the breakpoints from a given file or from all files if received_filename == '*'.

        :param str received_filename:
            Note: must be sent as it was received in the protocol. It may be translated in this
            function.
        Fdjango_breakpointsjinja2_breakpointsr   TNremoved)r   r   rC  rF  rB  hasattrappendrg  rh  r;  clearr   r3  ra  itemspoprM  )rY   rm   received_filenamechangedlstr\  received_filename_normalizedrn  translated_filenameskeyrc  rR  _breakpoint_idrW  _api_add_breakpoint_paramss                  rC   r   z PyDevdAPI.remove_all_breakpointsG  s    !**c111//11

 5./JJu//05./JJu//0#**002,/ #(+,224"G# ,=+Q+QRc+d(77==?@E#% ! <S?B<,n/3OOPSM13M(//0MN66s;< 2F '-03 ',48PP0445RTXY"&'' (((6 rN   c                 ,   t        j                  |      }t        |j                  j	                               D ])  \  }}|\  }}	|\  }
}||k(  s|	|k(  s|j                  |=  n t        j                  d||       d}| j                  |      }t        j                  |      }|dk(  r|j                  }|j                  }n8|j                  ,|j                  j                  ||      }||j                  }|}|t        j                  d|       n	 |j                  |i       }t         j"                  dk\  r;||   }t        j                  d|d|j$                  d|j&                  d	|d
	       ||= |j)                  ||       |j                  =|j                  j+                         |_        |j                  j/                  ||||       |j3                  d       y# t0        $ r$ t        j                  d||t                     Y ?w xY w)a.  
        :param str received_filename:
            Note: must be sent as it was received in the protocol. It may be translated in this
            function.

        :param str breakpoint_type:
            One of: 'python-line', 'django-line', 'jinja2-line'.

        :param int breakpoint_id:
        z9Did not find breakpoint to remove: %s (breakpoint id: %s)Nr-  z>Error removing breakpoint. Cannot handle breakpoint of type %sr  zRemoved breakpoint:z - line:z - func_name:z (id: z)
zQError removing breakpoint: Breakpoint id not found: %s id: %s. Available ids: %s
Tri  )r   r3  ra  r;  rn  r)   infor   r6  rB  rC  rI  get_breakpointsrF  criticalgetr%   DEBUG_TRACE_LEVELr   r   rH  rJ  rK  rL  KeyErrorrM  )rY   rm   rp  rN  r$  rs  ru  rc  rR  existing_breakpoint_idrd  rw  r\  rW  r[  rU  r_  existings                     rC   remove_breakpointzPyDevdAPI.remove_breakpointy  s*    (9'M'MN_'`$U;;AACD 	oHCCF@(*@8;5M5+/KKPfjwPw2237	o NNKM^`mo $(  334EF(9(S(STe(f%m+*/*;*;'','J'J$\\%\\11%IF!+0+P+P(.4+#+_apq\%=%A%AB_ac%d""4491-@HNN5x}}hFXFXZg$i j '}5--.KM_a|}<<+38<<3O3O3QE0LL??Gdfx  {V  W 	$$T$2	  \s1=$GYBZ\\s   B?G& &*HHc                 b    i }|D ]  }|||j                   <    ||_        |j                          y r6   )r   &function_breakpoint_name_to_breakpointrM  )rY   rm   function_breakpointsr  function_breakpoints        rC   set_function_breakpointsz"PyDevdAPI.set_function_breakpoints  sC    13.#7 	hTg23F3P3PQ	h 8^4$$&rN   c	                 >    |j                  |t        |||||||	       y r6   )r   r   )	rY   rm   r}   r   r   r   is_exectrim_if_too_bigattr_to_set_results	            rC   request_exec_or_evaluatez"PyDevdAPI.request_exec_or_evaluate  s'    --3Hj'?L^	`rN   c                 4    |j                  |t        ||       y r6   )r   r   rY   rm   r   r   s       rC   request_exec_or_evaluate_jsonz'PyDevdAPI.request_exec_or_evaluate_json  s    --8'9	NrN   c                 4    |j                  |t        ||       y r6   )r   r   r  s       rC   request_set_expression_jsonz%PyDevdAPI.request_set_expression_json  s    --3Wi	IrN   c                 D    t        ||||      }|j                  ||       y r6   )r   r   )rY   rm   r}   r   r   r   r   s          rC   request_console_execzPyDevdAPI.request_console_exec  s"    %c9h
K##GY7rN   c                    	 | j                  |      }|j                  t        k(  sJ t        j                  |      5 }|j                         }ddd       |j                  j                  |      }|j                  j                  |       y# 1 sw Y   AxY w#  |j                  j                  |t                     }Y PxY w)z
        :param str filename:
            Note: must be sent as it was received in the protocol. It may be translated in this
            function.
        N)r   r   r   rE   rF   rG   r{   make_load_source_messagemake_error_messager+   r   r   )rY   rm   r}   r   streamsourcer   s          rC   request_load_sourcezPyDevdAPI.request_load_source  s    	[..x8H%%,,,x( 'F'##<<S&IC 	  %' '	[##66s<W<YZCs"   ;B B$B BB &Cc                 (   |j                   j                  t        |            }|j                  fdt	        j
                  d      D        }t	        j                  t        |      }dj                  |      }|st        j                        }|S )z
        :param py_db:
        :param frame_id:
        :throws Exception:
            If unable to get the frame in the currently paused frames or if some error happened
            when decompiling.
        c              3   r   K   | ].  }t        j                  j                  j                  |       0 y wr6   )	linecachegetliner  r=   ).0iframes     rC   	<genexpr>z@PyDevdAPI.get_decompiled_source_from_frame_id.<locals>.<genexpr>  s(     \A""5<<#;#;Q?\s   47r   )suspended_frames_managerget_variableintr   	itertoolscount	takewhilebooljoinr,   r  )rY   rm   r   variablerX  r  r  s         @rC   #get_decompiled_source_from_frame_idz-PyDevdAPI.get_decompiled_source_from_frame_id  st     11>>s8}M ]YZI[\##D%04U\\BFrN   c                     	 | j                  ||      }|j                  j                  ||      }|j
                  j                  |       y #  |j                  j                  |t	                     }Y DxY wr6   )r  r{   &make_load_source_from_frame_id_messager  r+   r   r   )rY   rm   r}   r   r  r   s         rC   !request_load_source_from_frame_idz+PyDevdAPI.request_load_source_from_frame_id  sk    	[==eXNF##JJ3PVWC 	  %	[##66s<W<YZCs   .A &A4c
           
      \    |j                  ||||||||	      }
|
|j                          y y )N)rO  r   notify_on_handled_exceptionsnotify_on_unhandled_exceptions#notify_on_user_unhandled_exceptionsnotify_on_first_raise_onlyignore_libraries)add_break_on_exceptionrM  )rY   rm   	exceptionrO  r   r  r  r  r  r  exception_breakpoints              rC   add_python_exception_breakpointz)PyDevdAPI.add_python_exception_breakpoint  sK      %;;!)E+I0S'A-  < 	 
  +((* ,rN   c                     d}|j                         }||j                  d|||      }|r0|j                  j                         |_        |j                          y t        |      )NFadd_exception_breakpoint)rD  rE  rI  has_exception_breakshas_plugin_exception_breaksrM  rG  )rY   rm   rN  r  r]  rI  s         rC    add_plugins_exception_breakpointz*PyDevdAPI.add_plugins_exception_breakpoint  sc    ++-#223MuVegpqN050Q0Q0SE-((*O,,rN   c                    	 |j                   j                         }|j                  |d        ||_         |j                  j                         }|j                  |d        ||_        |j                  j                         }|j                  |d        ||_        |j                  d       y #  t        j                  dt        j                         d          Y BxY w)Nz!Error while removing exception %sr   Tri  )
break_on_uncaught_exceptionscopyro  break_on_caught_exceptions!break_on_user_uncaught_exceptionsr)   r  r   exc_inforM  )rY   rm   r  cps       rC   "remove_python_exception_breakpointz,PyDevdAPI.remove_python_exception_breakpoint%  s    	X3388:BFF9d#13E.11668BFF9d#/1E,88==?BFF9d#68E3 	$$T$2	X CS\\^TUEVWs   BB. .-Cc                     |j                   }|y |j                  |||      }|r |j                   j                         |_        nt	        j
                  d|       |j                  d       y )Nz3No exception of type: %s was previously registered.Tri  )rI  remove_exception_breakpointr  r  r)   ry  rM  )rY   rm   exception_typer  rI  r]  s         rC   #remove_plugins_exception_breakpointz-PyDevdAPI.remove_plugins_exception_breakpoint7  sc     >;;E>S\]050Q0Q0SE-NNPR`a$$T$2rN   c                     i |_         i |_        i |_        |j                  }||j	                  |       |j                  d       y )NTri  )r  r  r  rI  r   rM  )rY   rm   rI  s      rC   r   z*PyDevdAPI.remove_all_exception_breakpointsG  sH    -/*+-(24/33E:$$T$2rN   c                 &    |j                  |       y)z+
        :param str project_roots:
        N)set_project_roots)rY   rm   project_rootss      rC   r  zPyDevdAPI.set_project_rootsQ  s     	.rN   c                     ||_         y r6   )stepping_resumes_all_threads)rY   rm   r  s      rC    set_stepping_resumes_all_threadsz*PyDevdAPI.set_stepping_resumes_all_threadsW  
    -I*rN   )ExcludeFilterc                 &    |j                  |       y)zG
        :param list(PyDevdAPI.ExcludeFilter) exclude_filters:
        N)set_exclude_filters)rY   rm   exclude_filterss      rC   r  zPyDevdAPI.set_exclude_filters]  s     	!!/2rN   c                 &    |j                  |       y r6   )set_use_libraries_filter)rY   rm   use_libraries_filters      rC   r  z"PyDevdAPI.set_use_libraries_filterc  s    &&';<rN   c                 2    |j                  |t        |       y)z2
        :param VariablesRequest request:
        N)r   r   r  s       rC   request_get_variable_jsonz#PyDevdAPI.request_get_variable_jsonf  s     	--17	<rN   c                 2    |j                  |t        |       y)z4
        :param SetVariableRequest request:
        N)r   r   r  s       rC   request_change_variable_jsonz&PyDevdAPI.request_change_variable_jsonm  s     	--4g	?rN   c                    t        d D              t        d D              d}|j                  j                  dk(  }|sssy |j                         s9|r5|j                  j                  k7  xs |j                  j
                  k7  }nd}fd}|_        |_        ||_        |r|j                          y y )Nc              3   F   K   | ]  }t        j                  |        y wr6   r   r4  r  xs     rC   r  z>PyDevdAPI.set_dont_trace_start_end_patterns.<locals>.<genexpr>v  s     U099!<U   !c              3   F   K   | ]  }t        j                  |        y wr6   r  r  s     rC   r  z>PyDevdAPI.set_dont_trace_start_end_patterns.<locals>.<genexpr>w  s     Qq.77:Qr  F custom_dont_trace_external_filesTc                 v    t        j                  |       }|j                        xs |j                        S r6   )r   r4  r   endswith)abs_pathnormalized_abs_pathend_patternsstart_patternss     rC   r  zUPyDevdAPI.set_dont_trace_start_end_patterns.<locals>.custom_dont_trace_external_files  s7    "3"<"<X"F&11.AoEXEaEabnEoorN   )tupledont_trace_external_filesrd   is_cache_file_type_emptyr  r  *clear_dont_trace_start_end_patterns_caches)rY   rm   r  r  reset_caches,dont_trace_start_end_patterns_previously_setr  s     ``   rC   !set_dont_trace_start_end_patternsz+PyDevdAPI.set_dont_trace_start_end_patternst  s    UnUUQLQQ ++448ZZ 	5 <N[g--/;$>>MMQ__  Q33@@LP   $	p ;I(78D(5*J'<<> rN   c                     t        j                         }|t        j                  d       y t	        |      }t
        |_        t        |_        y )Nz7Could not find main thread while setting Stop on Entry.)	r   get_main_threadr)   r{  r   r   pydev_original_step_cmdr   pydev_step_cmd)rY   main_threadry  s      rC   stop_on_entryzPyDevdAPI.stop_on_entry  s?    "224XY-k:D+<D("7DrN   c                 &    |j                  |       y r6   )set_ignore_system_exit_codes)rY   rm   ignore_system_exit_codess      rC   r  z&PyDevdAPI.set_ignore_system_exit_codes  s    **+CDrN   c                     | j                  |      }t        j                  |      }|D ]	  }||_         |j                  j                  ||      }|r|S | j                  |       y)a  
        :param str source_filename:
            The filename for the source mapping (bytes on py2 and str on py3).
            This filename will be made absolute in this function.

        :param list(SourceMappingEntry) mapping:
            A list with the source mapping entries to be applied to the given filename.

        :return str:
            An error message if it was not possible to set the mapping or an empty string if
            everything is ok.
        r  )r   r   r5  source_filenamer   set_source_mappingre  )rY   rm   r  mappingabsolute_source_filename	map_entry	error_msgs          rC   r  zPyDevdAPI.set_source_mapping  sr     11/B#4#B#B?#S   	AI(@I%	A((;;<TV]^	  'rN   c                 B    t        || j                        sJ ||_        y r6   )r:   rh   variable_presentation)rY   rm   r  s      rC   set_variable_presentationz#PyDevdAPI.set_variable_presentation  s!    /1J1JKKK&;#rN   c                     d}	 t        j                         }|t        r| j	                         }|S # t        $ r Y %w xY w)zY
        Provides the parent pid (even for older versions of Python on Windows).
        N)osgetppidAttributeErrorr&   _get_windows_ppid)rY   ppids     rC   get_ppidzPyDevdAPI.get_ppid  sI     	::<D <J))+D  		s   2 	>>c                 b    t        j                         }t               D ]  \  }}||k(  s|c S  y r6   )r  getpid_list_ppid_and_pid)rY   this_pidr
  pids       rC   r	  zPyDevdAPI._get_windows_ppid  s4    99;+- 	ID#h	 rN   c           
      H   t        j                         }t        d      D ]  }g }t               D ]!  \  }}||k(  s||vs|j	                  |       # |s y |D ]@  }| j                  dddt        |      dgt        j                  t        j                         B |d d =  y )N2   taskkillz/Fz/PIDz/Tstdoutr   )	r  r  ranger  rl  _callr   
subprocessPIPE)rY   dont_terminate_child_pidsr  r?   children_pidsr
  r  s          rC   "_terminate_child_processes_windowsz,PyDevdAPI._terminate_child_processes_windows  s    99;r 	%A
 M/1 2	c8#";;%,,S12
 !( CJJ#T63s8TB))   "!$+	%rN   c           	      L    t        j                         }d	 fd	t               }t        d      D ]m  } |d      }d}|D ]V  }||vsd}|j	                  |        j                  ddt        |      gt        j                  t        j                         X |rm y  y )
NTc                    g }|r<
j                  ddt        |       gt        j                  t        j                         
j	                  ddt        |       gt        j                  t        j                        }||j                         \  }}|j                         D ]\  }|j                  d      j                         }|s%t        |      }|v r5|j                  |       |j                   	|             ^ |S )Nkillz-STOPr  pgrepz-Pascii)r  r   r  r  _popencommunicate
splitlinesdecoderz   rl  extend)initial_pidstopr  
list_popenr  r?   r   r  r  list_children_and_stop_forkingrY   s           rC   r*  zZPyDevdAPI._terminate_child_processes_linux_and_mac.<locals>.list_children_and_stop_forking  s    M

Wc+&67%??%??   $K 01!! % J %&224	"--/ RD;;w/557D!$i";;$%,,S1%,,-KC-PQR ! rN   r  F)r(  r  z-KILLr  )T)	r  r  setr  addr  r   r  r  )	rY   r  r  previously_foundr?   r  	found_newr  r*  s	   ``      @rC   (_terminate_child_processes_linux_and_macz2PyDevdAPI._terminate_child_processes_linux_and_mac  s    99;	!: 5r 	A:8%PMI$ .. $I$((-JJ#c(3))  	 !	rN   c                     	 t        j                  |fi |S #  t        j                  dk\  r't	        j
                  ddj                  |      z         Y y xY wNr  zError running: %s )r  Popenr%   r}  r)   r  r  rY   cmdlinekwargss      rC   r"  zPyDevdAPI._popen&  sR    	##G6v66	00A5##$7388G;L$MNs	    <Ac                     	 t        j                  |fi | y #  t        j                  dk\  r)t	        j
                  ddj                  |      z         Y y Y y xY wr1  )r  
check_callr%   r}  r)   r  r  r4  s      rC   r  zPyDevdAPI._call.  sS    	O!!'4V4	O00A5##$7388G;L$MN 6s	    <Ac                     ||_         y r6   )terminate_child_processes)rY   rm   r:  s      rC   set_terminate_child_processesz'PyDevdAPI.set_terminate_child_processes5  s
    *C'rN   c                     ||_         y r6   )terminate_keyboard_interrupt)rY   rm   r=  s      rC    set_terminate_keyboard_interruptz*PyDevdAPI.set_terminate_keyboard_interrupt8  r  rN   c                 t   	 |j                   rRt        j                  d       t        r| j	                  |j
                         n| j                  |j
                         t        j                  d       t        j                  d       y# t        j                  d       t        j                  d       w xY w)z
        Terminates the current process (and child processes if the option to also terminate
        child processes is enabled).
        zTerminating child processes.zExiting process (os._exit(0)).r   N)	r:  r)   r   r&   r  r  r/  r  _exitrl   s     rC   terminate_processzPyDevdAPI.terminate_process;  s|    
		.. >?;;E<[<[\AA%BaBabOO<=HHQK OO<=HHQKs   AB ,B7c                 F    |j                          | j                  |       y r6   )#dispose_and_kill_all_pydevd_threadsrA  rl   s     rC    _terminate_if_commands_processedz*PyDevdAPI._terminate_if_commands_processedK  s    113u%rN   c                     |j                   r|j                  sd|_        t                y d|_        t	        || j
                  |       y rj   )r=  keyboard_interrupt_requestedr.   terminate_requestedr/   rD  rl   s     rC   request_terminate_processz#PyDevdAPI.request_terminate_processO  sB    --55592%' %)!#E4+P+PRWXrN   c                 .    |j                  |||||       y r6   )setup_auto_reload_watcher)rY   rm   enable_auto_reload
watch_dirspoll_target_timeexclude_patternsinclude_patternss          rC   rJ  z#PyDevdAPI.setup_auto_reload_watcher[  s    ''(:JHXZjl|}rN   )r   )rP  )Ng      ?r   r   )FN)Xrd   re   rf   r  rh   rn   rq   ru   rx   r!   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r   r  r(  r=  rA  ADD_BREAKPOINT_LAZY_VALIDATIONADD_BREAKPOINT_INVALID_LINEr*  rE  re  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  _pydevd_bundle.pydevd_filteringr  r  r  r  r  r  r  r  r   SourceMappingEntryr  r  r  r	  r  r/  r"  r  r;  r>  rA  rD  rH  rJ  rg   rN   rC   rP   rP   F   s   -v -"&
@;-/&LG4	66"nH

UYa$YL
I_888WE
 f  "  $%!./+ &'""#/v /& txpd
C07d93v'`N
I8&$*&+4
-3$3 3/J >3=<?!?F8E /AA0< %22hODJ &
Y~rN   rP   c                     d}  G d dt         j                        }t         j                  j                  }|j	                  | d      }g }	  |       }t        j
                  |      |_        |j                  t        j                  |      t        j                  |            st        j                  d       nb	 |j                  |j                  |j                  f       |j                  t        j                  |      t        j                  |            sna|j!                  |       |S # |j!                  |       w xY w)Nr  c                      e Zd Zdej                  fdej                  fdej                  fdej
                  fdej                  fdej                  fdej                  fdej                  fd	ej                  fd
ej                  dz  fg
Zy)*_list_ppid_and_pid.<locals>.PROCESSENTRY32dwSizecntUsageth32ProcessIDth32DefaultHeapIDth32ModuleID
cntThreadsth32ParentProcessIDpcPriClassBasedwFlags	szExeFilei  N)	rd   re   rf   ctypesc_uint32c_size_tc_longc_char_fields_rg   rN   rC   PROCESSENTRY32rW  b  s    v/1$foo6(&//:#V__5!6??3*FOO<%v}}50 &--#"56	8rN   rh  r   zFProcess32First failed (getting process from CreateToolhelp32Snapshot).)rb  	Structurewindllkernel32CreateToolhelp32SnapshotsizeofrX  Process32Firstc_void_pbyrefr)   r{  rl  r^  rZ  Process32NextCloseHandle)_TH32CS_SNAPPROCESSrh  rk  snapshotppid_and_pidsprocess_entrys         rC   r  r  _  s   $
8)) 
8 }}%%H001DaHHM'&(%}}^<&&vx'@&,,}B]^gh$$m&G&GIdId%ef--fooh.GVcIde 
 	X& 	X&s   CD/ /E)Mr   r8  r;   "_pydev_bundle._pydev_saved_modulesr   _pydevd_bundler   r   ,_pydevd_bundle.pydevd_additional_thread_infor   _pydevd_bundle.pydevd_commr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   $_pydevd_bundle.pydevd_comm_constantsr   r   r   r   r   _pydevd_bundle.pydevd_constantsr    r!   r"   r#   r$   r%   r&   ._pydevd_bundle.pydevd_net_command_factory_jsonr'   -_pydevd_bundle.pydevd_net_command_factory_xmlr(   r   _pydev_bundler)   !_pydevd_bundle.pydevd_breakpointsr*   pydevd_tracingr+   r  r  rb  +_pydevd_bundle.pydevd_collect_bytecode_infor,   r  r  _pydevd_bundle.pydevd_utilsr-   r.   #_pydevd_bundle.pydevd_daemon_threadr/   &_pydevd_bundle.pydevd_thread_lifecycler0   r1   rE   r7   r>   ImportErrorr  rP   r  rg   rN   rC   <module>r     s    
   8 > S7 7 7 7 7 7C CD D D P K  # < 6 	   W   I K [ 2V~ V~r s!  """s   C C#"C#