From 8afb316399d6dca764d1b329a25bd0ef0084f15e Mon Sep 17 00:00:00 2001 From: acud Date: Thu, 20 Jun 2019 12:21:07 +0200 Subject: [PATCH] docs: add initial stream! protocol specification (#1454) * docs: add initial pull sync spec --- docs/Stream-Protocol-Spec.md | 160 ++++++++++++++++++++++++++ docs/diagrams/stream-bounded.dia | Bin 0 -> 1953 bytes docs/diagrams/stream-bounded.png | Bin 0 -> 32051 bytes docs/diagrams/stream-bounded.svg | 105 +++++++++++++++++ docs/diagrams/stream-handshake.dia | Bin 0 -> 1308 bytes docs/diagrams/stream-handshake.png | Bin 0 -> 12616 bytes docs/diagrams/stream-handshake.svg | 50 ++++++++ docs/diagrams/stream-no-roundtrip.dia | Bin 0 -> 1613 bytes docs/diagrams/stream-no-roundtrip.png | Bin 0 -> 21490 bytes docs/diagrams/stream-unbounded.dia | Bin 0 -> 1966 bytes docs/diagrams/stream-unbounded.png | Bin 0 -> 33677 bytes 11 files changed, 315 insertions(+) create mode 100644 docs/Stream-Protocol-Spec.md create mode 100644 docs/diagrams/stream-bounded.dia create mode 100644 docs/diagrams/stream-bounded.png create mode 100644 docs/diagrams/stream-bounded.svg create mode 100644 docs/diagrams/stream-handshake.dia create mode 100644 docs/diagrams/stream-handshake.png create mode 100644 docs/diagrams/stream-handshake.svg create mode 100644 docs/diagrams/stream-no-roundtrip.dia create mode 100644 docs/diagrams/stream-no-roundtrip.png create mode 100644 docs/diagrams/stream-unbounded.dia create mode 100644 docs/diagrams/stream-unbounded.png diff --git a/docs/Stream-Protocol-Spec.md b/docs/Stream-Protocol-Spec.md new file mode 100644 index 0000000000..4c4b59e20c --- /dev/null +++ b/docs/Stream-Protocol-Spec.md @@ -0,0 +1,160 @@ + +stream! protocol +====== + +| Subject | Description | +|---|---| +| Authors | @zelig, @acud, @nonsense | +| Status | Draft | +| Created | 2019-06-11 | + + +### definition of stream +a protocol that facilitates data transmission between two swarm nodes, specifically targeting sequential data in the form of a sequence of chunks as defined by swarm. the protocol should cater for the following requirements: +- client should be able to request arbitrary ranges from the server +- client can be assumed to have some of the data already and therefore can opt in to selectivally request chunks based on their hashes + +As mentioned, the client is typically expected to have some of the data in the stream. to mitigate duplicate data transmission the stream protocol provides a configurable message roundtrip before batch delivery which allows the downstream peer to selectively request the chunks which it does not store at the time of the request. +When delivery batches are pre-negotiated (i.e. when the client selectively tells the server which chunks it would like to receive), we can conclude that the delivery batches are optimsed for _urgency_ rather than for maximising batch utilisation (since the server sends a certain batch that potentially gets reduced into a smaller one by the client before actually being transmitted). + +### the protocol defines the notions of: +- **stream** - data source which is composed of a sequence of hashes, referenced by monotonically increasing integers, with unguaranteed contiguity with respect to one particular stream. +- **client** _(downstream peer)_ - the peer which is requesting data and does not posses it (client) +- **server** _(upstream peer)_ - the peer that has the data and sends it to the downstream peer (server) +- **range** - based on the notion of integer indexes we can define a range that designates an interval on the stream. +- **batch** - a set of chunks constituting an interval in a range are called a batch, with a length not exceeding a ceiling value negotiated when establishing streams +- **batch delivery** - end of batch delivery should be indicated by an explicit message from the server +both offered and wanted go together - note this +- **roundtrip** - a configurable extra message exchange (negotiated on initial message exchange) meant to mitigate and avoid requesting the same data from different peers. when the roundtrip is not used the stream is assumed to be continuous and the order of delivery should be guaranteed, or the stream should be particularly ordered. A roundtrip consists of: + - **offered hashes** - from the server to the client + - **wanted hashes** - at the discretion of the client in response to offered hashes + +### responsibilities: +- client is able to request a range but doesnt know how many results the interval will return from the server +- client does not know if interval is continuous or has gaps +- range is defined by client and should be strictly respected and followed by server +- all intervals specified in protocol messages are closed (inclusive) +- when roundtrip is configured - chunk deliveries can be handled concurrently (therefore their order is not guaranteed), but a server end-of-batch with topmost session index must be sent to signal the end of a batch +- when roundtrip is not configured - chunks are expected to be sent in order, one after the other +- when a client requests an unbounded range (i.e. FROM=..., TO=nil): + - if there's no chunks available - server waits until something becomes available then send it to the client + - server's responsibility to give as much as possible, as fast as possible, with a limit of batch size + - one range query should result in ONE rountrip + batch delivery +- when a client requests a bounded range, server should respond to the client range requests with either offered hashes (if roundtrip is required) or chunks (if not) or an end-of-batch message if there are no more to offer. If none of these responses arrive within a timeout interval, client must drop the upstream peer. +- the server should always respond to the client + + +#### stream termination condition: + - timeout, connection died, we get an error and remove the client, server also gets an error from p2p layer and removes all servers/clients and drops the peer + +### considerations: +- server must make sure that chunk got to client in order to account in SWAP (synchronous). if the send does not result in an error - the send should be accounted +- there is always a max batch size so that clients cannot grieve servers with very large ranges + +### syncing contracts: + - stream indexes always > 0 + - syncing is an implementation of the stream protocol + - client is expected to manage all intervals, and therefore: + - server is designed to be stateless, except for the case of managing a offered/wanted roundtrip and the knowledge of a boundedness of a stream (e.g. the server knows that syncing streams are always unbounded from the localstore perspective - data can always enter the system, however this is not the case for live video stream for example) + - the server does not terminate streams - it is at the discretion of the downstream peer + - the server does not initiate any messages unless instructed to + - the server does not instruct client on which bins to subscribe to it + +Wire Protocol Specifications +======= + +### The wire protocol defines the following messages: + +| Msg Name | From->To | Params | Example | +| -------- | -------- | -------- | ------- | +| StreamInfoReq | Client->Server | Streams`[]string` | `SYNC\|6, SYNC\|5` | +| StreamInfoRes | Server->Client | Streams`[]StreamDescriptor`
Stream`string`
Cursor`uint64`
Bounded`bool` | `SYNC\|6;CUR=1632;bounded, SYNC\|7;CUR=18433;bounded` | +| GetRange | Client->Server| Ruid`uint`
Stream `string`
From`uint`
To`*uint`(nullable)
Roundtrip`bool` | `Ruid: 21321, Stream: SYNC\|6, From: 1, To: 100`(bounded), Roundtrip: true
`Stream: SYNC\|7, From: 109, Roundtrip: true`(unbounded) | +| OfferedHashes | Server->Client| Ruid`uint`
Hashes `[]byte` | `Ruid: 21321, Hashes: [cbcbbaddda, bcbbbdbbdc, ....]` | +| WantedHashes | Client->Server | Ruid`uint`
Bitvector`[]byte` | `Ruid: 21321, Bitvector: [0100100100] ` | +| ChunkDelivery | Server->Client | Ruid`uint`
[]Chunk `[]byte` | `Ruid: 21321, Chunk: [001000101]` | +| BatchDone | Server->Client| Ruid `uint`
Last `uint` | `Ruid: 21321, Last: 113331` | +| StreamState | Client<->Server | Stream`string`
Code`uint16`
Message`string`| `Stream: SYNC\|6, Code:1, Message:"Stream became bounded"`
`Stream: SYNC\|5, Code:2, Message: "No such stream"` | + +Notes: +* communicating the last bin index when roundtrip is configured - can be done on top of OfferedHashes message (alongside the hashes), or to reuse the ACK from the no-roundtrip config +* two notions of bounded - on the stream level and on the localstore +* if TO is not specified - we assume unbounded stream, and we just send whatever, until at most, we fill up an entire batch. + +### Message struct definitions: +```go +type StreamInfoReq struct { + Streams []string +} +``` +```go +type StreamInfoRes struct { + Streams []StreamDescriptor +} +``` +```go +type StreamDescriptor struct { + Name string + Cursor uint + Bounded bool +} +``` +```go +type GetRange struct { + Ruid uint + Stream string + From uint + To uint `rlp:nil` + BatchSize uint + Roundtrip bool +} +``` +```go +type OfferedHashes struct { + Ruid uint + LastIndex uint + Hashes []byte +} +``` +```go +type WantedHashes struct { + Ruid uint + BitVector []byte +} +``` +```go +type ChunkDelivery struct { + Ruid uint + LastIndex uint + Chunks [][]byte +} +``` +```go +type BatchDone struct { + Ruid uint + Last uint +} +``` +```go +type StreamState struct { + Stream string + Code uint16 + Message string +} +``` + +Message exchange examples: +====== + +Initial handshake - client queries server for stream states
+![handshake](https://raw.githubusercontent.com/ethersphere/swarm/stream-spec/docs/diagrams/stream-handshake.png) +
+GetRange (bounded) - client requests a bounded range within a stream
+![bounded-range](https://raw.githubusercontent.com/ethersphere/swarm/stream-spec/docs/diagrams/stream-bounded.png) +
+GetRange (unbounded) - client requests an unbounded range (specifies only `From` parameter)
+![unbounded-range](https://raw.githubusercontent.com/ethersphere/swarm/stream-spec/docs/diagrams/stream-unbounded.png) +
+GetRange (no roundtrip) - client requests an unbounded or bounded range with no roundtrip configured
+![unbounded-range](https://raw.githubusercontent.com/ethersphere/swarm/stream-spec/docs/diagrams/stream-no-roundtrip.png) + diff --git a/docs/diagrams/stream-bounded.dia b/docs/diagrams/stream-bounded.dia new file mode 100644 index 0000000000000000000000000000000000000000..7afc275ba99d984aa5b192e1f68359af215d64a7 GIT binary patch literal 1953 zcmV;S2VVFeiwFP!000021MOX1Z`(E$efO^*+?Ne-8GcG))1+8eY<(C|VC}HSfVOE{ zt1NjEoy0Hu?IR^6@rRT+mL*gGU9^Q1iif1{Jv{f4V%~qaUq;|orCFH7S3?ZZ5U6;P zOv8A7HT>(_Z*PO)hwH)nX(->Bzw=Zsfq5d%?A6t9q4nzB#l_v-9gH@a)JY1Xa1Aqc z@t=$$d0`4&46g?OY*#RqTH1T%U8!{%j@Md&ST5Doa4aX^=V`Kzr^BLDS#FXYGgh_oKp2lrTf(`S4kF{B6_nrC{k08{dcQO zSt>Jy;`#NPU)YD)`YNv;3pt$0%pC0DxaH_Hw%xt$zO-+lk*u_huzF+Rxfhlh7P1ZR?BsVH8 ztN-{kO@s0aE*S^Ni4JccuC~S`8ULduy6o&%E#s+7r{FF4BaF>ck0QiKkZ^i6{DO8z zYrlV{HbaC5!?j8tZHfdV0)3xRe}51TDWnczJl+RLO&?@Dk5mcbLmmijkq9H+B?%zK zl#B?6oDzN-@+67l8x>FU&b+pZ6{UP=TgV|J=)|#z*UQOjzadrL`RAOsiy^4MCszo; z;e1iqhHc{w(C&vd1Kl;jW6kgsqioZ?)GE#gVFIDx|`NU=DNR&z`@H)4+&6`wD ztF#kBB8@eI4|9HKmyrsTf|3NJeWIkVDmA0-D5-5qsx(B$Nk1|t)x<5dF()C25g### zP^+YbAmV&Pp~on>H1_9VFEFUo^Mba+mdYMhIt6bw5-x6Wam(-vYwVK5urm_ISqN{{ zCrcaxJ@2vz*exhSeUJ*jEB&YGi*jP2b+J%wj!rK0P%iK@gfNr}JQ5Ilq-DWC0zyXt z^jScBD;cOweF_uG;J|BJGt_jmQe9BN@{&$AIN5NzZ15VpCWg%8!gvgCS2mP5J`_ea zc#xnR)bE9C_%fTRR82q2Y@srz9a`58)i&w0Ll4uRe&h8R0t1_kWT#J+$1TZ}I23Yx zi32DCbKyac_ko}=1jWJ(NY%eJ#F@)@~)ceKl8Y=8p4v$a&%n3rC)v0N)z!A>1RZ-DFUKg&`uyBR1>|d_M;#KEmq8C}&|sH3bNCa*C%17}fg8}M1RXzyA*bp zDeOwSbQ+?EVGnM+iPuh+yaSec#K}48A&reW_g54>0m>TLBfnb?&mR=f!Eo7o`Y`I zZ|Jc_5q57dx}fNEvBAy|6k(r>5%yrvZbb9|Lr@+NaZy|fPWtdFqg4>#lZry~9fVFr zbP^R+7^V{ueH0OA+Z1eq6pp$P5dlPEOGE@P=x$T+K{uZf5dmb}i3lem8n~x-Hun^e zb>^O8+dT#BaL@ihH=l7&`+l@@Pv@Qu+|xgod*;h_-MFWKVk-o<>*U>q;0N8Tch7tk z)w!p0&jum*+4gqYV_dq}+i9gO=a-a0VJ1!Ms~+k@49*_6c20{pJR3ai+ssq^E-deC zhvuHKy12ZLak)5~vLJ>-I#Ct|32zC1b1AwL{s-NBMp+QZo$zWx-+$C`@a{3>oo-95kvD+x!#R(s~hUoM{ACD)*=L&U6h6AD@}{_DgI@sxzRI!KB#jq!&_yv868i4%@&sAyPI1%C|q+m)Qo9 z%=ANyWPUIXV-Utub? n+HO`Br5<-@x4YnI%RP(h{FgCY4|aZA!}Z{Q>byRm(P;nx^oXo1 literal 0 HcmV?d00001 diff --git a/docs/diagrams/stream-bounded.png b/docs/diagrams/stream-bounded.png new file mode 100644 index 0000000000000000000000000000000000000000..786aba5309ad3b187b6c23754eeda7322ecb3ee9 GIT binary patch literal 32051 zcmd?RcRbd8|2KY=lA;_^NSR5BC<@t>RaV)N6;UL6uTYdSizI1B$t)`)*~uz9dt_wG zUib6p9QS#j*Y~=AkKga#pX>2(omt1{_{nsZXpl|TNM>fo+S|0 zbrJ~cX(`s@D;1BgoyY%?o1B(ENmwKO?{VI%2m*nXpm({U6 zxlHy{MC?CuU_9XJ6kt=kX37AA-5LxwG@!e$_`tqsNXNI~~bm z%pYA{UA=MR#(Ae~ecqU=jEoGyW5>2`-FoHnW%luqpF=}8Z{0eVZMQF`sRYF2wuS(ai8i_ymDpKcOzx-bvC=c`}Y~}H1QCZ zmzO=4W;eeLkB&aT$Cv!}?H%#@+FFIvr%AtX`SNggQ2?J|zEXY&8ynlVm&)7+4~p3K zoOE+@OJ1Uo^6v3_QeION!q)X+Jin;5^7Cf~s?wiL$*BR^+1Vl@BJJ(%9ul2xZOdcr zA9UQ$oC(X%m&o{HlB)7Z?B=1U$jIU0VUu2q%a;X(gf5Jl*E}j&)Yj6%!t3eHeD@At z&v^GP@F(9OR+4Y(i|5ac3TvVT0!&RM;>LS=!o$MYvc?w|7k~WtfzRaR

Qod-qO6R5a$n15TBP3jFo{n`u)vio|x*)zvjLXzJ;S z8h`S)?JYGP{q{<=jPCWDH$wwc)kq z8?Cn@j>GlW$Tlg+X`MaGzHKK1LzdUdB36W8Ol(}-_>Uhq-kY15;eBdoYwz{X(ocH! zY;T1`V?)CoJlK)uR2@;jLe@_CurNZcITnoY@#DwE#l?k$GEYbG%F4-Iwy=2j{ykQ; zal%A@Wz?1}Tbk3JJ~c5n-=CqCOn(+@zU}MRPrZ{ncI+U^?Af--()=*PQN~02_ser> zR#a5n9O1Jly}b)-Y1gh@rKP3C<|TJ-Z{@9j8Xq73lJpT78ah!Y&$6(%_#iskR`}t2 z%chqvUbKAw{>|bYlchB`ffu*0~bmhtwx}crR%)$MgxJWLiWu~Y9bXA;fBgIzq`a)ij)zeuf9Q@=pZ3Pgw8st8uos7j+)n)5xBMf-p7HWT>aBTlMg` zeS41MojZ4QM1x8eC(Bq?R#qfe=P#hV6s)br)C|bW%3iXxta*6+TWRUVq8nRTEXsV2 zqE<6d$z8g1VDdotoZH-3J0%^Dje~=Jw%v=UDEj=*ew(PNsHjj@IrLX%N57L51Q|X4 z*yj3J3@tt*qp_w&H9l7ESya2R&A1nsBp{4f3{o-0I7#{`^_Q zVX(F;MyR)^=T=Y<`c}%UfO)lxiwoDmgQv1`Vq@DkwVXc8iram+v{cT&wyz>$pW%zw zuZLUTTYhjFJ$vTNlW#*n6L|RnyX@xl%E&|NT3T`x*;!dTcJADI^2_5+RLxjP?~c!( z4<0#E*U`~YSh#LUR62Ql2Hk=vgRKN)VP5@Enqtx=_sf?r*D2{w<%=-X_a$sIDnF~K zDNE7N&|pj%ju!E<&Vrel*(KIo7^|z(R=6LUf0A$0{po7KiXb~XJ1|vSmaU+mV0`8Y+1JO{h3eY4 zQSSf@*}C=4^gzw--Mc9>rWZVH>4g}m$nVHiR#X&LA5ko?D9ntLzVPM#5j1*RTU+n7 zmCP3}UigpCv}N0)RZdS$RX;r5J3b!5B<3ls@$oU)z^qhQM8x-ePg1#?8);G3)GX

nUO-)HiNZh=66UFt{+*}#sl1;pi^rp0Ff}NwIvZ^ZI z!GjMZz4KF3Z7nR~pFDYT^XBG?ga4|mInLwE3!II~hTh$uHtyZ~EHpIK>kiW|YIO3i zU(>La)YZQoxBsD!2R_kV1jM57V9pIY4=;)JNw<7e>=O0P!-KW+9uf^lfRc&i_T~ga zsBCELI)W6Pv=eHd?uM3K1cE7z>HqKzT}~U}hpnyW;!8!XW`6zB(A3QHT6r)msg@ zPqEVb`id{6189|N)8y1d78Dfx?#(ap{$ITs0FWUUHYJeLmRCRKOG{6uKXlI2!osEd z({;R7U!UorLvMjsPK&DO=rp5^0V3?#v&YxZ4_$i``#A#n-tuaGW1Fg2;G(BbpK2xP zS6ob=nVGqF_b%1etxa$B=Bk7`jhM3jjgw_4WaZ@n=j7z&zqhtpw`I}%RD4#~*WZt# z<>%*zjjDI<+^zTjfrnL8RDip-Qc&19IXO8ydr$RkZZtT5o{52>+?0QyI@W!p`3M;q zS-1j$VFy}Eg1GC{^Nb9qLf?%&B7wOH+ZQ}D_yq*|`}^O&f1ervzBinf@y8nq6;|-#S7MkF{l= zaAe({?f8?@!0I)efzE#8Xac1jTJJnu>AS+DP?8l<(9}uI%VZ5eEtiDUJL0R z7!eX#9L}RK-BXxNi!Fy8szkWS?{``4~xV4d%^aS-+cG>!g z;sOHdhK6xs+jY_Vca!@Sn(`-X+fYu-61t_-Mg2M<0tj+@)`6zq=FfUdt9>^%d2w*kEYbiS>yR?=?HpqEW^_X!gH>Q{ax(g@HJ9ZZ~-wq3+R!;NO^A3hvU0K??qc>dyrtgbH5v-`|& zgNFQuk4wHIR5yGVP@&@_nw;o;DK3q-=jRo>jJV`#V*p(>%MpkQ(J zsys#ZhYxX*-poJuX7L<)!atfOS6W2I^0hueodjPzJnZc3;)6F*9k8Qd+qv@|xXYD} zT-{HOUQ45yvO#np2xb>A((T+?QdS1SCgJu=A^v-g(K$71Cr>Rcj&->1ieEOah1e93BQ81OFHW zb8Sr2l@X_82IiIU|Nf zMm+k;X>#{~`)^#e@9632F{pe8>d@TU${($C`gA1bw`-XU!fZIk>#fC4J=-sFPS;i4QV zI#V;VBdbx#$>XT=9Qt|r`Hu>XbaZs6EJBTJ!WNsjfZiycU`L+LKc%VJ0DiUw_b%rn zKn#$iJ}>>7pIKHd{AOlm{-HrZmAJ?IcG7|Br5|6Siyik3edCr;iX}gejf4&gjU{(uj67iETf>5m zl9KBlj##H*^)0)&vx2n^qBgkFIG7x9bX_ob`blzk@trT-Hl-mfA=)zyU%w9P`GdLx zE=aol8bp;=QdZu}&Te((%JoLlci*e7iMUL#hLr8DRrZmnt*fK?Qq3^p_U_J|D*Q0I zSMgg)Yz4*GSV%UYk=1dMd>XE?H3LDS8H;KgVs&1ge;wA}*SDcEwZLOxyZ5OxXHwJC zY4u9^cq2{@c9T9p>BAm8VBE7u|Lj?rXLbIcXj|kziI*ri+KqJ<6uf<_{CaZT`xMt- zz=hAAJ|%4n#wm&?V`F1UNxUO#EKmt99c9#F77`FhfA;JGdaW;ac|`?e2u}d&XYwHi zSvK7Omxj46wp|~unN>#W>gffwksE9f2M7E5ToF%gVPV0SR+BxPe>D7d;;UCe00Pa; z&Eo}Y`3VV|`O1QcXmh}600$!@Be+BRSY9P2-Y)9a(bcURa=^0=+bh2v3&y<5|Hh3^ zZMx**-m7BhEh*RKmabkmprj1K0`*>=EbD2!j^Y+BPZ2BT8eVnrLP)B2(MN0jwWaX_ zEISG_bN^8AayPfd8p$=Z&~B_zfPOxm6v9%>dtrd9+d)Cov$NKhF9W|i+S;p|MCpwY*r1JfJV+7({sQuzpn#+t1+9grTyLvHrA{B@kKXdNN&hO84{ zbYy=eqfyGz(5twvMgBqOB6iVAiTfg3No5zSXWW&EY#TueAkb&->5CT)KWk#$Hj;|7 zr+GAC|9*m0`KHg+Dk>_vy1Kz65iG}wk}oJ2`Z_p!$} zWh1W3g_@qQY)YDemJpW%h4%I?fsTC7?*)7-2`4@L0~wY@c6YN_zS;5{&I5$`}|JKsz|fSXEri z!OAK%k+IFUBno9Oup-vue69$W3>W&-$B$A523~mJcuD86wxOAb6E=9oqt zZ2q-SjlIF~Y9yAFKC5zHo-iI0%Pqu1>Z6gty#)>cnWA9hjRF@8lx(-0Gz)jUe()EB zY!k}8a<}jEo1Fr}PA=RW%-VfpJsDY3qV6=%?DBx*S~S1etrsuMlJ(a4*a6swi3Jqt zesH>S?%adCJn=hnSifcH%KP+nUpuB2-y#lU=O-l8)z%V+rOtlSo!Z*c+}#X>Tv)N0KxA)fZM{V_;g3Gb_!iP9aMskl7w3ck!xIy6D}R2xMur{+@GHZl za9QN^`zIeievI>49K!BHzl`uOBs?a1h>@|oGBL$s2QSUfLz{e^kdU2|12Ot^R+`37 z6i)!|)Wk$3H2A@~XFAusr8$npzGzjGlKKdhIdx0*_Av@5F%Q^uIWrH?G!W?6+&N$^aQi zNVsHSVF7MzJN=*D0L2rmUC4oLU$Vl|p#Ms`>U#ZJ{4(dX+exyUHqBsqQPL|R62Jq+~Q_(Ddd6Fe(a!{`$x!v z0C3>k&`JuFS3%1!G*XE9Rv0?jSAi1Jjo$YAD(6hz_}{yGv;PqQA%KFU(}+%DY@v}6 zB_25nNl_7*p*Dz4MuwK6;^wQ6beRM$QW?B~Y4IjKJsl4pG>;>~Gkjvgc6Pke``2I{ z^rYwq59Cgs#1p@@XG^DLxP_wNtE8mhL${g5-Oz;RlWBME+?o2+ji3-n9hE`2HWByf z`Jp*6*Qq{0wZ=v*9_a$NnJxcYGe68ki4tI8X^9F0tw@?8&tu`NwDdYXI{8l%V!uBi zC*bCR0G~c}%Hk+v#nlfbvP%*r$uHLbUdJ|{!ZX^^|3h&uZp8xD<qjP(4n{%A$0HC#ycI!=47#hAJhoG$Mc%o@+A=W`-LK@&G86 zmz#?|Ag?ce{CIX=UVC-5bw{qN66Z90p1qw9Il3Kxw{92#Q0L>sT=@?i*ep5-sqAl^ zh1heB{n@?Q1_Hrn^=r*ctN=g%c3N6Io+aBa-5;x~#{i~L>7zv)4>qI{wupHxH{-?2 z%Lg+%y`G8Cv2rhVXZrqIl^&mCp(PM*WP8nD(?>N|P{1P(N=r-2%$!5@?ezZAP0lO2 z&EAGUc|3hOw$h=c>T^71?jtZX52qF`fR0q}vFxI-ye0DSmO&FTnr$F^z32P{4WFzW8=stl+TE?#yaA|hh+(UK~{!GyA z*VKAq?z4%oFRxvbhN}o+im-u_!0?shz!jdPK!MGYl9Gv1+h4}V2lA<%jeedsz0{;! zU0!}zNND{1Zr;O(iEs8PZ`WkWXzu7RfRqv!x7MI-2>B<}W5emwr^)@!Xlw6xZ8qXM zz{6vDm;tC=W7B%mz+8?$?k7DwIH-VDyZBme-_zhs9#PV4@5^t9p$kxX^=;^vVgx6f zKV*Fn0lrb$D~CNMy1&w~hDJRnrf0EN_u)>yfzvvbAfe&3N+9PwxGi9Mc2sY<_YTGH zRdzgF<_k3GSE_MxJwd{hvtg%L4vJE4pA*W#b)Zv#K=`Y{p9?7~YQ?hRR%EZxTKy{v zFsT|I|Gd=%3=0pz)%AE(<)MQIq2m99e580*fIz~KeWCL*Um(wmYEj;O9w^Wuf9|W6 z6CKCcRR_3z^$iVJh|qV)W^ekwNA>z#TKdEDX}D7mY_W;CIgnG5!u};%zOhq9{6`LX`ee|%*#fpr5~Z@pg#q^1`93<+zk$AA2VL;jX$ecTQ^lb`(S zpOKpnJ2L(t?;*^uE{&7S4RP^2Faxa66{yaAD_AfPT94TOP=c?zfB!3RFfXbfC+wV^ zCBdg`7s#xt8yaQ+@aEP3K=hu>x?dNo2|m{Zh%MQG>(DHL#~?@oy+cB=64cWlfP)9w z+Y96iE{*!xv#;ah=YJ*_aCB;slzorRh|LwlG?Oz8>8D9f+f) zvz;BRkLj5ivs4|Z`gm*yBwFLVR{@UZu}(K@^Ko$zspJL^gwr^UG}91?U09dBz0*MW zJzo1bIqB%=!p9Zp{A+S*NZbql}^ASs4;-CsH#e0ydb2296awL{rrkh&tZ(v zV57O>?t+g~Jb`5kwWshA5-WJ9_>8YE&5jl^e*5~>YrZ=GMGczLA-#-HfBE05ux%IB zLolaQNYr359G(zBAxB&_GrM>HK18?it}dVRl5bzX&T$%TO*;PpIw2e$4UKxBD}cd_ z#x%1^PNn-kL=v@ja+0wBK_wGd){AY%tDmJd)o^p-Rk^%Qjza?CHZtX%odq90ETPu+ zIH|P>!z)47V&A@ffQ9gni)#*}k?az<2n`;h$WbAoO&d4%|Mq-=Y&jiQmVmj89%0poqI=YJ%7R~kb zC!f`&Bu_BFsDrtISN-jtP0qsLA}NGup=g-BrFYU(Q>7_1wY5)YZDKeq1Sp3o3AG^axloN=`gBb*h&Sk3rgVq!uM2873Zlwpb3wr!hUhSkv6n3ID8 zBxgA|T6oK#a)4g7YIb%juE*9VS(R_NFG_7sW=l9JFK?Ldu>ju=NDIVv-n$+T6BPSg zy#0w2MG(jFs7N%ut<3|<5VRKTEXXbCI*Ah#HroRHh?lLbavg@k%d09XD*@kN+5?4s z>+EE)yzAj;TP_dy!+q$`=Dyj)PxA=;~ z-)0(uU7vREGd#a1oCY0L@M?#ZiOCd*$sTbx4G^PNTfk*#{m6fy4#LHWzI*rN@@;IA zhsP`fh|PefL1$NIDwl%Pk2Z2z&xaxnH8+A5jb+vR#Gid+ z&=0??#`NiFo4Ine(kdsB7kJN3(n6mL-B|H}VnWX#!FdY>8*DMMQkNvs-9tdK!xzEh6U8 zqhN9O;rauxDH8azWM{Vf6^4`3Lneooc#Kb*JOm~Rqa$QopPWY?Ar_RmwaB|9c`n1Qn(=+qZ zx0l{)OP$T?P;E$&uY+QVQ0h!Gk6AV{FfyX$&{VI@sh&P9ilqmmOG)Vq%mkFL{k(SJ(&W`$pQ~9OTkvmN zdV0gqoYsx&=3F9Cne9HT)yt|XR@Gb@;pFb~i!+u}j{A6IIFt17WQ~oD(bnS6JVUGj zwsKb&JbrF0QVy7wasJ($YpCNSJ8FpqO{WBq2qD{?Klo;(L-mY=kWv6OTXz zPD_I{a{21jvQ}BI3&a*Kouj+h5bOIfG*n^AkB2Nvr%N}-BpX^DZ`$V`Q_g3=()IoO z<7I_iZt+#sC>0b>AR$<-Q`goGAoYTMhT5OlO?z?>x!O$2d3(3eHp_<+o;h7zP(QE{ zi&$_|dMp1!10&+zZP&hfTj$`2=dH+@59>q-q~Z*P03srZ=W}t9f_2cJAeKH7al8zn z&fR?pRwE)NIk4oyIvF^Y8N(tYfens8fC6yX)p^TkQ}|VF;jl9m<#U2zhPe_SGlhyb z@f*RKq#}Rz;X_RLTSUE(N&HDtGptBbN<@Xn((IwQ8c4VF9$FLKxB{>cXo7)7X*!80 z+@a3s$zffWK#n ziMI=lkgH;}gl`2+8g)G>F%hU4%*zlBIsaC<94ubM^73e!wa`#f`T^MSeDTXCQdE)D zd-;+xzvQ1!^)Ni#m)JAu60nUaoWp3OQTiWwHlxw-`rSW|aU_rr@sT+Y zh?Oi&jg7&(1jyG;!F_B%kFKxx_Z*#{D_FZ?Y}`FC5YWDQ!gOyK-d4t8Tn8LFik-Tp z1W--Eu&x?S==rY|KY=jmoMew%hNdaJyLwi&SpGmVcQPy zh9&AE#_Yr-H<8Sk*Msfdl%#z6bb4myt2zr&rxBOc<>Rw=Ig)jfColZ*{E!u(B5ycD z_)IeD7;fX4<+7BSrs^Px>b3Z52xcQhbzqn~=cNJINQC>!m3|vxG!ck{9ujL6xKV)!@?W8>(nDuc& zniS-#@1_27Z);e82$TbCtI?4W5dAV!{(_}3QI3~iQaRp-(8!?dpf4Uhas*-I*X8V$ z;dfo=c4;Pa@Gu`r(nIhNDF`4_#5^II?rUKuUz`2W+Y5E=dNOx6w;VHr1Vz1b`lbgl+Dp{yqLt_(! zr0fUq0LH#&j-!G!7wM*7gh4wu&PgDUAyY(jKq*BK8m&w_<%pQr!`CiS$r8<-%pY0T zw?wU-W}h+?{*h%USm_WaORjq6WmBihrs(beT}o%M#KgY{_tGrj{<1q@PwQv zp(Az{ip=w;PuWw?>kC5Y?Yn>ELf|Oe4+c>up49W;tbH{eFGivMP54sD6u*Zbbiuy+ zChh*&bN$w=KdM>Mwg}uT)HBe1PMs}!VnB0u2KWPNtK>po1jwVJ=^c5zM^#l-o}paQ zz53u>EYZ`7h2kp4oC=_h55MM)mX-r)v1Ps8j{X~g3&!AE6wf{>uB)3Qt7qMJN=Zo{ z+E;M!HW`?t72m&;*aif02N5Ly@&qn^A&vk&oIiJtk%=kqLfJM%=kZEU*0>e*H8h?l zC$D`|l{9{1lidc)kG=&ZPDEJP>U+i=9bysw9>xyv_mXkz-djc?I##ZUgd#F=tIN}> zh`#|uj5eo|#bln-(Sh4Y+5&7E`uZbCwY?Ae?r`eVXC#aPu?0|Z!5yzQr(DYt?P=V3 zTUwvy%#(K4`3Ykb1;jfM@QdWp-A+e$!br!CSJ9!Ebm#UkMN;L#&ADvyaS>D>Ioyqugrpw!Alt>@rV zRBC(Z-+vFS5SYBJzW$xZ!jyrt^ptxG(OF)(B&Xdam$GFpx9=D)I}kOIL(n zs=X!U223gu7i16G@gXY<9IK1^#X&`$qjzyRFmY}ryCZ*>OA(fxy?|AdYG(CAg+Dke z{Ilkbpphhx3L_0ol`P0(O1n&`&^tCjj6Pgw;7; z3|ivv?+=!GmWhdYM{>g6+^Qph`1IS5j%T+)a@;Ae6T5m!+!U>Y1iY4AJY=yIr;IuV z3^0kBj)@9Y z1qEcmW^gNnteROh-02AqAL@^5I&<(O@KhXx#)JM2&aLyqZDDHP>fJx{_P3k5#@{oh zsVSNjwhxtUui>~CEBipqHLc4!A2qY7ePOM8hH)!H?x4dWbZe6S1S=Ar?GLm;WPwgD z5$p#Hz&!6oMMcboO=t;+CqDfv7NEl%g7p@4|9)Vy$;FG25fOgG;gONzpjkzCzTKpk z)0+MwdOBzi53=vxOogzH_9aw)_ty!aWW|IS^<;2 zefu`FMui+jowK^(nkXrcB)zQ>^nplfQOBMu8B+yb6NcyriaUBkc^QrNSzQa~#W%(2 zS)Z$WYAxO&=?+mD7zsA*7i3}9jHQ#4IqIEX8pz8BJbJ_&tHQ_44S8P*YxFi>{`{x1 zvH_T&8f7wDb(i*)6DrEf6@cQat0SKae2GoiPdUv=_((W#@E|aO3<=m7hQB}XB+!SuyE}HrxlcRUM9HMY=lwx?nO{d8`%x3unQ6Dr#>~&n=Hhxn zAbyYZU6L%Au*sa$=fZEf(Mb4DnJ;5xc-U>SM|SxDutZ`a&y=QwsSBC3MU-S;QkXy6 zhSh@#;`fEFQF~MUda^hjz{9X|El9mm;gA&@q(&o(&tJYc*xD9Gq85Uq+*sLgeD7Ye zH@Ok_??ciG+;C9z&xEAj#y2B~dJO#dF$?o6k;ZT%8z9F&r<9y?LmnfuNf%@WFVoU; zHwz0Ne>MCyc;%cC$KjnI)VGU)f#M4HzJ2{DizQ2IpoHM1SWmK~1fXCHJQ9pCA%<~F zyKnHAU=J_lC`JRqlarINg+fA9(V=Bzd=ValXJ%)|-zeYq^7x+W2gfYo3qjU^Iy7-G z3zTeLbsZ%A)bD=FQE zqOYW+gs*Bju&|+T%@$EhLd(-Rch0&cO}39S$so@SdL9BKsCTzUo;`U2vVpr10VDw0 z3+*Jjc|Qk-DaI~f1ntKhj;iW@rwJt6czKiJ<3BP#I&NPIGw?$k@~r=s3ptFf*qwFN z{_lQ-V%iW~h>$(U`T6+9K|H8YHj$Grk5c)Be55*cl9i9wtEW%-FO=TS&CSKFMZtt> z24#@rplHxLyZ%#%%ZbD?@7MvIf+MX43Lb_eXk-9i*_ZxB7 z_yz7pe-7fy$Hd9TfFdZEV~*!d%*;)W3>r|%Mbt}|2EOs+F-5kCG?{Sn0h zjHq3m30qS8axN5D5(Vh2uznO@%ZBU{kki!MX<3gf*T{&~<;xF*ZJ+kV z&}{&y!hRuxwq}fs5X8&i;9&Gb3n*ST-M;tk?VNl$6t3YE8Oh-oTGAjv$BzY%2`xMZ zs7~`sOBc*xrYKXo#hs_i9HQAP_vh$S<|g#K7rwshGkDTW9FvW~s|fKz#JJl3s(^)m zuKpVSd|O&pYncq-4#JP{DX(_q4gnM#n|<>2-Q&3yGus%9VPUpn8O8xNFm@EAnf2?} zrz~^-eiZM@-)xIad12wT%6>p3TK7{rExHH8>!mppa3}v( z#prSiHSs=rJM5!Mu3(z--)3u3Yl&teCpFoysQNfiZ#1IFz#fS3C^+)?Fhbfv1PO$? zBi)?3AyrN8b!%DCx-X>Xo3gT6KS27|vSz4T(d?HEk89qC1dx&DbUy#eo}IKIXbZ+~ zBBj~?$dks^LIV?+>H4z4hKlg_IFCB@4`o8|I#Rsp&x||icks{X|6463kV5fzzE{`( z@we*z1ZaOpqzJ=>`;W5vjwp!>3#=pj?aPqv-5>u%Mnr~`5h4A?$0MX#txjF7^q<%G zyJY*gO>EvuD(AoFR#BBO$@JH6lo5Wv%*YqaxJo13wed^L4T1ZjfBo(May9>a`9FT- zcd&oBux;1>x2stUkA)U-1p{K9iwSmmQ)qe!DhGru zP2@u~T!#)_v9S2a{G-1g?Fey+9%@im zFwBH4)IQw_d@U`XKFORuZHWm+^_NQUW0T|KS%=!beM<)%M=2vs?f|S{a8XJrY4 zP074yup*+CHD82=h1Fq;AyaXO z=mtIqj0jf&<1Z=Z_=Lo13gV>y?8+e_tldlOW3vAgS9!U(LJwQn76!Ug8svKnVLae> ztG^+uu>I>MFO~yq{^V(ao%>;49T5_WlkkK(@C~_d)vwc&y=4&6ogoU%PSfK1855>hrVQHSKgKwiubx$uKg_WP5uk#@&=(L>NjdJA_9UgP@0mKLl zdFHB?jaq#EQh+pVACn=O4iRn%izIpu`6iQ1+Cmz8y zBGwP?4O~!|Dilw!v<`4{@AcQ$*Pn&6Ug3i#6LZ*DCV4O4`J5fQNwPfdEqaQron81r z*nSIGNkF_H!v_x>z%-otRNhM%gD1|O-7dq$$5(@R0pO>y@+ck<`Y13zxTlT~A0MAp z;qPQ4E09lnJCo(mj3>?9Q;4+~xdARk;sa7pZLOMM%$?+W4*=M zlHHC=@>e^5o+*R%CT=+6og1-|f4Xu!0Vb|=K~Dff-@G|(kRO%zQF3>=yq3Cp(f9qz z4>a`jxUc+|;I(_Zp{}q15^F71PEg~lt;b-ag%BaSlalU3LvTWONqUJj9)f%T2QVjx zk*&Dj4p!MDjhm-oah?Stcc1(>!~ZK{MD&3-OUuZp3s7ewU_RhlmJ#krao)yx~Hz{N+pXO`DKbr@FN{EI7Ctrcsi9Hu71;M z?Yu`mHd13iQFr3`4}ymd;f#Yva?kM6y>Ny4iniqQ^%xvQD~7Vm9P;Y%W1lOs6D<&x zw&Vk6+#Wo}P|*p^iN&m&ma&{MVeKG-OZP%U0fMXh?GS7wO=!B$TJao1f{tYNxsch} z!H^^6+aHO$1K7EU86bCw;T6}lRZrWP+Q!Cm!do z+%G8kD7lzk_%`IQ{4=+&7a+4e-!rDH_wV%gEaUd@Xn}7X9jl;I03e?}Wu&KbBU;PF z^>K}ZlzRJT4E0&lk&UGN3MJtY=I2hG+Cp-g5$sV2wX^AohYF%=O+7NvPYml>47Ek|bO~!A6jf=H_|u0W`kwKK)%4 z)v*7NO`BKJg+u=N?g2P`&?R(&@SvenqO9WsoCQO+?o8@~*oHm(5h>Tc1L1|YB88(+ zVTtZnFODr(dup7p?r$H^dtMm}=1ZJpXL0e#NN?VCZ*H`V@dK{XAk{>cMQaCr5s1X%p6~8jQ8xta zZNj3W3^AaXZ9gEfI^P=@80ZxzPv$eUHnP0#^HGe(T6N~gxY9!jaNhf6>&`sKIoC9eOTrP+}^#f_|NW zH1->+D&9!*iLe(gNRLg#Jw@)KH}ks`1;QAvZf=;X!K`?0a5^}oukR;JEU56mEI;?L zui-^uC>R#!PQQQ#3Qh^;UIAxIFO1!E@ppiJ)qy=&A{!%CIG9;!hsMe^)0 z&i^P7W%WGJf!QmogL%e9H^9`p9UmfQje{=^SSwAn*6u)T6Z6tc?~hQa!k2=PA*u-cOL;=_mUb#=DLR6wN#HANH&LYs{E zKAsP^BT{@PKm#!kx~gV+z(7{E1P~*U%qv}(DsquV26qvm1DAy^#AkEAh}kNIpZoZA z?Bbf8y*)zuj}QA8{{*Ee9M9)6MFJNxfMJ^HP5%?5jp12Q{WoFTOic~L<hs2 z$k$sMZL2FQ@zj_r?)QAAJ^dj@#;D^cgSg9tRJ>s2bHxbs64F#X;DbWdV-}D2@0GJi zE#ugn52$lqd%!1Z5hH|w#Zq=x4e4XQ!im}0)rlB#Pl$Hq^ODeRAS0redoo`^cLlh@ zp#&^@H~6(bUfwqsNVAvpXAn*E+B1zP#_izXmwj9KS$J?!|hE|}fptbgK&v1SM2f3va^C`T6EV!^RS6DU zu)cT0ld&?lMuJcGOUY!>I1$Is$O=O|T@n6aL-?cm4p+8Cqo?bpm!flEC?BdJ>HLKq z%*-VB4G|!i2^b|QT+NI0r_=t{@-H5tBW__LZWd-1MI(b{`_H3+*ypfb`himc!K05{ zxDgYxd)3b>%rU;C;Wpi_SG8Km5(!zikpj#C^m_=0sjz#XM7s5rhr!Q7>IOi$8|#5a z1}K~q`A0GY*$J>ap5}t4@LJ4kkbeAcEzD%*@y(gLvXSTIDBkL(%K_q~q)b4BhaOFz z&4+XiUI@SJf%~N@xpI^gkI!oosh0_~?Lo^$AH-Ps-01iH8llu=f83gI5z(lqC`p$I zBa{(TBTaSnpxd{_5HVZW8aEMMi>?YG8_gJXT!B>-8R9>(4!JJ{^2h$6YC(r9E=*0U z{Lcdt5V=8!7qfH--k2O_z(uk*t)QnvC*f3mgd<&qE|gM1avwR6xb0Z13iXyP+q2KJ z_4M!@IG~$iByD3efiQH#Pgdl`BNlV)aa0k^E3Bi`05~pa^eAYw`&Bq}gK{~JDk={k z31LL(AadSR+``r@3Zf+_8v>{S$5i4ZVi_8cI)t%t$J|spuki^TJ8w097o3@V!-mjA zlBSGajaveo`Il@&;rgd+q~!aY2CyMsXBsEaDt!ike{GBdxov;fJ3RG50r zwL9k}$(-GO?$d*6U;p6)LEIl6-o5MJ9*Lp#{+=5sJzc0fV9C)+KX5}UXt@-tEVje0 z2Fp}`rE(sF+^AQ9Ohz3Wx)=y2kB+1ec6_d?!q-zV=}_yuGVlbDo9Cn~ ze^*pny`L*B;ddeUousPw%NF=kdG~QcJ{NUhxG);Q-rw?a7cC%-R4~r4q^FlpmGyi+`mf2}2x|5uo%Aee0>MaO_<|Fi?y8Py^bg<{$R*ETy&^$Y z>`|OFz{zsbH1%S*^bNvae{o#@`aQ|t6s)^J6q64r8*`P?QB;vz!tAS}Vg;NhG) zKUCzW&`QisNg;B((eK=ead0pnMe=n7AGU-LdvlY83;t?aT9HVhqgmd$qYN9l^b)<1svk3%~Wwx>!0t-H?3j4sP3|j%`OO=sxN_*E4e9kz@A@#|_`%8NI0>2`KqES|EK|v4cynxcaDr0`vPN3hCvT^%|uyg2w0M0Si zdtP6keeYh#L9GKRNMqrO`pUMP?NK9eQJyp(-sCy3bReXIk?N}%aCdPL1CE$&7rN4V6t%bHRpG$&y<>OV5cFX68x$M@!Dl3BqRS|L~9rr^?3C_+QgOR6Ll_vbrj0_CZ&!aD!n3zl`>+=eUh_u3Sz%fGL zS8%BM_J_k%J#*$75r@Z2PfoJ6j&~N|Fpbr*cF_a9I6);VD+`G`!5GiEvGXQe2R)*vWi!UVZD4EBk{@_O#^_Fe<`>y{S7-NYak+#cj(5wjH&)BhX{ z%@Mq(_<9(u4DcTGq@muvfdQNy273!6V{-_nQxr50%#{6tW(635gJh5@9-V&oi!w2G zoi58&hQm|2uG8dfC`tPhiZE`BQBa}`Y!KWL&uv+k8(yQ&@AXFkM)2b1EGQ)M59q9K z5t59&IrQ@!mS|je?IS{}NhFrNDYA8e*(G6CR6yExPFBCexE$ zjrH|?lP(?-hKp%YfwolSC$dOUCCsQn!oE#wX>I-T+Yq`m-YyPjocEK)93I%lSqC|a zLx`K=yhy~Gz`roaU}Iw=MS-7F+$BFU5b^vxfEwHuAo-%AqAONbSpCqE%sdRzeBKNE zUZnS9Vt)SoiBZiiO4Ic>jL$yxgVCt1O~0x$qG^ag`x`_fx~42C25YAhNT6eFJ@*6g_NCERW;1CJ`bB}gZkme zT{!|X)=*bHtgq8%iO`feUhD8T%{H6r%jDOJ^|ekuG1>=Jl)EaTII7?Rd9g5&aV!&&_iHL;%=)*LDWrSkIfLVyK8 z6ZtBaXM1`TT3;Z24UUNy#w~}PhUFG1z$&UEO2!{pUB7$T`3Ke*RO2;ReMko3FaVs= z(SkRNQ2uA$-zOC|K-C1#pj%*6-Xap~g_I_=Ja3%&0MS3Hyb-YtoVJ1U2m<{5;oieG z>&eJ~DvL8DmM~@#6T^4zU0~MvleZx8Vrjw0!YLKRJ9fACI?*$S(C^+2Vcycr%n=i~ z2<05kqg0+2PWQ=^^A~R*s1D6^>ms-TVMZSXs8WTHvd}08{!{f zP+yBwCx|~esfrM=dIVP)0wF1YPZX011kBMu(y?)ooEX}3J>s&by3Bwg(g!H+M zu4T{G5aVW?uM!a+PLx3|)Fj>T)a51+JItqL3NYNp2{wUOa3W*h?C<{~MLhP+2oRnT zPYxJ|)C_n}RqV&wHp%QcA|fDQuQu@fFt$mbWMsigXi?st9((F znz@oUjKd{l1D#L_Qke*$+preyW?9?W+L8`DMH(j<^YtL8#8HT3!GVE?1qHR1iGG+~ zQ2x5pk7jdYwGWk7h4@z-T{J&Gzk`kriFgw%c9&;Ttil*@eosqA`1QMo7Uw8xY93={ z?ZRIZa~feVFdv7Kf=#5|!{)QSuyq$!BXh-|gNOm;F*Y`1h>R&7G#}x3x`0FaxvuFz-MvK$E8 zd{BE`8%~?TDW=WlndmX3XcLB)K;%%dK_OO%929%$WlopOG2bFHAASRg%a5&V%n#~L}B(8*dKz+7iYL!V!rD90l^7A2&%#MFT`W zIk}%8BspCZ2_%kA5J-|h6rRy8-5^s5>V@gg>vn86zW`8~{@nHL6BJe*%|5+r-B$LAY<^?}c6SH)7wp#=>a+&9FfLq}3C5S1 z8KHLPNPIkCO6WtA!y8>EPo7+>yyMaNh3nVn;cfU*L&7(z+R-KKH`_{U#t6z_=*h^) z@WrFk_b$KHHtLtUZa^`=L5$hyt5-evhs1bX!idTEZzL^HaMoz7wzEU-*o=pnI>SNV z@=A)n1PMZ&bB^1o82o>=(dKk0eD{Bx^bt<3Hn5^UrKT2_mX5(2f24#+2d&)pXuT1! zdslMU^z%D$_N+aq8#e*gx9GOKg`yP3Gc{MZVU$wWEw;oh>GYbis}VDtzmi{oTS^JETQ?#%|kieLyfLFy$Fm{45kk8!Cmp{ zf~MPTZLQd2a?5VU#;5To&YZzNRQ>E(Xm6#_)1>J|7K4@{L*);2%BeGF(${9E@zET1 zFb<;9pZYoOg!BFLY3okCzu1<%_y9krr3kQuGn#aUq605bj1caqvNTGv!(sb&a}$%+ zwl*zoZH`?MC}{{_m$9+fWj&??2o4FUyno-T?WMVuRcuTC5&bj2!LV|{iE-VDwDj7F z_Gbe@+j;uG9vBO&q)Z=($Lo zZ~m80g!$}%8kNsedk^x$Q+L2{v$#LWl)0F0UcTG}{K6&RdcT++!ztfKk3UCvO0y@- zxnB!9d#VgNVYizS$KPBXj+&bq1U5C7xMO-C03`i)Np%Us!io-rhI-*;V7~4nkV|TFo6S-~XOv3q+g5lY&-$%y z{=)5%Ha3cSNsBW_E;Y5+IBxa{XRa#dw$0`6%pYZm{WFc z<>#lonW~(76ml%{(|a*muouc?=~ z+}(Tg$JygzPiU96%+U8)P~Xtt!$;y~`YRRwZqs{uGU^Ahe*r;3J|xyiCecVCp@Uhx zg5#LF>vaeNm+ANhs1*v%S88gSeKa`k0Ldf*zDZMp4F8JB(6YU-!FtDzA6BerC4Z!* z#yX?u*){j9{rgRk>|>w8Tp7Mclj%-fy#z{|bSf?xe9HCrpGI?}F7OcmTDZ80pW}`l zBQ+A2+3t5w)!XHz=tuv(VM@|2RWr1k8Wnl(GT1566432qwKg3@?*getkXFhNwXF(P znMzAz{T~ICPwc|#(TxL`mefd+xQ@_A7k0n>?%Fr27#R|`>a^^fftEMmF!hp5q)NE> zi^v@L1iNpqEN&hmV`;w~@olmIZLV6C)cf*Tkq#GEX@~EFa>GluCMKcyKzrJ=^JH^o z?prw^L}jZ2Y8<_+zkYf?hFBicmb)5FbEs8+x?R&tKR^6akNl88$6jg;J|$2CU z;-#V&SNOU_M2tC?nksnVc^8G#M?m2Zi<>!XR>+9zf&sSbCEAB8Y%a@AU zNm-hs4hVjmsw#|pQ_I>$&U0@9D-@dKO?QrwIoCaF;HP-edq%ST?N6#jr=;Ab4Dg(W zg@yviS+7mKbu~srM4>>~5wLbGO3jP|1kQ8BQIBBvs($RUO9$?^IVVW|EAB{E#)|L?aE6(+$4!NIRqIEy~TwblSJm87i zA_bL;D~czn%({I5lkX5tyCV7hJlh=9XbzyO6$)ztWJ4Y+S)mAxbWkzN3eJV~A;3~z*!s`40`itvG< zotbA)gNWpLP@#K9N@KTQTw(OeVSwL6z$oQVsuWEX9w+1-!RdJ%Ba_hTy3y6mPYvxC zSp4L1Y3ZP8KMonk=sSb|a-(Gc%>)I7zU}!SO9#iEv-_T?i42*3Ua+n&s=J~kXQ?=M zrF3ON}(XXE(5;#ui`1<-fCj*0g`W#sUSTwod zMIwcNb(^siJ&{}EXcX05pNY|~DE~ErNPLsl&w7&ZCJP^$TjbbZ_Wv>zzgbv6g|E9| zEKEoiIs2aur6~F~>Ka^TLdeMp`DNWc8@aHe->-YWk;qolbBTUVD&lxM*@)F|R5j_m1Dpp(bsP0R^~UTHmm#Jb{L_Gx)ib zsJ^emfWC4}=c_N**X6EzEDUI(BGzhqdGR$mqHa=sABu?P2;qeKIZou7IFlPnL%IFJ zhxWi+1YN4?y>Ad* zqnK%IG#+vM*}t6`G6wXHpa;7h9b>e&9|KmS*tI0^&9u(=vr)}?qOUKmrI3IN6MUqH zRgp~%o+}{{0;R@+Ie=kZhtq~4^3>U(N~CP37?HQrT9UW>67 zd7qP0D50|c zYb}*P2U}(yb9~A>vgg|-&F!x*j*?er#shPHk&mT7)fdA%>$d-^kVE%sLIzLNJed(*6%^P3mLWyp>y0GIx>{mr z_>mltPoKCcTzk4d8TJwY0!|LOJ!8@&F(v#BY_@n^Ur%ffaT$R@AM~U*Z{I#{*f63+ zVdysf8sq0cjx_ce7iZ@`TUt;A6MF9ZK8afyqV&z{*WjtStf(LZZr`$kyNk~JR@4*y z=(RxrK?Cg2vBizVjlr$Nm;k?4pks0+YagYcZ-2)5$8QcFmSGiy?FHnl#Cqp>bS%65 z4B%y|u6($;rO|BSAV6(_ggIORD_eJ~XTOuVwa3jZ_~|@G>z7mz9@Wj8F&L>idlz?% zF`2u6hK;X19056o=!3tyKU_2t9l9#MZm^kQMd1B$$kK@=;$kn4pG$9{d@4&{(b36i zprmB+ojX`ihE-nx$YF)eb@#T@GW8j2yF3-{IepHC?)4iS!;WG%ViMv`8g`AjIL0-r_Fuwb9A&f}KCRE|@RB8j%x zZ4zQOl&aVXZ+BhD&L)=w>UYSkN88#-Lo$DpOO6X3Uxi!ek!0}139i)jR|gNTp5zsP z&cHSuk14bv-PYH!X34z(IwV`rdwdGcue_9$glx194b!@5-&TE+eK);c%~Y&on}zh) zm)~mp{vrOytQ)nCEfUmBCVXHEob-8-J^yPIkBgkQHn_`P#sJyE<2)Z99C!;C-UI+d zuPkFw<#158`g^eqlTJxOHVm)Q>+jr|1+@^l)^*aj%Ktiqm*!AjqMS!;^lKb)qZl=t zs*I%F8z8esWavZ45Dozb6zs?lz4F})LLYT7E1!{&!6m~@cxuly{eylV1CZ|!$a*0oBP2L@&4n$pP7-Bd3wnZ| zADKqD0QZc;lM5vfU4Y9VZZJcX5~I&KSsR(O`NI*F@A^WW_Y^71Kt=E|$_>&2aRG4@ zg#ViTPV)IYTtT3zJSQ+k-09H~5e7YZGC2=Z^K>Lj`~p9B==AfQ!YRan)dhJ6LYnse zCUz|{aL6qSlexlb2)27fdP|gPhURmS{5}V6(Np+3)P+85VuShwZZf zn@6ZL5#%ulwnp(_>u(vKSrca?K-wu>i|dSK5P85Yj$Pp2smF$i=ntiDJ_M@ruL(>k zV9SNx?=NAR2NV}QmDRuM#uKZd{l9PUbLLC?(TWi0!-F~~nscp1E)d)2EFuJzQhxeL zy}fIT$y@5%N1d-GvQ7#aNWmp7xgpM7eSZU9M7Ck< z?4Fn{y@Uv`+l@nfHJJidmR>0V~Qnnt7_g^%;d$nTaIqqsxLCr!I0tzNZf2uNE>TWu8IujG-Wwj8+O_hq%Bl+o0g58fS?hjS z$N-0+-1?L5o|?jPqTHEy@%<5$sCwzbw91^+)JDNV*L=N$+ZIZeXE5aToBaA;C+NB< z7TLA@`3n8r?AbALHgvOOU(Fm7s`hwVnFVbq4VKH?&*bxyanlK^uu;LZbfE0K`8kRG z;+Kt<6yp|VWF`>(n4Z_31r-l^Z|vIq%BH{Po$zI6B*eu#KYp}hv7L)c@b$JK7E7Db zMb!(-OHvvvRHL<`e-Jxhw#|K)mFcA;xGuW=P&H#b!>bDp-1n)nsV;*!9K8PGqB5)U#HLV3}c(VsPzu zA3ltBO7)JHu`-^sBk`x?jbcJedY81+K_AXN%2BY2*>_}IS#F5phLYWx7)vn=vIm2p zMt1kin=?mh-3QlC341k!Z-gd!B~>ulC2xOxhtA+E0#ejdArR-72|IZl5Bc;*cjQNBSpPPSGTIZPRO^CV6V{}~wZ zTkZcji;4_c%n}GUYc2U!w*7|2E+HEZ|1?2l>3wvYrA1_0~90npJ;l1uU@j~M>P^BEbeFHz}KAh#1`MOhhko|NzG%Lj3}xoE8FSnS~Q{g_w0(|V#(f;=g_q+8p{l;>>q2H54U^1xT^c8*}JDF z^{upbJY}^C;*rz@$rHcwBV)}}6Mk7^Rd8CXy|tBAcW`vs_N`la@E_;woLn7yXOkdh zr5)$)`<|svSy^pDR5Kv`>eWQSu~cID`J(-ZQgBR5p^_nKG;CCV8#M$L` z5Mnky0UF#*#6kG=m(V1{Qt-GHcJ411OmaORvDmUa!d9Yr=VO;$c`h&lc)i_Ye(1k1-dIyy%2L|L}1N||q1XuC}t?x_4n%tAS z-jIaAbA`QQur%Cf9n~JvN=TYv1P?8UT0sP8kBGD-BY*zdQ*|MumR;2NDGu0|?%35e zn}^ZB*fOvJ@D4rD5=9xhJK$_#rv>!&@jlAou(O4HN#+5Crt|gv0mQ%*^eHkKO$S-f z0t1I~>=8U5##lz(5hL!U%Yf{&C6PpF8VOKT@??q^s?>*!GP$U6DGp5$|4c_FWbe#F zy77iKRpAFXKe(M=X>p8B5)M6?y`ywvbqSev$D%fjo>OI0CIR51IM?4#_?YAhA=c9(!#%m=r>Mf+OHEAJ?1OyiA)4WRTC)cK zcJH1LEceADBx8V}t=>6@rvJ;2bBOLaeJe`3j^F}g<6^K847~^gQxgWC2n-LGO{~B| z-|SG5d$XX{G5O@l(Hd*?KNuPfUV~lrLHXbC7A0j-M@4F7{|DyQYp#itpltGCgwbfw zy*_n=Q0NX^)RLp^=uX)Z@D5UGHg+ zR{nmL=Tu{0Hor=JtJvs`CWn-QdX_oJ3^Td)L|$aSRDRJ;d;2MIci5)Id4Tv}Qf0zF z$GYH2b+c8COY=0A=5CnS=8QNV3bxW4l>~P#XQhce^3s2elT?_}`0-=VBV;?)8c=m` zR8Cwv>+AX5j#LTgQf4@`YISCJXS6pzY+`7*l#!9M`|X(O&7^|}zZ$2&T|(lBMMFsw znUH`Od#kRPE|?REHn3>vS70*v?VcVqvfswyFJ8cIqF?T$lsVEZHKlMa^EBU*+Y z|H0E&60nAiazyWDlIEbBfuY|!0r(L+ji@aC`0+`*j?A1d3*^PSW?rasoXxR| zw5Cpv<3wIwzOb+miy_2f*uAW&89sT-qH}Y-NyD(StAm3j@V)or3+du!v+K|@nz6qE zOs$+Rt1soJf5UDD9En%`(5c6p);wb0;waMZY=|T94+$xuSwWTMC=squBxdp{`c&P# zQ3?JnFSwz+Ssx@9Nd2*bnCNb+s49{z&-&SV&lY5Eg#UGaomc^YH?qVsw1cb%g`Uf# zoo`cZ)axp9x}rH`9?Ln9kum2I=2j~dAeMuQ3c}NqwLY z79?JSm2&F-B!V8elc%vH_XX7Do9B58*!6Pagf+H3^!{Fl7S&m;)|@}nfGsw)(ulCn zn8i+vI5kFy1MS9Ra9Cyd%$z*WGe5#U@hk%*0jmWy4iPC7?|hNNX@~cZPnxG`=9srI z2Lkh_<4(2l@Mv?pM%M%oKt}_BYBFarEqKAp^-;>tGguu;8Y*672yLL;)`n>>W)C_Y zWF%ReXep`Wr{6*bXt>7x(uqY)v>o&U2S$B`SyNq2&G$9O#l<$YASuTLV_nx&7664B z35%74gRq@`lzoRTuC7cGj8TGa=6lOS8@L|z#ja+5ldy#U@EAz> zTu<13OFj}VQO}{1#(TB|+yxGRTVw|0IV;@s)9NVi_%z_oc<$`P-tIF*MzFsZvw>1x zn>8B^0l7z|WisPK0}1JHf2=?D0-6q`PNzrLT)9q$eP-gKTE}2^l{whi5k7^OZl4FK z4@-DPil5{_=rT(}7`in{XyzXrH&2^nH-cI~6eBu? zDcCBrj!sDC*b=Saa{oJ6Y2gI{Qn}ttxbI%Qny7vM;X}$YQ9#1+L4*f*>xlBAJghRc3^yI=3oGiEVh(Y3wV~;c)Y}7toZ*{I!K7YRc;}S3H5l|AMdW7&+ z>xLgVm{0IrHg>Fq$7SWVF<`T-^6>k2D_5-|Py`F2e4Uk_(txyW7QV~QIQ)LeylOR3 zbLbat9+#H$1Z{&FkGRAkYOqC|>rPy<^_DGayOGPpF}R4k>shx@O1P>240QopaV(Tq z3@-nMC6ag{>UQ%|fUr_Mo;PZ;h&pt2oxJ|35W=mkecH~{+8CB67A0_PSBn$Gzu&&L zMpAT@GCh%(jqJ*hGExdIk5rnTh;Ex*Sqtxfc@@Fk9S~gsdk{FaTm=1#5G#;hCaeL> z&v(CYGrHpAhNktS{VT`1_*~+6NwBA!twhTw1?EEY2_(~{T z{*fVCP!?kWtk@S7?kO!TcjqrPAH6peQRf1O?(G?(X41>qrYK^vc$s0Ef%V@112-6T AP5=M^ literal 0 HcmV?d00001 diff --git a/docs/diagrams/stream-bounded.svg b/docs/diagrams/stream-bounded.svg new file mode 100644 index 0000000000..0bdf122309 --- /dev/null +++ b/docs/diagrams/stream-bounded.svg @@ -0,0 +1,105 @@ + + + + + + + + + + Client + + + Server + + + + + + + + GetRange + + + + + + + + OfferedHashes + + + 1. Client requests + an arbitrary + range of a stream + e.g. From: 1, To: 13 + + + 2. Server replies with + possible offered hashes + in the requested range + + + Bounded GetRange + + + + + + + + WantedHashes + + + 3. Client replies + with a (sub)set + of wanted chunk + hashes + + + + + + + + Chunk Deliveries + + + + + + + + + + + + + + + + + + 4. Server delivers + requested chunks + + + + + + + + BatchDone + + + 5. Server reports to + client that batch has + completed with the + last delivered bin index + + + + + + + diff --git a/docs/diagrams/stream-handshake.dia b/docs/diagrams/stream-handshake.dia new file mode 100644 index 0000000000000000000000000000000000000000..f9591b4857afa1f5146b8200ac60c5b304e66a76 GIT binary patch literal 1308 zcmV+%1>^c3iwFP!000021MON}bE7sCefO_m$g5YD1mYuEXJ^}Krw^UkhuwYl2%}&% zShz^G7BoNSAw$j*vcod0NKChNY4xVrn7)O@oPf5^@nu z&7VJh|Kyop?nj?PPH**Zl+vZ4pAa&;o0E?0@<+C=SEMtGPy^Py|I=s70m!v&Xxi!Te8UKWna*(ym@ zO1V0Q43Z>fR1~NxU9M2}>_gzokH(c@{W_7*iLVcL~-N(4EzMY)CUmx$74TZPH=^^wOVdVVj zAzJg0$#>H1(5AuDqBNVl7xk*$sevh)DwA~%5z`$@OZUILPSZyDf=k9R=v?v5^W9!d zlHe~kSLI;8D=I>ohQ=r3PcHORFCs)s5FSp=Z}2c$)$wU>nh1}=wMt%c3VUNsywGxR zH3-KP(u5EMRe)5Ffr=<*C5Q_g&qW%^C6bB9=G z1t7sB>yzUUyIr5edO2TJyHZ!b=Q!0f44WO6TusrTAp2>DprbgWX_{=S089_43=i(; zdKNPgsl{=oJaaPyq$@-|19U+s8jBh{p(uZ_C$(3Us4Pm0>Wq$+ov z#9wWIv>1=XlGVS?S1yAmqST6k^U7kAcd40Ht&0#6?yM4Akn=;oj8vc$l;i{JnkeZz zOLf!-O6r@EY7=qbr2jJ~HLP5$&YT1Rf@Ew12zwO`=VQo>6Zjl()EyKFS{APD9$!vk2)e0uPmSh2g^+Np)698R}Xv3?J2}-}!4dNI$3ZIeE){BXagYjE_?gq~ zyzgQa8zDA8y%N(ijs=KwhkO9NoTaXUnh-FG{TCx;f3KNTa>T_$V$dL2tC7r!OAfTv z``%1_st&w$g}mi;)>A%kV4e(Kzu!V%a4@>F9AKldtCtklKwB6X#U72Ot(E34X>7S# zlze4m40fCQlH-wNGJ8L|F=S8LP`|!WkR9S-q0s*txUF|dR-euTw_V}q8^5zA^MU0< z`vRxbG9l)=`1g}$T=`AsSs#9S`)ok0yb><3*&Q8Xv%pep`TRZ-mMhvx4` S2dC=qNB;scRsq9#Hvj;f8+Ydb literal 0 HcmV?d00001 diff --git a/docs/diagrams/stream-handshake.png b/docs/diagrams/stream-handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..1816669409b800445b167abec1deb73b110e2a76 GIT binary patch literal 12616 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 + + + + + + + + + Client + + + Server + + + + + + + + Stream + + + + + + + + StreamAck + + + 1. Client requests + info about + streams + + + 2. Server replies with + stream info: names, + session indexes and + boundedness + + + + + + + + Establishing a stream + + diff --git a/docs/diagrams/stream-no-roundtrip.dia b/docs/diagrams/stream-no-roundtrip.dia new file mode 100644 index 0000000000000000000000000000000000000000..15a379e2c80a46c16e737a03bfc7236b8091c160 GIT binary patch literal 1613 zcmV-T2D14diwFP!000021MOVfZreBzefL)o?yF0al&DM7q}XoJ-G>DVY`f0^Z80{t zGUb)%B!1a%-_a$Gtw_08maqosqG=_J=Wysbhr=&Msk!T8hF=wqbB2l%^4#R|bYbe3OTj+e%)KTM~0cXv46X2K*Xj@1Tda{8}` zV=)Dz>G*1d(7uC67?Izr?h0d4HQN}8v{=c@@l4ErF4AP9qj70f+0BzUNztu{FURk0 zir08rxtSjLdB*ozEaWVe;%B>S0aaePuv5G7B6=yGRy1xo~EnxzU|5Tt;*CamQABq+MLY&_B8J6pH89Pk8kgo4W+l% z?>CTeZcyfQZFbrj`58kIOWwKHy4m zkeC~F`*5{4C&}z@IX6|X-;L0bNF($f{h>6xYgdFo38JFQ@i%ffTlM(B8wlZ(=~^ed zoMHiH6NW<)`hI;Ho{C5t#%xxHNFfTL7qP5hd>jNG1*Cw7-UXm~fHqE{pu#V31KgS`!EMAK=P44Od z5(26whjny)9ZS71%cqI*AkGByt`Nl%&;_BqS(5M-to$MG%^oXh#Y)M+ z!R7bSjaaF83!@S`8>7r@a}5XiE#LaPjBlk;bFr^0Zy&)@s>QN#4ExC&ki(bT4fHSt zUz>))!!98I zJn992>Udtz_r|3$!bVc?ZZl!`Eq32B{^oY3Bm;FOA&`afUO8FeFzk63jANG-pe{Lw zQsFmg{)AYhEf#t&7Mj!1mJ4UNh2fohDhw7=mameu*LvXr$HAOl&=3>X=aam%cn;b` zF)EuYD3$+gWM;CF&`6{+Wm1uD(P*P*c|Ti52(o_k@c%T|GnCwn1Skwpel?PKfzj7A zS$#m1PtcD9{w2gpUhgfN<}A08cZQPZonVLL;o)o*5o|c|n=t)mT zPX@_23_Tep?jAiE_PycgSr79WdV;Cld|P^Up(i^TJzeY%w0gRj?XR93lL1%HdYI49 z)5V@$JuN-E{KkfJf}>Avo{6;IV^4tL(AHEdoSnv;h>YA&IS`o#EG%wDY-4 z8e-QA!U3MU0Z5edhsSQfRp1BSK#$#Mjk3{{Q!us9-msmV9XreG;(0n(qk{+TT#fz% L!)I0mlurNv?msF~ literal 0 HcmV?d00001 diff --git a/docs/diagrams/stream-no-roundtrip.png b/docs/diagrams/stream-no-roundtrip.png new file mode 100644 index 0000000000000000000000000000000000000000..0b26027098d85ab79af4c7d2d681d6b20ca3a664 GIT binary patch literal 21490 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/stream-unbounded.dia b/docs/diagrams/stream-unbounded.dia new file mode 100644 index 0000000000000000000000000000000000000000..8c4cdccca3f25ddd2833cc9e415f970702a9ca91 GIT binary patch literal 1966 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


qJDgIV6cj8*c!5r$-~|duEIz7lc}oR> zJo1oSL@i7K#G-OyjTJaIsr($(!K~S2=Gf4Ju{_r$M`LZtLF@2aZv}@kGg;4WAuMLX zs01O;j1g~O?$P#e^3)bb-Aym|t;dALYow#Jona*;uxWAqNg2~b*>?O0E^ z^YEk4WJKdPmG07Yn&IR$bl0|2Mh%<6@~T%zw=HsCw{~qrN6@y!vg7B^?76y&Jz; zE^V1)G`-0qMkUNwZ1A|zM?>?CpQ@i?h#o|I~!GIM-`wp;`_358WSLx-Dyz??oWexHuz4%@BMp9T6= z3BJ@!747dTaV(pE94;qEu16sRf@7YpKYH{|jD6^Q8fML}SbgMvwc*A8(oTBZWz?>Q zy%d%kmqCkh%HtN$$F30z?COtL)_z#%Wf;}+?uGyfG9{O)ogTj)5QF2_h`fd2<(RfL zukOX=OZVu(Q4goio;{J7d9!$n{Cb_!?@Y4S8sIdwVCO?^>@qP)I0Y*cGP2Sx-SnlOjM&A65JrjDl|EaP>DQE3o z>l!8S_I~~U&BFwnd))Mxk##ml(y_U(i-t`yd+_?FGadTHCvT7~fZ8%y zI&rp@%Z}?qZ|FaG9X)B`nnI*^@dmBBe}&RG!s7aq)2C0f&YX02?b|mGEGB;D>Hb4b zrt55Os(k9pG+c*pgvAVFCd4SM**2bM`!sv^l|#LP|Gw1Y!lxU$~$lP%VFj z(GKK4qHbc1WoAG+3=tZ7j;-K70I+zQ!D?#z$$O<{mQTQY3lWJ#tFQnML(!c($B!OG zZx>%?`|QI3G8~y#gtqiXHR+8)5BimJS89=>&6<_za=ryj?!eE#tmHS*1KvTUhLnKo zW&MjQ zWGp|x>llH+G)NV~fa&kyP0*hEAM&ae-&Z0VV73>c-W3!$rrqu2ylXxdj_*{|!vYVe zhfUEarHURndSciueVHUnO%%|MXO_(-$`m8BP=gDLhnO^LCmH4yKRM;7+b{YPdO|?k zg$?K;NkrpR22QSq_!Y9!FXry4Xn7OSJ7bg4-<4!4_l*bXu8$E32Yjzwsnl}|qsV!N z{8ROsaVhrdtVmr)?HLmM_pU`{zNCwqh(U!fL@AD}R4;OH z;4Cq*u5wmWCUMA-d`efVJ1hM^-VC39Wh109I}F$*8^+`Ti#2QS%9?W@P%&aA(4*sZ zT075a>zW+;Nc%Li@0A_jE5U!!ur+=D9KNAe-kBI6-t(I0vuR*CrYwl#nX>0f>GOvb zrMgZ2Zrdff^}@xA$Tah+S2Zc6I~XHlBa5)6NWMro&eyQaq-z2?Zu!R@?TsCrMFAgt+D-R`@zzmLBRr80=o*x`5q$U!Su3JZPAv4^fg(l@zgn0 zTZt$#T6Df3Wb~J>U#GR}%G;R34~^x=@=RXbJGq-qm6u!94|A{yWw+4mMrP}TpG zdHgtCTtt~8T3T?90uSp>p6n;)ruYdlSL-?VU`9*PARQfR9RuK}$lE1;`aRe