OpenBCI / OpenBCI_GUI

A cross platform application for the OpenBCI Cyton and Ganglion. Tested on Mac, Windows and Ubuntu/Mint Linux.
MIT License
723 stars 258 forks source link

OSC communication problem #1042

Closed thiago-roque07 closed 1 year ago

thiago-roque07 commented 2 years ago

Problem

I've been trying to send band power levels from OpenBCI GUI to Max/msp through OSC. This was working fine until v5.05, but with both v5.08 and v5.09 I was not able to stablish stable communication. All packets seem to be dropped.

By using python (python-osc), I was able to receive the packets from any version of OpenBCI, but for some reason, at max/msp this is not working.

Expected

Have a fully functional OSC communication on the most recent version of OpenBCI

Operating System and Version

Windows 10 Student Edition

GUI Version

v5.05, v5.02, v4.20 - fully working v5.08 and 5.09 - not wokring

Running standalone app

Standalone

Type of OpenBCI Board

Indifferent

Are you using a WiFi Shield?

Indifferent

retiutut commented 2 years ago

Please share your MaxMSP program @thiago-roque07. This is best done in a simple Max sketch and sharing the compressed code here. We also need to know what version of Max you are using.

It's important to note that the format may have changed over time, and I'd like to see what objects and how you are receiving the data in MaxMSP.

You could also share the errors that are printing in the Max Console.

thiago-roque07 commented 2 years ago

Hi Richard, this problem is happening even on the standard udpreceive example sketch. I'm using Max v8.1.8 I've heard that Max have been having some security updates recently that is causing problems with network connections, so I've been a bit apprehensive about updating it.

retiutut commented 2 years ago

I was not able to replicate this issue. Here is the Max Patch that I used:

