Filter/display sampleMap names by _prefix
-
@ustk said in Filter/display sampleMap names by _prefix:
formattedSamplemaps
I've done this but can't compile successfully:
//! =================== [ Samplemap List ] ================== ! const var SamplemapList = Content.addViewport("SamplemapList", 0, 0); const var Sampler = Synth.getSampler("Sampler"); const var sampleMapList = Sampler.getSampleMapList(); var formattedSamplemaps = []; //String.replace(var substringToLookFor, var replacement) sampleMapList.replace(sampleMapList "BD_", formattedSamplemaps " "); // SamplemapList.set("items", formattedSamplemaps.join("\n")); inline function onViewportControl(component, value) { Sampler.loadSampleMap(sampleMapList[value]); }; SamplemapList.setControlCallback(onViewportControl);
Could you please show me an example?
-
Actually, it's a bit more subtle if you want to make operation in an array, you should do this in FOR loop that iterates each member of the array.
I'll try to find the time to write something today -
@ten7kur That's you ;)
//! =================== [ Samplemap List ] ================== ! const var SamplemapList = Content.addViewport("SamplemapList", 0, 0); // Allow the viewport to list the items SamplemapList.set("useList", true); const var Sampler = Synth.getSampler("Sampler"); const var sampleMapList = Sampler.getSampleMapList(); // Populate the formatted list in a new array const var formattedSamplemaps = []; for (i = 0; i < sampleMapList.length; i++){ var newName = sampleMapList[i]; newName = newName.replace("BD_", ""); formattedSamplemaps.push(newName); } // Update the viewport SamplemapList.set("items", formattedSamplemaps.join("\n"));
-
@ustk
hmm...doesnt seem to work....
Although I can see/partly-understand the logic -
I don't know the solution at present as I haven't looked too much at your code, but I will when I have some free time if somebody else doesn't help you solve it.
However I noticed some things
const var sampleMapListFILTER
sampleMapListFILT.indexOf(sampleMapList, "BD");
The second one should be FILTER not FILT.
In a later post I see this
const var SamplemapList = Content.addViewport("SamplemapList", 0, 0);
const var sampleMapList = Sampler.getSampleMapList();
Those names are going to cause confusion, luckily HISEscript is case sensitive so the code will work, but it's bad practice. For the first one try something like
vpSampleMaps
(vp = viewport).Also stick to one format,
sampleMapListFILTER
is weird - why all caps at the end? andSamplemapList
- why does it start with a capital when your other variable names don't? -
@d-healey said in Filter/display sampleMap names by _prefix:
ar sampleMapListFILTE
Yes, I agree! :)
Some of the code was commented out. I was playing with it before....@ustk 's example looks like it should definitely work , it does ADD text, but does not remove BD_
-
@ten7kur
No sorry, It does work! Brilliant!!!! Big big thanks!How could I also escape directories?
I have sampleMaps inside folders inside my SampleMaps folder in my Project. -
@ten7kur Strange, it effectively removes the
"BD_"
part here...
I am not sure it's a good idea to make subfolders for the samplemaps... -
@ustk
It does work!
But how could I remove the other sounds "SD_", "HH_" from display all together. Just display the BD_ filter.OK. Fair enough on sampleMap subfolders
-
@ten7kur there are two ways:
-
Replace
newName = newName.replace("BD_", "");
withnewName = newName.substring(3, 100);
if you always have 3 characters to remove at the beginning. -
Or use this instead of the loop in my first example:
// String part you don't need const var charsToRemove = ["BD_", "HH_", "SD_"]; for (i = 0; i < sampleMapList.length; i++){ var newName = sampleMapList[i]; for (j = 0; j < charsToRemove.length; j++){ newName = newName.replace(charsToRemove[j], ""); } formattedSamplemaps.push(newName); }
The latter allows you to fill the "forbidden" array with any characters you want to remove
-
-
@ustk
Wouldn't have figured it out my self! Not with my current Javascript knowhow... -
Looking at this further, the filtration of BD_, SD_,etc..works. However, once I click on an item in the list, it does not change it in the sampler. (The sampler name is correct)
Im using this code:inline function onViewportControl(component, value) { Sampler.loadSampleMap(formattedSamplemaps[value]); }; SamplemapList.setControlCallback(onViewportControl);
-
How could I also hide specific sample maps. So only show "BD_", or only "SD_".
How would I 'categorize' them? -
@ten7kur If you think about it, you are trying to load a sample map with a wrong name...
hint: DoesformattedSamplemaps
contains the real .xml samplemap names? ;)For your second question, it will be a bit complicated...
Ok, for loading a samplemap, you need to call its name
But, here, for doing so, you are using a value and look at the table the real name that corresponds to this value in order to load the SM (hidden hint for question one ;) )In YOUR case (because there are different way to do it), you'll need to split the samplemapList list into several subSamplemapList depending on characters they contain in their name
Then you can format these names to remove what you don't like into, let say, FormattedSubSamplemapList
Then you can load them in different viewports
The value of these viewports will correspond to the different subSamplemapLists you can use to load the right SM -
@ustk said in Filter/display sampleMap names by _prefix:
n their
Got ya on the sampleMap loading.!
As for assigning categories,.... still a little puzzled..
const var charsToRemove = ["BD_", "HH_", "SD_"]; const var smCategories = ["BD_", "HH_", "SD_"]; for (i = 0; i < sampleMapList.length; i++) { var newName = sampleMapList[i]; var category = sampleMapList[i]; for (j = 0; j < charsToRemove.length; j++) { newName = newName.replace(charsToRemove[j], ""); category = category.substring(smCategories[j], "SD_"); } formattedSamplemaps.push(newName); formattedSamplemaps.push(category); }
Wouldn't
indexOf
be of help here?
So far I'm thinking ....for (i = 0; i < sampleMapList.length; i++) { var category = sampleMapList[i]; for (j = 0; j == smCategories;) { category = category.indexOf(smCategories["SD_"], "snare"); } formattedSamplemaps.push(category); }
Any help, very much appreciated!!
-
The
String.split
method is the missing piece:const var names = ["SN_One", "BD_One", "BD_Two", "SN_Two"]; // this will hold the samplenames sorted by category var obj = {}; for(n in names) { // This splits the string into a list using the given separator var sp = n.split("_"); var category = sp[0]; var sampleName = sp[1]; // We can check if the category is already used if(isDefined(obj[category])) obj[category].push(sampleName); // append to the existing list else obj[category] = [sampleName]; // create a new list at the key }
-
@Christoph-Hart
Thanks for your input. Really appreciate it!
The code is working, but only partly. I don't quite understand what exactly is happening.At the moment the viewport only is displaying BD and second item xx1. [BD_xx1 was the last item in ''var names'' that I added before pressing compile].
It seems like its listing the category. But I can't see the other categories.... Im somewhat confused...
Im trying to show the categories in a different Viewport to pick from so I could see the sampleMaps[hopefully] but can't quite get it right to display. The category viewport shows items but the items all have the 'undefined' text.
Full code:
Content.makeFrontInterface(600, 500); //! =================== [ Samplemap List ] ================== ! const var SamplemapList = Content.getComponent("SamplemapList"); // Allow the viewport to list the items SamplemapList.set("useList", true); const var Sampler = Synth.getSampler("Sampler"); const var sampleMapList = Sampler.getSampleMapList(); const var names = ["SD_one", "SD_two", "SD_oi", "BD_one", "BD_Three", "BD_Four", "BDs_one", "BD_xx", "BD_xx1"];//, "SN_Two", "SN_Three", "HH_oneone"]; // this will hold the samplenames sorted by category var obj = {}; for(n in names) { // This splits the string into a list using the given separator var sp = n.split("_"); var DRUM_category = sp[0]; var DRUM_sampleName = sp[1]; // We can check if the category is already used if(isDefined(obj[DRUM_category])) obj[DRUM_category].push(sampleName); // append to the existing list else obj[DRUM_category] = [sampleName]; // create a new list at the key } // Update the viewport SamplemapList.set("items", sp.join("\n")); // Load samplemap inline function onViewportControl(component, value) { Sampler.loadSampleMap(sampleMapList[value]); }; SamplemapList.setControlCallback(onViewportControl); //! =================== [ /Samplemap List ] ================== ! const var cats = Content.getComponent("cats"); // Allow the viewport to list the items cats.set("useList", true); // We can check if the category is already used if( (obj[DRUM_category])); // Update the viewport cats.set("items", obj[DRUM_category].join("\n"));
HiseSnippet 3220.3oc6Zr1aaibjzNL2IcQWyc3.Z+RA1HTfHi5yVRNw2iff5XYmytW7CXojqstFtqEWIwKjbIHo7iKH.4GR6+g6mP+sb+B526GZmYWtbIodXEm3qosQAHl6r6L6ryL67hb+PdWVTDOzvrTmKBXFl2xp8E9wCZMf53ar8FFl+Bq1Tu.W1Nzfm3DEar9EAznHlsgo47eCtHyR2vP76e76Vm5R86xzfLLdF2oK6INdNwZn6u125359XpMqiiWlUeu01tK2uE2kODXn4spaDP69bZe1tTbYyYYXdyMsch4gsiowrHCyarN29h1C3m4KW+ybhbNwkgCZXzFHjD7i4t1HGiPMZMvw0de0AOxvvzZesXXdoX3yr1ww1IEtVbbawDDMFYkGlyMM1qQV1q9rydlYXuaHYuOwpc2PmfX8LHu8QVa6GyB6QAUPV1RtVi49m2zpEGVge7RdzmydbHLHEiZqVu9hj6Wu9BOnR4JkWd46Pd3n+HGRjlCdz.BZOPNZLKibmJkAMIL6ozPMBh0+PhhG5yhaw8B39vfZUysppJlf7HWW9Yj3ALxoNryB3gwjXNwEoDBzIl4EUobNjWJhAzaXDSPoEIwgCYR5UjmBAtQXti7RBHEmDJ3AMFQYuEf3IWkFyjopUbq7Ai2H.gCq1diigCKvQ3SwmwSdh6fOrd5jvScFDxTO+X31f7wnLq37ySenQ0idvxKizZ2i6jP0c0jXqsPzPLORITiG3DQNCtCRF.ldBAo73I4UvdJlYSN4BRWvNtOO7hJkwSB+juGNGu3kBxziGVym33KOeKTo7KpTl.+.x2AIeTfqSbjj1wgN98g0BZNpT2MLBgfS124TlOIhEPCovUGIQDB7.Xy7WRPmZUONwjPM6FG7zcNVwdvBiBNrNd9xMu7PgdOjqnwQoz.XyuiAmOeR2ArtOm3zSvMoTDNAT2PF09BfWY1Rjb5UyIZCVOGelcMPZbXNt3nEVPtL72nytTvvnA0zrzBO.YBZP.y2FsowsmcNHbPICJjjDi4FwlFYQKKMQORPzt.iGy.YsO6Lo7lJut7bFnJeovF3oA13ZxdyZr2iD2v.6nnfk9dtiesp+Y+pKjd87IbpchsCfUkxN9tfvgzane2XGtOg6+rDhi25C4t05ptxuHnmbgaloVNpaTt.MSuRUK28tCEnbzBOnDbLdvX32jcoE008DH1QsQ1ejymruskmQma4ugC5hnI5WCmrpbWmQmYHFSxG1U0rkLVyUkVbr1BZ1PYBLFa5hlDYT76xiY64WagxunboxurLo3T85M14RzSnm3wMMlwP3zPrl+PuSXgJqK0BgPm4iMaM4XyYScnqTolYgb+s8ch2Ct1NoH1FIVBPr64S3J3oXQj6OMIxMyVYXZ3XqyxJwT1Pv7YyixXFIzMsP81LfekD7eB8Dlq.0aY0RpWcXoDHGLimt8FzXJbrlKSJIkmPhiksV+f89t1advJYRFAEoxrFukUikpm7yHMwwaYUWCMatiUrV8d5Yxm+XEqlYv5xxgb8gf55YrvHvrALCrV890g+bskUHxBllu0ypSjAYRdcAe5rmWm3992vhk4.zKj6Ag68XmMfExH0XNfOfPBCtAYCojBdCnPX6ttCsYDdHYS+9f2cgC5ee681UlU.35fBd+RciCIkT8qkOdXBj1COo5hpYow.mkNTvrUkCNRAr8HTnCOPSAdbL2Kc3ANdEweqsFgChCoN8GDmh0l18YJzHxfIKurHsigm.4qf44HnCQOSO9PHR8CSVwRfWj3Zn6vEjRUc7fGu8taLw3A3jUU5BIlHNA7HGgirGhBPBJwVxw2lc9d8pc2sAGvjFz6VL0R0M+FSb2RWQgrYUvadoX1LI30n3txkh6J573+tPGLiDHkSHGDou4njLB8IzvP5EEhnl3zASu4nzDNswDNQCtjLszqSlckc590lklwSRF3zHY.VPOFJlpmSHtcoA7.rv.SjK3CICnmxvXyX7MbwdDQtqxLYqTNUrlO.YF1oXfwImXTiKOyHfy5wh6NHWr9zoDLc7.ZrDMLGfefExImPAOEjZCgc94xf6vNbB+D942AyTsjKuK0kjIGZM6mjmEv4k.tKh6xVJ.N4XYZPfPMNUI+1zA34DRKqDvQQrLIzPjRP.HnesyHuKkZhkWJh52CmTJFxhOtTi8omKXiLICNckSyqnxgTCsh7PWNPR3fZvIlftXyI2yKx01Tvo5Y3dTagizxT8dfxo6FIrpkNvQfBuvPBZrtwoaAtPXOTxyixnUkzbCN4LvtgcJ3yG42yn9.6BJ3ZnKdzdWjTBAxJYQLeRvMUHCjrKR.lYgQMN.5gASfPKPILmAwRTFHv+WU7LxRypZr4koFaVPMJ+GpPPeHf3lK8eHNru.kWeM4md0eEh.4Q8+oW82VDDePZGPfP4DazB.9xEQOAkzKeaHB03W+NzvSYtiCmNC3guVHzdX.KbZbEt9iJ39uEdcdc94S18e5JzNhOj7ZdzHuFGKHVJDLkHSL.iMpbeiOCEnKitcbUEjFBHsy.oo.xVaogrh.Rq+3NZP2S.pydRPuuYUuoMqBX884ACcUEABQH8vzzrk7N3.W1JgQhSmtvzyTl.1.UOf4wOMsAPxrMU6uvAVtf9CngQc3I3fMLCMUjcvJoUYhVXk4X50JWhBS.gYoabYZ31TZC26az16az1+AZz16BsZ68Ma6ctlsoqdr3kzTOvo2uEPVdYwsWXXC0HQD3lpQhnuqjZyok5tx3H41mBkEVjGFuFBzJG2ZqGs6ta9j1IZprflrpXzUojT413oHjvJualbHVB6qG0wOp1c2Zq6J2APyIVxBuPnmHiT5yvSRhiIZDvctCIMx+KEdOHWFh6tWGIxKA+ppua+xw13Tws0RB2His4oSX9rMPcBKIoIpSm.EZjZ1Ei80bJM8z7x603GXIjCp1LNmUZyEMMaCQZwdAd6zFHp563nsL61V6vswDWx2MNrEiISfc4KeayvVi4G4DeQglPNltzMq63mXsuCTd1D1xF42x5y7Vlz1wJVa1qGTXmd+tg0i+CWdOFyRpecGUWiiAOVdf0XRL.A8JYoF8VnUserUy6u5UqWs6GxDgjb9AF1S7urwW0LyNODjBgp4tW8uZ0B6+i7.apQYfji1Ar.HXMnhD79J54O3fuIjOLPgctSqPs1IDhtARrBysmOq8.dbAIQqPdTTO37JHZTgY2eXXelcAfGfEfGMB3cG5AZbeev0hzJ5oQL7sW3zcGJ3O47BKWre06PEuDC3BkXbiBiaVX7JEFeuBiuegwqVX7WnGmlGAZP8o5uZDRWdvEjUGmOCyads1i8e98Wjqq9kTaYaGTTroOTjLGfHkOP1szgtwJnMJro6v84AC39NcGwXAz886CWUyyMShKeTbLX8h.ueVh3xnQhqiMxP6m.ITRCUWQdMNpSS59qrjr.Ac.Pd2wqb82A7JOMt+iStBQf67gwW+RqaYItQSPe0uA61A7gXgUJWTVfWLY.8r9xZZjLpdxaxBJMqNJ.+7FpYZj7lXgYZjLiQWEIfcN4YYNCyCETC9gRh15B9ScKnSiffGH+fYZbcxhdztg7i6JS.BYzOT.AVou3EPVxZGbLogJ0GKjKM7.WaG2saNpLBNMuB3rxU.m6cEv49WAbV8JfyWbEv4KmJNXTkGMLl6IcQ..1eyjLQ2TaUUOMAWvZOfEFiuPbSyMXmBIdHuUUB7oG87Xdf309mTwig4G8Z8h+OO8k1SBV6hreyjwrywugRq8EsfOx3LG63AoK3u3s1.F95FRg7imtVf6v9N96SCAwQLKb2DohhBhBn.KTq02n74m2vHorKPNYZBDf55z22SbFtokKqWLJBROVe3r7YHj4zPyeZJrW4OLu5OU7vXb7ZIb6JVPcCxNCUdFeJGeeyY5yeXBL9qdzZIbpk4.XrhKsL+kFuUx2vb9L9Z0eXsWKeXouMBiZN2X3W7CD4Zlem0XvWSeStuYUVck+voCl4Ob5bERoV1eesrkPof9iqkq3I8dMl5lTS9gqUnnI8QoPES5IRKWReFGoVI8TpBkzPzUIogkqDIomjQJRRu52opP51fW2i+VGHu3s3mYeQyQ9.09fY6CTCH29TP.jYkq6zOcqjPzVyYJPUvXY934Mt1pO6mgagWu9ame1XWiqoBBMmOa4fYuRjVKnl2G6ARUEnBxmsVZIfJP+l0xV92URVzX1kEugUL9ecwIm++6iSdkp08cQ87DJT9mUVcFJg0xbNLDaZQrVXzQUYrVl+K3mtNVYryjJYkSNKUaaNWRs1ZS5WyBsei4x2Wv8+KVvs47F+a4jjGWA
Thanks for any/all help!!
-
Hi all!
I need help!! I can't manage to get the categories working. theres something I'm not doing right..Could someone please have a look over this code and see where its going wrong?problem 1.
The sampleMaps List is not taking effect of the categorisation.
It should for"BD_Ludwig_Jazz1.xml"
take"BD_"
and put it inside its own"drm_category"
and"Ludwig"
in its own"drm_sampleName"
and display only sampleMap:"Jazz1"
but its not working...
What am I missing?
@ustk ? @Christoph-Hart ?problem 2. The categories them selves (CAT1, CAT2) are not displaying correct.
I can only ever see 1 items in the CAT1, CAT2 viewports.
Why could this be?Pardon my Javascript skills,
Thanks!// =================== [ Samplemap List ] ================== // const var SamplemapList = Content.getComponent("SamplemapList"); const var SamplemapList_CAT1 = Content.getComponent("SamplemapList_CAT1"); const var SamplemapList_CAT2 = Content.getComponent("SamplemapList_CAT2"); // Allow the viewport to list the items SamplemapList.set("useList", true); SamplemapList_CAT1.set("useList", true); SamplemapList_CAT2.set("useList", true); const var Sampler = Synth.getSampler("Sampler"); const var sampleMapList = Sampler.getSampleMapList(); // Populate the formatted list in a new array const var formattedSamplemaps = []; // Remove string from sampleMap name const var charsToRemove = ["BD_", "HH_", "SD_"]; for (i = 0; i < sampleMapList.length; i++) { var newName = sampleMapList[i]; for (j = 0; j < charsToRemove.length; j++) { newName = newName.replace(charsToRemove[j], ""); } formattedSamplemaps.push(newName); } // put under category const var names = ["BD_Ludwig", "BD_Xyz1", "SD_TamaSLP", "SD_Ludwig"]; for (i = 0; i < sampleMapList.length; i++) { var newCatSplit = sampleMapList[i]; for (j = 0; j < names.length; j++) { // this will hold the samplenames sorted by category var obj = {}; for(n in names) { // This splits the string into a list using the given separator var sp = n.split("_"); var drm_category = sp[0]; var drm_sampleName = sp[1]; // We can check if the category is already used if(isDefined(obj[drm_category])) obj[drm_category].push(drm_sampleName); // append to the existing list else obj[drm_category] = [drm_sampleName]; // create a new list at the key newCatSplit = newCatSplit.replace(names[j], ""); } formattedSamplemaps.push(newCatSplit); } //sampleMapList[i].set("visible", false); } // Update the viewport SamplemapList.set("items", formattedSamplemaps.join("\n")); // Load sampleMap inline function onSamplemapListControl(component, value) { Sampler.loadSampleMap(sampleMapList[value]); }; Content.getComponent("SamplemapList").setControlCallback(onSamplemapListControl); // =================== [ /Samplemap List ] ================== // // ============== [ Samplemap List Categories ] ================== // // Drum Type; BD, SD, HH, etc inline function onSamplemapList_CAT1Control(component, value) { SamplemapList_CAT1.set("items", [drm_category].join("\n")); SamplemapList_CAT2.set("items", [drm_sampleName].join("\n")); }; Content.getComponent("SamplemapList_CAT1").setControlCallback(onSamplemapList_CAT1Control); // Drum sub-Type; // BD: Ludwig, Xyz1, // SD: TamaSLP, Xyz, // HH: Xyz123, etc; inline function onSamplemapList_CAT2Control(component, value) { //.set("visible", false); //SamplemapList_CAT2.set("items", sp.join("\n")); //SamplemapList.set("items", sp.join("\n")); }; Content.getComponent("SamplemapList_CAT2").setControlCallback(onSamplemapList_CAT2Control); // ============== [ /Samplemap List Categories ] ==================
HiseSnippet 3469.3oc6arsbaabEPxvIj0L2ZdnuzY1poyTpIJRjTVJI1Moz5hCcpjsFQEmLiphlkDKIgMHVTbQRzY7L4SoeB8o9b9R52P+CZO6MfEf2fjsbcaDch.2ama6YO2VvCBncIggz.CyRGMxmXXdGq1i7hFr8.rimwi1wvrrUm.54gjfML1ZjONLjXaXZt3WyF2rzsL3e9W+osvtXutjztLLdJ0oKYOmgNQo8dPy+riq6Cw1jibFpM6617QcodaScow.srnUMCeb2mi6SdLlMsErLLu8t1NQzf1Q3HRng4s1hZOp8.54dh4+TmPmNtDVi5FsA.I59gTWaFEy50X6ANt1Gn34PCCSqCRk.KJj.er09N1NI8mJI9.9.nzUnKOLWXVjWccxqVwIOSMx6VBx6CsZ2MvwOJcDFs8qrdjWDInGF1BzIKwbMV3eVwZaJLCunUGheN4gAPijUTcyZ0VAsQsZKe+JkqTds0Pe43ePGiZiG56RFh8Q64DFgNYBSCs1ZUJC6jvvmgCRWAeAeIRQC8IQaSG5S8fFUWJyrVhQDSABmt8CNpdw.CepyCVMJNrZrThv4AttzyQQCHnybHm6SChPQTjKiCYc5DQFFVobFHrZHA.ZbHgygqfhBhIL3MNIW3Y1XZyj8u77b.vn7y0L1T1khICxIkB48texdlbVoqTNT0DAxAT+XWPsmy98nACwQQDagDwwCgQdjyQ3f.7Hc7jLwDVKDv1wmHYA.tGRFROifBiBb75i5EPGlRbHOvvfN35N.GDdDUtF.PKs0NmBhkkZ0h+nMzR.a.wnpNvTpcejC5OlkgW0k30OZ.Lxm7IKWoLB97ihGLj.LByfDr1LK5XGFjYSR7WNFdl.COCvPFZKACOKACZXg8IEKxusZ.w2kcPMCfN9Ym.7Ee2SsxWlf+7h1U8iCGTUBO0RdoNQyE49wQnXOaPgoKrg1mFjYKiIyCUx18hsO2oOSzBM99QuntTJeDdHt8dGHaIm0IoD4UXCnTlcfswQs8cchtr6Bbpe9RePJDMvIDcN3nBM.rOyUqEXRH..itL86NizDRpUynQZGFV+wWx01TC.TSUO1wANLzPcNzKIgiXjPHiMCE3WbHvwCL0fEGshCY8vFruyYDOTHwGGfAePYAF+LsOSYZUN7ptzoRaY4mkcvvSUbDS35ebMs8sLSSHNTmE7Ot9IiAQfI9NBHg7.0eR2mib5wo0DD.7G1MffsGAbBwN6hc5U0IbGROGOhcUPddrNscxx4DerOiMIgFeVhc46yHKruOwylYzlQPjK.gISRxDpYgKwMjT.LwNQjEOmvwSWf6.qhB6e7sLrvEwyIizUT0+jsmrZ6ZsRrHv0llfk.si2yyhfBl4LjTZs0xe7R3x4LQnLvA7dXP.oYLoTIMSIequsxmfxO4D8Jx8Wx.1DHwmQc7ptzewaokWN0svdTrc5I+Jkc7bA0DTuXutQNTOD0KCVXN3CntU6p7tuBnE6B9JqTVdrS4gyE.bhKtpYYd9RNY46CbH6bcgBjgweRruM10sCDQa0ISbLtapgcsVQi6J8eiAqwidaag1qCXOaF.D.zNAwCQrXOuOZqcVA0F9+VsVAQh5BRu4H64gzL6MfRSKFHkdQtS0YUIJMs3hxrZsClYVew2LkgSVfcTcVVSokKECi67oBIIuus14dHg+wUPLGnqnra1FFP5FkORx.sZcO9LarNqKXK39yU8mKSl0V.bNelmqWas4IiC8ysqLgkMmUbI1FZT3sgFy5z0DNXMmiDPfKox3GSiHOwq5xk+wxkJ+xxn7C0q2DGSRQrvumzvrjhCl0Bq5EOrCIPs8olHjcX1zOsld5m5YG2UHx0lH06QdNQOAbPNsjRMj6SrrmkTEL0HdxoUjImtGtCw0vARA81V1jvtFbx0vrmkz+BXIALjzpkt6puR66asyWoexXhyJLwOw8f4KOIwFPPhyltdGNcUWQX6pHLdFly+CO4w7eFGuejDuD6mJcAxQ96akQWUQDokNon.5isF21yqUn0XBP6aezN3HLr8ufV0IJO0xGs0gO46Zu6gqqUWBlpmn.R2wp9p0jeLRpgzcrpk1qdYjpXs4cSGIaojpX0PaUyqbRaECp0OkDDBGu.EYqM2nFSe95p.QLRvz70dAd3ESRVhm+wut3k3gaO7qIQhLcDYVSGRNe.IffpRbff1BPDvRisMjnyYNXvQeW2XaBBxoZWu9fCGdzReS6m73Jk4IE.pDPHpIwTAIEtz8De8XYOsi6rzJpQYQ5EjzjSrKIZbhpy1iAgin9oPfFEQGlz7Pmg4WeqViQAQAXm9ChRV0t18IpkgDdgzy2Uc5X50bJYF4Jhhp+FyckhBKs1Ziu10m6ZWOsnTeWfCKUCHkUH4Bg2gPY1hdiW6ktod5RJ4BKAUaVBprsRYBVoySlMUB9ZSRRkQVV.bnnzW77t4UBxIfgtjX+gUwbMhFQiQCvmQXIfwhBfM4gHddshrbqTNQrlMrAMxIelAiGETBLleB..k0CBlZPlDTSFhSzQCvQhkwRb8Ej.JpCFNChpFCX94h7b.Lzg1gdwuikfZIWZWrKRKg5TxWlNAK.Vf5BotjU8ANmEtC3JNcMKg9jjF7vc4okAY5qUpQjPBBcB6u1Zx6RIpXYkhr82imV.0hi.yUYexQfkWjqL1L8MmFWwMGTUlVzP1gYHsXXa.RPlY7JibOqHOUmB3pmxvQ0kOIUllhClb5ODx0pElFYcxsuAY9S5FkfB1DAbnjmmnsqJf4NTz4fdC4LvZJidOG6AjKrAWkY7jouy82h.GtqvJBR.xOf.RVd1UKOtxA.OlYZvnsWez4fUZkBB72k3emQREcarw71FajaabF4WdyUDbyUDbyUDbyUDbyUDbyUDbyUDbyUDbyUD7KjqH3la.nP2.vMko++tkoWnnALPkIWp9oLtd45mxTjkre1.HWY60mrg4hypD6lEoT18nP.YpJ0tfURIZMMaSiCXUT8CRJCqp5siW3wOvZepMKJ8r0zjUnV4.rZkls3irBL5E5DMJWobmPsNKJF+PqCbfTwmBJqmEk0JLJkEush0t85AIwmhuaY8vue9UpUGT+1iTUQOBbeODBLP5dfCuRVpVuFJ386Y0XiMuZU79f.B2akyKHrab3yq+EMzvbLHEBTic2Zewl4v+CFB5TiS.RV6PhOD2BrEwo80SG+vC+5.ZruZ0Y3V915QAfU.Phkarm3QZOfFkSRrc.MLrGvubfFlazChC5yDtY57PVwVBGq6GGOD1w87fv0DZQeaHgcWYNc2GCgMeQtoywWsiv7qLCNPwaWOW6F4Zudt12MW6Mx0dybs+rz1IgXvTn9HqjlntT+QnMmjMCyaesdSEu4sWj4tQJoPYaGlnXWuy.kanGg7AxB.G6Fo5sdNjtO0i5Of54zcLkEXuuee3nZVpYZT4Chh.sWVmanCDWBNjebrtFr2C71iCTGQtDr5rjt+FKAIfXF.Pu8XUt1aAVkmE0+dxiPH3LePz0uz5NV7SzHls5WArcHMlk1oxDkEXES3PW2VVCCYqZx6CDRbsFS.9o0UiTWdu+vH0kiXzUAB.yxuKhYXQhGyNjzaqKXO0M2dZH37fQOrHMtNIwg3tAzS6JB.hQnuKuGXld7qwsj09r1njq71hQkFCASam1saFnL1ZZbEVy5Wg0b2qvZ13JrlMuBq4ytBq4ym4ZXdUdPbDcnvDAzwA6JiDc2TspZIA3BZ69jfHG1qrh4Njyf.ODmpJA1zCedD0m+RlHyx.T.lyqYxEounB0aNJsw5MO2wNZPRG0dYyAD1kGkNkurYD4hn2XuhJXWm9dC4L0ssbI8hXxj4ympWaEMFsoNiZjiQ88GiQWUxnuddkWlMeT9R8ZvjxTM+qZL0O0RRwkrNfe8XgFYYx+V+7L4Oga56F22w6.b.n9FQBdrTKVAAdJtFK3cKK4lRK541iJq2ngp02fewKpq2PMxorFqWlu8yPvS5EF2IWyFkS9CO5sxasS3oPq5hX4ZTd+snWTFjWv+IeHlmhTvA1n5Ya0Q07H9EfVOayFkk0WmSqn53bs6TVxry3Qio+THMl9iFS9gTVMwGxaGPSFN2uN1RZTtHeGVVQdp1oJXiranW11sZcJWGXFOkpGE7aBx5R0L4ZXT5ayuioMPmB0yDFRoLWjdl5PMJTO5Ck+vxD5Z7uL1j5LotF6KFx6hE7pYZJdy7xay+x7l9cg96kWFClYMPZ7CSv.YNRQXPD7i2dmWMxpgFY8y+PyYPV+bmBSVuqzL8qi7PMWTKF7zeAqWK+BNecjdk4BSfdYu9kWyzaQyM6Z5G+5qVE2tx+Bk8K7uP4LEXSMsetodo0T892alonZo3ZB0SSM361LWwzRYkbURKcfjxnkxiiUCszgTEPKsmzpmk1WlRmINTNVwyRm8aUUN6Cs1J0wCK7kwdO4emh8dxCv6.LHAzl4VN8SvknGc04DoNmxz9YpabsU3t2.GCudM3tXwHWiqoJEZtndcB0OSjTjvTZehLjp7fpd93lI0FT00uuodcAuRxh5EWV7JVJw+myQ4h+h2Q4UpHnuMtOOkJn9FkTKPsMsLWf4iMo5lV7n5k02zx7eCeRKvov4orDmhAKRYXMWPVD1TU5KYEXekoxapD6+OVIVyEM9O..GUX2C