
    i
                     H   d dl mZmZ dZdZ	 d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZ e eedd            Z	 d dlZej6                  dk  Zej6                  d	kD  xr eZej6                  d
kD  Zer'd dlZ d dl!m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z' de_(        e)Z*d Z+n$d dl,m-Z# d dl,m.Z$ d dl,m&Z&m'Z' d dl/m0Z  d dl1m!Z! e)Z2e2Z+erdndZ3 ejh                         dk7  Z5	 ejl                  jn                  Z8	 e*j{                  dd      Z>d Z? e?d        G d deA      ZB G d dej                        ZD G d d e!      ZE G d! d"eF      ZGd#ZHd$ZId%ZJd&ZKdaLg ZM ej                         ZOdaP G d' d(eF      ZQ G d) d*eF      ZR G d+ d,eF      ZSeZTd- ZUd. ZVd/ ZWe5reUneWZd0 ZX G d1 d2eF      ZY eY       ZZd3 Z[d4 Z\d5 Z] e^ed6      rej6                  d7kD  re\Z_ne]Z_d8 Z`d9 Zad: ZbdGd;Zcd< Zdd= Zed> Zfd? Zgd@ Zh G dA dBeF      Zi G dC dDej                  ej                        ZldE ZmendFk(  r em        yy#  dZ ee        xY w#   ejr                  d       Z: G d dejv                        Z< e<       Z8Y {xY w#  ej                  Z?Y qxY w)H    )print_functionunicode_literalsz2.19z
2026-01-18NfrozenFzr
  ERROR: need 'argparse'; download it here:
   https://github.com/ThomasWaldmann/argparse/raw/master/argparse.py
)   )      )r   r   )Queue)quoteunquote)urlsplit
urlunsplitTc                     t        | d      S )Nutf8)unicode)ss    F/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/web/a/u2c.py<lambda>r   7   s    ga0     )quote_from_bytes)unquote_to_bytesreplacesurrogateescapeWindowsc                       e Zd Zd Zd Zd Zy)_UTCc                     t         S NTD_ZEROselfdts     r   	utcoffsetz_UTC.utcoffsetO       Nr   c                      y)NUTC r    s     r   tznamez_UTC.tznameR   s    r   c                     t         S r   r   r    s     r   dstz_UTC.dstU   r$   r   N)__name__
__module____qualname__r#   r(   r*   r'   r   r   r   r   N   s    			r   r   s   +/s   -_c                 Z    t        j                  | d      }|j                  t              S )NF)newline)binascii
b2a_base64	translate_b64etl)bsxs     r   ub64encr6   ^   s#    E2{{7##r      ac                       e Zd Zy)FatalNr+   r,   r-   r'   r   r   r9   r9   g       r   r9   c                       e Zd ZddZd Zy)DaemonNc                     t         j                  j                  | |       |xs d| _        || _        d| _        | j                          y )N)namer'   T)	threadingThread__init__afundaemonstart)r!   targetr?   rC   s       r   rB   zDaemon.__init__l   s=    !!$T!2b

r   c                     	 t        j                  t         j                  t         j                  t         j                  g        | j
                  | j                    y #  Y xY wr   )signalpthread_sigmask	SIG_BLOCKSIGINTSIGTERMrD   rC   r!   s    r   runz
Daemon.runs   sH    	""6#3#3fmmV^^5TU 	$&&	s   AA A"NN)r+   r,   r-   rB   rO   r'   r   r   r=   r=   k   s    r   r=   c                   $    e Zd Zd Zd Zd Zd Zy)HSQueuec                 (    ddl m}  |       | _        y )Nr   )deque)collectionsrT   q)r!   maxsizerT   s      r   _initzHSQueue._init}   s    %r   c                 ,    t        | j                        S r   )lenrV   rN   s    r   _qsizezHSQueue._qsize   s    466{r   c                     |r(|j                   r| j                  j                  |       y | j                  j                  |       y r   )nhsrV   
appendleftappend)r!   items     r   _putzHSQueue._put   s-    DHHFFd#FFMM$r   c                 6    | j                   j                         S r   )rV   popleftrN   s    r   _getzHSQueue._get   s    vv~~r   N)r+   r,   r-   rX   r[   ra   rd   r'   r   r   rR   rR   |   s    
  r   rR   c                        e Zd Zd Zd ZddZy)HClic                    || _         t        |j                        }|j                  j	                         dk(  }	 |j
                  j                  d      \  }}|| _        t        |      | _	        || _
        |j                  xs |j                   | _        g | _        g | _        |rxdd l}| j                  s|j#                         | _        nR| j                  du rd | _        n<|j'                  | j                        | _        |j(                  | j$                  _        dd	|j
                  | j                   j,                  d