<pre><code>
----------begin_max5_patcher----------
24901.3oc68t1jqibbnfedzuBrcbudsu6Ynq2UgMVGgzHe0r5CyZER5ZGNjc
zAZRzciY.InHAOmyLNt529VO.HAHdVfD.EYyVZ5Ca.Px7clUlYk0+0u5ad5k
juFt+Iu+u89Kdey27e8q9luQeI0E9lr+9adZcvWWFGrW+XOsI7KIu7iO8Iys
RC+Zp9xIK1kbHMz6eLYa3lWVFk+.aNrNZSbXp9MCytXzJy64ke7agLbgGU9Q
j+rnrqZtT5OuMz.kO8zm7d52cHN9ODr7mBke4+mYO31fzkuGs4sm2EtL07rb
fXA3Sd9fET4uopWiPK.d+mp2w+6e0uR8qOcY38+xe529sZLuVDFTCBSqGeAs
fFDlBzIbn5eXrKBOVGteevagUPD4C8WODdHbezuD5AApepEkP0fRn5QIXirv
1XZDglQIvpeCQ9iAWK88cG5qDp+0D4xjHgTMNhgiAxcX0V4WXXzmk7QDlv8V
tYcPZuUHACFe2m9yw5q9zpvWCNDe76rYBAQSGfDvXPH15869c+49h2H6UKMn
.NCSJfBEeOg6x.7LH+ad50n3vOGtaeTxlBvx27Tv1sEt72T3snP2eLQ+AI9z
wKEswbIzwKsK7yQ4uevwqFrSB4oRv9vNC24qLxSm9XRVEtaygHMnXtnjvmAR
ZR7l.oMisAKMuYEmH+1mnELpVTlh0pq9DikJewIpgjG9Vbhzj8phP2SJ2EQa
jBr6C2jFjdFvmKH87qIaRUVlzPojFW28eMCDq8lJjPC++lcQAwGwf21EsJYi
BHJwJTWN+q6uH0VM5rEQF8SrIXaMuYozjjtzvM2KQxC6eIXmhS8hQcImA9TZ
RRb4ac78EG9ZZ1s2FsYyYTwzjsMeycQu8dKu2WRj2bcae156r+4CaL28YoPQ
5y6C9bYpcZPbblhX4O9uFrIRZ.JLMxvBPfi2LbSfDQee+xcIwwkvWyc9bM2Y
kTHeY3WhVk9t9Kpnvf7wi1lKD8zQt7pn2B2mV9ZoAusu7UNY95zkN7RlR7yo
gq2FKwhxOfT8HZe592S9x9rGLWPqHA3TDVEUpKZUqz0Oy5l1r0QE1FBwnhY7
ydCUsj2g07lcOizF53Fae4+tzaaYx50R04RjJM7sYU3WKXnIyPelMmARdJY7
uQ27M5CnBgS.FHoKZSZeodDtXASFgEi4a9gwkjzyB0Y7oOeqGpQxCpAxCWLA
jGYXABI4AJ.lePXM4gNFjmCqeQ5i1VoDN6oRnxNoZepzLgwt04Jl0tzFSv.E
crIVT7MIghn0GVeNTHg9iWl0pprbgRuDr4sNo5TyRijTasWaSfL9SmXnYkiP
6EEIO0KZbsTldanCBqJKRXSsppLBIYnDq712hqfFjUQD9X4LfBI5v9jKYCxX
R4nbZj+mjqZcTnQ49VpiH8CAe06yAwGB8dM4fjXEj5gwKDjC+qK79tnMdFcc
OD06SdIp+cA1++2eo3GUbzlvkx2a54xP8iPSalPC5EkjA4KnbAvmjQI4BohI
y3rEOgjx+76gdaCC9oL5YfjZJQlsGR8hR++buWrLpGOs6bupFPKQDwVSDQCm
HxMDJFcACiQ7LZHvW53.B4FOuSmN6uDuPF.osl0PXwDXViHk2JQivRUVBZpM
qse6NYbAu5Uil6+8EnWOSw8+d7p+i+Cspq5lsn41nPGtIZ9nahT5PshIRnQd
k3Osxjwx0OYu6VoivwTtLiNgErEDFiwoGUdkDO9TKWpHSI6R891APlPSAYh5
u.KIND+bxDbzHSqODmFIEZV0yvjkgnHui7iv.w5vIgfyWiXw.4f9Wmfour.8
jjTVEMTe8hxX7yf9S4hhNQw+oxk4y+XTpjtjpRlgsKXwumKqs3BRPfRKHoB4
UBNOuNHcWzW6wZLzDRnIAgPBOO+2UeimxXZYZUiYNsormd1autrn1PlTaNap
cmQ0lxpZoLq1irqdVFV+VnPnW0A2PAETsTq+4hl0mm0djq09ju0Ny4ZOy6ZK
4dse4esibv1YdX6LWrcjO1tyIam4ksG4lsO4m0lbz1RdZ6LWssmu11yYa64s
s0b21T9aqOGtMjG2dkK2dlO25yo64lZN2hek62kk+xV+iSBVoJbqG37GoIa+
ma+mTyardO.8HN2lLxCgXsccn1cuzTUMqmnjqxxtKuThnAnGJEBA4sSi.8f.
3axgFjXJrY84Gusbj2PdxGQpVeE8fCmvhmBgOhIlBe3bH5IiDZw1uH4aIeYv
jIfe6jITWjoBgi8o9pwRI50S3SoKToB.hxWNgJW6RsXehufSxpRgORElLaAV
8Z7wKV4KZ+OuY4TI9dUn77YfxS.HisReSB2uEH1cXqPwKLjAOh2x2C1IUCAx
0WAFNmgNKblLuXTVg0rLY1RrlHCYp0g58qUk67BLSCXyoV.xDjOWLoz5WNHC
tdyvIYUBqpijWLDueUpgWyFywZi4bBdgp9An7hHnpdpoZLjIhtFjlt6PzPoq
P6hWnzhUwKNmbqfkr5LJWvW3W+4e4I6C3n80x1.CAALA.JiKFaH+FoabMwCp
zue93pizYKoJDT2xs0qDUtf+oxGvExZEhwg4lotM0bV.1X+hhajyVhwcCvf7
GGFz9sgKODGrapXQPNOiEk0JwTP+XQ2r5V3wgwsJ50WOrOb54aTwGC9FzmNN
btf0uDUt.+SDmCeynw0ifseKdQrJMsdp5t77qulhFNilcUYziFizGAKt1THD
dhQdCnNwGG0IMgdp0kflsW.xrNo6ZqfiTjgaS1Goqqvjy55Np+6CVGZjh7HP
UkkIOh97vNbmH5Kum8p5kZYbX03papYUpn2g4SRsgnHtpAt4bdkjSf42PI8A
hbpj9PXlDmgvh7L7Lg44oKIyvcA6CedYRbxNOvhr+ObwfkUQvooNlB8VFFhD
lls.MsBn8hpNTZHgNEjPJMixw7MsapqkB8sAK+IORqDQRKBhP6xUdIOdftCj
eHoRGap4LS5+RJ6ls1KfqVzhKrxPyQsJxHvbjnhGL2uFQHppNQWXMh3yGUWs
YhqP0m3pE0CptoRzmRUf2uVOPExj1890xEinZFV0+M3nsuPlfNzhdS9AltiE
hPl3g43IkjeoIy1RmcmxV8xfAUMg5lS.pUR366yoY0vmq1g7loQBDcSQM4Cj
ZdAKAuuDTnw.LkcSQPQyu3o.4u.cdq+.g.7bHfVcKoc1JckqyZWf2xfMdIeN
b2tnUgduE6onKQxk0UMcAsxJd4vK0zWumyjHH65KvNxtw.yoTVFYY.4pnQL7
wcNNVsywMMrBot9Lzfi6kDpaj5ORniUZ.i+4mU8k+zkGvLdFUfWvE9D4pIyZ
hKtJ1Ez8REiIiTEiS1k9dxzwsx55KpJ+eRULHLiaQI2UbKJZb3Vwga1+rLzx
oqILfL+7lu.s.wQDFLeqaAUrL1cCKajLI9ZvtmWFGsc5XXYadIJfs.AEEFpB
p8Zm.d2vvXiCCaS3jywLyd.nbwqKfL4ZwyiRDn7gItarJxE2I8bHjYJbkLNJ
xBHvG.7K1R+n6Fihb+6jxEyLIGWtNCUfGDBAUbG.jU5g6gFKDLRAdjj7SASW
SNwPhrYVY1RicGuV8qYlxVC8uVg5WgdZRbIkBA2uRg7V7yJrPscq+z0mSxHx
vGYXnHeW1.ONLrlrVd5JrMl3yQ14yLdwjjqJa4f6jczjxEt2udUz5iEQIXUv
1TOfpZJgx68svETNPHu9lkumr64uptU1q+Y0qSd808goxqK+.FL2kcApYnKu
hiCSEiXJCIyzbBDefKUulias0cgAq7d4kf33EqS97P4PWR7HnIq2N8QYqYNa
CWQHtVIz9qoJtPTnGFA7jFT790eNIVqRcHMYeZvNsp2gMQ+0CgUKkYSSvM6J
wF8FTYyGvxRfEOKUwlIEjKprsJ4WB2cIJaXvMg1lbAXhxpahGpaUaIoaRea4
UFelz25pIwzrtA2jX92HpWlc7JL6Pi.Sbp9zaeZx1gxAnjaivILCkpiL.rKY
daeXrDPkluZugmvsvE5vxD9B4B48hSy8jykwUXY6iGpKwV9qqCS2k3Q.CV2P
Lt5F0270WTPYYbB1zxHRSdql5w0W2xT+InQ2Oerv2IgLaL46Ts2Z4faSd+Rh
rkAuMb8hLC36iQ1hQOhrsJyDcKFYKJeKPcCrRxzcAu9ZzxKRiieanwkkLsGq
krUlo3lLOoYqiYlz3trJ6QGZWr959ffqSSrhDYNg7KMyHbusiwqul9rplaWo
sACgL807gjUuZr4Leap2DFWgJkQPyHUyWuDYR1F0jIpotwNTAv14sTZPS8Ws
QqAsPqASw1MT0Vzp1lPvyppnPu8M8oUpJIk6RVFtXxK1eJHu0uGAjz0E924j
2IYuwqZKR0ITrjdNyhqckQyU6B9RZxQuXCMAN3ai03RX5sRa9voTvbQdQ+5f
m1XFnaClAgZXFlYKtuSktg88xPSa0yjcAaxHz0YSFcjBmcX95eCkqRB1gxUo
zdQ1D.JatG3VCkiWODGue4tvvMd+2fC1pgXRlDGGojl9wi6Tay9eJ7mGZfEn
NhaizGYwOU2+XEYEvQUCgCT8fVcVqgmGhOToTjXR2r7GkVyNS3wNU.Cl4D9f
Ikb7MwvKDwE5kBROdzFxT62drRnlwlzl5sy4106Cercg3jaC1AvbR0Av4rCh
qxNHCmWPuMlqmpS71F3EYGu1XGYg65iD5swAYUDvSQL7VEsdnCrITW8OM4RY
Qepv+MlrKfdMoHJZR0c5cFti17ZxfmrMb9DETYU5pvjFaN8FZ9gf3vAV4kAO
s7qsI7nZKHP.FNGEe4Rog.mfFBP5T.RLYbx8pe0awK1EtYU3tiIbx6WuR8J0
Fi4ROlen7wsnsW41qiwn0jNbLtlicEDvoVBfEMeeaw6PuMZOXt.TCeBY5fLe
rCph84nUgI5vdJnlIsxrYUVVr7fJ0tsoum+2CWoiAtA6TBNGVGK0LmVwHmpi
XR8dQ++5dbs1JaBcAAtNfVPN+eMP8UxfIjrPMpOH4S.IBQmmYSHWbmsMlx1o
mC+LUiguezwn4CZ56pdIGwH2LMSdCpQF+Y2TsVNhQcn50z.cE.buNMus3DJG
WP03FhC9YY36xWbbnzbblrOX9HYFNfN4P9ByHD3zx2kKBUK+SDjakv55G6Bb
F6RUHrKhgMCcLHipKrruYhrQ742bmMy343rYFoN35n.HOer1oFLIB.bA+7Nc
6Cyn1nxj1.RaXTa7sP5v412j8Pd9fR2jfXGaVan3tR955fsd+5nMeNbmLp5g
GWMzm3bm+BBJoZKnRI0L05gNWDEmwY.WBmA6dbF0oo6YyKbpYdg6f7hK7fIw
G4bz+ZCutNMCp6qX.FthAv4XL9Pcq9H4KKX5FkHudXhSm4ifah0SBItT6+gg
Z48R0WTt.kE5IJc9fa2mM4MF3ERicokrCkgAqmSljBjSWfF2gQksA+jWOMlf
aanKdICXXYPz9T4GQNQxepJGCPuxkxrLLtJKKa1KBcM+.CeFYNCK5tVpMCV0
R+Dm3vK7zWTfcoSeQLSnM0eZPliM4fpxEcKyPWg.M4NX7LpsM8YA5SPFCLh7
iyAN2ECz7RYFt24Qn.Cqtd3OHbC2aMXb.3CK2v8xHAkWK2nR9ZuG4FtWl6T6
6sJ6XfOHbCpywMvHtlviyOFD3eb3FLmiafjetJZNKOWFPxGFtA28BvkuPEZK
STHwReLXFLeWM6oX.oZAYu+n+tmiBNm9Ah96dgMwnejj+cvEQ.8+.Q+cukTi
Eejn+tWBlPLxGG5OU3bzeHgoiF8X1V8EtA2nysceb3v228P5jrGUQXT0ZHSk
T7y6YBrys6ItTIc2ySqZuwqjkAmpX5MgfNAHgkAKniQ2DC0.p4bXjA.U4GN1
.l303jfTLZ3bjaiIvBwbJfbKvQfW.y31X9qfI9MxLtym4GPL8lalejwtnLZM
rq6wY9ADylh3oxoqXZ0BuwotVHTuFEGqlO3a1DF+79nulplUeCu0SgibqZbM
O4hpoENvxXbqteTgHWaIdYi38y4aPyjdGV2vWqzQd.dv72Ydw4WONMCWWmHS
LSLcGU+bijGdIJmnaGkSS4m7y2OZ50eVqxI.53JmZl1DnYhuE0LqoJi0pYZl
FqNqh4qQudoNNI2L5l01tcMnb563Jm4LtIP+jdCpeVOqtNETAWmuPPN6G.cY
00jC6tT8UwMi9ZsMjYCQ5Jbc80bN2Dnv5eCpvVOutNEVynQvYUQSeO5RUQQ2
NqEs1tzsAUTpiqhdjyM9pnnawXdqmWWqJpauZzzuDF+4KY8nH5MiBZdia2GE
TfqqfZ3aSf5I+FT8r1Vzu9Pdc60jFFG94Ky+4sSHt4cxeodGuA0SWOeQY7sI
P87VL.2Z2yFXFpFum.2164EoahuchsMeecTZWCTqtoOy08bNI5k3awZrT6t2
oV8RtaGUaXzaumdAZl.9sSQVfYm+VYCg278lqfqOhEbc+jZF03qNBtEcSlyZ
IhprVSSH3rJf6uvvVA2NU4LaeE0fBnqW6j8STbpfawr7jyZqSAT.caEPIO9B
T+tcJjIi1r+Oee2umelBcO1MntWNesVmeHGuQBtnLpBtgJ4gYOE1fuOpy22.
SRFTA2hKELmyVq5mamTFU4kGt5mO71IgohaZsOEaZz09l64a7EwXceeea89c
QaV8CAe84+mAKe+2ZXsC8PNWzQsJ.svqPU4U0dFIPxli2lDif0JIX8jCst2c
3tyHUmQqjvPjJS+61GkroFIwu4ofsaKb6uokOJEg+GSzeghOU4VQaL2BU4V6
B+bT9mOnxcC1IoAoRBvgcFYvuVYzPn93SVEtaygnJmsCZQoyPIsvgRld+1fk
lOTkL04OVAeIFZNPmyPFw38P.pRzkBmuEmr7mBWUGx7Tx1vMQa1tKbe3lzfz
Fv4mVE9Zvg3zma+XVn7y8ZFlz5C0pd727za6hVkrQAj0JIntcN3HkDMmNVz5
HB5mbSv1V9vjpKRxaGOzdIQ5v9WB1oDPxlzomK+7TZRRb4GoxmSb3qoYO11H
oBd8bmzjsc+P6T46q6G6kD4CstOem5mX+yG1XdpmkxloOuO3y0yMSChiyrnU
+W6WC1DIMmGlFsNyrRkGxL0Xee+xcIww0RuLOwma4IVI0YWF9knUouqAj5DN
ku8ns4B4OUQZaUzag6Sq+doAusu96rO8mML4Zt0gWxr48bZ35swRpP8OnT6O
Ze592S9x9r2PthQcDzv8FA9uoUae04Vp1mqOSG3NCP3bGOUOAWxbAz4jBtFu
T08c0uIFbicyf4LEilERWCSF3JAATMPfqIku9sJa4nCndbOh9+Q8DdX4+h8.
YWw2izIaC0Naq5T9Znri9yJxJ7kugUfa3vMbh4ERL9kvcWpV.rxRet.s.TuH
6exRMArIfMJCaTHbCpecgHWVQ3WhWrNbUTvlKVjWzCQ9dS6sltmczQhtUn65
iOg1+ecq0v5hkHlbqPDSwGv5ds.xYlz.beXEBOxVgZeE9WICUbyYRAlZbWzv
Nxv8TX9eHiEkHtXqTUl7H8TkXH7F8TRwZFCRaCKaZHM2LFIJHoMWtlCY10bd
MY25.MolMN5UXRA1GAcqnWIe9n0GVW8jXc.5VzmlL6dFcqOU+4rTG7Hj.U3b
lFbm3bhcG3bhIDencN46pNmxYL2iNmHv6dmSLi+nOxNmHttyoLdzcoyIJ5Nv
4D0rml+n5bh5rqbJmwbO5bhRu6cNQovO5NmnLG24TFO59z4j3dv4D.omg7eP
cNwfNqyoLFy8nyIF5t24DgxJv99P5bhgcbmSY7n6RmSLxcfyIR1AL1GUmSTW
04TNi4dz4D+9ulS3rCNnOvNm3tdZ8x3Q2kNm32C0bBCEejcNU4vg0YbNkyXt
KcNIt6cNg3nO7Nm7cbmSY7n6RmSBvcfyIDh+Q14jvYSqWNi4dz4j39OsdRIq
O5NmDtdZ8x3Q2mNmtGRqGzrIi9v5bxYSqWNi4tz4D6t24jf+QueHDbG22jgE
cO5ZB4e+rImP4SzgOVdlv.GeONg.h6NGSX3Gks3TF26iniIL51XGNAYh6NGS
2SavoOpNl3N99a5tzwj3ix1a5iriI+aic2z8niIB39YyM8A0wT0o5uy3YJmw
bG5Yp5gYx8mqo7MNyGWWSUOZpcMeSY7n6QeSUOjDuIcNY1CMeTcNgDN9la5t
z4jCjH7IZyM8Q14TexUtKr4ltKW3D79YuM8A02DA43aso6QWSH9Gkc1zGXOS
8InOWXiMcW5XBe+rul9n5Xh33aqo6QGSD5Gkc0zGXGSD1swlZ5tzwD+9YOM8
QMadt9VZ5tLYdjOJ6noOx4xidarglbKGSKSVuNThDswiTmjhdouG5kyr9bP7
gPunMdwQ6S8RdUcHY5sMQRL79c+t+r213jTOo.uDUyOTM2uv6OJEmkuo8dLf
26+h5c+8+u98d6Sj+8+n78+OIMtp9R13sLYymC2kFJ+NSjOVZ3ag6V7er4e4
P51CoYe26ByNs81a.rDIbrcWhTZQdMuW2E9WODtY4O6I0gV4krwKLX464vRc
3ZoizS5EZtoGMiCnuGvV5EYa5ZZpdW8vI2G6y..89YKv8AMVFD.63aAt6xfY
33OHaAtOzAybarE3tKaZFnuqebCJ4r9T.fiUb.zM2QNXb3kedCBAyw4MHhpO
3y0D9LeK92JD9cRTOzC5gzG3oTOlG2S34KQDOn5btW5zzCR7fToLU25P7NRU
UeNKa38l+bI+W+Up3KPp0PyLwzQbBFaeVfVxqutOL0K6ju0a+1vkQuFEt26K
uGtKTsLp8oA6jqKJJVtPm2Vz4JfPW5lNYXq.5zg.86gwaUmf8OGG7R8qXqFF
n4.zCXNT2YlSU.bOYeUOryUDjddDQqgE0y2O969jC6VlKdmqrHUKqSNcU39z
nMGOS4+KmRBu20Rt7p.8LKfd0tUwsfdtMPOx0fdrEPupuBbKnWXAzqmLDtE3
6aE3icMvW572B3m6bZtxHWrA9oNG7aiYe8r32sfeqDen7FeGI6VIW4lJt.Gh
2fsB4bNexVoZ3dZFDa.eh6A+TaferyA+VQ9U8QuaA9VQ8cOoeqrqBAcaWE5F
3F2VbSHLVxbCvmYI36VlkXV5TP0EktCzSrk16TAKgGjfOxU.ejsDenKQ7gCh
3icEvGLHvm5HfO1V+YXWJGEXaijF6Ron.aq+VrKsJFLaPB9LWA7s0nI1kLZp
gdqD7co0.fs0lIxkRsExePB9bWA7E1FnoKkS87Tj2eQGWxhOBaK3CYNknOfN
HYe2A9sMR+iXrS.+Pg01d7gNE7as5aKZLNV5SrG4ZicdD4P2pHGq4fycrBJb
rxkVv4XNkZE21JJHbKyZ16Vg3TvOYPtEENC7aeBvPNE8Gas7ua4Vz9bfAbJ3
eXIAy2Ufet0gUwcovZMvucMaA2ofeq8+xcJ+u7gkKLn6f.V6.l6TNf0vuUJ.
LmJ.Hl0zelSQ+YCK.HHzYP.qi.h4TQ.wrNBHlSEADy5HfnNkGXpXXJ.HmAAr
cIjGyklCA+14AysfeqCgfRcN32tlZzsn+V6.f5TN.nngY.B6LHfsvuSE.j0w
e5TdeI1S7cO32JxuSsMmfV2ENPmpUPfCrWPTcQtif.Vq.fcJyOX6U.bJuuXq
895TsiyQnwVE.pyf.VmAWjaYAEXqBfSsYKgV2WKPmpwVNBMVp.3LN.rO7SfS
Q+sO.TfSs7En01efNk8Gas+SbJoGf06ff9W9wpCuA8jjnmSugMAqMCcheygU
QI+ozfzC6e9GB2bn5XmPBpuFbHNseDgWdSMvMVlDmrql2PMuiu4o74dxSl20
mp4QN94oF3EHeBDJTSHPLDyQL8qjufRaPUM68Cy+.HThO.odaDFhSzCaPh.g
oX8XGrkOBzIX..8Mey.eAfXdk7RPILzzGQvl2Li5CDu1oTkThaWx1jc4BExO
R+Z+bNjl71tfUQglIWRkt8op7hRduF46cpoI4wAPRM790RFeTceG8Q+orP15
nuNmBWGIXcKef4LBGpYoBBFpYtjV3qWAQiyDvmHgKWWt4GB9pJU9+wv2NDGT
ikgoCRLiZpuK9P32BuTo3fkKk.cINNFpD4T7Y1QaS9YRgv5mlOyNw362EFtY
TnF.E5SwpeTuBxDRyztKg3eOLNN4KWNkn3XL7uHk6W.n9.P8iJlZnZBDEpEg
3BnPa8R99oJuaNHgSOzB+9j3Uih.jRyAnMfR8QPplp.KZ.c7IFm8cb9WvS6C
9b3pmkROgKSeNHMcWzKGRMQu0B9pBab4tns4Fwq.TOsJ5MYjk0eu2hSdIHVG
Ua3ti7hJOVZvalwv1S+pl8MT5uJy6KAy0LA3JiSkm7a+XT5hseIZypjubFb0
5rXq3bXSvq4c17.Rr5v2SBCOuNPxQ9ZsiRuZOp2gjEB..PD9leHRm1TgdBgR
nRcS4kXXf4GU.EXDaAWdQAO6MHpL6FdZ+OuYYk1vejn60NJEOMr8Trk2Tyf7
e8tjurWFk8uVpucX8l8pwc9udabP1bzyizNWi0BaiYGaqzPeEedDO1yUUedm
BXcWTv4Sfu5OLXkrXI2iyx3spUiHEBVn+67KBjKVAwMCJ6JyluQhgJsljlrY
n5PLPUjuyIAa6CA6pbjZm9q0NjJYlItKL6bgmj+6IgRlMgIaT2.5AakLiZlL
SexJJnsh7WIgbDBqODGxNdIYrIUPtKx+x2qrxfdS+gnaCFfZdG6rL.xfo93a
CpOfKJP84jIk52giYy7MtfCXE96sJZcqLERyLEbGLExkxTZaJEeYLHLmpONf
nHWhCoBcxD2QzlWSFpCYL4oKyYaubzdjRRzQtxo0OMnGwX+ec692NDMTpDjB
F2fHuhRsPNyWQqoXs3pvLHmYUSu2SqSVo+nw0709ZfohCfaD9C71g+vDL63O
n6.9C4Fh+.zG2M8m+PlY9yg0UquV+c.Pu7Ujg6h8nNKTZz2bsmtaXyByf5fh
flSqKiCiyQkzv0Y0lT9HO8spui2S1E8KRlfhe68zeuLpk+B3+7eP85Oop5d9
ioNXzhVV3gfmdHT9CsJba56GeBzom.e7IjWG+eleYRwKSNdYZwKSOdYVwKyN
dYdwKyOdYQwKKNd4mBSWt3I2XQSIaVFjJAOu+aCdwqPp+MQ76GERMGXYBeWK
5PCyXvrAF3FLwY4VuyNf+l3kzpx29E3kjwupB9Jnw.VGRSVFGVMeFimpAybv
g3qiz2uvBmpQf84uDsRZiUc.nwqfDkbld18hSV9SSUhruTVqXbXsRfRojGNc
bVAdAl6CPhrbPyPJOyvEHNgvIYUcvW5uSv5KWGdmx0GIdtNtyIieax5AjYNh
5398jopWouaxT6Qh2QzA61jPtIhdgPMohQPlA+jiZt2IraBF.1XezMY.CO26
D9sA0GfJP8uyy8NjHt4R9dNChXb3bOl6cHAOEIeOmRB0ofehy8dOHjpVuM+3
j+4z22EF5AFLIEdIc6AXRSzHhoOO50wNq5dGXdG6nZIQPCGBvys79YLJj5u2
4UaDSkNDLwClgxGWF5njEhbVKgWk0JD5Fzx+3RkXlSk6aft2ABDNU66fXhEH
DE3m0raBguLRJfvP6mzl4oCEnTuW7pMCL8mzSuvtOTSVkh3Fv3BnuDno7Utj
ejeIdwOlDsYnQs5eos1Y+qrAAXZl.YfmZSCn7l2T2IHtDMUIyFOT4UewURbs
mTUDWSUkAqVwfKF3XRp6B+7fET8mNA0LRpLx6pjT+6Ike7jQSQDiuIt+8sxO
cRU9UaLMEUU53+9V4mMcBpYjz5Bf8tR4WLcFTA9lPltyU949SpxODlsR46bk
etXxDTyIoNfx+xj0qqt2pOQS+bT3W79bP7gv8dQa7BLYM0JQ2WN7R15Vaaeq
zQLB.6Rf5.aGYoMYAjRNteuf5DEQMsHkgmQmJYc8FsbvaCH1kmGgdIv2+bIX
xyLDfYKnpMdEMSnWJySASd6JuLLN9EcMQswbwm2ubWRbbczthDexUsX.KShq
eO3UggDGsOs8JEH+rNV.YL9pT+5L9JD.Lkw1zPJ0LsCdRsCD0HBhd1cduY55
T2qmcU3Ns8uKn46XzonjDG013vpZaho0o8EYHiiFhgrzcQ6WFjcuE9idmQWu
UvgoOQI5DqRLEUxreNltxxcYLK7GMlEQtjC5rwrZOb3sA+jWxqutOL0CzQA+
vsvSuM51FHgnW7GAahVCAtgzaX9ezzavbyFSFvt8LxA9vwrPPiGI1cqQN3sg
QtrrFRLIIXpMx0xHdY6tv8gaR0SEwhSWESSsJfldakAN9OUHH8uQusLMMajq
sHLbScJkEg5dE68.FvL4Ykjo5NnyhDuUBxjNDYtHKhU6fj6cKhHH6VMFcn3i
FyRkRh66Xzg2H6mur7dOWwn2yNk7kfcdngpdgtgliAHSdWoPeS6q5rbC7f4F
2PSs.BPGjDEwbbtAbvbCzsC2HKpMmU2HqYgU7CRVKBy7pM139wZtEmgeGYRB
3BhZD9QxpaGVUtN9jxx5pNpP1WkLHCI3Sd6S79Rn29vPuz2C8TksYu2W1Er0
KX4tj860Wce3xjMqT6JkvM6ip1Swk59a1f65U6J65ogp56gwaklDBeNN3kPa
b2vDfJbKyN0Rvc08LwWRF9NlfRuY1vDPxY0l0Wzv1mvW356dBIKCN16cB5s3
VmndlbcshhdbzOcachdso8fdHOrzkG0i4w8Dd9pyLbnhEqN4FgD0IHUWtA4s
zAfcUsCtU6Tug7e8IoRTf+BjbMs9llExTwPmcKmkr4B1vYWzfGah2uY9ZEKe
PthkeSVO8cbqmJNFYzsdhuE23Y0wiqy3oLzT8exlicgll92pFWKsuDQLISrR
SG4Z9soORw0kF77.qqYf2KQyUgecpxQ9UX.2Cq1VduDr7mdS5Zayp5dui+7u
+33bRXXDY4jiL2UjnyAXQm60u1lgB9vIoIrflp6.qNT4w7I0icWTy8oIaufd
ZCY6b0ZXzSep5DVpzQufpwCEzZNAGl1NJ8xlhQHamcUGGTQYEr4pPcEpnRNu
.kHpP6FiByjcoLUtUtont7gRcMlRkO41CoWGZb1LAx2LLZtwnijARFUGXhOW
yvUYfFALcgBDiwURiDZh2yzWFAk.GHA80CwwYM0v0wOEPXFAYPyD481Rtz14
gzQx3mi1Gc0rddhFRuA0s6Z5q2rn39ffqMAzLPnusHfvAqLuMYeTZMo2efNw
Q0r2GgfrgJHDcK4uALTRZbzaumpnKWyvi7yhlGXJS6Mlua3PUvMMmxy+7URI
mCAMWwt9QQK88nyDUkSN4xD5lNLnOibW4Pf12uty.5FN+mUC3D0YX7fDEFLD
JrABq43AeZfPnSCgbKngH3b.gLa3x34PNjZCDxlCZH0F4vYABIpi7f9Bgv4B
B6KMjRmKHruxgzYiF52SHDhAyFatuTQHRLavHr2v3rILBQ8FFmOdces5.gyF
ut2jQ3rY6FR5MLRlKXTzaPDMajQZugwYSig2WPDvmKPr2TQvrILx5MHNaBi8
VkFLKxhXaV5xr.gHKfPHq9mNY2pvcCutySHrCaF1ASKrCsYAYyh5kMhtyQ3a
Bqfv4fDJrIu.vFVazQATjKC6XWxvfkvdGF0vtLrCZG1mViZBqrGWOnuNZ01j
nMo6OdLpAMigSQVq5fN9mSr1L2F6M74XgXZHD5zPnMhHB+YHSobaz+3bWR8y
JPGBaObno0hMm3543maSn7bxbH4hrEBQcZ8kRMSOKbVE+K7mSM1Ac8kRwA1P
+gygDhE.3bjkNlusTvtkfwl1llfMGi1E+yoF6rh7OGdmY13.gMGq4iYScLYy
QhyX1XmhMGqJkAFRX5SKHZisdB0kV2rUfN12kV1rUfNzoB8kZimCpvkn51A5
r9rnYenddJAIT8Yvlueg+zY3XhA3M7VDzcpTlaEnSXtjgUq.cD0kxoG0lH+f
Nl4I6gcmoHKTa7nQminE0PXeyXGYN59RpMQbSmipoSI2tdRH2tdRH2tdRH2t
dRrIKjPAwoD1sB1oXmRjwdX2YxsN0l7BSliLRPsImI4rhoEBsImIyAIj3ey5
DzNP2obBZEn6VNAI92rNAIVsopliv5IbW2bA0Jt+bDVOg35tsH1DT.dNJnCw
J2VLmpYhrC1obmxufMhtygxE1eHUXYZAQgiaCEakQdxb3GBSsZYKyQ9kv1nq
fmiX+0eo8c6MU+tX8r5yfPD7BbgeHB8wegt4ZPHgvbzkfUUqY5Q0dKuf6EtB
xQGywoNL6TfS8myA10+sjXuvN0QWBqvOT8QYdFthLyl9YAWsYQ+34nYevPmG
BACX0cSKDZUuhOGPHxp.MliXjQVURz4vADxptlty9gA3z.OwkhiGwsJFO9rn
gYUaei38JBEHlnGYm.b9HQknFXx3r9HYAt16MKXNr2XNoedzQKHJO49YdzE9
GwbDi1.UYVvbTuw79EolOXgZnMhYYQkBEJriovbYHpKTyzUJOGyYY2axwbny
uxUjUcB97rxPDSLjTCMwvnUVeYyhuYq5HYDad30VUv6YoojOx8bZ4QqpjpaE
ISCa+c2RWBcMS4KXF.drSWREjUaPvYIXVq5F5lLZbVfMbg+BdkQtp5vNS9ub
AnoaN43t6G0vMPcCQDxM.L59fnc0eA36TFisB3gPWpwLF.riblnLtARHoUwX
LKPHzpPgmk43.BZ0lcddHiNOiFXUl6.yRtL.za3z2ZGvCbqET.HCPEyUH7D6
G0.Nh6Wq.8lbVOScFoc.OD6XB7va3xbYIv6X1IccWkPqNHElmHKgVcPELWvH
8F.FItdrkP6FrqXmZ+VXGvaFOhNylYBZ0PeU3TcErcvdSqNX1jZFxlzxUH7v
q4VObpI7CXL21Q2c.Q5ACBEPMGna.zw+bpsjZ0T7clbHItAB9P39ciN75NOj
AtLvKbp.7gB5MfzgMgkHlGkLjy27QPgUi2MAbVfQqrCLCSJSnUC64YhJZUm0
NWvH2VkZwjChLaAQ+IGDo1BhvomSSrFFmdsZqcwnNdvlXXDYMLhmbXDZMLRl
bXDXMLRmbXzV+fcOuiQHZwI1cw+bpwNqFmyZN.exAwQ4HqvGsPv8AHQduxiL
mXEX4EEB+revkONKN6lSNkfOFTBtvfd7xGdG7YPXzpkuQcpyhGaAdnSs1SKA
dmZHT.YVG4EaxkrsNvqI2OGy53tl7vEXVG10zah15ntl7fWsZ1xicqD7Y4bw
uWSh6it7LNBK8mNiAZq549d65W5jOKxFHB3Cg4abPd4vdN6lSs.qUSUZAaNR
EkUSfYgS0RO1A6cdR7M05EL2O+ZVMdlmKXz8SruUyH04hLZEHNKlpH2.YM2p
oGITOc15bqyig5CoRNWeHSgYri+0rfc8dFGQX8B6D9KfEGxQB1QbkPPyKth5
Mt1qw+.Qx6DEGMWbnB6z4uflykmgzWPtArya07v7nd3DCit+3i.Rr1P+juNO
ql8gb2pQ1v7q2dS.5vfdmsc5DmDSrUgSimEUO6FXl3d4RAS0q8m5CziPGAOK
E+pY9HlomPf0buYAy6cfC3dMQgHXV0.GpkNPjgXPcG5PuCp.2qoDIEhqFTA0
GWkNPykUvyNcvpVlk6X1IsG3gti+IqxCIdVB0ypw5XSsuxbIcL.f2cjNrZbU
dDUmXXzpr9wcqVkc..uCIcXU7KH9rHc39C+DncCxBtasaWF.v6PRvva.oCq7
PiliYoFDZmSN2pxKC.3cGIX65tc3r3g1tNOj4VMTz..dGR5vprf.mE6a1UpI
tiIcXOv6PRGVk6W3rjiLncgW3VaA6A.7NjzgUUoFNOwcXWpW.tkzg8.uCIcX
UTovYIuQ1PemEWe.65ENemR7c..u6H9BrJr4YYX3AAVE4IXVBsGX2Pd1sR91
..dGRBl57iQK.0po.+r.hVEBLXdfQqhhj4Vk+X..uCoiYUHvfYIDXqFEfMs2
XlMoC6AdGR5vpPfAyRHvW4QIToOpm1m9ywgYccPSP9lf0Z.5oeygUQI+ozfz
C6e9GB2b3oR.kDldM3PbZ632Ku8ZTb7xj3jcm8fm8jeySo+7Vy2q4o+zY293
mwewCr.4SfpieJvBLDyQL8qjufRqQbK68ByeyDJwGfTuEBCwIT8qDHLEqdEn
g2N5z2MPR30ei.eg5H9R8J4kfxu65d6AadKViYHtZSWe1c2tKYaxtbNq7ixu
x6+PZxa6BVEEtIshRSY9sRj7Lwvcx2klsqosmwCWKYfQm+Y1lXcYgi0QecpD
JNR.Zm2h4Lhp6YjuRPvPMygz.e4BYqmIPNxBEt.O+GB9pZfW7GCe6PbvYZni
225lvuHM18cwGBUFGsWZKX4RIfUhaggJwDEOhczVfeljCrZyaOoH52uKLbyU
CSAJTipapL0qfLgzj27ij+6gwwIeYXX4qIR.K5WByGnEK.Te.PTwmYMTCAhB
0rct.JzVIjuWpxCvLRPNr9kvceeR7pqFSWIICzFin9HHUiwvhFit9HZgOyhe
fOsO3ygqdVxwCWl9bPZ5tnWNjZh.oF7QEmyxcQayM7U5K+oUQuICCp50eKN4
kfXc.Wg6NRWK8HoAus2b0eUUanGe0I90QX5oWR9ZAf8Dr9z5futLNX+9BR0E
9JeJM7qFPMNIX0KRq8EuojmGsINzz+mvB2HZk98bLa9kdKIGRq68XtbtiRYn
g5ushpClfQi171y6jrg7sjj13.Cp+s90HTQYiq.U403DIXaMhqppRQXemjkl
Ft64vMAuXDJAMRXPEtyqI6VGnQWVajKYHz8ijA4lSpd4+nZVYDKeWIKCDUfF
EJnw3f0TPUpauFTvKlVw0jE53Hd0hR2uDuHNI4mNrsQRGpIRG7ogSZ5sHDgr
PvXTNuvtdmJFEpz5v86CdKrVxjLtUBARflvenLjz8fOECQTOzBejOSH7vK7A
L4EjPr.Ijg+QWHn9XN0SsS3juR3wWHTuEgzsp5Y87Wn+vndRaLbBBJ+TfvEb
nP9lj9qY5uBOHdAK6ZjELhLbc4iQWneerEL.TCO7ETt9SGJVPoDEDA8WjAiR
Gb.0c8PvEpO.4mERc7LCTPEBuvbExBINpfKDUFHsFYPrEX0Wt7o3KvlGSr.i
.J.C4uPg5xqgkDHNVAXX3B4aCiVfPZ5DFuP+vxqQV.4FJEcATi1ps0.VSqvb
oiWMwBK4tBM0B6uvPPkZEZvwiHMBadmxW46qIXDICPCCDICfnIXRgF08TWSx
C70DLhjIntfjEP0DLhXglMIul+B4BQT.FUGvi7RTIWPSN8nnEbCdSwRNilfQ
krA0GFUxDXZBFUxGHZfkxWvfZBlZGHnwHpjMv0DLo6CEmQIR.WPQZBFCsP9m
RVfQthIYBFlFitfXjrXrElObljGXjsXRlPlvkubA8FoKU75xmhKYAF4KoUEj
Q.iKYCFALNYgg1vkbAi.FWxFLBXbIavHfwUSTB4E7UADo.LgjKXHNBIWvHfo
Llq+JE3E.i.l7U9FALgjKXDvDzEZPUvV3aDvDR1fQ.SHYCFALgjMnei9p3O0
zKeIavvb8krAi.lZGcH+axBtQ.ymtfa.BeISvHf4KYBZz1W5AxHf46ufYDvf
.IWvHgIQsEY5eRtfQFCBvKnvrqJYFFoLHPxMzPBDH4FF4LHfufXHlPfjgXjz
jxHKzeORkZrQVCJ0pwFgMYzJx06ZTOkJ14WTxTLxaPolMxHvAkZ2HiDGTpda
9djZ2PiLGTpdCMxEPoBNzH0AkZ3Z7rncLU50VlbvjUDLzVS8pY6QeBvp3BND
EWqdMNA5xA.RYMhv8kq6Ham6nN93kZRpSM9Ry.EgwcfT3555OXYx50kyixI+
A+te2e162uYU3W8RS79c6B+qVG4Ag2LMEzkuQo.LEA7I4mzppkqjMkXfREKp
.hyoPjOor9WOk4HOPKfTJammHV0ke1BjrZNRNqTa29exCUYCeI8MQUAeqVQN
StDzLrBIEFZ9d8TLvZLq59.swNZ4r8j8UFN5OEl2SJLUzLEtl6MVXV0FypIL
qZGvz.lIcXJ8AfIHTg4EYy2azvLXewLbkIOQCXlLXsEpIiILe7XhTXFTeTTz
58jA0Uy8zmjE0buRPR0poMajo9JZWO5hHMSJxtmLXnZtm4yr58pmLAFExTMy
l9VISvQRptlImdiiWAvHZQrllisU5ApMwFYbVZqdl79HiTyLxRJ9WDyLagIf
FgAxhwCyX81mCYT4zj9BGmuQLttvQ0NEr+a1hw15kE.W0wk2nayfA6sjDeL4
fTgUbvQSht2wZbDhGG3vJ86tBjuZeKbBx5Q+JTSkTJ.6MTN5h0kn4dSXn8kv
EzSBWPgqatrys2GBszCBEqixm9UcWEopUPpNwsV5yfqGyrtdJXX8SvkvRFbe
DXEybp3WM0i.WuugWNjllrQ0O.8WlXXU+eTHPFv+ObX213Ai.RCJDecUc8Y.
tvXrPZ2fNEHPFj9r4i5zmRV4XpEApoH0LpT.WyDT+XXGYl9NSPuL5qKXYoeU
5YU4xR+zOGs4yg61GVpSHx+UiTIoUtLcppHQXb35JkZWHgcs0ZgbUSByqHT.
B0AZHwVLiHL3sj4Q0hgLgzFie02Z0d5nSLwHm0K4IlJuzlueoMGCjvkvFj0A
jnk9z1nDJNm1NIjxDL7EJHBsVPrXyS7PT7gn3USTrW1DWGrWUe8yMIlW60oH
REKX+mGtR+k+mpnU5anmWOssCqUqX3AiZBWivcgU5veIX0x+V+sRKNt7NAGP
EByqTqsnaqz8m.L.iz6iixRTS+PjQhcT56fvfPfYsv9HFIqkFUGaTCzay01u
4v7VAMbCeJv3mpM1xaAQa9aiBWoJ.IXPBQX5SXeDrUo9UA2ER8+zHJ12gP+0
HlugpDdAAZ0O5ppUeOD0qP9rQ+6BMVqCpqMN9fsT0uu+WOrYYt2ytCEdTE7u
ZqBKKF2JaagoHMcCOeaGiFCxnbhIAeRGLTi0ORlpAm7wMwqY702RhWcywTaa
CP7AmqFsIZcPbe4nGq5yYVl9zY+1+LWMWsBpbxH3YunCIf7fKJ8JYfGnqbx6
6u.f+PVTac6cs7b+hI4jj77Aetag8xPFz9aZHVLogOHWiovrZTIuVoOg5h4n
E.PFmNosfNrfqXiq9l7DdB.oZDT+pifJWL1IE5TzFppU72Y1zaiPQKTCE+dk
YLFWXpIIPPDvIobG0u6MaG0ujcr4XiDn6Aj.eOfDj6AjfdqiD6R9xlKRy9Dr
exzLdVvBzcAVfuKvBxMNV7a+4fKSs.f7olDdx4XLhaprEDBwSGRX4Z5G33GX
zQ.zsNBfu0Q.xsNBPucQfeH3M4GWvEoFKH.FyzIhLfDAzlkX9Pe5zgGUGYHs
iF8XLgbAiHjwGQQeTPT7GEDk7QAQoeTPT18LhpG8He2kE9mJ+h5ztgO1npbp
pI4mNL36uQCfs1wBk0veuGETiMRftGPB78.RPtGPB5MNR7GuLs5i6EE3wRb.
PXJxeJvfsAaBi+WiRhCSmgsXUaa9AvBzP2jUvOxaxpclpT88VUqe6zoZp5TL
hbkk9YY2hyM44RFhi+jjmKUQFCWEkNRXtpMqtl8ujc3c1mQ9GPWyhwLTrwYv
XcyewNl8hmO2EMhw5eaXK5uyBCtFCLz1.q4zvp4Ou6mUiolWi1rxK88POI1s
K3sPujW0+4x2C1HsSs26a892R18SdQa7jZeusKb+9E4eVkGfPYWrt4bSwYbC
MOTl5GuM0MZaDPy3Ajn2l8PJzra6yYyVRPJM26NQO1586jjheigJ7u86+CO0
W7A1N9TbsKni1ypCM4954G.xLONjg9q9GbA0+mxDTNWjS5bHToNjIxkObgdJ
X61BWtjhnjj7iFkPwmNdonMlKcbhO8ztvOGk+9OZI9ofcRPOUB2G1YDX+J6T
TQOsNQZKbyghs.2QkvmzrAkf99sAKy1QeIG2cpOUXbFgLi8PBPSFDBtd1JPn
ErFJskDmr7mBWUD7dJYa3lnMakRppD2kdFzebaOUjunkup49ulAi0dyS6w1c
QmZInmdaWzpjMJfnDuPc4BKg0vhKgL5mXSv1ZdyFiNMby85sr8KA6Trpr4SI
5nEjjj3x2536KN70zrauMRpqWlJllrs4atK5s2a489Rh7lqa6yVem8OeXi4t
OKkJReVYfs7yEDGeZWNT3i+qAp1vJMLMZcld0waZlQmuKsAmDGWBeM24y0bm
URo7kgeIZU56l3JJvusvX9Iq0k128mcoCujoE+bZ35swRrn7CH0Oh1mt+8ju
r+L+BEI.Msa962PLSaPqwgSFnggS1.mmtcOUOwT8XWRqSfA4+9rfdLdwNazD
KwjUges+ytiKeFu8mBS8LqAQ4o7nWRIaJrwYqGxxw.GQL3o.G0PKgB8+XLZh
wNwfIFCcy4RLkpc6h45vJ3BGZVNiQtIIiPXZMVWjjgcSRFFKV3W3Ggf4nDPh
aR.QHemUli5nSbcDpfkMe5nPxZyY42GrdcPIZSgnxKBnP0Hzm.ONT3gpDSwL
yUeoSLtOTklire3eRMioKGePuXSr94Vs9UrUA9O+aRg0+3g8oQuFsr1GnNeO
pCPfywaJtC7dh3deWXZuXd.FdgBPqi4wnZ76Jv73NGyivHUw6LlWy38Dw79M
waeuObOeJn7wwfpfiWclmuyw7vTXU71UXd+426mpmfvJIANJLOBv4XdHBuJd
6JLu+4v3dw73py4.FiS34gDRFAlGz4XdP0o5v438Tx7JtMl6SrITrdVuh0Ih
Tcl.n9mR4tqUtw9vT4cjPPghUnNsAJ+1KxytRq5aojmtJPJKdNOoEFZONWVj
3yw7ZA60RqyxgaYR27wPADcxQlPFJ9dgglsve2hg5KMnTYo0SH2kbuvcqMGE
tEuVfDSrtK8dg6lk.E2hexQvI14J6dgelkcmwle1xwDWpWrWrsIKCwFySHNL
xT+CesXkQh2QxRHxQyRHgizmzaGoZS+4MnRP5Eqom3mF6SgwrhowTS4Io6PX
9hR3iln0HbRnhfi4AgZAoGibyHcNL1Bg4vlsAK+Ios+y9+VSnZIQGsppIsGH
UH+jMunm1wPHSihf3SMQ8e5ex5y9Sw.kyh1ze5g5bM77SemQRUrsS9Sg0DG9
X08DXt9HZB4KlGa2a0sPXVey0HYA2.YoEa3ztjY9TK+SeLsqCPvTpkBG+vm+
9Barkqans6Zp06N6sWWK30Pa30bq30c630TK4c9rRpqVy671yihL8im4.vlX
5UOQkyZi55Pudzkd8oS85ra85YG60RW60uN2qit2qyN3qyt3qiN4q6t4qyN5
qGc0We5rOa5tuV5vuN6xu16zu161u163uV65ul57u569uF5.vd0Ef8rS.qua
.O2Py4F4qb+tL1W1f++342oI+eslW618C1u.EZNOVlU+YNO1pK7fxaJjRtFc
VpGbhndHyoN+cF0CLUTO3cnrWo52OlTur81gSR8R8d4z+qUJIrEJoncJIqKJ
oIC.87e6EIGnWaoI0ObT0kOLhT7pkQuLI+2FGFryKX4xCq2OXJNucJNnaRDw
bLeZN.XyVq.vQHQ+lUq7h1XxInJdkgRkXWLUBQLKDUSk78cJpzuMHd4AUTVd
YKT0avDJ5ESnLmVrF5DDHlTBU0jZTlPsOL0CLX2D3KzMQuLXQxpUT1NEgNoV
rFW5GZRnel9YAxf2czO3jP+XbyVrQb2Q+.SB8y2H+gI2azOj+TP+n.lopTyg
96TDiLh5ZwHm4xYVhQdbkXIShDaVUrlEKlmuWWac+t1ZsSGM5ChqiVlvZdCv
VYSvdVb+pQ4fdcRpnbS1UY0RG2mrna3zPflpj3j0LMNYZHzb4Vof3lofP+IN
ErHsLMg3RNotLJnXhSC68GEjOwoh89iBxl3zwd+QAoSkcPpyR.S8fduNzXzg
cD3HpODvZ6Fpl8IaRXV1N+dZ8IeQAQBuzzhY65TrJPRSN1+M8I1Q77Kz1id8
yN4XvktXyKr4+Zz4kjwQyWxYs8+27wD9k3EwgaFZT7P3EZ5nRif2buoZpBAK
aLHb+39BMwKDZV7ecQFcmrPjLkO0JStemzdtZA6KOVUpfMq7jfv1Co4ygw8d
x016EFr7cuWT2caxWJsgZJaYFNArCCIZnFZu7xlksjRroAy6IotQJF04oXjK
uhrlkPdknXDmmhgubJF7ZJigcdJF5hoXYKQ7JQwPNOECd4TLv0TqrMK+k6PY
0HIri9D834Ub6jy8IG1sL2QYlyVupv+pv8oQaN1a2+kSc.k2PCfXn.np0S6M
DRmC.DZA.RlC.DXCOdF.PUOJ1a.DMG.nRvmzS.D5OWPHtuPnXtfPTegP9bAg
v9Bgr4BBo8EBoyED1WUY3rnKisABmEZHx4og13xadzTrwm2rXsAYiSuYwhMh
ZSbC34BB6qEaLZtfv950KWsZ5gv9F4PtZ0zCg8M5Kj+bAg80uLZNVCP9Wp6F
AKxJeJf4vwLxJmJy..BswmBYNrGBsI9PxrPC41.gyg8PnU4rYNzkgTakCq5D
OY2Jy7a.3vfNrcPG5vfNncPG4tftVjtEPG6tfNpCpNYZAchsKEFN0FRH1jRF
zb.g1jNAzbD0BDYq.5jCg.aheF5OGrYfMKBAJlMPDaSNOlGPDYShilGPr2lb
5dsbkqjmdnxzQo7NMqiNrJJ4OomtPO+CgaNTtRh0bVsVCB1v4Ob0mrsyg3rZ
ZV3reUcR1C0m.wXHliLmOvpCnXZMDOaNMhqoZpWxIRr9s23oRrQRosSlXy6u
wSm3J76xClqVO3ZMk297Cu1tjqKKbrN5qSkPwQBP67Vr5TAVe..iOdTcSZfu
bgr0yDHGYgBWfm+CAe0Ch79igucHN3LMzw6a8kCooIa9t3CgCSVq7gXNTIfn
OfnOZEvOSlAVs6DmTT7ObX213qBR1xI097gj4ySOyGc4O0SSxslQxfkKk.V4
yvbpTYSyLU+XXqYlzqQoqLYBlcfee5WUd9AbngWGEUZ8NSWuYjKLNb84XGWH
wIs2IA.JDlWQn.DpGnmjRfYDgglHY9Tj4TQWZSzu92do2rcXnQ90JYTl.AvF
XRZuz.cbI7BY8.5zR0DyYWujaqs2CoLACeEEvgWj.94s60CQ7Gh3NmHt01vW
GrWM34qyDd9zFXth7yRQoyC+yN8roN5OaWRv3nkeXsZUfOXvN9Z9tq8zD9KA
qV92r2Si33R8Eb.UHLuRsFw94owNhyE3nI6.vwZDbjYek9tHLHDXxahOhQzJ
FTenPsTiqhmzwHVgg6MFZ3d9TfwObeXiuEDs4uM5bwp.ofAID8m.j4if8RiZ
UvcsF0OMQpTcnPMFwOeIJ8WX.p1wCBRS2YNEA5c3y1puekbvT7THq+fqsVPs
Cld8vlkoQ1t7iISAazVQc1ZJ99cggaprf5YJUyWV9hOFMKjQ4DShpkNPoFK1
jL0QN4QQHrP93sj3U2UBGpDRCxhpBAoZcWX1a+gzQukNhTmBHwCQx3X4aOyh
5mN62903hcTJ34Ii4m8hdHMkGTVoWICXCMREFyNgI+KM4F0rTVbd8OvjbxUd
MQpy02dYnUZ+qMDeqzPMjqo.vrZLKuVkOk5hOqE.Qt1IRWAnYImylPfZy6+I
fkpQX8qNB1bwbk7wSQlopF3e2+dXbbxWF4hBJwW+dmoVFWX5EAffHfyZIEMI
ARQmFVfS0oU4j0Ns.hh9nfn3OJHJ4iBhR+Hfn6R9xlql0nS32IWSXmBSQeXv
T7GFLk7A.S+s+bv0SMEf7olBDv4XLhapnMDBwyOhdA4UpNLUyMwpeLoeWs.B
WAIQeDPR7GAjj7Q.Io22H4OD7l5rK9pY5QP.Llo60Y.IRpM2x7g9z4GWMqRe
XnZwyu4+h9Dbl5C.hJqGuNRBhB4lzU.Elp1RkdhbGBB5AAoLAA+ffTlfPdPP
JSPnOHHkIHrGDD0Tz7kvce20KLdUt90o7FebySvopMb17ike+c7hULHXR7pq
FN1VUTcBDE8QAQweTPTxGEDk9A.Q+iWOKQG2KpvikVEfvRuJyIVtMXSX7+ZT
RkYZ8rt0taayKBVftjM2M7wl6teRF6LUY+6GbeUYmNdaUWmQXLreVVi4bS9i
kgb5Oq4OV0nEgqhRm.JjpMcGqdccXzmBelE+.eZevmCW8rb0IgKSeV0vuQub
H0LsIpgLnFoEK2EsMW4nzW9SqhdKbe0AX+SuEm7RPrt8rB2cjcT5QRCdyLt9
e5WUUM53qNwlOBSmcZ.bBV63344zQyytDIBuU9fdPOjG1i3Q8XdbOgmuGD3A
gpsOOD6AIdPpWoCiuyNFA3EtSgyP.+ydGEOWZJ9Vp+jO5R9uhhf0d1Dfo5yV
Zj4b+iUyQlz3R6See2glom0SNEsPNakZ1SpgPeF9kefl1.s33mU0yYgSjm5l
mLEHRUliL9mOKdZZfKc1zQtUdzP.BtK.DPlK.Ef9.D3wlTzCfPOTwfiHPfbA
ff3B.A0E.BlK.DBW.H7cAf.BbBnvIrT.cBSEPrS.ENgEK3raxRzSeo9inqTL
sm.AoxzR9o0Qq1lDsIcedrhPUrhXexBe0F0iBx9QkbnFu2XgWj9hWztvKDVe
FpVKd078FK7B2W7hzEdgIhED+S+HDrFvx99jiENi5KNi6BmITVi7xlu2XgWv
9hWntvKJC2ntWy2ajvKDquKR.LhV1PLWXUBn9ZeEV4Typhrq.tvGqReLRxQU
RpD8hy0+0XA980by3RDw1vJQiETzW00yGO0WWn.Xi.0XAEPgMxEiFTzWoSLc
rgh9HchIiMTzmEYfGcNReVjw4mhTWennOKx37SJpqKTzSgyl0SOkQ0py65Sv
UOly00TLmBPdCE.sXMNZtvmCcdVeAyx5KnTmMWly1KwYKk2rXMY9zup6JRUs
ZT0Ir0x7o95wLqaFPLr4P8kvRF7.mvJl4TwuZZ1Re89FpaNR2kLwv1akiBAp
9YDscHPemKziBBzv7et53Jr.BbQioPalPSCoh5EoRUFfWEPhKbX1cAC819NT
mJhIUFOeMKOYw7CafC2VaEDgVKHVrGudHJ9PT7pIJ1Kah0OOkqYVJOdQpXyX
1a3iT2IJZk9F540Sa67Yh7CF0nuFg6BqzUliwcXk1hos5vGDjCwHckQkYGHx
HwNF17Itudat19MGl2ptlCwEwlym+vWOthsyb3xR8mMqguUk5+oQTrumyQ3K
IlugpDdAAZ0O5Zk4Dbyg7Yi92EZrt9YB7+0UvRU+99qY9+9eMSB9WsUg0zr8
cJRS2vy21fleuenR7Zsyj2aDlpUyc2OVb0ymktsyQGz7y8ZVPkdOubufYk6z
H.3OjE0dQyD2Ked3doyB2KXN3NrYf6Pm+siitVGy41qVQKNe11Nv4Z6nPDpe
901NpeIyCywFIP2CHA9d.IH2CHA8VGINeVvZMVz6In4niEn6Br.eWfEjabr3
7Yup0HQum2piHRX4Z5G33IZzQ.zsNBfu0Q.xsNBPucQfZlQoViB8dtjNh3Q0
4OZ6nQOFOdWvnwa7QTzGEDE+QAQIeTPT5GEDkcOinUmGm165quyfyQDC99az
.XqcNZZM7264x2XiDn6Aj.eOfDj6AjfdiiD+wKSqtuygxQACpcdSNYawJalq
jWvLk7CUUgqcNQZU4orX1PNv4B4nf30O+GuZX94y7wKs+krCuy9Lx+.5ZtNl
ghMNOGqaVN1wbb77Y3nQLV+aCaQ+cVXlAZfgxyJvkIqWepQQNMn.+iQKeOX2
Ju+sf3z0Aa9j2+eIeNTYa0CAT6RbyiW23C7Da3XMRMEIUuoMyrtzmKUPxt33
HjW3KuvnHDT3a+GOrOM50nkG2Lr4fVMCgPrXAkopdsOPOuCj+sZNDBxkRtVz
yvkgQeV9U68cAaV48GR9hjT95tj0d+KaC27c+1eu22++526cXu5I9W9S+Vu+
vtjzDIUz6+4WCVeZyr8jocQNXLgglQ1.VLR7AheA9.FOP9f1MZqhoEvEV6nR
cPqdFYPz+FQzfJWTfPsNYUXwOh5bZctsNsuy7eUjpeteM5.nGuFmHQt9RP3G
YtRihR6NpseS3lfWhKgTkoV4BiulracflLwxtRsyY0WjjjmNghUIwTJcgek4
BDklSqKNrPGUhAc9oEjZmQRy.sf6.DCLA3FBFL37SLPYy9r4PuvALR.QDsaB
C56SuHzuIe2eev50AGw0cg6Uk7QYNtHfHizdgOjIcgkIVp18ILNaA.iwniJu
xKJ3K3pmDmeMYTsH+B166hvCQ31cXULgnnS9aJB5mGofMtpUy7K.AxPrrY8k
JKjTnlSzLxcEYHeWXZm7CLGngjt4GLpFatD9AZV4GGE8pgezLxcE4G+l3su2
ICAQ4KnjIhg.mUFBlh06qjYig7meuGZHPITNYZHfYkgHwl4UC4eNLtaFBfXr
qJX4j9wig.YyJCAh8WHgeNgmGDGYbXHE2TZc4Am5uPnRzIkhTjbjeNIWmBS.
Rm8HHsKx79vT4UkPQgzO0vhngPxvigZojEsJPJVUjT2.+o9i5hifjDjOl2Kn
sKIy2fgknOiKmBKYP3olSguk3T0ufwomSgHjoWmBcKwope0rSOmRcXrL45Tv
aINU9RsmddC.wmbsHvMkmo77.bk3MMEF2uKYm2lju7Iu3jjexKH0K88vRIzW
d+e66Aa1DF6AsOk8En+DqSIMQnmV7HnNIHPJ7hxediK0a613e1Swb81uNIIU
ADdJBv9kAwpWmlHoP6VK+ieIT+bWDY.OXxfuZ1KHMmByChT0XQ7KqnBkNXsN
6.MytCyr9PM30j90FJ90wmc7NRyp02EfYD4HFQtrbwccota0JXZ8q9lYRje8
jIZ6KtoahWeHF0J3w.4mwYk+HNMpLxKP7qQwgphWW1L427Tv1sEtboxlKIi+
noLRhOc7RQaLWBc7R6B+bT96+XeS7TvNIhjJwhC6LkW9qrS8vjtNV61bn3.q
3XIyeRy5Tkkd+1fkYyeyjiyR1mJFiiIuzXMEBhAZUTeFqPuK7zKuEmr7mBWU
D7dJYa3lnMm6633syGRgEYnp9+rt6+ZFLV6MOMQb2EcZC7+za6hVkrQADk3E
pKWngSyL3VDYzOwlfs07lMsHPC2bud.K+RvNEqJyWK5X89SRhKeqiuu3vWSy
t81Ho6mxTwzjsMeycQu8dKu2WRj2bcae156r+4CaL28YoTQ5yp1gn7yEDGeZ
ljU3i+qApglPZXZz5LExi2zDuw66WtKINtD9Ztymq4NqjR4KC+Rzpz2MUKs.
+1hVu3TuUTZJYe1kN7RlV7yogq2FKwhxOfT+HZe592S9x9y5hihDfll8186z
dLeLHV2w8nYyk34u.wX9TeE0..HTj9EPgzuj5EHBB23gBIp9CERHXrNUHoF6
nYAvPLQzMkmQlpHYBkDFo+a4uT+6hhOWcdtqR1XMP1FsCSSlOeA1mxonrTbp
l0TTftoVDRWRpTpULiZmbSeiSQ4ilfnLRRwGQJJarnnDA5ioLJcrnnXNZdkQ
KuNw5Ho50J9xO6oGNRGhVqWsn7yP9GqajBis7LJtki7YPGGBwpRKHvXBImBB
UdcHlyoYsqHB+JSzLPmsmCyrAii05aP.MqI43uOqMhM70yN3veJZypPMJRmc
5AevziZsregzCxrSOHCldTqc4Kjdfmc5AdvziZspdgzCzrSOPCldfX5k31eJ
ftb2d+8ZG.q96LIJLb0+PsDF3z3eeYbz1b26MR4v0S4n3IMpcLSuNM.Fj631
+SxmbpWGzkPwHhIMp76AJ1zF088.EiLoQUeOPwFsj1j4gvQnQi4Z4HvQlF5H
qGdq2+rbga+IsqaakyfzdRjJk2dRwcyYU52qwIpNF++7r2d8Yt2J2spxQbtP
qRxQu2dNKJmypZy46y1FpdSSUv4r2dcUxogp4zbEc5tpNMUYmyGPtcUgmypx
y2BAl.Dgl9vmC0J9LA87svack5oGk6oOk7oyx9zyR+zR4e5WIf5nLPcVJnNK
GTGkDp6xB0Yog5Q4g5SIhroLQsTpnNKWT6kLp8xF0doiZs7QMUBo5KiTCkRp
WkSpmkTp9xJctolycQT49c4pnr6h+O91xNYasPRssxz18XT0qQYU+d54nauG
MltPS6kj4dfRqFZS4IJPI2yiLO3+gZ66NTdPobT65LAno+t3YM8kKwD9+xCL
X8fRUdww4ATtYexSyaYe2RO.NXd.+ViG.4T2SM30A6K.bCQ+Mcp.RaMBwmT5
ulX1JQFzBQ1Ri88kJ1HMhXVMEM+2UdmEyd7uey1Copt96sygxpIMdpovRrqZ
XdlI7vljSKY4I0hm8zHxf4QrwgGktKp7XPDf8Q5wNgvW8Z8P.IaLLAqgSUCO
VPslG2L8oZESbVsH9Exg5kBDzrLZqnt+oisl8uYsJQWd+8K.vuUxM+GZjZim
.pck5V0ZsqpPtEsStAcSKYFK09b8HloezxAYCpbZ.TIbriEic7rfpcx49jC6
VlK9jKC5UEAjKVMMZyQyQ+kiqyplmMYW1I1GXPh.SBjqhJyC1LnCmVPmYCQG
X.8oEBo1BgfoFBA1x9mbHzF.jVq745nUaSjQLjo7C8E51JxLaqfD3w+ZhQMn
U5drYf3CsRESztgMn6B5v5UTOSvgwLyDMSZlMaljx+Ez3ZChLxTLzBmwPOjZ
qvV6VKKbyRGmecLAFOuTMCJetsOQFqapLVFAb4Z1AbyZ1UeCe7nlcWkZ1Ixl
XXl4Y3iJ18nhcOpX2iJ18nhcOpX2UlIXpSDhydTwtYqZEY8sM+QE6lYd.hye
Twt4j9S3OpX2iJ18nhcOpX2iJ141Uril0aK9OpX2iJ18nhcOpX27TwNAzL4p
HG+qGUr6QE6ZQvgpcXgwlNzjhMycvh+EhYlZdPsLk9udTwtGUryhJ1Q7cyJ1
U+FN9QE6dTwtGUr6QE6dTwtFWsc0Q4XYuEpy78Amkb3jj5CJpvVhfBlzDr1C
xmd5Wd9Czz7.vJ5q+TPdyVFBjch5Vdl.buRcml71wLmpm99tJ4UReGExKcRD
dMCecAwYEdA7Qg5hmBpKxTMQrQFdhIuOZ0jGsZxiVM4Qql7nUSdzpIOZ0jGs
ZxiVM4Qql7nUSdzpIOZ0j6lVMAd61pIHGFzgsC5.2sKY7uYg7796wQD0ez3O
OZ7mqTi+PcIcxA0xR2fMDD2oH5WytvB8nKrlSgPabLfcJgvgz+XCgn+nwxFm
FKS3lMVV8mKCOZrrGMV1iFK6Qik8nwxdTe9G0m+Q84eTe9G0m+Q84eTe9G0m
+Q84eTe9G0m+Q84eTe96+5y+XTPLlkJ9QEgeTQ3GiBhYoHjOFED2bkx6QE6l
7J1wcyJ1ketf+nFcOpQ2iZz8nFcOpQ2iZz8nFcOpQ2iZz8nFcOpQ2iZz8nFc
OpQ2iZz8nFcOpQ2iZz8nFcOpQ2iZz8nFcOpQ2iZz8nFcOpQ2bUit7XSpqHc+
+3EXh2K4Uu8GiATE7m2+jWfWbRpIl9+IuMIaBKFLXiiRxFCOqoAzYyQk0xZ0
GvTb2nSfvj7CqdsNQQSoWAhsbMTRz4o9PNTLgRKrB7oB+5rURUt5nrx35NIc
HMb2ylpUbNQTJWueYP10W32HgG0u5p9Zxt0AZZJqvUk3XzZIhaJCRQzTRdxu
Cr8BzJUje5E0h3Kg3uWY8mb8ZO0q.EUcMmUVuJm9oR+97m29ssoOu54A.BaF
Qz90VC3WdqLJvj+XPiJuBNeRjEGPwBaDwZSPpNokdx5qawsHJvP7gYkdGHED
HJYTLFiHYWzG9IurZKibC5I2QomPR1dP9FidRcT5I.SuEkOYP2jd5inU2h7t
O4j5nlOEPQUWW0RN8oiB4rsfQ+9f0qCJQ2JzWOE0wHH3BeHignYvKUBvLLrJ
VH3K3pmDmeMoCVj+YNm6CCEhv1GxJpTGg7z4soz4AC9iGjKv40nk09.06Kju
ff4XtHiaJjnLkisgNLQ71uKLsWrVrTeWAocyZUkPlbcXsH2i0BYvEXoPW2r1
loCSDq82Du88dwaQxkvQISLuE5d7V.Q5phcSva+yu2S8VHPL85s.mi25SH2J
ps+ygw8h056KzPpfmgRp0bOxb1R80javYEX7BpT7dNYmqODmFsONRkU19Dlj
LtNgJiGTUSWIAXeZdTepFRzbxVcdOH2LCZeXp7NR.pP9pzs0Xi4oBRtNQAuT
xlWEHkVOmM0BOt1XjKGerDgN1XsvAk1AheUIgxD14i6q5zN7rx8w2Mb+5SRh
Ky8k.5Lq6ita390mRGWl6C7AyrtO7dg6WeBnbXluu.MuZ9f6Fu90msrIk22x
Fr7vlsAK+IIGo3+21DUBAsTJVZ2amxO0iWzURIQDStFwn7NRXLx734ctYics
YIxS+1Fps2nlsfyjrMEQ9uK81ZnoBqogBKPdN9ITsIBOQwpqyLJP2p1QFJoD
ORInqo1SoxI.w48lBlXJDuulOyI0ULU+yKfZ0VQoUQhwFAAVff.VUGHsffvQ
DAw8BAAcxAUIo8DFJWzqUXHvIvPfEXHUFMM1Q3gn9fgD+N4gFOV4Hnz1qqnE
B6EBJ5BAQbwBzIVHAgbFgz9yBA8mER7gNicl9yBAVvBwBjynEB5EFx6THkRJ
3p.aFK.yjTY+QIP+QID+zeMobo9hP0f50iPbix1o+vMQmJRbirrCWzWPSkM3
1ozPD0ul7rg0c1QK2rmqSvZTi2aTC2IpAonZRhTFp07MGKTq2J7PTmnFfPZl
q07MGITi0acEXmQx6mm4uRI.vfYMeuQBwn8VSCzoll.wqIqVFDq46MVHFtmH
FuyHFpcwVpsuWiFPz2bJMX1arENPrUz7xN02aJ8aQ5qLKuy3JpcMXXSapUuA
T8MmRVauwV3.wVQyqFc5Ysr9xZ6LBqZW5BwLyVZvABXpYs8EaqtYt5E1lwZa
9dSJqkzSjk0ctvpaMaXePidP02aR4r8EYgzAgrDiIplu2jxY6avQntWatdgP
TLuvx7z+0HEk.AzSPmJ5IrSffli2AN0hg8E8HvdhdYlTJ9WS5RV6qyP1fByg
aTqZ9dijXHruKJbXt3yzmZ9diEZ0W+ajA4dKCsZ9diEZQ6qAOJdXQaiYMGss
5diFh0a6EhgEqoAwZ9diFh0S7BOHuwYBhMeuwBspIc9MvuFX.jF9Uy2azPr9
ZmmPFVvhFDq46MZHVeszS.80irAUJ9WiFv260qnsPhZUdq1JXy0AOwE7Ft2j
V.CKPWvvP2rRcK.tPIn5O5pM6LXzkxsqnonYGcEWB5RXXq3t3YGc4WB5hozN
pMGo0FLR2FcMzgQmFnBGVEk7mzik7m+gvMGN0HS4CU85IKu71qQwwGmZB0MP
Vx62pmLOUooPewosfDAgPgZFKfgXNhoek7ET54ifIy6Cl+FIThNaSxWwjFs0
SPBh.goX8P5nl2J5z2I.5a9lxFMhpWIuDr5PR7ofMukMp14mMCw2tKYaxtiy
0dozYo22gzj21ErJJqKw.0N.Y9TAIwcxmrtgItoGSK9YTmjbYl55nuNFLyiH
Ty7ELmQ3PMIUPvPMwslgO4kvRNS.ZjXlSE+5GB9pGD48GCe6PbPAMkq22foO
U+t3CgE6Yx1kJBVtT9kWhRigJVqh9xNp64mwsOavnLZHw2uKLbyEgE5Y3CEq
9Q8JHSHMeLcHv+dXbbxW5OFTbWz8WzyYIpO.HJ4RnFrTfnPMqhKfBs1n78QI
zIAQOr9kvceeR7pKhQojr.ZEapOBR0XCrnh8kiDYeF4e.cMzwxf2FG1X0Mnw
5XHic9.FyXqQ+aCMV+cVnKpMvPK8g9odPeWhD389GUmEIurLJ+10M5tqqqpq
u4+6nI9qchLAXlZEoGpWhyFcEWGTM88cGpEAgUQPJodLD1HF1GrKaXzBGCr6
vpsxuvvnOGJM.fIz9hongiomzfxUa6jDPxKIXsj.8mb41d2PQNOB7L5RGM7S
SUFw+zzsrBsuueSHRO9lfWguH+9fQWgumxslQ+ZArJ4gjQWbbS0H+QHTo3gK
V3qlLZ46hIf+m58SdoHEsWHEpMjBSA8Do56SdgHU4Z11udipR9rxldh0gFMe
uKDvo8RDCzpHFTsK9a.va9dWJf2GkcN+JnE1O4UbaTHBkuvuWxq88IuTSk9E
2YNczYXW92DpquI505aB1w2DCds9l5Rjfd0nd3t9ltBeQPFtG3z0vK8YV1av
6YYs6xo9cb+pgf5+pAW1WMnOe04LgK6qpOBmjJeQl.8jw49lb8GaOKXuBGjc
GaufiEj2T4PwS5Ot7OnyNkMUeLmcpZd1ooY0SQylO8LO+TyTuPvyRcpAv6Hk
oms31LRZMYVKeIj0mdzgjZzAlVzAl+s5yfVyoBsgzfluL2O8qZdQ6kWvdQI3
FR04vYBmmVS6So4PImCJUl8lIbMo00klxg+o8xgzzjMpTR1Nuy9DPdwHpAz9
CG1sM1JfSpXRzm2RRFFfKLJdRcP50D3xOqaMuUy65zoq5Ifql7ownRgJMw63
XslkYhnfvUYzBlMsyO8qiO2wIj9yQaTVnCadRoWDykVCxjcOArgwgqqj8OgJ
NU8r2F.EByqHTf5vspQvUhQXFwLCxk+KipEQXBoNqe42VGy18hPrQdnUdOSf
.Xy2kTu07sxkvgpddM9spkRHlwktjKnsu.oLACO.AFXuDXxSt2CQlGhLMaiY
cvd0HgonIl0g62G7V3U2yZOYYm6dsexkis20tBw4xj5OrVEc4CB9.io7lxBW
3uDrZ4eqaKbhigzK3.pPXdkJlz1sv0OjzBCbYC7pNA3qL4szmMgAg.y5a7QL
RVkBgBUnW8xh70zGh8VygFpqOEXriWGY9sfnM+sqFUt5WtfAIDgoL39HXsRl
qBtojL+oqrnYGBlCINkgnTLv.FZmVopvsI2GMFlRe0GFnguhSOulAi9ZQn8u
qWOrYYt2jlCK6pKPN3H2yh4pTGubsSwwvxWwwnIfLJmXRLhz.L0XIgjIlxI2
WIaJie7VR7JmjYzV+xbGxMTmoY4mFX0yINln6yzv+zY+1ufI2KJgsmLdb1KZ
gqk6jrzqjNPQWoDL1OlleeWLScsEXdduvjbzNOWXEMYtW5JTa+sg3FjFRfbM
FAyxws7ZGe204GskuXYLgjlbj1SJtMtzpyqvIfhpQH8qNBdbw0Zw5m7fpxl5
emo+BuRIUUBm9clIBFWXpMAPPDvqZpXq13p0iRCsYUul.Hx0APrqCfDWG.ot
L.tK4KarVK4DbcxzDdTgPjyCgXmGBINLD9a+4.6ECAHepIANbNFixNCYgPH9
5Cf8X8TCXWCbUANjKCbXWF3HtLvQcSf6GjKpcSZf0pDBBfwLcUBCHANs5KyG
5Su9vX4cMS8fXG6TlAtKYttH.5VGAv25H.4VGAn25H.6VDAzaosuy9vFT4zP
uze7wlBhSUM120G59dGLnlJ6DvdCa8Z2+cMAPjqCfXWG.ItN.RcX.7OZuFxw
dQEdLUi.DVZc4ZBcaC1DF+uFkb774YTZ041ZdRvBzPZ1Y38VyNuyjk2uuy5O
YmLbcY2kQTGVpYqBmyMqGW5R0+ptdbUB1CWEkdEwHUYxuzZR2O7wr6DzacWE
Bseavxr1GN4qO8q9e+q9+G8JrerC
-----------end_max5_patcher-----------
</code></pre>
retiutut commented 2 years ago

