ó
    T=Œj9  ã                  óæ  • S r SSKJr  SSKrSSKrSSKrSSKr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S
KJr  SSKJr  SSKJrJr  SSKJrJr  SSK J!r!J"r"J#r#J$r$J%r%J&r&  SSK'J(r(J)r)J*r*J+r+  SSK,J-r-J.r.  SSK/J0r0J1r1  SSK2J3r3J4r4J5r5  SSK6J7r7J8r8J9r9  \Rt                  " \;5      r<SS jr=SS jr> S            S!S jjr?S"S jr@S#S jrAS$S jrB\ " S S5      5       rC " S S5      rDg)%z(Download files with progress indicators.é    )ÚannotationsN)ÚIterableÚMapping)Ú	dataclass)Ú
HTTPStatus)ÚBinaryIO)ÚPreparedRequest)ÚResponse)ÚHTTPResponse)ÚHTTPHeaderDict)ÚProtocolErrorÚReadTimeoutError)ÚBarTypeÚget_download_progress_renderer)ÚConnectionFailedErrorÚConnectionTimeoutErrorÚIncompleteDownloadErrorÚNetworkConnectionErrorÚProxyConnectionErrorÚSSLVerificationError)ÚLinkÚPathComponentÚas_path_componentÚjoin_within_directory)ÚSafeFileCacheÚis_from_cache)ÚCacheControlAdapterÚ
PipSession)ÚHEADERSÚraise_for_statusÚresponse_chunks)Úformat_sizeÚredact_auth_from_urlÚsplitextc                ó|   •  [        U R                  S   5      nUS:  a  g U$ ! [        [        [        4 a     g f = f)Núcontent-lengthr   )ÚintÚheadersÚ
ValueErrorÚKeyErrorÚ	TypeError)ÚrespÚsizes     Úb/Users/stevendouglas/BidBrain/.venv/lib/python3.13/site-packages/pip/_internal/network/download.pyÚ_get_http_response_sizer/   +   sG   € ðÜ�4—<‘<Ð 0Ñ1Ó2ˆð
 ˆaƒxØØ€Køô œ¤)Ð,ó Ùðús   ‚# £;º;c                ól   • U R                   R                  SU R                   R                  S5      5      $ )z�
