
    Fe_                       d Z ddlmZ ddlZddlZddlZddlZddl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mZmZmZ dd	lmZmZmZmZ dd
lmZ ddlmZmZmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 er"ddl5m6Z6m7Z7 ddlm8Z8m9Z9 ddl*m:Z: ddl;m<Z< ddl=m>Z>  e)j~                  e@      ZA ej                  d      ZCddiZDdZEdZFdZG G d de"      ZH G d d e&      ZI	 	 	 	 	 	 d6d!ZJ G d" d#e      ZK G d$ d%      ZL G d& d'e      ZM G d( d)e      ZN G d* d+e      ZO	 	 	 	 	 	 d7d,ZPd8d-ZQ G d. d/e	      ZR	 	 	 	 d9d0ZS G d1 d2e      ZTd:d3ZUd;d4ZVd<d5ZWy)=z$The CheckExternalLinksBuilder class.    )annotationsN)
HTMLParser)path)PriorityQueueQueue)Thread)TYPE_CHECKING
NamedTuplecast)unquoteurlparseurlsplit
urlunparse)nodes)ConnectionError	HTTPErrorSSLErrorTooManyRedirects)DummyBuilder)__)SphinxPostTransform)
encode_uriloggingrequests)darkgray	darkgreenpurplered	turquoise)rfc1123_to_epoch)get_node_line)	GeneratorIterator)AnyCallable)Response)Sphinx)Configz([a-z]+:)?//Acceptz/text/html,application/xhtml+xml;q=0.9,*/*;q=0.8   g      N@c                  T    e Zd ZdZdZ ed      Zd
dZd
dZddZ	ddZ
	 	 	 	 ddZy	)CheckExternalLinksBuilderz+
    Checks for broken external links.
    	linkcheckzCLook for any errors in the above output or in %(outdir)s/output.txtc                J    d| _         i | _        t        j                  d       y )Nr   g      @)broken_hyperlinks
hyperlinkssocketsetdefaulttimeout)selfs    ;/usr/lib/python3/dist-packages/sphinx/builders/linkcheck.pyinitzCheckExternalLinksBuilder.init?   s    !"02  %    c                   t        | j                        }t        j                  d       t	        j
                  | j                  d      }t	        j
                  | j                  d      }t        |dd      5 | _        t        |dd      5 | _	        |j                  | j                        D ]  }| j                  |        	 d d d        d d d        | j                  rd| j                  _        y y # 1 sw Y   0xY w# 1 sw Y   4xY w)N z
