Ñò 922Wc!@sòddkZddkZddkZddkZddkZddkZddkZdd„Zda da ddd„Z dd=d„ƒYZ dd>d „ƒYZ d ad ad d „Zd e fd „ƒYZeZde fd„ƒYZdd?d„ƒYZdefd„ƒYZdd@d„ƒYZd d„Zd dd„Zd„Zedjo–eeiƒdjo"eiddjoedIƒned dd!d ddJdKdLƒed&dd!d ddMdNdOdPƒ ed'd(d!d)ddQdRdSdTƒ ed*d+d!d ddUdVdWƒed,d-d!d.ddXdYdZƒed/d0d!d1dd[d\d]ƒed2d3d!d dd^ƒed4d5d!d6dd_ƒed7d8d!d9dd`ƒed:d!d!d ddadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsƒndS(tiÿÿÿÿNicCs]yNd}ti|ti|ƒ}tid|ƒd}|djodS|SWndSXdS(s Get the real terminal width tabcdefghthhhhiiiPN(tfcntltioctlttermiost TIOCGWINSZtstructtunpack(tfdtbuftret((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytterminal_widths gð?cCsDtiƒ}tdjp|t|jot|ƒa|antS(s6 Get the real terminal width, but cache it for a bit. N(ttimet_term_width_valtNonet_term_width_lastR (Rt cache_timeouttnow((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytterminal_width_cached-s    t TerminalLinecBsMeZdZdd ddd„Zd„Zdd„Zd d„Zd „ZRS( sB Help create dynamic progress bars, uses terminal_width_cached(). iigð?cCs\|djo |}n||_t||ƒ|_|i|jo ||_nt|_dS(N(Rt_min_lenRt_llentFalset_fin(tselftmin_resttbeg_lenRR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyt__init__;s    cCs|i|iS(s Usable length for elements. (RR(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyt__len__DsicCs$|i|jodS|i||S(sw After a fixed length, split the rest of the line length among a number of different elements (default=2). i(R(Rtfixedtelements((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyt rest_splitHscCse|djot|ƒ}nt|ƒ|jo t|_n|iodS|it|ƒ8_|S(s‹ If there is room left in the line, above min_len, add element. Note that as soon as one add fails all the rest will fail too. tN(RtlentTrueRR(Rtelementtfull_len((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytaddOs   cCs|iS(sA Current rest of line, same as .rest_split(fixed=0, elements=1). (R(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytrest]sN( t__name__t __module__t__doc__RRRRR%R&(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR8s    t BaseMetercBsheZd„Zddddddd„Zdd„Zdd„Zdd„Zdd„Zdd„Z RS(cCsad|_d|_d|_d|_d|_d|_d|_d|_d|_ t ƒ|_ dS(Ng333333Ó?i( t update_periodRtfilenameturltbasenamettexttsizet start_timetlast_amount_readtlast_update_timet RateEstimatortre(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRbs         cCs­||_||_||_||_||_|dj ot|ƒd|_n|djotiƒ}n||_ |i i ||ƒd|_ ||_ |i|ƒdS(NtBi(R,R-R.R/R0Rt format_numbertfsizeR R1R5tstartR2R3t _do_start(RR,R-R.R0RR/((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR9os          cCsdS(N((RR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR:scCs||djotiƒ}n||i|ijp |i o9|ii||ƒ||_||_|i||ƒndS(N(RR R3R+R5tupdateR2t _do_update(Rt amount_readR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR;„s    cCsdS(N((RR=R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR<scCsV|djotiƒ}n|ii||ƒ||_||_|i||ƒdS(N(RR R5R;R2R3t_do_end(RR=R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytend’s    cCsdS(N((RR=R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR>™sN( R'R(RRR9R:R;R<R?R>(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR*as    icCs|a|adS(N(t_text_meter_total_sizet_text_meter_sofar_size(R0t downloaded((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyttext_meter_total_size¡st TextMetercBs/eZeid„Zdd„Zdd„ZRS(cCsti|ƒ||_dS(N(R*Rtfo(RRE((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR×s c Cs’|iiƒ}t|ƒ}t|ƒ}|idj o |i}n |i}t|iiƒƒ}d}tot |}|dt} nt ddƒ} | i d|ƒ} |i djod| i d|ƒ} | i dƒ} | i d|ƒ}d | i ƒ| i ƒ||| | | f}nQ|iiƒ}t|ƒ}|iiƒ}| i d|ƒ} | i d ƒ} |djo d }n | i d | d tdƒƒ}| i d|dƒ}| i d|ƒ}d| idƒ}dt||ƒ}||t||ƒdjo|d7}n| i d|||fƒ}d| i ƒ| i ƒ|||||| | | f }|ii|ƒ|iiƒdS(Nidiis | %5sBs %9st is %5sB/ss%-*.*s%s%s%s%s s ETA R s (%i%%)R$s (100%)s %2i%%it=gà?t-s [%-*.*s]s%-*.*s%s%s%s%s%s%s%s i is ii(R5t elapsed_timet format_timeR7R/RR.t average_rateR@RARR%R0R&tremaining_timet fraction_readR!RtintREtwritetflush(RR=RtetimetfetimetfreadR/tave_dlt sofar_sizetsofar_pcttltui_sizetui_timetui_endtui_ratetouttrtimetfrtimetfract ui_sofar_pctui_pctblentbartui_bar((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR<ÛsP         c CsHt|iiƒƒ}t|ƒ}|idj o |i}n |i}tdƒ}|id|ƒ}|id|ƒ}|i dj o ||i j} | o|idƒ} n|id ƒ} d|i ƒ|i ƒ|||| f} |i i | ƒ|i i ƒ| odStot|7anttjodadandS( Nis | %5sBs %9ss ... RFis %-*.*s%s%s%s is (RJR5RIR7R/RR.RR%R0R&RERORPR@RA( RR=Rt total_timet total_sizeR/RWRXRYtnot_doneRZR\((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR>s.      N(R'R(tsyststderrRRR<R>(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRDÖs 6tMultiFileHelpercBsAeZd„Zd„Zd„Zd„Zdd„Zd„ZRS(cCsti|ƒ||_dS(N(R*Rtmaster(RRk((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR8s cCs|ii||ƒdS(N(Rkt start_meter(RR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR:<scCs|ii||ƒdS(N(Rkt update_meter(RR=R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR<?scCs?t||iƒ|_t|iƒ|_|ii||ƒdS(N(RJR1t ftotal_timeR7R2t ftotal_sizeRkt end_meter(RR=R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR>CscCs|ii|||ƒdS(N(Rkt failure_meter(RtmessageR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytfailureHscCs|ii||ƒdS(N(Rkt message_meter(RRr((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRrKsN( R'R(RR:R<R>RRsRr(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRj7s      tMultiFileMetercBsÅeZeZd„Zdddd„Zd„Zdd„Zd„Z d„Z d„Z d„Z d„Z d „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„ZRS(cCs‹g|_g|_tiƒ|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_tƒ|_dS(Ng333333Ó?i(tmeterstin_progress_meterstthreadt allocate_lockt_lockR+Rtnumfilestfinished_filest failed_filest open_filesRft failed_sizeR1tfinished_file_sizeR3R4R5(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRPs            cCs’|djotiƒ}n||_d|_d|_d|_||_d|_||_d|_ ||_ |i i ||ƒ|i |ƒdS(Ni(RR R{R|R}R~RfRR1R€R3R5R9R:(RR{RfR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR9as          cCsdS(N((RR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR:oscCs.|djotiƒ}n|i|ƒdS(N(RR R>(RR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR?rs cCsdS(N((RR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR>vscCs|iiƒdS(N(Rztacquire(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytlockyscCs|iiƒdS(N(Rztrelease(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytunlockzscCs#|i|ƒ}|ii|ƒ|S(N(t helperclassRvtappend(Rtnewmeter((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytnewMeter~scCs|ii|ƒdS(N(Rvtremove(Rtmeter((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyt removeMeterƒscCs‰||ijotdƒ‚n|iiƒz7||ijo#|ii|ƒ|id7_nWd|iiƒX|i||ƒdS(Nsattempt to use orphaned meteri( Rvt ValueErrorRzRRwR†R~Rƒt_do_start_meter(RRŠR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRlˆs cCsdS(N((RRŠR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR”scCs|||ijotdƒ‚n||i|ijp |i o6|ii|iƒ|ƒ||_|i||ƒndS(Nsattempt to use orphaned meter(RvRŒR3R+R5R;t _amount_readt_do_update_meter(RRŠR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRm—s  cCsdS(N((RRŠR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR sc Cs°||ijotdƒ‚n|iiƒz^y|ii|ƒWntj onX|id8_|id7_|i|i 7_Wd|ii ƒX|i ||ƒdS(Nsattempt to use orphaned meteri( RvRŒRzRRwR‰R~R|R€R2Rƒt _do_end_meter(RRŠR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRp£s cCsdS(N((RRŠR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR±sc CsÚ||ijotdƒ‚n|iiƒz…y|ii|ƒWntj onX|id8_|id7_|io&|i dj o|i |i7_ n d|_ Wd|ii ƒX|i |||ƒdS(Nsattempt to use orphaned meteri( RvRŒRzRRwR‰R~R}R0RRRƒt_do_failure_meter(RRŠRrR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRq´s  cCsdS(N((RRŠRrR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR‘ÅscCsdS(N((RRŠRr((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRtÈscCs.|i}x|iD]}||i7}qW|S(N(R€RwR2(Rttottm((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRŽÍs   N(R'R(RjR…RRR9R:R?R>R‚R„RˆR‹RlRRmRRpRRqR‘RtRŽ(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRuNs(               tTextMultiFileMetercBsDeZeid„Zd„Zd„Zd„Zd„Zd„Z RS(cCs||_ti|ƒdS(N(RERuR(RRE((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRÕs c CsT|iiƒz2d}|i}|ipd}dt|ƒ|d}|ii}|i}d|iiƒpdd} |ii ƒ} |ii ƒ} | djo d} n | | } t |ƒd} t |ƒd}t | dƒ}t | dƒ}d||||| || ||f}|iid|ƒ|iiƒWd|iiƒXdS( NsDfiles: %3i/%-3i %3i%% data: %6.6s/%-6.6s %3i%% time: %8.8s/%8.8siidg\Âõ(\ß?iR6s%-79.79ss (RzRR|R{tfloatR5R2RfRMRIRLRR7RJRERORPRƒ(RRŠRtformattdfttftpftddttdtpdtdttrtttttfddtftdtfdttfttR\((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRÚs,      &c CsÂ|iiƒzd}|i}|i}t|ƒd}|iiƒ}t|dƒ}t||ƒd} d||||| f} |ii d| dƒWd|ii ƒX|i ||ƒdS(Ns %-30.30s %6.6s %8.8s %9.9sR6isB/ss%-79.79ss s ( RzRR.R2R7R5RIRJRERORƒR( RRŠRR–tfnR0R8tettfettfrateR\((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRõs   c Csõ|iiƒzÐd}|i}t|ƒtdƒtdƒfjo|iƒ}n|p dg}nd||d|dpdf}|iid|dƒx*|d D]}|iid |dƒq­W|iiƒWd|i||ƒXdS( Ns%-30.30s %6.6s %sR us%-79stFAILEDis s is ( RzRR.ttypet splitlinesRERORƒR(RRŠRrRR–R¤R\R“((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR‘s  % " cCs&|iiƒzWd|iiƒXdS(N(RzRRƒ(RRŠRr((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRts cCsS|id|ƒ|iiƒz!|iidƒ|iiƒWd|iiƒXdS(Ns (RRRzRRERORPRƒ(RR((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR>s  ( R'R(RhRiRRRR‘RtR>(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR”Ôs     R4cBsqeZdd„Zd d d„Zd d„Zd„Zd„Zd„Zd„Z d„Z d „Z d d „Z RS( g@cCs ||_dS(N(t timescale(RR«((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR)scCsN|djotiƒ}n||_||_||_d|_d|_dS(Ni(RR ttotalR1R3R2tave_rate(RR¬R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR9,s     cCs©|djotiƒ}n|djo ||_d|_d|_dS||i}||i}|io.||_|i|||i|iƒ|_n||_dS(Ni(RR R3R2R­t_temporal_rolling_aveR«(RR=Rt time_difft read_diff((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR;4s         cCs|iS(s/get the average transfer rate (in bytes/second)(R­(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRKJscCs|i|iS(sEthe time between the start of the transfer and the most recent update(R3R1(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRINscCs0|i p |i odS|i|i|iS(sestimated time remainingN(R­R¬RR2(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRLRscCsB|idjodS|idjodSt|iƒ|iSdS(s[the fraction of the data that has been read (can be None for unknown transfer size)igð?N(R¬RR•R2(R((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRMWs cCs7||}|djo d}n|i||||ƒS(sqa temporal rolling average performs smooth averaging even when updates come at irregular intervals. This is performed by scaling the "epsilon" according to the time since the last update. Specifically, epsilon = time_diff / timescale As a general rule, the average will take on a completely new value after 'timescale' seconds.igð?(t _rolling_ave(RR¯R°tlast_aveR«tepsilon((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR®`s  cCsby||}Wntj o d}nX|djo|S|djo|S||d||S(sKperform a "rolling average" iteration a rolling average "folds" new data into an existing average with some weight, epsilon. epsilon must be between 0.0 and 1.0 (inclusive) a value of 0.0 means only the old value (initial value) counts, and a value of 1.0 means only the newest value is considered.iN(tZeroDivisionErrorR(RR¯R°R²R³t recent_rate((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR±ls   g.@cCsn|djodStti||ƒtidƒƒ}t|ƒ}|djo|Stt|ƒ|?|>ƒS(s—round the remaining time, depending on its size If rt is between n*start_time and (n+1)*start_time round downward to the nearest multiple of n (for any counting number n). If rt < start_time, round down to the nearest 1. For example (for start_time = 15.0): 2.7 -> 2.0 25.2 -> 25.0 26.4 -> 26.0 35.3 -> 34.0 63.6 -> 60.0 igi(RNtmathtlogR•(RRžR1tshift((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyt_round_remaining_time}s &  N( R'R(RRR9R;RKRIRLRMR®R±R¹(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR4(s      cCs¥|djp |djo|odSdSnt|tdƒjodSt|ƒ}|d}|d}|o&|d}|d}d|||fSd||fSdS( Nis--:--:--s--:--tinftInfinitei<s%02i:%02i:%02is %02i:%02i(RR•RN(tsecondst use_hourstminutesthours((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyRJ‘s     RFc Csddddddddd g }|o d }nd }d }d }t|ƒd}x3||jo%||jo|d}||}qWWt|ƒtdƒjpt|ƒtdƒjo d}n|djo d}nd}|t|pd ƒ|||fS(s4Turn numbers into human-readable metric-like numbersR tktMtGtTtPtEtZtYg@@g@içiils%i%s%sgfffffæ#@s%.1f%s%ss%.0f%s%s(R!R©R•( tnumbertSItspacetsymbolststeptthreshtdeptht max_depthR–((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyR7¢s2   2   c GsÁtƒ}d|||f}|i|d|||d|ƒ|}d} xe|D]]\} } | d7} xD||| t|ƒjo(|| 7}|i|ƒti| ƒqhWqOW|i|ƒdS(Ns (%d/%d): %ss"http://www.example.com/path/to/fn/R/ii(RDR9R!R;R tsleepR?( R¤tcurR’tbegR0targsttmR/tnumtofftinctdelay((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pyt_tstÉs      t__main__iR¬ièi'i@Bssm-1.0.0-1.fc8.i386.rpmi gš™™™™™É?gš™™™™™¹?idgÐ?ss-1.0.1-1.fc8.i386.rpmsm-1.0.1-2.fc8.i386.rpmiiˆs1large-file-name-Foo-11.8.7-4.5.6.1.fc8.x86_64.rpmis2large-file-name-Foo2-11.8.7-4.5.6.2.fc8.x86_64.rpmii!¡s2large-file-name-Foo3-11.8.7-4.5.6.3.fc8.x86_64.rpmii²q s2large-file-name-Foo4-10.8.7-4.5.6.1.fc8.x86_64.rpmis2large-file-name-Foo5-10.8.7-4.5.6.2.fc8.x86_64.rpmii‰s2large-file-name-Foo6-10.8.7-4.5.6.3.fc8.x86_64.rpmi iNs1large-file-name-Foox-9.8.7-4.5.6.1.fc8.x86_64.rpmgà?i †((((iø*iRiH”iˆÖiÈ.iØ?.ièf.iø.i8Ð=(i gš™™™™™É?(i gš™™™™™¹?(idgÐ?(i gš™™™™™É?(idgš™™™™™¹?(idgš™™™™™¹?(idgÐ?(i gš™™™™™É?(idgš™™™™™¹?(idgš™™™™™¹?(idgÐ?(iègš™™™™™É?(iègš™™™™™¹?(i'gš™™™™™¹?(iègš™™™™™É?(iègš™™™™™¹?(i'gš™™™™™¹?(iègš™™™™™É?(iègš™™™™™¹?(i'gš™™™™™¹?(idgš™™™™™¹?(idgš™™™™™¹?(igš™™™™™¹?(i gà?(i †gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i †gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i †gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i †gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i'gš™™™™™¹?(i †gš™™™™™¹?(igš™™™™™¹?(RhR R¶RxRRRR RR RRRR*R@RARCRDttext_progress_meterRjRuR”R4RJR7RÙR'R!targv(((s7/usr/lib/python2.6/site-packages/urlgrabber/progress.pytsj         )> 5_†Ti '  *