There is likely no issue with the GUI. I have attempted to replicate using more than one version of the GUI, a MaxMSP sketch that has verified to work, checking the Networking Widget code changes over time, and Python-OSC.

thiago-roque07 commented 2 years ago

Ohh... I removed the OpenBCI GUI v50.9 from my computer. To avoid that problem. I can try updating my MaxMsp to 8.2 and test it with OpenBCI v5.09

Which version of Max are you using?

retiutut commented 2 years ago

@thiago-roque07 The Max version doesn't matter so much. I just needed to know you are using Max 8. Please try my above sketch and let me know the result.

mhrahmani commented 2 years ago

@retiutut Hi, I think the root of all evil in most OSC issues inside OpenBCI is the "Multi Type" Message formatting and extra spaces.

In OpenBCI, some "sequential" OSC data streams have an INT FLOAT format. So Band Power for example in a 3 electrode (3 channel) is an OSC message like:

/address+/+`+int(chan)+ +float()+ +float()`+ ...

usually in console outputs looks like this

/openbci/ 1 8.0 7.8 3.4 0.0 9.8
/openbci/ 2 5.7 6.5 0.0 0.0 5.0
/openbci/ 3 4.5 6.7 0.0 0.0 0.0

These type of streams are the ones that make a lot of OSC parsers freak out and leak into memory and crash. I've seen it with Accelerator/AUX stream and Band Power stream. Take a look at the OSC packets:

