Building hysteresis into fluid.datasetquery queries?

So I’ve been doing this thing in SP-Tools where I use fluid.datasetquery~ on a single entry fluid.dataset~ as a way of applying “real-time” filtering to descriptor streams.

There most common use case is where I parse something like filter centroid > 90 and loudness < -50 into fluid.datasetquery~-friendly syntax and use that to filter out incoming ‘onset descriptors’ where only loud/bright onsets will be passed along, and others will be ignored.

Works great!

I’ve also used the same abstraction on a stream of realtime descriptor data (basically applying the query per analysis frame) to apply a filter to the descriptors going onto a concatenation/mosaicing process. Also works great!

except

For realtime/fast descriptors, having some kind of hysteresis would be super useful, particularly for things like loudness, which can be fluttery around thresholds, making it hard to dial settings in just right.

///////////////////////////////////////////////////////////////////////////////////////////////////

So my first thought was just to build a bunch of parallel Schmitt triggers, and apply them to each descriptor stream. Easy enough. BUT I lose out on the useful utility of being able to apply logical conditions to chains of them.

For example:
centroid 90 60 and loudness -30 -50

Where each independent desciptor goes through its own Schmitt trigger and the filter is only valid when the (sub)criteria of the Schmitt is true, and then the logical condition, in this case a single ‘and’, is also true.

Now again, its fairly simple to build out a few logic branches, like all ands or all ors, but having to code around all the permutations (in Max at least) of chained and and ors is terrifying.

So this leads me back to wondering if I can somehow leverage fluid.datasetquery~ in a similar way.

Obviously it’s not intended for this kind of usage, and my pseudo-workaround of creating single entry datasets to validate multiple conditions is kind of pushing at the edges of what it’s mean to do. But I’m wondering if I can somehow chain a couple parallel fluid.datasetquery~s together, or some other thing to be able to leverage its internal logical condition magic.

///////////////////////////////////////////////////////////////////////////////////////////////////

I vaguely thought about reducing the individual descriptor Schmitts to 1/0 states if they are met, to produce binary strings (e.g. 1 1 1 0 1 or 0 0 1 0 1, as I have 5 such descriptors I’d like to be Schmitt’d) and then building single entry datasets out of them. Where my brain goes to mush is that I don’t know how to build “time” into the equation here.

Maybe somehow doubling up the entry length so each binary pair represents a change in state where:
loudness > -30 = 1
loudness < -50 = 0

Therefor the “loudness” entries in a dataset would be 1 0 and I would then query loudness = 0 1 and if it’s true, it would return a 1, letting me know the Schmitt criteria has been met.

So fleshing this out to the example (centroid 90 60 and loudness -30 -50) I would get:
loudness > -30 = 1
loudness < -50 = 0
centroid > 90 = 1
centroid < 600 = 0

Which would get turned into a single point dataset with 1 0 1 0, which would then satisfy the query.

The glaring problem I see here is that would only be true if those transitions happened at the same exact time, and wouldn’t “persist”.

///////////////////////////////////////////////////////////////////////////////////////////////////

So yeah, a bit of a brain fuck, trying to think about time, in a relatively time-less system.

Any thoughts on how to go about this?

Two separable things here: the hysteresis and then figuring out the logical combinations. And then nice interface stuff like being able to name your features. In any case, I think I’d abandon dataestquery for this.

The Schmitt trigger and digital equivalents all need a feedback path, and inspection of the data stream relative to the current state. So if you want a ‘vector’ version, I’d do it with lists. I’ve had a bash below, but left thinking about pissy edges cases and making a robust abstraction to you :heart:

The logical combinations really depends how complex you want to get. Where you just want a single reduction, like or everything, or and everything, then its not too bad. or you can treat as taking the sum of a list and seeing if that sum is >0. and is the same but with a product. Sadly there’s no zl.product, so you have to roll it with accum (or use bach.product)

If you need to get more jiggy and have stuff like (a OR b) AND (c OR d), then I think the least bad option for longer lists might be to stuff a list of 0s and 1s back into a buffer and use gen (no tilde) to express the logic. For short lists, expr will do fine.

(edit: or put your debounced list back into a dataset and return to datasetquery)

[thresh~], but for lists attempt:


