From a5cbf1d7b234d9c4f12b9caf1f6e93f01c467b11 Mon Sep 17 00:00:00 2001 From: MysaaJava Date: Mon, 20 May 2024 14:18:52 +0200 Subject: [PATCH] Added more components --- blocks/component.lua | 2 +- blocks/components_register.lua | 87 ++++++++++++++++++++++++++++++++- circuits.lua | 3 ++ textures/component_nand.png | Bin 0 -> 4414 bytes textures/component_nor.png | Bin 0 -> 4424 bytes textures/component_not.png | Bin 0 -> 4393 bytes textures/component_off.png | Bin 0 -> 4364 bytes textures/component_on.png | Bin 0 -> 4346 bytes textures/component_or.png | Bin 0 -> 4367 bytes textures/component_xor.png | Bin 0 -> 4376 bytes 10 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 textures/component_nand.png create mode 100644 textures/component_nor.png create mode 100644 textures/component_not.png create mode 100644 textures/component_off.png create mode 100644 textures/component_on.png create mode 100644 textures/component_or.png create mode 100644 textures/component_xor.png diff --git a/blocks/component.lua b/blocks/component.lua index c59917f..22378a0 100644 --- a/blocks/component.lua +++ b/blocks/component.lua @@ -29,7 +29,7 @@ function logikraft.registerComponent(name,cmp) ((y==h) and (cables.top and cables.top[x] and "component_port.png" or "component.png") or "component.png"), -- z+ ((y==1) and (cables.bottom and cables.bottom[x] and "component_port.png" or "component.png") or "component.png"), -- z- }, - groups = {circuitry = 1,dig_immediate = 3}, + groups = {circuitry = 1,dig_immediate = 3, not_in_creative_inventory = (x==1 and y==1 and 0) or 1}, paramtype2 = "4dir", inventory_image = (x == 1 and y == 1 and "component_"..name..".png") or nil, drop = "logikraft:component_"..name.."_1_1", diff --git a/blocks/components_register.lua b/blocks/components_register.lua index 14c1305..c29bde7 100644 --- a/blocks/components_register.lua +++ b/blocks/components_register.lua @@ -16,6 +16,81 @@ logikraft.components = { outputs = {"out"}, compute = function(inz) return {out = (inz["in_1"] * inz["in_2"] == 0) and 0 or 1} end }, + ["nand"] = { + width = 2, + height = 3, + ports = { + left = {"in_2",nil,"in_1"}, + right = {nil,"out",nil} + }, + inputs = {"in_1","in_2"}, + outputs = {"out"}, + compute = function(inz) return {out = (inz["in_1"] * inz["in_2"] == 0) and 1 or 0} end + }, + ["or"] = { + width = 2, + height = 3, + ports = { + left = {"in_2",nil,"in_1"}, + right = {nil,"out",nil} + }, + inputs = {"in_1","in_2"}, + outputs = {"out"}, + compute = function(inz) return {out = (inz["in_1"] + inz["in_2"] == 0) and 0 or 1} end + }, + ["nor"] = { + width = 2, + height = 3, + ports = { + left = {"in_2",nil,"in_1"}, + right = {nil,"out",nil} + }, + inputs = {"in_1","in_2"}, + outputs = {"out"}, + compute = function(inz) return {out = (inz["in_1"] + inz["in_2"] == 0) and 1 or 0} end + }, + ["xor"] = { + width = 2, + height = 3, + ports = { + left = {"in_2",nil,"in_1"}, + right = {nil,"out",nil} + }, + inputs = {"in_1","in_2"}, + outputs = {"out"}, + compute = function(inz) return {out = (inz["in_1"] + inz["in_2"] == 1) and 1 or 0} end + }, + ["not"] = { + width = 2, + height = 1, + ports = { + left = {"in"}, + right = {"out"} + }, + inputs = {"in"}, + outputs = {"out"}, + compute = function(inz) return {out = 1 - inz["in"]} end + }, + ["on"] = { + width = 1, + height = 1, + ports = { + right = {"out"} + }, + inputs = {}, + outputs = {"out"}, + compute = function(inz) return {out = 1} end + }, + ["off"] = { + width = 1, + height = 1, + ports = { + right = {"out"} + }, + inputs = {}, + outputs = {"out"}, + compute = function(inz) return {out = 0} end + }, ["switch"] = { width = 2, height = 1, @@ -36,7 +111,17 @@ logikraft.components = { right = {"out_8","out_7","out_6","out_5","out_4","out_3","out_2","out_1"} }, inputs = {"in_1","in_2","in_3"}, - outputs = {"out_8","out_7","out_6","out_5","out_4","out_3","out_2","out_1"} + outputs = {"out_8","out_7","out_6","out_5","out_4","out_3","out_2","out_1"}, + compute = function(inz) return { + out_1 = (inz.in_1 == 0) and (inz.in_2 == 0) and (inz.in_3 == 0) and 1 or 0, + out_2 = (inz.in_1 == 1) and (inz.in_2 == 0) and (inz.in_3 == 0) and 1 or 0, + out_3 = (inz.in_1 == 0) and (inz.in_2 == 1) and (inz.in_3 == 0) and 1 or 0, + out_4 = (inz.in_1 == 1) and (inz.in_2 == 1) and (inz.in_3 == 0) and 1 or 0, + out_5 = (inz.in_1 == 0) and (inz.in_2 == 0) and (inz.in_3 == 1) and 1 or 0, + out_6 = (inz.in_1 == 1) and (inz.in_2 == 0) and (inz.in_3 == 1) and 1 or 0, + out_7 = (inz.in_1 == 0) and (inz.in_2 == 1) and (inz.in_3 == 1) and 1 or 0, + out_8 = (inz.in_1 == 1) and (inz.in_2 == 1) and (inz.in_3 == 1) and 1 or 0, + } end }, ["input"] = { width = 1, diff --git a/circuits.lua b/circuits.lua index 59e365c..4d35103 100644 --- a/circuits.lua +++ b/circuits.lua @@ -257,6 +257,9 @@ local function computeStep(circuit,connvals,computed) if allvalue then local output = logikraft.components[cmp.type].compute(inputs) + print("Component "..cmp.type) + print(dump(inputs)) + print(dump(output)) for name,v in pairs(output) do if cmp.ports[name] and connvals[cmp.ports[name]] diff --git a/textures/component_nand.png b/textures/component_nand.png new file mode 100644 index 0000000000000000000000000000000000000000..00d6c6a584c25973e2661a075fbacce3f1ae5689 GIT binary patch literal 4414 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL-c*G|lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNU$fyv=)9f#*+pS6@QT=MNT7R7;!t?t2?}2Cod#O+3fGvEMr) z{=BZuw+E*jgIC@xQfrwdW!~UryG+^rl5({p^PL|Bat0a)_4b;S)v@x+>@|}YI{x?K zi#b;sE|p%G_4)GL`Fj+vzjs^bkTlvv%6%&U`8NHA<_s_|!&? zO-55E@$N9nY@B~uuVnVkKDU+9RYHs9!X;-_Ox0-7SrohUjrY<-{}U^i_1qfRq9!!* zKjz#oB(&g8O~B&IXZ-W^`sZs-#0$q;@|MVxL|4d->+f@zdfrq zuRhw>a4`45qg|^{Rv&oEXYeP*W7!ig$5}BeS@z7oXfE2YFj`^Lv#-}~9)HO^VevX6 z^8*JJ1@wcz?K;2vcXjpe?>@`-%P(v%+9}ua>@5QWZ$)NEL`j6Nk5zJhu3lnFep0Gl zMQ#BD2-w(H6eK2Rr%!KNrB%__*n4QfPDN}8=wMoCG5mA-y?dAVM>v0i>ry1t>M zrKP@sk-m|UZc$2_ZgFK^Nn(X=Ua>OB2#6Ujsl~}fnFS@8`FRQ;GZT~YOG|8(l(-ZW z6rhGzhK53Ney)B+Vu8M)o`HUDu0FDk;u6=g68t)fLn;eW^@CE2^Gl18 zQ(ena^GcMFjYvs`>n|uR$^m;PC0Rc;Cp9-UucTPtP|py>N_S7+0JsiN5Ts}37JzkC zKKr&$OAUmWYw*YP~ifWkO!HU6QWaW~dTnciYr;Du;$bPGo{N&6O zD=^bM(cCQAGQ~{S)I2d!*Tm8=O*b()%}m!g(IhR^Fe$}6#V8fYD9^m&lEl2^RFF{> zxdnQenJHFgsj0>m$p)snh6a{~x+Z3+M!FW}N#?p1W|qk*NtOnQW|oOaM)((Hrf23Q z<{-NYWK;^sD5GSgT1k0gQL1BlYF>%0l6z)u0XVD_G{6z1 ziK@ChBNY@221X{j2Bx~00j3Y}qK!VN%z*jWMjszOizOkz#c&)@s-?UzYQM2dfhE1RxqQHitr zZpMgjk4y6As`!TV-l`5+Yx(4fvrgBs507_gd3x1GRvucPVYBD5fzj6I*;Ci-nS3)_ db=BwRwan5zenDb$BA$Z!o1U(IF6*2UngB5LL&X39 literal 0 HcmV?d00001 diff --git a/textures/component_nor.png b/textures/component_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f4295a5cb060aeea192ab9998c402f82798aef GIT binary patch literal 4424 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 L`njxgN@xNAHg7M7 literal 0 HcmV?d00001 diff --git a/textures/component_off.png b/textures/component_off.png new file mode 100644 index 0000000000000000000000000000000000000000..d59722c5a0652baa3e6dee7e76df7df244d9ee1a GIT binary patch literal 4364 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL-d2S~lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNU$fjP5(4!1MdLNOjAE7WY2q_)GT^`t0>u%B(MWNOwMvm?dHU zX8nETKXVRFZC)0%`Kb?wsc9a=R5u-4_e=BkF5r}_*}*3J?a(?8_r1Fo{C@bIXDAZ$+xs!HW4a z!nG!O)%e*YUSjQ(pQ%^<=h%)nM#qgRji=95f7aPr#DCg$O^8o##Vm_uSyoSrEBix_ zMfYrta(;Pd@?L|eE8){-`W1_0>LhV0v7E?Q&?S|ll5y2@Y^vpV;E1e^NY_J@Im!6|<6M&-{z#q74h96*fKldhO=%m&_9u zuQM_~a8OY|Klt0O^SggnSO5O*vwXk&!uFz_axKr^GBEH~WQIhPMELqxCFkerC8p#j zrRr7W7BGN-jeSKyVsdtBi9%9pdS;%j()-=}l@u~lY?Z=IeGPmIoKrJ0J*tXQgRA^P zlB=?lEmM^2?YL|ztSWK~a#KqZ6)JLb@`|l0Y?Z*~TICg6frRyy6u?SKvTcz9|8>y;bpKhp88yV>qrKIT=SLT%@R_NvxD}#)HnBkIIoLrPyP?DLSrvNfDF)6>a#8yd( zOF=;aYIsF%fv+#z_`G6hC?x0S>Q^Kd=o{)8=;!9@BkL$GaV;ysucJ7mvLIDID784h zv?w{%wJbHSL>bwLlw`R6g3_WKuy<0D^;2_Fb5rw5iuDck3{k9f_w)^b>i`8odS-3` zSXV`E0gB3!%rrz`q4)+Q1NIKGLn?9$;O3&JhWQ<=7#v1cF8Rr&Am@3y*eZeSw@S%R z&P=faGtDi`4U9|-Ep$_ijm&jTj8l_zEsc!QbS+IRk`ql#3{p~)laY+_%quQQ%u7xM z8C8*6pqH7MVr7t+Y;Iv`Vx*g#m}04GVv=a8YiVklqHAJdl$4Zco|>FuVTxpge^F+7 zW?o_rva3KwrDUd9r6n6$ni!cH=o*=u80nfMSy<{OrkPpj8YUT-StOfSSQsT5fQ?E? zwsOla%1tb>Rm#jwOi$G>$V&%HfCAjgF~HMS$w&{P6f6>ulUS0LUzBUBBus7gR$r*`x>8UBUO3>sA(~^lLDHxij8krcF z8t7V>nWgBO7@8;QS{j?C=o*_C8Kxx}nVF`To1vOsoS#-wo>-LXn4X$fVyonynOgu3 zD+LX3L}{X`F3(5>#e#v6iLQaEE+W88paG^2@uH1BsLX)**hU{COdtx73K=^t1&COX zi<=#njXt=f1C@FZ13{$@Eip7MXlaFl!l)%Ah3{x^jRqGTqK16Ns32P z7uAA`3(=iQ%}cRWDp#_%)7?D%6$1kUXMsm#F$061G6*wPEVVCVU|?V`@$_|Nf59rk zWg^kiIjMnxfkCpwHKN2hKNr*nX8<=1Q&SYmGfOfQKuyE&Mm}){28Jq67sn8d^T}U6 zol93>-C$r~z`?;GwDQ;C_U}3Z)0&!u9Ix`r-D$qnz;-L@@q;(3Ub$v$@|m$}^(t{k zfmvy9q%M>sbr~B@;8?MQae6h|DbI>KhYuV$@Z#xQeFcRMnaewr-W_bN?pV^u^FgBD nLux{aQ%=_34-aiW&SPW94c0!VX)!|$)OqxD^>bP0l+XkKG1@kg literal 0 HcmV?d00001 diff --git a/textures/component_on.png b/textures/component_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d142ad82a0f527b50834cf155b7b7cbcd749ef GIT binary patch literal 4346 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL-d2S~lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNU$fyxn`mfa6cOXgCwwp9M0{Rb$zs|M}(2i3y8(IiV*}!C+p? z->=mz^Dplxx)74JZ4T$MWyg3OmnM3DpSY#kKZA|mCWe(wWk>3gV}0)r2)ds?JN?K_ zd-mAbQj1E&ql#-PA9eFT`DJ-R(nDr;=4bwz2^)+rO0z;(?h9vzA z@p&J#9U0G@6*t{=xIx;mZ3>$>NyGQKM%rhRpXrmi9A5zZcRu{r}GVWCz_SE&+j#$z6%Jjz}Ldp1tj0#rzrJ zT9dqL{A?00v3APO)T{n;Y{wg;<3^Rn)90!`>ufFJKW)1v#HY7nmc_CxtEa`4{h`OA zd$vY7zq~VfuR+w6@M$ysibXPYk~o!EPGl_TlFCuZxazra!qUG}`sObs`UTtFfQq?us;l#8IXksPAt^OIGtXA({qFrr3YjUkO5vuy2EGN(sTr9bRYj@6RemAK zRoTgwDN6QsTs9R}6}bhusU?XD6}dTi#a0!zN?>!X@`|lM!um=IU?nBlwn`Dc0SeCf zMX3rVdM0`Xx~>(OWkyPNTnaWtDQQ+gE^bgGic->Sl`=|73as??%gf94%8m8%i_-NC zEiEne4UF`SjC6}q(sYX}^GXscbn}XpK}JB#a7isrF3Kz@$;{7F0GXMXlwVq6tE9xG zpr8OXydt;2*B5SlUNJNjlJj%*D-sLz4fPE4b942PbrhGlmX+YwQ5;fPkg6Y)TAW{6 zl$`2XmYP?hjBG?oGF*Q_X;BW?J1NQfsX3{+sd**E`i6RjC|0_A`Ub#tfPx@BGq(V& zt0K1mMP*558X~Yzd;^jJdk5Je6}bg)b5T^o{0>$O4kIg<{Nz%Q^E_Q_l|c4erQ|1P zrdWZQM#f2oMh0em(S%gju%N=`{mG_*`H(=|>tOVKs4NJ-UAGEYg;O*FPJPc<>HFflc>L^8s^C^J1X zFEIz%RUo5MGE=M!&5TS8O_D5iO;gM)bWO~Y(sYvylPq=3EmJK_4b07rEE1E!Mx`WM zx#bt-CYIPLW#%TPr|K8vrGq6v0dD0O;AyL5q-TH-3CKw-Ny{(FwN>)T%qy)xNQ7kO zrUsWJflFkQ^19S_t7m zxH*|1)d~s<;7nnam<;hkabj6&3fLQPspO2ry!6x*TP0|6g=xvek`zqR%*|3PEDdyx z(o79>O%g4WbQ4pIQ+3Ua5{*;Rl9LP#6Cr^IH@!GNt)x7$DAh4NHLt{0$vrc-0322d z8sLc1M0HDfMk**442(>44NP?r0cHvfFnx#@ZS+B92F%Ac`WRsXQGis)*l{U9#DZMh z?6_?7!6hB2)PooZDs^ayp>aV=D-;w)Eg>mEkDFjGTJesn>{yN0 R>~Em1qNl5$%Q~loCIC$5Bpv_& literal 0 HcmV?d00001 diff --git a/textures/component_or.png b/textures/component_or.png new file mode 100644 index 0000000000000000000000000000000000000000..816bb2a965c133aa81808c83990a9f04e89cc47a GIT binary patch literal 4367 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7-c*G|lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNU$fyv=*qfaA}15m`p&I)lE?lXf{Cf3JGXGk9gt#F{qa#^#o< zU+)}BHeV-WGIf@2deh34h0Vb$Zm&DK2Q+kqNiTjw3=aMyAcUN6+zpmZzrR9%SFI~Et22@(%YF0j2> zDZ#p5NNB;GJ%NjhXU^Zfv+T>^f0EjJ7{z1D)=lth+Rebg*qrI?9N_8f4D&YwL&coh ziMAex9b}Hi2YW9KkvXHFG-F}ertU6_Yg!@;omPlOl^V$ZZBpa)?CM_pAgbU)^2S#W z9<5p3yjp>yuEE0ELUWf#=YMZ5-6R`}cgJ^E_wO!exV}nr*461OCU?y?znn5be+}2e z@RkG0O%}&gjv764F=W2~v9zBd`n{0O>Hl};Cp+jyaR~@?Ozuj&bwv7z@$78}E9TD# z*P7&2<7bn2iM3OHre5`*V>{j$9XF~po<3LoS!Zhz|7qJbAwInovn-ZnSv@VT><>K_ z-Lo~y`Q@F-dkvzlgio94S1gjLlffHB@kGJ?YJTNX;TK@N|n89z) zs?Dp9_B9;Leeh`4>XX$6p7I&|N%2_r#LID3%u1F$^Dmlls47YguJQ{> zuF6ifOi{A8m(KO)W`OsL0L9E4HezRRWu9l~-&964qBz04piUwpEJo4N!2- zFG^J~(KFFA&~>fIEHhHF<5I9GN=dT{a&dziQIwKqtCUevQedU8UtV6WS8lAAUzDzI zXlZGwZ(yWvWTab^lBQc+nOBlnp_^B%3^D>@hD&O3a#3bMNoIbY0?5q7r2NtnTO}nf z1qB7D;T5?BzP@nd^NOLNker{ZUy)d#Z>VRWpPQ?XtfRQZwX6icj^dEYf>iyW)Z+Zo zqU2Q9vedj1Wn?2#lHvLbN{e#9-bqQ;Pt8fqP0cGQ);H8MM6uG{(>DOF0~7@5nYjgE zT@|?nC@M=b(-47$;v0|**gMD$smLvWn~S0v=6A4Sa2Q#+F)!QL3(yVWPQ_nW?#HicuPp5&lJ)>6v+n zImoU88I_WmVr7zSmXd5@V4`b~Y?P>Ll4@e2YiVMdsGE{(YGh%Mnr3X8Yzj6iCE3a? zzbH4c#8xRYH!(d`zaTFiECC8|E5`s&TO}hs1B6IGPGU(~eo?Nil22w{X$3+eBr`WP zxFiu2nug|vW<~}^hUTUwCWhvw#t21WsYS(^`FS8S4Gr{+O~5jsXtDAy%1q5GNd%=+ zTO~uVctvi3m2**QVo82cNPd2ftrEyd3PyT{5a)oTeN#&kQxZ!OT@p)DZIz4+j7+Qy zOs$LzLJW?gQm`;eG)puzG}Se< zFfi0LNjA68O*An`)=jiDN-|D0wJ=ccl!1YPv%n*=n1Ml08H5=tmfDvwFfg!}c>21szhD*NGF0~X z+W(M&fkCpwHKN2hKNr*nX8<=1Q&SYmGfOfQKuyE&Mm}){28KFM7sn8b)5%{xo%?^@ zfiWR5At6CPKtRR&b36ZgMK%Ki0|N~WjfqQs9&E1W0RbN#ktWA1hv;k>=jd!1Kf5^Q zTTzcCR;>~@3<=eDy4Z3~{U*0TGp7{8X3khPWL9L1L^7N=d#Wzp$Py7tttxu literal 0 HcmV?d00001 diff --git a/textures/component_xor.png b/textures/component_xor.png new file mode 100644 index 0000000000000000000000000000000000000000..025ef55b39bff6f6bd17d375afdeabae598bc9be GIT binary patch literal 4376 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL-d2S~lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNU$fyv=)9f#*+pS6@QT=MNT7R7;!t?t2?}2Cod#E&RckB<~jy ze_q$-+k;b%!7FbTskO|KGFO>e<-_iFiFxh?kGv`ieu+s5)BSp5;}ZSjRGxoy+AjCK)4U$eDbnEz zSr)WOalKEJ!TD74U1xLL7hYkn;%e?+&EvnvON6N_qg?ZMQ05I`0hd)_X3o?%cCk7yExak9^20sa>{-BUPV|fq}6()7d$|)7cs3aR!EpIkgjQ zJq|m_9E}h5UK%2EMnP%D!m>@>T^850L>4-&5RED|kpJ7H#_QSDz4$>?!H49HuO2*F zv$}b;0!Lkgg|&s|E|1Rt-dws#HWu%W@2>9OUCwZQmFBFg(^*XJnr(hLWrF@1u7}|* z2b7yEj;S0qdgfxteE(xOaSJyfHd%RB1eYuKKgi)*}AXwrfIsdMjpGEX%TbT3p#5dMvtU zYn1cLJCpYsL|qA=Hq)f#o*O4D{X3<<{>azvCzDQwwmS8( zURmf^^f#gY!|v$SCZ;b{U4tE794)jv*7!m1LY~#R?;9U)@o#uwT(GqK?^iK{-=0;Q zS0C+bIGFq3(XQ1es}DToGx(F@vFwSLc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ zootz+WN*i1Q(;w+TacStlBiITo0C^;Rbi_HHrFbz*a{@9ucQE0Qj%?}6yY17;GAES zs$imLqGzD%T9H|1q-4jXU{jQmW)}AAQ`ZCkR4KyTL3o~MK#RtV8!4tvU15!E(JNy)5TT^WWQBPesX4t z6_{ygl$c^@YHpxwVQy)mYhq|-rkj*xWT0!FXl`s|oN8>EW|4|ylxJRXNn&1dD#)mc z+ycGK%oHnQgS501OLKEwixdMRT@xd-MBSt`^AueRV}qnLQ%f^bQ==3lBm9dp(=+oD zbC6vHGAboA#md|~HOau(C`C8PJk4C!#N5I}*CH_`MK{IL%-G!6*x1B4*$iw{O0tz( zeo<~>iLFv*Zen_>enDP3SOOH_R*nIlwn|2N1_+UWoWzo}{Gwc2C7;Z^(h7t`NM>$o za7iL4G!4xS&5R6;42_Hp%*;)VED?&rQj3Z+^YcJv8XD*sn}B6N(PHIal$n}Wk_bwt zwn~Oz@rv96E9aur#FG4?ko^1{TP2W_6pZu?AfvGM$z)Xyx0j3Y}qK!VN%z*jWMjs7fq{Xuz$3Dlfk96hgc&QA+LtjfFtC?+`ns~eU=`sq z(2h4Xo5aAtAX(xXQR1AR3u=QifSZP?DGKG8B^e5!reSy^pEv^pLz}0IV~EE2