From: Sandro Paganotti Date: 2009-03-23T03:56:33+09:00 Subject: Re: [QUIZ] Midpoint Displacement (#197) --001636c5a72ec471a50465b9a848 Content-Type: multipart/alternative; boundary=001636c5a72ec4719e0465b9a846 --001636c5a72ec4719e0465b9a846 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Ok, 48 hours has been passed by so here's my solution: === BEGIN require 'enumerator' segments = [0.0,0.0]; midpoints = [] max_randomness = 40 times = 5 app = {:width=>600, :height=>200} boundary = 10 while times > 0 do segments.each_with_index do |b,i| next if i == 0; a = segments[i-1] midpoints << ((a + b / 2.0) + (rand(max_randomness) - (max_randomness / 2.0))) end segments = segments.zip(midpoints).flatten.compact max_randomness -= 5; times -=1; end segment_width = (app[:width] - boundary*2) / segments.size.to_f Shoes.app (:title=>'Dreaming mountains', :resizable=>false, :width=>app[:width], :height=>app[:height]) do stroke white strokewidth 2 background black segments.each_with_index do |b,i| next if i == 0; a = segments[i-1] line (f = (segment_width*(i-1) + boundary)), a + app[:height]/2.0, (f + segment_width), b + app[:height]/2.0 end end === END I used Shoes to display the result of the algorithm, It was my first attempt with this framework, so if someone can help me to improve the style pleas suggest :D Sandro (attached a screenshot of the program's output) On Fri, Mar 20, 2009 at 3:30 PM, Daniel Moore wrote: > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > > The three rules of Ruby Quiz: > > 1. Please do not post any solutions or spoiler discussion for this > quiz until 48 hours have elapsed from the time this message was > sent. > > 2. Support Ruby Quiz by submitting ideas and responses > as often as you can! Visit: > > 3. Enjoy! > > Suggestion: A [QUIZ] in the subject of emails about the problem > helps everyone on Ruby Talk follow the discussion. Please reply to > the original quiz message, if you can. > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > > ## Midpoint Displacement (#197) > > Haileo Rubyists, > > The [midpoint displacement algorithm][1] is used to generate random > terrain in one dimension. The idea behind the algorithm is to start > with a line segment and adjust the middle by a random amount. This is > repeated for each new segment, with a decreasing random threshold. In > the end you will end up with an interesting looking ridge line. > > This week's quiz is to develop a Ruby implementation of the algorithm. > The details of the implementation are up to you, but the output should > be an array containing the heights. This can be displayed visually for > extra credit. Golfers are welcome, but easily explainable solutions > are cool too. > > [1]: http://gameprogrammer.com/fractal.html#midpoint > > -- > -Daniel > http://rubyquiz.strd6.com > > --001636c5a72ec4719e0465b9a846 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Ok, 48 hours has been passed by so here's my solution:

=3D=3D=3D= BEGIN
require 'enumerator'

segments =3D [0.0,0.0]; midpo= ints =3D []
max_randomness =3D 40
times =3D 5
app =3D {:width=3D&g= t;600, :height=3D>200}
boundary =3D 10

while times > 0=A0 do
=A0 segments.each_with_= index do |b,i|=A0
=A0=A0=A0 next if i =3D=3D 0; a =3D segments[i-1]
= =A0=A0=A0 midpoints << ((a + b / 2.0) + (rand(max_randomness) - (max_= randomness / 2.0)))
=A0 end
=A0 segments =3D segments.zip(midpoints).flatten.compact
=A0 = max_randomness -=3D 5; times -=3D1;
end

segment_width =3D (app[:w= idth] - boundary*2) / segments.size.to_f


Shoes.app (:title=3D>= ;'Dreaming mountains', :resizable=3D>false, :width=3D>app[:wi= dth], :height=3D>app[:height]) do
=A0 stroke white
=A0 strokewidth 2
=A0 background black
=A0
= =A0 segments.each_with_index do |b,i|
=A0=A0=A0 next if i =3D=3D 0; a = =3D segments[i-1]
=A0=A0=A0 line (f =3D (segment_width*(i-1) + boundary= )), a + app[:height]/2.0, (f + segment_width), b + app[:height]/2.0
=A0 end
end
=3D=3D=3D END

I used Shoes to display the result o= f the algorithm, It was my first attempt with this
framework, so if som= eone can help me to improve the style pleas suggest :D

Sandro
(attached a screenshot of the program's output)
=A0




On Fri, Mar 20, 2009 at 3= :30 PM, Daniel Moore <yahivin@gmail.com> wrote:
-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-= =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-

The three rules of Ruby Quiz:

1. =A0Please do not post any solutions or spoiler discussion for this
quiz until 48 hours have elapsed from the time this message was
sent.

2. =A0Support Ruby Quiz by submitting ideas and responses
as often as you can! Visit: <http://rubyquiz.strd6.com>

3. =A0Enjoy!

Suggestion: =A0A [QUIZ] in the subject of emails about the problem
helps everyone on Ruby Talk follow the discussion. =A0Please reply to
the original quiz message, if you can.

-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-= =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-

## Midpoint Displacement (#197)

Haileo Rubyists,

The [midpoint displacement algorithm][1] is used to generate random
terrain in one dimension. The idea behind the algorithm is to start
with a line segment and adjust the middle by a random amount. This is
repeated for each new segment, with a decreasing random threshold. In
the end you will end up with an interesting looking ridge line.

This week's quiz is to develop a Ruby implementation of the algorithm.<= br> The details of the implementation are up to you, but the output should
be an array containing the heights. This can be displayed visually for
extra credit. Golfers are welcome, but easily explainable solutions
are cool too.

[1]: http://gameprogrammer.com/fractal.html#midpoint

--
-Daniel
http://rubyquiz.str= d6.com


--001636c5a72ec4719e0465b9a846-- --001636c5a72ec471a50465b9a848 Content-Type: image/png; name="ishot-97.png" Content-Disposition: attachment; filename="ishot-97.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fskpwega0 iVBORw0KGgoAAAANSUhEUgAAAlgAAADeCAIAAABuculnAAAKBGlDQ1BJQ0MgUHJvZmlsZQAAeAHt l4VXVNsex/ckw9Ax5ABDh4AwdDN0dzcM3QxDj3Q4dIpII0hKSooFF/QCXkVFRB9eAwvba1xF5R3w redab637/gL3Xmfv7/n9fmf3Op9zAGCdJTk42CABADGxVIqTuRHBw9OLAKIBA0ABLJQJgeTE+L0Y KOQf0sebALbnui6/V6aqjdznPedIV36zNheC+zS7Z/s/iTk4JJEMAIwbijGiQJ1D2gPS3GE/dPSe Dvqhs/c0xcXJGIqpBQDOHLavEW17Omhfowb2dAo1ngoAw9RePDmesqfvQbopKGrfvgJp7mRyGGTH 0ABAc5LDA4MBYK2E7PIx0UnQePbT3qyYQ2JdnaFaCrrwIBwkgRCQBgjABKgDNag2B0SgCF0EQAJK kFKCMthfw/0mwr4CoOcNAKPST1tAPgCV0ByEk3/aFKE+iP4A9OeTkyjJ+4/+WFRoqgAB7QYT4AB8 UC+yQBXqyQ74gliQDWpBLzgPboF3MBaYHMwSFgErgQ3BbsB24BJwe3gGvBe+gcAi9BAURC/iARKP 9ETWI9dR/ChfVAdqG62CzkQvMwgwRDGcxXBhIjHzjEKM6YwbWC1sExOMKYzpKrM2czcLD0shy2fW WNZHbH5sG+xu7GscbhwbnH6cj7niuHa46Th+XB+PAc8abwwfhq+T35h/S6BIUF7wBj5TSFZoXbhI RFvkFaFL1E+MX2xd/IiEhyRe8qFUv3SyjLEsp+yW3OSBcvlQBUNFIcWvB+8qXVDuJlaqpKuGqbmp W2joahK15LQldcR0RfXE9aUNFA3VSSQje2N/kwTTArMm83GLVcvX1mw2RFt3uyz7Xoc1J6Szmku4 a4vbugeHp51XufdVX24/b//OgDdB+uSK4AehGmEV4c8izaK6Yhhio+KuJehQuqm4pILkv1Nj0x5n BNA2M32z/swh527nJxbsFpXTRYpHSy3K7lfQqvirp2t9jsDqexucG0HTUEtgG6595Xhhl1E3rGeu r2DAZhA3dG9kcCxr3GlSZhrM3JmdOnv0fMZcwG8Wi8RLhCW2Fdjlj1derT69/mhta/3xxvadt5s7 9zAPeLdkHus9ddmOeUF/1fNm6d2rD7hP+p8jdxq+Le3u/joLv87Cr7Pw673wv++Fn9z4uAbA7neI vQd+2uAMEAMFIHDM/gPLsvdZZgziQDzEMgqIAGEQ2agQXWQAGSLMHtUoEOeoIBDy2EIlGQTt34dD PhsoGwN5SBH3aacMFP6j1CD+7XEwGsoE4PTfdhP370JAItQGBSRDZTBQ/MHfH6QDCBg0ZEhHg3/B bGCzcEV4K4IDkYf4iAxH3kbZoS6gVdE9DC2YOsYybD4TjTmJJZY1jC2A3YvDmdOOy4LbCKfHQ+CF 8z7iu8jfJ1AuGI93EVIXFhD+LnKfsCDaK1YmHiZhKCkg+V7qinSvTJ6sr5zGAc4DL+QXFdoVaQfd ldSUOZXfEq+oDKqWqkWqW2pIa6I1t7TmtTt0snUD9DT1OfS3DeYMG0lUI1tjKeNdk1umI2bF5mQL XUucFdzqpfUtm3nbIbtG+0IHiqOfkxVEIVFXFtfPbo/cVzxGPRu8sr3Dfex91f2E/JH+zwOuBU4H tZHpwfEhwaEeYbbhpAj1SLkokWiuGEzM19i3cY/j7yRcpSwkjlBbkoqTU1KCUx3S9NLlMnhpCNqb Q5uZS1lT2Z05GbmOedJ53/KvF/QX5hS5H1agI+l3ikdKikr9ylTLYeUrFfWV5CrFqi/VizVVtb51 MnUfjpyvLz3q3iDe8PrYdGNBk32zYPPjluFWWpt5O1f7ZkfvcWqnQRe26+6J0e7CHq9exT54383+ /oGsk86D0oM7Q1eGj4+kjtqPSY59PXVtvG8ie9J9SmEaNX1nZvQ0fTbgjPpZ1rMfzm2eX7gwMFc7 T/uNvGC9qHJR4BL80vbv15aml9tXui73/TF0Zezq1OqZa3PXF28sr129eWP99q27G1u3n0L7TwNf YOmwz/B0+A7iEOI7MgeFQBWgMegSBhaGKkwRYyY2mSmWOZTFn9WdzZHdisOEU49Lg5uIk+eR4gW8 G3yj/KUCIYIGeAH8e6E/hHtEcgk+oppinGIvxWck6JIeUlJSH6R/k6mRDZRTkts98Id8s0K0ou5B poMbSt3KVCJJhU1lU3VALR369uDReKg5qpWtba8jpLOuW6VnrY/SP2eQbqhq+JLUYxRkjDdeN6k2 tTFDm62aN1mEWipbfrO6aF1t42srY/uX3Vl7uoOLo4jjc6dJ5zwXB1e86zO3Cfc8D3tPvOczrwnv XOg04H2f+Y375wTYBvIFbgUNkw8FW4bgQu6FngxLCzeN4Iy4G3kqqjQ6KEY7lj32adz5+CMJsRTT RHzie+pyUkdyWopmyqfU8TRqukr624xhWtwhhUMvMvuzIrJlsp/knMh1zUPlncoPLuAumC9MLBIr unY4h65Mv1dcWWJQ8rq0ocyo7EV5fYVhxXZlbZVe1ZPq6hqdmke1FXVadQ+PZNUL1k8edT76uqHk mPSx+Ub/xq9NR5tVmq+2RLdiWgfa7Nvettd1aHbcOZ7VKda52BV+gvnEULdz98eeY72k3md9Vf1a /fcH6CeVT94azBmSHVodThsRHfl9NGEMNzZ1ymccjHdOmE88n6yYIk7dnM6YEZmZOx06i4X23wyU g3WYKCwKdgr2HW4Br4ZvImQQiYgzSAzSGSWOeo9eZGjARDHqYzmwW0xTzKUsgaxqbIxsd9nHOFI4 dbkA1wJ3Mc6Bh5vnNm8rXwi/HP8bgQlBGp6E/1OIJswvPCniIvKOUCGqILokFiGOFu+UIEn8KZkp pSC1KV0qoyvzQrZRzlpu50C/vLcCk8JpxaiDggeXlXKUNZRfEjtUPFXZVBfUaOrK6k81WjRdtbBa F7RTdAg6l3QT9AT05vQjDbgMZg1DSCykCSN/Y0bjERMvU5zpqlmpubkF0uKcZYaVutU760GbCFtJ 2/t2zfYeDgSHJ45DTinO+i5olxXXWjcfdwn35x5jnuleRt5Y7ys+db5efiJ+W/59AXGBqoGfg86R C4KtQthCboQ2hlHCrSLEIr5EXo/qi86N8YpViWOKexh/OqGGEp1oQhWgvklaTG5KoaRapAmnfUhf zminpR6yy5TI/JK1mt2aE5Orm4fN28jvLkgqNCniKnpweJieWWxXgi/ZLp0sKyh3qhCpeFk5U3W4 2rVGrOZ17Zm64iMe9ZL1fx293NB9LLfRp0mjmbP5RcvF1vY2Wrt7B/E48/EnnXNdl0/c6n7Y87L3 cz9igO2kwKDkkNKwzojZqNOY36nw8feT2dPMM/Wz4meGzumcvzTnPH9vIWrx70v5S+zLzQAkhqoQ 94kAY26B/tkYd3e/VQOArQLgU9Xu7vdhyKe9u7srD/0Tcf0byelzOubX8ysAACAASURBVHgB7d15 fBT14f/xSbK5ISf3bTCBcChgBQT9qpwVL7xAxXpUpVUr2oelgrYq/dWjXsUTa2vVgveBYlUKWJG2 AkVRESFiNQiIciVAyH3s7737CcOyVzbZLITNa/9IZmc+n8985jk785nPMTMx69evdzqdu3bt2rZt W3p6eqdOnTIzMx0Oh/5afBBAAAEEEIgWgeLi4piYmJKSEk2UlZV16dKlffv2sbGxjrq6OhWBWpCX l9ezZ0/N0hx9FChatp3tQAABBBBAwEpMTFQZl5KS0qFDBxV8+lRVVak4dBQVFakUzM3N7dq1q8q/ mpoadzlYp2oibAgggAACCESNgKqDKgjNR2VhXFzc1q1bExISHCoSjzrqqI4dO6pgpAiMmv3NhiCA AAII+ArU1tbaxaF6AysqKlQWOtLS0lQx1DJTCvpG+/zzzxcvXrx8+fKCggIt7du37wknnDB27NiB Awf6Bvads2bNmn8uWfLJh8s3rndF75nfZ8iIEaPGjDnmmGN8A/vO2bx589q1awsLC3/44QctVRem iu0BAwZ0797dNzBzEEAAAQQQCC6g9k4VefqrT1ZWltpEYz766CN1DdpzveI/99xzr77ySof0jCGD B6m8VGvp91u3rv7k0+17dp9/wQVTpkzxCu/19fl585a89FKX9MwBxw1p37VLjGXt+G7rF59+urlo 19jJky++5BKv8F5fP/zww3Xr1qnQVrOt/mrpnj17VHrv3r27X79+I0aM8ArPVwQQQAABBEIRUL1Q H7WObt++3aFuQ/ULqmBUjdAr8rznnnvy4YfHjRg5bty4vEGDMrOz1Ly6e9euY3Lzlixa9MTs2epI nHLxxV6x7K8vzJu38PE5pxw/fOSEsd0GD2qbkaVFJcVFx/bN+/c7ixc++oTldF4YuChVKbhq1SoV eKqDamBPcnKyopeXl6tQVN105cqVyrPqpvbqmGh9AqWLZ/+/t9RS4B7YlZKVM+D448eOGdkx8VBI bFw0+3ercx+ZcXrqoVjbIVxH5f9mX/Nwv9vuHtcr2rbsECKyqiNDQJ2FKkdcfYQq/1QQqmDUd8+8 q0X07y++NKJrt2HtO3atrU36bmvVtm0KkVBT272mdmj7jqXdur/94kvHDByohkrPiGZa0ZfNfeGE np2O79++a3srzdoWu2+nZTnTYur0dVj/Ds6dHVfOfaGfGlj9NbGqRVQp9OrVS7VV1QXj4+NNOa0c 66tmalCrGl27uT++a2dO6xBw/vDhvNfbXnX3Kf2rSnZu+PjtGX+5f4Z17oK1Dw12NR9E9lNd+v2i 7zrrqDnosInsOsNOvWbbO397u93pU4YGuVhwVn+/aF3PmUfYloVNQwKtUUDFin7olZWVrj5C10/e 43DWtMrFlStWZOzYNbBz15Q1n+3btqkqIy3WUtOmUw2rNbtLUrYX93fG7t6xS8H69+9vE5q4+vrp ihXtSncOHtQ9K+7zuG0bKvclWDGxmu+sq40prc50VPbvZu3duvvTlSv9lqPffPNNamqqKn8qApVL u7aqCbXiaqbaadWw+/XXXyuMK1l3nu1s2BPMNxRR6qDNsk44ZdKUKX3dm3nDlOdumDDz9ZvnTFz4 65P1G97/M9AvKC4x0aGvilBVVWbFpbq/7V9uWeowdyQluUIc/HFWV5RVxaSmmjpmTWlprZlWOr3P vnvT2e4UPaI4ndVVVTFmXQdm11RWOBOS4u38HFhy0H6pqSyttPanX11WVrd/vQfCK58xjiSvzGvx QekcCG62t0pDxuvnOYtm3377OcdP+lH7+AM+NTWVtbUmjCudhD53b1pk0rRT0nwNpjuQjlmg7aqJ TUqKt4PZE0Hyc2C9duig+Se8nPA0P5bmcvBKTYVg/V2DKmDsj1am6U+XfpCfnNqxeHvS9u+sLd/W bSqs+/475/dbrS0bnVu+Tdn2XYdd2/skp6x9/wM7oiZMXE18vfSDfkeldGpfnOYocJR/5ihdl1i+ IaFyQ0L5+uTKz9LiCzp3KurTO+Xr99/3jG5Pq0aooq5NmzZqwFXJpzqr+asAmtD9/m3btu3cubOC mSj2eu0UmO9JEbU++kVX1I921vb2u2jGzL7W+sdeX1/hrCtfN2vc5DnzX5rWQzcH/blYi4vX/OHC nrm5+bk5PZ5aaX45VSvnzujRo4duos3pMe6pfxcatMK3Z42b8dLH7z/Vs3defn7utJfW7ChcNLlH jqbHTZu7ucr1Oy/8+x3jbphf4o5gwq9ZObdnz965uTlX3fO2a3WuT/GiOdN65OTm9e45bdasq3pM fmmdiWGWutPZvy4Fs9d1Yc/e9rpM0B1r5l/lzqcyP2vuv8vdc8sL3x7XY4aSdO/fkvkzlOt1riXu bZ/7/iL39ub2GDfr4x1VdeVfzcoZt96y7pqQ37PnDWuUkarNT00b1yMnR0A9Js/6+PsqVzrl62f0 GDf/K3c+/abjWsGOt2e7tyuvd4+rXjpok1xLD5wH3N8O/Ina36H7nHlgO/dPsb1GoqU5+ObKoSya 4tHrb/nadT3adWwXF9Mmo01yVmZSerojMUHXtHVV1RXxSQlxTsfu8n21sV98sc5vCvGF6/qe1qFD x6K09JrE1Oy4lMzYhERd3DlrK2tLdyXHFyc4Svbsy1q9sMBvdJV8agJVv6AuQlX/00eNucqhAldX V5uLRD37RgWh3+he28LXKBUwP139BOzfcIf/+8nYu28tLa/WrOpdBcufumH5tbOfmd+7V4pzy73H nvH4xXcufWT89n88OOmCK/M+emtEduXukh5/nr9kYGfrXw+PmX7xu2cW/ixbfY5Fuwqen37O82Nn vzw/dfWzV08/4w3L+uXjL//SWj3p2lvfuvL0nw1ILy9aV7Cum1l3WdGmguefOuP5vnc+M79r4SuX z7pm7LkF5/dO/PRPP7/qnuUz/vzWxHzHe4//8lar4IRq5czOrWu3hLKuyq/fPO6MG8f+cvbSKSeW f/LqaVdfvK5q/vOXD6ou+6HAKiyvB3DuKyxYnetOv9q97Zctnzjj8fm/rHp80o33Lpj4/OW5F718 338mTR9x3zPn9O3YLcHprNhr9b3yraUnZZZ/Puu0q+99R2EGWM6qb6yCo8uCpDOgsmDhNQ++cd/8 pae2L/9ma3yc1yZF6a+NzYpiAVcfod/Ny65zZjmcGR07pGW0TcnKSm6THp/sKslqqqsqU/eUJcUn Ju8t+r44w33bhW8KWdl17dpb6e2S0zIyHW07WUlpdfG6pV8FaYVVnpy0OyE2oSy7xJmd6YrvG13t ovpoIE+SGqwcDs+CUNOao5qiCeA3um+CzIlGAdU8XNdGnr+Bsr0lltU2TrMczlLLuuLJZTeNdjWe l65/4XHLumbkwNiysnYDR1rW82u+LRmemT7q6qstS22ee9JdzYcff1tSl5mqNBX17NdWPzgo3arJ GGHd88a9C1af119f2oy17klwrdBV67EsV9e1fr7uom3408ue/b+uDmto3PBZz5eoZbP8m2fuWd73 xhevHtVPSV94+4NLn59gag6e+yKUdW1Y9qJlXTTzF2e67hkadfVrNy89b9Yz6yc/2M2pZkmna2Nd x5ArRxlGI9a1ARf98Z3fn9VHm35CX2uRa378Ucf2Vwrd+g/t10dbW1eXnHfp1XlWZWlpRe8hfa0P TFz3htXn0386dao5an2rPykcNnHEccc5lJKfY9hzI5lGoGULBCwI2w/sH79vR0q7jIzsrLS0zPi0 9Lhk16mirqKq2hEX74iriY2NLy7qMLC/36MgOa9ffML2pPQsR1ZaTNsMKyUzLj7RUrdNbaW1Lz42 JiYhdl9iwp6UPP/Rs7OzVeiqzNPoGP1VsaeP1q6znubro5Xqr4L5XXvLNid3zSVgzv/6CRw4D9fF t9HYZFevcl2disSuXdLMUhWMWuuc686a41p5nz7W8MxE9QsUL/vz/Vfe+6LVZ/hw1/z6QsUVdfhJ vdu6opZXVVjWmLwc95fqKqXpSlofV1ngLhJdcxR+wvGdXR0N+qIcuENUKUS3rCTXTH2qXTHc8w/k VrNDWFfJug9XWGMmdqhPyEpM7ajirdTdJGxZbercq7WsWG2haZJ1J2oNy+3ijlHnyKhfsWXyX1Wm QtGVpT1fPDrj5oeWfOna+gKruztziqslpqwPlE5y7sQXfve/i2674oXfWWN+/sidN/3YNSKcDwJH rEDAgrDbyBP2vflqUmpam4ys5LZtrbS2MSnJKsliyiviYi2VQqUV1eXl1V3Hn7D/8DzIIH3AyNLK uc7ELs42WTGKm9omJjnFiotxVlRYuoK1YuoqnSXl36UNOMdvdJVwGuGgtanyp48pC7UCBdZMFYdq KVUACsKD0FvdF1MjdNWI6je96KMnfr/EGn137+S6ukpXweOsqjZL66oqFebW11df2v/AXQG7P/mL SsEH3l19Rk7qptenj51ZqsBKzNXUV7y/kHPVfkrqVOqo7HAXf846U0yoNmqC14c3QUzh4Q4Tp5ib d+5xpWhZezd8vsSyhrnjeu6oENaVnDN4mHXf+h11dV3cMasqdctIxySVf66NWrJpR1V+F4dVuuGT FVbGaPcGmHzWb7tROjA/Ps6UnJX/uG/iQ0suW/zFgh4O6++X9nk53i1Zv40Hwu839EjHih8yeeaX 5037YuGfzr3p+sGjVl11bJrnRjGNwJElELAgHDJq1H+Wvp9fVtElua0zIyO2TaqVmGTFxcYkxNfF xMbXOksrN29Kzxo+apQ5zr02u9/wUz9//d0e5TUJSakJ6ZkxbVOthEQVhDEJDqcjpq7aWVz+w5qi 9vnnnOI3uh75tnHjRt01qPZP0xZq0le9UAWhugm1qLS0VPdX+I3ulRm+RqmAq6hbuaVgbYGqezVF G5bfM/3+L63RT992psrB+ipbfXFmJeefeL1l3Xnu7V1fu/G4bkk7CzdUdB7cqVS1PWvXD5u31G17 eOYClVM7S6rrkuMOru1pJXbVzz3tTlPFoOa71qO/HkHqvyhM/NEX/2rYhfdfdm3Fr4ZZX9715FsK H78/P5o2H8+49Xn2TNQdPmf4aZZ1x5wXTrnujH4VBe/NvHNln+vnHR1fV5vuavVd/MF/ew8uf+Ls a7WC0e4VHMjDgdy5ErKqXBld9sFHp3QYkp3mqHQ9V79825Yte79+96aVeuzT5zurj87ybBo1mavP 84EvlZtWvPN18sjjjk7tmK0k4uNcLTSa4IPAESpQXxCqdPHagF45OYUXTVnx1JzMLp06dmyXkJTs aJOiWyBqY2OryquKS/b+e/2GTpdPPSonR+OqveLqa6+c3huP/enijx8+NTu7c3anhJikuLg2ljOm Ni6uWqMY9u57b/XWxGOm9co52m/0jIwMjQv99ttv1Ueo1lElaAbL6HjTOBqVghomowAaUKNC0Xft zGkdAk5XO+iz0897tn5zJ900+7FLxnVJdFfRnE4tVO3HVeVyfTpfs+KNhFsnXnueq0DS5/Y3VuUP GD916CN3XXH2XZZ1/e03DZ31wNSTf7fw8ztc6aYrnium+08b+4vSdM3SxzOMx7SWusO41nvMTx99 OvXP895d8GrbU55+9cl5508tcUd1r7/+z0HpuFboZ10p+ZMWPlny46lXvHyHK9boqbNnXTNEKcV2 HnLfpXnT77hCm3TpnY/d9M/r/uUa+OnqOPXYdme8q9B2z0/JufL60VPvn/re/XkvrnrjpMvuzHvr 1kvGv2zlXXrLTZPueuCWK7rnvHGJwx3XPQImQDrO6q23XHur2YChU2dPyE9xrZQPAi1SwPw4fcs4 k9n6pbpvPVDmdXfFPxYs2PnBktw2yT379mnfsVNcfNyOrds2bdjwVUlJ+omjf3zWWXv37g0W/Z03 ize/kdfPOqpPbofOnWOcMTt2bttc+FXBZ862nc4aP+HsINFVF9S7EnXjlEq7du3a6VYKbcm+ffv0 Hik9Yk3VxPz8fFUKA62d+Qj4Fags21tZ40hNS3H1Obs+tWV7S+NS0xLj3FNWYlqKqy+8eT61tZa7 b1upFa1+4uTLHnvwnY/Gdm9q+rWVe0srHQ4NItufd3cuK8vKaq1Er5lB8u8SsDfTtfWW0dDBmOh2 CBL3wKLayjLd9uiTmQMBmELgyBGI+eyzz4LkVoWQHi760QdLS9avrdy9U9XG1OyOSbl9jx81Ws+/ 1pM/g8TVInf07z5a9X7pvlW1NVt1R35ySteEhB/9aOiYUKKr8NNd85s2bVJSKgJVECpBVQp1E70K ac0JvnaWInB4BXYsvW/MDf+95MoxiXtWPfXqKuv0u5ffNSHl8OaJtSOAgI9AzCeffOI1U1VFz1qk buYzHXVqkzQhFUCFkOpqXhH11Suu5pjoGvCiG+Ht6KrJqXnTb3g7jMmD7iNUCuoatKMrgOJqpIwJ 6RXec6amffNDeE8ifCL6e6gtLvz3io83bi6qtBK6Dxo5amiuV2UQ/4j62z91nHG2fwz2hOevwvX2 CXtBoAmVSa7bF9yNPCqQ9FESgQL7zg8/ujoItXatVNVBfRq1dt/8MAcBBBBAAAFbIOCoUTuEmVDh 5zWnUV/Dj86gmEaBExgBBBBAIEQBx7Jly0IMSjAEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBA AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAA AQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEE EEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBA AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAA AQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEE EEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECghQnEtLD8kB0EEEAAgWgWGDp06Lnnnnvy ySdv3Lhxqfvz5ZdfRvMGs20IIIBAaxNITk4+55xzLr300vT09Na27cG3NzEx8Z577qmpqXEe/Pn+ ++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 EEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBA AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAA AQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEE EEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBA AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAA AQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEE EEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBA AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAA AQQQQAABBBBAoFUL/H+Cv9H45HlGiwAAAABJRU5ErkJggg== --001636c5a72ec471a50465b9a848--