----------begin_max5_patcher----------
3511.3oc4cs0aqaiD94jeEptEEsKR0g2EYw1En.E6i6Bzh8o1EFJ1JNpGYIC
I4bxoW1e66PRIGYaIaZGQGWbhQriHkkl4atvYFRw762dyj6KdNoZRv2F7yA2
byue6M2XZR2vMMGeyjkwOOKKtxbZSxReJILKMOYxc1dSmaZu39e8ansskudY
ZdVRs4qfaZT+klUjUTZuc3PzcAnPphf4BofDw3HkT2DzNzYv+8kKVw551qFp
o0Uw0ydLMewzxjY01qHQFxuKPxiBYQJp.GEQ3zHBEeW.iDour7NW16KJmmXn
ERnnosp3mRlOMtttL8900Iu7WUMHRCjrCybSmdtYRxyqJSppRKxM.S8iIKsm
ZnF6l99jONE.yzE4KSxqmX+V+4s29xGl2+yauyQIxrhklqTCOTm7rAOl7S0w
ZBeewDgvOnfxY.mKYFTMhDxgeD7HLSB.OAPbL2HHIHMjOhb0ODWG2KOwFIdx
pnvDWNVpJc45LPVMOX9PLGYbXNLWagPnjPElDgXXkhyAiDgGYthkIA0OBVDO
VjMue0Q73vcLjQcjxMe7ZYn7jO.T2d7CXauJIed.pONAqNANAe.NQXncNQo+
PPMLBoiyK6ko9iqRregISFSdLKsp9g044IY8xjxwkIQbyGhiyjZ557Xzkwfi
7mmUW1OGEMYCYVFuLoNobZRd78YIc03bfaIMst+vbQvXanWFqS2DVIPQRFEC
iQwYpsGz6.3kP1iqIrwsEQoNJ9c2Fbr4zdJorNcVb1x3xEo4c4XfMVuLeK9s
r3CliomgP3PgNPv3yH3AghAbtfEg3RIg85CdHRJCQHEX3EAWaBRnunWQAOLO
sZUV7GmpuBSK.j70G9vgkJn2XohA4EfTAjLRIWwwHFXux+jVpfDWCREtxbk+
TVNvdiS3Ix3yhK+zJgmCKStJRBU7olLYIbyhWjrWnjnPYPyu8Hsvp9ikjbpw
RRsPaSn+BtuBXdX1DGz7aurYz3vlDtIANuylCjWPcPZv8vKPyJotW97TJr.6
.4opLYCfaRMfJONillaBs8937Ec+zRpiIH7qEo4Azd499GNfdpR4Ftmzv1X1
EVLOubc96Avmvf2P8xozwgSo1PH.m15OTD2DyWXdkLN7JQwdi40JHIuj.jka
Qgv3a8xu8Gxu3b0hi38TrIj2JoQcwhEY8EY.VpFor7ONS2orM528fHd45r5z
prTczC8wqicEMpR+sjtp8fWU36BjjkQ1KdoAiLp2xWzDYzQJeg1e9Kks.nfp
5OlsEUMKNe9Gg2RN2RTLfkC.fkEAuT17sfZw3L1d6XdLmKGlYLtKqyPIebGh
6syY3p.cUvlZqLc2dOmrC1BhNbT.OTjW2ZLQziHbdHGiAYzGIf.nEBLD8KUP
.RxFw.keD2pcu5Ik6lUwCoYIOkT1l6PCsbyj3Uq5z71oarL9Wsfl7tMMklaa
huooxjmRa+9jMsFWB7XMvfqKMz3jmEsPn9xT.t3xWmZHk17TZIIiTNG7uUsJ
dl8KqUFZ6tyr5X7HiwlOTBi9ljhdAm.snEYEydex7NNHAzaURdZtNUJHMo35
FZeS2ySdHFbDOsqPESB6s+GZnvd6TyCFx+6KSiy1v.KJSmWjqIhsjD5laucl
I0wLcGcYFyYjGupmuLnjBvx.cVAL45p6iK0BplQKZkTvPqEYa20luWVxC0Mc
uJMOeGTrtX0vcVlt3wC7cuu.5b4gt1ldpltN216TPmndpNI5sOu3rrFWAae4
eNNOcYbcRcpUDPPa5zNh4iUyJKxx1hes87TO8LGzwmk7gz40OZtQcUFfSOcU
qRzjMR44oKRpp2ts53EUa2xlA65zz56argmVmrbkdND29Dzo3WUW8XwGpZNw
VEst.vKK.ft1zc8qtU6GLk3scxhCfWc6oqiRZ2N5arygcLNXHFDikMSwCoRJ
VW7EyKVjddl1cPlCF1YmBhzNZyEEcv9CcnpqEzYqwl2sVCngfFzfPC9bgFNx
F7kLpEFbALdIlD+iGkvcOwDyR.baCdHqHtdqBwrKLoFDk3ChR7CiRVzAirCl
RDNpxb2N+NpP11q6fclGaXTof3pf37fjmSJmkVkDTWDnWRBE4IAIY1iqA178
Aw2CTd.3pT2ziPhDPtxYI4KpeLn3gNqfgf7h5fkMfSmy.BSX8Vjgs5rqyq2E
Y6HjjmgpL5vBIgBCQFxDHpTAIyKj5Yal.BKVjPPnbl4UDYyJjHh0tBIt.hj5
B8.weLXA.h.tWE7PYwR3uRB9P56SWkLOMNHVOez.5WjCp4ooq9FPYeU0ujCg
Irp5ae26RxC2bxgEkKdm9n28OyZNyoeURFfFkE4oyp95O+m9woe++5G9l+8O
BAF.f0fRHR+RnnwWBQsY8vUnPIlnjPVv5WLAChc2lKDkdIkIFc6+2cAOTTZ7
vTE7K4+R9+oRqfC1N+zOFXfNS+UydbYZMH7f31VjTBBxh44vfbChqz9wUw3i
q1BkZmH.aVzrnKHLZbFG.z0IqiQFernw4L3wVwoDVDRYdIgrW43KtFlw2Xfc
4mz+X5dPafZWtL1T91Ysf4+wqeJ3yQSyzqVlA33H03GFCU6QW+CFBuihHXoY
49EssueF3mQPtxh2yfWOB4BNLfIGe.C2r155Ehht5BI99frAQmywgJwk38DL
bHQpDXrwGBFoqfOQYVIoGEbZmGtIWM1cX73qFIhTgJ3GI1FyUDlsIYh+BZo4
iLrhTrsBKMBSeAhdSrzNz.VZ3Y+Us79Yh5g32ihh1O9ckziihcvTnz4Ccbbv
CQIK3jPVGaJIQ1hCR9EGGrA2oKOJjoxiI41z8BzUgMXFjs3hjpSMpOLhN9nF
uIvWBNDqmd.JWwTTBm+xR7ezi76X9ZLn1PUovCQAwjT8fS6VmKEVpGL6Jya7
ukErnrX8pgvG4YTGPhS3CUOaqHLXeIMCrSzqAcaxANVTm29ZAph7Vs.obYnf
f3DDxDRHWdcVXv0+V5Pfi3LzcnGQ2QXydDKCITEgfIZEHrB6to0tKQqKIXAV
aYI4CgWbOXqYwqdSvfFcEZqYGLaXCN1YXv4lNEAB7Qxi.kJpVkRRXfREW5NF
0rD.uj5S0AY5jxNPhYpyYPd2pCu8CJg5NDsIcr6dKRMSunjC9hTbveK3y9J8
me22AGR95AfNgZ7mCLKl06TfgozqwL0NTzSBOjKaSJYJbXW+UBz0XvSFyugv
FjuJHBSp.GUpHF1p7Pw5GdOLwsJhrwz6xZ1Yr29i+vXuE7keYvm8EozAPN9v
1czWmVUuS4AQGu0dEs7JpX.meg84dn9.zH1ktz9uFWTLpGpZqDExMpLB8BIE
iTT8irOJjZTpLQOfkJxew7XQH9xiEkJCYfYWDRXM7PzSY7tKsGqCBR3wGjHZ
Spc8.0OlYeh7uF8xeLCQhGJpKU1GvIkgJjfoXV6PySq6Umg3QwKrGpLEAYcP
+WCDpS35NDsNl3gUrlcrt9CW2YSwKLf8.N3uCH0CjgFQzS3zdgP0WDBJ9UKn
8ONDnQ8UpfWQnjgmFx5RNr6azqMnbiOIT66GlkaefJ6bNswN2coGaH+74IO2
Yc6eA.I73CR8O2tD9o.ZmHdQtX3EY7wq9mnWuhWzQDurzxf.lGlxNsUn10Mo
AuzSCSDiDRXDIjvr0utbPv6rr9d4IEQmF6.q+eCsZ1mE5E1pJVWNqUh0Vpyf
sIt4IU0o4advY94MNyCbMC0yhHHNPDr8H1koyWUjlW2.GDl4AVj.AlIoRjBb
D.p0BRjdhfzSg1dC3t+Y5IlTWgFmPZyxBxuXMyAxPOyJ9iJzrH1EpP5SpHxQ
QheoBgiZ+sjqenBlqXgW0N4tRELORE5zhbhJL1zDOQE5pl3lCChGwBgqtsz0
t2aTAwUIRK45Gr.cJ5E9hJb0PsU+wKDgqgMP7otIFchdKFNvAdy1rp.xrr6B
mUGXGjl4.84KuftxVziwVJglxwbSTQcNvWBDoyRDeNHBbsot32DcL3CBEKTW
mOrUCnQIwbjGoc7nH5wDZH4RJ7UtFFywIc6hd7Bp157PsXruiM2IM2H0wvPJ
gYmaa3CDKhKAuVbIUmXOkq5IQn8NQeA1Qt5diYsE7jHm3rH2mA1XdBYbNAbr
OU7vNo340LgbEKTJeGqoSfgOoBr5Th3caxcyFTI1eIl3B.Q7ZJAnSI8HrOSI
vErf4yBnwnmRhIWTkkMUy53JxXu5m00JN4UxP3bfFR50fyELdX8EzaqpLldZ
jVCT1tQT0rk8Z2YkNv906IsC.sHq393rc11d5aCBZ+MsWCirck8s6TZ6BfM6
WZ8DQyVFZCpWsUE1dAxH8tMs49Mm4vM27ughNm0tEuGYRuhoWvg5RxqnTjPP
ER8tMnPMPeCrAy4LkaJ4H8nvF6PTdjMXaFkFR2kxa4p866US4HmD3r9E3nW4
MW57Mm7pYzHmuWudPk5x8RMN7Ew460qlu1wt+P2KzqluXNcuPix8h2srCCdu
NniGNGaJw.ay+GoP6dDsYxvolhQXNZTnb7Qo7nCQ4zHSIRvBg8+8Plm0ssOB
xj2rvXr673lid05RJmju7QQ95lStHWFXgRBinLLko3QfRJU+zIa29M6oq88X
heUbxtC9MzPjpQ.0HXkS2qnwPB4VbG63qqeID3C2XdgnaNZrECtRtT2IWFBc
.xEMBdINt9uXOIoMfxc1.X02lc13W2YSec+M70g2rW2cid0Da8Pavq29m29+
ABgF3tB
-----------end_max5_patcher-----------
1 Like