output.txtzoutput.jsonwzutf-8)encodingr*   )HyperlinkAvailabilityCheckerconfigloggerinfor   joinoutdiropentxt_outfilejson_outfilecheckr0   process_resultr/   app
statuscode)r3   checkeroutput_textoutput_jsonresults        r4   finishz CheckExternalLinksBuilder.finishE   s    .t{{;Bii\:ii];+sW5 	,9I+sW5	,9=9J!--8 ,##F+,	, 	,
 !!"#DHH "	, 	, 	, 	,s$   9D 7C4D 4C=	9D  D	c                P	   | j                   j                  |j                  d      }||j                  |j                  |j
                  |j                  |j                  d}| j                  |       |j                  dk(  ry |j                  dk(  r|j                  dk(  ry |j                  r-t        j                  d|j                  |j                  d       |j                  d	k(  rt|j                  r<t        j                  t        d
      |j                  z   dz   |j                  z          y t        j                  t        d
      |j                  z          y |j                  dk(  r_t        j                  t        d      |j                  z          | j                  d|j                  ||j                  |j                         y |j                  dk(  r9t        j                  t        d      |j                  z   |j                  z          y |j                  dk(  r| j                  j                  s| j                  j                   rMt        j#                  t%        d      |j                  |j                  |j                  |j                  f       nDt        j                  t'        d      |j                  z   t'        d|j                  z         z          | j                  d|j                  ||j                  |j                  dz   |j                  z          | xj(                  dz  c_        y |j                  dk(  r.	 dt*        fdt*        fdt*        fdt,        fdt*        fd|j
                     \  }}||d<   | j0                  j2                  rQt        j#                  d|j                  z   dz   |z   dz   |j                  z   |j                  |j                  f       nDt        j                   |d      |j                  z    |d|z   dz   |j                  z         z          | j                  d|z   |j                  ||j                  |j                  dz   |j                  z          y t5        d |j                  z        # t.        $ r dt*        }}Y #w xY w)!NF)filenamelinenostatuscodeurir>   	uncheckedworkingoldz(%16s: line %4d) T)nonlignoredz
-ignored- z: localz
-local-   z
ok        brokenzbroken link: %s (%s))locationz
broken    z - r*   
redirectedpermanentlyz
with Foundzwith See Othertemporarily)i-  i.  i/  i3  i4  zwith unknown codetextz
redirect  z to zredirected zUnknown status %s.)envdoc2pathdocnamerO   rP   rQ   rR   messagewrite_linkstatr=   r>   r   write_entryr   rF   quietwarningiserrorwarningr   r   r/   r   r   KeyErrorr<   linkcheck_allowed_redirects
ValueError)r3   rK   rN   linkstatr^   colors         r4   rE   z(CheckExternalLinksBuilder.process_resultS   s   88$$V^^U; (FMM$mmV[["NN, 	H%==K'==I%&..E*A==KK+V^^V]]QUKV==I%~~H\2VZZ?$FWXH\2VZZ?@]]g%KK.;<WfnnhvzzZ]]i'KK	,/&**<v~~MN]]h&xx~~!8!8r"896::v~~)/(G  I C-

:SAW=XXYXv~~x#ZZ$.?A""a'"]]l*	<'0&/*F3'3'0 ++e  $HV{{66|fjj85@4G&P%~~ .9?8W  Y E,/&**<!%$,"7&.."HIJ K]T16>>8#]]FJJ,?&..,PR 1FMMABB  <2Fe<s   6R R%$R%c                    | j                   j                  t        j                  |             | j                   j                  d       y )N
)rC   writejsondumps)r3   datas     r4   rc   z(CheckExternalLinksBuilder.write_linkstat   s3    

4 01%r6   c           
     R    | j                   j                  | d| d| d| d       y )N:z: [z] rn   )rB   ro   )r3   whatra   rN   linerR   s         r4   rd   z%CheckExternalLinksBuilder.write_entry   s/    (1TF#dV2cU"EFr6   NreturnNone)rK   CheckResultrx   ry   )rr   dictrx   ry   )ru   strra   r|   rN   r|   rv   intrR   r|   rx   ry   )__name__
__module____qualname____doc__namer   epilogr5   rL   rE   rc   rd    r6   r4   r,   r,   7   sK     D ( )F&$6Cp&GG!%Gr6   r,   c                      e Zd ZdZdZddZy)HyperlinkCollector)r-      c                   t        t        | j                  j                        }|j                  }| j
                  j                  }| j                  j                  t        j                        D ]%  }d|v s|d   }t        | j                  ||||       ' | j                  j                  t        j                        D ]7  }|d   j                  d      }|sd|v st        | j                  ||||       9 | j                  j                  t        j                        D ]4  }|j                  d      }|sd|v st        | j                  ||||       6 y )Nrefuri