stream_packets

The mixed-type messages from Accelerator and Band Power will make OSC receivers crash. While single-type messages from Average Band Power and Time Series will be fine.

Note that OSC Has Support for mixed-type streams but for some reason oscP5 library is doing it wrong.

Solution 1:

Converting the int Channel Number value to float and passing it to oscP5 as float instead.

/openbci/ 1.0 8.0 7.8 3.4 0.0 9.8
/openbci/ 2.0 5.7 6.5 0.0 0.0 5.0
/openbci/ 3.0 4.5 6.7 0.0 0.0 0.0

This is probably the least painful solution without having to dig into oscP5.

Solution 2:

Appending the Channel Number to Address instead of passing it as an Argument.

for the above example it would be:

/openbci/1/ 8.0 7.8 3.4 0.0 9.8
/openbci/2/ 5.7 6.5 0.0 0.0 5.0
/openbci/3/ 4.5 6.7 0.0 0.0 0.0

This is the preferred way for OSC protocol. OSC parsers prefer channels of a single type, and all the categorization info as strings in the address.

Question could you point me to where in the code I could modify how data is packaged? Like... the least likely place to break anything else in openBCI.

Update Okay seems like it can all be done from w_networking widget. Working on it now.

retiutut commented 2 years ago

I like solution 2 👍.

