diff --git a/!TheEsc/!Run,feb b/!TheEsc/!Run,feb index c619d7e..54b463e 100644 --- a/!TheEsc/!Run,feb +++ b/!TheEsc/!Run,feb @@ -2,4 +2,5 @@ Set TheEsc$Dir IconSprites .!Sprites WimpSlot -min 256k -max 256k Dir +RmEnsure DataVox 3.69 RmLoad .DataVox Run .!RunImage \ No newline at end of file diff --git a/!TheEsc/!RunImage,ff8 b/!TheEsc/!RunImage,ff8 index add60a0..5026c2e 100644 Binary files a/!TheEsc/!RunImage,ff8 and b/!TheEsc/!RunImage,ff8 differ diff --git a/!TheEsc/DataVox,ffa b/!TheEsc/DataVox,ffa new file mode 100644 index 0000000..1ef1f67 Binary files /dev/null and b/!TheEsc/DataVox,ffa differ diff --git a/!TheEsc/Makefile,fe1 b/!TheEsc/Makefile,fe1 index 59a8bca..349038d 100644 --- a/!TheEsc/Makefile,fe1 +++ b/!TheEsc/Makefile,fe1 @@ -73,6 +73,10 @@ o.Intro: c.Intro o.Intro: h.Graphics o.Mission1: c.Mission1 o.Mission1: h.Graphics +o.Mission1: h.Sound +o.Mission1: C:h.swis +o.Mission1: C:h.kernel +o.Mission1: C:h.kernel o.Mission2: c.Mission2 o.Mission2: h.Graphics o.Mission2: C:h.swis diff --git a/!TheEsc/c/CTheEscape b/!TheEsc/c/CTheEscape index 106697f..4f9704c 100644 --- a/!TheEsc/c/CTheEscape +++ b/!TheEsc/c/CTheEscape @@ -6,7 +6,7 @@ #include "Graphics.h" #define SKIP_INTRO -#define SKIP_MISSION1 +//#define SKIP_MISSION1 //#define SKIP_MISSION2 // SWI Registers @@ -51,6 +51,10 @@ void exitfunc () { free(buffer); free(fontbuffer); free(tilebuffer); + + inreg.r[0] = 4; + inreg.r[1] = 0; + _kernel_swi (DataVox_Unset, &inreg, &outreg); } int main(int argc, char *argv[]) diff --git a/!TheEsc/c/Mission1 b/!TheEsc/c/Mission1 index f66f591..d234ba6 100644 --- a/!TheEsc/c/Mission1 +++ b/!TheEsc/c/Mission1 @@ -1,4 +1,7 @@ #include "Graphics.h" +#include "Sound.h" +#include "swis.h" +#include #define PLAYER_Y_START 100 #define PLAYER_X_SPEED 10 @@ -11,6 +14,9 @@ extern sound_composition_save(char *filename); extern sound_composition_load(char *filename); +extern _kernel_swi_regs inreg; +extern _kernel_swi_regs outreg; + enum sprite_e{player_ship, durno_ship, ship_trgt, durno_ship2, ship2_trgt, player_shipl,player_shipr,explode_start,explode_shp2,explode_shp3,explode_end,photon1,photon2,plasma1,plasma2}; char *sprites[] = {"player_ship","durno_ship","ship_trgt","durno_ship2","ship2_trgt","player_shipl","player_shipr","explode_shp1","explode_shp2","explode_shp3","explode_shp4","photon1","photon2","plasma1","plasma2"}; @@ -140,6 +146,12 @@ void game_spawn_projectile(int id, int Px, int Py, int Vx, int Vy, enum sprite_e Projectiles[id].nextframe = tick + 10; Projectiles[id].damage = damage; Projectiles[id].collidable = 1; + // Play it + inreg.r[0] = 4; + inreg.r[1] = -15; + inreg.r[2] = 1; + inreg.r[3] = 1; + _kernel_swi (Sound_Control, &inreg, &outreg); } } @@ -785,7 +797,31 @@ void game_setup_audio() sound_set_voice(1,"WaveSynth-Beep"); sound_set_voice(2,"Percussion-Noise"); sound_set_voice(3,"Percussion-Soft"); - sound_set_voice(4,"Percussion-Noise"); + sound_set_voice(4,"DataVox-Voice"); + sound_pcm_loadsample("sounds.torpedo"); + + + inreg.r[0] = 4; + inreg.r[1] = (int) audiobuffer; + inreg.r[2] = (int) audiobuffer + 20000; + _kernel_swi (DataVox_SetMemory, &inreg, &outreg); + + // Unsigned 8-bit PCM + inreg.r[0] = 4; + inreg.r[1] = 1; + _kernel_swi (DataVox_Type, &inreg, &outreg); + + // Not timed + inreg.r[0] = 4; + inreg.r[1] = 0; + _kernel_swi (DataVox_Timed, &inreg, &outreg); + + // Bitrate + inreg.r[0] = 4; + inreg.r[1] = 4000; // I was expecting this to be 125 to 8KHz but.... No idea + _kernel_swi (DataVox_Pitch, &inreg, &outreg); + + } void game_draw_hud() diff --git a/!TheEsc/c/Mission2 b/!TheEsc/c/Mission2 index 0affaef..295fd5a 100644 --- a/!TheEsc/c/Mission2 +++ b/!TheEsc/c/Mission2 @@ -266,6 +266,7 @@ void game2_setup() game2_loadmap("m2_map"); game2_loadsmarttiles("m2_smart"); game2_loadareanames("m2_areas"); + game2_fillmap(TilePlayer.mapoffset.X,TilePlayer.mapoffset.Y); } diff --git a/!TheEsc/c/Sound b/!TheEsc/c/Sound index 9def5ea..ae79070 100644 --- a/!TheEsc/c/Sound +++ b/!TheEsc/c/Sound @@ -13,6 +13,8 @@ int composition_startcent = -1; struct CompositionElement composition[COMPOSITION_MAX]; +unsigned char audiobuffer[20000]; + char *notes[] = {"AX","A#","BX","CX","C#","DX","D#","EX","FX","F#","GX","G#"}; void sound_on() @@ -195,3 +197,36 @@ int sound_composition_incomplete() else return 1; } + +void sound_pcm_loadsample(char* filename) +{ + int length; + + memset(audiobuffer,0x00,20000); + + // Attempt to get file info + inreg.r[0] = 5; + inreg.r[1] = (int) filename; + _kernel_swi(OS_File,&inreg,&outreg); + + // Length will be in R4 if it exists + length = outreg.r[4]; + + if(length > sizeof(audiobuffer)) + { + screen_nobuffer(); + while (1) + printf("Sample exceeds %d bytes (%d bytes) object type is %d\n",sizeof(audiobuffer),length,outreg.r[0]); + } + + // Attempt to get file info + inreg.r[0] = 16; + inreg.r[1] = (int) filename; + inreg.r[2] = (int) audiobuffer; + inreg.r[3] = 0; + + _kernel_swi(OS_File,&inreg,&outreg); + + // Fill remainder of array with final byte + memset(audiobuffer + length,audiobuffer[length-1],sizeof(audiobuffer)-length); +} diff --git a/!TheEsc/h/Sound b/!TheEsc/h/Sound index 12a4d51..e628a44 100644 --- a/!TheEsc/h/Sound +++ b/!TheEsc/h/Sound @@ -1,5 +1,42 @@ #define COMPOSITION_MAX 128 +#define DataVox_Type 0x44380 +#define DataVox_Timed 0x44381 +#define DataVox_Pitch 0x44382 +#define DataVox_ReadPitch 0x44383 +#define DataVox_ReadTimer 0x44384 +#define DataVox_ReadType 0x44385 +#define DataVox_SetMemory 0x44386 +#define DataVox_ReadMemory 0x44387 +#define DataVox_ReadAddress 0x44388 +#define DataVox_SetRepeat 0x44389 +#define DataVox_ReadRepeat 0x4438A +#define DataVox_SetReverse 0x4438B +#define DataVox_ReadReverse 0x4438C +#define DataVox_PitchToSample 0x4438D +#define DataVox_SampleToPitch 0x4438E +#define DataVox_Duplicate 0x4438F +#define DataVox_Unset 0x44390 +#define DataVox_ConvertByte 0x44391 +#define DataVox_ReadBufferFlag 0x44392 +#define DataVox_AllocateChannel 0x44393 +#define DataVox_DeAllocateChannel 0x44394 +#define DataVox_RequestChannel 0x44395 +#define DataVox_ChannelsFree 0x44396 +#define DataVox_ConvertArea 0x44397 +#define DataVox_ChannelFreeMap 0x44398 +#define DataVox_UpCallHandler 0x44399 +#define DataVox_FlushKeys 0x4439A +#define DataVox_VoiceActive 0x4439B +#define DataVox_SystemSpeed 0x4439C +#define DataVox_Version 0x4439D +#define DataVox_SlaveChannel 0x4439E +#define DataVox_ReadMaster 0x4439F +#define DataVox_ReadUpCallStatus 0x443A0 +#define DataVox_SetUpCallStatus 0x443A1 +#define DataVox_AdjustMemory 0x443A2 +#define DataVox_SetInternalPitch 0x443A3 + struct CompositionElement { signed short int Start; unsigned char Note; @@ -8,3 +45,5 @@ struct CompositionElement { /*unsigned char word alignment*/ unsigned short int Length; }; + +extern unsigned char audiobuffer[20000]; diff --git a/!TheEsc/sounds/torpedo b/!TheEsc/sounds/torpedo new file mode 100644 index 0000000..e7d0650 --- /dev/null +++ b/!TheEsc/sounds/torpedo @@ -0,0 +1 @@ +€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}€€~€€€€€€€€€€~€~€€€€~‚€~€€~€~€€€€€€€€€~€€~€€~€€~€~€~~€€€€€€ƒ€‚€€~~€€~~€€€€€€€}}~}|€~~€ƒ‚‚ƒƒ‚€€€}}~~~~~~€€€~‚‚€€€€€€€€‚€€€€~€€€~~~~~~}~€€€€€€€€€€~~~}~~}~€~~€€€€€‚‚€‚‚€€}}|~~~~}|~~~€€ƒ‚ƒ„ƒƒ‚„ƒƒ~€€‚{|~}€~~€€€‚‚‚€€ƒƒ‚€}}}{|}|z}}yz}~||~~yx}€|~|yz~~~|{}‚|y‚†€}€€„…„€‡ˆ„„ƒ†‰‡„€„‰Š†‚‚ƒŠŠ†ƒ€„‡‹†‡ƒ‚ˆŒ‰ƒ}ƒ†‡‡€|x}„‚‚{y~ƒ†}{|†…~yzvz€„~xsrtwssprz€ƒ~xrps|…€zvru|„ˆ†€zwwxˆ‡€{ust}„……zxtpv„‡‡{xtty‡†‡€zvsy‡‹Œ‡|x{}„ŠŒŒ…‚{vz~„Їwwwy‚‰Šxrow~‡Žˆzxxz€…‹ƒuvy~ˆ‹‘“„|{xuyƒŠ‰ˆysrpwz„‰‹ƒzyrs{ˆ‹“‘Œ„}xrqw~‹šˆxoqqyv|‰Œ–Ž„plls|‰‹ˆ…ƒ}xdez€•‹€’Œ€z~vckyk|ƒ“”¤‘xldktmri—‡””yˆxt^Ygjdy|ušŒ•—‚wmyhs^`Ue~‡Š”ˆ„|‹nnrscae„x¢¦™’¤§™– zz\u{Ž‚~ŒˆŠš¢Ÿš‰“‰‡ph{vŠ‘‰† ¥“𝠮™~lrtfmbm{Ž’Žspƒn\NCYa:CI3K]fqxbq‰qtœ^{lmbYQz’‘mo}yŸ¦ž§˜˜œg‚ƒ‹s‘c[]‰˜Š—ˆ„ž£·É³™ž™¡‹x [or’}}s®–€¨·´|Ÿ§ª{•žŽeayj…cb]g|‚{nŽ€q§›}ޝ‚o›’ujOMŒjEWS[MGb‚tD^uvv„£ƒ]]y]fa\d[N]bcuh¢›€“¸ÐÁÜÈŠs¨†sw‡pdY^x`]WzgYDV‚›{m·Á£²­³•s¬yŠprY„Ÿ¤s`ˆn~Ÿ­«¦¦Ÿ·¾ÇİŒ’¢­­Ç«’ŠI>}¦pv‰”Z*Stƒ[ˆƒu£¦lZ²œ_n¨ˆiRMŠvYAyTcK[M[Ca‡s[aifp}vmjgs†“µ¦—{‰›q^Z‘§œ\i……}],PZˆx^_Ltna„œ²¤•‰j–·ÖÍ´œ‚¬´²†^bs”žzjMMU]ClIMŠ~qtS|¡‘¬¡‰pƒŒo°Àšllœ°­  m_{„‹›¡{ˆoCrvWmjkXEMSWq‡du•r\[{v„—§Ÿyz…Ž¡¿«Šeoxu–Œ—›srda[PEM––‡gUb[KFP‡²­m—¹zŒ—¼©¡±È¨›q]}‰}œ{€ugzH6RF^rcw~Ÿ¡œžuUf‡}²Ä¾Â¶ª­Å©’dWgcm‹Žn„ƒl‚–pV@K8[}»Ï®†sƒ}‰}ViPdlf›³Æ¸©»¨›pQ]y‰„‚¤£…„±¼«ŸŽ•ŸˆcPKXTRb­Â³£†ul`€ƒh:;QR`^V`KKkƒ™›¥®®º¶’|auUWphvl€…›¶«‰wacacujU5/79d†cx{nІu”±¢™‡ol‰Ÿž~n[QVIniu…‰®¢  †š®»Âª¡œvwuމ‚pjUTMXTUXl‡œ¶Á± —¡|nއ~orWKT]HVWXv²´Ä½µ´¬¥Ÿ—“lkrfcŠ˜šˆ‹™œ¨¶®§¨³¼¶¬œ¢£›uv|tT3/;Yp^O\\mpqz}ˆvaonha|„…ƒk\RKL@9;FN_\u„ƒ†tƒ‘«°ÁÕ³¯› ‰‚އЅœqt€mqyd__lNemƒ“˜®›°®³¨²ª¢“’‡ƒŠˆ˜‘ˆ‹ˆŠ…q‰„Љ‡|a`OEG\fpyjrn€y’¢«›”¢ž§¹µ² Ÿˆyt}{|okdlbjfheZffj{Œ~px‚™Ÿ ¤¤›œ’—œŠvZe^glnrY\Zfcƒˆ~|xvoqslkmababUSUDLRFVUVMHNNUYhsvw‚— Ÿ¥©Ÿ›©®µÃ¹ºÀ»´¤¤š›ž Ÿ—xrs‹…‰|ƒv^]ixu„zncaZU^bw…—•Œ†‡–¢µ·ºÁ¾±ƒz‡‡Ž‡ŽŽ‚{vƒyˆ“œ¡ŽŠtjecl}Ž’…qtqhgbkwzy‡‹‹‚psfY^qƒ{nfgTTM[fXQNEHMLJTRRW_js„Œžšš‹‰‰”ªµÇ¿Äùµ³·´ª³±¡‰‘ˆ†–¤£†wnqy{|“Šrt^XY^axvspc`[RNADZ^pmig^`gUVVaspupvpnƒ†‘¥©©› •¢¢§ÁÈÂÄ´®¦¥šˆ–©¼·°¢¦•Œ“‡q\Z{€Ž˜˜†€’tvgMBHMdz‰“—’Ž‹sguxjs€|Žzzy’’€…vha\h}v†zrvkffaXWojn„Š„€nSGBTYlrƒ—•Ž’„‚pfmce`gttq‹”˜–š{qknvsny€…‡Žˆ˜›™žœœ”‹tynkz{~€‚Ž–Ÿ—‹•…ˆ…uqzo~„‰…‚ Ž‚š‘’œ–ª–Š’’‘–‘‘…‘‰y|‘Œ{†Œƒzq„‘w}‹‰ˆ|{}styvmhW`aaoj‡Š…”š}w[ckYUe`^limlxfuƒs|Œ‹yvmgelxb]gtremq‡Œ‰‡x}„tzss’ŽŽŠx‡‰…ot‹†‹Œ† ˜œœ¢«œ›ˆŠ€}xor|~vyw¬˜”«š”|{}{xyss}sYjy„™£ œƒ„Œ‰„ˆ„sjwblzxІ‘•–˜’‰~gnowlolc^ajurz •“ ¥¡¨™|||qisg]^_XYkfu{rxt”Ž“œ‘…‹rŒˆ|qwhS]\bY[hllyއŠy~vt„v~m|swrpwktrj{|–™¨§ª²œ–§†q€ufngcbr_lwir~‘™›¯´¯Ã°³¬™¢˜™—˜Žˆ†‰sms]g\xxntjsq˜’Ÿ™ž¯—Ÿ“Ÿ«Ÿ ¥™Žng\\g^fOmwojN]_\xxu˜Šƒ€‰z€”•y•{l[f[L]ngu}n}f}gl‹‚›ž§’Š{ymeyoˆ}dlbkSRSc€ln€}˜˜”’œ¯‘”‹„˜‹£}œ¨˜‹‰pihksŠ…v~iŽmclp~yžŸˆ—ŠŒ‘† †…‹Œ‚‹š’𝔒}ƒ”{tioln}pˆy{z|Šn|„‹—„™Ÿ™£Œˆ‡£•zƒŽ˜•ƒ~sqiVaFcSFTN_lzuhkwkˆ†ss–‹‘‘„­§ª­k“ž†ŒtŒŠ_oqdieod[kXqpw…“wnh`Ouxs˜„u¢Š˜”¡‹hk‡~‰zz°›£€›­z£ž}{–‡Œ‡†wlSRfZ{vyŒyvqu‹`\gmžyz¡’›™—‰”Žty€|“›–t€Ž‰§¶xŽj‘nƒ‹‹‰u\ove}u‚‹•–—¥Ÿš}i{gf›‡¢x`•…’œ†€tudIne\^[X…qožq€hKo€”‘>G\_‚ž˜¦•fƒ‚€“YhŒk}£¯‹°¢VbL9dˆy‚rZq—–•—vuX0x‰MfRSkk”¨œŒ”w¢ša‘³•…£ny‹¡£±¦¢¨{Šzr´—°š}€{PmLK…°›»žoˆ]ˆ´~[~`MŽs‰bi¢£ŽŽtl”†g–ƒq¼ˆˆ¹dG{caž‰™¼mŠw†X:\i^«³ˆ›u[›yh”irQQ[4BXQc³‰q©{Žo‚ŠVn‡x‡³“™´Œ†x|‰ƒz‚šž©¢|•…d`ibK{¡ŽoRc¡€pGXf…žbTndhn˜†gŸ†q³œˆ®”•”ts…–¤¦ªËihn‡¸¢ªŸŠ¤±|zvM‚v¡—]>£‡‚w]>¤omcq~‘ofgx…`uœ`nН¢’‘¥ŸKfŽe‘Š{’†ƒ¥–™ZukR^›˜ˆbkœeVrZ~‹tMZtbyV¦}‡|Wa{œˆz\TŠ~yb}‡qPjpN¥^‰°œÀ£|‰vhfglvŸŒš’—¨¶Ÿ}Ÿxr}|xh«~›µ˜~jØcPs}tx‹‚bqŸŸnzƒs—s—‡\Q‚¤Š~Ä ‘œ‚~l]Tkzzg˜’ž‹‡z§Ÿi_wšŠiM¥”cs£ƒ|‚]lˆ~™‚\{BNqŸšddL^𥙥b_xo‰}sƒo—z‹mz§«‡i¥…’}€h”›¥–[y}’•¬‘‹q`yx…ˆ‰…aŒ—ˆj†s{Š•¨›jtgnr€m~r‹’–d{k•ˆjwulnˆwkg]r~‘nƒ¢}Œu\nur}—¨•xon‚~Š”vck€kƒ‡šwk|‚ox~‹–€…ƒhˆzpl‘eŸ|z“‡s^kn„ƒ•‘‚‰˜‚€¡ƒssˆ†mx“’w‰‹€w‡’‚‚Ž~m‰‚py›Ž{~ˆ„€Š‘‹‡zzcgix`‰{|oƒtdf~v{|Šw€‚~††‘|€ymv„‹‚vyoouŠx~f€……{r‚ˆ\t•v…p‘“y”sr{yjy‚€x–“…ƒ•…}Œ‡k…„–ƒ|u„ƒ‡”ˆ‰}~|zŠ„xˆ‚‡yvƒ{tuxŠ„lfsuu~‚q…z…Œtsˆ|l…v„ƒ‹Ÿ‘‰{}~~pŒi\wkncvƒ…†”™œ‰‹“‡x‡•Šu|“މ’†…‰‰u‡”wy‹†}whrj[o„{nyŽ€~‚ur…nd}|l}‰wp{setuwvƒxlu‘qj„vy}›ƒ‚†s‰—x|~~Šl€”…†ˆ‰–—……{Œ~tˆ†rrŒzˆ|s‹‰‚{…‰„…ކ“uj|•mb|t†ƒ†–„vi\gzpgzt|‚Ž‘”~‹twy}}ˆty‹Œ‰„…‹‰†ˆ‡†€„‘†‡~€Šyu‘‚uy~z{†€‰x~†vrm{ˆpuuyˆp}€{i}|yztm~|v€r€w…€lvv‡wnrtqrfyƒƒ‚z‚„†ˆ€r…†}‚‡‚‘ˆ…ˆw€{~…~ox„ww……’‰…‰…‡‰ŽŠ|„„„Šƒ}|„t€ˆ‰ˆƒ}u„xt{~tt{ƒ‚||ƒ~€‰„|…~}wtty„‚ypxs}{wdk|{vu{z||„rvz~…y{€‹Š„‡Š‘€uˆŒ’‘{y~‚ˆˆ†trxz|wyŒ‡{yƒ‰ƒ‚ƒ€‚„z|uƒ€rw~‚€spx|Œ~lxv}ƒxyxˆ……„{w€Ž}ˆvw†…’Ž„~zz†ˆ‡„rx}„‡}jo‚€…‰vz€}~€‚‡t|…|y‡ƒ~„}z„ƒ…‚z‚…‰ˆx„Šxr{}|ƒ€…wq{u†Š}w}„…†„}ƒ|t|tw„…~y|{xv‚yvyv‰€…†{yv~~‚ƒ„}€ƒz„}†…~„~yƒ‚u†Œ‰‹ƒ…†~‡‚zƒ‹{vw„€…„‰ƒ‚Š…‰zzztyŠ{‚‚‚z|€‚y{„|~zƒ‚ƒ~}||u‚ywyt‚|‡y|{zs€†|||…Ž~yqr€…†{yr|ƒ„ƒ„s~Їƒƒ|{†}‡„‚ƒ~{wwƒ‰†‚~w†ŽŒŽ‰†}zt„†‡‰y†~z{ƒ|ly€€x~~{v~„‚ˆ~{‚vƒ†…{s„pxˆ‡~€z}„„‚Œ~ˆƒ€€€‚|ƒ„z~v‚‡€„Œ|y~ˆ‚‚‹Œ€y‚y~‰ˆ}€ƒur}‹†~~wvwnt‰w‚Ž‚|††{€yƒ{|‚ƒ~Š|t|†„x„y{{{€‡‡~‡v|‚}‡‚|ywz|{||z}ƒ‚}†…€‚~}~‚‚†ƒƒŠŠ|~†‹Œ{x}„€‹„|ƒx‚†„‡ƒ€|„z}{{|{w~‚||~…{|~|yƒ|z€}ƒ}‚ƒƒ}~~z~zzƒƒ~„}~x†ˆ‚‚ƒy~}~|€€}†‚‚ƒ€{z}}z‚€{|‚~{ƒ‚{‚…„xy…€{{~‚„ˆ‚†…‰|{€y€~ƒˆ‚‚‰ƒ„‰†|~ƒ‚€|‚~~…‚‚z}€vu}z}„x€~s{€ƒƒ}ƒ~|z‚{…‰„w}}zvw~„{…~„„v}{}u€„€ƒz~ˆ…}ƒƒy}‡‚€~|€‚‡†yx€‚€€‡‚x}…†z€u||{~}~€ƒ…{‚‚}€z†€†‰y}~…€~ƒ…~‚v{‚yy‚€‚‡‚‚z~€~‚{yƒ|ƒ†}ƒ‰‚z{‹‚z{‚€~‚‚„€}~~~…|{z‚…€~z€†~{‡ˆ‚‚‡……~|€|‡~}†„„|}|ƒ~{~wyw†|t}€€~…}x~|~~€„~€{w„…y…|€~y‚ƒ|||‰‰||~‚€}‚z€†ƒ{~}‚~‚€~‚‚€‚‚{{}ƒ‚‡†‚~}„}{v~ˆ~}‚€ƒ‚{}‚~„„€‚‚€…„x|…ƒ~„ƒx~}}‚…‚}…ƒƒ{~†‚€}‚yv€€}€w|}w||y}}z{€~z|…|}‚‚ƒ‰‚}xˆŠ{}~…~{„…ƒ€„‚~~ƒ{~}€‡‚z‚……{ƒ†ƒw€ƒy~~{{ƒ}zzƒ|…„}wƒ~{€€y~~‚~†~€ƒ€~}|}|‚z~}‰…„|€}}ƒxz€z…„…~y~„ƒ~y|‚‚€~~}}‚‰„€}……€„z{†ƒ|„}|ƒ~ƒ~…}|~}‚y~~y||}~}||y€|}‚~€€|ƒ€|‚ˆ‚‡Š…ƒ‡…‡€€€{€}{{‚„‚€€{{€{{€{€…†€ƒˆ|}~~€~~€}~ƒ„|~€|€~€‚~~…‚{y‚~ƒ‚†{z…‰z‚‰‚x||€€|‚‚}~€}~~~~{~†€}z}}|€~~„ƒ€}~~ƒ‚„}{|~…ƒƒ‡‚|€„ƒ‚~‚ƒ‚€~{~{~}~‚€{}€~ƒƒ~w{|€|€~|€…€€~|ˆƒ„~y}ƒ€ƒ~ƒ‡ƒ}„€||€„‡„ƒ€€~€€}€}}~||~~}{|€yy}{€€‡„‚ƒ…ƒ€~}|€|€‚{€‚‚€{‚„€ƒƒ~{y‚}}€}|~‚‚€}„ƒ~‚‚‚„|„„~}|„„‚|~ƒ€}|}yz}}‚€~|€~}‚€}{ƒ€~{}|€ƒ€|€ƒ€‚‚†}€}|}€~~~‚ƒˆƒ€y|}~€}~}~}|€€ƒ€~€~ƒz{~……~‚ƒ~~‚€|~ƒ€~~‚€}~€~~…„€~~ƒƒ€€‚~~}y{…†‚‡ƒ}~{€}€€€€€‚‚~}€}€„„€zy|}‚{|€~z~{}‚„€€„}}€€~€}|‚ƒ~€…„€€~~€~|}€‚‚€‚„‚€€€€~||}}‚~~~„„‚€‚€€€ƒ~~~‚~€~|~|€ƒ‚~~€‚€ƒ€‚‚€‚|||}€‚‚|ƒƒ~}~}€‚~}~€€~|~€€‚€€€€€€€€€€€€€€‚~}‚€‚‚€~~~~~}|~~€€€€‚ƒ~}€€}|~€€€€}€~~€~~€€€ƒ‚€‚€€}|}}‚€€€~€~~‚~‚€~€~}~€~~~€€€€~€€€~~€~€~€~€€€€€~€€€€€€€€€€€€€€~€€€€~}€~~€€€€€~€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€~€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ \ No newline at end of file