candidates?://source)r   r,   rF   builderr0   r_   ra   documentfindallr   	reference_add_uriimagegetraw)	r3   kwargsr   r0   ra   refnoderR   imgnoderawnodes	            r4   runzHyperlinkCollector.run   s(   0$((2B2BC''
(("" }},,U__= 	FG7"h'3WE	F }},,U[[9 	FG,'++C0Cu|3WE	F }},,UYY7 	FG++h'Cu|3WE	Fr6   N)r   r$   rx   ry   )r~   r   r   buildersdefault_priorityr   r   r6   r4   r   r      s    HFr6   r   c                    | j                  d|      x}r|}	 t        |      }||vr+t        ||| j                  j                  |      |      ||<   y y # t        $ r d}Y =w xY w)Nlinkcheck-process-uri)emit_firstresultr!   rj   	Hyperlinkr_   r`   )rF   rR   noder0   ra   newurirO   s          r4   r   r      sw    %%&=sCCvCt$ *#C#''2B2B72KVT
3   s   A A! A!c                  6    e Zd ZU ded<   ded<   ded<   ded<   y)r   r|   rR   ra   docpathr}   rO   Nr~   r   r   __annotations__r   r6   r4   r   r      s    	HLLKr6   r   c                  4    e Zd ZddZddZd	dZd	dZd
dZy)r;   c                   || _         i | _        t               | _        g | _        t               | _        |j                  | _        t        t        t        j                  | j                   j                              | _        y N)r<   rate_limitsr   rqueueworkersr   wqueuelinkcheck_workersnum_workerslistmaprecompilelinkcheck_ignore	to_ignore)r3   r<   s     r4   __init__z%HyperlinkAvailabilityChecker.__init__   s`    13*/'%'3@? & 8 804S9=9U9U6W 1Xr6   c           	   #    K   | j                          d}|j                         D ]}  }| j                  |j                        r1t	        |j                  |j
                  |j                  ddd       O| j                  j                  t        t        |      d       |dz  } d}||k  r'| j                  j                          |dz  }||k  r'| j                          y w)Nr   rW   r8   Fr*   )invoke_threadsvaluesis_ignored_urirR   rz   ra   rO   r   putCheckRequestCHECK_IMMEDIATELYr   r   shutdown_threads)r3   r0   total_links	hyperlinkdones        r4   rD   z"HyperlinkAvailabilityChecker.check   s     #**, 	!I""9==1!)--1B1BIDTDT"+R4 4 ->	 JERq 	! [ ++//##AID [  	s   CC$C$c                    t        | j                        D ]c  }t        | j                  | j                  | j
                  | j                        }|j                          | j                  j                  |       e y r   )
ranger    HyperlinkAvailabilityCheckWorkerr<   r   r   r   startr   append)r3   _ithreads      r4   r   z+HyperlinkAvailabilityChecker.invoke_threads   s`    (() 	(B5dkk6:kk4;;6:6F6FHF LLNLL'	(r6   c                    | j                   j                          | j                  D ],  }| j                   j                  t	        t
        d       d       . y NF)r   r?   r   r   r   r   )r3   _workers     r4   r   z-HyperlinkAvailabilityChecker.shutdown_threads   sA    || 	JGKKOOL):DA5I	Jr6   c                @    t        fd| j                  D              S )Nc              3  @   K   | ]  }|j                          y wr   match).0patrR   s     r4   	<genexpr>z>HyperlinkAvailabilityChecker.is_ignored_uri.<locals>.<genexpr>   s     <c399S><s   )anyr   )r3   rR   s    `r4   r   z+HyperlinkAvailabilityChecker.is_ignored_uri   s    <T^^<<<r6   N)r<   r(   rx   ry   )r0   dict[str, Hyperlink]rx   z"Generator[CheckResult, None, None]rw   )rR   r|   rx   bool)r~   r   r   r   rD   r   r   r   r   r6   r4   r;   r;      s    	X &(J
=r6   r;   c                  "    e Zd ZU ded<   ded<   y)r   float
next_checkzHyperlink | Noner   Nr   r   r6   r4   r   r      s    r6   r   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   y	)
rz   r|   rR   ra   r}   rO   rP   rb   rQ   Nr   r   r6   r4   rz   rz      s     	HLKKL
Ir6   rz   c                  h     e Zd ZdZ	 	 	 	 	 	 	 	 d fdZd	dZd
dZ	 	 	 	 	 	 ddZddZddZ	 xZ
S )r   z;A worker class for checking the availability of hyperlinks.c                b   || _         || _        || _        t        t	        t
        j                  |j                              | _        t        t	        t
        j                  |j                              | _
        t        t	        t
        j                  |j                              | _        |j                  D cg c]  \  }}t        j                  |      |f c}}| _        |j                  | _        |j"                  | _        |j&                  | _        |  |j*                  | _        |j.                  | _        |j2                  | _        |j6                  | _        |j8                  | _        |j:                  | _        t=        j>                         | _         tB        |   d       y c c}}w )NT)daemon)#r   r   r   r   r   r   r   linkcheck_anchors_ignoreanchors_ignore linkcheck_anchors_ignore_for_urlanchors_ignore_for_urllinkcheck_exclude_documentsdocuments_excludelinkcheck_authauthlinkcheck_timeouttimeoutlinkcheck_request_headersrequest_headerslinkcheck_anchorscheck_anchorsri   allowed_redirectslinkcheck_retriesretrieslinkcheck_rate_limit_timeoutrate_limit_timeout
user_agent
tls_verifytls_cacertsr   _Session_sessionsuperr   )r3   r<   r   r   r   pattern	auth_info	__class__s          r4   r   z)HyperlinkAvailabilityCheckWorker.__init__  sU    '59

F;;<6>=A

FCCD>F#8<

F>>?9A --/:L'9bjj)95 /	 ,2+C+C:@:Z:Z#)#;#;!'!C!C"44"("E"E ++ ++!-- ))+%#/s   <!F+c           
     H   	 | j                   j                         \  }}|| j                  j                          y |\  }}}}|y t	        |      j
                  }t        j                  t              5  | j                  |   j                  }d d d        |t        j                         kD  r[t        j                  t               | j                   j                  t        ||      d       | j                   j!                          | j#                  |||      \  }}	}
|dk(  r.t$        j'                  t)        d      |z   t)        d      z          n)| j*                  j                  t-        |||||	|
             | j                   j!                          # 1 sw Y   xY w)NFrate-limitedz-rate limited-   z | sleeping...)r   r   r   closer   netloc
contextlibsuppressrh   r   r   timesleepQUEUE_POLL_SECSr   r   	task_done_checkr=   r>   r   r   rz   )r3   r   r   rR   ra   _docpathrO   r   rP   r>   rQ   s              r4   r   z$HyperlinkAvailabilityCheckWorker.run'  sY   $(KKOO$5!J	 ##%-6*C(F{c]))F$$X. A
 "--f5@@
A DIIK' 

?+Z CUK%%'!%Wc9!EFD$'H%89C?(K[B\\]C&&$PT UVKK!!#= A As   4FF!c                   | j                   D ],  }|j                  |      s| d|j                   d}d|dfc S  t        |      dk(  s|j	                  d      ry|j	                  d      s`t
        j                  |      ryt        j                  |j                        }t        j                  t        j                  ||            ryy	d
