
    !h9                    z   S SK Jr  S SKrS SKrS SKJr  S SKJrJrJ	r	J
r
  S SKJrJr  S SKJrJr  S SKJr  S SKJr  \(       a.  S S	KJrJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJ r   \ " S5      r!\
" S5      r"SS jr# " S S\	\"   5      r$SS jr%SS jr&S S!S jjr'S"S jr(S#S jr)S$S jr*S%S jr+S&S jr,S&S jr-g)'    )annotationsN)suppress)TYPE_CHECKINGAnyGenericTypeVar)catch_warningsfilterwarnings)asyncioreactorerror)Deferred)load_object)AbstractEventLoopAbstractEventLoopPolicy)Callable)DelayedCall)ServerFactory)Port)	ParamSpec_P_Tc                ^   SSK Jn  [        U 5      S:  a  [        SU  35      eU (       d  UR	                  SX!S9$ [        U 5      S:X  a  UR	                  U S   X!S9$ [        U S   U S   S-   5       H  n UR	                  XBUS9s  $    g! [        R                   a    X@S   :X  a  e  M9  f = f)z<Like reactor.listenTCP but tries different ports in a range.r   reactor   zinvalid portrange: )	interface   N)twisted.internetr   len
ValueError	listenTCPranger   CannotListenError)	portrangehostfactoryr   xs        [/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/scrapy/utils/reactor.py
listen_tcpr)      s    (
9~.yk:;;  G <<
9~  1w GG9Q<1!12	$$Q4$@@ 3 && 	aL  !	s   6BB,+B,c                  J    \ rS rSrSrS
S jrSSS jjrSS jrSS jrS r	Sr
g	)CallLaterOnce0   zSchedule a function to be called in the next reactor loop, but only if
it hasn't been already scheduled since the last time it ran.
c                D    Xl         X l        X0l        S U l        / U l        g N)_func_a_kw_call
_deferreds)selffuncakws       r(   __init__CallLaterOnce.__init__5   s    '+
#$#%)-
*,    c                X    SSK Jn  U R                  c  UR                  X5      U l        g g Nr   r   )r   r   r2   	callLater)r4   delayr   s      r(   scheduleCallLaterOnce.schedule<   s&    ,:: **57DJ r:   c                \    U R                   (       a  U R                   R                  5         g g r.   )r2   cancel)r4   s    r(   rB   CallLaterOnce.cancelB   s    ::JJ r:   c                    SSK Jn  S U l        U R                  " U R                  0 U R
                  D6nU R                   H   nUR                  SUR                  S 5        M"     / U l        U$ r<   )	r   r   r2   r/   r0   r1   r3   r=   callback)r4   r   resultds       r(   __call__CallLaterOnce.__call__F   sW    ,
TWW11AaT2 !r:   c                   #    SSK Jn  [        5       nU R                  R	                  U5        U" U5      I S h  vN   g  N7f)Nr   )maybe_deferred_to_future)scrapy.utils.deferrK   r   r3   append)r4   rK   rG   s      r(   waitCallLaterOnce.waitR   s/     ?Jq!&q)))s   7A?A)r0   r2   r3   r/   r1   N)r5   zCallable[_P, _T]r6   z_P.argsr7   z	_P.kwargs)r   )r>   floatreturnNonerQ   rR   )rQ   r   )__name__
__module____qualname____firstlineno____doc__r8   r?   rB   rH   rN   __static_attributes__ r:   r(   r+   r+   0   s     -8 
*r:   r+   c                     [        5         g)zThe policy functions from asyncio often behave unexpectedly,
so we restrict their use to the absolutely essential case.
This should only be used to install the reactor.
N)_get_asyncio_event_loop_policyrZ   r:   r(   set_asyncio_event_loop_policyr]   Z   s
    
 #$r:   c                     [         R                  " 5       n [        R                  S:X  aJ  [	        U [         R
                  5      (       d+  [         R
                  " 5       n [         R                  " U 5        U $ )Nwin32)asyncioget_event_loop_policysysplatform
isinstanceWindowsSelectorEventLoopPolicyset_event_loop_policy)policys    r(   r\   r\   b   sV    **,F
||wz66( ( 779%%f-Mr:   c                   [        U 5      nU[        R                  L aL  [        5         [	        [
        R                  5         [        U5      n[        R                  " US9  SSS5        gU R                  S5      Gt pE/ UQSPn[        SR                  U5      5      n[	        [
        R                  5         U" 5         SSS5        g! , (       d  f       g= f! , (       d  f       g= f)zInstalls the :mod:`~twisted.internet.reactor` with the specified
import path. Also installs the asyncio event loop with the specified import
path if the asyncio reactor is enabled)	eventloopN.install)r   r   AsyncioSelectorReactorr]   r   r   ReactorAlreadyInstalledErrorset_asyncio_event_looprk   splitjoin)reactor_pathevent_loop_pathreactor_class
event_loopmodule_installer_path	installers           r(   install_reactorry   l   s      -M===%'e889/@J""Z8 :9 "'',
-6-9- 89	e889K :9 :9 :9s    C7C
C
C'c                     [        S 5      $ r.   )rn   rZ   r:   r(   _get_asyncio_event_loopr{   ~   s    !$''r:   c                   U bD  [        U 5      n[        5       n[        X!5      (       d  U" 5       n[        R                  " U5        U$  [        5          [        SS[        S9  [        R                  " 5       nSSS5        U$ ! , (       d  f       W$ = f! [         a/    [        R                  " 5       n[        R                  " U5         U$ f = f)z;Sets and returns the event loop with specified import path.NignorezThere is no current event loop)messagecategory)r   r{   rd   r`   set_event_loopr	   r
   DeprecationWarningget_event_loopRuntimeErrornew_event_loop)rr   event_loop_classrt   s      r(   rn   rn      s    "4?4P,.
*77)+J"":.. +	/! </
 %335
 "( ) "!(   	/
 !//1J"":.	/s0   	
B %B8B 
BB B 5CCc           	         SSK Jn  [        U 5      nUR                  U:X  d3  [	        SUR
                   SUR                  R                   SU  S35      eg)zsRaises :exc:`Exception` if the installed
:mod:`~twisted.internet.reactor` does not match the specified import
path.r   r   zThe installed reactor (rj   z$) does not match the requested one ()N)r   r   r   	__class__r   rU   rT   )rq   r   rs   s      r(   verify_installed_reactorr      sg     )-M-""#1W%6%6%?%?$@ A((4~Q8
 	
 .r:   c                <   SSK Jn  [        U 5      n[        UR                  U5      (       a  g UR                  R
                  R                   SUR                  R
                  R                   3nUR                   SUR                   3n[        SU SU S35      e)Nr   r   rj   zUScrapy found an asyncio Twisted reactor already installed, and its event loop class (zF) does not match the one specified in the ASYNCIO_EVENT_LOOP setting (r   )	r   r   r   rd   _asyncioEventloopr   rU   rV   r   )	loop_pathr   
loop_class	installed	specifieds        r(   #verify_installed_asyncio_event_loopr      s    (Y'J'++Z88$$..99
:
G%%//<<=	?  (():+B+B*CDI
	009{ ;;a	! r:   c                 (    S[         R                  ;   $ )Nztwisted.internet.reactor)rb   modulesrZ   r:   r(   is_reactor_installedr      s    %44r:   c                 v    [        5       (       d  [        S5      eSSKJn   [	        U [
        R                  5      $ )a|  Check whether the installed reactor is :class:`~twisted.internet.asyncioreactor.AsyncioSelectorReactor`.

Raise a :exc:`RuntimeError` if no reactor is installed.

.. versionchanged:: 2.13
   In earlier Scrapy versions this function silently installed the default
   reactor if there was no reactor installed. Now it raises an exception to
   prevent silent problems in this case.
zCis_asyncio_reactor_installed() called without an installed reactor.r   r   )r   r   r   r   rd   r   rl   r   s    r(   is_asyncio_reactor_installedr      s5      !!Q
 	
 )g~DDEEr:   )r$   z	list[int]r%   strr&   r   rQ   r   rS   )rQ   r   r.   )rq   r   rr   
str | NonerQ   rR   )rQ   r   )rr   r   rQ   r   )rq   r   rQ   rR   )r   r   rQ   rR   )rQ   bool).
__future__r   r`   rb   
contextlibr   typingr   r   r   r   warningsr	   r
   r   r   r   twisted.internet.deferr   scrapy.utils.miscr   r   r   collections.abcr   twisted.internet.baser   twisted.internet.protocolr   twisted.internet.tcpr   typing_extensionsr   r   r   r)   r+   r]   r\   ry   r{   rn   r   r   r   r   rZ   r:   r(   <module>r      s    "  
  7 7 3 2 + )B(17) ,	4BT]$'*GBK '*T%$(B
&5Fr:   