t.        d| _        y #  |j
                  }|rdnd}Y xY w)Nhttps:i  P   r   T)cafilez*/*z
keep-alivezu2c/)Accept
ConnectionHostOriginz
User-Agent)arr   urlschemelowernetlocsplitaddrintporttlstetdverifyconnshconnsssl_create_unverified_contextctxcreate_default_contexttehcheck_hostnameburl	S_VERSION	base_hdrs)r!   rp   rq   ry   rv   rx   r   s          r   rB   zHCli.__init__   s%   rvvjj G+	&))#.JD$
 	I	ee(255y
;;99;$55T[[5I*,&&' &JJggll&/1
+	&::D32Ds   E E)c                     i }t         rd|d<   | j                  st        j                  }n*t        j                  }| j
                  rd| j
                  i} || j                  | j                  fd|i|S )N   	blocksizecontexttimeout)PY37ry   http_clientHTTPConnectionHTTPSConnectionr   rv   rx   )r!   r   argsCs       r   _connectzHCli._connect   se     'Dxx**A++Axx!488,DII?w?$??r   Nc                 J   t        j                          }|j                  | j                         | j                  j                  r| j                  j                  |d<   | j                  j
                  r| j                  j
                  |d<   |r||d<   |dk(  r6t        |vr.|sdn"t        |d      r|j                  n
t        |      |t        <   |t        k(  r| j                  n| j                  }|ri| j                  j                  ||d   d   z
  k  rG|j                  d      d   j                          |r#| j                  j                  ||d   d   z
  k  rG|r|j                         d   n| j                  |t        k(  rdnd	      }	 |j!                  ||||       t"        r|j%                  d
      }	n|j%                         }	|	j'                         }
|j)                  t        j                          |f       |	j*                  |
j-                  d      fS # t.        j0                  $ ra | j                  j                  dkD  r6d}t3        || j                  j                  fz         d| j                  _        |j                            |j                           xY w)NPWAuthorizationzContent-TypePOSTr   rZ      i     T)	bufferingutf-8   z8
WARNING: --cxp probably too high; reducing from %d to 4)timeupdater   rp   rC   baCLENhasattrrZ   MJr~   r}   cxppopcloser   requestPY27getresponsereadr_   statusdecoder   BadStatusLineprint)r!   methvpathhdrsbodyctypenowr}   crspdatats               r   reqzHCli.req   s   iikDNN#7799DJ77::$(GGJJD!#(D 6>d$.wtU/C488T J
  %{

cE!HQK&77IIaLO!!# cE!HQK&77#EIIKNerkss)S	IIdE4.mmdm3mmo88:DLL$))+q)*::t{{7333(( 	ww{{QOa477;;.()GGI	GGIs   BH BJ"rP   )r+   r,   r-   rB   r   r   r'   r   r   rf   rf      s    !
F@'r   rf   zapplication/jsonzapplication/octet-streamz!application/x-www-form-urlencodedzContent-Lengthc                       e Zd ZdZd Zy)Filez-an up2k upload task; represents a single filec                    || _         |j                  dd      | _        || _        || _        t
        j                  j                  ||      | _        | j                  j                  d      d   j                  dt              | _        g | _        i | _        d| _        d| _        g | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        y )	N   \   /r           F r   )topr   relsizelmodospathjoinabsru   r   WTF8r?   cidskchunkst_hashrecheckucidswarkrq   r]   t0_upt1_upnojoinup_bup_ccd)r!   r   r   r   r   s        r   rB   zFile.__init__   s    ;;ud+		77<<S)HHNN4(,33GTB	 	 
	 

		r   N)r+   r,   r-   __doc__rB   r'   r   r   r   r      s
    7r   r   c                   P    e Zd ZdZd Zd Zd Zd Zd Zd Z	ddZ
d	 Zdd
Zd Zy)	FileSlicez5file-like object providing a fixed window into a filec                    || _         || _        |j                  |d      \  | _        }|dd  D ]6  }|j                  |   \  }}|| j                  |z   k7  rt	        d      ||z  }8 |x| _        | _        | j                  | j
                  z   | _        d| _        d | _	        | j                  | _        | j                  | _        y )Nr   r   	   )filer   r   car	ExceptionrZ   tlencdrofsf_seek0seek_read0r   )r!   r   r   r   cidr   clens          r   rB   zFileSlice.__init__  s     		d1g.$8 	CS)ICdhho%l"DLD		  $#4988dhh&KK	KK	r   c                    | j                   |k  ry|s"| j                  | _        | j                  | _        | j                  ||z  z   | _        | j                  | j                  k\  ry| j                  t        | j                  | j                  z
  |      z   | _        | j                  | j                  z
  | _        | j                  d       |S )Nr   r   )r   r   car0r   cdr0minrZ   r   )r!   maxsznths      r   subchunkzFileSlice.subchunk0  s    99DIDI99us{*88tyy 88c$))dhh"6>>88dhh&		!
r   c                 j    | j                   | _        | j                  | _        | j                  | _        y r   )r   r   r   r   r   rZ   rN   s    r   unsubzFileSlice.unsubA  s#    999999r   c           	      ^   | j                   | _        | j                  | _        t	        | j
                  j                  dd      | _        | j                  j                  | j                         d}	 |j                         D ]#  }t        | |t        | j                  |             % y #  Y y xY w)Nrb   zSclose closed __enter__ __exit__ __iter__ isatty __next__ readable seekable writable)_seekr   _readr   openr   r   r   r   ru   setattrgetattr)r!   funsrD   s      r   _openzFileSlice._openF  s    JJ	JJ	diimmT:6DHH e	zz| 9c74663#789	s   16B( (B,c                      y r   r'   r!   rC   kas      r   r   zFileSlice.closeV  s    r   c                     | j                   S r   )r   rN   s    r   tellzFileSlice.tellY  s    xxr   c                     |dk(  r| j                   |z   }n|dk(  r| j                  |z   }|dk  rd}n|| j                  k\  r| j                  dz
  }|| _         | j                  j                  | j                  |z          y )Nr   r   r   )r   rZ   r   r   r   r!   r   whs      r   r   zFileSlice._seek\  sm    7((S.C1W((S.C7CDHH_((Q,CDHHsN#r   c                     t        || j                  | j                  z
        }| j                  j	                  |      }| xj                  t        |      z  c_        |S r   )r   rZ   r   r   r   )r!   szrets      r   r   zFileSlice._readk  sC    TXX()ffkk"oCH
r   c                 F    | j                          | j                  ||      S r   )r   r   r  s      r   r   zFileSlice._seek0r  s    

yyb!!r   c                 D    | j                          | j                  |      S r   )r   r   )r!   r  s     r   r   zFileSlice._read0v  s    

yy}r   N)r   )r+   r,   r-   r   rB   r   r   r   r   r   r   r   r   r   r'   r   r   r   r     s7    ? *"
 $"r   r   c                   &    e Zd Zd ZddZd Zd Zy)MTHashc                 X   d | _         d| _        d| _        t        j                         | _        t        j                         | _        t               | _        t               | _	        g | _
        t        |      D ]0  }| j                  j                  t        | j                               2 y )Nr   )r   r  cszr@   Lockomuteximutexr	   work_qdone_qthrsranger_   r=   worker)r!   cores_s      r   rB   zMTHash.__init__|  sz    nn&nn&gg	u 	2AIIVDKK01	2r   Nc                 P   | j                   5  || _        || _        || _        i }t	        t        j                  ||z              }t        |      D ]  }| j                  j                  |        d}	t        |      D ];  }| j                  j                         }
	 |
\  }}}}|||g||<   |s0 ||||z         = |	rt        |	      g }t        |      D ]  }|j                  ||           d | _        d| _        d| _        |cd d d        S #  |	xs |
}	Y nxY w# 1 sw Y   y xY w)Nr   r   )r  r   r  r  rw   mathceilr  r  putr  getr   r_   )r!   r   fszchunkszpcb
pcb_opaquechunksnchunksnchexqedigr   r  r  ns                   r   hashzMTHash.hash  s8   [[  	DFDGDHF$))C'M23GW~ %$% BW~ 	3[[__&")+&Cc3#&S/F3K 
GcM2	3 m#C7^ &

6!9%& DFDHDGA 	  	 "rB# 	  	s+   BDD+D.ADDDD%c                     	 | j                   j                         }	 | j                  |      }| j
                  j                  |       H# t        $ r}t	        |      }Y d }~5d }~ww xY wr   )r  r  hash_atr   strr  r  )r!   r   vr"  s       r   r  zMTHash.worker  sZ    ++//#CLL% KKOOA   Gs   A
 
	A(A##A(c                 T   | j                   }|sJ || j                  z  x}}t        j                         }t	        | j                  | j
                  |z
        x}}|dkD  r| j                  5  |j                  |       |j                  t	        |d            }d d d        st        dt        |      z         |j                  |       |t        |      z  }|t        |      z  }|dkD  rt        |j                         d d       j                  d      }	||	||fS # 1 sw Y   xY w)Nr   i   EOF at !   r   )r   r  hashlibsha512r   r  r  r   r   r   r)  r   rZ   r6   digestr   )
r!   r!  r   r   ofs0hashobjchunk_sz	chunk_rembufr0  s
             r   r(  zMTHash.hash_at  s   FFq488^#d..""488TWWs];;9!m ?sffS,<=>? 	CH 455NN3S!I3s8OC !m )#2./66w?FD(**? ?s   ,-DD'rP   )r+   r,   r-   rB   r&  r  r(  r'   r   r   r	  r	  {  s    
2!F+r   r	  c                      d|d<   dj                  | D cg c]  }t        |       c}      }t        |dz   fi | y c c}w )Nr   end 
)r   r   _print)rC   r   r5   zss       r   
safe_printr<    s>    BuI	q)!71:)	*B
29 *s   >c                      t         j                  |d<   d|d<   t        sd|d<   t        | i | t        st        st         j                  j                          y y )Nr   r   r7  Tflush)sysstderrPY2r:  VT100r>  )rC   r   s     r   eprintrC    sK    BvJBuI7
A
%

 r   c                      	 t        | i | d|vrt        j
                  j                          y y #  dj                  d | D              }|j                  dd      j                  d      }t        |fi | Y mxY w)Nr8  c              3   2   K   | ]  }t        |        y wr   )r)  ).0r5   s     r   	<genexpr>z!flushing_print.<locals>.<genexpr>  s     'SV's   asciir   r>  )r<  r   encoder   r?  stdoutr>  )rC   r   r*  s      r   flushing_printrK    sv    A b

 HH'Q''HHWi(//81s
   1 AA:c                     	 t        j                         \  } }| |fS #  Y nxY wt         j                  }d } |d      xs  |d      xs  |d      }|s\	 t        j                  t        j                         t         j
                        } ||      }t        j                  |       n#  Y nxY w	 |xs t        |d         t        |d         fS #  Y yxY w)Nc                     	 dd l }dd l}dd l}|j                  d|j	                  | |j
                  d            }|d d d   S #  Y y xY w)Nr   s   hhs   AAAAr   )fcntlstructtermiosunpackioctl
TIOCGWINSZ)fdrN  rO  rP  rs        r   ioctl_GWINSZztermsize.<locals>.ioctl_GWINSZ  sJ    	eU[[W5G5G%QRATrT7N	s   A A Ar   r   r   COLUMNSLINES)rj      )r   get_terminal_sizeenvironr   ctermidO_RDONLYr   rw   )whenvrV  crrT  s         r   termsizerb    s    ##%1!t
**C	 
a	>LO	>|AB	r{{3Bb!BHHRL	=c#i.)3s7|+<==s!    !AB* *B.2C Cc                   $    e Zd Zd Zd Zd Zd Zy)	CTermsizec                     d| _         d | _        d | _        t               \  | _        | _        	 t        j                  t        j                  | j                         t        | j                         y #  Y y xY w)NF)evmargingrb  r^  r_  rI   SIGWINCHev_sigr=   r  rN   s    r   rB   zCTermsize.__init__  sY    !	MM&//4;;7 	t{{	s   .A2 2A6c                     	 t        j                  d       | j                  s#d| _        t               \  | _        | _        | j                  | j                  | j                         h)Ng      ?F)r   sleeprf  rb  r^  r_  rg  scroll_regionrN   s    r   r  zCTermsize.worker  sQ    JJsO77DG%ZNDFDF{{&""4;;/ r   c                     d| _         y )NT)rf  r   s      r   rj  zCTermsize.ev_sig+  s	    r   c                     || _         |d | _        t        d       y d| j                  z   |z
  | _        dd|z  |fz  }t        d|| j                  dz
  fz         y )Nz	[s[r[ur   z%s[%dAr9  z%s[s[1;%dr[u)rg  rh  rC  r_  )r!   rg  r   s      r   rm  zCTermsize.scroll_region.  s_    >DF'(Z&(DFvv66A-DFFQJ?@r   N)r+   r,   r-   rB   r  rj  rm  r'   r   r   rd  rd    s    
0Ar   rd  c                    t        |       }|j                  }d }t        d|d       	 t        j                  |d       }|d   d   d   }|j                  r|d|j                  }|j                  s|j                  r|j                  d|j                  d|}|j                  |      }t        |      } t        d	| d
       | S # t
        $ r   d}t        ||fz          xY w)Nzresolving host [z] ...r   r   z<
[31mfailed to resolve upload destination host;[0m
gai=%r
ri   @)rt   r8  r9  )r   hostnamerC  socketgetaddrinfoKeyboardInterruptrx   usernamepassword_replacer   )rq   usphngair   s        r   undnsr|  <  s    
3-C	B
C
,-  T*VAYq\ xxCHH%
||s||<<r:
,,b,
!C
S/C
cJ  SqC6zs   !C C)c           	   #   \  K   t         j                  j                  |d      }t        j                  |      5 }|D ]&  }||j                  z   }	 ||j                         g ( 	 ddd       y# t        $ r&}| j                  |t        |      f       Y d}~]d}~ww xY w# 1 sw Y   yxY wwzCnon-recursive listing of directory contents, along with stat() infor   N)	r   r   r   scandirr?   statr   r_   r)  )errr   top_dhfhabspathr"  s          r   _scdr  V  s     77<<S!D	C /B 	/BRWWnG/	**	// /
  /

GSW-..// /sF   6B,B A."B %	B,.	B7BB BB  B)%B,c              #   "  K   t         j                  j                  |d      }t        j                  |      D ]!  }||z   }	 |t        j                  |      g # y# t
        $ r&}| j                  |t        |      f       Y d}~Od}~ww xY wwr~  )r   r   r   listdirr  r   r_   r)  )r  r   r  r?   r  r"  s         r   _lsdr  b  s|     77<<S!D

3 ++	+BGGG,--+  	+JJR)**	+s/   >BAB	B&BBBBr  )r      c              #     K   t         j                  j                  t         j                  j                  |            }||v r| j	                  |df       y|dd |gz   }t        t        | |            D ]  \  }}|j                  |      rt        j                  |j                        r||f 	 t        | |||      D ]  }|  Vt        j                  |j                        r||f || j	                  |d|j                  fz  f        y# t        $ r&}| j	                  |t        |      f       Y d}~d}~ww xY ww)zrecursive statdirzrecursive-symlinkNzirregular filetype 0%o)r   r   r  realpathr_   sortedstatdirmatchr  S_ISDIRst_modewalkdirr   r)  S_ISREG)	r  r   exclseenatopapinfr5   r"  s	            r   r  r  s  s    77??277++C01Dt|

C,-.7dVD'#s+, HC::b><<$c'M* b$5 AG \\#++&c'MJJ4~EFGH  *

BB=))*s1   B0E3D
AE	ED?:E?EEc              #     K   dj                  t        j                        j                  d      }t        s|j                  dd      }g }|D ]\  }	 t        j                  j                  t        j                  j                  |            }|dd dv r||z  }|j                  |       ^ |D cg c]  }|j                  d      r|nd	|z    }}|D cg c]  }|j                  d
d       }}|}t        j                  |j                  d      xs dt        j                        }|D ]  }	t        j                  j                  |	      }
|	dd |k(  r,|	j                  |      }|dt        j                   |      f n>t        j                  j#                  |	      \  }}|
r||t        j                   |      f |
r9t%        | |	|g       D ]'  \  }}||t'        |      d j)                  |      |f ) |	j+                  |d      \  }}|xs d
|t        j                   |	      f  y#  |}Y xY wc c}w c c}w w)zArecursive statdir for a list of tops, yields [top, relpath, stat]{0}rH  /z\\r   N)r   r   s   \\s   \\?\r   r   r      
r   r   )formatr   seprI  rB  r   r   r  r  r_   
startswithrecompileIisdirrstripr  ru   r  rZ   lstriprsplit)r  topsr  r  zar{   r  r5   ptnr   r  stopdnr  dr%  s                   r   walkdirsr    s    
,,rvv

%
%g
.C||C' 		BWW__RWW%5%5b%9:bc7m+#IB
 IIbM		 GII1<<(aj1n<II.01aiie$11
**T[[)2UBDD
9C -c"rs8s?::c?DRWWT]**ww}}S)HD"B--"3S"5 =CBs4y{O2237<<= ::c1%DAq)tQ,,- J1s8   AIAH2I0H<II.EI2H96Ic                 n    t        | d      }t        s|j                  d      }|j                  dd      S )Nr   )saferH      s   %20)r
   rA  rI  r   )btxtquot1s     r   quotepr    s0    $T"EW%==v&&r   c                     dD ]  }| dk  r n| dz  }  dj                  t        |       dd j                  d      g      }|s|S |j                  dd	      j                  dd	      S )
z*picks a sensible unit for the given extent)BKiBMiBGiBTiBi   g      @r8  Nr   .iBr   )r   r)  r  r   )r  terseunitr  s       r   	humansizer    st    1 9
f	 ((CGBQK&&s+T2
3C
;;tR ((b11r   c                     d}d}	 dD ]:  }t        j                  | dz  |z        }|dk  s
|dk\  r	|dk  r|c S ||z  }||z  }< @)z,gives The correct chunksize for up2k hashingr   r   )r   r   g      ?   i   i   )r  r  )filesize	chunksizestepsizemulr   s        r   up2k_chunksizer    sh    IH
 	Cii3 :;G#~)/?"?GtO  !IOH	 r   c                    t        | j                        }| j                  }d}g }t        | j                  dd      5 }t	        j                         }|r0| j                  dk\  r!|j                  || j                  |||       }d}|dkD  rt        j                         }	t        ||      x}}
|
dkD  rg|j                  t        |
d            }|s%t        dt        |j                               z         |	j                  |       |
t        |      z  }
|
dkD  rgt        |	j!                         dd       j#                  d      }|j%                  |||g       ||z  }||z  }|r	 || |       |dkD  rddd       t	        j                         z
  | _        || _        i | _        |D ]&  \  }}}|| j*                  vs||g| j*                  |<   ( y# 1 sw Y   _xY w)	zFgenerates the up2k hashlist from file contents, inserts it into `file`r   r   r   i   r,  Nr-  r   )r  r   r   r   r   r&  r.  r/  r   r   r   r)  r   r   rZ   r6   r0  r   r_   r   r   r   )r   r  mthr3  file_remfile_ofsr  r   t0r2  r4  r5  r0  kv1v2s                   r   get_hashlistr    s    dii(HyyHH
C	dhhj	) $QYY[499
*((1dii3=CHlnn&G#&x#::Hya-ffSI67#IAFFH$=>>s#SX%	 a- W^^-cr23::7CFJJ(34 H HD(#' l$8 ))+"DKDIDL '	2rDLL !2hDLLO'?$ $s   CGAGGc                    |s|}n@t        |j                  dt                    j                  d      }|r
||d|}n||}| j                  d|j                  d      }t        5  | j                  rt        j                  |       | j                  rt        |       t        r,|d}|j                  dd      }t        j                  |       d d d        y # 1 sw Y   y xY w)Nr   z?k=r  r9  r   )r  rI  r   r   r   r  linkmtxulinksr_   udr   linkfilewrite)rp   purlr?   fkrq   r;  zbs          r   	printlinkr    s    dkk'40188A!%tR0C $'CWWcjjo
.C	 44LL55#JB7I.BNN2  s   ,A+C  C)c                 $   |j                   D cg c]  }|d   	 c}|j                  |j                  |j                  d}|rd|d<   n4| j                  rd|d<   | j
                  rd|d<   n| j                  rd|d<   d	|_        |j                  r|j                  }nWd
|j                  v r8t        |j                  j                  d
d      d         j                  d      }nd}| j                  |z   }t        j                         }|| j                  z   }	 d}d}	t        j                         }
|
|k\  rt!        d       t#               	 t%        j&                  |d      }t(        j+                  d|i |j-                  d      t.              \  }}	|dk  rnt1        d||	fz        	 t%        j>                  |	      }|r/| j@                  r|d!   rtC        | |d!   d   d"   dd       |d!   d	fS t        |d#   j-                  dtD                    j                  d      |_        |d$   |_        |d%   |_#        | j@                  r/|d&   s*tC        | |j                  |d$   |jI                  d'             |d&   |d(   fS c c}w # t0        $ r}t3        |      j5                  d      d   j5                  d      d   j7                         }|dk(  sd|	v sd|	v rd|_        g d	fcY d}~S |dk(  sd|	v r	g d	fcY d}~S |dk(  s|dk(  rt!        d|	       t#               d }t        j                         }t9        ||j                  ||
|||z
  ||
z
  |fz         t        j:                  | j<                         Y d}~nd}~ww xY wj#  t1        |	      xY w))z
    performs a handshake with the server; reply is:
      if search, a list of search results
      otherwise, a list of chunks to upload
    r   )r&  r?   r   r   r   srchTumodmtr   Fr   r   r   iX  z8
ERROR: server offline for longer than --t-hs; giving up)z,
: )
separatorsr     zhttp %d: %sz	SSLError(r   z
URL: i  z)<pre>partial upload exists at a differentz'<pre>source file busy; please try againNi  z)<pre>upload rejected, file already existsi  i  z+
ERROR: login required, or wrong password:
zQhandshake failed, retrying: %s
  t0=%.3f t1=%.3f t2=%.3f td1=%.3f td2=%.3f
  %s

hitsrpr  r?   r   r&  r  sprs)%r   r?   r   r   touchowoowr   rq   r   r  r  r   vtopr   t_hsr   r9   jsondumpswebr   rI  r   r   r)  ru   striprC  rl  r   loadsuonr  r   r   r  )rp   r   searchr5   r   rq   r  tmaxsctxtt1r;  r"  emr   r   rU  s                    r   	handshaker  "  sF     $yy)!1)							C F88CK66!C	NUU!C	NDLxxhh488q1!45<<WECCggm	B<D
YY[:MN'M	CM:Bggfc2ryy/A2FGBCxMRI566.JJsO 66aib!F)A,t,b"5y%ai&&w56==gFDH&	DI&	DI	vvai"dhh&	155;7V9aia *T  	R{+B/55i@CIIKB c	>#E<C#5y sISP5y sbCi3PQggA))+C1		2r3b#(BGGHJJruu'	 LnsJ   I=AJ J (N 	M=AM8M=%M81M=7A<M88M=Nc                 \   | j                   d   }t        | j                         dkD  r`dt        | j                         z  }|dkD  rdn|dk  rdn|}| j                   dd D cg c]  }|d| 	 }}|d|dj                  |      fz  z  }|| j                  j                  d	}|r||d
<   d}	 |dk7  r| j                  ||      }|dk(  r?	 | j                  r1| j                  j                          |dk7  r| j                          yyy|dk\  r,t        ||z        |d<   |j                  t        d       |dz  }t        j                  d| j                  j                  || t              \  }	}
|	dk(  rd|
v sd|
v sd|
v rd| j                  _        |	dk\  rt#        d|	d|
      |dk7  r| j                  r1| j                  j                          |dk7  r| j                          yyyc c}w # | j                  r1| j                  j                          |dk7  r| j                          w w w xY w)zFupload a range of file data, defined by one or more `cid` (chunk-hash)r   r      r   r   Nz,%d,%sr   )zX-Up2k-HashzX-Up2k-WarkzX-Up2k-Statr   r   zX-Up2k-Subcr   r  zalready being writtenzalready got thatzonly sibling chunkshttp r  )r   rZ   r   r   r   r   r   r   r   r)  r   r   r  r   rq   MOr   r   )fslstatsr   ctxtr%  r;  zslheadersnsubr  r  s              r   uploadr   ~  s    88A;D
388}q3sxx= QAQAA #-"r"1v--Arwws|,,, xx}}G
 !&Dbj<<t,Drz& 55EEKKMrz		  % qy),UT\):&D$'	ggfchhllGS"EGBSy+s2)S0,3&'CHHOSyS 9::) bj, 55EEKKMrz		  G .F 55EEKKMrz		  s   !G'+G, B"G, ,?H+c                   T    e Zd ZdZd ZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zy)Ctlz^
    the coordinator which runs everything in parallel
    (hashing, handshakes, uploads)
    c                    | j                   }t        dt        |j                        fz         d}d}g }t	        ||j                  |j
                        D ]:  \  }}}t        j                  |j                        r'|dz  }||j                  z  }< |rt        dt        |      fz         |D ]Q  \  }}|j                  r"t        |j                  dd      d|d       4t        |j                  dd      d	z          S t        d
t        |      fz         |j                  st        d       |j                  st        d       y t        d|t        |      fz         ||fS )Nz
scanning %d locations
r   r   z
# failed to access %d paths:
r   r   z
 `-

r9  z%^ failed to access those %d paths ^

z)hint: set -v for detailed error messages
z'hint: aborting because --ok is not set
zfound %d files, %s

)rp   rC  rZ   filesr  r5   r  r  r  st_sizer*  r   okr  )	r!   rp   nfilesnbytesr  r  r  r  msgs	            r   _scanz	Ctl._scan  sC   WW*c"((m-==>!#rxx6 	"IAq#||CKK(aKFckk!F	" 5SCD AC44bii.KSQR299Wi84?@	A <C{JK44CD55AB'69V3D*EEFv~r   Nc                    d| _         d| _        d| _        || _        |xs | j	                         | _        | j
                  sy | j
                  \  | _        | _        t        g |j                  |j                        | _        g | _        d | _        |j                  r| j                          nAd| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t9        j8                         | _        d | _        d | _        d| _         tC        jD                         | _#        tC        jH                         | _%        |jL                  | _'        |jL                  | _(        tS               | _*        tW               | _,        d dg| _-        d dg| _.        |j^                  dkD  rta        |j^                        nd | _1        | je                          | j                  }| j2                  rU|rStg        |jh                  jk                  dtl                    }tn        jq                  d|jr                  i d	|z   tt               | j                   | _         y )
NFr   r   z99:99:99z(idle, starting...)r   r   r   s   msg=upload-queue-empty;);r  panikerrsrp   r  r  r  r	  r  r  r5   filegenr   	last_filer  _safeat_hashat_upat_uprhash_fhash_chash_bup_fr   r   up_bruploader_busy
serializedr   r  r   spdetar@   r  mutex	Condition	exit_condjuploader_alivehandshaker_aliverR   q_handshaker	   q_uploadst_hashst_upJr	  r  _fancyr  r?   rI  r   r  r   rq   MM)r!   rp   r  r   r;  s        r   rB   zCtl.__init__  s   
	*djjl
zz#':: T[BHHbdd377JJLDLDJDKDKDKDKDIDIDIDJ!"D#DOiikDGDJDH!DH")DJ&002DN"$$$D$&DDD!&yD!GDM "78DL 56DJ')ttaxvbdd|TDHKKM~~::$		(($78BGGFDHHb*Dr*I2Nii-r   c           	         | j                   j                  }d}| j                  D ]  \  }}}t        j                  |j
                        s|s*|dz  }t        |||j                  |j                        }|j                  j                  dd      }t        d| j                  |z
  |fz         t        |dd       	 t        d       	 t        | j                   ||      \  }}	|r>r0|D ]*  }
t        d| j                   j$                  d	|
d
          , nt        d       n|_        |snt        d| j                  |z
  |fz         t)        |      }t+        |      D ]Z  \  }}t        d||z
  |fz         d|| j                  |z
  fz  }t-        ||g      }t/        ||| j                   j0                         \ t        d       |j2                  s| j2                  j5                  |        | j2                  syt7        dt)        | j2                        fz         | j2                  D ]  }t        | j                   |d        y# t        $ r t!        j"                  d       Y w xY w)z+minimal basic slow boring fallback codepathr   r   r   r   z%d %s
  hash...Nz  hs...z	  found: r  r  z  NOT foundz%d %sz
  %d up %sz	%d/0/0/%dz  ok!finalizing %d duplicate files
F)rp   r   r  r  r  r  r   r  st_mtimer   r   r   r  r  r  r9   r?  exitr   r   rZ   	enumerater   r   szmr   r_   rC  )r!   r  nfr   r   r  r   upathhsr  hitncsncr   r  fslices                   r   r  z	Ctl._safe  s)   !\\ (	*MCc||CKK(!GBS#++s||<DHHOOGY7E$b(8%'@@AtT*i  %dggtV<EB #% PC!dggllCI"NOP m,
gr!15 99:"g(} 7GB,#(C89'2t{{R/?*@@E&tcU3F65$''++6	7+ 6 'N||##D)Q(	*T ||0C4E3GGHLL 	,DdggtU+	,?   HHQK s   	II0/I0c                 D   t        j                  | j                         t        r+| j                  j
                  st        j                  d       t        | j                         t        | j                  j                        D ],  }t        | j                         t        | j                         . d}	 | j                  5  | j                  j                  d       d d d        | j                   rt#        j$                  d       | j&                  5  | j(                  s| j*                  s	 d d d        n| j,                  d d  }| j.                  d d  }d d d        t        rY| j                  j
                  sBt        j0                  t3        t5        | j6                              z
  dz
  }dt        j8                  fz  }dd| j:                  gdd	| j<                  gfD ]  \  }}}	}
|d
t        j8                  |z   |fz  z  }|	\  }}|s
|d|dz  }4|rd|j>                  z  |j@                  z  }nd|z  |j@                  z  }|jB                  jE                  dd      | d  }d|v rdtG        |jI                  dd            z  }|d|| j6                  |
z
  |fz  z  } |dt        j8                  dz   fz  z  }nd}t        s9tK        | j>                  dz  | jL                  z        xs d}||k7  r|}|d|fz  z  }| jN                  sS| jP                  tS        jR                         | jT                  z
  xs dz  }| jL                  | jP                  z
  |xs dz  }nr| jN                  tS        jR                         | jV                  z
  xs dz  }| jX                  xs |dz  |dz  z   x}| _,        | jL                  | j>                  z
  |xs dz  }t[        |      }t5        t]        j^                  tK        |                  | _0        |dkD  r#| j`                  jc                  d      d   | _0        t[        | jL                  | j>                  z
        }| j6                  | j<                  z
  }t        r| j                  j
                  sdnd}d| j`                  |||fz  }| jP                  sd}te        |djg                  ||      z          | j                  jh                  r&tS        jR                         | jT                  z
  | _5        | jP                  rH| jj                  r<t[        | jP                  | jj                  z        }te        d | jj                  |fz         | jN                  rH| jl                  r<t[        | jN                  | jl                  z        }te        d!| jl                  |fz         | jn                  sy te        d"t3        | jn                        fz         | jn                  D ]  }tq        | j                  |d#        y # 1 sw Y   +xY w# 1 sw Y   xY w)$Nr   r   gQ?r      z[s[%dHr   r&  sendz[%dH%s:r8  z[Kd   r   r   r  z[36m%s[0m/%sz%6.1f%% %d %s[Kz[%dH r   z]9;4;1;%d\g?皙?)secondsi' ,z[K[uz%s eta @ %s/s, %s, %d# leftz now hashing...z]0;{0}\{0}{1}z
hasher: %.2f sec, %s/s
zupload: %.2f sec, %s/s
r,  F)9atexitregistercleanup_vt100rB  rp   nsssrm  r=   hasherr  r!  
handshakeruploaderr   waitr  r?  r.  r  r#  r"  r&  r'  r^  rZ   r)  r  rh  r  r  r   r   r   r   tupler  rw   r	  r  r  r   r  r   r  r  datetime	timedeltar  ru   rC  r  wlistr  r  r   r  )r!   r  last_spr&  r'  maxlenr  yr  str   r   argpr?   spr  r  sleftnlefttailr   s                         r   r)  z
Ctl._fancyC  s   **+Qt{{twwyy! 	"A4??#4==!	"  *##D)*zz &,,T5H5H& & ,,q/

1	& TWWZZC$4 55:&"$$05tyy1$ RKAq"a =BDD1Ha=88C "ID#c33 #dii$)) ;A #c	DII 5A#xxw	BF78L$;#9E$++cSTBU<V#VD44;;?D7QQQ%R( {bddQh[00S4;;67<1b= G0B588C::kkdiikDGG&;%AB{{T[[0SXA>jjTYY[4::%=$C!D"&((/cS!839!DDdh{{TYY.38!<C.C8--c#h?@DHW}88>>#.q1dkkDII56EKK$))+E%*477::>4D-3u0MMA;;%33::1dCCD B 77==99;0DL;;4<<DKK$,,67C/4<<2EEF::$**DJJ34C-S0AAB||0C4E3GGHLL 	,DdggtU+	,]* *& &s   XX8XXXc                 h    t         rt        j                  d        nt        d       t        d       y )Nz	]9;4;0\z	[J]0;\)rB  rD  rm  rC  rN   s    r   rB  zCtl.cleanup_vt100  s%    T"%&$%r   c                     ||g| _         y r   )r&  )r!   r   r   s      r   	cb_hasherzCtl.cb_hasher  s    c{r   c           
      h   | j                   j                  rGt        j                  | j                   j                  j	                  d      t        j
                        nd }dj                  t        j                        j	                  d      }d }i }| j                  D ]p  \  }}}t        j                  |j                        }| j                   j                  s| j                   j                  rn|r|nt        j                  j!                  |      }	|	j#                  dd      j%                  dd      j'                  d      }
|
r|
dz  }
||	k7  r|	}i }	 t)        dj                  |
             | j                   j*                  t-        |	j%                  dd	            j#                  d      f}t.        j1                  d
d|z  i       \  }}|dk\  rt3        d|      t5        j6                  |      }|d   |d   z   D ]J  }|d   j9                  d      d   j'                  d      }||t;        |j	                  dt<                    <   L 	 | j                   j                  rt        j                  j?                  ||	      }	 tA        t        jB                  |            }|rx|j%                  |d	      j'                  d	      d	z   }|D cg c]  }||z   	 }}|D cg c]  }|jG                  |      r| }}|D cg c]  }|j9                  d	      d    }}|D cg c]  }||vs|dk7  s| }}| j                   jH                  j9                  d      d   j9                  dd      d   }|D cg c]  }|j#                  dt<               }}|D cg c]
  }||
z   |z    }}|r|}|rt)        d|
dtK        |             t5        jL                  |      j	                  d      }t.        j1                  ddi |tN              \  }}|dk(  r!d|v rt)        d       |d tK        |      dz   }|dk\  rd }t3        |||fz        	 |tK        |      d  }|r|r| j                   j                  r|jQ                  t        j                  jS                  |      d       }|rf|d!   |jT                  k(  rTtW        |d"   |jX                  z
        dk  r6| xjZ                  dz  c_-        | xj\                  |jT                  z  c_.        st_        |||jT                  |jX                        }	 | j`                  5  | jb                  | jd                  z
  dk(  s8| jf                  | jh                  z
  d#k  r|| jj                  | jl                  z
  d$k  r`| j                   jn                  r@| jp                  js                         r0| jt                  js                         r| jv                  s
	 d d d        nd d d        ty        jz                  d%       t}        || j~                  | j                         | j`                  5  | xjb                  dz  c_1        | xjj                  tK        |j                        z  c_5        | xjf                  |j                  z  c_3        | j                   j                  r3| jb                  | _2        | jj                  | _6        | jf                  | _4        d d d        | j                   j                  r|j                  j#                  d      } | j                   j                  rSt        |j                        D !"cg c]  \  }!}"d&|"d   |!|"d   fz   }#}!}"t)        d'| d(d(j?                  |#             | j                   j                  t        |j                        g|j                  D cg c]  }|d   	 c}z   }#t        j                  d(j?                  |#      j	                  d            j                         d d) }$t        |$      j#                  d      }%| j                   j                  rt)        |%d*|        nt        j                  j                  t        d|j                        t              }&d+|&j                  |&j                  |&j                  |&j                  |&j                  |&j                  fz  }'t)        d,|'|j                  |%| fz         V| jt                  j                  |       s d d-g| _Z        | j                          y # t2        $ r&}t)        dj                  |
|             Y d }~d }~ww xY w#  tE        |      }Y xY wc c}w c c}w c c}w c c}w c c}w c c}w # 1 sw Y   xY w# 1 sw Y   xY wc c}"}!w c c}w ).Nr   r  rH  r   \r  z      ls ~{0}r   r   GETz%s%s?ls&lt&dotsr  r  dirsr  href?r   z   mkdir ~{0}  ({1})r   s   .hist://r   z
DELETING ~#r   z/?deletei  z	json 2bigz% (delete request too big; slicing...)r   zdelete request failed: %s %sr  tsi   @i   g?z%s %d %dzchs: r9  r-  z  z%04d-%02d-%02d %02d:%02d:%02dz%s %12d %s %s
(finished))\rp   r5   r  r  rI  r  r  r   r  r  r  r  r  zdrdr   dirnamer   r   r  r   r  r  r  r   r   r  r  ru   r   r   r   setr  listr  rq   rZ   r  r   r  basenamer  r   r-  r  r	  r   r  r  r  r  r   r  r   nhr%  emptyr$  r  r   rl  r  rY  r  r   r   rL  r   chsr/  wsaltr)  r.  r/  r0  r6   jwrJ  fromtimestampmaxr   r&   yearmonthdayhourminutesecondr  r&  _check_if_done)(r!   r  r  prdlsr   r   r  r  rdsrdztr  r  r!  r   rfnr"  dplnodesr;  r5   zlsbnamesr   nameslocsr   r   r   rfr   vpr%  zsiir  r  r   zdr"   s(                                           r   rE  z
Ctl.hasher  s   =AWWYYbjj))'2BDD9Dll266"))'2!\\ }	'MCcLL-EwwyyDGGKK!Srwws';ii3;;D#FMMcR3JC"9CBFo44S9: GGLL"2::eT#:;BB7K #&''%1BR1G"LC9"+,=">> JJsO!"6QwZ!7 GA"#F)//#"6q"9"@"@"ECEFBwszz'4'@ABG ww{{WW\\#r2.%(B%8F !#C!6!=!=d!Cd!JB39":a26":C":.1"F11"FC"FAD%EAaggdmB&7%EF%E-/!U1F?qH}!!U!U $ 1 1% 8 < B B3 J2 NBH IQ'4!8 I I9>?Aa??""&C"% %3C&I J'+zz#'='=g'F*-''&*b$PR*SC#%91C$)*Q$R*-oCA*>C$,%'3Y(FA*3AS	M*B$B %#'C
#3D #  wwyyVVBGG,,S148"T(ckk1c"T(S\\:Q6RVW6WKK1$KKK3;;.KS#++s||<DZZ dii/14 KK$))36HH $dii 7# = !GGJJ MM//1 $ 0 0 6 6 8$($6$6   " 

4 % ( t~~txx8 ,q s499~-tyy(77== $DI $DI $DI, ww}}XX__W-77;; (1';#At #d1gq$q'%::C  2tyy~>?ww}}c$))n5tyy8Q!18QQ^^DIIcN$9$9'$BCJJLSbQr{))'277::dB/0!**88Q		9JCPB8				< B /RD",EEF  &{}	'~ l+Q % F4;;CDEEF.%)"XF #;"F%E!U I?: (, ,
 9Rs   C7d,ee1"e69e6e;$	f .f 4f 9ff
 B,f B&ff)f/,	e5eee.f	f&	c                    | j                   5  | j                  | j                  z
  r
	 d d d        y 	 d d d        t        | j                  j
                        D ]  }| j                  j                  d         y # 1 sw Y   IxY wr   )r  r  r  r  rp   r!  r$  r  )r!   r  s     r   rw  zCtl._check_if_done1  sp    ZZ 	{{TYY&	 	&	 twwyy! 	'A  &	'	 	s   A::Bc           
      $   | j                   j                  }	 | j                  j                         }|sF| j                  5  | xj
                  dz  c_        d d d        | j                  j                  d        y t        |j                        }|j                  j                  dd      }t        s|j                  d      }|xj                  dz  c_        |j                  dkD  r$t        d|z         | xj                   dz  c_        t#        j"                         |j$                  k  r7t#        j&                  d       t#        j"                         |j$                  k  r7	 t)        | j                   ||      \  }}|r|r3|D ]-  }t        d	|d
| j                   j.                  d|d          / nt        dj1                  |             | j                  5  | xj2                  dz  c_        | xj4                  t7        |j8                        z  c_        | xj:                  |j                  z  c_        d d d        | j=                          :|j>                  r| j>                  jA                  |       | j                  5  |rd|sb| jB                  sVd}tE        |       d| _!        tG        | j                   jH                  dz
        D ]  }	| j                  j                  d         |s| xj2                  dz  c_        | xj4                  t7        |j8                        |j4                  z
  z  c_        | xj:                  |j                  |j:                  z
  z  c_        |j>                  s| jK                  |       |r|j4                  r| xj4                  t7        |      z  c_        |xj4                  t7        |      z  c_        |D ]S  }
|jL                  |
   d   }| xjN                  |z  c_'        | xj:                  |z  c_        |xj:                  |z  c_        U |r?|j:                  s3|tQ        dt7        |jL                        t7        |      z
        z  |_        ||_)        d d d        |s$| xjT                  |jV                  z  c_*        | j                   jX                  rt        rd}d}ndx}}t[        |j                  |jV                  z  d      }|j4                  rT|j\                  |j^                  z
  }t[        |j                  |z  d      }d}t        ||||jV                  ||||fz         nKd}t        ||||jV                  ||fz         n+|j4                  rdnd}t        dj1                  ||             | j=                          | j                   j`                  |z  }|d d  }|rtc        ||d d       }	 |jd                  r
tg               tG        dti        t7        |      |dz               D ]  }tc        ||d |       } 	 |t7        |j8                        d  }| j                  j                  |       |r6# 1 sw Y   xY w# t*        $ r
 d| _        Y y w xY w# 1 sw Y   <xY w# 1 sw Y   xY w#  Y yxY w)NTr   r   r   z\?    zERROR: giving up on file %sr<  zfound: 
  r  r  zNOT found: {0}zEserver filesystem does not support sparse files; serializing uploads
r   z[36mz[0mr   z,uploaded %s %s(h:%.2fs,%s/s,up:%.2fs,%s/s)%sz   found %s %s(%.2fs,%s/s)%suploadedz   foundz{0} {1}r   )5rp   r   r$  r  r  r#  r%  r  r  r   r   r   rB  r  r]   r   r  r   r   rl  r  r9   r  r   r  r  r   rZ   r   r   rw  r   r_   r  rC  r  r!  up_doner   r  rp  r   r  r   r  r  r   r   r  r   r   r   r   )r!   r  r   r  r2  r3  r  r4  r   r  r   r  c1c2spd_ht_upspd_ukwnjoincsr  r%  s                         r   rF  zCtl.handshaker8  s%   ##'')DZZ /))Q.)/!!$'$TYY/GHHOOGY7EU+HHMHxx"}3u=>		Q	))+'

3 ))+'$TWWdF;D
 ! WeTWW\\3t9UVW *11%89ZZ +IINIIITYY/III*I+
 ##%||##D)  d4??`A1I&*DO"47799q=1 0))$/0IINIIITYY$))!;;IIITYY!66I<<T*$))IIR(IIIR(I! (!\\#.q1

b(
		R			R		( dii '#aT\\1BSW1L*M MDI
= @ +77;;'&"$R%dii$++&=tDEyy#zzDJJ6 )$))d*:D AJa5"dkk5$r"RRS:a5"dkk5""EEF'+yyjB)**2u56##%GGJJ')EABb!f-{{'k)"1c#b'519&=> 6'b!f56 CHH(!!#& W / /*  
+ +   HsE    Y#Y AY1G&Y>	AZ YY.-Y.1Y;>ZZc           	         	 | j                   j                         }|sd}| j                  5  | xj                  dz  c_        | j                  s| j                   }d dg| _        d d d        |r0| j                  5  | j                  j                          d d d        y y |j                  }|j                  }|| _
        | j                  5  | j                  st        j                         | _        | xj                  dz  c_        |j                  s6t        j                         |_        | j                  s|j                  | _        d d d        d| j                  t!        | j"                        | j                  | j$                  | j                  z
  | j&                  dz  | j&                  | j(                  z
  dz  | j*                  fz  }	 t-        ||| j.                  j0                         | j                  5  |j                   }|j:                  D 	cg c]	  }	|	|vs|	 c}	|_        |j:                  s4t        j                         |_        | j>                  jA                  |       ||d   g| _        |xj(                  |z  c_        | xj(                  |z  c_        | xjB                  |z  c_!        |xjD                  dz  c_"        | xjD                  dz  c_"        | xj                  dz  c_        | j                  s4| xjF                  t        j                         | j                  z
  z  c_#        d d d        ;# 1 sw Y   xY w# 1 sw Y   y xY w# 1 sw Y   xY w# t2        $ rk}d}t5        ||j6                  |d   d d t!        |      dz
  |fz         t        j                         | j.                  j8                  z   |_        Y d }~d }~ww xY wc c}	w # 1 sw Y   xY w)	NFr   rc  z%d/%d/%d/%d %d/%d %sr   z(upload failed, retrying: %s #%s+%d (%s)
r      )$r%  r  r  r"  r#  r'  r   
notify_allr   r   r  r  r   r  r   r  rZ   r   r  r	  r   r  r   rp   r0  r   rC  r?   r   r   r   r$  r  r  r   r  )
r!   r  doner   r   r  r"  r   r  r5   s
             r   rG  zCtl.uploader  s   --##%CZZ :''1,'..#'#8#88&*L%9
	:
  4113488D88D!DN 0))"&))+DK""a'"zz!%DJ::%)ZZ
0 +		DLL!""dii',tyy(k:. E3sE477;;/  <WW)-EAq}aE
zz!%DJ$$((."DG_
		R			R	

b 
		Q			Q	""a'"))JJ$))+";;J<[ : :40 0*  3?qDIItAwr{CIM2FFG))+

23 F< <sb   8L=:M

A=M!M# 8O	OO!DO=M
MM #	O,A OOOO(c                 p    | j                   j                  r t        j                  |j                         y y r   )rp   dlr   unlinkr   )r!   r   s     r   r  zCtl.up_done  s"    77::IIdhh r   r   )r+   r,   r-   r   r  rB   r  r)  rB  rY  rE  rw  rF  rG  r  r'   r   r   r  r    sH    
B6 p3,j[,z&#EN'w'r=<~ r   r  c                       e Zd Zy)APFNr:   r'   r   r   r  r    r;   r   r  c            
      (   t        j                  dd       dj                  d       t        st	        j
                  d       t        t        d      rt	        j                         ndxs d} t        | d	      }d
j                  t        t              }dt        j                  v rt        |       y t        j                  D cg c]
  }|dk7  s	| c}t        _        t        j                   t"        d|z   d      x}}|j%                  dt&        d       |j%                  dt(        dd       |j%                  ddd       |j%                  dddd       |j%                  dddd        |j%                  d!dd"       |j%                  d#t&        d$d%d&'       |j%                  d(dd)       |j%                  d*dd+       |j%                  d,dd-       |j%                  d.dd/       |j%                  d0dd1       |j%                  ddd2       |j+                  d3      }|j%                  d4dd5       |j%                  d6dd7       |j%                  d8t&        d9d:;       |j+                  d<      }|j%                  d=dd>       |j%                  d?t,        d@ddAB       |j+                  dC      }|j%                  dDddE       |j%                  dFddG       |j%                  dHddI       |j+                  dJ      }|j%                  dKt&        dLdMdNB       |j%                  dOddP       |j%                  dQddR       |j+                  dS      }|j%                  dTt,        dUddVB       |j%                  dWt,        dX|dYB       |j%                  dZt,        d[d\d]B       |j%                  d^t,        d[d_d`B       |j%                  daddb       |j%                  dcddd       |j%                  det.        dfdgdhB       |j%                  dit.        dfdjdkB       |j%                  dlt.        dfdmdnB       |j%                  doddp       |j%                  dqddr       |j+                  ds      }|j%                  dtd9duv       |j%                  dwddx       |j%                  dyddz       	 |j1                         }t2        r)t        j                  d{d  st5        d|       	 t7                t        s^g }|j8                  D ]F  }t;        j<                  d}|      r|d{d d~|d	d  }|j?                  |jA                  dd             H ||_        g }	g }
|j8                  D ]~  }t        jB                  jE                  |      r|	j?                  |       4t        r|
j?                  |       Lddl#m#}  ||      }|r|	jI                  |       n|
j?                  |        |
r d}tK        |djM                  |
      fz        |	|_        |jN                  rd|_(        |jP                  rd|_)        |xjT                  dz  c_*        |xjV                  dz  c_+        djM                  |jX                  xs g       |_,        t[        |d|j\                  dk(         t[        |d|j^                  xs |j`                  xs |jb                         |jb                  rte        |jb                  d      a3dji                         D ]F  }g }|jj                  rtm        ||      r|j?                  |       |s1tK        dto        |      z          |j8                  D cg c]k  }t        jB                  jq                  t        jB                  js                  |j                  d                  |dd  dv r|dd  ndj                  d      z   m c}|_        |j\                  ju                  d      dz   }d|vrd|z   }||_.        tw        |      }|jx                  d|jz                  |_>        |jB                  |_?        d|j\                  j                         v r		 dd lA}dd lB}dD ]  }tm        ||      }|j                  d      s!t        d|d{d  d       te        |d{d  d      5 }t[        |||j                         j                  d      j                                d d d         |j                  rEdt        j                  |j                  j                  d            j                  d      z   |_G        t        |j                        D ]  }	 t        |j\                        |_.         n |j                  rt5        dd       t        |      aPt        |      }|jP                  rG|jN                  s;|j                  r/t        d       d|_'        d|_S        t        ||j                        }t        r(t                t        djM                  t                     tf        rtf        j                          |j                  rt        d|j                  z         t        j                  |j                  rd       y d{       y c c}w #  Y xY w# t2        r2t        j                  d{d  st5        d|       	 t7                w #  Y w xY ww w xY wc c}w #  d}t        d|d        xY w# 1 sw Y   xY w# t        $ r   ||j                  dz
  kD  r Y xY w)N19970815z%Y%m%dr   idnarem	cpu_countr   r   r   z	{0}, v{1}z	--versionz--wsz+copyparty up2k uploader / filesearch tool  z
NOTE: source file/folder selection uses rsync syntax, meaning that:
  "foo" uploads the entire folder to URL/foo/
  "foo/" uploads the CONTENTS of the folder into URL/
NOTE: if server has --usernames enabled, then password is "username:password"
)formatter_classdescriptionepilogrq   z(server url, including destination folder)typehelpr  +zfiles and/or folders to process)r  nargsr  z-v
store_trueverbose)actionr  z-aPASSWDz>password (or $filepath) for copyparty (is sent in header 'PW'))metavardefaultr  z--baz>password (or $filepath) for basic-auth (usually not necessary)z-szfile-search (disables upload)z-xREGEXr_   z_skip file if filesystem-abspath matches REGEX (option can be repeated), example: '.*/\.hist/.*')r  r  r  r  z--okz2continue even if some local files are inaccessiblez--touchzRif last-modified timestamps differ, push local to server (need write+delete perms)z--owz0overwrite existing files instead of autorenamingz--owoz0overwrite existing files if server-file is olderz--spdzprint speeds for each filezshow version and exitzprint linksz-uz7print list of download-links after all uploads finishedz-udz.print download-link after each upload finishesz-ufPATHz$print list of download-links to file)r  r  r  compatibilityz--clszclear screen before startz--rhTRIESzYresolve server hostname before upload (good for buggy networks, but TLS certs will break))r  r  r  r  zfolder syncz--dlz"delete local files after uploadingz--drz<delete remote files which don't exist locally (implies --ow)z--drdzdelete remote files during upload instead of afterwards; reduces peak disk space usage, but will reupload instead of detecting renameszafile-ID calculator; enable with url '-' to list warks (file identifiers) instead of upload/searchz--wsaltShunter2z9salt to use when creating warks; must match server configz--chsz:verbose (print the hash/offset of each chunk in each file)z--jwz,just identifier+filepath, not mtime/size toozperformance tweaksz-jCONNSzparallel connectionsz-JCORESzDnum cpu-cores to use for hashing; set 0 or 1 for single-core hashingz--szr  @   ztry to make each POST this bigz--szm`   z1max size of each POST (default is cloudflare max)z-nhzdisable hashing while uploadingz-nsz-no status panel (for slow consoles and macos)z--cxpSEC9   z-assume http connections expired after SECondsz--cd   z3delay before reattempting a failed handshake/uploadz--t-hs   z<crash if handshakes fail due to server-offline for this longz--safezuse simple fallback approachz-zzZOOMIN' (skip uploading files if they exist at the destination with the ~same last-modified timestamp, so same as yolo / turbo with date-chk but even faster)ry   z-tez+path to ca.pem or cert.pem to expect/verify)r  r  z-tehz$require correct hostname in -te certz-tdzdisable certificate checkr   z*** hit enter to exit ***z^/[a-z]/z:\r  r[  )globz'some files/folders were not found:
  %sr  Tr   |rL  -r  wbzdl dr drd wlistz--safe is incompatible with r   r   )r[  r  r`  zhttp://zhttps://z>ERROR: https is not available for some reason; please use httpz

   r  )rC   r   $zreading password from file []r   zBasic z[H[2J[3J)r7  z
pass 2/2: deleter9  zWARNING: %d errors)Yr   strptimerI  rB  r   systemr   r  r   r  
S_BUILD_DTr   r?  argvr   argparseArgumentParserr  add_argumentr   files_decoderadd_argument_grouprw   float
parse_argsEXErC  inputr  r  r  r_   r   r   existsr  extendr   r   re  drr  r  r0  r5   r   rq   r  r  ufr   r  ru   r  r   r)  r  r  r  r   rr   rt   r   r  rs   r   zipfiler  r   r   r  r   base64	b64encoder  rhr|  ru  clsrf   r  r  r  rd  r  r  r   r  r.  )r  hcoresverr5   r  apprp   r  fnfokfngr  fnsr   r  r  r;  rq   r   r  r   r%  ctls                          r   mainr    s	    	MM*h'IIf
		%&r;7R\\^QD1E]F