\  }}}t        | j                        D ]  }	| j                  ||      \  }}}|dk7  s n |||fS )Nz	 matched z! from linkcheck_exclude_documentsrW   r   )#zmailto:ztel:)rS   r8   r   )zhttp:zhttps:rT   r8   r   )rY   r8   r   )r8   r8   r   rY   )r   r   r   len
startswithuri_rer   dirnamer   existsr?   r   r   
_check_uri)
r3   ra   rR   r   doc_matcherr>   src_dirrP   rQ   _s
             r4   r  z'HyperlinkAvailabilityCheckWorker._checkH  s     11 	*K  )iy)<)<(= >2 2  !$))	* s8q=CNN+CD%~~12||C )ll9#4#45G{{499Wc23'" 'dt||$ 	A!%i!@FD$!	
 tT!!r6   c              #     K   |r|s| j                   j                  ddif | j                   j                  ddif y w)Nallow_redirectsTstream)r   headr   )r3   r   anchors      r4   _retrieval_methodsz3HyperlinkAvailabilityCheckWorker._retrieval_methodsh  sB      F--$$'8$&???mm(D!111s   >A c           	        |j                  d      \  }}}|rN|rL| j                  D ]  }|j                  |      sd} n' | j                  D ]  }|j                  |      sd} n 	 |j	                  d       | j                  D ]  \  }}|j                  |      s n d }t        || j                        }	d}
d}dx}}| j                  | j                  |      D ]  \  }}	  |d|||	| j                  d|| j                  | j                  | j                  fd5 }| j                  r2|j                   r&|r$t#        ||      st%        t'        d|d            d d d        j(                  }|j*                  r|j*                  d   j(                  nd }|j,                  j/                  d	      }|j0                   }|j3                          ~ n d
|
dfS tG        |      jH                  }| jJ                  jM                  |d        |jO                  d      |jO                  d      k(  stQ        ||| jR                        ry|d||fS d|dfS # t
        $ r t        |      }Y w xY w# 1 sw Y   xY w# t4        $ r}d
t7        |      dfcY d }~c S d }~wt8        t:        f$ r}t7        |      }
Y d }~d }~wt<        $ r}}t7        |      }
|dk(  rY d }~ y|dk(  rL| j?                  ||      x}r,| j@                  jC                  tE        ||      d       Y d }~ yd
|
dfcY d }~c S |dk(  rY d }~ yY d }~cd }~wt$        $ r}d
t7        |      dfcY d }~c S d }~ww xY w)Nr  r8   asciir   )urlr   headersr   )_user_agent	_tls_infozAnchor z
 not foundzRetry-AfterrY   r   i  )rT   unauthorizedr   i  F)r   r8   r   i  )rW   zservice unavailabler   /r  r[   r   )*	partitionr   r   r   encodeUnicodeErrorr   r   _get_request_headersr   r  r   r   r   r   r   okcontains_anchor	Exceptionr   status_codehistoryr  r   r  raise_for_statusr   r|   r   r   r   
