From 62631abf83de16e06a283ca34fbec1c8d13f8ca7 Mon Sep 17 00:00:00 2001 From: ListenerJubatus Date: Tue, 19 Sep 2017 20:42:08 -0600 Subject: [PATCH] Song meter, map controllers, etc. --- .../ScreenGameplay overlay/default.lua | 32 +++++++++ .../ScreenMapControllers background.lua | 16 +++++ .../ScreenSelectProfile overlay.lua | 15 ++-- .../ScreenTitleMenu background/default.lua | 1 + .../default.lua | 1 - .../Graphics/ScreenGameplay StageDisplay.lua | 10 +-- .../Graphics/ScreenGameplay progress.png | Bin 0 -> 5354 bytes .../Graphics/SongMeterDisplay stream.png | Bin 0 -> 1958 bytes .../default/Graphics/SongMeterDisplay tip.png | Bin 0 -> 588 bytes Themes/default/Languages/en.ini | 3 + Themes/default/metrics.ini | 65 ++++++++++++++++-- 11 files changed, 123 insertions(+), 20 deletions(-) create mode 100644 Themes/default/BGAnimations/ScreenMapControllers background.lua create mode 100644 Themes/default/Graphics/ScreenGameplay progress.png create mode 100644 Themes/default/Graphics/SongMeterDisplay stream.png create mode 100644 Themes/default/Graphics/SongMeterDisplay tip.png diff --git a/Themes/default/BGAnimations/ScreenGameplay overlay/default.lua b/Themes/default/BGAnimations/ScreenGameplay overlay/default.lua index 4842835426..6af2ca06e1 100644 --- a/Themes/default/BGAnimations/ScreenGameplay overlay/default.lua +++ b/Themes/default/BGAnimations/ScreenGameplay overlay/default.lua @@ -11,6 +11,8 @@ local function UpdateTime(self) end; end; end +local function songMeterScale(val) return scale(val,0,1,-380/2,380/2) end + if GAMESTATE:GetCurrentCourse() then if GAMESTATE:GetCurrentCourse():GetCourseType() == "CourseType_Survival" then -- RemainingTime @@ -195,4 +197,34 @@ t.InitCommand=cmd(SetUpdateFunction,UpdateTime); end; t[#t+1] = StandardDecorationFromFileOptional("StageDisplay","StageDisplay"); + t[#t+1] = Def.ActorFrame { + InitCommand=cmd(x,SCREEN_CENTER_X+103;y,SCREEN_BOTTOM-25;); + OnCommand=cmd(draworder,DrawOrder.Screen;addy,100;sleep,0.5;decelerate,0.7;addy,-100;); + OffCommand=cmd(sleep,1;decelerate,0.9;addy,100;); + Def.Quad { + InitCommand=cmd(zoomto,264,12); + OnCommand=cmd(diffuse,Color.Black;diffusealpha,0.3;fadeleft,0.05;faderight,0.05); + }; + Def.Quad { + InitCommand=cmd(zoomto,2,8); + OnCommand=cmd(x,songMeterScale(0.25);diffuse,PlayerColor(pn);diffusealpha,0.5); + }; + Def.Quad { + InitCommand=cmd(zoomto,2,8); + OnCommand=cmd(x,songMeterScale(0.5);diffuse,PlayerColor(pn);diffusealpha,0.5); + }; + Def.Quad { + InitCommand=cmd(zoomto,2,8); + OnCommand=cmd(x,songMeterScale(0.75);diffuse,PlayerColor(pn);diffusealpha,0.5); + }; + Def.SongMeterDisplay { + StreamWidth=260; + Stream=LoadActor( THEME:GetPathG( 'SongMeterDisplay', 'stream') )..{ + InitCommand=cmd(diffuse,Color.White;diffusealpha,0.4;blend,Blend.Add;); + }; + Tip=LoadActor( THEME:GetPathG( 'SongMeterDisplay', 'tip')) .. { + InitCommand=cmd(visible,false); + }; + }; + }; return t diff --git a/Themes/default/BGAnimations/ScreenMapControllers background.lua b/Themes/default/BGAnimations/ScreenMapControllers background.lua new file mode 100644 index 0000000000..3b20fc2c68 --- /dev/null +++ b/Themes/default/BGAnimations/ScreenMapControllers background.lua @@ -0,0 +1,16 @@ +local t = Def.ActorFrame {}; + +t[#t+1] = LoadActor(THEME:GetPathG("common bg", "base")) .. { + InitCommand=cmd(Center;zoomto,SCREEN_WIDTH,SCREEN_HEIGHT) + }; + +-- Overlay +t[#t+1] = Def.ActorFrame { + InitCommand=cmd(Center); + Def.Quad { + InitCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT); + OnCommand=cmd(diffuse,Color.Black;diffusealpha,0.8); + }; +}; +-- +return t diff --git a/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua b/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua index fbef1f9543..60e616a646 100644 --- a/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua +++ b/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua @@ -12,11 +12,11 @@ function GetLocalProfiles() InitCommand=cmd(zoomto,200,1;y,40/2); OnCommand=cmd(diffuse,Color('Outline');); }; --]] - LoadFont("Common Normal") .. { + LoadFont("Common Condensed") .. { Text=profile:GetDisplayName(); InitCommand=cmd(shadowlength,1;y,-10;zoom,1;ztest,true); }; - LoadFont("Common Normal") .. { + LoadFont("Common Fallback") .. { InitCommand=cmd(shadowlength,1;y,8;zoom,0.5;vertspacing,-8;ztest,true); BeginCommand=function(self) local numSongsPlayed = profile:GetNumTotalSongsPlayed(); @@ -33,7 +33,7 @@ end; function LoadCard(cColor) local t = Def.ActorFrame { Def.Quad { - InitCommand=cmd(zoomto,300,SCREEN_HEIGHT/1.3;diffuse,ColorDarkTone(cColor);diffusealpha,0.6;fadetop,0.3;fadebottom,0.3) + InitCommand=cmd(zoomto,300,SCREEN_HEIGHT/1.3;y,20;diffuse,ColorDarkTone(cColor);diffusealpha,0.8;fadetop,0.2;fadebottom,0.2) } } return t @@ -57,9 +57,9 @@ function LoadPlayerStuff(Player) InitCommand=cmd(zoomto,200,230); OnCommand=cmd(diffuse,Color('Orange');diffusealpha,0.5); }; --]] - LoadFont("Common Normal") .. { + LoadFont("Common Italic Condensed") .. { Text="Press &START; to join."; - InitCommand=cmd(shadowlength,1); + InitCommand=cmd(shadowlength,1;zoom,1.25); OnCommand=cmd(diffuseshift;effectcolor1,Color('White');effectcolor2,color("0.5,0.5,0.5")); }; }; @@ -97,10 +97,9 @@ function LoadPlayerStuff(Player) t[#t+1] = Def.ActorFrame { Name = "EffectFrame"; }; - t[#t+1] = LoadFont("Common Normal") .. { + t[#t+1] = LoadFont("Common Condensed") .. { Name = 'SelectedProfileText'; - --InitCommand=cmd(y,160;shadowlength,1;diffuse,PlayerColor(Player)); - InitCommand=cmd(y,160;shadowlength,1;); + InitCommand=cmd(y,160;shadowlength,1;diffuse,ColorLightTone(PlayerColor(Player));diffusebottomedge,color("#FFFFFF");zoom,1.25); }; return t; diff --git a/Themes/default/BGAnimations/ScreenTitleMenu background/default.lua b/Themes/default/BGAnimations/ScreenTitleMenu background/default.lua index 4cfd7ca273..c70c87fa78 100644 --- a/Themes/default/BGAnimations/ScreenTitleMenu background/default.lua +++ b/Themes/default/BGAnimations/ScreenTitleMenu background/default.lua @@ -1,3 +1,4 @@ +-- You know what, I guess the "fancy UI background" theme option can be put to use. if ThemePrefs.Get("FancyUIBG") then return Def.ActorFrame { LoadActor(THEME:GetPathG("common bg", "base")) .. { diff --git a/Themes/default/BGAnimations/ScreenWithMenuElements background/default.lua b/Themes/default/BGAnimations/ScreenWithMenuElements background/default.lua index 7215dfc249..a8a5c8345b 100644 --- a/Themes/default/BGAnimations/ScreenWithMenuElements background/default.lua +++ b/Themes/default/BGAnimations/ScreenWithMenuElements background/default.lua @@ -1,4 +1,3 @@ --- You know what, I guess the "fancy UI background" theme option can be put to use. if ThemePrefs.Get("FancyUIBG") then return Def.ActorFrame { diff --git a/Themes/default/Graphics/ScreenGameplay StageDisplay.lua b/Themes/default/Graphics/ScreenGameplay StageDisplay.lua index 0232211010..9f7ca71911 100644 --- a/Themes/default/Graphics/ScreenGameplay StageDisplay.lua +++ b/Themes/default/Graphics/ScreenGameplay StageDisplay.lua @@ -3,7 +3,7 @@ local curStageIndex = GAMESTATE:GetCurrentStageIndex() + 1; local playMode = GAMESTATE:GetPlayMode(); local t = Def.ActorFrame { - LoadActor("_stageFrame.png") .. { + LoadActor( THEME:GetPathG("ScreenGameplay", "progress")) .. { OnCommand=cmd(playcommand,"Set"); CurrentSongChangedMessageCommand=cmd(playcommand,"Set"); CurrentCourseChangedMessageCommand=cmd(playcommand,"Set"); @@ -17,7 +17,7 @@ local t = Def.ActorFrame { end }; LoadFont("Common Italic Condensed") .. { - InitCommand=cmd(y,-1;uppercase,true;playcommand,"Set"); + InitCommand=cmd(y,-1;x,-143;uppercase,true;horizalign,center;maxwidth,170;playcommand,"Set"); CurrentSongChangedMessageCommand=cmd(playcommand,"Set"); CurrentCourseChangedMessageCommand=cmd(playcommand,"Set"); CurrentStepsP1ChangedMessageCommand=cmd(playcommand,"Set"); @@ -47,9 +47,9 @@ local t = Def.ActorFrame { end end; self:zoom(1); - self:diffuse(StageToColor(curStage)):diffusetopedge(ColorLightTone(StageToColor(curStage))); + self:diffuse(StageToColor(curStage)); + self:diffusetopedge(ColorLightTone(StageToColor(curStage))); end; }; }; -return t - +return t \ No newline at end of file diff --git a/Themes/default/Graphics/ScreenGameplay progress.png b/Themes/default/Graphics/ScreenGameplay progress.png new file mode 100644 index 0000000000000000000000000000000000000000..a47060fa3d989b8d4a60c32f0f573426d55345bf GIT binary patch literal 5354 zcmaJ_XH-*7w>~sc5KyX81d*bYAPS)erH2v_kS@I#NC+f!LVFRB-UP%@1w=q8VgjLe zUMV67h9bR*g7nbg#(VGjetxsoIcw&eIeT__X76WCj1f$miGiB|001Vaj)pM+P*b|V z?TZ&E_ZQdHUH||U58Twk$HG8g(FuhFIXI&nT|fayufNj(Wz_&L2PY2~9|1=fH@K&Y z;6_7>pa9%iMbKQ<;I4s}y313zP7vC~BnW2e6y)Kg;4G*LVNecGqzFK|_&5jzAQ7Gz z#Q+t-|COsq>HmE!B`EN}Q+zyB1T74V1k_Pz7Xew2Ea{r_wbLkB}6C%XbI$RM7=a*xPzo(|!bh-D3As3|HMKkLp*XB${ zJhlAa_bHlgS+vl50h&+Je@Vx94>{d4cK&d7zFvNHV`r(HbXc%GE;FOlN@P;CetYQa z{93hVHsGH=AL+2AD;FRdGh*(!G+xNo!^e-}{qMC0om(M^f0EQoVKSIAByO|Pqn$Y+9>cY=F+t#VZP{n^H&-SM$g#Yw{B~=wD*hk zl_~9+P95_vuI`x2e@go~A~VHAqp08yi0(VPRgxgbKK^ybxFQ9&4SX}6{M%ZI1)%=# z&GrJj@>l=|Kn|*6yR!MQkRP~^;vYuU8bnW|rKMd{?gTcE<0`XKpa8D|x+rLS@$*wk zQ(Y}G3YSlmYk8aJy*ge#@u1;*(S)s70?2odD#f#oCrnUMVr{?LOt>VPX$E~G>@Hn!3InK0GY zIXQe^bg3g<=P%H%eIgoFk_uW{`2YMMnnimSykiTOl4V_1MzJKPDtVOvZ7!5k=%@8 zE1xm%`O_KUQ5)(P;q&;tLQmcP{U27z6~b!@{)IxHh5azj-Rg%oczGqlb_V3)ym>pC zg7@#m0DBkt6@A_XE%#^r9IJM6UYZ$TB240f&7M}KZ||;_ht$qRR#v|Hy{GuTva(~T zFSF@z#Ae_1p;?6HUPnd3&NIE{cT7JrS>Se(TzNl=$Ozsi-4k3SSSP}RX4c=6PmlL=G{bd)_@pHBnc$74r>?Huzwu#}%m`bslEd*iM^o;%o+N&C-X5>5c}<|T zW#-lML3e%Q0u#9_7P9J(by9KE&|o;00I`sjEd5!OUXUS|?v&&CJ5lq6_`a!j9n>Z4O(|9A`O?x7 zIe|y6Ic)c5iY{$cuC|s|8O5ndBBG+fI23MN zO1mpu25yt zCxn&t>P*7HI3uz2*|qVSs_N>Lh!F5@d!r;f15RPHO%r`^OuiZ(Sx-#9D9BTESTX_i zh!*>dUjB#Lz_>XZ(M4c#HYk*ps#;fm9oo#6I;=@b56;! z{~ibR?6r>Wt}Z@@9e$KVtjj~i?c?=Cx7QsD#}R6Fb~A*IyfW502Ik<34<|zD44fr> z@^CS;9R)v({j!FVA+oWq($o(0yt74*xnKUSwS~3y+ACFei0=1on-6eW^bR5{r&wzlzigcN?w?VW-FM=Yjd{k*Y2*53vv$N1wd3n)$d%lE^Z_AcwQ*~7a9-3UoAq~Rb zs`T^wr_J?#%b*wI6brMk?#&&CAd~v|UD9Gx$^iW1Hv^!qsNSnwEs`)Xf4IGq^Nz=F z)I`ek`?_hg7pDKaC_Fmmnsu(w-5&Ru=8z?v9127USj)*aqZl>eVt89y+pm!kQyDOr zu(V0i=brib+~TV~z<-9tY$jw5BuR}OKmxaE{WhkVc6N3a_fLqr&&!kF^=bvBC5L8o z-l8KAG0jB~;=t9Khu+ZHa`ZBI`;!!M$^FP{$!)>Drtfg>8L-?FRYT5SJaSvoIIL31 zd=a>cEttRzlGi8An?p~J)OdR~e^<6xX|}!vRfXqDUGjf2@p77fywsjyI1UNhKAQZ*q-;#3;PIvt22yW(hH>eS%3+6>)I#4gJ^ zYKqwtA(lP;B?A(I32dc=#;0@*7ief`mOMxml7F3WN}dE?H3EQubv)@zK}qSja%*eL z0f)g&tV|c@W#t)+9f=GY7;Th_Uq|w?dXCJxJ9WQ&GyWax88^Aue#bvHQ_{99?*d^U zmFJc=Npi;b!|E^sm^EB~`SL2K$JoB(9fq zgBi3#9p17uccgPzeC$B5{=iAeD)f+(O?6XRdqEDR#dp_kx5YKpB5%J6=wvqPhX})n z>M%iNgB!*VSJeX?1v|P~`iS58mv5cg2l77YZ*n?80a2 zRFEPf?HfW1Y+VtTZLRgP zIk-o7izYBT!btV{L;HEHnw##--o2m;WrN+_-5JfpHm+3oao6gE4`Hiw@!nqJ;s~U? zH2im-SI2VZr%ImZgWnu6JUczApRv`r=QQGVQcRW~i%NT`8>5)6Wka zbh<|pHx<4Z9)=pgb7$NZg8ROH%;YX+pJ?(u_Wl6Juid#EQ(`c4bMr|%?3QNdsqBLh$718G;FTQzH*(Vf zg{fRnb9=Vy_Q(67@0cDq*?AO_zLv)PG?vyoB;JTOhE(8az7r@FBP>kSrp~KP>~7WB zOC#Odo@G@L0qH-kO8w^beBTGLNnI{+IaY(xD&vhyD6D(lJCzYFxGwbNv)J z%KOD4J0@f`BJDyg6!ZH#r}a^mNDKEPwRMkFmDJb#U^`xa9yw2a#L2r8Xg6p|yIvG` zf;^LTdsQweK@t}iU#Gm)7(T!JLel$rbo2@=TfX`ZwT@FS9kh)A2ybAIdwC!s{=J-g z6-Hxck(O3=Bg>PFU(wJrll(X?spWs&#bu&}NZl*-ei1MEMH54|TetfzO-eu-hExq( zpgf+cTb33&SfAkL2DF8xCETvT&tPwcD$cJuB_)NJCTggamX^kmklJ2Wx2vREjE<&u zWeXMwbUW%06Yu5!&NZ3;iR0pE;#M^{;e+DWBV&akzxm1+SU{)-{&Gfef zV<`la81o4hDjh|FhgfJ0Wv!#2W$ckCeB{avXp14n>4R4-yZ5G2UY)1k~@n5ojv zg>btR{g*(NBcT}D1X~w zkV9g)BcnHSH+-3a|4YlRg53T)K4Bu6V1uX5S|N2v_gp z;KZZMA&&o9eP+rF2H9l4VqzOMh*Y#MjikawCuq_1F5R=K_ks7J=*Jw3X`_68)VZbZ zTLgnjERjxfklxX%vf7A~D&=vkmx6SGG z=*p%85r#whp~BTA3L{u=zlUb3V{bRuxD#0;ityuiDDk|VuIqKU?E)^bJkVQtYw87T zzPYwjY{_z|PMvSTWe2sOha|IlL-}4>*rY1xjW5op?~?jO*Lmj=UONw!=%tUdC7F$L zUn|T9=ar4RuZx>kXzXvy_$!`J@zMgVn5$ltL)O!vp!)Vw>0g+m8CJTNSi-}?eCaP> zB^$&K%ojsN$d{6Y%w_v-w8OESEQs~kG&nK(WeY*ojpu>?Xz83o;>{vp zfi^84ozTe=tS|j<*_EG z2FM`q@J|HDKcy=(lfVs9{hYj%nC5&UoP9R}8e>6nt*f)ax?K<332B#} zYNo_c>PbEOR8z3rw>g$%3ikwf6@8xmnev}WVCI$IWPxkug#NK2E=R!*Qv^^T5RZ(T z-f!z+uE_(cADr*klLtR;7AxCI%%h1m)7uH>l-~ydN4u-t?d|RLe(EINU8s_KM+X?S zcI6GWo);ow!}7$vqgJH@tro+4N9Z5ZUxuvFuFTNwm!2yWV%Sxb6>S{G?gr1jD=jiW z*8{z83!S8>c(z_UbJo*CQScGa*jf%$ks@=#!!!9BsAhrfKT?3jhCpU`cz90qH6WCp jB|7ZEe{HROk>}JW)4B?1BgJBh!2nbfrct40|IhybOb0zR literal 0 HcmV?d00001 diff --git a/Themes/default/Graphics/SongMeterDisplay stream.png b/Themes/default/Graphics/SongMeterDisplay stream.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0a6a9e7511e021bd0f21ec9e65854e3217f6a4 GIT binary patch literal 1958 zcmV;X2U+-uP)jeH zXlY1#a%EF`PE=!hYhyWNB0oL~Ja{^IZE$U6bYUQPZES9HI(R)IVPtP&WjbziI&Eci zVJ{*ecsh7(aCB=uB3MmOAVY6*Wgs;!H7+nBJ_;Z_a%5&YQba}|cx`NMb2@TlW<4Tk zbaZe!FE4j@cP@7`E^l&YFEKeeIWI6WFETPMa%5&Lb9rubVR$WWb0Z=?3Lqdna%5&Y zL}hbha%pgMX>V>Ia%5&YVPbD}bUh*>FFpz&JTG!&W;#+tMm`EWFL*k5ZE$U6bYVUU zJU@7FVPk7$bRcDJWIZBsB0oMFN~`Js00Dw&Lqkw=Qb$4{Nkv08F*!CiEix`K001bF zb&=02L{SvSKQlw)XG16pi%G+3h*84AV#H8b%#8ADGxN+3HE+D$8)>ptwu%xPzZU!j zY?ZZAL`uren%JP{yqT$)WX|o}^SR%9&*|QC!5&U2s!`DcYC59_1Ah1H+`QZQLN!e^ zGDJ&6F|?`BSeUZ*d5_JCw_R4P^5_1w+NGGGfUQb+Skd&1@VM~gT1K;YN4Qx@MwW!n zguS|4Q25T$qj`R{IFaXXi}i4D1ndpM?nDVkOIS(js<6BqkD6Ll3iq*IQWs0lge10$ zw_y+@fFCy#j50z$y$s6SPZvJAWks3%o?QMkE0U|otdT`$nFL8Pctu^6>M@CN(PJ`F zWUc=H?W+;*^X048`JwXJG~YYGxeY&CrulVbnm@XsYJ|_2P5My#9AjbqPUAFut`zp1};*4KPij5o|Y zM$D+!3K{$~9YJQxXWGV$@_5dbO)T3Mm^EI_o~B_tu2}O79s_-DTyH&zKe3^WjPnQR zrEQ3@@t_Ti*;42}b>>H%rKA0&7l!6Z>=f(Lmna)~q+XlOdtvBkYtNw$#M6D-m~;Nr z5nL+OgkeBvjl(aHSr^nKC!N z48*gHQ(gu`%g_=_Vn>^BkEGq(ej^_S*2IgtrQbFio&0UgIe&-ZxiGWol`)%>rho*E zQR@Mrb3)qhd|NmGtPt!W?d@)YFwB zv1^r|bhLS^Dl$oBAeGL#W@SLR8IZC{N_(>!9%Ig##%kcC;CKC*A-}R+(N5!kc3o?C zV{JT*m}TUheD8R*O!!$EIqx%eYYv=_+GOA+xRZx;t}4Jx0F7r$7)__I^wIyt{eRY9 z+2)9>;SIb!b>y?mV|kX9rCBEdXTJ&iPBsXX&4rKIv!1 zZwV?}R!*&In-|ZN@eboFKfW8|xPRouc4wQ$#~3o(d)`%r+x%^eIp-g}O6a`I$#V)L zYl}LZ>p6LG#q;ve@to^%9wS_uJqq2cvWs%EBsDGTw+0>3YIgy~h?i#RxWq6eh z=1m5ElRo=cBC?dV-FWs+npqXH98THt49hk2BkJESONql>wUTA6TU+~lqo?rB;}hvw zzIHT{j&d=0S8i{eKp2lBpriU zo1e1MPF|B2wmH6FURF+S&2I0$TV`uXCGVax__Rz+n=lyCAEfKcTl!4OOgYvVqYu$9 z^J35XSk_Dmw5$2^-Xjw;G0OX?mT1x*oV!U{#+>s9224CR+f_ECk!Z-PNNEsE^X{)Z zuHkorNJSH5zB4dn#3kRI7oe3gwX@T&{S6a}!t3>jzVYl2YL&v};tYMXqvY9`>jT31Q!@QHA9O<+4yR2sX s*XdelNM|2OS<)t6L%;ag`_mW4KWPI65;uB$3IG5A07*qoM6N<$g54;Y)&Kwi literal 0 HcmV?d00001 diff --git a/Themes/default/Graphics/SongMeterDisplay tip.png b/Themes/default/Graphics/SongMeterDisplay tip.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9c83efcbcae7107ba4469d7e936d97f2b1a807 GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf?Es$;*Z;#8qy;ih0(#T4B*-sV zgp-wtnV&+KkNAnIlFtFaAH2sWU zkH9iB-&+ndfBxUUqG;XTJ`-i$UtJ#?3ponUG#FoPPnyCZv&6r zO-2Pxnfr8)KQ5Z>?`W~2<8$Qa65E}*X_Yz}PCxek%KjHDd;itEeu2K_r=LFeopSHI z`qFPQ0+KtXi-!kF&7HfuQRTnG@|6Ajxl``FHH%zca`E{4yTze<_sm-qBC@SEf7