Z
3Cchhc
883aqF{3CH &&sHux{H{ E  B OOE.XOYOOG-sAbOcOODIO>OOD(B=}O~OOFHb?O  AOOD4SOTOODw  PrO  sOOF<6jOkOOIl  :NO  OOOF<6hOiOOGL7iOjOOGL7SOTOOK;ROS				.BOOD4mOnOOE,5eOfOOE>dOe				0BOOGL7ROSOOFgq  HcO  d				.BOOF<6ZO[OOF<6tOuOOGL  8@O  A			  !D  
EBOOIGS)  SNO  OOOGL7sOtOOF<6dOe			 4	5BOODsGQE[O\OODsGV  KQO  ROOFeRFfOgOOG#ubGzO{OOE,5VOWOOE,5dOeOOG%IxOyOOFqG|O}OOH5%  LJO  KOOH\8VOWOOD  5TO  U				&BOOE60]O^OOF<6\O]OOE,5POQ^^sxx|./
 (( 	.ByyR("$Qq'2ab62JJrzz#t,-	. 
C
Chh 77>>"JJrNJJrN "r(C

3

2 6V[[-//00BH	vv	uuEE[EFFkF88BDDJBBDB3'Brtt-ruu-.	uut$$$& H77wr1~KKN:SYFGGH   	(('):;<rsV{*1RS6
:
:7
C	DBH 
s	c	!BB^BF
2,C::szz2BGhhBGRVV\\^#	  AR^==r!"v?@bfd# AqAqvvxw7==?@A A	A 
uu6++BEELL,ABII'RR255\ 	266]BF 
vv%2.
r(C
b'C	uuRVV"#"cii dii
xx"chh/0HH#&&Q a G 4J sxx|./ $3@(	PAQ()A A ! 		25519} sg   
i=i=*j
 
j A0kk 9k#	k0j
%k0
j;:k;j?=kk #k-	0l__main__)F)o
__future__r   r   r   r  r@  r  r0   rJ  r.  r  r  r   platformr  rI   rs  r  r?  r@   r   boolr   r  r  mr   version_inforA  r   r   httplibr   r	   urllibr
   r   urlparser   r   dont_write_bytecoder)  bytesr  urllib.parser   r   http.clientclientqueuer   r   r  rB  timezoneutcr&   rK  r   tzinfor   	maketransr3   r6   urlsafe_b64encoder   r9   rA   r=   rR   objectrf   r   r  r*  r   r  r  r  r  r  r   r   r	  r:  r<  rC  rK  rb  rd  rD  r|  r  r  r   r  r  r  r  r  r  r  r  r  r   r  ArgumentDefaultsHelpFormatterRawDescriptionHelpFormatterr  r  r+   r'   r   r   <module>r     s   7	
        	  	    
  
73%()
 

& (S
& !%-"CE0M681%GM y.Y&




C"	'ooeU+G$ DM
	I 	Y " e  &Y6 Yx (


)..
6 B` `FM+V M+` 
	 
 F%A %AP [4	/+ 2yc..7GGH0&-T'2")'X.Y x.bC	 & C	 L	(
0
0(2V2V 	S!l zF S5
A	!H	D h  #Gx  &C'&&Gs$   I
 <I J 
I0JJ!