limit_rater   r   r   r   r   r   poprstrip_allowed_redirectr   )r3   rR   r   req_url	delimiterr  rexr   r   r  error_messager'  response_urlretry_afterretrieval_methodr   responseredirect_status_codeerrr   r   s                        r4   r  z+HyperlinkAvailabilityCheckWorker._check_urio  s   %(]]3%7"F** 99V$F
  66 Cyy)!#	*NN7#
 #')) 	GY}}S!	 I 'sD,@,@A %''{(,(?(?@R@RTZ([ >	.$f8-% i# LL 	
 !%#0@0@A 
L **x{{v$3Hf$E'WVJj+I(JKK
L '22KSK[K[x'7'7';'G'Gae$&..22=A"*,,))++>	.| ]A-- '"))VT*  %)<<$Wl%)%;%;=#!-/CCCq00A  	* )G	*.
L 
L*  -S1,,#%56  !$C  #C #%7 #%%)__\;%OOzOZ(KUS4#]A55 #%>  -  S1,,-s   'I "<I9?I,A4I9I)(I),I6	1I99	M$JM$M$)J::M$L>?L>!L>%M$-L>>M$
MM$M$c                0   t         }d }|r#	 t        |      }t        j                         |z   }t        |      j                  }|[| j                  }	 | j                  |   }|j                  }d|z  }||cxkD  r|kD  rn n|}	 ||kD  ry t        j                         |z   }t        ||      | j                  |<   |S # t        $ r< 	 t	        |      }|t        j                         z
  }n# t        t
        f$ r Y nw xY wY w xY w# t        $ r	 t         }Y w xY w)Ng       @)DEFAULT_DELAYr   r   rj   r    	TypeErrorr   r   r   r   delayrh   	RateLimit)	r3   r2  r3  r;  r   r   	max_delay
rate_limitlast_wait_times	            r4   r*  z+HyperlinkAvailabilityCheckWorker.limit_rate  s)   
1k* "YY[50
,'..//I&!--f5
 ",!1!1n,95~5%Ey u,J#,UJ#? 9  	55!1+!>J '4E #I.  		5"  &%&sG   B; D ;	D C(D (C:7D 9C::D ?D DD)
r<   r(   r   zQueue[CheckResult]r   zQueue[CheckRequest]r   zdict[str, RateLimit]rx   ry   rw   )ra   r|   rR   r|   r   r   rx   tuple[str, str, int])r   r   r  r|   rx   zIterator[tuple[Callable, dict]])rR   r|   r   r   rx   r@  )r2  r|   r3  r|   rx   zfloat | None)r~   r   r   r   r   r   r  r  r  r*  __classcell__r   s   @r4   r   r     se    E&+&,& 3& 8<&B$B"@2*.2#&2+J2p1d#r6   r   c                    t        |       }|j                   d|j                   |j                   d|j                   d| df}|D ]  }||v si t        ||   c S  i S )Nr   r  *)r   schemer   DEFAULT_REQUEST_HEADERS)rR   r   r  r   us        r4   r#  r#    s     3-CZZLCJJ<0ZZLCJJ<q1J
  ED-D1CDDE Ir6   c                   t        t        |            }| j                  dd      D ]A  }t        |t              r|j                         }|j                  |       |j                  sA n |j                          |j                  S )z<Determine if an anchor is contained within an HTTP response.i   T)
