From 395d6f0ccfcaddbb9ded79ac4ca913c87453562f Mon Sep 17 00:00:00 2001 From: cheapie Date: Sat, 24 Nov 2018 21:00:18 -0600 Subject: [PATCH] Add digilines piston --- depends.txt | 1 + init.lua | 1 + piston.lua | 190 ++++++++++++++++++++++++++++ sounds/digistuff_piston_extend.ogg | Bin 0 -> 6301 bytes sounds/digistuff_piston_retract.ogg | Bin 0 -> 6214 bytes textures/digistuff_piston_sides.png | Bin 0 -> 5179 bytes 6 files changed, 192 insertions(+) create mode 100644 piston.lua create mode 100644 sounds/digistuff_piston_extend.ogg create mode 100644 sounds/digistuff_piston_retract.ogg create mode 100644 textures/digistuff_piston_sides.png diff --git a/depends.txt b/depends.txt index a581a9b..cfb8465 100644 --- a/depends.txt +++ b/depends.txt @@ -1,3 +1,4 @@ default? digilines mesecons? +mesecons_mvps? diff --git a/init.lua b/init.lua index 4fa7a2b..13786a6 100644 --- a/init.lua +++ b/init.lua @@ -11,6 +11,7 @@ local components = { "piezo", "detector", "conductors", + "piston", } for _,name in ipairs(components) do dofile(string.format("%s%s%s.lua",minetest.get_modpath(minetest.get_current_modname()),DIR_DELIM,name)) diff --git a/piston.lua b/piston.lua new file mode 100644 index 0000000..cb3fc6b --- /dev/null +++ b/piston.lua @@ -0,0 +1,190 @@ +if not minetest.get_modpath("mesecons_mvps") then + minetest.log("error","mesecons_mvps is not installed - digilines piston will not be available!") + return +end + +local function extend(pos,node,max) + local meta = minetest.get_meta(pos):to_table() + local facedir = minetest.facedir_to_dir(node.param2) + local actiondir = vector.multiply(facedir,-1) + local ppos = vector.add(pos,actiondir) + local success,stack,oldstack = mesecon.mvps_push(ppos,actiondir,max) + if not success then return end + minetest.sound_play("digistuff_piston_extend",{pos = pos,max_hear_distance = 20,gain = 0.6}) + minetest.swap_node(pos,{name = "digistuff:piston_ext",param2 = node.param2}) + minetest.swap_node(ppos,{name = "digistuff:piston_pusher",param2 = node.param2}) + mesecon.mvps_process_stack(stack) + mesecon.mvps_move_objects(ppos,actiondir,oldstack) + minetest.get_meta(pos):from_table(meta) +end + +local function retract(pos,node,max,allsticky) + local facedir = minetest.facedir_to_dir(node.param2) + local actiondir = vector.multiply(facedir,-1) + local ppos = vector.add(pos,actiondir) + minetest.swap_node(pos,{name = "digistuff:piston",param2 = node.param2}) + if minetest.get_node(ppos).name == "digistuff:piston_pusher" then + minetest.remove_node(ppos) + end + minetest.sound_play("digistuff_piston_retract",{pos = pos,max_hear_distance = 20,gain = 0.6}) + minetest.check_for_falling(ppos) + if type(max) ~= "number" or max <= 0 then return end + local pullpos = vector.add(pos,vector.multiply(actiondir,2)) + local success,stack,oldstack + if allsticky then + success,stack,oldstack = mesecon.mvps_pull_all(pullpos,facedir,max) + else + success,stack,oldstack = mesecon.mvps_pull_single(pullpos,facedir,max) + end + if success then + mesecon.mvps_move_objects(pullpos,actiondir,oldstack,-1) + end +end + +minetest.register_node("digistuff:piston", { + description = "Digilines Piston", + groups = {cracky=3}, + paramtype2 = "facedir", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec","field[channel;Channel;${channel}") + end, + tiles = { + "digistuff_piston_sides.png^[transformR180", + "digistuff_piston_sides.png", + "digistuff_piston_sides.png^[transformR90", + "digistuff_piston_sides.png^[transformR270", + "digistuff_camera_pole.png", + "digistuff_camera_pole.png", + }, + on_receive_fields = function(pos, formname, fields, sender) + local name = sender:get_player_name() + if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then + minetest.record_protection_violation(pos,name) + return + end + local meta = minetest.get_meta(pos) + if fields.channel then meta:set_string("channel",fields.channel) end + end, + digiline = + { + receptor = {}, + effector = { + action = function(pos,node,channel,msg) + local meta = minetest.get_meta(pos) + local setchan = meta:get_string("channel") + if channel ~= setchan then return end + if msg == "extend" then + extend(pos,node,16) + elseif type(msg) == "table" and msg.action == "extend" then + local max = 16 + if type(msg.max) == "number" then + max = math.max(0,math.min(16,math.floor(msg.max))) + end + extend(pos,node,max) + end + end + }, + }, +}) + +minetest.register_node("digistuff:piston_ext", { + description = "Digilines Piston (extended state - you hacker you!)", + groups = {cracky = 3,not_in_creative_inventory = 1}, + paramtype2 = "facedir", + tiles = { + "digistuff_piston_sides.png^[transformR180", + "digistuff_piston_sides.png", + "digistuff_piston_sides.png^[transformR90", + "digistuff_piston_sides.png^[transformR270", + "digistuff_camera_pole.png", + "digistuff_camera_pole.png", + }, + drop = "digistuff:piston", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.3,0.5,0.5,0.5}, + {-0.2,-0.2,-0.5,0.2,0.2,-0.3}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-1.5,0.5,0.5,0.5}, + } + }, + on_rotate = function() return false end, + on_receive_fields = function(pos, formname, fields, sender) + local name = sender:get_player_name() + if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then + minetest.record_protection_violation(pos,name) + return + end + local meta = minetest.get_meta(pos) + if fields.channel then meta:set_string("channel",fields.channel) end + end, + after_dig_node = function(pos,node) + local pdir = vector.multiply(minetest.facedir_to_dir(node.param2),-1) + local ppos = vector.add(pos,pdir) + if minetest.get_node(ppos).name == "digistuff:piston_pusher" then + minetest.remove_node(ppos) + end + end, + digiline = + { + receptor = {}, + effector = { + action = function(pos,node,channel,msg) + local meta = minetest.get_meta(pos) + local setchan = meta:get_string("channel") + if channel ~= setchan then return end + if msg == "retract" then + retract(pos,node) + elseif msg == "retract_sticky" then + retract(pos,node,16) + elseif type(msg) == "table" and msg.action == "retract" then + local max = 16 + if type(msg.max) == "number" then + max = math.max(0,math.min(16,math.floor(msg.max))) + elseif msg.max == nil then + max = 0 + end + retract(pos,node,max,msg.allsticky) + end + end + }, + }, +}) + +minetest.register_node("digistuff:piston_pusher", { + description = "Digilines Piston Pusher (you hacker you!)", + groups = {not_in_creative_inventory=1}, + paramtype2 = "facedir", + tiles = { + "digistuff_piston_sides.png^[transformR180", + "digistuff_piston_sides.png", + "digistuff_piston_sides.png^[transformR90", + "digistuff_piston_sides.png^[transformR270", + "digistuff_camera_pole.png", + "digistuff_camera_pole.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.5,0.5,0.5,-0.3}, + {-0.2,-0.2,-0.3,0.2,0.2,0.5}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {0,0,0,0,0,0}, + } + }, +}) + +mesecon.register_mvps_stopper("digistuff:piston_ext") +mesecon.register_mvps_stopper("digistuff:piston_pusher") diff --git a/sounds/digistuff_piston_extend.ogg b/sounds/digistuff_piston_extend.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2a855dfeccac5d917d642f0c30e2f31cca1a2174 GIT binary patch literal 6301 zcmai22|SeD_kRX4_QB9#Xvj7~#!^Okvz8fzVXP5j%UagzjZ&6uNeszSwh@z2387vs z8rjJ*LPZiqDp4x+_P;ZF-?#t!|9^hJ`?>Di=bn4dx#yhkInR061_U@jT+q*kzxvIA zJ-tuD5@7PMn1d0Nz)1E2%)EyE1KMF2=cfr~%Rc#cW1nPG?n*?wLG1kTzgj2vIwK80 zcL_XnK+85F022~OapJJY5HLF0IDKuLwmwE}x-jwYj%724ZCF2xH8pdBL2$5wv&Jyv z2eQZzgn%F~C9Ft}KLJalmZ}}ir&_XSOzqTsYAO@ulYwjhYryFFNca=1R5K$=@PT^`E@Sx8?5FVj_dlxmgjLp828Z=wmEpp!8z5j9V@ri3B#AvxQWTO= zU^tDA=uo&^6d|BqRdPx|rvsBuO=3c%UY<=Nyu79oc;y-TO$%_JfAK zg#II43kOFVGHB5r&M|(YG0~$jajyAE?oDy7O-b&LlRQ?Fyiv(N`{%gHRd(m7j)6fX zoAG%suw{xeWz+aF?!@F8F36W{5)6N~A~w66Q0X638(7$Q;7Vg?cb!Ieoe*aW1Or>x ztt7CZ^8a*y*F3-f-i;4*s6)oUmJh?x55tu#NJyfFcUT z{&_+1aNR6#j#=UXTU06BOlVya*pN~>gDDs&SnkD(6uc~{Mivg;OLZ(%ZLZEQfwf$dQjaE0R-!>%dmXpUK=!tWK~aNvqPLPH{BHKu{urgW|si4wTnXT#=oo z-lcYyXjBprOIwd9;8cun zmI<#kCrFa>Bf7AcK~((exc5r^Vseju>HSM+dvRsZAL(d1=o*n7$<8sMuIHmCZYFs= zj-DKin;bo}e`E5$f%SLfKps_eh%9_hV=c0$bKU+eq)V(?l=04JXTGq^=J_XbO4Kr^4Kgce@D)q2qn-#x zAU^OXSUQj;2{T4Q5JiY2fK8&3`mnQEq%Pb`G>M46T;$M)hsz~);dqM^5Lg=8p%42I zo!DdYvM6D|L=A#4cVXbqR87y<0z#-lQ-_rLbM&l`%2pB<{Ybx237gSey=kdtZa}RR@=y zl$;m$Jc{h$>^HVbc9lBrKAQCWQ`~bDoAc;MG@yF3{Jd{QPpSnL1O}B=(F@e*^lExz zD7}{9UiOM!M(?T%px4%P)m^<(8?peXwN>;w4LV)pN?pwwU1OoKir&KLs=HQLdu5^V zonV{BLdzj~ZS9r1H*9JPW1&5Kp+!5k65CyQWxl1lr6p{kCA_CG6kSfAZ&mNUf32(T z-9pRO`e+4va`aQG#|vkmN9g{;7u{Er>OyziVXSol27{mR{Rh#_;Mk2YS+Lf=yk(cS zK_)Gr0Nj+$D5PIms0-WDRllJ@J{_z4{lOFM;cJF3K1G*b72&xF;NK8Jf^}C$Ey&zm&im@?TA4N)M52@jAJIDqbNt5cmPWsB=MEf?1;goR2C`t zdgU->5mO;W4Ai6!x&>9Y54&ZE`5<)WDt!A0{Iq&D0kE1YsSq(G(khTvL`|n20OayP z6U*ufaR)+m17Jm~kg_7;8jsPXZ*aY`bBUV8qk--`! zodE=&&_6~Bj=lR!b4rkAJBz|#3s=9Mn+=4|j=N>xse=^2Dw~u6PPm6OSLOu)LIEkg zVRk$+ME}#UTMb)=6?j8Lo^Af<1hP&%H)I^o?^nW3A?&awAvu~;Sx4_Bs1S*dF>or1AgpoJ!=J2+v>Ym>@^2?)FLL*^ig+c6;T z@JiEA2?MAKqz^)oh5~+}A$@>tQIR61>e4=aCTiG3JEA%^2|*+%(?EqQfClwk$N<#^ z4KB2vN4$h6Lbzm1l%tNiSfVviwfZEmC?gs`fyV4{3u4qiHik2jSUOh901Ez$2l;MW zAm|Oa&>K!3QHHYkAY)WHkc$sMPrML)*OVCf2Q4ArM zeO?`W@j_?L)Tax+(z(0A<4H6o5yPX9!h|8S;u9poj!X;NHr?Ylw4jNse*wcFc?ilD z#waQl;4?+eie@3siDirDNKgTMA!rH~FABvgZAeK;@y{%8d%>+_?weTgV1`GTLuL`4`md>LGza+^=74x#F}s`R;@uWG)r`Km;r6JM^(}(kR}% zYe{M9!xP55@dGzbj}x-duSF!1={XPMh=1MSo5-eWgX@ycw2M{m*n?_{p!7+oYp@n^xxs3&$ld4}IAs3z;igQTYbblddeziTesdtt!G2 zyPrL-^lu)1*Zs9m6~;Pg_4OwHL{8~et>x|$(YA0$DJwgl0&3&+#fh{GSjesBBe>cy zDfzuSZt}Dk?bEXmq!it0lgNBD+44L`CXe-1DPyAmiI{t&Jf)JjX@!7S8Pc zIP=m`#>lzqaMQtaUTf2-sT%!5YQ)pq-lxcJfgX6qrHEz8eL692(*em%y*Vf)a_f7t zzskXh9kD-_jxRLfo4-m~O|H#-%X)0LyQTu=rrwvWVkX2VDdyb2%L}sH6!l#Fd}4!Q z1{a3a_Vj9R6K=Y?KI7&$#vfL)4TP1sZ!E8?@(fjttxdZbvQ{PP>XNRBh$u9=W`HMS-Si>6UQhSt#DC|HbuiB7zz5Vhm7d|Kaio>xXeSr}x7o2)23 zB=u6i(($62*h`Itr&UsY2SkHLqpIYM=6ZcTXJLYnuj{LtZ0Cwz5DL(`+u^Um#zm^D zdTyqC9^8GW{)2Gk#>K+dYk5(2d!T?2dy$#CW%GGW{_7687U+wfD!H@i>fT~QNW*|< zy~ha7H1E>$8>B^K_3QWD>#g;eU0H4)`7_p@E9Z0UXkMmJ9Re?NzWw;H_}cG!TUQHr zNuvd~L$|$AF&DSwwkFA#1aEp}a5F#`@@Z&Q4KS9>Mest0jz9ktIx(su+keME;s^Rjxzbb8S5ZgKIBy_Lt zxk)fSd>73(Fz8VAHv@~A9ipE;mLP2o}m{o1>D`wX>YAGYkb z2`&1#Y2WG!Ge3EkTXW1i)g9A^YiDQN-F~0E55H!nx~!+QM)=tDsQYb5W2na3tz*Zg z49C}ag$7Uiy)xBJ%$8~tzJ0@FF1|kbjr)|8r z7VoF@vDY($#|zQ$$5&c+_`MBT$P{F;W8vcywoBE&jn}lQtcV)3BN#Yks`9-^xQ|+Z|JU-h{@@??Gdpn;vX$jcyG;6Lw)&VBEmU?!``e z`0%!Gw0>0nvS(#R$yV5JUHcpazZ%z}y6ohOD@*vG`f|rk$p$MJ)H!Ud?XL7CaORNK z=Jt2vvU`$u3U{mMYPAymtMcKgZx;6+9GgrV=W8;*n{_VNzpGI8S?f%;%2{SH(r1Se ztN`=vHfcmfyP=`*(TPQ`T6v!Ctv9gB3az(u_O$Ren|-Z&PZ+{9;WdF9n=Ss}WzuytxJXLpPILBrC&9iE_0`biN!j2dQ|ZaVkmJPeI}L7!A+L!E-^fj0Qp)yhIWMt^{5jCk6Un#fYd&c~N3 zjaB&)*C@HHWF^?$mh$GR+*_(rmfL?EuG4+``Ec0LeI7bxzxVEO^=Up*#uSe)X9X8H z?_7&i#UAyirYrou7b5EwreOptq`nWVVdF2L^slogH z(w}jScO)!EKHQiK;7WdYgBLo!s=YzfFGyf@`Gzdy>t(d-)_LWrqfpG-=kEzHD2BAz VcIgt=Grw=|H1-q0zk4|Ce*mjLo{9hf literal 0 HcmV?d00001 diff --git a/sounds/digistuff_piston_retract.ogg b/sounds/digistuff_piston_retract.ogg new file mode 100644 index 0000000000000000000000000000000000000000..57f93425d1bdf4a95cfe5475fda01b4aa51ba63a GIT binary patch literal 6214 zcmai22|SeD_kX6bjjh4Z&{Q*)7!4VrMk$msV=2SfRfZvJSzFb}5JHv-S;{tQY()sY z#T&-HM3%M}DGI%9lG5_OGkV{*|NH-ce!u&v0)WP=hPyXHbC;1ek2Q%}?Z9o23>wqsa zA^^Ih&yhpgdxO2P{yubj0edVNtE)rQ*CFcYV>O;-v;OXQK69Ax@>#s;PJ0+623Clc z*j8qLG7W-|5Oh!#FP-K^#&g*D8pku)=KNW!PFyBCt`+T(K;->3VD&uZAxH>fY9Nvd zr^vp&ByY5OQg9y0$9l_EtZ2N=I0) z+)jn`lBRQh4hVrBSa26p5k*g=sTiMqEWS817_eGa3kxxUn$VsU6uA=BRf*}jue$d= z!A4I1{w6b9J1ZJ!VQvoLjFIrLk?;to%xIUo2&cMem(ggqPtoq^n4f(yV(b&Y3slF# zpga{)`Xs(US*hR|sQ}K3DO&+~@=bz8q$=Z63(3V^z7;;%wTDV;1G=gRT~(5TEf5TB z;kP`Wtm6OEy`0h+|GgU@YS)B}fi2sDFl|AqW>nR-V1lT?!tD_7sWFw%8mzY`M6WGm z8|ZsNcXhBWd*&@y{^bO|+abu9h-nSNbO38mwFZOr9YTyoLaauBDfkxo&n;4b7oZ3( z*DKwZDYhxuU0@a_V2jQd+bOv$32cbXe~!)S&-&0qlFoXO$3d%_G zR*wR+ICi#rO}*VRzn`$+?$7D{oiqVX#68OPt4Fwj*=Nt3KYI}TwSU9M82HV76wS*$ zi;YMUp`&ocxU{vQ7o^kji0$~IwTVf)Dcq=iR7G`8=vjg0SO{Vv1t|V&5I}hu#YL&{ znw=UqyLGz={GqJ5*KqbmGjgXS5uli$4^W&~Gj%znf@JQ;sTp?Oz+qD3RSa$GVkrRY!OTl!cs9IF1S`83- z-s|oCpm$%+%tp`3R^IKteAu7@!`8rUP@geKV+@5e9@a8kZbdlN{tTGquo)W(`z3Pt zA)-u5nlw)p`X_SoG?JceNm3!Fsyd~vKc4O#m&Ltw`4zW7{9loCDE?|@{MFd_>DVNV zxOAVmtdjZy|IUiphX30Cj+{Ngs-T0&F$-4xC32dGn4KV+st8semUT3`4-6V=w(3_0 zKu}Y%q=g`l*if~GsQN=xEt;Lte~uVH9n!NJ)B}dS2tkSvqyn7GLdFLtn+6&=iV>$& zh4V=w`7LPHRpcf~l9Y02vWdD;T`H+r^20b)Lw=WKRHEAEB&^iEVpsBuEn*<;2|+dx z#3Z&8ThPJ1uy+lMVyPc%YNgE*JwbId>@M^`f9+NqR1LTe(HrgUSw@B6_t{fbK zM8Tg#et)t&%oqhhbV;f>KAKJK#ZM(uJBcqaR0`>8j%_bVYz?cED3Tk6#B(sVz4$f^ ztJ~y7PE@~%1_WW7VBpVGL(kI;LaIaKM^yXL^ej+n7IJ2ND8`7K)yPG?9zA^^tPaE3(88Xw-6kD?9sviAUUvBuT@|pkv3#i$Fc?@Q^&Q64gJU-XSA#X)hYdU2 zwyn7J3jiB1J~re!jq`CERxr1~AQ9X& z$`+~FiVa0lXRt+fL=jwwHKi59-beApu^(viuy#r0_M9|X${{>^fGV2L*+=oqXAe{T zDvKY`Ut^0DC_Y;30cT$>?}2lIj0aM8y2!JajNnxB34qmfUXipZg;RvGplI2510WX; zn3!{mWNpdZ8o-KEq+mfI)}mYjiNhFhqDa<-jOU?j1GIQqDm*M;)xj4okntju4Om@@ zN~KWBFQ!tvbJF;%qLL_Nd~GVl65NVHsf?yN`xA$AsQ&ukR)AG1#b1l(>|$9HhIEz? z+^W3B-p{w32ZXC}&=!=+8U?>V;*=7_r<^aG+p6G_1cclA=@$?C@(C^hM#EVll=9&R z)I>n=2)Hwpb@I($n$vx?c*FE^zHrUTi>W~P)FbBv5_^CSSfx@EzzG-s`r>q7K**w= zubFxj;;+B(z`2Ys!vee^LN3&Qvg-6VBx zu%#&;PwO@jQ>*DE;qk4*Br!FPf`z75tGyo{546w%b%!8qMXcglVd7Fw2xu3GVjdRc z9T7ziI;tOCgz`WtbI`yq9FzyJEjmQnR8!HT*F*!)+DFmEM@c z8z5*7Txd>^N7SHXQOFow2;`Eyk@RlTON<`Kj2M=*CNC#S+Eh#)Tm!tTx=CO_ngRl- z_wu8_z+n&Y2~^4}ELg*HLiq$XRUCpekARBkhK*;)*_1qxGgm;z`8kt963u7t#`Cc3 zR4Nb$RN@9p0^7CP^9gL{IV^yNzkWCpz>4R*lTzO5=vRT`4AaZ>M*xUxrn3AffZ*3t z4?$0aMWGw;)n*3jXoRMor$7lN7ML-C7=xn66Q^@_is4%`L5)+4=9eDeCCjfr5&!`_ z@&JJ}jo}YDAxZxfCjZP3|Bn(}P-n^5gSRygy;^L!D&H+Dc=Yi9S)^w!KmJm)|5LsH zr~$>HO63z?q^2c#EoWhN-?lilG>%`T<|msEIkAGwgg`3xpg6 zJkk^NW2j(D>nOd9STsNd@rm{*0|Dgh2d?g?g|8W=C)5D@gA6fDKd(RRECG!N9)XzV zH-cg=7Tvsee_Y^e94NL;1=i+&7*K&P^7v@M?VZLPF1Fb;Tvc+gKq3K5z)hYL`rjb(EBqD~T+i8$yn* z2irxNl8K4c=Ote1HVL~u3B$6mLb%vg7%G_=B^P+?nbh98-w}pp9O>mRU>LL(f>Nch z%F0=!Bsb-*q&D zpm2%4xv(MlLii71<5s9Tw~lnpuVL+yI=pU`y5e4yEnf$+gSn3xSeIP5+pDLCx5uFS-XpDc5*DX`rjKL&F=d zD2-Y(FOFw?aV?cW4;s|%uST1ktY2tfn7M9Vl=Els)R}Oz6_~XV$gLh^_4((ow+F%H z;bPgPkj^+>Kl8TM;qdRz&-gG(ua zeg0s2dg{xUho?-T%-Pp&6Yxeq_|U?J%WYZjA-nBI#X7wh=Nx$_$=j>>s-4%zY+W*|}*K2IA|ukl%%AahqQ zV`OD{q*+|R@e@vn-Rl&hCZ9P4L6+Kgs-K2%UqzlR{(_H$=EsFH*S&spY;CsXMEskI z*{ZMJkUF;$v-#+J{dUDGr(D-t;B^^`R!goS28eA!_dA>lY;;T4=&v3XFJJVnzeBpX zh57N@k6S{aO6T_-L1*j>@cIpA$y_o2bZ+6L-dgX6x}sS0H%FKI_6GO&`cA};D`db_ zm9A?R=5BNG-TKFcO~$(?K1HDMucb25p3f?LG`0!j@2$Othc2)wM2i{ zuEIrFR!NU|;B6k92Pb^}5-AR?WR;fKJy4Ea(RBO!RG`&H^4s8uX;_@*UJ-Sxk4e*W zUo_>`{ZVoIQyd~ys%}x6sfRj^0`k_r-CfH(~v2x5DeEHlNZzxH2xuEThTy zgT#fgx*2>?HH&WExLEeByw7L#k4Oufr)KFGPaHZxYDy>e`w43ol`~Zm44hwgVMh8P zQ>lfro(l`;GYNX~8PSOg31KhRE_A3!b{TEEd}US8&OK;xImwhx) z-ky!MzU}0A*ZBEY+s+?o93*{5KgAr$o}MiDqjGCY*6gc4_PF^va4;_}FMgXTnpY2O+|6_2_{weRtqc zjR1 zx9`UTeiXvwZo*H^8aMg26coMNx_&%y(oXrizFy{U4iBMwG3Vpg{kGlg+Mg0-k$da! zt~yvnT%+-Xm=fmVnwaKZz*w})8p?AJ#h0_nhtS{{AxRoI_tXnQ`Y$_Sv!ZS4iUv{_p2%zNnFE zrWg%ML)qw*SB}oI^(wBPzbWOCc8q!udau>As}AAT?gOf z9)8E|#j8+x8`X>C{aFQ1WGwP_+rA43D^f+btmEW;yi$HIlgpf{UE7yNru1N5MXA+) zwK06se~*W#VR(d)6u)L|J9~OV4fI5{>8--D0_JM0G?<-%AS01RF z4-0WUTk+j7VJ_N&_EhoG#?B;4mSx0_bGMKp2D4h3C(hVh-w~VW)TH&~*xgS?myKYa zcKbfvy7~KCS#9gJ){X-ow;t$tJ5OfpBg?tt2%it!e)#Hku`7N3!^V)tt*C1rq<0-s z?UgOFmUKDv&K0JTkYne^6S&%UauZ|HtAyUp$ZtE(X*tmz8IUNIv4p%loqL`C5`L4? zR3U=9ufKW=`x|`Tv&MG}tuVhMdS7bUxlH8X8YG#9&VJt~i_M-7dqRF1pgjG=w^rnm+Z$JHj*v*GhS>TYd-DkM7w_Y` zd^b=(wmLp4+q`tLX7}FKZujABw+JU+7b#hYKo1n((RU`c#tH8={4#TJ4Yj;2O@BwD d?57mx>m&32H@izhikEco8000OSdQ@0+Qek%> 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 literal 0 HcmV?d00001