Yeah that makes loads more sense (breaking it into pieces). This kind of nested logical stuff just breaks my brain. Took me quite a while to wrap my head around the syntax to create a translation layer such that I can do that more human-readable query strings in the first place.

That’s exactly it. Doing a single and or or would be alright, but the fun comes from having cascaded/nested conditions. Rolling the options there get quite nasty.

BUT

Using your list-thresh thing and then just adding an interface layer between that and fluid.datasetquery~ would mean I could just leverage all the conditional/nested stuff in there and not get my hands (too) dirty. I guess I’d have to adapt my original queries of:
centroid 90 60 and loudness -30 -50
into a set of messages for the list-thresh bits, then take the output of that and plug it into a dataset and then query with something like:
centroid == 1 and loudness == 1

ok reading this thread and trying to go back to the source of the adventure, I stick to this:

then you describe this:

This is not hysteresis, but range query. It is actually simpler than you make it to do since it is all AND.

so this is a boring example doing it:

<pre><code>
----------begin_max5_patcher----------
2126.3oc6a01aaaCD9yN+JHDxmF7LDodeXXX6S6Gv9X6fgrDsCakkTonRRWQ
6u8chTuaKGFaK2LrVj5HyWDu64Nd7tiW9xcKL1j8Lsv.8Kn2gVr3K2sXgrop
FVT+8EF6CeNJIrPNLiT5SYa9fwRUWB5yBYy4n2aDWtOGwoEkIh2azLhzx8rz
DpPNabci4ghnGXo6VyoQB0paYhWYtDQH1U+JvU8kUln+t6EkUJF+lTMI9bNU
8ZLLZm.KVRY.09yDGi9qLkWyf0b3BisrD5iTdAKKs2aegQXddulWzaJUvxGx
juH+ksMwRUM4z1Dm9HqY91ssFxA9W.LeIWR3FO6Zaz8Zxho7zRljTTM906ZH
IonHMbOsHOLRM4JIVS2cHpSPEFhMUPouo7Wd1cPJHp2kjE8QpDnLaZLKmlxR
yAAIMUDJpo81tioaCAI75sYohB1+Ho.LHnNV+aqovi1YEOHI++fyBSZYfcbV
bVZEQLPRT0byx8ND1QxaN8YF4HRCyOxjAc..VlnyBfIKK1DxqDTaRjq.ooSQ
VVxvtZmWBcqnt6bVZ5HTTjkOcmb1tGNwb2jAct+TuaYOEqKSU8tFzIDqKBeb
HZKBSRp2uN70+bXJaenfJXJQ.wrsSZZHvnOTDwyRRFvupdd7H8DC53QzmXwh
GjKTekAX3r7FkHiVobLaGsPLrMQ3thgsTH9rBz60T4l58vqEz84I.WLb.vtC
Vgn3grmJpGXihVe.nynW+8z8M9Mn8QFAgMeEg6ns6X6aIjS2R4n6wKQU1C6O
jAlBI853HlCw0adwq7bVh78FaNbZShufYwwlFsbLZZ+q2cWyCKOSfYvoCivE
flnWFl3JgArKYEfId1ZfIjShIKOEtPto3hfGlVrMiu+xTX7HxSO8lUng3eif
lsIkr3UwghvBp3aShLXs1JYgqzZpOFb1fFuqIzHYwIYaSsXaoBgkYymWc6GD
beBLJa+dvqgAVjkSHMl9bO2YtJvihHOa0Bk0D3nuJ8BsPHyIf.6KFB57hIgk
N0YSRlnp+iiMEYk7nF4Uso8kng7Cbdrfk15T26Z0ZkCTKYyqkJjubrFTAXwc
FoBrtXg+bRE9ZREMhtYgJZ.5WFKrmjJparIrDiJeOiWq7ydcnPvYafi0JFGm
0qxePH3jMgIibh6XtKdWGwI+TAR5DM6PG45N4IJgFxWhfvBEfyblneCrlfBS
igG+Ujk5QbUq3lmglqdNNFNHeGEFGYY2g5n8e9uTRg5EpRZEkUpLSPZhMsWH
WqGLBqiELM4EClFaqrs4J+lkyUJZZKaiy.piYQhUOxnOctYFvU4vmoJzOr2j
bi4QR.PPeQbTVhJL82AwpDD33a5C54q7MMwlVUOYEDD3CHGdUs1+qjWmHIIC
7m4SkT9m+1YBF3.h5zc7KjmDxjR1kSHcwmivs4Puwb7eRSobHDMTQ1dJh9bH
DwFDD.f.HQFRBAuVDvU5WiiTKfXqNC29E0E1TtYX76GpHXtr2G3duw9p9mC3
.VBEf8tWIeZa0mOeA1bxMva.qQGUL61kQLNXZELysVEfuD0tk6uULJAKipiP
TvOIXki9auwmkR6D6ROHPUsM6p3DrmTlcX7oW7Vy.iYxVz2N3.pWmvCaoLJa
4e04YayqHSmi1G9Qk8myiQCj74gAQp61QoV0Qs5R9eXFpIN3don1xW9KGau+
akhZxDonVYHy7zonl7iTT+iTTOGon9DoU6CYrzyMMivYavoz11lM4Ti3LSIl
18ll+0Mka2BFcuLTwTdFg27lhwqZ95O0EYfAiWvOx+adYHCQ4RzLdMFd2Hsk
GoOmyQ2uEi9I3SB52KhBSB4UmGhFjIziEg+YhdV35iIMGGF+0KKt2H3Sf1fX
maFaq0kp80Tk21KYalL1nkUoYWLIvfMd6jvZkMWkxvkjuZax2sT1q8k8fhK9
zpGnI4qpNsZUAO5rgMaIfEnPuY13bczJuIt+mV+OuF2+yf7HbPVQBdKpPIjw
vCFbjIy8x1043pp2DczdrNENpRqPmsGEsMIv5cqNrG1ykCazDn6In6wWnePd
xy48smuhV.eSuA5DvacB3g3kcvkkqS2UzeIvRsupSBNV2HvoL8jQRnEnfCpS
vokFmla8h1kOYEcbqhnnRcYaIDzaxEhMpJ3yw8RUXpHnoOx5VYhYKiWHPEfW
wowHwCLdLZaVIGBH+hr1f6puiYybiwM6J608ZpsmyKKGq4M1STia1nAc.hYs
zEz815slyaqWWMh4jFzkHl0xVvUSh.O2DgN6Mbmw8FVZWRMyIRTQDDcTLMma
p36tAyp.fzyRwbZtxVWhvcFIBcq4r4jFz0Pg0bZoPWESxIpwpAWxvDtXzdGU
fiXt8tmstqx53DbXTDDk9fJfPUELVADra0SdlA9l1CpEh5qjq2rv0UKQ8Glc
Wa+vprXMKs5dJoSWsEcHvxdfNGHxCuikJ+NANi0VrBSHzF.NiRmxogmA.iMw
xgDHqLHOhis7IhmsC9VQ5G3W8oI9M61xRRZYgEGLBP7mtq9dD85tLLUOkhrc
7vXVcRbFz4.XgDXhCjpJV0pJUOAMgOPoodl3VUMW3edKO5SGepjlo546Chik
G8oClZNOKOi2dCwqrB52aiy+Fs7aam8DkWcs3C2o950HFmK4Wg1rjdsA0XSh
7IPzAvx0RS9MdkgJUOFFxlpfRFaeutrRN7TVy9NeMgQ8A9CXrmEKStV8Jh8j
+oHfcU06.o8KSTqg5RY3Awqng2Xm+JowBQbtBKDwQmUJ3JrRV1ZrR3SIVsvx
ajB6aK+a1ZvWuPhyUGZibEPg.cVH7AKjZS0nRQpZMFUBRiJ+nCK8noK6nwkb
jz9xTkZzce8t+EXfYBW.
-----------end_max5_patcher-----------
</code></pre>