chunk_sizedecode_unicode)	AnchorCheckParserr   iter_content
isinstancebytesdecodefeedfoundr   )r5  r  parserchunks       r4   r%  r%    ss     wv/F &&$t&L eU#LLNEE<< LLN<<r6   c                  ,     e Zd ZdZd fdZddZ xZS )rK  z9Specialised HTML parser that looks for a specific anchor.c                >    t         |           || _        d| _        y r   )r   r   search_anchorrQ  )r3   rV  r   s     r4   r   zAnchorCheckParser.__init__+  s    *
r6   c                R    |D ]"  \  }}|dv s|| j                   k(  sd| _         y  y )N)idr   T)rV  rQ  )r3   tagattrskeyvalues        r4   handle_starttagz!AnchorCheckParser.handle_starttag1  s4     	JCn$$2D2D)D!
	r6   )rV  r|   rx   ry   )rY  r$   rZ  r$   rx   ry   )r~   r   r   r   r   r]  rA  rB  s   @r4   rK  rK  (  s    Cr6   rK  c                L     t         fd|j                         D              S )Nc              3  l   K   | ]+  \  }}|j                        xr |j                         - y wr   r   )r   from_urlto_urlnew_urlr  s      r4   r   z$_allowed_redirect.<locals>.<genexpr>:  s7      Hf 	s5W 55s   14)r   items)r  rb  r   s   `` r4   r-  r-  8  s(      ""$  r6   c                  "    e Zd ZU ded<   ded<   y)r<  r   r;  r   Nr   r   r6   r4   r<  r<  A  s    Lr6   r<  c                    t        |      }|j                  dk(  rS|j                  rG|j                  j                  d      }|s*d|j                   }t	        |j                  |            S y)zRewrite anchor name of the hyperlink to github.com

    The hyperlink anchors in github.com are dynamically generated.  This rewrites
    them before checking and makes them comparable.
    z
github.comzuser-content-)fragmentN)r   hostnamerf  r
  r   _replace)rF   rR   parsedprefixedrf  s        r4   rewrite_github_anchorrk  F  s`     c]F,&6????--o>&v&78Hfooxo@AAr6   c                4   t        | j                  j                  j                               D ]j  \  }}	 t	        j
                  |      | j                  j                  t	        j
                  |      <   | j                  j                  j                  |       l y# t        j                  $ r>}t        j                  t        d      |j                  |j                         Y d}~td}~ww xY w# | j                  j                  j                  |       w xY w)zFCompile patterns in linkcheck_allowed_redirects to the regexp objects.z=Failed to compile regex in linkcheck_allowed_redirects: %r %sN)r   r<   ri   rc  r   r   errorr=   rg   r   r   msgr+  )rF   r<   r  r   excs        r4   #compile_linkcheck_allowed_redirectsrp  U  s    SZZCCIIKL <W	<FHjjQXFYCJJ222::c?C JJ2266s;< xx 	1NN2]^;;1 1	1
 JJ2266s;s)   ?BC-/4C(#C0(C--C00'Dc                   | j                  t               | j                  t               | j	                  dg d       | j	                  dg d       | j	                  di d       | j	                  dg d       | j	                  di d       | j	                  ddd       | j	                  d	d dt
        t        g       | j	                  d
dd       | j	                  ddd       | j	                  ddgd       | j	                  dddt        t        f       | j	                  ddd       | j                  d       | j                  dt        d       ddddS )Nr   Fr   ri   r   r   r   r*   r   r      r   Tr   z^!r   r   r   g     r@r   zconfig-initedr   )prioritybuiltin)versionparallel_read_safeparallel_write_safe)add_builderr,   add_post_transformr   add_config_valuer}   r   tupler   	add_eventconnectrp  )rF   s    r4   setupr~  b  sH   OO-.-.+R76EB6EB)2u54b%@,a7,dEC<H,a7,dE: 3dVUC;RPTV7FMM)*KK!DsKS "# r6   )rF   r'   rR   r|   r   znodes.Elementr0   r   ra   r|   rx   ry   )rR   r|   r   zdict[str, dict[str, str]]rx   zdict[str, str])r5  r&   r  r|   rx   r   )r  r|   rb  r|   r   z&dict[re.Pattern[str], re.Pattern[str]]rx   r   )rF   r'   rR   r|   rx   z
str | None)rF   r'   r<   r(   rx   ry   )rF   r'   rx   zdict[str, Any])Xr   
__future__r   r   rp   r   r1   r   html.parserr   osr   queuer   r   	threadingr   typingr	   r
   r   urllib.parser   r   r   r   docutilsr   requests.exceptionsr   r   r   r   sphinx.builders.dummyr   sphinx.localer   !sphinx.transforms.post_transformsr   sphinx.utilr   r   r   sphinx.util.consoler   r   r   r   r   sphinx.util.http_dater    sphinx.util.nodesr!   collections.abcr"   r#   r$   r%   r&   sphinx.applicationr'   sphinx.configr(   	getLoggerr~   r=   r   r  rF  r   r  r9  r,   r   r   r   r;   r   rz   r   r#  r%  rK  r-  r<  rk  rp  r~  r   r6   r4   <module>r     s   * "   	   "  &  2 2 @ @  V V .  A 5 5  3 +3$!)$			8	$	N	# ?   ZG ZGzF, F8U-U8;U@DU
 -= -=` :  
* Av AH	.  "
  )OTX
 

<r6   