From 5d3bcae50f6f7185984ffdf960a0bc5444b3d556 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rog=C3=A9rio=20Brito?= Date: Tue, 15 Jul 2014 22:31:35 -0300 Subject: [PATCH] Imported Upstream version 2014.07.15 --- README.md | 2 +- README.txt | 2 +- test/test_playlists.py | 10 +- test/test_subtitles.py | 2 +- test/test_youtube_signature.py | 6 + youtube-dl | Bin 497552 -> 509479 bytes youtube-dl.1 | 2 +- youtube_dl/__init__.py | 6 +- youtube_dl/extractor/__init__.py | 13 +- youtube_dl/extractor/common.py | 15 ++- youtube_dl/extractor/criterion.py | 51 ++++---- youtube_dl/extractor/firedrive.py | 83 +++++++++++++ youtube_dl/extractor/gameone.py | 90 ++++++++++++++ youtube_dl/extractor/gorillavid.py | 20 +++- youtube_dl/extractor/goshgay.py | 73 ++++++++++++ youtube_dl/extractor/mtv.py | 3 + youtube_dl/extractor/ndr.py | 12 +- youtube_dl/extractor/pyvideo.py | 2 +- youtube_dl/extractor/reverbnation.py | 45 +++++++ youtube_dl/extractor/ruhd.py | 46 +++++++ youtube_dl/extractor/screencast.py | 112 ++++++++++++++++++ youtube_dl/extractor/soundcloud.py | 31 +++-- .../{southparkstudios.py => southpark.py} | 12 +- youtube_dl/extractor/tenplay.py | 84 +++++++++++++ youtube_dl/extractor/tlc.py | 5 + youtube_dl/extractor/tutv.py | 21 ++-- youtube_dl/extractor/vimple.py | 86 ++++++++++++++ youtube_dl/extractor/vodlocker.py | 63 ++++++++++ youtube_dl/jsinterp.py | 40 ++++++- youtube_dl/utils.py | 8 +- youtube_dl/version.py | 2 +- 31 files changed, 863 insertions(+), 84 deletions(-) create mode 100644 youtube_dl/extractor/firedrive.py create mode 100644 youtube_dl/extractor/gameone.py create mode 100644 youtube_dl/extractor/goshgay.py create mode 100644 youtube_dl/extractor/reverbnation.py create mode 100644 youtube_dl/extractor/ruhd.py create mode 100644 youtube_dl/extractor/screencast.py rename youtube_dl/extractor/{southparkstudios.py => southpark.py} (73%) create mode 100644 youtube_dl/extractor/tenplay.py create mode 100644 youtube_dl/extractor/vimple.py create mode 100644 youtube_dl/extractor/vodlocker.py diff --git a/README.md b/README.md index dffdaa9..bc5e0f7 100644 --- a/README.md +++ b/README.md @@ -255,7 +255,7 @@ which means you can modify it, redistribute it or use it however you like. 128K (default 5) --recode-video FORMAT Encode the video to another format if necessary (currently supported: - mp4|flv|ogg|webm) + mp4|flv|ogg|webm|mkv) -k, --keep-video keeps the video file on disk after the post-processing; the video is erased by default diff --git a/README.txt b/README.txt index 0f9c470..5555b2a 100644 --- a/README.txt +++ b/README.txt @@ -283,7 +283,7 @@ Post-processing Options: 128K (default 5) --recode-video FORMAT Encode the video to another format if necessary (currently supported: - mp4|flv|ogg|webm) + mp4|flv|ogg|webm|mkv) -k, --keep-video keeps the video file on disk after the post-processing; the video is erased by default diff --git a/test/test_playlists.py b/test/test_playlists.py index 994b1d4..1a38a66 100644 --- a/test/test_playlists.py +++ b/test/test_playlists.py @@ -111,7 +111,7 @@ class TestPlaylists(unittest.TestCase): ie = VineUserIE(dl) result = ie.extract('https://vine.co/Visa') self.assertIsPlaylist(result) - self.assertTrue(len(result['entries']) >= 50) + self.assertTrue(len(result['entries']) >= 47) def test_ustream_channel(self): dl = FakeYDL() @@ -137,6 +137,14 @@ class TestPlaylists(unittest.TestCase): self.assertEqual(result['id'], '9615865') self.assertTrue(len(result['entries']) >= 12) + def test_soundcloud_likes(self): + dl = FakeYDL() + ie = SoundcloudUserIE(dl) + result = ie.extract('https://soundcloud.com/the-concept-band/likes') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], '9615865') + self.assertTrue(len(result['entries']) >= 1) + def test_soundcloud_playlist(self): dl = FakeYDL() ie = SoundcloudPlaylistIE(dl) diff --git a/test/test_subtitles.py b/test/test_subtitles.py index 5736fe5..48c3021 100644 --- a/test/test_subtitles.py +++ b/test/test_subtitles.py @@ -87,7 +87,7 @@ class TestYoutubeSubtitles(BaseTestSubtitles): def test_youtube_nosubtitles(self): self.DL.expect_warning(u'video doesn\'t have subtitles') - self.url = 'sAjKT8FhjI8' + self.url = 'n5BB19UTcdA' self.DL.params['writesubtitles'] = True self.DL.params['allsubtitles'] = True subtitles = self.getSubtitles() diff --git a/test/test_youtube_signature.py b/test/test_youtube_signature.py index 8d46fe1..d955339 100644 --- a/test/test_youtube_signature.py +++ b/test/test_youtube_signature.py @@ -33,6 +33,12 @@ _TESTS = [ 90, u']\\[@?>=<;:/.-,+*)(\'&%$#"hZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjiagfedcb39876', ), + ( + u'https://s.ytimg.com/yts/jsbin/html5player-en_US-vfl0Cbn9e.js', + u'js', + 84, + u'O1I3456789abcde0ghijklmnopqrstuvwxyzABCDEFGHfJKLMN2PQRSTUVW@YZ!"#$%&\'()*+,-./:;<=', + ), ( u'https://s.ytimg.com/yts/jsbin/html5player-en_US-vflXGBaUN.js', u'js', diff --git a/youtube-dl b/youtube-dl index 3d28bb5f02d859062b9e6da302c60f58888139b0..73304fea2d5a7b72201c315456252900fdb584c9 100755 GIT binary patch delta 76025 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

EV`j z`j9#u<@Jn7^ zDTDqxb$boX*`8~N#&6C*C1@+`OF0xN3b^frLU{TVQd_0M1}8H>pt<*}fjkBR75BJ2j=o?JYMh)wDq>JHvpFLF54|X0TZz@byz?gtdV)fm zZg(d-jE;k>^Z6{CL4jKJT0%D(Z>yWPHqlcw zGEO;3saGHT-mEsjn!di?MZ{{p$+8na%zQKLT0LC&Sp%#B_!CJJ>$~yGJm(1qT0U$0 z_(NQIX`z~Y7~U@MTMoH3mWgfJ+9-)J-FXbX_-vHz(GsjYxpX4mlvevBztB*g`C(rX^HpHklrmddeI>rw>jZw^vf;aFA zy>*i$^_{^$@1=N|Mpc#RpUgPnKbZ3KD11ow?!-G?5jtxOd*9FR<^4=Qf1j2mu^g9Q zz(VmaMYXcXsQX*mRl)gnZJ_02riD2tH1STz_It^w>2n7GPfh>it5y5yW&_v%R;uSS zJ*%XWa`N|@Z@U0LdXJQ)BN+>-e^&|awF$X4286o-;RNmfuIt2+(NnP7SITc9EI`8{ ze=JjLeMsw75-Hkdj_hQp5?u+jR~^h{rajI7EKaiMDxilbr(Ld64WmCr@8YYZ!||O@>;i zG0v|8q0IW?&b=)F&K@Q!(=qqIiTj|Ki_<^n7mcoCkbn1i=)PZpr4{-)H*I`eU8J8l z)?(7J1%rcE+a>{F;utwRxy-ATK#%b=rBrs9_8QY%6hv%FFI}8>oy)c@z>zbbl2{oC}vtBhWuSn6} zd`d`9LTfcw<0@<9>=`HFR~w7HG1{hWP(tDF_~DD^#O|j5w1>6R!}HU_M-(=+koW49 zUak;@e1pZX4KlxSap$%K$L9t6u8pZDCR#JiNvr-oktlIhl4C0Rmhnj0uu-NdXK-!- z-o8wtQo1mj7B-WO)W*IE`gwS8aeW`df-T5UWF_Ha%?f!J#CEDM%2}Ug#o4;KZnr&b zg%}^Yq7V|-4o~khH`97UQvTJ`&xl(0EV4GL5sFIxLTY)W$}#2Zy>zPUQQr?hLFaf2 zjXnS~7-79t(5?0PcPPfJ?S;wE(;m+QEOr0lpjmlZ?m`4ORWkJ;W3?GqGb+$^9_{t$ zYj1|@Z;mjPJPgsi76N-%e6CA-%Q?=q?SHbuuh>hW=jER0g-On?;Ouk?dyRkWPD0 z1;HEt=4J=9Ox7xAzwN}LxWS$I$pzpDC-q>lrECTL&@_BoP+mnR?4G2wCg>8aS*7!f zikUVZNnnz|&q#oIxkRkB5xDHJ2$!rBe zrM821Cu@ej*C5dIkZ)ap=UJNM z3`>@M=aC*qcfrOSb+F6`W)l9HJ5rdXV=|`9S>2Fyq^zP@w-!mXt0FYUl@}VD7J0o83R#z72?xnc^u6_=jZ1q zOs>(bxOVS2EJ7CiHllC({yOCMtp6o{YmLs*o7w_i@wZx)ZxIhjbpIL1!|6A_@m~L4 zM}Zs)4#x+A3{IEq*?fUH6;iIn%c(tws+{bfw&aSxUfI}4%!FY~nr#z`n$)!=FwlMR z>(5Ek1cvXcft{*aoUZ=ZO@>(hi@QRlYZOO+UH8vHZ%cdTKyuvKc}n9*lDZA z-=53J8WMRL7jEkQ)YBvMQ77N!je(zhNs_}?F2dc}><&y45=j-zeR-^{wzl#Tf02FQ z(xWe)uDK{5jV4yfgEZ*qhIbyTO#1Kl+|YaU6qKXuVvr4xfx6jlz7y=E+z?_x&`~~%c_9{ljdrYsIoYWPtZ&{~42->(idGw+mpYZkwqzsR z!VDsvvWYLSiI0-kAvjyjFN*z3e5;Scdabc@vW(14D|L}RT(w*Ks?_Zbm5yf|>t^zC z9%%3_xmolu!>3w6Ps@ss*-Ue{yXMg3>DL1EOR=*jfT9bB4oK4so?A*PyiR*~WBd6Y zYb8XB6AU6rUU7jRnqT&lyo0{plLS=JQ6uyU(5nKi5}$`goQPBJ7F?%K3Nq%F3V|T8 z;F2f!lv-)cw<7e?5w^cBv+aC%Ze$Z`G&t>5eqJ7K|1N%hDGob5m2m`gw{iBz9!`eG|OzMsi0Z51OK#>p6s2WL4188BWpJ(hiztpbk>*pY1 zkl|b&fQqsawn5k0yfEC*#GQluQ&BIVk_>iDQF=MUKsni2=r*1T)_bKlhJ(L0BpPaW~hAdqASM~h1T&I$k^tZ-01hpsK{(} z^-jS9R6P6ZGA_^$BHN9jh{4%E29h(hK{OXqROh;&eTXC{8(I+^YXu0$zi|sDZEK9 zx-JHi@Vs+VVek95*WHWe2MJG|&s)IK59hlGItyxFRyswphsn>Ese$9nWpS!d%+2*0 z)XfN$;;Jgk3UUX7Kq2*sv1HS!9&X%8zfxN_=iSe^g{mN`+ z)HG`^)vn5yt)XQG`X5<%_pE`yY9Wra#yps@p)(T{#WD@Uanozh4-JRBF`oWwO94%p z;;Kg{OA37JuY=cK%M?uJq8kij-gUu*n5{c5>8;j-@(I7w18Z9m@m~(F#BY>Ap zjNses4v;-4MR`ETuy2o9_!WMPCwvd}(C-^tTJPcw&t6ly4L3;JTP6puNugu^68Ct zgeR8Kx%Xwg+$!WCRBTk0+ebqN_UCCv(ms_?lii`nFun=C5BP${3rLTp;dr{N;9>yM zRLPv5h~Cg}3P2Q6yiBemDO~IF&&Xy}=mdk~mB*ecLdPi77GAYwHYw%+EZUbsqa}|+$V8;dtUirJYDw>_^ri+?!NcwFR{{0{EoO82@D`;x4lzV<;}^96v7MBgQP(=ELZfm!TECr?*H}<(1$^ z5SDqR4o~NwrsW`Hq&B=@6-kwkPXcZ79NjtT6fGxD%3{hLKo=!`S}c>OTC9rz^6

xQkypG>eFBYgE>2D+@4DMlCM=F;n8;+nCjUy4aAmE>}GEH55J1Hr;vhII?k#6We=qk1a0O6l5V_tnofU*0R z-LIQTJ;2dz;N#Wfoyh&vXS$l_aLc+-OrDfnXz8n~e8|-fUyR*@Zgc(Pk~PrA?w8VF zdt}Cky5d;!9_!%O#D~zdK&Bv@r|3L@WtuiLdn%zeEj zdwp|H_>0Nt;KTe!Iy>C#D*Z?E5mub3;eGERA?qq4Lc7#tZ!NBKl0qp{8ec*ZwtfBD zyt3%<{CNqLVc0g4RYS!Mcj6|_Cy+(K;FhpWWH-n?-4J=4^THij=?>9SOy%w7%nrMj zR>W;`V22fVW+>th1B^G`k27C)L)b>os|+$M6Hgv__5ywF$WYx9vS)RZl6wk#CgRj zfpWmpFFxmNipzXIm54C~Nxzg|RN386^66-hr_{ZY3DwsuYDzE9_mx&}ywndR?pkw2 zrTB_@SHp?W}tm3TDoBwsaqJO0E zF`0sNdY(1Fm$(ff2}sWIlssI043|tAAGk>lwVj^_-+1M)lJFzC z+XzoVR=sCadz}Nh7Uh16hIF~0l`L&jbjymc{=%s8F?yeB3@&NHY>rIkqpn+}G+oG2 z37g`}5s@|ZYQ894=DijDoVWIVSZayN4_>G5qRw8VXJi_(|TK6F)7vic%DiE1@uw4i;KV30VkPkOB<_sCa@B zcnZSt%|!CAxeA)}&9yPL?mme2jxe*d7{2drhr=!D``qfWOPeTj-t|mJQS{yM1iGQp zjjgxEqEd$Uy*=R?Hg~Hvil7Ttn?GxQ2CbBWd9}Q4)kjiU)k0ctyj02+8M0vLxKwA78hke9}QWhC>k4-C)BB#R_Gd# z%0h9RtjO>@RYkBzL1YUBeZzpQB&iGSsy zqm@$alcNg46Lwy(hd$h~<()ZA?-JMpAvLS|)gAz}QVU5e=z&U*LLF$SqR-gY0j02y z-9MXbC>Xvvlbv33tsSdyGq2O3oH~l7C$dNg+Vz39OoQOZ5e$1vK=hMt$}H7cl6$l& z1X31MA5PVybA+7a9I?$+`j%}P18I(#s6RYHRV`sBlDJb?ep_Q&(|XsE`uEtMt4gg+ z9%FYY@btrdDq?C3+Ok0VGbYSP7VSGOcEq9B6hf1_ao3trj3GkWDT8FEBa9;`xE_4Q=fQZ1&kdl#Oij z_psspQ|!-aqi3f$#1cs(;o6vYPnh943BeRAqpSvWik0}iIa;XZ^m;Uc4jDeWcu{>b z*X?P!L{%1MM*48>@RKjKh#b6aa#cK!=&b=AC7BF~`jk&go_dH;1;^lep0FTK)z6@} zRxioOL3!#xY)%rmVy&QXEJpqbojRX@gf30t(p>p7dVL!xEZt|^>@Y~M)j{m>X_gbq zk=y#i75vuCTV8^e)u(sF_Ka@YFSV>5D^=KW*%Pv9-fz|6+f7hGRLE!&I4K{1-ydo4 z%J|ztXpPNPv761vDQwYjA!BHKUCHtSXc+nPKL+id4`%oS)x5aJuIJA5>cyURxXyrW z7p^-!-KZfSa2qL|RLaYZ3T9=AZc(simDA1-<%lEFaSaDMu2`(0F)i$6KYhSKA#+Pg zk_>`%t_w$zOFBCVA33YouGFuifTl3idvfzb45j!`EyLX_1%Fn)!*=x`r1DG^fk2Ep zHnP^+EXV8vypB<8Y;dp{fAC~ka3dsH78gzF%0LKlKM=Idk|iSAGN!^d9ae?05*o{6 z;WyH;>;If?nlaf9X55^pyr2bwE^Zvj5~$)*@4t6^SGRDl@Jh#c5ec1wTXUjMm*(f6@}5Zf#@3#y{y;0nz#imru-rUWT!|N>uS%*kyaP_Xk4e*oMgl{ z=Q%*>Fif0REtYuFS*CbFRyxj}<4Wh}j^(2`P~Log*Yc$oZ5uMv1*W~w06%^cQfBqq zz_HG?srkq73SWqw{Sv?W4lN^d5W$5#-Pa=0G6*4OY?0-`XoIBb7QVbe84gbt0 z#O!AMEBxGTiST=1VeiD>A%>056L4_9g;2}?5eh6PgZ>t-tTO+79A&Ko=C^QmkL|Az zVc+@>();i~$d*GB7{vc!$uZew<3AvPfMn6668!|lO%%C8{=X*^wXPU|^B0DSvnV!= zDH61zR1UsB5hN{4k6Q#jOx^MnjDFx`F6wM7!Rf;MLTOy=NL9rhrL2N`CWgt&asO?l zsU@C$UaiAjSP{CKI()65?TQV?b^6!_hL&RiS%j%tyQA2&K(dJ{o{6l_#KN)oq-Bd- zkhUrh3Mw+*g(@4pBB_N4h~RgIPg*{ORFOD*p@3JW#EAsjtj>_X+f*uInlLy_nJD^pob!*lm*xYwuqoQ_Ka9P9HJ zRps@TcvocY2R4>~<-NdJ&6IO|o&AD}lN|FAuibmmFE*drjWUl)fV{g1seAPv94OUN z2k#_E%WwQJQpK?|5>Sze&1YB|we0zyc20@lA&ZCoB9A}nA%aMbqJM&va+ut)%{Vg?J=O@We^oAcYgY z3*4n#bWL(p9iWzC0QFI5GYjn-lCnMf1Y>#IE(8;X$8HIf@7Yi()#t0d7+GXT;7N!k z*QHpZM`>ZO#f03ixfk`FaUWfYIhxkyng~b|!ZH%+lC%L#Af_@HJtFAsexZ{7k{a5=#F7;@1>_M!$dtk;)wYBVV<`pY zh{@Aqg^BwJ5B#;sN|7Ni-~Ay#Nb6y}%is|WctB*np1#^Q%!;BAi8Pd8EJ#5@Dh<_w z@jWLCgdLTRb3B|Mcf))L#Kmr+87fzf{(*>20>#;mObh83u0L1JP-D?50TC(jNktgO z64Z2#Gne-{=bJIHaFs`_XVXZ!@^SAz%sW zv)vT43uBtZ1TB1v2UE-7K0Cr}VWDQgDz{7nFn4vKO9+9iB_KVYRWVc*ZQF4` z=q$8tMq$*z;-t(=AOV?G+~ze(8OL(d=(H=F@wU;CH>Yg-=AF9z1IE5d-d%l>ld)J| zYXU@Ng@EznydDs)r(&P-BF5LhrplJVe&Yx*QyRJzMB5^TAsU|+2UXdefI}pc$h(^7 zb_&_CuPshdC=~L0?qY={@jCyk?luXbIzHUgp67cHa)wUWob*gI2OcC+y+mOICz^9L z+LcY|IH0S1Q+9`+x^@pjijq>&^-Z^wmZjMtYX;aW2Yz($#5y3MzMl<}nrF_m<(>(? z6`ABzTPWGY_(SPt{FsYSS{FxDk;LaDcf7%mF+bQ-#JPe{Lx8P9zu>SAlR^m`^(3&a zt;oz?Hi!nd%&h(?`&as!LlMoC`;bZO*VE{evLHsZfGIOUTHU5QD14bx=4EC@ zo&gp}I(MvJ+cSW9jTQFoC`(5CUCFjl8|d!d6oF({^t?*1~jj{*UAZAa{S=qC2uWG*V|jP!Jo7k^G56y?{CU>d;k zGbY|Pc4OG-=T^LJRdqqDTjL!@d^Q)ZRVdH_K$lNksX}E42n2hhhBYD^B%!dP=Hr8O zKA$7|B-B0rzx3ho_6UT6Sn3F}J`IHlCPytW|gr7ZK6gpw21rzqos zO zr_9&G^~=3Lf^H1$#j35=T4VBVDxkaLDOew35qDjF(?8p~Oe&3r?3_w+c8t4wMk? z91XIMb$|Ze)VJ|rF8|$$-xpr3%y-&gIYQEKYn>DXigWNHP#P@k?M++#QY*0yHM}I(Ui*Z@)+#liteQS8tHE{i=DL6j$I&XIjSR zbnw*lrtEPORJrB|_d3?Hhaaf99V+W(ogrO#nV;}));qk|G}bUPtnH_E)m#D)%;bD{ zO}1n#4q4@$QnM4TxcH0vR3c-9=K66(Y#hXB=;*PsN^3NfZ?I%{oaHU_3S5kOxuCXMs z-G`GF4oX(J_E3ziq^c-2c*$g8Lf94V3oLZDHbYgh^hC7UEcOu~8B zDNO*lJeagAbSl+A)r+M50Sh{!RE&(+0aAMQLqBvO$mKitT-?N)noH2#6)xg*=j{MV zapYnr^Cfh`$AWxJZjjE;7YdQLK?xr2*ofF$AHKOH?g!D9yMOf@$?Yb{O*(J}PZJsA zt)8ICIAW1qv;LLsqxg9-RSp#Tt+sH1J3MFcKQvDrV1`nGtllx)Ev)0(D@a5Ktvq9u z6VP0#T}2t!1f=c_$uvoRp4dOLd20^A#QNtETT8LEQLlHo*t&W%=D=^oZ)6h*z+sod z;v^#Q#_#Qnrnpe7Fzm6M->67fz$RMXImErPpmTv&_ZO2I)y)?+eFse>Q5F){!;6(GZS=J%S@wPE8B5_b%0B*CfW!T4U{}}XQ7S| zI%vX<{w4~NuAFQG^DemrCX=vV-fWZDdCB?Oc9^aQ#8$zwT)~a1XelO})`~LrHDBFz z%U(-eNYrO+AP+&L)AGGRrFawOdG-(=W*0|`L(q3Hvh@rjXSH0Fd+fWBwavu;!t+gX z!rr4>slD1`7&R}NJuD%?5^A)!%Kf;A6WItc$~=o05?;(DBrRsi(5;uXK7B63544fe z0<}FHNM2gJ`c+{-?l3`gj*ybH%6SBlH_)0Xue=SsuDQX0pgr)lW(2dU1&RG!PG#-t zf`#9zv86%DW^KY`P$^$J_Y0rbLSm6U8hES{hK!P;4SwnBup0kLX!oabDyH8?7@?8)T6{IRy+w(aWp9aseR zk*eD!H?#}?#TUej%D&`{@mlL%t+rcxW77wFTgP~n1@|Z03p0!3-Mvp+K!8n=D3EMh z)Vk=-Tu-QgI+NXQJ8=8c6K;?trt@WABBDePvGq z)DMD){%AXeD-2K7-i9^lpF{7q!uxL^uT$&qA!a|X29OGqgD8u|4fnT?M$g6GCQ{zb zk7ulV;d^kgS#7?H!;Sr#I7JY73kEE+21GVqK@ld~f2(+p&U5@2ysa6x<)kno+-?c_ zy{BhDn??#62=IHn_B~d8vNBqJgU9!}WqU&I8VUW08S~ZWT2IQN%r5D5cT)^3W-nUj zN^_}?r|Ek({tB-$=(os~UX9$V&7Z5c?{~E)wQBEB|5dSyBvQU{{a-!UXz_;oyOK-} z1^g{9Q?Hsq(VABP#^C=`c&740066~--wK2P9E1H9Tf+S3iPlmWK+PYtIwIh2?c17! z2A* zK)BTFb5Pt=8ww~SSQrqn|DE&S+D`x=gZORSDd|7U5t9MzAbu-YCneH)f&&53rAY0Y z0^p{$Qv=}tt}{gqK!N`ad!M4#q51W10n3oT3+Pm6cEH~Xx|M((Aoj;fbFP0PP|O9O z{Im8f|36{`0l*d1|Cp2_@lRZMBmjNCtNIkBf3UntfVV$Exu)kvNx^YZj0~OV>^)SJ|49kUR6rQ$@701rVsr_9B@Z^jpVe?P07!p5 zW6S_>{@Fd7+<#K9HWxqx`P<>G;(x+}TLO56|1HL81pGZqty+x$#y?78+x`*HwgF=Q zq~ELYGw8}Mdo}+zufn?j$*bIMz|9{^9X`dx^!kVd_C5g0UrXov0PBB(Qa|{Q zrMH6s*x!4QGWws?Y2_XT{9=dx&mr!e_-ALHCIB73FRD^orT~BMpIR@c06c&4kM8R~ zXw$C%p5G~)TDgdD;*@NL{Z*j&v-eI_@u-_WjbTkoc{Z4ZcNc`No;mm2{VFAq#mJVCnL_<~xTue8h2F?y!qF7dK%ehKfebAl7DZ(*n<$bwkO)%Y43+GsAs69Ne8tw$68@O<)ak> zZuzl=4F4TQio%oq(;?uS- zXRPiOjxL_B`;a9!mTg*w$S^=k5eQxUNKUDSG%hS`?Jb z7g{lLr2C-KHNUbfj6>kaPBKk@I@&yV0p1mAT#!oEeo&As7S9_0dwdeNC0I*cWV9ky z7CUj+jk?&~9{3H|0Ge3;42Wnk8)t$7D>!l#Ean8-o?rS~GR?Rin}D9n*pbV2%4?>3OSt2H0d86v>;ayJC{%*f!jYE>A^H0+_<{p^5=9g}>V_Eu?njR2rlO zjO<|jb99ad=}#ceo;OHiK$`R+B%*AVfFnc0YbpwJIGL!TE%eQ_S$oSNf&V~SuqgaX z{%DQ=bC#h_utl)PV)WCn7io#QZjg$mVMJtPsD^We>b`Uxjf7%Ip%$T+gp4l8$Et+@ zO0cQXN%+jC+IfuExq}`?R%Qvf1Ji)C0exZ!Xag7sh$7%m7luJJmB{;d>fBzX?8yg{ zgjIBKqyT{(_!s3;6ZOa)qjaiYf5`EP$Oc3%Q$&tg`m>)Xf{A^!9agNM$_P))p4pxv z)}GCVRQ6eGqesP}%-6izBMwClC=<3PPH=+Ml!j5E1e3(Qjowm@^}4pCn*U?ePox0RAUpMV=)ns!{J$&P*!)}Pf#j+0_#;uD41H7^ z%B_L{LTsVG_3YdpPDNtkCIFyA%uR1_9P6Rcd}x!vp}y8!TY_#TL$zD;OBP7$y8Dy2 zm^@qH2eSt5+}d`lnrGdEL8Tcevy$Pmka2L~JH;A-lo<5V+w+gxlnC&-2&Z3L;g~kU zI_vkOAGuW{sqD064mGKGt?&LK6CTExC7^MQi7b{*JOuW6i* zb?AXq?YaM=d{Ta^Kfo2zqCr9?jw{RH2;L@}bl&w2aWAOn*U#Qcikf4)h%q@={xRbt zaFLhVG!1^fOi^4DTj6@diI$hHG zn4gh>SS48w$OL@yTf717A}fHelgA-lQ4aCG#5_Sdi=pKIilEgNYrsA-2_PXif)>3x zxw^lO^jmLazLK*ByNvLL-LjK)uEm9+c8*iv9FomksB1YPIWtiJEl~{ncDw!veCOeN zRtzGmLQjCUs27wx9qR&r-4_~c8l@NPh>4YvPv-XGFh|F*2De^m!*WTdIl)MBFP7Vf z3hc|yfVAnxLUb*Vg^|3#ncRsCxMqj;CYz6pH_t;tc3mj~XE?d# z0W(k?4Gnik;zUn_!OjjJ#CQS+hF3*{+sk`~RsZ^#r0M^8=s246CcrfyR3oXTqGX76 zTZr~bj@2Y>BTP7CV{A$^Q89{E4^lm$KU)LteEnpuY;SYwO!iG>&cv)PxCxb!wxOYM)D7UHY- zs%gY3ZVxpy&GHggt}1!$rfbsKhh@#s!bnPA6;>PeTI3xp-Uy|)5F52s*O7IWIJ&E! z4Llmz0y~I(>C64A#E-jZwoZjgO9G)xja`ZyDf@hy9)j4RLrWHnfN!tPT_p*l-;`=P zQXI`KiH#}SV!xhGb9Pi}!}afhsF0TxZjc+nGVme=H2%C6&PIRD!^J<#DA+6fwtqFH zn0bqXU`umb$Y-5Vs1RAnGz+6Kus}#ZIq-pkt*JF26AWrYCQ;PjXFK!+1FrzHqX(F^ znV0@{WeW1rER`9fYU=m{zzvw&m4^HcIT6@)TKD-AxMO4J_7c-ZRuSALJsk5l0p+cc zC?*)_*AVQIqN|H0eGE%6LX2(Jl6V&-u*>Fs7?yaYM;ekKkxm!&funM=TfDZAVMvZZ^a~o#_*!opO^Xi;8gcs9?YOYYu7c1wm;%n6 z5Nc#CYUbyNbvM14Qp?!nEI~hvKIYu|T~ondiS^&&Xhs#xilqXEdB&s^F|vvs8#LU_ zcAioPuHVmNdSJ-+ZlSoVw^Lo707}5qA5L~!aPvD8t8ZHu10zQtW9yHvwS4a64a4u- zFN3M2P-?$pfh00-g5PygqMIVWE&OowaR9s*v2So?swHFYbx~~5X3626mYcy9?IrZ` z^an4IZsU)(L1*B2xC|g7bRwlQfmAL}VaX|L{ z>_S^IRaWYsA*zBOTATI!o_52bl8m_g+Drwe%y22@DPqHcU)_vbbcR3XusP4hOjSSk zP$#_0^N8n|l$ky%&q@YzMTHEN_I?1xiMSjZ80pyLJVM(JBoxp%K`luXeMJwHZL)6C zMGE}}UAqUqqVlpyX*pVW+2{jIlaC4ydcMM|@2FwdUM!_YfQP>!rxaX1uQJFE%$@i{LpVE@$9Y1#bCZF2s?j}UNq;x?}=(;cw^ct9g zG=He?jWCH&E{h}f^^CNt_V%?w^Wk^}p{+UY<3bA=V4%AYA@CBZFw7MQbgJ=F=`TNG z8IoatvkevZSm zFXZX#E67vvRjjd}z%bQ1Qt>}3sSjp$xR)h?Nr)7(`uL2@6NqPTygxAF%N~2zJugrZ zh6ssF3WZDrCEI&3JQ@Ookz)t{%2vCza)@ZQ-loIUaT?0wBWvN!wAdx!Cm6B`N-sXKi3qP z3Y_QXwRcPuWs&XNT+5g~KUxcoscF9(=EYFK*pt2cd*ZI}8C*vo`!4&S>)HNY&sLr( zj>cU|B8xGY*le*(ehw5Y4MV$R#-$58iV;JKohP)mfXvw!CS}HQ}F!7NxjrGxRhcuzLf(i@fsr^sC9g6$#y2EC7M-UIEoN z$ki@R*!3z0w&8_9wI4Lm1Ie3ZjIGKEJKxF9^O#(h_(ehK}@hZEhSM(oHT8JEXsK5st{eW$XEi^R>+ zyH_Zc{)WP(X@queK7xQ8B($-?b6HpIP@7^sx&mSR37)a1Fw@a;tWBF3g0$8)LoY=) z`R#7^4y4bTU}tW78O-Ys-5)Fs5Nag{TNw}sYw_ zzO7xI-y0?$>d(}11ExDkAEy1QVhHAAIT+PTFTEEeHo)KX}FGabR3+rqBfhyd*E)C5Pe+DO1#jWhQZY7oWb}dLqYny2Qer$ z89%pI)2J2~CDbs1lF;aT>k{@co#uhhs?XiA_2asDEaoGc9z6q-sVh`ohXk1XfVE|q z6wvH=)04m_u;RYB2AdSWn-9jXQ>1C*UhOR|hI=ihx!J^~Nh!82s+L`LX+Q^$*DIxJ zU5D)9JCg{73>QD##)Uy@EIV06vf6##ue$LgLV52`six1vy*l+GR812y-%9S@rl;HS zMt+gLO}XbSmxS|%k`FskpF3?Q&Muw3Yk}9Y;AZVFypzV|;N8jeQUU_wwz|L)_HUX35drJ|z9B zX$Q5e5qPu#Xh@p_GtSWzI9Fl+Dh0IqLDFH$aL#XB0}C94r1rBg-602#aRFbCL`7*66e0@%;AM*SPbol|JXo+b%*Th@~7D zjy_0#@~i0u(sPzD-+E8!F>ERr0F)2-#EEj3>Pm@m+Hn2$bD}P7wUq7Jn^04wws7g; zkQLOlTIf95YNtp0D?!?`s@6H133)t-N2j}&=hKUeaItJrx`~#6!)`#g**i9&9trk? zW1VlUTw|Q%x#J{fzzPXStnS1ue89Ms?n>?AP+_m>+Z?EMWUj0fVvsk^Kb`ZBP zTp#ny@p2ISYN3Q*AdES#gJD^g_uQ~g&xJHQn_ABcG(V z=vv{Kqm%kkb};Y#oNapP-4VaJwOTF}l+rWLfBSi|^HjMxf;8f_?R{(9`RMNE*7>-& ztQWiUrvKTlv6(9}(Mx{4bF+Cxr1U2!`E~4d<*Nl7WKY&4Q}89{cW>WTBUj#$HV5vd zOPLA>ETcdhZGPHY#vBi9VC}xM48@i!4s3YbRv;Y>5I@i4G6%LF{uOA|v9{G>L-^X& zBQ&b7pozOY%wx@(0e@oZ+_z>M#%vvk3vEebB4o1~Ny9GK@XogdS4<-M#UbP+(kQ-@ z8((jbdy6-J_u|oN4~~bE-{+BwkKf}S(y{rX3Zp`XNy`35+DxAokf*M>rlx7iA=}UH z&8yUy1C}9D6%#>RZk1^+z^~NvDf{zR@JPXv$dWrfxAUS6a}dSYA7L*jVkv?VV4crN zfo}O*N+0xh6{TaTqQiqUd|k!c}5oYJ(uBx63*NeW#$881EF++?B`^ngB55WX!=jqx{KHdf{?% zMIeb-GDaXWX&J9%JiCdsO9wfNh`I2wJHUPB=H^nF%d1NV9|(=zWKpQ!0}2XlSF{+0 z`4}4bHcQdL%Cy3RYck7)OS?FPRWi!W>(>gxsa(ChStcx0BuxAHeVw9aD;?e6$ii0q z8_zP%=h5K0F4bTt&jTli!9lL+n)!uES3Pe|Z(rUY7LFw@Y?aChe(yy}6ZhzeRWTLb&1sOy276}$Hjy-=(;t(1ArKHjUL zrsd70E}!H~=K)K;#IWH2?=fTK7oWplU-T;mef9CgqM%U8F)@CE9p~Zjo zLgH*i4F0}_h7u}tV-MRMJ~uW(2&*}{Kfr5T6EB`@WWajnhv`LtD3{OIf;Yw-#i3!a zMA1dei^fXeZ;B^V;eJWt+#MOl9hg?fy0MJ6S;OO1;evkGOKn-Rn}w z82wefOA2ssxs$CJGpvxL6CMj!q}?3i!6Yc7V*sgiBKwrdMw%CRVcR(?ZQMcvNFQIV ziZ?pw`muj1PpiR2|2;2(!+`#)^Hc=LRhf#(P%zy@<%+vC?|A&s+l4wS14--H2Hi*> zfn+x$=UrDEM3_|I;=&}-cwt@HeE_$K`AMJxNfXeJ>xJljaYa_<8+-<OdU~)4SX|L97xR% zxR|X^!bP_O_RH$8=qM)}19o3lB8l z3k_w#17mxcj%C4Vj**&(oVCPfVH&zJvus{MHqxE6cAjiFd(HV(_&|vIW|zrchXssB zsM$7uMyebu6ym>~U_WS38YqPS;kJWg`7fyc>W#{$_L4#1r7j|Y zegOV&`~Ux+>6)!P5tGS)wt0)L+V009&`)Yim_1o$*%+22x|lv)QXbcrI*2|T&nR0| zvAqy`9J?5DmF8@UaUZbEd-Sy7<>L{U)ru&^k^gM#FO|;a|7KVez>FqpK_v}P45H+= zCsIuR92`tphynzkh8^I50>@$xPrv4cM2IjBrTe(*44WC zaT`e^hNt=_KV@|8Vy3Ps6_b-c^^|5k>iLOB-{e>?6$5auxObt68zAOQi%ijtDIDbk z#D97tg%6-Yymn#84$_4lYm(2W9toQjp*A!tM*Kiq(sH&_36jOKW*iD6P8f%Gwgx-y zW_vn%BnuPBzu}TdRwWaDh3Jkjt3R45Rdd=#>eRpz#&JKn&mwielbg>Oq%Z7NWe25- z0RKi4&<>PW1!!23sEj%F+!^w`)pS764KS^$VYONrBiPOHQv&c63$QYdFTm-MQfkCP zIfcA?xfS9xBd?5d9ApZddX*wvD_K}H4W*n+R7JHc0qUe)$%BY;ONl}-jo;|V_dmcz z{2DB{l&7Se0>y@-esOHev4YroDbvAdOwt%|90l}rt!!!HzR_v4xZmV*;&!hUq_v>e zc&J#$g+wXDV^&A>1O;R5`x2y0Hxn}V^spo=g`S+(RR;@AUx)p(G26`d{srYnwb0^6*YdfvMXo6)pyeCrfAeWzd0@F^V1Kbn zq=-`MWq#38@YtY`|IOY86j0LNZ+oP!egyqXn@Byk1IKNp!v_ue(?xG40sRjzR&Pd8ae37AF{_K1L)sIe(G!;1X?Q(Bk1Oz-aj5I z=zl0V>a3vQpudlj|GPK@*)Nt$U+NqJBwi{k2k3{tiitTu`TvkKW)!DQ762e1`e3Pj zWDvNi+Z_LWGz+*vF95&wDfZTVH~gi~Ayu&r953|?FDT+)ebc<4-hYgd75vATa6!4?6>i>%X}m^`fBre<%xS;{Wlqbxs`g>mSNOi45p}SW1U7ppbt^ z5|?uSpef}+Z~llsD*c1jQ35^tqeNQmA9Ro!=+z&znXhm9Uv0qzHo%_FXziYkg=UV9UFtg7- z=XuVK&yJJHkAU{{tr0c>*g(0eu>c7Cznx5l3}ZJUS^{XGzk6Z(gkuX^fB=-WGKVMY z+j9WuLx-hZ0RLurHHNtW5}|n=q&|Q@$ysVX09oiWdCNNYJ_7PUXA%BRuSp#O15o}S zAB{_3Kq2&FhwjyfY>3zXs*b(yK}{b$ErnM>Z=^E-ni%3}i%GL`8mJ63$%cfsHVw z3PVh}9&#oz&tR_{ELQAHPU}|NwTnL&$7Q?q@bh)Wy7zOI>l2+we;Fb`3`T=Lp11g< zDGNAZ(GpAhPK1zjm>>nW?7;wd_WrA2d~YXz&!ZdF_13GO zkti~Y+j{RgK3S!?C=@h&x(uE;d)U5N$uzn?e%B;%?;0FUzJT~Up8Syfm|o&-ct9_L zPxBZ?X{Y~5uYKGqdJAU2QFK!p5y)?G7ZG;}{!X}k2qkW)nRf5@r(VRw!1`WCl5|4J z-h!Y)Zi9D5fwsrB>`~5i<#Y@L%ZuWMWGMBp9xBUnViUvsp!@*-nr-WF0Z}3)PQ;o|L z7wDi{OQ?LF>eB||W8!~60L`&9>28&oys<)kF8)hLm%dQa29_wzirJ%F6pXt{Et059 zbY3xHR5xMQ8yqUZJy#4Sw-x_fh?J^GZNyl&hqo@+#uZ1diO2S;v%j%C82v_6Xy_H5 z?d8rp(ue_G85IqsNDceF?C@5GQPC5-Ej9xbf-AE?=K)AVQ{Lh6-Ie95Q#*lA8@_lx zOBEkyce8ENez34=?9S=itHdQ$-F;^)h+i;7(%I4R7o=#Uo~>jC>s282FJa4a+y-Xe z)(SWg`$CdTz7-O(p?kbJF}0)M_Fcp>kIdAp zsL$;Ty;&$485g z{3TIz&yG8Y6l_}Uz{ghT_2~yKLCau&TIA~V86F;?Z60B!9}FQqKjoJV=lBTML}IoA{p4rL&g`<*{k&G2&QV?D z%Qf;Qp9Ad`Kb3`K9p4ATj)v8H+Zl_W7VWO#ypR8*eMbsVx(^}J_7VPX`w_-7bsh~K zC-o#00GC=B1o)HQ*%<_Yhf2Z0&?j;mE)0MS%_dy$Mw@?x$gyn{s0w;6{9hF$9|a(U zs%oqFCqlO{9zY0{#T`jc)WmHPzz{mDm;OZPW~2k0phPfo0e^B_m2v@bpue@~$TfIe z60#oG)EZd;Not1(0(>glTLk2%s)4!)@D8e(!b_ge?kxdCA^lB6r7~9PugppZsFiFe ziU61DSMy{u-q!&BNv*`H1^h|yRICN)LkWMXe=-co2WEn|N0VyA39-uA#1KGWd%OQj0r;vf#zGW;@0e~hd<>^KbI)2vYr7vM5Zn>BHA1(x<) zaD^~|JjjeJzlDIQ#QHE1^uOXDW=M8_Km$Y%^&@#?oPTs|8s+-!RSH7G!GHCY5l6-( zs0KAKS5IE;(3a58bnS+vz?9O+vWS-?Rs~2M}^rf86*xBM8a1Z zJ<-WS8db~zkrZwM6KT$*F`3AWdQ)8OM13gdi;HtK_%%jgz5*Vk8!j0hw1~)nqMK+N zO+Z4htWaKpLa?baY{pHfB&~l*8r69Z0~XWh`y=JG4e5k%>jpvaM$0yG+sR)17~cC`oP*@?zU{4+jy48Em3su;F?f#(G77*2~rozpM69-}FZjn(RaBIF-a{lEm%Fx~o&p zEbD8JX3Y`&hbv+*UKZR#^mC(U-y{lqeMm;WefwR70`9K#phUrWeT-ivn@@M}LW#(* zbb@a7=XgPyw9ukU6(U^}>L8i|6$QP;R}sZtkI?Hgljb)?kx|oQ3uxR$%>u;;Vz zNiMlHHcK+XN_z!0G>CD(`(hI58#+SQk>~LCjZf;E5Zo_;!Tjs6-vBj(ZEJBK z+?*nQpe+YpcYrxCxA-%Z=Iw=oA8`(y6RFM{21F<}yYn2dzvC*G)C%a65Jc(9tfG`L zVOIl5M*F8Whl(h0<(x-f^7HZO#P%f)lKq_d&^`>##pLSgrcU=zEL%#5x3LLy`Z!Z1 z$aqCwKief$hP?4?^Ds^r&VEA8Q!|`wVIl(b!bv8|#;`7r^_uq>?nZ?YI)VR@{FtTv2tFUV9*dx?GEv3?DUb$IJ`kJY?jU2%x~>-{CM66re8JgO`G+a9)j0UCNlJ}Gh%9ljwx zBa-x>`@T!DyxOIbszx~@tGk8U)4Aa|FJs#-8)fZgqVdN#xEjb@TE^8dE*<4qx4%A= z5tV!L&bAZZaRmql7}Gjm@jkLrPu$TLn=R@6qyl5OqWI>&uSg=kg!D zsqXk;U3l(>ESRV41>2Y|H&*%?DY{X}F;YsWSouEfgT`qX-Iohq=ZwlJlQ#nkFbd;l zz;=r$rHNT+_}|-pz9aX-0`ty#yAm3=B!+)k&zj^x*gE-$L%${5(Z zRvP;~C4@#JFjjR9|O`!H%AH=-HHQT?;JYJapk}{m^aw~#Q z$wBi=t&9*cJrqWjmxNbdeOujoR9NRrY0-{-1l-{Ld<0ihp;OjrHx%@qQd-pI7sx78F#z@_^wR&OFQ(>c+qpp5`cK&OVRn_OJ zGWH|T^p;?+-0VXWBP`P{@9_}$E`j4VUR?HsO8|>kU7$Y={cO!+t4ZP;Nmly=l17CN8?~-;v9Lk6!GxhCJw_ zceqb5r?a$N9Y*JLW0gt-b=JR`(?XY!pC}{Uf+yoYhldp)OvooT+&~wvJMrwIAPJs! z4HXo#<2xgBDs*W|UD9b40bD1c#DhS0*$=rRuQDsS2SnL_OTXj(SwKp1`I0ciWNp-J zB|>Iz#Ff-s65fO7JhrofDVbmmpm4qgI6u_AKTu%OXR_4Yl$WK;+0; zL)a7UQW;Hbkt!aSAM=4~BB{ozWI-Kn-(q(1L}#Qd-&!kpQ-OQWJf|9ty_mUsriq;m zl<@*KJ<5r#+E#sY_Tvr9-MNEiTUwA%>yA(e+2#9p`zdk7do2MTvCCXA%peHA(HK1FevJH!;H9d9!`QpX+KSb%p$ZehxQ zeC%Ze8*VktBujLM|6eT5ki{jf3<6n*ApLE_gU#)oEzFHP{|_W0Tg~<_B;ujUpvx0Q z)HU|qu%iu%V>B#UD2%0&%cx@BF-W?=1U|tcUNx)W0KBS{WTNF}pzd44xP0-(9TM9E zi~V@1mzUr z0&V%td!_TQpFc8CD;EfUSt{C^T4oh+IKEC6KfNNqa(@vN)_7$R5qyuKe?wf{0Cw6o z(B)}a{w9Z}ce1$=(VMh6lWC2&`f+nr1O4G>6{Vj`!D2VUk+nKn`LI68W#@lWeXyHu=W*Na%PW~qP%Wzj@(SgkEPQ?4vK+$8HIy+ z^$^22`>x-PiQ0D-m2WWT7Oz)TydI2Ja3*ol>%&f&THDKzHF;*SF8K}pzxBpv+O)_{UbU`_?YR9b{7OLu0K@_xO4nSrwvBfX&8v>GFyVlL1pxPj_xfm< zWc3K!c2e-#6#v>#1L&j_iHZ_`7n08XR8!HXi_SFb8A7t8Yv0HHJtU{OAuMLjNF`ie zXffKSfGXVMea+9hAjmxu#MMO?O&qPS$kKWZk3Q;2seREi{!RGX&vEu!z>fu>Ar30g zlJ6cfXU#+e=C+4^lo3S47|{~%o9TfD;BIxvlyh@{&WzrL@yTOoXXuSkhpwL9s@Ac;8ofyasjtU)C2KCI>= z*fF2zRYk>kYdT+-aF5+A%GmW)c_P+JdAFg0gyv(oREiOwkrw{f^PdFWP8NsV3>?~q z@y;$un~&J~^2Xv`v|PPGo-jGWKf8AeD-5+S@AtlwxGZ1Iq01Q_P}PZNNZq=AP`Bo< zXF#MH*Iv1KzzwQ!&_lFuFF;1x1Q+4LEH={z7=n*}*ORvx z|2^}%#ucD_hz0XAHD3ovlKT7RiJyyc3jjfFD7^b8#*)fCVC-){H<=druVqzl1{8-n zztw<0qm2*@_@83cFYv%WIQk_#a02@2K_uWGP!%2-*avl$$IyZQV*QOs7{ClDA0^L# z|KilCkP1hf#@lDWI4GrPT;LxZwg(qD0xf&x_04e?gBV`p5P%g@wVEP}fb`Tt8zBK2 zK&O08`Q-a%l)$%8vLC6RaI!-U9ERey=W3sw5+P(E-H`r9_7~`Ze*ysK^uS6G)?X1f zJO!t>GmwuJp~Aqhq~?QPU^GXlB4> z=))Vb0RBN-5G{eFP_U{s^`RRGdFg@wl)hTKa{Z5zYuvX5l0s=9J3QHb5eMKuRo1!A zf7V^PJK_K+W zJLeG!RDp)6zQqIo1i9ee11+IzcTDeww63`U7vB5UK-daH3KVFo-%Sg3T zfq%kE_Nl-?=zc_GDcd$f_9Nh*npvVO;GddVjx6BxKRc28bSH9w9?<#Q3jVCQ@wNbn z2IUsH^2zHZRS9`N|MsN1YMv0esR7bJ-xrE6Pl)J!0hU1b6Tah#)DY`1IuaJ`KF(oc9m(MBb2TF**|PGg64qpP*-#9`=7`8*YP1}WS{?k z$JHg_fbuJ(-CQgqG)y$U1pGHll)AA5ltv*Y1(~s>ZE|z?mo{=Q1JwZFcUc8hIVhzL zz7<%)s)MrLnWN(cGw&2CUPQWY@H-_5Ci zXGVQ}I!FsAH*Wn_;Ul6}qXW{B!0t*8j<%_V45G|i9TYC9Ho~{{U)zz1Ip5xUN|~n} zDx@t(kIJJAT zZvG~@1f~HWbe!c0JIr$H4VX9i8d#Hyl5!cK!$Nue0i%NNg=O`ZRjX>@&*9xYD7yTH zus@^~GGEDz&v`wMGcQtP7k(DRMP!1J4}sujf*O1gEhllHPB;k% z?2KD^Jy0DI7?bx2&7K9-kcMzrb0Ldvk_NBh$cozaBxU?cmS!F8SfNtmjPaL>Q?2=K zV!mm{WkHW}4VB7;X~9U8AbkzZ4F`fn{IF3}8S6RH?$?#^rXV+O_OG_Cl=xx}{z+`R zuY`Bb6)r~Rg?;L)=E$1(hPtj-p*L#fmM#Fy{j&@XK~fw%-c`s; z>^EDZ{^`AhVt>?_J|CY3Y@eh$0NVH4m@`tJoCSrPm5;AJ~# z3Im=C28;$GIH9w6uvEflzWZ>6^W3@5+%##3R~^% zf;FFH<5X@Bx8{4oDxPf?RGV%-7qh_7vPh=;`9OvHR;4Ulu-oSND~o6wd{f1WSHpC# zhd(KQyvs1dRYj_pe>+|Ljo_Cjtw`Q#D(XlUYA@+DaAEs^-RG_AF8z2wkHxrtAr7;K z4}6Sn(h^&UYmF{ZAa|tPvvY;$Rz!jZ-NKfQiw8>Hiq`9m^UdAcyTS=l7ow}#i2<*( zn-+bHL>fBuAn*ruALTKLAG|887>Aha=)wbO2JZO_=fsLU9UmMC|9q9g4NLre z*XI>G1O_le@n1AG(FxwEzs=?k6#mZRSECJ+cL|7v9RzQql)?&lY_SZckZQ#ugVAld z)Wpo+^nmzSMoNRrm~RFr=VE@D!ai18ze;~az=Y!Ne8jH5Tz*>DS4w*Z95tZV?ob}Z z@M0XQdRxHgYdb&ma#WiHg)}alHzxo#<(+{TT);O5Aygq%rbPyKmbY(VgDHj!q>yd45wF{Yd&ST>_u;Q`;PI z-(fbCoTabU5T)f+Rr4#mY4P7(MJg&{v?K8O5;!Yh$3gmHs%cPfL-9uyI2ZW%+QqQ8 zBY5X}`$85Gol8|2|5Y|b&syS6*aeQ3@n}z@J=0{p5stxUh$BHJ73zpSXLWCB&3pSh zQ_b$qKJM@Nz6dqTQ4PagJK(x)8vilCG+m1Q<9Wu}8d>HtJoR|zW)GZc3{(1yF0$Xg zN>aH2m|-kqA2BW~V}a45o*h=cK3@dydqE(t(5abV|Ye0e(3A5yHIFE}CvRwWW9njv+}uhoVa4qv4Ih8_JlT7ZP|?eTJF zNIT3(hE-#v#m?Bpl_XguOHyZL)xj@@k*9Ia6@0|j*9*kUimnWMPF;s9-*^0?-`wLs zsLND3j*xvckH_CZkR&(f!<6yI+!?|I9wxn`@*Qi9p?RDyuiGTB9z#p*W@jeM5s+>4 z4w~^dFHqJRhOoy5h~F@e>$hsM*dWG=?G#5E577+Y!cgUkD5@H4z2E&|35IWE`BNmYm{5{-wwO{#@(LGf(F60t4Lu{g=Bh zUQKtK)TtBua=JWS7#$MPDq2%qj3f0#IVxCkarlGqre;+-iK|~pM?ub@b)~rzx))tX z@mAymkW+3&E+1YwqrG5@hOWhXt99Hp(THDX^3vI@1@vOpK2ucEo?UBJkP8;jrh9Hl zmM|V=&KuhE8f!&4K2(=XUj#PKi4O5vWXtsTYMS9}a+(zF&g; z@{XgbM_ccAD~B{(CgZ(y(UM7Y_Qx-@W+aVszht0DXPrNb>sZUTq#@;U@LzuRx!AeU z^#o^&YfI4zA2+dB!=ClbFxDWVW@tMGSyZE(S-wIYrr*-MOIc}_sQujUJp9-5#;QyY zjRdgVY%GlD=y1=wC|noZDUDj!A=m=&dBPDmaOK5YTc8+YeXN}~IWt@3Y<+C#sUXZ+ z@-iP_6F**?<#-K_VWa#OY253}j9}}^E^jJ%_Cd^vK&CJOqe+!gMI19zQLdr77;9G)C9h~Snu-e|DiToR>6|Z?TorKyqhyxWMvN6qzt^4+nAX2xl zEkd!xEk)$t>x~cw zJ*+uiJh(mV=XPLpx-BB`#Sz?We=|vK%et+J3JU7B{cS(=tKpt>pbDX#8+@-$9an+o zUjXN+W|KEu%?>3RLJ{yb)J_KNouzI^^VKSQl z`19Q61J)`73WJ8J)yu|5IiVYF_6lpUUL%+{H!P4mHO{3DiG?e<)Q35mrxHQ7mzYJHwL_deXMP{$0~ z^0pH#|1OBFOmLgFk9Oy$@{5=Ey(#fW+UEkTs;H?Z@cD0o* zI)>X7Mn|zduewtLH-*fP_}@h!wJ_!%(uyPD*9WB{ijq+j41^ki39IQywO7^^S5@o- zC~v1{s0P2num^0lW2i@L2hR?Ft%)UdhI=BLJ{~b2$|iqFbS#s2x^uZ$F?^bPWj`VP#k!LFrq_qf!^1=K7O_sWIsojnuJ`+% z&%8S2u&D9p+-n)V(x2eRrt8x);O)wSgtM=$_>L1wa+DbEto6nyF=nJ6HPR3TtgB`f}z zafI$C?%LYG_0WKwv=eiQUuz`tZM>W3mYFsx#vJjOH)aA1&&@)VBq=KpuBwbDAY_8~ zrssg0$9F?t9sYYzr8)7S)2h&*S{hL8>~-Bm&Zpy>FXCQpwvnt~F+3X7Wgh$D=xygb z!`7dh9h611qZuHDxK(oLPgrq@Wk&?!zVRwoa+7~ErF17_1CtW&Cvzzv^`T^MSnzB& zK%ZHc3U@yRoLS=CnBA+4{{DyZ96On~)AIJ5Zm;tkr$dXH!LpyziM$tLbuJg1;O9i( zPXVvvLeF%Guma>SG78DT3f#n)BYZW$;RYq%IW^=2TSnY{@e13ujsNmo~85mDIImaz=%~TC6iUxCCe5AY_5w5D@vVj*2>O z{wxrxbpqdj#-OX*M5$<*gFvKnh)`I|OBnPotd$DMb|7x776#2iRZ+OupE(3&g{9XlA4TahB+*9GU zAq@f*aG`IxS==%-@|Zek0{YWlaMc7f z2A%tp#gn=BEI>5S$BJnU`h%OxScA-r4JM#}<(rTtX$zf|dhJ?LL#tr1c_@Ds|> zrYq>*{P0EwH;@8!Dlg9`Q+@UXkwCX_!WZ;!0HP7g4>Vfvi?ldCOA-9!shszEWN zv;Zj;g!`|hK${ABL_tM779~cQdua>V*p5`TLJ%`J0<&A?uOC+r6c||0F60+~|COz# zXJ5#J^#xfjmR0Lan%*Z^5lpn^w!D1}O(N+NM;he&Mm53p2wcQ@Z7i zDBab{rgK%?3&ujY@B$a+22=?w3Nf*Cn8gGdoOK3z07sg$oHY=YTwV1cz1)g9Ukoff z{C3YbeX^y^kPR!zG9zUx-ud+CD49a`Ye(fLz0+=`uq zC~DBIQAca1z^YsW&otAhEvd_1C2)t?#TFgyU}(A?e(&aZ??$SC zLZ?w2-VNe+q&5cvV@70*HHy+qG)6Etu(g^E8>o!_##=GoiJ5Kgu5RVpp2%#R7>S&)`)OyRXY_>^>{P_hC=(F1e1__gsNwc+-#?z8UzB+inP0j-TdA;W z`|vxiATXSy;(AUS&p$62j!4Ttsk64L|Fab+*z>C-Eh6iIuOizQ!Wh7d8psVrM6`u$ zF+tyv?D~{_Jd9i9iTpsdl}^Y?!FeC{ni@9ebF2;Idu6xzr9B%@k6K>mjyV;UXyg_> z`p$ZXD~jTz7C#^)yHoVt-tuoV+zDn3p!v8r4Kh-n_Sk=VP(ESfT3vwZNUvcl{TKi+UJ zE73MdC3ofNITfYUyOrm2qrPH1a9G`JaSj~VsIeDy7$!lB^LaUeeS*^_o$9b+2{XL2 zcjFe5Er+*=MffHmOm$q*cFb=Fx$B=>hHWC-)r?qnVlF4w^Dg>RQr?kHgO!Z1+Fr?9 zB08d`oAkK6O%HfcM7p0pLsvQNLUN3AFtg!W0vZ#vf6|8Gd8yT{D&M^FE&uMA%(6)S~Wr zAVXt~KBPsCbp&ZZ!kdY4sm7P~<1mG+>e;qBoS4~}w6E#a*AKv*NdW@mY4pr0S_uuQ zyZ;vQrS6wJkt5R72^6QQbeO3 zbOa3qZHL+uE<=>$H8fKV>}2X@>h#Xe$i>p$?tfxm|0^9rRCN><*>L>Es%y$!rL+do zB=fa3)B?k-NGXOq2s5`A8+_FJ+s$sToqz7} z+iz({Frtry{UEDzlZ;L+)kC7AXpz1%{k)djGja@cTjFs_bE2DjR)cRmuEE5rnn@BZ z4}n=cS6ISQ()a|$r98xIG*aUff_g<-(y`~TM2Deli)4}nTwD&BUut8GLZ`lAy0q)+ z$#>ek&ULx96;*SJKm@CybEf;|e53oJanTV#L5-J6H}B}xfbbGS%_#G06Ln;PX?ieo z@LTB=9BNxOto%H>*D+I5wVX`JG`Mc0!KU?Vs1kD+lLHLAL?(k2vDE5$wDlcYc>R{_ z18ZA$PJCYis?c}$5y^*5f4mAwb>(`o+IA~vfu2_o{T69_Wi6^AGw!(otmhVnen}Eh@i-@oZSJu@<2?w>8~lus#uh+4JkB3T#seco z(%+_k_nqr>w%{lYJpM%$Zu+xwTCAIRT@23T_R`_^9@g@L=b(Ys9R$6j#p#Sn z{Z03Uk`HZ;JvnZAkjqEp$E!_k+vGI9(!L6Kp(uRccAIf#yS_9@tVw<9%c2}=xp~!f zA#-BTV)JA35mlc3?$RdIT(Fr8NW7%IRB#nH)#&8jC~+rWM$E5pjNbo^u_%vk1^kn#BmyWLI0H5UG_hrz%~GyhZ>Zq<4~wp- z_W3VJ<<4q`Vd0=Qc(7!eO64$iZ+Vc(@I9NW9ij%HWNjRRC& z38RSWGiL2j;e)F38!a~qs)Q4@x4Q84sGSP!S`-vztOc!})q!WlO!Y?n8@S2rQKD1# za&@gl`0HWm(g5S}7T9bN$s(-Zsy`$z4M_}7BC~d?*{pUAl)b2)JxegopAj3@ZsP0s zY|(YAJP{n;BP(h{hwA*8jwn^5gET zoS6{*o=wvB+cntTk8^?i=pwi9?E_kP(8WZ+Ll`#qStU$DohS~sTfZs$PII6Bbc@2XSq^g(4 zhtcWK@=-+P-5{9TCbh^iJ%H~n?YnCJWmbOX1KN7_h*H4xbijz@sERc2Z-lV2hYWvv z}&b^l1veGntdLYiDX#TNbzE4U-EHh18T z;!h5IP#OonXjxCnU9p&D7vxwsKS~MHxA@SZAY|R|rNYU9iC?}IBCJr5G|O4IG@I!N z3R1;vS?{Fox|p;9_2N~*Ah7S&lZ875prPgh$KR!wv~nX`q-ZKN9S4vz#HU))Aa z|FQ~}dS2j|OS4dYImu0HFc=SRs>;rQ5>vA5YsvFIKdtU<)jJS&*0W~Le%G0<#63X z3IUchIHwFfi;^VcwgG|cLpEn_9rIS-Ny8j>d0KzKo@lxa=cjDeG@NMJdYf}3()^@i z`s~593)Xz8w(4!bjd5qZ4!-9h)gasE>@am-E#ERq%HmFJWaIS(3s<_+!_^64Xy+{3 zPT7@C<)OQD*>NnoHM3uDij zHf7t`LK^iFdHkRroT=AGE~*fajb>F+NnGane47WxNfvi!=*(4n<=AjrbubAvT5ugx zn##A;I}#TMrSjoU*M~B`3zJofjC3%HB6-$>=+JxseWWH3JDsxsl3Z$9C-dU{t+ld{ zYUw6S-C}zjuRU*D&Kw}_mDlofV}2IcZ$aTqHHq|Acq<8S!OHNt!E~hObns$1%;~a& zxoZ*OOz*ge)hlLetYg$erUy7qEuUGOQ>|})d^Q=LXb=+l=}U+ToMV=gr~A!;SFAl> zLw^?CC9zz~e7^1M@nu%*5zHmgBeUuJswv~$<{Gw55~qXF3eqS6phG%-NK8VuTG5Mq z$`A1}-im9`1iXKs&Wmp#Wsci}OY%y&_m(FnFa23Zyh21Yfkau6W{l-o9gOwKDU1vV#YO6wXAS3GWJV}DEQ+DF@|)&4ZA!|-Rbut zlokO3r=>BR3xthX>{hPY;U2sDrm=LnsE`P;!ocFoiMf8*VJwLT7CGzbr!9bd5wSelv`*dUn7wQ;0vAkcd0k)b2poh6BP3*XAjQc>F& zY#WJBbT%!8=x8K(<{I!dTNR7F*REnMtXCg?bq45N+UEyk_cNiozyFloGoQw+UY5Xz zfqd%C%g>aRniAtyaW{(4JTus8^ls?EKHJerp%In6;_mmr`HTN53v{9|;dBUyGWbv0 zqJYzXkw@$^P%YGU9Q^r5Tl^J?!EMC91ocC4pYk2-!10Tz2up;l((Gq^vVwMC90$!F%Nl&-KOsaY-v7+}ctAGOK7Du4a_4@xwuz38+!fCZ^ImEH1y ztrEp7l2lTy9Qkg|Tak36rnMkfEc)CE231s(0>&6-f@!h3%tuoH0@rg?V@qa|KWG>R z#CVgSs@f1Nqo80g<}$X1Wt5No#m~c6_Ve@s*^!4-9ZkwMnuMDrmieSvN@%lkf~+v{qb>b(F4c{ zaHpm>EI(JTm`hG6D-e&QErmcHZT37I3}C0eL9RwZ(-T3G?A=W$nm|KA!5fY)?J?_h8KM0e$irST$MZ&p zgpL5wPJW}mjHJGZ`=jC8E`t+xc!eoRz@sn|iuY2+- zBb~Dq7vYT#TLNDOC*YtVcJhB!!7{h&Dp1szP?AI|iKj6%*poV#D}6DRqtnsqDJ3si zV3{G{yLuy+OZH-tb7yK(znX)!Y1YqQ^g*Xmonv#;$;_oBIfWzN?4UEU>jp!MM0DD8 zFtK9ZY6tB0!#n$~?{{o%($#Aop35nJM(V|F)l%$G52wpTmv-(WS>az5drQ~t9QVHF zQ{!<$qQ+n|PPJ~BFYEkWxGz{&ec7F_UN7=wKVl;MM6VO8@J*T{H!iIGrq_NT7jsg& zwt^l1DcSZ;#i78%&&{gM?{**Oce&c{ZRUgXpBv|3z>01%iNLgnC0nJNEN3(zJV5;V zvkR>7311tH7g~x#ti+r{n-^MP0p{N)LiG|%069J#1F)}!1+=FRG z%yOi{3fuW#(r>m8F17QKk;mxG)$>o0a);f(;G`VzF`_=yn7!8{G{zGdKYlq+nszU| zdU)jyzM7NLqf;TGK#($!*z&AHcH}|e1md6#L<*z7R-(e{ym(7q=QhZ?8z+?f+y|W# zbz@|iUO-F9zmS2-u^~DD)ggoBLsS#YO{9hVFQmfwE;bhV0*WT;IVA$+cZqN)0O@zs zlS^D$QPaZ03NbQ3wwnZ6B>%S?Q~s?Yk99HFU@b^jE9BMp&g*=WwDL4{rZ0)yb_ zl`MKlu3QDW=RRO6{*9|${4cHePdu=#^hfF=&oVM=1mAqX_F*~^PO7$gw1YY4plffmgkb6$sRW<9WdG-jTt?N)1Q?|{szniMsYgX;VHprFz-4vJahV1=?O>8`h$wiTLB<1d zPUAbURF@8@B{{rAKXq`2g5Y=IgB+IJ}7=*RjhPVLN9Z z{N5*Jm5&tQhjO0SiDBQ)Lbs|69!$|cc^>FAW~RrzTM}QQ=KvGcT<48|)wF+hJaMyV z!n))nTQu#m929W$^7SV<^Pbjxb94q*-HU-YoM8qy#rIuZCQdF6*RPCj@yl@5`Y-&! zy6;9Wn9Ie?7G$Xv9xofgkC)_EAqh2O75Es4&YZ-Kc#7d<*zAkhmTmKgx!~2;Aw)h1 zn0|@gf%fM$9~eaTnAe${^yE_=J3Yp}dCbY@MQ#y`bQ;^(kjI1>FJ^uJ<-zHc_5=N> zZ~~SXBNY2KgwlaCBTZt{ma?XxQRnR%m=I>TmTR!s_TV|lGST2#cSPH}S1A zo0E~88$y_`xeuqw6`ZVTeb|k!#jle~Z!pKsR_aBo;ltVX{N91g!67f6`Y#8QE5@Tt z{oL09GoM2 zc;=tpP&#;{yCd8iP?-rA<&Cq%o?Y9yNDmOmI~?Jo`yEjJfR<>x;dKE@g-^MMd+GFY zasY6}hPS_9ELqO|4*u{t#hZamD|E(Ta?z`X;B!cI_PW!j8oB9g{}bc41p|lGeZ9htoMQl=B_SbL&Jao> zf?|{UX@*S)j#RLcukFg~f`Q{cytl^$4)jY+cye9BF=udAQqrDtS%v6Y3Cg~+MK4Cf zBJt+ra&V^^h-pO(H#3U8#Kyt%^uAM^xLp+mT6C}a`zm+rLt;L&1zd@SyYJ_KMIT1C zW<_=ons7I6$0v&lzIJ^p`p!^>mcU_L)U|c{ItdR&SH|y0X(KNr5(q7wCw`|PpG=vM{l-VD8S*!-$N_)7Y>wO~;In3mU2-Eh}^ zL7n{5ipH!J<(FQ50R+=dOp8oG`80%V5!+Wbk@?RQn7Ippxk9GQOBRROMRYFX*T7)m5P$w4UgT1}GE zo1zm{b|0i+DlIl0O|j!9zycZXB$w1%joj~exs8}CVsVvF1x;nDxSf!kFhU96z%lGF z3+hQ8SfPEEu4Fx9jIQWoK%SPT1>*SGd%P&DnKT8?x4pkE%X!CQF@aB9#pO%BUQ(jj zzZ`z1C}WxjI9@{pn0@bGPNMRvm!!x@oSF&1;6!C#6X}&YBa5fR&egi=t~$PGBf}&c0SB+?WN5` zz|V6cWcLPb&92vhiNXkyLAY(3Aay(08^m%^ivu1z$8~MzBbn7l7f(<5(4Ba;H@w&I zv6KH_VP76j)%QJ&+IB}z$@iX>E& zP-rF*Nr>|9b539Pp2Pe6{_s4WyN12?T5GSp_TFc&&1B}VLGox>(?@w{67f<;b;GGw z?d>ge(@nwrhcoT&o29kiD;vx&`L(#?sAQzeeIL%UY_8%bGQq{KwuKxvlN;QcAXcRy zJN~4)p~JRkx@pEHU&>RQz_<8gEY)prx1mEBj;0H*KXb}%X~x`Bpf6x5D^cLyGy4&% z%Rd%9TuRdTo*j&*+u3xcG3pm-`Vmn|{I%h=LpjlRPnlorvj5;@+S}ReD5yJ2^DVQ@ zBSVqrNomhdTT((p`q=s>?)wx(6r}33A8z5W?lt~%_(6-Y%g>#+{6FLF70hgRSybgS zZp@Otu0C*5VdhZP$#c0gB8C+bmv8>4Jul$;U9I4aZJb>YsK7AvN~>zK3pXEW>&e&b z4~pJNN$fIY-BhqveBW+o##4nZCyY&6&xQLJbUsqE4OQCdq8PhB;Z;|VwdUS+HaV~2 zoPKRP&0-xWI;(lK_Pld2Z8xD$U1aK5x9L=UC*2VF^VQb;k%+H7`mQfWChZfeKKC^2 zSN?vZwL#{?9qv$9KgO&Ch;-yf%|vqtc_a{1-9 zYwFpaOtJ%_>b;UP$-i&37`{DoAn)?wM`xAd<0}g;`*7ENi`f*REw~_b{k8v=qfM@( zeV3|4o_?8sttqb5m6UdVXvV|k?$%tMR{58I3KH8q#PY9-?&vtz7V0i+;Wb>B#LqED z3Ox8Q!m8p2L&)DszJw*Ek0g!c+7BsKpW>xFdxrH+xSgx@^qKIeVs7#`oBO@(LxFJR z&o^g^*a~Y{C0&ZjUb3s7EeSe?8IsFfy1vSqKwuP^3&|B7CuZ=YYYqNQ}`kv7j1XF)Swss7l(=DoEvFT=kTc%&){#m`M& z!f}$`ZJ0MTeRJgKTqSescc=KVV-~idu{o0uqa=B(MH&2j_RtbB7P z7MqGckuK<^^ri}%DohF3o@PofewkIb-gnnfsu_p)3{#B+4U?O*-$p{_pk5R6&2Ev5 zU3C2+`AziE&y?8uhOL4wHs5t97TfD~M1i+fF0XBN&!Q%$CC}eB`6k+{N!i@5+jDO> zGNwn3rJYjTwwwN!eWAwYr%oqdI9R&GI~Z*@cdlikAu>vZC6o6bxSvEWVC(yn_hPwN}AEeD!+b1<@(vt-CW=$SM$&6G|WalR(it+nvA z)YvzUwo!YnFt_XDFSqzuUS;WW+@{5sg$xAU^x9lmcG$r}Rd119_i3e#<&ZR+t!;lU zTX}x#{`sm0udH9CI>ZeM*Qk3etwF7V$v35Nl&>6qO5u``iWlBIUEc%1`qdb^G9^m( z4AZc=Nn`T&1%-^3(po|P-}>91opXO?_R>|a)`M@1d&{q&gNnyC4iJy+ z`MYo`kGG{Ic~U>`@t3%v4B1R)nZtVD&vyHn|EQeP;-Ly<1wK>|C zJV44x8=aw_u~OUgVdur?=`Zu_%M|jN(k`m1Sf1GDWc4Rb`|>thC#{M@jvp*1M?bpL z?;1X#m%r8aboEy2YCB%~UYRc+YKEs@-oEmDu(`iyEn8euy+ft#5M^)u*>6zNt3tP^Qlj?HyWs@Fl4)@NQlFzAI7rX0H~W9}u#YzAemW zJrpHW6m-dSREhoe6glU-1aW6bPkcpspM%-1+|h^gv48C2`PxI`qEocKw0@as5C7wR zzMD9^nB~wcx2thKF>-wtZ|}pqe_}R|wg?2aRZKUq_4!Uor2NtoudmS0+ALVw_Yhxv zJlyE~bJEx3MDrTS{&Yfe8D{{Kma@54W<*6T2XD-$alN3sV-Y>g_Rl|laNkV4;N??h z%+$tX7Rl;#QdA(lG%K>zaFouCHKcZrbV$}QTiqRx=bM|2>r?L>{hfGZpkr*jZYV*) zAS#*lHev2hnp%dk^zje8N`m^gk`$tts`gjg7H+#w%3F%P`1jfy-TY4>9=whF#7(z+0YAZLoBe2_#m#XUiIYwX5RzH|%OjWb710|Qyg zwS~dH5HmY;IarwN7lrw3%@(JDG^b^cTfW;}7i*9EcSYIX8Amx~EO*8oTmzR(o3{Dl znhG|;q{-Fe^y|pyqS2=&yWMf6h+MN?l+GbvxEXun7?CFT_)vAFzz4^M^zdRJPG?z7 z-vV)xNOT>;HPT;w#WQ+6z?{GTU51v6#8GZ(?})@r zAjdERKaM^vW2B+c5r#fq6C$(55g4eiX#2$Ani%1YHF8J5Yh!R=a|U?_mlW#dAL#pk zmdHrALrP>!fMT5or0Q-~yf!+?-+tV!?HbKnm0Ex1r>gW0TS2i-D@nOK{@F{7lEn6$ z%1RzO$Iox4-%LG@Y1_z|c4VrRQ7&xjt*@n4AJ?b8up)Do9KA+rV7JQ6+1QgP>mj(l z!=}83%Wy=~ls!$GFP81rmrJ)6N~F?nWSusb>AYy=iC?^W-2eOc#pH&~qwKLIY)uWf zo6-lH;{NkL`g4y1pU+kS)<2`3HGSIjcQ4^5_za&FZR3w&qg70~uh3PzKjOPL!=g9o zM5}_=XS1VHdV=&q6|^Kl;lIKvReR}z8Cr6S=`PcY9&fIha*jIJn^-CP$@RZF=O*{~ z&!5_oip`a-I;VX2xHV44{QZ?p8QoKn+%G=O#d2pTRXq@F@woL#)~(uL_`Z>h@!GzT zAHV6AI(L!XBKQ2~z!Um>q_pq%-jWlY_a1vkkihrIp1%_K%Z<8;S5A=*rAjGm;(DXI zO)vQ!O$n~}$b%N$cP6wsw3*^!5sSI6OAM{c5{~AL@MN7{cb%S9u3KJnMwU=UbUt^i zX391)oWnVpeE;RknQV7^&%@G|dNpP!&mBd|GA05-plgZWo?9q?T>VnatiNxqpf^xaeqQ>_Ja`B6?c|^ilC(F?= z`6-zV>E*5Nd*bXaRX4vkI9%qLsjx0hy-+Vr-L}eptxsWfS!uAAy5Hd+AEmvtNqt@~ zgVWx{S7$DCgv>M>JZR|YW+laZ+%h$r`scyza}VN_=hpMjo=yyNy4oA@u3}u8N3Fcy z`$tKm;pH(i{<@emF)2dd6{XVy-|1{R?W4T;^6h7nA_JX=d)hwVnR9d83fKF*CH?VC^MQy{ zA^YzvNyZ$oHWu3^yCM3Ib&XKL2+zq1H)~&s$>&wd4(tjlb`7{6cerZZep+eJ?oA#i z4bQy#*@zR!sR;}nq%*b0r^Y2o_gB^S^@$2y{_f&f`$i?w@p<3nBw-s^bcBdybkH6IZw8_k4yCu=w z(tPUH^c~J&&s|*i7>AU$WF4Fh|MsFWTPU9tWioN=))tTSpy7)n+B0nt&t^`%%-m7jXJn3jmqs7lSoG)j`{yr;w^vAxc`6# z_n+_Ow+`$!1lMhhPHCu~6r6g`Li@sZ?{!|sT*lf+zv=?Rgwm48|IT=^)$k3J`So2t z>0kNRP@+p`c5Ko(=8)PRr^kIXOj<1F4%U@wM@xuq%;}c&67BgncN^}|JZ|M?Nvi3o zeKjWNsF16&$Nqw6Qd6F_dVKB4M|(!q-Af*AsIHE_$E4n0;gr!UrgS`}H;pL-l;0L} zbJO>^9QUJWqY%&5juRT(<_hK~R0E4z$R17JZ$)YkRka6&#{KnQyMMTEQ@C49`^?Cn z`In#ce~u~J)t23T*dP0Byud4pk8`4vMEkv7)PC|y)MSjZ=3VBArh|>!7&4xO{(09G zKu@}Jr|;K;hu-7Gy$(@#)(ySMIp0(eF!4inO#qF0>$|OuRdEcaCC1(9eZq;y)Gh>j z^IYV$$v{5^rF2;HI~xrsiA!ZIvQt zzpC99o0-=-9Oo=A++;2%d<7`eq=i5AY6Z9`llBJ-e}2_nc1wva$?mvB zN85hHNM1Ci=j?|>yQ>y#Y%zBe1HO)vH#FURbUsWsaDqnB5Lzi%!hYs#poZkH8 zLQr;jYEVySe8}E+f_|5NzR{)GUeZ~(xIMpt?;_d%13htXkghn#U~!%?lfwGE8bV_fhl&Pc>>3*TtC=+MFfWQ-foR$9e`~vM)8tlLr}UPqC*I7zHmD(N z@1qZsTbm;g$eENRpq{d4l(|^F<<)4-?>EOqLwXK3#*NTkD9j!(PhTr~V(d4~-?6zk zjpLh{cbKw}>@G1F{uCJ7=2A0ma#7X7{&?dT{9KmWY_oP-%8f+^9*+3WbW#H?o0Tg> zoXY#%a24}!#reN+hqC$8zjU*|l+Ns?E1#nwHFlwPVB^Kn1NBujCMGvkihc|BX4-Dm zda5;=<7}onbz|2hB`ddYCrGVC8msF?`Q(;FvQ}}p&w6XK@i_adjz#Idn{Nt^wi;-B zaq;Av4?eQRUR|aqm=j!OZT@=5V8BK2i{JRIw>BFz#&HHAPIKzR)??^lP(S36Y=Z@siJBq2oU|cb-2ML2VWw_;X$z*UpfxoV*3}=9l%wD2e zov2^N1tBDtDycYqs>D?xk+a|$)iMM;mEejb+M9+eoT`C%y|8%e$Qur$GibjXxb}Yw zi+W0oMc!ISt;c!MvqI<50j_6wWk9+fLysI=^EctvlKwxZ(P7qRnf)r<4PWf$t_PRs zoy*I_g{8^grzNsoQGCm6q9_x7&yTbG<{HD7e`mL~CeYW8F|QBsRts2kF7ZreFfz85 zH)r6q7ti0}rR3hGX_WLX^+NyjSG}F;qHJ9jsWHy(Jk8)9qfdsoO#5wUDyCy;pLFJm z;v;;%-wFBa)cSdX{*;D;Vt*CCdfr1$vD@>n`@_E3b<_3IwLEZld8({2vB@C9?}M4k z@P5lHX|Z;W*K-pBKG55$e6-l3biC!imT{}!o9}$66JpSqvv8XX?;gUtrMH$D)z6L> z@T7!w4XwL>^V8UM$Go%}HvIEPG7(>xFApw+rS3Sm{_YZbyDH;8#R2Qu?&I?oiuMRx*GCfixE9MBQNLJm|=eU1g{?YbOG0^J4 z=^?}GP%qW+YUsrs{x^Q#P+`Zs!5v4inTDx;-Z_kGLVm`7q*{${|A?bSgxgc6!B`3w zsq`GkCdRX5^m06I4A+S4Ol+H?Vh}NfJHrTHFXmsM(#7rt+)3oy#_=_H%JzmFJ$@cp zJ$w5J^-Y2FDCXZ=9K+mr9CSmd4cCqDnV{m7P+W9Z9?PVTvF9M89rEKhn?>k7|V9oTJip}>}j?qsvC zRVBAgO}Sz8Ii5pxIqW+sz6Uuoo-JdjXwK)8w#<8&e|D@;=88<^fs0(W5)G!zC-yLK z9Ncahf9j#D{T^B3$sA?b+`zlR4qqo;NN85s{eAg$!Y+8nH@YvEo@#I|wU-x-DJ)Hk zZkDzAWj+>1ioPwp_SD_dp&e0dJh5W8N;np618%MP^5d7x{dni@ZKA*UipbBe&3-NL z{%#jB8*w1muV6mXBECyDcs9<+|6;#hX5o1r?}I%iI_)W^<%r717?~5da&(LFpH5%X z(l;+#Xzu;ZH)z{uX2A_3kxyD5SRR<|--EOIxRJxB_HFoH(oy?~>2!ni3%m|`RSmYf zVWKaxCW=Lm@$2c|{&g#M#452|n^UXbqP}#4wN2W3gU5ZLZ)hWrxLVW=*R^fE_Om6o zL8Ks^C>hs8%Vlr#S-C`_^X^j9T9Lyg=SSVQp6YCwo{v@2Vg9W0A#HTNFlo9kkpH^q zlRlyJn<3#d%mNvtzfw9fIlYEm2h`3k>c$W9&x{2{YZT0@3_om*k%^N%)0BJoqt0Rf zcD1ZbS;ofC7V8?0ehu8OGFZ&SJt_D{jDLNj>&0w^Xvcid7@7S8H+*(aF-?E?g!{aG z@M}tsw5ZRWR)c4{9PB0{9w&BxCV$+b$iylVbK{bRQBcXd=0qw{P1~49P%d^|&WD|}BjN8&bAKJ~TfbdsO?l4k)81M!b!58+ z8-?{XCT{~>Mg+6n9^KDK8%TGYsl0feVH49JZ>`gDQzl=4bB* z3H{C991FIC#y+1v@5Ed7_?GNq(O9qTx;06Y^$9YP+tyu^t&3kv+?%WgFQi&Jg?sYd?Ql%w8{1C3~hH}{_7ni=v+Pd&TsC^+jg4jc3Hu$#4R&| z&$~9C-A2;8|7iQnojbBEhUKNd4*mYm_SPH!2~m;GbZwHpjE>9~zKq;^#2=|=_g(n* zlibTU+L!8bx-!1e;dJw(EgnYEh8%^SPxaliU&nx=D#!k$T@|F&+I2oE>hEj!r2Ju$ zZ&PBYeUODl^5W&b#4L*}`~0g+(qDbmO$UygpHln1r;6>_P*Lmm2(#y!rSw{lJ=dCL z#;#F2&0gU+pb+uNXQm^JspM4O`YWoILl5zT#hVW&rs8%bOBx)ky!;{}X++g=Z@w=J z1F`m2Kd+UlNF833N9MHEaM(keLm%-`RsE!G26?H6H_FAC$<2JZGwi_a74Gb z#v^^QT&Mn1jrQHJH^YE56?PeUS9D^8k0<*ThhDc(*EG~C z^%G&fY#hDId!ybgkLLOA1OsbPNm}EjnH@$9Q9FF`vqu!Zl_WjP@x$YYndij?6ij04 zj7iyf0t?-`H*8wmIWmQ(7+lT;GCvA%UyI+FM`}K}&p@;&rd#XFJ4SW)Q?20Tp8oQt zOU-(2|Md!0a6O7FGc4q}tl5`zi=o+ORQuceEvL@z?|4S@*5H{PyH4Xlfm{2Fx*krA z>?r@r^*T!BUTBV6>h&x~iZ3bg%3O={M^KdN$_I4lNY|Rc;Z_TR1l_ zJezD4s_5(S5B1QlC8N+u*k%7wli;9+$2GLBs^E?IOe(;fB26stca7?bYmpKZ)dZ zE<~!l<^&N>Lc|mDqw0)}AO2rm0LMV8&J+aVe#KMo?iNh`|3_ zT~^0X@%|cvzltz96_2N!PxZy)_u}Dmq#HTrs(~P_4nwLDJ0#&LpDp_(;ZqUf-zk)C zAcYw$j^bMo3-D)9soEw3zkuYZAy2yuet{Dnk|2^2M`q(G=X%Gp@$5*=(z8VrYBD%R z;;)-7!aqkk*m{=IY8~x4d@*8|;a{(;bAb`paUd%J#IMn>`%ccT1kB%o z@2bIHT}LHe$rw(y|ISj`N@EWHFEyY2L&zl;i~KB!qx#t$N6_McnVjP#P|gg8c?mg)>cWHx;>)~G3lo@-9QpD(g63y+j0_@XX1P>JQ((r@-XlTH{ zG~)?p$?rr6BFoq?Z*ftA5bayCjwnH386dt3>i<$r)G@H_dH{mq7gW&>r z9L<`~`Hx^R#h`{$mX1lX1Dn?i)6j5JHC&qTHI_UD+WB7t>%>5%gs5b7|2_>G8pb*r z8ZH#JVKPlFTM{qCAJk5O`16wE#R&NA-axF`-rl`{KMnN9gCg_43(Ca?goTE=d%1Y} zDue6RA^*E;4LFGwP)X{@@a?N1(8(lleQ^|%zPsclF@o&>Bt`UZBo1VcZKBD2*3L(c z7bmcy!Br4gssjRxLPDc#$1Xt-qVs)C&XgbsY$Ly80)Y+~E(B)D6HE){+F`z59YlA1Fy!yUY-7UoGIY z$S-gw;nW5!!^A1F_<8~#mx~M0pBU=m0w+II{e#Kr-3r)ffjmkeR7#=b>0W}!H!QaX z3lp#&sAD4?I1MN8=U36LrIr@v7k(*LuoI+SBH$HKNff^^aHAGbk(s0joM@)oqyST1 zW*E%r3o-D0bhD9q*)RNEy{RscYGiW z93O&lh=-Pmx<4>RCxmfY5W(OVpygPBu|)=8D2pQ){xSp(v=GG*xIh{Pvjih|iLw0} zSTF842Wpcz%RmEzGUQ7WbT`0+tihqk!Wm1s)FHob15kG_&KW^?>aQ?DXr9Os*w8E&AeI%@ z2v}L3iY2UGH+ca5x)%m>xcd_Q4@R!)rnIN+I1+(NDT)BsLTO0E8R0!Ij~&-?3V`?g z0R+5H0c)5n2z=`x3}$ghmIhSng~gkMaOOe~7V9@qNe?R|8OOG?1|%a7lxb)rP*Obz zM`(1yXxUbHOydT?RU!q!IF+=D*NH0v49`>qWAG>~12qr0>9H1{^liZKk)Ws&Is~Sq zBV;!fu{|DzxQb;X;B`t^Q<*CP@S9u&yeEg2bw#85<(~KYgYlOHf`t&Ozk`Jc*{BkM zdD#JAL60P7IE#W{Cjep;ddwCVAv8iK(QyRUe2g*>MxYqMxT;LxL37PKIMVkXyb&1vkP3kt&C=%OmYgsks1_S|S`gJat$Kv!D>V(wQcM-F zWW9%gk2cb>tWa5yLPo}YpfVOPK+!Iu`v4)USH;G|35e^y76jb;kd~90E8MQV8o;P% zLom|Su%3Sx0{eErU{()5B=N=iw#Y_+^2+fTZG?aI>u@hGyH$nqm+U8nz8Q2V#8bFL*Q3SlSjt(__ zz>=iCd&SZYG8GyyR0UB^RU-wFi7zvR(JAk5V}*DjLss2PkY7fJ+mG7}+8*sJsU@_T?#^m{%Y)6agMX3k(-62k7y)+$q74A6DlVjti zk}hb1ITev|GMSDZdO#QzgW*;N%%vD6fx#I;-i00xR_V*MD-He|;$D=EU?}gvjtG|> z06bj)gIN!ThGRPjtN%WPWLN|vvHKD|4z9?NUib?F2pArQ#3fd|pTJn?;2=3r@QB+g#J`Ck`Kdkz7$dg6{eopG= z{;1Y~RiVwaHKRGo;Ft;qi9T5cHnJf`GdWG0G`00?-Ul_XZH>o32?o8Tmj6 z{9F)%0QsB|RZ_mU>fFLXyEI;MlGHjGzr-?`hUNS>P z0$2olGr*l$2f;`;0~>*;U8QyiY@mmLm&~x?S=k(b=XSwhR$@32D;eBG7KAjl8{tu< zyM}AU^tuRPRM;RG;9WCJd=W3MBQ${kadE}CaNCQ}h#0OxjSINlb_>8Y)(OD?kDXx_ z{3^Qv7^E7oZ9R8WMF3cz30uNB=s~0JK;%FtFr^2`?<~Qc1hDG`dCkf^it=O|b`scE0g+**=5G+g zkgKqaES@V8AGlF7JAfly1LJUdg}QmTd9S{-%GNtI=LodW4zz%tfI{xV)Z`I6s=)~} z7upM$%il-9yY~{9mX!p9Vx0^GTvEZ9tp*!FWT5{eUinxnk2A zRQ?DXAtuDG`W^7`V=I!n>=y``Me{0iLZv+r>uE27k=lxm9x&svfM&iDz?cPW2cdPb zegGjealq;#-T`ox7)HRuU8@Z6<>%&r&!C57{6~aLyJrn*RfAa25inNyf?!O%LU#xj zw@dqzdI&JxD_}bG?!M6|LN?+^HT}Relqc%2yJTGB2#tvol|5ma= zDES41rosv9^uta-`qU*D%o-LQwrU{IFy_gu0UhW8jM4UQSwo(32J>(DKB^E73v)B& zmop6zX4?vy7X*YRZWgU8Set8|!BLa~+0q3JYh7n5rZ6-JKlQUegetjPTw<{swU!V#@8Z z=VHMaM0YL^q%9CjCpWB=xAV{JZwEA|!LBr#X8l%#<}Ni2Y?)CvAjVEz1T5lCB?b(( za0lQ4kc@y9Il#%xez*OrnvPPOAFH5RQ}T0nf+V_kl=}QwkMFjG&;`h*9$1BuJb);K zJqY-kKK;u5wx{wqap-worxoGuwgZ{g6Px84c>;!u`yhxQ`H&~o^aXeQDg;&lxeVw! zOJD%D+b|Bh7r=S#foSiLHT}v%rXUET*$3hB|5=aruFp}0cD=rWl_NUNEC#}aY+>QV z)gyfA@>>Ad5iSviNaf>=O)yV-1CdmsATS@f(;Mrz3lKOn1_3MY$5OlO2jGn$Q32Gf z0m0s@>g67UX32DjfjvVxBxq1e=%cE7BNPxtRckZg&R4WG;># zm5stfIYcE^=PFR#?-lzaL)i$KA`vV9J|f`yB_9F{kh7BLQEMBRtHH^L0#y(JUx5gS z&QkB4fXJlKzN|`0&h!PNP5^`qM#FFaUEFTAH#Ns3m@~*?D?+%KvvfFAO&_rS{*M5}--B6-n~J zI`X@NE0SbiAiB>T2qLg{^%Y76g!1)1gu+kGs-{Oxz;K(=vr?ViV7T(H7_O%tA!PD? zRMvxOD3#f<`QhWoFbyxZR6Ex39Q=S>Yn~zvWcp!8eIo=O?}EW>0cvV0SewAEDeez3 z=|-6NH_@*=q)CS`W_w@^_JGI;FW*%eO+jb@uVFOSQ1=z13GQ?{!=0WcU{5^(tV320 zAR-7qUL_p%9&rsD1Y~M_*y-T$2ZZcf0Co!LdA_R!`udUy_&$1DdSMKqF$<&$7_fMh zs@YhYz)7TI|0|=7wMBFw=>64cgfXZdjM>l|gun{(|9Gqnp0Fu&g8&j29eFAo_}TWc zRmO9Mc7Fa#;AdVy7wGX^0v^GE$U4VYQ6Ht;Fg9830*MeH<3`sX#&(V=7zkDfc64CD zf~lr6SZl)=0w6&jA@dC* zFfd~WAlwT|4GZktYhnn|3XuI2a4XGFT;shTIxoHpf-TFV^R80`7eQ z^aH&Iq3yR!h9|Q`VRry1RX4B-coKvVf;t?S!=|%QK%5=n2)HMT>Z}cxmN6QDLqSFZ zDPUVPl~cmtgAiDVgn&Uc4onp4g1~=k*c)8yMkx{<+gVF!Kx^GYq2J{9n5YP#k>q7`#fUI~3>vB$qfb1cU z5g}sAaH#LjV6LQ39Yc12s{+W^&|!kN10fT+yo%kG5&+}J&k&4fm8&S_q{F*s24LJW zfO9AGTI5DILU#8WZsiUea!6qm8;_iJYB;6?mscaAO%j{|1~3jn1@&ES?4g zUYm?H=GJ5&3Z8&~1Cp^Z_7nvEj}->9d4+_ozGhg0u(ol-Sgc;*tFO7;QUDUa2-4E_ zg;hpqW80wnH9VK>}fMSD;M zm|NL)kj)6l}6aX~mQrBTgY zFj(O@04sY!V1Baeacp`)xgCZLoR)qt4HxRV7`E{=i2GC^!u{THs&2uJk3-5%@;-$Xrg8Fo9B%Vy03AzR@zhFL#q+EKz#-`Ao8VPGmkxbhGLCUmV&+T{fW3Xndc1BHGbM2MLRpQxT~ zg!bna06N;QXbX`}#b#nPdMOjAYDWh3<9nX!LQ7rq9F{f5(MLF z7M8&v1SVgAOu@$%>F%{+1r9f(n+>oIUxKm7q1jaVC#;9%n>b)5L3d2>8bZ^bO%*U< znhnZRHmv}^6l~U_bvJw+p%FW}%IH0q10?x-3&A*>gN-Q9Ah2cw3}%mVI}orUhQf`P zZa1idb{zXwY@8*vAguT2Qn7|?{=LiP4??c(= zhVS{f<^gcTYZ%P=?*_>KCS7p#2VMrkcPGZH+4P`$`ukUGZhw>@kZA>IdCBv6RNey< z1@6~3z70OWd`64iE_y3VAYbDJ8^6x^RMv!zos|#nT>O;#2Y;MTHO^r85(Iy?;U9c+ z0oAksH!8?fuqY0e0$l%L7rBfo|A@{~6TwWo3INmO9WY#)dLD7aUJGKT3J2o}j=Kmn lE-rp}~J{2WwVcy8uG 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 Sr%BpL+RkK+CfyV9qxm0;rJyhX diff --git a/youtube-dl.1 b/youtube-dl.1 index 47899f4..26833e8 100644 --- a/youtube-dl.1 +++ b/youtube-dl.1 @@ -278,7 +278,7 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 128K\ (default\ 5) \-\-recode\-video\ FORMAT\ \ \ \ \ \ \ \ \ \ \ \ Encode\ the\ video\ to\ another\ format\ if \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ necessary\ (currently\ supported: -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ mp4|flv|ogg|webm) +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ mp4|flv|ogg|webm|mkv) \-k,\ \-\-keep\-video\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ keeps\ the\ video\ file\ on\ disk\ after\ the \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ post\-processing;\ the\ video\ is\ erased\ by \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 31ed63f..5e16a54 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -60,6 +60,10 @@ __authors__ = ( 'Georg Jähnig', 'Ralf Haring', 'Koki Takahashi', + 'Ariset Llerena', + 'Adam Malcontenti-Wilson', + 'Tobias Bell', + 'Naglis Jonaitis', ) __license__ = 'Public Domain' @@ -506,7 +510,7 @@ def parseOpts(overrideArguments=None): postproc.add_option('--audio-quality', metavar='QUALITY', dest='audioquality', default='5', help='ffmpeg/avconv audio quality specification, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default 5)') postproc.add_option('--recode-video', metavar='FORMAT', dest='recodevideo', default=None, - help='Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm)') + help='Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm|mkv)') postproc.add_option('-k', '--keep-video', action='store_true', dest='keepvideo', default=False, help='keeps the video file on disk after the post-processing; the video is erased by default') postproc.add_option('--no-post-overwrites', action='store_true', dest='nopostoverwrites', default=False, diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index 12cca5c..e49ac3e 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -83,6 +83,7 @@ from .extremetube import ExtremeTubeIE from .facebook import FacebookIE from .faz import FazIE from .fc2 import FC2IE +from .firedrive import FiredriveIE from .firstpost import FirstpostIE from .firsttv import FirstTVIE from .fivemin import FiveMinIE @@ -105,6 +106,7 @@ from .freesound import FreesoundIE from .freespeech import FreespeechIE from .funnyordie import FunnyOrDieIE from .gamekings import GamekingsIE +from .gameone import GameOneIE from .gamespot import GameSpotIE from .gametrailers import GametrailersIE from .gdcvault import GDCVaultIE @@ -112,6 +114,7 @@ from .generic import GenericIE from .googleplus import GooglePlusIE from .googlesearch import GoogleSearchIE from .gorillavid import GorillaVidIE +from .goshgay import GoshgayIE from .hark import HarkIE from .helsinki import HelsinkiIE from .hentaistigma import HentaiStigmaIE @@ -229,6 +232,7 @@ from .radiofrance import RadioFranceIE from .rai import RaiIE from .rbmaradio import RBMARadioIE from .redtube import RedTubeIE +from .reverbnation import ReverbNationIE from .ringtv import RingTVIE from .ro220 import Ro220IE from .rottentomatoes import RottenTomatoesIE @@ -237,6 +241,7 @@ from .rtbf import RTBFIE from .rtlnow import RTLnowIE from .rts import RTSIE from .rtve import RTVEALaCartaIE +from .ruhd import RUHDIE from .rutube import ( RutubeIE, RutubeChannelIE, @@ -246,6 +251,7 @@ from .rutube import ( from .rutv import RUTVIE from .savefrom import SaveFromIE from .scivee import SciVeeIE +from .screencast import ScreencastIE from .servingsys import ServingSysIE from .sina import SinaIE from .slideshare import SlideshareIE @@ -264,8 +270,8 @@ from .soundcloud import ( SoundcloudPlaylistIE ) from .soundgasm import SoundgasmIE -from .southparkstudios import ( - SouthParkStudiosIE, +from .southpark import ( + SouthParkIE, SouthparkDeIE, ) from .space import SpaceIE @@ -289,6 +295,7 @@ from .teachingchannel import TeachingChannelIE from .teamcoco import TeamcocoIE from .techtalks import TechTalksIE from .ted import TEDIE +from .tenplay import TenPlayIE from .testurl import TestURLIE from .tf1 import TF1IE from .theplatform import ThePlatformIE @@ -336,12 +343,14 @@ from .vimeo import ( VimeoReviewIE, VimeoWatchLaterIE, ) +from .vimple import VimpleIE from .vine import ( VineIE, VineUserIE, ) from .viki import VikiIE from .vk import VKIE +from .vodlocker import VodlockerIE from .vube import VubeIE from .vuclip import VuClipIE from .vulture import VultureIE diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index e4e4fee..e686573 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -1,11 +1,12 @@ import base64 import hashlib import json +import netrc import os import re import socket import sys -import netrc +import time import xml.etree.ElementTree from ..utils import ( @@ -462,14 +463,14 @@ class InfoExtractor(object): def _og_search_url(self, html, **kargs): return self._og_search_property('url', html, **kargs) - def _html_search_meta(self, name, html, display_name=None, fatal=False): + def _html_search_meta(self, name, html, display_name=None, fatal=False, **kwargs): if display_name is None: display_name = name return self._html_search_regex( r'''(?ix)]+(?:itemprop|name|property)=["\']%s["\']) [^>]+content=["\']([^"\']+)["\']''' % re.escape(name), - html, display_name, fatal=fatal) + html, display_name, fatal=fatal, **kwargs) def _dc_search_uploader(self, html): return self._html_search_meta('dc.creator', html, 'uploader') @@ -575,6 +576,13 @@ class InfoExtractor(object): else: return url + def _sleep(self, timeout, video_id, msg_template=None): + if msg_template is None: + msg_template = u'%(video_id)s: Waiting for %(timeout)s seconds' + msg = msg_template % {'video_id': video_id, 'timeout': timeout} + self.to_screen(msg) + time.sleep(timeout) + class SearchInfoExtractor(InfoExtractor): """ @@ -618,4 +626,3 @@ class SearchInfoExtractor(InfoExtractor): @property def SEARCH_KEY(self): return self._SEARCH_KEY - diff --git a/youtube_dl/extractor/criterion.py b/youtube_dl/extractor/criterion.py index 31fe3d5..4fb1781 100644 --- a/youtube_dl/extractor/criterion.py +++ b/youtube_dl/extractor/criterion.py @@ -1,40 +1,43 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals import re from .common import InfoExtractor -from ..utils import determine_ext + class CriterionIE(InfoExtractor): - _VALID_URL = r'https?://www\.criterion\.com/films/(\d*)-.+' + _VALID_URL = r'https?://www\.criterion\.com/films/(?P[0-9]+)-.+' _TEST = { - u'url': u'http://www.criterion.com/films/184-le-samourai', - u'file': u'184.mp4', - u'md5': u'bc51beba55685509883a9a7830919ec3', - u'info_dict': { - u"title": u"Le Samouraï", - u"description" : u'md5:a2b4b116326558149bef81f76dcbb93f', + 'url': 'http://www.criterion.com/films/184-le-samourai', + 'md5': 'bc51beba55685509883a9a7830919ec3', + 'info_dict': { + 'id': '184', + 'ext': 'mp4', + 'title': 'Le Samouraï', + 'description': 'md5:a2b4b116326558149bef81f76dcbb93f', } } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - video_id = mobj.group(1) + video_id = mobj.group('id') webpage = self._download_webpage(url, video_id) - final_url = self._search_regex(r'so.addVariable\("videoURL", "(.+?)"\)\;', - webpage, 'video url') - title = self._html_search_regex(r'', - webpage, 'video title') - description = self._html_search_regex(r'', - webpage, 'video description') - thumbnail = self._search_regex(r'so.addVariable\("thumbnailURL", "(.+?)"\)\;', - webpage, 'thumbnail url') + final_url = self._search_regex( + r'so.addVariable\("videoURL", "(.+?)"\)\;', webpage, 'video url') + title = self._og_search_title(webpage) + description = self._html_search_regex( + r'', + webpage, 'video description') + thumbnail = self._search_regex( + r'so.addVariable\("thumbnailURL", "(.+?)"\)\;', + webpage, 'thumbnail url') - return {'id': video_id, - 'url' : final_url, - 'title': title, - 'ext': determine_ext(final_url), - 'description': description, - 'thumbnail': thumbnail, - } + return { + 'id': video_id, + 'url': final_url, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + } diff --git a/youtube_dl/extractor/firedrive.py b/youtube_dl/extractor/firedrive.py new file mode 100644 index 0000000..d26145d --- /dev/null +++ b/youtube_dl/extractor/firedrive.py @@ -0,0 +1,83 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + compat_urllib_parse, + compat_urllib_request, + determine_ext, +) + + +class FiredriveIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?firedrive\.com/' + \ + '(?:file|embed)/(?P[0-9a-zA-Z]+)' + _FILE_DELETED_REGEX = r'
' + + _TESTS = [{ + 'url': 'https://www.firedrive.com/file/FEB892FA160EBD01', + 'md5': 'd5d4252f80ebeab4dc2d5ceaed1b7970', + 'info_dict': { + 'id': 'FEB892FA160EBD01', + 'ext': 'flv', + 'title': 'bbb_theora_486kbit.flv', + 'thumbnail': 're:^http://.*\.jpg$', + }, + }] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + url = 'http://firedrive.com/file/%s' % video_id + + webpage = self._download_webpage(url, video_id) + + if re.search(self._FILE_DELETED_REGEX, webpage) is not None: + raise ExtractorError('Video %s does not exist' % video_id, + expected=True) + + fields = dict(re.findall(r'''(?x)(.+)
', + webpage, 'title') + thumbnail = self._search_regex(r'image:\s?"(//[^\"]+)', webpage, + 'thumbnail', fatal=False) + if thumbnail is not None: + thumbnail = 'http:' + thumbnail + + ext = self._search_regex(r'type:\s?\'([^\']+)\',', + webpage, 'extension', fatal=False) + video_url = self._search_regex( + r'file:\s?\'(http[^\']+)\',', webpage, 'file url') + + formats = [{ + 'format_id': 'sd', + 'url': video_url, + 'ext': ext, + }] + + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'formats': formats, + } diff --git a/youtube_dl/extractor/gameone.py b/youtube_dl/extractor/gameone.py new file mode 100644 index 0000000..b580f52 --- /dev/null +++ b/youtube_dl/extractor/gameone.py @@ -0,0 +1,90 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + xpath_with_ns, + parse_iso8601 +) + +NAMESPACE_MAP = { + 'media': 'http://search.yahoo.com/mrss/', +} + +# URL prefix to download the mp4 files directly instead of streaming via rtmp +# Credits go to XBox-Maniac +# http://board.jdownloader.org/showpost.php?p=185835&postcount=31 +RAW_MP4_URL = 'http://cdn.riptide-mtvn.com/' + + +class GameOneIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?gameone\.de/tv/(?P\d+)' + _TEST = { + 'url': 'http://www.gameone.de/tv/288', + 'md5': '136656b7fb4c9cb4a8e2d500651c499b', + 'info_dict': { + 'id': '288', + 'ext': 'mp4', + 'title': 'Game One - Folge 288', + 'duration': 1238, + 'thumbnail': 'http://s3.gameone.de/gameone/assets/video_metas/teaser_images/000/643/636/big/640x360.jpg', + 'description': 'FIFA-Pressepokal 2014, Star Citizen, Kingdom Come: Deliverance, Project Cars, Schöner Trants Nerdquiz Folge 2 Runde 1', + 'age_limit': 16, + 'upload_date': '20140513', + 'timestamp': 1399980122, + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + webpage = self._download_webpage(url, video_id) + og_video = self._og_search_video_url(webpage, secure=False) + description = self._html_search_meta('description', webpage) + age_limit = int( + self._search_regex( + r'age=(\d+)', + self._html_search_meta( + 'age-de-meta-label', + webpage), + 'age_limit', + '0')) + mrss_url = self._search_regex(r'mrss=([^&]+)', og_video, 'mrss') + + mrss = self._download_xml(mrss_url, video_id, 'Downloading mrss') + title = mrss.find('.//item/title').text + thumbnail = mrss.find('.//item/image').get('url') + timestamp = parse_iso8601(mrss.find('.//pubDate').text, delimiter=' ') + content = mrss.find(xpath_with_ns('.//media:content', NAMESPACE_MAP)) + content_url = content.get('url') + + content = self._download_xml( + content_url, + video_id, + 'Downloading media:content') + rendition_items = content.findall('.//rendition') + duration = int(rendition_items[0].get('duration')) + formats = [ + { + 'url': re.sub(r'.*/(r2)', RAW_MP4_URL + r'\1', r.find('./src').text), + 'width': int(r.get('width')), + 'height': int(r.get('height')), + 'tbr': int(r.get('bitrate')), + } + for r in rendition_items + ] + self._sort_formats(formats) + + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'duration': duration, + 'formats': formats, + 'description': description, + 'age_limit': age_limit, + 'timestamp': timestamp, + } diff --git a/youtube_dl/extractor/gorillavid.py b/youtube_dl/extractor/gorillavid.py index aa15caf..ca5f7c4 100644 --- a/youtube_dl/extractor/gorillavid.py +++ b/youtube_dl/extractor/gorillavid.py @@ -12,7 +12,12 @@ from ..utils import ( class GorillaVidIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?gorillavid\.in/(?:embed-)?(?P[0-9a-zA-Z]+)(?:-[0-9]+x[0-9]+\.html)?' + IE_DESC = 'GorillaVid.in and daclips.in' + _VALID_URL = r'''(?x) + https?://(?P(?:www\.)? + (?:daclips\.in|gorillavid\.in))/ + (?:embed-)?(?P[0-9a-zA-Z]+)(?:-[0-9]+x[0-9]+\.html)? + ''' _TESTS = [{ 'url': 'http://gorillavid.in/06y9juieqpmi', @@ -32,15 +37,22 @@ class GorillaVidIE(InfoExtractor): 'title': 'Say something nice', 'thumbnail': 're:http://.*\.jpg', }, + }, { + 'url': 'http://daclips.in/3rso4kdn6f9m', + 'md5': '1ad8fd39bb976eeb66004d3a4895f106', + 'info_dict': { + 'id': '3rso4kdn6f9m', + 'ext': 'mp4', + 'title': 'Micro Pig piglets ready on 16th July 2009', + 'thumbnail': 're:http://.*\.jpg', + }, }] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id = mobj.group('id') - url = 'http://gorillavid.in/%s' % video_id - - webpage = self._download_webpage(url, video_id) + webpage = self._download_webpage('http://%s/%s' % (mobj.group('host'), video_id), video_id) fields = dict(re.findall(r'''(?x)\d+?)($|/)' + _TEST = { + 'url': 'http://www.goshgay.com/video4116282', + 'md5': '268b9f3c3229105c57859e166dd72b03', + 'info_dict': { + 'id': '4116282', + 'ext': 'flv', + 'title': 'md5:089833a4790b5e103285a07337f245bf', + 'thumbnail': 're:http://.*\.jpg', + 'age_limit': 18, + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + webpage = self._download_webpage(url, video_id) + title = self._search_regex(r'class="video-title">

