
    ёi7                       S SK Jr  S SKrS SK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rS SKJr  S SKJr  S SKr S SKJr  S SKr\R&                  " \5      rS/r\R.                  " S	5      rS
rSS jrSSS jjrS rS r    S              S!S jjrS rS\0r S"S jr!SS jr"S r#S r$S r%S r&SS jr'S#S jr(S r)S r*S r+g!    " S S5      r N= f)$    )annotationsN)Path)Literal)tqdmc                  0    \ rS rSrSS jrS rS rS rSrg)	r   "   Nc                    Xl         SU l        g )Nr   )totaln)selfr
   s     U/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/utils/download.py__init__tqdm.__init__#   s    JDF    c                p   U =R                   U-  sl         U R                  c/  [        R                  R	                  SU R                   S S35        OG[        R                  R	                  SSU R                   -  [        U R                  5      -  S S35        [        R                  R                  5         g )Nz.1fz bytesd   %)r   r
   sysstderrwritefloatflush)r   r   s     r   updatetqdm.update'   s~    FFaKFzz!

  2dffS\!89

  2cDFFlU4::5F&Fs%K1!MNJJr   c                    U $ N )r   s    r   	__enter__tqdm.__enter__/   s    Kr   c                B    [         R                  R                  S5        g )N
)r   r   r   )r   exc_typeexc_valexc_tbs       r   __exit__tqdm.__exit__2   s    JJT"r   )r   r
   r   )	__name__
__module____qualname____firstlineno__r   r   r   r&   __static_attributes__r   r   r   r   r   "   s    				#r   r   get_weights_path_from_urlz~/.cache/paddle/hapi/weights   c                T    U R                  S5      =(       d    U R                  S5      $ )zB
Whether path is URL.
Args:
    path (string): URL string or not.