I'm on board to have this changed for everyone, since OSC shouldn't be "production critical" for anyone and others can use an old version of the GUI.

mhrahmani commented 2 years ago

First of all, thank you very much for all the work you do to bring us these tools and platforms.

I ended up digging into oscP5 library and official OSC specs to learn how exactly the data is packed and parsed, plus I learned some communication protocol lore along the way. It was a journey!

I did come up with a working fix that should make most OSC parsers happy. here's how it works for Accelerometer/AUX and Band Power, and it should work for other stream setups in w_networking.pde as well.

Problem1: INT "surprise"

https://github.com/OpenBCI/OpenBCI_GUI/blob/52447b7c644bf94c73cf663fd0bb6a0f5b064a28/OpenBCI_GUI/W_Networking.pde#L1861-L1862

https://github.com/OpenBCI/OpenBCI_GUI/blob/52447b7c644bf94c73cf663fd0bb6a0f5b064a28/OpenBCI_GUI/libraries/oscP5/src/oscP5/OscMessage.java#L175-L184

https://github.com/OpenBCI/OpenBCI_GUI/blob/52447b7c644bf94c73cf663fd0bb6a0f5b064a28/OpenBCI_GUI/libraries/oscP5/src/oscP5/OscMessage.java#L231-L241

Accelerometer Stream Hotfix

                for (int i = 0; i < NUM_ACCEL_DIMS; i++) {
                    msg.clearArguments();
                    // msg.add(i+1);
                    msg.setAddrPattern(address + "/" + (i+1) + "/");
  1. Makes better use of OSC's built-in REST style routing that's more standard in real-time systems. There IS support for other addressing styles in the protocol but I'm not sure if oscP5 can handles it.

-This way the rest of the code stays the same.

    void sendAccelerometerData() {
        // UNFILTERED & FILTERED, Accel data is not affected by filters anyways
        if (this.filter==false || this.filter==true) {
            // OSC
            if (this.protocol.equals("OSC")) {
                for (int i = 0; i < NUM_ACCEL_DIMS; i++) {
                    msg.clearArguments();
                    // msg.add(i+1);
                    msg.setAddrPattern(address + "/" + (i+1) + "/");

                    //ADD Accelerometer data
                    msg.add(w_accelerometer.getLastAccelVal(i));
                    // println(i + " | " + w_accelerometer.getLastAccelVal(i));
                    try {
                        this.osc.send(msg,this.netaddress);
                    } catch (Exception e) {
                        println(e.getMessage());
                        msg.setAddrPattern(address); // cleanup just in case this is the only instance.
                    }
                    msg.setAddrPattern(address); // cleanup just in case this is the only instance.
                }

Problem2: interlaced Accelerator/Analog/AUX streams with the same /openbci address

This one was tricky to figure out, since other streams would just come as mysterious empty packets. since each sensor has its own OSC loop, the address pattern is reset for each new OSC loop and you end up with interlaced messages of widely different types and sizes that crashes EVERYTHING, even Max or TouchOSC. To fix it we can either just use a different string for each address, or we can just include the previous channel count in the for() loop.

        final int NUM_ANALOG_READS = analogChannels.length;

        // UNFILTERED & FILTERED, Aux data is not affected by filters anyways
        //if (this.filter==false || this.filter==true) {
        // OSC
        if (this.protocol.equals("OSC")) {
            for (int i = 0; i < NUM_ANALOG_READS; i++) {
                msg.clearArguments();
                // msg.add(i+1);
                msg.add(i+4);

                msg.add((int)lastSample[analogChannels[i]]);
                try {
                    this.osc.send(msg,this.netaddress);
                } catch (Exception e) {
                    println(e.getMessage());
                }
            }

Alternatively:

msg.setAddrPattern(address + "/analog/" + (i+4)); // start at 1 for Accl, at 4 for Aux, and so on. 

Band Power Stream Hotfix

    void sendPowerBandData() {
        // UNFILTERED & FILTERED ... influenced globally by the FFT filters dropdown ... just like the FFT data
        int numBandPower = 5; //DELTA, THETA, ALPHA, BETA, GAMMA

        if (this.filter==false || this.filter==true) {
            // OSC
            if (this.protocol.equals("OSC")) {
                for (int i=0;i<numChan;i++) {
                    msg.clearArguments();
                    // msg.add(i+1); 
                    msg.setAddrPattern(address + "/" + (i+1) + "/");
                    for (int j=0;j<numBandPower;j++) {
                        msg.add(dataProcessing.avgPowerInBins[i][j]); // [CHAN][BAND]
                    }
                    try {
                        this.osc.send(msg,this.netaddress);
                    } catch (Exception e) {
                        println(e.getMessage());
                        msg.setAddrPattern(address); // cleanup just in case this is the only instance.
                    }
                    msg.setAddrPattern(address); // cleanup just in case this is the only instance.
                }              

The Why of the Problem

This all comes down to a Max|MIDI solution applied to OSC.

In Max/MSP (and other Signal-Flow environments) it is common practice to receive a list of different values and use route and gate objects to parse and send the signals to where they need.

This is because Max was built on top of MIDI and the whole Route~Gate strategy was/is a way to make use of the 8-bit MIDI protocol to carry custom signals and commands with bangs and clocks, like they do with physical modular synth wires and patches. (or PureData or SuperCollider).

It's pretty much the only way to route things in low-level signal flow. You have only 8-bits per message and it has to contain both Address and Data.

OSC joins UDP and MIDI to utilize mainly the Addressing part of the UDP (among other things). It prefers if you provide a whole verbose address space down to each sensor float reading. Single variable, verbose address.

In fact you're already using REST parsing when you pass a string to the address, so any extra routing is extra parsing. Maybe we can use the available UDP addresses we already have.

There IS support for Remote Procedure Call int addressing style, like we do in MIDI, to make the packets smaller, if you pass an int instead of a 'string' to the same msg.setAddrPattern(). oscP5 mentions it here in context of SuperCollider:

https://github.com/OpenBCI/OpenBCI_GUI/blob/52447b7c644bf94c73cf663fd0bb6a0f5b064a28/OpenBCI_GUI/libraries/oscP5/src/oscP5/OscMessage.java#L231-L241

But I couldn't get it to work yet.

Anyway, the stream now runs gloriously smooth:

retiutut commented 1 year ago

Trying to address this tomorrow.

retiutut commented 1 year ago

Using https://opensoundcontrol.stanford.edu/files/osc-best-practices-final.pdf

and going with REST

retiutut commented 1 year ago

Alright! @mhrahmani you are welcome to test the changes pushed today in https://github.com/OpenBCI/OpenBCI_GUI/tree/june2023-networking-refactor

I did testing using: https://github.com/OpenBCI/OpenBCI_GUI/tree/june2023-networking-refactor/Networking-Test-Kit/OSC This includes a new example PureData sketch.

Example OSC Endpoint Output:

/openbci/accelerometer/x 0.51234

Though, I've really gone ahead and applied this type of REST-style api to every data type.

I found that having a trailing slash is incorrect and therefore made sure it's not there in the address. I've also removed the address field for OSC Networking in the widget. If people want to run two GUIs, they can send to different ips/port. We will maintain a rigid OSC address structure that I'll share our official documentation while testing for the next release.

mhrahmani commented 1 year ago

@retiutut Perfect timing! I'm just about to work on an experiment and getting back in the groove.

I'll check it out and let you know.

UPDATE

@retiutut So I tested using SYNTHETIC on 16ch mode.

  1. Band Power: The band power works as expected across all channels. 1.1. Focus: This also works as expected.

  2. Average Band Power and Accelerometer: These work well, provided their panel is active in the GUI. If not, the values fail to update. (I don't recall if this has always been the default behavior.)

  3. FFT 3.1. First the good part, it can communicate all 16x125 channels like it's nothing! It's glorious:

openbcigui-osc-FFT-16ch

3.2. Issue: Random jumps occur in some of the FFT channel values, with or without Filters.

openbcigui-osc-FFT-16ch-jumps

Solution: I believe this may be due to address conflicts created by the current addressing scheme. For instance, the 11th FFT bin for Channel 1 and the 1st FFT bin for Channel 11 will both have the same openbci/fft/111 address.

Separating the Channel from the bins to /ch/bin as in openbci/fft/1/11, openbci/fft/11/1 should resolve the issue.

  1. Time Series 4.1. Issue: The GUI crashes as soon as I initiate the OSC stream. This occurs regardless of whether the data is RAW or Filtered. The issue could be address-related, similar to 3.2. image

4.2. Another possibility: The issue could be related to the source/timing of the data. Last year, I noticed random jumps across all channels in the Filtered Time Series. It took me a while to realize that this was due to the Ring Buffer that Brainflow uses for rolling window filtering. The buffer isn't cleared when you read from it, leading to unfiltered values leaking into the data.

retiutut commented 1 year ago

Ok I've updated both FFT and TimeSeriesFilt and TImeSeriesRaw outputs to be /openbci/[datatypename]/ch0 0. 0. 0. 0. etc.

Vanilla Pure Data doesn't seem to be able to gracefully convert symbols/float/ints. I hope this ch1 part of the address is ok... which clearly should be a string in other receivers

Also, can we do this for FFT?

/openbci/fft/ch0/bin0 .0

if (this.protocol.equals("OSC")) {
            for (int i = 0; i < numExgChannels; i++) {
                for (int j = 0; j < 125; j++) {
                    msg.clearArguments();
                    msg.setAddrPattern(baseOscAddress + "/fft/ch" + i + "/bin" + j);
                    msg.add(fftBuff[i].getBand(j));
                }
                try {
                    this.osc.send(msg, this.oscNetAddress);
                } catch (Exception e) {
                    println(e.getMessage());
                }
            }
}
retiutut commented 1 year ago

Are you using TouchOSC in the above gif/videos? @mhrahmani

Could you share a TouchOsc patch?