jcz@ncsu.UUCP (John A. Toebes, VIII) (03/04/86)
This is the source to AMIGA HACK 1.0.1 reposted a second time due to the number of destroyed versions along the way. It is being posted in net.sources in 13 pieces: part1 contains the include files parts2 through 9 contain the fairly machine independant sources part10 countains those sources and include files particular to the Amiga part11 contains the runtime data files required by Hack part12 contains the Amiga .info files and Icons part13 contains a binary dump of the executable. In order to make it easier to download to the amiga, I suggest that you leave the sources together in the grouped files and break them up when you get them to the Amiga (I make no guarentees on how well it will compile on other machines although it appears to be ok on our Apollo) The format of the source files is simple, at the start of each file is a line of the form #file <fname> where <fname> is the name of the file. The program below will break up a file into its individual components. To use it, CD to the directory that you wish to hold the sources, then execute the program (I call it Explode) redirecting the input to the file to be broken up: ie CD DF1: EXPLODE <sources_part1 When you get all the sources there, recompile them with the CCALL script in part 10 of the sources, then link WITH the LINK_HACK file. I have almost got graphics working suitable to my tastes and will post a differences file when it works. ------CUT HERE -------- CUT HERE -------- CUT HERE ------- #include <stdio.h> main() { char buffer[128]; FILE *fp; fp = NULL; while(gets(buffer) != NULL) { if (!strncmp(buffer,"#file ", 6)) { if (fp != NULL) fclose(fp); if ( (fp = fopen(buffer+6,"w")) == NULL) { printf("Cannot open file '%s'\n", buffer+6); exit(1); } printf("Writing '%s'\n", buffer+6); } else if (fp == NULL) { printf("No file open\n"); exit(2); } else fprintf(fp,"%s\n",buffer); } if (fp != NULL) fclose(fp); } -------------------end of source -------------------- John A. Toebes, VIII 120-H Northington Place Cary NC 27511 (919) 469-4210 Usenet: ...!mcnc!ncsu!jcz ------cut here for unexploded source------- #file config.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #ifndef CONFIG /* make sure the compiler doesnt see the typedefs twice */ #define CONFIG #define VAX /* to get proper struct initialization */ #define BSD /* delete this line on System V */ /* #define STUPID */ /* avoid some complicated expressions if your C compiler chokes on them */ #define HELP "help" #define HACKNAME "hack" #define HACKDIR "HACK_Game:" #define HACKCSET "characters" #define WIZARD "wizard"/* the person allowed to use the -w option */ #define NEWS "news" /* the file containing the latest hack news */ #define FMASK 0660 /* file creation mask */ /* #define register */ #define OPTIONS /* do not delete the 'o' command */ /* #define SHELL /* do not delete the '!' command */ #define TRACK /* do not delete the tracking properties of monsters */ /* size of terminal screen is (ROWNO+2) by COLNO */ #define COLNO 77 #define ROWNO 21 /* * small signed integers (8 bits suffice) * typedef char schar; * will do when you have signed characters; otherwise use * typedef short int schar; */ typedef char schar; /* * small unsigned integers (8 bits suffice - but 7 bits do not) * - these are usually object types; be careful with inequalities! - * typedef unsigned char uchar; * will be satisfactory if you have an "unsigned char" type; otherwise use * typedef unsigned short int uchar; */ typedef unsigned char uchar; /* * small integers in the range 0 - 127, usually coordinates * although they are nonnegative they must not be declared unsigned * since otherwise comparisons with signed quantities are done incorrectly * (thus, in fact, you could make xchar equal to schar) */ typedef char xchar; typedef xchar boolean; /* 0 or 1 */ #define TRUE 1 #define FALSE 0 /* * Declaration of bitfields in various structs; if your C compiler * doesnt handle bitfields well, e.g., if it is unable to initialize * structs containing bitfields, then you might use * #define Bitfield(x,n) xchar x * since the bitfields used never have more than 7 bits. (Most have 1 bit.) */ /* #define Bitfield(x,n) unsigned x:n */ #define Bitfield(x,n) xchar x #endif CONFIG #file date.h char datestring[] = "Sunday Jan 5, 1986"; #file def.edog.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct edog { long hungrytime; /* at this time dog gets hungry */ long eattime; /* dog is eating */ long droptime; /* moment dog dropped object */ unsigned dropdist; /* dist of drpped obj from @ */ unsigned apport; /* amount of training */ long whistletime; /* last time he whistled */ }; #define EDOG(mp) ((struct edog *)(&(mp->mextra[0]))) #file def.eshk.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #define BILLSZ 200 struct bill_x { unsigned bo_id; Bitfield(useup,1); Bitfield(bquan,7); unsigned price; /* price per unit */ }; struct eshk { long int robbed; /* amount stolen by most recent customer */ schar shoproom; /* index in rooms; set by inshop() */ coord shk; /* usual position shopkeeper */ coord shd; /* position shop door */ int billct; struct bill_x bill[BILLSZ]; int visitct; /* nr of visits by most recent customer */ char customer[PL_NSIZ]; /* most recent customer */ char shknam[PL_NSIZ]; }; #file def.func_tab.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct func_tab { char f_char; int (*f_funct)(); }; extern struct func_tab list[]; #file def.gen.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ /* def.gen.h version 1.0.1: added ONCE flag */ struct gen { struct gen *ngen; xchar gx,gy; unsigned gflag; /* 037: trap type; 040: SEEN flag */ /* 0100: ONCE only */ #define TRAPTYPE 037 #define SEEN 040 #define ONCE 0100 }; extern struct gen *fgold, *ftrap; struct gen *g_at(); #define newgen() (struct gen *) alloc(sizeof(struct gen)) #file def.monst.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct monst { struct monst *nmon; struct permonst *data; unsigned m_id; xchar mx,my; xchar mdx,mdy; /* if mdispl then pos where last displayed */ #define MTSZ 4 coord mtrack[MTSZ]; /* monster track */ schar mhp,orig_hp; char mimic; /* undetected mimic - this is its symbol */ Bitfield(mdispl,1); /* mdx,mdy valid */ Bitfield(minvis,1); /* invisible */ Bitfield(cham,1); /* shape-changer */ Bitfield(mhide,1); /* hides beneath objects */ Bitfield(mundetected,1); /* not seen in present hiding place */ Bitfield(mspeed,2); Bitfield(msleep,1); Bitfield(mfroz,1); Bitfield(mconf,1); Bitfield(mflee,1); Bitfield(mcan,1); /* has been cancelled */ Bitfield(mtame,1); /* implies peaceful */ Bitfield(mpeaceful,1); /* does not attack unprovoked */ Bitfield(isshk,1); /* is shopkeeper */ Bitfield(isgd,1); /* is guard */ Bitfield(mcansee,1); /* cansee 1, temp.blinded 0, blind 0 */ Bitfield(mblinded,7); /* cansee 0, temp.blinded n, blind 0 */ Bitfield(mtrapped,1); /* trapped in a pit or bear trap */ Bitfield(mnamelth,6); /* length of name (following mxlth) */ #ifndef NOWORM Bitfield(wormno,5); /* at most 31 worms on any level */ #endif NOWORM unsigned mtrapseen; /* bitmap of traps we've been trapped in */ long mlstmv; /* prevent two moves at once */ struct obj *minvent; long mgold; unsigned mxlth; /* length of following data */ /* in order to prevent alignment problems mextra should be (or follow) a long int */ long mextra[1]; /* monster dependent info */ }; #define newmonst(xl) (struct monst *) alloc((unsigned)(xl) + sizeof(struct monst)) extern struct monst *fmon; #ifndef MKLEV extern struct monst *fallen_down; #endif MKLEV struct monst *m_at(); /* these are in mspeed */ #define MSLOW 1 /* slow monster */ #define MFAST 2 /* speeded monster */ #define NAME(mtmp) (((char *) mtmp->mextra) + mtmp->mxlth) #file def.obj.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct obj { struct obj *nobj; unsigned o_id; unsigned o_cnt_id; /* id of container object is in */ xchar ox,oy; xchar odx,ody; uchar otyp; uchar owt; unsigned quan; /* small in general but large in case of gold */ schar spe; char olet; Bitfield(oinvis,1); Bitfield(odispl,1); Bitfield(known,1); /* exact nature known */ Bitfield(dknown,1); /* color or text known */ Bitfield(cursed,1); Bitfield(unpaid,1); /* on some bill */ Bitfield(rustfree,1); Bitfield(onamelth,6); long age; /* creation date */ long owornmask; #define W_ARM 01L #define W_ARM2 02L #define W_ARMH 04L #define W_ARMS 010L #define W_ARMG 020L #define W_ARMOR (W_ARM | W_ARM2 | W_ARMH | W_ARMS | W_ARMG) #define W_RINGL 010000L /* make W_RINGL = RING_LEFT (see uprop) */ #define W_RINGR 020000L #define W_RING (W_RINGL | W_RINGR) #define W_WEP 01000L #define W_BALL 02000L #define W_CHAIN 04000L long oextra[1]; }; extern struct obj *fobj; #define newobj(xl) (struct obj *) alloc((unsigned)(xl) + sizeof(struct obj)) #define ONAME(otmp) ((char *) otmp->oextra) #file def.objclass.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ /* definition of a class of objects */ struct objclass { char *oc_name; /* actual name */ char *oc_descr; /* description when name unknown */ char *oc_uname; /* called by user */ Bitfield(oc_name_known,1); Bitfield(oc_merge,1); /* merge otherwise equal objects */ char oc_olet; schar oc_prob; /* probability for mkobj() */ schar oc_delay; /* delay when using such an object */ uchar oc_weight; schar oc_oc1, oc_oc2; int oc_oi; #define nutrition oc_oi /* for foods */ #define a_ac oc_oc1 /* for armors */ #define a_can oc_oc2 /* for armors */ #define bits oc_oc1 /* for wands and rings */ /* wands */ #define NODIR 1 #define IMMEDIATE 2 #define RAY 4 /* rings */ #define SPEC 1 /* +n is meaningful */ #define wldam oc_oc1 /* for weapons */ #define wsdam oc_oc2 /* for weapons */ #define g_val oc_oi /* for gems: value on exit */ }; extern struct objclass objects[]; /* definitions of all object-symbols */ #define ILLOBJ_SYM '\\' #define AMULET_SYM '"' #define FOOD_SYM '%' #define WEAPON_SYM ')' #define TOOL_SYM '(' #define BALL_SYM '0' #define CHAIN_SYM '_' #define ROCK_SYM '`' #define ARMOR_SYM '[' #define POTION_SYM '!' #define SCROLL_SYM '?' #define WAND_SYM '/' #define RING_SYM '=' #define GEM_SYM '*' /* Other places with explicit knowledge of object symbols: * ....shk.c: char shtypes[] = "=/)%?!["; * mklev.c: "=/)%?![<>" * hack.mkobj.c: char mkobjstr[] = "))[[!!!!????%%%%/=**"; * hack.apply.c: otmp = getobj("0#%", "put in"); * hack.eat.c: otmp = getobj("%", "eat"); * hack.invent.c: if(index("!%?[)=*(0/\"", sym)){ * hack.invent.c: || index("%?!*",otmp->olet))){ */ #file def.objects.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ /* objects have letter " % ) ( 0 _ [ ! ? / = * */ #include "def.objclass.h" #define NULL (char *)0 struct objclass objects[] = { { "strange object", NULL, NULL, 1, 0, ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 }, { "amulet of Yendor", NULL, NULL, 1, 0, AMULET_SYM, 100, 0, 2, 0, 0, 0 }, #define FOOD(name,prob,delay,weight,nutrition) { name, NULL, NULL, 1, 1,\ FOOD_SYM, prob, delay, weight, 0, 0, nutrition } /* dog eats foods 0-4 but prefers 1 above 0,2,3,4 */ /* food 4 can be read */ /* food 5 improves your vision */ /* food 6 makes you stronger (like Popeye) */ /* foods CORPSE=15 up to CORPSE+52 are cadavers */ FOOD("food ration", 50, 5, 4, 800), FOOD("tripe ration", 20, 1, 2, 200), FOOD("pancake", 3, 1, 1, 200), FOOD("dead lizard", 3, 0, 1, 40), FOOD("fortune cookie", 7, 0, 1, 40), FOOD("carrot", 2, 0, 1, 50), FOOD("tin", 7, 0, 1, 0), FOOD("orange", 1, 0, 1, 80), FOOD("apple", 1, 0, 1, 50), FOOD("pear", 1, 0, 1, 50), FOOD("melon", 1, 0, 1, 100), FOOD("banana", 1, 0, 1, 80), FOOD("candy bar", 1, 0, 1, 100), FOOD("egg", 1, 0, 1, 80), FOOD("clove of garlic", 1, 0, 1, 40), FOOD("dead human", 0, 4, 40, 400), FOOD("dead giant ant", 0, 1, 3, 30), FOOD("dead giant bat", 0, 1, 3, 30), FOOD("dead centaur", 0, 5, 50, 500), FOOD("dead dragon", 0, 15, 150, 1500), FOOD("dead floating eye", 0, 1, 1, 10), FOOD("dead freezing sphere", 0, 1, 1, 10), FOOD("dead gnome", 0, 1, 10, 100), FOOD("dead hobgoblin", 0, 2, 20, 200), FOOD("dead stalker", 0, 4, 40, 400), FOOD("dead jackal", 0, 1, 10, 100), FOOD("dead kobold", 0, 1, 10, 100), FOOD("dead leprechaun", 0, 4, 40, 400), FOOD("dead mimic", 0, 4, 40, 400), FOOD("dead nymph", 0, 4, 40, 400), FOOD("dead orc", 0, 2, 20, 200), FOOD("dead purple worm", 0, 7, 70, 700), FOOD("dead quasit", 0, 2, 20, 200), FOOD("dead rust monster", 0, 5, 50, 500), FOOD("dead snake", 0, 1, 10, 100), FOOD("dead troll", 0, 4, 40, 400), FOOD("dead umber hulk", 0, 5, 50, 500), FOOD("dead vampire", 0, 4, 40, 400), FOOD("dead wraith", 0, 1, 1, 10), FOOD("dead xorn", 0, 7, 70, 700), FOOD("dead yeti", 0, 7, 70, 700), FOOD("dead zombie", 0, 1, 3, 30), FOOD("dead acid blob", 0, 1, 3, 30), FOOD("dead giant beetle", 0, 1, 1, 10), FOOD("dead cockatrice", 0, 1, 3, 30), FOOD("dead dog", 0, 2, 20, 200), FOOD("dead ettin", 0, 1, 3, 30), FOOD("dead fog cloud", 0, 1, 1, 10), FOOD("dead gelatinous cube", 0, 1, 10, 100), FOOD("dead homunculus", 0, 2, 20, 200), FOOD("dead imp", 0, 1, 1, 10), FOOD("dead jaguar", 0, 3, 30, 300), FOOD("dead killer bee", 0, 1, 1, 10), FOOD("dead leocrotta", 0, 5, 50, 500), FOOD("dead minotaur", 0, 7, 70, 700), FOOD("dead nurse", 0, 4, 40, 400), FOOD("dead owlbear", 0, 7, 70, 700), FOOD("dead piercer", 0, 2, 20, 200), FOOD("dead quivering blob", 0, 1, 10, 100), FOOD("dead giant rat", 0, 1, 3, 30), FOOD("dead giant scorpion", 0, 1, 10, 100), FOOD("dead tengu", 0, 3, 30, 300), FOOD("dead unicorn", 0, 3, 30, 300), FOOD("dead violet fungi", 0, 1, 10, 100), FOOD("dead long worm", 0, 5, 50, 500), /* %% wt of long worm should be proportional to its length */ FOOD("dead xan", 0, 3, 30, 300), FOOD("dead yellow light", 0, 1, 1, 10), FOOD("dead zruty", 0, 6, 60, 600), /* weapons ... - ROCK come several at a time */ /* weapons ... - (ROCK-1) are shot using idem+(BOW-ARROW) */ /* weapons AXE, SWORD, THSWORD are good for worm-cutting */ /* weapons AXE, DAGGER, CRYSKNIFE are good for tin-opening */ #define WEAPON(name,prob,wt,ldam,sdam) { name, NULL, NULL, 1, 0 /*%%*/,\ WEAPON_SYM, prob, 0, wt, ldam, sdam, 0 } WEAPON("arrow", 7, 0, 6, 6), WEAPON("sling bullet", 7, 0, 4, 6), WEAPON("crossbow bolt", 7, 0, 4, 6), WEAPON("dart", 7, 0, 3, 2), WEAPON("rock", 6, 1, 3, 3), WEAPON("boomerang", 2, 3, 9, 9), WEAPON("mace", 9, 3, 6, 7), WEAPON("axe", 6, 3, 6, 4), WEAPON("flail", 6, 3, 6, 5), WEAPON("long sword", 8, 3, 8, 12), WEAPON("two handed sword", 6, 4, 10, 6), WEAPON("dagger", 6, 3, 4, 3), WEAPON("worm tooth", 0, 4, 2, 2), WEAPON("crysknife", 0, 3, 12, 12), WEAPON("spear", 6, 3, 6, 8), WEAPON("bow", 6, 3, 4, 6), WEAPON("sling", 5, 3, 6, 6), WEAPON("crossbow", 6, 3, 4, 6), { "whistle", "whistle", NULL, 0, 0, TOOL_SYM, 90, 0, 2, 0, 0, 0 }, { "magic whistle", "whistle", NULL, 0, 0, TOOL_SYM, 10, 0, 2, 0, 0, 0 }, { "expensive camera", NULL, NULL, 1, 1, TOOL_SYM, 0, 0, 3, 0, 0, 0 }, { "ice box", "large box", NULL, 0, 0, TOOL_SYM, 0, 0, 40, 0, 0, 0 }, { "heavy iron ball", NULL, NULL, 1, 0, BALL_SYM, 100, 0, 20, 0, 0, 0 }, { "iron chain", NULL, NULL, 1, 0, CHAIN_SYM, 100, 0, 20, 0, 0, 0 }, { "enormous rock", NULL, NULL, 1, 0, ROCK_SYM, 100, 0, 200 /* > MAX_CARR_CAP */, 0, 0, 0 }, #define ARMOR(name,prob,delay,ac,can) { name, NULL, NULL, 1, 0,\ ARMOR_SYM, prob, delay, 8, ac, can, 0 } ARMOR("helmet", 3, 1, 9, 0), ARMOR("plate mail", 5, 5, 3, 2), ARMOR("splint mail", 8, 5, 4, 1), ARMOR("banded mail", 10, 5, 4, 0), ARMOR("chain mail", 10, 5, 5, 1), ARMOR("scale mail", 10, 5, 6, 0), ARMOR("ring mail", 15, 5, 7, 0), /* the armors below do not rust */ ARMOR("studded leather armor", 13, 3, 7, 1), ARMOR("leather armor", 17, 3, 8, 0), ARMOR("elven cloak", 5, 0, 9, 3), ARMOR("shield", 3, 0, 9, 0), ARMOR("pair of gloves", 1, 1, 9, 0), #define POTION(name,color) { name, color, NULL, 0, 1,\ POTION_SYM, 0, 0, 2, 0, 0, 0 } POTION("restore strength", "orange"), POTION("booze", "bubbly"), POTION("invisibility", "glowing"), POTION("fruit juice", "smoky"), POTION("healing", "pink"), POTION("paralysis", "puce"), POTION("monster detection", "purple"), POTION("object detection", "yellow"), POTION("sickness", "white"), POTION("confusion", "swirly"), POTION("gain strength", "purple-red"), POTION("speed", "ruby"), POTION("blindness", "dark green"), POTION("gain level", "emerald"), POTION("extra healing", "sky blue"), POTION("levitation", "brown"), POTION(NULL, "brilliant blue"), POTION(NULL, "clear"), POTION(NULL, "magenta"), POTION(NULL, "ebony"), #define SCROLL(name,text,prob) { name, text, NULL, 0, 1,\ SCROLL_SYM, prob, 0, 3, 0, 0, 0 } SCROLL("enchant armor", "ZELGO MER", 6), SCROLL("destroy armor", "JUYED AWK YACC", 5), SCROLL("confuse monster", "NR 9", 5), SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", 4), SCROLL("blank paper", "READ ME", 3), SCROLL("remove curse", "PRATYAVAYAH", 6), SCROLL("enchant weapon", "DAIYEN FOOELS", 6), SCROLL("damage weapon", "HACKEM MUCHE", 5), SCROLL("create monster", "LEP GEX VEN ZEA", 5), SCROLL("taming", "PRIRUTSENIE", 1), SCROLL("genocide", "ELBIB YLOH",2), SCROLL("light", "VERR YED HORRE", 10), SCROLL("teleportation", "VENZAR BORGAVVE", 5), SCROLL("gold detection", "THARR", 4), SCROLL("food detection", "YUM YUM", 1), SCROLL("identify", "KERNOD WEL", 18), SCROLL("magic mapping", "ELAM EBOW", 5), SCROLL("amnesia", "DUAM XNAHT", 3), SCROLL("fire", "ANDOVA BEGARIN", 5), SCROLL("punishment", "VE FORBRYDERNE", 1), SCROLL(NULL, "VELOX NEB", 0), SCROLL(NULL, "FOOBIE BLETCH", 0), SCROLL(NULL, "TEMOV", 0), SCROLL(NULL, "GARVEN DEH", 0), #define WAND(name,metal,prob,flags) { name, metal, NULL, 0, 0,\ WAND_SYM, prob, 0, 3, flags, 0, 0 } WAND("light", "iridium", 10, NODIR), WAND("secret door detection", "tin", 5, NODIR), WAND("create monster", "platinum", 5, NODIR), WAND("wishing", "glass", 1, NODIR), WAND("striking", "zinc", 9, IMMEDIATE), WAND("slow monster", "balsa", 5, IMMEDIATE), WAND("speed monster", "copper", 5, IMMEDIATE), WAND("undead turning", "silver", 5, IMMEDIATE), WAND("polymorph", "brass", 5, IMMEDIATE), WAND("cancellation", "maple", 5, IMMEDIATE), WAND("teleport monster", "pine", 5, IMMEDIATE), WAND("make invisible", "marble", 9, IMMEDIATE), WAND("digging", "iron", 5, RAY), WAND("magic missile", "aluminium", 10, RAY), WAND("fire", "steel", 5, RAY), WAND("sleep", "curved", 5, RAY), WAND("cold", "short", 5, RAY), WAND("death", "long", 1, RAY), WAND(NULL, "oak", 0, 0), WAND(NULL, "ebony", 0, 0), WAND(NULL, "runed", 0, 0), #define RING(name,stone,spec) { name, stone, NULL, 0, 0,\ RING_SYM, 0, 0, 1, spec, 0, 0 } RING("adornment", "engagement", 0), RING("teleportation", "wooden", 0), RING("regeneration", "black onyx", 0), RING("searching", "topaz", 0), RING("see invisible", "pearl", 0), RING("stealth", "sapphire", 0), RING("levitation", "moonstone", 0), RING("poison resistance", "agate", 0), RING("aggravate monster", "tiger eye", 0), RING("hunger", "shining", 0), RING("fire resistance", "gold", 0), RING("cold resistance", "copper", 0), RING("protection from shape changers", "diamond", 0), RING("conflict", "jade", 0), RING("gain strength", "ruby", SPEC), RING("increase damage", "silver", SPEC), RING("protection", "granite", SPEC), RING("warning", "wire", 0), RING("teleport control", "iron", 0), RING(NULL, "ivory", 0), RING(NULL, "blackened", 0), /* gems ************************************************************/ #define GEM(name,color,prob,gval) { name, color, NULL, 0, 1,\ GEM_SYM, prob, 0, 1, 0, 0, gval } GEM("diamond", "blue", 1, 4000), GEM("ruby", "red", 1, 3500), GEM("sapphire", "blue", 1, 3000), GEM("emerald", "green", 1, 2500), GEM("turquoise", "green", 1, 2000), GEM("aquamarine", "blue", 1, 1500), GEM("tourmaline", "green", 1, 1000), GEM("topaz", "yellow", 1, 900), GEM("opal", "yellow", 1, 800), GEM("garnet", "dark", 1, 700), GEM("amethyst", "violet", 2, 650), GEM("agate", "green", 2, 600), GEM("onyx", "white", 2, 550), GEM("jasper", "yellowish brown", 2, 500), GEM("jade", "green", 2, 450), GEM("worthless piece of blue glass", "blue", 20, 0), GEM("worthless piece of red glass", "red", 20, 0), GEM("worthless piece of yellow glass", "yellow", 20, 0), GEM("worthless piece of green glass", "green", 20, 0), { NULL, NULL, NULL, 0, 0, ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 } }; char obj_symbols[] = { ILLOBJ_SYM, AMULET_SYM, FOOD_SYM, WEAPON_SYM, TOOL_SYM, BALL_SYM, CHAIN_SYM, ROCK_SYM, ARMOR_SYM, POTION_SYM, SCROLL_SYM, WAND_SYM, RING_SYM, GEM_SYM, 0 }; int bases[sizeof(obj_symbols)]; #file def.permonst.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ struct permonst { char *mname,mlet; schar mlevel,mmove,ac,damn,damd; unsigned pxlth; }; #file def.trap.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ /* def.trap.h version 1.0.1 - added ONCE flag */ /* various kinds of traps */ #define BEAR_TRAP 0 #define ARROW_TRAP 1 #define DART_TRAP 2 #define TRAPDOOR 3 #define TELEP_TRAP 4 #define PIT 5 #define SLP_GAS_TRAP 6 #define PIERC 7 #define MIMIC 8 /* used only in mklev.c */ /* before adding more trap types, check mfndpos ! */ /* #define SEEN 040 - trap which has been seen */ /* #define ONCE 0100 - once only trap */ #file def.wseg.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #ifndef NOWORM /* worm structure */ struct wseg { struct wseg *nseg; xchar wx,wy; Bitfield(wdispl,1); }; #define newseg() (struct wseg *) alloc(sizeof(struct wseg)) #endif NOWORM #file hack.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.h version 1.0.1 - added some flags for HACKOPTIONS */ #include "mklev.h" #include "hack.onames.h" /* #define GRAPHICS 1 */ #define MUP 1 #define MDOWN 2 #define ON 1 #define OFF 0 extern struct obj *invent, *uwep, *uarm, *uarm2, *uarmh, *uarms, *uarmg, *uleft, *uright, *fcobj; extern struct obj *uchain; /* defined iff PUNISHED */ extern struct obj *uball; /* defined if PUNISHED */ struct obj *o_at(), *getobj(), *sobj_at(); struct flag { unsigned ident; /* social security number for each monster */ Bitfield(topl,2); /* a top line (message) has been printed */ /* 0: top line empty; 2: no --More-- reqd. */ Bitfield(cbreak,1); /* in cbreak mode, rogue format */ Bitfield(oneline,1); /* give inventories 1 line at a time */ Bitfield(time,1); /* display elapsed 'time' */ Bitfield(nonews,1); /* suppress news printing */ Bitfield(notombstone,1); unsigned end_top, end_around; /* describe desired score list */ Bitfield(end_own,1); /* idem (list all own scores) */ Bitfield(no_rest_on_space,1); /* spaces are ignored */ Bitfield(move,1); Bitfield(mv,1); Bitfield(run,3); /* 0: h (etc), 1: H (etc), 2: fh (etc) */ /* 3: FH, 4: ff+, 5: ff-, 6: FF+, 7: FF- */ Bitfield(nopick,1); /* do not pickup objects */ Bitfield(echo,1); /* 1 to echo characters */ Bitfield(botl,1); /* partially redo status line */ Bitfield(botlx,1); /* print an entirely new bottom line */ Bitfield(nscrinh,1); /* inhibit nscr() in pline(); */ }; extern struct flag flags; struct prop { #define TIMEOUT 007777 /* mask */ #define LEFT_RING W_RINGL /* 010000L */ #define RIGHT_RING W_RINGR /* 020000L */ #define INTRINSIC 040000L #define LEFT_SIDE LEFT_RING #define RIGHT_SIDE RIGHT_RING #define BOTH_SIDES (LEFT_SIDE | RIGHT_SIDE) long p_flgs; int (*p_tofn)(); /* called after timeout */ }; struct you { xchar ux, uy; schar dx, dy; /* direction of fast move */ #ifdef QUEST schar di; /* direction of FF */ xchar ux0, uy0; /* initial position FF */ #endif QUEST xchar udisx, udisy; /* last display pos */ char usym; /* usually '@' */ schar uluck; int last_str_turn:3; /* 0: none, 1: half turn, 2: full turn */ /* +: turn right, -: turn left */ Bitfield(udispl,1); /* @ on display */ Bitfield(ulevel,5); #ifdef QUEST Bitfield(uhorizon,7); #endif QUEST Bitfield(utrap,3); /* trap timeout */ Bitfield(utraptype,1); /* defined if utrap nonzero */ #define TT_BEARTRAP 0 #define TT_PIT 1 Bitfield(uinshop,1); /* perhaps these #define's should also be generated by makedefs */ #define TELEPAT LAST_RING /* not a ring */ #define Telepat u.uprops[TELEPAT].p_flgs #define FAST (LAST_RING+1) /* not a ring */ #define Fast u.uprops[FAST].p_flgs #define CONFUSION (LAST_RING+2) /* not a ring */ #define Confusion u.uprops[CONFUSION].p_flgs #define INVIS (LAST_RING+3) /* not a ring */ #define Invis u.uprops[INVIS].p_flgs #define GLIB (LAST_RING+4) /* not a ring */ #define Glib u.uprops[GLIB].p_flgs #define PUNISHED (LAST_RING+5) /* not a ring */ #define Punished u.uprops[PUNISHED].p_flgs #define SICK (LAST_RING+6) /* not a ring */ #define Sick u.uprops[SICK].p_flgs #define BLIND (LAST_RING+7) /* not a ring */ #define Blind u.uprops[BLIND].p_flgs #define WOUNDED_LEGS (LAST_RING+8) /* not a ring */ #define Wounded_legs u.uprops[WOUNDED_LEGS].p_flgs #define PROP(x) (x-RIN_ADORNMENT) /* convert ring to index in uprops */ Bitfield(umconf,1); char *usick_cause; struct prop uprops[LAST_RING+9]; Bitfield(uswallow,1); /* set if swallowed by a monster */ Bitfield(uswldtim,4); /* time you have been swallowed */ Bitfield(uhs,3); /* hunger state - see hack.eat.c */ schar ustr,ustrmax; schar udaminc; schar uac; int uhp,uhpmax; long int ugold,ugold0,uexp,urexp; int uhunger; /* refd only in eat.c and shk.c */ int uinvault; struct monst *ustuck; int nr_killed[CMNUM+2]; /* used for experience bookkeeping */ }; extern struct you u; extern char *traps[]; extern char *plur(), *monnam(), *Monnam(), *amonnam(), *Amonnam(), *doname(), *aobjnam(); extern char readchar(); extern char vowels[]; extern xchar curx,cury; /* cursor location on screen */ extern coord bhitpos; /* place where thrown weapon falls to the ground */ extern xchar seehx,seelx,seehy,seely; /* where to see*/ extern char *save_cm,*killer; extern xchar dlevel, maxdlevel; /* dungeon level */ extern long moves; extern int multi; extern char lock[]; #define DIST(x1,y1,x2,y2) (((x1)-(x2))*((x1)-(x2)) + ((y1)-(y2))*((y1)-(y2))) #define PL_CSIZ 20 /* sizeof pl_character */ #define MAX_CARR_CAP 120 /* so that boulders can be heavier */ #define FAR (COLNO+2) /* position outside screen */ #file hack.mfndpos.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #define ALLOW_TRAPS 0777 #define ALLOW_U 01000 #define ALLOW_M 02000 #define ALLOW_TM 04000 #define ALLOW_ALL (ALLOW_U | ALLOW_M | ALLOW_TM | ALLOW_TRAPS) #define ALLOW_SSM 010000 #define ALLOW_ROCK 020000 #define NOTONL 040000 #define NOGARLIC 0100000 #file hack.onames.h #define STRANGE_OBJECT 0 #define AMULET_OF_YENDOR 1 #define FOOD_RATION 2 #define TRIPE_RATION 3 #define PANCAKE 4 #define DEAD_LIZARD 5 #define FORTUNE_COOKIE 6 #define CARROT 7 #define TIN 8 #define ORANGE 9 #define APPLE 10 #define PEAR 11 #define MELON 12 #define BANANA 13 #define CANDY_BAR 14 #define EGG 15 #define CLOVE_OF_GARLIC 16 #define DEAD_HUMAN 17 #define DEAD_GIANT_ANT 18 #define DEAD_GIANT_BAT 19 #define DEAD_CENTAUR 20 #define DEAD_DRAGON 21 #define DEAD_FLOATING_EYE 22 #define DEAD_FREEZING_SPHERE 23 #define DEAD_GNOME 24 #define DEAD_HOBGOBLIN 25 #define DEAD_STALKER 26 #define DEAD_JACKAL 27 #define DEAD_KOBOLD 28 #define DEAD_LEPRECHAUN 29 #define DEAD_MIMIC 30 #define DEAD_NYMPH 31 #define DEAD_ORC 32 #define DEAD_PURPLE_WORM 33 #define DEAD_QUASIT 34 #define DEAD_RUST_MONSTER 35 #define DEAD_SNAKE 36 #define DEAD_TROLL 37 #define DEAD_UMBER_HULK 38 #define DEAD_VAMPIRE 39 #define DEAD_WRAITH 40 #define DEAD_XORN 41 #define DEAD_YETI 42 #define DEAD_ZOMBIE 43 #define DEAD_ACID_BLOB 44 #define DEAD_GIANT_BEETLE 45 #define DEAD_COCKATRICE 46 #define DEAD_DOG 47 #define DEAD_ETTIN 48 #define DEAD_FOG_CLOUD 49 #define DEAD_GELATINOUS_CUBE 50 #define DEAD_HOMUNCULUS 51 #define DEAD_IMP 52 #define DEAD_JAGUAR 53 #define DEAD_KILLER_BEE 54 #define DEAD_LEOCROTTA 55 #define DEAD_MINOTAUR 56 #define DEAD_NURSE 57 #define DEAD_OWLBEAR 58 #define DEAD_PIERCER 59 #define DEAD_QUIVERING_BLOB 60 #define DEAD_GIANT_RAT 61 #define DEAD_GIANT_SCORPION 62 #define DEAD_TENGU 63 #define DEAD_UNICORN 64 #define DEAD_VIOLET_FUNGI 65 #define DEAD_LONG_WORM 66 #define DEAD_XAN 67 #define DEAD_YELLOW_LIGHT 68 #define DEAD_ZRUTY 69 #define ARROW 70 #define SLING_BULLET 71 #define CROSSBOW_BOLT 72 #define DART 73 #define ROCK 74 #define BOOMERANG 75 #define MACE 76 #define AXE 77 #define FLAIL 78 #define LONG_SWORD 79 #define TWO_HANDED_SWORD 80 #define DAGGER 81 #define WORM_TOOTH 82 #define CRYSKNIFE 83 #define SPEAR 84 #define BOW 85 #define SLING 86 #define CROSSBOW 87 #define WHISTLE 88 #define MAGIC_WHISTLE 89 #define EXPENSIVE_CAMERA 90 #define ICE_BOX 91 #define HEAVY_IRON_BALL 92 #define IRON_CHAIN 93 #define ENORMOUS_ROCK 94 #define HELMET 95 #define PLATE_MAIL 96 #define SPLINT_MAIL 97 #define BANDED_MAIL 98 #define CHAIN_MAIL 99 #define SCALE_MAIL 100 #define RING_MAIL 101 #define STUDDED_LEATHER_ARMOR 102 #define LEATHER_ARMOR 103 #define ELVEN_CLOAK 104 #define SHIELD 105 #define PAIR_OF_GLOVES 106 #define POT_RESTORE_STRENGTH 107 #define POT_BOOZE 108 #define POT_INVISIBILITY 109 #define POT_FRUIT_JUICE 110 #define POT_HEALING 111 #define POT_PARALYSIS 112 #define POT_MONSTER_DETECTION 113 #define POT_OBJECT_DETECTION 114 #define POT_SICKNESS 115 #define POT_CONFUSION 116 #define POT_GAIN_STRENGTH 117 #define POT_SPEED 118 #define POT_BLINDNESS 119 #define POT_GAIN_LEVEL 120 #define POT_EXTRA_HEALING 121 #define POT_LEVITATION 122 #define SCR_ENCHANT_ARMOR 127 #define SCR_DESTROY_ARMOR 128 #define SCR_CONFUSE_MONSTER 129 #define SCR_SCARE_MONSTER 130 #define SCR_BLANK_PAPER 131 #define SCR_REMOVE_CURSE 132 #define SCR_ENCHANT_WEAPON 133 #define SCR_DAMAGE_WEAPON 134 #define SCR_CREATE_MONSTER 135 #define SCR_TAMING 136 #define SCR_GENOCIDE 137 #define SCR_LIGHT 138 #define SCR_TELEPORTATION 139 #define SCR_GOLD_DETECTION 140 #define SCR_FOOD_DETECTION 141 #define SCR_IDENTIFY 142 #define SCR_MAGIC_MAPPING 143 #define SCR_AMNESIA 144 #define SCR_FIRE 145 #define SCR_PUNISHMENT 146 #define WAN_LIGHT 151 #define WAN_SECRET_DOOR_DETECTION 152 #define WAN_CREATE_MONSTER 153 #define WAN_WISHING 154 #define WAN_STRIKING 155 #define WAN_SLOW_MONSTER 156 #define WAN_SPEED_MONSTER 157 #define WAN_UNDEAD_TURNING 158 #define WAN_POLYMORPH 159 #define WAN_CANCELLATION 160 #define WAN_TELEPORT_MONSTER 161 #define WAN_MAKE_INVISIBLE 162 #define WAN_DIGGING 163 #define WAN_MAGIC_MISSILE 164 #define WAN_FIRE 165 #define WAN_SLEEP 166 #define WAN_COLD 167 #define WAN_DEATH 168 #define Adornment u.uprops[0].p_flgs #define RIN_ADORNMENT 172 #define Teleportation u.uprops[1].p_flgs #define RIN_TELEPORTATION 173 #define Regeneration u.uprops[2].p_flgs #define RIN_REGENERATION 174 #define Searching u.uprops[3].p_flgs #define RIN_SEARCHING 175 #define See_invisible u.uprops[4].p_flgs #define RIN_SEE_INVISIBLE 176 #define Stealth u.uprops[5].p_flgs #define RIN_STEALTH 177 #define Levitation u.uprops[6].p_flgs #define RIN_LEVITATION 178 #define Poison_resistance u.uprops[7].p_flgs #define RIN_POISON_RESISTANCE 179 #define Aggravate_monster u.uprops[8].p_flgs #define RIN_AGGRAVATE_MONSTER 180 #define Hunger u.uprops[9].p_flgs #define RIN_HUNGER 181 #define Fire_resistance u.uprops[10].p_flgs #define RIN_FIRE_RESISTANCE 182 #define Cold_resistance u.uprops[11].p_flgs #define RIN_COLD_RESISTANCE 183 #define Protection_from_shape_changers u.uprops[12].p_flgs #define RIN_PROT_SHAPE_CHANGERS 184 #define Conflict u.uprops[13].p_flgs #define RIN_CONFLICT 185 #define Gain_strength u.uprops[14].p_flgs #define RIN_GAIN_STRENGTH 186 #define Increase_damage u.uprops[15].p_flgs #define RIN_INCREASE_DAMAGE 187 #define Protection u.uprops[16].p_flgs #define RIN_PROTECTION 188 #define Warning u.uprops[17].p_flgs #define RIN_WARNING 189 #define Teleport_control u.uprops[18].p_flgs #define RIN_TELEPORT_CONTROL 190 #define DIAMOND 193 #define RUBY 194 #define SAPPHIRE 195 #define EMERALD 196 #define TURQUOISE 197 #define AQUAMARINE 198 #define TOURMALINE 199 #define TOPAZ 200 #define OPAL 201 #define GARNET 202 #define AMETHYST 203 #define AGATE 204 #define ONYX 205 #define JASPER 206 #define JADE 207 /* #define WORTHLESS_PIECE_OF_BLUE_GLASS 208 */ /* #define WORTHLESS_PIECE_OF_RED_GLASS 209 */ /* #define WORTHLESS_PIECE_OF_YELLOW_GLASS 210 */ /* #define WORTHLESS_PIECE_OF_GREEN_GLASS 211 */ #define CORPSE DEAD_HUMAN #define LAST_GEM (JADE+1) #define LAST_RING 19 #define NROFOBJECTS 211 #file mklev.h /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "config.h" /* we are not BSD or system V */ /* #ifdef BSD */ /* #include <strings.h> /* declarations for strcat etc. */ /* #else */ /* #include <string.h> /* idem on System V */ /* #define index strchr */ /* #define rindex strrchr */ /* #endif BSD */ #include "def.objclass.h" typedef struct { xchar x,y; } coord; #include "def.monst.h" /* uses coord */ #include "def.gen.h" #include "def.obj.h" extern char ismklev; extern char *sprintf(); #define BUFSZ 256 /* for getlin buffers */ #define PL_NSIZ 32 /* name of player, ghost, shopkeeper */ #define HWALL 1 /* Level location types */ #define VWALL 2 #define SDOOR 3 #define SCORR 4 #define LDOOR 5 #define DOOR 6 /* smallest accessible type */ #define CORR 7 #define ROOM 8 #define STAIRS 9 #ifdef QUEST #define CORR_SYM ':' #else #define CORR_SYM '#' #endif QUEST #define ERRCHAR '{' #define TRAPNUM 9 struct rm { char scrsym; /* unsigned typ:5; */ /* unsigned new:1; */ /* unsigned seen:1;*/ /* unsigned lit:1; */ char typ; char new; char seen; char lit; }; extern struct rm levl[COLNO][ROWNO]; #ifndef QUEST struct mkroom { xchar lx,hx,ly,hy; schar rtype,rlit,doorct,fdoor; }; #define MAXNROFROOMS 15 extern struct mkroom rooms[MAXNROFROOMS+1]; #define DOORMAX 100 extern coord doors[DOORMAX]; #endif QUEST #include "def.permonst.h" extern struct permonst mons[]; #define PM_ACIDBLOB &mons[7] #define PM_PIERC &mons[17] #define PM_MIMIC &mons[37] #define PM_CHAM &mons[47] #define PM_DEMON &mons[54] #define PM_MINOTAUR &mons[55] /* last in mons array */ #define PM_SHK &mons[56] /* very last */ #define PM_GHOST &mons[57] /* for ghosts in saved files */ #define PM_LI_DOG &mons[58] /* little dogs to be saved */ #define PM_DOG &mons[59] /* medium sized dog */ #define PM_LA_DOG &mons[60] /* large sized dog */ #define PMONCOUNT 61 /* number of monsters total */ #define CMNUM 55 /* number of common monsters */ extern long *alloc(); extern xchar xdnstair, ydnstair, xupstair, yupstair; /* stairs up and down */ extern xchar dlevel; #ifdef WIZARD extern boolean wizard; #endif WIZARD #define newstring(x) (char *) alloc((unsigned)(x)) #file signal.h #define SIG_IGN 1 #define SIGINT 1 #define SIGHUP 1 #define SIGQUIT 1 /* note that these are just dummy declarations to work around signal not really being on the amiga */
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/04/86)
#file alloc.c #ifdef LINT /* a ridiculous definition, suppressing "possible pointer alignment problem" for (long *) malloc() "enlarg defined but never used" "ftell defined (in <stdio.h>) but never used" from lint */ #include <stdio.h> long * alloc(n) unsigned n; { long dummy = ftell(stderr); if(n) dummy = 0; /* make sure arg is used */ return(&dummy); } #else extern char *malloc(); /* extern char *realloc(); */ long * alloc(lth) register unsigned lth; { register char *ptr; if(!(ptr = malloc(lth))) panic("Cannot get %d bytes", lth); return((long *) ptr); } long * enlarge(ptr,lth) register char *ptr; register unsigned lth; { register char *nptr; nptr = alloc(lth); movmem(ptr,nptr,lth); free(ptr); return((long *) nptr); } #endif LINT #file hack.apply.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.apply.c version 1.0.1 - "The flash awakens %s" (riv05!a3) */ #include "hack.h" extern struct monst *bchit(); extern struct obj *addinv(); extern char pl_character[]; doapply() { register struct obj *obj; obj = getobj("(", "use or apply"); if(!obj) return(0); switch(obj->otyp){ case EXPENSIVE_CAMERA: use_camera(obj); break; case ICE_BOX: use_ice_box(obj); break; case MAGIC_WHISTLE: if(pl_character[0] == 'W' || u.ulevel > 9) { use_magic_whistle(obj); break; } /* fall into next case */ case WHISTLE: use_whistle(obj); break; default: pline("Sorry, I don't know how to use that."); return(0); } return(1); } /* ARGSUSED */ use_camera(obj) /* register */ struct obj *obj; { register struct monst *mtmp; if(!getdir()){ flags.move = multi = 0; return; } if(mtmp = bchit(u.dx, u.dy, COLNO, '!')) { if(mtmp->msleep){ mtmp->msleep = 0; pline("The flash awakens %s.", monnam(mtmp)); } else if(mtmp->data->mlet != 'y') if(mtmp->mcansee || mtmp->mblinded){ register int tmp = dist(mtmp->mx,mtmp->my); register int tmp2; /* if(cansee(mtmp->mx,mtmp->my)) */ pline("%s is blinded by the flash!",Monnam(mtmp)); setmangry(mtmp); if(tmp < 9 && !mtmp->isshk && !rn2(4)) mtmp->mflee = 1; if(tmp < 3) mtmp->mcansee = mtmp->mblinded = 0; else { tmp2 = mtmp->mblinded; tmp2 += rnd(1 + 50/tmp); if(tmp2 > 127) tmp2 = 127; mtmp->mblinded = tmp2; mtmp->mcansee = 0; } } } } struct obj *current_ice_box; /* a local variable of use_ice_box, to be used by its local procedures in/ck_ice_box */ in_ice_box(obj) register struct obj *obj; { if(obj == current_ice_box || (Punished && (obj == uball || obj == uchain))){ pline("You must be kidding."); return(0); } if(obj->owornmask & (W_ARMOR | W_RING)) { pline("You cannot refrigerate something you are wearing."); return(0); } if(obj->owt + current_ice_box->owt > 70) { pline("It won't fit."); return(1); /* be careful! */ } if(obj == uwep) { if(uwep->cursed) { pline("Your weapon is welded to your hand!"); return(0); } setuwep((struct obj *) 0); } current_ice_box->owt += obj->owt; freeinv(obj); obj->o_cnt_id = current_ice_box->o_id; obj->nobj = fcobj; fcobj = obj; obj->age = moves - obj->age; /* actual age */ return(1); } ck_ice_box(obj) register struct obj *obj; { return(obj->o_cnt_id == current_ice_box->o_id); } out_ice_box(obj) register struct obj *obj; { register struct obj *otmp; if(obj == fcobj) fcobj = fcobj->nobj; else { for(otmp = fcobj; otmp->nobj != obj; otmp = otmp->nobj) if(!otmp->nobj) panic("out_ice_box"); otmp->nobj = obj->nobj; } current_ice_box->owt -= obj->owt; obj->age = moves - obj->age; /* simulated point of time */ (void) addinv(obj); } use_ice_box(obj) register struct obj *obj; { register int cnt = 0; register struct obj *otmp; current_ice_box = obj; /* for use by in/out_ice_box */ for(otmp = fcobj; otmp; otmp = otmp->nobj) if(otmp->o_cnt_id == obj->o_id) cnt++; if(!cnt) pline("Your ice-box is empty."); else { pline("Do you want to take something out of the ice-box? [yn] "); if(readchar() == 'y') if(askchain(fcobj, (char *) 0, 0, out_ice_box, ck_ice_box, 0)) return; pline("That was all. Do you wish to put something in? [yn] "); if(readchar() != 'y') return; } /* call getobj: 0: allow cnt; #: allow all types; %: expect food */ otmp = getobj("0#%", "put in"); if(!otmp || !in_ice_box(otmp)) flags.move = multi = 0; } struct monst * bchit(ddx,ddy,range,sym) register int ddx,ddy,range; char sym; { register struct monst *mtmp = (struct monst *) 0; register int bchx = u.ux, bchy = u.uy; if(sym) Tmp_at(-1, sym); /* open call */ while(range--) { bchx += ddx; bchy += ddy; if(mtmp = m_at(bchx,bchy)) break; if(levl[bchx][bchy].typ < CORR) { bchx -= ddx; bchy -= ddy; break; } if(sym) Tmp_at(bchx, bchy); } if(sym) Tmp_at(-1, -1); return(mtmp); } #include "def.edog.h" /* ARGSUSED */ use_whistle(obj) struct obj *obj; { register struct monst *mtmp = fmon; pline("You produce a high whistling sound."); while(mtmp) { if(dist(mtmp->mx,mtmp->my) < u.ulevel*10) { if(mtmp->msleep) mtmp->msleep = 0; if(mtmp->mtame) EDOG(mtmp)->whistletime = moves; } mtmp = mtmp->nmon; } } /* ARGSUSED */ use_magic_whistle(obj) struct obj *obj; { register struct monst *mtmp = fmon; pline("You produce a strange whistling sound."); while(mtmp) { if(mtmp->mtame) mnexto(mtmp); mtmp = mtmp->nmon; } } #file hack.bones.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" extern char plname[PL_NSIZ]; extern struct monst *makemon(); char bones[] = "bones_xx"; /* save bones and possessions of a deceased adventurer */ savebones(){ register int fd; register struct obj *otmp; register struct gen *gtmp; register struct monst *mtmp; if(!rn2(1 + dlevel/2)) return; /* not so many ghosts on low levels */ bones[6] = '0' + (dlevel/10); bones[7] = '0' + (dlevel%10); if((fd = open(bones,0)) >= 0){ (void) close(fd); return; } /* drop everything; the corpse's possessions are usually cursed */ otmp = invent; while(otmp){ otmp->ox = u.ux; otmp->oy = u.uy; otmp->known = 0; otmp->age = 0; /* very long ago */ otmp->owornmask = 0; if(rn2(5)) otmp->cursed = 1; if(!otmp->nobj){ otmp->nobj = fobj; fobj = invent; invent = 0; /* superfluous */ break; } otmp = otmp->nobj; } if(!(mtmp = makemon(PM_GHOST, u.ux, u.uy))) return; mtmp->mx = u.ux; mtmp->my = u.uy; mtmp->msleep = 1; (void) strcpy((char *) mtmp->mextra, plname); mkgold(somegold() + d(dlevel,30), u.ux, u.uy); u.ux = FAR; /* avoid animals standing next to us */ keepdogs(); /* all tame animals become wild again */ for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){ mtmp->mlstmv = 0; if(mtmp->mdispl) unpmon(mtmp); } for(gtmp = ftrap; gtmp; gtmp = gtmp->ngen) gtmp->gflag &= ~SEEN; for(otmp = fobj; otmp; otmp = otmp->nobj) otmp->onamelth = 0; if((fd = creat(bones, FMASK)) < 0) return; savelev(fd); (void) close(fd); } getbones(){ register int fd,x,y,ok; if(rn2(3)) return(0); /* only once in three times do we find bones */ bones[6] = '0' + dlevel/10; bones[7] = '0' + dlevel%10; if((fd = open(bones, 0)) < 0) return(0); if((ok = uptodate(fd)) != 0){ (void) getlev(fd); (void) close(fd); for(x = 0; x < COLNO; x++) for(y = 0; y < ROWNO; y++) levl[x][y].seen = levl[x][y].new = 0; } if(unlink(bones) < 0){ pline("Cannot unlink %s", bones); return(0); } return(ok); } #file hack.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.c version 1.0.1 - many small and unimportant changes */ #include "hack.h" #include <stdio.h> extern char news0(); extern char *nomovemsg; extern char *exclam(); extern struct obj *addinv(); extern boolean hmon(); /* called on movement: 1. when throwing ball+chain far away 2. when teleporting 3. when walking out of a lit room */ unsee() { register int x,y; register struct rm *lev; /* if(u.udispl){ u.udispl = 0; newsym(u.udisx, u.udisy); } */ #ifndef QUEST if(seehx){ seehx = 0; } else #endif QUEST for(x = u.ux-1; x < u.ux+2; x++) for(y = u.uy-1; y < u.uy+2; y++) { lev = &levl[x][y]; if(!lev->lit && lev->scrsym == '.') { lev->scrsym =' '; lev->new = 1; on_scr(x,y); } } } /* called: in hack.eat.c: seeoff(0) - blind after eating rotten food in hack.mon.c: seeoff(0) - blinded by a yellow light in hack.mon.c: seeoff(1) - swallowed in hack.do.c: seeoff(0) - blind after drinking potion in hack.do.c: seeoff(1) - go up or down the stairs in hack.trap.c:seeoff(1) - fall through trapdoor */ seeoff(mode) /* 1 to redo @, 0 to leave them */ { /* 1 means misc movement, 0 means blindness */ register int x,y; register struct rm *lev; if(u.udispl && mode){ u.udispl = 0; levl[u.udisx][u.udisy].scrsym = news0(u.udisx,u.udisy); } #ifndef QUEST if(seehx) { seehx = 0; } else #endif QUEST if(!mode) { for(x = u.ux-1; x < u.ux+2; x++) for(y = u.uy-1; y < u.uy+2; y++) { lev = &levl[x][y]; if(!lev->lit && lev->scrsym == '.') lev->seen = 0; } } } /* 'rogue'-like direction commands */ char sdir[] = "hykulnjb"; schar xdir[8] = { -1,-1,0,1,1,1,0,-1 }; schar ydir[8] = { 0,-1,-1,-1,0,1,1,1 }; movecm(cmd) register char *cmd; { register char *dp; if(!(dp = index(sdir, *cmd))) return(0); u.dx = xdir[dp-sdir]; u.dy = ydir[dp-sdir]; return(1); } getdir() { char buf[2]; register int x; pline("What direction?"); buf[0] = readchar(); buf[1] = 0; x = movecm(buf); if(x && Confusion) confdir(); return(x); } confdir() { register int x = rn2(8); u.dx = xdir[x]; u.dy = ydir[x]; } #ifdef QUEST finddir(){ register int i, ui = u.di; for(i = 0; i <= 8; i++){ if(flags.run & 1) ui++; else ui += 7; ui %= 8; if(i == 8){ pline("Not near a wall."); flags.move = multi = 0; return(0); } if(!isroom(u.ux+xdir[ui], u.uy+ydir[ui])) break; } for(i = 0; i <= 8; i++){ if(flags.run & 1) ui += 7; else ui++; ui %= 8; if(i == 8){ pline("Not near a room."); flags.move = multi = 0; return(0); } if(isroom(u.ux+xdir[ui], u.uy+ydir[ui])) break; } u.di = ui; u.dx = xdir[ui]; u.dy = ydir[ui]; } isroom(x,y) register int x,y; { return(isok(x,y) && (levl[x][y].typ == ROOM || (levl[x][y].typ >= LDOOR && flags.run >= 6))); } #endif QUEST isok(x,y) register int x,y; { return(x >= 0 && x <= COLNO-1 && y >= 0 && y <= ROWNO-1); } domove() { xchar oldx,oldy; register struct monst *mtmp; register struct rm *tmpr,*ust; struct gen *trap; register struct obj *otmp; if(!u.uswallow) wipe_engr_at(u.ux, u.uy, rnd(5)); if(inv_weight() > 0){ pline("You collapse under your load."); nomul(0); return; } if(u.uswallow) { u.dx = u.dy = 0; u.ux = u.ustuck->mx; u.uy = u.ustuck->my; } else { if(Confusion) { do { confdir(); } while(!isok(u.ux+u.dx, u.uy+u.dy) || levl[u.ux+u.dx][u.uy+u.dy].typ < DOOR); } if(!isok(u.ux+u.dx, u.uy+u.dy)){ nomul(0); return; } } ust = &levl[u.ux][u.uy]; oldx = u.ux; oldy = u.uy; if(!u.uswallow) if(trap = g_at(u.ux+u.dx,u.uy+u.dy,ftrap)) { if(trap->gflag & SEEN) nomul(0); } if(u.ustuck && !u.uswallow && (u.ux+u.dx != u.ustuck->mx || u.uy+u.dy != u.ustuck->my)) { if(dist(u.ustuck->mx, u.ustuck->my) > 2){ /* perhaps it fled (or was teleported or ... ) */ u.ustuck = 0; } else { if(Blind) pline("You cannot escape from it!"); else pline("You cannot escape from %s!.", monnam(u.ustuck)); nomul(0); return; } } if(u.uswallow || (mtmp = m_at(u.ux+u.dx,u.uy+u.dy))) { /* attack monster */ schar tmp; boolean malive = TRUE; register struct permonst *mdat; nomul(0); gethungry(); if(multi < 0) return; /* we just fainted */ if(u.uswallow) mtmp = u.ustuck; mdat = mtmp->data; if(mdat->mlet == 'L' && !mtmp->mfroz && !mtmp->msleep && !mtmp->mconf && mtmp->mcansee && !rn2(7) && (m_move(mtmp, 0) == 2 /* he died */ || /* he moved: */ mtmp->mx != u.ux+u.dx || mtmp->my != u.uy+u.dy)) goto nomon; if(mtmp->mimic){ if(!u.ustuck && !mtmp->mflee) u.ustuck = mtmp; switch(levl[u.ux+u.dx][u.uy+u.dy].scrsym){ case '+': pline("The door actually was a Mimic."); break; case '$': pline("The chest was a Mimic!"); break; default: pline("Wait! That's a Mimic!"); } wakeup(mtmp); /* clears mtmp->mimic */ return; } wakeup(mtmp); /* clears mtmp->mimic */ if(mtmp->mhide && mtmp->mundetected){ register struct obj *obj; mtmp->mundetected = 0; if((obj = o_at(mtmp->mx,mtmp->my)) && !Blind) pline("Wait! There's a %s hiding under %s!", mdat->mname, doname(obj)); return; } tmp = u.uluck + u.ulevel + mdat->ac + abon(); if(uwep) { if(uwep->olet == WEAPON_SYM) tmp += uwep->spe; if(uwep->otyp == TWO_HANDED_SWORD) tmp -= 1; else if(uwep->otyp == DAGGER) tmp += 2; else if(uwep->otyp == CRYSKNIFE) tmp += 3; else if(uwep->otyp == SPEAR && index("XDne", mdat->mlet)) tmp += 2; } if(mtmp->msleep) { mtmp->msleep = 0; tmp += 2; } if(mtmp->mfroz) { tmp += 4; if(!rn2(10)) mtmp->mfroz = 0; } if(mtmp->mflee) tmp += 2; if(u.utrap) tmp -= 3; if(tmp <= rnd(20) && !u.uswallow){ if(Blind) pline("You miss it."); else pline("You miss %s.",monnam(mtmp)); } else { /* we hit the monster; be careful: it might die! */ if((malive = hmon(mtmp,uwep,0)) == TRUE) { /* monster still alive */ if(!rn2(25) && mtmp->mhp < mtmp->orig_hp/2) { mtmp->mflee = 1; if(u.ustuck == mtmp && !u.uswallow) u.ustuck = 0; } #ifndef NOWORM if(mtmp->wormno) cutworm(mtmp, u.ux+u.dx, u.uy+u.dy, uwep ? uwep->otyp : 0); #endif NOWORM } if(mdat->mlet == 'a') { if(rn2(2)) { pline("You are splashed by the blob's acid!"); losehp_m(rnd(6), mtmp); } if(!rn2(6)) corrode_weapon(); else if(!rn2(60)) corrode_armor(); } } if(malive && !Blind && mdat->mlet == 'E' && rn2(3)) { if(mtmp->mcansee) { pline("You are frozen by the floating eye's gaze!"); nomul((u.ulevel > 6 || rn2(4)) ? rn1(20,-21) : -200); } else { pline("The blinded floating eye cannot defend itself."); if(!rn2(500)) u.uluck--; } } return; } nomon: /* not attacking an animal, so we try to move */ if(u.utrap) { if(u.utraptype == TT_PIT) { pline("You are still in a pit."); u.utrap--; } else { pline("You are caught in a beartrap."); if((u.dx && u.dy) || !rn2(5)) u.utrap--; } return; } tmpr = &levl[u.ux+u.dx][u.uy+u.dy]; if((tmpr->typ < DOOR) || (u.dx && u.dy && (tmpr->typ == DOOR || ust->typ == DOOR))){ flags.move = 0; nomul(0); return; } while(otmp = sobj_at(ENORMOUS_ROCK, u.ux+u.dx, u.uy+u.dy)) { register xchar rx = u.ux+2*u.dx, ry = u.uy+2*u.dy; register struct gen *gtmp; nomul(0); if(isok(rx,ry) && (levl[rx][ry].typ > DOOR || (levl[rx][ry].typ == DOOR && (!u.dx || !u.dy))) && !sobj_at(ENORMOUS_ROCK, rx, ry)) { if(m_at(rx,ry)) { pline("You hear a monster behind the rock."); pline("Perhaps that's why you cannot move it."); return; } if(gtmp = g_at(rx,ry,ftrap)) #include "def.trap.h" switch(gtmp->gflag & TRAPTYPE) { case PIT: pline("You push the rock into a pit!"); deltrap(gtmp); delobj(otmp); pline("It completely fills the pit!"); continue; case TELEP_TRAP: pline("You push the rock and suddenly it disappears!"); delobj(otmp); continue; } otmp->ox = rx; otmp->oy = ry; /* pobj(otmp); */ if(cansee(rx,ry)) atl(rx,ry,otmp->olet); if(Invis) newsym(u.ux+u.dx, u.uy+u.dy); { static long lastmovetime; /* note: this var contains garbage initially and after a restore */ if(moves > lastmovetime+2 || moves < lastmovetime) pline("With great effort you move the enormous rock."); lastmovetime = moves; } } else { pline("You try to move the enormous rock, but in vain."); return; } } if(u.dx && u.dy && levl[u.ux][u.uy+u.dy].typ < DOOR && levl[u.ux+u.dx][u.uy].typ < DOOR && invent && inv_weight()+40 > 0) { pline("You are carrying too much to get through."); nomul(0); return; } if(Punished && DIST(u.ux+u.dx, u.uy+u.dy, uchain->ox, uchain->oy) > 2){ if(carried(uball)) { movobj(uchain, u.ux, u.uy); goto nodrag; } if(DIST(u.ux+u.dx, u.uy+u.dy, uball->ox, uball->oy) < 3){ /* leave ball, move chain under/over ball */ movobj(uchain, uball->ox, uball->oy); goto nodrag; } if(inv_weight() + (int) uball->owt/2 > 0) { pline("You cannot %sdrag the heavy iron ball.", invent ? "carry all that and also " : ""); nomul(0); return; } movobj(uball, uchain->ox, uchain->oy); unpobj(uball); /* BAH %% */ uchain->ox = u.ux; uchain->oy = u.uy; nomul(-2); nomovemsg = ""; nodrag: ; } u.ux += u.dx; u.uy += u.dy; if(flags.run) { if(tmpr->typ == DOOR || (xupstair == u.ux && yupstair == u.uy) || (xdnstair == u.ux && ydnstair == u.uy)) nomul(0); } /* if(u.udispl) { u.udispl = 0; newsym(oldx,oldy); } */ if(!Blind) { #ifdef QUEST setsee(); #else if(ust->lit) { if(tmpr->lit) { if(tmpr->typ == DOOR) prl1(u.ux+u.dx,u.uy+u.dy); else if(ust->typ == DOOR) nose1(oldx-u.dx,oldy-u.dy); } else { unsee(); prl1(u.ux+u.dx,u.uy+u.dy); } } else { if(tmpr->lit) setsee(); else { prl1(u.ux+u.dx,u.uy+u.dy); if(tmpr->typ == DOOR) { if(u.dy) { prl(u.ux-1,u.uy); prl(u.ux+1,u.uy); } else { prl(u.ux,u.uy-1); prl(u.ux,u.uy+1); } } } nose1(oldx-u.dx,oldy-u.dy); } #endif QUEST } else { pru(); } if(!flags.nopick) pickup(); if(trap) dotrap(trap); /* fall into pit, arrow trap, etc. */ (void) inshop(); if(!Blind) read_engr_at(u.ux,u.uy); } movobj(obj, ox, oy) register struct obj *obj; register int ox, oy; { /* Some dirty programming to get display right */ freeobj(obj); unpobj(obj); obj->nobj = fobj; fobj = obj; obj->ox = ox; obj->oy = oy; } dopickup(){ if(!g_at(u.ux,u.uy,fgold) && !o_at(u.ux,u.uy)) { pline("There is nothing here to pick up."); return(0); } if(Levitation) { pline("You cannot reach the floor."); return(1); } pickup(); return(1); } pickup(){ register struct gen *gold; register struct obj *obj, *obj2; register int wt; if(Levitation) return; while(gold = g_at(u.ux,u.uy,fgold)) { pline("%u gold piece%s.", gold->gflag, plur(gold->gflag)); u.ugold += gold->gflag; flags.botl = 1; freegold(gold); if(flags.run) nomul(0); if(Invis) newsym(u.ux,u.uy); } for(obj = fobj; obj; obj = obj2) { obj2 = obj->nobj; /* perhaps obj will be picked up */ if(obj->ox == u.ux && obj->oy == u.uy) { if(flags.run) nomul(0); #define DEAD_c CORPSE+('c'-'a'+'Z'-'@'+1) if(obj->otyp == DEAD_COCKATRICE && !uarmg){ pline("Touching the dead cockatrice is a fatal mistake."); pline("You turn to stone."); killer = "cockatrice cadaver"; done("died"); } if(obj->otyp == SCR_SCARE_MONSTER){ if(!obj->spe) obj->spe = 1; else { /* Note: perhaps the 1st pickup failed: you cannot carry anymore, and so we never dropped it - let's assume that treading on it twice also destroys the scroll */ pline("The scroll turns to dust as you pick it up."); delobj(obj); continue; } } /* do not pick up uchain */ if(Punished && obj == uchain) continue; wt = inv_weight() + obj->owt; if(wt > 0) { if(obj->quan > 1) { /* see how many we can lift */ extern struct obj *splitobj(); int savequan = obj->quan; int iw = inv_weight(); int qq; for(qq = 1; qq < savequan; qq++){ obj->quan = qq; if(iw + weight(obj) > 0) break; } obj->quan = savequan; qq--; /* we can carry qq of them */ if(!qq) goto too_heavy; pline("You can only carry %s of the %s lying here.", (qq == 1) ? "one" : "some", doname(obj)); (void) splitobj(obj, qq); /* note: obj2 is set already, so we'll never * encounter the other half; if it should be * otherwise then write * obj2 = splitobj(obj,qq); */ goto lift_some; } too_heavy: pline("There %s %s here, but %s.", (obj->quan == 1) ? "is" : "are", doname(obj), !invent ? "it is too heavy for you to lift" : "you cannot carry anymore"); break; } lift_some: if(inv_cnt() >= 52) { pline("Your knapsack cannot accomodate anymore items."); break; } if(wt > -5) pline("You have a little trouble lifting"); freeobj(obj); if(Invis) newsym(u.ux,u.uy); addtobill(obj); /* sets obj->unpaid if necessary */ { int pickquan = obj->quan; int mergquan; if(!Blind) obj->dknown = 1; /* this is done by prinv(), but addinv() needs it already for merging */ obj = addinv(obj); /* might merge it with other objects */ mergquan = obj->quan; obj->quan = pickquan; /* to fool prinv() */ prinv(obj); obj->quan = mergquan; } } } } /* stop running if we see something interesting */ /* turn around a corner if that is the only way we can proceed */ /* do not turn left or right twice */ lookaround(){ register int x,y,i,x0,y0,m0,i0 = 9; register int corrct = 0, noturn = 0; register struct monst *mtmp; #ifdef lint /* suppress "used before set" message */ x0 = y0 = 0; #endif lint if(Blind || flags.run == 0) return; if(flags.run == 1 && levl[u.ux][u.uy].typ >= ROOM) return; #ifdef QUEST if(u.ux0 == u.ux+u.dx && u.uy0 == u.uy+u.dy) goto stop; #endif QUEST for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++){ if(x == u.ux && y == u.uy) continue; if(!levl[x][y].typ) continue; if((mtmp = m_at(x,y)) && !mtmp->mimic && (!mtmp->minvis || See_invisible)){ if(!mtmp->mtame || (x == u.ux+u.dx && y == u.uy+u.dy)) goto stop; } else mtmp = 0; /* invisible M cannot influence us */ if(x == u.ux-u.dx && y == u.uy-u.dy) continue; switch(levl[x][y].scrsym){ case '|': case '-': case '.': case ' ': break; case '+': if(x != u.ux && y != u.uy) break; if(flags.run != 1) goto stop; /* fall into next case */ case CORR_SYM: corr: if(flags.run == 1 || flags.run == 3) { i = DIST(x,y,u.ux+u.dx,u.uy+u.dy); if(i > 2) break; if(corrct == 1 && DIST(x,y,x0,y0) != 1) noturn = 1; if(i < i0) { i0 = i; x0 = x; y0 = y; m0 = mtmp ? 1 : 0; } } corrct++; break; case '^': if(flags.run == 1) goto corr; /* if you must */ if(x == u.ux+u.dx && y == u.uy+u.dx) goto stop; break; default: /* e.g. objects or trap or stairs */ if(flags.run == 1) goto corr; if(mtmp) break; /* d */ stop: nomul(0); return; } } #ifdef QUEST if(corrct > 0 && (flags.run == 4 || flags.run == 5)) goto stop; #endif QUEST if(corrct > 1 && flags.run == 2) goto stop; if((flags.run == 1 || flags.run == 3) && !noturn && !m0 && i0 && (corrct == 1 || (corrct == 2 && i0 == 1))) { /* make sure that we do not turn too far */ if(i0 == 2) { if(u.dx == y0-u.uy && u.dy == u.ux-x0) i = 2; /* straight turn right */ else i = -2; /* straight turn left */ } else if(u.dx && u.dy) { if((u.dx == u.dy && y0 == u.uy) || (u.dx != u.dy && y0 != u.uy)) i = -1; /* half turn left */ else i = 1; /* half turn right */ } else { if((x0-u.ux == y0-u.uy && !u.dy) || (x0-u.ux != y0-u.uy && u.dy)) i = 1; /* half turn right */ else i = -1; /* half turn left */ } i += u.last_str_turn; if(i <= 2 && i >= -2) { u.last_str_turn = i; u.dx = x0-u.ux, u.dy = y0-u.uy; } } } #ifdef QUEST cansee(x,y) xchar x,y; { register int dx,dy,adx,ady,sdx,sdy,dmax,d; if(Blind) return(0); if(!isok(x,y)) return(0); d = dist(x,y); if(d < 3) return(1); if(d > u.uhorizon*u.uhorizon) return(0); if(!levl[x][y].lit) return(0); dx = x - u.ux; adx = abs(dx); sdx = sgn(dx); dy = y - u.uy; ady = abs(dy); sdy = sgn(dy); if(dx == 0 || dy == 0 || adx == ady){ dmax = (dx == 0) ? ady : adx; for(d = 1; d <= dmax; d++) if(!rroom(sdx*d,sdy*d)) return(0); return(1); } else if(ady > adx){ for(d = 1; d <= ady; d++){ if(!rroom(sdx*( (d*adx)/ady ), sdy*d) || !rroom(sdx*( (d*adx-1)/ady+1 ), sdy*d)) return(0); } return(1); } else { for(d = 1; d <= adx; d++){ if(!rroom(sdx*d, sdy*( (d*ady)/adx )) || !rroom(sdx*d, sdy*( (d*ady-1)/adx+1 ))) return(0); } return(1); } } rroom(x,y) register int x,y; { return(levl[u.ux+x][u.uy+y].typ >= ROOM); } #else cansee(x,y) xchar x,y; { if(Blind || u.uswallow) return(0); if(dist(x,y) < 3) return(1); if(levl[x][y].lit && seelx <= x && x <= seehx && seely <= y && y <= seehy) return(1); return(0); } #endif QUEST sgn(a) register int a; { return((a> 0) ? 1 : (a == 0) ? 0 : -1); } pow(num) /* returns 2 to the num */ register unsigned num; { return(1 << num); } #ifdef QUEST setsee() { register int x,y; if(Blind) { pru(); return; } for(y = u.uy-u.uhorizon; y <= u.uy+u.uhorizon; y++) for(x = u.ux-u.uhorizon; x <= u.ux+u.uhorizon; x++) { if(cansee(x,y)) prl(x,y); } } #else setsee() { register int x,y; if(Blind) { pru(); return; } if(!levl[u.ux][u.uy].lit) { seelx = u.ux-1; seehx = u.ux+1; seely = u.uy-1; seehy = u.uy+1; } else { for(seelx = u.ux; levl[seelx-1][u.uy].lit; seelx--); for(seehx = u.ux; levl[seehx+1][u.uy].lit; seehx++); for(seely = u.uy; levl[u.ux][seely-1].lit; seely--); for(seehy = u.uy; levl[u.ux][seehy+1].lit; seehy++); } for(y = seely; y <= seehy; y++) for(x = seelx; x <= seehx; x++) { prl(x,y); } if(!levl[u.ux][u.uy].lit) seehx = 0; /* seems necessary elsewhere */ else { if(seely == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seely-1); if(seehy == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seehy+1); if(seelx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seelx-1,y); if(seehx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seehx+1,y); } } #endif QUEST nomul(nval) register int nval; { if(multi < 0) return; multi = nval; flags.mv = flags.run = 0; } abon() { if(u.ustr == 3) return(-3); else if(u.ustr < 6) return(-2); else if(u.ustr < 8) return(-1); else if(u.ustr < 17) return(0); else if(u.ustr < 69) return(1); /* up to 18/50 */ else if(u.ustr < 118) return(2); else return(3); } dbon() { if(u.ustr < 6) return(-1); else if(u.ustr < 16) return(0); else if(u.ustr < 18) return(1); else if(u.ustr == 18) return(2); /* up to 18 */ else if(u.ustr < 94) return(3); /* up to 18/75 */ else if(u.ustr < 109) return(4); /* up to 18/90 */ else if(u.ustr < 118) return(5); /* up to 18/99 */ else return(6); } losestr(num) register int num; { u.ustr -= num; while(u.ustr < 3) { u.ustr++; u.uhp -= 6; u.uhpmax -= 6; } flags.botl = 1; } losehp(n,knam) register int n; register char *knam; { u.uhp -= n; if(u.uhp > u.uhpmax) u.uhpmax = u.uhp; /* perhaps n was negative */ flags.botl = 1; if(u.uhp < 1) killer = knam; /* the thing that killed you */ } losehp_m(n,mtmp) register int n; register struct monst *mtmp; { u.uhp -= n; flags.botl = 1; if(u.uhp < 1) done_in_by(mtmp); } losexp() /* hit by V or W */ { register int num; if(u.ulevel > 1) pline("Goodbye level %d.",u.ulevel--); else u.uhp = -1; num = rnd(10); u.uhp -= num; u.uhpmax -= num; u.uexp = 10*pow(u.ulevel-1); flags.botl = 1; } inv_weight(){ register struct obj *otmp = invent; register int wt = 0; register int carrcap = 5*(((u.ustr > 18) ? 20 : u.ustr) + u.ulevel); if(carrcap > MAX_CARR_CAP) carrcap = MAX_CARR_CAP; if(Wounded_legs & LEFT_SIDE) carrcap -= 10; if(Wounded_legs & RIGHT_SIDE) carrcap -= 10; while(otmp){ wt += otmp->owt; otmp = otmp->nobj; } return(wt - carrcap); } inv_cnt(){ register struct obj *otmp = invent; register int ct = 0; while(otmp){ ct++; otmp = otmp->nobj; } return(ct); } #file hack.cmdlist.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.cmdlist.c version 1.0.1 - added '^T': dotele() and ',': dopickup() */ #include "config.h" #include "def.objclass.h" #include "def.func_tab.h" int doredraw(),doredotopl(),dodrop(),dodrink(),doread(),dosearch(),dopickup(), doversion(),doweararm(),dowearring(),doremarm(),doremring(),dopay(),doapply(), dosave(),dowield(),ddoinv(),dozap(),ddocall(),dowhatis(),doengrave(),dotele(), dohelp(),doeat(),doddrop(),do_mname(),doidtrap(),doprwep(),doprarm(),doprring(); #ifdef SHELL int dosh(); #endif SHELL #ifdef OPTIONS int doset(); #endif OPTIONS int doup(), dodown(), done1(), donull(); int dothrow(); struct func_tab list[]={ '\022', doredraw, '\024', dotele, '\020', doredotopl, 'a', doapply, /* 'A' : UNUSED */ /* 'b', 'B' : go sw */ 'c', ddocall, 'C', do_mname, 'd', dodrop, 'D', doddrop, 'e', doeat, 'E', doengrave, /* 'f', 'F' : multiple go (might become 'fight') */ /* 'g', 'G' : UNUSED */ /* 'h', 'H' : go west */ 'i', ddoinv, #ifdef CHEATINV 'I', myddoinv, #else 'i', ddoinv, #endif /* 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */ #ifdef OPTIONS 'o', doset, #endif OPTIONS /* 'O' : UNUSED */ 'p', dopay, 'P', dowearring, 'q', dodrink, 'Q', done1, 'r', doread, 'R', doremring, 's', dosearch, 'S', dosave, 't', dothrow, 'T', doremarm, /* 'u', 'U' : go ne */ 'v', doversion, /* 'V' : UNUSED */ 'w', dowield, 'W', doweararm, /* 'x', 'X' : UNUSED */ /* 'y', 'Y' : go nw */ 'z', dozap, /* 'Z' : UNUSED */ '<', doup, '>', dodown, '/', dowhatis, '?', dohelp, #ifdef SHELL '!', dosh, #endif SHELL ',', dopickup, '.', donull, ' ', donull, '^', doidtrap, WEAPON_SYM, doprwep, ARMOR_SYM, doprarm, RING_SYM, doprring, 0,0,0 }; #file hack.decl.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" char nul[40]; /* contains zeros */ char plname[PL_NSIZ] = "player";/* player name */ char lock[32] = "1lock"; /* long enough for login name */ #ifdef WIZARD boolean wizard; /* TRUE when called as hack -w */ #endif WIZARD struct rm levl[COLNO][ROWNO]; /* level map */ #ifndef QUEST struct mkroom rooms[MAXNROFROOMS+1]; coord doors[DOORMAX]; #endif QUEST struct monst *fmon = 0; struct gen *fgold = 0, *ftrap = 0; struct obj *fobj = 0, *fcobj = 0, *invent = 0, *uwep = 0, *uarm = 0, *uarm2 = 0, *uarmh = 0, *uarms = 0, *uarmg = 0, *uright = 0, *uleft = 0, *uchain = 0, *uball = 0; struct flag flags; struct you u; xchar dlevel = 1; xchar xupstair, yupstair, xdnstair, ydnstair; char *save_cm = 0, *killer, *nomovemsg; long moves = 1; long wailmsg = 0; int multi = 0; char genocided[60]; char fut_geno[60]; xchar curx,cury; xchar seelx, seehx, seely, seehy; /* corners of lit room */ coord bhitpos;
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/04/86)
#file hack.do.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.do.c version 1.0.1 - check Levitation with POT_PARALYSIS - added flags.no_rest_on_space */ #include <stdio.h> #include <signal.h> #include <fcntl.h> #include "hack.h" #include "def.func_tab.h" extern char *getenv(),*parse(),*getlogin(),*lowc(),*unctrl(); extern int float_down(); extern char *nomovemsg, *catmore; extern struct obj *splitobj(), *addinv(); extern boolean hmon(); extern char morc; /* Routines to do various user commands */ int done1(); dodrink() { register struct obj *otmp,*objs; register struct monst *mtmp; register int unkn = 0, nothing = 0; otmp = getobj("!", "drink"); if(!otmp) return(0); switch(otmp->otyp){ case POT_RESTORE_STRENGTH: unkn++; pline("Wow! This makes you feel great!"); if(u.ustr < u.ustrmax) { u.ustr = u.ustrmax; flags.botl = 1; } break; case POT_BOOZE: unkn++; pline("Ooph! This tastes like liquid fire!"); Confusion += d(3,8); /* the whiskey makes us feel better */ if(u.uhp < u.uhpmax) losehp(-1, "bottle of whiskey"); if(!rn2(4)) { pline("You pass out."); multi = -rnd(15); nomovemsg = "You awake with a headache."; } break; case POT_INVISIBILITY: if(Invis) nothing++; else { if(!Blind) pline("Gee! All of a sudden, you can't see yourself."); else pline("You feel rather airy."), unkn++; newsym(u.ux,u.uy); } Invis += rn1(15,31); break; case POT_FRUIT_JUICE: pline("This tastes like fruit juice."); lesshungry(20); break; case POT_HEALING: pline("You begin to feel better."); flags.botl = 1; u.uhp += rnd(10); if(u.uhp > u.uhpmax) u.uhp = ++u.uhpmax; if(Blind) Blind = 1; /* see on next move */ if(Sick) Sick = 0; break; case POT_PARALYSIS: if(Levitation) pline("Your head is frozen to the ceiling!"); else pline("Your feet are frozen to the floor!"); nomul(-(rn1(10,25))); break; case POT_MONSTER_DETECTION: if(!fmon) { strange_feeling(otmp); return(1); } else { cls(); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->mx > 0) at(mtmp->mx,mtmp->my,mtmp->data->mlet); prme(); pline("You sense the presence of monsters."); more(); docrt(); } break; case POT_OBJECT_DETECTION: if(!fobj) { strange_feeling(otmp); return(1); } else { for(objs = fobj; objs; objs = objs->nobj) if(objs->ox != u.ux || objs->oy != u.uy) goto outobjmap; pline("You sense the presence of objects close nearby."); break; outobjmap: cls(); for(objs = fobj; objs; objs = objs->nobj) at(objs->ox,objs->oy,objs->olet); prme(); pline("You sense the presence of objects."); more(); docrt(); } break; case POT_SICKNESS: pline("Yech! This stuff tastes like poison."); if(Poison_resistance) pline("(But in fact it was biologically contaminated orange juice.)"); losestr(rn1(4,3)); losehp(rnd(10), "poison potion"); break; case POT_CONFUSION: if(!Confusion) pline("Huh, What? Where am I?"); else nothing++; Confusion += rn1(7,16); break; case POT_GAIN_STRENGTH: pline("Wow do you feel strong!"); if(u.ustr == 118) break; if(u.ustr > 17) u.ustr += rnd(118-u.ustr); else u.ustr++; if(u.ustr > u.ustrmax) u.ustrmax = u.ustr; flags.botl = 1; break; case POT_SPEED: if(Wounded_legs) { if((Wounded_legs & BOTH_SIDES) == BOTH_SIDES) pline("Your legs feel somewhat better."); else pline("Your leg feels somewhat better."); Wounded_legs = 0; unkn++; break; } if(!(Fast & ~INTRINSIC)) pline("You are suddenly moving much faster."); else pline("Your legs get new energy."), unkn++; Fast += rn1(10,100); break; case POT_BLINDNESS: if(!Blind) pline("A cloud of darkness falls upon you."); else nothing++; Blind += rn1(100,250); seeoff(0); break; case POT_GAIN_LEVEL: pluslvl(); break; case POT_EXTRA_HEALING: pline("You feel much better."); flags.botl = 1; u.uhp += d(2,20)+1; if(u.uhp > u.uhpmax) u.uhp = (u.uhpmax += 2); if(Blind) Blind = 1; if(Sick) Sick = 0; break; case POT_LEVITATION: if(!Levitation) float_up(); else nothing++; Levitation += rnd(100); u.uprops[PROP(RIN_LEVITATION)].p_tofn = float_down; break; default: pline("What a funny potion! (%d)", otmp->otyp); impossible(); return(0); } if(nothing) { unkn++; pline("You have a peculiar feeling for a moment, then it passes."); } if(otmp->dknown && !objects[otmp->otyp].oc_name_known) { if(!unkn) { objects[otmp->otyp].oc_name_known = 1; u.urexp += 10; } else if(!objects[otmp->otyp].oc_uname) docall(otmp); } useup(otmp); return(1); } pluslvl() { register int num; pline("You feel more experienced."); num = rnd(10); u.uhpmax += num; u.uhp += num; u.uexp = (10*pow(u.ulevel-1))+1; pline("Welcome to level %d.", ++u.ulevel); flags.botl = 1; } strange_feeling(obj) register struct obj *obj; { pline("You have a strange feeling for a moment, then it passes."); if(!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname) docall(obj); useup(obj); } dodrop() { register struct obj *obj; obj = getobj("0$#", "drop"); if(!obj) return(0); if(obj->olet == '$') { if(obj->quan == 0) pline("You didn't drop any gold pieces."); else { mkgold((int) obj->quan, u.ux, u.uy); pline("You dropped %u gold piece%s.", obj->quan, plur(obj->quan)); if(Invis) newsym(u.ux, u.uy); } free((char *) obj); return(1); } return(drop(obj)); } drop(obj) register struct obj *obj; { if(obj->owornmask & (W_ARMOR | W_RING)){ pline("You cannot drop something you are wearing."); return(0); } if(obj == uwep) { if(uwep->cursed) { pline("Your weapon is welded to your hand!"); return(0); } setuwep((struct obj *) 0); } pline("You dropped %s.", doname(obj)); dropx(obj); return(1); } dropx(obj) register struct obj *obj; { if(obj->otyp == CRYSKNIFE) obj->otyp = WORM_TOOTH; freeinv(obj); obj->ox = u.ux; obj->oy = u.uy; obj->nobj = fobj; fobj = obj; if(Invis) newsym(u.ux,u.uy); subfrombill(obj); stackobj(obj); } /* drop several things */ doddrop() { return(ggetobj("drop", drop, 0)); } rhack(cmd) register char *cmd; { register struct func_tab *tlist = list; boolean firsttime = FALSE; register int res; if(!cmd) { firsttime = TRUE; flags.nopick = 0; cmd = parse(); } if(!*cmd || *cmd == 0377 || (flags.no_rest_on_space && *cmd == ' ')){ flags.move = 0; return; /* probably we just had an interrupt */ } if(movecm(cmd)) { walk: if(multi) flags.mv = 1; domove(); return; } if(movecm(lowc(cmd))) { flags.run = 1; rush: if(firsttime){ if(!multi) multi = COLNO; u.last_str_turn = 0; } flags.mv = 1; #ifdef QUEST if(flags.run >= 4) finddir(); if(firsttime){ u.ux0 = u.ux + u.dx; u.uy0 = u.uy + u.dy; } #endif QUEST domove(); return; } if((*cmd == 'f' && movecm(cmd+1)) || movecm(unctrl(cmd))) { flags.run = 2; goto rush; } if(*cmd == 'F' && movecm(lowc(cmd+1))) { flags.run = 3; goto rush; } if(*cmd == 'm' && movecm(cmd+1)) { flags.run = 0; flags.nopick = 1; goto walk; } if(*cmd == 'M' && movecm(lowc(cmd+1))) { flags.run = 1; flags.nopick = 1; goto rush; } #ifdef QUEST if(*cmd == cmd[1] && (*cmd == 'f' || *cmd == 'F')) { flags.run = 4; if(*cmd == 'F') flags.run += 2; if(cmd[2] == '-') flags.run += 1; goto rush; } #endif QUEST while(tlist->f_char) { if(*cmd == tlist->f_char){ res = (*(tlist->f_funct))(0); if(!res) { flags.move = 0; multi = 0; } return; } tlist++; } pline("Unknown command '%s'",cmd); multi = flags.move = 0; } doredraw() { docrt(); return(0); } dohelp() { FILE *fp; char bufr[BUFSZ]; int line, i; if ( (fp = fopen(HELP,"r")) == NULL) pline("cannot access help"); else { cls(); line = 1; while(fgets(bufr,BUFSZ,fp)) { myprintf("%s", bufr); if (line++ > ROWNO) { myprintf("---more---"); xwaitforspace(FALSE); morc = 0; for (i=0;i<10;i++) backsp(); cl_end(); line = 1; } } more(); docrt(); } } #ifdef SHELL dosh(){ char *file, *Open(); if ( (file = Open("CON:1/1/639/199/Hack SubProcess", 1006)) == NULL) pline("cannot create process window"); if (Execute("", file, NULL)) pline("cannot execute commands"); Close(file); return(0); } #endif SHELL child(wt) { pline("Cannot create children"); docrt(); return(0); } dodown() { if(u.ux != xdnstair || u.uy != ydnstair) { pline("You can't go down here."); return(0); } if(u.ustuck) { pline("You are being held, and cannot go down."); return(1); } if(Levitation) { pline("You're floating high above the stairs."); return(0); } goto_level(dlevel+1, TRUE); return(1); } doup() { if(u.ux != xupstair || u.uy != yupstair) { pline("You can't go up here."); return(0); } if(u.ustuck) { pline("You are being held, and cannot go up."); return(1); } if(inv_weight() + 5 > 0) { pline("Your load is too heavy to climb the stairs."); return(1); } goto_level(dlevel-1, TRUE); return(1); } goto_level(newlevel, at_stairs) register int newlevel; register boolean at_stairs; { register int fd; register boolean up = (newlevel < dlevel); if(newlevel <= 0) done("escaped"); /* in fact < 0 is impossible */ if(newlevel == dlevel) return; /* this cannot happen either */ glo(dlevel); fd = creat(lock,FMASK); if(fd < 0) { /* * This is not quite impossible: e.g., we may have * exceeded our quota. If that is the case then we * cannot leave this level, and cannot save either. */ pline("A mysterious force prevents you from going %s.", up ? "up" : "down"); return; } if(Punished) unplacebc(); keepdogs(); seeoff(1); flags.nscrinh = 1; u.ux = FAR; /* hack */ (void) inshop(); /* probably was a trapdoor */ savelev(fd); (void) close(fd); dlevel = newlevel; if(maxdlevel < dlevel) maxdlevel = dlevel; glo(dlevel); if((fd = open(lock,0)) < 0) mklev(); else { (void) getlev(fd); (void) close(fd); } if(at_stairs) { if(up) { u.ux = xdnstair; u.uy = ydnstair; if(!u.ux) { /* entering a maze from below? */ u.ux = xupstair; /* this will confuse the player! */ u.uy = yupstair; } if(Punished){ pline("With great effort you climb the stairs"); placebc(1); } } else { u.ux = xupstair; u.uy = yupstair; if(inv_weight() + 5 > 0 || Punished){ pline("You fall down the stairs."); losehp(rnd(3), "fall"); if(Punished) { if(uwep != uball && rn2(3)){ pline("... and are hit by the iron ball"); losehp(rnd(20), "iron ball"); } placebc(1); } selftouch("Falling, you"); } } } else { /* trapdoor or level_tele */ do { u.ux = rnd(COLNO-1); u.uy = rn2(ROWNO); } while(levl[u.ux][u.uy].typ != ROOM || m_at(u.ux,u.uy)); if(Punished){ if(uwep != uball && !up /* %% */ && rn2(5)){ pline("The iron ball falls on your head."); losehp(rnd(25), "iron ball"); } placebc(1); } selftouch("Falling, you"); } (void) inshop(); #ifdef TRACK initrack(); #endif TRACK losedogs(); flags.nscrinh = 0; setsee(); { register struct monst *mtmp; if(mtmp = m_at(u.ux, u.uy)) mnexto(mtmp); /* riv05!a3 */ } docrt(); pickup(); read_engr_at(u.ux,u.uy); } donull() { return(1); /* Do nothing, but let other things happen */ } struct monst *bhit(), *boomhit(); dothrow() { register struct obj *obj; register struct monst *mon; register int tmp; obj = getobj("#)", "throw"); /* it is also possible to throw food */ /* (or jewels, or iron balls ... ) */ if(!obj || !getdir()) return(0); if(obj->owornmask & (W_ARMOR | W_RING)){ pline("You can't throw something you are wearing"); return(0); } if(obj == uwep){ if(obj->cursed){ pline("Your weapon is welded to your hand"); return(1); } if(obj->quan > 1) setuwep(splitobj(obj, 1)); else setuwep((struct obj *) 0); } else if(obj->quan > 1) (void) splitobj(obj, 1); freeinv(obj); if(u.uswallow) { mon = u.ustuck; bhitpos.x = mon->mx; bhitpos.y = mon->my; } else if(obj->otyp == BOOMERANG) { mon = boomhit(u.dx,u.dy); /* boomhit delivers -1 if the thing was caught */ if((int) mon == -1) { (void) addinv(obj); return(1); } } else mon = bhit(u.dx,u.dy, (!Punished || obj != uball) ? 8 : !u.ustuck ? 5 : 1, obj->olet); if(mon) { /* awake monster if sleeping */ wakeup(mon); if(obj->olet == WEAPON_SYM) { tmp = -1+u.ulevel+mon->data->ac+abon(); if(obj->otyp < ROCK) { if(!uwep || uwep->otyp != obj->otyp+(BOW-ARROW)) tmp -= 4; else { tmp += uwep->spe; } } else if(obj->otyp == BOOMERANG) tmp += 4; tmp += obj->spe; if(u.uswallow || tmp >= rnd(20)) { if(hmon(mon,obj,1) == TRUE){ /* mon still alive */ #ifndef NOWORM cutworm(mon,bhitpos.x,bhitpos.y,obj->otyp); #endif NOWORM } else mon = 0; /* weapons thrown disappear sometimes */ if(obj->otyp < BOOMERANG && rn2(3)) { /* check bill; free */ obfree(obj, (struct obj *) 0); return(1); } } else miss(objects[obj->otyp].oc_name, mon); } else if(obj->otyp == HEAVY_IRON_BALL) { tmp = -1+u.ulevel+mon->data->ac+abon(); if(!Punished || obj != uball) tmp += 2; if(u.utrap) tmp -= 2; if(u.uswallow || tmp >= rnd(20)) { if(hmon(mon,obj,1) == FALSE) mon = 0; /* he died */ } else miss("iron ball", mon); } else { if(cansee(bhitpos.x,bhitpos.y)) pline("You miss %s.",monnam(mon)); else pline("You miss it."); if(obj->olet == FOOD_SYM && mon->data->mlet == 'd') if(tamedog(mon,obj)) return(1); if(obj->olet == GEM_SYM && mon->data->mlet == 'u'){ if(obj->dknown && objects[obj->otyp].oc_name_known){ if(objects[obj->otyp].g_val > 0){ u.uluck += 5; goto valuable; } else { pline("%s is not interested in your junk.", Monnam(mon)); } } else { /* value unknown to @ */ u.uluck++; valuable: pline("%s graciously accepts your gift.", Monnam(mon)); mpickobj(mon, obj); rloc(mon); return(1); } } } } obj->ox = bhitpos.x; obj->oy = bhitpos.y; obj->nobj = fobj; fobj = obj; /* prevent him from throwing articles to the exit and escaping */ /* subfrombill(obj); */ stackobj(obj); if(Punished && obj == uball && (bhitpos.x != u.ux || bhitpos.y != u.uy)){ freeobj(uchain); unpobj(uchain); if(u.utrap){ if(u.utraptype == TT_PIT) pline("The ball pulls you out of the pit!"); else { register long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE; pline("The ball pulls you out of the bear trap."); pline("Your %s leg is severely damaged.", (side == LEFT_SIDE) ? "left" : "right"); Wounded_legs |= side + rnd(1000); losehp(2, "thrown ball"); } u.utrap = 0; } unsee(); uchain->nobj = fobj; fobj = uchain; u.ux = uchain->ox = bhitpos.x - u.dx; u.uy = uchain->oy = bhitpos.y - u.dy; setsee(); (void) inshop(); } if(cansee(bhitpos.x, bhitpos.y)) prl(bhitpos.x,bhitpos.y); return(1); } /* split obj so that it gets size num */ /* remainder is put in the object structure delivered by this call */ struct obj * splitobj(obj, num) register struct obj *obj; register int num; { register struct obj *otmp; otmp = newobj(0); *otmp = *obj; /* copies whole structure */ otmp->o_id = flags.ident++; otmp->onamelth = 0; obj->quan = num; obj->owt = weight(obj); otmp->quan -= num; otmp->owt = weight(otmp); /* -= obj->owt ? */ obj->nobj = otmp; if(obj->unpaid) splitbill(obj,otmp); return(otmp); } char * lowc(str) register char *str; { static char buf[2]; if(*str >= 'A' && *str <= 'Z') *buf = *str+'a'-'A'; else *buf = *str; buf[1] = 0; return(buf); } char * unctrl(str) register char *str; { static char buf[2]; if(*str >= ('A' & 037) && *str <= ('Z' & 037)) *buf = *str + 0140; else *buf = *str; buf[1] = 0; return(buf); } #file hack.dog.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.dog.c version 1.0.1 - "You feel worried about %s." (Adri Verhoef) */ #include "hack.h" #include "hack.mfndpos.h" extern char POISONOUS[]; extern struct monst *makemon(); #include "def.edog.h" makedog(){ register struct monst *mtmp = makemon(PM_LI_DOG,u.ux,u.uy); if(!mtmp) return; /* dogs were genocided */ initedog(mtmp); } initedog(mtmp) register struct monst *mtmp; { mtmp->mtame = mtmp->mpeaceful = 1; EDOG(mtmp)->hungrytime = 1000 + moves; EDOG(mtmp)->eattime = 0; EDOG(mtmp)->droptime = 0; EDOG(mtmp)->dropdist = 10000; EDOG(mtmp)->apport = 10; EDOG(mtmp)->whistletime = 0; } /* attach the monsters that went down (or up) together with @ */ struct monst *mydogs = 0; struct monst *fallen_down = 0; /* monsters that fell through a trapdoor */ losedogs(){ register struct monst *mtmp; while(mtmp = mydogs){ mydogs = mtmp->nmon; mtmp->nmon = fmon; fmon = mtmp; mnexto(mtmp); } while(mtmp = fallen_down){ fallen_down = mtmp->nmon; mtmp->nmon = fmon; fmon = mtmp; rloc(mtmp); } } keepdogs(){ register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->mtame) { if(dist(mtmp->mx,mtmp->my) > 2) { mtmp->mtame = 0; /* dog becomes wild */ mtmp->mpeaceful = 0; continue; } relmon(mtmp); mtmp->nmon = mydogs; mydogs = mtmp; unpmon(mtmp); keepdogs(); /* we destroyed the link, so use recursion */ return; /* (admittedly somewhat primitive) */ } } fall_down(mtmp) register struct monst *mtmp; { relmon(mtmp); mtmp->nmon = fallen_down; fallen_down = mtmp; unpmon(mtmp); mtmp->mtame = 0; } /* return quality of food; the lower the better */ #define DOGFOOD 0 #define CADAVER 1 #define ACCFOOD 2 #define MANFOOD 3 #define APPORT 4 #define POISON 5 #define UNDEF 6 dogfood(obj) register struct obj *obj; { switch(obj->olet) { case FOOD_SYM: return( (obj->otyp == TRIPE_RATION) ? DOGFOOD : (obj->otyp < CARROT) ? ACCFOOD : (obj->otyp < CORPSE) ? MANFOOD : (index(POISONOUS, obj->spe) || obj->age + 50 <= moves || obj->otyp == DEAD_COCKATRICE) ? POISON : CADAVER ); default: if(!obj->cursed) return(APPORT); /* fall into next case */ case BALL_SYM: case CHAIN_SYM: case ROCK_SYM: return(UNDEF); } } /* return 0 (no move), 1 (move) or 2 (dead) */ dog_move(mtmp, after) register struct monst *mtmp; { register int nx,ny,omx,omy,appr,nearer,j; int udist,chi,i,whappr; register struct monst *mtmp2; register struct permonst *mdat = mtmp->data; register struct edog *edog = EDOG(mtmp); struct obj *obj; struct gen *trap; xchar cnt,chcnt,nix,niy; schar dogroom,uroom; xchar gx,gy,gtyp,otyp; /* current goal */ coord poss[9]; int info[9]; #define GDIST(x,y) ((x-gx)*(x-gx) + (y-gy)*(y-gy)) #define DDIST(x,y) ((x-omx)*(x-omx) + (y-omy)*(y-omy)) if(moves <= edog->eattime) return(0); /* dog is still eating */ omx = mtmp->mx; omy = mtmp->my; whappr = (moves - EDOG(mtmp)->whistletime < 5); if(moves > edog->hungrytime + 500 && !mtmp->mconf){ mtmp->mconf = 1; mtmp->orig_hp /= 3; if(mtmp->mhp > mtmp->orig_hp) mtmp->mhp = mtmp->orig_hp; if(cansee(omx,omy)) pline("%s is confused from hunger", Monnam(mtmp)); else pline("You feel worried about %s.", monnam(mtmp)); } else if(moves > edog->hungrytime + 750 || mtmp->mhp < 1){ if(cansee(omx,omy)) pline("%s dies from hunger", Monnam(mtmp)); else pline("You have a sad feeling for a moment, then it passes"); mondied(mtmp); return(2); } dogroom = inroom(omx,omy); uroom = inroom(u.ux,u.uy); udist = dist(omx,omy); /* if we are carrying sth then we drop it (perhaps near @) */ /* Note: if apport == 1 then our behaviour is independent of udist */ if(mtmp->minvent){ if(!rn2(udist) || !rn2((int) edog->apport)) if(rn2(10) < edog->apport){ relobj(mtmp,0); if(edog->apport > 1) edog->apport--; } } else { if(obj = o_at(omx,omy)) if(!index("0_", obj->olet)){ if((otyp = dogfood(obj)) <= CADAVER){ nix = omx; niy = omy; goto eatobj; } if(obj->owt < 10*mtmp->data->mlevel) if(rn2(20) < edog->apport+3) if(rn2(udist) || !rn2((int) edog->apport)){ freeobj(obj); unpobj(obj); /* if(levl[omx][omy].scrsym == obj->olet) newsym(omx,omy); */ mpickobj(mtmp,obj); } } } /* first we look for food */ gtyp = UNDEF; /* no goal as yet */ #ifdef LINT gx = gy = 0; #endif LINT for(obj = fobj; obj; obj = obj->nobj) { otyp = dogfood(obj); if(otyp > gtyp || otyp == UNDEF) continue; if(inroom(obj->ox,obj->oy) != dogroom) continue; if(otyp < MANFOOD && (dogroom >= 0 || DDIST(obj->ox,obj->oy) < 10)) { if(otyp < gtyp || (otyp == gtyp && DDIST(obj->ox,obj->oy) < DDIST(gx,gy))){ gx = obj->ox; gy = obj->oy; gtyp = otyp; } } else if(gtyp == UNDEF && dogroom >= 0 && uroom == dogroom && !mtmp->minvent && edog->apport > rn2(8)){ gx = obj->ox; gy = obj->oy; gtyp = APPORT; } } if(gtyp == UNDEF || (gtyp != DOGFOOD && gtyp != APPORT && moves < edog->hungrytime)){ if(dogroom < 0 || dogroom == uroom){ gx = u.ux; gy = u.uy; #ifndef QUEST } else { int tmp = rooms[dogroom].fdoor; cnt = rooms[dogroom].doorct; gx = gy = FAR; /* random, far away */ while(cnt--){ if(dist(gx,gy) > dist(doors[tmp].x, doors[tmp].y)){ gx = doors[tmp].x; gy = doors[tmp].y; } tmp++; } /* here gx == FAR e.g. when dog is in a vault */ if(gx == FAR || (gx == omx && gy == omy)){ gx = u.ux; gy = u.uy; } #endif QUEST } appr = (udist >= 9) ? 1 : (mtmp->mflee) ? -1 : 0; if(after && udist <= 4 && gx == u.ux && gy == u.uy) return(0); if(udist > 1){ if(levl[u.ux][u.uy].typ < ROOM || !rn2(4) || whappr || (mtmp->minvent && rn2((int) edog->apport))) appr = 1; } /* if you have dog food he'll follow you more closely */ if(appr == 0){ obj = invent; while(obj){ if(obj->otyp == TRIPE_RATION){ appr = 1; break; } obj = obj->nobj; } } } else appr = 1; /* gtyp != UNDEF */ if(mtmp->mconf) appr = 0; #ifdef TRACK if(gx == u.ux && gy == u.uy && (dogroom != uroom || dogroom < 0)){ extern coord *gettrack(); register coord *cp; cp = gettrack(omx,omy); if(cp){ gx = cp->x; gy = cp->y; } } #endif TRACK nix = omx; niy = omy; cnt = mfndpos(mtmp,poss,info,ALLOW_M | ALLOW_TRAPS); chcnt = 0; chi = -1; for(i=0; i<cnt; i++){ nx = poss[i].x; ny = poss[i].y; if(info[i] & ALLOW_M){ mtmp2 = m_at(nx,ny); if(mtmp2->data->mlevel >= mdat->mlevel+2 || mtmp2->data->mlet == 'c') continue; if(after) return(0); /* hit only once each move */ if(hitmm(mtmp, mtmp2) == 1 && rn2(4) && mtmp2->mlstmv != moves && hitmm(mtmp2,mtmp) == 2) return(2); return(0); } /* dog avoids traps */ /* but perhaps we have to pass a trap in order to follow @ */ if((info[i] & ALLOW_TRAPS) && (trap = g_at(nx,ny,ftrap))){ if(!(trap->gflag & SEEN) && rn2(40)) continue; if(rn2(10)) continue; } /* dog eschewes cursed objects */ /* but likes dog food */ obj = fobj; while(obj){ if(obj->ox != nx || obj->oy != ny) goto nextobj; if(obj->cursed) goto nxti; if(obj->olet == FOOD_SYM && (otyp = dogfood(obj)) < MANFOOD && (otyp < ACCFOOD || edog->hungrytime <= moves)){ /* Note: our dog likes the food so much that he might eat it even when it conceals a cursed object */ nix = nx; niy = ny; chi = i; eatobj: edog->eattime = moves + obj->quan * objects[obj->otyp].oc_delay; edog->hungrytime = moves + 5*obj->quan * objects[obj->otyp].nutrition; mtmp->mconf = 0; if(cansee(nix,niy)) pline("%s ate %s.", Monnam(mtmp), doname(obj)); /* perhaps this was a reward */ if(otyp != CADAVER) edog->apport += 200/(edog->dropdist+moves-edog->droptime); delobj(obj); goto newdogpos; } nextobj: obj = obj->nobj; } for(j=0; j<MTSZ && j<cnt-1; j++) if(nx == mtmp->mtrack[j].x && ny == mtmp->mtrack[j].y) if(rn2(4*(cnt-j))) goto nxti; /* Some stupid C compilers cannot compute the whole expression at once. */ nearer = GDIST(nx,ny); nearer -= GDIST(nix,niy); nearer *= appr; if((nearer == 0 && !rn2(++chcnt)) || nearer<0 || (nearer > 0 && !whappr && ((omx == nix && omy == niy && !rn2(3)) || !rn2(12)) )){ nix = nx; niy = ny; if(nearer < 0) chcnt = 0; chi = i; } nxti: ; } newdogpos: if(nix != omx || niy != omy){ if(info[chi] & ALLOW_U){ (void) hitu(mtmp, d(mdat->damn, mdat->damd)+1); return(0); } mtmp->mx = nix; mtmp->my = niy; for(j=MTSZ-1; j>0; j--) mtmp->mtrack[j] = mtmp->mtrack[j-1]; mtmp->mtrack[0].x = omx; mtmp->mtrack[0].y = omy; } if(mintrap(mtmp) == 2) /* he died */ return(2); pmon(mtmp); return(1); } /* return roomnumber or -1 */ inroom(x,y) xchar x,y; { #ifndef QUEST register struct mkroom *croom = &rooms[0]; while(croom->hx >= 0){ if(croom->hx >= x-1 && croom->lx <= x+1 && croom->hy >= y-1 && croom->ly <= y+1) return(croom - rooms); croom++; } #endif QUEST return(-1); /* not in room or on door */ } tamedog(mtmp, obj) register struct monst *mtmp; register struct obj *obj; { register struct monst *mtmp2; if(mtmp->mtame || mtmp->mfroz || #ifndef NOWORM mtmp->wormno || #endif NOWORM mtmp->isshk || mtmp->isgd) return(0); /* no tame long worms? */ if(obj) { if(dogfood(obj) >= MANFOOD) return(0); if(cansee(mtmp->mx,mtmp->my)){ pline("%s devours the %s.", Monnam(mtmp), objects[obj->otyp].oc_name); } obfree(obj, (struct obj *) 0); } mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth); *mtmp2 = *mtmp; mtmp2->mxlth = sizeof(struct edog); if(mtmp->mnamelth) (void) strcpy(NAME(mtmp2), NAME(mtmp)); initedog(mtmp2); replmon(mtmp,mtmp2); return(1); } #file hack.do_name.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.do_name.c version 1.0.1 - correction in call of xname() */ #include "hack.h" #include <stdio.h> extern int mousex; extern int mousey; coord getpos(force,goal) int force; char *goal; { register int cx,cy,i,c; extern char sdir[]; /* defined in hack.c */ extern schar xdir[], ydir[]; /* idem */ extern char *visctrl(); /* see below */ coord cc; pline("(For instructions type a ?)"); cx = u.ux; cy = u.uy; curs(cx,cy+2); while((c = readchar()) != '.'){ for(i=0; i<8; i++) if(sdir[i] == c){ if(1 <= cx + xdir[i] && cx + xdir[i] <= COLNO) cx += xdir[i]; if(0 <= cy + ydir[i] && cy + ydir[i] <= ROWNO-1) cy += ydir[i]; goto nxtc; } if(c == '?'){ pline("Use [hjkl] to move the cursor to %s.", goal); pline("Type a . when you are at the right place."); } else if (c == MDOWN) { cx = mousex; cy = mousey-2; } else if (c == MUP) { cx = mousex; cy = mousey-2; break; } else { pline("unknown direction: '%s' (%s)", visctrl(c), force ? "use hjkl or ." : "aborted"); if(force) goto nxtc; cc.x = -1; cc.y = 0; return(cc); } nxtc: ; curs(cx,cy+2); } cc.x = cx; cc.y = cy; return(cc); } do_mname(){ char buf[BUFSZ]; coord cc; register int cx,cy,lth,i; register struct monst *mtmp, *mtmp2; extern char *lmonnam(); cc = getpos(0, "the monster you want to name"); cx = cc.x; cy = cc.y; if(cx < 0) return(0); mtmp = m_at(cx,cy); if(!mtmp){ if(cx == u.ux && cy == u.uy){ extern char plname[]; pline("This ugly monster is called %s and cannot be renamed.", plname); } else pline("There is no monster there."); return(1); } if(mtmp->mimic){ pline("I see no monster there."); return(1); } if(!cansee(cx,cy)) { pline("I cannot see a monster there."); return(1); } pline("What do you want to call %s? ", lmonnam(mtmp)); getlin(buf); clrlin(); if(!*buf) return(1); lth = strlen(buf)+1; if(lth > 63){ buf[62] = 0; lth = 63; } mtmp2 = newmonst(mtmp->mxlth + lth); *mtmp2 = *mtmp; for(i=0; i<mtmp->mxlth; i++) ((char *) mtmp2->mextra)[i] = ((char *) mtmp->mextra)[i]; mtmp2->mnamelth = lth; (void) strcpy(NAME(mtmp2), buf); replmon(mtmp,mtmp2); if(mtmp2->isshk) setshk(); /* redefine shopkeeper and bill */ if(mtmp2->isgd) setgd( /* mtmp2 */ ); return(1); } /* * This routine changes the address of obj . Be careful not to call it * when there might be pointers around in unknown places. For now: only * when obj is in the inventory. */ do_oname(obj) register struct obj *obj; { register struct obj *otmp, *otmp2; register int lth; char buf[BUFSZ]; pline("What do you want to name %s? ", doname(obj)); getlin(buf); clrlin(); if(!*buf) return; lth = strlen(buf)+1; if(lth > 63){ buf[62] = 0; lth = 63; } otmp2 = newobj(lth); *otmp2 = *obj; otmp2->onamelth = lth; (void) strcpy(ONAME(otmp2), buf); setworn((struct obj *) 0, obj->owornmask); setworn(otmp2, otmp2->owornmask); /* do freeinv(obj); etc. by hand in order to preserve the position of this object in the inventory */ if(obj == invent) invent = otmp2; else for(otmp = invent; ; otmp = otmp->nobj){ if(!otmp) panic("Do_oname: cannot find obj."); if(otmp->nobj == obj){ otmp->nobj = otmp2; break; } } /* obfree(obj, otmp2); /* now unnecessary: no pointers on bill */ free((char *) obj); /* let us hope nobody else saved a pointer */ } ddocall() { register struct obj *obj; pline("Do you want to name an individual object? [yn] "); if(readchar() == 'y'){ obj = getobj("#", "name"); if(obj) do_oname(obj); } else { obj = getobj("?!=/", "call"); if(obj) docall(obj); } return(0); } docall(obj) register struct obj *obj; { char buf[BUFSZ]; register char **str1; extern char *xname(); struct obj otemp; register char *str; otemp = *obj; otemp.quan = 1; str = xname(&otemp); pline("Call %s %s: ", index(vowels,*str) ? "an" : "a", str); getlin(buf); clrlin(); if(!*buf) return; str = newstring(strlen(buf)+1); (void) strcpy(str,buf); str1 = &(objects[obj->otyp].oc_uname); if(*str1) free(*str1); *str1 = str; } char * xmonnam(mtmp, vb) register struct monst *mtmp; int vb; { static char buf[BUFSZ]; /* %% */ extern char *shkname(); if(mtmp->mnamelth && !vb) { (void) strcpy(buf, NAME(mtmp)); return(buf); } switch(mtmp->data->mlet) { case ' ': (void) sprintf(buf, "%s's ghost", (char *) mtmp->mextra); break; case '@': if(mtmp->isshk) { (void) strcpy(buf, shkname()); break; } /* fall into next case */ default: (void) sprintf(buf, "the %s%s", mtmp->minvis ? "invisible " : "", mtmp->data->mname); } if(vb && mtmp->mnamelth) { (void) strcat(buf, " called "); (void) strcat(buf, NAME(mtmp)); } return(buf); } char * lmonnam(mtmp) register struct monst *mtmp; { return(xmonnam(mtmp, 1)); } char * monnam(mtmp) register struct monst *mtmp; { return(xmonnam(mtmp, 0)); } char * Monnam(mtmp) register struct monst *mtmp; { register char *bp = monnam(mtmp); if('a' <= *bp && *bp <= 'z') *bp += ('A' - 'a'); return(bp); } char * amonnam(mtmp,adj) register struct monst *mtmp; register char *adj; { register char *bp = monnam(mtmp); static char buf[BUFSZ]; /* %% */ if(!strncmp(bp, "the ", 4)) bp += 4; (void) sprintf(buf, "the %s %s", adj, bp); return(buf); } char * Amonnam(mtmp, adj) register struct monst *mtmp; register char *adj; { register char *bp = amonnam(mtmp,adj); *bp = 'T'; return(bp); } char * Xmonnam(mtmp) register struct monst *mtmp; { register char *bp = Monnam(mtmp); if(!strncmp(bp, "The ", 4)) { bp += 2; *bp = 'A'; } return(bp); } char * visctrl(c) char c; { static char ccc[3]; if(c < 040) { ccc[0] = '^'; ccc[1] = c + 0100; ccc[2] = 0; } else { ccc[0] = c; ccc[1] = 0; } return(ccc); } #file hack.do_wear.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.do_wear.c version 1.0.1 - changed an int to long */ #include "hack.h" #include <stdio.h> extern char *nomovemsg; off_msg(otmp) register struct obj *otmp; { pline("You were wearing %s.", doname(otmp)); } doremarm() { register struct obj *otmp; if(!uarm && !uarmh && !uarms && !uarmg) { pline("Not wearing any armor."); return(0); } otmp = (!uarmh && !uarms && !uarmg) ? uarm : (!uarms && !uarm && !uarmg) ? uarmh : (!uarmh && !uarm && !uarmg) ? uarms : (!uarmh && !uarm && !uarms) ? uarmg : getobj("[", "take off"); if(!otmp) return(0); if(!(otmp->owornmask & (W_ARMOR - W_ARM2))) { pline("You can't take that off."); return(0); } (void) armoroff(otmp); return(1); } doremring() { if(!uleft && !uright){ pline("Not wearing any ring."); return(0); } if(!uleft) return(dorr(uright)); if(!uright) return(dorr(uleft)); if(uleft && uright) while(1) { pline("What ring, Right or Left? "); switch(readchar()) { case ' ': case '\n': case '\033': return(0); case 'l': case 'L': return(dorr(uleft)); case 'r': case 'R': return(dorr(uright)); } } /* NOTREACHED */ #ifdef lint return(0); #endif lint } dorr(otmp) register struct obj *otmp; { if(cursed(otmp)) return(0); ringoff(otmp); off_msg(otmp); return(1); } cursed(otmp) register struct obj *otmp; { if(otmp->cursed){ pline("You can't. It appears to be cursed."); return(1); } return(0); } armoroff(otmp) register struct obj *otmp; { register int delay = -objects[otmp->otyp].oc_delay; if(cursed(otmp)) return(0); setworn((struct obj *) 0, otmp->owornmask & W_ARMOR); if(delay) { nomul(delay); switch(otmp->otyp) { case HELMET: nomovemsg = "You finished taking off your helmet."; break; case PAIR_OF_GLOVES: nomovemsg = "You finished taking off your gloves"; break; default: nomovemsg = "You finished taking off your suit."; } } else { off_msg(otmp); } return(1); } doweararm() { register struct obj *otmp; register int delay; register int err = 0; long mask = 0; otmp = getobj("[", "wear"); if(!otmp) return(0); if(otmp->owornmask & W_ARMOR) { pline("You are already wearing that!"); return(0); } if(otmp->otyp == HELMET){ if(uarmh) { pline("You are already wearing a helmet."); err++; } else mask = W_ARMH; } else if(otmp->otyp == SHIELD){ if(uarms) pline("You are already wearing a shield."), err++; if(uwep && uwep->otyp == TWO_HANDED_SWORD) pline("You cannot wear a shield and wield a two-handed sword."), err++; if(!err) mask = W_ARMS; } else if(otmp->otyp == PAIR_OF_GLOVES){ if(uarmg) pline("You are already wearing gloves."); else if(uwep && uwep->cursed) pline("You cannot wear gloves over your weapon."); else mask = W_ARMG; } else { if(uarm) { if(otmp->otyp != ELVEN_CLOAK || uarm2) { pline("You are already wearing some armor."); err++; } } if(!err) mask = W_ARM; } if(err) return(0); setworn(otmp, mask); if(otmp == uwep) setuwep((struct obj *) 0); delay = -objects[otmp->otyp].oc_delay; if(delay){ nomul(delay); nomovemsg = "You finished your dressing manoeuvre."; } otmp->known = 1; return(1); } dowearring() { register struct obj *otmp; long mask = 0; long oldprop; if(uleft && uright){ pline("There are no more ring-fingers to fill."); return(0); } otmp = getobj("=", "wear"); if(!otmp) return(0); if(otmp->owornmask & W_RING) { pline("You are already wearing that!"); return(0); } if(otmp == uleft || otmp == uright) { pline("You are already wearing that."); return(0); } if(uleft) mask = RIGHT_RING; else if(uright) mask = LEFT_RING; else do { pline("What ring-finger, Right or Left? "); switch(readchar()){ case 'l': case 'L': mask = LEFT_RING; break; case 'r': case 'R': mask = RIGHT_RING; break; case ' ': case '\n': case '\033': return(0); } } while(!mask); setworn(otmp, mask); if(otmp == uwep) setuwep((struct obj *) 0); oldprop = u.uprops[PROP(otmp->otyp)].p_flgs; u.uprops[PROP(otmp->otyp)].p_flgs |= mask; switch(otmp->otyp){ case RIN_LEVITATION: if(!oldprop) float_up(); break; case RIN_PROT_SHAPE_CHANGERS: rescham(); break; case RIN_GAIN_STRENGTH: u.ustr += otmp->spe; u.ustrmax += otmp->spe; flags.botl=1; break; case RIN_INCREASE_DAMAGE: u.udaminc += otmp->spe; break; } prinv(otmp); return(1); } ringoff(obj) register struct obj *obj; { register long mask; mask = obj->owornmask & W_RING; setworn((struct obj *) 0, obj->owornmask); if(!(u.uprops[PROP(obj->otyp)].p_flgs & mask)){ pline("Strange... I didnt know you had that ring."); impossible(); } u.uprops[PROP(obj->otyp)].p_flgs &= ~mask; switch(obj->otyp) { case RIN_LEVITATION: if(!Levitation) { /* no longer floating */ float_down(); } break; case RIN_GAIN_STRENGTH: u.ustr -= obj->spe; u.ustrmax -= obj->spe; flags.botl = 1; break; case RIN_INCREASE_DAMAGE: u.udaminc -= obj->spe; break; } } find_ac(){ register int uac = 10; if(uarm) uac -= uarm->spe; if(uarm2) uac -= uarm2->spe; if(uarmh) uac -= uarmh->spe; if(uarms) uac -= uarms->spe; if(uarmg) uac -= uarmg->spe; if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe; if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe; if(uac != u.uac){ u.uac = uac; flags.botl = 1; } } glibr(){ register struct obj *otmp; int xfl = 0; if(!uarmg) if(uleft || uright) { /* Note: at present also cursed rings fall off */ pline("Your %s off your fingers.", (uleft && uright) ? "rings slip" : "ring slips"); xfl++; if(otmp = uleft){ ringoff(uleft); dropx(otmp); } if(otmp = uright){ ringoff(uright); dropx(otmp); } } if(otmp = uwep){ /* Note: at present also cursed weapons fall */ setuwep((struct obj *) 0); dropx(otmp); pline("Your weapon %sslips from your hands.", xfl ? "also " : ""); } } struct obj * some_armor(){ register struct obj *otmph = uarm; if(uarmh && (!otmph || !rn2(4))) otmph = uarmh; if(uarmg && (!otmph || !rn2(4))) otmph = uarmg; if(uarms && (!otmph || !rn2(4))) otmph = uarms; return(otmph); } corrode_armor(){ register struct obj *otmph = some_armor(); if(otmph){ if(otmph->rustfree || otmph->otyp == ELVEN_CLOAK || otmph->otyp == LEATHER_ARMOR || otmph->otyp == STUDDED_LEATHER_ARMOR) { pline("Your %s not affected!", aobjnam(otmph, "are")); return; } pline("Your %s!", aobjnam(otmph, "corrode")); otmph->spe--; } } #file hack.eat.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.eat.c version 1.0.1 - added morehungry() and FAINTED */ #include "hack.h" char POISONOUS[] = "ADKSVabhks"; extern char *nomovemsg; extern int (*afternmv)(); /* hunger texts used on bottom line (each 8 chars long) */ #define SATIATED 0 #define NOT_HUNGRY 1 #define HUNGRY 2 #define WEAK 3 #define FAINTING 4 #define FAINTED 5 #define STARVED 6 char *hu_stat[] = { "Satiated", " ", "Hungry ", "Weak ", "Fainting", "Fainted ", "Starved " }; init_uhunger(){ u.uhunger = 900; u.uhs = NOT_HUNGRY; } struct { char *txt; int nut; } tintxts[] = { {"It contains first quality peaches - what a surprise!", 40}, {"It contains salmon - not bad!", 60}, {"It contains apple juice - perhaps not what you hoped for.", 20}, {"It contains some nondescript substance, tasting awfully.", 500}, {"It contains rotten meat. You vomit.", -50}, {"It turns out to be empty.", 0} }; tinopen(){ #define TTSZ (sizeof(tintxts)/sizeof(tintxts[0])) register int r = rn2(2*TTSZ); if(r < TTSZ){ pline(tintxts[r].txt); lesshungry(tintxts[r].nut); if(r == 1) /* SALMON */ { Glib = rnd(15); pline("Eating salmon made your fingers very slippery."); } } else { pline("It contains spinach - this makes you feel like Popeye!"); lesshungry(600); if(u.ustr < 118) u.ustr += rnd( ((u.ustr < 17) ? 19 : 118) - u.ustr); if(u.ustr > u.ustrmax) u.ustrmax = u.ustr; flags.botl = 1; } } Meatdone(){ u.usym = '@'; prme(); } doeat(){ register struct obj *otmp; register struct objclass *ftmp; register int tmp; otmp = getobj("%", "eat"); if(!otmp) return(0); if(otmp->otyp == TIN){ if(uwep && (uwep->otyp == AXE || uwep->otyp == DAGGER || uwep->otyp == CRYSKNIFE)){ pline("Using your %s you try to open the tin", aobjnam(uwep, (char *) 0)); tmp = 3; } else { pline("It is not so easy to open this tin."); if(Glib) { pline("The tin slips out of your hands."); dropx(otmp); return(1); } if(otmp->quan > 1) { register struct obj *obj; extern struct obj *splitobj(); obj = splitobj(otmp, 1); if(otmp == uwep) setuwep(obj); } tmp = 2 + rn2(1 + 500/((int)(u.ulevel + u.ustr))); } if(tmp > 50){ nomul(-50); nomovemsg="You give up your attempt to open the tin."; } else { nomul(-tmp); nomovemsg = "You succeed in opening the tin."; afternmv = tinopen; useup(otmp); } return(1); } ftmp = &objects[otmp->otyp]; if(otmp->otyp >= CORPSE && eatcorpse(otmp)) goto eatx; if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE) { pline("Blecch! Rotten food!"); if(!rn2(4)) { pline("You feel rather light headed."); Confusion += d(2,4); } else if(!rn2(4)&& !Blind) { pline("Everything suddenly goes dark."); Blind = d(2,10); seeoff(0); } else if(!rn2(3)) { if(Blind) pline("The world spins and you slap against the floor."); else pline("The world spins and goes dark."); nomul(-rnd(10)); nomovemsg = "You are conscious again."; } lesshungry(ftmp->nutrition / 4); } else { multi = -ftmp->oc_delay; if(u.uhunger >= 1500) { pline("You choke over your food."); pline("You die..."); killer = ftmp->oc_name; done("choked"); } switch(otmp->otyp){ case FOOD_RATION: if(u.uhunger <= 200) pline("That food really hit the spot!"); else if(u.uhunger <= 700) pline("That satiated your stomach!"); else { pline("You're having a hard time getting all that food down."); multi -= 2; } lesshungry(ftmp->nutrition); if(multi < 0) nomovemsg = "You finished your meal."; break; case TRIPE_RATION: pline("Yak - dog food!"); u.uexp++; u.urexp += 4; flags.botl = 1; if(rn2(2)){ pline("You vomit."); morehungry(20); } else lesshungry(ftmp->nutrition); break; default: if(otmp->otyp >= CORPSE) pline("That %s tasted terrible!",ftmp->oc_name); else pline("That %s was delicious!",ftmp->oc_name); lesshungry(ftmp->nutrition); #ifdef QUEST if(otmp->otyp == CARROT && !Blind){ u.uhorizon++; setsee(); pline("Your vision improves."); } #endif QUEST if(otmp->otyp == FORTUNE_COOKIE) { if(Blind) { pline("This cookie has a scrap of paper inside!"); pline("What a pity, that you cannot read it!"); } else outrumor(); } break; } } eatx: if(multi<0 && !nomovemsg){ static char msgbuf[BUFSZ]; (void) sprintf(msgbuf, "You finished eating the %s.", ftmp->oc_name); nomovemsg = msgbuf; } useup(otmp); return(1); } /* called in hack.main.c */ gethungry(){ --u.uhunger; if((Regeneration || Hunger) && moves%2) u.uhunger--; newuhs(TRUE); } /* called after vomiting and after performing feats of magic */ morehungry(num) register int num; { u.uhunger -= num; newuhs(TRUE); } /* called after eating something (and after drinking fruit juice) */ lesshungry(num) register int num; { u.uhunger += num; newuhs(FALSE); } unfaint(){ u.uhs = FAINTING; flags.botl = 1; } newuhs(incr) boolean incr; { register int newhs, h = u.uhunger; newhs = (h > 1000) ? SATIATED : (h > 150) ? NOT_HUNGRY : (h > 50) ? HUNGRY : (h > 0) ? WEAK : FAINTING; if(newhs == FAINTING) { if(u.uhs == FAINTED) newhs = FAINTED; if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) { if(u.uhs != FAINTED && multi >= 0 /* %% */) { pline("You faint from lack of food."); nomul(-10+(u.uhunger/10)); nomovemsg = "You regain consciousness."; afternmv = unfaint; newhs = FAINTED; } } else if(u.uhunger < -(int)(200 + 25*u.ulevel)) { u.uhs = STARVED; flags.botl = 1; bot(); pline("You die from starvation."); done("starved"); } } if(newhs != u.uhs) { if(newhs >= WEAK && u.uhs < WEAK) losestr(1); else if(newhs < WEAK && u.uhs >= WEAK && u.ustr < u.ustrmax) losestr(-1); switch(newhs){ case HUNGRY: pline((!incr) ? "You only feel hungry now." : (u.uhunger < 145) ? "You feel hungry." : "You are beginning to feel hungry."); break; case WEAK: pline((!incr) ? "You feel weak now." : (u.uhunger < 45) ? "You feel weak." : "You are beginning to feel weak."); break; } u.uhs = newhs; flags.botl = 1; } } /* returns 1 if some text was printed */ eatcorpse(otmp) register struct obj *otmp; { register schar let = otmp->spe; register int tp = 0; if(moves > otmp->age + 50 + rn2(100)) { tp++; pline("Ulch -- that meat was tainted!"); pline("You get very sick."); Sick = 10 + rn2(10); u.usick_cause = objects[otmp->otyp].oc_name; } else if(index(POISONOUS, let) && rn2(5)){ tp++; pline("Ecch -- that must have been poisonous!"); if(!Poison_resistance){ losehp(rnd(15), "poisonous corpse"); losestr(rnd(4)); } else pline("You don't seem affected by the poison."); } else if(index("ELNOPQRUuxz", let) && rn2(5)){ tp++; pline("You feel sick."); losehp(rnd(8), "cadaver"); } switch(let) { case 'L': case 'N': case 't': Teleportation |= INTRINSIC; break; case 'W': pluslvl(); break; case 'n': u.uhp = u.uhpmax; flags.botl = 1; /* fall into next case */ case '@': pline("You cannibal! You will be sorry for this!"); /* not tp++; */ /* fall into next case */ case 'd': Aggravate_monster |= INTRINSIC; break; case 'I': See_invisible |= INTRINSIC; if(!Invis) newsym(u.ux, u.uy); Invis += 50; /* fall into next case */ case 'y': #ifdef QUEST u.uhorizon++; #endif QUEST /* fall into next case */ case 'B': Confusion = 50; break; case 'D': Fire_resistance |= INTRINSIC; break; case 'E': Telepat |= INTRINSIC; break; case 'F': case 'Y': Cold_resistance |= INTRINSIC; break; case 'k': case 's': Poison_resistance |= INTRINSIC; break; case 'c': pline("You turn to stone."); killer = "dead cockatrice"; done("died"); case 'M': pline("You cannot resist the temptation to mimic a treasure chest."); tp++; nomul(-30); afternmv = Meatdone; nomovemsg = "You now again prefer mimicking a human."; u.usym = '$'; prme(); break; } return(tp); } #file hack.end.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.end.c version 1.0.1 - added "escaped with amulet" */ #include "hack.h" #include <stdio.h> #include <fcntl.h> #include <signal.h> #define Sprintf (void) sprintf extern char plname[], pl_character[]; extern char *itoa(), *ordin(), *eos(), *getlogin(); extern char *index(); /* M.E.T. 11/20/85 */ xchar maxdlevel = 1; done1() { (void) signal(SIGINT,SIG_IGN); pline("Really quit?"); if(readchar() != 'y') { (void) signal(SIGINT,done1); clrlin(); (void) myfflush(stdout); if(multi > 0) nomul(0); return(0); } done("quit"); /* NOTREACHED */ } int done_stopprint; done_intr(){ done_stopprint++; (void) signal(SIGINT,SIG_IGN); } done_in_by(mtmp) register struct monst *mtmp; { static char buf[BUFSZ]; pline("You die ..."); if(mtmp->data->mlet == ' ') { Sprintf(buf, "the ghost of %s", (char *) mtmp->mextra); killer = buf; } else if(mtmp->mnamelth) { Sprintf(buf, "%s called %s", mtmp->data->mname, NAME(mtmp)); killer = buf; } else if(mtmp->minvis) { Sprintf(buf, "invisible %s", mtmp->data->mname); killer = buf; } else killer = mtmp->data->mname; done("died"); } /* called with arg "died", "escaped", "quit", "choked", "panic" or "starved" */ /* Be careful not to call panic from here! */ done(st1) register char *st1; { #ifdef WIZARD if(wizard && *st1 == 'd'){ u.ustr = u.ustrmax += 2; u.uhp = u.uhpmax += 10; if(uarm) uarm->spe++; if(uwep) uwep->spe++; /* NB: uwep need not be a weapon! */ u.uswldtim = 0; pline("For some reason you are still alive."); flags.move = 0; if(multi > 0) multi = 0; else multi = -1; flags.botl = 1; return; } #endif WIZARD (void) signal(SIGINT, done_intr); if(*st1 == 'q' && u.uhp < 1) { st1 = "died"; killer = "quit while already on Charon's boat"; } if(*st1 == 's') killer = "starvation"; paybill(); clearlocks(); if(index("cds", *st1)) { savebones(); if(!flags.notombstone) outrip(); else more(); } myprintf("Contents of your pack when you died:\n"); myddoinv(); settty((char *) 0); /* does a cls() */ if(!done_stopprint) myprintf("Goodbye %s %s...\n\n", pl_character, plname); { long int tmp; tmp = u.ugold - u.ugold0; if(tmp < 0) tmp = 0; if(*st1 == 'd') tmp -= tmp/10; else killer = st1; u.urexp += tmp; } if(*st1 == 'e') { extern struct monst *mydogs; register struct monst *mtmp = mydogs; register struct obj *otmp; register int i; register unsigned worthlessct = 0; killer = st1; u.urexp += 50 * maxdlevel; if(mtmp) { if(!done_stopprint) myprintf("You"); while(mtmp) { if(!done_stopprint) myprintf(" and %s", monnam(mtmp)); u.urexp += mtmp->mhp; mtmp = mtmp->nmon; } if(!done_stopprint) myprintf("\nescaped from the dungeon with %lu points,\n", u.urexp); } else if(!done_stopprint) myprintf("You escaped from the dungeon with %lu points,\n", u.urexp); for(otmp = invent; otmp; otmp = otmp->nobj) { if(otmp->olet == GEM_SYM){ objects[otmp->otyp].oc_name_known = 1; i = otmp->quan*objects[otmp->otyp].g_val; if(i == 0) { worthlessct += otmp->quan; continue; } u.urexp += i; if(!done_stopprint) myprintf("\t%s (worth %d Zorkmids),\n", doname(otmp), i); } else if(otmp->olet == AMULET_SYM) { otmp->known = 1; i = (otmp->spe < 0) ? 2 : 5000; u.urexp += i; if(!done_stopprint) myprintf("\t%s (worth %d Zorkmids),\n", doname(otmp), i); if(otmp->spe >= 0) { u.urexp *= 2; killer = "escaped (with amulet)"; } } } if(worthlessct) if(!done_stopprint) myprintf("\t%d worthless piece%s of coloured glass,\n", worthlessct, plur(worthlessct)); } else if(!done_stopprint) myprintf("You %s on dungeon level %d with %lu points,\n", st1,dlevel,u.urexp); if(!done_stopprint) myprintf("and %lu piece%s of gold, after %lu move%s.\n", u.ugold, (u.ugold == 1) ? "" : "s", moves, (moves == 1) ? "" : "s"); if(!done_stopprint) myprintf("You were level %d with a maximum of %d hit points when you %s.\n", u.ulevel, u.uhpmax, st1); if(*st1 == 'e'){ getret(); /* all those pieces of coloured glass ... */ cls(); } #ifdef WIZARD if(!wizard) #endif WIZARD topten(); if(done_stopprint) myprintf("\n\n"); hackexit(0); } #define newttentry() (struct toptenentry *) alloc(sizeof(struct toptenentry)) #define NAMSZ 8 #define DTHSZ 40 #define PERSMAX 1 #define POINTSMIN 1 /* must be > 0 */ #define ENTRYMAX 100 /* must be >= 10 */ struct toptenentry { struct toptenentry *tt_next; long int points; int level,maxlvl,hp,maxhp; char plchar; char str[NAMSZ+1]; char death[DTHSZ+1]; } *tt_head; topten(){ int rank, rank0 = -1, rank1 = 0; int occ_cnt = PERSMAX; register struct toptenentry *t0, *t1, *tprev; char *recfile = "record"; int rfile; register int flg = 0; if((rfile = open(recfile,O_RDONLY)) < 0) { myputs("Cannot open record file!"); return; } (void) myputchar('\n'); /* create a new 'topten' entry */ t0 = newttentry(); t0->level = dlevel; t0->maxlvl = maxdlevel; t0->hp = u.uhp; t0->maxhp = u.uhpmax; t0->points = u.urexp; t0->plchar = pl_character[0]; (void) strncpy(t0->str, plname, NAMSZ); (t0->str)[NAMSZ] = 0; (void) strncpy(t0->death, killer, DTHSZ); (t0->death)[DTHSZ] = 0; /* assure minimum number of points */ if(t0->points < POINTSMIN) t0->points = 0; t1 = tt_head = newttentry(); tprev = 0; /* rank0: -1 undefined, 0 not_on_list, n n_th on list */ for(rank = 1; ; ) { if (read(rfile, t1, sizeof(struct toptenentry)) != sizeof(struct toptenentry) || (t1->points < POINTSMIN)) t1->points = 0; if(rank0 < 0 && t1->points < t0->points) { rank0 = rank++; if(tprev == 0) tt_head = t0; else tprev->tt_next = t0; t0->tt_next = t1; occ_cnt--; flg++; /* ask for a rewrite */ } else tprev = t1; if(t1->points == 0) break; if(strncmp(t1->str, t0->str, NAMSZ) == 0 && t1->plchar == t0->plchar && --occ_cnt <= 0){ if(rank0 < 0){ rank0 = 0; rank1 = rank; myprintf("You didn't beat your previous score of %ld points.\n\n", t1->points); } if(occ_cnt < 0){ flg++; continue; } } if(rank <= ENTRYMAX){ t1 = t1->tt_next = newttentry(); rank++; } if(rank > ENTRYMAX){ t1->points = 0; break; } } if(flg) { /* rewrite record file */ (void) close(rfile); if((rfile=open(recfile,O_WRONLY)) < 0) { myputs("Cannot write record file\n"); return; } if(!done_stopprint) if(rank0 > 0){ if(rank0 <= 10) myputs("You made the top ten list!\n"); else myprintf("You reached the %d%s place on the top %d list.\n\n", rank0, ordin(rank0), ENTRYMAX); } } if(rank0 == 0) rank0 = rank1; if(rank0 <= 0) rank0 = rank; if(!done_stopprint) outheader(); t1 = tt_head; for(rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) { if(flg) write(rfile, t1, sizeof(struct toptenentry)); if(done_stopprint) continue; if(rank > flags.end_top && (rank < rank0-flags.end_around || rank > rank0+flags.end_around) && (!flags.end_own || strncmp(t1->str, t0->str, NAMSZ))) continue; if(rank == rank0-flags.end_around && rank0 > flags.end_top+flags.end_around+1 && !flags.end_own) (void) putchar('\n'); if(rank != rank0) (void) outentry(rank, t1, 0); else if(!rank1) (void) outentry(rank, t1, 1); else { int t0lth = outentry(0, t0, -1); int t1lth = outentry(rank, t1, t0lth); if(t1lth > t0lth) t0lth = t1lth; (void) outentry(0, t0, t0lth); } } if(rank0 >= rank) (void) outentry(0, t0, 1); (void) close(rfile); /* 12nov85 djw */ getret(); } outheader() { char linebuf[BUFSZ]; register char *bp; (void) strcpy(linebuf, "Number Points Name"); bp = eos(linebuf); while(bp < linebuf + COLNO - 9) *bp++ = ' '; (void) strcpy(bp, "Hp [max]"); myputs(linebuf); } /* so>0: standout line; so=0: ordinary line; so<0: no output, return lth */ int outentry(rank,t1,so) register struct toptenentry *t1; { boolean quit = FALSE, killed = FALSE, starv = FALSE; char linebuf[BUFSZ]; linebuf[0] = 0; if(rank) Sprintf(eos(linebuf), "%3d", rank); else Sprintf(eos(linebuf), " "); Sprintf(eos(linebuf), " %6ld %8s", t1->points, t1->str); if(t1->plchar == 'X') Sprintf(eos(linebuf), " "); else Sprintf(eos(linebuf), "-%c ", t1->plchar); if(!strncmp("escaped", t1->death, 7)) { if(!strcmp(" (with amulet)", t1->death+7)) Sprintf(eos(linebuf), "escaped the dungeon with amulet"); else Sprintf(eos(linebuf), "escaped the dungeon [max level %d]", t1->maxlvl); } else { if(!strncmp(t1->death,"quit",4)) Sprintf(eos(linebuf), "quit"), quit = TRUE; else if(!strcmp(t1->death,"choked")) Sprintf(eos(linebuf), "choked in his food"); else if(!strncmp(t1->death,"starv",5)) Sprintf(eos(linebuf), "starved to death"), starv = TRUE; else Sprintf(eos(linebuf), "was killed"), killed = TRUE; Sprintf(eos(linebuf), " on%s level %d", (killed || starv) ? "" : " dungeon", t1->level); if(t1->maxlvl != t1->level) Sprintf(eos(linebuf), " [max %d]", t1->maxlvl); if(quit && t1->death[4]) Sprintf(eos(linebuf), t1->death + 4); } if(killed) Sprintf(eos(linebuf), " by %s%s", !strncmp(t1->death, "the ", 4) ? "" : index(vowels,*t1->death) ? "an " : "a ", t1->death); Sprintf(eos(linebuf), "."); if(t1->maxhp) { register char *bp = eos(linebuf); char hpbuf[10]; int hppos; Sprintf(hpbuf, (t1->hp > 0) ? itoa(t1->hp) : "-"); hppos = COLNO - 7 - strlen(hpbuf); if(bp <= linebuf + hppos) { while(bp < linebuf + hppos) *bp++ = ' '; (void) strcpy(bp, hpbuf); Sprintf(eos(bp), " [%d]", t1->maxhp); } } if(so == 0) myputs(linebuf); else if(so > 0) { register char *bp = eos(linebuf); if(so >= COLNO) so = COLNO-1; while(bp < linebuf + so) *bp++ = ' '; *bp = 0; standoutbeg(); myputs(linebuf); standoutend(); (void) myputchar('\n'); } return(strlen(linebuf)); } char * itoa(a) int a; { static char buf[12]; Sprintf(buf,"%d",a); return(buf); } char * ordin(n) int n; { register int d = n%10; return((d==0 || d>3 || n/10==1) ? "th" : (d==1) ? "st" : (d==2) ? "nd" : "rd"); } clearlocks(){ register int x; (void) signal(SIGHUP,SIG_IGN); for(x = 1; x <= maxdlevel; x++) { glo(x); (void) unlink(lock); /* not all levels need be present */ } *index(lock,'.') = 0; (void) unlink(lock); } #ifdef NOSAVEONHANGUP hangup(){ (void) signal(SIGINT,SIG_IGN); clearlocks(); hackexit(1); } #endif NOSAVEONHANGUP char * eos(s) register char *s; { while(*s) s++; return(s); } /* it is the callers responsibility to check that there is room for c */ charcat(s,c) register char *s, c; { while(*s) s++; *s++ = c; *s = 0; } prscore(argc,argv) int argc; char **argv; { extern char *hname; char *player0; char **players; int playerct; int rank; register struct toptenentry *t1; char *recfile = "record"; int rfile; register int flg = 0; register int i; if((rfile = open(recfile,O_RDONLY)) < 0) { myputs("Cannot open record file!"); return; } if(argc > 1 && !strncmp(argv[1], "-s", 2)){ if(!argv[1][2]){ argc--; argv++; } else if(!argv[1][3] && index("CFKSTWX", argv[1][2])) { argv[1]++; argv[1][0] = '-'; } else argv[1] += 2; } if(argc <= 1){ player0 = getlogin(); if(!player0) player0 = "player"; playerct = 1; players = &player0; } else { playerct = --argc; players = ++argv; } myputchar('\n'); t1 = tt_head = newttentry(); for(rank = 1; ; rank++) { if (read(rfile, t1, sizeof(struct toptenentry)) != sizeof(struct toptenentry)) t1->points = 0; if(t1->points == 0) break; for(i = 0; i < playerct; i++){ if(strcmp(players[i], "all") == 0 || strncmp(t1->str, players[i], NAMSZ) == 0 || (players[i][0] == '-' && players[i][1] == t1->plchar && players[i][2] == 0) || (digit(players[i][0]) && rank <= atoi(players[i]))) flg++; } t1 = t1->tt_next = newttentry(); } (void) close(rfile); if(!flg) { myprintf("Cannot find any entries for "); if(playerct > 1) myprintf("any of "); for(i=0; i<playerct; i++) myprintf("%s%s", players[i], (i<playerct-1)?", ":".\n"); myprintf("Call is: %s -s [playernames]\n", hname); return; } outheader(); t1 = tt_head; for(rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) { for(i = 0; i < playerct; i++){ if(strcmp(players[i], "all") == 0 || strncmp(t1->str, players[i], NAMSZ) == 0 || (players[i][0] == '-' && players[i][1] == t1->plchar && players[i][2] == 0) || (digit(players[i][0]) && rank <= atoi(players[i]))) goto out; } continue; out: (void) outentry(rank, t1, 0); } }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/04/86)
#file hack.engrave.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.engrave.c version 1.0.1 - corrected bug in rest_engravings(), added make_engr_at() */ #include "hack.h" extern char *nomovemsg; extern char nul[]; struct engr { struct engr *nxt_engr; char *engr_txt; xchar engr_x, engr_y; unsigned engr_lth; /* for save & restore; not length of text */ long engr_time; /* moment engraving was (will be) finished */ xchar engr_type; #define DUST 1 #define ENGRAVE 2 #define BURN 3 } *head_engr; struct engr * engr_at(x,y) register xchar x,y; { register struct engr *ep = head_engr; while(ep) { if(x == ep->engr_x && y == ep->engr_y) return(ep); ep = ep->nxt_engr; } return((struct engr *) 0); } sengr_at(s,x,y) register char *s; register xchar x,y; { register struct engr *ep = engr_at(x,y); register char *t; register int n; if(ep && ep->engr_time <= moves) { t = ep->engr_txt; /* if(!strcmp(s,t)) return(1); */ n = strlen(s); while(*t) { if(!strncmp(s,t,n)) return(1); t++; } } return(0); } wipe_engr_at(x,y,cnt) register xchar x,y,cnt; { register struct engr *ep = engr_at(x,y); register int lth,pos; char ch; if(ep){ if(ep->engr_type != DUST) { cnt = rn2(1 + 50/(cnt+1)) ? 0 : 1; } lth = strlen(ep->engr_txt); if(lth && cnt > 0 ) { while(cnt--) { pos = rn2(lth); if((ch = ep->engr_txt[pos]) == ' ') continue; ep->engr_txt[pos] = (ch != '?') ? '?' : ' '; } } while(lth && ep->engr_txt[lth-1] == ' ') ep->engr_txt[--lth] = 0; while(ep->engr_txt[0] == ' ') ep->engr_txt++; if(!ep->engr_txt[0]) del_engr(ep); } } read_engr_at(x,y) register int x,y; { register struct engr *ep = engr_at(x,y); if(ep && ep->engr_txt[0]) { switch(ep->engr_type) { case DUST: pline("Something is written here in the dust."); break; case ENGRAVE: pline("Something is engraved here on the floor."); break; case BURN: pline("Some text has been burned here in the floor."); break; default: pline("Something is written in a very strange way."); impossible(); } pline("You read: \"%s\".", ep->engr_txt); } } make_engr_at(x,y,s) register int x,y; register char *s; { register struct engr *ep; if(ep = engr_at(x,y)) del_engr(ep); ep = (struct engr *) alloc((unsigned)(sizeof(struct engr) + strlen(s) + 1)); ep->nxt_engr = head_engr; head_engr = ep; ep->engr_x = x; ep->engr_y = y; ep->engr_txt = (char *)(ep + 1); (void) strcpy(ep->engr_txt, s); ep->engr_time = 0; ep->engr_type = DUST; ep->engr_lth = strlen(s) + 1; } doengrave(){ register int len; register char *sp; register struct engr *ep, *oep = engr_at(u.ux,u.uy); char buf[BUFSZ]; xchar type; int spct; /* number of leading spaces */ register struct obj *otmp; multi = 0; if(u.uswallow) { pline("You're joking. Hahaha!"); /* riv05!a3 */ return(0); } /* one may write with finger, weapon or wand */ otmp = getobj("#-)/", "write with"); if(!otmp) return(0); if(otmp == (struct obj *)(1)) type = DUST; else if(otmp->otyp == WAN_FIRE && otmp->spe) { type = BURN; otmp->spe--; } else if(otmp->otyp == DAGGER || otmp->otyp == TWO_HANDED_SWORD || otmp->otyp == CRYSKNIFE || otmp->otyp == LONG_SWORD || otmp->otyp == AXE){ type = ENGRAVE; if((int)otmp->spe <= -3) { type = DUST; pline("Your %s too dull for engraving.", aobjnam(otmp, "are")); if(oep && oep->engr_type != DUST) return(1); } } else type = DUST; if(Levitation && type != BURN){ /* riv05!a3 */ pline("You can't reach the floor!"); return(1); } if(oep && oep->engr_type == DUST){ pline("You wipe out the message that was written here."); del_engr(oep); oep = 0; } if(type == DUST && oep){ pline("You cannot wipe out the message that is %s in the rock.", (oep->engr_type == BURN) ? "burned" : "engraved"); return(1); } pline("What do you want to %s on the floor here? ", (type == ENGRAVE) ? "engrave" : (type == BURN) ? "burn" : "write"); getlin(buf); clrlin(); spct = 0; sp = buf; while(*sp == ' ') spct++, sp++; len = strlen(sp); if(!len) { if(type == BURN) otmp->spe++; return(0); } switch(type) { case DUST: case BURN: if(len > 15) { multi = -(len/10); nomovemsg = "You finished writing."; } break; case ENGRAVE: { int len2 = (otmp->spe + 3) * 2 + 1; char *bufp = doname(otmp); if(digit(*bufp)) pline("Your %s get dull.", bufp); else { if(!strncmp(bufp,"a ",2)) bufp += 2; else if(!strncmp(bufp,"an ",3)) bufp += 3; pline("Your %s gets dull.", bufp); } if(len2 < len) { len = len2; sp[len] = 0; otmp->spe = -3; nomovemsg = "You cannot engrave more."; } else { otmp->spe -= len/2; nomovemsg = "You finished engraving."; } multi = -len; } break; } if(oep) len += strlen(oep->engr_txt) + spct; ep = (struct engr *) alloc((unsigned)(sizeof(struct engr) + len + 1)); ep->nxt_engr = head_engr; head_engr = ep; ep->engr_x = u.ux; ep->engr_y = u.uy; sp = (char *)(ep + 1); /* (char *)ep + sizeof(struct engr) */ ep->engr_txt = sp; if(oep) { (void) strcpy(sp, oep->engr_txt); (void) strcat(sp, buf); del_engr(oep); } else (void) strcpy(sp, buf); ep->engr_lth = len+1; ep->engr_type = type; ep->engr_time = moves-multi; /* kludge to protect pline against excessively long texts */ if(len > BUFSZ-20) sp[BUFSZ-20] = 0; return(1); } save_engravings(fd) int fd; { register struct engr *ep = head_engr; while(ep) { if(!ep->engr_lth || !ep->engr_txt[0]){ ep = ep->nxt_engr; continue; } bwrite(fd, (char *) & (ep->engr_lth), sizeof(ep->engr_lth)); bwrite(fd, (char *) ep, sizeof(struct engr) + ep->engr_lth); ep = ep->nxt_engr; } bwrite(fd, (char *) nul, sizeof(unsigned)); } rest_engravings(fd) int fd; { register struct engr *ep; unsigned lth; head_engr = 0; while(1) { mread(fd, (char *) <h, sizeof(unsigned)); if(lth == 0) return; ep = (struct engr *) alloc(sizeof(struct engr) + lth); mread(fd, (char *) ep, sizeof(struct engr) + lth); ep->engr_txt = (char *) (ep + 1); /* Andreas Bormann */ ep->nxt_engr = head_engr; head_engr = ep; } } del_engr(ep) register struct engr *ep; { register struct engr *ept; if(ep == head_engr) head_engr = ep->nxt_engr; else { for(ept = head_engr; ept; ept = ept->nxt_engr) if(ept->nxt_engr == ep) { ept->nxt_engr = ep->nxt_engr; goto fnd; } pline("Error in del_engr?"); impossible(); fnd: ; } free((char *) ep); } #file hack.fight.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.fight.c version 1.0.1 - corrected symbol of lurker above */ #include "hack.h" extern char *exclam(), *xname(); static boolean far_noise; static long noisetime; /* hitmm returns 0 (miss), 1 (hit), or 2 (kill) */ hitmm(magr,mdef) register struct monst *magr,*mdef; { register struct permonst *pa = magr->data, *pd = mdef->data; int hit; schar tmp; boolean vis; if(index("Eauy", pa->mlet)) return(0); if(magr->mfroz) return(0); /* riv05!a3 */ tmp = pd->ac + pa->mlevel; if(mdef->mconf || mdef->mfroz || mdef->msleep){ tmp += 4; if(mdef->msleep) mdef->msleep = 0; } hit = (tmp > rnd(20)); if(hit) mdef->msleep = 0; vis = (cansee(magr->mx,magr->my) && cansee(mdef->mx,mdef->my)); if(vis){ char buf[BUFSZ]; if(mdef->mimic) seemimic(mdef); if(magr->mimic) seemimic(magr); (void) sprintf(buf,"%s %s", Monnam(magr), hit ? "hits" : "misses"); pline("%s %s.", buf, monnam(mdef)); } else { boolean far = (dist(magr->mx, magr->my) > 15); if(far != far_noise || moves-noisetime > 10) { far_noise = far; noisetime = moves; pline("You hear some noises%s.", far ? " in the distance" : ""); } } if(hit){ if(magr->data->mlet == 'c' && !magr->cham) { magr->orig_hp += 3; if(vis) pline("%s is turned to stone!", Monnam(mdef)); else if(mdef->mtame) pline("You have a peculiarly sad feeling for a moment, then it passes."); monstone(mdef); hit = 2; } else if((mdef->mhp -= d(pa->damn,pa->damd)) < 1) { magr->orig_hp += 1 + rn2(pd->mlevel+1); if(magr->mtame && magr->orig_hp > 8*pa->mlevel){ if(pa == PM_LI_DOG) magr->data = pa = PM_DOG; else if(pa == PM_DOG) magr->data = pa = PM_LA_DOG; } if(vis) pline("%s is killed!", Monnam(mdef)); else if(mdef->mtame) pline("You have a sad feeling for a moment, then it passes."); mondied(mdef); hit = 2; } } return(hit); } /* drop (perhaps) a cadaver and remove monster */ mondied(mdef) register struct monst *mdef; { register struct permonst *pd = mdef->data; if(letter(pd->mlet) && rn2(3)){ mksobj_at(pd->mlet,CORPSE,mdef->mx,mdef->my); if(cansee(mdef->mx,mdef->my)){ unpmon(mdef); atl(mdef->mx,mdef->my,fobj->olet); } stackobj(fobj); } mondead(mdef); } /* drop a rock and remove monster */ monstone(mdef) register struct monst *mdef; { extern char mlarge[]; if(index(mlarge, mdef->data->mlet)) mksobj_at(ROCK_SYM, ENORMOUS_ROCK, mdef->mx, mdef->my); else mksobj_at(WEAPON_SYM, ROCK, mdef->mx, mdef->my); if(cansee(mdef->mx, mdef->my)){ unpmon(mdef); atl(mdef->mx,mdef->my,fobj->olet); } mondead(mdef); } fightm(mtmp) register struct monst *mtmp; { register struct monst *mon; for(mon = fmon; mon; mon = mon->nmon) if(mon != mtmp) { if(DIST(mon->mx,mon->my,mtmp->mx,mtmp->my) < 3) if(rn2(4)) return(hitmm(mtmp,mon)); } return(-1); } hitu(mtmp,dam) register struct monst *mtmp; register int dam; { register int tmp; if(u.uswallow) return(0); if(mtmp->mhide && mtmp->mundetected) { mtmp->mundetected = 0; if(!Blind) { register struct obj *obj; extern char * Xmonnam(); if(obj = o_at(mtmp->mx,mtmp->my)) pline("%s was hidden under %s!", Xmonnam(mtmp), doname(obj)); } } tmp = u.uac; /* give people with Ac = -10 at least some vulnerability */ if(tmp < 0) { dam += tmp; /* decrease damage */ if(dam <= 0) dam = 1; tmp = -rn2(-tmp); } tmp += mtmp->data->mlevel; if(multi < 0) tmp += 4; if(Invis || !mtmp->mcansee) tmp -= 2; if(mtmp->mtrapped) tmp -= 2; if(tmp <= rnd(20)) { if(Blind) pline("It misses."); else pline("%s misses.",Monnam(mtmp)); return(0); } if(Blind) pline("It hits!"); else pline("%s hits!",Monnam(mtmp)); losehp_m(dam, mtmp); return(1); } /* u is hit by sth, but not a monster */ thitu(tlev,dam,name) register int tlev,dam; register char *name; { char buf[BUFSZ]; setan(name,buf); if(u.uac + tlev <= rnd(20)) { if(Blind) pline("It misses."); else pline("You are almost hit by %s!", buf); return(0); } else { if(Blind) pline("You are hit!"); else pline("You are hit by %s!", buf); losehp(dam,name); return(1); } } char mlarge[] = "bCDdegIlmnoPSsTUwY\',&"; boolean hmon(mon,obj,thrown) /* return TRUE if mon still alive */ register struct monst *mon; register struct obj *obj; register int thrown; { register int tmp; if(!obj){ tmp = rnd(2); /* attack with bare hands */ if(mon->data->mlet == 'c' && !uarmg){ pline("You hit the cockatrice with your bare hands"); pline("You turn to stone ..."); done_in_by(mon); } } else if(obj->olet == WEAPON_SYM) { if(obj == uwep && (obj->otyp > SPEAR || obj->otyp < BOOMERANG)) tmp = rnd(2); else { if(index(mlarge, mon->data->mlet)) { tmp = rnd(objects[obj->otyp].wldam); if(obj->otyp == TWO_HANDED_SWORD) tmp += d(2,6); else if(obj->otyp == FLAIL) tmp += rnd(4); } else { tmp = rnd(objects[obj->otyp].wsdam); } tmp += obj->spe; if(!thrown && obj == uwep && obj->otyp == BOOMERANG && !rn2(3)){ pline("As you hit %s, the boomerang breaks into splinters.", monnam(mon)); freeinv(obj); setworn((struct obj *) 0, obj->owornmask); obfree(obj, (struct obj *) 0); tmp++; } } if(mon->data->mlet == 'O' && !strcmp(ONAME(obj), "Orcrist")) tmp += rnd(10); } else switch(obj->otyp) { case HEAVY_IRON_BALL: tmp = rnd(25); break; case EXPENSIVE_CAMERA: pline("You succeed in destroying your camera. Congratulations!"); freeinv(obj); if(obj->owornmask) setworn((struct obj *) 0, obj->owornmask); obfree(obj, (struct obj *) 0); return(TRUE); case DEAD_COCKATRICE: pline("You hit %s with the cockatrice corpse", monnam(mon)); pline("%s is turned to stone!", Monnam(mon)); killed(mon); return(FALSE); case CLOVE_OF_GARLIC: if(index(" VWZ", mon->data->mlet)) mon->mflee = 1; tmp = 1; break; default: /* non-weapons can damage because of their weight */ /* (but not too much) */ tmp = obj->owt/10; if(tmp < 1) tmp = 1; else tmp = rnd(tmp); if(tmp > 6) tmp = 6; } /****** NOTE: perhaps obj is undefined!! (if !thrown && BOOMERANG) */ tmp += u.udaminc + dbon(); if(u.uswallow) if(mon->data->mlet == 'P') { if((tmp -= u.uswldtim) <= 0) { pline("Your arms are no longer able to hit."); return(TRUE); } } if(tmp < 1) tmp = 1; mon->mhp -= tmp; if(mon->mhp < 1) { killed(mon); return(FALSE); } if(thrown) { /* this assumes that we cannot throw plural things */ hit( xname(obj) /* or: objects[obj->otyp].oc_name */, mon, exclam(tmp) ); return(TRUE); } if(Blind) pline("You hit it."); else pline("You hit %s%s", monnam(mon), exclam(tmp)); if(u.umconf) { if(!Blind) { pline("Your hands stop glowing blue."); if(!mon->mfroz && !mon->msleep) pline("%s appears confused.",Monnam(mon)); } mon->mconf = 1; u.umconf = 0; } return(TRUE); /* mon still alive */ } #file hack.invent.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #include <stdio.h> #undef max extern struct obj *splitobj(); extern char morc; #ifndef NOWORM #include "def.wseg.h" extern struct wseg *wsegs[32]; #endif NOWORM struct obj * addinv(obj) register struct obj *obj; { register struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) { if(merged(otmp, obj, 0)) return(otmp); if(!otmp->nobj) { otmp->nobj = obj; obj->nobj = 0; return(obj); } } invent = obj; obj->nobj = 0; return(obj); } useup(obj) register struct obj *obj; { if(obj->quan > 1){ obj->quan--; obj->owt = weight(obj); } else { setnotworn(obj); freeinv(obj); obfree(obj, (struct obj *) 0); } } freeinv(obj) register struct obj *obj; { register struct obj *otmp; if(obj == invent) invent = invent->nobj; else { for(otmp = invent; otmp->nobj != obj; otmp = otmp->nobj) if(!otmp->nobj) panic("freeinv"); otmp->nobj = obj->nobj; } } /* destroy object in fobj chain (if unpaid, it remains on the bill) */ delobj(obj) register struct obj *obj; { freeobj(obj); unpobj(obj); obfree(obj, (struct obj *) 0); } /* unlink obj from chain starting with fobj */ freeobj(obj) register struct obj *obj; { register struct obj *otmp; if(obj == fobj) fobj = fobj->nobj; else { for(otmp = fobj; otmp->nobj != obj; otmp = otmp->nobj) if(!otmp) panic("error in freeobj"); otmp->nobj = obj->nobj; } } /* Note: freegold throws away its argument! */ freegold(gold) register struct gen *gold; { register struct gen *gtmp; if(gold == fgold) fgold = gold->ngen; else { for(gtmp = fgold; gtmp->ngen != gold; gtmp = gtmp->ngen) if(!gtmp) panic("error in freegold"); gtmp->ngen = gold->ngen; } free((char *) gold); } deltrap(trap) register struct gen *trap; { register struct gen *gtmp; if(trap==ftrap) ftrap=ftrap->ngen; else { for(gtmp=ftrap;gtmp->ngen!=trap;gtmp=gtmp->ngen) ; gtmp->ngen=trap->ngen; } free((char *) trap); } struct wseg *m_atseg; struct monst * m_at(x,y) register int x,y; { register struct monst *mtmp; #ifndef NOWORM register struct wseg *wtmp; #endif NOWORM m_atseg = 0; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){ if(mtmp->mx == x && mtmp->my == y) return(mtmp); #ifndef NOWORM if(mtmp->wormno){ for(wtmp = wsegs[mtmp->wormno]; wtmp; wtmp = wtmp->nseg) if(wtmp->wx == x && wtmp->wy == y){ m_atseg = wtmp; return(mtmp); } } #endif NOWORM } return(0); } struct obj * o_at(x,y) register int x,y; { register struct obj *otmp; for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp->ox == x && otmp->oy == y) return(otmp); return(0); } struct obj * sobj_at(n,x,y) register int n,x,y; { register struct obj *otmp; for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp->ox == x && otmp->oy == y && otmp->otyp == n) return(otmp); return(0); } carried(obj) register struct obj *obj; { register struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp == obj) return(1); return(0); } struct obj * o_on(id, objchn) unsigned int id; register struct obj *objchn; { while(objchn) { if(objchn->o_id == id) return(objchn); objchn = objchn->nobj; } return((struct obj *) 0); } struct gen * g_at(x,y,ptr) register int x,y; register struct gen *ptr; { while(ptr) { if(ptr->gx == x && ptr->gy == y) return(ptr); ptr = ptr->ngen; } return(0); } /* getobj returns: struct obj *xxx: object to do something with. 0 error return: no object. 1 explicitly no object (as in w-). */ struct obj * getobj(let,word) register char *let,*word; { register struct obj *otmp; register char ilet,ilet1,ilet2; char buf[BUFSZ]; char lets[BUFSZ]; register int foo = 0, foo2, cnt; register char *bp = buf; xchar allowcnt = 0; /* 0, 1 or 2 */ boolean allowgold = FALSE; boolean allowall = FALSE; boolean allownone = FALSE; xchar foox = 0; if(*let == '0') let++, allowcnt = 1; if(*let == '$') let++, allowgold = TRUE; if(*let == '#') let++, allowall = TRUE; if(*let == '-') let++, allownone = TRUE; if(allownone) *bp++ = '-'; if(allowgold) *bp++ = '$'; if(bp[-1] == '-') *bp++ = ' '; ilet = 'a'; for(otmp = invent; otmp; otmp = otmp->nobj){ if(!*let || index(let, otmp->olet)) { bp[foo++] = ilet; /* ugly check: remove inappropriate things */ if((!strcmp(word, "take off") && !(otmp->owornmask & (W_ARMOR - W_ARM2))) || (!strcmp(word, "wear") && (otmp->owornmask & (W_ARMOR | W_RING))) || (!strcmp(word, "wield") && (otmp->owornmask & W_WEP))) { foo--; foox++; } } if(ilet == 'z') ilet = 'A'; else ilet++; } bp[foo] = 0; if(foo == 0 && bp > buf && bp[-1] == ' ') *--bp = 0; (void) strcpy(lets, bp); /* necessary since we destroy buf */ if(foo > 5) { /* compactify string */ foo = foo2 = 1; ilet2 = bp[0]; ilet1 = bp[1]; while(ilet = bp[++foo2] = bp[++foo]){ if(ilet == ilet1+1){ if(ilet1 == ilet2+1) bp[foo2 - 1] = ilet1 = '-'; else if(ilet2 == '-') { bp[--foo2] = ++ilet1; continue; } } ilet2 = ilet1; ilet1 = ilet; } } if(!foo && !allowall && !allowgold && !allownone) { pline("You don't have anything %sto %s.", foox ? "else " : "", word); return(0); } for(;;) { if(!buf[0]) pline("What do you want to %s [*]? ", word); else pline("What do you want to %s [%s or ?*]? ", word, buf); cnt = 0; ilet = readchar(); while(digit(ilet) && allowcnt) { cnt = 10*cnt + (ilet - '0'); allowcnt = 2; /* signal presence of cnt */ ilet = readchar(); } if(digit(ilet)) { pline("No count allowed with this command."); continue; } if(ilet == '\033' || ilet == ' ' || ilet == '\n') return((struct obj *)0); if(ilet == '-') { return((struct obj *)(allownone ? 1 : 0)); } if(ilet == '$') { if(!allowgold){ pline("You cannot %s gold.", word); continue; } otmp = newobj(0); /* should set o_id etc. but otmp will be freed soon */ otmp->olet = '$'; if(allowcnt == 2 && cnt < u.ugold) u.ugold -= cnt; else { cnt = u.ugold; u.ugold = 0; } flags.botl = 1; otmp->quan = cnt; return(otmp); } if(ilet == '?') { doinv(lets); if(!(ilet = morc)) continue; /* he typed a letter (not a space) to more() */ } else if(ilet == '*') { doinv(""); if(!(ilet = morc)) continue; /* ... */ } if(ilet >= 'A' && ilet <= 'Z') ilet += 'z'-'A'+1; ilet -= 'a'; for(otmp = invent; otmp && ilet; ilet--, otmp = otmp->nobj) ; if(!otmp) { pline("You don't have that object."); continue; } if(cnt < 0 || otmp->quan < cnt) { pline("You don't have that many! [You have %d]" , otmp->quan); continue; } break; } if(!allowall && let && !index(let,otmp->olet)) { pline("That is a silly thing to %s.",word); return(0); } if(allowcnt == 2) { /* cnt given */ if(cnt == 0) return(0); if(cnt != otmp->quan) { register struct obj *obj; obj = splitobj(otmp, cnt); if(otmp == uwep) setuwep(obj); } } return(otmp); } ckunpaid(otmp) register struct obj *otmp; { return( otmp->unpaid ); } /* interactive version of getobj */ /* used for Drop and Identify */ ggetobj(word, fn, max) char *word; int (*fn)(), max; { char buf[BUFSZ]; register char *ip; register char sym; register int oletct = 0, iletct = 0; register boolean allflag = FALSE; char olets[20], ilets[20]; int (*ckfn)() = (int (*)()) 0; if(!invent){ pline("You have nothing to %s.", word); return(0); } else { register struct obj *otmp = invent; register int uflg = 0; ilets[0] = 0; while(otmp) { if(!index(ilets, otmp->olet)){ ilets[iletct++] = otmp->olet; ilets[iletct] = 0; } if(otmp->unpaid) uflg = 1; otmp = otmp->nobj; } ilets[iletct++] = ' '; if(uflg) ilets[iletct++] = 'u'; ilets[iletct++] = 'a'; ilets[iletct] = 0; } pline("What kinds of thing do you want to %s? [%s] ", word, ilets); getlin(buf); ip = buf; olets[0] = 0; while(sym = *ip++){ if(sym == ' ') continue; if(sym == 'a') allflag = TRUE; else if(sym == 'u') ckfn = ckunpaid; else if(index("!%?[()=*/\"0", sym)){ if(!index(olets, sym)){ olets[oletct++] = sym; olets[oletct] = 0; } } else pline("You don't have any %c's.", sym); } return askchain(invent, olets, allflag, fn, ckfn, max); } /* Walk through the chain starting at objchn and ask for all objects with olet in olets (if nonNULL) and satisfying ckfn (if nonNULL) whether the action in question (i.e., fn) has to be performed. If allflag then no questions are asked. Max gives the max nr of objects treated. */ askchain(objchn, olets, allflag, fn, ckfn, max) struct obj *objchn; register char *olets; int allflag; int (*fn)(), (*ckfn)(); int max; { register struct obj *otmp, *otmp2; register char sym, ilet; register int cnt = 0; ilet = 'a'-1; for(otmp = objchn; otmp; otmp = otmp2){ if(ilet == 'z') ilet = 'A'; else ilet++; otmp2 = otmp->nobj; if(olets && *olets && !index(olets, otmp->olet)) continue; if(ckfn && !(*ckfn)(otmp)) continue; if(!allflag) { prname(otmp, ilet, 1); addtopl(" (ynaq)? "); sym = readchar(); } else sym = 'y'; switch(sym){ case 'a': allflag = 1; case 'y': cnt += (*fn)(otmp); if(--max == 0) goto ret; case 'n': default: break; case 'q': goto ret; } } pline(cnt ? "That was all." : "No applicable objects."); ret: if(!flags.echo) echo(OFF); return(cnt); } obj_to_let(obj) register struct obj *obj; { register struct obj *otmp; register char ilet = 'a'; for(otmp = invent; otmp && otmp != obj; otmp = otmp->nobj) if(++ilet > 'z') ilet = 'A'; return(otmp ? ilet : 0); } prinv(obj) register struct obj *obj; { prname(obj, obj_to_let(obj), 1); } prname(obj,let,onelin) register struct obj *obj; register char let; { char li[BUFSZ]; (void) sprintf(li, " %c - %s.", let, doname(obj)); switch(onelin) { case 1: pline(li+1); break; case 0: myputs(li+1); break; case -1: cl_end(); myputs(li); curx += strlen(li); } } ddoinv() { doinv((char *) 0); return(0); } myddoinv() { mydoinv((char *) 0); return(0); } myprname(obj,let,onelin) register struct obj *obj; register char let; { char li[BUFSZ]; (void) sprintf(li, " %c - %s.", let, mydoname(obj)); switch(onelin) { case 1: pline(li+1); break; case 0: myputs(li+1); break; case -1: cl_end(); myputs(li); curx += strlen(li); } } mydoinv(lets) register char *lets; { register struct obj *otmp; register char ilet = 'a'; int ct = 0; int maxlth = 0; int lth; if(!invent){ pline("Not carrying anything"); if(lets) return; } if(!flags.oneline) { if(!lets || !*lets) for(otmp = invent; otmp; otmp = otmp->nobj) ct++; else ct = strlen(lets); if(ct > 1 && ct < ROWNO && (lets || !inshop())){ for(otmp = invent; otmp; otmp = otmp->nobj) { if(!lets || !*lets || index(lets, ilet)) { lth = strlen(doname(otmp)); if(lth > maxlth) maxlth = lth; } if(++ilet > 'z') ilet = 'A'; } ilet = 'a'; lth = COLNO - maxlth - 7; if(lth < 10) goto clrscr; home(); cl_end(); flags.topl = 0; ct = 0; for(otmp = invent; otmp; otmp = otmp->nobj) { if(!lets || !*lets || index(lets, ilet)) { curs(lth, ++ct); myprname(otmp, ilet, -1); } if(++ilet > 'z') ilet = 'A'; } curs(lth, ct+1); cl_end(); cmore(); /* sets morc */ /* test whether morc is a reasonable answer */ if(lets && *lets && !index(lets, morc)) morc = 0; home(); cl_end(); docorner(lth, ct); return; } } clrscr: if(ct > 1) cls(); for(otmp = invent; otmp; otmp = otmp->nobj){ if(!lets || !*lets || index(lets, ilet)) myprname(otmp, ilet, (ct > 1) ? 0 : 1); if(++ilet > 'z') ilet = 'A'; } /* tell doinvbill whether we cleared the screen */ if(!lets) doinvbill((ct > 1)); if(ct > 1){ cgetret(); docrt(); } else morc = 0; /* %% */ } doinv(lets) register char *lets; { register struct obj *otmp; register char ilet = 'a'; int ct = 0; int maxlth = 0; int lth; if(!invent){ pline("Not carrying anything"); if(lets) return; } if(!flags.oneline) { if(!lets || !*lets) for(otmp = invent; otmp; otmp = otmp->nobj) ct++; else ct = strlen(lets); if(ct > 1 && ct < ROWNO && (lets || !inshop())){ for(otmp = invent; otmp; otmp = otmp->nobj) { if(!lets || !*lets || index(lets, ilet)) { lth = strlen(doname(otmp)); if(lth > maxlth) maxlth = lth; } if(++ilet > 'z') ilet = 'A'; } ilet = 'a'; lth = COLNO - maxlth - 7; if(lth < 10) goto clrscr; home(); cl_end(); flags.topl = 0; ct = 0; for(otmp = invent; otmp; otmp = otmp->nobj) { if(!lets || !*lets || index(lets, ilet)) { curs(lth, ++ct); prname(otmp, ilet, -1); } if(++ilet > 'z') ilet = 'A'; } curs(lth, ct+1); cl_end(); cmore(); /* sets morc */ /* test whether morc is a reasonable answer */ if(lets && *lets && !index(lets, morc)) morc = 0; home(); cl_end(); docorner(lth, ct); return; } } clrscr: if(ct > 1) cls(); for(otmp = invent; otmp; otmp = otmp->nobj){ if(!lets || !*lets || index(lets, ilet)) prname(otmp, ilet, (ct > 1) ? 0 : 1); if(++ilet > 'z') ilet = 'A'; } /* tell doinvbill whether we cleared the screen */ if(!lets) doinvbill((ct > 1)); if(ct > 1){ cgetret(); docrt(); } else morc = 0; /* %% */ } stackobj(obj) register struct obj *obj; { register struct obj *otmp = fobj; for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp != obj) if(otmp->ox == obj->ox && otmp->oy == obj->oy && merged(obj,otmp,1)) return; } /* merge obj with otmp and delete obj if types agree */ merged(otmp,obj,lose) register struct obj *otmp, *obj; { if(otmp->otyp == obj->otyp && obj->unpaid == otmp->unpaid && obj->spe == otmp->spe && obj->known == otmp->known && obj->dknown == otmp->dknown && obj->cursed == otmp->cursed && ((obj->olet == WEAPON_SYM && obj->otyp < BOOMERANG) || index("%?!*",otmp->olet))){ otmp->quan += obj->quan; otmp->owt += obj->owt; if(lose) freeobj(obj); obfree(obj,otmp); /* free(obj), bill->otmp */ return(1); } else return(0); } doprwep(){ if(!uwep) pline("You are empty handed."); else prinv(uwep); return(0); } doprarm(){ if(!uarm && !uarmg && !uarms && !uarmh) pline("You are not wearing any armor."); else { char lets[6]; register int ct = 0; if(uarm) lets[ct++] = obj_to_let(uarm); if(uarm2) lets[ct++] = obj_to_let(uarm2); if(uarmh) lets[ct++] = obj_to_let(uarmh); if(uarms) lets[ct++] = obj_to_let(uarms); if(uarmg) lets[ct++] = obj_to_let(uarmg); lets[ct] = 0; doinv(lets); } return(0); } doprring(){ if(!uleft && !uright) pline("You are not wearing any rings."); else { char lets[3]; register int ct = 0; if(uleft) lets[ct++] = obj_to_let(uleft); if(uright) lets[ct++] = obj_to_let(uright); lets[ct] = 0; doinv(lets); } return(0); } digit(c) char c; { return(c >= '0' && c <= '9'); } #file hack.lev.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.lev.c version 1.0.1 - somewhat more careful monster regeneration */ #include "hack.h" #include <signal.h> #include <stdio.h> extern struct monst *restmonchn(); extern struct obj *restobjchn(); extern struct obj *billobjs; extern char *itoa(); extern char nul[]; #ifndef NOWORM #include "def.wseg.h" extern struct wseg *wsegs[32], *wheads[32]; extern long wgrowtime[32]; #endif NOWORM getlev(fd) { register struct gen *gtmp; #ifndef NOWORM register struct wseg *wtmp; #endif NOWORM register int tmp; long omoves; if(fd<0 || read(fd, (char *) levl, sizeof(levl)) != sizeof(levl)) return(1); fgold = 0; ftrap = 0; mread(fd, (char *)&omoves, sizeof(omoves)); /* 0 from MKLEV */ mread(fd, (char *)&xupstair, sizeof(xupstair)); mread(fd, (char *)&yupstair, sizeof(yupstair)); mread(fd, (char *)&xdnstair, sizeof(xdnstair)); mread(fd, (char *)&ydnstair, sizeof(ydnstair)); fmon = restmonchn(fd); if(omoves) { /* regenerate animals while on another level */ long tmoves = (moves > omoves) ? moves-omoves : 0; register struct monst *mtmp, *mtmp2; extern char genocided[]; long newhp; for(mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if(index(genocided, mtmp->data->mlet)) { mondead(mtmp); continue; } newhp = mtmp->mhp + (index("ViT", mtmp->data->mlet) ? tmoves : tmoves/20); if(newhp > mtmp->orig_hp) mtmp->mhp = mtmp->orig_hp; else mtmp->mhp = newhp; } } setshk(); setgd(); gtmp = newgen(); mread(fd, (char *)gtmp, sizeof(struct gen)); while(gtmp->gx) { gtmp->ngen = fgold; fgold = gtmp; gtmp = newgen(); mread(fd, (char *)gtmp, sizeof(struct gen)); } mread(fd, (char *)gtmp, sizeof(struct gen)); while(gtmp->gx) { gtmp->ngen = ftrap; ftrap = gtmp; gtmp = newgen(); mread(fd, (char *)gtmp, sizeof(struct gen)); } free((char *) gtmp); fobj = restobjchn(fd); billobjs = restobjchn(fd); rest_engravings(fd); #ifndef QUEST mread(fd, (char *)rooms, sizeof(rooms)); mread(fd, (char *)doors, sizeof(doors)); #endif QUEST if(!omoves) return(0); /* from MKLEV */ #ifndef NOWORM mread(fd, (char *)wsegs, sizeof(wsegs)); for(tmp = 1; tmp < 32; tmp++) if(wsegs[tmp]){ wheads[tmp] = wsegs[tmp] = wtmp = newseg(); while(1) { mread(fd, (char *)wtmp, sizeof(struct wseg)); if(!wtmp->nseg) break; wheads[tmp]->nseg = wtmp = newseg(); wheads[tmp] = wtmp; } } mread(fd, (char *)wgrowtime, sizeof(wgrowtime)); #endif NOWORM return(0); } mread(fd, buf, len) register int fd; register char *buf; register unsigned len; { register int rlen; rlen = read(fd, buf, (int) len); if(rlen != len){ pline("Read %d instead of %d bytes\n", rlen, len); panic("Cannot read %d bytes from file #%d\n", len, fd); } } #file hack.main.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.main.c version 1.0.1 - some cosmetic changes */ #include <stdio.h> #include <signal.h> /* #include <errno.h> */ #include "hack.h" extern char plname[PL_NSIZ], pl_character[PL_CSIZ]; #ifndef AMIGA extern char *getlogin(); extern char *getenv(); #endif int (*afternmv)(); int done1(); int hangup(); char safelock[] = "safelock"; xchar locknum; /* max num of players */ char SAVEF[PL_NSIZ + 22] = "Saved Games/"; char perm[] = "perm"; char *hname; /* name of the game (argv[0] of call) */ char obuf[BUFSIZ]; /* BUFSIZ is defined in stdio.h */ extern char *nomovemsg; extern long wailmsg; main(argc,argv) int argc; char *argv[]; { int fd; #ifdef NEWS int nonews = 0; #endif NEWS char *dir; initterm(); #ifdef AMIGA if (argc == 0) { geticon(); hname = HACKNAME; argc = 1; } else #endif hname = argv[0]; /* * See if we must change directory to the playground. * (Perhaps hack runs suid and playground is inaccessible * for the player.) * The environment variable HACKDIR is overridden by a * -d command line option. */ #ifndef AMIGA if ( (dir = getenv("HACKDIR")) == NULL) #endif dir = HACKDIR; if(argc > 1 && !strncmp(argv[1], "-d", 2)) { argc--; argv++; dir = argv[0]+2; if(*dir == '=' || *dir == ':') dir++; if(!*dir && argc > 1) { argc--; argv++; dir = argv[0]; } if(!*dir) error("Flag -d must be followed by a directory name."); } #ifndef AMIGA /* * Now we know the directory containing 'record' and * may do a prscore(). */ if(argc > 1 && !strncmp(argv[1], "-s", 2)) { if(dir) chdirx(dir); prscore(argc, argv); hackexit(0); } #endif /* * It seems he really wants to play. Find the creation date of * this game so as to avoid restoring outdated savefiles. */ gethdate(hname); /* * We cannot do chdir earlier, otherwise gethdate will fail. */ if(dir) chdirx(dir); #ifdef GRAPHICS InitGraphics(); #endif /* * Who am i? Perhaps we should use $USER instead? */ #ifdef AMIGA if (!*plname) #endif (void) strncpy(plname, getlogin(), sizeof(plname)-1); /* * Process options. */ initoptions(); while(argc > 1 && argv[1][0] == '-'){ argv++; argc--; switch(argv[0][1]){ #ifdef WIZARD case 'w': if(!strcmp(getlogin(), WIZARD)) wizard = TRUE; else myprintf("Sorry.\n"); break; #endif WIZARD #ifdef NEWS case 'n': flags.nonews = TRUE; break; #endif NEWS case 'u': if(argv[0][2]) (void) strncpy(plname, argv[0]+2, sizeof(plname)-1); else if(argc > 1) { argc--; argv++; (void) strncpy(plname, argv[0], sizeof(plname)-1); } else myprintf("Player name expected after -u\n"); break; default: myprintf("Unknown option: %s\n", *argv); } } if(argc > 1) locknum = atoi(argv[1]); #ifdef WIZARD if(wizard) (void) strcpy(plname, "wizard"); else #endif WIZARD if(!*plname || !strncmp(plname, "player", 4)) askname(); #ifdef AMIGA if (!pl_character[0]) #endif plnamesuffix(); /* strip suffix from name */ setbuf(stdout,obuf); (void) srand(getpid()); startup(); cls(); (void) signal(SIGHUP, hangup); #ifdef WIZARD if(!wizard) { #endif WIZARD (void) signal(SIGQUIT,SIG_IGN); (void) signal(SIGINT,SIG_IGN); if(locknum) lockcheck(); else (void) strcpy(lock,plname); #ifdef WIZARD } else { register char *sfoo; (void) strcpy(lock,plname); #ifndef AMIGA if(sfoo = getenv("MAGIC")) while(*sfoo) { switch(*sfoo++) { case 'n': (void) srand(*sfoo++); break; } } if(sfoo = getenv("GENOCIDED")){ if(*sfoo == '!'){ extern struct permonst mons[PMONCOUNT]; extern char genocided[], fut_geno[]; register struct permonst *pm = mons; register char *gp = genocided; while(pm < mons+CMNUM+2){ if(!index(sfoo, pm->mlet)) *gp++ = pm->mlet; pm++; } *gp = 0; } else (void) strcpy(genocided, sfoo); (void) strcpy(fut_geno, genocided); } #endif } #endif WIZARD u.uhp = 1; /* prevent RIP on early quits */ u.ux = FAR; /* prevent nscr() */ (void) strcat(SAVEF,plname); if((fd = open(SAVEF,0)) >= 0 && (uptodate(fd) || unlink(SAVEF) == 666)) { (void) signal(SIGINT,done1); myputs("Restoring old save file..."); (void) myfflush(stdout); dorecover(fd); flags.move = 0; } else { #ifdef NEWS if(!flags.nonews) if((fd = open(NEWS,0)) >= 0) outnews(fd); #endif NEWS flags.ident = 1; init_objects(0); u_init(); (void) signal(SIGINT,done1); glo(1); mklev(); u.ux = xupstair; u.uy = yupstair; (void) inshop(); setsee(); flags.botlx = 1; makedog(); seemons(); docrt(); pickup(); read_engr_at(u.ux,u.uy); /* superfluous ? */ flags.move = 1; flags.cbreak = ON; flags.echo = OFF; } setftty(); #ifdef TRACK initrack(); #endif TRACK for(;;) { if(flags.move) { #ifdef TRACK settrack(); #endif TRACK if(moves%2 == 0 || (!(Fast & ~INTRINSIC) && (!Fast || rn2(3)))) { extern struct monst *makemon(); movemon(); if(!rn2(70)) (void) makemon((struct permonst *)0, 0, 0); } if(Glib) glibr(); timeout(); ++moves; if(flags.time) flags.botl = 1; if(u.uhp < 1) { pline("You die..."); done("died"); } if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50){ wailmsg = moves; if(u.uhp == 1) pline("You hear the wailing of the Banshee..."); else pline("You hear the howling of the CwnAnnwn..."); } if(u.uhp < u.uhpmax) { if(u.ulevel > 9) { if(Regeneration || !(moves%3)) { flags.botl = 1; u.uhp += rnd((int) u.ulevel-9); if(u.uhp > u.uhpmax) u.uhp = u.uhpmax; } } else if(Regeneration || (!(moves%(22-u.ulevel*2)))) { flags.botl = 1; u.uhp++; } } if(Teleportation && !rn2(85)) tele(); if(Searching && multi >= 0) (void) dosearch(); gethungry(); invault(); } if(multi < 0) { if(!++multi){ pline(nomovemsg ? nomovemsg : "You can move again."); nomovemsg = 0; if(afternmv) (*afternmv)(); afternmv = 0; } } flags.move = 1; find_ac(); #ifndef QUEST if(!flags.mv || Blind) #endif QUEST { seeobjs(); seemons(); nscr(); } if(flags.botl || flags.botlx) bot(); if(multi > 0) { #ifdef QUEST if(flags.run >= 4) finddir(); #endif QUEST lookaround(); if(!multi) { /* lookaround may clear multi */ flags.move = 0; continue; } if(flags.mv) { if(multi<COLNO && !--multi) flags.mv = flags.run = 0; domove(); } else { --multi; rhack(save_cm); } } else if(multi == 0) rhack((char *) 0); if(multi && multi%7 == 0) (void) fflush(stdout); } } lockcheck() { /* extern int errno; */ /* register int i, fd; */ /* */ /* we ignore QUIT and INT at this point */ /* if (link(perm,safelock) == -1) */ /* error("Cannot link safelock. (Try again or rm safelock.)");*/ /* */ /* */ /* for(i = 0; i < locknum; i++) { */ /* lock[0]= 'a' + i; */ /* if((fd = open(lock,0)) == -1) { */ /* if(errno == ENOENT) goto gotlock; */ /* no such file */ /* (void) unlink(safelock); */ /* error("Cannot open %s", lock); */ /* } */ /* (void) close(fd); */ /* } */ /* (void) unlink(safelock); */ /* error("Too many hacks running now."); */ /* } */ /* gotlock: */ /* fd = creat(lock,FMASK); */ /* if(unlink(safelock) == -1) { */ /* error("Cannot unlink safelock.");*/ /* if(fd == -1) { */ /* error("cannot creat lock file."); */ /* } else { */ /* int pid; */ /* */ /* pid = getpid(); */ /* if(write(fd, (char *) &pid, sizeof(pid)) != sizeof(pid)){ */ /* error("cannot write lock"); */ /* } */ /* if(close(fd) == -1) { */ /* error("cannot close lock"); */ /* } */ /* } */ } /*VARARGS1*/ error(s,a1,a2,a3,a4) char *s,*a1,*a2,*a3,*a4; { myprintf("Error: "); myprintf(s,a1,a2,a3,a4); (void) myputchar('\n'); hackexit(1); } glo(foo) register int foo; { /* construct the string xlock.n */ register char *tf; tf = lock; while(*tf && *tf!='.') tf++; (void) sprintf(tf, ".%d", foo); } /* * plname is filled either by an option (-u Player or -uPlayer) or * explicitly (-w implies wizard) or by askname. * It may still contain a suffix denoting pl_character. */ askname(){ register int c,ct; myprintf("\nWho are you? "); ct = 0; (void) myfflush(); while((c = inchar()) != '\n') { if (c != '-') if (c == 8) { /* backspace */ if (ct) { ct--; backsp(); myputchar(' '); backsp(); myfflush(); } continue; } else if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z') c = '_'; if (ct < sizeof(plname)-1) { plname[ct++] = c; myprintf("%c", c); } (void) myfflush(); } plname[ct] = 0; if(ct == 0) askname(); #ifdef QUEST else myprintf("Hello %s, welcome to quest!\n", plname); #else else myprintf("Hello %s, welcome to hack!\n", plname); #endif QUEST } impossible(){ pline("Program in disorder - perhaps you'd better Quit"); } #ifdef NEWS int stopnews; stopnws(){ (void) signal(SIGINT, SIG_IGN); stopnews++; } outnews(fd) int fd; { int (*prevsig)(); char ch; prevsig = signal(SIGINT, stopnws); while(!stopnews && read(fd,&ch,1) == 1) (void) myputchar(ch); (void) myputchar('\n'); (void) myfflush(stdout); (void) close(fd); (void) signal(SIGINT, prevsig); /* See whether we will ask TSKCFW: he might have told us already */ if(!stopnews && pl_character[0]) getret(); } #endif NEWS chdirx(dir) char *dir; { if(chdir(dir) < 0) { perror(dir); error("Cannot chdir to %s.", dir); } } #file hack.makemon.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.makemon.c version 1.0.1 - newly created demons do not sleep */ #include "hack.h" extern char fut_geno[]; extern char *index(); struct monst zeromonst; /* * called with [x,y] = coordinates; * [0,0] means anyplace * [u.ux,u.uy] means: call mnexto (not in MKLEV) * * In case we make an Orc or killer bee, we make an entire horde (swarm); * note that in this case we return only one of them (the one at [x,y]). */ struct monst * makemon(ptr,x,y) register struct permonst *ptr; { register struct monst *mtmp; register int tmp, ct; boolean anything = (!ptr); if(x != 0 || y != 0) if(m_at(x,y)) return((struct monst *) 0); if(ptr){ if(index(fut_geno, ptr->mlet)) return((struct monst *) 0); } else { ct = CMNUM - strlen(fut_geno); if(index(fut_geno, 'm')) ct++; /* make only 1 minotaur */ if(index(fut_geno, '@')) ct++; if(ct <= 0) return(0); /* no more monsters! */ tmp = rn2(ct*dlevel/24 + 7); if(tmp < dlevel - 4) tmp = rn2(ct*dlevel/24 + 12); if(tmp >= ct) tmp = rn1(ct - ct/2, ct/2); for(ct = 0; ct < CMNUM; ct++){ ptr = &mons[ct]; if(index(fut_geno, ptr->mlet)) continue; if(!tmp--) goto gotmon; } panic("makemon?"); } gotmon: mtmp = newmonst(ptr->pxlth); *mtmp = zeromonst; /* clear all entries in structure */ for(ct = 0; ct < ptr->pxlth; ct++) ((char *) &(mtmp->mextra[0]))[ct] = 0; mtmp->nmon = fmon; fmon = mtmp; mtmp->m_id = flags.ident++; mtmp->data = ptr; mtmp->mxlth = ptr->pxlth; if(ptr->mlet == 'D') mtmp->orig_hp = mtmp->mhp = 80; else if(!ptr->mlevel) mtmp->orig_hp = mtmp->mhp = rnd(4); else mtmp->orig_hp = mtmp->mhp = d(ptr->mlevel, 8); mtmp->mx = x; mtmp->my = y; mtmp->mcansee = 1; if(ptr->mlet == 'M') mtmp->mimic = ']'; /* if (!ismklev) { */ if(x == u.ux && y == u.uy) mnexto(mtmp); if(x == 0 && y == 0) rloc(mtmp); /* }*/ if(ptr->mlet == 's' || ptr->mlet == 'S') { mtmp->mhide = mtmp->mundetected = 1; if(ismklev && mtmp->mx && mtmp->my) mkobj_at(0, mtmp->mx, mtmp->my); } if(ptr->mlet == ':') { mtmp->cham = 1; if (ismklev) (void) newcham(mtmp, &mons[dlevel+14+rn2(CMNUM-14-dlevel)]); } if(ptr->mlet == 'I') mtmp->minvis = 1; if(ptr->mlet == 'L' || ptr->mlet == 'N' ||(ismklev && ptr->mlet != '&' && ptr->mlet != 'w' && rn2(5)) ) mtmp->msleep = 1; #ifndef NOWORM /* if (!ismklev) */ if(ptr->mlet == 'w' && getwn(mtmp)) initworm(mtmp); #endif NOWORM if(anything) if(ptr->mlet == 'O' || ptr->mlet == 'k') { coord enexto(); coord mm; register int cnt = rnd(10); mm.x = x; mm.y = y; while(cnt--) { mm = enexto(mm.x, mm.y); (void) makemon(ptr, mm.x, mm.y); } } return(mtmp); } coord enexto(xx,yy) register xchar xx,yy; { register xchar x,y; coord foo[15], *tfoo; int range; tfoo = foo; range = 1; do { /* full kludge action. */ for(x = xx-range; x <= xx+range; x++) if(goodpos(x, yy-range)) { tfoo->x = x; (tfoo++)->y = yy-range; if(tfoo == &foo[15]) goto foofull; } for(x = xx-range; x <= xx+range; x++) if(goodpos(x,yy+range)) { tfoo->x = x; (tfoo++)->y = yy+range; if(tfoo == &foo[15]) goto foofull; } for(y = yy+1-range; y < yy+range; y++) if(goodpos(xx-range,y)) { tfoo->x = xx-range; (tfoo++)->y = y; if(tfoo == &foo[15]) goto foofull; } for(y = yy+1-range; y < yy+range; y++) if(goodpos(xx+range,y)) { tfoo->x = xx+range; (tfoo++)->y = y; if(tfoo == &foo[15]) goto foofull; } range++; } while(tfoo == foo); foofull: return( foo[rn2(tfoo-foo)] ); } goodpos(x,y) /* used only in mnexto and rloc */ { return( ! (x < 1 || x > COLNO-2 || y < 1 || y > ROWNO-2 || m_at(x,y) || levl[x][y].typ < DOOR || (ismklev && x == u.ux && y == u.uy) || (ismklev && sobj_at(ENORMOUS_ROCK, x, y)) )); } #file hack.mhitu.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.mhitu.c version 1.0.1 - corrected bug for 'R' (Mike Newton) - also some separate code for swallowed (a3) */ #include "hack.h" extern struct monst *makemon(); /* * mhitu: monster hits you * returns 1 if monster dies (e.g. 'y', 'F'), 0 otherwise */ mhitu(mtmp) register struct monst *mtmp; { register struct permonst *mdat = mtmp->data; register int tmp, ctmp; nomul(0); /* If swallowed, can only be affected by hissers and by u.ustuck */ if(u.uswallow) { if(mtmp != u.ustuck && mdat->mlet != 'c') return(0); switch(mdat->mlet) { case 'c': if(!rn2(13)) { pline("Outside, you hear %s's hissing!", monnam(mtmp)); pline("%s gets turned to stone!", Monnam(u.ustuck)); pline("And the same fate befalls you."); done_in_by(mtmp); } break; case ',': youswld(mtmp,4+u.uac,5,"The trapper"); break; case '\'': youswld(mtmp,rnd(6),7,"The lurker above"); break; case 'P': youswld(mtmp,d(2,4),12,"The purple worm"); break; default: pline("The mysterious monster digests you."); u.uhp = 0; } if(u.uhp < 1) done_in_by(mtmp); return(0); } if(!index("&DuxynNF",mdat->mlet)) tmp = hitu(mtmp,d(mdat->damn,mdat->damd)); else tmp = 0; ctmp = tmp && !mtmp->mcan && (!uarm || objects[uarm->otyp].a_can < rnd(3) || !rn2(50)); switch(mdat->mlet) { case '&': if(!mtmp->cham && !mtmp->mcan && !rn2(13)) { (void) makemon(PM_DEMON,u.ux,u.uy); } else { (void) hitu(mtmp,d(2,6)); (void) hitu(mtmp,d(2,6)); (void) hitu(mtmp,rnd(3)); (void) hitu(mtmp,rnd(3)); (void) hitu(mtmp,rn1(4,2)); } break; case ',': if(tmp) justswld(mtmp,"The trapper"); break; case '\'': if(tmp) justswld(mtmp,"The lurker above"); break; case 'A': if(ctmp && rn2(2)) { pline("You feel weaker!"); losestr(1); } break; case 'C': (void) hitu(mtmp,rnd(6)); break; case 'c': if(!rn2(5)) { pline("You hear %s's hissing!", monnam(mtmp)); if(ctmp || !rn2(5)) { pline("You get turned to stone!"); done_in_by(mtmp); } } break; case 'D': if(rn2(6) || mtmp->mcan) { (void) hitu(mtmp,d(3,10)); (void) hitu(mtmp,rnd(8)); (void) hitu(mtmp,rnd(8)); break; } kludge("%s breathes fire!","The dragon"); buzz(-1,mtmp->mx,mtmp->my,u.ux-mtmp->mx,u.uy-mtmp->my); break; case 'd': (void) hitu(mtmp,d(2,4)); break; case 'e': (void) hitu(mtmp,d(3,6)); break; case 'F': if(mtmp->mcan) break; kludge("%s explodes!","The freezing sphere"); if(Cold_resistance) pline("You don't seem affected by it."); else { xchar dn; if(17-(u.ulevel/2) > rnd(20)) { pline("You get blasted!"); dn = 6; } else { pline("You duck the blast..."); dn = 3; } losehp_m(d(dn,6), mtmp); } mondead(mtmp); return(1); case 'g': if(ctmp && multi >= 0 && !rn2(6)) { kludge("You are frozen by %ss juices","the cube'"); nomul(-rnd(10)); } break; case 'h': if(ctmp && multi >= 0 && !rn2(5)) { nomul(-rnd(10)); kludge("You are put to sleep by %ss bite!", "the homunculus'"); } break; case 'j': tmp = hitu(mtmp,rnd(3)); tmp &= hitu(mtmp,rnd(3)); if(tmp){ (void) hitu(mtmp,rnd(4)); (void) hitu(mtmp,rnd(4)); } break; case 'k': if((hitu(mtmp,rnd(4)) || !rn2(3)) && ctmp){ poisoned("bee's sting",mdat->mname); } break; case 'L': if(tmp) stealgold(mtmp); break; case 'N': if(mtmp->mcan && !Blind) { pline("%s tries to seduce you, but you seem not interested.", Amonnam(mtmp, "plain")); if(rn2(3)) rloc(mtmp); } else if(steal(mtmp)) { rloc(mtmp); mtmp->mflee = 1; } break; case 'n': if(!uwep && !uarm && !uarmh && !uarms && !uarmg) { pline("%s hits! (I hope you don't mind)", Monnam(mtmp)); u.uhp += rnd(7); if(!rn2(7)) u.uhpmax++; if(u.uhp > u.uhpmax) u.uhp = u.uhpmax; flags.botl = 1; if(!rn2(50)) rloc(mtmp); } else { (void) hitu(mtmp,d(2,6)); (void) hitu(mtmp,d(2,6)); } break; case 'o': tmp = hitu(mtmp,rnd(6)); if(hitu(mtmp,rnd(6)) && ctmp && !u.ustuck && rn2(2)) { u.ustuck = mtmp; kludge("%s has grabbed you!","The owlbear"); u.uhp -= d(2,8); } else if(u.ustuck == mtmp) { u.uhp -= d(2,8); pline("You are being crushed."); } break; case 'P': if(ctmp && !rn2(4)) justswld(mtmp,"The purple worm"); else (void) hitu(mtmp,d(2,4)); break; case 'Q': (void) hitu(mtmp,rnd(2)); (void) hitu(mtmp,rnd(2)); break; case 'R': if(ctmp && uarmh && !uarmh->rustfree && (int) uarmh->spe >= -1) { pline("Your helmet rusts!"); uarmh->spe--; } else if(ctmp && uarm && !uarm->rustfree && uarm->otyp < STUDDED_LEATHER_ARMOR && (int)uarm->spe >= -1) { pline("Your armor rusts!"); uarm->spe--; } break; case 'S': if(ctmp && !rn2(8)) { poisoned("snake's bite",mdat->mname); } break; case 's': if(tmp && !rn2(8)) { poisoned("scorpion's sting",mdat->mname); } (void) hitu(mtmp,rnd(8)); (void) hitu(mtmp,rnd(8)); break; case 'T': (void) hitu(mtmp,rnd(6)); (void) hitu(mtmp,rnd(6)); break; case 't': if(!rn2(5)) rloc(mtmp); break; case 'u': mtmp->mflee = 1; break; case 'U': (void) hitu(mtmp,d(3,4)); (void) hitu(mtmp,d(3,4)); break; case 'v': if(ctmp && !u.ustuck) u.ustuck = mtmp; break; case 'V': if(tmp) u.uhp -= 4; if(ctmp && !rn2(3)) losexp(); break; case 'W': if(ctmp && !rn2(5)) losexp(); break; #ifndef NOWORM case 'w': if(tmp) wormhit(mtmp); #endif NOWORM break; case 'X': (void) hitu(mtmp,rnd(5)); (void) hitu(mtmp,rnd(5)); (void) hitu(mtmp,rnd(5)); break; case 'x': { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE; pline("%s pricks in your %s leg!", Monnam(mtmp), (side == RIGHT_SIDE) ? "right" : "left"); Wounded_legs |= side + rnd(5); losehp_m(2, mtmp); break; } case 'y': if(mtmp->mcan) break; mondead(mtmp); if(!Blind) { pline("You are blinded by a blast of light!"); Blind = d(4,12); seeoff(0); } return(1); case 'Y': (void) hitu(mtmp,rnd(6)); break; } if(u.uhp < 1) done_in_by(mtmp); return(0); }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/05/86)
#file hack.mkobj.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.mkobc version 1.0.1 - mksobj() also in MKLEV */ #include "hack.h" #include "hack.onames.h" char mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**("; struct obj *mkobj(), *mksobj(); mkobj_at(let,x,y) register int let,x,y; { register struct obj *otmp = mkobj(let); otmp->ox = x; otmp->oy = y; otmp->nobj = fobj; fobj = otmp; } mksobj_at(let,otyp,x,y) register int let,otyp,x,y; { register struct obj *otmp = mksobj(let, otyp); otmp->ox = x; otmp->oy = y; otmp->nobj = fobj; fobj = otmp; } struct obj * mkobj(let) { if(!let) let = mkobjstr[rn2(sizeof(mkobjstr) - 1)]; return(mksobj(let, letter(let) ? CORPSE : probtype(let))); } struct obj zeroobj; struct obj * mksobj(let, otyp) { register struct obj *otmp; otmp = newobj(0); *otmp = zeroobj; otmp->age = (ismklev) ? 0 : moves; otmp->o_id = flags.ident++; otmp->quan = 1; if(letter(let)){ otmp->olet = FOOD_SYM; otmp->otyp = CORPSE + ((let > 'Z') ? (let-'a'+'Z'-'@'+1) : (let-'@')); otmp->spe = let; otmp->known = 1; otmp->owt = weight(otmp); return(otmp); } otmp->olet = let; otmp->otyp = otyp; otmp->dknown = index("/=!?*", let) ? 0 : 1; switch(let) { case WEAPON_SYM: otmp->quan = (otmp->otyp <= ROCK) ? rn1(6,6) : 1; if(!rn2(11)) otmp->spe = rnd(3); else if(!rn2(10)) { otmp->cursed = 1; otmp->spe = -rnd(3); } break; case FOOD_SYM: case GEM_SYM: otmp->quan = rn2(6) ? 1 : 2; case TOOL_SYM: case CHAIN_SYM: case BALL_SYM: case ROCK_SYM: case POTION_SYM: case SCROLL_SYM: case AMULET_SYM: break; case ARMOR_SYM: if(!rn2(8)) otmp->cursed = 1; if(!rn2(10)) otmp->spe = rnd(3); else if(!rn2(9)) { otmp->spe = -rnd(3); otmp->cursed = 1; } otmp->spe += 10 - objects[otmp->otyp].a_ac; break; case WAND_SYM: if(otmp->otyp == WAN_WISHING) otmp->spe = 3; else otmp->spe = rn1(5, (objects[otmp->otyp].bits & NODIR) ? 11 : 4); break; case RING_SYM: if(objects[otmp->otyp].bits & SPEC) { if(!rn2(3)) { otmp->cursed = 1; otmp->spe = -rnd(2); } else otmp->spe = rnd(2); } else if(otmp->otyp == RIN_TELEPORTATION || otmp->otyp == RIN_AGGRAVATE_MONSTER || otmp->otyp == RIN_HUNGER || !rn2(9)) otmp->cursed = 1; break; default: panic("impossible mkobj"); } otmp->owt = weight(otmp); return(otmp); } letter(c) { return(('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z')); } weight(obj) register struct obj *obj; { register int wt = objects[obj->otyp].oc_weight; return(wt ? wt*obj->quan : (obj->quan + 1)/2); } mkgold(num,x,y) register int num; { register struct gen *gtmp; register int amount = num ? num : 1 + (rnd(dlevel+2) * rnd(30)); if(gtmp = g_at(x,y,fgold)) gtmp->gflag += amount; else { gtmp = newgen(); gtmp->ngen = fgold; gtmp->gx = x; gtmp->gy = y; gtmp->gflag = amount; fgold = gtmp; if (ismklev) levl[x][y].scrsym = '$'; } } #file hack.mon.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.mon.c version 1.0.1 - some unimportant changes */ #include "hack.h" #include "hack.mfndpos.h" #define SIZE(x) (int)(sizeof(x) / sizeof(x[0])) #define NULL (char *) 0 extern struct monst *makemon(); int warnlevel; /* used by movemon and dochugw */ long lastwarntime; int lastwarnlev; char *warnings[] = { "white", "pink", "red", "ruby", "purple", "black" }; movemon() { register struct monst *mtmp; register int fr; warnlevel = 0; while(1) { /* find a monster that we haven't treated yet */ /* note that mtmp or mtmp->nmon might get killed while mtmp moves, so we cannot just walk down the chain (even new monsters might get created!) */ for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->mlstmv < moves) goto next_mon; /* treated all monsters */ break; next_mon: mtmp->mlstmv = moves; if(mtmp->mblinded && !--mtmp->mblinded) mtmp->mcansee = 1; if(mtmp->mimic) continue; if(mtmp->mspeed != MSLOW || !(moves%2)){ /* continue if the monster died fighting */ fr = -1; if(Conflict && cansee(mtmp->mx,mtmp->my) && (fr = fightm(mtmp)) == 2) continue; if(fr<0 && dochugw(mtmp)) continue; } if(mtmp->mspeed == MFAST && dochugw(mtmp)) continue; } warnlevel -= u.ulevel; if(warnlevel >= SIZE(warnings)) warnlevel = SIZE(warnings)-1; if(warnlevel >= 0) if(warnlevel > lastwarnlev || moves > lastwarntime + 5){ register char *rr; switch(Warning & (LEFT_RING | RIGHT_RING)){ case LEFT_RING: rr = "Your left ring glows"; break; case RIGHT_RING: rr = "Your right ring glows"; break; case LEFT_RING | RIGHT_RING: rr = "Both your rings glow"; break; default: rr = "Your fingertips glow"; break; } pline("%s %s!", rr, warnings[warnlevel]); lastwarntime = moves; lastwarnlev = warnlevel; } dmonsfree(); /* remove all dead monsters */ } justswld(mtmp,name) register struct monst *mtmp; char *name; { mtmp->mx = u.ux; mtmp->my = u.uy; u.ustuck = mtmp; pmon(mtmp); kludge("%s swallows you!",name); more(); seeoff(1); u.uswldtim = 0; u.uswallow = 1; swallowed(); } youswld(mtmp,dam,die,name) register struct monst *mtmp; register int dam,die; char *name; { if(mtmp != u.ustuck) return; kludge("%s digests you!",name); u.uhp -= dam; if(u.uswldtim++ == die){ pline("It totally digests you!"); u.uhp = -1; } if(u.uhp < 1) done_in_by(mtmp); } dochugw(mtmp) register struct monst *mtmp; { register int x = mtmp->mx; register int y = mtmp->my; register int d = dochug(mtmp); register int dd; if(!d) /* monster still alive */ if(Warning) if(!mtmp->mpeaceful) if((dd = dist(mtmp->mx,mtmp->my)) < dist(x,y)) if(dd < 100) if(!cansee(mtmp->mx, mtmp->my) || (mtmp->minvis && !See_invisible)) if(mtmp->data->mlevel > warnlevel) warnlevel = mtmp->data->mlevel; return(d); } /* returns 1 if monster died moving, 0 otherwise */ dochug(mtmp) register struct monst *mtmp; { register struct permonst *mdat; register int tmp; if(mtmp->cham && !rn2(6)) (void) newcham(mtmp, &mons[dlevel+14+rn2(CMNUM-14-dlevel)]); mdat = mtmp->data; if(mdat->mlevel < 0) panic("bad monster %c (%d)",mdat->mlet,mdat->mlevel); if((!(moves%20) || index("ViT",mdat->mlet)) && mtmp->mhp<mtmp->orig_hp) mtmp->mhp++; /* regenerate monsters. */ if(mtmp->mfroz) return(0); /* frozen monsters don't do anything. */ if(mtmp->msleep) {/* wake up a monster, or get out of here. */ if(cansee(mtmp->mx,mtmp->my) && !Stealth && (!index("NL",mdat->mlet) || !rn2(50)) && (Aggravate_monster || (!rn2(7) && !mtmp->mimic))) mtmp->msleep = 0; else return(0); } /* not frozen or sleeping: wipe out texts written in the dust */ wipe_engr_at(mtmp->mx, mtmp->my, 1); /* confused monsters get unconfused with small probability */ if(mtmp->mconf && !rn2(50)) mtmp->mconf = 0; /* some monsters teleport */ if(mtmp->mflee && index("tNL", mdat->mlet) && !rn2(40)){ rloc(mtmp); return(0); } if(mdat->mmove < rnd(6)) return(0); if((mtmp->mflee || mtmp->mconf || (index("BIuy", mdat->mlet) && !rn2(4)) || (mdat->mlet == 'L' && !u.ugold && (mtmp->mgold || rn2(2))) || dist(mtmp->mx,mtmp->my) > 2 || (!mtmp->mcansee && !rn2(4)) || mtmp->mpeaceful ) && (tmp = m_move(mtmp,0)) && mdat->mmove <= 12) return(tmp == 2); if(tmp == 2) return(1); /* monster died moving */ if(!index("Ea", mdat->mlet) && dist(mtmp->mx, mtmp->my) < 3 && !mtmp->mpeaceful && u.uhp > 0 && !sengr_at("Elbereth", u.ux, u.uy) && !sobj_at(SCR_SCARE_MONSTER, u.ux, u.uy)) { if(mhitu(mtmp)) return(1); /* monster died (e.g. 'y' or 'F') */ } /* extra movement for fast monsters */ if(mdat->mmove-12 > rnd(12)) tmp = m_move(mtmp,1); return(tmp == 2); } inrange(mtmp) register struct monst *mtmp; { register schar tx,ty; /* spit fire only when both in a room or both in a corridor */ if(inroom(u.ux,u.uy) != inroom(mtmp->mx,mtmp->my)) return; tx = u.ux - mtmp->mx; ty = u.uy - mtmp->my; if((!tx && abs(ty) < 8) || (!ty && abs(tx) < 8) || (abs(tx) == abs(ty) && abs(tx) < 8)){ /* spit fire in the direction of @ (not nec. hitting) */ buzz(-1,mtmp->mx,mtmp->my,sgn(tx),sgn(ty)); if(u.uhp < 1) done_in_by(mtmp); } } m_move(mtmp,after) register struct monst *mtmp; { register struct monst *mtmp2; register int nx,ny,omx,omy,appr,nearer,cnt,i,j; xchar gx,gy,nix,niy,chcnt; schar chi; boolean likegold, likegems, likeobjs; schar mmoved = 0; /* not strictly nec.: chi >= 0 will do */ coord poss[9]; int info[9]; if(mtmp->mtrapped) { i = mintrap(mtmp); if(i == 2) return(2); /* he died */ if(i == 1) return(0); /* still in trap, so didnt move */ } if(mtmp->mhide && o_at(mtmp->mx,mtmp->my) && rn2(10)) return(0); /* do not leave hiding place */ /* my dog gets a special treatment */ if(mtmp->mtame) { return( dog_move(mtmp, after) ); } /* likewise for shopkeeper */ if(mtmp->isshk) { mmoved = shk_move(); goto postmov; } /* and for the guard */ if(mtmp->isgd) { mmoved = gd_move(); goto postmov; } if(mtmp->data->mlet == 't' && !rn2(5)) { if(rn2(2)) mnexto(mtmp); else rloc(mtmp); mmoved = 1; goto postmov; } if(mtmp->data->mlet == 'D' && !mtmp->mcan) inrange(mtmp); if(!Blind && !Confusion && mtmp->data->mlet == 'U' && !mtmp->mcan && cansee(mtmp->mx,mtmp->my) && rn2(5)) { pline("%s's gaze has confused you!", Monnam(mtmp)); if(rn2(5)) mtmp->mcan = 1; Confusion = d(3,4); /* timeout */ } if(!mtmp->mflee && u.uswallow && u.ustuck != mtmp) return(1); appr = 1; if(mtmp->mflee) appr = -1; if(mtmp->mconf || Invis || !mtmp->mcansee || (index("BIy",mtmp->data->mlet) && !rn2(3))) appr = 0; omx = mtmp->mx; omy = mtmp->my; gx = u.ux; gy = u.uy; if(mtmp->data->mlet == 'L' && appr == 1 && mtmp->mgold > u.ugold) appr = -1; #ifdef TRACK /* random criterion for 'smell' should use mtmp->msmell */ if('a' <= mtmp->data->mlet && mtmp->data->mlet <= 'z') { extern coord *gettrack(); register coord *cp; schar mroom; mroom = inroom(omx,omy); if(mroom < 0 || mroom != inroom(u.ux,u.uy)){ cp = gettrack(omx,omy); if(cp){ gx = cp->x; gy = cp->y; } } } #endif TRACK /* look for gold or jewels nearby */ likegold = (index("LOD", mtmp->data->mlet) != NULL); likegems = (index("ODu", mtmp->data->mlet) != NULL); likeobjs = mtmp->mhide; #define SRCHRADIUS 25 { xchar mind = SRCHRADIUS; /* not too far away */ register int dd; if(likegold){ register struct gen *gold; for(gold = fgold; gold; gold = gold->ngen) if((dd = DIST(omx,omy,gold->gx,gold->gy)) < mind){ mind = dd; gx = gold->gx; gy = gold->gy; } } if(likegems || likeobjs){ register struct obj *otmp; for(otmp = fobj; otmp; otmp = otmp->nobj) if(likeobjs || otmp->olet == GEM_SYM) if(mtmp->data->mlet != 'u' || objects[otmp->otyp].g_val != 0) if((dd = DIST(omx,omy,otmp->ox,otmp->oy)) < mind){ mind = dd; gx = otmp->ox; gy = otmp->oy; } } if(mind < SRCHRADIUS && appr == -1) { if(dist(omx,omy) < 10) { gx = u.ux; gy = u.uy; } else appr = 1; } } nix = omx; niy = omy; cnt = mfndpos(mtmp,poss,info, mtmp->data->mlet == 'u' ? NOTONL : index(" VWZ", mtmp->data->mlet) ? NOGARLIC : ALLOW_TRAPS); /* ALLOW_ROCK for some monsters ? */ chcnt = 0; chi = -1; for(i=0; i<cnt; i++) { nx = poss[i].x; ny = poss[i].y; for(j=0; j<MTSZ && j<cnt-1; j++) if(nx == mtmp->mtrack[j].x && ny == mtmp->mtrack[j].y) if(rn2(4*(cnt-j))) goto nxti; #ifdef STUPID /* some stupid compilers think that this is too complicated */ { int d1 = DIST(nx,ny,gx,gy); int d2 = DIST(nix,niy,gx,gy); nearer = (d1 < d2); } #else nearer = (DIST(nx,ny,gx,gy) < DIST(nix,niy,gx,gy)); #endif STUPID if((appr == 1 && nearer) || (appr == -1 && !nearer) || !mmoved || (!appr && !rn2(++chcnt))){ nix = nx; niy = ny; chi = i; mmoved = 1; } nxti: ; } if(mmoved){ if(info[chi] & ALLOW_M){ mtmp2 = m_at(nix,niy); if(hitmm(mtmp,mtmp2) == 1 && rn2(4) && hitmm(mtmp2,mtmp) == 2) return(2); return(0); } if(info[chi] & ALLOW_U){ (void) hitu(mtmp, d(mtmp->data->damn, mtmp->data->damd)+1); return(0); } mtmp->mx = nix; mtmp->my = niy; for(j=MTSZ-1; j>0; j--) mtmp->mtrack[j] = mtmp->mtrack[j-1]; mtmp->mtrack[0].x = omx; mtmp->mtrack[0].y = omy; #ifndef NOWORM if(mtmp->wormno) worm_move(mtmp); #endif NOWORM } else { if(mtmp->data->mlet == 'u' && rn2(2)){ rloc(mtmp); return(0); } #ifndef NOWORM if(mtmp->wormno) worm_nomove(mtmp); #endif NOWORM } postmov: if(mmoved == 1) { if(mintrap(mtmp) == 2) /* he died */ return(2); if(likegold) mpickgold(mtmp); if(likegems) mpickgems(mtmp); if(mtmp->mhide) mtmp->mundetected = 1; } pmon(mtmp); return(mmoved); } mpickgold(mtmp) register struct monst *mtmp; { register struct gen *gold; while(gold = g_at(mtmp->mx, mtmp->my, fgold)){ mtmp->mgold += gold->gflag; freegold(gold); if(levl[mtmp->mx][mtmp->my].scrsym == '$') newsym(mtmp->mx, mtmp->my); } } mpickgems(mtmp) register struct monst *mtmp; { register struct obj *otmp; for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp->olet == GEM_SYM) if(otmp->ox == mtmp->mx && otmp->oy == mtmp->my) if(mtmp->data->mlet != 'u' || objects[otmp->otyp].g_val != 0){ freeobj(otmp); mpickobj(mtmp, otmp); if(levl[mtmp->mx][mtmp->my].scrsym == GEM_SYM) newsym(mtmp->mx, mtmp->my); /* %% */ return; /* pick only one object */ } } /* return number of acceptable neighbour positions */ mfndpos(mon,poss,info,flag) register struct monst *mon; coord poss[9]; int info[9], flag; { register int x,y,nx,ny,cnt = 0,tmp; register struct monst *mtmp; x = mon->mx; y = mon->my; if(mon->mconf) { flag |= ALLOW_ALL; flag &= ~NOTONL; } for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) if(nx != x || ny != y) if(isok(nx,ny)) if((tmp = levl[nx][ny].typ) >= DOOR) if(!(nx != x && ny != y && (levl[x][y].typ == DOOR || tmp == DOOR))){ info[cnt] = 0; if(nx == u.ux && ny == u.uy){ if(!(flag & ALLOW_U)) continue; info[cnt] = ALLOW_U; } else if(mtmp = m_at(nx,ny)){ if(!(flag & ALLOW_M)) continue; info[cnt] = ALLOW_M; if(mtmp->mtame){ if(!(flag & ALLOW_TM)) continue; info[cnt] |= ALLOW_TM; } } if(sobj_at(CLOVE_OF_GARLIC, nx, ny)) { if(flag & NOGARLIC) continue; info[cnt] |= NOGARLIC; } if(sobj_at(SCR_SCARE_MONSTER, nx, ny) || (!mon->mpeaceful && sengr_at("Elbereth", nx, ny))) { if(!(flag & ALLOW_SSM)) continue; info[cnt] |= ALLOW_SSM; } if(sobj_at(ENORMOUS_ROCK, nx, ny)) { if(!(flag & ALLOW_ROCK)) continue; info[cnt] |= ALLOW_ROCK; } if(!Invis && online(nx,ny)){ if(flag & NOTONL) continue; info[cnt] |= NOTONL; } /* we cannot avoid traps of an unknown kind */ { register struct gen *gtmp = g_at(nx, ny, ftrap); register int tt; if(gtmp) { tt = 1 << (gtmp->gflag & TRAPTYPE); if(mon->mtrapseen & tt){ if(!(flag & tt)) continue; info[cnt] |= tt; } } } poss[cnt].x = nx; poss[cnt].y = ny; cnt++; } return(cnt); } dist(x,y) int x,y; { return((x-u.ux)*(x-u.ux) + (y-u.uy)*(y-u.uy)); } poisoned(string, pname) register char *string, *pname; { if(Blind) pline("It was poisoned."); else pline("The %s was poisoned!",string); if(Poison_resistance) { pline("The poison doesn't seem to affect you."); return; } switch(rnd(6)) { case 1: u.uhp = -1; break; case 2: case 3: case 4: losestr(rn1(3,3)); break; case 5: case 6: losehp(rn1(10,6), pname); return; } if(u.uhp < 1) killer = pname; } mondead(mtmp) register struct monst *mtmp; { relobj(mtmp,1); unpmon(mtmp); relmon(mtmp); if(u.ustuck == mtmp) { u.ustuck = 0; if(u.uswallow) { u.uswldtim = 0; u.uswallow = 0; setsee(); docrt(); } } if(mtmp->isshk) shkdead(); if(mtmp->isgd) gddead(); #ifndef NOWORM if(mtmp->wormno) wormdead(mtmp); #endif NOWORM monfree(mtmp); } /* called when monster is moved to larger structure */ replmon(mtmp,mtmp2) register struct monst *mtmp, *mtmp2; { relmon(mtmp); monfree(mtmp); mtmp2->nmon = fmon; fmon = mtmp2; } relmon(mon) register struct monst *mon; { register struct monst *mtmp; if(mon == fmon) fmon = fmon->nmon; else { for(mtmp = fmon; mtmp->nmon != mon; mtmp = mtmp->nmon) ; mtmp->nmon = mon->nmon; } } /* we do not free monsters immediately, in order to have their name available shortly after their demise */ struct monst *fdmon; /* chain of dead monsters, need not to be saved */ monfree(mtmp) register struct monst *mtmp; { mtmp->nmon = fdmon; fdmon = mtmp; } dmonsfree(){ register struct monst *mtmp; while(mtmp = fdmon){ fdmon = mtmp->nmon; free((char *) mtmp); } } killed(mtmp) struct monst *mtmp; { #ifdef lint #define NEW_SCORING #endif lint register int tmp,tmp2,nk,x,y; register struct permonst *mdat = mtmp->data; if(mtmp->cham) mdat = PM_CHAM; if(Blind) pline("You destroy it!"); else { pline("You destroy %s!", mtmp->mtame ? amonnam(mtmp, "poor") : monnam(mtmp)); } if(u.umconf) { if(!Blind) pline("Your hands stop glowing blue."); u.umconf = 0; } /* count killed monsters */ #define MAXMONNO 100 nk = 1; /* in case we cannot find it in mons */ tmp = mdat - mons; /* index in mons array (if not 'd', '@', ...) */ if(tmp >= 0 && tmp < CMNUM+2) { extern char fut_geno[]; u.nr_killed[tmp]++; if((nk = u.nr_killed[tmp]) > MAXMONNO && !index(fut_geno, mdat->mlet)) charcat(fut_geno, mdat->mlet); } /* punish bad behaviour */ if(mdat->mlet == '@') Telepat = 0, u.uluck -= 2; if(mtmp->mpeaceful || mtmp->mtame) u.uluck--; if(mdat->mlet == 'u') u.uluck -= 5; /* give experience points */ tmp = 1 + mdat->mlevel * mdat->mlevel; if(mdat->ac < 3) tmp += 2*(7 - mdat->ac); if(index("AcsSDXaeRTVWU&In:P", mdat->mlet)) tmp += 2*mdat->mlevel; if(index("DeV&P",mdat->mlet)) tmp += (7*mdat->mlevel); if(mdat->mlevel > 6) tmp += 50; #ifdef NEW_SCORING /* ------- recent addition: make nr of points decrease when this is not the first of this kind */ { int ul = u.ulevel; int ml = mdat->mlevel; if(ul < 14) /* points are given based on present and future level */ for(tmp2 = 0; !tmp2 || ul + tmp2 <= ml; tmp2++) if(u.uexp + 1 + (tmp + ((tmp2 <= 0) ? 0 : 4<<(tmp2-1)))/nk >= 10*pow((unsigned)(ul-1))) if(++ul == 14) break; tmp2 = ml - ul -1; tmp = (tmp + ((tmp2 < 0) ? 0 : 4<<tmp2))/nk; if(!tmp) tmp = 1; } /* note: ul is not necessarily the future value of u.ulevel */ /* ------- end of recent valuation change ------- */ #endif NEW_SCORING u.uexp += tmp; u.urexp += 4*tmp; flags.botl = 1; while(u.ulevel < 14 && u.uexp >= 10*pow(u.ulevel-1)){ pline("Welcome to level %d.", ++u.ulevel); tmp = rnd(10); if(tmp < 3) tmp = rnd(10); u.uhpmax += tmp; u.uhp += tmp; flags.botl = 1; } /* dispose of monster and make cadaver */ x = mtmp->mx; y = mtmp->my; mondead(mtmp); tmp = mdat->mlet; if(tmp == 'm') { /* he killed a minotaur, give him a wand of digging */ /* note: the dead minotaur will be on top of it! */ mksobj_at(WAND_SYM, WAN_DIGGING, x, y); /* if(cansee(x,y)) atl(x,y,fobj->olet); */ stackobj(fobj); } else #ifndef NOWORM if(tmp == 'w') { mksobj_at(WEAPON_SYM, WORM_TOOTH, x, y); stackobj(fobj); } else #endif NOWORM if(!letter(tmp) || !rn2(3)) tmp = 0; if(levl[x][y].typ >= DOOR) /* might be mimic in wall */ if(x != u.ux || y != u.uy) /* might be here after swallowed */ if(index("NTVm&",mdat->mlet) || rn2(5)) { mkobj_at(tmp,x,y); if(cansee(x,y)) atl(x,y,fobj->olet); stackobj(fobj); } } kludge(str,arg) register char *str,*arg; { if(Blind) { if(*str == '%') pline(str,"It"); else pline(str,"it"); } else pline(str,arg); } rescham() /* force all chameleons to become normal */ { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->cham) { mtmp->cham = 0; (void) newcham(mtmp,PM_CHAM); } } newcham(mtmp,mdat) /* make a chameleon look like a new monster */ /* returns 1 if the monster actually changed */ register struct monst *mtmp; register struct permonst *mdat; { register int mhp, hpn, hpd; if(mdat == mtmp->data) return(0); /* still the same monster */ #ifndef NOWORM if(mtmp->wormno) wormdead(mtmp); /* throw tail away */ #endif NOWORM hpn = mtmp->mhp; hpd = (mtmp->data->mlevel)*8; if(!hpd) hpd = 4; mtmp->data = mdat; mhp = (mdat->mlevel)*8; /* new hp: same fraction of max as before */ mtmp->mhp = 2 + (hpn*mhp)/hpd; hpn = mtmp->orig_hp; mtmp->orig_hp = 2 + (hpn*mhp)/hpd; mtmp->minvis = (mdat->mlet == 'I') ? 1 : 0; #ifndef NOWORM if(mdat->mlet == 'w' && getwn(mtmp)) initworm(mtmp); #endif NOWORM unpmon(mtmp); /* necessary for 'I' and to force pmon */ /* perhaps we should clear mtmp->mtame here? */ pmon(mtmp); return(1); } mnexto(mtmp) /* Make monster mtmp next to you (if possible) */ struct monst *mtmp; { extern coord enexto(); coord mm; mm = enexto(u.ux, u.uy); mtmp->mx = mm.x; mtmp->my = mm.y; pmon(mtmp); } rloc(mtmp) struct monst *mtmp; { register int tx,ty; register char ch = mtmp->data->mlet; #ifndef NOWORM if(ch == 'w' && mtmp->mx) return; /* do not relocate worms */ #endif NOWORM do { tx = rn1(COLNO-3,2); ty = rn2(ROWNO); } while(!goodpos(tx,ty)); mtmp->mx = tx; mtmp->my = ty; if(u.ustuck == mtmp){ if(u.uswallow) { u.ux = tx; u.uy = ty; docrt(); } else u.ustuck = 0; } pmon(mtmp); } ishuman(mtmp) register struct monst *mtmp; { return(mtmp->data->mlet == '@'); } setmangry(mtmp) register struct monst *mtmp; { if(!mtmp->mpeaceful) return; if(mtmp->mtame) return; mtmp->mpeaceful = 0; if(ishuman(mtmp)) pline("%s gets angry!", Monnam(mtmp)); } #file hack.monst.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.monst version 1.0.1 - corrected symbol for lurker above */ #include "mklev.h" #include "def.eshk.h" #include "def.edog.h" extern char plname[PL_NSIZ]; struct permonst mons[PMONCOUNT] = { { "bat", 'B',1,22,8,1,4,0 }, { "gnome", 'G',1,6,5,1,6,0 }, { "hobgoblin", 'H',1,9,5,1,8,0 }, { "jackal", 'J',0,12,7,1,2,0 }, { "kobold", 'K',1,6,7,1,4,0 }, { "leprechaun", 'L',5,15,8,1,2,0 }, { "giant rat", 'r',0,12,7,1,3,0 }, { "acid blob", 'a',2,3,8,0,0,0 }, { "floating eye", 'E',2,1,9,0,0,0 }, { "homunculus", 'h',2,6,6,1,3,0 }, { "imp", 'i',2,6,2,1,4,0 }, { "orc", 'O',2,9,6,1,8,0 }, { "yellow light", 'y',3,15,0,0,0,0 }, { "zombie", 'Z',2,6,8,1,8,0 }, { "giant ant", 'A',3,18,3,1,6,0 }, { "fog cloud", 'f',3,1,0,1,6,0 }, { "nymph", 'N',6,12,9,1,2,0 }, { "piercer", 'p',3,1,3,2,6,0 }, { "quasit", 'Q',3,15,3,1,4,0 }, { "quivering blob", 'q',3,1,8,1,8,0 }, { "violet fungi", 'v',3,1,7,1,4,0 }, { "giant beetle", 'b',4,6,4,3,4,0 }, { "centaur", 'C',4,18,4,1,6,0 }, { "cockatrice", 'c',4,6,6,1,3,0 }, { "gelatinous cube", 'g',4,6,8,2,4,0 }, { "jaguar", 'j',4,15,6,1,8,0 }, { "killer bee", 'k',4,14,4,2,4,0 }, { "snake", 'S',4,15,3,1,6,0 }, { "freezing sphere", 'F',2,13,4,0,0,0 }, { "owlbear", 'o',5,12,5,2,6,0 }, { "rust monster", 'R',10,18,3,0,0,0 }, { "scorpion", 's',5,15,3,1,4,0 }, { "tengu", 't',5,13,5,1,7,0 }, { "wraith", 'W',5,12,5,1,6,0 }, #ifdef NOWORM { "wumpus", 'w',8,3,2,3,6,0 }, #else { "long worm", 'w',8,3,5,1,4,0 }, #endif NOWORM { "large dog", 'd',6,15,4,2,4,0 }, { "leocrotta", 'l',6,18,4,3,6,0 }, { "mimic", 'M',7,3,7,3,4,0 }, { "troll", 'T',7,12,4,2,6,0 }, { "unicorn", 'u',8,24,5,1,10,0 }, { "yeti", 'Y',5,15,6,1,6,0 }, { "stalker", 'I',8,12,3,4,4,0 }, { "umber hulk", 'U',9,6,2,2,10,0 }, { "vampire", 'V',8,12,1,1,6,0 }, { "xorn", 'X',8,9,-2,4,6,0 }, { "xan", 'x',7,18,-2,2,4,0 }, { "zruty", 'z',9,8,3,3,6,0 }, { "chameleon", ':',6,5,6,4,2,0 }, { "dragon", 'D',10,9,-1,3,8,0 }, { "ettin", 'e',10,12,3,2,8,0 }, { "lurker above", '\'',10,3,3,0,0,0 }, { "nurse", 'n',11,6,0,1,3,0 }, { "trapper", ',',12,3,3,0,0,0 }, { "purple worm", 'P',15,9,6,2,8,0 }, { "demon", '&',10,12,-4,1,4,0 }, { "minotaur", 'm',15,15,6,4,8,0 }, { "shopkeeper", '@', 10, 18, 0, 4, 8, sizeof(struct eshk) }, { "ghost", ' ', 10, 3, -5, 1, 1, sizeof(plname) }, { "little dog", 'd', 2, 18, 6, 1, 6, sizeof(struct edog) }, { "dog", 'd', 4, 16, 5, 1, 6, sizeof(struct edog) }, { "large dog", 'd', 6, 15, 4, 2, 4, sizeof(struct edog) } }; #file hack.objnam.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #define Sprintf (void) sprintf #define Strcat (void) strcat #define Strcpy (void) strcpy #define PREFIX 15 extern char *eos(); extern int bases[]; char * strprepend(s,pref) /*register*/ char *s, *pref; { /*register*/ int i = strlen(pref); if(i > PREFIX) { pline("WARNING: prefix too short."); return(s); } s -= i; (void) movmem(pref, s, i); /* do not copy trailing 0 */ /* (void) strncpy(s, pref, i); */ /* do not copy trailing 0 */ return(s); } char * sitoa(a) int a; { static char buf[13]; Sprintf(buf, (a < 0) ? "%d" : "+%d", a); return(buf); } char * xname(obj) /*register*/ struct obj *obj; { static char bufr[BUFSZ]; /*register*/ char *buf = &(bufr[PREFIX]); /* leave room for "17 -3 " */ /*register*/ int nn = objects[obj->otyp].oc_name_known; /*register*/ char *an = objects[obj->otyp].oc_name; /*register*/ char *dn = objects[obj->otyp].oc_descr; /*register*/ char *un = objects[obj->otyp].oc_uname; /*register*/ int pl = (obj->quan != 1); if(!obj->dknown && !Blind) obj->dknown = 1; /* %% doesnt belong here */ switch(obj->olet) { case AMULET_SYM: Strcpy(buf, (obj->spe < 0 && obj->known) ? "cheap plastic imitation of the " : ""); Strcat(buf,"Amulet of Yendor"); break; case TOOL_SYM: if(!nn) { Strcpy(buf, dn); break; } Strcpy(buf,an); break; case FOOD_SYM: if(obj->otyp == CLOVE_OF_GARLIC && pl) { pl = 0; Strcpy(buf, "cloves of garlic"); break; } if(obj->otyp == DEAD_HOMUNCULUS && pl) { pl = 0; Strcpy(buf, "dead homunculi"); break; } /* fungis ? */ /* fall into next case */ case WEAPON_SYM: if(obj->otyp == WORM_TOOTH && pl) { pl = 0; Strcpy(buf, "worm teeth"); break; } if(obj->otyp == CRYSKNIFE && pl) { pl = 0; Strcpy(buf, "crysknives"); break; } /* fall into next case */ case ARMOR_SYM: case CHAIN_SYM: case ROCK_SYM: Strcpy(buf,an); break; case BALL_SYM: Sprintf(buf, "%sheavy iron ball", (obj->owt > objects[obj->otyp].oc_weight) ? "very " : ""); break; case POTION_SYM: if(nn || un || !obj->dknown) { Strcpy(buf, "potion"); if(pl) { pl = 0; Strcat(buf, "s"); } if(!obj->dknown) break; if(un) { Strcat(buf, " called "); Strcat(buf, un); } else { Strcat(buf, " of "); Strcat(buf, an); } } else { Strcpy(buf, dn); Strcat(buf, " potion"); } break; case SCROLL_SYM: Strcpy(buf, "scroll"); if(pl) { pl = 0; Strcat(buf, "s"); } if(!obj->dknown) break; if(nn) { Strcat(buf, " of "); Strcat(buf, an); } else if(un) { Strcat(buf, " called "); Strcat(buf, un); } else { Strcat(buf, " labeled "); Strcat(buf, dn); } break; case WAND_SYM: if(!obj->dknown) Sprintf(buf, "wand"); else if(nn) Sprintf(buf, "wand of %s", an); else if(un) Sprintf(buf, "wand called %s", un); else Sprintf(buf, "%s wand", dn); break; case RING_SYM: if(!obj->dknown) Sprintf(buf, "ring"); else if(nn) Sprintf(buf, "ring of %s", an); else if(un) Sprintf(buf, "ring called %s", un); else Sprintf(buf, "%s ring", dn); break; case GEM_SYM: if(!obj->dknown) { Strcpy(buf, "gem"); break; } if(!nn) { Sprintf(buf, "%s gem", dn); break; } if(pl && !strncmp("worthless piece", an, 15)) { pl = 0; Sprintf(buf, "worthless pieces%s", an+15); break; } Strcpy(buf, an); if(obj->otyp >= TURQUOISE && obj->otyp <= JADE) Strcat(buf, " stone"); break; default: Sprintf(buf,"glorkum %c (0%o) %d %d", obj->olet,obj->olet,obj->otyp,obj->spe); } if(pl) { /*register*/ char *p = eos(buf)-1; if(*p == 's' || *p == 'z' || *p == 'x' || (*p == 'h' && p[-1] == 's')) Strcat(buf, "es"); /* boxes */ else if(*p == 'y' && !index(vowels, p[-1])) Strcpy(p, "ies"); /* rubies, zruties */ else Strcat(buf, "s"); } if(obj->onamelth) { Strcat(buf, " named "); Strcat(buf, ONAME(obj)); } return(buf); } char * mydoname(obj) /*register*/ struct obj *obj; { char prefix[PREFIX]; /*register*/ char *bp; obj->known = obj->dknown = 1; objects[obj->otyp].oc_name_known = 1; bp = xname(obj); if(obj->quan != 1) Sprintf(prefix, "%d ", obj->quan); else Strcpy(prefix, "a "); switch(obj->olet) { case AMULET_SYM: if(strncmp(bp, "cheap ", 6)) Strcpy(prefix, "the "); break; case ARMOR_SYM: if(obj->owornmask & W_ARMOR) Strcat(bp, " (being worn)"); Strcat(prefix, sitoa(obj->spe - 10 + objects[obj->otyp].a_ac)); Strcat(prefix, " "); break; case WEAPON_SYM: Strcat(prefix, sitoa(obj->spe)); Strcat(prefix, " "); break; case WAND_SYM: Sprintf(eos(bp), " (%d)", obj->spe); break; case RING_SYM: if(obj->owornmask & W_RINGR) Strcat(bp, " (on right hand)"); if(obj->owornmask & W_RINGL) Strcat(bp, " (on left hand)"); if(objects[obj->otyp].bits & SPEC) { Strcat(prefix, sitoa(obj->spe)); Strcat(prefix, " "); } break; } if(obj->owornmask & W_WEP) Strcat(bp, " (weapon in hand)"); if(obj->unpaid) Strcat(bp, " (unpaid)"); if(!strcmp(prefix, "a ") && index(vowels, *bp)) Strcpy(prefix, "an "); bp = strprepend(bp, prefix); return(bp); } char * doname(obj) /*register*/ struct obj *obj; { char prefix[PREFIX]; /*register*/ char *bp = xname(obj); if(obj->quan != 1) Sprintf(prefix, "%d ", obj->quan); else Strcpy(prefix, "a "); switch(obj->olet) { case AMULET_SYM: if(strncmp(bp, "cheap ", 6)) Strcpy(prefix, "the "); break; case ARMOR_SYM: if(obj->owornmask & W_ARMOR) Strcat(bp, " (being worn)"); if(obj->known) { Strcat(prefix, sitoa(obj->spe - 10 + objects[obj->otyp].a_ac)); Strcat(prefix, " "); } break; case WEAPON_SYM: if(obj->known) { Strcat(prefix, sitoa(obj->spe)); Strcat(prefix, " "); } break; case WAND_SYM: if(obj->known) Sprintf(eos(bp), " (%d)", obj->spe); break; case RING_SYM: if(obj->owornmask & W_RINGR) Strcat(bp, " (on right hand)"); if(obj->owornmask & W_RINGL) Strcat(bp, " (on left hand)"); if(obj->known && (objects[obj->otyp].bits & SPEC)) { Strcat(prefix, sitoa(obj->spe)); Strcat(prefix, " "); } break; } if(obj->owornmask & W_WEP) Strcat(bp, " (weapon in hand)"); if(obj->unpaid) Strcat(bp, " (unpaid)"); if(!strcmp(prefix, "a ") && index(vowels, *bp)) Strcpy(prefix, "an "); bp = strprepend(bp, prefix); return(bp); } /* used only in hack.fight.c (thitu) */ setan(str,buf) /*register*/ char *str,*buf; { if(index(vowels,*str)) Sprintf(buf, "an %s", str); else Sprintf(buf, "a %s", str); } char * aobjnam(otmp,verb) /*register*/ struct obj *otmp; /*register*/ char *verb; { /*register*/ char *bp = xname(otmp); char prefix[PREFIX]; if(otmp->quan != 1) { Sprintf(prefix, "%d ", otmp->quan); bp = strprepend(bp, prefix); } if(verb) { /* verb is given in plural (i.e., without trailing s) */ Strcat(bp, " "); if(otmp->quan != 1) Strcat(bp, verb); else if(!strcmp(verb, "are")) Strcat(bp, "is"); else { Strcat(bp, verb); Strcat(bp, "s"); } } return(bp); } char *wrp[] = { "wand", "ring", "potion", "scroll", "gem" }; char wrpsym[] = { WAND_SYM, RING_SYM, POTION_SYM, SCROLL_SYM, GEM_SYM }; struct obj * readobjnam(bp) /*register*/ char *bp; { /*register*/ char *p; /*register*/ int i; int cnt, spe, spesgn, typ, heavy; char let; char *un, *dn, *an; /* int the = 0; char *oname = 0; */ cnt = spe = spesgn = typ = heavy = 0; let = 0; an = dn = un = 0; for(p = bp; *p; p++) if('A' <= *p && *p <= 'Z') *p += 'a'-'A'; if(!strncmp(bp, "the ", 4)){ /* the = 1; */ bp += 4; } else if(!strncmp(bp, "an ", 3)){ cnt = 1; bp += 3; } else if(!strncmp(bp, "a ", 2)){ cnt = 1; bp += 2; } if(!cnt && digit(*bp)){ cnt = atoi(bp); while(digit(*bp)) bp++; while(*bp == ' ') bp++; } if(!cnt) cnt = 1; /* %% what with "gems" etc. ? */ if(*bp == '+' || *bp == '-'){ spesgn = (*bp++ == '+') ? 1 : -1; spe = atoi(bp); while(digit(*bp)) bp++; while(*bp == ' ') bp++; } else { p = rindex(bp, '('); if(p) { if(p > bp && p[-1] == ' ') p[-1] = 0; else *p = 0; p++; spe = atoi(p); while(digit(*p)) p++; if(strcmp(p, ")")) spe = 0; else spesgn = 1; } } /* now we have the actual name, as delivered by xname, say green potions called whisky scrolls labeled "QWERTY" egg dead zruties fortune cookies very heavy iron ball named hoei wand of wishing elven cloak */ for(p = bp; *p; p++) if(!strncmp(p, " named ", 7)) { *p = 0; /* oname = p+7; */ } for(p = bp; *p; p++) if(!strncmp(p, " called ", 8)) { *p = 0; un = p+8; } for(p = bp; *p; p++) if(!strncmp(p, " labeled ", 9)) { *p = 0; dn = p+9; } /* first change to singular if necessary */ if(cnt != 1) { /* find "cloves of garlic", "worthless pieces of blue glass" */ for(p = bp; *p; p++) if(!strncmp(p, "s of ", 5)){ while(*p = p[1]) p++; goto sing; } /* remove -s or -es (boxes) or -ies (rubies, zruties) */ p = eos(bp); if(p[-1] == 's') { if(p[-2] == 'e') { if(p[-3] == 'i') { if(!strcmp(p-7, "cookies")) goto mins; Strcpy(p-3, "y"); goto sing; } /* note: cloves / knives from clove / knife */ if(!strcmp(p-6, "knives")) { Strcpy(p-3, "fe"); goto sing; } /* note: nurses, axes but boxes */ if(!strcmp(p-5, "boxes")) { p[-2] = 0; goto sing; } } mins: p[-1] = 0; } else { if(!strcmp(p-9, "homunculi")) { Strcpy(p-1, "us"); /* !! makes string longer */ goto sing; } if(!strcmp(p-5, "teeth")) { Strcpy(p-5, "tooth"); goto sing; } /* here we cannot find the plural suffix */ } } sing: if(!strcmp(bp, "amulet of yendor")) { typ = AMULET_OF_YENDOR; goto typfnd; } p = eos(bp); if(!strcmp(p-5, " mail")){ /* Note: ring mail is not a ring ! */ let = ARMOR_SYM; an = bp; goto srch; } for(i = 0; i < sizeof(wrpsym); i++) { /*register*/ int j = strlen(wrp[i]); if(!strncmp(bp, wrp[i], j)){ let = wrpsym[i]; bp += j; if(!strncmp(bp, " of ", 4)) an = bp+4; /* else if(*bp) ?? */ goto srch; } if(!strcmp(p-j, wrp[i])){ let = wrpsym[i]; p -= j; *p = 0; if(p[-1] == ' ') p[-1] = 0; dn = bp; goto srch; } } if(!strcmp(p-6, " stone")){ p[-6] = 0; let = GEM_SYM; an = bp; goto srch; } if(!strcmp(bp, "very heavy iron ball")){ heavy = 1; typ = HEAVY_IRON_BALL; goto typfnd; } an = bp; srch: if(!an && !dn && !un) goto any; i = 1; if(let) i = bases[letindex(let)]; while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){ if(an && strcmp(an, objects[i].oc_name)) goto nxti; if(dn && strcmp(dn, objects[i].oc_descr)) goto nxti; if(un && strcmp(un, objects[i].oc_uname)) goto nxti; typ = i; goto typfnd; nxti: i++; } any: if(!let) let = wrpsym[rn2(sizeof(wrpsym))]; typ = probtype(let); typfnd: { /*register*/ struct obj *otmp; extern struct obj *mksobj(); let = objects[typ].oc_olet; if(let == FOOD_SYM && typ >= CORPSE) let = typ-CORPSE+'@'+((typ > CORPSE + 'Z' - '@') ? 'a'-'Z'-1 : 0); otmp = mksobj(let, typ); if(heavy) otmp->owt += 15; if(cnt > 0 && index("%?!*)", let) && (cnt < 4 || (let == WEAPON_SYM && typ <= ROCK && cnt < 20))) otmp->quan = cnt; if(spesgn == -1) otmp->cursed = 1; if(spe > 3 && spe > otmp->spe) spe = 0; else if(let == WAND_SYM) spe = otmp->spe; if(spe == 3 && u.uluck < 0) spesgn = -1; if(let != WAND_SYM && spesgn == -1) spe = -spe; if(let == BALL_SYM) spe = 0; else if(let == AMULET_SYM) spe = -1; else if(typ == WAN_WISHING && rn2(10)) spe = 0; else if(let == ARMOR_SYM) { spe += 10 - objects[typ].a_ac; if(spe > 5 && rn2(spe - 5)) otmp->cursed = 1; } otmp->spe = spe; return(otmp); } } #file hack.options.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.options.c version 1.0.1 - added HACKOPTIONS */ #include "config.h" #ifdef OPTIONS #include "hack.h" extern char *eos(); initoptions() { register char *opts; extern char *getenv(); flags.time = flags.nonews = flags.notombstone = flags.end_own = flags.no_rest_on_space = FALSE; flags.end_top = 5; flags.end_around = 4; /* flags.oneline is set in hack.tty.c depending on the baudrate */ if(opts = getenv("HACKOPTIONS")) parseoptions(opts,TRUE); } parseoptions(opts, from_env) register char *opts; boolean from_env; { register char *op,*op2; unsigned num; boolean negated; if(op = index(opts, ',')) { *op++ = 0; parseoptions(op, from_env); } if(op = index(opts, ' ')) { op2 = op; while(*op++) if(*op != ' ') *op2++ = *op; } if(!*opts) return; negated = FALSE; while((*opts == '!') || !strncmp(opts, "no", 2)) { if(*opts == '!') opts++; else opts += 2; negated = !negated; } if(!strncmp(opts,"tombstone",4)) { flags.notombstone = negated; return; } if(!strncmp(opts,"news",4)) { flags.nonews = negated; return; } if(!strncmp(opts,"time",4)) { flags.time = !negated; flags.botl = 1; return; } if(!strncmp(opts,"oneline",1)) { flags.oneline = !negated; return; } if(!strncmp(opts,"restonspace",4)) { flags.no_rest_on_space = negated; return; } /* endgame:5t[op] 5a[round] o[wn] */ if(!strncmp(opts,"endgame",3)) { op = index(opts,':'); if(!op) goto bad; op++; while(*op) { num = 1; if(digit(*op)) { num = atoi(op); while(digit(*op)) op++; } else if(*op == '!') { negated = !negated; op++; } switch(*op) { case 't': flags.end_top = num; break; case 'a': flags.end_around = num; break; case 'o': flags.end_own = !negated; break; default: goto bad; } while(letter(*++op)) ; if(*op == '/') op++; } return; } bad: if(!from_env) { if(!strncmp(opts, "help", 4)) { pline("%s%s%s", "To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ", "give the command 'o' followed by the line `<options>' while playing. ", "Here <options> is a list of <option>s separated by commas." ); pline("%s%s", "Simple (boolean) options are oneline,rest_on_space,news,time,tombstone. ", "These can be negated by prefixing them with '!' or \"no\"." ); pline("%s%s%s", "A compound option is endgame; it is followed by a description of what ", "parts of the scorelist you want to see. You might for example say: ", "`endgame:own scores/5 top scores/4 around my score'." ); return; } pline("Bad option: %s.", opts); pline("Type `o help<cr>' for help."); return; } puts("Bad syntax in HACKOPTIONS."); puts("Use for example:"); puts( "HACKOPTIONS=\"!restonspace,notombstone,endgame:own/5 topscorers/4 around me\"" ); getret(); } doset() { char buf[BUFSZ]; pline("What options do you want to set? "); getlin(buf); if(!buf[0]) { (void) strcpy(buf,"HACKOPTIONS="); if(flags.oneline) (void) strcat(buf,"oneline,"); if(flags.nonews) (void) strcat(buf,"nonews,"); if(flags.time) (void) strcat(buf,"time,"); if(flags.notombstone) (void) strcat(buf,"notombstone,"); if(flags.no_rest_on_space) (void) strcat(buf,"!rest_on_space,"); if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){ (void) sprintf(eos(buf), "endgame: %d topscores/%d around me", flags.end_top, flags.end_around); if(flags.end_own) (void) strcat(buf, "/own scores"); } else { register char *eop = eos(buf); if(*--eop == ',') *eop = 0; } pline(buf); } else parseoptions(buf, FALSE); return(0); } #endif OPTIONS #file hack.o_init.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "config.h" /* for typedefs */ #include "def.objects.h" extern char ismklev; int letindex(let) register char let; { register int i = 0; register char ch; while((ch = obj_symbols[i++]) != 0) if(ch == let) return(i); return(0); } init_objects(){ register int i, j, first, last, sum, end; register char let, *tmp; /* init base; if probs given check that they add up to 100, otherwise compute probs; shuffle descriptions */ end = sizeof(objects)/sizeof(objects[0]); first = 0; while( first < end ) { let = objects[first].oc_olet; last = first+1; while(last < end && objects[last].oc_olet == let && objects[last].oc_name != NULL) last++; i = letindex(let); if((!i && let != ILLOBJ_SYM) || bases[i] != 0) panic("initialization error"); bases[i] = first; check: #include "hack.onames.h" if(ismklev && let == GEM_SYM) { extern xchar dlevel; for(j=0; j < 9-dlevel/3; j++) objects[first+j].oc_prob = 0; first += j; if(first >= last || first >= LAST_GEM) printf("Not enough gems? - first=%d last=%d j=%d LAST_GEM=%d\n", first, last, j, LAST_GEM); for(j = first; j < LAST_GEM; j++) objects[j].oc_prob = (20+j-first)/(LAST_GEM-first); } sum = 0; for(j = first; j < last; j++) sum += objects[j].oc_prob; if(sum == 0) { for(j = first; j < last; j++) objects[j].oc_prob = (100+j-first)/(last-first); goto check; } if(sum != 100) panic ("init-prob error for %c", let); /* shuffling is rather meaningless in mklev, but we must update last anyway */ if(objects[first].oc_descr != NULL && let != TOOL_SYM){ /* shuffle, also some additional descriptions */ while(last < end && objects[last].oc_olet == let) last++; j = last; while(--j > first) { i = first + rn2(j+1-first); tmp = objects[j].oc_descr; objects[j].oc_descr = objects[i].oc_descr; objects[i].oc_descr = tmp; } } first = last; } } probtype(let) register char let; { register int i = bases[letindex(let)]; register int prob = rn2(100); while((prob -= objects[i].oc_prob) >= 0) i++; if(objects[i].oc_olet != let || !objects[i].oc_name) panic("probtype(%c) error, i=%d", let, i); return(i); } #define SIZE(x) (sizeof x)/(sizeof x[0]) extern long *alloc(); savenames(fd) register int fd; { register int i; unsigned len; bwrite(fd, (char *) bases, sizeof bases); bwrite(fd, (char *) objects, sizeof objects); /* as long as we use only one version of Hack/Quest we need not save oc_name and oc_descr, but we must save oc_uname for all objects */ /* this assumes we always load at the same place */ for(i=0; i < SIZE(objects); i++) { #ifdef AMIGA if(objects[i].oc_name) { len = strlen(objects[i].oc_name)+1; bwrite(fd, (char *) &len, sizeof len); bwrite(fd, objects[i].oc_name, len); } if(objects[i].oc_descr) { len = strlen(objects[i].oc_descr)+1; bwrite(fd, (char *) &len, sizeof len); bwrite(fd, objects[i].oc_descr, len); } #endif if(objects[i].oc_uname) { len = strlen(objects[i].oc_uname)+1; bwrite(fd, (char *) &len, sizeof len); bwrite(fd, objects[i].oc_uname, len); } } } restnames(fd) register int fd; { register int i; unsigned len; mread(fd, (char *) bases, sizeof bases); mread(fd, (char *) objects, sizeof objects); for(i=0; i < SIZE(objects); i++) { if(objects[i].oc_name) { mread(fd, (char *) &len, sizeof len); objects[i].oc_name = (char *) alloc(len); mread(fd, objects[i].oc_name, len); } if(objects[i].oc_descr) { mread(fd, (char *) &len, sizeof len); objects[i].oc_descr = (char *) alloc(len); mread(fd, objects[i].oc_descr, len); } if(objects[i].oc_uname) { mread(fd, (char *) &len, sizeof len); objects[i].oc_uname = (char *) alloc(len); mread(fd, objects[i].oc_uname, len); } } }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/05/86)
#file hack.pri.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.pri.c version 1.0.1 - tiny change in mnewsym() - added time */ #include "hack.h" #include <stdio.h> xchar scrlx, scrhx, scrly, scrhy; /* corners of new area on screen */ extern char *hu_stat[]; /* in eat.c */ swallowed() { char *ulook = "|@|"; ulook[1] = u.usym; cls(); curs(u.ux-1, u.uy+1); myprintf("/-\\"); curx = u.ux+2; curs(u.ux-1, u.uy+2); myprintf(ulook); curx = u.ux+2; curs(u.ux-1, u.uy+3); myprintf("\\-/"); curx = u.ux+2; u.udispl = 1; u.udisx = u.ux; u.udisy = u.uy; } /*VARARGS1*/ boolean panicking; panic(str,a1,a2,a3,a4,a5,a6) char *str; { if(panicking++) hackexit(1); /* avoid loops */ home(); myprintf(" Suddenly, the dungeon collapses.\n"); myprintf(" ERROR: "); myprintf(str,a1,a2,a3,a4,a5,a6); /* if(fork()) */ done("panic"); /* else */ /* abort(); */ /* generate core dump */ } atl(x,y,ch) register int x,y; { register struct rm *crm = &levl[x][y]; if(x<0 || x>COLNO-1 || y<0 || y>ROWNO-1) panic("at(%d,%d,%c_%o_)",x,y,ch,ch); if(crm->seen && crm->scrsym == ch) return; crm->scrsym = ch; crm->new = 1; on_scr(x,y); } on_scr(x,y) register int x,y; { if(x<scrlx) scrlx = x; if(x>scrhx) scrhx = x; if(y<scrly) scrly = y; if(y>scrhy) scrhy = y; } /* call: (x,y) - display (-1,0) - close (leave last symbol) (-1,-1)- close (undo last symbol) (-1,let)-open: initialize symbol (-2,let)-change let */ tmp_at(x,y) schar x,y; { static schar prevx, prevy; static char let; if((int)x == -2){ /* change let call */ let = y; return; } if((int)x == -1 && (int)y >= 0){ /* open or close call */ let = y; prevx = -1; return; } if(prevx >= 0 && cansee(prevx,prevy)) { delay_output(); prl(prevx, prevy); /* in case there was a monster */ at(prevx, prevy, levl[prevx][prevy].scrsym); } if(x >= 0){ /* normal call */ if(cansee(x,y)) at(x,y,let); prevx = x; prevy = y; } else { /* close call */ let = 0; prevx = -1; } } /* like the previous, but the symbols are first erased on completion */ Tmp_at(x,y) schar x,y; { static char let; static xchar cnt; static coord tc[COLNO]; /* but watch reflecting beams! */ register int xx,yy; if((int)x == -1) { if(y > 0) { /* open call */ let = y; cnt = 0; return; } /* close call (do not distinguish y==0 and y==-1) */ while(cnt--) { xx = tc[cnt].x; yy = tc[cnt].y; prl(xx, yy); at(xx, yy, levl[xx][yy].scrsym); } cnt = let = 0; /* superfluous */ return; } if((int)x == -2) { /* change let call */ let = y; return; } /* normal call */ if(cansee(x,y)) { if(cnt) delay_output(); at(x,y,let); tc[cnt].x = x; tc[cnt].y = y; if(++cnt >= COLNO) panic("Tmp_at overflow?"); levl[x][y].new = 0; /* prevent pline-nscr erasing --- */ } } #ifndef GRAPHICS at(x,y,ch) register xchar x,y; char ch; { #ifndef lint /* if xchar is unsigned, lint will complain about if(x < 0) */ if(x < 0 || x > COLNO-1 || y < 0 || y > ROWNO-1) panic("At gets 0%o at %d %d(%d %d)",ch,x,y,u.ux,u.uy); #endif lint if(!ch) { home(); myprintf("At gets null at %2d %2d.",x,y); curx = ROWNO+1; return; } y += 2; curs(x,y); myputchar(ch); curx++; } #endif prme(){ if(!Invis) at(u.ux,u.uy,u.usym); } docrt() { register int x,y; register struct rm *room; register struct monst *mtmp; if(u.uswallow) { swallowed(); return; } cls(); if(!Invis){ levl[(u.udisx = u.ux)][(u.udisy = u.uy)].scrsym = u.usym; levl[u.udisx][u.udisy].seen = 1; u.udispl = 1; } else u.udispl = 0; /* %% - is this really necessary? */ for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->mdispl && !(room = &levl[mtmp->mx][mtmp->my])->new && !room->seen) mtmp->mdispl = 0; for(y = 0; y < ROWNO; y++) for(x = 0; x < COLNO; x++) if((room = &levl[x][y])->new) { room->new = 0; at(x,y,room->scrsym); } else if(room->seen) at(x,y,room->scrsym); scrlx = COLNO; scrly = ROWNO; scrhx = scrhy = 0; flags.botlx = 1; bot(); } docorner(xmin,ymax) register int xmin,ymax; { register int x,y; register struct rm *room; if(u.uswallow) { /* Can be done more efficiently */ swallowed(); return; } for(y = 0; y < ymax; y++) { curs(xmin,y+2); cl_end(); for(x = xmin; x < COLNO; x++) { if((room = &levl[x][y])->new) { room->new = 0; at(x,y,room->scrsym); } else if(room->seen) at(x,y,room->scrsym); } } } pru() { if(u.udispl && (Invis || u.udisx != u.ux || u.udisy != u.uy)) /* if(! levl[u.udisx][u.udisy].new) */ if(!vism_at(u.udisx, u.udisy)) newsym(u.udisx, u.udisy); if(Invis) { u.udispl = 0; prl(u.ux,u.uy); } else if(!u.udispl || u.udisx != u.ux || u.udisy != u.uy) { atl(u.ux, u.uy, u.usym); u.udispl = 1; u.udisx = u.ux; u.udisy = u.uy; } levl[u.ux][u.uy].seen = 1; } #ifndef NOWORM #include "def.wseg.h" extern struct wseg *m_atseg; #endif NOWORM /* print a position that is visible for @ */ prl(x,y) { register struct rm *room; register struct monst *mtmp; register struct obj *otmp; if(x == u.ux && y == u.uy && !Invis) { pru(); return; } room = &levl[x][y]; if((!room->typ) || (room->typ<DOOR && levl[u.ux][u.uy].typ == CORR)) return; if((mtmp = m_at(x,y)) && !mtmp->mhide && (!mtmp->minvis || See_invisible)) { #ifndef NOWORM if(m_atseg) pwseg(m_atseg); else #endif NOWORM pmon(mtmp); } else if(otmp = o_at(x,y)) atl(x,y,otmp->olet); else if(mtmp && (!mtmp->minvis || See_invisible)) { /* must be a hiding monster, but not hiding right now */ /* assume for the moment that long worms do not hide */ pmon(mtmp); } else if(g_at(x,y,fgold)) atl(x,y,'$'); else if(!room->seen || room->scrsym == ' ') { room->new = room->seen = 1; newsym(x,y); on_scr(x,y); } room->seen = 1; } char news0(x,y) register xchar x,y; { register struct obj *otmp; register struct gen *gtmp; struct rm *room; register char tmp; room = &levl[x][y]; if(!room->seen) tmp = ' '; else if(!Blind && (otmp = o_at(x,y))) tmp = otmp->olet; else if(!Blind && g_at(x,y,fgold)) tmp = '$'; else if(x == xupstair && y == yupstair) tmp = '<'; else if(x == xdnstair && y == ydnstair) tmp = '>'; else if((gtmp = g_at(x,y,ftrap)) && (gtmp->gflag & SEEN)) tmp = '^'; else switch(room->typ) { case SCORR: case SDOOR: tmp = room->scrsym; /* %% wrong after killing mimic ! */ break; case HWALL: tmp = '-'; break; case VWALL: tmp = '|'; break; case LDOOR: case DOOR: tmp = '+'; break; case CORR: tmp = CORR_SYM; break; case ROOM: if(room->lit || cansee(x,y) || Blind) tmp = '.'; else tmp = ' '; break; default: tmp = ERRCHAR; } return(tmp); } newsym(x,y) register int x,y; { atl(x,y,news0(x,y)); } /* used with wand of digging: fill scrsym and force display */ mnewsym(x,y) register int x,y; { register struct monst *mtmp = m_at(x,y); register struct rm *room; char newscrsym; if(!mtmp || (mtmp->minvis && !See_invisible) || (mtmp->mhide && o_at(x,y))){ room = &levl[x][y]; newscrsym = news0(x,y); if(room->scrsym != newscrsym) { room->scrsym = newscrsym; room->seen = 0; } } } nosee(x,y) register int x,y; { register struct rm *room; room = &levl[x][y]; if(room->scrsym == '.' && !room->lit && !Blind) { room->scrsym = ' '; room->new = 1; on_scr(x,y); } } #ifndef QUEST prl1(x,y) register int x,y; { if(u.dx) { if(u.dy) { prl(x-(2*u.dx),y); prl(x-u.dx,y); prl(x,y); prl(x,y-u.dy); prl(x,y-(2*u.dy)); } else { prl(x,y-1); prl(x,y); prl(x,y+1); } } else { prl(x-1,y); prl(x,y); prl(x+1,y); } } nose1(x,y) register int x,y; { if(u.dx) { if(u.dy) { nosee(x,u.uy); nosee(x,u.uy-u.dy); nosee(x,y); nosee(u.ux-u.dx,y); nosee(u.ux,y); } else { nosee(x,y-1); nosee(x,y); nosee(x,y+1); } } else { nosee(x-1,y); nosee(x,y); nosee(x+1,y); } } #endif QUEST vism_at(x,y) register int x,y; { register struct monst *mtmp; register int csi = (See_invisible != 0); return((x == u.ux && y == u.uy && (!Invis || csi)) ? 1 : ((mtmp = m_at(x,y)) && (!mtmp->minvis || csi) && (!mtmp->mhide || !o_at(mtmp->mx,mtmp->my))) ? cansee(x,y) : 0); } #ifdef NEWSCR pobj(obj) register struct obj *obj; { register int show = (!obj->oinvis || See_invisible) && cansee(obj->ox,obj->oy); if(obj->odispl){ if(obj->odx != obj->ox || obj->ody != obj->oy || !show) if(!vism_at(obj->odx,obj->ody)){ newsym(obj->odx, obj->ody); obj->odispl = 0; } } if(show && !vism_at(obj->ox,obj->oy)){ atl(obj->ox,obj->oy,obj->olet); obj->odispl = 1; obj->odx = obj->ox; obj->ody = obj->oy; } } #endif NEWSCR unpobj(obj) register struct obj *obj; { /* if(obj->odispl){ if(!vism_at(obj->odx, obj->ody)) newsym(obj->odx, obj->ody); obj->odispl = 0; } */ if(!vism_at(obj->ox,obj->oy)) newsym(obj->ox,obj->oy); } seeobjs(){ register struct obj *obj, *obj2; for(obj = fobj; obj; obj = obj2) { obj2 = obj->nobj; if(obj->olet == FOOD_SYM && obj->otyp >= CORPSE && obj->age + 250 < moves) delobj(obj); } for(obj = invent; obj; obj = obj2) { obj2 = obj->nobj; if(obj->olet == FOOD_SYM && obj->otyp >= CORPSE && obj->age + 250 < moves) useup(obj); } } seemons(){ register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){ pmon(mtmp); #ifndef NOWORM if(mtmp->wormno) wormsee(mtmp->wormno); #endif NOWORM } } pmon(mon) register struct monst *mon; { register int show = ((!mon->minvis || See_invisible) && (!mon->mhide || !o_at(mon->mx,mon->my)) && cansee(mon->mx,mon->my)) || (Blind && Telepat); if(mon->mdispl){ if(mon->mdx != mon->mx || mon->mdy != mon->my || !show) unpmon(mon); } if(show && !mon->mdispl){ atl(mon->mx,mon->my, mon->mimic ? mon->mimic : mon->data->mlet); mon->mdispl = 1; mon->mdx = mon->mx; mon->mdy = mon->my; } } unpmon(mon) register struct monst *mon; { if(mon->mdispl){ newsym(mon->mdx, mon->mdy); mon->mdispl = 0; } } nscr() { register int x,y; register struct rm *room; if(u.uswallow || u.ux == FAR || flags.nscrinh) return; pru(); for(y = scrly; y <= scrhy; y++) for(x = scrlx; x <= scrhx; x++) if((room = &levl[x][y])->new) { room->new = 0; at(x,y,room->scrsym); } scrhx = scrhy = 0; scrlx = COLNO; scrly = ROWNO; } char oldbot[100], newbot[100]; /* 100 >= COLNO */ extern char *eos(); bot() { register char *ob = oldbot, *nb = newbot; register int i; if(flags.botlx) *ob = 0; flags.botl = flags.botlx = 0; (void) sprintf(newbot, "Level %-2d Gold %-5lu Hp %3d(%d) Ac %-2d Str ", dlevel, u.ugold, u.uhp, u.uhpmax, u.uac); if(u.ustr>18) { if(u.ustr>117) (void) strcat(newbot,"18/**"); else (void) sprintf(eos(newbot), "18/%02d",u.ustr-18); } else (void) sprintf(eos(newbot), "%-2d ",u.ustr); (void) sprintf(eos(newbot), " Exp %2d/%-5lu ", u.ulevel,u.uexp); (void) strcat(newbot, hu_stat[u.uhs]); if(flags.time) (void) sprintf(eos(newbot), " %ld", moves); if(strlen(newbot) >= COLNO) { register char *bp0, *bp1; bp0 = bp1 = newbot; do { if(*bp0 != ' ' || bp0[1] != ' ' || bp0[2] != ' ') *bp1++ = *bp0; } while(*bp0++); } for(i = 1; i<COLNO; i++) { if(*ob != *nb){ curs(i,ROWNO+2); (void) myputchar(*nb ? *nb : ' '); curx++; } if(*ob) ob++; if(*nb) nb++; } (void) strcpy(oldbot, newbot); } #ifdef WAN_PROBING mstatusline(mtmp) register struct monst *mtmp; { pline("Status of %s: ", monnam(mtmp)); pline("Level %-2d Gold %-5lu Hp %3d(%d) Ac %-2d Dam %d", mtmp->data->mlevel, mtmp->mgold, mtmp->mhp, mtmp->orig_hp, mtmp->data->ac, (mtmp->data->damn + 1) * (mtmp->data->damd + 1)); } #endif WAN_PROBING cls(){ if(flags.topl == 1) more(); flags.topl = 0; clear_screen(); flags.botlx = 1; } #file hack.read.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.read.c version 1.0.1 - tiny correction in SCR_MAGIC_MAPPING */ #include "hack.h" extern struct monst *makemon(); int identify(); doread() { register struct obj *scroll; register boolean confused = (Confusion != 0); register boolean known = FALSE; scroll = getobj("?", "read"); if(!scroll) return(0); if(!scroll->dknown && Blind) { pline("Being blind, you cannot read the formula on the scroll."); return(0); } if(Blind) pline("As you pronounce the formula on it, the scroll disappears."); else pline("As you read the scroll, it disappears."); if(confused) pline("Being confused, you mispronounce the magic words ... "); switch(scroll->otyp) { case SCR_ENCHANT_ARMOR: { extern struct obj *some_armor(); register struct obj *otmp = some_armor(); if(!otmp) { strange_feeling(scroll); return(1); } if(confused) { pline("Your %s glows silver for a moment.", objects[otmp->otyp].oc_name); otmp->rustfree = 1; break; } if(otmp->spe*2 + objects[otmp->otyp].a_ac > 23 && !rn2(3)) { pline("Your %s glows violently green for a while, then evaporates.", objects[otmp->otyp].oc_name); useup(otmp); break; } pline("Your %s glows green for a moment.", objects[otmp->otyp].oc_name); otmp->cursed = 0; otmp->spe++; break; } case SCR_DESTROY_ARMOR: if(confused) { register struct obj *otmp = some_armor(); if(!otmp) { strange_feeling(scroll); return(1); } pline("Your %s glows purple for a moment.", objects[otmp->otyp].oc_name); otmp->rustfree = 0; break; } if(uarm) { pline("Your armor turns to dust and falls to the floor!"); useup(uarm); } else if(uarmh) { pline("Your helmet turns to dust and is blown away!"); useup(uarmh); } else if(uarmg) { pline("Your gloves vanish!"); useup(uarmg); selftouch("You"); } else { strange_feeling(scroll); return(1); } break; case SCR_CONFUSE_MONSTER: if(confused) { pline("Your hands begin to glow purple."); Confusion += rnd(100); } else { pline("Your hands begin to glow blue."); u.umconf = 1; } break; case SCR_SCARE_MONSTER: { register int ct = 0; register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(cansee(mtmp->mx,mtmp->my)) { if(confused) mtmp->mflee = mtmp->mfroz = mtmp->msleep = 0; else mtmp->mflee = 1; ct++; } if(!ct) { if(confused) pline("You hear sad wailing in the distance."); else pline("You hear maniacal laughter in the distance."); } break; } case SCR_BLANK_PAPER: if(confused) pline("You see strange patterns on this scroll."); else pline("This scroll seems to be blank."); break; case SCR_REMOVE_CURSE: { register struct obj *obj; if(confused) pline("You feel like you need some help."); else pline("You feel like someone is helping you."); for(obj = invent; obj ; obj = obj->nobj) if(obj->owornmask) obj->cursed = confused; if(Punished && !confused) { Punished = 0; freeobj(uchain); unpobj(uchain); free((char *) uchain); uball->spe = 0; uball->owornmask &= ~W_BALL; uchain = uball = (struct obj *) 0; } break; } case SCR_CREATE_MONSTER: { register int cnt = 1; if(!rn2(73)) cnt += rn2(4) + 1; if(confused) cnt += 12; while(cnt--) (void) makemon(confused ? PM_ACIDBLOB : (struct permonst *) 0, u.ux, u.uy); break; } case SCR_ENCHANT_WEAPON: if(!uwep) { strange_feeling(scroll); return(1); } if(confused) { pline("Your %s glows silver for a moment.", objects[uwep->otyp].oc_name); uwep->rustfree = 1; } else if(!chwepon(scroll, 1)) return(1); break; case SCR_DAMAGE_WEAPON: if(confused) { pline("Your %s glows purple for a moment.", objects[uwep->otyp].oc_name); uwep->rustfree = 0; } else if(!chwepon(scroll, -1)) return(1); break; case SCR_TAMING: { register int i,j; register int bd = confused ? 5 : 1; register struct monst *mtmp; for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++) if(mtmp = m_at(u.ux+i, u.uy+j)) (void) tamedog(mtmp, (struct obj *) 0); break; } case SCR_GENOCIDE: { extern char genocided[], fut_geno[]; char buf[BUFSZ]; register struct monst *mtmp, *mtmp2; pline("You have found a scroll of genocide!"); known = TRUE; if(confused) *buf = u.usym; else do { pline("What monster do you want to genocide (Type the letter)? "); getlin(buf); } while(strlen(buf) != 1 || !letter(*buf)); if(!index(fut_geno, *buf)) charcat(fut_geno, *buf); if(!index(genocided, *buf)) charcat(genocided, *buf); else { pline("Such monsters do not exist in this world."); break; } for(mtmp = fmon; mtmp; mtmp = mtmp2){ mtmp2 = mtmp->nmon; if(mtmp->data->mlet == *buf) mondead(mtmp); } pline("Wiped out all %c's.", *buf); if(*buf == u.usym) { killer = "scroll of genocide"; u.uhp = -1; } break; } case SCR_LIGHT: if(!Blind) known = TRUE; litroom(!confused); break; case SCR_TELEPORTATION: if(confused) level_tele(); else { #ifdef QUEST register int oux = u.ux, ouy = u.uy; tele(); if(dist(oux, ouy) > 100) known = TRUE; #else QUEST register int uroom = inroom(u.ux, u.uy); tele(); if(uroom != inroom(u.ux, u.uy)) known = TRUE; #endif QUEST } break; case SCR_GOLD_DETECTION: { register struct gen *head = confused ? ftrap : fgold; register struct gen *gtmp; if(!head) { strange_feeling(scroll); return(1); } else { known = TRUE; for(gtmp = head; gtmp; gtmp = gtmp->ngen) if(gtmp->gx != u.ux || gtmp->gy != u.uy) goto outgoldmap; /* only under me - no separate display required */ if(confused) pline("You feel very giddy!"); else pline("You notice some gold between your feet."); break; outgoldmap: cls(); for(gtmp = head; gtmp; gtmp = gtmp->ngen) at(gtmp->gx, gtmp->gy, '$'); prme(); if(confused) pline("You feel very greedy!"); else pline("You feel very greedy, and sense gold!"); more(); docrt(); } break; } case SCR_FOOD_DETECTION: { register int ct = 0, ctu = 0; register struct obj *obj; register char foodsym = confused ? POTION_SYM : FOOD_SYM; for(obj = fobj; obj; obj = obj->nobj) if(obj->olet == FOOD_SYM) { if(obj->ox == u.ux && obj->oy == u.uy) ctu++; else ct++; } if(!ct && !ctu) { strange_feeling(scroll); return(1); } else if(!ct) { known = TRUE; pline("You smell %s close nearby.", confused ? "something" : "food"); } else { known = TRUE; cls(); for(obj = fobj; obj; obj = obj->nobj) if(obj->olet == foodsym) at(obj->ox, obj->oy, FOOD_SYM); prme(); pline("Your nose tingles and you smell %s!", confused ? "something" : "food"); more(); docrt(); } break; } case SCR_IDENTIFY: /* known = TRUE; */ if(confused) pline("You identify this as an identify scroll."); else pline("This is an identify scroll."); useup(scroll); objects[SCR_IDENTIFY].oc_name_known = 1; if(!confused) while( !ggetobj("identify", identify, rn2(5) ? 1 : rn2(5)) && invent ); return(1); case SCR_MAGIC_MAPPING: { register struct rm *lev; register int num, zx, zy; known = TRUE; pline("On this scroll %s a map!", confused ? "was" : "is"); for(zy = 0; zy < ROWNO; zy++) for(zx = 0; zx < COLNO; zx++) { if(confused && rn2(7)) continue; lev = &(levl[zx][zy]); if((num = lev->typ) == 0) continue; if(num == SCORR) { lev->typ = CORR; lev->scrsym = CORR_SYM; } else if(num == SDOOR) { lev->typ = DOOR; lev->scrsym = '+'; /* do sth in doors ? */ } else if(lev->seen) continue; #ifndef QUEST if(num != ROOM) #endif QUEST { lev->seen = lev->new = 1; if(lev->scrsym == ' ') newsym(zx,zy); else on_scr(zx,zy); } } break; } case SCR_AMNESIA: { register int zx, zy; known = TRUE; for(zx = 0; zx < COLNO; zx++) for(zy = 0; zy < ROWNO; zy++) if(!confused || rn2(7)) if(!cansee(zx,zy)) levl[zx][zy].seen = 0; docrt(); pline("Thinking of Maud you forget everything else."); break; } case SCR_FIRE: { register int num; known = TRUE; if(confused) { pline("The scroll catches fire and you burn your hands."); losehp(1, "scroll of fire"); } else { pline("The scroll erupts in a tower of flame!"); if(Fire_resistance) pline("You are uninjured."); else { num = rnd(6); u.uhpmax -= num; losehp(num, "scroll of fire"); } } break; } case SCR_PUNISHMENT: known = TRUE; if(confused) { pline("You feel guilty."); break; } pline("You are being punished for your misbehaviour!"); if(Punished){ pline("Your iron ball gets heavier."); uball->owt += 15; break; } Punished = INTRINSIC; mkobj_at(CHAIN_SYM, u.ux, u.uy); setworn(fobj, W_CHAIN); mkobj_at(BALL_SYM, u.ux, u.uy); setworn(fobj, W_BALL); uball->spe = 1; /* special ball (see save) */ break; default: pline("What weird language is this written in? (%d)", scroll->otyp); impossible(); } if(!objects[scroll->otyp].oc_name_known) { if(known && !confused) { objects[scroll->otyp].oc_name_known = 1; u.urexp += 10; } else if(!objects[scroll->otyp].oc_uname) docall(scroll); } useup(scroll); return(1); } identify(otmp) register struct obj *otmp; { objects[otmp->otyp].oc_name_known = 1; otmp->known = otmp->dknown = 1; prinv(otmp); return(1); } litroom(on) register boolean on; { register int num,zx,zy; /* first produce the text (provided he is not blind) */ if(Blind) goto do_it; if(!on) { if(u.uswallow || !xdnstair || levl[u.ux][u.uy].typ == CORR || !levl[u.ux][u.uy].lit) { pline("It seems even darker in here than before."); return; } else pline("It suddenly becomes dark in here."); } else { if(u.uswallow){ pline("%s's stomach is lit.", Monnam(u.ustuck)); return; } if(!xdnstair){ pline("Nothing Happens"); return; } #ifdef QUEST pline("The cave lights up around you, then fades."); return; #else QUEST if(levl[u.ux][u.uy].typ == CORR) { pline("The corridor lights up around you, then fades."); return; } else if(levl[u.ux][u.uy].lit) { pline("The light here seems better now."); return; } else pline("The room is lit."); #endif QUEST } do_it: #ifdef QUEST return; #else QUEST if(levl[u.ux][u.uy].lit == on) return; if(levl[u.ux][u.uy].typ == DOOR) { if(levl[u.ux][u.uy+1].typ >= ROOM) zy = u.uy+1; else if(levl[u.ux][u.uy-1].typ >= ROOM) zy = u.uy-1; else zy = u.uy; if(levl[u.ux+1][u.uy].typ >= ROOM) zx = u.ux+1; else if(levl[u.ux-1][u.uy].typ >= ROOM) zx = u.ux-1; else zx = u.ux; } else { zx = u.ux; zy = u.uy; } for(seelx = u.ux; (num = levl[seelx-1][zy].typ) != CORR && num != 0; seelx--); for(seehx = u.ux; (num = levl[seehx+1][zy].typ) != CORR && num != 0; seehx++); for(seely = u.uy; (num = levl[zx][seely-1].typ) != CORR && num != 0; seely--); for(seehy = u.uy; (num = levl[zx][seehy+1].typ) != CORR && num != 0; seehy++); for(zy = seely; zy <= seehy; zy++) for(zx = seelx; zx <= seehx; zx++) { levl[zx][zy].lit = on; if(!Blind && dist(zx,zy) > 2) if(on) prl(zx,zy); else nosee(zx,zy); } if(!on) seehx = 0; #endif QUEST } #file hack.rip.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include <stdio.h> #include "hack.h" /* #include <libraries/dos.h> */ extern char plname[]; static char *rip[] = { " ----------", " / \\", " / REST \\", " / IN \\", " / PEACE \\", " / \\", " | |", " | |", " | |", " | |", " | |", " | 1001 |", " *| * * * | *", " _________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______\n", 0 }; outrip(){ register char **dp = rip; register char *dpx; /* struct DateStamp now, *DateStamp(); */ char buf[BUFSZ]; register int x,y; int thisyear; cls(); /* now = DateStamp(&now); */ thisyear = 85; (void) strcpy(buf, plname); buf[16] = 0; center(6, buf); (void) sprintf(buf, "%ld AU", u.ugold); center(7, buf); (void) sprintf(buf, "killed by%s", !strncmp(killer, "the ", 4) ? "" : !strcmp(killer, "starvation") ? "" : index(vowels, *killer) ? " an" : " a"); center(8, buf); (void) strcpy(buf, killer); if(strlen(buf) > 16) { register int i,i0,i1; i0 = i1 = 0; for(i = 0; i <= 16; i++) if(buf[i] == ' ') i0 = i, i1 = i+1; if(!i0) i0 = i1 = 16; buf[i1 + 16] = 0; center(10, buf+i1); buf[i0] = 0; } center(9, buf); (void) sprintf(buf, "19%2d", thisyear); center(11, buf); for(y=8; *dp; y++,dp++){ x = 0; dpx = *dp; while(dpx[x]) { while(dpx[x] == ' ') x++; curs(x,y); while(dpx[x] && dpx[x] != ' '){ extern int done_stopprint; if(done_stopprint) return; curx++; (void) myputchar(dpx[x++]); } } } getret(); } center(line, text) int line; char *text; { register char *ip,*op; ip = text; op = &rip[line][28 - ((strlen(text)+1)/2)]; while(*ip) *op++ = *ip++; } #file hack.rumors.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include <stdio.h> #include "config.h" #define CHARSZ 8 /* number of bits in a char */ #define RUMORFILE "rumors" extern long *alloc(); extern char *index(); int n_rumors = 0; int n_used_rumors = -1; char *usedbits; init_rumors(rumf) register FILE *rumf; { register int i; n_used_rumors = 0; while(skipline(rumf)) n_rumors++; rewind(rumf); i = n_rumors/CHARSZ; usedbits = (char *) alloc((unsigned)(i+1)); for( ; i>=0; i--) usedbits[i] = 0; } skipline(rumf) register FILE *rumf; { char line[COLNO]; while(1) { if(!fgets(line, sizeof(line), rumf)) return(0); if(index(line, '\n')) return(1); } } outline(rumf) register FILE *rumf; { char line[COLNO]; register char *ep; if(!fgets(line, sizeof(line), rumf)) return; if((ep = index(line, '\n')) != 0) *ep = 0; pline("This cookie has a scrap of paper inside! It reads: "); pline(line); } outrumor(){ register int rn,i; register FILE *rumf; if(n_rumors <= n_used_rumors || (rumf = fopen(RUMORFILE, "r")) == NULL) return; if(n_used_rumors < 0) init_rumors(rumf); if(!n_rumors) goto none; rn = rn2(n_rumors - n_used_rumors); i = 0; while(rn || used(i)) { (void) skipline(rumf); if(!used(i)) rn--; i++; } usedbits[i/CHARSZ] |= (1 << (i % CHARSZ)); n_used_rumors++; outline(rumf); none: (void) fclose(rumf); } used(i) register int i; { return(usedbits[i/CHARSZ] & (1 << (i % CHARSZ))); } #file hack.save.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" extern char genocided[60]; /* defined in Decl.c */ extern char fut_geno[60]; /* idem */ #include <signal.h> extern char SAVEF[], nul[]; extern char pl_character[PL_CSIZ]; extern long lseek(); extern struct obj *restobjchn(); extern struct monst *restmonchn(); extern char *index(); /* M.E.T. 11/20/85 */ dosave(){ if(dosave0(0)) { settty("Be seeing you ...\n"); hackexit(0); } #ifdef lint return(0); #endif lint } #ifndef NOSAVEONHANGUP hangup(){ (void) dosave0(1); hackexit(1); } #endif NOSAVEONHANGUP /* returns 1 if save successful */ dosave0(hu) int hu; { register int fd, ofd; int tmp; /* not register ! */ (void) signal(SIGHUP, SIG_IGN); (void) signal(SIGINT, SIG_IGN); if((fd = creat(SAVEF, FMASK)) < 0) { if(!hu) pline("Cannot open save file. (Continue or Quit)"); return(0); } makeicon(SAVEF, pl_character[0]); savelev(fd); saveobjchn(fd, invent); saveobjchn(fd, fcobj); savemonchn(fd, fallen_down); bwrite(fd, (char *) &flags, sizeof(struct flag)); bwrite(fd, (char *) &dlevel, sizeof dlevel); bwrite(fd, (char *) &maxdlevel, sizeof maxdlevel); bwrite(fd, (char *) &moves, sizeof moves); bwrite(fd, (char *) &u, sizeof(struct you)); bwrite(fd, (char *) pl_character, sizeof pl_character); bwrite(fd, (char *) genocided, sizeof genocided); bwrite(fd, (char *) fut_geno, sizeof fut_geno); savenames(fd); for(tmp = 1; tmp <= maxdlevel; tmp++) { glo(tmp); if((ofd = open(lock, 0)) < 0) continue; (void) getlev(ofd); (void) close(ofd); bwrite(fd, (char *) &tmp, sizeof tmp); /* level number */ savelev(fd); /* actual level */ (void) unlink(lock); } (void) close(fd); *index(lock, '.') = 0; (void) unlink(lock); return(1); } dorecover(fd) register int fd; { register int nfd; int tmp; /* not a register ! */ struct obj *otmp; (void) getlev(fd); invent = restobjchn(fd); for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->owornmask) setworn(otmp, otmp->owornmask); fcobj = restobjchn(fd); fallen_down = restmonchn(fd); mread(fd, (char *) &flags, sizeof(struct flag)); mread(fd, (char *) &dlevel, sizeof dlevel); mread(fd, (char *) &maxdlevel, sizeof maxdlevel); mread(fd, (char *) &moves, sizeof moves); mread(fd, (char *) &u, sizeof(struct you)); mread(fd, (char *) pl_character, sizeof pl_character); mread(fd, (char *) genocided, sizeof genocided); mread(fd, (char *) fut_geno, sizeof fut_geno); restnames(fd); while(1) { if(read(fd, (char *) &tmp, sizeof tmp) != sizeof tmp) break; if(getlev(fd)) break; /* this is actually an error */ glo(tmp); if((nfd = creat(lock, FMASK)) < 0) panic("Cannot open temp file %s!\n", lock); savelev(nfd); (void) close(nfd); } (void) lseek(fd, 0L, 0); (void) getlev(fd); (void) close(fd); (void) unlink(SAVEF); (void) delicon(SAVEF); if(Punished) { for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp->olet == CHAIN_SYM) goto chainfnd; panic("Cannot find the iron chain?"); chainfnd: uchain = otmp; if(!uball) { for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp->olet == BALL_SYM && otmp->spe) goto ballfnd; panic("Cannot find the iron ball?"); ballfnd: uball = otmp; } } #ifndef QUEST setsee(); /* only to recompute seelx etc. - these weren't saved */ #endif QUEST docrt(); } struct obj * restobjchn(fd) register int fd; { register struct obj *otmp, *otmp2; register struct obj *first = 0; int xl; #ifdef lint /* suppress "used before set" warning from lint */ otmp2 = 0; #endif lint while(1) { mread(fd, (char *) &xl, sizeof(xl)); if(xl == -1) break; otmp = newobj(xl); if(!first) first = otmp; else otmp2->nobj = otmp; mread(fd, (char *) otmp, (unsigned) xl + sizeof(struct obj)); if(!otmp->o_id) /* from MKLEV */ otmp->o_id = flags.ident++; otmp2 = otmp; } if(first && otmp2->nobj) { pline("Restobjchn: error reading objchn."); impossible(); otmp2->nobj = 0; } return(first); } struct monst * restmonchn(fd) register int fd; { register struct monst *mtmp, *mtmp2; register struct monst *first = 0; int xl; #ifdef FUNNYRELOC struct permonst *monbegin; mread(fd, (char *)&monbegin, sizeof(monbegin)); #endif #ifdef lint /* suppress "used before set" warning from lint */ mtmp2 = 0; #endif lint while(1) { mread(fd, (char *) &xl, sizeof(xl)); if(xl == -1) break; mtmp = newmonst(xl); if(!first) first = mtmp; else mtmp2->nmon = mtmp; mread(fd, (char *) mtmp, (unsigned) xl + sizeof(struct monst)); #ifdef DEBUGMON myprintf("Read Monster #%d", mtmp->data); #endif mtmp->data = &mons[ (int) mtmp->data ]; if(!mtmp->m_id) { /* from MKLEV */ mtmp->m_id = flags.ident++; #ifndef NOWORM if(mtmp->data->mlet == 'w' && getwn(mtmp)){ initworm(mtmp); mtmp->msleep = 0; } #endif NOWORM } if(mtmp->minvent) mtmp->minvent = restobjchn(fd); mtmp2 = mtmp; } if(first && mtmp2->nmon){ pline("Restmonchn: error reading monchn."); impossible(); mtmp2->nmon = 0; } return(first); } #file hack.search.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.search.c version 1.0.1 - small correction in findit() */ #include "hack.h" #include "def.trap.h" extern struct monst *makemon(); findit() /* returns number of things found */ { int num; register xchar zx,zy; register struct gen *gtmp; register struct monst *mtmp; xchar lx,hx,ly,hy; if(u.uswallow) return(0); for(lx = u.ux;(num = levl[lx-1][u.uy].typ) && num != CORR;lx--) ; for(hx = u.ux;(num = levl[hx+1][u.uy].typ) && num != CORR;hx++) ; for(ly = u.uy;(num = levl[u.ux][ly-1].typ) && num != CORR;ly--) ; for(hy = u.uy;(num = levl[u.ux][hy+1].typ) && num != CORR;hy++) ; num = 0; for(zy = ly;zy <= hy;zy++) for(zx = lx;zx <= hx;zx++) { if(levl[zx][zy].typ == SDOOR) { levl[zx][zy].typ = DOOR; atl(zx,zy,'+'); num++; } else if(levl[zx][zy].typ == SCORR) { levl[zx][zy].typ = CORR; atl(zx,zy,CORR_SYM); num++; } else if(gtmp = g_at(zx,zy,ftrap)) { if(gtmp->gflag == PIERC){ (void) makemon(PM_PIERC,zx,zy); num++; deltrap(gtmp); } else if(!(gtmp->gflag & SEEN)) { gtmp->gflag |= SEEN; if(!vism_at(zx,zy)) atl(zx,zy,'^'); num++; } } else if(mtmp = m_at(zx,zy)) if(mtmp->mimic){ seemimic(mtmp); num++; } } return(num); } dosearch() { register xchar x,y; register struct gen *tgen; register struct monst *mtmp; for(x = u.ux-1; x < u.ux+2; x++) for(y = u.uy-1; y < u.uy+2; y++) if(x != u.ux || y != u.uy) { if(levl[x][y].typ == SDOOR && !rn2(7)) { levl[x][y].typ = DOOR; levl[x][y].seen = 0; /* force prl */ prl(x,y); nomul(0); } else if(levl[x][y].typ == SCORR && !rn2(7)) { levl[x][y].typ = CORR; levl[x][y].seen = 0; /* force prl */ prl(x,y); nomul(0); } else { if(mtmp = m_at(x,y)) if(mtmp->mimic){ seemimic(mtmp); pline("You find a mimic."); return(1); } for(tgen = ftrap;tgen;tgen = tgen->ngen) if(tgen->gx == x && tgen->gy == y && !(tgen->gflag & SEEN) && !rn2(8)) { nomul(0); pline("You find a%s.", traps[tgen->gflag & TRAPTYPE]); if(tgen->gflag == PIERC) { deltrap(tgen); (void) makemon(PM_PIERC,x,y); return(1); } tgen->gflag |= SEEN; if(!vism_at(x,y)) atl(x,y,'^'); } } } return(1); } /* ARGSUSED */ doidtrap(str) /* register */ char *str; { register struct gen *tgen; register int x,y; if(!getdir()) return(0); x = u.ux + u.dx; y = u.uy + u.dy; for(tgen = ftrap; tgen; tgen = tgen->ngen) if(tgen->gx == x && tgen->gy == y && (tgen->gflag & SEEN)) { pline("That is a%s.", traps[tgen->gflag & TRAPTYPE]); return(0); } pline("I can't see a trap there."); return(0); } wakeup(mtmp) register struct monst *mtmp; { mtmp->msleep = 0; setmangry(mtmp); if(mtmp->mimic) seemimic(mtmp); } /* NOTE: we must check if(mtmp->mimic) before calling this routine */ seemimic(mtmp) register struct monst *mtmp; { mtmp->mimic = 0; unpmon(mtmp); pmon(mtmp); }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/05/86)
#file hack.shk.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #ifdef QUEST int shlevel = 0; struct monst *shopkeeper = 0; struct obj *billobjs = 0; obfree(obj,merge) register struct obj *obj, *merge; { free((char *) obj); } inshop(){ return(0); } addtobill(){} subfrombill(){} splitbill(){} dopay(){} paybill(){} doinvbill(){} shkdead(){} shk_move(){ return(0); } setshk(){} char *shkname(){ return(""); } #else #include "hack.mfndpos.h" #include "def.eshk.h" #define ESHK ((struct eshk *)(&(shopkeeper->mextra[0]))) #define NOTANGRY shopkeeper->mpeaceful #define ANGRY !NOTANGRY extern char plname[]; extern struct obj *o_on(); struct monst *shopkeeper = 0; struct bill_x *bill; int shlevel = 0; /* level of this shopkeeper */ struct obj *billobjs; /* objects on bill with bp->useup */ /* #define billobjs shopkeeper->minvent doesnt work so well, since we do not want these objects to be dropped when the shopkeeper is killed. (See also the save and restore routines.) */ /* invariants: obj->unpaid iff onbill(obj) [unless bp->useup] obj->quan <= bp->bquan */ long int total; char shtypes[] = "=/)%?!["; /* 8 shoptypes: 7 specialized, 1 mixed */ char *shopnam[] = { "engagement ring", "walking cane", "antique weapon", "delicatessen", "second hand book", "liquor", "used armor", "assorted antiques" }; char * shkname() { return(ESHK->shknam); } shkdead(){ rooms[ESHK->shoproom].rtype = 0; setpaid(); shopkeeper = 0; bill = (struct bill_x *) -1000; /* dump core when referenced */ } setpaid(){ /* caller has checked that shopkeeper exists */ register struct obj *obj; for(obj = invent; obj; obj = obj->nobj) obj->unpaid = 0; for(obj = fobj; obj; obj = obj->nobj) obj->unpaid = 0; while(obj = billobjs){ billobjs = obj->nobj; free((char *) obj); } ESHK->billct = 0; } addupbill(){ /* delivers result in total */ /* caller has checked that shopkeeper exists */ register int ct = ESHK->billct; register struct bill_x *bp = bill; total = 0; while(ct--){ total += bp->price * bp->bquan; bp++; } } inshop(){ register int tmp = inroom(u.ux,u.uy); if(tmp < 0 || rooms[tmp].rtype < 8) { u.uinshop = 0; if(shopkeeper && ESHK->billct){ pline("Somehow you escaped the shop without paying!"); addupbill(); pline("You stole for a total worth of %lu zorkmids.", total); ESHK->robbed += total; setpaid(); } if(tmp >= 0 && rooms[tmp].rtype == 7){ register struct monst *mtmp; pline("Welcome to David's treasure zoo!"); rooms[tmp].rtype = 0; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(!rn2(4)) mtmp->msleep = 0; } } else { if(shlevel != dlevel) setshk(); if(!shopkeeper) u.uinshop = 0; else if(!u.uinshop){ if(!ESHK->visitct || strncmp(ESHK->customer, plname, PL_NSIZ)){ /* He seems to be new here */ ESHK->visitct = 0; (void) strncpy(ESHK->customer,plname,PL_NSIZ); NOTANGRY = 1; } pline("Hello %s! Welcome%s to %s's %s shop!", plname, ESHK->visitct++ ? " again" : "", shkname(), shopnam[rooms[ESHK->shoproom].rtype - 8] ); u.uinshop = 1; } } return(u.uinshop); } setshk(){ register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->isshk){ shopkeeper = mtmp; bill = &(ESHK->bill[0]); shlevel = dlevel; if(ANGRY && strncpy(ESHK->customer,plname,PL_NSIZ)) NOTANGRY = 1; billobjs = 0; return; } shopkeeper = 0; bill = (struct bill_x *) -1000; /* dump core when referenced */ } struct bill_x * onbill(obj) register struct obj *obj; { register struct bill_x *bp; if(!shopkeeper) return(0); for(bp = bill; bp < &bill[ESHK->billct]; bp++) if(bp->bo_id == obj->o_id) { if(!obj->unpaid) pline("onbill: paid obj on bill?"); return(bp); } if(obj->unpaid) pline("onbill: unpaid obj not on bill?"); return(0); } /* called with two args on merge */ obfree(obj,merge) register struct obj *obj, *merge; { register struct bill_x *bp = onbill(obj); register struct bill_x *bpm; if(bp) { if(!merge){ bp->useup = 1; obj->unpaid = 0; /* only for doinvbill */ obj->nobj = billobjs; billobjs = obj; return; } bpm = onbill(merge); if(!bpm){ /* this used to be a rename */ impossible(); return; } else { /* this was a merger */ bpm->bquan += bp->bquan; ESHK->billct--; *bp = bill[ESHK->billct]; } } free((char *) obj); } pay(tmp) long tmp; { u.ugold -= tmp; shopkeeper->mgold += tmp; flags.botl = 1; } dopay(){ long ltmp; register struct bill_x *bp; int shknear = (shlevel == dlevel && shopkeeper && dist(shopkeeper->mx,shopkeeper->my) < 3); int pass, tmp; multi = 0; if(!inshop() && !shknear) { pline("You are not in a shop."); return(0); } if(!shknear && inroom(shopkeeper->mx,shopkeeper->my) != ESHK->shoproom){ pline("There is nobody here to receive your payment."); return(0); } if(!ESHK->billct){ pline("You do not owe %s anything.", monnam(shopkeeper)); if(!u.ugold){ pline("Moreover, you have no money."); return(1); } if(ESHK->robbed){ pline("But since the shop has been robbed recently,"); pline("you %srepay %s's expenses.", (u.ugold < ESHK->robbed) ? "partially " : "", monnam(shopkeeper)); pay((u.ugold<ESHK->robbed) ? u.ugold : ESHK->robbed); ESHK->robbed = 0; return(1); } if(ANGRY){ pline("But in order to appease %s,", amonnam(shopkeeper, "angry")); if(u.ugold >= 1000){ ltmp = 1000; pline(" you give him 1000 gold pieces."); } else { ltmp = u.ugold; pline(" you give him all your money."); } pay(ltmp); if(rn2(3)){ pline("%s calms down.", Monnam(shopkeeper)); NOTANGRY = 1; } else pline("%s is as angry as ever.", Monnam(shopkeeper)); } return(1); } for(pass = 0; pass <= 1; pass++) { tmp = 0; while(tmp < ESHK->billct) { bp = &bill[tmp]; if(!pass && !bp->useup) { tmp++; continue; } if(!dopayobj(bp)) return(1); bill[tmp] = bill[--ESHK->billct]; } } pline("Thank you for shopping in %s's %s store!", shkname(), shopnam[rooms[ESHK->shoproom].rtype - 8]); NOTANGRY = 1; return(1); } /* return 1 if paid successfully */ /* 0 if not enough money */ /* -1 if object could not be found (but was paid) */ dopayobj(bp) register struct bill_x *bp; { register struct obj *obj; long ltmp; /* find the object on one of the lists */ if(bp->useup) obj = o_on(bp->bo_id, billobjs); else if(!(obj = o_on(bp->bo_id, invent)) && !(obj = o_on(bp->bo_id, fobj)) && !(obj = o_on(bp->bo_id, fcobj))) { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(obj = o_on(bp->bo_id, mtmp->minvent)) break; for(mtmp = fallen_down; mtmp; mtmp = mtmp->nmon) if(obj = o_on(bp->bo_id, mtmp->minvent)) break; } if(!obj) { pline("Shopkeeper administration out of order."); impossible(); setpaid(); /* be nice to the player */ return(0); } if(!obj->unpaid && !bp->useup){ pline("Paid object on bill??"); impossible(); return(1); } obj->unpaid = 0; ltmp = bp->price * bp->bquan; if(ANGRY) ltmp += ltmp/3; if(u.ugold < ltmp){ pline("You don't have gold enough to pay %s.", doname(obj)); obj->unpaid = 1; return(0); } pay(ltmp); pline("You bought %s for %ld gold piece%s.", doname(obj), ltmp, (ltmp == 1) ? "" : "s"); if(bp->useup) { register struct obj *otmp = billobjs; if(obj == billobjs) billobjs = obj->nobj; else { while(otmp && otmp->nobj != obj) otmp = otmp->nobj; if(otmp) otmp->nobj = obj->nobj; else pline("Error in shopkeeper administration"); } free((char *) obj); } return(1); } /* routine called after dying (or quitting) with nonempty bill */ paybill(){ if(shopkeeper && ESHK->billct){ addupbill(); if(total > u.ugold){ shopkeeper->mgold += u.ugold; u.ugold = 0; pline("%s comes and takes all your possessions.", Monnam(shopkeeper)); } else { u.ugold -= total; shopkeeper->mgold += total; pline("%s comes and takes the %ld zorkmids you owed him.", Monnam(shopkeeper), total); } setpaid(); /* in case we create bones */ } } /* called in hack.c when we pickup an object */ addtobill(obj) register struct obj *obj; { register struct bill_x *bp; if(!inshop() || (u.ux == ESHK->shk.x && u.uy == ESHK->shk.y) || (u.ux == ESHK->shd.x && u.uy == ESHK->shd.y) || onbill(obj) /* perhaps we threw it away earlier */ ) return; if(ESHK->billct == BILLSZ){ pline("You got that for free!"); return; } bp = &bill[ESHK->billct]; bp->bo_id = obj->o_id; bp->bquan = obj->quan; bp->useup = 0; bp->price = getprice(obj); ESHK->billct++; obj->unpaid = 1; } splitbill(obj,otmp) register struct obj *obj, *otmp; { /* otmp has been split off from obj */ register struct bill_x *bp; register int tmp; bp = onbill(obj); if(!bp) { impossible(); return; } if(bp->bquan < otmp->quan) { pline("Negative quantity on bill??"); impossible(); } if(bp->bquan == otmp->quan) { pline("Zero quantity on bill??"); impossible(); } bp->bquan -= otmp->quan; /* addtobill(otmp); */ if(ESHK->billct == BILLSZ) otmp->unpaid = 0; else { tmp = bp->price; bp = &bill[ESHK->billct]; bp->bo_id = otmp->o_id; bp->bquan = otmp->quan; bp->useup = 0; bp->price = tmp; ESHK->billct++; } } subfrombill(obj) register struct obj *obj; { long ltmp; register int tmp; register struct obj *otmp; register struct bill_x *bp; if(!inshop() || (u.ux == ESHK->shk.x && u.uy == ESHK->shk.y) || (u.ux == ESHK->shd.x && u.uy == ESHK->shd.y)) return; if((bp = onbill(obj)) != 0){ obj->unpaid = 0; if(bp->bquan > obj->quan){ otmp = newobj(0); *otmp = *obj; bp->bo_id = otmp->o_id = flags.ident++; otmp->quan = (bp->bquan -= obj->quan); otmp->owt = 0; /* superfluous */ otmp->onamelth = 0; bp->useup = 1; otmp->nobj = billobjs; billobjs = otmp; return; } ESHK->billct--; *bp = bill[ESHK->billct]; return; } if(obj->unpaid){ pline("%s didn't notice.", Monnam(shopkeeper)); obj->unpaid = 0; return; /* %% */ } /* he dropped something of his own - probably wants to sell it */ if(shopkeeper->msleep || shopkeeper->mfroz || inroom(shopkeeper->mx,shopkeeper->my) != ESHK->shoproom) return; if(ESHK->billct == BILLSZ || ((tmp = shtypes[rooms[ESHK->shoproom].rtype-8]) && tmp != obj->olet) || index("_0", obj->olet)) { pline("%s seems not interested.", Monnam(shopkeeper)); return; } ltmp = getprice(obj) * obj->quan; if(ANGRY) { ltmp /= 3; NOTANGRY = 1; } else ltmp /= 2; if(ESHK->robbed){ if((ESHK->robbed -= ltmp) < 0) ESHK->robbed = 0; pline("Thank you for your contribution to restock this recently plundered shop."); return; } if(ltmp > shopkeeper->mgold) ltmp = shopkeeper->mgold; pay(-ltmp); if(!ltmp) pline("%s gladly accepts %s but cannot pay you at present.", Monnam(shopkeeper), doname(obj)); else pline("You sold %s and got %ld gold piece%s.", doname(obj), ltmp, (ltmp == 1) ? "" : "s"); } doinvbill(cl) int cl; { register unsigned tmp,cnt = 0; register struct obj *obj; char buf[BUFSZ]; if(!shopkeeper) return; for(tmp = 0; tmp < ESHK->billct; tmp++) if(bill[tmp].useup) cnt++; if(!cnt) return; if(!cl && !flags.oneline) cls(); if(!flags.oneline) myputs("\n\nUnpaid articles already used up:\n"); for(tmp = 0; tmp < ESHK->billct; tmp++) if(bill[tmp].useup){ for(obj = billobjs; obj; obj = obj->nobj) if(obj->o_id == bill[tmp].bo_id) break; if(!obj) { pline("Bad shopkeeper administration."); impossible(); return; } (void) sprintf(buf, "* - %s", doname(obj)); for(cnt=0; buf[cnt]; cnt++); while(cnt < 50) buf[cnt++] = ' '; (void) sprintf(&buf[cnt], " %5d zorkmids", bill[tmp].price * bill[tmp].bquan); if(flags.oneline) pline(buf); else myputs(buf); } if(!cl && !flags.oneline) { getret(); docrt(); } } getprice(obj) register struct obj *obj; { register int tmp,ac; switch(obj->olet){ case AMULET_SYM: tmp = 10*rnd(500); break; case TOOL_SYM: tmp = 10*rnd(150); break; case RING_SYM: tmp = 10*rnd(100); break; case WAND_SYM: tmp = 10*rnd(100); break; case SCROLL_SYM: tmp = 10*rnd(50); break; case POTION_SYM: tmp = 10*rnd(50); break; case FOOD_SYM: tmp = 10*rnd(5 + (2000/realhunger())); break; case GEM_SYM: tmp = 10*rnd(20); break; case ARMOR_SYM: ac = 10 - obj->spe; tmp = 100 + (10-ac)*(10-ac)*rnd(20-ac); break; case WEAPON_SYM: if(obj->otyp < BOOMERANG) tmp = 5*rnd(10); else if(obj->otyp == LONG_SWORD || obj->otyp == TWO_HANDED_SWORD) tmp = 10*rnd(150); else tmp = 10*rnd(75); break; case CHAIN_SYM: pline("Strange ..., carrying a chain?"); case BALL_SYM: tmp = 10; break; default: tmp = 10000; } return(tmp); } realhunger(){ /* not completely foolproof */ register int tmp = u.uhunger; register struct obj *otmp = invent; while(otmp){ if(otmp->olet == FOOD_SYM && !otmp->unpaid) tmp += objects[otmp->otyp].nutrition; otmp = otmp->nobj; } return((tmp <= 0) ? 1 : tmp); } shk_move(){ register struct monst *mtmp; register struct permonst *mdat = shopkeeper->data; register xchar gx,gy,omx,omy,nx,ny,nix,niy; register schar appr,i; schar shkr,tmp,chi,chcnt,cnt; boolean uondoor, avoid; coord poss[9]; int info[9]; omx = shopkeeper->mx; omy = shopkeeper->my; shkr = inroom(omx,omy); if(ANGRY && dist(omx,omy) < 3){ (void) hitu(shopkeeper, d(mdat->damn, mdat->damd)+1); return(0); } appr = 1; gx = ESHK->shk.x; gy = ESHK->shk.y; if(ANGRY){ long saveBlind = Blind; Blind = 0; if(shopkeeper->mcansee && !Invis && cansee(omx,omy)) { gx = u.ux; gy = u.uy; } Blind = saveBlind; avoid = FALSE; } else { #define GDIST(x,y) ((x-gx)*(x-gx)+(y-gy)*(y-gy)) if(Invis) avoid = FALSE; else { uondoor = (u.ux == ESHK->shd.x && u.uy == ESHK->shd.y); avoid = ((u.uinshop && dist(gx,gy) > 8) || uondoor); if(((!ESHK->robbed && !ESHK->billct) || avoid) && GDIST(omx,omy) < 3){ if(!online(omx,omy)) return(0); if(omx == gx && omy == gy) appr = gx = gy = 0; } } } if(omx == gx && omy == gy) return(0); if(shopkeeper->mconf) appr = 0; nix = omx; niy = omy; cnt = mfndpos(shopkeeper,poss,info, (avoid ? NOTONL : 0) | ALLOW_SSM); if(cnt == 0 && avoid && uondoor) cnt = mfndpos(shopkeeper,poss,info,ALLOW_SSM); chi = -1; chcnt = 0; for(i=0; i<cnt; i++){ nx = poss[i].x; ny = poss[i].y; if((tmp = levl[nx][ny].typ) = ROOM || (shkr != ESHK->shoproom && (tmp==CORR || tmp==DOOR))) #ifdef STUPID /* cater for stupid compilers */ { int zz; if((!appr && !rn2(++chcnt)) || (appr && (zz = GDIST(nix,niy)) && zz > GDIST(nx,ny))){ #else if((!appr && !rn2(++chcnt)) || (appr && GDIST(nx,ny) < GDIST(nix,niy))){ #endif STUPID nix = nx; niy = ny; chi = i; #ifdef STUPID } #endif STUPID } } if(nix != omx || niy != omy){ if(info[chi] & ALLOW_M){ mtmp = m_at(nix,niy); if(hitmm(shopkeeper,mtmp) == 1 && rn2(3) && hitmm(mtmp,shopkeeper) == 2) return(2); return(0); } else if(info[chi] & ALLOW_U){ (void) hitu(shopkeeper, d(mdat->damn, mdat->damd)+1); return(0); } shopkeeper->mx = nix; shopkeeper->my = niy; pmon(shopkeeper); return(1); } return(0); } #endif QUEST char * plur(n) unsigned n; { return((n==1) ? "" : "s"); } online(x,y) { return(x==u.ux || y==u.uy || (x-u.ux)*(x-u.ux) == (y-u.uy)*(y-u.uy)); } #file hack.stat.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ gethdate(name) char *name; { /* register char *np; */ /* if(stat(name, &hbuf)) */ /* error("Cannot get status of %s.", */ /* (np = index(name, '/')) ? np+1 : name); */ } uptodate(fd) { /* if(fstat(fd, &buf)) { */ /* pline("Cannot get status?"); */ /* return(0); */ /* } */ /* if(buf.st_ctime < hbuf.st_ctime) { */ /* pline("Saved level is out of date."); */ /* return(0); */ /* } */ return(1); } #file hack.steal.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" stealgold(mtmp) register struct monst *mtmp; { register struct gen *gold = g_at(u.ux, u.uy, fgold); register int tmp; if(gold && ( !u.ugold || gold->gflag > u.ugold || !rn2(5))) { mtmp->mgold += gold->gflag; freegold(gold); if(Invis) newsym(u.ux, u.uy); pline("%s quickly snatches some gold from between your feet!", Monnam(mtmp)); if(!u.ugold || !rn2(5)) { rloc(mtmp); mtmp->mflee = 1; } } else if(u.ugold) { u.ugold -= (tmp = somegold()); pline("Your purse feels lighter."); mtmp->mgold += tmp; rloc(mtmp); mtmp->mflee = 1; flags.botl = 1; } } somegold(){ return( (u.ugold < 100) ? u.ugold : (u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) ); } /* steal armor after he finishes taking it off */ unsigned stealoid; /* object to be stolen */ unsigned stealmid; /* monster doing the stealing */ stealarm(){ register struct monst *mtmp; register struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->o_id == stealoid) { for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->m_id == stealmid) { if(dist(mtmp->mx,mtmp->my) < 3) { freeinv(otmp); pline("%s steals %s!", Monnam(mtmp), doname(otmp)); mpickobj(mtmp,otmp); mtmp->mflee = 1; rloc(mtmp); } break; } break; } stealoid = 0; } /* returns 1 when something was stolen */ /* (or at least, when N should flee now) */ /* avoid stealing the object stealoid */ steal(mtmp) struct monst *mtmp; { register struct obj *otmp; register int tmp; register int named = 0; if(!invent){ if(Blind) pline("Somebody tries to rob you, but finds nothing to steal."); else pline("%s tries to rob you, but she finds nothing to steal!", Monnam(mtmp)); return(1); /* let her flee */ } tmp = 0; for(otmp = invent; otmp; otmp = otmp->nobj) tmp += ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1); tmp = rn2(tmp); for(otmp = invent; otmp; otmp = otmp->nobj) if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1)) < 0) break; if(!otmp) panic("Steal fails!"); if(otmp->o_id == stealoid) return(0); if((otmp->owornmask & (W_ARMOR | W_RING))){ switch(otmp->olet) { case RING_SYM: ringoff(otmp); break; case ARMOR_SYM: if(multi < 0 || otmp == uarms){ setworn((struct obj *) 0, otmp->owornmask & W_ARMOR); break; } { int curssv = otmp->cursed; otmp->cursed = 0; pline("%s seduces you and %s off your %s.", Amonnam(mtmp, Blind ? "gentle" : "beautiful"), otmp->cursed ? "helps you to take" : "you start taking", (otmp == uarmg) ? "gloves" : (otmp == uarmh) ? "helmet" : "armor"); named++; (void) armoroff(otmp); otmp->cursed = curssv; if(multi < 0){ extern char *nomovemsg; extern int (*afternmv)(); /* multi = 0; nomovemsg = 0; afternmv = 0; */ stealoid = otmp->o_id; stealmid = mtmp->m_id; afternmv = stealarm; return(0); } break; } default: impossible(); } } else if(otmp == uwep) setuwep((struct obj *) 0); if(otmp->olet == CHAIN_SYM) { pline("How come you are carrying that chain?"); impossible(); } if(Punished && otmp == uball){ Punished = 0; freeobj(uchain); free((char *) uchain); uchain = (struct obj *) 0; uball->spe = 0; uball = (struct obj *) 0; /* superfluous */ } freeinv(otmp); pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); mpickobj(mtmp,otmp); return((multi < 0) ? 0 : 1); } mpickobj(mtmp,otmp) register struct monst *mtmp; register struct obj *otmp; { otmp->nobj = mtmp->minvent; mtmp->minvent = otmp; } /* release the objects the killed animal has stolen */ relobj(mtmp,show) register struct monst *mtmp; register int show; { register struct obj *otmp, *otmp2; for(otmp = mtmp->minvent; otmp; otmp = otmp2){ otmp->ox = mtmp->mx; otmp->oy = mtmp->my; otmp2 = otmp->nobj; otmp->nobj = fobj; fobj = otmp; stackobj(fobj); if(show & cansee(mtmp->mx,mtmp->my)) atl(otmp->ox,otmp->oy,otmp->olet); } mtmp->minvent = (struct obj *) 0; if(mtmp->mgold || mtmp->data->mlet == 'L') { register int tmp; tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold; mkgold( tmp + d(dlevel,30), mtmp->mx, mtmp->my); if(show & cansee(mtmp->mx,mtmp->my)) atl(mtmp->mx,mtmp->my,'$'); } } #file hack.timeout.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #define SIZE(x) (sizeof(x) / sizeof(x[0])) timeout(){ register struct prop *upp; for(upp = u.uprops; upp < u.uprops+SIZE(u.uprops); upp++) if((upp->p_flgs & TIMEOUT) && !--upp->p_flgs) { if(upp->p_tofn) (*upp->p_tofn)(); else switch(upp - u.uprops){ case SICK: pline("You die because of food poisoning"); killer = u.usick_cause; done("died"); /* NOTREACHED */ case FAST: pline("You feel yourself slowing down"); break; case CONFUSION: pline("You feel less confused now"); break; case BLIND: pline("You can see again"); setsee(); break; case INVIS: on_scr(u.ux,u.uy); pline("You are no longer invisible."); } } } #file hack.topl.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #include <stdio.h> extern char *eos(); #define TOPLSZ (COLNO-8) /* leave room for --More-- */ char toplines[BUFSZ]; xchar tlx, tly; /* set by pline; used by addtopl */ struct topl { struct topl *next_topl; char *topl_text; } *old_toplines, *last_redone_topl; #define OTLMAX 20 /* max nr of old toplines remembered */ doredotopl(){ if(last_redone_topl) last_redone_topl = last_redone_topl->next_topl; if(!last_redone_topl) last_redone_topl = old_toplines; if(last_redone_topl){ (void) strcpy(toplines, last_redone_topl->topl_text); } redotoplin(); return(0); } redotoplin() { home(); if(index(toplines, '\n')) cl_end(); putstr(toplines); cl_end(); tlx = curx; tly = cury; flags.topl = 1; if(tly > 1) more(); } remember_topl() { register struct topl *tl; register int cnt = OTLMAX; if(last_redone_topl && !strcmp(toplines, last_redone_topl->topl_text)) return; if(old_toplines && !strcmp(toplines, old_toplines->topl_text)) return; last_redone_topl = 0; tl = (struct topl *) alloc((unsigned)(strlen(toplines) + sizeof(struct topl) + 1)); tl->next_topl = old_toplines; tl->topl_text = (char *)(tl + 1); (void) strcpy(tl->topl_text, toplines); old_toplines = tl; while(cnt && tl){ cnt--; tl = tl->next_topl; } if(tl && tl->next_topl){ free((char *) tl->next_topl); tl->next_topl = 0; } } addtopl(s) char *s; { curs(tlx,tly); if(tlx + strlen(s) > COLNO) putsym('\n'); putstr(s); tlx = curx; tly = cury; flags.topl = 1; } xmore(spaceflag) boolean spaceflag; /* TRUE if space required */ { if(flags.topl) { curs(tlx, tly); if(tlx + 8 > COLNO) putsym('\n'), tly++; } putstr("--More--"); xwaitforspace(spaceflag); if(flags.topl && tly > 1) { home(); cl_end(); docorner(1, tly-1); } flags.topl = 0; } more(){ xmore(TRUE); } cmore(){ xmore(FALSE); } clrlin(){ if(flags.topl) { home(); cl_end(); if(tly > 1) docorner(1, tly-1); remember_topl(); } flags.topl = 0; } /*VARARGS1*/ pline(line,arg1,arg2,arg3,arg4,arg5,arg6) /* register */ char *line,*arg1,*arg2,*arg3,*arg4,*arg5,*arg6; { char pbuf[BUFSZ]; register char *bp = pbuf, *tl; register int n,n0; if(!line || !*line) return; if(!index(line, '%')) (void) strcpy(pbuf,line); else (void) sprintf(pbuf,line,arg1,arg2,arg3,arg4,arg5,arg6); if(flags.topl == 1 && !strcmp(pbuf, toplines)) return; nscr(); /* %% */ /* If there is room on the line, print message on same line */ /* But messages like "You die..." deserve their own line */ n0 = strlen(bp); if(flags.topl == 1 && tly == 1 && n0 + strlen(toplines) + 3 < TOPLSZ && strncmp(bp, "You ", 4)) { (void) strcat(toplines, " "); (void) strcat(toplines, bp); tlx += 2; addtopl(bp); return; } if(flags.topl == 1) more(); remember_topl(); toplines[0] = 0; while(n0){ if(n0 >= COLNO){ /* look for appropriate cut point */ n0 = 0; for(n = 0; n < COLNO; n++) if(bp[n] == ' ') n0 = n; if(!n0) for(n = 0; n < COLNO-1; n++) if(!letter(bp[n])) n0 = n; if(!n0) n0 = COLNO-2; } (void) strncpy((tl = eos(toplines)), bp, n0); tl[n0] = 0; bp += n0; /* remove trailing spaces, but leave one */ while(n0 > 1 && tl[n0-1] == ' ' && tl[n0-2] == ' ') tl[--n0] = 0; n0 = strlen(bp); if(n0 && tl[0]) (void) strcat(tl, "\n"); } redotoplin(); } putsym(c) char c; { switch(c) { case '\b': backsp(); return; case '\n': curx = 1; cury++; if(cury > tly) tly = cury; break; default: curx++; if(curx == COLNO) putsym('\n'); } (void) myputchar(c); } putstr(s) register char *s; { while(*s) putsym(*s++); } #file hack.track.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #ifdef TRACK #define UTSZ 50 coord utrack[UTSZ]; int utcnt = 0; int utpnt = 0; initrack(){ utcnt = utpnt = 0; } /* add to track */ settrack(){ if(utcnt < UTSZ) utcnt++; if(utpnt == UTSZ) utpnt = 0; utrack[utpnt].x = u.ux; utrack[utpnt].y = u.uy; utpnt++; } coord * gettrack(x,y) register int x,y; { register int i,cnt; coord tc; cnt = utcnt; for(i = utpnt-1; cnt--; i--){ if(i == -1) i = UTSZ-1; tc = utrack[i]; if((x-tc.x)*(x-tc.x) + (y-tc.y)*(y-tc.y) < 3) return(&(utrack[i])); } return(0); } #endif TRACK #file hack.trap.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.trap.c version 1.0.1 - added dotele(); */ #include "hack.h" #include "def.trap.h" extern struct monst *makemon(); char vowels[] = "aeiou"; char *traps[] = { " bear trap", "n arrow trap", " dart trap", " trapdoor", " teleportation trap", " pit", " sleeping gas trap", " piercer", " mimic" }; dotrap(trap) register struct gen *trap; { nomul(0); if(trap->gflag&SEEN && !rn2(5)) pline("You escape a%s.",traps[trap->gflag & TRAPTYPE]); else { trap->gflag |= SEEN; switch(trap->gflag & TRAPTYPE) { case SLP_GAS_TRAP: pline("A cloud of gas puts you to sleep!"); nomul(-rnd(25)); break; case BEAR_TRAP: if(Levitation) { pline("You float over a bear trap."); break; } u.utrap = 4 + rn2(4); u.utraptype = TT_BEARTRAP; pline("A bear trap closes on your foot!"); break; case PIERC: deltrap(trap); if(makemon(PM_PIERC,u.ux,u.uy)) { pline("A piercer suddenly drops from the ceiling!"); if(uarmh) pline("Its blow glances off your helmet."); else (void) thitu(3,d(4,6),"falling piercer"); } break; case ARROW_TRAP: pline("An arrow shoots out at you!"); if(!thitu(8,rnd(6),"arrow")){ mksobj_at(WEAPON_SYM, ARROW, u.ux, u.uy); fobj->quan = 1; } break; case TRAPDOOR: if(!xdnstair) { pline("A trap door in the ceiling opens and a rock falls on your head!"); if(uarmh) pline("Fortunately, you are wearing a helmet!"); losehp(uarmh ? 2 : d(2,10),"falling rock"); } else { register int newlevel = dlevel + 1; while(!rn2(4) && newlevel < 29) newlevel++; pline("A trap door opens up under you!"); if(Levitation || u.ustuck) { pline("For some reason you don't fall in."); break; } goto_level(newlevel, FALSE); } break; case DART_TRAP: pline("A little dart shoots out at you!"); if(thitu(7,rnd(3),"little dart")) { if(!rn2(6)) poisoned("dart","poison dart"); } else { mksobj_at(WEAPON_SYM, DART, u.ux, u.uy); fobj->quan = 1; } break; case TELEP_TRAP: if(trap->gflag & ONCE) { deltrap(trap); newsym(u.ux,u.uy); vtele(); } else { newsym(u.ux,u.uy); tele(); } break; case PIT: if(Levitation) { pline("A pit opens up under you!"); pline("You don't fall in!"); break; } pline("You fall into a pit!"); u.utrap = rn1(6,2); u.utraptype = TT_PIT; losehp(rnd(6),"fall into a pit"); selftouch("Falling, you"); break; default: pline("You hit a trap of type %d",trap->gflag); impossible(); } } } mintrap(mtmp) register struct monst *mtmp; { register struct gen *gen = g_at(mtmp->mx, mtmp->my, ftrap); register int wasintrap = mtmp->mtrapped; if(!gen) { mtmp->mtrapped = 0; /* perhaps teleported? */ } else if(wasintrap) { if(!rn2(40)) mtmp->mtrapped = 0; } else { register int tt = (gen->gflag & TRAPTYPE); int in_sight = cansee(mtmp->mx,mtmp->my); extern char mlarge[]; if(mtmp->mtrapseen & (1 << tt)) { /* he has been in such a trap - perhaps he escapes */ if(rn2(4)) return(0); } mtmp->mtrapseen |= (1 << tt); switch (tt) { case BEAR_TRAP: if(strchr(mlarge, mtmp->data->mlet)) { if(in_sight) pline("%s is caught in a bear trap!", Monnam(mtmp)); else if(mtmp->data->mlet == 'o') pline("You hear the roaring of an angry bear!"); mtmp->mtrapped = 1; } break; case PIT: if(!strchr("Eyw", mtmp->data->mlet)) { mtmp->mtrapped = 1; if(in_sight) pline("%s falls in a pit!", Monnam(mtmp)); } break; case SLP_GAS_TRAP: if(!mtmp->msleep && !mtmp->mfroz) { mtmp->msleep = 1; if(in_sight) pline("%s suddenly falls asleep!", Monnam(mtmp)); } break; case TELEP_TRAP: rloc(mtmp); if(in_sight && !cansee(mtmp->mx,mtmp->my)) pline("%s suddenly disappears!", Monnam(mtmp)); break; case ARROW_TRAP: if(in_sight) { pline("%s is hit by an arrow!", Monnam(mtmp)); } mtmp->mhp -= 3; break; case DART_TRAP: if(in_sight) { pline("%s is hit by a dart!", Monnam(mtmp)); } mtmp->mhp -= 2; /* not mondied here !! */ break; case TRAPDOOR: if(!xdnstair) { mtmp->mhp -= 10; if(in_sight) pline("A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp)); break; } if(mtmp->data->mlet != 'w'){ fall_down(mtmp); if(in_sight) pline("Suddenly, %s disappears out of sight.", monnam(mtmp)); return(2); /* no longer on this level */ } break; case PIERC: break; default: pline("Some monster encountered an impossible trap."); impossible(); } } return(mtmp->mtrapped); } selftouch(arg) char *arg; { if(uwep && uwep->otyp == DEAD_COCKATRICE){ pline("%s touch the dead cockatrice.", arg); pline("You turn to stone."); killer = objects[uwep->otyp].oc_name; done("died"); } } float_up(){ if(u.utrap) { if(u.utraptype == TT_PIT) { u.utrap = 0; pline("You float up, out of the pit!"); } else { pline("You float up, only your leg is still stuck."); } } else pline("You start to float in the air!"); } float_down(){ register struct gen *trap; pline("You float gently to the ground."); if(trap = g_at(u.ux,u.uy,ftrap)) switch(trap->gflag & TRAPTYPE) { case PIERC: break; case TRAPDOOR: if(!xdnstair || u.ustuck) break; /* fall into next case */ default: dotrap(trap); } pickup(); } vtele() { #define VAULT 6 register struct mkroom *croom; for(croom = &rooms[0]; croom->hx >= 0; croom++) if(croom->rtype == VAULT) { register int x,y; x = rn2(2) ? croom->lx : croom->hx; y = rn2(2) ? croom->ly : croom->hy; if(teleok(x,y)) { teleds(x,y); return; } } tele(); } tele() { extern coord getpos(); coord cc; register int nux,nuy; if(Teleport_control) { pline("To what position do you want to be teleported?"); cc = getpos(1, "the desired position"); /* 1: force valid */ /* possible extensions: introduce a small error if magic power is low; allow transfer to solid rock */ if(teleok(cc.x, cc.y)){ teleds(cc.x, cc.y); return; } pline("Sorry ..."); } do { nux = rnd(COLNO-1); nuy = rn2(ROWNO); } while(!teleok(nux, nuy)); teleds(nux, nuy); } teleds(nux, nuy) register int nux,nuy; { if(Punished) unplacebc(); unsee(); u.utrap = 0; u.ustuck = 0; u.ux = nux; u.uy = nuy; setsee(); if(Punished) placebc(1); if(u.uswallow){ u.uswldtim = u.uswallow = 0; docrt(); } nomul(0); (void) inshop(); pickup(); if(!Blind) read_engr_at(u.ux,u.uy); } teleok(x,y) register int x,y; { return( isok(x,y) && levl[x][y].typ > DOOR && !m_at(x,y) && !sobj_at(ENORMOUS_ROCK,x,y) && !g_at(x,y,ftrap) ); /* Note: gold is permitted (because of vaults) */ } dotele() { extern char pl_character[]; if( #ifdef WIZARD !wizard && #endif WIZARD (!Teleportation || u.ulevel < 6 || (pl_character[0] != 'W' && u.ulevel < 10))) { pline("You are not able to teleport at will."); return(0); } if(u.uhunger <= 100 || u.ustr < 6) { pline("You miss the strength for a teleport spell."); return(1); } tele(); morehungry(100); return(1); } placebc(attach) int attach; { if(!uchain || !uball){ pline("Where are your chain and ball??"); impossible(); return; } uball->ox = uchain->ox = u.ux; uball->oy = uchain->oy = u.uy; if(attach){ uchain->nobj = fobj; fobj = uchain; if(!carried(uball)){ uball->nobj = fobj; fobj = uball; } } } unplacebc(){ if(!carried(uball)){ freeobj(uball); unpobj(uball); } freeobj(uchain); unpobj(uchain); } level_tele() { register int newlevel = 5 + rn2(20); /* 5 - 24 */ if(dlevel == newlevel) if(!xdnstair) newlevel--; else newlevel++; goto_level(newlevel, FALSE); } #file hack.tty.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #include <stdio.h> char inchar(); gettty(){ } /* reset terminal to original state */ settty(s) char *s; { clear_screen(); if(s) myprintf(s); (void) myfflush(stdout); flags.echo = OFF; flags.cbreak = OFF; } setctty(){ } setftty(){ } echo(n) register int n; { } /* always want to expand tabs, or to send a clear line char before printing something on topline */ xtabs() { } #ifdef LONG_CMD cbreak(n) register int n; { } #endif LONG_CMD getlin(bufp) register char *bufp; { register char *obufp = bufp; register int c; flags.topl = 2; /* nonempty, no --More-- required */ for(;;) { (void) myfflush(stdout); c = inchar(); if(c == '\b') { if(bufp != obufp) { bufp--; putstr("\b \b"); /* putsym converts \b */ } else bell(); } else if(c == '\n') { *bufp = 0; return; } else { *bufp = c; bufp[1] = 0; putstr(bufp); if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO) bufp++; } } } getret() { xgetret(TRUE); } cgetret() { xgetret(FALSE); } xgetret(spaceflag) boolean spaceflag; /* TRUE if space (return) required */ { myprintf("\nHit %s to continue: ", flags.cbreak ? "space" : "return"); xwaitforspace(spaceflag); } char morc; /* tell the outside world what char he used */ xwaitforspace(spaceflag) boolean spaceflag; { register int c; (void) myfflush(stdout); morc = 0; while((c = inchar()) != '\n') { if (flags.cbreak) { if (c == ' ') break; if (!spaceflag && letter(c)) { morc = c; break; } } } } char * parse() { static char inline[COLNO]; register int foo; flags.move = 1; if(!Invis) curs(u.ux,u.uy+2); else home(); (void) myfflush(stdout); while((foo = inchar()) >= '0' && foo <= '9') multi += 10*multi+foo-'0'; if(multi) { multi--; save_cm = inline; } inline[0] = foo; inline[1] = 0; if(foo == 'f' || foo == 'F'){ inline[1] = inchar(); #ifdef QUEST if(inline[1] == foo) inline[2] = inchar(); else #endif QUEST inline[2] = 0; } if(foo == 'm' || foo == 'M'){ inline[1] = inchar(); inline[2] = 0; } clrlin(); return(inline); } char readchar() { register int sym; (void) myfflush(stdout); sym = inchar(); if(flags.topl == 1) flags.topl = 2; return((char) sym); }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/06/86)
#file hack.u_init.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #include <stdio.h> #include <signal.h> #define Strcat (void) strcat #define UNDEF_TYP 0 #define UNDEF_SPE (-1) extern struct obj *addinv(); extern char plname[]; char pl_character[PL_CSIZ]; struct trobj { uchar trotyp; schar trspe; char trolet; Bitfield(trquan,6); Bitfield(trknown,1); }; #ifdef WIZARD struct trobj Extra_objs[] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }; #endif WIZARD struct trobj Cave_man[] = { { MACE, 1, WEAPON_SYM, 1, 1 }, { BOW, 1, WEAPON_SYM, 1, 1 }, { ARROW, 0, WEAPON_SYM, 25, 1 }, /* quan is variable */ { LEATHER_ARMOR, 2, ARMOR_SYM, 1, 1 }, { 0, 0, 0, 0, 0} }; struct trobj Fighter[] = { { TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1 }, { RING_MAIL, 3, ARMOR_SYM, 1, 1 }, { 0, 0, 0, 0, 0 } }; struct trobj Knight[] = { { LONG_SWORD, 0, WEAPON_SYM, 1, 1 }, { SPEAR, 2, WEAPON_SYM, 1, 1 }, { RING_MAIL, 4, ARMOR_SYM, 1, 1 }, { HELMET, 1, ARMOR_SYM, 1, 1 }, { SHIELD, 1, ARMOR_SYM, 1, 1 }, { PAIR_OF_GLOVES, 1, ARMOR_SYM, 1, 1 }, { 0, 0, 0, 0, 0 } }; struct trobj Speleologist[] = { { STUDDED_LEATHER_ARMOR, 3, ARMOR_SYM, 1, 1 }, { UNDEF_TYP, 0, POTION_SYM, 2, 0 }, { FOOD_RATION, 0, FOOD_SYM, 3, 1 }, { ICE_BOX, 0, TOOL_SYM, 1, 0 }, { 0, 0, 0, 0, 0} }; struct trobj Tourist[] = { { UNDEF_TYP, 0, FOOD_SYM, 10, 1 }, { POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0 }, { EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1 }, { DART, 2, WEAPON_SYM, 25, 1 }, /* quan is variable */ { 0, 0, 0, 0, 0 } }; struct trobj Wizard[] = { { ELVEN_CLOAK, 1, ARMOR_SYM, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 0 }, { UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 0 }, { UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 0 }, { UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 0 }, { 0, 0, 0, 0, 0 } }; #ifdef NEWS int u_in_infl; u_in_intrup() { u_in_infl++; (void) signal(SIGINT, u_in_intrup); } #endif NEWS u_init(){ register int c,pc,i; #ifdef NEWS /* It is not unlikely that we get an interrupt here intended to kill the news; unfortunately this would also kill (part of) the following question */ int (*prevsig)() = signal(SIGINT, u_in_intrup); #endif NEWS register char *cp; char buf[256]; if(pc = pl_character[0]) goto got_suffix; buf[0] = 0; Strcat(buf, "\nTell me what kind of character you are:\n"); Strcat(buf, "Are you a Tourist, a Speleologist, a Fighter,\n"); Strcat(buf, " a Knight, a Cave-man or a Wizard? [TSFKCW] "); intrup: for(cp = buf; *cp; cp++){ #ifdef NEWS if(u_in_infl){ u_in_infl = 0; goto intrup; } #endif NEWS (void) myputchar(*cp); } loop: (void) myfflush(stdout); pc = 0; while((c = inchar()) != '\n') { #ifndef AMIGA if(c == EOF) { #ifdef NEWS if(u_in_infl) goto intrup; /* %% */ #endif NEWS settty("\nEnd of input?\n"); hackexit(0); } else #endif !AMIGA if(pc && c==8) /* backspace over it? */ { myputchar(c); pc = 0; } else if (!pc) { pc = c; myputchar(c); } } if(!pc || !strchr("TSFKCWtsfkcw", pc)){ myprintf("\nAnswer with T,S,F,K,C or W. What are you? "); goto loop; } got_suffix: myputchar('\n'); myfflush(); if('a' <= pc && pc <= 'z') pc += 'A'-'a'; #ifdef NEWS (void) signal(SIGINT,prevsig); #endif NEWS u.usym = '@'; u.ulevel = 1; init_uhunger(); u.uhpmax = u.uhp = 12; u.ustrmax = u.ustr = !rn2(20) ? 14 + rn2(7) : 16; #ifdef QUEST u.uhorizon = 6; #endif QUEST switch(pc) { case 'C': setpl_char("Cave-man"); Cave_man[2].trquan = 12 + rnd(9)*rnd(9); u.uhp = u.uhpmax = 16; u.ustr = u.ustrmax = 18; ini_inv(Cave_man); break; case 'T': setpl_char("Tourist"); Tourist[3].trquan = 20 + rnd(20); u.ugold = u.ugold0 = rnd(1000); u.uhp = u.uhpmax = 10; u.ustr = u.ustrmax = 8; ini_inv(Tourist); break; case 'W': setpl_char("Wizard"); for(i=1; i<=4; i++) if(!rn2(5)) Wizard[i].trquan += rn2(3) - 1; u.uhp = u.uhpmax = 15; u.ustr = u.ustrmax = 16; ini_inv(Wizard); break; case 'S': setpl_char("Speleologist"); Fast = INTRINSIC; Stealth = INTRINSIC; u.uhp = u.uhpmax = 12; u.ustr = u.ustrmax = 10; ini_inv(Speleologist); break; case 'K': setpl_char("Knight"); u.uhp = u.uhpmax = 12; u.ustr = u.ustrmax = 10; ini_inv(Knight); break; case 'F': setpl_char("Fighter"); u.uhp = u.uhpmax = 14; u.ustr = u.ustrmax = 17; ini_inv(Fighter); } find_ac(); /* make sure he can carry all he has - especially for T's */ while(inv_weight() > 0 && u.ustr < 118) u.ustr++, u.ustrmax++; #ifdef WIZARD if(wizard) wiz_inv(); #endif WIZARD } ini_inv(trop) register struct trobj *trop; { register struct obj *obj; extern struct obj *mkobj(); while(trop->trolet) { obj = mkobj(trop->trolet); obj->known = trop->trknown; obj->cursed = 0; if(obj->olet == WEAPON_SYM){ obj->quan = trop->trquan; trop->trquan = 1; } if(trop->trspe != UNDEF_SPE) obj->spe = trop->trspe; if(trop->trotyp != UNDEF_TYP) obj->otyp = trop->trotyp; obj->owt = weight(obj); /* defined after setting otyp+quan */ obj = addinv(obj); if(obj->olet == ARMOR_SYM){ switch(obj->otyp){ case SHIELD: if(!uarms) setworn(obj, W_ARMS); break; case HELMET: if(!uarmh) setworn(obj, W_ARMH); break; case PAIR_OF_GLOVES: if(!uarmg) setworn(obj, W_ARMG); break; case ELVEN_CLOAK: if(!uarm2) setworn(obj, W_ARM); break; default: if(!uarm) setworn(obj, W_ARM); } } if(obj->olet == WEAPON_SYM) if(!uwep) setuwep(obj); if(--trop->trquan) continue; /* make a similar object */ trop++; } } #ifdef WIZARD wiz_inv(){ register struct trobj *trop = &Extra_objs[0]; extern char *getenv(); register char *ep = getenv("INVENT"); register int type; while(ep && *ep) { type = atoi(ep); ep = strchr(ep, ','); if(ep) while(*ep == ',' || *ep == ' ') ep++; if(type <= 0 || type > NROFOBJECTS) continue; trop->trotyp = type; trop->trolet = objects[type].oc_olet; trop->trspe = 4; trop->trknown = 1; trop->trquan = 1; ini_inv(trop); } /* give him a wand of wishing by default */ trop->trotyp = WAN_WISHING; trop->trolet = WAND_SYM; trop->trspe = 20; trop->trknown = 1; trop->trquan = 1; ini_inv(trop); } #endif WIZARD setpl_char(plc) char *plc; { (void) strncpy(pl_character, plc, PL_CSIZ-1); pl_character[PL_CSIZ-1] = 0; } plnamesuffix() { register char *p; if(p = strrchr(plname, '-')) { *p = 0; if(!plname[0]) { askname(); plnamesuffix(); } if(strchr("TSFKCWtsfkcw", p[1])) { pl_character[0] = p[1]; pl_character[1] = 0; } } } #file hack.vault.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #ifdef QUEST setgd(/* mtmp */) /* struct monst *mtmp; */ {} gd_move() { return(2); } gddead(mtmp) struct monst *mtmp; {} invault(){} #else extern struct monst *makemon(); #define VAULT 6 #define FCSIZ (ROWNO+COLNO) struct fakecorr { xchar fx,fy,ftyp; }; struct egd { int fcbeg, fcend; /* fcend: first unused pos */ xchar gdx, gdy; /* goal of guard's walk */ unsigned gddone:1; struct fakecorr fakecorr[FCSIZ]; }; struct permonst pm_guard = { "guard", '@', 12, 12, -1, 4, 10, sizeof(struct egd) }; struct monst *guard; int gdlevel; #define EGD ((struct egd *)(&(guard->mextra[0]))) restfakecorr(){ register int fcx,fcy,fcbeg; register struct rm *crm; while((fcbeg = EGD->fcbeg) < EGD->fcend) { fcx = EGD->fakecorr[fcbeg].fx; fcy = EGD->fakecorr[fcbeg].fy; if((u.ux == fcx && u.uy == fcy) || cansee(fcx,fcy) || m_at(fcx,fcy)) return; crm = &levl[fcx][fcy]; crm->typ = EGD->fakecorr[fcbeg].ftyp; if(!crm->typ) crm->seen = 0; newsym(fcx,fcy); EGD->fcbeg++; } /* it seems he left the corridor - let the guard disappear */ mondead(guard); guard = 0; } setgd(){ register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->isgd){ guard = mtmp; gdlevel = dlevel; return; } guard = 0; } invault(){ register int tmp = inroom(u.ux, u.uy); if(tmp < 0 || rooms[tmp].rtype != VAULT) { u.uinvault = 0; return; } if(++u.uinvault % 50 == 0 && (!guard || gdlevel != dlevel)) { char buf[BUFSZ]; register int x,y,dx,dy,gx,gy; /* first find the goal for the guard */ for(dy = 0; dy < ROWNO; dy++) for(y = u.uy-dy; y <= u.uy+dy; y++) { if(y > u.uy-dy) y = u.uy+dy; if(y < 0 || y > ROWNO-1) continue; for(x = u.ux; x < COLNO; x++) if(levl[x][y].typ == CORR) goto fnd; for(x = u.ux-1; x > 0; x--) if(levl[x][y].typ == CORR) goto fnd; } impossible(); tele(); return; fnd: gx = x; gy = y; /* next find a good place for a door in the wall */ x = u.ux; y = u.uy; while(levl[x][y].typ > DOOR) { dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; if(abs(gx-x) >= abs(gy-y)) x += dx; else y += dy; } /* make something interesting happen */ if(!(guard = makemon(&pm_guard,x,y))) return; guard->isgd = guard->mpeaceful = 1; EGD->gddone = 0; gdlevel = dlevel; if(!cansee(guard->mx, guard->my)) { mondead(guard); guard = 0; return; } EGD->gdx = gx; EGD->gdy = gy; EGD->fcbeg = 0; EGD->fakecorr[0].fx = x; EGD->fakecorr[0].fy = y; EGD->fakecorr[0].ftyp = levl[x][y].typ; levl[x][y].typ = DOOR; EGD->fcend = 1; pline("Suddenly one of the Vault's guards enters!"); pmon(guard); pline("\"Hello stranger, who are you?\" - "); getlin(buf); clrlin(); pline("\"I don't know you.\""); if(!u.ugold) pline("\"Please follow me.\""); else { pline("\"Most likely all that gold was stolen from this vault.\""); pline("\"Please drop your gold (say d$ ) and follow me.\""); } } } gd_move(){ register int x,y,dx,dy,gx,gy,nx,ny,tmp; register struct fakecorr *fcp; register struct rm *crm; if(!guard || gdlevel != dlevel){ pline("Where is the guard?"); impossible(); return(2); /* died */ } if(u.ugold || dist(guard->mx,guard->my) > 2 || EGD->gddone){ restfakecorr(); return(0); /* didnt move */ } x = guard->mx; y = guard->my; /* look around (hor & vert only) for accessible places */ for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) if(nx == x || ny == y) if(nx != x || ny != y) if(isok(nx,ny)) if((tmp = (crm = &levl[nx][ny])->typ) >= SDOOR) { register int i; for(i = EGD->fcbeg; i < EGD->fcend; i++) if(EGD->fakecorr[i].fx == nx && EGD->fakecorr[i].fy == ny) goto nextnxy; if((i = inroom(nx,ny)) >= 0 && rooms[i].rtype == VAULT) goto nextnxy; /* seems we found a good place to leave him alone */ EGD->gddone = 1; if(tmp >= DOOR) goto newpos; crm->typ = (tmp == SCORR) ? CORR : DOOR; goto proceed; nextnxy: ; } nx = x; ny = y; gx = EGD->gdx; gy = EGD->gdy; dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy; while((tmp = (crm = &levl[nx][ny])->typ) != 0) { /* in view of the above we must have tmp < SDOOR */ /* must be a wall here */ if(isok(nx+nx-x,ny+ny-y) && levl[nx+nx-x][ny+ny-y].typ > DOOR){ crm->typ = DOOR; goto proceed; } if(dy && nx != x) { nx = x; ny = y+dy; dx = 0; continue; } if(dx && ny != y) { ny = y; nx = x+dx; dy = 0; continue; } /* I don't like this, but ... */ crm->typ = DOOR; goto proceed; } crm->typ = CORR; proceed: fcp = &(EGD->fakecorr[EGD->fcend]); if(EGD->fcend++ == FCSIZ) panic("fakecorr overflow"); fcp->fx = nx; fcp->fy = ny; fcp->ftyp = tmp; newpos: if(EGD->gddone) nx = ny = 0; guard->mx = nx; guard->my = ny; pmon(guard); restfakecorr(); return(1); } gddead(){ guard = 0; } #endif QUEST #file hack.version.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ #include "date.h" doversion(){ pline("AMIGA %s 1.0.1 - last edit %s.", #ifdef QUEST "Quest" #else "Hack" #endif QUEST , datestring); return(0); } #file hack.whatis.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.whatis.c version 1.0.1 - whatis asks for one char only. */ #include <stdio.h> #include "hack.h" dowhatis() { FILE *fp; char bufr[BUFSZ]; register char *ep, q; extern char readchar(); if(!(fp = fopen("data","r"))) pline("Cannot open data file!"); else { pline("Specify what? "); q = readchar(); while(fgets(bufr,BUFSZ,fp)) if(*bufr == q) { ep = index(bufr, '\n'); if(ep) *ep = 0; else impossible(); pline(bufr); if(ep[-1] == ';') morewhat(fp); goto fnd; } pline("I've never heard of such things."); fnd: (void) fclose(fp); } } morewhat(fp) FILE *fp; { char bufr[BUFSZ]; register char *ep; pline("More info? "); if(readchar() != 'y') return; cls(); while(fgets(bufr,BUFSZ,fp) && *bufr == '\t'){ ep = index(bufr, '\n'); if(!ep) break; *ep = 0; myputs(bufr+1); } more(); docrt(); } #file hack.wield.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* hack.wield.c version 1.0.1 - evaporate%s */ #include "hack.h" setuwep(obj) register struct obj *obj; { setworn(obj, W_WEP); } dowield() { register struct obj *wep; register int res = 0; multi = 0; if(!(wep = getobj("#-)", "wield"))) /* nothing */; else if(uwep == wep) pline("You are already wielding that!"); else if(uwep && uwep->cursed) pline("The %s welded to your hand!", aobjnam(uwep, "are")); else if((int) wep == 1) { if(uwep == 0){ pline("You are already empty handed."); } else { setuwep((struct obj *) 0); res++; pline("You are empty handed."); } } else if(uarms && wep->otyp == TWO_HANDED_SWORD) pline("You cannot wield a two-handed sword and wear a shield."); else if(wep->owornmask & (W_ARMOR | W_RING)) pline("You cannot wield that!"); else { setuwep(wep); res++; if(uwep->cursed) pline("The %s itself to your hand!", aobjnam(uwep, "weld")); else prinv(uwep); } return(res); } corrode_weapon(){ if(!uwep || uwep->olet != WEAPON_SYM) return; /* %% */ if(uwep->rustfree) pline("Your %s not affected.", aobjnam(uwep, "are")); else { pline("Your %s!", aobjnam(uwep, "corrode")); uwep->spe--; } } chwepon(otmp,amount) register struct obj *otmp; register int amount; { register char *color = (amount < 0) ? "black" : "green"; register char *time; if(!uwep || uwep->olet != WEAPON_SYM) { strange_feeling(otmp); return(0); } if(uwep->otyp == WORM_TOOTH && amount > 0) { uwep->otyp = CRYSKNIFE; pline("Your weapon seems sharper now."); uwep->cursed = 0; return(1); } if(uwep->otyp == CRYSKNIFE && amount < 0) { uwep->otyp = WORM_TOOTH; pline("Your weapon looks duller now."); return(1); } /* there is a (soft) upper limit to uwep->spe */ if(amount > 0 && uwep->spe > 5 && rn2(3)) { pline("Your %s violently green for a while and then evaporate%s.", aobjnam(uwep, "glow"), (uwep->quan == 1) ? "s" : ""); useup(uwep); return(1); } if(!rn2(6)) amount *= 2; time = (amount*amount == 1) ? "moment" : "while"; pline("Your %s %s for a %s.", aobjnam(uwep, "glow"), color, time); uwep->spe += amount; if(amount > 0) uwep->cursed = 0; return(1); } #file hack.worm.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" #ifndef NOWORM #include "def.wseg.h" struct wseg *wsegs[32]; /* linked list, tail first */ struct wseg *wheads[32]; long wgrowtime[32]; getwn(mtmp) struct monst *mtmp; { register int tmp; for(tmp=1; tmp<32; tmp++) if(!wsegs[tmp]) { mtmp->wormno = tmp; return(1); } return(0); /* level infested with worms */ } /* called to initialize a worm unless cut in half */ initworm(mtmp) struct monst *mtmp; { register struct wseg *wtmp; register int tmp = mtmp->wormno; if(!tmp) return; wheads[tmp] = wsegs[tmp] = wtmp = newseg(); wgrowtime[tmp] = 0; wtmp->wx = mtmp->mx; wtmp->wy = mtmp->my; /* wtmp->wdispl = 0;*/ wtmp->nseg = 0; } worm_move(mtmp) struct monst *mtmp; { register struct wseg *wtmp, *whd; register int tmp = mtmp->wormno; wtmp = newseg(); wtmp->wx = mtmp->mx; wtmp->wy = mtmp->my; wtmp->nseg = 0; /* wtmp->wdispl = 0;*/ (whd = wheads[tmp])->nseg = wtmp; wheads[tmp] = wtmp; if(cansee(whd->wx,whd->wy)){ unpmon(mtmp); atl(whd->wx, whd->wy, '~'); whd->wdispl = 1; } else whd->wdispl = 0; if(wgrowtime[tmp] <= moves) { if(!wgrowtime[tmp]) wgrowtime[tmp] = moves + rnd(5); else wgrowtime[tmp] += 2+rnd(15); mtmp->orig_hp++; mtmp->mhp++; return; } whd = wsegs[tmp]; wsegs[tmp] = whd->nseg; remseg(whd); } worm_nomove(mtmp) register struct monst *mtmp; { register int tmp; register struct wseg *wtmp; tmp = mtmp->wormno; wtmp = wsegs[tmp]; if(wtmp == wheads[tmp]) return; if(wtmp == 0 || wtmp->nseg == 0) panic("worm_nomove?"); wsegs[tmp] = wtmp->nseg; remseg(wtmp); mtmp->mhp--; /* orig_hp not changed ! */ } wormdead(mtmp) register struct monst *mtmp; { register int tmp = mtmp->wormno; register struct wseg *wtmp, *wtmp2; if(!tmp) return; mtmp->wormno = 0; for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){ wtmp2 = wtmp->nseg; remseg(wtmp); } wsegs[tmp] = 0; } wormhit(mtmp) register struct monst *mtmp; { register int tmp = mtmp->wormno; register struct wseg *wtmp; if(!tmp) return; /* worm without tail */ for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg) (void) hitu(mtmp,1); } wormsee(tmp) register unsigned tmp; { register struct wseg *wtmp = wsegs[tmp]; if(!wtmp) panic("wormsee: wtmp==0"); for(; wtmp->nseg; wtmp = wtmp->nseg) if(!cansee(wtmp->wx,wtmp->wy) && wtmp->wdispl){ newsym(wtmp->wx, wtmp->wy); wtmp->wdispl = 0; } } pwseg(wtmp) register struct wseg *wtmp; { if(!wtmp->wdispl){ atl(wtmp->wx, wtmp->wy, '~'); wtmp->wdispl = 1; } } cutworm(mtmp,x,y,weptyp) register struct monst *mtmp; register xchar x,y; register uchar weptyp; /* uwep->otyp or 0 */ { register struct wseg *wtmp, *wtmp2; register struct monst *mtmp2; register int tmp,tmp2; if(mtmp->mx == x && mtmp->my == y) return; /* hit headon */ /* cutting goes best with axe or sword */ tmp = rnd(20); if(weptyp == LONG_SWORD || weptyp == TWO_HANDED_SWORD || weptyp == AXE) tmp += 5; if(tmp < 12) return; /* if tail then worm just loses a tail segment */ tmp = mtmp->wormno; wtmp = wsegs[tmp]; if(wtmp->wx == x && wtmp->wy == y){ wsegs[tmp] = wtmp->nseg; remseg(wtmp); return; } /* cut the worm in two halves */ mtmp2 = newmonst(0); *mtmp2 = *mtmp; mtmp2->mxlth = mtmp2->mnamelth = 0; /* sometimes the tail end dies */ if(rn2(3) || !getwn(mtmp2)){ monfree(mtmp2); tmp2 = 0; } else { tmp2 = mtmp2->wormno; wsegs[tmp2] = wsegs[tmp]; wgrowtime[tmp2] = 0; } do { if(wtmp->nseg->wx == x && wtmp->nseg->wy == y){ if(tmp2) wheads[tmp2] = wtmp; wsegs[tmp] = wtmp->nseg->nseg; remseg(wtmp->nseg); wtmp->nseg = 0; if(tmp2){ pline("You cut the worm in half."); mtmp2->orig_hp = mtmp2->mhp = d(mtmp2->data->mlevel, 8); mtmp2->mx = wtmp->wx; mtmp2->my = wtmp->wy; mtmp2->nmon = fmon; fmon = mtmp2; pmon(mtmp2); } else { pline("You cut off part of the worm's tail."); remseg(wtmp); } mtmp->mhp /= 2; return; } wtmp2 = wtmp->nseg; if(!tmp2) remseg(wtmp); wtmp = wtmp2; } while(wtmp->nseg); panic("Cannot find worm segment"); } remseg(wtmp) register struct wseg *wtmp; { if(wtmp->wdispl) newsym(wtmp->wx, wtmp->wy); free((char *) wtmp); } #endif NOWORM #file hack.worn.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" struct worn { long w_mask; struct obj **w_obj; } worn[] = { { W_ARM, &uarm }, { W_ARM2, &uarm2 }, { W_ARMH, &uarmh }, { W_ARMS, &uarms }, { W_ARMG, &uarmg }, { W_RINGL, &uleft }, { W_RINGR, &uright }, { W_WEP, &uwep }, { W_BALL, &uball }, { W_CHAIN, &uchain }, { 0, 0 } }; setworn(obj, mask) register struct obj *obj; long mask; { register struct worn *wp; register struct obj *oobj; for(wp = worn; wp->w_mask; wp++) if(wp->w_mask & mask) { oobj = *(wp->w_obj); if(oobj && !(oobj->owornmask & wp->w_mask)){ pline("Setworn: mask = %d.", wp->w_mask); impossible(); } if(oobj) oobj->owornmask &= ~wp->w_mask; if(obj && oobj && wp->w_mask == W_ARM){ if(uarm2) { pline("Setworn: uarm2 set?"); impossible(); } else setworn(uarm, W_ARM2); } *(wp->w_obj) = obj; if(obj) obj->owornmask |= wp->w_mask; } if(uarm2 && !uarm) { uarm = uarm2; uarm2 = 0; uarm->owornmask ^= (W_ARM | W_ARM2); } } /* called e.g. when obj is destroyed */ setnotworn(obj) register struct obj *obj; { register struct worn *wp; for(wp = worn; wp->w_mask; wp++) if(obj == *(wp->w_obj)) { *(wp->w_obj) = 0; obj->owornmask &= ~wp->w_mask; } if(uarm2 && !uarm) { uarm = uarm2; uarm2 = 0; uarm->owornmask ^= (W_ARM | W_ARM2); } }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/06/86)
#file hack.zap.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "hack.h" extern struct monst *makemon(); struct monst *bhit(); char *exclam(); char *fl[]= { "magic missile", "bolt of fire", "sleep ray", "bolt of cold", "death ray" }; dozap() { register struct obj *obj; register struct monst *mtmp; xchar zx,zy; register int num; obj = getobj("/", "zap"); if(!obj) return(0); if(obj->spe < 0 || (obj->spe == 0 && rn2(121))) { pline("Nothing Happens"); return(1); } if(obj->spe == 0) pline("You wrest one more spell from the worn-out wand."); if(!(objects[obj->otyp].bits & NODIR) && !getdir()) return(1); /* make him pay for knowing !NODIR */ obj->spe--; if(objects[obj->otyp].bits & IMMEDIATE) { if((u.uswallow && (mtmp = u.ustuck)) || (mtmp = bhit(u.dx,u.dy,rn1(8,6),0))) { wakeup(mtmp); switch(obj->otyp) { case WAN_STRIKING: if(rnd(20) < 10+mtmp->data->ac) { register int tmp = d(2,12); hit("wand", mtmp, exclam(tmp)); mtmp->mhp -= tmp; if(mtmp->mhp < 1) killed(mtmp); } else miss("wand", mtmp); break; case WAN_SLOW_MONSTER: mtmp->mspeed = MSLOW; break; case WAN_SPEED_MONSTER: mtmp->mspeed = MFAST; break; case WAN_UNDEAD_TURNING: if(index("WVZ&",mtmp->data->mlet)) { mtmp->mhp -= rnd(8); if(mtmp->mhp<1) killed(mtmp); else mtmp->mflee = 1; } break; case WAN_POLYMORPH: if( newcham(mtmp,&mons[rn2(CMNUM)]) ) objects[obj->otyp].oc_name_known = 1; break; case WAN_CANCELLATION: mtmp->mcan = 1; break; case WAN_TELEPORT_MONSTER: rloc(mtmp); break; case WAN_MAKE_INVISIBLE: mtmp->minvis = 1; break; #ifdef WAN_PROBING case WAN_PROBING: mstatusline(mtmp); break; #endif WAN_PROBING default: pline("What an interesting wand (%d)", obj->otyp); impossible(); } } } else { switch(obj->otyp){ case WAN_LIGHT: litroom(TRUE); break; case WAN_SECRET_DOOR_DETECTION: if(!findit()) return(1); break; case WAN_CREATE_MONSTER: { register int cnt = 1; if(!rn2(23)) cnt += rn2(7) + 1; while(cnt--) (void) makemon((struct permonst *) 0, u.ux, u.uy); } break; case WAN_WISHING: { char buf[BUFSZ]; register struct obj *otmp; extern struct obj *readobjnam(), *addinv(); if(u.uluck + rn2(5) < 0) { pline("Unfortunately, nothing happens."); break; } pline("You may wish for an object. What do you want? "); getlin(buf); otmp = readobjnam(buf); otmp = addinv(otmp); prinv(otmp); break; } case WAN_DIGGING: { register struct rm *room; register int digdepth; if(u.uswallow) { pline("You pierce %s's stomach wall!", monnam(u.ustuck)); u.uswallow = 0; mnexto(u.ustuck); u.ustuck->mhp = 1; /* almost dead */ u.ustuck = 0; setsee(); docrt(); break; } zx = u.ux+u.dx; zy = u.uy+u.dy; if(!isok(zx,zy)) break; digdepth = 4 + rn2(10); if(levl[zx][zy].typ == CORR) num = CORR; else num = ROOM; Tmp_at(-1, '*'); /* open call */ while(digdepth--) { if(zx == 0 || zx == COLNO-1 || zy == 0 || zy == ROWNO-1) break; room = &levl[zx][zy]; Tmp_at(zx,zy); if(!xdnstair){ if(zx < 3 || zx > COLNO-3 || zy < 3 || zy > ROWNO-3) break; if(room->typ == HWALL || room->typ == VWALL){ room->typ = ROOM; break; } } else if(num == ROOM || num == 10){ if(room->typ != ROOM && room->typ) { if(room->typ != CORR) room->typ = DOOR; if(num == 10) break; num = 10; } else if(!room->typ) room->typ = CORR; } else { if(room->typ != CORR && room->typ) { room->typ = DOOR; break; } else room->typ = CORR; } mnewsym(zx,zy); zx += u.dx; zy += u.dy; } mnewsym(zx,zy); /* not always necessary */ Tmp_at(-1,-1); /* closing call */ break; } default: buzz((int) obj->otyp - WAN_MAGIC_MISSILE, u.ux, u.uy, u.dx, u.dy); break; } if(!objects[obj->otyp].oc_name_known) { u.urexp += 10; objects[obj->otyp].oc_name_known = 1; } } return(1); } char * exclam(force) register int force; { /* force == 0 occurs e.g. with sleep ray */ /* note that large force is usual with wands so that !! would require information about hand/weapon/wand */ return( (force < 0) ? "?" : (force <= 4) ? "." : "!" ); } hit(str,mtmp,force) register char *str; register struct monst *mtmp; register char *force; /* usually either "." or "!" */ { if(!cansee(mtmp->mx,mtmp->my)) pline("The %s hits it.", str); else pline("The %s hits %s%s", str, monnam(mtmp), force); } miss(str,mtmp) register char *str; register struct monst *mtmp; { if(!cansee(mtmp->mx,mtmp->my)) pline("The %s misses it.",str); else pline("The %s misses %s.",str,monnam(mtmp)); } /* sets bhitpos to the final position of the weapon thrown */ /* coord bhitpos; */ /* check !u.uswallow before calling bhit() */ struct monst * bhit(ddx,ddy,range,sym) register int ddx,ddy,range; char sym; { register struct monst *mtmp; bhitpos.x = u.ux; bhitpos.y = u.uy; if(sym) tmp_at(-1, sym); /* open call */ while(range--) { bhitpos.x += ddx; bhitpos.y += ddy; if(mtmp = m_at(bhitpos.x,bhitpos.y)){ if(sym) tmp_at(-1, -1); /* close call */ return(mtmp); } if(levl[bhitpos.x][bhitpos.y].typ<CORR) { bhitpos.x -= ddx; bhitpos.y -= ddy; break; } if(sym) tmp_at(bhitpos.x, bhitpos.y); } if(sym) tmp_at(-1, 0); /* leave last symbol */ return(0); } struct monst * boomhit(dx,dy) { register int i, ct; register struct monst *mtmp; char sym = ')'; extern schar xdir[], ydir[]; bhitpos.x = u.ux; bhitpos.y = u.uy; for(i=0; i<8; i++) if(xdir[i] == dx && ydir[i] == dy) break; tmp_at(-1, sym); /* open call */ for(ct=0; ct<10; ct++) { if(i == 8) i = 0; sym = ')' + '(' - sym; tmp_at(-2, sym); /* change let call */ dx = xdir[i]; dy = ydir[i]; bhitpos.x += dx; bhitpos.y += dy; if(mtmp = m_at(bhitpos.x, bhitpos.y)){ tmp_at(-1,-1); return(mtmp); } if(levl[bhitpos.x][bhitpos.y].typ<CORR) { bhitpos.x -= dx; bhitpos.y -= dy; break; } if(bhitpos.x == u.ux && bhitpos.y == u.uy) { /* ct == 9 */ if(rn2(20) >= 10+u.ulevel){ /* we hit ourselves */ (void) thitu(10, rnd(10), "boomerang"); break; } else { /* we catch it */ tmp_at(-1,-1); pline("Skillfully, you catch the boomerang."); return((struct monst *) -1); } } tmp_at(bhitpos.x, bhitpos.y); if(ct % 5 != 0) i++; } tmp_at(-1, -1); /* do not leave last symbol */ return(0); } char dirlet(dx,dy) register int dx,dy; { return (dx == dy) ? '\\' : (dx && dy) ? '/' : dx ? '-' : '|'; } /* type < 0: monster spitting fire at you */ buzz(type,sx,sy,dx,dy) register int type; register xchar sx,sy; register int dx,dy; { register char *fltxt = (type < 0) ? "blaze of fire" : fl[type]; struct rm *lev; xchar range; struct monst *mon; if(u.uswallow) { register int tmp; if(type < 0) return; tmp = zhit(u.ustuck, type); pline("The %s rips into %s%s", fltxt, monnam(u.ustuck), exclam(tmp)); return; } if(type < 0) pru(); range = rn1(7,7); Tmp_at(-1, dirlet(dx,dy)); /* open call */ while(range-- > 0) { sx += dx; sy += dy; if((lev = &levl[sx][sy])->typ) Tmp_at(sx,sy); else { int bounce = 0; if(cansee(sx-dx,sy-dy)) pline("The %s bounces!",fltxt); if(levl[sx][sy-dy].typ > DOOR) bounce = 1; if(levl[sx-dx][sy].typ > DOOR) { if(!bounce || rn2(2)) bounce = 2; } switch(bounce){ case 0: dx = -dx; dy = -dy; continue; case 1: dy = -dy; sx -= dx; break; case 2: dx = -dx; sy -= dy; break; } Tmp_at(-2,dirlet(dx,dy)); continue; } if((mon = m_at(sx,sy)) && (type >= 0 || mon->data->mlet != 'D')) { wakeup(mon); if(rnd(20) < 18 + mon->data->ac) { register int tmp = zhit(mon,type); if(mon->mhp < 1) { if(type < 0) { if(cansee(mon->mx,mon->my)) pline("%s is killed by the %s!", Monnam(mon), fltxt); mondied(mon); } else killed(mon); } else hit(fltxt, mon, exclam(tmp)); range -= 2; } else miss(fltxt,mon); } else if(sx == u.ux && sy == u.uy) { if(rnd(20) < 18+u.uac) { register int dam = 0; range -= 2; pline("The %s hits you!",fltxt); switch(type) { case 0: dam = d(2,6); break; case -1: /* dragon fire */ case 1: if(Fire_resistance) pline("You don't feel hot!"); else dam = d(6,6); break; case 2: nomul(-rnd(25)); /* sleep ray */ break; case 3: if(Cold_resistance) pline("You don't feel cold!"); else dam = d(6,6); break; case 4: u.uhp = -1; } losehp(dam,fltxt); } else pline("The %s whizzes by you!",fltxt); } if(lev->typ <= DOOR) { int bounce = 0, rmn; if(cansee(sx,sy)) pline("The %s bounces!",fltxt); range--; if(!dx || !dy || !rn2(20)){ dx = -dx; dy = -dy; } else { if((rmn = levl[sx][sy-dy].typ) > DOOR && ( rmn >= ROOM || levl[sx+dx][sy-dy].typ > DOOR)){ bounce = 1; } if((rmn = levl[sx-dx][sy].typ) > DOOR && ( rmn >= ROOM || levl[sx-dx][sy+dy].typ > DOOR)){ if(!bounce || rn2(2)){ bounce = 2; } } switch(bounce){ case 0: dy = -dy; dx = -dx; break; case 1: dy = -dy; break; case 2: dx = -dx; break; } Tmp_at(-2, dirlet(dx,dy)); } } } Tmp_at(-1,-1); } zhit(mon,type) /* returns damage to mon */ register struct monst *mon; register int type; { register int tmp = 0; switch(type) { case 0: /* magic missile */ tmp = d(2,6); break; case -1: /* Dragon blazing fire */ case 1: /* fire */ if(index("Dg", mon->data->mlet)) break; tmp = d(6,6); if(mon->data->mlet == 'Y') tmp += 7; break; case 2: /* sleep*/ mon->mfroz = 1; break; case 3: /* cold */ if(index("YFgf", mon->data->mlet)) break; tmp = d(6,6); if(mon->data->mlet == 'D') tmp += 7; break; case 4: /* death*/ if(index("WVZ",mon->data->mlet)) break; tmp = mon->mhp+1; break; } mon->mhp -= tmp; return(tmp); } #file makedefs.c /* construct definitions of object constants */ #define DEF_FILE "def.objects.h" #define LINSZ 1000 #define STRSZ 40 int fd; char string[STRSZ]; main(){ register int index = 0; register int propct = 0; register char *sp; fd = open(DEF_FILE, 0); if(fd < 0) { perror(DEF_FILE); exit(1); } skipuntil("objects[] = {"); while(getentry()) { if(!*string){ index++; continue; } for(sp = string; *sp; sp++) if(*sp == ' ' || *sp == '\t') *sp = '_'; if(!strncmp(string, "RIN_", 4)){ capitalize(string+4); printf("#define %s u.uprops[%d].p_flgs\n", string+4, propct++); } for(sp = string; *sp; sp++) capitalize(sp); /* avoid trouble with stupid C preprocessors */ if(!strncmp(string, "WORTHLESS_PIECE_OF_", 19)) printf("/* #define %s %d */\n", string, index); else printf("#define %s %d\n", string, index); index++; } printf("\n#define CORPSE DEAD_HUMAN\n"); printf("#define LAST_GEM (JADE+1)\n"); printf("#define LAST_RING %d\n", propct); printf("#define NROFOBJECTS %d\n", index-1); } char line[LINSZ], *lp = line, *lp0 = line, *lpe = line; int eof; readline(){ register int n = read(fd, lp0, (line+LINSZ)-lp0); if(n < 0){ printf("Input error.\n"); exit(1); } if(n == 0) eof++; lpe = lp0+n; } char nextchar(){ if(lp == lpe){ readline(); lp = lp0; } return((lp == lpe) ? 0 : *lp++); } skipuntil(s) char *s; { register char *sp0, *sp1; loop: while(*s != nextchar()) if(eof) { printf("Cannot skipuntil %s\n", s); exit(1); } if(strlen(s) > lpe-lp+1){ register char *lp1, *lp2; lp2 = lp; lp1 = lp = lp0; while(lp2 != lpe) *lp1++ = *lp2++; lp2 = lp0; /* save value */ lp0 = lp1; readline(); lp0 = lp2; if(strlen(s) > lpe-lp+1) { printf("error in skipuntil"); exit(1); } } sp0 = s+1; sp1 = lp; while(*sp0 && *sp0 == *sp1) sp0++, sp1++; if(!*sp0){ lp = sp1; return(1); } goto loop; } getentry(){ int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0; int prefix = 0; char ch; #define NSZ 10 char identif[NSZ], *ip; string[0] = string[4] = 0; /* read until {...} or XXX(...) followed by , skip comment and #define lines deliver 0 on failure */ while(1) { ch = nextchar(); swi: if(letter(ch)){ ip = identif; do { if(ip < identif+NSZ-1) *ip++ = ch; ch = nextchar(); } while(letter(ch) || digit(ch)); *ip = 0; while(ch == ' ' || ch == '\t') ch = nextchar(); if(ch == '(' && !inparens && !stringseen) if(!strcmp(identif, "WAND") || !strcmp(identif, "RING") || !strcmp(identif, "POTION") || !strcmp(identif, "SCROLL")) (void) strncpy(string, identif, 3), string[3] = '_', prefix = 4; } switch(ch) { case '/': /* watch for comment */ if((ch = nextchar()) == '*') skipuntil("*/"); goto swi; case '{': inbraces++; continue; case '(': inparens++; continue; case '}': inbraces--; if(inbraces < 0) return(0); continue; case ')': inparens--; if(inparens < 0) { printf("too many ) ?"); exit(1); } continue; case '\n': /* watch for #define at begin of line */ if((ch = nextchar()) == '#'){ register char pch; /* skip until '\n' not preceded by '\\' */ do { pch = ch; ch = nextchar(); } while(ch != '\n' || pch == '\\'); continue; } goto swi; case ',': if(!inparens && !inbraces){ if(prefix && !string[prefix]) string[0] = 0; if(stringseen) return(1); printf("unexpected ,\n"); exit(1); } commaseen++; continue; case '\'': if((ch = nextchar()) == '\\') ch = nextchar(); if(nextchar() != '\''){ printf("strange character denotation?\n"); exit(1); } continue; case '"': { register char *sp = string + prefix; register char pch; register int store = (inbraces || inparens) && !stringseen++ && !commaseen; do { pch = ch; ch = nextchar(); if(store && sp < string+STRSZ) *sp++ = ch; } while(ch != '"' || pch == '\\'); if(store) *--sp = 0; continue; } } } } capitalize(sp) register char *sp; { if('a' <= *sp && *sp <= 'z') *sp += 'A'-'a'; } letter(ch) register char ch; { return( ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ); } digit(ch) register char ch; { return( '0' <= ch && ch <= '9' ); } #file mklev.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* mklev.c version 1.0.1 - new makecorridor() */ #ifndef MKLEV #define MKLEV #endif #include <stdio.h> #include "hack.h" #include "def.trap.h" extern struct monst *makemon(); static char tspe[2],**args; static int doorindex; static schar nxcor; char ismklev; struct mkroom *croom, *troom; boolean goldseen; int nroom; int smeq[MAXNROFROOMS+1]; char *tfile; #ifdef WIZARD extern boolean wizard; #endif #define somex() ((rand()%(croom->hx-croom->lx+1))+croom->lx) #define somey() ((rand()%(croom->hy-croom->ly+1))+croom->ly) extern char nul[40]; extern struct rm levl[COLNO][ROWNO]; extern struct monst *fmon; extern struct obj *fobj; extern struct gen *fgold, *ftrap; extern char *fut_geno; /* monsters that should not be created anymore */ extern struct mkroom rooms[MAXNROFROOMS+1]; extern coord doors[DOORMAX]; extern int comp(); extern xchar dlevel; extern xchar xdnstair,xupstair,ydnstair,yupstair; zeroout(addr, len) char *addr; int len; { while(--len>0) *addr++=0; } mklev() { register unsigned tryct; tfile = lock; troom = NULL; doorindex = 0; nroom = 0; if(getbones()) return; ismklev = 1; if(dlevel < rn1(3, 26)) tspe[0] = 'a'; /* normal level */ else tspe[0] = 'b'; /* maze */ tspe[1] = 0; /* zap the object bases */ {int i;extern int bases[]; for(i=0;i<15;bases[i++]=0);} /* zap the room pictures */ zeroout(levl,COLNO*ROWNO*sizeof(struct rm)); fmon = NULL; fobj = NULL; fgold = ftrap = NULL; zeroout( doors, sizeof(coord)*DOORMAX); xdnstair = xupstair = ydnstair = yupstair = 0; zeroout(rooms, (MAXNROFROOMS+1)*sizeof(struct mkroom)); init_objects(); rooms[0].hx = -1; /* in case we are in a maze */ /* a: normal; b: maze */ if(*tspe == 'b') { makemaz(); #ifdef DOSAVE { int fd; if((fd = creat(tfile,FMASK)) < 0) panic("Cannot create %s\n", tfile); savelev(fd); close(fd); } #endif ismklev = 0; return(0); } /* construct the rooms */ while(nroom < (MAXNROFROOMS/3)) { croom = rooms; nroom = 0; (void) makerooms(0); /* not secret */ } /* for each room: put things inside */ for(croom = rooms; croom->hx > 0; croom++) { /* put a sleeping monster inside */ if(!rn2(3)) (void) makemon((struct permonst *) 0, somex(), somey()); /* put traps and mimics inside */ goldseen = FALSE; while(!rn2(8-(dlevel/6))) mktrap(0,0); if(!goldseen && !rn2(3)) mkgold(0,somex(),somey()); if(!rn2(3)) { mkobj_at(0, somex(), somey()); tryct = 0; while(!rn2(5)) { if(++tryct > 100){ myprintf("tryct overflow4\n"); break; } mkobj_at(0, somex(), somey()); } } } tryct = 0; do { if(++tryct > 1000) panic("Cannot make dnstairs\n"); croom = &rooms[rn2(nroom)]; xdnstair = somex(); ydnstair = somey(); } while((*tspe =='n' && (!(xdnstair%2) || !(ydnstair%2))) || g_at(xdnstair,ydnstair,ftrap)); levl[xdnstair][ydnstair].scrsym ='>'; levl[xdnstair][ydnstair].typ = STAIRS; troom = croom; do { if(++tryct > 2000) panic("Cannot make upstairs\n"); croom = &rooms[rn2(nroom)]; xupstair = somex(); yupstair = somey(); } while(croom == troom || m_at(xupstair,yupstair) || g_at(xupstair,yupstair,ftrap)); levl[xupstair][yupstair].scrsym ='<'; levl[xupstair][yupstair].typ = STAIRS; #ifdef DEBUG dumpit(); #endif qsort((char *) rooms, nroom, sizeof(struct mkroom), comp); makecorridors(); make_niches(); /* make a secret treasure vault, not connected to the rest */ if(nroom < (2*MAXNROFROOMS/3)) if(!rn2(3)) { register int x,y; troom = croom = &rooms[nroom]; if(makerooms(1)) { /* make secret room */ troom->rtype = 6; /* treasure vault */ for(x = troom->lx; x <= troom->hx; x++) for(y = troom->ly; y <= troom->hy; y++) mkgold(rnd(dlevel*100) + 50, x, y); if(!rn2(3)) makevtele(); } } #ifdef WIZARD if(wizard){ if(rn2(3)) mkshop(); else mkzoo(); } else #endif WIZARD if(dlevel > 1 && dlevel < 20 && rn2(dlevel) < 2) mkshop(); else if(dlevel > 6 && !rn2(7) ) mkzoo(); #ifdef DOSAVE { int fd; if((fd = creat(tfile,FMASK)) < 0) panic("Cannot create %s\n", tfile); savelev(fd); close(fd); } #endif ismklev = 0; return(0); } makerooms(secret) int secret; { register int lowx, lowy; register int tryct = 0; while(nroom < (MAXNROFROOMS/2) || secret) for(lowy = rn1(3,3); lowy < ROWNO-7; lowy += rn1(2,4)) { for(lowx = rn1(3,4); lowx < COLNO-10; lowx += rn1(2,7)) { if (tryct++ > 10000) return(0); if ((lowy += (rn2(5)-2)) < 3) lowy = 3; else if(lowy > ROWNO-6) lowy = ROWNO-6; if(levl[lowx][lowy].typ) continue; if ((secret && maker(lowx, 1, lowy, 1)) || (!secret && maker(lowx,rn1(9,2),lowy,rn1(4,2)) && nroom+2 > MAXNROFROOMS)) return(1); } } return(1); } comp(x,y) register struct mkroom *x,*y; { if(x->lx < y->lx) return(-1); return(x->lx > y->lx); } coord finddpos(xl,yl,xh,yh) { coord ff; register int x,y; ff.x = (xl == xh) ? xl : (xl + rn2(xh-xl+1)); ff.y = (yl == yh) ? yl : (yl + rn2(yh-yl+1)); if(okdoor(ff.x, ff.y)) return(ff); if(xl < xh) for(x = xl; x <= xh; x++) if(okdoor(x, ff.y)){ ff.x = x; return(ff); } if(yl < yh) for(y = yl; y <= yh; y++) if(okdoor(ff.x, y)){ ff.y = y; return(ff); } return(ff); } /* if allowable, create a door at [x,y] */ okdoor(x,y) register int x,y; { if(levl[x-1][y].typ == DOOR || levl[x+1][y].typ == DOOR || levl[x][y+1].typ == DOOR || levl[x][y-1].typ == DOOR || levl[x-1][y].typ == SDOOR || levl[x+1][y].typ == SDOOR || levl[x][y-1].typ == SDOOR || levl[x][y+1].typ == SDOOR || (levl[x][y].typ != HWALL && levl[x][y].typ != VWALL) || doorindex >= DOORMAX) return(0); return(1); } dodoor(x,y,aroom) register int x,y; register struct mkroom *aroom; { if(doorindex >= DOORMAX) panic("DOORMAX exceeded?"); if(!okdoor(x,y) && nxcor) return; dosdoor(x,y,aroom,rn2(8) ? DOOR : SDOOR); } dosdoor(x,y,aroom,type) register int x,y; register struct mkroom *aroom; register int type; { register struct mkroom *broom; register int tmp; levl[x][y].typ = type; if(type == DOOR) levl[x][y].scrsym ='+'; aroom->doorct++; broom = aroom+1; if(broom->hx < 0) tmp = doorindex; else for(tmp = doorindex; tmp > broom->fdoor; tmp--) doors[tmp] = doors[tmp-1]; doorindex++; doors[tmp].x = x; doors[tmp].y = y; for( ; broom->hx >= 0; broom++) broom->fdoor++; } /* Only called from makerooms() */ maker(lowx,ddx,lowy,ddy) schar lowx,ddx,lowy,ddy; { register int x, y, hix = lowx+ddx, hiy = lowy+ddy; if(nroom >= MAXNROFROOMS) return(0); if(hix > COLNO-5) hix = COLNO-5; if(hiy > ROWNO-4) hiy = ROWNO-4; chk: if(hix <= lowx || hiy <= lowy) return(0); /* check area around room (and make room smaller if necessary) */ for(x = lowx-4; x <= hix+4; x++) for(y = lowy-3; y <= hiy+3; y++) if(levl[x][y].typ) { if(rn2(3)) return(0); lowx = x+5; lowy = y+4; goto chk; } /* on low levels the room is lit (usually) */ /* secret vaults are always lit */ if((rnd(dlevel) < 10 && rn2(77)) || (ddx == 1 && ddy == 1)) for(x = lowx-1; x <= hix+1; x++) for(y = lowy-1; y <= hiy+1; y++) levl[x][y].lit = 1; croom->lx = lowx; croom->hx = hix; croom->ly = lowy; croom->hy = hiy; croom->rtype = croom->doorct = croom->fdoor = 0; for(x = lowx-1; x <= hix+1; x++) for(y = lowy-1; y <= hiy+1; y += (hiy-lowy+2)) { levl[x][y].scrsym = '-'; levl[x][y].typ = HWALL; } for(x = lowx-1; x <= hix+1; x += (hix-lowx+2)) for(y = lowy; y <= hiy; y++) { levl[x][y].scrsym = '|'; levl[x][y].typ = VWALL; } for(x = lowx; x <= hix; x++) for(y = lowy; y <= hiy; y++) { levl[x][y].scrsym = '.'; levl[x][y].typ = ROOM; } croom++; croom->hx = -1; smeq[nroom] = nroom; nroom++; return(1); } makecorridors() { register int a,b; nxcor = 0; for(a = 0; a < nroom-1; a++) join(a, a+1); for(a = 0; a < nroom-2; a++) if(smeq[a] != smeq[a+2]) join(a, a+2); for(a = 0; a < nroom; a++) for(b = 0; b < nroom; b++) if(smeq[a] != smeq[b]) join(a, b); if(nroom > 2) for(nxcor = rn2(nroom) + 4; nxcor; nxcor--) { a = rn2(nroom); b = rn2(nroom-2); if(b >= a) b += 2; join(a, b); } } join(a,b) register int a,b; { coord cc,tt; register int tx, ty, xx, yy; register struct rm *crm; register int dx, dy, dix, diy, cct; croom = &rooms[a]; troom = &rooms[b]; /* find positions cc and tt for doors in croom and troom and direction for a corridor between them */ if(troom->hx < 0 || croom->hx < 0 || doorindex >= DOORMAX) return; if(troom->lx > croom->hx) { dx = 1; dy = 0; xx = croom->hx+1; tx = troom->lx-1; cc = finddpos(xx,croom->ly,xx,croom->hy); tt = finddpos(tx,troom->ly,tx,troom->hy); } else if(troom->hy < croom->ly) { dy = -1; dx = 0; yy = croom->ly-1; cc = finddpos(croom->lx,yy,croom->hx,yy); ty = troom->hy+1; tt = finddpos(troom->lx,ty,troom->hx,ty); } else if(troom->hx < croom->lx) { dx = -1; dy = 0; xx = croom->lx-1; tx = troom->hx+1; cc = finddpos(xx,croom->ly,xx,croom->hy); tt = finddpos(tx,troom->ly,tx,troom->hy); } else { dy = 1; dx = 0; yy = croom->hy+1; ty = troom->ly-1; cc = finddpos(croom->lx,yy,croom->hx,yy); tt = finddpos(troom->lx,ty,troom->hx,ty); } xx = cc.x; yy = cc.y; tx = tt.x - dx; ty = tt.y - dy; if(nxcor && levl[xx+dx][yy+dy].typ) return; dodoor(xx,yy,croom); cct = 0; while(xx != tx || yy != ty) { xx += dx; yy += dy; /* loop: dig corridor at [xx,yy] and find new [xx,yy] */ if(cct++ > 500 || (nxcor && !rn2(35))) return; if(xx == COLNO-1 || xx == 0 || yy == 0 || yy == ROWNO-1) return; /* impossible */ crm = &levl[xx][yy]; if(!(crm->typ)) { if(rn2(100)) { crm->typ = CORR; crm->scrsym = CORR_SYM; } else { crm->typ = SCORR; crm->scrsym = ' '; } if(nxcor && !rn2(50)) { mkobj_at(ROCK_SYM, xx, yy); } } else if(crm->typ != CORR && crm->typ != SCORR) { /* strange ... */ return; } /* find next corridor position */ dix = abs(xx-tx); diy = abs(yy-ty); /* do we have to change direction ? */ if(dy && dix > diy) { register int ddx = (xx > tx) ? -1 : 1; crm = &levl[xx+ddx][yy]; if(!crm->typ || crm->typ == CORR || crm->typ == SCORR) { dx = ddx; dy = 0; continue; } } else if(dx && diy > dix) { register int ddy = (yy > ty) ? -1 : 1; crm = &levl[xx][yy+ddy]; if(!crm->typ || crm->typ == CORR || crm->typ == SCORR) { dy = ddy; dx = 0; continue; } } /* continue straight on? */ crm = &levl[xx+dx][yy+dy]; if(!crm->typ || crm->typ == CORR || crm->typ == SCORR) continue; /* no, what must we do now?? */ if(dx) { dx = 0; dy = (ty < yy) ? -1 : 1; crm = &levl[xx+dx][yy+dy]; if(!crm->typ || crm->typ == CORR || crm->typ == SCORR) continue; dy = -dy; continue; } else { dy = 0; dx = (tx < xx) ? -1 : 1; crm = &levl[xx+dx][yy+dy]; if(!crm->typ || crm->typ == CORR || crm->typ == SCORR) continue; dx = -dx; continue; } } /* we succeeded in digging the corridor */ dodoor(tt.x, tt.y, troom); if(smeq[a] < smeq[b]) smeq[b] = smeq[a]; else smeq[a] = smeq[b]; } make_niches() { register int ct = rn2(nroom/2 + 1)+1; while(ct--) makeniche(FALSE); } makevtele() { makeniche(TRUE); } makeniche(with_trap) boolean with_trap; { register struct mkroom *aroom; register struct rm *rm; register int vct = 8; coord dd; register int dy,xx,yy; register struct gen *gtmp; if(doorindex < DOORMAX) while(vct--) { aroom = &rooms[rn2(nroom-1)]; if(aroom->rtype != 0) continue; /* not an ordinary room */ if(rn2(2)) { dy = 1; dd = finddpos(aroom->lx,aroom->hy+1,aroom->hx,aroom->hy+1); } else { dy = -1; dd = finddpos(aroom->lx,aroom->ly-1,aroom->hx,aroom->ly-1); } xx = dd.x; yy = dd.y; if((rm = &levl[xx][yy+dy])->typ) continue; if(with_trap || !rn2(4)) { rm->typ = SCORR; rm->scrsym = ' '; if(with_trap) { gtmp = newgen(); gtmp->gx = xx; gtmp->gy = yy+dy; gtmp->gflag = TELEP_TRAP | ONCE; gtmp->ngen = ftrap; ftrap = gtmp; make_engr_at(xx,yy-dy,"ad ae?ar um"); } dosdoor(xx,yy,aroom,SDOOR); } else { rm->typ = CORR; rm->scrsym = CORR_SYM; if(rn2(7)) dosdoor(xx,yy,aroom,rn2(5) ? SDOOR : DOOR); else { mksobj_at(SCROLL_SYM,SCR_TELEPORTATION,xx,yy+dy); if(!rn2(3)) mkobj_at(0,xx,yy+dy); } } return; } } /* make a trap somewhere (in croom if mazeflag = 0) */ mktrap(num,mazeflag) register int num,mazeflag; { register struct gen *gtmp; register int kind,nopierc,nomimic,fakedoor,fakegold,tryct = 0; register xchar mx,my; if(!num || num >= TRAPNUM) { nopierc = (dlevel < 4) ? 1 : 0; nomimic = (dlevel < 9 || goldseen ) ? 1 : 0; if(index(fut_geno, 'M')) nomimic = 1; kind = rn2(TRAPNUM - nopierc - nomimic); /* note: PIERC = 7, MIMIC = 8, TRAPNUM = 9 */ } else kind = num; if(kind == MIMIC) { register struct monst *mtmp; fakedoor = (!rn2(3) && !mazeflag); fakegold = (!fakedoor && !rn2(2)); if(fakegold) goldseen = TRUE; do { if(++tryct > 200) return; if(fakedoor) { /* note: fakedoor maybe on actual door */ if(rn2(2)){ if(rn2(2)) mx = croom->hx+1; else mx = croom->lx-1; my = somey(); } else { if(rn2(2)) my = croom->hy+1; else my = croom->ly-1; mx = somex(); } } else if(mazeflag) { extern coord mazexy(); coord mm; mm = mazexy(); mx = mm.x; my = mm.y; } else { mx = somex(); my = somey(); } } while(m_at(mx,my)); if(mtmp = makemon(PM_MIMIC,mx,my)) mtmp->mimic = fakegold ? '$' : fakedoor ? '+' : (mazeflag && rn2(2)) ? AMULET_SYM : "=/)%?![<>" [ rn2(9) ]; return; } gtmp = newgen(); gtmp->gflag = kind; do { if(++tryct > 200){ free((char *) gtmp); return; } if(mazeflag){ extern coord mazexy(); coord mm; mm = mazexy(); gtmp->gx = mm.x; gtmp->gy = mm.y; } else { gtmp->gx = somex(); gtmp->gy = somey(); } } while(g_at(gtmp->gx, gtmp->gy, ftrap)); gtmp->ngen = ftrap; ftrap = gtmp; if(mazeflag && !rn2(10) && gtmp->gflag < PIERC) gtmp->gflag |= SEEN; } #ifdef DEBUG dumpit() { int x, y; struct rm *room; cgetret(); /* kludge in making everything visible */ for(y=0; y < ROWNO; y++) for(x=0; x < COLNO-3; x++) if ( (room = &levl[x][y])->typ) at(x,y, (room->scrsym) ? room->scrsym : '?'); } #endif #file mklv.makemaz.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "mklev.h" extern struct monst *makemon(); extern coord mazexy(); makemaz() { int x,y; register int zx,zy; coord mm; for(x = 2; x < COLNO-1; x++) for(y = 2; y < ROWNO-1; y++) levl[x][y].typ = (x%2 && y%2) ? 0 : HWALL; mm = mazexy(); zx = mm.x; zy = mm.y; walkfrom(zx,zy); mkobj_at(AMULET_SYM, zx, zy); mkobj_at(ROCK_SYM, zx, zy); /* put a rock on top of the amulet */ /* (probably this means that one needs a wand of digging to reach the amulet - we must make sure that the player has a chance of getting one; let us say when he kills the minotaur; of course the minotaur itself may be blocked behind rocks, but well...) */ for(x = 2; x < COLNO-1; x++) for(y = 2; y < ROWNO-1; y++) { switch(levl[x][y].typ) { case HWALL: levl[x][y].scrsym = '-'; break; case ROOM: levl[x][y].scrsym = '.'; break; } } for(x = rn1(8,11); x; x--) { mm = mazexy(); mkobj_at(0, mm.x, mm.y); } for(x = rn1(10,2); x; x--) { mm = mazexy(); mkobj_at(ROCK_SYM, mm.x, mm.y); } mm = mazexy(); (void) makemon(PM_MINOTAUR, mm.x, mm.y); for(x = rn1(5,7); x; x--) { mm = mazexy(); (void) makemon((struct permonst *) 0, mm.x, mm.y); } for(x = rn1(6,7); x; x--) { mm = mazexy(); mkgold(0,mm.x,mm.y); } for(x = rn1(6,7); x; x--) mktrap(0,1); mm = mazexy(); levl[(xupstair = mm.x)][(yupstair = mm.y)].scrsym = '<'; levl[xupstair][yupstair].typ = STAIRS; xdnstair = ydnstair = 0; } walkfrom(x,y) int x,y; { register int q,a,dir; int dirs[4]; levl[x][y].typ = ROOM; while(1) { q = 0; for(a = 0; a < 4; a++) if(okay(x,y,a)) dirs[q++]= a; if(!q) return; dir = dirs[rn2(q)]; move(&x,&y,dir); levl[x][y].typ = ROOM; move(&x,&y,dir); walkfrom(x,y); } } move(x,y,dir) register int *x, *y; register int dir; { switch(dir){ case 0: --(*y); break; case 1: (*x)++; break; case 2: (*y)++; break; case 3: --(*x); break; } } okay(x,y,dir) int x,y; register int dir; { move(&x,&y,dir); move(&x,&y,dir); if(x<3 || y<3 || x>COLNO-3 || y>ROWNO-3 || levl[x][y].typ != 0) return(0); else return(1); } coord mazexy(){ coord mm; mm.x = 3 + 2*rn2(COLNO/2 - 2); mm.y = 3 + 2*rn2(ROWNO/2 - 2); return mm; } #file mklv.shk.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #ifndef QUEST #include "mklev.h" #include "def.eshk.h" #define ESHK ((struct eshk *)(&(shk->mextra[0]))) extern struct monst *makemon(); extern char shtypes[]; /* = "=/)%?!["; ** 8 shoptypes: 7 specialised, 1 mixed */ schar shprobs[] = { 3,3,5,5,10,10,14,50 }; /* their probabilities */ mkshop(){ register struct mkroom *sroom; register int sh,sx,sy,i; register char let; int roomno; register struct monst *shk; for(sroom = &rooms[0], roomno = 0; ; sroom++, roomno++){ if(sroom->hx < 0) return; if(sroom->lx <= xdnstair && xdnstair <= sroom->hx && sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue; if(sroom->lx <= xupstair && xupstair <= sroom->hx && sroom->ly <= yupstair && yupstair <= sroom->hy) continue; if( #ifdef WIZARD wizard || #endif WIZARD sroom->doorct == 1) break; } #ifdef WIZARD if(wizard){ extern char *getenv(); register char *ep = getenv("SHOPTYPE"); if(ep){ if(*ep == 'z' || *ep == 'Z'){ mkzoo(); return; } for(i=0; shtypes[i]; i++) if(*ep == shtypes[i]) break; let = i; goto gotlet; } } #endif WIZARD for(i = rn2(100),let = 0; (i -= shprobs[let])>= 0; let++) if(!shtypes[let]) break; /* superfluous */ #ifdef WIZARD gotlet: #endif WIZARD sroom->rtype = 8+let; let = shtypes[let]; sh = sroom->fdoor; sx = doors[sh].x; sy = doors[sh].y; if(sx == sroom->lx-1) sx++; else if(sx == sroom->hx+1) sx--; else if(sy == sroom->ly-1) sy++; else if(sy == sroom->hy+1) sy--; else { myprintf("Where is shopdoor?"); return; } if(!(shk = makemon(PM_SHK,sx,sy))) return; shk->isshk = shk->mpeaceful = 1; shk->msleep = 0; shk->mtrapseen = ~0; /* we know all the traps already */ ESHK->shoproom = roomno; ESHK->shd = doors[sh]; ESHK->shk.x = sx; ESHK->shk.y = sy; ESHK->robbed = 0; ESHK->visitct = 0; shk->mgold = 1000 + 30*rnd(100); /* initial capital */ ESHK->billct = 0; findname(ESHK->shknam, let); for(sx = sroom->lx; sx <= sroom->hx; sx++) for(sy = sroom->ly; sy <= sroom->hy; sy++){ register struct monst *mtmp; if((sx == sroom->lx && doors[sh].x == sx-1) || (sx == sroom->hx && doors[sh].x == sx+1) || (sy == sroom->ly && doors[sh].y == sy-1) || (sy == sroom->hy && doors[sh].y == sy+1)) continue; if(rn2(100) < dlevel && !m_at(sx,sy) && (mtmp = makemon(PM_MIMIC, sx, sy))){ mtmp->mimic = (let && rn2(10) < dlevel) ? let : ']'; continue; } mkobj_at(let, sx, sy); } #ifdef WIZARD if(wizard) myprintf("I made a %c-shop.", let ? let : 'g'); #endif WIZARD } mkzoo(){ register struct mkroom *sroom; register int sh,sx,sy,i; int goldlim = 500 * dlevel; for(sroom = &rooms[0]; ; sroom++){ if(sroom->hx < 0) return; if(sroom->lx <= xdnstair && xdnstair <= sroom->hx && sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue; if(sroom->lx <= xupstair && xupstair <= sroom->hx && sroom->ly <= yupstair && yupstair <= sroom->hy) continue; if(sroom->doorct == 1) break; } sroom->rtype = 7; sh = sroom->fdoor; for(sx = sroom->lx; sx <= sroom->hx; sx++) for(sy = sroom->ly; sy <= sroom->hy; sy++){ if((sx == sroom->lx && doors[sh].x == sx-1) || (sx == sroom->hx && doors[sh].x == sx+1) || (sy == sroom->ly && doors[sh].y == sy-1) || (sy == sroom->hy && doors[sh].y == sy+1)) continue; (void) makemon((struct permonst *) 0,sx,sy); i = sq(dist2(sx,sy,doors[sh].x,doors[sh].y)); if(i >= goldlim) i = 5*dlevel; goldlim -= i; mkgold(10 + rn2(i), sx, sy); } #ifdef WIZARD if(wizard) myprintf("I made a zoo."); #endif WIZARD } dist2(x0,y0,x1,y1){ return((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1)); } sq(a) int a; { return(a*a); } #endif QUEST #file mklv.shknam.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include "mklev.h" char *shkliquors[] = { /* Ukraine */ "Njezjin", "Tsjernigof", "Gomel", "Ossipewsk", "Gorlowka", /* N. Russia */ "Konosja", "Weliki Oestjoeg", "Syktywkar", "Sablja", "Narodnaja", "Kyzyl", /* Silezie */ "Walbrzych", "Swidnica", "Klodzko", "Raciborz", "Gliwice", "Brzeg", "Krnov", "Hradec Kralove", /* Schweiz */ "Leuk", "Brig", "Brienz", "Thun", "Sarnen", "Burglen", "Elm", "Flims", "Vals", "Schuls", "Zum Loch", 0 }; char *shkbooks[] = { /* Eire */ "Skibbereen", "Kanturk", "Rath Luirc", "Ennistymon", "Lahinch", "Loughrea", "Croagh", "Maumakeogh", "Ballyjamesduff", "Kinnegad", "Lugnaquillia", "Enniscorthy", "Gweebarra", "Kittamagh", "Nenagh", "Sneem", "Ballingeary", "Kilgarvan", "Cahersiveen", "Glenbeigh", "Kilmihil", "Kiltamagh", "Droichead Atha", "Inniscrone", "Clonegal", "Lisnaskea", "Culdaff", "Dunfanaghy", "Inishbofin", "Kesh", 0 }; char *shkarmors[] = { /* Turquie */ "Demirci", "Kalecik", "Boyabai", "Yildizeli", "Gaziantep", "Siirt", "Akhalataki", "Tirebolu", "Aksaray", "Ermenak", "Iskenderun", "Kadirli", "Siverek", "Pervari", "Malasgirt", "Bayburt", "Ayancik", "Zonguldak", "Balya", "Tefenni", "Artvin", "Kars", "Makharadze", "Malazgirt", "Midyat", "Birecik", "Kirikkale", "Alaca", "Polatli", "Nallihan", 0 }; char *shkwands[] = { /* Wales */ "Yr Wyddgrug", "Trallwng", "Mallwyd", "Pontarfynach", "Rhaeader", "Llandrindod", "Llanfair-ym-muallt", "Y-Fenni", "Measteg", "Rhydaman", "Beddgelert", "Curig", "Llanrwst", "Llanerchymedd", "Caergybi", /* Scotland */ "Nairn", "Turriff", "Inverurie", "Braemar", "Lochnagar", "Kerloch", "Beinn a Ghlo", "Drumnadrochit", "Morven", "Uist", "Storr", "Sgurr na Ciche", "Cannich", "Gairloch", "Kyleakin", "Dunvegan", 0 }; char *shkrings[] = { /* Hollandse familienamen */ "Feyfer", "Flugi", "Gheel", "Havic", "Haynin", "Hoboken", "Imbyze", "Juyn", "Kinsky", "Massis", "Matray", "Moy", "Olycan", "Sadelin", "Svaving", "Tapper", "Terwen", "Wirix", "Ypey", /* Skandinaviske navne */ "Rastegaisa", "Varjag Njarga", "Kautekeino", "Abisko", "Enontekis", "Rovaniemi", "Avasaksa", "Haparanda", "Lulea", "Gellivare", "Oeloe", "Kajaani", "Fauske", 0 }; char *shkfoods[] = { /* Indonesia */ "Djasinga", "Tjibarusa", "Tjiwidej", "Pengalengan", "Bandjar", "Parbalingga", "Bojolali", "Sarangan", "Ngebel", "Djombang", "Ardjawinangun", "Berbek", "Papar", "Baliga", "Tjisolok", "Siboga", "Banjoewangi", "Trenggalek", "Karangkobar", "Njalindoeng", "Pasawahan", "Pameunpeuk", "Patjitan", "Kediri", "Pemboeang", "Tringanoe", "Makin", "Tipor", "Semai", "Berhala", "Tegal", "Samoe", 0 }; char *shkweapons[] = { /* Perigord */ "Voulgezac", "Rouffiac", "Lerignac", "Touverac", "Guizengeard", "Melac", "Neuvicq", "Vanzac", "Picq", "Urignac", "Corignac", "Fleac", "Lonzac", "Vergt", "Queyssac", "Liorac", "Echourgnac", "Cazelon", "Eypau", "Carignan", "Monbazillac", "Jonzac", "Pons", "Jumilhac", "Fenouilledes", "Laguiolet", "Saujon", "Eymoutiers", "Eygurande", "Eauze", "Labouheyre", 0 }; char *shkgeneral[] = { /* Suriname */ "Hebiwerie", "Possogroenoe", "Asidonhopo", "Manlobbi", "Adjama", "Pakka Pakka", "Kabalebo", "Wonotobo", "Akalapi", "Sipaliwini", /* Greenland */ "Annootok", "Upernavik", "Angmagssalik", /* N. Canada */ "Aklavik", "Inuvik", "Tuktoyaktuk", "Chicoutimi", "Ouiatchouane", "Chibougamau", "Matagami", "Kipawa", "Kinojevis", "Abitibi", "Maganasipi", /* Iceland */ "Akureyri", "Kopasker", "Budereyri", "Akranes", "Bordeyri", "Holmavik", 0 }; struct shk_nx { char x; char **xn; } shk_nx[] = { { POTION_SYM, shkliquors }, { SCROLL_SYM, shkbooks }, { ARMOR_SYM, shkarmors }, { WAND_SYM, shkwands }, { RING_SYM, shkrings }, { FOOD_SYM, shkfoods }, { WEAPON_SYM, shkweapons }, { 0, shkgeneral } }; findname(nampt, let) char *nampt; char let; { register struct shk_nx *p = shk_nx; register char **q; register int i; while(p->x && p->x != let) p++; q = p->xn; for(i=0; i<dlevel; i++) if(!q[i]){ /* Not enough names, try general name */ if(let) findname(nampt, 0); else (void) strcpy(nampt, "Dirk"); return; } (void) strncpy(nampt, q[i], PL_NSIZ); nampt[PL_NSIZ-1] = 0; } #file rnd.c #define RND(x) ((rand()>>3) % x) rn1(x,y) register int x,y; { return(RND(x)+y); } rn2(x) register int x; { return(RND(x)); } rnd(x) register int x; { return(RND(x)+1); } d(n,x) register int n,x; { register int tmp = n; while(n--) tmp += RND(x); return(tmp); } #file savelev.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* savelev.h version 1.0.1 - also save engravings from MKLEV */ #include "hack.h" #include <stdio.h> extern struct monst *restmonchn(); extern struct obj *restobjchn(); extern struct obj *billobjs; extern char *itoa(); extern char nul[]; #ifndef NOWORM #include "def.wseg.h" extern struct wseg *wsegs[32], *wheads[32]; extern long wgrowtime[32]; #endif NOWORM savelev(fd){ #ifndef NOWORM register struct wseg *wtmp, *wtmp2; register int tmp; #endif NOWORM if(fd < 0) panic("Save on bad file!"); bwrite(fd,(char *) levl,sizeof(levl)); bwrite(fd,(char *) &moves,sizeof(long)); bwrite(fd,(char *) &xupstair,sizeof(xupstair)); bwrite(fd,(char *) &yupstair,sizeof(yupstair)); bwrite(fd,(char *) &xdnstair,sizeof(xdnstair)); bwrite(fd,(char *) &ydnstair,sizeof(ydnstair)); savemonchn(fd, fmon); savegenchn(fd, fgold); savegenchn(fd, ftrap); saveobjchn(fd, fobj); saveobjchn(fd, billobjs); /* if (!ismklev) */ billobjs = 0; save_engravings(fd); #ifndef QUEST bwrite(fd,(char *) rooms,sizeof(rooms)); bwrite(fd,(char *) doors,sizeof(doors)); #endif QUEST /* if (!ismklev) */ { fgold = ftrap = 0; fmon = 0; fobj = 0; } /*--------------------------------------------------------------------*/ #ifndef NOWORM bwrite(fd,(char *) wsegs,sizeof(wsegs)); for(tmp=1; tmp<32; tmp++){ for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){ wtmp2 = wtmp->nseg; bwrite(fd,(char *) wtmp,sizeof(struct wseg)); } /* if (!ismklev) */ wsegs[tmp] = 0; } bwrite(fd,(char *) wgrowtime,sizeof(wgrowtime)); #endif NOWORM /*--------------------------------------------------------------------*/ } bwrite(fd,loc,num) register int fd; register char *loc; register unsigned num; { /* lint wants the 3rd arg of write to be an int; lint -p an unsigned */ if(write(fd, loc, (int) num) != num) panic("cannot write %d bytes to file #%d",num,fd); } saveobjchn(fd,otmp) register int fd; register struct obj *otmp; { register struct obj *otmp2; unsigned xl; int minusone = -1; while(otmp) { otmp2 = otmp->nobj; xl = otmp->onamelth; bwrite(fd, (char *) &xl, sizeof(int)); bwrite(fd, (char *) otmp, xl + sizeof(struct obj)); /* if (!ismklev) */ free((char *) otmp); otmp = otmp2; } bwrite(fd, (char *) &minusone, sizeof(int)); } savemonchn(fd,mtmp) register int fd; register struct monst *mtmp; { register struct monst *mtmp2; unsigned xl; int minusone = -1; int monnum; #ifdef FUNNYRELOC struct permonst *monbegin = &mons[0]; bwrite(fd, (char *) &monbegin, sizeof(monbegin)); #endif while(mtmp) { mtmp2 = mtmp->nmon; xl = mtmp->mxlth + mtmp->mnamelth; bwrite(fd, (char *) &xl, sizeof(int)); /* JAT - just save the offset into the monster table, */ /* it will be relocated when read in */ monnum = mtmp->data - &mons[0]; mtmp->data = (struct permonst *)monnum; #ifdef DEBUGMON myprintf("Wrote monster #%d", monnum); #endif bwrite(fd, (char *) mtmp, xl + sizeof(struct monst)); if(mtmp->minvent) saveobjchn(fd,mtmp->minvent); /* if (!ismklev) */ free((char *) mtmp); mtmp = mtmp2; } bwrite(fd, (char *) &minusone, sizeof(int)); } savegenchn(fd,gtmp) register int fd; register struct gen *gtmp; { register struct gen *gtmp2; while(gtmp) { gtmp2 = gtmp->ngen; bwrite(fd, (char *) gtmp, sizeof(struct gen)); /* if (!ismklev) */ free((char *) gtmp); gtmp = gtmp2; } bwrite(fd, nul, sizeof(struct gen)); }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/06/86)
#file def.arrows.h unsigned long UPdata[] = { 0x00000000, 0x00780000, 0x01FE0000, 0x07FF8000, 0x00780000, 0x00780000, 0x00780000, 0x00780000, 0x00780000, 0x00000000, 0xFFFFFC00, 0xFFE7FC00, 0xFFF9FC00, 0xFFFE7C00, 0xFFF7FC00, 0xFFF7FC00, 0xFFF7FC00, 0xFFF7FC00, 0xFFF7FC00, 0xFFFFFC00 }; unsigned long DOWNdata[] = { 0x00000000, 0x00780000, 0x00780000, 0x00780000, 0x00780000, 0x00780000, 0x07FF8000, 0x01FE0000, 0x00780000, 0x00000000, 0xFFFFFC00, 0xFF87FC00, 0xFFF7FC00, 0xFFF7FC00, 0xFFF7FC00, 0xFFF7FC00, 0xFFF07C00, 0xFFFFFC00, 0xFFFFFC00, 0xFFFFFC00 }; unsigned long RIGHTdata[] = { 0x00000000, 0x00000000, 0x00070000, 0x0007C000, 0x3FFFF000, 0x3FFFF000, 0x0007C000, 0x00070000, 0x00000000, 0x00000000, 0xFFFFFC00, 0xFFFFFC00, 0xFFF8FC00, 0xFFFF3C00, 0xC00FCC00, 0xFFFFEC00, 0xFFFFFC00, 0xFFFFFC00, 0xFFFFFC00, 0xFFFFFC00 }; unsigned long LEFTdata[] = { 0x00000000, 0x00000000, 0x03800000, 0x0F800000, 0x3FFFF000, 0x3FFFF000, 0x0F800000, 0x03800000, 0x00000000, 0x00000000, 0xFFFFFC00, 0xFFFFFC00, 0xFE7FFC00, 0xFF7FFC00, 0xFF000C00, 0xFFFFEC00, 0xFFFFFC00, 0xFFFFFC00, 0xFFFFFC00, 0xFFFFFC00 }; unsigned long UPLEFTdata[] = { 0x00000000, 0x1FF80000, 0x1FE00000, 0x1FE00000, 0x1FF80000, 0x187E0000, 0x001F8000, 0x0007E000, 0x00018000, 0x00000000, 0xFFFFFC00, 0xE007FC00, 0xFFDFFC00, 0xFFDFFC00, 0xFFE7FC00, 0xFFF9FC00, 0xFFFE7C00, 0xFFFF9C00, 0xFFFFFC00, 0xFFFFFC00 }; unsigned long UPRIGHTdata[] = { 0x00000000, 0x007FE000, 0x001FE000, 0x001FE000, 0x007FE000, 0x01F86000, 0x07E00000, 0x1F800000, 0x06000000, 0x00000000, 0xFFFFFC00, 0xFF801C00, 0xFFFF9C00, 0xFFFF9C00, 0xFFFF9C00, 0xFFFF9C00, 0xFFFFFC00, 0xFFFFFC00, 0xFFFFFC00, 0xFFFFFC00 }; unsigned long DOWNLEFTdata[] = { 0x00000000, 0x00018000, 0x0007E000, 0x001F8000, 0x187E0000, 0x1FF80000, 0x1FE00000, 0x1FE00000, 0x1FF80000, 0x00000000, 0xFFFFFC00, 0xFFFE7C00, 0xFFFF9C00, 0xFFFFFC00, 0xE7FFFC00, 0xF9FFFC00, 0xFFFFFC00, 0xFF9FFC00, 0xFFE7FC00, 0xFFFFFC00 }; unsigned long DOWNRIGHTdata[] = { 0x00000000, 0x06000000, 0x1F800000, 0x07E00000, 0x01F86000, 0x007FE000, 0x001FE000, 0x0007E000, 0x001FE000, 0x00000000, 0xFFFFFC00, 0xF9FFFC00, 0xFE7FFC00, 0xFF9FFC00, 0xFFE79C00, 0xFFF8DC00, 0xFFFFDC00, 0xFFFFDC00, 0xFFFFDC00, 0xFFFFFC00 }; #file def.menus.h #define TEXT(nam,str) struct IntuiText nam = {0,1,JAM2,0,0,NULL,str,NULL} /* Commands */ TEXT(T_HELP, "? display help"); TEXT(T_o, "o set options"); TEXT(T_SHELL, "! AMIGADOS commands"); TEXT(T_v, "v version number"); TEXT(T_CR, "^R redraw screen"); TEXT(T_CP, "^P repeat last message"); TEXT(T_Q, "Q quit game"); TEXT(T_S, "S save the game"); /* Inventory */ TEXT(T_i, "i inventory"); TEXT(T_p, "p pay your bill"); TEXT(T_d, "d drop an object"); TEXT(T_D, "D Drop several things"); TEXT(T_COMMA, ", Pickup an object"); TEXT(T_SLASH, "/ identify something"); TEXT(T_c, "c call class of objects"); TEXT(T_C, "C Christen a monster"); /* Actions */ TEXT(T_a, "a apply/use something"); TEXT(T_e, "e eat something"); TEXT(T_q, "q quaff a potion"); TEXT(T_r, "r read a scroll"); TEXT(T_t, "t throw/shoot weapon"); TEXT(T_z, "z zap a wand"); /* Preparations */ TEXT(T_w, "w wield a weapon"); TEXT(T_P, "P Put on ring"); TEXT(T_R, "R Remove ring"); TEXT(T_T, "T Take off armor"); TEXT(T_W, "W Wear armor"); TEXT(T_WPN, ") current weapon"); TEXT(T_ARMOR, "[ current armor"); TEXT(T_RING, "= current rings"); /* Movement */ TEXT(T_E, "E Engrave msg on floor"); TEXT(T_s, "s search"); TEXT(T_UP, "< Go up stairs"); TEXT(T_DOWN, "> Go down stairs"); TEXT(T_WAIT, ". wait a moment"); TEXT(T_CT, "^T Teleport"); #define IFLAGS ITEMENABLED|ITEMTEXT|HIGHCOMP #define IDATA(str,off) 0,off,200,9,IFLAGS,0,(APTR)&str,NULL,NULL,NULL,NULL struct MenuItem cmdsub[] = { { &cmdsub[1], IDATA(T_HELP, 0) }, { &cmdsub[2], IDATA(T_o, 10) }, { &cmdsub[3], IDATA(T_SHELL, 20) }, { &cmdsub[4], IDATA(T_v, 30) }, { &cmdsub[5], IDATA(T_CR, 40) }, { &cmdsub[6], IDATA(T_CP, 50) }, { &cmdsub[7], IDATA(T_Q, 60) }, { NULL, IDATA(T_S, 70) } }; struct MenuItem invsub[] = { { &invsub[1], IDATA(T_i, 0) }, { &invsub[2], IDATA(T_p, 10) }, { &invsub[3], IDATA(T_d, 20) }, { &invsub[4], IDATA(T_D, 30) }, { &invsub[5], IDATA(T_COMMA, 40) }, { &invsub[6], IDATA(T_SLASH, 50) }, { &invsub[7], IDATA(T_c, 60) }, { NULL, IDATA(T_C, 70) } }; struct MenuItem actsub[] = { { &actsub[1], IDATA(T_a, 0) }, { &actsub[2], IDATA(T_e, 10) }, { &actsub[3], IDATA(T_q, 20) }, { &actsub[4], IDATA(T_r, 30) }, { &actsub[5], IDATA(T_t, 40) }, { NULL, IDATA(T_z, 50) } }; struct MenuItem armsub[] = { { &armsub[1], IDATA(T_w, 0) }, { &armsub[2], IDATA(T_P, 10) }, { &armsub[3], IDATA(T_R, 20) }, { &armsub[4], IDATA(T_T, 30) }, { &armsub[5], IDATA(T_W, 40) }, { &armsub[6], IDATA(T_WPN, 50) }, { &armsub[7], IDATA(T_ARMOR, 60) }, { NULL, IDATA(T_RING, 70) } }; struct MenuItem movsub[] = { { &movsub[1], IDATA(T_E, 0) }, { &movsub[2], IDATA(T_s, 10) }, { &movsub[3], IDATA(T_UP, 20) }, { &movsub[4], IDATA(T_DOWN, 30) }, { &movsub[5], IDATA(T_WAIT, 40) }, { NULL, IDATA(T_CT, 50) } }; struct Menu HackMenu[] = { { &HackMenu[1], 10,0, 80,0,MENUENABLED,"Commands", &cmdsub[0] }, { &HackMenu[2], 90,0, 80,0,MENUENABLED,"Inventory", &invsub[0] }, { &HackMenu[3],180,0, 80,0,MENUENABLED,"Actions", &actsub[0] }, { &HackMenu[4],270,0,100,0,MENUENABLED,"Preparations", &armsub[0] }, { NULL, 390,0, 80,0,MENUENABLED,"Movement", &movsub[0] } }; char menukey[5][10] = { { '?', /* display help */ 'o', /* set options */ '!', /* AMIGADOS commands */ 'v', /* version number */ 022, /*R redraw screen */ 024, /*P repeat last message */ 'Q', /* quit game */ 'S', /* save the game */ },{ /* Inventory */ 'i', /* inventory */ 'p', /* pay your bill */ 'd', /* drop an object */ 'D', /* Drop several things */ ',', /* Pickup an object */ '/', /* identify something */ 'c', /* call a class of objects */ 'C', /* Christen a monster */ },{ /* Actions */ 'a', /* apply/use something */ 'e', /* eat something */ 'q', /* quaff a potion */ 'r', /* read a scroll */ 't', /* throw/shoot weapon */ 'z', /* zap a wand */ },{ /* Preparations */ 'w', /* wield a weapon */ 'P', /* Put on ring */ 'R', /* Remove ring */ 'T', /* Take off armor */ 'W', /* Wear armor */ ')', /* current weapon */ '[', /* current armor */ '=', /* current rings */ },{ /* Movement */ 'E', /* Engrave msg on floor */ 's', /* search */ '<', /* Go up stairs */ '>', /* Go down stairs */ '.', /* wait a moment */ 024, /* Teleport */ } }; #file hack.window.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include <exec/types.h> #include <exec/io.h> #include <intuition/intuition.h> #include <stdio.h> #include "hack.h" /* for ROWNO and COLNO */ #include "def.menus.h" #define XSIZE 8 #define YSIZE 8 #define BASEX 4 #define BASEY 4 /* should be -4 */ #define ICON_REV 0 #define GRAPHICS_REV 29 #define INTUITION_REV 29 struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; char *IconBase; int mousex, mousey; #define BUFFERED 512 char out_buffer[BUFFERED]; int bufcnt; char *out_bufp; #ifdef STUPIDARROWS #include "def.arrows.h" struct Image URImage = { 0,0,22,10,2,(short *)&UPRIGHTdata, 0x3, 0, NULL }; struct Image DRImage = { 0,0,22,10,2,(short *)&DOWNRIGHTdata, 0x3, 0, NULL }; struct Image RImage = { 0,0,22,10,2,(short *)&RIGHTdata, 0x3, 0, NULL }; struct Image DImage = { 0,0,22,10,2,(short *)&DOWNdata, 0x3, 0, NULL }; struct Image UImage = { 0,0,22,10,2,(short *)&UPdata, 0x3, 0, NULL }; struct Image LImage = { 0,0,22,10,2,(short *)&LEFTdata, 0x3, 0, NULL }; struct Image DLImage = { 0,0,22,10,2,(short *)&DOWNLEFTdata, 0x3, 0, NULL }; struct Image ULImage = { 0,0,22,10,2,(short *)&UPLEFTdata, 0x3, 0, NULL }; struct Gadget URGadget = { NULL, 436, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&URImage, NULL, NULL, 0, NULL, 'u', NULL }; struct Gadget DRGadget = { &URGadget, 568, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&DRImage, NULL, NULL, 0, NULL, 'n', NULL }; struct Gadget RGadget = { &DRGadget, 490, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&RImage, NULL, NULL, 0, NULL, 'l', NULL }; struct Gadget DGadget = { &RGadget, 544, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&DImage, NULL, NULL, 0, NULL, 'j', NULL }; struct Gadget UGadget = { &DGadget, 412, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&UImage, NULL, NULL, 0, NULL, 'k', NULL }; struct Gadget LGadget = { &UGadget, 466, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&LImage, NULL, NULL, 0, NULL, 'h', NULL }; struct Gadget DLGadget = { &LGadget, 520, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&DLImage, NULL, NULL, 0, NULL, 'b', NULL }; struct Gadget ULGadget = { &DLGadget, 388, 0, 22,10, GADGHCOMP | GADGIMAGE, GADGIMMEDIATE, BOOLGADGET, (APTR)&ULImage, NULL, NULL, 0, NULL, 'y', NULL }; #endif struct TextAttr HackFont = { "topaz.font", TOPAZ_EIGHTY,FS_NORMAL, FPF_ROMFONT}; struct NewScreen NewHackScreen = { 0, 0, 640, 200, 3, 0, 1, HIRES, CUSTOMSCREEN, &HackFont, "HACK V1.0.1a - Ported by John A. Toebes, VIII", NULL, NULL }; struct Window *HackWindow; struct Screen *HackScreen; struct NewWindow NewHackWindow = { 0,1,640,199, -1,-1, /* left, top, width, height, detailpen, blockpen */ MOUSEBUTTONS | CLOSEWINDOW | RAWKEY | MENUPICK #ifdef STUPIDARROWS | GADGETDOWN #endif ,WINDOWDEPTH | WINDOWCLOSE | ACTIVATE | SIMPLE_REFRESH, #ifdef STUPIDARROWS &ULGadget, #else NULL, #endif NULL, "HACK V1.0.1a - Ported by John A. Toebes, VIII", NULL, NULL, 640,200,640,200, CUSTOMSCREEN }; struct IOStdReq consoleIO; #define HO "\x9BH" #define CL "\x0C" #define CE "\x9BK" #define UP "\x0B" #define CM "\x9B%d;%dH" #define ND "\x09" #define XD "\x9BB" #define BC "\x08" #define SO "\x9B4m" #define SE "\x9B0m" #define BELL 7 int myx, myy; startup() { } /* Cursor movements */ extern xchar curx, cury; curs(x,y) register int x,y; /* not xchar: perhaps xchar is unsigned and curx-x would be unsigned as well */ { if (y != cury || x != curx) myprintf(CM, y, x); curx = x; cury = y; } cl_end() { myprintf(CE); } clear_screen() { myprintf(CL); curx = cury = 1; } home() { myprintf(HO); curx = cury = 1; } standoutbeg() { myprintf(SO); } standoutend() { myprintf(SE); } backsp() { myprintf(BC); curx--; } bell() { myputchar(BELL); } delay_output() { /* delay 40 ms, 50 ticks/sec */ /* Delay (2); */ } initterm() { #ifdef DEBUGIT printf("intuition.library?\n"); fflush(stdout); #endif if ( (IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", INTUITION_REV)) == NULL) _exit(2); #ifdef DEBUGIT printf("graphics.library?\n"); fflush(stdout); #endif if ( (GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",GRAPHICS_REV)) == NULL) _exit(3); #ifdef DEBUGIT printf("icon.library?\n"); fflush(stdout); #endif if ( (IconBase = (char *) OpenLibrary("icon.library",ICON_REV)) == NULL) _exit(4); if ( (HackScreen = (struct Screen *) OpenScreen(&NewHackScreen)) == NULL) _exit(5); NewHackWindow.Screen = HackScreen; #ifdef DEBUGIT printf("OpenWindow?\n"); fflush(stdout); #endif if ( (HackWindow = (struct Window *) OpenWindow(&NewHackWindow)) == NULL) { CloseScreen(HackScreen); _exit(6); } #ifdef DEBUGIT printf("menu strip?\n"); fflush(stdout); #endif SetMenuStrip(HackWindow,&HackMenu); #ifdef DEBUGIT printf("console.device?\n"); fflush(stdout); #endif consoleIO.io_Data = (APTR) HackWindow; consoleIO.io_Length = sizeof(*HackWindow); if (OpenDevice("console.device",0, &consoleIO, 0) != 0) hackexit(7); #ifdef DEBUGIT printf("doneinit\n"); fflush(stdout); #endif bufcnt = 0; out_bufp = out_buffer; } hackexit(code) int code; { CloseDevice(&consoleIO); ClearMenuStrip(HackWindow); CloseWindow(HackWindow); CloseScreen(HackScreen); CloseLibrary(IconBase); CloseLibrary(GfxBase); CloseLibrary(IntuitionBase); _exit(code); } myfflush() { register int dummy1, dummy2; if (bufcnt) { consoleIO.io_Command = CMD_WRITE; consoleIO.io_Data = (APTR)out_buffer; consoleIO.io_Length = bufcnt; DoIO(&consoleIO); } bufcnt = 0; } myputchar(c) char c; { if (bufcnt == BUFFERED) myfflush(); out_buffer[bufcnt++] = c; } myputs(str) char *str; { register int dummy1, dummy2; int len, tocopy; len = strlen(str); if (len >= BUFFERED) { myfflush(); consoleIO.io_Command = CMD_WRITE; consoleIO.io_Data = (APTR)str; consoleIO.io_Length = len; DoIO(&consoleIO); } else { if (bufcnt+len >= BUFFERED) /* is there room */ { tocopy = BUFFERED - bufcnt; movmem(str, &out_buffer[bufcnt], tocopy); bufcnt += tocopy; len -= tocopy; str += tocopy; myfflush(); } if (len) { /* just move it in */ movmem(str, &out_buffer[bufcnt], len); bufcnt += len; } } myputchar('\n'); } /*VARARGS1*/ myprintf(str,a1,a2,a3,a4,a5,a6,a7,a8,a9) char *str,*a1,*a2,*a3,*a4,*a5,*a6,*a7,*a8,*a9; { char buf[BUFFERED], *bptr; int len, tocopy; bptr = &buf; len = (int)sprintf(bptr,str,a1,a2,a3,a4,a5,a6,a7,a8,a9); if (bufcnt+len >= BUFFERED) /* is there room */ { tocopy = BUFFERED - bufcnt; movmem(bptr, &out_buffer[bufcnt], tocopy); bufcnt += tocopy; len -= tocopy; bptr += tocopy; myfflush(); } if (len) { /* just move it in */ movmem(bptr, &out_buffer[bufcnt], len); bufcnt += len; } } inchar() { register int dummy1, dummy2; struct IntuiMessage *Message, *GetMsg(); int c; USHORT thismenu, menusel; #ifdef STUPIDARROWS struct Gadget *gadget; #endif struct MenuItem *item, *ItemAddress(); c = 0; while(!c) { while( (Message = GetMsg(HackWindow->UserPort)) == NULL) Wait( 1 << HackWindow->UserPort->mp_SigBit ); switch(Message->Class) { case MENUPICK: menusel = thismenu = Message->Code; while(thismenu != MENUNULL) { menusel = thismenu; item = ItemAddress(&HackMenu, thismenu); thismenu = item->NextSelect; } if (menusel != MENUNULL) c = menukey[MENUNUM(menusel)][ITEMNUM(menusel)]; break; case MOUSEBUTTONS: mousex = ( (Message->MouseX) + BASEX ) / XSIZE; mousey = ( (Message->MouseY) - BASEY ) / YSIZE; if (mousex > 0 && mousey > 0 && mousex <= COLNO && mousey <= ROWNO ) { if (Message->Code == SELECTDOWN) c = MDOWN; else if (Message->Code == SELECTUP) c = MUP; } break; case CLOSEWINDOW: c = 'Q'; break; #ifdef STUPIDARROWS case GADGETDOWN: gadget = (struct Gadget *)Message->IAddress; c = gadget->GadgetID; break; #endif case RAWKEY: c = cnvrtkey(Message->Code,Message->Qualifier); break; default: c = 'Q'; break; } ReplyMsg(Message); } return(c); } #define NORMAL 0 #define SHIFTED 1 #define CONTROL 2 #define ALTED 3 short lookup[4][96] = { /* unshifted table */ '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\\', 0, '0', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 0, 'b', 'j', 'n', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', 0, 0, 'h', '.', 'l', 0, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, '.', 'y', 'k', 'u', ' ', 8, 'i', '\n', '\n', 022, 8, 0, 0, 0, '-', 0, 'k', 'j', 'l', 'h', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '?', /* shifted table */ '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '|', 0, '0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 0, 'B', 'J', 'N', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', 0, 0, 'H', '.', 'L', 0, 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0, '.', 'Y', 'K', 'U', ' ', 'H', 'I', '\N', '\N', 022, 'H', 0, 0, 0, '-', 0, 'K', 'J', 'L', 'H', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '?', /* controlled table */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Q', 0, 0, 0, 0, 0, 022, 024, 0, 0, 0, 0, 020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '?', /* alted table */ '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\\', 0, '0', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 0, 'b', 'j', 'n', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', 0, 0, 'h', '.', 'l', 0, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '?', 0, '.', 'y', 'k', 'u', ' ', 'h', 'i', '\n', '\n', 022, 'h', 0, 0, 0, '-', 0, 'k', 'j', 'l', 'h', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '?' }; int cnvrtkey(code, qual ) USHORT code, qual; { int table; if (code > 0x5f) return(0); if (qual & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) table = SHIFTED; else if (qual & (IEQUALIFIER_LALT | IEQUALIFIER_RALT)) table = ALTED; else if (qual & (IEQUALIFIER_CONTROL)) table = CONTROL; else table = NORMAL; return((int)lookup[table][code]); } #file hack.termcap.c /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ #include <stdio.h> #include "config.h" /* for ROWNO and COLNO */ #define HEIGHT 8 #define WIDTH 8 #define TOP 16 #define LEFT 3 startup() { } /* Cursor movements */ extern xchar curx, cury; curs(x,y) register int x,y; /* not xchar: perhaps xchar is unsigned and curx-x would be unsigned as well */ { if (y == cury && x == curx) return; cmov(x,y); } nocmov(x,y) { cmov(x,y); /* always go to the requested position */ } cmov(x,y) register int x,y; { setxy(LEFT+x*WIDTH,TOP+y*HEIGHT); cury = y; curx = x; } cl_end() { weraeol(); } clear_screen() { /* printf(CL); */ home(); } home() { setxy(TOP,LEFT); curx = cury = 1; } standoutbeg() { /* printf(SO); */ } standoutend() { /* printf(SE); */ } backsp() { cmov(curx-1,cury); } bell() { /* putchar('\007'); */ } delay_output() { /* delay 40 ms, 50 ticks/sec */ Delay (2); } #file hack.graphics.c /* Copyright (c) John A. Toebes, VIII 1986 */ #include <exec/types.h> #include <exec/io.h> #include <intuition/intuition.h> #include <graphics/view.h> #include <stdio.h> #include <fcntl.h> #include "config.h" #include "hack.h" /* for ROWNO and COLNO */ #define XSIZE 8 #define YSIZE 8 #define BASEX (-4) #define BASEY 19 #define PICSIZE (8*4) #define USEDPLANES 3 extern struct Window *HackWindow; extern struct Screen *HackScreen; UWORD colormap[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; USHORT mondata[] = { 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00 }; struct Image monImage = { 0, 0, 8, 8, 3, &mondata[0], 0x0f, 0x0, NULL }; char *monpics; char basemon; InitGraphics() { char maxchar; int file; int size; int i; register int dummy1, dummy2; if ( (file = open(HACKCSET, O_RDONLY)) == -1 ) panic("Cannot Open Graphics Characters"); /* cm = GetColorMap(16); HackScreen->ViewPort.ColorMap = cm; */ mread(file,colormap, 32); for (i=0; i<8; i++) SetRGB4(&HackScreen->ViewPort, i, (colormap[i] >> 8) & 0x0f, (colormap[i] >> 4) & 0x0f, (colormap[i]) &0x0f); mread(file,&basemon,1); mread(file,&maxchar,1); size = (maxchar-basemon)*PICSIZE; if ((monpics = (char *)malloc(size)) == NULL) panic("Cannot get char area"); mread(file,monpics,size); } at(x,y,ch) register xchar x,y; char ch; { char *thisone; int i; /* first construct the picture */ thisone = monpics+PICSIZE*(ch-basemon); for (i=0; i<PICSIZE; i++) mondata[i] = thisone[i] << 8; if ((curx == x) & (cury == (y+2)) ) home(); myfflush(); DrawImage(HackWindow->RPort, &monImage, BASEX+(x*XSIZE), BASEY+(y*YSIZE)); } #file hack.icon.c #include <workbench/startup.h> #include <workbench/icon.h> #include <workbench/workbench.h> extern struct WBStartup *WBenchMsg; extern char pl_character[]; extern char plname[]; geticon() { struct WBArg *argp; char *argname; argp = WBenchMsg->sm_ArgList; if (WBenchMsg->sm_NumArgs > 1) { argname = (argp+1)->wa_Name; pl_character[0] = pl_character[1] = 0; /* argp now points to the name */ if (!strcmp(argname, "Wizard" )) pl_character[0] = 'W'; else if (!strcmp(argname, "Speliologist")) pl_character[0] = 'S'; else if (!strcmp(argname, "Tourist" )) pl_character[0] = 'T'; else if (!strcmp(argname, "Fighter" )) pl_character[0] = 'F'; else if (!strcmp(argname, "Knight" )) pl_character[0] = 'K'; else if (!strcmp(argname, "Caveman" )) pl_character[0] = 'C'; else strcpy(plname, argname); } } makeicon(name,type) char *name; char type; { char *source; struct DiskObject *object; switch(type) { case 'w': case 'W': source = "Wizard"; break; case 's': case 'S': source = "Speliologist"; break; case 't': case 'T': source = "Tourist"; break; case 'f': case 'F': source = "Fighter"; break; case 'k': case 'K': source = "Knight"; break; case 'c': case 'C': source = "Caveman"; break; default: source = "HACK"; break; } if ( (object = GetDiskObject(source)) == NULL) myprintf("Cannot get source icon - err #%d\n", IoErr() ); object->do_CurrentX = NO_ICON_POSITION; object->do_CurrentY = NO_ICON_POSITION; if ( (object = PutDiskObject( name, object )) == NULL) myprintf("Cannot create save icon - err #%d\n", IoErr() ); FreeDiskObject(object); } delicon(name) { struct WBObject *object; char tempname[100]; /* should hold any file name */ strcpy(tempname,name); strcat(tempname,".info"); if ( unlink(tempname) == -1) myprintf("Cannot delete .info file\n"); } #file qsort.c qsort( v, n, size, comp) char *v; int n; int size; int (*comp)(); { int gap, i, j, x, cnt; char temp, *p1, *p2; cnt = 0; for (gap=n/2; gap > 0 ; gap /= 2) for (i=gap; i<n; i++) for (j = i-gap; j >= 0; j -= gap) if ( (*comp) ( (p1=v+j*size), (p2=v+(j+gap)*size) ) < 0) { cnt++; /* exchange them */ for (x=0; x<size; x++) { temp = *p1; *p1++ = *p2; *p2++ = temp; } } return(cnt); } #file unixxface.c #include <stdio.h> #include <libraries/dosextens.h> int getpid() { long now[3]; DateStamp(&now); return(now[0] ^ now[1] ^ now[2]); } int *signal(num,func) int num; int *func; { return(NULL); } getenv(var) char *var; { return(NULL); } execl() { /* this should flag an error */ } chdir(dir) char *dir; { struct FileLock *lock; if ( (lock = Lock(dir, ACCESS_READ)) == NULL) return(1); /* cannot find the directory */ lock = CurrentDir( lock ); if (lock) UnLock(lock); /* change to the desired directory */ return(0); /* phoney success */ } char *getlogin() { /* return the login name - perhaps we can use getenv */ return (NULL); } perror(string) char *string; { myprintf("Call to perror for '%s'\n", string); } char *index(p,c) char *p; char c; { char *strchr(); return(strchr(p,c)); } char *rindex(p,c) char *p; char c; { char *strrchr(); return(strrchr(p,c)); } #file _main.c #include <stdio.h> #include <ctype.h> #include <ios1.h> #include "workbench/startup.h" #include "libraries/dos.h" #define MAXARG 32 /* maximum command line arguments */ #ifndef TINY extern int _stack,_fmode,_iomode; #endif extern int LoadAddress; extern struct UFB _ufbs[]; int argc; /* arg count */ char *argv[MAXARG]; /* arg pointers */ #define MAXWINDOW 40 extern struct WBStartup *WBenchMsg; static char window[MAXWINDOW] = "con:10/10/320/80/"; /** * * name _main - process command line, open files, and call "main" * * synopsis _main(line); * char *line; ptr to command line that caused execution * * description This function performs the standard pre-processing for * the main module of a C program. It accepts a command * line of the form * * pgmname arg1 arg2 ... * * and builds a list of pointers to each argument. The first * pointer is to the program name. For some environments, the * standard I/O files are also opened, using file names that * were set up by the OS interface module XCMAIN. * **/ _main(line) char *line; { char c; int x; /* * * Build argument pointer list * */ for(argc = 0; argc < MAXARG; ) { while(isspace(*line)) line++; if(*line == '\0') break; argv[argc++] = line; while((*line != '\0') && (isspace(*line) == 0)) line++; c = *line; *line++ = '\0'; if(c == '\0') break; } _ufbs[0].ufbflg |= UFB_OP | UFB_RA | UFB_NC; _ufbs[1].ufbflg |= UFB_OP | UFB_WA | UFB_NC; _ufbs[2].ufbflg |= UFB_OP | UFB_WA ; /* * * Call user's main program * */ #ifdef DEBUG printf("load address = %lx\n",LoadAddress); Debug(0); #endif main(argc,argv); /* call main function */ _exit(0); } #file link_hack FROM HACK_game:lib/c.o+ * HACK_source:_main.o+ * HACK_source:savelev.o+ * HACK_source:hack.trap.o+ * HACK_source:hack.save.o+ * HACK_source:hack.o+ * HACK_source:hack.rumors.o+ * HACK_source:hack.end.o+ * HACK_source:hack.apply.o+ * HACK_source:hack.mhitu.o+ * HACK_source:hack.o_init.o+ * HACK_source:hack.worm.o+ * HACK_source:hack.do.o+ * HACK_source:hack.wield.o+ * HACK_source:hack.pri.o+ * HACK_source:hack.invent.o+ * HACK_source:hack.version.o+ * HACK_source:hack.u_init.o+ * HACK_source:hack.vault.o+ * HACK_source:hack.eat.o+ * HACK_source:hack.dog.o+ * HACK_source:hack.timeout.o+ * HACK_source:rnd.o+ * HACK_source:hack.cmdlist.o+ * HACK_source:hack.options.o+ * HACK_source:hack.topl.o+ * HACK_source:hack.mkobj.o+ * HACK_source:hack.monst.o+ * HACK_source:hack.stat.o+ * HACK_source:hack.steal.o+ * HACK_source:hack.makemon.o+ * HACK_source:mklv.shknam.o+ * HACK_source:hack.track.o+ * HACK_source:hack.zap.o+ * HACK_source:hack.do_wear.o+ * HACK_source:mklv.shk.o+ * HACK_source:hack.objnam.o+ * HACK_source:hack.worn.o+ * HACK_source:hack.lev.o+ * HACK_source:hack.shk.o+ * HACK_source:hack.whatis.o+ * HACK_source:hack.bones.o+ * HACK_source:hack.read.o+ * HACK_source:hack.Decl.o+ * HACK_source:hack.search.o+ * HACK_source:hack.do_name.o+ * HACK_source:mklv.makemaz.o+ * HACK_source:hack.main.o+ * HACK_source:alloc.o+ * HACK_source:hack.fight.o+ * HACK_source:hack.tty.o+ * HACK_source:UnixXface.o+ * HACK_source:hack.engrave.o+ * HACK_source:mklev.o+ * HACK_source:hack.mon.o+ * HACK_source:qsort.o+ * HACK_source:hack.window.o+ * HACK_source:hack.graphics.o+* HACK_source:hack.icon.o+ * HACK_source:hack.rip.o TO HACK_game:Hack LIBRARY HACK_game:lib/lc.lib+HACK_game:lib/amiga.lib MAP nil: #file ccall stack 10000 lc1 -ii: -cw -oram: hack.window lc2 -v -ohack_source: ram:hack.window lc1 -ii: -cw -oram: hack.icon lc2 -v -ohack_source: ram:hack.icon lc1 -ii: -cw -oram: unixxface lc2 -v -ohack_source: ram:unixxface lc1 -ii: -cw -oram: -dTINY _main lc2 -v -ohack_source: ram:-dTINY _main lc1 -ii: -cw -oram: hack.save lc2 -v -ohack_source: ram:hack.save lc1 -ii: -cw -oram: hack.trap lc2 -v -ohack_source: ram:hack.trap lc1 -ii: -cw -oram: hack lc2 -v -ohack_source: ram:hack lc1 -ii: -cw -oram: hack.rumors lc2 -v -ohack_source: ram:hack.rumors lc1 -ii: -cw -oram: hack.end lc2 -v -ohack_source: ram:hack.end lc1 -ii: -cw -oram: hack.apply lc2 -v -ohack_source: ram:hack.apply lc1 -ii: -cw -oram: hack.o_init lc2 -v -ohack_source: ram:hack.o_init lc1 -ii: -cw -oram: hack.mhitu lc2 -v -ohack_source: ram:hack.mhitu lc1 -ii: -cw -oram: hack.worm lc2 -v -ohack_source: ram:hack.worm lc1 -ii: -cw -oram: hack.do lc2 -v -ohack_source: ram:hack.do lc1 -ii: -cw -oram: hack.pri lc2 -v -ohack_source: ram:hack.pri lc1 -ii: -cw -oram: hack.invent lc2 -v -ohack_source: ram:hack.invent lc1 -ii: -cw -oram: hack.wield lc2 -v -ohack_source: ram:hack.wield lc1 -ii: -cw -oram: hack.version lc2 -v -ohack_source: ram:hack.version lc1 -ii: -cw -oram: hack.u_init lc2 -v -ohack_source: ram:hack.u_init lc1 -ii: -cw -oram: hack.vault lc2 -v -ohack_source: ram:hack.vault lc1 -ii: -cw -oram: hack.dog lc2 -v -ohack_source: ram:hack.dog lc1 -ii: -cw -oram: hack.eat lc2 -v -ohack_source: ram:hack.eat lc1 -ii: -cw -oram: hack.timeout lc2 -v -ohack_source: ram:hack.timeout lc1 -ii: -cw -oram: rnd lc2 -v -ohack_source: ram:rnd lc1 -ii: -cw -oram: hack.options lc2 -v -ohack_source: ram:hack.options lc1 -ii: -cw -oram: hack.cmdlist lc2 -v -ohack_source: ram:hack.cmdlist lc1 -ii: -cw -oram: qsort lc2 -v -ohack_source: ram:qsort lc1 -ii: -cw -oram: hack.zap lc2 -v -ohack_source: ram:hack.zap lc1 -ii: -cw -oram: hack.do_wear lc2 -v -ohack_source: ram:hack.do_wear lc1 -ii: -cw -oram: mklv.shk lc2 -v -ohack_source: ram:mklv.shk lc1 -ii: -cw -oram: hack.objnam lc2 -v -ohack_source: ram:hack.objnam lc1 -ii: -cw -oram: hack.worn lc2 -v -ohack_source: ram:hack.worn lc1 -ii: -cw -oram: hack.lev lc2 -v -ohack_source: ram:hack.lev lc1 -ii: -cw -oram: hack.shk lc2 -v -ohack_source: ram:hack.shk lc1 -ii: -cw -oram: hack.whatis lc2 -v -ohack_source: ram:hack.whatis lc1 -ii: -cw -oram: hack.bones lc2 -v -ohack_source: ram:hack.bones lc1 -ii: -cw -oram: hack.read lc2 -v -ohack_source: ram:hack.read lc1 -ii: -cw -oram: hack.Decl lc2 -v -ohack_source: ram:hack.Decl lc1 -ii: -cw -oram: hack.search lc2 -v -ohack_source: ram:hack.search lc1 -ii: -cw -oram: hack.do_name lc2 -v -ohack_source: ram:hack.do_name lc1 -ii: -cw -oram: mklev lc2 -v -ohack_source: ram:mklev lc1 -ii: -cw -oram: mklv.makemaz lc2 -v -ohack_source: ram:mklv.makemaz lc1 -ii: -cw -oram: hack.main lc2 -v -ohack_source: ram:hack.main lc1 -ii: -cw -oram: alloc lc2 -v -ohack_source: ram:alloc lc1 -ii: -cw -oram: hack.fight lc2 -v -ohack_source: ram:hack.fight lc1 -ii: -cw -oram: hack.tty lc2 -v -ohack_source: ram:hack.tty lc1 -ii: -cw -oram: hack.engrave lc2 -v -ohack_source: ram:hack.engrave lc1 -ii: -cw -oram: hack.mon lc2 -v -ohack_source: ram:hack.mon lc1 -ii: -cw -oram: hack.rip lc2 -v -ohack_source: ram:hack.rip lc1 -ii: -cw -oram: hack.topl lc2 -v -ohack_source: ram:hack.topl lc1 -ii: -cw -oram: hack.mkobj lc2 -v -ohack_source: ram:hack.mkobj lc1 -ii: -cw -oram: hack.monst lc2 -v -ohack_source: ram:hack.monst lc1 -ii: -cw -oram: savelev lc2 -v -ohack_source: ram:savelev lc1 -ii: -cw -oram: hack.stat lc2 -v -ohack_source: ram:hack.stat lc1 -ii: -cw -oram: hack.steal lc2 -v -ohack_source: ram:hack.steal lc1 -ii: -cw -oram: mklv.shknam lc2 -v -ohack_source: ram:mklv.shknam lc1 -ii: -cw -oram: hack.makemon lc2 -v -ohack_source: ram:hack.makemon lc1 -ii: -cw -oram: hack.track lc2 -v -ohack_source: ram:hack.track
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/06/86)
#file data @ human (or you) - a wall | a wall + a door . the floor of a room # a corridor } water filled area < the staircase to the previous level > the staircase to the next level ^ a trap $ a pile, pot or chest of gold %% a piece of food ! a potion * a gem ? a scroll = a ring / a wand [ a suit of armor ) a weapon ( a useful item (camera, key, rope etc.) 0 an iron ball _ an iron chain " an amulet , a trapper : a chameleon ' a lurker above & a demon A a giant ant B a giant bat C a centaur; Of all the monsters put together by the Greek imagination the Centaurs (Kentauroi) constituted a class in themselves. Despite a strong streak of sensuality in their make-up, their normal behaviour was moral, and they took a kindly thought of man's welfare. The attempted outrage of Nessos on Deianeira, and that of the whole tribe of Centaurs on the Lapith women, are more than offset by the hospitality of Pholos and by the wisdom of Cheiron, physician, prophet, lyrist, and the instructor of Achilles. Further, the Cen- taurs were peculiar in that their nature, which united the body of a horse with the trunk and head of a man, involved an unthinkable duplication of vital organs and important members. So grotesque a combination seems almost un-Greek. These strange creatures were said to live in the caves and clefts of the mountains, myths associating them especially with the hills of Thessaly and the range of Erymanthos. [Mythology of all races, Vol. 1, pp. 270-271] D a dragon; In the West the dragon was the natural enemy of man. Although preferring to live in bleak and desolate regions, whenever it was seen among men it left in its wake a trail of destruction and disease. Yet any attempt to slay this beast was a perilous under- taking. For the dragon's assailant had to contend not only with clouds of sulphurous fumes pouring from its fire-breathing nos- trils, but also with the thrashings of its tail, the most deadly part of its serpent-like body. [From: Mythical Beasts by Deirdre Headon (The Leprechaun Library)] E a floating eye F a freezing sphere G a gnome H a hobgoblin; Hobgoblin. Used by the Puritans and in later times for wicked goblin spirits, as in Bunyan's 'Hobgoblin nor foul friend', but its more correct use is for the friendly spir- its of the brownie type. In 'A midsummer night's dream' a fairy says to Shakespeare's Puck: Those that Hobgoblin call you, and sweet Puck, You do their work, and they shall have good luck: Are you not he? and obviously Puck would not wish to be called a hobgoblin if that was an ill-omened word. Hobgoblins are on the whole, good-humoured and ready to be helpful, but fond of practical joking, and like most of the fairies rather nasty people to annoy. Boggarts hover on the verge of hobgoblindom. Bogles are just over the edge. One Hob mentioned by Henderson, was Hob Headless who haunted the road between Hurworth and Neasham, but could not cross the little river Kent, which flowed into the Tess. He was exorcised and laid under a large stone by the roadside for ninety-nine years and a day. If anyone was so unwary as to sit on that stone, he would be unable to quit it for ever. The ninety-nine years is nearly up, so trouble may soon be heard of on the road between Hurworth and Neasham. [Katharine Briggs, A dictionary of Fairies] I an invisible stalker J a jackal K a kobold L a leprechaun; The Irish Leprechaun is the Faeries' shoemaker and is known under various names in different parts of Ireland: Cluri- caune in Cork, Lurican in Kerry, Lurikeen in Kildare and Lu- rigadaun in Tipperary. Although he works for the Faeries, the Leprechaun is not of the same species. He is small, has dark skin and wears strange clothes. His nature has some- thing of the manic-depressive about it: first he is quite happy, whistling merrily as he nails a sole on to a shoe; a few minutes later, he is sullen and morose, drunk on his home-made heather ale. The Leprechaun's two great loves are tobacco and whiskey, and he is a first-rate con-man, impos- sible to out-fox. No one, no matter how clever, has ever managed to cheat him out of his hidden pot of gold or his magic shilling. At the last minute he always thinks of some way to divert his captor's attention and vanishes in the twinkling of an eye. [From: A Field Guide to the Little People by Nancy Arrowsmith & George Moorse. ] M a mimic N a nymph O an orc P a purple worm Q a quasit R a rust monster S a snake T a troll U an umber hulk V a vampire W a wraith X a xorn Y a yeti Z a zombie a an acid blob b a giant beetle c a cockatrice; Once in a great while, when the positions of the stars are just right, a seven-year-old rooster will lay an egg. Then, along will come a snake, to coil around the egg, or a toad, to squat upon the egg, keeping it warm and helping it to hatch. When it hatches, out comes a creature called basil- isk, or cockatrice, the most deadly of all creatures. A sin- gle glance from its yellow, piercing toad's eyes will kill both man and beast. Its power of destruction is said to be so great that sometimes simply to hear its hiss can prove fatal. Its breath is so venomenous that it causes all vege- tation to wither. There is, however, one creature which can withstand the basilisk's deadly gaze, and this is the weasel. No one knows why this is so, but although the fierce weasel can slay the basilisk, it will itself be killed in the struggle. Perhaps the weasel knows the basilisk's fatal weakness: if it ever sees its own reflection in a mirror it will perish instant- ly. But even a dead basilisk is dangerous, for it is said that merely touching its lifeless body can cause a person to sicken and die. [From: Mythical Beasts by Deirdre Headon (The Leprechaun Library) and other sources. ] d a dog e an ettin f a fog cloud g a gelatinous cube h a homunculus i an imp; An 'imp' is an off-shoot or cutting. Thus an 'ymp tree' was a grafted tree, or one grown from a cutting, not from seed. 'Imp' properly means a small devil, an off-shoot of Satan, but the distinction between goblins or bogles and imps from hell is hard to make, and many in the Celtic countries as well as the English Puritans regarded all fairies as devils. The fairies of tradition often hover uneasily between the ghostly and the diabolic state. [Katharine Briggs, A dictionary of Fairies] j a jaguar k a killer bee l a leocrotta m a minotaur n a nurse o an owlbear p a piercer q a quivering blob r a giant rat s a scorpion t a tengu; The tengu was the most troublesome creature of Japanese legend. Part bird and part man, with red beak for a nose and flashing eyes, the tengu was notorious for stirring up feuds and prolonging enmity between families. Indeed, the belligerent tengus were supposed to have been man's first instructors in the use of arms. [From: Mythical Beasts by Deirdre Headon (The Leprechaun Library). ] u a unicorn; Men have always sought the elusive unicorn, for the single twisted horn which projected from its forehead was thought to be a powerful talisman. It was said that the unicorn had simply to dip the tip of its horn in a muddy pool for the water to become pure. Men also believed that to drink from this horn was a protection against all sickness, and that if the horn was ground to a powder it would act as an antidote to all poisons. Less than 200 years ago in France, the horn of a unicorn was used in a ceremony to test the royal food for poison. Although only the size of a small horse, the unicorn is a very fierce beast, capable of killing an elephant with a single thrust from its horn. Its fleetness of foot also makes this solitary creature difficult to capture. However, it can be tamed and captured by a maiden. Made gentle by the sight of a virgin, the unicorn can be lured to lay its head in her lap, and in this docile mood, the maiden may secure it with a golden rope. [From: Mythical Beasts by Deirdre Headon (The Leprechaun Library). ] v a violet fungi w a long worm; From its teeth the crysknife can be manufactured. x a xan; The xan were animals sent to prick the legs of the Lords of Xibalba. y a yellow light z a zruty; The zruty are wild and gigantic beings, living in the wildernesses of the Tatra mountains. ~ the tail of a long worm Welcome to HACK! ( description of version 1.0.1 ) Hack is a Dungeons and Dragons like game where you (the adventurer) descend into the depths of the dungeon in search of the Amulet of Yendor (reputed to be hidden below the twentieth level). You are accompanied by a little dog that can help you in many ways and can be trained to do all sorts of things. On the way you will find useful (or useless) items, (quite possibly with magic properties) and assorted monsters. You attack a monster by trying to move into the space a monster is in (but often it is much wiser to leave it alone). Unlike most adventure games, which give you a verbal description of your location, hack gives you a visual image of the dungeon level you are on. Hack uses the following symbols: A to Z and a to z: monsters. You can find out what a letter represents by saying "/ (letter)", as in "/A", which will tell you that 'A' is a giant ant. - and | These form the walls of a room (or maze). . this is the floor of a room. # this is a corridor. > this is the staircase to the next level. < the staircase to the previous level. ` A large boulder. @ You (usually). ^ A trap. ) A weapon of some sort. ( Some other useful object (key, rope, dynamite, camera, ...) [ A suit of armor. % A piece of food (not necessarily healthy ...). / A wand. = A ring. ? A scroll. ! A magic potion. $ A pile or pot of gold. Commands: Hack knows the following commands: ? help: print this list. Q Quit the game. S Save the game. < up: go up the staircase (if you are standing on it). > down: go down (just like up). kjhlyubn - go one step in the direction indicated. k: north (i.e., to the top of the screen), j: south, h: west, l: east, y: ne, u: nw, b: se, n: sw. KJHLYUBN - Go in that direction until you hit a wall or run into something. m (followed by one of kjhlyubn): move without picking up any objects. M (followed by one of KJHLYUBN): Move far, no pickup. f (followed by one of kjhlyubn): move until something interesting is found. F (followed by one of KJHLYUBN): as previous, but forking of corridors is not considered interesting. i print your inventory. s search for secret doors and traps around you. ^ ask for the type of a trap you found earlier. ) ask for current wielded weapon. [ ask for current armor. = ask for current rings. . rest, do nothing. ^R redraw the screen. ^P repeat last message (subsequent ^P's repeat earlier messages). ^T teleport. / (followed by any symbol): tell what this symbol represents. e eat food. w wield weapon. w- means: wield nothing, use bare hands. q drink (quaff) a potion. r read a scroll. T Takeoff armor. R Remove Ring. W Wear armor. P Put on a ring. t throw or shoot a weapon. z zap a wand. p pay your shopping bill. d drop something. d7a: drop seven items of object a. D Drop several things. In answer to the question "What kinds of things do you want to drop? [!%= au]" you should give zero or more object symbols possibly followed by 'a' and/or 'u'. 'a' means: drop all such objects, without asking for confirmation. 'u' means: drop only unpaid objects (when in a shop). a use, apply - Generic command for using a key to lock or unlock a door, using a camera, using a rope, etc. c call: name a certain object or class of objects. C Call: Name an individual monster. E Engrave: Write a message in the dust on the floor. E- means: use fingers for writing. o set options. You will be asked to enter an option line. If this is empty, the current options are reported. Otherwise it should be a list of options separated by commas. Possible boolean options are: oneline, time, news, tombstone; they can be negated by prefixing them with '!' or "no". A compound option is endgame; it is followed by a description of what parts of the list of topscorers should be printed when the game is finished. v print version number. You can put a number before a command to repeat it that many times, as in "20s" or "40.". Some special feature that have been added just for the AMIGA: The numeric keypad (and cursor keys) may be used to indicate direction. ie. 8 on the keypad, UP arrow and 'k' are all ways to move up one space. Pressing SHIFT with the keypad or arrow keys causes you move in the desired direction until something interesting happens. The 8 arrows that appear on the title bar may also be use to move a single space in the indicated direction at a time. Menus appear on the top of the screen so that you can just select a command. The command character appears on the menu so that you can use these menus as a quick form of help. When you Christen a monster, or are prompted for a Teleport location (only when you have a ring of Teleport Control), you can use the mouse to indicate the place you want to go. Have Fun, and Good Hacking! "Quit" is a four letter word. A fading corridor enlightens your insight. A glowing potion is too hot to drink. A long worm hits with all of its length. A monstrous mind is a toy for ever. A ring of adornment protects against Nymphs. A rumour has it that rumours are just rumours. A smoky potion surely affects your vision. A spear might hit a nurse. A spear will hit an ettin. A tin of smoked eel is a wonderful find. A truly wise man never plays leapfrog with a unicorn. A two-handed sword usually misses. A unicorn can be tamed only by a fair maiden. A visit to the Zoo is very educational; you meet interesting animals. A wand of vibration might bring the whole cave crashing about your ears. Afraid of falling piercers? Wear a helmet! All monsters are created evil, but some are more evil than others. An elven cloak is always the height of fashion. An elven cloak protects against magic. Any small object that is accidentally dropped will hide under a larger object. Attack long worms from the rear - that is so much safer! Be careful when eating salmon - your fingers might become greasy. Be careful when throwing a boomerang - you might hit the back of your head. Better go home and hit your kids. They are just little monsters! Better go home and play with your kids. They are just little monsters! Better leave the dungeon, otherwise you might get hurt badly. Beware of dark rooms - they may be the Morgue. Beware of falling rocks, wear a helmet! Beware of wands of instant disaster. Beyond the 23-rd level lies a happy retirement in a room of your own. Blank scrolls make more interesting reading. Booksellers never read scrolls; it might carry them to far away. Booksellers never read scrolls; it might leave their shop unguarded. Dead lizards protect against a cockatrice. Death is just around the next door. Death is life's way of telling you you've been fired. Descend in order to meet more decent monsters. Direct a direct hit on your direct opponent, directing in the right direction. Don't bother about money: only Leprechauns and shopkeepers are interested. Don't forget! Large dogs are MUCH harder to kill than little dogs. Don't tell a soul you found a secret door, otherwise it isn't secret anymore. Don't throw gems. They are so precious! Besides, you might hit a roommate. Drinking might affect your health. Drop your vanity and get rid of your jewels! Pickpockets about! Dungeon expects every monster to do his duty. Dust is an armor of poor quality. Eventually all wands of striking do strike. Eventually you will come to admire the swift elegance of a retreating nymph. Ever tried to catch a flying boomerang? Every dog should be a domesticated one. Every hand has only one finger to put a ring on. You've got only two hands. So? Everybody should have tasted a scorpion at least once in his life. Fiery letters might deter monsters. First Law of Hacking: leaving is much more difficult than entering. For any remedy there is a misery. Fourth Law of Hacking: you will find the exit at the entrance. Gems are the droppings of other inmates. Gems do get a burden. Genocide on shopkeepers is punishable. Giving head to a long worm is like a long lasting reception. Good day for overcoming obstacles. Try a steeplechase. Gossip is the opiate of the depressed. Hackers do it with bugs. Half Moon tonight. (At least it's better than no Moon at all.) Hitting is the lingua franca in these regions. Hungry dogs are unreliable. Hungry? There is an abundance of food on the next level. I doubt whether nurses are virgins. I once knew a hacker who ate too fast and choked to death..... I smell a maze of twisty little passages. If a shopkeeper kicks you out of his shop, he'll kick you out of the dungeon. If you are too cute some monsters might be tempted to embrace you. If you can't learn to do it well, learn to enjoy doing it badly. If you need a wand of digging, kindly ask the minotaur. If you see nurses you better start looking somewhere for a doctor. If you turn blind: don't expect your dog to be turned into a seeing-eye dog. If you want to hit, use a dagger. If you want to rob a shop, train your dog. If you're afraid of trapdoors, just cover the floor with all you've got. Improve your environment, using a wand of rearrangement. In a hurry? Try a ride on a fast moving quasit! In need of a rest? Quaff a potion of sickness! Inside a shop you better take a look at the price tags before buying anything. It is bad manners to use a wand in a shop. It is not always a good idea to whistle for your dog. It might be a good idea to offer the unicorn a ruby. It seems you keep overlooking a sign reading "No trespassing"! It's all a matter of life and death, so beware of the undead. It's not safe to Save. Just below any trapdoor there may be another one. Just keep falling! Keep a clear mind: quaff clear potions. Keep your armours away from rust. Keep your weaponry away from acids. Kill a unicorn and you kill your luck. Latest news? Put newsgroup 'netUNX.indoor.hackers-scroll' in your .newsrc! Leprechauns hide their gold in a secret room. Liquor sellers do not drink; they hate to see you twice. Looking pale? Quaff a red potion! M.M.Vault cashiers teleport any amount of gold to the next local branch. Many monsters make a murdering mob. Money is the root of all evil. Money to invest? Take it to the local branch of the Magic Memory Vault! Monsters come from nowhere to hit you everywhere. Monsters sleep because you are boring, not because they ever get tired. Most monsters prefer minced meat. That's why they are hitting you! Most rumors are just as misleading as this one. Much ado Nothing Happens. Murder complaint? Mail to 'netnix!devil!gamble!freak!trap!lastwill!rip'. Never ask a shopkeeper for a price list. Never attack a guard. Never fight a monster: you might get killed. Never kick a sleeping dog. Never map the labyrinth. Never mind the monsters hitting you: they just replace the charwomen. Never ride a long worm. Never trust a random generator in magic fields. Never use your best weapon to engrave a curse. Never vomit on a door mat. No weapon is better than a crysknife. Not all rumors are as misleading as this one. Not even a spear will hit a Xorn. One has to leave shops before closing time. One level further down somebody is getting killed, right now. One wand of concentration equals eight scrolls of create monster. Only a wizard can use a magic whistle. Only david can find the zoo! Only real trappers escape traps. Only wizards are able to zap a wand. Opening a tin is difficult, especially when you are not so strong! Opening a tin is difficult, especially when you attempt this bare handed! Operation coded OVERKILL has started now. PLEASE ignore previous rumour. Plain nymphs are harmless. Playing billiards pays when you are in a shop. Pursue the monsters and you will be had indeed. Put on a ring of teleportation: it will take you away from onslaught. Reading Tolkien might help you. Reading Herbert will disgust you, but in one case it might be enlightening. Reading might change your vision. Reading might improve your scope. Relying on a dog might turn you in a dog addict. Savings do include amnesia. Scorpions often hide under tripe rations. Screw up your courage! You've screwed up everything else. Second Law of Hacking: first in, first out. Shopkeepers accept creditcards, as long as you pay cash. Snakes are often found under worthless objects. Some monsters can be tamed. I once saw a hacker with a tame Dragon! Speed Kills (The Doors) Spinach, carrot, and a melon - a meal fit for a nurse! Stay clear of the level of no return. Suddenly the dungeon will collapse ... Take a long worm from the rear, according to its mate it's a lot more fun. Teleportation lessens your orientation. The Jackal only eats bad food. The Leprechaun Gold Tru$t is no division of the Magic Memory Vault. The Leprechauns hide their treasure in a small hidden room. The air is positively magic in here. Better wear a negative armor. The best equipment for your work is, of course, the most expensive. The emptiness of a ghost is too heavy to bear. The longer the wand the better. The secret of wands of Nothing Happens: try again! The use of dynamite is dangerous. There are monsters of softening penetration. There are monsters of striking charity. There have been people like you in here; their ghosts seek revenge on you. There is a VIP-lounge on this level. Only first-class travellers admitted. There is a big treasure hidden in the zoo! There is a message concealed in each fortune cookie. There is a trap on this level! There is more magic in this cave than meets the eye. There is no business like throw business. There is no harm in praising a large dog. There seem to be monsters of touching benevolence. They say that a dagger hits. They say that a dog avoids traps. They say that a dog can be trained to fetch objects. They say that a dog never steps on a cursed object. They say that a spear will hit a Dragon. They say that a spear will hit a Xorn. They say that a spear will hit a neo-otyugh. (Do YOU know what that is?) They say that a spear will hit an ettin. They say that a two-handed sword misses. They say that a unicorn might bring you luck. They say that an elven cloak may be worn over your armor. They say that an elven cloak protects against magic. They say that dead lizards protect against a cockatrice. They say that killing a shopkeeper brings bad luck. They say that monsters never step on a scare monster scroll. They say that only david can find the zoo! They say that the use of dynamite is dangerous. They say that there is a big treasure hidden in the zoo! They say that there is a message concealed in each fortune cookie. They say that there is a trap on this level! They say that throwing food at a wild dog might tame him. They say that you cannot trust scrolls of rumour. They say that you need a key in order to open locked doors. Third Law of Hacking: the last blow counts most. This is the Leprechaun Law: every purse has a price. Throwing food at a wild dog might tame him. Tin openers are rare indeed. To hit or not to hit, that is the question. Travel fast, use some magic speed! Tripe on its own is revolting, but with onions it's delicious! Try hacking in the wee hours: you will have more room. Vampires hate garlic. Visitors are requested not to apply genocide to shopkeepers. WARNING from H.M. Govt: Quaffing may be dangerous to your health. Watch your steps on staircases. Wear armor, going naked seems to offend public decency in here. What do you think would be the use of a sword called "Orcrist" ? When a piercer drops in on you, you will be tempted to hit the ceiling! When in a shop, do as shopkeepers do. When punished, watch your steps on the stairs! Why would anybody in his sane mind engrave "Elbereth" ? You are heading for head-stone for sure. You are just the kind of bad food some monsters like to digest. You can always wear an elven cloak. You can't leave a shop through the back door: there ain't one! You cannot trust scrolls of rumour. You feel greedy and want more gold? Why don't you try digging? You feel like someone is pulling your leg. You may have a kick from kicking a little dog. You might cut yourself on a long sword. You need a key in order to open locked doors. You want to regain strength? Two levels ahead is a guesthouse! You offend Shai-Hulud by sheathing your crysknife without having drawn blood. You'll need a spear if you want to attack a Dragon. You've got to know how to put out a yellow light. Zapping a wand of Nothing Happens doesn't harm you a bit.
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/06/86)
Although this is not rightfully source, I am posting this and the next part with net.sources because the remainder of the hack stuff was sources. This part consists of the .info files and the utilities needed to put them onto the Amiga. To create a HACK system,: 1) Format a diskette labeled 'HACK_GAME' 2) Using the explode program, put all the files from this posting and part 13 (the hack executable) onto that disk 3) CD to the HACK_GAME disk 4) compile and link the atob program putting the executable program on the HACK_GAME disk 5) Run the commands in the 'setup' file (i.e. Execute setup). This will unpack all the icon images and create the files needed to run hack. 6) run atob converting Hack.z.b into Hack.z with atob <Hack.z.b >Hack.z 7) Uncompress the executable image with the compress program compress -d Hack At this point, you should have a running version of Hack. Other than lost characters, there shouldn't be much problems, but scream if something is amis due to lost stuff. --------cut here ------- cut here ------- cut here ------- #file Hack.info.b xbtoa Begin it)1kz!&"<g!)NY8!!WE*!!*'#T83IK95";*zzzz")Ir;z)*n6%s4[MR!"8i-zzz!!!!q!#tt?!!:I 0!rr<$zzzz#CldUz!!#7_!WE'!!!!!$a8c2=z"u(<%s8Duu!!!3W%j1iNz"u$)<s8Duu!!!8n?p&r< z"u,NOO8]+Z!!!3Wn,W"Xz"u2JF*^0Q(!!!!"p`BUXz^]P!"J9V%o!!%6G$t'&FzNrT/f*+/aH!!)Q I!+64Czr]C08N5,Dn!!*&>J0,;Pzs7l'`%);iC!!*'!*WQUVzs8V,p*+/aH!!%NKr-/2Az+92A%z!! !-$s7,"Iz!'gM_2uipY!!!!$s8RTLz!!#7Yzzz!!!!$J,fh)!!<3$!!@]OpjN8B!!!!$!<9h8rW*!! !!<3'p](9p!!!!$"u(N,!!*'"!!<^M&)[Eg!!!!$%WDIH!!*'"!!<c$?pB/B!!!!$&+K&nn,WLh!!< ^Nn,WFg!!!!$%WV7D+2IpW!!<X>p`BV6!!!!$^]XL!J:@P!!!E!$*+JsZ!!!!$Ig-bJ*+8gI!!<bi! 8ouu!!!!$!W2rfSA>1*!!<3cJ:AYl!!!!$!!i!W+2IpW!!<3$rW!tt!!!!$!!"+V*8pkt!!.TM"8Fj nz?iU1V!"8i-!!!u=!"\",z"2Fm;s*t(L!!!!]!!%6Dz!!C"AJ,fQLz5PP3Yz!!!!q!#tt?!!:Ob!r r<$zzzzzzzz!t50;!:Ttr?iU9;!8mmF!9!>H!LNjp!Or,;n,NKV!+5j&!+D5p!:Ttr!S@B\p](<`!+ 96&?t0TF!+5j&@.7V%$ig8-zzzzzzz%hAXBJ,fQ[#65X0J,t0#!#^^q!J,b%Nun?>QiI?r++]!2T8t &o$itkrLREZ1R=H0CJ/OcCJ/Oc*+--C4%bZ@C%fcS0zzzzzzzzzzzzzzzzzzzzzzzz!!!%S!&+Ct!& -),!.k1^!"8i=(]XQO!"],u!"]D9!(6eu!(6eu$ig98!"],5!"`Z@!!iQ90Ea'@"onW'!1XU.&=e=P zzzzzzz!!!7ZJ-!Fc!!e.,!5QAM5QCca^]4@"5QF<8J-8+;!WinJ5et^c#CldS^^NOt5QJU8!6d\28 45]G6pLrG!!WX<5R%Dmzzzzzzzzzzzzzzzzzzzzzzz!!iQ)!!*'" xbtoa End N 1247 4DF E 7E S CBDA R 9671A91B #file Tourist.info.b xbtoa Begin it)1kz!G2<B!&FTr!!WE*!!*'$^utb"_<:k!zzzz"De&>Wc.q<z!>5A4!!E9%zzz!!!!T!$2+A!!=j (!rr<$zzzzzzzzzzzzzzzJ,d:azJ,d:azJ,d:azzzzzzzzzzzzz!!!!@zzzzzzzzz"8Dlkz&,lP/z+ 9)<@z+9)<@z&,lP/z"8Dirzzzzzzzzzzzzzzzzzzzs8V!W!!!!"J,h8'!!!!"J,h8'!!!!"J,h8'!! !!"s8VQg!!!!"s8VQg!!!!"s8VQgzs8V!Wz!Up'hz&,lP/z&-2b2!!!&X+96pVJ,k*!s8W-!^];.]z ?i\OB"8Dop?i[tR*!ZKI?i\OB0EHb&?i[tR?i[tB?i\OB?i[tB?i[tR0EH\(?i\OB*!ZHD?i[tR"8D ir?i\OBz?iY]Vs8W-!^]4?7!!!!T!$2+A!!=u1!rr<$!!!!0s8W&u!!!"Ks8W,7!!!-$s8W,o!!!Q0 s8W,u!!#7`s8W-!J,k*!s8W-!^]8laJ,g\k^]=E6J,djphuNfVJ,djphuNfWJ,eF+huJ9,J,hh6^]8 lan,WLg^]6V!s8W-!J,g\ks8W-!!!!9(s8W,s!!!$!s8W,g!!!!@s8W+L!!!!$s8Vuszzzzzzz!!!# ozzzzzzzzzzzzzzzz!!!!0s8W&u!!!"Ks8W,7!!!-$i!9;W!!!Q0huEZS!!#4os8W"HJ,k%Js8W*@^ ]8c^s8W,V^]=?5J,hgkhuN`U^]2(+huN]TJ,hgkhuJ4Us8W,V^]8l!s8W-!^]6V!s8W-!J,g\kTE"r +!!!9(_>jF\!!!$!s6p-[!!!!@s8W+L!!!&[s8W!]J,k*!s8W-!^];.]z?i\OB"8Dop?i[tR+9)?E? i\OB5Q?<4?i[tRJ,d:a?i\OBJ,d:a?i[tR5Q?66?i\OB+9)<@?i[tR"8Dir?i\OBz?iY]Vs8W-!^]4 ?7!"VUd6VCcV@;TR:87?"Dz xbtoa End N 1097 449 E 5B S 13231 R D55A7C85 #file Knight.info.b xbtoa Begin it)1kz!Ib#7!&+Bp!!WE*!!*'$doZSOen>$`zzzz"De&>dr59ez!@e'L!&afWzzz!!!!Q!$;1B!!?[ i!rr<$zzzzzz&,lP/!!)nh!!!!$T)8Qg!"Am[!!!!<s8N'!!%7[T!!!!`z!;lfs!!!#gz!'gMazzzz zzzzzzzJ,b$!!!#7`zzzzzzzzzzzzzzzzzzz!!!Q/zp](9o!!@`O!!!!-z!#QgX!!!!AhuE`W!%.aH !!!#Sz!:Tsg!!!!az&,ZD-!!%NKJ,fQMs8V!W!!iQ(p](:)s8Vus!"],0qu?^-s8Vus!"],0qu?^-s 8Vus!"],0qu?^-s8Vus!"],0qu?^-s8Vus!"],0qu?^-s8Vus!"],0qu?^-s8Vus!!iKFp](9o!!!! Q!$;1B!!?`8!rr<$!!!!"+92BA!!)co!!!&_g].<S!PSa<!!*'!LB%;S!UsTL!!!!/)1V\e!!1*Tz3 T'l;!!!Gcz"(2*/!!!&Xz!'gMazzzzzJ,b$!!!#7`zz!!#7`z48/^T!!#7`zzzzzzzzzzzzzz!!+2B zp](9o!!!u=z"onW'qu?g!!!!&h!It.M!"K!Z!!!!"^d%l"!!"u$z$m5NM!!!*Dz!T3qX!!!!az&,Z D-!!%NKJ,fQOs8VQg!!iQ(p](:)s8Vus!"],0qu?^-J,jrs!"Y)0HiO-WJA?O4!"],0qu?^-s8Vus! "],0qu?^-s8Vus!"],0qu?^-s8Vus!"],0qu?^-s8Vus!!iKFp](9o!"VUd6VCcV@;TR:87?"Dz xbtoa End N 881 371 E 48 S A25E R FD54EEFE #file info_data.b xbtoa Begin FD,B0+DGm>@3B-&FEDV<Blb0m)?:-G/-'3uDffPB@psHZ xbtoa End N 35 23 E 44 S ADC R D6597638 #file .info.b xbtoa Begin o1T,s!!!C<!!!/)!!!9'87?"D$:\`BBQRg+$<1qdEbTT:$:A6FASkjn$<(nTCh[g(DeEd*F:(rTG%G 2,7q$7GEsbu_H=:i)$;58NB4uAo xbtoa End N 84 54 E E9 S 1BE5 R 61DF3A88 #file Wizard.info.b xbtoa Begin it)1kz!>GMK!'UB,!!WE*!!*'$^sE&_cH#tczzzz"De&>dmsH=z!5JR7!"&]+zzz!!!!_!$VCE!!?G m!rr<$zzzzzzzzzzzzzzzzzzzzzzzzzzz!!0k8z!!@`O!!!!)z!!!!-z!!!!=z!!!!Qzzzz^]4?7!! !!$J,fQL!!!!'z!!!!'z!!!!'z!!!$%J,fQL!!!*$^]4?7!!#7Yz!!"*kz!!"^gz!!#8lzzzzzzzzz zzzzzzzzzzzzzz!!!!"z!!!!"z!!!!$J,fQL!!!!(J,fQL!!!!(J,fQL!!!!0J,fQL!!!!0^]4?7!! !!8^]si>!!!!4i!o_e!!!!Di#D^s!!!!pn2LCJ!!!$!n8J@-!!!$!0]2p2!!!&tH,'C[!!!,sqg\YH !!!9"rr<$!!!!Q*rVuou!!")<HiO-H!!#.]49,?]!!#7hrVuou!!$DVrVuou!!(>0rr<$!!!'d+rr< $!!!*'!s*t(L!!%NKs*t(L!!!Q0rr<$!z!!!!_!$VCE!!?N:!rr<$z+92BAz0nMXjz%`2TYz"!Sj-! !!!]!:h8j?iU03!)kV5J,fQL^j-]7!"8nd3%7"@"7Q:TO/Wrsp&G'mIdmDI+8>g9"5sd:huE`W!$1V )z!!IfP)uos=!!1,a?iU0,!!@`O!!!!Az!!!!Yz!!!!]z!!!!Qzzzz^]4?7!!!!$J,fQL!!!!'z!!! !'z!!!!'z!!!$%J,fQL!!!*$^]4?7!!#7Yz!!"*kz!!"^gz!!#8lzzzzzzzz+92BAz0EM4Sz%KZV8z !s/HBz!5\`oz!(-d;z!+?'3!"8nd!$MaN"7Q:TJ0>a1p&G'mIK9FXz"5sd+z!$1P/!!"*k!!IfP)up *9!!!7J?iU3,z!!!"+^]si>!!!!hi!o_e!!!!di#D^s!!!!pn2LCJ!!!$!n8J@-!!!$!0]2p2!!!&t H,'C[!!!,sqg\YH!!!9"rr<$!!!!Q*rVuou!!")<HiO-H!!#.]49,?]!!#7hrVuou!!$DVrVuou!!( >0rr<$!!!'d+rr<$!!!*'!s*t(L!!%NKs*t(L!!!Q0rr<$!z!"VUd6VCcV@;TR:87?"Dz xbtoa End N 1225 4C9 E A7 S 9633 R A4B9A9A3 #file Fighter.info.b xbtoa Begin it)1kz!@n.;!%n7"!!WE*!!*'$9;hgl9gA[Yzzzz"De&=(#T&lz!7q2N!&srYzzz!!!!O!%7gK!!:X -!rr<$zzzzzzzzzzzzz!!D-Z!!!!(g].<S!"Z^B!!!!dGQ7^D!;J5J!!!'"z!Whcj!!!/thuE`W%E# s]!!"#=J,fQL55tT_!!%IszK7!Y!!!/"&!!!!$So=Z0!!g<t!!!!0s1eU7!#Qf.!!!!ZcN!qF!.4,6 !!!$!$ig8-!W70B!!!,;n,NFg#9Vk(!!!FW^]4?7)977-!!"thzJ,TEJ!!%NHzJ+s!D!!",1zzz!!! &Xz"8Dir!!!8nz&)[Ef!!"+V!!!#o5C`_6!.Y"K!!!!`rVuou!!FAD!!!!),Q%NA!,t='!!!#sKE(u P!WU4@!!!-$n,NFg#QOQ!!!!Q0n,NFg+917!!!#7`^]4?7J,b$!!!*'!!!!!"s8Duu!!E9!!!!!(s7 cQo!"],!!!!!@s53kW!'gM!!!!"Ks*t(L!<<'!!!!'"rVuou"989!!!!9(p](9o&-),!!!",@huE`W 5QAM!!!%NKJ,fQLs8N'!!!*&uzs82is!!%NDz+7K71z!!!!O!%7gK!!:`]!rr<$zz(OuJc!!#*rzIG b)*!!#4Pz+*[bc!!!PBz#MoF\!!!,iz!V_*E!!!#r^]4?7!.Ec*!!!!_n,NFg!$?Fc!!!!0]Dqp3!! h?\!!!!$mf3=f!!2hEzqnN13!!%H*z54AOP!!"*cz&%hlB!!!8\z"7H3i!!!&oJ,fQL!;jP3!!!"I^ ]4?7!'UA_zzzzzzzzzzzzzzzz!!"*kz-pRb4!!#D0zJe.n^!!#:jz+G9^p!!!Qsz#U'0J!!!-5J,fQ L!XM$k!!!$&+92BA!.ka^!!!!b#QOi)!$Hpp!!!!163$uc!!j_J!!!!%&:a`\!!3Ek!!!!""<[[E!! %T^z5mRGj!!"-pz&4-?s!!!9Jz";$(`!!!'+5QCca!<bX&!!!"N5JR7!!($)S!!!-$huE`W#QO8n!! !O^p](9o!!2utzrVuou!!%KKz5C`_6!!"&?zzzzz!"VUd6VCcV@;TR:87?"Dz xbtoa End N 1097 449 E C4 S AFEC R 17B8EB72 #file sgi.info.b xbtoa Begin o1T,s!!!C<!!!.`!!!>\G^'R4@<-X#ASc0oDI3`MDfp)7F*%aV@<Q4!@;ZENE+Nj"Des?)BleA'95\ HVBQOSnBkM+$ATA,VE+Nj"Des?)BleB)$><jXCLIQLDfp)7F*(gt@psOlD..<j$?KX!ARlor@;TRs5 mhgMH=:i)@1#YFBkM+$@0uu7 xbtoa End N 142 8E E C3 S 31F5 R 223382F0 #file Saved Games.info.b xbtoa Begin it)1kz!&FUG!(-`+!!WE*!!*'$`Xi+O`[Cfezzzz!c.i:z!!*'!s5*eV!'L;a<HnKDz!!!"J!(R(l! .k1Mz!WW4M!!?6fz!!9-=zz!*T@N!e:9l!!*'"!,)?4z!!!!d!#tt?!!?:^!rr<$zzzzzzzz"98E$s 8W(G!!!Q0s8W-!r;Q`s+92B@s8W#sJ,g\ks8W-!q>YsF5QCc`s8Voo!!#7`s8W-!q>#O@5QCc`s8Vo XJ,hh6rrE*!q4E0;5QC``s8VkDJ,fQLz!WRZM5QCc$s8VopJ,hh6s24m:q>YsF5QCb7s8VopJ,hh6s $Hbcq>YsF5QCb4s8VopJ,hh6rW%HJq>YsF5QC]^^]4-0J,hh6qnq=kq>YsF5QCWDhuENPJ,hh6qrcl :q>L?o5QC]^^]4-)!!#7`rW%HJq;;5Q5QCc`s8VnF!!#7`s8W-!p](9ozzzzzzz!!!9(s8W-!s8Duu *ic6?WiE,CJ,hH,<E3%+f.=];C9+qLlDgnj5QGq,<E3%!<_6[!l`-tbWiE6KhuM;7oi5!l<gMYDlDg kaWrB/)?i\gW<W?'!=(u%BlDglaWiE7uhuNfWs8W-!rfUXhlDgkuWiE3p?i\_W<IIkI=!Z](li4!aX 8hUn?i\_W<W,ot<_6[!lDgkbWiE75huM;7p&EQB<g$hjlMdd`DsFJu?i\_W<'3$<="N80lDgp&.]TY W?i\_W<#@Jm<_IrCli*maC9"Ha!!(PL<WCU!esHF;lDgkaWiE40!!(PL<EK4N=+C8Ns8W-!s8W&uz! !!!d!#tt?!!?A;!rr<$zzz!<<*!s8W,F!!!-$s8W-!s$)#6#QOf(s8W(JJ,fQLz!.TM!z!!!!0J,fQ Lz!!.TMzzzz!!.TMz!!!!(J,fQLz!$?^kz!!!"KJ,fQLz!WRZM5QCc$s8VopJ,hh6s24m:q>YsF5QC b6s8VopJ,hh6s$M;9q>YsF5QCb5^]4-0J,hh6rWiK'q>YsF5QCQKs8VopJ,hh6p\u?8q>YsF5QBoeh uENPJ,hh6pRe)Xq>L?o5QCM-J,f?>!!#7`s+14Mq;;5Q5QCc`s8VnF!!#7`s8W-!p](9ozz!!!$!s8 W-!s8N'!"0/B$Wit]u^]4gneQ#UL<TN'<)QKh;WiE+_?iV;Ks8W-!s2eXK)uoss!!!"@huEk0!&afW !"NB:!,qoX!!!!"huEaAs8W-!s8LpV!:$SaWiE)1?iUF3<E3%!<G>h@3i]3[WiE7uhuJ9,s8W-!rfU XhlDgkuWiE3p?i\_W<IIkI=!Z](li4!bX8hUn?i\_W<W(BI<_6[!lDgkalDh$uhuM;7p&.lj<g$hjl MdpsYNi8`?i\_W=9/"o="N80lDh?R.]TYW?i\_W=C?8O<_IrCli+)=WiE6L!!(PL<I\"uesHF;lDgk aWiE40!!(PL<EK4N=+C8Ns8W-!s8W&uz xbtoa End N 1294 50E E 1C S 24A86 R 12D14CB5 #file Speliologist.info.b xbtoa Begin it)1kz!5SY.!([),!!WE*!!*'$X!drLYQ+Y'zzzz"De&>9>CN-z!,V]9!'gMazzz!!!!i!#P\;!!=? W!rr<$zzzzzz5Q1W_z!!E9$^]4?7!!!!@s8Vioz!'gLErdTFu!!!"Ks2"_"J,fQL!<<$3s.=fA!!!' "iVEN"J,fQL"9'D?s3H2q!!!9(s8N&Vz#QOi(s6p!g!!!Q0s8W,oz+92B@s82is!!#7`s8W,uzzzzz zzzzzzzzzzzzzzzzzzzzz!!%NKz!!!!(^]D4Nz!'C5]49,?]!!!",!!!9(huE`W!5JSR!J"PX!!!%M !'UCu?iU0,!rrAg!+917!!!3'*X2Tu?iU0,$j#8g!&.d\!!!i9!!*'AhuE`W(]XO9!"8i-!!"\Q!!! !'z?iU0,!!<3$!!'e7!!!!"J,fQLs8W-!s8RTLz#Nrl&z!!!8e^]4?7z#Nrl&z!!!,aJ,fQLz!TsF_ z!!!#fzz!.FnJz!!!!Yzz!!!!i!#P\;!!=E9!rr<$zz!!.TMz!!!!/z5Q1W_!-f%T!!E9$^]4Fen,N G1s8Vio%'0F/!'gLErdTt/*WQ1is2"_"K@\r\!<<$3s.=lBJ,fWMiVEN"JO"Ya"9'D?s3HJf!!!9(s 8N&V!Nc%r#QOi(s6p"ENrT^js8W,o!"88r+92B@s82ishuH"As8W,uzzzzzzzzzzzzzzzzzzzzzzzz zz!!%NKz!!!!(^]D4N!!!Q1!'C5]49,?^n,NGr!!!9(i2cnY!5JSR!J"e_!!!%M!'UCu?iU0,!rrAg !+978J,fcR*X2Tu?iYWU$j#8g!&/'$!!!i9!!*'Ai%+j.(]XO9!"8i0J,h8'!!!!'!!)Kg?iU0,!!< 3$!!'e7!!!!"J,fQLs8W-!s8RTLz#Nrl&z!!!8e^]4?7z#Nrl&z!!!,aJ,fQLz!TsF_z!!!#fzz!.F nJz!!!!Yzz!"VUd6VCcV@;TR:87?"Dz xbtoa End N 1097 449 E E S CF70 R 7F2A57C9 #file Caveman.info.b xbtoa Begin it)1kz!4W"N!)*A6!!WE*!!*'$YS[?A^pj@Ezzzz"De&>:VZr1z!+Z'0!#,D5zzz!!!!m!$2+A!!=J p!rr<$zzzzzz!!!!"J,fQLz!WW3#z!!!-%zz"opmgzz5QCca!!!!a!()29z!(-_dz!!!!'#QOi)z"9 AK&zzzz_8$$Nz!"8i-zzzz!"],1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!"K^]4?7z"97 ijz!!",@qu?]szJ,fKJz!!E9$rr<$!!!!!@s8W*!z!<<*!rr<$!!!!-$s8W&uz+92B@qu?]s!!%NKs 8Vio!!!!"s8W,uz!"],0s1eU7!!!"Ks8Vusz"98E#z!!!9(rVuouz5Q?66z!!%NDzzs1eU7z!!%6Dz zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!m!$2+A!!=Qu!rr<$zzzzzzzzzzzzzzzzzzzzzzzzzz!!! !"!<<*"z!!E9%z!!E9+z!!!!1&-)\1!&+BQ!<?L-!'gP"z+9Dh!!rr<*0L,V'!WWW/!$D8Lz0E;(Qz !!'e7z!!#7dz!!!Q0s82is!!!'"n-i%lz*WQ0o6,3I#z!5K^:z!!!6(+9qlHz"99PEhuE`W!!!-%+9 3A]z"99PEz!!!-%+92BAz$ig8-zzzzzzzzzzzzzzzzzzzzzzs*t(Lz!.Y%<z!!#7`s82is!!!!$s8W ,sz#QOi(s8Duu!!3-"s8W,u!!!!_s8W-!s8Duu"98E$s8W,u!!%NKs8W-!s7cQos8W-!s8W,g!!%BG q#2B1IGb)*zzzzzzzzzzzzzzzzzzzzzzzzzzzz!"VUd6VCcV@;TR:87?"Dz xbtoa End N 1337 539 E 97 S 914B R 921EBF54 #file setup makedir "Saved Games" atob <.info.b >.info atob <Fighter.info.b >Fighter.info atob <Caveman.info.b >Caveman.info atob <Knight.info.b >Knight.info atob <Tourist.info.b >Tourist.info atob <Speliologist.info.b >Speliologist.info atob <Wizard.info.b >Wizard.info atob <info_data.b >Wizard copy Wizard Fighter copy Wizard Speliologist copy Wizard Tourist copy Wizard Knight copy Wizard Caveman atob <Hack.info.b >Hack.info atob <"Saved Games.info.b" >"Saved Games.info" atob <sgi.info.b >"Saved Games/.info" echo >record echo >perm #file compress.b xbtoa Begin !!!,mz!!!"5z!!!"4!!!"3!!!!5!!!1=!!!"i!!$`=!!!!,zzz!!!!"zz!!!!bzz!!!!"z!!!!;zzz !!!!"z!!!#)zz!!!!tzz!!!!@zz!!!!Azzz!!!!"z!!!%M!!!!%z!!!#szz!!!"'z!!!!$!!!"mzz! !!!Qzz!!!!Izz!!!!,zz!!!!Czz!!!!1zz!!!!;zz!!!!*zzz!!!!"!!!!?!!!!'zzzz!!!"D!!!"# z!!!!B!!!'A!!!!&zz!!!!%z!!!!'!!!!2!!!!-!!!!2!!!!%zz!!!!W!!!#\!!!!I!!!!"zz!!!!Z !!!!8z!!!,c!!!"3,JX9Z!&u4E!!!!]8EYI$/9q3q!!FOl!!!!E,L6>i!&R$Q!!!!QPK?S&rn8bc8u r#oB)hp\@/p='6DmSh!!!!Q=H=Ri+D:bVdE'_V,%prfe&g(\+?9E%!'#!!&fK&I;Lh)H;Leg6s8JY+ <IdD[!!"-%!!!!Y+F*qe!'DM,;h3AK+0Y_F+95>l;98e2+1qRr+95>l+0cpg+959]s7dd60*tCazDu a9P@/p;U@/p;?,JX9Z!&-&+,X<J%!$l1g/9q3q!%8sT+t*Ek:9OVK+t<R8B,i0Z!!!,g:9OWV,JX9Z !'k0(jbP$E.;/\e!2N/2z::U?)!!$s<?j%T*!!FqT::U?)!45A/!!!!QB.P5e!!!!AB*:u4s4eeY!! !!aB*:u4s4f/N!!!!%:9OVE,'a.g!&.0Nre;O;/pREs!&RC,Ist.88EU!X/j'+9J-RWM!!H'"s--47 @"<3,@%9OL!*i:%rd[<$!*i:%resTp6hp]^!(9Sbrb*Ol!!!!IB>RDd!!!,f!!!!4!!!!"!!!%a!!! %W!!!$t!!!$h!!!$R!!!$F!!!$>!!!$"!!!#e!!!#E!!!#5!!!"J!!!"D!!!"&!!!!E!!!!?!!!!9! !!!)!!!!#!!!!"!!!"3!!!!a!!!!"!!!!M!!!$8!!!!#!!!!q!!!##!!!$(z!!!,l!!!,d!!!!5zzz z!!!-%zzzzzzzzzzzzA8cNACh[@!@<-Vn!!!,l!!!,c!!!1=89k18!)c@5!!!!Q::U?)!!#iV:3B<4 s,9M3!<=`)!!koos83uE+p[4\0*+hYz=H=Ri_2&.Xs8Kij6BH.>0*!26!":Lm/P,o+/P,o'@/poC:l d1ns,9R#B*M8:s,:=k+Dq/f/PuJ+89k18!2qP's,9^`z:le5!AdWJX,JX9Z!2O!J89k18!4+=2s,9^ `z:le5!Ae&b\,JX9Z!2LjT!!!"T;hnJX!";JTDZBg,,&RAh+Ai[]$ig8ZAcMjJ,&RAh+Al$m,)Ai&B )hsO&.hB_8AK7B"G$OQ!!m??!>;WK(^OaC:AYk4!!!"=?iU3!!!!"/?iU2b!!!".?iU1U!!!!d?iU1 C!!!":?iU1/!!!!g?iU0l!!!"2?iU0d!!!"0?iU0P!!!"B?iU0>!!!""?iU0.@/pt\?i^4U6Fd'r!/ t:cs)`2\,JX9Z!2O!&s(H?P,JX9Z!2(o/s867)s&a4@,JX9Z!/+_[s%Gbi!!!"\?i^3n,&RAh+Al$m ,)Ai&Ai<SC+9tMhB*qat/P,pN8s*^289k18!4YRF!!!!Q::U?)!!#iV@0$9fDuhTl::U?)!!$,^+Dq /f0+^mhz=H=]B!!!!_?t=3W,JX9Z!/P"_rnMGn,JX9Z!/t:crm2j,!"9uI&.hB_8AHkY89k18!6IcW !!!!Q::U?)!!#g`!"<99rRc&i0*"bXz=H?hirg4gG!":&hs,\Fd=K_[c+E%4@6BG-$=KVW4?i^1:%( Q?<!!rW*!'Y3)E![c)!!!!_%(Q?<!"Ju/!'Y<,E"4,.!!!!_+?9E%!'YE(iLqL4!!!!c+E%4D8s!Zc "G/3rs,\@@s,]j7B)i,UDu_,u!!!!o9"=p%!2O6-!Ve;Z::U?)!!$,^,&[FB+ApP%<JX1k!!!#U0*k =`z:le5!B.b<Es,\lF88eHp::U?)!!#iV89k18!9$Ids-QQlz:ldp1s-P!Js,\F\89k18!!#Q8!!!# [+E%4@0+^mh!!!!s:[\8l8q:Lb+E%4@0+_Ol&iNjQ?iU;Y9"=p%!/+qa!B;2^!!!!%;h-+.!!!!%8q :[iDu_#+z&.haMz?k,_Qz::U?)!!$,^EW?_4z!eC=O!<99SAjdb%!!!!%;h-+.!!!!%8q:[iDu_#+z &.haMz?k,_Qz::U?)!!$,^EW?_4!!!!"!eC=O!<99SB-8=7s,\lF89k18!9Qgt!!!!Q::U?)!!#g`! "<68"!SjJ!!!!%;h-+.!!!!%8q:[iDu_#+z&.haMz?k,_Qz::U?)!!$,^,JX9Z!'UI7!!!"L,JX9Z! 0A<`!!!!_!e:7N!$<H$!!!!_EWP-m,Ja?[!(%*E!!!!/D^KK70**^++E%4@0+^["!!!$&89k18!&.0 Yz:[\8t?iU7m+E%4@0+^["!!/rX::U?)!!#iV+E%4@0+^mhz=H=RidJNtFVDpmR?iU4d+E%4@0+^mh z=H=YDs,\@#dD/b<89k18!BMk>::U?)!!#iV8q:Lr+E%4@0+^["!!!$_89k18!&.0Yz:[\8l?iU6F8 9k18!!#Q8!!!%2+E%4@0+^mh!!!!s:[\8l8q:Lb+E%4@0+_Ol&5$&c?iU5k+E%4@0+_Ol&1gqE,JX9 [VD][s!!#Jo!!!!g%"J<X&--MT,Q%NA'8lhj!(L@&%(Q?<+92BBVD`6!,Q%NA,:NTm!(L?c%(Q?<5Q CcbVD`6!,Q%NA7U5uo!(L?K%(Q?<J,fQMVD`6!,Q%NA7U5uo!(L?3%(Q?<\!R-rVD`5t,Q%NA7U5uo !(J)Ks,\lF89k19VE.J_z:lfQK0*"Og!!/rX@/p^d:ld1ns,9R#B*M8:s,:=k/URO!VE4a90/!9`:: U?)!!$,^%"J<X!"<ce0/!9`89k18!G=rK!!!!Q::U?)!!#g`!"<68!:EC'!!!%Y89k19VE.J_z:le5 Z!!!"TAlM<H!!!!989k18!KTcs!!/rX::U?)!)cV]!";JMAe7LY!!/rX@/pf@=H?hi!2<)r!!!"XAf Mq2s,\lF89k18!Kfou!!!!Q::U?)!!#g`!";K1!!!"pAd2ZD!]XQj@/pQQ9"=p%!/P5r89k19VE,i; s,\lF@/p]/:lc$q!!!!"!!!!oB*_,?!!!"XAiq1r!!!!Y;h-+.!!!!Y8q:[m+F*qe!&.<]!!!!QE!d /,EW?^`?kc.W!!!!QE!e5u::U?)!?b4"+ok`Js,^Ugqh@_R!!!"pAl)n9!OPJ0!!!"XAcMjr+?9E%! '!o-,JX9Z!'!T$CD\1>!!!!Q;Rlc-!&/@!&:ed$&eJFN!GY/N!!!!QE!e5u::U?)!?b4"+ol!N!E)P #!!!"PAcMj"+?9E%!!H5N,JX9Z!!GoECD(Rd+F*qe!!!QA;Rlc-!!$C:89k18!!#d)z=H@J&&ifpl! !!(O!!!$!Y^pCS+?9E%!!H5N,JX9Z!!GoECD(Rd+F*qe!!!QA;Rlc-!!$C:89k18!!#d)z=H@J&&if pl!!*.P!!!$!Y^pF089k18!L?9%!!!!Q::U?)!!#iVDuhTl::U?)!!$,^+?9E%!!H5N,JX9Z!!GoEC D(Rd+F*qe!!!QA;Rlc-!!$C:89k18!!#d)z=H=]B!!!!_!e:7N!.Z<0!!!"\+?9E%!'UI7!!!!@,JX 9Z!'YE(iLqL4!!!!c,Q%NBL7eMIVD\j5!!!!/D^]W90**^+89k18!OkUF!!!!Q::U?)!!#g`!"a)M0 *"bXz=H?kj"p-G<!!!!o::U?)!!$,^9]#i#:0p\<:0.DU8EUK`HiQdL!!!"PAcMi%+?9E%!$G3j,JX 9Z!$FmaCDn=@!!!!9;Rlc-!#Q8-z&:ed$&eJFhDu^G0z89k18!#R?h::U?)!?b4"+oi`G!!!!A;h-+ .!!!!A8q:[q+F*qe!#SVE!!!!9&30^j!!*X]EW?^`?lEta&30^j!!,W9!!!!90*"bX!!!$B:lce#+? 9E%!$G3j,JX9Z!$FmaCEOaF!!!!9;Rlc-!#Qh=!!!!_J@PX[!0@bBEW?^`?m6^R!!!!_J@PX[!0Ba% 8AIcA!!!!90*"bX!!!$B:lce#&30^j!%8*Q!!R!<@/pS=Duan\,Ja?\VPYTR!!!&l,JX9Z!0e_D!!! "dEWIE$!!!&h,Q%NA-P-7X!1\'9,Ja?[!!%*Aj.]J(,JjE\!!FO^!!/sk9"=p%!0Ch!+?TW(!<HR4+ ?TW(!<=@[!!!!k+?9E%!!H5N,JX9Z!!GoECD(Rd+F*qe!!!QA;Rlc-!!$C:89k18!!#d)z=H=j16E^ @L/i`n3!(IBP!!*'"C^O(Cs5Y:-j+h%1E!VQ.s5Y@a!!!!g0**Xis5Yats6*kk#o6X(+?9E%!!H5N, JX9Z!!GoECD(Rd+F*qe!!!QA;Rlc-!!$C:89k18!!#d)z=H=p3%#+`]s8Q^3!?P.L!!!&h+?9E%!'V S1,R*/$e:]FU+>3]T,R*/$\Ul@6+9j(qjanUAdJNtE!!jh]["i6-,R3:\+@=KR!!*sbGQ9]7?i^4Q+ 9j"ojaeO?dJNtE!!l2YCKM]3s6,Q!/O9@&8qpp^DuhOUs6Q8Ys6OP)gog\@+9j"ojaeO?dJNtE!!jb [ZA3$++pR(Y+@4EQ!!*sbGQ9]7?i^3N+9j"ojaeO?dJNtE!!l2YDS.V*@/p;_=H?@j!!!&l-j:_R!! !!kYdj`6!((KM+pK:sj+8C?dJNtF)14,g;Rlc-!(n@<ja\I=dJNtE!!j^&?i^2K+?9E%!V!>(!!!"h D#jRH9"=p%!0Cgnriff2#8CPGrhqIQ@<>V4;Rlc-!VC@20*#Em=H?(b!!!"TAj/ht!!!"XAi<2*!!! &p89k18!&.0Yz:lc_Z!!!&hOLY>lVPZ",!!!&h0*"Og!!!!Q@/pQ':[\8l+?9E&VP^T.!!!&hD[::` ,JX9Z!)?5F!:W`i:3B<4s7AkF!sC5:!!/sk/3*\1!!#[f!!/ss9!/."CB+C8+9s(qk(2:'!f$aU!!a W:dJNtE!Y5hW8:X7HEW?^`^k![7,VB'&j.[Y^dJNtE!X<fJ((eE:J:\\i;N5W$OF`pP,VB'&i1_ei! !j!f!!!!)D%%>7;N9Ud;2-Yh!!l2OB*KJ2!!jKn+?9E%!!"3'!!/skdX^M2,Ja?\VP:AHAn4R1!!/s s/3*\1!!(ic!!/so+?9E%!$G3j,JX9Z!$FmaCD\1>!!!!9;Rlc-!#Q7^&:dZ<EW?^`?lBRk8:X7H;N 44m!!!!90*"bX!!!$B:lce#;hcD!8q:N\6Fd'sVP51n!!!!kYdj`6!!I0H9"=p%!0hC%!?+S@!!/sk D`C:5!!!!900'"4!!$s=0*"Og!!/ss::U?)!!#g`!"cBFzB*;WC"LoR7zdCB5XVP\;4,JX9[VP6\n! !!"`B-)!u,JX9Z!!%$?iLs2$,Ja?[!!GX!!!!"`?iU2.+?9E%!!#oI,JX9Z!!'76!!!!_Ae$']!!!! c!!!!%?iU1_+?9E%!!%$?iLs2$,Ja?[!!H\M9"=p&VP7u[+?9E&VP7CIEX5FNz89k18!#R?hEWIfo8 9k19VQ*D%z:[\8p+?9E&VP7CIEX5FNzdCB5XVPZ\j!!/sk89k18!#T\T0*"bX!!!$B:lc/J!!!!I#Q Oi.B*;WC"4U$%+M^`Y:3B<4s6N;>%g6hX,JX9Z!!%$?iLs2$,Ja?[!!Fi8!!!$!8qq+&+9j"oj+/== dJNtF)14bI62:K\!!puf&:d]6@,=Md!!!"\B*]VB!!!$#?j7`9!!!$",JX9Z!(pZ"!S/_#/d2Z;s8W -!AdD)f+Ri-4:3@[>!!!!A;h-+.!!!!A8q:[m+F*qe!#SVE!!!!9+9rI.EW?^`?l1!k8:X7H89k18! #R?h::U?)!?b4"+oi07!!!!I#QOi.B*;WC!sCpc!!!!)d/6-/.S*tJ!FdS[%#4f^s8R!;!A"Y6!!!$ "Ak5P)!!!"\B0\"1!!!$!8qq*q+9j"oj+/==dJNtF)14bI;he]DDuh3!!!!"`,Q%NA!<<*"!(pZ"!> 6p`%#4f^s8Q^3!8Jt,]X\"B!(q)6+9rg8;N342%#+`^!<?sZ62:K\!!pul)N[jV+9j"oj+/==dJNtF )16f34:koQ+AGan6hp]^!!q&nIK1E$+9rI.+?9E%!$G3j,JX9Z!$FmaCD\1>!!!!9;Rlc-!#SXo&/> b,EW?^`?l2h%Du^Fa89k18!#R?h::U?)!?b4"+ojq)!!!!)d/6-/]?"Hc/3*\1!(so7!!!!cCa^D1+ pR(Y+@4EQ!!*sb+pBZO62:K\!!puf,R4m4-3dA#,JsK]!(n^D?i^2I89k18!#T\T0*"bX!!!$B:lc/ J!!!!I#QOi.B*;WC!Luj@+Ri-4:3B<4s6rSB#6[]q!!/t,9"=p%!0h@B+?9E%!Z8/P!!!'?C_.^L!! !!kYdj`6!!I3?!4X.3!!!!kYdj`6!!I3s+?9E%!!#oI,JX9Z!!'76!!!!_Adfp[!!!!c!!!!%?kOSB zEWP-m;h610!!!!%9"=p%!0hC?E![c)zEWP-m;h610!!!!%6Fd'r!0g$"z00'"4!!$s=0*"Og!!/t, ::U?)!!#g`!"^Bj!!!'?8q:ddE;rVh+Q-"$:3An6!!!';+?9E%!Z^BR+uoW'!!#rKOF\Xl!!!'?/3* \1!Z3CIz+9j"ok(2:'!ep[T!!dHC&/A*&+pR&*/c]hrOF`jN/-$*4!!!!)D%LXd&/A*&+pR)#Ndsr\ ;2$,]dJNtE!Y95M&/B3c&eMj0+pR)#J;5`W+?9E%!!(EW!!!';+9tTt+Q-"$:3B<4s85FN!<ali!!j Vu!"VE!s85J(B+>IfYQnbC/PZ9C;N5)P+>3]l9]$tC:0p\<89k19VE/,c!npb;89k19VE.J_!!!-!= H@D%0*"bXz=H?4":0%>p:0p\<89k19VE.J_!!!-!=H@D%0*"bXz=H?4"%(Q?<!!*'"!2O3@89k18![ ($Z!!!!Q::U?)!!#iV89k19VE.J_!!!-!=H@D%0*"bXz=H?4":0.Dm8EU!R+?9E%!Up;D!!"AX,JX9 Z!1XJ.!.Y%K!!!&hD^Z_g!!/soi.*E[8r%!a/j+X`s8QIT+?9E%!Uq9<::U?)!!"VO?kskF!!!&hiI E+4!!/so::U?)!!"VO^:=4D!17[1,KBca!17.H6Fd'r!15E"!!!!g@456=,Q%NA!<E0#!(q22,JX9Z !0f-!!!!$"@0$)H=H?/5!.[gN:3B<4s7AkF#6ZY3!!j\P+p[4\+@4EQ!!!!).S+mc+pS7%!!!!1/-. 7is1g-Rs26EVs2Z]Zs3)u^s3N8bs3rPfs4Ahjs4f+ns55Crs5Y\!s6(t%s6M7)s6qO-s7@g1s7e*5s 88>`!'g[A!!!!1CpXD$!!!!18qq6i=cFnb;he]P9]$uN:0p\<:0.Di8EU!R+>*X&%"J<[7bho/+>*X *,!5i*-P0%`z00fL?+>*X&+tip!::U?)!!"VO?lU:A!":&6!!"AX::U?)!!"2q!"_o9z/c\M!C,@&N !!j\q!!lMR+[?#58q:[e,#D1!E%M]QEW?^a?kP+F!!mNq0*"bX!!!$B:lce#7#)liEb%qUz00fL?+9 upt::U?)!!"YQ0/!;289k18!]r%f!!l?1z:[\8p9]#i#:0p\<89k18!!>c;!!!'h89k18!&.0Yz:[\ 8l89k18!_Gq.!!!!Q::U?)!!#iVE"4N$89k18!`MX8!!!!Q::U?)!!#g`!";VF:0%>p+?TW)L7h:J: 3B<4!!#Wo!!m3[+Dq/b8e>VP0*k*o!!!(,89k18!&.0Yz:[\8l89k18!b4cH!!!!Q::U?)!!#iV:0p \<!!!,f!!!"i!!!!$!!!b&!!!ae!!!a+!!!`h!!!`R!!!`L!!!`0!!!\0!!!\(!!![o!!![i!!![a! !![Y!!![C!!![1!!!Zh!!!Z^!!!ZR!!!Yo!!!Yg!!!X*!!!Wa!!!Vn!!!Vh!!!VV!!!VP!!!V<!!!U k!!!UO!!!U1!!!U)!!!Tb!!!TR!!!TJ!!!TD!!!T<!!!SM!!!S#!!!Rr!!!Q+!!!Ph!!!P^!!!P6!! !NN!!!N8!!!KW!!!KO!!!K7!!!Jp!!!Is!!!Ie!!!GQ!!!G5!!!FJ!!!F@!!!F$!!!Em!!!EY!!!EQ !!!EI!!!E;!!!E#!!!Dn!!!Dh!!!DP!!!D8!!!D2!!!D*!!!As!!!Am!!!@n!!!@P!!!?g!!!?Q!!! ?1!!!?'!!!>t!!!>n!!!>h!!!>2!!!>,!!!=s!!!=m!!!=7!!!='!!!<F!!!<6!!!;c!!!;C!!!:r! !!:T!!!:J!!!:>!!!:8!!!:,!!!9/!!!8t!!!80!!!7G!!!6P!!!6D!!!5M!!!5E!!!5'!!!4j!!!4 T!!!4F!!!3q!!!3c!!!3O!!!35!!!22!!!1o!!!1W!!!1?!!!1'!!!0j!!!0*!!!/_!!!/E!!!.8!! !-s!!!-i!!!-]!!!-W!!!-K!!!,T!!!,>!!!+O!!!*f!!!*<!!!)o!!!)I!!!)+!!!)%!!!(Z!!!(P !!!(J!!!(@!!!(6!!!(,!!!'5!!!&r!!!&f!!!&\!!!&*!!!%U!!!%K!!!%;!!!%/!!!%#!!!#'!!! #!!!!"^!!!"V!!!">!!!!#!!!"*!!!!%!!!\^!!![K!!!Zp!!!Z.!!!YG!!!Y#!!!Xl!!!X$!!!Vt! !!V^!!!V,!!!V"!!!Ue!!!UY!!!UI!!!U=!!!U5!!!U#!!!Tp!!!Th!!!TX!!!T6!!!S=!!!S3!!!R d!!!Qg!!!QW!!!QC!!!PP!!!Og!!!N*!!!N"!!!M_!!!MS!!!Ln!!!Lh!!!LX!!!LH!!!L,!!!L$!! !Kq!!!Ke!!!K[!!!KI!!!KA!!!K1!!!K%!!!Jj!!!Jb!!!J\!!!JP!!!J@!!!J6!!!J(!!!Ik!!!I_ !!!Hb!!!H\!!!HV!!!HL!!!HB!!!H<!!!Fl!!!Ff!!!F`!!!F:!!!Es!!!D\!!!DH!!!Cm!!!CW!!! CE!!!Bj!!!BT!!!BB!!!?K!!!?E!!!?9!!!>b!!!:^!!!5/!!!46!!!4"!!!3U!!!2j!!!2P!!!2>! !!2&!!!1c!!!1K!!!13!!!0`!!!/!!!!.X!!!":!!!!p!!!!)!!!&0!!!';!!!*6!!!*p!!!+#!!!+ /!!!+7!!!+?!!!+_!!!+g!!!+s!!!,&!!!,.!!!,Z!!!,n!!!-!!!!--!!!-5!!!-=!!!.>!!!/e!! !0$!!!3;!!!3k!!!4Z!!!5U!!!5]!!!5g!!!5m!!!6(!!!6Z!!!6b!!!6l!!!6r!!!7/!!!7Q!!!7Y !!!7e!!!7m!!!7u!!!8@!!!8H!!!8T!!!8\!!!8d!!!95!!!9O!!!9W!!!9c!!!9k!!!9s!!!;#!!! ;m!!!;u!!!<*!!!<0!!!<L!!!<^!!!<f!!!<p!!!=!!!!==!!!=O!!!=W!!!=a!!!=g!!!><!!!>N! !!?m!!!?u!!!@,!!!@4!!!@<!!!A/!!!A7!!!AC!!!AK!!!AS!!!E_!!!F,!!!Hh!!!Hp!!!I%!!!I +!!!IE!!!J0!!!L<!!!Lt!!!M1!!!Nl!!!Nt!!!O)!!!O/!!!OE!!!OW!!!R"!!!R*!!!R4!!!R:!! !RR!!!SY!!!Sk!!!Uq!!!Yu!!!`X!!!`n!!!a1!!!ak!!!b,!!!!3!!!!;!!!!/!!!&6!!!'A!!!,` !!!.D!!!/k!!!3A!!!4`!!!9;!!!;)!!!Ee!!!Z&!!!`:!!!`^!!!`t!!!a7!!!aq!!!b2!!!!"!!! !S!!!!Q!!!!%!!!!_!!!"H!!!"h!!!)Q!!!/M!!!!)!!!!2!!!&F!!!'S!!!9G!!!;7!!!;I!!!Y5! !!YY!!!Z@!!!!"!!!!&!!!&T!!!!%!!!!e!!!)7!!!.l!!!/3!!!3!!!!!$!!!!b!!!)g!!!.^!!!2 D!!!!#!!!!\!!!*$!!!3[!!!!$!!!!8!!!*H!!!06!!!4(!!!!4!!!!J!!!+E!!!,4!!!-C!!!8&!! !8j!!!:$!!!@B!!!AY!!!62!!!79!!!<T!!!=E!!!>D!!!IM!!!M)!!!OM!!!RZ!!!Sc!!!_[!!!!# !!!!A!!!JF!!!LN!!!!*!!!"&!!!L6!!!Lb!!![9!!![Q!!!^L!!!^^!!!_'!!!_k!!!`$!!!!"!!! !>!!!V2!!!!$!!!!G!!!Y)!!!YM!!!Z4!!!!"!!!"(!!!^rz!!!,l!!!,d!!!"i+.WBW87c4?ATBgS @rH4'Eb0<5/n6GU+>b])+?2530K1X@0H`)*3]/TP0JFVaDe1%hASbpdF(HI>z!"Ju/5QCca7U5uoz! !$#?@:s.4+Cf>,E,oN2F!+[=A7g!p<a?hP/Rfi>@<c6qFE:_1>@qScAKWTX/mSeazz!!!!"!!!"Lzz !!"AXzzF`(]-D/aN,F)q>-@psHZ9keZiBl7Q+D..ZuBlnD'!**oPDJs`:+D,FuB0%._-"A;a+94#t! %qFTEW@D,3Zr<YF<G:8+Cf>,E,oN2F(Jl)AoD^,@<;hV-$)*i@rH4'Eb0<5ARlp-Bln#2-"J--BlnD I+Ceht+E).6Gp$d/DIdQp+=1P@@VKq*$32\^!$u\I+CT),ART+p+D>2)+>-h?F*2),Bm:aP/KeqL+C f(nDJ*Mf!-/&cF#kFUBl%?u@;TQuFDl(?Ci=3(+EVNEFCAZp+E)-?/m8S^/m87!!$u\I+96J)A8,pB +Du+>+DG^9@rH4'Eb0<5ARloqDfT]'F:&"hFC]*'3ZqpND/aN,F)to'+EqOABHSU3+C]&,F"AGD@;[ 3+DJXS@BOPdhCh4_8A0>>qFE7ch!!!!"z6Z6g\Eb0<5Bl@lM+9;H@r:od>^jlCb!<WQ;+$Y8TzzF`( ]-D/aN,F)sAb@rHC.F`;FFBl7m4F:&!oA1f/^11V[W!$u[n!)IQUBl@m13ZnDh8Q8V24Wl%]$32An3 ZnDbF`(u4Dg-(AATDg0E]sg1!!!,l!!!,e!!$`=!!!,l!!!,l!!!,c!!!!,:0.Dm0.m51::U?)!!$, ^88eJ*0*!Rh!!l?1z:lc_Os85Vu:3?O:!!!,f!!!!"!!!!Y!!!!+!!!!"!!!!V!!!!=z!!!,l!!!,d z!!!,l!!!,ez!!!,l!!!,l!!!,cz!!!,l!!!,d!!!!"!!!'#!!!,l!!!,ez!!!,l!!!,l!!!,cz!!! ,l!!!,d!!!!b!$EC,+<VdL+<W'\-n$Jd+<VdL+<VdL+<VdL+<VdL+@m%T&.fBa&.fBa&.fBa&;5^iK S5#3KS5!i&.fBa&.jDDJUrB'!<E3%!<E3%!<E3%!<E3%!<E3%&.fBa&.jGFJqAT+!WiE)!WiE)!WiE )!WiE)!WiE)&.fBa+<VdL+<VdL+<W'\-n$Jd+<VdL+<VdL+<VdL+<VdL+@m%T&.fBa&.fBa&.fBa&; 5^iKS5#3KS5!i&.fBa&.jDDJUrB'!<E3%!<E3%!<E3%!<E3%!<E3%&.fBa&.jGFJqAT+!WiE)!WiE) !WiE)!WiE)!WiE)&.fBa+92BA!!!,l!!!,ez!!!,l!!!,l!!!,cz!!!,l!!!,d!!!!"z!!!,l!!!,e z!!!,l!!!,l!!!,c!!!!;:0.Dm6E^@d+>3]l%"J<X!#05lEYqQ^z+@+?Pz0*k=`!!!((=H?@_s869S 6E^@d+>3]lYdj`6!!$gH0*"bX!!!+]=H?@_s869c0.m550.m51::U?)!!#iV:0p\<!!!,f!!!!"!!! "(!!!!9!!!!"!!!!p!!!!A!!!!"!!!!8!!!!I!!!!"!!!!i!!!!_!!!!"!!!!G!!!!i!!!!"!!!!k! !!"*z!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,cz!!!,l!!!,d!!!!"z!!!,l!!!,ez!!!,l!!! ,l!!!,c!!!#):0.Di/URNu!!*&s+E%5WZ2=S%!T7K$&1@Mi8cWK2#-Iq+!#Yb6@,`;Hs89/"!!!&XA d32S:0p\<0/!;&0.m550.m51@0fZt!";V/:3B<4s6:_E!"_aN!"`cK0*ktd!VTWV/U7<r!!*&k/T(O ss6st-+E%5K&1@MZ%"J<X!+KRN%"J<X!+BIP6E^@\?jJ?3!!%NLs7B3ls6q.Ks6pRJ!!*K.!%V-e6i fi08AT6F+Dq/f&.fjJs6gAH!!!"CB)hqY%"J<X!-2]P!.kW0!!!"-AcMiG+>3]d!.Y%L!!k5C!!#VD s6jS'EWTVMEWI:9!!%P#!.Y%L!<=c8!!!%q0*!XX!!l?1!!!"(:[\8l/O9@2;Li?`Du`X>:3CLW0*" >:0/!;"::U?)!sVQi!";IPs6jS++?TW(!.\GYDuqUVs867)!2N4>s6jS'DusDKDu_(7s7Cnn0**^Y! !l?1!!!"(:ld1ns7fKBAd32S:0p\<8hU/4B*]VB!!!"L?ik9J/O9@6?sZGXs6jS'DusDKDuh.8s7Cn n!.b+M!<<+N!!!'#00B47!Mh@L0.m51::U?)!*i=g!":GEs7fKBAd32S:0p\<8hU/4B*]VB!!!"L?i k9K/O9@6?j:QM:0p\<+>3]hEX#:Lz+@+?Pz8gjZ?B,CpB!!<3#+Dq/jd/3kZ,&RAl,=heC?jIlm!"_ Jq!"9u&s7d^S!"]`-!"g?P!"<fH+[?#5+[?#1+>3]l&O6=-+:(_K:3B<4!!"-Z!!j,a!"]D9!!-^B0 *lOs0*"bX!!!$B:lc`:!!j,a!"]23!";I"Aen";!"roU0.6f50.6f/::U?)!=DYaOiS_a!!jf?!":) C!"qUI!"a)L&1ISk0*"bX!!!+]=H?3`:3?O:!!!,f!!!!$!!!!p!!!!'!!!!3!!!!Q!!!!"!!!!6!! !"6!!!!&!!!!G!!!$6!!!%=!!!&>!!!$X!!!)5!!!!"!!!"(!!!'#!!!!"!!!!j!!!'+!!!!"!!!!J !!!(B!!!!"!!!!P!!!(hz!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,c!!!!t:0.A\8ETsq61+^a /P,p.+Dq/f&.hG6B)hrLEW?^`;MZnjs7e0:!"99e!!!!FAcMhN&.f6M!$u5>F9!!d;Q^!.+Dq/b+=I 3q;h-#V!!k/Cs7f3:CCDC`;NMNCDu^F]@&bk4!!k51s7f@"!!!$B:lf"O88eJ"88eIo88eFn0.m55: :U?)!!#g`!"^_Is6rX2B)qsT6E^@d/O0:E+>3]lYce#uC]OKE+Dq/b+t*Es;h6)X!!l2JCD7sh;NO? 8rp81N&/#V+EW?^a?lVK#rp8&#s86g9&.gKI!!k4X::U?)!?b4"+okNDs869++Dq/b+=I3q;h-#V!! l2ICD%gf;NN"Rs7d4WEW?^a?i^3"0.m510/!;"::U?)!?b4"+ol!NrnoF^!!mQD0*"bX!!!$B:le<- "9;2':3?O:!!!,f!!!!%!!!!J!!!"<!!!#a!!!$H!!!$^!!!!"!!!!t!!!"Vz!!!,l!!!,dz!!!,l! !!,ez!!!,l!!!,l!!!,c!!!!@:0.De6E^@d+>3]lYc[s;Cg]T4s7d]hs7ih$!"<[;+Dq/n+=I3m;h- #V!!GoECC27^;NPht&.r:Y0.m5=::U?)!!$,^/O9@.;Li?b+>3]l:0p\<+Dq/b;Q^!*+>3]d&:dZ]s 7g!%;Qg&t@$Vofs85Vu:3?O:!!!,f!!!!"!!!!J!!!!cz!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l! !!,c!!!!A:0.De6E^@d+>3]lYc[s;Ch?#:s7d]hs7ih$!"<[ADu_"u!!j,I;Q^!*+Dq/n+t*Es;h6) X!!k/As7Ap7CCDC`;NMNAEW?^a?kP+F!#.(=s7B's!!!$B:lce#;LrEc+>3]l:0p\<;Qg&p@&-]'s8 68d+>3]l:0p\<!!!,f!!!!"!!!!J!!!"$z!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,cz!!!,l! !!,d!!!!"z!!!,l!!!,ez!!!,l!!!,l!!!,c!!!%M:0%>p::U?)!!#Wo!!m?c+>*X"Ydj`6!!$gPEX #:Lz+@+?Pz&.f*I!!d*GE![c)zDu`X>:3@[3!!mTL::U?)!!"-,dJNtE!!",I:0p\<:0.De6E^@d+> 3]lYdj`6!!$gTEX#:Lz+@+?Pz&.hG6B*M8:s869W+>3]lYdj`6!!$U@E#9h8zE;r[>:3@[3s86mA:: U?)!!"-,dJNtE!!"-%z!e:7NJ,gcG!"?2a/O0:E/P,p6#QOi8B*</b?ik9I!.Y%L!.Z20s7?kQ+>*X &!e:7N!!<X[!!!!#B06TQ!!!!"B+dgeAl9ahs7?j6!!!!a&:e.j#VH)Z!"W]FE!ThQDu]lg!!!!AEW @5"s7?p8Jq+D`?oA9C!!<33B*</Z?ik9I!.Y%L!+9gI+E%5O&eKYF&:n4'+E%5O64e)O,JX9Z!!%!< :0p\<#VH)X!"NWM0.m51::U?)!2N_X+>*X&!e:7N!rtrDB*p5<!!!,hs7ft-/URNu"7?-`0/!;"0.m 51::U?)!!#iV+E%5O+[?#/8q:Lr::U?)!7W7/!!!!9Duq9"z+E%5O64e,9:0p\<+>3]l:0p\<:0%>p +>*X&!e:7NJ,fS"!!!*%+t`j(!eLCOJ,_/&0*!XX!!m!5r_-,V!";V/:3B<4s7f3h!"`oY0.m51@0$ 8W=H>%!s7f3:Ae&bq,JX9Z!!%!<:0p\<0.m590.m55+E%5S0.6f%::U?)!&.4;!":GEs85cFAe\"N! !!#K,JX9Z!#TYY,JX9Z!!",os85Vu:3B<4s7f3h!"`oY0.m51@0$7D=H>%!s7f3:Ae&bq,JX9Z!!%! <:0p\<+E%5S&.f*I!!?jFDuqZm6DlIh!!m"":[\8l0.m590.m55+E%5S0.6f%::U?)!)-2W!":GEs8 5cFAe\"N!!!#K,JX9Z!#TYY,JX9Z!!",os85Vu:3B<4s84N&!!m!5r:!gL/O9@68q:O]%'BR1!!3-3 @h*Gn,JX9Z!!%!<:0p\<+>*X*ja\I=dJNtE!!"Y`0.m55,&[GY0.?l&::U?)!/OG>!";bUAe\"N!!! #K,JX9Z!#TYj,JX9Z!!$s<0*!X*+E%5W0.6f%::U?)!/OG>!";V/:3B<4s7e6"!!m!5r+K2n/O9@28 q:LXE;r[>:3CLU+E%5S&eHW[s83-'!!6d9:0p\<+E%5S0.6f%::U?)!$#+%::U?)!7W7/!!!!98q:O aE!7K%zE;qLTs84!Ws7enl+>3]l:0p\<:0%>p0.m51::U?)!2N_X8q:Ll::U?)!7W7/!!!!9Duq9"z E;r[>:3CLU:0p\<:0%>p0.m51@DZ--:0p\<:0%>p0.m550.m51::U?)!4Yjd8q:Ll::U?)!7W7/!!! !9E!7K%zE;r[>:3CLU:0p\<00B47"78X)!!!!.::U?)!!#iV,JX9Z!$G$Z:0.Do::U?)!!#X%!!!!A AccDf8iZkO!"<K[&30^j!"9l5s8PDG!!!!-EW?_)s8O2B:0p\<DuhTl88eJ-00'"4!$G%I!!!!Q:[\ 8lDu^G%s8Pi#:3B<4s8GVN!!!!-B,V=A!!!!-69,#G!"9l5s8N.N!!!$!:0p\<@0$=V:0p\<:0%>p: :U?)!!#X%!!!!AAcuNBs%%)00*"O\!"1G?!!!!A::U?)!)-2W!"<fH&2!qj:0p\<:0%>p8iZkO!"<K EE;r[>:3@[3!!j7R!!!!-:0p\<:0.Dm::U?)!!#X%!!!!AAcuNBrpVR'!!!$!0.m5100'"4!$G%I!! !!Q:[\8l/O9@68q:XZ6E^@d+Dq/bdI.&464b7l!!l>+:3B<4!!#d)z9"=p%!$GkV@0$;$0.m51::U? )!!$,^0*!XX!!k5<!!!!A::U?)!)-2W!";V/:3?O:!!!,f!!!!+!!!!H!!!1=!!!1+!!!0(!!!0"!! !/o!!!/7!!!/-!!!/%!!!.P!!!*b!!!!&!!!".!!!!'!!!.j!!!0H!!!1K!!!2D!!!!$!!!!i!!!!7 !!!"6!!!"^!!!!%!!!"(!!!!A!!!!k!!!"@!!!#%!!!!%!!!!j!!!!I!!!!s!!!"H!!!#-!!!!.!!! !0!!!!Y!!!"h!!!%3!!!&H!!!']!!!(D!!!(p!!!)s!!!*N!!!+=!!!,^!!!-E!!!.8!!!!"!!!!E! !!#3!!!!#!!!"2!!!%K!!!-+!!!!#!!!"2!!!&&!!!.V!!!!(!!!"2!!!&:!!!(6!!!)e!!!+/!!!, L!!!-7!!!.*!!!!1!!!!"!!!&@!!!(<!!!)k!!!+5!!!,R!!!-=!!!.0!!!.^!!!.p!!!/Q!!!0N!! !0b!!!1Q!!!1g!!!2J!!!2h!!!!$!!!"2!!!($!!!/W!!!1m!!!!$!!!"2!!!)S!!!0h!!!2n!!!!# !!!"2!!!+!!!!+Q!!!!"!!!"2!!!,D!!!!"!!!"2!!!-s!!!!"!!!!e!!!2Zz!!!,l!!!,d!!!!%s8 W-!z!!!!"!%IsK!!!,l!!!,ez!!!,l!!!,l!!!,c!!!#s:0.Di+Dq/b&1@Mi!WW3S8cWK.E;r[>:3@ [s!!l2q!"rl`&1@Mi#QOi+AeHa&@/pC+=H?()B*N>T:0p\<+Dq/b&1@Mi#QOi+B*`GW/O9@2?n*::! !j,a!"]D9!!-^:E;r[>:3@[s!!j,a!"],1!!*Zs!"^_q!##>,Du_"u!!j,a!"gk:s7e5q!":L\::U? )!ZFl'!":GEs85K>C(MM*!!j,a!"],1!$Dk=!"_c*s86I?+Dq/b&1@Mi!!!!1&O6=-9!83lD[mn-!! j`cs82j"+K,8K+Dq/b&1@Mi!WW3S8cWK.E;r[>:3@[s!!j\q!!H5N+[?#18q:[a,#D1!Du^F]?j\P> !!m!5rodIF:0p\<:0.Dc/T(Oos7RRQ!"9De!"]23!&."FB*N>T:0p\<+Dq/f8uM_&Ap+_6!"]D9!!6 bK%'KX1s8N')Ad32S:0p\<0.m55@/p?G=H?()B*N>T:0p\<+Dq/f&1@Mi!!!!#&O6=-+=I4&+[?#5; h-#V!!l2ICCh[d;NN"R!!j3fEW?^a?k=tD!":M5!!m!5s(kMm+oi_d:0p\<+Dq/f&1@Mi#QOi+B1NH 6s8W-!!!m0@Du`X>:3@[3!!jT1s8R$<+Dq/f&1@MjEWIfo88eJ-0*!Ris7/pq!!!(P:[\8lErR^W!! k/As8$+'!5]jr!"9De!"]D9!!$X9E;r[>:3@[s!"9De!"],1!!3`t!"]RAs8W-!!!m3u8uM^qD_rRb !!lMR+[?#58q:[g,#D1!+>*X"&qG!&&eSL_0.m550.m51@0$;0:lce#E;qLT!!jcd!"9uIZ0;5sB0o 4i!!m<F/SP1ts70P/+Dq/f+=I4&OJi-b/O9@,Du_"u!"9De!"gk:s7.fk!":L\::U?)!eO5:!":GEs 8$+1Du_ITs8"<4s7-T$s8W-!s8$=?+Dq/f&1@Mi!!!!A&O6=-?lC.?s8&t&s70e6+Dq/f&1@Mi!!!! 1&O6=-+Dq/f+=I4&+[?#5,%prb+Gh3n!!j!`s8W-!B.>)R!!lMS+[H)68qCad,#D1!&qG!&&eSL_0. m550.m51@0$8S:lce#+Dq/f&1@Mi!WW3S8cWK.E;r[>:3?uJs8W-!s7U%/Du`X>:3@[3s7T2o:3B<4 !!"-Z!!l2q!"roU&1@Mi#QOi,Ad32S:0p\<00'"4!!#d)!!!!1=H=SB!!j]t+[?#98q:L`E"!u,zE; r[>:3@[s!!j`nz!"ohk!"]23!:pdf!"a)L+[?#5+[?#1:0p\<!!!,f!!!!$!!!!G!!!"b!!!'#!!!) 7!!!!#!!!!*!!!+q!!!,J!!!!"!!!!P!!!,"!!!!"!!!!0!!!,:z!!!,l!!!,dz!!!,l!!!,ez!!!, l!!!,l!!!,c!!!"':0.Dm+>*X"#(Q[R!";2l0*"bXz:ld1ns85K>Ad32S:0p\<+E%5W_2&.Xs8Kij+ >*X"#(Q[R!":#9!!k51s85E5z@/p:r:lc`:s8:7A!"9tU:0p\<:0.Dm0.m51@?t#V/O9@68q:OW:0p \<+FO4hs8O2I:0p\<@4lL!,JX9Z!":*f!!!!%,JX9Z!!jgb!!!!),JX9Z!!"7Z!!!!-,JX9Z!!H&>: 0.Di/U7<r!!*&s9!83lB-&15s84HFs7e5q!!k4`::U?)!#SOn/T1U`s869[:0p\<:0%>p,&RAd+DCf Y,&RAh,=he;OiS`&+Dq/b8uM^mB*KJl!!FF$+Dq/f,&RAd,=he;8s*]e,)B!#:3B<4!!"-Z!";J]Ad fl$!!jf_!!E9)?jn5s!"9uI+_^oZ!!FE^!";Ju!!Hm>,&RAd,*61>,&RAh+DCfY+H]E*:3?O:!!!,f !!!!#!!!!O!!!#1!!!!i!!!!"!!!"3!!!!5!!!!$!!!!"!!!"V!!!"\!!!"b!!!!%!!!"#!!!"h!!! "t!!!"n!!!#%!!!!"!!!"3!!!#Mz!!!,l!!!,dz!!!,l!!!,e!!!!$!!!,l!!!,l!!!,c!!!"m:0.D m+?9E%!"A%@:0p\<:0.Dm+>*X"0*!Rhs86:0=H?3`:3B<4s6N@\!!mHHDu`X>:3@[3!!ln]EX5FNz/ URNu!!rW"+E%5S/PuKF/O9@*9!83lB3$--s6q.Ks84&h!!KTXAN$iEAdBSus7de"?ksl&s83uf!!JC ds6q0s!!MJ8dB<NI+>3]`OgtGl!"9ufs83uF:0p\</T1Uds7d^Ss84HFs869#+>3]`kC=a:!!!!1d" ,,G::U?)!!"3'!!!!1::U?)!!"YP/O9@&::U?)!!$,^/O9@.8q:Ok0/!:k0*#Dr:ld7^!!m!5s!h-3 :0p\<Du`X>:3B<4s83ul!":L\0.m51/O9@6@0TPh:0p\<:0.DU9!/.&D?b([:0p\<+Dq/b_2&.Xs8K ij+>*X&?@[&%::U?)!!"T9s5`?n/P,p.dD-kWs5_S<!!!!-/URNu!!rVs,&[GQ/Q)QG/P,p*9!83lB )hqq+E%5W+=I3mkCCsq/P,p:+E%5WZ0qYU@i-D-s6Lqc,B!PB!!FE^s7@FjDu`X>:3@[ss89.is6+& 9,&[GI,*3p"s5_P*!!FN3!!FE^s7@FjDu`X>:3@[ss6R#Ys7g+9+>3]TOgtGl!"<iH:0p\<+E%5GZ0 qYeAl'Ufs85KNB,i%3s6(YEs89.L@h9b8s5]<Q!!!!-E;r[>:3@[3s5Y;?s8:9C!!GoUB,2V-s6(YE s89.LAdTY/!!L]K!!FL-Du`X>:3A.+s8;oh/T1U`s6q.Ks84HFs867)rtHSns7@G:s6Plh,&[GI,)@ I]s5X._+:(_K:3?O:!!!,f!!!!(!!!"#!!!!'!!!!g!!!"b!!!%-!!!%3!!!&b!!!';!!!!$!!!"&! !!!a!!!#=!!!$l!!!!#!!!!"!!!#3!!!#C!!!!"!!!"(!!!#I!!!!"!!!!M!!!#Uz!!!,l!!!,dz!! !,l!!!,ez!!!,l!!!,l!!!,c!!!!Q:0.Di9!/."Ad32S:0p\<+>*X"=F`%)/O0:A::U?)!"`7n/O9@ 68q:LXDu`X>:3@[ss89]h!^Qeb_2'5:!!jcds85uU+:1eL:3B<4s7@Ed!!jc$!";W5z0*!Rhs86;m= H>%!s7Ap6Ad32S:0p\<6DlIhs84N&s7B'sz:[\8l+>3]d:0p\<:0.Dm+Dq/b=bnY#!!pDs!^Qeb_2' `U0.m51/P,p>::U?)!=DYa:0p\<!!!,f!!!!#!!!!P!!!!?!!!#-!!!!"!!!"'!!!"(!!!!"!!!"%! !!"Pz!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,c!!!!I:0.DaDu_"u!!j2K/O9@6/O9@2/O9@*$ ip>[Adi\\/OBF3/OBF+?kOT"!!j,I$ig8XAd32T/O9@2+>3]h+Dq/bdD0c&&eIrl+@4EQz&eG<L!!6 d_+>3]lEXGRPz+Dq/bdI.&0;Qg&pEW?^`"G$OQ!&2cN/O9@6@(&\1s6sY(7'?Rf+Dq/f+KkbB+>3]h :0p\<!!!,f!!!!"!!!!-!!!!q!!!!"!!!"(!!!"0z!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,c !!!!,:0%>pDu_"u!!j,I;LfrVe,01G!!!QB#QOi,B*M8:!!luj+>*X":0p\<!!!,f!!!!"!!!!-!!! !3z!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,c!!!!C:0.Dm0.m51::U?)!!$,^+Dq/bdD.>)s84 !Ws85cts84'Y!"9DN&:dZ]!";I"B':?i!!l>+:3B<4s84N&!!l?1z=H=SB!!puf/P,p>+>*X*;m$*3 8q:gu+Dq/f&.g%'s83L[;Q^!.8cWK.;Qg&t@+l`@s851p+>*X":0p\<!!!,f!!!!#!!!!e!!!!+!!! !ez!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,c!!!!1:0%>p+Dq/b&.ft%!"9JOYQ8>M8cWH-Du` X>:3BI;!!lK*!"<8jDu_"u!!j,IEW@5"!"9JOOF^/5:3?O:!!!,l!!!,dz!!!,l!!!,ez!!!,l!!!, l!!!,c!!!!;:0.Dm/T(Oos84!Ws85cts84'Y!"9DN&:dZ]!";I"B':?i!!l>+:3B<4s84Hd!!rW&9! /.*D]g0?!"9DM,&[GY&qEl_!";I"B+.\@s85W3;m$*3@+l`@s851p+>*X":0p\<!!!,l!!!,dz!!!, l!!!,ez!!!,l!!!,l!!!,c!!!!*:0.Dm6E^@d+Dq/bdI.&4&.hG6B*M8:s869k+>3]l:0p\<!!!,l! !!,dz!!!,l!!!,ez!!!,l!!!,l!!!,cz!!!,l!!!,d!!!!"!!!!5!!!,l!!!,e!!!!?!!!,l!!!,l! !!,c!!!!':0%>p0.m550.m51::U?)!=hqe:0p\<!!!,f!!!!"z!!!!/z!!!,l!!!,dz!!!,l!!!,ez !!!,l!!!,l!!!,cz!!!,l!!!,dz!!!,l!!!,e!!!"D!!!,l!!!,l!!!,c!!!"#:0.Dk6Fd'r!!!G<! !!!AzC]FHk+Dq/b&.hB_8AJ,R,!aWTz&.o0J!!?j<;Q^!*@,<#D!!j,I8cWL-+?9E%!!),2;Rlc-!! "-,dJNtE!!FFI!!j]b!!j,I8:X7H8q:Ok;LfrVe,01G!!!QB#QOi,Ad2/9!!lud+Dq/b&.ij^&:m`^ !!jT1s8P[kAcVjM:2rT\!!!!2DugWf!!!!1'>OSJ!%Djg'>OSJ!%8Mr!!!!b'>OSJ!'hYez+uoW'!! '9T#QXo9B*</b?ik9I/O9@4::U?)!,*Um!!!!#+>3]j!.Y%L!5oPdz::U?)!-fa(!!!!)+>3]j!.Y% L!2L:D!!!!'::U?)!-fa(!!!!/+>3]j!.Y%L!2L:D!!!!-89k18!!Fr8z::U?)!#ACl6DmShz=H?3` :3?O:!!!,f!!!!(!!!!s!!!$b!!!$\!!!""!!!!o!!!!g!!!!1!!!!'!!!!#!!!!-!!!!I!!!">!!! !'!!!!p!!!"l!!!"t!!!#%!!!#-!!!#3!!!#9!!!!"!!!!E!!!#?!!!!"!!!!6!!!#E!!!!"!!!"2! !!#]!!!!'!!!!j!!!#c!!!#s!!!$*!!!$:!!!$F!!!$V!!!!#!!!"2!!!$$!!!$@!!!!"!!!!#!!!$ h!!!!"!!!!2!!!$rz!!!,l!!!,dz!!!,l!!!,e!!!!B!!!,l!!!,l!!!,c!!!'A:0.D%8ETsqDu_IT s6+M'/OBEtEZcr"s55#;!!j2K/O9@*/O9?k/O9@&$ip>[AdWJX;Q^!*/O9@*Du_"u!!j,I00fL?;Lf lTdJNtE!!!QA#QOi+B4;:Q!!!!Q!!Hm<E%ik/s57hr+Dq/b&.haB!!iXV!!!!0/O9?kDu_"u!!j,I; LfrVe,01G!!!QB#QOi+B-JHNs4hW%::U?)!!%$>&eIsD!!iXW!!!!0d"*c6s4h##+Dq/b&.f6M!%qk O;Q^!*6E^@LDu_"u!!j,I;LfrVe,01G!!!QB#QOi+B-JHNs5\2-::U?)!!%$>&eIsD!!iXW!!!!0d" *c6s5[S++Dq/b&.f6M!,Q6SDuik>!!k/As6N(Ts3P]b+Dq/b&.ikQ"G$OQ!!m??!f!qk(^OaC:AYk4 !!!"2?iU7E!!!"1?iU77!!!"3?iU7'!!!"/?iU6V!!!"??iU5U!!!";?iU40!!!"D?iU2^!!!"A?iU 0d!!!"0?iU0.9!83\B+?,'!"^8M=HP13s3+jZ,&RAl+Al7'/PuJk9!83<C++$%/O9@"?m&(Es6OA., &RAl+Al7'/PuJk?jn5s!"^8M=HP13s3,Ei/O9@6+>3]<EXGRPz/OBF38qC^[7'?Rb;m-/u+>3]h#(Q [R!&,TLs83mf(q:\@s3,Kj::U?)!!"T9s3+*<s3,)f%'BR1!!3,`Ae%bBs83uls83nM!%eJd614c_+ >3]ldD0c1P(5,Ms7@m6s3P-R!H^r:s6OA.,&RAl+Al7'/PuJk?jn5s!"^8M=HP13s3,Ef/O9@6;m-/ u+>3]<!e:7N!"U2;dJNtE!!",os83n!#e2!0s30\W!e:g]s8OZ9s3+*<s3,*!614c_+>3]ldD0c.P( 5,Ms7@m6s3P-R!<>`ps6OA.,&RAl+Al7'/PuJk?jn5s!"^8M=HP13s3,Ei/O9@6;m-/u+>3]<!e:7N !!`^Y!!!!Q+tion*Io!:+>3]<k(!M`+92B@/O9?[9!83<B$N^1s0s1(s8:9[EXS%\/OBF//P,og?iU 1e%'KX1s8W,[AdBu9!!!#?s5YAA!"^8M=HOe(/P5uhZMX\&AdBu9!!!!1s3O*8s7@Eds7EOus5[um+ E%5+dD-;)8cWKl;Qg&l@,sWAs1!"K/O9@.,]3Sn,#VO++;#VZs0sXOs3P-rDuqUVs3tEn6E^@<?kRD Z/O9?c?j^iQ9]#sQ:0p\<9!83@B)hq[9!83LB*ob6s4ji]s7C+3/T1U\s4e_Ls7DGVs4frDs85Kls6 sYl+>3]d;h-Gbs7Ap6CD\13!"@9Cs85cts84'Ys3M=>;Qg&H@+l_Us4gP'/O9?k8q:\^+Dq/fdI.&4 ;Qg&t+>3]P&:e0F+>3]L;h-Gbs4g4sCD7n/!"@9Cs85cts83uls54H=@,<"Ys7B6?/O9@.8q:[o+Dq /fdI.&4;Qg&t,&[G-&<Tkns3P0-+Dq/n+KkbB+Dq/b;MZG$9]#sQ:0p\<%'KX1s8W,[Ad32Y/O9?s% 'BR1!#5IoD$4ek?j%T)s5Yass7B3>%'BR1!!3,L=2@9*8:a=J88eI;88eIk88eI[0**^++Dq/j0+^m hz:[\9#+Dq/j:ln!2s0s7*s4Angs7@m/s84H>s3OAhC'6r-s83;.!!!!#s3tX!9!83dB+>?Q!!!!'s 86^:Dua8IDuhOUs3sZDs7Bq,;m-/QDu_ITs85Kls6+(u;Qg&t9!83DB.>#Vs5[(.+tiond"*c6s85K ls4D)m+>3]HdB<NI9!83TB0]@ts867c+>3]T>_(5)s85Kls4D&l+>3]H7"AYJ+>3]H/O9@2%"J<X!+ TpM;Qg&t%'BR1"6]^ZDZit@s85Kls6sVW+>3]LYce$(D^lk^s88"^s4e_Ls4gP'/O9?k8q:[k+Dq/f ;Q^!.+>3]P&:dZ]s869]9!83XB+,o#!"9FO!%h*O!";K&s3tZ]!<u0!s4D(*+Dq/f&A.us;MYms!%q 0*/P#jM+>3]T;h-Gbs5Ze&CB+Cr+>3]H;Lg>as4BqoC(;A(!"9FO!&.<R!"<8b+>3]d;h-Gbs7Ap6C D7n/s3Ms-!"9L%;Qg&H;Q^!.@'Unm!"9FO!&.<R!"<82+>3]H;m-/Q8q:\2+>3]d;h-Gbs7Ap6CD7n /s3Ms-!"9L%;Qg&H;Q^!.@+$08!"9FO!&.<R!"<8R9!83TB+,o#!"9FO!%q0P!"9u&s5[+//O9?s8q :[W!BM>Us7B6?/O9@.8q:[k+E%5+,&RAh&s-"os3OZH!"<8\+Dq/f&A.us;Q^!.@)*m;s7B6?/O9@. 8q:[k+E%5+,&RAh&s-"os3OZH!"<6D+Dq/f&A.us;Q^!.+Dq/f&A.uq;Q^!.+>3]T;h-Gbs5Ze&CG6 k`s7B6?/O9@.8q:[k+E%5+,&RAh&s-"os3OZH!"<8^+Dq/f&A.us;Q^!.@)=%(!"9FO!(BeA/P#jM9 !83HC(:ff!%h*O!";8us4C]f+Dq/f&A.un;Q^!.E!n6_s7B6ms7@Eds4D?!::U?)!!!4S!!!!Q+>3] d*J"L++>3]HEXGRPz/O9?g%'BR1!"&\tDTGGQs4Cr#+>3]d%"J<X!"3TU;Qg&l+Dq/f&@MkS;Q^!.@ ,_Tt!!!!"s6sVW+>3]LYce$(D^lk^s88"^s4e_Ls4gP'/O9?k8q:[k+Dq/f;Q^!.+>3]P&:dZ]s869 ]+Dq/n+KkbB+Dq/b;MZG$9]#sQ:0p\<!!!,f!!!!#!!!!u!!!+3!!!(\!!!!$!!!!-!!!!o!!!"Z!! !#U!!!!#!!!"(!!!"n!!!#i!!!!%!!!"&!!!&`!!!'9!!!8P!!!8j!!!!"!!!"-!!!/kz!!!,l!!!, d!!!!&0JP==1c70M3&s8k6UX@4z!!!,l!!!,ez!!!,l!!!,l!!!,cz!!!,l!!!,d!!!!%zzzz!!!,l !!!,ez!!!,l!!!,l!!!,c!!!!'+E%5_+>3^#D[I[A!"9FT;h/KV:3?O:!!!,l!!!,c!!!!28EW)8.K O0;C'$eS-idm.C'$eR6@sA&j+-0Q["2ckP^u__;9T"1+p,</C'$eRZ\3'!7"J_K6@hIR9]#h4:3?O: !!!,l!!!,c!!!!-8EXpl,QMI"8qCRW6@`G\-32'%84(8284#X0eq-FY^qiQ,69rnM9]#g[:3?O:!!! ,l!!!,c!!!!28EY3t-igT,8q:P.C'$eR,QLGfActGN?m9=e7"HZb`kb24`5+u26:07T83t&-83fL,d "=rDC'$eR9]#gk:3?O:!!!,l!!!,c!!!!%:0%>p,OPO;!!!!=:0p\<!!!,f!!!!"!!!!"!!!!)z!!! ,l!!!,dz!!!,l!!!,ez!!!,l!!!,l!!!,c!!!!W,QPWmJ,fQKAdE>UEWC1]?m8-.8AaRW`4UU##QL$ 9"91"UF:.&bj,d-\s8!#:!$<I.:3A2l0*$WsB4R6S!"2DLAdBL[6@kAK!$Eop!h]MN!!$XW;F9B!if W5a0)u'Gs53kWB'r9DC(=-mA-u4b@+\CEj,)fX#QOi=BCs]$"939\[!W,YCad*3!"],0kt4/A6:+40 KO78:J:]*i:3A3P!!!!"::U?)!!$s<?l1OZ!!!!#::U?)!!"]8J+,uqJ3ldl69n?8!!I<B@*ATN!!! ,f!!!!#!!!")!!!#%!!!#5z!!!,l!!!,c!!!#\:/LuM:/Luk8EYIV,\R/`+;uF:::U?)!!#?"!!ko* !!Y(VK:c`c,\R/t-7Aj&;hJHX!;KGY1I;'E84#+!!!kn\1arD-B3]0a<^LR=$:4^peS,!d@/p<.?q= ]+!A[Pe!!ZgDF9L-.!!H^1!:!tm!:j'&!!Z&GCW'.c!!M>=j,d[>6:+".0*$WsB,"bS!7FJ/Adf)7! !-[9;eZ49@-e(%!&,(@+:;"5[!VifCXdM.,U`X$8uM_$B+?=P!!!!"e7eme;aP7\GSCQQ!"s*'3!(! Q+:AAW!!Nc7!'+sA'>+<!+:D(%+:9#A-jim>C?SQ0!!Z@hH2tOT!"`cE;M6</!$"N!0FAp*B-'u>2? X.M!#02MGS:eG;9](<8jdA"'`7qb;9T"9,\R/p6BXrT!!m3=;j&D>!#.bN1+<2-8AQR&9]$9X:0C=o :3GQPifTIQ!!-^*:3Cpa8EVZ,,QK.lj,)fXj-J_^j,i;edY#r!A,lT4;MO4gj,i;e9]#gY:3A2kF9" Nf!'oS$j,i;a$pjq$D$U8r!!!!+;LqbJB'<%Z!!4Df:3B<.s7B&`!!#RQIP>^@EW@m\!!"f?!!4rA! !G)C!!Zj3!HnkU!&/!j!,3PU!!H]t$jH\`AdSNPJ,fQP@/p=1$jH\cD*A@4!'+pV!,3PU!!G)I!"(h ;!!]!.!!4eR!h\r^!!$X9;J?+4@*W0\s#N7k!"&d^!!!!0dY:)Cd=u&=$jH\aAdh:G!![%E;J?+8@& =>:!(CN)$jH]CAl)n9!:gO&!%V[j$jH\`AdSNP&-)\5@/p;_$jH\cD(lA&!'+pH3[k%/iTU=BiTU=B gM$WfiTU=B!_*/#h.Zih$u$7P!!$l[i9:4A@.HN2!!E@1+96!\,\R/l6BY^V!.m$V!!#54!!E@1&-- >E6pfF<!!4eRK:cdU1OK0e!!#WACC9*Yj,d2R!!$Et8ne8,B-:t(F9L-.!!$F-r`W_1raJf?!!6QZ@ 0$:[;J?+4@*E]m1arD)5:HR8!agHXB*8LW!$=tH!!!!W,\R/p,et[V,\R/l,eO*W!!.$=0IZu-9]#u %:0C=o:3A*9!!m3E+aa7i!!!!):3B+jr88i6!"_ng49/(4#<t"6!!lN%!"<HF!,2]=!!H&>5:HR8!a c35B**J\:3?O:!!!,f!!!!#!!!",!!!!7!!!*Pz!!!,l!!!,c!!!!I:0.Dm00B470E=G;::U?)!(9Y E!e:7N0E<[is85K>Ad32S:0p\<9"=p%!!$Y@E*b0t::U?)"WUX*%'BR1+9;H>Ad!'@?ik:70*"bX!! !0B=H@D.0*"bX!!!0B=H>eOs83uls89+3zC_/6"::U?)"--KE;Qg&t@,u8,0*!X*::U?)!!#iV?jIl -s85Vu:3B<<:3?O:!!!,f!!!!"!!!"/!!!!K!!!!"!!!"3!!!!/!!!!%!!!!G!!!!W!!!!q!!!"(!! !"B!!!!"!!!!i!!!"8!!!!"!!!!k!!!"Vz!!!,l!!!,d!!!!"z!!!,l!!!,ez!!!,l!!!,l!!!,cz! !!,l!!!,c!!!!Z8EV)s9^_rc!":E(!!!!I:9OWV9]&)<:3?O:0+K0Z!!k-$!!!!I:9OWP/72.p8EVZ .9^_rk!"^],!!!!I:9OWJ9]&)D:3?O:8EVZ.9^_rk!"^],!!!!I:9OWD9]&)D:3?O:0+KOY!!!!I:9 OW>/72.p0+KOY!!!!I:9OW8/72.p8EVZ.9^_rk!"^],!!!!I:9OW29]&)D:3?O:0+K0Z!!k-$!!!!I :9OW,/72.p8EV)s9^_rc!":E(!!!!I:9OW&9]&)<:3?O:0+KOY!!!!I:9OVE/72.p!!!,f!!!!+!!! !"!!!!-!!!!E!!!!]!!!"$!!!"8!!!"H!!!"`!!!##!!!#;!!!#Oz!!!,j!!!!#?VbWPD?'Y:z!!!! #?UJXJF(G=O!!!!=!!!!#?W(HDA,lT0!!!!Q!!!!#?WV8^FCbFP!!!!m!!!!#?V,-SF`[T`!!!"4!! !!#?VbfdE-67&!!!"D!!!!#?W1NICB+>7!!!"T!!!!$?USIAATVKQBl%>\!!!"p!!!!#?W(HQ@;TQU !!!#/!!!!#?V,0)EcM-[!!!#Kz!!!,l!!!,c!!!!80+L\E!!<3,/9q3q!$k=Bs#M]<:3?O:0+K1E!! j]#!":E(!!!!E:9OUL/72.p0+K1E!!k-$!!!!E:9OTM/72.p0+L\E!!<3,/9q3q!$k=Brm!'%:3?O: !!!,f!!!!%!!!!"!!!!+!!!!E!!!!Y!!!!oz!!!,j!!!!$?U8LEDduLQD#aP9z!!!!#?Uf'IAPH`Q! !!!9!!!!$?UeaIA5luYCB+>7!!!!Q!!!!$?W1NX;e]l^@;GoD!!!!ez!!!,l!!!,dz!!!,l xbtoa End N 22948 59A4 E 2B S 16E403 R BA2137DB #file atob.c /* atob: version 4.0 * stream filter to change printable ascii from "btoa" back into 8 bit bytes * if bad chars, or Csums do not match: exit(1) [and NO output] * * Paul Rutter Joe Orost * philabs!per petsd!joe * Fred Fish (change into pure filter, always output) */ #include <stdio.h> #define reg register #define streq(s0, s1) strcmp(s0, s1) == 0 #define times85(x) ((((((x<<2)+x)<<2)+x)<<2)+x) long int Ceor = 0; long int Csum = 0; long int Crot = 0; long int word = 0; long int bcount = 0; #define DE(c) ((c) - '!') fatal() { fprintf(stderr, "bad format or Csum to atob\n"); exit(1); } decode(c) reg c; { if (c == 'z') { if (bcount != 0) { fatal(); } else { byteout(0); byteout(0); byteout(0); byteout(0); } } else if ((c >= '!') && (c < ('!' + 85))) { if (bcount == 0) { word = DE(c); ++bcount; } else if (bcount < 4) { word = times85(word); word += DE(c); ++bcount; } else { word = times85(word) + DE(c); byteout((int)((word >> 24) & 255)); byteout((int)((word >> 16) & 255)); byteout((int)((word >> 8) & 255)); byteout((int)(word & 255)); word = 0; bcount = 0; } } else { fatal(); } } byteout(c) reg c; { Ceor ^= c; Csum += c; Csum += 1; if ((Crot & 0x80000000)) { Crot <<= 1; Crot += 1; } else { Crot <<= 1; } Crot += c; putc(c, stdout); } main(argc, argv) char **argv; { reg c; char buf[100]; long int n1, n2, oeor, osum, orot; if (argc != 1) { fprintf(stderr,"bad args to %s\n", argv[0]); exit(2); } /*search for header line*/ for (;;) { if (fgets(buf, sizeof buf, stdin) == NULL) { fatal(); } if (streq(buf, "xbtoa Begin\n")) { break; } } while ((c = getchar()) != EOF) { if (c == '\n') { continue; } else if (c == 'x') { break; } else { decode(c); } } if(scanf("btoa End N %ld %lx E %lx S %lx R %lx\n", &n1, &n2, &oeor, &osum, &orot) != 5) { fatal(); } if ((n1 != n2) || (oeor != Ceor) || (osum != Csum) || (orot != Crot)) { fatal(); } exit(0); }
jcz@ncsu.UUCP (John A. Toebes, VIII) (03/06/86)
#file Hack.z.b xbtoa Begin +.\Dl!">52YTSGr/dqpmd%]HgJendb.&`eHLk>(&2GbgKbsF<.""5[%K4BLI$\oE):lnO?#qH)n!47 hW_'08,'pKA1i4+B^64sEO+A0HT$]>bl:_6;c"5O"cE6o96:]M"@(5Nk?7_pZP9bcqn'gY-c$3QMCf VY;BWBgV).4?=sJ,p%I'a,/2J>7]G3!)?COG)PHJd)#Wq5'apOHg.g.&c]ETRma_/dMcLj5e,`[2!L /<U,6hGQYek(g%niKh:JDbTKhS_+YgPE!6e*pM'\r'cQiU!*_`5"hPHO&b<&=NX$%G<.hb)(5RPu#! CgHb!P-]!L*kGT\[J2068WS\>\?IK7']ImH;2+U#hFt%X:oKQgB78:fIu0"l2udG7"Xa<'ZfBKYVp7 BM]6Ej=+PF5m.n/6[/Xm@[Ca:(6h?UYLOAL-O&2A;(Vs6+rGp)D&/^//;4nYN&<)<JpbV`8>BRubW( `E54Wr[+;bI*c]"DDPSsOqbii&O=j0EEGT4m%_MgR2-R3;-L*sis&BlP2GR9a?j?cKSFQT"qi??_Vq 1Y.Y7hn1@+.F6e'Mr`K0S!;hiRq&S=r^7&=[?Y>oHalgV;oo._!Eo[1<4t8!#"JiiK"=2Y`K*E,</U 5$R7bYOUrQ<KYo(W38o`Zg7SGa#j_PA8RY5q!WX``"CqfE%7&>K!!H,U@2K6+!CD/;$#th9XTAJ)(6 <tG":/]=)@\IZMU3pXdj.jE#W_7jP6;b^OA%r65SJqfJ-^-!]`J3(O$B6:;anBD"GH2L+H.3M&Va!\ #W70\!/nVm9Hcq@aS]Po#6BFlSAZMf_AmVo..[s5,!>B^!n8+k#68/!JL^`/ou/H^d`fpnZEA(:_R> #XE!?H>('K8u,'5:"5D"\&(^Obn5f/TbZu`T63"L1e!p(Q!D$o*f71'Y3#F'6p.t^+f#[7qGjk'R[U -uCKSABd_klugX)$Cr(%G_12J[aK%pN8;7,(tr.XSs%<_?V]Hbl\X:r8EDEF`87L!A7&&!$DNN+D9Q 6r'LeO?iU65).7Cr7'9c;%`mo8Zp#ubPRimP5u=YA3#Yf7E!A"\)`0g_Hn&Y1G'jK:bX/`hjMsSL*Q 5o`:b5#e6'*/[VEP0_;\1kkM,Fm4"X+bFS,k?A&.Skd$,Do/EPUdf#;)0,6!dO0<<,A4D^#2.=GRCX ,7hD20-CjX'1_Jd^]ljH+Co`7**g:61l+F-@?<k/##IR981G`EE.Si(Tat0AKE9V4:-h,H!3LML!>' b]&cdIc@*hOL5a]QS$3Gba1hm#'0RsjB5nl"t!sC99Tb7?E"t^8M:k4Wo[/cl%B^?:5+<Vj0O@YTQc EN$q!5oa/E5NZ%&HFulTc&N^75/D-M_Kea:EV>E/TsBds&c!5!:ULY3$AbCW1-*P6&Z+LMMHe*c9Fj .8@J`-+G/St-lNs7#(R.M0+]B/fEM=(4@35A`0M(L&3PLT%fe:mTJ[&h^jmD#C^$5"5g#n#dKH?^mG !J%((s1=J>+0d.*0:-ih(`@&ca.*SkB+d^?#(r!0;+t#7#35!%;4`DfC==@K;#sE:X5hO?kgFd*2e. cn=XgLg?nR5lePbK`@^#'""SA#@+PWD"@n?JoJ>PUu2DDqEQ?5J:JF]"9H^RJ1[@S&I.a2+GPE!g&O B7K+]K(SmZ6)i"1Djh/`]IYUDgKJd@>kJ>4/CfEhJ%d"KQXUaR7B8l["^KQ7*j*L1>(7^.K5*lJ=2c /`2Y)?>,/;Q'ilW;ob7<'_]oWL.?K]SHmtWV2%E0^tkEYBnR#*<6uSm,nV$!RQDuU7s4KLb_[#:b)= 7X8tTk=t^d*=I:oXaLG4,oQi4*!oR+H8mbd)!`oAl[@f,5"&<'n07&/a"n?+'9a&H?-'SKC<BOb!T^ WJ@bd4Wgd$Pb5]@i=_TqE)glpZ>1dM@cW+.[Q7A)hjfbSikTO;MFh_4Z[oZD=^[XXO<F3_IPOOK]%B J41=ud]j*D&LJ5YEa]Q91KZo<0*o?V!?cr@&sni*J1!M<n.3OYF.RqD!uJJgJC<uj!^$7o(P-"$Hj% 8+VOcpU&IJi.Z?NbP0Yh3"^k+0*QWa?]K7?&$>Qh9j'%h5AB*/;A:Y[n#&iHn.8,<`AI+PkQKEleI. o.?E+BZ3aYC#49J/6A<BRc9O+Bf>0OUV?+prG-X'B%>h#[kK"!l9m&?ot>i!"t-MK*)/eN"GK4!7Dm U!?h$aNc*L^n6hPHQiU_%-ik%_LmnKQYTk._e0",J,^Tjoi!>Be8ITR\5KIg&n`k>9=uO<S_`L32Re R:YA$C==TE#FnfaD(tF1!.g#RSBd%*B]78e#fQ)=1LNVu30."OP=urpP<^!It0!djP3`01*0!a;tEb /HA=N+jLCE$3ssrJtsh<&5j)?>]c(n[;@)c$OAI&1*cir@j+U?T,e8*Ne5WQ.[qiB57$qrKhu2$jpO F/!ta,]"lpR0H+$ucne4kfCB.1XFn$4m!-k#4+Ot;D'Z+7514UL:+:pmWa8c8tUk&td\B#N(i!)-QJ IWg4K,i<)#CDefhdXYo_rh"$3kV0Ds0hY-*fc\'VGiqGZAT[[aU_-$#F)>7JISge7g/0l1'ooB&)^9 7[8i+gfF"Ak=9(i7"2Fm<)"7cF$NquCm0,6R)^WK^!"sP).0Qk?bL$=jR/7le6C06ua<2%3>h05Y5_ &j)1)Qnl^]I7C!#3ZFLU;]O.0C+_faU2i3Gb#r9IBkLi/du/(ISV_,/RJARIZV-!q*"3><kN*L,2A. ]>hoR[c$QZ*O?4<O2(f>-lE('#bc,ZLr"8R+o0"`6k%=WPlMAGX[`F8"<s5:"@,0Q,Qn/T_8u&?"d6 >DRP]u>)?:-4)1VaP?L\%>KB%gWK$qOW!,sX-Q7QAp4a<.b:tUpN#*<,olGKE3[g)B=;#9DQ4Wo9)" S);\rIP6hqnEBS*X)NNf>Cqg['r3dFUnI5(uYW"5R7<7!,M`>)?g-]<A<q%ADEGnAtT9L1BK%6##mj 8JoH+fU3uZF0Zo$!"eg;H!!d"hJ;"2U!cWSg@"%=\Ja%-&,p3Ih-Ya"HHA4:aoO;/)5^fPnF7KP:$p [2]d/ffW#&FuXi';\`i.8(e#%iAcaG3.+B.sBp!R>m#WZWkteQHDB!9auH!ItLN,QKi$Ib[G<ItoUa W!1n!!8Z6V#Om-N"ahe-IV'E.R&>!1+U);a#%;0L@tOegi.X4"J$DL2^bC+n=*qECHT=M"8H=8B#_3 )'J-d&N9Yc/k@!5NA68&"R!"a3,TP.6>HB1=Ipm6g5a,&n[/=sd2"lK\t-OckcLkthPMR\-r2)_Q2# g?`X)F/J7J:*<""s+>1G>NTo(^\K#G>a6@XjV<<GCn0hI<?A<T#>n.0EFgE,G@V_Cm0<VQjYMPK.A> bahTG0i!Yah!H:G=58T(*OE[9Q2@A@QOFo+'`Fo2N%jncB?*kiB7#O.T!3(cRK>E%I6N@MpA-a:Y42 M&uLk@NB1-10j6L^(U-Nfup&&\_Y+]XMG.";;l!H<.C"9s&[J4,rNF[9(?*rne@)(;IT!<\/]Jq+!@ !.``k@Uo!1T\rC=7LsSP!951/E!0Z)+:NjPAP,d))PD_+aFdR#1A@.pi&+a2+9qoY%\WkmK)fL;TQT >3FTS3@?Pdlq(D%WqG(O+FZ=%k8@!3MTG&8*.e<"ie+9F2!!bm09/4KX2[<hpn#&L%9ScjG8-3TqE& &ai]j8fD9Z?tscO,!rAH:\ful'FaQ8T.u@)e^#s:jR'p!V*u=/7<YjE1'q[QNZfEJZ2QL5m)gdQm*s lUKO#g[[=lD!4X//6ii^:Y^6Ik37$f1VAB6$!(TYc,9a9]!T47,q**)<#c(Tf+eY;0JHroG!5L%R90 enWVhSL-.Nq'7fGOZY!(SRUO>R`9"M'<ofd]0WS'HjKj8#()$(D#n#2iWK]#au5q4%2*:BSrKPc:69 JcSpQ*.3;<AB,,Y)5,bFTE[1P937WuQ:)$_"Uk_<%N5nG!.d3hJMMbK*dT1@&-36?S(d+7Xb$P?-_. .9Sm7qWRG"$u)%_"2#"ihiA#!m$(HRK]T_D"l0rgl&5a`fuQ2,Z#"OML=Tm)P_O8`O]&8?qo$=:aV! 6>BF=E"IPTR[&o"YAeg!T=)lOF7AqUbP-&:AP+T7n$iRVE5tl(r/_O'e$jO!j+9\&8<g$+9k'q#,26 ,,5QW"!sA65",^Ol(@ZU-#6R^nR)M(2`<`Dri-_/R/?r#t+P'[j$4WgjMsZp^nEEpBfbY%L:cJ`.31 qiSR<8T96jb'&W73Y3!!.j)JWBJX5[XeM#$Ll>/G9'E;q`]:huWX%?7c./A$qJ<`aStQ6u*>FL@CPP @0UfrJg_J!B<XhP$3=N7Y+6l@o-FVha:S3"&!nZ/$D<RN[3K0OY43tQYF1+>5[kR!RuWhhoRO,$!tO o.?;M1or#fWk&-c22WU_0jaD_?2i2#jmN!<2\*tVA@FB!WR7Jm/d2mt@Z,luX`1$&aFrZHQLeR@s8; [EU/r5o$O@'V3X%k<Kq>7q-@0X-d_:B_l1Q21c*^]Z'QIWA6c4/jn0d&rA*0D:K]9ab,#0JgY_YKl( 5=W"ONTX0"]&AlMN"McPi+K/3AWJJ,c3:p<@_0I5T[LBrs,;;"u^^+4-Pq77nIZSVn,6A^$"r+9sPb bd<RfR"t!:#)T!MOP.e1(KL!b7Fq:P]!_!!8sBLo+pnF]_UH];<[cTE5*$r2L!8MZ=-?VaYeu.DWB4 :]R""%DX*gO^nH1huoNRUgloe3\\06!=)qMIKP*(nJA_?q,@[:>XbZS^Dhb*!!WLt4,,4U-t!6C+H/ R)"sdT+0CZPiJ,qJD-in;k`+ZiHU]>6#GSTNHECr5>oRR#d!]]ZR%,cFUYQ:ph^-#$mjnF4H^b#Fl3 b32Y"s=%qLVI'IV0ML3?-3CaJ,qb?$(fj#opCen.&Hup#:^X&@D`<br4]Nc_%b*0%3WJ(m(qn>!,(3 lKbGgX:b>?p!rXsl;^Ft^^iZZnK8p;U+J?S&>S+$W"Sl_m1&Qtdr!5=gTJ6;=h-%[u&cl_YR=^(s7a /ej1,_`U9)=p-'[Wu7U'6'DM`&##3%,1*-NUh?JHde3#&?-.`=H'!XBX>2;[QiSECqrnCR(]5$ud5< Oq?3OC'rl=$%NQI&Qf<($fo->#XA^W5oi?*1GHB\c%\j7YT:o/!5WgYBOLm?pN(iSF34,snl']!+;9 lr/CT5&Z:"\I+qW3M&>:Wdi*[@1+V6+K!9,=*+<gg1,AOh7C=aeIXW[[GU/24`5"DmiA2gX=<Y3\U& AQ/kd/lmP!R1Z($N[L4n07q09E9uJFVaH\URV>=]Dtm)!6,Q]$:$]]i";Xe!&nr."d-n.E,M^B!6\V i6]qH7S,ej_cA3#C%A3q0&L7S^KE=D$"JEdBJ3Eu6d%[C$aDrTd;%QB2N<N0p!<F5BE$kZ_4U86,!? aS#Fs[8E,m&T@U)"lGp<!FK9`lMU:YHUo+;=EQ!9.Sj]kd\)r,\uf!*=1@f5grWFo_2_!!e/W"8&)D TaBcl9LM`O#[f-S\B<f88LhRWq%G0g$imk^C<6SY*<Z@mHk;ni!3mLDoc*tV,QJT3!'iN6FqJNmd*D ceD?DRd"&MYn!$2:4aTPug6iekFE$%KQaU#+C7%r$8O?Ep.DUqc\$8BU0:sTKq9F;>*$ID'HE$l$D( (5(-$]rL=&C/nF!%,P_H,9RN_Z7ai-k=K%9[*RT->JZb!&=G/Ibb#$9GCb+M%73!EkMJ.;pD5G&6H. tI::P0+DqQ0%b1u@$W,+Kn4X:Q4UnX?%A3l)Yoj(?CH59=#8&bq=!%Zu`r^5)luN`=493"<!!gFBim n+1d/]di!8S:DJkZ5*N;s3j!6<YZj?XqW1!pD;4q',=%$4-knAl$RfF?3N%8bdf?m1)!9FT;*$kV2' &4m<2i!g7@%<1/5+A2c5&F/tZ$aDf=:-VIW&CZ<QU/hgM+;I`/!'p>=!>-UZOZ`oaCK4FITJcep490 r?!,'^[%c%-XS`0XR9E_$0#LGaFd*1>N!0\N=4T7QR>l[Q8!:]T:&1%u<D?-_S!.o%fhQS#EEWG9N! 9S>&-pE8`Yp$&&9IV"_(I8b=ZiH;t!'*4(9L0@o4loas!%Uu1FAU5a1$-de!"89g;dS#1>Wh2o!7<# Rdr[hU^]n4D#&3Q2F[/B):^.e:E>Z&<D?'_U,R87,#G`CF.g#i`O?j.B#Gk0a[-m2koEIETEFf,hE1 lN=&-d7'l)0!rY7:dG7n%J!E+ORdD@fua&-`h]lr8Z)AKV4fE:$WS#&1m?@iubDU6[uL&2R,o7fY3; ;%RE&"eH2*AM=>k#7'r<"skrhljNr*^]pCUDk5!,dLH=t:^;)-EI#q!('aoa?3\Z'&aWg/rMK&#IW+ m+#H454U/(6uSe+1qnY:!gpoa(,nF$$ol31N"'Q41oE,ZVun^``ff8f?C5R(aq#&_3\Gl[01%L3\\# --Ma'o*"eQL4^<#1%`18MKZ0VXLU8#+FrafhQOX)7_%hnNbD)D,:FYO:Z"8#&I+%cOTGYE:)?('1$U &WP7X'Ns7%ooU_(^&RY)FEV9F>nK+=g'Mn?c+7u)koqD$_o'Q\r7r\AA"sBT(A$?19`q=-Jod'"j<% mNIE"PP>luh4j_VXU(^iLf_l>g9NGB!(?+'O>)oiFoo(U<X=+8U]k#)@]sFeA4=n+SY7EHM6d+Ahki :[rB7!0^4KF79B8?hgApqi1(6&`a-DJ8hI5#(5Y>)@lla6jIf6E3Lt\Bts@<0CYp#E4[4jdr000/dI .QreLL=BgDUH0E1^+lj,!9J:II)O8CTFq[F)%fp)Dkht>7?nEmsfc%#59O8YV5`V9Bb:&mt27R6Kt5 0`9T!'pKM!t;*eH+\Sr#P*DX!s'C>hXMnL1N;Wp)*e90#O`8=:tP50*WL2*5d02K^"&H8<+!Bb32l8 uBb6:P#;/=Ta9)H1""lfq,6G]Qkn=RAB+DkmR9/uth@;qr$#ec'6's%kBV*J$Fm%*$ah%s:#;1T44F c-1!_/[saSAfk*O(,XOQ&MjKX1gg+8K,dXj6Xn^#k[UnD2rBJU]?B\UhT+q@6jJ7!eOo,#!P2kQE[` #,F4h+:>u:.4>G,?i,adF!(p>^oS>,J=jMh"5.2p1`VBCo<:gJRtP?\n=@..pZps,+qt./0B4WMMc0 l#!#fO'1N21/44^kFK\aMeFpXlAd/fG4ln4;DbU-mD+U#YUkQ(K%`'ZMlO6<m`HP<sR^^:d+^!P`+J R8]_KOGHD(lf.'Q%@;6"XW-B@=FBD'X!!hf^:#YofIEAn-qcJ]OqZ9>oKYmame8G6\KLbB\rBnGmCM m1(@6=q[rrF\2\[4%7Ij(aDcs+rI]h7mg]o!=a+jP*O#'W^b-<"JGukVB3leKI/J^@%_HQ*#j&i1F9 *45*G,k0@rU3E.'tr'Yh(`o@(6(Ic8F[;%Zf@i_DWeK45[A#LAaTn8O/F5lbjm^PBU:c+^>&@fD.Cu ]pX3A:*5A/3LF_!h[`hFEK#n]KNeNY+@/XK#]^@S#WBSp_r='M3-51pcriDOnnnZI#8%9j@V4NuWMI >H7PteYfYVTa)AGHU@S.Jf!!2Ha#QV:mV=`/[TdY/JD3t<!Z8)h^2;3u)Bh/@,=Kl(-L>mdiSto?e! ]?VO7[RiB/ed/jJX>csRL8)9EWAU`ND1!5((dE0(?,SE`<05-:@]8ij(MC2RSbPr!`.6F6@])e!rsg YPX`V<%WKSY0eBYN+k4Md&lZ4H77iID@5eCJ_%KW59Pt9!Co*c>*k3BoU^pq^6F7?%>VXla>bIj0KI K#kpP](jE#\t1E',T&&N5UK37&\\j)H=E1a%=2(s6NJJeAoA"*C1F/Oa02(/Mbi!<I"h$m`i8'h6b> O+JqLC,6&A!6K=6_*5[gG/hl/8+.9oJE*"H7fn>-Qih/u>NgX.@6_PI!#S8"jT9<EI]O;L.9ccQ+cp f3K7jY@bA)_.X!73ZQ-+i_)H;7*Hkq$I#1h@=OXFPVB8i6!5luFt29H[nZF!_)CnOb7!4JgEC5T/&! "!TiNsPi#NNY&pmMD`&$u@/24=`j8!)uPHQrABBJC9V&&YeKV.J\q2jD\(Y,(M[7a"M-R:WdeOP$,( b_L_4O;7L,+`/`Q64Pn27&tfR33B3,r76qOik>F&R8f!LQBHTQ'8=bA:nC?/^!;&!"/d0$.2Ep1g5` A@:Z\/oJ5QU<5G3K&',VrUolS'GOV1tL&I)HQf7D/CA*C,5sPQLDKDFhtGN$]g'r'\il=pQkR`/t*& ,%q"Cke)QY)MnJo&j9VW(EelgJMCUbKd7KH#MTCijHCgF+QLB@1BTrD=MbGS),H'NYsan?"9trik[X ],=L7'>(6TVQ(HO6%+2J5]QE1:.d>h6n\5MBO&d#uA_MB&h\0hBt&#*2,P;/Uha8ukTbc*in?7JnMR <Z#,8BeSA8baEd5c^/<0Fam"&sP#k0!n2pojs5=B*nYD__iVG.C+1,J>3u"E^gP_a;P@>PlN'h!ubR Z*31KQ\BJ*@H7cW1/(mR?J1or>^)W=UL.[o!IgIh'&W3gtZ__%>R&<iA&n\0_Q4:1*4NuD$1&1j_8t $Oe+N_WPaT/L+OARd'"Gc1P,81,f!s.VQO:)>Eb`YO38ET4m!8Kms+cAm3#L#GoFH?eBpfoNY$,D(% B/)t$J7F2!\01muN"]SZDh\;OJ<Pg#jGX.BR5U3P^!)i]2EKC7U/DOYB0mA[OH5RaG*$;@TMZC'n5' */#m!;2B>^f=Zf2Q7!Wkde+/bc+"9`$%,dNlBGpNN"eKBd%cj8-&5\Oa4@+cZ\WRskZ9gDNc"<^JCJ 6"QCUd?``Aplt9jU8&<4p\s7l#-]tQRTJ%"oo'_9K7*l">)#^?'E_=!*1'>_UHL*J7B0&//ePNDu]k eaFo'j'oj153,/F9[K-BG"opD]NX,Ub/c\QOACf.ua$Rja!J$j=2#qS6E(thD$;tc+$%QV#!78R_TH sU]AtYWI!7,+D=qW^?j/!oW1I2"s)$*QJoW0^-c;1<$M[fG4BH!Rl'ElE&!'3XO&826?R,G?L5g09p 0,jnpKE.7HAMO6D=TIA;[&,keKF4ppb$$P454kTP/-M3'Ni:2X#lrn)!8%CA&5<X"UdH@1+V%$H'-R ?6f`6gTJ]]U4L]MHA#/F(T!"NiGe2QD7&9_2^P6ok$'g2_(@K;QrNf]i-Enhgr=@N8l9*&-("i,QI# ddD.]%m=1">Z[b)$'S;,OF2aBJheZ6'+,'TgB.f+o=:rZf;l6Orsno9uu@:?Z5OE6l/Z3L&f'SM"g' #+Zt'\Du:'[E</C<#\9--k6C4%]oe.KTFNZGqr(-TcG>@61lp7r!S_6[*DR>cV6BNYqAZ.W&'lE50n j%dkUj_^$;79G^T"*1maUKjY."t=^q6p4@R(Bi6>b`M/>>i)I/CneVUK[V&Bq+!KS3)2%C";sVs5ZO 4:QsN&"h;!XXF`E%RKcF95tl+QX07kXp3Pt!O%%?TRt:^0Q>D"U&oifb4#Ke`^0fZrM_r7W1pGqO#g W%C6ZO>*0glT(4IsKVF[9[!2g2iVQSH<?]`'K))>eh"N6BmJu1@)"NVG1M'\Z7!-oR-RjZT8N=uu$0 fd,Ulm4YO<$B$\W0\*>#-7gXMQ6Bj"9bT]ePZjn92,H\k6,U$U+fND#jZd;>G@ddN>Fhs.)=J;!$Up i":>D7#T0R/NBe(U=?+<Ni!:arN6rI1"nWM')IcTu'h:[p,W2CseWGtr$#<!6O;udUXOODa*(lQY"# +<:+L!I7F&P6aq_D(M!)4%*P;E9$.N!+.99g(@9<4IKA;DD?NR]FF.`O?_]I:fm*@so^CKT/a3!!2S #Ts/W[>!_nQPomNlf'>o*5u7LKC'km/uS!>"a=Ka#_A4o"@e;65VR:&_B:Ggo/Oi*3&h!A+:N&uW3o f)$PjD<S<Y05*T$'cJa71W%`\27P^jIi[C"!nn,PZYh&ubW5QT4>"'>X8+MYM55iDp/Qh%/YqM6'^U I1lebQ&0@>dYs_gnJ1A#AVNjiX5qO7PK@2Pb6<;T^]0)[T`G-PJSk?!#>hbDr=Oh\C)$+WJE[P(0QN 80\F'm!rUUm#lu?&o)MjEJO:aaeVPQUa2^ZY6pu4BJM?r'!C7?3)0c-i5n=8m7IhY>:07i'H:i]^_F `0@&Fc;<bHGH=?p-r^kK,>#GsPR:`d7liq1f_c=XY3p12B0`?*<KB["WuP#Fb#=&[Stpb#YZQ5\6#B PnaL+G09peJ"Rm;=:]/O+2Ai2fPc;$-KCG@X\Yh<;NWci=Fn9ri!YcEFdZ6;ciHJ1#bY=k2A,<acJ# Mn('a7qp?0Q+a0[""m#RDh6p3;%:kQ*+WmXm6>#g-j]XS(%,6>/?-\=A9$IKb5?\MsZ_2MYW`5'ZQ= Z.e-E(E[.,`@JijO?d@@BJm`%0Z)J'iC;RJ-VMp&6M`6V^AOIo:ru]M6.BjDnmR)$60*ON54KM);F6 Y3$/Z]<,fq2J5I#\+Gd-JV,^7kZg[s.@*pl9)/EulV6^'%Cf\^(Uc!L_!3MR37B-S$lph\?QjS?ikQ %ID+/"6%lN'Q(fJ!;#W*2.^21P[9C`SnJhb%+e&#?%boK`lK('NP;O9<0AF!8?t:e9h\e]=j5+Tb[R +c&n<M%<"P&RYh05]fm)B4):V+co+0^q^j5+chd$G`mOg/.00$HF0O6c8+/%U(<i4.KX+,KE-f1C:e )]D73_<?l)u@JsI@H1]WDQ)sd3!Go7[67ed<#3Oj;l(m*E-5e>Ms9I7<"p=d+2J,j4fCCROK4p(o>W YH)U[`db,=^XM6#)#aEWO<0d-p:YTWsAcX]<LQck&j%\f5Kr,ki;c[<-7s:9uJ<*!,sHMU0Bp8\97l S9O)NZLE9Ml4[08rLi!H`6k5=(G#8Hha/#)-qi_)sC^=FLf9Z0N,bK6s0.jJ;(*%kJZ!'E>!GY:hkY bb;+@#u77]-5OZLfM=LrEJHBE22`!V\0EOTZ#mOXX+U_*FBV;s6._7"I3^"kp-m359ScP"^Ea@KkI= %D]_l,a(t)]?,D*dqbe?mXT/-8Do[pb:hU]:;N5Ve_bjaI^s?<&ck]/$^>!i_fQ?)'5G').<:GT*f2 g&nFZrJ^4QDjJIO^^3U@uP!9Nt@!Wk<RQjTu+Gdlb7+O#Hf'EIbNe9t1aMYP\pVW3B'!#?1mNKUrg- rOGNU+89<<7?fpS6)7+=h-/CaT1L]!)8TCUqk>0+CG9m+K,>A&ob]gmOUU-T'=o,YIOI[6gGU4"*cc `mb'cS?iOr8I53J67YG%4E!@;tTe"#eM?;QDE>=!PapHc7bQST.hS(*9%T!2O;#h^IQiStXXZA0*dA e072#StD<%ZPEe[elq_B889C8A3ddZ;6I@))ifaXJcj$iiFg#>,!%TE>lQ$Z'`H5R!3nD?bb<Y\Gim *%41N=H$@_2N2aG!:c0PUC-WuYG^:_&C<fO`f:96XFocdJu?]=JX\b%@%*KSm%JO;jDb4=V[Hm=_8n WT%LmIZ`)ffTSePRQTrRQh",j0V8_sG$055#I6G_s^`kh^0^]TCR1U>%teRpk8.Vf5":sH8`ncp2q@ g8roLG.5T>Zt4unm.SSC"$nLXi#`ldq[Ib[3HN?9sk5Y$NpUn1Z/>-C'cj%-9sS]JZ_":jFO\\<f[U [BRgkF!>kk#KjYEO_WG,eMi&8^*QG@-pu-)s3j?6'Y[-a(X@cj8@U[L3;XJiL#@$Q</tuCYAdo>Orl MRGiQbV@;10m4#7pqTQW[DjIaECM0J/I,Y87o)""qBm6k'W^=VUX99k:F7"P>30n@L+L#&E!n7!!$V 9F:b.J0c$42h1tj.KR?.E4.!(X+LD1Sa=l\aj(23^u]YlZd;!AmQX..kof(QJVOHiA?O.CfssXY6VG +KO"d5/$c*gIT&FINgCmaS<IH)lc-=h60:o0\Tm5=$7pm@(A?-!O)#s`HWW8Ce.hIFlYs$B!jM8<fU +E)MIZt"$6W.S$<$?aqW<<26^q>c*3@h8qCjPpYPBF[973,nm]o3FF^l9I-L?LBK$OC,Jp_=23b\)2 S0-Z[W%VV%"rNeNkp)X?%n9`7*/:Pc&fu_CqSrA#FZB]::JQ>#(U*nA,1TDQP"Rcp'aFYkX#-,!M-p 9T7=r@I@cju^a1Kr%^[e#O?\71UuN%^Q'P4kpX?AtCegT3knZQ/c`bV)'iLF$uu2-lJjn,e-Y/>Jg= )k[4;M@.E6YtP8*-43#CP#hW[!uC3@)5sfTa1QFO"kLXK=<[7@9tk$<%sZo!":5-\o7\r6K9I]gT?M 8ZX<=an"KC?P!\O:[5f!8b,&%Zma;>*]+jfUB?j&YeL.N[+E,[0Us"R&hJ6AO#n8f/65`K[/+Da^2S hBDXR>W,Hdim9bN9LCLVB%:Xrj-CO;7l(sM2:=OKGX]*!!DF17GPi.&M#!R!5KF*$OVCmG23=[8J0l R]4lB+WTA5-%0UUb"pF1/eQ)l>#lk&3TNAlC";$=c!G-#N&jQWUjK"NA=`8X"\!G3mTqasM@?K37=C Tr-91JtXCVf#K[SB6<%1`.8:`KK[jTsK^!rsd1!(A29FYYcZ!,>0L)JEh-!%'rb846:>".TB;TT\Ym I1?6_5QI;T)F0'D$6]LPY%OTHK#&_C,*3.fYTdI`-a89;!i2p9[Ra+R!YBpQZYgqQW&YeK3BHuuMq5 (#2MtoG0,XaLfL)cbZ0`O6e-Z!L2um%<Kj91$Elj2AAKQU%6XA5Y6seBq<b@J.5HCZ8EZKH+[(m(66 NFn3\,a_7agPmA&oBEVRqK/G.a4[,*gl;V_>mt@5gT^2gLV%34q"]Vp(jCUIa]@6lr?CZ9!f3"X-6^ %eY*,=$p;YmU).fR2Uh&k6Nm7-.[gEF>!MKCHVC8qmt?r-Jc#?RDReJ1I.ig0g3WR*%IH2]Zt2&A^; fou%m\YT?j=?2N;bBr?mTHZ"=t[Fe<01OOiq[(gWO/-*eDG`>X^+BFJg<?`IK4G_I;8T$*^N?L:2Da #K+Z;gMom=Jg<mCJ8@,MECg)]!7bqsR#^P+^c>L>!.j`aElh8?M;A>Bh[0K8Q!Enso(l>@5SuAMcHE kA:[pX*\@0'N<lEKS["US^`N>j:K\kP^B&5ItHG!*i_5np<*"CIN$ID9!-3S\rh\6&U!T%!BqANj"M Zs`=L!_I6,L&25O)<R_Mr]g0:q6RV#uIGEd45A#1k:r[E]l^)M(NII!K2MI["j=$[!Wm1RrjBPS;]? *Sgap!V:^;9TE,11Ao;PNX>)Fd\jcu+^eYOjeZ?7dQ/BLbnJ>p+*-0_c`%]o-]E;O^@-<[2S5H*_kc Ti!,Gh3f&dqlF!BUSZJ6=i3?*NX$$`oX19F2:"LB'T&G(^"&<<;%4!<?),?J'fGG6D)`,*<!!JduB# 3Ih:,K,q1IaGCE]O`)EDe,W]@)0@!2RZ\U<6KA+T:]lLk!_,hckd?M+*/IR^$[eUtJ3=/n[gBGW+p4 o:q%:DDFr<nT'AZ;YdY<ss!5Y!tAo^Dp.N7?riA[ro!Iu%G+T\$.On"gSqNhkG1k<`n-9]ej:F8Vjn pWn*g-@*"k)H%.Uf@puX8s%H.o$?56&BRn@&ms+)i3>R^_B`k!8n3?k!.K'qreK*.KWEUVKdVr#f+Q 5LR.L*_'+B.I-5e_L?GUT+T_QC40ZC&5R_Q2>&FmR%M3lqgdU7(EduA?[R>Pk7=Xla06F3=!@/(:5a _VF+0Y`lWF4$QF+=?!^q>b]Q!n"/JU*s&W;Gj(E'7*>6T":]4WL+lIG9OIU+7uK1.40l7g!Aocj!\M ^o[]feY57g)e)o^YWr382nar^E[5ObD9-3-)=LEFW:\\?V+H3AU'3]YdXn`3+TT<oA=^o/'ea(J(JT .*6$+#=U;dtAEo:'31*ngY50a38Zs>J\"enos(Ihb(GE8'!^*?;O=,4g/r,K2^N='i'^kr?=fCl"l> m-74=?t2sb^genEp5hSf]>oH:?kjuYlej^/rTm_55=D%qQe7CZG*)<Qf/)PEW?=U!!n,UWmq]8"hOa :5d#sO%krNT!!$?@m!+;V6?Ys=!*B84VosVkZU;r'X4c`Y/\p^('*,fQbRPe`>a:ju<Ed]9S@jCNM< R'jIpDaD!lor7'bEqn,A_-p8Ust#[%r0(;qp87ooVNH]QBVqDaq8[`+aNU@qlE8T[S!KSRI.H*WZ0? 3%tFq@&60k+n_\pHe8I_Os#k0C@a(8V_?s<+rmGT@jOAmF.(q-KEi+o[]fjrr`QH+hV]de[`.G<FJ) jpNYo:oMBZ1#!uM[(GB+g.n,*0dRfT<+[1/82T^F'*$qL@4cU7sh1?e32\]#He=g4tVLM6nlr.#b<< ?uJjpq)$*"&h>cDu^Aj#+35M2alKX!.9"RA8FU<2fMO3i3T'YkN!"7$TZj6[U?OoKC1>mre5D;"\tX /3%%DhaTXpXG6656ZEOH%mZ\0CZo.1\H,/mDC+FpfPmDDt!Po\1CIA[5+I$Bu![X9BUtTQ6Z$1RoO# $'0X6W_49Bc\F:VHCHI]F-nnffsI5_PJm"o0<3)0is[S,.GD#F#3"a9"ZSKM(l`<qQU%eRS;S+7!S< cR@1o:0m7Qf1>2eaV+s].R4Jc!-*Mr>1.R"8nblBS6Iop"XFJkoET4u#q5[jd-Lda8fP[@7g0.u61= mT-6W?l,65\+Hg%'e2p]/IZ[(E"PBVA%>[M]IZ+U6bII4/g\4J#W6<F49.t368<`*`VJZT"(YOVSdH U]qp!C0B"b:uZJj)i_p\kKOC8D((Q^;,>%&.k@=_L;YBR*c(o;jX^s!A$bI%tMDAlrXhi+2Grnq"Y3 3%PTL*"q7T"d3>-nCb2c>5[UM36.&;0BiAfH&b=70p=77>0E(l8g48\^EHG-'^7pPFRrt7tJ%%hafK =q""P@Ok:G4+&6q&%_6","d=9/%,5hF?YZ,#]3JI-iRGDZ]f5T*q62LQ[6USY]HNZi@++1lqTTF9C9 Q/3sni8`Q75VVs28_p;DGQ6]M#Ho4Hqn@*0EBtQ[TP1QIAg)U+,)gR"mLP_X;=aC/jQHDhh\PUD=>9 P<]A\f9Z!d(aoVmm&3'Z\8r+M_kQi-YW?WR/aJZLYP&A`eK%p0!bHS"I['pUTM_7`gUJSCqaV4Sr9I a#P&75hArW-NMhQ$eK1!"A9_hW.V(WXo*OmKPehlrU7mB)(!F8$Gs`_9/\Tej"C0ou3BuQ$s/clCI$ "H@OF/pr!-,*<5+Bj,`]p:El;);QmIs+%eDCc$sWgI%`7XD>51X#6pQFGh)e[rmc8Z?gZIp"b?09n+ ZgP'nTWkLb^sm4^XO2Eck^W&lDI:<#uGc!loS&!&%XUZCp9+r;bpZ^W8&l=pST=!HiYq$qM):!?h`p 7g#nI2IHZ<"6p@Xi;6ma('-WBrpg+[&pD&$8:]2R`^^RW^W\>kTF4j(7M69J&%G1jJMs/(:]sCA4CB G^bCq'3i"6e;GQC$:'.=%d!,]L^QoAE(8Dk#W]$rpHf[bXDe:@/0J=!\a'(O-QaPG)jCk)\.p@3Z=^ q'[N"G5r4Ne\&DE88M>d.9C4CPs3h!8n9$$S8N"OT9<M!<<Fh!/TRmnH#F=I)=US#!@L29I/Sp/:r- T#iGtTJfm<*pj-b."%K.T]EARX"!LL>Hn+M*>D;1HJo:Vq&7N6P@c*0!I,Q8Eauo`rN-_EF#NgV,!e MOM=:">HIp:icK.m]0!!Rm)a8lVJ-NONc,MS#$BJ7a8(`X:[2fWeLTEJ*__#Y5M(bjLZ0?2TsfWsaT ,_iFQ#?6:o!$4C7+9:ZCSKIu)!8e+a:u`r(nH;#-j1Got+9J2H;?Ybf5JXb@3ml*1&-50$*1V?V#+, JmL7lRI%=KHg2u!i"E1hmeJ5j?8%O!n6@!#/B_'tMh`(pDb$/jEG!%23MJ,s19(]\f2!ONIV!"a__= >UkFn:UgM2]g+ZG6-b_(B=h_!Rs"D5VI0Za:]6g6Xp-R$5GfV,68'G&\nkg!Jh[,!:^$i>W!$WDY!i ^1_,&>!!"tY9$LCm'fc8VNW[WV/-,Rl.'imZ2@I<GUB"CQ#s_RZ!&-8+%=)n>)us:'!?g>@!";R&5g <7K-HuO`+p\/kN<#'h#QWW'>U1'^3R-$n[LbPV8e*HC!%\co5kOOG*&E#gWH$[d"T^l(&-*\-+@']B !d#!4a5Wf<KE/YS#bVoi!9Sn>^t]'4X!%f=70,@JJGZRqC_?mPFCT,$"<[bJZOj2r51DnqhZNrC"#( r7kV3,=$R#LlKhI,!!70"g_+eWT(R-].Rp@^<'flEsqCho:%g.>\,S5'O8X)JJf/uq/blGQ3$in,g? IK]%;YJS$5QIl("MfFq6Lbrs^bA%SkQJtY+ls[X!45,pE$c8!ISBhs,np?q7KMGo'EGa>!O0[J>VZ< k;?/NeIZdCOaqOilN<*uG(]Y5/&FgG?1^3qP@fV#b#/DI)!9=Fk!.]+jr&G!IQZ)r+2?uJp;ed.,jM <u(9-aLp9EGbg-ibS\X^]R\#mu2iUAuDn0nTP3g+34N_?(iQ/-*?&!h^8\!6)kXJDr*[+Mr.tc%IsF #(Y/[<>'Td"#0!310.*q6/Y9n$ik^s!2):[!*$i9J-XM^L;W!*2F'e8ONT`d.`;G9,s2/tblb2pC^L 3Z"/$Am!,LR;nGn(F&&9Cl!Sdtm!*T@'Zj%'AZiC,O:M>E)#QYVQ&3t'l6i77k5m2/V6i]T+'([JY7 2!Bd+T^pf'#8$$!?d74^a:9,j>7K7=""*"1_P=I,6:1G&jTPT!Pf3Z5kZl4S2V*HYV?/d72(2V1BHi _'7`>(!UPLR5[Z;ICf(046pguC&emU,6NIT%'YnHN!H9k0^oB[$6k9u^KL5e$1_bI@8-.d,'S'UZ!? ;XcJ0%ViUbW\#`_li)1_meY<rjQ['gR9?79KV>N<M!^=9((."e]a8!6'Tp&DL:e:sB/_-X6XQ_?KF# AH:IY"s?QL!$"];!%h^]X.]aU*0;EHJHd5iBE55h#/EQ=!76<%TPeEC]Z(.p-Yrb_c3=85C]LHY#-b @K!2[mDY\ItS%*\u!fYB'."8oq8i.N)cDSlK;%fcS7+P1]86UD##96:.nTa-)`GQ<5R#EV)n!&9*2: s+"_]8['26?iLXK*MB.GQ=4l#E[DZ!%*[1E(G3RXb6rKaER^'K*SVJXBkqD#8#(+!'&pB:u?X#lHBK `1O]=Ubm0?ZHiOr,#69F-!9sao^h\H#lJ@d;!lPKj^hsee82qd.-PZ^LKd)%1L_bdH5_o[W=GQqtKF "eLMu]U1C@en#'N`NbOP>]oc--GI9T/t>bQuQ]O8pU/#uKB<!/1mh0NjJ;g*$dLb`DhB":5XoO9#4g $1Q#t!9-HSE$pkM=$d5Of9?8&64#?nPQ2[4`uuKP1<<H\:]e]q-%NR(!phZg5Vl=?#W*hm1/S,F2^Q 6hA(['"!0.AIb%Od$@4,OdoJ.`n<b)9m2C<rC@fd&P-3/9u!`Th:;$VZBN)I^uc?K>*1E2WE,<Rg`` 68>1h`q0jN<X>KBE0I+#-c:!!':;hJC9)N.RFC`fRs7tN!KDJL]Cg,Wi.Q4#o5d-BE9eE(OujT!?;X g^^e0]UbWoTYgEJF#ou:)dfF-9*C)5E!pk)VL[rO5PQ8=#$.)A5!76<#^sGUP.#e?0h+.OJKERsr>Q Cfo$%UHS!+u?=&5@fX!)<ghkC`iK9F+J;L]CQ)#bW2u!3lt=E8H*FX%Wda+,0dR5mSTNKE+)e#ggbN !5ub\TL+//X%`k]-\qb^!fZY5X>V8Q6R)Z^2C$!q1BLN:7u\f0&0s9<#,]it"99a.75FqFL'0c:&3T Uh3R%SdarCDX$j.VF0E<Xl"/*^l!/TV:0ZlKX*<ZN7aZoj*$j?&k5l`B/"L-WK!8=+NYSq0Tfn0K*9 P=E&bm)P=C]L(A#Co!W!$D^U@+]Du#K-iiDL__L":4KgJH5@:#`q3&!4"uu!%ij(\P3?k9S<DnKEuN DL]FE5#Z+3N!<%l`T[&o)H_H3=8Bl,^_'egS6okhY*b,4-',eSco6;f`dDH*kgJ%\+!<j%X9E;[5"V BHc!*9U50Nh3P]ESN>h1u&:iOZHrQk(E,m24#G!-\JMckWQV]1`3$e1`dHS4"S:X>U/GbYS</)?iBB Er\lL#CpuB!&QK9`)8Ep,QQ(_mT%Mb1D7t7:sUZmN/[pi(,u;dN!"SF2DYhn5k=tL((UC"!s*@u-:. kYDHHmPJH[`1>Q>8Y"b77m!5o9M!%hRYX\8qL(1[EIJI.G%j9VlO!8u4S;#rsE,6/jD#(X:I!;JDX5 V&N.FG1'P=II8^!%LC3;pFYa$pZ(X5qPO/KE=C\RK+;M!hdW5:Q*Ku!'aE_SI>L;!f/c<!-mE%$jd, 'bj[G//e\Zq:u@']'`rX\;W]_?^c)@K-ieLN!`7W6!;4S=+P4[GJ&3F_!<a/bJ:qtFpb`T_0bXSd&. nn@,6=;@&cbEH!F.Ju^``^Z&;q.9oah.s3"gb!+9;Ta'`cN]!=1S!5UKD1#W*=4C3'F"L.mgPdMK!> %Y-*-!MD8KaA[%(1]TUj#1,dn2AO#Ba8cb^%=hiC-oq@nL'+Xr?3%SW"L(6m!38QnONLZ*+AE'Ea^b BFNKSqS'EE&]/$\-]%u=Zqn4=o+g>S9;hA?7(`r@^uC^4/&!H:^p$.TA[O=+E9oaM+UdS)Z--%0Ie" 9<P\-ZVI?!<(0,UI$@/39-5:b=jfo5oF(UL`98&;Q)o13ET,^cm;cooh>X0=8i^2A+WS!ZnbS*MW:D GL,f=rLB23H#8O*l"J>d@^`$#SYQ8Wl)A(BE/-eH@^_6PIHj#V3A-N#q;8a+RFZs<N7-"P'7.h'KdI k"1+j]O3#L,K\&B$p?TLAQM1kfn]47Q&tear8V5>[Y[B"C(nNiSpe!^D02<!<7u!=]Y-KBcF(q+K=\ o*@a8%g^MbF?=3P(gmlV5c2mgQ#QX_K[6=Um9Bcq5W33MJ,jhkY]BjKRZ;!R$#*##JJ4W#m?@X<B#U MG5sPEMBHdCP4F*$T63Oe!,%geK'(J5GOK3[+:`T-<RCNpc7%2C@!;&MrnB_LF$G?IL5c>P)MudWXj J*=[6p/d7TEc`@>ECr]%LG4s:Do6!J=70B['ORT"J05R6hJSbr5Q(b98+/0B$g-]c9,\=c,4HR*$L@ PB5@3/er]m["0k)VVRYjkJO"%u#^#Tm64_G^;t8dEP0hAcl9IVae-]a]CdXc3[A+8s4?nn'8TEfY2p ^VBE#;LZ#:*8eYaK$6^nY\R5m(a#<:M(u8'`Zl9E?+B`tMuV/O""_10"9US>VH2P]7$o9Fqg."@YS, cl=/3>s)*u!,r)q*2h.$!)K/RAcTt`'5]oG-V1TGd6+uM,ZG"F*!7RV8aF/Z(Iuj*"qdDHJC03qZ9g [/(ngic4a'(Kjnp*fihf//#H0g%8(1TJV48>l4#H8r!VF_D6tSWQYZ/;'#%/"9KfkS$f`=$m2'l!H4 pf'@iH:kUqN!?FnZ\NgcgPpaHC?u/(=WosS=p*^";4u[aGq9?qlH?,-9PiH[6`c5Y*0E]!"R<mn-6) t&Q.2EmF7SKVPdo2JXm5^jKf165-@_UBl@BFK[83_lnCXR;6[A2j?i+X/0kJM63rXk_.r,'XAJ2Mm? F$DcGTeblp=rI[L)E$3diA-2!nNfAAHUWp(0@R:?.3+6pQfG3qRBO4AV'q3<Nt\'[R2_!SKT8O5cQ= i'LOs,BRQJSpsT5WH_I7g(3Cmr^:4d%fd.A@6n<L[ijt_SM?8pA+3_C'nj!s!'$KeVY5<,&0,rq,SY _d4;?*[@/9"K_^=B\FrjT"-8kl2`B"Gu$rhcB3ico2d0A5b%hL<mnT[9l&3]Xt5sK(6[M&E:!(T;s6 O#pup'/<0D_OBdLE:M5),rHp#8(tZ"LLOgYuMnS22)kiQ'ctu";noaX@`[$MZa%T(Rg!sO>2k'J/,b J0JuE+_.URpX9$##=VM>'(MX?]@)g,#k^^>l$]#L95SN'QN#&`"gX':QDmWNZ7lbNre^Zl\L4Vto$8 [cK;1u(P(b17M#%XYMHG%1D,tK!OL,(OuQRfk%BaZ37G-Q]e,O.c?H9"iUNeJf'$"=0Y!!f`6$j#*O #[r^(9(IZ5+ehsE9hqo*:M:WQ!68[_TGZFM-34ElU?>P&Pcq0,#)a?a]Sm99N`9J[I%l7Z3"VJX87@ #b5f4-5>:;^D=uc\PeIj>c=J<Mq0Zlt+']T0AYiDQ(JcHoY8%;8UkiS[P0E\dt4Q0N^8T,#n+Y`hA_ Pj!1ObGD[kV5\o.&/Q9+sIG[G9EUB1h;:Y!<@oe!7Wn-5Ud?Hluo[='=ACM&-13Hn/FWW\cutqgG'6 Ke.n;`i"(<-<=fT>#'C!$.1n*6!_iXph$=")JcL=2('K_`1Lj&X!(oOB0GU9@$md_$4jX_p'<rASr" &fp>S$mG&'ImOd*;aoGGQ\kDkmUA6.(?u@R8Yb)mBO"4kp+6M=?H)V%,3_nAq#A&)^B&"rnaNa8&NU !<Je0<sKS8%md&PP"'FSJIUm1a98@BX7R36+(58(LPRu-9jU)H#FkfS!"tq0qubN#=p+g*7a;1E'K4 _qWeVrEMXjbDSm$fW!%h:1G2WEH'F"OP"-#Vh<iKC^O2umB!Yk_RPo_gjC\!epP<4OVYTsb\+97Hg* Q]++K.7ZKQk\^%U#;i1*K%`B&Y69/B7LI7/g(PK^g[WPC_8o4$1L8L"5ZCN<`%;3@09^KR;roF87gK klkHA>[\0&V#l7_5#'9THNl-#`R3&%2Kl"=^"`^Gs"&P@/$[`:u\m6Q^@/sm'\pXYuK"^g&3A2dMRb (_3&nJeX0i@$a*5JuP[r;=sb6G`fOoSXK!cSI?JmA^"?sQ;W:>:fe#C<-G!>eSK=9."*H4#/4VqqIK 24p$`+oiAo2E1^gQ;$EAVHZ-\,;?9^(KH)4TF)$F9o:"M&+BR2.:AsCJ6$Z?)1Z'o$T3M`=OFMp&&B K87A(0?b(L[)bQ5M:E(\?5Juo(VTE0jgPe_rU)2/OK!ZXh$E<)L3<:p5J+e/\>k$0SBgVkYXFDq=>d oPZ>R&+KDY%/*2!KsBaj;VqPdD1g#KWZsV^aZk/YQ0QC)DG>4/0\j"@0U+[SHUml8ONVm$n*M*&uU[ 2%A6S?(aHi.-Na3Qf4dKH#0\/1!$DIGoM"`S?f@oe7l>r>J;fmrlP9rV![If;`@PstS,l+2'_*#o%E [9Z!i-/X#)g^QV5S2ub,Bu3"Xhes(TOEG.-4'Q110Zll\hCX=WAu(StR'[j=N>rfJ'R8WeUfan>McV <t)'#I*egjW^V^SCa?WLeF?^m9<<[^^^$qLAVqJCQ5Tm8dgj1o!!<l7DM$T0&X>a=H9Y4+0Lg7@7EA $j#6HRg#Us;>/qB4+Wp^%OAuN.6"PkP/NW(H48HA7N.&s3aAoXm>#iCtj!XFNi5*^K+6s-E4#d=L7$ jjHg[^r?Y8;:lJ6m+KD]%?'iR.)KaC-r"VM-nb)YsbTYAWS#D+I`Q8IfO<m_Jp?Ne"C8_#q8TeW[\0 _+fB&d1;EcWqZu^h#rnmn"W1(!)6/4Y=V7$_W^S=55^`J2+=eA8WbMR)TXRcT/9=^?K+b9Y'*:GV1" p$6&;;cmZYfcZ*6nnan/)ZS2-4]**ukPJd'E@H,cgSNQlHh5<id$j-n><K)Ngit!,lVJ((_`7XTD@F W5OF&5^5^!4K<g3(d^hCWqDKq5o83Icp0fN@]V(16QT<=^]SFBGbni9(YA_E_-)<kq9d+q^+Dei5T# (W0HC9]O]VFE+O1-KY]g@)9bXtN`R#1fRG+HlEA<*^+qarj=DQC_^`5T>RB$U$(f14'X%bhZHtroe# /FBH"/..DO9$c'fnGb<N2cmS)`n$ZV62"m7q,jo+9fdN)S;F`8q8N1'+b.'TF_*8KHQ4h.,cd!&fFE i6k7;?UrA-+ZkT2P<u/X^&5#==JADA5-7T<_i4H9$^alt$E=K)jM&O0sNY[&uO?mrm"0b$?J1Ro*1' $@!`gD$GLqBl&&-,XmbU"uhKU/.HoRmN"\cjtlX@X8mJGi*SG"a,bgQ9+GXr5%NWgKfhk1,LN,6=^4 RJ\33A?RNg#&q:K!;?R"+L+L="Oe\&%tkO4!"9FQQB2R7Rh8H+,CkUb&d\E6LP_*ZEqQV2JNoe<Hu` a_BAj%W-,lp8PeDYK;1ud&a3h,^"b5G@-j//'n;<:F!?E5=JI"fM"]AUDZ1>"7Lu5cm"g1aZ/O6faY ,a#aY`ZR!5/8Pd&)m]9=;W6^4<oRGiGgfmU8S230Fd_/3<d,0L+'0(X00=U2,#qA7L7#&9IB,-C8cG r,([n%d:cd_hSb'W&?rd'*g">6/W;2`nIJ<sWX!VXLMX$Ta\)5^^)dj$(r-:D%Bg!?Yhn=@m2[`##a >?M,(RTcGd:h07KRo&/I-j/Wc92d$LEq;!Aq#._ZTeJ"9e/.Z,`piG^odQ7gfG$_\jd?!^H`@#3#hp :`!Vl(441b=:?)RTJ0=S+rMN-#"TbM.5Zn_&/oZ@\fe.t8o(C\W49>gO2.-e;K6l?a4#_PJ796-pd# ,.8<-;9ObJb#_TL(F%tG`m!-nUYb-"GW!8n:h'c\_cgV!LfeA0:Y%+&Vd!&Qt";$/\JGsMmM+U>-@f 4*!E-:Ji:]p9Gt5Rcr`%'p/]2lFqN[.UM0+j2IC9rng0!8%DISj-%l<%&bP)qm,S+/8uuAcOMV98c> f@1WHcM+DuJOT>dh%nT1u&L&eDTFMM]0n;P5dUk%e.$JqqAtsa.5@=u&%!R@hcjrNG9<Gqd%n'KEKG IE0<EDep.fp+6U+0r4Ek=/&i()#P##r!1LEjUP#m>1c8XkNf[08g=A\0Ys#V88]R4oF9(P*b5+A@e4 K2KHS&m,-s9%EV;Y/j]J+i."]e'julm'Wu%#Cnc;$=)6L7A.^S>ckfa@*l&q^sYYJ&1CHWCl3s.$]j \<n5!#)G/4poeES$maB-R:+q(+.?`OA6[`=4U5hI7g)q(/UO:Wgt!*pPL*X%?#HNDep'Eh#Y+NpLQ: R5ZEW%e<_m/ZX0R^EtK./+76*M.du]-P<9(!8,t^sXTnW,FaV"h/#r=UPGlEe+:&H]SgfdD0W=_<+^ tm/Z&Q"Llt_C0TKeGPsdo'&EgI"Ni\sgh'e=Mf_#\fOVh?`Y+3s$f_k1d1>_]bhUijZh=QK-%k^hg^ aPlB.FP;"!En@CUGo75"C/+Arn^[/Qb*)*4F)1CC@'p(QC"ZQEm"]=;to(f+B7dD&KD0Su!0U=aT'& "%qop.f^u$CG"p'#H/*c"e[Wd'bm%$K'Qu9X.rp[LJ-=.4P,L+&1Cra$3Dp(rG)?aZB,.#[0pf>`+' Xo;+H6(HXm77KQN+fNO8mSJRR-8(EF.mJ7>_a.]s2Q?24R7'8+[e5lg2?3s#F.'Gu?dpWW:6*>5XNe WOeS!D88^(p@t1&O>4/(J8O$&.Ho&rd[$@e)CIBR%T&op&eB0TDRfsZo)^?JC?DOjoAEI%f!F+glDU &-58b)CKi>N.HQ5BMdAXKO-+*;e:I^7^nqKUY-n@]&]\"(\Y%Z7!s,b0Y7VG`=J-7YmM1UK*4j2k9l &40!/p84LdZd(,SJki$1,&e/_e&JBX:Tfid01aJ>M#ILKnAtI=VhmHuu,ldQt*+3#E@'eb&H5K?n:l iE9+rMV"cWN.IbVY!J^7d&b;T%KH^3!)=S"5jf6b49-4kGh"csT"6H5135[qRYr^&!Ma@SeX';EJ5I GYr<3>5?i2h_b"&'pUi[]L8EAYG!tE$H*>3L*.K*"V`e[S<77ai7/1:`Q-P/NS0gl]fnj)EE#\p4S0 ,qatW[C3Q"0h<I.mu\,9+bV8UKeBrKH^CD*G8r_INT;jD5IMfF4Zpf:r_WBr#JY]Yn-u%R$5B!I98j kVCR.P!H7@b63SJ58cYci!15K/!>]'PJ,r8-d`\(]!DG/EqgYjt9<T.OJ2o'2X,O&;=hQ$n,#EX],l p>QL[m2#<5A"WoBo[,!8F`BXDcL$ZdKYO(HI;U7h8iAquCB[33a\5Ku1W3?ie#?A+Aj$]J`d(65Z4, Lo]fLloqV4lg[$N19VOd^+b3eZ?dR47_L\o[L*];Xf*MNlgP8X'!h0tcbp::(>JnD7h;g8dQh[>>-K VSarQ"SI($oE*!c<aYc.#%6$(uedf;'%bJn;DDXn":jM'dAaM>BC!/=Y[&4s5/Aq111"XF.4"R+$_8 Sh90ADqYF^\GV7$O'?-cu0&k7/UZ80>s[bp(4FL+!Lq\-#8G3lhVO7Q50U2]WQSL&HP_fkn`')S7)I a^;_\ebJVnN\ck2-_b($"mk_6mI2;igP3&M+!C&'Bi8i8flC=&i#pd<YKU7IZ6lFb[7jS;&"+c!t)[ m^:f)l3#;'>qV>U^5kp'%D1a^CM+VL8Ind'>D,oIh'NKdIF-MN<Xpjs.g%+5k2Z>XPHo#7ld-_s;1a !1:L!YNj:tL]cs]p'V9g.ETBlH\o%HZG>knaqDJ$Dt!T#HFGgcMP3#.^Y&#MX8E/)bcgWmrCXg2$M> A;^:qA_o#q"*&Do.UL'<LMAT73ErXsVA059PLN5=ka&mWe+ZNLpYPA[eDHisfGFKkob/$i%_:]h0/O 959E(@49pRtSR3+^m[@TI`r5e<N9"N%u*_0L5_i1_`2V(bN<oS]h5`b=DUuL]gQ38,rWb"@-2B1D,. p&-:,jO!5K./4'>cU:Tjp&._iNSTs!R!,'.NcmZt2>G5H8(HMP,LBEW$^m"kN"#+"E1(=5@df=nT%= hj8!3@(J^hV<ugbu!'1GPt3&g5GL;b>n%$p^'p,X*sk^b2qne2@U53P<T^!42k1YfR^^X,I'u8/M>4 @3>.VkV9PP!KbD;!%L\DOA$>g.#o?KFf7)"^j/iYTEXjo?gu/G!9q`A($&ak!W]JR!5pbs5].eH#Yu NV>-nhD2Z^]oK+J_"=%"YC!:ZA`%9<c885TD=ZFCfF!5T*I:gWQFFPB]XgEZb3:')!M*!!%`!O*'[* VlC\3*?pqc]_"cdguKpe9La[%04#!!3d@G!5,"_&-/d9,ABFtaoDDPVH/p/kR-oK=&9XBAUd#t,6/9 2%KKJ,c:@qBZ'7TqE)0ij?t^+A2Zc6'a[!4.!!$KL+\jj%!(Z(+*!F$m2PU91KU/Gp_a5aO1ZGBRk5 YLee%m.A,SL4Z\n4LA&gA$Sd21k!"i-Cbelk(0JTCg!11TB2:6P\-2\\M16NOD&gS4"5cPQZGK)ku. ,QNs%!q7E9+V6o6+KkVK42ck5910;ki[jUl5QF@c6j"Sl1l:0*+r0%2oO.`M]T+`JJ74(!/Hc<3!,t 3%3IO2/:]SQo#/Gj^3\`N)!(R\'e2Is>6Smh[:QE^:V&]O9-r'ar8B)&G!:aIN<"c0(S5DjsM9'Y-@ -%)=b<uGo9JcafK*.4X2urW2"0fs2!.N/pYd$:jRA@=n!LP\D^`4"!S/SNJfjR#p"Q[gF;jQ&>gWTW t&.]'P!)@2k4U&"l4gkod:L.B0[h*5,!C0"UbA]9?J9*CE\<RaSLl<_l!0>>(&Cs5iIDI6t!#uORJ9 $%e'EIDf%ODcVL]EG90GDbj4jAB'-l@[bgen7r,QNWpE2*DD%gp+lU&aP'l4ZOt'9aG8%RZF"((\:c /u(fH(fEX_1BBlWkp$)q(G[lR^]Kc>.&6p\PQ1aNKb-LeQm4j*]?Q"SkKm'/J6\ThSB/ahs7#1cY'k lh<(X&#"9;Ju4scR!!(]Hs9KAb8etO#r"NHW+0MF/h&O7-9KM2B.%KaGu!.:ru3IF@c!3\cn0OPFs' r_5\73RNo!.?6rF:]/%M>8#;RG5Qt6JGHq/AqSidQ@O&N0eSs+:(_u3V1@/YLAIq_pgXGab0dN:EkZ 2J;BC6J-ZLtElUGH1(4/)df?=&'0n!F!O,B\_QDbsd$Q.H7T1\7)\>8iR3O6r[3bde/J\I(!(WJ&Cb l!#=+ohb!;!.fj(ErDEI]`3#:r:1EjAXDlp?b%7O/Lm5SD!YoEQs6"%Ut,$15o(Nu`3==:itX]eb%j 4^:MGKCCie_N2'VDeqVHB"Q1_E'7o#]qGfWbQ'o@N,[iF)$f'p:Ye/.`fHNRgclL.(pFKY"i63=OEF `p!5KF:#!<%"'R\sO5s8+A1mG5s62=>4[J:B+3^?,qK"_79kd6b,es[G<!`0Ic4B)I,BeV%;BVq<QD 6B;t;"OMLPQCR!*Ir3?5\ttgA,a86ErZSe1q,P@Zb5lde!X'SjjO]>bu\rmO>R,&DZJ0@n9E3ML^&M 6g]>49.J.S0!*XoUZNbA1067I#2^\TG1YjV]fZj=`hCJouc,Jfbi&=^?@Iq5r2dag<5T;Cf@QjGfi6 6*FcGgF2YnC2$T-qmr$L'W!cbI]r83:,KfBi!GT;R_!Ho@TX/nhG@!F<ubo@gi7^WdLEdO[J,Sn.or )7aFPS0uW+M+p<=F%Z'/e/Pf-Sra[L"SL+(dhB.70IZ8r'+mEF5T#"VF?<-p:O4s\6#<m^]Pmp8`Qo XE8m)fB!L9YME#m``1$/B?5M1W/cu!A7-P-t["s?-@OJp(qfZ]nI_!L:g60[to'tL9f&Q.<,27$3-' Z?DY/0#D'poHYh)utcY$j&iC1J\s#ES*Ga#O?d:Qp(kajLK'75nA_T":&U$^F-`=%mA:C1C5N;!ROn U)\D:24A^S.N:c$uOgBi]c[l.$5kL!?-jM'6%)@"!$m.hC?itA>(_@2H&24>@5RB+K0F*U/%K/7Nc] U**Gs<"jW0#\+24lp11D2i2+$*);ffV.P)_n_l/.K:cYHr8B0k\_uEm(QXbar'p.:eYAbBOO#[.C5h .!#TtCj8;so=o\BUdE'4!!$\a!&pmlHp_N[he*hB72q;lNY>,!_9arZ(CfZb4S=`N/.Vme0Mj%7*$b Xr!=\pGd*Q#f*A%Qu!-=7>a)r6GjR\jd5',-XFMQ:5^s#9`&hjJc!E['ZYX+$Fdj@k`pin?.VDi(;\ i]E/_BJLFSBM!7lB;98"uFR;>!Z*T-;p:][K%#^(9gE?d[&501C&"&[<'sK'cBt1JO%"Gj9-aKG%$r 070s860QD@RXVcYD&8%qU"9C2a?ib*E(XSYV!E9%u#'PeC?iU`<#5fZTLF5-a@&"@dB7u9N"-Z74VF a/ghMVTEGV!?sM#1XWHSUf*/39k3*IPZ`J^#5>P0k2Jn9leY5X475huGfn.MfrC'+4#aV#`Pd>*n_j D;cP5%jW?RVCS<Ae8^!e7_;6K,1f+g+opPCIS?cNOjCm_*@D*mc"/aMVNBG3)A't'pVR-nK\R(g!/^ dh-A4-Glh-i+DZnthp)-#801pFT*@V#Ra`/!r=9AnLNKX@$$u>o_ok$T>cc]8XN1"/sfXp]dLg_RE- T;$5eHj5CdTKO'.mO95!_?Sc$B).jn9u4/$uf*a&l**tP(#ZCJNu:V@/L&pi#b3n?mY:L>A]P%!;>8 -MOBi#YlHHX1X.Ku!!q%UIk-`L"N.6W(OjFPVM7,oHO5bom(iZDJDRY=+MaFgbib&&&.5,3-E/GInq *uQ"H3?hF[4:\gb8I/*7;`.#A/Jn^jXmYI*6]<$T-@UJ6A<p8MFh263rdZecC;k3W\^R^b=Gm$a:U_ O_QWQ^g'8n$A1F]YLWu3AdCX'l73,o!q6?ncU3-NG1P3O=d6WE$WfSI5Qka:o9jhtEnJqpN;Ag&KFL aCEb^U'@i4"!H8RtgWlZgM=KAG.flllpZqDCtV[<VN9eV/o/HT`qAeBr@>.tQP)C1DLRmkLXE1gK(! al3<^jr'eh5J:#:Z)=<'0d$0Q5V=ZI;R#Z((c\U;,b4@kOj-Ls'ht27;:./B`h7H6+1&iEKCtR5^^L o>Np2D8`Tna5`LI6M5C3%K&rYWX1'VI0K+$j)?g>\J2JbqL^qeI8-N;`s7nU((W=?65^^L&XTANr9k R))WYg<Gl7]rT#Nc#f$jeEHT`Jt^rCD`M^==#5M*-n3>QE>D`-26p-??md5k#6`DG9L'p$+$70-^I) 8/F[FN.I6rFgBS$OfhA'q$L5)N_'DLfkfb<aAeD]Ua=T/:9.`lKh@:WTaR5K19`@%[Y:NWcIj\=+5j >EX*f(!ndhZ"Z'b:9LWQlJd503`$S1pW72Ro_<lBb7E-sLB[LZ6[SfAs$Rb[Ul4E&FdI'U!g)RUI`^ enNWRM#`]=tqBEdt\;3UooY*BpuSU:W6do*EsonWtbhoCNCVi^oe,Mbe[NVLKeFCTca>tk;W(I#57] 3#S.I)N]6cTBS?WjJ3s;n'*Nho1EZ;o_UEgE(HeM$9OK"\8d4KR!$Kl=f*+HX_nFP4ZEicL(M"$Y!4 nK<TMK`^"r5<48Q*AP,lhm[[pA^C>qD=cJc-;IKQAobWKAFh)S4BsHtlVAhuNh^)@?JX9EFY)'EGCs !H;',_tTjhdn=XU4]IbUieSK]0ldQM#QWs0$Xl3k"acpDnE14*<Isoj@5^p^!/(p<&-pjH<3U+ZFip C`0[U:/+ED?U!;(t9PZE#nV8.7?&1&2e3!K@)Fle!2#=/@?@58BR:9"+)n:pK&;uAk]UrA!PRQOQ:s +?)@(JMdV`/c^s#`(6%4ri.P:T[QBfGE1pA+H0h!:2HE!57dS4f-\^*3^Y-S\GlX,6ca_'p/^:F!Le [&,_AV)]Yr>g;E1q4IC?0aTuIIbE0)P$AAK^dHp].J=]h=amA\>S,#OW=\IkFBL)GG3D2[S%j#"mQC <o5!8[J?4GqLnF87B2V%;Pl&G\^##O(dG,Qo,8h(3mL)mO!3o_H!Xp]_N+q/DpGoYghFksKO=7F:aU !NP<!?o#n3#Uj&CmBclZpBK^H/5m9[69k[0hsHFh"<UV`(Ph?k8i]5XO:.l_FJ#Vsqn7IY!&/L9i!+ 9(bX&)90f,7Y&K?RV#=R_cfa7.]5JL"cXnl^0$2=SI*5DOn#P<"YH3>UnWmc@pSth>jF:*$3Oq?NW0 \8\V&0,)0QU::=mYO5'bmB.D4oM<C^CL__EYMJMkqqc@^_?&7VnbL3&I;[dV8gHPLWco5C@*@$!.;J o9J=?t;2oY)bYq(;a(Wl!=,@Z@Y(-MQ*M_QH8H>ucChEt!G.&FZ5^$\*-NMi9j.%FsJY,%/O<)M;"2 Ker)X;j+&qj]B(eSb1[nL^7FhU<7cICUf)"P!]9!Y,SiG-.]`J>\3Gsk<)bF_89#Q`Tu)Sh3#+h,nS abI1-PB\tj"R$\f(u(^8C_nE/F2<^N8l>[9%cr9CYr)NCWVe;Z$S]]/C9DBg.k$?'i`+#8?<_d8?Z4 RNUPQVS#Fc&q'5O^O!\j*Y"=csb\qK4B'3F49V4Q>,D1Jr;PQ5=2M,c.+VbFn,'/m4qBS<R(q@0L?R "7O?\A+RObJ>8S!&;Ru+G7'&#Y6@qOQCl3bOVB.o)g]R@,f-^(A$fXJ,tJT@X+OG%`e^`!!4k/Xjaa b(>ol\!2%d@H&t*KW#2;)5@FRfJR)Cig]8!IpN-R,jF7X>?j/LnPtaPP#B8bE6l!M"UCR>i*Pdem`, kuLIbrkJ:;J%4&@CL\jqQ1*CJRiY;h+j=3Dk<$%OJ;!$>)Tn"ulbk5dB8P3!BN%D!2!]"U0EHbQK'M $MPHhPg>)!!7]s>UB+0r:<5i=*NKV;"*]"FAH:NU5G/L\7a"L/U`Hr#*.AGMPXBuSi?nj2Ar!P:L*$ QX'-,jn'a,i`*Nkq!#b7An16"@tE.Au.No,0J?Y8K!F\*<@\6BLUC(#P35_k$Pe]1PW)kl7U#8T"N9 cqf>..3H-.*OZt!fWE)PU^8tR;:qP98?NCAEK-o<$LQjk0*O4cB6R^**f_@!+5o``>9H)#qVs/![%o uWf>8H5uu4l0o,lr$EQqP"=M!Pmi\Eo25(:l(XKnqidr!g*'"sWM5)/e3Fn_LF6$'rc#JMC'A66F!` N#f;!^l8c:S)fq)`Ig(q9Qr0R/D[8;VRaXq!SW"9o;[<_MK45ukmTL#^]S16.fQ>b?9Dl[gSGpc2]7 >3tGHH)iWiIj01=n\O!5"QXg\pak-:W-(u9XLVZ$g\oN=`Hi:br\4[$!Q0F6i2(E8,kV;8B<-'jW^] hqINed<6nt2:"STB=*ePR8rkN!WR3UaYq.Qq"'*Y<&D(6Un&I:YV)J'R(/O3+;TF2tte&;-43$3Nud u)VnG>)?H5i.WU#0)XaTL7nu/0^qr;m?]r)c1hp[g'W40FtDI`!?:M_`\(?m9)R_^h*,Q\KZIcB.6A `6km-R;p0[oR:cM+0$k42g`p(6N&<-i$O?_Ja&c7kAc[6"P3`bcJ3-#DUja<)Kqb737?&rI/pNm.F" 'plk2#:#KIu*_<\"EjY^;H8@t;-;5jUi%Mg?C!QP(Cr!:fS`b9mZY:p(#Lk5`)NrWm<^7gg'PRIfSC qIb7T!<[a-IjBsn!4D,oNJYR<:I0H4X$c-aH=S(L(]`mtY7:PW@KCeY:7m("07$UWJc-S"!,t-__(- r'5p/#rI"@+<!>"5Q?)=9[0G3Du^g/"R.fm)F&.jT'\b?jri0Y0"q1+XVXLIB3Gu5WUPUECBk.nM1> k'k;!h%O'$p%NcP],@-6=(TB#borGWpuQk+KIsc;CsRGg/e`mC)@!bMGkOMaOJr`?aOpc@.l(cF0UA J3en8$$'(pNm+S0=>Cq*-.[U[JJoH6%Ni?)#>en!IMBM$63&P`NVs0b_N'<Z!+=Kd<DR5fRV%\39XK 1W,^mWJIn*8$+YYLWa!@s?Ii2`4G7_m79Xk3Uup(SR&U]Fmp(#YkakEL8;mR\gZROcn(#C'IX5UbZt &HJ[LC,*&q+C+ft&r)&UOI%E&1>T^bqO^NZM]-gYDf0k4!+'g!?D#:%deSj),1#U?qp#\]8*?js%&, &M9^Ypc;SksYkNn5e!LNmCJG:E=cn'#6dOGuN!hr9=!/J+_M?;g%T>DUj!,rFJV5M.bZ`oFQ?@0Tj+ R.!e.N?to!$D<*H^!+uTGq=\/!.:X"PgKjd(+)TT=[A8?U<s%Z@:*(M^1\L[6F*f!5ZGmP-(W&iW-* <3r\<[40*,/LERW[[Z7c]eV&:!%^\Li7(]IjG*ic8fW/>cPNLhNpV*u3*V&Km*kdIM2Lrtg`C8?2KY K-S9X?)B]<8L7m<he0Y-lmJq"o(%ej8R%!&Upe*sBSKe@osk*RT1KD?+2JJfo"R!13hdqYD65)!^*H `#8V(!Y2jc&>$)l4kSC`!a+q&88EYcln2ER?"A+XkN]\ThS4!uik)59_Q30[]-<i!<9D*qk;sqC#P. /A:aUu4=N8&)SR>V&(3?^@OLkQZ5%*j5H.!ZN&V^_HfGngo_F*RgSr>B0XBWid6#iWc!,Xb6ctgP^e @6A-TYTf1.3*%+J7B=O.Yihs!>qtRY(Aoj(`V30$j88+HH]I)"7,"EB-+BkW6gSW*XhBV>'S>[Ng^T k6pM;149,AA")pdj!2!4k=@lUO$ip.>!)*\,5V')>$jiJa3>5NIk"?:bP5q6Z#f$q$!#uUV!18-R$T 86?rV3r8MZs00BE3Q>"opAV!+\)J<.VR(Lg>F[5_Ir&U^$p$'EI&G-gCPd)`kqAJQ9BE!<A8-!<COf !/RG\&X4*L$kA]86cb*:M$t]u.$jp#5nMTM!8.Pg"kDZk:ViHl,<l@LKE34:L`6XcCm+jL#Xn5]'MU ,:jpXeU!2).h\MZ)jUBURj5I8Nj!;)reYSo\*NaXE$nh!:cG@eS8O>p,=:,i6H:Amm3,nmp("TY9A! #.I!5\u&Qn/;U`$BY<R2)M$fj4m<7%)@1Qdkh&1JpZk1Znd*_6K$H,L4)A3O?L\gGCj-L'7^=Znog, L)ut^&!oP%@!.Ko[5oqSCLggDccgNb!JGHDLTFVE\*TJHs1CK4-P:%3F`UJuI!5&pS5_&A*oJ.AFDU ]Ji#cUbQ_/%[[:P&"W!$F+(Jc[&f-ii2S!oP%L!'"Bh:s/\lFeTpE!)u"g*MU&Za99'YMF18W__3_H !@Vn_$$iVRdO[5'_*,Hb'EF#L!K_El&-p!cO8rMl$,A5\jA[pi%0J:+6T5N@7a=7a1rR9J+qk5X[IA ]hit+/fL2V=loE?Y&O=1dL_n2FE\/c-=$34&ce's56!WiAX0E='W"/$AU!(T`bd*!g;dj97&,;bY@A =$6S0K-$>S(e`a%qu``YS/6Z37Qk,9c*l<bpGjn$p$lf!`7#^!5d2.A'Ul*$G^OD,AMuA5^fs=+Gt, <,r+/T1^q/LZf1[8Q_[mH!)*\/^dR2_lo#A>8.6oZ#G[#QnAupU=Abu9g>J#*c)Mb_01@T>cF<i[1e ;(5;q<$%$%Q9E!2pjnL*$^Iq`.QjPVD2M#\R+:i8)3'`C"`3)cfiOV?)cerXZ18!WYD1!5XDE=Ub<7 PW)G.":.,Hd*0B-Tg8Hd]b>.\d>:]IZNQ\edgdrDIcm<4d)m#@RSk_Zi_tD_3_*#gF(g.nV2i4+'4d S8oATW<KE3E@]lAMT)Zc"/:AkIDD*bV`#35g`k/)+&0@5gmn/M_A6]r#Q=U-2T-3+WS#N,Ui\.^P4A =LT!PCM[]5:4_CWHhS@X_.U.n1[)]\";J@Va.3C*,sraR\<OSCj&i!55mKP$gF7WZj(V<aNm,tc>sJ Pdb3d;)$XcG*e=Mp#2fM$1sl0g@%/YXc_L!n!B`=]TQm>$`t//j9)1T4=LhRGrl\LW_a.leqOiqWdr 6.no<L:(#3G\+F@K70gmZ@IZ7/NldOUFu+A=p]$rPAM#D>-fjfmVU"Zuo"_Sb`m5$Ljs;_g-KU9r\^ r)>ji^lWh`rfs/e[@)B5TGeBD'D<uL#Yud8K*+O.kPX]9]_Y1;1$(<CRf2B9$%6JJ7*cK&#$!rU#3` 2_>X1CBr=a0gS+jh!q=!O;<.:d`DsT[@k,Q<'O?bpZZu9l93iW]dH?ASD9E#*tja00[B/9,S=?Tb^i T#=:SF(M)@=XgEC&UOT#?X0rB;d6`E;Na'qMad&bieu3ZNSD.L#s;h!u4%S^,0p9>QbGT+p7lG*<)k TYAJ`V]Oo+bm-Dh0`$4gi5G\S7;u.6r?mEU1jjD>P0Qq*6?@`*d^e0<i5lb3D4qNjXDq,!p5QUe0J( C]6#"ShC="aL$_%Y1Y7gB+J]`CDVTQ0WuNlC-KiLp>r_$/q[.t>DcVq!@Y!<7R>[lN7eqSE_90`Crd J.44-dq.jqYf^E7!%2.5O/+*shmch`1)1u3DsII-S-,r$JjC3t<X:rL*'7j5>Uhs'FSK-Hb0./kJ,m UiJM!t9rb$o&,Yn[Y$NQ'hh^&CTJE@pb3!60/%73G?FN2?8+U:.)Qj&".>qeK/M2VH?r2O12iGXmH] F(;c0ED8H1.Icc$OA2R+FY+<5QbjgRT+)g")H^Viih,N+93X%&;]Nch5:])fdb>K)k[:,rmcM($=IC =[qn1SV&bl^IsWOE+R'mRp5^un!^5"e=3!d(c9M(W!oX*D?fB=?C^Pn&6g2ja<n+ot_%&RMnUJJF0Q D7YJNk7d9`L[`Pjs<4-03m.#7nb!DOLi]Uj"6>5K^nP!3tn+(]ftcrk8*diN,WjC'LP0rE"H%5NrOU ^]LN#$BY%X(oBRH"Siite:6R]pg=#gs#I;QoY1X>KE2V)s!,EZ(R.`4^a?b1W-)LqJ+I"ZC:j7jj]D 5,VJ!ea26<r[SA`]L%2Adb!-OAHS.3*\YZ`q.$\.G+&=5'P&dCJ&>9J4T!9EXFfLnaTgOF`.$iGMeL \i"nK1>mhJ^kR#(%kr0(&fc(VXXJB%-/G(h3=uA7EE=9_$MXeJ)sc,a!<P(^ZUL:.Dr1/A>)J?!8hQ <XR$uO5RQFT#cqhN7;-$6=0(!)"IV&:%7OJUXMP\c!'WXp>t5>mLqQ^>.b+Min;cN.Q!`M=17\GJ5b 9a4g;0Qtj$,;((c_f8"IV&:!irPWs&XZ'5:TaR6fnf?^acGDs-6sM:WT[T]@F-C_A]V:s2].fj;@e- ABl;(XMP>D?hkH9W8*IHTJ/n<X0@3U=+5ifg8&'9.Dr/IdUA>hMj8^A@fT4($A0V.$7kn$j]D5PE]Z V7'HK%F9:eAPF>0H!eLJ!b60;QQ6d\pCX)Q#\J.I`5)O!`)@]rb>8i6S]Hm/97j]D5h9P8koE+.fEr "<NM-4-cj$N=E.(&k-O@ITbTirVU>hka6NQ!`L2b#Rtn3LD(r$7kn$j]D3jZ>RI3O^mlRO?&[RYR2o UJ)sc,UN2%(Deb:c*c7@MK)\o$Kg.%GA?\Z)Ks61/=+5ifg2mP/!>e4c_(S+:@$8;TXPj,D?f@'g&I -"L3PK`G=HaKm?hkH9W8*CE1mLXdE,77BOV3VW3XTW/`S1EsE<)XB#Cn@F!.6O+!+TNk56\TW!Ph#= !/+oV^DG/u1-tP/!9@"&!WfMm+EDnH/jfUm3R?0F/0]uk"$gZ9*=;p6'O6jE(r]I_<.GtJKEAr]'>Q 7(]LMQq49,B;,Y6t4X>@d\Kh8eMoQEM2ogKIN3TEHq(McGIAM0/Y0*D?#Ua#m+G&3.;!$VgOH41d)( Jms5c$_Cj&-1]Z!O/g?p+eod1E$34]8Ziq%d,U7b]_@^CblV#G#6sW$)#<"!($8]$WN/5bfC]&_0Z^ nXQ3l3Ko$LN8l@tOPTrR0!C2$XGM<:`c2\D_Q5ZC3fp!kJp3jb%iucDH3+2hqd1cS_7%JBH&-0sK@k 8;/:Sid_<HU]cOUbImF'(7'!-n"`D[0gn!T4PS$(Wh=_[^SiEd`jA'LVsR&])j)h>X),Om6@S([` hsY(Vk,,;VZDjLN&%"n?WV[JC#/N&B/5AtX0RF;%VIp(+#@nBNLX.sgZ'q_T9cE`4b\,7q_b1"1\dl R(%RjiZ&AS<p>Wc\-Y<rod)jZQHdkV:p2ik\h'21d06G>6<ld,Qj*)JqK4/ie+JHd[%"NU"GHCb.O^ d&S9NBa<')3>%26q,Mu@sV`Kn51$1ndM.fVl%f)&"f_s[i'$XS&;/gC$M#cW;bC)#H7Kkk4!)2ScK& 9eMDTASna<'TQu,UrI-67Dg4WcJ=\uQR\"7Z"3U9FT;Lci!,QPE>Xp9^Dtl@mVERuT%%jCE\)ZiaT; JM*:k5SB_l)aul[1dn:dejbCsX;Se2_oFT'`hjPO,)3r.Z3LI$4;UcQk>pR[u0^(bg:HT;F!<Z[%-* W=ZhLPb-7W_N7p&UdFuKf""I[qST5qWGkCsh*NU0DnL_3kO<23:7K/Hn7d46!Pm%*04LeFK+G3nETf J=9e+)"S,m?>5\0Cm4TNOlBmO5%W2I5!m0oVaB*8etUdFt`f#(,iT;F!Y'3aHYqp+\FHF?20%PK^%L \mdjn7d3K4d*/#,ORc!WR/2d9F[VkV])f(k:\q`.`?8dd/XEj;sk0gVC00qqPZI'&$q?)nJg7Y7hc/ p4N")]fh3&H,%`=Cn([pWs2?dAR[u+WfJ@oDT(2BiU\anW0hj.9Dk$iB^d(lo#Wor%l$3K/!<^_EWp AI<*^M:J:!l(9^o*A'nJd`hTrI@&"K;sI@6]C7rJ'"\Q_ZtGL;*9PE;@DLko$FF"KBbchs2[R,cK+_ $Lo']J/f^$N!aS9<oAR6Sc82R_im\(F+DBVlBoe3_"]/?3..e=!+7QD68s.n&3XYfOVf,^@^b.n`mL DQKGJWZi*8k&brI6%O73G#>Xtl:#.-`[!LM,^*us)<:C?57TI$Om3<p*^!.`020J#:5-r2<YbQ0&3^ qbPO5BaCD%WJ(lRsq'!K29hoLE3LL!utDnW'C/Ybi7d8K0dSN^ZYHAoOea&:qlH(a9cp#h&/s&7F&9 r)&-eU=KB7MFcQ8"-NHF.?p4Ddnf9mn)d'o\m5?WEfb?uMD_V+tF>a:8?rM;Go_`XWr*7PmPYH]3$V *II9n<H#:_Ucc!$&ic:W3>LV5C5NPD+\dm<6#1OTi:;.q_<@bXmfY_u$+5'W[ZTIJ7ogVl+:19eR 36cLKeBti;_9i_n!%,%X.:QJO@K7f5.Kmrto?8<TN!`8)WcNd_4ROs1T^8_N=90\S#)im<&DmS<&3\ Q9_Lb)+4GhEP&Fa3lBOI8.o#s3*8!Q[4Lu9@>!!$i8!G+N]$0tt^AO)MPm/3KhNm`Opo_bef-Y,`.5 p@X6i<GYM7jkQo'j/_$!9YBii&rY(c#X*=d96GQ>m@Y9&.qqcn*iYa^p?6TJ3r!;X6Bp"T,@dkUN7n I*^R/cpFsoqld^VRE1U/^*cUGtT+nWW56n7j2\.=t9-*t[1rB?2;FD>>WoF[r&D'_s0G#Nn^/W8aE+ BMni25rQ0ahQCam94j$C)1umIir=\de_5"V^u2^_-&=#b"24GMj%[3cDe6)Kk=+>Y5`m"V^urBb54e /--kY((^TW!@e+.i<GYMWAhRP$#L:gCq:0jp-ei@,ikdI!E_SuJ-BaO^'b\f"CM6L%i.tF?i`On(2t MZqJH;mPH`^8;Etg*">H]I!)Co:31]#W+XCM`!E)/o5Qt[!6%B[]"CqO!!+A\1Ol%+aW:T>""@PKdO 9B(p7=Z$O!WWs25S:d7-jm4So\9pFhqY\2J-5uU6bj=2">g.2AedRfiWMBCr;6hcq:Z;l:]s#a+M\R c"CM6QJ/(l`3!"8F&TArt45>kA%g>K)8UqLO"],4u5S;oW,QTkj4(N:ARkkQT:]rHQ69l06mq)So^_ 8sM7/\6i7U?3g!>B8b:]rJL*ek@O"lKM,k=?lt5arIM'i5#m!Eq`"0YpZH;SWkU"BY\*!)C<ko,BJ] _bjtX4*N"a&-PN)h>tb$1rD@V:Dlu?&j$S"(!m)6!*MQ%Yi6(fn50KQ.P(ThJ/$oE49:E*'i5%3&(0 td:hVK.;U>_R">BjB5SF,!'EOHnJeC)MRY_T^5Qk$e5sQ(`!_>sM!"s6fp`&a9&E![&!De4\Yjhu"7 DKKH"@rPb5dD!k\,d?>eH6n-j@'%S!)uJi6@]c3"V:]'J/$oEhum(G&\nN3!E]>N<!;h(5fFBZ"=+" :!!j\M0EFTB'gRW4R70@Sn,s^A7mIV."]tdoJ.o^f('0(Se.2W&T*n.3[$5#'AH5M0nuk>8:W$%@&j -%^^X&+dc]:njYO/F>][Tho7p"Urkih@>U!*nb9rdf[qG%Q%T_+?AJBoJD!/si3-WVAYr6,$#,h+UH 4a+R;UC,\GDSQRI#dFEIkHACe(ndlm!,t5cc7LigOmQtQ/9CHr6&V*Rk=B+snXG^RoKi,*R*kNlg&) -"T+Jeh#%eDgdD:27S,k"9h2)>RqM"&5NT^HaO]^2YmC312^f%2<?2>u@T8s^lq^o.r;f@oJRjZg]C B?T8-`)=bB+r+53)m#E!@G,l0Ik-EPn,OTDs06"^srN/@BIl$VI'O44n)>K5na8\cmD1L2iIMR60H] ,Z'lL4bFInQ6.nXI+=Dh))8ta<o0:T1!'kTt2*V06-NnBR*u>GYcu3qfQF%>/!QCZ`.)Q(&;FHUCR8 8:#5Nko+P6cG$:614Al!HW:fGVKoYKW&(RBPud47*S*1i39oBRgc@'BklQcO&lToL,6G,301n4X)6A >XiY'r'ok5#^Jd4O,/We$pr[.%"</[!EH!]P\g1Y\u(u8'G2>P:a'p78']dU)4aJQ6\XZrUB^'(,%e 37pU!=FcP]PLb5orgW'L"EUr*`<'01"-,%`%;"pghVpq]f3<11Z7'6/ZRquY:5H%K5EnRop''%o\*6 nQ)tb+IXWr+QE"3ho$EJ,%AQ]MK^b3G0"1#:SY+.A[W3_oE/,S:_@U'Rt^$^(f.EojA?$-POo'coh8 ^ajVlObomT2dJ;-OO]]483O_8T-3+#Qq,70HitFS&4X-cKWUP-8%s/WgcqKp7c`.'IpcVm.s4Q]d4\ S6J_.nup)+:m\65r:"rh3gdK:J'+[*rtJ&Y0HW!rujFH%;F#0fL'PJ/TQtf_O!.f<aaAi;&*Dj:S<k qhBp+F"09n!To=FB[.:skH$lq4h_WZOD@#_TTCg<8(Z"S1W@0jld*EY^G.cr64P(jKK5e.RPVq!3U= up6a*9W0FbST6SNA#4faS`>rQQE'F3g&5L2\(c`&]]HU:Cok<nhT#qWpRSJ^k5Bu0[3Q@K/eAm,`GP Q3I(!PgtA1;f)ZTOdVR9sI"2D.jP=63'g`$im636-sJU1Ef$a:]fPY3J-'`&D3?n5la^_E!JCTh13* b#"iJ6:`&0u!<N0Fa+XWs5RG4Hj9Q_+M@gI(!$qV<O<[RY*FE9KA<m3H6&lKfi(nfB=qC[u!%^Er&. mbqAeC"6!0dI76&q%S'EelG@%_%r!%^Er5ga7YJq9(f!jDef6LmtboTs8X!)Na$"??NP'+jdrBgD_q !jDefK&+ct,R-m'GX)8=%gPCMamfZA9'1@pHmf+8GrM-,"9@IJnY$M)jEcAbTOa&f"T\N)`r5I[JW` #7<.tOmK'4$s#"n$&J1;K@;t8h;('FWt!NKrI-r8/W=qC[m#6DV>S:'P\M1LgM*XIN*6!t9)r0;kbO uXQp!:I`jTH.o/M1LgM*WuIAEUj.V,mI!(GRsjK`Q?.eE)ib=!PiqF!4WOEJT_lk-3d*)GX)8=%gRZ /Lt2k:9'1@`!4WOEJT_k132JGu!&,H"LB^%P&HM.uM1LgM*ZP/(c:P>R/9beo!&,H"LB^%PU"KeX9' 1@p!8pX\gd2QZV?I"9GRsjK`Q?.e^`j$g9'1@`!4WOEJTg5r-O*3*GYeCu:LMsEcq8ro!PiqF!4WOE JT_k1liq/i!&,Ieap*Ffe4ueC!Pir!!/NT^bsH@aU]ge7G]3Y=3%)s;5T^799'1@pHmf,R+]FU@"9@ IJnY$L:L9P)i&-.XoW3S^N-O9^/:0J2/N!I=W6@]o)2ebPX0HLLT#(aQAd&.$J^j&\'-j5?7?^VZ4! 94*[C_5Y6!l0*n&d/3p5l`SR-Qc6;;bA8;!98WLBFkI)Vaai$!/q/]Z9aR"#QX7C@%_%j#6R4\N]fo :%>%u\A<$nnZ9aR"#QTEq8.Yc[#6b,,"NF<lM1LgM*ZP/(c:K5qKMjWn!&,H*!:I`jTH+@>We+WOA< $m"J;A9p8-R7+8.Yc[#K!0#+E4e'BgD_Q*WuIAEUk7fcj,/ROuXQt*t#iV1En1N9'1@0!)1ARLL"k. V?I"9GVB,.jOf)jYQ?'S9'1@P!+b0CK3b^EVZd+:GRsjK`Q<ndSJWcCj$<]r5CmftJThb?"9@Ju!0E =Q%sC60S/)5-irQ/r&EF-"J=i>I"9@J5!DmTg)L0I+d'*i]/3sVn+;b*f*GSCV,R,ec$@j61!4Nt`! 9'gZ0GT1)!8MarJWu?6^f1TV!75rE"f4In^_3FCDaEp`,bPA3AQf(4eHH%?!l,MD"poQY!)o^#+Yo" ,)GC`-6432tKZFQ)C4Jq_"tW%In.p\uK<ec:$mZ$.5mh!8$im9AIK7oO">JA1O?D?BVu`Y>(pF,l^f rJm&-,K-C(O*m">JA+hfmfYnN^R!')X_+V1,WZ,R,ec$Legaa<Yq9O<^P)0\'A]!"].>*JQ6rrs1'h A.TsBFr8)_O;>W2DnuE=!8M`7_NeLMl3Q$:he`qs215N)e36h7ICDL-!.["B_;[4f#R1FI'$qFC$9E dpO;JN/lTn'L/T;^ANC)"9,mGp:(Vk/Y1^X6a5a&#K/-FMOD(#MiJ6\]^!!$6=!8nkR70WbncoVO</ AW)u!#,D=^];`*pB=\o=o\P=!=1pk+;!Z@(]ob^('">=J-&OI#_[dq5qEkW"C$BX:]MU<"[J)u+m]8 e!DBX#-iaF$9eR=p!4H<>!!$g9%mU/G!5JjE!<LP>KEM:j(=3$i!!p@@O<\-=d6pM*!,MZJ^]5L=$O -_6M4#+Z!*d6LJ,ghp:I:Tp(pF-I!+(0U0LZ13!<=@?"TZ=RTO]5H9T_V;!(8jO^gBYXgc9el5u7RF 0g/05E9HlL#!i84k7dp1`^4Y-o\B^;!Pm(s!0d.CE9HlL#!i8dgCX'm_4B&!)[$=0a&2o)70gZ"dru `6oVG7.?S2J*:>]n"'EAS/eZm<""F!VuD%IB]*+.5>@4h\,:>]n"\F`ck\$6M"3ISA&:]RF$<QB!]& DT9o[m=C44,@UeS^Vd%"9lS;:]SiI1r>g4G8gZ-f2DZl0*HJohe`oA!+CH[!,AS<G>@%4&55tt5nB% mgc9e,@UK0AoF&L+ds!/D(*\`WkOdSe6!fuqgc9e,@R,.5"a<`!D%INaX+gZ5-SGTe^g$:R#R<>a!O 1?2"@'\4n0A8EMiIhB$D[hi^gup[#RB=92n9Lt!#`Y;+<1B$"otDe,Q%Od_35u]S-)OfM7F2q!,o]; TFemE#66Ei&GuNH_3:N')uq8S!O)X$"[Be5n0BCba>#/ama)5(^gup[-j0dj,CBIo3X`b7^_/a9$Gc c$jCAEE_%0?Y4:)?\.DHls716pB:_>er$Gca>je*5Gc:[R.9En:E6>uqC!o(OGYn6g5)8_T1&0(\sb lLWMU]is_9CO2T":"p.Du`9>/&;_r'0HR._#Y)XC^3W\NUR$D##Bh;J,n@C#QUO%&GuNQ_3:N'+98# B!\j9h"@'\4n0BCb#f)[T!6@/N_%4<o4:.ZHX\9r^78EtuJ,j7Y$NX/t,_-()5Y/O!+@T'-BV8J)"\ @%)TF`4G=TJS3((h;s_#TQA(^(?NH-dZ^">@Q$0EC/>"p"e0kTBlqAO5ee9EkSaNaND@!4)ZNYR>CQ fnD\Q,8^Oh^q5@%F>X6<aWM/eh2Hrc5biB'0>M*P!;,*+_J1JJEs+/3A2"#Uh2K36YS>o:"i1R#)%6 Ln\#nU:,QJ,RV(ihr!.D>Y5nYOFM,$A+!_`e#5i6Eo9F2"j4%!^U"p7-JD/6e?*/[(%1'e#2\#iNM, QM\%61=qL"p4i-@1X[aIE<iL0IR&W5Xd@,0G"FS!q76V!-3KRn,c8f!rrF3&0q8!`.QAJ]E"/3!5Li :":5'Gn;..d"i1R#)%6KRKL(\";"X9h6',CA*]$+a_!riV<o9)@)C,<h!(UGi4UIcI!\d%S(?:-WO9 #1[9@:AE&G,tAK0kY"oJ[)lC1n1N!6'RWO8sY>#lq5D&G,tAK0l42e-HDsQV\7c!6'RWOJ8*u'rF:D !u)7QJH@MH=;.l(6-o]J%gmjh^tlIU#!ibr4=C=>^_1	Sqq%o>A:"P8;eoB@Y+4[AP1&1@MfX#2 'P(BcldnXpFA!1SoK!$E'\4[AP1&1@ORJ2oCnE!/<hnXpFA!00c3^_-2=`IgLM!;$KH6o@gQoDlj_6 D+<l#7:HZTFg_q$UKe\&-.R;%#Z2=oDf7bNaNDL!42d%ZTo6.4hsCG,8^Ok5k_D^kSaUj%o>A:":IK NYQ/W<"[NYq4N%M$!(YB<'Fuo"LS>@P!6'RWYQ0ah]mj4Y!jDef6N#?W/-)fX(e#[J!%^Er!"],1Xg /d4,H(SB)R'8C?pPfb$iCQ@(dLLi!"Tku^kH_=_F4h=2LH@(?ijdC,9bj,&Y_XK)%Su"(^f6;N#PVH /AM^'/;1Z.`p<t=!'5eM&0fSKP32g3#bN997[.E&!?_qk6R]+:9S*=d(-I?`*`2r>!=2MTn/fGq?c* 5d6BK$6[Kt=P'O[Z;K=2NU_PGel6sCCP)$U8[!(L0?6n*f6aC%VE3/JG)A3d%EV8tb:P9d4;F32b$$ $$=]J;]3r.8[hT!bP)]+"qp?:?*Z1SMXd-UsTk<p)>q5b/f_:7LfDGDs.=Jo;9eN1a().Bf"oWL__, WUldHg:6-#u5d1RDrHicHk!:[-153l;,=S&g<rdcZm1sYsM[;S[G]s*5Muc1mDhp\L*cR?p6@^NS8" :PMJ<5M2,n7YM7PcUV!C7h^_BC*C<X&O0OGu6RLhr&A"G]6]a9%,FE2_EF&.nI75;qM2,<7Z6@j<cf %L'WQ[+GYBNL\XWM2b%8$&FRWfSG9A<7hJ1NBGjLK8h//(tF]VfGGD)*q2Uq=(KlM-8l!P!"t\QH#O XhOL3,"Rs;;37[mema[DUhZq3WSL69SDRi&M(5ar.(E$53%queHIOKJ_c<ZP!>.4GCB!(s.164+p4, 'Hdl#:F\V@L"DMg*3=G65h)E1NlS>!$'pQX,a^\LoZTH!f:]T\0d&JP8l]ACQu>(M//Bd?AWH`\8I. =QahLd6(#0B\Ug.fTXfWB)mBXa#&eAZ$pbiFZiMZCcFH63kMCK%T',NeDP-+kH#B;<%XN#d)]X0AU? =.TmQqgSWe$ra:o](I)K6%6#,,cSU';oYE2!OcC=&sbYA+WL#.&%uUB\2>TPFbEB&IG/^h+^*#!uoe C^*B2OFaYS/Eq5>)(:sTZPb`l!ON_8RfTo7=IT?")17hQ[i(-]JXI@JM1M*4R#AeM(p")F"tsBbn(D bk?nV`\@c/mD!b5%T"pSRf0Eqk/%)<%-?6JJ9P[7b^"^53)klhi0nEJi(?81XJ,$n+*"XdW<iWZGjn EL1^?81[K1L>%$"hImQWs-4@!3?@@=s0UE4^0&9"j1$,X9I$U@''T>=tjOlBNAMY"_Li?Fp7M=J8YV h<o@m"!*<!1"U8%YE!6U371]Wc;ICpWRSrW7"f"sl+pBDnn1"UJ;K1q)]M8In"@>l1o)qBUT^2g,RX hal@''`_B`_e-!1G0@/d[n>!c*u"]d/+]$1LRh!0][A,_.QT/0k:[ML_NITW&2Z/cqf*5`$\HU'SC] !jdd"XWYD0#QP566@qJK+<WKH-jp+%Jq13N?nDY3#m+U_!1Fs:Xp:?]!Gd#^]cM^-#Oq$[!.-u)*e: I"/AqRPEe'u+TIC+.c2j\\5`$JB+pYd'!OHg^XW#!U"ot\)6>Ad3)BcBk.'!BoC4NZ0@''W\W<$L<! 1Fa4/d@^1.InV&!7nCd0D6ZS4\:DuMW"[gr.?)1#XAcJn4=2$i0+RGeqhsdJoUhm"@.ctXpCa)8=2[ EVC\P_!.Y%c!l+u5FFk=!:^8GZifdbh#%WBYbYJ.i*?`u\![&%!(E`_i8-$XXs+(\,!5]-I?tLF"M% <\);O.[kKF!)^NEH_s!A=Gg$N^LX,S7s%\]>$l*W^jOn.Gl-oHsY>.Y:Tb1CtZ7!]j1f*"X5lRd1)! @/rOmM)G>6"V<sB`9Bs?+Q4:_J3c#;8^1UK1RiE8V^P,.%t*Z+T+D0X7)N!O.:':\6AS#qs$;]d"G- bBW5^@hd/kb9P6>b_.NhCrKPM"H"FuR6?jM:95Th3e'ECf-O<=fS#ic'iGem!:l-^`+!Xb"Xjr&R9! Z1@3X:kTR5,66EP#<$a^lUg?[VF?#d(p6#'l,qT)?<#bi>mTF.m>.rVhZ)h$j]\2&7T1#>k[fTZ..; k6i[6jjHC^@E.]4WWEB5NdL7NHX[WLoJ9]?Q!"^P/!2Qhp&`d=CL6+ki',q32R)$#ibj9*'n,V&E.^ kt?m67MR>6[It&gNrZN%uLZ!;J;O-,i,lI4;XD0Hcn'*9Sb(X4i8`!".iL:aBA/J/0D]Rphs<./(ac mt/$:T#=-@95726DNc0Y>pr"aRpMi'(E]u6"usT$KOa$%%$=8!2f7dZ,ig*nZLu7C:C1FQ$5`aeO>$ skRt18HJ-C"ZAp,34?&j5o*rE)%8[V,^IX#qMiJm89J!nIiV\]=bJ-%YKbfqqO5d<W;kmJ%6hZ5]HT .NS`4h(e&EV)6+mM#^J>g1G0S(,21^@?Wjqai>O,g"kan/42$!8"ds!G++g(=7qL+l`Y5i8?@T9Z]p `RhlG"rT#NbBnct%QlljZE/Hk_b;3PBXu"WZ7]Ui8_&hdG+#n%>^Zbg2g6f0Y+9A;..VZUt]$6R21a M:T<.=2DZE6kW5JR7+(DGl);2MFg-u0#&N&mH)VR0\2)cfoOf!'sA5]dm%&d-XMU0M<N7n;WO#/J*X &%H1Bp#ss5QiR6\?'I>-5_6`uQaVr/NWe-`JSi8V!J+@o'@,M9GV91,B.s;f*mt11C>kQKG/\"k!=q )=q]"P?Z&3*$AqKoJ+L:^J?*=]fCoa5)"e`B76'+`a\8n/-b_QNIZ/kZa!#kJupi4.Y#:,]6V;$YX7 &:<I,;:eYaS7#kkXl@m[U@)uBFtg60S#K'"N?i_FBa#/?[\;NT/W(OdTcQN%2`NG69$;R^d&!no684 /AB2SRHqKG)63KR[q*IPUhM5c)`2/F0`3F.`Jrg)p)Qu4&YX)fCSAC#Z'YB-U$A(ZfI-aE&U^3bMiY P-.^&S/RU0S4b^7PE7(=l;b#=*mp8m+Ip`V>BjC2)AdJ^lmEmWIL6NsMP4U4dML7KW^Dj8r`m637,u Q<[GsBO[TAYX%=WJqM<lrXhfd7i8at@Zn_:"/?Z_CouHdmO"HkSjmeYc!Z'bUB&FLeg7).#loIRA,$ &fJta>!mZlh!6djaI!"<fN%fAAkHPL_g5ML]g_j$M#QX#cZ:ZD!\O"u%b&HW)D!/"\[c=-c`1'#<<! /A9Ck!]gb?k+#e%2^K#(aq3E5Sb'1.g-t(Ou+WjJ/CGS+_'C?=>>AQ-NGM<!4*jL//SBL&cer)&Y>X -Tb7>H'G`i&&1%AXc@RPSnJ28t#R_d]$_\mNi&>%0&9e-e1*B0.YRh,F&1O7a6D+p:7f_*a!22.J*] SX91&tus!;`pM?EatJ!s%iq&T\QbAn(hh@K9F_'+5BT)PJS\TRdfR/-V[L$Q(Bq+UO=-G?<0)(j1L1 BNbdGKa+bSWs'(WY^iEf(#qOj#;@Kd,Y@9o+a6a&D=@_Qd0=Ms#A*B,!)SPn5TOE4#!)_cG<cCM!!b [6",;pAblIlU:^>-/#A?p<[V1O2!ZYm8)eS#/^,Sm(W#T_`#%g+E@3>g'=H174N3Lq=-SPcJ5R1_Z# &N3u6P'H>^`:Lj*GuE0h$=(':^1RZ#%c]s,*IVH1eA(k0*@;sRP]NMi(VQ';?Ht#kU-Ao#@sXK%dm@ u"Mb.Roj9YT!0H_eA%$H\<`0Jo!33C1D(pH5O@fl]!E!;+6JtI2YR_!^!;tgYquR-$@Lml"!+[dIIP ?uJcmLZKPIAgc"(2Bu#nDAM!#@t"NmK-WhuQBj"\8q(8?!$;6u_>pB:m.gqZHr/"_&Dn!EgiQ)up?I :m(l6!PpHt)__:P&eQ;V!D!M-;<^r5"op)[I/=$On2)7VQYHYCHB/UHT+qFc!!6F4!jM/s,!Z3GJ3e 2>"E<i@7TTYCJ6$VS!(I1n89\P\AI7Q*#'BYH`)W5h7Ke5q!fuCJ,;;cV3!(daP\-QkIu+[2(6r+%" Kjam#[diJJ:<@%R:)\T$\8\Vq3G-NJ0GP==W%8cTRXu$J,TZX*tV5?WL!a=<dpHekV/7nJ:>ejRH.t %#2f[#7o@ifIdGFLBIOU1#mUe;R^G#?ck$JY3FEt;>6@=rYRh(YhuHXTT4J=<,VT;u.0:VgRimFc&/ In.=eGmI!W[0D'L`6n@$gpJP\NIV+b0cH2gbX6!5*#Z)PI5fR/t[FT$doFBI0*:7fkR[Sch:["KHf\ :i76g?Ni[tFVt/pa\e[Q!DLiAEQM*H7Ls:rFYU`51ZhDM5Q[,"!5\pA;aLKR6W%+M<IqQJ??fS/-"T Y;%q*0\AQ8`1TV5*,R:RZEbj_Ioi00>nU.c,na_,(gE2,E3?9Yq39JC!lV?2WT;@L@+`!M`AE,dV\! .G7Ta9edb:hN`3%2p,i]\*rL:f]\^VZ_";Bi\b&Ybso.BnImO;0i7AqGkLHF9*Ke=K60ML1XgY$ssp MLDBl`5c1/bVJ)un^7_1$>*[-@Tl<88)O_/kR?s+?R3mf=H<C;"lBrnI>NdtmFRb`\q$9"f"r7OU\E U(O^mbHLRrA?.d!5W08tCG\P[^<fcH69\3Lj9p/U$'F![(!=\H+K5Oou?tD]f+%?jDhp#\(cSqc'L< +Kp3i>@_H6?i[BB=^?#YQKfBm!;i#^n-0*$YTUpdkGab`#na2ATFc&H5TlEr"p"du/;?HoL2j>N-3. T'U!?79SJe+Eqj'%K+303I,Pr#On-f88A%A#5UqiJ6.2L#:S,`d!A2'b:g6[;G%5V]!$[S:*M\Y9FX g7a(e,fXH@'iL0SHUJGV]]2a-*7;9%46:_"MkMa2ZO(jSnXUC+4-P\&m!H&QVsJOmKoLt,G=\nTD+b G<5>.!$)$kbZj.KL#q>u^Yb2Ft"u$Eo'?UIoM?_s=<X>?'@'Hb:VmXs0DHqO^Vb%F*0GktK#%4)*)# 6`A),Fu$!QKmqAYfD+:m'W8D;f&O'(D3$HNTi'C%A_6B4(t+TojAG!Rk+VN[0)_?j9e"AFL//VooSh =hMU?(r3q'&&A5MOBhDY@PgomcRZZHRp7)U::bJYWPD/=Yb"gNJaBU:aX:;)+K)P-B$S=*C$V_/>*m EYDYqA[LZuPr:oGNk:OP)(JKS"n<E:68#Q#bO$8?mNHakc&Xokc0Ai%4YVRhO@!0#:9O)V@ACMO-b_ 6KHDSiIu&#@#)-I3;V*^n:g9R(O9__JSh[kBi]`qk`\<HuB5(";kJ<S$q18[bBZ$&GZSEq+V't9F?Q d0ld<M63;Ig$;(:O&qI9N1pnY=#(/\P`CXgbR@J\:BqG#"0d6X*C'(;:`b/OW*?YXUMo))s`W-RW"; ">>HE%_fRipY.`gM?dHtl.&J#LBu!Or[Cka;Go:2_UpO!)<e"TgDF![C>L0^o*X701:r!$T.KmPdnh 'FX`@&6KLB+:slA+FbAM#+BpQ&*_3qjL*J"^-2Bs$G[!g]ZG-N_/7.a@=S>:$HX_*!SfF6grF6]jfP rgRoam*!\-pY_uLK6!kr29ai+CmB;^*(#(>j^Ir)'7*";_BC1u/@lW\AEbenAl=VZGk5>4aWMZe@a& *C+<JFL-.E2r^+&,+?Op-K<Ok:6M9%h49-(=3)A2:*$V!j)9%3]Kb3'Rq.h!>(?^GX\e9n.1#H"NQo 2B-73ibq7VB!((Xp)SjG;$k^nfFb$].0BrfS#/Z,+!G1O*..,1m#7kfJ==_(!B0ZST*<I4R"K/U;U% Zpl"p[kaTE*mUOKl8<TE50+#TnT'rueh+WWGI\e$Ef<$:e"49G#\Z!E+FRLTJoTD$ChbcLLQ-`3@]# h:$,8!9Z@r64F-RY[:fJ!(L?#,Z*&<=)gh4f,>ga/^4:YWJ#Jdd9*'ngsQC=Y]sc.c2h>*+'m;$BX) DiW#a54rW!Ih9b@9#!eAO+!8mi=9WFC1!MQmI(43lg?%+QLBH<!5HL5Dh%B'=h,m#44O8rjfA.LW=! 17W%)UPug/P]Pi9X=p3k.Jfii5(M[cl+TJ9^N*HMLk&s9Qe]RrfE\Rr!Ajo$.B]Q@J3E=>f)YGI/Hl X43@]"1eRat&'8IlX+^[oi",`.>EGMu/Zf6PXl#UA$_,0GFQNYrD+sP\d1u-T_Q_.k:uGIM[17V-O& 4U7O`fR+!!5Y%YY,LC^]:[:$OY1Ul6';5&Do`,hgP&+Hr-\QqH3u@i]uj%L.j0$i!u5-%-<Jek?Vbj /.O=[$H]d!s$0[?i8;7pBEb&q<lr6iQ!>;*Q_3&)\&RLf]A<Z=j4jOS?<jERTE9XId:!IG.fbkW4aa @8bB:%^5`k,%IK\H:aDLpC(`Kabn-3^3XoNuHGZD4nct93\H&Nl6FT1B)3<CT_k0jb$.=gQ*D@(.Ik &??3X>&h^oN<M+#[.368;cTYJE_3lkC0!s;ZI)SDJ<O0LPiajk=:W05%=c89<nO'>p'PDJ<4%_$lpG n"0D]Wi!(6[;>rg_DU?Vl,jTALleaUu`"_N^ATS5d%.6b?!<<Mk#6KP^&*D,MJ=m)t5h#lF@6lTio2 c$%?i]<&J2jcD_e/rhWiKgpluenM%i4Vi7KQ+%8sL:&5og$iq#nW-==E[Qi_.Hl/kMA5@D#"5IEq"u S<\L4Q>A7[rCIRISk[X.m2(3Yfe-K>d-WabmH4me@'J3%2Tnq2hc75VBn^C6)?9kCe7W.ml5Jdm/HQ SnmN\q;J8C#r](6&ukenqB!&+I[#gO4^?k@ktn(n.fDKH<&#N;Y77SiZ2Wq/?FoZ109S)3Ddj9>sqo J)D$LLpN:CViK[Sr`C/J9@s@9(l5'b+pT2$c*'\TEAs_SX8$Xk'H`R^n'Sq\bl$eU]@NO0(i3$p1Nh $PcFfC#ls/h#>Dr,3=c?0:mjk`cm.JhdG?&M+9uU']`OK$e""6+_>nUQ!7M_n^edo0&-W&A#+k;cn\ bF9^Wop^#&&-hMEpl=5kbD4"a3ZQGRjr:^(4hKpT;F//:@_P^OWp-U29kth159XXS@L!p?1r?>HSPd 0R^6\%)j4gSbuV2iq^A*`l`";/D9F-h9u2D+`[A">[CGH5geEs`dlkDH5Q_V@,B/3EC8oZ#s,jZ+Q2 )3K6Kh.#f8qAH#p)]iIHb1]C)%GnMHC;!)PG6KumL:oJq9s^lsJA1#lu**rm^#:dC9`RGi2e:;EA=J JYQ@0S$Q^&gY70^]=:-SsVD<?jt1\M#ojf5aEEQBr(hmbm\+gF_hI?J/fEY$ihS%B.5LEhu]k+PqW1 sUK$QTb=J!,n.W=N#`o3p0H^e;=hl\0J]*BWHYj(V!?aYD8AI.l!@>P]]e0W<mI3EtdQ@@V$GMa$!X $>5)gm9XE/_11GiFJq!80_>T>Ull4T]#X%[NRd-ZG^YJ,oZ^8oWMuo7+<Sgr'j55e3*[Q@]+kjAI_G !T4?O%R)9k#69e#'IWT5\4$b'3s!,,:p>4s=1j&E&M^JE.)guE+Dfo`$Q+P.K`lo,&J._LJ8Y0hBWq XC!M4njPQ2SgJB7s&S,j"*!*%&BBIKfQdWCe@AcT-P1#Z$F"dP>eiIb4+_)L^TB+VLj$T1HTYeW1kL ZC.YQp[I^d0:!`0EW'jDY^>'YZ'aOXntX`N<sVB;b4Gi_5VG`Aq1*@4B_0u7_gPd2O2,-6n*%3WoT" &ECa!c'4.iCUBOe/)Vbu-J.V'1g!]WMPoT9s#1!<b"%1ZFM$Yq:@9IL89J8nF$=<dR!F9@=XluQUPE F37\)7=6`tch8).O$f%mCO*C4N$LJ1ebJqhd$0L7^mO&jp!">Eg9or(@P)&b6#mGQnER(&3OVcqqQ/ Y#kkC@MOi!qN-3s_t!:.8Us'r@i+[A+97%]Ck*QpJ-6k^c9MN=Al)U&&tiJi;/?C93Ns&6i^4\q<m% N9^6[m^#bkQl3Z?3U;#q2NYZP9MfNgYF'bZ04cteRa;@G]oL]DB%111;C^lisD&+$VfJ<f?I-k_P,3 $^1668=(b!qZs\J33TR(YTUA;$Z_'1#Q=l_KV])i.VA:R.rFC0<@^8!Ve"^TGJLlI4hUY!<<Jr#0:$ N8c`)q!%bJk!!ZPU@g$(&+I=+;"5jA3,8?eY.DUO@a7%)B_P=AFJWYJL%E,c4JX?HPj<eFa"Jdh;#T I:3-]%hYjpT2#!'(F#cS`mXQ0PHY1T5p@A);ZJ22Vq\;LsNM^dJ0q!bmL/('q,VJEEr[$]oUXJ?ZQ( &%N6<jCa;LC4HX<TWq$!:]U`X!=1Dn*<973VuV>k(l?A2,XrPa;'XL0#bVr1JH]),L1J.\*6-08bmO QR4'odie=F-;!$oA9NQ5KUmuS'?6O3L-Vn`Dj1'e:eeD_dO95^"0aFmU:*t0Q(E=!0**]l4\bT-]!( BAsl:rqZb![*'<99[aSkM860H(7KWSJ6NkZC5bs"kLL0)@@mOr9rhi7R<o<1<j:hAr(L+NBoT"=V?6 ?@#=ie`p"K3p]Gr70&\+X#7dhcS!.pe9WJI#LF*-@!/_s(rfTj1&K`.6n<+Bf9>ZA38H96W)Dn'mdN Tk8T4%`$-PDrQ>F?uhO"Z=iZ4[1o!(6h)+N556IIIA@nfN0si5eNMK0Na\?E')1ciu<,7ahEV!2Mo2 <=&ZBJAMQn%W=Z_JES`h/4G;WGQD2DEX4XG/Q#WY]P+;j!42b7JC-3(YcDHu&e$`^QF&9@8\845]hR Jq!-p!n5QJJC-3e-,<.T`g24TcSaGrHZ](c\$j>5T6g$f4L!<^u)OL`%W!4;eI"Mk.1M@#@g-@j.$! 16.U4:3o7&1#%+Wac;Z!pGOJ!&,UIa.sjqcPp7S90a%0J?kgl7C,BEJ0<nQHiXsC,8KFL=UPJMJfK< XBE60Td?ju'UPJu'63mjJKNp848\kCM&7Lq>%)<I^KbL-[UdY>E6OCO<GQa%`!7V,Q(_m<a&+L9HE< ,?V-ScJC5XZFh@:9-e7KME^"i(m]+H'A&MuuO(!Z5T];A;j`!1<ukO;7u7?k<<Ykn>=6e/SHE63&u? !?_S'Jd[/9Q6H;cM#\YB!e@W`!$3orCp1OY&C+)mRg]Z*'`!H(i@HlPkr]b0@KT/Z%IbZ%J-KBt1L^ H:U+0]Aedgn)&JBUq*.Tut*^,*5+:&ZS!Vh2,)(H>NhM_HM63;7'$4n^A!2TYq=,UPi!#d7B+bIK8! .$mTLnFa`JKTQ4&-1!B!8rb9E'/J6)*4=_d/c!NMW-T%^uHgCe=ls<MZSD^$G`Sg!*Z&rJB[h!2@Y0 C!WWHJIU^[tGlVpi!`5B!Uac@p"Q23*706R1%,c>5)ar.#"9P;8,MUBB?jd4D4\o:\Dua,6[(V;$&2 bV]Z%)hg+p&#Y$,D->JA@NPeFNasbR<oocGm!%!)Q$k6k+a0!Vk%B*<:OE+K-C_5V)nc`<60(!rs`E JhS#A5SaM'RUlg0!9tGf1]l'X#`g21A0J3s.g,jhYX)@l0SkEL+TNdc!-f4[!-3r#Bd!I1joEaE"/( 1i#QgYP#QVO\!,I2eN)9XQ57)iG,lj]rU0nT8^af]+">'U`U&ai3N.QVR7031S"i,)#31@(%^4ZNS' aDH`)?:e^J6mp1&>XPa!U7kt[".e/!Jm0KJ6j4G=`FF,kQ.%a#Cpi(:oB.9ho#O,('m0=+Fl8$!$2: F0G=_"JgLI0RK1]f![*g:TF*+JKWtL]kQ:7@%DZ%%!&NR6/-$D7'FmCs2upL7g4[HJGb\":j66pW@# 6"V]mp)G1fQ^?9`Y8!!sG82&R\:#!/h]qk!T>KVBhsDbtJQr!LeZEckI+#0]3K.BdkCE"Jl*.JcaFu :%g_(-3\@Y'Hh/mJ9I56<=nRhRCAr2":hT^5A+*>C`BZ&A.AePO@cnc't"hq?qt54XcNRR!>W;>52u XBe,\u0DZp:77$9k;-jp3?6P[BR<<,R4!@Wm1+?:6g]iY8HErfC#"jfdQ8JNFeD1PhP!/tZL1^67m! ;7T:5`5i.8Ke*,C]J;X[Nri@`[i54^464%_?'R5M[9EOB`uMVg9H'$!'sQb*_-AfRhd-M?@]auM(eo m72mD6W/f765UeJ("P!K^63@WmPHbZW5Ta/8VpbXU;i'ohOCc*4'bZ%$<.IK$!G4_"!2O+VW]38=3e +m+!U-4j_O"@@MQ0/sJ;Bj=<7DNa!+m\\7Kih&R0;H!)N+Z94u3ccdKkc<KmXGG+TZ8UcNk6e?qq8` "R7KY5_hE$00oWO#mHDZ(P(@I!1%:!(lJRe-5JjQ<<0gD!Dj./J66e^bnLa-+D)fu"S+\s76Vt&(E` utJCU(hPj'i(#]hBoE(gEh<c>qYkat>E/^RDsn2LQd?l/l&1Bg@5+d;uplU&Ae?P<MQN?$(s4MpP\! .._#e13=0!B=ZpW'V5L"]^)Bkl<]?(nj9`j8jXb#N/l0J>@DiAmuu"9kXP.qI]q5XUu\Z;?4C?!C?q o3("O5[sec9qD^7G9?7*O+p3WtfYW>!6AJ26gd2%k"gO^8#(Y'.!,].O%0-u$!+s1M-sqI7Xu;BK+[ S&:GJ+@7+omST87XU^5[JRg\MMXY+%p,E6H'$D64dOA6icF"85WpBKGH^Z+bU1)J63nD+K];b@=&.X "Z1]M`<!I`#CottJ2')ZlBU%]!4.:]?%C5i2p;FYd1?],9H4%cE<'/G!^IS.@*Ml*21#?._Z^#U#fo J],)qEZ"NCT^TRHtF+<i*7!1EoOdM*UmCMJARH2n_4Ld1qi<<:n!#;AXo^kmRZ.?e2MbDsr+7VMhGZ ijg^-@eoI!U-Z4\-d#e,M_%6:]rm#,DnmS^r&Uc#-_:7_D5d4%^mSrK=4T@@1PX`"`<4?2?7XB!,cB NW1d;O&g/).,SL6pXCqU"W8i?^I1-#cNMa2m1P1P#TnRFpMC->j!,<]:@D"5oDZRW`.%1o=!]Z)G&9 9j!PH-\21(nkn#B2^G^]_=XOL@tjKfFVQY#\'f!]BRnMM6cBLa7Mi^]5hC.Vo:qi%F':n"]raPlfa$ RqVmuk>e_ldh/i[?%UE\.mV^>*Cu8Z&;1CPHTHc8PT+TY!&1+)JSFY:.)H<$5QQuJdH:`)m1jjJG9@ $-*%HICdJu7A"(>RHPQ>`f#C_dQQpkg63llk-cl3\G'6jUu!"C>_&AWN2D`ApOFC=ZsLGU-!=)T(W" )/l?BSXj5JAa]nTEB#G(el5Ze9L/,jLm7na;W;(E7>lkJ2@$j@GhV`?>a9mTL0Q8;Oj'^KRkjSN82P fQpmc/#dAm(]6g1=*2isMJ.0r&#Z5l@&NVrRarqfDU[lSKaoEAo7K=S+?=*@6!ouUb-q84W"H4QcO9 aQ5kljT:W&pqah9^JmJ/j*Qb!?KPhD%h2Npeq>"7h7+KVLJf*AB,PJA?7Lou[:?S:?Go(^LYLf)WPd 4]%1dE&]=:^o.[',MI)@'[SYY^[kMe>U*`(Jk7Y8TE>mQ)eB74n-4c&$iWTba:6(_'5WWu_rRpi%(M p/,?6"B2=MT)_!n9D%:L8nKS+4VhRs(Z%?uDu5R5*P(uW4tfF;e+3?SP&Du9dU;V2g`iQZ.lF`0.[_ HXMX4/4AYH:`&DKh$6X2ejSe4+LIP&UjhBpG]Ss'HdO3;)69(doSQ^#$XJ:/oV_R"$H>eUk(7^)q[C s!(O^h*45h$cl:+mGUO'c8328$"[%V\E#4*.J9VS%"qm%<*q:jK!d+JP7#3@tN9Ge7!!0H/3#JDEci ua#&o^9ppC;]R1-gE6D[!#Qh17PqJJNWflTkHo]k7<bc/6aGMWrM/W5TR_$tNc)^k'IW4?CJu!$##! 12r5"6T3f@)n6dOhouOi^p!NU"-sc,W$4==K&ptmTY?4a!2ninm#@c[FO8%TKH)WMiG]"FE"E"=4;d uGiF.+nepnSY^5.%2JtkAWMLe.jKu2<k*og`=XF]17/N1Yqf*p/[FEE@:Z#=R`MK_@JJM%XaQOtar^ Ed7rf)a]HNPKNs2?Ws;q5PWbA<.qQ2?FAH(_2X_Gk?[>ECNttm'mJ^JHR.mOK^,+aR46\]E*=hJo`R qb.QX5$G5A)N/-fh18_mTpEo'6Gs%AX&KUA_`<[kB#GF8--a-a*!WNH+$sq;]NlaQQFT^iO(_[-6TR Ye5,sDEm3'>!-1pD\iEa@PF#pMKrJ8kXXfmmHWbRCua']n7GM:5=Bd*&'u*gL;G<0*%/%(8T7Qj%]o 42?+lZ@i3JUtIJL@M?t7SJ4+/"$_%#b[ibqQpH75Ft9m:!*"Ndb8fpME0/4Z!:mQC&9%[ro*I*;mM@ VqLWZ]Yo^<W)^_"$nYlVogR=S$>BE:Z7$s_s2!!%bh'6""6+9oIYnSA;>5RnXW3T*"EJa'cN5en)4" (D6;&-qD]#64aF^<C(po6+RU0qTgHC8MHYp^RjgqlCd%Z:n$,QoI(?k5'Ic/@0B<c^Ye;;dXQ%GjCJ QY0;//0Fq[3X,M-T'`Q;f\/n:U1(YU81GD-cbumC=BK+k":B3I7"$F(PM!-\b*;$H%IE=O[47(kHr/ 389EmW/I)>\7-&'^,%oJ208Nk%OgB*'(o-nn*X`\AA7"5k4/ID^RU\AU?D+fBlLYTInm38+j2H1Fkm `!cVUEZ<(%qY1ZS!GPdYP->O17J;Q.>$g48MZIl^^<HY.,0OO-%03Oro@:Jc3]Ks2ih.9MnJC'1>oE n4BJ=:f/+JAfbsWBZmqB1>"tK-rE<2WM7"=@=WuT9$UtuT^=:A;H:^nC4p%IK_Q'_`=hrXn=(p>Y<e JHk8=)*TI:FpO-kePTtXh\[M*@6Y0Wa<]GqB-nD!'lL!K7KiCkB@c:!Fr7"kn.Pld[ljIPNHZ!Jt$c ZS^s[koVQ6j)]l;,CL0KtW'2Wi=FI3%mj<e1GhQCa?>sEogkoW+c-bT-dfp7DGuH@%[aiZJ'T_<4i3 'oD)6gkc5Y]RUGW^Bl0HB;nVsIGSLGWBCN,Pad_7Z4)biE`5YfB?*?-$!t2CK\L9s-9**15B!g0u#\ h5c/OE)!23p(n3\j*(rliH77l7@Q4W94,aj*QWb8ah8-&!/SAP:`5-JL[Ne0+s0[F9@T"JaZfh,o>& Mj'5@O`bZU"e1ACi)>W;:B<T90._N1>N!IDnN(\@85.Z4Jui02q/oTL3$S7"1,dI7R#'NCq2h-aJ;! b]aY+93L>IcaOnj;6==a.,1H!"DNQfT&TrTLR'*Y8(FD!>!g1;$e>;T/0:g.D^qZ:`^`"mPQDC`<\d Pi(]WKeRZH)BZW;CL5JV,DMorp2cY<KjWd=OJ23D/LfIKGimKiCgN36T`hd63)'&^6*.DHFSSf;B=M *"i&J9dobS?]Mkqc)eG)YnjB:sB_KWoLBj>PhS9BGDUlMqAo>U1@+-nESIG&%5.f+U[TSH7RI^]HKM eEom[^cnLu"cWP]!@;IJ!l+t1G=s[kFF^"$BRG$h/h+,(/q#RSrE0V\:-2l#&:Eq(.1iH+GEQDnNo< VLY2+fSFpnT]-94PG(UIk@^=@`<5\@5h6O<ce=1\SF"7R[EoR=gdIYiV@0909C,n]a].SXlo:E]@kh 7o%=TX#fP>-8\D(]s+%';R]0Xq<u$Hc^\9>9e*a4I0eeq"7B7nZ13FSF5G8P0UX\.h#f*&=(c>.qbE /'46*UI;8s_!5I94._o%RS:7*Ic]YtWi]nJl)W;DJT2-lP_mcor%.B%#[g8mcT*TrLLYr`M-QF8X8e @#(:["5LTL93=]fH.Bk5YcS"+XV`J-d\*lDFVYVCW$(eBp"%K/CGQ#QTZ<!5q`J;5uI)h`.CD'oXaJ &./F:RGN=q"CY>9KogX3/d@!B5dY&F*2+R`2?JEiUe)IjK*D=6)$&r`O9e5m!L!e>r[@gOVuUKG!l, ETJ?LC%`i&l6'*@*6%Y-'%:X+tH)5E<A$)-jB&82B\._dC:>VmS/Kn.FoVe3J*(c)-lU@p#9@aO-P! !pKe/d-2$!:h^-=IgEf!7Z&G.KJ[K^0Cpg!%UUc[9KN5Jk@$`Il8L0>"Om"rGGEPU]=d4N.;\jL$eq LG0K7H1Znu@9Em,S7<cLiq+)0ocMOi*dC\8dX4^]-CiBiQbN7m2kj3Ph8)Hs%*=hchB'E)/VAl;!IN Vm:43Hg/g-OJfM]Nq20-)H0/HD](LH,?mMY_:`f(mqp2I;ITKphR'GK_G%UiYmHD&_K^qdn#&rA?*u D/HCl1H9-p@=T98iLE)abIV4b5Z5-WLgL-)#0+OtaLD1q(@;``N3-0dqP=\kBGnnmVAuf.^h>@FX-a .,JMdFfaM>_0%Y]=BK-P[NM9U''cKcbn-V&=999+2cE;mtq_%),!<,@%_0:k?04BOl#B)o0"c13B"] XcXrK;3XmfjXGc:[OdJB_R1R*JuTY"q!os`Lg]En^De^AW-lpnO8;75@AHq2PdS1:ZDj6TG=IYi?#g UO5[2Z&5]G?^^<=l495H,Sc/5H^D5Q0l,p'pfDS]'QgNYc^O(4oIso9C*3d@phPV!4G@jj,]a$D2@. Ze$!"ArUTYC_R6feA,V*EmZ"Q0Bp$MET_7lN_YQ8u0CI38@<K[A$[QR(?oq^mI;:u-JdGBYPWTU2@b l.F1D).DI\(`l=i!;)HWN86S]DDmO$+99do*P'P#>^`_MRih`$,B+40)Xs%5/l(sM2ZNm,pDQj.7e1 m;L,T[Sh28\)-Pl6j^DZ\8!t$sl^etjH3;/$?;pf1c/.acP!68Ih-SKH>Jb9W`]aXYKR8rF]l6XAqi s;=/<P3o@P2IXVYB:J9c9h^uLQM"_'pnM-%q5%>!V")H!1j_nOp#O[)T$Gc5ir-`9bY;G=V;-8mhih hq$.)>%!VcH<cQ[j#)MmdB-A7Fo7Z?_&A@+F>6V3T'73I\$J#'JPVtkWW"fuV&B"ULs(8GU0ufFP@K 9d:>.O<_1=oSGd.[V>d#9&pa)QFI-1B,PE4ksdI9f%jackJGq^t!!0NH4!!k=L!E23KM)P@/tVW,C; `TYc'cF/cjfZ$i]4C5P`WYDGLp4NIr07]Gjl6lO?E<$hneDl?_O&>,31W`ApajT4N9M\,<r<%9H(80 OI:(3Hh:;+S=!",<l3!P/)!$"*%pg#[FMPh6o!7I=#Z<%%108%B1Z%<LfU@Q,KC7nc$!udfu9-606p )*nb>;V=P&\1J*]_88'`R08$p.,gH_`KibMjOct7h=i1II95jkFU2!HX5MWAUR2r#d>F&NmN.u>AS` 9#<#6TW_`\PLB'Z+]DmBM?CF$)e43@mrl9co!bVOMr!9N"]SOdi-eh8*pO$l+"PSBgMG$bg^?bqlE0 [Ri0OX\o+ha8WFH9L2r^(RP4%94s]1'KTRaH/"mX8[4-Qj,]od_4p$2Z^i`Y4lH-j$KCC"!:tZOXp? #f$Q]Ii!0<$dAg5*b6AfQ+cDi@ghZ,N#pRElsJXW3g@ZVobW).0,$u#"dAn=TD$<Q?k>qXaT,FV/g/ u858QSaFO0(S3+md3,SbRN]@I=]>5^"2HuYis1]+)r1sdT<"atTgG!>W2ci=%n4,.uTs!.[W^]5k*M b/AoEYE'$#WUh8i@l+N$*]!>_#%8fb;Ui(+$ni]cu8,PN$&+>1PoJG8+W-g#nP=JCk)O3!7)g<$ik' t!pJFhI.WC>j8]es;9>m_#UF:>%NBAY=Bc0LH/^uC"[$-)ip['N6&kjY&El3E')GW45oB+q52ZO]1( FLKn`:>ebQ96/>dtZ_O*!nN%6m\o02Y@"J#\2$a8a\7"@7Y?!"+42T8lDP)1W!c!GDMF))e)k=K:G0 &YP@C!EO_,hZ_($Z922\ZI&])!?[tedGdhhi<A7cS@ARF60$SA,TnF!KuE0p-RZ]aK]]L)\_e>Oq_< Nh`;uVA/4Q'L"f(rd8d(ac@q(5q^!CJ7"p@51i8Z3A0hRO_Y:$Hf!F\h2!!gf#L.WKMbhRaU80/VfT K,Pn,RE:AIE)ZUfBuX,24t(kWpFs.h1$7!R6/J].(J%5I_FVinbVoC_-`4Hjp_<YhnQYUbrTk$2o/Y $5COXfa6XLcYK=6c?ha_T^]j@Bi.Cs#/pQDBJHDJYph;tr*Xh>P/JnJ(J.?N+p4"<=lZ`3tK!c]e"* KHGF[2CNie[iOO/LK%ZnsrH/0TLf!+p`jTE6DlIu-"8!k]ojMUWg>kTus#jJ*0O6@kdf&G\!^mU/XC !!j1.')L2-E#`]@,p_k8KK+rSTEsV+"G,U1AjgML`]e(084.,5I"=R85%&m[d)$@q(u[J")C[]B:m; [UWHfAT%$:)N!*UEI3)/`sfn&B3o<]FUT.^dW5]LTL*<cU<Go>QSZjO2^NC?XYA]Ou-?9s,?[=#Pn< /<u9K>Sc33!#m0#gJ1p&'P,3#o-s;ga3\nh\Y]h&PV*E!>-Y5cOqeV!DEe9^fNLZ@"Mm^)'B#LL"r9 J-glsK&e@X&(qkTFOo3ZCOoTMG6sp,P4=EJ)[fGJgC<b"e!h=t'T`WRUnc4AP!+6ff4Xttka;A@d2p \FUD+'+aTass:!W_Kc?AS%:Kp@D2j)Y'O%)AhT$=tus"9Pf/9RW)_S_s[1L8k69!YNWn*!nt4&30e/ %0F<r&->a79!XVM4CE\;U&[Fo?iUIo*(#1P$d[3$#T7"n)UK5-!-05"ckZ*PEZl4F's7OW+V`9<NW= )C&g.4p#Qt-B@2eEbBHa-M<]E]C#<umk5T!ec.012F!*p`R+;Ypr?/Zjo'l&)&Ta9*[5(`pPFE\<0K khaXjp^H0RZ]h\&sb!:+C!K4+?unGKJ=+2!?`P\EP.hC>ektoPsC";Km>WeP(SAD243F3KOS26d1<% #Wt7GpdW>Jb`''2\jVpD%Nfep,9(u]!7j>Nn-=T"A$LN*9!4UkfQiSOar/i$1.!6\GQkOuMBAQI@'U grO!$BSM]cX*TS`HFD!5q,L=9;`aL;4ma=%I>Li4e1\,'R/4+DBTY8T:8g8/.5DqLCA@'[hZ,+#*3M ogsk/R+Q!rM#%*#0IJ1iER:&N:-`fB@Ss'7(]l`q2$1af3^DWd-O7;@Jmug=:I&oB9;:'\8-(c6$m= RRMF:m`KXLRTN$=i!!us;57&62!2B<jSPR-<s&lp2BnA=fh=/$gV%PE8<U-CmJm"sX/+=(bg!XDD`B A3+_PbL2@-U*/N!3PJB]g6O4?\'`=K:8N!E*f&k`(:.h.[D.b5b[s'+c<k*MMMdbME"<p?mbkFO^b^ (!;$BG5c&]Sk!:AdVUuCj"5'>^dgt(4THXF[.[GuBU7V/$BM.)K5A13#""V5-<1NRqTob4WTD1:I+u &NLTf:_b!C10X(lV8k!!XDp#\"A?rbQFdKb@c(<epsTRXl-\)YYAM[&K-*SP!)\+VKB)8&KSs^k\*b '14'H)k9McTEo-d/c[%#&iq+f6-@9E!.k3d5%"kfMU"W3(RNo+2?n6_Z"+r"#6)UoE(21)7`$`F!+e Ei&gMo,e^-XU%hpA#"WNQ@3&DBNpq]ZI'=pI#7g8C,T>]%mCBTX5gL`i!)NFD^d[1%iNN0qGQs:I0; WCn9qcJjQ!7n)]1k/qgcfbGC.7f5[#7#i;$jY%dGq^pFTr\8!S1-2NU8Md+M"775+q6O5LEi4[0uf. lUWVdT8eN9+2phfGN(-G#3&A.$R"j'+UC]&7@gJ`80L?E[,rAYi9"[Rb=#@o&%Y1?`D$0jm7Z=Q.%4 Zm#`@/12'5O0[!-S'qeO]TM*16h4_"FTcl6!s9YpY$7!;T*KU&fcF^lgMTH9`qC@HCSX<I=7)4$X:W 1!iTm\,ett;aQl0!-"!.ci`4pktR/4n%r53N[\Ib.*`5^!'i``$EtG]7/Fr8aFNt\N8hfq$hHjIEh% d_?'.)Y?dJmc!1sL>O:q?(TVq-q'=Ei`o&_eLd#4H]%"8fq,^cpCrdW]k!!iQ5J3.'<-l-3H$"+U+" _N8oi"fu11,iTk-ia<\1jhOq-qULj,@EuK![:=c`hFj9&HnoF-S[sm!!pB%EL]E%Yf8%6"@)r:UuJf /HiP$[?I>$_!:<Q`&g[u6\!mY"n=Xb(5o?8gPWSqrMV#)R/,7OZ+9B+U;?00b#9\EXa!<?-p,Ggh(j R;S!rkm*,&@ejF%@;r<hLP&!3q^YYlJBH]n/^;!W\.oEb_6h5$WqbWmm0^`>pDC&2:*BJ,obbO`<rB +@dUkQ_=[]h;B"Ya69D9;3AQ<ERFhLJq.A7E(@?UL&h(D$S7Gqj/YL8mM#D')h8(0D[6@A"qT(!d)> PmdVoKcj)HHpUb=$J!$K_:)fu6G!-bXL&qk(a9>2]E5aZ0mW&QnnAWd"@Ffbj=UKGSJZG6Ks"3:KZ5 ^?ER[YVaFKOFnIN6GUrJdiha7h7,ci,NtR9?2XpL`bH+3179F-!Z<P0L_]X5E#:\!!ReGc>fQY+@P" SR8X$KD.63IR)_c2#70ps7l`/B(U$X9bY]+*cqjc@:-03qZ<%20C-hns+p7nsNlQf!/d+nur36gG$3 5V&o/BbZ8lWso3*?5/Jd!8W!=s8'naI/N%s+)D:]XZ+'S*AP!N6;Reb:a7:]Rj<"[FV8!<.R@of^5# 'EAM]!'Cb5PUFm:*<79S!C/ds:`.9S:]P`6"i)=I71fN@'EQS>5Z/)R+=2b%5hH,=J1qN7gWLUiiCO ZH_>k]0$ik4_!3e?i!.#>Y+A$M["2GW!cX?tnPQ:2"A-H)O&0_*V9U$)hYZIq1=FnKa7puSX'b-lLg ^4'I*0LRa+^-.o72t&%$N[R6!72)R^e4Y->YkF9QmF0]!!`cV@7FZJ4[T7C.22c75li)Z'EDp)_Otf u+@1ea&1\Rt2q'@dJG9KVJ1m`M(]^>J!C1ED!)3Lr&1Se&ErlE99[-#!MqNa`&.8aD1PGhY:C$s)E( tm9\j?HPKqMQi_#T`#kYVXOTo]8!<sc[C;"8f6cp@e!4XC+'63?X6,le]Z!\c+J>96)^PQ8?!$%SkV 9mHkRJcak9.0._H!h`4=!("[-i%$J]#"&L./2R>NPQPkl"]ij3"!AjK!.r8oE%=$NZ,-T.CUl;k'6! ODPZOar">D&c!%\BY+?;^f=oec!;V;Tu:X%>I9E5F;"McT_!)hA^;?6nD3S)u>/Q;_h<V6n\<<0C," i+66#o:>C`%M)jNroB4<*]LbdKNI$oQ$+J<@K+O:^b@5oiNafR_l32\o8#`5ZJPP4>7%,)6mAa;r<5 6DucsK'L3C"!B^]'J?D]L9Hb1%a)h?\+;[9U`@N\CH4pCR02+NGJI$9X4^8B2TCpND"UBP`AH@`m!! <3T.KBHAebdia_2]GMQf)jl"XM.l,m^AA'@[2Y0-jc1'g5OtHqb=U@T<H9:DUar@VCp.!Pf6:cIG_n JAstW=AFMT+X/`[!%`p,:d`>B$]*imlRa5G_PuXR?jd6j_XM>d"=0;1TE&d]$31I.!!lKG+[XO3/-# oe(#f3%:_!Kuj8biPquR%@O3hrJL]DrPE%hc`UsK,2$^4W9`%(ffZ]j'!a@R#5!W`:Q?jj%M#/r;;! $q[J:dZB+q>piY@*O$$_&QnaJ5GAD6Ek&V!!7eH=0Ii"1R!#o!ON1H!4c&0J0NoVo>GM"$Wp?@P%Iu rgd49!/+?4i';_o5jI8"@S5lb';%c-p5gXdM$G[OR!16I`h3Xc7oF)?te<Fbm(+WAoeQC(%]N)dZ!G G.0h**N:=X(aahNa@.!.KPeV_D3Q;O9]d&R5;Q=%C%\Bb%[Z4p'-J!.4bXE$r9u/\l&8"ge:"KR;jA eK^@s>%W^QG$ioP-C&FTUE*4o!mh/p5S5+BA40<\/J8d(A[R)>cl8oo/-'qAG)cT15RHoaHi[LY'p+ ?$!Tr#a+rnC3LmKX/"I&pgR;LLVa8k0"#]KnLAqFY)^]o`2#nUHE!mCXTJ4eB8,SXa=i(806*)cj[( )=afm>_MR(iZ'"5R@Dm&=rke#r$T>T".>C\WkcZKP0N%![sZ#"LV).@!%Qbd'aL%!O\iQQ=SQ"=sMY ?&"EYe!(ulqOD`3nOqUuo4ACco@8#Mk1Pat@#\Y(cPCLL]#``MY1k?dWC=$VWVmJlJB+.6C!8Kh<J/ *.V&-/T^ZI(036gnC_^];_:^'sncn[sJW!,JBC6l.0]'i8QD8lWS3i%@k-?iU_aH^[R'"9af;blY[G rGc<U3s<Cr!Aku6ej+>nHAigFigL)RYb1(eMDX;-TCO@i8:S3BD2JDq-t+q"&eb6Lp]/P\ccCE_!)W aK`_18,K18<1jMW>jO+n6+$5p0>hU[)F!t_C8)ToQ]7)6:*IkCjl^^/Zl&HRcEk*CV1+9i/Yd"3kQ0 Bb`a!@XUJ,;N\[JkE/ba:V^fNJYmW\UuL;8AP0AQQQ;nkcFjiTE*4YOEc?uTdsfmA4+e<@":;rJ6&A jKf"@7^3DX_EW]kM.)+l0-jc\:R:A.["5YBq6`5N;m"!2NAJ+e'NG$%[e2IF2@u'cOB%T!S`r5F_RK <+Pr\94TE.u=)3?fT<fLMrNB7L$"^]HQ4A2J%Oaf,#0T0$O(.T0eHI4-d'M$B\(j!@;7E$*J?ngQOJ "/[L8R>U]s?/roF$FQU]BJm[*aeE2bCBIe66'J5j.X_Ya^-F;cj8>N;`p[%55tFNppOUA912A9n!=h )a["J[>+c[8Z#'uYqetS]`@1Zr\#%.Ei^l=cu@%Q(1;H,L#UFZb.MB9':+\IcH19e_X$3>YX\7h.;" nVoN^nR0<oE4_N&E"&n"8T`2,>C]/&HIdB%u^T#.66=JQ3.Vr3T-!j"$]:?J.Cob!!!Fh^).Nr6rt3 *oE-4iMQtc(0a[nOM?&I.rI?m>g)N6tBog;tQ3/dS$P8MVUl@f-5Rn>_3b_g^#&'eP-BMY0BV[bi3T -)&V)cA!isKIqd0*:'!oPWbJk\:#/;Z_C3m\Ur!<Wcfl8'%UdX\JTdBFZ'5SjL%>_FDads!)n!_k+) &.Q,O"R/`T&"n=Q%Jm=2Uj5*ue:@Wp16kP2&2Bn$1]UhH:*q"*B.8CuE^2R<njX1\B2Di=qFtLGXbL YJ&srY1`Y>YAdK<Bt$h06]H2rI:0[P1d?/[QG%pU`Pks-JN[Q&SjAL_b7UkiB?pIunI#AH@5@VDRD! &?54a:B^"<!l:DP=m>cOI#m-D1tH:ht.$H5`ZTY'`\@c#R:`:69hGL.V.TBD]qO<&*O+j"@3rsJi8p o>OkB3Vll(bqO4,\df<TE%ksdj5ThbOFo\,5&eG&5!H%l@E(]<r?JcR)X`P;+Ke+>PQiTan]($<l"4 ,e!!VatCJ\WjWlD18Z%iiptp^f.=Es_qWVV#<@5`&+1r;^M`S[,*]!._!Y,Vss9JZ96f3.*srOAtEG pSim.ckr]!%3*Z%&>Wog&\sTr")C_1]);&nj?Q&MPE#b+Ngo*o3(ZfB44s5F,sT0`QYa_qn0Ck`OLc l;gu:d@5p,ns5*4p#+"dp57i2Z1d2Q+o$P]Q:!._QiLj\^r"<\4;580,iH4HGGQD.s5%QH/kLOD4[p (_E)63%,#-XEDG5a"U79r_=bUll@_.4l[=;Q6n>e)AaY/aLl\ndh6\7?+`T>5]HY9ltmc@&=:HAkJ3 (8HVe6JY6nX'EF'F'nm8H,GGN@@]"gPntQGgW#!12)OJB%l]"Y=I[C4V!2lX`^_4j\QdBX"(mq:kH4 IkAVF3Ya%R?!r"q"aW6ir)L$?34W5q%8ag:0,)6-TYmBnQINl%OX\!.A>]B)2UGVCUM!RLd=Q#llEi 9m-k_.aV\+Q60W;AuYnTX69dJ^o[A5c`05tcnm04#920jAs!2s[o@:E'&XD8j&Y@D!t>:h<a_d$J6( A]2QATp"#'lm25@-2&<6[+$UHcAW:U2O^kg,CX8sB@k'"alH*/V70TF@4B+4VK!o7_N+t[c.VPlXah NJG/V6FD?aC>j7+^U9,Wg!M3NMKaZ\eV5[M(5a,00C]jjJ@/@:1PADlTBd%`As[o-irI)5N!!85]0I K1]NOlO5_NA5%715"f*h^\/>2F0)ujq!=2F_+Q!_4nr5aShZu0_L&F$kh5FXNa=9quNW&o3T],AA8? 4t:$oAf(lPU93j>X9'77d"R3($>ZiAmVQ#AGrtQML^SJ11N.eh&%7ed;GJ0,K.)lF!Ld9kuSJ[E9R3 5e`rO'Wlhb2?<tlXgEi>lF%b0E@ZVc&(E0sl#j5ia9,g#00jG(Y1]d)!4N0/FTCRH\B:q7.j,CfL&m [Bed;aYY%[-Bo;ZI)3blm+<(JB1^cl1g@X;<q2t1nP2h!:L6IohQquD]>%t(EZU*jnQRKJpk)">.XV N$9o&.a9lec9;c#99oS5S0S!p]Hu#m7Ieg.b`bJ.e7:%LOa2LQLY%/l]`md"ZQO>g.DW3!d\W@n@%$ QEiV>'\SA;E5l/X4XuJ1.7RQ5[39'8WqPm3jPYjmp"_=h,J?oMcZk`Q?0n:g<Y:U_/nB52g`/CK<%r ar-5Z\3qn2!L@%`sY.SpMMjWgVQCaD73`c[_mj"T'*kVAY'')3A%O9%>3-+WH8cId'1,Q4a>55XAl` KoDW:nabH01c/`/'BU`3+meD9k[8rh?NB!dr/n2*V;or#*^a<k=.nCPktY<I#Q+\u!._QZ'n.8jR0p O,!DibIYR=h=[u!5/P$e:^>TCO4*$K2"^L/Vn!-nRZd)q%Cr.=/=d3pfC&gqe=c9mRAY&NYk1dfMH_ 30nRiQ!A3&$Q.(L--$BC'6[+N=$77Yij5oP6p6$,RoGp;=8=.XJVd(>btS;>d?4nY`E/uKS7nuU$4b 6_%&:794o`C7\M\Q1jT@VI,es"&ZJ6m^5OJe_#1Fe+p,P&iYVHN<@GZ"';3\;K$+u]5b*S7%H'14hX nY(3I.TW<MRt>K.RPIPV8F*9E6cYaD<RpJ2=f_ZpW9aR1p)2ZVCufMp87a?k+\0C_//r$$R3/S,uE> /jSO61ZU)Q@&J$(h@9*Dph;k.B.hrR\[&k!go$j1"5BpP1<cacJ:K@i_Q"?n/474s9!ckq5q>N'ZXA ;@9?Q>%#ArGk\oP-6N]0&(BQrG%V5#K="-i.9!#]Sd:2=h?U.DC)audt<'Jp$:R#q\%0+^Fq\:R0eW FM=9!Q_=VV[!cuLp5RrXMGCZK>WbJ`4gu1hPWRM!71cU:6_E(OL/VM[HDO<-34)n!7RM?X\$L3_R?g @`gfYeHEWB-Pb\?:15$+_\kT[:?f"!i&%hoG!(YecI^8i9.!m=dVP>RdOO5O8OMERo%t"CVgcs^,?o /5+7tO+N(=?MHFAHpFrJW%lLXH2K/N;^T7^]4s(g*(f8mNo2dk*0mm_C_h&',O8Uf<7M3$tR.l.-C/ !iO1ClW.\rAM&CVerI$n/RFW6\?Gg&c0#R%[]W7[UeM'%-S/6?$/QS!XneE-Qm;bW?Ameo*=h'XESC ,)[",+mrriE#N5Qp>oI,/?-Ar0k[=^&D=P1Wp<38sV!_BcFc)^?g#.L:%l'UbC)/p\^`XhhGR;Gege s`uflom+lr]WJOBf+Z""'tuABTPc3]n[#BhW?2=L%N4C."AYl7D%,WD&k2mo?jQqc3b8aaB#Ahm;[a +"op-TJ\oh^/hZNh/(5OQ2!sqWL>K9d9ht$,Nj_)&6ib`:&f#pn]<RU07P-A'$RrL&XXW#SY+SQBJk Ob9V6R-1>LhSX=KSj&nnb^>m8k7XOqNhVGIuO[ZCYoXS(=aM9gDqKe\\^u/R</DQ99FE.C7V]\4\D] Mqgo]-Z8oufJ^3R7:JpD@Y'MUE.ckJGD3.=5hQ4DnO5XW%s58_c$,Z;U:$euBH+f@[^tjkMrLhH'l. T#ikDkem/hObcF+RMFAh005I`:TM[K-co:jSJj8la`J8kDB/@EMMM4<9e\'1sjX&_?lbH5m`k>Je/_ 'F-Y!cb$j-j/UXZ8ZZ6/'<aYAM/7d^&WEe!C)e)k)8TnB-@;c[uYF"lN"l4[0gc/@;);q,Q3A=)?H; n$@3L(.EU"96l>,GgP2l38&1/\:h:RtK`N*BOqSdg[KK@=jCK/?[?<ENW2PS"70eq?Fs.mAZO6a=73 e>*903]R4D%0Y!U.,L(:Pe#PS@=n(U='D]7`F@_#`c2&;qDK$\aR\#qbBT&HkaW1#cbPX;@P9_UYTp 5)g*RNb1Nh5dD(5$qk$.FWkIT&1h4mUr,M9JW2_+$W*KJ/4IAn?)+:\Mc.]F8IZ>OK)8Ygn\mXFJHB eZ+6Aqr!(ABQMt2=R!0:>uoV.F:5t`;",C'A1X[bJDEj?*k$eHPR54O=i!!h!hhd$He#[dZ/^l&6u# e"A`bq&=7!APPpORjXs4E%.eo*2nM"W9St.^hh86?'<i]Oo[63u($g:[d=%ot%>,00t*m,e`_:4b+& "]j*5;C[uqf1MmN?#*?Lu5WsX<n3]A-dlZ7j!B'oZ^n,GB9nsm2cGkAf$6>ej]I7_ajX't,!PA^V&G $ALaTW\Mo@eR)%ikZEecR?6h<X]B!;uoV48%;n%Rpg2#>Diu!8?c1@_Un+hMVC+"2J_;d,gk4!1]PA pL,m4JDH".j8a'__RRaC(]:*#"E>PdH'JP`8QYs5NWn>o8-!#G"$fXB!::F>JS50!quQu9>:fheJp` 7`E1@bD!e=B!!00tZi+q"?YJL<:590_Q_?&$^)@Wnu"r0bl:^+Yd;ul,VoTMc6cY/W,LrUb@8.+b>6 I5hIEXTrTJ2%')AX#dj!4Y\a_>o*g'`b^0!am]YRG=YcU21qj`khgcM*(bue,u?o5QGFf"E9)d!;)K Y0Og?8AeP>U2G%!hJ]8B(U^.=&,dCM^!7XpNTNlo\R2i=T!!FI_**2PT#aSp#Zg^\c9KA=@^e@l2(X rUb19FRm^lOmN>l\BaSr$j'9c!d8AH?=>(P(@a!U(O?J=0P->l[%<'4ik&!13oF&2Isi*<?K17HIeu f=f^O&Hqi!LL\N(9O3hpTl&@Sej9Oj;9hp.%fjBqluF"16Q&6Z9b[R5'`f-Z'L9qi/Q;^Q=!Z430i_ >l.G#.KF!oS8#D-%cDj,tJ7P+UQa9&"L0E@jL"Fr(KR.UfpWDZFjZ,-W_5u@X-!X3O/]q!dr61@J9$ V2U6&OuSd$]$96E1NI#e,^[_9i%@:h'>O.QQoISWGD&4'.6,.=#Btn7#LI6<$;d&]hhS&9Z2PJ&2Hr a#h;Hl87>=&6,81?0ak$_>G*;o!)6Dp?nk4Q2AXN9d#hK:^`.D2ls4nc(P,]Z'(ck>n22?h;:>aR]" ClL5SX;dnIRS,)`7Yd&Km;?TM.KKXhk/_/_jM4J]>Z%$jHu&#b`tA!6g#tcp!gr+p.CuG7Ad'^_tZ7 XB?\'b!cloEt1J8"9BK>qc2"N&>5O'!0;8*c3OCM`-'eT;]=-f?nc7+</Au0AjHE&;ZpJ[6id#!"JA H!&)Y88&Lp0KNme+b-Vsd]'EfP76i_oBW&G`fZ/eek8VKQ,%fj"&DIGXbPQ\d+9`WMD6T5!1FIdp_2 N,odEg(J3+<4ioE>ajl!<?H2Iis;r`JrQB+HEg8dn&9qe\*.p?![.CjCMOu?^:pZCYXkZQDNPSmai" >&:A$2!ARW[0k0j4$21N=!@g>N?lelRfU-&_N%&+fnQlWaC]X!nJ+*Oc`euQlJ;K7r1>);SGcbQn*A MSdR9m[sE+ZF^BIMSGp9(72*`MPsN8\?j6!ZV$8L%\p(<2%o@BVCkCo++>fU-WD#:Nn_5YJO)gLat] (\"YsA#>Ue7?5;rGd1]$UQ#q0Yr^<XM0'FKSd$$a!,DRb7XSnpdkNfA)#keAnM!i]<sKiJANU3>!Dr k;oE/n1-pS+^)nZ.p5VM\djMnIpE/]f^@KF>)i`8T*H%6hF#/gNk^gbN4R:FAU3)YUD'q4Z+#7'GsP ZV4hHe$,U=A`\"<M%hDSi.a!#A,!.N1XB#r)Z%)+61>\_1k&lj8g=-?Nq^@!'`_JUXKAO\O]Moe.HE 7895!cQ,o<E21h(/aRP^>0I%ZRpMp/NJe_k-kAD)[l#m0Ed71NaTlGntJ::/lXm6UA*#o*->UeHjR_ td+_N]8D:F*2F%+3b/,FS1HM(&Jh#RF6/6jPM4%Y+Y?9L1oWO9?O(#MH^)"1S=bJ-unj@*%@oG7YbH A]b%F[[u;t]q%>"[-=.n5rm:A/HhN$Ar7*)5mr5Mi4?^KrkJQ1R?@Z.EkI*,\9\>c^IUtuP06Z\d@Z lE?)t=EQ]qOP:7F;80Kol\1Cu&139Z,^E%:maH7M@gj0b&r6oA-<-5R?rKRqoT!-e]R_%'_$HAMX+9 qH6+7l#XE`'aZW-\->!(_-j#n6aPMB7N1EAlo%1!.&_Xq9$`5Pp$SVN+N&Gcst!-To_/=I,G&2j"t9 RBdb`eCnUo\N#G<K>*WWC@`q!/#H0$<c`^TNGQQq/7`1,r1TH*Li!.]"6(WN26G`he1'!sqIkWk!Wt 5?*!'q'L-bd@s%)Cg'!ZWh1dGRA)V)@N?\C/;QNDrHj#Q[aQ!=Qr<VuV?%J/-7#jBDZc'qiNdZ"<tu nAWgs7Y"7^at3WMan[asbTonLT>iMi,-;cuE/tD.D6/Jt#+-7i5[BNQYW[$Bd+i6SZO6fFZ1Uj6(j! @a86??5!6"4X_Z:C#a369].rgCI?ukH5<=cP0We_l6`T!'s--c<TdnBd%4T*?eZk"00/AU4r!iRJEF 5B5-+95G`hL[U<"TIps<:q(/)@@Qo@OT0P9["+K&HFp^Gn^R!5&$!n1L=1Fl,=gMpUh8d$jsI>r21[ -Ud=3=Zk7g1&o+"*VuUfL2p3T)9&4<LTHAphjM<^3/RXft1'f]SMpIGP&@;]L8dKqV`6M`j_u)NI(a K/gPIJ1_UN9[<"]U)h#CZHK5QXXa%8`BJb^%B]+ucPMU9dmPI`MLt!8n+e.*8[8-.$1m5b<f7E'"FU E'OQQ49mG$`s<4\=?)P'*T6T%!_A3I&[/DhCk-]&*SJ[H$O=K*GpQk6[4Lj@!*t`/@F=L!W+4gR"k" R%UrWf3lq.l/PB&A`!F<dX/!_g2&&Bd72tdC*9oHfK2MFsn$53D=(T/hM+]1?)^k53nLd2fKL+`SJP (=<9q$@c/8o>mI$qj,0V^a1d&8VAnLG,<<TL!s.Dg96EKX/BGJ,n@O.^M`6c_1ALlp@?Ln-dPrCHrG =$hZe)S+81CGKJ)g.Y@c(8^qM[GQG]Sbst)bdA:2jnU;&Nh$O]d7`k]tYObZFC4K):#4S>e76ooNh# NJX(TT'.93Ajk9+&?_PnX<#MpW^W!-XJh^]s]U]S'q(ZG_8L,X>kS]IKP(C]OV<2g@rW5nMDd+^rF> &^&McL3I_eEYC0_\QfB='e4$*&I)]$/-(>8W,`t&+?0q.]E+`lr&5'!cBs,n;<A`d,)>k^]uV7=JH3 K%/.)ku!8pK]!6/ARdgsY=mBRNNET@7k!4*85aO59a@Sf_Td^c`rW&s^`VrE4\!@3O/M7J#6?oUh8N [UPi7LOc`+Tt%q/Iefi"T4?Zhs>F0-iclC1QW(M!8Hh?@L?5cGH.PQ#4Vg5c6@o<7`bqe6BE?u:lH/ @od(.LZU,We!14(%V'NlN*<hUZLeq_m"fIOa^s8Jo+V@`t+p\0tAcEGE`!QO\]<t_25RYCa%#P<!#= ,6W>KrV.#Y@-+!!&LE*_"Gp+nlcD1dDL>$]%2BD98<sa[.+mh'8SK8\@5="HpWVie8od=oen&&H$Q- ;o]W+Lf"qm**d/0+MUk5jG@+nIbY_J&]@\M;qI8`C'8HA!2*4);S*H?O?Y18cC@oX<uQ1",utQW)cH TiZS2A]+p5V"-%ST"(;g.1D'E!_J>P"#+B8LDYg>E'"9;C9!i7kARaV7Ja#QDPPMS\-:f$=ahA'_GR @o?X!YLqGR%,EFBDGDNPQ27sc3XP;OJda_FCKeDV,kk`J*oX""unk6F[r*+T<XLa$0Xo?5\@l5&1\F poGf87LD0_9630>I'`dk-R"Bn%#r@Sh+upYDs7"><!*CEK!4,K%6qmj#!C^d$=*`Dd<</iG*PiT3U# ]LY-8rmO@o2Vp8)R6'F@#It]FY'2T`Gf<!2KSq5QFUaI+R=7jHK^V!9^<]YQ]^3-,GiH?3^IA^]:TF B*JF`HVFYL!:P%J5QK$[?U+TF?`*r(Fa1"m"PB,n)'E:mf7jW7!#Ce!"+Yk1!2'=[_*Us"-ia:`Kb4 B:"kaK@*<7>cpbdA'&tf7.G")R7!&QjS'_2c>fDs/,5])3Y<.Ok2Gu8/7Qu\9/%qiKjolZ6>@ZXm&7 Z5Uu5la"/R?:gbRcAOV_.6J0Jrk=F@W-cBefBug+Fk%hUS.],(^g=eEZA%:a74O/!OVsS`ak\dX9`t b-BD_e)K-`'O9*qK(-i$s!Cjj;0EbV]k]*YXAujTd5Sn#:X8ug]J/5g*@AMSap8:ag/AMt8!Z1qh^_ 4Ea$j$;prcJBd)V=Ll<dlX?>def&S@*)tG'D<2m0;1`Skrt0?Xe"#-=d2Y=S@qa)*$;3RrA?-"E%7* &`<dk$"nFM]k5I@FLH^3(%ZU=P<XX6cu,Gn5a#nbD9r9C5Qj&?YQSS>./gol[_lVj_&,Ff/-%>^RLh asKPLhI\1C'7F;-A07BV'm\3:p??h%o)gI)#J&6T8>d^B5Xm2^C,L?+]oKIW[WaiC"h)N`iVnZiom# 0"gl+5Rhi8f$%Z5)a4[Ypp33'%C;L83u5;(8U7@!a'<f5d3C.K0GTT*0>c.0-Yp3&TF@#hd=2M9=G2 $`/[@dbs$;UN)4W'gDV1X_bVi<!5P`X=TAJ#!$pLU3&e84B9<59!*G$O1-XERGUOo^'5<:!Rg,OB(6 M;8Z0U<l'?ktI9!iU@Mk2A".o),/"VngIY5o9O3A>^1#ekgp@3!`8].+=VmgR>]##<g9n,RJo\LbGp 4*AU+";"<q7HE;l;7rtn!BQn45SFD53tTmS"StBp*=V9bb0Y>G0GY@Pm!D&#+?8un/H?&Y,03$bR.T BqG4ur[0#;u)M0sriBs.)Y4f8V)Ih]\B@u3/HbFO$U?Q_?'^bNq4jP(t)h;*"9XUkN_FU#V^$I53)G OIbnc4i4pJ?AU^)^&$DhNTs[BR+*?(F8,`!,14=J7Qg^5UD)-MmIYAY$4El5siIAAOQZn%a[:7`dH5 `#N,0(5B(gshF?QT(^rC\D)[E)H;BXRi9HlnH%QJ1#j2K7Xm!Qe2rB.nO=K29-u7`8!#r]Zr<&1^Hp aGChqC"P^jR_lhD[HVIZ**C8Yc];UB?[0k"=O4'S!4,"*]q2p%NYT=?o;.`Df5*r'SU2JccON6S(u% 1\[-i#WS06dC:0<2Z]th`?j:Y6#`hX25\>O@;iIlG>^og9:Q!s[P*aE@,&=P&:abr$f)T>-h3E^^d- 0CCC?3=7`WS1`d/V?$`B>]gaRG:5jqt4bkCs/WZ$4HGfT2*mGC/'#Si#>gopqRa`2[_E4:8s"D#fUb n9@tc/%7dWVV;S=\H9BPk5Gtd`ZEW!4[EN'C5%($PXO:Csc&J&uCZT_ecDH*V_rdK$SZs%hK9Rp`Vr YpX#>\i4T@.9BC:C!R;E#]-afB!;^[QR4o!U$;e:pBtVQF(ROJ8-4K__%!3gH2qi9^(^=3Rr31dr3Y Ka=c5<5s?E=J)]#64Yhs;QHoPObc+o\`KD(msK+Z[j+:)$l_d3NeK6PfZ@4/OGd^!Yps-BdXBNd[S[ )e0;jMD*jE`Z7]EO98P2j8DQrXeu:^O?c,8BW49@N;j!2M*Z]O6fZ@7!2'PW'(36T)!<mrYRl,CN-D ]-5Z+"DJ-0(/dh;`F!)!PVY]Ps/AVqe4<^6d"?o"=";ioqQjW3nL*8CPm7L``^!rtT^S''`p7$7Q[8 E%_>.5?o#gW)2k?j.,&0cU8aC`c1H"9Qqe;qniSI!SJnVuk*SNjp>K'=mGrjW,#m!,<=85QbDE,`n% ij(/As+EVs&d(lY_F<B=+6ILi70&8K15]22R"=\TnB)qi3gd%)XZ4,#@3@&\HP`.aN2;h,l^k#$U6E ^(cMEk--%X9nY!J_7u>`F;k7NP\8!DuJ@\*G$m)gN!&!Q56M!"psk+9BBq2F3<!3Xj+An.2/oICJSO GWZYt3;cL"kERbl/s1QD)!a*tn<VtnoAB<pIg7%fpDbtiW6@WU:-jAR^.7cX;4&.es3MG";p7U)q=. $qbX9eQ5<o_&j3]eBDNBG)pp`NeN_btn3>:qm\WL.00oL"!DksIXesomW_AL,$O-'\ReO)A*,\@B c`ar"$S?P/V^mohr#H(#T;`J!ZMUR<%-+#4DpR>j(lY6c4=%>j@!eo0RlIE"M+(6^]6YmW%j=!j2lT A;47"XYrOt_&Zq56G`,LbYMg#n(ncTbkKn/e:(Y(s>^<Z(Q"N@UcbUXs7H>Kb^RYrfgq._2YYKuSTo g%.^4`mU*]@DE&-QH-'+,=Ni%c]=:01g*5/]F0Pii\7J5Adua+h2;[s?+K^;Mu[;43UM+ZL3LRWmrr _-,fFlkBEZG4QX.'B+Yj%412O*l1/c3@OrDK<p,4/g(M=EfGXW:B^_S<</O4Il0O]h#RL7!()2f/-& V)!YA^B$49&JU]=4e.4OI9K\T:pbKY,/!"1TG-_a9T!2G,HE/,8<#(Wc-6l>uY6H4S-J5A3/#-qF9< ii\2KI4X0%Zmn[!&.@2V?>=*OcC,E(ueW>^BT<SV\.E%X&D(B0*D8fXP%_?!!!(Q/*Gk&ar1;[`RcX DPbfLs'T3-9AH9BV$ihj":Ei@Y;[%\#[9"@K)Ue_[G8pU$63;*6=2/BK\4'1F$j=B_"Xejt!<B5:!* %MCP?U$o."5:7%'j<D%FL[kJOfgnO+ICO;'T(QMBmboOm/gKZ>]eC^FDbU0Lc(a]EAifLG2L>_Z9+] e5-Ie8DOk#+t$G3P4SkW@JUhK!/OR>2:WEC4$[^NUW&#,Ri2=6&-.M/!^KeSV3BI<_9Jh)J1dso6>' R1!3KKO;MMOc#/L5m&O[c,;]J[Xo`QO2&<[$P#mgUPeIc<m%T&c(MJu5m^tMTbi7>V/!K^A#!8ED4J 1qf?)H-ZECNTd.DunlLBuq7c)'Jd8fd-Y1^]6%grr?-"&^UOH=nkF.?=L[#)]#DU!F`c;7L+;cdD<q "#(Rq1R;ahb-m6KcMbSaKA"f9/&0Y:g'UYWN*;fd<$?cDY,QSi&ClBD/AegdC^n@26\JKNVK0`tGSN PJRD=('5)dk$,@.%*U]R=@658rNa+QHmq*H3-QojXHEA='X/!QNaB%L$tA6eH3UZ/o>,Yp;+1KE7DV )%Zg,#UUHbjr"P:oSD)D)!bZ#RLWr8=5'fJV'^K,FnqB\.0o@5Xu8Fk'b#3VgoG9<?P7n[!&+D#/j2 La+9LI$16!O#5;UN>o@AZDJ:h*WdG8uE!B/?n_I;*bdu-(Ya!eXmLEeV2L?%Q8FL!f30Q;k<5i-<3W OdhI[[M(,NEC]7cmTDXZfjN8WrRYj^]rEk(_&gU#Yb:FUE,FdhMSl'4uBuLZufWiE^`/C?qHs!485c 7`-GfGLHdPS.^76Db#e[2P-PXP7naP*NIEXGS*U4b=TK<,EjTmYE(M1cJ^Hjdq8NQ8!h_s4gC*bg@0 PF*k966%!&4_ni2U/gOU<92QbW^YN3`Qhgu0/Z!`6R;UIGe(oFTY?DmQZP<m7Z$Ne<c+jfEHDV_f)6 9&R$SFMPNrY-\)61lF$Cil(a#0Gf=^O=(/"'Q3s]j:%h4aU7;c!&.\KcY@KHo+WU1?D=1\'2JI;TUJ ETrI?&aM)s$U*6$YPJM5]Kg>PS9,_8GG>rLDSVTk'`eqaLj!$#B$$h6c)@-S`J(/$SS:koDYduW3MR 5AnB#3D2W6j)5d*tJU48]_-Cd^bGi!.ZIo7FUea7,M%<QiSmkZQdht4XA/n?^^C0LC4.p0S_5f5`1b l5k=OriUS9(!3>N'1[GMM2]sHnp/LRu:_U#_$in:e'X(VL5UTRm]]!R^m9J0TMFO=Rd#9-:>W3(AN2 %`$mVMq5OLCP&NVE^aAXG0/72S&ed#f9k-K*mS0TmA>IKo9BYINGoO!b`1_WjnWV(JDADZU"To2pQE +O6VMO8'L>b"*0,X4^MW,T#(AKL*XT!%%pt^`\VWH^-[C\lTS5cY>cXJ-2:b$4r^E-ASs:63Hk[RQM _MdO=)bcjh2nm!?csjKjWqo.^;1&!'4Ef;V8^1mS._[*A=k&HG9#A]0snoUF&@i5$fWpH7N1&2&YTM /h<d&2$ML/&TT#D4=3B]u=r/lK:g8#.OX9MJ>I'ZLfAi0b@(FZcNF:Se7nJ@!jXA?;(BSM'O/EFJ5D '#6_>_(34qQRh5W^q$'e_@,M#F&EMdQ&0T6)N(9ptojL!L?p$6ogZP'b^Yf*FgKX@1SL4bs,72,#Ie lK7JcgZmoSQG[I8;7>5l>7$E"dLWW(R[AnYJ/h`0(s(GW@!*!0iEumO+,#HkQX64j^EH!4\pa=oeI: QT\Q@Ug3Sn4.%M3a8m!*SLDEd1_W+ni!!BZ\EB-eZ-`+9*%8&5poDcS?8(#F"?&*Gai%]ZM.T"+^&A *JJ0l0@r>/jlc#]E%67Bed._[aaaFIs0\#f"<Sd]S0O@scqB![ef'r%q$',*MhC/,1Vc!U/L,X67?> `%=QJDLt+9DgagTLL1ra9qD["2oZk^aHr&i-kc_[j4PP!VT$r_S1dO99<Y(X<];ZL,R?[FRuWV[eFV i8Hh?h!![[@ab<7c@c.4j#D,/r)mTX_d?;SV2dj"DYJjoa5RE(X&9)7mIY;Y-'EFOd(PdR7!b]cAdp m@@)?B]l+@[0lW<IgYE('Q<g"8.)!+Ya&%;k/sBWl;ne_<WC$PsA>Ybt/)1;JZ$3Sf`HIkdu:$GbUu O=\#FF=p\5KV9PSpHfFY!s%=FOA9:&MJc)I"rtnur>FMs%/FXu4ttFa-&!u]@(`O/n'1n8pIHW\r'' b?,V-e.]45uQD.%l0OQCEVo1'PrjjJch4sYU^\,^(=fi&)o-[3Zro^58aDa'JFZcG1/$R?iMqfinEa im,UbR6]M0XE;5A&(c9W6YK#aT,>ebp;aY(,1r&+t[k<:^$7qAlfO9&0OsQJ.TLLbY`%)^VEO&gAJf P;j3$N(F?frF-a)La$O_Kn-a"IZ$&EDe,7)L,_BJ/#f%iU/qj;25"(LTHQp7S@G*!X-h9j4qX2!U-; :aa;&UpM$UK:PGl,hdo$RqeK#;&lKUe!J)L(n\&DTr&^uQ^B`6O=S,XCcF+Gp06?jPQbL5Ief#3Z*c IL%&&eBS*0)urFB46s6[K=\\l7h7JlJ3<93_6H?WcQCnu#rCY[!TLn4rs20!og%9%HQ52[_?$mSW$^ [6[W!q0._15#5>PJhgtY5XPq2p5dfM3n9`t_fLU-tC%L^'eV#\F@*1oaj-mSd/<!$GcR?oOl7o4nU+ e["sfeobHTSqZX!)QIJM^QA8*<87?Z0mH&Q0(C6n.HE86V%4X>c.i2^hQ:<p^37M"(X;%!6PuVn29H 2'Le]\!*iB9_>l8Z%0/C&$7nbJl3L=PJ3R`NAqLSf&P1FdFg4`brA.[-5So9%<s?D(;uj:$!.aF"Wm >`cEq[3Ycp5,Hit'P2$(L$V&-1?`RXtOD=uB!:"HK69%06+=!&0';!<!Q35YhslF8@5;35&0+qZ>bV D="AND#&V6$c1<o@P/JtP(E_-C[kT.(-Qd?#ZJa[1Bk@K#me>*J,o4;jY/>2Jfk&+QH+Y/Gm&&M!e; V2<=$F.YQ1b-$c(#o!*BU:^oO[>E(gXi^9@Sk$OZsKYQ-Kd$NLI?!!j&-Psu<Wc#ZUr!FRW)!8`#B` @NiIOp&#)VIL;i<<7VAd)#t&-IkL9L5:/dW`U<`=FmYpa@R!adf@`P'`d"3-N^mS$44M7!+'t2O\!P n57ITZ66eTZ0iJDZ[P.[e$j4:.,3l4)(tTR(LBn@@N^b]m-$&=2XtE;Y"9X0T^e[$WOqRlC,T'>f:s XY`@3>c,;2KiDR>)AaFT?C1XHk.f9mHm&;?ANs,QJrd!amX>;[@rjYQ3`\$\5J>E60CE!JVocKiM7l [7*sM9EN"O2+t`SEem3#rpgG=YZRPP&-00@!>'./Q@m!SJ1X_9TSmF8&_M.*^n428%=".t7M&qh<EI #*orahN!PlD:?)]!Ln,a6nCRjnVBp2PT"f4G[^o8O]EI[qJ:!F"OJ<41;H8pU>[08l'!(3ThYQ.poQ Skbmb]tDo,t8c/YTNuI1DQ3KabuAj!idIJ[sggY!FR$R_,Z#+(')&M5pnK7!7!n4TNRHE&4&)`":tT ,^_D=*MZIJk@gCl4BV!eI:h<_]#0BF0Y?bU7_%jb2[:`GsW]%%\CVJN8[[Mbki^gehRUlWkk&f*$,g *`HY[=O[!=r?\2NA&Of`@J;*5#UgJSe5HEF..]l@g7sfJ)"Q2;!aLnV@70"?^@cfJk(._'?Jk'8@Yh B;/R&QNTEaRFjJCK]ujN=mi,iQ!tRc;mqY#!GC5"(1RlpBE78(RV?q_72#*_ARa\U&D!r%aM3<$2$` 2TBu%R9NemctRN'%mq.-FjLO9>_AD<FgQ39<`RFjJCK[jG=<s_?WoELjUn7;huAaS3M4cD@16<HH\L h193(lN4Z8X-R-6D2J<#3aN&5V"Jjo70;<-;;oi%<(>hAHYGPN-;!+mVDk:-BER_l^,K.N^sE1!=/\ 3?"*n?)F0bu#A.'Nn=X?%j+n6NNsoY"0g:=4eEuhZneJH]A#i\s"U0E_AO%;5"t1UC6%l,)blOB'_Y 1,M@ji:^7Y-+s-(#0c)se2/J0K0f?"U*=E'PIPBbVEJ<J&cgi<X;YJ"^8Z!H9`sV#bN8nMRUP,N%4, #),WX03OCfRe6la=,UmHJR0Xi%X&eqB^47Eopj8NpKBeD+OgT>*=?s/Y\::jme*+#@3C(7E-l/>4]k ?)Ip$0U*WEHmnSD2D\)p^*!AN86g`<k61-7VlQb<F"Qh2R/n7s?+0d6j1F`Y?+-A;&'iIN^AY`3i&f ,69&1guLbhcUro?RQaBK%8*HK:*;%Q\>ZpRHc)HaT;=nMCb#!@0'SR?m)'Bis:QdTqMLFSaHZfrU'X $)fQ_-`e55,k#P;cMk)5=*3USM=EpL2D-o6X,*o!lA/cIG2RqWKSQL-`RWSj6g%6S:2.J8-1#e@AaK F3`*KFrM`e\_uJU,=PqeZ0P]E.!-MM@8H#BN-b&g"DloLNlXN'pth1,6eni+-ak9,E!/!E3.5Fr]\e !#Qg/Xa.m"J:kM>@:LZj,:7joa9(,9G)&Y#M]H6gRMj398:EJN/S%0c@7M9\!O5]DTR\<A,_Blp#G> YjR%]fa.gI&bKKod\B%_``0F&::iB`,tO6L':RcQDe'ZP4+Gefn&A2r6]E#JsgS(AN3Nr3M(_&O#j2 $\3<6hVK1@t\!.5c71gq21+XLdcFF8A=)?WFN\/4I2,'!@-:4G)>m((mtP^#)m*mRMclgJS5Wt3`;# MBc.d,0TuBMAsiL-JPBqI=`9%W=^]\s^U>=R@$4VQ;NGC');2C:YN]Y8!'YRsZ0c!^J_Z'0C%d?1(7 Y84aoT_0M9Q'b(r$7T'EQMtFE!eUmIlp<>Sfb8,oA*ILbT-MRKA(u"_,]lRYHY.G4CAnCpj:cqNkC+ KrnsY)ASQq$"<m"&V.#H!Dl#q+9b^FFT<Ho5KR7JfGlT%nS@jO#IYQj#=2X4@&bY^_3[U"[R4Gkfnf PJjBm%VC_i$j@lN&fNe<0s\68HXM;<<fJ`t"%a^p.YSe0C/B5Ers*N>lA/[C>DMIgLkfHsXE)Kko0p Vi.i?hG<OL:)d;B>?J.*#N+N=8oUaD.7^[L[:hd!Q(6maeF\ZL[!\L5A:85S1`ta=lV:169m[7!;l4 6#BOc[lBCH23bR(E#Q]J3fJl(h]$L#J3?&r9DiXfV@n%\1L[%UT.514Bq[t6k)t%hf!X?F[iY0*?%R kL0L,Tfe3#s&GYig$d&2$\]kAn)GE!"MpW!Y3JL-%)n`#NZL9,$[f2[qEZ6EomG!@5YdmKA7]L2mR. a7ZuiS229Qr<!64jDbKVSd;k?(h+=S;63?moC]Y@S2:!Rn,X!BN@hUgWuPN+0`kmcQhTL>pu](M)BG ?A/$;JM!7fKgi_,X=+*`!Oo=59na-m.XIJd_P>X>)/!m;u2C'_&LkD[Tg/$2AQd.KtuS250(Y-_]+! 5]/gM!sJ5PJ02X$<[-R1T!qZ3$g0)6=<4QQt@h_E,V!AD="QT"]4!9_/R-TEXN*P)5,W;o#pIK8-V' I?i[<u_Seh;Y1<7/=!QM`LiDClW]$$t9fDt`OH:_u3lXFaj6C69?6gMJVSi[d'I#tfOjm5Brr=kEL2 RaH^lP,>,SeB#/9#E`4Va&2NfOCHXltqr$gHC![L")Hj>B8S,lfSp!"8k]Ki-Vd\PB(i=!.T6UB,mg "T\0[b[D6gP.j]J-LhoSYeV@]_@Zj/is9#shuRIsk;-D&*qK+3d3<*$Op2,P;h;@3`R4bt9HESq=o. (\JI'&I"@WNG(-Lm+_PK'p!+Z4$*^,b8BTZ7:"+:Tt*6icbL-PfCYel>9!4NN*=92&"4>:ojLLt71P gUZS,8([s!4;<fWjIA.8c^2b&3'ZWZ^s`:/fLE?"NT"(?Ru0X&0C)\7"4LK.O\=3W4P<BYlIT&pCTM AFVLdc5Zto@Fut7HquJJ/!,'*p''=uAa8d6%'-/*34LYeR2fWpC1&q]t$P:+F&--)<_IjE^!0@;]#; VAAiQDX\J05)PT<JL6!"UV$nA*PI(3VcBimS,41nYTBhn\F08:SA1@1+V,`'A^d&(mibW\)"<"9@\c AYCCbW4`1Vq@E&sIDQ"M"!gOc,<^o^i0+:06]k=Z!s`bH6Q1s/8&q?T%(*)IJ:)R5O9(W-BhlgCoZ. "QEt]Q7Baq]Q&*,2Y_2*2*j=9gpjh#UOYUPQFM,n_P48CI)K)PjTi\<_-`&t]JdQn<*II)!*C($\]s 1g3/CtpDM6i[2nF9,1p\kZ<<"0)'YZ8-l-PO^0-$O@^O,"1>m@&EJ-/KiOU!929VTE`cS8Hgi1MYjp U5R[lKh*,8I%)-le*&3thn]Zk1[uYE8hCATM!\OHqg&gKp5B$u9)tsY(U^6mV"9GSt%&Dn]d'8u79L [N=bp7oH"*6E;+UJDU0q>Q>b_dCLO)=t@joR>nO%U#%E8F211_nh7>3%,`$O@]7J05E@)%k2ra:V35 !'^DLF.]Z;cp:Pq$oFk5HS3[82?<aW0&WGW!rp%f_#%N:48CI)b+B<Y^`)]0SeAWM[IFdo!dpK?!AE @2c%oX<]@.M95g-_JN<(1c1!lGrm(#B&g&V$Q\3O+d38XdZ"k+r3>d**9J9VIsW=+L_qXjG=PJ+RPF lO6Z"Yp&c5QX-[YAm2$!o;]Od&3BH\q%$T02_cj5cQ(2quaJp#EUEtLU[?!TFV$Y]>0BA].Xj?J1i$ Z1dtJ7H1:q1!mTt)rX6LB:I'K"$P]PLJ5t+<S.`TP]pc9Td&B'VQj]R6rr=Z*mW!tp`D45SMus?>6D 5o[!'Yr2&?6ui$O$go"%X?o[&t3GZj<2KB>GI['iU6g#7+.6\HF!^p+6t$J.F=SrWB\rGl\!A!6ls3 M[Mp!I"9KI+Q``SWWg\jFLCa++a?W;!ZsG=JX^`]WKIPV&**d45cR3niWAXW!W\4h!H*2C8-1oRF8= f'aEjWEI#piXK*-!VdHJg,Vn'TTf]\h<\3OS,!U8Td^iTqo'F3Y@'.B1MN12gq^b$Z/ao!C0j81Yca tZ0kBR75o]RU*c)0?$;5f_YJ8&t5-`/GF]XO^erp7>FH0gQ4Mk=Gh3TTNI[i\WC#FYLH-!7NE.>d*G V=OBa<N\SBVckUOg]<X5&TB636@5(jHS.`=3@gKf?'"\.TpCHHh_?R>6!-f/lJ5o6]9H>6O\&/HL(! XJ};rW=qJ5}i@>4G!uqn2:n[dh !9,YN5[jh9*^q4XN!"W]L5>qm!o^QsJ,t2C]?X0&%JUY;718&>hua8#aCIdI!j6rZd4<7ilbrC^GVB 4t`M>6F"ThQD<jCt,'@6`/)C5pp'FfB0/W9]?$;lu#?0I*EBS=h3"4.$C>HI1.4MW2fj81YF6;fP"` s=L%XD0!1+6H6(NE0!ZhZQ@\MMjsa#,3Rch:pSta-$)t!`P(JYd4H6N*?YpJ]ldn1gk!WOqKEA9/@_ PVG0eeE(dtI:F%CH';RTLX(CkA%ff'a$2P0CM8o`R&G)^G8Hgi1MM'rn&0<NaqOu\(6i\5Q'j9P]<d ,g0F9OBA1l@8(602V1e,t*U,>b&e!c4]0MZ[o+!^I^?m/@+.5T^*/g.8hD!$IqR(ct1.QW.>p4F)M3 $]q:dJC,je&-HH*_S(<K'+BC/T3$+X(&:i1n?O_\O!4"a^`CM3#XE@$0c"<:9c08f!b3%`#pJ(::Mt .[r<(,k7Zf5FcpnUsfF+@!rr=]+m_.@,N=>:d+oik9.:L$##WE@)\]_Q"n\gas!&3Euc)H;_!k5T<o Ku\&!uVXP!"H#hO8ur?Cb$H+$SjCN=aL2m]E$"7.N1V'-lC>5F9U,CA6c=f.S%FN-fZ&gW-M%+'#/t $@DLYGC]G6DnOXDB2?Z:-$QF0]-ZO#kU:c/d%0:k2]AWjK%kp'Zbpi/jbSWMr3T*NJmRSo<i08ipN; "c`$\\7`+r0jrAd%fV/g+uSh:r,ZYeush@>,di!Jg_Z]m12c5QJA!JCk7R(c!6:!!ro40cUC*'qk_. ;+sqFSJ&ScYTX[Gp4>O<G@WhB,"FbH!VlGf"?M&`DA26L:*D)oD<ScpT`KhD8bXZRX-C2YZVMeL&/j ]I)Gp8N'Bm4g6=`mpAq43:9(W/iUd)5T!f4M)!=98fK.#I%nb`BL\;s!aNV"&L"[5bUp&a=>57k^R' Bjrb@)nfN^;*^.%IiFU$.Dd.Ft9IY0CY+q'Y"I"a:!CV"NQek$:*gX"9L84iK/YA`L9a["!pCf(HI6 35^-gt<hQuhTU[0n+KD/5%)bfCIK)Pc&:5Z;3<:gm_%5Qo#!)/WF</K5`[=JOgCSo$;[(rC<"Y,j!I TC#Kb9FM,i#Um-p]>2&sB5*%L*aPW\cQ],/!%,^p+#l0%3h92aNRZihFgpF3]a.MG1ORMede6^^U#> p]ACi4e>BLH=VP8W.31Q#0_MD"u$)%?JJV!X4qhWq"i8kG>X(5/St>P7H6H;%+Hkl#!rrphVCZ>LAq ;L!g!C+?k1sJi<9o\68AV%M5&$*Pdp:>#r).o#U7&'>tl$@nqSB+0ZFAI^kIfI?6=$E2bFXC*)Kmf! =tQ8r-00"W4!d&&EYAsNdL5<9=&u@1^JVYe5/!6B[@M9'30ZBN(oQ6*6A0\-.!nFT8L0O"@!*m56kN B1kW'5KZhalr>0CNc=(d%"#u(]EFbS36:\?2/@>J=+L^*k]0?!M#b[dl!D!AI0b''c]>r8l8Zk2GKf bq/+?YBP8s99H".7O0!@>)M7FORg/YEZ2#1sGl6!%.;=SWT:^Sm>c+>a3$;KXL6F<Ok^g]_X,J,<al 7F=Y/+p^FKJcMlQ$,H7t!#Y)%63:!^RS_PL^d-=u/fp4fM=FtI"Vp7lr(Bt0PVM525aEFAj%h#_>n$ TB]b$]aD'\fHaC,78_>mstLfe)p-R+?t!6PAV_>m[F"_Ts1&E(cn63+5n"TWhZj@%<c1[l\e&8I'f" G)sP!+608_!f5<K.\&VoWJip9s;-`e)<h9%T&Ps7qi)c\d/H?E5=.k<hM_jF@&?$=ob(tp3K#1<6JE cqO#V0kY\/5\ZTcA"?\`^ciA;lfk+#V7aZ8sP5m.*>Yt@*"&qff:D!RU(Pg6!Xhk-Y,..A=;]$5MS5 p?Cfajub$3^D81'#Wta-9)e.3noF0`&OT9HalG_VbFD:F]Gb0e5?d4_>r`=D(M8J7e%MYLYKr!Dl!4 !8EE6KkLl<A/7QuC)$`TV$LN1S08*Pl1BgW,-euccpSKE,LdUJ!5&GP7)lkR5>>)_XVCll,>XY];hR tO/-l?N.4>i%b!0rMIgHO69#Uc9+q-_CKl8+QlB=QTK(L.1f9cO=R+*.-L_'Rq+ldOTnjlI+&chMkZ 7hN:!E\H<r<=HK4<f."BhlfA-63p.ns9LaM_o!6SaC!EiG%bL?)Dqmm7tep-63p._XU:]I=5K]fo]= il""@.:I^#:A\o6\er`:)n(N5FVnHm*QQ:%G!FR;mSgM&KahHT5_0alD+TN!;gr0?+6Kbg*"98mpaD s-)/5I@"fuO#gSdo<RGt:FAhn&HU2ut5tHJW-_8Ke'D!!sbLjo?NcgJ\(P&MAU]*!"37.tEe],a"Vb _(RA:^GWcV$1J=e!5GaK)C.hdflla%.K[LEO+)lbf0&og!c9Yk!;]R@D_XY1+>0^6#`Ja#nD#5FC3O c$bY<;$aW/Zq5QN.+Cf>j0+U899kDC8CDYQQf8;'jKPFOW;44W6fS10:+"SW\WN;4D#ad2c+=^lHZI f6'kk$97;$6T("rZ+9EHutM;8$m&*Qt9clfU?EYj(*(Y@$Z]K#1]/Jk(sse()Zr1eQ!gr)rakYX_:1 l"dXL$A5\g7+Hj\giB_C:)?U60Qi;+3N$EZio#6VD#NER<+<BNM>d<=S"us[V[I*c;qfWO+de6PN"d g2]_#bmZieogi:96&,M_pOISERb=#kLnU"IPXt$36FqlGVCs*1c<f9YL'q49V%?`X2^5"7!hY!lQ;t -i,uY,CU?_(8f)EYQ.Li$?,uq!!g:RE!Tu0dt]rV:/p.8AoGMZ.o<QFShX$IkRLYo^rO]f!5P57@uA /26NCM"+X$u>`d(GUQmDR$/0t8;^>5FZcn,Aa^ei8Up]2Z1!`2.J"HWkd58+"u6NFtK"?`-0MoM^r+ 9A*WU"O@<riZPA+ptt(</;q&_GM!g5S6looKY25$NS.!"HNLKi&E%-%"Snmg@YSfJ7FZQg`mG^37)l 3!2hkDd(*Kl=$RD8!bbC<_:@NFO9$17JGGrR"Kk:"J-[Rg%0.2pLf=AEJ4(gegoO\T2aBON+07^IC] TV!\7`t&%,AT'QENOl<!W^7]Qs..mK2u<-dE;,WeA=k!.^TlS5oUij;t#M^TM6U"mQcme.GpcLcSRe >?E"gf-LIuS?\d\6Eh=-!,&BONJLtI)CMVICuNSY_%Em_W)"GM4n9-(+eLVXE6<l>-7?p3j:UU$=!& R.NU?cHg-r(p"Qr]R!,lJHH.S+kM+khq6.^2n86nU(<RA:[_NB<c-+a,u^0Tl,^BBZ:^d@YW>qcf)6 K8%s1r+&2&3BuV"@2>Oc=bVJ`?>[Fb!2)-\]!bqKqW7Uf\Ecd7F3tfefY%&/6OIgL&q"1B>X#o[$h2 '8;7b=Sjire9cb/i#u>dMkbaIj+92I`"(!E<LpVVb0.HqB0utp^?4-)WTGB1p#QRKkGQ7aOmGFQP05 1[l9)!R<#Z,LE!.bb!s5mSf7K`](5Y-EJ!0RnP/3!c=36VJtj+A.#$9H;ZZ/_$l!#R*bA;7o'G6p?c Gi6MuP<'O<,2q0/"%\P"9:ehfZK98s!(&ZDGr+X'Orf&r(g.Ke:mERp*)*lHiPUHbJB;U]JKKCB1-[ J3)*fQF!$e:;'oEX))%0X`13<d6=BLt"eiMViEeW;A-L2Fi$$2]^%"\_o/U?AqeZ2-b8q<[(UZIN/T KHsTOl+;;*Uu^@ooC1#2m&?15RkLKS,fAbd=VGX.kls(1!%3%kd1_ZXljjQSt"U&f"?D5%k=+EBbRO OK+[jJ+)_?=btuL9Q#FV-r$EcW*ka3/5UG<X+n<9WQnoB?GGJ`gb6XL-a92M\*rMq*9GE"3*^Y0ue^ n/"@GjNnkcr`D?dj-cJ1&pQ7#luZ!Ut[Y!;s_8H=2t._-.'En,S:FQnm;u5CAb6;(Rhq=@_!0#XBY! 0&\#eEt(CO:qcB5!#Rd%E'][#'R=4p3sr2YPNOb/8s>Z6M<%i<<=+DEU/_MTPf0\(,pUP55[9SP[.u %E!oP9c,Ke]GQ4m<o_p=>F&:imf8AGF[E_KSj&-*s[J-)Aj'`-.LL]JWe&ifrH+.tD\8nh:lAt"qdS +8B9&"^3Il<'m+1]S,e<k<$D&$u\Z!(t0:C2ou&OFaM9>bPq)U+q1#!<S-kCe4aPBSJgd@W7&6_a^: )EA-rV6+-grH:EX2!<<.t1.`tuTSa04O_=kuHgN%#!&4X$]X<9CT-:LJL&aR4B'>mq0He:_Sq[8r53 @Y*a.YEAi@6o8M,4ft*>Q@V`=cj?N.qH95QE)KlChXD*ZLdr#oY#GW]gs*Wf=('\4V[[*=m[XX.m*R M5uTFC5Ap6\@V13C:HljX%[U\J-?qsi(hb61bD8I=u7fu8aqsT6V/5]1j);<GN;"\'U5CZ8Ka7N6:i jfSb-',1i5k6*<uS)dU<MKNm^_\.Y*7UBIJXj4aT<#a's>\NJ?_3-r7ed<#f?J-u2ot-7/1Y&rZfu% Y+O=PSA9@#F'm;e!cnOoN?kQ?qf%IJ"HA9<g<6#7i-XbUB$==KN:UO-lmEY,rOZHfc?@7OV4hfiMu& Cki/U!Y28QN$5JIrdJtRRj6GYG1HW%n,upZ_diNF%r)pcJ!(BJAGI3Ec7=.^aL7W(7Mh]^`:k8D7,F aGc;6bkW%fe$J+7cEe!:UGjE?-b=&qVfj,s228<(Ok>S1k*H\D[ksTYh`&+GMn4cjaRU?lAAdLCg>V %4QZ,$JCLF'EUN0AMBedk5^8kN$3mdE!%!'&-`sQ!"ELI_no#"#:;2<!*"1F#j+qf3e6,tE1fQ:FpN [\:_<h(U7_ZEW'Lpe5Qj3bU)%t:!th%'">p<J*o9]u3Ii6.G"@6*A-bO]d")@%Zm,RrO9Re2!<dL0+ pc1B_D['5L`e[n)r>7_2m@iBDn&.Pa8c8rj8kC#U`g)]R)U[pd1(0d_&MinL,?-nODnSp)"LM@1UnQ E814QM5u>]]U='9cS-'&6!!4(-n;:i9V&E.o"(>*4LN3Y&*B)Tm:GT3bNgrI-SCk\-]J,Y,7"H33@* (/d1'L`9,o=J'9,T(]L1O`n%Sc^%)1I-l5)^ir=i^Xr_Q]XW/E$oYE(_T'nV^n%A1%nE66]0gPF_mX *,oSG1uP'nTI`GL5]DK8,VkN+GiKb0."Vte@%0ka.0+t(a:Z:?Nf[MC%"igq+VGBA4+O(@dick,?8@ _oN$pF&OM`fo+V!^Y"#;lo#&0qDRWK,')j6W16dC7F3&IKIk?%tL515<4S73?A$A'hU&HlrA_\pg/` Cejh%!X0E32\`/*Ma,Q5oa>GbFjJ].eTedc/B%FJ4M4d&Z^M[_(bUc#=u;^PCUX2#sohh0Q9peDQkW )6UHJh^u:A_O<P=&a9/3;&d3(U_._dm=j'Pp%t4oh*oO!H$!-PI);O-a6;iLjVA?=TIAIDn,"C@RE= -=e_)tMLcQBINK-DS7%T1<!]\\mVIN<65i=K-tcJ\qaALC/3#t'PTTrD)2X>%a=7BUseO+e<!*I`O^ if[0J4TL!o72\l3\s&a=r25%>.o:Fr9Y!0Z6Ts7EcQ5+`!7ou,AiV;,mNVA:-/bSD)b]$%^;-q-%;Z CikeM=?ja4.&8(/r]KV/I`!,#\i*1LPj&O:ug/Z,cj'JP,d2!oH>cLG%FN.DiWq#tOYJ<)l_X@Iqp! "6DqEWcCJ"\bd=apCd^!-&2F-jL,Q2HU!%OXA"S@0/WI$S.#<!E"iL'bC^;!,_n4&1F3r9aa4B!q6B q(eaoPOKoW#JIa_:+?0',nr(fo![GGsaW=ZlWjZ^J5rD?`!arC1"TW6_^P0eqU9pb8+p8]$5gkoANW J(eOT^2M3Ud(O#[An\HaO%bL_'Rg6i_lP"<l3cIR*r\D'60T70#qf%6i&k*nKi@$kAYVZFeQe-tpX@ a_o?@1sd6h5QX.mJAM\kJf%)kV`R4q`1C]k/lA=]2\L(R!0@`t,QpKeY82Y%CuhH``1)#D[^S'n_14 cbmgTW&Z:56\!+oUh,R?(@!JE]X1j<I5CH`++/.S"IjLHf[:Po5)]t@Z#i!`;pZc:rUmss<-/YL\h, ?4[1^-I8-X9Lp'hLGW\"+]?4+:cWu+GGe&:<m:^PqRe3Op+C3aT4)IF\I5g)%:r>D_T"l^H?Vq9E>\ CO[E?-*L$ZQ68V"_\R8f_Y^ZWr9m%:TgMHq7Ef%Ho>;pWTh32nD6f@9=+8]<e/fKB8_\-[MaiNe`-\ &oV#VZ:0^&4,]Jt)iBY:59D.P7##GR!/1^(a3c&>js!l4IE#_,!>c'+XpC"$bI>80IC8#*aR7D&N`e <,Uk/RR%$K<gTXN]r.MsJ0#j'e"-IiEmcpr$3>Yh^#\R-5+oJ:`&XgW#B#5\'YG\[@"T8-<"`9E5l$ \^%$u\+,6qJgaiXS3V^G2[-lSY$nM`QBdaTu-/&:n."p"WF"pVsU6BHF<O_g&5)?IVT%+$^ikBLiO# 7KR>o\b,d!!;=R&,Mu@Cf"Y[i$ZnP$k`O@%"K+l70"17)ZDu4@)*3Y#S1NT"%(oQ/Z=4PfRZ`3"t&g X+p\VE&J<s,+WY"r#1*Dp8.Ua$JhH6q0kc5ZYQPg<Ib+(/NYd0`iI(En*%GnB31,7?L^t`_0@=0[Y& Sp[d"-R6"(15D@L.W6fFb&N!af%5JDc/,p`4Bg#(L9<@-A,1kRNX)04=8gkJn*WJq9gCJF;?MZ@Nqn 5Rosj!TQ(P.H1lb?nhF"$7$uO:$3H9G]NVBEsQ.X18#VuY]^S0E@U]p7CS/V^jL/,$[bDFEOI,4d#+ poMMZt*+jpM>icAOY#ttR(:59ud-32]6ItB#&DP29]5lj7W%'*5:$WeNa5TF/s%VsHIQI?F=:be9/+ Wd:"nKS$M:_GKZ&oU\KYu:XNK.MVL+`B^J#"/IV6NEB-!./c;068Z>o/X'#!32\K4/4l0irr$W"A4; 0ZD06A(-;O.1M9RHB)r?6'0'W511tSaRaEr8!W_pj&eNM(r<ND[dh0Mp&lA`L-#o"Hn1u(>1i?2(_p o?9dh-BE&JEP)jk(1/,;(:9!4KcrGubOdGns05.O7pm*)I7U:_K[VAP*Vt!`5$[:d4s<4J+tJ8cq6X YWn`n3rY>+#%.L$fb'eX!"+!%DmOFi':3>D+TCtnnH/aq&2jO83X"M.el)S4:_K4i1dq."(n`^CTJS 1p3W1o;5</]dF">Be1>>_?I0fo':_Lc[1F43*!RNB1EL:CDQieH>Xo^lm+>O2o#YhXh+U8#-cnpT)5 j%Yu?ZR_DOTJ/(Oope#[j%-AR6Uj.Rit9_)?Kr).6ea1O9CY+"V?d!BfmHS%DF&Prc=F\j$41:5:t4 `4,62Z#lnSf<<1BZ!)T%2Ft4oj&OVYO"/'+9&I<d4)H'ut!2'MK(D8J-";1-=$uf,(d[pNd!40\*,E Okb^]`smTDD]_*ME_4!MBu80*;!B+[H,18t_!V":*)0SQL06kQ,Xa!jBTFk6;(:?u-i<NML!B&1;H+ clm$%AJ#J-T.p=tJ1Vu9U';_Y$d'!!^]L^jDn3[p6',\@#oc.@!YU"m;1K([+Y(JkUC./."on^&C'` W-!XoA:+i"a7&30k9"[N`t\&"m@5^G)0.uYUG>0n9%i&i:c!#M;Z"jqm)n-0.`!'+Zp@%[LC\u.On" KPQ9&HJ^;3M@!#!=WZCEN4!s0Q%:X*:T\uN!]Q?3Y`);W/+'D!6P9C8pa@]&Ln?<>=PFh!!WLD)kFP @JLUn<5QCun2J_eB^]4bSJ,uJP%o0>>(iYg)O<OaFQS4FE!K])XYluDj1-@"e?J,oT+KV)0&g8C!Od W5d=uZK^"2]@K*Us<Mb*;sW!l>j7Ue3CX=TTiN$+WV_J>T+RYVpJ,!(n@<&-)q>i#/1GI&b>h8rBL8 YlH(RKKU\#TI'j*AuUb>X:4$.b$h$/Fr'oSVp9o1)up3JWuMEB#XiWe$4?hL@'%q0Y60-O:pqXMqQ? q$Yf99CE.@p7>82U&W>,d@(MdTT#-gU*!>t]K)r%>8b5uY@C,oLO(Rq[cZ*>;W[#\t,$c=%V.L-Sa. IiRq*Ph_@\2FsB#7@[k:^aSU&-/%8Z=cH(?Q4e#TF!^RW8'bK!!&hV$*R2f[8g)3`eLnkR\kC&V$kY R)0&"I+Dd5GZm:83:Fip6,.28s[o]',H<V"pJ-8#>[$2m='WZ3ib@q2S*)$16+U\KnTXbu1YcTXg@% [XX$Q\flJZWkq*mfJFE!@'X*rf%EB5k%BqliN1D)@0]@,QKP!<^L'%hI81p5&pJb7Br.WLXm)*=)db J,ji:F3^7r73oQ,V[%WNV5lXn%5XVqRs>:$[h,4B</[Jp$OdE,[h2H4V_Omk\8,:&-=@qsiX5fk.g: HR7Nj,hW3DreJ->%s2B^^bJI2T^-`%C%(K:BXS,3J3&/B&uOQ9FT)_1t.+XiVM^YI6L7.:ksVk8c'( BhMR=5gkujo?;jB\a702e)hq^]b4;C9^g4*rMu=WfOJ&!CG^/+TNIZ;e$)*"R[e:$c$FpO9UW$^:=O O![%^OcmF#T2'fs?hr$6F\33s94WUel*i#/)TWNZ>SL2`Ij]<)$$334LXsLo%!5Ja`=Y\4tN;h9\"Y c>b0``TjC\se^<F_Lj,F/E#NrhS5"+WK9^oR[34eL3@8uFN=,6.`^.'CFWA`GMU;ZP&%5C`U"*DdBp )F,=ZRN5h*rY*G`!rs1k&V$4:Xs02;o4&MF%V4?T9`pU%'*'36.UG4;K6\u*j"[q-5;5t8_-?tCo8N b>R-Z^2a>s==9E9M4R_%`<IFg<^;ZQ%W3rkAa3L?;7BrEJB!aDl4+`P^Mn,qtR"!u=>T%=&oTE=.Yc KLeDlg2pc*7&El!^2Xjf^hgU0F)Z\#%I'oBXJ%_+9l!UcKY_$mKoL2(=$Qt"U#Z$BCJ2VKE_a2"plk R=m8:h&-hBTd,W%K8+T=d<<cs[</ib+C%,+F&5@0)6YQNtR%ulWJ4\1B;.Ygo.AY@.cradS#Ai<e!: W_Z,mRo[!'^?[G>LtJ`Duu3]d/gH.7?]\rDee#+,beDF`90TO9]V&#A=);8ZYQL1cTJO#@T=5EO45M Ue;P)cj:-]GuROUeQ@LcdP*6W@mpX+"9:Y#>BM4DD_MA=9a=2]6\CUk48hHOZq,>tf,oDFCcsani(C 1`7t.!qF5R72YQcOe"uoQdH@SjTKL@eq?['9iIa(VHj@*,!#!4Y9K+hBZ/41Qp7$\8^G7[Ii<S!Pu# )m^1,Lltu+A6`o#)C-'W:<K8]gm00#6pAmBslHJD+X!E=D<:ccfih]"99bod\8laF[/:)Ufp/lX*,U eHB^a@0N-46=3mfME_m!_^_&*1=4$o)A.VHTrJXaP7F,)cE_tW11ered6$5Ra+V[Xin6(AG#B_k)`[ qG:9iSLuN+iH$@8PTtT[@^$g1;DcK;?mAPh[;`fZbui!8uYSbtcIl!\f(464a,4J,l3e@N'7i03/'+ `oH6="9FSa5d$GR0chc`!!/2(<NuQtn7#'$RO9E`9Mb^"T]8dR&hPds%)Cq/Ht##G"p-IY8:G#6:]p hrj?h_BBJ?Ll&---F'j6V&_n+u0?56c8"9OYbEIR$j0hVW<!,^R)DP.0NWoJU>!-JhU]f?'YcJsC^# *;#Z6CnHX?iUUs!)5*,O+=KU5-.)"#uND?OIkV]i<aK(l&%+SX^DBq535,6$Xu@$#!`0Qbi?_t"9]h J";'fFp'bG=lZ#,O-(tc(R[4)+l5cQ.C-Vb0nE3+Z%r4E1%R:$;0')pa"jdbDf_K#H+92kdlqJ]*Db pEB:]R5=@KE,&;P4"&@-kUK!crnRVp=<'!!@=>!"Aqhb#9#U?isJ\mQgd=B@-g*J,fZOjNJYF7mI7_ n,V+tn56t*#2neL@.43$"\iq9"5r\Y*sP\`!"=DF)K4:7J,qoqT"ae#=b,URY46Uq"O\5;%F58Zi9( .a!%d"aLL:;6.q]e##ZuTW$/c?&Npi3_#6u@PrfHO6NX:#n!",@gq!JGL?iU@LlW\fRW'CImO9#;gk 4no_AY9#30E;.SkQ+Kf-_LGA+R`#L$uW9LOX'&aNXQC7pMCrOci=4[T_!!G%46W!r355J/e2af!7=O ACqgHF!:LsB2S7Nsp&G/5^CP@>2GM("A0:jb&G%1kRK@F.A3^,+;"16`1^a<R&eFX8+IWC_Q2/rB;, Aua=TIpN5E8tK1f,o?ks(oAbo1&-d]=VC6NI'P!/jDK_;d7/j"\;B!/3c?A*bp;ZcF%O"WG7?"@/7U ^mn3b1#kX_%HK!uBaq5N0t/>i[ut_50Zi[-.pk(4juNJr1&r5L/$>$r!tZ*S@WqAj<rn`m^e";AJa% 4e15[=WI"B^r"\Jl"$%U)B!+_5m^]TZlBu%""iPbpb;A&sN8H;_MV8;3;?UHn0-La0@-9fhr^)+Dl% 9^n<D't&r!7k(:]+sfa!,.#\KF`<g#[fYJ@0F*1%L)ns(sF.3-EJhm0\V$bKT$1%!LcL/X:573$\H5 /'EagJE)Ed^!!"--GJIR1WMC5]BTNQ$!"Z"r/d<"lLGFPn(l]%/Jk866esi!./fF^8fJfHN-m4&Lo* DKm(CLR>i_ilE.!Vr&T^JO2@,Nho!!JCf$:<2C!$m(d3'equ"N#[#L]i@W8(`>("pdf9\NpMr5^^*r 1Pc6H![IVb!C2$<.U/,s6@`6Q(sAWuXH"[L"u)+:G_2nB(7kNeUrH6H)k]?n@i(.XeDgNifFo6ZJjq ]+J@@cI#Yha12B@>e4GQb#A?'$;J.]4t)'Yp0i,!(Z/GOg4!s)Lk%3^/j('B(GCSLn=_';Jk+@*3Q3 <Od@kQ0bKKb+>=-sh^#&+W#4p];:q#3uO%J/.:H(QcI\";L><Fb(VY"Fe.*[*7Vu$RDAZ-A>A(#!c" #W&EA'6s,"SL_9/CMYIE)T[Zqp"bdEh=F$o4\j=D&&Mr>IS0.mC>s?+PF@'j*HL`32fS?4/!)s"TJI 8M]ZWIS`&Kb](NmJ2/6T=?t8dYui!!0lM@)*",%8`o%oW%sgL00h+_MJ*i$r@%PGR0'K'Y0#6+jkC! (]Y$h+]H<N:Q`gg`Mn)[#`U)0">(`%35\"c#%lFTZo2&a).X\8?j;-_8PfW/.sZ\3!\b*G_N%b95*9 :/KX/*%RpoQ35ZAkE4UJi$'"5Taks.D);9/auO:RP1*mdAh!=5Vl8$E2.N09&%8.#fn!=us_cXKE>! #f9R=JE-p_@RLgn-q]lD/b$\!"W>ojV\+j8fq.ai0\.`JGB3Q@,p_K6%@O(FQ7:51BF.e)$&Z@(-95 =8-/sg4.sTV^]pB!&V,lo!"<fHm>.RZ^pB\o!MBW*8*J"r83df4!EMZ7fH0kP,H_&6'GoF'q(0Ip+9 :cD-i=3WW,sa>%PSgOJ.WV!JLSp%5m/kC</b--!(B-pn,m#O!q=i98l4F'-[r7lTE+lj(pF#$Yp<_. *?uM;f[m\7+lWlcLF+/I#/sj2O?t8s//oiG,!,iJ0EXF&,UN\B5QpVm>R1=Wd)Z1e4<P4:J@Tq.OT6 8X!;8>sKd7b]N?CkaDC*T,*:@6T?k)bdnf4X+;$VR%B@qhaMDMsHMG_48P<eJe,!mLsJ0ogOm\B/PM "M&V#f;b_#bE(2\daM$H,VEkpn)F.%L<*f&I/:i!L>X^<spEl3.Mr_RuZD1pS<t@!+cU%\:h0=!!ZC 1L]W6!"Dk"KO:9d(EL[CO!"Cd%n[1:#@:,)rl#7YpM[uIl5*[f%"A0dJS,km,\4gI%5a;Goj\UK8nK \5<&eG7#JCCa?V?$rt(_FlHs*tQ70-T7$Q,(Z&!IRGGG`9:8_E%`3^kUj,!CX\.BEn,D0BibS&.Ds< p]UkI!:p3k&7H'sJZ'\BRtGa3:lh8$dY!)q^<E9hfTj"q<ru%>-+JOn!AFO\."9jm;jf,u+MM8>X>3 -,VcO`dcN$io#Qs[!(/0'B#9onH";_*3=OmX+L;b&8"2RSATHmcnMD;728+oklK>V2\$j*)am#d#&J -7"i&HL07!&bM0kXnIb!a[V_<"^<]8%;2DF(R[%=4*<:!6GL>9k,1)0j&UcGTd&09)sJe9f6%MXW1_ =Qt?uQ#;cmM7!+ke,eJL-J1_RenPK:4;SFXf5q.d:NrX.tqP2J0*+:H"XKhlR0fDG=&51D<6_k4dTc sD4!C.]'XC>k=!jImf8&`!+#!b!_J=g?P/EC*Z*K[KNUs&ghRM]0.!.\\gIdAcsp(s!K6opc(_Z0hG nBhiJ)$'GC"2Kg4!7c/kgmC3]8L<>7"FpS&!.J&Oi(BqDF<mNBnGE>QhEW+`TPtGf%=nQY7qY.hU_< `]Jn*ChIZa]XRV+qbOcPN!X$0&O-igqjH9rI=Tco4*2ksjb^m2U1lq%2YVC:1l)BpIB!56=qAEHJCB !KI-5gT$^4q%E]3WQ=>Rn9L[@.7(PG5;86"9cLt`5W!($YZ:;.kQNMOV)V)31<E+/UM$'pbb+*8V2a <Td+a!%/dM=2P07@Kp)VQAZW*:@7!?4MJY^0;e2>Q1h"6hG1dR;T]:\6HkOD1eV$LrfcstaK%9rf+p RNUC8i@e5aXg'<^PU$M[;*cC]K1;:^)/4':KEmTft<O*Kl:(7"jbC80f#uX;k*"k!E(HZ8;Yl^m3,p >o#])#T9QC5=CmKQUena!pETT-="NMCmN*'7fqF\_f'8)$kTfkP!lg<%ZN-k9scX_ZSLCu!*BPE[:G A,&jt)67LKWmBc(``3.suR;IIQfALE6YTu[6p5YHuJ,&o+0XbQ`R!)Q-RLd@N*;ZMZ=^_2is;BU?"! #&a(8YQ5TY6Y12-kF$X4j8Q$_Z5Wljd?QT@J81lrWi]rcP]85(p[Z.KE=Un+_Hm_3]gdRS-d-,AJS, C&-IaYMN+&c&5B&Op46U1i%;fs2K36'BjB-sV@"g87lUJOb,I<'%E<K`@EE=Q&)7.?jd=e%je,9(+> ;K&q5Od.^k!NCF."ZJbmX;("<\'T!^m+u!Wa6:!Na=Oo[?G&:Z4ghYs"<ZdB#$Jckc/&/-#fi^]VXY !RN1Sj]h?cA7nsd)O0G*&-<*Z3B)Ht-il?4'[E&qqA^9$>!c/Z?r"gS3b8WBL="l,^*%9_+]-FE?pG I>*s"2J_4UiX<#kuG$n:=8)Ra1p:f;8j#W/M.eJ_QT7MT:7i+=A;1&rM`'JqKO6pT@SJ06P#+95=$# %%oroGT%_"MU*oL`?\N9\n5@<Y-Nkr!EI=i&h#?+92Fa;me0./HH>HJP1[t/l`*8?/eK`XGm;NH^qr ,lr8t0+[+D38Lj[oDib&TCKNbKd=>@?X.;#*!\u(S.0sml)SdSNVuecsr1Y3Q\[hb@ciA!g079d\\f ,jT&CdhgLUY">j:E"jJ1Ro7"JM/SJ7%"CW+;;WL%Y#);T=_N#;/dWRK@(d#l(IMq>i46<\S!h;R3/& LFHOKJ/^&)kV-'V9UJa&010$$Xr\fUkQ!C="s+rgkQ#d=8iZp#]"iu\5D6$:^]@gsO$O"K!$qmR_6P /[KL7_,&\u25"#[K(0eo1ZDOg$.FGR1Z^35/T5[/T%`Ib9cB"B=f1B7M<O:sSU-m68G0blr*6\GbR1 a1igC`>?A#SD^7i\G[SH.Au-!+KH>)5rD1op_P-iS#/2!lZSu%"^BF!Y>`sEm>?&XuU,(QiT?(_^no =8dQM'0#du"Q"BuH4NIuu@"kk<U<3s@_gY#[nGqDg"F6XiIh!(C2p;ke&:bo('B6iFfW%cj4.o_6lX ehPK0gDV!=Y?I'ugdRl%6bVKQ<p)"E8<!EW\5(2;A05I%n=T$!79f:_3RkdMa?ZM@cum1^F3u!$V7B ,bQf)!?c=`BD*F+g:e,5>m./*Pm94`rg^=1%ZDhDGRfk%2.YF&n,Ri'V>UYOi)0^Y.Y%dI/Y2hFrZD t%!sV.!Uk#BI".2@&*i"P\CG.8.fX71a\,tD\)erC?Wtbi9(=c#\Dp)m@mC/nr#Zc!aMuZ*JCb;fD! 4l4[p=d4\%4nWc-+:f/-7%>WHPRHKZW4E[<o3ZWrDd^bK0KpWg=F`)>(kfE^9+AG"(sOH;VOGZ!>o^ D[86Y7ek0.RCMDZX+G^$%JUe0`@Z(Bg!B3!Hqj'-2Jq*)0UTM)o$O#)0)I.q7&_`trmC!J5e,f\0OE )[b7/4,((YN-MNW9?DW<q4eoX<esL.M2]6ge*m[jCe0l<@hH"u$&#"Tt294(&03o+/W&8MRc^!#\$G 'o!:0!S7J[O8olK"+b2sM8M:Q"D;o];9/9MB:W"nrK[H2d(2J&"EDp&EWZ<MTE?bH3lVLJ:j$4IIhr e9hPJ<okSPVE4lF1jMB3USLEOl>=^j<)!2(#("N@1(j3f_JZOKG+'g!LXCX%Pm]X7n8MVi`+;o2$NY M_992(47_#J:&Hd!t>YdbMqEYS+*(0H^GgAe'Cmmr]:-AobIYaTG!P!0%ZmbU5@(!_jm?i[3GX&cgh jkSOT@22.j\Ulk"I8^LKR.0*mS&?%F'OoQ$u8qS`:J7OB7DT;d^OAp*L[3YgG1]`-Q$ik)-G9FW%e= "Zc8[pLS_,Wlf!>,/3!9B(\\u[.[ZN),:!l4:B!<;6_R'Hf:4f<2up])UKR&.ZsEAIV\!na"`+diK6 !&suJ(]h.=2_tGI,QV;U#XHEA!%%5ahS-;r2UUsoWFc0=0teo3('(;^/*dJao2ZR&!RR#7^bgD/F-H LWMH(GkP",RA!'=,/\r,ft5%b*$TOZPkPtJDfiCHAkL)Zs;OHjtlhrIC&6E(k[(PjRr!'egK]$5&1! 5&=JnCfM4"e6#=:^>LIX9ekn_c$:\Vpu4uPmur-EY&MR@5J5ohSou"fJtK::-j:P"mePWm"bnbDgYO %5cV2!UQu"C7;,.%*/LOH+G:n.;ACkn!gJ(d`V3D@V,V&23s$YE9=6=1GpH7qq)Ui'l3Q"!#""CPci T_f)DH#CTS>^o3UhsgJ/_<8;[!.@!=#!QSq''n.P#$>e>d(2#;F7?#\a9H$-83YV?RIK'mM*o%0SeE "JZ1X5T)fr;]lUPJc'\N@G;J%!sPeG*t%O)#!eY??35C;&*/:`F9P($(m"jrGbkFk.F:rWEHa2U9)t 0;!Bkt[!.YcVC#]==.q9LG;&Gc6!6F=_)]Rfr&2]J61a+>Y!!Fj(BX10-#SSTgFeDc@A@2I=<cS``) ,pSF['Y$nN.XYoXs7T;Prti2KA;Cc%;>nr`!WTmJ\9Ee=pr^Zk7%PJJ\tO>KUcAs@m-M2N.@&k3IdY +UIlQ#$C$2s:_HYs7fX\QTm3<TP)orA66mrcQ_5UGJs)48!'i*nSL'sGPQXnh!'4[]L^#0!)O,nl:_ Ki7!&t3`@1$O'1#UYUgG<"7?_re4We^LLQp;\=,>5-E\:J.+6H#=1@fg(hL^N4>>R/ge%P\ef@#s)u ZIT.B>Sf!pntE-bQ:mAG\hOV]")$*lOGG2Z6Q1hn8Pkrq[)'.Co$RMgA>[RQ-'</",>^Z4cmD3&/$= \ek!K_KQLbeU+W@1'M_n;Jgt2p'TZq;'Lrb/@p5F_kB(disbpFM5Sa=t&=uLOMBr.)j,OA+[*6DA5J pX<*+VE<="?n778-5!CV\g.m!W[tjE'))a/OAn@cmFas8Ui(%A0;<%js&G[^aNl#.i\RSo+X#8:8hh ac65omC#%\JE!MiO+-92IVJ3-nZQM=mc<1]O!T4eO%0.@J\j=fdJWA\?oE1pe!"0GHHq9kSG6e3A+T T<^!5OVe@g+NncZ+m!k3$EIAbgE.@NqIB+ELpZbcbOcU]HbY#4_aV%\r%*Q&pPRTEj>11(FDamAlJ] JXcr:8DFIPCS7ZJP!BpfWPEj2Bat5>cN/2E97/OMCX0=;#o%%rU.\Z.@c#P`33[]B6\7[?'bo"@mHp k9*0Jh'#`0^ic?Z(<53a7uV;6ZdY#Tb)\0:(_-CkOC_4Uj@5_J4^Q"!;UaC/[./Yk5$Bf`qh;b1Vg- $m@(a,MEBe#[ZH&-D=f;P3-IZ3EX!?jd%A,b\<I9-R)Da?8V09neV`$M<;E>Xe/ZJ$+AS%0/mV!,gp !kTI?D!tKk3&J&/9LV=KFqGnR;=$at55ULFb6$NBo_-8W%>Ql5Y#4'T81]pg1%:"Sr<e7_(*k7+'iA '',#;-<c^lDZN4?s+*aF-Db<.H7#JNH-P(A/ua!sEsQ`tg[C#%3?".;MhSWL+?n1,sFg)a,Z;j:*(< O6m.eW#f)rD4h%8[HSYiZ9SdO!^YlalPstd6r?=k-J6K:)$tjg1.7:]/r:N7TT66eOt?o@8DG?@BFP E,24iWr_gj@""-GXK3e8u"N1ic_3@YCT58.e*SO+s7drluWRjgR8fX:p)#pp8*41dB]'+f*cci>DDc fYbErAUV?;0:)S0dP)D$Lj:i0a0td-6:0nD3M[<@PS)IEshH_q,ng^!NLRVb8NQn-&D12&V7r28;N) -p))k3qMbOcYmU,YL4Iks@pXM@jHfiQ5VaPaBr1l\-K=2QTQ1(cAcBRj'nDfR!6A%=k^Ar%!%?e-YQ 5+s@.bW!\c?!M!\am07ZoA(Stc:eZ3%85$\0e,$8=OPB[FTSP<3hnD;-8a+bYD/ZIFuO/31_r#RMc` 2^$hG;%aupq)F'VJN<d8c8-qQ"!"!k5N>]p9qk5WY0p@EJ0pLnoT"cc8"0SIbu>qS0G*2b#o(c5RcG >l!Bjmh`7&AX#S4IXLXA*k!/.Wtkf/S$(X"dkr8FN0BWE:!,RB2,T$i]HZOHB^4N/Ibj@<\0d`P0rD f^46:iPk4:"ZD\E6ODJ)(-"7P,M=#36!3m">P+1(*5=t>_.VOWFJ!g9H\0PT"r\%b'7V&)M$@H!32p t#bBl,!*h_j:^DM^Ou<=3cN&2""0foV^f80D*Q%j_9`kq@%)?=-!<'e8\7iP)Nsn;20EAA1aX*"H"9 8osaR%qmUQ<=\"(40J?oK-?`9gJ.A)loE'R:TFaCV#X*9oqpP:a7c(*_RZE'OGI6@c!j&S]@*TH),f @ni./M'YBkA\bLG,9fsE8VefCeRY<lG8/E$WHGX%nS<lJJA\hGXB$>:*3^^LRnSm,:L72Z5WN-oVS# X`&E6/I?:h7cbgD*ROYk^f_*nZWiGFmTXbD<fOI71^2MWH8jg1cDCeb4e0m,S%RtQ>s$B6f9bXo]If X9e&R,^W+fq+=qIOTnZ$>:,)]sD,^UH[V\Hls5fH(I-OjoLReI9]58E<(@dI..1#8*`*ZUm^oa2Z>Q 8n4f8TCn(L0d/q+<<CQtr%fmLY"L.b7!;*Z]?t7+tJ3Erk&-:ECb6>_'+95r+!&>#cGhrTi/0P"oM# ^jP6(gah_$\POltkC'L^L<fZMC=K[?Gu;/t,Xu,'AE4)tbHFR(G1p1FI5$BJ]b1[a^fI9'4uMTRoB@ 4^cd55^*V%<M6=D[\Ykb7Z(APlVS=906J.!esDg?GhR-^$IjWu-I@]4'A+MV,VlP[%-l?q3g`Yd\uc 6_Q4MTSe[d]s3Gs?IS[M1#e<L#>0C(]Q?Ca#VdSuMNb_Br&D3O%B"Ebe-1L:aYFeB`CABTp%]o-gS" +cr$VN<"kiOUj[+")12M<'6<enWi3![&?ei--Q!PaMOF5cYdS*k2fhRbEu+8nJ,1_?jUU-NK[.!5qb :p][ds(po`rPQ:?]#IYZ[+9<g>^6&E`!C5^T$D9(%!((n$7$@\>;s-^sS1"!'!;Mo_#Y4&l#"R3Crl F2)$@r6Zm?aGr4VC0FGn:g+m)9Ei3"SuVh7u`(i@?4?/*Ca*X,4qFYOL6?9#$O/!W]C=2ARGU*_eHU ,Y"YX#Xtm>JMd^,Ao](^C/l"1E1eeDe1)2_#2F9,V]djF%EK/"J"PO^<1hT>HQ?2Pcpe8[q%.3cN!, 3Qn0d^mV9*+XCGt7p'/Vaj;]'jqVJ\?S8L'L;Ngr>T0?tdo7"fn$JehH]ZfQ(?80u6YJND6.'X]je+ U*12#_B1V9A7%IO633C#`KIlZJ,J^pgsVgKZ=TL+05HsR0&2l*O6n@!9LHc`lA-G*Xc@*)l)2n!3G_ m!5hQ%d2*g5`0I6bU8MK/5W(-D/oHUXdK0\F$fHssJ<$l7`6n]X*"--l.!et'!9X%X!6iG2JLl?(+V UjW4939k6PGu3O$S(Q'/-;4I2iI,pOXLs9W%sEJ6,AD&-4pl4hVHRlj0_\!E^TOn>mHl5[j_bK)lr; ##I8rJ5"B%$t+<6J<\`3Y?(VcV,rS;0n?^N!<*f;?oS)YC3_P!E4%Zg^pmRpP6'Ga#,"-sJ4F&K!0@ 4@,R+hXrmTEo8IPTE0ECa]!.5F^(`s0Z0JS+Q_#SA.!cV]X!!"MLMPL7)T)r+g$6X=:J<lu2`0(05R L6iC#"3tYr=m&R;?3ak!L-7]i&MK:A5WF!:B;.>"lRhTPIFEiX@<50,m@+-'nEh]VW[1Z.tFKZ<WOD dGkS8ZM^<mJQ2imB!cVZV!.#uBS!3p&7fr0N#ljrP!/Hd=JmSTC8I=<&,lm"g!744;n4a3sHmF6ZjQ B^km6CZ"#lu_1"E4>Q!;JeZI00L8&-O]2&:b3Z!5T'Er$)=e4WSA0a>aDIqAk*!FT>Iq!@X?@^iLKG aE.FEhZ5,F#GC9&!,lu[=Npm)8dD#6*WU8(!/AJo\A\]G.@\'45r&qc#$ema6O=ibh0/kU`W<T;#Jb j0J>@8e;TAe\9*`6^++Tkl!3EI,T`2L>!:1s5:cY].cQ%Fko4MAb"2G:%h9QKK\*dmP-=c(r.YcSLA d+hQ!N(b%Ns`[0o"bL&?Mb77<WE,=!MDse!;f[p/1(Nci_TW^,QrWk63)BB=kFOc+Ueka5g"2&d1>< "L;:kA!,W#CnAc(?m)GEe+a>^E^a=,SBaB_-!<>7p!&k3JU*4b,"9?ZaSB+Ae#m'OZ&-0cR!J!B+3j -?p0E;MinUoPj2"W'q!4-,7I3j8ndJuQ=!5m%VV)/<2K8e5$4UD,eK)h!r#QT+.!8u<4!2`ElUboSG !l4CP!8qr#^^Fb:#QTX4!$D;F-,3+RYW=<A9u@12Ji+!0=9,T&"9<AX][8PQ&3plncnph1!J"0n2Ot #^K;6dM<"9l"=YTh/?qnNb'*.MgT\!=#3e/R4bhHSfPQZ(7!0GF[5W+W=L'*\D8\i3iTkF_(?l.9l8 1>uRc639l4F1"!&.8L=ZPW^NKLeZ;!1(JQ]NpIh8H8dU.@//1eIb1L@*2G<F<Cd>!ol"K\-%SR=&^A s6;e-kn9#Eo.h"U<<$`Gf7Rt6"4<UY)296S>EA7GL\.I&>m1dN)!+]F7),+EKe6Q=ET(NWH".WCXn. lI?D*lTl&%ET)J:8,H;(tb(#XD9f$4YS%nU7nSCk11_B7Y[X!!8g;h#p/H<`C9A!SN\mjY1@&6V0j7 13d/\:.[-h5u"\Q6W0M?"MT_#V9Darp.;12&[Z,]:J7">!!'K"#Nj#+)6b&P;A.2=1=/Q?jJ5%!:^6 F9<"(fQiunm<0VO,[+9`TM,Rb>/)PAd>;)6)kX9Dsh"lL?$"Dbet^_3:?E'PHUZZ$d!J<+(A$jq7-' f-PA.YnI=^aStHL(RE&\#:p9$f-Cm9NZOtetSLe#Q,/D+L>%$2@EBL'm:-ubPF!'?s`(jhBDuZ%]Fp YJ-OXH,(R%n!";</#,,H0a9K<Z#lk3a!%!0=5mQI$//ZUJBeUge_QP*uL)L/HB:ojP*g`S:Du`E18- 5NjL_p,D!*<-Cj=$YG=6L[G.ssr\YR)F2!<=n%JKOsW8Fs6God]>Fal!2]%'DkS68AfK`_%KZ2]+&o J?bgS(`GS2p&W+I&]EP[E;[sH#!a(?o/TcR!$$MdKeBP5]Te+H"R^f-_%-rBTTG4R#oF'TJ-HQ=&K5 pf<(L`.#4;J$[:c9["e\8Z!PAdhK(DGBq$<JjGkbmE*r^d>0F^03@"eR,-kRAYb2:Pf('&s%f+eVr< iD($-%t>ITtjHX)XqVt96"(5&/r&V<&b,r703f#E.XS`Cd9^S-G>2-;#pZ$!JiUkDs3G$!L3]I6;u9 c8qR:D@=^ad6,I`DGRWq(l>detKe-\*!":tV$p]\8!$DC@@EkOLGRV06BP7a(7Ke5k&1%*)*Wmct,E a^/O=@sY]gs3-a++CWM,=Wf+KL;.[E8IL%cAhJMAa41paUL0-t'-4-DqO!&;+Nq,QlPL$'5Q'`$O?E g]l]R"/$'Q7KWWOcmE9-!rt9q(1)\h!H*E._>tIg;eQAO"p[E8U;'YrN<hl/%MVq2^`kN6DuumQ$*n lb=m]5!cm(:J1fh`8I"VJKJBKZd`(Fcp,k_ub!s$6@J->WQgrN/W."i`6!2As0^l!2a!rrhp.*dT0E $nnGrd_-g'JogN!1o!_gd9Ej'jqFN!HS8C!3ocH!C/3d$)&BXiitHZ(g#l):V^a.65Y65`+r&)CkBE t%L=S^J.M9$OoSq6V`4`S!51]*+:SSVlG5R7(N`gDi-H,`_#hX+kC<b9=h"QRJ->oSm\%ac)lNj19T H&sNEbUS?dO'u$@0_H&--Z\_8lY=)or+^b00?0_?$Zl=n<0Z?K_B'Kb10b7?ooA9aLm]QFdtG=As<l %`3ap!F(+<^jq4A#Tj%3!M"cN#Smt,8d>dH\u3L!<%:KI5VUWF0&scM'oX7<OinRu63+HKYNRHHN4d $HT`SaL1S]a`!;p-t5R4"dcnXrRb;]KlK7=[tcn\2nk9(e?%6Om`5i+87Lfa[CQXPZb#`Jc9po(,"C `i`I%BWd:+d=jKQiTSTfI/Z753/!GG[?pE>ZmE`W8'Oof6Q@e%<tmm_[$J!!+;RH'n*:dO%SZ@,g[^ =6.i+ip5KQ4icobHNFr8/!),e@NT40g1u:h16+gl-M,k&c0-D2&*[F!-J.UK<]LN:$3hCtj#T`CpOs $H.Rl)"HNXE\C-mC>_Gp9kN\sS6595<)kO92'6%l=NbMa>_!AH<L"8AH?u":PAL5e;aS&->B&1%56T "HpU?1i*%#6NI@@-/s_?A)eb>ohrO3@SiGJ!/^q_\0KQU%1=1i'n.R>PT#&P=B,Ae$r@N>Nm.V,i!. Ddd*W80V9k9VKr3:W`%<E(`'f2N9QUi_<)!Bn@=jY]"7S]dJ-do'ks<Le0X[Yi"AQ`FE$%@GH;Xd#? 4flre`aLm/WesX".>9:O;Nq*Ot85D(Z_$\,cC`]dXm&]E#^#d:GN!m!]6^K2Zh2)/]%Z6]4bB3d=Nb O>`:,^kF`)oN8fGr+YG;i!'o3#B#k%f6+p80X<OqMo<CZ?MTOBO!4lHuI=^c&'M)Q*6"t9V&4dsq&* X)0!P2e%F[X(SqbdC`7.Q9q`6B]=AR7EmRkY:u<`':Bpj%Q![iZV7hc3iYA1o,7Zm'_TH'f5G,-q7d ^]O.iW51^6!jj.JjJcZ[HBF!i]20[g"D&jc0ef8_C8A_>(^Yip!&8^.Zje%+o8j#!">ln`M*n-X+b1 %_$_Tn#88I]5-;h1D#?HGd*3t)H,p(R!&\p4)$RAeZ#)ZdsN*GnhdkO8a99nQ_&/5;.$36b3)hJ0C, 6H41<#Vtd*"W8V?1S%A&-1ol`hYhL9H'%hQ'.;U,llCb$_sFa!4V%ZpdXOAe,UUF!LPW$jRRP8gl]n B0OP=m!Y`@'0Md.%c/\Ej!b@?D$3CbT/Qc@j0bm0T6sPHN^e*sSr6ZFn;/o9\JK&lS7$@OL6#_+'O/ 3L5M+;ku@Nuu:K1&ZE!$I*u:luZm+mBX3,)Ki#!"D2V`?Qr9,Ck_rUq,\e7QB-(jmjj\8^*lLfMJsV ,QPRBONe)+"!8(t=;aQg!MBr+>5)JER>e509nFNB."D;F5W/<I"G@?J=o_.26!'kp\5[4%KSIg?JB1 @R<,7R9GXMU(c_4;rPb)Dc\Ta;d&B?Gl''NY,J9Y&/-igmoPu=]^"L]#0dK9%kI)(?n%=fkt,Q5+ZJ ,tO"6*Q3rOuu">@;D57`8VYb"TXkCPZ2TQJqo<#^2XM]!P*d/=:eGnTqm8TJER*<^d+.#E(3Pg0!IX I#k=[VTa1AoE'U/=:nA`38*nVU[N4<2Tn&(AP=9$N3-20]]>[!R%knM:"?]"l!<Z4F"]02U**?b<1D .-#(d_,`ASiD'jW'[EC0D8Nc\MRGQ$4*"?u%#+HK2H,-3]D/d&hgT)Cn2U8ea1t>gsNT?sJEhe`DKU &AT?]Q&Kr+W%"i7POK"M7)NSX3>U&*e0W-Mqd>`j5f2/lrCh.F'dkDaP/ARg8HJ%AEel?H1U<>dV&n ;e&sre7H?d%uLKb=VEQ-HHf\m092<GmHL'sZ/gb)$H%6t&pQR?D3F,<]p.4,7\@&fR:jTD.uUmTR9K P<td!6aI,&6iHhL'JVn-JXpDA8XD6$6VgRE-Y]sQQfrq@Sf7Ies$18=@rS+#'/A^aAusT&O7;F"3<d 03#WD7`8LgiFia_`-Ea]qg)J9[7bCPn@]4ffR/eo\ej)4ZAQ=PSjb=TPQo'=>'OX2c9'VL=)'^bqB0 ZggAL393&=bSW"9@>0S!7J"$"O8*TmEeCErh)QH2q+$+TQHl&0kjdQH:!^%/0`SE"u=QX.uqo"^%3$ OhlPYoI0Ln]HJou>0gEJJ-5RI7qScH(,1G"jY4W#L]AKHb>Dl3@:s1B5S'6KS>L3r=t0jQ!)F<-n0q 8shk^^&+9oV5"q/Y0q`o"S4-0j`!6O.<-7C-l(dKhbL\Zg1,J#!%n5<j)#3Z(B&g@;hd0XBIOe@\A; qYc*p_.+l@fdY.'0Irh$b/G'clK%i%1jb4)bGY00GM*UiXs<'>*]<I-G,*7TTPk>jWZ$3MK;&i+:(A E^S]Ej!skA]b_1h>4<s`R0jn<+R1Q6e)&1/Y>R#U*Ijbas!)M*Krg)iGlr&+"$hm8pflg42$il:?@\ sG.!#[Iq.Tg\d_"_:]QT$7A3J-0]_3[GV_44Hh^cmR@]E'p@cj:Yc!!<u:+:Y99!@((5H%D1]Ag:sh 'UXjqG5,P?N,mu]3%!Hm3TH7dEmRo.V8DF8r/8YY)difmP*QJX7Ro)%Yn,J9@4I3Z_UM^sL6<A8[Rl b+-lZc1l!\`XR0EmM@TJLS<JsFYr[BLu4ec9NQnG/MO:S8i5Geu0A/5J=VEQ\QSs=g;deKTQP,B&"= UhZk-igOj)gVM.VR$R/KL]Mha^>13%!DWm!!nYpb(.6`@D5D#Ajun'TE>RbPc7S),?4d\n5I./_LTD #DT5?1&qYoiW?A%RL6r.[#b6D]@#*]MW_gqa!g!hF5jaCNhOY*aQ*:GYStJ`f$#77KdV!Ua0bc&U+q ]>M.A,=F%FBMMLlho08LKH'eC<Pj^LUI/iHYD>Pm6_Xr!<e=7Jm-2&-ssjm%DCpMGYlM_2q+e=<nTr "uH?7.hMaa&HP!E&HF$h!K95SJGTEL'IF;T:=9,EAIO)"`W/g\%)>ZEl[]L+S^N/kYT!j5:3$?qEQQ E*&BlDVoSA6@PFMsuOOEW^"9:@4OAli@@6t8cUcD:Z5RHtV+ikp9T;)(D4908X9\9sH0b/c_+>bqqY (@0R!;%PCS"^.<3<3)YIZVUoTTqkHnAbY3<f+Am!$j?2_#+98bWc[>*m"=K!:`DZi/pD-`R=s_s%rc _$jC%A^a7/k8^PS09dO1FiW4?64qe!j4s0hE&->Z`m;uE&(4)0(!9sZ)YbEBQ&O9,)!An@"J41(O>_ 5FY!nIt!,d*(Apc6EF2j73?1%9ZABL%^\>X&OFkHFr",RZl[e,WTF%DY3fIY\H6K**fs2uq$W"Q5D1 $"FgQ+T^MC&jT&E!MhKSdnb!FPls9Q+d5#.%L7O[KV",5!.[L)!$!dZ8Ocbma<W6o7o5@:!<5RmYkp fgoiF\/RnPUC&2t7&$t6CC[^2K;#R:Y:0`?eRjcbEaOUqNhhso_]cm8epqr`EZ-3q?]!;uM0N6L[U4 :D`*_"30Y!+:s35h(uG!0j)$ZiHIK$\85s!$jf<5[Vq>'IFC,/Hu5p,nPUi&-6#k&\oJ%!>Ksn:W;7 E,lf\lhpN)n!'ZqUYkpB[#DiS&P=P[BT*.uE*^Jjp6/]mNI]\@]2u^I<X[Z'K!73G,5iFEQ[2RVe:R ;&P:C2RETE#*Z$:%?akQ+*0K)uTG/-)>7VItk'#R`oVYQ1&:X3:WQOXpJa#m68M0E>!LQrCXH,p%WH 1'"[mG=`>m!/qEiJC4Q$k\0q4!,r&*@.BT3^rYk9'Yn&?1VG+kQk``H'Ft&e!Q!29@C8cETHRj!ge; R:!S0$V'*4bk]M8gl.O3Am%2MM;E613B.S<N8bn'mJT1kFIol8>W"*"2q!-H<bTKZ$Lk/mfLRMm-o+ 4q,d,QM]'GR"f!%gp,(TE&(gQ/:%XnL7m^fLbAI,Z!ct!cTqE!-eq'GFn^WkL6pGRQpkiW;_L%V$*u h/liTq!q'38K3%IU"-"=48Yd0E6q+B7bQ4n8M%e@fBdF45g/=:p09/'_;:of(%Po$EO]!LAAi/$LE/ 2:F778jK1u)_p8r+j-`G^rJ>S3_6D6ln)&3Cj72*tgf*//dh!mhN["?.\rKEMqQd86N[GZK>1J<l]A :5)#36eF:'#"DI`i\)1(DGgY&Ca2B2G<dGdGlXtBT4/L/70/09KEU<A=trZh'GDC"0iADn8ju)<Mi@ aZ^b*Br=qU,?+!mW+(MQ6rHIaK%LBJ8Vn"`c)`5Uk=>S=Zm-l!B]1,2pq.SR2^;2%c]=XXm`'UQs/W >&Jb#S97t'`s?rj\^E)>3^:"VN.W!_)T7r7<@ZpAogQ-;61WXiEdcD#S\2mTZX5f"J$I/_J4kE<:N> X2J$V'F]A-5+0$$k9c+R].W/mujUbse0Yp\<!-[WX!E%';@-SR4WLBejW^iaPd1IAJ=cqX5!,[DqV- 7,$V.s(OWhudf`-P#[@&]\H;o,;QBu38+_,\j^OXa%e7dVs3VKcPQS,jnP'p,+EKG?iSb)T.(-%Q(O =Chu2?mZ_FV&2fl2o#L&O>#%Mj9P48,_.2,%%.<U!>f,J/<Yg?Gsh_47&giMKG\f$'S)6@!I0;L6Fg h8?i]C?+/0Bj8!q>$&6IQdod[WnY1frBlE_TYOTAj?'qc2-8,d6p+Kg_4!GfDQ&tf8\j2!d[W^I51^ $;iU@NUbohu`ZZ/3m!%>%*^C(I&H=W$mVA(&(;.7QC^&"]Y:'&#?6CAMag^k!m4!&mod39#Mfb!%JR #E%(:10'f3-ZQ]VO5qsX]oFN%ZEJ5e<X<iGC.^YKEe4iHK$.Kt\.rE'-jK,_>YOiTt!A;e:Ba];h35 ChNX*=_S@OVp?P)0q_al(7q&1#.f6>^lK_,#)])fcD7k"p*kTac(;cUn=;2\H,G5m6il"p!F55h7;0 !8dOWh?4<\!>&o["GR.70XGqa#(^jFY.b)1M9AMt%^)I8pl]'N09`(J!sD:"FeN\n+[cJ'VEe9&KE8 $%i-M\l95?n)<"cu9/QnT_HL+(5J.c6u5sk5+iSmOf$QY$A^he*8.M;q>!iRND^r=-lL]G2*k6)T?. i(D?H8Q#4Iu8lq%sS27Ws]%Q/IY??Ff?Xn0,+FLi%>0:"Fs9m:mqS>J][0m[UH/9CBOW"7ZV?6+;UE 8V;_2q,L.eh;MnJWat?D?%591Q<?6WTJ._9?,_L/g\BHIKPei4oTE2KQ$?j20;eALk.4!#oX38)YZR Q9-^]Bo;@7`/)-6P$TYNs?a&gF7TFQ:%qDDhs/!5PfT-EuOX>OY`U8,;:M&.JUJ6i\2l1h*[O!6'h) Bs8V/C1Iku#%0[sWt.b*oDh#XKcHJn&XLpX:p.k?4>=C%)E!\I5U*bAhphCV\`S]ZTt'#"F=a",Q_A GC"S3s[TY(U35KO0r(3s#k'auA$m[D:Qc$BSmX%=hJ;'cb[4fb#:-b'1W!lW'kHETT-pkffLY@^X17 'B^t<Pf^UYAPftOcVs9_ud`ij\ZlZXQf'6&./9>b>d!6!42`28_QFCW/4L>,E%[*K-UOC:aNaU=f]u T[2P!0CDqg*X8uQkfP1VLXhP4ug(?kM$381%5P9d3!!"/G8=PbUaY<^qXW!nfW\cuH.gdUr1e+d<X< "oH.3"8B:^IILZ,9'E4!H*RR3J`k`!VP*!%W!ug`[>3#_3"b7*\(UMZYegJH-tR`7bf0CI(c[.0?C5 R$c$>"M6q,=VBp",_Kla$]kd1U+G6*poq?-*i'#T;_]JEK`n=o,(Q_gUu4i\5hH,]oX"HH#6<*X[#' D@^]As*^On'/+n;lZ5^.1o2N%mDFgN7hMSUJdoV:1pjf9F1Boi;s6]j-<fWLb["9?\=Zde>9A^0Wa^ jrag'I9sc^^BBW;McZ9n<e9i['ega]+>h\J3YgHbn?*aD$R?SS,lMQ#GMT*>oe_POH%1LWmO,.#P!Q Gln.;E('FW>2EB-%!!R4>9@<;U$a!RYd!bs*m4B%"`\1N_5hc>;.#"E5)6SQ1qC4brE_HNe/IotT3e Vd:;:l[Q!c`'K0LXPHDh6-C2V>DL!F?]a%'Xei%9qH\#(eG:arM5*aj"7@fB0L<_&4cEOtX0M0@1=k [Xg#@CXu%bDh/;N_#=G%/H^OV!X"925?ho<>Pp`R"`7q84Ga<Yd&$t%A5IBO_?c<Tc+7C]X[JKnbHR kKr1g;(Z5<RBeGp-^N#Pb`OVJ-b!b8&L]3()p<<9ELW;lqsJ/ZoB?*p_giX.>\[`^8ElJ+iKd-YI&h $."'R!$$VB"-$e%a`Gn)ma;]@,4"6>#LeD!(6kfUO.=k&@\N'a8.@H$.>kiTW]u6#:lRcgd3Xfb274 F'a4YM?TZmm[TYsU']9me"YP"@i7>-8$gbI_Asgnr=+gdb@;Y)7g3174999l3)QaGi^g04Y6F[FhLi <Q?)'OTJ(+GUXDSYW(!0D;9&ti(I\dI7CIX;_.$@@;]$fbP2"+V?kEIrl[!*n0T`'F>MgU]BnH:lfk OH_9r!77JG&FD[$.6s,^,QL/0!g%CI!1Y,3-oQo.fMfc9Pl*6>!(Toe>VZE^q:%0&AVlAH!.al#6A) ?.JtfedfJt,Y[O#1WgRu9H"=M=T[)oh:a&fZMQn/6&_ZI(*"snWa!\jr*TUT6fn>llqgtDig2b?eE% LT-XA:Te6!RQj+\lM`1^oY1UXbQ_J!3dEUWA2iC]Hq9N76!EF:*%10!!)e9:^5SA2';n*M#tIQb[U0 Fr<8`o9`r0sJcH(P<YNsfo[tK[DFZsG4[1FTXhaoEUgSiS\!mFe5+"kX&U"<1'*&#`5e=LYiWhAl%g bMMfCSZ1WC$YNkAhjL^hg=E(f((JiUHlT)PBY'&0`A"?UFl+R3Vbr>l]B[_?fL/dm*s0-3XDA;ul\e p0Xl*P9^,ll"nf'[2L@5!-#,-&2'0e:leEu#!hl-q03<'M'*-`KJHL:jKshfU<8h.QHI](!C4Y5!2M @uU!cd0&HLQW.cWY956Lu]O?CoFJgo^K1OT_+hae$>l@8#XfcZUe!.Ds!khB,HMUNK13#ho]aT:=^4 FbJ*ngF@;%VA6%:m)q$j,^JO2P^fgJ0QibJ.6@Prn(tu%CBj?n2?5uXTmr"k/^6EP8FN9[B6E%f[08 @%@+hH&qh8*$NrD@qXkBJ(L5=%oHWT@5W"CQ3VM:VB9@jpdHYlf%b.GG`%I`TYS.km*9@<.;&fa?LJ ^/HT*.5aTS<Tr=!1MA/nd--re@Es&u!PnnO\;0AjAn+pdV3>D\9t``\b(k82-j&^;LI'+U(7kl%L-t P*l>A.Y-5Q=M@'N#`o0k&Hpm%JZ?[*IZ7k?6>[>ll<-DA9k`#ZRoVqj;*'p^iCHr\_/EC0r(9g#7c_ R&+MVn1#`t6iA><FiqYVNLd;M0,rQ8`omhG;Z"fVJ%oJQCR%Q,^_2,(4TT:$+Qp_(<4'RJ0,/f'4q8 CRQe''J`CX'-b\O&Y^Ds/s-2n,!Ku0cItuLh"u&2#ctC#$hMMCRY?p6tdF!6q?bIYAG!')fR4IG+?J jE8clZric06s))ZJDs5AX>ec4s!rPS?^uqoo>EVPmKNe.4pq@G[5R4qpI))%:#Rp_g)S_dgjnOiMrp TPR9iSn-9b)`q0cH(j#P$@'&8^V?]M!V`BLQ<[qOR^>!#<K.J5Gc)7<(nP"Sp%4/,T=\1pHkHs2Mh% `;Jp%ZbIWe!1ZKO(T&j3nH;@u[=g0+qQdhdKMiSc`P-a>SOu_g!4P?/5i^?NnAQ=85s.$m78lK\W5/ RTo.*=&(#X$'.g:89+i+0F9[F=Y_Z2ef5f,*@#PJ)5^n<0&MH'3^&QJOpX9DHE_$VJWF9InK!4;eWB GqSH\k26DR$?ra#k'NN`?%<E@"L9J%J37]$%msj:^h@j++Q#k<Nubj^t6GMAL.DO2W_YJ,?CTIi,UY RDL`!82YmV"PoGf`XUUqaS$<%A,5Ym,1&sFTDh&L/+^gRr_ApK&42YN??P!ZB_k2PrR0$d6S^fX"?] 54f$48JjIOtah#8(H2!R=/X?k.QP>!RN?"j$d/6CG3_:f[P2?ccku!V+#`dXf>OfS^d(&kF!Q^d&`\ YQeMOCqpNk?3\5^0HOB8)"H5>%BrkZ#V?Z_;T)sn2'?M1#O;@,+9fO]A3e6\"<[j5!15W]XTQ:'/L` <"Y4j;1^^e"Gk>[j<(ZACKED<MBB#MM29FM+2"#D[XkWWrpb"J8d0jqp?J@2WlHnEBG?[ug/K/XMNh ufd=p-pX4'gKTa6$FH2Hs9O"+M\qe;tL&A&-s*r8<k)9$kHV?MbDSs)'MG6$fVU?/cpRT&JkO?F0Pb -*P_a_bh#ap_-D=A4O=l\<Ih>Op_H6t705D5*(\":/92<;n-&bhm\'b\"QBE4.hQ]$ikVC2!aI2udF o-5TTNmp$uf5^5lkCu'FaR\#h<u=%\1O]j/rCiN<=kO>@hVa`OppAO9gr#G8G)b)P^<3YtINZr#,`h CCD-e`rOP,N0bC%_!uPMT#_h(Qu@?l@ifbm&>4W\`"HM^dj@=[H(o)5VXOT7EP0(<SL;W9C.oY?<UE jcN/SHBaXk)V'/p/7Z*m(37)NYg,`oLr`E%!P.N&1on,RkV!2'AALqGP\O%6Nr8p_NS!)l-*i(M3bB *%"J\;ZEFQYnK"2hP6&JLgsQa>gG>4(N^jpi1t'(pCo[;1\'K,KL443?/WEaI((uXDNC,WtC&%+Nko l^kE14T?%Er!$DVVa#9aqZOAopC-Z=r;@uikQPJF'lNTEP!O-LR="-FQ?kAq22S`@t%a5/A-,`,HmD s+ZSIlS1"oV%0n/QZTQ\kti*i[1H#XVq;\l;&><U^f3,)-*sl47h7rc"Lo,Tfrm1,.(YHj_qH$.'NI "qpHRJe%Qa\lH44&$uYUm.ooSo)lN(3Znhe&'rNUN"[SV4*!,>,6J&2n9o+A?Gce/2S:rX_e/'j/4j .fiNU!M%R8*u1,Z-CZbtKN2iLqrM"U6[6..?Ws+">/]9EfhB2s=0o`fIKU4F*#`t@liHtq3Pp[Qn8+ !WCjZ%qZf"3<I,J@lX2aFm$:$mR.@$ShhD+G5@ZE_\//+3Q;-Lb'c`a:.Wt_'/EjF)d#+/AK9f$&SR .UWCjpYfn\OaOTj7V%q1p-M"9:,DuUjnug*QC5V7r<kK0rb$D9`liTAm-rmorT+D&p_DMApciO>)47 GoB"6_uhOAkDb#%J]W'nBFrQ=,U\PUlg#Pp%JI`o+_KA1"VeJ?]*;-=]W6#b)eE6Q;IjA'Bm2Y(6p& 8UD^/8S:VkT1B$=B2ZSVie-eB]gT25X+:V.+qT6e``KJ"&c?MO^bA[e(_HO5e)87@F9'+(HCGTq"i) *mPna;6N'hbIPlu2&!?aQ@%L%C*Hg=]@4,F;*pT/%#"8akS!+:q,:87^F-)0Yq@fQon#CpK.!,OFfk \IJi!-M8d6KgKg%Hp.Z!60[IY7huk!:3Fi'13$)[&mc^)(,Eg)k)`63t_ap=;V/Rjs[+!6ORMQ5tqV %lo"jjDKJRrH`)B'ZNC7_5B/L5g+AUQbpijH[fVWM508Gc_Th-OlKCbeSW$:bK+;LamXfFS!MI[c!" OMf0EiR"\4%/5"V^tXSn`=;>cJqW(;X=9'Vgm6lpq[&CKh*!#.+BL1M_!&fr3+N0ql:n!<CKK+GO<V n;5]u^.aXG'_n);490;M@QY:6MLc+3(s']MOhblX,/>`RN),^f]N:cH=p\=)[N30g&DoeXP,/P34sS /XJ5mnN#`t_?/<r*rau2n.:t*^D(a[ab/"K&EQhlN_eq.#IU#[pR`tEJs,>D4WG=qM&EC^(1^g>qL, L#<bGF:;^74s]7nd%stSQ-4-%)=@OlmV0a0EL9OYB%ni!%NM[3/7\g7BVH.,&D$@6*u5"aTTTjgrlg i"_&>d@&uV?i6'MK)&XrC8I@^<87+_.!8su<.jW#OqKsb%n<I%Q##pUuK*K]Z7L]1#OnBoM\"SP;0E `N)Q6ZLH$p6m'jMagK2An]Q/:]J$d@l;UW#o?K+T_e.9Oo)ZO9U4JPsih-)iYq+)=Z1h1'@I%X?dsl 8G`[(J0F;)$3?!*L`cjTdKoHQnOUCuFFYY(0pjP?F@UjeJH15--J_5i#_.@P%F*\UBJdJE.nBaM2#& J)2D,A8@>1]=8eD%T1'Z[_!!"BC7bc#VD+UB++L?XMXT0k#)i%n2_%*gTOk&0i!Peu$J<)Ak(t,7f" gCRb"KHtqh+T3@W58M/9KPp3!\7YL,7!Rc.\.Bj"gu-*9d\oJY-\2E%1L?I<Z:oP'T)1`-.rIu#f'> $I3iIQf(:Ei(*j"9FSm=hD#ei)+2Ha9\0\sHTMFeWT!Z6%9dA.;j[*6JldN_.@JCUK!t4dhge(e6!J !D=9g@+hF%7noGgZW.?V/HC=d*hs0JTo_`H2*q$[gDg(-CG!bQGe*?!saI!_$ph^hL%&2Dks;;;VOO K#PB"Q^V4\H](c\#p01DSIubi0e>b@`feeFK'_#[\(";54O>@8-q\WCR(rXM+a*bI8HSr>[9s8N=k- ,2%8]tVeK)J!h+4.=5QDen&aUo6ZBE!*=N3=P)$&)Cda%qWE#O3/rps:."J""*@OJia&(Rql$'K?D" (a_pRr^[o@R.)h,^]WU["Eb<]$Q'3Xond`91GVhP[M<Ibb>to<n"*bFfIO8<["`f]YL8+>ZtX_;-e_ Q$ZX^nLC?b`98K5ZGl[AlWYH`%!@s=rcj*+iGO[m_%_UB@)[oPIY?KK>r6]sk)Mr:MKH.@V]0cJE,S 1"X[H=_PHiRf019;`<!n$[+C)5T.0FM,+:FEIV;4]m`TEG1N,K,[[!*um8-qd&=RqqjU!O.X2/Ns.C '[.P6RPJ?h*eS&]%3*4fFENXX.c)qD!e5WE^fQc.Q70o,.S`>?9t#3J4L?-]&JQaeA%SI551(Cer3S nB%fU((:^N64rO"NE#rDsY5_)!:"TX?DIBC)p7e:2T&.3C/"*TD&fE)0%X9)4$b:>Cs*0@^/d#O#0V H_Tp?q13IBp&KXMMQ\,1^U@9OPO/[eLpREJSDEO7Wt!C,fBaYFroHO(]u>_0).&T05g0'eKi??ATCR @Iu,i3Qgs]WrRY[J/l6+<).7WN!<A)39nG->Aqq:YF[ahghGdA=>mRth(.gD>@PHF:5^&*u?V_S7Jh Ht6\(CjMR#Mlcfh0+CXV23t!qk9o!>Mb?k+Y"L.gbu9PWaC."^gU\^^a$_gT#lsAd8>5J>HNum+:=* _,(Y]!T#:S\PaZT!'i[I]cNCX2!1L>gt0d0W&85jd*=M>:p&R-BQf,1@)pX%M?!VW.+gJ#K=s>@ctC 2]TQuY.qHs'ab*(.E6\\;_j=?BO!,YF2"''q6`+r$!!J$>h]&p8uCPkh6d$O)!UFfd/<Xad*0\XP!1 UaeiA)Gr(UKtr:n^t^5_*ANU[lV@64a^38+FpCrC4[Sk[M[h=NOIFE4eMl[g%ol[5UZIp#rd;=!+5o `[(m+N0EYrGBoQ^([HgYS&/":[`H3c(ArG?NJcN#gC>.f.!YAs&$])7>YQMPkm;]pi##G?cob6(FkL b+hSpe5bf[n2,!!XS$s+#X5.oZgA6GrbA+5.l^'>SXDPNVY79kFb5OEItuACCj!JA7(X56mZ9:>BP* fAa6e^]sSg!HtFO!6>7E5cTf"$VXTF:'>>$RBdV58LM:Si3T:_&Xe`QK,r<^hZsg*1,Mk7g@>5Xa:* OPUPSAh@U0iQ^`FUIZig:"i#T/D"1CJ]BbZP.6s#Y89'asZOp?s^8-&Dcj@)p%!EB2QV*_o!.k@/e# Y<AmA4g6#<sa\52P&fYP-B%$L(K:G84Z#H(B"?d5]35(.*9`M=\KF3",1c5n0'2/NsH&b&Eb$!5T=* 5gS*:S";!fa*e46J5RiesT>N=tDrb5QX"Dk>)D"m?ok5"QMMjdNW>eq?d^KO5@9*]U_"4ZFYQP9QJO p@\"I]Q!MZqU'ATr)YWLO1[eFa8d^rL![e)>c9S^duIYT9t*+TcE;(JEYJ+pDaidbbTL:>CE%!-2R> &-X;sA9\"n,-1dU(WsTd66'B6,4[6#i:]*Pn:#/?q=jk_G5'lJJgJcpf8(ijk:qhp!5=!CI2^`=DC# ?<#1tS^'ae>Qmi_m#D?Ooa.8!4IclGXXV7/]-Z<H2.Z$W!lG6HI4WUbOS#<*fsTMXt'Va1d;0h70-- LMnhZsgWACuB`RQ;p7-^`Gl#k_<;QLIhTM[l!=f<8k/]KK,t;!7ek#5(5<:3Oh.=EYZM@!](CB;rP! tCu>@'/V(;hTSD(K[8C!/!M%.9J?>LSTEr\*i"uIX"q1cm4,&aSFZ>T?.A#K3o?NkQPuZ0d"99q]&n _4TJ0Loo-pg*\MHS_"!32i0JY-TVDVYo'!i!1hYT\a9\6*V(%tk46'FaI7BX2^]QFSdj;g*hWEWshL 8qT:B*a=d-!0F.TF90%a5k9h3)SA^YY_uQh(ZR+8E)Qho_%ok+X$+M5b^s`Ri#\%ZOb:j8rr<nO8LQ $LJ6@s6!"(E<1L:bt7,-!D:3nn[?pLU6%nP`263U2FZNQNf4$JXB!67'l0\jh.QT"ZAIA6n]$C-$fK Aqe84DlWb7cl['!!/=IjmPFLH;EMNJ?^:%"@^RC#>tQW@cY=53FS&$U"Gp_;%[8QeP4#FM[6&EkkYf \"!'9m:cAG1,.T<;'g(KN&53'ss"/a&%PVeQ$R`GaY_I?)c@G\A"h`e+Gt.iCF9dqY9\p1q@_;p.W\ g(E0*!;]OIH8qFsgm<#QQKf[4r/m0[`3qq]l4E__h]`EH'rZ\2N9)O-Lg7qq2l!j+'H,0TY)pfD%S' %l!&oJ3uMU8)u3$T^]eej-/*.EaY%4Du^\N.$L!=H+%,jT[9ck2Xi8.)r:R30Ff.kM8niJ#-H`L\;9 b_B]S)Z7oYW6*7Fm.o27[4*.XRX*7NT$MZY)W3TLpV@.#^+K:Y)`*Ju!Ff"e(Y'T`@K#-r;cJO6?Hq UfL)#<NL[4bFm>1G!AQDhI26#5h^;]B1Yq5^=m]j?*EF?6\S5>JW9QY<Ls$:b>5'^Z=Fj\2=aaju<] 6Ca^M2kWitpRcc74J9imZKErlS)5%$6NY)9.]MSfl.fdH!]tc>&MAjC'hjPb+^sQ^nkE%]Y^n&4Y\3 TC0%:gF=!43=ki6lV*M]eZ\!;+b[cuV5.4-ck."ZV;a('Hr(kQYmSh\d&sP0Wmh!eDa##dYI8!<eE9 ,<\jL56oWP%s&lS#J*qn\4kXGd_I)\/>jZ\;#*eZBA&ks+AcI?7"DOs(_XI]UcJ?nP)m&a;;c[Varn >_YE/f.b#d@_!+rWt4Sh#;D,>j_jYC[t!_=mf$p^7O]h`lC?jO,u,/BJ(7e3`/,6X_I+O#$qP`0hGk [4B*cn]J>UcB*m_K=tUH!RAVHraNGjTQb9*9U9>P/\19Dh&%r"X$o9A2ba.Yim_9$54Pik`&2"8EA& [,seq_Mcg$#K*;7D:]N'R"`TQ"!(n(3E0KW^'*&.i!VgaM5f^[/jtTHL"H\g@!9f'a1PYQI&qJ=S!W 4\cJ1_0R8-!Qq"ON2t!$tPG\dJR)&-0'-!#,nR_!:Ch3&1sDqr7Z=.h4i<j8a!]%KHLY!.YRhJH".# A5?Cm8U<0M!4bH!JFWG/ini3@1b\oq*aQ&ObU*\t,@cug!""_gcp&oYYqEY^!#Q7S^eRf%H=57Y]1^ q1I>%t/&H*^OX@=W?2T-+<>p#CnDgDWgoQ1)g%L0_T@K=b0"p!dB3=*kn>ljGr'EB7i0dGg]%dT=5& C%Gj8lMeV1#+!S(sUPh$ikP$5r&Fj:R`C;G!*8A^540d!6dY/!$`]gpjr9K%L+dec,&g'F+!pl!!%+ -S>[dA(mS$e9E<!`2m_\E^&"'-9!;>E#Xh8"C((*D1YE3:iO](d889n[$jT?)@)jNK"oqe8!-AW=AZ MMn-ib0!n^IQk?k%Xki;c,;Q-rfs&qY]"(Jgt/,ldqt6@-&L1)0f];us'1'u9`G!E`&3J4">XZm7Z1 cJB/C56-4f<.X]e!W['%die_LSc6(ui%Z*_7o05*,Se*H<WRFT'nB(m!I,k+J.@mfHjp+,Dt50T53r C(HkoE;][68GFXmp9Mu^Zm\C7U4[MI,L9`UO]@/ShSisXKNli):i_ZFe82#s5#"@1!u!6E:c&3ihg: fI)3YL0#G6Lcl]\dIqf.5LtRV<'+H!WltaWX/\[Rh,QnR*T:CaF8NtmjJ"W5<#.jf4nPGA)GhkC5AT 8T>u/t-ib=1aJ%fd-4<(1Z2jMC$pa6r!!IZq'*I1l1][&5"!F$h!9uoRYj".J0S0DbXZ-;$K*.2p2u mpdStS8O4CH(RYQ/Kc&&?rh!73G2JC5,4W"0J*rNLh?JgH6mg(A_rrRVDV1G'p[^]md,NFBoG"E80U 3WIe6O?5.E-Ri-F!75;$M<J$UT;Gs_"2On<!(%>%:k/F`f3TtSP/a47.;0n+-t+go(tOj@!%IhA1') 2Hn+@$+5YqHq$jGS<<<1!:"`QG#!9-qrlObBP%mU1!!An@!JFjT=4?j>V!9Ocn-ihoqoZ7(5'nC43! MG;)b]I"h#buXJjj'r4!%$(tJ<`Z6+:AoB4$VM%5S,%A2uuU$'6"*,'e)jG0jBGF;FL%k88T#1_[;K 6#WD;--Pf@^2-NC=p-O!<43^H-W)aY>6h!h"<"Vbl(6DTg;IdKL]MrQW1rN9Z<4E]/NDN!l"BH>a7P RV:&S6r!OU"Ee`u$$i8kDn7gF&[bbS6UQ3^Tcn&i7WEF\7HKj[hdY8Pg)^M4n+E]G/)5GdF#J'&<C_ dEPI"i-[6[O83U^KQ"atan%5U1@[bkW8>1a$E?;]n&<[.!6:5BY<Cc08Ab0b2=X'_WehF2KA6T+$GC AAU:P2.YXDpM0K'_B,4S821_RJoP=%GE:oXtEr>mpiRIcBP.!ok43g!j<WCOj>=$rhUTFD;Ac_'ho8 (s%i&TDFd/75!)'4l]M.c9G:L!i\&U>GMu78q6-W"s1`:[\Z?'s@c,9@O=]4T/"S!m_R#`$]BNLN?l <)5*H1'0h7M5t],f=T(qnM1lLu`(aU1'i>d-)pm(N8gqJNO1thjE3N:Pe0FX-n5=2T?\J3t;m0.gog SgR:Y"&R=+/eq:h97r4>Cj&a7FcYC6QNB&/XUr:X3nM=2c53c8YBOM:+Z39L)4f-4g4J1]E>-s4:cR 4FKl[c56,+]e#l"Jb+]%9M\Do2PV9_i!7:[/VF<3!/qS9^h=P.>AD&<UXMOLo8,j@_;^_;7Dpa\T)( 8egYcJ7\e<tL1/XW:(Fd9[^]-dpE5Wfk<)iIbe.3)la>5ucnRRQ'Z:Y39-jD<cdAdXd5a5^0*Y3ohQ O&P[C%,t5ft3$?"=r$DY^j+QKL,\k5S?=qbQ?KM#Ts34-6rT/Zkg903RNe4/(D(.,(&XN]*8fH:HK! h"#n-.RTGA9`2m7<UbDf?cWSWjW^Jj`8=eOXZKI("FKb1,;@45eG";WG8lC<bet.]uIG`iB=M%'G:^ 2'CXKoMgf9u[RlY=pZ3.qX>PZ2#SWsX@^brs_$q<`E&LR\%,7To>9`\4Xu1sd&8)dcEmhp\b'ponpl %8ci\e\>91+=RgE(LZ828R+N@?^^EYWL1(`ja^p=4.Xm&m\&alT"F/l/#eK9ZK_&1,lofj`lKD*5dQ B6KVOQ$f5qcnHQMfNEX<X'_sggEDHp+g0B[CA5^TKS6V-;YgNlGGjtp5:<Iq]TCn!<9;b`E;nR$]E8 Ka=i)#@J@ClI$^fu+d/!qZI@I7TIaQh>O@A^^k)!:g;ta/J<s*C1T2jb+m@dk.'_<b9YC<G!h*pX*^ cjCJ`<e,Y<1#*8fd1l7AVHiP*Dr&fiC!$]3YTH=aB6S-KN,V;U4.^U9tEF&'a;t)!:g*cbt5UVRA,< uRLVVkd'_6tF[@Fa#E&>8F.*7<91M=%VLkC,F&(ju2r^fBkA\0G0.K#6FJ8@3q)@&St`=is7bB=p[5 b2D1m;$?)J:L$Maim0p,Df'k-69b),5"AO.J:gr4ET_C/"s="],A=mEALL?H$KAsA>aGS@k*;YS#7P (-*3^V`/[,7::a(^R>l!*8!K<Ri&NJ_;,63cQ!$Dqa!$jcq!"L:PN"lub>9h?6d3K5.@0/ZV);nHe) dLS&,S_"Bl]sah*h!:)#)Qp/'LC/r&TmXY#>%-m9nAA.B7VcKBGgp.J^8?'F121#/+E1h<s4''Nu/u ?<PRUHZePji^Bne@1IPl,*Ur`G#=[('2"/<^otI>GIEueZ^P;5(i?s\:<RhJl!3$(32"n+W*5GQ^<G BF.In:3#)uF0\!.Yr+bYZA..6rdsM*KWYq:d:P^psst]2TeA0p1a!js7":5oVcb[H.>8?<7;BpsobX ?q5d!M$-.Q*d<F1"Tlo?<Y;#;qg\T_^j)5[HlIp=9834(m32NE&Gos-i?bRF7E?X!0g,N"gW!"cmZ2 %3!N6"tq@>gloHWPfZnMCcJ@>JLIa>m\luhYBqj2;<+JHGS641=((5/#DK"MV6J1s/R#V`nr"cN3m, <9HD1fI!:2sX3Z_/0gJb[5E>EO*`GUBZS'd$CL`f)Sc(4Z%hoIS%<[\hZ<C8H:o15Rg:V?p=Bt!13b ZXG&Z^*8mYMljdK-.cWN?Jka/9b0:&tKj\mUSH](b$o_\!"9:.n2cBf8%ER#a`.MV@!<D/?k2m-UJ6 3"?q(];$n6itN1R>]d=VCWo4UDfn!3PUs!ZBRR%05)1!"d9imHFp7UET7lg@H'a6Djk>Nteh'U%G_2 (3Nd4o:,#%0aA79Lt`!drhB&8`&,::0;qq@+Ya%/(d3rRlmgN%1LVAL#RF!%5^3\?TZ;T&<7"Wm)W> Zar_1R&k<Nm3;t\"(P+Nlu84db$5G2c]")+FT$GLaR71nm$Q5^s,2RS)PJH5rS>JL@i9$`5pDLa_#e -94^"rPMO5C!XI8,tOPZ]Oos,B222&KV#Tj7126]nSkG7X0kpQ8Qo4U&8Wo@>FsHYn.Y'f>0;.[hJi ?e.a1I+9i+ef05EmZHg7Y6q^O;jru*#/l2Qu3$>F0=9-fd/_CH?=CB#uAdok*+b0uo&e,IQJ<0m6KZ BgL=N+><#bJi)cuo[D;G(:*!%\5hk,0pSoD>7L]J'd[!X=9AE(m_F#^1R0&5BL=?nY2*0oT`G-K$,u 6T"4\`",PJ[9tWr-)i#*6!2(^Sd"k_J@fh7\C2"R`+&g&*DoDP-eDVFi9M,.!(eXPUVP+I$8R.:66P q.1-hVMf2`(6Z"SdtW1^J[O9>Q:a$@FCFT@4"T@gT`LLUM:Jrg*8KZ?=XZ_W0[8H;##$j<)##Cnf'M /B:^;A\n1I2\0n)t@Wqa$@ERUk22>W.56/0]C=YJ.GIG#673.ees#-""*Q9!?8(>5leWpAEZ\LJ04g n#QZka00FWn*)SsD0`>WjI_]]i-D^j]LQVWTF@+gDCRZ"`0J^JTckhMi(XZG07Wq->6&Ej5Y74;>*) Q;1!9#XDE#Le<<I_X>[/1'$?nD(eLfYsS.2![(!GBp`+:`d.gM2l#KoFnDL6.(fe1;sI/EjfW73<*^ +=4i-r.(fd&"nd>s.H(<D@XO"*FK;a@@p#6/-VRl>g)-tBoF0A(I&ISOTDE[Tb>+n<?B&=-!k]oI8Q 29"?_sIpX_TnBEt?K2Z7<1KhDIl$VKt\CW\ja"q\`2.r>7nn5@@2Ki57qK(055'[Zu7<I\PYT<oUe! 'q#&mMJp_pt>gE<YFe1't+s8'*(Bt2LQLl!-%l0aU;[A![%Pl)U\V)r:\5N\quA/Eo;SB`\]B6-NRQ jOE1*K>u\<k+qPhfbmVI@$1T:Meu(50nGob0;LjY(g5-T;>]V3D]N(/#.G,8"P.:!I8k^C=!Z;uf6] XJ;&eCNarCT_;(cVTAJ\eQ$+<+I7%iZ65$%RP--kZ?\<.L&U/pr`n;[AdVc34aZ'gPrN)R-JM'a3Gf 8qt%_$O?f6=-IS0G_Hd8O9>Q:a.e\ueL3Zb6kGQU/-ad"68?7h9g\GdP7S4#L$k^&-mSfniN['<h?* bV5a1+:4I)PYFNj4F,e"O#+:CF9[?+B7!;J"YD42UJ6if];L`ep7%4l&:fN28`DN^(a!)1H25#637! <KJ+,TqIB8H;##$j8Q-osOk[!*"kV6$Ne@U`4./2C0Wr.r3$/!$bn+Dlc?[!8mnT`YgE$e%!@`jiN^ Z!,V]?&1H^uod-.o#65/J!+74-J"0-bTFeI'"/Oo:1>m0j64,.IBEm.3Jh/$\IN"9o#s]UE5thKM'] [UJ_#R9L(2d&1\fhP+d4r-28eblc)Ui\1'P7@HZ@H&"Mb*tM`o?Q'N$-kd[NU:%"A&f%9G/9gKSFp7 $kslH[mXKlNuV-BV_NdZ!2#!&!$&b%5eqetSg;Ck#2M.Wi.IZA2"2H/K=7rh+D2-8GS[T<"e<[\67! n?[.g0sCogY@!Vhh@TeDr=JcH'!"PctinF5[_6ihkSoUgF)!NZ#6Sdi2$65$.nZ^_#3iANQcJ0F*!g (/NUK,lrpj:*No,Qj;`V,.3P91KHtGloNU9@+9HR8Sp3*kugXJ<2^_K!PS#_([I;5QTk;7h,fM""H9 '^]k5F'.b>VCV^4ra4c%G/4`K\Ol-\Ii8f)gNQm%U@/0U`_'7mJ(2SMKX:7/)K%-#$$/U1>:4DBVfI Rm/T0"!m&YO(Rd^Wim5i`HCg6_m%g)SpMG4dc\$3D<H6E)`hE_-$Wc$GB,=7B2j^e[ZjJ9"a;,ge,X _[4[&a8r7R_DlDf67BXcN"<,n6HU8g&-^aa!j[(.g/f9p&ISq[,!GujPc\C&8VnTC(uilZ8JsYk/-9 H@O/+*'$<V'kKHtB_C&a1=/D(j\Q')c'4UWJ7?8aR;KgI>T#obi/;*ZZ4'0I4(8BKtFTEFgcN6rYn> oXS)n@JZ-NPJJlUu_L%CEqTh3it^]!"^307Ud*L?jPE>?I19WF@mu@*?ahUO@>e].$Pqc6:;BK!@Gd qV?/:K5phmq$3G_anKbTpV_JOL6)5WrM(M7Ih)1je%Cet6_`T%JI&i*i]j4T-KBSJ["9;-9`FHQ200 *qP^lKce!<CTR\JR!X9*TntOD,O464s8P*>ae,!kraVa8uFYO!Q%P!7S3`(baf?2dN:8n[$sC!:b*0 'Z19OO9>Q:a$>0`,l+&[5W)>&!%\,&Jj_.8!<D)`'Qfpc/W7fM0nRoHAPaqVRn*OGb3bL*(e9L\Ar$ L605/LnnnEct5_'Ok<]-Kf7gC/C',h>f3_0g7Y<)rRGRRAK2=WK>!/+?d$5nrH5+rgBL\.tg!&a:&_ >o6hBhE9F+nu$SIY[R''EC#\1BQOm$tac`lotbI!'kc;"DCGks*<%$V$'Um#64sQ!G.Ao+9Hp/dK!G s!X.LkOU/a#kU&(YaFOkN)UlJurf$J@*Wm6)!DEJ%amE\BN;u5fEr9X)a$>.h+BHJUaas(6;\(S"`7 KtbE#G;#V_K2.O7<:cjLbd!5F.B6!)1Gq@_@4E)$$s-VQnBp)Ui]r(baf?#Cn?J!8,gg&caU+Ru?e< ^3%g1!7-6m'NqRfoDgF-&GJZA+BZ<.3SM-#/R8AO#%:N#1'[4K6-</L;#7@!_:M*d^]@,dh:78Q$95 P5J>S8SAVpNXFhn/(^s.E+kU$I`Da4BB09AFb+ot@;$qUKX)ZVDs_t%iIHiRG7=qD&CK2mEqRNZNH6 4s80*m4q#Q&l+KKZ@!;H,?s?/t^,hno[t0GG!^A)Yc_Te2I8=*s\SaTG_;3"<8Q&Bo4q)51)87,ge- :0odMcM#]?QSV]TQ9QL4;5R!6MT*B,5<WrO!P*2Ll_#f5(jl$ki;aM)s&0:oSg61NHSt#hRfV]<&LZ 6Y0*-;\?`]$mNm-mLGi%bM.*ue4hbJd2Rm)[9OJ_cuG$uHX.c"0G-U`c<JAFfp,^`(!%q*^A,\'OeM .L!X%PbnH'V1ApABda"naU'(2a8r8=V9m2V"XcQt6<Fk(,8HkFIsr<pZ"WcHa;U[?GRO^7__?-N('p "Z'?[3b*WlH-7Zg@M$jo2G2C0X)oO\[6l0f:X(iF+#DpDPXJ.$m49p7I8&]A418^je!;DVpcU1Hqn, W>gC&f;_oHj0T`[QqYGimT1P>QC8oAMi@f7e6^Lj,O-#Clgj.2V!&6Z-H1B^j.aFR-1A%*TNd^Jh/$ FE=u9kippfB+DCe6101+Ta8d3n9n=]@FKa%aWKnR@"i(8n*?d[$`>+8d70:Z.9KF+Z&caU+j.Gjn/0 It6%J`baZ+,0",7*#LJ.R_/rre796W=F*f<Vo6)C*>TjW#+<Ye[_V(L807L'n%lpomU=AaBP-p`1!7 n0<!Fg?PV7!42c\64;4K#=X_E$PEoa"Gt-7E.iR+N?Y(DJ]IgH-fi[,N$)UV";!G@&``rQd=Oag0L7 +o&909JeYb,2!$SpF!PhLq-E:WWE+K^`Fhf'$'(cM>!6Laa!"A$e&lL!Z9ZZVlkmutZ+GtDOGD#t0< :+$*kR$)i!(1.D<WU$frAbu$`:dJW6jj"JEt^,*TSZS==g42?.qc]rPXD&H$Ub^m3`R\cHOrn,e6`d \%8dc-d"d5,d*=u4T0q[(QOH5d$_U`C(b=Qhibo,36X1"l>T+G0WW8&A$umkLEbSp_3!))10Z:@!b, 'Zo+pYmap?=9L[/e@GJ[&Yf^]F/n0Z:@!b,'ZoU'%K$4oiiaG9$\15g*C]BE;q9Pm,!_*0ijQ@]WgS =):C2Z#D:FEbRcoi*gnS7)63d;a;FVQ'@N[/Mfh,W@Jq_L-IL'[EOm;J40YV.HjAM%??MN$K^$7Zs` hB1RD#YJ,sOQ@GQJs=UhV<lZsiUQG>2m[/e@G!>p=h6m:7RaAFB#.I@1J4:"c;Ipm%6/d9D0&;HYo8 ?Y@B[?r?Sb05r'7*I!D&LXbMT%hfT<<o`H`SB<qq>pju!*'UU/ehG-*g&+[(V'Po90baU/LZ^2!7Nh 38Wnjj:EGfoGc#d`&*-W/;#mA2Xsd8"BV6ER"%!X6Z8S3Qo[UHO&+E^&N5eGB]0hWE#8.OnQ4[ahP[ 9@0)CN<L)K7AS!\$)FoW;ih'iT>.!=\cIrXK3*!'kc;"EXWT9`a0V$:t4_GRO^s!+h,jE"34HoZGm, !gj";\[<h[Z3&`hj,-3r!GWbsA-N=k#XLVhB*Bt-kCmJ@/`^;3Q[THe!57;NBHUh*]#ID@&"EaA$5F *s[6[YC6?!ErQU2;b0HCsjnH-FH!6>3C5VaK.!<CTR\JR!X9/iCA&:sR+pD(M_GD#rO5j>[;nl_\s! Z;uf6]]#uBMWIKk^`)dWcTm\&c_nNlPf')!##J\@V3f]&KZj"@b'SF'q>@uf!n]jn6,5<*2J'6=M'< Ve.0&h\l.po01c5=+[$[@X"e@P5+'@.6a?_Z:_3%u!K:($E%IND`]\I`eD58_\5a&uk4c[(3c<=IUU `P7(G-'\_)p!rWX&75\5a&uk4aCN0Q,8?UU`N!'WRFVdAJ-oN;tcW9Df=5"!%AX:_33R*<9n@%ff.) _)ZI[i*?a_^I!&8ZMF2Y!"2=)BfIP$(Jk+=!0WurU]\iYKT?\7"";`$cj!o4W<7/b.DQ"J65iT+c34 m^/V#+F#O)4UY%k'@$\Nc`%]BWt^prJ9N99@iCe+a)#&fh2?iqMOeGob\"&OGP<\ZT>24_'ql-o_>! I^9JjM^8PT9jl>%Y.Tb;WfPU!<B@/=qq1u9>(g%cjn+uR>(a6EuY1H7i.g6m9]'DR>$JFmT[Lhn72E $lG0p+%RfH2qM[spD$BA.D#anSPC1qC3!\]?$5W$fT+"gAA>KiZZ!#+WmAM[0!hj%s1,Du8!u;"nE/ \"8<aQt8V?E!r+J<,I*kqma0OP&&PsWi/<F:QU@@&`*<s8[A#XC%W"<>4F.04MjYe`HKF*@VgJNNoT FT@Qa5HkXq>OK9Q64/ZUn\AgE%pZPPnn=U@BcM-`-K^)4%QE341N'$lVimE@8U_-RV.W%#MR9;%f3n m!!0bTVb@Rn!UnAlZ2C9CFJ6LV?,ZAi0*=sT:@Xb7#-juOGM.OUC%]*7e\AehoM?Y&ZLd2<m"at/iH ,\:h?,`]BEqS4feY`Fg!D!;"&]A4ml8,JEfb>]1Fgj&L[6PjJ5q.CM(BC0p)-m6$!fD;QRqPfZ3qMY P)-r-8Q0Yi,</Na.3Z+fn.@9$6'G%&Do:X-#&)Mq=_14rS]O%`.<$W&[H_3PpYRksX^J"lOOE:J]9F &@Ni)^pb#N1_`!<!!)OE#(:)it9NO(\MQSH^c1A,qBP"u-'Zr&k)WJ,ocu(r0s>!=TJUJ4>+kJ0l'4 !-SBZlB)AVTZ+q]'0sr(!=TJPJ7p\=KFJPZ!n=$)@/uYtn>sRn@i2g$!@/s(5Y`L(V!=UE"Q7Ej!6@ b8E0*HfX9N1I$Tb!rW>dLAQ:qiTi;`nk%1p<Lo"fYU*5).;!$Dd^5VaRQM[e/a]AWa#lhs0Q;"QUFW otPR!:1s?5`!2U,VojZ/&M?t*"7AG7.,?d<t!-c!:2lXhpjL]/-*o:!`1X`V2CkRZ2cj>$NMjPnGu& !b/!=o$)R$l'"7Oc%0;<,>S&SE#_3PB!,s34.+k2R*^Bs\.jKT[FNMEREra"gotph"`uG)>9_4T58: TYq55I&i.gCM5AcONt/VsLI3&J94PI]Zhs%H4pr)`po9fQDZ?odU<59g)7!OeXBK2mX.h?qg9"Qh2l 9gceuTWO>a!YFSu"G..`?m)4$#Z&F'!3cKd<)!HsJtds+#79/71n;-r05r[2To#b-U^%K0!,\Yb1BG !M'7`Ng]WW_;_Ha[H"@!A]9%!\^/)9"3_J51/MB;Z$!'EIP5iT$AWUC"A!Q^N?!5&m/7KD@A)rM%tR ,B\WqcWEii&E%!1c*@o#UR<pdXg3SY`)*3m5>D3f\5@8ge9rs0%fQ;,ldmI0JkJp8d"ifs+$mdDZnW K"/Lo`r3-1f,Rcq91;g!mkFV@^!#QXZr(1Xg4TN=EYjN+1,nGN@EWN6O(k>&,!T8&:JCT;R$o8_chg baG%N.P0O9+u!)$';n!GE`!5f_4P,Rth[s3Le>-<ARt&Bm6:.6P^+!RNP8^u7NZ85C1T<JILJ?URbl U&SBuU9hCn!74JO=?t<!.Lk:Krs+(BJP(Rf0EBT52:M:)&FE/":AcC)<Xdq.1C=H6%Z@!SQ\OKS'S* VYjm2tA_^:R`Xshl="i0H#]pfH0eMQ&gZ,6PA!Br":J6?oV(]][)*;;685R5(NErbi]&X]g(Kn0\;D t0%l*$e_eEiS?Z9FCj+&sB&;<sqdT!#/5>Ze2J_5letu";(N&!$$gu@$*t[IDZ37QV[ZAh$&n)Ua[E '!<tGA,TD8&_?#VcWlaC@\I2+H!!$%#PU&7!:m*kA!#g[tJ?2iQY07&GQs9WV!s\6QF9$0YrhV^c:X `5o-309J<":&W]+G%\6NJl'+9:g?!aogi!*O!W<338O,f9cCO\>c$aomfh/=;a8[o*5L.t>1mrf:"Y #ET,Ia)`LA!$btSbWh1M:_LuW!11n5!!$:)8lGrPK4P&,ap*qhC]GHs"q]!p!6,3Jd$&DKA4[$QO*C Z(beJcfn*i*)%H[YD#S+Wn\iNXfGKK.bKGad[!sVR^A,tbL"sB4F!8@g+,+;87`ZH7S!'n4l)8):KP Y;Y(5nX24mr89@P<1#ilq[[JpNh4nK*(O#jJEpu#CnpV1T?#.CQt=me*-r'P=,C/=9QF@I-rRK!)Pg 1!+a1QE4d\q&qKi]LXn5VbQC+sEAJL^S0-lm1Q^#lhiDjZ)-SM2`c^f(,D)*$,S9a6b8>jhVCVT.`6 J3*(BAPDjW#N_5[2Y;O<km^o>:Sc]A1X*J,q@%ZZ?,Ncr:0`Gm[@L8GCIIDf["6'L@Ben]u8tCk28l 83@M6`)i'*X>Pcd?/M7Io$W1&Cm.^.N!(Er$$R#[]o'/I85`as26d5o%W0HDB1Pl5?UYm;er4d\TV* r`eGAp-*GQ[87kYPbU!WkWB15Z`^_OVA7.cG5-5$li6nq?a'(`::@F1ec`.SC^h'bo2]q9&<Q2j>_# b\jN3,&OEgu0Okf7`9:71]LS>>=^b.Q0+&Rg0""cauk'nPat<4OuI2#$_gQ5QDO"32pEQ'HuK&1;a5 ,+cPY%Oe$*:a]J.:KL/&!FqU7g-m_6>E0itlmfrCq29cl0d(BR=0/]rdN)Jp/&rcV*&I#CpP6;EB<` BM#8I3Z4"V1&i`&6Ll&$`M;&cQ^2\c;gITIQ"k#@LEI9h=cETOrkGSpFEo'o'YB+@U*+4Uks77F_r6 "G7UU'D8p$=J8^P:jrj$JO9i(J5(q_89GY@":igHHkK2S0EG8MVc8=-@FhXr>/YN;c/3%n7?<nfV)M gOmRsm#W>C19a%;ODmKFbB8>m:W":,P@^]6%g=l_hf&naoW'b^FAKS1MB>.bF4YHh.+DE'cg$K]M7A MfESJO3YBD%2Oei&/6c6lA7gIAr9\Vsdrf(=@19;aeS::?n2RV;`%=P__]d83"Ki):7@/D)0?bECKY !L?bA.98!G;>YT9.-o<DJHL]d+2X8L%r2LD&L4o588T5:G?>&DuL(uki-S\-AW48B)"fgjdEmt3Q5] IELbmuO!EUuW7-FKVg&^`Ck,N0%EA3bpV\&gJ]HiS:`-r=^ojt#-k'@U+Zqbk)+"3h=,6<t63'H;c% MDd@,R/0'^0*b6U&OcRp5QrO_9!eWu01Q+FW55G:BerfV11$M=&_@:b:nAGbh[l`WKP%")gaB[d'X? 5:'ct=A6-X1'l3onlV:B(B06GUt&/5,[(XP();.Bc+p)5'f+)7?j6ug!H`?X@+],.G8oufo$&P#8#j \*N.bJdoMl!mT-":d0=!&gH;/AYcEGo<iBK0n[1Q:1g39T0!:6l%MSFqR!'!fZpJ&>-lZAOWCO<.l@ Ps8I$L;ujm,=hfc2$1L2?:n5I,o0^`!gjFElU@o-Uc!lgX?h=>;)=0dg'0(OQ5a54`)6eoai^c&H"< #SFltnN&.1m1X<%UA1_9nSL2#o"t]c9"G71_><.5n'Y+b9m1!.]_L`C]=/Tp-JrL5d&#]j@uU%\k%1 r<8BQ]>P#GJ"&FgmYMCk`IR]#6K<V,^'+\U;Dih%Kk,?KQR^_15(X#iiHKhdJNn)aLe6F*6P+jfdu] +V6.AM1IY&R%&)78!J2Z>,'FO%/aM2To,#,Rl4<USg!)^WKJf(tg:o+5LFQFOZ%PY(mRNd8?_A,ZaK >Qt)!"f.qL7dBK2uskF(Dn@3G2(MODuomeo7+78&==Lb!@4=e0Zi?U9$m5</NA["TOg))i%).mK,>a 1_EX,dZ:q3P/&35]"*6a/TFPKeX$/'MQ4]nXCe8$"WA1CqR@hXCH=L&K!7]gNH`h.Y[RSLIM@F1\T2 2kOZO6bt]Hr,Pf+Dhmb\/K4Q@L^CZeJ[s7/3a?l,9[9JHs+2k?qeOgW9V\TJ`j("6-`h@hBJUJk"So :p5N[oiXh"'cU'p:!a^Nfa2%W]EVq4$Tt%mF\B[nJ4B@6=;5bM:"X<p6k*!bckk0r$,eun"Rj-R,#c rgHu_V/;RHfN%#%mo.ti:j72Z,d*0gSU"Tq!qbAda([;<lt$k0r*-4^3r;FLegi./T];!\o'QG@!H$ o\T$;)9I5&K8UQIL)fA%%p3G31rN.$>!,^V4]8#AW:hVSgnmq5#A0[0o9"pYpghF3%,F_,uF\m$:eW DGXRc]V._Ki=Z_6(dpM]9R^"Spa2.qkTM-I_J1A7jJFWu"!7UJ$0r4Rm/d;e>-*']*'#%4!_Og9q"u C3tMTB9IoPM]Rhk\7s(P!K#>Z)[Gr(&NW^^hQ!)t8@Z$QHk`j0?;^9HR1G;-6)pBWotk@/O]O"XR4\ /&[%f\q.S54='uQ2)YgHQigY,'As92ZXu3]E/JX'eqQ[O0mC76_#"]D^]Q&G+<Wm8`p>NG<$YQIO0L Dj^"/!1bM?lc;m(Lg7<q7Z*0gSU"Tq!qbHZH8[;<lt$k0r*-4^3r;FLegi.-=r+O&C;8*h\C)_mI_# <RnU'a^0+ENi,'+AIABM$8-(Ujp[P\Ppq`H.LYVDOgf?cF?a9SG+C5VNdEBdt%;#EA/X>^nidd+B>] I=oMiZr3q8<clo=g^rNA3,:!7O&`mc+B/-H9/o07u$I;Df1n5s'KM3*$"\MKG8VRun[d='FF''(MJZ =PPF#dV;,lt=R!,O$)$)#[&XFVfl8);$h?te#Vh[sZi@A)&!1fHD*W3XYJ[1:UP^N0jK"N,ili0P1, /=<IlrWiLB_Z18,o5Q$!2I-sRFH%E'_gsZSF(!*(!6@pd]+W\s*=t#/!._EYCe]ONW.4&=U,+b"kKf i\HiR!MQNTB8e%d5K1H=#2hnn]5[1'JZ"P,>:h6#TlKtOE0;c:eT17ZInH7NeZ#J`<M6HfI;!$6Xk+ `7[,@j+HhqG.5GSEj5bPC/uF8eNgh$9/S`3sZG79C.uA#j6;0TH<G%*p`R3(+)u7<-*.JPL<LY9,&, T"UBQZ-kZ>G.4bJg!rra7iD_T]C^'\9anuo2Lct(W!mU]FaGg;k]&XhF5W[m):]R2edF?,P.s-<G_? L8rXM>>u"T6UXX2eTS`.ub&-QO;/!V%<mO<OtD.Dc*N"f)FGBSt_UV$ID.c@;F1!\(tf5RaFopKi`m !)NbN&f?]LfE44Ym(.YjX:k&(YRd6)3'cb<&!/I$H28/2eOMj,4n&a5L'%c)n/U'_U[?gdDQh:::Ze +1GHPZ&]^7H;K5&O5n-5O<8B]g\C$5PrM`j>>GihSCqU1W*#WqC$M]CpeLd<qN+#3ig5jDehO>#I9q @\\9Y<T0Q!%$_NIr3SA\tfJ9^fIZMS,lg/MZa7F#55jX1:s\r1[AZN("rcNMg(c,KORZ-It-6;#PJ. ^F;q([<.GD3D^u-@^n<pqE<43J2M*%En,7+<XX(+PK)uWQ"t0`0#_#nHGd&-fP)p+]$:Ksq]/]kVB* $tn#:TYGd/r57bc^9`bUO3C"oH)_cm8DAs#l_%&jJ(t5a_Z`U^.>n1d,^e$En;Ei'/,)F9"pD%h/AB <jj.^S,jQ@C`j8DR0_liZtJ)r>JWM=Cnr]S^nhYF>Ugr5.eKW$#P,YT6ipm(QOdp%AQ]r`,:S^kfE3 B#<Orq3"!REVa`!au1,YVA"f."_J2XVHliSF*+HS'&!5_!d^^?lp1#H$9%t(UR__M3GE.n>niU&+@7 EpoWODUqTagaLl/3uUO,A]%uCrGKZ7V!$[!T65%":Zd[r@gRB&!.&(^dMM+n46H7O5sd:6W/f&'GQf $eY8n4pK*8!_3=NC3_B0o!+>pkqb.VE;"`iL.7+)4BH3E"i-RlND?^11b./q+#55i5YRat[?b7e4%^ %MZ5Z))'/0\']<j3*nd@UL^TW08/Q(khQB1_)@oh0.6g]b%MqDGTO`*:&AE!Ge3:Q#NP^3Ji*9.0um 3/]UGBk>.F6FWWn-DG2Pi,&J0%np:NfYH`8.YM$B5&^_i!)JLZ9>5Z6kt<E/.+k`tm/dYAh1c)a0<e 9uXoSMe0R4B9VuU&39l1(2!0n`CFYB./'h]-D5)s)VA.R&-#_3s]`DQhHk*gEH])uq9.,HHkNrfQ%? k4B@ER;6"FpL`+nj2LpEZ'iR\,ZPC"/8))!&<1/fmu9d#)(X+_Lq8+1?=5#5-Pdg"34@G!2cChrd\q j"98dX^n=LPp]EVEL,(:U"$8%Co6$E$epsRX&*O+X3>$;3!$UN\51#t?"n.[*1O6NukD)7JTYgs%e, jqWSfdeoK+8\cr)bmN!#5;4qETZC(I\0e_#bO3!=H;$WgN\nr;M40TR`u"Ya%F\%oaMIJ34qU2#N). `T7Wo""pF8;'oHDbQ4g/&(gtl^e/m$kQ;:jXUl!#Qfj,fn0t(3/gVO9]FFr7^r7J(qu[+8IqSgA+]_ Dg@K8+CLU]OP($l#ieUj_;!Wo$W!ItMn"oH(iFZ[G@.=rC<.@Q0ZUprYn`1D9A:lk[U"-oUk84e[H< .Mi-%_c7o#nat7+6(-L?G`3W"T-!r+XA33<f2u,`0=O#^jg,:\VP>!qDGTO`!lGbXq1=*p4/KpD9)h 0olD5d:eNBOo[,<c<\e7Y&X@iKecs%u%;Z4FJ?@c)Ul,%eOaPaNS,)#JDuhWn5/08=ARuhOJCG)Ka9 )o:Y#GBLL)/7SoHTe$mhK[.AQ]r`,@KRcW<-;?54HC7$q103^_II^fB5j)75=sd5lpI,q@=c8"[WfK =VQEMYSHL,<(aR(Wg!Ki&JG^JWX%oV[c%^d!Lk<caX`M:B#)eo.^bMgLGY/(act2n&IpOMQ'Y;-L_7 0"@";F/%fTS`L-0Dkbc^9`bUO3;)tlP[bE*h*qS6.9%uen1@Mql?0]d_jX9(\6$t]K,IYdHs6,<`?" F*@/5U`%;\-$AoK9'F28u$Yn?j;_1.7&9FB2VEpL\CKfRJZGQjG4DY",4g$:]REq>JWKW7XGQi5T*8 r@+9T^!O)o)M-hMa0GbE'hr:d-j<Fg)^^$o"!"<+@!H8#I$:enjnd)n:[hTeV&*sDO'm.016:J@L^] 9q/S2u3B5QDY!Pjo%K,1ut,f+!(ZRK:,&>I[B^jG16/YSHL,A$l84"I.:;^jFR4>7<V+8ecA6+;M[V TFRbB!rrL4?3ZEa5U^o9B`hSU5(F`^QA4DXmU7l<T6\_l_PdPtkN=]hIp"(a4hsGm!r/OW'eR6+p-@ fN#Y#7J!#RsC36ki2Zih?#".8*m(cAApJ')h?%u=<^Nt;js%ZWNaG%D1h.K[D^1'"u<W!.UK%Nl"FV &dK,KJ<FV3e/2`QH6dRO<(h5+-?ei*INbkJcWZK+6*+s8n8G8N_R;La9JRD.$6V'3*$#c()pYc+p@e YL$;bN\6ML9Y\#$`HG[Zn6M;Oq,D5f[kDUpM4J6`s"&RDGO<$TFTKm[.%tF]:@`=uMlj/npW[N<NjG 16/YSHL,o>-G`!9=05_N%FmVuk_&_RXUueN6(u?s:.!iMN_bV2>;7^Gu^269L)n>qs^UOp=FK-NjS[ -V)D]0]\#!5-Pdg"1H(eRjp=Y4+[Lk/CM%DOA)lp=P#c9&F`Z5"ag=I&jJJY:=A]b)_/$_ac9=LRYu $KJe9R,f9(Pi70G%fVamRs0"+o)!"9Dip",=Upcns2-j00I^]utg+cA_h4OVlWM?+h5dC;@ILSVZdN stY3XWrjeo[R!8&!0mt_*27u40_WKqP\CMI-)YL63F#)he_GDPc$0,5T*OY=;b[Jr.be3#MDXDA.5Z ,EH^K5Pc$0V7a61WT[sTDUf&N?Mp\T]SO/qPLd6m&!5Jl5!+1N_O>_:&#bV6h!GXlraC'JZe)dFY0S c3HiugVi</M+HB0KU-M@HoTL%[a85LUh7+uKcjJcS[UUl#.;B&$Kt0UF)Y).`=A#(V,Dhm*N*`mRCi )Z]!n9Iise"[A*bR!$^-e)dFY0Sc3H,GRM9)Z[m[-Y28g!L4j]q3b$FQX[l!H(k2F_?$kB\4@(HN_o W_$C)ffq3b$FQX[iPG4M>$#Nm7--3ZVq_3f@'Qs43Rfl^VYF-,/P1O`Z=<MNB$W1>s/L$X!^N-ci&c itI5Efg_B)>+>$OMR<,cIp\.V+=R:*WD/G\OV5\dE@/g6+\7YfVOrWlNWUu#EtB+R%O1rGptYq@HW/ D&4A/^C.Bu"aoRbOi/s6XR%O1rGptYq@HW/D&4A/^C.Bu"5*EUr&!S/3ZFNN0n,mOMEKIpP(88^HjM g'bZm)Z'?Hcf+juMHkV/q)l,;_X3JK+[6`r"2A\,m\h.Zta^!ib8"nHuWI75eSu@".5uj$okdIU46U 5L=s$!6iI[dYb[=]ZA(^$@i/[5Rr'Z[.gqQei@A=QYm!YTGQpaT@X@n%s/p!!4240Zm)_>#I00%!ap O/O@*=oYlJO1FjA[hV4.Ks'?3)rk;>Tt"!,G`^hgY:X[k"YMd.7,!#XW$Zm)`i#e_1e),Rbh9HX#qX b\J]6ME`_7ZjfiGuU[W*RJoRd\YD^V/u'\cU_"J!a7md8Gp_/_hd^,4(LFc!K5Tp6=9"JKZ78Y!%7s 963tJ*_h^U0!s%=*\&u]\`!9uUUK>q7$G%+FXT*#%btlqe"L.,r.cLN9!Wh5$)<m#Fa$9XKqCpq0<" 9DRplMqVUscj$e,TUs%7&=m!2q4R^]lX+.s_W'qm-8:I1*hbZ2cj0Fq6jfQRDh=O90Cn/Ucc=HJ<1> \QJ;pP4Bk/S*o6C!#QXZJGs0]5bX%Pft<)4\fSaaOuqJ,3A:07aUA10:RIo94?uNVpdGHT&8GTE&;( ^G2X#/m0pDgMXQ[;R'+7C4d4g8g#bD,+l9>\PN/RdVOH=HHe);)e+97Z/!WW3D!3:b&>7b=@#_;)Wp U(pGK*!aApEU25`mFeY%h?DMirCY")MnR3aKVIL6cmhnGm"-""(6aE!8tc-P.-5TNf59uU(i"e^g[? G">^WTL_'Ri5;gS9W1)Z0]:f$7!V@ZNJ7p,-(_@=qVRNsl@E#i\+oqg&&jY=s!Q5H]^sEQ9]TXlD:I 5(a%gToKe;pn1,3\gNJY&YYM=J9RU^drdrcb=-K'#Z.+>cLe5*uK2Rn*OgfIiW53$bY@*qPFh!:#1R mh%er&:d2)!K7O&^a1c;YT"6@>=&@T9G9\i0EDRk'*(cd!Ot>rW9"LPIHl*:ofrP:%ho$?5QRf1'L5 G\!Mg2>5lIopY4+lP0g_.&AY"lkU,3RsQcoNh_-]FPcd/DKAkrqfq(r3?:*%1K7>41Ba@ZG/56Lu.N 6&+X:dA>p0Ose2$G2At_uH>>09_-`LUKlN=TRI0Bn&?G0QXI*IUGP=1$*;!6`C<&b-:2h?APfcj<R@ #'RGot1(=5ad/Z9Z%=n?9!8J%o^a8"@3$\u!8HJoH1(\uH!W`EL&:dm"`('eI8Hb]K,QN)5!jFJW11 ")`i&hIHGDW-i#9$=>Jk&]=bU/;+P=q/u%C"TkeMO(QKZk_e!"<f*]>[;13@#&a6dbs":XP1mOHVd, )pe\kaufZP#m;B>5QFh&#DpL)-jlndU5&)f[o`bUP=,Du:B]V)70(5a"AkIV!"OhgYW>;Tf8g&BO[o J1aTTtS9E;-XoeQUg,SNHCn.Mhl!0EB(10RBd5QqZ5["1pRZ3%^h%c^=g1c=;>O<2%(!/qF!!*Kr9H NYD^^U@$fc2IgujFLd:W_(6TP1!#C:]k)K9rA!,X<IWQ?riHk!.Z5DSl6-?1F*LtW!6Ta&Om[je`92 8#`=QS)U6VT\[0qMPW/XCi:&Y0RjIUBo`mAp])Yq7ON]*QaGL'Q2OI9K:=u5F(Bf3r!`8M8:HBUnB> C.8#77W5$K`ZR!Y!tPk^9L%c3HY^m>;tUciE!N*<Xl%\W779J?fVKBaE]32`$'i:'Up_>QCQnk>UkK !":[We+'gJ]^T;2=+UFN\rCFp^l7Pcpuhbkk3Pl(M$%.g5k$"lk\'gER+=jsQTW2oWQa(34\u-F?n, ZK"Jl)q"d[<X0s[b1TS'eg@RDH/b/bh=5fs317(]dH!.YN;;XJBqQI?XI"Uu$>Vk+V10]Ljd18o(Z: a8UEW!mENYMFj7#MpO[;/B`/NTR94\.q;h/4#ro'S$<;hq2^'HgmP+^nGKd_1D>N[D*,bA$=\g&g#" 54Jrp5W#B60dhbl?7*4R[C_D'Z=b3GF'\f!OU\QAPfkF!c!=KQcE'[>.$PV,F$Sb)[&hS';5toW`I0 B@M$4@O!0+.d^gbh,1@.QquG[lG*O]i;0XFr)9:Lk/372aJ/i,d=7%UfWqW[_s7+\W;h@tdgC=qD@S 9cl\#QGUMWoufZm'GZWoP?JM2ZqVW.r`[0#YT6U%).PRh'QHS_'5S@t0qHuo;?SPCduY5`5c^p_o"V PZO_9X+:f>4LF\K#:1^.1&YRM9$>TV7lg(>U7!l^^)BW\9b/D''bk?&]9<a<C8bm+DI(rC<AY'Q,I& RiZOqpZ<:H_(0uT@jft)CNAG\Io`J*!+6$C#dI6lMo.BG!lqDe;6$MHtUH"Uc38r/AJ$@2j:9A91;q tMN'%i91T`)%4XZ:JeH#n3M/\W'ZBT'Y:NN_)MJVH7J+:tbp0ItoY@IVNd"%((XQ:hbWtR18jj2kWo A8("U!j]ckNMa7_r(A_P!n9S4P[RY!`Yf=qD@S9cl\#QGUMWoufZm'GZWoP?JM2ZqVW.rmn#BKd!.b EYo8T3NjtOWm&]m+f,bc]?KNOi>b^<7$6b@*3&H3F7V[gC!8@?crk`3%-f>th<5J#!.?S`Ti$:(L3# a[_+!Vj$s2e4ZiqjtWEqOiE/+[X>o#WRFCqD1!VB,Xd+E+m]6o/WV9Qm2YH"VX'+tIQ*\dU\(Yt'N_ *D/<Q39TQ79!)UKd-HHoY@K,E^/KA'f+;:X$O_)b5HiL<le*f"</XfTFq]u,r)H<_/fSbECk\\>tmT %:geF;6qECA,P-ak,pBS)_QQ6jU\WIR(Hmi%8[oRX!"<j=J?$4T%ZJUZ;O)pV[KY8>6%g"NZ%3OSC0 STN_@]1i+-B&Z(?^&XAPcX3Q`>g5<;7&N'P)4/-W*AC;;k%+;&mCcTN#;rcGV`H/-SkgKHgL&ln[@$ $^&<FA2T&7]2Y#,?d0\S<\QI56lBsg@o5Zo&j\sjWJ?1;Y:T4C#uj^jhXIJ6KR4lA.2CD%-`g%0o8^ MiA>kB`.7BTXfP<Ei`-mh<=K4ss0d/jd^.UmiZWDt!]**=fbcuF5YW;1).nbVsGa^s4^T+;Fj%AAk1 @QGAefup)%J6]rg(DjgRd/K]'mE@mdAkn4e,48OSQW^-`0P.5j:Ssk)XLF:&pa[.+\QK`pVH?86a[Q D`,E!A=AY_+M)s8G^1)dc+\\+$GT2X[:*;MnI@UU8-kq,i><u*@B3)qjnC8'b%c/Slf3Asr<.];Ock cL3')]s<WB,\WZ-pu51^*XOq<k0ZG4$;;Zk-e`/6pZjW$N-^+\^esMoBr26tI')"W0[-BG7"Q#rU3? cXMStOfJsOl-1<oVT(IR`("aGdLbL.[!Ddnc[gO8:]d0X5#'1!kS-'?:(2*M<I9EpTi:.h3e^>&;s4 oVKoV6.#m*5C%Loe:+9:fE9R%?&"7q?P5tga%IUPRQ9m$GD8s^S0N*C!3;$@4ZR%O1rGptYq@HUcI6 A)J^e/+cdp6P4K(k<!9!+8Ec%M+M&<]+=0@".7eje^T`LRi(o#S"Kh;dTM0/gc2O\3L;G$iU7s5c)P 0Icf**6LYKK`B*2F2*ur!a4(ou@J6#U!#U4oF9&usK%V[P5R(`L3G2-SNZq`0F+.F?2#)AjI/t=tUB h(^!jH2?!#rQQDY^f=%ufZ=^b[`-FTD=35HkZW>Pl3L%M(ZH4d]-k?p;W:591V`klY:j_d!h5+S\h7 E!6LISaZ02!76iQ#j+*Z(^;0N>9G$d8/bE!J0LKe/hB=#C,_J#",$ChbPlTod%q8#SIT^40S84U!C. DC!-Gs$56=)?NZanQS.QQn#]5-?oHS'D.05=a#``,_p8N]VkQ=26PTj+a<[Grr6P7rQ9Va'J05+!)6 0VbWQiX6764dn(8dKu3ct3:cc+d#F&tfKNJY)@";FDOV-1Do,"(=*nO8qfn#XDdL/<H&$6)]2]+U%W A,q1GlhNc9o'l'@5#_>14(tr<Mj,]ujV$&3`Weh:?g8>QMTFXk^T>Qg`&]b'PJ_BVQU>$NM`3FA.\+ q^EYRat_-NZUW*!ma<7X/bY9<Y(#g>E'U&=?LpfY@VqUXgD!LtrF!hs/`XbZpJY"2ccq>]W^ap,QL_ Vl$JZC)6&":se;74E#N(+=V&R<a"UU4^D5r%<L0I(5tqkDej&8b+,2l;TrN4a0IoM)0@`@F-,/P1Tl eC==SFidue.]V2T>k8TR0!TF@J6o5YV)*sr"BXf1nqAY!o9FD5_Pb[K[;TU<U1Xeh^>F,F-n0n]9Ab PlTod+**[6#Pl3\3BV+anG*t7ueaZ1;9G/blnE(14XPlb?8Y\abP[UHre.]E@MDj-:M;QS-HIRLPp% ?<.BW9!*!DFP,h";'pWdm?s0HbP$5!U]Zk5PF?+?B9/UU`Sh,DZG12R8DE^^/SC)*Zua"B0K@R) MgV'?_)#^4$(&s%F&_q$9j7IJY#J"56XE:c]EnAq3T^-ETF)#It"!$=-g]T[<W&j=(+6\4o*kP%S0S /<H'i(8',rBq-\Gia'*R>JrDd.!2F][[6^_,ABiO'l9NR?pqko!$VqY?-o\Vn8EI0D[Tq?4t;6W8H; +NV1i\n16kZ.$9un7S.lfpEtH]@.B8Re6"6cG8HWSp>7e*ob&U>igC;\7LeEPH+sYQ)5i,B=p]^sZ4 YVMAfuQJ]?qZ#9+)fHp!?D+q8LW^G"<.#O6F]`e)gDtGjWjD,4f`hpN0n(KYs]9-=9G=]GU5iB.hP; /C?#YRcA3nb7S?-X_8A!b^$6tdF\h,'I^ibQQ2hX"a*((b1m\?Sm//+i8%XHO@aYMd!11n0TUH8h1< BMM2o.^B?24%Ji@tOe.q8Q]%gKgm!]:^@%sMg;1o,\'e'=^F4DP05!MG3SJ0bj0+>iC1MI9&DP:Z)h QXKB6Xb>>#dr:M,?VNo_76?W?I7)HC0j&"7PK+6&&-*RQ!Uu-]!!c=QMh=0Dd*htk5IF2sKE8:XRO` kdo$EO>!)-:X1TM?e'a%NH!$"8TI5d>jI1C"5&*T,ac&6XCnh[C&W=7i=!%@3:8KmOWe:7`GYtO2C5 JnG[maE$R`%I==]@@G]8Ff%DV+g($^XhlIEG$d\ZhD6]O1YUgr;oi3Rs!39oY<`A0JQ):A5:+?)@"D _H8+_:<n+m?"GDt9+MkF(Y-0[(!V;./OD)<Llt`G20)CKH&O&G`!:&/Z)D-%"8"XTc&>\J//cZ!j$[ >[I5:LW2i;tnl<u_Y0OoSA`>>*h$pi8&"&%2\jJ05tV"orK?+JB1+P;mPDaT1*C9n8"j=-&Qo86*Ta dfZ">03KiY6D##k(n0O9R9)%u'C19b$jAo:0]M^ik1*,a`)RCP#lp%hg:n.03;rmXP$M@?p]sC\J$3 h[0r^nS)`[7o1'e*B'eo]*R$7XQfHJk]1h_[I8Fri__uR/Q;@3P7LKsj"6"hYnCPIuP[bqZ20YB4dn 4Qse'pb<L,HLo`&r:"g1ZYR%47Em_"7H6AjUP*W+uaGqL8>A([m]![2DCa.)D-#8,%T(fU`M@MKSFg B%WG_A!-KQ-o>YWLl6(,*fD\#JT'FB;cn2r@*6B@3)4fk"kc^hph$"gh*t?i$FFK0P[5&<O&*O+8O[ !4aX9<9g0O"c-+27OGZ,7?Al_Zo)0sUrZ<Nklo!E]8N5/:Br!592GjU]uG]Tn2C'C>i4,Zb6OptYmt oXYln+<G#0Xi;gs[6KWi]b7L2LG++*m'%EV$(5&Qac\0AE.4_f&r/@VA1Is<dXA/K,RSe5(RZ-o$9t V\@![3!qMXqg%s/pY!5e7=rrYFb*:O%i+(/[dJqpH;5X<$E&'+hQQ;k8q:f[K[0H>\C"!rXc?lNcZG 1SD&/)h\28-kq"KN3X>-W*e:"6P+jJ6%L,DdO&0%1nk>Q!2.-OW]_c$fVYH!W)fk!G7'/k.mhA!eeT Z5Y9oFQik`dM?*j)$HID^@1FP)l9N<A%>9rE!4K-j5XDF3oAG7/)f%eJct*pi@]Z6MJp[b';37n*Yb *c?W83'HMKluSR2KocS4CIn.'t+@K)X1<F<EdJ_XS9="#9irn,nXK\cI=-V!KT7E@Blrq>O'Fh1ahQ #5]Q2nc>9#gi]=;Jda)!2p@GrT!rSaO-I3sj5S7*6ko#*"p1tu"b6X*/2O(MnO6\+gCtJ*T5@[E&.: T0V2,-p![o";$FPF$JH=,JplbBDbhrkqJDk^'+bK=j;$R*E5a.9<Gc]fgBcs4q>5j$uTT/k78jYD^, X;GQlhB+d0-$l$jk=r5"6']ZKo*SG9T%Z&5RWJK^eGYt5Qf0FOYi`kb:go!iI!<]%O1ll!1X.&2!'s L:u$K,%cet9$]+qVn3ps/MZW(h0F/c=!=,s7b_hScYK.-2Zp65=iglu#\AmS1jBEKAA@[i,p^&'n%D iNq+sp0^d:c/o9JS84#+3ETEP/Lu70>#/44RF46+b"r:K;!tTB,h4n38S4;X&*((]iX>FNc;Ye/uH[ c%)G@:f-;#FZ7n^rjg8SN6qYo)(bgg\pI?&O:aJ69u9!enV7M4!\d2;2qjG8)1Vfg$0T[UheO#2i@t nJ+@QA^7Q].%s$=96k"euh8E9^XV"M(JrdZOBG-`-QiL8a:GQM@KTYV/g-fVpu_A*:Xi+Es,7$o*2N #o2fQ6:0Bf*)0h@])0\O1;1k=FWdoDpSg]\E$L*Uu[dF(>s!KS1-ah!.61$*&gIi!He@!H@BXT,HdK N`sMi8%91-(ih62OM#mgD&^229_T"1UcHgVj"#(;ap^f^?^f$]Zf.,2`&X<925Zc-pO:M=,&-*lT3= *^Oo=MX<`X)BjJ?1b3Q%2Cj>C1,oEX2Aj%=RGVEW@e8(5_0YqJ!W-'B57p4j<t7`,=uqD_anOX!'<2 Y6']a1ed")i"UDlm:],0:?")e%G$/)h)*nod8'`B4oKrBXOC/@,lmU*!jF^r]cNORQ2kTH;X`WuOIE kPY4Qf9pe1nm5YA9P63hj/^tp[1]ki=K#Capi6RLNSg^XF:6W0:HJGqppi+3Ho)T()[`>KsB_/4cNp *9^TU.ajM11qR,@".>dY>];tlkTS`aT0ZgW[7oM[.j$nG90.DE(-rc!!)#MOoPIn"L(8TXD7jP((0I b1',0**TlR!Q#=T=!5Q9IcE&5%"$[M&m05Ff1HHYIaMf8cp5as$1l^tE=1K+F&-/Sd!H:JS-LHG!63 ,B.9%*fKp51BU9FsYn\0e1K$[.^R!6Q3=;Zg\=HYt;HRC4D!l1n:9LCJ`3/Q9nr\g(Y];ud=;DHndb Y:WMWbSZ[22%?dZ!FV&&-B&U5(\]6fqe/5%2A#;U%):B?JIPT[OJ+cZ!(t_s([-&GMZ=)l"RN'EKF) YU!3)lL%HUaB^EC<&@%r)^>6#S7#3^;8E`bW^(_R8B:]j&OW+!XbeQI88CYLGW8m"o*e-lad-k\k[' lhCr&0X>Li<OuPJ=9*j9@st,J<NU"c2kM5(NE!=!G[.F(C,`4&_TMPefPMDc4OVX\/.YMI,W`t'UNQ I<^8OYW.]"T;h4S7.Z__D.):XWn%6g2'c\p'\k?;.9^mdX7+i/P"VNp\;\9Fl'X?U:;0G?-JHScp$8 CI47F](H0IgMcA/%RRnEa*gWU@`f)IMRsTIP@%4?F9HWdA`]`YY40W(LD26#XPj+^lo7-SXOQ79pZ9 9h7MPZki`m9G:HOp,jgAZ)-OoB9Yr.749uB%?e:+^_U+Zh!<Vq!7JPa0%`j1:"prpWe.6o792Wg3N9 m6=qT-"%C#c*>!mgc"H>\lLOf(UI97$'#>e2aR>U=>qD7)5crU\ql9M'Y\q$Ca#SYQ'YeQli7Kj-A+ ;=epn>7a)%-D2o1SX"AF%J';&6^;YS$7$iJ?k?k6CZkb<C+OPl:sdo562mCOl]`4*C^<j)6S`n4D2J 5mJq/6*B8q(eiV5je_Y<Y4MYpo!-f'*,T4K#"'0ml0>dgI&B>gZF-s6Y"Mt;K#.KsM&@uOSTMPk[!S h.I!27A>Ic`X8C@3dB"Arfq,s%,iC'`B_BJGmHH-V5743T"e'I.lkOG"C%q3gE)W4BfN&kk$TVfMbI O9$arM1E/C/7qV#4__DZh2i/_E9Q7UnXKar\-'AuFPnS<=ml?f3%rb:"X+_u$Xf>l^C&g,<C4.rG3p !i=YPCg^`,WGNZt+g%^]A\5U(:\!mh)o(n_6j*(GHkq>AQA0S)=$)aajj,+nN<ZroIW!Kaj,qlV5eI X8LWh2i0:B,ImKnXKar\-'AuFPnS<=ml?f3%rb:"X+_u$ac3<J\O3Z\1c["&+F4>!hSNF5A.e8mJq/ 6*B8q(eiSC2cH@,I>u2)a!PC[5W=eopPD8t_%=+$$e\'Z<(^$Ku5mR[^"+Q&eiY9^A0S)=$)aajji[ XLI(lVU1K=Q,RK3]ikn.)\2E'^E^#J$Bi,7kJF,aSI<c8^D<.Nd<5EIYb-/&3X/!f5IBorF6ucIk5< Br,mRO+#QK+aJ`0g*!*:JIhftJ<4e;^.GDLS?ICs/qhe&L*!]%ap%o4%Zoen^g=s)^oVc;`.F6.!!i Qb+D_`!.7'Y(&>7!N!#4@F=C,.nS=MI-<]]F?fN5Ha/leU,&ek\/CV68NRK)(05MuQEP5bNE^i$5S* =)[2#-\)G(N!hB_(bk27?i'O!)ikCn0*WA;?/!3]4;u^(*m:aLbD\W]!5;as3JbH'Yf;%Aq*-(HP?f 96(rh=EWXCtj'3/&!D%a&SeAC25!\&I4Qqh_5iA"a1gU`Yjcsu6ffA),V/q)lbek"h8W'dpOT)h2+$ sn4'`\LV>\<aSoQF@<J,lIcFnl,\QW[7ugKeYuim0FTd&G6*1B5lN[U@RG'$arkdgYN(]R_%HZ"3=7 $I?ip_!6Lu"Ft/p2gGfk?#!7l7([:t8I4[S"i4!h87K1<519K3l%THHJ@Sna5S*8n1h5nR):PS`;8] j33_)aApEi-+^d+'gcVJkDh^ljUmU]eOgAqcpc<J8<1ikI(BsaAP5gGVmk:k,m-Bl[8ee0#81f,bd' 7LGiJ=[_p.0i.T5qoLN$-I#q"@#kV"i6goGq]4V#5mC(<:YhGhg\JrYf/U(N@Aii&-uHi!.\X8_"Xt 7AfeBNP*(os!G$]naTs1oHkH\r"V=n9[;LL4-/\d=Hkf]YY:5SUXT99u"i2jf6o%*N<T`hm=r[HV9& rL76Z9dW?n`]'RK.>8L_g24!:$;hp]ujEk$`T^)(E+A:/;m/P-Mi2o0"(fpH["4TH3X0!.Y,Y$W;js .:`ai68^o60IQp;5abIajB%;WOk^NS!ce9WjSo2*Uf^pL-5b_G!=7XGnO^1P]FkBl"SMg2OBa5s]>c WN@mg>[q!VK$FCo96c9^4c!?K6%!$euT;hg>5#n/8HQNH[1l6Kb&2#S1p![]^Pp^d-#YO/:X&]k'$& dT$P&6k3O6HQeCdoZf`d"V,As+$TqGP)tZLD%]7-!,$cl^E+O*\$FtA;1iJrrDQY(46011Of*0N(]m h$B'MnanVRi@>G^&1AWe9HR'JQ!efJd[)j)t1pBsL.k3f52+WNO2#0SR<9`IdFTB9Cj]<boi),iU"i fe2OLb39Q,9SQ]\j*]_H_$\@,>gQ$.-nb!40PP68pM*qMK<$!dKn)MK3)+bR,E/je3]dM8@5:&87RT `erI:,6SpKG$h*dnGNT'Do?3Tjh9&Xn4;QWIrP]kZ3A.M!B`&qr5GiDnq)0A"$V;sTH*J"#A%ff%0? Ne5XIT:KE0[rTY**pg4Af#5Q`.Q<;1n.qiCh8JA_D4!(a`"O3S5Kr"?fi&6>M-?[J9GBbqs"59W@#P 1:@=`'7sC*&Ko>2:;[/"XaQUE]A&1_%60Pp]q2AUbORu#RQ$%5R+1FJ:NmWC7IUPMiWr"'FEn%EM+E ':>+0\dEJ$Z$9-O4,d9sq_HS,u8i$/QImaPR#7*j+i$ERMepuSM'I4=o6^+_S-jO:5$4[?C!St/N@1 :A]T4"&7bU*[A!b,Qr\$!l)$(ruV*U,qZ&M\5Eh7cQ*!cT,(5W."_r^\F;\+nZ("bB.>0Gf8dF$Ti" %a5(l!,^OBr'6`l*(3Ai"nmJ`Ygk'()F0ju!$EC-J-V_e+H)M:h%9\oghVsk0VN#+,LrA6/)=CB!]I h.WER'P5>W&M7V)obE+'qBGNYrW!ji8QJ.Z0;D?d_J^=$GV.I]Th0c0b`D*f]hPLpm!J9a"MHF7J'. el)-/o8=?Ua0o@Y%!U!!W5K+^q"Fm`AAf0V(`C9!$oA2/IQ=XO8ra_#]q1E^`,N@bkPAQ0YIhm%[IJ EdNer6r$GM/n2uuF&-ss"M#\g:/HuRO*\Y=?qZa:HAI9&h.*@-F\f?em<=6!o)1Vt)[Rn:?^jD#3I/ u0o]-Ju]a"7DqHs-]OI=DWe!"IHthueo<TUY$UZ'Hh05Vg0&N(JH6gEd),!:+$YZ6ufo%_ukL'RTn[ T]He2!<KJ6*)HeUMQ16giA$WI:]RjW)Qa%?V9gn4j<[#'/5RH<!N@1Ai!>9230KB^`EjTTL)4&`o,/ /Qql1ldYptm9/0l5COFWS&EHnlHJHh2enuKG*6%-ZA,VN#Z&/7M4ZG9]F6I,hULY^nr*Tk%eorD9!n GbLXi!?srD,O2l!?_K>&W,!fGfe;aF5ADYe>U*GiWsWK9`Q-J!DENMJKlieogK6US[$PM65ooSj:-V ?.)6OI(cVRbO<F$:mG+Y\EeP>i!__m<Zu[#gLk-e$)Xmhl\Wl(Za8lO]T"#QN/\6In?rg`1[:P62&! -hpA<S\QR*=#rlk=_r0UDG]egGX%pnBN!ZUS7L^r[#!+OD7HO8k$O@Io?a0G8.+l2]T[!%\2%[1(_6 i!FpqA#r?R)uPgG5f/$Qiq#u5)fPj!8.0A@BE:s19:u?j\(\VRLl-RhOk2@?-QiVma;=(IJ-!(YU"+ \sh\s<&dLZXED#i8lJ`m-:!S-uLBS1t-#P%o"!P'=4R+s;^Q8l57$/EXI_ADGCHpgqa+\&d2$ZNHRc uqODM/6.f,W(=-&3#\c2[R0JMhDc1Nj"0D+<%&-4AR`.%j1n!J8a8fRK+i4(Fe\,iTNIAYRc*caSo3 /Fbg:_<iD":n41Y-lHsplrEnV@67BJM@\G(=E/\6.J0f^V27"XFSFeh_\s4KhfOa+MSVW9@"*=f`5Y Z?P)ZgP*g>+Tm",=i:AE,:qf%tKU!%<'283au3SL8hQb6JUKIH4\K:9^4\ZND3A_H..TDIEU8C']Xu @C.f"$9j[1TJU217:1EpYqup7DC*AoEXou9e9&lg,h^WJE&]BKWP\cKN>>:l-eQe1ffuW+lRk!t!,C gNVJIdMB:MF.!2+`l$-51jn.)Q)&;mRE)$!O;CWJW_]MJXuP:-Fk:XsZ\piHmo[upa4I%Y@U[K$^H$ G\t(2CJRs(H5iuJLlPuj\QRT:BSE(6fg]X9nW(K,e+34>$KFWq%'r%!T:(2!9h<%OHZ2\h2e;Nr\UF mM/gta*#hMf,tR,GJia8>^oZ<d5?"nZb$]"1TZ>DqF#2cVpXQ^t.c,'lO>;[J1$IdS]BaqJ^b2LMQ: rjnH#bllHiR"F1n8M\*Z2ear?3Zq^]ANW'IF&M5AHM"VW5Q_#<#Pn+5KYC!%]I_?U:pg1+WBn#:B1J AR/ZDZ25dHC%(8YIhb`\5Y_ru.h*rL!&4Fl-6C(t6NFnIgrp?Q2:OC08H<^m+FBnGpct+V$G4Vg=tt 7I"b:Ylb[e;5a_5Dh'IF"ap_WlG!'&d8!0C@pr&WJ,3$84RQU!V-ocnfjX2,2.,<dNo9/pSj,ng;5Y qL#28HFAA%5S1go]0T]9\GU1d#o4Geq5!04LiW?]CP.()utK4l^'^^9a<pKZM>dW@/KPZN$]'Oo?s, 3=1T\V!H:"d]jS`)K)iPngl*'%QDH?Mmd77DNJ&@0cKd]b\r\$PL-?:OU.GEj3\181(cMPh$imafO: fQ"mB4;Pq!V0<"2IWOa++W?9)f,S%&3X1q39%kE<AI(+sJYb)T)8:!9>E/$,>X#[."(224u*\m.CVe YlO,S$UBBkc0Xs(J?m2>"=+.9rPd$K/,QJH+uWC/cVFR<q,&D[?S/Sd<"(f)2e1P<&!c(mq_Rb/$NR H$b&hq6!;_d;I3TQ\cQrJ>%gRV8P5o]3<":![!;nPuCEJn`7D%>K&7to]%bqKRC]I_fWJjnj!/R:e4 uWR,)#uDDla4bj:<>lmErc-3IuN2N``Sr>JFph*:d.hg2fk9/!,ZXG5aFs9Y=T0'2NYUM=f]C4IEp' ##H"SB1C6GN_!=/SJ\[eQ6(Ml#aua3+E"\)`CF7pR3e^>&;s;$r\cd'&g!qR\`=bE=,QU>hD6X4k!K .m*0jM'c7tXT\++O>C!-oaB//1.F;\N+e^3_OD!Mk_iT7gi!&jXdW%@>(0*"=RN-C"hG!(7,-+A;Jd \bKKN7pLm#bsO3Z^qT&-$W%'>,q#]7$t<T[R`-73P]RUM>ukUha:^\]i6VT0!CoBfd%23X7=Z'@":P <&!"i$11^$]AK&P9$^CShaAk;hrY65md''p9sYc2Bfi5$SQQF9A$_=O'8!R#P*Xoq5aat"+DS.p)Nq nM`j*<F?!1p%3Vn]E?p6NG$$ijf'u)]ies.i#FN+YcY%&N)sI:]tT4,DBDXHB.P'^j.(lW4uR@I6gJ JD`aJa3X5WtRKORK9k_88"\<-9=:0DnJ6,.c(45O(Qdqok/V$6_9>md(C)q6p5SO;qHDB*BD2?pJ][ ?dpn\lJ*Xe%dYoLpZgJ1guJB7^@m,6u#TTE5)o])]sqLV*W-hoDA(P#_]X'0oQH"2"So,/EC[.R<o` #E.FD5St&94p!,t4-_5J*XtAar;neUb/'4Y=t=/`jYm/A!!;tG/JI*@]r=^'<4H]igl1K.&LQlX@A$ s^+DqQ@F(7Y/oU`uX0k+hBY!O^&'Aa)PE1\7F(/"+T"[/Q?iCU>:htu;e+]`U]5JpEtaus;E@tj*S# ]NH`K\P!5Pd_V4'('3E[cgVWLJ"d/MuYG\GU3Fd;PGmpJ-@V4R>4BW)UBg.dV+$IFp&`l2Mk'.!a^C 25Qp/eqGI\D"JeG;^u^](#RmF^Ht=fKO<J-9\S&KXc\Q935tXfoA-0;S``'?4^N*[Y"S)QaYkhuR.R =o"9M%VW^mPmV+&`g"!MHQ$hdFlQj>#"[A$i!)9@Fq9Mji]O'EEi=5G2R3aeDo)%lQ,pYbI1t!Ot_J -[]JU*KVFT!Z;uf6]XJ;nc3n8^K8`!%!5YBJ1NqmmZL][,_-^;!20\G3Gue<1VT/m4$X'okSW+ffDr \Y&J.Y5,WlZ%Q#<4d/QP@q#1-FDJ8Wd9QiUB@/Y)pl%MOA)[2$abY"RLY-H3K56-+?/<^`@29!C4d= Bm!Ln-'4-[E"nj!H=GHVJ]eCN([R;RKPs;iu0;\M0)gHCP.=SDd\BaTq$Cdp#H_JA-Ec"MB3.*lghC [!_NY>?G0H;^t2Hap]f1u/dVfr!BS#GHb5+>e<0/D^&Ud_VgP*OYstW'qZd9EMUYK(i!"oiJC=0@hj XgcQKutBK1Rfc>OVqaO8ua^YVs-r>Tj*o$4I9L7i4JlE1%]CDX^I@_tgD7dl&%86GE:,Y8C<&3>""k !W[r_dW0QWLbZcu&n494(O&KE/#>k,[BO0H:a/F<gOLQb=16NX)+#[3H_rOZ"+1;]_5MHg,*4"a>JL A<!4kb*oIFe0(mDrbH:o[o8l-'K4WL5a`W$c^0m0rZ(fes]kGQ5D/=lkP@PcP;fh)K[#ams+!O`dPQ 3c<!C]fi^HGEUjdK(4P-BN>"m)jpB./+k=J0_p3[aG0o67.e@VD707Hj4#qW,uYrO<VJE^][I6\k0* t.rEiSPK"ko?f)Y!@r)QHYE_!t2=N+gcN^bW*BaibOW@gp/k?V*D?<,Y)u?IF3FF`EBaOo5!U(lqOM 2tHKSI]JTWZ:F0`#/q'+]BG!q+3V)RtTBd[H=0-j+_"0mq"Sb';<(j9D9>icRlC=:2B?7AIQ?X;0_0 FY*ff@O\Z!E+^AV#?-cC%NUe\@+FcnW<:*IO5pg_X.goE;%eZeDN\]q6A)IVJ-teFHs/*/<o=/ji&) aQ'lQu&<,?8fIc`3c^`UQ,Hs5qG@SeGW9TX)sJ.?['kP!=p!)s!E`\u'CbU?JAZdE=o6hk:Nba_m'0 2W('0E;M=d3o2G`OJNl_u/D=P4:"tne.e'M]ff3'9-I/;N.Y%5R-tbA@Zu0"=4%&TJ50FIDVUa."F" \,J?'Xgd7q+cXfb;r:l"21^k\$d4c!e)l9b>J-Z-/87I<?PL,6D\!3q3PeoID!.uP/-o;60!)Ea7[+ u(e_Jh:A)Ih)u)'.G%*PhmmI!VF'V_!Z?Mub3@aZeJ9$9EcV4X`,nWPG07,7jp$i\p[mLpjroLl_Zp $HU#+ZlGIr0m<jh"c*0g0fVK(G`R#\8$K64.E75YE.0kGbi0Mu+OU;!X(][AcdFkK]T%kT<mO=U-a/ WkQ9q"2D8)UsVJ&d@AOTE\jrrG:Y_PPgAQ^<2`'ICf'u9mYX(][AcdFj`hGRW',K%mbm6Q=T^-Pc+G l,m+^im()aCZZ72J*070M'CC8SS+Qf=/%&A1Iu$!)GFq>=k6<m?+uO[qLOA[X%UAU&fRZI^W?*6).f oA0)/pC!9jA#rM=h13qFK539d^'cD\VPjKsS7P,__YWZM.gJ&@'?p9^Eac.>;[WVdnA[MDR%RW[BZ, .6-g4R8tD'`a7.RAXsD1&_R/_]0>D;K])_EbGV8PD%50E^f4?P6+5,s:Dcm:Y?j;Qf2\_[h",;lYd2 27#8/-)1+('c@%\X(]+'6i^I"TNlm<*OV"&SJ?i4B_9:GIR5.]5\iW-*[.Ar>`djhRN2CO:MA_OEY2 g'P=Q'B_"lYm3Nsn35Pt$G"['%pA/YRP*dX*eGY"uQJK`kg=?P=3(k0*NT>+E**;cgm[)[ss/l8^c' U(Y'lhtdc5;[UU"5KS-U*_1EQ@HD?Zhd-?D!_?ZCe!$cZA9$:Q@jrL+Begc9=^O&GD#rP^_m+UUsM( dPqWS.Q&W3jo1+_Y^P>2[-H3K:JkSht,2G)*bq]>C+<eN/+NAU#4`oC>$(Rf_6N]To1]UiU"#0^.!9 C``ZiE3=$UE)Ul7)e[NrngkAA&/_dMr"q\o^VP"Z@4aqVM>3rYtn=8aH+,V'H1/8ckEj$EAp_;"P%o /8n<.!!#g/$3&I39MY6Jquo)X3>><H!+bm)UJkLQ&[6eg9EMFZ/-*q47Yl^%,e5#L&H!XN<Gq*[m^= %^P6):Rn@ch4jhLkT5c.3Vhut#SG?iK6+t*F_8KZRHpLR&$BVK$:$sq-YOSFNV8]gdMQ8Tj[6W0'[P QW`J*N1f6CUP>LQ]`m"^Wa%pU7E[DcN8'S;La0F2j6K0!92-&Z,tM+T>OF@Jgh/^dfAmEs"Xe/.rt^ 3,b&03nFK+u,Fq;U!158B5gb>eoHT*_eYhWe,RZm2jHX%'o1oJ8P;E83=9Ds61]YnElP,$*llO'_?8 =)4cOU+c+e^9i8cYN8od'`+$^S3$-3\ocpX-N,F!!YX&Q1VF(t@t'TXf!Y!.]]"3RUKkW$):.YEQq5 Pa"pn"7#5-J>CSq)XfD>EBE&0[K&imO<Em*s8>W=+'4U*>_5`"f3eTc,uBljPWUXLZ6)in],(U".#^ EW?7dr1n=Z2@Uhr[*!$a<#Iqb9[`?c!@pXN/oE\j$ji&;:kIGRQt_!@gPFGp9?r@@s?="<h6Br.O[2 q+*E]B_fa!:ekk@?.u*XX>FT:8!*Hdrt's5Q=--W;lpe8k$)u!Rr)hUX!Lq6k7F;]E(.67^#ON-ZK8 ?^SQoKPA3T!5[CBY?;3mtFRfOQr7b0f&o6671"=P]lpLkC=)\cje2pMqV&$uPD:;#Q&K/PnDahHe<. m0GcX3]?l70FM2\h'8"703);"$daQ!+_4ZqVY47q<<X]bLS2;%_Lb5L7T.WWejq`F5Q$/_#2,gMj&N ":Bj[;A%X$I:bp(WKjJu+farc\$)8n7;*?=n/+jR*"uRl2$'_7_7Ki:.L,>S>\Z+sWpVWO^^ra6&/A hC&ch-D&5^.V0F(DT<PTW:"e5QD!*W9qEiBHs,D"LsDr&Y]d8>9*eZWt98:8:>n6&WL).Q.c5bWbe_ (3L'g/W*kTIM&bb6+cUKIPMEHtG,RD4sD;&g&SJC_\?U7n&;6UWrmRe.4i>`">Ck$*d!B;N+*<Rns6 f@DFJBee'hr%8kTsUD!/OQO9bPW#l0ocU]0:oilX(8W=G>71'Vl?)g>"9h&Q5ncQi`!s2R*=$Y;D#s 5l<K_ijp%l[F+Jn*/\'jRd=bGBNa>;2BNW]h#\n0dQr<#@*(-8F*d2$=(ITDN)?_?;)\Z?[%tn$IBB M)+!P!5JsNONPCIQrh!nUKF,o<"e0f&Vj1$eetW-/$o<C$&jWnfE+V^TVPDkLk?\VK:UsGLkV!cR@t d?$2H<L&Hs_>SB>PFaAN"1A7,9?rChT'l2_;A#8&sK^e>)i1Q*^%5m">m&]=eX5Y5fYR<8CU63Y3/` =I&5a\mu2#BV(_5W\HHa8m=V6+H=:-Op.3+a:.a8*dQtGD#rd$npuo"1Lf.ld8dD0n9foE'!i#mW05 l\(\?WX,eA=8i"<c!qHS1#[9WE/5,+F-\i+<GD#rdN&XZ1]?*d&)6ak#d6u'T64=E/&4.0H#Q-!RD, PnjZ9`YVV._Km*)lp2So:h@Whn>*,D_&:9UVRtC^KpB/=CRp!,Y!aR<.Eh8qef%m;adq6G:nf5dN.0 1k6E&!_;coFLt3ILk-eD]Y5_E!20Q>S-92>kKndI!==##F=<;+TE'Yla@I`^!27qoZiLKCc>b7q0VA E!d)\a,WRDY4%LCF\&-36Sp]t?&,ZA;g#[>0CgjG=jd)WHmEnh.J#,.=$XSU&&dNf)FgNP9Fe.?d+C "_[2E<lQF9^SW4W$X'_d]e=?HI?-KYf[(KSI?0]``;l?:XbCg\#o:?U79A7JN/#=#WjFD/2%0;+g!L \:t'BHGU=<%Z@+R[JO^jAcGu'#CkL;HLGfU#i:%9XJ:X,%5Ct__"\4?%'^"bmobR_+l8%o25_T.ubp kZ@!!!#dBM&C!PS]N<Q7*OgkQ=5?LWX"pH5*#eI)/AK&N.L5B30mJ%RpeV6POfG)\$<[>r(>$!:W7J @?SL"ls`4]TTHf#$P[%X;(PP"h97P!q#:DTs-5)Si([[]Lr%d7]bUbU-CB<RB=(=YgQ*1:"'jt9).a )+%lVArIe8J+2nLec@]P:cj([N\K.@:Tks!i-69qPfm;XrF)P]^?#_K.,ET3GR\b_Y.Ebt&KY0!Zdc (&eGf1=!K#u+$)TV">kB9u#6+lVc"):X[m!][/BO7qoieA=$#k7@fI0?0ZZoPDlH@,XQ+FJP?OaP(V -Tpd:.U41,qb'4L8i!`Gbo>tm#?IFkTV,eH<L]T%cQN79.$VsTL,mth"L4C3c"Ba"a3fh4?'?'mN1G g%=6tA(7T9B5YCB7SPI#n<F+OUES\lr9KgOTF)i6bp4TYeY*Bo5&I"8%q5EK)OP[*0HtgN@_//A"uD M>&A85WCTF"r,VSjVo<uZBr2B`kad1*(FDO#^j'h#ia/*_Wh>2ei^/[>//@ufB!nnLsZ3QY]ZfG+i+ \N&5Xh'b,Wm'J7Y$+p<VU@k(Lb+nTDAH#\"i1YFlYZ#Rc8-7KY=F5!Xop"(.C10R_4srjNS<"q^iZf [o4'+GcKlbd(j?-1&Fh9`Bt,CJ$h,&#eF6?q_2E,)D;9\uhIcfF^CS1'!D<Hm_hHGF/Cb_#(s^JcR] YO)P.#$l1_*!&,\(!'hWViHIh;s"j<`U]OJ(IVX58gAO:hrOnd,h)0F*!^%I^_OU[7alE9@M)+bA"U L!5mKib0Z>iJZTEO6tlY0#nkSh*gYMh3d0]+,gRtKT,%_s<bVMGV(K)W'P0I.lu$fhhG`4a"uZmj$] 6Phsp$D8DqJKqrLnV,CX+q"C<Q>LHUi$22'4p!S!Z%eD?!4EKR;Q`immncpW"6Ml$[::oO*VDLE)u: ]>^khjuPQJUTG\$n0)[uNBi"*I&Ffg`5Z9Y%;Ma(SZ:prAS'Q=rO*)HWa&0adK0h-ugAC[KkL_RXdj 1Oi2%q6$u[BrRki!'_n%!bAA%Q"L\F02t4k!\,-:R#_3"'*ro!"[_9p2Ko=(,4eiofKt=T!;=k5O]/ ]Yt>)qmg3^8QNkJm_nlWIJ6hAcgdXnf>2UkGYnBRbW_@HW/Rq<L%d`<tZd]L)^]Sc=aRh%1O,#t</U dlPB>FdlhhnZt6-G)U^&u[_rQ#r'/g8%2i"*I&cN='D%$]-?^bZNqT*:P]:K/`%*jQu]n3r3:22FJi %R;(qa*'HP^"0-9!l0D,il]7]AgC"25bWm\/,0585[WT)QihJJd1I1DP*2+qn.%9X[_j!@"*>Xf^bM [?1^[d@6I^RJcY%e7^pUNU*D7gE#UlkWJ9U1q)Cr(##\":&[T3ANn9/e*U8pL$%V2Uf$<R.G3$7"mr I(]e*r^[Kcm5[p&1#K%\MOWk5k<kCUuY"d5i</t"814*;C1ZXrdZqhP#iRW[m-O@T-)oTPlUj9\2]: (E%pkcCk1WaOokeIGR.ag4=W-jniE%C!5`N6!X?m2XhdQ9\:c!e!0&$.@#2QeniE'!,[N$qeZjdZN^ 1#R%oci\JJ"A^g^3Y>5G/Kc7Bn+&!+<q/qoXaNotpq=$Dmm%8.7>)0Bdu?)LAeo5QRf`ea`A_(PtTU r[e-i(pQZP2jm-j+<#AcZmuiqlW0WP=;D6F#`L`N01>Y0?B(g1!$IUmJ.gKf=UHF)(cVS1M?=DLZ3. 4[[fjW78N#MP4D5;KT8'*4Cjb9JJQR&?L]BcU&eG(c=EfmNi!jc5V_Oib?"O4Cs!U?h55e4kJ5oO.r BHH)nFU3Z@"9Q=Hp?982[tZE9<\,@Pb`!grdW,D?R,URQbQq<9f7P'eeK^'G?"51[\3:0"<oE?":RE kVm4p\CFCVVJ3ThY<<\mj<<*4O!oT"3Z5mcl$rS.=WaM-bL8+<VGQ;*;CCgZf!`)041+j:E+oilR+A a#%d0ihuKUahMLZD=Q07!T>D!fKFcJ@hp!9ERhb4trlBd<n5qHs:gU!aV9:bdnn@rB6cRLfIq>OiGg +tEcrm\GW$@"bLQdc3gjT**8@1j)(T;b/[<+TQTj!jM=j,7)(ZRZcmla[8[@!6bphYL6g2dI-:lqUb ![Xi\I:e!/q]ejJT/KC3*B3rjp;\dF-irEoV)Jm=7Sif`4G8VmK;MK(?e(l_BIYWi<lE0AB=c&<bTb 2+`;T**KBKJC&1K=UQY8+58pL;3dY5Otb/pbQc:UhK7]muE(<'3C@j*FG"Ys)7u-63tB7_St#6"+WT 3`uG(u5'g-,:ht!e!)Plk!4ZD*Er]2,G0/]N!8OBqC+>E/jLRQS7[V=dVWpMLTV=9?'a"HPc1#KRJ6 !<Fa<T+@fMLrFVl<?l<tL`Ll2(Jn5IKt/lE.:]>QQS.,IO/l'YhnM@mLFIZiu).7[Xg^4p-L-'iC;I D\Gh^&tFXE9V=/>3=Rtl#Di3b'I!QZ=:n7rXu]TGpN6TG_+=pYZiu)NduY5`J>gdZ@8TJCV>ArJ3#5 I55ti^$-A3E+<TF2[Du4<OL]C*OJ23^d!4tWZk5F-LhHNq+<9u@b5RTiOpbkX]1kDFap8+u&78D2h7 *QOUU[g=jKE)eqY;V[7,B<O.Ah+=CRa[?3EkqV-;1'-\KF\70^LhQ@N3i>+'uIn-Zf5(`_QsQ]i^Kf mfG3@4_=Fe_S2TDD^,/7Y'h?(1HN[dkVq)G.6qU816kb<nd;\ptWU@`f)IL!O8d-c<duY6cDk0C*5T %F61pPt0C<st>j&)T`g+S<grGiTB"bC/V\AFo=oh3K#;-.^1&(nM2TW7Zh7B@:n9bOi;/&6roD\Gh^ &kt%m]ES2JS-3aD9aG\]5nU=mmAP#Xs7QWc2KAf%V`hX!2ULmmhBN$k$+k1\/V>q@9(3%P7])Oh?4_ Vfk.lRX<RXjglUBG<BE?FCP6:ncrQ-RRUfo5WK"u(s$nI"7XeH%*6n2dXd]tAsa`C9$V>u,dp.7as/ qG"m.0=N*/<^Xd"5lk)8>+<VQJCbW/K#f6#(Qf<s7oh)p]r=ag`[RuqfGigc_3$aCd4-U_'K$$^lG' &[iGg+-b5,1!3=0JY_o(RX,-&gq<nU&Yef6.GQU.PL&uBh$Kp_.TMMBeY1R%,-6OGN84'g\Xb*a?"i (=]!6T(1X9s9*#RZ%l*[[=`!&gL_p;3i&O<iO0N54Q<J@ZjTG:04Q"tVBF6,b3p*fn!c^*F!j!Z,mH +:X!Y#h@r*(0#[JZE?S)Ip8(d+E/L5$.;(PfG:DWkNu9"J@LPcE^V#TW0UEaBQ[2Vl8MaNZnU\o#/^ Xq#d=\3Lm14,^qQ#UJ=@c7/oO%p-[$Pl]n*mC#m^SKEgn0\KSBc_ipmjaI$_.A6k+WMP(4Zo+h%d+5 \SdcW(EDO`Z4Ck/U(jGnmX.&DaD>iFrl^XJ\EB9#Qbf_Rii/nL'Z>hneP2PQa3b^%=_TFJ08eS[gCJ JB\4*!8a#J@:efMCGA"k"QOm?sMtjC*NWCTq+4PsQr/8a&;"9C5a('%\01c4s^kLPj8->P/6FF>9"V opkX=I/chj,N1#[GGfJi"#W[KUEoH!<uB"(hNIJ/DtMrI?AJGqMM]MthZVNWEB.V@ja=5uNRDE!T1E [9tXmp"01cb?Ig5M4M[sDkJaT!eS4Aga5PoJcKQo(R-CKb?Ig5?-9_k2>h;_!eS4Aga5PoJcKQo(T[ W5<(^Q^QiY(3S"U60N;$^[cnL^j7A_s?=l"^16,QYG\,`Xe1;#'R"]p;l,c+%3U/_M`H^+m(L=5j"A Xs:mf(fbuS_!;^kqJG,;[`X+9`0N'is>4SHscujN.87fJqTHh,!I@bd(gL6'`n@_5[`(H8LYFj+Z.H pK"Z-R?i/G,DaD>iFrl^XJ\EB9#Qbf_Rii.G!j!tYJ-%8SDaD?d.I0UUn@'\M#Qbf_Rii.G!j!tYJ5 3`\%)@%nU,8$:5V)CRCs$]_W2O\c%0gBUn.3kGXiR9A.Dl=_U;8+O86)Ba$'T_$#iqVInL,65=_EAt FaesKVje8Jc9Z@2cNo1l%>j12QnsaFO3.\C!#Y^L!"tq05jbhkPi<lZi[=g1?na,3["-!>Q`br(M$7 jV!K9Rmh&3I[gp/&!1<nC%]l;NJ!*&oCq)(JDas\@*OMk<_%q:EX`#HA0@?HYi)mmd/<Aa'oIL[U0F 79t7#++m&VCT7Z491un&S-$$JqOD;D+9.8O2PRBb]NqajU.+2L;;k*i3EIda98.C[)ipadW0Q'.Q]F 'cmJQ]=F_%/-V";Sa;a&fj;\j6)rQ'!bR<DR`-9d!oSYN,^r2f*F),J<Wg85M!b.*6K\P"(!Y;M7X5 La&!CSREbZQWK(bA$HlkqZI+:`oX#n8itPKTa&IR5/E5\goM!\,g&I\\(P6<*+q$(\8iG">-rBd"B8 83A_JnmZ#>@2V$g!/(R,q#G)-$PA$eRHKO-\\hYbN$+#<PZ>LIPZg;FnTbs)rdti6,SUD]!/P(g^tb @d*knh6"s]D;+U;N\'2208DnsmcdWZRD?7/:\B`K>K.2G/Ndt*V,#,Yed>/$T+7oa(2p52V]lZmeU7 :`5Z@(>"9lpd_gIV0]:hlo7V-63&97*L*m*YmS:mHk5_6pP([00(cHof3kf\<S!&C*cbu0U.L@Cbm# 8Vj1IX!D'X8$6\SOZ!DQd]VM1Pba;GXeSrc!:Ii*H2&T=4!8$<Cb[!\fl#(^Q@>R5"$HNtcDIl9%"Q Tb#$UUKs\<RVU)\@mb>!j)+!/[6rF9k5&Q;[qc!8$<Cb[!\fl#(^Q@>R5"HASm2_N?Eh>.Kn4!7-oL >X"jV>=ek*!F)hJAMArH5.:33)UKY$,GrG&q#b])d9jK>?#<^'O0r;'XFWM7#2fPfQTm0J)?$DDh:7 6+r`Erbql41t%Hc4Z@.FEMi)%^E3QreccD`L@!G1:o?q7/d.Z,J_FkTk)#XW?QAY!mcc?NLnQs'J4& 9Z]-%*1#/H"EOfG0Y>9!LR'k+:r\L<X]7<Bi/K5F#H6Z%1_KiQc!&@7%GP9D'09j?<QH]XeJ>fVj5R 'H&YM)!@mT=A=[dbc?NLnQs0P5&9X",B7M&mWaqZAG0Y>9!LR$j+:r[U9P8l7CjBT_%Hc4Z@-3EGQ- OY?Sd!IGZgmquQoS[+WKjjoX5L7"!42dD/6gJXXFeL$!RM$iK`F@K&/\-NUA(,9&"iodQV&BsS/g:J )*ZuY7JKKi@^(A:Q8df\!.5+$CBe6nAXs:meeqlXN2MrdR1m2k!_NI>"g#ZVMV=IS:,)aa$BTQ&##e @GEN/RYoRas$he"0aiEK[i9X7-<=(D='r\pRQ/1l3JJA<+s!mnq1q11'u"9D,?H#a+7K=7rh+D:5aX hcf<'W6Q+Z&#J7lc]o*+f6ob<l3F]$im@0]Rb**FBg<5T,kq28?Xd+/VS:tNipqQ"E\4Fp-u+5/,`) gJ6>PX>Te&a)M/g1G9BNtE).@hYRgq8EmXtg-PFcGT]Z:feVUs@84Zgbm-jNM2Q!^+C>Dh.E<"m<!< ZI)miP3N"8a;A8KYturFK>T"n;MbOI0hfm):$rWE!:W6k&3jShm,'%Wb2qJln$g^uR9/i`HNG2FV:n !IHObJ-?&WbN/fp>YY8@&J79oY?\07)o*gSLr3%;_?SdG7Q6$:JqO8?_2D,FL'22+"d%1U>nOn.8:S 3Mq@!9?%GR:/Ajij3L.-j.rmFY4_mdQN`*e&V3?r;,0UDnea<MC"H:5[OMBE6s>=+Kd)uU.9TZXG][ QGd\%'hN5$V@#6YL2Br-Z9$annT3F65$6fCKr<,!N:THl,DALDP4c&T@'k`csIDc]RM=T-L3<*<AZ6 1&6]M)F1cXEK/k/kmP't1;iKf-r-s>Zis>2]/V5mXL\qob!J/$CTPT,ZTE'jG,5;10=%'8$d[r.Wrd oVh_eq_hR3/ahT[:L`&%DY)oKpK(50$mj2jcCqjplH(0Z@iSci5qk1QERYi`SO4dfN'AY5B&4!J/$C @##<q8683P%CQHGF$8UgoU#A.$Ng_Vbj^-%5Y3Us%-DWDFaes',AQX#QNU72kkY.+K/qrtZ8S9XA2u 5l,%(IK!+I'\]EOsco.VVh6;i[EE;Xn_gkM$p+sl-&!RKah.YKnq!cjl?Sl/1B],1&@JJ\Q0+laN8A nWA,TEs<Qjsd-/!-SYI)2Q*/dspMV!Jg_AJ5X[VllNAr,QM^56k.B'@D"uqU&g,O$t,Y7;.3u9Cu#d c-r_$d!,R/oJ:C>oR?n,.Pe[2<!Oje"7fq%l6=d`N":HStX)&cp-itnA$N_W%k8TKg;(h_iKQ*OD=! rb85Qk3i%$m,e!E9)M\k'GR1/uOg)^#\?)[__tU67\A;h1+\b/sbn$8Wg?BF]U91g:@]_H"@0Tq>#b 8\)+R$ZeqKTIi;8-\Z"So2$@-K#b;#&A<$VF7lF$(@VMfZ&hrTM4NY1N=P@(!<E0m":e\X?\\eM%JQ (5j/"k$<fbiW^*+@Jk';7\+9_JjVD^(=0IJ?r56QLWn]#Fu>JM1S_s(1/[U-q*KSHQC/=G4@5erng4 T>u.Ym$qfmWMZ$[.=Pp]YUFL'>F\c+#Q_<6b?\d70!gj7-"?SN"b5Eo7gl5(2/alZ)Jc4UBE*R\FBD `!%8Y%gkNKG]YUEQ(N[R3!5::.B\"@/^LVfJgX&4$S>\RM&AYOSUm1:j=%5#_#t_cq].>4-I/%_9OD =mtNW:)mU^I4;2+du],fofi^6BH"9,>=>geSC^s!5>+/ql`>]"K[""O)_Fo+(kp>eG%qp(m-%e8T_6 XfY[p+JBro"\\R_Pi-F,.aL<^E,5P(V7YP0H_LSN!D;u-]EK&-V<i5-a?n<d9b!<*Jq/q>nb!+Z,R, B7;NKC=>EBH("hY[@!"SY>/V"D*)]0"TJ1V<d-S!G,"FtO_`bj@4^`+iI@cn^F%l2WNPI^ntbQE/V^ mq>crt)uN"f.CNFr,7.ELf^rQEIS+I9S#u69l#W!eUIWJ.V>Tdpr'L!pKQL5Tt(^b=/qM&3sp9!(9( E,c."NVXYeE@".5uUR22o'EU<C0OQmV_e'II+JfKJ'/b;NC6Ja$!D4UHM9,uY5/9kX`!:@LF=Tl_.h "F7'kJLKIoR1p+U$:[G!HN##6@(Q7B]<4-V)Jp(JqW\YSj6#;s?:I'>SFs0AeV?"+e+DbB,IT#-#oK &qg"JkDU_%_d!h5+LVJ8TK)WM3:_UCAbbKQ5j,W_7L^TXn&"ZX&'_s8(c@E';Td*)\_*e^/k]T9lbl 4C*0:GGgbs;MOn(`Z*QS6m@q5UF7PS]`WQtRmY6>A!3us6hA>oN3pcr&j'4XVE!=TSH4?Gqr+Rl:b= hb_B-$dR#:HiOo%\*Q;ES8l=3Dj8V_2Jn@0AUmIdMBY$GWJ7n%5aW^FQlcq43T"e#\%SB".!F'1-#g WGD<u5R(eeK5;_;&UI=%U,m"/KkW.<'K+/gEgjg'7'-GHj_"Q39G;$K-1gm7<R%JZL-t_"6rr=mKF) %$f(HPqanck;QW[p%XVL=TQ%h3Vd-kSJ$,4kuOJ>$:fq:5u:B:^o:=nPhIV/pC<,o8UM3C:4I_W6N0 pB,kpfVk13#5nNB!2,qbC&glu+iqV:0cL+(FQ;1M>6GHfS\B5a^h@;MF*>hWB%:*kQd2R9Q<`X(jTs ]1*g7fqh@H9s!J"X:)SG&WB%N:loE,a3CU!D_63f;/^]m%Ah0A\B(;U)t3^piNB:X*ec7!;T>@!T@W Ekfpk^_di[bq3rA)I'i\,p-7@Yu)n"/N_hl!(%kquES'&Fip%^^qcfclR#Df8TrY+V;]ah[sN%T*c_ g!X&NrGt4M.ptiAC,g['Vj=6#kOHcdogdWPS+9X17In.:kkU/psle`:n)j(-@1frkLZ62t!;RHfN%- =4uBS3EQ6$O;%Z_r>%631aElG2,YE3N#+l[7\$#V^,5"fiTDK#`&?)5M+KFn$Z-Crh2n$/e+[9XD-7 02*tf[u<Z>Bm8]tVi'Pu$N7=+E\N"s<GVGo'HdZ`!+KS(R:'Te_FA-O0Xq3%5ep&(hYtQ]4MVnO#=c LqhI-cM+Cne@#:7Idd_)8V[ftK\_9`ZW!s(2@Gl&Renc3S:*NWCk<\[`-;ZuC$3Fr[SR%JZL\AFU8o i<K?F)%$fQO+[\#U&=rMm*1$MO)f8aTZB-5g6"O/1cBM""E&J]\HS<]X0CCa#ZmBB`]C[k(#<3#Xe[ [8HE3(&-3q>HZGsarLk>H?ihGRk("ac[0d*;Up,t#L]dR;-D9`F/-k?&?k+:al@?\N%mU.d!m.)A/; ]B3";!F];m,54b@TJf2:gStZ=#6^9"G<V+U$p-EhEmZ%.Jf/NtMj,DE:*l%b+^R-![P^7/e4C+s7-? #_>#FJ0[f@""m6^D'/uD5eY]N_U[qeH$^:)PrF7tR1(6BZkQ,#%a:2his1;=ZiOnAIha.=!,THmd]] Gq$;>NF+XR3:97B;1:am%P%:O@f"`=O"S%Uk="*jN#[/=,"^oq=fAlN3$Pqn+bN=^n&M%>[RHK!p?i 0*!1<!;']805879Da%<S4199d]Z1_"TN0i;L5`]_[8a@kV'Mk#D*BJ.2)/0h%@HNG%\O6Wdl^FB>/V jn?o9hfN<6OkJ)q:,hi5<pD$+N%P05N6,e$slUo[r[j;=d!Z,mH+:SSX?'[H81=ueSB>/Vjn?o9h2I (@&#N>_l.3sbYe8PYd*f'oVb?Ig5M4M[sDkJaT!eS4Aga5PoK"udEIFaZ3^g'\9UmY!JS-9T$M5@i? eJ`N09:&$&!Peoq^crqO'Wd59>>XjHS]>5YTJ&k<K#!)q-:e5j^jWr,]EK&-V5u1E_r$b*+:)5nD1X Se#]s5/J9B.Mh1Q]EdU5m`#6',k@%Hml2ka8T,Tk-sU69mB5QR]<PS"506r#V(Yl]FVp*MKX4kcJ&U <*HA4J)slm]plaP$:13#odj*%#G1m)8H+s;I'IEi$I*MDlpe<hAlkW+JUG9H2hAj$sspgUjZH%UmY! JS@*&#`]lZ.eTH-G+P/gh%epQBJ4rqO]EK%BfQfUQ#5XK.+:)5nD1XSe#f%kpe`--8<.(%<Y!`_K>E XLZE$;[sdXWG?V\$mU98FlKGub-5PTj+a<[CH-<?c7tD:mS"p=GQmjkIOj^9l^I[T!m(%T?V=&ssdL $%PE[m4kB.J/i$\Du_1U!tZY-!00aO])^%b$\3/IS,u)0?di(@=LtY%lnAE%K]/@L,88jA+TV0,!AH #G!!)]nQn'7D>Ohg-%3L+=iW8Zt*^E<V!B_kR5l@he'MnRHr`kh(!!eSiO8rtpdZXlsP%XiPK*HkTB `OaB"`VOu,Sr_u&C:J))MnW:a[k]_4'b_bA/l?"mSa-G1)*"?5QMuX'L61q!Gm)&7imioWULj^eMI; /,SNGj2Z[S;>C7LPa@lT5_Z\>M8-$Ya"9:VV!&g2Icp(&$LP#^@O@TAXM$1W8jK2pZ!?hK>%MF<g+9 CO5p'V>EU3J1"J80,.X=1-e*A9#^&.ZK/irC(grIY]3P%O$Qa[=eThF)$qnmI(#:OS'#!'V5"5*u?^ pA/k8J43oI@*LNHs%i\t,f3d)O>7ON@.)K[2IAZgi&U'Wb^_jLr\ji$9b1>,7*(<oX+LDfOh@Mb_`n b6gg@BZ!8t!'),3Is('(jq.2W&)X[Kd&o_dgPc;.88:;Y'K?T`!-Tep"0#Jg;FR!?jZ_<p^lGRb`Z5 LKQP5Y>Z\ctonYB$'hc!W4/^JFsHT=<o$iq\'%,,QPXW"E<d(*PjdWKQ9Rj!sr_F!5,Fg!KdA,.g,6 C@$TqhRpO9"!9g,?"3FpNLaAs+nt>e1IMgo"J3*j$A4Zlb3]mB]ciYDV9E6-U"L.bs!&27nYW?"h!8 '<D!K95^^t5dk4=_C:p='+f,TVC[dfCF6*^EW_!NZbP5ge`q!+6jup$`"'b_6-)Yf_V!_9;rLa#j?q 9H[[T#Ydm(7rXq/J=T8-iar$]6N[CO!0ul-T!u!*4=^e)rt(@cmoPE:_>ng2%"Q^C!4XcnJ.KE;493 _A"FrU"!3Q_5ONc3&]-(0aX,g\&;a5:'F:9#%o901X58c`VPQ=ks^dgo1!Bc%Wbd2b]1+Ni"nDaLNA _5eLlT^UZ(d)+;#D+9*5k.5B+=kYHjNo_;blLB:@"[Pe5EkrJ#\jVhi:l[=&-*#5!,r5+,\eI,U`g. 2\!Rs*1BCks^p>csLa=!*p@S1V,_186Yf@-'58XB^U]gaYbQi["KE*0PD\<$QEntofOGO`I7@sRAM< ;H<".SU2<"=;>s%kgLm&s9Bn,^lj*rmAR!RN.DCj:Ig2%A#KCY1Jj-%L`u^m,0*".02\Qt0!<PK-K$ Aj7<J*MYG#JGHNinc@e]+$efS!@0oQ^a0WqYT"_cS=dqhc;5#W!:B_HdRg!k4JYZtRUea<s!/UMa3X ildG2q`L]8?$e]\$?QP9Fh?3?9$^.tc9rg,Vk"[\EM.u.5<!5K#i1r*u3JCrqPeDNPin$hOImU1[W% dJXl-.;pgOQ%u&5VVe\V?A%D"&M!3!+ZB<Ykp*SWriHsL<Vs:;WDe\%Lik4dANFZ"Iff&i0ut3_%-[ ar]gJ76Nj'870'f!"JGchU-OPGAc[Dm(Vo!K!Ot?25f\BUQnfPp:QbaW%iN10O9$&D)1_^Q!@0H>5Z 4<WBI"RJ7WPc`1(*od6KRE[#2Q02OrsbABIZBlDu`3<#[efq1R>`!_Q:i'504_\c-0Q<J/\STaWUm# -FfU[!/aJl!2Np5KN_-78^IH*$0&AnT4Tni.RDnS&T[qLK"*DJVcahP>u3J+`#M%,&-5SB'-IH8!C= Nt%9NH=U)b+*9">^4gCM(pF:lTR>+Pe[!7Lf]^]VeV1lr.lq`#/V$*64\m$a3V^oo.L)]aL'S.r(71 dGJ[#daUm(01PBGQV0m>OXH$Rqi*-/rcqA.tE]h!3?1EK*knjN/1=1D.Nn[>)3Oli-X*0=is:C-a(G KLQW\o`CQZ;);sG*KsoD1)+#[3H_rOZ,0nR>J1<eqiraHq,:NaX6Y\jlA%^/l77`8#.tNBsJ6#,`qu ]dsfaeP5-mc`\:a1_(]u$/4>EOMUd0K``>qKcL!>)rk=J6kN;CPR@W.6GO1Ecu!UY1e=C'"3)^CLU# AQh^0!"?A,D1d;a2TuF&6/$i2kQf2NC4nk<!4m`+KKqa&\j?:H5aMM_J[g@ulN+SJ/6EN)s#eD<mS` idGX<d"(!QGV3jUO#o/PMW#!`GJY.UE$+>JBr^#4DbmIM5/dB!7cU]`l5-"&ES1-WhsaXN*J!5Nua9 \r)R^h^!jA?H;t7if?\8"/b&![_/#5/JaV0Q7#t!#!BR?pZutmVrVG!$=I(_Mdn/)1\Yp*o&4JJKJa fhZ?d95>Z=)eqh02@(EKBDpeqe#b9-1#oI]pg.DT\#^L@4r?\h!@bipI>S&@r,8IL)_&e#BT)c7cSV ]TQ9EkS&!"\!RKEc)-)]9%uJ2a,T!D%bY(Edg_!Gh`N!+4DO#@n+.5jk&[eGFN/Er](O9J@Z9!9\"O ;?6IrKopg-`7-A'ZLhm3do+rmUFjAoRfb99OE*&!'rA$rEsPkc9S!po4ba+$h&.lF8InjT[9l\j0&l &d1fFHH[m2D's7gk4!H8_S!c!6Oqb.l$,/V"_(>P74J^aX*ALSu+SgZ*H)Mh%B<Etjnj+)ba<o'nq! 3VOecm#D2VS\Dpgl8?QF%dm5gXJ,%!mh.5^n$<I*_^pX0a4&5.:@ZD^jq&k+]`Sg&tB%6ik8fn%_+% j\LJ9N!L8pc3T's=&U0"AMM]?&8j^$^_,n(n!?"3."*?e4TKOb0^-F-u\AADL(E?hT%_0LRZEuNK!8 B=:E!E+<n;:Z)TJnqB@S^-Y;n0+<X1\Q#+/Rq.S8DS5s6LGQ9C?'ZPVJ+3T%bLjN'Ic,=!I^(^^>Hp hLT+cTO1D'ie0DOEZ'2=f5au!9-V.soQru,c]T.W*SR([,,Lt9^fRtm!?"3NO9U?Fn.++]D?/aBDD- t_mXU4*D:9lJ).;;^@V^i$i"!\sd,8Vu\C@=6Q\Gcsls]\):_aR5`.?qiL(>7nm\<,D[=hZ$F\+7tm %,5K.f`r08dAl4R6VZ!J+u+44ksLM8tugqS,cKR',3u:MWSB;jWisqL]J*LHPMs^_@O"&a$G/Ti\(Q O$!9I\Q$2W?K0!5H:!pkm!AqFVfcCgN$%B^$0`M&`T_5YF!IuU1HU`u+a<$'H$rmmjGhm#[;O*ue84 e[H;uk?pd@jX^A#c>-?VE?;>Q=e$!>.p.o6M.h$D@uPEMirnUq):72#rd>]6J18=oJEm!*$.'GJ\.J #09aPfC(G3&_HIBSa[Q+!=Lr.m630F(72[)_0G#Y$ua[RMcu6'X>*An()`F?F?kSB_*GIeC2)7[Tf( i%9T*-UE=d4L>k2?u1+dMIU8>K(&^VR;62<i8c37<CpUCS0%[IJAn0X^aKYV)6$qmdM5bdoarrYE0U C@b7YBiI.ob.9,!*GbBnH+9*>Q=a8Y_2%7$R#JZ<<6W"!?;,6^+"0``CV'SXqCdA&@!E!!#[_=X96< K!!Gnj!:Xqs#6^G'O8qTK9S1Im8-0q@p*.9[!!a/IJ,n\n&jU(d^eo&-BgNRET:W<D;Bl4&*a?@;$, FIs$SP`b?r54M!+el'IU+B<VG%\:**Bm^X91k'?s`E&9/]4FWs28mr<N*D#n\d%J4QI)VEtInl'MJQ Va+78=0keXEUgA+XA5Ip<Jqt.J-toeJt^?@[07W]47F-03:Hr_OC(bc/<^'G!(>$j:m(lF#r;in,]M R87TRk[&=?$;8dX\mi3ia''O3D)!g\fnX<O5IF6@015\Qa1B@#^*Kb?8#'_DW,9khR8B;UBKg)3S[o o`;\!7B.j8E:rB5?84Y6;n$\GFE2LeJ5o<!B:;h!Css\5_/q!dF8H;,Qo/s16GrK#>4'=O9c\n6%K: S![%OUZQQRh*!++a<ZORloFEu:!^OU?#/KbiP"\>7ed,m_i15eiQsg)".LZF])T4)#'2K25(r->V!< D&/'UX\#C/:6`J.Sk7=dN^mn`1>`q$kk?O!0>KcS^?d35Ro2N2[?l`@2*h$UO^.%Kcd*A-N;^M*t7. (=WM>9K^+B*=?^Q3@.)WPW'S.`LR;D"+Z1A7N6<n.ZtijTTPP:^VXIq"B74cfHa&hYQbIHfEaa9Z:a %k#U9I0<)Ef3gQVgnr%j2;_8lZm$,<bZCn"rlV'I?j0`V7d*C+UX#@s!.NN;6=-Yo.W"n4gIDa%`$0 LQ$D0"tm0YV,tgp,bSGPstjpJ:J&50Xu8Q44?F?kQX9Vs',Wq5L:h+D)>nPd6`o8rSr\HGrfucVJ`o FYC.U:$]cQ`J.Ou8!;ot"\0Q1>%OH\=!/*Z]#U"^!5`9Rq!R^rL6+<3%9'JR'Ls#u*)A=eXR0>9*ng ,lugk*2!JAH-4cp25!a(HYCbfV+aiA/V0f+!6]F$F.="DKr,f`fEq+<Dd6_g5HPF_lA%iKcbP#6n$- 0b$>R0`[.FW;o3")-g!uPH6eEZZFGWK9jlVJHf&[V+<,][*qj`mc2es?QHH'Q$*VXf,?G!2P=Y`MK[ 7)XR1%9s!Y^6=s.1h"qDdSUV6A,\km:KXsH>#;n=<O!#lOrqQ-BH'"Y#!?pkk4Pp#:\3]i<gWmG5*N (a\X!/R.UG`\#`JO'L"],@%SVPY##lp(YH8?LkV!Wqos68cX`&o,Do"gnO76[Q[3!!!$CFDDd9e"/D c'G2XBUOEf+7@q<2L63<^*.X-$%1p;_E)C"u]g./lO<=rI@Uj3KBRp`o5n=fAUO3DWK,7DjN[Y)4(4 fiq'l[7kBQ+F_dHCl>Lt4/*cls$5TKsC/(e2[c$tnCjLUbR$!>pCj&p_>`3<1c]d>3Q";TL("/E+3V TWX59ZQ0'o"uL3PMMt61h9mPnJ/8>s/Ph;Y;%V*dDH0&)jAH7/"CXA!=H\>8'3uip71Gt3K`R>ZjjG Qm8DU,*!`]?=;':D./dR(8!Y?OfQ1tl1FK/\@ZBGn(iMGmX0:<%&)`c2OK"3o%$m=J4QZ+($'DcSb$ YpEH.,k7EiZiU<QlS+J7M9A'c[Qs;U,2ohOhg`Z%b@^c!/TPpBuk%M#d==0"FpJHS3[UuqkSW[fh23 N91&db6W9$)5pc%'BMFlr79hO@4s%cI*rOPWFk;k7QinX?3RUKX[$#n;'+b0b8O:\\K*9="!R['%!l 4KU2Q>mP;W&c"4GXh*@&PS*#tneQ:pXo<KrP*F#,"Yc,])rZ)fJP_\$3]faEWi#@@Tl6V")E<!945R &5Ej+n:m8@8HRP#!]'bkO!t@_(bgVuLR(ChUIAR)&Klu>c<u@7\BYnr;1_La(I0d<TJR2h#_u)V)ZV i_&.McV9'Ke2R1,B2"p'\`K[>hFn\uGY5QXeKZ]Kp/e06;8C)uGkZKTdB2bnqY<]oRa!+;QF9qmIF4 u<lPHsj@cdmQQNk6tLue0@_mK'N&O\qU-:Vp7V(:Kbj@&['*I>(OT'6m*-FP\1o.j$A4t!".XRL/7\ M)?Ai[#,&X[)OsGk$Hb.H5fNIDE[Uq7g'E8ia9VeGYepi,\_rHtV?)cl$M;8UV!+fg$0M9g#k4,k^% $_nr:$16d`.?c,u-S:i)=nH5Ta)25Wl-P9ESB*-l7f^'-tYc$5a^B%\0>8Qa8=VnCtM"TgEj6OFp*+ &c`/"6DV[++Z#QRh6m0I!;+Okk!Y@6)?6$(!="uq+V92<6_M83fq_Uj*1(RT!%FG7X7Q)e4V;5cbnZ Ns2d".].efnif@>pNOa*]Y8>(F+"$isgn:6!2TN2PIM!/5K=$S15M;84Y+ODPiQOH-sA^mZSbSep[_ 5#H]o`bih+[`h-7i$Be8)4;5N*uUA*c?N4`FeLp<G,HYpWY>k;NTKal`Q4&Gp?+`"@WF"@A%dGFfRk \KY4`sei9>pY=52E+UadlAMc<SOZej[!+=A93$nV6YbYF&!/BjmUKG;;$m@m1=Y:?'+dk;[(uY9oeU jR]k3)gKW$OhId&/t`/T7!&)[*fE8>a1q"^B$p/J<137*)&:+W,U"!(clUE5D%83BW63:WT$S`c7E6 K``Fs[)`=lM3?1HN!MZR!'X[[S_Y1oB85UMYi&dkBEdO53C(Zp'7eLKXl3Xk7a;%-oU`,Oeh=6M!!H .BU6![b'JVn;:1+8G=Ib3W)[Qo+7"h9VrSqf33<8tco92gQkARdi4FZ^P!Y*uQ:dI,J6gcmDe33(q0 >Ki^oW0YW`9.pA9a=4oCV^rtkm;pZiTWMub?$I2WeEPKX^[fp]21"AGh8nF/V$8/<t56:7jpbO',U] o&6n27d1K*(gM6rsRn%b5\.K"k)m-/V&O$jOcnh6kFX6Ti#<h#XR!r.fT(E9s5;6rR4OY%_+<]XMoF 8j-n>qr2QBn8d\/%Zm/sEa)*UB;$LZg(<n_#q?(tDT<$B[S3'&Z&i(B?q_If]*\E+!>]\-;l`&1V5k -mAg(5le&(!,V]?c,KriJ4!)9%gX9XZN17C!!Wu7"qCV;-3+72oa`To,9Qsj4<Q"='j1Mj;%Q_/2BW q_!!a&@!)nFm2>C]s_%nsX#Yf:a%,a/iiZfS]"pcmam][H50`l."')(L@r"3KD5RnIH)HJQn_!iJ3" TY=u>WqX&Yn2WCJHA/g*C*FG2j,C`!<?MP,8j=55(Yef!<S3f'a:6?9nF/ccmGI7=i1Fi<j;WKcm55 p=:uF)6MM2,`<QldKiX9H]EJ@G.#A6R#4Al7+Q,:G0ET<<&jYB'r(n37O:S4e*$E$PUBh=+#R2]m@/ p9>qu@UV"ThP_L+gpt28]rG"pTSp)7l2nOH=)]+Y'Y4!2M"U%"O5=#`UEd"EY@d_KKf00ESQ43KBI< PTUq#i-jYdIMrt>/O1XlK+;G>!G?o_/[-0$JI5&%IgD]s"3>VX@3Mp2(ku]>'JP'3n;R^(#?1m1-5^ ;"J/[lS&-F<e#3ZcM1';/S,M8\1%PWF2d"%0"";@1K&A`eY&-T'o:_j$;L`cp4&.$)P?@]6aAcP7[+ @Yk`D)Xca;P8:nkp&Rr!YB<b:dbM+i/^O*5\J&$;[<U=<$rZI2X"P5quQjCTTl)]!L3<a:730D!<d" "!H%$Ed-trsO9/EILFr'J`+Fg9(JQNK(Lid6;dbnDP*SO>*6/XO%e,cg+I?c0Pqk'Np7Y$VoG+qN<. Aogi*oOl&-sI7!,S;.FDq4N1Cf"5%=++o2=m';&su3M'#h)>:iU0:Bc2HC'0$[8Qg'iK_O1L^%A7tN (nd=o#n1in!!AOUU\U7s@/t4r!!WuI#pBD_Qtaru*AF]f`H`[b0EI]MKH]gc@Yn.Z!C[Jp6NCL")H@ n&TEboL#7;#"c6<<D+>.Lb37IF";S\VB+IrlsJDLj"58[N9W,Zn_7?.ZTn_#8\Bi1+\S3B7@rjdj/= ^9;D!RRSGI[3q3j\YFP&X-*Am,/fZ:ki)?S#a)9\-PObaTCA[F':L0E6r!0!X%;%B%b-+<`&m2+<+F UDKk#R.aXlh!s__#+t8$d,W\7=RPu\,U5tt!9?(/,^`iJu,*=`XG/?SFW&*0T'#DS!n0W#s6#H_-S' Ude@S)#2@;9jO!Fcpc>A?"Si\ughRL6s$C,-<m3B.m#:)m/O7WW_t`GJ$kUVc"4!<X'pa>-G.3"'5o 9EkcFHD3RV&G11#p36csYU9U?&C2L#".0VVBH\!X!X$LS;+@NLH=fO3W>G+2W+_+!#\%F3![Q?WqBl D$d/drO!2r^*@DEQl.VJ<=B@c!h:#loq:`cm'%LQVK;$(B&2&;dk>G:_GT83K5JH<(9-j1YLi,T=;# 8'O,.J089BG;`qE+sG,!kPBC_8--M24Nc:Bt0Nkp^f<Fa)+cU#g\8,QB;2O6`m=DV]p[e5gum^QN@& ]*WV9)G![H^+97V3<(k+0iS(KUE<gUXN=!EEX0EeM6X#UsXCf#"(+TF.oa!tFIJT&%d5!<(i_]R3LF t8Xnc])3"TUpJ%fbGtD\Z>pKpaRp<W;Je2=h?/nr4PlM9mPSp97X%YSd,=YSH[L$ucDli=V.T#>+uL 9d'`V:_X],VY#]U^Oik]AebOn#J4SmRC61a<(7I=8I`H[2Zb8G?j7eTLO#gCGZZ@-&.FHUL[#F8?g/ e#&7n!4Wg7lSOmso)=[6%R0F"9oN:aUB8?;eVG"^!ks/<:p;AZ@e\?IFj*5V^`l"!X_&eTC79#1u]5 lr5R$?;FE+!=o4TGB=,#mnu[*fppQi!6R2":;=6&<IGA+:l'L%(](>$%W,C&A3pU!S1rci/eK\hua; 5!6G9jiO9Sh#65,S*XA>C$#oqZO:VW3!=;U'StL,dTQ4S;&3(ePXufHb+E7n<0=K4\WmEDdcnCF+08 .\*f_[]R0abL-#J*P4\pK86TE.l^'Z7P(ofEda2%n^^!6WYAT[5>Ycn@H,0/V$/4#R_I3tg:0'$%7p ,(Tb=_3gdW&/c%5+%$RM41uQZ^'!0,)W8<KAXuR?&f$oJEmQJc)Z[mNEbVq&4U``s2?BoF!1?0/6/2 L;#QPm,?QS,7W%/Js5eAMt0-@DK.TaD([_^X-.j?,B,,#;@El7u$^]C)<rPH/kTaqdV!YT^n"(f(HA Xrma_ZN?H!arSA`<m5j%nbfq$IOh:J,n@T`s87@fdd9[CRk]l^]uR.0*).]JH.Wf!;H@'P`QF_OM2( ;`mjlte/Q-O$_.Uo^=8(\CE[%Fd5cHu3PNj#9C)YWli:d*!Qk3WC4$%O&A/nm]J:&2!"8iEOMD]`%4 3(.);kZFX9L#!&g*=P)6dcm^rHGZ!@"cLKNud,>Koo^]3'$aVRupA=3\[&]@q59ic)MY>g528!$!*i ZMVH*Cs5R(&fmVFY:BXWqoqg9bVS5(*oP6ad*!>^$d/h%c]Z$dE609=#VM:S+V;J3.$#&b*YkonYAn )/_7UkR_&JKN)k[MC.h/[4*e5FI/dqaM]5rOs&EQU!(?>KA4]!)f!*#W5bkrCMK`U[N_R]OuL*4)k? ,[,4^&Xf6#n[1>*!,jS!VFTL,-f&G/-(dE!7lu-G)QGf/^0`X]1>*#pi*h\n@BS:!<Qh;chd_[/HXZ X!!I.A>UFG\/-5,H!iE2\m2Q0X/H@_'!$"-&^e"RkRfRO<![@Rt%fIr?liHFbF!B#J!as@TO8u#f!> ;MC,&p19pXKA=Ese%:"jk'h@)iEN]^,:7l__bhVT0#d!p1`M$:)aS]E#(H(,?:!dgH3;OOW85!J"EM $/kn'*<Nh]6M,X*.#\2Vg]<S^`':m7#93b;Muhu90h32bBC4"C&ctZ;epsL8%IhN+<SS)B&sai`,fI 8*d*3h(#71D3#s87V9o#,f3\jA0r_*@g>6-\])Wb0(&mYO8N<*oJbg4H5,4*ULbQ4=%!GCd#cO0dWr @T8paoDtV6p8>]E4`4K!Jhj2%3Q:F9E=3L!29if)np3m9m$T`!6<Ie-IBF(r;]6)]8OZ0l06K[liE4 7fEnehhi#QT[qHORh/IcWfh9R*nDPO7Q5:[]$D>]F&-4X0EZ$t?k6h8+OOt3hj:hU7*T4OcEPrqQ]` ^C3fdkp3QOl54aZk^aep0pt?k)8i_eT_^ZS9M,0Zc,1!%4?<8"9S6I-.H"!1++7PH;kl/-2X7irCdj $D?)h+M\lAeIj5B2./Vp9[*nf&mN$LC[JtW5j&5cj@]aY?dLfJN9E'[&:0HM'X5Cr]Ss$=^_3<\)'I cX&B#\V`?:8XX=h:&:urQ;?Y;P4\kC#5Se+Wc]&MNHC?tscm/^kAl<1?Mh&$2[c><ZV`WLb6!'gg6J -K^Q#A)hGC#B220OJAk^iE6V@NZh5:^;"@#AeAI@_`1V0F$jgD;8ac$Qp&mnCZ?_"`HZp9iqU35R/D s?Z(BgB>=^iE!LFa!!\MRoQ:@O_!hgEnIeXf!$DD_5R1ulM?bd>%A3'$0F&^3nIoj2-P$8jT^lY:#B Z%3E5;#sIg=98ng,sph#6ge0F)e5#&Nf!/>!.P+7q*[#&/#\AM=@2ORu3GY7+23,B*3jO9ZodoM@46 <*omc/I#WK"sD7sDr:gt?h5C:!b3o6,sV[Z@0L@adnX;_FE$stT*09Z+[t<-7DK+:;"J6`ni_I(3Ze QP:^1DB"tVtCBl=2u0F-u_nm]B.'#FcI:ue$P#9%1X=+JAC5PT7qpgfNj$t&WX%gR$7#'5n"mB.4(J -LrcoVrE'XRH"i:BoT;qi%0EYO;[$rru?h"t.4UP[=W3!!675!b#I@Al&\A_!js'#AS8K>p&`]+9ui #p#XKTfM;_*ci%,KoA%UeDihjQO7Hrq#&Z[1/2-[7+C7.5nfX%_F\i9W&HlSt#?*kj=<J$:!@^8;5[ P6[!D1'9k^W_("Nl600ED@D$BtQL!;Y=Kj(j,<c43O`[RUPOJeKP_D'6il4oeFIH="cFHn<VB-(-m2 h729tRrn]rNradtL=uV-lN.&(X=W-WJ%'L3h)_KR9#99X.Q1pJ_uYV?0RO)PJ=53/D8=>+>$8S4"U( TMJ.Kk\$s<th#nu5/3>7SN#!M0obm0N8.jl&L_MC$>9kn+MfojEa<hr)KW(-g&*415An.3G<$#g1b^ ^3O5MP15b5kJJ.H:;IO5mY715X=$W#7pk:kTY!H!?qP-0aA<k&C;)1YSbs-oDo&R,1Ar34HY%'$m2, ip],Vj!H#^W7=msZ*i[1ng_jP^q0($k,\'maeqo%`L?J\($`lW<+dd72D[5\KP7Q`*h+fC-_#TQ)Ib &je(*fIe*0R]`7jPmb)$-gH)'XScKbddCK#e6]JcRh2f.[1m6.%tT#QPB$6R=,j>JZFm3t/n+E'm5# Wp0RFbQ-GF%:kb):_(Gf/+<i.E!('sq*ZLniE:bepb3Y5!,e0Vg*&Kk!Se4i3$<F4%8?g]e,[Yq)7" k(A.P*Z!B:Fh+TV"aKa:hK$jY^H*?Zgd!#3d,0YrXFFo\110S#1^4#0H"lq@gQ#F*/j=Q*5R$j%=V5 mWt^FLVHciZi,&PKYA:#TD2(d`qnb7]lh'1^'I"!3uo"=G`W#./q/Je.`S5!oO;QnNFDm6Eh0MOoV- e'L;i6!,'[ngB7]$/3O7d5(^/:!!pDCPW0Yu-]S2,.)RaU#S8nP-CC<VW$D@0#s-!+D1WUh.'8""i4 qba!+Fe:FsPI%!U_/J)^q)KrWoa8dhgaA3Hu*G0eToQ-^,G&KL4aY&dJQ,7Ed.m//A59"f,#WZjG4f )F_MX`)pdE82)(c0KN1K%,`+tAtY),@0>2M^g**`O:;Lm7M=&pn3Kf[N5ffgL_c+<)pNm5#QqGA)@[ Af5\+8n'OZk2+=&K<n"[99(:Ru`MCC1[J2Z<e>f/ea"1Q[u$%PmKL*VdtFBSDcQjh$p-lWeN+92FQE CXQ.Wj.pD>oV]&,/Ae@MY"0<6jL0)/M@-]!0(o!7f3p:gk9bQ20#@?+94s_]BKp7YrWfE9N)Ls9L<- K&X"lg-hBk/I$S=0#P9,E\:^9I+?5Th5QM4D>c7g3U)#SP>/1+FK!LK"CD]t-&JF:4p?G#*&/HAio& E+$#P\9;"G63,.K3f\\TEoU&:f9RTHR%O:pDT;njqaYh8(42Uk>HCRh//c-6VOkquI7W)+a<,>Y*dT -.;pYm#Wh"81que;a82GEjS6#Jq`+b^4?f^N\-?Q?h"<@"=qhGPTkPP0GFNjTWNdnPUM/!pb=P_!Pf c0;\[pg(Q])N,oEa*$@q[Q!"!uYlRi0.!EcQ60S"<X(Ae(69WpAg(]qL1RlDWYb.WIo"pt,0!,-(@0 c7_,R=G<a5Y1I2s1f\G";oK;lp:Ho*bQU\YXLkY/@VEG0Ig02#kS*P!<RkLU]:MD?s(D\gT_M0%C/Y 5g7\+pKFd"3KM6Mn!-R?N!!%.l#fL:@p]1M0?;\P)L'gJqY1,-f!=Jl/3FEc%;RL!71-d2MRp_<]Ug sJ`QTtX$Oq>X>(>]$1GRA?h%4!*Zd-NfK)rLcoU]S%,.W@$q!!?=ABE1(u"=4WeX,X:CPogY>F9ric P3+%uJ-/Z!A?);S79;N^%L\X+m%K(5#^Ec:#L"H]5tWDA`?-s]N.<oS71?sXUcJZ5#(kBf+I8=)4mj :9!!M.UbG6pB!,<FWV#^[sVUZXdViUtu*(FEq"i)S"'53K1"A"XT%*W:3@/ss@C+954":2l#^YoKlb 8#m;=fKdWJ=%he$*4-nYl#+6Q<4,H?icp$NeHu2:\r&'CM`#>!!"B*+Z)VSq#UQN%ZUR?/-c/A#7+1 :"X'@e&8q!N?5`iP"tF93.>/;"^BhW&,6/R?!*Bd6Yg!B&4<":MC]N6J"JumWgAoT0"+[-UJ1NVZRb Ih(#m8/Y#llh0!)B$a&=il1VU6<=,MiR=<tbS29`Vs1M6keZRK*=t"(f1Q!:_03pfW<83!,7c3=Uho ee23f:gkRLPm)\B('$ng8.]hC!&t.4'Gg`^>6"Y6U9\,?\,]pqn<n\UN?UZH!<>@h!0#W9.rG>P*fU DeYf$N,2^2'!!-tTg`mcZ16UDoc)_:tOY?;YA6<pUf@/Zgr"b95]!5)ch_k8TS?^Nbhg+P!_/W?AJ+ aa&A)QLS870f)n5'/&p:][4LQdGYl3"sM:NW^=O!#0*a$iiYZNo_np^uT7h&A=W7%YKA=!Kb_p=THM C8n$*UJ8t8t<"=49F!KaC"ApSIE[%Cnoq2FQFRmc[d,/SH$S29^bl@mO=r7VTJ9WREU^i$':]mrhI% aG'AHP1:quB+:oj"-&$NjXpp9=X22A/b*&%n\<i!hA<b/a#6hp"f@'sEd0;Jm0.6p_/eUd:X[,_70O "PV-8!!*h=%CeXtf.S[(-68cfP`]]G3A:]d5h]u[FeB2*5#5T[0BmjW#[Tb'0[eB>#38#d\-#*:%$\ I]0LGq-1$*sE'EE@Y.'QCg!$!Bh@=[>$4/mGtU>?jq"&P&GN`)#/dLnk\@&.e8%[=SkG:Ut0-s`_N@ +>:.=)&#eW<Qm^[#^e^^flUk"$d)a#\egOVE57N#-a[=:_VHFgB<$GQ4Uum+bTrZeFK:q0ouU"*^O) 09o%Jj4[[jqkF_>ZIW%I[Vuc.,9W`"p"eQ*p-Q,5p_#;1ZjkHV$&"or8;!LqEl:SYqN"cVp!IfeL:9 )H7W@V&?K%*%H<"uA-CT(s_$uio3B)tSqb#>=8oSA?W[q>ueJC]@Lj-8Z=JPD8)=6fG<W=bCU(:]#O ";pA75QgXim0UN]E:uPr\[,f?1ohBi\nVMg!$&4eH/Jj"5/p)m:#AsqX-cidCper3p^A<*7=K0JWfj uLpJJ8sl:_J'!1qbmkI2o(.dQu-eMOC#S>S8P\nTi=IaODWGuV_.8TUXt@!IEfjDhprn,h_P)L)?/% g:YgE6A#D.m=sRV)0@Z!Cj'or$lG5HLDBF@aY:=it;DM22$/r%89$n7oso8?VPmi[C%d:)AH0:5UR: q*Nub$=&G7pPc5gj!m9s@r6t/X>(Ih`9*eLIO]$`aYQbs%=RE21!:AaqSiTIKJ<9p6=+HE*^bC<0#c rL"XuqdGUpORJ8B1_D.t%k,\+3Sd.UFbW!N:PL?jegD#>7c/Sq0Uc'fNlDdN5W$jT'tqGWRe$qE#&& D2J<</HQI/RJtYn0F+i(0/WhE&&bJMDF4DIB0p!Or=kdEJMD+(q(!d<!43:;$jK(D">jgiQ$Qj]%Id 6u]40`36:a75<g*le4!=HoXHX0jmFC)/J@B+m)/7KfVfW[@=hod'@mr]b8>=0^^)B<f0EJk$qO;Cmp 6$2AbNWV!>s]r.#ljr^fCX\kh5ltG!;HuL$JJ.Ah=,+Z(i"msd10?Bd*`9'!K`SO9@@.p.Z."2JEE( &R[+1rcU,6]";h.6AYI]45qu8Q!,A!d"TYM[Lltqk\'&5t^Bh!52KJfMagPm]S\^]$#%5t*>$/s`-g aHlU%hUO&3O/Y&e8$;4TI"8eM5eYn6V;q('V+bQ3RVE(RT#5)QM&jr_<G=\7]#7#mdjP!"a8'-A5P1 DRiI^S$`J$F`Nsm94!f6$6-G:[[lDVA[Q@//T^!]lP'BL^eF'4Q%H*m[riD>#$PLU4Ol$mq6gYI(ok #2MZA(YY)TsjD?-3SIJ_RaD8G$gPB5X8cUdqQ#Ja$.\EuuDQ<[3dBG3Z'!WWS:fCIQ[LJJQ`S;"I.\ &+urFd`;PTt1-3"Fu4e>]u$FH)slD\JgHZ!aV&3F6/h1/\2\bQF5Ka\@n8H!AJTi;urdOJdZ_9f+#s 8bmieJgTCoNlDVV>\]2&XCfa:k"<sltI=Dtb!A[W0.O"R/BWZMUT_)YlB6nb&5SHttb-/^')[0W\$n *`-U'`$`'nD:e!u4(ZfQIUD#q:D<Zu-?m-<1%Bbd8Bs!i5n`klLRYQW+"TK)h"]FJ7d/;@$[t?IAhX =<k#Hdq"Behu/'a&-D3K"J>`l+>/dA3'[\(!/DHp6QdNX^c5`nns=EO!X/!"Ujt&D!tmp4QifId#Io ;:qWR(6ic>-4+RL1Jl=IR5RDB.16XU4N!%ST_>QD$f!Hb^QJ,h!:B.I?%1PA@C@LBjmhuZ.D'd.sXD [s"%nXB[X0+Sb`V<HA2J429`W#%[&!0u-m+T_'_I`\ehFTL]M_lVbhC\HV'r'^_Z\,P7A16@"[Y8-9 98O0#-b@@2.Z<&r:!-/L3/q?grIqo3C!5OP*'?%R)&GOVq-<L=IBG9$+)XqQ$!=X32KIks,!I5#U>l Yg7"(K'651FZ69]5u^l[MA@#qKEj0iZV.'McLJ<^K&8[HB7:TD5_p6e.db8cTD):+ZI5!<D&0ANGB_ "#_M,YS!$LL,NCt"oooO)uot$n(d"YpEh%G+(]+9-XeZrRna(dR$gTd%2BD(D25\g-CEJtX!)?J"Sb &6Tb_;Yp1e/K@"A@Z7HP5SN>ke(lI#k<!"#pu4C@ji_S[.]l*G3gmr552.)Z+YL@A?$Mbeg&!2*WQD /"rZ)HHpHW=I]<18-_(\ePcB7=lf&E*!#>'S/]"e#ltZ$GfL<([_;(cj)tU"A9Ndm#o;`)RmnM!5h? a!!!8YXpPq]'1,l"$RlpTIC%jYM'c=`CN]i6H.h21E;dX.!%:M!-`r'[DV!))R@S,F+oqor$et?8C% 46T`s2@&@^pQ\c`"%^qe6?s,"q!R9T^h\-FLgDTa^rV1ouFE+96)mk6hb%!'(Gfkcc)I_Z2q45Is]3 5Y,90og'H2!"@j]%#YWN!(b$.?kEKk7f8,eET<M+U=^(\!)0JN3Uq>&#bi.ZWs)DVP/@fuTFCTh(%: 3VlAF161R#cnR0V$t!Up.nL.5AIhJE:h\-4#&(;Kro@10l$.Y+4i!)=Nr2'4VK!JibVCHbF]!Z8=uf 6ePl"i/54R0#pR$6XY/>trnq'#:-GT*[cS-%N1b!&Rj\J7JsoX!Ia2B%&S>&krA)c/i]GT8!@")$3' 3#f(m5!-sJ&^)@&TBbbiT0tGdqai"8_W,_r`P-$]mq[u9uEm%di2Vr&LEV=[af3p`@[I!rr0*-4rWn [W*A'd,\8NC@oDMD?!j^)EA!/r]95g9_Q@5@oIblEt]"!GAf5]QD&ghVOJ>4-OO*pr^5AHh"1r_[E2 !%cscrEeEg!49*7E5N$5PV[;/8)=jY;+:P#)Ze$""<`=/JE\ok<p]nFC^4bVps/%[!8<n4lp_%aYMl `+f,+=<G7+EG;i_*4r"T5.>6$p*<D"Ne]?'e7Bc*A:\Ns%@r4mu)#u^E@)1hi2&Qflq@#f><g3If(6 <uhZI1TAB_i=WtD8IB*(1#@V0N#=+#8I:W'HIr5%q(2UJ0Jr-$iim2n5WQj%f$]@7O6d5#QP>IJH5J 0%ff78,POY0+ojZ#"Q*/9M.pi`/0f\WA2G!sOr/mj+V,P.!:VTTJ=aga0H^[X6r[%i^B.!q,:3;2r% u=4=b/V*(EME'%mj<N!uFgT*=*B+@1Uk^_G#e#+X=7N:Cs>@:p>>*+sBeolCr?uU^KB%0Ttd;clkpH _t6<lmMRPX!/(qI#mZe2'ndc*8-Emo!i[T#d55fFpjgT0MJrP$@"9M]2./Zf4@<-L$e3#p-sRQU5H* iP+=l.\"[IgbE/4c%=o\i2^b?l4!rrW9![KH.KY\eH<f"h>kTbrE#upR!O;6k,$fhl,5cs^3Zn_WRE WS@f)a+N_UumgH18%A2J.e+[U<uSPJKc8a-A5A!6q7=R$ijch+TOUaCXP%P[/FBENg^+Oe^gGk"nE) L#m&JS\Pm\]p*Oj>CC/s0bHPO_!:K?A<OrKFeUH_GSIdn2!&1%HfSJ\*T6fdah+4bh>4l;sZiCXt[H ]4)(Sn3_Y#-NlE*`+F1PJu"#O8CiNF8bEe\9a<4)8?nXf]"C2V6M_rf3'P1=lj7$Lh)5J'N04e\$bu "PfUgaK87rRgQnTd"J#FbBp8mG2M+U[dCME/(A'R7$bVL^XC_<oVN6)!":q4jKr3kU1nd)I*j.S'3L VOa>.^"3cYl+.HuQm%^<7s_(ci</!2KE"?^4TA+^eJ7d5f+UkY6nTTV%+9aJ2c7UO(hJl,Q-!uOkG2 ^,Ob8oUOS$Pfc!F[?*;.'j9cjM6b`OhY+C#O_\YDS^i;\C!&eH#jp^;%X!H%]6Tgi'so#X9H6cK(.n B_3`RSTJCP_C![I/PJN\ob6g60#!?I2m!#CY<16E8J1=Qq8/MC[/[5>,1!n>Yh%FC8G]aJ&[)Hkb=r KWKaXp5<;Lt.Rd2lRdbAL7OV9-;/d*btg'kh<9pC?-(GU*o6!*oU-3e2i1"<I!J@=SUg!(Yt"Rt)1O "?ndM38mrsK1g_.mKGd64Hc@LJ?B%"B6goMKEWcaIsMQ'#]A"CW1\pA!'6PUqJ[Q`U`7,]5Mn]k+(, -NPX0'YNJ7TU7#G4=._^tf5ssk`RT^uhJg#"U6^L?"!$VG'$%VT#DF7nPlPK?fV$2CQ('$g@!8*hC^ s^UMO`8SY6H?LH`qP!";-@\s=Ri:(#rdsZ_;q=;&h`Ll?$0a3jVkafHg"?I!,/:Bm;RQtPY9#T-n#` /%GZaLcotbD5;ju)[i@4J*:8l]4A2XRW29VqioFp<YR`">lV.X2>C?N>?76G"^_KBB`DmBJYUT'9O0 HNL")#FB\[VH/n!#g40EP$gj41e]lis2pHY_@SnEg9Z?qt*bGqo&i&hfYG4TN:Aj/RHYjr3]k;KHX! ZGJjbGCL$R!Om,/n?s4kh]@(kD[\>6.P1MIDp:Xp,9ZF5ZaNTSF/q-GXG#,pn+/+^Jc@_9#j>e!T=K JoQ[S%B4jSTOcJ6q\MQTN`hRt_XO*^l.BZ:Ll'1+:,0)bhjM"%94=7u\/J-/g0+nu._:qelE5=jVZ] -DG+SDj`j3Y0)`",-tRPjj>--mKP4kr;ro'HNue(kF_b`"5:u1;3cc9nh`j>,W)?J0[]+3WKAS!+i5 6<.4-^Di0Y,W?NGb"80,n:n^:e0Zs-*.dI]p&B#*]5#;T;6c+pp!3'2qSC#aT!??n*LiF^0JY>8]=F a^Zh1tqj4p!,6!Tr92OQksoVNV+Mr^'k?5<oI4h$nT/'m\9GLbiQA+[Y<?!6H9].!m)Im$J>rp]GPE &q1H)=RD>Y766n6Oj[l""Q8YA+H."f&K.mD!cF&'/!:kXJMGU)iBRGElFs)&c#h*a#SOaIs#Ni%!?c ShJ0>hq5L:ps8-qN_^L7H<KKl+7cD(`tN82,kY8%12)72P.;*iN7?pZrZ3pkT**MeDT52Vp-/Y?&(r OXS2o*u0AiGiOV\:A"ZS&_q<duupg)u6$G^j!64RG>Ytq,+NW[)2tsE1*@()/'\K)GfKF:rF:GaI4. u]#7,(n.89\'RNZ="/QQaE<)TH<gHSsL^#F;Fe>]*XpE(["FpXI"HXaAFHAH+\5a4LYs@;b[6#uR7P 69W[q&#TkjLmJ\?i-%4*;V:aITk;q:7V&kirtcQoW(6##7aL)Q.@`6kk'HEWD1jOb--&DKU>d11pf; l;DM\4*:o-W6*a7=7+(r(PQ\Nen@^Hiue=qmAZ#r!^MC0\k4)bBUBBkKm@L$+&\4d$5fb;J+Sj%dC4 Wt:['CCL5GPi*n%fR9Fh3U(T7<*S">a7JKccOjK'NsoUd2RLO)I_"IoIf8+ik\dB@j`#R-(cpiWj&* nJAX6TFCU]rp8cHskPfqV<:\)/6<.p)nn<,PttXm$3"*8+t((dQdV?0C=HVZZl$r!!^5h(_Gr&rN93 &f,b(-)f]d%a8N4YpXS-JIt;agmb.PuiW<BC$S3,/^]al&$fD*TI_jN\54A_R5eC\'L6i-7gLZ=?70 9^B]\?hQrQp\"`<$%c)[W5i!#1'7EGqBM)_cV)TId3rNdC.DE$"e"O"R+)=?8]Tm6EZ(V<70@C)GP6 "*-X5O9)r>a%Q4N5>_2\'6T?KkD'@o.OR*+]#;^2@=Fk+2ZZb5!klP*?r\rAr^*G7$uIep$4-uG%2] (a83p>[&HDqs^'?9:VS@1A\fiZieB>^:.PJ.HZT+g#aciND;jsf6Q"=eq&.+*ce?-<IrUld@f,*\/* phL,E4:M-C.S*q:)c[krQLSq*Ba`hr.cBJ,Cr8(p`%!.LB)uMnk8u(s7da&+Lq?:hjS<Zc-Q2Is5Om uTKi&VJC.0h9>B^MrJdGu,Q>WBlkb05YPaSKp(N&#O81S]kJ-tehslJNd=;">s63>XG9?<iID,*Vq0 q2@qfa,OP=4YeW@WiNdtqn=.CdP\4K9f]dp*1\rX=S`37)jl8c`l2V$/i4+'1f0huF?+=E%XR'Su4M =f?rH#QGenD=Rd-_/6o@hm!;k]Y]kb]f:XZ2].Vb>Dj5:YVda\d&Af0L]f`b)hl]?6+EFUOPM<]F;U M!0*FBDJYC[KQr!b_j#-bfI:l=2-iA[?0H(NW\LB!&;2(cB-qjcZ;m6Hs!0]dOQ3^bdgkH-penml%' <UatS,k/@'VPL8%Wqek7p"br_]9RZ99_a3;3#9a0HYoML]OTI"Hs3*8664Di"1*#!Y-@l7D7\<0ELd bl9PD`'Ht9?O93-AXUXh)$2bVP!!]/?W'Q:]aV7]R,X#NIQo5+`J:J,C#+u#m5\:b>PX4sH"AgINIp mmE1'"b2hb1^,.iDZ\Q:MQlh*>-Y.Ao1+:kN-EGPhbr`Lj6n!Bu*pguNXq+W-Tg2*s9R"(Zp<,STBm kCs'-RtNI;S2`cC?mGV:GeaQ9FW=;W;B$_Y7>LV7N%@Ypi&_"@N!/hSGSI25&Q6tZ0Vb-_We25k7>L ti!>P)%8,t2/p2RuA&."#BQR?0b_-jQg*39.eg>Oe$'J+#c+uD'f"&QoVi&<n':kThH2[BK)+O`VL` "@krBuDUJ%I\hqK&R4jYQp;fBJ:ck7Ym.KoF%Gp77$Y/6Db!qd\EprOG-HJ^$R$SJD8I'["AsD"G-Q ?9t3_e6OL&M9$9YRrqQh>KHS'#b\>p26BEg)/cQq,M#A?In&U]g&/$Pc6UU&@5_S5@#XT/u',D_k5f ,&q,YY(S%upeg+@^#_OTGD'("<i$64dQlW+[`8VpHo,:<3Hg#d@/KV*rE0D"<u''\^I;nPrZk_#X[8 /Z]-Uhn1*8*#\02))6%l*t\JYJ/+XY?/S?e(+p5f`q)JU(^,^hPlUnr1BBaIYhT*Ylc&^#TtCMn_\$ C#jCB$V&o_AP!;_JD'K#T=d0OCs!%7hA5pUshPQt-\1Qkc]K?XFG6:*L6&]"?H`Y!a#>Q>lsR5qQNf QHI)"!YS@VKaqJ*)+-*bj[=b_HA)`\5D#*V6`Y]H*\L#[+39%[u:;pGr:1!*V*8N_Iu&^fS9nc.hFr gOW[YRB)mIH?%;oU`!AW;/0ifi)F-s"$lAsQ(q_OE3K,`s"rIG$)NM24#_mAnCBFdV![Zb[EWT9':= 0sk.PQY'TeJ8;5_hWm#ni=RL\V7"fG(hRM+\P<&*QTsi<oqa\Kkg<%3QGQ.Q<%r&HZ2M0L6hc#4*gK ?mHF,Q@\)N>-PmJ!86=%<[i\gIhM/B#JNG-P[u6U]J\*f>#bYB4/UR=FZI]Cb)U7+b)K4t'IcNk:4g SpAoi[)Kkt1)=;\l.&-[\7@9<Np7Yh$F`$D^F6EgcI,([p=paf)O@q"J\bo?`Pa:Z<#R"b4,9Fr)=5 s1=W;%S0s*?g-P=jVkpi">Ph+Gm1]DRd2).nV#P;%s:h:1?tsB`KAf_-RBfXF4"kQUjHMLkc0;!"!% eoh$k,1XH;Li(NPdaqcbiWC+g.Gp5O,2d\C^a'UL\[!dHk:nT3C%Z6LD_hP,R%d=n@!Af6uV@%*(s+ pkp!*3#4EZ7f38<=)dM9:BhGH#k@I3=&[.68nJ+UET67WJ(9'M);!MA76=5SUe(gdWKP/3jM%*Z0D: :`?EE:?DPl!>rVM-meS<FN(:o'P^/W7WpL_//ko_cEJ).!p7XL@?&V9fusO0&XFOB$Ss1sU^cqro:Z <#B`e>L+TMY#:deM9!RqFu<6^LV6=`=]&r6^M:"!MHLB(#$l/4=[_dJDJO@<jYJH7ic>4?75Mglb[k ^!q]^`Yd:03Sg*h%7Xq%!QZ@"lLmP#p2ZnhuK8J&W:?[1i8.['W/;RLi<FrYkJ**N9u--=%7F*5mXn 9(03t_;K8Kdq%s1KV1pQGN5$Q0&-+%I'Vi&a7_),YaHrbequLbF(/e<1".IQf_&Y[r&ASXo>6"[%J2 70H;(He+Y,F%K6rLmaE!BW9#bGCjioMTG"YS5uj[$$O5&`9#"tJZV-lFIR+[OJB+FXn#J/N;_.WLk[ _RM;>)8Y$1W"eG;!T>KC>6k7P$BmH&7#`rfMUsXbNB\OSJ2N2e>%=u#@h\oK@nVS)NI@<&5Ca66NJQ "`TPe9I&AT-U1p2h3+p:`+&;r1AVh.JC,;2<'OQ)r77E<ql1('%V,L\W)*!IUBeCZ*uN]n]a2Dii"B B,RorABQb!R69.3("Gb!Y?Q'MiS8&3)Hsg*t`r,"aZ/0LkdfDeHm/0kU7(:N0GQMO<k5f]S/%I+r-0 A?q**s:iFHcf!mRMN_Es+#V(FK(;p4"%bt_,5jbF&O[NQO5EPi'MYDnlJ-%]#@/r(@[]BWIahP(r/- c-)7fnZ<LY]g3&0E)&r';)'(M4I/Om>7iL2Ms=pRsc_(J0Mh?p?CHqIA]=5JCh`UNpAT-mL/QUW>W2 O<VO<8-##I3.R^25u95-)U-_Ym#;:HZ\CckO%G800Y+ClUmo19`I/RA,ga=\H&uSM2D>dg(a0%`3MM =d:OsF72XM\`+?qPB/dR?XqIi7-O*3jX6qZfu4IeV1&sSI]ADRk*:5Ek]83kK8!9+#"V/j@I"98cr! )tl[!,t7)Uc8L-V*b7D1]m^\obdf2#9`c8Ea1Anc1a!N'ECn[)u3gN0EaXM;ZOlm"b8^5!1[:i'F!. Si%Q@+jlJqe65igE,saCL?IT2nG&9<rNgfRU<'/)0s('sh!;+KK+`ZEp/'S'5`!cXEbl@ab&-)paIj Sqk'a[/f7E0^k>Km-JBt]\tMon=W9eRA`^ECj%MZX.\1]Wan"$h<$!+\r=Rh5gt!AX_,-_m?6*(N[0 W,hZGkmINr`"W2%:'#=b'EIY@,Z=\ZOc@U!KffYArX8hs2j%1uUr4E;'`]";!?c4*OunG\UN*D5aHO ^L:T>D)P:-+<GW)rQ\0EnJ&$$KV<#ZI-:#?15\Z(9Q9\4B(\<(F!?5PNC#XY9(@0QiW+2mWd+X!#eM ON`e%MVrB8N8B:)t1`nfHO4XO:.=E6?iiLiT2Be:dI\4P`rKTL'<1X!(6ki#_cIGUmQj.+Q:[ENg/u A:&+oP!8U7$_DGYS"D'o-:dPJq@n!@#Ee.Pi$5a!0,\5hL0Jm*Ze"_".&+kGZ5d7U;eqHHPX9__lLC 0j\?j>6a%HTj+@lY2KR!,\@?:1lH\2@,!Pp*!6nd.'AB&W"u!JH.4!)bfm]HiAr(^LThLd=BGW&[>+ jq/R%*blO5iiqECY)*e3)1VjOPrah+q)s<sp`h\A=@N9sU;;AY3Jd]c4Q$u'!_%ka0I6^T8qK7RdKf qVV+2sI&="hWBo,au'P8Luq2=G:$7,b8<NI6a,p5HSWdoA+:9msh978)m_B\H,Y/"Eo,tJp[5e+[ho IBL.&-+c("DRp!65c;XH^[Y8MT>oZhN?3YA<rCTA[!FlQ7O=M+TQJI?Unci)a&:*RZd09jU'7d54DC KQ4Oo>?l"=pFi9EnC<-MR#CEF!`g+,m>Y/"S!+^\nO9gA(2W4;%-BT)tJU[qJ-AM_5:;U()!.O$Jab fWld_K84?5Ac/-!SJn#"qT3.g/4MGVGnXYSZRH@H@KN@60Cf@[d>u,V(!fD7MKR*M&o\dQKL>@UZ@( *`e+(_*!5odZn<Nh?4*F3e$&hUK%U#C5u?6g#t-m^]elGgbJt^k/K;."\dMP-n&t`!%$:<J1uK2O9+ 9c5`g#]q0"1RJWF@r&e)-?&:m(8AQG4#-=&&uP]+6h-9u,F,@?/:E%6<rLgt4Ns)"0#61;l"4;4UOO Uq_9'`O8mW%^@Xs3dNbW@:LnAq_HOg*2n,WDZIo,N52#(`eu5(kB1OhL0A'LuQiBKI]tE!FQb%!/LV `E+BL[:kH"T!rSCr$=]B'Uk"SXF2Vd%OBa(W&<e5klA.cWJJa_N5R;<M0FbUN6:h/B#N^LB!"$jR`o VIG!^m*+h^]rbBEWdS87:U/J?k87+D[NFMA$!JCjAkoJ4O'8-!`:QjMYj9!)-B<kQj5=)^((T$Aa,d iEB'\80c[sg.,4t!<tegBdl0%#_3j:'X@pL^qS;OST%T*GXhq^)3P'#@Kkg-,R/fk!/M"oJ.42&'UR jNY6bCI,.gBcYQ_iF@pup"RLCRD6R:$;O;N9*8g";b'iYa$0oRr83^^GU,X"%XP"#JD4>oIB;4o2=" )?5[TbU[b^]ItU!H]IuOpYS@I?3H$V_V5U"r7BS$,q=P*(NP]1i8M?_3_\R]e![U&5mEj9Y,k>5Rs# /E"G+(I#nI0a`emo<L*3,/cslu!HNoP_N%kJIRBCIE%1u'-SPN*l'qT9)R:WI!>p>>Jj1@Z,='MXgF O!"ii(OA?6_'qQf%nSS\?EZ5n6-^TB6F;"_*C5VhS>1YQJVf5!T>E'ubjF$&u0SB`m?$XI0+E<-Gb, 2'n[40bOj^"(M>k8Id_OSHIs+/W^&[7PsUKC3O<A;keP,!u6A&(_)-."G!]O4`6ef!&$<G6A*-GXTC X&N(l^3^^b1LLF8u;G8:ic_jcLeAM=!K[4+VK>9X+-UdBnCB8jb`DEUk%cn-FS">M)7c$&5;:.UrgF UOaFVbT/n&dV\h,,1GK$C-eo]K'HLM(aFoUiN>\Y/?)fB<Ik!"^PPYL7)Nue9?jZ!WQ^4J?+2fb$nc "D7lM,-73[i?7W?,.jP\7JtiR;6ml7[LLXVO"X!lsa@gK%,+XNTk#bJ_,PK8fpiFT*>*[SpkVP=ieB ::9),Y=sTi6D,R>IZWK@7",.[%,O.536Xi^dGZ7#/H!"o9?BTEmf4jJ[k>g44\IK,OdYNL/WD8d<2l GNbh6'=+BR-liUMjWV8\#lGMcLaZ(?%YXe4>R1Nn!a-L+ON#Uh4e9+`71)U37)'$C+;epFP!WF5MO[ KPnIK".,H#`&#T/=l8oiRKOGBt@#10["FCRcCJ0%=<S)&rIFi$XJkS5!\2Mec8-r=doLOaol'HYg;G \@A("S.l,iS:+9>bSNoHh[k[LNA5):`W.7ET%-p)88%]TJ[M84A-m7%Rn9+2?6"Mj)eR'C<U'fMN.f pN2onrp'ZbJKgX!;:nC@Ed4ZJY7aqP`&k&3>khk!Dk!@AS(j`MK"[XU8),aY&8'F/)(7%GbjlZ=N#b Pgb1Ep>7J?2S=-k]@4Z<##272;RjhedV_XGAgs7JSMBKcXjQ&/BkcK7dMJJD^Q(#%9J-+okE4WL42R L)%u:^fR$/JnNFAO?Ogo@'L"W3e2tE[qUk3+t28<&r$6/?7/`5KBaqlijk0_0EO54'VL*HS(X_N$6P ')67@4Xj1PSXODi2?*21hi(Ri=:"#c]t2hY:UY+=jN'p&K3k_dK:1(e>Q,f&*,"(B-*J`B%E[GhQ+) '#?6..g=A70ZR2!jDj5".+b&=TJ.'_C.1)OT(FqkjnHUeciQ./j_<b$D?3G(6cNT8As(EI>B4l@A<l (X8knd7Tfn/Km6up.O@q`fn_G[4(=HC7]'$8!?4cV4obrKT^J:GW?e$$[K,1b%k'"t!,_jq]R`hWXO R\(:i"Q4'_?U><9a2rp'EGG@;iYiBF`]$R?>`&!43s"#6n.N8>Jc6N@"ddWW$r44dj<gABH5)0T8W1 `b5?&).uBP+-$Lb)*!.f;Pr[fS@3K2,/h:C.JAmS<l0.F%.Ou&R[m9UTqpfNROFUcRE&[!3<6j.,(S ;N1+"M[7'/pfjELuh+*t"oFZC>'i!7Phe*0#!ST:BZ"pA=8/51T0)c0%$Ubs3!;3D9W>%Ofq@K[oGV "&0/eNsG(82-&jVC:Fj8j]2GAa+[-%+uI35dK=,*hao0(r-S[VXpObiXA7IC`b=.OOeh6>4Tc48Yhc INi+d4UtVe>C7omNTdcLgT`U4Be5b1nncS>0G7$(eG]hqi>(Xtr:LINAU@P5EVgmu]14R+(9Afo<(n b8LqSDhB?6bHPJkDmU.U<'3ScNRoE/FaP.nW&0:o[?c8*GM;P"&%<iT&pl:5;=hjuF3IGObipBln<n CutDY:H#+&-uF4oF>0]Y+UJ3VL_b_/J70iH/:aur]D)Fs!#qR5J,fg>0Yf\BI7Kt5W<<n8aV"k5a>f E,7%UufAr;sHh?Z5mECU!G+:L5s(<]+rAcMhhJ3g2'"TX:QiC1b60S9j(AOL6/=k#<O^lbCORq,-kG 'tQ#D6p)L'`Wc,5mnYu\<"4X%X=:D"$(o&C^i][8K*df$4m4sY]=o`/V$D8.c#ji8nG"n";Q_B$)*A oIgj+C@#Y%6;1])Z&_Nsbib\IB\/l02P-CT[X-W"*QW%KPhr5h8I,(RR7RdaXI;&c/?eVQ4!Q4u5EZ AIo3!n*T6L93WC8lcP`ek?.\/M<+T&co;Q6%*@kc43JXqh];Wk2F8$EH\\b/lt\9AHQ;esCt\!sKkk ^R[t;M#EVNQiVcS.jkso!?#[LFTuBX$5ELu:ujkUgdlC)]`G7`!J^oe1a?'Bd*cl.A,rdN2m<C05ub p`?icC?o=tdYRL[B_R^:-EbQ-P9%&a1T5g+fjN']=9c.]Kn!B@.*b-R6B5-)s9#:olQ8[lJDoW&9!T b.P9ObG5!A62TtpjeWDN7BF!!$HdmO;q:OeuETlXa't(?j?*%2.A?"!.:oW)F)RL6l[cY!e:["G%bZ E7%5_-4N#_MhH;)M5c\E#,cqQ,c-!EmXT-)]\uRBa9e4Tef3&f0.h'6&]P.mAZ:\hQ!0D`fC:U&@J3 `GJBP7oK!o)G=RK:V4hqF^L-3ulpC9>9;L$M9++o.^%/(D/?3j"IDm2EMnY#?k4RPnHSY/^Pc[L/:1 X4c491'?Z(kR%TC!8Bm*.^YWFc@G1PSG]Ll.kaH'dRk<&CUX`O=iH'RMR/0?:r"&=1<]gQ#]t%&5l` /t1+7##$06VER5R;4"NIM[Y;-\t!'.j([S5q=_]](P+>lXlYSc:"Yj3\o1-l&m!#U4eYRgsh$`Ho<Y [#!o,TGhOd"(!r%Iah^5_h%@Zl8Q:)diY^SFf'7Y\HEoHcBV@Qn"E&L8`K']d0k>Y-Og3V_phDiWqi S@).RQI$h,MJI5L?W3C.^`<d"sJZ?]uCTc0k0?FcmI,qN?g(&J\orq*m%?#b>!@d@HqZC.O\qg_e:D Bu'l(haT+oiO\WT_.#"PN)R\A<&&l37Dg9XFi^hZV<?q43jA:_C07"4\O(ON$/[.qocs6h1KR7cnC7 26fgU,f$md%S&oXZ8Dn4KIaLJ[9b2@@oP`aGX9=,jMYs*"(^aiJGq.)M!PnE8!'',C7]qc-nRG#h`q XL8Ub<OO_G6*+%@<V"os2R!&cNNL9ee:)#sfhMKe@LaT^0g,&A=J>WNHuh\j%+e:=\,jR\uUZG=Q^E "5]1Dnmu0af5hb":W*U9H.n8>tS1KYf84'X*XuSqk6Sr7kc$mU,S`>5`AbjhWgfs$(L9P&5C6OiWVa hEPMPm.0L3%\,[F]"e$/A'/V8\nWJh6UutcUg-GjB"\d$:MR.G-Jk?K:YWqIeCG8'WiQ@-=`?qOh5W 5+X$CtQ)aB?Z7XnD$!!.;]s8urBpcN^a@.ER[E8co8L3K)5s"4@<1MpJ-(6Dr_ocDlC>5qAGCp9PD! qb#6GZj<ciOO5DR^]6UbE^I)alq.Z%-E->65-**%LtU]H/'X*G,OJ.pd%7U#XV4me3iEcF1m"@s""u 5m93U>]76io'NF!?75[L20$CtHQ2Lp>qZn$Yug:N(b?Rtl%%B-E(RPD6cF9$lBkIOZlX]:(dOT7'ID LhYP8!j=QAK1_>=>^]kp2O*d!d\X6.LsD!n3A^T_*10-/3gqoqQS[g8uo#j[/YXg>Kr$/[)<]K`?G: dluEGbp'YO`q#p&o<i)d`-aAZ'1n-'r\qgKiNY`E<"TY-R!"cCU!"7"fG,^d*"FrZ>R2,eWSd[:Tci >qR%<)F-!'*:U+9W)R6pM?gEt,,J.;`bWW*<scKaRRR/Ds-)+W7p*Dh&!&,a8<<5T!p19E:$M)1\O5 !H<`^U"rn\iMK."osGNm`$Y!YZo5)j":tud\(e$7.N1$kAtMiJ><i3g7]*FK=Vb9CcsR#n)AY`C!&X VYAtPdJ>KDN@WFTP"70Wgr!T9FS0I?npJg9EE]#/?g+*&U]7UiA9"op0CX(;<l">ABLAjd(h3KTXI6 m]<n+,KLi<"]95]%4:m*^YB"?jD&Z35dd!$(MT=!!7[-5Qbn''X/#D"7EtRd(TeeJUe:3#abT6!"&- JZpH'V;M/Bh&1TqL-j-CK4's*Q':](O!0hj'[C@l-N'$&(!bD?4J2@BD3c8R*1un^lJ<^KJbQ<G_F% HMUFa$06$OEO2\KR+ThKBAG`^rG,?k_0bP&f,^!&9Kg&.BZ^63&b0k6_6CXu.n$"9H<RT*kc-!C-WA 0F4HWH@_TuW_PPk7Oo\sTXhgmR7k-P\Tbnn-N[D\JO#hhkR+nODP;F@-Fua`U>+n'CME4^pZ?2n*WU FHl$`d;$kuU//L)&!R<.Yt@]-5CW8&^&2?;tC%.F<XU\5fcrJBqO(nbdQ!CR&O&ErZd[DDt6%o<=T^ ]4?N$350u!\b*0!oj8+&-XHas+!:`!43##mZIAJ(b(*Q-ZB9O!RrapK%9Z*5]42,U^7$n5\$8pPU]R ]&0MH*!ocHj+:_'H7fg;=n)e0KJ.aOA<4,Uh+:up('t3*9+9ZMmh/5,,3m[uY5dgJ"]E'&R/\hT^]5 .HS0^LP5g-[oo"T/7p"g]]^&-?2=TF2#2!^s1]YX>i/Ctc"E,AA/I?6.#fquQ;;b00.O]&!UVE@W2X pF-snD,!c?cE@TUPQO[2]H@\D!=Kd"nHZi0,QO5T)/'!oJ-5j/#Q^.j!eBsH)b33*WuOO@mYhI&'2/ FZ5YIl=$3;ru"J[ZD]b?@UCBVuablOcb"fMG7J/'100X6,\c;>%@#8tpkKEPgRILp'u!/Mb>!!0=u. KmG=3m_*P"&ja.Wr`n9NNYYKnc#!J!21nG(]dpG\k<(r()*b]&<fA@,6>"]q$t.*J,sV7^]5$u+TMQ h?:'1^.lsa4e:8PN!0@1?JO4Y=3<1IXee%mY"+m_o]*@I!GQ7mIqFUa(J.-r1\2E'u!al!V*X)NGTQ oMtDh&*I!K=?-^]GV^E-hqB"qUm0!"+7oWs54!;F'\4"CNmo^l`Wn#lmj'+TV4V!(T::!!<@9TV_t` s4@;S!!*XY;#kB^!.Y;J!#34,&-X`i7d:O=b#/50!t5b'l2tG_!@nI)!Enk/+95(9OoX/#Plq.D5]^ <5$j@nA+HR0h!<.K^O9ITEJ5I>kn+OB\mYarAeH*8_W`I$)!!0mr3t>?o0!HWE%1E<cJ05EIr+@qk[ gNMT^]g4NMsUQG56(]b"Lu71!9gH`ZiLF4!<?%E?@fm+E!;U0k^[m)(EL%Xn*&0kScaEAC%*Lq!:g: 04A^:="Fq;)!+\K@!!@3:63ec4oKiP.!UbIUm$6QdBu$J56&l("b3@Xbp],2N%c@P]0+!od0a$bt$3 1TE!I"U05p\6^HifBFX]Pj]!R?4@U]Un>LmDKrn43Y9J.Q)o6j&/D(k<"(_:Y+%+o%K,@R0_#DL_bb J/__r5RD>4_?0rm^2EEI!&;($_($H&e',W.!&rg?s'RNG*pa*0!'5W8'b1X<^MlND%8[6/5VP;slnT ):2a@d-!,4]nOV"l#bQ'UV"G$UE^^h"N$34Eupe_Vo^d<Psd*`1$E::D\%=\DhMZZWU#Q]^a+e7tl! E?iCYT(er9',+Qq;+a7!!A0WJcNr%iHt>(G5d"-:aV#"OY6uL%?sG;J1(hX0EYjS#A">p"P@[qTX5g AnBAZ*3X!'*!X:mk!!=+C"AAm,;8Z:Q5hW^dIXhY3!db&$^eM'KKE)Y7,_HVu"8i-Y!;<QSOoPNF&K Cd8^`Qfh@YJK7)N`3k"a.UI9E8J<KT$"\B?Ig*k"*jW,m4h7!3fKA]ghH)!.J;Y,K/][!3cGS!t=)j j9ag27K<S\`0a*T\k,`;`n492&[27B^e,";5fI[O"9944T6Z#GTG9sAXUqLe(:Pr3EE+P*6N_8sE[h k]!@%_Q]GB+-@^.SJ(Ul^aJ62X]r5D]VSq%31`@GrW^__VW;mBVu-cc?m0iuRQS-+dk<4ith`aUYQ: `1paKlJTIO@[CkJ188NK6;q=BH.fN$%fs,>SqP%Glf)G)Q1TZnNR!Vbf6AsD6*i0`d;]49L@7KG/cH @"Mi!sVj)DjHn_jdeoAJG;u2t0=7&+-0+d+7e',Q)K%A>:b`Z<ugdY#?;qURN+Rr8lrm&Z@%AR!9%h B@t@Dc.HI:;R=4"2")49^rMAO+#JD-Tg<^_b>tATVJ`1jAD-)i)^`9MO&9gd[?W%5S$'!5HDRBjTG2 (#T9-a9Jq@E'`$p6NDnl:_<_+(:TFJ%2</7'(?)>!@F,Ij5'&Ap2N&l###%C+0H_`Z!uATI1/\=<9! Ea:^#\WdZ8T`:B^`,QdMl53<5-1VkG#9"_.">>S\!mM5t\jUd`;$JQV7?i5X(0?bCQl!rd^.0H92rL G?uV,l7\h^hMR='59OK5]@J8"2_iibhQgP;_fSJ,Y,sF16ZM[N60E5Ah56Ha_1[CX<_`+@Xsg3h"&D c5_uYF*!I%lS'3/T?9`I3gu<n,>I"dt-EkNb1(I\<hkqR?WFL1p3h2BXV[L%=c*9gTM?Zs+c8?n@2C ;cr&9.7UaA%3U_]=4-7_gk2.:4O@%&OHX]g),=*$?=fX%L2En/g$ZNUIbC"rKN&:)8O)7p4SJ69p<7 _acuNdfe0&0lO+O?3+*AZJWG>A'3NqJh2Ue@3SI#o*'BZDZJn:">%_hR(pOje]5dP!sFACF505H"X/ B9AUq3/L5?$LEf0c!,QZ;[LYRL@'^*87bhSq#,K.B]-aO4g!L!p%%*$9VWFN8#ACiPWj=1s0;SWke" DCQ4Q%\Fp8p<C/P0>Zu"Bb2Xr!qdW=YdlW(AGqG.'$jaZ!o-8c2hY0a1X5KE!=UJ8Cd@]>($EJJ9UZ @562r!1$+MA\H,!)r$DB^83ri?%*6P$Z>5[Pp]<9nQ5h^\",l]1>T!(O&2TPU(K\+$6d@e>_ouRE*0 ;s$c$=o%m.)LI202),(=N6n1W7KohfOXZbf>THbf_63N"Y2<WN)+?g1FTO('3nUh`CsAVsFW;!@0FK 5tPWmB61FB+s1p]EO,rq6d(_?0DGIY4=M5H9N+)Q8Ur@W:2q4V7t$?m-pKut):2'F;lFB1S1IG:F>L 3k8R]e_S)1eh*QoqQ^J"m2c#!"FKCeRt(0;%M xbtoa End N 146108 23ABC E 1 S EF07D7 R 7C0F8A33