do I miss anything?

That would just be the syntax I would be using so it’s legible to write. In reality that unfolds to hysteresis (over time) where centroid goes true when it is > 90, then stays true until it goes < 60. And the same for loudness.

Here’s the completed bit of code I made from this thread (encapsulated in the next SP-Tools update as sp.schmitt):


----------begin_max5_patcher----------
9180.3oc6cs+biiib9m89WAiuqRsahGt38iqxl5tjqtTWU4Uk69kT2lxEsDk
MuUVTmD0L6r4we6AOnjIo.o.sIjjmEdpwODoDa7gF.M5Ozc+e+U2b6Ck+X91
aS9UI+ojat4+9qt4FyKoegap+6at84reb1xrsla61YkO+b9ppauydsp7erx7
5+mk6RlksJYQwxp7MI61Vr5wjpmxSVTtbY4mz+077sy1Trtpby1e02uZY4t4
qx2tU8lO7qEqRl+O78a1+22OOeSwGypJ9Xt5tZ7GkKN58LSITaJKlqtwC+p5
R+K+9e6uOYcQ0rmd4VF5isu26hkYU0R6104yp1jsL4vqUKB6+6g9769dLe7p
6x9yNOTyOteV4pEEyyWMK+v803kTuEPRUYB76W88q12I7mKUu7y6VVUrdYdx
eYmRDx2Z6STHe1p4e+pxM66BWVrJeV4tUl9QHt9UKla5VKe3O+A496b0tmKV
sLuxnI.e4EK2Us+UA0u55Lkbpdb2uQAVV8KFQjBIHAkW+c3cIHBIEH3.NGfA
PFgyE2kfYfTvcIPALEj7eo+79e+puR+s6di5n+NqtYwJ0MzPgToOl70YaSxR
VVrsJobSxC6VrHey2nze2Tt6wmTW4OL6omKppRp1T73i4atKIauV8B08uMec
1lrpbkV4mRTvaxSEp2k5cmu8oxky2Zto7LUOmREPOnnwPgzlcbayUu4rW97d
Vopj8XttCV+1TO7mpRL8A5WpdrV0SY5Wb8tpjuNO8wTysp5Szuf54scc5yKl
MawlrmMePayWp5ST5iK+r84oes0oF36Yc212jl76WjrprR2AlTrUeWUNEA0e
uLeg5w9R64aUXqQ3KU3m81TeBqUe14ySJWs+iwJdsa7OpGiTnj4U45NgpOU1
.BMxT4JkLqur5iTe2qz29mJVtL4gbk5s5In5F0e7YOrsb4NE.d3Cv790ejYa
xe48Vrs0aqutO0noiTALh9uttK36TusOqZka1lm8fZHW8KW284djF43QZ3.N
Ri0+.MI4UNPaU9mTh8Qiy1l7K.VDPOf5VGsSwD0RgLdJU0BPxTJUHjTnPvfp
Fn5EYRciCgl11lZBgpbs579934J8QmMQjylH1YSDexlnZxPABI0sNIVvIbjp
YC4uzDq+DrenUedct8se6s2U++oDEl8T1pGc0rojQzwNPqFCvo3leoFtj.47
TjjH.DDiKvJUa4cIJccuvfB8BB1eLkHwipoocgCTm3.xIN.GFG.hN3.BQSUC
i4PLlvAT0W36RTChkM9RMN3jnxThCUIOj.SVlrzAXPFiEDj9ACDi16ncHFou
1vs3GTZsMzEl7gEUJ..3Ra.NB..0O.P3jVZCPBoG3fiOMZDhgC+zxjM4O5Z9
P4HFPfNoN.R0.YTfpwxwRDjiPp4CorT5wiUN4jiSpMlFSHUF4XMCJOwATvll
09n.1wJCX3wKyKMqxi.uxEBMhnilA2Yy.L1Y3bpS6zZESy.CNwTZ0WZe+iVZ
aXss1TtutiY9GZaqlma.BvDpO34ytkogniAaHbhrXBArZCD0PkN.r.a.X7zZ
vz5ZCk9mUMbzezXSsqoGnnQnNMv7CPL1ZOfikHUfneyJ9hZj4IjuotYW2tu4
VUSJ+i4a1VTtpQuvM2lsdciW9lFuEMX8mKMePh6N7REqruD8vKsI+iE6e+jC
uZ1FU6rR0H2swHm29ir8FZo+XJmmuY0tBinXeQU2VsHY5fVo16210YyruYc+
39K2X9D8dw0nCS+CIAo+AAPdArTZ.Otrb1OjOuQWiBBWmuRs8SUOqZ.PVUsv
e3xyyWjsaY08KJWUss3mLh.T+g635KpEQmWT2HLx+uYSQ1xCsfG2TnrAWKDs
5Jzu79GmRsfZ1oCsYiwbGqxV63MqTIU3ROWbqpQta6CYaz8Tpc60PiTo2WVt
r8kN79zaUt9xqKVspCJVUtt+KZ10c+W9gR0EednOayU1d+tU1qduRon59sYe
rMZWksbY8v31e7+X1phmUV5VUX6BTyhr+h4qz638I0rbkKW1p8ZuxGcbk4Jk
7Y4epXd0SlGTSkA6zk0JQ2dnWddwi4aqZ+ZUYOts8qrs5yVPuwKs6g5Aw2Wk
+75kZ60acCpgGpolT6z+Saquw8JZMAfW7RZyA0MmSr0qOzbismeT0kjM6GRV
jrn4kc39sdm7u+IH60zA0T8RHRY+j8KHlo2cEJUHYLICJQ.0Dxb0tqXvt6tx
8rlKVVlYro19K1EPtY+hH0yHcA.OHH.nGPYB5KfG.CEeohdvoG8HHdJDyO.e
JK4eehdqMtK9OnWhoGzC8JPO33F4hYlc.RSYbDEAY0nmxJGJ2Oz61VWti8Ns
glds6oOae571cYCTO1A0usPm1dn9rIpkcQdXaTW6iL9SDp8Gm1vHtwhBLg1F
fcaijG1I4isRmzdIOsYZ.6l7y1oSX+zIsg5j1QcBaoNs8TmzlJOrqxGaqFi8
UCXi0IsyZXasF1dqgs4ZP6t5y1K21e0iMXdYGlm1h41drtSzzc58it9f6d+3
45KZv8zGyVtKW6emb8N5uKY9t0KKloYqq3nO.Waq20REhtuw9Vsn+M6OzpFv
5gvbVpzrpAA.HpYvvP8hGc11+McW8r8JngFp+iY+PS9QegFNCybOqu5V0r9Z
16r8AJnvve2mJscMaSGrW.2eu.Kr8BZeVZc8hwA8DgoSfXVAmZ2sM+JoSXcV
wFKW064.819gMRXgMt0LPgBazaUgZgMsK+Av1N17BCZuno1f1SW.FJvi1QVb
QdrdFmcVQrirdtqV1Q69338uIGDrPCBVvSCVXKKwXTJRqdIYVsKH0NZ7XKnG
jKsKKdp4hLAk.GDOYuA7D4KdBEnTRyUZ.31DxeR77tqDLspAmltAz2xzed.n
BCpovStdzLDXGLy4pc3cj2reGfm+jBNU6Ene.UhCqBp1dm87EqQTNxhnRkMP
7qQEzl7u41IMCqABdqSQZ0.cY1xwTx4oeFNhhtSr14dl4fmA71J4CB3zvt.d
8ZRpw7cr3Y.7tIX5g0a9.ns2su1H5SrmKSSQeeCi1aK2sY1d0h8C4SNtIo1D
PUwpCNJ4O0XELG28yEyWWVrpZaKd.gLQZsmxrpsBj4HCQcdoW434Wa61LxcD
M75697JiZCv7WF0CMt.xnVk.NVYbXEHoQIAoTR3GYXXeW5hzt8W+wcOY4l4V
G9Bu5EdX+BO3LK7jQnwse9sKfHNtYUgCJiMtXS2neq1Mmyu25t26ypp1T7vt
J6ZEt3P3U4pwGWV9P1xN9DrOuQ9UG2.tzTAgC.UPNogLREz4iJH.KxDTjInH
SPQlfhLAEYBJxDTjInHSPQlfhLAEYBJxDTjInHSPQlfhLAEYBJxDTjInHSPQ
lfhLAEYBRAujomIH2gTUjInHSPQlfhLAEYBJxDTjInHSPQlfhLAEYBJxDTjI
nHSPQlfhLAEYBJxDTjInHSPQlfhLAEYBJxDTjInwyDzwa+uiSqNTqQpqV.lz
+q1oUyJW8w7MUlhPwppxCEejECVCQzEohcqq+H2WPJrezpWooStZ6fKhaxnD
uBtn.CyEEGRRMlk.SQHBjipYehIr4ue05urVtZHv8BcPwdXkiL8.AUYhLrYN
1TakAlBSUnAGI3XIVuwMzw4m6y.pn0wNInfldPQscetf2NuipoKSxXHHsN2O
Jwp81RCBlLHys1zg4u6P1ptGXAC6eXC30RgKlZ80z9uH8MDBfiL3NoL3Rr7f
fXF2fJD.aZulEovMRgajB222T35gebeX.m5fCqWb4XTJVaqDhhRYMqWWLtdJ
nw4IWSss4Zw63ODHpA8.UYTR5O6vTZXwTJmkxPewgpabUm5bNQ.BDV2oW6DW
bZSa.ATE3xt5HbzqCqQ1J2a88SEUOk7wLkUK5xjX1y5Mnp2za1lG2o+T21yl
i2l+W1Yp2o5ZnZqhqnciw5O7OX2QyvG0CxP9vOrtvmAAo5AQt5lQP4waM9B1
IVrZdwGKluSWlasvstfVUtR2EMDQcA9zxnPICBRrEBNJ9Z5nKbpIoQBPXmll
HEobRih.HA+ysEBQbYfwXk1l3meFsg3hvhqXhcr7OyPUdXQUc0RDh9Yn1JKr
3JTvS+xCV+okIOtob25AQVZfOJN6QVIK8.pp9NCpKvmv2kmVrGTpq+zxYKyy
1LHz9V1YL12MYnOu2MTXIDpsZI5sJ69hnq9+6aUWE6lSWYtMaenbXXdX25fe
qvr9TlfLmkDRJuAPiz0XSNdjZvWKZwuT2yWVta9p7F+x8yy2T7wrphOlmLSs
AgMkEyO7KMu3hkYUl249eo4EWWnPR62uWs+uEEy062anNR1vSxKGriTNhoh.
JypgMlkWWqgY15i4H6I66+WIy9Wn2nGbPLmG3o+2O3Qalcy4+ki7rWe1P0Sd
z.wPdfOa+05oXqgGddf.G0N7upNZfzQbFVL1qb5C1EUvpsSVnLXFzVuCpLEg
67Zm4iuCcDmuHOa3L.u1ytWyMbxz2iyX1pc70dydp6uEVK8tla1FusOh96Kw
QfEO8ZjbBr1yRW0cNSuNImgq4A8Ztga7d6jutixzRzQdr85GFlXM.JRld8q.
vkSuB.QYmF9cRSeh6zIz2Cy2Yb78T2qionz2GM7ItOGyu9s5x3T9otGWYkx6
.6rsM8ItOW6IW36flN60zqeAjwot6AJReGz6LlM8a73xEn2I.aSEK2uPgwqX
M5OPzKR6CckOBYT6YlcYzSviAGYrKgLxF2Zf3KhLpQFpmxH8hIgLOkPxESB4
9Nu5ESBI9pIteS5W.YD68nE4ESF8e1awESF829F9ESF8elQ1ESFESqkHBXCe
zz8HuzxPw1WLF9vupvQzdZFtTbs2lyWXuw6nr23cTN93cjKRIDAlvqiCTNTS
ytZyiMtOrNEy3QzO5Og6gsazFSocRnYsNz4H4qHLaQm.cIByvQHGkJjLljsG
RUapiA8KBRWrrLqRCV1e4JBwDSOhg3fTLqSzZ+EJ7wmd3CJgoxWhqaafc+EJ
7wB.7AwozFwEOPB+hE9nAX5NGKl7dD8NcxiGEfrGucwhWPODhGyd7m0rGOzF
jewzGeL2CzUPi4dfahoO9Ve.wzG+MwzGeL8w+lfsX5iOl93ekwvPL8weLdFS
e7wzG+kMvkhoO9X5i+lX5i+jqIESe7wzGeL8weSL8wOb6Nl93ioO9X5i+JuP
BivSOWPtoAOxETrRBGoBJRETjJnHUPQpfhTAEoBJRETjJnHUPQpfhTAEoBJR
ETjJnHUPQpfhTAEoBJRETjJnHUPQpfN2TAgldpfbGReQpfhTAEoBJRETjJnH
UPQpfhTAEoBJRETjJnHUPQpfhTAEoBJRETjJnHUPQpfhTAEoBJRETjJnHUPQ
pfNyTAA4AfJHmomvHUPQpfhTAEoBJRETjJnHUPQpfhTAEoBJRETjJnHUPQpf
hTAEoBJRETjJnHUPQpfhTAEoBJRETjJnHUPmapfXAnXA4pTKEYB5LvDDiBNP
9SjJnHUPQpfhTAEoBJRETjJnHUPQpfhTAEoBJRETjJnHUPQpfhTAEoBJRETj
JnHUPQpfhTAEoB5KepfxL6is4+5gSHDoWJgDuVJgnTTJC1olAgjrTIig.RNV
hAJC2D2kHQt1wvf6l8pA3vSOv4hKsqHb6HCQahGXJ3UPtHX7.hZG7F.ARgVx
Ek39LDskQnKK+jaCPcX7Y3AK3zCVNG1gIrTEHwQBs5id25HuPqmJd7oSAWHG
v0gOvisO+EDz0RHMvwisGu6Za8rngdxrDtm57uFg.3iPfCnPfgBeECFr8h7S
pbX+zodHGPRvEClOhAN3hAwGw.Ed3.6kbDd7.4kbfBtbv8RNBtX3yDXlf0Nv
xAvK4fER4f3oXXVlLbhA1aw.DPw.R7tSIjRgufALnXAZTK0SBpX38h8gSLDi
AMvAUL7FMBmXvGCZfBpX3MZDNwfMFz.FTwvazHbhAcLnAHnhg2nQ3DCuWRY+
DcARN7dQk8SwDH4.4sbvCpb3oXDzNEH2avfET4f4sbPCpbLlYNngTJ7dhifI
EfwfErPJEdiEtkh5WbOs.mhRfZwoWp.bQCvIn.nq6+sBm46VPx7La3LQqLLf
mpaFoGKJVVku42d3Tot2AcsbxHY+Qqx4IVw8IUwoWXMzKhQfTJ.QwPJfRA.g
.qODFrtGQkdOZJMe.uDQG6g9dhjCWQwwdkGGQugiH2vcTaLbDa3JZMNPwzIh
RiFQnAd+AeTn+AGZvJNi0vuqNiNiSDYFmJpLFLhL7HZL5IRLNcTXLPDXLXzW
LXjWLPTWLbDWLXzVbhHs3TQYguQXQOQWwfQVQ+QUQ+QTQ+QSw3lS6nHnvQzS
bxHmvinl33HlXr7qb7ge9k4GUy.sdWURwhjYkqlWna5aSx1jmrprJ441rxzW
DQzljTZ.31hgRE3W9hHn5ijJvbTffNhAhPSJEhvBPqDCb0JQ6If5DzPMldxA
4k5tyoZ1qREiO8fOjYTiNnTgN+JUsOLnSU6BCssq2rZTepPvyjJTwJ0UUMtF
AXz1wp5D..lJH6OhsLFEBkbFgS4bz9H1XxUhFBjVV9XwrrkIZqDx2lrXS4yl
Sk6Gr7SO5gZSOdI.8AWxvLlafivxljeAvt8fNmb416Mn+Cf.3Ue7UrQtGByS
0QXAkR.Dp9nqvTiU8O5uOOvzeaqvRo8TwhdwFzqEaHF8.pjkp93oDo.CEPh5
KSbQ40g4oPqUelPGGQtSqXh30fPHePHFlp1kIfInLgZGlp8LoKxn.gmZO2M0
ZPCN48hj4YUYayUqrrMQYIb0muqdm4IpIyU+nHK4SYaeslcBEh.r1oflxZ7k
TG3NJyMQDBhKfPNmIITcHfR.m8Y5mUt9yIUkIYIy287yedO7NdfSF.fSRRgc
.NrjlRDbAGPILN.xIX0T97yOtsIWOfMKYqRlWlmXN23GTNU.5CpKp14n9W2s
Me+U9K6x274+uQitRPHLoijhzFoRwpEO.bAVY0JEADl.qMPFcLvDfOrawh7M
+ep0R2N6omKppR90aydd81DQuF59ZPkSLmHjHRwc28jy0WgLjeSQtXYYVkdd
xGxV83Ya8jMJ4HOwBp8AfRTnVTQYQVJGJTFko1JpdsWgxNVvkZIkAfoEK2UL
OUa2FRgUI+5F98tolX1tpRsi3R.8hk3oOS+XwRkotjtF4h7ELqU.NWv4OsLY
S9i8hQzPougTyWwQbnDhXPpxNFnI1DuF03rCL0aoZvAmzfYvmyYyjjqVnZ6.
4WKIKTnDkxSkRFAhkbBWprEQprUFdEhRUCiP7PMujBURIRDjfPL.mvjzdCf5
iQHKqFmU8npMYq1tnbyy8BUAaHGQYYORmMDXD.lqL7morpPdwlc547saydL2
IVkMe9rxk6ddUuK0gCvl0QDS.OiUCv3XJGSXBIiKU6bWY2v0liLr1LTaQu1f
UyVm5y2Ff.XkZ8TTPQJ+nMQhYWipUGF78hUU0NW7TvGLTtFxoxFBftDZaCAc
uXpPxuD1uOz.nPATJCpRkc2gn2ydcwFU1RMqWTCGpQmpkSRQHjxxApxZKBlp
ceAzauxdNsfX+oa4eOai1cF8hUz.jLScwVoyQlBTLalNoYyTD0rRA0NimvlT
SwBbLalFylowrYZyt0u7xlo+ikqTysUkbfM7ZRTpsCwxHv1JEBtNedxC5rzm
1GY5TJzdtgUCA1joYOWeyKxU2VqUfsd59UmHNwgNSbxHlSngc4XJ8rl6MOUR
QbStZ5k4IaGLGTgguADB5SR2zlxCH3TJWsIeg86Ln9HIfdmkWDqgzgfSPXgS
gkyYAOcORp+txfGSV768EZprLRqe9ce2fIZRj3rfnN0OYuyPTiGpVqtY0zq6
luJuwubuxtuhOpLu5i4IyTyouorX9geo4EWnVBx7N2+KMu35BE9Y+98yJWsn
Xd9pY4C06M7DvxA68j916AU1f9Rem56L0ljXDzHyBiC8+qgt2YJCXzN53vQN
69CqdNTW.+ML.h3cWfTlJZNBRZ4D900C3HqDtb48ZaB5flcfS8MVaUf3tNWY
+69O058ezmf5N+g7OWe90ric5fe5awjfvseZcVr+HEB+dFMFkM7iC9ldb6Gw
O7y.MIOCuaR32zia+7TC+LHSxyv6lD8M83LSvN7Cf81e.8OCdmmE2wypyK0x
AB23Wtby0v27mevtQRX2guJaulcvsGrNO7qhzQr9fiMroLANiDiMGWbc1jr4
hgHzHy.42cMYMSh9.QUe1W5GXG1pa7f.K1WfUeN7aZjAQmUy3hWwRbWIklgM
a0a2t0V1ujEaf5SbswnaHhbUURF5wCG2dwpAHr1mFTFRZ0B0T2QOqP2oRq3B
VXyp30CN48GRId3g+ih7De6vupRn3BdXU5j0mrXXZyj6HfxGQFE2mIctpRp3
hwjdgQWhLzKFNBIDC7IoUyQ0GHNZpr6RdRYOW5b2rAinYK3WfNliS.Sdzwbd
kP9XTtEWBITO7S3KFBuTRn2XH+RIgvQJgmnrHvYo1y3uPjRatZ.RreJBGW5R
zvQSZCGQIouOZ23IsciwnTF5cQCmLoMbBzZf4UeylNsMaUiB+9PQmMoMbJik
99POmOosaFgjBu9a3ioD+ftHlTAFyZNrSJgwpkQ+grvCIKSlsLOq2XSC+Zha
ArWm6WHOEggDFRxoLLAnqAtDkUQMi6Oc0JzinqRGQe09Fz1ZtHm10iipzld+
SFpS3JA.RkciEWH7hEVCc8mU6zu.Z5S+B07TyNN975ICobhCqZ6hmg2ofifj
CUFFLwSOXRqo5HHn4ox5KWfJrg2o3YxwosytF9.MzGw0AzMPooKHDBTP0oKP
csa4n3Y1wcFpR3gv67veHSSvTeAaSHpFLw.6cet7Tc4HpMEQJgoBFT.PpuAk
.hjdWs5fiKEplEw2rNrC0gtpxTlQWFARIBLUJDXDixnHlM+X39ZAqg4cZLVF
xzKsI2AMB82Pkzu8NI8CkhfVMKDiQeKXhAfNYCmcNM8UwfaSDR4UqjFVv12g
hGD3.IGvQ1oGHw.38PwflSwk9uxZPSz6RuqQDffVNUjdWcFHAMA7K8ctIyFs
Cnb3cAIPhBpb3+zGAUNv9pm5vVQmV8iIR0lvewZHFVedRpsN73q0dCTGU5bC
PiEMIKPRAhVwIp1+L5EAY.Iiw3LHjIZt3XyWOn8kdk79cXoPW64EfV45LSUl
1YeqaSEb0Seg0fcsT4wUZ5u7Jg.sOQZiNGY6Liv4N2X6zadtObPtO+U1gKLV
JGKHD.UP3HLFAcjOrGIHz5DO4NmW+FkdkZtU5EonFROUGq3G6vnWSNt9EuBA
NGpAiREfOMfHGZyDFs0.HXWIu5oRC3kDT8aU+UL4J.SUmeekQD67NYadzU4C
AcHh47AXFp7gPUccMVsTYNfl1C0qwAbNPMtmQ3bgIwYJa7kPvFWkEYV4RadN
3OkXTj.G9F7Up0zzsysvF2y4AbBMv9gFcB3fZ7x7QfgCcl98vbK0oFNUNoXU
xWaCU5M0YewuInZTFRA9iM4DncdY08XsZhxt0cdYve3zNDDwQob8QYFQPLDW
fflLoiviBUyOKKRMB6ZqPyIkmSH1r7XrH0DKRMwhTyarH0LXVNZeZds2DaGb
5SvQ1BUfPYosxxZNiPM+SumMpmoBJSQEHlTi7KoFQsm1I.yd.ELKAgInXNMJ
lSih4znlcqe4kSi98KTFea1VmZubZauy2bmd+cp46RJprozHik4KTllaiiI0
T0CmghPWrnpDAqmByNt1Qkg3xEeu6SPQGk.qOZEUNIv4.FZC3Q7dKquXODeJ
TD0ovAcLN9VB.cuwQDvrK9wjcmpMN4ZIlyOINhBaf7aUDsG4ZJ4ZLz8OUP+h
4xvF0uVHh.l1n985N7dwBPXWsvBpHJ5Dn5aFxNaAuqQOz+PvjitDguKmLJY7
hDhw7wD2EFE0KfLhdmHiPu6qIwvCYXO0LbUIaddxCeN4e6S4qR9m1jq9t4.v
W8jx1dk466z+5l7r4+puekZugq29q91ucdwVkY6a1lmpLqR8gmkVt4wus5ae
XWwx4pYK+vSedqxj+b0lW9PwppxOXr95CMCghOn+dQ91uczEnKXHp9YFqH3J
i945.0WZiaKsq0ID34t5bU0ekOBDfBLRclJPsFFgyXZR8L+yT5i7LOfeNKdi
uX74KY8nDsOj5KBJ5Olbn8hYTebzHTWaK65oQHZL0DB2IOw.OhupT6ykOm7X
YU8nb6387jOU7CEqymWjkjsopX1x7jR0rAKKJVqFAWtd6Ky.juJ8vMaF7q+q
u82sr9Nu+qyWpPqMkqJls8a9E+g+i6+M+q+1O7u8eb+xr1IsMuFxGfhGMRZS
H6BbpP0OJDXl9eDltVVEnxZ6P8IFE3DkfdMTvewh84tDBEiHbfz7Og3vdINm
Pi0QSCTteCwBBPlkrUGTIfONwQE1Y79Xxu.b+xxO0Wg0.xkAnXQPv17WDDCg
X.BZKNiNVjfgtxpNIF75ohGepe.SL8.FzVhGbCQWakUISPA2K5vl9nX0thIS
WGTERFDZlQApO3kDleEH5Cw+6UyvNX.nvrdcIWbX9NbbVPrWEBRYbBCAObVp
5AutHC5FZkLMVkXio3xky6E0.AnvXSpmNGJTe7.IFYN9YNVdqtVSANiKvqFi
4CpDBq.AzVYpCntTl5BUDzyNpXsHzDR5Ie5I0txs1AYpLtydRMYX6BskWac9
UUAtNklkMSZRArT0Fm4DHhq+GAi6gKsyvjRFTqusCF.ikzYzB8RYBzwX.ibk
Ms8OsL4Q0lnW2G9DhJyYM9fQoXAVWAEqAHtINRtFqyq84BlfTiWstfAqVESB
XDIQMKs9eb50oKX18SE8gNulZD7oxjLVx8zITUhZm5b.ytWcvHFbs23w8+7b
hVpwaKyW0GfEhxzcMant1IB9ZrlHZWNq+gbj.jdhpwH09Rjc8wAU3OFoUjNy
5SUIKMozo92Am70rLuet7z9CLB6OD0LwMc92DW9OtdSxur.l72j7W805e9ce
m5OQeSOPGSN8U1UKl0cwOASG5WX703l5Fx9IVvN3tLAIs87UnqPymLC+5Ca.
gxyINMsDVW137eX34cXmY71+y+iY7Vxe8ecxe0ur.2CxQ6ebG9soU00E+TtI
fYXN7t4UjqBd87APCf2Cv09RwIi.rqts3QvAv8tbbsqBXTJiBARrlK.bJ1va
jwfcD.PemMiEBEpYr5ZuNGxGy5cm6YrFDjfSOHgzCo5NCjy83noY95DyN4.Q
T.7+Kl6B3bs04qtAhmDufAv2TPIwkyEL0dvqODpg45dXsNDM8Vqirq04zWU9
OT7LCXKfI+cJjZApuUDCDNcjITt1Osjd0BZ+8CAZ3PsUvtnDjPtTnzPodVn.
L8odVw9TV7QbrLEYdVmmTjycJ6ENPrsBdiDCGFfa.F3FJY8FFvKDIOZWbFGF
nbHNd2ik3IDKOJdHZClAfvO8HX8z9JKHfJKJ3Do9jyRSQMN4rHIoWvrm3hX3
woW17BsLj4WRuSmhAMCqJYdlf0BuT3SVrKnY3RuSnixPlHskDekhPl0QMIUR
hORAMzRgO5EjPKDdkOICsPf8IIexkgVL7JYyyC57E9NDAepjBoPZpeUL05XL
HSHP065CcW+WJfMJ3jznzGiYz0TyBMMMKhwKhWMsJuFNBNYqhIs0LOWMKcNY
8r1tX9NzhExb7Ly6jwuHjS5x7MCfSkgVJ7YhARHwBp2El.dHsKw65fAUFvpz
fulngfAsTm36njPpc5a+AJj47ajuodblLzRgWFGETo.5cJyNzRgWSWDT8BvX
jBXvxL9iQ6LXRgv6JsCLn0uAum1xDoMATN.dWm.Bpbv8U8fDRsCtXD6xMbRg
u01CVX6R70qXgULPiwVmPsi.HXjdEa3JLgI7ZAoxlwCn1UxDFtmq4rcckWHC
LnPaeVay.0cQ+57P8QndKmC2W2dCkuiR0099fnTOdR3FKL85eRDeZSzonM0x
Dn9dRsEmtpp5fguQ9c2vUKjiRUKav.Dj5Z.BU+hXHpUYSACcemSQax29I2sI
hPMDqaaBwfoXp.AADBVJYbHz1lZdml1ji67M1lHs7hxPZDSxSxWMh29Sxq9o
I4IgNwSxjc56WMGSAorleoiOTnpiVBYTHFI3TDGAzyOKr9d6nK8FaEXuvKBa
BTBvFKfOEhQlh9Fbais60vR7T7rn97rrJBvI4YA85YgdqOKByim0gZ26D7rN
IFBmhYHPdshq.MEOJjvCHrqxZ2kMz0D1tKavjoDJEfgTljqqAX5nZgaNBcGe
o2Xqn6bXCMGQaDyZFVmDxt9wzIAr2IwqebBWu+Dsd2Drtwhz9Rn5e0+6W8+C
5QBHl
-----------end_max5_patcher-----------