Return either the ETag or Last-Modified header (or None if neither exists).
The return value can be used in an If-Range header.
Úetagzlast-modified)r(   Úget)r,   s    r.   Ú(_get_http_response_etag_or_last_modifiedr3   7   s*   € ð
 �<‰<×Ñ˜F D§L¡L×$4Ñ$4°_Ó$EÓFÐFó    c                ó´  • [         R                  5       [        R                  :”  a  UR                  nOUR
                  n[        U5      nU(       a6  U(       a  U S[        U5       S[        U5       S3nOU S[        U5       S3n[        U 5      (       a  [         R                  SU5        O4U(       a  [         R                  SU5        O[         R                  SU5        [         R                  5       [        R                  :”  a  SnO([        U 5      (       a  SnOU(       d  SnOUS	:”  a  SnOSn[        U 5      nU(       d  U$ [        X#US
9n	U	" U5      $ )Nz (Ú/Ú)zUsing cached %szResuming download %szDownloading %sFTi   )Úbar_typer-   Úinitial_progress)ÚloggerÚgetEffectiveLevelÚloggingÚINFOÚurl_without_fragmentÚshow_urlr#   r"   r   Úinfor!   r   )
r,   ÚlinkÚprogress_barÚtotal_lengthÚrange_startÚurlÚ
logged_urlÚshow_progressÚchunksÚrenderers
             r.   Ú_log_downloadrJ   ?   s,  € ô ×ÑÓ!¤G§L¡LÓ0Ø×'Ñ'‰à�m‰mˆä% cÓ*€JæÞà�,˜b¤¨[Ó!9Ð :¸!¼KÈÓ<UÐ;VÐVWÐXñ ð '˜< r¬+°lÓ*CÐ)DÀAÐFˆJä�T×ÑÜ�‰Ð% zÕ2Þ	Ü�‰Ð*¨JÕ7ä�‰Ð$ jÔ1ä×ÑÓ!¤G§L¡LÓ0Ø‰Ü	�t×	Ñ	Ø‰ÞØ‰Ø	˜Ó	$Ø‰àˆä˜TÓ"€FæØˆä-ØÀ;ñ€Hñ �FÓÐr4   c                ó@   • [         R                  R                  U 5      $ )zB
Sanitize the "filename" value from a Content-Disposition header.
)ÚosÚpathÚbasename)Úfilenames    r.   Úsanitize_content_filenamerP   r   s   € ô �7‰7×Ñ˜HÓ%Ð%r4   c                ó´   • [         R                  R                  5       nXS'   UR                  S5      nU(       a  [	        [        U5      5      nU=(       d    U$ )zw
Parse the "filename" value from a Content-Disposition header, and
return the default filename if the result is empty.
úcontent-typerO   )ÚemailÚmessageÚMessageÚ	get_paramrP   Ústr)Úcontent_dispositionÚdefault_filenameÚmrO   s       r.   Úparse_content_dispositionr[   y   sK   € ô
 	�‰×ÑÓ€AØ+€nÑØ�{‰{˜:Ó&€HÞô -¬S°«]Ó;ˆØ×'Ð'Ð'r4   c                óÚ  • UR                   nU R                  R                  S5      nU(       a  [        X25      n[	        U5      S   nU(       d;  [
        R                  " U R                  R                  SS5      5      nU(       a  X$-  nU(       dQ  UR                  U R                  :w  a7  [        R                  R	                  U R                  5      S   nU(       a  X$-  n[        U5      $ )zßGet an ideal filename from the given HTTP response, falling back to
the link filename if not provided.

The result is validated as a single path component, so it can be joined onto
a download directory without escaping it.
zcontent-dispositioné   rR   Ú )rO   r(   r2   r[   r$   Ú	mimetypesÚguess_extensionrE   rL   rM   r   )r,   rA   rO   rX   Úexts        r.   Ú_get_http_response_filenamerb   ˆ   s²   € ð —M‘M€HàŸ,™,×*Ñ*Ð+@ÓAÐÞÜ,Ð-@ÓKˆÜ˜xÓ(¨Ñ+€CÞÜ×'Ò'¨¯©×(8Ñ(8¸ÈÓ(LÓMˆÞØ‰OˆHÞ�4—8‘8˜tŸx™xÓ'Ü�g‰g×Ñ˜tŸx™xÓ(¨Ñ+ˆÞØ‰OˆHÜ˜XÓ&Ð&r4   c                  ór   • \ rS rSr% SrS\S'   S\S'   S\S'   S	rS
\S'   S	rS
\S'   SS jrSS jr	SS jr
Srg)Ú_FileDownloadé    z+Stores the state of a single link download.r   rA   r   Úoutput_fileú
int | Noner-   r   r'   Úbytes_receivedÚ
reattemptsc                óp   • [        U R                  S L=(       a    U R                  U R                  :  5      $ ©N)Úboolr-   rh   ©Úselfs    r.   Úis_incompleteÚ_FileDownload.is_incompleteª   s*   € Ü�D—I‘I TÐ)×M¨d×.AÑ.AÀDÇIÁIÑ.MÓNÐNr4   c                óv   • U =R                   [        U5      -  sl         U R                  R                  U5        g rk   )rh   Úlenrf   Úwrite)rn   Údatas     r.   Úwrite_chunkÚ_FileDownload.write_chunk­   s+   € Ø×Òœs 4›yÑ(ÕØ×Ñ×Ñ˜tÕ$r4   c                ó|   • U R                   R                  S5        U R                   R                  5         SU l        g)z1Delete any saved data and reset progress to zero.r   N)rf   ÚseekÚtruncaterh   rm   s    r.   Ú
reset_fileÚ_FileDownload.reset_file±   s0   € à×Ñ×Ñ˜aÔ Ø×Ñ×!Ñ!Ô#ØˆÕr4   )rh   N)Úreturnrl   )rt   Úbytesr|   ÚNone)r|   r~   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__rh   ri   ro   ru   rz   Ú__static_attributes__© r4   r.   rd   rd       s:   ‡ á5à
ƒJØÓØ
ÓØ€N�CÓØ€J�ÓôOô%÷ r4   rd   c                  ó¦   • \ rS rS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	      SS jr
\4SS	 jjrS
rg)Ú
Downloaderé¸   c                ól   • Xl         X l        UR                  U l        U R                  S:¼  d   S5       eg )Nr   z<Number of max resume retries must be bigger or equal to zero)Ú_sessionÚ_progress_barÚresume_retriesÚ_resume_retries)rn   ÚsessionrB   s      r.   Ú__init__ÚDownloader.__init__¹   s=   € ð
  ŒØ)ÔØ&×5Ñ5ˆÔà× Ñ  AÓ%ð	JàIó	JÙ%r4   c              #  ó@   #   • U H  nU " X25      u  pEX4U44v •  M     g7f)z.Convenience method to download multiple links.Nr†   )rn   ÚlinksÚlocationrA   ÚfilepathÚcontent_types         r.   ÚbatchÚDownloader.batchÅ   s,   é € ó ˆDÙ%)¨$Ó%9Ñ"ˆHØ <Ð0Ð0Ô0ò ùs   ‚c                ót  • U R                  U5      n[        U5      n[        U[        X15      5      n[	        US5       n[        XU5      nU R                  Xs5        UR                  5       (       a  U R                  Xs5        SSS5        UR                  R                  SS5      nXX4$ ! , (       d  f       N-= f)z+Download a link and save it under location.ÚwbNzContent-Typer^   )Ú	_http_getr/   r   rb   Úopenrd   Ú_process_responsero   Ú_attempt_resumes_or_redownloadsr(   r2   )	rn   rA   r”   r,   Údownload_sizer•   Úcontent_fileÚdownloadr–   s	            r.   Ú__call__ÚDownloader.__call__Í   s£   € à�~‰~˜dÓ#ˆÜ/°Ó5ˆä(ØÔ1°$Ó=ó
ˆô �(˜DÔ! \Ü$ T¸ÓGˆHØ×"Ñ" 8Ô2Ø×%Ñ%×'Ñ'Ø×4Ñ4°XÔD÷	 "ð —|‘|×'Ñ'¨¸Ó;ˆØÐ%Ð%÷ "Õ!ús   ¾AB)Â)
B7c                ó&  • [        UUR                  U R                  UR                  UR                  S9n U H  nUR                  U5        M     g! [        [        4 a.  nUR                  c  Ue[        R                  S5         SnAgSnAff = f)z)Download and save chunks from a response.)rD   Nz)Connection interrupted while downloading.)
rJ   rA   rŒ   r-   rh   ru   r   r   r:   Úwarning)rn   r¡   r,   rH   ÚchunkÚes         r.   r�   ÚDownloader._process_responseÞ   sƒ   € äØØ�M‰MØ×ÑØ�M‰MØ ×/Ñ/ñ
ˆð	HÛ�Ø×$Ñ$ UÖ+ò  øä ¤-Ð0ó 	Hà�}‰}Ñ$Ø�ä�N‰NÐF×GÑGûð	Hús   ·A ÁBÁ"$BÂBc           	     ó¦  • UR                   U R                  :  Ga™  UR                  5       (       Gaƒ  UR                  c   eU=R                   S-  sl         [        R                  S[        UR                  5      [        UR                  5      UR                   5         U R                  XS9nUR                  [        R                  :g  nU(       a#  UR                  5         [        U5      Ul        UnO}UR                  R                  SS5      nUR!                  5       R#                  S5      S   nUR#                  S	5      S
   nU(       a$  U[%        UR                  5      :w  a  ['        U5      eU R)                  X5        UR                   U R                  :  a  UR                  5       (       a  GMƒ  UR                  5       (       a5  [8        R:                  " UR<                  R>                  5        ['        U5      eUR                   S
:”  a  U RA                  X5        gg! [*        [,        [.        [0        [2        [4        [6        4 a     GMN  f = f)zAAttempt to resume/restart the download if connection was dropped.Nr]   z<Attempting to resume incomplete download (%s/%s, attempt %d))Úshould_matchzContent-Ranger^   zbytes é   Ú-r   )!ri   rŽ   ro   r-   r:   r¥   r"   rh   Ú_http_get_resumeÚstatus_coder   ÚPARTIAL_CONTENTrz   r/   r(   r2   ÚlowerÚ	partitionrW   r   r�   r   r   r   r   r   r   ÚOSErrorrL   Úremoverf   ÚnameÚ_cache_resumed_download)rn   r¡   Ú
first_respÚresume_respÚmust_restartÚcontent_rangeÚ
resumed_ats          r.   rž   Ú*Downloader._attempt_resumes_or_redownloadsñ   sí  € ð
 ×!Ñ! D×$8Ñ$8Ô8¸X×=SÑ=S×=UÒ=UØ—=‘=Ñ,Ð,Ð,Ø×Ò 1Ñ$ÕÜ�N‰NØNÜ˜H×3Ñ3Ó4Ü˜HŸM™MÓ*Ø×#Ñ#ô	ð&Ø"×3Ñ3°HÐ3ÐV�ð  +×6Ñ6¼*×:TÑ:TÑT�ÞØ×'Ñ'Ô)Ü$;¸KÓ$H�H”MØ!,‘Jð %0×$7Ñ$7×$;Ñ$;¸OÈRÓ$P�MØ!.×!4Ñ!4Ó!6×!@Ñ!@ÀÓ!JÈ1Ñ!M�JØ!+×!5Ñ!5°cÓ!:¸1Ñ!=�JÞ! j´C¸×8OÑ8OÓ4PÓ&PÜ5°hÓ?Ð?à×&Ñ& xÔ=ð; ×!Ñ! D×$8Ñ$8Ó8¸X×=SÑ=S×=UÔ=Uðf ×!Ñ!×#Ñ#Ü�IŠI�h×*Ñ*×/Ñ/Ô0Ü)¨(Ó3Ð3ð ×Ñ Ó"Ø×(Ñ(¨Õ>ð #øô5 &Ü&Ü$Ü$Ü ÜÜðó ó$ ð%ús   ÂC$H" È")IÉIc                óØ  • UR                   R                  nU R                  R                  U5      n[	        U[
        5      (       d  [        R                  SU5        g[	        UR                  [        5      (       d   S5       e[        5       nUR                  SU0 S9  [        5       nUR                  R                  5        H  u  pxUR                  5       S;  d  M  X†U'   M!     [!        UR"                  5      US'   [%        SUS	S
S9n	UR&                  R)                  U5      n
UR&                  R*                  R-                  XYS5      nUR                  R/                  X«5        UR0                  R3                  5         [5        UR0                  R6                  S5       nUR                  R9                  X¬5        SSS5        [        R                  SU5        g! , (       d  f       N%= f)a>  
Manually cache a file that was successfully downloaded via resume retries.

cachecontrol doesn't cache 206 (Partial Content) responses, since they
are not complete files. This method manually adds the final file to the
cache as though it was downloaded in a single request, so that future
requests can use the cache.
z<Skipping resume download caching: no cache controller for %sNzseparate body cache not in use!ÚGET)ÚmethodrE   r(   )zcontent-ranger&   r&   r^   éÈ   F)Úbodyr(   ÚstatusÚpreload_contentr4   Úrbz?Cached resumed download as complete response for future use: %s)rA   r>   r‹   Úget_adapterÚ
isinstancer   r:   ÚdebugÚcacher   r	   Úpreparer   r(   Úitemsr°   rW   r-   ÚURLlib3ResponseÚ
controllerÚ	cache_urlÚ
serializerÚdumpsÚsetrf   Úflushrœ   r´   Úset_body_from_io)rn   r¡   Úoriginal_responserE   ÚadapterÚsynthetic_requestÚsynthetic_response_headersÚkeyÚvalueÚsynthetic_responserÌ   Úmetadata_blobÚfs                r.   rµ   Ú"Downloader._cache_resumed_download2  s«  € ð �m‰m×0Ñ0ˆØ—-‘-×+Ñ+¨CÓ0ˆô ˜'Ô#6×7Ñ7Ü�L‰LØNÐPSôð ô Ø�M‰Mœ=÷
ñ 
ð 	-à,ó	-ð 
ô ,Ó-ÐØ×!Ñ!¨°CÀÐ!ÑDä%3Ó%5Ð"Ø+×3Ñ3×9Ñ9Ö;‰JˆCØ�y‰y‹{Ð"EÕEØ27¨3Ó/ñ <ô 8;¸8¿=¹=Ó7IÐ"Ð#3Ñ4ä,ØØ.ØØ!ñ	
Ðð ×&Ñ&×0Ñ0°Ó5ˆ	Ø×*Ñ*×5Ñ5×;Ñ;Ø°3ó
ˆð 	�‰×Ñ˜)Ô3Ø×Ñ×"Ñ"Ô$Ü�(×&Ñ&×+Ñ+¨TÔ2°aØ�M‰M×*Ñ*¨9Ô8÷ 3ô 	�‰ØMÈsõ	
÷ 3Õ2ús   Æ GÇ
G)c                ó¶   • [         R                  " 5       nSUR                   S3US'   [        U5      =n(       a  XCS'   U R	                  UR
                  U5      $ )z2Issue a HTTP range request to resume the download.zbytes=r¬   ÚRangezIf-Range)r   Úcopyrh   r3   r›   rA   )rn   r¡   rª   r(   Ú
identifiers        r.   r­   ÚDownloader._http_get_resumej  sY   € ô —,’,“.ˆØ# H×$;Ñ$;Ð#<¸AÐ>ˆ�Ñô BÀ,ÓOÐOˆ:ÕOØ",�JÑØ�~‰~˜hŸm™m¨WÓ5Ð5r4   c                ó  • UR                   n U R                  R                  X2SS9n[        U5        U$ ! [         a@  nUR
                  c   e[        R                  SUR
                  R                  U5        e S nAff = f)NT)r(   ÚstreamzHTTP error %s while getting %s)	r>   r‹   r2   r    r   Úresponser:   Úcriticalr®   )rn   rA   r(   Ú
target_urlr,   r§   s         r.   r›   ÚDownloader._http_getx  s~   € Ø×.Ñ.ˆ
ð	Ø—=‘=×$Ñ$ ZÈÐ$ÐNˆDÜ˜TÔ"ð ˆøô &ó 	Ø—:‘:Ñ)Ð)Ð)Ü�O‰OØ0°!·*±*×2HÑ2HÈ$ôð ûð	ús   Ž%5 µ
A?¿;A:Á:A?)rŒ   rŽ   r‹   N)r�   r   rB   r   r|   r~   )r“   zIterable[Link]r”   rW   r|   z&Iterable[tuple[Link, tuple[str, str]]])rA   r   r”   rW   r|   ztuple[str, str])r¡   rd   r,   r
   r|   r~   )r¡   rd   r¶   r
   r|   r~   )r¡   rd   rÒ   r
   r|   r~   )r¡   rd   rª   r
   r|   r
   )rA   r   r(   zMapping[str, str]r|   r
   )r   r€   r�   r‚   r�   r—   r¢   r�   rž   rµ   r­   r   r›   r…   r†   r4   r.   rˆ   rˆ   ¸   s¹   † ð
Jàð
Jð ð
Jð 
ô	
Jð1Ø#ð1Ø/2ð1à	/ô1ô&ô"Hð&??Ø%ð??Ø3;ð??à	ô??ðB6
Ø%ð6
Ø:Bð6
à	ô6
ðp6Ø%ð6Ø5=ð6à	ô6ð BI÷ ñ r4   rˆ   )r,   r
   r|   rg   )r,   r
   r|   z
str | None)r   )r,   r
   rA   r   rB   r   rC   rg   rD   rg   r|   zIterable[bytes])rO   rW   r|   rW   )rX   rW   rY   rW   r|   rW   )r,   r
   rA   r   r|   r   )Erƒ   Ú
__future__r   Úemail.messagerS   r<   r_   rL   Úcollections.abcr   r   Údataclassesr   Úhttpr   Útypingr   Úpip._vendor.requestsr	   Úpip._vendor.requests.modelsr
   Úpip._vendor.urllib3r   rÊ   Ú pip._vendor.urllib3._collectionsr   Úpip._vendor.urllib3.exceptionsr   r   Úpip._internal.cli.progress_barsr   r   Úpip._internal.exceptionsr   r   r   r   r   r   Úpip._internal.models.linkr   r   r   r   Úpip._internal.network.cacher   r   Úpip._internal.network.sessionr   r   Úpip._internal.network.utilsr   r    r!   Úpip._internal.utils.miscr"   r#   r$   Ú	getLoggerr   r:   r/   r3   rJ   rP   r[   rb   rd   rˆ   r†   r4   r.   Ú<module>rú      sð   ðÙ .å "ã Û Û Û 	ß -Ý !Ý Ý å 0Ý 0Ý ?Ý ;ß Jç S÷÷ ÷ó ÷ Eß Iß RÑ Rß PÑ Pà	×	Ò	˜8Ó	$€ô	ôGð  ð0Ø
ð0à
ð0ð ð0ð ð	0ð
 ð0ð õ0ôf&ô(ô'ð0 ÷ ð  ó ð ÷.Kò Kr4   