(.+?)<', webpage, 'title') + + player_config = self._search_regex( + r'(?s)jwplayer\("player"\)\.setup\(({.+?})\)', webpage, 'config settings') + player_vars = json.loads(player_config.replace("'", '"')) + width = str_to_int(player_vars.get('width')) + height = str_to_int(player_vars.get('height')) + config_uri = player_vars.get('config') + + if config_uri is None: + raise ExtractorError('Missing config URI') + node = self._download_xml(config_uri, video_id, 'Downloading player config XML', + errnote='Unable to download XML') + if node is None: + raise ExtractorError('Missing config XML') + if node.tag != 'config': + raise ExtractorError('Missing config attribute') + fns = node.findall('file') + imgs = node.findall('image') + if len(fns) != 1: + raise ExtractorError('Missing media URI') + video_url = fns[0].text + if len(imgs) < 1: + thumbnail = None + else: + thumbnail = imgs[0].text + + url_comp = compat_urlparse.urlparse(url) + ref = "%s://%s%s" % (url_comp[0], url_comp[1], url_comp[2]) + + return { + 'id': video_id, + 'url': video_url, + 'title': title, + 'width': width, + 'height': height, + 'thumbnail': thumbnail, + 'http_referer': ref, + 'age_limit': 18, + } diff --git a/youtube_dl/extractor/mtv.py b/youtube_dl/extractor/mtv.py index af9490c..228b42d 100644 --- a/youtube_dl/extractor/mtv.py +++ b/youtube_dl/extractor/mtv.py @@ -158,6 +158,9 @@ class MTVServicesInfoExtractor(InfoExtractor): if mgid.endswith('.swf'): mgid = mgid[:-4] except RegexNotFoundError: + mgid = None + + if mgid is None or ':' not in mgid: mgid = self._search_regex( [r'data-mgid="(.*?)"', r'swfobject.embedSWF\(".*?(mgid:.*?)"'], webpage, u'mgid') diff --git a/youtube_dl/extractor/ndr.py b/youtube_dl/extractor/ndr.py index 3d6096e..94d5ba9 100644 --- a/youtube_dl/extractor/ndr.py +++ b/youtube_dl/extractor/ndr.py @@ -18,15 +18,15 @@ class NDRIE(InfoExtractor): _TESTS = [ { - 'url': 'http://www.ndr.de/fernsehen/sendungen/markt/markt7959.html', - 'md5': 'e7a6079ca39d3568f4996cb858dd6708', + 'url': 'http://www.ndr.de/fernsehen/media/dienordreportage325.html', + 'md5': '4a4eeafd17c3058b65f0c8f091355855', 'note': 'Video file', 'info_dict': { - 'id': '7959', + 'id': '325', 'ext': 'mp4', - 'title': 'Markt - die ganze Sendung', - 'description': 'md5:af9179cf07f67c5c12dc6d9997e05725', - 'duration': 2655, + 'title': 'Blaue Bohnen aus Blocken', + 'description': 'md5:190d71ba2ccddc805ed01547718963bc', + 'duration': 1715, }, }, { diff --git a/youtube_dl/extractor/pyvideo.py b/youtube_dl/extractor/pyvideo.py index 0bc0859..6d5732d 100644 --- a/youtube_dl/extractor/pyvideo.py +++ b/youtube_dl/extractor/pyvideo.py @@ -46,7 +46,7 @@ class PyvideoIE(InfoExtractor): return self.url_result(m_youtube.group(1), 'Youtube') title = self._html_search_regex( - r'
.*?([^>]+?)

', + r'
\s*]*)?>([^>]+?)

