From 043dc16dc6f23c71afc63b4cf4d0d27e335079af Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Sat, 25 Feb 2017 14:33:39 -0700 Subject: [PATCH] Initial commit This was split out of the venerable Castle mod, https://github.com/minetest-mods/castle, which has been maintained by a long line of distinguished modders. --- .gitattributes | 17 ++ .gitignore | 47 +++++ LICENSE | 21 +++ README.txt | 10 + depends.txt | 3 + description.txt | 1 + init.lua | 205 +++++++++++++++++++++ intllib.lua | 45 +++++ locale/template.pot | 33 ++++ mod.conf | 1 + models/LICENSE.txt | 10 + textures/castle_tapestry.png | Bin 0 -> 323 bytes textures/castle_tapestry_inv.png | Bin 0 -> 2062 bytes textures/castle_tapestry_long_inv.png | Bin 0 -> 1822 bytes textures/castle_tapestry_very_long_inv.png | Bin 0 -> 1376 bytes 15 files changed, 393 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.txt create mode 100644 depends.txt create mode 100644 description.txt create mode 100644 init.lua create mode 100644 intllib.lua create mode 100644 locale/template.pot create mode 100644 mod.conf create mode 100644 models/LICENSE.txt create mode 100644 textures/castle_tapestry.png create mode 100644 textures/castle_tapestry_inv.png create mode 100644 textures/castle_tapestry_long_inv.png create mode 100644 textures/castle_tapestry_very_long_inv.png diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd2946a --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..456d091 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Minetest Mods Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..de76871 --- /dev/null +++ b/README.txt @@ -0,0 +1,10 @@ +=-=-=-=-=-=-=-=-=-= + +Tapestries Mod +by: Philipbenr And DanDuncombe + +=-=-=-=-=-=-=-=-=-= + +Licence: MIT + +see: LICENSE diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..fe7e3d9 --- /dev/null +++ b/depends.txt @@ -0,0 +1,3 @@ +default +unifieddyes +intllib? diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..29d4bd2 --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +This is a mod for creating medieval tapestries, as found in castles diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..03e318d --- /dev/null +++ b/init.lua @@ -0,0 +1,205 @@ +-- internationalization boilerplate +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") + +local tapestry = {} + +minetest.register_alias("castle:tapestry_top", "castle_tapestries:tapestry_top") +minetest.register_alias("castle:tapestry", "castle_tapestries:tapestry") +minetest.register_alias("castle:tapestry_long", "castle_tapestries:tapestry_long") +minetest.register_alias("castle:tapestry_very_long", "castle_tapestries:tapestry_very_long") + +minetest.register_node("castle_tapestries:tapestry_top", { + drawtype = "nodebox", + description = S("Tapestry Top"), + tiles = {"default_wood.png"}, + sunlight_propagates = true, + groups = {flammable=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_defaults(), + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.6,-0.5,0.375,0.6,-0.375,0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.6,-0.5,0.375,0.6,-0.375,0.5}, + }, + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry_top', + recipe = {'default:stick'}, +}) + +tapestry.colours = { + "white", + "grey", + "black", + "red", + "yellow", + "green", + "cyan", + "blue", + "magenta", + "orange", + "violet", + "dark_grey", + "dark_green", + "pink", + "brown", +} + +-- Regular-length tapestry + +minetest.register_node("castle_tapestries:tapestry", { + drawtype = "mesh", + mesh = "castle_tapestry.obj", + description = S("Tapestry"), + tiles = {"castle_tapestry.png"}, + inventory_image = "castle_tapestry_inv.png", + groups = {oddly_breakable_by_hand=3,flammable=3, ud_param2_colorable = 1}, + sounds = default.node_sound_defaults(), + paramtype = "light", + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + selection_box = { + type = "wallmounted", + wall_side = {-0.5,-0.5,0.4375,0.5,1.5,0.5}, + }, + after_place_node = unifieddyes.fix_rotation_nsew, + after_dig_node = unifieddyes.after_dig_node, + on_rotate = unifieddyes.fix_after_screwdriver_nsew +}) + +-- Crafting from wool and a stick + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry', + recipe = {'wool:white', 'default:stick'}, +}) + +-- Long tapestry + +minetest.register_node("castle_tapestries:tapestry_long", { + drawtype = "mesh", + mesh = "castle_tapestry_long.obj", + description = S("Tapestry (Long)"), + tiles = {"castle_tapestry.png"}, + inventory_image = "castle_tapestry_long_inv.png", + groups = {oddly_breakable_by_hand=3,flammable=3, ud_param2_colorable = 1}, + sounds = default.node_sound_defaults(), + paramtype = "light", + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + selection_box = { + type = "wallmounted", + wall_side = {-0.5,-0.5,0.4375,0.5,2.5,0.5}, + }, + after_place_node = unifieddyes.fix_rotation_nsew, + after_dig_node = unifieddyes.after_dig_node, + on_rotate = unifieddyes.fix_after_screwdriver_nsew +}) + +-- Crafting from normal tapestry and wool + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry_long', + recipe = {'wool:white', 'castle_tapestries:tapestry'}, +}) + +-- Very long tapestry + +minetest.register_node("castle_tapestries:tapestry_very_long", { + drawtype = "mesh", + mesh = "castle_tapestry_very_long.obj", + description = S("Tapestry (Very Long)"), + tiles = {"castle_tapestry.png"}, + inventory_image = "castle_tapestry_very_long_inv.png", + groups = {oddly_breakable_by_hand=3,flammable=3, ud_param2_colorable = 1}, + sounds = default.node_sound_defaults(), + paramtype = "light", + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + selection_box = { + type = "wallmounted", + wall_side = {-0.5,-0.5,0.4375,0.5,3.5,0.5}, + }, + after_place_node = unifieddyes.fix_rotation_nsew, + after_dig_node = unifieddyes.after_dig_node, + on_rotate = unifieddyes.fix_after_screwdriver_nsew +}) + +-- Crafting from long tapestry and wool + +minetest.register_craft({ + type = "shapeless", + output = 'castle_tapestries:tapestry_very_long', + recipe = {'wool:white', 'castle_tapestries:tapestry_long'}, +}) + +-- Convert static tapestries to param2 color + +local old_static_tapestries = {} + +for _, color in ipairs(tapestry.colours) do + table.insert(old_static_tapestries, "castle:tapestry_"..color) + table.insert(old_static_tapestries, "castle:long_tapestry_"..color) + table.insert(old_static_tapestries, "castle:very_long_tapestry_"..color) +end + +minetest.register_lbm({ + name = "castle_tapestries:convert_tapestries", + label = "Convert tapestries to use param2 color", + run_at_every_load = false, + nodenames = old_static_tapestries, + action = function(pos, node) + local oldname = node.name + local color = string.sub(oldname, string.find(oldname, "_", -12) + 1) + + if color == "red" then + color = "medium_red" + elseif color == "cyan" then + color = "medium_cyan" + elseif color == "blue" then + color = "medium_blue" + elseif color == "magenta" then + color = "medium_magenta" + end + + local paletteidx, _ = unifieddyes.getpaletteidx("unifieddyes:"..color, "wallmounted") + + local old_fdir = math.floor(node.param2 % 32) + local new_fdir = 3 + + if old_fdir == 0 then + new_fdir = 3 + elseif old_fdir == 1 then + new_fdir = 4 + elseif old_fdir == 2 then + new_fdir = 2 + elseif old_fdir == 3 then + new_fdir = 5 + end + + local param2 = paletteidx + new_fdir + local newname = "castle_tapestries:tapestry" + if string.find(oldname, ":long") then + newname = "castle_tapestries:tapestry_long" + elseif string.find(oldname, ":very_long") then + newname = "castle_tapestries:tapestry_very_long" + end + + minetest.set_node(pos, { name = newname, param2 = param2 }) + local meta = minetest.get_meta(pos) + meta:set_string("dye", "unifieddyes:"..color) + end +}) diff --git a/intllib.lua b/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/locale/template.pot b/locale/template.pot new file mode 100644 index 0000000..0a0745a --- /dev/null +++ b/locale/template.pot @@ -0,0 +1,33 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-25 14:32-0700\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua:14 +msgid "Tapestry Top" +msgstr "" + +#: init.lua:64 +msgid "Tapestry" +msgstr "" + +#: init.lua:94 +msgid "Tapestry (Long)" +msgstr "" + +#: init.lua:124 +msgid "Tapestry (Very Long)" +msgstr "" diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..6d86a0d --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name = castle_tapestries diff --git a/models/LICENSE.txt b/models/LICENSE.txt new file mode 100644 index 0000000..7c019e6 --- /dev/null +++ b/models/LICENSE.txt @@ -0,0 +1,10 @@ +License Textures: Stuart Jones - WTFPL + +-castle_crossbow_bolt_inv.png +-castle_crossbow_bolt_uv.png +-castle_crossbow_hit.png + +Licence Models: Stuart Jones - CC-BY-SA 3.0 + +-castle_crossbow_bolt.b3d +-castle_crossbow_bolt.blend \ No newline at end of file diff --git a/textures/castle_tapestry.png b/textures/castle_tapestry.png new file mode 100644 index 0000000000000000000000000000000000000000..e807340946ffeca3afd87d45d1d6b9ad39eb2749 GIT binary patch literal 323 zcmV-J0lfZ+P)TmqAj zPo9Q1CneVNiZi5X(yMSj$uQF?*fSlpV6{{k?Nu43UxB%#Ye^NW)`dLzJskA5bemoc zlPSIzR|I#Ohxlzz_ZlU2Vw;O$}6ybqgiT@AH VcxvF0&S?Mu002ovPDHLkV1hqhjcWh^ literal 0 HcmV?d00001 diff --git a/textures/castle_tapestry_inv.png b/textures/castle_tapestry_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..99c1b2e4cdf347c5e0c5e80da3dd32a415b09434 GIT binary patch literal 2062 zcmV+p2=VucP)Yjeh!#!hpSOP z8?SlLeJ$+912?R;2_W6EAs`KT$dhO6i(sr!it1R;$6pp>tm~L3!Yx;(`EW8NfVV?T zO$4>5Z`sA>;2k&J5_Q9cB+tfq+0m1hvAolw4;_DSJ|hOlqj3W5>KJ)+{;eK;O^$OV2syj)%Q$ZOZRXX@XVEIb{}y-c<|D>xs}j z*P>i0ktw{dRR&U_AvuV~;!$=$BG(g<*|sm0%Va09?KJCK4h;R4%72-7(ze1QD%%!R z)~y(slQgixF)OW^;E3ud8km?-+ILE2*OH;vbglcg&)T$V#dVMR)ph}V#Z~7e67!Z^ zIQE8tLZLvda-agGqONcMb+1JeB$5VeF4GmoqhK>R22k2pBiKLokk%L&dB{`t9lB)3 zD`uT`*NmsUA@`dm9`_sG(9?6xrJK3)on7+ zl}ZilNn}nbjLqmsl(yY6Fi|>dPGX=lbqt)q2ZEpy)uL1sWzAltQVTLshOv%HF(m_2 z0@$}@+lt_AwPiP@K5byjC#|{eS*zaiF&obLyzhD}JP})U!b9uc(=%h&NXMa(OjPM$ z*hqy$EgI=cbN8kTgk;)MwCi3&YVDvg%GjRT8NYzBOutFj9bKK>PHfQxy}0h?kL6kO zYpJNPXslAo&Dz#ex$6=Cd3>uC27ceDSaw-q?2=jE(X-&1%+L9A?>Otehdtt+MWt2q zMuvv%IpIsa(R-KcvnCQtHth(FHY&~NE6g<1S4ySS9c7zQ&?BUBM2VjB&Y02Bm70?q zm=z=<4h5y2Zc`Up0Wd4*n}}jl6%whaGSOEVc+#ecXRNvGjMqJS7Tj^#CvEtM$Ni%-*4)=q zNt^80VmY3*W6x(C`d82Ex^K>+P2o5_)%sQ}+Y_c1BvY&6OZwgsT`_7}k0_UV+KO3Y zm8j5>t3;=qSG3Cj!IBx&hHmP*AdxomEOB7V?+6z3-F3BX2FT^kHpzy>fqD0BxoFL8 zpZ5c`MS}+Fplwa~W2rUgEt?+m12-%>6a~RpV%EIOUgLT}`0u36`9L&sV7bvkwZ1dW z$#nxmq-w#E%GlGsX0DFyn&7A*ixM5D%r~uCB|2xxj*Hg(vlk77hKEF}3>?@~HhRC3 zn(@FT9fuwZq7`TkVthKHYN?cU7zzyKHDmQC?rNE zQbD0Q?tQW*6!#51?}nhZZP6)n?E%=0+v_pS^z=m|t7<{5HgLv|eA78^8(L6^3j2me zanK%saV+oGNk@uYaMr#D9<^b^?9qryW#C3PmKOxvGM#lZVE+_WVXbo88d%DiY~BscN6kxzNro0e2+W5KkO)2SHv zHL35}lnTzsb?xEMf)(HN1;IqmjwQ3!%qpf2uIT`*n0UfOB1k1}cuL=@b8@NOCP&gm zU$pKMQv;X^>O>*;kkY2hx;6!sTqad{U?@10__#NnJDwP}$Uqb{N8SAQbidv^Erdlnn{Ua0HI``Yz^vrdct$zJ2#rOcx1&RC9x zxqP{)|G~t^4xf0b|HYO8P*p>vpmN26f6!?<#7q!xhZr2_xa6LNUU^s5GJr7oqpyGO zXa3|*7mJa3Z4b#I<)Pa?){`{PHz>qyzVK#{ldTOU5u^!05SNge}CAk z)?E-AP@!SSjN8>mKG$!i;)yhVz<`}NsnzAITIZ(&faOTX zh69nfu;ZeCJ2p`@{DYYIv&GAeGHrWQd(6Wh$Coa;=I3=w@BN?s%HIh5O7fz=^HW{% zg?q!V$CvBBeel8kFZ=R``rZi{h*@!}G^pM$^W_ho{Kbd-q2z@3>-FzcGvSB6RxSKh sXoJ!0qyR4LhQK%Ssyvyq{eSC!0XAt=!tySWCIA2c07*qoM6N<$f)t@It^fc4 literal 0 HcmV?d00001 diff --git a/textures/castle_tapestry_long_inv.png b/textures/castle_tapestry_long_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..ce04c40dca9f8b4728820868d43c980c9d2299e9 GIT binary patch literal 1822 zcmV+(2jTdMP)!N$bybh|t5?$>V~s_L?^#hM2y&a!k>`quCK?zyMVjr_;a zwrF?dT;^}_D=$PRO0WImQt$k^7h5lV@fw8aFO|#L zGx;?COtAnVB46FBhj+*CPK?8y`JaZ@f15t@i|0Ra0nSCQ=$H=^XNm#15t+WaT6kZ6 zJe!m!kM$p0@UlyPZM-n}L*r7uS$=Dj7oVeXy2g6?j_O;t zZ#k+vH8)?B0{KmhLu>vnHk3#W#4?Avg1$u`4QGl1sG%mar=%)K)zNUT1-ICfNR1up z76tG&cI>#trlyV{5$xGEmMBRzEV<-*ktvw?v!-1Y+a@Mz8g`XTEXo9AvZ73QBL!2b zsskhj#ug>z0BN$pC!VY?`RF4|tzbj>j}4U{E@60yigX5h8xO+PQrgsB}h|8%Qd)4rY~dJ+>Y ziH5OKR`SVW0LmzfO^qFjL~3Gv0bOHdEma>n`A~Q+Dg>a8miztQ!$y_`H4L=mQm;CY zDVgSnGc_4Atc?(vx1wrjPjFOSMGJLTth=h|?;3@*WXMe|>PYOWW6lY&R3>q!vO}qS zmVRVb6J~nmZCmk{R8LPuM{MMyG8Ksj-0kjS6u1GId1*t``vazNPhQ$Ef*oIS66AcqV38{Ul%z|7=?kJXv0ocZt9d|fq&OaOq zrq*27aNUZ&B}4b(_F@3$QSnQeNLQp}s%Ob>sR`MriYRqR$L8L8mUGJvlY7WG51Dm=As&B3*7AyZn`QQjQJ{)Br=9g4Be{vlq7_Y3nbc8t7^vM` zSy&}pbf3(`uC|i0B|RkvJ}YjB(T48S$)ip|-!WGV>u)x55vZG@n$ zo6{=>;4IGCvue|-Ic4LUlfqcTriQlL?JeEVssMm5;R~8_E0#57Vhh?nZR|eVnmU@& zCV4TXc!Jb1UAMSkf~l50+lDx%q+#GBP86d+31y4As#=0bO-bf04X@jvysIIo%Y@L(DsNB;h3$fETW)nxtZOXSSBXzaEjZM2K09^c%y(ap z9?A*GET3tdBN5!QyK=eXKqi)Fbo1cYlXslo%v<^1-Xk#u0^F>y&sY8u zqNatX*1mBy+Q>(!pHJVYKUyGB0RR91 literal 0 HcmV?d00001 diff --git a/textures/castle_tapestry_very_long_inv.png b/textures/castle_tapestry_very_long_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..6fcca22149a5c384f64cd11651776d2324da5a15 GIT binary patch literal 1376 zcmV-m1)utfP)7#b`&JynKM;f8yH!c`>Zk8}@74ES@!IX`=dMk` zkFt*)@?ul5@=fixAT6k#6KMk02SQllV z$Z01*06jH1N1c*Wbze!-sM8u&rvs&6*Ni((tBEX&j7b$GPNqUk!-od6EE}+E%sZ+| zhP5>Iu@3Gt1&JkRJWvr?lhv@TXU~;>5WpJ>$|enq)I1VTiiVUuQ`As% zQlh49THV=!Ab^S?WlJVJ*H^RRoQ%iD)F*=gR_s`IUZfBG1DKE+vtv?SETg62u8xdKF9;wpZNi?GJ;TP;&8xd)+}-&gfR5OjipxsK z8?b5I1-s%fOL1F6-I1v8dS*tMwOy1cBWuZ#r&d|5%>2?eojRW+NMvNjB+K>#DlrrbB- zsZq0XE?V)@Ny}l%@*!J#{(sw>>~yHNZh2l)Daa01BkWc#j1wF%z`D) ztT3HC*b zu4dV`SkpE(Lu}9U3g(ohy84EE!6QA#yvVW>9XMcA(XhuxESj~gY0!v_rpYKZ5n^*1 z>l;y5($d#<&q;mFbiQ!U;e!Y4>evvwtzyj)ha?gW`CRINnXwVkAnQPN~3pwd`^;%m~<$0h4FWv zo6|FWX(_}RQJNC{tlB%9?(~nheXEfq>mB#f%?J6v=^sCMK&%r_{-9RfNz;BhkapL) z(aj6ryJYD4=%+`+Y)-TN)XMiW@qBhBnrj{F6W#3ptMnJ4S}Mh#(qE