zhttp://zhttps://)
startswith)paths    r   is_urlr2   A   s!     ??9%D)DDr   c                (    [        U [        U5      nU$ )a
  Get weights path from WEIGHT_HOME, if not exists,
download it from url.

Args:
    url (str): download url
    md5sum (str): md5 sum of download package

Returns:
    str: a local path to save downloaded weights.

Examples:
    .. code-block:: python

        >>> from paddle.utils.download import get_weights_path_from_url

        >>> resnet18_pretrained_weight_url = 'https://paddle-hapi.bj.bcebos.com/models/resnet18.pdparams'
        >>> local_weight_path = get_weights_path_from_url(resnet18_pretrained_weight_url)

)get_path_from_urlWEIGHTS_HOME)urlmd5sumr1   s      r   r-   r-   J   s    ( S,7DKr   c                d    [         R                  " U 5      S   nUn[         R                  " X5      $ )N)ospsplitjoin)r6   root_dirfnamefpaths       r   	_map_pathr@   b   s(    IIcN2EE88H$$r   c                
   U R                  5         [        5       n[        5       nU  H@  nUR                  S5      S   nXA;   a  M  UR                  U5        UR                  U5        MB     [        R                  SU 35        U$ )N:r   zunique_endpoints )sortsetr;   addloggerinfo)trainer_endpointsipsunique_endpointsendpointips        r   _get_unique_endpointsrM   i   sy    
%Cu%^^C #9X& & KK#$4#567r   getc                   SSK Jn  [        U 5      (       d   SU  S35       e[        X5      n[	        U" 5       R
                  SS 5      n[        R                  " U5      (       a0  U(       a)  [        Xr5      (       a  [        R                  SU 35        OU" 5       R                  U;   a  [        XX%S9nO`[        R                  R                  U5      (       d<  [        R                   " S5        [        R                  R                  U5      (       d  M<  U" 5       R                  U;   aH  U(       aA  ["        R$                  " U5      (       d  [&        R(                  " U5      (       a  [+        U5      nU$ )	a  Download from given url to root_dir.
if file or directory specified by url is exists under
root_dir, return the path directly, otherwise download
from url and decompress it, return the path.

Args:
    url (str): download url
    root_dir (str): root dir for downloading, it should be
                    WEIGHTS_HOME or DATASET_HOME
    md5sum (str|None, optional): md5 sum of download package
    decompress (bool, optional): decompress zip or tar file. Default is `True`
    method (str, optional): which download method to use. Support `wget` and `get`. Default is `get`.

Returns:
    str: a local path to save downloaded models & weights & datasets.
r   )ParallelEnvzdownloading from z
 not a urlNzFound )method   )paddle.distributedrP   r2   r@   rM   rH   r:   exists	_md5checkrF   rG   current_endpoint	_downloadosr1   timesleeptarfile
is_tarfilezipfile
is_zipfile_decompress)	r6   r=   r7   check_exist
decompressrQ   rP   fullpathrJ   s	            r   r4   r4   x   s   2 /#;;;+C5
;;;'H -[]-L-LQ-OP
zz(	(0K0KfXJ'(=))-== FHggnnX..

1 ggnnX.. }%%)99x((G,>,>x,H,H"8,HOr   c           	     V   [         R                  " U5      n [        R                  " SU S SS9 nUR                  S:w  a  [        SU  SUR                   S35      eUS-   nUR                  R                  S	5      n[        US
5       nU(       aZ  [        [        U5      S-   S-  S9 nUR                  SS9 H%  nUR                  U5        UR                  S5        M'     S S S 5        O0UR                  SS9 H  nU(       d  M  UR                  U5        M     S S S 5        [        R                  " XA5        UsS S S 5        $ ! , (       d  f       N7= f! , (       d  f       N@= f! , (       d  f       g = f! [          a(  n	["        R%                  SU SU  SU	 35         S n	A	gS n	A	ff = f)NGETT)timeoutfollow_redirects   zDownloading from z failed with code !_tmpzcontent-lengthwbi  i   )r
   )
chunk_sizerR   Downloading  from z failed with exception F)r:   basenamehttpxstreamstatus_codeRuntimeErrorheadersrN   openr   int
iter_bytesr   r   shutilmove	ExceptionrF   rG   )
r6   fullnamer>   reqtmp_fullname
total_sizefpbarchunkes
             r   _get_downloadr      sv   LL"E\\3t
#%"'u,>'q* 
 $f,L)9:JlD)QS_t%;$DE%(^^t^%DEGGEN KKN &E FE
 "%4!@ 5GGEN "A * KK/-
 
 FE *)
 
0  l5'u4KA3OPsk   E6 AE% E(9E! EEE%9	E6 
EE
E"	E%%
E3/E6 3E6 6
F( F##F(c                   U[         ;   d   SU S35       e[        R                  " U5      (       d  [        R                  " U5        [        R
                  " U 5      S   n[        R                  " X5      nSn[        R                  SU SU  35        [        R                  " U5      (       a  [        XR5      (       d  [        R                  SU SU 35        U[        :  a  US	-  nO[        S
U  S35      e[         U   " X5      (       d  [        R                  " S	5        M  [        R                  " U5      (       d  M  [        XR5      (       d  M  U$ )z
Download from url, save to path.

url (str): download url
path (str): download to given path
md5sum (str): md5 sum of download package
method (str): which download method to use. Support `wget` and `get`. Default is `get`.

zmake sure `z` implementedr9   r   rl   rm   z	md5check z and rR   zDownload from z failed. Retry limit reached)_download_methodsr:   rT   rX   makedirsr;   r<   rF   rG   rU   DOWNLOAD_RETRY_LIMITrr   rY   rZ   )r6   r1   r7   rQ   r>   rz   	retry_cnts          r   rW   rW      s    &&K+fX](KK&::d
DIIcN2Exx$HI
KK,ugVC512zz(##	((C(Cizvh78++NI %AB  !(77JJqM zz(##	((C(C Or   c           	     p  ^ Uc  g[         R                  SU  S35        [        R                  " 5       n[	        U S5       m[        U4S jS5       H  nUR                  U5        M     S S S 5        UR                  5       nXA:w  a   [         R                  SU  SU SU S	35        g
g! , (       d  f       ND= f)NTzFile z md5 checking...rbc                 &   > T R                  S5      $ )Ni   )read)r~   s   r   <lambda>_md5check.<locals>.<lambda>   s    !&&,r   r   z md5 check failed, z
(calc) != z(base)F)rF   rG   hashlibmd5rt   iterr   	hexdigest)rz   r7   r   r   calc_md5sumr~   s        @r   rU   rU      s    ~
KK%z!123
++-C	h	.4EJJu 5 
 --/KH:0Zhf	
  
	s    )B''
B5c                    [         R                  SU  S35        [        R                  " U 5      (       a  [	        U 5      nU$ [
        R                  " U 5      (       a  [        U 5      nU$ [        SU  35      e)z!
Decompress for zip and tar file
zDecompressing z...zUnsupported compress file type )	rF   rG   r[   r\   _uncompress_file_tarr]   r^   _uncompress_file_zip	TypeError)r>   uncompressed_paths     r   r_   r_     sz     KK.s+, %  07  
		E	"	"07  9%ABBr   c                   [         R                  " U S5       nUR                  5       n/ nU H$  nUR                  UR	                  SS5      5        M&     [
        R                  R                  U 5      n[        U5      (       a7  US   n[
        R                  R                  XV5      nUR                  U5        GOl[        U5      (       a  [
        R                  R                  US   R                  [
        R                  5      5      S   R                  [
        R                  5      S   n[
        R                  R                  XV5      nUR                  U5        O[
        R                  R                  U 5      S   R                  [
        R                  5      S   n[
        R                  R                  XV5      n[
        R                  R!                  U5      (       d  [
        R"                  " U5        UR                  [
        R                  R                  XV5      5        UsS S S 5        $ ! , (       d  f       g = f)Nrz../ r   r9   )r]   ZipFilenamelistappendreplacerX   r1   dirname_is_a_single_filer<   
extractall_is_a_single_dirsplitextstripsepr;   rT   r   )filepathfilesfile_list_tmp	file_listfilefile_dirrootpathr   s           r   r   r     s   	3	'5(	!DT\\%45 " 77??8,Y'' |H "X @X&i((ww''	!(:(:266(BCAFLLH !#X @X&ww''1!4::266B2FH "X @77>>"344-.RWW\\(=> 9 
(	'	's   HH22
I c                    [        U 5      R                  5       n[        U5      R                  5       n UR                  U5        g! [         a     gf = f)z7Check if the target path is within the given directory.TF)r   resolverelative_to
ValueError)	directorytargetabs_directory
abs_targets       r   _is_within_directoryr   =  sN    O++-Mf%%'J}- s   A 
AAc                    [        U 5      nUR                  5       (       a  [        SU  35      eSUR                  ;   a  [        SU  35      eg)z
Validate tar member name for security.

Raises ValueError if the name contains unsafe patterns:
- Absolute paths (Unix: /path, Windows: C:\path, UNC: \\server\share)
- Path traversal components ('..')
zUnsafe absolute path in tar: z..z#Unsafe path traversal '..' in tar: N)r   is_absoluter   parts)name	name_paths     r   _validate_tar_member_namer   H  sU     T
I8?@@ y>tfEFF r   c                   Ub  UOU R                  5       n/ nU GH  n[        U5      UR                  -  n[        X5      (       d  [	        SUR                   35      eUR                  5       (       a$  [        R                  SUR                   35        M}  UR                  5       (       a$  [        R                  SUR                   35        M  UR                  5       (       d:  UR                  5       (       d%  [        R                  SUR                   35        GM  UR                  U5        GM     U R                  XS9  g)z
Safely extract tar files to prevent path traversal attacks.

Security measures:
1. Verify resolved paths are within target directory
2. Skip symlinks, hardlinks and other special files
3. Only extract regular files and directories
Nz&Attempted path traversal in tar file: z,Skipping symbolic link in tar for security: z(Skipping hard link in tar for security: z+Skipping special file in tar for security: )members)
getmembersr   r   r   r   issymrF   warningislnkisfileisdirr   r   )tarr1   r   members_to_checkextract_membersmembermember_paths          r   _safe_extractr   Z  s    #*"5w3>>;KO"4j6;;.#D668F 
 <<>>NN>v{{mL \\^^NN:6;;-H --//V\\^^NN=fkk]K v&3 #6 NN4N1r   c                2   [         R                  " X5       nUR                  5       n[        R                  R                  U 5      nU H  n[        U5        M     [        U5      (       a1  US   n[        R                  R                  XF5      n[        X$5        GOa[        U5      (       a  [        R                  R                  US   R                  [        R                  5      5      S   R                  [        R                  5      S   n[        R                  R                  XF5      n[        X$5        O[        R                  R                  U 5      S   R                  [        R                  5      S   n[        R                  R                  XF5      n[        R                  R                  U5      (       d  [        R                   " U5        [        U[        R                  R                  XF5      5        UsS S S 5        $ ! , (       d  f       g = f)Nr   r9   )r[   rt   getnamesrX   r1   r   r   r   r<   r   r   r   r   r   r;   rT   r   )r   moder   r   r   r   r   r   s           r   r   r     sh   	h	%NN$	77??8, D%d+  Y'' |H "X @%*i((ww''	!(:(:266(BCAFLLH !#X @%*ww''1!4::266B2FH "X @77>>"344-.%h!AB 3 
&	%	%s   G'H
Hc                p    [        U 5      S:X  a'  U S   R                  [        R                  5      S:  a  gg)NrR   r   TF)lenfindrX   r   )r   s    r   r   r     s.    
9~y|0081<r   c                   / nU  Ha  nSU;   a!  UR                  S[        R                  5      nO&SU;   a   UR                  S[        R                  5      nUR                  U5        Mc     US   R	                  [        R                  5      S   n[        S[        U5      5       H-  nX1U   R	                  [        R                  5      S   :w  d  M-    g   g)N/\r   rR   FT)r   rX   r   r   r;   ranger   )r   new_file_list	file_path	file_nameis        r   r   r     s    M	)!))#rvv6IY!))$7IY'  a &&rvv.q1I1c-()a(..rvv6q99 * r   c                h   U c  g [        U [        5      (       d   S5       e[        R                  R	                  U 5      (       a4  [        R                  R                  U 5      (       d  [        SU  S35      eg  [        R                  " U 5        g ! [         a  n[        SU  SU 35      eS nAff = f)Nzpath must be string typez path:'z' must be directory zCreate 'z' failed : )

isinstancestrrX   r1   rT   r   NotADirectoryErrorr   ry   OSError)r1   r   s     r   check_and_create_dirr     s    |dC  <"<< 	ww~~dww}}T""$wtf4H%IJJ #	;KK 	;HTF+aS9::	;s   :B 
B1B,,B1)r1   r   returnboolr   )r6   r   r7   
str | Noner   r   )NTTrN   )r6   r   r=   r   r7   r   r`   r   ra   r   rQ   zLiteral['wget', 'get']r   r   )NrN   )zr:*),
__future__r   r   rX   os.pathr1   r:   rw   r   r[   rY   r]   pathlibr   typingr   ro   r   logging	getLoggerr(   rF   __all__
expanduserr5   r   r2   r-   r@   rM   r4   r   r   rW   rU   r_   r   r   r   r   r   r   r   r   r   r   r   <module>r      s0   #  	   
      #. 			8	$&
'~~<= E0%$ %*1	11 1 	1
 1 #1 	1hB M* !H(*!@G$'2T!: ;o## #s   C C