', webpage, 'title', flags=re.DOTALL) video_url = self._search_regex( [r'Download.*?\d+).*?$' + _TESTS = [{ + 'url': 'http://www.reverbnation.com/alkilados/song/16965047-mona-lisa', + 'file': '16965047.mp3', + 'md5': '3da12ebca28c67c111a7f8b262d3f7a7', + 'info_dict': { + "title": "MONA LISA", + "uploader": "ALKILADOS", + "uploader_id": 216429, + "thumbnail": "//gp1.wac.edgecastcdn.net/802892/production_public/Photo/13761700/image/1366002176_AVATAR_MONA_LISA.jpg" + }, + }] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + song_id = mobj.group('id') + + api_res = self._download_json( + 'https://api.reverbnation.com/song/%s?callback=api_response_5&_=%d' + % (song_id, int(time.time() * 1000)), + song_id, + transform_source=strip_jsonp, + note='Downloading information of song %s' % song_id + ) + + return { + 'id': song_id, + 'title': api_res.get('name'), + 'url': api_res.get('url'), + 'uploader': api_res.get('artist', {}).get('name'), + 'uploader_id': api_res.get('artist', {}).get('id'), + 'thumbnail': api_res.get('image', api_res.get('thumbnail')), + 'ext': 'mp3', + 'vcodec': 'none', + } diff --git a/youtube_dl/extractor/ruhd.py b/youtube_dl/extractor/ruhd.py new file mode 100644 index 0000000..55b58e5 --- /dev/null +++ b/youtube_dl/extractor/ruhd.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor + + +class RUHDIE(InfoExtractor): + _VALID_URL = r'http://(?:www\.)?ruhd\.ru/play\.php\?vid=(?P\d+)' + _TEST = { + 'url': 'http://www.ruhd.ru/play.php?vid=207', + 'md5': 'd1a9ec4edf8598e3fbd92bb16072ba83', + 'info_dict': { + 'id': '207', + 'ext': 'divx', + 'title': 'КОТ бааааам', + 'description': 'классный кот)', + 'thumbnail': 're:^http://.*\.jpg$', + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + webpage = self._download_webpage(url, video_id) + + video_url = self._html_search_regex( + r'([^<]+)   RUHD.ru - Видео Высокого качества №1 в России!', webpage, 'title') + description = self._html_search_regex( + r'(?s)
(.+?)', webpage, 'description', fatal=False) + thumbnail = self._html_search_regex( + r'[a-zA-Z0-9]+)' + _TESTS = [{ + 'url': 'http://www.screencast.com/t/3ZEjQXlT', + 'md5': '917df1c13798a3e96211dd1561fded83', + 'info_dict': { + 'id': '3ZEjQXlT', + 'ext': 'm4v', + 'title': 'Color Measurement with Ocean Optics Spectrometers', + 'description': 'md5:240369cde69d8bed61349a199c5fb153', + 'thumbnail': 're:^https?://.*\.(?:gif|jpg)$', + } + }, { + 'url': 'http://www.screencast.com/t/V2uXehPJa1ZI', + 'md5': 'e8e4b375a7660a9e7e35c33973410d34', + 'info_dict': { + 'id': 'V2uXehPJa1ZI', + 'ext': 'mov', + 'title': 'The Amadeus Spectrometer', + 'description': 're:^In this video, our friends at.*To learn more about Amadeus, visit', + 'thumbnail': 're:^https?://.*\.(?:gif|jpg)$', + } + }, { + 'url': 'http://www.screencast.com/t/aAB3iowa', + 'md5': 'dedb2734ed00c9755761ccaee88527cd', + 'info_dict': { + 'id': 'aAB3iowa', + 'ext': 'mp4', + 'title': 'Google Earth Export', + 'description': 'Provides a demo of a CommunityViz export to Google Earth, one of the 3D viewing options.', + 'thumbnail': 're:^https?://.*\.(?:gif|jpg)$', + } + }, { + 'url': 'http://www.screencast.com/t/X3ddTrYh', + 'md5': '669ee55ff9c51988b4ebc0877cc8b159', + 'info_dict': { + 'id': 'X3ddTrYh', + 'ext': 'wmv', + 'title': 'Toolkit 6 User Group Webinar (2014-03-04) - Default Judgment and First Impression', + 'description': 'md5:7b9f393bc92af02326a5c5889639eab0', + 'thumbnail': 're:^https?://.*\.(?:gif|jpg)$', + } + }, + ] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + webpage = self._download_webpage(url, video_id) + + video_url = self._html_search_regex( + r'Title: ([^<]*)
', + r'class="tabSeperator">>(.*?)<'], + webpage, 'title') + thumbnail = self._og_search_thumbnail(webpage) + description = self._og_search_description(webpage, default=None) + if description is None: + description = self._html_search_meta('description', webpage) + + return { + 'id': video_id, + 'url': video_url, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + } diff --git a/youtube_dl/extractor/soundcloud.py b/youtube_dl/extractor/soundcloud.py index 7aa100f..8a77c13 100644 --- a/youtube_dl/extractor/soundcloud.py +++ b/youtube_dl/extractor/soundcloud.py @@ -81,16 +81,16 @@ class SoundcloudIE(InfoExtractor): }, # downloadable song { - 'url': 'https://soundcloud.com/simgretina/just-your-problem-baby-1', - 'md5': '56a8b69568acaa967b4c49f9d1d52d19', + 'url': 'https://soundcloud.com/oddsamples/bus-brakes', + 'md5': 'fee7b8747b09bb755cefd4b853e7249a', 'info_dict': { - 'id': '105614606', + 'id': '128590877', 'ext': 'wav', - 'title': 'Just Your Problem Baby (Acapella)', - 'description': 'Vocals', - 'uploader': 'Sim Gretina', - 'upload_date': '20130815', - #'duration': 42, + 'title': 'Bus Brakes', + 'description': 'md5:0170be75dd395c96025d210d261c784e', + 'uploader': 'oddsamples', + 'upload_date': '20140109', + 'duration': 17, }, }, ] @@ -255,7 +255,7 @@ class SoundcloudSetIE(SoundcloudIE): class SoundcloudUserIE(SoundcloudIE): - _VALID_URL = r'https?://(www\.)?soundcloud\.com/(?P[^/]+)(/?(tracks/)?)?(\?.*)?$' + _VALID_URL = r'https?://(www\.)?soundcloud\.com/(?P[^/]+)/?((?Ptracks|likes)/?)?(\?.*)?$' IE_NAME = 'soundcloud:user' # it's in tests/test_playlists.py @@ -264,24 +264,31 @@ class SoundcloudUserIE(SoundcloudIE): def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) uploader = mobj.group('user') + resource = mobj.group('rsrc') + if resource is None: + resource = 'tracks' + elif resource == 'likes': + resource = 'favorites' url = 'http://soundcloud.com/%s/' % uploader resolv_url = self._resolv_url(url) user = self._download_json( resolv_url, uploader, 'Downloading user info') - base_url = 'http://api.soundcloud.com/users/%s/tracks.json?' % uploader + base_url = 'http://api.soundcloud.com/users/%s/%s.json?' % (uploader, resource) entries = [] for i in itertools.count(): data = compat_urllib_parse.urlencode({ 'offset': i * 50, + 'limit': 50, 'client_id': self._CLIENT_ID, }) new_entries = self._download_json( base_url + data, uploader, 'Downloading track page %s' % (i + 1)) - entries.extend(self._extract_info_dict(e, quiet=True) for e in new_entries) - if len(new_entries) < 50: + if len(new_entries) == 0: + self.to_screen('%s: End page received' % uploader) break + entries.extend(self._extract_info_dict(e, quiet=True) for e in new_entries) return { '_type': 'playlist', diff --git a/youtube_dl/extractor/southparkstudios.py b/youtube_dl/extractor/southpark.py similarity index 73% rename from youtube_dl/extractor/southparkstudios.py rename to youtube_dl/extractor/southpark.py index aea8e64..c20397b 100644 --- a/youtube_dl/extractor/southparkstudios.py +++ b/youtube_dl/extractor/southpark.py @@ -3,24 +3,24 @@ from __future__ import unicode_literals from .mtv import MTVServicesInfoExtractor -class SouthParkStudiosIE(MTVServicesInfoExtractor): - IE_NAME = 'southparkstudios.com' - _VALID_URL = r'https?://(www\.)?(?Psouthparkstudios\.com/(clips|full-episodes)/(?P.+?)(\?|#|$))' +class SouthParkIE(MTVServicesInfoExtractor): + IE_NAME = 'southpark.cc.com' + _VALID_URL = r'https?://(www\.)?(?Psouthpark\.cc\.com/(clips|full-episodes)/(?P.+?)(\?|#|$))' _FEED_URL = 'http://www.southparkstudios.com/feeds/video-player/mrss' _TESTS = [{ - 'url': 'http://www.southparkstudios.com/clips/104437/bat-daded#tab=featured', + 'url': 'http://southpark.cc.com/clips/104437/bat-daded#tab=featured', 'info_dict': { 'id': 'a7bff6c2-ed00-11e0-aca6-0026b9414f30', 'ext': 'mp4', - 'title': 'Bat Daded', + 'title': 'South Park|Bat Daded', 'description': 'Randy disqualifies South Park by getting into a fight with Bat Dad.', }, }] -class SouthparkDeIE(SouthParkStudiosIE): +class SouthparkDeIE(SouthParkIE): IE_NAME = 'southpark.de' _VALID_URL = r'https?://(www\.)?(?Psouthpark\.de/(clips|alle-episoden)/(?P.+?)(\?|#|$))' _FEED_URL = 'http://www.southpark.de/feeds/video-player/mrss/' diff --git a/youtube_dl/extractor/tenplay.py b/youtube_dl/extractor/tenplay.py new file mode 100644 index 0000000..8477840 --- /dev/null +++ b/youtube_dl/extractor/tenplay.py @@ -0,0 +1,84 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor + + +class TenPlayIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?ten(play)?\.com\.au/.+' + _TEST = { + 'url': 'http://tenplay.com.au/ten-insider/extra/season-2013/tenplay-tv-your-way', + #'md5': 'd68703d9f73dc8fccf3320ab34202590', + 'info_dict': { + 'id': '2695695426001', + 'ext': 'flv', + 'title': 'TENplay: TV your way', + 'description': 'Welcome to a new TV experience. Enjoy a taste of the TENplay benefits.', + 'timestamp': 1380150606.889, + 'upload_date': '20130925', + 'uploader': 'TENplay', + }, + 'params': { + 'skip_download': True, # Requires rtmpdump + } + } + + _video_fields = [ + "id", "name", "shortDescription", "longDescription", "creationDate", + "publishedDate", "lastModifiedDate", "customFields", "videoStillURL", + "thumbnailURL", "referenceId", "length", "playsTotal", + "playsTrailingWeek", "renditions", "captioning", "startDate", "endDate"] + + def _real_extract(self, url): + webpage = self._download_webpage(url, url) + video_id = self._html_search_regex( + r'videoID: "(\d+?)"', webpage, 'video_id') + api_token = self._html_search_regex( + r'apiToken: "([a-zA-Z0-9-_\.]+?)"', webpage, 'api_token') + title = self._html_search_regex( + r'', + webpage, 'title') + + json = self._download_json('https://api.brightcove.com/services/library?command=find_video_by_id&video_id=%s&token=%s&video_fields=%s' % (video_id, api_token, ','.join(self._video_fields)), title) + + formats = [] + for rendition in json['renditions']: + url = rendition['remoteUrl'] or rendition['url'] + protocol = 'rtmp' if url.startswith('rtmp') else 'http' + ext = 'flv' if protocol == 'rtmp' else rendition['videoContainer'].lower() + + if protocol == 'rtmp': + url = url.replace('&mp4:', '') + + formats.append({ + 'format_id': '_'.join(['rtmp', rendition['videoContainer'].lower(), rendition['videoCodec'].lower()]), + 'width': rendition['frameWidth'], + 'height': rendition['frameHeight'], + 'tbr': rendition['encodingRate'] / 1024, + 'filesize': rendition['size'], + 'protocol': protocol, + 'ext': ext, + 'vcodec': rendition['videoCodec'].lower(), + 'container': rendition['videoContainer'].lower(), + 'url': url, + }) + + return { + 'id': video_id, + 'display_id': json['referenceId'], + 'title': json['name'], + 'description': json['shortDescription'] or json['longDescription'], + 'formats': formats, + 'thumbnails': [{ + 'url': json['videoStillURL'] + }, { + 'url': json['thumbnailURL'] + }], + 'thumbnail': json['videoStillURL'], + 'duration': json['length'] / 1000, + 'timestamp': float(json['creationDate']) / 1000, + 'uploader': json['customFields']['production_company_distributor'] if 'production_company_distributor' in json['customFields'] else 'TENplay', + 'view_count': json['playsTotal'] + } diff --git a/youtube_dl/extractor/tlc.py b/youtube_dl/extractor/tlc.py index ad175b8..d848ee1 100644 --- a/youtube_dl/extractor/tlc.py +++ b/youtube_dl/extractor/tlc.py @@ -5,6 +5,7 @@ import re from .common import InfoExtractor from .brightcove import BrightcoveIE from .discovery import DiscoveryIE +from ..utils import compat_urlparse class TlcIE(DiscoveryIE): @@ -51,6 +52,10 @@ class TlcDeIE(InfoExtractor): # Otherwise we don't get the correct 'BrightcoveExperience' element, # example: http://www.tlc.de/sendungen/cake-boss/videos/cake-boss-cannoli-drama/ iframe_url = iframe_url.replace('.htm?', '.php?') + url_fragment = compat_urlparse.urlparse(url).fragment + if url_fragment: + # Since the fragment is not send to the server, we always get the same iframe + iframe_url = re.sub(r'playlist=(\d+)', 'playlist=%s' % url_fragment, iframe_url) iframe = self._download_webpage(iframe_url, title) return { diff --git a/youtube_dl/extractor/tutv.py b/youtube_dl/extractor/tutv.py index c980153..d516b64 100644 --- a/youtube_dl/extractor/tutv.py +++ b/youtube_dl/extractor/tutv.py @@ -1,21 +1,21 @@ from __future__ import unicode_literals + import base64 import re from .common import InfoExtractor -from ..utils import ( - compat_parse_qs, -) +from ..utils import compat_parse_qs class TutvIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?tu\.tv/videos/(?P[^/?]+)' _TEST = { - 'url': 'http://tu.tv/videos/noah-en-pabellon-cuahutemoc', - 'file': '2742556.flv', - 'md5': '5eb766671f69b82e528dc1e7769c5cb2', + 'url': 'http://tu.tv/videos/robots-futbolistas', + 'md5': '627c7c124ac2a9b5ab6addb94e0e65f7', 'info_dict': { - 'title': 'Noah en pabellon cuahutemoc', + 'id': '2973058', + 'ext': 'flv', + 'title': 'Robots futbolistas', }, } @@ -26,10 +26,9 @@ class TutvIE(InfoExtractor): webpage = self._download_webpage(url, video_id) internal_id = self._search_regex(r'codVideo=([0-9]+)', webpage, 'internal video ID') - data_url = 'http://tu.tv/flvurl.php?codVideo=' + str(internal_id) - data_content = self._download_webpage(data_url, video_id, note='Downloading video info') - data = compat_parse_qs(data_content) - video_url = base64.b64decode(data['kpt'][0]).decode('utf-8') + data_content = self._download_webpage( + 'http://tu.tv/flvurl.php?codVideo=%s' % internal_id, video_id, 'Downloading video info') + video_url = base64.b64decode(compat_parse_qs(data_content)['kpt'][0]).decode('utf-8') return { 'id': internal_id, diff --git a/youtube_dl/extractor/vimple.py b/youtube_dl/extractor/vimple.py new file mode 100644 index 0000000..33d370e --- /dev/null +++ b/youtube_dl/extractor/vimple.py @@ -0,0 +1,86 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import base64 +import re +import xml.etree.ElementTree +import zlib + +from .common import InfoExtractor +from ..utils import int_or_none + + +class VimpleIE(InfoExtractor): + IE_DESC = 'Vimple.ru' + _VALID_URL = r'https?://(player.vimple.ru/iframe|vimple.ru)/(?P[a-f0-9]{10,})' + _TESTS = [ + # Quality: Large, from iframe + { + 'url': 'http://player.vimple.ru/iframe/b132bdfd71b546d3972f9ab9a25f201c', + 'info_dict': { + 'id': 'b132bdfd71b546d3972f9ab9a25f201c', + 'title': 'great-escape-minecraft.flv', + 'ext': 'mp4', + 'duration': 352, + 'webpage_url': 'http://vimple.ru/b132bdfd71b546d3972f9ab9a25f201c', + }, + }, + # Quality: Medium, from mainpage + { + 'url': 'http://vimple.ru/a15950562888453b8e6f9572dc8600cd', + 'info_dict': { + 'id': 'a15950562888453b8e6f9572dc8600cd', + 'title': 'DB 01', + 'ext': 'flv', + 'duration': 1484, + 'webpage_url': 'http://vimple.ru/a15950562888453b8e6f9572dc8600cd', + } + }, + ] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + iframe_url = 'http://player.vimple.ru/iframe/%s' % video_id + + iframe = self._download_webpage( + iframe_url, video_id, + note='Downloading iframe', errnote='unable to fetch iframe') + player_url = self._html_search_regex( + r'"(http://player.vimple.ru/flash/.+?)"', iframe, 'player url') + + player = self._request_webpage( + player_url, video_id, note='Downloading swf player').read() + + player = zlib.decompress(player[8:]) + + xml_pieces = re.findall(b'([a-zA-Z0-9 =+/]{500})', player) + xml_pieces = [piece[1:-1] for piece in xml_pieces] + + xml_data = b''.join(xml_pieces) + xml_data = base64.b64decode(xml_data) + + xml_data = xml.etree.ElementTree.fromstring(xml_data) + + video = xml_data.find('Video') + quality = video.get('quality') + q_tag = video.find(quality.capitalize()) + + formats = [ + { + 'url': q_tag.get('url'), + 'tbr': int(q_tag.get('bitrate')), + 'filesize': int(q_tag.get('filesize')), + 'format_id': quality, + }, + ] + + return { + 'id': video_id, + 'title': video.find('Title').text, + 'formats': formats, + 'thumbnail': video.find('Poster').get('url'), + 'duration': int_or_none(video.get('duration')), + 'webpage_url': video.find('Share').get('videoPageUrl'), + } diff --git a/youtube_dl/extractor/vodlocker.py b/youtube_dl/extractor/vodlocker.py new file mode 100644 index 0000000..68c5936 --- /dev/null +++ b/youtube_dl/extractor/vodlocker.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import re +from .common import InfoExtractor +from ..utils import ( + compat_urllib_parse, + compat_urllib_request, +) + + +class VodlockerIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?vodlocker.com/(?P[0-9a-zA-Z]+)(?:\..*?)?' + + _TESTS = [{ + 'url': 'http://vodlocker.com/e8wvyzz4sl42', + 'md5': 'ce0c2d18fa0735f1bd91b69b0e54aacf', + 'info_dict': { + 'id': 'e8wvyzz4sl42', + 'ext': 'mp4', + 'title': 'Germany vs Brazil', + 'thumbnail': 're:http://.*\.jpg', + }, + }] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + webpage = self._download_webpage(url, video_id) + + fields = dict(re.findall(r'''(?x)\s*(.*?)\s*[a-z]+)\.(?P.*)$', expr) if m: member = m.group('member') - val = local_vars[m.group('in')] + variable = m.group('in') + + if variable not in local_vars: + if variable not in self._objects: + self._objects[variable] = self.extract_object(variable) + obj = self._objects[variable] + key, args = member.split('(', 1) + args = args.strip(')') + argvals = [int(v) if v.isdigit() else local_vars[v] + for v in args.split(',')] + return obj[key](argvals) + + val = local_vars[variable] if member == 'split("")': return list(val) if member == 'join("")': @@ -97,6 +110,25 @@ class JSInterpreter(object): return self._functions[fname](argvals) raise ExtractorError('Unsupported JS expression %r' % expr) + def extract_object(self, objname): + obj = {} + obj_m = re.search( + (r'(?:var\s+)?%s\s*=\s*\{' % re.escape(objname)) + + r'\s*(?P([a-zA-Z$]+\s*:\s*function\(.*?\)\s*\{.*?\})*)' + + r'\}\s*;', + self.code) + fields = obj_m.group('fields') + # Currently, it only supports function definitions + fields_m = re.finditer( + r'(?P[a-zA-Z$]+)\s*:\s*function' + r'\((?P[a-z,]+)\){(?P[^}]+)}', + fields) + for f in fields_m: + argnames = f.group('args').split(',') + obj[f.group('key')] = self.build_function(argnames, f.group('code')) + + return obj + def extract_function(self, funcname): func_m = re.search( (r'(?:function %s|[{;]%s\s*=\s*function)' % ( @@ -107,10 +139,12 @@ class JSInterpreter(object): raise ExtractorError('Could not find JS function %r' % funcname) argnames = func_m.group('args').split(',') + return self.build_function(argnames, func_m.group('code')) + + def build_function(self, argnames, code): def resf(args): local_vars = dict(zip(argnames, args)) - for stmt in func_m.group('code').split(';'): + for stmt in code.split(';'): res = self.interpret_statement(stmt, local_vars) return res return resf - diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 09312e8..64a9618 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -775,7 +775,7 @@ class YoutubeDLHandler(compat_urllib_request.HTTPHandler): https_response = http_response -def parse_iso8601(date_str): +def parse_iso8601(date_str, delimiter='T'): """ Return a UNIX timestamp from the given date """ if date_str is None: @@ -795,8 +795,8 @@ def parse_iso8601(date_str): timezone = datetime.timedelta( hours=sign * int(m.group('hours')), minutes=sign * int(m.group('minutes'))) - - dt = datetime.datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S') - timezone + date_format = '%Y-%m-%d{0}%H:%M:%S'.format(delimiter) + dt = datetime.datetime.strptime(date_str, date_format) - timezone return calendar.timegm(dt.timetuple()) @@ -1428,7 +1428,7 @@ US_RATINGS = { def strip_jsonp(code): - return re.sub(r'(?s)^[a-zA-Z_]+\s*\(\s*(.*)\);\s*?\s*$', r'\1', code) + return re.sub(r'(?s)^[a-zA-Z0-9_]+\s*\(\s*(.*)\);?\s*?\s*$', r'\1', code) def qualities(quality_ids): diff --git a/youtube_dl/version.py b/youtube_dl/version.py index d6b0589..4d606c3 100644 --- a/youtube_dl/version.py +++ b/youtube_dl/version.py @@ -1,2 +1,2 @@ -__version__ = '2014.07.11' +__version__ = '2014.07.15' -- 2.41.1