From c91d132b6b27d287fa99fe16fcbfb2dd192a1529 Mon Sep 17 00:00:00 2001 From: Feross Aboukhadijeh Date: Wed, 16 Mar 2016 12:33:57 -0700 Subject: [PATCH] use webtorrent-fixtures --- package.json | 2 +- test/basic.js | 10 ++-- test/fetch.js | 47 +++++++----------- test/torrents/leaves-magnet.torrent | Bin 636 -> 0 bytes ...ubuntu-12.04.4-alternate-amd64.iso.torrent | Bin 30101 -> 0 bytes 5 files changed, 23 insertions(+), 36 deletions(-) delete mode 100644 test/torrents/leaves-magnet.torrent delete mode 100644 test/torrents/ubuntu-12.04.4-alternate-amd64.iso.torrent diff --git a/package.json b/package.json index 45237a5..c0f2289 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,9 @@ "devDependencies": { "bittorrent-protocol": "^2.0.0", "brfs": "^1.2.0", - "parse-torrent": "^5.7.1", "standard": "^6.0.4", "tape": "^4.0.0", + "webtorrent-fixtures": "^1.3.0", "zuul": "^3.8.0" }, "keywords": [ diff --git a/test/basic.js b/test/basic.js index 6fab1e6..31c19fd 100644 --- a/test/basic.js +++ b/test/basic.js @@ -1,13 +1,9 @@ var bencode = require('bencode') -var fs = require('fs') -var path = require('path') +var fixtures = require('webtorrent-fixtures') var Protocol = require('bittorrent-protocol') var test = require('tape') var ut_metadata = require('../') -// Used in multiple tests -var metadata = fs.readFileSync(path.join(__dirname, 'torrents/leaves-magnet.torrent')) - test('wire.use(ut_metadata())', function (t) { var wire = new Protocol() wire.pipe(wire) @@ -25,11 +21,11 @@ test('wire.use(ut_metadata(metadata))', function (t) { var wire = new Protocol() wire.pipe(wire) - wire.use(ut_metadata(metadata)) + wire.use(ut_metadata(fixtures.leavesMetadata.torrent)) t.ok(wire.ut_metadata) t.ok(wire.ut_metadata.fetch) t.ok(wire.ut_metadata.cancel) - t.equal(wire.ut_metadata.metadata.toString('hex'), bencode.encode(bencode.decode(metadata).info).toString('hex')) + t.equal(wire.ut_metadata.metadata.toString('hex'), bencode.encode(bencode.decode(fixtures.leavesMetadata.torrent).info).toString('hex')) t.end() }) diff --git a/test/fetch.js b/test/fetch.js index 0ab9602..b425791 100644 --- a/test/fetch.js +++ b/test/fetch.js @@ -1,18 +1,9 @@ var bencode = require('bencode') -var fs = require('fs') -var parseTorrent = require('parse-torrent') -var path = require('path') +var fixtures = require('webtorrent-fixtures') var Protocol = require('bittorrent-protocol') var test = require('tape') var ut_metadata = require('../') -// Used in multiple tests -var metadata = fs.readFileSync(path.join(__dirname, 'torrents/leaves-magnet.torrent')) -var parsedTorrent = parseTorrent(metadata) - -var largeMetadata = fs.readFileSync(path.join(__dirname, 'torrents/ubuntu-12.04.4-alternate-amd64.iso.torrent')) -var largeParsedTorrent = parseTorrent(largeMetadata) - var id1 = new Buffer('01234567890123456789') var id2 = new Buffer('12345678901234567890') @@ -23,18 +14,18 @@ test('fetch()', function (t) { var wire2 = new Protocol() wire1.pipe(wire2).pipe(wire1) - wire1.use(ut_metadata(metadata)) // wire1 already has metadata + wire1.use(ut_metadata(fixtures.leavesMetadata.torrent)) // wire1 already has metadata wire2.use(ut_metadata()) // wire2 does not wire2.ut_metadata.fetch() wire2.ut_metadata.on('metadata', function (_metadata) { // got metadata! - t.equal(_metadata.toString('hex'), bencode.encode({ info: bencode.decode(metadata).info }).toString('hex')) + t.equal(_metadata.toString('hex'), bencode.encode({ info: bencode.decode(fixtures.leavesMetadata.torrent).info }).toString('hex')) }) wire2.on('handshake', function (infoHash, peerId, extensions) { - wire2.handshake(parsedTorrent.infoHash, id2) + wire2.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id2) }) wire2.on('extended', function (ext) { @@ -50,7 +41,7 @@ test('fetch()', function (t) { } }) - wire1.handshake(parsedTorrent.infoHash, id1) + wire1.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id1) }) test('fetch() from peer without metadata', function (t) { @@ -80,7 +71,7 @@ test('fetch() from peer without metadata', function (t) { }) wire2.on('handshake', function (infoHash, peerId, extensions) { - wire2.handshake(parsedTorrent.infoHash, id2) + wire2.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id2) }) wire2.on('extended', function (ext) { @@ -93,7 +84,7 @@ test('fetch() from peer without metadata', function (t) { } }) - wire1.handshake(parsedTorrent.infoHash, id1) + wire1.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id1) }) test('fetch when peer gets metadata later (setMetadata)', function (t) { @@ -106,7 +97,7 @@ test('fetch when peer gets metadata later (setMetadata)', function (t) { wire1.use(ut_metadata()) // wire1 starts without metadata process.nextTick(function () { - wire1.ut_metadata.setMetadata(metadata) // wire1 gets metadata later + wire1.ut_metadata.setMetadata(fixtures.leavesMetadata.torrent) // wire1 gets metadata later process.nextTick(function () { // wire2 does not start with metadata, but connects to wire1 after it gets metadata @@ -115,11 +106,11 @@ test('fetch when peer gets metadata later (setMetadata)', function (t) { wire2.ut_metadata.on('metadata', function (_metadata) { // got metadata! - t.equal(_metadata.toString('hex'), bencode.encode({ info: bencode.decode(metadata).info }).toString('hex')) + t.equal(_metadata.toString('hex'), bencode.encode({ info: bencode.decode(fixtures.leavesMetadata.torrent).info }).toString('hex')) }) wire2.on('handshake', function (infoHash, peerId, extensions) { - wire2.handshake(parsedTorrent.infoHash, id2) + wire2.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id2) }) wire2.on('extended', function (ext) { @@ -135,7 +126,7 @@ test('fetch when peer gets metadata later (setMetadata)', function (t) { } }) - wire1.handshake(parsedTorrent.infoHash, id1) + wire1.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id1) }) }) }) @@ -147,25 +138,25 @@ test('fetch() large torrent', function (t) { var wire2 = new Protocol() wire1.pipe(wire2).pipe(wire1) - wire1.use(ut_metadata(largeMetadata)) // wire1 already has metadata + wire1.use(ut_metadata(fixtures.sintel.torrent)) // wire1 already has metadata wire2.use(ut_metadata()) // wire2 does not wire2.ut_metadata.fetch() wire2.ut_metadata.on('metadata', function (_metadata) { // got metadata! - t.equal(_metadata.toString('hex'), bencode.encode({ info: bencode.decode(largeMetadata).info }).toString('hex')) + t.equal(_metadata.toString('hex'), bencode.encode({ info: bencode.decode(fixtures.sintel.torrent).info }).toString('hex')) }) wire2.on('handshake', function (infoHash, peerId, extensions) { - wire2.handshake(largeParsedTorrent.infoHash, id2) + wire2.handshake(fixtures.sintel.parsedTorrent.infoHash, id2) }) wire2.on('extended', function (ext) { if (ext === 'handshake') { t.pass('got extended handshake') } else if (ext === 'ut_metadata') { - // note: this should get called twice, once for each block of the ubuntu metadata + // note: this should get called twice, once for each block of the sintel metadata t.pass('got extended ut_metadata message') // this is emitted for consistency's sake, but it's ignored @@ -176,7 +167,7 @@ test('fetch() large torrent', function (t) { } }) - wire1.handshake(largeParsedTorrent.infoHash, id1) + wire1.handshake(fixtures.sintel.parsedTorrent.infoHash, id1) }) test('discard invalid metadata', function (t) { @@ -186,7 +177,7 @@ test('discard invalid metadata', function (t) { var wire2 = new Protocol() wire1.pipe(wire2).pipe(wire1) - var invalidMetadata = metadata.slice(0) + var invalidMetadata = fixtures.leavesMetadata.torrent.slice(0) invalidMetadata[55] = 65 // mess up a byte in the info block wire1.use(ut_metadata(invalidMetadata)) @@ -203,8 +194,8 @@ test('discard invalid metadata', function (t) { }) wire2.on('handshake', function (infoHash, peerId, extensions) { - wire2.handshake(parsedTorrent.infoHash, id2) + wire2.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id2) }) - wire1.handshake(parsedTorrent.infoHash, id1) + wire1.handshake(fixtures.leavesMetadata.parsedTorrent.infoHash, id1) }) diff --git a/test/torrents/leaves-magnet.torrent b/test/torrents/leaves-magnet.torrent deleted file mode 100644 index 7299de5ddcb85a3243076ef0cc8b3148cfd5acfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 636 zcmV-?0)zczF*7=0ZfMk3WHvf%Wo~D5XlXMxGB7bWWi&c& zVQpnIHabjYVRmJ6Aa7@I2ZZ2hTbz(6xI&f)aV`U(0 zWo~D5XlXGvGdMJ5Hac)=Wn*P?G&V3gADll~zU&8=73@_RYoOyyO3 zT{&dM?^V-O&q{90d-1%ldC?!G;JyY~JddjU3@f6~cGnzR0a9xt0DqpDDZa186&_^~ z2{ECxOd-D>Xt@)QkV#%?4ZKzLa^%94OuEk|=CiJfaw*t~ub^LH>aJ?PKL^Wgxo3RF zt?f-a?edYE;3ShjtBzbm{@2GbTBi{;x4Ux+=vp{-?x}aGN$jPc|5)UUs zXWZCl=#GOp#d4r-Jb)W1^%>t&D?WDiaL;P)QxJbWIX8rZ_MG?+rD(D0#XC@8S?P$_ zycUuz5?y!L1J+W*$}n)jZtanBt59tqu2?Ok6JwTAVdl;fv^N3psLAaWAg2zx07L+yXLet0J=Mp) zwY@xb^WQ2|RtjN&5l8w?$In)da5~Eb-4m5BY2#+crl z4Xu)x2?oF>*ug-LppWG2WjH!%Zf0*tVRL9SFgj#1G&eM5I5uNBHDWP2VmM-BW@KVH WGGb#fGGjSpG&D9gH)CdDGd5-CbQ^R4 diff --git a/test/torrents/ubuntu-12.04.4-alternate-amd64.iso.torrent b/test/torrents/ubuntu-12.04.4-alternate-amd64.iso.torrent deleted file mode 100644 index ba12d7e48162b2908851fc288f8e314a66549b4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30101 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 z z*ZdgxiXq*1w0J;hp${T+%AYJtWUQLIm{kHHwlo`Y)A^i`g<q*Ftr!PA5fyIZYGEmjhiaRQkFFZ}TH3 z=V^kCGJ!#6uJJJ=)5HFBn^_fKU#s%BCHsw;*Yg|tbpUI5h|8a^-Bo}sis--99mw=I z9jy@o5O?q@`3(Lvf^QxqXHujAc`^2$#C7B{1C<@ zYY?=RYe5f-Ak`;>dYoBg*J~{|>cSohYe>vW|D}Gfr!Fm_^ca2|2?iKxRGv(%tjF=$ z#GwtY%}U%%zAg86)SAsQnW^pbcHzVyjE8O(w+!_CYpXy|?J9Q~#&-d?0doFee9Spg zJ*$^Hy^6YqG#G@Cz#_E#%TSr{nDS+_F^`Wmc5rdI7mC&TlaDj*Xx+L_7Nx8R{+-^# zlW5;Y9_u)lTFEo=qvsrQI_e3`@ZVGM_lqWSd;{>ma>L~uB=nP@yb5Uw5=_?M?wI%J z?$U$IF5~^$^L>| zl|IJ~G?YH@#G*76!DLn$$@e{Cm0V-LtOt@Q(d_vxgA3611mXd{5i1?E>@^@170x~( zxk4DKalTcY9(MiY`$GTSct8R@?e^jiRF@LuqJ6488cbb(MP6?g;)Fm%_=%KKn8Zu> zLy`fesY+|Xc$FHrbvA#!Bj8OOY{7bch>q^YqSc%MrKOHVA>O9^1f7^PxQp`+|3JC zF--(kVY(L$+AuIWd9Kb12Z%+a+^a%mb}KKm0W8LFc8y(=k@|4E>&FOM7c)z0r&idC zd*O#iz`atBoXI095NJo);u>*c7lx!3K#PMUmQzYFmp|AP5+^4UZ*q)I8>9Hfwc&|u z@g6%dSk{d{fe}{{+}y`< zinQX{1#IZpHs6j>REalBY*)fcX(zuz~MnL729Q{6xMxP}nvT3$#2CP53o_PKg1# zCaDgNR3CO=8WVW&)|*p4>I}?bE>$bu45Tb*v0RGG7D0^p>*FPb)Pv~E3FtaQyDHfy zk&TOI>L9fXH44Wr(tViurq?IO$=Jn+aWVFYTrx%#K_*hZ3LhMB72na#1}kpv;ybDQ zx71$3k#3q;H$KBtFB%mg!5@OsF-384+zox3Mtw57w4lD|q3P3L01KF2AQkpkZ*!3R zV`?`&Ile!(jm4Mfu_Uhbh3J5Du%OWx)%%gS1?TwOJhmj$WWWIsakI0e2Oey()?!yC z-!Gs#o!%AoZrj4|>X^xaZ!G_~d|w zVd+$gr3-NG^T5pa8k+JK+VdULV}aYasTHQU9Cf$O7D};HhN={*@#yhRFc|CK?k&}L z)0m+rT>EHmAo=K=KPRe+ub(;|lH)czaJ>WUw#ap_2G#3LeDY&tjm=?>7q({k+#9(^CkJ?Kr*W2`1A%m?{0?*0HA#(i5?Pt6jeDW&G zR0eh9nxWEiq#*WTdGGSw&UVscDQ5}|3dC45uirce)&LVvlSNnQa|G-^Z(cRVVElv6%zpvCR zicci+@~0)-)A zzl08?>(9Mj3#vx>MpZlnhE&i_h9Y151c-u78k}J$}gFKt8lQ>dAEa?&4b*ii4W>UnHUM5cr`=r*K!Y8?iW1hg#k zj9Nz>@1fS?a)mc^&JBjE8C3$HkS+&{nbnu-13ti@L#6CF2zp>QwqjZcf!oum8af2E zi|BIP)_Z4GN_tiS^wE4!2xqr2ZsylBW{opS2{;NFKiV1y@V!5>C~r#zAz-R;z6~@5 zyIHf<1So=zr-)s^ry7sy;#L3z+3&qhwEj;0s#IrHONeTT0!qt!y%%jlgXFQhbpaz@ z^QOK~pIj;_1>D9w{`?q_=z3`D8-gk<4fF}6r>X>!P~5=P{(H{ARJGAN{B|(GD3da# z_Zt9YaDXr^^n+rDNsO5!f(T+#`R~z`X$*35Uu*b+o>9zEnS-BK3IT`aNYL016I-(npfj@)J$naUEP zy!~rok&B)R6UH4iL|>`qOR`gX0f)|tu4bBAhbC=VGgYXTEpW(!%ECd}ztH0WyiX&& z4qJXP7}x4tm{=sZhaM6o%90Jds2+~4`;sOTGjFQ}BaR89PMpthDhp%&2_`!E_(vnX zvX{~sH5%bEi zuHB3Z)R~~)o(N(k@mYMg+j?&i&U@02vN>)94tV?MEpl!3ns?sfG!)HyGM4vbhcai{ ze}MKmYS~O}5rx<}#TlHfyp4DLi31xMvo%9n z@Toub>NMo{MR0J1cTJO1DYH5y6qgrmJczODbAT%4Ztcr1iG>zkRh%^RN|A^)Rs#It zU5bV5Qx)+lLPYq{7jg%b%mlm0%b%QesbOnLF(QAm*0ggw2^tQP6gGHJsVXmum{^p={ittnyr9ztTh>6e z#egY^cnuxYN}7pR>o$U7<5{vW|2p=?XFk_9(o6$y`fY6d3~XMh6l?jOFz;AWs>n%* zs;aH2zmQ^jSkOhTVcBeHFx-0S&Z`jPyTQ1E&N(h9hwz67F#~NKt|}NRD%oqxyh;E1 zy6Q^u<3&Si0SkX{Qf2H^7M>gD?nED_la1z{VM_FZysmNX&Vej3onNe5%=r(UW!xk2 z`;?=J=b$oIM(EY+M3XI*y&GXl z3x8Y@^Ix0%_X*MlylzIDYY%dqozpum$|nx6Pir)b8~o#UC*@ zNh=Nd^HRqe@uS^Mh&?o{E?W1@>FFXjo)9>NzB%CG;q3CwAk!htj!P9A2y*z~^Yj9a zZE%@$&}EA80+PUa$Ee^E_Oh^^_tp256%&rj;mHFb5S$>Q8%F?iYK^UBd{zJrU z9R6UMGR%n)r;NDaA3f7&*`6lGs4J~HqWR(Mr3tsg^!J)4k$V6eNv8`2DtM6TH(O=# zxv5=GOS{8@ybt@6bBHzQhv7+ed8?*}kc-oh)-(-qml`JN|tFDeXSF)N%GmW{t?uDbk zw#sWa@b~ikF?vGkL+jIL(I=QpVyCvoPK9eMXZ)H9jRJR*io;&oTt)02`0wvr^nK>k z3fPvDzE_{vAY&2ceS_dqv#rFwY~qWf=$txxW%M`xwnBdbtOq1#+zm+FD;8BzTLL&{wPtNPj|Qxr zAc8tou5?!B+9i)xOW)QmjBy?bkgBFzbSd4h7&$GG>S>i1|3Ev3yj!tqaVDi1fD}F6 zy-(A|f2cagH>HJ#Ii_dF%&cIa&|sBc4Na|uum|4XB5jN2OoY24hzp(hKfG4YFC>7A zwy-NG+pNJYK8#CmzNt3}^lf42LI7r1AbLx@kA#lj5&%ScFQ_oka+Ze1VjshpyVS4C zT~PO};l|D2lMZb~)H$?}`o0vxm`v7Rmbef8<0BSDvgm{#PmVqD z%2H_lr}i%Hb_A{_gLxAq^Ws)2g8f?KFWD5>>tZHZEWRfLX*U(;Oev#)_xS7PMwX$L z0&L=FnL5X%tnMTko-UskkMuvH1-|seHi_k1>t)C59H1fjZ5H?C4@mp zxvFkz3*P)A4R4CSO5>7rUt!-G!qJPEWToy*(3DQV%e4T+-L$gcx8#eoXs?_X}PH<&?OCE0rprCwiL?FRo-jA-)_tm+Fc8pM`98Y z1Q|Z4k8MVckfl+&z~q_i|*j{8dWp#n`h@g z6LP8L{%6TJ#=xhY&Q6M|*C~RBy?ZJGyK>U$GU}OTNtKgNitW*$3Jj3VUuew~W7W&= zp&DX>lp^DEJJYi$yEQ6LGB9*zPQeg^Q=Ze>`hgGo%_SR}dA!lCzrap9|0sGFsZR^M zEw?Tl9D;sq(i*JJk5>eG_4`}Fy4fR+?l2U3^fgK0JYpvccyZdvYKNw4VXTUeV zNt&*GkZDtQB6?-?bdi$v10w%a5Qx~ zRFn}maDuwcVlP_b1i5*KHdXMvI5)>*x8<rP?R;mG+-ni<H9j?=$}eb zrn8PET1g0rH}K2Wj|h_i-@0SMAe&T97(2^PxDXs}Ts@fio-GV0p*OENi!%sn)AeI& z+nEYLbc~gh3iQnG*1CD}nq7=t0EZ?tUjS1Ze+@qKLj&DqP2%XMsx`*dn?%U|>dKffT+ECrc) z6$0G;3n?D&jYx32vMz-uAvdltIE&OqMx!~+f+PZp`%ES7c9`eEhTwRH2 z0*t}P?aHbeFTE>Zwd@+?6C!R4!GXoZI5xRW0oMX9LT>W%J}Nvq$iIn<=iS^wuLh8Q zo==dxJ`U4p0x01GVMr|tNF3dKKUyW=!`5M&Fe~OR#h0rwkh$g}Z<<>Y;RQ_7O{?K> zpwi(9&GJ9d6=H1Iu8HlPRp6gDF1d{MfQ3ywcKC}FvkG)wJQnfffw3H)H-fe`JLhj8 zCU0nt|I=+5ZQOwr=HyPwluu&l;kkO|r3%MJU<@;I_5X>Qf&jO3He#Y4%}quy3V*PR zw@X|R9KyE;C*m#H61De!@$lJ#kmU&jBUCe9iCT*oJ?P*>4K}!5Cricbd@g#aKU_|ebRre zF1&+QUs>xJEP3OCuiwc4d-o7kl#;L?}eD&bc-?apU8AeS0Xu z{IWRts4k2k_K62JAldasR>#H>oh><&3rxLw>TVj!b>6YFZSk;QUEnXgw?ltB_Ikh9 z_6+BIG6zxoKfLuEaN}P8ay71<*y{eMWHXka$uPv6GmuWDMk$y!(rxKZZyl}4>&;;~ zzVOR$9?_uNCNn=q%^~Weda7R5sw z<(KOwXj@^b7NlS5djKS5Y!L%WMhqSWvw+q9NC@{NA`YIFcVxAV=dI!co@2Q|X7C5% zrcSd|9UR&H@JKo#y0c=y3Xb|HfR7lHJj*R4*YUHOQR%@WCl3Wx^Yn1N=F!u`md6hd z3KM=WzF@knXVG_2n_TE`MX05)ecOWh*^-2O$aHvZdQjiq*<;B*H%+nHuc}T!x)MsT zm(zEck7^f%jFx;CSX-kbs~;XrV@#0w+$iW&Sb~QiM?Fm>y^T!D7;2mJ!Oh_MkGxIq zd|eA{ON}sQIB2$*A^I#b?*5dO2sSgz9m&f-*J4WRqaSMbUetYx-=4#8-v<+ZQFq9& zqv#0KryHnc`doDgm}O0-5}0-*D|c_0wZ)FC?oE^T zd$HLUFju-Ox6F_eA=Qxh8o%R?oD7|#Nn%PYU}{l{#d0~#Kfb+3+QKZnzi2O9*e$P=j z@>+78-4b-hIeJzSeQZGfC=y1Iu$4#R*J0r*kGR4XCfg?I&g}=aD{CT>! zm00G1-*i45rGBbEMs|ZvLDR0A5WM8M7q@;NMK*|)D`Z_(pH=gN zNFr9VwhD~nJv->(T>3;4I`UuWqma~&pT?``KKCBl^nMJybPlwiEqt>rdEA$lThR3p zpWo;;VzV>YL&d*sz8OTrjUUA{Rq3P9P7QcYac zLC0B=rC`@@<6`XjCjkQQSjSLzwP{FP^ku@&t_xI4FAGr4H66%$3f=(+M!ED;2>oA9 zVx~HzU1QM&U*Of5>5_1E!MnVHX|u{vx5?Lw^L|VyM0}sWq;}Qfi3}=G#h}vdSR$^x zG45KHQgJ^)804G(`oS$L3Gusbypn)YC8sOxl(X$)kDVxA*-d%yKB!Q(qdj zwl2a&DBEQt@3&C}ssvKy0-!1kHpRNG*qyl%?x7nHhOEaa$KNoDB&nK|k(NCBOt>y) zryP>yR=tdcx{Bk*Go0D*6W3>*CW zufBO}Tpgx&?QoRWUoUkSLI%|=7d~-k&Yr!`JN z&z{<02KTWC5t16k5yyN7L1Y_XU#-aI692M3_(8Gcx+yxweBPTOAz~bQ2l9uYR{36| zwQ)AatoDm6fp_yFJs~amz7##7>tLD%fQH@tU#VuwuiSA&0vcp(yO{~z2EPJ^wTd7* zP@#iSrK=?NGUHAK#A6jDNVV+i!+k9}k12CDU#qZ`%?ebbl!maDW#xs~H}Eq|6IIyh z(0g1{!gSX6Z+D#(xRcXcYQO(Hgjd_41l>iOr(Ztdt03JInf80FNuF#$H3V~j#qPYv z(BY!(=~4ynIud?N6QF{bgk&D9-GH@=Ebe`1%OJR$-4i;EhF3Cm7M`5!=(cikeV$p( zTqt~6&{L{ja`HhSK-M%O!Q9KUYABoZ#absRN04 z#C2HSI*xAjk-86!c-hWZ8Ass8)4w^1FfJhp~&OUJ}fq43iB`C2c)B z{sch=YN`j6P@zzTH?relQQ2`cNmjeYDVc|wFAE&hSCJl)4>s{xOfG3P%nQUuM267E zu>`r+L~XT?mLJd^TyAqEwwofmuH^N2@*|Fzfe1)=0l>^RbHH9KJC6!LyN`Tq8SCi& z#tgLRJq5zf=1_#mztR{O#UsC}uaH+?A1S@<1_Xo2UlgO}Ei6*ZL{A}bZ4#t+2lV0o zZVLvcy1RcRhiEyL6t6KE zHh)+|wI&ih7ZaIf;51O5IQ#YMIbZ2j;1{BCQ^AnXGDuPQ&4U9^pCUTHqSJA24`RFa zTaUH?t<`~Rq0@}IEv~Dk54Rfr0&5B~ai9U(K4m-5MwC|;uNJK%D8wcynF3@2a`;xe zKF#`w>JL%+N|(H#aeV=-2agFpKjf66_qHcP?~3mJYLZ_FCas;KxEk>Ed{0a&c{WPB zBF5MJtP}i*cM9Ga3X$g})mY@e&0Q3O`o*VJICutDWZO{5&gPsVr^ytP3Inns5woee z4Z|rc5-%A#tDWI;-Ir!4;f#r~^wB#$#absRB5dAGYAuTGWbEz8QJE!nlUR<}RBgz_ zNWTK$7Iu(*mCy<=Be-KM&$-4h<8+$eYYndZt>o>T8v^gP;f6Gj}#t z^eP?!TFtV>%=$8N|Bw*zxikVH9VE*aKdlj5VPYqz)}}qKMlUs_H6E7 z{0)^sPj2JP)pMU%(%<-8vCi_9atCjoUA*l8jemxPVD&vx$q%dda4T6O$k1l@^g#)2 z-tPr(`(p|9(Q6d$$}mcj8v`ZulRfldzg{uqIf|+*LE7A)c_ze76Md*{q7T=85s^bK zjRNCk<}*o$4Kk-^XPb1;WnFm`Xbr)NuUMGXCXQ0bJ}f9!6$&~i^O3E0UDJ+|VrxiX zPk(MS*?){W33#%6??Ori>Yl95$wYEp0feh!2W|OGC+!)(WCeh?iKLs6x^PWgC?-j?L(-LWet6I7_`fg_Kcj_$l_}F zym4WqPyCT9V!ra%(gvHBHND?E^q<$+OcGr;+)j|GNAeGAK)xMkrI&dc5?Lgo<#1#H z3FfMwypE^IruhUt|L_VBSrp&jnbT|*4(U93!})xXMmqlm>|Lj-Jt$OGiP%j#C_9QKkcYl$lS`16muVhoj%~)+B z{04Cq?E90>@w%Gt5aZ;}zd@p4vL2%1G&-Iy80J8t}R;KZ%C?U+Vncst=QEw|9tr!rp ztuSKQd){($@SSCb)NjE530ERXGaz=YoH1MbK(e*Dc)>%Wf1uc_SpBgYH!@a_HlSJ) zli|j=cX$I)gGuq{PFOdf-4U%|UnDcbk{NY|J3{A-#EPakM74t-4u&a+0ba$+MqVZDeIBd#O^58=obciy;s1Uj1!NWJD(d zN3qiNjTympmxu&Z%!u-fmCe502AaY76(&b>qn}yV8?WGvlDblC1=a7r@Q;NqV1Ozn zo3J6)AU@?3K;pp}JV)ySk3tPv-oB;8|lF`!N zSRjin#v@q1(YW$X7 zsfUOM9tS5sy+x|S5NaR+R%QoeiC+Xr+GqO}yP-OurY4w_%)f6E_{3Uo>l#DM_&ew{ zkJnlevTYwd)7wZpltrM9fTlY`e7hUb4~h)mM<0~8XS_0rY^M(lI6^(TZlAUoH5Ocg z$(rSFQI=w5uqrOd0}>As{m2jpbN5kDd4RjblrDg6`AY#MqOses37Dd$e2??+3N{!Z zHv|5@UCeUNKL6KW!ofrR8_lgmHN*HrZ`hI=j!+tdBT4c%As=lLy)Vv+x#ft=VNfq9 zJ$({8i74M#1F2k_AQJp|)ag>x$$d2{w=klhKy{ec`A(l6K1sw%bE)+{J_orGV+J>F zg_x=_sj@Tli;|pyNRA2hXlE=OZDt*w1!fQ`FzzNdS?iFoK$3s|W5-#8Y7Rn$*HJ@= zFMwu?e|uSEBh|M;RKaWb`rBkC!4I&gr0}8nMqDf-uJvf5GhB(L2DfYG9}L9;}axgS5m`AJ7GlPn;yh>AM=t9% z=y$FHSG{uBETq*kg}Ni4?KlNMs9jJ$pzBN}Yk+7V#&0bTOb=!y@I08h>;a_)W3Gcs zR)(v2B4aXy70yk!$9;BNAluTx#j^`|>wJP&pV?ZE;&WNz=0OD1d#Q<}&CL%DQ<%-A zlHu$+c5SF8^ZiXHo{S&r`Lm`&&UsK_Bsa#%na(#}v_xxqOe*R7`3#POlL6uWH#jQt z>xv+ht4aB~G>l&XH~lj%4_p#nhZ$xP(EEG$O1*Q2roIbnMIM62AX%XL?{C_|E4vSk z8h8z!NldU(PI?j%@-}f5WxSExfx!Tq@j*$-+q(d|lbrnCLKN6$g%)j~H)WF=JM9Yg zDa*F{YmVa!G;&y*Zvr(0ETmsI2~RNOnlz?_FT~_`m=5Nj`S;&mLwg$u)u z_*}0HEU}o@pWkwb=wB++vAyni(S)GWEybP=9mfVht4(81PDn#Fu!T@J-t%URUb8qY z(su$MD0F-`G_t%WfBYPuwhQJBu=7g)an69S za4EnD@}PDQEsu6T=GKz1=ALKq%$*y-BFf05LFqc3stk;x9|nfHVW4P3R0>(3jLqs) zvIiJU!K_mJBW3T;X-$fN`hz#0bgbNH;X;xH3%1~YeZWYqoo>No$k`+c%YRA z4@^>fiXs+aVKbD}FEg-qH5weovNI;V{s{LE%871Sr$;GQcf-TIxBCxqAsfR5URVuwu}B;j9Ho?M;SR$fYl%GhUk2A zc3Loh7(<0vqOi1nX_wS4rBsOQMK3M90dBmwY?PZt_ya@eQ%WS z;HC5+X3e=STqgT!Vi=oU<@K-`Q1atz{am;(!(2P7xj5y9=C!E7nkBzdJl)>h`r-9Xy`Ms zMLGQQ+<s){b=3nPAt{!?GPP)iE!-cMp4Wtb@yQ%F^or%iijv%Qu*N7wE6p`Ez z#_-&|VTKS2lVUt>X$BS-pc-GNaiarU34jsSE9@BkLGjJS zC}y$FDw13qRKQy;p#q5bG=^5PJMDps7BCIJTClaHMLP-!ae%s_Zv6}S;nK?D(cz9O zv=q(X0v_jGQ(WQoJOnEKkKy=VgecG!Gk`Nn|5Rk!{z4;oQ`@s?#oq&GfP{@=*m7d> zpk-*{Vab-?pSYkhCM78#xsJ5PDBKj{kXbt zv-zcxtKqhB2#B`R-7de~tKsCJ9Qm22c%kgOQ`Ri1Qg$nYC+wmEgPYfmp!T%loWEtHde2f^1@&sirI!0*`F)BL9@nMY;K)pthxp$bU zif6>-Ri%yLIqo$xC>1FB%Pv&anR%{eG z66Ef7V{Djb*dRA)v!-5f9^38LQ_X^r3@%TeFO6`;>@ zaKSuYM0l~Ubkzk1F?1tM5##dVb!`P$@4A>BM#NL6&OzN^=ghbIlBH65id{M=Q zzgOFS&;`9XC(8ZRegBFic=f0m=v4f!6K`upb5_caj3qu$9-?Vw8@Vn9Yw7qWVwla? z?hmp>jNV#7uzt;D(3F2&1MRNusgcNxXo2B$O7}upHH*L%G~<1VXY_ocBd3tBNOEsTXVra1W}4om?_@Wv8E~5_mc~Q+?H$v zaf?|hJS#lxQrf358#o=Ko-XENCx22SQvA0CIG@^FQMKm292tM%I>kt0okGl(jLklE zJT0KHAaoinHeA>D>WM92+Al2TYW{4!_$0~!p^d03n_SdTUZ%}!El(}4KRP;m0kT99 zs9EV(&qbl(FAn{Fp5X)8`U1n*+$*{e8OA}3DXWqsFp@CK8A|L`-_RdLGUXNB{qS=q zjh zrXY=h?Iy#zFE1-Y+TGK7%7x-YyW-I&--E}cF8 zk-*0mDI&W>YAaem$oKCq=xl2lO2BI5T0dI2_mZs*WQCi_g#T^Pbp+qHPY_pq*_((& z-B|U|DlV|w=aFXTW>qm`fy&avMr^*0?w$!C&ufQ0CRm^RL-xm7q25FBt!-u0PbOo-6EqF%pVP+1Bpp!Og;9 zK^+EcCza09k>Kue!Bmte44zpu7bYzsoH#j1vH>NUs<+h>wFEfYl!LwFEd_{mUdz@o zh)r(g_2xyPd|TQ>J9!ZIPp*)NzqMGGM{$}4RfSmw-6*Fm$}(8mS%uPHVKpW7Q^==uELNN!|OOIMs8hG3{sTOt=p7Egj*uD#N5JWZMl9DrSHuaL2{5-=JNzkV`=?>O^_V9Pnk7Z6!Q4Ynm zm4rGJL;^|cBFZ}vgBX97t6>N72$q$?8*v5Cs!>Ddqqo(FOe)HoGoAi|po(g^s@09! zS1v@C9(GrT^Rnf+jYjB^3CLPv@L>k2c(gAx{oEmDs|(?AMU-MkcQm+rpau^r z9OeUq^z5!!CXH|L>~pCuZ?w}Z*;HMV+AJhCUvP2C;>=I`(LPEJ zaxSwzSUCe}z60%wknZP~`?F|-!?=T)&#b6GkW*A2x1w>uEj(6ULQ`;PZD=dy|C^d2>^~59&df(A)^T~WO{c9TF5ByA6x)Ur zR4bN~vQXQ9VqOA2zq~Yhl67&~+m8TbU{I*-I zNkLhH>`w$Jln=+lmPys1BR1y_13I|f(J(|P_X)${_Fl$7H0Ry;W{(0w5)lT>m}Qww z=22-PvCx zR(Ot}fn+#9;6~m*A$ClQ>wOuz8$TESj;4b2ywi%adGqJHQ`LzG#YIsNL!7oCPTLau8CJ8Sr)CG6?98 z6f{{hF3+}Rq-llq>L)Y#MA9gfjQ)N{$FSy=;v|Jp>hy3TL7(%iPNkTsP7ecdw5PVxq5P z-p(*yti?kq05Nc*HAp{Lu1XNAf+-&S^KWU~Byua4P-$g*_sNsGej$H}!sJ>@Fcum9 zw(rN+*!~KxlvRsQ;-gcw_av`jU`d;7fr*9eM0#%W`&jBaYN5(qB2M>LYd1HV6P%A# zaP6`eyZ4bJcwDGg57Y6Z^sHhucAO1H6$cg34-#=NTX7@_$6WT;`9yaw0y3&%4r7@~ zJf3~-Wq{nmg?DOOwn;ot9b^+>s9b6OXa+{m$L6xa2R*a|Iwm6mDsK1bY@MDiE8t|5 ze2}_J^fwri5U4}$kl;^}rTev7?yVA;(ddNq(fpVt78>sOpTcL-cD)7x{iMvturZMu zYD+ONjpWsqp9oyid(~~(fzZ(!1E+?=pfwk)`(v@!2F$O%f8!<&L`7@(VidKn;V0F) zhgZ3`grbKYY;WqtQ%crRB!n#63(v$SyV zhAEml{BY3F3@up}I@Hie-HDKS@o=MMV5(cYBhxJbik)y|2+9vv!U zEGFeUgVM}P4&Kkf=8WM{8yjNPrjS_`XYf`WK$fh@f25L6v)3UHm`}RRLq)z6!>Vv| zfr=)^He+>kNX6>X+HC$t z)FgqEcxQfC1fL1GZ)V<*$ftmTdkU#9W%agIifXc_3^$aVNEz76&f1@>Z5R` z0bBDajKM}cOAa6VrUH-D1*FN6&6Ci4V-&#f7#lb@QX1fATxdR z)yfi48D;P@JNNpORxMCJcik=(fG%bn4p70C|9J05&pO3+zEkfn4uiFr>e&29M@;&M ztBer`c;{VM+#NGvEw*KdGne^h`RA8KdSvxz|5`eC@820>L_WQH73-SQ(3YKN1hV(? zGGG!41cs_yx#FAxCYwBNN#IMsA|2-W+;G!H>tN9c0{)UGTFrZ~As|xgb%ZV+6f6zg zdn48>dU2TwQ1TUhhQNB0;y(6NO$6`A1eC{80DXQkLFYGIRCg&jk^#lAjF{4>-78E8 z73pPG4D9m&WeaVo6irSi_Hz1-t29dvG@pU0JvWIuX{ZqNbAKKv${E~S+Tc{-oL~rI zdsm$AxP^NpuiIi1^nyTw+M$#oMQ<>y;t{|I64kSYjrO$zmR`gsQM@;E(lwY9pbF z28-gg$bI-{1;?>}`Bs*VNq_hxOR56E4V@iSr1KypQCvNeOCUGmX91G4YhSp@9L`GC z!Q|#UENg;F*#A>$8AApFrT2ewaWF5(bO?sIJr^^OKSSu-WgPVbhroB3DzKm&@(x5~ zmgUjJ=GxuLFFiQ+kI(U*wlqf@9nC^3l&r~O)e0sGbISECDh^V2TNJ;fOcZP%q`J5N zwNOAVN`5ySm!Ht+oU}snb7Zbb`b}y${H;Xipt1WoOaC(Pm_Kwa)0kF8Ik?Emhy=&Q zg<40gg#cOk$V4oT$5xp+aQfsAVGKLliGEIFos?)M*&?l2dM?0C2m+0;Fe}?K^R$i331_4}Fdi=7zrEY^ zECSV!C7N(Om}Bqylp)4hR_REFMTovF25iS|1QWN&EQTa}KmnoJYu#|QNVAM2sST9Z zNjF8^v937OX2RAnZBn#Cati0rB|JN5phcVi!RzWm+v*?i@EcmPA_}>~^n}mI>e*v4o1{w7M@e$}`?B&N1;n@s z3@sR`M8;B05HqQaj={>Mi}_MI{;63ok{a}E@uFGvW@AK==M8$fp0#x&8b$iD>?-(i|*w`J|I)!YDuY#-=-dAWGl zIeJ{kNG*u?7xsgp%kbq-bUix}iR8upAB~<$qS|Djk~2`ISG<;h6z+S2<-k}(G9xqw z;(pTC`!AS(!qqMG0hFmL2Yg_O)8mBc7SD=B+E8%&$v@KmoZI#bjbg~fH3s{7oIfEI z;#JqKc|pxn8~EpPY)0Y?SsM_LnRKxko|h?fcvJJYd?$;zja7+5(`mARgC;NI-2Hf& z1sM9Qte1|2UeKGYeaj>2%c(qIj1~aS7ZQv^%~fB2L^tlzQcIs#1Fe02XWIFak>&O| zs$zhrqrwfYRllk>O!ynTslV(#6=GB*pCdwmj~JD7W-SLZGLd~Z6o*KHrA&lUWSb{; zTzKlIh=^2imEy6L%mV+iZ=)Q|kHd)HQ&`#U7E9&8tq2w`b_cWe+aA zwD*2{k#~UIq>ppj3X#hlmX6Kp2aYx-M(ywc6ud%SVvWZ{(ciB&~qDxj+%K*2^W_Of@7z z$rj__#<1{^s7UXq?q)mPWL*DDnf1Ev`ZeR57Iv3S1qKe`K!plooCCE0cPgZ5-HQPwi-|o3lFZ~h1y9HRd2#`OZibL|U8xLcuCRQ&v@?7d6cm8p zFMGFL33A8duS^F@^@yI18*{l(qJz!$_cUVg+k0&dFO5VYP-12}Y&v=)(C1+9vv!UEGFeUgVM}P4&Kkf=8UiQ)MM3X={(IRW6h-Qe%SLU4x(jc!-h7c