From f79c5557fc2bb705360a352c7aa65fb397ecd78f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Mart=C3=ADnez?= Date: Mon, 11 Mar 2013 06:59:29 -0300 Subject: [PATCH] changed way in which signs attach to fences --- fences.lua | 67 +-------- signs_lib.lua | 253 ++++++++++++++++++++++++++++++--- textures/signs_back.png | Bin 0 -> 277 bytes textures/signs_bottom.png | Bin 0 -> 132 bytes textures/signs_front.png | Bin 0 -> 263 bytes textures/signs_post_back.png | Bin 0 -> 364 bytes textures/signs_post_bottom.png | Bin 0 -> 323 bytes textures/signs_post_front.png | Bin 0 -> 271 bytes textures/signs_post_side.png | Bin 0 -> 230 bytes textures/signs_post_top.png | Bin 0 -> 323 bytes textures/signs_side.png | Bin 0 -> 134 bytes textures/signs_sign.png | Bin 0 -> 1526 bytes textures/signs_top.png | Bin 0 -> 132 bytes 13 files changed, 237 insertions(+), 83 deletions(-) create mode 100644 textures/signs_back.png create mode 100644 textures/signs_bottom.png create mode 100644 textures/signs_front.png create mode 100644 textures/signs_post_back.png create mode 100644 textures/signs_post_bottom.png create mode 100644 textures/signs_post_front.png create mode 100644 textures/signs_post_side.png create mode 100644 textures/signs_post_top.png create mode 100644 textures/signs_side.png create mode 100644 textures/signs_sign.png create mode 100644 textures/signs_top.png diff --git a/fences.lua b/fences.lua index b77948f7..cba22063 100644 --- a/fences.lua +++ b/fences.lua @@ -23,20 +23,6 @@ minetest.register_node("homedecor:fence_brass", { groups = {snappy=3}, sounds = default.node_sound_wood_defaults(), walkable = true, - on_rightclick = function(pos, node, clicker) - if not homedecor_node_is_owned(pos, clicker) then - local fdir = minetest.dir_to_facedir(clicker:get_look_dir()) - local itemstack = clicker:get_wielded_item() - if itemstack:get_name() == "default:sign_wall" then - minetest.env:add_node(pos, {name = "homedecor:fence_brass_with_sign", param2 = fdir}) - itemstack:take_item() - return itemstack - else - print(S("want to simply place the wielded item like usual.")) - -- What goes here if I want to just place the wielded node (dirt, cobble, etc) normally? - end - end - end, on_place = function(itemstack, placer, pointed_thing) if not homedecor_node_is_owned(pointed_thing.under, placer) then @@ -63,31 +49,6 @@ minetest.register_node("homedecor:fence_wrought_iron", { groups = {snappy=3}, sounds = default.node_sound_wood_defaults(), walkable = true, - on_rightclick = function(pos, node, clicker) - if not homedecor_node_is_owned(pos, clicker) then - local fdir = minetest.dir_to_facedir(clicker:get_look_dir()) - local itemstack = clicker:get_wielded_item() - if itemstack:get_name() == "default:sign_wall" then - minetest.env:add_node(pos, {name = "homedecor:fence_wrought_iron_with_sign", param2 = fdir}) - itemstack:take_item() - clicker:set_wielded_item(itemstack) - return itemstack - else - print(S("want to simply place the wielded item like usual.")) - -- What goes here if I want to just place the wielded node (dirt, cobble, etc) normally? - end - end - end, - - on_place = function(itemstack, placer, pointed_thing) - if not homedecor_node_is_owned(pointed_thing.under, placer) then - local fdir = minetest.dir_to_facedir(placer:get_look_dir()) - minetest.env:add_node(pointed_thing.above, {name = "homedecor:fence_wrought_iron", param2 = fdir}) - itemstack:take_item() - placer:set_wielded_item(itemstack) - return itemstack - end - end }) -- brass/wrought iron with signs: @@ -130,18 +91,6 @@ minetest.register_node("homedecor:fence_brass_with_sign", { { items = { "homedecor:fence_brass" }}, }, }, - on_construct = function(pos) - homedecor_construct_sign(pos) - end, - on_destruct = function(pos) - homedecor_destruct_sign(pos) - end, - on_receive_fields = function(pos, formname, fields, sender) - homedecor_update_sign(pos, fields) - end, - on_punch = function(pos, node, puncher) - homedecor_update_sign(pos) - end, }) minetest.register_node("homedecor:fence_wrought_iron_with_sign", { @@ -182,18 +131,6 @@ minetest.register_node("homedecor:fence_wrought_iron_with_sign", { { items = { "homedecor:fence_wrought_iron" }}, }, }, - on_construct = function(pos) - homedecor_construct_sign(pos) - end, - on_destruct = function(pos) - homedecor_destruct_sign(pos) - end, - on_receive_fields = function(pos, formname, fields, sender) - homedecor_update_sign(pos, fields) - end, - on_punch = function(pos, node, puncher) - homedecor_update_sign(pos) - end, }) -- other types of fences @@ -700,4 +637,8 @@ minetest.register_on_punchnode(function (pos, node) end end) +minetest.register_alias("homedecor:fence_wood_with_sign", "signs:sign_post") +homedecor_register_fence_with_sign("default:fence_wood", "signs:sign_post") +homedecor_register_fence_with_sign("homedecor:fence_brass", "homedecor:fence_brass_with_sign") +homedecor_register_fence_with_sign("homedecor:fence_wrought_iron", "homedecor:fence_wrought_iron_with_sign") diff --git a/signs_lib.lua b/signs_lib.lua index be70c7f8..8034ce01 100644 --- a/signs_lib.lua +++ b/signs_lib.lua @@ -1,22 +1,11 @@ --- This code was borrowed from Pilzadam's rework of thexyz's signs mod - -- Font: 04.jp.org --- Boilerplate to support localized strings if intllib mod is installed. -local S -if (minetest.get_modpath("intllib")) then - dofile(minetest.get_modpath("intllib").."/intllib.lua") - S = intllib.Getter(minetest.get_current_modname()) -else - S = function ( s ) return s end -end - -- load characters map local chars_file = io.open(minetest.get_modpath("homedecor").."/characters", "r") local charmap = {} local max_chars = 16 if not chars_file then - print("[homedecor] "..S("E: character map file not found")) + print("[signs] E: character map file not found") else while true do local char = chars_file:read("*l") @@ -29,6 +18,20 @@ else end end +local signs = { + {delta = {x = 0, y = 0, z = 0.399}, yaw = 0}, + {delta = {x = 0.399, y = 0, z = 0}, yaw = math.pi / -2}, + {delta = {x = 0, y = 0, z = -0.399}, yaw = math.pi}, + {delta = {x = -0.399, y = 0, z = 0}, yaw = math.pi / 2}, +} + +local signs_yard = { + {delta = {x = 0, y = 0, z = -0.05}, yaw = 0}, + {delta = {x = -0.05, y = 0, z = 0}, yaw = math.pi / -2}, + {delta = {x = 0, y = 0, z = 0.05}, yaw = math.pi}, + {delta = {x = 0.05, y = 0, z = 0}, yaw = math.pi / 2}, +} + local signs_post = { {delta = {x = 0, y = 0, z = -0.226}, yaw = 0}, {delta = {x = -0.226, y = 0, z = 0}, yaw = math.pi / -2}, @@ -36,6 +39,10 @@ local signs_post = { {delta = {x = 0.226, y = 0, z = 0}, yaw = math.pi / 2}, } +local sign_groups = {choppy=2, dig_immediate=2} + +local fences_with_sign = { } + homedecor_construct_sign = function(pos) local meta = minetest.env:get_meta(pos) meta:set_string("formspec", "field[text;;${text}]") @@ -45,7 +52,7 @@ end homedecor_destruct_sign = function(pos) local objects = minetest.env:get_objects_inside_radius(pos, 0.5) for _, v in ipairs(objects) do - if v:get_entity_name() == "homedecor:sign_text" then + if v:get_entity_name() == "signs:text" then v:remove() end end @@ -60,7 +67,7 @@ homedecor_update_sign = function(pos, fields) local text = meta:get_string("text") local objects = minetest.env:get_objects_inside_radius(pos, 0.5) for _, v in ipairs(objects) do - if v:get_entity_name() == "homedecor:sign_text" then + if v:get_entity_name() == "signs:text" then v:set_properties({textures={homedecor_generate_texture(homedecor_create_lines(text))}}) return end @@ -68,20 +75,172 @@ homedecor_update_sign = function(pos, fields) -- if there is no entity local sign_info - if minetest.env:get_node(pos).name == "homedecor:fence_brass_with_sign" - or minetest.env:get_node(pos).name == "homedecor:fence_wrought_iron_with_sign" then + if minetest.env:get_node(pos).name == "signs:sign_yard" then + sign_info = signs_yard[minetest.env:get_node(pos).param2 + 1] + elseif minetest.env:get_node(pos).name == "default:sign_wall" then + sign_info = signs[minetest.env:get_node(pos).param2 + 1] + elseif minetest.env:get_node(pos).name == "signs:sign_post" then sign_info = signs_post[minetest.env:get_node(pos).param2 + 1] end if sign_info == nil then return end local text = minetest.env:add_entity({x = pos.x + sign_info.delta.x, - y = pos.y + sign_info.delta.y, - z = pos.z + sign_info.delta.z}, "homedecor:sign_text") + y = pos.y + sign_info.delta.y, + z = pos.z + sign_info.delta.z}, "signs:text") text:setyaw(sign_info.yaw) end -minetest.register_entity("homedecor:sign_text", { +minetest.register_node(":default:sign_wall", { + description = "Sign", + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + node_placement_prediction = "", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = {type = "fixed", fixed = {-0.45, -0.15, 0.4, 0.45, 0.45, 0.498}}, + selection_box = {type = "fixed", fixed = {-0.45, -0.15, 0.4, 0.45, 0.45, 0.498}}, + tiles = {"signs_top.png", "signs_bottom.png", "signs_side.png", "signs_side.png", "signs_back.png", "signs_front.png"}, + groups = sign_groups, + + on_place = function(itemstack, placer, pointed_thing) + local node=minetest.env:get_node(pointed_thing.under) + if minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer) + + else + local above = pointed_thing.above + local under = pointed_thing.under + local dir = {x = under.x - above.x, + y = under.y - above.y, + z = under.z - above.z} + + local wdir = minetest.dir_to_wallmounted(dir) + + local placer_pos = placer:getpos() + if placer_pos then + dir = { + x = above.x - placer_pos.x, + y = above.y - placer_pos.y, + z = above.z - placer_pos.z + } + end + + local fdir = minetest.dir_to_facedir(dir) + + local sign_info + local pt_name = minetest.env:get_node(under).name + print(dump(pt_name)) + + if fences_with_sign[pt_name] then + minetest.env:add_node(under, {name = fences_with_sign[pt_name], param2 = fdir}) + sign_info = signs_post[fdir + 1] + + elseif wdir == 0 then + --how would you add sign to ceiling? + minetest.env:add_item(above, "default:sign_wall") + itemstack:take_item() + return itemstack + elseif wdir == 1 then + minetest.env:add_node(above, {name = "signs:sign_yard", param2 = fdir}) + sign_info = signs_yard[fdir + 1] + else + minetest.env:add_node(above, {name = "default:sign_wall", param2 = fdir}) + sign_info = signs[fdir + 1] + end + + local text = minetest.env:add_entity({x = above.x + sign_info.delta.x, + y = above.y + sign_info.delta.y, + z = above.z + sign_info.delta.z}, "signs:text") + text:setyaw(sign_info.yaw) + + itemstack:take_item() + return itemstack + end + end, + on_construct = function(pos) + homedecor_construct_sign(pos) + end, + on_destruct = function(pos) + homedecor_destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + homedecor_update_sign(pos, fields) + end, + on_punch = function(pos, node, puncher) + homedecor_update_sign(pos) + end, +}) + +minetest.register_node(":signs:sign_yard", { + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = {type = "fixed", fixed = { + {-0.45, -0.15, -0.049, 0.45, 0.45, 0.049}, + {-0.05, -0.5, -0.049, 0.05, -0.15, 0.049} + }}, + selection_box = {type = "fixed", fixed = {-0.45, -0.15, -0.049, 0.45, 0.45, 0.049}}, + tiles = {"signs_top.png", "signs_bottom.png", "signs_side.png", "signs_side.png", "signs_back.png", "signs_front.png"}, + groups = {choppy=2, dig_immediate=2}, + drop = "default:sign_wall", + + on_construct = function(pos) + homedecor_construct_sign(pos) + end, + on_destruct = function(pos) + homedecor_destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + homedecor_update_sign(pos, fields) + end, + on_punch = function(pos, node, puncher) + homedecor_update_sign(pos) + end, +}) + +minetest.register_node(":signs:sign_post", { + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -0.125, -0.5, -0.125, 0.125, 0.5, 0.125 }, + { -0.45, -0.15, -0.225, 0.45, 0.45, -0.125 }, + } + }, + selection_box = { + type = "fixed", + fixed = { + { -0.125, -0.5, -0.125, 0.125, 0.5, 0.125 }, + { -0.45, -0.15, -0.225, 0.45, 0.45, -0.125 }, + } + }, + tiles = { + "signs_post_top.png", + "signs_post_bottom.png", + "signs_post_side.png", + "signs_post_side.png", + "signs_post_back.png", + "signs_post_front.png", + }, + groups = {choppy=2, dig_immediate=2}, + drop = { + max_items = 2, + items = { + { items = { "default:sign_wall" }}, + { items = { "default:fence_wood" }}, + }, + }, +}) + + +minetest.register_entity(":signs:text", { collisionbox = { 0, 0, 0, 0, 0, 0 }, visual = "upright_sprite", textures = {}, @@ -178,7 +337,7 @@ homedecor_generate_line = function(s, ypos) file = charmap[s:sub(i, i + 1)] i = i + 2 else - print("[homedecor] "..S("W: unknown symbol in '%s' at %d (probably %s)"):format(s, i, s:sub(i, i))) + print("[signs] W: unknown symbol in '"..s.."' at "..i.." (probably "..s:sub(i, i)..")") i = i + 1 end if file ~= nil then @@ -198,3 +357,57 @@ homedecor_generate_line = function(s, ypos) return texture end +local function copy ( t ) + local nt = { }; + for k, v in pairs(t) do + if type(v) == "table" then + nt[k] = copy(v) + else + nt[k] = v + end + end + return nt +end + +function homedecor_register_fence_with_sign(fencename, fencewithsignname) + local def = copy(minetest.registered_nodes[fencename]) + local def_sign = copy(minetest.registered_nodes[fencewithsignname]) + if not (def and def_sign) then + error("Attempt to register unknown node as fence") + end + fences_with_sign[fencename] = fencewithsignname + def.on_place = function(itemstack, placer, pointed_thing, ...) + if not homedecor_node_is_owned(pointed_thing.under, placer) then + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + minetest.env:add_node(pointed_thing.above, {name = fencename, param2 = fdir}) + itemstack:take_item() + placer:set_wielded_item(itemstack) + return itemstack + end + end + def_sign.on_construct = function(pos, ...) + homedecor_construct_sign(pos) + end + def_sign.on_destruct = function(pos, ...) + homedecor_destruct_sign(pos) + end + def_sign.on_receive_fields = function(pos, formname, fields, sender, ...) + homedecor_update_sign(pos, fields) + end + def_sign.on_punch = function(pos, node, puncher, ...) + homedecor_update_sign(pos) + end + local fencename = fencename + def_sign.after_dig_node = function(pos, node, ...) + node.name = fencename + minetest.env:add_node(pos, node) + end + def_sign.drop = "default:sign_wall" + minetest.register_node(":"..fencename, def) + minetest.register_node(":"..fencewithsignname, def_sign) + print("Registered "..fencename.." and "..fencewithsignname) +end + +if minetest.setting_get("log_mods") then + minetest.log("action", "signs loaded") +end diff --git a/textures/signs_back.png b/textures/signs_back.png new file mode 100644 index 0000000000000000000000000000000000000000..d3fa19a6c38f09f9924dd9fd1b542bdaeba28b0a GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5he4R}c>anMpdfpR zr>`sf9S$xoS@HI>8)JY%TRdGHLp07Oujw#ORbVwRoWK#WrX+RZ&+G4OQxg&%JbC0Q z7Bc05bHLshet<# z-@oL9gdZQiD!cHVJHTRJXKY|#u)(A2Q}Wcdh!sm!c+1a!&!2C(vm$bWEerei_?jk- zCW8s4#$_q99)HxEmeBg6v9a;tji<*=IxUX<|NlR^E9}^8Lj!{?`Zlht(rgRa7;Gjv V?VFvwS_|lY22WQ%mvv4FO#lHuZX^Hz literal 0 HcmV?d00001 diff --git a/textures/signs_bottom.png b/textures/signs_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..604a0fce99dde0aa648e9d9bd3081711f418a1d0 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5he4R}c>anMpdfpR zr>`sf9S$xoCH0@DR-XY1DSNs&hG?8m*6A`yQ(!ePoWLRR|NnpgXlb^EY{xDp$j&;* Z#o!pvDKJBc%@C-Z!PC{xWt~$(69A6sA-Vtn literal 0 HcmV?d00001 diff --git a/textures/signs_front.png b/textures/signs_front.png new file mode 100644 index 0000000000000000000000000000000000000000..e426bec9164ce2ab91cbffec64d64b8f9b74cbe8 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5he4R}c>anMpdfpR zr>`sf9S$xoRT0kU7+IjuGEW!B5RLQ6YdVZm6<7@nCvZfpDM@`e=eNF{;_2G|-)1&8 zI(mCbxiZIG{GLDm;u8sp9|pdOjS`<9i%(v_pg&7ylkJ?CJpyc}+t>e>0D*tD^?wEX zFWc9&p4#Nm^{F0c#N=-AcdN3$&vWWI@-EZF^?Q6xlXmEo2Zt9iJ__V{zlgb`lZS^# z=eVBzvfLwv|Nj4%58h&QucxtbVeLarts4d$rVI?OFI}&Dwj2lqx|qS!)z4*}Q$iB} Dmyu%A literal 0 HcmV?d00001 diff --git a/textures/signs_post_back.png b/textures/signs_post_back.png new file mode 100644 index 0000000000000000000000000000000000000000..7de6531c269a460cc67eba9196a241455eaf09b0 GIT binary patch literal 364 zcmV-y0h9iTP)pF2XskIMF-si2n7rQ0C{7t0003CNklflKzy^#RG^TB08*3Q&TGE0V8V0vqo)$aNGdlNk?&rO$ zP3}kdj@o6V-)-BTFVjrRK7T~dP(Z)i25@1RI0Z2tc2wJP0^9RR1K_G&1907}9tCa~ ztAatV_2jPDq*TiZ^g~0jN!I{$!zAK{`7j^38B_FKCYAFHfRITBKqe6tkV({N)Vag! zDq_C<0sui%s@N%fJnZm1n{=%krcf6mJil$3yJ5`J4tg!i354YYyl(Lk59O+ylkWgv z`S?O)bbG@Bc9wlyIkci{KDz@zr!jq4{I$brf$jOf-O@jGD8U}`NMj7>zanMpdfpR zr>`sfT_z3|Ggjq#;U7SuN1iT@AsXkW2JPlMWWZyir60O*rjlSNk4KNerVoZS?C~e~ zF9@z=UbW(gi`=U)Ly1UL7M6K)ew_RG)5!A8_8;mi&KO&+37`7p_~q2?kqj%&zvWKk z$+FVkd9iC@G6RE9zz4lmjHy>x8Cc&l+^92%ay89lSuo?Ah2m}gm>u`t#c#RwFH&`J z=!bPP&ZTI{&CM5z?sD)=XWcbtIwuo%?PTe8o$0TNwRI!Ij98qv$-7+eUv%20o5w7w zb`k6Qj^~rbd&4}}CaJ25b~h&%UB3B1c5Qg*rGz%KxqI)u`@?;+;pG1NzZp&I3m+O> SODG5Wmci52&t;ucLK6U`gL=UL literal 0 HcmV?d00001 diff --git a/textures/signs_post_front.png b/textures/signs_post_front.png new file mode 100644 index 0000000000000000000000000000000000000000..481a27494a66c7a670c6643c0883642d01e4a7cf GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5he4R}c>anMpdfpR zr>`sfT_z4z9!7@B;DS& zU$(DlJ+;ZB>r*|@h{@gJ?^b1hpXbzb-YGYChgEE4-PM4d=$v@ei3s=Cl3#g z&T&2aWw}QTleoT$Rcm{Ey1VQ9lf&EV=W_Q2WigwYXn1@Iyv)WhZ@Q;qQGJ&S(B%xC Lu6{1-oD!M<4UT2p literal 0 HcmV?d00001 diff --git a/textures/signs_post_side.png b/textures/signs_post_side.png new file mode 100644 index 0000000000000000000000000000000000000000..c6433286587047fd419b9d0effacbdf3b7f5bcef GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5he4R}c>anMpdfpR zr>`sfT_z4z9)|L|U`wD-tEY=&h{pNk6bGioQ?xZk{!XhnbmKT3w#m>_CfV$?JQanMpdfpR zr>`sfT_z3|GpTjua=bvHN1iT@AsXkW2JPlMWWZyir60O*rjlSNk4KNerVoZS?C~e~ zF9@z=UbW(gi`=U)Ly1UL7M6K)ew_RG)5!A8_8;mi&KO&+37`7p_~q2?kqj%&zvWKk z$+FVkd9iC@G6RE9zz4lmjHy>x8Cc&l+^92%ay89lSuo?Ah2m}gm>u`t#c#RwFH&`J z=!bPP&ZTI{&CM5z?sD)=XWcbtIwuo%?PTe8o$0TNwRI!Ij98qv$-7+eUv%20o5w7w zb`k6Qj^~rbd&4}}CaJ25b~h&%UB3B1c5Qg*rGz%KxqI)u`@?;+;pG1NzZp&I3m+O> SODG5Wmci52&t;ucLK6UB+j@Bb literal 0 HcmV?d00001 diff --git a/textures/signs_side.png b/textures/signs_side.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd809d4d3ae0dffc3d582e94e52178b05f161cd GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5he4R}c>anMpdfpR zr>`sf9S$xoc?&tMckMtSRZkbk5RLQ6YdVZm6B07wE4mmtLypaUD3p?7an+#2 agn_}VgnLWAxLbv9Rv$nsE6t9>O-Z|b~w%~(5R8Bc8ydEV&zSQ9{u{i zPlo^ZBYyt)^B;cGdaE!-BLN{L&KWubH+L@x!P5^D)@ghK8dwdxkIWAjq!7fMn0mpw zY%FUgrAz}5g?TA-wldF&&cW~h@>&4sp8?ZRV+2SAS}JVcvp#tAbmp=oBpu6#jqkp{ zL$ttk_E@VZab>%Dq!e_vvCNqt-|ZYMG+k+}kwZn*%zCNBm?`ng1pW(PNX60_Fv_5m z;`sd?G{~hg-+$zId*u4?fD(o2;P5`+6x^LHH5WpNAmCRoHCq+*x)5WfIPgLO1tkPZ zwa0)OCDvwY)`XV82du61<46%OetV1TI*e+>B&nj}Zf{9GFiwpk8fRHq*T8o5j5&}} zCge!hE6%;ZE|L%n%UT`-LW^`&B1)x&f)EOGsMs#!P#n)EKD?i)SjLm1H;^l+-jLUo zv}b<$Jad``4ki)EC;>TSVubmc=thawjpHC515O9W>MJkqM#37I?v4oI$SHBS8F~1) zVw}S&uomWzS6rtNM$xpQ)xgc^K#mb99a1*d>qe^rOCqa6ixnD__QVe4P2^RW!F@2?9Sq&Uv3*`Rzd92Aj=u_q4pL6+-r$Bp z&WX!4(RK1MU^r=74h*BBcbZZfd0nW%QETQJGyT}3I)kW*lqxj{UiO9D3?JX_y!iG= z-UHfbtX0(3lOHO!llYL3s*p;<=qCUV4?CrRY67bj$CE|NMh=nTFi>;k{$CrdHjYz= zH4Z%(cHa=%qw384n+v9Qw6yW*e#07g_jYA3jm~CXogKXutUf=n15<~wmd#htisLr} zaTnB7S$yJfwA>vm()O%tz}`;y*)xoi6b0^lORr&{SCkpJxs`l)Kl9D20VOJ%4=k~w zjiGPpi4?@ja$V3?(tP91b?1C?Tpv6ye=!nMK%_=3m9aA{_aEqQMrPlzt&shO(u%ex zL?>uDGj@f3>_{QdYe|)oCK{!CVhO|I8K)j&3=Cj|!cCUWLh?H)N!-a%_Zd5VM+%Xl z?|GO%ak}Yd>rZ*f;9o;lyx}KB^eP@tXk(vT4kXqrKdOQK4B&9@z5L_>j94pXlM#0HF7HCTpt70t>QY%dI@Nw zIGqRlvXeTCUlT&WI(x2j#MuUI#U32W3J8+52tpL>N}`n@Hbrid9m#N1)NM!9N}3bx zsV1zgaJj5>ou%(2IYq3~#_I;NYR-3M&nBWS!?GNGH!H*9aqZ(3Yl#&P(O-K}i@hH${Kt*`{X{7<3UVw(7^0&RB zWTu2bDT0s+QdXibT(^Xvl2gTWn#~uq`yc(!{poianMpdfpR zr>`sf9S$xoMeW;xTU3BT%APKcAsXkCb53tbQ(!ePoWLRR|NnpgXlb^EY{xDp$j&;* Z#i0C-b4pTdZWB;BgQu&X%Q~loCIF9#BRT*8 literal 0 HcmV?d00001