angband-v3.3.2/0000755000175000017500000000000011651552414012613 5ustar chriscchriscangband-v3.3.2/lib/0000755000175000017500000000000011651552410013355 5ustar chriscchriscangband-v3.3.2/lib/pref/0000755000175000017500000000000011651552410014311 5ustar chriscchriscangband-v3.3.2/lib/pref/font-x11.prf0000644000175000017500000000114411651552410016377 0ustar chriscchrisc# File: font-x11.prf # Terrain features # open floor F:1:all:0x01:0x1F # invisible trap F:2:all:0x01:0x1F # magma vein F:50:all:0x08:0x02 # quartz vein F:51:all:0x02:0x02 # magma vein F:52:all:0x08:0x02 # quartz vein F:53:all:0x02:0x02 # magma vein with treasure F:54:all:0x03:0x01 # quartz vein with treasure F:55:all:0x03:0x01 # granite wall F:56:all:0x01:0x02 # granite wall F:57:all:0x01:0x02 # granite wall F:58:all:0x01:0x02 # granite wall F:59:all:0x01:0x02 # permanent wall F:60:all:0x04:0x02 # permanent wall F:61:all:0x04:0x02 # permanent wall F:62:all:0x04:0x02 # permanent wall F:63:all:0x04:0x02 angband-v3.3.2/lib/pref/xtra-xxx.prf0000644000175000017500000001034511651552410016630 0ustar chriscchrisc# File: xtra-xxx.prf # # This file defines special attr/char mappings for use in "graphics" mode # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Remap the player icon ##### ?:[AND [EQU $CLASS Warrior] [EQU $RACE Human] ] R:0:0x8C:0x80 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Elf] ] R:0:0x8C:0x81 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Elf] ] R:0:0x8C:0x82 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Hobbit] ] R:0:0x8C:0x83 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Gnome] ] R:0:0x8C:0x84 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dwarf] ] R:0:0x8C:0x85 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Orc] ] R:0:0x8C:0x86 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Troll] ] R:0:0x8C:0x87 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dunadan] ] R:0:0x8C:0x88 ?:[AND [EQU $CLASS Warrior] [EQU $RACE High-Elf] ] R:0:0x8C:0x89 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Kobold] ] R:0:0xA4:0x91 ?:[AND [EQU $CLASS Mage] [EQU $RACE Human] ] R:0:0x8C:0x8A ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Elf] ] R:0:0x8C:0x8B ?:[AND [EQU $CLASS Mage] [EQU $RACE Elf] ] R:0:0x8C:0x8C ?:[AND [EQU $CLASS Mage] [EQU $RACE Hobbit] ] R:0:0x8C:0x8D ?:[AND [EQU $CLASS Mage] [EQU $RACE Gnome] ] R:0:0x8C:0x8E ?:[AND [EQU $CLASS Mage] [EQU $RACE Dwarf] ] R:0:0x8C:0x8F ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Orc] ] R:0:0x8C:0x90 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Troll] ] R:0:0x8C:0x91 ?:[AND [EQU $CLASS Mage] [EQU $RACE Dunadan] ] R:0:0x8C:0x92 ?:[AND [EQU $CLASS Mage] [EQU $RACE High-Elf] ] R:0:0x8C:0x93 ?:[AND [EQU $CLASS Mage] [EQU $RACE Kobold] ] R:0:0xA5:0x91 ?:[AND [EQU $CLASS Priest] [EQU $RACE Human] ] R:0:0x8C:0x94 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Elf] ] R:0:0x8C:0x95 ?:[AND [EQU $CLASS Priest] [EQU $RACE Elf] ] R:0:0x8C:0x96 ?:[AND [EQU $CLASS Priest] [EQU $RACE Hobbit] ] R:0:0x8C:0x97 ?:[AND [EQU $CLASS Priest] [EQU $RACE Gnome] ] R:0:0x8C:0x98 ?:[AND [EQU $CLASS Priest] [EQU $RACE Dwarf] ] R:0:0x8C:0x99 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Orc] ] R:0:0x8C:0x9A ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Troll] ] R:0:0x8C:0x9B ?:[AND [EQU $CLASS Priest] [EQU $RACE Dunadan] ] R:0:0x8C:0x9C ?:[AND [EQU $CLASS Priest] [EQU $RACE High-Elf] ] R:0:0x8C:0x9D ?:[AND [EQU $CLASS Priest] [EQU $RACE Kobold] ] R:0:0xA6:0x91 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Human] ] R:0:0x8C:0x9E ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Elf] ] R:0:0x8C:0x9F ?:[AND [EQU $CLASS Rogue] [EQU $RACE Elf] ] R:0:0x8D:0x80 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Hobbit] ] R:0:0x8D:0x81 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Gnome] ] R:0:0x8D:0x82 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dwarf] ] R:0:0x8D:0x83 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Orc] ] R:0:0x8D:0x84 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Troll] ] R:0:0x8D:0x85 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dunadan] ] R:0:0x8D:0x86 ?:[AND [EQU $CLASS Rogue] [EQU $RACE High-Elf] ] R:0:0x8D:0x87 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Kobold] ] R:0:0xA7:0x91 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Human] ] R:0:0x8D:0x88 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Elf] ] R:0:0x8D:0x89 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Elf] ] R:0:0x8D:0x8A ?:[AND [EQU $CLASS Ranger] [EQU $RACE Hobbit] ] R:0:0x8D:0x8B ?:[AND [EQU $CLASS Ranger] [EQU $RACE Gnome] ] R:0:0x8D:0x8C ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dwarf] ] R:0:0x8D:0x8D ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Orc] ] R:0:0x8D:0x8E ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Troll] ] R:0:0x8D:0x8F ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dunadan] ] R:0:0x8D:0x90 ?:[AND [EQU $CLASS Ranger] [EQU $RACE High-Elf] ] R:0:0x8D:0x91 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Kobold] ] R:0:0xA8:0x91 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Human] ] R:0:0x8D:0x92 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Elf] ] R:0:0x8D:0x93 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Elf] ] R:0:0x8D:0x94 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Hobbit] ] R:0:0x8D:0x95 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Gnome] ] R:0:0x8D:0x96 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dwarf] ] R:0:0x8D:0x97 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Orc] ] R:0:0x8D:0x98 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Troll] ] R:0:0x8D:0x99 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dunadan] ] R:0:0x8D:0x9A ?:[AND [EQU $CLASS Paladin] [EQU $RACE High-Elf] ] R:0:0x8D:0x9B ?:[AND [EQU $CLASS Paladin] [EQU $RACE Kobold] ] R:0:0xA9:0x91 angband-v3.3.2/lib/pref/graf-dvg.prf0000644000175000017500000010572411651552410016530 0ustar chriscchrisc# File: graf-dvg.prf # # This file defines special attr/char mappings for use in "graphics" mode # with David Gervais's 32x32 tiles. # # Converted by Mogami from the dg32-assign of AngbandTK # Additional work by Ivan Jekic (the.edge@Net.yu) # # See "lib/help/command.txt" and "src/files.c" for more information. # # Feature attr/char definitions # F:0:bright:0x79:0x78 F:0:lit:0x79:0x79 F:0:dark:0x79:0x7a # open floor (+ invisible trap) F:1:bright:0x97:0x80 F:1:lit:0x97:0x81 F:1:dark:0x97:0x82 # glyph of warding F:3:all:0x87:0xA9 # open door F:4:all:0x96:0x84 # broken door F:5:all:0x96:0x85 # up staircase F:6:all:0x96:0x95 # down staircase F:7:all:0x96:0x96 # General Store F:8:all:0x9a:0x83 # Armoury F:9:all:0x9a:0x84 # Weapon Smiths F:10:all:0x9a:0x85 # Temple F:11:all:0x9a:0x86 # Alchemy Shop F:12:all:0x9a:0x87 # Magic Shop F:13:all:0x9a:0x88 # Black Market F:14:all:0x9a:0x9B # Home F:15:all:0x9a:0x97 # trap door F:16:all:0x87:0xA6 # pit F:17:all:0x87:0xA4 # pit F:18:all:0x87:0xA5 # pit F:19:all:0x87:0xC3 # strange rune F:20:all:0x87:0xA7 # strange rune F:21:all:0x87:0xA8 # discolored spot F:22:all:0x87:0xA3 # discolored spot F:23:all:0x87:0xA3 # dart trap F:24:all:0x87:0xA1 # dart trap F:25:all:0x87:0xB9 # dart trap F:26:all:0x87:0xBA # dart trap F:27:all:0x87:0xBC # gas trap F:28:all:0x87:0xBD # gas trap F:29:all:0x87:0xBB # gas trap F:30:all:0x87:0xB8 # gas trap F:31:all:0x87:0xBD # door (+ locked doors + jammed doors) F:32:all:0x96:0x83 # pile of rubble F:49:all:0x87:0xB7 # magma vein (+ w/ hidden treasure) F:50:bright:0x96:0xB3 F:50:lit:0x96:0xB4 F:50:dark:0x96:0xB5 # quartz vein (+ w/ hidden treasure) F:51:bright:0x96:0xB9 F:51:lit:0x96:0xBA F:51:dark:0x96:0xBB # magma vein with treasure F:54:bright:0x96:0xB3 F:54:lit:0x96:0xB4 F:54:dark:0x96:0xB5 # quartz vein with treasure F:55:bright:0x96:0xB9 F:55:lit:0x96:0xBA F:55:dark:0x96:0xBB # granite wall(s) (+ secret doors) F:56:bright:0x96:0xCB F:56:lit:0x96:0xCC F:56:dark:0x96:0xCD # permanent wall(s) F:60:bright:0x9a:0x80 F:60:lit:0x9a:0x81 F:60:dark:0x9a:0x82 # Monster attr/char definitions # R:0:0x83:0x87 # Filthy street urchin R:1:0x8b:0x80 # Scrawny cat R:2:0x90:0xB6 # Scruffy little dog R:3:0x8f:0xC8 # Farmer Maggot R:4:0x8b:0x81 # Blubbering idiot R:5:0x8b:0x82 # Boil-covered wretch R:6:0x8b:0x83 # Village idiot R:7:0x8b:0x84 # Pitiful-looking beggar R:8:0x8b:0x85 # Mangy-looking leper R:9:0x8b:0x86 # Squint-eyed rogue R:10:0x8b:0x87 # Singing, happy drunk R:11:0x8b:0x88 # Aimless-looking merchant R:12:0x8b:0x89 # Mean-looking mercenary R:13:0x8b:0x8A # Battle-scarred veteran R:14:0x8b:0x8B # Grey mold R:15:0x8e:0xC2 # Grey mushroom patch R:16:0x8e:0xD5 # Giant yellow centipede R:17:0x91:0xA0 # Giant white centipede R:18:0x91:0xA1 # White icky thing R:19:0x8e:0xCE # Clear icky thing R:20:0x8e:0xCF # Giant white mouse R:21:0x8d:0x98 # Large brown snake R:22:0x90:0x92 # Large white snake R:23:0x90:0x93 # Small kobold R:24:0x8d:0x8B # Kobold R:25:0x8d:0x8C # White worm mass R:26:0x91:0x90 # Floating eye R:27:0x92:0xC1 # Rock lizard R:28:0x93:0x8C # Jackal R:29:0x8f:0xce # Soldier ant R:30:0x91:0x80 # Fruit bat R:31:0x90:0x81 # Shrieker mushroom patch R:32:0x8e:0xD6 # Blubbering icky thing R:33:0x8e:0xD0 # Metallic green centipede R:34:0x91:0xA2 # Novice warrior R:35:0x84:0x80 # Novice rogue R:36:0x84:0x81 # Novice priest R:37:0x84:0x82 # Novice mage R:38:0x84:0x83 # Yellow mushroom patch R:39:0x8e:0xD7 # White jelly R:40:0x8f:0x93 # Giant green frog R:41:0x93:0x88 # Giant black ant R:42:0x91:0x81 # Salamander R:43:0x93:0x8D # White harpy R:44:0x93:0x8A # Blue yeek R:45:0x8f:0xBA # Grip, Farmer Maggot's dog R:46:0x8f:0xC9 # Fang, Farmer Maggot's dog R:47:0x8f:0xCB # Green worm mass R:48:0x91:0x91 # Large yellow snake R:49:0x90:0x94 # Cave spider R:50:0x8f:0xB8 # Wild cat R:51:0x90:0xB2 # Smeagol R:52:0x8f:0xBC # Green ooze R:53:0x8f:0x80 # Poltergeist R:54:0x94:0x97 # Metallic blue centipede R:55:0x91:0xA3 # Giant white louse R:56:0x8f:0xAA # Black naga R:57:0x90:0x8D # Spotted mushroom patch R:58:0x8e:0xD8 # Silver jelly R:59:0x8f:0x94 # Yellow jelly R:60:0x8f:0x8A # Scruffy looking hobbit R:61:0x8d:0x80 # Giant white ant R:62:0x91:0x82 # Yellow mold R:63:0x8e:0xC6 # Metallic red centipede R:64:0x91:0xA4 # Yellow worm mass R:65:0x91:0x92 # Clear worm mass R:66:0x91:0x93 # Radiation eye R:67:0x90:0x87 # Cave lizard R:68:0x93:0x8E # Novice ranger R:69:0x84:0x84 # Novice paladin R:70:0x84:0x85 # Blue jelly R:71:0x8f:0x86 # Creeping copper coins R:72:0x87:0x87 # Giant white rat R:73:0x8d:0x9A # Blue worm mass R:74:0x91:0x94 # Large grey snake R:75:0x90:0x95 # Bullroarer the Hobbit R:76:0x95:0x80 # Novice mage R:77:0x84:0x86 # Green naga R:78:0x90:0x8E # Blue ooze R:79:0x8f:0x81 # Green glutton ghost R:80:0x94:0x82 # Green jelly R:81:0x8f:0x91 # Large kobold R:82:0x8d:0x8D # Skeleton kobold R:83:0x94:0xBB # Grey icky thing R:84:0x8e:0xD1 # Disenchanter eye R:85:0x90:0x86 # Red worm mass R:86:0x91:0x95 # Copperhead snake R:87:0x90:0x96 # Purple mushroom patch R:88:0x8e:0xD9 # Novice priest R:89:0x84:0x87 # Novice warrior R:90:0x84:0x88 # Novice rogue R:91:0x84:0x89 # Brown mold R:92:0x8e:0xC7 # Giant brown bat R:93:0x90:0x82 # Kobold archer R:94:0x83:0xD8 # Creeping silver coins R:95:0x87:0x88 # Snaga R:96:0x8d:0x93 # Rattlesnake R:97:0x90:0x97 # Cave orc R:98:0x8d:0x94 # Wood spider R:99:0x8f:0xB5 # Manes R:100:0x8d:0xA4 # Bloodshot eye R:101:0x90:0x85 # Red naga R:102:0x90:0x8F # Red jelly R:103:0x8f:0x92 # Giant red frog R:104:0x93:0x89 # Green icky thing R:105:0x8e:0xD2 # Zombified kobold R:106:0x94:0x9B # Lost soul R:107:0x94:0x96 # Dark elf R:108:0x8d:0x81 # Night lizard R:109:0x93:0x8F # Mughash the Kobold Lord R:110:0x95:0x81 # Wormtongue, Agent of Saruman R:111:0x95:0x82 # Lagduf, the Snaga R:112:0x95:0x83 # Brown yeek R:113:0x8f:0xB9 # Novice ranger R:114:0x84:0x8B # Giant salamander R:115:0x93:0x8D # Green mold R:116:0x8e:0xC9 # Skeleton orc R:117:0x94:0xBE # Novice paladin R:118:0x84:0x8C # Lemure R:119:0x8d:0xA5 # Hill orc R:120:0x92:0x98 # Bandit R:121:0x84:0x8D # Yeti R:122:0x8e:0xB2 # Bloodshot icky thing R:123:0x8e:0xD3 # Giant grey rat R:124:0x8d:0x99 # Black harpy R:125:0x93:0x8B # Orc shaman R:126:0x92:0x99 # Baby blue dragon R:127:0x8c:0x80 # Baby white dragon R:128:0x8c:0x82 # Baby green dragon R:129:0x8c:0x83 # Baby black dragon R:130:0x8c:0x84 # Baby red dragon R:131:0x8c:0x85 # Giant red ant R:132:0x91:0x83 # Brodda, the Easterling R:133:0x95:0x84 # King cobra R:134:0x90:0x98 # Giant spider R:135:0x8f:0xB4 # Dark elven mage R:136:0x8d:0x82 # Orfax, Son of Boldor R:137:0x95:0x85 # Dark elven warrior R:138:0x8d:0x83 # Clear mushroom patch R:139:0x8e:0xDA # Grishnakh, the Hill Orc R:140:0x95:0x86 # Giant white tick R:141:0x8f:0xAA # Hairy mold R:142:0x8e:0xC8 # Disenchanter mold R:143:0x8e:0xC3 # Pseudo-dragon R:144:0x8c:0xAE # Tengu R:145:0x8d:0xA6 # Creeping gold coins R:146:0x87:0x89 # Wolf R:147:0x8f:0xd3 # Giant fruit fly R:148:0x8f:0xB1 # Panther R:149:0x90:0xB5 # Brigand R:150:0x84:0x8E # Baby multi-hued dragon R:151:0x8c:0x87 # Hippogriff R:152:0x91:0x8F # Zombified orc R:153:0x94:0x9A # Gnome mage R:154:0x8d:0x84 # Black mamba R:155:0x90:0x99 # White wolf R:156:0x8f:0xd4 # Grape jelly R:157:0x8f:0x8B # Nether worm mass R:158:0x91:0x96 # Golfimbul, the Hill Orc Chief R:159:0x95:0x87 # Master yeek R:160:0x8f:0xBB # Priest R:161:0x84:0x8F # Dark elven priest R:162:0x8d:0x85 # Air spirit R:163:0x8f:0x95 # Skeleton human R:164:0x94:0x9E # Zombified human R:165:0x94:0x99 # Tiger R:166:0x90:0xB4 # Moaning spirit R:167:0x94:0x94 # Swordsman R:168:0x84:0x90 # Stegocentipede R:169:0x91:0xA5 # Spotted jelly R:170:0x8f:0x90 # Drider R:171:0x93:0x9A # Killer brown beetle R:172:0x93:0x91 # Boldor, King of the Yeeks R:173:0x95:0x88 # Ogre R:174:0x8d:0x8E # Creeping mithril coins R:175:0x87:0x8A # Illusionist R:176:0x84:0x91 # Druid R:177:0x84:0x92 # Black orc R:178:0x92:0x9A # Ochre jelly R:179:0x8f:0x88 # Giant flea R:180:0x8f:0xAB # Ufthak of Cirith Ungol R:181:0x95:0x89 # Giant white dragon fly R:182:0x91:0xB8 # Blue icky thing R:183:0x8e:0xD4 # Hill giant R:184:0x92:0x8A # Flesh golem R:185:0x92:0x80 # Warg R:186:0x8f:0xd2 # Giant black louse R:187:0x8f:0xAD # Lurker R:188:0x80:0x80 # Wererat R:189:0x8d:0x9B # Black ogre R:190:0x8d:0x8F # Magic mushroom patch R:191:0x8e:0xDB # Guardian naga R:192:0x90:0x90 # Light hound R:193:0x90:0xC0 # Dark hound R:194:0x90:0xC2 # Half-orc R:195:0x92:0x9B # Giant tarantula R:196:0x8f:0xB3 # Giant clear centipede R:197:0x91:0xA6 # Mirkwood spider R:198:0x8f:0xB6 # Frost giant R:199:0x92:0x8B # Griffon R:200:0x91:0x8E # Homunculus R:201:0x8d:0xA7 # Gnome mage R:202:0x8d:0x86 # Clear hound R:203:0x90:0xBA # Clay golem R:204:0x92:0x81 # Umber hulk R:205:0x92:0xA1 # Orc captain R:206:0x92:0x9C # Gelatinous cube R:207:0x8f:0x85 # Giant green dragon fly R:208:0x91:0xB9 # Fire giant R:209:0x92:0x8C # Hummerhorn R:210:0x8f:0xB0 # Ulfast, Son of Ulfang R:211:0x95:0x8A # Quasit R:212:0x8d:0xA8 # Imp R:213:0x8d:0xAA # Forest troll R:214:0x92:0xAE # Nar, the Dwarf R:215:0x95:0x8B # 2-headed hydra R:216:0x90:0xA1 # Water spirit R:217:0x8f:0x96 # Giant red scorpion R:218:0x92:0xC8 # Earth spirit R:219:0x8f:0x97 # Fire spirit R:220:0x8f:0x98 # Fire hound R:221:0x90:0xBD # Cold hound R:222:0x90:0xC4 # Energy hound R:223:0x90:0xCB # Potion mimic R:224:0x88:0x86 # Blink dog R:225:0x8f:0xcd # Uruk R:226:0x92:0x9D # Shagrat, the Orc Captain R:227:0x95:0x8C # Gorbag, the Orc Captain R:228:0x95:0x8D # Shambling mound R:229:0x8e:0xDC # Stone giant R:230:0x92:0x8D # Giant black dragon fly R:231:0x91:0xBA # Stone golem R:232:0x92:0x82 # Red mold R:233:0x8e:0xC4 # Giant gold dragon fly R:234:0x91:0xBB # Bolg, Son of Azog R:235:0x95:0x8E # Phase spider R:236:0x8f:0xB2 # 3-headed hydra R:237:0x90:0xA2 # Earth hound R:238:0x90:0xCA # Air hound R:239:0x90:0xBF # Sabre-tooth tiger R:240:0x90:0xB7 # Water hound R:241:0x90:0xC7 # Chimaera R:242:0x93:0x9D # Quylthulg R:243:0x93:0x80 # Sasquatch R:244:0x8e:0xA8 # Werewolf R:245:0x8f:0xd5 # Dark elven lord R:246:0x8d:0x87 # Cloud giant R:247:0x92:0x8E # Lugdush, the Uruk R:248:0x95:0x8F # Ugluk, the Uruk R:249:0x95:0x90 # Blue dragon bat R:250:0x90:0x83 # Scroll mimic R:251:0x87:0xCC # Fire vortex R:252:0x92:0xA4 # Water vortex R:253:0x92:0xA5 # Cold vortex R:254:0x92:0xA6 # Energy vortex R:255:0x92:0xA7 # Mummified orc R:256:0x91:0xB0 # Killer stag beetle R:257:0x93:0x92 # Iron golem R:258:0x92:0x83 # Giant yellow scorpion R:259:0x92:0xC9 # Black ooze R:260:0x8f:0x82 # Hardened warrior R:261:0x84:0x93 # Azog, King of the Uruk-Hai R:262:0x95:0x91 # Master rogue R:263:0x84:0x94 # Red dragon bat R:264:0x90:0x84 # Killer white beetle R:265:0x93:0x93 # Giant bronze dragon fly R:266:0x91:0xBC # Forest wight R:267:0x94:0x89 # Ibun, Son of Mim R:268:0x95:0x92 # Khim, Son of Mim R:269:0x95:0x93 # 4-headed hydra R:270:0x90:0xA3 # Mummified human R:271:0x91:0xB1 # Vampire bat R:272:0x90:0x80 # Sangahyando of Umbar R:273:0x95:0x94 # Angamaite of Umbar R:274:0x95:0x95 # Banshee R:275:0x94:0x81 # Pukelman R:276:0x92:0x84 # Dark elven druid R:277:0x8d:0x88 # Stone troll R:278:0x92:0xAF # Troll priest R:279:0x92:0xB0 # Wereworm R:280:0x91:0x97 # Carrion crawler R:281:0x91:0xA7 # Killer red beetle R:282:0x93:0x94 # Giant grey ant R:283:0x91:0x84 # Ulwarth, Son of Ulfang R:284:0x95:0x96 # Displacer beast R:285:0x90:0xB9 # Giant fire tick R:286:0x8f:0xAF # Cave ogre R:287:0x8d:0x90 # White wraith R:288:0x94:0x8C # Angel R:289:0x8e:0xB6 # Mim, Betrayer of Turin R:290:0x95:0x97 # Killer fire beetle R:291:0x93:0x95 # Creeping adamantite coins R:292:0x87:0x8B # Algroth R:293:0x92:0xB1 # Vibration hound R:294:0x90:0xBB # Nexus hound R:295:0x90:0xC5 # Ogre mage R:296:0x8d:0x91 # Lokkak, the Ogre Chieftain R:297:0x95:0x98 # Vampire R:298:0x94:0xB2 # Gorgimaera R:299:0x93:0x9E # Colbran R:300:0x92:0x85 # Spirit naga R:301:0x90:0x91 # 5-headed hydra R:302:0x90:0xA4 # Black knight R:303:0x84:0x95 # Uldor the Accursed R:304:0x95:0x99 # Mage R:305:0x84:0x96 # Mind flayer R:306:0x8d:0x8A # Draebor, the Imp R:307:0x95:0x9A # Basilisk R:308:0x91:0x88 # Ice troll R:309:0x92:0xB2 # Purple worm R:310:0x91:0x98 # Archangel R:311:0x8e:0xB7 # Catoblepas R:312:0x93:0x9B # Ring mimic R:313:0x85:0x83 # Young blue dragon R:314:0x8c:0x88 # Young white dragon R:315:0x8c:0x8A # Young green dragon R:316:0x8c:0x8B # Young bronze dragon R:317:0x8c:0x89 # Mithril golem R:318:0x92:0x86 # Shadow drake R:319:0x8c:0xA8 # Skeleton troll R:320:0x94:0xAA # Manticore R:321:0x93:0x9F # Giant blue ant R:322:0x91:0x85 # Giant army ant R:323:0x91:0x86 # Grave wight R:324:0x94:0x88 # Killer slicer beetle R:325:0x93:0x96 # Ghost R:326:0x94:0x98 # Death watch beetle R:327:0x93:0x97 # Ogre shaman R:328:0x8d:0x92 # Nexus quylthulg R:329:0x93:0x81 # Shelob, Spider of Darkness R:330:0x95:0x9B # Ninja R:331:0x84:0x97 # Memory moss R:332:0x8e:0xDD # Storm giant R:333:0x92:0x8F # Cave troll R:334:0x92:0xB3 # Half-troll R:335:0x92:0xB4 # Mystic R:336:0x84:0x98 # Barrow wight R:337:0x94:0x8A # Skeleton ettin R:338:0x94:0xB7 # Chaos drake R:339:0x8c:0xA9 # Law drake R:340:0x8c:0xAA # Balance drake R:341:0x8c:0xAD # Ethereal drake R:342:0x8c:0xA7 # Bert the Stone Troll R:343:0x95:0x9C # Bill the Stone Troll R:344:0x95:0x9D # Tom the Stone Troll R:345:0x95:0x9E # Shade R:346:0x94:0x95 # Spectre R:347:0x94:0x87 # Water troll R:348:0x92:0xB5 # Fire elemental R:349:0x8f:0x9B # Cherub R:350:0x8e:0xB8 # Water elemental R:351:0x8f:0x9A # Invisible stalker R:352:0x8f:0xA8 # Carrion crawler R:353:0x91:0xA8 # Master thief R:354:0x84:0x99 # Ulfang the Black R:355:0x95:0x9F # Lich R:356:0x94:0x90 # Master vampire R:357:0x94:0xB3 # Giant grey scorpion R:358:0x92:0xCA # Earth elemental R:359:0x8f:0x9C # Air elemental R:360:0x8f:0xA3 # Hellhound R:361:0x8f:0xd7 # Eog golem R:362:0x92:0x87 # Olog R:363:0x92:0xB6 # Dagashi R:364:0x84:0x9A # Gravity hound R:365:0x90:0xC9 # Acidic cytoplasm R:366:0x8f:0x84 # Inertia hound R:367:0x90:0xC1 # Impact hound R:368:0x90:0xBC # Dread R:369:0x94:0x80 # Ooze elemental R:370:0x8f:0x9F # Smoke elemental R:371:0x8f:0xA7 # Young black dragon R:372:0x8c:0x8C # Mumak R:373:0x91:0xBD # Giant fire ant R:374:0x91:0x87 # Mature white dragon R:375:0x8c:0x92 # Xorn R:376:0x92:0xA2 # Shadow R:377:0x94:0x86 # Phantom R:378:0x94:0x94 # Grey wraith R:379:0x94:0x8D # Young multi-hued dragon R:380:0x8c:0x8F # Colossus R:381:0x92:0x88 # Young gold dragon R:382:0x8c:0x8E # Rogrog the Black Troll R:383:0x95:0xA0 # Mature blue dragon R:384:0x8c:0x90 # Mature green dragon R:385:0x8c:0x93 # Mature bronze dragon R:386:0x8c:0x91 # Young red dragon R:387:0x8c:0x8D # Trapper R:388:0x80:0x80 # Bodak R:389:0x8d:0xAB # Ice elemental R:390:0x92:0xC0 # Necromancer R:391:0x84:0x9B # Lorgan, Chief of the Easterlings R:392:0x95:0xA1 # Demonologist R:393:0x84:0x9C # Mummified troll R:394:0x91:0xB2 # The Queen Ant R:395:0x95:0xA2 # Will o' the wisp R:396:0x8f:0x99 # Magma elemental R:397:0x8f:0xA1 # Black pudding R:398:0x8f:0x83 # Killer iridescent beetle R:399:0x93:0x98 # Nexus vortex R:400:0x92:0xA8 # Plasma vortex R:401:0x92:0xA9 # Mature red dragon R:402:0x8c:0x95 # Mature gold dragon R:403:0x8c:0x96 # Crystal drake R:404:0x8c:0xAC # Mature black dragon R:405:0x8c:0x94 # Mature multi-hued dragon R:406:0x8c:0x97 # Death knight R:407:0x84:0x9D # Castamir the Usurper R:408:0x95:0xA3 # Time vortex R:409:0x92:0xAA # Shimmering vortex R:410:0x92:0xAB # Ancient blue dragon R:411:0x8c:0x98 # Ancient bronze dragon R:412:0x8c:0x99 # Beholder R:413:0x90:0x8A # Emperor wight R:414:0x94:0x8B # Seraph R:415:0x8e:0xBA # Vargo, Tyrant of Fire R:416:0x95:0xA4 # Black wraith R:417:0x94:0x93 # Erinyes R:418:0x8d:0x9E # Nether wraith R:419:0x94:0x8E # Eldrak R:420:0x92:0xB7 # Ettin R:421:0x92:0xB8 # Waldern, King of Water R:422:0x95:0xA5 # Kavlax the Many-Headed R:423:0x95:0xA6 # Ancient white dragon R:424:0x8c:0x9A # Ancient green dragon R:425:0x8c:0x9B # 7-headed hydra R:426:0x90:0xA6 # Night mare R:427:0x93:0x9C # Vampire lord R:428:0x94:0xB4 # Ancient black dragon R:429:0x8c:0x9C # Disenchanter worm mass R:430:0x91:0x96 # Rotting quylthulg R:431:0x93:0x82 # Spirit troll R:432:0x92:0xB9 # Lesser titan R:433:0x92:0x90 # 9-headed hydra R:434:0x90:0xA8 # Enchantress R:435:0x84:0x9E # Knight Templar R:436:0x84:0x9F # Sorcerer R:437:0x84:0xA0 # Xaren R:438:0x92:0xA3 # Giant roc R:439:0x91:0x8C # Uvatha the Horseman R:440:0x95:0xA7 # Minotaur R:441:0x8d:0x95 # Medusa, the Gorgon R:442:0x95:0xA8 # Death drake R:443:0x8c:0xAB # Ancient red dragon R:444:0x8c:0x9D # Ancient gold dragon R:445:0x8c:0x9E # Great crystal drake R:446:0x8c:0xAC # Vrock R:447:0x8d:0x9F # Death quasit R:448:0x8d:0xAC # Adunaphel the Quiet R:449:0x95:0xA9 # Dark elven sorcerer R:450:0x8d:0x89 # Master lich R:451:0x94:0x8F # Hezrou R:452:0x8d:0xA0 # Akhorahil the Blind R:453:0x95:0xAA # Gorlim, Betrayer of Barahir R:454:0x95:0xAB # Archon R:455:0x8e:0xB9 # Glabrezu R:456:0x8d:0xA1 # Ren the Unclean R:457:0x95:0xAC # Nalfeshnee R:458:0x8d:0xA2 # Undead beholder R:459:0x90:0x8B # Dread R:460:0x94:0x85 # Mumak R:461:0x91:0xBF # Ancient multi-hued dragon R:462:0x8c:0x9F # Ethereal dragon R:463:0x8c:0xA6 # Ji Indur Dawndeath R:464:0x95:0xAD # Marilith R:465:0x8d:0xA3 # Quaker, Master of Earth R:466:0x95:0xAE # Lesser Balrog R:467:0x8d:0xBA # Ariel, Queen of Air R:468:0x95:0xAF # 11-headed hydra R:469:0x90:0xA9 # Patriarch R:470:0x84:0xA1 # Dreadmaster R:471:0x94:0x83 # Drolem R:472:0x92:0xcf # Scatha the Worm R:473:0x95:0xB0 # Dwar, Dog Lord of Waw R:474:0x95:0xB1 # Smaug the Golden R:475:0x95:0xB2 # Dracolich R:476:0x8c:0xB0 # Greater titan R:477:0x92:0x91 # Dracolisk R:478:0x8c:0xB4 # Death mold R:479:0x8e:0xCA # Itangast the Fire Drake R:480:0x95:0xB3 # Glaurung, Father of the Dragons R:481:0x95:0xB4 # Master mystic R:482:0x84:0xA2 # The Balrog of Moria R:483:0x95:0xB5 # Nightwing R:484:0x94:0x8F # Nether hound R:485:0x90:0xC3 # Time hound R:486:0x90:0xCC # Plasma hound R:487:0x90:0xC6 # Demonic quylthulg R:488:0x93:0x83 # Great Storm Wyrm R:489:0x8c:0xA1 # Baphomet the Minotaur Lord R:490:0x95:0xB6 # Harowen the Black Hand R:491:0x95:0xB7 # Hoarmurath of Dir R:492:0x95:0xB8 # Grand master mystic R:493:0x84:0xA3 # Khamul, the Black Easterling R:494:0x95:0xB9 # Ethereal hound R:495:0x90:0xC8 # Great Ice Wyrm R:496:0x8c:0xA2 # The Phoenix R:497:0x95:0xBA # Nightcrawler R:498:0x94:0x90 # Hand druj R:499:0x92:0x9E # Eye druj R:500:0x92:0x9F # Skull druj R:501:0x92:0xA0 # Chaos vortex R:502:0x92:0xAC # Aether vortex R:503:0x92:0xAD # The Lernaean Hydra R:504:0x95:0xBB # Thuringwethil, the Vampire Messenger R:505:0x95:0xBC # Great Hell Wyrm R:506:0x8c:0xA0 # Draconic quylthulg R:507:0x93:0x84 # Fundin Bluecloak R:508:0x95:0xBD # Uriel, Angel of Fire R:509:0x95:0xBE # Azriel, Angel of Death R:510:0x95:0xBF # Ancalagon the Black R:511:0x95:0xC0 # Nightwalker R:512:0x94:0x91 # Gabriel, the Messenger R:513:0x95:0xC1 # Saruman of Many Colours R:514:0x95:0xC2 # Dreadlord R:515:0x94:0x84 # The Cat Lord R:516:0x95:0xC3 # Jabberwock R:517:0x93:0x99 # Chaos hound R:518:0x90:0xBE # Great Wyrm of Chaos R:519:0x8c:0xA3 # Great Wyrm of Law R:520:0x8c:0xA4 # Great Wyrm of Balance R:521:0x8c:0xA5 # Tselakus, the Dreadlord R:522:0x95:0xC4 # Great Wyrm of Many Colours R:523:0x95:0xC5 # Black reaver R:524:0x94:0x93 # Greater demonic quylthulg R:525:0x93:0x85 # Greater draconic quylthulg R:526:0x93:0x86 # Greater rotting quylthulg R:527:0x93:0x87 # Feagwath, the Undead Sorcerer R:528:0x95:0xC6 # Omarax, the Eye Tyrant R:529:0x95:0xC7 # Ungoliant, the Unlight R:530:0x95:0xC8 # Aether hound R:531:0x90:0xCD # The Mouth of Sauron R:532:0x95:0xC9 # Master quylthulg R:533:0x95:0xCA # Qlzqqlzuup, the Emperor Quylthulg R:534:0x95:0xCB # The Witch-King of Angmar R:535:0x95:0xCC # Pazuzu, Lord of Air R:536:0x95:0xCD # Hellhound R:537:0x8f:0xd7 # Cantoras, the Skeletal Lord R:538:0x95:0xCE # The Tarrasque R:539:0x95:0xCF # Lungorthin, the Balrog of White Fire R:540:0x95:0xD0 # Draugluin, Sire of All Werewolves R:541:0x95:0xD1 # Vecna, the Emperor Lich R:542:0x95:0xD2 # Huan, Wolfhound of the Valar R:543:0x8f:0xd9 # Carcharoth, the Jaws of Thirst R:544:0x95:0xD4 # Gothmog, the High Captain of Balrogs R:545:0x95:0xD5 # Sauron, the Sorcerer R:546:0x8e:0xDF # Morgoth, Lord of Darkness R:547:0x8f:0xC7 # Silver mouse R:548:0x8d:0x98 # Rot jelly R:549:0x8f:0x8D # Giant tan bat R:550:0x90:0x82 # Giant silver ant R:551:0x91:0x82 # Giant brown tick R:552:0x8F:0xAB # Disenchanter bat R:553:0x90:0x81 # Shimmering mold R:554:0x8E:0xCB # Wyvern R:555:0x8c:0xaf # Chest mimic R:556:0x87:0x83 # Demilich R:557:0x94:0x92 # Archlich R:558:0x94:0x8e # Crow R:559:0x93:0xA5 # Raven R:560:0x93:0xA3 # Crebain R:561:0x93:0xA4 # Winged Horror R:562:0x92:0xCE # Cave bear R:563:0x93:0xA2 # Grizzly bear R:564:0x93:0xA0 # Werebear R:565:0x93:0xA1 # Beorn, the Shape-Changer R:566:0x8D:0xC9 # Barbazu R:567:0x8F:0xC3 # Bile Demon R:568:0x8D:0xB9 # Osyluth R:569:0x8E:0xBC # Gelugon R:570:0x93:0xA7 # Horned Reaper R:571:0x8E:0x9B # Pit Fiend R:572:0x93:0xA6 # Greater Balrog R:573:0x8d:0xb6 # Baby bronze dragon R:574:0x8C:0x81 # Baby gold dragon R:575:0x8C:0x86 # Great Swamp Wyrm R:576:0x8E:0xA1 # Great Wyrm of Perplexity R:577:0x8E:0x9F # Great Bile Wyrm R:578:0x8E:0xA3 # Great Wyrm of Thunder R:579:0x8E:0xA2 # Ranger R:580:0x84:0xAC # Paladin R:581:0x84:0xA7 # Ranger Chieftain R:582:0x84:0xAA # Berserker R:583:0x84:0xAB # Cyclops R:584:0x8D:0xD1 # Polyphemus, the Blind Cyclops R:585:0x8D:0xD2 # Atlas, the Titan R:586:0x84:0xA6 # Kronos, Lord of the Titans R:587:0x84:0xA8 # Evil eye R:588:0x90:0x89 # Spectator R:589:0x90:0x8c # Gauth R:590:0x90:0x88 # Beholder hive-mother R:591:0x95:0xC7 # Neekerbreeker R:592:0x8F:0xA9 # Giant firefly R:593:0x8F:0xAE # Eol, the Dark Elf R:594:0x95:0xd6 # Maeglin, the Traitor of Gondolin R:595:0x95:0xd7 # Elder vampire R:596:0x94:0xB5 # Silent watcher R:597:0x8e:0xe0 # Nighthawk R:598:0x8E:0xBB # Ghoul R:599:0x94:0xBF # Ghast R:600:0x94:0xC0 # Greater basilisk R:601:0x91:0x89 # Aranea R:602:0x8F:0xAD # Elder aranea R:603:0x8F:0xB7 # Kobold shaman R:604:0x83:0xD9 # Bat of Gorgoroth R:605:0x90:0x84 # Doombat R:606:0x90:0x80 # Wolf chieftain R:607:0x8f:0xd6 # Bone golem R:608:0x94:0xAB # Bronze golem R:609:0x95:0xA4 # Ogre chieftain R:610:0x8D:0x97 # Ar-Pharazon the Golden R:611:0x95:0xd8 # Troll chieftain R:612:0x92:0xBD # Shardstorm R:613:0x92:0xa4 # Storm of Unmagic R:614:0x92:0xad # Greater mummy R:615:0x91:0xb4 # Multi-hued hound R:616:0x90:0xcd # Object attr/char definitions ##### Non-kind (contains the "pile" picture) ##### # K:0:0:135:182 ##### Various Stuff ##### K:spike:Iron Spike~:0x87:0x98 K:light:Wooden Torch~:0x87:0x9A K:light:Lantern~:0x87:0x99 K:flask:Flask~ of oil:0x87:0x97 ##### Food ##### ### Normal Food ### K:food:Ration~ of Food:0x82:0x84 K:food:Slime Mold~:0x82:0x85 K:food:Piece~ of Elvish Waybread:0x82:0x86 ### The shrooms, an interesting collection ### # Graphics are sourced from flavor entries in flvr-dvg.prf ##### Weapons ##### ### Swords ### K:sword:Dagger~:0x8a:0x83 K:sword:Main Gauche~:0x8a:0x84 K:sword:Rapier~:0x8a:0x85 K:sword:Short Sword~:0x8a:0x88 K:sword:Cutlass~:0x8a:0x8A K:sword:Tulwar~:0x8a:0x89 K:sword:Scimitar~:0x8a:0x8B K:sword:Long Sword~:0x8a:0x8D K:sword:Broad Sword~:0x8a:0x8C K:sword:Bastard Sword~:0x8a:0x8E K:sword:Katana~:0x8a:0x8E K:sword:Zweihander~:0x8a:0x8F K:sword:Executioner's Sword~:0x8a:0x8F K:sword:Blade~ of Chaos:0x8a:0x91 ### Whips ### K:hafted:Whip~:0x8a:0x92 K:hafted:Ball-and-Chain~:0x8a:0x99 K:hafted:Morning Star~:0x8a:0x97 K:hafted:Flail~:0x8a:0x96 K:hafted:Two-Handed Great Flail~:0x8a:0x9A ### Clubs ### K:hafted:Mace~:0x8a:0x94 K:hafted:Lead-Filled Mace~:0x8a:0x98 K:hafted:Quarterstaff~:0x8a:0x95 K:hafted:War Hammer~:0x8a:0x93 K:hafted:Maul~:0x8a:0xB0 K:hafted:Great Hammer~:0x8a:0xb0 K:hafted:Mace~ of Disruption:0x8a:0x9B ### Spears ### K:polearm:Spear~:0x8a:0x9C K:polearm:Awl-Pike~:0x8a:0x9E K:polearm:Trident~:0x8a:0x9D K:polearm:Halberd~:0x8a:0xA6 K:polearm:Pike~:0x8a:0xA2 ### Axes ### K:polearm:Beaked Axe~:0x8a:0xA3 K:polearm:Broad Axe~:0x8a:0xA4 K:polearm:Battle Axe~:0x8a:0xA1 K:polearm:Lochaber Axe~:0x8a:0xA7 K:polearm:Great Axe~:0x8a:0xA8 ### Other misc polearms ### K:polearm:Scythe~:0x8a:0xA9 K:polearm:Glaive~:0x8a:0xA5 K:polearm:Lance~:0x8a:0x9F K:polearm:Scythe~ of Slicing:0x8a:0xAA K:polearm:Lucerne Hammer~:0x8a:0xA0 ##### Bows, Crossbows, Slings ##### K:bow:Sling~:0x8a:0xAF K:bow:Short Bow~:0x8a:0xAB K:bow:Long Bow~:0x8a:0xAC K:bow:Light Crossbow~:0x8a:0xAD K:bow:Heavy Crossbow~:0x8a:0xAE ##### Missiles ##### K:arrow:Arrow~:0x8a:0xB1 K:arrow:Seeker Arrow~:0x8a:0xB2 K:arrow:Mithril Arrow~:0x8a:0xD9 K:bolt:Bolt~:0x8a:0xB3 K:bolt:Seeker Bolt~:0x8a:0xB4 K:bolt:Mithril Bolt~:0x8a:0xE3 K:shot:Rounded Pebble~:0x8a:0xB5 K:shot:Iron Shot~:0x8a:0xB6 K:shot:Mithril Shot~:0x8a:0xB6 ##### Digging Tools ##### K:digger:Shovel~:0x87:0x9E K:digger:Pick~:0x87:0x9B K:digger:Mattock~:0x87:0x9D ##### Armor ##### K:boots:Pair~ of Leather Sandals:0x80:0x94 K:boots:Pair~ of Leather Boots:0x80:0x95 K:boots:Pair~ of Iron Shod Boots:0x80:0x96 K:boots:Pair~ of Steel Shod Boots:0x80:0x96 K:boots:Pair~ of Mithril Shod Boots:0x80:0x96 K:boots:Pair~ of Ethereal Slippers:0x80:0x93 ### Headgear ### K:helm:Hard Leather Cap~:0x80:0xC6 K:helm:Metal Cap~:0x80:0x8B K:helm:Iron Helm~:0x80:0x8C K:helm:Steel Helm~:0x80:0x8D K:crown:Iron Crown~:0x80:0x8F K:crown:Golden Crown~:0x80:0x90 K:crown:Jewel Encrusted Crown~:0x80:0x91 ### Body armours ### K:soft armor:Robe~:0x80:0xA2 K:soft armor:Soft Leather Armour~:0x80:0xA6 K:soft armor:Studded Leather Armour~:0x80:0xA9 K:soft armor:Hard Leather Armour~:0x80:0xA8 K:soft armor:Leather Scale Mail~:0x80:0xAA K:hard armor:Metal Scale Mail~:0x80:0xAB K:hard armor:Chain Mail~:0x80:0xAD K:hard armor:Augmented Chain Mail~:0x80:0xAF K:hard armor:Bar Chain Mail~:0x80:0xB0 K:hard armor:Metal Brigandine Armour~:0x80:0xB1 K:hard armor:Partial Plate Armour~:0x80:0xB2 K:hard armor:Metal Lamellar Armour~:0x80:0xB3 K:hard armor:Full Plate Armour~:0x80:0xB4 K:hard armor:Ribbed Plate Armour~:0x80:0xB5 K:hard armor:Mithril Chain Mail~:0x80:0xB7 K:hard armor:Mithril Plate Mail~:0x80:0xB6 K:hard armor:Adamantite Plate Mail~:0x80:0xB8 ### The Cloaks ### K:cloak:Cloak~:0x80:0x81 K:cloak:Fur Cloak~:0x80:0x82 K:cloak:Elven Cloak~:0x80:0x83 K:cloak:Ethereal Cloak~:0x80:0x84 ### The Gloves ### K:gloves:Set~ of Leather Gloves:0x80:0x97 K:gloves:Set~ of Gauntlets:0x80:0x98 K:gloves:Set~ of Mithril Gauntlets:0x80:0x9A K:gloves:Set~ of Caestus:0x80:0x9B K:gloves:Set~ of Alchemist's Gloves:0x80:0x99 #K:gloves:Set~ of Mining Gloves:0x80:0x9A ### The shields ### #K:shield:Buckler~:0x80:0x9C K:shield:Wicker Shield~:0x80:0x9C K:shield:Small Metal Shield~:0x80:0x9E K:shield:Leather Shield~:0x80:0x9D K:shield:Large Metal Shield~:0x80:0x9F K:shield:Mithril Shield~:0x80:0xA0 ##### Rings ##### # Graphics are sourced from flavor entries in flvr-dvg.prf ##### Amulets ##### # Graphics are sourced from flavor entries in flvr-dvg.prf ##### Scrolls ##### ### Teleportation ### K:scroll:Phase Door:0x87:0xD5 K:scroll:Teleportation:0x87:0xD6 K:scroll:Teleport Level:0x87:0xD7 ### Detection ### K:scroll:Magic Mapping:0x87:0xD9 K:scroll:Treasure Detection:0x87:0xEF K:scroll:Trap Detection:0x87:0xE2 K:scroll:Door/Stair Location:0x87:0xE8 K:scroll:Detect Invisible:0x87:0xEE ### Enchantments ### K:scroll:Enchant Weapon To-Hit:0x87:0xCF K:scroll:Enchant Weapon To-Dam:0x87:0xD0 K:scroll:Enchant Armour:0x87:0xD2 K:scroll:*Enchant Weapon*:0x87:0xEB K:scroll:*Enchant Armour*:0x87:0xD1 K:scroll:Remove Curse:0x87:0xF0 K:scroll:*Remove Curse*:0x87:0xF1 ### Summoning ### K:scroll:Summon Monster:0x87:0xD4 K:scroll:Summon Undead:0x87:0xDE K:scroll:Acquirement:0x87:0xF4 K:scroll:*Acquirement*:0x87:0xF5 ### Killing scrolls ### K:scroll:Dispel Undead:0x87:0xEC K:scroll:Banishment:0x87:0xE3 K:scroll:Mass Banishment:0x87:0xE9 ### Utility ### K:scroll:Satisfy Hunger:0x87:0xE6 K:scroll:Identify:0x87:0xCD K:scroll:Light:0x87:0xD3 K:scroll:Word of Recall:0x87:0xDF K:scroll:Recharging:0x87:0xDB K:scroll:Trap/Door Destruction:0x87:0xF2 K:scroll:Deep Descent:0x87:0xf7 ### "Holy" spells ### K:scroll:Blessing:0x87:0xDD K:scroll:Holy Chant:0x87:0xDC K:scroll:Holy Prayer:0x87:0xE0 K:scroll:Protection from Evil:0x87:0xED ### Misc. ### K:scroll:Monster Confusion:0x87:0xD8 K:scroll:Rune of Protection:0x87:0xDA K:scroll:*Destruction*:0x87:0xF6 ### Bad scrolls ### K:scroll:Aggravate Monster:0x87:0xE4 K:scroll:Curse Weapon:0x87:0xEA K:scroll:Curse Armour:0x87:0xE5 K:scroll:Darkness:0x87:0xE7 K:scroll:Trap Creation:0x87:0xE1 ##### Potions ##### # Graphics are sourced from flavor entries in flvr-dvg.prf ##### Wands ##### # Graphics are sourced from flavor entries in flvr-dvg.prf ##### Staffs ##### # Graphics are sourced from flavor entries in flvr-dvg.prf ##### Rods ##### # Graphics are sourced from flavor entries in flvr-dvg.prf ##### Basic Books ##### K:magic book:[Magic for Beginners]:0x86:0x80 K:magic book:[Conjurings and Tricks]:0x86:0x81 K:magic book:[Incantations and Illusions]:0x86:0x82 K:magic book:[Sorcery and Evocations]:0x86:0x83 K:prayer book:[Beginners Handbook]:0x86:0x89 K:prayer book:[Words of Wisdom]:0x86:0x8A K:prayer book:[Chants and Blessings]:0x86:0x8B K:prayer book:[Exorcism and Dispelling]:0x86:0x8C ##### Special Books (note resistances) ##### K:magic book:[Resistances of Scarabtarices]:0x86:0x84 K:magic book:[Raal's Tome of Destruction]:0x86:0x85 K:magic book:[Mordenkainen's Escapes]:0x86:0x86 K:magic book:[Tenser's Transformations]:0x86:0x87 K:magic book:[Kelek's Grimoire of Power]:0x86:0x88 K:prayer book:[Ethereal Openings]:0x86:0x8D K:prayer book:[Godly Insights]:0x86:0x8E K:prayer book:[Purifications and Healing]:0x86:0x8F K:prayer book:[Holy Infusions]:0x86:0x90 K:prayer book:[Wrath of God]:0x86:0x91 ##### Chests ##### K:chest:Small wooden chest~:0x87:0x80 K:chest:Large wooden chest~:0x87:0x81 K:chest:Small iron chest~:0x87:0x82 K:chest:Large iron chest~:0x87:0x83 K:chest:Small steel chest~:0x87:0x84 K:chest:Large steel chest~:0x87:0x85 K:chest:Ruined chest~:0x87:0x86 ##### Junk ##### K:bottle:Empty Bottle~:0x87:0x96 K:junk:Shard~ of Pottery:0x87:0xA2 K:junk:Broken Stick~:0x87:0xAA K:skeleton:Broken Skull~:0x87:0xAB K:skeleton:Broken Bone~:0x87:0xAC K:skeleton:Canine Skeleton~:0x87:0xB1 K:skeleton:Rodent Skeleton~:0x87:0xB2 K:skeleton:Human Skeleton~:0x87:0xAD K:skeleton:Dwarf Skeleton~:0x87:0xAF K:skeleton:Elf Skeleton~:0x87:0xAE ##### Dragon Scale Mail ##### K:dragon armor:Black Dragon Scale Mail~:0x80:0xBB K:dragon armor:Blue Dragon Scale Mail~:0x80:0xB9 K:dragon armor:White Dragon Scale Mail~:0x80:0xBA K:dragon armor:Red Dragon Scale Mail~:0x80:0xBC K:dragon armor:Green Dragon Scale Mail~:0x80:0xBD K:dragon armor:Multi-Hued Dragon Scale Mail~:0x80:0xC4 K:dragon armor:Pseudo-Dragon Scale Mail~:0x80:0xC0 K:dragon armor:Law Dragon Scale Mail~:0x80:0xC2 K:dragon armor:Bronze Dragon Scale Mail~:0x80:0xBE K:dragon armor:Gold Dragon Scale Mail~:0x80:0xBF K:dragon armor:Chaos Dragon Scale Mail~:0x80:0xC1 K:dragon armor:Balance Dragon Scale Mail~:0x80:0xC3 K:dragon armor:Power Dragon Scale Mail~:0x80:0xC5 ##### Gold/gems ##### K:gold:copper:0x87:0x87 K:gold:silver:0x87:0x88 K:gold:garnets:0x87:0x8C K:gold:gold:0x87:0x89 K:gold:opals:0x87:0x8D K:gold:sapphires:0x87:0x8E K:gold:rubies:0x87:0x8F K:gold:diamonds:0x87:0x90 K:gold:emeralds:0x87:0x91 K:gold:mithril:0x87:0x8A K:gold:adamantite:0x87:0x8B ##### "Morgoth Artifacts" ##### K:hafted:Mighty Hammer~:0x8a:0xB0 K:crown:Massive Iron Crown~:0x80:0x92 ##### "Special Artifacts" ##### # These artifacts use numeric SVALs to ensure unique matches # The Phial of Galadriel K:light:4:0x87:0xB3 # The Star of Elendil K:light:5:0x87:0xB4 # The Arkenstone of Thrain K:light:6:0x87:0xB5 # The Amulet of Carlammas K:amulet:50:0x85:0xA6 # The Amulet of Ingwe K:amulet:51:0x85:0x9F # The Necklace of the Dwarves K:amulet:52:0x85:0xA5 # The Ring of Barahir K:ring:50:0x85:0x95 # The Ring of Tulkas K:ring:51:0x85:0x95 # The Ring of Power 'Narya' K:ring:52:0x85:0x96 # The Ring of Power 'Nenya' K:ring:53:0x85:0x93 # The Ring of Power 'Vilya' K:ring:54:0x85:0x94 # The Ring of Power 'The One Ring' K:ring:55:0x85:0x97 # The Palantir of Westernesse K:light:7:0x85:0xAA # The Elfstone 'Elessar' K:amulet:53:0x85:0xA9 # The Jewel 'Evenstar' K:amulet:54:0x85:0xA8 ##### Spell effect types ##### GF:*:static:0x81:0xC6 GF:*:0:0x81:0x80 GF:*:45:0x81:0x82 GF:*:90:0x81:0x81 GF:*:135:0x81:0x83 GF:MANA:static:0x81:0xC3 GF:MANA:0:0x81:0xA0 GF:MANA:45:0x81:0xA2 GF:MANA:90:0x81:0xA1 GF:MANA:135:0x81:0xA3 GF:LIGHT_WEAK:static:0x81:0xC2 GF:LIGHT_WEAK:0:0x81:0x9C GF:LIGHT_WEAK:45:0x81:0x9E GF:LIGHT_WEAK:90:0x81:0x9D GF:LIGHT_WEAK:135:0x81:0x9F GF:DARK_WEAK:static:0x81:0xC7 GF:DARK_WEAK:0:0x81:0x88 GF:DARK_WEAK:45:0x81:0x8A GF:DARK_WEAK:90:0x81:0x89 GF:DARK_WEAK:135:0x81:0x8B GF:WATER:static:0x81:0xBE GF:WATER:0:0x81:0x94 GF:WATER:45:0x81:0x96 GF:WATER:90:0x81:0x95 GF:WATER:135:0x81:0x97 GF:PLASMA:static:0x81:0xC4 GF:PLASMA:0:0x81:0xA8 GF:PLASMA:45:0x81:0xAA GF:PLASMA:90:0x81:0xA9 GF:PLASMA:135:0x81:0xAB GF:METEOR:static:0x81:0xC6 GF:METEOR:0:0x81:0x84 GF:METEOR:45:0x81:0x86 GF:METEOR:90:0x81:0x85 GF:METEOR:135:0x81:0x87 GF:ICE:static:0x81:0xC5 GF:ICE:0:0x81:0x98 GF:ICE:45:0x81:0x9A GF:ICE:90:0x81:0x99 GF:ICE:135:0x81:0x9B GF:GRAVITY | INERTIA | FORCE | TIME:static:0x81:0xBD GF:GRAVITY | INERTIA | FORCE | TIME:0:0x81:0xAC GF:GRAVITY | INERTIA | FORCE | TIME:45:0x81:0xAE GF:GRAVITY | INERTIA | FORCE | TIME:90:0x81:0xAD GF:GRAVITY | INERTIA | FORCE | TIME:135:0x81:0xAF GF:ACID:static:0x81:0xBD GF:ACID:0:0x81:0x90 GF:ACID:45:0x81:0x92 GF:ACID:90:0x81:0x91 GF:ACID:135:0x81:0x93 GF:ELEC:static:0x81:0xC2 GF:ELEC:0:0x81:0xA4 GF:ELEC:45:0x81:0xA6 GF:ELEC:90:0x81:0xA5 GF:ELEC:135:0x81:0xA7 GF:FIRE:static:0x81:0xBC GF:FIRE:0:0x81:0x8C GF:FIRE:45:0x81:0x8E GF:FIRE:90:0x81:0x8D GF:FIRE:135:0x81:0x8F GF:COLD:static:0x81:0xBF GF:COLD:0:0x81:0x98 GF:COLD:45:0x81:0x9A GF:COLD:90:0x81:0x99 GF:COLD:135:0x81:0x9B GF:POIS:static:0x81:0xBD GF:POIS:0:0x81:0x90 GF:POIS:45:0x81:0x92 GF:POIS:90:0x81:0x91 GF:POIS:135:0x81:0x93 GF:LIGHT:static:0x81:0xC2 GF:LIGHT:0:0x81:0x9C GF:LIGHT:45:0x81:0x9E GF:LIGHT:90:0x81:0x9D GF:LIGHT:135:0x81:0x9F GF:DARK | NETHER:static:0x81:0xC7 GF:DARK | NETHER:0:0x81:0x88 GF:DARK | NETHER:45:0x81:0x8A GF:DARK | NETHER:90:0x81:0x89 GF:DARK | NETHER:135:0x81:0x8B GF:SOUND:static:0x81:0xC6 GF:SOUND:0:0x81:0x84 GF:SOUND:45:0x81:0x86 GF:SOUND:90:0x81:0x85 GF:SOUND:135:0x81:0x87 GF:SHARD:static:0x81:0xC0 GF:SHARD:0:0x81:0xA8 GF:SHARD:45:0x81:0xAA GF:SHARD:90:0x81:0xA9 GF:SHARD:135:0x81:0xAB GF:NEXUS | DISEN | CONFU:static:0x81:0xD6 GF:NEXUS | DISEN | CONFU:0:0x81:0xAC GF:NEXUS | DISEN | CONFU:45:0x81:0xAE GF:NEXUS | DISEN | CONFU:90:0x81:0xAD GF:NEXUS | DISEN | CONFU:135:0x81:0xAF GF:CHAOS:static:0x81:0xC3 GF:CHAOS:0:0x81:0xA0 GF:CHAOS:45:0x81:0xA2 GF:CHAOS:90:0x81:0xA1 GF:CHAOS:135:0x81:0xA3 # Load the special player pictures %:xtra-dvg.prf # Load the flavored objects %:flvr-dvg.prf angband-v3.3.2/lib/pref/xtra-new.prf0000644000175000017500000001050511651552410016570 0ustar chriscchrisc# File: xtra-new.prf # # This file defines special attr/char mappings for use in "graphics" mode # # Edited for use with Adam Bolt's new graphics by Robert Ruehlmann # < rr9@thangorodrim.net > # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Remap the player icon ##### ?:[AND [EQU $CLASS Warrior] [EQU $RACE Human] ] R:0:0x92:0x80 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Elf] ] R:0:0x92:0x81 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Elf] ] R:0:0x92:0x82 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Hobbit] ] R:0:0x92:0x83 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Gnome] ] R:0:0x92:0x84 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dwarf] ] R:0:0x92:0x85 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Orc] ] R:0:0x92:0x86 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Troll] ] R:0:0x92:0x87 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dunadan] ] R:0:0x92:0x88 ?:[AND [EQU $CLASS Warrior] [EQU $RACE High-Elf] ] R:0:0x92:0x89 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Kobold] ] R:0:0x92:0x92 ?:[AND [EQU $CLASS Mage] [EQU $RACE Human] ] R:0:0x93:0x80 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Elf] ] R:0:0x93:0x81 ?:[AND [EQU $CLASS Mage] [EQU $RACE Elf] ] R:0:0x93:0x82 ?:[AND [EQU $CLASS Mage] [EQU $RACE Hobbit] ] R:0:0x93:0x83 ?:[AND [EQU $CLASS Mage] [EQU $RACE Gnome] ] R:0:0x93:0x84 ?:[AND [EQU $CLASS Mage] [EQU $RACE Dwarf] ] R:0:0x93:0x85 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Orc] ] R:0:0x93:0x86 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Troll] ] R:0:0x93:0x87 ?:[AND [EQU $CLASS Mage] [EQU $RACE Dunadan] ] R:0:0x93:0x88 ?:[AND [EQU $CLASS Mage] [EQU $RACE High-Elf] ] R:0:0x93:0x89 ?:[AND [EQU $CLASS Mage] [EQU $RACE Kobold] ] R:0:0x93:0x92 ?:[AND [EQU $CLASS Priest] [EQU $RACE Human] ] R:0:0x94:0x80 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Elf] ] R:0:0x94:0x81 ?:[AND [EQU $CLASS Priest] [EQU $RACE Elf] ] R:0:0x94:0x82 ?:[AND [EQU $CLASS Priest] [EQU $RACE Hobbit] ] R:0:0x94:0x83 ?:[AND [EQU $CLASS Priest] [EQU $RACE Gnome] ] R:0:0x94:0x84 ?:[AND [EQU $CLASS Priest] [EQU $RACE Dwarf] ] R:0:0x94:0x85 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Orc] ] R:0:0x94:0x86 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Troll] ] R:0:0x94:0x87 ?:[AND [EQU $CLASS Priest] [EQU $RACE Dunadan] ] R:0:0x94:0x88 ?:[AND [EQU $CLASS Priest] [EQU $RACE High-Elf] ] R:0:0x94:0x89 ?:[AND [EQU $CLASS Priest] [EQU $RACE Kobold] ] R:0:0x94:0x92 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Human] ] R:0:0x95:0x80 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Elf] ] R:0:0x95:0x81 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Elf] ] R:0:0x95:0x82 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Hobbit] ] R:0:0x95:0x83 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Gnome] ] R:0:0x95:0x84 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dwarf] ] R:0:0x95:0x85 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Orc] ] R:0:0x95:0x86 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Troll] ] R:0:0x95:0x87 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dunadan] ] R:0:0x95:0x88 ?:[AND [EQU $CLASS Rogue] [EQU $RACE High-Elf] ] R:0:0x95:0x89 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Kobold] ] R:0:0x95:0x92 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Human] ] R:0:0x96:0x80 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Elf] ] R:0:0x96:0x81 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Elf] ] R:0:0x96:0x82 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Hobbit] ] R:0:0x96:0x83 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Gnome] ] R:0:0x96:0x84 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dwarf] ] R:0:0x96:0x85 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Orc] ] R:0:0x96:0x86 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Troll] ] R:0:0x96:0x87 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dunadan] ] R:0:0x96:0x88 ?:[AND [EQU $CLASS Ranger] [EQU $RACE High-Elf] ] R:0:0x96:0x89 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Kobold] ] R:0:0x96:0x92 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Human] ] R:0:0x97:0x80 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Elf] ] R:0:0x97:0x81 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Elf] ] R:0:0x97:0x82 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Hobbit] ] R:0:0x97:0x83 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Gnome] ] R:0:0x97:0x84 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dwarf] ] R:0:0x97:0x85 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Orc] ] R:0:0x97:0x86 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Troll] ] R:0:0x97:0x87 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dunadan] ] R:0:0x97:0x88 ?:[AND [EQU $CLASS Paladin] [EQU $RACE High-Elf] ] R:0:0x97:0x89 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Kobold] ] R:0:0x97:0x92 angband-v3.3.2/lib/pref/Makefile0000644000175000017500000000066211651552410015755 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk CONFIG = flvr-dvg.prf font-win.prf \ xtra-new.prf flvr-new.prf font-mac.prf \ font-x11.prf message.prf pref.prf \ xtra-xxx.prf flvr-xxx.prf font.prf font-xxx.prf \ graf-new.prf user.prf \ font-gcu.prf font-sdl.prf graf-dvg.prf graf.prf graf-xxx.prf \ xtra-dvg.prf \ flvr-nmd.prf graf-nmd.prf xtra-nmd.prf PACKAGE = pref angband-v3.3.2/lib/pref/font-xxx.prf0000644000175000017500000000134111651552410016614 0ustar chriscchrisc# File: font-xxx.prf ##### Default inventory object colors ##### # SKELETON E:1:0x01 # BOTTLE E:2:0x01 # JUNK E:3:0x01 # SPIKE E:5:0x02 # CHEST E:7:0x02 # SHOT E:16:0x0F # ARROW E:17:0x0F # BOLT E:18:0x0F # BOW E:19:0x07 # DIGGING E:20:0x02 # HAFTED E:21:0x01 # POLEARM E:22:0x01 # SWORD E:23:0x01 # BOOTS E:30:0x0F # GLOVES E:31:0x0F # HELM E:32:0x0F # CROWN E:33:0x0F # SHIELD E:34:0x0F # CLOAK E:35:0x0F # SOFT_ARMOR E:36:0x02 # HARD_ARMOR E:37:0x02 # DRAG_ARMOR E:38:0x02 # LIGHT E:39:0x0B # AMULET E:40:0x03 # RING E:45:0x04 # STAFF E:55:0x0F # WAND E:65:0x05 # ROD E:66:0x0A # SCROLL E:70:0x01 # POTION E:75:0x0E # FLASK E:77:0x0B # FOOD E:80:0x0F # MAGIC_BOOK E:90:0x0C # PRAYER_BOOK E:91:0x0D angband-v3.3.2/lib/pref/font-sdl.prf0000644000175000017500000000143711651552410016555 0ustar chriscchrisc# File: font-win.prf # # This file is used by Angband (when it was compiled using "main-sdl.c") # to specify simple attr:char remappings using a standard font, allowing # the use of special pseudo-graphic pictures for walls and such. # # Note that this file is extremely similar to the "font-ibm.prf" file, # but it uses different codes, since it uses the special pseudo-graphic # symbols defined in the "lib:xtra:font:*.FON" files, and there is only # one special wall type, so we have to use special "colors". # ### Terrain features ### # Floors (white : centered dot) F:1:all:1:7 # Magma (slate : solid block) F:50:all:2:127 # Quartz (light slate : solid block) F:51:all:9:127 # Granite walls (white : solid block) F:56:all:1:127 # Permanent rock (dark red : solid block) F:60:all:4:127 angband-v3.3.2/lib/pref/flvr-xxx.prf0000644000175000017500000002342611651552410016627 0ustar chriscchrisc# Plain Gold ring L:1:0xB5:0x8A # Alexandrite ring L:2:0xB5:0x82 # Amethyst ring L:3:0xB5:0x80 # Aquamarine ring L:4:0xB5:0x83 # Azurite ring L:5:0xB5:0x83 # Beryl ring L:6:0xB5:0x82 # Bloodstone ring L:7:0xB5:0x81 # Calcite ring L:8:0xB5:0x8C # Carnelian ring L:9:0xB5:0x81 # Corundum ring L:10:0xB5:0x89 # Diamond ring L:11:0xB5:0x8C # Emerald ring L:12:0xB5:0x82 # Fluorite ring L:13:0xB5:0x82 # Garnet ring L:14:0xB5:0x81 # Granite ring L:15:0xB5:0x8C # Jade ring L:16:0xB5:0x82 # Jasper ring L:17:0xB5:0x88 # Lapis Lazuli ring L:18:0xB5:0x83 # Malachite ring L:19:0xB5:0x82 # Marble ring L:20:0xB5:0x8C # Moonstone ring L:21:0xB5:0x8C # Onyx ring L:22:0xB5:0x81 # Opal ring L:23:0xB5:0x8C # Pearl ring L:24:0xB5:0x8C # Quartz ring L:25:0xB5:0x8C # Quartzite ring L:26:0xB5:0x8C # Rhodonite ring L:27:0xB5:0x81 # Ruby ring L:28:0xB5:0x81 # Sapphire ring L:29:0xB5:0x83 # Tiger Eye ring L:30:0xB5:0x8A # Topaz ring L:31:0xB5:0x8A # Turquoise ring L:32:0xB5:0x83 # Zircon ring L:33:0xB5:0x88 # Platinum ring L:34:0xB5:0x8C # Bronze ring L:35:0xB5:0x88 # Gold ring L:36:0xB5:0x8A # Obsidian ring L:37:0xB5:0x8B # Silver ring L:38:0xB5:0x8C # Tortoise Shell ring L:39:0xB5:0x88 # Mithril ring L:40:0xB5:0x83 # Jet ring L:41:0xB5:0x8B # Engagement ring L:42:0xB5:0x8A # Adamantite ring L:43:0xB5:0x82 # Amber amulet L:44:0xB6:0x86 # Driftwood amulet L:45:0xB6:0x8C # Coral amulet L:46:0xB6:0x88 # Agate amulet L:47:0xB6:0x88 # Ivory amulet L:48:0xB6:0x88 # Obsidian amulet L:49:0xB6:0x87 # Bone amulet L:50:0xB6:0x88 # Brass amulet L:51:0xB6:0x8C # Bronze amulet L:52:0xB6:0x8C # Pewter amulet L:53:0xB6:0x85 # Tortoise Shell amulet L:54:0xB6:0x84 # Golden amulet L:55:0xB6:0x86 # Azure amulet L:56:0xB6:0x8B # Crystal amulet L:57:0xB6:0x88 # Silver amulet L:58:0xB6:0x88 # Copper amulet L:59:0xB6:0x8C # Carved Oak amulet L:60:0xB6:0x84 # Dragon Tooth amulet L:61:0xB6:0x88 # Ruby amulet L:62:0xB6:0x81 # Mithril amulet L:63:0xB6:0x8B # Adamant amulet L:64:0xB6:0x82 # Flint Stone amulet L:65:0xB6:0x85 # Sea Shell amulet L:66:0xB6:0x8B # Mother-of-Pearl amulet L:67:0xB6:0x88 # Aspen staff L:68:0xB9:0x87 # Balsa staff L:69:0xB9:0x87 # Banyan staff L:70:0xB9:0x87 # Birch staff L:71:0xB9:0x87 # Cedar staff L:72:0xB9:0x87 # Cottonwood staff L:73:0xB9:0x87 # Cypress staff L:74:0xB9:0x87 # Dogwood staff L:75:0xB9:0x87 # Elm staff L:76:0xB9:0x87 # Eucalyptus staff L:77:0xB9:0x87 # Hemlock staff L:78:0xB9:0x87 # Hickory staff L:79:0xB9:0x87 # Ironwood staff L:80:0xB9:0x87 # Locust staff L:81:0xB9:0x87 # Mahogany staff L:82:0xB9:0x87 # Maple staff L:83:0xB9:0x87 # Mulberry staff L:84:0xB9:0x87 # Oak staff L:85:0xB9:0x87 # Pine staff L:86:0xB9:0x87 # Redwood staff L:87:0xB9:0x81 # Rosewood staff L:88:0xB9:0x81 # Spruce staff L:89:0xB9:0x87 # Sycamore staff L:90:0xB9:0x87 # Teak staff L:91:0xB9:0x87 # Walnut staff L:92:0xB9:0x87 # Mistletoe staff L:93:0xB9:0x82 # Hawthorn staff L:94:0xB9:0x87 # Bamboo staff L:95:0xB9:0x87 # Silver staff L:96:0xB9:0x85 # Runed staff L:97:0xB9:0x87 # Golden staff L:98:0xB9:0x82 # Ashen staff L:99:0xB9:0x85 # Gnarled staff L:100:0xB9:0x87 # Ivory staff L:101:0xB9:0x85 # Willow staff L:102:0xB9:0x87 # Aluminium wand L:103:0xB7:0x80 # Cast Iron wand L:104:0xB7:0x84 # Chromium wand L:105:0xB7:0x85 # Copper wand L:106:0xB7:0x87 # Gold wand L:107:0xB7:0x86 # Iron wand L:108:0xB7:0x85 # Magnesium wand L:109:0xB7:0x85 # Molybdenum wand L:110:0xB7:0x85 # Nickel wand L:111:0xB7:0x87 # Rusty wand L:112:0xB7:0x81 # Silver wand L:113:0xB7:0x85 # Steel wand L:114:0xB7:0x85 # Tin wand L:115:0xB7:0x85 # Titanium wand L:116:0xB7:0x85 # Tungsten wand L:117:0xB7:0x85 # Zirconium wand L:118:0xB7:0x85 # Zinc wand L:119:0xB7:0x85 # Aluminum-Plated wand L:120:0xB7:0x80 # Copper-Plated wand L:121:0xB7:0x87 # Gold-Plated wand L:122:0xB7:0x86 # Nickel-Plated wand L:123:0xB7:0x87 # Silver-Plated wand L:124:0xB7:0x85 # Steel-Plated wand L:125:0xB7:0x85 # Tin-Plated wand L:126:0xB7:0x85 # Zinc-Plated wand L:127:0xB7:0x85 # Mithril-Plated wand L:128:0xB7:0x80 # Mithril wand L:129:0xB7:0x80 # Runed wand L:130:0xB7:0x87 # Bronze wand L:131:0xB7:0x87 # Brass wand L:132:0xB7:0x87 # Platinum wand L:133:0xB7:0x85 # Lead wand L:134:0xB7:0x85 # Lead-Plated wand L:135:0xB7:0x85 # Ivory wand L:136:0xB7:0x85 # Pewter wand L:137:0xB7:0x85 # Aluminum rod L:138:0xB8:0x80 # Cast Iron rod L:139:0xB8:0x84 # Chromium rod L:140:0xB8:0x85 # Copper rod L:141:0xB8:0x87 # Gold rod L:142:0xB8:0x86 # Iron rod L:143:0xB8:0x85 # Magnesium rod L:144:0xB8:0x85 # Molybdenum rod L:145:0xB8:0x85 # Nickel rod L:146:0xB8:0x87 # Rusty rod L:147:0xB8:0x81 # Silver rod L:148:0xB8:0x85 # Steel rod L:149:0xB8:0x85 # Tin rod L:150:0xB8:0x85 # Titanium rod L:151:0xB8:0x85 # Tungsten rod L:152:0xB8:0x85 # Zirconium rod L:153:0xB8:0x85 # Zinc rod L:154:0xB8:0x85 # Aluminum-Plated rod L:155:0xB8:0x80 # Copper-Plated rod L:156:0xB8:0x87 # Gold-Plated rod L:157:0xB8:0x86 # Nickel-Plated rod L:158:0xB8:0x87 # Silver-Plated rod L:159:0xB8:0x85 # Steel-Plated rod L:160:0xB8:0x85 # Tin-Plated rod L:161:0xB8:0x85 # Zinc-Plated rod L:162:0xB8:0x85 # Mithril-Plated rod L:163:0xB8:0x80 # Mithril rod L:164:0xB8:0x80 # Runed rod L:165:0xB8:0x87 # Bronze rod L:166:0xB8:0x87 # Brass rod L:167:0xB8:0x87 # Platinum rod L:168:0xB8:0x85 # Lead rod L:169:0xB8:0x85 # Lead-Plated rod L:170:0xB8:0x85 # Ivory rod L:171:0xB8:0x85 # Pewter rod L:172:0xB8:0x85 # Blue mushroom L:173:0xBA:0x80 # Black mushroom L:174:0xBA:0x84 # Black Spotted mushroom L:175:0xBA:0x84 # Brown mushroom L:176:0xBA:0x87 # Dark Blue mushroom L:177:0xBA:0x80 # Dark Green mushroom L:178:0xBA:0x82 # Dark Red mushroom L:179:0xBA:0x81 # Yellow mushroom L:180:0xBA:0x86 # Furry mushroom L:181:0xBA:0x85 # Green mushroom L:182:0xBA:0x82 # Grey mushroom L:183:0xBA:0x85 # Light Blue mushroom L:184:0xBA:0x80 # Light Green mushroom L:185:0xBA:0x82 # Violet mushroom L:186:0xBA:0x83 # Red mushroom L:187:0xBA:0x81 # Slimy mushroom L:188:0xBA:0x85 # Tan mushroom L:189:0xBA:0x87 # White mushroom L:190:0xBA:0x85 # White Spotted mushroom L:191:0xBA:0x85 # Wrinkled mushroom L:192:0xBA:0x87 # Clear potion L:193:0xBC:0x83 # Light Brown potion L:194:0xBC:0x89 # Icky Green potion L:195:0xBC:0x86 # Azure potion L:196:0xBC:0x8D # Blue potion L:197:0xBC:0x85 # Blue Speckled potion L:198:0xBC:0x85 # Black potion L:199:0xBC:0x84 # Brown potion L:200:0xBC:0x89 # Brown Speckled potion L:201:0xBC:0x89 # Bubbling potion L:202:0xBC:0x83 # Chartreuse potion L:203:0xBC:0x8C # Cloudy potion L:204:0xBC:0x83 # Copper Speckled potion L:205:0xBC:0x89 # Crimson potion L:206:0xBC:0x87 # Cyan potion L:207:0xBC:0x8D # Dark Blue potion L:208:0xBC:0x85 # Dark Green potion L:209:0xBC:0x86 # Dark Red potion L:210:0xBC:0x87 # Gold Speckled potion L:211:0xBC:0x88 # Green potion L:212:0xBC:0x86 # Green Speckled potion L:213:0xBC:0x86 # Grey potion L:214:0xBC:0x8A # Grey Speckled potion L:215:0xBC:0x8A # Hazy potion L:216:0xBC:0x83 # Indigo potion L:217:0xBC:0x8E # Light Blue potion L:218:0xBC:0x8D # Light Green potion L:219:0xBC:0x8C # Magenta potion L:220:0xBC:0x87 # Metallic Blue potion L:221:0xBC:0x85 # Metallic Red potion L:222:0xBC:0x87 # Metallic Green potion L:223:0xBC:0x86 # Metallic Purple potion L:224:0xBC:0x8E # Misty potion L:225:0xBC:0x83 # Orange potion L:226:0xBC:0x8B # Orange Speckled potion L:227:0xBC:0x8B # Pink potion L:228:0xBC:0x8B # Pink Speckled potion L:229:0xBC:0x8B # Puce potion L:230:0xBC:0x8E # Purple potion L:231:0xBC:0x8E # Purple Speckled potion L:232:0xBC:0x8E # Red potion L:233:0xBC:0x87 # Red Speckled potion L:234:0xBC:0x87 # Silver Speckled potion L:235:0xBC:0x83 # Smoky potion L:236:0xBC:0x84 # Tangerine potion L:237:0xBC:0x8B # Violet potion L:238:0xBC:0x8E # Vermilion potion L:239:0xBC:0x87 # White potion L:240:0xBC:0x83 # Yellow potion L:241:0xBC:0x88 # Violet Speckled potion L:242:0xBC:0x8E # Pungent potion L:243:0xBC:0x8B # Clotted Red potion L:244:0xBC:0x87 # Viscous Pink potion L:245:0xBC:0x8B # Oily Yellow potion L:246:0xBC:0x88 # Gloopy Green potion L:247:0xBC:0x86 # Shimmering potion L:248:0xBC:0x8E # Coagulated Crimson potion L:249:0xBC:0x87 # Yellow Speckled potion L:250:0xBC:0x88 # Gold potion L:251:0xBC:0x88 # Scroll L:252:0x86:0x82 # Scroll L:253:0x86:0x82 # Scroll L:254:0x86:0x82 # Scroll L:255:0x86:0x82 # Scroll L:256:0x86:0x82 # Scroll L:257:0x86:0x82 # Scroll L:258:0x86:0x82 # Scroll L:259:0x86:0x82 # Scroll L:260:0x86:0x82 # Scroll L:261:0x86:0x82 # Scroll L:262:0x86:0x82 # Scroll L:263:0x86:0x82 # Scroll L:264:0x86:0x82 # Scroll L:265:0x86:0x82 # Scroll L:266:0x86:0x82 # Scroll L:267:0x86:0x82 # Scroll L:268:0x86:0x82 # Scroll L:269:0x86:0x82 # Scroll L:270:0x86:0x82 # Scroll L:271:0x86:0x82 # Scroll L:272:0x86:0x82 # Scroll L:273:0x86:0x82 # Scroll L:274:0x86:0x82 # Scroll L:275:0x86:0x82 # Scroll L:276:0x86:0x82 # Scroll L:277:0x86:0x82 # Scroll L:278:0x86:0x82 # Scroll L:279:0x86:0x82 # Scroll L:280:0x86:0x82 # Scroll L:281:0x86:0x82 # Scroll L:282:0x86:0x82 # Scroll L:283:0x86:0x82 # Scroll L:284:0x86:0x82 # Scroll L:285:0x86:0x82 # Scroll L:286:0x86:0x82 # Scroll L:287:0x86:0x82 # Scroll L:288:0x86:0x82 # Scroll L:289:0x86:0x82 # Scroll L:290:0x86:0x82 # Scroll L:291:0x86:0x82 # Scroll L:292:0x86:0x82 # Scroll L:293:0x86:0x82 # Scroll L:294:0x86:0x82 # Scroll L:295:0x86:0x82 # Scroll L:296:0x86:0x82 # Scroll L:297:0x86:0x82 # Scroll L:298:0x86:0x82 # Scroll L:299:0x86:0x82 # Scroll L:300:0x86:0x82 # Scroll L:301:0x86:0x82 # Scroll L:302:0x86:0x82 # Ceremonial Rod L:303:0xB8:0x87 # Black Rod L:304:0xB8:0x84 # Red Rod L:305:0xB8:0x81 # Green Rod L:306:0xB8:0x82 # Blue Rod L:307:0xB8:0x80 # Divining Rod L:308:0xB8:0x87 # White Rod L:309:0xB8:0x85 # Lightning Rod L:310:0xB8:0x86 # Switch Rod L:311:0xB8:0x87 # Transparent Rod L:312:0xB8:0x84 angband-v3.3.2/lib/pref/user.prf0000644000175000017500000000176711651552410016013 0ustar chriscchrisc# File: user.prf # # This file defines "override" actions of various kinds # # This file includes, if appropriate, various "sub-files" # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Race Specific Subfiles ##### ?:[EQU $RACE Human] %:Human.prf ?:[EQU $RACE Half-Elf] %:Half-Elf.prf ?:[EQU $RACE Elf] %:Elf.prf ?:[EQU $RACE Hobbit] %:Hobbit.prf ?:[EQU $RACE Gnome] %:Gnome.prf ?:[EQU $RACE Dwarf] %:Dwarf.prf ?:[EQU $RACE Half-Orc] %:Half-Orc.prf # "Half-Troll.prf" is too long for stupid 8.3 filenames, # so try to load the shortened filename too. ?:[EQU $RACE Half-Troll] %:Half-Troll.prf %:H-Troll.prf ?:[EQU $RACE Dunadan] %:Dunadan.prf ?:[EQU $RACE High-Elf] %:High-Elf.prf ?:[EQU $RACE Kobold] %:Kobold.prf ##### Class Specific Subfiles ##### ?:[EQU $CLASS Warrior] %:Warrior.prf ?:[EQU $CLASS Mage] %:Mage.prf ?:[EQU $CLASS Priest] %:Priest.prf ?:[EQU $CLASS Rogue] %:Rogue.prf ?:[EQU $CLASS Ranger] %:Ranger.prf ?:[EQU $CLASS Paladin] %:Paladin.prf ?:1 angband-v3.3.2/lib/pref/graf-new.prf0000644000175000017500000010670011651552410016534 0ustar chriscchrisc# File: graf-new.prf # # This file defines special attr/char mappings for use in "graphics" mode # with Adam Bolt's 16x16 tiles. # # By Robert Ruehlmann < rr9@thangorodrim.net > # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Spell bolt/ball effects ##### GF:*:0:0x8F:0x84 GF:*:135:0x8F:0x87 GF:*:45:0x8F:0x86 GF:*:90:0x8F:0x85 GF:*:static:0x91:0x89 GF:LIGHT | LIGHT_WEAK:0:0x90:0x9C GF:LIGHT | LIGHT_WEAK:135:0x90:0x9F GF:LIGHT | LIGHT_WEAK:45:0x90:0x9E GF:LIGHT | LIGHT_WEAK:90:0x90:0x9D GF:LIGHT | LIGHT_WEAK:static:0x91:0x97 GF:ACID | WATER | ICE:0:0x8F:0x88 GF:ACID | WATER | ICE:135:0x8F:0x8B GF:ACID | WATER | ICE:45:0x8F:0x8A GF:ACID | WATER | ICE:90:0x8F:0x89 GF:ACID | WATER | ICE:static:0x91:0x8A GF:CHAOS | CONFU:0:0x90:0x94 GF:CHAOS | CONFU:135:0x90:0x97 GF:CHAOS | CONFU:45:0x90:0x96 GF:CHAOS | CONFU:90:0x90:0x95 GF:CHAOS | CONFU:static:0x91:0x95 GF:NETHER:0:0x90:0x88 GF:NETHER:135:0x90:0x8B GF:NETHER:45:0x90:0x8A GF:NETHER:90:0x90:0x89 GF:NETHER:static:0x91:0x92 GF:DARK | DARK_WEAK:0:0x8F:0x9C GF:DARK | DARK_WEAK:135:0x8F:0x9F GF:DARK | DARK_WEAK:45:0x8F:0x9E GF:DARK | DARK_WEAK:90:0x8F:0x9D GF:DARK | DARK_WEAK:static:0x91:0x8F GF:TIME:0:0x90:0x98 GF:TIME:135:0x90:0x9B GF:TIME:45:0x90:0x9A GF:TIME:90:0x90:0x99 GF:TIME:static:0x91:0x96 GF:POIS:0:0x8F:0x8C GF:POIS:135:0x8F:0x8F GF:POIS:45:0x8F:0x8E GF:POIS:90:0x8F:0x8D GF:POIS:static:0x91:0x8B GF:DISEN:0:0x8F:0x94 GF:DISEN:135:0x8F:0x97 GF:DISEN:45:0x8F:0x96 GF:DISEN:90:0x8F:0x95 GF:DISEN:static:0x91:0x8D GF:ELEC:0:0x8F:0x98 GF:ELEC:135:0x8F:0x9B GF:ELEC:45:0x8F:0x9A GF:ELEC:90:0x8F:0x99 GF:ELEC:static:0x91:0x8E GF:SHARD | HOLY_ORB | MANA:0:0x90:0x80 GF:SHARD | HOLY_ORB | MANA:135:0x90:0x83 GF:SHARD | HOLY_ORB | MANA:45:0x90:0x82 GF:SHARD | HOLY_ORB | MANA:90:0x90:0x81 GF:SHARD | HOLY_ORB | MANA:static:0x91:0x90 GF:PLASMA | METEOR:0:0x90:0x90 GF:PLASMA | METEOR:135:0x90:0x93 GF:PLASMA | METEOR:45:0x90:0x92 GF:PLASMA | METEOR:90:0x90:0x91 GF:PLASMA | METEOR:static:0x91:0x94 GF:GRAVITY | INERTIA | FORCE | NEXUS:0:0x90:0x84 GF:GRAVITY | INERTIA | FORCE | NEXUS:135:0x90:0x87 GF:GRAVITY | INERTIA | FORCE | NEXUS:45:0x90:0x86 GF:GRAVITY | INERTIA | FORCE | NEXUS:90:0x90:0x85 GF:GRAVITY | INERTIA | FORCE | NEXUS:static:0x91:0x91 GF:SOUND:0:0x8F:0x90 GF:SOUND:135:0x8F:0x93 GF:SOUND:45:0x8F:0x92 GF:SOUND:90:0x8F:0x91 GF:SOUND:static:0x91:0x8C GF:FIRE:0:0x90:0x8C GF:FIRE:135:0x90:0x8F GF:FIRE:45:0x90:0x8E GF:FIRE:90:0x90:0x8D GF:FIRE:static:0x91:0x93 ##### Feature attr/char definitions ##### # nothing F:0:all:0x80:0x80 # open floor (+ invisible trap) F:1:bright:0x80:0x83 F:1:lit:0x80:0x81 F:1:dark:0x80:0x82 # glyph of warding F:3:all:0x8D:0x95 # open door F:4:all:0x82:0x84 # broken door F:5:all:0x82:0x85 # up staircase F:6:all:0x80:0x96 # down staircase F:7:all:0x80:0x99 # General Store F:8:all:0x82:0x87 # Armoury F:9:all:0x82:0x88 # Weapon Smiths F:10:all:0x82:0x89 # Temple F:11:all:0x82:0x8A # Alchemy Shop F:12:all:0x82:0x8B # Magic Shop F:13:all:0x82:0x8C # Black Market F:14:all:0x82:0x8D # Home F:15:all:0x82:0x8E # visible trap -- trap door F:16:bright:0x81:0x8E F:16:lit:0x81:0x8C F:16:dark:0x81:0x8D # visible trap -- open pit (3 tiles) F:17:bright:0x81:0x8B F:17:lit:0x81:0x89 F:17:dark:0x81:0x8A # visible trap -- spiked pit (3 tiles) F:18:bright:0x81:0x8B F:18:lit:0x81:0x89 F:18:dark:0x81:0x8A # visible trap -- poison pit (3 tiles) F:19:bright:0x81:0x8B F:19:lit:0x81:0x89 F:19:dark:0x81:0x8A # visible trap -- rune -- summon (3 tiles) F:20:bright:0x81:0x91 F:20:lit:0x81:0x8F F:20:dark:0x81:0x90 # visible trap -- rune -- teleport (3 tiles) F:21:bright:0x81:0x94 F:21:lit:0x81:0x92 F:21:dark:0x81:0x93 # visible trap -- spot -- fire (3 tiles) F:22:bright:0x81:0x88 F:22:lit:0x81:0x86 F:22:dark:0x81:0x87 # visible trap -- spot -- acid (3 tiles) F:23:bright:0x81:0x88 F:23:lit:0x81:0x86 F:23:dark:0x81:0x87 # visible trap -- dart -- slow (3 tiles) F:24:bright:0x81:0x82 F:24:lit:0x81:0x80 F:24:dark:0x81:0x81 # visible trap -- dart -- lose str (3 tiles) F:25:bright:0x81:0x82 F:25:lit:0x81:0x80 F:25:dark:0x81:0x81 # visible trap -- dart -- lose dex (3 tiles) F:26:bright:0x81:0x82 F:26:lit:0x81:0x80 F:26:dark:0x81:0x81 # visible trap -- dart -- lose con (3 tiles) F:27:bright:0x81:0x82 F:27:lit:0x81:0x80 F:27:dark:0x81:0x81 # visible trap -- gas -- blind (3 tiles) F:28:bright:0x81:0x85 F:28:lit:0x81:0x83 F:28:dark:0x81:0x84 # visible trap -- gas -- confuse (3 tiles) F:29:bright:0x81:0x85 F:29:lit:0x81:0x83 F:29:dark:0x81:0x84 # visible trap -- gas -- poison (3 tiles) F:30:bright:0x81:0x85 F:30:lit:0x81:0x83 F:30:dark:0x81:0x84 # visible trap -- gas -- sleep (3 tiles) F:31:bright:0x81:0x85 F:31:lit:0x81:0x83 F:31:dark:0x81:0x84 # doors (+ locked doors + jammed doors) F:32:all:0x82:0x83 # rubble F:49:all:0x80:0x9C # magma vein (+ w/ hidden treasure) F:50:bright:0x80:0x8F F:50:lit:0x80:0x8D F:50:dark:0x80:0x8E # quartz vein (+ w/ hidden treasure) F:51:bright:0x80:0x89 F:51:lit:0x80:0x87 F:51:dark:0x80:0x88 # magma vein with treasure F:54:all:0x80:0x90 # quartz vein with treasure F:55:all:0x80:0x8A # granite wall(s) F:56:bright:0x80:0x86 F:56:lit:0x80:0x84 F:56:dark:0x80:0x85 # permanent wall(s) F:60:bright:0x80:0x95 F:60:lit:0x80:0x93 F:60:dark:0x80:0x94 ##### Object attr/char definitions ##### ##### Non-kind (contains the "pile" picture) ##### # Pile K:0:0:182:147 ##### Various Stuff ##### K:spike:Iron Spike~:0x8E:0x89 K:light:Wooden Torch~:0x8E:0x8B K:light:Lantern~:0x8E:0x8A K:flask:Flask~ of oil:0x8E:0x88 ##### Food ##### ### Normal Food ### K:food:Ration~ of Food:0x8E:0x84 K:food:Slime Mold~:0x8E:0x85 K:food:Piece~ of Elvish Waybread:0x8E:0x86 ### The shrooms, an interesting collection ### # Graphics are sourced from flavor entries in flvr-new.prf ##### Weapons ##### ### Swords ### K:sword:Dagger~:0x8A:0x8F K:sword:Main Gauche~:0x8A:0x90 K:sword:Rapier~:0x8A:0x91 K:sword:Short Sword~:0x8A:0x94 K:sword:Cutlass~:0x8A:0x96 K:sword:Tulwar~:0x8A:0x95 K:sword:Scimitar~:0x8A:0x97 K:sword:Long Sword~:0x8A:0x99 K:sword:Broad Sword~:0x8A:0x98 K:sword:Bastard Sword~:0x8A:0x8E K:sword:Katana~:0x8A:0x9B K:sword:Zweihander~:0x8A:0x9C K:sword:Executioner's Sword~:0x8A:0x9D K:sword:Blade~ of Chaos:0x8A:0x9E ### Whips ### K:hafted:Whip~:0x8A:0x9F K:hafted:Ball-and-Chain~:0x8B:0x86 K:hafted:Morning Star~:0x8B:0x84 K:hafted:Flail~:0x8B:0x83 K:hafted:Two-Handed Great Flail~:0x8B:0x87 ### Clubs ### K:hafted:Mace~:0x8B:0x81 K:hafted:Lead-Filled Mace~:0x8B:0x85 K:hafted:Quarterstaff~:0x8B:0x82 K:hafted:War Hammer~:0x8B:0x80 K:hafted:Maul~:0xB5:0x8A K:hafted:Great Hammer~:0xB5:0x8A K:hafted:Mace~ of Disruption:0x8B:0x88 ### Spears ### K:polearm:Spear~:0x8B:0x89 K:polearm:Awl-Pike~:0x8B:0x8B K:polearm:Trident~:0x8B:0x8A K:polearm:Halberd~:0x8B:0x93 K:polearm:Pike~:0x8B:0x8F ### Axes ### K:polearm:Beaked Axe~:0x8B:0x90 K:polearm:Broad Axe~:0x8B:0x91 K:polearm:Battle Axe~:0x8B:0x8E K:polearm:Lochaber Axe~:0x8B:0x94 K:polearm:Great Axe~:0x8B:0x95 ### Other misc polearms ### K:polearm:Scythe~:0x8B:0x96 K:polearm:Glaive~:0x8B:0x92 K:polearm:Lance~:0x8B:0x8C K:polearm:Scythe~ of Slicing:0x8B:0x97 K:polearm:Lucerne Hammer~:0x8B:0x8D ##### Bows, Crossbows, Slings ##### K:bow:Sling~:0x8B:0x9C K:bow:Short Bow~:0x8B:0x98 K:bow:Long Bow~:0x8B:0x99 K:bow:Light Crossbow~:0x8B:0x9A K:bow:Heavy Crossbow~:0x8B:0x9B ##### Missiles ##### K:arrow:Arrow~:0x8C:0x80 K:arrow:Seeker Arrow~:0x8C:0x81 K:arrow:Mithril Arrow~:0x8C:0x81 K:bolt:Bolt~:0x8C:0x82 K:bolt:Seeker Bolt~:0x8C:0x83 K:bolt:Mithril Bolt~:0x8C:0x83 K:shot:Rounded Pebble~:0x8C:0x84 K:shot:Iron Shot~:0x8C:0x85 K:shot:Mithril Shot~:0xB6:0x8F ##### Digging Tools ##### K:digger:Shovel~:0x8E:0x8F K:digger:Pick~:0x8E:0x8C K:digger:Mattock~:0x8E:0x8D ##### Armor ##### K:boots:Pair~ of Leather Sandals:0x88:0x8E K:boots:Pair~ of Leather Boots:0x88:0x8F K:boots:Pair~ of Iron Shod Boots:0x88:0x90 K:boots:Pair~ of Steel Shod Boots:0x88:0x90 K:boots:Pair~ of Mithril Shod Boots:0x88:0x90 K:boots:Pair~ of Ethereal Slippers:0x88:0x8E ### Headgear ### K:helm:Hard Leather Cap~:0x87:0x98 K:helm:Metal Cap~:0x87:0x99 K:helm:Iron Helm~:0x87:0x9A K:helm:Steel Helm~:0x87:0x9B K:crown:Iron Crown~:0x87:0x9C K:crown:Golden Crown~:0x87:0x9D K:crown:Jewel Encrusted Crown~:0x87:0x9E ### Body armours ### K:soft armor:Robe~:0x89:0x8C K:soft armor:Soft Leather Armour~:0x89:0x8D K:soft armor:Studded Leather Armour~:0x89:0x90 K:soft armor:Hard Leather Armour~:0x89:0x8F K:soft armor:Leather Scale Mail~:0x89:0x91 K:hard armor:Metal Scale Mail~:0x89:0x92 K:hard armor:Chain Mail~:0x89:0x94 K:hard armor:Augmented Chain Mail~:0x89:0x96 K:hard armor:Bar Chain Mail~:0x89:0x97 K:hard armor:Metal Brigandine Armour~:0x89:0x98 K:hard armor:Partial Plate Armour~:0x89:0x99 K:hard armor:Metal Lamellar Armour~:0x89:0x9A K:hard armor:Full Plate Armour~:0x89:0x9B K:hard armor:Ribbed Plate Armour~:0x89:0x9C K:hard armor:Mithril Chain Mail~:0x89:0x9D K:hard armor:Mithril Plate Mail~:0x89:0x9E K:hard armor:Adamantite Plate Mail~:0x89:0x9F ### The Cloaks ### K:cloak:Cloak~:0x89:0x88 K:cloak:Fur Cloak~:0x89:0x88 K:cloak:Elven Cloak~:0x89:0x8A K:cloak:Ethereal Cloak~:0x89:0x89 ### The Gloves ### K:gloves:Set~ of Leather Gloves:0x88:0x91 K:gloves:Set~ of Gauntlets:0x88:0x92 K:gloves:Set~ of Mithril Gauntlets:0x88:0x93 K:gloves:Set~ of Caestus:0x88:0x93 K:gloves:Set~ of Alchemist's Gloves:0x88:0x91 #K:gloves:Set~ of Mining Gloves:0x88:0x92 ### The shields ### #K:shield:Buckler~:0x88:0x94 K:shield:Wicker Shield~:0x88:0x94 K:shield:Small Metal Shield~:0x88:0x96 K:shield:Leather Shield~:0x88:0x95 K:shield:Large Metal Shield~:0x88:0x97 K:shield:Mithril Shield~:0x88:0x98 ##### Rings ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Amulets ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Scrolls ##### ### Teleportation ### K:scroll:Phase Door:0x83:0x9C K:scroll:Teleportation:0x83:0x9C K:scroll:Teleport Level:0x83:0x9C ### Detection ### K:scroll:Magic Mapping:0x83:0x9C K:scroll:Treasure Detection:0x83:0x9C K:scroll:Trap Detection:0x83:0x9C K:scroll:Door/Stair Location:0x83:0x9C K:scroll:Detect Invisible:0x83:0x9C ### Enchantments ### K:scroll:Enchant Weapon To-Hit:0x83:0x9C K:scroll:Enchant Weapon To-Dam:0x83:0x9C K:scroll:Enchant Armour:0x83:0x9C K:scroll:*Enchant Weapon*:0x83:0x9C K:scroll:*Enchant Armour*:0x83:0x9C K:scroll:Remove Curse:0x83:0x9C K:scroll:*Remove Curse*:0x83:0x9C ### Summoning ### K:scroll:Summon Monster:0x83:0x9C K:scroll:Summon Undead:0x83:0x9C K:scroll:Acquirement:0x83:0x9C K:scroll:*Acquirement*:0x83:0x9C ### Killing scrolls ### K:scroll:Dispel Undead:0x83:0x9C K:scroll:Banishment:0x83:0x9C K:scroll:Mass Banishment:0x83:0x9C ### Utility ### K:scroll:Satisfy Hunger:0x83:0x9C K:scroll:Identify:0x83:0x9C K:scroll:Light:0x83:0x9C K:scroll:Word of Recall:0x83:0x9C K:scroll:Recharging:0x83:0x9C K:scroll:Trap/Door Destruction:0x83:0x9C K:scroll:Deep Descent:0x83:0x9C ### "Holy" spells ### K:scroll:Blessing:0x83:0x9C K:scroll:Holy Chant:0x83:0x9C K:scroll:Holy Prayer:0x83:0x9C K:scroll:Protection from Evil:0x83:0x9C ### Misc. ### K:scroll:Monster Confusion:0x83:0x9C K:scroll:Rune of Protection:0x83:0x9C K:scroll:*Destruction*:0x83:0x9C ### Bad scrolls ### K:scroll:Aggravate Monster:0x83:0x9C K:scroll:Curse Weapon:0x83:0x9C K:scroll:Curse Armour:0x83:0x9C K:scroll:Darkness:0x83:0x9C K:scroll:Trap Creation:0x83:0x9C ##### Potions ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Wands ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Staffs ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Rods ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Basic Books ##### K:magic book:[Magic for Beginners]:0x8C:0x86 K:magic book:[Conjurings and Tricks]:0x8C:0x87 K:magic book:[Incantations and Illusions]:0x8C:0x88 K:magic book:[Sorcery and Evocations]:0x8C:0x89 K:prayer book:[Beginners Handbook]:0x8C:0x8F K:prayer book:[Words of Wisdom]:0x8C:0x90 K:prayer book:[Chants and Blessings]:0x8C:0x91 K:prayer book:[Exorcism and Dispelling]:0x8C:0x92 ##### Special Books (note resistances) ##### K:magic book:[Resistances of Scarabtarices]:0x8C:0x8A K:magic book:[Raal's Tome of Destruction]:0x8C:0x8B K:magic book:[Mordenkainen's Escapes]:0x8C:0x8C K:magic book:[Tenser's Transformations]:0x8C:0x8D K:magic book:[Kelek's Grimoire of Power]:0x8C:0x8E K:prayer book:[Ethereal Openings]:0x8C:0x93 K:prayer book:[Godly Insights]:0x8C:0x94 K:prayer book:[Purifications and Healing]:0x8C:0x95 K:prayer book:[Holy Infusions]:0x8C:0x96 K:prayer book:[Wrath of God]:0x8C:0x97 ##### Chests ##### K:chest:Small wooden chest~:0x84:0x99 K:chest:Large wooden chest~:0x84:0x9A K:chest:Small iron chest~:0x84:0x9B K:chest:Large iron chest~:0x84:0x9C K:chest:Small steel chest~:0x84:0x9D K:chest:Large steel chest~:0x84:0x9E K:chest:Ruined chest~:0x84:0x9F ##### Junk ##### K:bottle:Empty Bottle~:0x8E:0x87 K:junk:Shard~ of Pottery:0x8E:0x92 K:junk:Broken Stick~:0x8E:0x93 K:skeleton:Broken Skull~:0x8E:0x94 K:skeleton:Broken Bone~:0x8E:0x95 K:skeleton:Canine Skeleton~:0x8E:0x9A K:skeleton:Rodent Skeleton~:0x8E:0x9B K:skeleton:Human Skeleton~:0x8E:0x96 K:skeleton:Dwarf Skeleton~:0x8E:0x98 K:skeleton:Elf Skeleton~:0x8E:0x97 ##### Dragon Scale Mail ##### K:dragon armor:Black Dragon Scale Mail~:0x8A:0x82 K:dragon armor:Blue Dragon Scale Mail~:0x8A:0x80 K:dragon armor:White Dragon Scale Mail~:0x8A:0x81 K:dragon armor:Red Dragon Scale Mail~:0x8A:0x83 K:dragon armor:Green Dragon Scale Mail~:0x8A:0x84 K:dragon armor:Multi-Hued Dragon Scale Mail~:0x8A:0x8B K:dragon armor:Pseudo-Dragon Scale Mail~:0x8A:0x87 K:dragon armor:Law Dragon Scale Mail~:0x8A:0x89 K:dragon armor:Bronze Dragon Scale Mail~:0x8A:0x85 K:dragon armor:Gold Dragon Scale Mail~:0x8A:0x86 K:dragon armor:Chaos Dragon Scale Mail~:0x8A:0x88 K:dragon armor:Balance Dragon Scale Mail~:0x8A:0x8A K:dragon armor:Power Dragon Scale Mail~:0x8A:0x8C ##### Gold/gems ##### K:gold:copper:0x83:0x91 K:gold:silver:0x83:0x92 K:gold:garnets:0x83:0x96 K:gold:gold:0x83:0x93 K:gold:opals:0x83:0x97 K:gold:sapphires:0x83:0x98 K:gold:rubies:0x83:0x99 K:gold:diamonds:0x83:0x9A K:gold:emeralds:0x83:0x9B K:gold:mithril:0x83:0x94 K:gold:adamantite:0x83:0x95 ##### "Morgoth Artifacts" ##### K:hafted:Mighty Hammer~:0x88:0x9E K:crown:Massive Iron Crown~:0x8B:0x9E ##### "Special Artifacts" ##### # These artifacts use numeric SVALs to ensure unique matches # The Phial of Galadriel K:light:4:0x8E:0x9D # The Star of Elendil K:light:5:0x8E:0x9E # The Arkenstone of Thrain K:light:6:0x8E:0x9F # The Amulet of Carlammas K:amulet:50:0x84:0x96 # The Amulet of Ingwe K:amulet:51:0x84:0x97 # The Necklace of the Dwarves K:amulet:52:0x84:0x98 # The Ring of Barahir K:ring:50:0x84:0x8F # The Ring of Tulkas K:ring:51:0x84:0x90 # The Ring of Power 'Narya' K:ring:52:0x84:0x92 # The Ring of Power 'Nenya' K:ring:53:0x84:0x93 # The Ring of Power 'Vilya' K:ring:54:0x84:0x94 # The Ring of Power 'The One Ring' K:ring:55:0x84:0x95 # The Palantir of Westernesse K:light:7:0x8E:0x9F # The Elfstone 'Elessar' K:amulet:53:0x8E:0x9F # The Jewel 'Evenstar' K:amulet:54:0x8E:0x9F ##### Monster attr/char definitions ##### # player R:0:0x92:0x80 # filthy street urchin R:1:0xAA:0x80 # scrawny cat R:2:0xA7:0x82 # scruffy little dog R:3:0x9D:0x9A # farmer maggot R:4:0xAA:0x81 # blubbering idiot R:5:0xAA:0x82 # boil-covered wretch R:6:0xAA:0x83 # village idiot R:7:0xAA:0x84 # pitiful-looking beggar R:8:0xAA:0x85 # mangy-looking leper R:9:0xAA:0x86 # squint-eyed rogue R:10:0xAA:0x87 # singing, happy drunk R:11:0xAA:0x88 # aimless-looking merchant R:12:0xAA:0x89 # mean-looking mercenary R:13:0xAA:0x8A # battle-scarred veteran R:14:0xAA:0x8B # grey mold R:15:0xA8:0x9F # grey mushroom patch R:16:0x9D:0x85 # giant yellow centipede R:17:0xA5:0x94 # giant white centipede R:18:0xA5:0x95 # white icky thing R:19:0xA8:0x83 # clear icky thing R:20:0xA8:0x84 # giant white mouse R:21:0xAC:0x85 # large brown snake R:22:0xA2:0x84 # large white snake R:23:0xA2:0x85 # small kobold R:24:0xA8:0x99 # kobold R:25:0xA8:0x9A # white worm mass R:26:0xAC:0x9D # floating eye R:27:0xA6:0x9B # rock lizard R:28:0xA2:0x86 # jackal R:29:0x9D:0x9B # soldier ant R:30:0xA5:0x87 # fruit bat R:31:0xA5:0x8F # shrieker mushroom patch R:32:0x9D:0x86 # blubbering icky thing R:33:0xA8:0x85 # metallic green centipede R:34:0xA5:0x96 # novice warrior R:35:0xAA:0x8C # novice rogue R:36:0xAA:0x8D # novice priest R:37:0xAA:0x8E # novice mage R:38:0xAA:0x8F # yellow mushroom patch R:39:0x9D:0x87 # white jelly R:40:0xA8:0x8A # giant green frog R:41:0xA2:0x87 # giant black ant R:42:0xA5:0x88 # salamander R:43:0xA2:0x88 # white harpy R:44:0xA0:0x88 # blue yeek R:45:0xAD:0x87 # grip, farmer maggot's dog R:46:0x9D:0x9C # fang, farmer maggot's dog R:47:0x9D:0x9D # green worm mass R:48:0xAC:0x9E # large yellow snake R:49:0xA2:0x89 # cave spider R:50:0xA2:0x9D # wild cat R:51:0xA7:0x83 # smeagol R:52:0xAA:0x90 # green ooze R:53:0xA8:0x8B # poltergeist R:54:0x9F:0x99 # metallic blue centipede R:55:0xA5:0x97 # giant white louse R:56:0xA8:0x9D # black naga R:57:0xA9:0x88 # spotted mushroom patch R:58:0x9D:0x88 # silver jelly R:59:0xA8:0x8C # yellow jelly R:60:0xA8:0x8D # scruffy looking hobbit R:61:0xA7:0x93 # giant white ant R:62:0xA5:0x89 # yellow mold R:63:0xA9:0x80 # metallic red centipede R:64:0xA5:0x98 # yellow worm mass R:65:0xAC:0x9F # clear worm mass R:66:0xAD:0x80 # radiation eye R:67:0xA6:0x9C # cave lizard R:68:0xA2:0x8A # novice ranger R:69:0xAA:0x91 # novice paladin R:70:0xAA:0x92 # blue jelly R:71:0xA8:0x8E # creeping copper coins R:72:0x9D:0x80 # giant white rat R:73:0xAC:0x86 # blue worm mass R:74:0xAD:0x81 # large grey snake R:75:0xA2:0x8B # bullroarer the hobbit R:76:0xA7:0x94 # novice mage R:77:0xAA:0x8F # green naga R:78:0xA9:0x89 # blue ooze R:79:0xA8:0x8F # green glutton ghost R:80:0x9F:0x9A # green jelly R:81:0xA8:0x90 # large kobold R:82:0xA8:0x9B # skeleton kobold R:83:0xAC:0x89 # grey icky thing R:84:0xA8:0x86 # disenchanter eye R:85:0xA6:0x9D # red worm mass R:86:0xAD:0x82 # copperhead snake R:87:0xA2:0x8C # purple mushroom patch R:88:0x9D:0x89 # novice priest R:89:0xAA:0x8E # novice warrior R:90:0xAA:0x8C # novice rogue R:91:0xAA:0x8D # brown mold R:92:0xA9:0x81 # giant brown bat R:93:0xA5:0x90 # novice archer R:94:0xAA:0x97 # creeping silver coins R:95:0x9D:0x81 # snaga R:96:0xA9:0x8E # rattlesnake R:97:0xA2:0x8D # cave orc R:98:0xA9:0x8F # wood spider R:99:0xA2:0x9E # manes R:100:0xA0:0x91 # bloodshot eye R:101:0xA6:0x9E # red naga R:102:0xA9:0x8A # red jelly R:103:0xA8:0x91 # giant red frog R:104:0xA2:0x8E # green icky thing R:105:0xA8:0x87 # zombified kobold R:106:0xAD:0x8C # lost soul R:107:0x9F:0x9B # dark elf R:108:0xA7:0x95 # night lizard R:109:0xA2:0x8F # mughash the kobold lord R:110:0xA8:0x9C # wormtongue, agent of saruman R:111:0xAA:0x98 # lagduf, the snaga R:112:0xA9:0x90 # brown yeek R:113:0xAD:0x88 # novice ranger R:114:0xAA:0x91 # giant salamander R:115:0xA2:0x90 # green mold R:116:0xA9:0x82 # skeleton orc R:117:0xAC:0x8A # novice paladin R:118:0xAA:0x92 # lemure R:119:0xA0:0x92 # hill orc R:120:0xA9:0x91 # bandit R:121:0xAA:0x9B # yeti R:122:0xA4:0x91 # bloodshot icky thing R:123:0xA8:0x88 # giant grey rat R:124:0xAC:0x87 # black harpy R:125:0xA0:0x89 # orc shaman R:126:0xA9:0x92 # baby blue dragon R:127:0xA5:0x9D # baby white dragon R:128:0xA5:0x9E # baby green dragon R:129:0xA5:0x9F # baby black dragon R:130:0xA6:0x80 # baby red dragon R:131:0xA6:0x81 # giant fire ant R:132:0xA5:0x8D # brodda, the easterling R:133:0xAA:0x9C # king cobra R:134:0xA2:0x91 # giant spider R:135:0xA2:0x9F # dark elven mage R:136:0xA7:0x96 # orfax, son of boldor R:137:0xAD:0x89 # dark elven warrior R:138:0xA7:0x97 # clear mushroom patch R:139:0x9D:0x8A # grishnakh, the hill orc R:140:0xA9:0x93 # giant white tick R:141:0xAC:0x92 # hairy mold R:142:0xA9:0x83 # disenchanter mold R:143:0xA9:0x84 # pseudo-dragon R:144:0xA6:0x82 # tengu R:145:0xA0:0x93 # creeping gold coins R:146:0x9D:0x82 # wolf R:147:0x9D:0x9E # giant fruit fly R:148:0x9F:0x91 # panther R:149:0xA7:0x84 # brigand R:150:0xAA:0x9B # baby multi-hued dragon R:151:0xA6:0x83 # hippogriff R:152:0xA0:0x8A # zombified orc R:153:0xAD:0x8D # gnome mage R:154:0xA7:0x98 # black mamba R:155:0xA2:0x92 # white wolf R:156:0x9D:0x9F # grape jelly R:157:0xA8:0x92 # nether worm mass R:158:0xAD:0x83 # golfimbul, the hill orc chief R:159:0xA9:0x94 # master yeek R:160:0xAD:0x8A # priest R:161:0xAA:0x9E # dark elven priest R:162:0xA7:0x99 # air spirit R:163:0x9E:0x9F # skeleton human R:164:0xAC:0x8B # zombified human R:165:0xAD:0x8E # tiger R:166:0xA7:0x85 # moaning spirit R:167:0x9F:0x9C # swordsman R:168:0xAA:0x9F # stegocentipede R:169:0xA5:0x99 # spotted jelly R:170:0xA8:0x93 # drider R:171:0xA3:0x80 # killer brown beetle R:172:0xA0:0x9B # boldor, king of the yeeks R:173:0xAD:0x8B # ogre R:174:0xA1:0x8B # creeping mithril coins R:175:0x9D:0x83 # illusionist R:176:0xAB:0x80 # druid R:177:0xAB:0x81 # black orc R:178:0xA9:0x95 # ochre jelly R:179:0xA8:0x94 # giant flea R:180:0x9F:0x92 # ufthak of cirith ungol R:181:0xA9:0x96 # giant white dragon fly R:182:0x9F:0x93 # blue icky thing R:183:0xA8:0x89 # hill giant R:184:0xA1:0x91 # flesh golem R:185:0xA7:0x89 # warg R:186:0x9E:0x80 # giant black louse R:187:0xA8:0x9E # lurker R:188:0xAD:0x9F # wererat R:189:0xAC:0x88 # black ogre R:190:0xA1:0x8C # magic mushroom patch R:191:0x9D:0x8B # guardian naga R:192:0xA9:0x8B # light hound R:193:0xA4:0x93 # dark hound R:194:0xA4:0x94 # half-orc R:195:0xA9:0x97 # giant tarantula R:196:0xA3:0x81 # giant clear centipede R:197:0xA5:0x9A # mirkwood spider R:198:0xA3:0x82 # frost giant R:199:0xA1:0x92 # griffon R:200:0xA0:0x8B # homunculus R:201:0xA0:0x94 # gnome mage R:202:0xA7:0x98 # clear hound R:203:0xA4:0x95 # clay golem R:204:0xA7:0x8A # umber hulk R:205:0xA3:0x99 # orc captain R:206:0xA9:0x98 # gelatinous cube R:207:0xA8:0x95 # giant green dragon fly R:208:0x9F:0x94 # fire giant R:209:0xA1:0x93 # hummerhorn R:210:0x9F:0x96 # ulfast, son of ulfang R:211:0xAB:0x82 # quasit R:212:0xA0:0x95 # imp R:213:0xA0:0x96 # forest troll R:214:0xA3:0x89 # nar, the dwarf R:215:0xA7:0x99 # 2-headed hydra R:216:0xA2:0x93 # water spirit R:217:0x9F:0x80 # giant red scorpion R:218:0xA3:0x83 # earth spirit R:219:0x9F:0x81 # fire spirit R:220:0x9F:0x82 # fire hound R:221:0xA4:0x96 # cold hound R:222:0xA4:0x97 # energy hound R:223:0xA4:0x98 # potion mimic R:224:0x9D:0x8E # blink dog R:225:0x9E:0x81 # uruk R:226:0xA9:0x99 # shagrat, the orc captain R:227:0xA9:0x9A # gorbag, the orc captain R:228:0xA9:0x9B # shambling mound R:229:0x9D:0x8C # stone giant R:230:0xA1:0x94 # giant black dragon fly R:231:0x9F:0x96 # stone golem R:232:0xA7:0x8B # red mold R:233:0xA9:0x85 # giant gold dragon fly R:234:0x9F:0x97 # bolg, son of azog R:235:0xA9:0x9C # phase spider R:236:0xA3:0x84 # 3-headed hydra R:237:0xA2:0x94 # earth hound R:238:0xA4:0x99 # air hound R:239:0xA4:0x9A # sabre-tooth tiger R:240:0xA7:0x86 # water hound R:241:0xA4:0x9B # chimaera R:242:0xA0:0x8C # quylthulg R:243:0xA1:0x9A # sasquatch R:244:0xA4:0x92 # werewolf R:245:0x9E:0x82 # dark elven lord R:246:0xA7:0x9C # cloud giant R:247:0xA1:0x96 # lugdush, the uruk R:248:0xA9:0x9E # ugluk, the uruk R:249:0xA9:0x9D # blue dragon bat R:250:0xA5:0x91 # scroll mimic R:251:0x9D:0x8D # fire vortex R:252:0xAC:0x94 # water vortex R:253:0xAC:0x95 # cold vortex R:254:0xAC:0x96 # energy vortex R:255:0xAC:0x97 # mummified orc R:256:0xA1:0x88 # killer stag beetle R:257:0xA0:0x9D # iron golem R:258:0xA7:0x8C # giant yellow scorpion R:259:0xA3:0x85 # black ooze R:260:0xA8:0x96 # hardened warrior R:261:0xAB:0x83 # azog, king of the uruk-hai R:262:0xA9:0x9F # master rogue R:263:0xAB:0x84 # red dragon bat R:264:0xA5:0x92 # killer white beetle R:265:0xA0:0x9C # giant bronze dragon fly R:266:0x9F:0x98 # forest wight R:267:0xA3:0x9E # ibun, son of mim R:268:0xA7:0x9B # khim, son of mim R:269:0xA7:0x9C # 4-headed hydra R:270:0xA2:0x95 # mummified human R:271:0xA1:0x89 # vampire bat R:272:0xA5:0x93 # sangahyando of umbar R:273:0xAB:0x85 # angamaite of umbar R:274:0xAB:0x86 # banshee R:275:0x9F:0x9D # pukelman R:276:0xA7:0x8D # dark elven druid R:277:0xA7:0x9F # stone troll R:278:0xA3:0x8A # troll priest R:279:0xA3:0x8B # wereworm R:280:0xAD:0x84 # carrion crawler R:281:0xA5:0x9C # killer red beetle R:282:0xA0:0x9F # giant grey ant R:283:0xA5:0x8C # ulwarth, son of ulfang R:284:0xAB:0x87 # displacer beast R:285:0xA7:0x87 # giant fire tick R:286:0xAC:0x93 # cave ogre R:287:0xA1:0x8D # white wraith R:288:0xA3:0x9F # angel R:289:0x9D:0x8F # mim, betrayer of turin R:290:0xA8:0x80 # killer fire beetle R:291:0xA1:0x80 # creeping adamantite coins R:292:0x9D:0x84 # algroth R:293:0xA3:0x8C # vibration hound R:294:0xA4:0x9C # nexus hound R:295:0xA4:0x9D # ogre mage R:296:0xA1:0x8E # lokkak, the ogre chieftain R:297:0xA1:0x90 # vampire R:298:0xA3:0x9A # gorgimaera R:299:0xA0:0x8D # colbran R:300:0xA7:0x8E # spirit naga R:301:0xA9:0x8C # 5-headed hydra R:302:0xA2:0x96 # black knight R:303:0xAB:0x88 # uldor the accursed R:304:0xAB:0x89 # mage R:305:0xAB:0x8A # mind flayer R:306:0xAB:0x8B # draebor, the imp R:307:0xA0:0x97 # basilisk R:308:0xA2:0x97 # ice troll R:309:0xA3:0x8D # purple worm R:310:0xAD:0x85 # archangel R:311:0x9D:0x90 # catoblepas R:312:0xAC:0x81 # ring mimic R:313:0xAD:0x9E # young blue dragon R:314:0xA6:0x84 # young white dragon R:315:0xA6:0x85 # young green dragon R:316:0xA6:0x86 # young bronze dragon R:317:0xA6:0x87 # mithril golem R:318:0xA7:0x8F # shadow drake R:319:0xA6:0x88 # skeleton troll R:320:0xAC:0x8C # manticore R:321:0xA0:0x8E # giant blue ant R:322:0xA5:0x8B # giant army ant R:323:0xAE:0x81 # grave wight R:324:0xA4:0x80 # killer slicer beetle R:325:0xA1:0x81 # ghost R:326:0x9F:0x9E # death watch beetle R:327:0xA1:0x82 # ogre shaman R:328:0xA1:0x8F # nexus quylthulg R:329:0xA1:0x9B # shelob, spider of darkness R:330:0xA3:0x86 # ninja R:331:0xAB:0x8C # memory moss R:332:0xA9:0x86 # storm giant R:333:0xA1:0x95 # cave troll R:334:0xA3:0x8E # half-troll R:335:0xA3:0x8F # mystic R:336:0xAB:0x8D # barrow wight R:337:0xA4:0x81 # giant skeleton troll R:338:0xAC:0x8D # chaos drake R:339:0xA6:0x89 # law drake R:340:0xA6:0x8A # balance drake R:341:0xA6:0x8B # ethereal drake R:342:0xA6:0x8C # bert the stone troll R:343:0xA3:0x90 # bill the stone troll R:344:0xA3:0x91 # tom the stone troll R:345:0xA3:0x92 # shade R:346:0x9F:0x9F # spectre R:347:0xA0:0x80 # water troll R:348:0xA3:0x93 # fire elemental R:349:0x9F:0x83 # cherub R:350:0x9D:0x91 # water elemental R:351:0x9F:0x84 # invisible stalker R:352:0x9F:0x85 # carrion crawler R:353:0xA5:0x9C # master thief R:354:0xAB:0x8E # ulfang the black R:355:0xAB:0x8F # lich R:356:0xA1:0x83 # master vampire R:357:0xA3:0x9B # giant grey scorpion R:358:0xA3:0x87 # earth elemental R:359:0x9F:0x86 # air elemental R:360:0x9F:0x87 # hell hound R:361:0x9E:0x83 # eog golem R:362:0xA7:0x90 # olog R:363:0xA3:0x94 # dagashi R:364:0xAB:0x90 # gravity hound R:365:0xA4:0x9E # acidic cytoplasm R:366:0xA8:0x97 # inertia hound R:367:0xA4:0x9F # impact hound R:368:0xA5:0x80 # dread R:369:0xA0:0x81 # ooze elemental R:370:0x9F:0x88 # smoke elemental R:371:0x9F:0x89 # young black dragon R:372:0xA6:0x8D # mumak R:373:0xAC:0x82 # giant fire ant R:374:0xA5:0x8D # mature white dragon R:375:0xA6:0x8E # xorn R:376:0xA4:0x8F # shadow R:377:0xA0:0x82 # phantom R:378:0xA0:0x83 # grey wraith R:379:0xA4:0x82 # young multi-hued dragon R:380:0xA6:0x8F # colossus R:381:0xB2:0x89 # young gold dragon R:382:0xA6:0x90 # rogrog the black troll R:383:0xA3:0x95 # mature blue dragon R:384:0xA6:0x91 # mature green dragon R:385:0xA6:0x92 # mature bronze dragon R:386:0xA6:0x93 # young red dragon R:387:0xA6:0x94 # trapper R:388:0xAD:0x9F # bodak R:389:0xA0:0x98 # ice elemental R:390:0x9F:0x8A # necromancer R:391:0xAB:0x91 # lorgan, chief of the easterlings R:392:0xAB:0x92 # demonologist R:393:0xAB:0x93 # mummified troll R:394:0xA1:0x8A # the queen ant R:395:0xA5:0x8E # will o' the wisp R:396:0x9F:0x8B # magma elemental R:397:0x9F:0x8C # black pudding R:398:0xA8:0x98 # killer blue beetle R:399:0xA0:0x9E # nexus vortex R:400:0xAE:0x80 # plasma vortex R:401:0xAC:0x98 # mature red dragon R:402:0xA6:0x95 # mature gold dragon R:403:0xA6:0x96 # crystal drake R:404:0xA6:0x97 # mature black dragon R:405:0xA6:0x98 # mature multi-hued dragon R:406:0xA6:0x99 # death knight R:407:0xAB:0x94 # castamir the usurper R:408:0xAB:0x95 # time vortex R:409:0xAC:0x99 # shimmering vortex R:410:0xAC:0x9A # ancient blue dragon R:411:0x9E:0x88 # ancient bronze dragon R:412:0x9E:0x89 # beholder R:413:0xA6:0x9F # emperor wight R:414:0xA4:0x83 # seraph R:415:0x9D:0x92 # vargo, tyrant of fire R:416:0x9F:0x8D # black wraith R:417:0xA4:0x84 # erinyes R:418:0xAD:0x8F # nether wraith R:419:0xA4:0x85 # eldrak R:420:0xA3:0x96 # ettin R:421:0xA3:0x97 # waldern, king of water R:422:0x9F:0x8E # kavlax the many-headed R:423:0xA6:0x9A # ancient white dragon R:424:0x9E:0x8A # ancient green dragon R:425:0x9E:0x8B # 7-headed hydra R:426:0xA2:0x98 # night mare R:427:0xAC:0x83 # vampire lord R:428:0xA3:0x9C # ancient black dragon R:429:0x9E:0x8C # disenchanter worm mass R:430:0xAD:0x86 # rotting quylthulg R:431:0xA1:0x9C # spirit troll R:432:0xA3:0x98 # lesser titan R:433:0xA1:0x97 # 9-headed hydra R:434:0xA2:0x99 # enchantress R:435:0xAB:0x96 # archpriest R:436:0xAB:0x97 # sorcerer R:437:0xAB:0x98 # xaren R:438:0xA4:0x90 # giant roc R:439:0x9D:0x97 # uvatha the horseman R:440:0xA4:0x86 # minotaur R:441:0xA0:0x8F # medusa, the gorgon R:442:0xA9:0x8D # death drake R:443:0x9E:0x8D # ancient red dragon R:444:0x9E:0x8E # ancient gold dragon R:445:0x9E:0x8F # great crystal drake R:446:0x9E:0x90 # vrock R:447:0xAD:0x90 # death quasit R:448:0xA0:0x99 # adunaphel the quiet R:449:0xA4:0x87 # dark elven sorcerer R:450:0xA8:0x81 # master lich R:451:0xA1:0x84 # hezrou R:452:0xAD:0x91 # akhorahil the blind R:453:0xA4:0x88 # gorlim, betrayer of barahir R:454:0xAB:0x99 # archon R:455:0x9D:0x93 # glabrezu R:456:0xAD:0x92 # ren the unclean R:457:0xAD:0x9D # nalfeshnee R:458:0xAD:0x93 # undead beholder R:459:0xA7:0x80 # dread R:460:0xA0:0x81 # mumak R:461:0xAC:0x82 # ancient multi-hued dragon R:462:0x9E:0x91 # ethereal dragon R:463:0x9E:0x92 # ji indur dawndeath R:464:0xAD:0x9C # marilith R:465:0xAD:0x94 # quaker, master of earth R:466:0x9F:0x8F # lesser balrog R:467:0xAD:0x95 # ariel, queen of air R:468:0x9F:0x91 # 11-headed hydra R:469:0xA2:0x9A # patriarch R:470:0xAB:0x9A # dreadmaster R:471:0xA0:0x85 # drolem R:472:0xA7:0x92 # scatha the worm R:473:0xAD:0x9B # dwar, dog lord of waw R:474:0xA4:0x89 # smaug the golden R:475:0x9E:0x93 # dracolich R:476:0x9E:0x95 # greater titan R:477:0xA1:0x98 # dracolisk R:478:0x9E:0x94 # death mold R:479:0xA9:0x87 # itangast the fire drake R:480:0x9E:0x96 # glaurung, father of the dragons R:481:0xAD:0x9A # master mystic R:482:0xAB:0x9B # the balrog of moria R:483:0xAD:0x96 # nightwing R:484:0xAD:0x9D # nether hound R:485:0xA5:0x81 # time hound R:486:0xA5:0x82 # plasma hound R:487:0xA5:0x83 # demonic quylthulg R:488:0xA1:0x9D # great storm wyrm R:489:0x9E:0x97 # baphomet the minotaur lord R:490:0xA0:0x90 # harowen the black hand R:491:0xAB:0x9C # hoarmurath of dir R:492:0xA4:0x8A # grand master mystic R:493:0xAB:0x9D # khamul, the black easterling R:494:0xA4:0x8B # ethereal hound R:495:0xA5:0x84 # great ice wyrm R:496:0x9E:0x98 # the phoenix R:497:0x9D:0x98 # nightcrawler R:498:0xA4:0x8C # hand druj R:499:0xAC:0x8E # eye druj R:500:0xAC:0x8F # skull druj R:501:0xAC:0x90 # chaos vortex R:502:0xAC:0x9B # aether vortex R:503:0xAC:0x9C # the lernaean hydra R:504:0xA2:0x9B # thuringwethil, the vampire messenger R:505:0xA3:0x9D # great hell wyrm R:506:0x9E:0x99 # draconic quylthulg R:507:0xA1:0x9E # fundin bluecloak R:508:0xA8:0x82 # uriel, angel of fire R:509:0x9D:0x94 # azriel, angel of death R:510:0x9D:0x95 # ancalagon the black R:511:0x9E:0x9A # nightwalker R:512:0xA4:0x8D # gabriel, the messenger R:513:0x9D:0x96 # saruman of many colours R:514:0xAB:0x9E # dreadlord R:515:0xA0:0x86 # the cat lord R:516:0xA7:0x88 # chaos beetle R:517:0xA0:0x9A # chaos hound R:518:0xA5:0x85 # great wyrm of chaos R:519:0x9E:0x9B # great wyrm of law R:520:0x9E:0x9C # great wyrm of balance R:521:0x9E:0x9D # tselakus, the dreadlord R:522:0xA0:0x87 # tiamat, celestial dragon of evil R:523:0x9E:0x9E # black reaver R:524:0xA1:0x85 # master quylthulg R:525:0xA1:0x9F # greater draconic quylthulg R:526:0xA2:0x80 # greater rotting quylthulg R:527:0xA2:0x81 # vecna, the emperor lich R:528:0xA1:0x86 # omarax, the eye tyrant R:529:0xA7:0x81 # ungoliant, the unlight R:530:0xA3:0x88 # aether hound R:531:0xA5:0x86 # the mouth of sauron R:532:0xAB:0x9F # the emperor quylthulg R:533:0xA2:0x82 # qlzqqlzuup, the emperor quylthulg R:534:0xA2:0x83 # the witch-king of angmar R:535:0xA4:0x8E # pazuzu, lord of air R:536:0x9D:0x98 # hell hound R:537:0x9E:0x83 # cantoras, the skeletal lord R:538:0xAC:0x91 # the tarrasque R:539:0xA2:0x9C # lungorthin, the balrog of white fire R:540:0xAD:0x97 # draugluin, sire of all werewolves R:541:0x9E:0x85 # feagwath the undead sorceror R:542:0xA1:0x87 # huan, wolfhound of the valar # R:543:ToDo (cerberus, guardian of hades) R:543:0x9E:0x87 # carcharoth, the jaws of thirst R:544:0x9E:0x86 # gothmog, the high captain of balrogs R:545:0xAD:0x98 # sauron, the sorcerer R:546:0xAC:0x80 # morgoth, lord of darkness R:547:0xA1:0x99 # silver mouse # R:548:ToDo # rot jelly # R:549:ToDo # giant tan bat # R:550:ToDo # giant silver ant # R:551:ToDo # giant brown tick # R:552:ToDo # disenchanter bat # R:553:ToDo # shimmering mold # R:554:ToDo # wyvern R:555:0xB1:0x83 # chest mimic R:556:0xB9:0x88 # demilich # R:557:ToDo # archlich # R:558:ToDo # crow R:559:0xB7:0x86 # raven R:560:0xB7:0x87 # crebain # R:561:ToDo # winged horror # R:562:ToDo # cave bear # R:563:ToDo # grizzly bear R:564:0xB8:0x81 # werebear # R:565:ToDo # beorn, the shape-changer # R:566:ToDo # barbazu # R:567:ToDo # bile demon # R:568:ToDo # osyluth # R:569:ToDo # gelugon # R:570:ToDo # horned reaper # R:571:ToDo # pit fiend # R:572:ToDo # greater balrog # R:573:ToDo # baby bronze dragon # R:574:ToDo # baby gold dragon # R:575:ToDo # great swamp wyrm # R:576:ToDo # great wyrm of perplexity # R:577:ToDo # great bile wyrm # R:578:ToDo # great wyrm of thunder # R:579:ToDo # ranger # R:580:ToDo # paladin # R:581:ToDo # ranger chieftain # R:582:ToDo # berserker R:583:0xB8:0x95 # cyclops R:584:0xBA:0x81 # polyphemus, the blind cyclops # R:585:ToDo # atlas, the titan # R:586:ToDo # kronos, lord of the titans # R:587:ToDo # evil eye # R:588:ToDo # spectator R:589:0xB1:0x9B # gauth # R:590:ToDo # beholder hive-mother # R:591:ToDo # neekerbreeker # R:592:ToDo # giant firefly # R:593:ToDo # eol, the dark elf # R:594:ToDo # maeglin, the traitor of gondolin # R:595:ToDo # elder vampire # R:596:ToDo # silent watcher R:597:0xB1:0x8E # nighthawk # R:598:ToDo # ghoul R:599:0xB4:0x8F # ghast R:600:0xB9:0x80 # greater basilisk # R:601:ToDo # aranea # R:602:ToDo # elder aranea # R:603:ToDo # kobold shaman # R:604:ToDo # bat of gorgoroth # R:605:ToDo # doombat R:606:0xBA:0x8C # wolf chieftain # R:607:ToDo # bone golem # R:608:ToDo # bronze golem # R:609:ToDo # ogre chieftain # R:610:ToDo # ar-pharazon the golden # R:611:ToDo # troll chieftain # R:612:ToDo # shardstorm # R:613:ToDo # storm of unmagic # R:614:ToDo # greater mummy R:615:0xBA:0x91 # multi-hued hound R:616:0xB2:0x81 # Load the special player pictures %:xtra-new.prf # Load the flavored objects %:flvr-new.prf angband-v3.3.2/lib/pref/pref.prf0000644000175000017500000001134711651552410015764 0ustar chriscchrisc# File: pref.prf # # This file defines "default" actions of various kinds # # This file includes, if appropriate, various "sub-files" # # See "lib/help/command.txt" and "src/files.c" for more information. # # Note that the "X" key is mapped in both keysets to the key sequence # "w0", which will "swap weapons" as long as both weapons contain the # inscription "@0". For example, inscribe your main weapon as "@1@0" # and your digger (or secondary weapon) as "@2@0". # # Movement A:;1 C:0:1 C:1:1 C:0:{K}1 C:1:{K}1 C:0:{MK}1 C:1:{MK}1 C:0:[End] C:1:[End] C:0:{K}[End] C:1:{K}[End] C:0:{MK}[End] C:1:{MK}[End] A:;2 C:0:2 C:1:2 C:0:{K}2 C:1:{K}2 C:0:{MK}2 C:1:{MK}2 C:0:[Down] C:1:[Down] C:0:{K}[Down] C:1:{K}[Down] C:0:{MK}[Down] C:1:{MK}[Down] A:;3 C:0:3 C:1:3 C:0:{K}3 C:1:{K}3 C:0:{MK}3 C:1:{MK}3 C:0:[PageDown] C:1:[PageDown] C:0:{K}[PageDown] C:1:{K}[PageDown] C:0:{MK}[PageDown] C:1:{MK}[PageDown] A:;4 C:0:4 C:1:4 C:0:{K}4 C:1:{K}4 C:0:{MK}4 C:1:{MK}4 C:0:[Left] C:1:[Left] C:0:{K}[Left] C:1:{K}[Left] C:0:{MK}[Left] C:1:{MK}[Left] A:;6 C:0:6 C:1:6 C:0:{K}6 C:1:{K}6 C:0:{MK}6 C:1:{MK}6 C:0:[Right] C:1:[Right] C:0:{K}[Right] C:1:{K}[Right] C:0:{MK}[Right] C:1:{MK}[Right] A:;7 C:0:7 C:1:7 C:0:{K}7 C:1:{K}7 C:0:{MK}7 C:1:{MK}7 C:0:[Home] C:1:[Home] C:0:{K}[Home] C:1:{K}[Home] C:0:{MK}[Home] C:1:{MK}[Home] A:;8 C:0:8 C:1:8 C:0:{K}8 C:1:{K}8 C:0:{MK}8 C:1:{MK}8 C:0:[Up] C:1:[Up] C:0:{K}[Up] C:1:{K}[Up] C:0:{MK}[Up] C:1:{MK}[Up] A:;9 C:0:9 C:1:9 C:0:{K}9 C:1:{K}9 C:0:{MK}9 C:1:{MK}9 C:0:[PageUp] C:1:[PageUp] C:0:{K}[PageUp] C:1:{K}[PageUp] C:0:{MK}[PageUp] C:1:{MK}[PageUp] # Running A:.1 C:0:{S}[End] C:1:{S}[End] C:0:{SK}1 C:1:{SK}1 C:0:{SMK}[End] C:1:{SMK}[End] A:.2 C:0:{S}[Down] C:1:{S}[Down] C:0:{SK}2 C:1:{SK}2 C:0:{SMK}[Down] C:1:{SMK}[Down] A:.3 C:0:{S}[PageDown] C:1:{S}[PageDown] C:0:{SK}3 C:1:{SK}3 C:0:{SMK}[PageDown] C:1:{SMK}[PageDown] A:.4 C:0:{S}[Left] C:1:{S}[Left] C:0:{SK}4 C:1:{SK}4 C:0:{SMK}[Left] C:1:{SMK}[Left] A:.6 C:0:{S}[Right] C:1:{S}[Right] C:0:{SK}6 C:1:{SK}6 C:0:{SMK}[Right] C:1:{SMK}[Right] A:.7 C:0:{S}[Home] C:1:{S}[Home] C:0:{SK}7 C:1:{SK}7 C:0:{SMK}[Home] C:1:{SMK}[Home] A:.8 C:0:{S}[Up] C:1:{S}[Up] C:0:{SK}8 C:1:{SK}8 C:0:{SMK}[Up] C:1:{SMK}[Up] A:.9 C:0:{S}[PageUp] C:1:{S}[PageUp] C:0:{SK}9 C:1:{SK}9 C:0:{SMK}[PageUp] C:1:{SMK}[PageUp] # Tunneling A:+1 C:0:^[End] C:1:^[End] C:0:{^K}1 C:1:{^K}1 C:0:{^MK}1 C:1:{^MK}1 C:0:{^K}[End] C:1:{^K}[End] A:+2 C:0:^[Down] C:1:^[Down] C:0:{^K}2 C:1:{^K}2 C:0:{^MK}2 C:1:{^MK}2 C:0:{^K}[Down] C:1:{^K}[Down] A:+3 C:0:^[PageDown] C:1:^[PageDown] C:0:{^K}3 C:1:{^K}3 C:0:{^MK}3 C:1:{^MK}3 C:0:{^K}[PageDown] C:1:{^K}[PageDown] A:+4 C:0:^[Left] C:1:^[Left] C:0:{^K}4 C:1:{^K}4 C:0:{^MK}4 C:1:{^MK}4 C:0:{^K}[Left] C:1:{^K}[Left] A:+6 C:0:^[Right] C:1:^[Right] C:0:{^K}6 C:1:{^K}6 C:0:{^MK}6 C:1:{^MK}6 C:0:{^K}[Right] C:1:{^K}[Right] A:+7 C:0:^[Home] C:1:^[Home] C:0:{^K}7 C:1:{^K}7 C:0:{^MK}7 C:1:{^MK}7 C:0:{^K}[Home] C:1:{^K}[Home] A:+8 C:0:^[Up] C:1:^[Up] C:0:{^K}8 C:1:{^K}8 C:0:{^MK}8 C:1:{^MK}8 C:0:{^K}[Up] C:1:{^K}[Up] A:+9 C:0:^[PageUp] C:1:^[PageUp] C:0:{^K}9 C:1:{^K}9 C:0:{^MK}9 C:1:{^MK}9 C:0:{^K}[PageUp] C:1:{^K}[PageUp] ##### Original Keyset Mappings ##### # Stay still (numerical) A:, C:0:5 C:0:{K}5 C:0:{MK}5 C:0:{K}[Begin] C:0:{MK}[Begin] # Hack -- Commit suicide A:Q C:0:^C # Hack -- Swap equipment A:w0 C:0:X # Original keymap: Repeat last command A:^V C:0:n # Pickup an item (with autopickup) A:^Gg C:0:g ##### Roguelike Keyset Mappings ##### # Stay still (numerical) A:, C:1:5 C:1:{K}5 C:1:{MK}5 C:1:{K}[Begin] C:1:{MK}[Begin] # Run A:. C:1:, # Stay still A:, C:1:. # Movement (rogue keys) A:;1 C:1:b A:;2 C:1:j A:;3 C:1:n A:;4 C:1:h A:;6 C:1:l A:;7 C:1:y A:;8 C:1:k A:;9 C:1:u # Running (shift + rogue keys) A:.1 C:1:B A:.2 C:1:J A:.3 C:1:N A:.4 C:1:H A:.6 C:1:L A:.7 C:1:Y A:.8 C:1:K A:.9 C:1:U # Altering (control + rogue keys) A:+1 C:1:^B A:+2 C:1:^J A:+3 C:1:^N A:+4 C:1:^H A:+6 C:1:^L A:+7 C:1:^Y A:+8 C:1:^K A:+9 C:1:^U # Allow use of the "tunnel" command A:T C:1:^T # Allow use of the "destroy" command A:k C:1:^D # Allow use of the "squelch item kind" command A:K C:1:^G # Locate player on map A:L C:1:W # Browse a book (Peruse) A:b C:1:P # Jam a door (Spike) A:j C:1:S # Toggle search mode A:S C:1:# # Use a staff (Zap) A:u C:1:Z # Take off equipment A:t C:1:T # Fire an item A:f C:1:t # Fire default ammo at nearest target A:h C:1:^I # Bash a door (Force) A:B C:1:f # Look around (examine) A:l C:1:x # Aim a wand (Zap) A:a C:1:z # Zap a rod (Activate) A:z C:1:a # Hack -- Commit suicide A:Q C:1:^C # Hack -- Swap equipment A:w0 C:1:X # Roguelike keymap: Repeat last command A:^V C:1:' # Pickup an item (with autopickup) A:^Gg C:0:g # Message colors %:message.prf ##### System Specific Subfiles ##### #?:[EQU $SYS mac] #%:pref-run.prf #?:[EQU $SYS sdl] #%:pref-run.prf ?:1 angband-v3.3.2/lib/pref/message.prf0000644000175000017500000001152511651552410016452 0ustar chriscchrisc# File: message.prf # # This file defines the default message colors. # # This file includes, if appropriate, various "sub-files". # # See "lib/help/command.txt" and "src/files.c" for more information. # # Format: # M:: # d - 0 - Black w - 1 - White s - 2 - Slate # o - 3 - Orange r - 4 - Red g - 5 - Green # b - 6 - Blue u - 7 - Umber D - 8 - Light Dark # W - 9 - Light Slate P - 10 - Light Purple y - 11 - yellow # R - 12 - Light Red G - 13 - Light Green B - 14 - Light Blue # U - 15 - Light Umber p - 16 - Purple v - 17 - Violet # t - 18 - Teal m - 19 - Mud Y - 20 - Light Yellow # i - 21 - Magenta-Pink T - 22 - Light Teal V - 23 - Light Violet # I - 24 - Light Pink M - 25 - Mustard z - 26 - Blue Slate # Z - 27 - Deep Light Blue # I included all possible message types here for future-proofing, # although some of them are only used as sound-effects at the moment. # sound.cfg can be found in /lib/extra/sound (Twilight). # MSG_GENERIC M:0:w # MSG_HIT M:1:w # MSG_MISS M:2:w # MSG_FLEE M:3:w # MSG_DROP (sound only) M:4:w # MSG_KILL M:5:w # MSG_LEVEL M:6:w # MSG_DEATH M:7:w # MSG_STUDY M:8:w # MSG_TELEPORT (sound only) M:9:w # MSG_SHOOT (sound only) M:10:w # MSG_QUAFF (sound only) M:11:w # MSG_ZAP_ROD (sound only) M:12:w # MSG_WALK (unused) M:13:w # MSG_TPOTHER (sound only) M:14:w # MSG_HITWALL M:15:w # MSG_EAT (sound only) M:16:w # MSG_STORE1 M:17:w # MSG_STORE2 M:18:w # MSG_STORE3 M:19:w # MSG_STORE4 M:20:w # MSG_DIG (sound only) M:21:w # MSG_OPENDOOR M:22:w # MSG_SHUTDOOR (sound only) M:23:w # MSG_TPLEVEL M:24:w # MSG_BELL M:25:o # MSG_NOTHING_TO_OPEN M:26:w # MSG_LOCKPICK_FAIL M:27:w # MSG_STAIRS_DOWN M:28:w # MSG_HITPOINT_WARN M:29:o # MSG_ACT_ARTIFACT M:30:w # MSG_USE_STAFF (sound only) M:31:w # MSG_DESTROY M:32:w # MSG_MON_HIT M:33:w # MSG_MON_TOUCH M:34:w # MSG_MON_PUNCH M:35:w # MSG_MON_KICK M:36:w # MSG_MON_CLAW M:37:w # MSG_MON_BITE M:38:w # MSG_MON_STING M:39:w # MSG_MON_BUTT M:40:w # MSG_MON_CRUSH M:41:w # MSG_MON_ENGULF M:42:w # MSG_MON_CRAWL M:43:w # MSG_MON_DROOL M:44:w # MSG_MON_SPIT M:45:w # MSG_MON_GAZE M:46:w # MSG_MON_WAIL M:47:w # MSG_MON_SPORE M:48:w # MSG_MON_BEG M:49:w # MSG_MON_INSULT M:50:w # MSG_MON_MOAN M:51:w # MSG_RECOVER M:52:w # MSG_BLIND M:53:w # MSG_CONFUSED M:54:w # MSG_POISONED M:55:w # MSG_AFRAID M:56:o # MSG_PARALYZED M:57:w # MSG_DRUGGED M:58:w # MSG_SPEED M:59:w # MSG_SLOW M:60:w # MSG_SHIELD M:61:w # MSG_BLESSED M:62:w # MSG_HERO M:63:w # MSG_BERSERK M:64:w # MSG_PROT_EVIL M:65:w # MSG_INVULN M:66:w # MSG_SEE_INVIS M:67:w # MSG_INFRARED M:68:w # MSG_RES_ACID M:69:w # MSG_RES_ELEC M:70:w # MSG_RES_FIRE M:71:w # MSG_RES_COLD M:72:w # MSG_RES_POIS M:73:w # MSG_STUN M:74:w # MSG_CUT M:75:w # MSG_STAIRS_UP M:76:w # MSG_STORE_ENTER (unused) M:77:w # MSG_STORE_LEAVE (unused) M:78:w # MSG_STORE_HOME (unused) M:79:w # MSG_MONEY1 M:80:w # MSG_MONEY2 M:81:w # MSG_MONEY3 M:82:w # MSG_SHOOT_HIT M:83:w # MSG_STORE5 M:84:w # MSG_LOCKPICK M:85:w # MSG_DISARM M:86:w # MSG_IDENT_BAD M:87:w # MSG_IDENT_EGO M:88:w # MSG_IDENT_ART M:89:w # MSG_BR_ELEMENTS # This is used as a generic breath.Another message type should be defined. M:90:w # MSG_BR_FROST M:91:w # MSG_BR_ELEC M:92:w # MSG_BR_ACID M:93:w # MSG_BR_GAS M:94:w # MSG_BR_FIRE M:95:w # MSG_BR_CONF M:96:w # MSG_BR_DISEN M:97:w # MSG_BR_CHAOS M:98:w # MSG_BR_SHARDS M:99:w # MSG_BR_SOUND M:100:w # MSG_BR_LIGHT M:101:w # MSG_BR_DARK M:102:w # MSG_BR_NETHER M:103:w # MSG_BR_NEXUS M:104:w # MSG_BR_TIME M:105:w # MSG_BR_INERTIA M:106:w # MSG_BR_GRAVITY M:107:w # MSG_BR_PLASMA M:108:w # MSG_BR_FORCE M:109:w # MSG_SUM_MONSTER M:110:w # MSG_SUM_ANGEL M:111:w # MSG_SUM_UNDEAD M:112:w # MSG_SUM_ANIMAL M:113:w # MSG_SUM_SPIDER M:114:w # MSG_SUM_HOUND M:115:w # MSG_SUM_HYDRA M:116:w # MSG_SUM_DEMON M:117:w # MSG_SUM_DRAGON M:118:w # MSG_SUM_HI_UNDEAD M:119:w # MSG_SUM_HI_DRAGON M:120:w # MSG_SUM_HI_DEMON M:121:w # MSG_SUM_WRAITH M:122:w # MSG_SUM_UNIQUE M:123:w # MSG_WIELD M:124:w # MSG_CURSED M:125:w # MSG_PSEUDOID M:126:w # MSG_HUNGRY M:127:w # MSG_NOTICE M:128:w # MSG_AMBIENT_DAY (sound only) M:129:w # MSG_AMBIENT_NITE (sound only) M:130:w # MSG_AMBIENT_DNG1 (sound only) M:131:w # MSG_AMBIENT_DNG2 (sound only) M:132:w # MSG_AMBIENT_DNG3 (sound only) M:133:w # MSG_AMBIENT_DNG4 (sound only) M:134:w # MSG_AMBIENT_DNG5 (sound only) M:135:w # MSG_CREATE_TRAP M:136:w # MSG_SHRIEK M:137:w # MSG_CAST_FEAR M:138:w # MSG_HIT_GOOD M:139:w # MSG_HIT_GREAT M:140:w # MSG_HIT_SUPERB M:141:w # MSG_HIT_HI_GREAT M:142:w # MSG_HIT_HI_SUPERB M:143:w # MSG_SPELL (sound only) M:144:w # MSG_PRAYER (unused) M:145:w # MSG_KILL_UNIQUE M:146:w # MSG_KILL_KING M:147:w # MSG_DRAIN_STAT M:148:w # MSG_MULTIPLY (sound only) M:149:w # MSG_MAX 150 ?:1 angband-v3.3.2/lib/pref/font.prf0000644000175000017500000000126411651552410015773 0ustar chriscchrisc# File: font.prf # # This file defines special attr/char mappings for use in "text" mode # # This file includes, if appropriate, various "sub-files" # # See "lib/help/command.txt" and "src/files.c" for more information. # ## # ## # OPTION: Display "veins" (white "%") as "normal walls" (white "#"). ## # ## F:50:0x01:0x23 ## F:51:0x01:0x23 ## F:52:0x01:0x23 ## F:53:0x01:0x23 ##### Standard font file ##### %:font-xxx.prf ##### System Specific Subfiles ##### ?:[IOR [EQU $SYS xaw] [EQU $SYS x11]] %:font-x11.prf ?:[EQU $SYS gcu] %:font-gcu.prf ?:[EQU $SYS mac] %:font-mac.prf ?:[EQU $SYS win] %:font-win.prf ?:[EQU $SYS acn] %:font-acn.prf ?:[EQU $SYS sdl] %:font-sdl.prf ?:1 angband-v3.3.2/lib/pref/graf.prf0000644000175000017500000000102511651552410015737 0ustar chriscchrisc# File: graf.prf # # This file defines special attr/char mappings for use in "graphics" mode # # This file includes, if appropriate, various "sub-files" # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Standard font file ##### %:font-xxx.prf ##### Load graphics tiles if appropriate ##### # Standard file ?:[EQU $GRAF old] %:graf-xxx.prf # New tiles ?:[EQU $GRAF new] %:graf-new.prf # New tiles ?:[EQU $GRAF nomad] %:graf-nmd.prf # David Gervais' tiles ?:[EQU $GRAF david] %:graf-dvg.prf ?:1 angband-v3.3.2/lib/pref/graf-xxx.prf0000644000175000017500000010740311651552410016573 0ustar chriscchrisc# File: graf-xxx.prf # # This file defines special attr/char mappings for use in "graphics" mode # # See "lib/help/command.txt" and "src/files.c" for more information. # # This file is included by any platform which uses the "standard" Angband # bitmap file, including "pref-ami.prf", "pref-mac.prf", "pref-win.prf", # "pref-dos.prf", and "pref-x11.prf". # # Adapted from the file "graf-ami.prf", provided, along with the original # pixmap file itself, by Lars Haugseth . # # Updated to include new monsters/items/landscape by Dawnmist # # ##### Spell attr/char values ##### GF:*:0:0x84:0x98 GF:*:135:0x84:0x9B GF:*:45:0x84:0x9A GF:*:90:0x84:0x99 GF:*:static:0x85:0x92 GF:ELEC:0:0x84:0x90 GF:ELEC:135:0x84:0x93 GF:ELEC:45:0x84:0x92 GF:ELEC:90:0x84:0x91 GF:ELEC:static:0x85:0x90 GF:POIS:0:0x84:0x8C GF:POIS:135:0x84:0x8F GF:POIS:45:0x84:0x8E GF:POIS:90:0x84:0x8D GF:POIS:static:0x85:0x8F GF:TIME:0:0x84:0x98 GF:TIME:135:0x84:0x9B GF:TIME:45:0x84:0x9A GF:TIME:90:0x84:0x99 GF:TIME:static:0x85:0x90 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:0:0x84:0x98 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:135:0x84:0x9B GF:DARK | DARK_WEAK | HOLY_ORB | MANA:45:0x84:0x9A GF:DARK | DARK_WEAK | HOLY_ORB | MANA:90:0x84:0x99 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:static:0x85:0x93 GF:NETHER:0:0x84:0x98 GF:NETHER:135:0x84:0x9B GF:NETHER:45:0x84:0x9A GF:NETHER:90:0x84:0x99 GF:NETHER:static:0x85:0x8F GF:CHAOS | DISEN | MISSILE:0:0x84:0x94 GF:CHAOS | DISEN | MISSILE:135:0x84:0x97 GF:CHAOS | DISEN | MISSILE:45:0x84:0x96 GF:CHAOS | DISEN | MISSILE:90:0x84:0x95 GF:CHAOS | DISEN | MISSILE:static:0x85:0x91 GF:NEXUS:0:0x84:0x98 GF:NEXUS:135:0x84:0x9B GF:NEXUS:45:0x84:0x9A GF:NEXUS:90:0x84:0x99 GF:NEXUS:static:0x85:0x8D GF:CONFU:0:0x84:0x98 GF:CONFU:135:0x84:0x9B GF:CONFU:45:0x84:0x9A GF:CONFU:90:0x84:0x99 GF:CONFU:static:0x85:0x95 GF:GRAVITY | INERTIA:0:0x84:0x98 GF:GRAVITY | INERTIA:135:0x84:0x9B GF:GRAVITY | INERTIA:45:0x84:0x9A GF:GRAVITY | INERTIA:90:0x84:0x99 GF:GRAVITY | INERTIA:static:0x85:0x92 GF:LIGHT | LIGHT_WEAK:0:0x84:0x84 GF:LIGHT | LIGHT_WEAK:135:0x84:0x87 GF:LIGHT | LIGHT_WEAK:45:0x84:0x86 GF:LIGHT | LIGHT_WEAK:90:0x84:0x85 GF:LIGHT | LIGHT_WEAK:static:0x85:0x8D GF:FIRE | METEOR | PLASMA:0:0x84:0x80 GF:FIRE | METEOR | PLASMA:135:0x84:0x83 GF:FIRE | METEOR | PLASMA:45:0x84:0x82 GF:FIRE | METEOR | PLASMA:90:0x84:0x81 GF:FIRE | METEOR | PLASMA:static:0x85:0x8C GF:ACID | WATER:0:0x84:0x98 GF:ACID | WATER:135:0x84:0x9B GF:ACID | WATER:45:0x84:0x9A GF:ACID | WATER:90:0x84:0x99 GF:ACID | WATER:static:0x85:0x92 GF:FORCE | SHARD:0:0x84:0x98 GF:FORCE | SHARD:135:0x84:0x9B GF:FORCE | SHARD:45:0x84:0x9A GF:FORCE | SHARD:90:0x84:0x99 GF:FORCE | SHARD:static:0x85:0x95 GF:SOUND:0:0x84:0x88 GF:SOUND:135:0x84:0x8B GF:SOUND:45:0x84:0x8A GF:SOUND:90:0x84:0x89 GF:SOUND:static:0x85:0x8E ##### Feature attr/char definitions ##### # F:0:dark:0x85:0xA0 F:0:lit:0x85:0xA1 F:0:bright:0x85:0xA2 # open floor (+ invisible trap) F:1:dark:0x80:0xA0 F:1:lit:0x80:0xA1 F:1:bright:0x80:0xA2 # glyph of warding F:3:dark:0x84:0xA3 F:3:lit:0x84:0xA4 F:3:bright:0x84:0xA5 # open door F:4:dark:0x80:0xA9 F:4:lit:0x80:0xAA F:4:bright:0x80:0xAB # broken door F:5:dark:0x80:0xA9 F:5:lit:0x80:0xAA F:5:bright:0x80:0xAB # up staircase F:6:dark:0x80:0xA3 F:6:lit:0x80:0xA4 F:6:bright:0x80:0xA5 # down staircase F:7:dark:0x80:0xA6 F:7:lit:0x80:0xA7 F:7:bright:0x80:0xA8 # General Store F:8:all:0x81:0x91 # Armoury F:9:all:0x81:0x92 # Weapon Smiths F:10:all:0x81:0x93 # Temple F:11:all:0x81:0x94 # Alchemy Shop F:12:all:0x81:0x95 # Magic Shop F:13:all:0x81:0x96 # Black Market F:14:all:0x81:0x97 # Home F:15:all:0x81:0x98 # trap door F:16:dark:0x84:0xA0 F:16:lit:0x84:0xA1 F:16:bright:0x84:0xA2 # pit F:17:dark:0x84:0xA0 F:17:lit:0x84:0xA1 F:17:bright:0x84:0xA2 F:18:dark:0x84:0xA0 F:18:lit:0x84:0xA1 F:18:bright:0x84:0xA2 F:19:dark:0x84:0xA0 F:19:lit:0x84:0xA1 F:19:bright:0x84:0xA2 # strange rune F:20:dark:0x84:0xA3 F:20:lit:0x84:0xA4 F:20:bright:0x84:0xA5 F:21:dark:0x84:0xA3 F:21:lit:0x84:0xA4 F:21:bright:0x84:0xA5 # discolored spot F:22:dark:0x84:0xA1 F:22:lit:0x84:0xA1 F:22:bright:0x84:0xA1 F:23:dark:0x84:0xA1 F:23:lit:0x84:0xA1 F:23:bright:0x84:0xA1 # dart trap F:24:dark:0x83:0xB2 F:24:lit:0x83:0xB3 F:24:bright:0x83:0xB4 F:25:dark:0x83:0xB2 F:25:lit:0x83:0xB3 F:25:bright:0x83:0xB4 F:26:dark:0x83:0xB2 F:26:lit:0x83:0xB3 F:26:bright:0x83:0xB4 F:27:dark:0x83:0xB2 F:27:lit:0x83:0xB3 F:27:bright:0x83:0xB4 # gas trap F:28:dark:0x83:0xB2 F:28:lit:0x83:0xB3 F:28:bright:0x83:0xB4 F:29:dark:0x83:0xB2 F:29:lit:0x83:0xB3 F:29:bright:0x83:0xB4 F:30:dark:0x83:0xB2 F:30:lit:0x83:0xB3 F:30:bright:0x83:0xB4 F:31:dark:0x83:0xB2 F:31:lit:0x83:0xB3 F:31:bright:0x83:0xB4 # door (+ locked doors + jammed doors) F:32:dark:0x80:0xB2 F:32:lit:0x80:0xB3 F:32:bright:0x80:0xB4 # pile of rubble F:49:dark:0x81:0xB9 F:49:lit:0x81:0xB9 F:49:bright:0x81:0xB9 # magma vein (+ w/ hidden treasure) F:50:dark:0x80:0xBB F:50:lit:0x80:0xBC F:50:bright:0x80:0xBD # quartz vein (+ w/ hidden treasure) F:51:dark:0x80:0xBB F:51:lit:0x80:0xBC F:51:bright:0x80:0xBD # magma vein with treasure F:54:dark:0x80:0xBE F:54:lit:0x80:0xBF F:54:bright:0x80:0xC0 # quartz vein with treasure F:55:dark:0x80:0xBE F:55:lit:0x80:0xBF F:55:bright:0x80:0xC0 # granite wall(s) (+ secret doors) F:56:dark:0x80:0xB8 F:56:lit:0x80:0xB9 F:56:bright:0x80:0xBA # permanent wall(s) F:60:dark:0x81:0xC1 F:60:lit:0x81:0xC2 F:60:bright:0x81:0xC3 ##### Object attr/char definitions ##### ##### Non-kind (contains the "pile" picture) ##### # K:0:0:131:159 ##### Various Stuff ##### K:spike:Iron Spike~:0x8B:0x84 K:light:Wooden Torch~:0x8B:0x86 K:light:Lantern~:0x8B:0x85 K:flask:Flask~ of oil:0x8A:0x9A ##### Food ##### ### Normal Food ### K:food:Ration~ of Food:0x8B:0x82 K:food:Slime Mold~:0x8A:0x9F K:food:Piece~ of Elvish Waybread:0x8B:0x80 ### The shrooms, an interesting collection ### # Graphics are sourced from flavor entries in flvr-xxx.prf ##### Weapons ##### ### Swords ### K:sword:Dagger~:0x89:0x83 K:sword:Main Gauche~:0x89:0x83 K:sword:Rapier~:0x89:0x84 K:sword:Short Sword~:0x89:0x84 K:sword:Cutlass~:0x89:0x84 K:sword:Tulwar~:0x89:0x84 K:sword:Scimitar~:0x89:0x85 K:sword:Long Sword~:0x89:0x85 K:sword:Broad Sword~:0x89:0x85 K:sword:Bastard Sword~:0x89:0x85 K:sword:Katana~:0x89:0x85 K:sword:Zweihander~:0x89:0x85 K:sword:Executioner's Sword~:0x89:0x86 K:sword:Blade~ of Chaos:0x89:0x87 ### Whips ### K:hafted:Whip~:0x89:0x89 K:hafted:Ball-and-Chain~:0x89:0x88 K:hafted:Morning Star~:0x89:0x8B K:hafted:Flail~:0x89:0x8B K:hafted:Two-Handed Great Flail~:0x89:0x8B ### Clubs ### K:hafted:Mace~:0x89:0x8C K:hafted:Lead-Filled Mace~:0x89:0x8C K:hafted:Quarterstaff~:0x89:0x8E K:hafted:War Hammer~:0x89:0x8F K:hafted:Maul~:0x89:0x8F K:hafted:Great Hammer~:0x89:0x8F K:hafted:Mace~ of Disruption:0x89:0x8D ### Spears ### K:polearm:Spear~:0x89:0x91 K:polearm:Awl-Pike~:0x89:0x91 K:polearm:Trident~:0x89:0x92 K:polearm:Halberd~:0x89:0x90 K:polearm:Pike~:0x89:0x91 ### Axes ### K:polearm:Beaked Axe~:0x89:0x90 K:polearm:Broad Axe~:0x89:0x90 K:polearm:Battle Axe~:0x89:0x90 K:polearm:Lochaber Axe~:0x89:0x90 K:polearm:Great Axe~:0x89:0x90 ### Other misc polearms ### K:polearm:Scythe~:0x89:0x94 K:polearm:Glaive~:0x89:0x90 K:polearm:Lance~:0x89:0x93 K:polearm:Scythe~ of Slicing:0x89:0x94 K:polearm:Lucerne Hammer~:0x89:0x90 ##### Bows, Crossbows, Slings ##### K:bow:Sling~:0x89:0x99 K:bow:Short Bow~:0x89:0x95 K:bow:Long Bow~:0x89:0x96 K:bow:Light Crossbow~:0x89:0x97 K:bow:Heavy Crossbow~:0x89:0x98 ##### Missiles ##### K:arrow:Arrow~:0x89:0x9A K:arrow:Seeker Arrow~:0x89:0x9B K:arrow:Mithril Arrow~:0xCE:0x91 K:bolt:Bolt~:0x89:0x9C K:bolt:Seeker Bolt~:0x89:0x9D K:bolt:Mithril Bolt~:0xCE:0x92 K:shot:Rounded Pebble~:0x89:0x9E K:shot:Iron Shot~:0x89:0x9F K:shot:Mithril Shot~:0xCD:0x85 ##### Digging Tools ##### K:digger:Shovel~:0x8A:0x98 K:digger:Pick~:0x8A:0x97 K:digger:Mattock~:0xCD:0x80 ##### Armor ##### K:boots:Pair~ of Leather Sandals:0x88:0x89 K:boots:Pair~ of Leather Boots:0x88:0x8A K:boots:Pair~ of Iron Shod Boots:0x88:0x8B K:boots:Pair~ of Steel Shod Boots:0x88:0x8B K:boots:Pair~ of Mithril Shod Boots:0x88:0x8B K:boots:Pair~ of Ethereal Slippers:0x88:0x89 ### Headgear ### K:helm:Hard Leather Cap~:0x88:0x82 K:helm:Metal Cap~:0x88:0x83 K:helm:Iron Helm~:0x88:0x84 K:helm:Steel Helm~:0x88:0x85 K:crown:Iron Crown~:0x88:0x86 K:crown:Golden Crown~:0x88:0x87 K:crown:Jewel Encrusted Crown~:0x88:0x88 ### Body armours ### K:soft armor:Robe~:0x88:0x95 K:soft armor:Soft Leather Armour~:0x88:0x96 K:soft armor:Studded Leather Armour~:0x88:0x97 K:soft armor:Hard Leather Armour~:0x88:0x97 K:soft armor:Leather Scale Mail~:0x88:0x98 K:hard armor:Metal Scale Mail~:0x88:0x98 K:hard armor:Chain Mail~:0x88:0x99 K:hard armor:Augmented Chain Mail~:0x88:0x99 K:hard armor:Bar Chain Mail~:0x88:0x99 K:hard armor:Metal Brigandine Armour~:0x88:0x99 K:hard armor:Partial Plate Armour~:0x88:0x9B K:hard armor:Metal Lamellar Armour~:0x88:0x9B K:hard armor:Full Plate Armour~:0x88:0x9B K:hard armor:Ribbed Plate Armour~:0x88:0x9B K:hard armor:Mithril Chain Mail~:0x88:0x9C K:hard armor:Mithril Plate Mail~:0x88:0x9C K:hard armor:Adamantite Plate Mail~:0x88:0x9C ### The Cloaks ### K:cloak:Cloak~:0x88:0x80 K:cloak:Fur Cloak~:0x88:0x81 K:cloak:Elven Cloak~:0x88:0x80 K:cloak:Ethereal Cloak~:0x88:0x81 ### The Gloves ### K:gloves:Set~ of Leather Gloves:0x88:0x8C K:gloves:Set~ of Gauntlets:0x88:0x8D K:gloves:Set~ of Mithril Gauntlets:0x88:0x8D K:gloves:Set~ of Caestus:0x88:0x8E K:gloves:Set~ of Alchemist's Gloves:0x88:0x8C #K:gloves:Set~ of Mining Gloves:0x88:0x8D ### The shields ### #K:shield:Buckler~:0x88:0x8F K:shield:Wicker Shield~:0x88:0x8F K:shield:Small Metal Shield~:0x88:0x91 K:shield:Leather Shield~:0x88:0x90 K:shield:Large Metal Shield~:0x88:0x92 K:shield:Mithril Shield~:0x88:0x93 ##### Rings ##### # Graphics are sourced from flavor entries in flvr-xxx.prf ##### Amulets ##### # Graphics are sourced from flavor entries in flvr-xxx.prf ##### Scrolls ##### ### Teleportation ### K:scroll:Phase Door:0x86:0x80 K:scroll:Teleportation:0x86:0x80 K:scroll:Teleport Level:0x86:0x80 ### Detection ### K:scroll:Magic Mapping:0x86:0x80 K:scroll:Treasure Detection:0x86:0x80 K:scroll:Trap Detection:0x86:0x80 K:scroll:Door/Stair Location:0x86:0x80 K:scroll:Detect Invisible:0x86:0x80 ### Enchantments ### K:scroll:Enchant Weapon To-Hit:0x86:0x80 K:scroll:Enchant Weapon To-Dam:0x86:0x80 K:scroll:Enchant Armour:0x86:0x80 K:scroll:*Enchant Weapon*:0x86:0x82 K:scroll:*Enchant Armour*:0x86:0x82 K:scroll:Remove Curse:0x86:0x80 K:scroll:*Remove Curse*:0x86:0x82 ### Summoning ### K:scroll:Summon Monster:0x86:0x80 K:scroll:Summon Undead:0x86:0x80 K:scroll:Acquirement:0x86:0x80 K:scroll:*Acquirement*:0x86:0x82 ### Killing scrolls ### K:scroll:Dispel Undead:0x86:0x81 K:scroll:Banishment:0x86:0x81 K:scroll:Mass Banishment:0x86:0x82 ### Utility ### K:scroll:Satisfy Hunger:0x86:0x80 K:scroll:Identify:0x86:0x80 K:scroll:Light:0x86:0x80 K:scroll:Word of Recall:0x86:0x80 K:scroll:Recharging:0x86:0x81 K:scroll:Trap/Door Destruction:0x86:0x80 K:scroll:Deep Descent:0x86:0x80 ### "Holy" spells ### K:scroll:Blessing:0x86:0x80 K:scroll:Holy Chant:0x86:0x80 K:scroll:Holy Prayer:0x86:0x81 K:scroll:Protection from Evil:0x86:0x81 ### Misc. ### K:scroll:Monster Confusion:0x86:0x80 K:scroll:Rune of Protection:0x86:0x82 K:scroll:*Destruction*:0x86:0x82 ### Bad scrolls ### K:scroll:Aggravate Monster:0x86:0x80 K:scroll:Curse Weapon:0x86:0x82 K:scroll:Curse Armour:0x86:0x82 K:scroll:Darkness:0x86:0x80 K:scroll:Trap Creation:0x86:0x80 ##### Potions ##### # Graphics are sourced from flavor entries in flvr-xxx.prf ##### Wands ##### # Graphics are sourced from flavor entries in flvr-xxx.prf ##### Staffs ##### # Graphics are sourced from flavor entries in flvr-xxx.prf ##### Rods ##### # Graphics are sourced from flavor entries in flvr-xxx.prf ##### Basic Books ##### K:magic book:[Magic for Beginners]:0x8A:0x80 K:magic book:[Conjurings and Tricks]:0x8A:0x81 K:magic book:[Incantations and Illusions]:0x8A:0x82 K:magic book:[Sorcery and Evocations]:0x8A:0x83 K:prayer book:[Beginners Handbook]:0x8A:0x89 K:prayer book:[Words of Wisdom]:0x8A:0x8A K:prayer book:[Chants and Blessings]:0x8A:0x8B K:prayer book:[Exorcism and Dispelling]:0x8A:0x8C ##### Special Books (note resistances) ##### K:magic book:[Resistances of Scarabtarices]:0x8A:0x84 K:magic book:[Raal's Tome of Destruction]:0x8A:0x88 K:magic book:[Mordenkainen's Escapes]:0x8A:0x85 K:magic book:[Tenser's Transformations]:0x8A:0x87 K:magic book:[Kelek's Grimoire of Power]:0x8A:0x86 K:prayer book:[Ethereal Openings]:0x8A:0x8D K:prayer book:[Godly Insights]:0x8A:0x8E K:prayer book:[Purifications and Healing]:0x8A:0x8F K:prayer book:[Holy Infusions]:0x8A:0x90 K:prayer book:[Wrath of God]:0x8A:0x91 ##### Chests ##### K:chest:Small wooden chest~:0x80:0x96 K:chest:Large wooden chest~:0x80:0x97 K:chest:Small iron chest~:0x80:0x98 K:chest:Large iron chest~:0x80:0x99 K:chest:Small steel chest~:0x80:0x9A K:chest:Large steel chest~:0x80:0x9B K:chest:Ruined chest~:0x80:0x9C ##### Junk ##### K:bottle:Empty Bottle~:0x8A:0x99 K:junk:Shard~ of Pottery:0x8B:0x88 K:junk:Broken Stick~:0x8B:0x89 K:skeleton:Broken Skull~:0x8B:0x8A K:skeleton:Broken Bone~:0x8B:0x8B K:skeleton:Canine Skeleton~:0x8B:0x87 K:skeleton:Rodent Skeleton~:0x8B:0x87 K:skeleton:Human Skeleton~:0x8B:0x87 K:skeleton:Dwarf Skeleton~:0x8B:0x87 K:skeleton:Elf Skeleton~:0x8B:0x87 ##### Dragon Scale Mail ##### K:dragon armor:Black Dragon Scale Mail~:0x88:0x9F K:dragon armor:Blue Dragon Scale Mail~:0x88:0x9D K:dragon armor:White Dragon Scale Mail~:0x88:0x9E K:dragon armor:Red Dragon Scale Mail~:0x89:0x81 K:dragon armor:Green Dragon Scale Mail~:0x89:0x80 K:dragon armor:Multi-Hued Dragon Scale Mail~:0x89:0x82 K:dragon armor:Pseudo-Dragon Scale Mail~:0xBB:0x9C K:dragon armor:Law Dragon Scale Mail~:0x88:0x9F K:dragon armor:Bronze Dragon Scale Mail~:0x88:0x96 K:dragon armor:Gold Dragon Scale Mail~:0x88:0x9C K:dragon armor:Chaos Dragon Scale Mail~:0x89:0x80 K:dragon armor:Balance Dragon Scale Mail~:0x88:0x99 K:dragon armor:Power Dragon Scale Mail~:0x89:0x82 ##### Gold/gems ##### K:gold:copper:0x80:0x8B K:gold:silver:0x80:0x8C K:gold:garnets:0x80:0x8F K:gold:gold:0x80:0x8D K:gold:opals:0x80:0x90 K:gold:sapphires:0x80:0x91 K:gold:rubies:0x80:0x92 K:gold:diamonds:0x80:0x93 K:gold:emeralds:0x80:0x94 K:gold:mithril:0x80:0x8E K:gold:adamantite:0x80:0x8F ##### "Morgoth Artifacts" ##### K:hafted:Mighty Hammer~:0x87:0x9A K:crown:Massive Iron Crown~:0x87:0x9B ##### "Special Artifacts" ##### # These artifacts use numeric SVALs to ensure unique matches # The Phial of Galadriel K:light:4:0x87:0x9D # The Star of Elendil K:light:5:0x87:0x9E # The Arkenstone of Thrain K:light:6:0x87:0x9F # The Amulet of Carlammas K:amulet:50:0x87:0x82 # The Amulet of Ingwe K:amulet:51:0x87:0x83 # The Necklace of the Dwarves K:amulet:52:0x87:0x84 # The Ring of Barahir K:ring:50:0x82:0x83 # The Ring of Tulkas K:ring:51:0x82:0x83 # The Ring of Power 'Narya' K:ring:52:0x82:0x84 # The Ring of Power 'Nenya' K:ring:53:0x82:0x85 # The Ring of Power 'Vilya' K:ring:54:0x82:0x86 # The Ring of Power 'The One Ring' K:ring:55:0x82:0x87 # The Palantir of Westernesse K:light:7:0xD8:0x8F # The Elfstone 'Elessar' K:amulet:53:0xB6:0x8F # The Jewel 'Evenstar' K:amulet:54:0xB6:0x90 ##### Monster attr/char definitions ##### # R:0:0x8C:0x80 # Filthy street urchin R:1:0x9B:0x8A # Scrawny cat R:2:0x98:0x8B # Scruffy little dog R:3:0x8E:0x9D # Farmer Maggot R:4:0x9B:0x8B # Blubbering idiot R:5:0x9B:0x8C # Boil-covered wretch R:6:0x9B:0x8D # Village idiot R:7:0x9B:0x8E # Pitiful-looking beggar R:8:0x9B:0x8F # Mangy-looking leper R:9:0x9B:0x90 # Squint-eyed rogue R:10:0x9B:0x91 # Singing, happy drunk R:11:0x9B:0x92 # Aimless-looking merchant R:12:0x9B:0x93 # Mean-looking mercenary R:13:0x9B:0x94 # Battle-scarred veteran R:14:0x9B:0x95 # Grey mold R:15:0x9A:0x88 # Grey mushroom patch R:16:0x8E:0x85 # Giant yellow centipede R:17:0x96:0x9D # Giant white centipede R:18:0x96:0x9E # White icky thing R:19:0x99:0x8C # Clear icky thing R:20:0x99:0x8D # Giant white mouse R:21:0x9D:0x8F # Large brown snake R:22:0x93:0x89 # Large white snake R:23:0x93:0x8A # Small kobold R:24:0x9A:0x82 # Kobold R:25:0x9A:0x83 # White worm mass R:26:0x9E:0x88 # Floating eye R:27:0x98:0x84 # Rock lizard R:28:0x93:0x8B # Jackal R:29:0x8E:0x9E # Soldier ant R:30:0x96:0x8F # Fruit bat R:31:0x96:0x98 # Shrieker mushroom patch R:32:0x8E:0x86 # Blubbering icky thing R:33:0x99:0x8E # Metallic green centipede R:34:0x96:0x9F # Novice warrior R:35:0x9B:0x96 # Novice rogue R:36:0x9B:0x97 # Novice priest R:37:0x9B:0x98 # Novice mage R:38:0x9B:0x99 # Yellow mushroom patch R:39:0x8E:0x87 # White jelly R:40:0x99:0x93 # Giant green frog R:41:0x93:0x8C # Giant black ant R:42:0x96:0x90 # Salamander R:43:0x93:0x8D # White harpy R:44:0x91:0x8C # Blue yeek R:45:0x9E:0x92 # Grip, Farmer Maggot's dog R:46:0x8E:0x9F # Fang, Farmer Maggot's dog R:47:0x8F:0x80 # Green worm mass R:48:0x9E:0x89 # Large yellow snake R:49:0x93:0x91 # Cave spider R:50:0x94:0x82 # Wild cat R:51:0x98:0x8C # Smeagol R:52:0x9B:0x9A # Green ooze R:53:0x99:0x94 # Poltergeist R:54:0x90:0x9D # Metallic blue centipede R:55:0x97:0x80 # Giant white louse R:56:0x9A:0x86 # Black naga R:57:0x9A:0x91 # Spotted mushroom patch R:58:0x8E:0x88 # Silver jelly R:59:0x99:0x95 # Yellow jelly R:60:0x99:0x96 # Scruffy looking hobbit R:61:0x98:0x9C # Giant white ant R:62:0x96:0x91 # Yellow mold R:63:0x9A:0x89 # Metallic red centipede R:64:0x97:0x81 # Yellow worm mass R:65:0x9E:0x8A # Clear worm mass R:66:0x9E:0x8B # Radiation eye R:67:0x98:0x85 # Cave lizard R:68:0x93:0x8F # Novice ranger R:69:0x9B:0x9B # Novice paladin R:70:0x9B:0x9C # Blue jelly R:71:0x99:0x97 # Creeping copper coins R:72:0x8E:0x80 # Giant white rat R:73:0x9D:0x90 # Blue worm mass R:74:0x9E:0x8C # Large grey snake R:75:0x93:0x90 # Bullroarer the Hobbit R:76:0x98:0x9D # Novice mage R:77:0x9B:0x9D # Green naga R:78:0x9A:0x92 # Blue ooze R:79:0x99:0x98 # Green glutton ghost R:80:0x90:0x9E # Green jelly R:81:0x99:0x99 # Large kobold R:82:0x9A:0x84 # Skeleton kobold R:83:0x9D:0x93 # Grey icky thing R:84:0x99:0x8F # Disenchanter eye R:85:0x98:0x86 # Red worm mass R:86:0x9E:0x8D # Copperhead snake R:87:0x93:0x91 # Purple mushroom patch R:88:0x8E:0x89 # Novice priest R:89:0x9B:0x9E # Novice warrior R:90:0x9B:0x9F # Novice rogue R:91:0x9C:0x80 # Brown mold R:92:0x9A:0x8A # Giant brown bat R:93:0x96:0x99 # Kobold archer R:94:0xC7:0x80 # Creeping silver coins R:95:0x8E:0x81 # Snaga R:96:0x9A:0x97 # Rattlesnake R:97:0x93:0x92 # Cave orc R:98:0x9A:0x98 # Wood spider R:99:0x94:0x83 # Manes R:100:0x91:0x96 # Bloodshot eye R:101:0x98:0x87 # Red naga R:102:0x9A:0x93 # Red jelly R:103:0x99:0x9A # Giant red frog R:104:0x93:0x93 # Green icky thing R:105:0x99:0x90 # Zombified kobold R:106:0x9E:0x97 # Lost soul R:107:0x90:0x9F # Dark elf R:108:0x98:0x9E # Night lizard R:109:0x93:0x94 # Mughash the Kobold Lord R:110:0x9A:0x85 # Wormtongue, Agent of Saruman R:111:0x9C:0x82 # Lagduf, the Snaga R:112:0x9A:0x99 # Brown yeek R:113:0x9E:0x93 # Novice ranger R:114:0x9C:0x83 # Giant salamander R:115:0x93:0x95 # Green mold R:116:0x9A:0x8B # Skeleton orc R:117:0x9D:0x94 # Novice paladin R:118:0x9B:0x9C # Lemure R:119:0x91:0x97 # Hill orc R:120:0x9A:0x9A # Bandit R:121:0x9C:0x85 # Yeti R:122:0x95:0x99 # Bloodshot icky thing R:123:0x99:0x91 # Giant grey rat R:124:0x9D:0x91 # Black harpy R:125:0x91:0x8D # Orc shaman R:126:0x9A:0x9B # Baby blue dragon R:127:0x97:0x86 # Baby white dragon R:128:0x97:0x87 # Baby green dragon R:129:0x97:0x88 # Baby black dragon R:130:0x97:0x89 # Baby red dragon R:131:0x97:0x8A # Giant red ant R:132:0x96:0x92 # Brodda, the Easterling R:133:0x9C:0x86 # King cobra R:134:0x93:0x96 # Giant spider R:135:0x94:0x84 # Dark elven mage R:136:0x98:0x9F # Orfax, Son of Boldor R:137:0x9E:0x94 # Dark elven warrior R:138:0x99:0x80 # Clear mushroom patch R:139:0x8E:0x8A # Grishnakh, the Hill Orc R:140:0x9A:0x9C # Giant white tick R:141:0x9D:0x9C # Hairy mold R:142:0x9A:0x8C # Disenchanter mold R:143:0x9A:0x8D # Pseudo-dragon R:144:0x97:0x8B # Tengu R:145:0x91:0x98 # Creeping gold coins R:146:0x8E:0x82 # Wolf R:147:0x8F:0x81 # Giant fruit fly R:148:0x90:0x95 # Panther R:149:0x98:0x8D # Brigand R:150:0x9C:0x87 # Baby multi-hued dragon R:151:0x97:0x8C # Hippogriff R:152:0x91:0x8E # Zombified orc R:153:0x9E:0x98 # Gnome mage R:154:0x99:0x81 # Black mamba R:155:0x93:0x97 # White wolf R:156:0x8F:0x82 # Grape jelly R:157:0x99:0x9B # Nether worm mass R:158:0x9E:0x8E # Golfimbul, the Hill Orc Chief R:159:0x9A:0x9D # Master yeek R:160:0x9E:0x95 # Priest R:161:0x9C:0x88 # Dark elven priest R:162:0x99:0x82 # Air spirit R:163:0x90:0x83 # Skeleton human R:164:0x9D:0x95 # Zombified human R:165:0x9E:0x99 # Tiger R:166:0x98:0x8E # Moaning spirit R:167:0x91:0x80 # Swordsman R:168:0x9C:0x89 # Stegocentipede R:169:0x97:0x82 # Spotted jelly R:170:0x99:0x9C # Drider R:171:0x94:0x85 # Killer brown beetle R:172:0x92:0x80 # Boldor, King of the Yeeks R:173:0x9E:0x96 # Ogre R:174:0x92:0x90 # Creeping mithril coins R:175:0x8E:0x83 # Illusionist R:176:0x9C:0x8A # Druid R:177:0x9C:0x8B # Black orc R:178:0x9A:0x9E # Ochre jelly R:179:0x99:0x9D # Giant flea R:180:0x90:0x96 # Ufthak of Cirith Ungol R:181:0x9A:0x9F # Giant white dragon fly R:182:0x90:0x97 # Blue icky thing R:183:0x99:0x92 # Hill giant R:184:0x92:0x96 # Flesh golem R:185:0x98:0x92 # Warg R:186:0x8F:0x83 # Giant black louse R:187:0x9A:0x87 # Lurker R:188:0x8E:0x8D # Wererat R:189:0x9D:0x92 # Black ogre R:190:0x92:0x91 # Magic mushroom patch R:191:0x8E:0x8B # Guardian naga R:192:0x9A:0x94 # Light hound R:193:0x95:0x9B # Dark hound R:194:0x95:0x9C # Half-orc R:195:0x9B:0x80 # Giant tarantula R:196:0x94:0x86 # Giant clear centipede R:197:0x97:0x83 # Mirkwood spider R:198:0x94:0x87 # Frost giant R:199:0x92:0x97 # Griffon R:200:0x91:0x8F # Homunculus R:201:0x91:0x99 # Gnome mage R:202:0x99:0x83 # Clear hound R:203:0x95:0x9D # Clay golem R:204:0x98:0x93 # Umber hulk R:205:0x94:0x9E # Orc captain R:206:0x9B:0x81 # Gelatinous cube R:207:0x99:0x9E # Giant green dragon fly R:208:0x90:0x98 # Fire giant R:209:0x92:0x98 # Hummerhorn R:210:0x90:0x99 # Ulfast, Son of Ulfang R:211:0x9C:0x8C # Quasit R:212:0x91:0x9A # Imp R:213:0x91:0x9B # Forest troll R:214:0x94:0x8E # Nar, the Dwarf R:215:0x99:0x84 # 2-headed hydra R:216:0x93:0x98 # Water spirit R:217:0x90:0x84 # Giant red scorpion R:218:0x94:0x8C # Earth spirit R:219:0x90:0x85 # Fire spirit R:220:0x90:0x86 # Fire hound R:221:0x95:0x9E # Cold hound R:222:0x95:0x9F # Energy hound R:223:0x96:0x80 # Potion mimic R:224:0x8E:0x8F # Blink dog R:225:0x8F:0x84 # Uruk R:226:0x9B:0x82 # Shagrat, the Orc Captain R:227:0x9B:0x83 # Gorbag, the Orc Captain R:228:0x9B:0x84 # Shambling mound R:229:0x8E:0x8C # Stone giant R:230:0x92:0x99 # Giant black dragon fly R:231:0x90:0x9A # Stone golem R:232:0x98:0x94 # Red mold R:233:0x9A:0x8E # Giant gold dragon fly R:234:0x90:0x9B # Bolg, Son of Azog R:235:0x9B:0x85 # Phase spider R:236:0x94:0x89 # 3-headed hydra R:237:0x93:0x99 # Earth hound R:238:0x96:0x81 # Air hound R:239:0x96:0x82 # Sabre-tooth tiger R:240:0x98:0x8F # Water hound R:241:0x96:0x83 # Chimaera R:242:0x91:0x90 # Quylthulg R:243:0x92:0x9F # Sasquatch R:244:0x95:0x9A # Werewolf R:245:0x8F:0x85 # Dark elven lord R:246:0x99:0x85 # Cloud giant R:247:0x92:0x9A # Lugdush, the Uruk R:248:0x9B:0x87 # Ugluk, the Uruk R:249:0x9B:0x86 # Blue dragon bat R:250:0x96:0x9A # Scroll mimic R:251:0x8E:0x90 # Fire vortex R:252:0x9D:0x9E # Water vortex R:253:0x9D:0x9F # Cold vortex R:254:0x9E:0x80 # Energy vortex R:255:0x9E:0x81 # Mummified orc R:256:0x92:0x8D # Killer stag beetle R:257:0x92:0x81 # Iron golem R:258:0x98:0x95 # Giant yellow scorpion R:259:0x94:0x8A # Black ooze R:260:0x99:0x9F # Hardened warrior R:261:0x9C:0x8D # Azog, King of the Uruk-Hai R:262:0x9B:0x88 # Master rogue R:263:0x9C:0x8E # Red dragon bat R:264:0x96:0x9B # Killer white beetle R:265:0x96:0x91 # Giant bronze dragon fly R:266:0x90:0x9C # Forest wight R:267:0x95:0x83 # Ibun, Son of Mim R:268:0x99:0x86 # Khim, Son of Mim R:269:0x99:0x87 # 4-headed hydra R:270:0x93:0x9A # Mummified human R:271:0x92:0x8E # Vampire bat R:272:0x96:0x9C # Sangahyando of Umbar R:273:0x9C:0x8F # Angamaite of Umbar R:274:0x9C:0x90 # Banshee R:275:0x91:0x81 # Pukelman R:276:0x98:0x96 # Dark elven druid R:277:0x99:0x88 # Stone troll R:278:0x94:0x8F # Troll priest R:279:0x94:0x90 # Wereworm R:280:0x9E:0x8F # Carrion crawler R:281:0x97:0x84 # Killer red beetle R:282:0x92:0x83 # Giant grey ant R:283:0x96:0x95 # Ulwarth, Son of Ulfang R:284:0x9C:0x91 # Displacer beast R:285:0x98:0x90 # Giant fire tick R:286:0x9D:0x9D # Cave ogre R:287:0x92:0x92 # White wraith R:288:0x95:0x84 # Angel R:289:0x8E:0x92 # Mim, Betrayer of Turin R:290:0x99:0x89 # Killer fire beetle R:291:0x92:0x84 # Creeping adamantite coins R:292:0x8E:0x84 # Algroth R:293:0x94:0x91 # Vibration hound R:294:0x96:0x84 # Nexus hound R:295:0x8F:0x86 # Ogre mage R:296:0x92:0x93 # Lokkak, the Ogre Chieftain R:297:0x92:0x94 # Vampire R:298:0x94:0x9F # Gorgimaera R:299:0x91:0x91 # Colbran R:300:0x98:0x97 # Spirit naga R:301:0x9A:0x95 # 5-headed hydra R:302:0x93:0x9B # Black knight R:303:0x9C:0x92 # Uldor the Accursed R:304:0x9C:0x93 # Mage R:305:0x9C:0x94 # Mind flayer R:306:0x9C:0x95 # Draebor, the Imp R:307:0x91:0x9C # Basilisk R:308:0x93:0x9C # Ice troll R:309:0x94:0x92 # Purple worm R:310:0x9E:0x90 # Archangel R:311:0x8E:0x93 # Catoblepas R:312:0x9D:0x8B # Ring mimic R:313:0x82:0x81 # Young blue dragon R:314:0x97:0x8D # Young white dragon R:315:0x97:0x8E # Young green dragon R:316:0x97:0x8F # Young bronze dragon R:317:0x97:0x90 # Mithril golem R:318:0x98:0x98 # Shadow drake R:319:0x97:0x91 # Skeleton troll R:320:0x9D:0x96 # Manticore R:321:0x91:0x92 # Giant blue ant R:322:0x96:0x94 # Giant army ant R:323:0x96:0x95 # Grave wight R:324:0x95:0x85 # Killer slicer beetle R:325:0x92:0x85 # Ghost R:326:0x91:0x82 # Death watch beetle R:327:0x92:0x86 # Ogre shaman R:328:0x92:0x95 # Nexus quylthulg R:329:0x93:0x80 # Shelob, Spider of Darkness R:330:0x94:0x8B # Ninja R:331:0x9C:0x96 # Memory moss R:332:0x9A:0x8F # Storm giant R:333:0x92:0x9B # Cave troll R:334:0x94:0x93 # Half-troll R:335:0x94:0x94 # Mystic R:336:0x9C:0x97 # Barrow wight R:337:0x95:0x86 # Skeleton ettin R:338:0x9D:0x97 # Chaos drake R:339:0x97:0x92 # Law drake R:340:0x97:0x93 # Balance drake R:341:0x97:0x94 # Ethereal drake R:342:0x97:0x95 # Bert the Stone Troll R:343:0x94:0x95 # Bill the Stone Troll R:344:0x94:0x96 # Tom the Stone Troll R:345:0x94:0x97 # Shade R:346:0x91:0x83 # Spectre R:347:0x91:0x84 # Water troll R:348:0x94:0x98 # Fire elemental R:349:0x90:0x87 # Cherub R:350:0x8E:0x94 # Water elemental R:351:0x90:0x88 # Invisible stalker R:352:0x90:0x89 # Carrion crawler R:353:0x97:0x85 # Master thief R:354:0x9C:0x98 # Ulfang the Black R:355:0x9C:0x99 # Lich R:356:0x92:0x88 # Master vampire R:357:0x95:0x80 # Giant grey scorpion R:358:0x94:0x8C # Earth elemental R:359:0x90:0x8A # Air elemental R:360:0x90:0x8B # Hellhound R:361:0x8F:0x86 # Eog golem R:362:0x98:0x99 # Olog R:363:0x94:0x99 # Dagashi R:364:0x9C:0x9A # Gravity hound R:365:0x96:0x86 # Acidic cytoplasm R:366:0x9A:0x80 # Inertia hound R:367:0x96:0x87 # Impact hound R:368:0x96:0x88 # Dread R:369:0x91:0x85 # Ooze elemental R:370:0x90:0x8C # Smoke elemental R:371:0x90:0x8D # Young black dragon R:372:0x97:0x96 # Mumak R:373:0x9D:0x8C # Giant fire ant R:374:0x96:0x96 # Mature white dragon R:375:0x97:0x97 # Xorn R:376:0x95:0x97 # Shadow R:377:0x91:0x86 # Phantom R:378:0x91:0x87 # Grey wraith R:379:0x95:0x87 # Young multi-hued dragon R:380:0x97:0x98 # Colossus R:381:0x98:0x9A # Young gold dragon R:382:0x97:0x99 # Rogrog the Black Troll R:383:0x94:0x9A # Mature blue dragon R:384:0x97:0x9A # Mature green dragon R:385:0x97:0x9B # Mature bronze dragon R:386:0x97:0x9C # Young red dragon R:387:0x97:0x9D # Trapper R:388:0x8E:0x8E # Bodak R:389:0x91:0x9D # Ice elemental R:390:0x90:0x8E # Necromancer R:391:0x9C:0x9B # Lorgan, Chief of the Easterlings R:392:0x9C:0x9C # Demonologist R:393:0x9C:0x9D # Mummified troll R:394:0x92:0x8F # The Queen Ant R:395:0x96:0x97 # Will o' the wisp R:396:0x90:0x8F # Magma elemental R:397:0x90:0x90 # Black pudding R:398:0x9A:0x81 # Killer iridescent beetle R:399:0xA3:0x94 # Nexus vortex R:400:0x9D:0x9E # Plasma vortex R:401:0x9E:0x83 # Mature red dragon R:402:0x97:0x9E # Mature gold dragon R:403:0x97:0x9F # Crystal drake R:404:0x98:0x80 # Mature black dragon R:405:0x98:0x81 # Mature multi-hued dragon R:406:0x98:0x82 # Death knight R:407:0x9C:0x9E # Castamir the Usurper R:408:0x9C:0x9F # Time vortex R:409:0x9E:0x84 # Shimmering vortex R:410:0x9E:0x85 # Ancient blue dragon R:411:0x8F:0x8B # Ancient bronze dragon R:412:0x8F:0x8C # Beholder R:413:0x98:0x88 # Emperor wight R:414:0x95:0x88 # Seraph R:415:0x8E:0x95 # Vargo, Tyrant of Fire R:416:0x90:0x91 # Black wraith R:417:0x95:0x89 # Erinyes R:418:0x9E:0x9A # Nether wraith R:419:0x95:0x8A # Eldrak R:420:0x94:0x9B # Ettin R:421:0x94:0x9C # Waldern, King of Water R:422:0x90:0x92 # Kavlax the Many-Headed R:423:0x98:0x83 # Ancient white dragon R:424:0x8F:0x8D # Ancient green dragon R:425:0x8F:0x8E # 7-headed hydra R:426:0x93:0x9D # Night mare R:427:0x9D:0x8D # Vampire lord R:428:0x95:0x81 # Ancient black dragon R:429:0x8F:0x8F # Disenchanter worm mass R:430:0x9E:0x91 # Rotting quylthulg R:431:0x93:0x81 # Spirit troll R:432:0x94:0x9D # Lesser titan R:433:0x92:0x9C # 9-headed hydra R:434:0x93:0x9E # Enchantress R:435:0x9D:0x80 # Knight Templar R:436:0xB1:0x9A # Sorcerer R:437:0x9D:0x82 # Xaren R:438:0x95:0x98 # Giant roc R:439:0x8E:0x9A # Uvatha the Horseman R:440:0x95:0x8B # Minotaur R:441:0x91:0x93 # Medusa, the Gorgon R:442:0x9A:0x96 # Death drake R:443:0x8F:0x90 # Ancient red dragon R:444:0x8F:0x91 # Ancient gold dragon R:445:0x8F:0x92 # Great crystal drake R:446:0x8F:0x93 # Vrock R:447:0x9E:0x9B # Death quasit R:448:0x91:0x9E # Adunaphel the Quiet R:449:0x95:0x8C # Dark elven sorcerer R:450:0x99:0x8A # Master lich R:451:0x92:0x89 # Hezrou R:452:0x9E:0x9C # Akhorahil the Blind R:453:0x95:0x8D # Gorlim, Betrayer of Barahir R:454:0x9D:0x83 # Archon R:455:0x8E:0x96 # Glabrezu R:456:0x9E:0x9D # Ren the Unclean R:457:0x95:0x82 # Nalfeshnee R:458:0x9E:0x9E # Undead beholder R:459:0x98:0x89 # Dread R:460:0x91:0x88 # Mumak R:461:0x9D:0x8E # Ancient multi-hued dragon R:462:0x8F:0x94 # Ethereal dragon R:463:0x8F:0x95 # Ji Indur Dawndeath R:464:0x95:0x8F # Marilith R:465:0x9E:0x9F # Quaker, Master of Earth R:466:0x90:0x93 # Lesser Balrog R:467:0x9F:0x80 # Ariel, Queen of Air R:468:0x90:0x94 # 11-headed hydra R:469:0x93:0x9F # Patriarch R:470:0x9D:0x84 # Dreadmaster R:471:0x91:0x89 # Drolem R:472:0x98:0x9B # Scatha the Worm R:473:0x98:0x9B # Dwar, Dog Lord of Waw R:474:0x95:0x8F # Smaug the Golden R:475:0x8F:0x97 # Dracolich R:476:0x8F:0x98 # Greater titan R:477:0x92:0x9D # Dracolisk R:478:0x90:0x94 # Death mold R:479:0x9A:0x90 # Itangast the Fire Drake R:480:0x8F:0x99 # Glaurung, Father of the Dragons R:481:0x8F:0x99 # Master mystic R:482:0x9D:0x85 # The Balrog of Moria R:483:0x9F:0x81 # Nightwing R:484:0x8F:0x9E # Nether hound R:485:0x96:0x89 # Time hound R:486:0x96:0x8A # Plasma hound R:487:0x96:0x8B # Demonic quylthulg R:488:0x93:0x82 # Great Storm Wyrm R:489:0x8F:0x9B # Baphomet the Minotaur Lord R:490:0x91:0x95 # Harowen the Black Hand R:491:0x9D:0x86 # Hoarmurath of Dir R:492:0x95:0x92 # Grand master mystic R:493:0x9D:0x87 # Khamul, the Black Easterling R:494:0x95:0x93 # Ethereal hound R:495:0x96:0x8C # Great Ice Wyrm R:496:0x8F:0x9C # The Phoenix R:497:0x8E:0x9B # Nightcrawler R:498:0x95:0x94 # Hand druj R:499:0x9D:0x98 # Eye druj R:500:0x9D:0x99 # Skull druj R:501:0x9D:0x9A # Chaos vortex R:502:0x9E:0x86 # Aether vortex R:503:0x9E:0x87 # The Lernaean Hydra R:504:0x94:0x80 # Thuringwethil, the Vampire Messenger R:505:0x95:0x82 # Great Hell Wyrm R:506:0x8F:0x9D # Draconic quylthulg R:507:0x93:0x83 # Fundin Bluecloak R:508:0x99:0x8B # Uriel, Angel of Fire R:509:0x8E:0x97 # Azriel, Angel of Death R:510:0x8E:0x98 # Ancalagon the Black R:511:0x8F:0x9E # Nightwalker R:512:0x95:0x95 # Gabriel, the Messenger R:513:0x8E:0x99 # Saruman of Many Colours R:514:0x9D:0x88 # Dreadlord R:515:0x91:0x8A # The Cat Lord R:516:0x98:0x91 # Jabberwock R:517:0x91:0x9F # Chaos hound R:518:0x96:0x8D # Great Wyrm of Chaos R:519:0x8F:0x9F # Great Wyrm of Law R:520:0x90:0x80 # Great Wyrm of Balance R:521:0x90:0x81 # Tselakus, the Dreadlord R:522:0x91:0x8B # Great Wyrm of Many Colours R:523:0x90:0x82 # Black reaver R:524:0x92:0x8A # Greater demonic quylthulg R:525:0x93:0x87 # Greater draconic quylthulg R:526:0x93:0x85 # Greater rotting quylthulg R:527:0x93:0x86 # Feagwath, the Undead Sorcerer R:528:0x92:0x8C # Omarax, the Eye Tyrant R:529:0x98:0x8A # Ungoliant, the Unlight R:530:0x94:0x8D # Aether hound R:531:0x96:0x8E # The Mouth of Sauron R:532:0x9D:0x89 # Master quylthulg R:533:0x93:0x84 # Qlzqqlzuup, the Emperor Quylthulg R:534:0x93:0x88 # The Witch-King of Angmar R:535:0x95:0x96 # Pazuzu, Lord of Air R:536:0x8E:0x9C # Hellhound R:537:0x8F:0x87 # Cantoras, the Skeletal Lord R:538:0x9D:0x9B # The Tarrasque R:539:0x94:0x81 # Lungorthin, the Balrog of White Fire R:540:0x9F:0x82 # Draugluin, Sire of All Werewolves R:541:0x8F:0x88 # Vecna, the Emperor Lich R:542:0x92:0x8B # Huan, Wolfhound of the Valar R:543:0xB2:0x83 # Carcharoth, the Jaws of Thirst R:544:0x8F:0x89 # Gothmog, the High Captain of Balrogs R:545:0x9F:0x83 # Sauron, the Sorcerer R:546:0x9D:0x8A # Morgoth, Lord of Darkness R:547:0x92:0x9E # Silver mouse R:548:0xB0:0x83 # Rot jelly R:549:0xB1:0x91 # Giant tan bat R:550:0x96:0x99 # Giant silver ant R:551:0xB0:0x87 # Giant brown tick R:552:0xC5:0x9B # Disenchanter bat R:553:0xB0:0x9B # Shimmering mold R:554:0xA2:0x93 # Wyvern R:555:0xA0:0x97 # Chest mimic R:556:0x80:0x9B # Demilich R:557:0xC2:0x9F # Archlich R:558:0xC3:0x89 # Crow R:559:0xBD:0x8B # Raven R:560:0xBD:0x8C # Crebain R:561:0xC4:0x94 # Winged Horror R:562:0xC4:0x85 # Cave bear R:563:0xB0:0x82 # Grizzly bear R:564:0xBF:0x83 # Werebear R:565:0xB1:0x96 # Beorn, the Shape-Changer R:566:0xA1:0x92 # Barbazu R:567:0xB2:0x9D # Bile Demon R:568:0xB1:0x9F # Osyluth R:569:0xB2:0x8E # Gelugon R:570:0xB2:0x8B # Horned Reaper R:571:0xB2:0x81 # Pit Fiend R:572:0xB2:0x9F # Greater Balrog R:573:0xB2:0x9E # Baby bronze dragon R:574:0xB0:0x89 # Baby gold dragon R:575:0xB0:0x8A # Great Swamp Wyrm R:576:0x8F:0x9A # Great Wyrm of Perplexity R:577:0xB1:0x8C # Great Bile Wyrm R:578:0x8F:0x9F # Great Wyrm of Thunder R:579:0xB1:0x8D # Ranger R:580:0x9C:0x83 # Paladin R:581:0x8D:0x9C # Ranger Chieftain R:582:0xB1:0x99 # Berserker R:583:0xBF:0x92 # Cyclops R:584:0xC0:0x97 # Polyphemus, the Blind Cyclops R:585:0xC6:0x92 # Atlas, the Titan R:586:0xC6:0x9C # Kronos, Lord of the Titans R:587:0xC6:0x9D # Evil eye R:588:0xB0:0x8B # Spectator R:589:0xA0:0x85 # Gauth R:590:0xC5:0x8D # Beholder hive-mother R:591:0xC3:0x8C # Neekerbreeker R:592:0xBE:0x86 # Giant firefly R:593:0xB0:0x8D # Eol, the Dark Elf R:594:0xB2:0x8A # Maeglin, the Traitor of Gondolin R:595:0xA1:0x9C # Elder vampire R:596:0xA1:0x9F # Silent watcher R:597:0xA0:0x9A # Nighthawk R:598:0xC7:0x83 # Ghoul R:599:0xBB:0x8C # Ghast R:600:0xBF:0x9C # Greater basilisk R:601:0xC2:0x83 # Aranea R:602:0xB0:0x80 # Elder aranea R:603:0xB0:0x81 # Kobold shaman R:604:0xC7:0x81 # Bat of Gorgoroth R:605:0xC6:0x94 # Doombat R:606:0xC1:0x80 # Wolf chieftain R:607:0xBE:0x8E # Bone golem R:608:0xB1:0x92 # Bronze golem R:609:0xB1:0x93 # Ogre chieftain R:610:0xB0:0x9E # Ar-Pharazon the Golden R:611:0xA1:0x9B # Troll chieftain R:612:0xC7:0x82 # Shardstorm R:613:0xB0:0x9F # Storm of Unmagic R:614:0xB1:0x98 # Greater mummy R:615:0xC1:0x84 # Multi-hued hound R:616:0xA2:0x83 # Load the special player pictures %:xtra-xxx.prf # Load the flavored objects %:flvr-xxx.prf angband-v3.3.2/lib/pref/flvr-dvg.prf0000644000175000017500000002342611651552410016560 0ustar chriscchrisc# Plain Gold ring L:1:0x85:0x97 # Alexandrite ring L:2:0x85:0x84 # Amethyst ring L:3:0x85:0x89 # Aquamarine ring L:4:0x85:0x8D # Azurite ring L:5:0x85:0x8D # Beryl ring L:6:0x85:0x8C # Bloodstone ring L:7:0x85:0x83 # Calcite ring L:8:0x85:0x80 # Carnelian ring L:9:0x85:0x83 # Corundum ring L:10:0x85:0x88 # Diamond ring L:11:0x85:0x80 # Emerald ring L:12:0x85:0x84 # Fluorite ring L:13:0x85:0x8C # Garnet ring L:14:0x85:0x83 # Granite ring L:15:0x85:0x81 # Jade ring L:16:0x85:0x8C # Jasper ring L:17:0x85:0x86 # Lapis Lazuli ring L:18:0x85:0x85 # Malachite ring L:19:0x85:0x84 # Marble ring L:20:0x85:0x80 # Moonstone ring L:21:0x85:0x81 # Onyx ring L:22:0x85:0x8B # Opal ring L:23:0x85:0x81 # Pearl ring L:24:0x85:0x80 # Quartz ring L:25:0x85:0x81 # Quartzite ring L:26:0x85:0x81 # Rhodonite ring L:27:0x85:0x8B # Ruby ring L:28:0x85:0x83 # Sapphire ring L:29:0x85:0x85 # Tiger Eye ring L:30:0x85:0x8A # Topaz ring L:31:0x85:0x8A # Turquoise ring L:32:0x85:0x8D # Zircon ring L:33:0x85:0x8E # Platinum ring L:34:0x85:0x80 # Bronze ring L:35:0x85:0x8E # Gold ring L:36:0x85:0x8A # Obsidian ring L:37:0x85:0x81 # Silver ring L:38:0x85:0x81 # Tortoise Shell ring L:39:0x85:0x86 # Mithril ring L:40:0x85:0x8D # Jet ring L:41:0x85:0x81 # Engagement ring L:42:0x85:0x8A # Adamantite ring L:43:0x85:0x8C # Amber amulet L:44:0x85:0x9D # Driftwood amulet L:45:0x85:0xA4 # Coral amulet L:46:0x85:0xA7 # Agate amulet L:47:0x85:0x99 # Ivory amulet L:48:0x85:0x98 # Obsidian amulet L:49:0x85:0x9B # Bone amulet L:50:0x85:0x98 # Brass amulet L:51:0x85:0xA2 # Bronze amulet L:52:0x85:0x9F # Pewter amulet L:53:0x85:0xA0 # Tortoise Shell amulet L:54:0x85:0x9E # Golden amulet L:55:0x85:0x9C # Azure amulet L:56:0x85:0xA5 # Crystal amulet L:57:0x85:0x98 # Silver amulet L:58:0x85:0x99 # Copper amulet L:59:0x85:0xA2 # Carved Oak amulet L:60:0x85:0xA7 # Dragon Tooth amulet L:61:0x85:0x98 # Ruby amulet L:62:0x85:0x9F # Mithril amulet L:63:0x85:0xA5 # Adamant amulet L:64:0x85:0xA2 # Flint Stone amulet L:65:0x85:0x9A # Sea Shell amulet L:66:0x85:0xA5 # Mother-of-Pearl amulet L:67:0x85:0x99 # Aspen staff L:68:0x89:0x93 # Balsa staff L:69:0x89:0x93 # Banyan staff L:70:0x89:0x94 # Birch staff L:71:0x89:0x92 # Cedar staff L:72:0x89:0x96 # Cottonwood staff L:73:0x89:0x95 # Cypress staff L:74:0x89:0x96 # Dogwood staff L:75:0x89:0x98 # Elm staff L:76:0x89:0x96 # Eucalyptus staff L:77:0x89:0x98 # Hemlock staff L:78:0x89:0x94 # Hickory staff L:79:0x89:0x96 # Ironwood staff L:80:0x89:0x95 # Locust staff L:81:0x89:0x94 # Mahogany staff L:82:0x89:0x94 # Maple staff L:83:0x89:0x96 # Mulberry staff L:84:0x89:0x94 # Oak staff L:85:0x89:0x94 # Pine staff L:86:0x89:0x98 # Redwood staff L:87:0x89:0x94 # Rosewood staff L:88:0x89:0x92 # Spruce staff L:89:0x89:0x92 # Sycamore staff L:90:0x89:0x93 # Teak staff L:91:0x89:0x92 # Walnut staff L:92:0x89:0x93 # Mistletoe staff L:93:0x89:0x96 # Hawthorn staff L:94:0x89:0x94 # Bamboo staff L:95:0x89:0x98 # Silver staff L:96:0x89:0x97 # Runed staff L:97:0x89:0x98 # Golden staff L:98:0x89:0x93 # Ashen staff L:99:0x89:0x95 # Gnarled staff L:100:0x89:0x93 # Ivory staff L:101:0x89:0x96 # Willow staff L:102:0x89:0x95 # Aluminium wand L:103:0x89:0x80 # Cast Iron wand L:104:0x89:0x86 # Chromium wand L:105:0x89:0x87 # Copper wand L:106:0x89:0x86 # Gold wand L:107:0x89:0x88 # Iron wand L:108:0x89:0x85 # Magnesium wand L:109:0x89:0x88 # Molybdenum wand L:110:0x89:0x87 # Nickel wand L:111:0x89:0x84 # Rusty wand L:112:0x89:0x85 # Silver wand L:113:0x89:0x80 # Steel wand L:114:0x89:0x81 # Tin wand L:115:0x89:0x81 # Titanium wand L:116:0x89:0x86 # Tungsten wand L:117:0x89:0x86 # Zirconium wand L:118:0x89:0x87 # Zinc wand L:119:0x89:0x84 # Aluminum-Plated wand L:120:0x89:0x8B # Copper-Plated wand L:121:0x89:0x8E # Gold-Plated wand L:122:0x89:0x91 # Nickel-Plated wand L:123:0x89:0x8D # Silver-Plated wand L:124:0x89:0x8A # Steel-Plated wand L:125:0x89:0x8C # Tin-Plated wand L:126:0x89:0x91 # Zinc-Plated wand L:127:0x89:0x8F # Mithril-Plated wand L:128:0x89:0x8D # Mithril wand L:129:0x89:0x90 # Runed wand L:130:0x89:0x8B # Bronze wand L:131:0x89:0x8E # Brass wand L:132:0x89:0x8F # Platinum wand L:133:0x89:0x8D # Lead wand L:134:0x89:0x8E # Lead-Plated wand L:135:0x89:0x8F # Ivory wand L:136:0x89:0x91 # Pewter wand L:137:0x89:0x8D # Aluminum rod L:138:0x89:0x8D # Cast Iron rod L:139:0x89:0x8A # Chromium rod L:140:0x89:0x8A # Copper rod L:141:0x89:0x8A # Gold rod L:142:0x89:0x91 # Iron rod L:143:0x89:0x8F # Magnesium rod L:144:0x89:0x8D # Molybdenum rod L:145:0x89:0x90 # Nickel rod L:146:0x89:0x8E # Rusty rod L:147:0x89:0x8C # Silver rod L:148:0x89:0x89 # Steel rod L:149:0x89:0x8D # Tin rod L:150:0x89:0x90 # Titanium rod L:151:0x89:0x8B # Tungsten rod L:152:0x89:0x8B # Zirconium rod L:153:0x89:0x8B # Zinc rod L:154:0x89:0x8E # Aluminum-Plated rod L:155:0x89:0x8D # Copper-Plated rod L:156:0x89:0x8E # Gold-Plated rod L:157:0x89:0x8A # Nickel-Plated rod L:158:0x89:0x8E # Silver-Plated rod L:159:0x89:0x8D # Steel-Plated rod L:160:0x89:0x8A # Tin-Plated rod L:161:0x89:0x89 # Zinc-Plated rod L:162:0x89:0x8C # Mithril-Plated rod L:163:0x89:0x90 # Mithril rod L:164:0x89:0x90 # Runed rod L:165:0x89:0x8A # Bronze rod L:166:0x89:0x8E # Brass rod L:167:0x89:0x8F # Platinum rod L:168:0x89:0x8D # Lead rod L:169:0x89:0x8C # Lead-Plated rod L:170:0x89:0x8F # Ivory rod L:171:0x89:0x91 # Pewter rod L:172:0x89:0x8F # Blue mushroom L:173:0x82:0x8D # Black mushroom L:174:0x82:0x87 # Black Spotted mushroom L:175:0x82:0x8F # Brown mushroom L:176:0x82:0x97 # Dark Blue mushroom L:177:0x82:0x8D # Dark Green mushroom L:178:0x82:0x8C # Dark Red mushroom L:179:0x82:0x8B # Yellow mushroom L:180:0x82:0x92 # Furry mushroom L:181:0x82:0x90 # Green mushroom L:182:0x82:0x95 # Grey mushroom L:183:0x82:0x89 # Light Blue mushroom L:184:0x82:0x96 # Light Green mushroom L:185:0x82:0x95 # Violet mushroom L:186:0x82:0x91 # Red mushroom L:187:0x82:0x94 # Slimy mushroom L:188:0x82:0x8A # Tan mushroom L:189:0x82:0x97 # White mushroom L:190:0x82:0x88 # White Spotted mushroom L:191:0x82:0x90 # Wrinkled mushroom L:192:0x82:0x8E # Clear potion L:193:0x88:0x9A # Light Brown potion L:194:0x88:0x8D # Icky Green potion L:195:0x88:0x91 # Azure potion L:196:0x88:0x84 # Blue potion L:197:0x88:0x85 # Blue Speckled potion L:198:0x88:0x86 # Black potion L:199:0x88:0x80 # Brown potion L:200:0x88:0x88 # Brown Speckled potion L:201:0x88:0xA3 # Bubbling potion L:202:0x88:0xB8 # Chartreuse potion L:203:0x88:0x91 # Cloudy potion L:204:0x88:0x80 # Copper Speckled potion L:205:0x88:0x93 # Crimson potion L:206:0x88:0x92 # Cyan potion L:207:0x88:0x84 # Dark Blue potion L:208:0x88:0x8F # Dark Green potion L:209:0x88:0x91 # Dark Red potion L:210:0x88:0x9E # Gold Speckled potion L:211:0x88:0xB1 # Green potion L:212:0x88:0x95 # Green Speckled potion L:213:0x88:0x9B # Grey potion L:214:0x88:0x98 # Grey Speckled potion L:215:0x88:0xB0 # Hazy potion L:216:0x88:0x82 # Indigo potion L:217:0x88:0xAE # Light Blue potion L:218:0x88:0x9A # Light Green potion L:219:0x88:0x95 # Magenta potion L:220:0x88:0xA9 # Metallic Blue potion L:221:0x88:0x85 # Metallic Red potion L:222:0x88:0x9C # Metallic Green potion L:223:0x88:0x9F # Metallic Purple potion L:224:0x88:0xA0 # Misty potion L:225:0x88:0xA1 # Orange potion L:226:0x88:0x8D # Orange Speckled potion L:227:0x88:0xA3 # Pink potion L:228:0x88:0xA5 # Pink Speckled potion L:229:0x88:0xB5 # Puce potion L:230:0x88:0xA8 # Purple potion L:231:0x88:0xA7 # Purple Speckled potion L:232:0x88:0xA8 # Red potion L:233:0x88:0xB9 # Red Speckled potion L:234:0x88:0xA9 # Silver Speckled potion L:235:0x88:0xB0 # Smoky potion L:236:0x88:0x97 # Tangerine potion L:237:0x88:0x83 # Violet potion L:238:0x88:0xA0 # Vermilion potion L:239:0x88:0xAF # White potion L:240:0x88:0xB0 # Yellow potion L:241:0x88:0xBA # Violet Speckled potion L:242:0x88:0xAE # Pungent potion L:243:0x88:0x8D # Clotted Red potion L:244:0x88:0x83 # Viscous Pink potion L:245:0x88:0xA4 # Oily Yellow potion L:246:0x88:0x8B # Gloopy Green potion L:247:0x88:0x91 # Shimmering potion L:248:0x88:0xAE # Coagulated Crimson potion L:249:0x88:0x92 # Yellow Speckled potion L:250:0x88:0xB1 # Gold potion L:251:0x88:0xBA # Scroll L:252:0x87:0x92 # Scroll L:253:0x87:0x92 # Scroll L:254:0x87:0x92 # Scroll L:255:0x87:0x92 # Scroll L:256:0x87:0x92 # Scroll L:257:0x87:0x92 # Scroll L:258:0x87:0x92 # Scroll L:259:0x87:0x92 # Scroll L:260:0x87:0x92 # Scroll L:261:0x87:0x92 # Scroll L:262:0x87:0x92 # Scroll L:263:0x87:0x92 # Scroll L:264:0x87:0x92 # Scroll L:265:0x87:0x93 # Scroll L:266:0x87:0x93 # Scroll L:267:0x87:0x93 # Scroll L:268:0x87:0x93 # Scroll L:269:0x87:0x93 # Scroll L:270:0x87:0x93 # Scroll L:271:0x87:0x93 # Scroll L:272:0x87:0x93 # Scroll L:273:0x87:0x93 # Scroll L:274:0x87:0x93 # Scroll L:275:0x87:0x93 # Scroll L:276:0x87:0x93 # Scroll L:277:0x87:0x94 # Scroll L:278:0x87:0x94 # Scroll L:279:0x87:0x94 # Scroll L:280:0x87:0x94 # Scroll L:281:0x87:0x94 # Scroll L:282:0x87:0x94 # Scroll L:283:0x87:0x94 # Scroll L:284:0x87:0x94 # Scroll L:285:0x87:0x94 # Scroll L:286:0x87:0x94 # Scroll L:287:0x87:0x94 # Scroll L:288:0x87:0x94 # Scroll L:289:0x87:0x95 # Scroll L:290:0x87:0x95 # Scroll L:291:0x87:0x95 # Scroll L:292:0x87:0x95 # Scroll L:293:0x87:0x95 # Scroll L:294:0x87:0x95 # Scroll L:295:0x87:0x95 # Scroll L:296:0x87:0x95 # Scroll L:297:0x87:0x95 # Scroll L:298:0x87:0x95 # Scroll L:299:0x87:0x95 # Scroll L:300:0x87:0x95 # Scroll L:301:0x87:0x95 # Scroll L:302:0x87:0x95 # Ceremonial Rod L:303:0x89:0x8A # Black Rod L:304:0x89:0x8C # Red Rod L:305:0x89:0x8F # Green Rod L:306:0x89:0x8B # Blue Rod L:307:0x89:0x90 # Divining Rod L:308:0x89:0x8E # White Rod L:309:0x89:0x8D # Lightning Rod L:310:0x89:0x91 # Switch Rod L:311:0x89:0x8E # Transparent Rod L:312:0x89:0x89 angband-v3.3.2/lib/pref/graf-nmd.prf0000644000175000017500000011472611651552410016530 0ustar chriscchrisc# File: graf-nmd.prf # This file defines special attr/char mappings for use in "graphics" mode # with the 16x16 fake ASCII tile set (intended to display at 8x16). # # Adapted by Nomad from the graf-new.prf file for Adam Bolt's tiles, # by Robert Ruehlmann # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Feature attr/char definitions ##### # nothing (2 tiles) F:0:all:0x80:0x80 # open floor (3 tiles) (+ invisible trap) F:1:bright:0x80:0x84 F:1:lit:0x80:0x82 F:1:dark:0x80:0x83 # glyph of warding F:3:all:0x80:0x9A # open door F:4:all:0x80:0x9D # broken door F:5:all:0x80:0x9E # up staircase F:6:all:0x80:0x94 # down staircase F:7:all:0x80:0x96 # General Store F:8:all:0x81:0x98 # Armoury F:9:all:0x81:0x99 # Weapon Smith's F:10:all:0x81:0x9A # Temple F:11:all:0x81:0x9B # Alchemy Shop F:12:all:0x81:0x9C # Magic Shop F:13:all:0x81:0x9D # Black Market F:14:all:0x81:0x9E # Home F:15:all:0x81:0x9F # visible trap -- trap door (3 tiles) F:16:bright:0x81:0x8E F:16:lit:0x81:0x8C F:16:dark:0x81:0x8D # visible trap -- open pit (3 tiles) F:17:bright:0x81:0x8B F:17:lit:0x81:0x89 F:17:dark:0x81:0x8A # visible trap -- spiked pit (3 tiles) F:18:bright:0x81:0x8B F:18:lit:0x81:0x89 F:18:dark:0x81:0x8A # visible trap -- poison pit (3 tiles) F:19:bright:0x81:0x8B F:19:lit:0x81:0x89 F:19:dark:0x81:0x8A # visible trap -- rune -- summon (3 tiles) F:20:bright:0x81:0x91 F:20:lit:0x81:0x8F F:20:dark:0x81:0x90 # visible trap -- rune -- teleport (3 tiles) F:21:bright:0x81:0x94 F:21:lit:0x81:0x92 F:21:dark:0x81:0x93 # visible trap -- spot -- fire (3 tiles) F:22:bright:0x81:0x88 F:22:lit:0x81:0x86 F:22:dark:0x81:0x87 # visible trap -- spot -- acid (3 tiles) F:23:bright:0x81:0x88 F:23:lit:0x81:0x86 F:23:dark:0x81:0x87 # visible trap -- dart -- slow (3 tiles) F:24:bright:0x81:0x82 F:24:lit:0x81:0x80 F:24:dark:0x81:0x81 # visible trap -- dart -- lose str (3 tiles) F:25:bright:0x81:0x82 F:25:lit:0x81:0x80 F:25:dark:0x81:0x81 # visible trap -- dart -- lose dex (3 tiles) F:26:bright:0x81:0x82 F:26:lit:0x81:0x80 F:26:dark:0x81:0x81 # visible trap -- dart -- lose con (3 tiles) F:27:bright:0x81:0x82 F:27:lit:0x81:0x80 F:27:dark:0x81:0x81 # visible trap -- gas -- blind (3 tiles) F:28:bright:0x81:0x85 F:28:lit:0x81:0x83 F:28:dark:0x81:0x84 # visible trap -- gas -- confuse (3 tiles) F:29:bright:0x81:0x85 F:29:lit:0x81:0x83 F:29:dark:0x81:0x84 # visible trap -- gas -- poison (3 tiles) F:30:bright:0x81:0x85 F:30:lit:0x81:0x83 F:30:dark:0x81:0x84 # visible trap -- gas -- sleep (3 tiles) F:31:bright:0x81:0x85 F:31:lit:0x81:0x83 F:31:dark:0x81:0x84 # doors (+ locked doors + jammed doors) F:32:all:0x80:0x9C # rubble F:49:all:0x80:0x98 # magma vein (3 tiles) (+ w/ hidden treasure) F:50:bright:0x80:0x8E F:50:lit:0x80:0x8C F:50:dark:0x80:0x8D # quartz vein (3 tiles) (+ w/ hidden treasure) F:51:bright:0x80:0x8A F:51:lit:0x80:0x88 F:51:dark:0x80:0x89 # magma vein with treasure F:54:all:0x80:0x8F # quartz vein with treasure F:55:all:0x80:0x8B # granite wall(s) (3 tiles) F:56:bright:0x80:0x87 F:56:lit:0x80:0x85 F:56:dark:0x80:0x86 # permanent wall(s) (3 tiles) F:60:bright:0x80:0x92 F:60:lit:0x80:0x90 F:60:dark:0x80:0x91 ##### Object attr/char definitions ##### ##### Non-kind (contains the "pile" picture) ##### # Pile K:0:0:129:151 ##### Various Stuff ##### K:light:Wooden Torch~:0x89:0x80 K:light:Lantern~:0x89:0x81 K:flask:Flask~ of oil:0x89:0x83 K:spike:Iron Spike~:0x89:0x94 ##### Food ##### ### Normal Food ### K:food:Ration~ of Food:0x89:0x88 K:food:Slime Mold~:0x89:0x89 K:food:Piece~ of Elvish Waybread:0x89:0x8A ### The shrooms, an interesting collection ### # Graphics are sourced from flavor entries in flvr-new.prf ##### Weapons ##### ### Swords ### K:sword:Bastard Sword~:0x8D:0x80 K:sword:Blade~ of Chaos:0x8D:0x81 K:sword:Broad Sword~:0x8D:0x82 K:sword:Cutlass~:0x8D:0x83 K:sword:Dagger~:0x8D:0x84 K:sword:Executioner's Sword~:0x8D:0x85 K:sword:Katana~:0x8D:0x86 K:sword:Long Sword~:0x8D:0x87 K:sword:Main Gauche~:0x8D:0x88 K:sword:Rapier~:0x8D:0x89 K:sword:Scimitar~:0x8D:0x8A K:sword:Short Sword~:0x8D:0x8B K:sword:Tulwar~:0x8D:0x8C K:sword:Zweihander~:0x8D:0x8D ### Hafted Weapons ### K:hafted:Ball-and-Chain~:0x8F:0x80 K:hafted:Flail~:0x8F:0x81 K:hafted:Great Hammer~:0x8F:0x82 K:hafted:Lead-Filled Mace~:0x8F:0x83 K:hafted:Mace~:0x8F:0x84 K:hafted:Mace~ of Disruption:0x8F:0x85 K:hafted:Maul~:0x8F:0x86 K:hafted:Morning Star~:0x8F:0x87 K:hafted:Quarterstaff~:0x8F:0x88 K:hafted:Two-Handed Great Flail~:0x8F:0x89 K:hafted:War Hammer~:0x8F:0x8A K:hafted:Whip~:0x8F:0x8B ### Polearms ### K:polearm:Awl-Pike~:0x8E:0x80 K:polearm:Battle Axe~:0x8E:0x81 K:polearm:Beaked Axe~:0x8E:0x82 K:polearm:Broad Axe~:0x8E:0x83 K:polearm:Glaive~:0x8E:0x84 K:polearm:Great Axe~:0x8E:0x85 K:polearm:Halberd~:0x8E:0x86 K:polearm:Lance~:0x8E:0x87 K:polearm:Lochaber Axe~:0x8E:0x88 K:polearm:Lucerne Hammer~:0x8E:0x89 K:polearm:Pike~:0x8E:0x8A K:polearm:Scythe~:0x8E:0x8B K:polearm:Scythe~ of Slicing:0x8E:0x8C K:polearm:Spear~:0x8E:0x8D K:polearm:Trident~:0x8E:0x8E ##### Bows, Crossbows, Slings ##### K:bow:Heavy Crossbow~:0x90:0x80 K:bow:Light Crossbow~:0x90:0x81 K:bow:Long Bow~:0x90:0x82 K:bow:Short Bow~:0x90:0x83 K:bow:Sling~:0x90:0x84 ##### Missiles ##### K:arrow:Arrow~:0x90:0x90 K:bolt:Bolt~:0x90:0x91 K:shot:Iron Shot~:0x90:0x92 K:arrow:Mithril Arrow~:0x90:0x93 K:bolt:Mithril Bolt~:0x90:0x94 K:shot:Mithril Shot~:0x90:0x95 K:shot:Rounded Pebble~:0x90:0x96 K:arrow:Seeker Arrow~:0x90:0x97 K:bolt:Seeker Bolt~:0x90:0x98 ##### Digging Tools ##### K:digger:Mattock~:0x89:0x90 K:digger:Pick~:0x89:0x91 K:digger:Shovel~:0x89:0x92 ### Body armours ### K:soft armor:Robe~:0x95:0x80 K:soft armor:Hard Leather Armour~:0x95:0x81 K:soft armor:Leather Scale Mail~:0x95:0x82 K:soft armor:Soft Leather Armour~:0x95:0x83 K:soft armor:Studded Leather Armour~:0x95:0x84 K:hard armor:Adamantite Plate Mail~:0x95:0x90 K:hard armor:Augmented Chain Mail~:0x95:0x91 K:hard armor:Bar Chain Mail~:0x95:0x92 K:hard armor:Chain Mail~:0x95:0x93 K:hard armor:Full Plate Armour~:0x95:0x94 K:hard armor:Metal Brigandine Armour~:0x95:0x95 K:hard armor:Metal Lamellar Armour~:0x95:0x96 K:hard armor:Metal Scale Mail~:0x95:0x97 K:hard armor:Mithril Chain Mail~:0x95:0x98 K:hard armor:Mithril Plate Mail~:0x95:0x99 K:hard armor:Partial Plate Armour~:0x95:0x9A K:hard armor:Ribbed Plate Armour~:0x95:0x9B ### The Cloaks ### K:cloak:Cloak~:0x94:0x80 K:cloak:Elven Cloak~:0x94:0x81 K:cloak:Ethereal Cloak~:0x94:0x82 K:cloak:Fur Cloak~:0x94:0x83 ### The Shields ### #K:shield:Buckler~:0x92:0x80 K:shield:Large Metal Shield~:0x92:0x81 K:shield:Leather Shield~:0x92:0x82 K:shield:Mithril Shield~:0x92:0x83 K:shield:Small Metal Shield~:0x92:0x84 K:shield:Wicker Shield~:0x92:0x85 ### Headgear ### K:helm:Hard Leather Cap~:0x92:0x90 K:helm:Iron Helm~:0x92:0x91 K:helm:Metal Cap~:0x92:0x92 K:helm:Steel Helm~:0x92:0x93 K:crown:Golden Crown~:0x92:0x98 K:crown:Iron Crown~:0x92:0x99 K:crown:Jewel Encrusted Crown~:0x92:0x9A ### The Gloves ### K:gloves:Set~ of Alchemist's Gloves:0x93:0x80 K:gloves:Set~ of Caestus:0x93:0x81 K:gloves:Set~ of Gauntlets:0x93:0x82 K:gloves:Set~ of Leather Gloves:0x93:0x83 #K:gloves:Set~ of Mining Gloves:0x93:0x84 K:gloves:Set~ of Mithril Gauntlets:0x93:0x85 ##### The Boots ##### K:boots:Pair~ of Ethereal Slippers:0x93:0x90 K:boots:Pair~ of Iron Shod Boots:0x93:0x91 K:boots:Pair~ of Leather Boots:0x93:0x92 K:boots:Pair~ of Leather Sandals:0x93:0x93 K:boots:Pair~ of Mithril Shod Boots:0x93:0x94 K:boots:Pair~ of Steel Shod Boots:0x93:0x95 ##### Rings ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Amulets ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Scrolls ##### ### Teleportation ### K:scroll:Phase Door:0x87:0x91 K:scroll:Teleportation:0x87:0x91 K:scroll:Teleport Level:0x87:0x91 ### Detection ### K:scroll:Magic Mapping:0x87:0x91 K:scroll:Treasure Detection:0x87:0x91 K:scroll:Trap Detection:0x87:0x91 K:scroll:Door/Stair Location:0x87:0x91 K:scroll:Detect Invisible:0x87:0x91 ### Enchantments ### K:scroll:Enchant Weapon To-Hit:0x87:0x91 K:scroll:Enchant Weapon To-Dam:0x87:0x91 K:scroll:Enchant Armour:0x87:0x91 K:scroll:*Enchant Weapon*:0x87:0x91 K:scroll:*Enchant Armour*:0x87:0x91 K:scroll:Remove Curse:0x87:0x91 K:scroll:*Remove Curse*:0x87:0x91 ### Summoning ### K:scroll:Summon Monster:0x87:0x91 K:scroll:Summon Undead:0x87:0x91 K:scroll:Acquirement:0x87:0x91 K:scroll:*Acquirement*:0x87:0x91 ### Killing scrolls ### K:scroll:Dispel Undead:0x87:0x91 K:scroll:Banishment:0x87:0x91 K:scroll:Mass Banishment:0x87:0x91 ### Utility ### K:scroll:Satisfy Hunger:0x87:0x91 K:scroll:Identify:0x87:0x91 K:scroll:Light:0x87:0x91 K:scroll:Word of Recall:0x87:0x91 K:scroll:Recharging:0x87:0x91 K:scroll:Trap/Door Destruction:0x87:0x91 K:scroll:Deep Descent:0x87:0x91 ### "Holy" spells ### K:scroll:Blessing:0x87:0x91 K:scroll:Holy Chant:0x87:0x91 K:scroll:Holy Prayer:0x87:0x91 K:scroll:Protection from Evil:0x87:0x91 ### Misc. ### K:scroll:Monster Confusion:0x87:0x91 K:scroll:Rune of Protection:0x87:0x91 K:scroll:*Destruction*:0x87:0x91 ### Bad scrolls ### K:scroll:Aggravate Monster:0x87:0x91 K:scroll:Curse Weapon:0x87:0x91 K:scroll:Curse Armour:0x87:0x91 K:scroll:Darkness:0x87:0x91 K:scroll:Trap Creation:0x87:0x91 ##### Potions ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Wands ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Staffs ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Rods ##### # Graphics are sourced from flavor entries in flvr-new.prf ##### Basic Books ##### K:magic book:[Magic for Beginners]:0x88:0x90 K:magic book:[Conjurings and Tricks]:0x88:0x91 K:magic book:[Incantations and Illusions]:0x88:0x92 K:magic book:[Sorcery and Evocations]:0x88:0x93 K:prayer book:[Beginners Handbook]:0x88:0x80 K:prayer book:[Words of Wisdom]:0x88:0x81 K:prayer book:[Chants and Blessings]:0x88:0x82 K:prayer book:[Exorcism and Dispelling]:0x88:0x83 ##### Special Books (note resistances) ##### K:magic book:[Resistances of Scarabtarices]:0x88:0x94 K:magic book:[Raal's Tome of Destruction]:0x88:0x95 K:magic book:[Mordenkainen's Escapes]:0x88:0x96 K:magic book:[Tenser's Transformations]:0x88:0x97 K:magic book:[Kelek's Grimoire of Power]:0x88:0x98 K:prayer book:[Ethereal Openings]:0x88:0x84 K:prayer book:[Godly Insights]:0x88:0x85 K:prayer book:[Purifications and Healing]:0x88:0x86 K:prayer book:[Holy Infusions]:0x88:0x87 K:prayer book:[Wrath of God]:0x88:0x88 ##### Chests ##### K:chest:Small wooden chest~:0x83:0x90 K:chest:Large wooden chest~:0x83:0x91 K:chest:Small iron chest~:0x83:0x92 K:chest:Large iron chest~:0x83:0x93 K:chest:Small steel chest~:0x83:0x94 K:chest:Large steel chest~:0x83:0x95 ##### Junk ##### K:bottle:Empty Bottle~:0x8A:0x90 K:junk:Shard~ of Pottery:0x8A:0x91 K:junk:Broken Stick~:0x8A:0x92 K:skeleton:Broken Skull~:0x8A:0x93 K:skeleton:Broken Bone~:0x8A:0x93 K:skeleton:Canine Skeleton~:0x8A:0x93 K:skeleton:Rodent Skeleton~:0x8A:0x93 K:skeleton:Human Skeleton~:0x8A:0x93 K:skeleton:Dwarf Skeleton~:0x8A:0x93 K:skeleton:Elf Skeleton~:0x8A:0x93 ##### Dragon Scale Mail ##### K:dragon armor:Black Dragon Scale Mail~:0x94:0x90 K:dragon armor:Blue Dragon Scale Mail~:0x94:0x91 K:dragon armor:White Dragon Scale Mail~:0x94:0x92 K:dragon armor:Red Dragon Scale Mail~:0x94:0x93 K:dragon armor:Green Dragon Scale Mail~:0x94:0x94 K:dragon armor:Multi-Hued Dragon Scale Mail~:0x94:0x95 K:dragon armor:Pseudo-Dragon Scale Mail~:0x94:0x96 K:dragon armor:Law Dragon Scale Mail~:0x94:0x97 K:dragon armor:Bronze Dragon Scale Mail~:0x94:0x98 K:dragon armor:Gold Dragon Scale Mail~:0x94:0x99 K:dragon armor:Chaos Dragon Scale Mail~:0x94:0x9A K:dragon armor:Balance Dragon Scale Mail~:0x94:0x9B K:dragon armor:Power Dragon Scale Mail~:0x94:0x9C ##### Gold/gems ##### K:gold:copper:0x83:0x80 K:gold:silver:0x83:0x81 K:gold:gold:0x83:0x82 K:gold:mithril:0x83:0x83 K:gold:adamantite:0x83:0x84 K:gold:garnets:0x83:0x85 K:gold:opals:0x83:0x86 K:gold:sapphires:0x83:0x87 K:gold:rubies:0x83:0x88 K:gold:diamonds:0x83:0x89 K:gold:emeralds:0x83:0x8A ##### "Morgoth Artifacts" ##### K:hafted:Mighty Hammer~:0x8A:0x88 K:crown:Massive Iron Crown~:0x8A:0x89 ##### "Special Artifacts" ##### # These artifacts use numeric SVALs to ensure unique matches # The Phial of Galadriel K:light:4:0x8A:0x80 # The Star of Elendil K:light:5:0x8A:0x81 # The Arkenstone of Thrain K:light:6:0x8A:0x82 # The Palantir of Westernesse K:light:7:0x8A:0x83 # These settings currently overridden by flavor graphics: # The Amulet of Carlammas K:amulet:50:0x84:0x9E # The Amulet of Ingwe K:amulet:51:0x84:0x96 # The Necklace of the Dwarves K:amulet:52:0x84:0x91 # The Jewel 'Evenstar' K:amulet:54:0x84:0x90 # The Elfstone 'Elessar' K:amulet:53:0x84:0x9C # The Ring of Barahir K:ring:50:0x84:0x83 # The Ring of Tulkas #K:ring:51:0x84:0x84 # The Ring of Power 'Narya' #K:ring:52:0x84:0x85 # The Ring of Power 'Nenya' #K:ring:53:0x84:0x89 # The Ring of Power 'Vilya' #K:ring:54:0x84:0x8B # The Ring of Power 'The One Ring' K:ring:55:0x84:0x8A ##### Spell attr/char values ##### GF:*:0:0x97:0x84 GF:*:135:0x97:0x87 GF:*:45:0x97:0x86 GF:*:90:0x97:0x85 GF:*:static:0x99:0x89 GF:ELEC:0:0x97:0x98 GF:ELEC:135:0x97:0x9B GF:ELEC:45:0x97:0x9A GF:ELEC:90:0x97:0x99 GF:ELEC:static:0x99:0x8E GF:POIS:0:0x97:0x94 GF:POIS:135:0x97:0x97 GF:POIS:45:0x97:0x96 GF:POIS:90:0x97:0x95 GF:POIS:static:0x99:0x8D GF:TIME:0:0x98:0x98 GF:TIME:135:0x98:0x9B GF:TIME:45:0x98:0x9A GF:TIME:90:0x98:0x99 GF:TIME:static:0x99:0x96 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:0:0x98:0x84 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:135:0x98:0x87 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:45:0x98:0x86 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:90:0x98:0x85 GF:DARK | DARK_WEAK | HOLY_ORB | MANA:static:0x99:0x91 GF:NETHER:0:0x98:0x94 GF:NETHER:135:0x98:0x97 GF:NETHER:45:0x98:0x96 GF:NETHER:90:0x98:0x95 GF:NETHER:static:0x99:0x95 GF:CHAOS | DISEN | MISSILE:0:0x98:0x88 GF:CHAOS | DISEN | MISSILE:135:0x98:0x8B GF:CHAOS | DISEN | MISSILE:45:0x98:0x8A GF:CHAOS | DISEN | MISSILE:90:0x98:0x89 GF:CHAOS | DISEN | MISSILE:static:0x99:0x92 GF:NEXUS:0:0x98:0x90 GF:NEXUS:135:0x98:0x93 GF:NEXUS:45:0x98:0x92 GF:NEXUS:90:0x98:0x91 GF:NEXUS:static:0x99:0x94 GF:CONFU:0:0x98:0x9C GF:CONFU:135:0x98:0x9F GF:CONFU:45:0x98:0x9E GF:CONFU:90:0x98:0x9D GF:CONFU:static:0x99:0x97 GF:GRAVITY | INERTIA:0:0x97:0x84 GF:GRAVITY | INERTIA:135:0x97:0x87 GF:GRAVITY | INERTIA:45:0x97:0x86 GF:GRAVITY | INERTIA:90:0x97:0x85 GF:GRAVITY | INERTIA:static:0x99:0x89 GF:LIGHT | LIGHT_WEAK:0:0x97:0x8C GF:LIGHT | LIGHT_WEAK:135:0x97:0x8F GF:LIGHT | LIGHT_WEAK:45:0x97:0x8E GF:LIGHT | LIGHT_WEAK:90:0x97:0x8D GF:LIGHT | LIGHT_WEAK:static:0x99:0x8B GF:FIRE | METEOR | PLASMA:0:0x97:0x90 GF:FIRE | METEOR | PLASMA:135:0x97:0x93 GF:FIRE | METEOR | PLASMA:45:0x97:0x92 GF:FIRE | METEOR | PLASMA:90:0x97:0x91 GF:FIRE | METEOR | PLASMA:static:0x99:0x8C GF:ACID | WATER:0:0x97:0x88 GF:ACID | WATER:135:0x97:0x8B GF:ACID | WATER:45:0x97:0x8A GF:ACID | WATER:90:0x97:0x89 GF:ACID | WATER:static:0x99:0x8A GF:FORCE | SHARD:0:0x97:0x9C GF:FORCE | SHARD:135:0x97:0x9F GF:FORCE | SHARD:45:0x97:0x9E GF:FORCE | SHARD:90:0x97:0x9D GF:FORCE | SHARD:static:0x99:0x8F GF:SOUND:0:0x98:0x8C GF:SOUND:135:0x98:0x8F GF:SOUND:45:0x98:0x8E GF:SOUND:90:0x98:0x8D GF:SOUND:static:0x99:0x93 ##### Monster attr/char definitions ##### # player R:0:0x92:0x80 # filthy street urchin R:1:0xB1:0x94 # scrawny cat R:2:0xA5:0x96 # scruffy little dog R:3:0xA1:0x92 # farmer maggot R:4:0xA7:0x8C # blubbering idiot R:5:0xB1:0x96 # boil-covered wretch R:6:0xB1:0x95 # village idiot R:7:0xB1:0x9C # pitiful-looking beggar R:8:0xB1:0x99 # mangy-looking leper R:9:0xB1:0x97 # squint-eyed rogue R:10:0xB1:0x9B # singing, happy drunk R:11:0xB1:0x9A # aimless-looking merchant R:12:0xB1:0x92 # mean-looking mercenary R:13:0xB1:0x98 # battle-scarred veteran R:14:0xB1:0x93 # grey mold R:15:0xAB:0x80 # grey mushroom patch R:16:0xA0:0x82 # giant yellow centipede R:17:0xA2:0x81 # giant white centipede R:18:0xA2:0x80 # white icky thing R:19:0xA8:0x8A # clear icky thing R:20:0xA8:0x89 # giant white mouse R:21:0xB0:0x80 # large brown snake R:22:0xA8:0x94 # large white snake R:23:0xA8:0x95 # small kobold R:24:0xAA:0x80 # kobold R:25:0xAA:0x81 # white worm mass R:26:0xB4:0x95 # floating eye R:27:0xA5:0x80 # rock lizard R:28:0xAF:0x95 # jackal R:29:0xA1:0x93 # soldier ant R:30:0xA0:0x95 # fruit bat R:31:0xA1:0x88 # shrieker mushroom patch R:32:0xA0:0x83 # blubbering icky thing R:33:0xA8:0x8B # metallic green centipede R:34:0xA2:0x82 # novice warrior (type 1) R:35:0xAD:0x83 # novice rogue (type 1) R:36:0xAD:0x82 # novice priest (type 1) R:37:0xAD:0x81 # novice mage (type 1) R:38:0xAD:0x80 # yellow mushroom patch R:39:0xA0:0x84 # white jelly R:40:0xA9:0x80 # giant green frog R:41:0xAF:0x96 # giant black ant R:42:0xA0:0x96 # salamander R:43:0xAF:0x97 # white harpy R:44:0xA7:0x80 # blue yeek R:45:0xB5:0x85 # grip, farmer maggot's dog R:46:0xA1:0x95 # fang, farmer maggot's dog R:47:0xA1:0x94 # green worm mass R:48:0xB4:0x96 # large yellow snake R:49:0xA8:0x96 # cave spider R:50:0xB0:0x85 # wild cat R:51:0xA5:0x97 # smeagol R:52:0xA7:0x8E # green ooze R:53:0xA9:0x81 # poltergeist R:54:0xA6:0x80 # metallic blue centipede R:55:0xA2:0x83 # giant white louse R:56:0xAA:0x91 # black naga R:57:0xAB:0x8C # spotted mushroom patch R:58:0xA0:0x85 # silver jelly R:59:0xA9:0x82 # yellow jelly R:60:0xA9:0x83 # scruffy looking hobbit R:61:0xA7:0x8D # giant white ant R:62:0xA0:0x97 # yellow mold R:63:0xAB:0x81 # metallic red centipede R:64:0xA2:0x84 # yellow worm mass R:65:0xB4:0x98 # clear worm mass R:66:0xB4:0x97 # radiation eye R:67:0xA5:0x81 # cave lizard R:68:0xAF:0x98 # novice ranger (type 1) R:69:0xAD:0x85 # novice paladin (type 1) R:70:0xAD:0x84 # blue jelly R:71:0xA9:0x84 # creeping copper coins R:72:0x83:0x80 # giant white rat R:73:0xB0:0x81 # blue worm mass R:74:0xB4:0x99 # large grey snake R:75:0xA8:0x97 # bullroarer the hobbit R:76:0xA7:0x8F # novice mage (type 2) R:77:0xAD:0x80 # green naga R:78:0xAB:0x8D # blue ooze R:79:0xA9:0x85 # green glutton ghost R:80:0xA6:0x81 # green jelly R:81:0xA9:0x86 # large kobold R:82:0xAA:0x84 # skeleton kobold R:83:0xB0:0x97 # grey icky thing R:84:0xA8:0x8C # disenchanter eye R:85:0xA5:0x82 # red worm mass R:86:0xB4:0x9A # copperhead snake R:87:0xA8:0x98 # purple mushroom patch R:88:0xA0:0x86 # novice priest (type 2) R:89:0xAD:0x81 # novice warrior (type 2) R:90:0xAD:0x83 # novice rogue (type 2) R:91:0xAD:0x82 # brown mold R:92:0xAB:0x82 # giant brown bat R:93:0xA1:0x89 # kobold archer R:94:0xAA:0x83 # creeping silver coins R:95:0x83:0x81 # snaga R:96:0xAC:0x80 # rattlesnake R:97:0xA8:0x99 # cave orc R:98:0xAC:0x81 # wood spider R:99:0xB0:0x86 # manes R:100:0xB2:0x94 # bloodshot eye R:101:0xA5:0x83 # red naga R:102:0xAB:0x8E # red jelly R:103:0xA9:0x88 # giant red frog R:104:0xAF:0x99 # green icky thing R:105:0xA8:0x8D # zombified kobold R:106:0xB6:0x80 # lost soul R:107:0xA6:0x82 # dark elf R:108:0xA7:0x90 # night lizard R:109:0xAF:0x9A # mughash the kobold lord R:110:0xAA:0x85 # wormtongue, agent of saruman R:111:0xAD:0x87 # lagduf, the snaga R:112:0xAC:0x83 # brown yeek R:113:0xB5:0x86 # novice ranger (type 2) R:114:0xAD:0x85 # giant salamander R:115:0xAF:0x9B # green mold R:116:0xAB:0x83 # skeleton orc R:117:0xB0:0x98 # novice paladin (type 2) R:118:0xAD:0x84 # lemure R:119:0xB2:0x95 # hill orc R:120:0xAC:0x82 # bandit R:121:0xAD:0x86 # yeti R:122:0xB5:0x83 # bloodshot icky thing R:123:0xA8:0x8E # giant grey rat R:124:0xB0:0x83 # black harpy R:125:0xA7:0x81 # orc shaman R:126:0xAC:0x84 # baby blue dragon R:127:0xA3:0x8B # baby white dragon R:128:0xA3:0x90 # baby green dragon R:129:0xA3:0x8E # baby black dragon R:130:0xA3:0x8A # baby red dragon R:131:0xA3:0x8F # giant red ant R:132:0xA0:0x98 # brodda, the easterling R:133:0xAD:0x88 # king cobra R:134:0xA8:0x9A # giant spider R:135:0xB0:0x87 # dark elven mage R:136:0xA7:0x92 # orfax, son of boldor R:137:0xB5:0x87 # dark elven warrior R:138:0xA7:0x91 # clear mushroom patch R:139:0xA0:0x87 # grishnakh, the hill orc R:140:0xAC:0x85 # giant white tick R:141:0xB0:0x88 # hairy mold R:142:0xAB:0x85 # disenchanter mold R:143:0xAB:0x84 # pseudo-dragon R:144:0xA3:0x91 # tengu R:145:0xB2:0x96 # creeping gold coins R:146:0x83:0x82 # wolf R:147:0xA1:0x96 # giant fruit fly R:148:0xA8:0x80 # panther R:149:0xA5:0x98 # brigand R:150:0xAD:0x89 # baby multi-hued dragon R:151:0xA3:0x92 # hippogriff R:152:0xA7:0x82 # zombified orc R:153:0xB6:0x81 # gnome mage (type 1) R:154:0xA7:0x94 # black mamba R:155:0xA8:0x9B # white wolf R:156:0xA1:0x97 # grape jelly R:157:0xA9:0x89 # nether worm mass R:158:0xB4:0x9B # golfimbul, the hill orc chief R:159:0xAC:0x86 # master yeek R:160:0xB5:0x88 # priest R:161:0xAD:0x8A # dark elven priest R:162:0xA7:0x93 # air spirit R:163:0xA4:0x8E # skeleton human R:164:0xB0:0x99 # zombified human R:165:0xB6:0x82 # tiger R:166:0xA5:0x99 # moaning spirit R:167:0xA6:0x83 # swordsman R:168:0xAD:0x8B # stegocentipede R:169:0xA2:0x85 # spotted jelly R:170:0xA9:0x8A # drider R:171:0xB0:0x89 # killer brown beetle R:172:0xA9:0x95 # boldor, king of the yeeks R:173:0xB5:0x89 # ogre R:174:0xAB:0x95 # creeping mithril coins R:175:0x83:0x83 # illusionist R:176:0xAD:0x8D # druid R:177:0xAD:0x8C # black orc R:178:0xAC:0x87 # ochre jelly R:179:0xA9:0x8B # giant flea R:180:0xA8:0x81 # ufthak of cirith ungol R:181:0xAC:0x88 # giant white dragon fly R:182:0xA5:0x8E # blue icky thing R:183:0xA8:0x8F # hill giant R:184:0xAC:0x93 # flesh golem R:185:0xA6:0x91 # warg R:186:0xA1:0x98 # giant black louse R:187:0xAA:0x92 # lurker R:188:0xA0:0x80 # wererat R:189:0xB0:0x84 # black ogre R:190:0xAB:0x96 # magic mushroom patch R:191:0xA0:0x88 # guardian naga R:192:0xAB:0x8F # light hound R:193:0xB5:0x8C # dark hound R:194:0xB5:0x8B # half-orc R:195:0xAC:0x89 # giant tarantula R:196:0xB0:0x8A # giant clear centipede R:197:0xA2:0x86 # mirkwood spider R:198:0xB0:0x8B # frost giant R:199:0xAC:0x94 # griffon R:200:0xA7:0x83 # homunculus R:201:0xB2:0x97 # gnome mage (type 2) R:202:0xA7:0x94 # clear hound R:203:0xB5:0x8A # clay golem R:204:0xA6:0x92 # umber hulk R:205:0xB5:0x80 # orc captain R:206:0xAC:0x8B # gelatinous cube R:207:0xA9:0x8C # giant green dragon fly R:208:0xA5:0x8F # fire giant R:209:0xAC:0x95 # hummerhorn R:210:0xA8:0x82 # ulfast, son of ulfang R:211:0xAD:0x8E # quasit R:212:0xB2:0x98 # imp R:213:0xB2:0x99 # forest troll R:214:0xB1:0x80 # nar, the dwarf R:215:0xA7:0x95 # 2-headed hydra R:216:0xAA:0x95 # water spirit R:217:0xA4:0x90 # giant red scorpion R:218:0xB0:0x8C # earth spirit R:219:0xA4:0x8F # fire spirit R:220:0xA4:0x91 # fire hound R:221:0xB5:0x8F # cold hound R:222:0xB5:0x8D # energy hound R:223:0xB5:0x8E # potion mimic R:224:0x85:0x80 # blink dog R:225:0xA1:0x99 # uruk R:226:0xAC:0x8A # shagrat, the orc captain R:227:0xAC:0x8D # gorbag, the orc captain R:228:0xAC:0x8C # shambling mound R:229:0xA0:0x89 # stone giant R:230:0xAC:0x96 # giant black dragon fly R:231:0xA5:0x90 # stone golem R:232:0xA6:0x94 # red mold R:233:0xAB:0x86 # giant gold dragon fly R:234:0xA5:0x91 # bolg, son of azog R:235:0xAC:0x8E # phase spider R:236:0xB0:0x8D # 3-headed hydra R:237:0xAA:0x96 # earth hound R:238:0xB5:0x91 # air hound R:239:0xB5:0x90 # sabre-tooth tiger R:240:0xA5:0x9A # water hound R:241:0xB5:0x92 # chimaera R:242:0xA7:0x84 # quylthulg R:243:0xAF:0x80 # sasquatch R:244:0xB5:0x84 # werewolf R:245:0xA1:0x9A # dark elven lord R:246:0xA7:0x96 # cloud giant R:247:0xAC:0x97 # lugdush, the uruk R:248:0xAC:0x8F # ugluk, the uruk R:249:0xAC:0x90 # blue dragon bat R:250:0xA1:0x8B # scroll mimic R:251:0x87:0x90 # fire vortex R:252:0xB3:0x8C # water vortex R:253:0xB3:0x8D # cold vortex R:254:0xB3:0x8A # energy vortex R:255:0xB3:0x8B # mummified orc R:256:0xB6:0x83 # killer stag beetle R:257:0xA9:0x96 # iron golem R:258:0xA6:0x95 # giant yellow scorpion R:259:0xB0:0x8E # black ooze R:260:0xA9:0x8D # hardened warrior R:261:0xAD:0x91 # azog, king of the uruk-hai R:262:0xAC:0x91 # master rogue R:263:0xAD:0x92 # red dragon bat R:264:0xA1:0x8C # killer white beetle R:265:0xA9:0x97 # giant bronze dragon fly R:266:0xA5:0x92 # forest wight R:267:0xB4:0x80 # ibun, son of mim R:268:0xA7:0x97 # khim, son of mim R:269:0xA7:0x98 # 4-headed hydra R:270:0xAA:0x97 # mummified human R:271:0xB6:0x84 # vampire bat R:272:0xA1:0x8D # sangahyando of umbar R:273:0xAD:0x94 # angamaite of umbar R:274:0xAD:0x93 # banshee R:275:0xA6:0x84 # pukelman R:276:0xA6:0x93 # dark elven druid R:277:0xA7:0x99 # stone troll R:278:0xB1:0x81 # troll priest R:279:0xB1:0x82 # wereworm R:280:0xB4:0x9C # carrion crawler (type 1) R:281:0xA2:0x87 # killer red beetle R:282:0xA9:0x98 # giant grey ant R:283:0xA0:0x9A # ulwarth, son of ulfang R:284:0xAD:0x95 # displacer beast R:285:0xA5:0x9B # giant fire tick R:286:0xB0:0x90 # cave ogre R:287:0xAB:0x97 # white wraith R:288:0xB4:0x81 # angel R:289:0xA0:0x8C # mim, betrayer of turin R:290:0xA7:0x9A # killer fire beetle R:291:0xA9:0x99 # creeping adamantite coins R:292:0x83:0x84 # algroth R:293:0xB1:0x83 # vibration hound R:294:0xB5:0x94 # nexus hound R:295:0xB5:0x93 # ogre mage R:296:0xAB:0x98 # lokkak, the ogre chieftain R:297:0xAB:0x9B # vampire R:298:0xB3:0x80 # gorgimaera R:299:0xA7:0x85 # colbran R:300:0xA6:0x96 # spirit naga R:301:0xAB:0x90 # 5-headed hydra R:302:0xAA:0x98 # black knight R:303:0xAD:0x96 # uldor the accursed R:304:0xAD:0x98 # mage R:305:0xAD:0x97 # mind flayer R:306:0xA7:0x9B # draebor, the imp R:307:0xB2:0x9A # basilisk R:308:0xAF:0x9C # ice troll R:309:0xB1:0x84 # purple worm R:310:0xB4:0x9D # archangel R:311:0xA0:0x8D # catoblepas R:312:0xAF:0x90 # ring mimic R:313:0x84:0x80 # young blue dragon R:314:0xA3:0x94 # young white dragon R:315:0xA3:0x97 # young green dragon R:316:0xA3:0x96 # young bronze dragon R:317:0xA3:0x95 # mithril golem R:318:0xA6:0x97 # shadow drake R:319:0xA4:0x81 # skeleton troll R:320:0xB0:0x9A # manticore R:321:0xA7:0x86 # giant blue ant R:322:0xA0:0x9C # giant army ant R:323:0xA0:0x9B # grave wight R:324:0xB4:0x82 # killer slicer beetle R:325:0xA9:0x9A # ghost R:326:0xA6:0x85 # death watch beetle R:327:0xA9:0x9B # ogre shaman R:328:0xAB:0x99 # nexus quylthulg R:329:0xAF:0x81 # shelob, spider of darkness R:330:0xB0:0x94 # ninja R:331:0xAD:0x99 # memory moss R:332:0xA0:0x8A # storm giant R:333:0xAC:0x98 # cave troll R:334:0xB1:0x85 # half-troll R:335:0xB1:0x88 # mystic R:336:0xAD:0x9A # barrow wight R:337:0xB4:0x83 # skeleton ettin R:338:0xB0:0x9B # chaos drake R:339:0xA3:0x9D # law drake R:340:0xA4:0x80 # balance drake R:341:0xA3:0x9C # ethereal drake R:342:0xA3:0x9F # bert the stone troll R:343:0xB1:0x86 # bill the stone troll R:344:0xB1:0x87 # tom the stone troll R:345:0xB1:0x89 # shade R:346:0xA6:0x86 # spectre R:347:0xA6:0x87 # water troll R:348:0xB1:0x8A # fire elemental R:349:0xA4:0x92 # cherub R:350:0xA0:0x8E # water elemental R:351:0xA4:0x93 # invisible stalker R:352:0xA4:0x96 # carrion crawler (type 2) R:353:0xA2:0x87 # master thief R:354:0xAD:0x9B # ulfang the black R:355:0xAD:0x9C # lich R:356:0xAA:0x88 # master vampire R:357:0xB3:0x81 # giant grey scorpion R:358:0xB0:0x91 # earth elemental R:359:0xA4:0x95 # air elemental R:360:0xA4:0x94 # hellhound (type 1) R:361:0xA1:0x9C # eog golem R:362:0xA6:0x98 # olog R:363:0xB1:0x8B # dagashi R:364:0xAD:0x9D # gravity hound R:365:0xB5:0x95 # acidic cytoplasm R:366:0xA9:0x8E # inertia hound R:367:0xB5:0x97 # impact hound R:368:0xB5:0x96 # dread (type 1) R:369:0xA6:0x88 # ooze elemental R:370:0xA4:0x97 # smoke elemental R:371:0xA4:0x98 # young black dragon R:372:0xA3:0x98 # mumak (type 1) R:373:0xAF:0x91 # giant fire ant R:374:0xA0:0x9D # mature white dragon R:375:0xA4:0x85 # xorn R:376:0xB5:0x81 # shadow R:377:0xA6:0x8A # phantom R:378:0xA6:0x89 # grey wraith R:379:0xB4:0x84 # young multi-hued dragon R:380:0xA3:0x9B # colossus R:381:0xA6:0x9A # young gold dragon R:382:0xA3:0x99 # rogrog the black troll R:383:0xB1:0x8F # mature blue dragon R:384:0xA4:0x82 # mature green dragon R:385:0xA4:0x84 # mature bronze dragon R:386:0xA4:0x83 # young red dragon R:387:0xA3:0x9A # trapper R:388:0xA0:0x80 # bodak R:389:0xB2:0x9B # ice elemental R:390:0xA4:0x99 # necromancer R:391:0xAE:0x80 # lorgan, chief of the easterlings R:392:0xAD:0x9F # demonologist R:393:0xAD:0x9E # mummified troll R:394:0xB6:0x88 # the queen ant R:395:0xA0:0x9E # will o' the wisp R:396:0xA4:0x9B # magma elemental R:397:0xA4:0x9A # black pudding R:398:0xA9:0x8F # killer iridescent beetle R:399:0xA9:0x9C # nexus vortex R:400:0xB3:0x8E # plasma vortex R:401:0xB3:0x8F # mature red dragon R:402:0xA4:0x88 # mature gold dragon R:403:0xA4:0x87 # crystal drake R:404:0xA3:0x9E # mature black dragon R:405:0xA4:0x86 # mature multi-hued dragon R:406:0xA4:0x89 # death knight R:407:0xAE:0x82 # castamir the usurper R:408:0xAE:0x81 # time vortex R:409:0xB3:0x92 # shimmering vortex R:410:0xB3:0x91 # ancient blue dragon R:411:0xA2:0x8B # ancient bronze dragon R:412:0xA2:0x8C # beholder R:413:0xA5:0x87 # emperor wight R:414:0xB4:0x86 # seraph R:415:0xA0:0x8F # vargo, tyrant of fire R:416:0xA4:0x9E # black wraith R:417:0xB4:0x85 # erinyes R:418:0xB2:0x80 # nether wraith R:419:0xB4:0x87 # eldrak R:420:0xB1:0x8C # ettin R:421:0xB1:0x8D # waldern, king of water R:422:0xA4:0x9F # kavlax the many-headed R:423:0xA4:0x8A # ancient white dragon R:424:0xA2:0x8E # ancient green dragon R:425:0xA2:0x8D # 7-headed hydra R:426:0xAA:0x99 # night mare R:427:0xAF:0x92 # vampire lord R:428:0xB3:0x82 # ancient black dragon R:429:0xA2:0x8F # disenchanter worm mass R:430:0xB4:0x9E # rotting quylthulg R:431:0xAF:0x84 # spirit troll R:432:0xA6:0x8B # lesser titan R:433:0xAC:0x9A # 9-headed hydra R:434:0xAA:0x9A # enchantress R:435:0xAE:0x83 # knight templar R:436:0xAE:0x88 # sorcerer R:437:0xAE:0x85 # xaren R:438:0xB5:0x82 # giant roc R:439:0xA1:0x84 # uvatha the horseman R:440:0xB4:0x88 # minotaur R:441:0xA7:0x87 # medusa, the gorgon R:442:0xAB:0x91 # death drake R:443:0xA2:0x93 # ancient red dragon R:444:0xA2:0x91 # ancient gold dragon R:445:0xA2:0x90 # great crystal drake R:446:0xA2:0x95 # vrock R:447:0xB2:0x81 # death quasit R:448:0xB2:0x9C # adunaphel the quiet R:449:0xB4:0x89 # dark elven sorcerer R:450:0xA7:0x9C # master lich R:451:0xAA:0x89 # hezrou R:452:0xB2:0x82 # akhorahil the blind R:453:0xB4:0x8A # gorlim, betrayer of barahir R:454:0xAE:0x86 # archon R:455:0xA0:0x90 # glabrezu R:456:0xB2:0x83 # ren the unclean R:457:0xB4:0x8B # nalfeshnee R:458:0xB2:0x84 # undead beholder R:459:0xA5:0x88 # dread (type 2) R:460:0xA6:0x88 # mumak (type 2) R:461:0xAF:0x91 # ancient multi-hued dragon R:462:0xA2:0x92 # ethereal dragon R:463:0xA2:0x94 # ji indur dawndeath R:464:0xB4:0x8C # marilith R:465:0xB2:0x85 # quaker, master of earth R:466:0xA4:0x9D # lesser balrog R:467:0xB2:0x86 # ariel, queen of air R:468:0xA4:0x9C # 11-headed hydra R:469:0xAA:0x9B # patriarch R:470:0xAE:0x84 # dreadmaster R:471:0xA6:0x8C # drolem R:472:0xA6:0x9B # scatha the worm R:473:0xA2:0x96 # dwar, dog lord of waw R:474:0xB4:0x8D # smaug the golden R:475:0xA2:0x98 # dracolich R:476:0xA2:0x99 # greater titan R:477:0xAC:0x9B # dracolisk R:478:0xA2:0x9A # death mold R:479:0xAB:0x88 # itangast the fire drake R:480:0xA2:0x97 # glaurung, father of the dragons R:481:0xA3:0x82 # master mystic R:482:0xAE:0x8A # the balrog of moria R:483:0xB2:0x87 # nightwing R:484:0xB4:0x8E # nether hound R:485:0xB5:0x99 # time hound R:486:0xB5:0x9B # plasma hound R:487:0xB5:0x9A # demonic quylthulg R:488:0xAF:0x82 # great storm wyrm R:489:0xA2:0x9C # baphomet the minotaur lord R:490:0xA7:0x88 # harowen the black hand R:491:0xAE:0x8B # hoarmurath of dir R:492:0xB4:0x8F # grand master mystic R:493:0xAE:0x8D # khamul, the black easterling R:494:0xB4:0x91 # ethereal hound R:495:0xB5:0x9C # great ice wyrm R:496:0xA2:0x9B # the phoenix R:497:0xA1:0x86 # nightcrawler R:498:0xB4:0x90 # hand druj R:499:0xB0:0x9C # eye druj R:500:0xB0:0x9D # skull druj R:501:0xB0:0x9E # chaos vortex R:502:0xB3:0x93 # aether vortex R:503:0xB3:0x95 # the lernaean hydra R:504:0xAA:0x9C # thuringwethil, the vampire messenger R:505:0xB3:0x84 # great hell wyrm R:506:0xA3:0x80 # draconic quylthulg R:507:0xAF:0x83 # fundin bluecloak R:508:0xA7:0x9E # uriel, angel of fire R:509:0xA0:0x91 # azriel, angel of death R:510:0xA0:0x92 # ancalagon the black R:511:0xA3:0x87 # nightwalker R:512:0xB4:0x92 # gabriel, the messenger R:513:0xA0:0x93 # saruman of many colours R:514:0xAE:0x8E # dreadlord R:515:0xA6:0x8D # the cat lord R:516:0xA5:0x9C # jabberwock R:517:0xA7:0x89 # chaos hound R:518:0xB5:0x9D # great wyrm of chaos R:519:0xA3:0x83 # great wyrm of law R:520:0xA3:0x84 # great wyrm of balance R:521:0xA3:0x85 # tselakus, the dreadlord R:522:0xA6:0x8E # great wyrm of many colours R:523:0xA3:0x86 # black reaver R:524:0xAA:0x8C # greater demonic quylthulg R:525:0xAF:0x85 # greater draconic quylthulg R:526:0xAF:0x86 # greater rotting quylthulg R:527:0xAF:0x87 # feagwath the undead sorceror R:528:0xAA:0x8D # omarax, the eye tyrant R:529:0xA5:0x8A # ungoliant, the unlight R:530:0xB0:0x95 # aether hound R:531:0xB5:0x9E # the mouth of sauron R:532:0xAE:0x8F # master quylthulg R:533:0xAF:0x88 # qlzqqlzuup, the emperor quylthulg R:534:0xAF:0x89 # the witch-king of angmar R:535:0xB4:0x93 # pazuzu, lord of air R:536:0xB2:0x8F # hellhound (type 2) R:537:0xA1:0x9C # cantoras, the skeletal lord R:538:0xB0:0x9F # the tarrasque R:539:0xAF:0x9E # lungorthin, the balrog of white fire R:540:0xB2:0x90 # draugluin, sire of all werewolves R:541:0xA1:0x9D # vecna, the emperor lich R:542:0xAA:0x8E # huan, wolfhound of the valar R:543:0xA1:0x9F # carcharoth, the jaws of thirst R:544:0xA1:0x9E # gothmog, the high captain of balrogs R:545:0xB2:0x91 # sauron, the sorcerer R:546:0xAE:0x90 # morgoth, lord of darkness R:547:0xAC:0x9F # silver mouse R:548:0xB0:0x82 # rot jelly R:549:0xA9:0x87 # giant tan bat R:550:0xA1:0x8A # giant silver ant R:551:0xA0:0x99 # giant brown tick R:552:0xB0:0x8F # disenchanter bat R:553:0xA1:0x8E # shimmering mold R:554:0xAB:0x87 # wyvern R:555:0xA3:0x93 # chest mimic R:556:0x83:0x90 # demilich R:557:0xAA:0x8A # archlich R:558:0xAA:0x8B # crow R:559:0xA1:0x80 # raven R:560:0xA1:0x81 # crebain R:561:0xA1:0x83 # winged horror R:562:0xA1:0x85 # cave bear R:563:0xAF:0x8C # grizzly bear R:564:0xAF:0x8D # werebear R:565:0xAF:0x8E # beorn, the shape-changer R:566:0xAF:0x8F # barbazu R:567:0xB2:0x88 # bile demon R:568:0xB2:0x89 # osyluth R:569:0xB2:0x8A # gelugon R:570:0xB2:0x8B # horned reaper R:571:0xB2:0x8C # pit fiend R:572:0xB2:0x8D # greater balrog R:573:0xB2:0x8E # baby bronze dragon R:574:0xA3:0x8C # baby gold dragon R:575:0xA3:0x8D # great swamp wyrm R:576:0xA2:0x9D # great wyrm of perplexity R:577:0xA2:0x9E # great bile wyrm R:578:0xA2:0x9F # great wyrm of thunder R:579:0xA3:0x81 # ranger R:580:0xAD:0x90 # paladin R:581:0xAD:0x8F # ranger chieftain R:582:0xAE:0x87 # berserker R:583:0xAE:0x89 # cyclops R:584:0xAC:0x99 # polyphemus, the blind cyclops R:585:0xAC:0x9C # atlas, the titan R:586:0xAC:0x9D # kronos, lord of the titans R:587:0xAC:0x9E # evil eye R:588:0xA5:0x84 # spectator R:589:0xA5:0x85 # gauth R:590:0xA5:0x86 # beholder hive-mother R:591:0xA5:0x89 # neekerbreeker R:592:0xA8:0x83 # giant firefly R:593:0xA8:0x84 # eol, the dark elf R:594:0xA7:0x9D # maeglin, the traitor of gondolin R:595:0xA7:0x9F # elder vampire R:596:0xB3:0x83 # silent watcher R:597:0xA6:0x99 # nighthawk R:598:0xA1:0x82 # ghoul R:599:0xB6:0x85 # ghast R:600:0xB6:0x86 # greater basilisk R:601:0xAF:0x9D # aranea R:602:0xB0:0x92 # elder aranea R:603:0xB0:0x93 # kobold shaman R:604:0xAA:0x82 # bat of gorgoroth R:605:0xA1:0x8F # doombat R:606:0xA1:0x90 # wolf chieftain R:607:0xA1:0x9B # bone golem R:608:0xA6:0x9C # bronze golem R:609:0xA6:0x9D # ogre chieftain R:610:0xAB:0x9A # ar-pharazon the golden R:611:0xAE:0x8C # troll chieftain R:612:0xB1:0x8E # shardstorm R:613:0xB3:0x90 # storm of unmagic R:614:0xB3:0x94 # greater mummy R:615:0xB6:0x87 # multi-hued hound R:616:0xB5:0x98 # Load the special player pictures %:xtra-nmd.prf # Load the flavored objects %:flvr-nmd.prf angband-v3.3.2/lib/pref/font-gcu.prf0000644000175000017500000000102711651552410016544 0ustar chriscchrisc# File: font-gcu.prf # This file contains definitions allowing Angband to make use of the # "alternate character set" on VT100-compatible terminals. # Terrain features # open floor F:1:all:0x01:0x2E # invisible trap F:2:all:0x01:0x2E # magma vein F:50:all:0x08:0x03 # magma vein F:52:all:0x08:0x03 # quartz vein F:51:all:0x01:0x03 # quartz vein F:53:all:0x01:0x03 # magma vein with treasure F:54:all:0x03:0x01 # quartz vein with treasure F:55:all:0x03:0x01 # granite wall F:56:all:0x01:0x02 # permanent wall F:60:all:0x04:0x02 angband-v3.3.2/lib/pref/xtra-nmd.prf0000644000175000017500000001065411651552410016562 0ustar chriscchrisc# File: xtra-nmd.prf # # This file defines special attr/char mappings for use in "graphics" mode # # Edited for use with 8x16 tile set by Nomad. # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Remap the player icon ##### ?:[AND [EQU $CLASS Warrior] [EQU $RACE Human] ] R:0:0x9B:0x80 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Elf] ] R:0:0x9B:0x81 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Elf] ] R:0:0x9B:0x82 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Hobbit] ] R:0:0x9B:0x83 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Gnome] ] R:0:0x9B:0x84 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dwarf] ] R:0:0x9B:0x85 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Orc] ] R:0:0x9B:0x86 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Troll] ] R:0:0x9B:0x87 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dunadan] ] R:0:0x9B:0x88 ?:[AND [EQU $CLASS Warrior] [EQU $RACE High-Elf] ] R:0:0x9B:0x89 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Kobold] ] R:0:0x9B:0x8A ?:[AND [EQU $CLASS Mage] [EQU $RACE Human] ] R:0:0x9B:0x90 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Elf] ] R:0:0x9B:0x91 ?:[AND [EQU $CLASS Mage] [EQU $RACE Elf] ] R:0:0x9B:0x92 ?:[AND [EQU $CLASS Mage] [EQU $RACE Hobbit] ] R:0:0x9B:0x93 ?:[AND [EQU $CLASS Mage] [EQU $RACE Gnome] ] R:0:0x9B:0x9C ?:[AND [EQU $CLASS Mage] [EQU $RACE Dwarf] ] R:0:0x9B:0x95 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Orc] ] R:0:0x9B:0x96 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Troll] ] R:0:0x9B:0x97 ?:[AND [EQU $CLASS Mage] [EQU $RACE Dunadan] ] R:0:0x9B:0x98 ?:[AND [EQU $CLASS Mage] [EQU $RACE High-Elf] ] R:0:0x9B:0x99 ?:[AND [EQU $CLASS Mage] [EQU $RACE Kobold] ] R:0:0x9B:0x9A ?:[AND [EQU $CLASS Priest] [EQU $RACE Human] ] R:0:0x9C:0x80 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Elf] ] R:0:0x9C:0x81 ?:[AND [EQU $CLASS Priest] [EQU $RACE Elf] ] R:0:0x9C:0x82 ?:[AND [EQU $CLASS Priest] [EQU $RACE Hobbit] ] R:0:0x9C:0x83 ?:[AND [EQU $CLASS Priest] [EQU $RACE Gnome] ] R:0:0x9C:0x84 ?:[AND [EQU $CLASS Priest] [EQU $RACE Dwarf] ] R:0:0x9C:0x85 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Orc] ] R:0:0x9C:0x86 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Troll] ] R:0:0x9C:0x87 ?:[AND [EQU $CLASS Priest] [EQU $RACE Dunadan] ] R:0:0x9C:0x88 ?:[AND [EQU $CLASS Priest] [EQU $RACE High-Elf] ] R:0:0x9C:0x89 ?:[AND [EQU $CLASS Priest] [EQU $RACE Kobold] ] R:0:0x9C:0x8A ?:[AND [EQU $CLASS Rogue] [EQU $RACE Human] ] R:0:0x9C:0x90 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Elf] ] R:0:0x9C:0x91 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Elf] ] R:0:0x9C:0x92 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Hobbit] ] R:0:0x9C:0x93 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Gnome] ] R:0:0x9C:0x94 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dwarf] ] R:0:0x9C:0x95 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Orc] ] R:0:0x9C:0x96 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Troll] ] R:0:0x9C:0x97 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dunadan] ] R:0:0x9C:0x98 ?:[AND [EQU $CLASS Rogue] [EQU $RACE High-Elf] ] R:0:0x9C:0x99 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Kobold] ] R:0:0x9C:0x9A ?:[AND [EQU $CLASS Ranger] [EQU $RACE Human] ] R:0:0x9D:0x80 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Elf] ] R:0:0x9D:0x81 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Elf] ] R:0:0x9D:0x82 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Hobbit] ] R:0:0x9D:0x83 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Gnome] ] R:0:0x9D:0x84 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dwarf] ] R:0:0x9D:0x85 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Orc] ] R:0:0x9D:0x86 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Troll] ] R:0:0x9D:0x87 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dunadan] ] R:0:0x9D:0x88 ?:[AND [EQU $CLASS Ranger] [EQU $RACE High-Elf] ] R:0:0x9D:0x89 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Kobold] ] R:0:0x9D:0x8A ?:[AND [EQU $CLASS Paladin] [EQU $RACE Human] ] R:0:0x9D:0x90 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Elf] ] R:0:0x9D:0x91 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Elf] ] R:0:0x9D:0x92 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Hobbit] ] R:0:0x9D:0x93 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Gnome] ] R:0:0x9D:0x94 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dwarf] ] R:0:0x9D:0x95 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Orc] ] R:0:0x9D:0x96 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Troll] ] R:0:0x9D:0x97 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dunadan] ] R:0:0x9D:0x98 ?:[AND [EQU $CLASS Paladin] [EQU $RACE High-Elf] ] R:0:0x9D:0x99 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Kobold] ] R:0:0x9D:0x9A angband-v3.3.2/lib/pref/flvr-new.prf0000644000175000017500000002342611651552410016571 0ustar chriscchrisc# Plain Gold ring L:1:0x84:0x8A # Alexandrite ring L:2:0x84:0x84 # Amethyst ring L:3:0x84:0x89 # Aquamarine ring L:4:0x84:0x8D # Azurite ring L:5:0x84:0x8D # Beryl ring L:6:0x84:0x8C # Bloodstone ring L:7:0x84:0x83 # Calcite ring L:8:0x84:0x80 # Carnelian ring L:9:0x84:0x83 # Corundum ring L:10:0x84:0x88 # Diamond ring L:11:0x84:0x80 # Emerald ring L:12:0x84:0x84 # Fluorite ring L:13:0x84:0x8C # Garnet ring L:14:0x84:0x83 # Granite ring L:15:0x84:0x81 # Jade ring L:16:0x84:0x8C # Jasper ring L:17:0x84:0x86 # Lapis Lazuli ring L:18:0x84:0x85 # Malachite ring L:19:0x84:0x84 # Marble ring L:20:0x84:0x80 # Moonstone ring L:21:0x84:0x81 # Onyx ring L:22:0x84:0x8B # Opal ring L:23:0x84:0x81 # Pearl ring L:24:0x84:0x80 # Quartz ring L:25:0x84:0x81 # Quartzite ring L:26:0x84:0x81 # Rhodonite ring L:27:0x84:0x8B # Ruby ring L:28:0x84:0x83 # Sapphire ring L:29:0x84:0x85 # Tiger Eye ring L:30:0x84:0x8A # Topaz ring L:31:0x84:0x8A # Turquoise ring L:32:0x84:0x8D # Zircon ring L:33:0x84:0x8E # Platinum ring L:34:0x84:0x80 # Bronze ring L:35:0x84:0x8E # Gold ring L:36:0x84:0x8A # Obsidian ring L:37:0x84:0x81 # Silver ring L:38:0x84:0x81 # Tortoise Shell ring L:39:0x84:0x86 # Mithril ring L:40:0x84:0x8D # Jet ring L:41:0x84:0x81 # Engagement ring L:42:0x84:0x8A # Adamantite ring L:43:0x84:0x8C # Amber amulet L:44:0x87:0x8A # Driftwood amulet L:45:0x87:0x8E # Coral amulet L:46:0x87:0x80 # Agate amulet L:47:0x87:0x81 # Ivory amulet L:48:0x87:0x80 # Obsidian amulet L:49:0x87:0x81 # Bone amulet L:50:0x87:0x80 # Brass amulet L:51:0x87:0x8E # Bronze amulet L:52:0x87:0x8E # Pewter amulet L:53:0x87:0x88 # Tortoise Shell amulet L:54:0x87:0x86 # Golden amulet L:55:0x87:0x8A # Azure amulet L:56:0x87:0x8D # Crystal amulet L:57:0x87:0x80 # Silver amulet L:58:0x87:0x81 # Copper amulet L:59:0x87:0x8E # Carved Oak amulet L:60:0x87:0x86 # Dragon Tooth amulet L:61:0x87:0x81 # Ruby amulet L:62:0x87:0x83 # Mithril amulet L:63:0x87:0x8D # Adamant amulet L:64:0x87:0x8C # Flint Stone amulet L:65:0x87:0x88 # Sea Shell amulet L:66:0x87:0x8D # Mother-of-Pearl amulet L:67:0x87:0x81 # Aspen staff L:68:0x87:0x90 # Balsa staff L:69:0x87:0x90 # Banyan staff L:70:0x87:0x90 # Birch staff L:71:0x87:0x90 # Cedar staff L:72:0x87:0x90 # Cottonwood staff L:73:0x87:0x90 # Cypress staff L:74:0x87:0x90 # Dogwood staff L:75:0x87:0x90 # Elm staff L:76:0x87:0x90 # Eucalyptus staff L:77:0x87:0x90 # Hemlock staff L:78:0x87:0x90 # Hickory staff L:79:0x87:0x90 # Ironwood staff L:80:0x87:0x90 # Locust staff L:81:0x87:0x90 # Mahogany staff L:82:0x87:0x90 # Maple staff L:83:0x87:0x90 # Mulberry staff L:84:0x87:0x90 # Oak staff L:85:0x87:0x90 # Pine staff L:86:0x87:0x90 # Redwood staff L:87:0x87:0x92 # Rosewood staff L:88:0x87:0x92 # Spruce staff L:89:0x87:0x90 # Sycamore staff L:90:0x87:0x90 # Teak staff L:91:0x87:0x90 # Walnut staff L:92:0x87:0x90 # Mistletoe staff L:93:0x87:0x93 # Hawthorn staff L:94:0x87:0x90 # Bamboo staff L:95:0x87:0x90 # Silver staff L:96:0x87:0x95 # Runed staff L:97:0x87:0x90 # Golden staff L:98:0x87:0x93 # Ashen staff L:99:0x87:0x95 # Gnarled staff L:100:0x87:0x90 # Ivory staff L:101:0x87:0x95 # Willow staff L:102:0x87:0x90 # Aluminium wand L:103:0x86:0x9D # Cast Iron wand L:104:0x86:0x91 # Chromium wand L:105:0x86:0x90 # Copper wand L:106:0x86:0x9E # Gold wand L:107:0x86:0x9A # Iron wand L:108:0x86:0x98 # Magnesium wand L:109:0x86:0x91 # Molybdenum wand L:110:0x86:0x91 # Nickel wand L:111:0x86:0x9E # Rusty wand L:112:0x86:0x93 # Silver wand L:113:0x86:0x91 # Steel wand L:114:0x86:0x91 # Tin wand L:115:0x86:0x91 # Titanium wand L:116:0x86:0x90 # Tungsten wand L:117:0x86:0x90 # Zirconium wand L:118:0x86:0x91 # Zinc wand L:119:0x86:0x91 # Aluminum-Plated wand L:120:0x86:0x9D # Copper-Plated wand L:121:0x86:0x9E # Gold-Plated wand L:122:0x86:0x9A # Nickel-Plated wand L:123:0x86:0x9E # Silver-Plated wand L:124:0x86:0x91 # Steel-Plated wand L:125:0x86:0x91 # Tin-Plated wand L:126:0x86:0x91 # Zinc-Plated wand L:127:0x86:0x91 # Mithril-Plated wand L:128:0x86:0x9D # Mithril wand L:129:0x86:0x9D # Runed wand L:130:0x86:0x96 # Bronze wand L:131:0x86:0x9E # Brass wand L:132:0x86:0x9E # Platinum wand L:133:0x86:0x90 # Lead wand L:134:0x86:0x98 # Lead-Plated wand L:135:0x86:0x98 # Ivory wand L:136:0x86:0x90 # Pewter wand L:137:0x86:0x98 # Aluminum rod L:138:0x86:0x8D # Cast Iron rod L:139:0x86:0x81 # Chromium rod L:140:0x86:0x80 # Copper rod L:141:0x86:0x8E # Gold rod L:142:0x86:0x8A # Iron rod L:143:0x86:0x88 # Magnesium rod L:144:0x86:0x81 # Molybdenum rod L:145:0x86:0x81 # Nickel rod L:146:0x86:0x8E # Rusty rod L:147:0x86:0x83 # Silver rod L:148:0x86:0x81 # Steel rod L:149:0x86:0x81 # Tin rod L:150:0x86:0x81 # Titanium rod L:151:0x86:0x80 # Tungsten rod L:152:0x86:0x80 # Zirconium rod L:153:0x86:0x81 # Zinc rod L:154:0x86:0x81 # Aluminum-Plated rod L:155:0x86:0x8D # Copper-Plated rod L:156:0x86:0x8E # Gold-Plated rod L:157:0x86:0x8A # Nickel-Plated rod L:158:0x86:0x8E # Silver-Plated rod L:159:0x86:0x81 # Steel-Plated rod L:160:0x86:0x81 # Tin-Plated rod L:161:0x86:0x81 # Zinc-Plated rod L:162:0x86:0x81 # Mithril-Plated rod L:163:0x86:0x8D # Mithril rod L:164:0x86:0x8D # Runed rod L:165:0x86:0x86 # Bronze rod L:166:0x86:0x8E # Brass rod L:167:0x86:0x8E # Platinum rod L:168:0x86:0x80 # Lead rod L:169:0x86:0x88 # Lead-Plated rod L:170:0x86:0x88 # Ivory rod L:171:0x86:0x80 # Pewter rod L:172:0x86:0x88 # Blue mushroom L:173:0x85:0x95 # Black mushroom L:174:0x85:0x91 # Black Spotted mushroom L:175:0x85:0x91 # Brown mushroom L:176:0x85:0x96 # Dark Blue mushroom L:177:0x85:0x95 # Dark Green mushroom L:178:0x85:0x94 # Dark Red mushroom L:179:0x85:0x93 # Yellow mushroom L:180:0x85:0x9A # Furry mushroom L:181:0x85:0x91 # Green mushroom L:182:0x85:0x94 # Grey mushroom L:183:0x85:0x98 # Light Blue mushroom L:184:0x85:0x9D # Light Green mushroom L:185:0x85:0x9C # Violet mushroom L:186:0x85:0x99 # Red mushroom L:187:0x85:0x93 # Slimy mushroom L:188:0x85:0x98 # Tan mushroom L:189:0x85:0x9E # White mushroom L:190:0x85:0x90 # White Spotted mushroom L:191:0x85:0x90 # Wrinkled mushroom L:192:0x85:0x96 # Clear potion L:193:0x85:0x80 # Light Brown potion L:194:0x85:0x8E # Icky Green potion L:195:0x85:0x84 # Azure potion L:196:0x85:0x8D # Blue potion L:197:0x85:0x85 # Blue Speckled potion L:198:0x85:0x85 # Black potion L:199:0x85:0x81 # Brown potion L:200:0x85:0x86 # Brown Speckled potion L:201:0x85:0x86 # Bubbling potion L:202:0x85:0x81 # Chartreuse potion L:203:0x85:0x8C # Cloudy potion L:204:0x85:0x80 # Copper Speckled potion L:205:0x85:0x8E # Crimson potion L:206:0x85:0x83 # Cyan potion L:207:0x85:0x8D # Dark Blue potion L:208:0x85:0x85 # Dark Green potion L:209:0x85:0x84 # Dark Red potion L:210:0x85:0x83 # Gold Speckled potion L:211:0x85:0x8A # Green potion L:212:0x85:0x84 # Green Speckled potion L:213:0x85:0x84 # Grey potion L:214:0x85:0x88 # Grey Speckled potion L:215:0x85:0x88 # Hazy potion L:216:0x85:0x81 # Indigo potion L:217:0x85:0x89 # Light Blue potion L:218:0x85:0x8D # Light Green potion L:219:0x85:0x8C # Magenta potion L:220:0x85:0x83 # Metallic Blue potion L:221:0x85:0x85 # Metallic Red potion L:222:0x85:0x83 # Metallic Green potion L:223:0x85:0x84 # Metallic Purple potion L:224:0x85:0x89 # Misty potion L:225:0x85:0x81 # Orange potion L:226:0x85:0x82 # Orange Speckled potion L:227:0x85:0x82 # Pink potion L:228:0x85:0x8B # Pink Speckled potion L:229:0x85:0x8B # Puce potion L:230:0x85:0x89 # Purple potion L:231:0x85:0x89 # Purple Speckled potion L:232:0x85:0x89 # Red potion L:233:0x85:0x83 # Red Speckled potion L:234:0x85:0x83 # Silver Speckled potion L:235:0x85:0x81 # Smoky potion L:236:0x85:0x81 # Tangerine potion L:237:0x85:0x82 # Violet potion L:238:0x85:0x89 # Vermilion potion L:239:0x85:0x83 # White potion L:240:0x85:0x80 # Yellow potion L:241:0x85:0x8A # Violet Speckled potion L:242:0x85:0x89 # Pungent potion L:243:0x85:0x8B # Clotted Red potion L:244:0x85:0x83 # Viscous Pink potion L:245:0x85:0x8B # Oily Yellow potion L:246:0x85:0x8A # Gloopy Green potion L:247:0x85:0x84 # Shimmering potion L:248:0x85:0x89 # Coagulated Crimson potion L:249:0x85:0x83 # Yellow Speckled potion L:250:0x85:0x8A # Gold potion L:251:0x85:0x8A # Scroll L:252:0x83:0x9D # Scroll L:253:0x83:0x9D # Scroll L:254:0x83:0x9D # Scroll L:255:0x83:0x9D # Scroll L:256:0x83:0x9D # Scroll L:257:0x83:0x9D # Scroll L:258:0x83:0x9D # Scroll L:259:0x83:0x9D # Scroll L:260:0x83:0x9D # Scroll L:261:0x83:0x9D # Scroll L:262:0x83:0x9D # Scroll L:263:0x83:0x9D # Scroll L:264:0x83:0x9D # Scroll L:265:0x83:0x9D # Scroll L:266:0x83:0x9D # Scroll L:267:0x83:0x9D # Scroll L:268:0x83:0x9D # Scroll L:269:0x83:0x9D # Scroll L:270:0x83:0x9D # Scroll L:271:0x83:0x9D # Scroll L:272:0x83:0x9D # Scroll L:273:0x83:0x9D # Scroll L:274:0x83:0x9D # Scroll L:275:0x83:0x9D # Scroll L:276:0x83:0x9D # Scroll L:277:0x83:0x9D # Scroll L:278:0x83:0x9D # Scroll L:279:0x83:0x9D # Scroll L:280:0x83:0x9D # Scroll L:281:0x83:0x9D # Scroll L:282:0x83:0x9D # Scroll L:283:0x83:0x9D # Scroll L:284:0x83:0x9D # Scroll L:285:0x83:0x9D # Scroll L:286:0x83:0x9D # Scroll L:287:0x83:0x9D # Scroll L:288:0x83:0x9D # Scroll L:289:0x83:0x9D # Scroll L:290:0x83:0x9D # Scroll L:291:0x83:0x9D # Scroll L:292:0x83:0x9D # Scroll L:293:0x83:0x9D # Scroll L:294:0x83:0x9D # Scroll L:295:0x83:0x9D # Scroll L:296:0x83:0x9D # Scroll L:297:0x83:0x9D # Scroll L:298:0x83:0x9D # Scroll L:299:0x83:0x9D # Scroll L:300:0x83:0x9D # Scroll L:301:0x83:0x9D # Scroll L:302:0x83:0x9D # Ceremonial Rod L:303:0x86:0x89 # Black Rod L:304:0x86:0x87 # Red Rod L:305:0x86:0x83 # Green Rod L:306:0x86:0x84 # Blue Rod L:307:0x86:0x85 # Divining Rod L:308:0x86:0x8D # White Rod L:309:0x86:0x80 # Lightning Rod L:310:0x86:0x8A # Switch Rod L:311:0x86:0x8E # Transparent Rod L:312:0x86:0x87 angband-v3.3.2/lib/pref/flvr-nmd.prf0000644000175000017500000002615511651552410016560 0ustar chriscchrisc# File: flvr-nmd.prf # # This file defines special attr/char mappings for use in "graphics" mode # # Edited for use with 8x16 tile set by Nomad. # # See "lib/help/command.txt" and "src/files.c" for more information. # ### Rings ### # Plain Gold ring L:1:0x84:0x8A # Alexandrite ring L:2:0x84:0x84 # Amethyst ring L:3:0x84:0x89 # Aquamarine ring L:4:0x84:0x8D # Azurite ring L:5:0x84:0x8D # Beryl ring L:6:0x84:0x8C # Bloodstone ring L:7:0x84:0x82 # Calcite ring L:8:0x84:0x80 # Carnelian ring L:9:0x84:0x83 # Corundum ring L:10:0x84:0x88 # Diamond ring L:11:0x84:0x80 # Emerald ring L:12:0x84:0x84 # Fluorite ring L:13:0x84:0x8C # Garnet ring L:14:0x84:0x83 # Granite ring L:15:0x84:0x81 # Jade ring L:16:0x84:0x8C # Jasper ring L:17:0x84:0x86 # Lapis Lazuli ring L:18:0x84:0x85 # Malachite ring L:19:0x84:0x84 # Marble ring L:20:0x84:0x80 # Moonstone ring L:21:0x84:0x81 # Onyx ring L:22:0x84:0x8B # Opal ring L:23:0x84:0x81 # Pearl ring L:24:0x84:0x80 # Quartz ring L:25:0x84:0x81 # Quartzite ring L:26:0x84:0x81 # Rhodonite ring L:27:0x84:0x8F # Ruby ring L:28:0x84:0x83 # Sapphire ring L:29:0x84:0x85 # Tiger Eye ring L:30:0x84:0x8A # Topaz ring L:31:0x84:0x8A # Turquoise ring L:32:0x84:0x8D # Zircon ring L:33:0x84:0x8E # Platinum ring L:34:0x84:0x80 # Bronze ring L:35:0x84:0x8E # Gold ring L:36:0x84:0x8A # Obsidian ring L:37:0x84:0x87 # Silver ring L:38:0x84:0x81 # Tortoise Shell ring L:39:0x84:0x86 # Mithril ring L:40:0x84:0x8D # Jet ring L:41:0x84:0x87 # Engagement ring L:42:0x84:0x8A # Adamantite ring L:43:0x84:0x8C ### Amulets ### # Amber amulet L:44:0x84:0x9A # Driftwood amulet L:45:0x84:0x94 # Coral amulet L:46:0x84:0x99 # Agate amulet L:47:0x84:0x9E # Ivory amulet L:48:0x84:0x90 # Obsidian amulet L:49:0x84:0x97 # Bone amulet L:50:0x84:0x90 # Brass amulet L:51:0x84:0x9E # Bronze amulet L:52:0x84:0x9E # Pewter amulet L:53:0x84:0x98 # Tortoise Shell amulet L:54:0x84:0x96 # Golden amulet L:55:0x84:0x9A # Azure amulet L:56:0x84:0x9D # Crystal amulet L:57:0x84:0x90 # Silver amulet L:58:0x84:0x91 # Copper amulet L:59:0x84:0x9E # Carved Oak amulet L:60:0x84:0x94 # Dragon Tooth amulet L:61:0x84:0x95 # Ruby amulet L:62:0x84:0x93 # Mithril amulet L:63:0x84:0x9D # Adamant amulet L:64:0x84:0x9C # Flint Stone amulet L:65:0x84:0x98 # Sea Shell amulet L:66:0x84:0x92 # Mother-of-Pearl amulet L:67:0x84:0x9B ### Staves ### # Aspen staff L:68:0x86:0x9B # Balsa staff L:69:0x86:0x99 # Banyan staff L:70:0x86:0x96 # Birch staff L:71:0x86:0x98 # Cedar staff L:72:0x86:0x92 # Cottonwood staff L:73:0x86:0x96 # Cypress staff L:74:0x86:0x96 # Dogwood staff L:75:0x86:0x96 # Elm staff L:76:0x86:0x99 # Eucalyptus staff L:77:0x86:0x99 # Hemlock staff L:78:0x86:0x96 # Hickory staff L:79:0x86:0x96 # Ironwood staff L:80:0x86:0x95 # Locust staff L:81:0x86:0x99 # Mahogany staff L:82:0x86:0x95 # Maple staff L:83:0x86:0x95 # Mulberry staff L:84:0x86:0x95 # Oak staff L:85:0x86:0x96 # Pine staff L:86:0x86:0x99 # Redwood staff L:87:0x86:0x93 # Rosewood staff L:88:0x86:0x93 # Spruce staff L:89:0x86:0x99 # Sycamore staff L:90:0x86:0x99 # Teak staff L:91:0x86:0x96 # Walnut staff L:92:0x86:0x96 # Mistletoe staff L:93:0x86:0x94 # Hawthorn staff L:94:0x86:0x95 # Bamboo staff L:95:0x86:0x9B # Silver staff L:96:0x86:0x91 # Runed staff L:97:0x86:0x97 # Golden staff L:98:0x86:0x9A # Ashen staff L:99:0x86:0x91 # Gnarled staff L:100:0x86:0x95 # Ivory staff L:101:0x86:0x90 # Willow staff L:102:0x86:0x99 ### Wands ### # Aluminium wand L:103:0x86:0x8D # Cast Iron wand L:104:0x86:0x87 # Chromium wand L:105:0x86:0x80 # Copper wand L:106:0x86:0x8E # Gold wand L:107:0x86:0x8A # Iron wand L:108:0x86:0x87 # Magnesium wand L:109:0x86:0x81 # Molybdenum wand L:110:0x86:0x81 # Nickel wand L:111:0x86:0x8E # Rusty wand L:112:0x86:0x83 # Silver wand L:113:0x86:0x81 # Steel wand L:114:0x86:0x81 # Tin wand L:115:0x86:0x87 # Titanium wand L:116:0x86:0x80 # Tungsten wand L:117:0x86:0x80 # Zirconium wand L:118:0x86:0x81 # Zinc wand L:119:0x86:0x81 # Aluminum-Plated wand L:120:0x86:0x8D # Copper-Plated wand L:121:0x86:0x8E # Gold-Plated wand L:122:0x86:0x8A # Nickel-Plated wand L:123:0x86:0x8E # Silver-Plated wand L:124:0x86:0x81 # Steel-Plated wand L:125:0x86:0x81 # Tin-Plated wand L:126:0x86:0x87 # Zinc-Plated wand L:127:0x86:0x81 # Mithril-Plated wand L:128:0x86:0x8D # Mithril wand L:129:0x86:0x8D # Runed wand L:130:0x86:0x86 # Bronze wand L:131:0x86:0x8E # Brass wand L:132:0x86:0x8E # Platinum wand L:133:0x86:0x80 # Lead wand L:134:0x86:0x87 # Lead-Plated wand L:135:0x86:0x87 # Ivory wand L:136:0x86:0x80 # Pewter wand L:137:0x86:0x88 ### Rods ### # Aluminum rod L:138:0x87:0x8D # Cast Iron rod L:139:0x87:0x87 # Chromium rod L:140:0x87:0x80 # Copper rod L:141:0x87:0x8E # Gold rod L:142:0x87:0x8A # Iron rod L:143:0x87:0x87 # Magnesium rod L:144:0x87:0x81 # Molybdenum rod L:145:0x87:0x81 # Nickel rod L:146:0x87:0x8E # Rusty rod L:147:0x87:0x83 # Silver rod L:148:0x87:0x81 # Steel rod L:149:0x87:0x81 # Tin rod L:150:0x87:0x87 # Titanium rod L:151:0x87:0x80 # Tungsten rod L:152:0x87:0x80 # Zirconium rod L:153:0x87:0x81 # Zinc rod L:154:0x87:0x81 # Aluminum-Plated rod L:155:0x87:0x8D # Copper-Plated rod L:156:0x87:0x8E # Gold-Plated rod L:157:0x87:0x8A # Nickel-Plated rod L:158:0x87:0x8E # Silver-Plated rod L:159:0x87:0x81 # Steel-Plated rod L:160:0x87:0x81 # Tin-Plated rod L:161:0x87:0x87 # Zinc-Plated rod L:162:0x87:0x81 # Mithril-Plated rod L:163:0x87:0x8D # Mithril rod L:164:0x87:0x8D # Runed rod L:165:0x87:0x86 # Bronze rod L:166:0x87:0x8E # Brass rod L:167:0x87:0x8E # Platinum rod L:168:0x87:0x80 # Lead rod L:169:0x87:0x87 # Lead-Plated rod L:170:0x87:0x87 # Ivory rod L:171:0x87:0x80 # Pewter rod L:172:0x87:0x88 ### Mushrooms ### # Blue mushroom L:173:0x85:0x95 # Black mushroom L:174:0x85:0x97 # Black Spotted mushroom L:175:0x85:0x97 # Brown mushroom L:176:0x85:0x96 # Dark Blue mushroom L:177:0x85:0x95 # Dark Green mushroom L:178:0x85:0x94 # Dark Red mushroom L:179:0x85:0x93 # Yellow mushroom L:180:0x85:0x9A # Furry mushroom L:181:0x85:0x9E # Green mushroom L:182:0x85:0x94 # Grey mushroom L:183:0x85:0x98 # Light Blue mushroom L:184:0x85:0x9D # Light Green mushroom L:185:0x85:0x9C # Violet mushroom L:186:0x85:0x99 # Red mushroom L:187:0x85:0x93 # Slimy mushroom L:188:0x85:0x91 # Tan mushroom L:189:0x85:0x9E # White mushroom L:190:0x85:0x90 # White Spotted mushroom L:191:0x85:0x90 # Wrinkled mushroom L:192:0x85:0x92 ### Potions ### # Clear potion L:193:0x85:0x80 # Light Brown potion L:194:0x85:0x8E # Icky Green potion L:195:0x85:0x84 # Azure potion L:196:0x85:0x8D # Blue potion L:197:0x85:0x85 # Blue Speckled potion L:198:0x85:0x85 # Black potion L:199:0x85:0x87 # Brown potion L:200:0x85:0x86 # Brown Speckled potion L:201:0x85:0x86 # Bubbling potion L:202:0x85:0x8C # Chartreuse potion L:203:0x85:0x8C # Cloudy potion L:204:0x85:0x8E # Copper Speckled potion L:205:0x85:0x8E # Crimson potion L:206:0x85:0x83 # Cyan potion L:207:0x85:0x8D # Dark Blue potion L:208:0x85:0x85 # Dark Green potion L:209:0x85:0x84 # Dark Red potion L:210:0x85:0x83 # Gold Speckled potion L:211:0x85:0x8A # Green potion L:212:0x85:0x84 # Green Speckled potion L:213:0x85:0x84 # Grey potion L:214:0x85:0x88 # Grey Speckled potion L:215:0x85:0x88 # Hazy potion L:216:0x85:0x81 # Indigo potion L:217:0x85:0x89 # Light Blue potion L:218:0x85:0x8D # Light Green potion L:219:0x85:0x8C # Magenta potion L:220:0x85:0x83 # Metallic Blue potion L:221:0x85:0x85 # Metallic Red potion L:222:0x85:0x83 # Metallic Green potion L:223:0x85:0x84 # Metallic Purple potion L:224:0x85:0x89 # Misty potion L:225:0x85:0x88 # Orange potion L:226:0x85:0x82 # Orange Speckled potion L:227:0x85:0x82 # Pink potion L:228:0x85:0x8B # Pink Speckled potion L:229:0x85:0x8B # Puce potion L:230:0x85:0x89 # Purple potion L:231:0x85:0x89 # Purple Speckled potion L:232:0x85:0x89 # Red potion L:233:0x85:0x83 # Red Speckled potion L:234:0x85:0x83 # Silver Speckled potion L:235:0x85:0x81 # Smoky potion L:236:0x85:0x88 # Tangerine potion L:237:0x85:0x82 # Violet potion L:238:0x85:0x89 # Vermilion potion L:239:0x85:0x83 # White potion L:240:0x85:0x80 # Yellow potion L:241:0x85:0x8A # Violet Speckled potion L:242:0x85:0x89 # Pungent potion L:243:0x85:0x8F # Clotted Red potion L:244:0x85:0x83 # Viscous Pink potion L:245:0x85:0x8B # Oily Yellow potion L:246:0x85:0x8A # Gloopy Green potion L:247:0x85:0x84 # Shimmering potion L:248:0x85:0x89 # Coagulated Crimson potion L:249:0x85:0x83 # Yellow Speckled potion L:250:0x85:0x8A # Gold potion L:251:0x85:0x8A ### Scrolls ### # Scroll L:252:0x87:0x90 # Scroll L:253:0x87:0x90 # Scroll L:254:0x87:0x90 # Scroll L:255:0x87:0x90 # Scroll L:256:0x87:0x90 # Scroll L:257:0x87:0x90 # Scroll L:258:0x87:0x90 # Scroll L:259:0x87:0x90 # Scroll L:260:0x87:0x90 # Scroll L:261:0x87:0x90 # Scroll L:262:0x87:0x90 # Scroll L:263:0x87:0x90 # Scroll L:264:0x87:0x90 # Scroll L:265:0x87:0x90 # Scroll L:266:0x87:0x90 # Scroll L:267:0x87:0x90 # Scroll L:268:0x87:0x90 # Scroll L:269:0x87:0x90 # Scroll L:270:0x87:0x90 # Scroll L:271:0x87:0x90 # Scroll L:272:0x87:0x90 # Scroll L:273:0x87:0x90 # Scroll L:274:0x87:0x90 # Scroll L:275:0x87:0x90 # Scroll L:276:0x87:0x90 # Scroll L:277:0x87:0x90 # Scroll L:278:0x87:0x90 # Scroll L:279:0x87:0x90 # Scroll L:280:0x87:0x90 # Scroll L:281:0x87:0x90 # Scroll L:282:0x87:0x90 # Scroll L:283:0x87:0x90 # Scroll L:284:0x87:0x90 # Scroll L:285:0x87:0x90 # Scroll L:286:0x87:0x90 # Scroll L:287:0x87:0x90 # Scroll L:288:0x87:0x90 # Scroll L:289:0x87:0x90 # Scroll L:290:0x87:0x90 # Scroll L:291:0x87:0x90 # Scroll L:292:0x87:0x90 # Scroll L:293:0x87:0x90 # Scroll L:294:0x87:0x90 # Scroll L:295:0x87:0x90 # Scroll L:296:0x87:0x90 # Scroll L:297:0x87:0x90 # Scroll L:298:0x87:0x90 # Scroll L:299:0x87:0x90 # Scroll L:300:0x87:0x90 # Scroll L:301:0x87:0x90 # Scroll L:302:0x87:0x90 ### New Rods ### # Ceremonial Rod L:303:0x87:0x89 # Black Rod L:304:0x87:0x87 # Red Rod L:305:0x87:0x83 # Green Rod L:306:0x87:0x84 # Blue Rod L:307:0x87:0x85 # Divining Rod L:308:0x87:0x8D # White Rod L:309:0x86:0x80 # Lightning Rod L:310:0x87:0x8A # Switch Rod L:311:0x87:0x8E # Transparent Rod L:312:0x87:0x87 angband-v3.3.2/lib/pref/font-mac.prf0000644000175000017500000000064611651552410016534 0ustar chriscchrisc# File: font-mac.prf # # This file defines special attr/char mappings for use in "text" mode # # See "lib/help/command.txt" and "src/files.c" for more information. # ## OPTION: Display "veins" (white "%") as "normal walls" (white "#") ## This replaces the old method of setting "notice_seams" to false, ## which no longer works as of Angband 2.7.9, for various reasons. # #F:50:1/35 #F:51:1/35 #F:52:1/35 #F:53:1/35 angband-v3.3.2/lib/pref/xtra-dvg.prf0000644000175000017500000001044411651552410016561 0ustar chriscchrisc# File: xtra-new.prf # # This file defines special attr/char mappings for use in "graphics" mode # # Edited for use with David Gervais's 32x32 tiles by Mogami. # # See "lib/help/command.txt" and "src/files.c" for more information. # ##### Remap the player icon ##### ?:[AND [EQU $CLASS Warrior] [EQU $RACE Human] ] R:0:0x83:0x87 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Elf] ] R:0:0x83:0x8f ?:[AND [EQU $CLASS Warrior] [EQU $RACE Elf] ] R:0:0x83:0x97 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Hobbit] ] R:0:0x83:0x9f ?:[AND [EQU $CLASS Warrior] [EQU $RACE Gnome] ] R:0:0x83:0xc7 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dwarf] ] R:0:0x83:0xaf ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Orc] ] R:0:0x83:0xb7 ?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Troll] ] R:0:0x83:0xbf ?:[AND [EQU $CLASS Warrior] [EQU $RACE Dunadan] ] R:0:0x83:0xa7 ?:[AND [EQU $CLASS Warrior] [EQU $RACE High-Elf] ] R:0:0x83:0xcf ?:[AND [EQU $CLASS Warrior] [EQU $RACE Kobold] ] R:0:0x83:0xd7 ?:[AND [EQU $CLASS Mage] [EQU $RACE Human] ] R:0:0x83:0x81 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Elf] ] R:0:0x83:0x88 ?:[AND [EQU $CLASS Mage] [EQU $RACE Elf] ] R:0:0x83:0x91 ?:[AND [EQU $CLASS Mage] [EQU $RACE Hobbit] ] R:0:0x83:0x98 ?:[AND [EQU $CLASS Mage] [EQU $RACE Gnome] ] R:0:0x83:0xc1 ?:[AND [EQU $CLASS Mage] [EQU $RACE Dwarf] ] R:0:0x83:0xa8 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Orc] ] R:0:0x83:0xb1 ?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Troll] ] R:0:0x83:0xb8 ?:[AND [EQU $CLASS Mage] [EQU $RACE Dunadan] ] R:0:0x83:0xa1 ?:[AND [EQU $CLASS Mage] [EQU $RACE High-Elf] ] R:0:0x83:0xc8 ?:[AND [EQU $CLASS Mage] [EQU $RACE Kobold] ] R:0:0x83:0xd1 ?:[AND [EQU $CLASS Priest] [EQU $RACE Human] ] R:0:0x83:0x84 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Elf] ] R:0:0x83:0x8c ?:[AND [EQU $CLASS Priest] [EQU $RACE Elf] ] R:0:0x83:0x94 ?:[AND [EQU $CLASS Priest] [EQU $RACE Hobbit] ] R:0:0x83:0x9c ?:[AND [EQU $CLASS Priest] [EQU $RACE Gnome] ] R:0:0x83:0xc4 ?:[AND [EQU $CLASS Priest] [EQU $RACE Dwarf] ] R:0:0x83:0xac ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Orc] ] R:0:0x83:0xb4 ?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Troll] ] R:0:0x83:0xbc ?:[AND [EQU $CLASS Priest] [EQU $RACE Dunadan] ] R:0:0x83:0xa4 ?:[AND [EQU $CLASS Priest] [EQU $RACE High-Elf] ] R:0:0x83:0xcc ?:[AND [EQU $CLASS Priest] [EQU $RACE Kobold] ] R:0:0x83:0xd4 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Human] ] R:0:0x83:0x86 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Elf] ] R:0:0x83:0x8e ?:[AND [EQU $CLASS Rogue] [EQU $RACE Elf] ] R:0:0x83:0x96 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Hobbit] ] R:0:0x83:0x9e ?:[AND [EQU $CLASS Rogue] [EQU $RACE Gnome] ] R:0:0x83:0xc6 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dwarf] ] R:0:0x83:0xae ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Orc] ] R:0:0x83:0xb6 ?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Troll] ] R:0:0x83:0xbe ?:[AND [EQU $CLASS Rogue] [EQU $RACE Dunadan] ] R:0:0x83:0xa6 ?:[AND [EQU $CLASS Rogue] [EQU $RACE High-Elf] ] R:0:0x83:0xce ?:[AND [EQU $CLASS Rogue] [EQU $RACE Kobold] ] R:0:0x83:0xd6 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Human] ] R:0:0x83:0x85 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Elf] ] R:0:0x83:0x8d ?:[AND [EQU $CLASS Ranger] [EQU $RACE Elf] ] R:0:0x83:0x95 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Hobbit] ] R:0:0x83:0x9d ?:[AND [EQU $CLASS Ranger] [EQU $RACE Gnome] ] R:0:0x83:0xc5 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dwarf] ] R:0:0x83:0xad ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Orc] ] R:0:0x83:0xb5 ?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Troll] ] R:0:0x83:0xbd ?:[AND [EQU $CLASS Ranger] [EQU $RACE Dunadan] ] R:0:0x83:0xa5 ?:[AND [EQU $CLASS Ranger] [EQU $RACE High-Elf] ] R:0:0x83:0xcd ?:[AND [EQU $CLASS Ranger] [EQU $RACE Kobold] ] R:0:0x83:0xd5 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Human] ] R:0:0x83:0x83 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Elf] ] R:0:0x83:0x8b ?:[AND [EQU $CLASS Paladin] [EQU $RACE Elf] ] R:0:0x83:0x93 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Hobbit] ] R:0:0x83:0x9b ?:[AND [EQU $CLASS Paladin] [EQU $RACE Gnome] ] R:0:0x83:0xc3 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dwarf] ] R:0:0x83:0xab ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Orc] ] R:0:0x83:0xb3 ?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Troll] ] R:0:0x83:0xbb ?:[AND [EQU $CLASS Paladin] [EQU $RACE Dunadan] ] R:0:0x83:0xa3 ?:[AND [EQU $CLASS Paladin] [EQU $RACE High-Elf] ] R:0:0x83:0xcb ?:[AND [EQU $CLASS Paladin] [EQU $RACE Kobold] ] R:0:0x83:0xd3 angband-v3.3.2/lib/pref/font-win.prf0000644000175000017500000000143711651552410016570 0ustar chriscchrisc# File: font-win.prf # # This file is used by Angband (when it was compiled using "main-win.c") # to specify simple attr:char remappings using a standard font, allowing # the use of special pseudo-graphic pictures for walls and such. # # Note that this file is extremely similar to the "font-ibm.prf" file, # but it uses different codes, since it uses the special pseudo-graphic # symbols defined in the "lib:xtra:font:*.FON" files, and there is only # one special wall type, so we have to use special "colors". # ### Terrain features ### # Floors (white : centered dot) F:1:all:1:7 # Magma (slate : solid block) F:50:all:2:127 # Quartz (light slate : solid block) F:51:all:9:127 # Granite walls (white : solid block) F:56:all:1:127 # Permanent rock (dark red : solid block) F:60:all:4:127 angband-v3.3.2/lib/user/0000755000175000017500000000000011651552410014333 5ustar chriscchriscangband-v3.3.2/lib/user/Makefile0000644000175000017500000000007711651552410015777 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk PACKAGE = user angband-v3.3.2/lib/Makefile0000644000175000017500000000014311651552410015013 0ustar chriscchriscMKPATH=../mk/ include $(MKPATH)buildsys.mk SUBDIRS = apex edit file help pref save user xtra info angband-v3.3.2/lib/readme.txt0000644000175000017500000001044311651552410015355 0ustar chriscchriscThe "lib" directory contains all of Angband's special sub-directories. === Directory "lib/apex" === The "lib/apex" directory contains the "high score" files. The "scores.raw" file contains the "high score" table, in a "semi-binary" form, that is, all the bytes in the file are normal ascii values, but this includes the special "nul" or "zero" byte, which is used to separate and pad records. You should probably not attempt to modify this file with a normal text editor. This file should be (more or less) portable between different platforms. It must be present (or creatable) for the game to run correctly. === Directory "lib/edit" === The "lib/edit" directory contains various special ascii data files. The *.txt files are ascii template files used to construct the data arrays for the game. These arrays describe the "terrain features", "object kinds", "artifacts", "ego-items", "monster races", and "dungeon vaults", "player races", "player classes", and many other things. The ascii template files are easier to edit than hard-coded arrays, prevent compilation errors on some machines, and also shrink the size of the binary executable, and also provide a user-readable spoiler file of sorts. These files should not be modified unless you know exactly what you are doing. === Directory "lib/file" === The "lib/file" directory contains various special ascii data files. The 'news.txt' file is displayed to the user when the game starts up. It contains basic information such as my name and email address, and the names of some of the people who have been responsible for previous versions of Angband. You may edit this file (slightly) to include local "site specific" information such as who compiled the local executable. You should refer the user to a special "online help" file, if necessary, that describes any local modifications in detail. The first two lines of this file should be blank, and only the next 20 lines should contain information. The 'dead.txt' file is displayed to the user when the player dies. It contains a picture of a tombstone which is filled in with interesting information about the dead player. You should not edit this file. The optional file 'time.txt' may be used to restrict the "times" at which the game may be played, by providing specification of which hours of each day of the week are legal for playing the game. See 'files.c' for more details. A missing file provides no restrictions, and an empty file will, by default, forbid the playing of the game from 8am-5pm on weekdays. This file is only used on multi-user machines, and only if CHECK_TIME is defined, otherwise, there are no restrictions. These files should not be modified unless you know exactly what you are doing. === Directory "lib/help" === The "lib/help" directory contains the "online help" files. This directory is used to search for normal "online help" files. === Directory "lib/info" === The "lib/info" directory contains the "online spoiler" files. This directory is used to search for any "online help" file that cannot be found in the "lib/help" directory. This directory is empty by default. Many people use this directory for "online spoiler files", many of which are available. Simply download whichever spoilers you want and place them in this directory. Note that the default "help.hlp" file allows the "9" key to access a help file called "spoiler.hlp", and allows the "0" key to access "user.hlp". These special help files can thus be placed in the user's own "info" directory to allow the on line help to access his files. === Directory "lib/save" === The "lib/save" directory contains "savefiles" for the players. Each savefile is named "NNN" where "NNN" is the name of the character, or, on some machines, the name of the character, or, on multi-user machines, "UUU.NNN", where "UUU" is the player uid and "NNN" is the character name. The savefiles should be portable between systems, assuming that the appropriate renaming is perfomed. === Directory "lib/pref" === The "lib/user" directory contains the "user pref files", if any. In general, these files are used to "customize" aspects of the game for a given site or a given player. See "src/files.c" for information on the proper "format" of these files. === Directory "lib/xtra" === The "lib/xtra" directory contains special system files, if any. angband-v3.3.2/lib/file/0000755000175000017500000000000011651552410014274 5ustar chriscchriscangband-v3.3.2/lib/file/news.txt0000644000175000017500000000205711651552410016015 0ustar chriscchrisc {yellow} _ _ _ {/} {yellow} / \ _ __ __ _| |__ __ _ _ __ __| |{/} {yellow} / _ \ | '_ \ / _` | '_ \ / _` | '_ \ / _` |{/} {yellow} / ___ \| | | | (_| | |_) | (_| | | | | (_| |{/} {yellow} /_/ \_\_| |_|\__, |_.__/ \__,_|_| |_|\__,_|{/} {yellow} |___/ {/} Version $VERSION Bug reports to For resources and links to places you can talk about the game, please see: http://rephial.org/ -- the home of Angband Based on Moria: Copyright (c) 1985 Robert Alan Koeneke and Umoria: Copyright (c) 1989 James E. Wilson Angband 2.6.2: Alex Cutler, Andy Astrand, Sean Marsh, Geoff Hill, Charles Teague, Charles Swiger 2.7.0 - 2.8.5: Ben Harrison 2.9.0 - 3.0.6: Robert Ruehlmann angband-v3.3.2/lib/file/crown.txt0000644000175000017500000000050411651552410016164 0ustar chriscchrisc25 # ##### # ,,, $$$ ,,, ,,=$ \"$$$$$\" $=,, ,$$ $$$ $$, *> <*> <* $$ $$$ $$ "$$ $$$ $$" "$$ $$$ $$" *#########*#########* *#########*#########* Veni, Vidi, Vici! I came, I saw, I conquered! angband-v3.3.2/lib/file/Makefile0000644000175000017500000000014511651552410015734 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk LIBDATA = crown.txt dead.txt news.txt PACKAGE = file angband-v3.3.2/lib/file/dead.txt0000644000175000017500000000271611651552410015740 0ustar chriscchrisc _______________________ / \ ___ / \ ___ / \ / RIP \ \ : : / \ : _;,,,;_ / \,;_ | | ___ | | / \ | | : : | | _;,,,;_ ____ | | / \ | | : : | | : : | | _;,,,,;_ | | | | | | *| * * * * * * | * _____)/\\_)_/___(\/___(//_\)/_\//__\\(/_|_)__________________________ angband-v3.3.2/lib/edit/0000755000175000017500000000000011651552410014302 5ustar chriscchriscangband-v3.3.2/lib/edit/monster.txt0000644000175000017500000056651411651552410016553 0ustar chriscchrisc# File: monster.txt # This file is used to initialize the "monster race" information for Angband. # Do not modify this file unless you know exactly what you are doing, unless # you wish to risk possible system crashes and broken savefiles. # === Understanding monster.txt === # N: serial number : monster name # T: template name # G: symbol # C: color # I: speed : hit points : vision : armor class : alertness # W: depth : rarity : unused (always 0) : experience for kill # B: attack method : attack effect : damage # S: spell frequency | # S: spell type | spell type | etc # F: flag | flag | etc # -F: flag | flag | etc # D: Description # drop: tval : sval : percent drop chance : min : max # drop-artifact: name # mimic: tval : sval # 'N' indicates the beginning of an entry. The serial number must increase for # each new item. Entry 0 is used for the player. # 'T' is for the template (see monster_base.txt). This provides the # default display symbol, some default flags, and the monster's pain messages. # 'G' is for the display symbol. If present, this overrides the default display # symbol from the template. # 'C' is for color. There are 28 colors, as follows: # d - 0 - Black # w - 1 - White # s - 2 - Slate # o - 3 - Orange # r - 4 - Red # g - 5 - Green # b - 6 - Blue # u - 7 - Umber # D - 8 - Light Dark # W - 9 - Light Slate # P - 10 - Light Purple # y - 11 - yellow # R - 12 - Light Red # G - 13 - Light Green # B - 14 - Light Blue # U - 15 - Light Umber # p - 16 - Purple # v - 17 - Violet # t - 18 - Teal # m - 19 - Mud # Y - 20 - Light Yellow # i - 21 - Magenta-Pink # T - 22 - Light Teal # V - 23 - Light Violet # I - 24 - Light Pink # M - 25 - Mustard # z - 26 - Blue Slate # Z - 27 - Deep Light Blue # currently unused: d, M, t, T # (note that "black" is the same color as the screen background, and thus the # monster will appear to be an empty black space if its color is "d".) # Note to maintainers/devteam: Light Violet (V) is currently used for the # "purple uniques" option. The option makes all uniques appear in this colour # (instead of only Castamir and Waldern). It is therefore unwise to use it # for non-unique monsters. # 'I' is for information--speed, health, vision in tens of feet, armor class, # and alertness. 110 is normal speed. Alertness ranges from 0 (ever vigilant # for intruders) to 255 (prefers to ignore intruders). # 'W' is for more information--level, rarity, and experience for killing. The # third slot is currently unused. # 'B' is for blows--method of attack, effect of attack, and damage from attack. # There may be up to four of these lines; effect and damage are optional. # 'S' is for spells. The first S: line must be S:1_IN_X with X the number of # monster turns, on average, before the monster will cast one of its spells. # X must not be zero. If X is 1, the monster will never move while the player # is in sight, and will thus never attack in melee, as it will cast spells # every turn: if the monster is to use a melee attack, then X must be 2 or # greater. # 'F' is for flags. These are fairly self-explanatory. As many F: lines may be # used as are needed to specify all the flags and flags are separated by the # '|' symbol. # '-F' is for flags to remove from the template. For example, in monster_base.txt, # molds are given HURT_FIRE. We don't want the red mold to have that, so we # add a '-F:HURT_FIRE' line to subtract that flag. # 'D' is for description. As many D: lines may be used as are needed to # describe the monster. Leading whitespace will be removed, and a single space # will be added between D: lines. # 'drop' lines create possible drops for specific monsters. If any L lines are # present, the monster will drop *only* items from its L lines. Each item has # its percent chance rolled for individually. # 'drop-artifact' lines force a specific artifact to drop on death. Setting this # on a non-UNIQUE monster is dangerous. # 'mimic' lines give item types that this monster may mimic. Each of the objects # has an equal chance of being mimicked. # === Understanding monster.txt flags === # UNIQUE monsters are just "special" monster races, with the requirement that # only one monster of that race can exist at a time, and when it is killed, it # can never again be generated. # ATTR_CLEAR monsters appear the same color as the floor, terrain feature or # object underneath them. # ATTR_MULTI monsters are multi-hued--they change color, every player turn. # Their base color is only used to set the initial color when they spawn. # ATTR_FLICKER monsters are also multi-hued--but they only change between a # small range of colors related to their defined color, and they start out # as their defined color. # CHAR_CLEAR monsters are totally invisible: the symbol shown on the screen is # the same as the floor (or other terrain feature) below it, or the item that # is lying on that floor. These monsters can currently be targetted as normal # monsters: perhaps this can be changed so that the player must KNOW the # monster is there (by bumping into it, or having the monster wake up and # attack the player?) # CHAR_MULTI monsters are those which look like objects, and use the symbols of # objects. They are in plain sight, but the character should not know that a # monster is there. At the moment, such monsters can be targetted normally # (which means that this flag currently has no effect), but this may change # in the future, as with CHAR_CLEAR monsters. # (Note that currently both CHAR_CLEAR and CHAR_MULTI monsters are treated as # normal monsters that are just hard to see... if you (l)ook for them, you will # find them unless they are invisible and you cannot see invisible, and if you # use the * command for targetting mode you can pick them as a target.) # TODO: Explain the other monster and spell flags. But maybe in another file. # Version stamp (required) V:3.0.11 ##### Non-race (contains the "player" picture) ##### N:0: T:player C:w ##### Monster races proper ##### ### Dungeon level 0 ### N:1:Filthy street urchin T:townsfolk C:D I:110:3:4:1:40 W:0:2:0:0 B:BEG B:TOUCH:EAT_GOLD F:MALE | FRIENDS F:RAND_25 | OPEN_DOOR | TAKE_ITEM D:He looks squalid and thoroughly revolting. N:2:Scrawny cat T:feline C:U I:110:2:30:1:10 W:0:3:0:0 B:CLAW:HURT:1d1 F:RAND_25 D:A skinny little furball with sharp claws and a menacing look. N:3:Scruffy little dog T:canine C:U I:110:2:20:1:5 W:0:3:0:0 B:BITE:HURT:1d1 F:RAND_25 D:A thin flea-ridden mutt, growling as you get close. N:4:Farmer Maggot T:humanoid C:w I:110:350:40:12:3 W:0:4:0:0 B:MOAN B:MOAN F:UNIQUE | MALE | HAS_LIGHT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:NO_CONF | NO_SLEEP D:He's lost his dogs. He's had his mushrooms stolen. He's not a happy hobbit! N:5:Blubbering idiot T:townsfolk C:W I:110:2:6:1:0 W:0:1:0:0 B:DROOL F:MALE F:RAND_25 | TAKE_ITEM D:He tends to blubber a lot. N:6:Boil-covered wretch T:townsfolk C:g I:110:2:6:1:0 W:0:1:0:0 B:DROOL F:MALE F:RAND_25 | OPEN_DOOR | BASH_DOOR | TAKE_ITEM D:Ugly doesn't begin to describe him. N:7:Village idiot T:townsfolk C:G I:120:10:6:1:0 W:0:1:0:0 B:DROOL F:MALE F:RAND_25 | TAKE_ITEM D:Drooling and comical, but then, what do you expect? N:8:Pitiful-looking beggar T:townsfolk C:U I:110:3:10:1:40 W:0:1:0:0 B:BEG F:MALE F:RAND_25 | OPEN_DOOR | TAKE_ITEM D:You just can't help feeling sorry for him. N:9:Mangy-looking leper T:townsfolk C:u I:110:1:10:1:50 W:0:1:0:0 B:BEG F:MALE F:RAND_25 | OPEN_DOOR | TAKE_ITEM D:You feel it isn't safe to touch him. N:10:Squint-eyed rogue T:townsfolk C:b I:110:9:10:9:99 W:0:1:0:0 B:HIT:HURT:1d6 B:TOUCH:EAT_ITEM B:INSULT F:MALE | EVIL F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM D:A hardy, street-wise crook that knows an easy catch when it sees one. N:11:Singing, happy drunk T:townsfolk C:y I:110:4:10:1:0 W:0:1:0:0 B:BEG F:MALE | HAS_LIGHT F:DROP_40 | ONLY_GOLD F:RAND_50 | OPEN_DOOR | BASH_DOOR | TAKE_ITEM D:He makes you glad to be sober. N:12:Aimless-looking merchant T:townsfolk C:o I:110:6:10:1:255 W:0:1:0:0 B:HIT:HURT:1d3 F:MALE | HAS_LIGHT F:DROP_40 | ONLY_GOLD F:RAND_50 | OPEN_DOOR | BASH_DOOR | TAKE_ITEM D:The typical ponce around town, with purse jingling, and looking for more D: amulets of adornment to buy. N:13:Mean-looking mercenary T:townsfolk C:r I:110:23:10:24:250 W:0:1:0:0 B:HIT:HURT:1d10 F:MALE | EVIL | HAS_LIGHT F:DROP_40 F:RAND_50 | OPEN_DOOR | BASH_DOOR | TAKE_ITEM D:No job is too low for him. N:14:Battle-scarred veteran T:townsfolk C:B I:110:32:10:36:250 W:0:1:0:0 B:HIT:HURT:2d6 F:MALE | HAS_LIGHT F:DROP_40 F:RAND_50 | OPEN_DOOR | BASH_DOOR | TAKE_ITEM D:He doesn't take to strangers kindly. ### Dungeon level 1 ### N:15:Grey mold T:mold C:s I:110:2:2:1:0 W:1:1:0:3 B:SPORE:HURT:1d4 B:SPORE:HURT:1d4 F:EMPTY_MIND | STUPID D:A small strange grey growth. N:16:Grey mushroom patch T:mushroom C:s I:110:2:2:1:0 W:1:1:0:1 B:SPORE:CONFUSE:1d4 F:IM_POIS | NEVER_MOVE D:Yum! It looks quite tasty. N:17:Giant yellow centipede T:centipede C:y I:110:7:8:14:30 W:1:1:0:2 B:BITE:HURT:1d3 B:STING:HURT:1d3 D:It is about four feet long and carnivorous. N:18:Giant white centipede T:centipede C:w I:110:9:7:12:40 W:1:1:0:2 B:BITE:HURT:1d2 B:STING:HURT:1d2 F:RAND_50 | BASH_DOOR D:It is about four feet long and carnivorous. N:19:White icky thing T:icky thing C:w I:110:6:12:8:10 W:1:1:0:1 B:TOUCH:HURT:1d2 F:EMPTY_MIND F:RAND_25 D:It is a smallish, slimy, icky creature. N:20:Clear icky thing T:icky thing C:w I:110:6:12:7:10 W:1:1:0:2 B:TOUCH:HURT:1d2 F:INVISIBLE | EMPTY_MIND F:RAND_25 F:ATTR_CLEAR D:It is a smallish, slimy, icky, blobby creature. N:21:Giant white mouse T:rodent C:w I:110:2:8:4:20 W:1:1:0:1 B:BITE:HURT:1d2 F:MULTIPLY F:RAND_50 D:It is about three feet long with large teeth. N:22:Large brown snake T:snake C:u I:100:14:4:42:99 W:1:1:0:3 B:BITE:HURT:1d3 B:CRUSH:HURT:1d4 F:RAND_25 D:It is about eight feet long. N:23:Large white snake T:snake C:w I:100:11:4:36:99 W:1:1:0:2 B:BITE:HURT:1d1 B:CRUSH:HURT:1d1 F:RAND_50 D:It is about eight feet long. N:24:Small kobold T:kobold C:y I:110:8:20:24:10 W:1:1:0:5 B:HIT:HURT:1d5 F:DROP_60 D:It is a squat and ugly humanoid figure with a canine face. N:26:White worm mass T:worm C:w I:100:10:7:1:10 W:1:1:0:2 B:CRAWL:POISON:1d2 F:WEIRD_MIND | MULTIPLY | STUPID F:RAND_25 | RAND_50 F:HURT_LIGHT | IM_POIS | NO_FEAR D:It is a large slimy mass of worms. N:27:Floating eye T:eye C:o I:110:11:2:7:10 W:1:1:0:1 B:GAZE:PARALYZE F:NEVER_MOVE F:HURT_LIGHT | NO_FEAR D:A disembodied eye, floating a few feet above the ground. N:28:Rock lizard T:reptile C:U I:110:8:20:4:15 W:1:1:0:2 B:BITE:HURT:1d1 D:It is a small lizard with a hardened hide. N:29:Jackal T:canine C:U I:110:3:10:3:10 W:1:1:0:1 B:BITE:HURT:1d1 F:FRIENDS D:It is a yapping snarling dog, dangerous when in a pack. N:30:Soldier ant T:ant C:W I:110:6:10:4:10 W:1:1:0:3 B:BITE:HURT:1d2 D:A large ant with powerful mandibles. N:31:Fruit bat T:bat C:o I:120:4:20:3:10 W:1:1:0:1 B:BITE:HURT:1d1 D:A fast-moving pest. ### Dungeon level 2 ### N:25:Kobold T:kobold C:G I:110:12:20:24:10 W:2:1:0:5 B:HIT:HURT:1d8 F:DROP_60 D:It is a small, dog-headed humanoid. N:32:Shrieker mushroom patch T:mushroom C:R I:110:1:4:1:0 W:2:1:0:1 F:NEVER_BLOW | NEVER_MOVE F:IM_POIS F:FORCE_SLEEP S:1_IN_4 S:SHRIEK D:Yum! It looks quite tasty. It doesn't sound so nice, though... N:33:Blubbering icky thing T:icky thing C:W I:110:18:14:4:10 W:2:1:0:8 B:CRAWL:POISON:1d4 B:CRAWL:EAT_FOOD F:EMPTY_MIND F:KILL_BODY | TAKE_ITEM F:IM_POIS D:It is a smallish, slimy, icky, hungry creature. N:34:Metallic green centipede T:centipede C:g I:120:10:5:4:10 W:2:1:0:3 B:CRAWL:HURT:1d1 F:RAND_50 | BASH_DOOR D:It is about four feet long and carnivorous. N:35:Soldier T:person C:u I:110:23:20:24:5 W:2:1:0:6 B:HIT:HURT:1d7 B:HIT:HURT:1d7 F:MALE | HAS_LIGHT | FRIEND F:DROP_60 F:OPEN_DOOR D:An inexperienced but tough warrior. N:36:Cutpurse T:person C:b I:110:20:20:18:5 W:2:1:0:6 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD F:MALE | EVIL | FRIEND F:DROP_60 F:OPEN_DOOR | TAKE_ITEM D:A rather shifty individual. N:37:Acolyte T:person C:g I:110:18:20:15:10 W:2:1:0:6 B:HIT:HURT:1d5 F:MALE | HAS_LIGHT | FRIEND F:DROP_60 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_12 S:CAUSE_1 | HEAL | SCARE D:He is tripping over his priestly robes. N:38:Apprentice T:person C:r I:110:15:20:9:5 W:2:1:0:6 B:HIT:HURT:1d4 F:MALE | HAS_LIGHT | FRIEND F:DROP_60 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_12 S:BLIND | BLINK | CONF | MISSILE D:He is leaving behind a trail of dropped spell components. N:39:Yellow mushroom patch T:mushroom C:y I:110:1:2:1:0 W:2:1:0:2 B:SPORE:TERRIFY:1d6 F:NEVER_MOVE F:IM_POIS D:Yum! It looks quite tasty. N:40:White jelly T:jelly C:w I:120:36:2:1:99 W:2:1:0:10 B:TOUCH:POISON:1d2 F:NEVER_MOVE F:HURT_LIGHT | IM_POIS | HURT_COLD | NO_CONF | NO_SLEEP D:It's a large pile of white flesh. N:41:Giant green frog T:reptile C:g I:110:9:12:9:30 W:2:1:0:6 B:BITE:HURT:1d3 F:RAND_25 | BASH_DOOR D:It is as big as a wolf. N:42:Giant black ant T:ant C:D I:110:11:8:24:80 W:2:1:0:8 B:BITE:HURT:1d4 F:RAND_25 D:It is about three feet long. N:43:Salamander T:reptile C:o I:110:14:8:24:80 W:2:1:0:10 B:BITE:FIRE:1d3 F:RAND_25 F:IM_FIRE D:A small black and orange lizard. N:44:White harpy T:hybrid C:w I:110:6:16:20:10 W:2:1:0:5 B:CLAW:HURT:1d1 B:CLAW:HURT:1d1 B:BITE:HURT:1d2 F:FEMALE | EVIL | ANIMAL F:RAND_50 D:A flying, screeching bird with a woman's face. N:45:Blue yeek T:yeek C:b I:110:7:18:16:10 W:2:1:0:4 B:HIT:HURT:1d5 F:DROP_60 D:A small humanoid figure. N:46:Grip, Farmer Maggot's dog T:canine C:y I:120:25:30:36:0 W:2:1:0:30 B:BITE:HURT:1d4 F:UNIQUE F:RAND_25 | BASH_DOOR F:NO_CONF | NO_SLEEP D:A rather vicious dog belonging to Farmer Maggot. It thinks you are stealing D: mushrooms. N:47:Fang, Farmer Maggot's dog T:canine C:y I:120:25:30:36:0 W:2:1:0:30 B:BITE:HURT:1d4 F:UNIQUE F:RAND_25 | BASH_DOOR F:NO_CONF | NO_SLEEP D:A rather vicious dog belonging to Farmer Maggot. It thinks you are stealing D: mushrooms. N:48:Green worm mass T:worm C:g I:100:15:7:3:10 W:2:1:0:3 B:CRAWL:ACID:1d3 F:WEIRD_MIND | MULTIPLY | STUPID F:RAND_25 | RAND_50 F:HURT_LIGHT | IM_ACID | NO_FEAR D:It is a large slimy mass of worms. N:49:Large yellow snake T:snake C:y I:100:18:5:45:75 W:2:1:0:9 B:BITE:HURT:1d4 B:CRUSH:HURT:1d6 F:RAND_25 D:It is about ten feet long. N:50:Cave spider T:spider C:p I:120:7:8:19:80 W:2:1:0:7 B:BITE:HURT:1d4 F:ANIMAL | WEIRD_MIND | FRIENDS D:It is a black spider that moves in fits and starts. N:51:Wild cat T:feline C:U I:120:9:40:14:0 W:2:2:0:8 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 F:BASH_DOOR D:A larger than normal feline, hissing loudly. Its velvet paws conceal a D: fistful of needles. N:559:Crow T:bird C:s I:120:9:40:14:0 W:2:2:0:8 B:BITE:HURT:1d3 B:BITE:HURT:1d3 D:It is a hooded crow, gray except for the black wings and head. ### Dungeon level 3 ### N:52:Sm['e]agol T:humanoid C:B I:130:400:20:14:5 W:3:2:0:50 B:TOUCH:EAT_GOLD:1d4 F:UNIQUE | MALE | EVIL | INVISIBLE F:DROP_1 | DROP_GOOD | DROP_GREAT F:RAND_25 | RAND_50 | TAKE_ITEM F:HURT_LIGHT D:Usually known as Gollum. He's been sneaking, and he wants his 'precious.' N:53:Green ooze T:jelly C:g I:120:8:8:19:80 W:3:2:0:4 B:CRAWL:ACID:1d3 F:DROP_60 F:RAND_25 | RAND_50 F:IM_ACID | IM_POIS | HURT_COLD | NO_CONF | NO_SLEEP D:It's green and it's oozing. N:54:Poltergeist T:ghost C:W I:130:6:8:18:10 W:3:1:0:8 B:TOUCH:TERRIFY F:DROP_40 | DROP_60 F:RAND_25 | RAND_50 | TAKE_ITEM F:HURT_LIGHT | IM_COLD | IM_POIS S:1_IN_15 S:BLINK D:It is a ghastly, ghostly form. N:55:Metallic blue centipede T:centipede C:b I:120:12:6:7:15 W:3:1:0:7 B:CRAWL:HURT:1d2 F:RAND_50 | BASH_DOOR D:It is about four feet long and carnivorous. N:56:Giant white louse T:louse C:w I:120:1:6:6:10 W:3:1:0:1 B:BITE:HURT:1d1 F:RAND_25 D:It is six inches long. N:57:Black naga T:naga C:D I:110:27:16:60:120 W:3:1:0:20 B:CRUSH:HURT:1d8 F:DROP_60 F:RAND_25 D:A large black serpent's body with a female torso. N:58:Spotted mushroom patch T:mushroom C:o I:110:1:2:1:0 W:3:1:0:3 B:SPORE:POISON:2d4 F:NEVER_MOVE F:IM_POIS D:Yum! It looks quite tasty. N:59:Silver jelly T:jelly C:W I:120:45:2:1:99 W:3:2:0:12 B:TOUCH:EAT_LIGHT:1d3 B:TOUCH:EAT_LIGHT:1d3 F:NEVER_MOVE F:HURT_LIGHT | IM_POIS | HURT_COLD | NO_CONF | NO_SLEEP S:1_IN_15 S:DRAIN_MANA D:It is a large pile of silver flesh that sucks all light from its surroundings. N:60:Yellow jelly T:jelly C:y I:120:45:2:1:99 W:3:1:0:12 B:TOUCH:POISON:1d3 F:NEVER_MOVE F:HURT_LIGHT | IM_POIS | HURT_COLD | NO_CONF | NO_SLEEP S:1_IN_15 S:DRAIN_MANA D:It's a large pile of yellow flesh. N:61:Scruffy looking hobbit T:humanoid C:b I:110:9:16:9:10 W:3:1:0:4 B:HIT:HURT:1d4 B:TOUCH:EAT_GOLD F:MALE | EVIL F:DROP_60 F:TAKE_ITEM D:A short little guy, in bedraggled clothes. He appears to be looking for a D: good tavern. N:62:Giant white ant T:ant C:w I:110:11:8:19:80 W:3:1:0:7 B:BITE:HURT:1d4 D:It is about two feet long and has sharp pincers. N:63:Yellow mold T:mold C:y I:110:36:2:12:99 W:3:1:0:9 B:SPORE:HURT:1d4 F:EMPTY_MIND | STUPID D:It is a strange yellow growth on the dungeon floor. N:64:Metallic red centipede T:centipede C:r I:120:18:8:10:20 W:3:1:0:12 B:CRAWL:HURT:1d2 F:RAND_25 | BASH_DOOR D:It is about four feet long and carnivorous. N:65:Yellow worm mass T:worm C:y I:100:18:7:4:10 W:3:2:0:4 B:CRAWL:LOSE_DEX:1d3 F:WEIRD_MIND | MULTIPLY | STUPID F:RAND_25 | RAND_50 F:HURT_LIGHT | NO_FEAR D:It is a large slimy mass of worms. N:66:Clear worm mass T:worm C:w I:100:10:7:1:10 W:3:2:0:4 B:CRAWL:POISON:1d2 F:WEIRD_MIND | INVISIBLE | MULTIPLY | STUPID F:RAND_25 | RAND_50 F:HURT_LIGHT | IM_POIS | NO_FEAR F:ATTR_CLEAR D:It is a disgusting mass of poisonous worms. N:67:Radiation eye T:eye C:R I:110:11:2:7:10 W:3:1:0:6 B:GAZE:LOSE_STR:1d6 F:NEVER_MOVE F:HURT_LIGHT | NO_FEAR S:1_IN_11 S:DRAIN_MANA D:A disembodied eye, crackling with energy. N:604:Kobold shaman T:kobold C:r I:110:11:20:24:10 W:3:1:0:15 B:HIT:HURT:1d8 F:DROP_40 S:1_IN_5 S:CAUSE_1 | CONF | HEAL | MISSILE D:It is a kobold dressed in skins and gesturing wildly. ### Dungeon level 4 ### N:68:Cave lizard T:reptile C:u I:110:11:8:19:80 W:4:1:0:8 B:BITE:HURT:1d5 D:It is an armoured lizard with a powerful bite. N:69:Scout T:person C:W I:110:27:20:12:5 W:4:1:0:18 B:HIT:HURT:1d5 B:HIT:HURT:1d5 F:MALE | HAS_LIGHT | FRIEND F:DROP_60 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_9 S:ARROW_1 | MISSILE D:An agile hunter, ready and relaxed. N:70:Gallant T:person C:w I:110:27:20:24:5 W:4:1:0:18 B:HIT:HURT:1d7 B:HIT:HURT:1d7 F:MALE | HAS_LIGHT | FRIEND F:DROP_60 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_9 S:CAUSE_1 | SCARE D:An adventurer both devoutly religious and skillful in combat. N:71:Blue jelly T:jelly C:b I:110:54:2:1:99 W:4:1:0:14 B:TOUCH:COLD:1d6 F:COLD_BLOOD F:NEVER_MOVE F:HURT_LIGHT | IM_COLD | NO_CONF | NO_SLEEP D:It's a large pile of pulsing blue flesh. N:72:Creeping copper coins T:creeping coins C:u I:100:32:3:28:10 W:4:3:0:9 B:HIT:HURT:1d4 B:TOUCH:POISON:2d4 F:DROP_2 D:It appears to be a pile of copper coins. mimic:gold:copper N:73:Giant white rat T:rodent C:W I:110:3:8:8:30 W:4:1:0:1 B:BITE:POISON:1d3 F:MULTIPLY F:RAND_25 D:It is a very vicious rodent. N:74:Blue worm mass T:worm C:b I:100:23:7:14:10 W:4:1:0:5 B:CRAWL:COLD:1d4 F:COLD_BLOOD | WEIRD_MIND | MULTIPLY | STUPID F:RAND_25 | RAND_50 F:HURT_LIGHT | IM_COLD | NO_FEAR D:It is a large slimy mass of worms. N:75:Large grey snake T:snake C:s I:100:27:6:61:50 W:4:1:0:14 B:BITE:HURT:1d5 B:CRUSH:HURT:1d8 F:RAND_25 D:It is about ten feet long. N:94:Kobold archer T:kobold C:W I:110:24:20:24:10 W:4:1:0:20 B:HIT:HURT:1d9 F:DROP_40 S:1_IN_5 S:ARROW_2 D:It is an ugly dog-headed humanoid wielding a bow. N:548:Silver mouse T:rodent C:W I:110:2:8:4:20 W:4:1:0:1 B:BITE:EAT_LIGHT:1d2 F:MULTIPLY F:RAND_50 D:It is about three feet long with large teeth. As the light of your lamp falls D: on it, it seems to grow stronger. N:560:Raven T:bird C:D I:120:12:40:14:0 W:4:2:0:10 B:BITE:HURT:1d4 B:BITE:HURT:1d4 D:Larger than a crow, and pitch black. ### Dungeon level 5 ### N:76:Bullroarer the Hobbit T:humanoid C:U I:120:60:16:12:10 W:5:3:0:90 B:HIT:HURT:1d8 B:HIT:HURT:1d8 F:UNIQUE | MALE F:DROP_2 | DROP_GOOD | ONLY_ITEM D:He is a sturdy hobbit who is renowned for his unusual strength and vigour. He D: can prove a troublesome opponent. N:78:Green naga T:naga C:g I:110:41:18:48:120 W:5:1:0:30 B:CRUSH:HURT:1d8 B:SPIT:ACID:2d6 F:DROP_60 F:RAND_25 | TAKE_ITEM F:IM_ACID D:A large green serpent with a female's torso. Her green skin glistens with D: acid. N:79:Blue ooze T:jelly C:b I:110:8:8:19:80 W:5:1:0:7 B:CRAWL:COLD:1d4 F:DROP_40 F:RAND_25 | RAND_50 F:IM_COLD | NO_CONF | NO_SLEEP D:It's blue and it's oozing. N:80:Green glutton ghost T:ghost C:g I:130:8:10:24:10 W:5:1:0:15 B:TOUCH:EAT_FOOD:1d1 F:DROP_40 | DROP_60 F:RAND_25 | RAND_50 D:It is a very ugly green ghost with a voracious appetite. N:81:Green jelly T:jelly C:g I:120:99:2:1:99 W:5:1:0:18 B:TOUCH:ACID:1d2 F:NEVER_MOVE F:HURT_LIGHT | IM_ACID | HURT_COLD | NO_CONF | NO_SLEEP D:It is a large pile of pulsing green flesh. N:82:Large kobold T:kobold C:b I:110:65:20:48:30 W:5:1:0:25 B:HIT:HURT:1d10 F:DROP_60 D:It is a man-sized figure with the all too recognizable face of a kobold. N:83:Skeleton kobold T:skeleton C:w I:110:23:20:39:40 W:5:1:0:12 B:HIT:HURT:1d6 F:EMPTY_MIND F:OPEN_DOOR | BASH_DOOR D:It is a small animated kobold skeleton. N:84:Grey icky thing T:icky thing C:s I:110:18:14:14:15 W:5:1:0:10 B:TOUCH:HURT:1d5 F:EMPTY_MIND D:It is a smallish, slimy, icky, nasty creature. N:85:Disenchanter eye T:eye C:v I:100:32:2:7:10 W:5:2:0:20 B:GAZE:UN_BONUS F:NEVER_MOVE F:HURT_LIGHT | RES_DISE | NO_FEAR F:ATTR_MULTI S:1_IN_9 S:DRAIN_MANA D:A disembodied eye, crackling with magic. N:86:Red worm mass T:worm C:r I:100:23:7:14:10 W:5:1:0:6 B:CRAWL:FIRE:1d6 F:WEIRD_MIND | MULTIPLY | STUPID F:RAND_25 | RAND_50 | BASH_DOOR F:HURT_LIGHT | IM_FIRE | NO_FEAR D:It is a large slimy mass of worms. N:87:Copperhead snake T:snake C:o I:110:14:6:30:1 W:5:1:0:15 B:BITE:POISON:2d4 F:RAND_50 F:IM_POIS D:It has a copper head and sharp venomous fangs. N:549:Rot jelly T:jelly C:u I:120:90:2:36:99 W:5:1:0:15 B:TOUCH:EAT_FOOD:2d3 B:TOUCH:LOSE_CHR:2d3 F:NEVER_MOVE F:HURT_LIGHT | IM_POIS | HURT_COLD | NO_CONF | NO_SLEEP D:It is a large pile of rotting flesh, whose touch spoils your food. The D: terrible smell it exudes is also very hard to get rid of... ### Dungeon level 6 ### #N:77:Wizard's apprentice #Deleted N:88:Purple mushroom patch T:mushroom C:P I:110:1:2:1:0 W:6:2:0:15 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 F:NEVER_MOVE D:Yum! It looks quite tasty. #N:89:Adept #Deleted #N:90:Soldier #Deleted #N:91:Footpad #Deleted N:92:Brown mold T:mold C:u I:110:68:2:14:99 W:6:1:0:20 B:SPORE:CONFUSE:1d4 F:EMPTY_MIND | STUPID D:A strange brown growth on the dungeon floor. N:93:Giant brown bat T:bat C:u I:130:14:10:18:30 W:6:1:0:10 B:BITE:HURT:1d3 F:RAND_50 D:It screeches as it attacks. N:95:Creeping silver coins T:creeping coins C:s I:100:54:4:36:10 W:6:3:0:18 B:HIT:HURT:1d6 B:TOUCH:POISON:2d6 F:DROP_2 D:It appears to be a pile of silver coins. mimic:gold:silver N:96:Snaga T:orc C:U I:110:36:20:48:30 W:6:1:0:15 B:HIT:HURT:1d8 F:FRIENDS F:DROP_20 F:HURT_LIGHT D:He is one of the many weaker 'slave' orcs, often mistakenly known as a goblin. N:97:Rattlesnake T:snake C:r I:110:24:6:36:1 W:6:1:0:20 B:BITE:POISON:2d5 F:RAND_50 F:IM_POIS D:It is recognized by the hard-scaled end of its body that is often rattled to D: frighten its prey. ### Dungeon level 7 ### N:98:Cave orc T:orc C:G I:110:55:20:48:30 W:7:1:0:20 B:HIT:HURT:1d8 F:FRIENDS F:DROP_20 F:HURT_LIGHT D:He is often found in huge numbers in deep caves. N:99:Wood spider T:spider C:U I:120:11:8:19:80 W:7:3:0:15 B:BITE:HURT:1d3 B:STING:POISON:1d4 F:ANIMAL | WEIRD_MIND | FRIENDS F:IM_POIS D:It scuttles towards you. N:100:Manes T:minor demon C:u I:110:36:20:48:30 W:7:2:0:16 B:HIT:HURT:1d8 F:FRIENDS F:OPEN_DOOR | BASH_DOOR F:NO_FEAR D:It is a minor but aggressive demon. N:101:Bloodshot eye T:eye C:r I:110:45:2:7:10 W:7:3:0:15 B:GAZE:BLIND:2d6 F:NEVER_MOVE F:HURT_LIGHT | NO_FEAR S:1_IN_7 S:DRAIN_MANA D:A disembodied eye, bloodshot and nasty. N:102:Red naga T:naga C:r I:110:50:20:48:120 W:7:2:0:40 B:CRUSH:HURT:1d10 B:BITE:LOSE_STR:1d4 F:DROP_60 F:RAND_25 | TAKE_ITEM D:A large red snake with a woman's torso. N:103:Red jelly T:jelly C:r I:110:117:2:1:99 W:7:1:0:26 B:TOUCH:LOSE_STR:1d5 F:NEVER_MOVE F:HURT_LIGHT | HURT_COLD | NO_CONF | NO_SLEEP D:It is a large pulsating mound of red flesh. N:104:Giant red frog T:reptile C:r I:110:23:12:19:50 W:7:1:0:16 B:BITE:LOSE_STR:2d4 F:RAND_50 | BASH_DOOR D:It looks poisonous. N:105:Green icky thing T:icky thing C:g I:110:23:14:14:20 W:7:2:0:18 B:TOUCH:ACID:2d5 F:EMPTY_MIND F:IM_ACID D:It is a smallish, slimy, icky, acidic creature. N:106:Zombified kobold T:zombie C:s I:110:27:20:21:30 W:7:1:0:14 B:HIT:HURT:1d2 B:HIT:HURT:1d2 F:EMPTY_MIND F:NO_FEAR D:It is an animated kobold corpse. Flesh falls off in large chunks as it D: shambles forward. N:107:Lost soul T:ghost C:B I:110:9:12:12:10 W:7:2:0:18 B:HIT:HURT:2d2 B:TOUCH:LOSE_WIS F:DROP_40 | DROP_60 F:RAND_50 | TAKE_ITEM F:IM_COLD S:1_IN_15 S:DRAIN_MANA | TPORT D:It is almost insubstantial. N:108:Dark elf T:humanoid C:D I:110:39:20:24:20 W:7:2:0:25 B:HIT:HURT:1d6 B:HIT:HURT:1d6 F:MALE | EVIL F:DROP_60 F:HURT_LIGHT F:FORCE_SLEEP S:1_IN_10 S:CONF | DARKNESS D:An elven figure with jet black skin and white hair, his eyes are large and D: twisted with evil. N:109:Night lizard T:reptile C:b I:110:18:20:19:30 W:7:2:0:35 B:BITE:HURT:1d6 B:BITE:HURT:1d6 D:It is a black lizard with overlapping scales and a powerful jaw. N:110:Mughash the Kobold Lord T:kobold C:v I:110:150:20:30:20 W:7:3:0:100 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 F:UNIQUE | MALE |ESCORT | ESCORTS F:DROP_1 | DROP_GOOD | ONLY_ITEM D:Strong and powerful, for a kobold. ### Dungeon level 8 ### N:111:Wormtongue, Agent of Saruman T:person C:B I:110:250:20:45:20 W:8:1:0:150 B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:TOUCH:EAT_GOLD B:INSULT F:UNIQUE | MALE | EVIL F:DROP_1 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM F:FORCE_SLEEP S:1_IN_5 S:HEAL | SLOW | TRAPS S:BA_POIS S:BO_COLD D:He's been spying for Saruman. He is a snivelling wretch with no morals and D: disgusting habits. N:112:Lagduf, the Snaga T:orc C:y I:110:190:20:48:30 W:8:2:0:80 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d9 B:HIT:HURT:1d9 F:UNIQUE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM D:A captain of a regiment of weaker orcs, Lagduf keeps his troop in order with D: displays of excessive violence. N:113:Brown yeek T:yeek C:u I:110:18:18:21:10 W:8:1:0:11 B:HIT:HURT:1d6 F:DROP_40 D:It is a strange small humanoid. #N:114:Tracker #Deleted N:115:Giant salamander T:reptile C:y I:110:24:6:60:1 W:8:1:0:50 B:BITE:FIRE:3d6 F:RAND_25 F:IM_FIRE F:FORCE_SLEEP S:1_IN_9 S:BR_FIRE D:A large black and yellow lizard. You'd better run away! N:116:Green mold T:mold C:g I:110:95:2:16:75 W:8:1:0:28 B:SPORE:TERRIFY:1d4 F:EMPTY_MIND | STUPID F:IM_ACID D:It is a strange growth on the dungeon floor. N:117:Skeleton orc T:skeleton C:w I:110:45:20:54:40 W:8:1:0:26 B:HIT:HURT:2d5 F:ORC | EMPTY_MIND F:OPEN_DOOR | BASH_DOOR D:It is an animated orc skeleton. #N:118:Honor guard #Deleted N:119:Lemure T:minor demon C:U I:110:65:20:48:30 W:8:3:0:16 B:HIT:HURT:1d8 F:FRIENDS F:OPEN_DOOR | BASH_DOOR F:NO_FEAR D:It is the larval form of a major demon. N:120:Hill orc T:orc C:u I:110:65:20:48:30 W:8:1:0:25 B:HIT:HURT:1d10 F:FRIENDS F:DROP_20 D:He is a hardy well-weathered survivor. N:121:Bandit T:person C:b I:110:36:20:28:10 W:8:2:0:26 B:HIT:HURT:2d4 B:TOUCH:EAT_GOLD F:MALE | EVIL F:DROP_1 F:OPEN_DOOR | TAKE_ITEM D:He is after your cash! N:598:Nighthawk T:bird C:u I:120:36:30:30:10 W:8:2:0:22 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 F:NO_FEAR D:Trained to hunt and kill without fear. ### Dungeon level 9 ### N:122:Yeti T:yeti C:w I:110:55:20:36:10 W:9:3:0:30 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 D:A large white figure covered in shaggy fur. N:123:Bloodshot icky thing T:icky thing C:r I:110:32:14:21:20 W:9:3:0:24 B:TOUCH:HURT:1d4 B:CRAWL:ACID:2d4 F:EMPTY_MIND F:IM_POIS S:1_IN_11 S:DRAIN_MANA D:It is a strange, slimy, icky creature. N:124:Giant grey rat T:rodent C:s I:110:4:8:14:20 W:9:1:0:2 B:BITE:POISON:1d4 F:MULTIPLY F:RAND_25 F:IM_POIS D:It is a rodent of unusual size. N:125:Black harpy T:hybrid C:D I:120:14:16:26:10 W:9:1:0:19 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:HURT:1d3 F:FEMALE | EVIL | ANIMAL F:RAND_25 D:A woman's face on the body of a vicious black bird. N:126:Orc shaman T:orc C:r I:110:41:20:22:20 W:9:1:0:30 B:HIT:HURT:1d6 B:HIT:HURT:1d6 F:DROP_60 F:HURT_LIGHT F:FORCE_SLEEP S:1_IN_8 S:BLINK | CAUSE_1 | MISSILE D:An orc dressed in skins who gestures wildly. N:127:Baby blue dragon T:dragon C:b I:110:88:20:36:70 W:9:2:0:35 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:IM_ELEC S:1_IN_12 S:BR_ELEC D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales a pale blue. N:128:Baby white dragon T:dragon C:w I:110:88:20:36:70 W:9:2:0:35 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:IM_COLD S:1_IN_12 S:BR_COLD D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales a pale white. N:129:Baby green dragon T:dragon C:g I:110:88:20:36:70 W:9:2:0:35 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:IM_POIS S:1_IN_12 S:BR_POIS D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales a sickly green. N:130:Baby black dragon T:dragon C:s I:110:88:20:36:70 W:9:2:0:35 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:IM_ACID S:1_IN_12 S:BR_ACID D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales a dull black. N:131:Baby red dragon T:dragon C:r I:110:88:20:36:70 W:9:2:0:35 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:IM_FIRE S:1_IN_12 S:BR_FIRE D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales a pale red. N:132:Giant red ant T:ant C:r I:110:18:12:40:60 W:9:2:0:22 B:BITE:HURT:1d4 B:STING:LOSE_STR:1d4 D:It is large and has venomous mandibles. N:133:Brodda, the Easterling T:person C:U I:110:210:20:37:20 W:9:2:0:100 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:HIT:HURT:1d12 F:UNIQUE | MALE | HAS_LIGHT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR D:A nasty piece of work, Brodda picks on defenseless women and children. N:134:King cobra T:snake C:g I:110:44:8:45:1 W:9:2:0:28 B:SPIT:BLIND:1d2 B:BITE:POISON:3d4 F:RAND_50 F:IM_POIS D:It is a large snake with a hooded face. N:574:Baby bronze dragon T:dragon C:U I:110:88:20:36:70 W:9:0:0:35 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:NO_CONF S:1_IN_12 S:BR_CONF D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales a dull bronze. N:575:Baby gold dragon T:dragon C:y I:110:88:20:36:70 W:9:2:0:35 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR S:1_IN_12 S:BR_SOUN D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales a pale gold. N:563:Cave bear T:quadruped C:u I:110:36:10:52:10 W:9:1:0:25 B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 F:ANIMAL F:RAND_25 D:A large bear appears to have made its home in this cave. It is hungry, and D: you are trespassing in its territory. ########## DUNGEON LEVELS 10-19 ########## ### Dungeon level 10 ### N:135:Giant spider T:spider C:v I:110:55:8:24:80 W:10:2:0:35 B:BITE:HURT:1d10 B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:HURT:1d10 F:ANIMAL | WEIRD_MIND F:IM_POIS D:It is a vast black spider whose bulbous body is bloated with poison. N:136:Dark elven mage T:humanoid C:r I:120:39:20:24:20 W:10:1:0:50 B:HIT:HURT:1d6 B:HIT:HURT:1d6 F:MALE | EVIL F:DROP_60 | ONLY_ITEM F:HURT_LIGHT | IM_POIS F:FORCE_SLEEP S:1_IN_5 S:BLIND | CONF | DARKNESS | MISSILE S:BA_POIS D:A dark elven figure, dressed all in black, hurling spells at you. N:137:Orfax, Son of Boldor T:yeek C:B I:120:120:18:24:10 W:10:3:0:80 B:HIT:HURT:1d9 B:HIT:HURT:1d8 B:INSULT B:INSULT F:UNIQUE | MALE | EVIL | SMART | ESCORT F:ESCORTS F:DROP_1 | DROP_GOOD | ONLY_ITEM F:FORCE_SLEEP S:1_IN_4 S:BLINK | CONF | HEAL | SLOW | TELE_TO S:S_MONSTER D:He's just like his daddy! He knows mighty spells, but fortunately he is a D: yeek. N:138:Dark elven warrior T:humanoid C:u I:110:60:20:24:20 W:10:1:0:50 B:HIT:HURT:1d8 B:HIT:HURT:1d8 F:MALE | EVIL F:DROP_60 F:HURT_LIGHT D:A dark elven figure in armour and ready with his sword. N:139:Clear mushroom patch T:mushroom C:w I:120:1:4:1:0 W:10:2:0:3 B:SPORE:HURT:1d1 F:COLD_BLOOD | INVISIBLE | MULTIPLY F:NEVER_MOVE F:ATTR_CLEAR D:Yum! It looks quite tasty. N:140:Grishn['a]kh, the Hill Orc T:orc C:y I:110:230:20:30:20 W:10:3:0:160 B:HIT:HURT:1d12 B:HIT:HURT:1d10 B:HIT:HURT:1d12 B:HIT:HURT:1d10 F:UNIQUE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_POIS D:He is a cunning and devious orc with a chaotic nature. N:141:Giant white tick T:spider C:w I:100:54:12:48:20 W:10:2:0:27 B:BITE:POISON:2d6 F:ANIMAL | WEIRD_MIND F:IM_POIS D:It is moving slowly towards you. N:142:Hairy mold T:mold C:o I:110:68:2:22:70 W:10:1:0:32 B:SPORE:POISON:1d3 F:EMPTY_MIND | STUPID D:It is a strange hairy growth on the dungeon floor. N:143:Disenchanter mold T:mold C:v I:110:72:2:30:70 W:10:1:0:40 B:SPORE:UN_BONUS:1d6 F:EMPTY_MIND | STUPID F:RES_DISE F:ATTR_MULTI S:1_IN_11 S:DRAIN_MANA D:It is a strange glowing growth on the dungeon floor. N:144:Pseudo-dragon T:dragon C:o I:110:176:20:36:70 W:10:2:0:150 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:HAS_LIGHT F:DROP_40 F:BASH_DOOR S:1_IN_11 S:CONF | SCARE S:BR_DARK | BR_LIGHT D:A small relative of the dragon that inhabits dark caves. N:145:Tengu T:minor demon C:R I:120:80:20:38:30 W:10:1:0:40 B:HIT:HURT:1d8 F:OPEN_DOOR | BASH_DOOR F:NO_FEAR S:1_IN_3 S:BLINK | TELE_TO D:It is a fast-moving demon that blinks quickly in and out of existence; no D: other demon matches its teleporting mastery. N:146:Creeping gold coins T:creeping coins C:y I:100:81:5:43:10 W:10:3:0:32 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 F:DROP_3 F:IM_ACID D:It appears to be a pile of gold coins, until it starts crawling towards you on D: tiny legs. mimic:gold:gold N:147:Wolf T:canine C:u I:120:21:30:45:20 W:10:1:0:30 B:BITE:HURT:1d6 F:FRIENDS F:RAND_25 | BASH_DOOR D:It howls and snaps at you. N:148:Giant fruit fly T:insect C:G I:120:3:8:16:10 W:10:3:0:4 B:BITE:HURT:1d2 D:A fast-breeding, annoying pest. N:149:Panther T:feline C:u I:120:45:40:36:0 W:10:2:0:25 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 F:BASH_DOOR D:A large black cat, stalking you with intent. It thinks you're its next meal. N:150:Brigand T:person C:b I:110:41:20:48:10 W:10:2:0:35 B:HIT:HURT:2d4 B:TOUCH:EAT_ITEM F:MALE | EVIL F:DROP_1 F:OPEN_DOOR | TAKE_ITEM D:He is eyeing your backpack. ### Dungeon level 11 ### N:151:Baby multi-hued dragon T:dragon C:v I:110:114:20:36:70 W:11:2:0:45 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:DROP_40 | DROP_1 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:ATTR_MULTI S:1_IN_12 S:BR_ACID | BR_COLD | BR_ELEC | BR_FIRE | BR_POIS D:This hatchling dragon is still soft, its eyes unaccustomed to light and its D: scales shimmering with hints of many different colours. N:152:Hippogriff T:hybrid C:U I:110:100:12:21:10 W:11:1:0:30 B:HIT:HURT:2d5 B:BITE:HURT:2d5 F:ANIMAL F:BASH_DOOR D:A strange hybrid of eagle and horse. It looks weird. N:153:Zombified orc T:zombie C:s I:110:50:20:36:25 W:11:1:0:30 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:HIT:HURT:1d4 F:ORC | EMPTY_MIND F:NO_FEAR D:It is a shambling orcish corpse leaving behind a trail of flesh. N:154:Gnome mage T:humanoid C:r I:110:32:18:30:10 W:11:2:0:38 B:HIT:HURT:1d5 F:MALE | EVIL | FRIEND F:DROP_60 F:FORCE_SLEEP S:1_IN_4 S:BLINK | DARKNESS S:BO_COLD S:S_MONSTER D:A mage of short stature. ### Dungeon level 12 ### N:155:Black mamba T:snake C:D I:120:45:10:48:1 W:12:3:0:40 B:BITE:POISON:4d4 F:RAND_50 F:IM_POIS D:It has glistening black skin, a sleek body and highly venomous fangs. N:156:White wolf T:canine C:w I:120:28:30:45:20 W:12:1:0:30 B:BITE:HURT:1d3 B:BITE:HURT:1d4 F:FRIENDS F:RAND_25 | BASH_DOOR F:IM_COLD D:A large and muscled wolf from the northern wastes. Its breath is cold and icy D: and its fur coated in frost. N:157:Grape jelly T:jelly C:P I:110:234:2:1:99 W:12:3:0:60 B:TOUCH:EXP_10 F:HAS_LIGHT F:NEVER_MOVE F:HURT_LIGHT | HURT_COLD | IM_POIS | NO_CONF | NO_SLEEP S:1_IN_11 S:DRAIN_MANA D:Yum! It looks quite tasty. It is a pulsing mound of glowing flesh. N:158:Nether worm mass T:worm C:D I:100:23:10:22:3 W:12:3:0:6 B:TOUCH:EXP_10 F:WEIRD_MIND | MULTIPLY | STUPID F:RAND_25 | RAND_50 | BASH_DOOR F:HURT_LIGHT | NO_FEAR D:It is a disgusting mass of dark worms, eating each other, the floor, the air, D: you.... N:159:Golfimbul, the Hill Orc Chief T:orc C:Y I:110:240:20:90:20 W:12:3:0:230 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:HIT:HURT:1d10 B:HIT:HURT:1d10 F:UNIQUE | ESCORT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:IM_COLD | IM_ELEC | IM_FIRE | IM_POIS D:A leader of a band of raiding orcs, he picks on hobbits. N:160:Master yeek T:yeek C:U I:110:60:18:28:10 W:12:2:0:28 B:HIT:HURT:1d8 F:EVIL F:DROP_40 F:FORCE_SLEEP S:1_IN_4 S:BLIND | BLINK | SLOW | TPORT S:BA_POIS S:S_MONSTER D:A small humanoid that radiates some power. N:161:Priest T:person C:g I:110:54:20:26:40 W:12:1:0:36 B:HIT:HURT:2d3 B:HIT:HURT:2d3 F:MALE | EVIL | SMART | HAS_LIGHT F:DROP_60 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_3 S:CAUSE_2 | HEAL | SCARE S:S_MONSTER D:A robed man, dedicated to his god. N:162:Dark elven priest T:humanoid C:g I:120:39:20:45:30 W:12:1:0:50 B:HIT:HURT:1d9 B:HIT:HURT:1d10 F:MALE | EVIL | SMART F:DROP_1 | ONLY_ITEM F:HURT_LIGHT F:FORCE_SLEEP S:1_IN_5 S:BLIND | CAUSE_2 | CONF | DARKNESS | HEAL D:A dark elven figure, dressed all in black, chanting curses and waiting to D: deliver your soul to hell. N:163:Air spirit T:elemental C:B I:130:36:12:48:20 W:12:2:0:40 B:HIT:HURT:1d3 F:COLD_BLOOD | INVISIBLE F:RAND_25 | RAND_50 | BASH_DOOR F:IM_ELEC D:A whirlwind of sentient air. N:164:Skeleton human T:skeleton C:w I:110:45:20:45:30 W:12:1:0:38 B:HIT:HURT:1d8 F:EMPTY_MIND F:OPEN_DOOR | BASH_DOOR D:It is an animated human skeleton. N:165:Zombified human T:zombie C:s I:110:54:20:36:20 W:12:1:0:34 B:HIT:HURT:1d4 B:HIT:HURT:1d4 F:EMPTY_MIND F:NO_FEAR D:It is a shambling human corpse dropping chunks of flesh behind it. N:166:Tiger T:feline C:o I:120:66:40:48:0 W:12:2:0:40 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 F:BASH_DOOR D:One of the largest of its species, a sleek orange and black shape creeps D: towards you, ready to pounce. N:167:Moaning spirit T:ghost C:u I:120:23:14:24:10 W:12:2:0:44 B:WAIL:TERRIFY B:TOUCH:LOSE_DEX:1d8 F:DROP_40 | DROP_60 F:RAND_25 F:IM_COLD F:FORCE_SLEEP S:1_IN_15 S:SCARE | TPORT D:A ghostly apparition that shrieks horribly. N:168:Swordsman T:person C:u I:110:54:20:51:20 W:12:1:0:40 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:MALE | HAS_LIGHT F:DROP_1 F:OPEN_DOOR D:A warrior of considerable skill. N:169:Stegocentipede T:centipede C:u I:120:59:12:36:30 W:12:2:0:40 B:BITE:HURT:2d4 B:BITE:HURT:2d4 B:STING:HURT:2d4 F:BASH_DOOR D:It is a vast armoured centipede with massive mandibles and a spiked tail. N:170:Spotted jelly T:jelly C:o I:120:59:12:27:1 W:12:3:0:33 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 F:COLD_BLOOD F:NEVER_MOVE F:HURT_LIGHT | IM_ACID | IM_POIS | HURT_COLD | NO_CONF | NO_SLEEP D:A strange jelly thing, covered in discoloured blotches. ### Dungeon level 13 ### N:171:Drider T:spider C:b I:110:70:8:36:80 W:13:2:0:55 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:POISON:1d6 F:EVIL F:IM_POIS F:FORCE_SLEEP S:1_IN_8 S:CAUSE_1 | CONF | DARKNESS D:A dark elven torso merged with the bloated form of a giant spider. N:172:Killer brown beetle T:killer beetle C:u I:110:59:10:48:30 W:13:1:0:38 B:BITE:HURT:3d4 D:It is a vicious insect with a tough carapace. N:173:Boldor, King of the Yeeks T:yeek C:P I:120:180:18:28:10 W:13:3:0:200 B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HURT:1d8 F:UNIQUE | MALE | EVIL | SMART | ESCORT F:ESCORTS F:DROP_60 | DROP_1 | DROP_GOOD | ONLY_ITEM F:FORCE_SLEEP S:1_IN_3 S:BLIND | BLINK | HEAL | SLOW | TPORT S:S_KIN | S_MONSTER D:A great yeek, powerful in magic and sorcery, but a yeek all the same. N:174:Ogre T:ogre C:U I:110:65:20:49:30 W:13:2:0:50 B:HIT:HURT:2d8 F:FRIENDS F:DROP_40 D:A hideous, smallish giant that is often found near or with orcs. N:175:Creeping mithril coins T:creeping coins C:B I:110:90:5:60:10 W:13:3:0:45 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 F:DROP_4 F:IM_ACID D:It appears to be a pile of sentient mithril coins that doesn't like being D: picked up. mimic:gold:mithril N:176:Illusionist T:person C:I I:120:54:20:15:10 W:13:2:0:50 B:HIT:HURT:2d2 F:MALE | EVIL | SMART | HAS_LIGHT F:DROP_1 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_3 S:BLIND | BLINK | CONF | DARKNESS | HASTE | HOLD S:SLOW | TPORT D:A deceptive spell caster. N:177:Druid T:person C:G I:110:78:20:15:10 W:13:2:0:50 B:HIT:HURT:2d4 B:HIT:HURT:2d4 F:MALE | EVIL | SMART | HAS_LIGHT F:DROP_1 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_3 S:BLIND | BLINK | HASTE | HOLD | SLOW S:BO_ELEC | BO_FIRE S:S_ANIMAL D:A priest devoted to Nature. N:178:Black orc T:orc C:D I:110:66:20:54:20 W:13:1:0:45 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:FRIENDS F:DROP_20 F:HURT_LIGHT S:1_IN_9 S:ARROW_2 D:He is a large orc with powerful arms and deep black skin. N:179:Ochre jelly T:jelly C:U I:120:59:12:21:1 W:13:3:0:40 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 F:COLD_BLOOD F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM F:IM_ACID | IM_POIS | HURT_COLD | NO_CONF | NO_SLEEP D:A fast moving highly acidic jelly thing, that is eating away the floor it D: rests on. ### Dungeon level 14 ### N:180:Giant flea T:insect C:s I:120:3:8:30:10 W:14:3:0:4 B:BITE:HURT:1d2 F:BASH_DOOR D:It makes you itch just to look at it. N:181:Ufthak of Cirith Ungol T:orc C:g I:110:320:20:75:20 W:14:3:0:250 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:UNIQUE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_COLD | IM_POIS D:A strong orc guarding the pass of Cirith Ungol. He is mortally afraid of D: spiders. N:182:Giant white dragon fly T:dragon fly C:w I:110:14:12:30:50 W:14:2:0:60 B:BITE:COLD:1d6 F:IM_COLD S:1_IN_10 S:BR_COLD D:It is a large fly that drips frost. N:183:Blue icky thing T:icky thing C:b I:100:35:15:30:20 W:14:4:0:20 B:CRAWL:POISON:1d4 B:CRAWL:EAT_FOOD B:HIT:HURT:1d4 B:HIT:HURT:1d4 F:EVIL | MULTIPLY F:OPEN_DOOR | BASH_DOOR F:IM_POIS F:FORCE_SLEEP S:1_IN_8 S:BLIND | CONF | SCARE D:It is a strange, slimy, icky creature, with rudimentary intelligence, but evil D: cunning. It hungers for food, and you look tasty. N:185:Flesh golem T:golem C:R I:110:54:12:36:10 W:14:2:0:50 B:HIT:HURT:1d6 B:HIT:HURT:1d6 F:BASH_DOOR D:A shambling humanoid monster with long scars. N:186:Warg T:canine C:s I:120:36:20:30:40 W:14:2:0:40 B:BITE:HURT:1d8 F:EVIL | FRIENDS F:RAND_25 | BASH_DOOR D:It is a large wolf with eyes full of cunning. N:187:Giant black louse T:louse C:D I:120:2:6:8:10 W:14:1:0:3 B:BITE:HURT:1d2 D:It makes you itch just to look at it. N:188:Lurker T:lurker C:w I:110:176:30:30:10 W:14:3:0:80 B:HIT:HURT:1d8 B:HIT:HURT:1d8 D:A strange creature that merges with the dungeon floor, trapping its victims by D: enveloping them within its perfectly disguised form. ### Dungeon level 15 ### N:189:Wererat T:rodent C:D I:110:90:10:15:10 W:15:2:0:45 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:2d6 F:EVIL F:DROP_40 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_9 S:BLINK | CAUSE_2 S:BA_POIS S:BO_COLD D:A large rat with glowing red eyes. The wererat is a disgusting creature, D: relishing in filth and disease. N:190:Black ogre T:ogre C:D I:110:100:20:49:30 W:15:2:0:75 B:HIT:HURT:2d8 B:HIT:HURT:2d8 F:FRIENDS F:DROP_40 F:RAND_25 D:A massive orc-like figure with black skin and powerful arms. N:191:Magic mushroom patch T:mushroom C:B I:140:1:40:12:0 W:15:2:0:10 B:SPORE:CONFUSE B:SPORE:CONFUSE B:SPORE:HALLU B:SPORE:HALLU F:HAS_LIGHT F:NEVER_MOVE F:FORCE_SLEEP S:1_IN_2 S:BLINK | DARKNESS | SCARE | SLOW D:Yum! It looks quite tasty. It seems to glow with an unusual light. N:192:Guardian naga T:naga C:B I:110:144:20:78:120 W:15:2:0:80 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 F:DROP_40 | DROP_1 F:RAND_25 | OPEN_DOOR D:A giant snake-like figure with a woman's torso. N:193:Light hound T:zephyr hound C:o I:110:21:30:36:0 W:15:3:0:50 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:HAS_LIGHT F:BASH_DOOR F:FORCE_SLEEP S:1_IN_5 S:BR_LIGHT D:A brilliant canine form whose light hurts your eyes, even at this distance. N:194:Dark hound T:zephyr hound C:D I:110:21:30:36:0 W:15:3:0:50 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:BASH_DOOR F:FORCE_SLEEP S:1_IN_5 S:BR_DARK D:A hole in the air in the shape of a huge hound. No light falls upon its form. N:195:Half-orc T:orc C:s I:110:88:20:60:20 W:15:2:0:50 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:FRIENDS F:DROP_20 D:He is a hideous deformed cross-breed with man and orc, combining man's D: strength and cunning with orcish evil. The traitorous wizard Saruman is D: generally believed to be responsible for this abomination. N:196:Giant tarantula T:spider C:o I:120:80:8:48:80 W:15:3:0:70 B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL | WEIRD_MIND F:IM_POIS D:A giant spider with hairy black and red legs. N:197:Giant clear centipede T:centipede C:w I:110:23:12:36:30 W:15:2:0:30 B:BITE:HURT:2d4 B:STING:HURT:2d4 F:INVISIBLE F:BASH_DOOR F:ATTR_CLEAR D:It is about four feet long and carnivorous. N:198:Mirkwood spider T:spider C:g I:120:41:15:30:80 W:15:2:0:25 B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:EVIL | ANIMAL | WEIRD_MIND | FRIENDS F:IM_POIS D:A strong and powerful spider from Mirkwood forest. Cunning and evil, it seeks D: to taste your juicy insides. N:200:Griffon T:hybrid C:u I:110:135:12:22:10 W:15:1:0:70 B:HIT:HURT:3d4 B:BITE:HURT:2d6 F:ANIMAL F:BASH_DOOR D:It is half lion, half eagle. It flies menacingly towards you. N:201:Homunculus T:minor demon C:y I:110:36:20:48:30 W:15:3:0:40 B:HIT:PARALYZE:1d2 B:HIT:HURT:1d10 F:OPEN_DOOR | BASH_DOOR F:NO_FEAR D:It is a small demonic spirit full of malevolence. #N:202:Gnome mage #Consolidated (see #154) N:203:Clear hound T:zephyr hound C:w I:110:21:30:36:0 W:15:3:0:50 B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 F:INVISIBLE F:BASH_DOOR F:ATTR_CLEAR D:A completely translucent hound. N:204:Clay golem T:golem C:U I:110:63:12:36:10 W:15:2:0:60 B:HIT:HURT:1d8 B:HIT:HURT:1d8 F:COLD_BLOOD F:BASH_DOOR F:HURT_ROCK | IM_COLD | IM_FIRE | IM_POIS D:It is a massive animated statue made out of hardened clay. N:550:Giant tan bat T:bat C:U I:130:14:12:30:50 W:15:2:0:18 B:BITE:TERRIFY:1d3 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 F:RAND_50 F:FORCE_SLEEP D:A giant bat, the beating of whose wings produces a strangely unnerving noise. ### Dungeon level 16 ### N:205:Umber hulk T:xorn C:U I:110:110:20:75:10 W:16:1:0:75 B:GAZE:CONFUSE B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:2d6 F:EVIL | ANIMAL F:BASH_DOOR | KILL_WALL D:This bizarre creature has glaring eyes and large mandibles capable of slicing D: through rock. N:207:Gelatinous cube T:jelly C:G I:110:316:12:21:1 W:16:4:0:80 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 F:COLD_BLOOD F:DROP_4 F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:NO_CONF | NO_SLEEP -F:HURT_COLD D:It is a strange, vast gelatinous structure that assumes cubic proportions as D: it lines all four walls of the corridors it patrols. Through its transparent D: jelly structure you can see treasures it has engulfed, and a few corpses as D: well. N:208:Giant green dragon fly T:dragon fly C:g I:110:14:12:30:50 W:16:2:0:65 B:BITE:POISON:1d6 F:RAND_25 F:IM_POIS S:1_IN_10 S:BR_POIS D:A vast, foul-smelling dragonfly. N:210:Hummerhorn T:insect C:y I:120:3:8:16:10 W:16:4:0:4 B:BITE:CONFUSE:2d2 D:A giant buzzing wasp, its stinger drips venom. N:211:Ulfast, Son of Ulfang T:person C:U I:110:340:20:48:40 W:16:3:0:200 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:UNIQUE | MALE | EVIL | HAS_LIGHT F:DROP_60 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM D:A short and swarthy Easterling. N:212:Quasit T:minor demon C:o I:110:27:20:36:20 W:16:2:0:50 B:BITE:LOSE_DEX:1d6 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 F:INVISIBLE | SMART F:DROP_1 | ONLY_ITEM F:RAND_25 | BASH_DOOR F:FORCE_SLEEP S:1_IN_10 S:BLIND | BLINK | CONF | SCARE | TELE_LEVEL | TELE_TO S:TPORT D:The chaotic evil master's favourite pet. N:226:Uruk T:orc C:B I:110:70:20:75:20 W:16:1:0:60 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:FRIENDS F:DROP_20 F:IM_POIS S:1_IN_9 S:ARROW_2 D:A cunning orc of power, as tall as a man, and stronger. It fears little. N:564:Grizzly bear T:quadruped C:U I:110:78:10:52:10 W:16:2:0:55 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d12 B:CRUSH:HURT:1d10 F:ANIMAL D:A huge, beastly bear, more savage than most of its kind. N:561:Crebain T:bird C:D I:120:9:40:14:0 W:16:4:0:20 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 F:FRIENDS S:1_IN_8 S:SHRIEK D:A type of crow, specially bred by the forces of evil as spies; their D: rudimentary intelligence guided by an evil mind has tracked you down, and now D: they seek to alert other evil creatures to your presence. ### Dungeon level 17 ### N:213:Imp T:minor demon C:g I:110:27:20:36:20 W:17:2:0:55 B:HIT:POISON:3d4 B:HIT:POISON:3d4 F:COLD_BLOOD | INVISIBLE | SMART F:DROP_1 | ONLY_ITEM F:RAND_25 | BASH_DOOR F:FORCE_SLEEP S:1_IN_10 S:BLIND | BLINK | CONF | SCARE | TELE_LEVEL | TELE_TO S:TPORT D:The lawful evil master's favourite pet. N:214:Forest troll T:troll C:g I:110:110:20:75:40 W:17:1:0:70 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:BITE:HURT:1d6 F:MALE | REGENERATE | FRIENDS F:DROP_20 F:HURT_LIGHT D:He is green skinned and ugly. N:215:N['a]r, the Dwarf T:humanoid C:y I:110:450:25:84:25 W:17:2:0:250 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:UNIQUE | MALE F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:BLIND | CAUSE_2 | CONF | HEAL | MIND_BLAST D:The friend and companion of the dwarven king Thr['o]r, he went mad with grief D: after Thr['o]r's death at the hands of Azog the Orc. With torn beard and D: ragged clothes, he seems to have fixed on you as a convenient target to vent D: his anger. N:216:2-headed hydra T:hydra C:u I:110:200:20:90:20 W:17:2:0:80 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:DROP_2 F:OPEN_DOOR | MOVE_BODY S:1_IN_11 S:SCARE D:A strange reptilian hybrid with two heads, guarding its hoard. N:217:Water spirit T:elemental C:b I:120:41:12:42:40 W:17:2:0:58 B:HIT:HURT:2d4 B:HIT:HURT:2d4 F:COLD_BLOOD F:RAND_25 | BASH_DOOR F:IM_ACID | IM_WATER D:A whirlpool of sentient liquid. N:218:Giant red scorpion T:spider C:r I:110:50:12:52:20 W:17:1:0:62 B:BITE:HURT:2d4 B:STING:LOSE_STR:1d7 F:ANIMAL | WEIRD_MIND D:It is fast and poisonous. N:219:Earth spirit T:elemental C:u I:120:59:10:60:50 W:17:2:0:64 B:HIT:HURT:1d8 B:HIT:HURT:1d8 F:COLD_BLOOD F:RAND_25 | PASS_WALL F:HURT_ROCK | IM_COLD | IM_ELEC | IM_FIRE D:A whirling form of sentient rock. ### Dungeon level 18 ### N:206:Orc captain T:orc C:o I:110:110:20:88:20 W:18:3:0:80 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:ESCORT F:DROP_60 F:IM_POIS S:1_IN_9 S:ARROW_2 D:An armoured orc with an air of authority. N:220:Fire spirit T:elemental C:r I:120:50:16:36:20 W:18:2:0:75 B:HIT:FIRE:2d6 B:HIT:FIRE:2d6 F:HAS_LIGHT F:RAND_25 | BASH_DOOR F:IM_FIRE | HURT_COLD D:A whirlwind of sentient flame. N:221:Fire hound T:zephyr hound C:r I:110:35:30:36:0 W:18:3:0:70 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:FIRE:2d6 F:HAS_LIGHT F:BASH_DOOR F:IM_FIRE | HURT_COLD F:FORCE_SLEEP S:1_IN_10 S:BR_FIRE D:Flames lick at its feet and its tongue is a blade of fire. You can feel a D: furnace heat radiating from the creature. N:222:Cold hound T:zephyr hound C:w I:110:35:30:36:0 W:18:3:0:70 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:COLD:2d6 F:BASH_DOOR F:IM_COLD | HURT_FIRE F:FORCE_SLEEP S:1_IN_10 S:BR_COLD D:A hound as tall as a man, this creature appears to be composed of angular D: planes of ice. Cold radiates from it and freezes your breath in the air. N:223:Energy hound T:zephyr hound C:b I:110:35:30:36:0 W:18:3:0:70 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:ELEC:2d6 F:HAS_LIGHT F:BASH_DOOR F:IM_ELEC F:FORCE_SLEEP S:1_IN_10 S:BR_ELEC D:Saint Elmo's Fire forms a ghostly halo around this hound, and sparks sting D: your fingers as energy builds up in the air around you. N:224:Potion mimic T:mimic G:! C:w I:110:55:25:36:0 W:18:3:0:60 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 F:HURT_COLD S:1_IN_6 S:BO_COLD D:A strange creature that disguises itself as a discarded potion bottle to lure D: unsuspecting adventurers within reach of its venomous claws. mimic:potion:Healing mimic:potion:*Healing* mimic:potion:Life mimic:potion:Experience mimic:potion:Augmentation mimic:potion:Speed N:225:Blink dog T:canine C:B I:120:36:20:24:10 W:18:2:0:50 B:BITE:HURT:1d8 F:FRIENDS F:RAND_25 | BASH_DOOR S:1_IN_4 S:BLINK | TELE_TO D:A strange magical member of the canine race, its form seems to shimmer and D: fade in front of your very eyes. N:229:Shambling mound T:mushroom C:g I:110:70:20:19:40 W:18:2:0:75 B:HIT:HURT:1d8 B:HIT:HURT:1d8 F:EVIL F:DROP_60 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR S:1_IN_4 S:SHRIEK D:A pile of rotting vegetation that slides towards you with a disgusting stench, D: waking all it nears. N:231:Giant black dragon fly T:dragon fly C:s I:120:14:12:30:50 W:18:2:0:70 F:NEVER_BLOW | RAND_25 F:IM_ACID S:1_IN_10 S:BR_ACID D:The size of a large bird, this fly drips caustic acid. N:588:Evil eye T:eye C:g I:110:68:2:7:10 W:18:3:0:80 B:GAZE:EXP_10 B:GAZE:EXP_10 F:EVIL F:NEVER_MOVE F:HURT_LIGHT | NO_FEAR S:1_IN_7 S:HOLD | TELE_TO D:A huge disembodied eye. As you stare into the black nothingness of its pupil, D: you feel your will and vitality draining away, and are unable to do anything D: except approach it in horrified fascination. ### Dungeon level 19 ### N:227:Shagrat, the Orc Captain T:orc C:g I:110:400:20:72:20 W:19:2:0:400 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:UNIQUE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_POIS D:He is an orc of power and great cunning, leader of the garrison at Cirith D: Ungol. N:228:Gorbag, the Orc Captain T:orc C:g I:110:400:20:72:20 W:19:2:0:400 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:UNIQUE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_POIS D:He is an orc of power and great cunning, leader of the garrison at Minas D: Morgul. N:232:Stone golem T:golem C:W I:100:126:12:90:10 W:19:2:0:100 B:HIT:HURT:1d10 B:HIT:HURT:1d10 F:COLD_BLOOD F:BASH_DOOR F:HURT_ROCK | IM_COLD | IM_FIRE | IM_POIS D:It is a massive animated statue. N:233:Red mold T:mold C:r I:110:77:2:19:70 W:19:1:0:64 B:SPORE:FIRE:4d4 F:EMPTY_MIND | STUPID | HAS_LIGHT F:IM_FIRE -F:HURT_FIRE D:It is a strange red growth on the dungeon floor; it seems to burn with flame. N:234:Giant gold dragon fly T:dragon fly C:y I:120:14:12:30:50 W:19:2:0:75 B:BITE:HURT:1d3 F:RAND_25 F:IM_FIRE S:1_IN_10 S:BR_SOUN D:Large beating wings support this dazzling insect. A loud buzzing noise D: pervades the air. N:592:Neekerbreeker T:insect C:D I:120:5:8:21:10 W:19:4:0:4 B:BITE:POISON:2d2 F:EVIL S:1_IN_12 S:SHRIEK D:Believed to be an evil relative of the cricket, this creature gets its name D: from its incessant squeaking, which can best be described as "neek-breek, D: neek-breek". The noise can drive people frantic, and worse still, can be D: heard for quite some distance, alerting other monsters to your presence. ########## DUNGEON LEVELS 20-29 ########## ### Dungeon level 20 ### N:235:Bolg, Son of Azog T:orc C:P I:120:500:20:60:20 W:20:4:0:800 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 F:UNIQUE | ESCORT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:IM_POIS D:A large and powerful orc, he looks just like his father. He is tall and fast, D: but fortunately blessed with orcish brains. N:236:Phase spider T:spider C:B I:120:27:15:30:80 W:20:2:0:60 B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL | WEIRD_MIND | FRIENDS F:IM_POIS S:1_IN_5 S:BLINK | TELE_TO D:A spider that never seems quite there. Everywhere you look it is just D: half-seen in the corner of one eye. N:237:3-headed hydra T:hydra C:o I:120:300:20:97:20 W:20:2:0:350 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:DROP_3 F:OPEN_DOOR | MOVE_BODY S:1_IN_9 S:SCARE D:A strange reptilian hybrid with three heads, guarding its hoard. N:238:Earth hound T:zephyr hound C:u I:110:68:30:36:0 W:20:3:0:200 B:BITE:HURT:1d8 B:BITE:HURT:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:BASH_DOOR F:FORCE_SLEEP S:1_IN_10 S:BR_SHAR D:A beautiful crystalline shape does not disguise the danger this hound clearly D: presents. Your flesh tingles as it approaches. N:239:Air hound T:zephyr hound C:g I:110:68:30:36:0 W:20:3:0:200 B:BITE:POISON:1d8 B:BITE:POISON:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:BASH_DOOR F:IM_POIS F:FORCE_SLEEP S:1_IN_10 S:BR_POIS D:Swirling vapours surround this beast as it floats towards you, seemingly D: walking on air. Noxious gases sting your throat. N:240:Sabre-tooth tiger T:feline C:y I:120:150:40:60:0 W:20:2:0:120 B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:1d10 B:BITE:HURT:1d10 F:BASH_DOOR D:A fierce and dangerous cat, its huge tusks and sharp claws would lacerate even D: the strongest armour. N:241:Water hound T:zephyr hound C:s I:110:68:30:36:0 W:20:3:0:200 B:BITE:ACID:1d8 B:BITE:ACID:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:BASH_DOOR F:IM_ACID F:FORCE_SLEEP S:1_IN_10 S:BR_ACID D:Liquid footprints follow this hound as it pads around the dungeon. An acrid D: smell of acid rises from the dog's pelt. N:242:Chimaera T:hybrid C:r I:110:160:12:22:10 W:20:2:0:200 B:BUTT:HURT:2d8 B:BITE:HURT:2d10 B:BITE:FIRE:2d6 F:BASH_DOOR F:IM_FIRE F:FORCE_SLEEP S:1_IN_10 S:BR_FIRE D:It is a strange concoction of goat, lion and dragon, with the heads of all D: three beasts. N:243:Quylthulg T:quylthulg C:y I:110:27:10:1:0 W:20:1:0:250 S:1_IN_4 S:BLINK S:S_MONSTER D:It is a strange pulsing mound of flesh. N:244:Sasquatch T:yeti C:g I:120:200:15:60:10 W:20:3:0:180 B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 D:A tall shaggy, furry humanoid, it could call the yeti brother. N:245:Werewolf T:canine C:D I:110:230:15:36:70 W:20:1:0:150 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 F:EVIL F:RAND_25 | OPEN_DOOR | BASH_DOOR | TAKE_ITEM D:It is a huge wolf with eyes that glow with manly intelligence. N:246:Dark elven lord T:humanoid C:s I:120:144:20:48:30 W:20:2:0:500 B:HIT:HURT:3d8 B:HIT:HURT:3d5 F:MALE | EVIL F:DROP_2 | ONLY_ITEM F:HURT_LIGHT F:FORCE_SLEEP S:1_IN_5 S:BLIND | CONF | DARKNESS | HASTE S:BO_COLD | BO_FIRE D:A dark elven figure in armour and radiating evil power. N:580:Ranger T:person C:W I:110:90:20:60:40 W:20:1:0:55 B:HIT:HURT:5d4 B:HIT:HURT:5d4 F:MALE | HAS_LIGHT F:DROP_1 F:OPEN_DOOR | TAKE_ITEM S:1_IN_4 S:ARROW_2 | BLINK | MISSILE S:BO_COLD | BO_ELEC S:S_ANIMAL D:A warrior who is at one with nature. A master of both bow and sword, with D: minor spellcasting skills, and animals come to do his bidding. N:581:Paladin T:person C:w I:110:90:20:48:40 W:20:1:0:55 B:HIT:HURT:4d5 B:HIT:HURT:4d5 F:MALE | HAS_LIGHT F:DROP_1 F:OPEN_DOOR | TAKE_ITEM S:1_IN_4 S:BLIND | CAUSE_2 | HEAL | SCARE | SLOW D:A warrior for a holy cause. Unfortunately, his god is not yours, and there is D: rivalry even between the various gods of Good, so he is your enemy. ### Dungeon level 21 ### N:248:Lugdush, the Uruk T:orc C:b I:110:640:20:108:20 W:21:4:0:550 B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:UNIQUE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_POIS D:A large and powerful orc, captain of one of Saruman's orcish regiments. N:250:Blue dragon bat T:bat C:b I:130:10:12:39:50 W:21:1:0:54 B:BITE:ELEC:1d3 F:RAND_50 | BASH_DOOR F:IM_ELEC F:FORCE_SLEEP S:1_IN_4 S:BR_ELEC D:It is a glowing blue bat with a sharp tail. N:251:Scroll mimic T:mimic G:? C:w I:110:75:30:48:0 W:21:3:0:70 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 F:HURT_FIRE S:1_IN_5 S:BO_FIRE S:S_MONSTER D:A strange creature that disguises itself as a discarded scroll to lure D: unsuspecting adventurers within reach of its venomous claws. mimic:scroll:Banishment mimic:scroll:Mass Banishment mimic:scroll:Teleport Level mimic:scroll:Acquirement mimic:scroll:*Acquirement* mimic:scroll:*Destruction* N:252:Fire vortex T:vortex C:r I:110:45:100:36:0 W:21:1:0:100 B:ENGULF:FIRE:3d3 F:HAS_LIGHT F:IM_FIRE | HURT_COLD S:1_IN_6 S:BR_FIRE D:A whirling maelstrom of fire. N:253:Water vortex T:vortex C:s I:110:45:100:36:0 W:21:1:0:100 B:ENGULF:ACID:3d3 F:IM_ACID | IM_WATER S:1_IN_6 S:BR_ACID D:A caustic spinning whirlpool of water. N:254:Cold vortex T:vortex C:w I:110:45:100:36:0 W:21:1:0:100 B:ENGULF:COLD:3d3 F:IM_COLD | HURT_FIRE S:1_IN_6 S:BR_COLD D:A twisting whirlpool of frost. N:255:Energy vortex T:vortex C:b I:110:45:100:36:0 W:21:1:0:100 B:ENGULF:ELEC:3d3 F:HAS_LIGHT F:IM_ELEC S:1_IN_6 S:BR_ELEC D:A shimmering tornado of air, sparks crackle along its length. N:256:Mummified orc T:zombie C:w I:110:68:20:33:75 W:21:1:0:56 B:HIT:HURT:2d4 B:HIT:HURT:2d4 F:ORC | EMPTY_MIND F:DROP_20 F:NO_FEAR D:It is an orcish figure covered in wrappings. ### Dungeon level 22 ### N:249:Ugl['u]k, the Uruk T:orc C:b I:110:720:20:114:20 W:22:3:0:600 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:UNIQUE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP D:A strong and cunning orc warrior, the commander of Saruman's orcish horde. N:257:Killer stag beetle T:killer beetle C:g I:110:68:12:66:30 W:22:1:0:80 B:CLAW:HURT:1d12 B:CLAW:HURT:1d12 F:RAND_25 D:It is a giant beetle with vicious claws. N:258:Iron golem T:golem C:s I:110:520:12:120:10 W:22:2:0:160 B:HIT:HURT:1d12 F:COLD_BLOOD F:BASH_DOOR F:IM_COLD | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_7 S:SLOW D:It is a massive metal statue that moves steadily towards you. N:259:Giant yellow scorpion T:spider C:y I:110:54:12:45:20 W:22:1:0:60 B:BITE:HURT:1d8 B:STING:POISON:2d5 F:ANIMAL | WEIRD_MIND D:It is a giant scorpion with a sharp stinger. N:555:Wyvern T:dragon C:g I:120:203:20:79:60 W:22:2:0:250 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:STING:POISON:2d6 F:ANIMAL F:DROP_2 | ONLY_GOLD F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:IM_POIS D:A fast-moving and deadly draconian animal. Beware its poisonous sting! ### Dungeon level 23 ### N:260:Black ooze T:jelly C:D I:90:27:10:7:1 W:23:1:0:7 B:TOUCH:ACID:2d6 F:MULTIPLY F:DROP_40 F:RAND_50 | OPEN_DOOR | BASH_DOOR | KILL_BODY | TAKE_ITEM F:IM_POIS | HURT_COLD S:1_IN_11 S:DRAIN_MANA D:It is a strangely moving puddle. N:261:Hardened warrior T:person C:u I:110:90:20:60:40 W:23:1:0:60 B:HIT:HURT:6d5 B:HIT:HURT:6d5 F:MALE | EVIL | HAS_LIGHT F:DROP_1 F:OPEN_DOOR | TAKE_ITEM D:A scarred warrior who moves with confidence. N:262:Azog, King of the Uruk-Hai T:orc C:R I:120:900:20:96:20 W:23:5:0:1111 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:UNIQUE | ESCORT | ESCORTS F:DROP_2 | DROP_GOOD | ONLY_ITEM F:IM_POIS D:He is also known as the King of Khazad-d[^u]m. His ego is renowned to be D: bigger than his head. N:263:Master rogue T:person C:b I:120:75:20:45:40 W:23:2:0:110 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:EAT_GOLD:4d4 F:MALE | EVIL F:DROP_2 F:OPEN_DOOR | TAKE_ITEM D:A thief of great power and shifty speed. N:264:Red dragon bat T:bat C:r I:130:14:12:42:50 W:23:1:0:60 B:BITE:FIRE:1d3 F:HAS_LIGHT F:RAND_50 | BASH_DOOR F:IM_FIRE F:FORCE_SLEEP S:1_IN_4 S:BR_FIRE D:It is a sharp-tailed bat, wreathed in fire. N:265:Killer white beetle T:killer beetle C:w I:110:81:14:66:30 W:23:1:0:85 B:BITE:HURT:4d5 F:RAND_25 D:It is looking for prey. N:266:Giant bronze dragon fly T:dragon fly C:U I:120:14:12:30:50 W:23:0:0:80 F:NEVER_BLOW | RAND_25 F:NO_CONF | NO_SLEEP S:1_IN_10 S:BR_CONF D:This vast gleaming bronze fly has wings which beat mesmerically fast. N:551:Giant silver ant T:ant C:W I:110:41:10:45:40 W:23:1:0:45 B:BITE:ACID:4d4 F:RAND_25 D:A giant silver ant with a caustic bite. ### Dungeon level 24 ### N:267:Forest wight T:wraith C:g I:110:54:20:36:30 W:24:1:0:140 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 F:DROP_40 | DROP_60 F:RAND_25 | OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_10 S:DRAIN_MANA | SCARE D:It is a ghostly apparition with a humanoid form. N:268:Ibun, Son of M[^i]m T:humanoid C:o I:110:820:20:96:10 W:24:2:0:300 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:UN_BONUS F:UNIQUE | MALE F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_COLD | IM_FIRE | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_8 S:HEAL | SLOW S:BO_FIRE D:One of the last of the Petty-Dwarves. Ibun is a tricky sorcerous little D: being, full of mischief. N:269:Kh[^i]m, Son of M[^i]m T:humanoid C:o I:110:820:20:96:10 W:24:2:0:300 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:UN_BONUS F:UNIQUE | MALE F:DROP_1 | DROP_GOOD | ONLY_ITEM F:IM_COLD | IM_FIRE | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_8 S:HEAL | SLOW S:BO_FIRE D:One of the last of the Petty-Dwarves. Kh[^i]m is a tricky sorcerous little D: being, full of mischief. N:270:4-headed hydra T:hydra C:y I:120:350:20:105:20 W:24:2:0:450 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:DROP_3 F:OPEN_DOOR | MOVE_BODY S:1_IN_7 S:SCARE D:A strange reptilian hybrid with four heads, guarding its hoard. N:271:Mummified human T:zombie C:w I:110:85:20:51:60 W:24:1:0:70 B:HIT:HURT:2d4 B:HIT:HURT:2d4 F:EMPTY_MIND F:DROP_60 | ONLY_ITEM F:NO_FEAR D:It is a human form encased in mouldy wrappings. N:272:Vampire bat T:bat C:D I:120:50:12:60:50 W:24:2:0:150 B:BITE:EXP_40:1d4 B:BITE:EXP_40:1d4 F:UNDEAD | EVIL | COLD_BLOOD | REGENERATE F:RAND_50 F:IM_COLD | IM_POIS | NO_FEAR | NO_CONF | NO_SLEEP D:A blood-sucking bat that flies at your neck hungrily. N:273:Sangahyando of Umbar T:person C:U I:110:800:25:96:25 W:24:2:0:400 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 F:UNIQUE | MALE | EVIL | HAS_LIGHT F:DROP_60 | DROP_1 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:IM_ELEC | IM_FIRE | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_4 S:CONF | SLOW D:A Black N['u]menorean with a blacker heart. N:274:Angamait["e] of Umbar T:person C:U I:110:800:25:96:25 W:24:2:0:400 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 F:UNIQUE | MALE | EVIL | HAS_LIGHT F:DROP_60 | DROP_1 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:IM_ELEC | IM_FIRE | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_4 S:CONF | SLOW D:A Black N['u]menorean who hates the men of the west. N:275:Banshee T:ghost C:b I:120:27:20:28:10 W:24:2:0:60 B:WAIL:TERRIFY B:TOUCH:EXP_20 F:FEMALE F:DROP_1 F:RAND_50 | TAKE_ITEM F:IM_COLD | IM_POIS S:1_IN_15 S:DRAIN_MANA | TPORT D:It is a ghostly woman's form that wails mournfully. N:593:Giant firefly T:insect C:r I:120:5:8:21:10 W:24:4:0:4 B:BITE:BLIND:1d2 F:HAS_LIGHT D:Clouds of these monsters light up the dungeon - so brightly that you can D: barely see through them. N:565:Werebear T:quadruped C:D I:110:325:20:75:20 W:24:2:0:200 B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 B:CRUSH:HURT:2d6 F:EVIL | ANIMAL F:DROP_1 F:OPEN_DOOR D:In the eyes of this bear, there glimmers the faintest light of intelligence. D: And then its form begins to change... The combination of animal cunning, D: human intelligence and the great physical strength of the bear makes for a D: dangerous enemy. ### Dungeon level 25 ### N:184:Hill giant T:giant C:U I:110:240:20:54:50 W:25:1:0:150 B:HIT:HURT:4d8 B:HIT:HURT:4d8 F:DROP_40 F:OPEN_DOOR S:1_IN_10 D:A ten foot tall humanoid with powerful muscles. N:276:Pukelman T:golem C:m I:110:520:12:120:10 W:25:3:0:600 B:HIT:HURT:1d12 B:HIT:HURT:3d6 F:COLD_BLOOD F:BASH_DOOR F:HURT_ROCK | IM_COLD | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_4 S:CONF | SLOW S:BO_ACID D:A stumpy figure carved from stone, with glittering eyes, this sentinel strides D: towards you with deadly intent. N:277:Dark elven druid T:humanoid C:G I:120:210:15:112:10 W:25:3:0:500 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:HIT:HURT:3d8 F:MALE | EVIL F:DROP_1 | ONLY_ITEM F:HURT_LIGHT | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:CONF | DARKNESS | HEAL S:S_ANIMAL | S_MONSTER | S_SPIDER D:A powerful dark elf, with mighty nature-controlling enchantments. N:278:Stone troll T:troll C:W I:110:127:20:60:50 W:25:1:0:85 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 F:MALE | REGENERATE | FRIENDS F:DROP_20 F:HURT_ROCK | HURT_LIGHT D:He is a giant troll with scabrous black skin. N:280:Wereworm T:worm C:p I:110:600:15:105:20 W:25:3:0:300 B:GAZE:EXP_20 B:CRAWL:ACID:2d4 B:BITE:HURT:1d10 B:BITE:POISON:1d6 F:BASH_DOOR F:IM_ACID D:A huge wormlike shape dripping acid, twisted by evil sorcery into a foul D: monster that breeds on death. N:281:Carrion crawler T:centipede C:o I:110:130:15:60:10 W:25:2:0:60 B:STING:PARALYZE:2d6 B:STING:PARALYZE:2d6 F:RAND_25 | BASH_DOOR | FRIEND F:IM_POIS D:A hideous centipede covered in slime and with glowing tentacles around its D: head. N:282:Killer red beetle T:killer beetle C:r I:110:90:14:60:30 W:25:1:0:90 B:BITE:LOSE_STR:4d4 F:RAND_25 D:It is a giant beetle with poisonous mandibles. N:552:Giant brown tick T:spider C:u I:110:81:12:60:20 W:25:2:0:47 B:BITE:POISON:2d6 B:STING:BLIND:1d1 F:ANIMAL | WEIRD_MIND F:IM_POIS D:It is moving slowly towards you. ### Dungeon level 26 ### N:279:Troll priest T:troll C:G I:110:165:20:75:30 W:26:1:0:120 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:BITE:HURT:3d4 F:MALE | REGENERATE F:DROP_60 F:HURT_LIGHT | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BLINK | CAUSE_1 | DARKNESS | MISSILE | SCARE D:A troll who is so bright he knows how to read. N:283:Giant grey ant T:ant C:s I:110:86:10:60:40 W:26:1:0:90 B:BITE:HURT:2d12 F:RAND_25 | KILL_BODY D:It is an ant encased in shaggy grey fur. N:284:Ulwarth, Son of Ulfang T:person C:U I:110:850:20:48:40 W:26:4:0:500 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 F:UNIQUE | MALE | EVIL | HAS_LIGHT F:DROP_60 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM D:A short and swarthy Easterling. N:285:Displacer beast T:feline C:D I:110:138:35:150:20 W:26:2:0:100 B:BITE:HURT:2d8 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 F:INVISIBLE F:BASH_DOOR D:It is a huge black panther, clubbed tentacles sprouting from its shoulders. N:286:Giant fire tick T:spider C:R I:110:72:14:64:20 W:26:1:0:90 B:BITE:FIRE:3d6 F:ANIMAL | WEIRD_MIND | HAS_LIGHT F:RAND_25 F:IM_FIRE D:It is smoking and burning with great heat. N:287:Cave ogre T:ogre C:u I:110:150:20:49:30 W:26:2:0:80 B:HIT:HURT:3d8 B:HIT:HURT:3d8 F:FRIENDS F:DROP_40 D:A giant orc-like figure with an awesomely muscled frame. N:288:White wraith T:wraith C:w I:110:68:20:48:10 W:26:1:0:175 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 F:DROP_1 F:OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_8 S:CAUSE_2 | DARKNESS | SCARE D:It is a tangible but ghostly form made of white fog. N:289:Angel T:angel C:o I:110:264:30:72:255 W:26:4:0:220 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:DROP_2 F:IM_ACID S:1_IN_3 S:BLIND | CONF | SCARE D:Who knows why you are now facing an angel as an enemy? Is it a punishment D: from your own god for your sins, or a test of your mettle, or has this angel D: been sent by another god on behalf of someone who wishes to claim the glory D: for his own god? Perhaps you will never know: but it is here, and you must D: fight it. N:553:Disenchanter bat T:bat C:v I:130:27:12:42:50 W:26:4:0:75 B:HIT:UN_BONUS F:RAND_50 F:RES_DISE F:ATTR_MULTI | FORCE_SLEEP D:A giant bat which feeds on raw magical energy. N:607:Wolf chieftain T:canine C:D I:120:422:20:24:5 W:26:5:0:120 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 B:WAIL:TERRIFY F:MALE | EVIL | SMART | ESCORT | ESCORTS F:OPEN_DOOR | BASH_DOOR F:IM_ACID | IM_COLD | NO_FEAR S:1_IN_8 S:DARKNESS D:A great wolf-chieftain whose pack is in the service of the Dark Lord, and D: whose howls strike fear into even the boldest heart. N:599:Ghoul T:zombie C:U I:110:83:30:36:20 W:26:2:0:95 B:CLAW:PARALYZE:1d4 B:CLAW:PARALYZE:1d4 B:BITE:POISON:1d6 F:FRIENDS F:DROP_40 F:HURT_LIGHT S:1_IN_9 S:HOLD | SCARE D:Flesh is falling off in chunks from this decaying abomination. ### Dungeon level 27 ### N:290:M[^i]m, Betrayer of Turin T:humanoid C:I I:120:1100:20:96:20 W:27:4:0:1000 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:UN_BONUS F:UNIQUE | MALE | EVIL F:DROP_2 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:HEAL | SCARE S:BA_ACID S:BO_ACID D:The last of his race, M[^i]m is a Petty-Dwarf. Petty-Dwarves are strange D: creatures, powerful in sorcery and originating in the East. They have been D: hunted nearly to extinction by the High Elves. N:291:Killer fire beetle T:killer beetle C:R I:110:99:14:54:30 W:27:1:0:95 B:BITE:HURT:3d4 B:SPIT:FIRE:4d5 F:HAS_LIGHT F:IM_FIRE D:It is a giant beetle wreathed in flames. N:292:Creeping adamantite coins T:creeping coins C:G I:120:260:5:60:10 W:27:3:0:60 B:BITE:POISON:3d4 B:TOUCH:POISON:3d5 B:HIT:HURT:1d12 B:HIT:HURT:1d12 F:DROP_4 F:IM_ACID D:It appears to be a pile of coins made of precious adamant, slithering toward D: you on lots of tiny legs. mimic:gold:adamantite N:293:Algroth T:troll C:o I:110:137:20:90:40 W:27:1:0:150 B:CLAW:POISON:3d3 B:CLAW:POISON:3d3 B:BITE:HURT:1d6 F:REGENERATE | FRIENDS F:DROP_20 D:A powerful troll form. Venom drips from its needlelike claws. N:294:Vibration hound T:zephyr hound C:y I:110:138:30:36:0 W:27:4:0:250 B:BITE:HURT:2d8 B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:BASH_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_SOUN D:A blurry canine form which seems to be moving as fast as the eye can follow. D: You can feel the earth resonating beneath your feet. N:295:Nexus hound T:zephyr hound C:P I:110:138:30:36:0 W:27:4:0:250 B:BITE:HURT:2d8 B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:BASH_DOOR F:RES_NEXUS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_NEXU D:A locus of conflicting points coalesce to form the vague shape of a huge D: hound. Or is it just your imagination? N:296:Ogre mage T:ogre C:r I:110:163:20:60:30 W:27:2:0:300 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 F:DROP_1 F:FORCE_SLEEP S:1_IN_4 S:HEAL | HOLD | TRAPS S:BA_COLD S:S_MONSTER D:A hideous ogre wrapped in black sorcerous robes. N:298:Vampire T:vampire C:W I:110:163:20:67:10 W:27:1:0:175 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 F:DROP_40 | DROP_1 S:1_IN_9 S:CAUSE_2 | DARKNESS | MIND_BLAST | TELE_TO D:It is a humanoid with an aura of power. You notice a sharp set of front D: teeth. N:299:Gorgimaera T:hybrid C:o I:110:263:12:82:10 W:27:2:0:400 B:BUTT:HURT:2d10 B:BITE:FIRE:2d10 B:GAZE:PARALYZE:2d6 F:BASH_DOOR F:IM_FIRE F:FORCE_SLEEP S:1_IN_8 S:BR_FIRE D:The result of evil experiments, this travesty of nature should never be alive. D: It has three heads - goat, dragon and gorgon - all attached to a lion's body. N:300:Colbran T:golem C:b I:120:520:12:120:10 W:27:2:0:900 B:HIT:ELEC:3d8 B:HIT:ELEC:3d8 F:COLD_BLOOD | HAS_LIGHT F:BASH_DOOR F:IM_POIS F:FORCE_SLEEP S:1_IN_3 S:BO_ELEC D:A man-shaped form of living lightning, sparks and shocks crackle all over this D: madly capering figure, as it leaps and whirls around and about you. N:328:Ogre shaman T:ogre C:G I:110:163:20:82:30 W:27:2:0:300 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 F:DROP_60 | ONLY_ITEM F:FORCE_SLEEP S:1_IN_5 S:CAUSE_2 | HOLD | SCARE | TPORT | TRAPS S:BO_FIRE S:S_MONSTER D:It is an ogre wrapped in furs and covered in grotesque body paints. N:554:Shimmering mold T:mold C:b I:110:144:2:36:70 W:27:1:0:140 B:SPORE:ELEC:5d4 B:SPORE:ELEC:5d4 F:EMPTY_MIND | STUPID | HAS_LIGHT F:IM_ELEC D:It is a strange growth on the dungeon floor, glowing and crackling with D: sparks. ### Dungeon level 28 ### N:199:Frost giant T:giant C:w I:110:256:20:60:50 W:28:1:0:180 B:HIT:COLD:5d8 B:HIT:COLD:5d8 F:DROP_40 F:OPEN_DOOR F:IM_COLD S:1_IN_10 D:A twelve foot tall giant covered in furs. N:301:Spirit naga T:naga C:w I:110:240:20:90:120 W:28:2:0:60 B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 F:INVISIBLE F:DROP_2 | ONLY_ITEM F:OPEN_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_4 S:BLIND | DARKNESS | HEAL | MIND_BLAST D:A wraithly snake-like form with the torso of a beautiful woman, it is the most D: powerful of its kind. N:302:5-headed hydra T:hydra C:g I:120:450:20:120:20 W:28:2:0:650 B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 F:DROP_4 F:MOVE_BODY F:IM_POIS S:1_IN_5 S:SCARE S:BA_POIS D:A strange reptilian hybrid with five heads dripping venom. N:303:Black knight T:person C:s I:120:165:20:105:10 W:28:1:0:240 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:MALE | EVIL F:DROP_1 F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_8 S:BLIND | CAUSE_3 | DARKNESS | SCARE D:He is a figure encased in deep black plate armour; he looks at you menacingly. N:304:Uldor the Accursed T:person C:U I:110:1000:20:84:40 W:28:4:0:600 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 F:UNIQUE | MALE | EVIL | HAS_LIGHT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM S:1_IN_10 S:S_KIN D:An evil and cunning man from the East. Having once sworn allegiance to the D: sons of F["e]anor, it was Uldor's treachery that turned the tide of the D: Battle of Unnumbered Tears in Morgoth's favour. N:305:Mage T:person C:r I:110:68:20:48:10 W:28:1:0:150 B:HIT:HURT:2d5 B:HIT:HURT:2d5 F:MALE | EVIL | SMART | HAS_LIGHT F:DROP_1 | ONLY_ITEM F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_3 S:BLIND | CONF | HASTE | TELE_TO | TPORT S:BO_COLD | BO_ELEC | BO_FIRE S:S_MONSTER D:A mage of some power - you can tell by the size of his hat. N:306:Mind flayer T:humanoid C:P I:110:132:20:72:10 W:28:1:0:200 B:GAZE:LOSE_INT:2d6 B:GAZE:LOSE_WIS:2d6 F:EVIL F:DROP_40 | DROP_1 | ONLY_ITEM F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_8 S:BLIND | BRAIN_SMASH | FORGET | HOLD | MIND_BLAST | SCARE D:A humanoid form with a gruesome head, tentacular mouth, and piercing eyes. D: Claws reach out for you and you feel a presence invade your mind. N:307:Draebor, the Imp T:minor demon C:v I:120:520:20:75:20 W:28:5:0:750 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:HURT:3d4 B:INSULT F:UNIQUE | INVISIBLE | SMART | ESCORT F:DROP_4 | DROP_GOOD | ONLY_ITEM F:RAND_25 | BASH_DOOR F:FORCE_SLEEP S:1_IN_5 S:BLIND | BLINK | CONF | SCARE | TELE_AWAY | TELE_LEVEL S:TELE_TO | TPORT S:S_KIN D:An intensely irritating git of a monster. N:308:Basilisk T:reptile C:s I:120:310:15:108:30 W:28:3:0:300 B:GAZE:PARALYZE B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:DROP_1 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:NO_CONF | NO_SLEEP S:1_IN_8 S:BR_POIS D:A vile reptile that preys on unsuspecting travellers. Its eyes stare deeply D: at you and your soul starts to wilt! N:309:Ice troll T:troll C:w I:110:132:20:67:50 W:28:1:0:200 B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:COLD:2d6 B:BITE:COLD:2d6 F:MALE | REGENERATE | FRIENDS F:DROP_20 F:HURT_LIGHT | IM_COLD D:He is a white troll with powerfully clawed hands. N:605:Bat of Gorgoroth T:bat C:g I:120:110:20:36:30 W:28:3:0:100 B:BITE:POISON:1d10 B:CLAW:HURT:1d4 F:WEIRD_MIND | FRIENDS F:DROP_40 F:RAND_25 | BASH_DOOR | MOVE_BODY F:IM_POIS S:1_IN_8 S:SCARE S:BR_DARK | BR_POIS D:Fed with horrid meats and grown to enormous size, this slavering creature D: seeks livelier prey. N:589:Spectator T:eye C:B I:110:171:30:1:5 W:28:2:0:150 B:GAZE:PARALYZE:1d4 B:GAZE:CONFUSE:1d4 B:BITE:HURT:1d8 F:NO_FEAR | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:CAUSE_2 | FORGET | HOLD | SLOW D:A lesser relative of the beholder: a globular body with a large toothy mouth, D: a large central eye, and four smaller eyes on stalks protruding from the top D: of its body. N:566:Beorn, the Shape-Changer T:quadruped C:p I:120:1400:25:72:25 W:28:3:0:1000 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d8 B:CRUSH:HURT:3d6 F:UNIQUE | MALE | ANIMAL | SMART | ESCORT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:MOVE_BODY F:FORCE_SLEEP D:Beorn is only occasionally seen in human form these days, preferring to appear D: in the shape of a giant black bear: he also prefers the company of beasts to D: that of humans. He has never taken kindly to strangers, even in human form - D: and still less when in bear's shape, as he is now. ### Dungeon level 29 ### N:310:Purple worm T:worm C:P I:110:293:14:78:30 W:29:3:0:400 B:HIT:HURT:1d8 B:BITE:ACID:2d8 B:STING:POISON:1d8 F:BASH_DOOR F:IM_ACID | IM_POIS D:It is a massive worm form, many feet in length. Its vast maw drips acid and D: poison. N:312:Catoblepas T:quadruped C:g I:110:165:15:66:40 W:29:2:0:400 B:GAZE:TERRIFY:2d4 B:GAZE:BLIND:2d4 B:BUTT:HURT:2d6 B:BITE:HURT:2d12 F:ANIMAL F:DROP_2 | ONLY_GOLD F:IM_POIS D:A strange ox-like form with a huge head but a thin, weak neck, it looks like D: the creation of some deranged alchemist. N:313:Ring mimic T:mimic G:= C:w I:120:180:30:72:100 W:29:3:0:200 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 S:1_IN_4 S:BO_ACID | BO_COLD | BO_ELEC | BO_FIRE S:S_MONSTER D:A strange creature that disguises itself as a discarded ring to lure D: unsuspecting adventurers within reach of its venomous claws. mimic:ring:Speed mimic:ring:Slaying mimic:ring:Constitution mimic:ring:Resist Poison mimic:ring:Free Action mimic:ring:See Invisible N:314:Young blue dragon T:dragon C:b I:110:237:20:60:70 W:29:1:0:500 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:DROP_2 F:OPEN_DOOR | BASH_DOOR F:IM_ELEC S:1_IN_10 S:SCARE S:BR_ELEC D:It has a form that legends are made of. Its still-tender scales are a deep D: blue in hue. Sparks crackle along its length. N:315:Young white dragon T:dragon C:w I:110:237:20:60:70 W:29:1:0:500 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:DROP_2 F:OPEN_DOOR | BASH_DOOR F:IM_COLD S:1_IN_10 S:SCARE S:BR_COLD D:It has a form that legends are made of. Its still-tender scales are a frosty D: white in hue. Icy blasts of cold air come from it as it breathes. N:316:Young green dragon T:dragon C:g I:110:237:20:60:70 W:29:1:0:500 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:DROP_2 F:OPEN_DOOR | BASH_DOOR F:IM_POIS S:1_IN_10 S:SCARE S:BR_POIS D:It has a form that legends are made of. Its still-tender scales are a deep D: green in hue. Foul gas seeps through its scales. N:317:Young bronze dragon T:dragon C:U I:110:237:20:60:70 W:29:0:0:500 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:DROP_2 F:OPEN_DOOR | BASH_DOOR F:NO_CONF S:1_IN_10 S:SCARE S:BR_CONF D:It has a form that legends are made of. Its still-tender scales are a rich D: bronze hue, and its shape glitters with strange colours that confuse you. ########## DUNGEON LEVELS 30-39 ########## ### Dungeon level 30 ### N:209:Fire giant T:giant C:r I:110:289:20:72:50 W:30:1:0:220 B:HIT:FIRE:6d8 B:HIT:FIRE:6d8 F:HAS_LIGHT F:DROP_40 F:OPEN_DOOR F:IM_FIRE S:1_IN_8 D:A glowing fourteen foot tall giant. Flames drip from its red skin. N:318:Mithril golem T:golem C:B I:110:640:12:150:10 W:30:4:0:500 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:COLD_BLOOD | METAL F:DROP_2 | ONLY_GOLD F:BASH_DOOR F:IM_COLD | IM_FIRE | IM_POIS D:It is a massive statue of purest mithril. It looks expensive! N:320:Skeleton troll T:skeleton C:w I:110:110:20:82:20 W:30:1:0:225 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 F:TROLL | EMPTY_MIND | REGENERATE F:OPEN_DOOR | BASH_DOOR D:It is a troll skeleton animated by dark dweomers. N:321:Manticore T:hybrid C:y I:120:220:12:22:10 W:30:2:0:300 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:EVIL F:BASH_DOOR F:FORCE_SLEEP S:1_IN_5 S:ARROW_4 D:It is a winged lion's body with a human torso and a tail covered in vicious D: spikes. N:322:Giant blue ant T:ant C:b I:110:36:10:75:60 W:30:2:0:80 B:BITE:ELEC:5d5 F:RAND_25 F:IM_ELEC D:It is a giant ant that crackles with energy. N:323:Giant army ant T:ant C:o I:120:67:10:60:40 W:30:3:0:90 B:BITE:HURT:2d12 F:FRIENDS F:RAND_25 | KILL_BODY D:An armoured form moving with purpose. Powerful on its own, flee when hordes D: of them march. N:324:Grave wight T:wraith C:b I:110:66:20:60:30 W:30:1:0:325 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EXP_20 F:DROP_1 | ONLY_ITEM F:RAND_25 | OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_8 S:CAUSE_3 | DARKNESS | SCARE D:It is a ghostly form with eyes that haunt you. N:325:Killer slicer beetle T:killer beetle C:y I:110:138:14:72:30 W:30:2:0:200 B:BITE:HURT:5d8 B:BITE:HURT:5d8 D:It is a beetle with deadly sharp cutting mandibles and a rock-hard carapace. N:610:Ogre chieftain T:ogre C:b I:120:240:20:66:30 W:30:5:0:600 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 F:MALE | ESCORT F:DROP_60 | ONLY_ITEM F:MOVE_BODY F:FORCE_SLEEP D:This ogre is leader of his tribe. He sneers at you as he advances towards D: you, wielding a huge club and pushing his own followers rudely aside. N:600:Ghast T:zombie C:u I:120:165:30:60:20 W:30:3:0:130 B:CLAW:PARALYZE:2d4 B:CLAW:PARALYZE:2d4 B:BITE:LOSE_CON:2d4 B:BITE:LOSE_CHR:2d4 F:ESCORT F:DROP_40 F:HURT_LIGHT S:1_IN_7 S:HOLD | SCARE D:This vile abomination is a relative of ghouls, and often leads packs of them. D: It smells foul, and its bite carries a rotting disease. ### Dungeon level 31 ### N:326:Ghost T:ghost C:w I:120:59:20:36:10 W:31:1:0:350 B:WAIL:TERRIFY B:TOUCH:EXP_20 B:CLAW:LOSE_INT:1d6 B:CLAW:LOSE_WIS:1d6 F:DROP_40 | DROP_1 F:RAND_25 | TAKE_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_15 S:BLIND | DRAIN_MANA | HOLD D:You don't believe in it. But it believes in you... N:327:Death watch beetle T:killer beetle C:D I:110:163:16:72:30 W:31:3:0:220 B:BITE:HURT:5d4 B:WAIL:TERRIFY:5d6 D:It is a giant beetle that produces a chilling sound. N:372:Young black dragon T:dragon C:s I:110:264:20:72:70 W:31:1:0:700 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:DROP_3 F:OPEN_DOOR | BASH_DOOR F:IM_ACID S:1_IN_10 S:SCARE S:BR_ACID D:It has a form that legends are made of. Its still-tender scales are a darkest D: black hue. Acid drips from its body. N:382:Young gold dragon T:dragon C:y I:110:264:20:72:70 W:31:1:0:700 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:DROP_3 F:OPEN_DOOR | BASH_DOOR S:1_IN_10 S:SCARE S:BR_SOUN D:It has a form that legends are made of. Its still-tender scales are a D: tarnished gold hue, and light is reflected from its form. N:387:Young red dragon T:dragon C:r I:110:264:20:72:70 W:31:1:0:700 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:HAS_LIGHT F:DROP_3 F:OPEN_DOOR | BASH_DOOR F:IM_FIRE S:1_IN_10 S:SCARE S:BR_FIRE D:It has a form that legends are made of. Its still-tender scales are a deepest D: red hue. Heat radiates from its form. ### Dungeon level 32 ### N:297:Lokkak, the Ogre Chieftain T:ogre C:v I:120:1500:20:120:20 W:32:2:0:1500 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 F:UNIQUE | MALE | ESCORT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:IM_POIS D:An ogre renowned for acts of surpassing cruelty, Lokkak quickly became the D: leader of a large band of violent ogres. N:329:Nexus quylthulg T:quylthulg C:P I:110:65:10:1:0 W:32:1:0:300 F:RES_NEXUS S:1_IN_1 S:BLINK | TELE_AWAY D:It is a very unstable, strange pulsing mound of flesh. N:331:Ninja T:person C:y I:120:85:20:72:10 W:32:2:0:300 B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 F:MALE | EVIL F:DROP_1 F:OPEN_DOOR F:NO_CONF | NO_SLEEP D:A humanoid clothed in black who moves with blinding speed. N:332:Memory moss T:mushroom C:r I:110:2:30:1:5 W:32:3:0:150 B:HIT:CONFUSE:1d4 B:HIT:CONFUSE:1d4 F:NEVER_MOVE F:FORCE_SLEEP S:1_IN_6 S:FORGET D:A mass of green vegetation. You don't remember seeing anything like it D: before. N:380:Young multi-hued dragon T:dragon C:v I:110:281:20:72:70 W:32:1:0:900 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:3d8 F:DROP_3 F:OPEN_DOOR | BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:ATTR_MULTI S:1_IN_8 S:SCARE S:BR_ACID | BR_COLD | BR_ELEC | BR_FIRE | BR_POIS D:It has a form that legends are made of. Beautiful scales of shimmering and D: magical colours cover it. N:606:Doombat T:bat C:R I:120:180:16:112:30 W:32:2:0:250 B:BITE:FIRE:5d4 B:BITE:FIRE:5d4 B:BITE:FIRE:5d4 F:WEIRD_MIND | HAS_LIGHT F:BASH_DOOR F:IM_FIRE D:It is a fast moving creature of chaos, a gigantic black bat surrounded by D: flickering bright red flames. ### Dungeon level 33 ### N:230:Stone giant T:giant C:W I:110:333:20:90:50 W:33:1:0:250 B:HIT:HURT:7d8 B:HIT:HURT:7d8 F:DROP_40 F:OPEN_DOOR | TAKE_ITEM S:1_IN_5 D:It is eighteen feet tall and looking at you. N:319:Shadow drake T:dragon C:G I:110:264:20:84:70 W:33:3:0:1100 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:EXP_10:3d6 F:INVISIBLE F:DROP_3 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | PASS_WALL F:NO_CONF | NO_SLEEP S:1_IN_6 S:CONF | DARKNESS | SCARE | SLOW S:BR_NETH D:It is a dragon-like form wrapped in shadow. Glowing red eyes shine out in the D: dark, and it is surrounded by an aura of unearthly cold that chills the soul D: rather than the body. N:334:Cave troll T:troll C:u I:110:156:20:60:50 W:33:1:0:350 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:BITE:HURT:1d8 B:BITE:HURT:1d8 F:MALE | REGENERATE | FRIENDS F:DROP_20 F:HURT_LIGHT | IM_POIS D:He is a vicious monster, feared for his ferocity. N:336:Mystic T:person C:o I:120:308:30:60:5 W:33:3:0:500 B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 F:MALE | INVISIBLE F:DROP_1 | ONLY_ITEM F:OPEN_DOOR F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:HEAL S:S_ANIMAL | S_SPIDER D:An adept at unarmed combat, the mystic strikes with stunning power. He can D: summon help from nature and is able to focus his power to ease any pain. N:337:Barrow wight T:wraith C:P I:110:83:20:60:10 W:33:3:0:375 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:TOUCH:EXP_40 F:FRIENDS F:DROP_40 F:OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_8 S:CAUSE_2 | DARKNESS | HOLD | SCARE D:It is a ghostly nightmare of an entity. N:338:Skeleton ettin T:skeleton C:w I:110:396:20:75:20 W:33:1:0:325 B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:BITE:HURT:1d5 B:BITE:HURT:1d5 F:TROLL | EMPTY_MIND | REGENERATE F:OPEN_DOOR | BASH_DOOR D:It is the animated form of a massive two-headed troll. N:339:Chaos drake T:dragon C:v I:110:440:20:84:70 W:33:3:0:1400 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:DROP_3 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_FIRE | RES_DISE | NO_CONF | NO_SLEEP F:ATTR_MULTI S:1_IN_6 S:CONF | SCARE | SLOW S:BR_CHAO | BR_DISE D:A dragon twisted by the forces of chaos. It seems first ugly, then fair, as D: its form shimmers and changes in front of your eyes. N:340:Law drake T:dragon C:B I:110:440:20:84:70 W:33:3:0:1400 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:DROP_3 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_COLD | NO_CONF | NO_SLEEP S:1_IN_6 S:CONF | SCARE | SLOW S:BR_SHAR | BR_SOUN D:This dragon is clever and cunning. It laughs at your puny efforts to disturb D: it. N:341:Balance drake T:dragon C:v I:110:528:20:84:70 W:33:3:0:1600 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:DROP_3 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_COLD | IM_FIRE | RES_DISE | NO_CONF | NO_SLEEP S:1_IN_6 S:CONF | SCARE | SLOW S:BR_CHAO | BR_DISE | BR_SHAR | BR_SOUN D:A mighty dragon, the balance drake seeks to maintain the Cosmic Balance, and D: despises your feeble efforts to destroy evil. N:342:Ethereal drake T:dragon C:o I:110:352:20:84:70 W:33:3:0:1200 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:INVISIBLE F:DROP_3 | ONLY_ITEM F:PASS_WALL F:NO_CONF | NO_SLEEP S:1_IN_6 S:CONF | SCARE | SLOW S:BR_DARK | BR_LIGHT D:A dragon of great power, with control over light and dark, the ethereal D: drake's eyes glare with white hatred from the shadows. N:346:Shade T:ghost C:D I:120:147:20:36:10 W:33:3:0:350 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 F:DROP_2 | ONLY_ITEM F:RAND_25 | TAKE_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_15 S:BLIND | DRAIN_MANA | HOLD D:A shadowy form clutches at you from the darkness. A powerful undead creature D: with a deadly touch. N:349:Fire elemental T:elemental C:r I:110:135:12:60:50 W:33:2:0:350 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 F:HAS_LIGHT F:RAND_25 | BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_ELEC | IM_FIRE | HURT_COLD F:FORCE_SLEEP S:1_IN_6 S:BO_FIRE D:It is a towering inferno of flames. N:351:Water elemental T:elemental C:b I:110:113:12:48:50 W:33:2:0:325 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 F:COLD_BLOOD F:RAND_25 | BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_COLD | IM_FIRE | IM_WATER F:FORCE_SLEEP S:1_IN_6 S:BO_COLD D:It is a towering tempest of water. N:404:Crystal drake T:dragon C:u I:110:396:20:84:70 W:33:3:0:1350 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:HAS_LIGHT F:DROP_3 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_COLD | NO_CONF | NO_SLEEP S:1_IN_6 S:CONF | SCARE | SLOW S:BR_SHAR D:A dragon of strange crystalline form. Light shines through it, dazzling your D: eyes with spectrums of colour. ### Dungeon level 34 ### N:311:Archangel T:angel C:B I:110:528:30:81:255 W:34:4:0:1000 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 F:SMART F:DROP_2 F:IM_COLD | IM_FIRE S:1_IN_3 S:BLIND | CONF | HASTE | HEAL | SCARE D:An angel protected by an aura of holiness. Its muscular form looks extremely D: powerful next to your own frail body. N:335:Half-troll T:troll C:U I:110:188:20:60:50 W:34:2:0:400 B:CLAW:HURT:1d5 B:CLAW:HURT:1d5 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:MALE | REGENERATE | FRIENDS F:DROP_20 | ONLY_ITEM F:IM_POIS D:A huge, ugly, half-human in search of plunder. N:343:Bert the Stone Troll T:troll C:s I:120:1100:20:84:50 W:34:7:0:2000 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 F:UNIQUE | MALE | REGENERATE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:MOVE_BODY | TAKE_ITEM F:HURT_ROCK | HURT_LIGHT | IM_COLD | IM_POIS S:1_IN_7 S:BOULDER D:Big, brawny, powerful and with a taste for hobbit. He has friends called Bill D: and Tom. N:344:Bill the Stone Troll T:troll C:s I:120:1100:20:84:50 W:34:7:0:2000 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 F:UNIQUE | MALE | REGENERATE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:MOVE_BODY | TAKE_ITEM F:HURT_ROCK | HURT_LIGHT | IM_COLD | IM_POIS S:1_IN_7 S:BOULDER D:Big, brawny, powerful and with a taste for hobbit. He has friends called Bert D: and Tom. N:345:Tom the Stone Troll T:troll C:s I:120:1100:20:84:50 W:34:7:0:2000 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 F:UNIQUE | MALE | REGENERATE | ESCORT F:DROP_1 | DROP_GOOD | ONLY_ITEM F:MOVE_BODY | TAKE_ITEM F:HURT_ROCK | HURT_LIGHT | IM_COLD | IM_POIS S:1_IN_7 S:BOULDER D:Big, brawny, powerful and with a taste for hobbit. He has friends called Bert D: and Bill. N:347:Spectre T:ghost C:U I:120:147:20:36:10 W:34:3:0:350 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_WIS:5d5 F:DROP_2 | ONLY_ITEM F:RAND_25 | TAKE_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_15 S:BLIND | DRAIN_MANA | HOLD D:A phantasmal shrieking spirit. Its wail drives the intense cold of pure evil D: deep within your body. ### Dungeon level 34 ### #N:353:Carrion crawler #Deleted N:354:Master thief T:person C:b I:130:99:20:45:40 W:34:2:0:350 B:HIT:HURT:2d8 B:HIT:HURT:3d4 B:HIT:EAT_GOLD:4d4 B:HIT:EAT_ITEM:4d5 F:MALE | EVIL F:DROP_2 F:OPEN_DOOR | TAKE_ITEM S:1_IN_6 S:ARROW_2 | BLINK | TRAPS D:Cool and confident, fast and lithe; protect your possessions quickly! N:355:Ulfang the Black T:person C:U I:120:1000:20:108:40 W:34:5:0:1200 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:UNIQUE | MALE | EVIL | HAS_LIGHT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM S:1_IN_10 S:S_KIN D:A short and swarthy Easterling dressed in black. He and his three sons once D: openly swore allegiance to the High Elves, but were secretly in the pay of D: Morgoth. N:356:Lich T:lich C:o I:110:264:20:72:60 W:34:2:0:1000 B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d8 B:TOUCH:LOSE_DEX:2d8 F:DROP_1 F:HURT_LIGHT S:1_IN_4 S:BLIND | BLINK | CAUSE_3 | DRAIN_MANA | HOLD S:SCARE | SLOW | TELE_AWAY | TELE_TO D:It is a skeletal form dressed in robes. It radiates vastly evil power. N:358:Giant grey scorpion T:spider C:s I:120:189:12:60:40 W:34:4:0:275 B:BITE:HURT:1d6 B:STING:POISON:1d4 F:ANIMAL | WEIRD_MIND D:It is a giant grey scorpion. It looks poisonous. N:359:Earth elemental T:elemental C:u I:100:165:10:90:90 W:34:2:0:375 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 F:COLD_BLOOD F:PASS_WALL | KILL_BODY | KILL_ITEM F:HURT_ROCK | IM_COLD | IM_ELEC | IM_FIRE F:FORCE_SLEEP S:1_IN_8 S:BO_ACID D:It is a towering form composed of rock with fists of awesome power. N:360:Air elemental T:elemental C:B I:120:90:12:60:50 W:34:2:0:390 B:HIT:HURT:1d10 B:HIT:CONFUSE:1d4 B:HIT:HURT:1d10 F:COLD_BLOOD F:RAND_25 | BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_COLD | IM_ELEC F:FORCE_SLEEP S:1_IN_8 S:BO_ELEC D:It is a towering tornado of winds. N:362:Eog golem T:golem C:u I:100:1050:12:187:10 W:34:4:0:1200 B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 F:COLD_BLOOD F:DROP_2 | ONLY_GOLD F:BASH_DOOR F:IM_COLD | IM_FIRE | IM_POIS D:It is a massive deep brown statue, striding towards you with an D: all-too-familiar purpose. Your magic surprisingly feels much less powerful D: now. N:375:Mature white dragon T:dragon C:w I:110:352:20:84:70 W:34:1:0:1200 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:DROP_4 F:OPEN_DOOR | BASH_DOOR F:IM_COLD | NO_CONF | NO_SLEEP S:1_IN_9 S:SCARE S:BR_COLD D:A large dragon, scales gleaming bright white. N:384:Mature blue dragon T:dragon C:b I:110:352:20:84:70 W:34:1:0:1200 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:DROP_4 F:BASH_DOOR F:IM_ELEC | NO_CONF | NO_SLEEP S:1_IN_9 S:SCARE S:BR_ELEC D:A large dragon, scales tinted deep blue. N:385:Mature green dragon T:dragon C:g I:110:352:20:84:70 W:34:1:0:1200 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:DROP_4 F:BASH_DOOR F:IM_POIS | NO_CONF | NO_SLEEP S:1_IN_9 S:SCARE S:BR_POIS D:A large dragon, scales tinted deep green. N:386:Mature bronze dragon T:dragon C:U I:110:352:20:84:70 W:34:0:0:1200 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:DROP_4 F:BASH_DOOR F:NO_CONF | NO_SLEEP S:1_IN_9 S:CONF | SCARE S:BR_CONF D:A large dragon with scales of rich bronze. ### Dungeon level 35 ### N:348:Water troll T:troll C:B I:110:316:20:60:50 W:35:1:0:420 B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:BITE:HURT:2d2 B:BITE:HURT:2d2 F:MALE | REGENERATE | FRIENDS F:DROP_20 F:HURT_LIGHT | IM_COLD | IM_POIS D:He is a troll that reeks of brine. N:352:Invisible stalker T:elemental C:y I:130:124:20:69:20 W:35:3:0:300 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 F:EVIL | COLD_BLOOD | INVISIBLE F:RAND_50 | OPEN_DOOR | BASH_DOOR F:IM_ELEC D:It is impossible to define its form but its violence is legendary. N:361:Hellhound T:canine C:r I:120:352:25:120:30 W:35:2:0:600 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:EVIL | HAS_LIGHT | FRIEND F:RAND_25 | BASH_DOOR | MOVE_BODY F:IM_FIRE F:FORCE_SLEEP S:1_IN_5 S:BR_FIRE D:It is a giant dog that glows with heat. Flames pour from its nostrils. N:364:Dagashi T:person C:y I:120:169:20:84:10 W:35:4:0:500 B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 B:HIT:POISON:3d4 F:MALE | EVIL | HAS_LIGHT F:DROP_1 F:OPEN_DOOR F:NO_CONF | NO_SLEEP D:A human warrior, moving with lightning speed. N:365:Gravity hound T:zephyr hound C:W I:110:193:30:36:0 W:35:4:0:500 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:BASH_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_GRAV D:Unfettered by the usual constraints of gravity, these unnatural creatures are D: walking on the walls and even the ceiling! The earth suddenly feels rather D: less solid as you see gravity warp all round the monsters. N:366:Acidic cytoplasm T:jelly C:s I:120:352:12:21:1 W:35:5:0:180 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 F:COLD_BLOOD F:DROP_4 F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:NO_CONF | NO_SLEEP D:A disgusting animated blob of destruction. Flee its gruesome hunger! N:367:Inertia hound T:zephyr hound C:W I:110:193:30:36:0 W:35:4:0:500 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:BASH_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_INER D:Bizarrely, this hound seems to be hardly moving at all, yet it approaches you D: with deadly menace. It makes you tired just to look at it. N:368:Impact hound T:zephyr hound C:u I:110:193:30:36:0 W:35:4:0:500 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:BASH_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_WALL D:A deep brown shape is visible before you, its canine form strikes you with an D: almost physical force. The dungeon floor buckles as if struck by a powerful D: blow as it stalks towards you. N:369:Dread T:ghost C:o I:120:263:20:36:10 W:35:2:0:600 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 F:DROP_2 | ONLY_ITEM F:RAND_25 | TAKE_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP | FRIEND S:1_IN_15 S:BLIND | CONF | DRAIN_MANA | HOLD S:BO_NETH D:It is a form that screams its presence against the eye. Death incarnate, its D: hideous black body seems to struggle against reality as the universe itself D: struggles to banish it. N:373:M[^u]mak T:quadruped C:s I:110:495:20:82:100 W:35:2:0:2100 B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:CRUSH:HURT:4d4 F:ANIMAL | FRIEND D:A massive elephantine form with eyes twisted by madness. N:374:Giant fire ant T:ant C:R I:110:176:14:58:40 W:35:1:0:350 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:FRIENDS | HAS_LIGHT F:KILL_BODY F:IM_FIRE D:A giant ant covered in shaggy fur. Its powerful jaws glow with heat. N:556:Chest mimic T:mimic G:~ C:s I:110:308:30:48:0 W:35:4:0:250 B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BUTT:CONFUSE:4d4 B:SPIT:BLIND:4d4 F:DROP_2 S:1_IN_5 S:BA_POIS S:S_MONSTER D:A strange creature that disguises itself as a chest to lure unsuspecting D: adventurers within reach of its venomous claws. The first that most D: adventurers realise of the deception is when the seemingly invitingly open D: lid of the chest suddenly grows teeth and then slams shut on the adventurer's D: hand... mimic:chest:1 mimic:chest:2 mimic:chest:3 mimic:chest:5 mimic:chest:6 mimic:chest:7 N:597:Silent watcher T:golem C:r I:110:1040:42:96:10 W:35:3:0:800 B:GAZE:TERRIFY B:GAZE:PARALYZE B:GAZE:LOSE_STR B:GAZE:HALLU F:EVIL | COLD_BLOOD F:NEVER_MOVE F:HURT_ROCK | HURT_LIGHT | IM_COLD | IM_FIRE | IM_POIS S:1_IN_6 S:CONF | DRAIN_MANA | HOLD | MIND_BLAST | SHRIEK S:S_MONSTER | S_MONSTERS D:A figure carved from stone, with three vulture faces whose eyes glow with a D: malevolent light. ### Dungeon level 36 ### N:363:Olog T:troll C:y I:110:369:20:60:50 W:36:1:0:450 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:HURT:2d3 B:BITE:HURT:2d3 F:SMART | REGENERATE | FRIENDS F:DROP_20 F:IM_POIS D:It is a massive intelligent troll with needle-sharp fangs. N:247:Cloud giant T:giant C:b I:110:368:20:90:50 W:36:1:0:500 B:HIT:ELEC:8d8 B:HIT:ELEC:8d8 F:DROP_60 F:OPEN_DOOR | TAKE_ITEM F:IM_ELEC S:1_IN_8 D:It is a twenty foot tall giant wreathed in clouds. N:357:Master vampire T:vampire C:g I:110:299:20:72:10 W:36:1:0:750 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 F:DROP_4 S:1_IN_6 S:CAUSE_3 | CONF | DARKNESS | MIND_BLAST S:TELE_TO S:BO_NETH D:It is a humanoid form dressed in robes. Power emanates from its chilling D: frame. N:370:Ooze elemental T:elemental C:g I:110:72:10:120:90 W:36:3:0:300 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 F:COLD_BLOOD | POWERFUL F:BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_COLD | IM_FIRE F:FORCE_SLEEP S:1_IN_5 S:BA_ACID S:BO_ACID D:It is a towering mass of filth, an eyesore of ooze. N:371:Smoke elemental T:elemental C:D I:120:83:10:120:90 W:36:3:0:375 B:ENGULF:HURT:2d6 B:ENGULF:HURT:2d6 F:BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_COLD | IM_ELEC | IM_FIRE F:FORCE_SLEEP S:1_IN_5 S:DARKNESS S:BO_FIRE D:It is a towering blackened form, crackling with heat. N:376:Xorn T:xorn C:u I:110:140:20:96:10 W:36:2:0:650 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 F:PASS_WALL | KILL_ITEM F:IM_COLD | IM_ELEC | IM_FIRE D:A huge creature of the element Earth. Able to merge with its element, it has D: four huge arms protruding from its enormous torso. N:377:Shadow T:ghost C:D I:120:105:30:36:20 W:36:3:0:400 B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 F:DROP_1 | ONLY_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_8 S:SLOW | TELE_TO S:BO_NETH D:A mighty spirit of darkness of vaguely humanoid form. Razor-edged claws reach D: out to end your life as it glides towards you, seeking to suck the energy D: from your soul to feed its power. N:378:Phantom T:ghost C:P I:120:260:30:36:20 W:36:3:0:400 B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 F:DROP_1 | ONLY_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_5 S:FORGET D:An unholy creature of darkness, the aura emanating from this evil being saps D: your very soul. N:379:Grey wraith T:wraith C:s I:110:167:20:60:10 W:36:1:0:700 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:TOUCH:EXP_40 F:DROP_40 | DROP_60 F:OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_7 S:CAUSE_3 | DARKNESS | HOLD | SCARE D:A tangible but ghostly form, made of grey fog. The air around it feels D: deathly cold. N:381:Colossus T:golem C:G I:100:2640:12:180:10 W:36:4:0:850 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:6d6 B:HIT:HURT:6d6 F:COLD_BLOOD F:BASH_DOOR F:IM_COLD | IM_FIRE | IM_POIS D:An enormous construct resembling a titan made from stone. It strides D: purposefully towards you, swinging its slow fists with earth-shattering D: power. N:388:Trapper T:lurker C:w I:120:528:30:90:10 W:36:3:0:580 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:PARALYZE:15d1 B:HIT:PARALYZE:15d1 D:A larger cousin of the lurker, this creature traps unsuspecting victims and D: paralyzes them, to be slowly digested later. N:389:Bodak T:minor demon C:r I:110:193:10:81:90 W:36:2:0:750 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 B:GAZE:EXP_20 F:HAS_LIGHT F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM F:IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_4 S:BA_FIRE S:BO_FIRE S:S_DEMON D:It is a humanoid form composed of flames and hatred. N:391:Necromancer T:person C:R I:110:246:20:75:10 W:36:2:0:630 B:HIT:HURT:2d6 B:HIT:HURT:2d6 F:MALE | EVIL | SMART | HAS_LIGHT F:DROP_1 | ONLY_ITEM F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | HASTE | HOLD | SCARE | TELE_TO S:TPORT S:BO_NETH S:S_UNDEAD D:A gaunt figure, clothed in black robes. N:392:Lorgan, Chief of the Easterlings T:person C:P I:120:1800:25:120:10 W:36:2:0:1200 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 F:UNIQUE | MALE | EVIL | HAS_LIGHT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:FORCE_SLEEP S:1_IN_4 S:TELE_TO S:S_MONSTERS D:A mighty warrior from the east, Lorgan hates everything that he cannot D: control. N:393:Demonologist T:person C:i I:120:246:20:75:10 W:36:2:0:700 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 F:MALE | EVIL | SMART | HAS_LIGHT F:DROP_1 | ONLY_ITEM F:OPEN_DOOR F:FORCE_SLEEP S:1_IN_2 S:HOLD | TPORT S:BO_FIRE S:S_DEMON D:A figure twisted by evil standing in robes of deepest crimson. N:402:Mature red dragon T:dragon C:r I:110:440:20:96:70 W:36:1:0:1500 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:HAS_LIGHT F:DROP_4 F:BASH_DOOR F:IM_FIRE | NO_CONF | NO_SLEEP S:1_IN_9 S:CONF | SCARE S:BR_FIRE D:A large dragon, scales tinted deep red. N:403:Mature gold dragon T:dragon C:y I:110:440:20:96:70 W:36:1:0:1500 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:DROP_4 F:BASH_DOOR F:NO_CONF | NO_SLEEP S:1_IN_9 S:CONF | SCARE S:BR_SOUN D:A large dragon with scales of gleaming gold. N:405:Mature black dragon T:dragon C:s I:110:440:20:96:70 W:36:1:0:1500 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:DROP_4 F:BASH_DOOR F:IM_ACID | NO_CONF | NO_SLEEP S:1_IN_9 S:SCARE S:BR_ACID D:A large dragon, with scales of deepest black. N:615:Greater mummy T:zombie C:y I:110:299:30:102:255 W:36:5:0:800 B:CLAW:LOSE_CON:3d6 B:CLAW:LOSE_CON:3d6 B:GAZE:EXP_40:3d4 B:GAZE:TERRIFY:3d4 F:SMART | ESCORT | ATTR_FLICKER F:DROP_2 | ONLY_ITEM F:MOVE_BODY | TAKE_ITEM F:IM_ACID | IM_ELEC | NO_FEAR F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | DARKNESS | DRAIN_MANA | FORGET | HASTE S:HEAL | MIND_BLAST | SCARE S:BA_COLD | BA_POIS S:BO_NETH S:S_UNDEAD D:Once a powerful ruler, now an even more powerful undead menace. N:590:Gauth T:eye C:D I:110:264:20:75:20 W:36:2:0:600 B:GAZE:UN_BONUS:5d2 B:GAZE:UN_BONUS:5d2 B:GAZE:UN_POWER:5d2 B:GAZE:UN_POWER:5d2 F:EVIL F:BASH_DOOR F:FORCE_SLEEP S:1_IN_5 S:CAUSE_2 | DRAIN_MANA | HOLD | TELE_AWAY S:BA_COLD S:BO_ELEC D:Another lesser relative of the beholder, this six-eyed creature feeds on D: magic. ### Dungeon level 37 ### N:390:Ice elemental T:elemental C:w I:110:193:10:90:90 W:37:3:0:650 B:TOUCH:COLD:4d3 B:HIT:HURT:4d6 B:TOUCH:COLD:4d3 F:COLD_BLOOD | POWERFUL F:BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_COLD | IM_ELEC | HURT_FIRE F:FORCE_SLEEP S:1_IN_5 S:BA_COLD S:BO_ICEE D:It is a towering glacier of ice. N:394:Mummified troll T:zombie C:w I:110:167:20:75:50 W:37:1:0:420 B:HIT:HURT:2d6 B:HIT:HURT:2d6 F:TROLL | EMPTY_MIND | REGENERATE F:DROP_20 F:NO_FEAR D:It is a massive figure clothed in wrappings. You are wary of its massive D: fists. N:395:The Queen Ant T:ant C:v I:120:1500:30:120:10 W:37:2:0:2000 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:UNIQUE | FEMALE | ESCORT | ESCORTS F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:S_KIN D:She's upset because you hurt her children. N:397:Magma elemental T:elemental C:o I:110:193:10:105:90 W:37:3:0:950 B:HIT:FIRE:3d7 B:HIT:HURT:4d6 B:HIT:FIRE:3d7 F:POWERFUL | HAS_LIGHT F:PASS_WALL | KILL_BODY | KILL_ITEM F:IM_ACID | IM_ELEC | IM_FIRE | HURT_COLD F:FORCE_SLEEP S:1_IN_7 S:BA_FIRE S:BO_PLAS D:It is a towering glowing form of molten hate. N:398:Black pudding T:jelly C:D I:110:352:12:21:1 W:37:5:0:50 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 F:COLD_BLOOD | FRIENDS F:DROP_40 | DROP_60 | DROP_1 F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:NO_CONF | NO_SLEEP D:A lump of rotting black flesh that slurrrrrrrps across the dungeon floor. N:399:Killer iridescent beetle T:killer beetle C:v I:110:330:16:72:30 W:37:2:0:850 B:CLAW:ELEC:1d12 B:CLAW:ELEC:1d12 B:GAZE:PARALYZE F:IM_ELEC F:ATTR_MULTI D:It is a giant beetle, whose carapace shimmers with vibrant energies. N:400:Nexus vortex T:vortex C:P I:120:176:100:48:0 W:37:1:0:800 B:ENGULF:HURT:5d5 F:RAND_25 F:RES_NEXUS S:1_IN_6 S:BR_NEXU D:A maelstrom of potent magical energy. N:401:Plasma vortex T:vortex C:R I:120:176:100:48:0 W:37:1:0:800 B:ENGULF:FIRE:4d8 B:ENGULF:ELEC:4d8 F:HAS_LIGHT F:RAND_25 F:IM_ELEC | IM_FIRE | RES_PLAS S:1_IN_6 S:BR_PLAS D:A whirlpool of intense flame, charring the stones at your feet. N:420:Eldrak T:troll C:r I:110:660:20:120:50 W:37:3:0:800 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:DROP_40 F:TAKE_ITEM F:IM_POIS | NO_CONF | NO_SLEEP D:A massive troll, larger and stronger than many men together. N:613:Shardstorm T:vortex C:u I:120:176:40:14:0 W:37:1:0:800 B:ENGULF:HURT:6d6 S:1_IN_4 S:BR_SHAR D:A howling blast of razor-sharp mountain fragments, kept intact by perilous D: magics. ### Dungeon level 38 ### N:396:Will o' the wisp T:elemental C:W I:130:176:30:180:0 W:38:4:0:500 B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HALLU:1d9 F:INVISIBLE | SMART | HAS_LIGHT F:RAND_50 | PASS_WALL F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE F:FORCE_SLEEP S:1_IN_2 S:BLINK | CAUSE_2 | CONF | TPORT D:A strange ball of glowing light. It disappears and reappears and seems to D: draw you to it. You seem somehow compelled to stand still and watch its D: strange dancing motion. N:406:Mature multi-hued dragon T:dragon C:v I:110:528:20:96:70 W:38:1:0:1800 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:4d12 F:DROP_4 F:OPEN_DOOR | BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:ATTR_MULTI S:1_IN_7 S:BLIND | CONF | SCARE S:BR_ACID | BR_COLD | BR_ELEC | BR_FIRE | BR_POIS D:A large dragon, scales shimmering many colours. N:407:Death knight T:person C:D I:120:528:20:120:10 W:38:1:0:1000 B:HIT:HURT:6d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:EVIL | COLD_BLOOD | SMART F:DROP_2 | ONLY_ITEM F:OPEN_DOOR F:IM_COLD F:FORCE_SLEEP S:1_IN_5 S:BLIND | CAUSE_3 | SCARE S:BO_NETH S:S_MONSTERS D:It is a humanoid figure dressed in armour of an ancient form. From beneath D: its helmet, eyes glow a baleful red and seem to pierce you like lances of D: fire. N:408:Castamir the Usurper T:person C:V I:120:880:20:108:40 W:38:5:0:1600 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:UNIQUE | MALE | EVIL | SMART | HAS_LIGHT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM F:FORCE_SLEEP S:1_IN_2 S:HEAL | TRAPS S:BO_COLD | BO_ELEC | BO_FIRE | BO_ICEE D:A Black N['u]menorean who usurped the throne of Gondor, he is treacherous and D: evil. N:409:Time vortex T:vortex C:B I:130:176:100:48:0 W:38:4:0:800 B:ENGULF:EXP_20:5d5 F:RAND_25 S:1_IN_6 S:BR_TIME D:You haven't seen it yet. N:410:Shimmering vortex T:vortex C:o I:140:176:100:48:0 W:38:4:0:800 B:ENGULF:BLIND:4d4 B:ENGULF:BLIND:4d4 F:HAS_LIGHT F:RAND_25 S:1_IN_4 S:SHRIEK S:BR_LIGHT D:A strange pillar of shining light that hurts your eyes. Its shape changes D: constantly as it cuts through the air towards you. It is like a beacon, D: waking monsters from their slumber. N:414:Emperor wight T:wraith C:r I:120:334:20:48:10 W:38:2:0:1600 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 F:DROP_3 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_6 S:CAUSE_3 | HOLD | SCARE S:BO_NETH D:Your life force is torn from your body as this powerful unearthly being D: approaches. N:417:Black wraith T:wraith C:D I:120:440:20:66:10 W:38:2:0:1700 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_40 B:TOUCH:EXP_40 F:DROP_2 | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_7 S:BLIND | CAUSE_3 | HOLD | SCARE S:BO_NETH D:A figure that seems made of void, its strangely human shape is cloaked in D: shadow. It reaches out at you. N:418:Erinyes T:major demon C:u I:110:210:20:75:80 W:38:2:0:1000 B:HIT:HURT:3d4 B:TOUCH:LOSE_STR:1d5 F:FEMALE F:DROP_40 F:IM_FIRE | IM_POIS S:1_IN_7 S:BLIND | CONF S:BO_FIRE D:It is a lesser demon of female form; however, she takes little time to show D: her true colours. N:421:Ettin T:troll C:b I:110:1320:20:120:30 W:38:3:0:1000 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 F:DROP_1 | ONLY_ITEM F:IM_POIS | NO_CONF | NO_SLEEP D:A massive two-headed troll of huge strength, ettins are stupid but violent. D: They are also living proof that two heads are not more intelligent than D: one... N:602:Aranea T:spider C:R I:110:264:20:54:50 W:38:3:0:250 B:CLAW:POISON:2d8 B:CLAW:POISON:2d8 B:BITE:POISON:2d6 B:BITE:POISON:2d6 F:EVIL | ANIMAL | SMART | FRIENDS F:OPEN_DOOR F:HURT_LIGHT | IM_POIS F:FORCE_SLEEP S:1_IN_6 S:CAUSE_3 | HOLD | MISSILE | SLOW S:BO_FIRE D:An intelligent arachnid whose hairy legs weave spells in the air. ### Dungeon level 39 ### N:350:Cherub T:angel C:G I:120:880:30:81:255 W:39:6:0:2700 B:HIT:HURT:4d3 B:HIT:HURT:3d8 B:HIT:HURT:4d3 B:HIT:HURT:3d8 F:SMART F:DROP_2 F:MOVE_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE S:1_IN_3 S:BLIND | HASTE | HEAL | MIND_BLAST | SCARE S:BO_FIRE S:S_MONSTERS D:It is an angel moving very quickly, wielding a holy war hammer and casting a D: volley of powerful spells in your direction. N:419:Nether wraith T:wraith C:G I:120:420:20:66:10 W:39:2:0:1700 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 F:INVISIBLE F:DROP_3 | ONLY_ITEM F:PASS_WALL F:FORCE_SLEEP S:1_IN_6 S:BLIND | CAUSE_3 | DARKNESS | MIND_BLAST | SCARE S:BO_NETH D:A form that hurts the eye, death permeates the air around it. As it nears D: you, a coldness saps your soul. N:423:Kavlax the Many-Headed T:dragon C:D I:120:1300:20:102:30 W:39:3:0:3000 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:UNIQUE | MALE | POWERFUL F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | RES_NEXUS | NO_CONF F:NO_SLEEP S:1_IN_4 S:BR_ACID | BR_COLD | BR_CHAO | BR_ELEC | BR_FIRE | BR_GRAV S:BR_NEXU | BR_SHAR | BR_SOUN D:A large dragon with a selection of heads, all shouting and arguing as they D: look for prey, but each with its own deadly breath weapon. N:426:7-headed hydra T:hydra C:G I:120:550:20:135:20 W:39:2:0:2000 B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:SPIT:BLIND:1d2 F:HAS_LIGHT F:DROP_4 F:MOVE_BODY F:IM_POIS S:1_IN_5 S:SCARE S:BA_POIS S:BR_POIS D:A strange reptilian hybrid with seven heads dripping venom. N:427:Night mare T:quadruped C:G I:120:1320:30:102:0 W:39:3:0:2900 B:BITE:EXP_80:2d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:CONFUSE:6d6 F:UNDEAD | EVIL | COLD_BLOOD F:DROP_2 | ONLY_GOLD F:OPEN_DOOR F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP D:A fearsome skeletal horse with glowing eyes, that watch you with little more D: than a hatred of all that lives. ########## DUNGEON LEVELS 40-49 ########## ### Dungeon level 40 ### N:333:Storm giant T:giant C:B I:120:700:20:90:40 W:40:1:0:1000 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 F:HAS_LIGHT F:DROP_1 F:OPEN_DOOR | TAKE_ITEM F:IM_COLD | IM_ELEC F:FORCE_SLEEP S:1_IN_8 S:BLINK | CONF | SCARE | TELE_TO S:BA_ELEC S:BO_ELEC D:It is a twenty-five foot tall giant wreathed in lightning. N:411:Ancient blue dragon T:ancient dragon C:b I:120:633:20:108:80 W:40:1:0:2000 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:ELEC:7d8 F:BASH_DOOR F:IM_ELEC S:1_IN_6 S:BLIND | CONF | SCARE S:BR_ELEC D:A huge draconic form. Lightning crackles along its length. N:412:Ancient bronze dragon T:ancient dragon C:U I:120:633:20:108:80 W:40:0:0:2000 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:HURT:7d8 F:BASH_DOOR S:1_IN_6 S:BLIND | CONF | SCARE S:BR_CONF D:A huge draconic form enveloped in a cascade of colour. N:413:Beholder T:eye C:U I:120:1400:30:96:10 W:40:3:0:6000 B:GAZE:EXP_20:2d6 B:GAZE:UN_POWER:2d6 B:GAZE:LOSE_INT:2d6 B:BITE:HURT:6d6 F:EVIL F:BASH_DOOR F:IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND | CONF | DARKNESS | DRAIN_MANA | FORGET | MIND_BLAST S:SCARE | SLOW S:BO_ACID | BO_COLD | BO_ELEC | BO_FIRE D:A vile creature with one huge central eye, twelve smaller eyes on stalks, and D: a huge mouth filled with sharp teeth. N:424:Ancient white dragon T:ancient dragon C:w I:120:633:20:108:80 W:40:1:0:2000 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:COLD:7d8 F:BASH_DOOR F:IM_COLD S:1_IN_6 S:BLIND | CONF | SCARE S:BR_COLD D:A huge draconic form. Frost covers it from head to tail. N:425:Ancient green dragon T:ancient dragon C:g I:120:633:20:108:80 W:40:1:0:2000 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:POISON:7d8 F:BASH_DOOR F:IM_POIS S:1_IN_6 S:BLIND | CONF | SCARE S:BR_POIS D:A huge draconic form enveloped in clouds of poisonous vapour. N:430:Disenchanter worm mass T:worm C:v I:100:45:7:6:10 W:40:3:0:30 B:CRAWL:UN_BONUS:1d4 F:WEIRD_MIND | MULTIPLY | STUPID F:RAND_50 | BASH_DOOR F:HURT_LIGHT | RES_DISE | NO_FEAR F:ATTR_MULTI D:It is a strange mass of squirming worms. Magical energy crackles around its D: disgusting form. N:432:Spirit troll T:ghost C:G I:110:880:20:108:5 W:40:3:0:900 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 F:TROLL | REGENERATE F:DROP_60 F:IM_COLD | IM_ELEC | IM_POIS D:A weird ghostly troll-like being from the ethereal plane. N:434:9-headed hydra T:hydra C:r I:120:650:20:114:20 W:40:2:0:3000 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 F:HAS_LIGHT F:DROP_4 F:OPEN_DOOR | MOVE_BODY F:IM_FIRE S:1_IN_4 S:SCARE S:BO_FIRE S:BR_FIRE D:A strange reptilian hybrid with nine smouldering heads. N:435:Enchantress T:person C:i I:130:457:20:72:10 W:40:4:0:2100 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d8 F:FEMALE | EVIL | HAS_LIGHT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND S:S_DRAGON D:This elusive female spellcaster has a special affinity for dragons, whom she D: rarely fights without. N:437:Sorcerer T:person C:R I:130:457:20:72:10 W:40:2:0:2150 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 F:MALE | EVIL | HAS_LIGHT F:DROP_3 | ONLY_ITEM F:OPEN_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND | BLINK | CAUSE_3 | CONF | TELE_TO | TRAPS S:BA_COLD | BA_FIRE S:BO_ACID S:S_DRAGON | S_MONSTER | S_UNDEAD D:A human figure in robes, he moves with magically improved speed, and his hands D: are ablur with spell casting. N:438:Xaren T:xorn C:s I:120:280:20:96:10 W:40:1:0:1200 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:DROP_2 | ONLY_GOLD F:PASS_WALL | KILL_ITEM F:IM_COLD | IM_ELEC | IM_FIRE D:It is a tougher relative of the Xorn. Its hide glitters with metal ores. N:439:Giant roc T:bird C:u I:110:560:20:84:10 W:40:3:0:1000 B:CRUSH:HURT:8d12 B:CRUSH:HURT:8d12 B:HIT:ELEC:12d12 F:BASH_DOOR F:IM_ELEC D:A vast legendary bird, its iron talons rake the most impenetrable of surfaces D: and its screech echoes through the many winding dungeon corridors. N:440:Uvatha the Horseman T:wraith C:p I:120:1800:90:72:10 W:40:3:0:10000 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:EXP_80:4d6 B:HIT:EXP_80:4d6 F:UNIQUE | MALE F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY D:A tall black cloaked Ringwraith, he is a master of horsemanship. He longs to D: taste your blood. N:441:Minotaur T:hybrid C:s I:130:550:13:30:10 W:40:2:0:2100 B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:BUTT:HURT:2d6 B:BUTT:HURT:2d6 F:EVIL F:BASH_DOOR D:It is a cross between a human and a bull. N:442:Medusa, the Gorgon T:naga C:v I:120:2400:30:120:5 W:40:3:0:9000 B:GAZE:EXP_80 B:GAZE:PARALYZE B:HIT:HURT:8d6 B:HIT:HURT:8d6 F:UNIQUE | SMART F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:IM_ACID | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP -F:HURT_COLD S:1_IN_2 S:CAUSE_3 | HOLD | SCARE S:BA_ACID S:BO_FIRE | BO_PLAS S:S_HYDRA | S_KIN D:One of the original three ugly sisters. Her face could sink a thousand ships. D: Her scales rattle as she slithers towards you, venom dripping from her D: ghastly mouth. N:447:Vrock T:major demon C:s I:110:352:20:75:80 W:40:2:0:2000 B:HIT:HURT:3d4 B:CRUSH:HURT:8d12 B:CRUSH:HURT:8d12 F:FRIENDS F:DROP_40 F:IM_FIRE S:1_IN_8 S:BLIND | CONF D:It is a demon with a long neck and raking claws. N:448:Death quasit T:minor demon C:D I:130:387:20:96:0 W:40:3:0:1000 B:BITE:LOSE_DEX:3d6 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:INVISIBLE | SMART F:DROP_3 | ONLY_ITEM F:PASS_WALL F:IM_POIS | NO_FEAR | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_10 S:BLIND | CAUSE_3 | CONF | SCARE S:S_DEMON D:It is a demon of small stature, but its armoured frame moves with lightning D: speed and its powers make it a tornado of death and destruction. N:470:Patriarch T:person C:G I:120:457:20:90:10 W:40:2:0:1800 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d5 F:MALE | EVIL | SMART | HAS_LIGHT F:DROP_2 | ONLY_ITEM F:OPEN_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND | CAUSE_3 | CAUSE_4 | HEAL | HOLD S:S_MONSTER | S_UNDEAD D:An evil priest, dressed all in black. Deadly spells hit you at an alarming D: rate as his black spiked mace rains down blow after blow on your pitiful D: frame. N:612:Troll chieftain T:troll C:P I:120:792:30:60:20 W:40:5:0:3000 B:HIT:HURT:2d12 B:HIT:HURT:2d12 B:BITE:HURT:3d6 B:BITE:HURT:3d6 F:SMART | REGENERATE | ESCORT F:DROP_1 F:MOVE_BODY | TAKE_ITEM F:IM_POIS | NO_FEAR D:This troll's great strength and size have won it the place of chieftain of its D: tribe. It fears nothing. ### Dungeon level 41 ### N:429:Ancient black dragon T:ancient dragon C:s I:120:880:20:108:80 W:41:1:0:2500 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:ACID:7d9 F:BASH_DOOR F:IM_ACID S:1_IN_6 S:BLIND | CONF | SCARE S:BR_ACID D:A huge draconic form. Pools of acid melt the floor around it. N:444:Ancient red dragon T:ancient dragon C:r I:120:880:20:108:80 W:41:1:0:2500 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:FIRE:7d9 F:HAS_LIGHT F:BASH_DOOR F:IM_FIRE S:1_IN_6 S:BLIND | CONF | SCARE S:BR_FIRE D:A huge draconic form. Wisps of smoke steam from its nostrils and the extreme D: heat surrounding it makes you gasp for breath. N:445:Ancient gold dragon T:ancient dragon C:y I:120:880:20:108:80 W:41:1:0:2500 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:HURT:7d9 F:BASH_DOOR S:1_IN_6 S:BLIND | CONF | SCARE S:BR_SOUN D:A huge draconic form wreathed in a nimbus of light. Its roar stuns and D: deafens you. N:450:Dark elven sorcerer T:humanoid C:R I:130:700:20:84:10 W:41:2:0:3000 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 F:MALE | EVIL | SMART F:DROP_3 | ONLY_ITEM F:HURT_LIGHT | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND | BLINK | CAUSE_3 | CONF | DARKNESS | HEAL S:TELE_TO S:BA_COLD | BA_FIRE S:BO_ACID S:S_DEMON | S_MONSTER | S_UNDEAD D:A dark elven figure, dressed in deepest black. Power seems to crackle from D: his slender frame. N:451:Master lich T:lich C:r I:120:1584:20:96:50 W:41:2:0:10000 B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d12 B:TOUCH:LOSE_DEX:2d12 F:DROP_4 | ONLY_ITEM S:1_IN_3 S:BLIND | BLINK | CAUSE_3 | CAUSE_4 | CONF S:DRAIN_MANA | HOLD | SCARE | TELE_TO S:S_UNDEAD D:A skeletal form wrapped in robes. Powerful magic crackles along its bony D: fingers. N:452:Hezrou T:major demon C:g I:110:457:20:60:80 W:41:3:0:2500 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:FRIENDS F:DROP_1 F:IM_FIRE S:1_IN_9 S:BO_FIRE S:S_DEMON D:It is a demon of lizard form with cruel-looking jaws. N:454:Gorlim, Betrayer of Barahir T:person C:z I:120:1600:20:144:40 W:41:3:0:7000 B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 F:UNIQUE | MALE | SMART | HAS_LIGHT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:CAUSE_3 S:BO_MANA | BO_WATE D:This sad creature - once a mighty warrior - betrayed his former friends to D: Morgoth's army in return for, he thought, safety for himself and his wife. D: And so he fell under Morgoth's power and became little more than a mindless D: servant of evil, even though the other side of his "bargain" was not kept. N:582:Ranger Chieftain T:person C:W I:120:880:20:72:10 W:41:2:0:1600 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:MALE | INVISIBLE F:DROP_2 | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM F:IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP S:1_IN_4 S:ARROW_2 | ARROW_3 | ARROW_4 | BLINK | HASTE | MISSILE S:BA_COLD S:BO_ELEC | BO_FIRE S:S_ANIMAL D:A chieftain among the Rangers. His understanding of nature gives him powerful D: elemental spells to use against you, in addition to his skills as an archer D: and a warrior. Furthermore, he is a master of camouflage, so you will need D: magically enhanced seeing to spot him. ### Dungeon level 42 ### N:383:Rogrog the Black Troll T:troll C:D I:120:2000:20:105:50 W:42:3:0:5000 B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:BITE:HURT:4d10 B:SPIT:ACID:4d8 F:UNIQUE | MALE | REGENERATE | ESCORT F:DROP_3 | DROP_GOOD | ONLY_ITEM F:MOVE_BODY | TAKE_ITEM F:IM_COLD | IM_POIS S:1_IN_7 S:BOULDER D:A massive and cruel troll of great power, drool slides caustically down his D: muscular frame. Despite his bulk, he strikes with stunning speed. N:428:Vampire lord T:vampire C:b I:120:1400:20:84:10 W:42:1:0:1800 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_80:4d6 B:BITE:EXP_80:4d6 F:DROP_4 S:1_IN_7 S:BLIND | BRAIN_SMASH | CAUSE_3 | CAUSE_4 | DARKNESS | DRAIN_MANA S:BO_NETH D:A foul wind chills your bones as this ghastly figure approaches. #N:460:Dread #Consolidated (see #369) ### Dungeon level 43 ### N:416:Vargo, Tyrant of Fire T:elemental C:R I:120:2400:12:75:50 W:43:3:0:4000 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 F:UNIQUE | POWERFUL | HAS_LIGHT F:RAND_25 | BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_ELEC | IM_FIRE | HURT_COLD F:FORCE_SLEEP S:1_IN_4 S:BA_FIRE S:BO_PLAS D:A towering fire elemental, Vargo burns everything beyond recognition. N:422:Waldern, King of Water T:elemental C:V I:120:2500:12:120:50 W:43:3:0:4250 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:UNIQUE | COLD_BLOOD | POWERFUL F:RAND_25 | BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_COLD | IM_FIRE | IM_WATER F:FORCE_SLEEP S:1_IN_4 S:BA_COLD | BA_WATE S:BO_ICEE | BO_WATE D:A towering water elemental, Waldern is master of all things liquid. Wave D: after wave drowns your frail body. N:449:Adunaphel the Quiet T:wraith C:p I:120:2100:90:72:10 W:43:3:0:13000 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:TOUCH:EXP_80:5d6 B:TOUCH:EXP_80:5d6 F:UNIQUE | FEMALE | INVISIBLE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:PASS_WALL | MOVE_BODY F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | FORGET | HOLD | SCARE S:BO_ACID | BO_COLD | BO_FIRE | BO_NETH S:S_MONSTER D:A sorceress in life, Adunaphel quickly fell under Sauron's sway and the power D: of the rings. N:456:Glabrezu T:major demon C:U I:110:616:20:60:80 W:43:2:0:3000 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:DROP_60 F:IM_FIRE S:1_IN_9 S:BO_FIRE S:S_DEMON D:It is demon with arms and pincers, its form a true mockery of life. #N:461:M[^u]mak N:462:Ancient multi-hued dragon T:ancient dragon C:v I:120:1848:25:120:80 W:43:1:0:13000 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:ONLY_ITEM F:BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:ATTR_MULTI S:1_IN_5 S:BLIND | CONF | SCARE S:BR_ACID | BR_COLD | BR_ELEC | BR_FIRE | BR_POIS D:A huge draconic form. Many colours ripple down its massive frame. Few live D: to see another. N:466:Quaker, Master of Earth T:elemental C:U I:110:2800:10:145:90 W:43:3:0:4500 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:SHATTER:10d10 F:UNIQUE | MALE | COLD_BLOOD | POWERFUL F:PASS_WALL | KILL_BODY | KILL_ITEM F:HURT_ROCK | IM_COLD | IM_ELEC | IM_FIRE F:FORCE_SLEEP S:1_IN_6 S:BA_ACID S:BO_ACID D:A towering stone elemental stands before you. The walls and ceiling are D: reduced to rubble as Quaker advances. N:468:Ariel, Queen of Air T:elemental C:Z I:130:2700:12:75:50 W:43:3:0:4750 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:CONFUSE:4d4 B:HIT:CONFUSE:4d4 F:UNIQUE | FEMALE | COLD_BLOOD | POWERFUL F:RAND_25 | BASH_DOOR | KILL_BODY | KILL_ITEM F:IM_ACID | IM_COLD | IM_ELEC F:FORCE_SLEEP S:1_IN_5 S:BA_COLD | BA_ELEC S:BO_ELEC D:A towering air elemental, Ariel, the sorceress, avoids your blows with her D: extreme speed. N:616:Multi-hued hound T:zephyr hound C:v I:110:220:25:48:0 W:43:6:0:600 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d4 B:BITE:HURT:4d4 F:BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:ATTR_MULTI | FORCE_SLEEP S:1_IN_5 S:BR_ACID | BR_COLD | BR_ELEC | BR_FIRE | BR_POIS D:Shimmering in rainbow hues, this hound is beautiful and deadly. ### Dungeon level 44 ### N:436:Knight Templar T:person C:w I:120:1056:20:72:10 W:44:2:0:2000 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:MALE | SMART F:DROP_2 | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM F:NO_FEAR | NO_CONF | NO_SLEEP S:1_IN_4 S:BLIND | CAUSE_3 | CAUSE_4 | HASTE | HEAL | SCARE S:S_ANGEL D:It seems that the more devout the person, the more likely they are to cross D: the boundary between piety and sanctimoniousness. And such is the case with D: the Order of the Knights Templar; they are among the most pious and powerful D: of the religious knightly orders, but noted for their intolerance. Thus it D: is Morgoth's will that is unwittingly done, as the forces of good are set D: against each other. N:469:11-headed hydra T:hydra C:R I:120:950:20:120:20 W:44:2:0:6000 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:DROP_4 F:OPEN_DOOR | MOVE_BODY F:IM_FIRE S:1_IN_4 S:SCARE S:BA_FIRE S:BO_FIRE | BO_PLAS S:BR_FIRE D:A strange reptilian hybrid with eleven smouldering heads. N:471:Dreadmaster T:ghost C:y I:120:1056:20:120:10 W:44:2:0:8000 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 F:SMART F:DROP_4 | ONLY_ITEM F:RAND_25 | TAKE_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_9 S:BLIND | CAUSE_4 | CONF | DRAIN_MANA | HOLD | TELE_LEVEL S:BO_NETH S:S_UNDEAD D:It is an unlife of power almost unequaled. An affront to existence, its very D: touch abuses and disrupts the flow of life, and its unearthly limbs, of D: purest black, crush rock and flesh with ease. N:472:Drolem T:golem C:g I:120:2200:25:195:30 W:44:3:0:12000 B:CLAW:HURT:3d10 B:CLAW:HURT:3d10 B:BITE:POISON:5d10 B:BITE:POISON:5d10 F:DRAGON | COLD_BLOOD F:OPEN_DOOR | BASH_DOOR F:IM_COLD | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_5 S:ARROW_3 | BLIND | CONF | SLOW S:BR_POIS D:A constructed dragon, the drolem has massive strength. Powerful spells weaved D: during its creation make it a fearsome adversary. Its eyes show little D: intelligence, but it has been instructed to destroy all it meets. ### Dungeon level 45 ### N:415:Seraph T:angel C:r I:120:1320:30:81:255 W:45:6:0:5000 B:HIT:HURT:4d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:4d6 F:SMART F:DROP_2 F:MOVE_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | NO_FEAR S:1_IN_11 S:CONF | HASTE | HEAL | TELE_AWAY S:BO_MANA | BO_PLAS S:S_ANGEL | S_MONSTERS D:It is an angel, fast and strong. You are stunned by its extreme holiness and D: try to resist all desires to obey it. N:431:Rotting quylthulg T:quylthulg C:u I:120:420:20:1:0 W:45:1:0:3000 S:1_IN_2 S:BLINK | TPORT S:S_UNDEAD D:It is a pulsing flesh mound that reeks of death and putrefaction. N:443:Death drake T:ancient dragon C:G I:120:1848:25:120:80 W:45:2:0:10000 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:EXP_80:7d10 F:INVISIBLE F:ONLY_ITEM F:PASS_WALL | TAKE_ITEM F:IM_COLD S:1_IN_5 S:CONF | DARKNESS | SCARE | SLOW S:BR_NETH D:It is a dragon-like form wrapped in darkness. You cannot make out its true D: form but you sense its evil. N:446:Great crystal drake T:ancient dragon C:u I:120:1848:25:120:80 W:45:2:0:10000 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:HAS_LIGHT | ATTR_FLICKER F:ONLY_ITEM F:BASH_DOOR F:IM_COLD S:1_IN_5 S:CONF | SCARE | SLOW S:BR_SHAR D:A huge crystalline dragon. Its claws could cut you to shreds and its teeth D: are razor sharp. Strange colours ripple through it as it moves in the light. N:453:Akhorahil the Blind T:wraith C:p I:120:2400:90:84:10 W:45:3:0:15000 B:HIT:HURT:7d6 B:HIT:HURT:7d6 B:GAZE:EXP_80:6d6 B:WAIL:TERRIFY:6d6 F:UNIQUE | MALE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | DARKNESS | HOLD | SCARE S:BO_COLD | BO_FIRE | BO_NETH S:S_MONSTERS D:A mighty sorcerer King, Akhorahil was blind in life. With powerful D: enchantments, he created jewelled eyes that enabled him to see better than D: any ordinary man ever could. N:458:Nalfeshnee T:major demon C:r I:110:792:20:60:80 W:45:2:0:5000 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:POWERFUL | HAS_LIGHT F:DROP_1 F:IM_FIRE S:1_IN_9 S:BLIND | CONF S:BR_FIRE S:S_DEMON D:It is a large demon with the head of a giant boar. Flames run up and down its D: length. N:459:Undead beholder T:eye C:u I:120:2376:30:120:10 W:45:3:0:8000 B:GAZE:EXP_40:3d6 B:GAZE:UN_POWER:3d6 B:GAZE:LOSE_INT:3d6 B:BITE:EXP_40:7d6 F:UNDEAD | EVIL | COLD_BLOOD F:BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BRAIN_SMASH | CAUSE_4 | CONF | DRAIN_MANA | FORGET | MIND_BLAST S:SLOW S:BA_COLD | BA_FIRE S:BO_ACID | BO_MANA | BO_NETH S:S_UNDEAD D:A beholder which has cheated death. Black nether storms rage around the D: bloodshot pupil of its central giant eye, and light seems to bend as it sucks D: its power from the very air around it. Your soul chills as it drains your D: vitality for its evil enchantments. N:463:Ethereal dragon T:ancient dragon C:o I:120:1848:25:120:80 W:45:2:0:10000 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:CONFUSE:7d10 F:INVISIBLE F:ONLY_ITEM F:PASS_WALL S:1_IN_5 S:BLIND | CONF S:BR_DARK | BR_LIGHT D:A huge dragon emanating from the ethereal plane, this terrible dragon is a D: master of light and dark. Its form disappears from sight as it cloaks itself D: in unearthly shadows. N:488:Demonic quylthulg T:quylthulg C:r I:120:420:20:1:0 W:45:1:0:3000 S:1_IN_2 S:BLINK | TPORT S:S_DEMON D:A pile of pulsing flesh that glows with an inner hellish fire. The world D: itself seems to cry out against it. N:507:Draconic quylthulg T:quylthulg C:g I:120:420:20:1:0 W:45:1:0:3000 S:1_IN_2 S:BLINK | TPORT S:S_DRAGON D:It looks like it was once a dragon corpse, now deeply infected with magical D: bacteria that make it pulse in a foul and degrading way. N:601:Greater basilisk T:reptile C:D I:120:1010:25:120:15 W:45:2:0:10000 B:GAZE:PARALYZE:3d12 B:GAZE:PARALYZE:3d12 B:BITE:POISON:2d12 B:BITE:POISON:2d12 F:EVIL | POWERFUL | ATTR_FLICKER F:DROP_1 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_POIS | RES_NEXUS | NO_CONF | NO_SLEEP S:1_IN_8 S:BR_DARK | BR_NEXU | BR_POIS D:A large basilisk, whose shape resembles that of a great wyrm. N:583:Berserker T:person C:u I:120:1320:20:96:10 W:45:2:0:2500 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 F:MALE | HAS_LIGHT F:DROP_2 | ONLY_ITEM F:KILL_BODY F:NO_FEAR | NO_CONF | NO_SLEEP S:1_IN_4 S:HASTE | SCARE D:Even the strongest of normal human warriors fears the Berserker - the one who D: can drive himself into such a terrible battle-frenzy that he can survive D: blows which should kill him, and still apparently feel no pain. He tramples D: weaker creatures underfoot in his eagerness to get to his real enemy, and his D: battle-cry strikes terror into his foes. N:584:Cyclops T:giant C:u I:120:1050:20:144:20 W:45:2:0:1500 B:HIT:HURT:9d9 B:HIT:HURT:9d9 F:DROP_1 F:OPEN_DOOR | MOVE_BODY | TAKE_ITEM F:IM_ACID | IM_COLD | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_8 D:A gigantic ugly humanoid with but one eye and very thick skin. ### Dungeon level 46 ### N:473:Scatha the Worm T:ancient dragon C:W I:120:2200:30:156:70 W:46:2:0:17000 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:CLAW:COLD:4d14 B:BITE:COLD:4d14 F:UNIQUE | MALE F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_COLD S:1_IN_4 S:CAUSE_3 | CONF S:BR_COLD D:An ancient and wise Dragon. Scatha has grown clever over the long years. His D: scales are covered with frost, and his breath sends a shower of ice into the D: air. ### Dungeon level 47 ### N:465:Marilith T:major demon C:y I:120:1232:20:112:80 W:47:2:0:7000 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 F:FEMALE F:DROP_1 F:IM_FIRE S:1_IN_9 S:BLIND | CAUSE_2 S:S_DEMON D:She is a demon of female form with many arms, each bearing deadly weapons. N:479:Death mold T:mold C:D I:140:1050:200:72:0 W:47:1:0:1000 B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:EXP_80:5d5 F:EVIL F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE F:FORCE_SLEEP | ATTR_FLICKER D:It is the epitome of all that is evil, in a mold. Its lifeless form draws D: power from sucking the souls of those that approach it, a nimbus of pure evil D: surrounds it. Luckily for you, it can't move. N:480:Itangast the Fire Drake T:ancient dragon C:R I:120:2200:30:144:70 W:47:2:0:20000 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:FIRE:4d14 B:BITE:FIRE:4d14 F:UNIQUE | MALE | HAS_LIGHT F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_FIRE S:1_IN_4 S:CAUSE_3 | CONF S:BR_FIRE D:A mighty ancient dragon, Itangast's form scorches your flesh. Wisps of smoke D: curl up from his nostrils as he regards you with disdain. ### Dungeon level 48 ### N:457:Ren the Unclean T:wraith C:p I:120:2700:90:84:10 W:48:3:0:18000 B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 F:UNIQUE | MALE | INVISIBLE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:IM_FIRE F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | HOLD | SCARE S:BA_FIRE S:BO_FIRE | BO_NETH S:S_MONSTER D:Ren was an insane eastern king who believed himself to be the son of a volcano D: god. At an early age his sanity was destroyed by a plague that wiped out his D: family, and he never recovered. N:475:Smaug the Golden T:ancient dragon C:R I:120:2400:30:195:70 W:48:2:0:23000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:5d14 B:BITE:FIRE:5d14 F:UNIQUE | MALE | HAS_LIGHT F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_FIRE S:1_IN_4 S:CAUSE_3 | CONF S:BR_FIRE D:Smaug is one of the Urul['o]ki that still survive, a fire-drake of immense D: cunning and intelligence. His speed through air is matched by few other D: dragons and his dragonfire is what legends are made of; he is believed to be D: the greatest dragon still surviving into the Third Age. N:603:Elder aranea T:spider C:r I:120:1050:20:78:50 W:48:5:0:2500 B:CLAW:POISON:5d8 B:CLAW:POISON:5d8 B:BITE:POISON:5d6 B:BITE:POISON:5d6 F:EVIL | ANIMAL | SMART | ESCORT F:OPEN_DOOR F:HURT_LIGHT | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_6 S:CAUSE_3 | DRAIN_MANA | HEAL | HOLD | MIND_BLAST | SLOW S:BA_FIRE S:BO_FIRE S:S_KIN | S_SPIDER D:A vast, bloated arachnid, master of its brood: among the more terrible of D: Ungoliant's descendants, this is a monster such as those who haunted the D: dread valley of Nan Dungortheb long ago. N:562:Winged Horror T:bird C:p I:120:1013:30:96:5 W:48:3:0:4000 B:CLAW:HURT:3d8 B:CLAW:HURT:3d8 B:BITE:EXP_40:4d6 B:BITE:EXP_40:4d6 F:IM_COLD | IM_POIS S:1_IN_6 S:BR_DARK | BR_NETH | BR_POIS D:A terrifying sight: a winged creature greater than any bird you have ever D: seen, and with no feathers on its horrid black leathery wings. Descended D: from a creature of an older world perhaps, bred by Sauron to be a winged D: steed for his Ringwraiths. ### Dungeon level 49 ### N:467:Lesser Balrog T:major demon C:p I:120:1760:20:75:80 W:49:2:0:10000 B:HIT:FIRE:4d12 B:HIT:FIRE:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER F:POWERFUL | HAS_LIGHT F:DROP_2 | DROP_GOOD F:MOVE_BODY F:IM_FIRE S:1_IN_4 S:BLIND | CONF S:BR_FIRE S:S_DEMON D:It is a massive humanoid demon wreathed in flames. N:594:E["o]l, the Dark Elf T:humanoid C:v I:130:2400:20:150:60 W:49:2:0:25000 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 F:UNIQUE | MALE | EVIL | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM F:HURT_LIGHT | IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND | BLINK | CAUSE_4 | CONF | DARKNESS | HEAL S:TELE_TO S:BA_ACID | BA_COLD | BA_ELEC | BA_FIRE | BA_NETH S:BO_MANA S:S_DEMON | S_DRAGON | S_MONSTERS | S_UNDEAD D:A lord of the Teleri, E["o]l is a mighty metalsmith, the only one to ever D: forge weapons of meteorite iron. The mortal enemy of the Eldar, he is D: currently fleeing their wrath, following the murder of Princess Aredhel of D: Gondolin. ########## DUNGEON LEVELS 50-59 ########## ### Dungeon level 50 ### N:482:Master mystic T:person C:o I:130:968:30:72:5 W:50:3:0:6000 B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:HIT:PARALYZE:20d1 B:HIT:PARALYZE:15d1 F:MALE | INVISIBLE | ATTR_FLICKER F:DROP_2 | ONLY_ITEM F:OPEN_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:FORCE_SLEEP S:1_IN_3 S:HEAL S:S_ANIMAL D:A lord of all that is natural, skilled in the mystic ways. He is a master of D: martial arts and is at one with nature, able to summon help from the wild if D: need be. N:483:The Balrog of Moria T:major demon C:v I:130:3000:20:150:80 W:50:3:0:30000 B:HIT:FIRE:6d12 B:HIT:FIRE:6d12 B:CRUSH:HURT:5d12 B:TOUCH:UN_POWER F:UNIQUE | MALE | POWERFUL | ESCORT | HAS_LIGHT F:ESCORTS F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_FIRE S:1_IN_4 S:CONF | SCARE S:BR_FIRE S:S_DEMON | S_UNDEAD D:A huge Balrog surrounded by raging pillars of fire, this is indeed a terrible D: opponent. Wielding a great whip of fire and a blazing sword, his fury D: blisters your skin and melts your flesh! ### Dungeon level 51 ### N:485:Nether hound T:zephyr hound C:G I:120:330:30:120:0 W:51:4:0:5000 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:OPEN_DOOR | BASH_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_NETH D:You feel a soul-tearing chill upon viewing this beast, a ghostly form of D: darkness in the shape of a large dog. N:486:Time hound T:zephyr hound C:B I:130:330:30:120:0 W:51:4:0:5000 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ATTR_FLICKER F:OPEN_DOOR | BASH_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_TIME D:You get a terrible sense of deja vu, or is it a premonition? All at once you D: see a little puppy and a toothless old dog. Perhaps you should give up and D: go to bed. N:487:Plasma hound T:zephyr hound C:R I:120:330:30:120:0 W:51:4:0:5000 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:HAS_LIGHT | ATTR_FLICKER F:OPEN_DOOR | BASH_DOOR F:IM_ELEC | IM_FIRE | RES_PLAS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_PLAS D:The very air warps as pure elemental energy stalks towards you in the shape of D: a giant hound. Your hair stands on end and your palms itch as you sense D: trouble. N:491:Harowen the Black Hand T:person C:Z I:140:2500:40:108:0 W:51:3:0:20000 B:TOUCH:EAT_GOLD:5d5 B:TOUCH:EAT_ITEM:5d5 B:HIT:BLIND:10d5 B:HIT:POISON:8d5 F:UNIQUE | MALE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM F:IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:TRAPS D:He is a master of disguise, an expert of stealth, a genius at traps, and moves D: with blinding speed. Check your pockets! ### Dungeon level 52 ### N:464:Ji Indur Dawndeath T:wraith C:p I:120:3200:90:84:10 W:52:3:0:22000 B:HIT:HURT:8d7 B:HIT:HURT:8d7 B:TOUCH:EXP_40:6d7 B:TOUCH:EXP_40:6d7 F:UNIQUE | MALE | INVISIBLE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:IM_FIRE F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | HOLD | SCARE S:BA_ACID | BA_COLD | BA_ELEC | BA_FIRE | BA_NETH S:S_UNDEAD D:This Ringwraith was a weak-minded sorcerer-king who fell easily under Sauron's D: power. ### Dungeon level 53 ### N:502:Chaos vortex T:vortex C:v I:120:315:100:96:0 W:53:3:0:4000 B:ENGULF:CONFUSE:5d5 B:ENGULF:CONFUSE:5d5 B:ENGULF:CONFUSE:5d5 B:ENGULF:HALLU:5d5 F:RAND_25 F:ATTR_MULTI S:1_IN_6 S:BR_CHAO D:Void, nothingness, spinning destructively. N:614:Storm of Unmagic T:vortex C:v I:120:315:50:48:0 W:53:3:0:4000 B:ENGULF:UN_POWER:5d5 B:ENGULF:UN_BONUS:5d5 F:RAND_25 F:RES_DISE F:ATTR_MULTI S:1_IN_6 S:BR_DISE D:Howling through the disintegrating dungeon, this whirlpool of Unmagic rips the D: enchantments from everything it touches. ### Dungeon level 54 ### N:497:The Phoenix T:bird C:r I:120:3600:60:156:0 W:54:3:0:40000 B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 F:UNIQUE | HAS_LIGHT F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_ACID | IM_ELEC | IM_FIRE | IM_POIS | RES_PLAS | NO_CONF F:NO_SLEEP F:FORCE_SLEEP S:1_IN_3 S:BA_FIRE S:BO_FIRE | BO_PLAS S:BR_FIRE | BR_LIGHT | BR_PLAS S:S_KIN D:A massive glowing eagle bathed in flames. The searing heat chars your skin D: and melts your armour. N:557:Demilich T:lich C:U I:120:2816:20:150:50 W:54:2:0:12500 B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:4d12 B:TOUCH:LOSE_DEX:4d12 F:DROP_3 | DROP_GOOD | ONLY_ITEM S:1_IN_3 S:BLIND | BLINK | CAUSE_3 | CAUSE_4 | CONF S:DRAIN_MANA | FORGET | HEAL | HOLD | SCARE | TELE_TO S:TPORT S:S_DEMON | S_UNDEAD D:A lich who is partially immaterial, on its way to a new, ethereal form. N:596:Elder vampire T:vampire C:r I:120:2640:20:108:10 W:54:3:0:4500 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:BITE:EXP_80:5d6 B:BITE:EXP_80:5d6 F:INVISIBLE F:DROP_4 | DROP_GOOD F:PASS_WALL S:1_IN_5 S:BRAIN_SMASH | CAUSE_3 | CAUSE_4 | DARKNESS | DRAIN_MANA S:BO_NETH S:S_UNDEAD D:A terrible robed undead figure, this creature has existed in its unlife for D: many centuries by stealing the life of others. It can summon the very shades D: of its victims from beyond the grave to come enslaved to its aid. ### Dungeon level 55 ### N:330:Shelob, Spider of Darkness T:spider C:D I:120:3500:30:180:80 W:55:3:0:27000 B:CLAW:POISON:5d6 B:CLAW:POISON:5d6 B:BITE:PARALYZE:5d10 B:STING:LOSE_STR:5d4 F:UNIQUE | FEMALE | EVIL | ANIMAL | SMART | ESCORT F:ESCORTS F:DROP_2 | DROP_GOOD | ONLY_ITEM F:HURT_LIGHT | IM_ACID | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_4 S:BLIND | CAUSE_3 | CAUSE_4 | CONF | HEAL | SCARE S:SLOW | TRAPS S:BR_DARK | BR_POIS S:S_KIN D:Shelob is an enormous bloated spider, the last daughter of Ungoliant the D: Unlight. Her poison is legendary, as is her ego. She normally guards the D: pass through Cirith Ungol, but occasionally goes out foraging for food to D: feed her voracious appetite. N:455:Archon T:angel C:y I:130:1800:30:168:255 W:55:5:0:10000 B:GAZE:TERRIFY:4d4 B:GAZE:TERRIFY:4d4 B:HIT:HURT:8d6 B:HIT:HURT:8d6 F:SMART | ATTR_FLICKER F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | NO_FEAR S:1_IN_3 S:BLIND | CAUSE_2 | CAUSE_4 | SCARE | TELE_TO S:BO_MANA S:S_ANGEL D:Never a more heavenly being have you seen. The very holiness of its presence D: makes you deeply respect it. Few creatures can match the powers of an D: Archon; fewer still live to tell the tale after attacking one. N:476:Dracolich T:ancient dragon C:G I:120:3080:25:144:80 W:55:2:0:18000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:EXP_80:7d14 F:UNDEAD | COLD_BLOOD F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR | TAKE_ITEM F:IM_COLD | IM_POIS S:1_IN_6 S:CONF | SCARE S:BR_COLD | BR_NETH D:The skeletal form of a once-great dragon, enchanted by magic most perilous. D: Its animated form strikes with speed and drains life from its prey to satisfy D: its hunger. N:478:Dracolisk T:ancient dragon C:i I:120:3080:25:144:80 W:55:2:0:14000 B:BITE:HURT:4d12 B:BITE:HURT:4d12 B:BITE:FIRE:7d14 B:GAZE:PARALYZE F:ANIMAL F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_ACID | IM_FIRE | RES_NEXUS S:1_IN_6 S:HOLD | SCARE S:BR_FIRE | BR_NEXU D:A mixture of dragon and basilisk, the dracolisk stares at you with deep D: piercing eyes, its evil breath burning the ground where it stands. N:611:Ar-Pharaz[^o]n the Golden T:person C:y I:130:4000:30:54:255 W:55:1:0:32500 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 F:UNIQUE | MALE | EVIL | SMART | HAS_LIGHT | ATTR_FLICKER F:DROP_3 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:OPEN_DOOR | MOVE_BODY | TAKE_ITEM F:IM_ELEC | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_6 S:HEAL | TELE_AWAY S:S_KIN | S_MONSTERS D:Last and proudest king of ancient N['u]menor. Corrupted by power and avarice, D: he fell victim to Sauron's wiles, tried to fight the Valar themselves, and D: condemned N['u]menor to oblivion. N:567:Barbazu T:major demon C:G I:120:700:25:90:80 W:55:4:0:3000 B:HIT:HURT:4d10 B:HIT:HURT:4d10 B:HIT:LOSE_CON:10d2 B:STING:POISON:5d5 F:FRIENDS F:DROP_1 F:IM_POIS S:1_IN_10 S:SCARE S:S_DEMON D:A foul, humanoid creature with a long tail, clawed hands and feet, and a D: disgusting, wiry, snaky beard. They are the elite shock troops of the hells, D: capable of a terrifying berserk fury. ### Dungeon level 56 ### N:433:Lesser titan T:giant C:y I:120:2100:30:96:15 W:56:3:0:6000 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 F:SMART | ATTR_FLICKER F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | TAKE_ITEM F:FORCE_SLEEP S:1_IN_3 S:HEAL | TELE_TO S:S_MONSTERS D:It is a humanoid figure thirty feet tall that gives off an aura of power and D: hate. N:474:Dwar, Dog Lord of Waw T:wraith C:p I:120:4000:90:108:10 W:56:3:0:25000 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:BITE:EXP_40:6d7 B:WAIL:TERRIFY:6d7 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | HOLD | SCARE S:BA_FIRE | BA_NETH S:S_HOUND | S_MONSTERS | S_UNDEAD D:Dwar had a special affinity for dogs in life, and can still command them at D: will. He howls maniacally as he reaches out to destroy you. ### Dungeon level 57 ### N:493:Grand master mystic T:person C:o I:130:1936:30:96:5 W:57:3:0:15000 B:KICK:HURT:20d2 B:KICK:HURT:10d2 B:HIT:PARALYZE:20d1 B:HIT:PARALYZE:15d1 F:MALE | INVISIBLE | ATTR_FLICKER F:DROP_4 | ONLY_ITEM F:OPEN_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:FORCE_SLEEP S:1_IN_3 S:HEAL | MIND_BLAST S:S_ANIMAL | S_HOUND | S_SPIDER D:He is one of the few true masters of the art, being extremely skillful in all D: forms of unarmed combat and controlling the world's natural creatures with D: disdainful ease. N:499:Hand druj T:skeleton C:y I:130:528:20:132:10 W:57:2:0:12000 F:SMART | ATTR_FLICKER F:NEVER_BLOW | NEVER_MOVE F:FORCE_SLEEP S:1_IN_1 S:BLIND | CAUSE_3 | CONF | DARKNESS | FORGET | SCARE S:TELE_AWAY S:BO_ACID | BO_COLD | BO_ELEC | BO_FIRE D:A skeletal hand floating in the air, motionless except for its flexing D: fingers. N:504:The Lernaean Hydra T:hydra C:v I:120:4500:20:168:20 W:57:2:0:20000 B:BITE:POISON:8d6 B:BITE:POISON:8d6 B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 F:UNIQUE | SMART | POWERFUL | REGENERATE | HAS_LIGHT F:DROP_4 F:OPEN_DOOR | KILL_BODY F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP -F:HURT_COLD S:1_IN_3 S:SCARE S:BA_FIRE | BA_POIS S:BO_FIRE | BO_PLAS S:BR_FIRE | BR_POIS S:S_HYDRA | S_KIN D:A massive legendary hydra. It has twelve powerful heads. Its many eyes stare D: at you as clouds of smoke and poisonous vapour rise from its seething form. D: And it grows new heads as fast as you chop them off. ### Dungeon level 58 ### N:490:Baphomet the Minotaur Lord T:hybrid C:v I:130:4700:30:144:30 W:58:4:0:24000 B:BUTT:HURT:12d13 B:BUTT:HURT:12d13 B:HIT:HURT:10d10 B:HIT:HURT:10d10 F:UNIQUE | MALE | EVIL F:DROP_4 | DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:ARROW_4 | SLOW S:BA_ELEC S:BO_MANA | BO_PLAS S:BR_WALL D:A fearsome bull-headed monster, Baphomet swings a mighty axe as he curses all D: that defy him. N:500:Eye druj T:skeleton C:r I:130:880:20:108:10 W:58:2:0:15000 F:SMART | ATTR_FLICKER F:NEVER_BLOW | NEVER_MOVE F:IM_FIRE F:FORCE_SLEEP S:1_IN_1 S:BRAIN_SMASH S:BA_NETH S:BO_MANA | BO_NETH S:S_UNDEAD D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it D: harmless. ### Dungeon level 59 ### N:495:Ethereal hound T:zephyr hound C:G I:120:480:30:120:0 W:59:5:0:7000 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:INVISIBLE F:PASS_WALL F:NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_NETH D:A pale green hound. Pulsing red lines and strange fluorescent light hints at D: internal organs best left to the imagination. N:501:Skull druj T:skeleton C:o I:130:1232:20:144:10 W:59:2:0:18000 F:SMART | ATTR_FLICKER F:NEVER_BLOW | NEVER_MOVE F:IM_FIRE F:FORCE_SLEEP S:1_IN_1 S:BRAIN_SMASH | CAUSE_4 | MIND_BLAST | SLOW | TRAPS S:BA_WATE S:BO_NETH | BO_PLAS S:S_UNDEAD D:A glowing skull possessed by sorcerous power. It need not move, but merely D: blast you with mighty magic as it speaks the words of power. N:508:Fundin Bluecloak T:humanoid C:Z I:130:5000:25:234:10 W:59:2:0:20000 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 F:UNIQUE | MALE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF F:NO_SLEEP F:FORCE_SLEEP S:1_IN_4 S:BLIND | BRAIN_SMASH | CAUSE_3 | CAUSE_4 | CONF | HEAL S:SCARE S:S_ANIMAL | S_MONSTERS D:He is one of the greatest dwarven priests to walk the earth. Fundin has D: earned a high position in the church, and his skill with both weapon and D: spell only justify his position further. His combination of both dwarven D: strength and priestly wisdom are a true match for any adventurer. ########## DUNGEON LEVELS 60-69 ########## ### Dungeon level 60 ### N:503:Aether vortex T:vortex C:v I:130:420:100:48:0 W:60:4:0:5000 B:ENGULF:ELEC:5d5 B:ENGULF:FIRE:5d5 B:ENGULF:ACID:5d5 B:ENGULF:COLD:5d5 F:RAND_25 F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | RES_NEXUS F:RES_PLAS F:ATTR_MULTI S:1_IN_6 S:BR_ACID | BR_CHAO | BR_COLD | BR_DARK | BR_ELEC S:BR_FIRE | BR_GRAV | BR_INER | BR_LIGHT | BR_NETH | BR_NEXU S:BR_PLAS | BR_POIS | BR_SHAR | BR_SOUN | BR_TIME | BR_WALL D:An awesome vortex of pure magic, power radiates from its frame. N:514:Saruman of Many Colours T:person C:v I:120:5000:100:120:0 W:60:1:0:35000 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:UNIQUE | MALE | EVIL | SMART | HAS_LIGHT F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:OPEN_DOOR F:IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:ATTR_MULTI | FORCE_SLEEP S:1_IN_2 S:BLIND | CAUSE_4 | FORGET | HASTE | HEAL | MIND_BLAST S:SCARE | TELE_AWAY | TPORT | TRAPS S:BA_ACID | BA_COLD | BA_FIRE | BA_WATE S:BO_ICEE S:S_ANIMAL | S_DEMON | S_HI_DRAGON | S_MONSTERS | S_UNDEAD D:Originally known as the White, Saruman fell prey to Sauron's wiles. He seeks D: to emulate him and breeds orcs and trolls to fight for him. He searches D: forever for the One Ring, to become a mighty Sorcerer-King of the world. ### Dungeon level 61 ### N:484:Nightwing T:wraith C:v I:120:1830:20:144:10 W:61:3:0:10000 B:TOUCH:POISON:6d5 B:TOUCH:POISON:6d5 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 F:SMART | ATTR_FLICKER F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:FORCE_SLEEP S:1_IN_4 S:BLIND | BRAIN_SMASH | CAUSE_4 | SCARE S:BA_NETH S:BO_MANA | BO_NETH S:S_UNDEAD D:Everywhere colours seem paler and the air chillier. At the centre of the cold D: stands a mighty figure. Its wings envelop you in the chill of death as the D: nightwing reaches out to draw you into oblivion. Your muscles sag and your D: mind loses all will to fight as you stand in awe of this mighty being. N:509:Uriel, Angel of Fire T:angel C:R I:130:5500:40:192:10 W:61:3:0:25000 B:HIT:FIRE:4d12 B:HIT:FIRE:4d12 B:HIT:HURT:10d10 B:HIT:HURT:10d10 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | RES_PLAS S:1_IN_2 S:BLIND | TELE_TO S:BA_FIRE S:BO_FIRE | BO_MANA | BO_PLAS S:BR_FIRE | BR_PLAS S:S_ANGEL D:A creature of godly appearance, you dare not challenge Uriel's supremacy. D: Those who stood against him before are but a memory, cremated by his mastery D: of elemental fire. N:568:Bile Demon T:major demon C:R I:120:2464:40:135:80 W:61:2:0:12000 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:CRUSH:ACID:9d9 F:POWERFUL F:DROP_3 | DROP_GOOD F:IM_ACID | IM_POIS S:1_IN_6 S:ARROW_4 | BLIND | CONF S:BR_ACID | BR_POIS S:S_DEMON D:It's big. It's fat. It's red. It's ugly. It's got a severe attack of D: highly poisonous flatulence. And its insides are corrosive. All of which go D: together to make the single most repulsive sight - and smell - you have ever D: experienced. ### Dungeon level 62 ### N:510:Azriel, Angel of Death T:angel C:D I:130:6000:40:204:10 W:62:3:0:30000 B:HIT:EXP_80:10d5 B:HIT:EXP_80:10d5 B:HIT:HURT:10d10 B:HIT:HURT:10d10 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE S:1_IN_2 S:BLIND | TELE_TO S:BA_NETH S:BO_MANA | BO_NETH S:BR_NETH S:S_ANGEL D:Azriel commands awesome power, his visage holy enough to shrivel your soul. D: You shriek with disbelief as his mastery of death draws you to your grave. D: It is truly beyond all but the mightiest of warriors to stand against him and D: live. N:515:Dreadlord T:ghost C:r I:120:2640:20:180:10 W:62:2:0:20000 B:HIT:EXP_40:6d6 B:HIT:EXP_40:6d6 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 F:ATTR_FLICKER F:DROP_4 | ONLY_ITEM F:TAKE_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_4 S:BLIND | BLINK | BRAIN_SMASH | CONF | DRAIN_MANA | HOLD S:TELE_TO | TPORT S:BA_NETH S:S_UNDEAD D:It is a massive form of animated death, its colour deeper than black. It D: drinks in light, and space around it is twisted and torn by the weight of its D: evil. It is unlife and it knows nothing but the stealing of souls and the D: stench of death. Flee its hunger! ### Dungeon level 63 ### N:489:Great Storm Wyrm T:ancient dragon C:b I:120:3080:30:225:80 W:63:2:0:20000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:ELEC:6d14 B:BITE:ELEC:6d14 F:HAS_LIGHT | ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_ELEC S:1_IN_4 S:BLIND | CONF | SCARE S:BR_ELEC D:A vast dragon of power. Storms and lightning crash around its titanic form. D: Deep blue scales reflect the flashes and highlight the creature's great D: muscles. It regards you with contempt. N:496:Great Ice Wyrm T:ancient dragon C:w I:120:3080:30:225:80 W:63:2:0:20000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:COLD:6d14 B:BITE:COLD:6d14 F:ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_COLD S:1_IN_4 S:BLIND | CONF | SCARE S:BR_COLD D:An immense dragon capable of awesome destruction. You have never felt such D: extreme cold, or witnessed such an icy stare. Begone quickly or feel its D: wrath! N:576:Great Swamp Wyrm T:ancient dragon C:g I:120:3080:30:225:80 W:63:2:0:20000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:POISON:6d14 B:BITE:POISON:6d14 F:ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_POIS S:1_IN_4 S:BLIND | CONF | SCARE S:BR_POIS D:A truly enormous dragon with great powers. The foul gases issuing from the D: beast nearly make you vomit; and while you may try to hold your breath as you D: fight it, it sees no reason to do likewise. N:577:Great Wyrm of Perplexity T:ancient dragon C:U I:120:3080:30:225:80 W:63:0:0:20000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:CONFUSE:6d14 B:BITE:CONFUSE:6d14 F:ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR S:1_IN_4 S:BLIND | CONF | SCARE S:BR_CONF D:A dragon of great size and power. Its polished bronze scales reflect the D: light in strange and confusing patterns, and you find it hard to keep your D: mind on the job of fighting for your life. ### Dungeon level 64 ### N:492:Hoarmurath of Dir T:wraith C:p I:120:4500:90:120:10 W:64:3:0:30000 B:HIT:HURT:9d9 B:HIT:HURT:9d9 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:FORCE_SLEEP S:1_IN_3 S:BLIND | CAUSE_3 | CAUSE_4 | HOLD | MIND_BLAST | SCARE S:BA_COLD | BA_NETH S:BO_COLD S:S_UNDEAD D:A Ringwraith powerful in fell sorcery, he yearns for the life he has lost for D: an unlife of everlasting torment. N:513:Gabriel, the Messenger T:angel C:w I:130:7500:40:216:10 W:64:3:0:35000 B:HIT:UN_BONUS:6d8 B:HIT:FIRE:6d8 B:HIT:BLIND:10d10 B:HIT:BLIND:10d10 F:UNIQUE | MALE | SMART | ESCORT F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE S:1_IN_2 S:BLIND | TELE_TO S:BO_MANA S:S_KIN D:Commanding a legion of angels, Gabriel will destroy you for your sins. He D: will crush you like the pitiful insignificant being he sees you to be. Your D: very soul will be taken into judgement by his supreme authority as he D: cleanses the world of evil. N:518:Chaos hound T:zephyr hound C:v I:120:930:30:120:0 W:64:4:0:10000 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:BASH_DOOR F:NO_CONF | NO_SLEEP F:ATTR_MULTI | FORCE_SLEEP S:1_IN_5 S:BR_CHAO D:A constantly changing canine form, this hound rushes towards you as if D: expecting mayhem and chaos ahead. It appears to have an almost kamikaze D: relish for combat. You suspect all may not be as it seems. N:558:Archlich T:lich C:B I:120:3520:20:180:50 W:64:2:0:20000 B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:8d12 B:TOUCH:LOSE_DEX:8d12 F:DROP_4 | DROP_GOOD | ONLY_ITEM F:PASS_WALL S:1_IN_3 S:BLINK | CAUSE_4 | DRAIN_MANA | FORGET | HEAL S:HOLD | SCARE | TELE_TO | TPORT S:BA_NETH S:S_DEMON | S_HI_UNDEAD D:A lich who has reached its ultimate evolutionary stage: a completely D: immaterial state. ### Dungeon level 65 ### N:532:The Mouth of Sauron T:person C:v I:130:7000:60:120:10 W:65:3:0:38000 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:UN_POWER:5d5 B:HIT:UN_POWER:5d5 F:UNIQUE | MALE | EVIL | INVISIBLE | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR F:IM_COLD | IM_ELEC | IM_FIRE | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:CAUSE_3 | HOLD | TELE_TO | TRAPS S:BA_DARK | BA_FIRE | BA_MANA | BA_NETH | BA_WATE S:BO_PLAS S:S_HI_DEMON | S_HI_UNDEAD D:The Mouth of Sauron is a mighty spell caster. So old that even he cannot D: remember his own name, his power and evil are undeniable. He believes D: unshakably that he is unbeatable and laughs as he weaves his awesome spells. N:569:Osyluth T:major demon C:W I:130:2288:20:112:80 W:65:2:0:13000 B:HIT:LOSE_CHR:6d6 B:HIT:LOSE_CHR:6d6 B:BITE:POISON:8d8 B:STING:LOSE_STR:5d5 F:INVISIBLE | POWERFUL F:DROP_3 | DROP_GOOD F:MOVE_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS S:1_IN_6 S:SCARE S:BA_COLD | BA_ELEC S:BO_ICEE S:S_DEMON D:It is a demon made almost entirely out of bones. It is humanoid, but with a D: large tail similar to that of a giant scorpion, and emits a foul smell of D: decay and rot. They are despised even in the hells. ### Dungeon level 66 ### N:477:Greater titan T:giant C:o I:120:3344:30:150:15 W:66:3:0:23500 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 F:SMART | ATTR_FLICKER F:DROP_4 | DROP_GOOD | ONLY_ITEM F:TAKE_ITEM F:FORCE_SLEEP S:1_IN_3 S:HEAL | TELE_TO S:S_MONSTERS D:A forty foot tall humanoid that shakes the ground as it walks. The power D: radiating from its frame shakes your courage, its hatred inspired by your D: defiance. N:516:The Cat Lord T:feline C:v I:130:4800:100:240:0 W:66:3:0:30000 B:CLAW:CONFUSE:12d12 B:CLAW:LOSE_DEX:2d12 B:CLAW:BLIND:10d5 B:BITE:PARALYZE:15d1 F:UNIQUE | MALE | INVISIBLE | ESCORT | ESCORTS F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_3 S:TELE_TO S:S_KIN D:Master of all things feline, the Cat Lord moves with unsurpassed stealth. ### Dungeon level 67 ### N:505:Thuringwethil, the Vampire Messenger T:vampire C:v I:130:5000:20:174:10 W:67:4:0:23000 B:BITE:EXP_80:6d6 B:BITE:EXP_80:6d6 B:HIT:CONFUSE:6d6 B:HIT:CONFUSE:6d6 F:UNIQUE | FEMALE | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM -F:HURT_FIRE S:1_IN_3 S:BLIND | BRAIN_SMASH | CAUSE_3 | CAUSE_4 | DRAIN_MANA S:BA_NETH S:S_HI_UNDEAD | S_KIN D:Chief messenger between Sauron and Morgoth, she is surely the most deadly of D: her vampire race. At first she is charming to meet, but her wings and eyes D: give away her true form. N:506:Great Hell Wyrm T:ancient dragon C:r I:120:3344:30:225:80 W:67:2:0:23000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:6d14 B:BITE:FIRE:6d14 F:HAS_LIGHT | ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_FIRE S:1_IN_4 S:BLIND | CONF | SCARE S:BR_FIRE D:A vast dragon of immense power. Fire leaps continuously from its huge form. D: The air around it scalds you. Its slightest glance burns you, and you truly D: realize how insignificant you are. N:591:Beholder hive-mother T:eye C:b I:120:3080:30:96:10 W:67:3:0:17000 B:BITE:EXP_80:6d6 B:GAZE:PARALYZE:5d5 B:GAZE:LOSE_INT:5d5 B:GAZE:UN_POWER:5d5 F:FEMALE | EVIL | SMART F:BASH_DOOR F:IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND | BRAIN_SMASH | CONF | DRAIN_MANA | FORGET | SCARE S:BA_ACID | BA_COLD | BA_DARK | BA_FIRE S:BO_MANA | BO_NETH S:S_KIN D:A hive mother of the race of beholders, she can summon her brood to her aid D: whenever she wishes. N:578:Great Bile Wyrm T:ancient dragon C:s I:120:3080:30:225:80 W:67:2:0:23000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:ACID:6d14 B:BITE:ACID:6d14 F:ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_ACID S:1_IN_4 S:BLIND | CONF | SCARE S:BR_ACID D:A huge and very powerful dragon. Great steaming pools of acid drip from its D: form onto the ground. You shudder when you see the acid eating away the very D: stones of the dungeon - what could it do to you? N:579:Great Wyrm of Thunder T:ancient dragon C:y I:120:3080:30:225:80 W:67:2:0:23000 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:HURT:6d14 B:BITE:HURT:6d14 F:ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR S:1_IN_4 S:BLIND | CONF | SCARE S:BR_SOUN D:A dragon of gigantic proportions, with destructive abilities to match. The D: sheer loudness of its roar leaves you stunned and unable to think clearly D: enough to defend yourself adequately. ### Dungeon level 68 ### N:517:Jabberwock T:hybrid C:v I:130:2816:35:187:255 W:68:3:0:19000 B:CLAW:HURT:10d10 B:CLAW:HURT:10d10 B:BITE:HURT:10d10 B:BITE:HURT:10d10 F:ANIMAL F:DROP_40 | DROP_60 | ONLY_ITEM F:BASH_DOOR F:ATTR_MULTI | FORCE_SLEEP S:1_IN_5 S:CAUSE_4 S:BR_CHAO D:"Beware the Jabberwock, my son! The jaws that bite, the claws that catch!" D: Run and run quickly, for death incarnate chases behind you! N:522:Tselakus, the Dreadlord T:ghost C:R I:130:6500:20:180:10 W:68:2:0:35000 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 F:UNIQUE | MALE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:IM_COLD | IM_POIS F:FORCE_SLEEP S:1_IN_3 S:BLIND | CONF | HOLD S:BA_DARK | BA_NETH S:S_HI_UNDEAD | S_KIN | S_WRAITH D:This huge affront to existence twists and tears at the fabric of space. A D: master of mighty magic, Tselakus hungers for your tender flesh. Darkness D: itself recoils from the touch of Tselakus as he leaves a trail of death and D: destruction. Tselakus is a being of sneering contempt, laughing at your D: pitiful efforts to defy him. Mighty claws rend reality as he annihilates all D: in his path to your soul! N:608:Bone golem T:golem C:D I:120:3080:20:255:50 W:68:3:0:23000 B:HIT:UN_BONUS:8d8 B:HIT:UN_BONUS:8d8 B:HIT:LOSE_STR:6d6 B:HIT:LOSE_STR:6d6 F:UNDEAD | COLD_BLOOD F:OPEN_DOOR | BASH_DOOR F:IM_COLD | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_8 S:BRAIN_SMASH | CAUSE_4 | DRAIN_MANA | TELE_TO S:BA_NETH S:S_UNDEAD D:A skeletal form, black as night, constructed from the bones of its previous D: victims. ### Dungeon level 69 ### N:498:Nightcrawler T:wraith C:D I:120:2440:20:192:10 W:69:3:0:15000 B:STING:LOSE_CON:8d8 B:STING:LOSE_CON:8d8 B:BITE:ACID:10d10 B:BITE:ACID:10d10 F:SMART | ATTR_FLICKER F:DROP_2 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_FIRE F:FORCE_SLEEP S:1_IN_4 S:BLIND | BRAIN_SMASH | SCARE S:BA_NETH S:BO_MANA | BO_NETH S:BR_NETH S:S_UNDEAD D:This intensely evil creature bears the form of a gargantuan black worm. Its D: gaping maw is a void of blackness, acid drips from its steely hide. It is D: like nothing you have ever seen before, and a terrible chill runs down your D: spine as you face it. N:585:Polyphemus, the Blind Cyclops T:giant C:g I:130:5300:40:210:40 W:69:3:0:29000 B:HIT:HURT:11d10 B:HIT:HURT:11d10 B:HIT:SHATTER:11d10 F:UNIQUE | MALE F:DROP_3 | DROP_GOOD | ONLY_ITEM F:RAND_25 | KILL_BODY | KILL_ITEM F:IM_ACID | IM_COLD | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_5 S:BA_ACID | BA_WATE S:BO_ICEE | BO_WATE D:No ordinary cyclops, but the son of a sea-god: he wields the powers of D: elemental water as well as the considerable strength of a cyclops. His one D: eye was blinded long ago by the warrior Odysseus, but he has trained himself D: to hear so well that it nearly makes up for his disability. ### Dungeon level 69 ### N:570:Gelugon T:major demon C:w I:130:3080:20:150:80 W:69:3:0:14000 B:CLAW:COLD:6d8 B:CLAW:COLD:6d8 B:BITE:COLD:9d9 B:HIT:PARALYZE:5d5 F:POWERFUL | REGENERATE F:DROP_4 | DROP_GOOD F:IM_COLD S:1_IN_6 S:HOLD | SCARE | SLOW S:BA_COLD S:BO_ICEE S:BR_COLD | BR_SHAR S:S_HI_DEMON D:This demon from the ice planes is a truly terrifying sight. It has an D: extremely large, insect-like body towering a full twelve feet tall, with D: great claws on its hands and pincers on its mouth, and its head bulges with D: great multi-faceted eyes. Its tail is covered with razor-sharp spikes. ########## DUNGEON LEVELS 70-79 ########## ### Dungeon level 70 ### N:481:Glaurung, Father of the Dragons T:ancient dragon C:v I:130:7500:30:210:70 W:70:3:0:50000 B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:POISON:8d14 B:BITE:FIRE:8d14 F:UNIQUE | MALE | HAS_LIGHT F:DROP_GOOD | DROP_GREAT | ONLY_ITEM F:BASH_DOOR F:IM_FIRE | IM_POIS S:1_IN_3 S:BLIND | CONF | SCARE S:BR_FIRE | BR_POIS S:S_HI_DRAGON D:Glaurung is the father of all dragons, and was for a long time the most D: powerful. Though this is no longer so, he still has full command over his D: brood and can command them to appear whenever he so wishes. He is the D: definition of dragonfire. ### Dungeon level 71 ### N:525:Greater demonic quylthulg T:quylthulg C:R I:120:1320:20:1:0 W:71:2:0:10500 F:ATTR_FLICKER S:1_IN_2 S:BLINK | TELE_TO S:S_HI_DEMON D:A massive pulsating mound of flesh, glowing with a hellish light. N:526:Greater draconic quylthulg T:quylthulg C:G I:120:1320:20:1:0 W:71:2:0:10500 F:ATTR_FLICKER S:1_IN_2 S:BLINK | TELE_TO S:S_HI_DRAGON D:A massive mound of scaled flesh, throbbing and pulsating with multi-hued D: light. N:527:Greater rotting quylthulg T:quylthulg C:U I:120:1320:20:1:0 W:71:2:0:10500 F:ATTR_FLICKER S:1_IN_2 S:BLINK | TELE_TO S:S_HI_UNDEAD D:A massive pile of rotting flesh. A disgusting stench fills the air as it D: throbs and writhes. ### Dungeon level 72 ### N:494:Kham[^u]l, the Black Easterling T:wraith C:p I:120:5000:90:120:10 W:72:3:0:40000 B:HIT:HURT:9d10 B:HIT:HURT:9d10 B:TOUCH:EXP_40:7d7 B:TOUCH:EXP_40:7d7 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:IM_ACID | IM_FIRE F:FORCE_SLEEP S:1_IN_2 S:BLIND | CAUSE_3 | CAUSE_4 | HOLD | SCARE | TELE_LEVEL S:BA_COLD | BA_FIRE | BA_NETH S:BO_MANA S:S_HI_UNDEAD D:A warrior-king of the East. Kham[^u]l is a powerful opponent, his skill in D: combat awesome and his form twisted by evil cunning. N:571:Horned Reaper T:major demon C:B I:130:3344:40:180:80 W:72:3:0:18000 B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 F:REGENERATE F:DROP_4 | DROP_GOOD F:KILL_BODY F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS S:1_IN_5 S:HASTE | SCARE | SLOW S:S_HI_DEMON D:A giant humanoid demon wielding a massive, heavy and sharp scythe. Feared by D: foes and friends alike when it flies into one of its berserk rages, the D: Horned Reaper will cut down anything in its path between it and you - even D: the minions it has just summoned. ### Dungeon level 73 ### N:512:Nightwalker T:wraith C:D I:130:1650:20:210:10 W:73:3:0:20000 B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:8d8 B:HIT:UN_BONUS:8d8 F:SMART | ATTR_FLICKER F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_ELEC | IM_FIRE F:FORCE_SLEEP S:1_IN_4 S:BLIND | BRAIN_SMASH | SCARE S:BA_NETH S:BO_MANA | BO_NETH S:S_UNDEAD D:A huge giant garbed in black, more massive than a titan and stronger than a D: dragon. With terrible blows, it breaks your armour from your back, leaving D: you defenseless against its evil wrath. It can smell your fear, and you in D: turn smell the awful stench of death as this ghastly figure strides towards D: you menacingly. N:529:Omarax, the Eye Tyrant T:eye C:v I:130:6500:30:96:10 W:73:3:0:25000 B:GAZE:UN_BONUS:6d6 B:GAZE:UN_POWER:6d6 B:GAZE:LOSE_INT:6d6 B:BITE:EXP_80:8d8 F:UNIQUE | MALE | EVIL | SMART F:BASH_DOOR F:IM_ACID | IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_2 S:BLIND | BRAIN_SMASH | CONF | DRAIN_MANA | FORGET | SCARE S:BA_ACID | BA_COLD | BA_DARK | BA_FIRE | BA_NETH S:BO_MANA S:S_KIN D:A beholder of great size and age, floating in the air. His gaze seems to D: shred your soul and his spells crush your will. He is ancient, his history D: steeped in forgotten evils, his atrocities numerous and sickening. ### Dungeon level 74 ### N:524:Black reaver T:lich C:D I:120:3960:20:255:50 W:74:3:0:23000 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 F:ATTR_FLICKER F:DROP_2 | DROP_GOOD | ONLY_ITEM F:KILL_WALL S:1_IN_3 S:BLIND | CAUSE_3 | CAUSE_4 | CONF | DRAIN_MANA S:HOLD | TELE_TO S:BA_MANA | BA_NETH S:S_UNDEAD D:A humanoid form, black as night, advancing steadily and unstoppably, even the D: very rock of the dungeon cannot prevent it reaching you. N:531:Aether hound T:zephyr hound C:v I:120:1230:30:120:0 W:74:5:0:10000 B:CLAW:HURT:3d12 B:CLAW:HURT:3d12 B:BITE:HURT:3d12 B:BITE:HURT:3d12 F:BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | RES_DISE F:RES_NEXUS | RES_PLAS | NO_CONF | NO_SLEEP F:ATTR_MULTI | FORCE_SLEEP S:1_IN_5 S:BR_ACID | BR_CHAO | BR_COLD | BR_DARK | BR_DISE S:BR_ELEC | BR_FIRE | BR_GRAV | BR_INER | BR_LIGHT | BR_NETH S:BR_NEXU | BR_PLAS | BR_POIS | BR_SHAR | BR_SOUN | BR_TIME S:BR_WALL D:A shifting, swirling form. It seems to be all colours and sizes and shapes, D: though the dominant form is that of a huge dog. You feel very uncertain all D: of a sudden. ### Dungeon level 75 ### N:519:Great Wyrm of Chaos T:ancient dragon C:v I:120:3960:40:255:100 W:75:2:0:29000 B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_FIRE | RES_DISE F:ATTR_MULTI S:1_IN_4 S:BLIND | CONF | SCARE S:BR_CHAO | BR_DISE S:S_DRAGON | S_HI_DRAGON D:A massive dragon of changing form. As you watch, it appears first fair and D: then foul. Its body is twisted by chaotic forces as it strives to stay real. D: Its very existence distorts the universe around it. N:520:Great Wyrm of Law T:ancient dragon C:B I:120:3960:40:255:100 W:75:2:0:29000 B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_COLD S:1_IN_4 S:BLIND | CONF | SCARE S:BR_SHAR | BR_SOUN S:S_DRAGON | S_HI_DRAGON D:A massive dragon of powerful intellect. It seeks to dominate the universe and D: despises all other life. It sees all who do not obey it as mere insects to D: be crushed underfoot. N:530:Ungoliant, the Unlight T:spider C:D I:130:13000:40:240:80 W:75:1:0:35000 B:CLAW:POISON:8d6 B:CLAW:POISON:8d6 B:BITE:PARALYZE:8d10 B:STING:LOSE_STR:8d4 F:UNIQUE | FEMALE | EVIL | ANIMAL | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM F:HURT_LIGHT | IM_ACID | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_3 S:BLIND | CONF | DARKNESS | HEAL | SCARE | SLOW S:BA_DARK S:BR_DARK | BR_POIS S:S_KIN D:This enormous, hideous spirit of void is in the form of a spider of immense D: proportions. She is surrounded by a cloud of Unlight as she sucks in all D: living light into her bloated body, and breathes out the blackest of D: darkness. She is always ravenously hungry and would even eat herself to avoid D: starvation. N:609:Bronze golem T:golem C:o I:120:3520:20:255:50 W:75:3:0:26000 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 F:DEMON | COLD_BLOOD | HAS_LIGHT F:OPEN_DOOR | BASH_DOOR F:IM_ACID | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_8 S:TELE_TO S:BA_ELEC | BA_FIRE S:BO_PLAS S:BR_FIRE S:S_DEMON D:A gigantic four-armed animated bronze statue of demonic shape, glowing with D: great heat. ### Dungeon level 76 ### N:533:Master quylthulg T:quylthulg C:B I:120:2640:30:1:0 W:76:2:0:15000 F:ATTR_FLICKER S:1_IN_1 S:BLINK | TELE_TO S:S_ANIMAL | S_HI_DEMON | S_HI_DRAGON | S_HI_UNDEAD | S_MONSTERS D:A giant seething mass of flesh, overwhelming you with monster after monster. N:586:Atlas, the Titan T:giant C:s I:120:6000:30:192:15 W:76:3:0:37000 B:HIT:SHATTER:13d13 B:HIT:CONFUSE:13d13 B:HIT:SHATTER:13d13 B:HIT:CONFUSE:13d13 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | KILL_WALL | KILL_BODY | TAKE_ITEM F:HURT_ROCK | IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_5 D:The strongest of all the Titans. Legend has it that he used to hold the sky D: on his shoulders; and the mountain range that now does so is named after him. ### Dungeon level 77 ### N:528:Feagwath, the Undead Sorcerer T:lich C:v I:130:5000:20:127:50 W:77:2:0:30000 B:TOUCH:EXP_80:6d12 B:TOUCH:UN_POWER:6d12 B:TOUCH:LOSE_DEX:6d12 B:TOUCH:LOSE_DEX:6d12 F:UNIQUE | MALE F:ESCORT F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM S:1_IN_2 S:BLIND | BLINK | CAUSE_4 | HOLD | SCARE S:TELE_TO | TRAPS S:BA_MANA | BA_NETH S:BO_MANA S:S_KIN | S_MONSTERS | S_UNDEAD D:A stench of corruption and decay surrounds this sorcerer, who has clearly D: risen from the dead to continue his foul plots and schemes. N:572:Pit Fiend T:major demon C:o I:130:3520:30:180:75 W:77:3:0:22000 B:CLAW:FIRE:6d10 B:CLAW:FIRE:6d10 B:BITE:POISON:5d10 B:BITE:LOSE_CON:5d10 F:POWERFUL | REGENERATE F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_FIRE | IM_POIS S:1_IN_5 S:CAUSE_4 | SCARE S:BA_FIRE S:BR_CHAO | BR_FIRE | BR_POIS S:S_HI_DEMON | S_HI_DRAGON D:Appearing as a giant, clawed and winged humanoid with a scaly red body and D: massive fangs dripping a foul green liquid, the Pit Fiend is a dreadful enemy D: from the lowest depths of the hells. They are often the commanders of vast D: demon armies. ### Dungeon level 78 ### #N:537:Hellhound #Deleted ### Dungeon level 79 ### N:521:Great Wyrm of Balance T:ancient dragon C:P I:120:4400:40:255:100 W:79:2:0:31000 B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:ATTR_FLICKER F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_COLD | IM_FIRE | RES_DISE S:1_IN_4 S:BLIND | CONF | SCARE S:BR_CHAO | BR_DISE | BR_SHAR | BR_SOUN S:S_DRAGON | S_HI_DRAGON D:A massive dragon, one of the mightiest of dragonkind. It is thousands of D: years old and seeks to maintain the Cosmic Balance. It sees you as an D: upstart troublemaker without the wisdom to control your actions. It will D: destroy you. N:523:Great Wyrm of Many Colours T:ancient dragon C:v I:120:4400:40:255:100 W:79:2:0:31000 B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:DROP_GOOD | ONLY_ITEM F:BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:ATTR_MULTI S:1_IN_4 S:BLIND | CONF | SCARE S:BR_ACID | BR_COLD | BR_ELEC | BR_FIRE | BR_POIS S:S_DRAGON | S_HI_DRAGON D:A gigantic dragon whose scales shimmer in myriad hues. N:534:Qlzqqlzuup, the Emperor Quylthulg T:quylthulg C:v I:130:5000:30:1:0 W:79:3:0:20000 F:UNIQUE F:DROP_4 | DROP_GOOD | ONLY_ITEM F:ATTR_MULTI S:1_IN_1 S:S_ANGEL | S_ANIMAL | S_HI_DEMON | S_HI_DRAGON | S_HI_UNDEAD | S_HOUND S:S_HYDRA | S_KIN | S_MONSTERS | S_SPIDER | S_UNIQUE | S_WRAITH D:A gigantic seething mass of flesh, Qlzqqlzuup changes colours in front of your D: eyes. Pulsating first one colour then the next, it knows only it must bring D: help to protect itself. N:573:Greater Balrog T:major demon C:P I:130:4400:40:210:80 W:79:3:0:25000 B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:7d12 B:TOUCH:UN_POWER F:POWERFUL | HAS_LIGHT | ATTR_FLICKER F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_ELEC | IM_FIRE | IM_POIS | RES_PLAS S:1_IN_3 S:CONF | SCARE S:BA_FIRE S:BO_PLAS S:BR_FIRE | BR_PLAS S:S_DEMON | S_HI_DEMON | S_UNDEAD D:Originally of the semi-divine Maiar, this evil spirit swore allegiance to D: Morgoth at the beginning of time and is now one of his most terrible demonic D: servants. With its flaming whip and sword it seeks to destroy you. ########## DUNGEON LEVELS 80-89 ########## ### Dungeon level 80 ### N:535:The Witch-King of Angmar T:wraith C:p I:130:6000:90:144:10 W:80:3:0:60000 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:EXP_80:7d7 B:HIT:EXP_80:7d7 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:FORCE_SLEEP S:1_IN_2 S:BLIND | BRAIN_SMASH | CAUSE_3 | HOLD | SCARE | TELE_AWAY S:BA_NETH S:BO_MANA S:S_HI_DEMON | S_HI_DRAGON | S_HI_UNDEAD | S_KIN | S_MONSTERS | S_WRAITH D:The Chief of the Ringwraiths. A fell being of devastating power. His spells D: are lethal and his combat blows crushingly hard. He moves at speed, and D: commands legions of evil to do his bidding. It is said that he is fated D: never to die by the hand of mortal man. ### Dungeon level 81 ### N:595:Maeglin, the Traitor of Gondolin T:humanoid C:p I:130:6000:70:144:20 W:81:2:0:35000 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 F:UNIQUE | MALE | EVIL F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:KILL_WALL | MOVE_BODY F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_6 S:S_ANIMAL | S_HI_DEMON | S_HI_DRAGON | S_HI_UNDEAD | S_MONSTERS | S_UNIQUE S:S_WRAITH D:The son of E["o]l the Dark Elf, Maeglin is every bit as evil as his father and D: more. His greed for gold led him to betray the Hidden Kingdom of Gondolin to D: Morgoth's forces. He is a mighty warrior himself, and some of Morgoth's D: greatest servants answer to his call. ### Dungeon level 82 ### N:536:Pazuzu, Lord of Air T:major demon C:Z I:140:5500:40:150:10 W:82:2:0:30000 B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 F:UNIQUE | MALE | INVISIBLE F:DROP_4 | DROP_GOOD F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS S:1_IN_3 S:MIND_BLAST S:BA_ELEC S:BO_ELEC | BO_MANA S:S_HI_DEMON D:A winged humanoid demon from the Planes of Hell, Pazuzu grins inhumanely at D: you as he decides your fate. ### Dungeon level 83 ### N:541:Draugluin, Sire of All Werewolves T:canine C:m I:130:7000:80:135:90 W:83:2:0:40000 B:CLAW:HURT:6d8 B:CLAW:HURT:6d8 B:BITE:POISON:6d6 B:BITE:POISON:6d6 F:UNIQUE | MALE | EVIL | ESCORT | ESCORTS F:DROP_1 | DROP_GOOD | ONLY_ITEM F:RAND_25 | OPEN_DOOR | BASH_DOOR | MOVE_BODY | TAKE_ITEM F:IM_POIS F:FORCE_SLEEP S:1_IN_3 S:SCARE S:S_HOUND | S_MONSTERS D:Draugluin provides Sauron with a fearsome personal guard. He is an enormous D: wolf inhabited with a human spirit. He is chief of all his kind. ### Dungeon level 84 ### N:538:Cantoras, the Skeletal Lord T:skeleton C:W I:140:7500:20:180:80 W:84:2:0:45000 B:GAZE:EXP_80:5d5 B:GAZE:EXP_80:5d5 B:TOUCH:POISON:5d5 B:TOUCH:POISON:5d5 F:UNIQUE | MALE | SMART F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:IM_FIRE F:FORCE_SLEEP S:1_IN_2 S:BRAIN_SMASH | CAUSE_4 | SCARE | SLOW | TELE_TO S:BA_NETH | BA_WATE S:BO_ICEE | BO_MANA S:S_HI_UNDEAD D:A legion of evil undead druj animating the skeleton of a once mighty sorcerer. D: His power is devastating and his speed unmatched in the underworld. Flee his D: wrath! ### Dungeon level 85 ### N:511:Ancalagon the Black T:ancient dragon C:D I:130:10000:40:255:70 W:85:3:0:45000 B:CLAW:HURT:6d12 B:CLAW:HURT:6d12 B:BITE:HURT:10d14 B:BITE:HURT:10d14 F:UNIQUE | MALE F:ESCORT F:DROP_GOOD | DROP_GREAT | ONLY_ITEM F:BASH_DOOR F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS S:1_IN_3 S:BR_ACID | BR_COLD | BR_ELEC | BR_FIRE | BR_POIS S:S_HI_DRAGON | S_KIN D:"Rushing Jaws" is his name, and death is his game; the greatest and most D: terrible of all dragonkind, his power dismayed even the Valar for a time. ### Dungeon level 86 ### N:539:The Tarrasque T:reptile C:v I:130:8500:50:222:20 W:86:2:0:35000 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:UN_POWER B:TOUCH:UN_POWER F:UNIQUE | POWERFUL F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:IM_COLD | IM_FIRE | RES_DISE | NO_CONF | NO_SLEEP F:ATTR_MULTI | FORCE_SLEEP -F:HURT_COLD S:1_IN_2 S:BR_COLD | BR_DISE | BR_FIRE D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable and D: immune to magic. Fear its anger, for its devastation is unmatched! ### Dungeon level 87 ### N:587:Kronos, Lord of the Titans T:giant C:v I:120:7000:30:180:15 W:87:3:0:42000 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 F:UNIQUE | MALE | SMART | ESCORT F:DROP_4 | DROP_GOOD | ONLY_ITEM F:MOVE_BODY | TAKE_ITEM F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS F:FORCE_SLEEP S:1_IN_3 S:HEAL | TELE_TO S:BR_COLD | BR_FIRE | BR_SHAR | BR_SOUN S:S_KIN | S_MONSTERS D:The lord of the Titans, he has broken loose from his confinement in the nether D: hells to seek revenge on the world. ### Dungeon level 88 ### N:540:Lungorthin, the Balrog of White Fire T:major demon C:v I:130:7000:20:187:80 W:88:2:0:37000 B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER F:UNIQUE | MALE | POWERFUL | ESCORT | HAS_LIGHT F:ESCORTS F:DROP_4 | DROP_GOOD F:MOVE_BODY F:IM_FIRE | RES_PLAS S:1_IN_4 S:BLIND | CONF | SCARE S:BR_FIRE | BR_PLAS S:S_HI_DEMON | S_UNDEAD D:A massive form cloaked in flame. Lungorthin stares balefully at you with eyes D: that smoulder red. The dungeon floor where he stands is scorched by the heat D: of his body. ########## DUNGEON LEVELS 90-100 ########## ### Dungeon level 90 ### N:543:Huan, Wolfhound of the Valar T:canine C:W I:130:8000:50:192:10 W:90:1:0:40000 B:CLAW:COLD:9d12 B:CLAW:COLD:9d12 B:BITE:COLD:9d12 B:BITE:COLD:9d12 F:UNIQUE | MALE | SMART | ATTR_FLICKER F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | KILL_BODY F:IM_ACID | IM_COLD | IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_5 S:BR_COLD | BR_LIGHT | BR_SHAR | BR_SOUN D:The wolfhound of the Valar, Huan has served many masters in his time, from D: Celegorm son of F["e]anor to Beren son of Barahir: but now he runs wild and D: acknowledges no master save himself, as he hunts alone for his nemesis - D: Carcharoth, the terrible wolf of Angband. N:544:Carcharoth, the Jaws of Thirst T:canine C:p I:130:8000:50:192:10 W:90:1:0:40000 B:CLAW:FIRE:9d12 B:CLAW:FIRE:9d12 B:BITE:FIRE:9d12 B:BITE:FIRE:9d12 F:UNIQUE | MALE | EVIL | SMART | HAS_LIGHT | ATTR_FLICKER F:DROP_4 | DROP_GOOD | ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | MOVE_BODY F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:1_IN_3 S:BR_DARK | BR_FIRE | BR_NETH | BR_POIS S:S_HOUND D:The first guard of Angband, Carcharoth, also known as 'The Red Maw', is the D: greatest wolf to ever walk the earth. He is highly intelligent and a deadly D: opponent in combat. ### Dungeon level 92 ### N:542:Vecna, the Emperor Lich T:lich C:p I:130:6000:100:120:0 W:92:3:0:45000 B:HIT:EXP_80:7d12 B:HIT:LOSE_DEX:7d12 B:HIT:UN_POWER:7d12 B:HIT:UN_POWER:7d12 F:UNIQUE | MALE F:ESCORT F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:IM_ELEC | IM_FIRE S:1_IN_2 S:BLIND | CAUSE_4 | SCARE | TPORT S:BA_FIRE | BA_MANA | BA_NETH S:BO_MANA S:S_HI_DEMON | S_HI_UNDEAD | S_KIN | S_MONSTERS D:The greatest of all undead sorcerers, even the gods once feared him. This D: ancient shadow of death wilts every living thing it passes. ### Dungeon level 95 ### N:545:Gothmog, the High Captain of Balrogs T:major demon C:v I:130:8000:100:168:0 W:95:1:0:43000 B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER F:UNIQUE | MALE | POWERFUL | ESCORT | HAS_LIGHT F:ESCORTS F:DROP_4 | DROP_GOOD | DROP_GREAT F:MOVE_BODY F:IM_ELEC | IM_FIRE | RES_PLAS S:1_IN_3 S:BLIND | CONF | SCARE S:BR_FIRE | BR_PLAS S:S_HI_DEMON | S_HI_UNDEAD D:Gothmog is the Chief Balrog in Morgoth's personal guard. He is renowned for D: slaying F["e]anor and Fingon, two of the High Kings of the Noldor Elves, and D: has never been defeated in combat. With his whip of flame and awesome fiery D: breath he saved his master from Ungoliant's rage. ### Dungeon level 99 ### N:546:Sauron, the Sorcerer T:person C:p I:130:10500:100:192:0 W:99:1:0:50000 B:HIT:UN_BONUS:10d12 B:HIT:UN_BONUS:10d12 B:HIT:UN_POWER:8d12 B:HIT:UN_POWER:8d12 F:UNIQUE | QUESTOR | MALE | EVIL | SMART | REGENERATE F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:OPEN_DOOR | MOVE_BODY F:IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_FEAR | NO_CONF F:NO_SLEEP F:FORCE_DEPTH | FORCE_SLEEP S:1_IN_2 S:BLIND | BRAIN_SMASH | CAUSE_4 | SCARE | TELE_LEVEL | TPORT S:BA_DARK | BA_FIRE | BA_MANA | BA_NETH | BA_WATE S:BO_ICEE | BO_MANA | BO_PLAS S:S_HI_DEMON | S_HI_DRAGON | S_HI_UNDEAD | S_MONSTERS | S_UNIQUE | S_WRAITH D:He is Morgoth's most powerful servant. Mighty in spells and enchantments, he D: created the One Ring. His eyes glow with power and his gaze seeks to destroy D: your soul. He has many servants, and rarely fights without them. ### Dungeon level 100 ### N:547:Morgoth, Lord of Darkness T:Morgoth C:D I:140:20000:100:180:0 W:100:1:0:60000 B:HIT:SHATTER:20d10 B:HIT:SHATTER:20d10 B:HIT:LOSE_ALL:10d12 B:TOUCH:UN_POWER F:UNIQUE | QUESTOR | MALE | EVIL | SMART | REGENERATE F:DROP_4 | DROP_GOOD | DROP_GREAT | ONLY_ITEM F:KILL_WALL | MOVE_BODY | ATTR_FLICKER F:IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | IM_POIS | NO_FEAR F:NO_CONF | NO_SLEEP F:FORCE_DEPTH | FORCE_SLEEP S:1_IN_3 S:BRAIN_SMASH S:BA_MANA | BA_NETH S:BO_MANA S:S_HI_DEMON | S_HI_DRAGON | S_HI_UNDEAD | S_MONSTERS | S_UNIQUE | S_WRAITH D:He is the Master of the Pits of Angband. His figure is like a black mountain D: crowned with lightning. He rages with everlasting anger, his body scarred by D: Fingolfin's eight mighty wounds. He can never rest from his pain, but seeks D: forever to dominate all that is light and good in the world. He is the D: origin of man's fear of darkness and created many foul creatures with his D: evil powers. Orcs, Dragons, and Trolls are his most foul corruptions, D: causing much pain and suffering in the world to please him. His disgusting D: visage, twisted with evil, is crowned with iron, the two remaining Silmarils D: forever burning him. Grond, the mighty Hammer of the Underworld, cries D: defiance as he strides towards you to crush you to a pulp! drop-artifact:'Grond' drop-artifact:of Morgoth # Max is currently N:616 angband-v3.3.2/lib/edit/Makefile0000644000175000017500000000046711651552410015751 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk CONFIG = artifact.txt ego_item.txt flavor.txt limits.txt monster.txt \ monster_base.txt names.txt object.txt object_base.txt p_class.txt p_hist.txt \ p_race.txt shop_own.txt spell.txt store.txt terrain.txt vault.txt hints.txt \ pain.txt pit.txt PACKAGE = edit angband-v3.3.2/lib/edit/artifact.txt0000644000175000017500000016055111651552410016650 0ustar chriscchrisc# File: artifact.txt # This file is used to initialize the "artifact" information for Angband. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # The artifact indexes are defined in "defines.h", and must not be changed. # Hack -- "Grond" and "Morgoth" MUST have a rarity of one, or they might # not be dropped when Morgoth is killed. Note that they, like the "special" # artifacts, are never created "accidentally". # === Understanding artifact.txt === # N: serial number : item name # I: tval : sval # W: depth : rarity : weight : cost # A: allocation probability : min depth : max depth # P: base armor class : base damage : plus to-hit : plus to-dam : plus to-ac # F: flag | flag | etc # E: activation effect : recharge time # M: message when activated # L: pval : flag | flag | etc. # D: description # 'N' indicates the beginning of an entry. The serial number must # increase for each new item. # 'I' is for basic information. The tval is for the type of item, the # sval identifies the subtype. # 'W' is for extra information. Depth and rarity are not currently used, # weight is in tenth-pounds and cost is the item's value. # 'A' is for allocation details. alloc_prob is the % chance of the artifact # being generated, min depth is the earliest it is normally found, max # depth is the deepest it is ever found. # 'P' is for power information. The items base armor class, its base # damage and pluses to-hit, to-dam and to-ac. # 'F' is for flags not associated with any pval. These are fairly # self-explanatory. As many F: lines may be used as are needed to # specify all the flags and flags are separated by the '|' symbol. # 'E' is for effect. The activation is the effect the artifact # activates for. The recharge time calculates from the recharge time # plus a random value between 1 and the recharge time dice (if not 0). # 'M' is for the activation message text. # 'L' is for pval and flags specific to that pval. Each pval and its flags # need a line to themselves. MAX_PVALS is defined in src/defines.h - you # will need to recompile if you wish to change this value. A pval can # take a random value. # 'D' is for the artifact description. These appear when the item is # identified. Special thanks to J.R.R Tolkien, without whom the words would # be unwritten, the images unconceived, the deed undone. -LM- # Contributors: Jeff Butler, Neal Hackler, Ethan Sicotte, Pat Tracy, # Yuanli Zhou ### IMPORTANT NOTES ### # (1.) Any changes or additions to the file will have influence on randarts # and may break savefile compatibility for old savegames with randarts. If # using random artifacts, finish your existing game before making any # changes to the artifact.txt file at all. # (2.) Removing any artifact, or changing its "base" type (as defined by # the tval and sval entries in the "I:" line), will break savefile # compatibility for ALL savefiles. # (3.) Adding a new artifact, or changing the powers of existing ones, will # NOT affect savefile compatibility for games with the standard artifact set: # it is perfectly safe to do this. (If your new artifact is a new kind of # object, or a new one at the end of the file, you must also amend object.txt # or limits.txt.) # Version stamp (required) V:3.3.1 # Here is the list of "Special" artifacts - Amulets, Light Sources, Rings. # Only the FIRST 15 artifacts may be of these types currently: artifacts # from index number 16 onwards must be Armor or Weapons. # The Phial of Galadriel N:1:of Galadriel I:light:4:0 W:5:3:10:10000 A:40:5 to 100 P:0:1d1:0:0:0 F:NO_FUEL | F:INSTA_ART E:ILLUMINATION:10+d10 M:The {kind} well{s} with clear light... D:A small crystal phial containing the light of E["a]rendil's Star. D:Its light is imperishable, and near it darkness cannot endure. # The Star of Elendil N:2:of Elendil I:light:5:0 W:30:25:5:30000 A:4:30 to 100 P:0:1d1:0:0:0 F:SEE_INVIS | NO_FUEL | F:INSTA_ART E:MAPPING:50+d50 M:The {kind} shine{s} brightly... D:The shining Star of the North, a treasured heirloom of Elendil's house. # The Arkenstone of Thrain N:3:of Thr['a]in I:light:6:0 W:50:50:5:50000 A:2:50 to 127 P:0:1d1:0:0:0 F:SEE_INVIS | HOLD_LIFE | RES_LIGHT | RES_DARK | NO_FUEL | F:INSTA_ART #E:DETECT_ALL:30+d30 E:CLAIRVOYANCE:50+d50 M:The {kind} form{s} an image in your mind... D:A great globe seemingly filled with moonlight, the famed Heart of the D:Mountain. It splinters the light that falls upon it into ten thousand D:sparks of white radiance shot with glints of the rainbow. # The Amulet of Carlammas N:4:of Carlammas I:amulet:50 W:50:10:3:60000 A:10:50 to 100 F:HIDE_TYPE | F:RES_FIRE | F:INSTA_ART E:PROTEVIL:225+d225 M:The {kind} let{s} out a shrill wail... L:3:CON L:1:STR D:A fiery circle of bronze, with mighty spells to ward off and banish evil. # The Amulet of Ingwe N:5:of Ingw["e] I:amulet:51 W:65:30:3:90000 A:3:65 to 127 F:HIDE_TYPE | F:SEE_INVIS | FREE_ACT | F:RES_ACID | RES_COLD | RES_ELEC | RES_CONFU | F:INSTA_ART E:DISPEL_EVIL:50+d50 M:The {kind} flood{s} the area with goodness... L:3:INT | WIS L:4:CHR | INFRA D:The ancient heirloom of Ingw["e], high lord of the Vanyar, against whom D:nothing of evil could stand. # The Necklace of the Dwarves N:6:of the Dwarves I:amulet:52 W:50:50:3:75000 A:2:50 to 127 F:HIDE_TYPE | F:SEE_INVIS | FREE_ACT | REGEN | LIGHT | RES_FEAR | F:INSTA_ART L:3:STR | CON L:5:INFRA D:The Nauglam['i]r, a carcanet of gold set with a multitude of shining D:gems of Valinor. The radiant Silmaril of F["e]anor hangs in its midst D:as its crowning glory. The sturdy spirits of Dwarvish craftsmen who D:labored long in mountain smithies lie within it still, and as gossamer D:it rests upon the bearer. # New Artifact (7): The Palantir of Westernesse N:7:of Westernesse I:light:7 W:75:60:200:100000 #A:2:75 to 127 P:0:10d10:0:0:0 # F:DRAIN_MANA | F:NO_FUEL | F:SEE_INVIS | TELEPATHY | F:RES_CHAOS | RES_BLIND | AGGRAVATE | DRAIN_EXP | F:INSTA_ART | HIDE_TYPE E:CLAIRVOYANCE:50+d50 M:The {kind} glow{s} a deep green... L:2:INT | WIS L:3:SEARCH | INFRA D:A great globe with a heart of fire, the Palant['i]r provides the wearer with D:sight of far places - at a cost, for those espied upon are aware of it. # The Ring of Barahir N:8:of Barahir I:ring:50 W:50:25:2:65000 A:4:50 to 100 F:HIDE_TYPE | F:RES_POIS | RES_DARK F:INSTA_ART L:1:STR | INT | WIS | DEX | CON | CHR | STEALTH D:Twinned serpents with eyes of emerald meet beneath a crown of flowers to D:form this ring, an ancient treasure of Isildur's house. # The Ring of Tulkas N:9:of Tulkas I:ring:51 W:70:50:2:150000 A:2:70 to 127 F:HIDE_TYPE | RES_FEAR | F:INSTA_ART E:HASTE2:150+d150 M:The {kind} glow{s} brightly... L:4:STR | DEX | CON D:The treasure of Tulkas, most fleet and wrathful of the Valar. # The Ring of Power 'Narya' N:10:of Power 'Narya' I:ring:52 W:70:50:2:100000 A:2:70 to 127 P:0:0d0:2:2:0 F:HIDE_TYPE | F:FREE_ACT | SEE_INVIS | F:SLOW_DIGEST | REGEN | TELEPATHY | F:SUST_STR | SUST_CON | F:IM_FIRE | RES_FIRE | RES_FEAR F:INSTA_ART E:PROTEVIL:200+4d50 M:{name} glows deep red... L:1:STR | INT | WIS | DEX | CON | CHR L:5:SPEED D:The Ring of Fire, made of gold and set with a ruby that glows like flame. D:Narya is one of the three Rings of Power created by Celebrimbor and hidden D:by the Elves from Sauron. # The Ring of Power 'Nenya' N:11:of Power 'Nenya' I:ring:53 W:80:50:2:200000 A:2:80 to 127 P:0:0d0:3:3:0 F:HIDE_TYPE | F:HOLD_LIFE | FREE_ACT | SEE_INVIS | F:FEATHER | REGEN F:SUST_INT | SUST_WIS | SUST_CON | F:IM_COLD | RES_COLD | RES_BLIND | TELEPATHY | F:INSTA_ART E:RESTORE_LIFE:200+2d50 M:{name} glows bright white... L:2:STR | INT | WIS | DEX | CON | CHR L:5:SPEED D:The Ring of Adamant, made of mithril with a pure white stone as D:centerpiece. Nenya is one of the three Rings of Power created by D:Celebrimbor and hidden by the Elves from Sauron. # The Ring of Power 'Vilya' N:12:of Power 'Vilya' I:ring:54 W:90:80:2:300000 A:1:90 to 127 P:0:0d0:5:5:0 F:HIDE_TYPE | F:HOLD_LIFE | FREE_ACT | SEE_INVIS | F:FEATHER | SLOW_DIGEST | REGEN | TELEPATHY | F:SUST_DEX | SUST_INT | SUST_CON | F:IM_ELEC | RES_ELEC | RES_POIS | RES_DARK | F:INSTA_ART E:HEAL2:200+2d50 M:{name} glows deep blue... L:3:STR | INT | WIS | DEX | CON | CHR L:5:SPEED D:The Ring of Sapphire, made of gold with a brilliant blue gem that shines D:like stars. It glitters untouchable despite all that Morgoth ever wrought. D: Vilya is one of the three Rings of Power created by Celebrimbor and D:hidden by the Elves from Sauron. # The Ring of Power 'The One Ring' N:13:of Power 'The One Ring' I:ring:55 W:100:100:2:5000000 A:1:100 to 127 P:0:0d0:15:15:0 # F: DRAIN_MANA | DRAIN_HP | F:HIDE_TYPE | F:LIGHT_CURSE | HEAVY_CURSE | PERMA_CURSE | F:AGGRAVATE | DRAIN_EXP | SEE_INVIS | REGEN | TELEPATHY | F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | F:RES_FIRE | RES_COLD | RES_ELEC | RES_ACID | RES_DARK | F:RES_DISEN | RES_POIS | RES_NETHR F:SUST_STR | SUST_DEX | SUST_CON | F:SUST_INT | SUST_WIS | SUST_CHR | F:INSTA_ART E:BIZARRE:200+9d50 M:{name} glows intensely black... L:5:STR | INT | WIS | DEX | CON | CHR | SPEED D:"One Ring to rule them all, One Ring to find them, One Ring to bring D:them all and in the darkness bind them." Made of massive gold, and D:inscribed with hidden runes in the foul speech of Mordor, Isildur's Bane D:possesses powers so great that it inevitably twists and masters any mortal D:being who wears it. # New Artifact (14): The Elfstone 'Elessar' N:14:'Elessar' I:amulet:53 W:60:60:3:40000 A:2:60 to 127 P:0:0d0:0:0:10 F:RES_FEAR | RES_FIRE | RES_POIS | HIDE_TYPE | F:INSTA_ART E:HEAL1:200 M:You feel a warm tingling inside... L:2:STR | WIS | CHR | SPEED D:A green stone, imbued with the power of Elvendom and the light of the Sun. D: Those who gaze through it see the aged and infirm as young again, and its D:wearer brings healing after victory in battle. # New Artifact (15): The Jewel 'Evenstar' N:15:'Evenstar' I:amulet:54 W:40:40:3:25000 A:2:30 to 70 F:HOLD_LIFE | SUST_CON | SUST_WIS | REGEN F:RES_DARK | RES_COLD | RES_NETHR F:INSTA_ART E:RESTORE_LIFE:150 M:Your {kind} glow{s} a deep red... L:2:WIS D:A plain white jewel, given by Queen Arwen to Frodo Baggins before his D:return to the Shire. ### Here follow the Armor artifacts ### ### Dragon Scale Mails ### N:16:'Razorback' I:dragon armour:Multi-Hued Dragon Scale Mail~ W:90:9:200:400000 A:11:90 to 127 P:50:2d4:-4:0:25 F:FREE_ACT | IM_ELEC | RES_DISEN | F:RES_ACID | RES_FIRE | RES_COLD | F:RES_POIS | RES_LIGHT | RES_DARK | F:LIGHT | SEE_INVIS | AGGRAVATE | E:STAR_BALL:50 M:Lightning surrounds your {kind}! D:A massive suit of heavy dragon scales deeply saturated with many colors. D:It throbs with angry energies, and you feel the raw elemental might of D:untamed Lightning as you put it on. N:17:'Bladeturner' I:dragon armour:Power Dragon Scale Mail~ W:100:16:250:500000 A:6:100 to 127 P:80:2d4:-8:0:35 F:HOLD_LIFE | REGEN | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | RES_FEAR | F:RES_LIGHT | RES_DARK | RES_BLIND | RES_CONFU | RES_SOUND | F:RES_SHARD | RES_NETHR | RES_NEXUS | RES_CHAOS | RES_DISEN | E:RAGE_BLESS_RESIST:50 M:{name} glow{s} many colors... D:An adamant suit with scales of every color. Untrammelled powers elemental D:and ethereal swirl around it in an inextricably intermingled nimbus. N:18:'Mediator' I:dragon armour:Balance Dragon Scale Mail~ W:95:12:250:400000 A:8:95 to 127 P:60:2d4:-4:0:25 F:RES_CHAOS | RES_DISEN | RES_SHARD | RES_SOUND | F:RES_NEXUS | F:FREE_ACT | SLOW_DIGEST | REGEN | E:STAR_BALL:50 M:Lightning surrounds your {kind}! D:A great suit of dragon hide, set with scales of many hues. Even the D:mightiest wyrms of Law and Chaos fear the judgement of its wearer. ### Heavy Armor ### N:19:'Soulkeeper' I:hard armour:Adamantite Plate Mail~ W:75:9:420:300000 A:11:75 to 127 P:90:2d4:-4:0:20 F:HOLD_LIFE | SUST_CON | F:RES_ACID | RES_COLD | RES_DARK | RES_NETHR | RES_NEXUS | F:RES_CHAOS | RES_FEAR | E:HEAL2:444 M:{name} glows a bright white... L:2:CON D:A suit of imperishable adamant with unconquerable strength to endure evil D:and disruptive magics. It protects the life force of its wearer as D:nothing else can. N:20:of Isildur I:hard armour:Full Plate Armour~ W:30:3:300:50000 A:30:55 to 127 P:75:2d4:0:0:25 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:RES_SOUND | RES_CONFU | RES_NEXUS L:1:CON D:A gleaming steel suit covering the wearer from neck to foot, with runes of D:warding and stability deeply engraved into its surface. N:21:of the Rohirrim I:hard armour:Metal Brigandine Armour~ W:30:3:200:30000 A:30:45 to 100 P:50:1d4:0:0:15 F:HIDE_TYPE | RES_FEAR | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_CONFU | RES_SOUND L:2:STR | DEX D:Small steel plates cover an inner layer of sturdy canvas, and both metal D:and cloth bear scenes of hunting and war. As you don the armour of Eorl D:the Young, matchless in combat, you feel his spirit surround you. N:22:'Belegennon' I:hard armour:Mithril Chain Mail~ W:40:3:150:105000 A:30:55 to 127 P:35:1d4:-1:0:20 F:HIDE_TYPE | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS E:TELE_PHASE:2 M:{name} twists space around you... L:4:DEX L:2:STEALTH D:This wondrous suit of fine-linked chain shimmers as though of pure silver. D:It stands untouched amidst the fury of the elements, and a power of D:concealment rests within. N:23:of Celeborn I:hard armour:Mithril Plate Mail~ W:40:3:250:150000 A:30:65 to 127 P:65:2d4:-3:0:25 F:HIDE_TYPE | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK | F:RES_DISEN E:BANISHMENT:500 M:Your {kind} glow{s} deep blue... L:3:STR L:4:CHR D:A shimmering suit of true-silver, forged long ago by dwarven smiths of D:legend. It gleams with purest white as you gaze upon it, and mighty are D:its powers to protect and banish. N:24:of Arvedui I:hard armour:Chain Mail~ W:20:3:220:32000 A:30:20 to 75 P:40:1d4:-2:0:15 F:HIDE_TYPE | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_SHARD | RES_NEXUS L:2:STR | CHR D:A hauberk, leggings, and sleeves of interlocking steel rings, well padded D:with leather. You feel as strong and tall as Arvedui, last king of Arnor, D:as you put it on. N:25:of Caspanion I:hard armour:Augmented Chain Mail~ W:25:9:270:40000 A:11:35 to 100 P:45:1d4:-2:0:20 F:HIDE_TYPE | F:RES_ACID | RES_POIS | RES_CONFU E:DESTROY_TDOORS:10 M:Your {kind} glow{s} bright red... L:2:INT | WIS L:3:CON D:A hauberk, leggings, and sleeves of interlocking steel rings, strategically D:reinforced at vital locations with a second layer of chain. Magics to D:enhance body and mind lie within, and no door can bar the wearer's path. ### Light Armor ### N:26:of Himring I:soft armour:Hard Leather Armour~ W:50:20:100:35000 A:20:25 to 90 P:20:0d0:0:0:15 F:RES_CHAOS | RES_NETHR | RES_POIS E:PROTEVIL:100+d100 M:The {kind} let{s} out a shrill wail... D:In this studded cuirass of pliable leather lives the memory of D:unvanquished Himring, defiant fortress surrounded by the legions of Morgoth. N:27:'Hithlomir' I:soft armour:Soft Leather Armour~ W:20:3:80:45000 A:20:20 to 80 P:10:0d0:0:0:20 F:HIDE_TYPE | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK | RES_NETHR L:3:STEALTH D:Familiar with the secret ways hidden in darkness, this leather cuirass is D:truly more than it appears. N:28:'Thalkettoth' I:soft armour:Leather Scale Mail~ W:20:3:60:25000 A:20:30 to 100 P:20:1d1:-1:0:25 F:HIDE_TYPE | F:RES_ACID | RES_SHARD | FREE_ACT L:3:DEX | SPEED D:An amazingly light tunic and skirt sewn with thick, overlapping scales of D:hardened leather. Those who wear it move with agility and assurance. ### Shields ### # should be Shield of Deflection N:29:of Gil-galad I:shield:Mithril Shield~ W:70:4:80:65000 A:25:70 to 127 P:20:1d3:0:0:20 F:LIGHT | F:RES_ELEC | RES_ACID | RES_DISEN | RES_DARK | HIDE_TYPE | F:SUST_WIS | SUST_DEX | SUST_CHR E:STARLIGHT2:100 M:Your {kind} glow{s} with the light of a thousand stars... L:5:WIS | CHR D:The legendary shield of Ereinion Gil-galad, who fought his way to the D:gates of the Dark Tower, and with whom came light even to Gorgoroth. N:30:of Thorin I:shield:Small Metal Shield~ W:40:6:65:60000 A:14:40 to 127 P:5:1d2:0:0:25 F:HIDE_TYPE | RES_FEAR | RES_SOUND F:FREE_ACT | IM_ACID | RES_CHAOS L:4:CON L:3:STR L:-1:STEALTH D:Invoking the strength and endurance of Thorin, King under the Mountain, D:this little metal shield is proof against the Element of Earth. N:31:of Celegorm I:shield:Leather Shield~ W:30:3:60:12000 A:28:30 to 100 P:8:1d2:0:0:20 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_LIGHT | RES_DARK F:RES_BLIND D:This shield emblazoned with a multitude of creatures unseen for ages D:once protected Celegorm, Lord of Himlad; around it, a mystic balance lies, D:containing the conflicts of the elements. N:32:of An['a]rion I:shield:Large Metal Shield~ W:40:9:120:160000 A:11:40 to 100 P:12:1d3:0:0:20 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | SUST_STR | SUST_INT | F:SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR D:The great metal-bound shield of Elendil's younger son An['a]rion, whom D:even Sauron could not corrupt. ### Helmets and Crowns ### N:33:of Celebrimbor I:helm:Metal Cap~ W:55:12:20:45000 A:8:55 to 100 P:3:1d1:0:0:18 F:RES_FIRE | RES_ACID | RES_DISEN | RES_SHARD L:3:CHR | SEARCH L:2:INT | DEX D:A metal cap forged by the greatest Noldorin smith of the Second Age, D:this helm serves equally well in battle or at the forge, and its D:enchantment will never be diminished. N:34:of Morgoth I:crown:Massive Iron Crown~ W:100:1:400:10000000 A:0:100 to 100 P:0:1d1:0:0:0 F:HIDE_TYPE | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | F:RES_LIGHT | RES_DARK | RES_CONFU | RES_NEXUS | RES_NETHR | F:LIGHT | SEE_INVIS | TELEPATHY | RES_FEAR | F:LIGHT_CURSE | HEAVY_CURSE | PERMA_CURSE | F:INSTA_ART L:125:STR | INT | WIS | DEX | CON | CHR | INFRA D:Containing much of the power of he who once was mightiest among the Ainur, D:this plain iron crown has mounted upon it the two remaining Silmarils, D:greatest treasures of Middle-Earth. N:35:of Ber['u]thiel I:crown:Iron Crown~ W:40:12:20:1 A:8:45 to 100 P:0:1d1:0:0:20 F:HIDE_TYPE | F:FREE_ACT | SEE_INVIS | TELEPATHY | LIGHT_CURSE | HEAVY_CURSE L:-5:CON L:-3:STR | DEX D:The midnight-hued steel circlet of the sorceress-queen Ber['u]thiel. It D:grants extraordinary powers of sight and awareness at a terrible physical D:cost. N:36:of Thranduil I:helm:Hard Leather Cap~ W:50:2:15:50000 A:14:40 to 100 P:2:0d0:0:0:10 F:HIDE_TYPE | F:RES_BLIND | TELEPATHY L:2:INT | WIS D:The hunting cap of King Thranduil, to whose ears come all the secrets of D:his forest domain. N:37:of Thengel I:helm:Metal Cap~ W:10:2:20:22000 A:18:10 to 100 P:3:1d1:0:0:12 F:RES_CONFU | HIDE_TYPE L:3:WIS | CHR D:A ridged helmet made of steel and embossed with scenes of valor in fine- D:engraved silver. It grants the wearer nobility and understanding. N:38:of Hammerhand I:helm:Steel Helm~ W:20:8:60:45000 A:11:40 to 127 P:9:1d3:0:0:20 F:HIDE_TYPE | F:FREE_ACT | F:RES_ACID | RES_NEXUS | RES_COLD | RES_DARK L:3:STR | DEX | CON D:A great helm, as steady and as distinctive as the hero of the Westdike. D:Many long months was Helm Hammerhand besieged in the Hornburg, yet he D:strode out time and again among his foes and slew many. Although they D:knew of his coming, none could stand against him. N:39:of Dor-L['o]min I:helm:Iron Helm~ W:40:20:50:300000 A:5:40 to 127 P:7:1d3:0:0:20 F:HIDE_TYPE | RES_FEAR | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:LIGHT | SEE_INVIS | TELEPATHY L:4:STR | CON L:2:DEX L:-1:STEALTH D:The legendary Dragon-helm, forged by one of the legendary Dwarven smiths D:of the First Age. The visage of mighty Glaurung forms its crest, and the D:mere sight of the helm, borne by T['u]rin Turambar, struck dread into the D:hearts of the servants of Morgoth. N:40:'Holhenneth' I:helm:Iron Helm~ W:20:5:50:100000 A:18:20 to 100 P:7:1d3:0:0:10 F:HIDE_TYPE | F:RES_BLIND | RES_CONFU | SEE_INVIS E:DETECT_ALL:55+d55 M:{name} forms an image in your mind... L:2:INT | WIS | SEARCH D:A famous forged iron helm granting extraordinary powers of mind and D:awareness. N:41:of Gorlim I:helm:Iron Helm~ W:20:5:75:1 A:18:20 to 75 P:7:1d3:8:8:10 # F: DRAIN_HP | F:HIDE_TYPE | RES_FEAR | F:SEE_INVIS | FREE_ACT | AGGRAVATE | LIGHT_CURSE | HEAVY_CURSE L:-5:SEARCH L:-3:INT | WIS L:5:CHR D:A headpiece, gaudy and barbaric, that betrayed a warrior when he most D:needed succor. N:42:of Gondor I:crown:Golden Crown~ W:40:40:30:100000 A:5:45 to 127 P:0:1d1:0:0:15 F:HIDE_TYPE | F:RES_COLD | RES_FIRE | RES_LIGHT | RES_BLIND | F:RES_CONFU | RES_STUN | F:LIGHT | SEE_INVIS | REGEN E:HEAL1:250 M:You feel a warm tingling inside... L:3:STR | CON L:2:WIS D:From dying N['u]menor, Elendil brought this shining winged circlet, emblem D:of Gondor through an age of the world. N:43:of N['u]menor I:crown:Jewel Encrusted Crown~ W:60:30:40:50000 A:5:60 to 127 P:0:1d1:0:0:18 # F: DRAIN_MANA F:HIDE_TYPE | F:SEE_INVIS | FREE_ACT | F:RES_SHARD | RES_STUN | RES_COLD | F:RES_LIGHT | RES_DARK | RES_BLIND | LIGHT # A:ANALYZE:50 L:3:INT | CHR | SEARCH L:2:DEX D:A massive golden crown, set with wondrous jewels of thought and warding, D:once worn by the kings of ancient N['u]menor. ### Cloaks and Shadow Cloaks ### N:44:'Colluin' I:cloak:Cloak~ W:5:45:10:50000 A:2:5 to 100 P:1:0d0:0:0:15 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS E:RESIST_ALL:111 M:{name} glows many colours... D:A cape worn by a hero from Valinor, a land utterly beyond the strife D:of Elements. N:45:'Holcolleth' I:cloak:Cloak~ W:5:35:10:18000 A:5:5 to 100 P:1:0d0:0:0:4 F:HIDE_TYPE | F:RES_ACID E:SLEEPII:55 M:{name} glows deep blue... L:3:STEALTH L:2:INT | WIS D:This elven-grey mantle possesses great powers of tranquility and D:concealment, and grants the wearer the knowledge and understanding of D:the Sindar. N:46:of Thingol I:cloak:Cloak~ W:5:20:10:35000 A:5:5 to 100 P:1:0d0:0:0:18 F:HIDE_TYPE | F:FREE_ACT | RES_ACID | RES_FIRE | RES_COLD E:RECHARGE:70 M:Your {kind} glow{s} bright yellow... L:3:DEX | CHR D:A translucent cloak of pearly grey with glowing, energized Elven runes D:showing calm and clear as moonlight on still water. N:47:of Thorongil I:cloak:Cloak~ W:5:10:10:8000 A:10:5 to 75 P:1:0d0:0:0:10 F:FREE_ACT | RES_ACID | RES_FEAR | SEE_INVIS D:This shimmering cloak of greens and browns was once worn by the young D:Aragorn, a keen-eyed captain of Rohan and Gondor, valiant on both land D:and sea. N:48:'Colannon' I:cloak:Cloak~ W:5:20:10:20000 A:5:5 to 100 P:1:0d0:0:0:15 F:HIDE_TYPE | F:RES_NEXUS E:TELE_LONG:45 M:Your {kind} twist{s} space around you. L:2:STEALTH | SPEED D:A crystal-blue cape of fine silk worn by a silent messenger of the forces D:of Law. Seldom will its wearer be diverted from his mission. N:49:of L['u]thien I:cloak:Elven Cloak~ W:40:40:5:45000 A:2:40 to 127 P:6:0d0:0:0:20 F:HIDE_TYPE | F:RES_ACID | RES_FIRE | RES_COLD E:RESTORE_LIFE:250 M:Your {kind} glow{s} a deep red... L:4:INT | WIS | CHR L:3:STEALTH L:2:SPEED D:The opaque midnight folds of this cloak, inlaid with a multitude of tiny D:diamonds, swirl around you, and you feel a hint, a fragment of the D:restorative magics of L['u]thien, the most beautiful being who ever knew D:death. N:50:of Tuor I:cloak:Ethereal Cloak~ W:40:40:0:35000 A:2:70 to 127 P:6:0d0:0:0:12 F:HIDE_TYPE | F:FREE_ACT | IM_ACID | RES_ACID | SEE_INVIS L:4:STEALTH | DEX D:From the ruin of Gondolin, through secret ways and travail, did Tuor D:escape, mantled by sea-commanding Ulmo's kingly gift from a multitude D:of hostile eyes. ### Gloves and Gauntlets ### N:51:of E["o]l I:gloves:Set~ of Gauntlets W:55:35:25:40000 A:3:55 to 127 P:3:1d1:0:0:14 F:FREE_ACT | FEATHER | RES_ELEC | RES_DARK | RES_POIS | AGGRAVATE F:IM_FIRE E:MANA_BOLT:30+d30 M:Your {kind} glow{s} white... L:3:INT D:The iron-shod gauntlets of the Dark Elven smith E["o]l, who imbued them D:with magics he could channel in battle. N:52:'Cambeleg' I:gloves:Set~ of Leather Gloves W:10:6:5:36000 A:3:10 to 100 P:1:0d0:8:8:15 F:HIDE_TYPE | F:FREE_ACT | SHOW_MODS L:2:STR | CON D:A hero's handgear that lends great prowess in battle. N:53:'Cammithrim' I:gloves:Set~ of Leather Gloves W:10:3:5:30000 A:18:10 to 80 P:1:0d0:5:5:10 F:FREE_ACT | RES_LIGHT | SUST_CON | LIGHT E:MISSILE:2 M:{name} glows very brightly... D:These gloves glow so brightly as to light the way for the wearer and cast D:magical bolts with great frequency. N:54:'Paurhach' I:gloves:Set~ of Gauntlets W:1:2:25:15000 A:40:10 to 60 P:3:1d1:0:0:14 F:RES_FIRE | REGEN E:FIRE_BOLT:8+d8 M:Your {kind} {is} covered in fire... D:A set of gauntlets that smoulder with an unnatural heat. N:55:'Paurnimmen' I:gloves:Set~ of Gauntlets W:20:20:25:13000 A:5:50 to 127 P:3:1d1:0:0:14 F:RES_COLD | SLOW_DIGEST | BRAND_COOL E:COLD_BOLT:7+d7 M:Your {kind} {is} covered in frost... D:A set of handgear, freezing with unnatural cold. N:56:'Pauraegen' I:gloves:Set~ of Gauntlets W:1:4:25:11000 A:23:10 to 75 P:3:1d1:0:0:14 F:RES_ELEC | LIGHT | RES_LIGHT E:ELEC_BOLT:6+d6 M:Your {kind} {is} covered in sparks... D:A set of handgear with sparks that crackle across its knuckleguards. N:57:'Paurnen' I:gloves:Set~ of Gauntlets W:1:3:25:12000 A:30:10 to 60 P:3:1d1:3:3:14 F:RES_ACID | FEATHER E:ACID_BOLT:5+d5 M:Your {kind} {is} covered in acid... D:A set of gauntlets that give off a foul, acrid odour yet remain untarnished. N:58:'Camlost' I:gloves:Set~ of Gauntlets W:10:20:25:0 A:5:10 to 100 P:3:1d1:-12:-12:0 F:HIDE_TYPE | F:RES_FIRE | RES_DISEN | FREE_ACT | DRAIN_EXP | F:AGGRAVATE | LIGHT_CURSE | HEAVY_CURSE | SHOW_MODS L:-3:STR | DEX D:A pair of weakening gauntlets, named after Beren, who returned to Thingol D:having lost to Carcharoth the hand that clasped a Silmaril. N:59:of Fingolfin I:gloves:Set~ of Caestus W:40:15:40:110000 A:3:40 to 127 P:5:1d1:10:10:20 F:HIDE_TYPE | F:FREE_ACT | RES_ACID | SHOW_MODS E:ARROW:30+d30 M:Your {kind} grow{s} magical spikes... L:4:DEX D:The hand-sheathing of Fingolfin, the Elven warrior-king, who dealt D:Morgoth seven mighty wounds and pain that will last until the end of Arda. ### Boots ### N:60:of F["e]anor I:boots:Pair~ of Leather Boots W:40:120:20:300000 A:1:40 to 127 P:2:1d1:0:0:20 F:HIDE_TYPE | F:RES_NEXUS E:HASTE1:200 M:Your {kind} glow{s} bright green... L:15:SPEED D:This wondrous pair of leather boots once sped F["e]anor, creator of the D:Silmarils and the mightiest of the Eldar, to fulfill his hero's challenge D:and do battle for a Middle-Earth held in thrall. "Dear-bought those songs D:shall be accounted, and yet shall be well-bought. For the price could be D:no other." N:61:'Dal-i-thalion' I:boots:Pair~ of Leather Boots W:10:25:20:40000 A:4:50 to 100 P:2:1d1:0:0:15 F:HIDE_TYPE | F:FREE_ACT | F:RES_NETHR | RES_CONFU | SUST_CON E:REM_FEAR_POIS:5 M:Your {kind} glow{s} deep blue... L:5:DEX | SPEED D:A pair of high-laced shoes, bestowing of extraordinary agility and proof D:against the powers of corruption and withering. N:62:of Thr['o]r I:boots:Pair~ of Steel Shod Boots W:30:25:60:12000 A:5:30 to 100 P:7:1d1:0:0:20 F:HIDE_TYPE | RES_FEAR L:3:STR | CON | SPEED L:-1:STEALTH D:Sturdy footwear of leather and steel as enduring as the long-suffering D:Dwarven king-in-exile who wore them. N:63:of Wormtongue I:boots:Pair~ of Leather Boots W:10:15:20:17000 A:8:15 to 80 P:2:1d1:-1:-1:0 F:FEATHER | LIGHT_CURSE | HIDE_TYPE E:TELE_PHASE:20 M:Your {kind} twist{s} space around you. L:3:SPEED L:2:INT | DEX | STEALTH D:A pair of running shoes once used by the treacherous Gr['i]ma son of D:G['a]lm['o]d, the Wormtongue of Edoras. They are aptly suited for a D:messenger, a servant, a spy... or a coward. ### Weapons ### ### Swords and Daggers ### N:64:of Maedhros I:sword:Main Gauche~ W:15:30:30:20000 A:3:15 to 65 P:0:2d5:12:15:0 F:HIDE_TYPE | F:SLAY_TROLL | SLAY_GIANT | FREE_ACT | SEE_INVIS | SHOW_MODS L:3:INT | DEX D:A short thrusting blade with a large guard worn by the eldest son of D:F["e]anor, Maedhros the Tall, who lost his right hand while escaping D:from Angband. N:65:'Angrist' I:sword:Dagger~ W:20:80:12:100000 A:2:20 to 100 P:0:2d4:10:15:5 F:BRAND_ACID | RES_ACID | HIDE_TYPE | F:SLAY_EVIL | SLAY_TROLL | SLAY_ORC | FREE_ACT | RES_DARK | SUST_DEX | F:SHOW_MODS L:4:DEX D:Forged by Telchar, greatest of Dwarven smiths, and used by Beren to gouge a D:Silmaril out of Morgoth's crown, this long chopping dagger slices through D:ordinary metal as easily as its name, "Iron Cleaver", suggests. N:66:'Narthanc' I:sword:Dagger~ W:1:2:12:12000 A:40:1 to 50 P:0:2d4:9:12:10 F:BRAND_FIRE | RES_FIRE | SHOW_MODS E:FIRE_BOLT:8+d8 M:{name} is covered in fire... D:Instead of a blade, a flame seems to emerge from this dagger's hilt. N:67:'Nimthanc' I:sword:Dagger~ W:1:2:12:11000 A:40:1 to 50 P:0:2d4:9:12:10 F:BRAND_COLD | RES_COLD | SHOW_MODS E:COLD_BOLT:7+d8 M:{name} is covered in frost... D:From the hilt of this dagger springs not so much a blade as an icicle. N:68:'Dethanc' I:sword:Dagger~ W:1:2:12:13000 A:40:1 to 50 P:0:2d4:9:12:10 F:BRAND_ELEC | RES_ELEC | SHOW_MODS E:ELEC_BOLT:6+d6 M:{name} is covered in sparks... D:In this dagger is bound the very force of lightning. N:69:of Rilia I:sword:Dagger~ W:5:20:12:15000 A:5:5 to 75 P:0:2d4:14:13:0 F:SLAY_ORC | SLAY_TROLL | BRAND_POIS | RES_POIS | RES_DISEN | SHOW_MODS E:STINKING_CLOUD:4+d4 M:{name} throws deep green shadows... D:A large stiletto dagger that glistens with odorless poison, to which the D:wearer seems oddly immune. N:70:'Belangil' I:sword:Dagger~ W:10:40:12:40000 A:2:10 to 80 P:0:3d4:16:14:0 F:HIDE_TYPE | F:BRAND_COLD | RES_COLD | SEE_INVIS | SLOW_DIGEST | REGEN | F:SHOW_MODS E:COLD_BALL50:5+d5 M:Your {kind} {is} covered in frost... L:2:DEX D:A frosty dagger wreathed in a nimbus of ice with a hilt of elk horn and D:an edge to wound the wind. N:71:'Calris' I:sword:Bastard Sword~ W:30:15:140:100000 A:7:30 to 127 P:0:5d4:-20:20:0 # F:DRAIN_HP | F:HIDE_TYPE | F:KILL_DRAGON | SLAY_EVIL | SLAY_DEMON | SLAY_TROLL | RES_DISEN | F:AGGRAVATE | LIGHT_CURSE | HEAVY_CURSE | SHOW_MODS L:5:CON D:This sword has runes of power incused on its ornate hilt, and a single D:blood channel that gleams coldly blue as you grasp this mighty weapon of D:peril. N:72:'Aranr['u]th' I:sword:Broad Sword~ W:20:45:150:50000 A:2:20 to 100 P:0:3d5:20:12:0 F:HIDE_TYPE | F:SLAY_DEMON | SLAY_ORC | FREE_ACT | RES_COLD | FEATHER | F:SLOW_DIGEST | SHOW_MODS E:COLD_BOLT2:50 M:{name} glows a pale blue... L:4:DEX D:The beautiful sword of Thingol, justly named "King's Ire". It glistens D:icy enough to freeze the hearts of demons, and you feel supple and D:lightfooted as you clasp its hilt of gold and silver inlay. N:73:'Glamdring' I:sword:Broad Sword~ W:20:20:150:40000 A:5:20 to 80 P:0:2d5:10:15:0 F:HIDE_TYPE | BLESSED | LIGHT | F:SLAY_EVIL | BRAND_FIRE | SLAY_ORC | SLAY_DEMON | RES_FIRE | RES_LIGHT | F:SLOW_DIGEST | SHOW_MODS L:1:SEARCH D:This fiery, shining blade, mate to Orcrist, earned its sobriquet "Beater" D:from dying orcs who dared to behold hidden Gondolin. N:74:'Aeglin' I:sword:Broad Sword~ W:20:30:150:45000 A:3:20 to 100 P:0:2d5:12:16:0 F:HIDE_TYPE | BLESSED | LIGHT | F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | BRAND_ELEC | RES_ELEC | RES_BLIND | F:SLOW_DIGEST | SHOW_MODS L:1:SEARCH D:Like unto Orcrist and Glamdring, and like them long lost, this sword is D:continually covered in tiny arcs of captive lightning that flash and dance D:eerily in the globes of light they create. N:75:'Orcrist' I:sword:Broad Sword~ W:20:20:150:40000 A:5:20 to 80 P:0:2d5:10:15:0 F:HIDE_TYPE | BLESSED | LIGHT | F:SLAY_EVIL | BRAND_COLD | SLAY_ORC | SLAY_DRAGON | RES_COLD | RES_DARK | F:SLOW_DIGEST | SHOW_MODS L:3:SEARCH D:This coldly gleaming blade, mate to Glamdring, is called simply "Biter" D:by orcs who came to know its power all too well. N:76:'Gurthang' I:sword:Zweihander~ W:30:30:200:100000 A:3:30 to 100 P:0:3d6:13:17:0 F:HIDE_TYPE | RES_FIRE | RES_POIS | F:BRAND_FIRE | BRAND_POIS | F:KILL_DRAGON | FREE_ACT | SLOW_DIGEST | REGEN | SHOW_MODS L:2:STR D:A giant sword once wielded by mighty T['u]rin, and an even greater D:dragonbane; for what wyrm could stand against the blade that bathed in D:Glaurung's blood? N:77:'Zarcuthra' I:sword:Zweihander~ W:30:180:240:200000 A:1:30 to 127 P:0:4d6:19:21:0 # F:DRAIN_MANA | F:HIDE_TYPE | F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_FIRE | F:SLAY_UNDEAD | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | SLAY_ORC | F:RES_FIRE | RES_CHAOS | FREE_ACT | SEE_INVIS | AGGRAVATE | SHOW_MODS L:4:STR L:2:CHR | INFRA D:Runes dark and deadly stand stark against the naked steel of this awesome D:weapon, and you feel a wrathful power of slaying and rending as you D:slowly approach. N:78:'Mormegil' I:sword:Zweihander~ W:30:15:250:10000 A:7:30 to 100 P:0:3d6:-15:-15:-10 # F:DRAIN_HP | DRAIN_MANA | F:BRAND_POIS | KILL_DRAGON | SLAY_UNDEAD | F:HIDE_TYPE | SEE_INVIS | HOLD_LIFE | SHOW_MODS | F:AGGRAVATE | DRAIN_EXP | LIGHT_CURSE | HEAVY_CURSE L:-10:SPEED D:A foul, twisted sword with blackened spines and knobs, its very name is D:a curse upon the lips of Elves and Men. It is said that it will drink the D:very lifeblood of its wielder. N:79:'Gondricam' I:sword:Cutlass~ W:20:8:110:28000 A:12:20 to 65 P:0:1d8:10:11:50 F:HIDE_TYPE | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | FEATHER | F:SEE_INVIS | REGEN | FREE_ACT | SHOW_MODS L:4:DEX L:2:STEALTH D:Famed sea-defender of Lebennin. A short, slightly curved chopping blade D:with a perfect edge shining cleanly in the sun, an object of hate to the D:men of Umbar who met it in combat. N:80:'Crisdurian' I:sword:Executioner's Sword~ W:40:25:260:100000 A:4:40 to 127 P:0:4d5:18:19:0 F:SLAY_DRAGON | SLAY_EVIL | SLAY_UNDEAD | SLAY_TROLL | SLAY_GIANT | F:SLAY_ORC | SEE_INVIS | SHOW_MODS D:A giant's weapon, with a long blade tall and straight thrusting out from a D:massive double-pronged hilt. On its blade are written doomspells against D:both the living and undead. N:81:'Aglarang' I:sword:Katana~ W:30:25:50:40000 A:4:30 to 100 P:0:6d5:10:10:0 F:HIDE_TYPE | F:SUST_DEX | SHOW_MODS L:5:SPEED | DEX L:1:BLOWS D:An utterly perfect, cleanly chiseled sword, with an edge that effortlessly D:slices rock and bone, and spells to render the wearer lithe and nimble. It D:is combat incarnate. N:82:'Ringil' I:sword:Long Sword~ W:20:120:130:300000 A:1:20 to 127 P:0:4d5:22:25:0 F:RES_FEAR | BLESSED | F:SLAY_EVIL | BRAND_COLD | SLAY_UNDEAD | KILL_DEMON | SLAY_TROLL | F:FREE_ACT | RES_COLD | RES_LIGHT | LIGHT | SEE_INVIS | SLOW_DIGEST | REGEN | F:SHOW_MODS E:COLD_BALL100:40 M:{name} glows an intense blue... L:10:SPEED D:The weapon of Fingolfin, High King of the Noldor; it shines like a column D:of ice lit by light unquenchable. Morgoth came but unwillingly to meet it D:of old; his lame foot will remind him of its might should he face it again. N:83:'And['u]ril' I:sword:Long Sword~ W:20:40:130:80000 A:3:20 to 127 P:0:3d5:10:15:10 F:HIDE_TYPE | RES_FEAR | FREE_ACT | BLESSED | F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | SLAY_UNDEAD | F:RES_FIRE | RES_DISEN | F:SUST_STR | SUST_DEX | SEE_INVIS | SHOW_MODS E:FIRE_BOLT72:40 M:{name} rages in fire... L:4:STR | DEX D:The famed "Flame of the West", the Sword that was Broken and is forged D:again. It glows with the essence of fire, its wearer is mighty in combat, D:and no creature of Sauron can withstand it. N:84:'Anguirel' I:sword:Long Sword~ W:20:30:130:40000 A:3:20 to 127 P:0:2d5:10:12:0 F:HIDE_TYPE | AGGRAVATE | F:SLAY_EVIL | BRAND_POIS | SLAY_DEMON | FREE_ACT | RES_ELEC | F:RES_LIGHT | RES_DARK | LIGHT | SEE_INVIS | SHOW_MODS L:3:SPEED L:2:STR | CON | BLOWS D:Forged of meteoric iron by E["o]l the Dark Elf, and as deadly as any D:other blade he forged. N:85:'Elvagil' I:sword:Long Sword~ W:1:2:130:30000 A:50:10 to 50 P:0:2d5:12:12:0 F:HIDE_TYPE | F:SLAY_TROLL | SLAY_ORC | FEATHER | SEE_INVIS | SHOW_MODS L:2:DEX | CHR | STEALTH D:The "Singing Blade", whose wearer can slay Orcs and Trolls in the hidden D:and secret places of the earth. N:86:'Forasgil' I:sword:Rapier~ W:1:3:40:15000 A:38:5 to 50 P:0:1d6:12:19:0 F:SLAY_ANIMAL | BRAND_COLD | RES_COLD | RES_LIGHT | LIGHT | SHOW_MODS D:A slender, tapered needle of ice that coldly grips its impaled prey. N:87:'Careth Asdriag' I:sword:Rapier~ W:15:8:40:25000 A:10:15 to 80 P:0:2d6:16:12:0 F:HIDE_TYPE | F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_TROLL | SLAY_GIANT | F:SLAY_ORC | SHOW_MODS L:1:BLOWS L:2:STR | DEX | CON D:An heirloom of the dauntless Lords of Rh[^u]n far to the east, and a name D:of dismay to creatures natural and unnatural. N:88:'Sting' I:sword:Short Sword~ W:20:15:75:100000 A:6:20 to 100 P:0:1d7:7:8:0 F:HIDE_TYPE | RES_FEAR | F:SLAY_EVIL | SLAY_UNDEAD | SLAY_ORC | SLAY_ANIMAL | F:FREE_ACT | RES_LIGHT | LIGHT | SEE_INVIS | SHOW_MODS L:3:SPEED L:2:BLOWS L:1:STR | DEX | CON D:"I will give you a name, and I shall call you Sting." The perfect size D:for Bilbo, and stamped forever by the courage he found in Mirkwood, this D:sturdy little blade grants the wearer combat prowess and survival D:abilities he did not know he had. N:89:'Haradekket' I:sword:Scimitar~ W:20:15:130:30000 A:7:20 to 80 P:0:4d2:9:11:0 F:HIDE_TYPE | F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | SEE_INVIS | F:SHOW_MODS L:2:DEX | BLOWS D:A damascened scimitar that hefts with wondrous ease. Famed in song D:as the "Sickle of Harad", and a deadly foe to the undead. N:90:'Dagmor' I:sword:Short Sword~ W:20:8:80:15000 A:12:20 to 80 P:0:1d7:13:11:0 F:HIDE_TYPE | BRAND_POIS | F:SLAY_ANIMAL | SLOW_DIGEST | REGEN | SHOW_MODS L:2:BLOWS D:A stubby blade worn by Beren, whose horn sounded of old in the glades of D:Brethil. N:91:'Doomcaller' I:sword:Blade~ of Chaos W:70:25:180:200000 A:4:70 to 127 P:0:6d5:18:28:-50 # F:DRAIN_HP | F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_COLD | SLAY_TROLL | F:SLAY_DEMON | FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:RES_CHAOS | SEE_INVIS | TELEPATHY | AGGRAVATE | SHOW_MODS D:This weapon of wrath, wrought by a desperate berserker gang, dives hungrily D:into the yielding flesh of your enemies. You yourself fall under the D:shadow of death even as you inflict wounds that will not heal. ### Polearms ### N:92:of Melkor I:polearm:Spear~ W:65:45:200:100000 A:2:65 to 127 P:0:4d6:-12:20:0 # F:DRAIN_MANA | DRAIN_HP | F:LIGHT_CURSE | HEAVY_CURSE | DRAIN_EXP | AGGRAVATE | F:BRAND_POIS | RES_DARK | RES_BLIND | RES_LIGHT | RES_NETHR L:-4:STEALTH | WIS D:A mighty, heavy black spear, once wielded by the Lord of Darkness D:himself as he came to Valinor in wrath. Its envenomed bite pierced D:the Two Trees with wounds that would not heal. N:93:of Th['e]oden I:polearm:Beaked Axe~ W:20:15:180:40000 A:7:20 to 100 P:0:2d6:8:10:0 F:HIDE_TYPE | F:SLAY_DRAGON | TELEPATHY | SLOW_DIGEST | SHOW_MODS E:DRAIN_LIFE2:40 M:Your {kind} glow{s} black... L:3:WIS | CON D:The narrow axe head of this weapon would pierce the armour of a very D:Dragon, and the designs of your enemies stand naked and revealed. N:94:of Pain I:polearm:Glaive~ W:30:25:300:50000 A:4:30 to 127 P:0:9d6:0:30:0 F:SHOW_MODS D:The massive cleaver that crowns this glaive glows blood-red and black; D:fell spells of annihilation swirl and dance as you swing death's myrmidon D:down. N:95:'Osondir' I:polearm:Halberd~ W:20:8:140:22000 A:12:25 to 80 P:0:3d5:16:12:0 F:HIDE_TYPE | BLESSED | F:BRAND_FIRE | SLAY_UNDEAD | SLAY_GIANT | RES_FIRE | RES_SOUND | F:FEATHER | SEE_INVIS | SHOW_MODS L:3:STR | WIS L:2:CHR D:Lordly and tall did Osondir stand against the wrath of giants, and D:clear-eyed in barrows fell, wielding a halberd glowing ruby red. N:96:'Til-i-arc' I:polearm:Pike~ W:20:15:160:32000 A:7:20 to 80 P:0:3d5:10:12:10 F:HIDE_TYPE | F:BRAND_COLD | BRAND_FIRE | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | F:RES_FIRE | RES_COLD | SUST_INT | SLOW_DIGEST | SHOW_MODS L:3:STR | INT L:2:SPEED D:Within this long two-handed spear dwell the spirits of frost giants and D:fire demons, who war forever, fettered by sorcerous binds. N:97:'Aiglos' I:polearm:Spear~ W:15:45:50:140000 A:2:15 to 100 P:0:3d6:15:25:5 F:HIDE_TYPE | RES_FEAR | F:BRAND_COLD | RES_COLD | SLAY_EVIL | SLAY_TROLL | SLAY_ORC | KILL_UNDEAD | F:FREE_ACT | SLOW_DIGEST | BLESSED | SHOW_MODS E:COLD_BALL100:35 M:{name} glows an intense blue... L:4:DEX L:2:WIS D:The mighty spear of Gil-galad, famed as "Snow-point" in the songs of Elves. D:Against it, all the foul corruptions of Sauron dashed in vain. N:98:of Orom["e] I:polearm:Spear~ W:15:45:50:60000 A:2:15 to 127 P:0:4d6:15:15:0 # F:DRAIN_MANA | F:HIDE_TYPE | F:BRAND_FIRE | SLAY_GIANT | SLAY_ANIMAL | RES_FIRE | RES_LIGHT | F:FEATHER | LIGHT | SEE_INVIS | BLESSED | SHOW_MODS E:STONE_TO_MUD:5 M:Your {kind} pulsate{s}... L:4:INT | SPEED | INFRA D:The thrusting spear of wise Orom["e] the Vala, strong against giants of D:frost, and able to pierce rock or flesh with ease. N:99:'Nimloth' I:polearm:Spear~ W:15:12:50:30000 A:8:15 to 65 P:0:1d6:11:13:0 F:HIDE_TYPE | BLESSED | F:BRAND_COLD | SLAY_UNDEAD | RES_COLD | SEE_INVIS | SHOW_MODS L:3:STEALTH | SPEED D:A thin spike of thrice-forged steel caps a straight silvan shaft cut from D:a legendary tree, and spells to break the wills of the undead and strike D:cold into the breasts of your enemies lay upon this perfectly balanced D:spear. N:100:of the Eorlingas I:polearm:Lance~ W:20:23:360:55000 A:4:20 to 100 P:0:3d8:13:21:0 F:HIDE_TYPE | RES_FEAR | F:SLAY_EVIL | SLAY_TROLL | SLAY_ORC | SEE_INVIS | SHOW_MODS L:2:STR | DEX | SPEED D:"Forth Eorlingas!" To the field of Celebrant, Eorl the Young came beyond D:hope to save beleaguered Gondor, and from his lance fled massive trolls D:and dire wolves. N:101:of Durin I:polearm:Great Axe~ W:30:90:230:150000 A:1:40 to 127 P:0:4d4:10:20:15 F:HIDE_TYPE | BRAND_ACID | BRAND_FIRE | F:KILL_DRAGON | SLAY_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT | F:RES_FEAR | F:RES_ACID | RES_FIRE | RES_LIGHT | RES_DARK | RES_CHAOS | SHOW_MODS L:5:TUNNEL L:3:STR | CON L:-1:STEALTH D:The twin massive axe heads of this ancient demon's dread gleam with D:mithril inlay telling sagas of endurance. The powers of D:Khazad-d[^u]m protect its wielder and slay all evils found underground. N:102:of E["o]nw["e] I:polearm:Great Axe~ W:30:120:230:200000 A:1:40 to 127 P:0:5d4:15:18:8 F:HIDE_TYPE | RES_FEAR | F:SLAY_EVIL | BRAND_COLD | SLAY_UNDEAD | KILL_DEMON | F:SLAY_ORC | FREE_ACT | IM_COLD | RES_COLD | F:SEE_INVIS | F:BLESSED | SHOW_MODS E:LOSKILL:1000 M:Your {kind} let{s} out a long, shrill note... L:2:STR | INT | WIS | DEX | CON | CHR D:The axe of E["o]nw["e], leader of the Hosts of the West in the War of D:Wrath, strikes with icy wrath at the undead, disperses hosts of D:evil at a word, and grants Maia-like powers of body and mind. N:103:of Balli Stonehand I:polearm:Battle Axe~ W:30:15:170:90000 A:7:30 to 100 P:0:3d8:8:11:5 F:HIDE_TYPE | F:SLAY_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_BLIND | FEATHER | F:SEE_INVIS | REGEN | SHOW_MODS L:3:STR | CON L:1:STEALTH D:The twin blades of this weapon were forged in Belegost, and powerful D:forces to resist and endure lie ready for he who shall wield it once D:more. N:104:'Lotharang' I:polearm:Battle Axe~ W:30:15:170:21000 A:7:30 to 100 P:0:2d8:14:13:0 F:HIDE_TYPE | RES_DISEN | F:SLAY_TROLL | SLAY_ORC | SHOW_MODS E:CURE_SERIOUS:3+d3 M:Your {kind} radiate{s} deep purple... L:3:STR | DEX L:1:BLOWS D:A superbly crafted double-bladed axe once borne by Ceruthain, commander D:of the Rangers of Arnor. N:105:'Mundwine' I:polearm:Lochaber Axe~ W:30:8:240:30000 A:12:30 to 100 P:0:3d8:12:17:0 F:SLAY_EVIL | SLAY_ANIMAL | SLAY_DEMON | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | SHOW_MODS D:A massive axe with twin razor-sharp heads, so large that it usually D:requires two hands to wield, with spells to ward off the elements D:intricately engraved upon its surface in filleted gold. N:106:'Barukkheled' I:polearm:Broad Axe~ W:20:8:160:50000 A:12:20 to 75 P:0:2d6:13:19:0 F:HIDE_TYPE | F:SLAY_EVIL | SLAY_TROLL | SLAY_GIANT | SLAY_ORC | F:SEE_INVIS | SHOW_MODS L:3:CON D:A royal heirloom of the southern coast, strong in combat against the evil D:creatures of earth. N:107:of Wrath I:polearm:Trident~ W:15:35:70:90000 A:3:15 to 100 P:0:3d10:16:18:0 F:HIDE_TYPE | BRAND_POIS | F:SLAY_EVIL | KILL_UNDEAD | RES_LIGHT | RES_DARK | SEE_INVIS | F:BLESSED | SHOW_MODS L:2:STR | DEX D:A massive triple-pronged spear, so great it normally requires two hands D:to wield, evoking the spirit of Osse who with it pierced legions of D:evil and undead. N:108:of Ulmo I:polearm:Trident~ W:30:90:70:120000 A:1:30 to 127 P:0:4d10:15:19:0 F:HIDE_TYPE | F:SLAY_DRAGON | SLAY_ANIMAL | FREE_ACT | HOLD_LIFE | F:IM_ACID | RES_ACID | RES_NETHR | F:SEE_INVIS | SLOW_DIGEST | REGEN | F:BLESSED | SHOW_MODS E:TELE_OTHER:50 M:Your {kind} glow{s} deep red... L:4:DEX D:The awesome weapon of the Vala Ulmo, Lord of Waters. Mightiest of all the D:powers of good save Manw["e] himself, Ulmo laughs to scorn the dread powers D:of the undead, and is utterly in command of the Element of water. N:109:'Avavir' I:polearm:Scythe~ W:40:8:180:18000 A:12:45 to 100 P:0:5d3:18:12:30 F:HIDE_TYPE | F:BRAND_COLD | BRAND_FIRE | FREE_ACT | RES_FIRE | RES_COLD | F:RES_LIGHT | LIGHT | SEE_INVIS | SHOW_MODS E:RECALL:200 M:{name} pulses a soft white. L:3:DEX | CHR | SPEED D:Holding elemental powers whose struggles turn this weapon red and purest D:white, this shining reaper bears within it a power of going forth and D:returning. N:110:of H['u]rin I:polearm:Beaked Axe~ W:20:15:180:90000 A:7:20 to 100 P:0:3d6:12:15:0 # F:DRAIN_MANA | F:KILL_DEMON | HIDE_TYPE | F:BRAND_ACID | RES_ACID | RES_DARK | RES_FIRE | LIGHT | F:SLAY_DRAGON | SLAY_TROLL | SHOW_MODS E:BERSERKER:80+d80 M:{name} glows in anger! L:2:STR | CON D:Wielded by H['u]rin Thalion, last lord of Dor-L['o]min at the Battle D:of Tears Unnumbered. He stood alone, his friends and kinsmen D:dead about him, his axe smoking in the black blood of Gothmog's D:troll-guard. No less than seventy times, as he slew his foes, D:did he utter his mighty war-cry: "Aur["e] entuluva!" - "Day shall D:come again!" ### Blunt Weapons ### N:111:'Grond' I:hafted:Mighty Hammer~ W:100:1:1000:500000 A:0:100 to 100 P:0:9d9:5:25:10 F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | IMPACT | KILL_UNDEAD | F:KILL_DEMON | SLAY_TROLL | SLAY_ORC | F:SEE_INVIS | TELEPATHY | AGGRAVATE | SHOW_MODS | INSTA_ART D:The mighty Hammer of the Underworld, blackened by doomspells of shattering. D:Its wielder holds the lives of all Morgoth's servants in his hand. N:112:'Totila' I:hafted:Flail~ W:20:8:150:55000 A:12:20 to 65 P:0:3d6:16:12:0 F:SLAY_EVIL | BRAND_FIRE | RES_FIRE | RES_CONFU | F:SHOW_MODS E:CONFUSE2:15 M:{name} glows in scintillating colours... L:2:STEALTH | SPEED D:A flail whose head befuddles those who stare as you whirl it round and D:becomes a fiery comet as you bring it down. N:113:'Thunderfist' I:hafted:Two-Handed Great Flail~ W:45:38:300:160000 A:3:45 to 127 P:0:4d6:5:18:0 F:HIDE_TYPE | RES_FEAR | F:SLAY_ANIMAL | BRAND_FIRE | BRAND_ELEC | SLAY_TROLL | SLAY_ORC | F:RES_ELEC | RES_FIRE | RES_DARK | SHOW_MODS L:4:STR L:3:CON D:The long-lost weapon of Kzurin, Dwarven champion of ancient Belegost D:Runes of strength adorn its handle, and flames and sparks roar and D:crackle around its massive head. N:114:'Bloodspike' I:hafted:Morning Star~ W:20:30:150:30000 A:3:20 to 75 P:0:2d6:8:22:0 F:HIDE_TYPE | BRAND_POIS | F:SLAY_ANIMAL | SLAY_TROLL | SLAY_ORC | RES_NEXUS | SEE_INVIS | F:SHOW_MODS L:4:STR D:You feel strong and firm of foot as you whip its spiked orb around and D:bathe it in the blood of your foes. N:115:'Firestar' I:hafted:Morning Star~ W:20:15:150:35000 A:7:20 to 100 P:0:2d6:15:17:2 F:BRAND_FIRE | IM_FIRE | SHOW_MODS E:FIRE_BOLT72:20 M:{name} rages in fire... D:A famed battle-lord of old with a head as ruddy as embers that can yet rise D:up in wrath. N:116:'Taratol' I:hafted:Mace~ W:20:15:200:50000 A:7:20 to 100 P:0:3d4:12:12:0 F:KILL_DRAGON | BRAND_ELEC | IM_ELEC F:SHOW_MODS E:HASTE1:100+d100 M:{name} glows bright green... D:A great ridged mace that surrounds you with a nimbus of living lightning. D:You remain utterly untouched, even as fat sparks crackle around your D:fingers and eyebrows. N:117:of Aul["e] I:hafted:Great Hammer~ W:40:75:120:250000 A:1:40 to 127 P:0:18d1:19:21:5 # F:DRAIN_MANA | F:HIDE_TYPE | RES_FEAR | F:KILL_DRAGON | SLAY_EVIL | BRAND_ACID | SLAY_UNDEAD | SLAY_DEMON | F:FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_NEXUS | F:SEE_INVIS | SHOW_MODS L:8:TUNNEL L:4:WIS D:The wondrous hammer of Aul["e], creator of the wise Dwarven lords of old. D:It bears demolishing magics that no serpent or demon can withstand, and D:invokes the strength of mountains to ward off the tumult of the elements. N:118:'Nar-i-vagil' I:hafted:Quarterstaff~ W:20:18:150:70000 A:5:20 to 80 P:0:1d9:10:20:0 F:HIDE_TYPE | F:SLAY_ANIMAL | BRAND_FIRE | RES_FIRE | RES_POIS | SHOW_MODS L:4:INT D:Named for a fiery star and set with priceless gems bearing mystic D:auras of protection and thought. N:119:'Eriril' I:hafted:Quarterstaff~ W:20:18:150:20000 A:5:20 to 100 P:0:1d9:13:15:0 F:HIDE_TYPE | F:SLAY_EVIL | RES_LIGHT | LIGHT | SEE_INVIS | SHOW_MODS E:IDENTIFY:10 M:Your {kind} glow{s} yellow... L:4:INT | WIS D:The radiant golden staff of an Istar of legend; this wizard's companion D:grants keen sight and clear knowledge of many hidden things. N:120:of Ol['o]rin I:hafted:Quarterstaff~ W:30:105:150:130000 A:1:30 to 100 P:0:2d9:10:13:0 F:HIDE_TYPE | KILL_DEMON | F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | F:HOLD_LIFE | RES_FIRE | RES_NETHR | SEE_INVIS | SHOW_MODS E:PROBING:20 M:{name} glows brightly... L:4:INT | WIS L:2:CHR D:A staff tall and sturdy, borne of old by Gandalf. Rough-hewn runes that D:invoke the element of Earth stand bold upon its gnarled surface, and no D:creature who lives in the shadow of mountains can withstand the blows it D:deals. N:121:'Deathwreaker' I:hafted:Mace~ of Disruption W:80:38:400:400000 A:3:80 to 127 P:0:7d8:18:18:0 # F:DRAIN_MANA | F:HIDE_TYPE | F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_EVIL | KILL_UNDEAD | BRAND_FIRE | F:IM_FIRE | RES_FIRE | RES_DARK | RES_CHAOS | RES_DISEN | AGGRAVATE | F:SHOW_MODS L:6:STR L:4:TUNNEL D:A weapon so massive it seems beyond the strength of mortals, yet you feel D:the might of giants within you as you heft it. As you grip the handle D:of ebony and steel, coronas of fire blaze, and mighty spells to preserve D:magic surge around you. You wield the Fear of Dragons and the Despair D:of the Undead! N:122:'Turmil' I:polearm:Lucerne Hammer~ W:20:15:120:30000 A:7:20 to 100 P:0:2d5:10:11:8 F:HIDE_TYPE | BLESSED | F:BRAND_COLD | SLAY_ORC | IM_COLD | RES_LIGHT | LIGHT | REGEN | F:SHOW_MODS E:DRAIN_LIFE1:40 M:{name} glows white... L:4:WIS | INFRA D:Once wielded by the High Priest of Meneltarma, this great mace gleams coldly D:as though moonlit, and can strike equally mighty spiritual and physical D:blows. N:123:of Gothmog I:hafted:Whip~ W:60:25:90:25000 A:4:60 to 127 P:0:6d3:13:15:0 # F:DRAIN_HP | F:HIDE_TYPE | F:LIGHT_CURSE | HEAVY_CURSE | AGGRAVATE | F:BRAND_FIRE | IM_FIRE | RES_ELEC | RES_DARK | LIGHT F:SLAY_ANIMAL | KILL_DRAGON | SLAY_TROLL | SLAY_GIANT | F:SHOW_MODS E:FIRE_BALL:15 M:The {kind} glow{s} deep red... L:3:STR L:-3:INT | DEX | WIS D:A great crackling Balrog's whip of flame, this weapon could bring D:even Ungoliant to heel. ### Missile Weapons ### N:124:'Belthronding' I:bow:Long Bow~ W:40:20:40:35000 A:5:40 to 127 P:0:0d0:20:22:0 F:HIDE_TYPE | F:RES_DISEN | SHOW_MODS L:3:DEX L:1:SPEED | STEALTH | SHOTS D:The great bow of Beleg C['u]thalion, the most famous archer of the Elves. D:Its backbone of black yew holds strings of bear sinew, and of old, only D:Beleg himself could draw them. N:125:of Bard I:bow:Long Bow~ W:30:20:40:20000 A:5:40 to 127 P:0:0d0:17:19:0 F:HIDE_TYPE | F:FREE_ACT | SHOW_MODS L:2:MIGHT L:1:DEX | SPEED D:The great yew bow of grim-faced Bard, who shot the mightiest arrow that D:songs record. N:126:'Cubragol' I:bow:Light Crossbow~ W:50:25:110:50000 A:4:50 to 127 P:0:0d0:10:14:0 F:HIDE_TYPE | BRAND_FIRE | F:RES_FIRE | SHOW_MODS L:10:SPEED D:A crossbow that grants fiery speed to he who finds it, and from which D:shoot bolts that blaze with flame unquenchable. N:127:of Umbar I:bow:Heavy Crossbow~ W:60:20:200:35000 A:5:60 to 127 P:0:4d1:18:18:0 F:AGGRAVATE | F:RES_LIGHT | RES_DARK | RES_BLIND | RES_ELEC | F:HIDE_TYPE | SHOW_MODS E:ARROW:20+d20 M:Your {kind} form{s} a magical arrow... L:2:MIGHT L:1:STR | CON D:A great brazen arbalest with arms of gleaming steel. It shoots quarrels D:with mighty power for those brave enough to risk betrayal. N:128:of Amrod I:bow:Short Bow~ W:25:10:30:9000 A:10:30 to 100 P:0:0d0:12:15:0 F:RES_FIRE | RES_ELEC | RES_COLD | REGEN L:2:STR | CON | MIGHT D:One of a pair of hunting bows once belonging to F["e]anor's two youngest D:sons. The bows are like and yet unlike, much as the twin brothers were. N:129:of Amras I:bow:Short Bow~ W:25:10:30:9000 A:10:30 to 80 P:0:0d0:12:15:0 F:RES_FIRE | RES_ELEC | RES_COLD | SLOW_DIGEST L:2:INT | WIS | DEX L:1:SHOTS | MIGHT | SPEED D:One of a pair of hunting bows once belonging to F["e]anor's two youngest D:sons. The bows are like and yet unlike, much as the twin brothers were. ### Digging Tools ### N:130:of N['a]in I:digger:Mattock~ W:60:8:240:30000 A:12:60 to 100 P:0:2d8:12:18:0 F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON | F:RES_DARK | RES_DISEN | E:STONE_TO_MUD:2 M:Your {kind} pulsate{s}... L:6:TUNNEL L:4:INFRA | SEARCH | STR D:A mighty Dwarven mattock, as good for hewing orc-necks as for hewing D:stone. N['a]in, King of the Iron Hills, brought his mattock-wielding D:warriors to the Battle of Azanulbizar, and no Orc could withstand them, D:although N['a]in himself fell before their lord Azog. N:131:of Erebor I:digger:Pick~ W:55:5:180:30000 A:20:55 to 100 P:0:4d3:5:20:0 F:SUST_STR | HIDE_TYPE | LIGHT | F:SLAY_ORC | SLAY_TROLL | SLAY_DEMON | BRAND_ACID | F:RES_CHAOS | RES_LIGHT | RES_DARK L:5:TUNNEL L:3:STR | CON D:A fine dwarven pick, good for a miner, and suitable as a weapon D:should the wielder ever tunnel through into a foe's stronghold. ### Miscellaneous new stuff ### N:132:of Fundin Bluecloak I:hafted:Ball-and-Chain~ W:65:100:130:60000 A:2:65 to 127 P:0:4d4:13:17:10 F:LIGHT | HIDE_TYPE | F:SLAY_EVIL | SLAY_UNDEAD | F:RES_FIRE | RES_ELEC | RES_NETHR | HOLD_LIFE | E:DISPEL_EVIL:100+d100 M:The {kind} flood{s} the area with goodness... L:4:STR | WIS D:The weapon of a mighty dwarven priest, whose shade is rumoured to D:haunt the halls of Angband still. N:133:of Azagh[^a]l I:sword:Main Gauche~ W:18:30:30:50000 A:3:18 to 100 P:0:2d5:12:14:0 F:KILL_DRAGON | IM_FIRE | RES_ACID | RES_FEAR | D:Azagh[^a]l, Dwarf-king of Belegost, fell before Glaurung in the Battle D:of Unnumbered Tears. With his final breath, Azagh[^a]l plunged this D:blade into Glaurung's belly with such a blow that the Father of Dragons fled D:the field with all his kin, and was at first believed to be mortally wounded. N:134:of the Haradrim I:shield:Leather Shield~ W:35:12:90:25000 A:10:35 to 127 P:9:1d2:5:5:15 F:SUST_STR | SUST_CON | HIDE_TYPE | F:RES_FEAR | RES_BLIND | RES_POIS E:BERSERKER:50 M:{name} glows in anger! L:2:STR | CON D:The painted shield of a chieftain of Far Harad, gaudy and barbaric. D:Its wielder will fear nothing and fight with unnatural strength, but D:also draw attention to himself. N:135:of Elros I:shield:Wicker Shield~ W:40:6:30:60000 A:10:50 to 127 P:2:1d1:0:0:20 F:RES_ELEC | RES_SHARD | RES_CONFU | HOLD_LIFE L:4:CON L:1:WIS | INT D:The shield of Elros Tar-Minyatur, founder of N['u]menor. Granted long D: life by the Valar, even his shield became imbued with power. N:136:of ['E]owyn I:sword:Bastard Sword~ W:30:100:140:120000 A:3:30 to 127 P:0:4d4:12:16:0 F:SLAY_EVIL | KILL_UNDEAD | SLAY_GIANT | SLAY_ANIMAL | F:RES_NETHR | RES_FEAR | RES_DARK | RES_COLD L:4:STR | CHR L:2:STEALTH D:The blade of the legendary Shieldmaiden of Rohan, who slew the foul D:steed of the Morgul-lord before striking down the mighty Witch-king D:himself, whom no mortal man could hinder. N:137:of Radagast I:boots:Pair~ of Leather Boots W:10:25:20:7000 A:8:15 to 70 P:2:1d1:0:0:12 F:HIDE_TYPE | FREE_ACT | RES_COLD | FEATHER L:5:INFRA L:3:STEALTH L:1:WIS D:Made of brown leather, covered with scuff marks and dust, still these D: boots possess the magic of Radagast, friend of birds and nature. N:138:'Stormwalker' I:boots:Pair~ of Mithril Shod Boots W:30:25:40:40000 A:3:60 to 127 P:8:1d1:0:0:24 F:HIDE_TYPE | IM_ELEC | RES_SOUND L:6:SPEED E:BERSERKER:100 M:{name} glows in anger! D:And they hewed off Gelmir's hands and feet, and his head last, within D: sight of the Elves, and left him. By ill chance there stood Gwindor D: of Nargothrond, the brother of Gelmir. Now his wrath was kindled to D: madness, and he leapt forth on horseback, and many riders with him; D: and they pursued the heralds and slew them, and drove on deep into D: the main host. #N:139:of Amandil #I:amulet:55 #W:65:30:3:90000 #A:3:60 to 127 #F:HIDE_TYPE | INSTA_ART #F:RES_ELEC | RES_COLD | #F:RES_FEAR | RES_BLIND | RES_STUN | RES_CONFU #L:4:SEARCH #L:2:SPEED #D:The pendant of Amandil, the last Lord of And['u]ni["e], and mighty #D: ship-captain of N['u]menor. First among N['u]men['o]reans to see #D: Sauron for what he was. angband-v3.3.2/lib/edit/p_hist.txt0000644000175000017500000001650211651552410016335 0ustar chriscchrisc# File: p_hist.txt # This file is used to initialize the "player history" information for # the Angband game. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # Background information (see below) # Chart progression by race: # Human/Dunadan --> 1 --> 2 --> 3 --> 50 --> 51 --> 52 --> 53 # Half-Elf --> 4 --> 1 --> 2 --> 3 --> 50 --> 51 --> 52 --> 53 # Elf --> 5 --> 6 --> 9 --> 54 --> 55 --> 56 # High-Elf --> 7 --> 8 --> 9 --> 54 --> 55 --> 56 # Hobbit --> 10 --> 11 --> 3 --> 50 --> 51 --> 52 --> 53 # Gnome --> 13 --> 14 --> 3 --> 50 --> 51 --> 52 --> 53 # Dwarf --> 16 --> 17 --> 18 --> 57 --> 58 --> 59 --> 60 --> 61 # Half-Orc --> 19 --> 20 --> 2 --> 3 --> 50 --> 51 --> 52 --> 53 # Half-Troll --> 21 --> 22 --> 62 --> 63 --> 64 --> 65 --> 66 # Kobold --> 23 --> 24 --> 25 --> 26 --> 67 --> 68 --> 69 # XXX XXX XXX This table *must* be correct or drastic errors may occur! # Note that the "spacing" in the "description" lines is very important! # Version stamp (required) V:3.0.11 N:1:2:10:25 D:You are the illegitimate and unacknowledged child N:1:2:20:35 D:You are the illegitimate but acknowledged child N:1:2:95:45 D:You are one of several children N:1:2:100:50 D:You are the first child N:2:3:40:65 D:of a Serf. N:2:3:65:80 D:of a Yeoman. N:2:3:80:90 D:of a Townsman. N:2:3:90:105 D:of a Guildsman. N:2:3:96:120 D:of a Landed Knight. N:2:3:99:130 D:of a Titled Noble. N:2:3:100:140 D:of a Royal Blood Line. N:3:50:20:20 D:You are the black sheep of the family. N:3:50:80:55 D:You are a credit to the family. N:3:50:100:60 D:You are a well liked child. N:4:1:15:40 D:Your mother was of the Avari. N:4:1:30:45 D:Your father was of the Avari. N:4:1:50:50 D:Your mother was of the Nandor. N:4:1:70:55 D:Your father was of the Nandor. N:4:1:85:60 D:Your mother was of the Sindar. N:4:1:95:65 D:Your father was of the Sindar. N:4:1:98:70 D:Your mother was of the Noldor. N:4:1:100:75 D:Your father was of the Noldor. N:5:6:60:50 D:You are one of several children N:5:6:100:55 D:You are the only child N:6:9:40:40 D:of an Avarin N:6:9:70:50 D:of a Nandorin N:6:9:100:60 D:of a Sindarin N:7:8:60:50 D:You are one of several children N:7:8:100:55 D:You are the only child N:8:9:75:50 D:of a Telerin N:8:9:95:55 D:of a Noldorin N:8:9:100:60 D:of a Vanyarin N:9:54:40:80 D:Ranger. N:9:54:70:90 D:Archer. N:9:54:87:110 D:Warrior. N:9:54:95:125 D:Mage. N:9:54:99:140 D:Prince. N:9:54:100:145 D:King. N:10:11:85:45 D:You are one of several children of a Hobbit N:10:11:100:55 D:You are the only child of a Hobbit N:11:3:20:55 D:Burglar. N:11:3:30:80 D:Miller. N:11:3:40:90 D:Tavern Owner. N:11:3:50:100 D:Archer. N:11:3:80:110 D:Warrior. N:11:3:95:115 D:Shirriff. N:11:3:99:125 D:Mayor. N:11:3:100:140 D:Clan Elder. N:13:14:85:45 D:You are one of several children of a Gnome N:13:14:100:55 D:You are the only child of a Gnome N:14:3:20:55 D:Beggar. N:14:3:50:70 D:Braggart. N:14:3:75:85 D:Prankster. N:14:3:95:100 D:Warrior. N:14:3:100:125 D:Mage. N:16:17:25:40 D:You are one of two children of a Dwarven N:16:17:100:50 D:You are the only child of a Dwarven N:17:18:10:60 D:Thief. N:17:18:25:75 D:Prison Guard. N:17:18:75:90 D:Miner. N:17:18:90:110 D:Warrior. N:17:18:99:130 D:Priest. N:17:18:100:150 D:King. N:18:57:15:10 D:You are the black sheep of the family. N:18:57:85:50 D:You are a credit to the family. N:18:57:100:55 D:You are a well liked child. N:19:20:25:25 D:Your mother was an Orc, N:19:20:100:25 D:Your father was an Orc, N:20:2:20:30 D:and it is acknowledged. You are the adopted child N:20:2:100:50 D:but it is unacknowledged. You are the adopted child N:21:22:30:20 D:Your mother was a Stone-Troll N:21:22:60:25 D:Your father was a Stone-Troll N:21:22:75:30 D:Your mother was a Cave-Troll N:21:22:90:35 D:Your father was a Cave-Troll N:21:22:95:40 D:Your mother was a Water-Troll N:21:22:100:45 D:Your father was a Water-Troll N:22:62:5:60 D:Cook. N:22:62:95:55 D:Warrior. N:22:62:99:65 D:Shaman. N:22:62:100:80 D:Clan Chief. N:23:24:20:40 D:You are the runt of N:23:24:80:50 D:You come from N:23:24:100:55 D:You are the largest of N:24:25:15:45 D:a litter of 3 pups. N:24:25:40:45 D:a litter of 4 pups. N:24:25:70:50 D:a litter of 5 pups. N:24:25:85:50 D:a litter of 6 pups. N:24:25:95:55 D:a litter of 7 pups. N:24:25:100:55 D:a litter of 8 pups. N:25:26:25:40 D:Your father was a fungus farmer, N:25:26:50:45 D:Your father was a hunter, N:25:26:75:50 D:Your father was a warrior, N:25:26:95:55 D:Your father was a shaman, N:25:26:100:60 D:Your father was the tribal chief, N:26:67:20:45 D:and your mother was a prisoner of war. N:26:67:95:50 D:and your mother was a cook. N:26:67:100:55 D:and your mother was one of the Chief's harem. N:50:51:20:50 D:You have dark brown eyes, N:50:51:60:50 D:You have brown eyes, N:50:51:70:50 D:You have hazel eyes, N:50:51:80:50 D:You have green eyes, N:50:51:90:50 D:You have blue eyes, N:50:51:100:50 D:You have blue-gray eyes, N:51:52:70:50 D:straight N:51:52:90:50 D:wavy N:51:52:100:50 D:curly N:52:53:30:50 D:black hair, N:52:53:70:50 D:brown hair, N:52:53:80:50 D:auburn hair, N:52:53:90:50 D:red hair, N:52:53:100:50 D:blond hair, N:53:0:10:50 D:and a very dark complexion. N:53:0:30:50 D:and a dark complexion. N:53:0:80:50 D:and an average complexion. N:53:0:90:50 D:and a fair complexion. N:53:0:100:50 D:and a very fair complexion. N:54:55:85:50 D:You have light grey eyes, N:54:55:95:50 D:You have light blue eyes, N:54:55:100:50 D:You have light green eyes, N:55:56:75:50 D:straight N:55:56:100:50 D:wavy N:56:0:75:50 D:black hair, and a fair complexion. N:56:0:85:50 D:brown hair, and a fair complexion. N:56:0:95:50 D:blond hair, and a fair complexion. N:56:0:100:50 D:silver hair, and a fair complexion. N:57:58:99:50 D:You have dark brown eyes, N:57:58:100:50 D:You have glowing red eyes, N:58:59:90:50 D:straight N:58:59:100:50 D:wavy N:59:60:75:50 D:black hair, N:59:60:100:50 D:brown hair, N:60:61:25:47 D:a one foot beard, N:60:61:60:49 D:a two foot beard, N:60:61:90:51 D:a three foot beard, N:60:61:100:53 D:a four foot beard, N:61:0:100:50 D:and a dark complexion. N:62:63:60:50 D:You have slime-green eyes, N:62:63:85:50 D:You have puke-yellow eyes, N:62:63:99:50 D:You have blue-bloodshot eyes, N:62:63:100:55 D:You have glowing red eyes, N:63:64:33:50 D:dirty N:63:64:66:50 D:mangy N:63:64:100:50 D:oily N:64:65:33:50 D:sea-weed green hair, N:64:65:66:50 D:bright red hair, N:64:65:100:50 D:dark purple hair, N:65:66:25:50 D:and green N:65:66:50:50 D:and blue N:65:66:75:50 D:and white N:65:66:100:50 D:and black N:66:0:33:50 D:ulcerous skin. N:66:0:66:50 D:scabby skin. N:66:0:100:50 D:leprous skin. N:67:68:10:50 D:You have black eyes, N:67:68:40:50 D:You have dark brown eyes, N:67:68:80:50 D:You have brown eyes, N:67:68:99:50 D:You have light brown eyes, N:67:68:100:50 D:You have glowing red eyes, N:68:69:40:50 D:a dark brown hide, N:68:69:60:50 D:a reddish-brown hide, N:68:69:95:50 D:an olive green hide, N:68:69:100:50 D:a deep blue hide, N:69:0:10:50 D:and large, flat teeth. N:69:0:90:50 D:and small, sharp teeth. N:69:0:100:50 D:and large, sharp teeth. angband-v3.3.2/lib/edit/pain.txt0000644000175000017500000000425211651552410015775 0ustar chriscchrisc# File: pain.txt # This file is used to initialize the monster pain messages for Angband. # === Understanding pain.txt === # N: serial number # M: message # M: message # etc. # 'N' indicates the beginning of an entry. The serial number must # increase for each new item. # 'M' is for the pain message. Each entry must have 7 messages -- # each one corresponds to a range of health, with higher messages # being displayed when a monster is damaged only a little, and lower # messages being displayed when a monster is near death. N:1 M:shrug[s] off the attack. M:grunt[s] with pain. M:cr[ies|y] out in pain. M:scream[s] in pain. M:scream[s] in agony. M:writhe[s] in agony. M:cr[ies|y] out feebly. N:2 M:barely notice[s]. M:flinch[es]. M:squelch[es]. M:quiver[s] in pain. M:writhe[s] about. M:writhe[s] in agony. M:jerk[s] limply. N:3 M:shrug[s] off the attack. M:snarl[s] with pain. M:yelp[s] in pain. M:howl[s] in pain. M:howl[s] in agony. M:writhe[s] in agony. M:yelp[s] feebly. N:4 M:ignore[s] the attack. M:grunt[s] with pain. M:squeal[s] in pain. M:shriek[s] in pain. M:shriek[s] in agony. M:writhe[s] in agony. M:cr[ies|y] out feebly. N:5 M:barely notice[s]. M:hiss[es]. M:rear[s] up in anger. M:hiss[es] furiously. M:writhe[s] about. M:writhe[s] in agony. M:jerk[s] limply. N:6 M:shrug[s] off the attack. M:snarl[s]. M:growl[s] angrily. M:hiss[es] in pain. M:mewl[s] in pain. M:hiss[es] in agony. M:mewl[s] pitifully. N:7 M:ignore[s] the attack. M:drone[s] angrily. M:scuttle[s] about. M:twitch[es] in pain. M:jerk[s] in pain. M:jerk[s] in agony. M:jerk[s] feebly. N:8 M:shrug[s] off the attack. M:flap[s] angrily. M:jeer[s] in pain. M:squawk[s] with pain. M:twitter[s] in agony. M:flutter[s] about. M:chirp[s] feebly. N:9 M:ignore[s] the attack. M:jerk[s]. M:rattle[s]. M:clatter[s]. M:shake[s]. M:stagger[s]. M:crumple[s]. N:10 M:ignore[s] the attack. M:grunt[s]. M:jerk[s]. M:moan[s]. M:groan[s]. M:hesitate[s]. M:stagger[s]. N:11 M:ignore[s] the attack. M:spin[s] fiercely. M:swirl[s] about. M:twist[s] around. M:spin[s] slowly. M:swirl[s] weakly. M:twist[s] limply. N:12 M:laugh[s] off the attack. M:sneer[s]. M:scowl[s]. M:bellow[s] in rage. M:scream[s] in fury. M:grunt[s]. M:wince[s]. angband-v3.3.2/lib/edit/hints.txt0000644000175000017500000001405211651552410016172 0ustar chriscchrisc# File: hints.txt # This file is used to initialize the hints for the game. # Do not modify this file unless you know exactly what you are doing # unless you wish to risk possible system crashes and broken savefiles. # That said, it isn't difficult. Just keep each hint on one line, less than 80 # characters, and start each line with H: # Format: # H:Hint text. H:Cure Critical Wounds potions will cure blindness and confusion; carry lots. H:Staves can be used even when confused and blinded. H:Potions of Heroism or Berserk Strength will protect you from being scared. H:Monsters that breathe fire, acid, electricity, or cold can deal big damage. H:Resistances cut damage to 1/3rd for the basic four elements. H:The more hitpoints a monster has, the more damage its breath will do. H:You can combine equipment of Resist Fire and a potion of the same name. H:You can combine equipment of Resist Cold and a potion of the same name. H:You can combine equipment of Resist Poison and a potion of the same name. H:If you don't know what a monster can do, use a rod of probing on it. H:Never underestimate the value of constitution. Hitpoints keep you alive. H:Wield your ammo to your quiver to have it take fewer inventory slots. H:Inscribe items with the '{' command. H:Inscribe an item with "!s" to get confirmation before selling it. H:Inscribe an item with "!d" to get confirmation before dropping it. H:Inscribe an item with "!k" to get confirmation before destroying it. H:Inscribe an item with "!v" to get confirmation before throwing it. H:Inscribe an item with "!*" to get confirmation before doing anything to it. H:You can use the 'I' command to inspect items and get details on them. H:Use '=' to check out the options and customize your game. H:Be sure to set your hitpoint warning in the options menu ('='). H:Flasks of oil make a good throwing weapon early on. H:Word of Recall will send you to and from the dungeon. H:You can never teleport into a vault, even if you're already standing in it. H:The only way to protect your inventory from damage is through immunities. H:+10 speed means you move twice as fast as normal. H:Too much stunning will knock you out! This is to be avoided if possible. H:The stores change their stock every so often. H:If acid hits your armor, you take less damage from it. H:Nexus attacks can swap your stats. Smart, weak warriors don't do well. H:Regeneration improves your recovery of both hitpoints and mana. H:Never be too afraid to run away. H:Never go exploring without an escape option. H:Pay attention to how your enemies move - some are erratic, some can blink. H:Even among the same type, some enemies will be faster or slower than others. H:Monsters' breath weapons grow less dangerous as they lose hitpoints. H:A wounded enemy's spells are as strong as a healthy one's. H:Don't worry about using up your potions, wands, and staves to stay alive. H:If you're in a bad situation, take a breather and "I"npect all your gear. H:When a character dies, memories of monsters she has fought are passed on. H:Even the most powerful characters can be made useless by blindness. H:Even the most powerful characters can be made useless by confusion. H:Finding a way to resist blindness and confusion are critical to survival. H:Probing an enemy to learn its abilities is always useful. H:Buy at least one scroll of phase door before you enter the dungeon. H:Buy at least one potion of cure light wounds before you enter the dungeon. H:If a potion or scroll is cheaper than a scroll of Identify, buy it to ID it. H:Acid can destroy your stuff - watch out for water hounds and water vortices. H:Never underestimate monsters you haven't fought before. H:Quivers can hold different types of ammo in one inventory slot (max. 99). H:If you have more than 99 items in your quiver, it will take up more slots. H:Many items are bad, but few are cursed to the point of needing magic. H:A bigger weapon isn't always better - check your damage using 'I'nspect H:Can't keep track of all the information on the screen? Add extra windows. H:You can use subwindows to display messages, monsters, items and more. H:If you teleport away a tough monster, beware of teleporting afterwards! H:Resistances to higher elements are somewhat random, so be careful. H:Hold life will not block all experience drain, just most of it. H:Fire damage can destroy scrolls, books, and staves in your inventory. H:Cold damage can destroy potions in your inventory. H:Electrical damage can destroy wands, rods and rings in your inventory. H:Immunity to an element prevents inventory destruction from that element. H:Phase door is a good escape if the terrain is appropriate. H:In open rooms Phase Door may well keep you in the line of fire. H:In a vault, any form of teleportation will always teleport you outside. H:Identical resistances on different pieces of equipment do not stack. H:Curing potions and spells reduce or eliminate cuts, stunning and poison. H:Nexus attacks can teleport to, teleport away, teleport level, or swap stats. H:Time attacks are not mitigated by sustains. H:Drain charge attacks remove charges from your items and heal the monster! H:You cannot cast spells or fire missiles at monsters in walls, but they can. H:To attack a monster in a wall with your weapon, use the 'T'unnel command. H:Acquirement scrolls produce better items if you read them deeper down. H:In truly desperate times, use Teleport Level or Destruction to escape. H:You always get the first move when entering a level. H:Regeneration makes you hungry more quickly. H:If you're in extreme need of food, curing potions might do you good. H:Under great weights of loot, you'll be less quick of foot. H:You're never invicible. Never forget that. H:Always carry around an escape that you can use while blind and confused. H:Staying on a level too long can cause awake random monsters to spawn. H:Wands and staves sell for a good price even with 0 charges. H:Walking around with lots of heavy weapons is not necessarily a good idea. H:Carry around extra copies of spellbooks 1-4 in case one gets burned. H:You don't have to cover every resist all the time - carry swap items. angband-v3.3.2/lib/edit/store.txt0000644000175000017500000000560111651552410016201 0ustar chriscchrisc# Syntax # # S: store number : number of slots for this store # I: slots taken up by this item : textual tval : textual name # # V:3.1.0 # Armoury S:2:33 I:2:boots:Pair~ of Leather Sandals I:2:boots:Pair~ of Leather Boots I:1:boots:Pair~ of Iron Shod Boots I:2:helm:Hard Leather Cap~ I:1:helm:Metal Cap~ I:1:helm:Iron Helm~ I:2:soft armour:Robe~ I:4:soft armour:Soft Leather Armour~ I:2:soft armour:Studded Leather Armour~ I:2:soft armour:Hard Leather Armour~ I:2:soft armour:Leather Scale Mail~ I:1:hard armour:Metal Scale Mail~ I:1:hard armour:Chain Mail~ I:2:cloak:Cloak~ I:2:gloves:Set~ of Leather Gloves I:1:gloves:Set~ of Gauntlets I:2:shield:Wicker Shield~ I:1:shield:Small Metal Shield~ I:2:shield:Leather Shield~ # Weaponsmith S:3:33 I:1:sword:Dagger~ I:1:sword:Main Gauche~ I:1:sword:Rapier~ I:2:sword:Short Sword~ I:2:sword:Cutlass~ I:1:sword:Tulwar~ I:1:sword:Broad Sword~ I:1:sword:Long Sword~ I:1:sword:Scimitar~ I:1:sword:Katana~ I:1:sword:Bastard Sword~ I:1:polearm:Spear~ I:1:polearm:Awl-Pike~ I:1:polearm:Trident~ I:1:polearm:Pike~ I:1:polearm:Beaked Axe~ I:1:polearm:Broad Axe~ I:1:polearm:Battle Axe~ I:1:polearm:Lance~ I:1:polearm:Lucerne Hammer~ I:1:hafted:Whip~ I:1:bow:Sling~ I:1:bow:Short Bow~ I:1:bow:Long Bow~ I:1:bow:Light Crossbow~ I:2:shot:Iron Shot~ I:2:arrow:Arrow~ I:2:bolt:Bolt~ # Temple S:4:24 I:1:hafted:Whip~ I:1:hafted:Quarterstaff~ I:2:hafted:Mace~ I:1:hafted:Ball-and-Chain~ I:1:hafted:War Hammer~ I:1:hafted:Morning Star~ I:2:hafted:Flail~ I:1:hafted:Lead-Filled Mace~ I:1:scroll:Remove Curse I:1:scroll:Blessing I:1:scroll:Holy Chant I:1:scroll:Light I:1:potion:Boldness I:1:potion:Heroism I:3:prayer book:[Beginners Handbook] I:2:prayer book:[Words of Wisdom] I:2:prayer book:[Chants and Blessings] I:1:prayer book:[Exorcism and Dispelling] # Alchemist S:5:36 I:4:scroll:Word of Recall I:4:scroll:Identify I:3:scroll:Phase Door I:1:scroll:Monster Confusion I:1:scroll:Magic Mapping I:2:scroll:Treasure Detection I:1:scroll:Trap Detection I:1:scroll:Door/Stair Location I:1:scroll:Detect Invisible I:1:scroll:Recharging I:1:scroll:Satisfy Hunger I:1:potion:Resist Heat I:1:potion:Resist Cold I:3:potion:Restore Life Levels I:1:potion:Neutralize Poison I:2:potion:Cure Light Wounds I:4:potion:Cure Serious Wounds I:4:potion:Cure Critical Wounds # Magic-user's S:6:29 I:1:ring:Searching I:1:ring:Feather Falling I:1:ring:Protection I:1:amulet:Charisma I:1:amulet:Slow Digestion I:1:amulet:Resist Acid #I:1:rod:Trap Location #I:1:rod:Door/Stair Location #I:2:rod:Treasure Location I:1:wand:Slow Monster I:1:wand:Confuse Monster I:1:wand:Sleep Monster I:1:wand:Magic Missile I:1:wand:Stinking Cloud I:1:wand:Wonder I:2:staff:Teleportation I:2:staff:Identify I:1:staff:Light I:1:staff:Mapping I:1:staff:Detect Invisible I:1:staff:Detect Evil I:3:magic book:[Magic for Beginners] I:2:magic book:[Conjurings and Tricks] I:2:magic book:[Incantations and Illusions] I:1:magic book:[Sorcery and Evocations] angband-v3.3.2/lib/edit/object_base.txt0000644000175000017500000000253211651552410017305 0ustar chriscchrisc# D: lines are default values # N: tvalname # B: breakage chance when thrown # F: default flags D:B:10 N:spike:Spike~ B:25 N:chest:Chest~ F:HATES_ACID | HATES_FIRE N:shot:Shot~ B:25 F:SHOW_DICE | SHOW_MODS N:arrow:Arrow~ B:35 F:HATES_ACID | HATES_FIRE F:SHOW_DICE | SHOW_MODS N:bolt:Bolt~ B:25 F:HATES_ACID F:SHOW_DICE | SHOW_MODS N:bow:Bow~ F:HATES_ACID | HATES_FIRE F:SHOW_MULT | SHOW_MODS N:digger:Digger~ F:SHOW_DICE | SHOW_MODS N:hafted:Hafted weapon~ F:HATES_ACID | HATES_FIRE F:SHOW_DICE | SHOW_MODS N:polearm:Polearm~ F:HATES_ACID | HATES_FIRE F:SHOW_DICE | SHOW_MODS N:sword:Bladed weapon~ F:HATES_ACID F:SHOW_DICE | SHOW_MODS N:boots:Boot~ F:HATES_ACID | HATES_FIRE N:gloves:Glove~ F:HATES_ACID | HATES_FIRE N:helm:Helm~ F:HATES_ACID N:crown:Crown~ F:HATES_ACID N:shield:Shield~ F:HATES_ACID N:cloak:Cloak~ F:HATES_ACID | HATES_FIRE N:soft armor:Soft Armor~ F:HATES_ACID | HATES_FIRE N:hard armor:Hard Armor~ F:HATES_ACID N:dragon armor:Dragon Armor~ N:light:Light~ B:50 F:HATES_FIRE N:amulet:Amulet~ N:ring:Ring~ F:HATES_ELEC N:staff:Staff~ F:HATES_ACID | HATES_FIRE N:wand:Wand~ F:HATES_ELEC N:rod:Rod~ F:HATES_ELEC N:scroll:Scroll~ F:HATES_ACID | HATES_FIRE N:potion:Potion~ B:100 F:HATES_COLD N:flask:Flask~ B:100 F:HATES_COLD N:food:Food B:100 N:magic book:Magic Book~ F:HATES_FIRE N:prayer book:Prayer Book~ F:HATES_FIRE angband-v3.3.2/lib/edit/monster_base.txt0000644000175000017500000001303011651552410017521 0ustar chriscchrisc# This file provides information for monster "templates". # # N : template name # G : default display character # M : pain message index # F : flag | flag | ... # S : spell flag | spell flag | ... # D : description # # 'N' indicates the beginning of an entry. The template name is used in monster.txt. # # 'G' indicates the default display character. This is used for displaying the # monster in ASCII mode, and also for determining which monsters are # of the same "type" for things like the ESCORT flag or the S_KIN summon. # # 'M' indicates which set of "pain messages" (from pain.txt) is used. # # 'F' indicates the flags that every monster inherits from this template. # # 'S' indicates the spell flags that every monster inherits from this template. # # 'D' indicates the textual description of this template that is used by # the '/' command in-game. # # Note that some templates have hardcoded references. In particular, changing # the name of the following templates will cause certain summon spells to break: # ancient dragon, angel, canine, hydra, lich, major demon, spider, vampire, wraith, zephyr hound. # Changing other characteristics of these monsters is fine. ##### Normal monster templates ##### N:ancient dragon G:D M:1 F:DRAGON | EVIL | POWERFUL | SMART F:DROP_4 F:MOVE_BODY F:NO_CONF | NO_SLEEP F:FORCE_SLEEP D:Ancient Dragon/Wyrm N:angel G:A M:1 F:POWERFUL F:ONLY_ITEM F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM F:IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP D:Angel N:ant G:a M:7 F:ANIMAL | WEIRD_MIND F:BASH_DOOR D:Ant N:bat G:b M:4 F:ANIMAL D:Bat N:bird G:B M:8 F:ANIMAL D:Bird N:canine G:C M:3 F:ANIMAL D:Canine (Dog) N:centipede G:c M:5 F:ANIMAL | WEIRD_MIND D:Centipede N:creeping coins G:$ M:1 F:COLD_BLOOD | METAL | UNAWARE | EMPTY_MIND F:ONLY_GOLD F:BASH_DOOR F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP D:Creeping Coins N:dragon G:d M:1 F:DRAGON | EVIL F:FORCE_SLEEP D:Dragon N:dragon fly G:F M:7 F:ANIMAL | WEIRD_MIND F:RAND_50 | BASH_DOOR F:FORCE_SLEEP D:Dragon Fly N:eye G:e M:1 D:Floating Eye N:elemental G:E M:1 F:EMPTY_MIND F:IM_POIS | NO_FEAR | NO_CONF | NO_SLEEP F:NONLIVING D:Elemental N:feline G:f M:6 F:ANIMAL D:Feline (Cat) N:ghost G:G M:1 F:UNDEAD | EVIL | INVISIBLE | COLD_BLOOD F:PASS_WALL F:NO_CONF | NO_SLEEP D:Ghost N:giant G:P M:1 F:GIANT | EVIL F:BASH_DOOR S:BOULDER D:Giant Humanoid N:golem G:g M:1 F:EMPTY_MIND F:IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP F:NONLIVING D:Golem N:humanoid G:h M:1 F:OPEN_DOOR | BASH_DOOR D:Hobbit/Elf/Dwarf N:hybrid G:H M:1 D:Hybrid N:hydra G:M M:4 F:ANIMAL F:ONLY_GOLD F:BASH_DOOR F:FORCE_SLEEP | HURT_COLD D:Hydra N:icky thing G:i M:2 F:RAND_50 D:Icky Thing N:insect G:I M:7 F:ANIMAL | WEIRD_MIND | MULTIPLY F:RAND_25 | RAND_50 D:Insect N:jelly G:j M:2 F:EMPTY_MIND | STUPID F:NO_FEAR D:Jelly N:killer beetle G:K M:7 F:ANIMAL | WEIRD_MIND F:BASH_DOOR D:Killer Beetle N:kobold G:k M:1 F:EVIL F:OPEN_DOOR | BASH_DOOR F:IM_POIS D:Kobold N:lich G:L M:1 F:UNDEAD | EVIL | COLD_BLOOD | SMART F:OPEN_DOOR | BASH_DOOR F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:BRAIN_SMASH D:Lich N:louse G:l M:7 F:ANIMAL | WEIRD_MIND | MULTIPLY F:RAND_50 D:Louse N:lurker G:. M:1 F:COLD_BLOOD | EMPTY_MIND | INVISIBLE | UNAWARE F:NEVER_MOVE F:NO_FEAR | NO_CONF | NO_SLEEP F:CHAR_CLEAR | ATTR_CLEAR D:Lurker N:major demon G:U M:1 F:DEMON | EVIL F:ONLY_ITEM F:OPEN_DOOR | BASH_DOOR F:NO_CONF | NO_SLEEP F:FORCE_SLEEP D:Major Demon N:mimic G:? M:1 F:COLD_BLOOD | EMPTY_MIND | UNAWARE F:NEVER_MOVE F:NO_FEAR | NO_CONF | NO_SLEEP F:FORCE_SLEEP | ATTR_CLEAR S:BLIND | CAUSE_2 | CONF | SCARE D:Mimic N:minor demon G:u M:1 F:DEMON | EVIL F:IM_FIRE D:Minor Demon N:mold G:m M:2 F:NEVER_MOVE F:IM_POIS | HURT_FIRE | NO_FEAR | NO_CONF | NO_SLEEP D:Mold N:mushroom G:, M:2 F:EMPTY_MIND | STUPID F:HURT_FIRE | NO_FEAR | NO_CONF | NO_SLEEP D:Mushroom N:naga G:n M:1 F:FEMALE | EVIL | HURT_COLD F:BASH_DOOR D:Naga N:ogre G:O M:1 F:GIANT | EVIL F:OPEN_DOOR | BASH_DOOR D:Ogre N:orc G:o M:1 F:MALE | ORC | EVIL F:OPEN_DOOR | BASH_DOOR D:Orc N:person G:p M:1 F:BASH_DOOR D:Person/Human N:quadruped G:q M:4 F:BASH_DOOR D:Quadruped N:quylthulg G:Q M:2 F:ANIMAL | EMPTY_MIND | INVISIBLE F:NEVER_BLOW | NEVER_MOVE F:NO_FEAR | NO_CONF | NO_SLEEP F:FORCE_SLEEP D:Quylthulg N:reptile G:R M:5 F:ANIMAL | HURT_COLD D:Reptile/Amphibian N:rodent G:r M:4 F:ANIMAL D:Rodent N:skeleton G:s M:9 F:UNDEAD | EVIL | COLD_BLOOD F:IM_COLD | IM_POIS | NO_FEAR | NO_CONF | NO_SLEEP D:Skeleton N:snake G:J M:5 F:ANIMAL | HURT_COLD F:BASH_DOOR D:Snake N:spider G:S M:7 F:BASH_DOOR D:Spider/Scorpion/Tick N:townsfolk G:t M:4 D:Townsfolk N:troll G:T M:1 F:TROLL | EVIL F:OPEN_DOOR | BASH_DOOR D:Troll N:vampire G:V M:1 F:UNDEAD | EVIL | COLD_BLOOD | REGENERATE F:OPEN_DOOR | BASH_DOOR F:HURT_LIGHT | HURT_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP F:FORCE_SLEEP S:HOLD | SCARE D:Vampire N:vortex G:v M:11 F:EMPTY_MIND | POWERFUL F:RAND_50 | BASH_DOOR F:NO_FEAR | NO_CONF | NO_SLEEP F:FORCE_SLEEP F:NONLIVING D:Vortex N:worm G:w M:1 F:ANIMAL D:Worm/Worm Mass N:wraith G:W M:1 F:UNDEAD | EVIL | COLD_BLOOD F:HURT_LIGHT | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP D:Wight/Wraith N:xorn G:X M:4 F:COLD_BLOOD | EMPTY_MIND F:HURT_ROCK | IM_POIS | NO_CONF | NO_SLEEP D:Xorn/Xaren N:yeek G:y M:1 F:ANIMAL F:OPEN_DOOR | BASH_DOOR F:IM_ACID D:Yeek N:yeti G:Y M:1 F:ANIMAL F:OPEN_DOOR | BASH_DOOR F:IM_COLD D:Yeti N:zephyr hound G:Z M:3 F:ANIMAL | FRIENDS D:Zephyr Hound N:zombie G:z M:10 F:UNDEAD | EVIL | COLD_BLOOD F:OPEN_DOOR | BASH_DOOR F:IM_COLD | IM_POIS | HURT_FIRE | NO_CONF | NO_SLEEP D:Zombie/Mummy ##### Special templates ##### N:player G:@ M:1 D:You N:Morgoth G:P M:12 D:Morgothangband-v3.3.2/lib/edit/object.txt0000644000175000017500000014316711651552410016325 0ustar chriscchrisc# File: object.txt # # This file is used to initialize the "object kind" information for Angband. # Modifying this file when you don't know what you're doing may be harmful # to you or your character's health. It could possibly be considered cheating # under some circumstances, too. :) # === Understanding object.txt === # N: serial number : & object name~ # G: symbol : color # I: tval : sval # W: depth : rarity : weight : cost # P: base armor class : base damage : plus to-hit : plus to-dam : plus to-ac # A: commonness : min " to " max # C: charges # M: chance of being generated in a pile : dice for number of items # E: effect when used : recharge time (if applicable) # F: flag | flag | etc. # L: pval : flag | flag | etc. # D: description # Some fields accept randomized numbers of the form "10+2d3M4" where # 10 is the non-variable base, 2d3 is a standard die roll, and # M4 uses the m_bonus function to generate a number between 0 and # 4 according to a normal distribution. All three components are # optional, and the number of dice is optional and assumed to be 1 # when not specified. 10+2d3M4 has the range 12-20. 10+M4 has the # range 10-14. 10+2d3 has the range 12-16. 10+d3 has the range 11-13. # 2d3, d3, M4, 2d3M4, and d3M4 are all acceptable as well. # 'N' indicates the beginning of an entry. The serial number must # increase for each new item. The '&' and '~' symbols are use to # include articles and pluralization as necessary to ensure # grammatical correctness in object descriptions. # # For non-English and irregular plurals, the '|' symbol may be used # instead, as in "|singular|plural|". The part between the first and # second | symbol is used for singular, and the part between the second # and third | for plural. The number of | symbols in the name must # always be a multiple of 3. # 'G' is for graphics - symbol and color. There are 15 colors, as # follows: # D - Dark Gray w - White s - Gray o - Orange # r - Red g - Green b - Blue u - Brown # W - Light Gray v - Violet y - Yellow R - Light Red # G - Light Green B - Light Blue U - Light Brown # Another color, "d", is used for "flavoured" items. # 'I' is for basic information. The tval is for the type of item, the # sval identifies the subtype. # 'W' is for extra information. Depth defines what "level" the object is, # when determining how easy it is to use a wand, staff or rod; rarity # is unused; weight is in tenth-pounds and cost is the item's base value. # N.B. Even where the cost field is not used to determine price (e.g. for # rings and amulets), it is still used to determine whether it is squelched # by the squelch_worthless option. # 'P' is for power information. The items base armor class, its base # damage and pluses to-hit, to-dam and to-ac. The latter three numbers # accept randomized values. # 'A' is for allocation - depth and rarity, in pairs. It is used to # ensure that certain vital items such as food and identify scrolls # are found throughout the dungeon. The "allocation" depth need not # match the depth as specified in the "W:" line. # 'C' is for charges (wands and staves only). This field accepts # randomized values. # 'F' is for flags not associated with any pval. These are fairly # self-explanatory. As many F: lines may be used as are needed to # specify all the flags and flags are separated by the '|' symbol. # 'L' is for pval and flags specific to that pval. Each pval and its flags # need a line to themselves. MAX_PVALS is defined in src/defines.h - you # will need to recompile if you wish to change this value. A pval can # take a random value. # 'D' is for description. As many D: lines may be used as are needed # to describe the object. Note that lines will need spaces at their # ends or the beginning of the next line to prevent words from running # together. # Version stamp (required) V:3.3.1 ##### Non-kind (contains the "pile" picture) ##### N:0: I:0:0 G:&:w ##### Various Stuff ##### N:1:& Iron Spike~ G:~:W I:5:0 W:1:0:2:1 M:100:6d7 A:20:1 to 40 P:0:1d1:0:0:0 F:EASY_KNOW D:These can be placed in doors to make them harder to open. Multiple D: spikes may be used on a single door. Each of the first 7 spikes will D: increase the door's resistance to bashing. Placing more than 7 D: spikes in one door will not have any further effect. N:2:& Wooden Torch~ G:~:u I:39:0 W:1:0:12:2 A:70:1 to 40 P:0:1d1:0:0:0 F:EASY_KNOW N:3:& Lantern~ G:~:U I:39:1 W:3:0:50:35 A:70:5 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_FIRE N:4:& Flask~ of oil G:!:y I:77:0 W:1:0:10:3 A:50:1 to 100 P:0:1d4:0:0:0 F:EASY_KNOW | BRAND_FIRE L:7500 D:It can be used to fuel a lantern with 7500 turns of light, up to D: a maximum of 15000 turns of light. D: When thrown, it is considered lit, so it does more than nominal D: damage (which occurs even against creatures resistant to fire). ##### Food ##### ### Normal Food ### N:10:& Ration~ of Food G:,:U I:80:1 W:0:0:8:3 A:40:0 to 50 M:100:1d5 F:EASY_KNOW E:FOOD_GOOD L:6000 D:This nutritious but fairly bland food is familiar to anyone contemplating D: long journeys. N:11:& Slime Mold~ G:,:g I:80:2 W:1:0:2:2 A:40:5 to 60 M:100:2d3 F:EASY_KNOW E:FOOD_GOOD L:2500 D:A strange fungal growth, prone to moving if not observed. Not very tasty D: but quite filling. N:12:& Piece~ of Elvish Waybread G:,:B I:80:3 W:5:0:3:10 A:40:30 to 100 F:EASY_KNOW E:FOOD_WAYBREAD L:7500 D:Food of the elves is always good; their waybread is no exception. These D: thin cakes are wrapped in leaves and keep their tastiness for months. # 13 # 14 # 15 ### The shrooms, an interesting collection ### N:16:Second Sight G:,:d I:80:6 W:0:0:1:200 A:10:1 to 100 F:EASY_KNOW E:TMD_ESP L:200 N:17:Fast Recovery G:,:d I:80:7 W:0:0:1:200 A:10:1 to 40 M:70:1d4 F:EASY_KNOW E:CURE_BODY L:500 N:18:Vigor G:,:d I:80:8 W:0:0:1:200 A:10:1 to 100 F:EASY_KNOW E:RESTORE_ALL L:500 N:19:Clear Mind G:,:d I:80:9 W:0:0:1:200 A:10:1 to 40 M:100:1d4 F:EASY_KNOW E:CURE_MIND L:500 N:20:Emergency G:,:d I:80:10 W:0:0:1:60 A:10:1 to 100 M:100:1d4 F:EASY_KNOW E:SHROOM_EMERGENCY L:500 N:21:Terror G:,:d I:80:11 W:0:0:1:60 A:10:1 to 40 M:100:1d4 F:EASY_KNOW E:SHROOM_TERROR L:500 N:22:Stoneskin G:,:d I:80:12 W:0:0:1:60 A:10:1 to 40 M:70:1d4 F:EASY_KNOW E:SHROOM_STONE L:500 D:Its poison turns your skin to stone, albeit briefly. N:23:Turbulence G:,:d I:80:13 W:0:0:1:60 #A:10:1 to 100 M:70:1d4 F:EASY_KNOW #E:SHROOM_TURB L:500 N:24:Debility G:,:d I:80:14 W:0:0:1:20 A:10:1 to 40 M:70:1d4 F:EASY_KNOW E:SHROOM_DEBILITY L:500 N:25:Sprinting G:,:d I:80:15 W:0:0:1:100 A:1:10 to 100 M:70:1d4 F:EASY_KNOW E:SHROOM_SPRINTING L:500 N:26:Purging G:,:d I:80:16 W:0:0:1:60 A:1:10 to 100 M:70:1d4 F:EASY_KNOW E:SHROOM_PURGING ##### Weapons ##### ### Swords ### N:30:& Dagger~ G:|:W I:23:1 W:0:0:12:30 A:20:0 to 100 P:0:1d4:0:0:0 D:A short two-edged blade perfect for thrusting. N:31:& Main Gauche~ G:|:W I:23:2 W:3:0:30:45 A:20:3 to 100 P:0:1d5:0:0:0 N:32:& Rapier~ G:|:W I:23:3 W:5:0:40:70 A:20:5 to 100 P:0:1d6:0:0:0 N:33:& Short Sword~ G:|:W I:23:4 W:5:0:80:90 A:20:5 to 100 P:0:1d7:0:0:0 N:34:& Cutlass~ G:|:W I:23:5 W:5:0:110:120 A:20:5 to 100 P:0:1d8:0:0:0 D:A thicker and slightly longer dagger, the cutlass is a slashing sword. It D: possesses a slight curve and only one side is sharp. N:35:& Tulwar~ G:|:W I:23:6 W:5:0:100:170 A:20:5 to 100 P:0:2d4:0:0:0 D:A wider-bladed cousin of the shamshir, with less of a curve. N:36:& Scimitar~ G:|:W I:23:7 W:10:0:150:300 A:20:10 to 100 P:0:4d2:0:0:0 D:A long sabre with an extreme curve to the blade. N:37:& Long Sword~ G:|:W I:23:8 W:10:0:130:300 A:20:10 to 100 P:0:2d5:0:0:0 N:38:& Broad Sword~ G:|:W I:23:9 W:10:0:150:300 A:20:10 to 100 P:0:2d5:0:0:0 N:39:& Bastard Sword~ G:|:W I:23:10 W:15:0:140:400 A:20:15 to 100 P:0:3d4:0:0:0 N:40:& Katana~ G:|:W I:23:11 W:20:0:120:600 A:20:20 to 100 P:0:3d5:0:0:0 N:41:& Zweihander~ G:|:W I:23:12 W:30:0:200:700 A:20:30 to 100 P:0:3d6:0:0:0 D:A sword requring two hands to wield. N:42:& Executioner's Sword~ G:|:r I:23:13 W:40:0:260:850 A:20:40 to 100 P:0:4d5:0:0:0 N:43:& Blade~ of Chaos G:|:v I:23:14 W:70:0:180:4000 A:10:70 to 100 P:0:6d5:0:0:0 F:RES_CHAOS ### Whips ### N:50:& Whip~ G:\:D I:21:1 W:3:0:30:30 A:20:3 to 100 P:0:1d3:0:0:0 N:51:& Ball-and-Chain~ G:\:D I:21:2 W:20:0:150:200 A:20:20 to 100 P:0:2d4:0:0:0 N:52:& Morning Star~ G:\:D I:21:3 W:10:0:150:396 A:20:10 to 100 P:0:2d6:0:0:0 N:53:& Flail~ G:\:D I:21:4 W:10:0:150:353 A:20:10 to 100 P:0:2d6:0:0:0 N:54:& Two-Handed Great Flail~ G:\:y I:21:5 W:45:0:280:590 A:20:45 to 100 P:0:3d6:0:0:0 ### Clubs ### N:55:& Mace~ G:\:D I:21:10 W:5:0:120:130 A:20:5 to 100 P:0:2d4:0:0:0 N:56:& Lead-Filled Mace~ G:\:D I:21:11 W:15:0:180:502 A:20:15 to 100 P:0:4d3:0:0:0 N:57:& Quarterstaff~ G:\:U I:21:12 W:10:0:150:200 A:20:10 to 100 P:0:1d9:0:0:0 N:58:& War Hammer~ G:\:D I:21:13 W:5:0:120:225 A:20:5 to 100 P:0:3d3:0:0:0 N:59:& Maul~ G:\:D I:21:14 W:5:0:200:130 A:20:5 to 100 P:0:4d4:0:0:0 N:60:& Great Hammer~ G:\:D I:21:15 W:5:0:180:500 A:20:20 to 100 P:0:8d1:0:0:0 N:61:& Mace~ of Disruption G:\:v I:21:20 W:80:0:400:4300 A:10:80 to 100 P:0:5d8:0:0:0 F:SLAY_UNDEAD ### Spears ### N:65:& Spear~ G:/:s I:22:1 W:5:0:50:36 A:20:5 to 100 P:0:1d6:0:0:0 N:66:& Awl-Pike~ G:/:s I:22:2 W:10:0:160:340 A:20:10 to 100 P:0:1d8:0:0:0 N:67:& Trident~ G:/:y I:22:3 W:5:0:70:120 A:20:5 to 100 P:0:1d10:0:0:0 N:68:& Halberd~ G:/:s I:22:4 W:25:0:190:430 A:20:25 to 100 P:0:3d5:0:0:0 N:69:& Pike~ G:/:s I:22:5 W:15:0:160:358 A:20:15 to 100 P:0:2d5:0:0:0 ### Axes ### N:70:& Beaked Axe~ G:/:s I:22:10 W:15:0:180:408 A:20:15 to 100 P:0:2d6:0:0:0 N:71:& Broad Axe~ G:/:s I:22:11 W:15:0:160:304 A:20:15 to 100 P:0:2d6:0:0:0 N:72:& Battle Axe~ G:/:s I:22:12 W:15:0:170:334 A:20:15 to 100 P:0:2d8:0:0:0 N:73:& Lochaber Axe~ G:/:D I:22:13 W:45:0:250:750 A:20:45 to 100 P:0:3d8:0:0:0 N:74:& Great Axe~ G:/:s I:22:14 W:40:0:230:500 A:20:40 to 100 P:0:4d4:0:0:0 ### Other misc polearms ### N:75:& Scythe~ G:/:s I:22:20 W:45:0:250:800 A:20:45 to 100 P:0:5d3:0:0:0 N:76:& Glaive~ G:/:s I:22:21 W:20:0:190:363 A:20:20 to 100 P:0:2d6:0:0:0 N:77:& Lance~ G:/:s I:22:22 W:10:0:300:230 A:20:10 to 100 P:0:2d8:0:0:0 N:78:& Scythe~ of Slicing G:/:r I:22:23 W:60:0:250:3500 A:10:60 to 100 P:0:8d4:0:0:0 N:79:& Lucerne Hammer~ G:/:B I:22:24 W:10:0:120:376 A:20:10 to 100 P:0:2d5:0:0:0 ##### Bows, Crossbows, Slings ##### N:90:& Sling~ G:}:u I:19:2 W:1:0:5:5 A:20:1 to 100 N:91:& Short Bow~ G:}:U I:19:12 W:3:0:30:50 A:20:3 to 100 N:92:& Long Bow~ G:}:U I:19:13 W:10:0:40:120 A:20:10 to 100 N:93:& Light Crossbow~ G:}:s I:19:23 W:15:0:110:140 A:20:15 to 100 N:94:& Heavy Crossbow~ G:}:s I:19:24 W:30:0:200:300 A:20:30 to 100 ##### Missiles ##### N:100:& Arrow~ G:{:U I:17:1 W:3:0:2:1 M:100:6d7 A:30:3 to 100 P:0:1d4:0:0:0 D:It can be shot with a bow. N:101:& Seeker Arrow~ G:{:G I:17:2 W:55:0:2:20 A:25:55 to 100 M:100:6d7 P:0:4d4:0:0:0 D:It can be shot with a bow. N:102:& Mithril Arrow~ G:{:B I:17:3 W:55:0:2:25 M:100:6d7 A:20:50 to 100 P:0:3d4:0:0:0 F:IGNORE_ACID | IGNORE_FIRE D:It can be shot with a bow. N:105:& Bolt~ G:{:s I:18:1 W:3:0:3:2 M:100:6d7 A:30:3 to 100 P:0:1d5:0:0:0 D:It can be shot with a crossbow. N:106:& Seeker Bolt~ G:{:g I:18:2 W:65:0:3:25 M:100:6d7 A:25:65 to 100 P:0:4d5:0:0:0 D:It can be shot with a crossbow. N:107:& Mithril Bolt~ G:{:B I:18:3 W:50:0:2:30 M:100:6d7 A:20:60 to 100 P:0:3d5:0:0:0 F:IGNORE_ACID D:It can be shot with a crossbow. N:110:& Rounded Pebble~ G:{:s I:16:0 W:0:0:4:1 M:100:6d7 A:30:0 to 100 P:0:1d2:0:0:0 D:It can be shot with a sling. N:111:& Iron Shot~ G:{:s I:16:1 W:3:0:5:2 M:100:6d7 A:25:3 to 100 P:0:1d4:0:0:0 D:It can be shot with a sling. N:112:& Mithril Shot~ G:{:B I:16:2 W:40:0:4:20 M:100:6d7 A:20:40 to 100 P:0:2d4:5:5:0 F:IGNORE_ACID D:It can be shot with a sling. ##### Digging Tools ##### N:120:& Shovel~ G:\:s I:20:1 W:1:0:60:10 A:20:5 to 100 P:0:1d2:0:0:0 L:1:TUNNEL N:121:& Pick~ G:\:g I:20:2 W:30:0:180:300 A:20:30 to 100 P:0:1d3:0:0:0 L:2:TUNNEL N:122:& Mattock~ G:\:D I:20:3 W:50:0:250:700 A:20:50 to 100 P:0:1d8:0:0:0 L:3:TUNNEL ##### Armor ##### N:130:& Pair~ of Leather Sandals G:]:U I:30:1 W:0:0:15:4 A:20:1 to 100 P:1:1d1:0:0:0 D:A set of open-topped footgear with soft calfskin lacings and a sturdy D:cured leather base. N:131:& Pair~ of Leather Boots G:]:U I:30:2 W:3:0:20:7 A:20:3 to 100 P:2:1d1:0:0:0 N:132:& Pair~ of Iron Shod Boots G:]:U I:30:3 W:5:0:35:12 A:20:5 to 100 P:4:1d1:0:0:0 F:IGNORE_FIRE N:133:& Pair~ of Steel Shod Boots G:]:s I:30:4 W:20:0:60:50 A:20:20 to 100 P:7:1d1:0:0:0 F:IGNORE_FIRE N:134:& Pair~ of Mithril Shod Boots G:]:B I:30:5 W:60:0:40:500 A:20:60 to 100 P:8:1d1:0:0:0 F:IGNORE_ACID | IGNORE_FIRE N:135:& Pair~ of Ethereal Slippers G:]:U I:30:6 W:0:0:0:4 A:10:30 to 100 P:0:0d0:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD ### Headgear ### N:140:& Hard Leather Cap~ G:]:u I:32:2 W:3:0:20:12 A:20:3 to 100 P:2:0d0:0:0:0 N:141:& Metal Cap~ G:]:s I:32:3 W:10:0:25:30 A:20:10 to 100 P:3:1d1:0:0:0 N:142:& Iron Helm~ G:]:s I:32:5 W:20:0:50:75 A:20:20 to 100 P:7:1d3:0:0:0 N:143:& Steel Helm~ G:]:W I:32:6 W:40:0:60:200 A:20:40 to 100 P:9:1d3:0:0:0 N:144:& Iron Crown~ G:]:s I:33:10 W:45:0:20:500 A:20:45 to 100 P:0:1d1:0:0:0 N:145:& Golden Crown~ G:]:y I:33:11 W:45:0:30:1000 A:10:45 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID N:146:& Jewel Encrusted Crown~ G:]:v I:33:12 W:50:0:40:2000 A:10:50 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID ### Body armours ### N:150:& Robe~ G:(:b I:36:2 W:1:0:20:4 A:20:1 to 100 P:2:0d0:0:0:0 N:151:Soft Leather Armour~ G:(:U I:36:4 W:3:0:80:20 A:20:3 to 100 P:8:0d0:0:0:0 N:152:Studded Leather Armour~ G:(:U I:36:7 W:10:0:100:100 A:20:5 to 100 P:12:1d1:-1:0:0 N:153:Hard Leather Armour~ G:(:U I:36:6 W:5:0:120:150 A:20:10 to 100 P:16:1d2:-1:0:0 N:154:Leather Scale Mail~ G:(:U I:36:11 W:15:0:140:370 A:20:15 to 100 P:20:1d1:-1:0:0 N:155:Metal Scale Mail~ G:[:s I:37:1 W:25:0:250:550 A:20:25 to 100 P:38:1d4:-2:0:0 N:156:Chain Mail~ G:[:s I:37:2 W:25:0:220:750 A:20:20 to 100 P:32:1d4:-2:0:0 N:157:Augmented Chain Mail~ G:[:s I:37:3 W:30:0:270:900 A:20:35 to 100 P:42:1d4:-2:0:0 N:158:Bar Chain Mail~ G:[:s I:37:4 W:35:0:280:950 A:20:40 to 100 P:45:1d4:-2:0:0 N:159:Metal Brigandine Armour~ G:[:s I:37:5 W:35:0:290:1100 A:20:45 to 100 P:48:1d4:-3:0:0 N:160:Partial Plate Armour~ G:[:W I:37:6 W:45:0:260:1200 A:20:30 to 100 P:40:1d6:-3:0:0 N:161:Metal Lamellar Armour~ G:[:W I:37:7 W:45:0:340:1250 A:20:50 to 100 P:58:1d6:-3:0:0 N:162:Full Plate Armour~ G:[:W I:37:8 W:45:0:360:1350 A:15:55 to 100 P:62:2d4:-3:0:0 N:163:Ribbed Plate Armour~ G:[:W I:37:9 W:50:0:380:1500 A:15:60 to 100 P:66:2d4:-3:0:0 N:164:Mithril Chain Mail~ G:[:B I:37:10 W:55:0:150:7000 A:10:55 to 100 P:28:1d4:-1:0:0 F:IGNORE_ACID N:165:Mithril Plate Mail~ G:[:B I:37:11 W:60:0:300:15000 A:10:65 to 100 P:60:2d4:-3:0:0 F:IGNORE_ACID N:166:Adamantite Plate Mail~ G:[:G I:37:12 W:75:0:420:20000 A:10:75 to 100 P:80:2d4:-4:0:0 F:IGNORE_ACID ### The Cloaks ### N:170:& Cloak~ G:(:g I:35:1 W:1:0:10:3 A:20:1 to 100 P:1:0d0:0:0:0 D:A traveller's sturdy outer garment. N:171:& Fur Cloak~ G:(:o I:35:2 W:1:0:25:600 A:20:20 to 100 P:3:0d0:0:0:0 D:A heavy cloak made from fur and lined with leather; a luxury. N:172:& Elven Cloak~ G:(:D I:35:3 W:60:0:5:2000 A:8:40 to 100 P:6:0d0:0:0:0 L:2:STEALTH L:1:SPEED D:A mantle made of curious silken material by the Galadrim that wondrously D:takes on the hues and shapes of its surroundings. N:173:& Ethereal Cloak~ G:(:W I:35:4 W:50:0:0:4500 A:10:70 to 100 P:0:0d0:0:0:10 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD D:This unearthly, completely transparent body mantle folds and drapes in D:iridescent patterns around you. It weighs absolutely nothing. ### The Gloves ### N:174:& Set~ of Leather Gloves G:]:U I:31:1 W:0:0:10:5 A:20:1 to 100 P:1:0d0:0:0:0 N:175:& Set~ of Gauntlets G:]:s I:31:2 W:0:0:25:45 A:20:10 to 100 P:3:1d1:0:0:0 N:176:& Set~ of Mithril Gauntlets G:]:B I:31:3 W:0:0:25:700 A:20:40 to 100 P:6:1d1:0:0:0 F:IGNORE_ACID | IGNORE_FIRE N:177:& Set~ of Caestus G:]:U I:31:4 W:0:0:40:100 A:10:20 to 100 P:5:1d1:0:3:0 D:An ancient battle glove designed for hand-to-hand fighting. Its layered D: leather thongs are enhanced for combat by bloody-looking spikes. N:178:& Set~ of Alchemist's Gloves G:]:R I:31:5 W:0:0:5:500 A:10:50 to 100 P:0:1d1:0:0:2 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:SPELLS_OK D:Highly protective gloves designed for an alchemist's elemental magics. #N:179:& Set~ of Mining Gloves #G:]:U #I:31:6 #W:0:0:5:500 #A:10:50 to 100 #P:0:1d1:0:0:2 #L:1d3:TUNNEL ### The shields ### #N:180:& Buckler~ #G:):U #I:34:1 #W:3:0:20:30 #A:100:3 to 100 #P:1:1d1:0:0:0 #D:A small round shield designed to be useful in deflecting enemy swords. N:181:& Wicker Shield~ G:):U I:34:2 W:1:0:30:20 A:20:1 to 100 P:2:1d1:0:0:0 D:A light circular frame of wood surrounding fine-grained wickerwork. N:182:& Small Metal Shield~ G:):s I:34:3 W:10:0:60:80 A:20:15 to 100 P:5:1d2:0:0:0 N:183:& Leather Shield~ G:):U I:34:4 W:15:0:90:200 A:20:10 to 100 P:8:1d3:0:0:0 N:184:& Large Metal Shield~ G:):s I:34:5 W:30:0:120:500 A:20:30 to 100 P:12:1d5:0:0:0 N:185:& Mithril Shield~ G:):B I:34:10 W:70:0:100:10000 A:10:70 to 100 P:16:1d4:0:0:10 F:IGNORE_ACID ##### Rings ##### ### Stat rings ### N:190:Strength G:=:d I:45:1 W:30:0:2:500 A:50:30 to 100 F:SUST_STR | HIDE_TYPE L:1+M5:STR N:191:Intelligence G:=:d I:45:2 W:30:0:2:500 A:50:30 to 100 F:SUST_INT | HIDE_TYPE L:1+M5:INT N:192:Dexterity G:=:d I:45:3 W:30:0:2:500 A:50:30 to 100 F:SUST_DEX | HIDE_TYPE L:1+M5:DEX N:193:Constitution G:=:d I:45:4 W:30:0:2:500 A:50:30 to 100 F:SUST_CON | HIDE_TYPE L:1+M5:CON N:194:Speed G:=:d I:45:5 W:75:0:2:100000 A:40:75 to 100 F:HIDE_TYPE L:4+M6:SPEED N:195:Searching G:=:d I:45:6 W:5:0:2:250 A:20:5 to 90 F:HIDE_TYPE L:1+M5:SEARCH ### 196, sval 7 ### 197, sval 8 ### Stat sustain rings ### N:198:Bodykeeping G:=:d I:45:9 W:30:0:2:750 A:20:30 to 100 F:SUST_STR | SUST_DEX | SUST_CON | EASY_KNOW N:199:Soulkeeping G:=:d I:45:10 W:30:0:2:600 A:20:30 to 100 F:SUST_STR | SUST_INT | SUST_WIS | EASY_KNOW N:200:Sustain Charisma G:=:d I:45:11 W:30:0:2:500 #A:10:30 to 100 F:SUST_CHR | EASY_KNOW ### Resistance rings ### N:201:Resist Poison G:=:d I:45:12 W:40:0:2:16000 A:50:40 to 100 F:RES_POIS | EASY_KNOW N:202:Resist Fire G:=:d I:45:13 W:10:0:2:250 A:50:10 to 50 F:RES_FIRE | IGNORE_FIRE | EASY_KNOW N:203:Resist Cold G:=:d I:45:14 W:10:0:2:250 A:50:10 to 50 F:RES_COLD | IGNORE_COLD | EASY_KNOW ### 204, sval 15 ### Elemental rings ### N:205:Light G:=:d I:45:16 W:0:0:2:400 A:20:25 to 100 F:RES_LIGHT | LIGHT L:1+M5:SEARCH # Waiting for un_light to be implemented #N:206:Dark #G:=:d #I:45:17 #W:0:0:2:400 #A:100:25 to 100 #F:RES_DARK | UN_LIGHT #L:1+M5:SEARCH N:207:Flames G:=:d I:45:18 W:50:0:2:3000 A:20:50 to 100 P:0:0d0:0:0:5+d5M10 F:RES_FIRE | IGNORE_FIRE E:RING_FLAMES:50+d50 N:208:Acid G:=:d I:45:19 W:50:0:2:3000 A:20:50 to 100 P:0:0d0:0:0:5+d5M10 F:RES_ACID | IGNORE_ACID E:RING_ACID:50+d50 N:209:Ice G:=:d I:45:20 W:50:0:2:3000 A:20:50 to 100 P:0:0d0:0:0:5+d5M10 F:RES_COLD | IGNORE_COLD E:RING_ICE:50+d50 N:210:Lightning G:=:d I:45:21 W:50:0:2:5000 A:20:50 to 100 P:0:0d0:0:0:5+d5M10 F:RES_ELEC | IGNORE_ELEC E:RING_LIGHTNING:50+d50 ### 211, sval 22 ### Combat rings ### N:212:Damage G:=:d I:45:23 W:20:0:2:500 A:30:20 to 100 P:0:0d0:0:5+d3M7:0 D:It boosts your to-dam value. N:213:Accuracy G:=:d I:45:24 W:20:0:2:500 A:30:20 to 100 P:0:0d0:10+d6M7:0:0 D:It boosts your to-hit value. N:214:Slaying G:=:d I:45:25 W:40:0:2:1000 A:20:40 to 100 P:0:0d0:d10M10:d5M5:0 D:It boosts your to-hit and to-dam values. N:215:Protection G:=:d I:45:26 W:10:0:2:500 A:50:10 to 40 P:0:0d0:0:0:5+d5M10 D:It increases your armor class. ### Mixed blessings ### N:216:Teleportation G:=:d I:45:27 W:5:0:2:1000 A:20:5 to 50 F:TELEPORT | EASY_KNOW L:2:SPEED N:217:Reckless Attacks G:=:d I:45:28 W:0:0:2:200 A:30:10 to 50 P:0:0d0:2+d3:2+d3:-8+4d3 N:218:Open Wounds G:=:d I:45:29 W:0:0:2:700 A:20:10 to 50 F:IMPAIR_HP | EASY_KNOW E:CURE_SERIOUS:10+5d8 N:219:Escaping G:=:d I:45:30 W:30:0:2:4000 A:50:15 to 80 F:AFRAID | EASY_KNOW L:4:SPEED N:220:the Mouse G:=:d I:45:31 W:30:0:2:100 A:50:5 to 50 P:0:0d0:0:-3d4:0 L:d4:DEX L:d4:STEALTH N:221:the Dog G:=:d I:45:32 W:0:0:2:100 A:50:5 to 50 P:0:0d0:d3:d3:-2d5 F:RES_FEAR L:-1:STEALTH ### 222, sval 33 ### Misc rings ### N:223:Slow Digestion G:=:d I:45:34 W:5:0:2:250 A:30:5 to 50 F:SLOW_DIGEST | EASY_KNOW N:224:Feather Falling G:=:d I:45:35 W:5:0:2:200 A:20:5 to 50 F:FEATHER | EASY_KNOW N:225:Free Action G:=:d I:45:36 W:20:0:2:1500 A:50:20 to 100 F:FREE_ACT | EASY_KNOW N:226:See Invisible G:=:d I:45:37 W:30:0:2:340 A:50:30 to 100 F:SEE_INVIS | EASY_KNOW N:227:Delving G:=:d I:45:38 W:0:0:2:800 A:20:10 to 50 L:2+d3:TUNNEL E:STONE_TO_MUD:15+2d10 ##### Amulets ##### ### Stat boosts ### N:230:Wisdom G:":d I:40:1 W:30:0:3:500 A:50:20 to 90 F:SUST_WIS | HIDE_TYPE L:1+M5:WIS N:231:Charisma G:":d I:40:2 W:30:0:3:500 A:20:10 to 40 F:SUST_CHR | HIDE_TYPE L:1+M5:CHR ### Resistances ### N:232:Resist Lightning G:":d I:40:3 W:10:0:3:300 A:50:10 to 50 F:RES_ELEC | IGNORE_ELEC | EASY_KNOW N:233:Resist Acid G:":d I:40:4 W:10:0:3:300 A:50:10 to 50 F:RES_ACID | IGNORE_ACID | EASY_KNOW N:234:Resistance G:":d I:40:5 W:60:0:3:20000 A:10:60 to 100 F:RES_FIRE | RES_ACID | RES_ELEC | RES_COLD | EASY_KNOW | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD ### JLE amulets ### N:235:Sustenance G:":d I:40:6 W:60:0:3:20000 A:10:60 to 100 F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | F:HOLD_LIFE | SLOW_DIGEST | EASY_KNOW | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD N:236:the Magi G:":d I:40:7 W:70:0:3:30000 A:10:70 to 100 P:0:0d0:0:0:d5M5 F:FREE_ACT | SEE_INVIS | SUST_INT | RES_BLIND | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | F:HIDE_TYPE L:1+M3:SEARCH | INT N:237:ESP G:":d I:40:8 W:50:0:3:25000 A:10:60 to 100 F:TELEPATHY | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | F:HIDE_TYPE L:d5M5:SEARCH N:238:Devotion G:":d I:40:9 W:70:0:3:30000 A:10:70 to 100 F:SUST_WIS | SUST_CHR | LIGHT | F:RES_DARK | RES_LIGHT | RES_FIRE | HOLD_LIFE | F:HIDE_TYPE L:1+M3:WIS L:d6:CHR N:239:Weaponmastery G:":d I:40:10 W:70:0:3:30000 P:0:0d0:0:0:0 A:10:70 to 100 P:0:0d0:1+M4:1+M4:0 F:SUST_STR | SUST_CON | FREE_ACT | F:RES_FEAR | RES_DISEN | HIDE_TYPE L:1+M2:STR N:240:Trickery G:":d I:40:11 W:70:0:3:30000 A:10:70 to 100 F:SUST_DEX | F:RES_NEXUS | RES_POIS | HIDE_TYPE L:1+M4:DEX | STEALTH L:1+M2:SPEED L:1+d3M3:SEARCH | INFRA # 241 # 242 # 243 ### Ability boosts ### N:244:Regeneration G:":d I:40:15 W:30:0:3:600 A:20:30 to 100 F:REGEN | EASY_KNOW N:245:Infravision G:":d I:40:16 W:10:0:3:200 A:30:10 to 70 F:HIDE_TYPE L:1+M5:INFRA N:246:Searching G:":d I:40:17 W:15:0:3:600 A:20:10 to 40 F:HIDE_TYPE L:d5M5:SEARCH ### Powers ### N:247:Teleportation G:":d I:40:18 W:10:0:3:10 A:20:10 to 40 F:TELEPORT | EASY_KNOW N:248:Slow Digestion G:":d I:40:19 W:15:0:3:200 A:20:15 to 40 F:SLOW_DIGEST | EASY_KNOW N:249:Adornment G:":d I:40:20 W:10:0:3:0 A:20:10 to 40 F:EASY_KNOW ### Mixed ### N:250:Inertia G:":d I:40:21 W:15:0:3:10 A:20:15 to 40 F:FREE_ACT | EASY_KNOW L:-d2:SPEED ##### Scrolls ##### ### Teleportation ### N:260:Phase Door G:?:w I:70:1 W:1:0:5:15 A:50:1 to 100 M:100:1d3 F:EASY_KNOW E:TELE_PHASE N:261:Teleportation G:?:w I:70:2 W:10:0:5:40 A:50:10 to 100 F:EASY_KNOW E:TELE_LONG N:262:Teleport Level G:?:w I:70:3 W:20:0:5:50 A:50:20 to 100 F:EASY_KNOW E:TELE_LEVEL ### Detection ### N:263:Magic Mapping G:?:w I:70:4 W:5:0:5:65 A:50:5 to 100 M:70:1d3 F:EASY_KNOW E:MAPPING N:264:Treasure Detection G:?:w I:70:5 W:0:0:5:30 A:50:0 to 70 M:70:1d3 F:EASY_KNOW E:DETECT_TREASURE N:265:Trap Detection G:?:w I:70:6 W:5:0:5:35 A:50:0 to 70 M:70:1d3 F:EASY_KNOW E:DETECT_TRAP N:266:Door/Stair Location G:?:w I:70:7 W:5:0:5:50 A:50:5 to 70 M:70:1d3 F:EASY_KNOW E:DETECT_DOORSTAIR N:267:Detect Invisible G:?:w I:70:8 W:1:0:5:15 A:50:1 to 70 M:70:1d3 F:EASY_KNOW E:DETECT_INVIS ### 268 ### 269 ### Enchantments ### N:270:Enchant Weapon To-Hit G:?:w I:70:11 W:15:0:5:125 A:50:15 to 70 F:EASY_KNOW E:ENCHANT_TOHIT N:271:Enchant Weapon To-Dam G:?:w I:70:12 W:15:0:5:125 A:50:15 to 70 F:EASY_KNOW E:ENCHANT_TODAM N:272:Enchant Armour G:?:w I:70:13 W:15:0:5:125 A:50:15 to 70 F:EASY_KNOW E:ENCHANT_ARMOR N:273:*Enchant Weapon* G:?:w I:70:14 W:50:0:5:500 A:50:50 to 100 F:EASY_KNOW E:ENCHANT_WEAPON N:274:*Enchant Armour* G:?:w I:70:15 W:50:0:5:500 A:50:50 to 100 F:EASY_KNOW E:ENCHANT_ARMOR2 N:275:Remove Curse G:?:w I:70:16 W:10:0:5:100 A:20:10 to 100 F:EASY_KNOW E:REMOVE_CURSE N:276:*Remove Curse* G:?:w I:70:17 W:50:0:5:8000 A:20:50 to 100 F:EASY_KNOW E:REMOVE_CURSE2 ## Remove this entirely post-3.2 -- currently here for savefile compat for nightlies N:277:Restore Item G:?:w I:70:18:0 W:1:0:5:100 F:EASY_KNOW E:RESTORE_ITEM ### Summoning ### N:278:Summon Monster G:?:w I:70:19 W:1:0:5:0 A:10:1 to 100 M:70:1d3 F:EASY_KNOW E:SUMMON_MON N:279:Summon Undead G:?:w I:70:20 W:15:0:5:0 A:10:15 to 100 M:70:1d3 F:EASY_KNOW E:SUMMON_UNDEAD N:280:Acquirement G:?:w I:70:21 W:20:0:5:100000 A:10:20 to 100 F:EASY_KNOW E:ACQUIRE N:281:*Acquirement* G:?:w I:70:22 W:60:0:5:200000 A:5:60 to 100 F:EASY_KNOW E:ACQUIRE2 ### Killing scrolls ### N:282:Dispel Undead G:?:w I:70:23 W:40:0:5:200 A:50:40 to 100 F:EASY_KNOW E:DISPEL_UNDEAD N:283:Banishment G:?:w I:70:24 W:40:0:5:750 A:25:40 to 100 F:EASY_KNOW E:BANISHMENT N:284:Mass Banishment G:?:w I:70:25 W:50:0:5:1000 A:20:50 to 100 F:EASY_KNOW E:LOSKILL ### Utility ### N:285:Satisfy Hunger G:?:w I:70:26 W:5:0:5:10 A:50:5 to 100 M:100:1d10 F:EASY_KNOW E:SATISFY N:286:Identify G:?:w I:70:27 W:1:0:5:100 A:50:5 to 100 M:100:1d8 F:EASY_KNOW E:IDENTIFY N:289:Light G:?:w I:70:28 W:0:0:5:15 M:70:1d3 A:50:0 to 60 F:EASY_KNOW E:LIGHT N:290:Word of Recall G:?:w I:70:29 W:5:0:5:125 M:70:1d3 A:50:5 to 100 F:EASY_KNOW E:RECALL N:291:Recharging G:?:w I:70:30 W:40:0:5:200 A:50:40 to 100 F:EASY_KNOW E:RECHARGE N:292:Trap/Door Destruction G:?:w I:70:31 W:10:0:5:50 A:50:10 to 60 F:EASY_KNOW E:DESTROY_TDOORS N:293:Deep Descent G:?:w I:70:32 W:10:0:5:50 A:20:1 to 100 F:EASY_KNOW E:DEEP_DESCENT ### "Holy" spells ### N:294:Blessing G:?:w I:70:33 W:1:0:5:15 A:50:1 to 50 M:70:1d3 F:EASY_KNOW E:BLESSING N:295:Holy Chant G:?:w I:70:34 W:10:0:5:40 A:50:10 to 70 F:EASY_KNOW E:BLESSING2 N:296:Holy Prayer G:?:w I:70:35 W:25:0:5:80 A:50:50 to 100 F:EASY_KNOW E:BLESSING3 N:297:Protection from Evil G:?:w I:70:36 W:30:0:5:50 A:50:30 to 100 F:EASY_KNOW E:PROTEVIL ### Misc. ### N:298:Monster Confusion G:?:w I:70:37 W:5:0:5:30 A:20:5 to 60 F:EASY_KNOW E:CONFUSING N:299:Rune of Protection G:?:w I:70:38 W:60:0:5:500 A:30:70 to 100 F:EASY_KNOW E:RUNE N:300:*Destruction* G:?:w I:70:39 W:40:0:5:250 A:30:40 to 100 F:EASY_KNOW E:DESTRUCTION2 ### Bad scrolls ### N:301:Aggravate Monster G:?:w I:70:40 W:5:0:5:0 A:10:5 to 70 M:70:1d3 F:EASY_KNOW E:ANNOY_MON N:302:Curse Weapon G:?:w I:70:41 W:50:0:5:0 A:10:50 to 100 M:70:1d3 F:EASY_KNOW E:CURSE_WEAPON N:303:Curse Armour G:?:w I:70:42 W:50:0:5:0 A:10:50 to 100 M:70:1d3 F:EASY_KNOW E:CURSE_ARMOR N:304:Darkness G:?:w I:70:43 W:1:0:5:0 A:10:1 to 70 M:70:1d3 F:EASY_KNOW E:DARKNESS N:305:Trap Creation G:?:w I:70:44 W:10:0:5:0 A:10:10 to 70 M:70:1d3 F:EASY_KNOW E:CREATE_TRAP ##### Potions ##### ### Statgain ### N:310:Strength G:!:d I:75:1 W:30:0:4:8000 A:50:30 to 100 F:EASY_KNOW E:GAIN_STR N:311:Intelligence G:!:d I:75:2 W:30:0:4:8000 A:50:30 to 100 F:EASY_KNOW E:GAIN_INT N:312:Wisdom G:!:d I:75:3 W:30:0:4:8000 A:50:30 to 100 F:EASY_KNOW E:GAIN_WIS N:313:Dexterity G:!:d I:75:4 W:30:0:4:8000 A:50:30 to 100 F:EASY_KNOW E:GAIN_DEX N:314:Constitution G:!:d I:75:5 W:30:0:4:8000 A:50:30 to 100 F:EASY_KNOW E:GAIN_CON N:315:Charisma G:!:d I:75:6 W:20:0:4:1000 A:50:15 to 100 F:EASY_KNOW E:GAIN_CHR N:316:Augmentation G:!:d I:75:7 W:40:0:4:60000 A:20:40 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:GAIN_ALL N:317:Experience G:!:d I:75:8 W:65:0:4:25000 A:50:65 to 100 F:EASY_KNOW E:GAIN_EXP ### Healings ### N:318:Cure Light Wounds G:!:d I:75:9 W:0:0:4:20 A:100:1 to 15 M:100:2d3 F:EASY_KNOW E:CURE_LIGHT L:150 N:319:Cure Serious Wounds G:!:d I:75:10 W:3:0:4:70 A:100:4 to 40 M:85:2d3 F:EASY_KNOW E:CURE_SERIOUS L:150 N:320:Cure Critical Wounds G:!:d I:75:11 W:5:0:4:200 A:100:12 to 100 M:75:2d3 F:EASY_KNOW E:CURE_CRITICAL L:150 N:321:Healing G:!:d I:75:12 W:15:0:4:300 A:80:30 to 100 F:EASY_KNOW E:CURE_FULL L:200 N:322:*Healing* G:!:d I:75:13 W:40:0:4:1500 A:40:40 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:CURE_FULL2 L:300 N:323:Life G:!:d I:75:14 W:60:0:4:5000 A:20:60 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:CURE_NONORLYBIG N:324:Neutralize Poison G:!:d I:75:15 W:5:0:4:75 A:50:1 to 35 F:EASY_KNOW E:CURE_POISON N:325:Restore Mana G:!:d I:75:16 W:25:0:4:350 A:80:15 to 100 F:EASY_KNOW E:RESTORE_MANA ### Stat restore ### # removed: old stat restoration N:332:Restore Life Levels G:!:d I:75:23 W:40:0:4:400 A:50:30 to 100 F:EASY_KNOW E:RESTORE_EXP ### Gain one/lose one potions ### N:333:Brawn G:!:d I:75:24 W:3:0:4:1000 A:50:10 to 30 F:EASY_KNOW E:BRAWN N:334:Intellect G:!:d I:75:25 W:20:0:4:1000 A:50:10 to 30 F:EASY_KNOW E:INTELLECT N:335:Contemplation G:!:d I:75:26 W:20:0:4:1000 A:50:10 to 30 F:EASY_KNOW E:CONTEMPLATION N:336:Nimbleness G:!:d I:75:27 W:5:0:4:1000 A:50:10 to 30 F:EASY_KNOW E:NIMBLENESS N:337:Toughness G:!:d I:75:28 W:10:0:4:1000 A:50:10 to 30 F:EASY_KNOW E:TOUGHNESS ### Knowledge ### N:341:Enlightenment G:!:d I:75:30 W:25:0:4:800 A:50:25 to 100 F:EASY_KNOW E:ENLIGHTENMENT N:342:*Enlightenment* G:!:d I:75:31 W:70:0:4:80000 A:20:70 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:ENLIGHTENMENT2 ### Buffs ### N:343:Speed G:!:d I:75:32 W:1:0:4:75 A:50:1 to 100 F:EASY_KNOW E:HASTE N:344:Heroism G:!:d I:75:33 W:1:0:4:25 A:50:1 to 100 F:EASY_KNOW E:HERO N:345:Berserk Strength G:!:d I:75:34 W:3:0:4:100 A:50:3 to 100 F:EASY_KNOW E:SHERO N:346:Boldness G:!:d I:75:35 W:1:0:4:8 A:50:1 to 90 F:EASY_KNOW E:CURE_PARANOIA N:347:Resist Heat G:!:d I:75:36 W:1:0:4:30 A:50:1 to 100 F:EASY_KNOW E:RESIST_FIRE N:348:Resist Cold G:!:d I:75:37 W:1:0:4:30 A:50:1 to 100 F:EASY_KNOW E:RESIST_COLD N:349:Resist Poison G:!:d I:75:38 W:1:0:4:30 A:50:8 to 100 F:EASY_KNOW E:RESIST_POIS N:350:True Seeing G:!:d I:75:39 W:3:0:4:50 A:50:3 to 40 F:EASY_KNOW E:TMD_SINVIS N:351:Infravision G:!:d I:75:49 W:3:0:4:20 A:50:3 to 40 F:EASY_KNOW E:TMD_INFRA ### Useless buggers ### N:355:Slime Mold Juice G:!:d I:75:50 W:0:0:4:2 A:10:1 to 10 M:55:2d3 F:EASY_KNOW E:DRINK_GOOD L:1000 N:356:Sleep G:!:d I:75:51 W:0:0:4:0 A:10:0 to 10 M:70:2d3 P:0:3d4:0:0:0 F:EASY_KNOW E:PARALYZE L:100 N:357:Blindness G:!:d I:75:52 W:0:0:4:0 M:70:2d3 A:10:0 to 10 P:0:3d4:0:0:0 F:EASY_KNOW E:BLIND N:358:Confusion G:!:d I:75:53 W:0:0:4:0 M:70:2d3 A:10:0 to 10 P:0:3d4:0:0:0 F:EASY_KNOW E:CONFUSE L:50 N:359:Poison G:!:d I:75:54 W:3:0:4:0 M:70:2d3 A:10:0 to 10 P:0:3d4:0:0:0 F:EASY_KNOW E:POISON N:360:Slowness G:!:d I:75:55 W:1:0:4:0 M:70:2d3 A:10:0 to 10 P:0:3d4:0:0:0 F:EASY_KNOW E:SLOW L:50 N:361:Lose Memories G:!:d I:75:56 W:10:0:4:0 A:10:10 to 15 F:EASY_KNOW E:LOSE_EXP N:362:Salt Water G:!:d I:75:57 W:0:0:4:0 M:100:1d2 A:10:3 to 15 F:EASY_KNOW E:DRINK_SALT ### Weird one ### N:363:Dragon Breath G:!:d I:75:58 W:0:0:4:100 M:100:1d2 A:20:40 to 100 F:EASY_KNOW E:DRINK_BREATH ##### Wands ##### ### Bolts ### N:370:Magic Missile G:-:d I:65:1 W:3:0:10:200 A:20:3 to 60 P:0:1d1:0:0:0 C:6+d10 F:EASY_KNOW E:MISSILE N:371:Lightning Bolts G:-:d I:65:2 W:15:0:10:600 A:20:15 to 60 P:0:1d1:0:0:0 C:6+d8 F:EASY_KNOW E:ELEC_BOLT N:372:Frost Bolts G:-:d I:65:3 W:20:0:10:800 A:20:20 to 60 P:0:1d1:0:0:0 C:6+d5 F:EASY_KNOW E:COLD_BOLT N:373:Fire Bolts G:-:d I:65:4 W:30:0:10:1000 A:20:30 to 60 P:0:1d1:0:0:0 C:6+d8 F:EASY_KNOW E:FIRE_BOLT2 N:374:Acid Bolts G:-:d I:65:5 W:30:0:10:950 A:20:30 to 60 P:0:1d1:0:0:0 C:6+d8 F:EASY_KNOW E:ACID_BOLT2 ### Balls ### N:375:Stinking Cloud G:-:d I:65:6 W:5:0:10:400 A:20:5 to 60 P:0:1d1:0:0:0 C:6+d8 F:EASY_KNOW E:STINKING_CLOUD N:376:Lightning Balls G:-:d I:65:7 W:35:0:10:1200 A:20:35 to 100 P:0:1d1:0:0:0 C:4+d8 F:IGNORE_ELEC | EASY_KNOW E:ELEC_BALL N:377:Cold Balls G:-:d I:65:8 W:40:0:10:1500 A:20:40 to 100 P:0:1d1:0:0:0 C:2+d6 F:IGNORE_COLD | EASY_KNOW E:COLD_BALL100 N:378:Fire Balls G:-:d I:65:9 W:50:0:10:1800 A:20:50 to 100 P:0:1d1:0:0:0 C:2+d4 F:IGNORE_FIRE | EASY_KNOW E:FIRE_BALL N:379:Acid Balls G:-:d I:65:10 W:50:0:10:1650 A:20:50 to 100 P:0:1d1:0:0:0 C:2+d5 F:IGNORE_ACID | EASY_KNOW E:ACID_BALL ### Monster status changing ### N:380:Slow Monster G:-:d I:65:11 W:5:0:10:500 A:20:5 to 60 P:0:1d1:0:0:0 C:6+d10 F:EASY_KNOW E:MON_SLOW N:381:Confuse Monster G:-:d I:65:12 W:5:0:10:500 A:20:5 to 60 P:0:1d1:0:0:0 C:6+d12 F:EASY_KNOW E:MON_CONFUSE N:382:Sleep Monster G:-:d I:65:13 W:5:0:10:500 A:20:5 to 60 P:0:1d1:0:0:0 C:8+d15 F:EASY_KNOW E:MON_SLEEP N:383:Scare Monster G:-:d I:65:14 W:10:0:10:500 A:20:10 to 60 P:0:1d1:0:0:0 C:3+d5 F:EASY_KNOW E:MON_SCARE ### Utility ### N:384:Light G:-:d I:65:15 W:3:0:10:200 A:20:3 to 60 P:0:1d1:0:0:0 C:6+d10 F:EASY_KNOW E:LIGHT_LINE N:385:Stone to Mud G:-:d I:65:16 W:10:0:10:300 A:20:10 to 100 P:0:1d1:0:0:0 C:3+d4 F:EASY_KNOW E:STONE_TO_MUD N:386:Polymorph G:-:d I:65:17 W:20:0:10:400 A:20:20 to 60 P:0:1d1:0:0:0 C:6+d8 F:EASY_KNOW E:POLYMORPH N:387:Trap/Door Destruction G:-:d I:65:18 W:10:0:10:100 A:20:10 to 60 P:0:1d1:0:0:0 C:6+d8 F:EASY_KNOW E:TDOOR_DEST N:388:Clone Monster G:-:d I:65:19 W:15:0:10:0 A:20:15 to 100 P:0:1d1:0:0:0 C:3+d5 F:EASY_KNOW E:MON_CLONE N:389:Teleport Other G:-:d I:65:20 W:20:0:10:350 A:20:20 to 100 P:0:1d1:0:0:0 C:6+d5 F:EASY_KNOW E:TELE_OTHER N:390:Disarming G:-:d I:65:21 W:20:0:10:700 A:20:20 to 60 P:0:1d1:0:0:0 C:4+d5 F:EASY_KNOW E:DISARMING N:391:Wonder G:-:d I:65:22 W:3:0:10:250 A:20:3 to 60 P:0:1d1:0:0:0 C:8+d15 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW E:WONDER ### Dragons' wands ### N:392:Dragon's Flame G:-:d I:65:23 W:50:0:10:2400 A:20:50 to 100 P:0:1d1:0:0:0 C:1+d3 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW E:FIRE_BALL200 N:393:Dragon's Frost G:-:d I:65:24 W:50:0:10:2400 A:20:50 to 100 P:0:1d1:0:0:0 C:1+d3 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW E:COLD_BALL160 N:394:Dragon's Breath G:-:d I:65:25 W:60:0:10:2400 A:20:60 to 100 P:0:1d1:0:0:0 C:1+d3 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW E:WAND_BREATH ### Drain lifes ### N:395:Drain Life G:-:d I:65:26 W:50:0:10:1200 A:50:50 to 100 P:0:1d1:0:0:0 C:3+d3 F:EASY_KNOW E:DRAIN_LIFE3 N:396:Annihilation G:-:d I:65:27 W:60:0:10:3000 A:20:60 to 100 P:0:1d1:0:0:0 C:1+d2 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW E:DRAIN_LIFE4 ### Rubbish ### N:397:Heal Monster G:-:d I:65:28 W:3:0:10:0 A:10:3 to 40 P:0:1d1:0:0:0 C:8+d20 F:EASY_KNOW E:MON_HEAL N:398:Haste Monster G:-:d I:65:29 W:3:0:10:0 A:10:3 to 40 P:0:1d1:0:0:0 C:8+d20 F:EASY_KNOW E:MON_HASTE ##### Staffs ##### ### Bad staffs ### N:400:Summoning G:_:d I:55:1 W:10:0:50:0 A:10:10 to 100 P:0:1d2:0:0:0 C:2d3 F:EASY_KNOW E:SUMMON_MON N:401:Haste Monsters G:_:d I:55:2 W:10:0:50:0 A:10:10 to 40 P:0:1d2:0:0:0 C:8+d8 F:EASY_KNOW E:LOSHASTE N:402:Darkness G:_:d I:55:3 W:5:0:50:0 A:10:5 to 40 P:0:1d2:0:0:0 C:8+d8 F:EASY_KNOW E:DARKNESS ### Destruction ### N:403:Earthquakes G:_:d I:55:4 W:40:0:50:350 A:20:40 to 100 P:0:1d2:0:0:0 C:3+d5 F:EASY_KNOW E:EARTHQUAKES N:404:*Destruction* G:_:d I:55:5 W:50:0:50:2500 A:20:50 to 100 P:0:1d2:0:0:0 C:1+d3 F:EASY_KNOW E:DESTRUCTION2 ### Monster-affecting ### N:405:Confuse Monsters G:_:d I:55:6 W:10:0:50:800 A:20:10 to 100 P:0:1d2:0:0:0 C:6+d5 F:EASY_KNOW E:LOSCONF N:406:Slow Monsters G:_:d I:55:7 W:10:0:50:800 A:20:10 to 100 P:0:1d2:0:0:0 C:6+d5 F:EASY_KNOW E:LOSSLOW N:407:Sleep Monsters G:_:d I:55:8 W:10:0:50:700 A:20:10 to 100 P:0:1d2:0:0:0 C:6+d5 F:EASY_KNOW E:LOSSLEEP ### Detect ### N:408:Detect Invisible G:_:d I:55:9 W:5:0:50:200 A:30:5 to 100 P:0:1d2:0:0:0 C:8+d15 F:EASY_KNOW E:DETECT_INVIS N:409:Detect Evil G:_:d I:55:10 W:20:0:50:350 A:30:20 to 100 P:0:1d2:0:0:0 C:8+d15 F:EASY_KNOW E:DETECT_EVIL N:410:Mapping G:_:d I:55:11 W:20:0:50:600 A:30:20 to 100 P:0:1d2:0:0:0 C:5+d5 F:EASY_KNOW E:MAPPING ### Healing ### N:411:Curing G:_:d I:55:12 W:25:0:50:500 A:30:10 to 100 P:0:1d2:0:0:0 C:4+d3 F:EASY_KNOW E:CURE_TEMP N:412:Cure Light Wounds G:_:d I:55:13 W:5:0:50:350 A:30:5 to 100 P:0:1d2:0:0:0 C:6+d5 F:EASY_KNOW E:CURE_LIGHT N:413:Healing G:_:d I:55:14 W:70:0:50:5000 A:20:70 to 100 P:0:1d2:0:0:0 C:1+d2 F:EASY_KNOW E:CURE_FULL ### Killing staffs ### N:414:Dispel Evil G:_:d I:55:15 W:50:0:50:1200 A:50:50 to 100 P:0:1d2:0:0:0 C:4+d3 F:EASY_KNOW E:DISPEL_EVIL60 N:415:Banishment G:_:d I:55:16 W:70:0:50:3500 A:20:70 to 100 P:0:1d2:0:0:0 C:1+d2 F:EASY_KNOW E:BANISHMENT N:416:Power G:_:d I:55:17 W:70:0:50:4000 A:20:70 to 100 P:0:1d2:0:0:0 C:1+d3 F:EASY_KNOW E:DISPEL_ALL N:417:Holiness G:_:d I:55:18 W:70:0:50:4500 A:20:70 to 100 P:0:1d2:0:0:0 C:2d2 F:EASY_KNOW E:STAFF_HOLY ### Utility ### N:418:Light G:_:d I:55:19 W:5:0:50:250 A:20:5 to 80 P:0:1d2:0:0:0 C:8+d20 F:EASY_KNOW E:LIGHT N:419:Starlight G:_:d I:55:20 W:20:0:50:800 A:20:20 to 80 P:0:1d2:0:0:0 C:6+d5 F:EASY_KNOW E:STARLIGHT N:420:Teleportation G:_:d I:55:21 W:20:0:50:2000 A:50:20 to 100 P:0:1d2:0:0:0 C:5+d4 F:EASY_KNOW E:TELE_LONG N:421:Speed G:_:d I:55:22 W:40:0:50:1000 A:20:40 to 100 P:0:1d2:0:0:0 C:4+d3 F:EASY_KNOW E:HASTE N:422:Remove Curse G:_:d I:55:23 W:40:0:50:500 A:20:40 to 100 P:0:1d2:0:0:0 C:4+d3 F:EASY_KNOW E:REMOVE_CURSE N:423:the Magi G:_:d I:55:24 W:70:0:50:4500 A:20:70 to 100 P:0:1d2:0:0:0 C:2+1d2 F:EASY_KNOW E:STAFF_MAGI N:424:Identify G:_:d I:55:25 W:10:0:50:600 A:50:10 to 100 P:0:1d2:0:0:0 C:5+d15 F:EASY_KNOW E:IDENTIFY ##### Rods ##### ### Detection ### N:430:Treasure Location G:-:d I:66:1 W:5:0:15:1000 A:10:8 to 75 P:0:1d1:0:0:0 F:EASY_KNOW E:DETECT_TREASURE:50 N:431:Door/Stair Location G:-:d I:66:2 W:15:0:15:1000 A:30:8 to 75 P:0:1d1:0:0:0 F:EASY_KNOW E:DETECT_DOORSTAIR:70 N:432:Trap Location G:-:d I:66:3 W:5:0:15:1000 A:30:8 to 75 P:0:1d1:0:0:0 F:EASY_KNOW E:DETECT_TRAP:50 N:433:Detection G:-:d I:66:4 W:30:0:15:5000 A:30:50 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_ELEC E:DETECT_ALL:100 N:434:Magic Mapping G:-:d I:66:5 W:65:0:15:10000 A:10:65 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:MAPPING:100 N:435:Probing G:-:d I:66:6 W:35:0:15:4000 A:20:35 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:PROBING:100 ### Bolts ### N:436:Fire Bolts G:-:d I:66:7 W:30:0:15:3000 A:20:30 to 80 P:0:1d1:0:0:0 F:EASY_KNOW E:FIRE_BOLT2:15 N:437:Frost Bolts G:-:d I:66:8 W:25:0:15:2500 A:20:25 to 80 P:0:1d1:0:0:0 F:EASY_KNOW E:COLD_BOLT2:13 N:438:Lightning Bolts G:-:d I:66:9 W:20:0:15:2000 A:20:20 to 80 P:0:1d1:0:0:0 F:EASY_KNOW E:ELEC_BOLT:11 N:439:Acid Bolts G:-:d I:66:10 W:40:0:15:3500 A:20:40 to 80 P:0:1d1:0:0:0 F:EASY_KNOW E:ACID_BOLT3:12 ### Balls ### N:440:Fire Balls G:-:d I:66:11 W:75:0:15:5000 A:20:75 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:FIRE_BALL:30 N:441:Cold Balls G:-:d I:66:12 W:60:0:15:4500 A:20:60 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:COLD_BALL100:25 N:442:Lightning Balls G:-:d I:66:13 W:55:0:15:4000 A:20:55 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_ELEC E:ELEC_BALL:23 N:443:Acid Balls G:-:d I:66:14 W:70:0:15:5500 A:20:70 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:ACID_BALL:27 ### Status-affecting ### N:444:Slow Monster G:-:d I:66:15 W:30:0:15:1500 A:20:30 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:MON_SLOW:20 N:445:Sleep Monster G:-:d I:66:16 W:30:0:15:1500 A:20:30 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:MON_SLEEP:18 ### Healing ### N:446:Curing G:-:d I:66:17 W:65:0:15:1000 A:20:10 to 80 P:0:1d1:0:0:0 F:EASY_KNOW E:CURE_TEMP:100 N:447:Healing G:-:d I:66:18 W:80:0:15:20000 A:20:80 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_ELEC E:HEAL3:1000 N:448:Restoration G:-:d I:66:19 W:80:0:15:25000 A:10:80 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_ELEC E:RESTORE_ST_LEV:1000 ### Other ### N:449:Polymorph G:-:d I:66:20 W:35:0:15:1200 A:20:35 to 80 P:0:1d1:0:0:0 F:EASY_KNOW E:POLYMORPH:25 N:450:Drain Life G:-:d I:66:21 W:75:0:15:3600 A:20:75 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:DRAIN_LIFE3:23 N:451:Teleport Other G:-:d I:66:22 W:45:0:15:1400 A:20:45 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:TELE_OTHER:25 N:452:Disarming G:-:d I:66:23 W:35:0:15:2100 A:10:10 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:DISARMING:30 N:453:Light G:-:d I:66:24 W:10:0:15:500 A:20:8 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:LIGHT_LINE:9 N:454:Illumination G:-:d I:66:25 W:20:0:15:1000 A:20:20 to 100 P:0:1d1:0:0:0 F:EASY_KNOW E:LIGHT:30 N:455:Recall G:-:d I:66:26 W:30:0:15:4000 A:10:30 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_ELEC E:RECALL:60 N:456:Identify G:-:d I:66:27 W:50:0:15:30000 A:15:50 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_ELEC E:IDENTIFY:10 N:457:Speed G:-:d I:66:28 W:95:0:15:50000 A:10:80 to 100 P:0:1d1:0:0:0 F:EASY_KNOW | IGNORE_ELEC E:HASTE:100 ##### Basic Books ##### N:460:[Magic for Beginners] G:?:R I:90:0 W:5:0:30:25 A:50:5 to 100 P:0:1d1:0:0:0 F:EASY_KNOW N:461:[Conjurings and Tricks] G:?:R I:90:1 W:10:0:30:100 A:50:10 to 100 P:0:1d1:0:0:0 F:EASY_KNOW N:462:[Incantations and Illusions] G:?:R I:90:2 W:20:0:30:400 A:50:20 to 100 P:0:1d1:0:0:0 F:EASY_KNOW N:463:[Sorcery and Evocations] G:?:R I:90:3 W:30:0:30:800 A:50:30 to 100 P:0:1d1:0:0:0 F:EASY_KNOW N:464:[Beginners Handbook] G:?:G I:91:0 W:5:0:30:25 A:50:5 to 100 P:0:1d1:0:0:0 F:EASY_KNOW N:465:[Words of Wisdom] G:?:G I:91:1 W:10:0:30:100 A:50:10 to 100 P:0:1d1:0:0:0 F:EASY_KNOW N:466:[Chants and Blessings] G:?:G I:91:2 W:20:0:30:400 A:50:20 to 100 P:0:1d1:0:0:0 F:EASY_KNOW N:467:[Exorcism and Dispelling] G:?:G I:91:3 W:30:0:30:800 A:50:30 to 100 P:0:1d1:0:0:0 F:EASY_KNOW ##### Special Books (note resistances) ##### N:468:[Resistances of Scarabtarices] G:?:r I:90:4 W:40:0:30:10000 A:30:40 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:469:[Raal's Tome of Destruction] G:?:r I:90:5 W:50:0:30:20000 A:30:50 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:470:[Mordenkainen's Escapes] G:?:r I:90:6 W:60:0:30:30000 A:30:60 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:471:[Tenser's Transformations] G:?:r I:90:7 W:70:0:30:50000 A:30:70 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:472:[Kelek's Grimoire of Power] G:?:r I:90:8 W:80:0:30:90000 A:10:90 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:473:[Ethereal Openings] G:?:g I:91:4 W:40:0:30:10000 A:30:40 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:474:[Godly Insights] G:?:g I:91:5 W:50:0:30:20000 A:30:50 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:475:[Purifications and Healing] G:?:g I:91:6 W:60:0:30:30000 A:30:60 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:476:[Holy Infusions] G:?:g I:91:7 W:70:0:30:50000 A:30:70 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW N:477:[Wrath of God] G:?:g I:91:8 W:80:0:30:90000 A:10:90 to 100 P:0:1d1:0:0:0 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:EASY_KNOW ##### Chests ##### N:480:& Small wooden chest~ G:~:s I:7:1 W:5:0:250:20 A:30:5 to 100 P:0:2d3:0:0:0 N:481:& Large wooden chest~ G:~:s I:7:5 W:15:0:500:60 A:30:15 to 100 P:0:2d5:0:0:0 N:482:& Small iron chest~ G:~:s I:7:2 W:25:0:300:100 A:30:25 to 100 P:0:2d4:0:0:0 N:483:& Large iron chest~ G:~:s I:7:6 W:35:0:1000:150 A:30:35 to 100 P:0:2d6:0:0:0 N:484:& Small steel chest~ G:~:s I:7:3 W:45:0:500:200 A:30:45 to 100 P:0:2d4:0:0:0 N:485:& Large steel chest~ G:~:s I:7:7 W:55:0:1000:250 A:30:55 to 100 P:0:2d6:0:0:0 N:486:& Ruined chest~ G:~:s I:7:0 W:0:0:250:0 #A:100:75 to 100 ##### Junk ##### N:490:& Empty Bottle~ G:!:w I:2:1 W:0:0:2:0 F:EASY_KNOW N:491:& Shard~ of Pottery G:~:r I:3:3 W:0:0:5:0 F:EASY_KNOW N:492:& Broken Stick~ G:~:r I:3:6 W:0:0:3:0 F:EASY_KNOW N:493:& Broken Skull~ G:~:w I:1:1 W:0:0:2:0 F:EASY_KNOW N:494:& Broken Bone~ G:~:w I:1:2 W:0:0:2:0 F:EASY_KNOW N:495:& Canine Skeleton~ G:~:w I:1:4 W:1:0:10:0 F:EASY_KNOW N:496:& Rodent Skeleton~ G:~:w I:1:3 W:1:0:10:0 F:EASY_KNOW N:497:& Human Skeleton~ G:~:w I:1:8 W:5:0:60:0 F:EASY_KNOW N:498:& Dwarf Skeleton~ G:~:w I:1:7 W:5:0:50:0 F:EASY_KNOW N:499:& Elf Skeleton~ G:~:w I:1:6 W:5:0:40:0 F:EASY_KNOW ##### Dragon Scale Mail ##### N:500:Black Dragon Scale Mail~ G:[:s I:38:1 W:50:0:120:40000 A:10:25 to 100 P:16:2d4:-2:0:10 F:RES_ACID | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:ACID_BALL:50 N:501:Blue Dragon Scale Mail~ G:[:b I:38:2 W:50:0:100:40000 A:10:25 to 100 P:12:2d4:-2:0:10 F:RES_ELEC | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_BLUE:50 N:502:White Dragon Scale Mail~ G:[:w I:38:3 W:50:0:110:40000 A:10:25 to 100 P:14:2d4:-2:0:10 F:RES_COLD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:COLD_BALL100:50 N:503:Red Dragon Scale Mail~ G:[:r I:38:4 W:50:0:160:40000 A:10:25 to 100 P:24:2d4:-2:0:10 F:RES_FIRE | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_RED:50 N:504:Green Dragon Scale Mail~ G:[:g I:38:5 W:60:0:140:60000 A:10:60 to 100 P:20:2d4:-2:0:10 F:RES_POIS | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_GREEN:50 N:505:Multi-Hued Dragon Scale Mail~ G:[:v I:38:6 W:90:0:260:150000 A:6:75 to 100 P:45:2d4:-2:0:10 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_MULTIHUED:50 N:506:Pseudo-Dragon Scale Mail~ G:[:o I:38:10 W:65:0:200:60000 A:8:75 to 100 P:32:2d4:-2:0:10 F:RES_LIGHT | RES_DARK | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_SHINING:50 N:507:Law Dragon Scale Mail~ G:[:B I:38:12 W:80:0:220:80000 A:8:80 to 100 P:36:2d4:-2:0:10 F:RES_SOUND | RES_SHARD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_LAW:50 N:508:Bronze Dragon Scale Mail~ G:[:U I:38:14:0 W:50:0:130:40000 A:0:55 to 100 # was 10 P:18:2d4:-2:0:10 F:RES_CONFU | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD #E:DRAGON_BRONZE:50 N:509:Gold Dragon Scale Mail~ G:[:y I:38:16 W:50:0:180:40000 A:10:70 to 100 P:28:2d4:-2:0:10 F:RES_SOUND | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_GOLD:50 N:510:Chaos Dragon Scale Mail~ G:[:v I:38:18 W:80:0:240:80000 A:6:85 to 100 P:40:2d4:-2:0:10 F:RES_CHAOS | RES_DISEN | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_CHAOS:50 N:511:Balance Dragon Scale Mail~ G:[:v I:38:20 W:95:0:280:100000 A:3:95 to 100 P:50:2d4:-2:0:10 F:RES_SOUND | RES_SHARD | RES_CHAOS | RES_DISEN | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_BALANCE:50 N:512:Power Dragon Scale Mail~ G:[:v I:38:30 W:100:0:300:300000 A:1:100 to 100 P:60:2d4:-3:0:15 F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | RES_POIS | F:RES_CONFU | RES_DISEN | RES_SOUND | RES_SHARD | F:RES_LIGHT | RES_DARK | RES_CHAOS | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD E:DRAGON_POWER:50 ##### Gold/gems ##### N:520:copper G:$:u I:100:0 N:521:silver G:$:s I:100:1 N:522:garnets G:$:r I:100:2 N:523:gold G:$:y I:100:3 N:524:opals G:$:W I:100:4 N:525:sapphires G:$:b I:100:5 N:526:rubies G:$:r I:100:6 N:527:diamonds G:$:w I:100:7 N:528:emeralds G:$:g I:100:8 N:529:mithril G:$:B I:100:9 N:530:adamantite G:$:G I:100:10 ##### "Morgoth Artifacts" ##### # These objects, like other INSTA_ARTs are never created without being # turned into artifacts. This simplifies the code for "killing the # winner monster". N:540:& Mighty Hammer~ G:\:D I:21:50 W:15:0:200:1000 P:0:3d9:0:0:0 F:INSTA_ART N:542:& Massive Iron Crown~ G:]:D I:33:50 W:44:0:20:1000 P:0:1d1:0:0:0 F:INSTA_ART ##### Objects 500 to 514 are the "Special Artifacts" ##### # These objects do not specify "full names" because the artifact name # is added in "obj-desc.c" based on the artifact index ("i_ptr->name1"). # # These objects do specify a "base name", which is used when the object # is "aware" (always true for lights) # # The lights (and the One Ring) specify "physical colors", which # over-ride the "flavor" colors, if any. Note that the "One Ring" # also has a specific check for "unknown" in which it changes its # name to "a plain gold ring". See "obj-desc.c" # # Note that ALL artifacts are given "IGNORE_ACID/ELEC/FIRE/COLD", # so we do not need to specify that here. # # Note that the "INSTA_ART" flag is used to prevent these objects from # being created without also turning them into artifacts. This flag # must be specified both here and in the artifact template. # # The reason for having six different "ring" templates and three # different "amulet" templates is to allow each "special artifact" to # have a different "color" and "flavor", and also to allow the use of # special "base names" (such as "Necklace"). # The Phial of Galadriel -- see artifact list N:550:& Phial~ G:~:y I:39:4 W:5:0:10:10000 P:0:1d1:0:0:0 F:INSTA_ART # The Star of Elendil -- see artifact list N:551:& Star~ G:~:y I:39:5 W:30:0:5:25000 P:0:1d1:0:0:0 F:INSTA_ART # The Arkenstone of Thrain -- see artifact list N:552:& Arkenstone~ G:~:y I:39:6 W:50:0:5:50000 P:0:1d1:0:0:0 F:INSTA_ART # The Amulet of Carlammas -- see artifact list N:553:& Amulet~ G:":d I:40:50 W:50:0:3:60000 F:INSTA_ART # The Amulet of Ingwe -- see artifact list N:554:& Amulet~ G:":d I:40:51 W:65:0:3:90000 F:INSTA_ART # The Necklace of the Dwarves -- see artifact list N:555:& Necklace~ G:":y I:40:52 W:70:0:3:75000 F:INSTA_ART # The Ring of Barahir -- see artifact list N:556:& Ring~ G:=:d I:45:50 W:50:0:2:65000 F:INSTA_ART # The Ring of Tulkas -- see artifact list N:557:& Ring~ G:=:d I:45:51 W:70:0:2:150000 F:INSTA_ART # The Ring of Power 'Narya' -- see artifact list N:558:& Ring~ G:=:d I:45:52 W:70:0:2:100000 F:INSTA_ART # The Ring of Power 'Nenya' -- see artifact list N:559:& Ring~ G:=:d I:45:53 W:80:0:2:200000 F:INSTA_ART # The Ring of Power 'Vilya' -- see artifact list N:560:& Ring~ G:=:d I:45:54 W:90:0:2:300000 F:INSTA_ART # The Ring of Power 'The One Ring' -- see artifact list N:561:& Ring~ G:=:y I:45:55 W:100:0:2:5000000 F:INSTA_ART # The Palantir of Westernesse -- see artifact list N:562:& Palant['i]r~ G:~:y I:39:7 W:75:0:200:100000 P:0:10d10:0:0:0 F:INSTA_ART # The Elfstone 'Elessar' -- see artifact list N:563:& Elfstone~ G:":g I:40:53 W:60:0:3:50000 F:INSTA_ART # The Jewel 'Evenstar' -- see artifact list N:564:& Jewel~ G:":w I:40:54 W:40:0:3:25000 F:INSTA_ART angband-v3.3.2/lib/edit/p_race.txt0000644000175000017500000000567011651552410016304 0ustar chriscchrisc# File: p_race.txt # This file is used to initialize the "player race" information for Angband. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # === Understanding p_race.txt === # Format: # N:race number:race name # S:str:int:wis:dex:con:chr # R:dis:dev:sav:stl:srh:fos:thn:thb:throw:dig # X:hitdie:expbase:infra # I:history:agebase:agemod # H:hgtmale:modhgtmale:hgtfemale:modhgtfemale # W:wgtmale:modwgtmale:wgtfemale:modwgtfemale # F:racial flags # C:classes (numeric) # 'N' indicates the beginning of an entry. The serial number must # increase for each new race. # 'S' is for the stat modifiers - strength, intelligence, wisdom, # dexterity, constitution, charisma. # 'R' is for the base skills - disarming, magic devices, saving throws, # stealth, searching ability, searching frequency, to hit (melee), # to hit (bows), to hit (throwing), digging. # 'X' is for extra info - max. hitpoints gained per level, experience # factor in percent, range of infravision in 10 feets, digging bonus. # 'I' is for info - starting point of the player history, base age, # random age modifier. # 'H' is height info - base height (males), mod height (males), # base height (females), mod height (females). # 'W' is weight info - base weight (males), mod weight (males), # base weight (females), mod weight (females). # 'F' is for racial flags (item-style). # 'Y' is for racial flags (new-style). # 'C' is for class choices. # Version stamp (required) V:3.0.11 N:0:Human S:0:0:0:0:0:0 R:0:0:0:0:0:10:0:0:0:0 X:10:100:0 I:1:14:6 H:72:6:66:4 W:180:25:150:20 C:0|1|2|3|4|5 N:1:Half-Elf S:0:1:-1:1:-1:1 R:2:3:3:1:6:11:-1:5:5:0 X:10:110:2 I:4:24:16 H:66:6:62:6 W:130:15:100:10 F:SUST_DEX C:0|1|2|3|4|5 N:2:Elf S:-1:2:-1:1:-2:1 R:5:6:6:3:8:12:-5:15:15:0 X:9:120:3 I:5:75:75 H:60:4:54:4 W:100:6:80:6 F:SUST_DEX | RES_LIGHT C:0|1|3|4 N:3:Hobbit S:-2:2:1:3:2:1 R:15:18:18:4:12:15:-10:20:20:0 X:7:110:4 I:10:21:12 H:36:3:33:3 W:60:3:50:3 F:HOLD_LIFE Y:KNOW_MUSHROOM C:0|3|4 N:4:Gnome S:-1:2:0:2:1:-2 R:10:22:12:3:6:13:-8:12:12:0 X:8:125:4 I:13:50:40 H:42:3:39:3 W:90:6:75:3 F:FREE_ACT Y:KNOW_ZAPPER C:0|1|2|3 N:5:Dwarf S:2:-3:2:-2:2:-3 R:2:9:9:-1:7:10:15:0:0:40 X:11:120:5 I:16:35:15 H:48:3:46:3 W:150:10:120:10 F:RES_BLIND Y:SEE_ORE C:0|2|5 N:6:Half-Orc S:2:-1:0:0:1:-4 R:-3:-3:-3:-1:0:7:12:-5:-5:0 X:10:110:3 I:19:11:4 H:66:1:62:1 W:150:5:120:5 F:RES_DARK C:0|2|3 N:7:Half-Troll S:4:-4:-2:-4:3:-6 R:-5:-8:-8:-2:-1:5:20:-10:-10:0 X:12:120:3 I:21:20:10 H:96:10:84:8 W:250:50:225:40 F:SUST_STR | REGEN C:0|2 N:8:Dunadan S:1:2:2:2:3:2 R:4:5:5:2:3:13:15:10:10:0 X:10:180:0 I:1:50:20 H:82:5:78:6 W:190:20:180:15 F:SUST_CON C:0|1|2|4|5 N:9:High-Elf S:1:3:-1:3:1:5 R:4:20:20:3:3:14:10:25:25:0 X:10:200:4 I:7:100:30 H:90:10:82:10 W:190:20:180:15 F:RES_LIGHT | SEE_INVIS C:0|1|2|4 N:10:Kobold S:-1:-1:0:2:2:-2 R:10:5:0:4:15:15:-5:10:10:0 X:8:115:5 I:23:15:10 H:38:4:36:3 W:70:5:60:4 F:RES_POIS C:0|2|3|4 angband-v3.3.2/lib/edit/terrain.txt0000644000175000017500000001742711651552410016522 0ustar chriscchrisc# File: terrain.txt # This file is used to initialize the "terrain feature" information for # the Angband game. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # Note that the terrain feature are grouped into very regular groups, # such that each of the bits in the feature type conveys information. # Note that terrain feature zero contains the "darkness" picture. # === Understanding terrain.txt === # N : serial number : terrain name # G : symbol : color # M : feature to mimic # P : display priority on mini-map # F : terrain flags # X : lockedness : jammedness : shop number : digging # E : effect on entry # N' indicates the beginning of an entry. The serial number must # increase for each new item. # 'G' is for graphics - symbol, color, and display priority. # There are 16 colors, as follows: # D - Dark Gray w - White s - Gray o - Orange # r - Red g - Green b - Blue u - Brown # d - Black W - Light Gray v - Violet y - Yellow # R - Light Red G - Light Green B - Light Blue U - Light Brown # 'M' is the index of a feature to mimic. # 'F' is for terrain flags. # 'E' is for entry effects. See list-effects.h. # Version stamp (required) V:3.0.11 # 0x00 --> N:0: G: :w P:2 F:MWALK | MPASS | LOOK | BORING # 0x01 --> open floor N:1:open floor G:.:w P:5 F:PWALK | PPASS | MWALK | MPASS | LOOK | BORING # 0x02 --> invisible trap (drawn as open floor) N:2:invisible trap G:.:w M:1 P:5 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP | HIDDEN | BORING # 0x03 --> glyph of warding N:3:glyph of warding G:;:y P:20 F:PWALK | PPASS | LOOK # 0x04 --> open door N:4:open door G:':U P:15 F:PWALK | PPASS | MWALK | MPASS | LOOK # 0x05 --> broken door N:5:broken door G:':u P:15 F:PWALK | PPASS | MWALK | MPASS | LOOK # 0x06 --> up stairs (perm) N:6:up staircase G:<:w P:25 F:PWALK | PPASS | MWALK | MPASS | LOOK | EXIT_UP # 0x07 --> down stairs (perm) N:7:down staircase G:>:w P:25 F:PWALK | PPASS | MWALK | MPASS | LOOK | EXIT_DOWN # 0x08 --> shop -- general store (perm) N:8:General Store G:1:U P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:1:0 # 0x09 --> shop -- armoury (perm) N:9:Armoury G:2:s P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:2:0 # 0x0A --> shop -- weapon shop (perm) N:10:Weapon Smiths G:3:w P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:3:0 # 0x0B --> shop -- temple (perm) N:11:Temple G:4:g P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:4:0 # 0x0C --> shop -- alchemist (perm) N:12:Alchemy Shop G:5:b P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:5:0 # 0x0D --> shop -- magic shop (perm) N:13:Magic Shop G:6:r P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:6:0 # 0x0E --> shop -- black market (perm) N:14:Black Market G:7:D P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:7:0 # 0x0F --> shop -- home (perm) N:15:Home G:8:y P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | PERM | SHOP X:0:0:8:0 # 0x10 --> visible trap -- trap door N:16:trap door G:^:w P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_DOOR # 0x11 --> visible trap -- open pit N:17:pit G:^:s P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_PIT # 0x12 --> visible trap -- spiked pit N:18:pit G:^:s P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_PIT_SPIKES # 0x13 --> visible trap -- poison pit N:19:pit G:^:s P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_PIT_POISON # 0x14 --> visible trap -- rune -- summon N:20:strange rune G:^:B P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_RUNE_SUMMON # 0x15 --> visible trap -- rune -- teleport N:21:strange rune G:^:o P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_RUNE_TELEPORT # 0x16 --> visible trap -- spot -- fire N:22:discolored spot G:^:u P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_SPOT_FIRE # 0x17 --> visible trap -- spot -- acid N:23:discolored spot G:^:u P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_SPOT_ACID # 0x18 --> visible trap -- dart -- slow N:24:dart trap G:^:r P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_DART_SLOW # 0x19 --> visible trap -- dart -- lose str N:25:dart trap G:^:r P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_DART_LOSE_STR # 0x1A --> visible trap -- dart -- lose dex N:26:dart trap G:^:r P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_DART_LOSE_DEX # 0x1B --> visible trap -- dart -- lose con N:27:dart trap G:^:r P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_DART_LOSE_CON # 0x1C --> visible trap -- gas -- blind N:28:gas trap G:^:g P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_GAS_BLIND # 0x1D --> visible trap -- gas -- confuse N:29:gas trap G:^:g P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_GAS_CONFUSE # 0x1E --> visible trap -- gas -- poison N:30:gas trap G:^:g P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_GAS_POISON # 0x1F --> visible trap -- gas -- sleep N:31:gas trap G:^:g P:20 F:PWALK | PPASS | MWALK | MPASS | LOOK | TRAP E:TRAP_GAS_SLEEP # 0x2x --> locked door (power 0) N:32:door G:+:U P:17 M:32 F:DOOR X:0:0:0:0 # 0x2x --> locked door (power 1) N:33:locked door G:+:U P:17 M:32 F:DOOR X:1:0:0:0 # 0x2x --> locked door (power 2) N:34:locked door G:+:U P:17 M:32 F:DOOR X:2:0:0:0 # 0x2x --> locked door (power 3) N:35:locked door G:+:U P:17 M:32 F:DOOR X:3:0:0:0 # 0x2x --> locked door (power 4) N:36:locked door G:+:U P:17 M:32 F:DOOR X:4:0:0:0 # 0x2x --> locked door (power 5) N:37:locked door G:+:U P:17 M:32 F:DOOR X:5:0:0:0 # 0x2x --> locked door (power 6) N:38:locked door G:+:U P:17 M:32 F:DOOR X:6:0:0:0 # 0x2x --> locked door (power 7) N:39:locked door G:+:U P:17 M:32 F:DOOR X:7:0:0:0 # 0x2x --> jammed door (power 0) N:40:jammed door G:+:U P:17 M:32 F:DOOR X:0:0:0:0 # 0x2x --> jammed door (power 1) N:41:jammed door G:+:U P:17 M:32 F:DOOR X:0:1:0:0 # 0x2x --> jammed door (power 2) N:42:jammed door G:+:U P:17 M:32 F:DOOR X:0:2:0:0 # 0x2x --> jammed door (power 3) N:43:jammed door G:+:U P:17 M:32 F:DOOR X:0:3:0:0 # 0x2x --> jammed door (power 4) N:44:jammed door G:+:U P:17 M:32 F:DOOR X:0:4:0:0 # 0x2x --> jammed door (power 5) N:45:jammed door G:+:U P:17 M:32 F:DOOR X:0:5:0:0 # 0x2x --> jammed door (power 6) N:46:jammed door G:+:U P:17 M:32 F:DOOR X:0:6:0:0 # 0x2x --> jammed door (power 7) N:47:jammed door G:+:U P:17 M:32 F:DOOR X:0:7:0:0 # 0x30 --> secret door N:48:secret door G:#:w P:10 M:56 F:HIDDEN # 0x31 --> pile of rubble N:49:pile of rubble G:::w P:13 F:DIG X:0:0:0:1 # 0x32 --> magma vein N:50:magma vein G:%:s P:12 F:DIG X:0:0:0:2 # 0x33 --> quartz vein N:51:quartz vein G:%:w P:11 F:DIG X:0:0:0:3 # 0x34 --> magma vein + treasure N:52:magma vein G:%:s P:12 M:50 F:DIG X:0:0:0:2 # 0x35 --> quartz vein + treasure N:53:quartz vein G:%:w P:11 M:51 F:DIG X:0:0:0:3 # 0x36 --> magma vein + known treasure N:54:magma vein with treasure G:*:o P:19 F:DIG X:0:0:0:2 # 0x37 --> quartz vein + known treasure N:55:quartz vein with treasure G:*:o P:19 F:DIG X:0:0:0:3 # 0x38 --> granite wall -- basic N:56:granite wall G:#:w P:10 F:DIG X:0:0:0:4 # 0x39 --> granite wall -- inner N:57:granite wall G:#:w P:10 M:56 F:DIG X:0:0:0:4 # 0x3A --> granite wall -- outer N:58:granite wall G:#:w P:10 M:56 F:DIG X:0:0:0:4 # 0x3B --> granite wall -- solid N:59:granite wall G:#:w P:10 M:56 F:DIG X:0:0:0:4 # 0x3C --> permanent wall -- basic (perm) N:60:permanent wall G:#:u P:10 F:PERM # 0x3D --> permanent wall -- inner (perm) N:61:permanent wall G:#:u P:10 M:60 F:PERM # 0x3E --> permanent wall -- outer (perm) N:62:permanent wall G:#:u P:10 M:60 F:PERM # 0x3F --> permanent wall -- solid (perm) N:63:permanent wall G:#:u P:10 M:60 F:PERM angband-v3.3.2/lib/edit/p_class.txt0000644000175000017500000002240111651552410016466 0ustar chriscchrisc# File: p_class.txt # This file is used to initialize the "player class" information for Angband. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # === Understanding p_class.txt === # Format: # N:class number:class name # S:str:int:wis:dex:con:chr # C:dis:dev:sav:stl:srh:fos:thn:thb:throw:dig # X:dis:dev:sav:stl:srh:fos:thn:thb:throw:dig # I:mhp:exp:sense_base:sense_div # A:max_attacks:min_weight:att_multiply # M:spellbook tval:spell-stat:first-level:max weight # B:spell number:level:mana:fail:exp # T:title # E:tval:sval:min:max # F:class flags # 'N' indicates the beginning of an entry. The serial number must # increase for each new class. # 'S' is for the stat modifiers - strength, intelligence, wisdom, # dexterity, constitution, charisma. # 'C' is for the base skills - disarming, magic devices, saving throws, # stealth, searching ability, searching frequency, to hit (normal), # to hit (bows), to hit (throwing), digging. # 'X' is for the skill modifiers (as above). The modifiers are added to # the base skill every ten levels. # 'I' is for extra info - max. hitpoints gained per level, experience # factor in percent, base chance for pseudo-id (smaller is better), # level dependent divisor for the pseudo-id chance. # 'A' is for attack info - maximum possible number of attacks, minimum # weapon weight for calculating the number of attacks, multiplier for # attack calculations. # 'M' is for magic info - tval of the used spellbook, number of the # spell-stat, level of the first spell, weight that hurts spells. # 'B' is for spell/prayer info - number of the spell, level, mana # required, fail-rate, experience for first casting. # 'T' is for class titles. # 'E' is for starting equipment - tval of the item, sval of the item, # minimum amount, maximum amount. # 'F' is for class flags. # Version stamp (required) V:3.0.11 N:0:Warrior S:5:-2:-2:2:2:-1 C:25:18:18:1:14:2:70:55:55:0 X:10:7:10:0:0:0:45:45:45:0 I:9:0:7000:40 A:6:30:5 M:0:0:0:0 E:food:Ration~ of Food:3:7 E:light:Wooden Torch~:3:7 E:potion:Berserk Strength:1:1 E:sword:Short Sword~:1:1 E:soft armour:Soft Leather Armour~:1:1 E:scroll:Word of Recall:1:1 F:BRAVERY_30 | PSEUDO_ID_IMPROV T:Rookie T:Soldier T:Swordsman T:Swashbuckler T:Veteran T:Myrmidon T:Commando T:Champion T:Hero T:Lord N:1:Mage S:-5:3:0:1:-2:1 C:30:36:30:2:16:20:34:20:20:0 X:7:13:9:0:0:0:15:15:15:0 I:0:30:170000:5 A:4:40:2 M:90:1:1:300 E:food:Ration~ of Food:3:7 E:light:Wooden Torch~:3:7 E:magic book:[Magic for Beginners]:1:1 E:sword:Dagger~:1:1 E:scroll:Word of Recall:1:1 F:CUMBER_GLOVE | ZERO_FAIL | BEAM | CHOOSE_SPELLS T:Novice T:Apprentice T:Trickster T:Illusionist T:Spellbinder T:Evoker T:Conjurer T:Warlock T:Sorcerer T:Arch-Mage B:0:1:1:22:4 B:1:1:1:23:4 B:2:1:2:24:4 B:3:1:2:26:4 B:4:3:3:25:2 B:5:99:0:0:0 B:6:99:0:0:0 B:8:11:7:25:6 B:9:15:6:40:6 B:10:30:10:70:10 B:11:3:2:27:3 B:12:5:4:30:4 B:13:5:4:30:4 B:14:7:5:30:4 B:15:7:10:50:5 B:16:7:3:40:6 B:17:15:4:50:8 B:18:10:3:50:7 B:19:5:5:30:6 B:20:7:6:30:5 B:21:9:7:44:8 B:22:13:9:40:12 B:23:20:18:60:20 B:24:24:20:50:20 B:25:5:5:35:4 B:26:9:7:45:8 B:27:99:0:0:0 B:28:99:0:0:0 B:29:25:12:65:10 B:30:7:6:35:5 B:31:17:9:50:7 B:32:23:12:60:8 B:33:28:17:65:20 B:34:30:25:75:15 B:35:11:7:45:9 B:36:16:5:40:6 B:37:20:10:50:10 B:38:20:5:50:8 B:39:25:7:50:6 B:40:25:15:60:24 B:41:25:15:80:30 B:42:33:21:80:35 B:43:38:15:90:40 B:44:10:5:50:10 B:45:10:5:50:10 B:46:25:10:45:20 B:47:28:20:65:30 B:48:32:24:75:30 B:49:36:60:70:40 B:50:9:7:75:10 B:51:99:0:0:0 B:52:99:0:0:0 B:53:30:30:95:100 B:54:32:60:95:120 B:55:19:6:55:8 B:56:20:7:70:20 B:57:26:9:65:12 B:58:27:11:75:24 B:59:30:45:95:25 B:60:30:14:85:34 B:61:35:75:90:100 B:62:35:20:60:25 B:63:42:16:95:200 N:2:Priest S:-1:-3:3:-1:0:2 C:25:30:32:2:16:8:48:35:35:0 X:7:10:12:0:0:0:20:20:20:0 I:2:20:15000:40 A:4:35:3 M:91:2:1:350 E:food:Ration~ of Food:3:7 E:light:Wooden Torch~:3:7 E:prayer book:[Beginners Handbook]:1:1 E:hafted:Mace~:1:1 E:potion:Cure Serious Wounds:2:2 E:scroll:Word of Recall:1:1 F:BLESS_WEAPON | ZERO_FAIL | PSEUDO_ID_IMPROV T:Believer T:Acolyte T:Adept T:Evangelist T:Priest T:Curate T:Canon T:Bishop T:Prophet T:Patriarch B:0:1:1:10:4 B:1:1:2:15:4 B:2:1:2:20:4 B:3:1:2:5:4 B:4:3:2:25:1 B:5:3:3:27:2 B:7:3:3:28:4 B:8:5:4:29:3 B:9:5:4:30:4 B:10:5:4:32:4 B:11:5:5:34:4 B:12:7:5:36:3 B:13:7:5:38:4 B:14:7:6:38:5 B:15:7:7:38:5 B:16:9:6:38:4 B:17:9:7:40:4 B:18:9:7:38:4 B:19:11:8:42:4 B:20:11:8:42:4 B:21:11:9:55:5 B:22:13:10:45:4 B:23:13:11:45:4 B:24:15:12:50:5 B:25:15:14:50:5 B:26:17:14:55:7 B:27:21:16:60:7 B:28:25:20:70:12 B:29:33:55:90:15 B:30:39:32:95:20 B:31:3:3:50:2 B:32:10:10:80:20 B:33:20:20:80:20 B:34:25:40:80:150 B:35:35:50:80:230 B:36:15:5:50:25 B:37:17:7:60:45 B:38:30:50:80:130 B:39:35:70:90:230 B:40:35:70:90:250 B:41:15:7:70:25 B:42:20:10:75:60 B:43:25:25:80:250 B:44:35:35:80:115 B:45:45:60:75:250 B:46:5:6:50:40 B:47:15:20:80:25 B:48:25:40:80:160 B:49:35:50:80:230 B:50:37:60:85:250 B:51:45:95:85:250 B:52:3:3:50:6 B:53:10:10:50:8 B:54:20:20:80:16 B:55:30:40:75:133 B:56:35:50:75:11 B:57:40:60:75:250 B:58:99:0:0:0 B:59:99:0:0:0 B:60:99:0:0:0 B:61:99:0:0:0 B:62:99:0:0:0 B:63:99:0:0:0 N:3:Rogue S:2:1:-2:3:1:-1 C:45:32:28:5:32:24:60:66:66:0 X:15:10:10:0:0:0:40:30:30:0 I:6:25:10000:40 A:5:30:4 M:90:1:5:350 E:food:Ration~ of Food:3:7 E:light:Wooden Torch~:3:7 E:magic book:[Magic for Beginners]:1:1 E:sword:Short Sword~:1:1 E:soft armour:Soft Leather Armour~:1:1 E:scroll:Word of Recall:1:1 F:CUMBER_GLOVE | CHOOSE_SPELLS | PSEUDO_ID_IMPROV T:Vagabond T:Cutpurse T:Footpad T:Robber T:Burglar T:Filcher T:Sharper T:Rogue T:Thief T:Master Thief B:0:99:0:0:0 B:1:5:1:50:1 B:2:7:2:55:1 B:3:9:3:60:1 B:4:8:3:50:1 B:5:99:0:0:0 B:6:10:3:60:1 B:8:18:18:60:2 B:9:20:11:50:4 B:10:27:10:50:10 B:11:21:12:50:10 B:12:99:0:0:0 B:13:15:6:75:1 B:14:19:8:85:1 B:15:20:10:70:20 B:16:99:0:0:0 B:17:99:0:0:0 B:18:99:0:0:0 B:19:14:7:60:2 B:20:23:10:95:1 B:21:24:11:70:1 B:22:17:7:30:15 B:23:99:0:0:0 B:24:25:12:40:25 B:25:21:9:90:1 B:26:25:12:95:1 B:27:26:15:30:40 B:28:28:20:60:60 B:29:32:25:70:6 B:30:22:9:50:1 B:31:28:20:70:2 B:32:31:25:70:3 B:33:25:20:60:20 B:34:36:40:80:18 B:35:99:0:0:0 B:36:35:25:80:50 B:37:99:0:0:0 B:38:25:20:60:15 B:39:24:15:80:10 B:40:29:20:70:20 B:41:99:0:0:0 B:42:99:0:0:0 B:43:99:0:0:0 B:44:16:12:50:40 B:45:19:12:50:40 B:46:30:25:75:60 B:47:31:30:85:80 B:48:34:20:75:80 B:49:99:0:0:0 B:50:27:15:99:1 B:51:31:50:95:90 B:52:33:55:90:90 B:53:35:40:95:100 B:54:37:60:80:120 B:55:99:0:0:0 B:56:99:0:0:0 B:57:99:0:0:0 B:58:99:0:0:0 B:59:99:0:0:0 B:60:99:0:0:0 B:61:99:0:0:0 B:62:99:0:0:0 B:63:99:0:0:0 N:4:Ranger S:2:2:0:1:1:1 C:30:32:28:3:24:16:56:72:72:0 X:8:10:10:0:0:0:30:45:45:0 I:4:30:20000:40 A:5:35:4 M:90:1:3:400 E:food:Ration~ of Food:3:7 E:light:Wooden Torch~:3:7 E:magic book:[Magic for Beginners]:1:1 E:sword:Dagger~:1:1 E:bow:Short Bow~:1:1 E:arrow:Arrow~:15:20 E:scroll:Word of Recall:1:1 F:CUMBER_GLOVE | EXTRA_SHOT | CHOOSE_SPELLS | PSEUDO_ID_IMPROV T:Runner T:Strider T:Scout T:Courser T:Tracker T:Guide T:Explorer T:Pathfinder T:Ranger T:Ranger Lord B:0:3:1:30:1 B:1:3:2:35:2 B:2:3:2:35:2 B:3:5:3:35:1 B:4:5:4:45:2 B:5:5:3:40:1 B:6:99:0:0:0 B:8:23:25:90:3 B:9:25:17:50:4 B:10:35:20:70:10 B:11:7:5:40:3 B:12:9:7:40:3 B:13:7:6:40:2 B:14:11:8:40:3 B:15:15:18:80:10 B:16:15:12:50:4 B:17:20:16:50:6 B:18:25:20:60:3 B:19:9:8:45:3 B:20:13:11:55:4 B:21:15:13:50:4 B:22:20:17:20:25 B:23:30:28:60:16 B:24:32:32:50:40 B:25:11:9:45:3 B:26:17:17:55:3 B:27:18:15:30:40 B:28:23:30:80:35 B:29:33:25:75:4 B:30:13:10:45:3 B:31:25:21:65:3 B:32:31:25:70:3 B:33:34:27:60:15 B:34:35:35:75:16 B:35:21:19:60:3 B:36:99:0:0:0 B:37:99:0:0:0 B:38:22:19:60:6 B:39:23:20:60:4 B:40:32:30:70:12 B:41:99:0:0:0 B:42:37:30:95:30 B:43:99:0:0:0 B:44:8:15:50:30 B:45:8:15:50:30 B:46:26:25:75:50 B:47:31:40:85:70 B:48:35:30:75:80 B:49:40:75:80:80 B:50:29:17:90:4 B:51:33:45:90:50 B:52:34:50:90:60 B:53:35:50:95:115 B:54:31:60:95:180 B:55:27:21:65:6 B:56:30:24:70:6 B:57:34:28:80:9 B:58:35:35:70:10 B:59:99:0:0:0 B:60:36:45:80:35 B:61:99:0:0:0 B:62:99:0:0:0 B:63:99:0:0:0 N:5:Paladin S:3:-3:1:0:2:2 C:20:24:25:1:12:2:68:40:40:0 X:7:10:11:0:0:0:35:30:30:0 I:6:35:60000:40 A:5:30:5 M:91:2:1:400 E:food:Ration~ of Food:3:7 E:light:Wooden Torch~:3:7 E:prayer book:[Beginners Handbook]:1:1 E:sword:Broad Sword~:1:1 E:scroll:Protection from Evil:1:1 E:scroll:Word of Recall:1:1 F:PSEUDO_ID_IMPROV T:Gallant T:Keeper T:Protector T:Defender T:Warder T:Knight T:Guardian T:Chevalier T:Paladin T:Paladin Lord B:0:1:1:30:4 B:1:2:2:35:4 B:2:3:3:35:4 B:3:5:3:15:4 B:4:5:4:35:4 B:5:7:5:40:3 B:7:9:7:40:3 B:8:9:7:40:3 B:9:9:8:40:3 B:10:11:9:40:3 B:11:11:10:45:3 B:12:11:10:45:3 B:13:13:10:45:3 B:14:13:11:45:4 B:15:15:13:45:4 B:16:15:15:50:4 B:17:17:15:50:4 B:18:17:15:50:4 B:19:19:15:50:4 B:20:19:15:50:4 B:21:21:17:50:3 B:22:23:17:50:3 B:23:25:20:50:3 B:24:27:21:50:3 B:25:29:22:50:3 B:26:31:24:60:3 B:27:33:28:60:3 B:28:35:32:70:4 B:29:99:0:0:0 B:30:99:0:0:0 B:31:5:5:50:1 B:32:15:15:80:12 B:33:25:25:80:16 B:34:30:15:80:135 B:35:99:0:0:0 B:36:17:15:50:25 B:37:23:25:60:35 B:38:99:0:0:0 B:39:45:80:90:250 B:40:99:0:0:0 B:41:20:13:70:20 B:42:99:0:0:0 B:43:30:35:80:200 B:44:40:40:80:100 B:45:99:0:0:0 B:46:10:16:50:20 B:47:25:30:80:15 B:48:99:0:0:0 B:49:40:70:80:200 B:50:42:80:85:250 B:51:47:95:85:250 B:52:7:7:50:2 B:53:20:20:50:4 B:54:25:25:80:12 B:55:35:50:75:115 B:56:40:60:75:10 B:57:99:0:0:0 B:58:99:0:0:0 B:59:99:0:0:0 B:60:99:0:0:0 B:61:99:0:0:0 B:62:99:0:0:0 B:63:99:0:0:0 angband-v3.3.2/lib/edit/names.txt0000644000175000017500000003320511651552410016151 0ustar chriscchrisc# File: names.txt # This file is used to initialize the random name fragments for the game. # Do not modify this file unless you know exactly what you are doing # unless you wish to risk possible system crashes and broken savefiles. # The code *doesn't* pick a name randomly from this list. What it does # is build up a set of probabilities based on the list. For example, if # your list has... # aaron # alice # bob # fred # The code will read this and decide that the start letter is: # A (50% chance) # B (25% chance) # F (25% chance) # It will also determine that an 'a' has a 33% chance of being followed # by another 'a' (as in "aaron"), a 33% chance of being followed by an # 'r' (as in "aaron", and a 33% chance of being followed by an "l" (as # in "alice") # A 'b' has a 50% chance of being followed by an "o" (as in "bob") and a # 50% chance of ending the word (as in "bob"). # A 'c' is always followed by an 'e' (as in "alice"). # And so forth... # So when it wants to produce a random name, it starts by picking a # random starting letter from its list (based on their chances), and # then keeps adding another random letter based on the chances of the # current last letter until it gets to a word end. # With just a few words, it's rubbish. With that short list of four # names it would always follow an 'l' with an 'i' and an 'i' with a 'c' # and a 'c' with an 'e', for example. But with lots of words to use as a # basis for its probabilities - particularly since those words will show # various common letter patterns (i.e. syllables), it's remarkably good # at coming up with words that look as though they should be real words # in the language that the list was written in. # For example, the main list in this file is a list of names of Tolkien # characters. Based on these, the code comes up with random names that # also sound plausibly Tolkien-ish. # If you put in a big list of English boys' names, it would come up with # random names that sound like they could be English boys' names. If you # put in Latin words, it would come up with words that sound Latin (as # it does when choosing the text for scrolls). # Format: # N: section type (1 for Tolkeinish names, 2 for scroll names) # D: data # Tolkein names N:1 D:adanedhel D:adurant D:aeglos D:aegnor D:aelin D:aeluin D:aerandir D:aerin D:agarwaen D:aglareb D:aglarond D:aglon D:ainulindale D:ainur D:alcarinque D:aldaron D:aldudenie D:almaren D:alqualonde D:aman D:amandil D:amarie D:amarth D:amlach D:amon D:amras D:amrod D:anach D:anar D:anarion D:ancalagon D:ancalimon D:anarrima D:andor D:andram D:androth D:anduin D:andunie D:anfauglir D:anfauglith D:angainor D:angband D:anghabar D:anglachel D:angrenost D:angrim D:angrist D:angrod D:anguirel D:annael D:annatar D:annon D:annuminas D:apanonar D:aradan D:aragorn D:araman D:aranel D:aranruth D:aranwe D:aras D:aratan D:aratar D:arathorn D:arda D:ardgalen D:aredhel D:arfeiniel D:argonath D:arien D:armenelos D:arminas D:arnor D:aros D:arossiach D:arthad D:arvernien D:arwen D:ascar D:astaldo D:atalante D:atanamir D:atanatari D:atani D:aule D:avallone D:avari D:avathar D:balan D:balar D:balrog D:barad D:baragund D:barahir D:baran D:baranduin D:bar D:bauglir D:beleg D:belegaer D:belegost D:belegund D:beleriand D:belfalas D:belthil D:belthronding D:beor D:beraid D:bereg D:beren D:boromir D:boron D:bragollach D:brandir D:bregolas D:bregor D:brethil D:brilthor D:brithiach D:brithombar D:brithon D:cabed D:calacirya D:calaquendi D:calenardhon D:calion D:camlost D:caragdur D:caranthir D:carcharoth D:cardolan D:carnil D:celeborn D:celebrant D:celebrimbor D:celebrindal D:celebros D:celegorm D:celon D:cirdan D:cirith D:cirth D:ciryatan D:ciryon D:coimas D:corollaire D:crissaegrim D:cuarthal D:cuivienen D:culurien D:curufin D:curufinwe D:curunir D:cuthalion D:daedeloth D:daeron D:dagnir D:dagor D:dagorlad D:dairuin D:danwedh D:delduwath D:denethor D:dimbar D:dimrost D:dinen D:dior D:dirnen D:dolmed D:doriath D:dorlas D:dorthonion D:draugluin D:drengist D:duath D:duinath D:duilwen D:dunedain D:dungortheb D:earendil D:earendur D:earnil D:earnur D:earrame D:earwen D:echor D:echoriath D:ecthelion D:edain D:edrahil D:eglador D:eglarest D:eglath D:eilinel D:eithel D:ekkaia D:elbereth D:eldalie D:eldalieva D:eldamar D:eldar D:eledhwen D:elemmire D:elende D:elendil D:elendur D:elenna D:elentari D:elenwe D:elerrina D:elleth D:elmoth D:elostirion D:elrond D:elros D:elu D:eluchil D:elured D:elurin D:elwe D:elwing D:emeldir D:endor D:engrin D:engwar D:eol D:eonwe D:ephel D:erchamion D:ereb D:ered D:erech D:eregion D:ereinion D:erellont D:eressea D:eriador D:eru D:esgalduin D:este D:estel D:estolad D:ethir D:ezellohar D:faelivrin D:falas D:falathar D:falathrim D:falmari D:faroth D:fauglith D:feanor D:feanturi D:felagund D:finarfin D:finduilas D:fingolfin D:fingon D:finwe D:firimar D:formenos D:fornost D:frodo D:fuin D:fuinur D:gabilgathol D:galad D:galadriel D:galathilion D:galdor D:galen D:galvorn D:gandalf D:gaurhoth D:gelion D:gelmir D:gelydh D:gil D:gildor D:giliath D:ginglith D:girith D:glaurung D:glingal D:glirhuin D:gloredhel D:glorfindel D:golodhrim D:gondolin D:gondor D:gonnhirrim D:gorgoroth D:gorlim D:gorthaur D:gorthol D:gothmog D:guilin D:guinar D:guldur D:gundor D:gurthang D:gwaith D:gwareth D:gwindor D:hadhodrond D:hador D:haladin D:haldad D:haldan D:haldar D:haldir D:haleth D:halmir D:handir D:harad D:hareth D:hathaldir D:hathol D:haudh D:helcar D:helcaraxe D:helevorn D:helluin D:herumor D:herunumen D:hildorien D:himlad D:himring D:hirilorn D:hisilome D:hithaeglir D:hithlum D:hollin D:huan D:hunthor D:huor D:hurin D:hyarmendacil D:hyarmentir D:iant D:iaur D:ibun D:idril D:illuin D:ilmare D:ilmen D:iluvatar D:imlach D:imladris D:indis D:ingwe D:irmo D:isil D:isildur D:istari D:ithil D:ivrin D:kelvar D:kementari D:ladros D:laiquendi D:lalaith D:lamath D:lammoth D:lanthir D:laurelin D:leithian D:legolin D:lembas D:lenwe D:linaewen D:lindon D:lindorie D:loeg D:lomelindi D:lomin D:lomion D:lorellin D:lorien D:lorindol D:losgar D:lothlann D:lothlorien D:luin D:luinil D:lumbar D:luthien D:mablung D:maedhros D:maeglin D:maglor D:magor D:mahanaxar D:mahtan D:maiar D:malduin D:malinalda D:mandos D:manwe D:mardil D:melian D:melkor D:menegroth D:meneldil D:menelmacar D:meneltarma D:minas D:minastir D:mindeb D:mindolluin D:mindon D:minyatur D:mirdain D:miriel D:mithlond D:mithrandir D:mithrim D:mordor D:morgoth D:morgul D:moria D:moriquendi D:mormegil D:morwen D:nahar D:naeramarth D:namo D:nandor D:nargothrond D:narog D:narsil D:narsilion D:narya D:nauglamir D:naugrim D:ndengin D:neithan D:neldoreth D:nenar D:nenning D:nenuial D:nenya D:nerdanel D:nessa D:nevrast D:nibin D:nienna D:nienor D:nimbrethil D:nimloth D:nimphelos D:nimrais D:nimras D:ningloron D:niniel D:ninniach D:ninquelote D:niphredil D:nirnaeth D:nivrim D:noegyth D:nogrod D:noldolante D:noldor D:numenor D:nurtale D:obel D:ohtar D:oiolosse D:oiomure D:olorin D:olvar D:olwe D:ondolinde D:orfalch D:ormal D:orocarni D:orodreth D:orodruin D:orome D:oromet D:orthanc D:osgiliath D:osse D:ossiriand D:palantir D:pelargir D:pelori D:periannath D:quendi D:quenta D:quenya D:radagast D:radhruin D:ragnor D:ramdal D:rana D:rathloriel D:rauros D:region D:rerir D:rhovanion D:rhudaur D:rhun D:rhunen D:rian D:ringil D:ringwil D:romenna D:rudh D:rumil D:saeros D:salmar D:saruman D:sauron D:serech D:seregon D:serinde D:shelob D:silmarien D:silmaril D:silpion D:sindar D:singollo D:sirion D:soronume D:sul D:sulimo D:talath D:taniquetil D:tar D:taras D:tarn D:tathren D:taur D:tauron D:teiglin D:telchar D:telemnar D:teleri D:telperion D:telumendil D:thalion D:thalos D:thangorodrim D:thargelion D:thingol D:thoronath D:thorondor D:thranduil D:thuringwethil D:tilion D:tintalle D:tinuviel D:tirion D:tirith D:tol D:tulkas D:tumhalad D:tumladen D:tuna D:tuor D:turambar D:turgon D:turin D:uial D:uilos D:uinen D:ulairi D:ulmo D:ulumuri D:umanyar D:umarth D:umbar D:ungoliant D:urthel D:uruloki D:utumno D:vaire D:valacirca D:valandil D:valaquenta D:valar D:valaraukar D:valaroma D:valier D:valimar D:valinor D:valinoreva D:valmar D:vana D:vanyar D:varda D:vasa D:vilya D:vingilot D:vinyamar D:voronwe D:wethrin D:wilwarin D:yavanna # Scroll names N:2 D:abracadabra D:piffpaffpouf D:izzy D:wizzy D:letsgetsbusy D:justlikethat D:hocus D:pocus D:shazam D:please D:abduco D:absorbeo D:abutor D:accipio D:acerbus D:adamo D:adeo D:adficio D:adinventitias D:admitto D:adsidue D:adsumo D:advenio D:aeger D:aegrus D:aestivus D:aggero D:ago D:alioqui D:aliquantum D:aliquot D:alter D:ambianis D:amissio D:amoveo D:andegavense D:animus D:antepono D:appareo D:appropinquo D:ara D:arca D:arguo D:articulus D:ascit D:astrum D:atrebatum D:attonbitus D:audax D:aureus D:autus D:averto D:bardus D:bene D:bibo D:bonus D:breviter D:calamitas D:callidus D:canonus D:caput D:caritas D:casso D:catervatim D:causa D:cedo D:celeriter D:centum D:certus D:charisma D:cimentarius D:cito D:clamor D:claustrum D:coerceo D:cogo D:colloco D:coma D:cometissa D:commeo D:commissum D:commoneo D:compatior D:compes D:compositio D:comprovincialis D:concido D:conculco D:condico D:confiteor D:conicio D:conor D:conservo D:consisto D:constans D:construo D:consueta D:consulto D:consuo D:contamino D:contemptio D:contentus D:contineo D:contradictio D:conventus D:copiose D:corrigo D:corturiacum D:crastinus D:creo D:cribrum D:cruentus D:cubicularius D:cui D:culpa D:cum D:cunctus D:cur D:curiosus D:currus D:curto D:custodiae D:debeo D:decimus D:decumbo D:defendo D:defleo D:degenero D:delego D:delinquo D:demonstro D:dens D:depono D:deprecor D:derelinquo D:desino D:despero D:detego D:devito D:diabolus D:didicerat D:differo D:dignitas D:dilabor D:diluculo D:diripio D:disco D:dissimilis D:districtus D:diutius D:divitiae D:dolens D:domesticus D:donec D:duco D:dulcidine D:duro D:ecclesia D:edo D:efficio D:ego D:elemosina D:eluvies D:emineo D:emptio D:epistula D:equus D:erogo D:erudio D:etsi D:ex D:excito D:excuso D:exesto D:exhorresco D:eximo D:exorior D:experior D:expiscor D:explico D:exsequor D:exstinguo D:extra D:fabula D:facio D:faenum D:famulus D:fautor D:felix D:ferme D:festinus D:fides D:fines D:flamma D:fluo D:formo D:fortiter D:foveo D:frequentia D:frugalitas D:fuga D:fultus D:furor D:galea D:genus D:glacialis D:gratia D:gravatus D:gregatim D:hactenus D:harum D:heniis D:hic D:his D:hoc D:honorabilis D:horum D:huic D:humanitas D:hunnam D:iam D:idem D:ignavus D:illa D:illarum D:illi D:illis D:illius D:illorum D:illum D:imitor D:immortalis D:impedito D:impendo D:imperium D:importunus D:ex D:in D:incertus D:includo D:incorruptus D:inda D:indignatio D:induco D:inexpugnabilis D:infecunditas D:infenso D:infero D:inficio D:infigo D:infirmitas D:infitior D:inflatus D:infligo D:infortunatus D:ingemuo D:inicio D:innotesco D:inquis D:insciens D:insidiae D:insperatus D:instructus D:insurgo D:intentio D:interdum D:intueor D:invado D:invetero D:invisus D:ipsemet D:irritus D:ita D:iucunditas D:iugis D:iussu D:jaculum D:juventus D:labiosus D:laboriose D:labruscum D:lacertosus D:lacrimo D:lacto D:laedo D:laetificus D:laevus D:lamentatio D:laqueus D:laudo D:lectus D:lemiscus D:lenitas D:lentesco D:leo D:lesciense D:leto D:levidensis D:levo D:liber D:libere D:licet D:lino D:loci D:longe D:lucerna D:ludio D:lupus D:macero D:maculo D:maero D:magus D:malmundarium D:mandatum D:manus D:matera D:me D:mei D:memor D:mensa D:meridianus D:mica D:millies D:minuo D:miser D:mitigo D:modio D:molestia D:monasteriense D:monstrum D:morior D:moveo D:multo D:mundus D:munus D:mutuo D:nascor D:navigo D:necesse D:nemo D:neque D:niger D:nisi D:nivellensem D:noceo D:non D:nos D:nota D:novus D:nunc D:nusquam D:obdormio D:oblivio D:obviam D:occupo D:odium D:omitto D:onus D:oporotheca D:opportunitatus D:ops D:orator D:orior D:ostium D:pactum D:palam D:par D:parens D:paro D:passer D:patiens D:patruus D:pax D:pecus D:penitus D:per D:percutio D:perfectus D:periclitatus D:periurium D:perpetro D:perseverantia D:persuadeo D:pertineo D:peruro D:pessimus D:pestis D:phasma D:pictoratus D:pirus D:placide D:plagiarius D:plecto D:plico D:pluma D:plures D:pluvia D:polenta D:pomum D:porta D:postea D:postulo D:potius D:praebeo D:praecido D:praeda D:praefinio D:praenuntio D:praesentia D:praesto D:praetereo D:pravitas D:premo D:primitus D:principatus D:prius D:pro D:procedo D:procurator D:proficio D:profor D:progenero D:progressio D:proinde D:prolecto D:proloquor D:prominens D:promitto D:promptu D:promus D:propello D:propositum D:prorsus D:prosum D:proveho D:prudens D:pudendus D:puerilis D:pugnax D:pulex D:pulpa D:pumilius D:punitor D:purgatio D:puteo D:pyropus D:quadrigae D:quae D:quaesitio D:qualiscumque D:quam D:quando D:quantum D:quantuslibet D:quas D:quater D:quercus D:queror D:quibus D:quicquid D:quin D:quisnam D:quo D:quodammodo D:quorum D:radicitus D:recedo D:recolo D:rectum D:redarguo D:redeo D:refectorium D:rego D:relinquo D:remaneo D:rependo D:repeto D:reprehendo D:resisto D:retraho D:revoco D:rigor D:rotomagense D:rursus D:sacrilegus D:saeta D:saluto D:sanctimonialis D:sanitas D:sapienter D:satis D:scaldus D:scelus D:scio D:se D:secundum D:secus D:seductor D:sententia D:sepulchrum D:sermo D:servus D:siccus D:silens D:silva D:simulatio D:singultus D:sive D:soleo D:sollicitudo D:solum D:somnio D:sopor D:speciosus D:spero D:spolium D:statim D:stipes D:studio D:sub D:subseco D:succendo D:suggero D:summissus D:super D:superne D:suppellex D:suppono D:suscito D:tabellae D:tactus D:tam D:tandem D:taruennam D:tempero D:templum D:tendo D:tenus D:teres D:tergum D:tero D:tertius D:textor D:thema D:thymbra D:titulus D:torqueo D:toties D:traiectum D:trellum D:tricesimus D:tristis D:tubineus D:tungris D:turpe D:ubi D:ultra D:undique D:unus D:usque D:ut D:utilitas D:utroque D:vado D:validus D:vehementer D:vendolius D:ventus D:verecundia D:versus D:vesica D:vestio D:vicissitudo D:video D:vilicus D:vindico D:virga D:vis D:vivo D:voco D:volo D:voluntas D:volva D:voro D:vulariter D:vulnus D:vultus angband-v3.3.2/lib/edit/flavor.txt0000644000175000017500000002023511651552410016336 0ustar chriscchrisc# File: flavor.txt # This file is used to initialize the "flavor" information for the Angband game. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # N::: # G:: # D: # To see how many items are in here vs. those required by the number of # objects in object.txt, the following bash script may be useful: # for i in 40 45 55 65 66 70 75 80; do # X=`grep "I:$i" object.txt|wc -l` # Y=`grep $i\$ flavor.txt | wc -l` # echo "tval $i: in object, $X, in flavor, $Y" # done # Version stamp (required) V:3.0.11 ##### Rings ##### # Fixed: the One Ring N:1:45:55 G:=:y D:Plain Gold N:2:45 G:=:g D:Alexandrite N:3:45 G:=:v D:Amethyst N:4:45 G:=:B D:Aquamarine N:5:45 G:=:B D:Azurite N:6:45 G:=:G D:Beryl N:7:45 G:=:r D:Bloodstone N:8:45 G:=:w D:Calcite N:9:45 G:=:r D:Carnelian N:10:45 G:=:s D:Corundum N:11:45 G:=:w D:Diamond N:12:45 G:=:g D:Emerald N:13:45 G:=:G D:Fluorite N:14:45 G:=:r D:Garnet N:15:45 G:=:W D:Granite N:16:45 G:=:G D:Jade N:17:45 G:=:u D:Jasper N:18:45 G:=:b D:Lapis Lazuli N:19:45 G:=:g D:Malachite N:20:45 G:=:w D:Marble N:21:45 G:=:W D:Moonstone N:22:45 G:=:R D:Onyx N:23:45 G:=:W D:Opal N:24:45 G:=:w D:Pearl N:25:45 G:=:W D:Quartz N:26:45 G:=:W D:Quartzite N:27:45 G:=:R D:Rhodonite N:28:45 G:=:r D:Ruby N:29:45 G:=:b D:Sapphire N:30:45 G:=:y D:Tiger Eye N:31:45 G:=:y D:Topaz N:32:45 G:=:B D:Turquoise N:33:45 G:=:U D:Zircon N:34:45 G:=:w D:Platinum N:35:45 G:=:U D:Bronze N:36:45 G:=:y D:Gold N:37:45 G:=:D D:Obsidian N:38:45 G:=:W D:Silver N:39:45 G:=:u D:Tortoise Shell N:40:45 G:=:B D:Mithril N:41:45 G:=:D D:Jet N:42:45 G:=:y D:Engagement N:43:45 G:=:G D:Adamantite ##### Amulets ##### N:44:40 G:":y D:Amber N:45:40 G:":U D:Driftwood N:46:40 G:":w D:Coral N:47:40 G:":W D:Agate N:48:40 G:":w D:Ivory N:49:40 G:":D D:Obsidian N:50:40 G:":w D:Bone N:51:40 G:":U D:Brass N:52:40 G:":U D:Bronze N:53:40 G:":s D:Pewter N:54:40 G:":u D:Tortoise Shell N:55:40 G:":y D:Golden N:56:40 G:":B D:Azure N:57:40 G:":w D:Crystal N:58:40 G:":W D:Silver N:59:40 G:":U D:Copper N:60:40 G:":u D:Carved Oak N:61:40 G:":W D:Dragon Tooth N:62:40 G:":r D:Ruby N:63:40 G:":B D:Mithril N:64:40 G:":G D:Adamant N:65:40 G:":s D:Flint Stone N:66:40 G:":B D:Sea Shell N:67:40 G:":W D:Mother-of-Pearl ##### Staves ##### N:68:55 G:_:U D:Aspen N:69:55 G:_:U D:Balsa N:70:55 G:_:U D:Banyan N:71:55 G:_:U D:Birch N:72:55 G:_:U D:Cedar N:73:55 G:_:U D:Cottonwood N:74:55 G:_:U D:Cypress N:75:55 G:_:U D:Dogwood N:76:55 G:_:U D:Elm N:77:55 G:_:U D:Eucalyptus N:78:55 G:_:U D:Hemlock N:79:55 G:_:U D:Hickory N:80:55 G:_:u D:Ironwood N:81:55 G:_:U D:Locust N:82:55 G:_:u D:Mahogany N:83:55 G:_:u D:Maple N:84:55 G:_:u D:Mulberry N:85:55 G:_:u D:Oak N:86:55 G:_:u D:Pine N:87:55 G:_:r D:Redwood N:88:55 G:_:r D:Rosewood N:89:55 G:_:U D:Spruce N:90:55 G:_:U D:Sycamore N:91:55 G:_:U D:Teak N:92:55 G:_:u D:Walnut N:93:55 G:_:g D:Mistletoe N:94:55 G:_:U D:Hawthorn N:95:55 G:_:U D:Bamboo N:96:55 G:_:W D:Silver N:97:55 G:_:u D:Runed N:98:55 G:_:y D:Golden N:99:55 G:_:s D:Ashen N:100:55 G:_:U D:Gnarled N:101:55 G:_:w D:Ivory N:102:55 G:_:U D:Willow ##### Wands ##### N:103:65 G:-:B D:Aluminium N:104:65 G:-:D D:Cast Iron N:105:65 G:-:w D:Chromium N:106:65 G:-:U D:Copper N:107:65 G:-:y D:Gold N:108:65 G:-:s D:Iron N:109:65 G:-:W D:Magnesium N:110:65 G:-:W D:Molybdenum N:111:65 G:-:U D:Nickel N:112:65 G:-:r D:Rusty N:113:65 G:-:W D:Silver N:114:65 G:-:W D:Steel N:115:65 G:-:W D:Tin N:116:65 G:-:w D:Titanium N:117:65 G:-:w D:Tungsten N:118:65 G:-:W D:Zirconium N:119:65 G:-:W D:Zinc N:120:65 G:-:B D:Aluminum-Plated N:121:65 G:-:U D:Copper-Plated N:122:65 G:-:y D:Gold-Plated N:123:65 G:-:U D:Nickel-Plated N:124:65 G:-:W D:Silver-Plated N:125:65 G:-:W D:Steel-Plated N:126:65 G:-:W D:Tin-Plated N:127:65 G:-:W D:Zinc-Plated N:128:65 G:-:B D:Mithril-Plated N:129:65 G:-:B D:Mithril N:130:65 G:-:u D:Runed N:131:65 G:-:U D:Bronze N:132:65 G:-:U D:Brass N:133:65 G:-:w D:Platinum N:134:65 G:-:s D:Lead N:135:65 G:-:s D:Lead-Plated N:136:65 G:-:w D:Ivory N:137:65 G:-:s D:Pewter ##### Rods ##### N:138:66 G:-:B D:Aluminum N:139:66 G:-:D D:Cast Iron N:140:66 G:-:w D:Chromium N:141:66 G:-:U D:Copper N:142:66 G:-:y D:Gold N:143:66 G:-:s D:Iron N:144:66 G:-:W D:Magnesium N:145:66 G:-:W D:Molybdenum N:146:66 G:-:U D:Nickel N:147:66 G:-:r D:Rusty N:148:66 G:-:W D:Silver N:149:66 G:-:W D:Steel N:150:66 G:-:W D:Tin N:151:66 G:-:w D:Titanium N:152:66 G:-:w D:Tungsten N:153:66 G:-:W D:Zirconium N:154:66 G:-:W D:Zinc N:155:66 G:-:B D:Aluminum-Plated N:156:66 G:-:U D:Copper-Plated N:157:66 G:-:y D:Gold-Plated N:158:66 G:-:U D:Nickel-Plated N:159:66 G:-:W D:Silver-Plated N:160:66 G:-:W D:Steel-Plated N:161:66 G:-:W D:Tin-Plated N:162:66 G:-:W D:Zinc-Plated N:163:66 G:-:B D:Mithril-Plated N:164:66 G:-:B D:Mithril N:165:66 G:-:u D:Runed N:166:66 G:-:U D:Bronze N:167:66 G:-:U D:Brass N:168:66 G:-:w D:Platinum N:169:66 G:-:s D:Lead N:170:66 G:-:s D:Lead-Plated N:171:66 G:-:w D:Ivory N:172:66 G:-:s D:Pewter ##### Mushrooms ##### N:173:80 G:,:b D:Blue N:174:80 G:,:D D:Black N:175:80 G:,:D D:Black Spotted N:176:80 G:,:u D:Brown N:177:80 G:,:b D:Dark Blue N:178:80 G:,:g D:Dark Green N:179:80 G:,:r D:Dark Red N:180:80 G:,:y D:Yellow N:181:80 G:,:W D:Furry N:182:80 G:,:g D:Green N:183:80 G:,:s D:Grey N:184:80 G:,:B D:Light Blue N:185:80 G:,:G D:Light Green N:186:80 G:,:v D:Violet N:187:80 G:,:r D:Red N:188:80 G:,:s D:Slimy N:189:80 G:,:U D:Tan N:190:80 G:,:w D:White N:191:80 G:,:w D:White Spotted N:192:80 G:,:u D:Wrinkled ##### Potions ##### N:193:75 G:!:w D:Clear N:194:75 G:!:U D:Light Brown N:195:75 G:!:g D:Icky Green N:196:75 G:!:B D:Azure N:197:75 G:!:b D:Blue N:198:75 G:!:b D:Blue Speckled N:199:75 G:!:D D:Black N:200:75 G:!:u D:Brown N:201:75 G:!:u D:Brown Speckled N:202:75 G:!:W D:Bubbling N:203:75 G:!:G D:Chartreuse N:204:75 G:!:w D:Cloudy N:205:75 G:!:U D:Copper Speckled N:206:75 G:!:r D:Crimson N:207:75 G:!:B D:Cyan N:208:75 G:!:b D:Dark Blue N:209:75 G:!:g D:Dark Green N:210:75 G:!:r D:Dark Red N:211:75 G:!:y D:Gold Speckled N:212:75 G:!:g D:Green N:213:75 G:!:g D:Green Speckled N:214:75 G:!:s D:Grey N:215:75 G:!:s D:Grey Speckled N:216:75 G:!:W D:Hazy N:217:75 G:!:v D:Indigo N:218:75 G:!:B D:Light Blue N:219:75 G:!:G D:Light Green N:220:75 G:!:r D:Magenta N:221:75 G:!:b D:Metallic Blue N:222:75 G:!:r D:Metallic Red N:223:75 G:!:g D:Metallic Green N:224:75 G:!:v D:Metallic Purple N:225:75 G:!:W D:Misty N:226:75 G:!:o D:Orange N:227:75 G:!:o D:Orange Speckled N:228:75 G:!:R D:Pink N:229:75 G:!:R D:Pink Speckled N:230:75 G:!:v D:Puce N:231:75 G:!:v D:Purple N:232:75 G:!:v D:Purple Speckled N:233:75 G:!:r D:Red N:234:75 G:!:r D:Red Speckled N:235:75 G:!:W D:Silver Speckled N:236:75 G:!:D D:Smoky N:237:75 G:!:o D:Tangerine N:238:75 G:!:v D:Violet N:239:75 G:!:r D:Vermilion N:240:75 G:!:w D:White N:241:75 G:!:y D:Yellow N:242:75 G:!:v D:Violet Speckled N:243:75 G:!:R D:Pungent N:244:75 G:!:r D:Clotted Red N:245:75 G:!:R D:Viscous Pink N:246:75 G:!:y D:Oily Yellow N:247:75 G:!:g D:Gloopy Green N:248:75 G:!:v D:Shimmering N:249:75 G:!:r D:Coagulated Crimson N:250:75 G:!:y D:Yellow Speckled N:251:75 G:!:y D:Gold ##### Scrolls ##### # Scroll names are generated from randomly combined syllables N:252:70 G:?:w N:253:70 G:?:w N:254:70 G:?:w N:255:70 G:?:w N:256:70 G:?:w N:257:70 G:?:w N:258:70 G:?:w N:259:70 G:?:w N:260:70 G:?:w N:261:70 G:?:w N:262:70 G:?:w N:263:70 G:?:w N:264:70 G:?:w N:265:70 G:?:w N:266:70 G:?:w N:267:70 G:?:w N:268:70 G:?:w N:269:70 G:?:w N:270:70 G:?:w N:271:70 G:?:w N:272:70 G:?:w N:273:70 G:?:w N:274:70 G:?:w N:275:70 G:?:w N:276:70 G:?:w N:277:70 G:?:w N:278:70 G:?:w N:279:70 G:?:w N:280:70 G:?:w N:281:70 G:?:w N:282:70 G:?:w N:283:70 G:?:w N:284:70 G:?:w N:285:70 G:?:w N:286:70 G:?:w N:287:70 G:?:w N:288:70 G:?:w N:289:70 G:?:w N:290:70 G:?:w N:291:70 G:?:w N:292:70 G:?:w N:293:70 G:?:w N:294:70 G:?:w N:295:70 G:?:w N:296:70 G:?:w N:297:70 G:?:w N:298:70 G:?:w N:299:70 G:?:w N:300:70 G:?:w N:301:70 G:?:w N:302:70 G:?:w angband-v3.3.2/lib/edit/ego_item.txt0000644000175000017500000004472611651552410016650 0ustar chriscchrisc# File: ego_item.txt # This file is used to initialize the "ego-item" information for Angband. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # The ego-item indexes are defined in "defines.h", and must not be changed # or savefile compatibility will be lost. # Note that several "ego-item" types may share the same "textual name", # such as with "Armor of Resistance" and "Shield of Resistance". # === Understanding ego_item.txt === # N: serial number : ego type # X: rating : xtra # W: depth : rarity : weight : cost # A: commonness : min " to " max # C: to-hit : to-dam : to-ac # M: min to-hit : min to-dam : min to-ac # T: tval : min_sval : max_sval # F: flag | flag | etc. # L: pval : min pval : flag | flag | etc. # Some fields accept randomized numbers of the form "10+2d3M4" where # 10 is the non-variable base, 2d3 is a standard die roll, and # M4 uses the m_bonus function to generate a number between 0 and # 4 according to a normal distribution. All three components are # optional, and the number of dice is optional and assumed to be 1 # when not specified. 10+2d3M4 has the range 12-20. 10+M4 has the # range 10-14. 10+2d3 has the range 12-16. 10+d3 has the range 11-13. # 2d3, d3, M4, 2d3M4, and d3M4 are all acceptable as well. # 'N' indicates the beginning of an entry. The serial number must # increase for each new item. # 'X' is for extra information - Rating affects level feelings. # The xtra value determines random extra flags for the ego-item. # Nothing happens with a value of 0, 1 stands for "one random extra # sustain", 2 is "one random extra resist", and 3 is "one random # extra ability". # 'W' is for extra information. Depth is the depth the object is # normally found at, rarity determines how common the object is, # weight is in tenth-pounds and cost is the items value. # 'A' is for allocation details. commonness determines how common # the object is, min depth is the earliest it is normally found, max # depth is the deepest it is ever found. The "allocation" depth need # not match the depth as specified in the "W:" line. # 'C' is for creation bonuses - to-hit, to-dam, to-ac. # Cursed ego-items will negate the given value. These are # extra bonuses on top of the normal values, and all of these # fields accept randomized values. # 'M' is for minimum values - minimum allowed to-hit, to-dam, to-ac. # The value of 255 is special, meaning "there is no minimum". This # allows zero to be a valid minimum (e.g. for mixed-blessing items). # 'T' is for possible 'tval' and 'sval' values of the base-item. # Up to three 'T' entries are possible for a single object. The # ego-item can only be generated from items of this tval, with sval # in the specified range. # 'F' is for flags not associated with any pval. These are fairly # self-explanatory. As many F: lines may be used as are needed to # specify all the flags and flags are separated by the '|' symbol. # 'L' is for pval, min pval and flags specific to that pval. Each pval # and its flags need a line to themselves. MAX_PVALS is defined in # src/defines.h - you will need to recompile if you wish to change this # value. A pval can take a random value. The min_pval must be present, # but can be 0. As with 'M' above, 255 means "do not apply a minimum". # Version stamp (required) V:3.3.1 # 1 (unused) # 2 (unused) # 3 (unused) ### Body Armor ### N:4:of Resist Acid X:16:0 W:0:1:0:1000 A:20:1 to 60 M:255:0:0 T:36:0:99 T:37:0:6 F:RES_ACID | IGNORE_ACID N:5:of Resist Lightning X:10:0 W:0:1:0:400 A:20:1 to 50 M:255:0:0 T:36:0:99 T:37:0:6 F:RES_ELEC | IGNORE_ELEC N:6:of Resist Fire X:14:0 W:0:1:0:800 A:20:1 to 40 M:255:0:0 T:36:0:99 T:37:0:6 F:RES_FIRE | IGNORE_FIRE N:7:of Resist Cold X:12:0 W:0:1:0:600 A:20:1 to 40 M:255:0:0 T:36:0:99 T:37:0:6 F:RES_COLD | IGNORE_COLD N:8:of Resistance X:20:0 W:0:2:0:12500 A:20:25 to 100 C:0:0:d10 M:255:0:0 T:36:0:99 T:37:0:99 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD N:9:of Elvenkind X:25:2 W:0:4:0:15000 A:2:50 to 127 C:0:0:d10 M:255:0:0 T:36:0:99 T:37:0:99 L:d3:0:STEALTH F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD N:10:of Vulnerability X:0:0 W:0:2:0:0 A:10:10 to 80 C:0:0:d50 M:255:0:0 T:36:0:99 T:37:0:99 F:AGGRAVATE | LIGHT_CURSE ### Robes only ### N:11:of Permanence X:30:2 W:0:4:0:30000 A:10:50 to 127 C:0:0:d20 T:36:2:2 F:SUST_STR | SUST_DEX | SUST_CON | SUST_INT | SUST_WIS | SUST_CHR | F:HOLD_LIFE | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD ### Heavy metal armor only ### N:12:(Dwarven) X:18:0 W:0:4:0:5000 A:5:40 to 127 C:0:0:d15 M:255:0:0 T:37:0:99 F:IGNORE_ACID | IGNORE_FIRE | F:FREE_ACT | HIDE_TYPE L:d2:1:STR L:d2:1:CON L:d2M3:1:INFRA # 13 (unused) # 14 (unused) ### Shields ### N:15:(Dwarven) X:20:0 W:0:4:0:5000 A:20:40 to 127 C:1+M3:1+M3:d5 T:34:3:3 F:IGNORE_ACID | IGNORE_FIRE | F:FREE_ACT | HIDE_TYPE L:d2:1:STR L:d2:1:CON N:16:of Resist Acid X:16:0 W:0:1:0:1000 A:20:1 to 60 T:34:0:99 F:RES_ACID | IGNORE_ACID N:17:of Resist Lightning X:10:0 W:0:1:0:400 A:20:1 to 50 T:34:0:99 F:RES_ELEC | IGNORE_ELEC N:18:of Resist Fire X:14:0 W:0:1:0:800 A:20:1 to 40 T:34:0:99 F:RES_FIRE | IGNORE_FIRE N:19:of Resist Cold X:12:0 W:0:1:0:600 A:20:1 to 40 T:34:0:99 F:RES_COLD | IGNORE_COLD N:20:of Resistance X:20:0 W:0:2:0:12500 A:20:25 to 100 C:0:0:d10 T:34:0:99 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD N:21:of Elvenkind X:25:2 W:0:4:0:18000 A:2:50 to 127 C:0:0:d10 T:34:0:99 L:d3:0:STEALTH F:RES_FIRE | RES_COLD | RES_ACID | RES_ELEC | F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC N:22:of Preservation X:25:2 W:60:4:0:24000 A:2:50 to 127 C:0:0:d20 T:34:0:99 F:RES_DISEN | SUST_STR | SUST_CON | SUST_DEX | HOLD_LIFE | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD N:23:of Vulnerability X:0:0 W:0:2:0:0 A:10:10 to 80 C:0:0:d50 T:34:0:99 F:AGGRAVATE | LIGHT_CURSE ### Crowns and Helms ### N:24:of Intelligence X:13:0 W:0:2:0:500 A:20:5 to 100 T:32:0:99 F:SUST_INT L:d2:0:INT N:25:of Wisdom X:13:0 W:0:2:0:500 A:20:5 to 100 T:32:0:99 F:SUST_WIS L:d2:0:WIS N:26:of Beauty X:8:0 W:0:2:0:1000 A:20:1 to 40 T:32:0:99 F:SUST_CHR L:d4:0:CHR N:27:of the Magi X:15:3 W:0:4:0:7500 A:10:45 to 127 T:33:0:99 F:SUST_INT F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD L:d3:0:INT N:28:of Might X:19:0 W:0:4:0:7500 A:10:45 to 127 T:33:0:99 F:SUST_STR | SUST_DEX | SUST_CON | FREE_ACT | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD L:d3:1:STR L:d3:1:DEX L:d3:1:CON N:29:of Lordliness X:17:3 W:0:2:0:7500 A:20:45 to 100 T:33:0:99 F:SUST_WIS | SUST_CHR | RES_FEAR | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD L:d3:1:WIS L:d2M3:1:CHR N:30:of Seeing X:8:0 W:0:2:0:2000 A:20:10 to 50 T:32:0:99 F:RES_BLIND | SEE_INVIS L:d5:0:SEARCH N:31:of Infravision X:11:0 W:0:2:0:500 A:20:10 to 50 T:32:0:99 F:HIDE_TYPE L:d5:0:INFRA N:32:of Light X:6:0 W:0:2:0:1000 A:20:45 to 70 T:33:0:99 F:LIGHT | RES_LIGHT N:33:of Telepathy X:20:0 W:0:6:0:50000 A:6:20 to 127 T:32:0:99 F:TELEPATHY N:34:of Regeneration X:10:0 W:0:4:0:1500 A:10:1 to 100 T:32:0:99 F:REGEN N:35:of Teleportation X:0:0 W:0:2:0:0 A:10:10 to 80 T:32:0:99 F:TELEPORT | LIGHT_CURSE N:36:of Serenity X:20:0 W:0:6:0:4000 A:6:50 to 127 T:33:0:99 F:RES_SOUND | RES_CONFU | RES_FEAR | RES_STUN N:37:of Night and Day X:18:0 W:35:6:0:4000 A:6:50 to 127 T:33:0:99 F:RES_LIGHT | RES_DARK | LIGHT | SEE_INVIS | RES_BLIND | IGNORE_ACID N:38:of Dullness X:0:0 W:0:2:0:0 A:10:45 to 80 T:33:0:99 F:LIGHT_CURSE L:d5:0:INT | WIS | CHR N:39:of Sickliness X:0:0 W:0:2:0:0 A:10:45 to 80 T:33:0:99 F:LIGHT_CURSE L:d5:0:STR | DEX | CON ### Cloaks ### N:40:of Protection X:10:0 W:0:2:0:1500 A:20:1 to 100 C:0:0:d10 T:35:0:99 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | RES_SHARD N:41:of Stealth X:10:0 W:0:1:0:500 A:20:1 to 55 T:35:0:99 L:d3:0:STEALTH N:42:of Aman X:20:2 W:0:6:0:4000 A:6:30 to 127 C:0:0:d20 T:35:0:99 L:d3:0:STEALTH F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD N:43:of the Magi X:15:3 W:30:3:0:2000 A:10:30 to 100 C:0:0:d4 T:35:0:99 F:SUST_INT | HIDE_TYPE | IGNORE_ACID L:d2:1:INT L:d3:1:STEALTH N:44:of Enveloping X:0:0 W:0:1:0:0 A:10:10 to 80 C:d10:d10:0 T:35:0:99 F:SHOW_MODS | LIGHT_CURSE N:45:of Vulnerability X:0:0 W:0:1:0:0 A:10:10 to 80 C:0:0:d50 T:35:0:99 F:AGGRAVATE | LIGHT_CURSE N:46:of Irritation X:0:0 W:0:1:0:0 A:10:10 to 80 C:d15:d15:0 T:35:0:99 F:AGGRAVATE | SHOW_MODS | LIGHT_CURSE # 47 (unused) ### Gloves ### N:48:of Free Action X:11:0 W:0:4:0:1000 A:20:1 to 60 T:31:0:99 F:FREE_ACT N:49:of Slaying X:17:0 W:0:4:0:1500 A:20:10 to 75 C:d5:d5:0 T:31:0:99 F:SHOW_MODS D:They boost your to-hit and to-dam values. N:50:of Agility X:14:0 W:0:6:0:1000 A:12:20 to 95 T:31:0:99 F:HIDE_TYPE L:d5:0:DEX N:51:of Power X:22:0 W:0:6:0:2500 A:12:30 to 127 C:d5:d5:0 T:31:0:99 F:SHOW_MODS | HIDE_TYPE L:d5:0:STR N:52:of Thievery X:22:0 W:40:12:0:5000 A:8:40 to 127 C:d8:d3:0 T:31:1:1 T:31:5:5 F:SHOW_MODS | FEATHER | FREE_ACT | HIDE_TYPE L:1+M4:1:DEX L:1+d2M3:2:SEARCH N:53:of Combat X:22:0 W:50:12:0:7000 A:5:50 to 127 C:d3:d8:0 T:31:2:4 F:SHOW_MODS | AGGRAVATE | HIDE_TYPE L:d2:1:STR L:d2:1:CON N:54:of Weakness X:0:0 W:0:2:0:0 A:10:10 to 80 T:31:0:99 F:LIGHT_CURSE | HIDE_TYPE L:d10:0:STR N:55:of Clumsiness X:0:0 W:0:2:0:0 A:10:10 to 80 T:31:0:99 F:LIGHT_CURSE | HIDE_TYPE L:d10:0:DEX ### Boots ### N:56:of Slow Descent X:7:0 W:0:5:0:250 A:20:5 to 40 T:30:0:99 F:FEATHER N:57:of Stealth X:16:0 W:0:6:0:500 A:20:15 to 100 T:30:1:2 T:30:6:6 F:HIDE_TYPE L:d3:0:STEALTH N:58:of Free Action X:15:0 W:0:8:0:1000 A:16:10 to 100 F:FREE_ACT T:30:0:99 N:59:of Speed X:25:0 W:0:24:0:100000 A:2:20 to 127 T:30:0:99 F:HIDE_TYPE L:d10:0:SPEED N:60:of Stability X:20:0 W:0:10:0:5000 A:16:15 to 100 T:30:0:99 F:RES_NEXUS | FEATHER N:61:of Elvenkind X:30:0 W:60:30:0:200000 A:3:60 to 127 T:30:2:3 F:HIDE_TYPE | FEATHER | IGNORE_ACID | IGNORE_FIRE L:d4:1:STEALTH L:3+d6:1:SPEED N:62:of Slowness X:0:0 W:0:5:0:0 A:10:10 to 80 T:30:0:99 L:d5:0:SPEED F:LIGHT_CURSE | HIDE_TYPE N:63:of Annoyance X:0:0 W:0:10:0:0 A:10:10 to 80 T:30:0:99 L:d10:0:SPEED | STEALTH F:AGGRAVATE | LIGHT_CURSE | HIDE_TYPE ### Weapons ### N:64:(Holy Avenger) X:30:1 W:0:12:0:20000 A:13:20 to 70 C:d6:d6:d4 T:21:0:99 T:22:0:99 T:23:0:99 L:d4:0:WIS F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | F:SEE_INVIS | BLESSED | RES_FEAR N:65:(Defender) X:25:1 W:0:12:0:15000 A:12:20 to 80 C:d4:d4:d8 T:21:0:99 T:22:0:99 T:23:0:99 F:FREE_ACT | SEE_INVIS | FEATHER | REGEN | F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD L:d4:0:STEALTH N:66:(Blessed) X:20:3 W:0:10:0:5000 A:19:1 to 60 T:21:0:99 T:22:0:99 T:23:0:99 F:BLESSED L:d3:0:WIS N:67:of Gondolin X:30:3 W:30:20:0:25000 A:9:30 to 127 C:d7:d7:0 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_DEMON | SLAY_ORC | SLAY_TROLL | SLAY_DRAGON | F:LIGHT | RES_DARK | SEE_INVIS | FREE_ACT | F:IGNORE_ACID | IGNORE_FIRE N:68:of Westernesse X:20:0 W:0:10:0:20000 A:14:30 to 127 C:d5:d5:0 T:21:0:99 T:22:0:99 T:23:0:99 L:d2:1:STR L:d2:1:DEX L:d2:1:CON F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | F:FREE_ACT | SEE_INVIS N:69:of Extra Attacks X:20:0 W:0:10:0:10000 A:15:30 to 127 T:21:0:99 T:22:0:99 T:23:0:99 F:HIDE_TYPE L:d2:0:BLOWS N:70:of Fury X:30:0 W:40:20:0:20000 A:8:1 to 127 #T:21:12:99 #T:22:10:99 #T:23:16:99 C:d10:d10:0 F:AGGRAVATE | RES_FEAR | HIDE_TYPE | F:IGNORE_ACID | IGNORE_FIRE L:1+d2M2:2:STR L:d2:1:BLOWS # 71 (unused) # The "Branded" weapons (5) N:72:of Acid X:20:0 W:0:20:0:5000 A:11:10 to 100 T:21:0:99 T:22:0:99 T:23:0:99 F:BRAND_ACID | RES_ACID | IGNORE_ACID N:73:of Lightning X:20:0 W:0:15:0:4500 A:10:10 to 100 T:21:0:99 T:22:0:99 T:23:0:99 F:BRAND_ELEC | RES_ELEC | IGNORE_ELEC N:74:of Flame X:15:0 W:0:8:0:3500 A:17:10 to 100 T:21:0:99 T:22:0:99 T:23:0:99 F:BRAND_FIRE | RES_FIRE | IGNORE_FIRE N:75:of Frost X:15:0 W:0:8:0:3000 A:16:10 to 100 T:21:0:99 T:22:0:99 T:23:0:99 F:BRAND_COLD | RES_COLD | IGNORE_COLD N:76:of Venom X:15:0 W:0:8:0:4000 A:18:10 to 100 T:21:0:99 T:22:0:99 T:23:0:99 F:BRAND_POIS # 77 (unused) # 78 (unused) # 79 (unused) # The "Slay" weapons (8) N:80:of Slay Animal X:18:0 W:0:6:0:3000 A:20:1 to 19 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_ANIMAL N:81:of Slay Evil X:18:0 W:0:6:0:3000 A:20:1 to 19 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_EVIL N:82:of Slay Undead X:18:0 W:0:6:0:3500 A:20:4 to 31 T:21:0:18 T:22:0:99 T:23:0:99 F:SLAY_UNDEAD N:83:of Slay Demon X:14:0 W:0:6:0:3500 A:20:6 to 36 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_DEMON N:84:of Slay Orc X:10:0 W:0:6:0:2500 A:20:5 to 14 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_ORC N:85:of Slay Troll X:10:0 W:0:6:0:2500 A:20:16 to 35 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_TROLL N:86:of Slay Giant X:14:0 W:0:6:0:2500 A:20:24 to 38 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_GIANT N:87:of Slay Dragon X:18:0 W:0:6:0:3500 A:20:8 to 38 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_DRAGON # The *Slay* weapons (8) N:88:of *Slay Animal* X:20:0 W:0:20:0:6000 A:20:20 to 60 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_ANIMAL | SLOW_DIGEST L:d2:0:INT N:89:of *Slay Evil* X:20:3 W:0:20:0:5000 A:20:20 to 60 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_EVIL | BLESSED L:d2:0:WIS N:90:of *Slay Undead* X:24:0 W:0:20:0:8000 A:20:32 to 77 T:21:0:18 T:22:0:99 T:23:0:99 F:KILL_UNDEAD | SEE_INVIS L:d2:0:WIS N:91:of *Slay Demon* X:16:0 W:0:20:0:8000 A:20:37 to 77 T:21:0:99 T:22:0:99 T:23:0:99 F:KILL_DEMON | RES_FIRE L:d2:0:INT N:92:of *Slay Orc* X:14:0 W:0:20:0:4000 A:20:15 to 44 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_ORC | SUST_DEX L:d2:0:DEX N:93:of *Slay Troll* X:14:0 W:0:20:0:4000 A:20:36 to 55 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_TROLL | REGEN L:d2:0:STR N:94:of *Slay Giant* X:16:0 W:0:20:0:4000 A:20:39 to 66 T:21:0:99 T:22:0:99 T:23:0:99 F:SLAY_GIANT | SUST_STR L:d2:0:STR N:95:of *Slay Dragon* X:24:0 W:0:20:0:8000 A:20:39 to 88 T:21:0:99 T:22:0:99 T:23:0:99 F:KILL_DRAGON | RES_FEAR L:d2:0:CON ### Lanterns/torches # Not for now -- need to figure out how ID applies #N:96:of Shadows #X:10:0 #W:5:4:0:1000 (imported from NPP) #A:8:10 to 100 #T:39:0:1 #F:HIDE_TYPE | RES_LIGHT #L:d2:0:STEALTH N:97:of Brightness X:10:0 W:0:2:0:2000 A:20:1 to 55 T:39:0:1 F:LIGHT N:98:(Everburning) X:10:0 W:0:3:0:2500 A:12:10 to 100 T:39:1:1 (lanterns only) F:NO_FUEL N:99:of True Sight X:10:0 W:20:8:0:6000 (imported from S) A:4:20 to 127 T:39:1:1 F:RES_BLIND | SEE_INVIS ### Digging Tools N:100:of Digging X:4:0 W:0:1:0:500 A:20:1 to 65 T:20:0:99 F:BRAND_ACID L:d4:1:TUNNEL N:101:of Earthquakes X:8:0 W:20:4:0:3000 A:5:20 to 127 C:d10:d10:0 T:20:0:99 L:d4:1:STR L:d6:1:TUNNEL F:BRAND_ACID | IMPACT | HIDE_TYPE ### Cursed Weapons N:102:of Morgul X:0:0 W:0:5:0:1 A:10:10 to 80 T:21:0:99 T:22:0:99 T:23:0:99 F:SEE_INVIS | AGGRAVATE | HEAVY_CURSE | LIGHT_CURSE | F:HOLD_LIFE | DRAIN_EXP | SLAY_UNDEAD | BRAND_POIS # 103 (unused) ### Missile Launchers ### N:104:of Accuracy X:10:0 W:0:1:0:1000 A:20:5 to 55 C:d15:d5:0 M:15:255:0 T:19:0:99 D:It has no special abilities, but its to-hit value may be unusually D: high. N:105:of Power X:10:0 W:0:1:0:1000 A:20:10 to 65 C:d5:d15:0 M:255:15:0 T:19:0:99 D:It has no special abilities, but its to-dam value may be unusually D: high. N:106:of Lothl['o]rien X:30:3 W:50:4:0:20000 A:5:40 to 127 C:d10:d10:0 T:19:12:13 L:1+d2M2:2:DEX L:d2:1:MIGHT F:FREE_ACT | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE N:107:of the Haradrim X:30:0 W:50:4:0:20000 A:10:40 to 127 C:d5:d5:0 T:19:23:23 L:1:1:MIGHT | SHOTS F:IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE N:108:of Extra Might X:20:0 W:0:2:0:10000 A:10:25 to 100 C:d5:d10:0 T:19:0:99 F:HIDE_TYPE L:1:0:MIGHT N:109:of Extra Shots X:20:0 W:0:2:0:10000 A:10:25 to 100 C:d10:d5:0 T:19:0:99 F:HIDE_TYPE L:1:0:SHOTS N:110:of Buckland X:25:0 W:40:4:0:20000 A:10:40 to 127 C:d8:d8:0 T:19:2:2 L:1+d2M2:2:DEX L:d2:1:SHOTS L:d2:1:MIGHT F:IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE N:111:of the Nazg[^u]l X:0:0 W:0:2:0:0 A:10:10 to 80 C:d10:d10:0 T:19:0:99 F:LIGHT_CURSE | DRAIN_EXP | SEE_INVIS ### Ammo ### N:112:of Slay Animal X:10:0 W:0:6:0:20 A:12:1 to 60 T:16:0:99 T:17:0:99 T:18:0:99 F:SLAY_ANIMAL N:113:of Slay Evil X:10:0 W:0:6:0:20 A:12:1 to 60 T:16:0:99 T:17:0:99 T:18:0:99 F:SLAY_EVIL N:114:of Slay Undead X:10:0 W:0:8:0:25 A:8:4 to 77 T:16:0:99 T:17:0:99 T:18:0:99 F:SLAY_UNDEAD N:115:of Slay Demon X:10:0 W:0:8:0:25 A:8:6 to 77 T:16:0:99 T:17:0:99 T:18:0:99 F:SLAY_DEMON N:116:of Acid X:10:0 W:0:10:0:50 A:8:10 to 100 T:16:0:99 T:17:0:99 T:18:0:99 F:BRAND_ACID | IGNORE_ACID N:117:of Lightning X:10:0 W:0:10:0:45 A:8:10 to 100 T:16:0:99 T:17:0:99 T:18:0:99 F:BRAND_ELEC | IGNORE_ELEC N:118:of Slay Giant X:10:0 W:0:8:0:25 A:8:24 to 66 T:16:0:99 T:17:0:99 T:18:0:99 F:SLAY_GIANT N:119:of Slay Dragon X:10:0 W:0:8:0:40 A:8:8 to 88 T:16:0:99 T:17:0:99 T:18:0:99 F:SLAY_DRAGON N:120:of Holy Might X:20:0 W:40:15:0:60 A:8:40 to 127 C:d10:d10:0 T:16:2:99 T:17:2:99 T:18:2:99 F:SLAY_EVIL | SLAY_DEMON | SLAY_UNDEAD F:IGNORE_FIRE | IGNORE_ACID N:121:of Venom X:10:0 W:0:6:0:40 A:12:10 to 100 T:16:0:99 T:17:0:99 T:18:0:99 F:BRAND_POIS N:122:of Flame X:10:0 W:0:6:0:35 A:12:10 to 100 T:16:0:99 T:17:0:99 T:18:0:99 F:BRAND_FIRE | IGNORE_FIRE N:123:of Frost X:10:0 W:0:6:0:30 A:12:10 to 100 T:16:0:99 T:17:0:99 T:18:0:99 F:BRAND_COLD | IGNORE_COLD N:124:of Wounding X:5:0 W:0:4:0:20 A:20:15 to 127 C:d5:d5:0 T:16:0:99 T:17:0:99 T:18:0:99 D:Ammunition of Wounding often has unusually high to-hit and to-dam values. N:125:of Backbiting X:0:0 W:0:0:0:0 A:0:10 to 80 C:-d25:-d25:0 T:16:0:99 T:17:0:99 T:18:0:99 ### Special Broken Items ### # these won't be generated by the make_ego_item code as long as # they keep their rarity of 0 and nobody adds 'T' lines for them. # Destroyed Weapon N:126:(Shattered) X:0:0 W:0:0:0:0 A:0:1 to 80 C:d5:d5:0 # Destroyed Body Armor N:127:(Blasted) X:0:0 W:0:0:0:0 A:0:1 to 80 C:0:0:d10 ### Dragon Scale Mail egos ### # This is the 'default' DSM ego - roughly half of them N:128:of Craftsmanship X:4:0 W:0:2:0:500 A:20:30 to 95 C:0:0:1d6M4 M:0:0:4 T:38:0:99 D:This armour is finely wrought, tough yet unencumbering. N:129:of Stealth X:16:0 W:0:10:0:500 A:8:40 to 100 M:255:0:0 T:38:0:99 F:HIDE_TYPE L:d2:0:STEALTH N:130:of Resistance X:10:0 W:0:10:0:12500 A:8:70 to 100 C:0:0:d10 M:255:0:0 T:38:7:29 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD N:131:of Elvenkind X:25:2 W:0:33:0:15000 A:3:70 to 127 C:0:0:d10 M:255:0:0 T:38:7:29 L:d2:0:STEALTH F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD N:132:(Dwarven) X:18:0 W:0:20:0:5000 A:5:40 to 127 C:0:0:d15 M:255:0:5 T:38:0:99 F:FREE_ACT | HIDE_TYPE L:d2:1:STR L:d2:1:CON L:d2M3:1:INFRA N:133:of Speed X:25:0 W:0:100:0:100000 A:1:40 to 127 M:255:0:0 T:38:0:99 F:HIDE_TYPE L:d5:0:SPEED angband-v3.3.2/lib/edit/shop_own.txt0000644000175000017500000000275211651552410016705 0ustar chriscchrisc# File: shop_own.txt # This file is used to initialize the "shop owner" information for Angband. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # Format: # N:store number # S:purse:owner name # Version stamp (required) V:3.0.11 # General Store N:0 S:5000:Bilbo the Friendly (Hobbit) S:10000:Rincewind the Chicken (Human) S:20000:Snafu the Midget (Gnome) S:30000:Lyar-el the Comely (Elf) # Armoury N:1 S:5000:Kon-Dar the Ugly (Half-Orc) S:10000:Darg-Low the Grim (Human) S:25000:Decado the Handsome (Dundan) S:30000:Mauglin the Grumpy (Dwarf) # Weapon Smith N:2 S:5000:Ithyl-Mak the Beastly (Half-Troll) S:10000:Arndal Beast-Slayer (Half-Elf) S:25000:Tarl Beast-Master (Hobbit) S:30000:Oglign Dragon-Slayer (Dwarf) # Temple N:3 S:15000:Ludwig the Humble (Human) S:20000:Gunnar the Paladin (Human) S:25000:Delilah the Pure (Elf) S:30000:Bosk the Wise (Dwarf) # Alchemist N:4 S:10000:Mauser the Chemist (Half-Elf) S:10000:Wizzle the Chaotic (Hobbit) S:15000:Ga-nat the Greedy (Gnome) S:15000:Vella the Slender (Human) # Magic Shop N:5 S:15000:Ariel the Sorceress (Half-Elf) S:20000:Buggerby the Great (Gnome) S:25000:Inglorian the Mage (Human) S:30000:Luthien Starshine (High-Elf) # Black Market N:6 S:15000:Lo-Hak the Awful (Half-Troll) S:20000:Histor the Goblin (Kobold) S:25000:Durwin the Shifty (Half-Orc) S:30000:Drago the Fair (Elf) # Home N:7 S:0:Your home S:0:Your home S:0:Your home S:0:Your home angband-v3.3.2/lib/edit/vault.txt0000644000175000017500000011577311651552410016214 0ustar chriscchrisc# File: vault.txt # This file is used to initialize the "vault template" information for # the Angband game. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # Note that the "spacing" in the "description" lines is very important! # === Understanding vault.txt === # N:serial number:vault name # X:room type:rating:rows:columns # D:lines giving full layout of vault using symbols below # 'N' indicates the beginning of an entry. The serial number must # increase for each new vault. # 'X' is for extra information - room type, rating, rows, and # columns. Lesser vaults are room type 6 and have a maximum x-y size # of 33x22; greater vaults are room type 7 and have a maximum size of 66x44. # 'D' lines describe the layout of the vault. Lines must be padded # with spaces to fill the dimensions specified. Vaults are described # with the following symbols: # % - outside of the vault, where corridors may be connected # # - granite # X - impenetrable rock # * - treasure or trap # + - secret door # ^ - trap # & - monster up to 5 levels out of depth (OOD) # @ - monster up to 11 levels OOD # 9 - monster up to 9 levels OOD and treasure up to 7 levels OOD # 8 - monster up to 40 levels OOD and treasure up to 20 levels OOD # , - monster up to 3 levels OOD and/or treasure up to 7 levels OOD # Use this to measure columns 1 # 1 2 3 4 5 6 7 8 9 0 # 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 # Version stamp (required) V:3.0.11 ### Simple Vaults (type 6) -- maximum size 44x22 ### N:1:round X:6:5:12:20 D: %%%%%% D: %%%..##..%%% D: %%....####....%% D: %......#**#......% D:%...,.##+##+##.,...% D:%.,.,.#*#*9#*#.,.,.% D:%.,.,.#*#9*#*#.,.,.% D:%...,.##+##+##.,...% D: %......#**#......% D: %%....####....%% D: %%%..##..%%% D: %%%%%% N:2:octagon X:6:5:14:20 D: %%%%%%%%%%%%%% D: %%.##########.%% D: %%..#..,,,,..#..%% D:%%,..#.,####,.#..,%% D:%....#.,#**#,.#....% D:%.###+,##&&##,+###.% D:%.#..,,#*9**#,,..#.% D:%.#..,,#**9*#,,..#.% D:%.###+,##&&##,+###.% D:%....#.,#**#,.#....% D:%%,..#.,####,.#..,%% D: %%..#..,,,,..#..%% D: %%.##########.%% D: %%%%%%%%%%%%%% N:3:octagon X:6:5:12:20 D: %%%%%%%%%%%% D: %%%%..........%%%% D: %...###+##+###...% D:%%...#,,#,,#,,#...%% D:%.###+##+##+##+###.% D:%.#,,#&&#*9#&&#,,#.% D:%.#,,#& *#&&#,,#.% D:%.###+##+##+##+###.% D:%%...#,,#,,#,,#...%% D: %...###+##+###...% D: %%%%..........%%%% D: %%%%%%%%%%%% N:4:square X:6:5:12:20 D:%%%%%%%%%%%%%%%%%%%% D:%*.......&........*% D:%.################.% D:%.#,.,.,.,.,.,.,.#.% D:%.#.############,#.% D:%.#,+,&&+*9#&*,#.#&% D:%&#.#,* *+&&,+,#.% D:%.#,############.#.% D:%.#.,.,.,.,.,.,.,#.% D:%.################.% D:%*........&.......*% D:%%%%%%%%%%%%%%%%%%%% N:5:square X:6:5:12:20 D:%%%%%%%%%%%%%%%%%%%% D:%,################,% D:%^#.*...&..,....,#^% D:%^#...,......9...#^% D:%^#######++#######^% D:%^+.,..&+,*+*....+^% D:%^+..*.,+.&+.,.&.+^% D:%^#######++#######^% D:%^#....,.,.....,.#^% D:%^#..9......*....#^% D:%,################,% D:%%%%%%%%%%%%%%%%%%%% N:6:Planet X X:6:10:13:15 D:%%%%%%%%%%%%%%% D:%.............% D:%.XXXXX#XXXXX.% D:%.XXX,,,,,XXX.% D:%.X,XX,,,XX,X.% D:%.X,,XX9XX,,X.% D:%.#,,9###9,,#.% D:%.X,,XX9XX,,X.% D:%.X,XX,,,XX,X.% D:%.XXX,,,,,XXX.% D:%.XXXXX#XXXXX.% D:%.............% D:%%%%%%%%%%%%%%% N:7:Turnabout X:6:10:12:15 D:############### D:#.............# D:#.###########.# D:#.#9##,,,,###.# D:#.###^^##,,##.# D:#.##&^^&##,,#.# D:#.###^^^^#,,#.# D:#.#,##,,##,,#.# D:#.#9,##^#@@##.# D:#.#####^#####.# D:#.............# D:############### N:9:Cross X:6:10:13:20 D:%%%%%%%%%%%%%%%%%%%% D:%########++########% D:%#*....*#..#*....*#% D:%#....9,#^^#,9....#% D:%#....,##..##,....#% D:%#+#####*..*#####+#% D:%#^^.....,,.....^^#% D:%#+#####*..*#####+#% D:%#....,##..##,....#% D:%#....9,#^^#,9....#% D:%#*....*#..#*....*#% D:%########++########% D:%%%%%%%%%%%%%%%%%%%% N:10:Central X:6:12:10:12 D:############ D:#,#^^^^^^#,# D:##+######+## D:#^#^^,,^^#^# D:#^#^&@9&^#^# D:#^#^&9@&^#^# D:#^#^^,,^^#^# D:##+######+## D:#,#^^^^^^#,# D:############ N:11:Camouflaged X:6:10:9:12 D:%%%%%%%%%%%% D:%XXXXXXXXXX% D:%#,,,,,,,9X% D:%XXXXXXXXXX% D:%X9,,,,,,,#% D:%XXXXXXXXXX% D:%#,,,,,,,9X% D:%XXXXXXXXXX% D:%%%%%%%%%%%% N:12:X^2 X:6:8:13:15 D:%%%%%%%%%%%%%%% D:%.............% D:%.#####.#####.% D:%.#9,,#.#,,9#.% D:%.##,,#+#,,##.% D:%..###^^^###..% D:%....+^*^+....% D:%..###^^^###..% D:%.##,,#+#,,##.% D:%.#9,,#.#,,9#.% D:%.#####.#####.% D:%.............% D:%%%%%%%%%%%%%%% N:13:Lesser vault Rock-Hard X:6:10:11:20 D:%%%%%%%%%%%%%%%%%%%% D:%..................% D:%.#^############^#.% D:%.#^#,,,,,,,,,,#^#.% D:%.#^##,,,,,,,,##^#.% D:%.##^##^^^^^^##^##.% D:%.###*##&&&&##*###.% D:%.#9##^##99##^##9#.% D:%.#####^####^#####.% D:%..................% D:%%%%%%%%%%%%%%%%%%%% N:14:Lesser vault Miniature Cell X:6:5:5:5 D:%%%%% D:%#9#% D:%999% D:%#9#% D:%%%%% N:15:Lesser vault Interlock X:6:10:12:17 D:%%%%%%%%%%%%%%%%% D:%......^^^......% D:%.######+######.% D:%.#,,&9#^#9&,,#.% D:%.#,,,&#^#&,,,#.% D:%.#,,,,#^#,,,,#.% D:%.#^####^####^#.% D:%.#^#@,,&,,@#^#.% D:%.#^#,,&9&,,#^#.% D:%.#+#########+#.% D:%.^^^.......^^^.% D:%%%%%%%%%%%%%%%%% ### Medium Vaults (type 7)### N:20:Rooms X:7:12:13:19 D:%%%%%%%%%%%%%%%%%%% D:%.................% D:%.###############.% D:%.#^+,&9#*,*+&&&#.% D:%.#^#,,&#,@,#***#.% D:%.#^#8,,+*,*#,,,+.% D:%.#^#############.% D:%.#^#8,,+*,*#,,,+.% D:%.#^#,,&#,@,#***#.% D:%.#^+,&9#*,*+&&&#.% D:%.###############.% D:%.................% D:%%%%%%%%%%%%%%%%%%% N:21:diagonal X:7:12:12:20 D:%%%%%%%%%%%%%%%%% D:%9,,##9,,,##....%% D:%,,,,##,,,,##....%% D:%#,,,,##,,,,##....%% D:%##,,,,##,,,,##....% D:%.##,,,,,9,,,,#+...% D:%..#+,,,,9,,,,,##..% D:%...##,,,,##,,,,##.% D:%%...##,,,,##,,,,##% D: %%...##,,,,##,,,,#% D: %%...##,,,9##,,,9% D: %%%%%%%%%%%%%%%%% N:22:diagonal X:7:12:12:20 D: %%%%%%%%%%%%%%%%% D: %%....##,,,9##,,9% D: %%....##,,,,##,,,,% D:%%....##,,,,##,,,,#% D:%....##,,,,##,,,,##% D:%...+#,,,,9,,,,,##.% D:%..##,,,,,9,,,,+#..% D:%.##,,,,##,,,,##...% D:%##,,,,##,,,,##...%% D:%#,,,,##,,,,##...%% D:%9,,,##9,,,##...%% D:%%%%%%%%%%%%%%%%% N:23:Workaround X:7:15:19:21 D:%%%%%%%%%%%%%%%%%%%%% D:%...................% D:%.XX..XXXXXXXXX..XX.% D:%.X..XX*******XX..X.% D:%...XX,,@XXX@,,XX...% D:%...X..&XX8XX&..X...% D:%..XX..XX,,,XX..XX..% D:%..X..XX9,,,9XX..X..% D:%..X.XXXXX&XXXXX.X..% D:%..#.^^^+&X&+^^^.#..% D:%..X.XXXXX&XXXXX.X..% D:%..X..XX9,,,9XX..X..% D:%..XX..XX,,,XX..XX..% D:%...X..&XX8XX&..X...% D:%...XX,,@XXX@,,XX...% D:%.X..XX*******XX..X.% D:%.XX..XXXXXXXXX..XX.% D:%...................% D:%%%%%%%%%%%%%%%%%%%%% N:24:Snake Maze X:7:15:21:23 D:%%%%%%%%%%%%%%%%%%%%%%% D:%.....................% D:%.XXXXXXXXX#XXXXXXXXX.% D:%.X8X9..XXX..X,,,9X8X.% D:%.X,XXX.^.XX.X,XXXX,X.% D:%.X,,,XXX..X.X,,,,X,X.% D:%.XXX,,,XX.X.XX*X,,,X.% D:%.X...X*X..X.XXXXXX.X.% D:%.X.XXXXX.XX.X.^.X..X.% D:%.X...^........X.X.XX.% D:%.X#XXXXXXXXXXXX...*X.% D:%.X&.........^&XX.XXX.% D:%.X.XXXXXXXXXX.XX,,,X.% D:%.X.X......^...*XXX,X.% D:%.X.X,XXXXXXXX&XX,,,X.% D:%.X.X,XX8,,,,X&9X,XXX.% D:%.X^X,,XXXXX.XXXX,X*X.% D:%.X.XX99XX**......^.X.% D:%.X#XXXXXXXXXXXXXXXXX.% D:%.....................% D:%%%%%%%%%%%%%%%%%%%%%%% N:25:Crown X:7:20:19:28 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%..........................% D:%.....XXXXXXXXXXXXXXXX.....% D:%..XXXX^^^^+XXXX+^^^^XXXX..% D:%.XX^^^^X+XX,XX,XX+X^^^^XX.% D:%.X9X+XXX.X,,XX,,X.XXX+X9X.% D:%.XXX9X@@.X,,XX,,X.@@X9XXX.% D:%..X89X@@.X,,XX,,X.@@X98X..% D:%..XXXXXXXXX+XX+XXXXXXXXX..% D:%..........................% D:%..XXXXXXXXX+XX+XXXXXXXXX..% D:%..X89X@@.X,,XX,,X.@@X98X..% D:%.XXX9X@@.X,,XX,,X.@@X9XXX.% D:%.X9X+XXX.X,,XX,,X.XXX+X9X.% D:%.XX^^^^X+XX,XX,XX+X^^^^XX.% D:%..XXXX^^^^+XXXX+^^^^XXXX..% D:%.....XXXXXXXXXXXXXXXX.....% D:%..........................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:26:Funnel X:7:15:21:23 D:%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXX% D:%X&&&...........***X.#% D:%X&XXXXXXXXXXXXXXX*X.X% D:%X&X&&&.......***X*X.X% D:%X.X&XXXXXXXXXX.*X.X.X% D:%X.X&X8XX,,,,,XX*X.X.X% D:%X.X.XX*,,,,,,,X.X.X.X% D:%X.X.XX@&@&@&@&@.X.X.X% D:%X.X.X89,,,,,,,,.X.X.X% D:%X.X.X89,,,,,,,,.X.X.X% D:%X.X.X89,,,,,,,,.X.X.X% D:%X.X.XX@&@&@&@&@XX.X.X% D:%X.X.XX*,,,,,,,*XX.X.X% D:%X.X*X8XX,,,,,XX8X&X.X% D:%X.X*XXXXXXXXXXXXX&X.X% D:%X*X***.........&&&X&X% D:%X*XXXXXXXXXXXXXXXXX&X% D:%X***.............&&&X% D:%XXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%% N:27:Pigeonholed X:7:15:17:27 D:%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.......,....,....,.......% D:%.#######################.% D:%.#.....&...,,,...&.....#.% D:%.#.*.*.*.*.*.*.*.*.*.*.#.% D:%.#.XXXX^XXXX^XXXX^XXXX.#.% D:%.#,X9#*^X8#*^*#8X^*#9X,#.% D:%.#.XXXX^XXXX^XXXX^XXXX.#.% D:%.+.....&....@....&.....+.% D:%.#.XXXX^XXXX^XXXX^XXXX.#.% D:%.#,X9#*^X8#*^*#8X^*#9X,#.% D:%.#.XXXX^XXXX^XXXX^XXXX.#.% D:%.#.*.*.*.*.*.*.*.*.*.*.#.% D:%.#.....&...,,,...&.....#.% D:%.#######################.% D:%.......,....,....,.......% D:%%%%%%%%%%%%%%%%%%%%%%%%%%% N:28:Skull X:7:12:17:19 D:%%%%%%%%%%%%%%%%%%% D:%.................% D:%..,..XXXXXXX..,..% D:%...XXXXXXXXXXX...% D:%...XX@,9X9,@XX...% D:%....XX8X#X8XX....% D:%..,..XXX9XXX..,..% D:%.....X^#9#^X.....% D:%..X..^XXXXX^..X..% D:%.XXXX,*,*,*,XXXX.% D:%..,..XXX,XXX..,..% D:%.,.,..&XXX&..,.,.% D:%..,..XXX,XXX..,..% D:%.XXXX,,,,,,,XXXX.% D:%..X..,..,..,..X..% D:%.................% D:%%%%%%%%%%%%%%%%%%% N:29:Hallway X:7:15:11:31 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.............................% D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXX.% D:%.X&#&#,#9,#,,8#9,9#,9#,#&#&X.% D:%.X+#+#+##+##+###+##+##+#+#+X.% D:%.+^*^*^*.^*.^,9,^.*^.*^*^*^+.% D:%.X+#+#+##+##+###+##+##+#+#+X.% D:%.X&#&#,#9,#9,8#9,,#,9#,#&#&X.% D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXX.% D:%.............................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:30:Lair X:7:15:15:23 D: %%%%%%%%% D: %%%.........%%% D: %%...XXXXXXXXX...%% D: %..XXXX*******XXXX..% D:%.XXX^^^###+###^^^XXX.% D:%.X,^####,^^^,####^,X.% D:%.X,##&,,,#9#,,,&##,X.% D:%.+,#8@.,.999.,.@8#,+.% D:%.X,##&,,,#9#,,,&##,X.% D:%.X,^####,^^^,####.,X.% D:%.XXX^^^###+###^^^XXX.% D: %..XXXX*******XXXX..% D: %%...XXXXXXXXX...%% D: %%%.........%%% D: %%%%%%%%% N:31:Disguised 2x2 X:7:15:11:25 D:%%%%%%%%%%%%%%%%%%%%%%%%% D:%.......................% D:%.#+#################+#.% D:%.#,,,,,,&9@#@9&,,,,,,#.% D:%.#,,,,,&9@8#8@9&,,,,,#.% D:%.#####################.% D:%.#,,,,,&9@8#8@9&,,,,,#.% D:%.#,,,,,,&9@#@9&,,,,,,#.% D:%.#+#################+#.% D:%.......................% D:%%%%%%%%%%%%%%%%%%%%%%%%% N:32:Disguised Checkerboard X:7:15:11:25 D:%%%%%%%%%%%%%%%%%%%%%%%%% D:%.......................% D:%.#####################.% D:%.#,#9#.#,#*#9#.#*#.#@#.% D:%.##.#*#9#.#,#*#8#.#*##.% D:%.+.#&#.#.#.#&#.#,#.#8#.% D:%.##.#*#9#.#,#*#8#.#*##.% D:%.#,#9#.#,#*#9#.#*#.#@#.% D:%.#####################.% D:%.......................% D:%%%%%%%%%%%%%%%%%%%%%%%%% N:33:Infinity X:7:15:9:31 D: %%%%%%%%% %%%%%%%%% D: %%%.........%%%.........%%% D: %...XXXXXXXXX...XXXXXXXXX...% D:%.XXXX,,,9,^^XX#XX^^,9,,,XXXX.% D:%.X88@&&,,,^^^^X^^^^,,,&&@88X.% D:%.XXXX,,,9,^^XX#XX^^,9,,,XXXX.% D: %...XXXXXXXXX...XXXXXXXXX...% D: %%%.........%%%.........%%% D: %%%%%%%%% %%%%%%%%% ### Greater vaults (type 8) -- maximum size 66x44 ### N:40:huge X:8:45:17:39 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%+########X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X% D:%X8#########&X% D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X########X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X% D:%X8###�#8###&X% D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X########X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X% D:%X8#########&X% D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X########&#&+% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:41:large X:8:35:18:40 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X,#,#,#,#,#,#,#,#*99*#,#,#,#,#,#,#,#,X% D:%X+XXXXXXXXXXXXXXXX##XXXXXXXXXXXXXXXX+X% D:%X.,..,.X9.&.,*XX******XX*,.&.9X.,...,#% D:%X..,.^^X....,XX***@@***XX,....X^^..,.#% D:%XXXXXX+X^&.&XX***@##@***XX&.&^X+XXXXXX% D:%X,.&.^^X+XXXX***@#XX#@***XXXX+X^^.,..X% D:%X..,&,.X^^^@X**@#X88X#@**#@^^^X.,..&,X% D:%X.,....X^^^@#**@#X88X#@**X@^^^X.&.,..X% D:%X...,^^X+XXXX***@#XX#@***XXXX+X^^..,.X% D:%XXXXXX+X^&.&XX***@##@***XX&.&^X+XXXXXX% D:%#.,..^^X.....XX***@@***XX,....X^^.,..X% D:%#...,..X9.&.,*XX******XX*,.&.9X..,..,X% D:%X+XXXXXXXXXXXXXXXX##XXXXXXXXXXXXXXXX+X% D:%X,#,#,#,#,#,#,#,#*99*#,#,#,#,#,#,#,#,X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:42:butterfly X:8:25:18:40 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X*9..&XX***++^^^^^^^^^^^^++***XX&..*9X% D:%X9..&XX,,,,,XX^^^^^^^^^^XX,,,,,#X&..*X% D:%X..&#X.....,.XX^^^^^^^^XX..&....XX&..X% D:%X.&XX..,.&....XX^^^^^^XX..,...&..XX&.X% D:%X&XX..*...&.^.8XX^^^^XX9.*....,..,XX&X% D:%XXXX+XXXXXXXXXXXXX++XXXXXXXXXXXXX+XXXX% D:%+....,.,.X&&&&***+88+***&&&&X,.,.,...+% D:%+...,.,.,X&&&&***+88+***&&&&X.,.,....+% D:%XXXX+XXXXXXXXXXXXX++XXXXXXXXXXXXX+XXXX% D:%X&XX..*....&..9XX^^^^XX8..*...&,..#X&X% D:%X.&XX..&.^....XX^^^^^^XX....&....XX&.X% D:%X..&XX....&..XX^^^^^^^^XX..,..*.XX&..X% D:%X*..&#X,,,,,XX^^^^^^^^^^XX,,,,,XX&..9X% D:%X9*..&XX***++^^^^^^^^^^^^++***XX&..*9X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:43:chambers X:8:25:15:40 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%&+.^..^..^..^..^..^..^..^..^..^..^..+&% D:%+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+% D:%.X.&.^,X&^&^X****+^*^@^X.*.&..X..*.,X.% D:%^X.,.&^+^&^@X^^^^X@^*^*X....*^+.^...X^% D:%.X*..,.XXX+XXXX+XXXX+XXX.&.^..X..&,.X.% D:%^X..^.*X*..^&&@@*X,999,XXXX+XXX,....X^% D:%.XX+XXXXXXXXXXXXXX,888,X,,,,,,XXX+XXX.% D:%^X*&X.&,*.X,*&^*^X,999,X,,,,,,X....,X^% D:%.X&,+....*+,*&^*^XXXXXXXXXX+XXX.,...+.% D:%^X.,X.*.&.X,*&^*^+.,.&.^*.&^&^X.....X^% D:%.X^*X.,..,X,*&^*^X*.^*.,..&&&^X,..,.X.% D:%+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+% D:%&+..^..^..^..^..^..^..^..^..^..^..^.+&% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:44:The I in the Storm X:8:40:25:41 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXX% D:%X&&..^..#9X..^^^^^^^^^^^^^..X9#..^..&&X% D:%X&...#....X..XXXXXX^XXXXXX..X....#...&X% D:%X...&#..#.X9XX.@8XX^XX8@.XX9X.#..#&...X% D:%X..&9#....XXX...@X,,,X@...XXX....#9&..X% D:%X^####..#...XX..XX,.,XX..XX...#..####^X% D:%X........,#..XX^X,,.,,X^XX..#,........X% D:%X.......#.....^XX,...,XX^.....#.......X% D:%X........,#....X,,...,,X....#,........X% D:%X.......#.....XX.......XX.....#.......X% D:%X.#......,#..XX^...9...^XX..#,......#.X% D:%X.9#....#....#^^..989..^^#....#....#9.X% D:%X.#......,#..XX^...9...^XX..#,......#.X% D:%X.......#.....XX.......XX.....#.......X% D:%X........,#....X,,...,,X....#,........X% D:%X.......#.....^XX,...,XX^.....#.......X% D:%X........,#..XX^X,,.,,X^XX..#,........X% D:%X^####..#...XX..XX,.,XX..XX...#..####^X% D:%X..&9#....XXX...@X,,,X@...XXX....#9&..X% D:%X...&#..#.X9XX.@8XX^XX8@.XX9X.#..#&...X% D:%X&...#....X&&XXXXXX^XXXXXX&&X....#...&X% D:%X&&..^..#9X..^^^^^^^^^^^^^..X9#..^..&&X% D:%XXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:45:The Bank From Hell X:8:30:20:31 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXX+XXXXXXXXXXXXXX% D:%X.&.&.&.&.&.#...#.&.&.&.&.&.X% D:%X.#.#.#.#.#.#...#.#.#.#.#.#.X% D:%X...........#...#...........X% D:%X##########+##+##+##########X% D:%X@........^^^^^^^^^........@X% D:%X@^^^.....^^^...^^^.....^^^@X% D:%X##+#######+#####+#######+##X% D:%X.^^^.#@..^^^...^^^..@#.^^^.X% D:%X#...##...............#.###.X% D:%X@...@#.&.&.&.&.&.&.&.#..@..X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXX+X% D:%X.+^*****X*******^+^****88X.X% D:%X@X^....^X^......^X^....88X@X% D:%X.X*****^+^*******X*****88X.X% D:%X@XXXXXXXXXXXXXXXXXXXXXXXXX@X% D:%X.9.9.9.9.9.9.9.9.9.9.9.9.9.X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:46:Roundabouts One X:8:15:21:43 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X^^^^^^^^^^^^^^^^#&^^^&^^^^^^^^^^^^^&^,,X% D:%X^^^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&.,X% D:%X^.X+^&^..^^,,,,,#&^^^&,,,,,,^^....,XX&.X% D:%X.^X^&^XXXXXXXXXXXXXXXXXXXXXXXXXXX^,,X.^X% D:%X^.X&^XX,.^^......&^^^&#,.,.,^^&^+X^^X^.X% D:%X.^X^^X,,.^^......&^^^&#.,.,.^^.&^X^^X.^X% D:%X^.X^^X*^^XXXXXXXXXXXXXXXXXXXXX^^&X^^X^.X% D:%X.^X^^X*^X+^,,,,99@#8X@99,,,*&XX^*X^^X.^X% D:%X^^X^^X^^X^&*^^^^^@XXX@^^^^^*&^X^^X^^X^^X% D:%X^.X^^X*^XX&*,,,99@X8#@99,,,,^+X^*X^^X^.X% D:%X.^X^^X&^^XXXXXXXXXXXXXXXXXXXXX^^*X^^X.^X% D:%X^.X^^X^&.^^,.,.,#&^^^&......^^.,,X^^X^.X% D:%X.^X^^X+^&^^.,.,.#&^^^&......^^.,XX^&X.^X% D:%X^.X,,^XXXXXXXXXXXXXXXXXXXXXXXXXXX^&^X^.X% D:%X.&XX,....^^,,,,,,&^^^&#,,,,,^^..^&^+X.^X% D:%X,.&XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX^^^X% D:%X,,^&^^^^^^^^^^^^^&^^^&#^^^^^^^^^^^^^^^^X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:47:Roundabout Two X:8:25:25:40 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%#^X.^^+X@XX.+X^^^^^+.X...X8#@&*X*****X% D:%X^X.^XX@XX.XX^^^^^^X.X.X^XXX@.&+9....X% D:%X^X.XX&XX.XX^^^^^^^X.X.X^X8#@&*X99...X% D:%X^X.X^^X&.XXXXXXXXXX.X.X^XXXXXXXXXX++X% D:%X^X.X.*X&.X.......&..X.X^X........X^^X% D:%X^X&X.*X^^X.XXXXXXXXXX.X&X#XXXXXX.X^.X% D:%X^X.X..X^^X...@........X.X......X.X^^X% D:%X^X.X..X^^XXXXXXXXXXXXXX.XXXXXX.X.X.^X% D:%X^X.X..X^^X..,.....,....&X8#9*X.X.X^^X% D:%X^X&X,,X^^X^XXXXXXXXXXXXXX##99X.X.X^.X% D:%X^+&X..+^^X^^^^^^^^^^^^^^^9...#.X.#^^X% D:%X^X&X,,X^^X^XXXXXXXXXXXXXX##9*X.X.X.^X% D:%X^X.X..X^^X..,.....,....&X8#99X.X.X^^X% D:%X^X.X..X^^XXXXXXXXXXXXXX.XXXXXX.X.X^.X% D:%X^X.X..X^^X...@........X.X......X.X^^X% D:%X^X&X.*X^^X.XXXXXXXXXX.X&X#XXXXXX.X.^X% D:%X^X.X.*X&.X.......&..X.X^X........X^^X% D:%X^X.X^^X&.XXXXXXXXXX.X.X^XXXXXXXXXX++X% D:%X^X.XX&XX.XX^^^^^^^X.X.X^X8#@&*X99...X% D:%X^X.^XX@XX.XX^^^^^^X.X.X^XXX@.&+9....X% D:%#^X.^^+X@XX.+X^^^^^+.X...X8#@&*X*****X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:48:Huge - Modified X:8:45:17:39 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X% D:%X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X8X% D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X#X% D:%X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X8X8X% D:%X#X#XXXXXXXXXXXXXXXXXXXXXXXXXXX#X#X#X% D:%X8X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8X8X8X% D:%X#X#X#XXXXXXXXXXXXXXXXXXXXXXXXXXX#X#X% D:%X8X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X8X% D:%X#X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X% D:%X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X% D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:49:Mirrored Quartet X:8:20:21:49 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X89@@@XXX,,,,XXX....^^^^^^^....XXX,,,,XXX@@@98X% D:%X9@@#XX....XXX**....XXX#XXX....**XXX....XX#@@9X% D:%X@XXX&&&&XXX**....@XX&&@&&XX@....**XXX&&&&XXX@X% D:%XXX....XXX**......@X**...**X@......**XXX....XXX% D:%X@...XXX**.......XXXXX...XXXXX.......**XXX...@X% D:%X@.#XX**.......9XX888XX^XX888XX9.......**XX#.@X% D:%XXXX&&&&&&&&&&&9#,,,,,X^X,,,,,#9&&&&&&&&&&&XXXX% D:%XXXXXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXX% D:%#,,,,,,,,,,,,,,,,,,,,,#8#,,,,,,,,,,,,,,,,,,,,,#% D:%XXXXXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXX% D:%XXXX&&&&&&&&&&&9#,,,,,X^X,,,,,#9&&&&&&&&&&&XXXX% D:%X@.#XX**.......9XX888XX^XX888XX9.......**XX#.@X% D:%X@...XXX**.......XXXXX...XXXXX.......**XXX...@X% D:%XXX....XXX**......@X**...**X@......**XXX....XXX% D:%X@XXX&&&&XXX**....@XX&&@&&XX@....**XXX&&&&XXX@X% D:%X9@@#XX....XXX**....XXX#XXX....**XXX....XX#@@9X% D:%X89@@@XXX,,,,XXX**..^^^^^^^..**XXX,,,,XXX@@@98X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:50:False Wall X:8:20:15:64 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X% D:%X^+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+^X% D:%X^XXXXXXXXXXXXXXXXXXXXXXXXXX+X##X+XXXXXXXXXXXXXXXXXXXXXXXXXX^X% D:%X^+@*&*@*&*@*&*@*&*@*&*@*&*@*X@@X*@*&*@*&*@*&*@*&*@*&*@*&*@+^X% D:%X^XXXXXXXXXXXXXXXXXXXXXXXXX+XX,,XX+XXXXXXXXXXXXXXXXXXXXXXXXX^X% D:%X^+&.@.&.@.&.@.&.@.&.@.&.@.&X*..*X&.@.&.@.&.@.&.@.&.@.&.@.&+^X% D:%X^XXXXXXXXXXXXXXXXXXXXXXXX+XX*..*XX+XXXXXXXXXXXXXXXXXXXXXXXX^X% D:%X^+,,,,,,,,,,,,,,,,,,,,,,,,X,,..,,X,,,,,,,,,,,,,,,,,,,,,,,,+^X% D:%X^XXXXXXXXXXXXXXXXXXXXXXX+XX##99##XX+XXXXXXXXXXXXXXXXXXXXXXX^X% D:%X^+&.@.&.@.&.@.&.@.&.@.&.@X.@####@.X@.&.@.&.@.&.@.&.@.&.@.&+^X% D:%X^XXXXXXXXXXXXXXXXXXXXXX+XX..@##@..XX+XXXXXXXXXXXXXXXXXXXXXX^X% D:%X^+*&*@*&*@*&*@*&*@*&*@*&X&@888888&@X&*@*&*@*&*@*&*@*&*@*&*+^X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:51:Divisi X:8:35:31:55 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.....................................................% D:%.#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#.% D:%.X,XX@@@&&,,,,,,,,,,,,,,,X8X,,,,,,,,,,,,,,,&&@@@XX,X.% D:%.X,,XXX@&&XXXXXXXXXXXXXX^X9X^XXXXXXXXXXXXXX&&@XXX,,X.% D:%.XX,,,XXX^^^XXX#8#8#8#8X^X@X^X8#8#8#8#XXX^^^XXX,,,XX.% D:%.XXXX,,,XXX^^^XXX######X^X&X^X######XXX^^^XXX,,,XXXX.% D:%.X@@XXX,,,XXX^^^XXX#8#8X^X,X^X8#8#XXX^^^XXX,,,XXX@@X.% D:%.X&&&&XXX,,,XXX^^^XX###X^X,X^X###XX^^^XXX,,,XXX&&&&X.% D:%.X^XX..#XXX,,,XXX^^^XXXX^X,X^XXXX^^^XXX,,,XXX#..XX^X.% D:%.X^.XXX#@@XXX,,,XXX^^^XX^X,X^XX^^^XXX,,,XXX@@#XXX.^X.% D:%.X^&&&XXX&&&XXX,,,XXX^^^^X,X^^^^XXX,,,XXX&&&XXX&&&^X.% D:%.X^XX&&&XXX^^^XXX,,,XXX^^X,X^^XXX,,,XXX^^^XXX&&&XX^X.% D:%.X,,XXX&@@XXX^^^XXX,,,XXX#,#XXX,,,XXX^^^XXX@@&XXX,,X.% D:%.X,,##XXX@##XXX^^^XXX,,,XX#XX,,,XXX^^^XXX##@XXX##,,X.% D:%.XXXX888XXX999XXX^^^###,#888#,###^^^XXX999XXX888XXXX.% D:%.X,,##XXX@##XXX^^^XXX,,,XX#XX,,,XXX^^^XXX##@XXX##,,X.% D:%.X,,XXX&@@XXX^^^XXX,,,XXX#,#XXX,,,XXX^^^XXX@@&XXX,,X.% D:%.X^XX&&&XXX^^^XXX,,,XXX^^X,X^^XXX,,,XXX^^^XXX&&&XX^X.% D:%.X^&&&XXX&&&XXX,,,XXX^^^^X,X^^^^XXX,,,XXX&&&XXX&&&^X.% D:%.X^.XXX#@@XXX,,,XXX^^^XX^X,X^XX^^^XXX,,,XXX@@#XXX.^X.% D:%.X^XX..#XXX,,,XXX^^^XXXX^X,X^XXXX^^^XXX,,,XXX#..XX^X.% D:%.X&&&&XXX,,,XXX^^^XX###X^X,X^X###XX^^^XXX,,,XXX&&&&X.% D:%.X@@XXX,,,XXX^^^XXX#8#8X^X,X^X8#8#XXX^^^XXX,,,XXX@@X.% D:%.XXXX,,,XXX^^^XXX######X^X&X^X######XXX^^^XXX,,,XXXX.% D:%.XX,,,XXX^^^XXX#8#8#8#8X^X@X^X8#8#8#8#XXX^^^XXX,,,XX.% D:%.X,,XXX@&&XXXXXXXXXXXXXX^X9X^XXXXXXXXXXXXXX&&@XXX,,X.% D:%.X,XX@@@&&,,,,,,,,,,,,,,,X8X,,,,,,,,,,,,,,,&&@@@XX,X.% D:%.#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#.% D:%.....................................................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:52:Curlicues One X:8:15:23:44 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#8X^^^^^^^^X% D:%X.............XXXXXXXXXXXX^^^^XXX...**XX+X% D:%X..XXXXXXX^^^XX..........XX^^^^X...**XX&@X% D:%X.XX*^,..XX^^X..XXXXXXX...X^^^^X...*XX...X% D:%X.X89^,...X^^X.XX^^^^^XX..X^^^^X...*X,,,,X% D:%X.XX9@@@..X^^X.X89@,,^^X..X^^^^X...*X,,,,X% D:%X..XXXXX..X^^X.XX9@,,,,,,XX...XX&,&XX,...X% D:%X^^^^^^^^XX^^X..XXXXXXXXXX....X^^^^X&..&&X% D:%XXXXXXXXXX^^^X&*&*&*&,&,&,&,&XX^^^^X9..XXX% D:%#^^^^^^^^^^XXXXXXXXXXXXXXXXXX#^^^^^X9..#8X% D:%XXXXXXXXXX^^^X&*&*&*&,&,&,&,&XX^^^^X9..XXX% D:%X^^^^^^^^XX^^X..XXXXXXXXXX....X^^^^X&..&&X% D:%X..XXXXX..X^^X.XX9@,,,,,,XX...XX&,&XX,,,,X% D:%X.XX9@@@..X^^X.X89@,,^^X..X^^^^X...*X,,,,X% D:%X.X89^,...X^^X.XX^^^^^XX..X^^^^X...*X,...X% D:%X.XX*^,..XX^^X..XXXXXXX...X^^^^X...*XX...X% D:%X..XXXXXXX^^^XX..........XX^^^^X...**XX&@X% D:%X.............XXXXXXXXXXXX^^^^XXX...**XX+X% D:%X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#8X^^^^^^^^X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:53:Bubbles X:8:35:25:41 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXX#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X8X#X8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8X% D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX% D:%XX.9.#.9.X.9.#.9.X.9.#.9.X.9.#.9.#.9.XX% D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX% D:%X8XXX8X#X8X#X8X#X8X#X8X#X8X#X8X#X8X#X8X% D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX% D:%XX.9.#.9.X.9.X.9.#.9.X.9.#.9.X.9.X.9..X% D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX% D:%X8X#X8XXX8X#X8XXX8XXX8XXX8XXX8XXX8X#X8X% D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX% D:%XX.9.X.9.#.9.X.9.#.9.#.9.#.9.#.9.X.9.XX% D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX% D:%X8X#X8X#X8X#X8XXX8XXX8XXX8XXX8X#X8X#X8X% D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX% D:%XX.9.#.9.X.9.#.9.#.9.#.9.#.9.#.9.X.9.XX% D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX% D:%X8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8X% D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX% D:%##.9.#.9.#.9.#.9.#.9.#.9.#.9.#.9.#.9.XX% D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX% D:%X8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:54:Symmet X:8:20:23:29 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%...........................% D:%....XXXXXXXXX+XXXXXXXXX....% D:%...XX,,.....^^^.....,,XX...% D:%..XX,,.XXXXXX+XXXXXX.,,XX..% D:%.XX,,.XX9&&&X@X&&&9XX.,,XX.% D:%.X,,.XX8,...X.X...,8XX.,,X.% D:%.X..XX8,,...X&X...,,8XX..X.% D:%.X.XX8,,,.^^X^X^^.,,,8XX.X.% D:%.X.X9,,,,.^.X^X.^.,,,,9X.X.% D:%.X^XXXXXXXXX+^+XXXXXXXXX^X.% D:%.+^+@,,,,&^^^^^^^&,,,,@+^+.% D:%.X^XXXXXXXXX+^+XXXXXXXXX^X.% D:%.X.X9,,,,.^.X^X.^.,,,,9X.X.% D:%.X.XX8,,,.^^X^X^^.,,,8XX.X.% D:%.X..XX8,,...X&X...,,8XX..X.% D:%.X,,.XX8,...X.X...,8XX.,,X.% D:%.XX,,.XX9&&&X@X&&&9XX.,,XX.% D:%..XX,,.XXXXXX+XXXXXX.,,XX..% D:%...XX,,.....^^^.....,,XX...% D:%....XXXXXXXXX+XXXXXXXXX....% D:%...........................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:55:V-vault X:8:25:23:48 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X9***X...........&...XXXX..,.......,....X***9X% D:%XXX**X....,..*......X....X..............X**XXX% D:%X^^X**XX...........XX....XX....@......XX**X^^X% D:%X..XX**XX..@......XX...*..XX......&..XX**XX..X% D:%X...XX**XX.....,.XX........XX.......XX**XX...X% D:%X&...XX..XX.....XX..@.......XX,....XX..XX....X% D:%X.....XX..XX&..XX......*......XX..XX..XX.....X% D:%X.^....XX..XXXXX..&.........&..XXXX..XX....@.X% D:%X.......XX..XX..............*...XX..XX..&....X% D:%X........XX^^XX...&...XX...@...XX^^XX........X% D:%XXX..&...^XX..XX,,,,XX&&XX,,,,XX..XX^......XXX% D:%X8XX....^^.XX..XX99XX....XX99XX..XX.^^....XX8X% D:%X99XX..^^...XX..XXXX.,....XXXX..XX...^^..XX99X% D:%X...XX^^.....XX..XX...,&.,.XX..XX.....^^XX.&.X% D:%X....XX...@...XX..XX@....@XX..XX.*...&.XX....X% D:%X@..&.XX.......XX..XX9999XX..XX.......XX...@.X% D:%X......XX.....*.XX..XX88XX..XX...@...XX......X% D:%X,,..@..XX^.@....XX..XXXX..XX......^XX.@...,,X% D:%X,,......^X*******XX......XX*******X^......,,X% D:%XXXXXXXXXXXXXXXXXXXXXX##XXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:56:Greater vault ("Twisted Cube") X:8:20:24:41 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.......................................% D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....% D:%.X...............................XX....% D:%.X..X^^XXXXXXXXXXXXXXXXXXXXX.XXX..#X...% D:%.X..XX^^XX9,,,,,,,,,,,,,,,,X.X&X+..XX..% D:%.X..X+X^^XX9,,,,,,,,,,,,,,,+.X9&XX..XX.% D:%.X..X,XX^^XXXXXXXXXXXXXXXXXX.XXXXXX..X.% D:%.X..X,,XX..................X.X.......X.% D:%.X..X,,,XX.XXXXXXXX#XXXXXXXX.XXXXXX..X.% D:%.X..X^^^^X.X89&***&,,,,&***X.X9***X..X.% D:%.X..X&&&&X.X9&***&,8,,&***&X.X^^^^X..X.% D:%.X..X^^^^X.X&***&,,8,&***&9X.X&&&&X..X.% D:%.X..X***9X.X***&,,,,&***&98X.X^^^^X..X.% D:%.X..XXXXXX.XXXXXXXX#XXXXXXXX.XX,,,X..X.% D:%.X.......X.X..................XX,,X..X.% D:%.X..XXXXXX.XXXXXXXXXXXXXXXXXX^^XX,X..X.% D:%.XX..XX&9X.+,,,,,,,,,,,,,,,9XX^^X+X..X.% D:%..XX..+X&X.X,,,,,,,,,,,,,,,,9XX^^XX..X.% D:%...X#..XXX.XXXXXXXXXXXXXXXXXXXXX^^X..X.% D:%....XX...............................X.% D:%.....XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.% D:%.......................................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:57:Greater vault ("Jigsaw") X:8:25:16:49 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%...............................................% D:%.XXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXXX.% D:%.X&&&&&&&&&&&&###99999999###&&&&&&&###&*&*&*&X.% D:%.X&9999999999&&&##,,,,,,##,,,,,,,,##*&*&*&*&*X.% D:%.X&99999&&&&&&&&##,,,,,,##,,,,,,,,##&*&*&*&*&X.% D:%.X&9999&&###&&###,,,###,,###@8,@8,@###*&###&*X.% D:%.X&&99&&##*##&#,,,,##9##988##@@@@@@@@#&##9##&X.% D:%.X#&&&&##***########999#######9999######9@9##X.% D:%.X##&&##*******##,,,,,,,,,##8##@@##88##@,@,@,X.% D:%.X8####&&&&&&&##,,,,,,,,,##999####9999##@,@,@X.% D:%.X9@&@&@&@&@&@##,,,,,,,,,##,,,,,,,,,,,##,@,@,X.% D:%.X*************##,,,,,,,,,##&&&&&&&&&##,@,@,@X.% D:%.XXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXXX.% D:%...............................................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:58:Greater vault ("Hourglass") X:8:24:37:27 D:%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.........................% D:%.......XXXXX+XXXXX.......% D:%...XXXXX...^^^...XXXXX...% D:%..XX,,,&.XXX+XXX.&,,,XX..% D:%...XXXXXXX.^^^.XXXXXXX...% D:%...XX**...@X^X@...**XX...% D:%....X**XXXXX^XXXXX**X....% D:%...XXX,X.........X,XXX...% D:%...X9X9X..*X+X*..X9X9X...% D:%...X9XXX.*XX^XX*.XXX9X...% D:%..XX.*X9@XX...XX@9X*.XX..% D:%..X..*XX@XXX^XXX@XX*..X..% D:%..X..**X8X9X+X9X8X**..X..% D:%..X..**XXX.^^^.XXX**..X..% D:%.XX.XXX9X9.XXX.9X9XXX.XX.% D:%.X..X9X8XX.^X^.XX8X9X..X.% D:%.X+XX9XXXXXX^XXXXXX9XX+X.% D:%.X.^^X^^.........^^X^^.X.% D:%.X+XX9XXXXXX^XXXXXX9XX+X.% D:%.X..X9X8XX.^X^.XX8X9X..X.% D:%.XX.XXX9X9.XXX.9X9XXX.XX.% D:%..X..**XXX.^^^.XXX**..X..% D:%..X..**X8X9X+X9X8X**..X..% D:%..X..*XX@XXX^XXX@XX*..X..% D:%..XX.*X9@XX&.&XX@9X*.XX..% D:%...X9XXX.*XX^XX*.XXX9X...% D:%...X9X9X..*X+X*..X9X9X...% D:%...XXX,X.........X,XXX...% D:%....X**XXXXX^XXXXX**X....% D:%...XX**...@X^X@...**XX...% D:%...XXXXXXX.^^^.XXXXXXX...% D:%..XX,,,&.XXX+XXX.&,,,XX..% D:%...XXXXX...^^^...XXXXX...% D:%.......XXXXX+XXXXX.......% D:%.........................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%% N:59:Greater vault ("Mazer") X:8:26:35:31 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.............................% D:%........XXXXXX+XXXXXX........% D:%.........XX@.X.X.@XX.........% D:%.......XXXX+X...X+XXXX.......% D:%......XX8#..XXXXX..#8XX......% D:%.....XXXXX.X.X@X.X.XXXXX.....% D:%....XXX8#.XXX^^^XXX.#8XXX....% D:%...XXXXXXX.X.XXX.X.XXXXXXX...% D:%..XX8XX9XXX^^X@X^^XXX9XX8XX..% D:%.XXX#XXX..XXX...XXX..XXX#XXX.% D:%.X,X,X.XXX.X^XXX^X.XXX.X,X,X.% D:%.XX,X.XXX.XX^X@X^XX.XXX.X,XX.% D:%.X,X.X&XXX&&XX@XX&&XXX&X.X,X.% D:%.XX.X&X.XXXX,,X,,XXXX.X&X.XX.% D:%.X.X&X.XXXXX&X,X&XXXXX.X&X.X.% D:%.X9XX.X.XX&XXX9XXX&XX.X.XX9X.% D:%.X98XX@X..X,,9X9,,X..X@XX89X.% D:%.X9XX.X.XX&XXX9XXX&XX.X.XX9X.% D:%.X.X&X.XXXXX&X,X&XXXXX.X&X.X.% D:%.XX.X&X.XXXX,,X,,XXXX.X&X.XX.% D:%.X,X.X&XXX&&XX@XX&&XXX&X.X,X.% D:%.XX,X.XXX.XX^X@X^XX.XXX.X,XX.% D:%.X,X,X.XXX.X^XXX^X.XXX.X,X,X.% D:%.XXX#XXX..XXX...XXX..XXX#XXX.% D:%..XX8XX9XXX^^X@X^^XXX9XX8XX..% D:%...XXXXXXX.X.XXX.X.XXXXXXX...% D:%....XXX8#.XXX^^^XXX.#8XXX....% D:%.....XXXXX.X.X@X.X.XXXXX.....% D:%......XX8#..XXXXX..#8XX......% D:%.......XXXX+X...X+XXXX.......% D:%.........XX@.X.X.@XX.........% D:%........XXXXXX+XXXXXX........% D:%.............................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:60:Greater vault ("Orb") X:8:16:27:27 D:%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.........................% D:%.........#XXXXX#.........% D:%.......XXX,,,,,XXX.......% D:%......XXXX,,,,,XXXX......% D:%.....XXXXXX,,,XXXXXX.....% D:%....XXXXXXX+X+XXXXXXX....% D:%...X9XXXX^^^^^^^XXXX9X...% D:%..XXXX8X@X+XXX+X@X8XXXX..% D:%..X&&X9XXX^X^X^XXX9X&&X..% D:%..X&&XX+XXX^X^XXX+XX&&X..% D:%.XX.XXXX.X.X@X.X.XXXX.XX.% D:%.XX+XX9XX^XX9XX^XX9XX+XX.% D:%.+^^+^^^^^X888X^^^^^+^^+.% D:%.XX+XX9XX^XX9XX^XX9XX+XX.% D:%.XX.XXXX.X.X@X.X.XXXX.XX.% D:%..X&&XX+XXX^X^XXX+XX&&X..% D:%..X&&X9XXX^X^X^XXX9X&&X..% D:%..XXXX8X@X+XXX+X@X8XXXX..% D:%...X9XXXX^^^^^^^XXXX9X...% D:%....XXXXXXX+X+XXXXXXX....% D:%.....XXXXXX,,,XXXXXX.....% D:%......XXXX,,,,,XXXX......% D:%.......XXX,,,,,XXX.......% D:%.........#XXXXX#.........% D:%.........................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%% N:61:Greater vault ("Interstices") X:8:22:19:45 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%...........................................% D:%.......XXXXXXXXXXXX^^^^^XXXXXXXXXXXX.......% D:%......XXXX9X9X&X@XX^^^^^XX@X&X9X9XXXX......% D:%.....XXXX*X*XX&X@X.X.X.X..@X&XX*X*XXXX.....% D:%...XXXX9XXXX*X+XX,XX.X.XX,XX+X*XXXX9XXXX...% D:%..XX89,XX9X**X.X,,X&X@X&X,,X.X**X9XX,98XX..% D:%.XXXXX#X^XX*XX.XXXX.X.X.XXXX.XX*XX^X#XXXXX.% D:%.XX8XX@XX^XX.XX^XX.X^^^X.XX^XX@XX^XX@XX8XX.% D:%.X89#9&+&.+..+^^+..X^X^X..+^^+.&+.&+&9#98X.% D:%.XX8XX@XX^XX.XX^XX.X^^^X.XX^XX@XX^XX@XX8XX.% D:%.XXXXX#X^XX*XX.XXXX.X.X.XXXX.XX*XX^X#XXXXX.% D:%..XX89,XX9X**X.X,,X&X@X&X,,X.X**X9XX,98XX..% D:%...XXXX9XXXX*X+XX,XX.X.XX,XX+X*XXXX9XXXX...% D:%.....XXXX*X*XX&X@X.X.X.X.X@X&XX*X*XXXX.....% D:%......XXXX9X9X&X@XX^^^^^XX@X&X9X9XXXX......% D:%.......XXXXXXXXXXXX^^^^^XXXXXXXXXXXX.......% D:%...........................................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:62:Greater vault ("Sphere") X:8:25:25:47 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.............................................% D:%......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......% D:%.....XX8,,XXX998XXXX98889XXXX899XXX,,8XX.....% D:%....XX8,,XX,,,,9X99XXX#XXX99X9,,,,XX,,8XX....% D:%....X8,,,X,,,,,9X.XX9#8#9XX.X9,,,,,X,,,8X....% D:%....X,,,,X..&XXXX#XX9XXX9XX#XXXX&..X,,,,X....% D:%....X,XXX#.&XX,,X@@#XX9XX#@@X,,XX&.#XXX,X....% D:%....XXX.^^&XX,,XX#XXX***XXX#XX,,XX&^^.XXX....% D:%....XX..XXXX,,XXX&&XX***XX&&XXX,,XXXX..XX....% D:%....XX+XX&&XX+X9X&XX^X.X^XX&X9X+XX&&XX+XX....% D:%....XX^^^^^XX.&.X#X^^X9X^^X#X.&.XX^^^^^XX....% D:%....+^^^^^^+^&@&+^^^^9X9^^^^+&@&^+^^^^^^+....% D:%....XX^^^^^XX.&.X#X^^X9X^^X#X.&.XX^^^^^XX....% D:%....XX+XX&&XX+X9X&XX^X.X^XX&X9X+XX&&XX+XX....% D:%....XX..XXXX,,XXX&&XX***XX&&XXX,,XXXX..XX....% D:%....XXX.^^&XX,,XX#XXX***XXX#XX,,XX&^^.XXX....% D:%....X,XXX#.&XX,,X@@#XX9XX#@@X,,XX&.#XXX,X....% D:%....X,,,,X..&XXXX#XX9XXX9XX#XXXX&..X,,,,X....% D:%....X8,,,X,,,,,9X.XX9#8#9XX.X9,,,,,X,,,8X....% D:%....XX8,,XX,,,,9X99XXX#XXX99X9,,,,XX,,8XX....% D:%.....XX8,,XXX998XXXX98889XXXX899XXX,,8XX.....% D:%......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......% D:%.............................................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:63:Greater vault ("Hellpit") X:8:20:19:60 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%..........................................................% D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.% D:%.X@@&....#8.#9....^^&&&&&&&&&&&&###.^^,,......+8*9+,,,,,X.% D:%.X@&@.............^^................^^,,......+9*9+,,,,,X.% D:%.X&@@.............^^@@@@@@@@@@@###..^^,,......+9*9+,,8,,X.% D:%.X.....#8....#9...^^................^^,,......+9*9+,,,,,X.% D:%.X................^^&&&&&&&&&&&&###.^^,,.&&&&&+9*9+,,,,,X.% D:%.X.......@@@@.....^^................^^,,.&@@@&+9*9+,,,,,X.% D:%.#....#8.@@@@.#9..^^@@@@@@@@@@@###..^^,,.&@9@&+8*9+,,8,,X.% D:%.X.......@@@@.....^^................^^,,.&@@@&+9*9+,,,,,X.% D:%.X................^^&&&&&&&&&&&&###.^^,,.&&&&&+9*9+,,,,,X.% D:%.X.....#8....#9...^^................^^,,......+9*9+,,,,,X.% D:%.X&@@.............^^@@@@@@@@@@@###..^^,,......+9*9+,,8,,X.% D:%.X@&@.............^^................^^,,......+9*9+,,,,,X.% D:%.X@@&....#8.#9....^^&&&&&&&&&&&&###.^^,,......+8*9+,,,,,X.% D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.% D:%..........................................................% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:64:Greater vault ("Target Practice") X:8:20:20:61 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X@..*..*..*..*..*..*..*..*..*..*..*.......................#% D:%X@XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.#% D:%X@#89XXXXX...9&..@.9....&....##..........#....#@,,,,,,,,X.#% D:%X@X9XX,,,XX......@..........XX..........XX....X@....XXX.X.#% D:%X@XXX,XXX,XX....*.,.&....*.XX***********X.....X@..XXX&+.X.#% D:%X9XX,XX@XX,X.........,9...XX&&&&&&&&&&&9X@@@@@X@XXX**&+.X.#% D:%X9XX,X999X,X&.@..,.......XXXXXXXXXXXXXXXXXX+XXXXXX*XXXX.X.#% D:%X8XX,#989X,#.....9......XX899,,,,,,,,,#,,,,,,,XXX&*&@@X.#.#% D:%X9XX,#989X,#.......&..@.XX899,,,,,,,,,#,,,,,,,XXX&*&@@X.#.#% D:%X9XX,X999X,X...&.&.......XXXXXXXXXXXXXXXXXX+XXXXXX*XXXX.X.#% D:%X@XX,XX@XX,X..,...........XX&&&&&&&&&&&9X@@@@@X@XXX**&+.X.#% D:%X@XXX,XXX,XX......@..@.....XX***********X.....X@..XXX&+.X.#% D:%X@X9XX,,,XX.....9...........XX..........XX....X@....XXX.X.#% D:%X@#89XXXXX..&..........9.,...##..........#....#@,,,,,,,,X.#% D:%X@XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.#% D:%X@..*..*..*..*..*..*..*..*..*..*..*.......................#% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:65:Greater vault ("Castle Death") X:8:35:20:60 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%X8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+XX....+XX...X*88*X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....XXX....@X****X% D:%X.........................................XXX....&.@X****X% D:%X+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX....@.&.@X****X% D:%X999X..9..X&&&&&X,,,,,X@@@@@X..&..X@@@XXX....&.@.&.@X*99*X% D:%X@@8X.&.&.X9&&&9X,,,,,X9@9@9X99.99X9XXX.X..@.&.@.&.@X****X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...X..@.&.@.&.@XX##XX% D:%+^...&.&.&+...@.@.@+...@@@@@+.....99+...+..@.&.@.&.8+^^^^X% D:%+^...&.&.&+...@.@.@+...@@@@@+.....99+...+..@.&.@.&.8+^^^^X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...X..@.&.@.&.@XX##XX% D:%X@@8X.&.&.X9&&&9X,,,,,X9@9@9X99.99X9XXX.X..@.&.@.&.@X****X% D:%X999X..9..X&&&&&X,,,,,X@@@@@X..&..X@@@XXX....&.@.&.@X*99*X% D:%X+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX....@.&.@X****X% D:%X.........................................XXX....&.@X****X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....XXX....@X****X% D:%X,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+XX....+XX...X*88*X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N:66:Greater vault ("The Reward is Worth It") X:8:20:16:63 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%XXXXXXXXXXXXXXX##XXXXXXXXXXXXX#XXXXXXXXXXXXX##XXXXXXXXXXXXXXX% D:%X@@@@@@@@@@@.XX99XX.......,,,X^X,,,.......XX99XX.@@@@@@@@@@@X% D:%X@XXXXXXXXXX..XXXX...XXXX.,,,X^X,,,.XXXX...XXXX..XXXXXXXXXX@X% D:%X@X8888888XXX..XX...XXX@XX,,,X^X,,,XX@XXX...XX..XXX8888888X@X% D:%X@X88899999XXX.....XXX@@@X..&X^X&..X@@@XXX.....XXX99999888X@X% D:%X@X8899.....XXX...XXX@@@@@..&X^X&..@@@@@XXX...XXX.....9988X@X% D:%X@X899.......XXX...XXX......&X^X&......XXX...XXX.......998X@X% D:%X+XXX...XXX&&&XXX^^^XXX.....&X^X&.....XXX^^^XXX&&&XXX...XXX+X% D:%X@@XXX.XXXX&&&&XXX^^^XXX....&X^X&....XXX^^^XXX&&&&XXXX.XXX@@X% D:%X^^^^XXX88X^^^^^^XXX^^^XXX..&X^X&..XXX^^^XXX^^^^^^X88XXX^^^^X% D:%X&&&&&&&&XX^^^^^^^^XXX...XXX&X^X&XXX...XXX^^^^^^^^XX&&&&&&&&X% D:%X,,,,,,,XX,,,,,,,,,,,XXX&&&XXX^XXX&&&XXX,,,,,,,,,,,XX,,,,,,,X% D:%X,,,,,,X#@@@@@@@@@@@@@@XXX&&&&&&&&&XXX@@@@@@@@@@@@@@#X,,,,,,X% D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX% D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% angband-v3.3.2/lib/edit/limits.txt0000644000175000017500000000132211651552410016342 0ustar chriscchrisc# File: limits.txt # This file is used to initialize the "array sizes" information for Angband. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # Version stamp (required) V:3.0.11 # Maximum number of feature types M:F:64 # Maximum number of object kinds M:K:570 # Maximum number of artifacts M:A:139 # Maximum number of ego-item types M:E:134 # Maximum number of monster races M:R:618 # Maximum number of monster pain message sets M:P:13 # Maximum number of spells M:S:122 # Maximum number of objects on the level M:O:1024 # Maximum number of monsters on the level M:M:1024 # Maximum number of pit types M:I:14 angband-v3.3.2/lib/edit/pit.txt0000644000175000017500000000517711651552410015651 0ustar chriscchrisc# File: pit.txt # This file is used to initialize the "monster nest/pit" information for Angband. # Do not modify this file unless you know exactly what you are doing, unless # you wish to risk possible system crashes and broken savefiles. # If you add more pits to the file, make sure to update limits.txt. # === Understanding pit.txt === # N: serial number : name # R: room type # A: rarity : average level # O: object rarity # T: template name # T: template name # F: flag | flag | ... # S: spell | spell | ... # s: forbidden spell | ... # # Each entry must start with an 'N' line, with a new serial number, # and a name. # # 'R' is for room type. Currently, room type is one of the following: # (1) Pits (large room filled with many monsters of a few types in an ordered fashion) # (2) Nests (large room filled with many types of monsters in a disordered fashion) # # 'A' is for rarity and average level. A rarity of N means that the pit is N times # more rare than a pit with a rarity of 1. The average level is the dungeon level # at which this pit is most common. # # 'O' is for object rarity. A rarity of N means that every square of the pit has a # 1 in N chance of having an item. # # 'T' is for monster template (see monster_base.txt). Up to 4 'T' lines may be present. # If there are no 'T' lines, then monsters may have any monster template. Otherwise, # every monster in this pit/nest will be one of the listed templates. # # 'F' is for monster flags. Every monster in this pit/nest will have every listed flag. # As many 'F' lines as are necessary may be used. # # 'S' is for spell flags. Every monster in this nest/pit will have every listed spell flag. # As many 'S' lines as are necessary may be used. # # 's' is for forbidden spell flags. No monster in this nest/pit will have any of the listed # spell flags. As many 's' lines as are necessary may be used. N:1:Orc R:1 A:1:25 O:0 T:orc N:2:Troll R:1 A:1:45 O:0 T:troll N:3:Giant R:1 A:1:65 O:0 T:giant N:4:Acid dragons R:1 A:6:85 O:0 T:dragon T:ancient dragon S:BR_ACID s:BR_ELEC N:5:Electric dragons R:1 A:6:85 O:0 T:dragon T:ancient dragon S:BR_ELEC s:BR_ACID N:6:Fire dragons R:1 A:6:85 O:0 T:dragon T:ancient dragon S:BR_FIRE s:BR_COLD N:7:Ice dragons R:1 A:6:85 O:0 T:dragon T:ancient dragon S:BR_COLD s:BR_FIRE N:8:Poison dragons R:1 A:6:85 O:0 T:dragon T:ancient dragon S:BR_POIS s:BR_FIRE N:9:Multi-hued dragons R:1 A:6:85 O:0 T:dragon T:ancient dragon S:BR_ACID | BR_ELEC | BR_FIRE | S:BR_COLD | BR_POIS N:10:Demons R:1 A:1:105 O:0 T:major demon N:11:Jelly R:2 A:1:20 O:30 T:icky thing T:jelly T:mold T:mushroom N:12:Animals R:2 A:1:50 O:10 F:ANIMAL N:13:Undead R:2 A:1:80 O:5 F:UNDEAD angband-v3.3.2/lib/edit/spell.txt0000644000175000017500000004717611651552410016201 0ustar chriscchrisc# File: spell.txt # This file is used to initialize the "spell" information for the Angband game. # Do not modify this file unless you know exactly what you are doing, # unless you wish to risk possible system crashes and broken savefiles. # The spell indexes are defined in "x-spell.c", and must not be changed # or savefile compatibility will be lost. # Note that several "spell" types may share the same "textual name". # For example, the spell "Detect Monsters" appears in both a mage # book and a priest book; some curing spells appear in two seperate # priest books (and might not even have the exact same effect!) # === Understanding spell.txt === # N: serial number : spell name # I: tval : sval : snum # D: description # 'N' indicates the beginning of an entry. The serial number must # increase for each new spell. # 'I' is for basic information. The tval identifies the type of # the spell- or prayerbook. The sval identifies the book number, # and the snum is the spell number within the book. # 'D' is for description. As many D: lines may be used as are needed # to describe the spell. Note that lines will need spaces at their # ends or the beginning of the next line to prevent words from running # together. # Version stamp (required) V:3.0.11 # Mage spells 0 through 63 N:0:Magic Missile I:90:0:0 D:Fires a magic missile that always hits its target and does D: unresistable damage. D: Sometimes a beam is fired instead that hurts each monster D: in its path. D: The chance to get a beam goes up with your character level. N:1:Detect Monsters I:90:0:1 D:Detects all non-invisible monsters in the immediate area, D: for one turn only. N:2:Phase Door I:90:0:2 D:Teleports you randomly up to 10 squares away. # Damage should probably be displayed on screen N:3:Light Area I:90:0:3 D:Lights up all squares in a level-dependant area, and hurts D: all light-sensitive monsters in the area of effect. D: If you are in a room, the entire room will be lit up as well. N:4:Find Traps, Doors & Stairs I:90:0:7 D:Detects all traps, doors, and stairs in the immediate area. N:5:Cure Light Wounds I:90:0:5 D:Cures 15% of your wounds (min 15hp) and heals 20 points worth of cuts. N:6:Detect Treasure I:90:0:4 D:Detects all treasure in the immediate area. N:8:Identify I:90:2:5 D:Reveals the powers of an object. N:9:Reveal Monsters I:90:2:6 D:Detects all monsters in the immediate area, for one turn only. N:10:Detect Enchantment I:90:3:5 D:Detects all enchanted objects in the immediate area. D: Enchanted objects include artifacts, ego items, amulets, rings, D: staffs, wands, rods, scrolls, potions, spellbooks, and all items D: that give a bonus to-hit, to-dam, or to AC. N:11:Stinking Cloud I:90:0:8 D:Shoots a radius-2 poison ball. N:12:Lightning Bolt I:90:1:1 D:Fires a lightning beam that hurts each monster in its path. N:13:Confuse Monster I:90:1:0 D:Attempts to confuse a single monster for a level-dependant duration. D: Uniques and monsters that resist confusion are not affected. N:14:Sleep Monster I:90:1:4 D:Attempts to put to sleep a single monster. D: Uniques and monsters that resist confusion are not affected. N:15:Wonder I:90:1:8 D:Invokes a random spell effect. N:16:Frost Bolt I:90:1:7 D:Fires a frost bolt that always hits its target. D: Sometimes a beam is fired instead that hurts each monster D: in its path. D: The chance to get a beam goes up with your character level. N:17:Acid Bolt I:90:2:7 D:Fires an acid bolt that always hits its target. D: Sometimes a beam is fired instead that hurts each monster D: in its path. D: The chance to get a beam goes up with your character level. N:18:Fire Bolt I:90:2:3 D:Fires a fire bolt that always hits its target. D: Sometimes a beam is fired instead that hurts each monster D: in its path. D: The chance to get a beam goes up with your character level. N:19:Trap/Door Destruction I:90:1:2 D:Destroys all traps and doors within a 1-square radius of you. N:20:Spear of Light I:90:1:6 D:Fires a beam that lights up each square and hurts each D: light-sensitive monster in its path. N:21:Turn Stone to Mud I:90:2:2 D:Produces a beam that destroys the first section of wall it hits, D: unless it is a permanent wall. Each monster caught in the beam that D: is susceptible to rock remover takes 20+1d30 points of damage. N:22:Door Creation I:90:6:0 D:A door is created on each empty floor space that is directly D: adjacent to you. These doors are closed, but not locked N:23:Earthquake I:90:8:0 D:Causes a 10-square radius earthquake around you. D: Earthquakes may damage monsters and destroy items in some D: squares in the area of effect. D: Artifacts will not be destroyed by this spell. D: This spell has no effect when used in the town. N:24:Stair Creation I:90:6:1 D:A stair (going up or down, chosen at random) is created on the space D: where you are standing. This will destroy any terrain feature that D: was there before. It will also destroy all items currently on the D: floor where the spell is cast. N:25:Cure Poison I:90:1:3 D:Neutralizes poison. N:26:Satisfy Hunger I:90:2:0 D:Magically renders you well-fed (but not satiated). D: This will also cure a bloated stomach. N:27:Heroism I:90:7:0 D:Cures 10 points of damage, removes fear and grants you heroism D: (resistance to fear, and a bonus of +12 to-hit) for 25+1d25 turns. N:28:Berserker I:90:7:1 D:Cures 30 points of damage, removes fear, and grants you berserk D: strength (resistance to fear, a bonus of +24 to-hit, and a penalty D: of -10 to AC) for 25+1d25 turns. N:29:Haste Self I:90:3:2 D:Hastes you (+10 to speed) for a level-dependant duration. N:30:Teleport Self I:90:1:5 D:Teleports you randomly within the current level. N:31:Slow Monster I:90:2:8 D:Attempts to slow a single monster. D: Uniques are not affected. N:32:Teleport Other I:90:3:1 D:Produces a bolt that teleports the first monster in its path D: up to 100 squares away. N:33:Teleport Level I:90:6:2 D:Teleports you 1 level up or 1 level down (chosen at random). D: This spell has no effect when the option to restrict the use of D: stairs and recall is set. N:34:Word of Recall I:90:6:3 D:Teleports you from the dungeon to the town or from the town to the D: deepest level you have visited in the dungeon. D: The recall effect is not immediate; it is delayed by 14+1d20 turns. D: During that delay, the spell can be canceled by invoking the spell D: of recall again. D: This spell has no effect when the option to restrict the use of D: stairs and recall is set, unless Morgoth is dead. N:35:Polymorph Other I:90:2:4 D:Attempts to polymorph a single monster. D: Uniques are not affected. N:36:Shock Wave I:90:5:0 D:Shoots a radius-2 sound ball. D: Apart from doing sound damage, this also has a chance to stun D: each monster in the area of effect. N:37:Explosion I:90:5:1 D:Shoots a radius-2 shards ball. N:38:Cloudkill I:90:5:2 D:Shoots a radius-3 poison ball. N:39:Mass Sleep I:90:3:3 D:Attempts to put to sleep each monster within line of sight. D: Uniques and monsters that resist confusion are not affected. N:40:Bedlam I:90:8:1 D:Shoots a radius-4 confusion ball that doesn't cause physical D: damage but has a chance to confuse each monster in the area of effect. D: Uniques or monsters that resist confusion are not affected. N:41:Rend Soul I:90:8:2 D:Fires a nether bolt that always hits its target. D: Sometimes a beam is fired instead that hurts each monster D: in its path. D: The chance to get a beam goes up with your character level. N:42:Word of Destruction I:90:8:4 D:Destroys everything in a 15-square radius circle around you. D: All monsters, objects, and terrain features in the area of D: effect are destroyed, except stairs, permanent walls and D: artifacts. D: You will also be blinded for 10+1d10 turns, unless you D: have resistance to blindness or light. D: This spell has no effect when used in the town. N:43:Chaos Strike I:90:8:6 D:Fires a chaos bolt that always hits its target. D: Sometimes a beam is fired instead that hurts each monster D: in its path. D: The chance to get a beam goes up with your character level. N:44:Resist Cold I:90:4:0 D:Grants you resistance to cold for 20+1d20 turns. N:45:Resist Fire I:90:4:1 D:Grants you resistance to fire for 20+1d20 turns. N:46:Resist Poison I:90:4:2 D:Grants you resistance to poison for 20+1d20 turns. N:47:Resistance I:90:4:3 D:Grants you resistance to acid, cold, fire, lightning, and poison for D: 20+1d20 turns. N:48:Shield I:90:4:4 D:Grants you +50 to AC for 30+1d20 turns. N:49:Rune of Protection I:90:6:4 D:Inscribes a glyph of warding beneath you. D: Summoned monsters can't appear on the glyph. D: If a monster attempts to move onto the glyph or melee you while you D: are standing on the glyph, it must first succeed in breaking the glyph. D: Higher level monsters are more likely to break the glyph. D: The glyph will remain where it is, until a monster succeeds in D: breaking it, or until you leave the level. N:50:Lesser Recharging I:90:2:1 D:Adds charges to a stack of wands or staves. D: Chance of success and number of charges gained increase with your D: level and decrease with level of wand or staff and number of charges. D: A failed attempt to recharge destroys one wand or staff from the stack. N:51:Enchant Armor I:90:7:2 D:Attempts to improve the armour class bonus of a piece of armour. N:52:Enchant Weapon I:90:7:3 D:Attempts to improve the to-hit bonus and the to-dam bonus of a weapon. N:53:Greater Recharging I:90:7:4 D:Adds charges to a stack of wands or staves. D: Chance of success and number of charges gained increase with your D: level and decrease with level of wand or staff and number of charges, D: but are overall much better than for the spell Lesser Recharging. D: A failed attempt to recharge destroys one wand or staff from the stack. N:54:Elemental Brand I:90:7:5 D:Brands one stack of ammunition with fire, cold, or poison D: (selected at random) and at the same time attempts to improve D: the to-hit bonus and the to-dam bonus of the same ammunition. D: The spell has no effect if the ammunition is already branded, has a D: slay, is broken, or is cursed. N:55:Frost Ball I:90:3:0 D:Shoots a radius-2 frost ball. N:56:Acid Ball I:90:5:3 D:Shoots a radius-2 acid ball. N:57:Fire Ball I:90:3:4 D:Shoots a radius-2 fire ball. N:58:Ice Storm I:90:5:4 D:Shoots a radius-3 cold ball. N:59:Banishment I:90:8:3 D:Removes all monsters represented by a chosen symbol from the level. D: Uniques are not affected. D: You take 1d4 points of damage for every monster removed. N:60:Meteor Swarm I:90:5:5 D:Shoots a swarm of 3 or 4 meteors. D: Meteors will travel until hitting a wall, a monster, D: or reaching the target location. D: Meteors will explode as a radius-1 ball that does unresistable D: damage to each monster in its area of effect. D: If this kills the monster that blocked the path to the target D: location, the next meteor may continue to find another target. N:61:Mass Banishment I:90:8:5 D:Removes all monsters within 20 squares of you. D: Uniques are not affected. D: You take 1d3 points of damage for every monster removed. N:62:Rift I:90:5:6 D:Fires a gravity beam that hurts each monster in its path D: and has a chance of teleporting it away. N:63:Mana Storm I:90:8:7 D:Shoots a radius-3 mana ball that does unresistable D: damage to each monster in its area of effect. # Priest prayers 0 through 57 - numbered 64 through 121 here N:64:Detect Evil I:91:0:0 D:Detects all evil monsters in the immediate area, D: for one turn only. N:65:Cure Light Wounds I:91:0:1 D:Cures 15% of your wounds (min 15hp) and heals 20 points worth of cuts. N:66:Bless I:91:0:2 D:Blesses you, giving a bonus of +5 to AC and +10 to-hit, for 12+1d12 turns. N:67:Remove Fear I:91:0:3 D:Removes fear. # Damage should probably be displayed on screen N:68:Call Light I:91:0:4 D:Lights up all squares in a level-dependant area, and hurts D: all light-sensitive monsters in the area of effect. D: If you are in a room, the entire room will be lit up as well. N:69:Find Traps, Doors & Stairs I:91:0:5 D:Detects all traps, doors, and stairs in the immediate area. N:71:Slow Poison I:91:0:7 D:Halves the remaining duration of any current poisoning. N:72:Scare Monster I:91:1:0 D:Attempts to scare a single monster for a level-dependant duration. D: Uniques and monsters that resist fear are not affected. N:73:Portal I:91:1:1 D:Teleports you randomly over a short distance. N:74:Cure Serious Wounds I:91:1:2 D:Cures 20% of your wounds (min 25hp) and heals all cut damage. N:75:Chant I:91:1:3 D:Blesses you, giving a bonus of +5 to AC and +10 to-hit, for 24+1d24 D: turns. N:76:Sanctuary I:91:1:4 D:Attempts to put to sleep each monster directly adjacent to you. D: Uniques and monsters that resist sleep are not affected. N:77:Satisfy Hunger I:91:1:5 D:Magically renders you well-fed (but not satiated). D: This will also cure a bloated stomach. N:78:Remove Curse I:91:1:6 D:Removes all ordinary curses from all equipped items. D: Heavy or permanent curses are not affected. N:79:Resist Heat and Cold I:91:1:7 D:Gives you temporary resistance to cold and fire, for 10+1d10 turns each. N:80:Neutralize Poison I:91:2:0 D:Neutralizes poison. N:81:Orb of Draining I:91:2:1 D:Shoots a radius-2 or radius-3 ball that does unresistable D: damage to each monster in its area of effect. D: Evil monsters take double damage. D: All cursed items in the area of effect are destroyed. D: The bigger area of effect is attained at character level 30. N:82:Cure Critical Wounds I:91:2:2 D:Cures 25% of your wounds (min 30hp) and heals all cut damage, poison, D: amnesia and stunning. N:83:Sense Invisible I:91:2:3 D:Enables you to see invisible monsters for 24+1d24 turns. N:84:Protection from Evil I:91:2:4 D:Protects you from evil for a level-dependant duration: D: all melee attacks by evil monsters have a chance to be repelled, D: unless the monster's level is higher than your character level. N:85:Earthquake I:91:2:5 D:Causes a 10-square radius earthquake around you. D: Earthquakes may damage monsters and destroy items in some D: squares in the area of effect. D: Artifacts will not be destroyed by this prayer. D: This prayer has no effect when used in the town. N:86:Sense Surroundings I:91:2:6 D:Maps out a portion of the level around you. N:87:Cure Mortal Wounds I:91:2:7 D:Cures 30% of your wounds (min 50hp), cures all stunning and heals all D: cut damage, poison and amnesia. N:88:Turn Undead I:91:2:8 D:Attempts to scare each undead monster within line of sight, D: causing it to flee in terror for a level-dependant duration. N:89:Prayer I:91:3:0 D:Blesses you, giving a bonus of +5 to AC and +10 to-hit, for 48+1d48 turns. N:90:Dispel Undead I:91:3:1 D:Inflicts unresistable damage on each undead monster within line of sight. N:91:Heal I:91:3:2 D:Cures 35% of your max hp (min 300), cures all stunning and heals all cut D: damage, poison and amnesia. N:92:Dispel Evil I:91:3:3 D:Inflicts unresistable damage on each evil monster within line of sight. N:93:Glyph of Warding I:91:3:4 D:Inscribes a glyph of warding beneath you. D: Summoned monsters can't appear on the glyph. D: If a monster attempts to move onto the glyph or melee you while you D: are standing on the glyph, it must first succeed in breaking the glyph. D: Higher level monsters are more likely to break the glyph. D: The glyph will remain where it is, until a monster succeeds in D: breaking it, or until you leave the level. N:94:Holy Word I:91:3:5 D:Inflicts unresistable damage on each evil monster within line of sight, D: cures 1000 points of damage, cures all stunning, heals all cut damage, D: neutralizes poison, and removes fear. N:95:Detect Monsters I:91:5:0 D:Detects all non-invisible monsters in the immediate area, D: for one turn only. N:96:Detection I:91:5:1 D:Detects all treasure, objects, doors, stairs, traps, and monsters D: in the immediate area. N:97:Identify I:91:5:2 D:Reveals the powers of an object. N:98:Probing I:91:5:3 D:Probes each monster within line of sight, giving information on the D: current hit points of the monster and many of its characteristics D: and abilities (excluding its melee, spellcasting, and breath attacks). N:99:Clairvoyance I:91:5:4 D:Lights up, maps out, and detects all objects on the complete current D: dungeon level. N:100:Cure Serious Wounds I:91:6:0 D:Cures 20% of your wounds (min 25hp) and heals all cut damage. N:101:Cure Mortal Wounds I:91:6:1 D:Cures 30% of your wounds (min 50hp), cures all stunning and heals all cut D: damage, poison and amnesia. N:102:Healing I:91:6:2 D:Cures 2000 points of damage, cures all stunning and heals all cut damage. N:103:Restoration I:91:6:3 D:Restores to maximum all stats that are currently below maximum. N:104:Remembrance I:91:6:4 D:Restores experience points to maximum if it is currently below maximum. N:105:Dispel Undead I:91:8:0 D:Inflicts unresistable damage on each undead monster within line of sight. N:106:Dispel Evil I:91:8:1 D:Inflicts unresistable damage on each evil monster within line of sight. N:107:Banish Evil I:91:8:2 D:Teleports away each evil monster within line of sight. N:108:Word of Destruction I:91:8:3 D:Destroys everything in a 15-square radius circle around you. D: All monsters, objects, and terrain features in the area of D: effect are destroyed, except stairs, permanent walls and D: artifacts. D: You will also be blinded for 10+1d10 turns, unless you D: have resistance to blindness or light. D: This prayer has no effect when used in the town. N:109:Annihilation I:91:8:4 D:Inflicts 200 points of damage on a single monster that is not D: undead, a demon, an elemental, a golem, or a vortex. N:110:Unbarring Ways I:91:7:0 D:Destroys all traps and doors within a 1-square radius of you. N:111:Recharging I:91:7:1 D:Adds charges to a stack of wands or staves. D: Chance of success and number of charges gained increase with your D: level and decrease with level of wand or staff and number of charges. D: A failed attempt to recharge destroys one wand or staff from the stack. N:112:Dispel Curse I:91:7:2 D:Removes all ordinary and heavy curses from all equipped objects. D: Permanent curses are not affected. N:113:Enchant Weapon I:91:7:3 D:Attempts to improve the to-hit bonus and the to-dam bonus of a weapon. N:114:Enchant Armour I:91:7:4 D:Attempts to improve the armour class bonus of a piece of armour. N:115:Elemental Brand I:91:7:5 D:Brands the currently wielded melee weapon with fire (50%) or cold (50%), D: and at the same time attempts to improve the to-hit bonus and the D: to-dam bonus of the same weapon. D: The prayer has no effect if the weapon is an artifact or ego item, D: is already branded, has a slay, is broken, or is cursed. N:116:Blink I:91:4:0 D:Teleports you randomly up to 10 squares away. N:117:Teleport Self I:91:4:1 D:Teleports you randomly within the current level. N:118:Teleport Other I:91:4:2 D:Produces a bolt that teleports the first monster in its path D: up to 100 squares away. N:119:Teleport Level I:91:4:3 D:Teleports you 1 level up or 1 level down (chosen at random). D: This prayer has no effect when the option to restrict the use of D: stairs and recall is set. N:120:Word of Recall I:91:4:4 D:Teleports you from the dungeon to the town or from the town to the D: deepest level you have visited in the dungeon. D: The recall effect is not immediate; it is delayed by 14+1d20 turns. D: During that delay, the spell can be canceled by invoking the prayer D: of recall again. D: This prayer has no effect when the option to restrict the use of D: stairs and recall is set, unless Morgoth is dead. N:121:Alter Reality I:91:4:5 D:The current level will be discarded and a new dungeon level (on the D: same dungeon depth) will be generated. This has exactly the same D: side effects as leaving and re-entering the level through a stair, D: except that you won't start on a square with a stair. angband-v3.3.2/lib/save/0000755000175000017500000000000011651552410014313 5ustar chriscchriscangband-v3.3.2/lib/save/Makefile0000644000175000017500000000050311651552410015751 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk PACKAGE = save install-extra: if [ "x$(SETEGID)" != "x" ]; then \ if [ "x$(DRY)" = "x" ]; then \ ${MKDIR_P} ${DESTDIR}${vardatadir}${PACKAGE}; \ chown root:${SETEGID} ${DESTDIR}${vardatadir}${PACKAGE}; \ chmod 070 ${DESTDIR}${vardatadir}${PACKAGE}; \ fi; \ fi angband-v3.3.2/lib/apex/0000755000175000017500000000000011651552410014312 5ustar chriscchriscangband-v3.3.2/lib/apex/Makefile0000644000175000017500000000060211651552410015750 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk PACKAGE = apex install-extra: if [ "x$(SETEGID)" != "x" ]; then \ if [ "x$(DRY)" = "x" ]; then \ ${MKDIR_P} ${DESTDIR}${vardatadir}${PACKAGE}; \ touch ${DESTDIR}${vardatadir}${PACKAGE}/scores.raw; \ chown -R root:${SETEGID} ${DESTDIR}${vardatadir}${PACKAGE}; \ chmod -R g+w ${DESTDIR}${vardatadir}${PACKAGE}; \ fi; \ fi angband-v3.3.2/lib/xtra/0000755000175000017500000000000011651552410014333 5ustar chriscchriscangband-v3.3.2/lib/xtra/Makefile0000644000175000017500000000016611651552410015776 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk LIBDATA = angband.glade SUBDIRS = font graf icon sound PACKAGE = xtra angband-v3.3.2/lib/xtra/icon/0000755000175000017500000000000011651552410015263 5ustar chriscchriscangband-v3.3.2/lib/xtra/icon/angband-x11.desktop0000644000175000017500000000036211651552410020660 0ustar chriscchrisc[Desktop Entry] Name=Angband (X11) Type=Application Comment=A roguelike dungeon exploration game based on the books of J.R.R.Tolkien Exec=angband -mx11 TryExec=angband Icon=/usr/share/angband/xtra/icon/att-32.png Categories=Game;RolePlaying; angband-v3.3.2/lib/xtra/icon/Makefile0000644000175000017500000000031411651552410016721 0ustar chriscchriscMKPATH=../../../mk/ include $(MKPATH)buildsys.mk LIBDATA = att-16.png att-32.png att-128.png att-256.png att-512.png \ angband-x11.desktop angband-gtk.desktop angband-sdl.desktop PACKAGE = xtra/icon angband-v3.3.2/lib/xtra/icon/att-256.png0000644000175000017500000004340511651552410017101 0ustar chriscchrisc‰PNG  IHDR\r¨fsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î< IDATxœí]wxU×ÿÝTH£½é Mš‘¢ ¨`CQñC°¢ˆ¯ E}m/ŠbCnT:""„€tB$ôœï»‰³³³mæÎÎfw~ÏsØÉì½çžsîÙ;wÎ=‡L˜0áŸ0š&LÓ˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇð+ÀkÄ{š1ÖÒh^L˜ð0‰dŒµ°@¸åÒÓˆ¨È8®L˜0þ´è„'?L°š1VÁ ~L˜0þä®+\`c¬©§™1aÂàO`9€ …ë±àN Ÿ‡ù1acc0ƶ0ÆÍ‘ð@D¹¾±óçŠÖ2Æ&{%c,˜1ö€ÏÜ €¥Ære,üÆXð? ðclc,ÄS ™ð cÑ6˜ ûSEØñø• ¢ýö:¹í!›cÕ=À’ ÀòÚw7€ Þéav¼ ~å,p´ (AWûc½õfÆ„¾`ŒÝ`;€úvnYà9n¼þè–È‘^èСÂÂÂä÷Åø1ö:c,ÐSÌ™ÆØË~aç–ãD´Ùƒ,yüÎÑu?I¯]½z[¶lA:uä·xü‘ –‡X4¡Œ±òŒ±ïÌÀÜê׿þ€: ¬RRR={öàöÛoWº¿ø#Á pgB5,¯õ¶åäÖB‹õçÈ»á—À²ì;.½¶páBT«V ¿þú+Þ|óMÉ¿ `cì=ÆX°§x5á:c£ü ­ôz`` ³Y¬!¢‹žâÍkAD~I¦  §ÌÌL*Á¶mÛ¨nݺ$½GB»42z &•ê²<€Ï•tU±bEzçw”t8Äh¾½ür`Ábðe àÆXºôߘ.]º`ß¾}:t¨Òw;8È{ÎÜ 4Œ±à¯ø•ÿ-66»víÂÙ³gå:`­Øó~í þåXɯBÆ )??ŸäøðÃ)$$ÄÞj`€[Œ‹?€GÜTÒ˽÷ÞK™™™”››K•+W–ÿýM£y÷2œCÏYÇgŸ}FJØ»w/5nÜØž(ð¡FÉ@øë\]”/_ž¾øâ‹R½-]ºT~O1ÌÇ·ei4F€R©S§åææ’²²²è©§ž¢€€{Žà€îFÉ— @o'•äߢE :tè•Îúöí+¿ïw£ÇàMÍ„Áè#7¤?üaÛ¶mgÏ åÑ¢Ñcó%ÙÿŸ=™?òÈ#tóæM+=:tˆcò{Ç=o"X–DO͈ÁBø]j$111tãÆ r„¼¼<š1c›Ž@ý ߸³‘qdd$}ûí·Š:1b„üþ åŒ7$ÂyÙhf BW¹a½ûî»ä :D;wväJAsÀm½Ä€Gm*ʵC‡tüøqE½ìÝ»Wé×–Ñcò6€,‰€Þ3š!±Nj,•*U¢´´4rEEEôá‡R… œ9‚›~Ah Àèq{#­wUIŽaaaôÞ{ïQaa¡]ÜqÇòï]PÑè±y<"N*¨fÌA´“ÚøñãÉdddÐ+¯¼BQQQÎA ]ð€HãZŒa `"€^ð4€{ôp €‚–¿…÷ 㜰'³>}úPJJŠC=lÛ¶Mé»3ŒŸ7Àã¦åÂú @ˆÑÌ Œï¥r`ŒÑæÍ›É]¤§§Ó‹/¾H‘‘‘®:‚óîSÁo€Û¼àO—Àƒ›\íWþ|¼À-¢¶åîtâWªT‰.\è’ü{õê%ÿ~:€(O§,ÀK* =@¸Ñ zXµdJåТE Åà WpåÊš1cµjÕJéyT‰¶ÀAPøNø`³ÁÑ TNvW)ÀWàËñf‚e` €÷¤8âãî»ï¦‹/º$ó7*µñ‚HÞ}‰àSÂß ’ÑLzX “årxçwH+.]ºDK—.¥Gy„4hàhÒ¸WÂOø>@‘ÎÞ]ð €ö*eÛüxõŸòœõסCúõ×_]–qAAµlÙRÞÎejøõøs¡#EPÃhF=(@û¤2§Ó§O“H=z”lOæ9ï­vÂFDDP£F¨K—.4lØ05jõìÙ“âââ¨råÊ®®JìÑ>“à€†VºÚvëÖ­iåÊ•nËôý÷ßWjïYgüù3ÀS.(%@C£™õ P:ƒÇG”Ê`ðàÁ¤V­ZE 6T=ƒ‚‚¨sçÎ4mÚ4Z¶líØ±ƒNž<é4Žˆ(??ŸÎž=KIII´nÝ:š={6 <˜*V¬è9¾Ðc29–·üÀä¸ÒV‹-è§Ÿ~¢ââb·åxöìYŠˆˆ·y^²Áé­÷H…V¡Bª^½º’‚Îha4ÃŒÍñÒ¹sç’8qâÅÆÆº4áBBB¨[·nôÒK/QBBegg 秨¨ˆöíÛGóæÍ£#FPµjÕ\u)ž ?€SŽî öíÛÓôéÓiÆ TTT¤šç‘#G*õу¼À–¼™ —Ü?~œêׯ¯$ÐӪʹ‡SüùÑjòíÞ½›D!''‡fÍšEaaa'V@@ 8~þùg›pWOáÈ‘#4cÆ ªS§Ž+ŽàììWT­Z•&MšDË—/§ŒŒ !¼­_¿^‰‡Åäväí-äÂËÍÍ¥³gÏRóæÍ•»~N `d 4 k×®‘VüôÓOöœl)ÕªU‹^yåáûZPTTDk×®¥aÆ9 ƒ¶¢ÀÀ@š4i’°I_‚ÜÜ\¥SšWT%/°!o'¨*WV‰Á]¹r…Ú·o¯¤Ðï {ÞóUåf5þ#FZ8p@é=µÕD2d­\¹Òa¤›7àâÅ‹ôÎ;ïPÓ¦MNþèèhZµj•.þJ•*Ѿ}ûJe”MÇW4ú¶mÛÒ©S§ìÊב’’b7gB§NèÌ™3.·õË/¿(9Õ“0úª³iâ†mó*ÐÞá‹‚‚¥€Žä¶QIjÔVášëÖ­³«ˆŒŒ jÖ¬™’2'= Gº­—¿|ùòŠG€iöìÙvåéOøê«¯”&1Ò?ü`÷{;wîT õ%ÏØDY%©Qï– ö­·Þ²¯E":~ü¸Ò&Ï ±FÊ#‚ÂÀï*þªIÊÒß°oß>Åó¡¡¡´uëVÅû+Uª¤$ßoÈ l¡,“Ô ¿ wÔ¨QN¹~ýz¥ç±Ý‚Œ˜G„T?¦«8ùãããéĉNåèÈÈÈ AƒÙȬJ•*ô÷ß—ÞwôèQ{g~ñ;Ó“¤Æü„TÀ±±±.)rÒ¤IJÊñ›ä‹ÊŸ:³’AóæÍéúõë.ÉÐ_Q\\L&L°±ŸFÑåË—i×®]T³fM%ûú f‚U1ö[ú ‹TÈ.4»yó¦RŽüB]ŒœG<)7Ðèèh:yò¤SÙ™ *,,TJàIõë×·wÖ`ü,S•ž$5äȾìرÃ%%îÝ»WIY)ðñL,àùø¬Òr…„„¨Ê#èÏÈÊÊ¢6mÚ8ÜK±Ð^È tï+TZ˜ˆ²Á“2–bÛ¶mpmÛ¶ÅÌ™3å—øÐ¥Ê c üžÐ²Ÿ}öºwïn SeX³f êÖ­ëè¶?ô'¢ëbË? õBâqè²/**²wd˜Ñ^Nß„²ë´iÓ\–— [:tÈ^m¿LUï ’µUD`xx¸[qOž<©ô< @ŒÑ*4…z‚wÞy§¦Œ6&86lØ ô8¹ æ ?]¨ôÀ‚Ò7nÜÀÎ;]^M4hÐóæÍ“_ŽÅè`Œø@z­J•*X´häâ4á.úôéƒW^yE~¹ x’T‚ae±DtÀéµ­|‚SŒ?Ç—_Ì»K ƒ^ˆQZJ/Ìš5 •*U2ˆßôiÓШQ#ùåYŒ± ¥ûM¨‡ÒO–ÕŒw×À矎˜˜ùåcan7æ}x\ú¡U«V˜0a‚Q¼ø$BCCñá‡6ûÇuøÊˆ×À©صk²³³Ýj´J•*xï½÷ä—ë‚…(³`ŒÅ°Úâî¹çhG¾‹AƒáÖ[o•_~Ê^|JàðŒ®€‚‚lÙ²Åí†ÇŽ‹ž={Ê/?k™DeV?õÑÑѸçž{ŒâÅçñÔS6óý6ÆXK¥{M¨ƒ þžu¯ôÚ† T5þñÇ#88Xz)¼ødY…ÕæÆÃ?ŒÐÐP£xñyŒ9Õ«W—_6=®@ØÛ¶Ö¼Í›7ÇäÉ“å—{2ÆÆªjÐ@0Æê‚?Æ”âÌi=‚ûî»O~¹—¼ø*\rÀ•+WTuðꫯ¢víÚòËï1Æ*¨jÐ8ô~¨R¥ ââÊòÓLÙ@ïÞ½å—:øÈf²WÀžØžaúí·ßTu޹sçÊ/Ç€×´/K°r]ºtcÌ(^üÝ»w—o²†°Ù4¡Š€ˆrÁ“]”bÅŠª;1bú÷ï/¿<‘1ÖVu£žGS野;Ň_!22­Zµ’_nªt¯ ÷á(tm¹ôÃÚµk‘››«º£>úH¾a࿬ìüŒV‘~¨U«–Q|ø!«Á‡/™ ’ÙÙÙHHHPÝQãÆ1}útùåNTݨg-ýpýºy(ÍÈÉÉAAAürU#xñI8:(¾Pz(cܸqNs8BNNŽR.¸P²»¸)ã›âââhÞ¼yBŠ…š°ÆßÿMÏ<óŒ½\€ß’Ø„/3£Ÿ"|åÊ•©  Àe%*aÕªUJ ý?£áTPÀG |—žšœ0a‚Ï”÷2 ………ôóÏ?Sß¾} ªH¨/yMø93úúráÿöÛo.+Ôºwï.Wè%xyš'µ K®D·Þz+}ýõ×”››«YNþ‚óçÏÓ믿Nµk×v%+™ X¤];½G–*`âĉ.ªÕ>6oÞ¬¤Ø—Œ†´ð· ÆYJÑÑÑ4eÊÚ¸q£é ––FK—.¥»ï¾Û^î?)X ` Î ž¾ x@Ò}¦ø€§Á#E;¨2’À„YeŒ±-ÄÄÄàüùóšß8ëׯ—^º !ehjX0cÀS›•SÛFXXzôè~ýúáöÛoG||¼8Ëòóó±mÛ6$$$ !!ýõœÙž ëÜMD7tbÑ Œ±òè¾® ¾ ¬èbEà+Û³ÎgŽ^NDI™Õ<^,dY©xƒ»Ø»w¯ÒsÞ›F{Dɸ|"»ªY³&=ðÀ´dÉ»%Ø|‡¢9sæÐÀ),,L„ì~Lúé¼<ø¯øw²ôÐ=xÞÍ·´ÕknÙEÁX彟2eŠvë ¢‘#GÊ…s@uÃ…„øQ'°"ÆÝrË-4uêTúñÇéÀ”““#D¾žÄÕ«Wiûöí´`Á7nœ½|þ"è| ðФ÷Zgàôc¯Cr–¿~ýúHMMuú=g8zô(Z¶l‰¢¢"éåùDô´æÆU‚1 `› tO! õêÕCll,bccѬY³Òÿ׬YÓ(¶PXXˆÔÔT;v ÉÉÉHNN.ýZZš'Yù€ˆ¦hi€1VÀëàÏñjÛ CTTÒÒÒävì.JœÁ—DT¬¥!wસÀ>éµ]»v ‡?~</^,½” )Öܸ›`ŒUÖ¢|À!mÔÓÒPdd$š6mŠfÍš¡Q£F¨P¡"##RX˜íÙ™ââbdgg#++ËŠä×®\¹‚¿ÿþÇŽCJJŠRPŽQ˜NDïºû%KZ±'Ì/íæ‘‘‘èÑ£êÔ©ƒZµjÙPÅŠ|K ¨¨—.]¹sçl(99‰‰‰pe®Ø`¹žŒS ÜX*¥@²|yì±Ç´­-HMM¥ùÒh¡§—B8±K¼« é§)xf›•ðÐ’300*T¨@µkצ˜˜ wöž]$ýààçøpY`Û¸©ãÞàŽØa»‘‘‘4fÌZ¾|¹°Ç±3gÎÐ|@]ºtqEöÅÁÃîïU)“*TVëþÉ'Ÿ”  ¬2  :€TÁ†¿@´“~ƒÁO¾~û¬‡&¥^T <ŒüiÍÆ îüDô—   ú­ '{:zLz{pÃ\ÆÓoãÓåùÒÕªtØW_}%D çÏŸWªÿƒ^ƒ–+ ²Òè)Š¡ˆÐüÙô ?ÿjåyÁ/¡kvX àÃĹj¨àoXÞÄËqQvú)¾wuÃÞ÷›4iB?üðƒa¯gΜ¡—^z‰Ê•+çhŒGÜîL®jÈ]ãüMÊXÏž=… bÚ´iòAÃï®iðüD¢¨_#w$ täµ1€Áž¯µð³E';-FrÆ29 Uðžà øJh?€­àû!?˜ ž ¹'y0üW\«Ü¿Wh»¦eŠß §·Þz‹òòò´š®¤¤¤ÐwÞélœ³!8Ê]…–2Ä£'N@zz:EEEɼFä`Æc7¾_Í¢'¿nŽ- üѦ ø¦æmç1@W­À÷=ªÉ·…—ëäÿ„¤Í&pðH7zôh:{ö¬Ë¶éI¬[·Žš6mêhœ‹‘A |c«”¡—^zIØàgΜ©4஢+Ës‚&þu#ôàÑ_<Ú®@£rÁC¶ÛÁÎFcË–-é?þpl„^€¼¼Ø?E T6†!íg¨¤ Z‰æÏ üm‰V}$È”_ ¡¹sç ³SOáìÙ³4dÈ{cÝ  "i•»Û_àï²­˜Y»v­°A¿ÿþûJƒí¯u þcÀ –j5¶TEñeÀ{ôbE”àÐæ¼EEE4qâD{ã; &yÒWT’”‘#FpNNÕªUK>Ð=Z)á›X/À°¨%‚'“¬ô€3Qi¦èèhJLLthoe¯¾úª£¢&¤V檾ÄYJ™¦´´4aƒýôÓO•:\í %|ÿŸÃÚ  ŠV^L²«£0ðh8MzªW¯;vÌ‘™•9|üñÇ 4ÞËn!:€J½¾™3gްP£F”~uK#êTðÜRγ ú@¤ZLrYW5À_iªÒS||¼×îòkÅ?ü 9KN¨DnÊÚ¥³J`Œ--ˆÇÁƒUµ¥„o¾ùF©*Ì8"úÊݶcåÀ¹µÄ?îeÕUHñ,E3ºhžC?<â0|‰}ÀV"º`“.€1Ö<'¥[èÚµ+V­ZåÓåÚ7n܈aÆ!++Kþ§Ÿ‰h„[¹ë1è_/Ý2/´k×.až®¨¨ˆâããå^î$T„E‚GÔiùå/p›ZYéIà“ºxDÞ&¸¾ÊI§<Ι¸<ðÈRu¶À·îèiÀ€ÂÂÓ½{öì¡Ê•++Éá1rGÆîÜLÖÊaNI;Ÿ0a‚ÐA._¾\i€Ýä³.\Èåç„f¨•“^~¨h1€tc#ðÓŠ£àB”øc»í¿£rŒ.ë®~ýú~—yÅŠJ²¸  éíˆ+èUiçQQQtãÆ ¡ƒìر£|€©p# <„–ɱ öDxzª…PîëŒvèî ïÚP?ÑSÃxÿã¬ý   Ú±c‡vc+ƒP8HGà¯Ë‘@=ðÜg¥/^¼Xè”8ÖEþ:ª4ØJPC‹ŒDxlûÇÐÿPP¡=ùxVE{סá4øá¨‹ŽúøÏþ#ÄÖÊ"rrr¨eË–Jrù/éíˆ+(AÚñm·Ý&|:tPòp®,W·92è~­ò ßhð›Â$:R€GxQózn™A2yAÞö¤I“„Ú—/ ##ƒêÖ­+×A€º¤³h-WК5k„.??_©tÔZ;ühyö?S09‘cK¸YÈCôªÊïi®óžÕÇê1¨Fe2uº'ðË/¿(éáCÒÓW”Õ¡áÇ Üœ9s”×ZÆGGÆ®ùÌJù…ƒÔU*IÄ‘g-d÷•¢r™(owöìÙÂmËWP\\¬@wvòSŠ4à'¥ÓåË—….;;[)úi©Œï4l<\{|¿âcAî€OÁwÍÛ€‡G‚gÈéþOuŒ½›”™k,²9)m·R¥J”••%Ô®| ß|ó’>f’ΠdQ[ï½÷žðÁ͘1C>°B,<Ô…¶Ì2ß,èAà)³µN¶}Ƹ2á,Na<ħ@—“椮–1Yµ;cÆ ¡öä‹(,,¤† Êõ‘ ‚ôrÄf»Ý°aCáïhÓÒÒ”êÌ}féÿ] ›(R.Êëu“ì€*û®~0H/0^€|¬’z†‡‡Ó•+WD™’OÃΑú)¤³è%ïtùòåÂ÷ôÓOË– )wNƒÁ) dõ¸Æ ö4MP êv÷Q14fp‡¼ÝgžyF˜ ù:rss©Fr½œ…,¬†måµ{ôè!|p§OŸVª)ïÖÉ1-'2º ²j7è:€1y© ~ÔY¤Ø+€/«CG!!!>{Æ_/Ìž=[I7’Î`¼¼Ó½{÷ Ü< ˜–ù§EËÁ|ºAýéÄ«P™ùÅ O“;€Yù©#oóÑGb7þ„¬¬,ªT©’\7Ig Ù{Ûûï¿_øà>,ª¾Ý È®ê¢lC5éeè¨_åÀ3‹r]4òó ¼Íƒ ±óÏ>+×M.$)Å D”à¿Òkßÿ=.\›€¦yóæ¸óÎ;E4õ=]ÆX%ÆØ+Œ±ÅŒ±n"/c,Àð·%î"À`"JÉS ˆ(|U®Ø¥±Û¥jÕª…øx-Éœüýû÷—_ _…rOmT…l™+²€H vìØ!âתƒ…çž°~Gž ,™¼¢Ç;õГŒ¿0ðÒ`Zå¹T# À%i›ãÆd1þ‡œœ¥ºƒïR‰¼Iƒ²dï·£££uI×tÛm·i1ÖcàïÅß„ò¦œÕó’Y´ƒúø„ÿé¥#>EÔIÔt„¼d™U›_ýµ(sñKôéÓG®£$²È[ø#€s¥®\¹‚%K–ïäùçŸ×òõ­àç^eÑ›1ÖNKŒ±òàKÿ _?^ÚSøKã÷ ¼î‚ôµ¹Ð׿’W`Ñ¢Ehݺ5Z·n.]ºàܹsF³¤ˆÛo¿]~©5c,€~+âÞÜ*YHóæÍuñp­[·VûkåÊn¼MåY7e0O%o ŸžúQàu˜^ ‚©À+—¶/ÊL„bóæÍ6é¹Û¶m+<%žìÙ³GIW£ˆHw0PÞñúõä0íä IDATë…péÒ¥Z—­ðó Ý»w—_/ÐPåø»@ýœÏôÔ~j”ákûì@ÔäɓŊ ¤¦¦*Õ°$t÷ÝwSqq±Ñ,Z¡¨¨ˆªT©"çõ ò€`Eš 0@ø • ‰¸E7¦ÄÄDJOO§ððpùß?R9þßTòs  O¼¡EŽ4ö›¼ÍÕ«W‹3ÈÌÌT:mgE¯¾úªÑlÚàî»ï–ó™Jz;âJµªúÊ£#GŽà'Ÿ|¢ÊhcôØcY0S5¾ ;Ç)Œ»‹†‰t»Þz±Ãs°žÓ 1{2dy‚ƒƒ½êä_QQ <ØjÜåÊ•£#FØØÔ÷ßo4»V°“2¬ž'ŒªÀji›}ûöUaú`Ñ¢E6c~á…Jÿ~íÚ5›¼•µjÕòš¤¥J:é)£ª _Ú¹è\îyyyöJ%YÑØ±céâÅ‹NÛKJJRúþS.ŽWm ò›*¨‘±PQ%ßEP1@¢´Ý1cƸcºaÛ¶mj5æ¡C‡Úlö?~Ü&ö¾C‡^S®LáÝž4®¯¥×¬Y“òóó5ª¸¸˜~øáªY³¦C#íÞ½;mÞ¼Ù­¶ûöí+oç$€@'ãl¢r€ÅZd¬•Àk ªá{‡ þOIÛõ†ã¿§OŸ¦jÕªY·eË–v÷&6lØ`óø8zôhs­ …ãÁ¯yÒ¸ÚÊ gÉ’%š´bÅ jÕª•CãìÔ©%$$¨jÿ×_Ujs´“qNÕà³{ŠÀóªáûAý[¥þ~ë­·TéM²³³mì«jÕª”ššêð{ü±ŒfÍšå¦@a®ü×ÓfuÆ»]»vª²fÍj×®C£lÛ¶­WH·Ür‹¼m‡›tàÑ…j&Q²£v=A^SÉ{{}GÈÛ]°`fý©Eqq1Ýu×]Vü„„„Ж-[\úþĉ­¾Ë£Ÿ~úIg®C!$ø'OØ]r%»³,OHH Î;;4ÆøøxZ¶l™°`Œ%K–(õÓÇÎøªA}¢×EÈX A]!ÕKH@yÛFƼð 6cuÇ!PïÞ½­¾FIII:rí£G–éOOXx]úR&œ¥¿~ý:ÍŸ?Ÿš7oîÐccciéҥ£° ”Š-üjg|©œüà=dîWv—o!û:ÉÛNLL©J—¡äôÕìG¤§§Û¨Õ©S‡.\¸ ×Î1iÒ$ù¸ŽadOK™ “'OÚ0»ÿ~zì±Ç(""¡6jÔˆ/^,¼‘|ðRßVõ,cûEƒ¸My»C®©à{” ¾‡ÈÛ>uê”H5º„üü|›ã³ Pm_GŽ¡¨¨(«özè!Á\»†×_]®»t#Œ,Rnhãǧk×®Q^^-Y²„ºvíêÔðêÖ­K_|ñè.8;©•¾Q›MK7¨¾§u!ã½± ž TÔÿýòö333Å*ÒäääXñ¤ù]þ»ï¾kÕæ¨Q£qëæÍ›'×_‘QÆöž\ÙJï)m¨aÆôñÇS^^žG„V‚_|QÎK€z’1…BýÁŸBh,¢¡•¼­‚ï­û¿SÞþ?ÿü#V‰. ??ßæ”߈#T?Zž‚Ú>©¼0ð|no€Gùt¬4..ŽæÍ›Gׯ_×uð'Nœ ©S§ÚÍä¢@y6‚GÇ= þšªxÑ «òJ–ñ?¯Á\¥z›«’ç‘:ðrZÚÇ”)SDš€*œ8qÂæYÇŽ)''Gñþí۷ۺ뮻¼"KÂy™™ZþË·nTæ ¦‘#GÒ¦M›tô¹sç¨_¿~®9 àCðºt.ý•ÈBk­?#2U‚ºB%ÐáÔ"€=Ò~î»ï>AV  ›6m²Ù;v¬Í}ÿüóU¯^Ýê¾V­ZQvv¶\ÛBá-ÛSZ”U @²;“~àÀ´páBJOO÷È€sssF‚g²y@cµ²°ÈCíFZ µÒÒ¿JžÕÖSüS'~ÖJûéׯŸv#¥ŒSo¾ùféßoܸAmÚ´±ú{µjÕ fRµk×”ôxeusf(!!!4xð`Z´heddx|ÐÙÙÙŽøÛ^>T­ dò Ñ Á‡üŽÔÀ«Ó <-’ösË-·h¶‘'œaŒÑŠ+¨¸¸Ø&-XHHmݺÕh–KqìØ1%=öÔ¢¬–ò¨uëÖôÌ3ÏÐ/¿ü¢ûs½+hРÒÀ?'ñÆÛY£˜,š'¼V_ù¨åµ—N|½.í'44Ô«ÒlØœ¨‹ˆˆ |ÐFFF¾ÁPÂÂ… •ôØP«Â6IŒ‹‹óŠÍ)æÏŸ¯4palô¯,*AýI@‚ÊÌÃ*y]¡Ï|¸¹?â_}åýé‘F^ ®^½JMš4q(£gŸ}Öh6m p†ˆ Ua6ËÞ_~ùÅó£s€7n(åDχ¡·¥´r“®ˆÍ“hà‘ìÒ‘·…S{ãd:vìU¨PAQ>wÜq‡G¢UÝAqq±MV#_’V@\iû¥ wíÚÕÓãsŠ3f()ëoÀojœ\ωæIÆ_}¨;ñ'¥Ÿuâ-²„1€÷í”`ýúõhÅkóæÍ½â±WŽ}ûö)éq r÷ɹùQXXH+V¬ ÷Þ{þþûoUm¤¥¥Qùòååø]i¨Jç&x,ŒÂê÷}ì" ‹(S£´7Ò­·ÞêÔ8 J÷Üs¼­kPëÕ( -%ÁJè €Fù¨àcÁ¿„RTÔÀ[}?¸Ú_:uTéÛŸS 2@"q¥ZUÿ qùÜsbb¢MEGtÿý÷«ÆîÝ»•Ú{H” $²Ø,`’«²ÿÑàû zLþZ7À-†Šòc‡V¥s‡B9³¯èQ2ÙÀ³øÄ€?rÌp΃_NÀwñÿþ*ôyðJPÇ >Mš•+WΰlºesçÎU’壤£h™——˜ âá”3gÎt”ÿï,ø¯J°¬m«çÙˆˆÕç *¤¯È `˜N“-@–“Ý0š>}º*}û#òóó©víÚJŽÚjµ&Ôè‰þ2i§111¥™}Ο?O:t°§àðTaŠïÁ4„, Ú£_ýµRÿBv¶e<iô¤q áÆ©N#)**ÊCeeJy L#¹Ê/h%(xøì³ÏèÌ™3Žb¨÷ˆs¡íï¤ß«^½ºª´avŠ}ü¡ƒ,"7zâ8 ›à‰Nâ bcÎzã7ÜÖ·¿¡¨¨ˆbccå²»…¸á€¸á[…t6lØÐÞ©¼ð„".í&h'oãóÏ?W%$;Å>œ:!²èè¥“ë €[%|~à<9¥ªU«zM¹moÅ?þ¨$»·HÉ>•.j%¸¶ ~@Gmo¶Ó´iSU‡/ìûÐ+ÑÅ‹FOÐLÆc8‰È3€nX ¿>oÞ<·õíOhÛ¶­\Ž9°„þÊI/Àr ØT T¶m“~ûçŸV%(…b ƒò€úÜ{¢i€vøŒ‡÷l0_­”þ­nݺ”ŸŸ¯J美õë×+ÉòS²g›öþ •À_áÙSlmÿ%m³sçΪ„uñâE›:pàç„ÆHø~âÃrÝ¡Õprþ|OÀH³À_#†HxzM~ß /¼ J羌¬¬,¥}¶B8ˆ*ÕÓÃöôÙQ5´=Fnî”—b„ JFø’ŽrémÙxÔиqü|ß⤓ÿk%ûO1oUH& €6lØ J羊qãÆ)Éô;r¤kGÔJàåžJŒ= @5Aí?Ç–tÈ!ª„–œœLJ^³·Žriu¥¸Ý¥+ànÜ>½¾'ðx$ð·@]œð3Yþ½5jPZZš*½û”Jšƒïü×'£ýë½£uhתÌ8cLu¼øðáÕ„w %À¡?d›š‚(¼«ê;ߌÍcø_7ù`ÖÈÛ4h*ûNœ8A‘‘‘J2MÎäêìo%(l©=6ºcÇ{FzÞ™4–¶–‚© ” „õììøjà¯xÂΣ&þfBEú3U-:±jsîܹªôî ÈÏÏ·\çRå&Ã'²‚¬WHHˆêZîÝ»w·g°ÉÐacg<1à›p/ƒžùÊhòÀ­x<Q°‡xl¾)wØ…É~Àz³ÁkCjª½`é¿\&¡¡¡”””¤Jïe §ýJl6œüÀT…ìÐÔ©SU rÕªUŽ ù€º1@sð3ôU 8FÞ",N« €6º^3Bó㇃~mr/ÆÆÆzMO!!!A©âUܨÚl¸i%È EEE©JÌX\\쬊Ðywk’®:°C®£¡C‡ê^QÚ[°ÿ~ªZµª’>CîÈÒ›½‘ pHèÝwßU%ÔíÛ·+¥O’RtÈ&l’*½×‡B†ã^½zQff¦S]—elݺ•*V¬¨dŸkáf ‹áŠA¾— ¢fÍš”——§J¸G¥.]º8r…ž2zÌ&Ü£¤£víÚÑåË—êº,bõêÕö~¤.@ÅkvÕ(‚ pHháÂ…ª…\TTDsæÌqVQx ì„ÔšäQÝÏTÒOÓ¦MéôéÓΕ]†ðõ×_ÛT)¶P:Tœ«!ò@Ü6J…Ò¼ysÍeÊžzê)g»ÜéF=v'ð !›ÌCµk×ö™\‚sçε÷ƒt@sR+;µ_ô6ª±ÎÊ•+5 ýÆÔ´iSgN€À#æ<òªÐ$»ú¿ Ç®«T©B;wîtAÛÞ‹—_~ÙžÝ%¨GZä¦åËÞFà'ÝJtÇwh=ÑÒ¥K]q%„ï¨e´ü•À¡ß”ë&<<œ¾üòK¯+\ë W®\¡ûï¿ßž½íP•´ÊLkÞD“ ©AƒU@”žž®tVÀ凸ªJém’fè CI7:u¢ÄÄD—ôn$ é£>RÊWQB›D’y‰hÄ[ÀSRAuìØQ›&,èÔ©“; „Šü ½Ñrñì+̓„—V°S1F=ô×Öüã?¨eË–Žìj¤aw—à[¨'ýP¿~}!Ö¬YSÍ׌°›1¶16Š1)„!/c¬5cì ÆX2€íFóS": +xî ùß°páB4mÚsçÎEaa¡çTÀ™3g0jÔ(ôìÙ´wÛçî!¢'Ay—ü6²Ñ«a#À(©#""4玳“hAú<¢ñyðWšB’§¸)¿0ðòb/‚¯TÒUŒ#Þh;p0¾9;CõêÕiâĉôûï¿«J8«„ŒŒ úòË/iàÀÎ&} } ¶Þ2aÁøcU\ÿåüúë¯èׯŸªövìØþýû#++K‡nãé!¢Lƒù1¡¦ðcÑàoî­n,Gn£Ý4šâd4þ"Ê/à°càGn·Á:p©úÇí¸ þî:¼ÚÎ$ð7'%ˆ2'¿ïÂtƒˆ²cW!‹ZÐÜ4³P‘ø÷€Oˆ“ÿ瀧\pðoK;eŒµ€µþß„ÁtÞyÄÜu"úÇòÿðƒ*žÂNÙçvŒ±`"ré,«‰²_Ú™.Ë;€Ã†pÁ!wå!9^m·`:ï€Óo{þ‡å€ÔÙeÓø L`<¼ÎX ß0³ ù L`<¼ÕÈ÷:0Æ´Ö 0áe0€`Œ…‚‡üJadò@Ì ?>3Xcã̯ޓl¡¿KþODé _kÛ|…^± ¢‹Œ±Ó°>­Ø|ƒÀ« VFMÁs*>DD[<DZ 50€0Æ~0Òò±*Ò‡3ÆÒñ¯c(qMd·%¢ë:²ê.vÀÚLdŒõÄ¿ÝQi­?c¯Ñ,ù3¡f>`ŒÕpZPs§¼ƒW çµë–šõÁ'µô×¼€ š¾JDU43hB7˜@#c#ü¤SóYø÷1¢äß5D¤º`¡eÙÞÖ½1Ü+xá‘ül /ù ¤Z´hþýû#99ÉÉÉHMMEQ‘ê¬á‘à¿Âí$׃gv–°ã_díiBhh(š4i‚ØØXÄÆÆâ“O>AF†U¶°°=\dÂK`:íè(ý0dȼõÖ¿‰òóó‘’’RêJèØ±c¸zõªMc.`cì'"Z­â»ÏCåä¯Y³fé$—Rýúõðïˤ¤¤$¬_¿^úÕŽàµLx!L –êCVªC«BBB‡¸¸8›ï_¹rÅÆ1$''#%%ÅY-ù©àù÷ÝÅsŽþ†¦M›*NôˆGû}ÿ¢C‡rÐÁÞ½&Œ‡é´!¼.\):vìhçV[DGG#::]»vµº^XXˆÔÔÔR‡ðÖ[o!=Ýê-b’J~ÿгäC«V­0a„ÒI^»vmpŸ¦ ãoà $OÖ¼7á2ÌM@ `ŒÝà«’Ï111¸pá‚Ð>rssQ¡BäççK/'¢åî¶Å› žåŸ¬»víÀ忸tébbbä—[‘«åÙLxf$ 6X-oåËHLL”O~ت²9«Àœ¤¤$ܸ!¶OõêÕQ§Nùeó1ÀKa:m°2lw–ÿ®bóæÍòKÇ4Þ^äÔØ±Cò¯ r0€—Ât*a)8ÚZzMÀ–-6Ñ´6ÁUXêöYí(´¯ rïMOlZªí”whàUÓÕTúu-!«,ÚaûöíòËZgìH&¤‡@KÆX(å ïÌKŒCepÝ[(ÛLgîeÒX^¿µ0ÈBíÈ·¯³c‡?`³ˆö dÃÊÊ5j„Ê•+ løë¯¿-¿,Â<[òaçÎ(((@p°¸"DíÛ·c ÿ[²Z²ãhY}õ×A<¸3nÛÔjŒ±-àuÖQ²ˆþ} DTf|’? à,¸§w—þ0@AyùŸ´íÑ£G“hÌ™3dž2¬þëXÚîöíÛ…óÞ¬Y39ïOiä;ÀKd¨ÔÿAý´ÊЗ¨Ìì0ÆšøÀçj©l¦€§lp™1öcl8cLMµ^Ýß(lª~þ/ñcÉGœô£ òp[@Œ±hÆØCŒ±•®€Ÿ¹  ¢J¶âüÊ[Ä»\+£(€16üúm›­à~ˤ1Æ~±›ÍKl~ KŽ!ú aëV›·}¢Ø­ÚÑc@í›ÆXÆØdÆØŸà5 Ù~‹FŒp„1v§À6Ë$¼>ˆ1ö*€×”þÖ AÜqÇ4hš7oŽÀÀ@ //GÅÁƒqèÐ!ìÚµ ÇwµK°<Ôv5€$’ ‰1Ö ’IˆÌÌL„……©¡2Ž=ŠæÍmÒ ´ ¢#J÷»ÆØß”|®X±"ÒÓÓ­búµb×®]èÜÙ*(¨HD™2^‚t0ØBM]iŸ1†6mÚ ]»vˆG||<š4i‚ÀÀ@£  ‰‰‰X³f Ö¯_´4Å7§Åî&¢ŸÕŒÑ'`ô3ˆ“ç¾ ð,W§NZ³f ¹ƒÃ‡Óo¼AíÛ·w÷¹ñ<€/ náëé=-[¶t‹Wðé§ŸÊùHƒÅak%µåãÜ·oŸPþsss)88X>†^–þ£-ºýÀ5WuD}úô¡>úˆÎœ9ã2/EEEôÉ'ŸPTT”R»7tR#G_ ðËÐ @¾TYŒ1zâ‰'(33Ó±ÆàŸþ¡yóæQïÞ½)((Èg `=ø»ôÒë?ü°&~”0vìXyßËI¬|S¥íÏŸ?_øÚµk'C€íŠ\•yXX 6Œ/^LW¯^ÕÄÏ™3ghРAJý\Ѐ¼Àî=M†3 /¯jIDATÈßäI“+êý÷ßw¦c·‘žžN‹-¢aÆQdd¤šeúôÓO…óU·n]y?SH¬Œ¿’¶Ï=÷Ãã?®JžÕ«W§ñãÇÓòåËéæÍ›Âùºï¾û”úM„ VY"ÃPd x]® ‰':U¬VäååÑo¿ýF“'O¦Æ»l°{÷îÊÇ©S§”úiObeüˆ´ý5jÑ‚ \’cŒÚµkG3fÌ ÄÄD*..΋¹¹¹ÔµkW%^†“Ø¿'ÉplâÑ\×¥ŠéÛ·/:׬`$''Óœ9s¨wïÞJϳ€bcc)??_h¿_ýµ¼Ÿ,hŒ[øQf«~Ž?.t'Nœ ªU«*Ê-22’†N ,  .íפ¥¥Q:uä|ð·U€á Ø0¼)UJ@@>|Ø•ê‹ëׯÓ?þHãǧêÕ«Sdd$½ûî»Â'?Ñ„ lžIY_’ö³páBác¹zõ*=ùä“HMš4¡É“'Óo¿ýFyyyÂûrvV(÷ÌO‘á X1Ã3ÐfIrß}÷¹¢K¢¸¸˜®_¿®[û Qt/“>òþIÚÏøñãuÓµk×tk[- ”õ’ÌO‘· ‚$×|PP^{í5㸱Æ¢¢¢œß¨iii8vì˜ü²^6t*A… Z²‹ëƒ   ̘1C~9ž1f€á«ð6`™5`À4jÔÈ(^ Â$̇ C4JÝI?¤¤¤àüy”"ðŒ35kÖ”_ö›A¯q–ˆ°ÒkC† 1ˆã àvQ®NÝí`™§ç*À¨dg¦0·AR…†1†ÁƒÈŽ1P˜€ºÍHâ‰:­ø›€¡C‡Ê/ubŒU3‚OÛÀ 釶mÛ*-Í|YYYØ·oŸü²Þ3Òª}=Nz;z÷î-O{àvƒØñ(¼ÉX®8p Q|†íÛ·Ë«ئs·V3þСCòÊ>>ÐÐPÜzë­òËÍŒàÅÓð&Ð@úAá$œÏCaù}€ô¯¼@iª."¶mzûïC“&òBÍð‹Ýg¯p–ê´u¥×6lh7ÆAaù­û9ñ<}‰Nøðy(¼mò ô  &dùÜüÍäåå!11Q~ÙS;r‹ðV4nÜX~É\xV•$Ê•+‡ªU«Å‹!ؽ{7òòl’æzj&ZýäïÝ»7oÞôP×Þ…@4c¬¼¼xÞâ¬v¾4”Ó.³PXv'¢‹ê¾äŒ>   ;wîôP×Þ;5}Þ½ÅdI?(ýú4<ùþ_"Ê rÄO#33S~)Ÿˆlj²ù¼ÒPʇﳰSÄÓ;qVýù›¸~Ýæe‹Mú"¼ÖÈÊaû4öï߯ô äéhÕߎ;PPà?EuìÍtD&xRlÜ¸Ñ V<…_ÛóDtÒÓlH?ܼyIIIöîõ9(ØÛ?Fðáix… "O¶YŠÕ«WÄç¡GwA¼â°Õ9d‰(..V²·uFðâix…°`…ôÃï¿ÿn/—»ÏAÇ îÂ/ãpùòeùåJ÷ú¼É¬PúЙ““ƒ¡C‡"7W¯“°Þääd%ãó °uëÖ’ÌA>‹S§Ná_þ›ˆl²²ø"¼¦:0]gŒ-0ºäÚŽ;0xð`¼ð ˆ‹‹ZyÇ[ ¿”^ÍØX­ù322°k×.4kæ{çbJN^N:Ui¥¹ÐžŒ€W•³œÁNPÏh^ Ä*"2,!cìÈ"3ý ¿èOD~ñ Ä›@D—ÁëÃùÅ+;0úÁÛèþÄßFøËä¼Ì0²×‚~‚ « æa)€Bƒy0' ""¿J†àuˆ(@³ÀkÙûƒGÞ^ýÇÐÍ'"Z  ›IÄM{LOD' æÇãðª={`Œ¨/Ú´Ô,g󽌱(ð*M¾Š\—¨,LQ&€ &ôW>˜0aÂ30€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~Œÿ·nmœô–ÿIEND®B`‚angband-v3.3.2/lib/xtra/icon/att-16.png0000644000175000017500000000115411651552410017006 0ustar chriscchrisc‰PNG  IHDRóÿasBIT|dˆ pHYsooñ¢ÜCtEXtSoftwarewww.inkscape.org›î<éIDAT8}Ó=HÔqðÏY(YàKGÆ‘4u\BÒ`öF¤‹CM¡CàÐàP£'mÑ ÜØ VCMYç$XVZAMWhW¡þZþw¾ô…<ßïó…çå'„ „ ¶¶v:î,æÿ{ñx|/v„TˆÏç¿&‰ÝÝÝ÷b±X¥-ÐÖÖv©©©é9Va{‘!„ŽŽŽl&“¹•L&Ó---Oš››ëöLOOçæçç§Z[[¯f2™3CCC·s¹ÜßbaÙkoo¿;88¸2;;»" …0::ú'›Í†žžž§¨.ê7ôööŽ…-033³’N§»Jõ¥ýÅb±]sss‡Ö&&&V …X\\4<<¼–Íf—ªªª•Õ„J Fp—kjj~¥R©sñx<±°°ðfjjjƒHâX¡|8…oÅõà8^àú0‚J¼Ãõ 3ÀcôGñ |Áiô#àfÄe0^f­ó'RQü ŽFù}Œ­7؉ö¡1ŠDÜY|G u(àÊf-,ãB$\Ætá3>á"žá¶mf0ŽITG…ð'ñq ;Kï Ô Kx‰ó¨YÇÕoö±Êâ!Ö°‚Yü@}›”RÉAÕ£¿ñ>„°¸Aá€ï‹*®Ù–IEND®B`‚angband-v3.3.2/lib/xtra/icon/att-32.png0000644000175000017500000000235511651552410017010 0ustar chriscchrisc‰PNG  IHDR szzôsBIT|dˆ pHYsÝÝpS¢tEXtSoftwarewww.inkscape.org›î<jIDATX…Å–_L[uÇ??Z: ü,¶ÐöK$s”¶PjÄ(/.$>nìÁ°ÄMˆ·ddqú°d#“M|q1.…¬‰¦]xÀ¨a œ(ŽX• j)=>Üîîî––©ñ$¿ôwÏ÷üùÞßïœÓ«D„ÿS œ”J©²ÊÊÊI¥TÓ¿™L)åQJÝ™“€ˆ,WTTdÂáð˜Ïç{^)åh·Åä;kkk¯ú|¾#ödŽËív·uww_\®¯¯¿„²Ùn¶å÷ûû#‘H¼¡¡a¨» ßÌÙ0Œ/ãñ¸LOOKSSÓµššš£@•%x)ÐÜ ¸’׃Á‹ËbFì›Íx½ÞG:´$"’N§exx8µcÇŽ¸Ïç;ߨØx5þÔ××÷[OOÏÏ­­­sápxjûöíÏ÷†qnÏž=óSSS""ÒÙÙÂ[" "øýþwΞ=›\[[“ÞÞ^éêê’ññqq’t:-CCCÉ]»v¥Ž;ö·~ttt- ½ëxEyÜ¡§®®îr$YÅbމäĉrøða™™™‘`0ø-Pz[D„P(ôÞÈÈH:ïìZN:• ƒ×7+à|N :^Ûjò innþ(Ì?g—••í;pà@ÍíöWWW•Ëåz8«AŽ·W^¯÷d HuttH,“d2™ó­‰„ I{{{& ÆËËË[³åP²ÉRê%à)ý˜ª¬¬«®®®+))ñÃ0<™L†ÙÙÙÔüü|fuuumeee}aa¡$‘HÜ¡}‹Hÿ–N8ˆ^“ÀNîüÀnÌaä lø+Ú? 8žB¶ä­Àºv>xlÊ€N Ø¸Zà Э ßè8Ó€7_—µS¨wÀ®YNH€Ï€~½Ÿ²Ø¶XlžÌI¸×âÐo/JàŒÆ€ýÀ˜ÖmœÚ€ÍoNë_·@Ÿ6žŠmØýÜcÑW¿ZˆwØüÞÖú ùøXŸ±éw[Þð ¿/4¶l³a¯jìŠÝï¦A¤”*"úq†›åi̘+ÀkÜ*.ýû‰ˆüiÚõï¸ÝÉ> À£÷ßYˆ)àqýø¹ˆ¬Ûˆ»0;༠+ì+€søÑ²ÿò/¶é½Û³õN0 µø½ÅÓá.0ïë´EW,iý§6û n´dÒ†µq£nöç5ˆ€KÚa6K! p¨¾·èÓ˜mùð"Òú·²N\oX¶Yô~`Ö‚m¬ p¸è€mLÒŠ­hÑAE_G‹kÞĬEÌôe¼¯¯*\fKœkŸ±¼Á°×†»²4§eQ®Ä¹x€,$V€ÓX¦_?Дor‘M¾”REÀ3Às€×M_ëâ‹cvA pð PÜ/"“Ží’óˆÌâ{ÝR¹V8òOÀáDê1ûz¯^uÀ*Ôë+ÌI÷‘ˆ,æò'ð_É_¾ñ(Å«óÜIEND®B`‚angband-v3.3.2/lib/xtra/icon/angband-sdl.desktop0000644000175000017500000000036211651552410021031 0ustar chriscchrisc[Desktop Entry] Name=Angband (SDL) Type=Application Comment=A roguelike dungeon exploration game based on the books of J.R.R.Tolkien Exec=angband -msdl TryExec=angband Icon=/usr/share/angband/xtra/icon/att-32.png Categories=Game;RolePlaying; angband-v3.3.2/lib/xtra/icon/angband-gtk.desktop0000644000175000017500000000036211651552410021034 0ustar chriscchrisc[Desktop Entry] Name=Angband (GTK) Type=Application Comment=A roguelike dungeon exploration game based on the books of J.R.R.Tolkien Exec=angband -mgtk TryExec=angband Icon=/usr/share/angband/xtra/icon/att-32.png Categories=Game;RolePlaying; angband-v3.3.2/lib/xtra/icon/att-512.png0000644000175000017500000012242211651552410017071 0ustar chriscchrisc‰PNG  IHDRôxÔúsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœìg˜UҀߚ†!ç dP$,(AX’"’EQ1¯k@WÑE]ó§ ¸ "‹qUA¢ˆ‹%(f@É df˜™ú~ô 3·ûÞÛéΜ÷y ¦ºOõéÓ}ªO¨UÅ`0 CÁ"%h ƒÁ`0øq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆqò9"RTD$h; ƒÁ.ŒO‘ê"ò°X/"ψÈAÛe0 †p ª´ —‘jÀO@Úq¿ÊîSÕ'ü·Ê`0 aÂŒäOîâÄάûý¸ˆ¼)"E}¶É`0 !ÂŒä3D¤ Ö°ºêR —ªþæ½UƒÁ`f ÿ‘ƒ}çÐX*"­=¶Ç`0 !Ä8ù UÝ5à„*À<¹Ú;‹ ƒÁFŒ?y7Ý4à5yVDR½2È`0 á¬ȇD†õÅqè, Ÿªþî²Iƒ!`D¤>p?PØ ü <¡ªYf ãäSDäg v‡®.TÕ\6É`0„ˆÜ<>îW€þªšã¿U† 1Sù—·ã<î`±ˆœï¦1ƒÁD¤°ˆ¼ŒâÄÎà2àI­2„ãä_ÞJàØRÀ¹Ç-c ƒ¿ˆH`6pƒªÙ T@1@>EU¿¾MàG r²­Ð`0„ù °8Ëzn#†€qò7\8ÇåÀÿDädÎe0ƒÁà"R ˜üˆ5ý·#…†$Ä8ù7î4`¬ˆŒ¼p CÀˆH `pq‡¥ª?ºl’!I0@þç¬ün2kJ ±Ëç5 1 "í°ûç)Ù-dHrŒÏQÕMÀ<;½AƒQ²dÉXNÝøBDÇišÁ`H| TŠóŠ5m`(  `ðšÂºuëX¼x1õêÕ‹å¼éÀh™("¥â¶Î`08FD ‰Èàe H§Z ª¿ºd–! 1@Áà`K4…9sæðÅ_йsçXÏ 𥈴ŒË:ƒÁà)Ìnqátfø¿€c€€ªf£íôFŽIÙ²e™>}:·ß~{¬ÅÔˆÈßD$ÖUȃÁi|trátYÄ–5Ô1É€ "Rø…(Q¿Š/Ά (S¦ ãÇçÆodÿþý±7 ¸ZU·Çk¯Á`ø¹xˆi¡Nf¨jw—ÎeHRÌ@!²ð½h:ûöíãÕW_=òï«®ºŠ¥K—Ò¸qÌ‹ýϾ‘1j0Ž™ïø÷:0ÃÿÌ@"Éoa4ÚµkóÓO?‘’ò§oxàÀn¿ývÆŒk‘ÙXI1éF †Ø‘êXq<Úº|êƒ@%UÝãòy I†(@¨ê"`Y4µk×òá‡óéééŒ=š‰'RºtéXŠLæD¦ ƒD¤'ð1tþéééœwÞyNT§šÎ߯(ˆŒ°U‘»Ê%—\—_~É™gžk™"Ò-Ö †‚„ˆ‘çÉ@9§ÇU«Vùóç³mÛ6'êføß  2ˆú–˜;w.ß}÷]®¿«]»6Ÿ}öwÞy'1.ö¯|$"ϘôÂɈH=`pk,ǵiÓ†¥K—rèÐ!–,Yb§¾øÐNÉP00@CU3ÛÉü‘#Gæù»Â… óôÓO3uêT*T¨Kñü øFDΉå@ƒ!?#"—Ëf±wíµ×òÉ'ŸP¹rå1uþuêÔaÁ‚G:€—^zÉ®óxËtþ†£1#”H±ùÑtŠ-Êš5k8餓óÓO?åòË/gãÆñ˜ôp“ªÆu°ÁLDùŒÀʧá˜K.¹„—_~™R¥þL½‘™™IõêÕÙºu«Ýág¨êW1kÈ·˜€Šª~|MçàÁƒ<ú裎ÏyÖYg±bÅ §[‘ާÖhÀ`JØ_‘R"2+‘ãÎÿè­¸Gwþo¿ý¶“Îÿ¦ó7(ÀˆHol¢)R„Õ«WS£F ÇçUUž}öY†êdX27>«êªx6ˆˆ4ÇÚ…S7–ã6lÈĉóŒÈÙ²eK–.]jwš¾ªõY7<Ì@Áf6£™™™ ><¦“ŠwÞy' .Œ'Œ0ÀYXq†ŠHž  †d@DRDäN¬(œ1uþ×^{-K–,Éó9Z´h‘“Î=Ö›Áp Æ(À¨5üó€Þ¸qãX³fMÌçoѢ˗/çŸÿü'EŠÄœ¶¼(ð°$òåd0$"Ò«ãpü”,Y’·Þz‹W^y…bÅŠå©ÃÖ¿l§e 2ûB 6"²hM窫®â?ÿùOÜeüðà 4ˆ… £¦"È‹là5¬œ¿Äm„Áà"R¸J” œ¹Ñ¼ysÞ~ûmêÕ«UoÆ Ô©SÇnšíÖÖ¿±Ø`(¤ÓD¤”­¦!?c; ðæ›o²råʸ hРóçÏgäÈ‘”(Q"ÖÃSAÀj-"Î$ >#"m°âø?HŒÿm·ÝÆÂ… m;€Ç{ÌéÖ?ÓùrE¾ÎWÕ Ûcùˆš¾·_¿~L˜0!á²~ýõWn¼ñF>úè£xO‘ ¼ LàFà'y!ÙÐ` 9ø¸‰;ÿvíÚ±bÅ Ç?ÀðáÃtþŸšÎß`Ç>¬Qv]U#O€ÙGµ…\¥wïÞê&Û¶mÓ+®¸"j™äðJ$P‘‚#ÀÔ<ÚÃéÞ½»zÁž={ôæ›oÖ”””DGŽ–Ÿÿb ÍžtýI~j3âi)))zë­·êž={4~üñGMMMuRV§ ëÉHø¬/¾¼Ñ›@‘ 4âkƒhæäE6iÒ$õŠE‹éYgå¦pXr°òÜ œt]I.JÿöÆÓþ6l¨ .ÔDèׯŸ“²æ]WF’CpàÉ~ ” ÚP#¾6Š÷í^2Õ«W×½{÷ª—Ì;WÛ·oï…#pØX  ]çn Öɲ@% 8fÏ:-‰µ§GÙ|‚Ó¾p ùÌ)Àêøï%ŽÐÎ;ëÏ?ÿwûÎ .¸ÀIÙ“ƒ®C#É%÷ÅØÀs€;ƒ6܈/ãV'mâå—_Ö ˜6mš¶lÙÒ«/+‘+ë°²ÀÝ„µËbŸG6û-›€ÿ`Tt£žü¬)®zXS ÏàˆKÙ²eõµ×^s£iÃ_|áô½Ü4è:5’\"‘—Ò ÄÎ(àV5Y¦ò-"’ |µ3 OÊ•+ÇÊ•+ãê—0K–,aÖ¬Y,[¶ŒeË–%Kàx–W¨êªX‘b@G [D샻'7Š•Zz0X¨á[OQëžœ‹5Ó (ãÆ¹ûöíË /¼@åÊ•Ý8Ý1téÒ…Ù³gÛ©ýWU/q½pC¾§?ñ{½ÿÅÊ&¸'cÄZb} Gm Ô°°uëV>}º>òÈ#Ú¡C7â ì.Tûº*‡5¬? +(QÐ_èAÊ^àC`0î"ÂJÆÓ x…‡ös“ èäÉ“=kËï½÷ž;²AÕ±‘ä€ |ŒÏk´'j;ýßÿþ§adÓ¦M:jÔ(=çœsœQÉM2žzbÝú!èxÃ(™Àà2 øñuè…gc¥ÞéÅ5Õ¯__ß|óM×ùåÆž={´ZµjNìyÝ:5’ÿ ½ „qò±` “n¶k5ÒÌÌL 3Û¶mÓ'žxB+UªO;?tÁš;>ë«òt°É${±bç÷Àƒø @W¬øžØÊ)§èøñãcŽßwÞy§›õÜ®G#C+à ç]à2UÍrá\†!"W`m ŒÊã?Î=÷ÜãƒE‰±ÿ~FÍSO=ŦM›b94 뫲’7–åˆP¹rejÕªE­Zµ¨T©%J” dÉ’'ü]¨P!öíÛÇÞ½{Ù³g{÷î=òóîÝ»Y¿~=ëÖ­ã—_~aÿþý~_Êavb9/¨êÊDN$"ç­Ü0ìxêÖ­Ë<@ÿþýIMMõ¢ˆcøúë¯iÞ¼9YY¶¯Ó—Uu°çò%‚TdKç3N@>FDæb-¢Ê“bÅŠñý÷ßS³fMŸ¬JŒƒòì³ÏòÐCqèС Í |ùò´hÑ‚¦M›R»ví#~­Zµ(Z´¨ëåmݺ•uëÖ‘Ÿ~ú‰åË—óÍ7ß8I9ëеnb0]UÕé"Òk$¦µ†ÕªU‹x€«®ºŠB…Ž±ä ªJ»víX¸p¡êï@}UÝæƒY†|ˆ` ïþîâ9O‘úX‹DÓ;çœs˜={6)))þæK—.åòË/gõêÕ¾–[ªT)š5kFË–-iÑ¢-[¶¤víÚ¾Ú™™™|óÍ7GvW,[¶Ì§à'¬]I¯©êîhŠ"rV\×½¢5jðüƒ«¯¾šÂ… »}ú¨¼úê« 4È‰ê ª:Úk{ ù›læ™  eË–e®Ì¬ ȧ<⤠<ôÐCšlìÝ»Wû÷ïïéxzzºvëÖMŸ{î9ýî»ï|¢”(úùçŸë£>ªíÛ·wš—>ÙƒåÔ×Û`E¬®•W¨P!mÚ´©^{íµúî»ï&·?^¶mÛ¦åË—wbóbòY &#þ‹õ‡MŒ»îºK—-[«0H ú¸Ü`¬µkìîJJŠÎ;W“…ýû÷ëã?kw$ 4Ð;î¸CgΜ©úR]e×®]:iÒ$½á†´V­Z^8ÙXëê«Õþ:` Jè¼µk×Ök¯½VG¥ŸþyhîË5×\ãÄþ,à ÁûÀHr‹õ,‹Öàúõ맪02è 4âA£îNî•*UtóæÍf:¤£GÖ“N:ɵNKD´]»v:jÔ(ýå—_‚¾D_Y¹r¥>÷Üs^älÈ"Áø uëÖÕ{î¹G—.]t5åÊüùóÆûNCð0’übý“¢5¸¶mÛêaâpî ú"xÐp`‚“ûß©S'O÷JÇKNN޾óÎ;zê©§ºÖIÕ¯__‡®k×® úòBÁÏ?ÿ¬=ö˜6nÜØmgÀ±¤¥¥éM7ݤ_~ùeÐÕ•C‡9­§ß€R‚w€‘äëx>Z£«Q£†MŒN@Ð?è 5ârÃÒ8˜ ôá‡Ö01{ölmÑ¢…+L¥J•ô¶ÛnÓ%K–}Y¡æ›o¾Ñ¡C‡jíÚµ}éø‹-ª·Þz«þöÛoA_º#žzê)§×v‰†àù7’?ÄúÃÊwg£+T¨Ð _q1:™@ç /ÖˆËÇŠ§ný.55U?ùä šõë×k¯^½\é`Î9çøàƒN¯í! Á³n$‰õTµk€ï¼óŽæÅG}ËpÞ˜̈È &µÎÉý>|¸úÁÞ½{õoû["É´nݺ:vìX=xð /6T.\¨½{÷vº>W)V¬˜þë_ÿ }^Š9sæ8ÍT¹HÓ<ëFò—XX£Îå>óÌ3W^y%–‡tôÅq±!Y£H™v÷>55UçÍ›§^òÑGiÍš5ãî@*W®¬/¾øbè;üÌòå˵GqßC°â/„5CåæÍ›µråÊN¯¥‹†à7’ÿäÏlVt|¸îÝ»×uÛ ñ±xñbíÒ¥KÜ÷4%%E‡*g.;;[;uêäô&hžm#ùSþüfDkˆ­ZµR' 80–ôoAW€“5’ä(Dk5\«]»v­žyæ™quiiizÇwèöíÛ]³Çà.ÿûßÿô¬³ÎŠÛhÙ²¥®^½:èËPUÕ‡zÈ©Ýk2‚gÛHþ”?€Ç£5ÆbÅŠ9ZÀuèÐ!íÖ­›Óžœt%q±AA9àW'÷¿^½zºiÓ&M”÷ß_Ë”)WÇpÙe—%Õ¢±‚ÎÌ™3µ~ýúqÝë%JèØ±cµîܹNçý3V‚gÚHþ•?€~vò‡~P'ìÙ³G›5kæôÁÜÔº"Œ¸Ø¨  pÈÉýoÔ¨QÜ_ÞzË-·ÄÕÔ®][§OŸW¹†`ÉÈÈÐÇ{L‹+×½¿øâ‹uçξ۽eË­R¥ŠS;Íè¨ÏåÏà4»FùöÛo«S6mÚKr¥@Ñ +È‹ îqúBnÞ¼¹îÚµKcaÍš5qm+T¨Þu×]ºoß¾˜Ê3„_~ù%îÀNÕ«W÷u`vv¶ž{î¹N훢!x†äùóHöGk˜÷Þ{¯ÆÂ?þËÐ츠+È‹ ËZð¾ÓrÛ¶mwÊ .ÔråÊÅüÒoÙ²eècÂbgÚ´iZ§N¸œÁ—_~Ù‡îÔ®_1Û¤ø$Çþ>Ö8»u릱òÑG9óRঠ+Ĉ‹ Ò€ÙN_Èçž{®ížû)S¦hzzzL/úôôt}î¹çB™”ÈàÐ|P .³#p÷ÝwkNNŽg¶Í›7Ïi<ŠC@ Á³k¤`ȱÿ€ÑÑhÕªU5{ì1§c&Ð.èJ1âbƒâXqµž={æ_̘11ö9í´Óô믿Îõ|†üDzeËâZ$اOÝ¿¿ëö¬^½:–ýþwkžY#GŽý ±k¤ñ†CíÓ§Ó‡`pRÐcÄÅFfe\æôeܯ_¿¾ÖcØ:uDú÷ï¯{öìQCÁbïÞ½:hР˜ÛK«V­tóæÍ®ÙñË/¿h5œ–ÿ ‚çÕHÁ‘cÿa­ÞŽÚPgΜ©ñ°gÏmÔ¨‘Ó‡a>tåq±¡Aà»Xœ€ƒjVV–<8¦yzzºos»†ðòÞ{ïżV¤V­ZúÝwß%\ö¦M›ô”SNqZî ‚†à95R°äØ@ 'Zc}òÉ'5^V¯^Ë¢À¡AWŽ—œ„MÄÉ£¥uëÖÚ½{÷˜^àfÈßp46lpšm.]:¡pÕ;vìÐÆ;-/ h¯!x><9ñ?`U´{ùå—k"İ(0htq¹ÁA-`},/d§rñÅ›!à dggëÃ?S‚¡âÅ‹ëüùóc.k×®]±fŸ¼_Cð\)˜’‰¬ÈåÿŽðÕW_Eûµ-Ý»wgøðáNT oˆHzBB…ª®Î¶ºyÞ;‰'R¢D 7OkȤ¤¤ðàƒ2aŠ-êè˜}ûöqþùçóÅ_8.gÿþýôèу¥K—:=d:ð˜ã ·9Þ#î'ŠÇšššªÐDÈÉÉÑÞ½{;õGí%q_€¦ÀïÛ@ž""¶™* †Ã,X°@+V¬è¸}•)SF—/_n{ÞŒŒŒX“-ŠkžE#Wrˆú‰ŸÍ·ß~MÅaܸqÔ©SljúÍ"Ò%¡ ¡CUWݽñž£H‘"L˜0¿ýíoîfÈ×´iӆŋS¿~}Gúüñ]ºt‰úÎËÊÊâÒK/eÖ¬YNÍXœ§ªûœ`0xAÌSø4@É’%yýõ×IMMµSà5)—p¡†P¡ª‹ÀîX-]º43gÎäÒK/uß0C¾¦N:,Z´ˆ³Ï>Û‘þöíÛ9÷ÜsY¹rå ¿ËÉÉáꫯæƒ>pZüw@WUÝåôƒÁ+NpTu°#ÚA+VØúŽhÓ¦ C‡u¢zV"C>CU?ÅÚ~ºÅé1•+Wæ³Ï>sü7ާlٲ̚5‹~ýú9Òß²e :ubýúõGþOU¹á†xóÍ7ûÐYU·Çl°ÁเÍ4€#‡6l-Z´p¢ÚWD¸V°!Ld`E ´¥téÒ̘1ƒÆ{l’!¿S¸paÞxã .¾øbGú¿ýö}ûö%33“½{÷rÑEñòË/;-n=p®ªnŠ×^ƒÁmDUOüO‘g€<'VK•*Åüˆ¸bÄÊ•+iÖ¬û÷ï·SÝ 4Uk%¹! "E€E@3;Ý¢E‹2sæL:tèà½a†CVV_|±ãaüþýû³bÅ ¾ùæ§ElÁÚë¿:^ /ˆk`÷îݬ]»Ö5#êׯÏSO=åDµ0^Dò²Û|<…ƒÎ?55•‰'šÎßà:… âwÞ¡GŽôßxãX:ÿX_þ¦ó7„ޏpw`È!tïÞ݉j{ànW 7‚ˆ\Üê@W^y…ž={ú`•¡ R¸paÞ}÷]ºvíêæiwc-øKlÛ”Áày9?`ÍËæ‰[ fìØ±T¨PÁ‰ê?Eä × 0ø†ˆÔ^s¢ûä“OrõÕW{k¡À“––Æ|@§NÜ8Ý~ ‡ª:Ž d0øM®€ªfßG;ð³Ï>sݘ*Uª0fÌ'ª‡£: ëe"R˜”µÓ4hÿûß½7Ê`ÀZg2iÒ$Çqòà ÐKUç»d–Áà ÑæÒ¿Œvà‚ 8pà€ËæÀE]ÄÀ¨6žp݃܇µõ/*5bĈ>˜c0üIÉ’%yÿý÷ã +½8GUg»l–Áà:Ñ€yÑÌÈÈ`Á‚îZáù矧víÚNTo‘Ξað„ÈÐÿ½vzéééLœ8‘ôt“ Âà? 6äÕW_õ°/–ªºÈ“ ׉æ|lwðœ9s\4åObŒ8ÎD L*žl{õ#FШQ#Ì1rç’K.áŽ;îpª¾h§ªëm5 †§ ª±æÉÇÛúqÓ¶m[î¹ç'ª'ÿö̃kˆHÀ6ôZ¿~ý4h ÑyòÉ'n=­´ô؃ÁUr tä—"#›óú}JJ Û·o§lYÛµ\qqèÐ!Z·nÍòå˨_¥ª¯{bˆ!aÄŠõ96/ɺuë²|ùrJ•*åaƒ [¶l¡Y³flܸÑNõ[àŒÈ"jƒ!ôØÔ‰ú‰Ÿ““Ã'Ÿ|â¢9Çr8T§ÃyàD¤¦gÆ¥?¾F˜lXP IDATe:C¨¨\¹2/½ô’ÕÆÀ-›c0¸†0ÈŽ¦àÕ:€Ã4hЀ'Ÿ|Ò‰j)î+7ø‹ˆþe§wþùçÓ¥‹Éül={öt¨ì!©âµ=ƒDuTõ`Y4/×榛nr¡«£ˆ\æµ=†˜¹ 89šB¡B…xæ™g|2Ç`ˆ#F––f§V ¸ßs †„qS?j¿jÕªcRdzˆðÚk¯Q¾|y'êψˆC "’ Üh§7dÈDƒ¯ žR¯^=î¼óN'ªW‹Hi¯í1%aü¨Zµ*£Gv¤ üÓcs ÎéT‹¦P®\9† æ“9CüÜÿýT¯^ÝN­à(š™Á$N€X¡-óÄ OŸ> 0À‰êÍ"ÒÄk{ ޏÁNaذa”+gB9ÂO±bÅxöÙg¨Þl²–ÂNÔm€G”DæyfȨZµª“-2®°sçNêׯÏöíÛíT`åà¶¿@ƒ'ˆHmà'¢8š•+Wfýúõ.\Ø?à †iÙ²%K—Úæù顪Óü°Ç`ˆ§jÔOüM›6ñý÷Qs¹F¹råxâ G)ÚW{kÁ†ë°ic4¿!é¸åG»ýlS] AâŠÞo<šÒ¦m.€'DÄ›(E†¨ˆHaà®»î:Ÿ,2ÜãÒK/¥bÅŠvjEä4?ì1âÁ©° ø#š‚_ëÀê8Få$W@Eà1L2œÈ…@åh ;w¦N:>™c0¸GZZšçU€!>˜c0Ä…#@U³±É8oÞ<²³£Æ r•¦M›rÓM79Q,"-¼¶Çp=í®¿þz?ì0<á†npòr±¶ ñË*Õ¨Ÿø»wïfÉ’% šÇ§JÛ [)ÀKfE®ïœí—U«V¥gO[Á`-Õ«Wç /´S«"" ü°Ç`ˆ×ðw T©R<ýôÓNT[ƒ=6ÇADj5¢éôïߟB… ùd‘Áà C†8á?Ûc3 †¸pì¨ê@Ô½~~.<ÌW\ÁÙgŸíDõ1±]µcpÛü©:幫Ô`H:tè@ñâÅíÔ:úa‹Á+±‹GýÄ_´hHÀœøxñÅl%+ 8Ú?hH˜¨@jjªÓ]C¨)\¸0íÚµ³S;;’Û`®:ÌŸ??sâ£aÆÜ~ûíNT¯‘¶^ÛcˆîœqÆ”,YÒ/[ OéØÑö¿"ÐÈS †˜pÕ€`¦À '[­ZÔó`mËIPcð©DÍêÓ¡ƒí Á48pÀLBHL€ªnVFÓ™2eJBÅKñâÅù¿ÿû?'ªMGa¼ qñW;ãòÍ›7§T)Û¤¶óƒßij5.ê(ÀÊ•+} |<}ûö¥k×®NT‘ª^ÛS@©í—"Bûöíý²Å`ðœÔÔT'mº–¦ 1ð‘Âûï¿ÇiÝaäÈ‘¤¥¥Ù©•žñÁœ‚H…h¿¬^½ºÉügÈw4ib›|´’v ±0ØM!Hà”SNáî»ïv¢z™ˆ˜y9÷‰êTªdÞƒ†ü‡ƒv5,¶Á1;ªšDMqùå—_²nݺxmJ˜¡C‡R»vÔ‘èüIZcp¨@… Qm0$%•+Ûöïé"RÂ[ §Ä×ö?ÈQ€ôôtFŒáDµp§Çæ4¢öð2¨ I‡Ã‘-3üeñ:Ӄтtzôèá4Öüý‘­kwˆÚÃÿý÷,_¾Ü/[ ÏÙ¹s'Ó§Ow¢jÞ3†P— ª{YÑt-ZÄæÍ›ã2Ê-žþyÒÓÓíÔJÃ|0§ u`Ù²e4oÞœN:1cÆ ¿l2\gݺuÜvÛmÔ¨Qƒgžq´¦Ø¬0„ŠD2äEýÄÏÉÉaòäÉ œ>qjÕªÅý÷ßïDu°ˆœêµ=„¢N”æÎK÷îÝiÒ¤ ãÇçСC^Ûe0¸Â²e˸ì²Ë¨W¯#FŒ`ß¾}N-æ¥]C¬ˆªÆw H9` gJ·.]º0sæÌ8Ms‡ÌÌLþò—¿°jÕ*;Õ÷Tµ¯6ågDäÀðX;ù䓹ýöÛ 0€Ž;’’’È •Á?ýôÿùÏ?~<¿þúk"§ºPUƒ “j0äA¢ÀÀ¨h:ãÇçÊ+¯Œ» ·h×® ,°SûLUM˜º‘^À¤DÏS½zu®¼òJ À©§šƒ?ìÙ³‡wÞy‡qãÆñÙgŸ¹qÊ™ªÚÍ n’¨Pø +ÉN®ôêÕ‹I“î fÑ¢ENSÐöRÕ`/$9"Ò˜‡‹sž­[·æê«¯æÒK/ |DÉÿÈÉÉá“O>aܸq¼ÿþûì߿߭SïZ©jÔ*C$äˆÈ Ïž5==mÛ¶Q¼xñ„Êqƒ>}ú8Ùžø#ÐXU³}0)ß!"·OE¼8ZZ^x!  k×®¤¦šÄކøqqˆÿx~ž^VÕ¨‘S :"R(d{T5'`“ n8wOGÓy÷ÝwéÓ§OBå¸ÁªU«hÔ¨YYYvª×«ê?lÊ/ˆHi`,ÐÛ¯2+T¨ÀyçGÏž=éÚµ+%J˜@k†è¨*Ë—/gÊ”)L™2…¯¾úÊí"VOÿUUÛM~%2:Ü "õ±b ”:JJGþ. íÅ+°Ø‹ìV?`}¨­5j‰á†PXMçòË/çÍ7ßL¨·2d/½ô’Ú&àUu¼¿§ #"Íw€:AÙ––FÇŽéÙ³'\pÕªU ÊCÈÈÈÈ`îܹL™2…?üß~ûÍËâ¾z¨ª«Ã aEDNZðggZDJûP|° Ë8ì|¥ª?øPv¾ a@D¾NÏë÷¥J•bÛ¶m)âɨpLlÙ²…zõê±wï^;ÕU5æíl ¹+³bð7÷(š5kvÄhÖ¬YÐæ|fÛ¶mL›6)S¦0kÖ¬Xöê»Áf ›ª®ð³P?‘tà, KDkQ®lÄ T7 ˜£ªÛ¶'´¸å<ü3šÎG}D÷îÝ.Ë ~øazè!;µ=@=UÝê½Eɇˆ^® Ú;ªU«F=8묳hß¾='Ÿ|rÐ&\æÀ,^¼˜ùóç3kÖ,-ZDNN SÉ›6ªº6H#EDhÊŸ~;À6ßzˆPàKþt¨jf°&…·€FÀ·Ñt ÄË/¿œpYn°oß>êÖ­Ë–-[ìT_TÕ›ý°)™‘bÀó‚¶%êÔ©CûöíˆÙb˜|üþûï,X°€ùóç3þ|–.]Æh’«¶Éø*"­k È_!Œ÷〠ò: pÉ‘•@žoÒŠ+²iӦЬÚþ÷¿ÿÍ7Þh§vh¤ª«}0))‘²ÀT¢ìüH6*W®|ÄèСMš41ˆBÆÆtöóçÏç›o¾Á­w—Ç,:&Ãz¢È³Ý¸øKÀæøÁf,GàUºŽ-¿â¦ð/àÞh:óæÍ㬳Îr¥¼DÉÊÊ¢qãÆ¬\i»=÷]U½Ø›ÂNdÁÏL qжxIéÒ¥iÕªM›6="õë×§páÂA›V øí·ßX±b_ý5+V¬`É’%¬Y“ÔïçÀaýÚ‘X~_æòÈg(ð ð20© …kvÓh |MçÖ[oåùçŸw¥<7˜4i½{;ÚµVàCG’%ÍjmK)R„† Ò¤I“#NA“&M¨X1jöcC222øî»ïŽtô‡;ý;vmšŒ®Ö [DöÞ_3ö';€ÿÏ©êú ñ7~ªç¥S½zu·ƒm$LÛ¶mY¸p¡Ú|Uíà‡=a$²Ío:`z»ã¨Zµ*Mš4¡Q£FÔ®]›Zµjù; Á¯‚&;;› 6°nÝ:Ö®]˺uëXµj+V¬`ÕªUNbrä'žPÕ¨£¤^ÉÕq0ko¾ï*TˆÒ¥KSºtiJ•*EéÒ¥)Y²$`×®]ìÚµ‹Ý»w³k×.<„‰`m1 <¦ª¶‹Å’×y¸5šÎâÅ‹iÕª•ke&ÊÂ… iÛ¶­Õ™ÌCDÎ>À ØaˆŠ+R«V­cœ‚Ã׬Y“ôôô MLUeãÆÇtðGÿ½~ýú‚ÖÉÛq»ªú> *"…k€žÉ(Q¢ 4 aÆ4lØFQ·n]Ê”)C©R¥(VÌy„ðÌÌÌ#ÎÀ¯¿þÊ÷ߌlÝêù&­ýÀHàIUÝéua~ã¶pV ø<2d/¾ø¢keºAïÞ½ä+øøKAŠ<%"}7 Ùÿ<ø¸+/EO¬ åµ( )))T¨PòåËS®\9Ê—/UÊ•+G‰%HKK£H‘"XnîqèÐ!2339xð ;wîdÇŽìØ±ã˜Ÿs“íÛ·sàÀWmÉç(p™ªNô£0IÁZØ7 u¥¥¥Ñ®];Î=÷\š6mJÆ ©Q£†ëí3/vìØÁ÷ßÏ·ß~˧Ÿ~Êœ9s¼šBÚ < üŸªîö¢€ pÛHÅŠ¢—çPqùòåÙ¸qc(‚fåÊ•4nÜØÉ—Ê`U Ç^F‘ë±2=†}9|VèÕ©ê‘ñÂH[lt:g’ŽŒ# .L‘"EŽ8‡ÿ>þçììl233ÉÈȈúwH¦¦Ýâ'¬Xü-°Â͆L »ªÎõ²ˆÿO¬}®Ñ¨Q#ºtéB—.]èСCL_ô^“““ÃòåË™5k³gÏfáÂ…dfººíð$0âè÷MÒ¢ª® V§¡ÑdÒ¤I6n¸á†¨6Gd#PL]®³° ð€ƒºƒÌÀ Öä䚊gs°öm¿‘Ä%+üî‹À¥@Õ£îy¬ÕAÛ˜›ìÂQôâù­‰µ`×[‹-ª—\r‰¾öÚkºaÃç/Õ°wï^:uªÞ|óÍZ¾|y7ïßj ½†à}ˆxÑøZÛUÞE]”Ø]õ€M›6iñâÅÜøhnœWÜ‚—£¬ú&x…#mõ`ðG®Ëˆ½dK±†c{åÜë‹­!°ýxY ”tñÙ¬~»Ý°¯iÓ¦:räHݹs§ý 4 ÈÈÈзß~[;uê¤"âÆýËFÅ5ïîxÄ«NdU´Š+R¤ˆnß¾=ÁÛé>Æ srÓw57ÏmúEuÐ/Ƽ$+ï@ ®=8‚µúwVV² ¯¹ K6Ö»ä¿X£RÝ€RqÞßjÀ²\Óñ2Á¥ö[˜›¨=¥J•Ò믿^—,YåM™ü¬Y³Fï»ï>=餓ܸ‡?c{ ü«xÕ‘üîÒ^|ñÅDï¡ëìÙ³G+W®ìä†?­!¸yn Ö<ùÁ¼ó’-@gŸë$8+@Êp` ÖV× ë"?Ênà3¬¡üë±Fg\ý²‡°úZ—ë¸&n&Agõ´ÓNÓ±cÇê¾}ûN|1æc²²²tòäÉÚ¹sçDïað.Žèø!^½8kaó%ÙªU«Ä5ÊÉÍÞTÖÜ@7+}çμó’O“‚®§£ê« VF´[W°:® vmÞŠ5ÕòðÖÊô^X«Óŧ{'ÀÃ!¨‡£åpz×RëÙˆ»ìš5kêk¯½¦YYYZÐùôÓOµmÛ¶‰ÞËuøü¡’ˆxù Ù6Ìü1ñ»æ2‡ÒSO=ÕÉ~FCp¬DkCðÌMr€Ç€Ô ëÉa]¦atÿ&`M'lA}ú!{±ƒMÅÚ?}'Ðh” úu¯.ÁÚãt}–ÕÄðõ\F Y«T©¢#GŽÔŒŒ 5Ë´iÓôŒ3ÎHô~>M¼·\Ýx4"r-Ö×QžÜÿý<òÈ#ž”Ÿï¿ÿ>}úô±S;ÔÖ$Ž ú)РX_í;±îIn² kjd&QúìH„ËÉ@XòC¿£ª—FSˆD\}¸/žÊ–-Ë=÷ÜÃ-·Üªí{aCUy÷Ýwyàœä‹É‹@?UÝå¢i®â¥P ë«'Ïpg5kÖdíÚµ¾ˆ…–-[²téR;µÿSÕ¿ùaÛDöÉOÎÚ–\XˆõàäûXÜÑ‘’üé TÀŠÆX$"iGýœ×¿ c-¤ËŒHÆQ?çõïƒÀvþìÜ×|üJDªb=-ƒ¶%ÂMª:*·_ˆH àu¬i“˜(R¤wÝuwÝu¥K—NÔÆCvv6ãÇç¾ûîcóæÍñœb%ÐSUW¹lš;x9¼€5üu¨ä“O>‰k˜Æk¦Nêd˜g?PEC0”«`-X zØ37y (tý)8‚#âã´}ÅrÀšåbc-àëxÎÙ²eKýöÛoÕ?;vìÐ+®¸"Þ{ú;ÐECÐÖ¯¬îv•3pà@wî´lÙÒÉÍý? ÁŒEç^ÿXžràõc¤à PX‚ç@±"–:ʶöÄÇ --Müq³ÀÏE>øà­R¥J<÷4 +Dàmýhñú¡JÅfñSÉ’%uÿþý.Ýw™6mš“›T£X‹‡Â¶Zý  fÐuc¤` P–8¿²=·#6]‹55Óñ­[·Ö~øA î³cÇíß¿¼÷u,PDCÐÞUÕÛ8ïj;MgÏž=NñÂyçÇ™gži§–šâÓ)"Òx k+TX˜œ¥ª¿mˆ¡`£ª¿cíàX´-À¥"ò_¬…ÔŽsX-Z”§žzŠ pÚi§yg]¦\¹r¼þúëLž<™ªU«Æzø@`vd=Gàx¶ðH"§_FÓéÚµ+3fÌðÔŽxùè£8ÿ|Ûur:ªºÉ“âBDÊaÅL?)h[Žâ-`€ªš|±†Ð "µ°b;„ew€#4hÀ¤I“¨_¿~Ц~ÿýw®¹æ>øàƒX•jŸf9ÆóLoªúVÇ“'sæÌaÓ¦pöGŠþQ€— WçÿÖ6?ÓùB…ª®:cí†H ºwïÎâÅ‹Mçï3eË–åý÷ßçþûïõÐöÀ4 t/¦_©^ÇGûevv6o¾ù¦O¦ÄÎC=äDm°ˆ„©ƒ=B$&Cï í8ŠÇTuˆªæmˆÁªúVî½AÛbÇwÞÉÔ©S)U*Œ™ó?"Â#<„ HOÏs×{nœL Ò ð| Žìµ]µ(0Wš4iŠ+<·%^Z·nÍçŸn§6RUoõçˆH=¬)˜PÌ9w©êÓAa08AD.ÆJ):Š)ÂèÑ£¹ú꫃6ÅaéÒ¥ôêÕ‹ß~û-–Ãæ=Tõ€Gfå‰/#‘¹ñ£é|ýõסvŽ\¦Q)¼I8:ÿà:Óù’ Uý/ð\ÐvO¥J•øä“OLç2Z´hÁ’%KœLÍ9À)ê‘YyâרLŒo«ݺu£U«VvjE¡>˜ã”a@L-Ñ#2±"ûE m0„”»€Aq˜ÓO?%K–ЦM› M1äBÕªUùôÓO¹üòËc9ì\`²ßN€/S‘yŽÍXáLs¥J•*lذÔÔ˜€ˆÔÀŠeôáhU½!`ò‘¨tg%u°:ü4‡§Ø€ˆë¬¶±<²ÇÝ'"Røv×4mÚ”?þ˜òåË{]”Ácrrr8p`,£Ü€æªºÕ+›‚pN¢¾€š7oÎÒ¥K}²(>޼¤ªCü°@Dæü*/¾Z©êÁ€íHJDäT Ð+G}EŠùø˜,ô: “ˆ üQ÷ƒªþLJr‘Ûÿ󲌿üå/Ì;— *Ø+’‚œœ Ào¼áôù@'U=ä‰AAd ÂÊþ5kÒÒ¥KOÈÂ&fÍšå$óSP]ý©Ó Øãµìêûq½ùI€†Àƒ“‰n VGVãkKÇZâǵüÃÇ{– ,ñêZjÕª¥[·nUCþ#++K{öìK{xQ=jÇ~/<Ì8;…ÿûß>˜?;wv²·pŸ×¶ˆHaà)¯ËqÀªº2h#’©!"ÿ‘ï¿`J%àv`ˆ¼!"M]>¢lýu™|*µ2ƃ]Å‹gòäÉT¬èÅà!hRSSyã7hРÓC†ˆÈ5žã•gM€RX1¶óôzŠ/®»vírÕór›Fjª·õy‡;¼–W½¼Æü"ÀXÑ…àžå%“qiDkšÁ›7™Òôù~>åöµ¼óÎ;jÈÿ¬ZµJË”)ã´]ÎT—Ûo #ªºx;šÎ¾}ûB ¬Q€¶mÛÚ©îöÊ)<àÕùòpKÀ6„é*"³åÀå@¡€MŠFOà;¹MDâ~GˆH¬}Í~0CÕê‘}f°Î­“Ýwß}\|ñÅnÎbN9å&L˜@JŠ£G, ïz¤@·= §‚µÀ)ª×Ó¤IW=./˜={¶ïíPI½©Ç‘Ê÷Rö ½¸¶d¬8ýߣDä  Aœ×v^à}îéÆ5ôèÑC³³³ÕP°xòÉ'ci'ÿR7Û®›'‹¹pëk(ê/Z´Èíúv¶mÛ:¹q©ûõwÁ%_íöuåÁZÅoÛ¾“DvçÅQs|²/ (ðý^šÈ5œvÚi¡Ÿò4xÇe—]K[o®.µÛ Æ6HrŒq”aذaNÔ†DBôºÉÓ;”rrrhР«V­²S½^UÇ$R–ˆ\(aÐVƒn<#"e1@ß m €¿«ê3¹ýBDê?ùdÇ&àä°´EYŽÃ©ŸjÕªñÝwß™¡Ã1\xá…L™2ʼnêà¯jŤˆ‹ §PÕ/±.$O¾ÿþ{æÏŸï“Eñ‘’’ÂÝw;ÚíwWä >."ëþïñ.…åÄ„â…"Ò+r_Aìüž‘KòøŸ_ÿAmÿË‹ NÇŒc:à üûßÿvšõ±%ð·DÊ Üˆ/^y啜|òÉvjõH¬Óн-(žUÕo,?PD¤°ˆ<µÂ=È”ÏA#À¿Eä¤\~ç§à[ô?‡8z¶¯ºê*ºw÷+D‚!™¨Zµ*Ï>ëx†÷A‰¿?pk;A"ÇÚj”çö‡´´4ݾ}{";-|á™gžq²•c¹ÆWO%íêÉcY ‹Çöü X m–Xÿa”éÇÕQSË>”º]uí9±»J•*ºsçÎ_ÃQtíÚÕésð¼ÆÙfC1 ªû€¨é‘222bÉ¥ƒv²’ó ±Í'œ ƒ°¶dÅUÝ`ù!"ƒ±Öª8Ú«S€è&"ƒŽú·Ÿ_ÿ Uu—ååI$bâp'º£F¢lÙ²[dHvÆŒCÉ’ŽÒh\I3¡p"ØŽñ“ÐÚ9_(Q¢7ß|³UGÛY7pk\F¹ÃU5,«­}#²½oVûÌï+üãe¸ˆ¤‹ˆP0Wÿƒñ±‘Ò¥—^ÊE]äƒ9†d§F<ùä“NTÓ€‡â)#ð]G íyr IDAT#"‹€ÖÑtæÎKÇŽ~ʼníÛ·S³fMöï·ýXn­ªŸ;9§ˆôÞMظøØ œ¦ª›*?D¤2VbœVAÛ’Ü ÏÏÕº§«ê ËË•HP–•@íhzÅ‹gÍš5T®\Ùà IªÒºuk¾øâ ;Õl ±ªþËùÃ4Fž& B… 4È^1¶Q€„V{&Ȱóÿ V|Óù;ã¬Øÿ~±1 „ÁØtþwÜq‡éü 1!"<öØcNTSq8uÌùC6lòÜQ¤HÖ¯_O¥JA.„·gýúõÔ­[—C‡ESS ‘ªþMIDÎxÀ¯À)ªšPù¾#"çcmçò+½!v^UUG^¶—ˆH1` P%š^¹råøùçŸ)]º´?†ò:ubîܹvj ´TÕeNϪU=D û—™™Ék¯½æ“EñS½zu.¿ür;5Áúr²ãŽÄ-Š›á¬ó¿˜Brtþ‡€œ ˆ°lÿ»›Îàž{î1¿!nŽðh,ç Õ€ˆ4¾¦S§N~úé'¬5Gáå‡~ Q£FØÔñ! ®ª®Ïí—"Rø™`’þ¬ÁšûÏ  l_‘BX©•]Ë×à2›±¶ .ȲÃm&²ø®0p2Ðk1Z ¬\îæ‡€ ªº;H#D¤4ÖÖØ¨Kú«V­Êš5kHOO÷Ç0C¾¤W¯^Lž<Ù‰êÙªú©£“Æ»ÐKÁZHuïãÌ™3ãÚ[é7½zõr²ó9Í».žtp¼Wre^vå'ÁZÝ?;ÀzÎMö#°:ñªq^W)àZà!¸7e^Ðm&R¿·;±wÔ¨Q¹¾ †XøöÛo5%%ÅÉó1C¶a§Š~ Ö–š¨Ù»woªØ}/^ìôe_^O¬‡Àï½dR·)¿ ÖÈÊÔtj‡e3p?PÎåëì |‚ësCîA»¬•ÿQm­S§Žfffæòf0bçÊ+¯tò|ä`*Û¶ãP­8ŠwѦL™ÂÆ}2'~ZµjÅÙgŸm§V¸%—ÿH”‘3LH2‘DŒ!شʇY\ÔRÕGU5jûU œ ’=˜SöÿŸ Øæð}øá‡)\Ø•ÔíƒÓö$Xï[Bé¨êAà?Ñt²²²5j”O%ÆÐ¡C¨Ý""Åÿ#Yì6ÏŒŠÎ×À*Û7DäQ,'+H½ª:&Òö=AU³Uõ% V½ddƒ†#Å;…F9Yl08¦víÚN·˜_#"¶ëBéDp0##Ã[¢K—.4kfA¶Ö~âÜÔǫ̃è<¨jsæWDä&à¾MÈÄÚÝÑFU'©ªo«ùÕÚ&Ô kJ Ùüë?²0÷;½Ûn»””0¿b ÉÈí·ßîd|yàb;¥Ð¶NU] Ì‹¦³mÛ6Þzë- J{ïuóço‘¨bý<4'KUÕÑRÓdEDúb-° Š•XQ Ÿ ÊÑRkÁYÀê ÊO€À¬áÕ¨)½K—.m¾þ žpê©§Ò©S''ª¶£T¡u"¼`§0bDïqçôéÓ‡SN9ÅN­Ð_DÒpð…áT®/ˆÈYX‰§‚jûcæªúe@åAUÇjgm‹Ca¥a )‚•”+*  xñâvjC\ bÛ·´‘Ó£)„Ýø+]ž|õÕWÌŸïgøñøHIIá®»îr¢z7Ð`²þ­Ò|œð'Þw2Vò ¿ÙôSÕkÕÊ~ "#m—bÅ;Ÿ©êž€mèØÆó½ñÆ}0ÅPPéÙ³'ÕªUs¢ÕSµY…þ¢ÞóÏ?ïƒ5‰3`ÀN:é$;µÓ.òŸíº‹dEDj3€ ±-ÂJ\31€²mQÕYÀAÛá€0Dÿ³ýôêØ±#§vš¶ (©©© <Ø^.‘ú?$³¾ŠÈG@÷h:/¼ðBX÷ÛŸÀÙgŸÍ§Ÿ~DÑí€ÂX‹–>ެ<ö«\µ*Dd0þÇ2Ø€âw‡ÏåzN$êÝ/AÛôTÕƒ*\Dêa“1±L™2lݺÕIT6ÃQ¼ñÆL:õ„ÿ¯[·.>úh%7={öäÃm•›UõϨyªšt‚µ G£Iýúõ5''G“éÓ§G½dð/¬$0‰œgŒßêa­ ñ³þ킾vëõ÷ÚåÑr(pô·³³ÿþjˆ¹sçj¡B…ò¬ÓáÇmbÒñÊ+¯8y¦^×£Úw2NÌÂÊ©ž'+W®dÖ¬Y>™“ݺuãôÓ£fmô‚Tà^ŸºJDª¸`O\D¢ý½ŽÍ"-xPU?ó¹L¿ zà|0%Û(’;vôÃŽ|Ú5kèÛ·/YYyGÈ~ðÁ™4i’V%?Ûa«£ÿ‘”€ªþ?{gocµ>ðïs&óTˆyLI!PR(tot]7]І«R·høu‡î­nuSÝÒœŠT7!qEŠˆ2K…Ž GH”y:ÇpÎóûãÝ ³ßwïýN{Ÿõý|žbíµžµÞµÞõ¼kxÅ{àd¹œ° HàÀ—òЇ{¿#Îñ¹Ì XpùaØÿ·í[mÛ†ê,l¨Ù³g=zô`ÇŽèaGT•~ýúñå—AÛ ÉC½zõ¨RÅöTÃHp4 I €£±b¬É´iÓøöÛÀ·§Ñ«W/êׯ´ñrSÄùޝˆHKà¯>[ Ž¡©NÐoß ïÿ—ÎŒ–¦B… 4mÚÔ'’›‚‚úöíËÊ•+¥ß¿?=zôàÇôX³ÔÁ¡1úó*@Òjyi“&iܧ§§3thžk‹¦R¥JŒ7ŽöíÛÛ%­8 Ní2cbô“Uu©ÏeE×ïrT5ê6Ÿ´ÂÆýo›6mÌõ?‡Ü}÷ÝL™2%¦ßlذßþö·:tÈ#­R‹X €À%"XÞÞ¢b+W®œîÞ½Û3ž“——§ÕªU òÐÕÏÒ±cGݸq£ªªþïÿsò›@¦ú÷ìÏ  ]~*ùUÇ h`‚úßm§ç_þò5Øóúë¯'Ô t’‚3f8iÏ5ÒÇ“v@UsˆÜe/н{÷2rdÔ…‚ÐP¢D î¸ãŽ@uÈÌÌä_ÿú3fÌ fMëf`·nÝ8ýt[Ï¿5¾^ëw 󱬣ܣª;(7(‚t¦‘ûÿçž{®]’bϼyó¸ñÆÊãµ×^ã‰'žpI£Ô¥uëÖ¤¥ÙNëmä貕d]»%ÀÅØX<µk×Ö#GޏkjyÄîÝ»µbÅŠ|u5lØP.\X¨^¯½öš“<–ñ-ᥭhŸy~Ô-LœD?rÒ!¨ÿ;]·mÛ¦†¢Ù°aƒžrÊ)¶Ï¼zõê¶iÒÓÓuêÔ©AW)ô4oÞÜÉk¢šä+ª:ø:Zšï¾ûŽqãÆù¤Qb”/_ž?ýéO¾–™••Ž÷Þ˲eËŠôgþ‡?ü5jØeu:VØT¯ù›eœÈ­ªÖ¬PŒØP¹³Uõ@@e "Õ±_Iƒ œa)¶8p€ž={²uëÖ¨é4hÀ×_ÍUW]5]~~>}úô!;;ÛM5S‡ç,wï‚/DˆÅÓªU+7,OÙºu«–*UÊ—¯­‹/¾X¿ùæGzýûßÿv’ç§êí³nåG»œ zY§0 p0€ö‚zŸg§gß¾}ÕP8Ú«W/Ûg]¡B…Ÿß?û÷ï×–-[Úþ¦AƒºcÇŽ€k^^zé%'cì>ÕXˆ0ë€V‘,^¼8(w»1SµjU ð6 ]õêÕyë­·˜1cMš4qô›n¸ *Ø%»Ðã Aó0ï¢x,€2ÃBç½þÁ6œ´ÓqSyàlW]ÓÓÓyûí·nÇÒ¥KóþûïsÊ)Q^X³f ½{÷ŽêH¨8ã°_Zý[Cð•á†`ÝjõtïÞÝe[Ë;rrr4==Ýõ¯«ôôt2dHÜ7#† 検 êÍ3>Çíöp ‹½¨K²V<?Û{MÐuŽÔû~;]ßxã 5üš±cǪˆØ>ëáÇúûÏ?ÿ\K”(aûûÁƒû\³ä`ãÆNÆÙǪšR@eà@´J‹ˆfgg»ÜÜÞ°bÅ Gƒ(i×®~ñÅ éõý÷ßkVV–]Yù@cuÿ¿ïód¤ÀïÜ®G2 °Îçö~:è:Gê=ÒN×¹sçªáx–,Y¢¥K—¶}Îv×úF娿<ÿüó>Õ,yÈÏÏwòŽ^«šB€Zƒöy»sà 7¸ÛÚqýõ×»öR=ùä“õ•W^q-8Òu×]ç¤Ü—ÕÝg{¶Ï‘kt7ë‘l‚uÐÏ6ït#õži§ë÷߯†_øá‡´fÍš¶ÏøüóÏ׃Úæ7tèPÛ¼233õ“O>ñ¾rIFÆ íÚîø@sS€FØ8*Y²¤þøã.7·»lٲʼng+"¢týªÒÊ•+¬NäÕÔ½g;Ñç‰H?¹¥2 PÚçö>” ºÞ‘ºçDÓµD‰ImÔòòò´mÛ¶¶Ï¸víÚºuëVGyæççëå—_n›çÉ'Ÿ¬k×®õ¸†ÉÅ¥—^êd¼ÕN•C€¨—>ªc ¼¼<ž}öÙhIeÓ¦MtïÞ=a×—íÚµãóÏ?çå—_výªRÓ¦M¹âŠ+ì’¹$HD=ÝÈ+ò°âMgªú\Þ,UÍõ¹Ì_!"XޭФN:Æð1 4ˆùóçGMS¦LÞÿ}ªVuÖ­ÒÒÒxë­·hÖ¬YÔtÛ·o§GìÝÔ­ÕðQ·®íV€:)eDxÜ.Á³Ï>Knnàï™ãÈÉÉáÆo¤^½z,Z´(î|š6mÊ{ï½ÇçŸîi”²aÆ9Iv³KA‚®q!XùH­xÅ™èDZÝ' ÞÿÀšü£Æpø‚-<öØc¼ñÆQÓˆo¼ñ-Z´ˆ)ïòåË3yòdÛ˜+Vзo_ bÊ?U©S§Ž“du_jóB°ÂµF]þxá…Ü[oI€ììl½öÚk5###¡åÓš5kêÈ‘#}õxØ®];'ºÝ¥‰?ϵ‰´MœÒ?Q½“]€>·yý ë©÷EvºÞtÓM¿őɓ'kZZší³ýç?ÿ™P93gÎtôŽ:t¨K5Knþûßÿ:o>ؼ ·]å5jèÞ—_~©W_}µ£ÁM*Uª¤=ö˜æææú^‡ &8Ñq  ÂCä0pr¼:§ŠàÀÁ–‹òmÐõ=¦Þ¿·Ó÷‘Gùõ€(f,_¾\Ë•+gûlûôéãJyÏ?ÿ¼£¾4jÔ(WÊKfæÏŸï¤­^ |°y!@:®/Mœ8ÑÕFwÂÂ… µgÏž _ñ+Uª”ÞsÏ=ºsçNßëp”üü|mÔ¨‘}ûküÏò9'¡£2#^}SI€ÿó±Íÿt}©·­áóÊ+¯üj<'¶mÛ¦õêÕ³}®­ZµÒ¸VîàÁƒmË,Q¢„Λ7ϵ2“‘5kÖ8scl^ p«]\xá…n¶yTæÌ™£—]vYÂ/ÊŒŒ 4hPh® 9t;¹‚8é™À6'¡£28V]SQ€×|lóË‚®ï1õb§ïÛo¿]Èh(:tH;vìhûL«W¯îú{êðáÃÚ©S'Û²«U«ös8óâÈ?üàd̽ø`óJ€2À»FX°`›íþ+>úè#íСƒ+/É«®º*tŽŒòòòEû®ÐØŸ¡m¤GäÔXuMEVúÔÞû’A×÷˜zßg§ó¤I“  Ńo¼Ñö™–,Y²ÈÈ¢‰²cÇmР­-[¶Ôýû÷{¢CØÙ³g“q7=o ªûìÒ >Ü‹²™S§Nu/åïÿ»/ú„’%KڵͲÀ›×‚ƒ}Ì!C†$ÔÐß}÷:T+V¬èÊ ±sçÎ:{öì„tò›;î¸ÃÕÉ8 ¯ŽÉßê˜Ê‚ƒep¥^Ðõ=¡î/Ûéüõ×_6 R–Õ«Wk¥J•lŸeÏž=}½]5|øp[DDß}÷]ßt 'Ÿ|²]Û¬|°y-@s»R¶lÙ¸NÓþùçzõÕW'|‡ÿ¨tïÞÝó3 ^±aÃ'íP€Ã A@/' cåJ'ú¥ºàŸëåì ëZHÝß²Ó{ݺu… ƒ”$??_›4ibû,Ï8ã Ý»w¯ïú 0ÀV·Ò¥KëêÕ«}×-HN;í4»vÙœ²gŽ¢ªË£¥Ù·o/¼`{\€#GŽðÎ;ïжm[Î;ï<ÆŽ›P\ê´´4z÷îͲe˘4imÚ´‰;¯ ©U«}úô±K&À]³ bÿàË€Ê çúTNX¼ÿ‹9p ‡";;;jš*Uª0iÒ$Ê–-ë“V¿ð /pþùçGMsàÀÖ¬Yã“FáÀA-“ò@[÷ÀÏ<óLTÿû;wîä±Ç£^½zôéÓ‡ $¤PFFýúõcÅŠŒ;6f™adèСN’õ‘êÒ :ñ°[Us(7TˆHm šOÅ}àS9±PÚ6AiÛ$ņ¬¬,ÆïÔý¬'åO˜0ÚµkR~XqÐGK @U?ÆæËnóæÍ <˜ùóççOúÛo¿eðàÁÔªU‹»ï¾›7&¤KVVƒ bÕªUŒ=š&Mü:hí=gžy&]ºt±Kf$H¬(+Ñ#€xÃ×”F®ô©œýÀ§>• ¶Q~L  _(Q¢„ëÇb¥L™2¶·Šú¨¾ßæ—ýp¸/Y¹reíØ±£¶hÑ"a}G¥T©Rzë­·¦¼sŠ™3g:i]@y-úYÕu£ÍãqEéTœøÜ§öžt]‹¨ÿ$;ÝÃRÜMrssmŸe½zõ\;‚½òÊ+muœ:uj úE³fÍìÚdO±Xˆð_à{' ·mÛÆ¬Y³øòË/¾âæä“OæÞ{ï%''‡§Ÿ~šš5£FMz.¸àš6mj—¬pC”?Ý=bbw@円Èò¿wa$'ŒËÿ`­LDO°ß6IÊ™™IõêÑwíÖ­[G¯^½8|ø°OZýÂ_þò&Nœ5Mzz:5jÔðI£pà îò2•PÕÃ"òà1?ÊkÖ¬C† ¡_¿~”*UÊ"}e÷îÝ,^¼˜U«V±zõj¾ýö[V¯^MNNŽÓC‘·‹ÈÓªZØÁ‹æ.«ë”=•&®ÆÁ¸K„ñ à8ÒÓÓ™8q":t /¯hM³fÍâÖ[ou| Ú Þ~ûmzè!ÛtO>ù$gœq†…'@àËm~ Ö—çûì3^{í5ÆŽëÅÒ¾SþUÄße¸¶:”„ü¨ãSY3µðßaÁlD¡lÙ²Lš4‰Ö­[óÓO?™nÕªUüîw¿ãƒ> ==Ý•²|ðAÞyç¨iÒÒÒxë­·8ýô .Ãþ™Ü‡±öô/Á û»+Õ¯__zè!ýþûï]?¤á7›6mÒ‡~X5jÄ»e1 úëgš N·œ¨Oq,GY~µóA×צ-þ`W‡Ç¼ÈqV\˜3gŽfeeÙ>ïDƒ­eüøñŽü²<ú裮”—Ì,^¼ØÉ8|9ðÁ«À¥X»~òâU²dIíÛ·¯Îœ93éOó·ñÅA×Ùa»lˆVÒ¥K«ávíÚ¥Mš4±}þÍ›7×={ö8Î÷ü£mž¥K—Ö¥K—zX»ä£k×®NÆb½ ÙåvÍM©^½ºÞyçºråJüå/q»­ °&=tJ¨¿ýâˆÏ“ÒQùÄÏz-Àù‘gíWûî2ƒ®ÃÜ«B IDAT·Ã¶™mWóÅy<«W¯ÖJ•*ÙöƒîÝ»k~~¾m~=ö˜m^"¢ï¾û®µK.cG€Ì Wð¢/5jèm·Ý¦sæÌIú}…qß}÷¹Ù^_·U5Ø—ï~'¥ce]õö¹3€¯|nß÷‚®w íóº]}æÍ›§†ãùøã5##ö/ 6,j>ÿûßÿ4--Í6Ÿ¿ÿýï>Õ,y(((pâ"y½ªÔàêä勦F:dÈ;wnJNúGÙ¹s§íµ xh©!xñªÕ?Vû<1+‚®¿Om|Gm;(èzÇÐ>·«Ï[o½¥†_3bÄGýaôèÑ…þ~ùòåZ®\9Ûß÷îÝ;¥ßïñ²yóf'íÿ‰ªÔ-€ngX³fMzõêEïÞ½i×®"~4 Ž]»vÅûÓ#X{ú¯cÅd›S–@ƒ€Ê>“p{©K9xÀçb˜âs™‰c›ÀÜ(”Áƒ³|ùrÛ¨€ƒ ¢aÆÇ9VÛ¾};=zô°uNvöÙgóú믋÷|¬8ì—ëÀ €óÜȤV­Z?OúmÛ¶-v!`ð 0ZU·¸¯‘kl °ì³HqxËß‚ŸÌWÕèÎÛÃ…í[ôÛo¿õC¤ä™gžaÕªU|òÉ'E¦9xð W^y%‹-¢V­Z>|˜^½z±nݺ¨yW«V÷ߟҥK»­vJà°_æ@pÀJ¬m€˜(S¦ çw;v¤S§N´iÓ¦ØMúÇR·n]Ê”)ãÔíãa ž:»‹4AÞ?+À²=GD.Árûë7ã(3¢ÏBÀÂ… ýÐ#)ÉÈÈ`ܸq´iÓ†µk×™îèÿ¹sçrÇw0kÖ¬¨ù–(Q‚‰'R³fM—5NöËu¹Îå7"r&Ö³¨;áwìØ‘Ö­[ËÈNÑ2dO?ý´Óä5Uõ{/õq¹ëh,UÕs*ÛSD¤4ð–Ÿ ¿©«ªë(7nDdPd4açÎT¨PÁG­’‹•+WÒ®];öì‰g«I“&dggÛæ÷ÆopÍ5׸¥^JrÎ9ç°téR»dgªê×A²™ŠÍAsÂÓžõë×;:u‘«4¬ì+’cP‡ó€Œ ÛÀ£vP›~tÝãl¯)vu›>}º¢3eÊG'úíäî»ïº*¡gÿþýN惽@šª’FpeÊ”±MûÜsÏÅ>¸¸²qãF6o¶uµ±^U·ýŸ W^~Š–`ñâÅQJ,®´‘ ü?8FU—ãÀ‹‡¤÷X~܈ţ8Øbó ¿ňœ„uúÿL§¿™={¶w ¥ gu£GŽêÃeÈ! 8ÐG­’‡ýð¸=«@üœˆˆüפ]ºtaêÔ©>iÛ·oç?ÿù/¿ü2ùùù”+WŽæÍ›óæ›oúºw•ŸŸO£Fl=i7©jP÷ì#"Ob' Š#@cUµmа "%°®û…áËÿ(׫ê«A+aGdÅçÄ膺J•*lÙ²ÅR‹‘'Ÿ|’÷ßÿW_¯^=^~ùeÒÓÓÐ*yéÝ»7ãÆ³Kv‡ª>õóÿi8îÛžŒƒp_}õ•'w'ãeóæÍzçwj™2e Õ÷‚ .н{÷úªÓ³Ï>ëäNmކà¹Û ÐÑA]¼–—‚n‡Ú«ÂØ #‚nm× Øo?ýôS5‚"//OË–-뤯ž£ÇôûP˜¬ªºi—.,g¾ûî;L½zõ>|x‘®xçÎKÿþý}ÕmÀ€T©RÅ.Yéâ‡> 2ذýE¤eÀ:Ø9´ö9ÆMÓ+‚V "r#Vp¬Šñæ1qâD÷2bdÆŒìÛ·Ï.Ù&U]rì_„ˆð6Î_Þ~ûm6n î@ñºuë0` 4à¹çž#//Ïö7&Là›o¾ñA;‹R¥JqË-·8Iz׺$ŠZ‡D'¬F&ðßÈÁ°P""ç`ìm´.EP[Dš­Ä‰ˆÈÉ"ò_àŒ‹òÞ{ï¹£”Á…m¥–ìÄ¿ –Ÿðw£¥9räO>ù¤? ÃŽ;¸ãŽ;hÚ´)¯¿þºOK?£ª¾¯\ <ØÉ)Û"ÒÊ}䥠ÀºF÷lÐJ†ˆ\޵ìJкØpgÐ ‹ˆ\å¡Ð•³999|ù¥mxƒÁuT•I“}'ýÚJP÷Ùìh‰ÍFÙ²euçÎÞl¤œ@nn®>úè£Z±bÅ„ö@³²²ôûï¿÷Eç£ÜvÛmNt«!xîv,I¤ý]”›‚n‹cÚ$ë–‘´‹)Ú„ ÝʯzQG»ÄóæÍsÒ?w™zÂxÍ €ª~|-;}ûxþùç½Öƒ7ÞxƒÆs÷Ýw³k×®„ò;tèO=õ”}BùóŸÿLF†íªæoE¤¾ú$HX¾¾Ÿ‘?­„ˆ´–ÉrTZ€"R2ÂEÒEd ð 0À‹2Ì6€!ž?ù@ ¢E´±±fªU«¦yyyžXS}ô‘¶lÙÒõ¯ƒòåËë®]»<ѹ(úöíëD·g5Ï=š`¹±Ýîö3‰S¿ ¨*cùÍ(A;Ä+Ó€’>·[w`…õ[·nýÀ4\¤I“&NúæÕZÈØÕ €ª~„õuS$[¶laôh[/1ñÍ7ßеkW:wîÌ_|ájÞ{öìáÅý½zïÐ1б½6$ªš‹ƒ[">‘¼+"wK4O&.qìs= ôÇúšNV.&Šˆ§2"mv™ˆÌÆ:HÚÌËòŽòÎ;ïøQŒÁÀ¢E‹ÈÎζKv(܉NaVAÐü‹¦Q£FšŸŸŸ°õTPP Ã‡×’%K&jýe—¦zõêzðàÁ„uŽ…K/½Ô‰îhž{4Á:ä¶/Ágä¶L*y\ïæÀÜÔÕmÙüÖƒöªŠÍqmõª[·®+ï%ƒÁ ýû÷wÒ/§jQ㥨R°ö5sì*öÞ{ï%Ôx999Ú¡C‡Dý‡@ûˆÞËìÒ¿òÊ+ é+ü±“:lJkž}4ÁÄu¢lþD!l¨gi,#xÖ–CÐuôR¦=¬Ú«Ö¾þ8à`Ðuš2eJüÖ`pÈöíÛµT©RNúd‘‡—©©ÜjW±víÚÅÝx#GŽÔråÊ%2ÐOй¯Ýïš4i¢qëçœsŽ“úܪ<çXËÓ]ÜÞÚ<–ÕXËóåã¬[&–Ü7 ßJ‡²ë>þVbbm}œ \I÷ÖU¾ u?N.¿ürׯ®ÁP?þ¸“þ˜TÖ$4Jc}™F­àœ9sbj´-[¶h=àë€>Dâ(œ s°Þ.‰'Ƥs¢¼óÎ;NꕤŸX§° V˜ÞÀ_òQ$xè‡P¦DõHê—cM|a9ä)¶b­°•!ÐËVÒÒÒ4''Ç‹¡l0¨ªµuÝ A'ýqŒF{ŸFûÇ ø‡]»wïî¸ÑƯ•+WŽw`oà Lu©¸Í.¯óÎ;ϱÎnpäÈ­W¯ž“:þ>ZÝ @™ÈÄø‹Þ¡ÁZXеj´ëDz^t3â‘ÜsÏ=Þ hC±gÚ´iNûâyšÄ@l¬~Ñ•+WFm¬]»vi¿~ýâ̹À£@E‡:—ÁÁ×Üܹsc}æ á0HÐR'u Z€kƒ~Á1MªT©âÙUeƒÁá*ö—j÷.µK´ÏÙUôºë®+²¡fΜ©µjÕŠw jÅ¡³íÊE=b|ä‰qàÀ­R¥Š“:w޵¾A0+è—¼#Ñd̘1žgCñå»ï¾Óôôt'}ðFM >V "+š••¥›7oþUC=÷ÜsNêDÙ tM@gWV.ÜæpR÷â­·Ÿ4źßø‹>$k{+YÜ '…´nÝÚ³±l(¾ :ÔIÿÛ ”Õd7ÔzÙµ«ð°aÃ~n ‚‚§T˜¼ œä‚ζ+ ˆ¿ÄÁ¶mÛ´L™2NÚ e¢õ÷CçµÀd“DV}€§C OJ‰ß~ ©ÍæÍ›^ý¡NÞ¡N-Xׂ¢V¸B… º{÷nÍÍÍÕ«¯¾:žÁºø‹:×Çæ‹*ÄA‚Þr«¼,Áë‚~É'±ì:Óž•ppóƈsiÞ¼¹q dp›o¾Ùiß;]SÅPëå4Ó®Ò÷Üsžþùñ Ô€êèüŽ]ÙC‡M ;ÄÎúõë5##î=ŽuÜn/8›$¹2Ù\TH{ÞÝRJÞxã OƲ¡x±víZÍÌÌtÒçf«Ó÷§Ó„A ÐŃÁ¹¸ÁCmW.B$èi/ÚÄ Á&#ÇÉ> Cm™Ž–FœK½zõôСCîdC±âšk®qÚçz¨Ãwgè‚…ªN¾v1˹@ U}ÉÅ"âcëƒÂö7<òˆ›CØPL˜?¾Ó>9]c}gÆúƒ ¸#Îû6n=Ôùvú…8HÐx/ÚÄ+Ê3B0A„EòûâlËRÀâÔ!L’ ã˜D,ïŸ[ì~[©R%ݹs§[Ã×PL¸è¢‹œöÍVëõA Ö ~GŒƒv5—>=Ò9™ƒ`•üÙ; V@ž '‹ e' 8´Š´e ,ÇXA×% ò)аˆvºÅI7Üpƒ #×P\xë­·œöÍqÏøŽçGA ðP ƒ685:±Ó5ÄA‚¾£ˆ¨va¬Ó쯇`ÒJfõ]jËÖ8ØçNaÙü‰B"€ÓFYXy‰ˆÎ˜1#Ñ¡k(üøãNƒ×šhc;inœÀÓÀAé¶by9Ûì±>Nxkå¢H>ÿüs>ûì3ŸÔôôtî¼óN'IOÃ2º’µN³À |$`uüd7p#ÐQU׺‘¡ª.ÎÃ2‹ÍUõ9Uk¦/ U=üÍ.3UeàÀìß¿ßM )È-·Ü¶mÛœ$­ªÙqÕ^$ºU´‹-]ÿ´Ñ9ÌA‚ ˆñ„iXh¬qPÇd—ñxàÐê˜v¬†Ò8èzú!K€KblŸ4¬›¶ùßvÛmñ WC1a„ NûipšÆ;¦ãýaМe°.ZÇBt®Šuˆ¨Èâ Aе\Ç‹¶ñZ°Î޼‚‰Å ù¸Ò§v, ¼‚:{%k€>DYî·iŸÎNÊIKKó=$¸!9رc‡V«VÍi}Pωü8h*óë+vÙ@» u‹¢s2 R`‘ëOÉ(ÀÕÀÆL4nÈOÀ½@9ŸÛ0 xԊƸ dºÐ>¯8)³Q£Fš››ëxœŠ×^{­Ó>»’ÏfþBNT€r@;àR 'P2hlôuÞ8¤A‚ŽÊB Œíã‡%¡Ä~›$,²¸+ègœÌ A{$"‹€kqñ+PØä¤üc£˜ S¦LqÚoó¶šh_M4#q½ lÇ4Hб2 ¾–‚,ÇA<Á„¾ÇºMR*è¶;¦ ¸žäŠ"xxÓh”v¹Ü‰.ééé:gΜ(#ÓP\øé§Ÿ´FNûðêB?µ:«ÁGD¤Ö—G‘”/_ž 6P¡BŸ´‚?üáNýMe p­&y'‘êX“Ø ^ÀêœÈ!,Çc€Éªêäö‹ïˆHeà~ ?Öpù+BçHUÝâua"2Ë}yTªU«ÆâÅ‹©Q£†×*BÊ‘#Gèܹ3³fÍr’|-p¦ªH¸`7¬#q}!؆7~ôÑGÕO–-[Ï×Ôã^´O‚õ5{ðÁ® `-­ßœt»Ä؆e€AÀÒÛïXY†u´qmqðƒ=[·nmÎcn¹å–XÞ Õ¥>jVBDº`}ÙIõêÕY¿~=YYY>i—]vÓ§Oõgw©êp/ô ©€µŒ{QDê{\äFà3¬(•STu½ÇåyŽˆ´Å2:µ|*v0Ë€¯ª«}*·PDä7À'iûõëÇèÑ£=ÖÈ6^}õU®¿þz§É_PÕ›Ý*Û""_gFKóÊ+¯ÄÒ9fÆŒ\rÉ%±þL±¶Æx R(‘ZX†@G )Pë*ªÄ˜UÖWáF¬¯ä¹ÀgªºÁ-]ȈÔÚ"ºaPåßbMøóyªºÊ…|]EDþ üÎIÚ'žx‚;î¸Ãc aaþüùtìØ‘ƒíìmNWÕ½n•o €‘k°–›‹¤I“&¬\¹‘Xç™øiÕªK–,‰õgùÀ`U}Ñ•B‰ˆ”jG¤V ‰H¿[±N…o6«jqòLX("R«Íj5ù³–‘”‘£ÿ½+žÆwY¯ª?ú®xˆHà+,GJQIOOgÚ´iñá†$cóæÍ´jÕŠ~øÁIò| ‹ª~ì¦ÆÉÀ:ÐqZ´t'N¤gÏžþ(Œ;–ßýÎÑKaü ø?5Ë`ø9øÈ´K{ÒI'±hÑ"êÕ ÛyTƒ[äòËTu†‡*™€09ÍüºMþýoO¶Š¤T©R|øá‡<õÔSœrÊ)ñfS ˜-"Ý\TÍ`HZTõà*,/¶Ìš5‹îÝ»“››ë­bϸï¾ûb]Åæõäf 4ˆH¬H{EeYYYäääpê©§ú§X„ðè£òàƒRPPOùÀ߀GT5ß]í †äCD/9MÉ%—0yòdJ–,r¡ÐBî¿ÿ~zè¡X~ò¦ª^ã•>ÇbVB‚ª®ÁÆcØ¡C‡xê©§|ÒèxJ—.Í<À¤I“(_¾|‘6^`0„U-PÕþÀý€ã½¾;vЯ_?zôèaV<"//¡C‡rþùçǺßð?àBUÝæj1c €¢ªû°1vìtõègÊ–-ËE]äe— Dd’1 Å U}ø-SXÀÉ“'Ó¬Y3FŠiÁ`üyó8묳xüñÇãñˆú(ÐSU÷x Z\ ¤D†Ô‹–¦E‹>icOºtÇ2æ‹ÈD$ËB † QÕ‰ÀyXók×.ú÷ïÏå—_Î÷ßïrÅ„ÜÜ\îºë..¸àV­ZëÏó€kTõžÈöNh0@x±Q/¸à?ôpÄ™gžégqçc€ "ò@ÄX2¤"rŽˆ˜°w' ª_­¹±þöƒ>àôÓOgĈûIF¦NÊYgÅðáÃãùêß tPÕ7=P-aŒ^*Ù%8ÿüóýÐõjâÐïà¯Àw"ò¶ˆ´ B CbˆHyLDÖayD´NaDUÂržõj¬¿Ý½{7·Þz+7fÔ¨Qäç›x\vÌ™3‡ /¼nݺñí·ßÆ“Å" µªFuï$Æ/™Ñþ1---Ðx'røðá ‹ÏúŸ‹È ¹WDj©¡hÄ¢ˆ ‘ï€ÀP n$Éí"bÞM… ª‡Tõzà ¦{gëׯ§ÿþ4oÞœqãÆîK$Œ,Y²„.]ºÐ¾}{æÎyÁå(oíU5'µ‹À ²ð’íðÃï ÇÒ xÈ‘9"r£ˆ˜¨)#"i"rˆüËÇÅçÀŸÓ IÞèá§~Ɇª>…u.`E<¿ÏÎΦwïÞ´jÕ*V·µ)Ë7ß|C¯^½hݺ5~øa¼Ùìú©ê5ªú°Æ/Q Ug?Ê36mÚ´ '"ÀÀ À"ò¾ˆô‘2ëUlˆLúEd° ˜ÜÔpðó?{ª\  v6ðq¬,]º”®]»rá…2uêÔP½SübáÂ…\{íµ4oÞœñãÇ'²*28]U“ƃ RD¤706Zšììl7nì“FÑ8p #GŽ Z 'Äšˆ¦SUõ›€õI)"ÑÛ¿ª&]kU]ìŠb)Žˆœ ¼$t·V­Z\wÝu 0€ÚµSwmçÎŒ3†W^y…¯¾ú*Ñì¶·ªê]PÍWŒRD¤96AÆŽKïÞ½}Ò¨hòóóiذ!999A«°ŒiÀ Uݰ>ICäfK¬ ÿ¼ÈŸ5],âmUíëb~)ˆdÿ܇Í";ÒÒÒèܹ3¤Gde¥ÆÛÙ³góòË/3~üxòò\Y¡9 ™t ¤Dó> È‘7lØ0}ôQÿ”*‚^x›o¾9h5Üà0°X‘/€¯U57P­B‚ˆœÂ/ýyÀ9@I‹<ÔSÕ¨q1 Ç#"-°VZº‘_•*UøýïO×®]iß¾½W^?=¡  €/¾ø‚iÓ¦1jÔ(V¯^íVÖ?bMüãÜÊ0ŒbDäK¢,éÕ©S‡uëÖ!">ju<»wï¦aÆüôSRÀNȾåƒ`°,Y-~§ˆH:Vß;v¯õGÞ𸪠 Ü¤FD2€›°Vª¹•o‰%¸à‚ ¸ôÒK¹ôÒKiÑ¢E ïŸÂØ´iÓ§Ogúôé̘1ƒmÛ\õº›<<t 70@ˆ‘W±¹=wîÜÀüäææÒµkWfÏžHù³™Œ`­&Ñ€‘*@Ž„yÚ IDAT¬‰½N!ÿíå×½SvµÌÖL|Dœ*Ý Nv;ÿªU«Ò¹sg.¹äZ´hA“&M(Uª”ÛÅI~~>ëÖ­cùòåÌž=›éÓ§óÍ7žë9 ŒÄšøSÆ­¢1BŒˆôÞ–æÚk¯ Äß÷ÁƒéÑ£Ó§O÷½ì³+Ò×÷Xƒ¶Gþ<ö¿·Û"±<%rý±EOðÉr#âvUýOÐJ$3"RËwÀŸò^•“––FݺuiÖ¬ÙÏrúé§S¿~}Ê—/OZZ|Ïöïßφ X¹råq²jÕ*<èr-Ž#Ëë誚”‡œ¢a €9°¨\Tš´´4–,YÂYgå›^»ví¢oß¾L:Õ·2Sƒœ`óç.¬k %N’1ü] œoµñ– ¡ª÷u 1 ‡·¾næ‹eË–¥B… ?Kùòå©P¡åÊ•#77—Ý»w³{÷nöìÙsÜà¹P±øýMUcù—, äˆÈ3XKxErÑE1sæL_ô™7o¿ÿýïùâ’ ‰Ò;Ù\…‰ÈÎ{€þ@Å`µ ‡IÀ?UõË •ñã(ü¼n—à“O>á™gžñT‰‚‚yäÚ·oo&CÇ@.¢ª[UõàT ðiÀ*Í·X+#µTµWq˜üÁ¬$"2è-Mzz:S¦Lá²Ë.s½ü)S¦pÏ=÷°|ùr×ó6b ªÎZ‰TED?bÚJurqÀ+ªZ, c$"rÖió¨*T¨Àÿþ÷?×Â/\¸aÆ×Sþ†ðñ®ª^´©Nä awàzà2lÜ’'!K°"*¾©ª»ƒV&HŒ$ˆÈ Àvé²²²xá…0 ¾ˆªyyyL˜0W^y…O>ù$®< Ȩêú ).Dn\ \‘úÁjÛ€éÀGªºÀ%Aa €$ADª«px`§OŸ>üãÿ aƶi<ÈÂ… yçwxóÍ7ÙµkW¼j&A¤ƒ OEö®  "õøÅ¸ë¶IØ8„mrzD–&“?1@!"¿ÆcEº³%##ƒßüæ7´k׎–-[rê©§²gÏvíÚÅ®]»X¶lsæÌaáÂ…nøÅž‰u¢ø7XÞÇ c0Å^ ¦ªî Z‘âNÄ[d+à, )V(îf8‹öè;•À7‘?—Ÿ«ê~uHZŒdˆÈýÀ?ƒÖãò¿«j@$äîmÀP RpªR”»TuxÐJ '²mД_Œ‚†XïòÇH¢Ä9Áz¯ì9Avcù„8:Ù£ª[¼©EñÀIˆˆ¼ ô Z`#ÐWUçö"RëúÖ¤ŽSCðlê«ê‘ 1Ĉ”àƒ  –s¬=ÀnU=¤nÅc$!‘3¸" r§€Gœ,ÅŠÈÉÀÝÀ`|ö>fHYú¨ê;A+a0$3ÆHRD$ x¸ËÇbó±®Ïü]U7Çúc©†«üF¢/ÿ v,TÕsƒVÂ`HfŒäˆÈ±|À{Åa`ÖÄŸ°_l9 ë àµ„#âœ!9¹°¨í'ƒÁ`1Ri <ts9ëX_ücTõG—óFD*ƒ€›ZnçoHY²±\d¿®ª[ÖÅ`HZŒBˆH;àA¬û¹ñò=0xMUº¢˜ ÏcWbݸÐ2 IÇ.à¿X“þ‚ •1Rc¤ "ÒèœuG÷´"’櫹À`NÐ1¯Eä,¬P¥}1ÛÅ|,G.¯﫪§ß †â†1Š‘àõ±¼ô½O»Øwôî~Ø0ÛÅš•À(à Uý!he †TņPÙ¸ øÐëΰ!õXLÞSÕ%A+c0Œ`H"þºbݱœ‡’“`Ö¤?QU׬ÁPì0€!)‘ÒÀåXÆ@7 T°‡•m"0Ù‹›%ƒÁ9Æ0$="RëÐãï€K0ÞÃÄ&¬@Q“€i&H‹ÁŒ`H)D$ 8˸+ZYz J/6³YÀ,³´o0„cRšH@¢Žüb4 T¡Ôc/Ö×ý,Ì„o0$Æ0+D¤Ð Ëh 4$P¥’›9ªÚ>h% CìÀP¬‘rXÎ’Zb9Nºs `+° ¨´ˆ’.(oBó ɇ1 †"’ì£øx Tà '"+°&ýeªº@D`ŃˆF+swß`H>2‚VÀ`õ±ŸüïVµO:@e/•‹“íÀz~™ä•õÜëÎwPF[ÀC’a ƒáš;H3EUWößµS 'Hù"þ®<ÖÅrŽ£'ü÷‰— ìv:øs›ªî‹¡þ…‘ˆ§b”4mg,Ç`0øŒ1 †_8Ýæßßõªzø&")ªªˆ,ÀrÇ\íüÒÇ`0¸GZÐ  !Ân`•ªöE“pa· P_Dªø¢‰Á`p c ¿`gºô_ ˜ç M[ϵ0 ®b ƒŸ=6²I¶Ü]BȬ3Ñ0€ÁdÀ`°hŒý™˜bi¨ê.¬›Ñ0€ÁdÀ`°°;ÅÔˆ`· Ð&âGÁ`0$ Æ0,ìöÿsu~(Rì–Å™e0B‚1  ;àU-ðE“pâä  ¹h0$Æ0,ì €â¼üÖ ˆ½6iÌ9ƒ!‰0€¡ØñàW×&Y±6"«‹l’À`H"Œ`0@SìÇBqõp,vÛE¤’/𠆄1€Áà,@±^ˆ`wP€sýPÄ`0$Ž1 {`ªnðE“pã$2 9h0$ Æ0Œ `G¨ê6`M2sÀ`HŒ`0Øß_7Ëÿ¿`· p®ˆˆ/𠆄0€¡X#"€Z6ÉÌ À/ج€u¨Ò`0„cŠ;Æpl89`¶ †$À†â޹_lÒ˜ƒ€C` CqÇÎØ¦ª[}Ñ$ PÕ#Àb›dfÀ`HŒ`(îØm˜ýÿ_c· ÐLDÊû¢‰Á`ˆcŠ;&@ìØi@?1 ñc C±EDªUm’à×8‰ h¶ †“´ɈH=`4V€žU…Èz—Bóš€q ª[Dä; v”dq"Rh4>Fš`õ…ÿFÎ! †1€!TˆÈ@àI lä¯N.:!ÙAYds‚q ª»b(ÎÉ@s pæ§ "iÀi?É•šQòüÐUDú©ê·1kl0ŽÃ†P "U—’—Àš¼5‹È¾j°®/G»€ÍªºÓ>Å‘ù@Ÿ(ÿ~²ˆœõŽ9q’o”Œ³Ü6À"2TUŸ‹3ƒÁ€1 ! â:ö ¬¯ýD©‘ OøûÃ"²Žã‚ólò2ËÿEãÄ!ÐÊ. <+"UTõÊ0RcÂ@Ü™ü£‘É/_ NùÆ#]’©Ìñ_ñMÅ Æ0âDT5h Ź´… @…l)¨êæ óÉPøÞüIªVû€ .5ŠfÀZ­@P/"]û‘½À·üÚ8øVUí\劈Tã—ÓõÇNòu€ôà4‹™²X+æ ¦ÁÆ0„dtS8'"Ç¢"²‰_ ‚—Tõ+¿•;´ç—‰>•¼ôµÁC\˜-C ˆH&°ëd¡T¬X‘}ûöqäHR^ÿÎZªj^…‹H`je'J… 8pà‡Ž–ìyUý“_: ©„1 ""ç`\fìØ±\y啬[·ŽU«V‘ͪU«~–mÛ¶ù¤mÜ WÕ»ü.TD*bÝd¨áwÙNIOO§N:4iÒ„Æÿ,Mš4á”SN¡S§NÌœ93Z‹U5¬[HC¨1€!PDäf ê}êÔ©Sä¿ïرãWFAvv6k×®µûzô‹ ½ª~æg¡"ò:ðG?Ë,ŠJ•*ýj‚oܸ1 4 ++«ÈßÝ{ï½<òÈ#Ѳ>”WÕƒnël0¤:Æ0Šˆ¼ (êß«T©Â?þWÞGŽ!''ç8£àèÇ›g¬Zøu@PDº“ü(ë(Ô­[÷¸ þ¨T­jr¡p&L˜ÀUW]e—ì\U]WC1Ɔ@‘¯‰â‘¯[·nL™2ÅõrwíÚõ«UƒU«V±fÍôìcòªú7¯2?JÄÕî÷@5/ò?餓 ]²¯_¿>™™™®–µqãFN;í4»d·¨ê³®l0Ì-C`D¿4‹–¦uko¶w+V¬HÛ¶miÛöx—õùùù¬_¿¾ÐUƒ-[¶$ZìîD3p‚ªD®)ÆmdffR¯^½_-Ù7nܘʕ+»¨mtjÕªEµjÕìÚ¾ ` ƒ!FŒ`’s° Ií•PéééÔ¯_ŸúõëÓ­[·ãþmÏž=…B\½z5yyŽùÏñDé¢Ëjh—¨råÊ….Ùׯ_ŸŒŒp¼Z·nÍäÉ“£&ñKƒ!•Ç7Wl_Ü~Ñ(_¾<­[·þ•NôéÓ‡wß}7ÚÏ÷aÅ;ð‹Oë¢%˜¾øÂÏc ñã` ãI b CPDÝEÄéÒoà8XXP,[Å’eÀ1xšˆ„ÿÀˆÁ"Œ`ЍoôFQ¾|øƒÖíÚµ‹åË—Û% bù¬8;£%H!Ì6€ÁÆ0EÔ%[K¾¡à³Ï>£  À.Y ³¬Zn>çFK“,ÀÙgŸMzzº]²äè4CH0€ÁwDä4 êrm íÿ¾:¨3ü¶mÛøæ›oüÒ%nÊ”)C³fQF‚Y0b† H™€¾ ¿RU_\­…’,«úDrtƒ!$ $ˆHºˆœ""5E¤®ˆ4‘¦"r†ˆ´‘6"Ò\DJ­« D]ªÍÈÈଳÎòK—¸ÉÍÍeñâÅvÉ‚ž]—Q#&‹à`[¨²ˆD½Zš DÞçˆH+9KDN‘Æ"R_Dj‹H ©´ž†äǸi\ˆåÁ¬p&Pt`ô_È‘5À—ù øRU7z¥«DýR;ãŒ3(Y²¤_ºÄÍüùó9|ø°]²@gWU=,"ó‹‹Jã`#Äp0ÇcU\AD²€¦Xc¿Å1:ºÍ "?‹#²˜eÜ!bÁ>""'¿ú¿ëÒt qD®>&ïXÆÀB`*0WUmg'¿Á T$)´üÁ¯€µ P¤°aÃ6lØà$ìn 5 m/µÆú¤RLˆÈ)@¬gÑh$?¹ Ð5"¹"ò0 øXUmO§Š7f À"K÷ÿ~FàßòJ@`(0Ø."DdˆÔô ¼xiD½ß—BÀjUM8†° ¤„?€ÌÌLZ´ha—,47D$MDÚŠÈ?Dd1Öø¸8ƒÄ&ÿÂ(ô>6ˆÈ½"RÚå2 )„1<$²Ÿÿ*ÖRýïp¶Äïå€ß/Eä+yDD:ˆH+?)qðÈ‘#Ì›7Ï.YXfÕù@ÔÕ d0ÀÑ9€³E$°÷šˆœ,"‘1ÀÀ<à/X«^â£*5€‡5‘Û;”†â‡1<@D²DäAà[`áhç3€»YÀ"2RDºŠˆÛ_!vDÝK•*Åé§Ÿî—.q³téRöïßo—,³ªªÀ: X$)t ,Ö¾ºoˆHU¹IDf`Múc€?'û©GTÇúøZD:­Œ!\„abJ)D¤>ð9ðXKra¤V¬ø€­"òšˆt‹Jòš¨Ÿp-[¶$##üGSB¨(¢ê’ͶmÛüÒ%n®y¾ p¤¿xko?¬ïÔ¦À‡"òïŒ~CH kgMJDäj¬/­¨‡ÜBF%¬C‰S°ŒQ"r…Æ@äÅu7Y<:06GBò†…¨ «*sçFu 7nìÄE´'{HQ&ýdY^à.`ŽˆÔZCðÀ"wøGï`sÀ-äTÄ: 4k›`´ˆ\é¢ï3Ñ$Ãþ¿ÃÉ2ËÿÇ0Ðh ’á€Ã Q®u"©#"w$ñ¤_çËDä² 1Kø×ZCNäpÍ(¬=¿˜ÉÊÊ¢eË–œ{î¹´iÓ†SN9…ŒŒ 233ÉÌÌüù¿ÓÒÒX·n_}õÕϲzõj/ã¹WúE䀈L&SðlgûyŸ ÀÊ•+Ù¾}»]²0-ÿ£ª;Ed9ÖYBI¦s3gÎŒ–äL)¡ªãÉ_DšW¿ÎŽ'X©X±"Í›7çŒ3ÎàÌ3ÏäŒ3ΠR¥J>|˜#GŽpøðáã$;;› °`ÁÖ­‹k¡©"0IDz«ê$—«cHTÕHœ‚õ0ëËʱˆˆ^pÁúâ‹/êŽ;4^8 ‹-Ò‘#GêM7ݤuêÔ‰I8å ÖÙ@•ÛëÕhyW¬XQ ân¿xþùç´Ó‚>z¬ÏFÓ9==]÷îÝëmã¹Àøñã´­mÎVz=†233õ¢‹.Ò‡zH§L™¢6lH¨=¾üòK½óÎ;µZµjñŽç±´•‘Ô‘ÀHVÁÚO{#ÖשS']ºt©zÅÊ•+õñÇ׋/¾X333½6Ž`Ý*¸ ¨é Í¾Ž–ß%—\âY»¸Iß¾}íÚe ‚~z¬}ìžéôéÓ½m<ذaƒ“¾9XíÇïùÀp,ÏžŽ•êÕ«ëu×]§ãÆÓÝ»w{Ò.‡ÒgžyF«V­Ð-Z{IM \dàÞXYÆ uêÔ©ê'{öìÑ &èÀµF^Àà Pâ„ö* äGËãÞ{ïõµ}â¥fÍšvm1ICÐGOàT»çxÿý÷{ÚvnqÊ)§Ø=ƒQúëúWÇÚÒµŸïÙxHKKÓvíÚé?ÿùO]²d‰¯+[{öìÑûï¿_322bÑy/ÐðÄ63’Ú¸É(X>ü8\ýúõ ÅÒêüùóõÎ;ïÔÚµk{m (VšiÀXûÎì~3a„ ›È–œœ'uª!è§… °6šî:tð°õÜ£{÷îvÏ`%PËMîج>¹!ééézÑEé³Ï>«[¶l º‰tþüù±n .åÃÝHjKà $›•MNT™2etÔ¨QF,X C‡õëÜ€yvi6nÜt³Ø2zôh'um«!è«… –+Ú"u/Y²¤Zd,¿¶_ü±¦ÙÙÙúðÃk«V­<Áþãÿºº¶lݺÕI]þ®!è«Ñ+*]‘uèÖ­›wè"^¯X•-[V{÷î­o¿ý¶îÙ³'èê&LAA^sÍ5NëÿG A_5âñ» h’E°¥ÄDß}÷>õÔSÚ¾}{MKKsýe;mÚ´ «h‹Ãûçkúk4ÆF«C… 4?ÿÿÛ»ßØ¬ª;àß3kK«Ã>•-³üIh¢ÑaÜt`T6’Æ fLCÐ̹4BLf 3n Ù†÷ÂÉ3߸™‰d!5% m--« Gñ០Ô"ýÿ´¶¿½xÊÂcÛsò<ç<÷œï'¹¯ü™üîåöÞï=ç>÷Œî@æÉÊ•+ó~^ýõ²fÍyã7dhhÈ÷.æ]¿ÔÔÔØ‹”Hœ¯Ü x-ðÝ@R6­¦?š¥K—&âÂy¥Îœ9#Û¶m“ÚÚZ)--ÍË…·»»Û÷n=ýôÓ¦ýP!Ep¾ê6ëLÿ,ÜÌ“_|1/ç^UU•ÔÕÕÉ[o½%£££¾w«à>üðC)//·96¿"8_¹ðZà»$l–™þXJKKåäÉ“›¾¾>yóÍ7eݺu²`Á‚˾ø^wÝu²uëVß»aeáÂ…¦ýi‘"8_M€;Lÿ./½ôRÁŽc¾œ;wNV­ZuÙç\YY™,Y²D6oÞìü7úÅbÆ 6Çê8Šø…Vny¸øn ²¿Õþ±ÔÕÕ e¿Ò¶}ûvYµj•Ìš5K{ÌyäùôÓO}·l¥··W®ºê*ÓóÏRç«iCv°/tû²bÅŠ‚Ë|«¯¯—ùóçkÿmn»í6yæ™gd÷îÝ288è»eï.\¸ ©TÊ&üJŠàœåV kïŠ}°Üæ‰" ¿awm||\ÚÛÛeÓ¦M²dÉ)++²`ÁihhðÝÞeÙ½{·ÍÅr™Á9k³!»üó´û’”Ÿe^4<<,6løÿ9VUU%«W¯–;v$&dº¶qãF›sú€R)‚s–[þ7%Ù‹MA)¥¼ì2¶Ózê©§ðòË/»i*ÁÑÖÖ†{î¹¥¥¥¾Û¹,Ï?ÿ<^xá]‰˜%"=ŽZº"J©ßؤ«éììÄüùóu”étCCC¸õÖ[}·RôúûûQ]]îînSéZÙê¢'rë¾(rKa¸ù—••á¹çžsÔN²UTTà¾ûîKÜÍÞyçSÉ¿“róŸ`Ü!‹}.:sçÎåÍßÒµ×^‹gŸ}Ö¦ô×…î…ü`Ð{ØTðä“OböìÙ.z!O2™ Z[[Meo»è%Úý<ó´’èò¬]»7Þx£©lŽRê{.ú!·¦11üÿ]ÍŒ3øô¶¶6d2SY¢î–"2`¿®† |X¿~½Mé²B÷Bî1LïNd—OÖš5kPUUå¨òåí·­î“x·ÔöœN§qúôiW½'uuu¨¬¬4•=ä¢r‹`zÆÄûðÃÆ €Å“ð1ù¯‹^ò̘l8 ¾òòr<øàƒ¦²…J)í%Àô´`æÌ™¸ÿþûµB¾Œ¡¹¹ÙT–Ô»ä»Æt qX¶Ìø¼cœ¥äa˜‚Rê;´/½ÔÖÖâꫯvÔùÒÑÑÞÞ^SY"ï’"Òà ®Ærúƒ®¶¶%%%¦2N†`jƤûÐCü[ˆåp’ï’ÚÞ:„óçÏ»ê…<©¬¬Ä½÷Þk*û‘RªÂE?äÀÔ´w÷’’›93 €E8#"G]ôR Ú455¹ê…<²˜˜ì·Q( _¡”ºÀºšÅ‹#•J9êˆ|²‰þ¿D#²_1œßˆƒEø@P&»@™®€Ãÿq8räΞ=k*Kòð?D¤ÀGº¾‡y󿡦¦ÆTö½ “Í5X&eJ8Ë'ßµûÐÞÞŽÁÁAW½G×¶9.ú 7&Óžà˜7ož«^È#‹pÀZ)4íŽŽŽŽbÿ~íG)wÝu—©ä¥Ô·\ôB…Ç0™v ººÚUä™ÅÐw³ˆŒ»è¥ÀŒI‡Óq°¼¾GI)&ӎ̙ðtuuáĉ¦² îŠ"r ÀI] _ŒƒåõÁ@0L¦M· qˆhþÿ"í¾´´´àË/¿tÕ y’J¥lÖà@ .1ñ‘‹›t5 q°ÃÈ.© í à½÷ÞsÕ ydqãE0 ¹Œ` q°˜óÞ?±¤n(Œ;Ì÷âÀ€\Æ¡-€ðõôôàðáæ²†ÿ!"ÿpNWÃ÷â`qã@ riG”Rü@!¢ý8X˜Ð¨ývÇ…Î"ܤ”šá¢*,€\3uÿ1•J¡¼¼ÜU/ä‰Å“îãÁ ¤ã·¡„»ùæ›M% À7´BÆKû¹³‘‘¦|i:sÝ'–Ò ¿@¶)ã§!ÀK{QççPÃgù¶{ˆÃÿð>€>]ß__Ÿö²‹Gñb€\Ú0>>Ž¡¡!W½–¿wò1XDŒS á³—A‚ÀË8¬ÛßâÈ/]d9Ä­}Y.á´wø®®.?~ÜU/äEàE0 ¹Œ'öÀÀ€‹>È‹'Ü&–Ð •ñp l ñ`ÈÅ1ËUï‚þ¿D+€Œ®€ l ñ`¯SIDATÈÅ1Ëuû‰ˆñÇ acˆ@.ã‰ÝÝòèoÜ,çÿc¸ûi÷ñÈ‘#8{ö¬«^ȱžžS @ rCö'.ÓjmmuÔ ¹fñd{jbéÜÐñ=€ˆ8pÀTò¹‹>¨ð.!"ƒ>ÒÕ47‡ø8455™ÊBŸÿ¿¨ À¸®€ LétÚft§ÃE/Tx “iïð---ü"`€:„óçϛʢ¸ë‰H/ y€056Zý•OA`˜LûØ×ׇ×_ÝU/äçÿ'ÑîkGGz{{]õBŽìرÃT2À8G@ÉÀ0™qxÛ¶m.ú ‡,žhωˆvz(0ÚD466Æé°À=z{öì1•íÏD)9¾BDŽèÔÕìÝ»—¿ÀX€¿þ7ãþr ,[¶l±Yîù.z!7¦¦}Ä<þøã\ ét§OŸ6•Eu·‘30a® ކ†lß¾ÝT6àoÚ!G¦ö _CëììÄO À¸>,g€‹È¾¡Âa°$"í~ÀúµYJ¼Øâ» Ÿ$û–ð d—ʦð#{Î/~é,p —ADÒøB&þ`Ÿ€ÙàNm¾{¡‚Föwþ5"²^Dø…³ðg€W@)µÀÏ|À\)¿QôX-";}7Rl”Reþ à—¾{¡+6à¨ðŠˆpŠ32 y¤”ªð]å¾{¡¯í”ˆˆ™Rê3|÷A_‹øÀIõÝ ùÅ@DD!¾@DD!""¢1Eˆ€ˆˆ(B DDDb ""ŠQ„ˆˆˆ"Ä@DD!""¢1Eˆ€ˆˆ(B DDDb ""ŠQ„ˆˆˆ"Ä@DD!""¢1Eˆ€ˆˆ(B DDDb ""ŠÐÿÒn°‰‘.U1IEND®B`‚angband-v3.3.2/lib/xtra/icon/att-128.png0000644000175000017500000002004111651552410017066 0ustar chriscchrisc‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<žIDATxœíyxUåñÇ?/!„@Á„P‘}Q bUdÇ¢V,?-‚(R±¸TQ+m…V”½`©–VDÙT@AVÙ„P b€$,’Iîüþxω'7÷ž{î’{ƒò}žyÉ9óÎÌ;çœw™™W‰ðËE•H p‘Åø…ã‚üÂPJÅ)¥šF¢í (‹H½¦{•RS”R1’ሜœ4þ}X£”j!9"¥T¢Rê^¥Tl$刔üÓòsG`‹Rê†Év(¥º[ƒ")KD@D¶_[~UøD)õT$ä '”R#À¥Æ¯vFPœˆÎf¤¤¤0pà@€(`¼Rj¾R*>‚rU”RñJ©ÿ¯U_#""(ˆHD¨ ²~ýzùÇ?þ!ÑÑѰ h)Ù*@×4à@bbb¤J•*¦ž##.[„ 3!C†ˆˆÈÚµk¥~ýú¦qNC¨H)Ho3t‘† ʤI“LýÎu#._„ÓÅ|*öîÝ+""GŽ‘nݺ™F`Ð-Ò† @·(`¼©Ç¯ýkÉÎΖ¡C‡šzÍ´Œ†œ$FX€e€Üzë­b¢¤¤D¦L™"_|±Õ)‘6˜C:MÙG-ÅÅÅ’——' ¦>="-§éÀeà* U«V‰Ç—aÆITT”i´B`P'Ò†ó¢K}ôÔÎH­ZµdÁ‚¥ú<óÌ3¦û€*‘–×t€àûHºÐ+ƒÒ¦M)))wlß¾Ýý³Pl6^±©Ûˆm›€Àe@lä¯<䢔’ûî»O²²²Ju8pà€T¯^Ý”ÿŽHw¼ÕBem#$D¢i¼™3g–sóæÍ“«¯¾Úêæ`êU †…_££G ÝÜï³ÒIààYàz ºC¹ëƒïL^;v” 6”“ý®»î2Ûú"Òîî-†øè!AþHRR’äååyu‘£GÊܹså–[n±vâàWÀT£CËutTT”$%%ÉUW]% 4°N;Ýé ðШê&g¬!ë׿«K/½TfÏž-.—«œ¼ëÖ­3ùº€Ž‘îtwøøøxSÈ W‰26l˜­X±`ÁëÀª”¤wïÞò—¿üE6nÜ(ÙÙÙå>/.—KŽ;&[·n•7ß|Sî¼óN¹ôÒKÝy1>5 ‡8`ýû•W^)Ï=÷œœ:uÊ£|.—K:uêd^ÿN$;Û‹Ý™ ÈØ±c¥ÿþÖ'àšÓÏ|ª¦Nê³ó?øàIMM-팘˜8p ¬ZµJŠ‹‹}Þï ;vìQ£FÉ%—\bu„"óç† ÊŒ3äðáÃ>y½óÎ;Öl#ìxÑ|ꊋ‹å¶Ûn3>Jfæ§ jÕªòé§Ÿz4êÎ;妛n*íœK.¹DÆ/999>;Äœ;wNþ÷¿ÿ•€V¯^]þö·¿9r°ƒJbb¢yïËf[:!Ð[²Ò§O)((öíÛ[¿«5# Ô¿¹è¢‹$==½ŒQß~ûm©V­šR­Z5ùÃþàõõJ,Z´Hš7o^êݺu“£Gz½>//Ï:`ýˆ“JÐáîp- ÉÉÉ¥ÂgeeIrr²)üG„yΊžV­¤iÓ¦rìØ1)..–‘#G–v@¯^½dÿþýº.t(**’I“&•Ž—’““eýúõå®+))‘>}ú˜²zÒ³2@Áô@0Ëœ¢VfäååIëÖ­Mm•JбNÉ4v Ï?ÿÜ£’}ûö-]ËǬxÔiŸ9sÆîˆ ÒÓÓÍ]KW$ÆK’ÕàÿÂØ»ö„C‡I­ZµL'x¬B…‚hsðÆoøÓÅ AƒJ§ÎR :× Y~ W]u•W§Nj*˜OgwžOO¿ Ë[@€R :ØY~F`ÆÁƒ=*èr¹ä†n0ü¸Â„‚¿òøãûו]»v5ís¯T‚öE¥aá"rX°dÉ.`°hƒï®çéÂÚµkÓ¬Y3êÖ­KÍš5Ë‘Ëå"//¯=z”ŒŒ NŸ>íM†Là4Æ@Õ. ¿ˆ|äAßàOÀï1E£££¹ñÆéׯ©©©4l؆ Gqq1YYY|ÿý÷dff²bÅ .\ȱcǬl?C/Ðù—mìå•ô~víÚe]õ;¬íùßbóÚ7(hïáÕÙÚ0ä?€åèWd‰~¾¨½Mþ!z]âÿ€f–¶ïDGQÛñ8…e,`Èû;t¸Ò¾}{™5k–?~ÜÙwÈ@QQ‘,_¾\ $J)³½bàï@mÇö÷Ò)7R§NGߨûï¿ß`©Ÿ_Øë 3>ñK)¨ŽžÑ 0:n$:æ<ð:)õmôVóŸÑqˆ#ŒÎé‡ÎævÐNSt¡;Ù¿.6dZhþ>11QfΜ’À–M›6IçέmÄa¢Ý ä sçÎõ)Àþýû­ûàŽò £¤;èüÉD Á)uÑ©^v:| ¬ÆÄ>ñÄòã?:ë]‡p¹\òöÛo[·îspd§Øó€Ü|óÍŽxôÑG͆WûjÔà?LJъáNxEšŒ7Æq_Î-ï¼óŽ#{ŠŒŒ III1ÛÌn±•ÝF©F@‰RJ8à³á¬¬,‰5¶Í|ºû0Ö)_<*¡SÊÎzÓ)>>^–/_FVV–´jÕÊlû6‰>¾”úçŸÞQÃO=õ”Ùèf¼,ZqXré¼ÐÝvrùCè•[OÉÇèÑòZ`:¯ïR/÷ÝlüÝn·iëOú\|ñÅòå—_úÙÁáäɓҥKS†\ ¾G™½)c(t' 5ò˜µëŽÜÜ\kÌ€GCa)šà…þk'“SB”~€%£Ç  “K,÷Æ'¼\ÿ¾M›Õ1âLRJÉ’%KîÈ`››k­¸²<¾ŒX ½&àøõõÜsÏ™ ~í_k’\l'“/šÿÅm)ÙíÄ(–a¼1¼]÷öï¶^é-í•+WZk=]N^÷_”»@ϯ巿ý­£sss­ùe À&TR*z=àœŸïîÕ òvm’za§Ö­[ËÙ³gï½a̘1Öñ@KñÓZN€ÈÍÍuÔàˆ#Ì?³ð¹Î‡ñ§ù’ÅFÆXŒ¶ÐëÕË<9ˆY‚wOk‹ŠŠŠ¤C‡?±N ¼‰':j033Óº.ÐÙàñO£Ÿ!ÀZEÀåø^Œt‘ˆéè —÷°±ÛÐx²(ŒÍ¬¡C‡×k!ƲeËLJ°®hŠ3#? öñ‚î°¬.j¢ç¤!}ú:ØÏ(ÎoÝp+7$ïûé7ø§/èBûöí ¸³* –Ðõ™â§ÔAo€xMÙvÇ®]»Ì5jðœQ]PŸ]†íc¾Ç®>xD£“_tþ)|,£CêäÎ;ï ¼—*ÿùÏL]Î Ä©ˆVn2 ½{÷vÜà­·Þj6˜ccØENep“Çn:y‡Q¹èíg'Ÿ¯Ó?ƒOóÚÍ›7Ð=ââbiܸ±©Ï“⧤.¥”ãÁ͆ œèƒÇC ÓÙ+3Feê³DüqÑJ.ä‘GqÜ [y7w:„.iþÿïC†«1>G¨Ðé“ïÆóàkú7B;ø;|ø°Lž<Ùc ‚@a æÑþêFÐÁšÇŽsÔàòåËíŒzô&‰¥*è6í×Ä>v`”?úXøvñÑù;|ܯÐË­e CƒÂÂÂÒâRñññ²}ûöð=}ú´ÄÄÄüôöÿµ W^yÅq£mÚ´ñjÜvíÚɶmÛdòäÉæï¾ÇË` ½§ï×:ÌYDŒ´s_Ó¿Ö€T©RÅñƒá ÷Üs€.›HJJŠdgg‡„÷õ×_oêõB Æzúõë˹sç58cÆŒrF­^½ºüùÏ.-¶TXXh­ÊuŸ‡vð¾>/±Šˆ^½³[:îæãþÛiÒ¤I€]R¯¾új™N7s»té’•Å'Ÿ|ÒÔë@ŒU ];OæÌ™ã³±ììl¹ì²ËÊô†nð87n\é+·ÝD¼ì´ñÓX"à²òè´8o¼Lÿ]Ê&X|ðÁR¥J•2¯}ëçÀ,­ Æoêöq {¶mÛzmäøñã2f̘Ҋ^€\wÝu²bÅ Û{jÔ¨áñ‰6?=^h\ zXxw²áý?÷¿e+ž‚íÛ·K||¼(¥dáÂ…eþf-Ü5a„ Ú™={¶©ÛÖ@ VcÃýžÀwß}'£G¶n K§N|&š˜xüñÇÍû>³´çëÝ)=,üíf¶Ó?ãþ·y衇üë ²³³K#y¼¯6oÞ,±±±%K—. ¸­%K–˜ºec´é€ôèÑC>,K—.•Þ½{[·¥]»vòÑGù%ÜÁƒ­éU¶ôá—ª‡ÁÿeÞ Ü??þñ~w†‰_|QéׯŸíu3gÎ_o__øòË/MÝŠÌËÁDàÿ–-[FRRRé/•RÜtÓM >œ¾}û:fVRRÂW_}ÅîÝ»IIIaß¾}£Ñ,»SF D$;0@)¥Ð Kž°CD9`SPPP¨¤¥¥°víZöïßOãÆË]SRRÂܹsË\,rò´Ä¡7=þ‰%¸#!!AFŒá×hAAÌž=[  µk×ö8¸3Úœëáo&íñW7}n²áýšCdРA<¥>|¸€ÞtóTýÔÜf÷öw§˜?¾©ß^§Fj GïrÆj¤V­ZÉ´iÓ$??ß±»ví’áÇ{êôcèê9èdŒköí6}²è`£Û|ÞÝò H÷îÝî½Vß½{÷ÒO5gÀœJ×­[W¾ûî» Úyë­·LýÖùRìzŒ"’VJII‘ßÿþ÷²víZ¿v¹\r÷Ýw»y/zŠ×/ 9èý{»1@ O÷ù"t¿·¢qbð :(Xœ8q¢4ñt̘1"¢3±cbb$::Úk/ð /˜:.ô¥Ø,ÐûÛ]»v•×^{MvîÜpÃEEEÖcS [pòlÊaCWùâág4ºˆ³7žŽw) ‹[‡"ÓgÏž=rÑE èâæÙ´iÓ‚æ-"2xð`SÇ)¾ëºDk¨–8~øa³q—Ó'×|ÅÚÐ#Nø¸ñ´ù ~ì+ ƒK­[·†ÄNŸ|ò‰µà”Œ1"$|EÄš8ò€å¾dܸqŽ˜çææÚ÷îÝk*:*¤d|ì:ë8~„”¡ãöŠ}ðüC^U™æ}ýë_ÙÉ Þxã IHH>}úu†ûöí³êØÈ‰‚w>”¡°°Ð+ããÇË3Ï<#5jÔèèhY·n×ko¿ývS€-¾Ú7d¨‚±ÛfCsð©¼éƒIwÀ/ Ö^z_=è–ðaÊ”)¦¬"‚ãGaÄÝyª×›——'ãÆ+7¢·‹Ú´i“õÚË}É`Èñ‚ƒNóz:xt³ÃÎôlÇcº;: yÆžˆ•âââl”HcÀ€¦¬“ʼnˆVøQ@RSSËd}òÉ'Ò°aC«¾FŸ÷[¢”²0ZE¥”£7l¼•N±Ž+Þ@§†G¡Gù¿CŸKèñ$1Th¼1nCψîC§”ÛC÷Ö[o…¼ãB·UÖ~â‡ÄšJ¿÷Þ{RTT$Æ ³&؇®YcVyûï¿ß«0K—.5ï-.r(Çüè<_)a&ÙE+D—_~yȾ١„%_#cÊíÈDÿYÐÕº,Áž.㉈s»¶èHŸC‡yÈr¦ÎLoíºñ­‚®ÀªÎZ‡.Ra[˜ÊOr³º áDnn®u§µt€ëÔq{ZN=m®ÿ'Ÿ|Ò«PsæÌ1yãp®#ôC:j!Ʊ±è8Ã@EÜi%FL›6m"z¬;žþySÆL, \Ž@´¡&ðÓkóz×ö¤fÍšròäIBI£FLÁ¶á°zô½!ÀNÊG—„qOŒÛ2·t¸ØãóÊ)a0رc‡u®L¥w }Î`;×*t²¥¼úê«^…›8q¢Õ/ø!K5à%Tæà§Wó,¼äÉ<[{üèøC† n|^Oé*§………rå•WZ²jed‡„Œ§B’’’¼›ÊÏÏ—:uêX;©ŸmÔC—³ææ»Ð1„¢g&ŽŽnCïvÞ…ÎÎsëð3è<ÄYèå_ahèeæM gN¾ÎB®H<òÈ#ÖOv¹ùŠv€ht”o¹£Õ¬;v¬ÕÈç€ÁA´YÓxS]VÕx‹Å£Šñ£X:Sè ÷Þ{¯Óþ ),X`µ«ÇȦ uцx´´4¯ƒ¢üü|ë‘4&MÇá1î••€A¦>ƒöxSEáÝwßµfhÏó*c(öØ€~"OòþûïÛ ýòË/»;Á qEËXÁú?oêÓ»wo9}ú´­ B &X×h>ÇæøßpáU@~õ«_Ù ^RRb-d`Ò t=ÝjžxŸ„^I-äšk®±=s8ËèÑ£­¶{ß×[4\èºò¨/¼òÊ+ÞFÜYÀSvÞ\ò]¨½RzÚµkËĉCúIX¹r¥´lÙÒýê3W"\ì Î"YÝŽ^õD'Щê7ã0b'yë¿f N^ ß°ÌT®¸â ÇáòÞðí·ßZwW½áø€Ïp9Àu ãÙ|­Ž™9qé:~p(:x%ˆ @¾ªèÑ—ÐÓ7÷bÓ¹«†!°E,ºRx¡É?%%EF%6lpÔé™™™òúë¯Ë5×\cýÖ zuÓÑîªIåÊÅW”RUÑ 65/^L¯^½<^7uêT†ls.ôRñwíGWçN@×õ½Ø º–ë wíðˆˆL V8J©àoè’t¥g7%''Ó¼ys’““INN&11‘ü‘~ø¬¬,<ÈÎ;që·oЖû-HE=õ< 4ŒŒŒ2½sçNéÕ«—?O~$hqd‹^cx ]LÚŸ2÷ûЕÎý.Ñö7€Rª:^ 566–îÝ»S»vm6nÜHzzºyÙYôS<‚.óZ™ÐO<™Ã ”RõÑㄆhǨ>+èú­–eÐW"²%$†ë `8ÚeèZ½îÞ|]Ö5ÍrmúTórQ7¤ùá´W8(loF*V/ôÒj-ô7z‰ˆüèåúê訞ÇÐe`Ãt€ËÑ¥ð]¡ÂvJ©4ô‰}ѧlù¸Š ô Ú|`¥èC±~–8¯À ¥T] 'Ð]#8ýšV~²:†›\‡ž¢ýZDV…PÔJóÖL(¥’Ñûò%è)Ýe訡XtÌ€• ÃeGDä¬Áç#tËc"2)¼ZDÁ¤‡W˜‡4ï‘“è§mðÙ€v€Îè)ë/î‡GŸ0À¿óòÊc½ñï5Aò9¯ðsr€o‚ä³ ½Šx¹Rê’ y7ø98€yL{PoÉã''ê”DçÎk0Ö®0þì'~ú üb Ò•RW ²­^7)=ª¯^IÜ‚æ6 ‹>ߢ”Ú.ÝÌø·!𼈼‚v* *ý4P)5âã²3èè_«ƒl±[À1¬¾ݹ&]‰Þ!ô†bt@ÊÇ Trœ° ¸úå—_&11‘ŒŒŒRÚ·oçÎóvë3"òªž”R߈H¼§¿×¯_ŸfÍš‘––F³fÍhÖ¬C† !;;tÝ¢õžî;Q©@)‹ŽÍ:tèÉÉÉeþîr¹8pà@§X½z5;vìØ&"­½ð Lާÿþ¥œ––Fjj*ññåý¢OŸ>,^¼ôq¶?ŸÏ@¤w£|ì^ º0µSŒ9Òܹ{Ó†oKÐikN³x-…•þi»„’*û, @ÇŽß°fÍšÒm.Û œÈËËcëÖ­ÎéСŒL?TØ,À˜¢µÆÞD×ÈF‡gí‘ÓØøåùùù|ýõ׿½:€ˆˆRê  ïêÕ«i×®oA~r€4¥T-9åë¥T ôìáƒй+D$ßg£á@E¼VÐ;k»ñXQ,AGýx­Å‹‘¨éô¤2Ëé$ß:ñ)@~ó›ß8â-"Ö²÷CŸ:Ú]<ú{ý еƒ7–BþPJ½€.&Q%&&†®]»’””Dnn.999üðÃ>|Ø4TOà-¥ÔVô4îCt¸“(¥€T¥íÛ·wÔöêÕ«Íí^ÿe®±|2|¢C‡3 ¦÷Ö€žMäääP³fÍ`År„ŒŒ ž~úi3¬m·ˆìKÃV„b5 wWæè”ÐÍAêðme/®9oWE'XöGŸ®q <ýÄr‚{€.‚îQìit\Ä-¡@Ó UJÕ"¼I'§˜ÿ—ƒQÆ&të¼¾‘/"Åal¯*uTðT<*{PèT0.8À/àŽ ð Çÿ·ÈB’²¬tIEND®B`‚angband-v3.3.2/lib/xtra/font/0000755000175000017500000000000011651552410015301 5ustar chriscchriscangband-v3.3.2/lib/xtra/font/9x15xb.fon0000644000175000017500000002206011651552410017045 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ!@@t~~ÿ€P ,€)0€FONTDIR9X15XBFONTRES 100,100,100:9X15XB 11"Public domain font. Share and enjoy. dd ’ 0 ÿ ‰"9X15XB"Public domain font. Share and enjoy. dd ’ 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€<<>>>???????8lVëÕªÿ€€€>ªÕj4€>UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6<( <(>6kw*TPEIwºW|€"A€€A"€€  €€ üü ÿÿ€€ÿÿ €€ 8`8€€€€pp€€€ss€€ 0`€€€€€?|_p€€ 66666654<5€€€€1{{6 77c€€€w>k  €0€   00`€3aaaaaa3€€€€€€ < ??aa0`€€€€a?€€€€€€3c€``qa?€€€€€€0``qaaa?€€€€ 00€€€?aaa?aaaa?€€€€€€€?aaac?>€€€€€€€    0 00 €€0  0?aa €€€?aaoy{o``?€€€€€€ 3aaaaaa€€€€€€€111?1111€€€€€€€?a``````a?€€11111111€€€€€€€€000>0000€€000>00000€?a```gaaa?€€€€€aaaaaaaaa€€€€€€€€€€? ?c>€acflxxlfca€€`````````€aasmmaaa€€€€€€€€€€aaqymgcaaa€€€€€€€€€€?aaaaaaaa?€€€€€€€€aaa`````€€€?aaaaaamg?€€€€€€€€€aaalfcaa€€€€€?a``?a?€€€€€ €aaaaaaaaa?€€€€€€€€€aaa333 €€€aaaammmm3€€€€€€€€€aa3 3aa€€€€aa3 €€ 0``€€€`00 €>> 3a€ÿ€<??ac?€€€€€€```qaaaq€€€€€?a```a?€€?caaac?€€€€€€€€€€?aa``?€€€~€€?ccc>`?aa?€€€```qaaaaa€€€€€€  ?ccc>```ag|p|ga€€ ?mmmmma€€€€€€qaaaaa€€€€€€?aaaaa?€€€€€qaaaq```€€€€€?caaac?€€€€€€€€€€o910000€€?a`?a?€€€€cccccc?€aa33 €€aammm3€€€€€€a3 3a€€cccccg?c> 0€€  €€ x  x9mg€€UªUªUªUªUªUªUªU€€€€€€€ 31x00x13 |   .6<( <(>6kw*TPEIwºW|€"A€€A"€€>> 88pðððx<<>><8ppp00/߀€€€€€€€€€Ààñûߎ€`pxldlxp```pxlfrxlfb`8X˜˜#w] #w] €€€€€€€€€€€0000€€ 00>0000€€ 00>0000€€6600>0000€€ ? ? ? ? ? ?? ?111}1111€€€€€€€€ aqymgcaaa€€€€€€€€€ ?aaaaaaa?€€€€€€€ ?aaaaaaa?€€€€€€€ ?aaaaaaa?€€€€€€€ ?aaaaaaa?€€€€€€€?aaaaaaa?€€€€€€€?ceeeiiiq?@€€€€€€€€€ aaaaaaaa?€€€€€€€€ aaaaaaaa?€€€€€€€€ aaaaaaaa?€€€€€€€€aaaaaaaa?€€€€€€€€ aa? €€``|~cccc~|``>ccflhlfa/.0 ??ac?€€€€€€ ??ac?€€€€€€ ??ac?€€€€€€ ??ac?€€€€€€66??ac?€€€€€€??ac?€€€€€€??ff?€€€€?a```a?€€0 ?aa``?€€€ ?aa``?€€€ ?aa``?€€€?aa``?€€€0  ?  ? ?66 ?  ?aaaaa?€€€€€€ qaaaaa€€€€€€0 ?aaaaa?€€€€€ ?aaaaa?€€€€€ ?aaaaa?€€€€€ ?qaaaa?€€€€€66?aaaaa?€€€€€?aceiq?@€€€€€€0 cccccc?€ cccccc?€cccccc?€66cccccc?€ cccccg?c>``x|fff|x``66cccccg?c>9X15XBangband-v3.3.2/lib/xtra/font/16x16x.fon0000644000175000017500000002306011651552410016763 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€I0€FONTDIR16X16XFONTRES 100,96,96:16x16x 12$Leon Marrick, 2005. Freeware. Share and enjoy! ``X0ÿ Š$16x16x$Leon Marrick, 2005. Freeware. Share and enjoy! ``X0ÿ Š$zzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú : Z z š º Ú ú  : Z z š º Ú ú  : Z z š º Ú ú  : Z z š º Ú ú  : Z z š º Ú ú :ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú:ZzšºÚú : Z z š º Ú ú !:!Z!z!š!º!Ú!ú!":"Z"z"š"º"Ú"ú"#:#Z#z#š#º#Ú#ú#$:$Z$z$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê÷ÿÝÿkÿÚÿÝÿ·þ»ÿý·ÿzß{ßÿîûî¿þ×ýo–ýU¯U»Uë–ýU¯U»Uë–ýU¯U»Uë–ýU¯U»Uë€"”%"HDH…  @(€ H@A@ˆ ˆ @@@@€€€ÀààààÀÀððøøøøððÀ5jUœþV«Uÿ?UÿU* üVÿV¬X°`À€ujÕªÕªÿÿªÕªÕªÕÿøVªU«U«ÿÿ«U«U«Uÿ`@€€€€€€€€€€€€ÿøÿ@€€€€€€Õ¨«z   .øðàpðàpðàpØxà&2L À:UjUjU.à¸T¬T¬Tè°€€€€€F]:o@@@(¨¤d¸T¬T %@ ` @% H H €ÀÀÀÀ€€€€À€```` ?? ?? 00üü000üü00€ð˜€€€ðø˜˜¸ð€6"6 0`À€8lDl8800=€€€ŒÜøpøÜŒ€ÀÀ€`€€`€ÀÀ`````ÀÀ€  `àÀððÀà`€€€€øø€€€€€ÀÀ€??üü€ÀÀ€ 00`ÀÀ€80000008àp88pà €€€€€€€€€€ðð? 80??àðp00pà€øø?  ?àð88ðð88ðà??ààà```øø````??00?? ?øøðø88øð807?8008ðøàð88ðà?? øø8pàÀÀ€8008àð00àð88ðà8008 ?àð88øØ8ðà€ÀÀ€€ÀÀ€€ÀÀ€€ÀÀ€0à€€à0????üüüü€à00à€àð00pàÀ€€ÀÀ€'.,,,,' à¨äddddèpð 00€€À``00øø ??000??000??Ààp0pàð88ðà800008àððà??00000000??Ààp88pàÀ??000??000??øøààøø??000??00000øøàà800008àðxøð00000??00000øøàà€€€€€€€€àà8ðà0`À€€Ààp8øø0088<<663311 <KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzþþþþþþþþþþþþþî¾ö|îºþÞö|ÞúúTú¤~êTîTú¤~ÔT@‚D ‚  € ˆ @008|||8xüüüüx6zÖª~xüªT(8|ÖªÖªÖþªÖªÖª8D‚‚‚‚‚‚‚‚‚‚þ(D‚‚‚‚‚‚ÖÆ|((\l8 (P8TlT8DT8TüºD‚‚Dðþþ`€`ü€``€üüHHHˆü ü@€8D@à@@D¸(((((|(|((JVbnz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú   * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ   " . : F R ^ j v ‚ Ž š ¦ ² ¾ Ê Ö â î ú    * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ  ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnzÿÿÿÿÿÿÿÿÿÿÿÿî¿÷}ï»þß÷}ßûUú¥ëUîUú¥U@‚D ‚  € € @8|||8<~~~~<6{Õ«~«V,<~Õ«Õ«Õÿ«Õ«Õf<0000 0`0 ~~0  0ff>```lvbbvlF<þ 0`þ 0 0 02LUªUªUªUªUªUª2x00x220ü0x¶`$Z<xØØþØØØÞff><>ff><>ff>(<>ff>$<>ff>(<>ff>þØØîF<``xddx``$ffff>F<8x12xbangband-v3.3.2/lib/xtra/font/10x14xb.fon0000644000175000017500000002106011651552410017113 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<ƒ @@t€P ,€ 0€FONTDIR10X14XBFONTRES 100,96,96:10X14XB 11 Leon Marrick, 2005. Freeware. Share and enjoy! `` ¼ 0 ÿ ˆ 10X14XB Leon Marrick, 2005. Freeware. Share and enjoy! `` ¼ 0 ÿ ˆ z z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÝ÷ö¿íÿ{ßþwßýïÀ@ÀÀ€ÀÀ@ÀÀÀ@À€UºmßUúU»U¾ißUú@€@À@€@€@€@À@À"€ @„ ˆ €@€€@€@ ˆ@€ @€@ >>>>>zÕª€À@ÀÀ?UÿU+ €À€kUªÕªÕÿªÕªÕªÿ€€À@À@ÀÀ@À@ÀÀa@€€€€€€€€€€ÿ€€@@@@@@@@@@À !@€€€€€Þ€@@@@@ÀR?  -?€ (P5+5+ DI*2]jÕú€€€"€AÀA€"€€€  3333333333€€€€>khx> k>1k[6 65c€€€€€€€€€€  00 0  0?aa €€€aZ¶¶¶·^a€€€€€ 3aaaaaa€€€€€€€aaaaaaa€€€€€€€1``````1€€~caaaaaac~€€€€€€```~````€€```~`````€1```gaa3€€€€aaaaaaaaa€€€€€€€€€€ c>€acflxxlfca€€`````````€aasmmaaaa€€€€€€€€€€aaqymgcaaa€€€€€€€€€€3aaaaaa3€€€€€€aaa`````€€€3aaaaam7€€€€€€€aaalfcaa€€€€€?a``?a?€€€€€ €aaaaaaaaa?€€€€€€€€€aaa333 €€€aaaammsaa€€€€€€€€€€aa3 3aa€€€€aa3 €€ 0``€€€`00 €>> 3a€ÿÀ ??ac=€€€€€€```oqaaaqo€€€€€?a```a?€€=caaac=€€€€€€€€€€?aa``?€€€~=ccc>`?a?€€```oqaaaaa€€€€€€  ?#```ag|p|ga€€ ?smaaa€€€€€€oqaaaaa€€€€€€?aaaaa?€€€€€oqaaaqo``€€€€€=caaac=€€€€€€€€€o910000€€?a`?a?€€€~cccccc=€aa33 €€aaam3€€€€€€a3 3a€€aaaaac=?€€€€€€€€ 0€€0 8  88L€UªUªUªUªUªUªUª@€@€@€@€@€@€@€ 0|00|0~<[0kk@a3 ? ? €€ 00~Gp>A>€€€€€ ,€  0 @@ 0  A*kœ>œk*A€€ J$TÌ<d*I€€"”U*Ý>Ý*U”"€€€€ 0`cc> 3aaaaa€€€€€€ 3aaaaa€€€€€€  3aaaaa€€€€€€  3aaaaa€€€€€€ 3aaaaa€€€€€€ 3aaaaa€€€€€€6ffffffg€€€1`````` €€```~```€€```~```€€ ```~```€€```~```€€     ~caaaýaac~€€€€€€ aaqymgcaa€€€€€€€€€3aaaaa3€€€€€3aaaaa3€€€€€ 3aaaaa3€€€€€ 3aaaaa3€€€€€3aaaaa3€€€€€3ceeiiq3^€€€€€€€aaaaaaaa?€€€€€€€€aaaaaaaa?€€€€€€€€ aaaaaaaa?€€€€€€€€aaaaaaaa?€€€€€€€€aa3 €€```~cccc~```>ccflfcccn??ac=€€€€€€??ac=€€€€€€ ??ac=€€€€€€ ??ac=€€€€€€??ac=€€€€€€  ??ac=€€€€€€ =oll7€€€?a```a? €€?aa``?€€€?aa``?€€€?aa``?€€€?aa``?€€€ ? ? ? ?  ?aaaaa?€€€€€ oqaaaaa€€€€€€?aaaaa?€€€€€?aaaaa?€€€€€ ?aaaaa?€€€€€ ?aaaaa?€€€€€?aaaaa?€€€€€?cemiq?@€€€€€€cccccc=€cccccc=€cccccc=€"cccccc=€aaaaac=?€€€€€€€€```|bbb|``!aaaaac=?€€€€€€€€10X14XBangband-v3.3.2/lib/xtra/font/12x24x.fon0000644000175000017500000003310011651552410016752 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ!@@t~~ÿ€P ,€J0€FONTDIR12X24XFONTRES 100,100,100:12X24X 17˜4Copyright (c) 1987, 1988 Sony Corp. dd” 0 ÿ ’412X24X˜4Copyright (c) 1987, 1988 Sony Corp. dd” 0 ÿ ’4z z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú : j š Ê ú *! Z! Š! º! ê! " J" z" ª" Ú" # :# j# š# Ê# ú# *$ Z$ Š$ º$ ê$ % J% z% ª% Ú% & :& j& š& Ê& ú& *' Z' Š' º' ê' ( J( z( ª( Ú( ) :) j) š) Ê) ú) ** Z* Š* º* ê* + J+ z+ ª+ Ú+ , :, j, š, Ê, ú, *- Z- Š- º- ê- . J. z. ª. Ú. / :/ j/ š/ Ê/ ú/ *0 Z0 Š0 º0 ê0 1 J1 z1 ª1 Ú1 2 :2 j2 š2 Ê2 ú2 *3 Z3 Š3 º3 ê3 4 J4z4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿððððððððððððððððððððððððÝÿÿ}ïÿþß÷¿ÿýïÿÿwÿÿ»ÿïþð°ððÐððàpðð°ððpðàðpððàðð•*T™v«Mö)öÕi¾%‘jI²ÔkµM©þ`À°pÀ @°`€`pP @ Ð```"„@ €ˆD€@ €@€€€@ €@ €@€€@€@ €@@??????€ÀÀÀÀÀÀ€??€ÀàààÀ€zuêÕÿ`ð°P°P°Pð?Uêÿj5 àP ð°pàÀ€ujÕªÕªÕªÕªÿÿªÕªÕªÕªÕÿÀàP°P°P°P°P°ðð°P°P°P°Pð @€€€€€€€€€€€€€€€€€€ÿ€@@ ð@€€€€€€€€€€é€ ptt y~??°°ðàÀ€€€€€€€€€€€€€À àÀ"Tˆ  @@€6iViVi6€À` ` `À€)OOIvöi€@@@@@@@@@€`Ðð`€$$•@ €@À@€ @•$$€€ @€ @`@ €@ €€??€€À€Àà5DŽõ•®¤®•õŽD5€@ à     à @€ <<<<||~~?€€Ààà??ààÀÀÀÀ€€€9Ïpðððððð€ÀøþÿÿÇ€ðàÀ€@€  €@€@1 dNNÎßÎNNd 1€€À@@```@@À€€ $DD@@€**@À@@@@À@@@@@@@@ss11!B€€€€ÿÿ""""""€€€€€€ààÀÀdÄÄÄÄä|ÄÄdÀ``Àà`````ÀxÌÌÌÌÌy&&FF†ƒ @@€€À`````À!aaacf4,DÆÃÁÁÀa?€€€` `À€À`  @€€€€@@ 0  0 @ Ìí? ?íÌ ÀÀÀÀàà ÿÿàà 0 `@À€€ `@À€€1 `@ÀÀÀÀÀÀÀÀ@` 1€€À@````````@À€€~?À1`@€ @@ÿÿ€À````ÀÀ€ `àà>c?ø€€ÀÀÀ€€Àà````À€ !!AAÿ€€€€€€€€€€€€€€à€€€€à@@@@@_q`@|àÀ€À``````ÀÀ€ 0``ÀÀÏðÀÀÀÀÀÀ``1€À``````ÀÀ€ÿÿÀ€€ àà @€€1 ````09#@ÀÀÀÀ@`€€ÀÀÀÀ€ÀÀ````@À1``ÀÀÀÀÀ@a8€ÀÀ``````à```ÀÀ€ 0``0  `À€€À` ÿÿÿÿàààà@`0  0`@€À``À€0``p0À````àÀ€ `@À—³³³³³³·À@` €À@` `À À  ? @@@@à€€€€ÀÀÀÀ````ðþa``````a~a``````aþ€ÀÀÀÀÀ€€À````À€00```````````00 à` Àüca`````````````acü€ÀÀ`````````ÀÀ€ÿ`````aaccaa`````ÿÀÀ@ @ÀÀÿ`````aaccaa`````ðÀÀ@ 1``ÀÀÀÀÀÀÃÀÀÀÀ``1@ÀÀ@àÀÀÀÀÀÀÀ@ñ````````````````ñàÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀà? ?aáÁÁcà€€€€€€€€€€€€€€€€ñ```abbdh||ffccaa`ñà@€€€€Ààð`````````````````ÿ @ÀÀà``ppqYY[NNNDD@@@@àp`ààà`````````````ðà`pppXXLLFFCCCAA@@àà@@@@@@@@@@@@@ÀÀÀÀ@`@ÀÀÀÀÀÀÀÀÀÀÀÀÀ@`À@`````````````@Àþa```````a~```````ð€À`````À€a@ÀÀÀÀÀÀÀÀÀÀÀÌÒbc€€ÀÀÀÀÀÀÀÀÀÀÀÀÀ€€ àÀþa``````a~baaaaaaað€€ÀÀÀÀ€€€€€€  ÀaÀÀÀÀàp>€Àáž@ÀÀ@€Àà````À€ÿÌŒŒŒ ÀÀ@@@ð````````````````0à@@@@@@@@@@@@@@@@€ð````0000 à@@@@€€€€àÀÀÀÀÀÆÆÆÆÆÏËkkqq11` @@@À€€ð``00  !!@@áà@@€€€€ÀÀàð``000à@@€€€€@@ 00``ÿàÀÀ€€ @ÀÀ À€€À€À@` 0 €€À@` `xx`;`À€À`ÿÿàà<€sAaÁÁÁÁc<€€€€€€€€  À`à````nq`````````qN€ÀÀ`````ÀÀ€1``ÀÀÀÀÀ``1€ÀÀ@€1``ÀÀÀÀÀ``1ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀà1``ÀÿÀÀÀ``0€Àà`à À ÿ ?À``À1```10'@ÀÀ``à€ÀÀÀ€Àà``À`à````oq``````````ñ€ÀÀÀÀÀÀÀÀÀÀà< ?ÃÆ|`à````a`abdhxlfca`ñà€€Àà < ?möffffffffffïÀ```````````pfù``````````ñ€ÀÀÀÀÀÀÀÀÀÀà1`@ÀÀÀÀÀ@`1€À@`````@À€nñ```````qn````ð€À`````À€1`ÀÀÀÀÀ`1@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀà1ó6800000000üÀà`aÀÀà|€ÀàŸ@ÀÀ@€Àà``Àÿ € @€`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀàð``000à@@€€€àÀÀÆÆÆÎËËQq` ` `ÀÀ€ð`0!@áà@€€Ààð``00 ÈÈpà@@€€€`A 00`ÿàÀ€€ @@À@€€€€€€€€€€€€€€€€€@@ 0000000000000 @8|ǃ `À€UªUªUªUªUªUªUªUªUªUªUªUªP P P P P P P P P P P P 888ÿ8888ÿ888<Àà ÀÀ àÀ L ?ll8€@``À€àà 66 ÀÀ@@@`p9?? `àÀ€ÀÀ8`@`_O@ ?@`?À` €À@ àà```@@€&&7 €€€ÿ ð€?0 @ `ÀÀ€àÀ€€@`0€€€€ÀÀ`  )–oo–) €@€`€€`€@€iq‰c†a`@@@`  ÀàÀ@` f /oo/ f`€€€€À`€€`@€€€€`Dd5@À€tt y~??°°ðàÀ€€€€€€€€€€€€€À àÀ"Tˆ  @@€6iViVi6€À` ` `À€)OOIvöi€@@@@@@@@@€`Ðð`€$$•@ €@À@€ @•$$€€ @€ @`@ €@ €€??€€À€Àà <<<<||~~?€€Ààà??ààÀÀÀÀ€€€9Ïpðððððð€ÀøþÿÿÇ€ðàÀ€@€  €@€@ $DD@@€**@À@@@@À@@@@@@@@1 dNNÎßÎNNd 1€€À@@```@@À€€8p``p9@À€  ? @@@@à€€€€ÀÀÀÀ````ð  ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð 3##?#cCCCCCãððð00```````````00 à` Àÿ````aaccaa````ÿÀÀ@ @ÀÀÿ````aaccaa````ÿÀÀ@ @ÀÀ ÿ````aaccaa````ÿÀÀ@ @ÀÀÿ````aaccaa````ÿÀÀ@ @ÀÀ? ?? ? ? ?? ?üca```````üü````acü€ÀÀ`````````ÀÀ€ àppXXLLFFCCCAA@@àà@@@@@@@@@@@ÀÀÀÀ@`@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À`@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À `@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À `@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À `@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À`@ÁÁÂÂÄÄÈÈÐÐà``Ÿ ÀÀ```````````@Àð``````````````0à@@@@@@@@@@@@@@€ð``````````````0à@@@@@@@@@@@@@@€ ð``````````````0à@@@@@@@@@@@@@@€ ð``````````````0à@@@@@@@@@@@@@@€ð``000à@@€€€€0000?10000001?000000€ÀÀÀÀÀÀÀÀ€þa``````afa``````aæ€ÀÀÀÀÀ€€À````À€sAaÁÁÁÁc<€€€€€€€€  ÀsAaÁÁÁÁc<€€€€€€€€  À"sAaÁÁÁÁc<€€€€€€€€  À,sAaÁÁÁÁc<€€€€€€€€  ÀsAaÁÁÁÁc<€€€€€€€€  ÀsAaÁÁÁÁc<€€€€€€€€  ÀxÍ>gƆ†Æo;Àà 0ð0à1``ÀÀÀÀÀ``1€ÀÀ@€1``ÀÿÀÀÀ``0€Àà`à À1``ÀÿÀÀÀ``0€Àà`à À 1``ÀÿÀÀÀ``0€Àà`à À1``ÀÿÀÀÀ``0€Àà`à À< ?< ?"< ?< ?1`@ÀÀÀÀÀ@`1€À@`````@À€ fù``````````ñ€ÀÀÀÀÀÀÀÀÀÀà1`@ÀÀÀÀÀ@`1€À@`````@À€1`@ÀÀÀÀÀ@`1€À@`````@À€ 1`@ÀÀÀÀÀ@`1€À@`````@À€ 1`@ÀÀÀÀÀ@`1€À@`````@À€1`@ÀÀÀÀÀ@`1€À@`````@À€1`AÂÂÄÄÈHp1N€ ÀÀ@`````@À€`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀà`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀà `á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀà`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀàð``00 ÈÈpà@@€€€€@`@€ ð``00 ÈÈpà@@€€€12X24XW€âangband-v3.3.2/lib/xtra/font/6x12x.fon0000644000175000017500000001106011651552410016673 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<}ƒ@@t}}þ€P ,€ 0€FONTDIR6X12XFONTRES 100,100,100:6X12X 9‹Public domain terminal emulator font. Share and enjoy. dd¨ 0ÿ†6X12X‹Public domain terminal emulator font. Share and enjoy. dd¨ 0ÿ†zz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú   * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ   " . : F R ^ j v ‚ Ž š ¦ ² ¾ Ê Ö â î ú    * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ  ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnzüüüüüüüüüüüü¼ìü¼øì¼ô|üì¸Tì\ô¬XìT¼ô\è@@@€D @ € @ 000xx00xxx00xÔ¬üpø¨P 0X¬Ô¬ÔüÔ¬Ô¬ü0H„„„„„„„„„ü0„„„„„ÌxXx000x0(P pبp HP8xè ˆˆˆˆPøøˆˆˆˆpøøˆˆˆP øøˆˆ¨¨PøøˆP PˆøøˆˆˆP @øøøp@ø PˆP øø€@ øøà àøø Pˆ PPPPøPPøP p¨ p(¨p øÈ @˜˜@  @¨h``À €@ @€ ¨p p¨ ø ``Àø`` @€pˆ˜¨Èˆp ` ppˆ @øpˆ0ˆp0Pøø€ðˆp0@€ðˆˆpø pˆˆpˆˆppˆˆx`````````À @ øø@  @pˆ pˆ¸¨¸€ppˆˆøˆˆˆðˆˆðˆˆðpˆ€€€ˆpðHHHHHðø€€ð€€øø€€ð€€€pˆ€€˜ˆpˆˆˆøˆˆˆp pˆpˆ À ˆ€€€€€€øˆØ¨ˆˆˆˆˆˆÈ¨˜ˆˆpˆˆˆˆˆpðˆˆð€€€pˆˆˆ¨hðˆˆð ˆpˆ€pˆpø ˆˆˆˆˆˆpˆˆˆˆPP ˆˆˆˆ¨ØˆˆˆP PˆˆˆˆP øø@€ø8 8€@ à à Pˆø00pxˆx€€ðˆˆˆðpˆ€€xxˆˆˆxpˆð€p0H@à@@@pˆˆˆxp€€ðˆˆˆˆ ˆp€€ˆàˆ Ш¨¨¨°Èˆˆˆpˆˆˆpðˆˆˆð€€pˆˆˆx°È€€€x€pð ø ˆˆˆˆpˆˆˆP ˆˆ¨¨PˆP PˆˆˆˆP @€øp@ø  €@@@ @@@€h°T¨T¨T¨T¨T¨T¨ 0h@@ð@ð@@h0(( p `¸@ p¨p ˆP p p 8@€pˆpà 0°h` `ü 0`0`@@€€@@`0`0P¨¨P¨¨P¨¨PˆPPä8`¸   ˆppP¨Pppˆ ¨øp xXx000x0(P pبp HP8xè ˆˆˆˆP p pø @@``` `@``p0xx000 ``@@`  \ü¸€ÀìøÐ€@`P`@@@@@`PH`PH@ ((0`   X¨X¨pøˆ¨¨¨¨ˆøp @ˆp@ pˆˆøˆˆ pˆˆøˆˆ0Hpˆˆøˆˆ(PpˆˆøˆˆPpˆˆøˆˆP pˆˆøˆˆx  ¸à ¸pˆ€€€ˆp p ø€ð€€ø@ ø€ð€€ø Pø€ð€€øPø€ð€€ø@ p p p p Pp pPp pðˆˆèˆˆðPˆÈ¨˜ˆˆ@ pˆˆˆˆp pˆˆˆˆp Ppˆˆˆˆp(PpˆˆˆˆpPpˆˆˆˆpp˜¨¨¨Èp€@ ˆˆˆˆˆp ˆˆˆˆˆppˆˆˆˆˆpPˆˆˆˆˆp ˆP €€€ðˆˆˆð€€€` ˆˆˆ°@ pxˆx pxˆx Ppxˆx(PpxˆxPpxˆxP pxˆxh|lpˆ€€x p@ pˆð€p pˆð€p Ppˆð€pPpˆð€p@  P P (xˆˆˆp@ pˆˆˆp pˆˆˆp Ppˆˆˆp(PpˆˆˆpPpˆˆˆpp˜¨Èp€@ ˆˆˆˆp ˆˆˆˆp PˆˆˆˆpPˆˆˆˆp ˆˆˆP @€@@pHp@@@6X12XšI¶ÿangband-v3.3.2/lib/xtra/font/5x8x.fon0000644000175000017500000000706011651552410016624 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<|ƒ@@t||ý€P ,€É0€FONTDIR5X8XFONTRES 100,96,96:5x8x 6† BitmapMania and Leon Marrick. Freeware. Share and enjoy! ``ÿ ‚ 5x8x† BitmapMania and Leon Marrick. Freeware. Share and enjoy! ``ÿ ‚ zz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú    " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z øøøøøøøø¸ðØxèø¸è¨Ð°X¨Ð°X@ €@€@@ ` pp `ðð`pØxèp¨P p¨Ø¨Ø¨ØøpˆˆˆˆˆˆøPˆˆˆØØp0p0p P PpP `Pð¸P@ PPPPøPøPP p p(p @P P@ @° P @ @@@@  `ð` ø @ð  @@`` ` ` @€ð` `   ð ð€àà`à`ð @@````p` @ @ pp@  @``@0H˜¨¨@0pðàààp€€€€pààp€à€€ðp€à€€€p€°pðp p0àà€€€€€ðððа``àà€€`аpààp€@ àø ` À€ðð``p`ð @€ð`@@@@`@@ 00 Pø pp€€ààp€€ppp`°Àp0@à@@@pp`€€à ` p ` @€€à` p𨨨à``àà€€pp°À€€pÀ0à@p@@0p``¨¨¨x``p`ð @ð @  @  @P ¨P¨P¨P¨P 0Hà@àH0 P@à@°P¨p¨PPPø ø 0@`P0` `0 @ð  `0 @@ 0`  P¨p¨P  @P ` P¨p¨P @`€`@ pð @pð`pðP pðPpð`pðX  ø ¸p€€€p @@ p€à€ð @p€à€ð`p€à€ðPp€à€ð@ p p p p`p pPp pàÐàP Ð°@ `` @`````P ````(PPpP @ ` @```` @p`€€à°à€€`à @ pp @pp PppP ppPpp`ppÐ8àØp€p @@ `°Àp @`°Àp P`°ÀpP`°Àp @ P P  @ p`P à@ `` @`` P``P `````°Ð`€@ p @p Ppp @p`€À À€€p`5x8x€€?€ý€Áangband-v3.3.2/lib/xtra/font/12x18x.fon0000644000175000017500000002510011651552410016756 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE b † ª Î ò  : ^ ‚ ¦ Ê î  6 Z ~ ¢ Æ ê  2 V z ž  æ  . R v š ¾ â  * N r – º Þ  & J n ’ ¶ Ú þ " F j Ž ² Ö ú  B f Š ® Ò ö  > b † ª Î ò  : ^ ‚ ¦ Ê î  6 Z ~ ¢ Æ ê  2 V z ž Â æ  . R v š ¾ â  * N r – º Þ  & J n ’ ¶ Ú þ " F j Ž ² Ö ú  B f Š ® Ò ö  > b † ª Î ò  : ^ ‚ ¦ Ê î  6 Z ~ ¢ Æ ê  2 V z ž  æ . R v š ¾ â ! *! N! r! –! º! Þ! " &" J" n" ’" ¶" Ú" þ" "# F# j# Ž# ²# Ö# ú# $ B$ f$ Š$ ®$ Ò$ ö$ % >% b% †% ª% Î% ò% & :& ^& ‚& ¦& Ê& î& ' 6' Z' ~' ¢' Æ' ê' ( 2( V(z(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððððððððððððððððð·þwÞû¿í¿öÝÿoý·ÿÛ°ððÐðpÐðàð°ð`ð°ðPðµkµk]ëUîUú¥UëUîUúPð pPàPàPð pPàPàPðHˆ!@@ €"H$€@ € @@ ‚A@‚A@@€@ €@@€ € €€€€????€ÀÀàààÀÀ€:ujÕÿÀ` p°Pð?UÿU* À`ð`À€5jUªÕªÕªÕÿªÕªÕªÕÿÀ `°P°P°Pð°P°P°Pð0@@€€€€€€€€€€€€€ÿÀ ð @€€€€€€€Ö@ °i?    7:`À€€€€€€€ÀÀ€$X À€)6)€@À@€€U$)=kU:@@@@€Àà` $@ ÀÀ @$€@€``€@€€€€€€€€àà€€àà€€€5ddt?d5€À€ÀÀÀ€8ll9 3cA `À€À``À11;>wcas?€€€ `À€ÀÀ`    5{5€À€??ÀÀ??ÀÀ 00ÀÀ€€1`````````1€ÀÀÀÀÀÀÀÀÀ€?À1` 0€ÀÀÀÀ€Àa?ÀÀ€€ÀÀÀÀ€ 1a€€€€€€€€À€€€€````qa?À€ÀÀÀÀ€0```q````1€À€ÀÀÀÀ€ 00ÀÀÀ€1```11```1€ÀÀÀ€€ÀÀÀ€1````1a?€ÀÀÀÀÀÀÀÀÀ€ 0 €€??€€0  0€?q`€ÀÀÀÀ€0-[[[[[[/0€@@@@@@€À1````````€ÀÀÀÀÀÀÀÀÀa```aa```a€ÀÀÀ€€ÀÀÀ€0`````````0€ÀÀ€a`````````a€ÀÀÀÀÀÀÀÀÀ€`````~`````ÀÀ`````~``````À0`````c```1€ÀÀÀÀÀ€````````````ÀÀÀÀÀÀÀÀÀÀÀÀÀ€€aa3À€€€€€€€€€€`acflxxxlfca`À€€À````````````À``pyoff````````àà````````````pxlfca````ÀÀÀÀÀÀÀÀÀÀÀÀÀ11```````11€€ÀÀÀÀÀÀÀ€€a```a``````€ÀÀÀ€11``````f31€€ÀÀÀÀÀÀÀ€€À@a```alfca``€ÀÀÀ€€ÀÀ1``p?`1€À€ÀÀÀÀ€à```````````1ÀÀÀÀÀÀÀÀÀÀÀ€````111ÀÀÀÀ€€€``````ffoyp```````````àà````1111``ÀÀ€€€€ÀÀ``00``ÀÀ€€ 80`ÀÀ€€À00 €€ÀÀ1`€Àÿÿðð??``a>€ÀÀÀÀÀÀÀ`````oq````qo€ÀÀÀÀ€0````0€ÀÀ€1````1ÀÀÀÀÀÀÀÀÀÀÀÀÀ1```0€ÀÀÀ€ ? €@€>a```a>a?ÀÀÀÀÀÀÀÀÀÀ€`````oq``````€ÀÀÀÀÀÀÀ€3€€€€€€€€€€€€00000036<<630À€€À€yfff```Àà``````oq``````€ÀÀÀÀÀÀÀ1````1€ÀÀÀÀ€oq````qo```€ÀÀÀÀ€1````1ÀÀÀÀÀÀÀÀÀÀÀo8000000€À?``>`?€À€ÀÀ€ ? €@€``````q?ÀÀÀÀÀÀÀ ``11ÀÀ€€```foy0`````ààÀ`11`À€€À`````q>`?ÀÀÀÀÀÀÀÀÀÀ€ 0À€À€€€€<gÀÀ€UªUªUªUªUªUªUªUªUªP P P P P P P P P 0000000€@@€  ?l8€@€À 66 ÀÀ00??ÀÀ€€ÀÀ00/ 0€À€@@ÀÀÀ€ <ÿðÀ  @@€@  €@ $J5®__®5J$ €@€ @@ €@€U)ežn‰""D@€`€€`€@ €@@ I&99_//_99&I @À€À @@ À€À@  0008`àÀ1```````€ÀÀÀÀÀÀÀÀ1```````€ÀÀÀÀÀÀÀÀ 1```````€ÀÀÀÀÀÀÀÀ 1```````€ÀÀÀÀÀÀÀÀ1```````€ÀÀÀÀÀÀÀÀ 1```````€ÀÀÀÀÀÀÀÀ3ccccccccccààà0`````````0€ÀÀ€````~`````ÀÀ````~`````ÀÀ ````~`````ÀÀ````~`````ÀÀ€€€€ €€€€€a````üü```a€ÀÀÀÀÀÀÀÀÀ€ ``pxlfca````ÀÀÀÀÀÀÀÀÀÀÀÀ11``````11€€ÀÀÀÀÀÀ€€11``````11€€ÀÀÀÀÀÀ€€ 11``````11€€ÀÀÀÀÀÀ€€ 11``````11€€ÀÀÀÀÀÀ€€11``````11€€ÀÀÀÀÀÀ€€11abddhp11_@€€ÀÀÀÀÀÀ€€``````````1ÀÀÀÀÀÀÀÀÀÀ€``````````1ÀÀÀÀÀÀÀÀÀÀ€ ``````````1ÀÀÀÀÀÀÀÀÀÀ€``````````1ÀÀÀÀÀÀÀÀÀÀ€`00`ÀÀ€€000?100001?000€ÀÀÀÀÀÀ€?a``acfca``ag€ÀÀÀ€€ÀÀÀ€??``a>€ÀÀÀÀÀÀÀ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ>gfff;À``àÀ0````0€ÀÀ€1```0€ÀÀÀ€1```0€ÀÀÀ€ 1```0€ÀÀÀ€1```0€ÀÀÀ€€€ € €  ?q````q?€ÀÀÀÀÀÀ€ oq``````€ÀÀÀÀÀÀÀ1````1€ÀÀÀÀ€1````1€ÀÀÀÀ€ 1````1€ÀÀÀÀ€ 1````1€ÀÀÀÀ€1````1€ÀÀÀÀ€1bddh1?@@€€ÀÀÀÀ€``````q?ÀÀÀÀÀÀÀ ``````q?ÀÀÀÀÀÀÀ  ``````q?ÀÀÀÀÀÀÀ ``````q?ÀÀÀÀÀÀÀ `````q>`?ÀÀÀÀÀÀÀÀÀÀ€0000?000?0000€ÀÀÀ€`````q>`?ÀÀÀÀÀÀÀÀÀÀ€12x18xU‹ìÿvÿvštangband-v3.3.2/lib/xtra/font/8x8xb.fon0000644000175000017500000000706011651552410016771 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<}ƒ@@t}}þ€P ,€É0€FONTDIR8X8XBFONTRES 100,96,96:8X8xb 6‡ Leon Marrick, 2005. Freeware. Share and enjoy! ``¼0ÿ ‚ 8X8xb‡ Leon Marrick, 2005. Freeware. Share and enjoy! ``¼0ÿ ‚ zz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú    " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ÿÿÿÿÿÿÿÿÛÿ·ý¿öß–ýU¯U»Uë€$H@ €@@<<8|||8 vªþ|ªT(~Õ«Õÿ«Õÿ~ÿZÛl(8(P 8lTl*"\zf(@@<<$$$llþlþll|Ð||f¬Ø6jÌ8l8vÌÌv0 000  l8Ö8l00ü0000 ~00 0`À€f<0000 0`0 ~~0  0F>``|fff|>```>>fff>ff><``lvfff8<  L8``flxlf8<ÆîþÖÆlvfffff>\2000>p<|00x000fffn6ÆÆl8ÆÖþîÆÌx0xÌfff><~ 0~ 0 0 02LUªUªUªUª8dø`ød820ü0x¶@$Z<XØþØØÞ|ÀÀÀ|~`x`~~`x`~~`x`~$~`x`~<<<<<<$<<øÌFöFÌø(æöÞÎÆ<``|f|``$ff><8X8xbangband-v3.3.2/lib/xtra/font/10x14x.fon0000644000175000017500000002106011651552410016751 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€ 0€FONTDIR10X14XFONTRES 100,96,96:10X14X 11Ž Leon Marrick, 2005. Freeware. Share and enjoy! `` , 0 ÿ ˆ 10X14XŽ Leon Marrick, 2005. Freeware. Share and enjoy! `` , 0 ÿ ˆ z z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÝ÷ö¿íÿ{ßþwßýïÀ@ÀÀ€ÀÀ@ÀÀÀ@À€UºmßUúU»U¾ißUú@€@À@€@€@€@À@À"€ @„ ˆ €@€€@€@ ˆ@€ @€@ >>>>>zÕª€À@ÀÀ?UÿU+ €À€kUªÕªÕÿªÕªÕªÿ€€À@À@ÀÀ@À@ÀÀa@€€€€€€€€€€ÿ€€@@@@@@@@@@À !@€€€€€Þ€@@@@@ÀR?  -?€ (P5+5+ DI*2]jÕú€€€"€AÀA€"€€€€€>IH> I>!RR$%%B""$"!#€€66 €>AAAAAAAA>(>>AA @A> "B@@^aA>!@@^aAAA> >AAA>AAAA>>AAAC=B<   >AAaZ¦¤¤¥^a€€€€€"AAAAAA~AAA~AAAA~!@@@@@@!|BAAAAAAB|@@@x@@@@@@@x@@@@@!@@@GAA"AAAAAAAAA>>B<ABDHpPHDBA@@@@@@@@@AAcUIIAAAAAAaQIECAAA"AAAAAA"~AAA~@@@@@"AAAAAI&~AAA~HDBAA>A@@8A>AAAAAAAAA>AAA"""AAAAIIUcAAAA""AAAA" @@@ "AÿÀ >?AC=@@@^aAAAa^>A@@@A>=CAAAC=>AA@@>|=BBB<@>A>@@@^aAAAAA>B<@@@AFX`XFA>vIIIAAA^aAAAAA>AAAAA>^aAAAa^@@=CAAAC=N1 >A@>A>|BBBBBB=AA""AAAIII6A""A!!!!!# 0000L€UªUªUªUªUªUªUª@€@€@€@€@€@€@€ | | ~>00~Gp>A>€€€€€ ,€  0 @@ 0  A*kœ>œk*A€€ J$TÌ<d*I€€ˆUk>]¾]>kUˆ€€€!!"AAAAAA"AAAAAA"AAAAAA "AAAAAA"AAAAAA"AAAAAA$DDDDDDG€€€!@@@@@@!@@@|@@@@@@|@@@ @@@|@@@@@@|@@@>>>>>>>>>! | !>€€€€€€ AAaQIECAA"AAAAA""AAAAA" "AAAAA" "AAAAA""AAAAA""CEIIQa"\AAAAAAAA>AAAAAAAA> AAAAAAAA>AAAAAAAA>AA" >!!!!> !!&($"!!.>?AC=>?AC=>?AC= >?AC=>?AC=>?AC=A@@@A>>AA@@>>AA@@>>AA@@>>AA@@>>>>>>AAAAA> ^aAAAAA>AAAAA>>AAAAA> >AAAAA> >AAAAA>>AAAAA>>CEIQa>@BBBBBB=BBBBBB=BBBBBB=$BBBBBB=!!!!!# <""< !!!!!#10X14Xangband-v3.3.2/lib/xtra/font/9x15x.fon0000644000175000017500000006516011651552410016713 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<•ƒ@@Œ••€P D€,)0€U)0€~)0€FONTDIR9X15XFONTRES 100,96,96:9X15x 11Ž"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"9X15x"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"9X15xXŽ"Public domain terminal emulator font. Share and enjoy. dd L 0 ÿ ‰"9X15X¾LHMŽ"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€  ?????UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€ ??$$€€)) !€€€"""""!#€€ ? €?€ ?€ € €€€€€€    ?€€€€? €€€€€€ !?€? /0 €€€€€€ /0 €€€€?€€€  €€€€€€€ !€€€€€€€ ??€€ €€€ '()& €€€€€€  ? €€€€€€€??€€€€€€€ €€??€€€€€€€€??€€?€ # €€€€€ ? €€€€€€€€€€!€ !"$8($"! €€ ?€ 1**$$ €€€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€€? ? €€€ $"€€€€€€€€€? ?$"! €€€€€  €€€€€?€ €€€€€€€€€  €€€ $$$$*€€€€€€€€€    €€€€  €€? ?€€€ €  €€  !€€€€€€ /0 0/€€€€€ €€! !€€€€€€€€€€ ? €€€>€€!!!  €€€ /0 €€€€€€ !!! #,0,# €€ ;$$$$$ €€€€€€/0 €€€€€€ €€€€€/0 0/ €€€€€! !€€€€€€€€€€'€€  €€€?€!!!!!!€  €€ $$$*€€€€€€    €€!!!!!#!??€€ €€88$#€€UªUªUªUªUªUªUªU€€€€€€€1 x x 1|> 0, " ,ÿ0€ ? 0 @€@ 0 ? €*U¾¾¾¾U*€€€€„H(,28V™$BB€€€€Uk¾¾kU€€€€€€€€T|8c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€>> 00ppppx<<~><<80000/߀€€€€€€€€Àðûß„€ 0($$(0 0($2($"  (HH#U #U <$fZÛÛZf$<AA> ? €€€€€€€ ? €€€€€€€  ? €€€€€€€  ? €€€€€€€  ? €€€€€€€ ? €€€€€€€?hȈÿˆˆˆˆ€€€  €€??€€??€€ ??€€ ??€€  ?<?€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€ €€€€€€€  €€€€€€€  €€€€€€€  €€€€€€€!""$$((0 €€€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€  €€ >!!!!> !!"$($"! !€€€€€€ !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€Œ˜˜˜o€€€  €€ ? €€€ ? €€€  ? €€€  ? €€€      !!!!! /0 €€€€€€ €€€€€ €€€€€  €€€€€  €€€€€  €€€€€!"$(0 €€€€€€!!!!!!€!!!!!!€!!!!!!€!!!!!!€!!!!!#! <"""< !!!!!#!9X15x"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€  ?????UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€ ??$$€€)) !€€€"""""!#€€ ? €?€ ?€ € €€€€€€    ?€€€€? €€€€€€ !?€? /0 €€€€€€ /0 €€€€?€€€  €€€€€€€ !€€€€€€€ ??€€ €€€ '()& €€€€€€  ? €€€€€€€??€€€€€€€ €€??€€€€€€€€??€€?€ # €€€€€ ? €€€€€€€€€€!€ !"$8($"! €€ ?€ 1**$$ €€€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€€? ? €€€ $"€€€€€€€€€? ?$"! €€€€€  €€€€€?€ €€€€€€€€€  €€€ $$$$*€€€€€€€€€    €€€€  €€? ?€€€ €  €€  !€€€€€€ /0 0/€€€€€ €€! !€€€€€€€€€€ ? €€€>€€!!!  €€€ /0 €€€€€€ !!! #,0,# €€ ;$$$$$ €€€€€€/0 €€€€€€ €€€€€/0 0/ €€€€€! !€€€€€€€€€€'€€  €€€?€!!!!!!€  €€ $$$*€€€€€€    €€!!!!!#!??€€ €€88$#€€UªUªUªUªUªUªUªU€€€€€€€1 x x 1|> 0, " ,ÿ0€ ? 0 @€@ 0 ? €*U¾¾¾¾U*€€€€„H(,28V™$BB€€€€Uk¾¾kU€€€€€€€€T|8c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€>> 00ppppx<<~><<80000/߀€€€€€€€€Àðûß„€ 0($$(0 0($2($"  (HH#U #U <$fZÛÛZf$<AA> ? €€€€€€€ ? €€€€€€€  ? €€€€€€€  ? €€€€€€€  ? €€€€€€€ ? €€€€€€€?hȈÿˆˆˆˆ€€€  €€??€€??€€ ??€€ ??€€  ?<?€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€ €€€€€€€  €€€€€€€  €€€€€€€  €€€€€€€!""$$((0 €€€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€  €€ >!!!!> !!"$($"! !€€€€€€ !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€Œ˜˜˜o€€€  €€ ? €€€ ? €€€  ? €€€  ? €€€      !!!!! /0 €€€€€€ €€€€€ €€€€€  €€€€€  €€€€€  €€€€€!"$(0 €€€€€€!!!!!!€!!!!!!€!!!!!!€!!!!!!€!!!!!#! <"""< !!!!!#!9X15xXŽ"Public domain terminal emulator font. Share and enjoy. dd L 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€  ?????UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€€üÿ€ÿ€ ?€€€  ?€€? €?? €€€>)€€ ??$$€€)) !€€€"""""!#€€ ? €?€ ?€ € €€€€€€    ?€€€€? €€€€€€ !?€? /0 €€€€€€ /0 €€€€?€€€  €€€€€€€ !€€€€€€€ ??€€ €€€ '()& €€€€€€  ? €€€€€€€??€€€€€€€ €€??€€€€€€€€??€€?€ # €€€€€ ? €€€€€€€€€€!€ !"$8($"! €€ ?€ 1**$$ €€€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€€? ? €€€ $"€€€€€€€€€? ?$"! €€€€€  €€€€€?€ €€€€€€€€€  €€€ $$$$*€€€€€€€€€    €€€€  €€? ?€€€ €  €€  !€€€€€€ /0 0/€€€€€ €€! !€€€€€€€€€€ ? €€€>€€!!!  €€€ /0 €€€€€€ !!! #,0,# €€ ;$$$$$ €€€€€€/0 €€€€€€ €€€€€/0 0/ €€€€€! !€€€€€€€€€€'€€  €€€?€!!!!!!€  €€ $$$*€€€€€€    €€!!!!!#!??€€ €€88$#€€UªUªUªUªUªUªUªU€€€€€€€1 x x 1|> 0, " ,ÿ0€ ? 0 @€@ 0 ? €*U¾¾¾¾U*€€€€„H(,28V™$BB€€€€Uk¾¾kU€€€€€€€€T|8c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€>> 00ppppx<<~><<80000/߀€€€€€€€€Àðûß„€ 0($$(0 0($2($"  (HH#U #U <$fZÛÛZf$<AA> ? €€€€€€€ ? €€€€€€€  ? €€€€€€€  ? €€€€€€€  ? €€€€€€€ ? €€€€€€€?hȈÿˆˆˆˆ€€€  €€??€€??€€ ??€€ ??€€  ?<?€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€ €€€€€€€  €€€€€€€  €€€€€€€  €€€€€€€!""$$((0 €€€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€  €€ >!!!!> !!"$($"! !€€€€€€ !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€Œ˜˜˜o€€€  €€ ? €€€ ? €€€  ? €€€  ? €€€      !!!!! /0 €€€€€€ €€€€€ €€€€€  €€€€€  €€€€€  €€€€€!"$(0 €€€€€€!!!!!!€!!!!!!€!!!!!!€!!!!!!€!!!!!#! <"""< !!!!!#!9X15Xangband-v3.3.2/lib/xtra/font/6x13x.fon0000644000175000017500000001146011651552410016700 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<}ƒ@@t}}þ€P ,€0€FONTDIR6X13XFONTRES 100,100,100:6x13x 9ŒPublic domain font. Share and enjoy. dd o ÿ ‡6x13xŒPublic domain font. Share and enjoy. dd o ÿ ‡zz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó '4AN[hu‚œ©¶ÃÐÝê÷+8ER_ly†“ ­ºÇÔáîû"/<IVcp}Š—¤±¾ËØåòÿ  & 3 @ M Z g t  Ž › ¨ µ  Ï Ü é ö    * 7 D Q ^ k x … ’ Ÿ ¬ ¹ Æ Ó à í ú   ! . ; H U b o | ‰ – £ ° ½ Ê × ä ñ þ   % 2 ? L Y f s €  š § ´ Á Î Û è õ    ) 6 C P ] j w „ ‘ ž « ¸ Å Ò ß ì ù  -:GTan{ˆ•¢¯¼ÉÖãðý $1>KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzüüüüüüüüüüüüüø¼ìü¼øì¼ô|üì¸ìTìXô¬XìT¼ô\è@@@€D @ € @ 000xx00xxx00xT¬øðpø¨P 0xܬԬÔüÔ¬Ô¬ü0H„„„„„„„„„„ü0H„„„„„ÌxXx000x0(P pبp HP8xè ˆˆˆˆP < à üü  @ ø€@  @€øøPPPø ø€0H@ð ð¨à PPPPPøPøPP p  p((p H¨P @P¨@  @ ˜h0 @ @@@ @  @ ¨øpø¨ ø 0 @ø p  @@€€ PˆˆˆˆˆP `  øpˆˆ @€øø pˆp0PPøø€€°Èˆppˆ€€ðˆˆˆpø @@@pˆˆˆpˆˆˆppˆˆˆxˆp p p p 0 @ @€@ øø€@  @€pˆˆ pˆˆ˜¨¨°€x PˆˆˆøˆˆˆðHHHpHHHðpˆ€€€€€ˆpðHHHHHHHðø€€€ð€€€øø€€€ð€€€€pˆ€€€˜ˆˆpˆˆˆˆøˆˆˆˆp p8`ˆˆ À ˆˆ€€€€€€€€øˆˆØ¨¨ˆˆˆˆˆÈȨ¨˜˜ˆˆpˆˆˆˆˆˆˆpðˆˆˆð€€€€pˆˆˆˆˆˆ¨pðˆˆˆð ˆˆpˆ€€pˆpø ˆˆˆˆˆˆˆˆpˆˆˆˆPPP ˆˆˆˆ¨¨¨ØˆˆˆPP PPˆˆˆˆPP ø @@€øp@@@@@@@p€€@@ pp Pˆø0pxˆˆx€€€ðˆˆˆˆðpˆ€€ˆpxˆˆˆˆxpˆø€ˆp0H@@ð@@@@pˆˆˆxˆp€€€°Èˆˆˆˆ ` p0`€€€ À ˆ` pШ¨¨¨ˆ°Èˆˆˆˆpˆˆˆˆpðˆˆˆð€€€xˆˆˆx°È€€€€pˆ`ˆp@@ð@@@H0ˆˆˆˆ˜hˆˆˆPP ˆˆ¨¨¨PˆP Pˆˆˆˆ˜hˆpø @€ø À  À  ÀH¨¨T¨T¨T¨T¨T¨T¨ 0h@@ð@ð@@h0(( p `¸@ p¨p ˆP p p 8@€ðˆxà 0°h` `ü 0`0`@@€€@@`0`0P¨¨P¨¨P¨¨PˆPPä8`¸   ˆppP¨Pppˆ ¨øp xXx000x0(P pبp HP8xè ˆˆˆˆP p pø @@@``` `@``p0xxx000 ``@@`  \ü¸€ÀìøÐ€@`PHP`@@@@@`PH`PH@ ((0`   X¨X¨pøˆ¨¨¨¨ˆøp @€ˆˆp@ Pˆˆøˆˆˆ Pˆˆøˆˆˆ P Pˆˆøˆˆˆ(P PˆˆøˆˆˆP PˆˆøˆˆˆP Pˆˆøˆˆˆx   ø  ¸pˆ€€€€ˆp p ø€€ð€€€ø@ ø€€ð€€€ø Pø€€ð€€€øPø€€ð€€€ø@ p p p p Pp pPp pðHHHhHHHðPˆÈȨ¨˜˜ˆˆ@ pˆˆˆˆˆˆp pˆˆˆˆˆˆp Ppˆˆˆˆˆˆp(PpˆˆˆˆˆˆpPpˆˆˆˆˆˆpp˜¨¨¨¨Èp€@ ˆˆˆˆˆˆˆp ˆˆˆˆˆˆˆppˆˆˆˆˆˆˆpPˆˆˆˆˆˆˆp ˆˆPp €€€ðˆˆˆð€€€` ˆˆˆ°@ pxˆˆx @pxˆˆx Pˆpxˆˆx(PpxˆˆxPpxˆˆxˆP pxˆˆxø(x  xpˆ€€ˆp p@ pˆø€ˆp @pˆø€ˆp Pˆpˆø€ˆpPpˆø€ˆp€@ ` p @` p Pˆ` pP` p @ xˆˆˆˆp@ pˆˆˆˆp @pˆˆˆˆp Pˆpˆˆˆˆp(PpˆˆˆˆpPpˆˆˆˆpp˜¨¨Èp€ @ˆˆˆˆ˜h@ ˆˆˆˆ˜h Pˆˆˆˆˆ˜hPˆˆˆˆ˜h @ˆˆˆ˜hˆp@@@pHp@@@6x13xangband-v3.3.2/lib/xtra/font/8x16x.fon0000644000175000017500000001306011651552410016703 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€I0€FONTDIR8X16XXFONTRES 100,96,96:8X16x 12Public domain font, edited by LMarrick. Share and enjoy. `` ,0ÿ Š8X16xPublic domain font, edited by LMarrick. Share and enjoy. `` ,0ÿ ŠzzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú  * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú  *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿ·ý¿ößÛÿ·ý¿öß–ýU¯U»Uë–ýU¯U»Uë€$H@ €$H@ €@€@@@<<<<~~~~~<8\nÖªþ|ªT(BF:@@@\bBBBb\pþžBF:<>BF:<>BF:(<>BF:$<>BF:<>BF:~‰˜˜˜nBBBBB<(\bBBBBBKXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzÿÿÿÿÿÿÿÿÿÿÿÿÿî¿÷}ï»þß÷}ßûûUú¥ëUîUú¥UU@‚D ‚  € ˆ @8|||8<~~~~<6{Õ«~«V,<~Õ«Õ«Õÿ«Õ«Õ«BF:@@@\bBBb\pþž"@@@@@@"~@@x@@~~@@x@@~$~@@x@@~$~@@x@@~ 8888(88(88xDBBòBBDx(BBbRJFBB$BBB$$BBB$$$BBB$($BBB$$$BBB$$FJZRb$XBBBBBBB<BBBBBBB<$BBBBBBB<$BBBBBBB<‚D(@@xDDDx@@@@8DDXPHDDX<>BF:<>BF:<>BF:(<>BF:$<>BF:(<>BF:þ ˜˜n H R \ f p z „ Ž ˜ ¢ ¬ ¶ À Ê Ô Þ è ò ü    $ . 8 B L V ` j t ~ ˆ ’ œ ¦ ° º Ä Î Ø â ì ö     ( 2 < F P Z d n x ‚ Œ –   ª ´ ¾ È Ò Ü æ ð ú    " , 6 @ J T ^ h r | †  š ¤ ® ¸  Ì Ö à ê ô þ    & 0 : D N X b l v € Š ” ž ¨ ² ¼ Æ Ð Ú ä î ø   *4>HR\fpzüüüüüüüüüü¼ì¼øì¼ô|ìøTìT¬XôT¼Tì@@@€ @ @ 00xx00xxx00xT¬üpø¨P 0hÔ¬Ôü¬Ô¬ü0H„„„„„„„ü0„„„„ÌxX00x0(Ppبp @Pxè ˆˆˆP PPPøPPøP x p(ð `¨Ð X¨0@  @¨h @ @@@ @  @P ø P ø @ø  @@€€pˆˆˆˆˆp `  øpˆ0@€øpˆ0ˆp0Pøø€ðˆppˆ€ðˆˆpø pˆˆpˆˆppˆˆxˆp @ @€@ øø@  @pˆ 8Dœ¬œ@8 Pˆˆøˆˆðˆˆðˆˆðpˆ€€€ˆpðˆˆˆˆˆðø€€ð€€øø€€ð€€€pˆ€€˜ˆpˆˆˆøˆˆˆp pˆˆpˆ À ˆ€€€€€€øˆØ¨¨ˆˆˆˆˆÈ¨˜ˆˆpˆˆˆˆˆpðˆˆð€€€pˆˆˆ¨hðˆˆð ˆpˆ€pˆpø ˆˆˆˆˆˆpˆˆˆˆˆP ˆˆˆ¨¨ØˆˆˆP PˆˆˆˆP ø @€øp@@@@@@@p€€@@ pp Pˆü pxˆx€€ðˆˆˆðx€€€xxˆˆˆxpˆø€p0@@ð@@@pˆˆˆxp€€ðˆˆˆˆ ` p0`€€ˆàˆ` pШ¨¨¨°Èˆˆˆpˆˆˆpðˆˆˆð€€xˆˆˆx°È€€€x€pð x ˆˆˆ˜hˆˆˆP ˆ¨¨¨PˆP Pˆˆˆˆˆxpø @ø  @  @h°T¨T¨T¨T¨T¨ 0h@ð@ð@h0( p `¸@ p¨p ˆP ø ø x€pˆpð 0°h` `ü 0`0`@€€@`0`0P¨P¨¨P¨PˆPà8`¸ ˆpP¨Ppˆ @€ˆp@ pˆˆøˆˆ pˆˆøˆˆ0Hpˆˆøˆˆ(PpˆˆøˆˆPpˆˆøˆˆP pˆˆøˆˆx  ø  ¸pˆ€€€ˆp `@ ø€ð€€ø ø€ð€€ø Pø€ð€€øPø€ð€€ø@ p p p p Pp pPp pðˆˆèˆˆðPˆÈ¨¨˜ˆ@ pˆˆˆˆp pˆˆˆˆp Ppˆˆˆˆp(PpˆˆˆˆpPpˆˆˆˆpp˜¨¨¨Èp€@ ˆˆˆˆˆp ˆˆˆˆˆppˆˆˆˆˆpPˆˆˆˆˆp ˆP €€ðˆˆˆð€€` ˆˆ°@ pxˆx pxˆx Ppxˆx(PpxˆxPpxˆxP pxˆxø|lx€€€x @ pˆø€p pˆø€p Ppˆø€pPpˆø€p@ ` p ` p @` pP` p(xˆˆˆp(P°Èˆˆˆ@ pˆˆˆp pˆˆˆp Ppˆˆˆp(PpˆˆˆpPpˆˆˆpp˜¨Èp€@ ˆˆˆ˜h ˆˆˆ˜h Pˆˆˆ˜hPˆˆˆ˜h HHH80@@pHp@@HHHH806x10xangband-v3.3.2/lib/xtra/font/8x12x.fon0000644000175000017500000001106011651552410016675 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<}ƒ@@t}}þ€P ,€ 0€FONTDIR8X12XFONTRES 100,96,96:8x12x 9‹Leon Marrick, 2005. Freeware. Share and enjoy! `` , 0ÿ †8x12x‹Leon Marrick, 2005. Freeware. Share and enjoy! `` , 0ÿ †zz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú   * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ   " . : F R ^ j v ‚ Ž š ¦ ² ¾ Ê Ö â î ú    * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ  ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnzÿÿÿÿÿÿÿÿÿÿÿÿî¿÷}ï»þß÷}ßûUú¥ëUîUú¥U@‚D ‚  € ˆ @8|||8<~~~~<6{Õ«~«V,<~Õ«Õ«Õÿ«Õ«ÕBF:@@@\bBBb\pþž"@@@@@"~@@x@@~~@@x@@~$~@@x@@~$~@@x@@~ 8888(88(88xDBBòBBDx(BbRJFBB$BBB$$BBB$$$BBB$($BBB$$$BBB$$FJZRb$XBBBBBB<BBBBBB<$BBBBBB<$BBBBBB<‚D(@@xDDDx@@@8DDXPHDX<>BF:<>BF:<>BF:(<>BF:$<>BF:(<>BF:þ ˜˜n€€€€€€€`````nsaaaasn€€€€1````1€€3aaaa3€€€€€€€€€€€€€3a``1€€€~€€>cccc>`?aaa?€€€€€`````nsaaaaaa€€€€€€ < €aa3€€€€€€€€€€€€`````cflx|ngc€< €[mmmmmm€€€€€€€nsaaaaaa€€€€€€3aaaa3€€€€nsaaaasn````€€€€3aaaa3€€€€€€€€€€€€o9000000€?a`?a?€€€€~€aaaaaa3€€€€€€€€aa33 €€aaammm3€€€€€€€a3 3a€€aaaaaa3a3€€€€€€€€€€ 0`€€ x €€ x  x€9mg€€UªUªUªUªUªUªUªUªUªUª@€@€@€@€@€@€@€@€@€@€ 1```þ```þ```1€€€€~|Vs€€À€mm€€@aa33 ? ? €€€ 1```~a!?Aa?€€€€€€€ ,.:8ÿÀ 80 `À€À@` 08 €I*”k]¾¾]k”*I€€€€¡j2 k¹?i’%%%I€€€€@€R!?-s¿^^¿s-?!R€€@€€@€€Ik>s?  /5€(P €3mRms- €€€€ " *J)3;m;Õk5€€€€I*€A€AÁA€A€*I€€€€€ ? ? ? €€ 888888x||~?€€???<<<<88€€3ß@ÀÀÀÀÀÀ€ðüþÿÏÀ€ 0,"!",0  (HH#U #U "k]]ÝÿÝ]]k"€€€ 0```aq?€€€ 33aaaaaaa€€€€€€€€ 33aaaaaaa€€€€€€€€  33aaaaaaa€€€€€€€€  33aaaaaaa€€€€€€€€ 33aaaaaaa€€€€€€€€ 33aaaaaaa€€€€€€€€?fÆÆÆÆÆÿÆÆÆÆÆÆÇÀÀÀ3a```````a3€€````~````€€````~````€€ ````~````€€````~````€€ €€ €€  €€ €€~caaaaùùaaac~€€€€€€€€ aqyymmggccaa€€€€€€€€€€€€3aaaaaaaa3€€€€€€€€3aaaaaaaa3€€€€€€€€ 3aaaaaaaa3€€€€€€€€ 3aaaaaaaa3€€€€€€€€3aaaaaaaa3€€€€€€€€3cceeiiqq3^€€€€€€€€€aaaaaaaaaa3€€€€€€€€€€aaaaaaaaaa3€€€€€€€€€€ aaaaaaaaaa3€€€€€€€€€€aaaaaaaaaa3€€€€€€€€€€aa33 €€000gcacgnlfcaacn€€?a?aaa>€€€€€€€?a?aaa>€€€€€€€ ?a?aaa>€€€€€€€ ?a?aaa>€€€€€€€?a?aaa>€€€€€€€ ?a?aaa>€€€€€€€L ?lll?€€€€€1````1€€3a``1€€€3a``1€€€ 3a``1€€€3a``1€€€< €< €< €< €((3aaaa3€€€€ nsaaaaaa€€€€€€3aaaa3€€€€3aaaa3€€€€ 3aaaa3€€€€ 3aaaa3€€€€3aaaa3€€€€3ceiq3^€€€€€aaaaaa3€€€€€€€€aaaaaa3€€€€€€€€ aaaaaa3€€€€€€€€aaaaaa3€€€€€€€€aaaaaa3a3€€€€€€€€€€0000>?111?>0000€€€aaaaaa3a3€€€€€€€€€€10X20xangband-v3.3.2/lib/xtra/font/7x13xb.fon0000644000175000017500000001146011651552410017043 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ @@t~~ÿ€P ,€0€FONTDIR7X13XBFONTRES 100,100,100:7X13XB 9Public domain font. Share and enjoy. dd ° 0ÿ ‡7X13XBPublic domain font. Share and enjoy. dd ° 0ÿ ‡zz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó '4AN[hu‚œ©¶ÃÐÝê÷+8ER_ly†“ ­ºÇÔáîû"/<IVcp}Š—¤±¾ËØåòÿ  & 3 @ M Z g t  Ž › ¨ µ  Ï Ü é ö    * 7 D Q ^ k x … ’ Ÿ ¬ ¹ Æ Ó à í ú   ! . ; H U b o | ‰ – £ ° ½ Ê × ä ñ þ   % 2 ? L Y f s €  š § ´ Á Î Û è õ    ) 6 C P ] j w „ ‘ ž « ¸ Å Ò ß ì ù  -:GTan{ˆ•¢¯¼ÉÖãðý $1>KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzþþþþþþþþþþþþþî¾ö|îºþÞö|ÞúúTú¤~êTîTú¤~ÔT@‚D ‚  € ˆ @000xx08||||8xüüüüüx>00000000000ðð00000000000þþþþ000000000000000000 `À` üüÀ` `ÀüüülllìÌ üü0üüÀ€8l``ð``l¸0000000000lll((||(||((0x´°x4´x0ä¬è0`\ÔœpØØØpÔÜØt880`00```00`0000`H0üü0H00üü00880`üü0x0 0``ÀÀ0HÌÌÌÌÌH00p°00000üxÌÌ 8`ÀÀüxÌ 8 Ìx KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzüüüüüüüüüüüüüø¼ìü¼øì¼ô|üì¸ìTìXô¬XìT¼ô\è@@@€D @ € @000xx00xxx00xxxx00xxÔ¬øøpøø¨P 0xܬԬÔüÔ¬Ô¬ü0H„„„„„„„„„„ü0H„„„„„ÌxXx000x0(xP pøØ¨p hXP0xøè ˆˆˆˆP000000<<00000000000ðð00000000000üüüü000000000000000000 0`0 üÀ`00`ÀüüxxxØ ü0üÀ8l`ø`ðxÀ000000000xxxxxüxüxx0xðxÃ?sÃÇ~8püŒþþŒüpàððà€À€€€àð8øøðàÀ€àð8øøðà€À`àð8øøðà``àð8øøðà€€€€€€€€€€ÀÀ€€€€€€€€€ÀÀ€À`€€€€€€€€ÀÀ``€€€€€€€€ÀÀ`ÀÀ`ðð88ðà0ðààð8€€àð88ðàÀ€àð88ðà€À`àð88ðà `àÀàð88ðà``àð88ðàèð8X˜8ðà€€8øØÀ€8øØ€À`8øØ``8øØÀ€8øØ8ðààððà``8øØ8ðà16x24x!cÆangband-v3.3.2/lib/xtra/font/8x8x.fon0000644000175000017500000000706011651552410016627 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<|ƒ@@t||ý€P ,€É0€FONTDIR8X8XFONTRES 100,96,96:8x8x 6† Leon Marrick, 2005. Freeware. Share and enjoy! ``,0ÿ ‚ 8x8x† Leon Marrick, 2005. Freeware. Share and enjoy! ``,0ÿ ‚ zz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú    " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ÿÿÿÿÿÿÿÿÛÿ·ý¿öß–ýU¯U»Uë€$H@ €@@<<8|||8 vªþ|ªT(~Õ«Õÿ«Õÿ~ÿZÛl(8(P 8lTl*"\zf(@@$$$((þ(þ((|Ð||D¤H$JD0Hh0JL60    l8Ö8l|0 ~00 @@B< ~~  8D8Dšªœ@<$BB~BB|BB|BB|F:@@\bBB|<@@@<:FBB><@@\bBBB0< $@@DX`XD08ì’’’’\bBBBBB>\" >@<|< BBBF:DD((‚’’ªDD((DBBF:<| |   2LUªUªUªUª"x x" 88V (T8T(D(|| $8X400ÿ  80@@08 (Tº|ºT( ¢ljŒ’l|º|l’ @D8F:<>F:<>F:(<>F:$<>F:<>F:~ ˜n<@@@<eangband-v3.3.2/lib/xtra/angband.glade0000644000175000017500000023234211651552410016731 0ustar chriscchrisc GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 7 8 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 6 7 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 5 6 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 4 5 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 3 4 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 2 3 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 1 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 7 7 8 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 6 6 7 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 5 5 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 4 4 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 3 3 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 2 2 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 1 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Main Window True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Windows False tab True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Messages True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Inventory 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Equipment 2 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Monster List 3 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Status 4 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Debug 5 6 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 1 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 2 3 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 3 4 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 4 5 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 5 6 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Extra Windows 1 False tab True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK This space reserved for future options. 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK General 2 False tab True 9 3 True Columns 1 2 True Rows 2 3 True Term True Main 1 2 True Term 1 2 3 True Term 2 3 4 True Term 3 4 5 True Term 4 5 6 True Term 5 6 7 True Term 6 7 8 True Term 7 8 9 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 1 2 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 2 3 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 3 4 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 4 5 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 5 6 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 6 7 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 7 8 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 8 9 True True 80 0 999999 1 10 0 1 2 1 2 True True 80 0 999999 1 10 0 1 2 2 3 True True 80 0 999999 1 10 0 1 2 3 4 True True 80 0 999999 1 10 0 1 2 4 5 True True 80 0 999999 1 10 0 1 2 5 6 True True 80 0 999999 1 10 0 1 2 6 7 True True 80 0 999999 1 10 0 1 2 7 8 True True 80 0 999999 1 10 0 1 2 8 9 3 True Term Size 3 False tab GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Debug True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Status True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Monster List True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Equipment True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Inventory True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Message True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Pick a Font: GTK_WIN_POS_CENTER_ON_PARENT GDK_WINDOW_TYPE_HINT_DIALOG True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 Sans 12 True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-cancel True 0 True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-apply True 0 True True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-ok True 0 True GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK Term-xxx False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK Angband False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _File True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-new True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-open True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-save True True True Save As... True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-quit True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _View True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 2 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 3 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 4 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 7 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Graphics True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK None True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Old True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Adam Bolt True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK David Garvais True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Nomad True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Big Tiles True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Options... True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Debug True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Extra True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Messages True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Inventory True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Equipment True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Monster List True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Status True False True GTK_ICON_SIZE_SMALL_TOOLBAR False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 1 angband-v3.3.2/lib/xtra/graf/0000755000175000017500000000000011651552410015252 5ustar chriscchriscangband-v3.3.2/lib/xtra/graf/16x16.png0000644000175000017500000741275411651552410016571 0ustar chriscchrisc‰PNG  IHDRÀCçÁúHiCCPICC Profilex0Ïú0appl mntrRGB XYZ Ù  acspAPPLapplöÖÓ-appl dscmòdescüogXYZlwtpt€rXYZ”bXYZ¨rTRC¼cprtÌ8chad,gTRC¼bTRC¼mluc enUS&~esES&‚daDK.êdeDE,¨fiFI(ÜfrFU(*itIT(VnlNL(nbNO&ptBR&‚svSE&jaJPRkoKR@zhTWlzhCNÔruRU"¤plPL,ÆYleinen RGB-profiiliGenerisk RGB-profilProfil Générique RVBN‚, RGB 0×0í0Õ0¡0¤0ëu( RGB ‚r_icÏðPerfil RGB GenéricoAllgemeines RGB-Profilfn RGB cÏðe‡NöGenerel RGB-beskrivelseAlgemeen RGB-profielÇ|¼ RGB Õ¸\Ó Ç|Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zu¬s4XYZ óRÏXYZ tM=îÐXYZ (Ÿ¸6curvÍtextCopyright 2007 Apple Inc., all rights reserved.sf32 BÞÿÿó&’ý‘ÿÿû¢ÿÿý£ÜÀlÀ¼ýEkoo pHYs  šœtIMEÛ/4L¢E® IDATx€ïÿôôô...ðððáááìììððððððáááñññáááñññññññññáááRRRììììììïïïìììììììììJJJKkžŽ*(—ûý%%%îîîVòðªííí%%%ÛÛÛïïï4—ÉÊd¬ %%%ïïï@áßÀ!ììì%%%ÛÛÛaaa4±²zª)))éééDàÞ¼ "îîî)))×××ííí%%%KkžŽ*(—ûý%%%îîîVòðªííí%%%ÛÛÛïïïËËË.âìììòñâìììðððqqq4±²zª)))éééDàÞ¼ "îîî)))×××ííí...áááñññððð>>>ÒÒÒÒÒÒáááñññÚÚÚ&&&áááôôôööö555ÕÕÕ ÕÕÕáááôôô+++ìììðððñññ333ÜÜÜÜÜÜìììðððÒÒÒ...ááá ãâ3..ÍÒÒöëÄÃ,-áááñññäääáááôôô5 Ëòó ÕÕÕäää ÜÜÜñññ=Ãïð$$$ÍÍÍÜÜÜñññ333ìììÜÜÜ$$$ïïïììì%%%ïïïììì%%%ïïïÜÜÜðððáááððððððáááDDDïïïÛÛÛ%%%íííïïï$$$íííïïï$$$íííÛÛÛÂÂÂôôôððððððððððððððððððôôô ôôô ôôô ôôô ôôôðððôôôððð€ úúú×××éééæææðððéééðððøøøøøøñññÚÚÚéééêêêñññéééñññùùùùùùäääöööäääìììöööìììööööööÛôôi†êì...Käýý¹ëìßííí%%%KÉââ_ûùÌþÿæÿJëé¬ %%%4ïÄóôêììì%%%4ÕîïBãá67ùQ”ßà3334ò Áóôçîîî)))4Ïèé KçåÞÛôôi†êì...Käýý¹ëìßííí%%%KÉââ_ûùÃõöøøøðïÒþÿçýþñäää ðï"88æÿTðî—ûý3334ò Áóôçîîî)))4Ïèé KçåØ ÚÚÚøøøñññéééÒÒÒÒÒÒááá666 ÝÝÝ÷÷÷ôôô ÿÿÿëëë ÕÕÕ ÕÕÕèèè000333æææþþþðððîîîÜÜÜÜÜÜééé,,,øøøøøøùùù ôêÿë-ëÄÃ+.ÜËË ááá666ùùùÝÝÝððð!!!Îáâ!!!ÕÕÕòñæùúìììúúúIIIööööööÚÚÚ'''ñÍÍÍòñÈÞßñññ333ÔÔÔæææ ääääääæææäääöööööööööáááéééððððððéééðððøøøøøøÒÒÒäää ææææææäääæææøøøøøøÏÏÏøøøúúú úúúñññøøøðððððððððúúú úúúôôô úúúùùùùùùùùùøøøúúúøøøðððâââáááðððñññáááñññðððáááñññðððáááìììðððììììììììììììÛÛÛ ÐÎ02£ÕÖp>=±²Ê666DàÞ†êììììùýþ»íîY'&§ÙÚÛ%%%/Ðά 8××)))åÆÅÌíí]+*ÂÃÄ<<<4ûý5ܬÆÏý02£ÕÖp>=±²Ê666DàÞ†êì ÞÝÛÛÛ%%%ËËË$$$ ÞÝÒþÿ<Å•ÆÏýCEµçè]+*ÂÃÄ<<<-ÉÇ—ûýððð...ÂÂÂááááááÂÂÂÒÒÒðððñññ+++ËËË êêêáááËËË ÚÚÚñññììì$$$ÍÍÍáááÍÍÍáááìììðððáááÿ*ÿÖáã ððð:ñÈ4-£ÑÒðððñññðððôôô&&&ÚÚÚ ÚÚÚ&&&äää 5 Ëää ììì¾¾¾ÒÒÒ¾¾¾òñ=ÃááìììáááÜÜÜ$$$ìììðððìììÜÜÜððð$$$ðððâââáááðððñññáááïïïìììÛÛÛïïïìììïïïÛÛÛ...ïïïìììÒÒÒìììðððâââôôôíííïïïðððñññññññññððð ðððððððððññññññññññññññññññðððäää€ úúúððð$$$ áááéééðððññññññáááéééñññððð333ììì%%% ööö ìììööööööìììîîîü+,÷÷÷¾¼45ÛÛÛïïïÿÿÿ1æåÔ ÝÝÝÔ5Ãõöæææööö àß "#ÛÛÛööö(âàÖîîîÖ*ûúÖøøøþþþ 6 &'ãããÙÙÙ(ÝÛß ÙÙÙÈáâèþç R5ãáÍ#ï±1%ÏÑìþÏ "(ÝÛ Ø# ñÂÜôÔ5Ãõöçýþùù 1íïç¾+ãåü àß×íîùùùéÿ]u:ëÚØÄäÌ' ÖØóïë¼+ÔÒDr ùÇÌÈâúß+ùøÌþÿöööðððùùù...ÊÊÊñññ...éééññññññ÷÷÷+++ÓÓÓÿÿÿ ôôô+++éééÿÿÿ ÿÿÿððð333ììì$$$×××ððð$$$ööö&úùñÿÖ5 »ÑÒìÿ$ü&'ñÈÿìö/ ðñññëêÆÚÚ'ÿØëìööö òòò+++ ùøÿç4-þñüððð=û &úùâöÎÒÒÒ...$$$à9Þa…ß´Îùðððììì%%% þþþ ÜÜÜæææöööìììðððæææáááéééðððñññ+++ïïï$$$  ÛÛÛ äääøøøïïï ìììáááøøø333æææ$$$ÿÿÿîîî öööéééøøøúúúþþþ'''äää%%%îîîøøøñññòòòäää%%%îîî øøøîîîñññøøøùùùñññéééìììøøøðððøøøùùùññññññøøøøøøôôôúúú%%%///ááá>>>ÛÛÛöööúúúöööøøøððð!!!,,,ãããðððìììPPPWWWÄÄÄBBB×××{Á^p IDAT€ úúúøøøöööðððþþþððððððéééêêê'''ÒÒÒùùùñññññññññéééøøøøøøììììììììì öööðððííí%%%Öîîî%%%öööÛÛÛÞ%%%öööïïïÃõöON¾××ììì%%%ßõõîîî%%%îîîðððÞ%%%îîîÖY'&îîî333ð ìììÜÜÜç)))õõõÙÙÙÈáâp>=ÇâúÚõ42ûäúüäç%9íæÿÞôÝÞ*÷ß 8éìïïïÃõöON¶ÏÏùùÞö'#ôûèüèÿ*ü á÷ññùù 1õ÷ðððéÿ555,ï¿óì#+) ?W ÚªÊ/ãæÿÕëÔð$<絺 8ô÷)íííÌþÿp>=—°°ÚÚÚìììùùùððð&&&êêê...ÂÂÂ'''âââêêê'''ÒÒÒâââûûû ÷÷÷ööö!!!ììì+++ËËË %%%ååå ììì%%%áááêêê ñññððð$$$ÍÍÍæææðððØìÄóÍàÕèâ%ëê1êÿê% 3üçô Ëâö'''ÁÔÕÿýâûòòò:ÕÕÕ%ãÔí ä÷ø×××ÿÖ 3åæééêÿ5 /AÍÍÍ#! $9õ§¦¯ûèÒèé,,,ÜÜÜøøøìììììì%%%äää---æææééé,,,×××ðððþþþððððððéééêêê'''îîî÷÷÷ïïïÿÿÿïïï $$$æææ...ÿÿÿäääööö%%%ÏÏÏôôô äääøøø$$$ÿÿÿæææíííøøøìììÏÏÏúúúðððæææööö%%%äääïïïöööðððÙÙÙúúúøøø æææööö%%%äääîîî÷÷÷ïïï×××ùùùøøøøøøñññðððúúúùùùùùùñññðððôôôñññùùùùùùùùùññññññøøø666áááøøø>>>ñññôôôöööæææ ááááááúúú 444ÞÞÞõõõ???åååúúúðððíííñññèèè÷÷÷þþþìììPPPÏÏÏìììPPPýýýñññðððúúú ÷÷÷ÃÃÃíííøøø€ úúúééé$$$þþþ×××ñññééé×××øøøñññéééÚÚÚðððéééÚÚÚñññöööäääöööööö äääþþþ  äää äääïïï...÷÷÷%%%ÑÑÑ‹YX£ÕÖøøø äää äääööö%%%ÞÞÞa/.»íî$$$ ÙÙÙ íííàààäää...÷÷÷)))ÑÑÑyGFµçèð ùüäçüãØíW;øòÛí 93ÅÇâ‹YX£ÕÖäääñúüèÿýçÖì*é á Gkæòõõ åçþ555ÛÛÛ...ù ð9"9Ú«âW<-D èPP5³´ÏyGFµçè½½½þþþùùùñññùùùðððáááùùùøøøéééðððñññìììûûû÷÷÷ õõõ÷÷÷öööæææ úúú÷÷÷ðððÿÿÿöööðððññññññçççøøøþþþéééñññöööâã÷ ùùëùùù$üýëÿãÔüü åúÕýþÒÿÊâ ðððñññþþþúúúúûþþþðððO4 ¾Õéèèè÷÷÷òçØëìúúú÷÷÷éêÿõõã64.åçþ ÏåÔÐÑåNJÊÌÒóÌ#Ýö!Òèéñññîîîæææ###ÔÔÔþþþðððøøøæææ ÔÔÔ$$$+++øøøöööééé×××ñññéééáááäää&&&ÿÿÿÒÒÒììì÷÷÷äää ÒÒÒ%%%&&&÷÷÷ÃÃÃ%%% îîîøøøæææøøø ÜÜÜéééúúúûûû"""îîîöööäääöööáááåååòòòëëë/// îîî÷÷÷äää÷÷÷ ÛÛÛâââøøøùùùùùùùùùùùùùùùñññùùùùùùðððøøøøøøøøøøøøøøøùùùùùùðððøøøøøøôôôùùùêêêøøøéééøøøññññññ555******ÆÆÆÛÛÛ%%%ñññúúúéééÿÿÿ000ùùùñññ:::******ÃÃÃ÷÷÷000ëëëßßßøøø444îîîñññ333)))///´´´ííí,,,ñññøøø€ úúú333öööþþþðððâââøøøðððþþþýýýùùùñññðððùùùñññ---îîîìììðððöööììì `üú±ãäÚÚÚ&&&VòðÂôõîîîh5)))¶ÏÏ£¼½øøø@áßÌüýæææ@áßÌüýöööJëé*ûúÁÚÛöööÄÝÝþþþi¹ëìÝÝÝ$$$9ÕÓÁóô îîîWóñ+ùø½Ö×þþþ®ÇÇööö`üú±ãäÚÚÚ(ø6ëçþÙ=: æÿüåý Q«Â¯ôö£¼½øøøèçá÷øøøøéÿ=3ß(R ÝÊùüèþ#7ÃÆ õ÷ÞÞÞøøøq ¹ëìÝÝÝîÇ´ÄÆâ=:%V6Oòޝ$XT§¦­ýýÿ®ÇÇöööÃÃÃðððùùùðððôôôéééååå%%%ÙÙÙ ööö÷÷÷ööö ðððõõõ ÿÿÿ LLLÈÈÈñññññññññéééâââ+++·ÊËððð,-îíï éÿÿãÓãýë ÙÙÙôôô!!!'ÿæêþî úèèèø ïìíú úúúTTTÏÏÏüþ.í&$ÏåÔ64.ÏåÔéêþ---öööììì%%%öööööö ìììïïïöööðððøøøððð...øøøÿÿÿïïï $$$øøøøøø ïïïÿÿÿííí¿¿¿öööüüüýýýþþþæææîîîîîîæææîîîßßßööößßßêêêøøøúúúûûûôôôéééññññññçççñññâââøøøâââéééúúúöööûûûýýýäääîîîîîîäääîîîÞÞÞöööÞÞÞéééùùùøøøÚÚÚøøøøøøøøøñññññññññðððøøøâââøøøôôôêêêÿÿÿúúúúúúúúúòòòòòòòòòúúúúúúúúúðððúúúðððøøøññññññâââøøøùùùñññêêêùùùáááøøøùùùðððùùù333ÏÏÏ555çççñññ%%%ñññôôô ññññññðððéééáááæææ,,,áááñññááá%%%... ÊÊÊAAAßßßñññøøø€ úúú øøøøøøééé'''éééþþþìììðððþþþéééùùùùùùééééééññññññööööööööö öööïïïììì= ç¨ÚÛyGFäýýöööÌþÿ5¹ÛÛÛr ãææêÄóôY'&ïîîîÖ*ûúÏÛÛÛTõóñ#$®àág54ò õõõÕ+ùøÐ×××`üúç»êÓW;øÇâù":ÎýË2ÄÄË, r Èäåùçýþ8Kïñ#6ÝÊù 2âãýÙÝ &úù8ñ#$))¯ßÇW<926ÿÎÊáÉ2ÄÄË4 `üú¯áâçççììì%%%ùùùéééôôô 666âââþþþ'''øøøéééæææûûûøøøððð000åååûûû%%%÷÷÷îîîêêê'''éééñññ,,,æææþþþìììçççììì53 ëæéýï 2ýééÿÿýë +5 éÿ¾¾¾ððð!!!Øëìî+ú äëþÿúû!úùòôôô'''îîîùùù'''ñïÆ!2òüçé 1ñê(åæééêÿ=ñ$$$øøøööööööæææ æææ øøøïïïìììöööøøøøøøééééééööööööððð øøøøøøäää äää ÷÷÷íííïïïÿÿÿÉÉÉûûûííí222ðððøøøøøøéééÙÙÙúúúûûûõõõ***ñññùùùùùùêêêÝÝÝûûûæææ>>>ìììööööööæææ$$$ÈÈÈøøøííí øøøðððøøøõõõ÷÷÷úúúõõõúúú úúú úúúûûûÿÿÿâââñññùùùâââÿÿÿùùù666ÙÙÙùùùîîîýýýÏÏÏDDD áááñññøøøùùùñññùùù"""èèèùùù...+++!!!ËËËîîîïïïÊÊÊHHH$$$ßßßøøøüþK” IDAT€ úúúøøøøøøðððøøøþþþðððþþþáááðððêêêùùùùùùñññùùùñññáááñññ ööööööìììöööìììììììììÞg54(ÝÛ¨ÚÛ666ÛôôÊÊÊ...¨ÚÛÑÑÑ%%%îîîÛÛÛ56±áâOØÖÄóô%%%æÿÛÛÛ%%%ÄóôÞÞÞîîîððð34ßT"!ÔÒ®àá<<<æÿÄÄÄ333®àáÑÑÑ:::ôôôÓÓÓBC®àág54(ÝÛ»é»=;æÝÇæÄÆåüäë- <äääÛÛÛ56Ìâã%%% àßçýþ'#ôáãåòõ#6åëÞÍæöööððð #$çT"!ÔÒ°Þ°vxqÊáÉÚ«â"9þÚ«â SãããÜÜÜBC†††òòò÷÷÷///ñññþþþøøø'''ññññññðððÄÄÄ ûûûõõõ***ðððûûû ÷÷÷%%%ððð ññññññßßßñññøøø$$$öööþþþööööööììì¶¶¶ÿýâ73âÑûù<4 âæð4íìêÿë-ðððÙÙÙ ï ôãäøú4- æéïæùúèèèëþÿðððûûûòòòí /,ÊÍæFlW\“«8òËåûB'óöìììöööööööööìììööö%%%ÑÑÑÜÜÜìììðððøøøøøøðððøøøæææþþþáááððð øøøøøøïïï øøø)))ÑÑÑÿÿÿÛÛÛïïïÑÑÑûûûáááúúúûûûãããûûû  çççøøøøøøõõõÿÿÿøøøøøøøøøôôôûûûúúúúúúûûûÿÿÿúúú úúúúúú úúúûûûúúúðððõõõùùùññññññùùùíííÝÝÝPPPööö%%%ÙÙÙøøøøøø áááååå%%%ùùùñññðððéééòòòÿÿÿSSS$$$$$$¬¬¬¼¼¼AAAÿÿÿîîî ßßßøøø€ úúúéééðððøøøðððððððððÙÙÙéééñññùùùñññññññññöööööö ìììöööììììììììì...¶ÏÏ5çÓÓÓööö...ÊÊÊöööäääJJJK¥¾¾äääJJJKÛôôÁÚÛ*ûúêäääîîî%%%ÛÛÛîîîððð5554ÁÚÛððð555422Ïèé"ðïñ#$ÐÐÐõõõ333ÄÄÄõõõæææ```!ïîÝööããã;;;4í¶ÏÏ5 9øÇ¿ûå :FÞÆÏæÿæÿþ 9*3¤¿ÚäääJJJKÊããäääùù*üøÎÔûèëââïæþê(ÓÕìøøø$$$333½Ö×+ùø 9Ú©¯ûäþ 93ÚªÊ"9½Ç 83ªÄßæææMMM4­ÆÆþþþÒÒÒøøø>>>ÙÙÙ'''ÒÒÒñññâââ÷÷÷ûûûÛÛÛûûû555áááÿÿÿ%%%ÕÕÕ ôôôäää,,,×××ùùù333ßßßÜÜÜðððöööðððÿÿÿ!û1üèþ<4ëüçòéÿÿúÕý,øøøâââêêêÿ 'ÿýëÿ4-þíýë Üïð ÷÷÷ûûû"""øù.9Þ)8ò8úþâ´Bs›«ÃÚпîâââßßßøøøþþþæææìììöööøøøÑÑÑììììììßßßéééðððøøøæææððððððöööäääïïïøøø÷÷÷ÑÑÑïïïïïïÕÕÕÿÿÿûûûéééøøøâââééééééééééééøøøâââøøøúúúûûûüüüéééùùùáááééééééééééééùùùáááúúú ÿÿÿûûû çççööößßßççççççççççççööößßßùùùøøøíííûûûÿÿÿúúúúúúúúúúúúúúúúúúúúúöööøøøúúú õõõûûûûûûûûûûûûõõõûûûûûûûûûõõõûûû úúúøøøõõõ÷÷÷þþþñññññññññøøøñññøøøøøøìììûûû øøøDDDöööøøøöööáááøøøøøøçççööö¶¶¶DDD÷÷÷ùùùøøøéééøøøøøøñññÍÍÍ...îîî$$$åååÑÑÑëëë+++öööæææ øøø¾¾¾BBB×××€ úúú'''éééáááêêêøøø,,,öööðððáááðððáááéééáááøøøñññ&&&ùùùñññáááñññááá333ööööööìììðððþþþ%%%øøøììììììììììììÛÛÛ888¹ëìååå...ÊÊÊ666^,+Dù÷”ÆÇÛôô ÉÉÉÛôôËËË---Äóôîîî%%%ÛÛÛ%%%G0êè´ãäÜõõÞÞÞÜõõõõõQQQéÙÙÙFFFààà***I:ïí¤Ö×01³³³äýý¿¿¿888ÌþÿùÈáø$:ÄÅã#:ôÝÇæâãùî ÉÉÉÛôôÔÔÔçýþúÝö"*üÙÝ æÿçþëøÏèûèùæææöööäää;;;Ó ðÉáå$:ÄÅã$:åé :4Á©Éù+ÈÈÈäýýûûûøøøéééôôôñññøøøñññ...ñññ'''âââøøø÷÷÷ÿÿÿðððüüüõõõûûûððð+++ñññ%%%ååå÷÷÷;;;þþþéééññññññùùùööö$$$öööæææþþþøøøòñÿìÌÔüüóâæúâæú8 üùèû&;øøøÓÓÓúúúÿçËóðõæêûùö$%ÝÝÝ+++ ;;;ööö Þ 3\wƒÆÃ¡çÿÿûåââò»üäðÝÎ++ßßßBBBæææþþþÜÜÜ---ÔÔÔ---øøøìììÜÜÜìììÜÜÜéééááááááðððáááðððááá555äääÛÛÛ...ÒÒÒ...÷÷÷ïïïÛÛÛïïïÛÛÛáááúúúûûûííí"""ñññùùùñññðððúúúûûûõõõðððøøøðððôôôúúúûûûüüüñññùùùñññáááøøøøøøõõõ úúú úúúûûû÷÷÷úúúúúúûûû ûûû ûûû ûûû ûûûÿÿÿíííûûûÿÿÿðððÿÿÿéééööööööîîîîîîDDD222ñññ ÂÂÂøøøùùùñññññññññ///éééùùùøøøéééåååîîî ÚÚÚ]]]AAAîîî$$$666¾¾¾øøø€ úúúáááøøøöööéééðððêêêáááñññùùùéééñññ ìììþþþøøøöööööö ììì `üú"ðï¯áâïïïf43£ÕÖ±ãäÛÛÛ888ÉÉÉJJJîîîöööJëéèçÆö÷öööG»íîÌüýððð---ÞÞÞ555îîî&&&(((åä ¿½»íî4µçè¹ëì ÖÖÖ222ìììøøø VòðæÍýæâãýQ!4ÎþæÜÈ íÎýê$'QÉÉÉJJJîîîæææþþþòñüèÿñíïú÷ÐìÓþê1æææ$$$öööDàÞæÍýæXY8ÅÅãQ!4;QÀ©Å":":÷ù.ÈÈÈMMMììì¶¶¶ééé555áááñññðððêêêÙÙÙâââùùùÝÝÝððð***æææõõõÿÿÿööö ìììáááåååúúú ééé+++çççññññññðððßßßæææøøøóÌËÜðð, æêþæê  üâçÒéýøøøñññðððúúúØëìæùúæúæêùæêÜððÝÝÝþþþöööùùù>;!þ«âãûÉÍù)ÝÏýñâçØìÄ 4ÈÈÈþþþÜÜÜ$$$ øøøæææþþþ ìììðððáááéééððð ÛÛÛ%%% ÷÷÷äää ïïï ×××úúúûûûùùùùùùñññúúúûûûùùùùùùòòòõõõõõõ"""øøøøøøùùùøøøôôôûûûúúú ôôôûûûúúúûûûûûû ööö ööö öööäääûûûôôôôôôôôôûûûøøøééé+++ öööîîî ýýýööö öööáááøøøùùùáááéééùùùùùùñññååå+++ ääääääÿÿÿFFFôôô¢¢¢ïïïåååßßßøøøBbV IDAT€ úúúðððáááøøøððððððéééøøøñññáááùùùññññññéééùùù+++ ììììììööö ììììììööööööööö...ÈÈÈ56ÞyGFö‘ªªøøø666ÉÉÉTõóû+,p>=‘ªª&&&øøøÜÜÜ34éöööY'&ù±ÊËþþþ%%%ÞÞÞ.O±ÊË$$$¼¼¼01àþþþT"!ù´ÍÍäää<<<ÈÈÈ»¹676™²³$$$ ÈÈÈ56Þíïo?Vþ«ÃÊÏÔ-E®Éó@ä @ e2«Æ&&&ìììððð #$ûööö%%%âÙÝ Ýßö #$×î. òÓÕì888ÊÊÊBCêôö+û/þ«ÃÊÃÆù";!÷ÏýÚðñâââøøøæææìììæææþþþððð$$$æææþþþæææéééðððéééñññéééäääïïïÿÿÿÿÿÿäääììì%%%äääÏÏÏøøøðððøøøúúúööö úúúþþþÿÿÿùùùøøøúúúûûûúúúûûûþþþõõõ öööööö ûûûòòò<<<öööîîî¶¶¶ûûûüüüöööøøøÈÈÈäääñññ///ÖÖÖ øøøøøøìììûûû ñññññññññÚÚÚøøøää䬬¬úúúüüüåååäääôôôáááÓÓÓ333×××€ úúúøøøðððþþþáááöööñññáááÏÏÏùùùñññáááùùùðððáááöööììììììîîî öööììì WóñÞÛÛÛÝÝÝ...T"!ÛôõÊÊÊÌþÿ ´²45ïïïöööBãáéÛÛÛîîî= è×××Ö ÖÕ "#ööö&&&BÞÜê×××ÙÙÙ...@ äýýÉÉÉÕ ÿ žBCëëë WóñÞÛÛÛÝÝÝ< "8üäþºÓÓÌþÿæö³ã5ãåþþþèçû ìììæææ&úù á÷Úðññ á÷üèÿåçþ...BÞÜê×××ÙÙÙ38òÛõÁÚÛÕ Ü ö³ã5êìæææááá...ñññáááññññññøøøùùùBBBÝÝÝêêê&&&òòòèèè ôôôþþþôôô÷÷÷÷÷÷:::áááøøøþþþéééððððððþþþ555íííññññññÕèééêÿ%&ôóêÿë,ùùùBBBËËËþþþúúú õõõ ìììòòòèèèííí...ððð333ÐÐÐÖØïéééÇÉàøøøDDDÞÞÞöööìììÜÜÜööö þþþððð$$$ÜÜÜ×××øøøðððáááñññáááöööøøøïïïÿÿÿÛÛÛøøø ììì%%%ÛÛÛÅÅÅðððððððððøøøðððøøøúúúöööÿÿÿúúúúúúúúúúúúðððõõõÿÿÿøøøúúúðððüüüáááùùùññññññøøøÿÿÿÿÿÿúúúÿÿÿ ÿÿÿ þþþááááááááá%%%ðððòòòÑÑÑ*** ìììÍÍÍëëëñññðððúúúôôô õõõõõõõõõüüüñññÓÓÓõõõ øøøÝÝÝÛÛÛííí,,,ãããëëëÝÝÝïïïÈÈÈÓÓÓ"""îîîééé€ úúú'''éééðððþþþðððéééþþþéééññññññééé$$$öööìììööö ìììööööööäääÞîîîWóñ§ÙÚööö...Éââ%%%îîîÒÒÒû+,ËËËÞîîîBãáÆö÷øøø###Õîïýýý%%%îîîæææùæææçìììBÞܱãäøøø222Ïèé)))ìììÓÓÓ45½½½ÞîîîWóñ§ÙÚööö77Èãþ%%%îîîÁÚÛû+,#ËËËùöööèçá÷ø #$ãåüöööá÷øùîîîçìììBÞܱãäøøø+DDÏé)))))ìììÌåå451ßßßêêêâââøøøâââùùùêêêþþþüüüìììäää÷÷÷åååøøøììì$$$ððððððþþþæææðððþþþéééâââøøøâââ$ñòêêêþþþååå ðððõõõ***÷÷÷÷÷÷ððð âââæææøøøñññ333ööößßß'''ðððéééæææìììþþþìììæææþþþéééððððððééé%%%äääïïïÿÿÿïïïäääÿÿÿÏÏÏðððøøøðððøøøøøøúúúúúú úúúþþþ øøøùùùùùùøøøúúúðððþþþþþþðððøøøñññúúú÷÷÷ßßßÙÙÙúúú÷÷÷ñññúúúúúúúúúûûûéééÿÿÿáááúúúúúúÞÞÞçççùùùñññèt IDATð€$$$ÿôôôðððôôôðððôôôðððôôôðððôôôðððôôôðððôôô ôôôðððý,û3 )ó×ÿüÍýÔý,ýÔôôô 8û3 ) à°íó÷ñÈ+++ñññâââõ Pø9;/ÉÅÑ7ýÇ)þÎññññññáááý,û3 )ó×ÿüÍýÔý,ýÔôôô 8û3 ) à°íó÷ñÈ+++ñññæAø9;/ÉÅÑ7ýÇï¿ññññññðððððððððäääi;ÂðññññññMö³á Mö³á >ç£Ñú ý,ý,û3üÍó×ÿüÍû3ý,û3ý,ý, û3üÍ à°íóû3 ñññõ Põ PýÇÅÑ7ýÇ;/Éø9×2æAñññý,ý,û3üÍó×ÿüÍû3ý,ýÔý,ý, û3üÍ à°íóû3 ñññõ PæAýÇóÏþýÇ;/É&æAõ Pñññððððððððð ÂðzDïMö>çMöÂðMö³á >çÂðððð) 5 ôôô‚#!]/ ]/ Möý,ýÔý,û3 )û3üÍû3û3ýÔý, ý,û3õ P äüÍ æAï¿×232;/ÉýÇø9ÍÎþýÇø9æAý,ýÔý,û3 )û3üÍýÔý,ýÔý, ý,û3õ P äüÍ æA à°æA32;/ÉÚÿø9ÍÎþÚÿø9æAðððMö]/Mö>ç]/ôôô ôôôñññ†¼<4>çzDï<4>ç<4‰SþMö‰Sþñññðððôôôôôôðððôôôððððððôôô>>>êêêêêêêêêêêêêêêôôôôôô>>>+++ööööööööööööööö+++ðððBBBðððððððððððððððääääääBBBðððX×þÿ ×þÿ¸'$ìî))<4)ôôô5 )<45 ôôôMöMö<4Möñññû3ù¡øÓÌû3üÍù¡ý,ýÔ û3ù¡øÓÌè÷Oý,ôôô ñññÅÑ7ø9ÍÎþø9ß:ø9ýÇ)þÎû3ù¡øÓÌý,ýÔû3ý,ýÔ û3ù¡øÓÌè÷Oý,ôôô ñññóÏþ&ÍÎþ&.þÇ&ýÇ)þΣÑú>ç‰SþÂðñññ³á MöMö³á ðððôôôðððääääääððð++++++äääñññ†¼zDïÂð<4†¼>çÄÌø³á ÄÌø†¼ynÂð3NØ¡ IDAT€úúúøøøúúúøøøúúúðððððððððøøøôôôðððûûûÿÿÿöööõõõõõõÿÿÿúúúöööûûûöööûûûûûûöööððððððøøøêêê÷÷÷öööõõõííí÷÷÷ðððøøø%%%ñññ  ññññññúúúùùùþþþ òòòøøø666ööö%%%îîîéééøøøXÔýþX¨úü)ìÿúúú úúú úúú^ Úôôô qõù“2 ½íúúúñññL éÿùùù¸'$Wèës¿ïðøøøìÿ]/ûëþìÿìÿŠl•²ô)pa þÿÒéýúúúò]/ñàóôò¤ ‡Šë /pa þÿÆÝñÚñMöÚñÚñ‚d ºüMö<4¼×øøøÿêý,û3 )ûëüþòTýãüÍû3ýû»úIýÿêúúúúúú ýÑì ™ ù°ï mýãþçýÔý,ðúúú$ö×232ëæã×sþãÛWð/Ýí9ûªø9è6ç´øøøÿêý,û3 )ûëüþçû3üÍýÔý,û»úIýÿêúúúúúú ýÑý,þçû3üÍýÔý,ðúúúÿçæA32Ôçÿ&BéÿÚÿø9è6ç´øøøézDïÄÌøáø ééékL ËæÂÙîŠTÿ•ÇøøøúúúáááôôôòòòÝÝÝáááúúú>ç¤ÖzDïÄÌøáø áø [<üËæáø ·~ù‡’îîðÒéþøøø€úúúøøøúúúøøøôôôôôôúúúôôôôôôúúúðððìììþþþìììúúúþþþôôôþþþìììþþþøøøððð ööö ûûûûûûõõõõõõ úúúööö ööö ûûûûûûûûûðððêêêõõõ ööö ûûûûûûõõõíííøøøåååëëëëëëþþþìììúúúúúúþþþìììëëëëëëøøøúúúòòòòòòúúúôôôúúúúúúôôôúúúòòòòòòøøøáááñññññññññâââøøøñññâââùùùùùùøøø)ìÿÔýþ ¹ûý“2 ‹äùìÿ ¹ûýúúúúúú XÚÔýþ ¿“2 cÖìúúú½í“2 ½íúúúEéÿÓééEéÿ{rêíñññ¿ïð¸'$¤íîøøøûëþpa ´Ïù.ÝÑúìÿ™c81ÄÌø£Ñúúúúûëþ²Ó™œýôôô2ÿ ã×ò™cz£ £“ö£ÑúúúúÚñ‰Sþ¼×ó ö÷é‚L÷w­øøøý,û3ù¡ûëüû3üÍÿýô:ÿýô:ÿýýû»úIýÑúúú ø_ýÑý,ÿýòTê VýàÿýÔôôô úúúß :ççÿ ÿýÇ ÿðñé!ûÆüÿä71æãéþËñññý,û3ù¡ûëü-èëÿ*êû3ýû»úIýÑúúú ø_ýÑý,-èëÿ*êÿýÔôôô úúúæAççÿÚÿü/éÿí71æãé( ÚùùùùùùFï•ÇcDÃÞ N ÷¤¿ê™cÄÌø'ûÚñòòò úúúáááððð%%%ÝÝÝi;ÂÙî÷÷÷úúú[-Òéþ'û[<üÄÌø~§:¢¥ð>ç[T¥Á¼·!…vÚâæü'ûÒéýôôôôôôöööôôô ôôô ööööööööööööðððôôôööö ôôô ôôô êêê ôôôööö öööêêê ðððôôôööö öööôôôööööööôôôöööööö ÚÚÚöööööööööôôôööööööôôôööööööÚÚÚêêêáááññññññáááññññññáááËËËððð/)qõù“2 ÅÔúš÷ú  7)ôôôqõù“2 ÅÔúôôô–Ð÷  6=Ãïð®GÊýþñññ”ùû¸'$×þÿgò]/=: ­›™cÄÌøgò£Ñúôôô×þÿ%+íi;Br²Ó™cÄÌø%+í—Åîôôôw­>ç=: ynzDïÄÌøw­û3üÍø_û3ô:û3ô: úÆô: úÆüÍû3ø_ù¡ø_ø_üÍø_ô: úÆùÇ úÆ-4ï mø_k 3232ýÇø9!ûÆß:Âr;/É Aû3üÍø_*Öþÿ*ÖþÿüÍû3ø_ù¡ø_ø_üÍø_*Öþÿ*Öþÿø_k 3232Úÿ&Ñþÿ;/Éý2ðððáááá8ððð†¼zDïÑÿ(ÄÌø™cÄÌø£ÑúMöðððôôô ÕÕÕôôôááá...áááJJJ³á ÕÕÕ³á ÂðÄÌøÂðDIß·~ùÑÿ(ÃÆö·~ù‚YÆÂð<4³á €úúúøøø)èàôúúúôÕÖêøøøôôôöööûûû öööûûûÿÿÿööö ôôôúúúööööööûûû ööö ööö ðððìììúúúöööûûû ðððûûûÿÿÿöööäääþþþêêê õõõûûû ûûûõõõúúúööö õõõûûû ûûûûûû ÚÚÚ õõõûûû ûûûõõõììì ÿÿÿððð öööûûûûûûêêêÿÿÿððð ööö öööûûûûûû ööö÷÷÷ðððüüüìììþþþøøøôôôþþþåååþþþêêê øøøcüc´æúÀüþìÿÔýþúúúúúúL-úìÿi ´æúÀüþúúúòÈñòu=þèþAu=ÅÍú¨îïùùùéÿéÚðñøøø)…b[TÃÆöI€íÝÑú½èýúúú)…b`Œ ¾ŽûFdðÝÑú½èýôôôMö[<ü[TÃÆöhŸ îð³á ðÿW )÷îô:ýãê V úÆô:ÿýüÍþ -1úì 6 )÷î )ëôSð9ð9ýäúôï úÆ )úì%)öï/%HÍÎþø9ãéÿäÛW2áë/äÆß: 3;ÌÅãé$0æÜÖ. )÷îþçû3îýæ*Öþÿ*ëÿû3üÍþ -1úì 6 )÷î )÷îîýæ*Þ+3&ìçëÿû3 )úì%)öï/%HÍÎþ&úèÿíBéÿ/éÿ 2ÅÑ7ãé$0æôßßU'þôÃÚî‘[îðâæüT5ô[T¦¯óÂðáø N ÷ÚñøøøþþþéééFïÃÚîìììþþþúúú[-[<üîðôôýÿsUú$V-Áªâ[T†¹zDïâæü[T¬É ñññI† ì IDAT€êêêøøøúúúööö!!!þþþúúúððð...+++ýýýñññøøøôôôðððáõûûû***ñññúúú ðððûûûûûû!!!òòòðððâââÞßóûûûUUU éééøøøððð ûûûûûû úúú úúúööö ööö öööûûûþþþððð ûûûûûû òòòøøøÿÿÿûûûðððûûû úúúûûûðððûûûþþþÿÿÿûûûðððûûû þþþôôôöööûûûõõõÿÿÿöööûûûûûûûûûððððððõõõûûûõõõõõõûûûõõõûûûõõõøøøHøû¹ûýg/1ñÔýþýÿÿìÿúúúJ‹äù¹ûýg/1ñÚúúúúúúòúúúW$ pÓë¸çè$øÊýþU Îþÿùùùùùù&Úðñøøø)I.VK gòòáúÝÑú×þÿ™cÝÑúìÿúúú5 I.VK gòðÅýÝÑú×þÿ™cã׿ùúFï<4†¼ãÑëîð³á ‰Sþ¼×ùøõ÷îüÍþýãýãô:ýäú úÆô:ø7ýãúì )ÿèÍ÷îüÍ÷îúýäð9ø÷ª&äÿèÍ÷î ±îç' ±))ÍÎþÿäüüþãáë/âÑÿð!ûÆæã;/ÉÅÑ7æ°÷îüÍþþç-èëÿÖþÿû3üÍ-4úìúì )ÿèÍ÷îüÍ÷îÿèÍ-èëÿëçÖþÿû3üÍ÷î ±îç' ±))ÍÎþíéÿÑþÿ/éÿúèÿé;/ÉÅÑ7ú߬ñ[<ü¬ÇñÄß Úñ'û[TÃÆöâæüô[<üâæü<4 ö÷âù ìììÝÝÝøøø7 àÑÿ(ùùùøøøâù ¼×cD¤Ö˜výÿÄÌøBp1ûÇØâãû¦¯ó[<üÄÌøynÃÆöîðÒéý€ôôôûûû÷÷÷÷÷÷øøøúúúööö÷÷÷ðððþþþþþþúúúðððêêê÷÷÷çççøøøñññøøøôôôõ @ áôõÿ òÙì úúú éÿ@ áôõÿùøþþþúúúðððü+<#ÞßóAðéééíùùùøøøôôôúúúûûûûûûûûû úúúöööûûûûûû ðððìììúúúûûûûûûûûû øøøõõõûûû úúúûûûûûûþþþõõõûûûøøøúúúûûûÿÿÿúúúûûûøøøõõõøøøL-àéüìÿíÿøûÔýþXÔýþìÿúúúJàéüìÿíÿøûÔýþXÎ÷øòôôôùùù$øÚðñA™ßà¿ïðEéÿùùù&Úðñøøø)4-£Ñú´Ïùûëþ81üýÿÒéýÝÑú4-Òéýúúú5 4-£Ñú¨Ãíûëþ81üýÿÒéýÝÑú4-ØïúúúMöôÂð´Ïúùùù'ûâæüé´ÏúMöÚñú÷âýû3üÍþô: úÆú úÆúú úÆýã )úìå¡öóÞû3üÍÿýúýäýäýä&äçÝ9ÿýðé½çäääì)þÎìÿäÛWþãðñé!ûÆýÇÿäççÿî£òïÛýû3üÍëÿ*Öþÿëÿþçû3úìù¡ü0å¡öóÞû3üÍëÿ*Öþÿëÿþçû3ðé½çäää ôôó !)þÎìí/ÑþÿÚÿÿäççÿî£ñññ ö÷âù ððð[<ü¦¯ó³å$T5ôâæüâæü¤ÖÒéþðððúúúúúú÷÷÷ôôô'''ÃÚîñññáááñññøøøøøøôôôúúúMöîð†¹ÃÞ ˜v…vÚýÿBs2Á­ãâæü†¹îð³á øøø€ôôôúúú ððððððøøøøøøúúúöööþþþôôôþþþôôôòòòúúúðððìììúúú:::ùùùøøøêêêééééééñññøøø èà !ùàÜðýì úúú ôôôíþäô  õôêìíúúúúëÿ ä÷ó5#ô Þéêÿñòùùùøøøôôôöööûûû  úúú úúúûûû ûûû ûûû ðððôôôöööõõõ  úúú øøø õõõúúúûûû õõõ øøøúúúûûûúúúûûû øøøõõõ øøøàéüf ¹ûýcâýþìÿÔýþúúú ôôôæïf ¹ûýcâýþìÿÔýþúúú úúú 6Îþÿ: ÚðñÚðñùùùéÿùùùøøøìÿÒéý)I.VK =: ýÿþÿ½èýÒéý)ìÿúúúòÆÝñúúú5 I.VK Brýáþÿ½èýÒéý)æùúÚñÚñùùùMö'û<4=: ýÿîðéÒéþMöÚñøøøÿêýýÔü0 ù°òT úÆô: úÆýãüÍþúìù¡úúúðýýÔýÑ*éãýãúéãýã )úì ×ììì øàß :ø9ûªÛW!ûÆþãþãýÇ)þÎêêêøøøÿêýýÔÿêÿÖþÿ*æ3üÍþü0ù¡úúúðýýÔÿêÿÖþÿ*ëÿþçþ ×ììì$ö×2&ÚÿéÿéÿéÿÚÿ)þÎêêêøøøøøøÒéýU'þâù ‚L÷ÄÌøÑÿ(/Øâæü<4…·ökL ´Ïúðððúúúëëë%%%÷÷÷666ÂÂÂäääïïïååå%%%ñññúúúÚñËæôô¯.…vÚÑÿ(6ð£“ßyn†¹[<ü="ø•Çñññ€øøøøøøúúúúúúúúúñññùùùøøøì ì úúúúúúúúúúûûúúûùùùô óùùùñòøøøÿÿÿ ÿÿÿ úúúúúúöööþþþÿÿÿ÷÷÷ þþþúúúðððøøø õõõ úúúööö ûûû õõõðððøøøúúúûûû úúúûûû öööøøøõõõ øøøìÿÔýþ¹ûý1 Fòâýþìÿ)ìÿúúúúúú ìÿÔýþ¹ûý1 Fòâýþàóô )àóôéÿ: ¸çèÎþÿ?$ø ÚðñL ÓééøøøìÿkL ŸógòÒéý]/ÒéýìÿúúúúúúòkL ŸóøgòÒéý]/ÆÝñæùú úúúÚñcDÄÌøýÿw­é>çÚñÚñøøøúIýþçû3 ù°òT úÆüÍþç-4úìù¡ý,ÿêúúúúúúüùä 2ÿüêæþüÍÿýüÍþçóÛ® ×úúú øàó !ÛWì:)øÛWþãýÇüÿä32ççÿðØùùùøøøÿêý,ÿëÿëÿû3îýæþçýÔü0ù¡ý,ÿêúúúúúúüùä 2ÿëÿëÿû3îýæ÷ñÈ ×úúúùùùïìí&ÚÿBéÿÚÿí32ççÿðØùùùøøøé‚L÷ÄÌøÚñô³á ¬Çñ™c†¼éééúúú ÒÒÒþþþååå+++ñññìììMöô<4£“ßì[TÄÉ÷†¹·~ùâãû†¼FïÒéþøøø~Ul IDAT ôôô ðððððð ôôô  ðððôôô&&& ððð ööö ööö ööö¨úüXmÎöqõù/XX×þÿôôô¨úü mÎöqõùj0 ›X×þÿñññìî‚#!ñññCªÙìîq6‚#!L ´àá™cŸó×þÿ£Ñú™cŸó×þÿôôô—Åî ôôô‰SþÄÌø³á ñññ³á ý,ù¡ýÔüÍö“ )ýÔøÓÌù¡ý,ýÔ ÷ñÈýÔ )ýÔ 8ôôôôôôæA\*)ø/ýÇ32ÍÎþñññý,ýÔýÔý,ù¡ý,ýÔ ÷ñÈýÔ-4ýÔ 8ôôôôôôñññæAñññ32ÚÿÑþÿÚÿ32ÍÎþððð>熼³á ááᆼ>çñññäääôôô ááá ³á †¼<4<4‡’îÃÆö=: >çÂð€úúúøøøúúúøøøúúúððððððøøø úúúøøøþþþøøø ðððøøøúúúûûû ûûû úúúûûû ûûû ðððõõõ ûûû þþþøøøÔýþ)ìÿÔýþÔýþÔýþúúúúúúúúú¿ âýþàóô½í¹ûýÔýþôôôùùùÎþÿ{ Óéé¢Õí¿ïðÚðñøøøM2ŸÎù´Ïùúúú M2ŸÎùôôôºÕÿôôôúúúE*ÿ¤Öùùù¼×ùùùøøøÿêý,ýÔý,-4üêæû3ÿèÍû3ýû3ýýÔúúúúúú 2ýÔûëüû3 )÷îýýÔúúúÿçæAççÿ32äÏþýÇççÿ)þÎñññøøøÿêý,ýÔý,-4üêæû3üÍû3ýÿýÔúúúúúú 2ýÔûëüû3 )÷îýýÔúúú$öß :ççÿ32úèÿÚÿççÿ)þÎùùùñññøøøU'þ³á éééâù ŠTÿâæü'ûÒéþéééâù MöÒéýøøøúúúðððììì÷÷÷þþþøøøôôôúúúþþþëëë[<üÄÌøáø îðÂð="øâæü<4="ø†¼ãÑë<4´Ïúøøø€úúúøøøúúúøøøúúúøøøúúúøøøøøø ÿÿÿÿÿÿúúúûûû ööö øøøìÿìÿúúúúúú¿àóôúúúúúúúúúùùù¿ïðÚðñøøøþÿÒéýúúúþÿÆÝñúúú ö÷Òéþøøøÿêý,ýÔûëüû3üÍû3üÍû3ù¡ÿêý,ÿêúúúüùäúIüÍ÷îüÍýÔôôôúúúùùù$öì)þÎìççÿÿä)þÎ÷áÉæAþéÑøøøÿêý,ýÔûëüû3üÍû3üÍû3û»ÿêý,ÿêúúúüùäúIüÍ÷îüÍýÔôôôúúúêêêÿçó !)þÎìççÿí)þÎðØß :þéÑñññÊáõøøøðððñññÄß Êáõâù ðððÒéýøøøúúú ìììúúúúúúòòòìììúúúúúúëëë úúú>ç•Çé>ç³á ùùù ö÷Âðîðâæüô³á Ëæ‚L÷¼×øøø ôôôôôô öööðððôôôÌÓûôôôÌÓûôôô³á ýÔû3ù¡û3 )û3ù¡ýÔôôôüí•û3 )û3âââï¿âââ)þÎ32ï¿×2ï¿ýÔû3ù¡û3 )û3ù¡ýÔôôôüí•û3 )û3ññññññï¿âââ)þÎ32)þÎ×2 à°ñññðððððððððððððððððð ôôôôôôôôô >ç³á ñññÂðñññ³á ³á ³á ñññ†¼Mö±´< IDAT€ÿ$$$ÿý,"óñññÞä ýÔý,ýÔôôô 8 äíó÷ñÈñññ A Þíó" Þíó"ýÎññññññððð333ìììáááÜÜÜââââââððð333ìììáááÜÜÜââââââððð333ìììáááÜÜÜââââââððð333ìììáááÜÜÜââââââ...ðððáááìììððððððáááðððáááìììððððððáááðððáááìììððððððáááðððáááìììððððððáááðððáááìììððððððáááðððáááìììððððððáááðððáááìììððððððáááðððáááìììððððððáááðððáááìììððððððááááááôôô5 ÀÜÝ ÷öí ööö 5 ÀÜÝ ööö 5 Ôßßí ÷öí ööö&&&...ððð$$$ÜÜÜâââBBB¾¾¾...ìììÜÜÜÒÒÒñññâââððð...ÒÒÒñññâââ333ììì%%%ÛÛÛáááDDD¼¼¼333ïïïÛÛÛÂÂÂ^Ñ ŸZàëòý ãêÿâ +ëñÿÕ÷è ãôôôHkµ¯ïÞÔ÷ õòÿì7÷åãúæö î õNÁúŸZà04 Ô±áþÕ+üÛñÿå&ç Øó(ðððý+ê 3 àÍö 3 Ô°ñ ôãûòý+êôãû  3 ×–)ô ôãû çÅõ óâú õ)ôóâú  ýÆý+ê 3 àÍö 3 Ô°ñ ôãû+íÚôãû  3 㢠ôôô€ý,ÿêý,ÿëíóÿë òõû$ýÔý,ÿÿêúúú ÿêõû$ òíóýÔúúú úúúIÿç :ýÎõû* Þðððõû* Þ÷úÿ !ÿçùùù...$$$×××ûÔÓÙÑÐèæÚÞÞ óòöââñ$$$ éééééé...$$$×××ûÔÓÎÐÏáßßåààôóöââñ$$$ éééééé...$$$×××ûÔÓÙÑÐèæÚÞÞ óòöââñ$$$ éééééé...$$$×××ûÔÓÙÑÐèæÚÞÞ óòöââñ$$$ éééééé×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøø×××ñññ+++ @@@÷÷÷@@@ïïïÐÐÐøøøøøøáááððð/ïææ/×þÿ4 áòñü 5 ëþÿûûûûûû çæü òûûû5 ëþÿûûûûûû!!!'ÿïææ&&'ÿ×þÿö!!!,íìëü 5 áôõAAAþþþøøøþþþöööÚÚÚBBB$$$îîîîîî ìììøøøùùùùùùééé...øøøéééñññùùù;;;öööøøø×××DDD%%%îîîííí ïïïöööí Ì÷õß­ñZ¦ È­ðäêí +ë6Jƺò úòþ÷ÿÜ1ññÿööõþ>CÍÉõ%æäñ7÷CûèæûèÉ !æôèÍÉõEh Òíÿ$èæûÍÉõÙæú :Œå¼ôèæûå%ýðôãû íÔø÷êü, 3 àÇõàÍö 3 àÍöðçûÕ÷óâú éÈöøëü* ü÷þôãû ôãûúòþý× *þôãûöõþíÔøôãû, 3 àÇõæÜù, AsÜËöíßú, Ì!øøøúúúÞC IDAT€ÿêý,ïò äõû$ýÔÿêÿýÔý,"óïòÿÿêúúúúúú ý,ðôôôòòòüùäþþþÿêôôôúúú ïý2ÿýÎñññùùùùùù ïý2ýÎÿÿóðØ$$$ãÐÏêððëýþ*Öùûëýþ23ýýýãÐÏêððÿôÿñýþ0æüýü 333ýýýãÐÏôññìýþ÷÷öí üû23ýýýãÐÏêððëýþ*Öùû ;=æôõ÷öá999ýýýééé''' ẹÔßßëýþ*Öùû*Õìíéè"56ÚÚÚ'''ááá''' ẹÔßßëýþ*Öùû*Õìíéè"56ÚÚÚ'''ááá''' ẹÔßßëýþ*Öùû*Õìíéè"56ÚÚÚ'''ááá''' ẹÔßßëýþ">?ÚÞÞ*Õìí4@) "©©©×××''' ẹÔßßëýþ*Öùû*Õìíéè"56ÚÚÚ'''ááá''' ẹÔßßëýþ*Öùû*Õìíéè"56ÚÚÚ'''ááá''' ¬¬¬øøøúúúöööðððüüü'''ÚÚÚ'''ááá''' ẹÔßßëýþ*Öùû*Õìíéè"56ÚÚÚ'''ááá''' ẹÔßßëýþ*Öùû*Õìíéè"56ÚÚÚ'''áááôéé òñ# ×ùúìë# ä÷øõïïüëþÿ'ÿ×þÿöûûëþÿ'ÿàóôúïïýü1×ùú÷öü òõïïòñöòöûûûûûÿÿÿúïïêéÐ÷ùìëýúúåøùíííæùúñðÎ÷øîüüæùú ùøä÷øäääöööðððîîîöööðððîîîøøøÚÚÚøøøÊÊÊùùùñññøøøùùùññññññùùùéééùùùâââøøøìììîîîøøøìììîîîööö×××$$$öööáááäêíúë Öÿî.ìÝÿ(Ýÿ+ôÕöüÕÝÃæ04 Ü»êÿâû æäñôåØùò0òÐéù.ì1èÉ *ÿöØ ôö04 Яòÿìãñè+êÙ Õé+åÅíù(Ýÿÿ$ôÕöÜ»ÝÃæ04 ìË áþÕúòþ Õ õñ÷êüúýÿðçû 3 ðçûíÔø*IïüððÛù ý×  ùöøëüúòþ 6 ûôþúòþïÖø2 E ñëó÷êü å& éìçùðý   As¿êíßúêÍ÷*Içôèë ñåùúúúö îû áþÕý, äðððíó,ýÔý,ýÔý,ýÔý, ý,ýÔôôôôôô ðððôôôíóýÎñññññññññÎý2ÛÛÛ*ÖùûÖâû*Öùû*ÖùûZZZÊÊÊÛÛÛ*Øþü&*ËøúZZZÊÊÊÛÛÛí ÷öZZZÊÊÊÛÛÛ*ÖùûÖâû*ÍÕÕ”””uYX5 ZZZˆˆˆ›ƒTÅËÒwpcõ—””ù ­pcUc˜ñññ›ƒTÅËÒ;5.ÅËÒ­pcUc˜ñññ,!!4-;5.<;5‰8ëÄÃñññÖùû*©©©9çåÇÍñññí ÷ö6G!q5.Z|«ø ñññ÷öööÍ Ãöö ñññ+++ñññððð ôôô öööÕÕÕ333ñññÖùû*Öùû*ñññ›ƒTÅËÒwpcUc˜ ÷Ëòóÿôôí ËòóÿôôöÁöö ÿôô ÷öÁöö ÷Ëòóÿôôí ôôôÿôôí ööÿôô ÷Ëòóÿôôí Ëòóòó÷öíÔíì ööö÷öÁöö ñññìììâââ$$$<<<ÜÜÜððð$$$ìììðððÒÒÒðððñññððð888ÈÈÈðððñññññññññáááôôôïïïááá%%%>>>ÛÛÛììì%%%ïïïìììÍÍÍ÷èãÔàà2Øþü&½ýÃâêÔ",ë½úÐ +õÕôôö îõÉßë?! Øþü ¹úòõòÈ&8¹÷Ð7É+ç Øó+ÔàÐ2Øþü&½ýÊ&åñã+ë½úÐ0Oæ±+ðððýêý+êÔ,íÔøa¦ Œ.Ø,àÍöa¦ ¿ê÷É ô)ôÖ*ïÖøöã¹ó*ôãûú  ó(óÝ 3äàÍöï,$Í¡î,ÔÇôÍ¡î,àÍöa¦ ¿êãÕò +ëôÕñåôÕ õ7÷èÉ ýñèÉ +üÛå%áþÕå%€ú÷úÿêÿêý,ýÔÿïòúú÷âý,üùäú÷âúúúúúúúúúþþþþþþõû* Þéééêêêññññññùùùùùù ! Þ ïíó"ù×××ÙÑÐëýþþñþ*Öùûëýþêðð"01ååå×××ÙÑÐïH. úëýÿôÿÖùû(?@øõõõõõõ,,,ååå×××ÅÎÎ ÷ üûí ôëë"01ååå×××ÙÑÐëýþõÿÿòÿ*Öùû÷ö²ÀÀžž¥œœ"01£££äääÊÁÁNB*ZVL<82õ—”/4ìù56‘«;5.ZVLýýÄõ!ëÄÃÔßß>>ìììïïïÍÍÍ%%%>>>%%%%%%ììì)èþçýÌÓöÙú< ã êÿâ ðããú(èøë ü öñØþçýÌÓöÙú<ó(áþÕ+ôãû 3 ¿ê 3 íÔøíÔøÔàø,,¶ö,ÖþóâúúòþïÖøïÖøñáûØþü**ûÃ÷ âü îÔøÔÇôçÅõçÅõØþüÌÓö8 ,àƒì,Öþ ñåðÛùµ¯ïåãú04 ÐÌõôÕö î÷êüùñýåãúèÉ &.ùñýåãúÐÌõåãúÐÌõ04 å%ðððíóíóíó äíóíóýÔäää äääñññäääðððíó"ýÎñññâââý2 Þíó"ýÎÛÛÛáááÖùû*Øþü(*4- VYbdÚÿÖùûÊÊÊÛÛÛááá*(ÊÊÊÛÛÛáááÖùû*üâüÖùûÊÊÊÛÛÛáááÖùû*(*4- 01¢¢¢ÓÁÀø7:ˆˆˆâââÛÛÛááá*ÄÅË—ÅîûÑúÏ.7ÚÿÊÊÊââââââÛÛÛááá*ÚÿÊÊÊââââââÛÛÛááá*;5. U‹‰Gp³Œ‹4-wpcÚÿÊÊÊââââââÛÛÛááá*âàÅÍѹº¾íÍÍÍÄ ¶ âÉ&霞²ÈÈȾ¾¾âââÛÛÛááá*ø y•–„ñ^âÑÿòf\ÞøÃÚÿÊÊÊââââââÛÛÛááá öööjÑ5ߦ}ê/ž)ÊÊÊââââââÛÛÛáááBBB...333WWW¶¶¶WWW333333ñññÊÊÊââââââÛÛÛááá*Øþü(*&éÚÿÊÊÊââââââÛÛÛááá*ÄÅËþëþÄÅËÚÿÊÊÊâââìýþôôô×þÿòñí ôôôðððòñ÷öÁèéòñÿôôôôô)ÿôôöööËòóí ÷ööööËòóöööËòóÿôôí íìôôôìýþäää´àá ãâí ñññ ãâÍ Áèéòñÿôôðððñññòñ   ñññÒÒÒ±±±<<<íííðð𸸸ðððáááÈÈÈ888ñññðððÍÍͰ°°>>>îîîìììØþüÖùûþçý].òý× ãñýþþçý5 ô õ õØþü4- ].òý× ó(+ùñýàÍöàÍöâþ, Áþú 3 ô-ÁþúùñýüôþúòþòÞùúòþ íÿ7! åôü  øåôüüôþùñýúñýàÍöëÆöàÍöâþ(Áþú 3  3 ô-Áþúùñýò%8óõåûåãúÄ¡ åãú +ë õ âþüôþåãúÞ¿ÿåãú7÷+8óåãúåãúãÀ)µ¯ïüÛýÔýÔýÔý,ý,íó"óýÔððð äää âââýÎý2ññññññâââñññÒÒÒíó"ýÎñññ%%%Úÿ(Øþü(4- Úÿ ³î¶¶¶ÛÛÛ&é%%%666%%%ÖùûþçýÌÓöØþüÚÿ*  %%%666%%%Úÿí Ôàøÿôô%%%666%%%Úÿ(Øþüñáû4- Úÿ ³îäääJJJñññ¶¶¶xxx%%%ÚÿUb5 ôßLßL il<;5&é%%%666%%%ÚÿÄÅËi;WWW©©©>ç&é%%%666%%%Úÿ<;5à«u»ä³Œ‹4-wpc&é%%%666%%%Úÿ(Øþü âÉ4âàÅ4- Úÿ&é%%%666%%%ÚÿÜÜÜâÑÿÜÿwy¯&é%%%666%%% íç¾î"œXíç¾ %%%666%%%ñññ®®®ttt¾¾¾ììì<<<°°°ììì%%%666%%%Úÿ(Øþü(4- Úÿ4- pa´ïˆ&é%%%666%%%Úÿ[ÂÇ[ÂÇ[ÂÇY­Å<;5&é%%%666 íìêêêËòó÷ööööýáàËòóìýþ÷öÁèéäää íìöööËòóÿôôí ÷öÿôôöööôôôí  íìÚÚÚËòó÷öôôôíÑÐþæä"úøÁèéäääýáàòñËòóÜÜÜììì¼¼¼...ÍÍÍïïïÄÄÄðððâââñññÂÂÂÒÒÒðððÈÈÈñññÛÛÛïï︸¸333ËËËíííÂÂÂìììôôô&éÌÓöi:þêêêôôô&éØþü5 ôööö&éØþüÌÓöi:þôãû 3 àÍö 3 ,J Ô*,àÍöôãû , óâú úòþ *= Î*ôãûóâú *ôãû 3 3 ,Y ô] ; æÜùôãû 3_,æóàò½òøCQòñåòôÕòÿì õéAõÖýùÜ$ûæèÉ ÚïÒòÈ ý8óQ.:ÒïÆ+å%€ÿêîôÿÿÿÿýÔ! áááý,ÿêôôôòòòúúúúúúúúúúúúÿçý2ú÷à :öêêê!P ïý2ÿçùùùÿÿÿööö ÙÖõÙ þ&é úëýêðü÷öàÒÑï(øùÝÝÝööö ÙÖ4- úëýèÿÖùû0ñýþ÷ÝÝÝööö ÙÖõõøù*âöõüÿ4 ùÝÝÝööö ÙÖõÙ þ&éúëýêðü÷öàÒÑ01BBBÏÏÏöööÊÔþ ú‘š±4.Amh56ÄÅË¢ÙØ ÏÏÏùùùöööÊÔþ úwpcùæØÒéýäää>çwpcÄÅË¢ÙØ ÏÏÏùùùöööÊÔàìßRƒ³Öé걓qâãæ¢ÙØ ÏÏÏùùùöööÊÔÙ þ&é . öÑÝæêûØþü(Ù þ ÏÏÏùùùöööÊÔâÔÂÁkFù_Cä)®óÅ©¨÷ùý ÏÏÏùùùöööâáÓúûûûû=÷ñÈ=üùäôø ÏÏÏùùùßßßøøø›››PPP...222ØØØÜÜܾ¾¾éééÏÏÏùùùöööÊÔÙ þ&é úëýæêû2âÞÌ¡Úó ÏÏÏùùùöööÊÔþ úúøÒ•œ£——»›ší¸¢ ýý¢ÙØ ÏÏÏøøøü ööö  +Üïð ÿÿÿ ö4 ò ööö 1Üïð   +÷ úúú&&# Âõ÷$%ö&& ùù':;öööñññ,,,ÈÈÈ$$$þþþßßßÿÿÿÚÚÚýýýùùùñññ&&&ÚÚÚáááééé---øøøîîî---ÅÅÅ%%%þþþÞÞÞÝÝÝÏÏÏôôôððð8ùöÖùû*5: ºÊóÐÚ÷6Üðüÿÿÿúúúúúúúúúööö8ùöÖùû*Ù þüâüêðüÿðñþÚÚÚ*ëèÖùû*æêûæêû ùìôêðè%ðçû 3 àÍöôãûíÔø  3 ðçûþùÿóãûüôþ$úòþ ôãûóâúïÖø  úòþü÷þöåûûóþ+ðçûàÍö 3 íßúööþçÅõ'B öõþ 3 æÜù áÂõóãû ûûæúðõI.þÃÌÿÿÿÿúúú  Ýüþóü!Ýã4–° IDAT øøøüíæú5ÿëÛàóùøøø€ý,ÿêîôýÔ! ïò ä÷ú äú÷âý,òïÛý,ýÔôôô ôôô 2öóÞúúú :óðØ ! !ÿóðØ !ÿóðØ###ÏÏÏÚÞÞï(Ù þæêûèÿÖùûÏÏÏÚÞÞ÷çöýØþüí (øÖùûõÿÿü ÏÏÏÚÞÞïëúùýíù÷÷ö ýòþñýþÏÏÏÚÞÞï(Ù þæêûÉß÷2! 6JV«Žîîî+++ÏÏÏÞüâúêó4.UL=ÄÅËÅËÒøÑðí ýýý+++ÏÏÏÞüâ.ýýZVLóàÒôwpcÄÅËÅËÒøÑðí ýýý+++ÏÏÏÞüâÅÝÿ˜d4èÛòVO4ÄÅËÅËÒøÑðí ýýý+++ÏÏÏÞüâ(Ù þ2VãÏÃØþü&éí ýýý+++ÏÏÏÞüâõöüßÃÂ͵ÖÈÇïááí 2ôþí ýýý+++ÏÏÏñðãðñþòïÚüùäööö2ôþí ýýý+++æææåååÑÑÑËËËÅÅÅËËËòòòèèèííí ýýý+++ÏÏÏÞüâ(Ù þæêûŸÈñ²Àñ(øí ýýý+++ÏÏÏÞüâúêó,>U<9>(uy]>M>ýýÅËÒøÑðí ýýýéééúúú5 òôéé5üØëìûûû/àóô íìü!úùÜïð ôééüàóôûûûòñü ôôô íìü )üëëë'ÿ%&ôæææñññçæ''8 çééöööøøøîîîþþþ øøøîîî æææßßßùùùùùùññññññøøøøøøêêêááá!!! øøøöööîîî ÷÷÷îîî äääÞÞÞÝÝÝððð:ùóüÃ4ÿôÿ#½ã÷áõ?þúæú úúúöööõ2ôþÃ4ÿôÿ×ù÷õö?þóöðñþþþþâââ,ëóüÃ4ÿôÿ#§Óý ÿÁé,ëA&öÚñððð$ñíÔø ½ùê 3 öõþþùÿôãûöõþa¦ ðàúùÊüô ïÖø Ôúû ü÷þóâú "úÎ ý ø5eÝ»ó ½ùê%Týíßúþùÿöõþôãûü[—íÙù Ú$ôìùôôôúúúööö:ùËó ðõëÿ úúúúúúúúúöööûûûûûû?þÂö ÿáõûûûðððìììúúúööö:ù±ÝO4ÆÝûúúúòòòþþþýÔý,ýÔý,Þä ääíó äíó,ýÔôôô ððððððý,ýÔ ôôôñññÎ Aý2 Þíó"ýÎâââZZZÛÛÛÚÿ(4- ÌÓö4- ʺóÚÿ(àû666ÛÛÛþçý(þçýÖùû666ÛÛÛÖâû?  Áé÷ö*Öâû666ÛÛÛÚÿ(4- Éß÷4- ÌÓö_‡ ˆˆˆ666ÜÜÜ%%%ÛÛÛâàÅþçýÌâʹߑ´þçýþçý666¾¾¾%%%ÛÛÛâàÅʹßÌÒℱSI|þçý666¾¾¾%%%ÛÛÛâàÅ3ôñ ô„±UbþçýØþü(666¾¾¾%%%ÛÛÛâàÅ(þÏö7>Óʺó666¾¾¾%%%ÛÛÛâàÅ=þû þçýþçýþûÚÿ666¾¾¾%%%ÛÛÛâàÅ=þû ôþçý ôþçýþôý666¾¾¾%%%ÛÛÛáááððð ôôô666¾¾¾%%%ÛÛÛâàÅ(4- ÌÓö4- þçýÚÿ666¾¾¾%%%ÛÛÛâàÅþçýÌâʹߑ´þçýþçý666¾¾¾5 çê Ëòó ööö)ç þÿêöö?ççèé )ê ôôô öööí íìô êööíìô× )òñËòóhà ãâöÚê "Ãïðñ)ìììðððÕÕÕ+++333ìììððð$$$ÜÜÜ$$$ìììðððâââññññññêêê...ññññññâââññññññðððïïïìììâââ555ïïïììì%%%ÛÛÛ%%%ïïïìììááá Áéö Ãöö?þÌÓö Ëó ôôôô öööéëó ööÃúþüÁé  Áéê ÃöösDÌÓöËó ×ÿ ×Òôôäððð,È ýãýàö 3 àÍöòêÔâ, 3 ŸZà 3 ý+êÕ,íéþâú0 ìÐ÷ õïÖì* 6 êÊö)÷ ×àÍö3_ÈãñãýË“ì 3 òêÔâ,$ÔÇôó*ÝÖ+ðð ôôô Ëó Ëó öööÁéÁé ôôô×ÿ—Æä €ÿêý,ýÔÿ÷úÿëÿë÷úú÷âÿêý,ÿêúúúúúúòòòíó òõû$÷ñÈúúúúúúêêêöÿýÎÿ Þõû* Þíó"ýÎóðØ :óðØÿÿÿ×××ÚÞÞ*4- ¾è÷ÌÓö5: úëýØþü(ø +-ÝÝÝ×××ÚÞÞîõÕíúàüýûó ü***ÝÝÝ×××ÚÞÞí T9 ¾è÷ôì÷÷6Ù þ*ðñý* +-ÝÝÝ×××ÚÞÞ*4- ¾è÷ËÙ÷ú4- žµÓâÐÏ0 +-×××ÿÿÿ×××òç5: ¾è÷5: çöý4- çöýØþü -×××ÿÿÿ×××òç5: ¾è÷5: çöý4- çöýØþü -×××ÿÿÿ×××òç5: ¾è÷5: çöý4- úëýØþü -×××ÿÿÿ×××òç4- ¾è÷ÿ" ËÌÓö5: úëýØþü -×××ÿÿÿ×××òç5: ¿ôù5: çöý5: úëýØþü -×××ÿÿÿ×××òç5: ¾è÷5: çöý4- çöýØþü -×××ÿÿÿ¬¬¬%%%'''øøø'''øøø×××ÿÿÿ×××òç4- ¾è÷ÌÓö5: úëýØþü -×××ÿÿÿ×××òç5: ¾è÷5: çöý4- çöýØþü -×××øøøÖéê,ä÷øôééü)àèéü÷ !úùìÿôééë'ÿôíííÿÿÿæùúúïï/àèé÷ôéé÷ :ìÿÖéêöõôáááûûûÝóôóòôëëò÷ óòä÷øìëòóòô!!!öööððð$$$ßßßþþþæææÊÊÊñññùùùñññáááêêêÝÝÝøøø222øøøììì%%%þþþÞÞÞäää×××ññññññÿÿÿ ÿÿÿúËó  ôôô ÿÿÿööö4 Õê ûûû þþþ÷÷÷ðõËó  øøø÷í,Öþúð$ 3 àÍöÕêÿâ÷êüúýÿ 3 àÍöÿõ÷ëý âü  ðÚùý× òÿìøëüûôþôãûú@Ðþãýð$ 3 àÍöÕêÿâüôþùðýúýÿýæÜù$çôèë úúú úúúúúúðððøøøðððþþþ€ÿêÿýÔñññíóýÔÿêúúúúúúòòò òþþþúúúùùùëèÑ !ú÷ß÷÷úýÎý2 ïóðØñññùùù!!!àÒÑúëý4- ÌÓö4- ÌÓö4- úëýÕíú ÙÖõÖùûí üü àÒÑ6úëý4- 0' ÚÕòJ=úëý4- üúÿÕíúàÒÑúëý4- ú4- ÌÓöÖØã7! Õíú öâÕúëý4- ÌÓö4- ÌÓö4- úëýì   öâÕúëý4- ÌÓö4- ÌÓö4- úëýì   öâÕúëý4- ÌÓö4- ÌÓö4- úëýì   öâÕúëý4- ÃðëÛà4- ÌÓö4- úëýì   öâÕúëý4- ÌÓö4- ÌÓö4- úëýì   öâÕúëý4- ÌÓö4- ÌÓö4- úëýì   ññññññáááññññññøøø  öâÕúëý4- ÌÓö4- ÌÓö4- úëýì   öâÕúëý4- ÌÓö4- ÌÓö4- úëýì  áááôééáúû4 áúûÿÿÿÜïðúúìë×ùúÿÿÿûõõüáôõ÷÷÷úïïü:áúûÜïðúú÷öòÿÿÿûõõáôõÿÿÿúïïáúû%þýëþÿûûûÿÿÿÜïð üû÷ìë×ùúÿÿÿ÷öìúúáôõ÷÷÷ííí þþþáááìììáááêêêøøø;;;öööÒÒÒáááñññáááøøøúúú,,,ùùùæææ ÜÜÜïïïÜÜÜééé555öööáááôôôúúú ôæú ôôôúúúûûû ÿëÿ ððððððôæúðððëñèëÿ×ÿÿõðçûÕ õñúòþöõþôãûðÛù-óßôúúòþý×  ùö úñýóâú÷êüöõþüÕú×ÿÿõðçûÕù÷òúòþöõþñÜúüýùÿë úúú ›¨4 IDAT€ÿððð‚ÿ÷Í$úÜ!òßòDýî!Îßé$!ÎßòDýîúÜûãûã!ßì"ýì!òßäñ!òßì"úÝ4üÍû3üÍ..4ÁÜ9ö“û33*ÍÖÿ3*ÁÜ9ö“ýÔý,ýÔý, äè÷OüÍ äè÷Où¡ý,ýÔý,ýÔôôô ôôô ôôô!PÍÖÿ ±!Påß°!Pôî¿Ùè@3*ôî¿ Aåß°!Påß°ðððôôôðððôôô+++½½½$$$ÿôôôÌÌÌõ¿ E!ò$ßï2úÞúÜýðßì"!Îßæÿ!¼ýðùÔ1!ô¹ßéúÝûãýñßæÿ!òßäñ!ÞüÍô:..4üÍ..4û3ÍÖÿö“û3üÍÍÖÿ3*ÍÖÿ?$Çû3ý,ý,ý,íóüÍè÷OüÍýÔý, ôôô 8 ôôô 'À!Pôî¿!Pôî¿ A'Àåß°!P )è5 ô5 ô5 ô0P'ÿ|*(ÿúÞßì"ýìäèïúÜýì!ÞýìßéýìúÝßæÿþò 8!òûãþò!þò!ßäñþòû3ö“ÒÒÌû3ÍÖÿ3*üÍû3..43*ÍÖÿüÍüÍýÔ"ó"óû3üÍíóý,ýÔý,ôôôôôôý, ôôô ôôô 8 ÿä Aåß°ôî¿ A Aôî¿ Aôî¿ý2!Pôî¿åß°!PBBB333...333xxx +++^^^SSSSSSBBBSSS)è)è)è)è5 ô5 ô5 ô5 ôËó 5 ô5 ôËó %#ÿM% ÿ})ÿÿRÿ·Vÿ444ÿ444ÿ444ÿRRRÿ-QQÿÿó•¾[ÿ¬¬¬ÿžüýÿÿRÿM% ÿ¼ˆXÿRÿM% ÿ%äèïäåÛ!Þòßé!òßåÛ!ò$ûã!ßæÿßäñ÷È!#9ßäñùÖßä*!ßæÿû33*ÒÒÌÍÖ333*ÍÖÿ3*ÒÒÌ..4û3ù¡Þä û3üÍüÍýÔý,ýÔý,ý,ýÔôôô 8ýÔý,Èý,ýÔý, ýÔóõ åß°è÷OáÀ Aôî¿ Aôî¿ Aôî¿ Aôî¿ A ÍÖÿ“““wO6M- Ìñö‰±Êmmmááá cccÆž…<8ùÕú:b{ôôô˜˜˜c;"M- ÌÓöÅÞJJJ²²²ÖÖÖÛÛÛ%%%ÛÛÛ4ñ#$¶¶¶ttt†°°_MNNNN‚‚‚ÜÜÜììììììòñö"#ÍÍÍWWW“··SFG~~~“““ÖÖÖîîîîîî!ïîñ#$ÊÊÊ```†°°_MNmmm)è067Éúùšöè0§û5 ôËó 5 ôf 7%ÆÕöô0ÐüûIõÝ6IõÝ· #ÿ(ô0ƒ×ïööö—Æ èåÿ^^^ÍÍͽ½½CCCÿ½½½CCCÿ½½½ÿÌÌÌÌÌÌÌÌÌ444ÿÌÌÌÿëÇÇ444ÿÌÌÌööö´&ÿP–øCCCÿ½½½;…†ÿAt>„<ÿ99°ÚÚfe2 ÿHU¥ëÜŽ¢|«ÿ5 ôʺýÃÿòòòK ÿËó èèè u½l IDATS*ÿ<;5øÃ5ÿUbÁéÿ5 ô³Ûô!òßï$äèïüÞû%ßè"úÝ!òßé%úÛ!ßéßæñ!ßæ÷È 8ßäñ!9ßæÿßäñ!ßäã3*&ÍÖ3üÍÍÖ33.4ÍÖÿ3*û3üÍÍÖÿ3*üÍø_ù¡ý,üÍ äíóýÔý,ý, äíó,ýÔðð ý,ýÔ÷ñÈ 8÷ñÈ ýôôô Ôôôô 8÷ñÈôôô+1`î¿Ùè@'¿ A AÍÖÿ'¿Ùè@'¿ AýÎ Aôî¿ âðù333ÄÄÄÜÜÜ$$$<<<ÄÄÄÜÜÜ4- ÌÓöMuŽ   iiixxxÛÛÛááá%%%ÛÛÛááá+ùÕú=V¼¼¼RRR¢¢¢555ÂÂÂÛÛÛ%%%>>>ÂÂÂÛÛÛ4- ÌÓö_‡ qqqÖÖÖ4ññ#$ÝÜJJJ±±±P&&**ÜÜÜòñöö"# ÞÝ333ÈÈÈI%%$$ÖÖÖ!ïîññ#$ÝÜ666ÄÄÄP&&**)è0ÐüûÐüûšöõ×ÿYúm :ïËó 5 ôf šöõšöõËËó em cðîËó IõÝ· #·IõÝ6 #Áé³òïÿÚrÈà®è})ÿƒ×ïèèèÍÍÍÿ½½½ÕÕÕCCCÿ333```   ÕÕÕÿ¾¾¾***úÁ/ÿWéŸ>IªåÆÀ\ÿ·iµƒ×ïúÁ/ÿƒhâƒ×ïCCCÿÆÆÆ RRRÿ®®®‡‡‡ÿ‘‘‘+++½½½bbbÿ¶¶¶...ðððÌÌÌÿ555­­­ÿ;‰%B¹Bÿ¾¾¾BBBöH.ÜfffÿËËË555€½­CCCÿ333$$$ÿ½½½QQÿ㯯*‚ÿâÌË¿Œê60ÿVZtvá½½ëÇÇèèèæ踻žêÚÕ2 ÿ,7&D¢|«'^ÿó@13¢|«ÿ5 ô4.;c.ƶ òòòÿͤc@ÅËÒʹß5ô ÿ4- ®ê;5.8þçýñï…} ^ÿ%äèïüÍßéòéÿßé!òßäñ!ßæÿ!ßæÿ!ßæÿ!ßäñéÿßäñ!û33*ÍÖÿ3*ÍÖÿ )Ùÿ(ÍÖÿ3*ÕÏ ý,û3ù¡íóû3üÍýÔý,÷ñÈ ý,÷ñÈ 8ýÔý,÷ñÈ ý,÷ñÈ ý,÷ñÈ!Pôî¿ Aôî¿ñññ A 3;뻄 Aôî¿ Aôî¿áááÕÕÕ+++ÕÕÕì8 ýÔ .-ôÖÿãÿGæ¹ø7:ÕÕÕ^^^®®®ôôô êêêêêêöB ýÔ .-ôÖÿãÿ è¾êêê555ÕÕÕððð...ÒÒÒà, ýÔ .-ôÖÿãÿUè»ùDGÒÒÒccc­­­ððð²²²†°°+%%%***ÖÖÖÛÛÛ%%%xxxôôô‚‚‚“··5$$$ÜÜÜìì좢¢+++“““†°°>***ÖÖÖîîî———½½½$$$ÿ)è×ÿ)è×ÿ)èf ÊúúÐüû×ÿôôô5 ôËó 5 ôËó 5 ôf ÊúúÐüûËó 5 ôËó ûãÊúú· #ÌÌÌ%#ÿ(³ÛôM% ÿ³ÛôÿJJJŠŠŠÿ¾¾¾   ```   ¢¢¢èèèÿŸ>mÎ ™bþ=; *cõÛ×m¾‹‘gž“2÷Iªåÿ:::ÒÒÒcccvvvÏ&'CìëTTTÿJJJÒÒÒ*P!ò!ttt°°°Õ#¿ó¥ ÂÂÂcccyyyCCCÿ½½½ÿèèèÿ^^^$$$PPPYYY½½½ÿööö èèèÿ¾ ÊÐÖ"ÿììë*Þå\††ÿP&&òPQbÿèèèÿýñH13º”Ãýñ,ó@CÊÃlåÿ5 ô4.;5.Cs9oÿööö®zJÅËÒʹß³Ûô¼ˆXÿ<;58‚X™;5.‘´Ëó èèè!òßåÛ!òßï2äîäåÊ2!Îõð2çÎ!òßì"!Þßäñ!ßæÿò!ßÝÇßä*!üèÿçüæÿ!ßæÿOHÍÖÿ3*ÍÖÿ3*3*ÁÜ9ÒÒ“û33*ùØÿá'&3*ÍÖÿ,ýÔý,üÍÞä ýÔ"óÞä ý,÷ñÈ 8ýÔý,÷ñÈ 8ýýÔýÔ ý,ýÔ !Pôî¿ Aôî¿íó" ôî¿ A뻄 Aôî¿ Aôî¿ Aá ññññññ99Ú2ôÖÿ-4ýÍÿÞä +++ôôô ôôôCCôÖÿ,ïÚ2*Îâøñ,ÔBBBÍÍÍñññ --Ú2ôÖÿ-4ýÍôÿÔÕþ1.._MN±±±ÖÖÖÝÜ*MN***S88ÈÈÈ ÞÝ$FG$$$_<<ÄÄÄÖÖÖÝÜ*MNYífó7cðî×ÿYíüè×ÿ5 ôËó 5 ô›ÿ  5 ýÛcðîËó e ôËó ûãÊúú67JIõÝ· #})ÿ)®êÿ(ô0:- ÿ4- ®ê})ÿÐüû³ÛôèèèžžžCCCÿ```ŒŒŒ```   ^^^ŠŠŠÿ⩽•ìú÷™b=; I‚ÖBuo“Њ0Czåèèèÿú$$²„„†°°>>>ÈÈÈa))ÛPQžüýÿ´VU®®®ÿËïïZSSq÷¢ tô‚ÆŸ¸Š›DDD2]( uª½½½èèè0P'ÿLÚ´&ÿаÙ˜˜˜ fffCCCÿ½½½êêêÿ°°°©©©½½½;…†ÿAt>¡X㯯 èèèÖ"ÿBöý îôÖ"ÿ¥òô[N ÿÒÌ!%J©«ÿÑËËÈ('ÿJJJ/_`Ñ¡ žžžèèè^„UÿÏÍüU¥ë¢.èôæëæÇºÇöööÜñæÇÓ¯èÿ5 ôocLCs9‚X™~¨gÿû‘ÿo¼ˆXÿDx¨RÿÌÓö³ÛôèèèÿCs9½Ç;5.—ÅîèÛè<;58‚X™Cs9N*{þçýèôèßì"%ßï2ßï2!Îäèï!¼ßï2îÎüí"ßì"ßæÿ!ßé!òßæÿßæÿ!#9ÿñßéçüçÿ!ßæÿÍÖÿ3*ÍÖÿÒÒÌ3*ÍÖÿ?$Çû3,ÍÖÿá'ó×ÿÍÖÿüÍû3ýÔáááýÔý,Þä ýÔýÔôôô ý,÷ñÈýÔýÔý,ý,ýÔôôôôôôåß° Aáááôî¿E|ôî¿ A 3; Aôî¿íóôl&Î-4aoÖÿþçýû3“““ììì  8ü3 * * )ÖÿcccñññÞä ôl&Î-4aoÖÿ4- û3˜˜˜ïïïÖÖÖÌþÿÖÖÖp>=íííîîîîîîMNÖÖÖå³²ÖÖÖÜÜÜâÜÜÜY'&ììììììFGÜÜÜæº¹ÜÜÜÖÖÖßÖÖÖ]+*îîîîîîMNÖÖÖå³²ÖÖÖ)è0Ðüû§û7×ÿ)è×ÿËó 5 ôf šöõeéýÛý%Ëó 5 ôËó IõÝ· #Éúùÿ¨ú÷ÌÓöÿeù4- )ÆÓöÌÓö})ÿM% ÿƒ×ï³ÛôCCCÿÿËËËÍÍÍ   mmm   ``````vvvÿêêêÿÿ⩽•ìi6Buo½•ìzCßZãûÆž¸[ŠCkBuoÿ¬¬¬BvwŒŒŒ>ttt×××z„„„‘ÁÂÿRRRÿ99^^^mII¦ÊÊ÷¢ ©©©¿jÔ7:WWWcccÛ8ŠUšššÿCCCÿ0P'ÿP,´&ÿóÿM&%ÿ|*(ÿ€TSÿèèè µåæCCCÿŠº»šššÿCCCÿšššÿ°°°PPP§§§CCCÿCCCÿQQÿ;…†ÿQQÿâÌË¿ŒÂ45QQÿÿdá¬99Ö"ÿjo¾ ôôôjo[ Böýôôô¾ ììë4ßÛDnnq«¬¼’’ôôô^^^ú$$ ;;ÿ2 ÿÏÍüÿÖ«[^Ò FùCCPvGèèèèèè5 ôocLÅËÒN*{~¨g½Çÿû‘ÿ444ÿ¼ˆXÿøÃÿÿû‘ÿøÃÿK ÿʺóÁéèèèCs9½Ç‚X™‚X™Cs9Cs9èèËqÐŒ IDATèøÃÿ8;5.½ÇÍ rÿýì!òßì"ýì!òßæÿ!òßì"!Þßé!òû3äâÌþò!ßæÿþò!ßäñ!ßÝÇ 8!ßäñ!ßæÿ!û33*ÒÒÌû33*ÍÖÿüÍ..4ÍÖÿüÍû33*ÍÖÿ3*ÕÏ ý,ýÔíóýÔý,ýÔý, äíóýÔý,"óÞä ÷ñÈ ôôô 8ýÔý,÷ñÈ ôôô ôôô 8÷ñÈ!Påß°ý2ôî¿ Aôî¿ AýÎý2ÍÖÿ ±!P Þíó"ÕÏ tttKQz-40Íþûÿ9“Âeù›ï<8ú¬°îÿDnn>ÂììzPPÈ&'¾Š‰zPPŒŒŒ<š›ÄfežžžCCCÿÕÕÕöööCCmII ^ô¿jÔáááááávvvfffÿd¸ ËËË"BÖþö½½½vvvÿ$$$PPPYYYWWWPPPãvFE½½½*‚ÿ|ÏB¿ŒÂÝ“’öööòt'ÏûÇÇèj;[âÌË㯯ÿcü÷;CF ËÆ8ìómo"!.âèöööòòòÿDnnP&&bbbCCÓ¯¯-QQÿÓ¯¯ÿööö$û,7&Dº”à :íîÔøH13¢|«ÿ®zJCs9½ÇÅËÒ~¨g‚X™~¨g59£Mâ®ê¼ˆXÿ<;58½ÇÅËÒ;5.R†¶ èèèÿû‘ÿ½ÇÅËÒ;5.Dx¨¼ˆXÿCs9‚X™;5.Cs9N*{Ëó èèè+ƒÿüÍßéüÝãòüð2$úÜäèï!Þßì"ýì!òßÝÇ*ãüòüê$úÜ!òßæÿ!ßæÿþòOJCÍÖÿ,ÙúÍ-4ó×ÿô:ö“û33*ÍÖÿ3*ÒÒÌû3üÍýÔý,ýÔý,û3üÍû3ù¡ý,ýÔý,÷ñÈ ôôô 8÷ñÈ ý,÷ñÈ7=låß°E|뻄 Aôî¿ Aôî¿ Aôî¿E|÷ÍÅåß°!PÕÏ ÕÕÕJJJáááÞä -4ó×ÿüÍA;ááááááôôô êêê&&&ðððý,û3&ÎôÖÿ äðððôôôððð>>>ðððÏÕþ-4 4;æ£ÄüÍUO&¾¾¾äääööö555òñÃïðááá=âááááááêêê ãâ×þÿááá)öáááôôôäää:::$$$ ÞÝÒþÿ$$$ÜÜÜ.ö"#ÜÜÜñññ½½½$$$ÿ)èf šöõ×ÿ)èf šöõ×ÿôôô5 ôf šöõËó 5 ôcðîËó 5 ôËó ûãûãÌÌÌÿ ðX ›ï5 ô4- q8 vÊM% ÿ0Ðüû³Ûôvvvÿ¢¢¢+++ÕÕÕ+++tttNNNôôô¾¾¾***·Vÿ0[’ö¥n úÐùCk½•ìú÷ÄÈrluyªUSK¬°î\††ÿÜÜú$$zPPBBB‚‚‚bc¾Š‰><<<ŒŒŒžžžÿ‚‚‚ ^ô¿jÔ$$$<<<Í"¸÷¢ “··Ó¯¯|*(ÿ´&ÿèÈñööö555ñññËËË555½½½ÿöööhhh$$$3cdA ½½½ÿöööCCûÇÇèèèÿöööCCñ½½CC45Å{zÿööö èèèÿ¾ ‘Þß ÒVZtvÿöööhhh·ÛÛ[[bbbNxxP&&òPQbÿèèèÿöööPvG$rçŒÒPîÔøHCÊÃlåÿ®zJÅËÒ~¨g‚X™~¨g½ÇCs9N*{þçýµô÷RÿÌÓö«ž8½ÇR†¶òòòÿèè輈XÿÅËÒ~¨goÿçãy‚X™;5.Cs9½Ç„±µô÷‚ÿèûÍüóD÷Ê$êïîíêÿüÍßì"êùÜýñ!ãÿüí"øÏçüí"Þéÿã!òßæÿÿ43*ÚÿçÝ9 úÆ,á'çÝ9#ÇÙÿÔþ3*ÍÖÿ,Ü÷¡ý,ýÔý,ýÔý,û3üÍû3üÍýÔôôô ý,ýÔôôô ôôô 8ýÔ!PÍÖÿ3*ôî¿ Aôî¿ Aôî¿ Aôî¿ Aôî¿ÕÕÕöööˆˆˆ***ŒŒŒ¿ÅîA;tttŒŒŒááááááêêêhhh­­­íó äSSS­­­ðððôôô ôôôöööTTTJJJÊÊÊ«±ÚUO&tttŒŒŒ¾¾¾äääööö555DDDÕÿÿ+4Ìþÿ¼¼¼ááááááêêê>>>Ëïï5òñâÂÂÂáááôôô êêêDDDHHHÂìì>!ïî߸¸¸$$$ÜÜÜñññ½½½$$$ÿYí§û)è0§ûYíÐüû×ÿôôô5 ô0ÐüûËó 5 ô.ãú5 ô0ÐüûËó IõÝ· #IõÝ· #IõÝ· #ÌÌÌÿ5 ôËó 5 ôØþüX ‘åý?þj1–Ïñ³ÛôCCCÿáááÕÕÕ+++ËËËhhh```***ÿöööo:- –Ïñ+c ÆÓö@]CzÞbbbÿttt888TTTú$$>ÈÈÈ888~~~¾¾¾ŒŒŒ<š›bÿ‚‚‚ÈÈÈ888“··5¬¬¬TTT \'ö¤Ù¶¶¶èèèÿ8LÚÇËËË èèèÿèèèÿ ôôô+++½½½ÿèèèÿöööòt'Ï㯯ÿcü÷[ BöýöööÈ Böýèèèÿ99/55P&&TTTbbbÿ<š›b^„Uÿ$rç–"ÜFl=߯!ð:°Š¹ èèèÿöööñ탽ÇCs9½ÇCs9N*{ÁéòòòM% ÿþçýà èèèRÿÌÓöocLCs9½ÇÅËÒ~¨goM% ÿþçýîzJCs9N*{Ëó èèèrÿýìýñ 3êùÜüÝã3äÿÿíêÿæÜýñþòãüòã!òãÿéÿãòüåñ!û3,ÔþüÍû3,Ôþ3*ÚÿÙÿÙúÍ-4ó×ÿù¡ý, äíóýÔý,û3üÍýÔý,ýÔý,÷ñÈ 8ýÔôôô ý,÷ñÈ ôôô+++ Aåß°!PýÎý2ôî¿Ùè@ ±!Pôî¿ Aôî¿E|÷ÍÅ¿¹Šhhh666***ŒŒŒtttmmm“““ÖÖÖxxxôôôööö555333­­­SSScccïï¢ ôôôöööDDD$$$tttŒŒŒttthhh˜˜˜ÙÙÙqqqäääöööNxx+4Ìþÿ4] êêêCC5òñâòñŽº» êêêNxx>!ïîß!ïîy«¬½½½$$$ÿ)è×ÿYíÐüû0m :ïôôô5 ôËó 5 ôf šöõ0m cðîËó IõÝ· #IõÝ6ÌÌÌM% ÿËó ð(Ëó 5 ô³ÛôÿèèèCCCÿ333¢¢¢^^^ÍÍÍ333¢¢¢^^^ŠŠŠÿŸ>Êüû 2p=*cõYí‘åý Ÿ>IªåÿöööŒŒŒ<<<BBBöööNxxÜܶ¶¶¾¾¾***ÿ995¶¶¶öööTTTËïïëÇÇ‚‚‚~~~‚‚‚Ò$ï”Bwÿööö èèèÿèèèšššÿfffCCCÿ½½½ÿ‚‚‚PPPãvFE½½½QQÿ45Å{zQQÿ45Ý“’èèèÿèèèÿèèèÿöööCC/55¼’’DnnP&&òPQbÿ9913¢|«ÿFù7&Dº”Ãèèèÿ¤p@Cs9‚X™~¨gN*{Áé èèèÿèèèK ÿocLCs9½ÇDxÊï-ò IDAT¨K ÿà 5 ôþçýµô÷*‚ÿåÍçßï2üÍß2íêÿèûÍñ2êüðÎéÿçßé!òßÝÇ 8éÿã!òãÿéÿãþ)D&Ùÿá'&ÍÖÿ3*ÚÿÙÿÔþ3*ÚÿÙÿÙúÍýÔý,ýÔðððý,"óÙè@üÍû3ù¡ôôô 8÷ñÈ 8ýÔý,ýÔäää7=lôî¿ Aôî¿ñññ A Þááá Aôî¿ Aôî¿ËËË555333666¶¶¶JJJÊÊÊìììÍÍÍáááôôôööö333¾¾¾BBBÍÍÍñññáááôôô êêê555MMM³³³MMMÄÄÄïïï­­­äääöööTTTòñâòñâÂÂÂêêê555 ãâö ãâöÕÕÕöööhhh ÞÝö"# ÞÝö"#ÍÍͽ½½$$$ÿYíÐüû×ÿ)è×ÿôôô5 ôËó eùÐüûËó 5 ôËó 5 ôËó IõÝ· #ÌÌÌM% ÿj1IªåM% ÿËó öööú(³ÛôCCCÿ½½½CCCÿ333®®®RRRŠŠŠCCCÿ½½½CCCÿ½½½ÿ¥n ÄÌô—ÆèèèÿŸ>–Ïñ³Ûô·VÿIªåÿèèèÿ‚‚‚<<<***ÿèèèÿJJJžžžÿ+++½½½ÿèèèÿ+++½½½ÿèèèÿÒÒÒYYY½½½vvvÿ¢¢¢^^^$$$©©©½½½ÿèj'Ï㯯ÿèj;[At>„<ÿ¾ *Þå\††ÿP&&bbbCC/55P&&òPQpNxxÜÜžžžÿèèèÿèèè^„Uÿ¢|«ÿñíƒN*{Áé èèèÿ3ôñ4- ®êÿ5 ôÁéòòò‚ÿîÎñ2êùÜ%äÿÿúìÿêäèïýðüÝçéÿãüò!ßæÿ!üèÿçßæÿýñH 4á'ÙÿÔþ3*Úÿ&ùØÿá'&ÍÖÿüÍû3üÍýÔý, äðððý,ýÔíóýÔý,û3'ÀÞä ÷ñÈ 8 äðððôôô 8ýÔôôô ôôô+++ Aôî¿ñññ Aôî¿ý2ôî¿ Aôî¿íó"ÉÔööö öööRRR666ÊÊÊ666———ÕÕÕ ôôôööö555333ÍÍÍ333®®®êêê ôôôööö&&&BBBMMMÄÄÄ<<<ÒÒÒäääööö öööDDD$$$E¡ýþððÍÍÍáááêêê&&&.­ýþ%ÒÒÒôôô êêê öööTTT%%%4¡ýþ+ËËËñññ½½½$$$ÿ)è×ÿôôô5 ôËó 5 ôËó ÌÌÌÿ5 ôËó ð(³Ûôÿ ð(³ÛôCCCÿ½½½ÿ5 =^øv|ãšššÿfffÿèèèÿèèèÿèèèÿööö èèèCCCÿ½½½ÿèèèÿèèè*‚ÿÖ~ÿèèèÿöööòt'Ï㯯Ö"ÿà5:J©«ÿ99/55¼’’99I%%¢¢¢èèèÿ99CÊÃlåÿ¤p@‘´Áéòòòÿööö=þûµô÷&Pÿéÿçñ2êöÍãòñ2êüðäèïäèïÞéÿçéÿãüòãüòéÿãþ!ßæÿ!ßæÿ)G5Ùÿá'ÙÿÔþ,ÙúÍû3 )ÙÿÔþ3*ÍÖÿ3*ÍÖÿüÍýÔý,ýÔø_üÍû3üÍýÔý, äðððý,ýÔôôô 8÷ñÈ ôôô 8ýÔôôô7=lôî¿ AÍÖÿ3* 3;뻄 Aôî¿ AýÎñññ Aôî¿ÕÕÕöööáááÕÕÕ ôôôöööêêêêêê ðððôôôööö&&&âââ¼¼¼äääööö ööö555òñÃïðáááêêê ãâ×þÿôôôðððêêê öööDDD$$$ ÞÝÒþÿñññ½½½$$$ÿôôôÌÌÌÿ ðÛÝøÿcü÷[ *ÞåÿèèèÿèèèM% ÿËó èèèÿèèèOÿã3íîÎüí"éðäèïùÍçéÿçüçÿüçÿ!ßæÿH%á'Ùÿá'ó×ÿ )ó×ÿ3*ÍÖÿüÍû3üÍû3üÍû3ù¡ý,û3üÍû3 ±ðððý,ýÔôôô ý,÷ñÈ ôôô 8÷ñÈk3*ôî¿ Aôî¿ Aôî¿ AýÎÊÙ1 ±!PÍÖÿ'Àáááôôôööö ôôôööö ðððôôôööö ðððôôôööö ôôôööö +++áááðððôôô ½½½$$$ÿôôôÌÌÌÿöööòòò½ËL IDAT€ÿCCCÿñññÌÌÌ444ÿØÕþçýµô÷CCCÿñññäää ŠŠŠvvvÿìììžžžM% ÿþçý³Ûô·VÿÆÓö)6Iªå¼ˆXÿÅËÒ­Ö444ÿØÕÚÿ&éØþü&éµô÷CCCÿËËË vvvÜÜÜÍÍÍñññÌÌÌvvvÿììì%%%%%%ÉÌ0 IDATÊÊÊìììžžžRRRÿñññËËË/üú4- ®êM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ})ÿ›ïèèè·VÿIªåS*ÿ—Åîöööä|(vÊšššÿPPP444ÿÌÌÌ444ÿÌÌÌ444ÿñïÔ(þçýÚÿ&éÚÿ(ØþüÛÝøbbbÿáááñññÌÌÌ444ÿ...ÒÒÒÚÚÚ ‚‚‚ŠŠŠ>>>áááñññÌÌ̇‡‡ÿËËË%%%ÊÊÊìììžžžM% ÿþçýÁé555ááá)è³ÛôM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ!'PÿßÙ°444ÿÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛÿeù:- Iªåÿeùƒ×ïÿeùƒ×ïÿi;­Övvvÿ¢¢¢JJJˆˆˆJJJÌÌÌCCCÿÉÆØþü(³Ûô444ÿ...¯­’(þçýÚÿ(Øþü(ØþüÛÝøšššÿ©©©888©©©ñññÌÌÌ$$$ÿêêê BBBÍÍÍñññ888ÜÜܾ¾¾ÌÌÌ444ÿ...ÒÒÒÌÌÌvvvÿÍÍÍDDDÛÛÛ%%%îîîPPPM% ÿËó ööö +++ÕÕÕööö555ñññÌÌÌÿJJJ888ÈÈÈžžžÿJJJðððñññ½½½ÿJJJ888ÈÈÈžžžÿJJJ888ÈÈÈžžžÿŸ>ÆÓöÐüû³ÛôÿŸ>;3 ÅÍôIªåÿŸ>ÆÓöÐüû³ÛôÿJJJ888©©©½½½ÿJJJ888©©©½½½ÿJJJ888ÈÈÈžžžÿŸ>;3 ÅÍôIªåÿŸ>ÆÓöÐý³ÚÛÿJJJ888ÈÈÈžžžÿJJJ888©©©½½½ÿŸ>ÆÓöÐüû³Ûôÿcü÷nd³ÚÛÿ>>888ÜÜܾ¾¾WWWŠŠŠ333ŠŠŠbbbÿ%%%ÊÊÊìììÒÒÒÌÌÌvvvÿìììððð555ÛÛÛ888PPPxxx%%%yyyM% ÿðåüËó JJJ¶¶¶ööö èèèÿJJJÒÒÒfff888bbbÿÿJJJÒÒÒ®®®CCCÿÿJJJëÄÃfff888bbbÿÿJJJëÄÃfff888bbbÿÿeù–Ð ƒ×ï0M% ÿÿŸ>jÑ5wÙ;3 !'Pÿÿeù–Ð ƒ×ï0M% ÿÿJJJ¶¶¶fffWWWCCCÿÿJJJÒÒÒfffCCCÿÿJJJ¿Åîfff888bbbÿÿŸ>–Ð wÙ;3 M&%ÿÿŸ>–Ð ƒ×ï0ìM&%ÿÿJJJÒÒÒfff›ebbbÿÿJJJ¿ÅîfffCCCÿÿeù–Ð ƒ×ï4.M% ÿÿcü÷ÒÛã M&%ÿÿ#mn à°MÑÕ¸&þ444ÿM&%ÿM&%ÿ/<=ÈÆfffpr/M&%ÿ!'PÿCCCÿA;áááfffysJ"ó!'PÿßÙ°444ÿùê©……“··***[[ù444ÿÌÌÌM&%ÿM&%ÿ/~—ÅÍCzÞ;3 n /M&%ÿ³ÚÛèèè›ïRÿÆÓöeù­ÖÚr\ÀÿìììèèèèèèPPPñññÌÌÌÚÿ&é=V ;=V&éÂÂÂìììMuŽ)QjMu޳‹r Ü  Ü )Qjáááññññññááá333...444ÿ êêê888ŠŠŠÍÍÍ...333~~~ÍÍÍbbbÿ888888ÛÛÛ¶¶¶ÛÛÛJJJˆˆˆÌÌ̾¾¾¶¶¶HHHHHHËËËË–hew IDATËËËËË888ˆˆˆÈÈÈ%%%ÿÁéçØþüðî ð +++RRRÿááᢢ¢êêêÿÜÜÜžžžÒÒÒBBBšššÿááá½½½¶¶¶ 4üò‰'ÿÜÜÜžžž¶¶¶œÿøê60ÿÜÜÜžžž›ïÈ ä=”ÿ°(@³ÛôaÂýßÿ‘SŒøÿ/ž)ßÙ°›ïÿçRÿ›ï³Ûô¶¶¶öööÿ©©©½½½áááxxxšššÿááá½½½ááá(ìè;‡ÿÜÜÜžžžaÂý²ÓÿýÇÿ[þ³ÚÛaÂýŸ53ðŒŠÿÐý³ÚÛáááNä¦ö0ÿwy¯žžžááá2e¨Íýþÿ¿Åî½½½›ï4-¼ˆXÿ—Åî³Ûô  ìZ2ÿcðõ³ÚÛ¾½Æû‚ö<ÿHÚÌÌ̳ÚÛM&%ÿ×þÿÑüýÈÆmûõë^ˆÿâŽÑüý³ÚÛ!'PÿßÙ°Þä íó"øBC¡úÅÿ©©©Þä ßÙ°!'PÿÌÌÌããW{{)kâ¥ö=ÿ¥¥ÌÌ̳ÚÛ³ÚÛÑüý‚iùH£ ÿù7ÿÅÍô’ôøÑüý³ÚÛM&%ÿM&%ÿèèè—Æ·Vÿ›ï})ÿÐüû‹ŸÛèèèÿšššÿêêêÿèèè...fffñññ ;ø7:ç(=VÃÁ¦>Óëêbbbÿþçý³‹rׯ–)Qj³‹r4- ÌÓöÌÓö Ü ÕÕÕ+++RRRðððÒÒÒ®®®ÂÂÂ... TTTáááÈÈÈ©©©888888%%%cccÛÛÛ°°°BBBJJJÒÒÒŠŠŠ$$$xxx%%%¼¼¼ÛÛÛ )èóõÞ åþ ðááá ð++++++ËËË®®®444ÿñññÌÌÌÿèèèM&%ÿ³ÚÛM&%ÿ³ÚÛ!'Pÿ *Ó¯¯!'PÿßÙ°ÿèèèÿèèè444ÿñññÌÌÌ!'Pÿ0mГßÙ°M&%ÿ³ÚÛM&%ÿ³ÚÛ444ÿüóä ÌÌÌ!'PÿßÙ°ÿèèèM&%ÿ³ÚÛ444ÿñññÌÌÌM&%ÿ×þÿ)/Ñüý×þÿ)³ÚÛ!'PÿýÔÞä "óÞä ýÔý,ßÙ°444ÿÌÌÌ444ÿùããÌÌÌ444ÿÌÌÌM&%ÿ/n ’ôøÑüý³ÚÛM&%ÿ³ÚÛÿeù›ï5 ô³ÛôS*ÿüÖçúóÝÜbbbÿ¢¢¢‚‚‚fffÿJJJžžžCCCÿâàÅóõ+++WWW³‹r+-®ê444ÿØÕVYëê)Qj¯­’(+-®êCCCÿÕÕÕ^^^®®®ÌÌÌ$$$ÿðððñññfffŠŠŠ333ŠŠŠ444ÿ...áááñññSSSÛÛÛJJJÛÛÛ­­­...žžžvvvÿììì888~~~...JJJÛÛÛÛÛÛáááDDDyyyÿ555ËËËúóõöööDDDÓѶ(Áé èèèÌÌÌ444ÿÌÌÌèèè³ÚÛ³ÚÛßÙ°ÙßÙ°èèèèèèÌÌÌßÙ°!ÿßÙ°³ÚÛ³ÚÛÌÌÌ44ÿÌÌÌßÙ°èèè³ÚÛÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛ&%ÿ³ÚÛM&%ÿ³ÚÛ!'PÿýÔý,ÞäßÙ°PÿßÙ°!'PÿßÙ°ÌÌÌ444ÿÌÌÌ444ÿããÌÌÌ444ÿÌÌ̳ÚÛM&%ÿ³ÚÛ&%ÿ’ôøÑüý³ÚÛèèè‘öÿ?ôœ[Lÿ¥¨ #$ÿüÖçúóÝÜžžžÜÜÜÿèèèÿÿ&éø7+WWW³‹rW+ùÕúÓ+ùÕúÿðððþçý骧Úÿ($$$(+-ÿ+++$$$ŠŠŠvvvÿêêêììì888ÒÒÒ...888žžž¾¾¾ÜÜÜJJJðððÒÒÒÍÍÍDDD%%%%%%¦¦¦bbbÿ¶¶¶+++ÕÕÕ5 ôÁöéëéDDDhQ$ŠŠŠM&%ÿ³ÚÛ!'PÿßÙ°444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛÿöööm7 Nãê3ƒTÿŸu2.î ýÔóÝÜÿ^^^ììì¶¶¶èèèÿööö555ññññïÔ(=Vëê+-®êÿöööñØþçýMuŽº¶xùÕú+-®êÿöööhhh®®®BBB®®®ÌÌÌÿöööfffšššžžžÿööö&&&...tttíííyyyÿööö&&&BBBìz°èa IDATììJJJÛÛÛ%%%TTTbbbÿ%%%‘‘‘öööúóõ+++ÕÕÕ:::$$$¢¢¢èèèM&%ÿ³ÚÛM&%ÿ³ÚÛÿèèè #$ÿ.-7l°i÷üÚ°ÿèèèÿööö&&&ñññ...ð´ÌÓö=Vááá½½½ÿöööñïÔ(Mu޳‹r4- áLžžžÿööö555ñññBBB®®®...ááá½½½ÿööö...¾¾¾...ÒÒÒÌÌÌÿööö ööö&&&BBB666îîîšššÌÌÌÿööö&&&JJJ———½½½RRRÿÆÆÆ:::$$$˜˜˜FBþ@¶¶¶:::žžž #$ÿ÷, ýÔóÝÜÿööö ööö&&&...áááÕÕÕèèèÿöööBBB Ü áLÒÒÒÌÌÌÿööö ööö&&&...áááÕÕÕèèèÿööö ööö ööö ÕÕÕèèèÿööö&&&ÌÌÌÿöööDDDñññÕÕÕèèèÿ:::ÆÆÆöööDDD$$$ׯ–4- —Æ:::ÆÆÆoooÿööö ööö èèèÿööö ööö ööö èèèÿööö ööö èèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿööö?þ³Ûôÿ:::ÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿÎó2 IDATèèèÿèèè€ÿÿi:þÌÓö³ÛôÿèèèS*ÿS*ÿS*ÿ­ÖbbbÿžžžS*ÿÌÒâ³ÛôS*ÿ­ÖS*ÿ­ÖS*ÿ­ÖS*ÿ­ÖS*ÿ­ÖK)Qÿµ×¯šššÿ"î¾ÞBfff³/+ÿ(*J©«S*ÿ­ÖS*ÿ­Ö•ï IDATšššÿ"î¾ÞBfffšššÿPPP¬¬¬ÿܬð$TTTTšššÿ"î¾ÞBfffšššÿ"î¾ÞBfffšššÿ"î¾ÞBfffS*ÿ­Öšššÿ"î¾ÞBfffšššÿ"î¾ÞBfff~W…ÿ;5<Gt?¼ˆXÿÅËÒ­Öë^ˆÿ g< ;<šššÿ"î¾ÞBfffšššÿ"î¾ÞBfffS*ÿ­Ö¼ˆXÿS*ÿbbbÿbbbÿvvvÿS*ÿvvvÿ¼ˆXÿS*ÿ¼ˆXÿS*ÿ¼ˆXÿS*ÿ¼ˆXÿÿû‘ÿ¼ˆXÿS*ÿ¼ˆXÿS*ÿK)QÿK)Qÿ444ÿšššÿšššÿ444ÿ³/+ÿ¶WUÿ¼ˆXÿS*ÿ¼ˆXÿS*ÿšššÿ¼ˆXÿêêêÿêêêÿ444ÿCCCÿíZ!ÿ³/ÿTPÿ%#ÿ#ÿ #$ÿÿ444ÿCCCÿbbbÿ²1TÿK)Qÿ¼ˆXÿS*ÿbbbÿ‡»ëÂðbbbÿbbbÿáááááábbbÿbbbÿ$$$³á $$$bbbÿÞBGpÞBGpbbbÿ þ.GpbbbÿM&%ÿÅËÒ‚X™M&%ÿbbbÿÞBGp444ÿÞBGp3.43.4......³/+ÿš÷ú—ÏжWUÿbbbÿ‡»ëÂðbbbÿÞBGpšššÅËÒ—i@JJJÿ¬¬¬ÿ¬¬¬ÿÖÖÖÿÿ444ÿCCCÿ³/ÿ/:+ ³/ÿ!ÿM&%ÿ{ÿ ÿÑÓö;`ÿ#ÿ,óê+ #$ÿÿM% ÿ%#ÿS*ÿÿÚÚÚbbbÿÿCCCÿ333CCCÿ!'Pÿ>[6g!'PÿÿRÿ½†"ÿÇ¿*ÿM% ÿK ÿê60ÿ|*(ÿlõ;ÿÑùÿ O'ÿ)T„ÿl¾‰ÿ)T„ÿÿ¼ˆXÿºî;5.S*ÿ888ááለˆ888ááለˆ888#숉RîÈÈȈˆˆšššÿƒ|³Œ‹bbbÿšššÿÅé“Åé“bbbÿú$$óÏþÈÈȈˆˆob3ÌÓûÌÓû²Õl888ŠŠŠŠŠŠ¶¶¶šššÿšššŠŠŠbbbÿ~W…ÿýÕͦB~W…ÿ888-%ŸÈÈȈˆˆ8/]  Ano [÷ááá [÷šššÿ÷'(÷'(bbbÿfff;5.á8¶¶¶^^^——————ÖÖÖvvvÿäääËËËáááÿ³/ÿ'ûÑúÊüú!ÿ*þæä€TSÿ ÿ ÐÌõèõ7 D Õ5 ôÔàøüâüÌÒâS*ÿÿü öòö ¬¬¬^^^ ãâ×°¯áááÿ!'Pÿ*ŽËû™øýi:þ<4 94- K ÿg Éùûn  O'ÿÉð›Åú3 #$ÿÿ)T„ÿ)þÎÏÇý)þÎ!'Pÿ¯LÁ IDAT¤p@‘žÍ×°¯‡»ëbbbÿPPPÆÆÆ§§§°°°bbbÿbbbÿ¸¸¸333xxxbbbÿbbbÿ#ìˆUô¹Mbbbÿbbbÿ¿tq› e÷ñˆˆˆbbbÿÈÈÈÑÍúˆˆˆbbbÿÀ¥ýÍÖÿíó"š ÖbbbÿS*ÿ‘žÍÿçÿçS*ÿ444ÿ~~~êêꌌŒ444ÿÈÈÈfffRRRˆˆˆK)QÿýÕÍ|/‹;5<K)Qÿbbbÿ-%Ÿe]×zbbbÿ¶WUÿÿبììëììëÄÄĶWUÿbbbÿÓ<b´bbbÿÈÈÈËÅĈˆˆbbbÿç¹Z&özbbbÿÿÍÍÍ333———666ÿäää &&&ÕÕÕááá[ß÷–ÏñÏðaÂýMÑé*ÖùûÐøúûÀ¼ éëéëõÔùÿ ÕóãÿãµÒ2`0ÿÔàøÔàøÌÒâÿü ö÷  ÷ü öÿ×°¯4-<= ãâíç¾ÒæþüÂÌÍïÇßÙ°ÿÌÓöŸê†fâöÇøÖùûoèîÈåäÉùûÿî¿çëÍü¡e›Ë~ÕóÝÜ床ÏÕþæ¢ÊÆÆÆ÷ñÈÿ‘žÍ4-4- ãâá8888ÂÂÂ888ññññññÍÍÍððð888úÐù0¸]äbbbÿ÷¬©ôðäã§ñõ–jiòñbbbÿšššÿÎîÅåââÑÍúu™Cbbbÿú$$äëÿ±Áþ˜¡Ãú$$;5.ØýãþçýLxÌÓûfffööö˜˜˜...šššÿðððÜÜÜ$$$ŒŒŒbbbÿ3.4ÎçþÎçþÎçþdƒŽ888ÃÅö‹ŠË¶WUÿ ËÆoØÛƒìðƒìð‚€£·¶¶WUÿ888ÐÆûšŒôÊÆùÐÆûšššÿú$$ÍÎþËÅħרbbbÿ888;5.ÅËÒN+¨ËËË666TTTöööööö½½½èèè f :- èèèÿÃ,!!3..Öùû¦ñõ õúü öéþëê ,ÞÎýóÝÜí &é\0"ßûü³ÛôèèèöíòòòÁèéá8%%%öžžžèèè èèèÁé4- paCzÞ®ê÷‘¦ñõÉûýèèè 3,èèè -4èèèÁèéá8;5.4-žžžÿÈÈÈÊÊÊÊÊÊÿÈÈÈññññññÿÈÈÈôùüÙüÆÓö63ÒÒÒ üýäãäüýYÉÛ çÿÈÈÈåââåââëñG!5ÿÜÜ äëÿäëÿÜÜÿÅËÒ&éÚÿ&çýÚÿ\-³ÚÿÈÈÈ êêêáááÿÜÜÜñññÜÜÜÍÍÍÿÍÒÌÔüÿ,ÿÈÈÈðêöÉÍùÉÍùýØÖƒìðäüýÙúûC ôýØÖÿÈÈÈ0[ÐÆûÐÆûÿÈÈÈÍò"ÍÎþÍÎÂ9ÿÈÈÈçñÒÌÒâ4.4.áöööžžž***lllèèèööö&&&...¶¶¶òòòÿÊúú6Ù?3..˜ÄÅèèè ð/- óÈèÝèöööÿóê+ Éã¯èöööú60"—Åîÿööö òòèööö555%%%‘‘‘èèèÿ 8Z¦ûþööösD<4 [’öšþ÷û„ÖØëÍüøÉñÿ 8-4׬|ööösE;&ö\Àèèèÿööö>>>888ÈÈȶ¶¶èèèÿööö>>>888ÈÈȶ¶¶èèèÿöööoå9Q888ÈÈȶ¶¶èèèÿöööTTT888ÈÈÈÒÒÒÌÌÌÿööö$ûM0Y888ÈÈȶ¶¶èèèÿöööòtbLàíó" Þ¶¶¶èèèÿ3ôñ4.;5.ÅËÒ—ÅîèèèÿöööTTT888©©©ÕÕÕèèèÿööö$ûaDm$$$ÈÈȶ¶¶èèèÿ÷7.3.4ÍÒÌÍïÇèèèÿöööEC:888ÈÈȶ¶¶èèèÿ5 f (*53ËùÍýØÖMÑÕÿöööÿU?>888ÈÈȶ¶¶èèèÿöööòtb8à888ÈÈȶ¶¶èèèÿööösEá8888ÈÈȶ¶¶èèèÿööö555žžžÿööö555½½½ÿ èèèÿööö?³ÚÛÿFB-®êÿöööòÿA ÕóÝÜÿööö=þû³Ûôÿöööòòòÿööö?<=žžžÿ èèèÿööö?þ³Ûôÿ¥!˜ÝÞµô÷ÿèèèÿ èèè{ÓÇÓ IDATÿööö?<=žžžÿöööËËË èèèÿöööËËË èèèÿöööêêê èèèÿöööKýäüýÑ èèèÿööö$ûõåû÷ èèèÿöööòtòã‹ èèèÿ3ôñþçýÍ èèèÿööö ööö èèèÿööö$ûõåû÷ èèèÿ÷7.þêÿÔüÿû ÉèèèÿöööäääèèèÿAöó}w ³ÚÛÿèèèÿöööÿ.-ðÒÓ õôèèèÿöööêêê èèèÿööö?þÁé èèèÿèèèÿèèèÿ èèèÿöööòòòÿèèèÿèèèÿèèèÿèèèÿèèèÿöööòòòÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿèèèÿ èèèÿèèèÿèèèÿ èèèÿööö èèèÿ èèèÿèèèÿèèèÿèèèÿÿÿÿÿÿÿÿÿÿªE@y IDAT€ÿbbbÿ444ÿ444ÿ444ÿ})ÿ444ÿM% ÿ #$ÿ0P'ÿM&%ÿ444ÿÿÿbbbÿ444ÿK)Qÿ444ÿ444ÿ444ÿM&%ÿ444ÿ-QQÿ444ÿ-QQÿ444ÿ Òh IDATM&%ÿM&%ÿbbbÿ888äää444ÿxxxäää})ÿ:- äääK ÿ/ #$ÿŸ‰ˆèÈñ #$ÿ!'PÿM% ÿpa äääÿbbbÿ888äääIPÿ,3äääRÿVPûäääM&%ÿnccäää-QQÿdpqäää-QQÿdpqäääM&%ÿ4-ËòóÖÖÖÿbbbÿbbbÿ444ÿ·Vÿ444ÿ444ÿM% ÿ0P'ÿ444ÿM&%ÿ444ÿÿÿbbbÿ444ÿbbbÿ444ÿÇ¿9ÿ444ÿbbbÿ444ÿ”¿Šÿ-QQÿ‘ÁÂÿ-QQÿbbbÿ444ÿ888<<<èèè¶¶¶èèè:- ÆÓöèèèé(+’äæ#-¶¶¶èèèB2`w­èèè èèè888<<<èèèÒÒÌèèè 2÷Îçèèèö’èèè2²‚èèè+7n²‚èèè4-Gpèè茌Œˆˆˆááá...ÆÓö¾UóØÕÝÓý...ÿOU„ÿÿçMööööáááSSSç±îQRº“ÝVPûëÄÃL «ÄÊ©……œ©……ëÄÈT$bbbÿPPPBBB444ÿ¶¶¶·Vÿ0›ïK ÿòñ #$ÿ2;¶¶¶!'Pÿ Þ÷ñÈM% ÿpb&äääÿ+++òòòbbbÿÈÈÈBBBIPÿð\5÷ñÈ·Vÿ3ó—ÆM&%ÿ=Ëòó-QQÿU<6ÕÕÕ-QQÿ99ÕÕÕS*ÿá8~~~ÿšššÿbbbÿÿCCCÿ444ÿÿ·Vÿ444ÿÿ444ÿM&%ÿÿ0P'ÿ444ÿÿ #$ÿ444ÿÿM&%ÿ444ÿÿÿÿÿvvvÿ444ÿÿK)Qÿ444ÿÿ½†"ÿ444ÿÿ¶WUÿ444ÿÿvvvÿ-QQÿÿvvvÿ-QQÿÿS*ÿ444ÿšššÿÿCCCÿÿò‰'ÿÿ|*(ÿÿ0P'ÿÿOU„ÿÿS*ÿÿÿÿšššÿÿK)Qÿÿÿù7ÿÿCCCÿÿ?ƒTÿÿXˆ¿ÿÿÁ“"Y IDATbbbÿÿ ÈÈȈˆˆ ... ÆÓö¾Uó ØÕ/ ÝÓý... õô!P ÿçMöööö ÍÍÍSSS þêÿ‚#! úÐùËÅ —ÏмXV É Þ©…… ·ÛÛ©…… ÌÓûˆT$444ÿPPP 444ÿ })ÿÅÍô K ÿÑüý #$ÿ2; #$ÿ Þ M&%ÿ ÿ444ÿÈÈÈ IPÿ,3 Rÿ¾ë M&%ÿ= 444ÿU<6 444ÿ99 M&%ÿñÈ ÿšššÿbbbÿÿCCCÿ444ÿÿ·Vÿ444ÿÿ444ÿM% ÿÿ0P'ÿ444ÿÿ #$ÿ444ÿÿM&%ÿ444ÿÿÿÿÿvvvÿ444ÿÿK)Qÿ444ÿÿ½†"ÿ444ÿÿ¶WUÿ444ÿÿvvvÿ-QQÿÿvvvÿ-QQÿÿS*ÿ444ÿÿšššÿCCCÿÿCCCÿÿò‰'ÿÿ444ÿÿÿ0P'ÿÿOU„ÿÿS*ÿÿÿÿšššÿÿK)Qÿÿÿù7ÿÿCCCÿÿšššÿ-QQÿÿšššÿ-QQÿÿbbbÿ ÈÈÈttt ... ÆÓö¾Uó ØÕ ÝÓý... õô... ÿçMöööö ÍÍÍBBB þêÿ... ÄÌô“‹ —ÏÐL  ·ÛÛgn9 ·ÛÛdpq ÌÓû...JJJÜÜܽ½½eùÅÍô3ôññØõ 2; 8 Þ5 ô³á öööJJJÈÈÈ1û8,3Ÿ>¾ë5 xFE99¥éºÓ¯¯99¾î%Ó¯¯i;ÿšššÿÿÿCCCÿÿÿ·Vÿÿ!ÿM&%ÿÿÿ0P'ÿÿÿ #$ÿÿÿM% ÿÿÿÿÿÿCCCÿÿÿK)Qÿÿÿ½†"ÿÿÿCCCÿÿÿ?ƒTÿÿÿXˆ¿ÿÿÿS*ÿÿÿêêêÿCCCÿÿCCCÿÿ·Vÿÿ|*(ÿÿÿ0P'ÿÿOU„ÿÿS*ÿÿÿÿšššÿÿOU„ÿÿŠ„/ÿÿM&%ÿÿ‘ÁÂÿCCCÿÿ‘ÁÂÿCCCÿÙ[/ IDATÿbbbÿèèè~~~èèèÕÕÕèèèaÂýßûüËòóèèèèÈñèèè õôèèèËó èèèèèèÕÕÕèèèÍïÇèèè[’öèèèÕÕÕèèèÙ•ÄèèèÀYèèè—ÅŒ½½½iiieù;3 3ôñÑûäèèèõ |\…õ ]W(5 ³á ööö1û8ì0i:þuu5 3..®Â’½½½ÇÇý½½½5 ÿbbbÿÿÿ444ÿÿÿ·VÿÿÿM&%ÿÿÿ0P'ÿÿÿ!'PÿÿÿS*ÿÿÿÿÿÿbbbÿÿÿ444ÿÿÿ½†"ÿÿÿ444ÿÿÿ-QQÿÿÿ-QQÿÿÿS*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòž.ù IDAT€ÿS*ÿ¼ˆXÿK ÿY ÿM% ÿ½†"ÿS*ÿCCCÿM% ÿCCCÿ‰…VÿÿRÿ·Vÿò‰'ÿÌÒâÅËÒ¼ˆXÿK ÿÈ÷ù éÿM% ÿ%#ÿTPÿŸêÿù7ÿ—ÅîšššÿËó âÉbbbÿ%#ÿRÿ%#ÿÿvvvÿvvvÿÿ¬¬¬ÿvvvÿÿvvvÿvvvÿSQ(ÿÿ#'Všššÿÿû‘ÿ})ÿM% ÿÿM% ÿM% ÿ})ÿ·Vÿ})ÿ})ÿRÿÿÚq®êaÂý&ñRÿCCCÿCCCÿbbbÿ¬¬¬ÿ})ÿRÿÁéÌÒâÅËÒÃØþüM% ÿí ×úû éÿM% ÿéëùÕúTPÿÁé¸]äRÿèè謬¬ÈÈÈšššÿèèèÁéñÈbbbÿÿ\/ÌÓö(%#ÿÿ+++ÍÍÍvvvÿÿ+++ÊÊÊ$$$vvvÿÿ^^^ttttttvvvÿRRRÿRRRÿíZ!ÿíZ!ÿZz× IDATÅÇð‚‚‚<<<šššÿTV—RÿÿÿTPÿ444ÿvvvÿCCCÿM% ÿÿM% ÿ\††ÿCCCÿ\††ÿCCCÿ})ÿÿÿÿ})ÿCCCÿvvvÿ444ÿÿRÿÿò‰'ÿ})ÿRÿ·VÿRÿCCCÿÿ½†"ÿRÿCCCÿbbbÿbbbÿÿÿÿbbbÿRÿÿM% ÿRÿÿÿ·V.ÿ¼ˆXÿÿÿM% ÿÿÿ0ÿY ÿM% ÿÿÿRÿŠ„ÿÿÿ½†"ÿÿM% ÿCCCÿÿM% ÿCCCÿÿM% ÿ%#ÿÿ!ÿM% ÿÿÿ444ÿCCCÿÿÿvvvÿÿÿÿCCCÿÿÿ¬¬¬ÿÿÿCCCÿRRRÿÿÿRRRÿ444ÿRRRÿvvvÿ¬¬¬ÿêêêÿò‰'ÿò‰'ÿúÁ/ÿÿúCÿÿû‘ÿbbbÿyûüÿšššÿQQÿµZ†ÿÿÿTPÿCCCÿ444ÿÖÖÖÿTPÿRÿTPÿRÿÿÿM% ÿ444ÿS*ÿÿÿvvvÿbbbÿCCCÿCCCÿ})ÿ·Vÿ\††ÿÿÿÿCCCÿ444ÿÿ})ÿ·Vÿÿ})ÿvvvÿÿÿCCCÿ444ÿCCCÿbbbÿCCCÿCCCÿÿRÿÿRÿ})ÿ·Vÿÿÿÿÿû‘ÿCCCÿÿÿÿ½†"ÿÿRÿCCCÿCCCÿÿM% ÿÿÿRÿÿM% ÿS*ÿÿK ÿM% ÿÿÿ0ÿY ÿM% ÿÿ%#ÿTPÿÿM% ÿÿù7ÿÿM% ÿbbbÿÿM% ÿbbbÿÿÿ%#ÿÿ!ÿM% ÿÿ444ÿÿÿ444ÿÿÿCCCÿÿvvvÿÿÿvvvÿÿêêêÿRRRÿ¬¬¬ÿÿÿÿRRRÿvvvÿò‰'ÿÿû‘ÿÿÿÿò‰'ÿíZ!ÿ444ÿA‚ÿÿÿÿbbbÿK)QÿÿÿvvvÿTPÿvvvÿvvvÿÿRÿÿÿÿRÿ½†"ÿTPÿTPÿRÿvvvÿÿÿvvvÿ444ÿCCCÿCCCÿÿ·Vÿÿ})ÿvvvÿÿ\††ÿÿ})ÿ·Vÿvvvÿÿÿvvvÿ444ÿÿÿÿbbbÿÿò‰'ÿÿò‰'ÿRÿ½†"ÿCCCÿÿÿÿÿÿÿÿÿRÿ½†"ÿÿCCCÿbbbÿÿbbbÿÿM% ÿÿM% ÿÿM% ÿS*ÿÿK ÿRÿÿÿ!ÿM% ÿÿ%#ÿTPÿÿM% ÿ½†"ÿÿCCCÿšššÿÿCCCÿbbbÿÿÿM% ÿM% ÿÿÿ444ÿCCCÿÿÿÿCCCÿÿÿ444ÿCCCÿÿ444ÿRRRÿRRRÿ¬¬¬ÿRRRÿ¬¬¬ÿ444ÿÿÿíZ!ÿúÁ/ÿÿû‘ÿò‰'ÿÿû‘ÿ444ÿÿÿ444ÿbbbÿé%ÿbbbÿ O'ÿ444ÿÿbbbÿ444ÿÿ¬¬¬ÿÿRÿÿÿRÿÿTPÿ})ÿRÿ})ÿÿÿCCCÿvvvÿS*ÿCCCÿbbbÿbbbÿCCCÿÿ})ÿÿRÿÿ¡úÅÿ444ÿÿRÿ})ÿCCCÿvvvÿCCCÿÿCCCÿbbbÿbbbÿÿÿRÿRÿÿ})ÿÿû‘ÿÿÿÿÿÿÿÿ})ÿ½†"ÿ})ÿÿ½†"ÿÿbbbÿÿ¬¬¬ÿÿ})ÿM% ÿÿM% ÿS*ÿÿM% ÿTPÿÿÿY ÿM% ÿÿM% ÿTPÿÿRÿ½†"ÿÿS*ÿÖÖÖÿÿM% ÿbbbÿÿÿÿÿÿÿÿÿÿÿÿÿÿ444ÿ444ÿ444ÿ444ÿÿÿÿÿÿÿÓQ\ IDATÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿRÿRÿÿRÿM% ÿÿvvvÿS*ÿÿ·V.ÿM&%ÿCCCÿÿCCCÿbbbÿÿbbbÿCCCÿM% ÿ·Vÿÿvvvÿ\††ÿÿ·VÿM% ÿCCCÿCCCÿvvvÿCCCÿCCCÿbbbÿÿÿ})ÿM% ÿÿ½†"ÿ·VÿÿÿÿÿM&%ÿM&%ÿÿM% ÿRÿÿCCCÿbbbÿÿRÿÿRÿÿM% ÿ¼ˆXÿÿM% ÿM% ÿÿ!ÿM% ÿÿ%#ÿŠ„ÿÿRÿ·VÿÿbbbÿCCCÿÿM% ÿ¼ˆXÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿTPÿTPÿÿÿTPÿÿCCCÿ444ÿCCCÿM&%ÿ|*(ÿM&%ÿCCCÿ444ÿCCCÿÿ})ÿ\††ÿCCCÿÿ})ÿÿÿÿÿCCCÿ444ÿCCCÿÿCCCÿ444ÿCCCÿÿRÿ·VÿRÿ½†"ÿÿÿÿÿÿM&%ÿÿ½†"ÿÿÿCCCÿbbbÿ})ÿÿM% ÿÿS*ÿ¼ˆXÿÿM% ÿÿY ÿM% ÿÿTPÿŠ„ÿÿ½†"ÿÿbbbÿCCCÿÿbbbÿ¼ˆXÿRÿšššÿM% ÿÿÿCCCÿbbbÿÿS*ÿíZ!ÿò‰'ÿM&%ÿ{ÿñŠ[ÿÿ!Oÿ#ÿCCCÿÿM% ÿK ÿ%#ÿÿÿšššÿ444ÿCCCÿšššÿ444ÿ444ÿ})ÿÿ})ÿCCCÿCCCÿÿÿÿ³/+ÿì[XÿM&%ÿÿp¼$ÿ¥ö=ÿÿCCCÿ$$$ÿCCCÿRÿ})ÿ½†"ÿ·VÿÿM% ÿS*ÿÿK ÿM% ÿÿ!ÿY ÿÿM% ÿTPÿÿM% ÿÿù7ÿÿS*ÿbbbÿÿM% ÿbbbÿÿ¬¬¬ÿêêêÿÿÿ444ÿCCCÿÿM&%ÿ³/ÿíZ!ÿM&%ÿÿ{ÿ²ÿM&%ÿÿ#ÿ ÿÿ Oÿ!W½ÿÿÿ!ÿK ÿÿÿÿÿÿCCCÿbbbÿÿ444ÿ=:öÿÀÆûÿCCCÿÿò‰'ÿÿû‘ÿCCCÿÿé%ÿ³/+ÿÿÿA‚ÿp¼$ÿÿ-QQÿ‘ÁÂÿCCCÿÿÿM% ÿRÿÿM% ÿS*ÿÿK ÿRÿÿ!ÿY ÿÿM% ÿRÿÿM% ÿ½†"ÿÿS*ÿCCCÿÿM% ÿS*ÿ3Ñ;ä IDATÿÿÿÿ|*(ÿM&%ÿÿM&%ÿM&%ÿÿÿÿ#ÿ Oÿÿÿÿÿÿÿ444ÿCCCÿ¬Aøÿs=÷ÿ444ÿÿ444ÿRÿÿÿÿÿÿ!'PÿOU„ÿÿÿÿÿÿM% ÿS*ÿÿM% ÿTPÿÿ!ÿM% ÿÿ%#ÿRÿÿM% ÿ½†"ÿÿbbbÿšššÿÿCCCÿbbbÿÿÿCCCÿ444ÿÿÿÿÿÿÿM% ÿ·V.ÿÿÿM% ÿRÿÿÿY ÿM% ÿÿÿM% ÿÿÿ·Vÿ½†"ÿÿÿbbbÿšššÿÿÿCCCÿCCCÿèèè½½½èèèèèèèèèÿôÊýüèèèÿþçñÌöèèèÿÈíì8éèèèÿËóôèèèÿ–Ïñ4ü èèèÿñÈÈÈèèèÿ âÉ=V!ÿ•(„¨ IDAT€ÿ444ÿ444ÿbbbÿbbbÿSQ(ÿSQ(ÿSQ(ÿ‰…Vÿ‰…Vÿ‰…VÿSQ(ÿSQ(ÿ‰…Vÿððð444ÿ‰…VÿðððCCCÿSQ(ÿSQ(ÿvvvÿvvvÿšššÿÖÖÖÿšššÿvvvÿCCCÿbbbÿ888888SQ(ÿSQ(ÿSQ(ÿSQ(ÿSQ(ÿSQ(ÿSQ(ÿSQ(ÿ‰…VÿCCCÿ:SQ(ÿSQ(ÿÿ³/ÿò‰'ÿ‰…Vÿ64.K ÿ³/ÿ64.ÊÌÒ ÿ!OÿÊÌÒÿ&Pÿ*‚ÿÿœž²M% ÿSQ(ÿ‰…VÿÿÿSQ(ÿSQ(ÿSQ(ÿÿRRRÿvvvÿSQ(ÿSQ(ÿÅÇð{,RÿXˆ¿ÿ­¯ØSQ(ÿÊÌÒÖ ËÇ]ÊÌÒñññ444ÿÿ{ÿì[XÿSQ(ÿÿ!Oÿ`ƒÿ‰…Vÿ)T„ÿiÀÁÿ­¯Ø‰…Vÿ})ÿRÿ‰…Vÿ­¯ØCCCÿšššÿvvvÿììì Ü º¶x«|@#ìˆ Ü 333bbbÿšššÿ888¸¸¸¸¸¸bbbÿÿÿšššÿSQ(ÿ64.64.SQ(ÿ64.64.64.64.‰…Vÿ‰…Vÿ64.64.‰…Vÿÿ+++žžžÿ›ÿ?ZûÑú/wÙÿ3ôñ07 MÑéSQ(ÿ²¼Ú üôþ8 h6Hw{ªÿì8ü2-;Ï“üÚ°ÿ3ôñØþü&éµô÷SQ(ÿ»½æ qm>w{ªÿ:::$$$ðê•v|Ñÿ ea2½•-Îg5nÉΓYw{ªSQ(ÿÅÇð›ÿ?Z8:b59£ôáã ÌÌÌÿcü÷qG*ªÕ7ÊÐÿ 7öa¦ ¿êAs–#êèèèÿ.ÑÅľô­ Ä'w{ªÿööö=þûÖùûËVT¥¨ÿööö"AÞÔ÷R` }æÿ;9ÅÇð 8;_6-ÿÐw{ªÿeùÎãø6F ®êÿ5 ô4.ÌÒâ³Ûôÿ3ôñÚÿÛÝøM% ÿ4- ®êS*ÿ;5.Dx¨CCCÿŠŠŠÿ‚‚‚~~~èèèÿi:þ¤Ñò(+i6CzÞšššÿ‹‰n/- ùÕú4- <4 ÄÌôõ$`ŠŠŠÿ+++$$$PPPŒŒŒ```mmm½½½bbbÿ888¸¸¸HHH~~~^^^ìììžžžÿööö...HHH3cd ÙØÄÄÄfffSQ(ÿ­¯ØSQ(ÿ#%Nììì888<<<ÄÄĹ·Ž­¯ØÿðððWWWÜÜÜÍÍÍFBw{ªÿŸ>üÙü'6/wÙSQ(ÿÝ·Þ07 É÷ù…ìñÿíõê%õåû ,ôãû ß±ò”ÿ>)ý©C*‚ÿ-;ý©CSQ(ÿÒÒà&éÚÿ(0Ö(­¯ØôôôJJJ»½æp12w{ªÐøúÃÃ7 ü öøüôþ$_-;&éí í Øþüõòø&&&>>>êêêöööBBBEC,++Ýs˜SQ(ÿ…‰¸üÙü“úÿ“úÿw{ª444ÿ0*’*'þÛØ#3_tÒ(óλ½æDnn÷ñÈ@Ô¬ÍÎþw{ªÿöööÐüûrzlJÌÓöÁéÌÒâ4.èèèÚÿ(ÿÿþçýÌÓö—ÆCCCÿšššÿêêêÿšššÿšššÿCCCÿM% ÿÅËÒÿÿŠŠŠ+++~~~ÿööö¤Ñò4- 4- 4- ùÕúŸê½†"ÿÈÈÈÿ(ùÕú4- ÌÓöÓþüÄÌô<4 ÍÍÍ+++ÜÜܰ°°ttt   “““šššÿ888¸¸¸ñññññññññ~~~```ðððÿ99 ôôôñññ<<< ÙØ÷'(­¯Ø‰…Vÿ:$$$áááÈÈÈÄÄÄ   <<<GIrÿáááñññÈÈÈw{ªSQ(ÿüÙü'üÙü6/ûÑú‰…VÿÝ·ÞÖùûÊ Ðøú{ÿ‰…Vÿ;9%õåû,íÔø ‰…Vÿý¶’*‚ÿ*‚ÿW½ÿÿδÜ&éÚÿ(0ÐüûúÔäèèèááááááèèè ÏðÁé¦ßèèè à Nãêèèè ÷ ÷ ëèèè ,äŒÏ“èèè Í óõèèè ;9ëôèèè ¶¶¶¢¢¢ÿ»½æûñ2é&Ãé#¤“­¯Øèèè [ß÷?ÑÌÌÌèèè [ßãÉùûèèè 64.Í¡î¢/ö64.èèè ÍÎþÈYˆ×¬|èèèÁéŸêÆÓöËó ½‡2ÿ¥oØþüÌÒâM% ÿM% ÿS*ÿÍ 4- 3ôñÖùûÔàøèèèÿÿËËËÈÈÈxxxÜÜÜCCCÿWWWM% ÿocL;5.—ÅîèèèÿÿJJJ¶¶¶$$$vvvÿÿvvvÿvvvÿ444ÿÕÕÕööööööèèèšššÿÿšššÿÿsDüâüÌÓö+%%%>>>(+ÌÓö+-<4 333ÿ333ìììÜÜܰ°°ÈÈÈáááÕÕÕ:::^^^ÄÄÄ$$$ÿ4599 ñññ±±±ÈÈȺ¾í©©©WWWááá$$$¹·Ž;9ðððñññ...áááÅÇð;9šöõÆÓöÊüúûÑú/‰…Vÿw{ª!ÿåüý*Ðøú6óî07 w{ªÿ»½æõåûûöþíÔø,ôãûw{ªúÞãÍüÎ-;ýÓÅÿ*Úÿ&éØþüÐüû0 ËËËÚÚÚÕÕÕ½½½‘åý ›ï èèèòÈ É üÚ°òòò èèèÅÇð ­¯Øèèè èèèèèèèèè Èô‹ÚÚÚ …Ô® œîðÍ  MÑÕ…‰¸ õôôô“ÂïÄ”äääïÄ”ÿ Ëó ›ïèè轇2ÿÄÌøÄÌø éëØþü4.4.ÌÒâ(öööÍ *, Rÿèèè ááኊŠWWWššš©©©šššÿCCCÿšššÿbbbÿS*ÿØþüÅËÒÅËÒi;ÿöööhhh888+++fffŠŠŠ˜˜˜$$$vvvÿCCCÿäääöööòòòCCCÿ~~~©©©üâü4- -+‘‘‘%%%Ëó ØþüùÕúùÕúÄÌôÄÌôðððìììÜÜÜìì쬬¬ÈÈÈHHH +++ÜÜÜÜÜÜ$$$bbbÿòÌË45 --áááÿËËËáááWWW©©©©©©ÄÄÄ<<<ÄÄÄ­¯Ø»½æ333ááá$$$ÍÍÍ»½æ6'üÙüÊüúûÑúw{ªÿÿÖùûÖùûÉ÷ùÊ à· IDATèèè ûöþ  üôþíÔøùñýôãûÿûœüçÿü2ýÓÅ%0-;ÿöööÖùû&éÚÿ(0SQ(ÿ‰…Vÿèèè òòòèèèèèè èèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèè èèèèèèèèèèèèèèèèèèèèèèèèèèèèèè èèèèèèèèèèèèèèèèèèèèèèèèòòòèèèèèèÿ[‘æÌÒâ5 ô óõÌÒâ»ä³ÛôöööØþüÌÓösDöööØþüÌÓöRÿèèè$$$ÿtttÚÚÚŠŠŠšššÿWWWÒÒÒÿ(»ä—Åî£Ñúÿ¼ˆXÿS*ÿhhh¢¢¢ÿJJJhhh©©©ÍÍÍÿËËËöööòòòËËËöööäääÌÓö, ÌÓöÌÓö‡‡‡oooéëØþü4- <4 ```ÍÍÍáááñññðððìììÄÄÄ ¬¬¬ÈÈÈHHH...ñññtttèèèá½½òÌË>>©©©fffÌÌÌ»äÁé ]/öööÅËÒ;5.˜˜˜‚‚‚©©©½½½¬¬¬ìììááá333 ÿ öööñññÁéÉß÷+i6CzÞèèè ‡‡‡hhh4- ÌÓöÓþüÄÌôËËËáááñññáááðððììì©©©¬¬¬ÈÈÈHHH...áááÜÜÜÜÜÜÄÄÄRRRÿèèè ώđ5Œððð ËËËìììÄÄÄ<<<xxxèèè öööBBBáááìììáááw{ªÐüû;3 2L$Öùû*É÷ùÏâá­¯Øÿööö ûöþ,ôãûíÔøèèè äŒúÝü2üÎ-;“ÂÅÇðÃ*Úÿ(ØþüÐüûèèè Áé4.S*ÿ4.ÌÒâÃéëØþüÌÓö?þèèèÿöööñññBBB$$$fff ¬¬¬©©©ÕÕÕ èèèÌÒâsE;5.‘´èèè ~~~½½½èèè ¬¬¬>>>ÍÍÍvvvÿèèè èèèöööÚÚÚCCCÿèèè \/Ôàø¤Ñòi6CzÞèèè ¾¾¾=?Z¤Ñò+ùÕúÄÌô<4 ÄÄÄ ËËË333$$$ÍÍͽ½½èèè ¬¬¬ÈÈÈHHHáááñññÜÜÜÜÜÜHHHèèè ώđQR ÙØŒŒŒèè謬¬ááá<<<¶¶¶ECÚÚÚ®®®ñññáááÕÕÕèèè ÁéÊúúüÙüÊüúwÙèè軽æí ÖùûÿêçÐøúÍ èèèEC÷ ND&ûöþüôþéÈö> õ‰…Vÿ#üÎü2%0ýÓÅèèèE&éØþü(0,ÿöööú(Ëó èèèÿööö èèèÿööö&&&BBBŠŠŠÿèèèÿööösE;5.Dx¨ÿJJJ¶¶¶^^^ÍÍͽ½½ÿööö èèèÿööösD<4 CzÞÿööö&&&...ÃÁ¦(+-H„fffÿööö èèèÿöööTTTðððñññááá$$$ìììžžžÿöööCC45LOOO***ÿööö&&&...¬¬¬òòòÿEC­¯Øÿööö¥! ?Z…çòòòÿööö"úøK “úÿòòò©«\˜ IDATÿööö{wHÊÌÒ»½æEC64.w{ªÿöööòÿA3-;ГßÙ°ÿööö÷ö, Áéòòòÿèèèÿèèèÿööö?þ4.­Öÿ‚‚‚©©©½½½ÿöööòòòÿööö èèèÿööö&&&...ÃÁ¦()QjÍÍͽ½½ÿèèèÿöööTTTðððñññááá...$$$ÜÜÜñññ½½½ÿöööCC5žžžÿööö èèèÿööö èèèÿööö èèèÿööö èèèÿèèèÿqm>“Âèè艅Vÿw{ªÿööööBü2î–èèèÿöööEC64.“Âèèèÿèèèÿèèèÿèèèÿööö555333¯­’(MuŽfffÿöööTTTðððñññHHHfffÿ99Ó¯¯ÿèèèÿèèèÿèèèÿöööõI¯ý©Cÿqm>w{ªÿööö555WWWfffÿöööTTTðððñññWWWfffÿèèèSQ(ÿ­¯ØÿèèèÿJJJ888fffôÆâ IDAT€ÿÿèèèÿM% ÿÿ ðÛÝøÿ èèè0Oÿ04 »¾òå¿ôÿ ð(Ëó èèèÿ ð(4.—ÅîèèèM% ÿ4.ÌÒâ³Ûô444ÿDDD¼¼¼ñññÌÌÌCCCÿJJJTTT¬¬¬ÿ¶¶¶žžžvvvÿ$$$PPPCCCÿŠº»‹‹Á¨xASQ(ÿ­¯ØSQ(ÿ­¯ØSQ(ÿ­¯ØSQ(ÿ­¯ØSQ(ÿ­¯ØSQ(ÿ­¯ØSQ(ÿ­¯ØSQ(ÿ­¯Øÿ5 ô³Ûôööö5  Oÿбñ öööÿåãñðÛùA ÿå¿ôRRRÿ 44+ :;ºhµ×¯ÿ5 ô³Ûôÿ5 ô³Ûô ð(þçýÔùø øÿ5 ô³Ûô ð\0"ʹßÔùøÔàÚ ÿ5 ô³Ûô!ÿ*6G!»äÁ»äM% ÿþçýµô÷bbbÿáááËËË ËËËÜÜÜYYYñññÌÌÌÿ&&&òñÁèé ööö?3..´àáäääèèè444ÿËËË ööö555ñññÌÌÌ444ÿËËË ööö555ñññÌÌÌCCCÿËËË öööÜÜÜYYY½½½444ÿËËË ööö555ñññÌÌÌCCCÿÂÂÂêêêËËˈˆˆ>>>ÿYYY½½½bbbÿððð555yyy‡‡‡ÿËËË555yyyCCCÿ8ÑÌo§§ŒŒŒÿ555ÊÊÊÈÆM&%ÿö½½½bbbÿððð555yyyÿèèèšššÿÜÜÜÜÜÜ555yyyCCCÿ555­­­äääfffÜÜÜÜÜÜñññ½½½bbbÿö&]¶†O ööö&&&™ÉÊg76ÌÌÌbbbÿâI$ÛvvvÿÍÍÍE|î·Xˆ¿ÿ¨xAÿõ .-mII“··ëÇÇ99mII5a,1:64.SQ(ÿSQ(ÿ64.‰…Vÿ­¯Ø­¯Ø‰…Vÿ‰…Vÿ‰…Vÿ‰…Vÿ‰…Vÿÿ64.ÿ64.­¯Ø‰…Vÿ‰…Vÿ­¯ØöööËó M% ÿúÔàøõÔùööö ÿööö åãúý× CCCÿ!'PÿÒÒÒöÌÌÕÿÿš ÉÕÿÿËÅÄËÅÄÒæþÿM% ÿS*ÿ5 ôi;4.CCCÿS*ÿÿM% ÿ!ÿ5 ôi;Ëó 4.!ÿS*ÿÿ6G!÷í ÷¥opb&M% ÿÿ—Åîí í í 5 ôÔàøM% ÿÖùûʹß=þû=þûq|OÒÒÒWWW öööÚÚÚÕÕÕ555ÚÚÚ ÚÚÚ,- öööööö?:ab´àáäääèèèÿ öööööö555DDDSSSÿ... öööööö555DDDSSSÿ444ÿCC öööööö+++555‡‡‡ÿÿááá öööööö555DDDSSSÕÕÕÒÒÒëê>>>>>>¡y`ÛÛÛ½½½%%%ñññËˡ‡‡ÿÖÖÖÿ555{ÿ ã⌌ŒÍÍÍ555TTTÍÍÍúLN/ ãâ{ÿCCCÿ%%%ñññËˡ‡‡ÿ ÖÖÖÿ666ÿÕÕÕñññËËËSSS¢¢¢666DDD±/6 IDATÿáááBÛCCööööööhhhSSS ÙØCCCÿááá6<<¸¸¸rœœììì333`µK Ú£âI뻄êêêÿëêàÒÓ“··5a,I%%99++++++½™™ÜÜÜ5a,1:SQ(ÿÿÿSQ(ÿÊÌÒ‰…Vÿbbbÿðòšššÿ#%Nšššÿ‰…VÿÊÌÒ‰…VÿòÑòщ…Vÿ‰…VÿSQ(ÿ.ÑÅò‰'ÿ·Vÿò‰'ÿq<ÙSQ(ÿw{ªSQ(ÿ|*(ÿ{ÿó¥Ò³/+ÿ|*(ÿ‰…VÿÿSQ(ÿ˜Ê¸0OÿA‚ÿ>¤ ×þÄSQ(ÿSQ(ÿ!'Pÿ\††ÿSQ(ÿÿÿÄ ¶‰…Vÿ‰…Vÿ.ÑÅ3ôñÔàøüâü*üâüM% ÿ ööööööÿ óÍåãúâ©ÿÿÿCC;_6ÏÕþ+f`7¼’’¼’’¼’’ãñ±ÿ5 ôö7ÌÒâ4.ÌÒâØþüÂð âɤÐÞ+++ÿÁé, ÁéÌÒâ ðÂðí  ²ÚCCCÿçÌÒâi;?þi;ÄÌø³Ûôç5 ôÔàø?þsEËó œ‚.³Ûôÿí , 6G!?þ6G!ocLÅËÒššš+++&&&&&&JJJDDDÛÛÛñññ âââ5 &&&&&&:ab­­­5 âââ+++ &&&ÒÒÒDDD­­­ñññ¼¼¼JJJâââ+++TTT&&&ÒÒÒDDD­­­%%%cccCCCÿØ®®+++ÜÜÜyyy§§§DDDÛÛÛñññ¼¼¼>>> &&&+++DDD­­­ñññ¼¼¼ÚÚÚÂÂÂö7ááá>>>ÆÆÆááá=V¼¼¼lllÿËËËññññññËˡ‡‡ÿ‡‡‡ÿŒŒŒOOO%%%555­­­ûbg/úLN˜˜˜ËËËËË˶¶¶ÒÒÒÕÕÕ˜˜˜úLN/çNS½½½CCCÿËËËññññññËËËccccccŒŒŒ>>>%%%­­­bbbÿÿ+++ÆÆÆËËËoooSSSŒŒŒ>>>%%%­­­bbbÿAƒ··ëÇÇJz±555Q¨©$$$–Êʈ®Šº»DDD_)6möÌÌ®®®¿jÔk›œí쬞‘ááánžÕèèè .-àÒÓ>(^É ÞI%%§§§§§§Cgg·ÛÛËŸÔ>(^CCCÿÅÇð#ÿÿÿ­¯Ø­¯Øº¾íÒÒÒÜÜÜ$$$ÜÜÜD­¯ØÿSQ(ÿÿ’,Ð*ÿ7I˜ò§üSQ(ÿw{ªSQ(ÿ*ØéüÙüÅÍô6:b§p³/+ÿÿêç79,-6óî|*(ÿÊÌÒööö»½æýñåãúïÍ÷ Çø"r`ƒÿ­¯Ø64.!'Pÿ-4ÿ :;\††ÿ64.èèè Ä ¶‰…Vÿ‰…Vÿ.ÑÅCk Ã÷Öùû*èèè ÿÿ­?˜î å&VÕ2 ÿ0Oÿÿÿÿ!ÿ÷ö÷öÿ!ÿÿÿÿCC*Dnnèèèèèè4. âÉËó ÌÒâ4.\0" âÉØþüéë âÉi;½‡2ÿ!ÿ?þËó =þû4.óõ âÉúí âÉM% ÿÙúûããú<4žÚÙúûããú, þçýsEÌÒâ3ôñžÚÔàøÃÌÒâØþüsEÌÒâ‘´­ÖÕÕÕSSSxxxááácccÒÒÒäääèèèèèè ÚÚÚËòóòñcccSSSûÔÓ,-ÿDDDÚÚÚñññooo...ÛÛÛäääDDD444ÿ¶¶¶ÒÒÒÚÚÚñññ%%%...ÛÛÛÛÛÛ:::ñññöööDDDäääñññÛÛÛcccÒÒÒäääDDDDDD¬¬¬>>>ooo¶¶¶§§§%%%ÚÚÚDDDêêê âÉÕÕÕáááYYY âÉëêÕÕÕèèè¼¼¼ñññÒÒÒ­­­ËËËJJJ­­­ÌÌ̘˜˜úLN¢¢¢ ...ŠŠŠæ8:žžžCCCÿWWW¼¼¼ðððÕÕÕÆÆÆ­­­ïïïaaaxxxŸŸŸ­­­...JJJ444ÿ+++WWW+++ÂÂÂÆÆÆ­­­ÛÛÛˆˆˆÂ³³³­­­...JJJ444ÿ7=lújñ½½7=lÀY&}~ïÈþPPPããôÎýöÆÅ§§§ëêܬuÛÿÿ©ÙÚk›œíìnžÕ è¾>>>èèèòò .- .-7ó"·ÛÛ#9:U™jv§=?m8©©©'WWWÿöööòøë èèèCCCÿñññááá333666ÊÊÊ$$$fffÿqm>ÀŽúý35û¤+72mÉΓ72m×'—w{ª{ÿrF/ÅÍôH¤(ûÇì9Š‹w{ªÿ=þû0Ðøú177%(¥¨ÿöööAôãû  3 : ,9 ~ Òÿqm>‡¬g#Ç32-ÿÐw{ªSQ(ÿ64.Ä ¶0:- Êüû3@ÊÌÒ­¯Øÿöööú&éÖùûÛÝøÿööö öööòòòÿ7÷Êr VÕ&8 ÚÈõ бñÿööö÷öí òòòÿèèèCCCÿCCöÌÌ 44ï£Ë]5¤zzM% ÿ4.»ä÷ö÷5 ôÔàø÷ööösE­Ö!ÿ, Ôàø÷5 ôÔàøí íì, ³Ûôÿÿôô!(Ëòói;ÌÒâ³Ûôÿÿôô!(Ëòói;ÌÒâ³Ûôÿööö÷öí =þûÍ i;ÌÒâ³Ûôÿ&&&ððð...ÒÒÒäääèèèÿööö&&&òñ3..¤ÐÑÚÚÚ?³ÚÛÿËËË&&&ððð...ÒÒÒäää½½½ÿäääööö&&&ððð...ÒÒÒÚÚÚ&&&¶¶¶ÿËËË&&&ððð8bbÜÜÒÒÒäääööö&&&ÌÌÌÿËËË555ááá...áááÕÕÕööö&&&ÌÌÌÿööö JJJJJJ¶¶¶ááá½½½ÿöööSSS%%%***|||®®®ÿöööTTT¬¬¬&&&...¬¬¬TTTžžžbbbÿÒÒÒðððêêê...qqq|||ÆÆÆ+++JJJbbbTTTÒÒÒðððêêêBBBÍÍÍÆÆÆ+++ááá½½½ÿBþÛØ‰…Vÿw{ªíÔø, ÇøÔÚ“íööö˜¢ú“326ÍÎþ :; ”þªÿ»½æúÔä0Ðüûüûyo½•ìÊÍÀ­¯ê(Ë ùìVñ…øöööööö öööÿòòòQ'ŽßÚÈõ&8 ëòý`ƒÿ }æí èèèèèèCC¼¼¼Õþí羈½RRRÿ®®®4.<4»í íìj>0Qˆì èèèÿ—ÅîèèèÿíööÔàöí íìí Áö èèèÿÔàìòòòÿèßêüß —Åèèôòòòÿèßêüß —Åèèôí öõ! 5ôʹñµô÷ ÚÚÚ&&&xxxlllööö ÿ ÚÚÚ Úöö×þÑêêêÜÜÜÿËòóñññ ÚÚÚ&&&xxxÛÛÛ¬¬¬ äääSSSñññÿÌÌÌÚÚÚÚÚÚ&&&áááÚÚÚ öööJJJ§§§...äää99P&&Ûð´—ä ‡‡‡ÿyyyñññ ËËËTTTJJJ>>>$$$ DDDÌÌÌèèèÿöööÂÂÂÂÂÂêêꦦ¦âââèèèÿööö¬¬¬TTTJJJJJJ¶¶¶žžž¶¶¶ööö êêêééé³³³ÜÜÜâââööö333$$$ˆˆˆ ¬¬¬555ôôôêêê>>>%%%%%%>>>ŒŒŒ¾¾¾öööPÈü IDATËËËÕÕÕèèè à°ƒ· ñ½½ñvã°©yx¥˜˜ ò!íìžžžÿöööäàäâ4‹ÀYèèèÿžžž©©©êëêàÒÓ··YÛI%%ÓŒ¢¢¢öööŒWŒ©©©ECàþêêê SQ(ÿÿ»½æáááñññááá©©©$$$ÜÜÜ$$$­¯ØÿöööEC0Îûñ2*Ò”72mZÖ¦*SQ(ÿèèè Ø=þëþ:+ üÙüÅÍô:bûÇì­¯Øööö»½æÿêç8ÿêçÊ þÛØÉùûw{ªèèèíÔøñÿ"r Çøåãú-4´«7@l=óÆÅ@l= 0Ðüû0½•ìCk ,Øþü3ôñ÷ÐøúM% ÿ&&&ÿRÿ5 ô  ÚÈõÚÈõÐÌõ`ƒÿèèè òòòèèèÿÁ‰Éï£Ëíç¾íç¾B=C 44RRRÿRRRÿ—Åî[‘æ , úÐù5555 ôèèèèèèèèè ßûü , 5 ôèèèßûüööö, `N& ðS*ÿööö, `N&5 ôK ÿèèè ÁéËó ÃèèèÚÚÚlllööö èèèèèèèèèööö ôôô èèèÁèé5 èèèDDDÚÚÚlll‡‡‡ èèèèèè­­­èèèÚÚÚ ÚÚÚzCßËËË&&& fffèèèDDDYYYöööööö Ô»ÚvúË—Æèèèèèè­­­ñññèè謬¬lll$$$ èèèñññ­­­ööö>>>ˆˆˆ½½½ôôôäääÒÒÒâââÌÌÌèèè áááƒkÚvSM‹ÂÂÂbbbÿ&&& öööôôôÆÆÆxxx®®®âââÚÚÚ¾¾¾©©©ÌÌÌñññðððööö¶¶¶­­­ÊÊÊJJJ¾¾¾ÚÚÚ&&&èèèèèèfff}II¿¹Šää䘘˜ èèèèè袢¢êêêÿ>>YYYbbbÿ ˆˆˆ .-_›e¡e›99 ˆˆˆ i}3òøë {wHèèè ËËËááá¾¾¾$$$ÜÜÜìììÕÕÕ =:¦Ðýÿ0ìÖ‘¦*Ø%Öèèè“úÿüÙüÅÍôøÈøûÇìWéÿ“úÿÿêçÐøúÿêç7Éûýœîð64.ôãûåãúïÍ÷èèèÿ#Çï m32 :;ø;;óÆÅèèèEC…‰¸0ÌÓö)yoaÂý“ÂSQ(ÿööö ,Øþü(Í 0Øþüÿööööööäääööö³Ûôi:þ¼øø ÞÔ÷ÐÌõèèèèèè í í !ÿèèèèèè ...ËÅÄ5;< 44ö7 âÉ4.ö7þçýM% ÿö75 ô6G!Áé?þK ÿ, õþæäpaØþü, , Áé÷ö4.?þ÷ö*—ÅîêêêTTTÿèèèÚÚÚX3..ccc444ÿèèèÿäääèèèèèèÚÚÚ>>>JJJccc444ÿèèèèèèèèèèèèèèèöööTTT>>>cccfffèèèèèèäää½½½èèèÚÚÚ --JJJ§§§½½½òòòèèèiii>>>oooccc444ÿèèèòòò=þûA]^VYa £=VM% ÿ ÕÕÕÿn¶¶¶êêêRRRüÖÕÔ¨§¶¶¶9çåCCCÿÈÈÈ:::555ñññ>>> šššìììñññ©©©ÛÛÛxxx ÕÕÕšššÀYèèèèèè$T‹~~~‚ÔŸiÀÁÿèèè¨xAèèèRRRÿÿ'!òÊÊÊnžÕˆˆˆèè謬¬...DDD?m8¡e›zdcv§=RRR ¬¬¬…‰¸‰3öööqm>“ÂËËËô˜˜˜tttÝÛ²žžžèèèqm>»½æsnÔË\¦*1ý—ÅÇð‰…Vÿèèè [ß÷;3 8MßèèèèèèÅÇð“úÿÃØ=[ßãœîðèèèw{ªèèè ùÜåãúèÉ åºŠ#Ç32ÍÎþóÆÅÅŤzzÅÇð‘åýÌÓöWéèèèèèèÅÇðú ,õÔù(Øþü ð÷Òý—Æ ÞÔ÷0Oÿèèèööö í ÿÙûÓï£ËËÅÄ+RRRÿËËËÂð>çÔàøÖùûÔàøËËËËó  ²ÚsEÁéÖùûM% ÿ4.óõÖùûüâüÌÒâS*ÿM% ÿ4.Ëó ÔàøsE`N&ÌÒâÔàøS*ÿ *6G!¤p@S*ÿÿööö ¶¶¶ðððbbbÿèèè Ñüý´àá–jièèèèèèèèè áááÒÒÒ–ji ÒÒÒfffáááfffJJJèèèèèèZ66ÒÒÒCgg xxxááá­­­xxxÙÃÁ¦ëê¡y`ëê=VèèèòòòÕÕÕ++++++ ÞÝÿêçö"#¬¬¬0‚„9çåèèèää䬬¬TTTÕÕÕ$$$RRRÚÚÚ¶¶¶èè謬¬ËËËTTTäääiii%%%JJJÓ ö IDATÚÚÚÿèèèèèè 뻄‚‚‚±“Èd==ÿñññDnn¢¢¢ÜÜܶ†Oö&]°°°òòòèèèÛÿÿc== .-*p-‚èèèòòòèèè …‰¸ECEC“Âèèèèèè »½æ ÅÇðèèèÊÌÒ…‰¸ 7¥“â¼ûÉi“ÂèèèÊÌÒèèè …çWé èèè ÅÇðòòòèèèèèè ùÜèÉ ×–èèèèèè 床ÍÎþ32—@?ÿèèèòòò Ëó Ëó èèèèèèÿ(Øþü(&éþçý&éK ÿöööèèèööö", 04 èèèòòòòòò òòòòòòèèè;_6...ï£ËÄ¢Ê+ 44èèè÷ö âÉ*÷èèè÷ö5 ô, ÷ö*ÿÌÒâ íìí ÌÒâÄÍØþüÌÒâÌÒâ íìí ÌÒâ­ÖÔàøÌÒâýáàʹߑ´Ê¹ßÿ&&&öööÒÒÒÿ5 ôôô×þÿSSS˜ÄÅÌÌÌÿ+++ôôôáááSSSÒþÿSSS444ÿöööäää~~~ÈÈÈäääšššÿ555>>>SSS%‡‡‡ÿÿ+++ˆˆˆiii¶¶¶JJJSSS444ÿØþü_‡ ¶¶¶888½½½ÿ0‚„¬¬¬ö"#1˜ ÞÝÔ¨§0‚„èèèòòòôôô^^^+++ÜÜÜáááááá^^^òòòèèè +++îîˆîîîáááBBBòòòèèèÿ+++E|©©©Om8ÍœêêêÿÿöööE|Ždd:::¼¼¼555 Ú£PPPmIIòò¼¼¼ÿööö èèèÿèèèÿ ööö èèèÿèèèÿèèèÿèèèÿööö èèèK ÿÚÿ(Ëó 3ôñÚÿ(þçýÍ èèèÿööö öööòòòÿöööRu ÐÌõñÿñÿëòýúñýбñÿDnnï£ËÖþÿ*µ×¯ÿ?þö7ËËË èèèÿ?þö7ËËË èèèÿ 5 ôËó èèèÿ èèèÿèèèÿööö÷ö*Í èèèÿööö&&&ËËË èèèÿÚÚÚ?çÌÌÌÿÚÚÚ555ñññ¶¶¶JJJÌÌÌÿÚÚÚ ...ÒÒÒÌÌÌÿ(RRç½½§§§cccÿSSS­­­...ÒÒÒÌÌÌÿööö555JJJlllèèèÿ555®®®ÿööö ööö ööö èèèÿJJJáááWWW~~~ööö555ñññffffffÿ...áááWWWšššÚÚÚ&&&fffšššffffffÿ@p§ÅÉ’Í™™nžÕ’b+nžÕ¨xAÿöööŒŒŒÈÈÈžžžÿ555WWWfffÿoooccc$$$ ÒÒÒ‚ÔŸ”BwÿèèèÿèèèÿèèèÿèèèK ÿþçýà èèèÿööö èèèÿööö èèèÿö î", 04 ÐÌõÞÔ÷ë ö î", бñ!'Pÿ*Öþÿíç¾B1+®®®ÿööö èèèÿööö èèèÿèèèÿèèèÿèèèÿööö èèèÿööö&&&òñÁèé èèèÿööö&&&ËËË èèèÿööö&&&ËËË èèèbbbÿ%%%ÛÛÛžžžÿööö&&&ËËË èèèÿèèèÿööö555½½½ÿöööòòòÿöööòòòÿöööŒŒŒfffÿfffÈÈÈžžžÿöööTTTììì¶¶¶öööTTTìììžžžÿöööŒŒŒÒ$ï¢P… èèèÿJJJ¶¶¶èèèÿ+++½½½ÿooo‘‘‘èèèšššÿfffÿèèèÿ èèèÿ7÷ÞÔ÷ë èèèÿèèèÿööö èèèÿööö èèèÿööö èèèÿööö èèèÿööö èèèÿèèèÿèèèÿèèèÿèèèÿèèèvvvÿ¢¢¢èèèÿãÖÝD IDATöööhhhŠŠŠÿööö€ÿ èèèÿèèèÿèèèÿèèèCCCÿCCCÿbbbÿ444ÿ$$$ÿ444ÿ$$$ÿ$$$ÿ$$$ÿ¬¬¬ÿÿCCCÿÿÿÿÿÿCCCÿRRRÿ½½½vvvÿvvvÿ½½½vvvÿšššÿšššÿšššÿêêêÿêêêÿÖÖÖÿS*ÿ444ÿS*ÿ¼ˆXÿ¼ˆXÿbbbÿbbbÿ¬¬¬bbbÿ¬¬¬ÿ{ÿbbbÿ444ÿäää>>>+1`ˆˆˆ£©Ø¬¬¬ÿÿÿM% ÿ!ÿCCCÿ333ÿÿööö òøËËË#ÿ‡‡‡ÿêêêÿ‡‡‡ÿbbbÿšššÿHHHÿ¬¬¬ÿÿCCCÿÿCCCÿÿ¬¬¬ÿbbbÿCCCÿvvvÿšššÿÍÍÍK ÿׯ–ç¸|K ÿK ÿç¸|ÿúCÿ#ìˆRÿò‰'ÿÍl1½†"ÿ444ÿò‰'ÿYò‰'ÿÖÖÖÿ444ÿ444ÿ³¯€½‡2ÿÂð½‡2ÿ<4CCCÿ444ÿ444ÿS*ÿ444ÿS*ÿ„ŠÀÿ„ŠÀÿbbbÿCCCÿCCCÿbbbÿÿýÇÿÏûÆÿ‘ÁÂÿ¼ˆXÿ<;5<;5¼ˆXÿ¬¬¬ÿÿáááCCCÿÿbbbÿÿáááÿ¬¬¬ÿ Û¨¦———Âöù²­µñétëVPûT¦q \'+ÛÀÝibbbÿÖÖÖÿTTTÿÿÿK ÿÿÿÿK ÿRÿTPÿM% ÿÔàøßûüÿ+++333ŠŠŠöööÿÿööö èèèÿ úÝòøqÿÿÿÿXˆ¿ÿ¡úÅÿXˆ¿ÿ!'Pÿ!'PÿXˆ¿ÿêêêÿ¡úÅÿXˆ¿ÿ)T„ÿšššÿÖÖÖÿÖÖÖÿÖÖÖÿCCCÿCCCÿCCCÿbbbÿšššÿÖÖÖÿÖÖÖÿšššÿRRRÿÿRRRÿÿl ÿ¬¬¬ÿ³/+ÿ²ÿÿl ÿK ÿK ÿ²ÿ¬¬¬ÿ444ÿ#ÿ#ÿbbbÿbbbÿÿÿÿ!Oÿ=”ÿšššÿ!Oÿ2 ÿÿK ÿM% ÿvvvÿ!ÿK ÿ!ÿK ÿ½†"ÿÿúCÿRÿÿ})ÿêêêÿò‰'ÿ})ÿ})ÿRÿò‰'ÿÿúCÿÿýÇÿ½†"ÿ444ÿšššÿ·VÿÆÀ\ÿÿû‘ÿ‰…Vÿ444ÿM% ÿÿû‘ÿ·Vÿÿû‘ÿšššÿ444ÿ444ÿ ÿÿÿ0P'ÿ$$$ÿ444ÿ444ÿCCCÿ½‡2ÿ444ÿS*ÿ444ÿCCCÿ‘ÁÂÿ„ŠÀÿÿÿÿÿ‘ÁÂÿÿýÇÿÏûÆÿCCCÿM&%ÿøÃÿM&%ÿÿ444ÿ444ÿÿRRRÿøÃÿ»‰ˆÿRRRÿzQÿ¬¬¬ÿzQÿ²ÿÖ"ÿl ÿK ÿ&Pÿ'^ÿ¬¬¬ÿ444ÿ= ÿ= ÿ{ÿ{'ÿSQ(ÿ #ÿ 2ÿ 2ÿ O'ÿŠ„/ÿOU„ÿbbbÿÖÖÖÿz0„ÿÿÿ!ÿÿ444ÿÿÿ!ÿM% ÿTPÿŠ„ÿÿÿÿÿÿ!ÿÿÿÿÿCCCÿvvvÿÿÿÑñû IDATÿÿÿÿÿÿÿÿÿÿÿÿ#ÿ”ÿÿÿÿÿÿÿ 8-4Á–f?jšøÓÌ-4/4;Ir·ŽúÑÌÅ׬|ÿöööŒŒŒ<<<ÄÄÄ<<<NNN²²²ÄÄÄfffÿ...¼¼¼òòòÿ öööòòò²ÿ™ïóY  ~éâNãê ÿûöþ ,ôãû ôãûëÎ÷ÿ3ôñ6F ÌÓöÔàøœBt!¾ŒßCzÞÿöööä{‹ ê:- 0-dÈz~/­· #ÌÌÌ444ÿñØj1–Ïñ²Ö…¾Œ¡Bv•þÊ59£ðððÌÌÌ444ÿäääöööü ö&9#óÇÔÁ%nþÌÌÝÆ³*0ÌÌÌÿlr¨ 7²‚N~n<’Äûo?>ÿdÑüýob3\À:::Y'&»íвÿÈü;ÏúÿÔüÿç ýÔ,ê6 êÊöÙ¢ïCCCÿiiilllcýÅmàÍûຠÜ©H ‘×U$‘rû†Ð|ÿ÷ößûüÿòòòÿòòòÿòòòK ÿ³ÛôÿŒŒŒfffÿòòòK ÿËó èè芄ÿš f`ùv|ãÿööö èèèÿòòòÿ èèèÿ½½½ÿòòòÿ èèèÿ èèèÿòøëBßÙ°ÿèèèÿòòòÿöööòòòÿöööB-4”3®ÊUcccnžÕÑÌÅ׬|ÿöööyyy5ÑN~沂ÞB<<<***ÿDDD¼¼¼ü ö÷ DDD¼¼¼òòòÿTùõßûüj1;3 Á¦ÿîëNãêÿíõê%? 64 ¶þÕ°ÝùñýòÝúÿööö?þ4- <4 ÄÌô®êÿöööÿôôp':- ÆÓö:- H§¬ý¾Œ¾†½!ñññÌÌÌ444ÿÚÚÚ?þþçýj1H¤(„ŠˆÊÌÒðòñññÌÌÌÿü ö÷ ÷ÿô #:MÿÖÕ½Û/'2ÌÌÌÿ555AG} 7>:0’ÄûóÉþ¿¹ƒ½½½ÿööönÑüýçZ&öºîìììžžžÿ;BÔüÿdDÛ<4O¤Qˆ;6 Ãlåÿ555úÇŬW]àÍû—Ä¿ùÿ]Õ%ÕÏ ÌÌÌ!ÿ*µô÷ÿ èèèÿööö èèèÿ èèèÿ èèèÿ JJJÒÒÒÌÌÌÿ èèè!ÿ÷èèèTPÿÄÈ<8ú64 v|ãÿòòòÿòòòCCCÿËËËòòòCCCÿËËËòòòÿ èèèCCCÿËËËòòò444ÿÚÚÚòòòÿööö ^^^˜˜˜BßÙ°!'PÿßÙ°ÿòòòÿööö èèèÿèèèèèè íç¾øÓÌÄÌø?jšÑÌÅ׬|‡‡‡ËËËÍýþ#ì‰#ì‰=:<<<ŒŒŒ¸Å²ü öú EC âââªóö–ÏñÊüûÅÍôÅÍôÿîëNãê   ùñýÜÊÌõsC0:ùñýØþü<4 <4 ÄÌô¤Ñòèèè )ÆÓö}˜H¥v¾Œ¾[’öñññÌÌÌ444ÿ444ÿÁé¥e*ÆÓö¾ïóoðòå444ÿ444ÿ÷ÿô÷ÿô  &9#44Õ½Û>6Aððð444ÿÿ ËËËŠ„Nœµú‰ùY‹øœ|v@½½½èèè œîðf ˆT$ÿ0ÜÜÜžžž Åû¾ã3³á ÄÌøÄÄÄç±\æÅÃlå ËËË> ’ð Î1wÔÒ;…§ÿ]”ÞŠåß°ððð444ÿÿÿ*µô÷ÿÿ èèèöööèèèÜÜÜ èèèÿ555žžžöööbbbÿŒŒŒJJJáááÌÌÌòòòTTTŒŒŒöööÿbbbÿy•–ÿ64 <8ú64 Ž”ûÿCCCÿòòòTTTŒŒŒÿvvvÿ bbbÿ333555ÿöööÿbbbÿ333ÈÈÈÿ444ÿðððTTTÿööö˜˜˜÷ñÈ!'PÿýÔ!'Pÿ!'Pÿèèè ööööööíç¾ Ô&úÌ£6«ïÄ”èèè ¼¼¼«¯Þi ‡’ôÃÆùÖÖÖžžž ÷  .. ÒÒà ðÚÚÚòòòèèèËøúþçý4- 6;3 ûÇûNãê ÷  åââ64 å½ÈéòÝúèèè&é¤ÑòÄÌôhæ¤Ñò(èèè ¤Ñò:- ½•쾌¡¾‰[[’öèèèÌÌÌÌÌÌ]/ Áé[›Öua%Bs s‘ÊÌÒåðò444ÿÌÌÌÌÌÌ ööö   ûöþ#:MÕ½Û߉‰>6AÌÌÌ¿¹ƒúÊ“(Ì”èèè öööš÷úHöô‘žÍY'&ììì—ÉÊÆÆÆèèèùÍ<4Ýh<<<PœòóÝÜèèè “úÿÿèÄ¿ùyúùÅÌø‹ZêyúùÎýÿECÌÌÌÿ öööÖùûÿÜÜÜèèèÿžžž xxxèèèèèè*** ÿááášššáááÕÕÕ888ÈÈÈ 888ÈÈÈèèèJJJìòYº¾üŽ”ûèèèÿbbbÿ555 RRR½½½888ÈÈÈ CCCÿ$$$ÕÕÕèèèòòòbbbÿ½½½òòòòòòCCCÿhhh òòòèèèbbb'ÈÝ% IDATÿ```BBBòòòCCCÿððð¶¶¶ èèèòòò ööö÷ñÈý,ýÔ!'PÿßÙ°ÿ èèèèèè íç¾<4ÊUcccïÄ”èèè ñïÆ 0ܺîTTTéë.. ÒÒàea'òòòËøúÌÓöÅÍôNãêèèè÷ üôþÊÌõÊÌõƒŸ õ Ã&é<4 Ú×;(paÿ éëüÙüÆÓöúÏé[’öèèèñññÒþþ Á鄨N+ÉŠˆ.ðòñññ444ÿÿòû$  ؼ±  555ññññññððð444ÿAGv4573jdpq-QQÿèèè Áèé’äæ×þÿS…†¶¶¶®®®èèè ñÿ¿éÛÄÌø#í˜ÄÄÄóÝÜCCCÿ;9 “úÿ>>äääèèèèèè 8 òø+++÷ñÈý,ýÔ!'Pÿ!'Pÿèèèÿÿòòòÿ÷ö d ­­­JJJ@p§)T„ÿèèè -+2)$$$èè軽æóõ›ŸÙéë%#ÿÿV j1;3 l ÿ ÷ ùñý¹Ó¹Óö îÿööö=þûÄÌôpaÄÌôèèèG’‚Ñ2H¤(eùáã ]/ =þû?þ­œ0vuíÒþþåñññÌÌÌ?sEAFO555ñññÌÌÌèèèB 19d^úøÎÔì•ÏóÉþdpq-QQÿ ? h<;ÿdCdzá Ýh<<<bbbÿñññTTTÄ¿ù;4„ØÎ;4'ß\áã ááá444ÿÿÜÜÜèèèÿ TTTŒŒŒÃÿ”””xxxžžžJJJŠŠŠìììèèè***ôôôèèèfffèèèòòò888xxxäääèèèfffxxxCCCÿiii666 èèèCCCÿ¬¬¬ÿiiiBBB¢¢¢èè興ˆ°°°äääèèèWWW...èèè444ÿbbbÿttt***fffvvvÿÕÕÕbbbÿttt***BBBèèèCCCÿñññ888¶¶¶èèèèèèßÙ° 8=Cë½ÖQ+++*ý,ýÔýÔ!'Pÿòòòÿÿòòòòòòööö÷èèèB-4SSSÑÌÅ/4;)T„ÿ‚‚‚“““<4=:<<<CCCÿ ööö.. ECea'ÿTùõV F _®è[œåF l ÿl ÿèèè üôþâ#-3_b™.8!Oÿ þçý<4 ¾ŒßÄÌôÌÓöööö©H ÃÅó¾Œß¾Œß@]444ÿðððñññÒþþj1ûÇù¬©áã åÁèé»ä.µàá>çÌÌÌÌÌÌH™qÑËˬž‘öÈü;5.€œW9o›/Òþÿ£qpsD¦ ûMö#혌ŒŒááábbbÿÌÌÌðò³Å_®èœÿîëNãêÿòÿì â÷êüûóþÿ3ôñà ööö?þ4- —ÆööösDÌÓö³Ûôÿ¥n À£ïÐüû0Ðüû0:- H¤(5:ñÌÌÌ444ÿñØ4.üÖçÐý4-ÌÓû²Õl‚X™­Ö444ÿäääööö ÷7.µàáJøÌÓûöñññÌÌÌÿööösEEm2öÈü\Àèèèÿ›qõùêêê...®®®ÿi:þ¦ ûñºèè轇2ÿQ‡Ü555WWWfffÿ%òðzL&i²õ+Õúþ—N ÃÚVè2ÞÒÒÒÌÌÌÿÜÜÜxxx¶¶¶èèèCCCÿÕÕÕèèèÿJJJžžžCCCÿWWW~~~èèèšššÿšššÌÌÌCCCÿWWW~~~èèèÿJJJÍÍͽ½½CCCÿ333ìììáááÕÕÕèèèÿ^^^ìììžžžCCCÿ¶¶¶èèè444ÿ...$$$šššÌÌÌCCCÿ“““   ˜˜˜ èèèbbbÿ```BBBèèèÿ+++ÕÕÕèèè!'Pÿ*Ãå½ +++½½½ÿ=þûÃòòò)T„ÿ×Öþ½]°-c¸‘‘‘èèèÿJJJ888©©©¶JäÕÕÕJJJ888fffÿöööü ö éëòòòÿšþNãêÿ5 ô³ÛôÿšþMÑÕ ÿûöþûóþÿöööòòòÿööö?þ³Ûôÿööö?þ4- ü×û)ü×û@]CzÞ444ÿÌÌÌ444ÿñØ<`Jq<ÙSeö¥dÉô³á ÌÌÌÿöööòû$C:½Æïû Éööö555ñññÌÌÌÿööö èèèÿöööôôô ôôôöööDDD®®®ÿb®DÜÿi;—ÅîöööhhhŠŠŠ444ÿÚÚÚ/üú> Ä¿ù¹ ÌÌÌÿèèèÿèèèÿèèèbbbÿ¢¢¢èèèbbbÿ¶¶¶èèè444ÿBBB¾¾¾ÌÌÌšššÿÜÜÜ¢¢¢èèèvvvÿÍÍÍÕÕÕèèèÿ555ñññðððôôôèèè!'PÿýÔý,ýÔý,÷ñÈöööòòòÿòòòÿÿÿÿÿÿÿÿÿÿÿ444ÿ444ÿ444ÿ444ÿCCCÿ444ÿÿÿÿÿÿÿÿÿÿ444ÿCCCÿSQ(ÿ444ÿ444ÿšššÿÿCCCÿbbbÿ444ÿÿÿbbbÿÿMFÖ« IDATÿÿ€ÿ!'Pÿ!'Pÿ!'Pÿ!'PÿM&%ÿM&%ÿ444ÿvvvÿ444ÿvvvÿbbbÿCCCÿvvvÿ444ÿvvvÿšššÿRÿCCCÿM% ÿ444ÿbbbÿbbbÿ444ÿbbbÿCCCÿÖÖÖÿ444ÿ444ÿbbbÿM&%ÿ$$$ÿM&%ÿ¬¬¬ÿM&%ÿM&%ÿ444ÿšššÿÿCCCÿCCCÿ444ÿšššÿÿêêêÿšššÿCCCÿvvvÿvvvÿ444ÿšššÿÿ444ÿÖÖÖÿCCCÿbbbÿšššÿbbbÿšššÿbbbÿšššÿšššÿbbbÿšššÿbbbÿM% ÿS*ÿšššÿÿbbbÿRÿM% ÿM% ÿRÿCCCÿÿÿCCCÿvvvÿCCCÿÖÖÖÿCCCÿM% ÿRÿbbbÿÿÿšššÿ444ÿvvvÿÖÖÖÿÿ444ÿÖÖÖÿbbbÿ444ÿšššÿvvvÿ444ÿšššÿÿÿÿÿM&%ÿM&%ÿM&%ÿÿbbbÿ #ÿ|*(ÿM&%ÿšššÿêêêÿCCCÿÿbbbÿvvvÿvvvÿÿvvvÿÖÖÖÿbbbÿvvvÿvvvÿRÿCCCÿvvvÿCCCÿ444ÿCCCÿM% ÿ%#ÿvvvÿCCCÿÖÖÖÿbbbÿbbbÿšššÿÖÖÖÿÖÖÖÿšššÿšššÿ444ÿbbbÿšššÿÖÖÖÿbbbÿ%#ÿM% ÿ444ÿ$$$ÿšššÿbbbÿM% ÿCCCÿÿÿM% ÿÿCCCÿÿÿ444ÿÿÿ¬¬¬ÿCCCÿCCCÿÄÄÄÿM% ÿ4- —Æšššÿ¶¶¶èèèèèèfffäääÿ¾¾¾ŒŒŒ444ÿbbbÿäääBBB¬¬¬bbbÿÿBBBÜÜÜìììbbbÿvvvÿbbbÿäää~~~èèèöööÿôô÷þÿ³ÚÛM&%ÿ/<==³Å+0‚„<=vvvÿ...+++ÿêêêÿ¢¢¢ÿ¢¢¢èèèvvvÿŠŠŠšššÿ444ÿvvvÿNNNÿìììCCCÿCCCÿ333ÍÍͽ½½vvvÿ4- (bbbÿvvvÿ```CCCÿ333CCCÿbbbÿÄÄÄááá888ÈÈÈÄÄÄ444ÿvvvÿNNNÿšššÿPPPšššðððÿ888ÈÈÈÄÄÄ444ÿêêêÿ888=?ZþçýS*ÿŠŠŠ888bbbÿ4- èèè þçýi:þÕÕÕbbbÿM% ÿM% ÿM% ÿK ÿK ÿ= ÿôûm¢ IDATRÿ½‡2ÿ½‡2ÿÿÿ xxxöööÿáááìììÊÊÊiiivvvÿÕÕÕÒÒÒÈÈÈÒÒÒ5 ô4- —ÆèèèšššJJJRRRÿbbbÿJJJÚÚÚääääää¶¶¶JJJhhh¶¶¶èèèìì쬬¬444ÿbbbÿÿbbbÿ```vvvÿ444ÿ¶¶¶èèèèèèòòò óþþ¬¬¬01—…0TZwëÄÃRÿ¢¢¢~~~èèèÕÕÕËËË+++...èèè³/ÿ èèèbbbÿ®®®ÿÿšššfffK ÿ¢¢¢ôôôèèèááᬬ¬˜˜˜ÌÓöñññÿ¢¢¢½½½¢¢¢ËËˬ¬¬ÌÓö=V333ìììCCCÿÿÿCCCÿ333bbbÿ888©©©ÕÕÕžžžšššfffÿ¢¢¢ôôôèèèšššÿPPP°°°...êêêòòò¶¶¶šššBBBšššÿÿCCCÿÜÜܬ¬¬ÃʹßS*ÿRRRÿñññêêê~~~¬¬¬ÿÿÿM% ÿ¶¶¶bbbÿèèèÃÌÓöáááM% ÿ4- Øþüÿ!ÿòþÿäûü½‡2ÿ<5ÄË佇2ÿ½‡2ÿÿööööööêêꈈˆòòòÿÿÿÿÕÕÕ¬¬¬ìììÊÊÊöööíÑЬ¬¬äääÿM% ÿ4- —Æèèèÿ¢¢¢„„„CCCÿÒÒÒžžž ˜˜˜èèèèèè¾¾¾¶¶¶ŠŠŠèèèÿÒÒÒììì vvvÿbbbÿäää¶¶¶ ÒÒÒììì   bbbÿ444ÿšššÿäääèèè ÿ M&%ÿ×þÿÑüýTTT¥óür¥óüõ/M&%ÿRÿ—Æèè袢¢½½½èèè})ÿeéèèèbbbÿÂÂÂôôôèèèèèèÚÚÚ³‹rOŽ‘èèè½½½?þþçýÿ èèèèèèòòò 4- ¬¬¬¾¾¾ÄÄÄCCCÿRRRÿ333$$$CCCÿbbbÿ888©©©ÕÕÕèèèfffÌÌÌttt555èèèbbbÿ:::~~~¬¬¬TTT444ÿfffèèèää䘘˜ÜÜÜbbbÿWWW¢¢¢ Í ʹßM% ÿHHHÒÒÒäää èèè ÿÿööö þçýÌÓöèèè¶¶¶CCCÿ þçý5 ôÕÕÕCCCÿK ÿ4- ÌÓöØþüóõ!ÿ*åüýäûü÷žÚÌÓöQ‡ÜRÿ½‡2ÿRÿÄËäÚÚÚòòòöööÿÿööö&&&¶¶¶¾¾¾¢¢¢÷ö* èèèÿ^^^4- —Æèèèÿööö^^^ììì^^^½½½öööÌÌÌèèèòòòèèèK ÿwO6èèèBBBÒÒÒèèèvvvÿ444ÿ¢¢¢žžžèèèêêêÚÚÚÒÒÒìì좢¢žžžvvvÿ¢¢¢~~~èèè ÷³ÚÛ)Ëò󬬬,nêøBZ?ÑüýM% ÿ—ÆèèèèèèJJJ555èèèM% ÿ›ïèèèšššÿÂÂÂôôôèèè?þç(©©©”””¬¬¬ÿ ÃÕÕÕvvvÿ èèè ÚÚÚ```~~~ðððâââÜÜÜK ÿ¬¬¬ÕÕÕèèèÿ&&&JJJÿ¶¶¶ÈÈÈôôô^^^¬¬¬fff^^^&&&¢¢¢fffÖÖÖÿ888xxxèèèèèèèèèÍ þçýM% ÿÚÚÚèèèèèèèèè ÷öòòòèèèÍ èèèÕÕÕ444ÿèèèÃèèèÕÕÕCCCÿbbbÿ444ÿbbbÿCCCÿCCCÿK ÿ6F ¤ÑòÁéóõèèèbbbÿ444ÿ!ÿ*åüýñýþ÷ÿžÚËó —ÆRÿRÿÄËä—Æ—Æ ÿÿ ÿÿvvvÿ444ÿÿRÿK ÿCCCÿvvvÿbbbÿÿÿCCCÿÿbbbÿÿÿM% ÿÿÿÿÿ444ÿÿÿÿÿÿÿ444ÿbbbÿÖÖÖÿ ÿK ÿÿÿÿÿÿÿÿM&%ÿM&%ÿM% ÿÿÿ¬¬¬ÿÿÿbbbÿCCCÿÿK ÿÿÿÿšššÿbbbÿÿRÿÿÿvvvÿÿ%#ÿM% ÿÿÿÿbbbÿÿÿÿÿÿšššÿvvvÿ{ÿÿÿÿÿÿšššÿÿÿvvvÿÿÿÿšššÿÿÿÿbbbÿšššÿbbbÿbbbÿÿ%#ÿM% ÿvvvÿÿÿK ÿÿÿM% ÿRÿÿbbbÿK ÿ¼ˆXÿÿCCCÿbbbÿÿCCCÿbbbÿÿbbbÿbbbÿÿÿÿbbbÿbbbÿ444ÿbbbÿCCCÿCCCÿ444ÿ!ÿ= ÿ!ÿÿÿÿ–‘¥9 IDATÿÿ½‡2ÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ444ÿvvvÿÿM% ÿÿCCCÿvvvÿCCCÿÿÿÿÿK ÿM% ÿÿÿvvvÿ444ÿÿbbbÿÿÖÖÖÿÿÿ!ÿÿÿÿÿÿM&%ÿ$$$ÿM&%ÿ%#ÿM% ÿÿbbbÿCCCÿÿÿÿbbbÿ444ÿÿÿÿK ÿÿÿÿÿ%#ÿK ÿÿÿCCCÿÿÿM% ÿÿÿÿÿÿvvvÿÿÿK ÿÿÿÿÿÿvvvÿÿÿvvvÿÿšššÿšššÿbbbÿÿbbbÿÿK ÿS*ÿbbbÿÿ{ÿÿÿM% ÿRÿÿCCCÿRÿRÿ¼ˆXÿÿÿCCCÿÿCCCÿ444ÿCCCÿRÿK ÿ%#ÿÿCCCÿCCCÿbbbÿCCCÿbbbÿÿ$$$ÿ!ÿ444ÿ444ÿCCCÿÿÿÿÿÿÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿ444ÿ!ÿM% ÿÿ%#ÿvvvÿÿÿÿÿÿK ÿRÿÿÿÿÿ¬¬¬ÿ444ÿÿÿÿK ÿÿÿ #ÿ#ÿM&%ÿ%#ÿM% ÿÿÿ¬¬¬ÿÿÿÿÿ444ÿ444ÿÿÿM% ÿÿÿM% ÿÿÿÿÿÿÿ%#ÿÿÿÿÿÿ!ÿÿÿÿÿÿbbbÿÿÿCCCÿÿÿÿÿÿ%#ÿM% ÿÿK ÿÿÿÿM% ÿRÿÿCCCÿÿRÿ¼ˆXÿ¼ˆXÿÿbbbÿCCCÿÿÿ444ÿRÿK ÿ%#ÿ444ÿšššÿvvvÿbbbÿbbbÿÿCCCÿ444ÿCCCÿ!ÿ= ÿ!ÿÿ$$$ÿCCCÿ444ÿ444ÿÿÿÿRÿÿÿÿÿÿÿÿÿÿbbbÿÿÿÿ&&&äääèèèÿ?þÔàøßûüÿ ð\/¼ø èèèÿöööòòò!ÿóõèèèÿ èèèbbbÿžžžÿÌÌÌK ÿÖùûßûüÿð àþõèèè%#ÿ\/®êÿ èèèÿöööòòò444ÿäääööö èèèÿ5 ôÁéòòòÿi:þ¼øòòòÿöööòòòÿööösD®êÿ èèèÿþìëêüýÿöööòòòÿ+++½½½ÿþìëêüýÿú(³Ûôÿ íìí òòòÿööö?þ4- ®êÿÌÌÌÿi:þ;6B‘´³Ûôÿ+++½½½ÿ5 ôç(BBBìììžžžÿíÑÐ*Öùû/0fffÜÜÜìììžžžRÿ®êÿöööòòòÿöööêêêòòòÿööö555ÕÕÕèèèK ÿËó èèèÿ ð(Ëó èèèÿ èèèÿ3ôñ³Ûôÿöööòòòÿ...ŠŠŠ444ÿÌÌÌÿ5Í èèèÿð àþõèèè%#ÿ(Ëó èèèÿ èèèÿ èèèCCCÿˆˆˆ$$$ èèèÿ=þûÍ èèèÿ3ôñÃòòòÿ èèèÿ=þûÚÿÛÝøÿòòòÿ èèèÿ èèèÿ èèèÿ÷ö÷èèèÿ3ôñÚÿ(³Ûôÿöööòòòÿööö=þû4- ÌÓö³ÛôÿööösDʺó4- —ÆJJJžžžÿèèèÿ íì/0BBBìììžžžÎW÷a IDATÿi:þ®êRÿ®êÿööö&&&ÚÚÚòòòÿöööòòòÿöööòòò!ÿ*Í èèè%#ÿ(þçýà èèèÿöööòòòÿ?þ4- ®êÿööö èèèÿäääèèèK ÿÖùûßûüÿúàþõèèè%#ÿ(Ëó èèèÿööö èèèÿ èèèbbbÿ888ÈÈȶ¶¶èèèÿ?þËó èèèÿ3ôñÚÿóõèèèÿ èèèÿöööú&éµô÷ÿòòòÿ èèèÿ èèèÿ èèèÿ=þûÍ èèèÿ=þûÚÿÛÝøÿöööòòòÿèèèÿööö 3ôñ6F Âñ-½½½ÿèèèM% ÿ4- ®êRÿ¼øsD®êÿöööTTT¬¬¬òòòÿèèèÿÿ444ÿÿÿ!ÿ!ÿÿM% ÿK ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿ ÿÿÿ#ÿÿ%#ÿM% ÿRÿÿÿÿÿÿÿÿÿÿ444ÿbbbÿÿÿÿK ÿÿÿÿ%#ÿK ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿK ÿRÿÿM% ÿRÿM% ÿÿÿÿÿÿ¬¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM% ÿRÿÿÿÿÿÿÿÿÿÿ444ÿÿÿÿK ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM% ÿÿÿÿÿÿÿbbbÿÿÿèèèÿèèèÿèèèÿèèèÿ èèèÿèèèbbbÿ¬¬¬ èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèEsÚY IDAT€ÿÿöööòòòCCCÿCCCÿvvvÿvvvÿvvvÿÿ¬¬¬ÿCCCÿ¬¬¬ÿêêêÿµ •… IDATCCCÿvvvÿCCCÿCCCÿCCCÿ¬¬¬ÿêêêÿÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ444ÿ444ÿ444ÿ444ÿM&%ÿ!'Pÿ!'PÿM% ÿ)QjÍÍͽ½½ÿ èèèCCCÿÕÕÕèèèÿòòòÿèèèÿèèèÿèèèÿèèèM&%ÿ×þÿ)³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)×þÿ)³ÚÛÿèèèÿèèèÿèèèÿèèè444ÿÌÌÌ444ÿäääÌÌÌ444ÿÌÌÌ444ÿäääÌÌÌ444ÿÌÌÌ444ÿäääÌÌÌ444ÿÌÌÌ444ÿäääÌÌÌ444ÿðððññññññäääÌÌÌ444ÿÌÌÌÿèèèÿèèèM&%ÿ×þÿ)þ,µ×¯M&%ÿ³ÚÛ!'PÿýÔý,ýÔý,ßÙ°!'PÿßÙ°Rÿ¼ø èèèÿöööòòòCCCÿ333¢¢¢èèèÿòòòCCCÿ½½½K ÿ2ÎãøÍ èèèK ÿ2ÎãøÍ èèèK ÿÍ èèèK ÿÍ èèèM&%ÿ³ÚÛM&%ÿ.îê7 É÷ùÒ³ÚÛM&%ÿ³ÚÛM&%ÿ.îê7 7ÉøùÉ÷ùÒ³ÚÛM&%ÿ³ÚÛM&%ÿ.îê7 Ë û5ôÉ÷ùÒ³ÚÛM&%ÿ³ÚÛM&%ÿ.îê7 É÷ùÒ³ÚÛM&%ÿÔßß*Öùûí ?³ÚÛM&%ÿ³ÚÛbbbÿ¶¶¶èèèbbbÿ¶¶¶èèèbbbÿ¶¶¶èèèbbbÿ¶¶¶èèè444ÿððð333ŠŠŠ444ÿððð333ŠŠŠ444ÿððð333ŠŠŠ444ÿðððWWWÊÊÊŠŠŠ444ÿððð>ç+Y‚>>>Mëñ³ÂÂÂTTT444ÿÌÌÌK ÿ2ÎãøÍ èèèK ÿÍ èèèM&%ÿ³ÚÛM&%ÿ.îê7 Ë û5ôÉ÷ùÒ³ÚÛ!'Pÿéð´øKšGÌiù ¶Ý*ÖGßÙ°!'PÿßÙ°‚ÿ:õ”üÚ°‚ÿ:ÏD‚ÿ:!&ß©C!'PÿßÙ°!'PÿßõV)'$!ËYßÙ°RÿM% ÿ—Æòòòèèèööö 333ÍÍÍ vvvÿCCCÿ¬¬¬ÿ444ÿ333iiiCCCÿK ÿlJu`§}lJ6G!èèèK ÿ2§}Îãø6G!èèèK ÿ§}2§}26G!èèèK ÿ§}lJ2lJ6G!èèèM&%ÿM&%ÿ.îê7 @l9É÷ù?³ÚÛM&%ÿM&%ÿ.îênË û d Î1þÉ÷ù?M&%ÿM&%ÿ.îêç+Y‚SM‹MóðûÈøëñ³Âˆˆˆ444ÿÌÌÌK ÿlJu`§}lJ6G!èèèK ÿ§}lJ2lJ6G!èèèM&%ÿK)Qÿ.îê)#È!ö”\UÊõ”"n!'Pÿ‚ÿ:6W6W!&`üm!'Pÿ!'PÿßÙ°!'Pÿ444ÿßõV@QžÙ.žÄ$$‡+³/ÿÎ#ÿÌÓöÁé èèèÿöööòòòCCCÿiiilllèèèÿ èèèÿðððRRR666TTTÿ&&&ÕÕÕèèèÿ íì*2:- ”¶îr{)Ž…×µô÷ÿ íì*2u`Yƒâr{)Ž…×µô÷ÿ íì*2:- ”¶îr{)Ž…×µô÷ÿ3ôñ2Îãø2:- ”¶îr{)Ž…×µô÷M&%ÿËòócü÷7 9;3 À”ïÉ÷ùBs#ޅ׳ÚÛM&%ÿËòócü÷7 @lÅÍôÆÓöþëþBs#ޅ׳ÚÛM&%ÿËòócü÷>>°°°ÜÜÜG¼¹ïD¾¾¾ÌÌÌ444ÿäää^^^666***ÖÖÖÊÊÊG¼¹ïD¾¾¾ÌÌÌ444ÿÕÕÕ”””>>>MûÈøð)»ÂÂÂÛ†¹ïD¾¾¾ÌÌÌÿ íì*2:- ”¶îr{)Ž…×µô÷ÿ3ôñ2Îãø2:- ”¶îr{)Ž…×µô÷M&%ÿËòócü÷>>M­³uM³}´ìììáááñññÌÌÌÿ íì,!!Ôßß*®¶VRJªµô÷ÿ3ôñþæä®¶VRJªµô÷ÿ3ôñþæä0þëþ~®P¹[·™ïó0 I…Ô®ÿ3ôñþæäÖùû*´ïˆLxÃ=CÖþÿßÙ°ÿèõ7MÖ³ç*!ãÿõœ(eñãÿüÚ°ÿèõ7MÖ³ç*!-4ÛÒÌõœ(eñãÿüÚ°!'Pÿ÷ñÈèõ7MÖ³ð]:!&°¢Ò(ÉÐo]õ”ýÔý,ßÙ°!'Pÿ÷ñÈèŽM ³ýª'$‰)_ûj²þÿΞ‘ýÔý,ÿ›ÿ[ß÷ èèèK ÿà èèèvvvÿÍÍÍÕÕÕèèèÿ èèèÿèèèÿööö÷ö,!!4- ²Úؽ[RJªÍ èèèÿööö÷ö,!!4- ²Úؽ[RJªÍ èèèÿööö÷ö,!!4- ²Úؽ[RJªÍ èèèÿööö=þû4-ʹ߮¶VRJªÍ èèèÿööö=þû4-ʹ߮¶V¹[·fû5 ³ÚÛÿööö=þû4-ʹ߮¶V¹[·fû5 ³ÚÛÿööö=þû4-ʹ߮¶V¹[·fû5 ³ÚÛÿööö=þû4-ʹ߮¶V¹[·fû5 ³ÚÛÿööö?4-»äì³!'DÕ÷i;ÌÓû³ÚÛÿööö&&&òñ4-³á ÅŽ+;rÕäääèèèÿööö&&&òñ4-³á ÅŽ+;rÕäääèèèÿööö&&&òñ4-³á ÅŽ+;rÕäääèèèÿööö&&&òñ4-³á ÅŽ+;rÕäääèèèÿööö&&&òñ4-õ#LƒLé}´¢¢¢+++ñññÌÌÌÿööö&&&òñ4-õ#LƒLé}´¢¢¢+++ñññÌÌÌÿööö&&&òñ4-õ#LƒLé}´¢¢¢+++ñññÌÌÌÿööö&&&òñ4-õ#LƒLé}´¢¢¢+++ñññÌÌÌ444ÿäääöööTTTááá>çõ#L666M³}´¢¢¢i;ÂðñññÌÌÌÿööö÷ö,!!4- ²Úؽ[RJªÍ èèèÿööö=þû4-ʹ߮¶VRJªÍ èèèÿööö=þû4-ʹ߮¶V¹[·fûc:ÐýÿýÔ³ÚÛÿööö=þû4-ʹߴïˆLxÍ 7Ø)ßÙ°ÿöööòÿAMÖ4-ƒÓ&õœ(eñ÷ñÈèèèÿöööòÿAMÖ4-ƒÓ&õœ(eñ÷ñÈèèè!'Pÿ÷ñÈöööòÿAMÖ4- “Øk¢Ø70/8-ç\+++Þä ßÙ°!'Pÿ÷ñÈöööò˜7„Ð¥‰b‡ç+Y‚>>>Mëñ³ÂÂÂTTT444ÿÌÌÌÿ èèèÿ èèèÿèèèÿð àþ àþõèèèÿ ôôôèî àþõèèè})ÿ)6Êüû®ê})ÿ:- IªåM&%ÿf òÿîÿ96¦ßM&%ÿùT ûÑú/ûÑú¦ßK ÿ4.—ÅîèèèK ÿ4.—ÅîèèèK ÿpb&ÄËä<5ÄËä—ÆèèèM% ÿ4- <5ÄËä—Æèèè444ÿ*P!Ö°ßðððüó.4.Æ Ï*P!Ö°ß*P!Ö°ßüóôÔýôôôüó.4.º”Ã8ä *P!Ö°ßüóä üó.4.Ö°ßüóä ÌÌÌA ÿÒÒàöA ÿ âüÒâà.. ÒÒàö444ÿç ØåÁôæÜDB!ß44ÿÌÌÌ444ÿüóåââw…ÊÆô¿µñìÐ÷ó bbbÿJJJ***ÄÄÄÈÈÈÒÒÒèèèbbbÿtttŒŒŒtttÄÄÄÈÈÈÒÒÒèèèÌÌÌ444ÿ333```ìììÄÄÄÜÜܾ¾¾444ÿððð>ç+Y‚SM‹‹óð8ð)»Âˆˆˆ444ÿÌÌÌÿú+Õúþîëèèèÿú+Õúþîëèèèèèèÿð +[¥óü+µøþë ÿèèèôôôèî ²É÷üÐùþgnêøë ÿèèè})ÿ)1Ë”ïîg Ï5ü×û})ÿ‘åýö‘åý©H Êüûü×ûM&%ÿf ò'ûÇû”¶îlJüÙü|*(ÿn öcðîþƒýÃÜÛT ø¬÷M&%ÿ³ÚÛK ÿÔàøÔàÚ`N&ÌÒâèèôK ÿÔàøâÔàø, èèôK ÿÔàød~Ò, øÌÓöèèô444ÿñØ ³î ³î, 4- ÌÓöèèôððð ,ôÔýððð ÒÌÒðððsu:G”à ð ,ôÈäääsu:º”à äääsu:c°ß.4.Öäßüóä ÒÌÒ .4.ÖäßUÔ# IDATÿA ÿ88.. ð.. 8#SQ(ÿÿA ÿ8öÒÒà.. 8#SQ(ÿ444ÿÿç Ø/4JQ$0 ÑÍú7 û=áÌÌÌ444ÿäääåââU{uKÜÊÆô¿µñìÐ÷¢F&ç Ø444ÿÿCCCÿ¶¶¶ÄÄÄÖÖÖÈÈÈÒÒÒ‰Sþ444ÿÿCCCÿŒŒŒŒŒŒÈÈÈÒÒÒ‰Sþ444ÿ444ÿäää333$$$ÄÄÄììì°°°ÄÄÄÜÜÜG¼BBB444ÿ444ÿÌÌÌÕÕÕ+Y‚>>>ûÈø8ð)»ÂÂÂÛ†BBB444ÿÿÿîëÕúþÃéîë ?ÿÿÿú+Õúþ+îë ?ÿÿð îëÕúþ¥óü+µøþë?ð ÿèèèÿöööèî ™ðú¥óügnêøàþ?ð ôôôÿ})ÿ)1Ë™ïóg Ï5ü×û@^!M% ÿÿ})ÿ)sD‘åý=þûü×û@^!M% ÿÿf ò'6h#üÙü X³/ÿM&%ÿ|*(ÿœîðn öT ¥dÃT ø¬÷ÓR 4üM&%ÿM&%ÿÿK ÿ4., , `N&ÌÒâpb&K ÿÿK ÿ4.`N&Ôàø`N&pb&K ÿÿK ÿ4- `M4.ÌÒâpb&K ÿÿñØ4- 4- `Mœ‚.4- ÌÓöpb&K ÿüóôÔý.4. ,ðððüó‹Æôôô ,ôÔýää䋯üóä üó.4.üóÒÌÒÿõ 2åºÒüÈðä>ÝþçÉsP–Êö­¯Øÿõ 2åºÒüö8.. ÝþçÉsP–Êö­¯Øäääõ 2åÝÓý¼¾ßÑÍúÿ"ßÉr8rêãÑëäääýñ8ôúñý«…è·¢íìÐ÷ÞS^ºÚó(ÌÌÌÿ ãâÒÒÒáááÈÈȶ¶¶ÒÒÒÅŽ+w­...ÿ ãâÒÒÒáááÒÒÒÅŽ+w­...äää^^^×°¯ÜÜÜÜÜÜÄÄÄÜÜ܃Lé¹ïDììì444ÿ444ÿÕÕÕJJJ———ŒŒŒ­³uð)»8ÂÂÂM³¹ïDììì444ÿÿööö îë 5 Áèé ÿööö îëÃéîëÃé 5 Áèé ÿèî øõòøîëµøþë?³àþîëÿÿÿöööúõàþµøþnêøàþM ³àþîëöööÿ3ôñÐýü×ûÏ52Ï5ü×û|™NÀ¢ß³Ûôÿ3ôñÐýü×ûʺósDlJÆÓö|™NÀ¢ß³Ûôÿ3ôñš÷üÙüÆÕö99F“Hö¨åš÷³ÚÛM&%ÿœîðÒcñûÑúYƒâÜ'ä{ø¬÷A0ÓïгÚÛÿ3ôñþçýÌÒâ4.ÌÒâ¬SŽ…×µô÷ÿ3ôñþçýÌÒâÌÒâ`N&ÌÒâ¬SŽ…×µô÷ÿ3ôñþçýÌÓöÌÓö`N&ÌÒâ¬SŽ…×µô÷ÿ3ôñʺóÌÓöÌÓöÄËäÌÓö¬SŽ…×Ù444ÿÖ°ß ,.4.ðððÖ°ßôÔý ,‹Æ.4.ôôôäääÖ°ßüó.4..4..4.ÿëêÀýÿ@fºÒüÈðäÉsPZÉÅÇðÿëêÀýÿ@fºÒüÈðäÉsPZÉÅÇðÿëêÀýÿ@fÝÓýìÐ÷Ér86¯¶é§444ÿ444ÿÿùÜÈ ä8ôfúñýôãûÞS"­ý× üó444ÿÿÚÚÚçòñ>çÒÒÒÒÒÒÅŽ+;rÕäääžžžÿÚÚÚçòñ>çÒÒÒÒÒÒÅŽ+;rÕäääžžžää䘘˜ç×°¯ Ý´ÜÜÜÜÜ܃Lé}´¢¢¢áááñññÌÌÌää䬬¬ÍÍÍÕ§~ŒŒŒ­³uM³}´¢¢¢ñÈÌÌÌÿööö? i;Áèé èèèÿööö? i;Áèé èèèÿëöööM  àþësE³àþëèèèèèèîëð M õàþîëMÓâþëöööÿÿÃþæäÐýü×û|™N„g²›ïÿÃþæäÐý6G!ü×ûÆÓö|™N„g²›ïÿÃþæäš÷Î$üÙüüÙüF“H„g²eé/M&%ÿM&%ÿËòó$Ùðù`Ì6G!%ø¬÷Aô˜Â+¾÷;,/M&%ÿÿÃþæä4.þçýÌÒâ¬SRJªÍ ÿÃþæä4.þçýÌÒâ¬SRJªÍ ÿÃþæä4.þçýÌÒâ¬SRJªÍ ÿÃþæä4.þçýÌÓö¬SRJªÍ ÌÌÌ:`1ðððôÔý:`1.4.ÒÌÒ*P!ÒÌÒFl=ððð.4..4.ÒÌÒ*P!ÒÌÒ*P!ä ÒÌÒ*P!ÒÌÒÿöööÿt0<4sÉõèÈñèèèÿöööÿt0<4sÉõèÈñèèèÿöööÿt0<4sÉõèÈñÌÌÌÿööö$ûl!!<4^ºÚý× 8ä üóä ÌÌÌÿööö&&&Mö<4w­äääèèèÿööö&&&Mö<4w­äääèèèÿööö&&&Mö<4¹ïD¢¢¢+++ñññÌÌÌ444ÿäääöööˆˆˆÕ§~<4¹ïD¢¢¢i;ÂðñññÌÌÌÿööösE»ä èèèÿööösE»ä èèèÿöööúaK³ùë ôôôèèèÿöööúaKŸµùîë èèèÿööö=þû6G!<4À¢ß›ïèèèÿööö=þû6G!<4À¢ß›ïèèèÿööö=þû6G!<4À¢ß›ïdÑüý³ÚÛM&%ÿËòóöööÜ'— <40Óï+¾÷Ÿ>ÅÔúÑüý³ÚÛÿööö?þ4.<4žÚËó èèèÿööö?þ4.<4žÚËó èèèÿööö?þ4.<4žÚËó èèèÿööö?þ4.<4žÚËó ÌÌÌ$$$ÿ ,.4.Ö°ßððð ,.4.ÒÌÒ.4.ÒÌÒôÔý ,.4.Ö°ßðððôôô8.4.Ö°ßððð ,.4.7:›’Ì.4.ÒÌÒèÈñ8.4.Ö°ßäääüó.4.Ö°ßüó.4.ÒÌÒ.4.ÒÌÒä üó.4.Ö°ßÌÌÌãð"V IDATÿööö"BèÈñèèèÿööö"BèÈñèèèÿööö"BèÈñÌÌÌ444ÿÌÌÌ444ÿäääööö 3þý× 8ä ÌÌÌÿöööTTT¶¶¶èèèÿöööTTT¶¶¶èèèÿöööhhh¢¢¢ðððÌÌÌ444ÿäääöööTTT¢¢¢+++ñññðððÌÌÌÿööö èèèÿööö èèèÿèèèÿööö ööö èèèÿèèèÿöööúîë ööö èèèÿöööo›ïèèèÿöööo›ïèèèÿöööo›ï5 ×þÿ)³ÚÛM&%ÿËòóöööom .ãúd;,ÅÔúÑüý³ÚÛÿööö?þËó èèèÿööö?þËó èèèÿööö?þËó èèèÿööö?þËó ÌÌÌ$$$ÿ ,.4.Ö°ßððð:`1ÒÌÒôÔý:`1Ö°ßüóôÔýôôô ,.4.Ö°ßððð­ÕkÄÅÌ›’ÌôÔý:`1Ö°ßüóèÈñüó.4.å¿îAÒÌÒóAå¿îí ää ÌÌÌÿèèèÿèèèÿèèè444ÿÌÌÌ444ÿüóèÈñüóä ðððÌÌÌÿèèèÿèèèÿÌÌÌ444ÿÌÌÌ444ÿäääñññÌÌÌÿèèèÿèèèÿ ôôôööö èèèÿööö ôôôööö èèèÿèèèÿèèèM&%ÿËòó5 ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿËòó5 /Ñüý×þÿXÑüý³ÚÛÿèèèÿèèèÿèèèÿÌÌÌ444ÿÌÌÌ$$$ÿ*P!ÒÌÒä üóôÔýôôô *P!su:‹ÆÒÌÒä üóôÔý*P!ÒÌÒ.4.ÒÌÒóí ää ÌÌÌ444ÿüóä ÌÌÌ444ÿüóä ÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ|*(ÿÑüý³ÚÛM&%ÿ³ÚÛ$$$ÿ ,ôÔýüó.4.Ö°ßüóôÔýôôô ,ôÔýôôôüó.4.Ö°ßüóôÔýôôôüóä üó.4.Ö°ßüóä ÌÌÌ444ÿÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛ$$$ÿ:`1Ö°ßðððôôô ôôôFl=Ö°ßäää ôôô*P!Ö°ßÌḬ̀7z÷ IDAT€ÿ444ÿñññÌÌÌ444ÿñññÌÌÌ444ÿñññÌÌÌ·VÿIªå444ÿ...ÒÒÒÌÌÌÿööö ÌÌÌCCCÿ½½½444ÿôðòå.'#ôÙÝ ñïÆCÿåáã ½½½444ÿùòòêËïï/55ÜÜËïïCÿêãã½½½444ÿL Ãïð=âZ&ö¦Ú òñÿ=´àá½½½S*ÿS*ÿM% ÿIªåIªåM% ÿÌÌ̶¶¶¬¬¬...šššÿ444ÿèèè öööäääbbbÿ-QQÿ444ÿCCCÿbbbÿWWWCCCÿ½‡2ÿCCCÿšššÿCCCÿCCCÿ½‡2ÿCCCÿšššÿCCCÿ444ÿôðòå:'#ô'#ô'#ô:åðòôñññ444ÿùòòCC5ú$$/5589ú$$/55ê/55ùñññ444ÿL Ãïð=âZ&öZ&ö=:Z&öâsÃïðL ñññ0P'ÿ;5.;5.0P'ÿS*ÿS*ÿM% ÿ³Ûô³Ûô·Vÿèèè ¬¬¬ÈÈÈñØRÿ444ÿèèè ööö¶¶¶vvvÿá½½(RR‘ÁÂÿ444ÿ444ÿbbbÿÒÒÒCCCÿbbbÿCCCÿ\††ÿvvvÿ\††ÿCCCÿCCCÿ½‡2ÿÕÕÕ[‘æ333~~~åCCCÿCCCÿ½‡2ÿÕÕÕ[‘æ333~~~333CCCÿCCCÿ½‡2ÿCCCÿšššÿCCCÿCCCÿmòvs IDATšššÿbbbÿôðò64.'#ô=;'#ô64.áã 444ÿùòòú$$8989/98989/55ÜÜãã444ÿL Ãïð6Z&ö=:Z&ö1´àá444ÿ½‡2ÿÿýÇÿ½‡2ÿаÙQ›Ì¢üýаÙšššÿ;5.;5.šššÿbbbÿ¬¬¬ÿêêêÿ¬¬¬ÿÔàøê5ÿ})ÿèèè 骧4- áLöööööö®®®CCCÿ ²ˆˆÑ¡ ]ŽCCCÿ444ÿäääÒÒÒÒÒÒfff©©©CCCÿbbbÿWWWááá\††ÿêÜÜ·ÛÛ5;<šššÿ½‡2ÿÿCCCÿzDèè袢¢^^^ÑÓüÖÖÖÿÿCCCÿzDèè袢¢^^^®®®ÖÖÖÿbbbÿvvvÿSQ(ÿvvvÿSQ(ÿvvvÿšššÿ½‡2ÿÕÕÕQ‡ÜËËËttt333SQ(ÿåšššÿSQ(ÿCCCÿ½‡2ÿ¼ˆXÿCCCÿ¶¶¶CCCÿ444ÿðòFB=;=;ÄÄÓ=;'#ô...å444ÿòòCCú$$895;</9™ÃÃ/9ý889ú$$...ê444ÿÃïð=Tõó1ÃÆù=:ÃÆù=:Z&ö...=½‡2ÿÄËäN(EÄËäÆÀ\ÿ½‡2ÿ#-ÒÌÒM% ÿM% ÿfffÅËÒfffÒÒÒ¶¶¶Â¶¶¶M% ÿÉúù)})ÿj¯éÿÿÿ3ôñ—Ƭ¬¬BBB444ÿ555 êêêËËËÿèèè Ëïï ÙØCCÿ fff©©©$$$½½½CCCÿbbbÿñññÕÕÕ444ÿÑËËòòËïï/55ÿRÿM% ÿ%#ÿK ÿÿS*ÿvvvÿS*ÿšššÿ½‡2ÿ#í˜ÝhËËË¥Û0WWWèèèÝÛ²zDïÄÄÄSQ(ÿSQ(ÿËËË¥Û0ËËËSQ(ÿèèè®®®RRRzDïÄÄÄSQ(ÿSQ(ÿ˜˜˜vvvÿvvvÿvvvÿ½‡2ÿ#%N˜˜˜#%NvvvÿšššÿvvvÿSQ(ÿSQ(ÿÖÖÖÿàvvvÿÖÖÖÿvvvÿSQ(ÿSQ(ÿšššÿ~~~–Êö ŒŒŒÝÛ²»½æðò~~~GIr‰…VÿšššÿFBQ‡ÜÍýþËËËŠŠŠWWWåÙÝ '#ôÄÄÓvu9:uy˜9=kvuÿÙ'#ô:ðððê89ÈÇüþÈ/9su@™ÃÃ2ý889ú$$5ððð=âÊýþ=:=:ÃÆù=:ÃÆù=:Z&öâðððBv•<5y›PEnF9=kúÏé})ÿ^„UÿÝÓýÝÓý^„UÿS*ÿM% ÿ4.4.½‡2ÿS*ÿM% ÿ0P'ÿM% ÿS*ÿS*ÿS*ÿM% ÿbbbÿÞBGpbbbÿ...ˆˆˆˆˆˆbbbÿšššÿßûüÎ#ÿ6@]ßûüÿ íìöööÿÚÿ4- èèè ˜˜˜BBB444ÿÿÕÕÕèèè öööÿ+++mIIttt²ˆˆ(RR444ÿ ð>>>tttÕÕÕ©©©ÿñññ¶¶¶fff~~~èèèäääããÕÕÕmIIåµ´½½½M% ÿ·V.ÿ|*(ÿèèèM% ÿ%#ÿʺóþçýóõÃöööK ÿRÿS*ÿGpàEm2CCCÿSQ(ÿšššÿšššÿ¹·ŽQ‡Ü[‘æfffèèè '#ôttt¼ˆXÿèèè:ÕÕÕÝh~~~SQ(ÿGIrGIrCCCÿ 888 ÅÇðSQ(ÿ+++vvvÝÛ²†¼~~~SQ(ÿGIrGIr¢¢¢ ˜˜˜ÝÛ²vvvÿG¼–Êö¢¢¢555G¼ÍÍÍ¢¢¢SQ(ÿGIrj6 ‰…Vÿvvvÿ½‡2ÿBBBÙÝ ®®®   ®®®CCCÿSQ(ÿGIrSQ(ÿj6 ~~~‚‚‚ÅÇð/- ‚‚‚~~~ ááá¥o¹·Žšššÿ…‰¸tttD“ÂŒŒŒ/-ÌÌÌfffÌÌÌ'#ô<<-c<<-=;'#ôððð98ÕÈÇü89/9™ÃÙÃÙÃÃ2ÈÇü5;<2](ðððZ&ö<4=:ÃÆùCr 8=:ÃÆù=:=:=:TõóÿýÇÿ¸YTIªå·VÿIªå0P'ÿLÚSÑž1:ÿi;<4CyÎÿ5 ôþçý4.<4ÄÌø­Ö #$ÿ,/3¡}ÓS*ÿ;5.ÿÚÄÌø<4ÿ&ÿÚÄÌø­Öšššÿššš...ˆˆˆšššÿ"î¾¦Ú ˆˆˆÿ+++ñññÌÌÌvvvÿ³›)õ$`ŠŠŠ%#ÿéë èèèÿ3ôñµô÷ÿ^^^ŠŠŠÿööö555½½½ÿöööòòòÿ‚‚‚“··ëÇÇöööhhhŠŠŠK ÿ4- —Æèèèÿ ôôô‚‚‚©©©½½½ÿ ôôô‚‚‚©©©WWW©©©½½½M% ÿ4.6ÊýüÌÒâËó èèèÿèèèÿèèèÿ5 ô4- ®ê‰…Vÿ«¯Þäää+++ÕÕÕ+++½½½SQ(ÿ»½æ èèèÿ+++ÕÕÕööö¯y$CyÎÿ¥oQ‡ÜTTTñïÆÅÇð¾¾¾ŒŒŒ888~~~+++zDïCyÎÿ¥o[‘æ;9ÑÓü/-ÅÇð¾¾¾***ÿ¾¾¾NNNôôô¥o†¼廽æ555åÅÇð;9­¯Øvvvÿ¢¢¢qm>íñ ÝÛ²»½æÈÈÈ888ECÅÇð;9ÅÇðqm>w{ªšššÿ~~~ ôôô¥o–ÊöÑÓüRRRG¼gòôôô‚‚‚~~~èèè444ÿ...àN>ª IDAT¶¶¶‚‚‚©©©åÑÓü>>>¶¶¶;9­¯Ø444ÿ...'#ôÿÙuv5cý‹ŠË<<-ÃÅúíñ ¾¾¾ù/5589ý8ËÅÄsu@0Ðþÿ‹À89ÈÇüðð¾¾¾...Z&ö=:ÃÆùCr cý½Žô=:ÃÆùºî¾¾¾¸YT¸YT0ÿ00P'ÿ#J–4J–4„Vb0P'ÿÿi;ÌÒâÄÌø½‡2ÿK ÿM% ÿ{ÿËó þçýÌÒâM% ÿ #$ÿíÔýðÿÑÍú0P'ÿÿ0P'ÿ0P'ÿ¼ˆXÿxo5ÅËÒÿ&;5.ÄÌøÄÌøbbbÿšššðððÒÒÒ°°°bbbÿbbbÿ"î¾Z&öÒžnbbbÿËËËšššÿììì§û£ÒtttK ÿ(=þû?þòòòèèè3ôñÍ èè芊ŠöööÕÕÕèèèèèè ÿ3ôñ±roÓ¯¯èèèèèèòòòŠŠŠK ÿM% ÿ6F Ëó ®êèèè ð>>>+++tttÕÕÕ½½½ ð>>>+++tttÕÕÕ©©©½½½ÿ|*(ÿÿÿS*ÿj1"6ÅÔúÌÒâËó èèèèèèèèèèèèèèèèèèÁéÌÓöDFBöööWWWCCCÿso4 èèèèèèSQ(ÿqm>½½½èèè [‘漈XÿÝh [%ÐGIr®¨D***888©©©¹·Ž¥oWWW¹ïDèèè¹ïDèèèÅÇð™cGIr®¨DBBB¾¾¾^^^¥oBBBôôô¹ïDáááÅÇð zDïGIr®¨DÅÇð …‰¸ÝÛ²ÅÇð ç±\ »½æ¥oGIr®¨D“Â~~~/-¤p@CyÎÅÇðRRR¢¢¢[‘æ/-èèè¹·ŽèèèÌÌ̶¶¶èèèèèè~~~WWWÑÓü/-žžžèèè­¯Øô'#ô=;=;ÿ'‹ŠË‹ŠËÿ'ÃÅúÝÛ²ããÑËËÈÇü‹À‹Àg==89·ÛÛL Z&ö=:úÈûýúÈûÃÆù ÞÝÆÓö¸YTCkeùCzÞÝÓý÷ÆÆ÷ÆÆÝÓýÿÿ3ôñÌÒâ4.ÌÒâžÚÍ ÁéÐøúM% ÿM% ÿËó 4.ÌÒâÄÌøÿ,íÔýðÿÑÍúаÙèèèаÙаÙ=:;5.ÅËÒÌÒâÿÚÌÒâ—Åî888ððððððššš888ÅËÒÅËÒ‘´èèèòòòÕÕÕ©©©šššÿRRRÂÂÂ!ÿ6F Í ³ÛôK ÿÚÿËó èèèÿ èèèèèè3ôñÍ K ÿÚÿ4- —Æèèèÿ(ð´ÕÕÕòòòèèèK ÿ(ð´ÕÕÕòòòèèè½½½èèè„ÖØèèèÌÒâÅÔúÑûäËó èèèÿÿM% ÿ ØþüRÿÿttt...+++íñ 555~~~SQ(ÿËËË÷ÇÖèèèÿðò›ŸÎCCCÿ‰…Vÿ¾¾¾+++ÞB¾¾¾~~~®¨D[‘æ~~~:@¤ÕÕÕÅÇð[‘æ©©©ìììSQ(ÿÍÍͽ‡2ÿèèè–ÊötttRX¼èèèSQ(ÿ   ¢¢¢[‘æèèèèèèèè袢¢RRR [‘æ¹·ŽRX¼èè袢¢™cTTTÅÇðèèèQ‡Ü^^^ †¼¹·ŽRX¼èèèèèèèèèÅÇðÞBèè袢¢/-èèèèèèÅÇðÅÇðèèèèèè~~~/-­¯ØÌÌÌÙÝ ÃÅúÿÙuv5uv5ÿÙÙÝ 64.ððð89ËÅÄg==Ðþÿ]‰¿Ðþÿg==ÑüÇÈÇüÈÇü/55ððð¦Ú ÃÆù=:ÃÆùúÈûÃÆù=:ÃÆù¦Ú 1ÿeù:- CkÃÅó[’öèèèÿõ >éåÂóÝÜÿööö?þËó èèèÿööö?þ.ïÐøúµô÷ÿ3ôñ4.ÌÒâ³Ûôÿöööÿ,øÉñèè輈Xÿ=:ˆ‘ËÌÒâ4.—ÅîèèèÿJJJÒÒÒððð...žžžÿJJJñÈÌÒâ4.á8žžžÿöööŒŒŒfffM% ÿ_‡ ÊÊʳ›ƒ×ï!ÿ`MÌÓöËó èèè%#ÿ\/®êÿ555½½½K ÿÚÿóõèèèK ÿÚÿóõèèèM% ÿ4- —ÆèèèK ÿ4- —Æèèèÿd’äæ 5 ô³ÛôÿèèèK ÿ³Ûôÿööö&&&äää;9­¯Øÿ‚‚‚#í˜CyÎÿ;9ÅÇð®¨DRX¼‚‚‚¹·Ž­¯Øÿqm>w{ªÿèèèÿJJJ¢¢¢‚‚‚ŠŠŠôôô‚‚‚fffvvvÿÝÛ²ÅÇðèèèÿ^^^ÝÛ²ÅÇð^^^¢¢¢èèèbbbÿ¶¶¶èèèÿ¾¾¾***ÿ^^^ŠŠŠÿ^^^ŠŠŠ444ÿô:'#ôÿÙ<<-ÃÅúíñ ÝÛ²áã ù/5589/9 8‹Àsu@ÂÆüþÈâ·ì·ÛÛããL âZ&ö=:ÃÆù=:ÃÆù=:ÃÆùºî@áß~Ýßÿöööo}˜Wéèèèÿööö"B.4.ÒÌÒèÈñèèèÿèèèÿèèèÿ3ôñ6G!ÌÒâ³Ûôÿöööÿ#-èÈñèèèÿ8аÙÿ¤p@=:Tc­Ëó èèèÿööö>>>888ÈÈȶ¶¶èèèÿööösEá8888ÈÈȶ¶¶èèèÿ‚‚‚fff})ÿÐüûj1–Ïñ³Ûôÿ íì, Áé èèèK ÿËó èèèÿööö èèèÿ ð(³ÛôK ÿËó èèèÿ=þûÍ èèèK ÿÚÿ\/—Æèèèÿèèèÿèèèÿ3ôñµô÷ÿööö JJJžžžÿ;9GIrfffSQ(ÿÅÇð‚‚‚~~~èèèÿèèèÿ¾¾¾ÄÄÄfffbbbÿñïÆÅÇðèèèÿ+++WWW~~~+++½½½bbbÿ¶¶¶èè轇2ÿCyÎÿèè轇2ÿ[‘æèèèÿèèèÿèèè•VøI IDAT444ÿô64.=;ÃÅú=;ÃÅúÊÌÒáã ½½½444ÿ(RR5;<þÈÈÇü89/9™ÃÃ89ÈÇüÑËËãã½½½444ÿL <4=:ÃÆù=:ÃÆùÄÌû´àáÿööö èèèÿöööÿ>éåà èèèÿ5 ô³Ûôÿèèèÿèèèÿöööêêê èèèÿööö?þÁé èèèÿèèèÿeùÐüû4- ü×û)ÌÓö³Ûôÿ èèèK ÿËó èèèÿ555½½½ÿ=þûËó èèèÿ3ôñÁéòòòÿèèèK ÿÚÿóõèèèÿ5 ô³Ûôÿèèèÿèèèÿèèèvvvÿ®®®ôôô‚‚‚fffÿ‚‚‚fffSQ(ÿÅÇðèèèÿèèèÿèèèSQ(ÿáã ...'#ôÙÝ '#ôÙÝ '#ô«¯ÞÌÌÌ-QQÿãã(RR89ý8þÈÈÇü89ý8þÈΣØú$$Ø®®ÌÌÌ€TSÿ´àá...Z&ö=:ÃÆù¦Ú Z&ö¦Ú '#ô«¯ÞÌÌÌÿèèèÿèèèÿèèèÿèèèÿèèèÿööö?þËó èèèÿèèèK ÿÚÿéëòòòÿòòòÿ?þËó èèèÿööö èèèÿèèèÿèèèbbbÿŠŠŠÿ^^^ŠŠŠ444ÿÌÌÌSQ(ÿáã ...'#ôÙÝ '#ôÊÌÒáã å­¯Ø444ÿÌÌÌ-QQÿãã(RR89ÈÇü89ÈÇüØ®®êÓ¯¯444ÿÌÌÌ€TSÿ´àá...Z&ö¦Ú '#ô÷Ïý´àá=€¬­ÿèèèÿèèèÿèèèÿööö èèèÿ3ôñËó èèèÿööö555½½½ÿöööòòòÿèèèÿJJJžžž444ÿôáã ôáã ññññññÌÌÌ444ÿùãã(RRÑËË/55ç½½ññññññÌÌÌ444ÿL ´àáL ´àáññññññÌÌÌÿèèèÿööö èèèÿèèèÿèèè Ì„Ì IDAT€ÿ444ÿÌÌÌ444ÿ½½½444ÿÌÌÌ\††ÿØ®®½½½444ÿÌÌÌ444ÿ½½½CCCÿ444ÿ444ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ #$ÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ444ÿ444ÿ444ÿ444ÿÿM&%ÿM&%ÿ³ÚÛM&%ÿM&%ÿ³ÚÛM&%ÿM&%ÿ!'Pÿ444ÿA ÿóÝÜ444ÿßÙ°!'PÿýÔ!'Pÿ!'Pÿ!'PÿßÙ°ßÙ°!'Pÿ444ÿðððñññ444ÿ444ÿ444ÿ444ÿÌÌÌ444ÿ444ÿÿöööÿ³ÚÛM&%ÿ×þÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ×þÿM&%ÿM&%ÿM&%ÿM&%ÿ×þÿM&%ÿ!'Pÿ!'Pÿ!'Pÿ444ÿù-QQÿ #$ÿ ã #$ÿ #$ÿ #$ÿ444ÿ!'Pÿ*ý,ßÙ°!'PÿýÔ!'Pÿ!'Pÿ!'Pÿ!'Pÿ>çñññCCCÿÌÌÌ444ÿ444ÿ444ÿñññU¶¹; IDATñññCCCÿ444ÿ444ÿ ÿÿÿÿÿM&%ÿ/)³ÚÛM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ/)/³ÚÛ³ÚÛ/)M&%ÿM&%ÿM&%ÿßÙ°!'Pÿ"ó!'Pÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ!'PÿÌÌÌü3-QQÿ-QQÿòò\††ÿ444ÿ #$ÿA ÿ÷èè #$ÿ #$ÿ #$ÿ #$ÿ #$ÿ #$ÿè #$ÿ444ÿù444ÿ444ÿ444ÿ!'Pÿý2K)Qÿ!'Pÿý,*ßÙ°ßÙ°*!'Pÿ!'Pÿ!'Pÿ444ÿ>çMöñññ444ÿ444ÿ444ÿ444ÿS*ÿMöñññÌÌÌÌÌÌñññMö444ÿ444ÿÌÌÌÿôôôèèèÿöööèèèèèèöööÿÿÿ³ÚÛM&%ÿ/mûõ/M&%ÿM&%ÿM&%ÿ×þÿM&%ÿ×þÿ/M&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ×þÿÑüý/œÿøÑüý×þÿM&%ÿÑüýœÿø/M&%ÿ×þÿM&%ÿ×þÿM&%ÿ!'Pÿ"óæA!'Pÿ!'Pÿ!'Pÿ!'PÿRRRÿ-4ßÙ°ßÙ°-4"ó!'Pÿ!'Pÿ@l=ãã444ÿ444ÿ)T„ÿÓ¯¯444ÿ½½½ÍÎþ(RR-QQÿóÝÜå¿ô#- ãèA ÿA ÿ #$ÿ #$ÿ #$ÿè #$ÿ O'ÿ #$ÿ,óÝÜèòâ, #$ÿA ÿ #$ÿ%444ÿRRRÿÌÌÌ-QQÿCCCÿßÙ°!'Pÿ*(*Öþÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ*'3ßÙ°ßÙ°Öþÿ'3*!'PÿýÔ!'Pÿ444ÿÂð>ç<4>ç>çÂðÌÌÌÌÌÌ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿÌÌÌ444ÿÂð>çzDï444ÿ444ÿÌÌÌÂðzDïCCCÿðððÿ öööÿÿÿÿ ööööööÿ ÿM&%ÿ/³ÚÛ³ÚÛM&%ÿ×þÿ))//ÑüýM&%ÿ×þÿM&%ÿ³ÚÛM&%ÿ/)/n ö“ )³ÚÛM&%ÿ×þÿ“ n ö/))³ÚÛ!'PÿýÔæA32"ó!'Pÿ!'Pÿ!'Pÿ"ó!'Pÿ!'Pÿ!'PÿßÙ°ßÙ°!'Pÿ1+ 44)þÎCC1+!'PÿCCCÿÀ”Ãù444ÿù444ÿ(RR à°ÌÌÌ à°ÑËËç<4 9*Âðñññ444ÿ444ÿ444ÿCCCÿMö444ÿCCCÿððð444ÿ444ÿCCCÿ>çEm2ÄÌøÂðÌÌÌÌÌÌ>çÄÌøƒ}zDïCCCÿèèèôôôöööÿÿÿ ÿÿÿööö ôôôèèè³ÚÛ%7ÑüýM&%ÿ³ÚÛ)//77//)×þÿÑüýf q0ù’õ ³ÚÛ)/Éú q0ùf /M&%ÿßÙ°ý,øÓÌ5;<Þä ßÙ°!'Pÿ!'PÿCCCÿCCCÿ-4"ó-4CCCÿ!'Pÿ!'Pÿ-4?opÜÜøÓÌýÔ!'PÿßÙ°ÏÕþÍÎþ?op-4!'PÿêûРü3444ÿ444ÿ-QQÿ444ÿ-QQÿ-QQÿ›Ç’iÀÁÿ-QQÿ444ÿãã5ŒÑËËÌÌÌÌÌÌãã(æA-QQÿè 30: #$ÿA ÿ#-3_,òâA ÿ #$ÿ #$ÿ,, 3ðÎû O'ÿóÝÜèíÔý 3, #$ÿóÝÜCCCÿÕÿÿÌÌÌ444ÿ444ÿCCCÿRRRÿRRRÿCCCÿCCCÿ444ÿ444ÿ 2ããÌÌÌ444ÿÓ¯¯ôÎýêCCCÿßÙ°ßÙ°ý23;üÎÖþÿýÔ!'Pÿ!'Pÿ!'PÿK)Qÿ*'3'3*$ _'3!'PÿßÙ°ßÙ°'3F˜qÊÖþÖþÿßÙ°!'PÿßÙ°ÖþÿÊÖþF˜qý2!'Pÿ!'PÿÌÌÌñññÂðÄÌø9=k<4444ÿÌÌÌ444ÿÂð>ç>çzDïMöMöñññððð444ÿñññzDï~ª÷ÇÖÂðñññ½½½ÛAÙ IDAT444ÿ£ÑúÂð»“ÎBv•>ç>ç444ÿÿööööööÿÿÿööööööêêêÿöööÿÿÿöööööö èèèèèè ööööööÿ/7 g/³ÚÛM&%ÿM&%ÿ//mûõn öG’:+ön ömûõ/×þÿM&%ÿM&%ÿ×þÿ)/G’ÆÕ Ñüý×þÿM&%ÿÑüýÉûýÆÕ G’7×þÿM&%ÿ³ÚÛ"ó<<<ßÙ°ßÙ°!'PÿÞä "óæA32Šº»N~32;_6æA"ó!'Pÿ!'Pÿ1+¤©zÑ¡ ¿Åîý,ßÙ°￘“¤©z-4!'Pÿãã32ù444ÿ-QQÿ/55õ P¢ªuçÄÌø>çÌÌÌ444ÿ>ç>ç>ç<4Em2Bv•~ªƒ}<4>çMöñññ>çBv•‚VcÄÌøñññÌÌÌñññÂð¾Šk~ª>çÂðèèè èèèÿöööööööööööööööÿÿÿööö èèèèèè öööÿM&%ÿ×þÿ)/n öÉú š÷ú³ÚÛM&%ÿ×þÿ)/7ÉûýÑüý×þÿ)³ÚÛM&%ÿ×þÿ)ùÉú ÉûýÑüý/Ñüý³ÚÛM&%ÿ/Ñüý/77ó’õ Ñüý×þÿ)³ÚÛ!'Pÿ-432ç½½Þä ßÙ°!'PÿýÔý,"óæAï¿Þä ßÙ°!'PÿßÙ°!'Pÿ;_6ÍÎþ)þÎÏÕþßÙ°!'Pÿ1+ 44ç½½Þä ßÙ°iÀÁÿËtsÌÌÌ444ÿÌÌÌ444ÿùããÌÌÌ444ÿ(RRsu@tH}½½½iÀÁÿ—@?A ÿ ã^ðÎûÝÓýóÝÜ #$ÿèòâ, 3àÍûíÔýéÿóÝÜ #$ÿè2àÍûíÔýèòâóÝÜ #$ÿè 3ðÎûðÿà±ÙCCCÿêòò½½½444ÿÌÌÌ444ÿññññññÌÌÌ444ÿ*P!å¿îñññÌÌÌ444ÿ*P!ôÎý®®®!'Pÿ*3.4ÍÒÌÖþÿßÙ°!'Pÿ*ý2üÎÖþÿßÙ°!'Pÿ*,3ùØÿüÎÖþÿßÙ°!'Pÿ*ý2(üÔÍÖþÿßÙ°444ÿMöEm2»“ÎÂðñññÌÌÌ444ÿ>çÂð>ç<4ÄÌøÂðñññÌÌÌ444ÿ>çEm2÷ÇÖÄÌøÂðñññÌÌÌ444ÿzDï 9*»“ÎÂðñññÌÌÌÿööö èèèÿèèèÿ ööö ööö èèèÿööö èèèÿööö èèèM&%ÿœÿø“ Ñüý³ÚÛM&%ÿ×þÿ)×þÿXÑüý/Ñüý×þÿ)³ÚÛM&%ÿœÿø“ Ñüý³ÚÛM&%ÿ/mûõ“ Ñüý³ÚÛ!'Pÿ;_6Å¡ÊßÙ°!'PÿßÙ°!'PÿßÙ°!'PÿßÙ°!'Pÿ;_6ÍÎþøÓÌßÙ°!'Pÿ"óÞä "óæAøÓÌßÙ°-QQÿ/55ÑËËÓ¯¯444ÿÌÌÌ444ÿ(RRç½½ñññÌÌÌ444ÿ(RRÑËËÓ¯¯ #$ÿóÝÜ #$ÿ,íÔýèå¿ôA ÿ ãü+à±Ù #$ÿèòâóÝÜ O'ÿíÔý,ëñåòâèòâóÝÜ #$ÿ,2Í¡øóÝÜ444ÿððð:`1Ö°ßÌÌÌ444ÿÌÌÌ444ÿùòò½½½444ÿùããÌÌÌK)QÿÖþÿ..4üÔÍÖþÿßÙ°!'PÿýÔý,*ý2ÙúÍ'3ÙúÍßÙ°!'PÿßÙ°!'Pÿ'3ÙúÍßÙ°!'Pÿ*ý2ÙúÍßÙ°444ÿððð>ç<4ÄÌøÂðñññÌÌÌCCCÿñññ>çÂð>ç³á ñññMö³á ÌÌÌCCCÿzDïÄÌøÂð>ç­Ö444ÿðððzDñññÌÌÌÿööö öööòòòÿ ôôôööö èèèÿ ööö èèèÿèèèÿööö èèèM&%ÿ³ÚÛM&%ÿ/Ñüý×þÿ)³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)×þÿ)³ÚÛM&%ÿ×þÿXÑüý×þÿ)×þÿ)³ÚÛM&%ÿ×þÿ)×þÿ)/Ñüý³ÚÛCCCÿæAøÓÌßÙ°!'PÿßÙ°!'PÿßÙ°!'Pÿ1+ÏÕþßÙ°!'PÿßÙ°!'PÿýÔý,"ó½½½-QQÿç³á ÌÌÌ444ÿÌÌÌ444ÿððððððñññðððÌÌÌ444ÿMöÂðñññÌÌÌ444ÿÌÌÌî+Ö IDAT444ÿðððMöÂðñññÌÌÌÿööö èèèÿèèèÿèèèÿèèèÿèèèM&%ÿ|*(ÿM&%ÿ$$$ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ!'PÿCCCÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ)T„ÿ444ÿ444ÿA ÿ #$ÿ #$ÿ #$ÿ #$ÿA ÿ #$ÿ #$ÿ444ÿ444ÿ444ÿ!'Pÿ!'PÿK)Qÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ444ÿCCCÿ444ÿ444ÿS*ÿCCCÿCCCÿCCCÿ444ÿ444ÿ444ÿ444ÿ444ÿCCCÿS*ÿ444ÿ444ÿ444ÿ444ÿ444ÿCCCÿS*ÿÿ$$$ÿÿÿÿÿM&%ÿ$$$ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ!'Pÿ-QQÿ #$ÿ #$ÿ #$ÿ #$ÿ444ÿ!'Pÿ$$$ÿK)Qÿ!'Pÿ!'Pÿ!'Pÿ444ÿ444ÿCCCÿ444ÿCCCÿ444ÿ444ÿ444ÿCCCÿ444ÿ444ÿ444ÿCCCÿCCCÿÿÿÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ!'Pÿ444ÿ!'Pÿ!'Pÿ!'Pÿ!'Pÿ444ÿS*ÿ444ÿCCCÿ444ÿ444ÿ444ÿ444ÿ444ÿÿ444ÿ444ÿ•'XÓ IDAT€ÿ444ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿÿbbbÿ444ÿ444ÿÚÚÚ444ÿ444ÿ444ÿ444ÿM&%ÿ/M&%ÿ³ÚÛM&%ÿM&%ÿ³ÚÛM&%ÿM&%ÿM&%ÿ444ÿÿöööÿ444ÿbbbÿ‘ÁÂÿ444ÿððð444ÿ444ÿ444ÿ444ÿððð444ÿ444ÿÿÌÌÌÌÌÌCCCÿ444ÿ444ÿ³ÚÛM&%ÿ/p10×þÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ×þÿM&%ÿ/M&%ÿM&%ÿ/M&%ÿ/M&%ÿ|*(ÿ³ÚÛM&%ÿ ÿfæ>z IDATÿÿÿÿ)T„ÿžžž‘ÁÂÿ444ÿžžžo?>îÂÿvvvÿÌÌÌ444ÿ444ÿÌÌÌÌÌÌÌÌÌôôôäääòû$ñññððð444ÿ444ÿ444ÿööö½½½ñññÚïÒ444ÿ444ÿððð444ÿM&%ÿÑüýþÛØ/X³ÚÛM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ/X 7³ÚÛ³ÚÛ/n /M&%ÿM&%ÿM&%ÿM&%ÿ7M&%ÿ|*(ÿ³ÚÛ|*(ÿM&%ÿ444ÿ444ÿ444ÿÿôôôèèèÿöööèèèèèèöööÿÿÿ à°«L444ÿùÂ_ÿ²‚ÌÌÌq>444ÿŠŠŠ444ÿ½½½ÌÌÌ444ÿCCCÿ444ÿÌÌÌCCCÿ444ÿ444ÿäääÌÌÌ444ÿ444ÿäääÚÚÚ&&&444ÿ õÖãÐÚÚÚÌÌ̳ÚÛM&%ÿ %(ÑüýM&%ÿM&%ÿM&%ÿ×þÿM&%ÿ×þÿ/M&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ×þÿÑüý p10ÉùûqõùM&%ÿÑüý7%(n f M&%ÿ×þÿM&%ÿ×þÿM&%ÿM&%ÿ/M&%ÿ9,-M&%ÿ³ÚÛM&%ÿì[Xÿ„ÖØÑüý³/+ÿf M&%ÿM&%ÿCCCÿ444ÿ444ÿ444ÿRRRÿÌÌÌÌÌÌRRRÿÌÌÌÿ øöööÿÿÿÿ ööööööÿ ÿCCCÿˆç´ÅŽ+444ÿvvvÿbbbÿ444ÿJäñññ]ŽCCCÿÌÌÌ444ÿ444ÿ444ÿCCCÿ444ÿ444ÿñññððð444ÿñññ444ÿööö.ööö444ÿ444ÿÌÌÌ444ÿäääöööÌÌÌÌÌÌ+++÷ CCÚÌ 444ÿM&%ÿ/’ôø12p10/³ÚÛ³ÚÛM&%ÿ×þÿ)/)//ÑüýM&%ÿ×þÿM&%ÿ³ÚÛM&%ÿ/)Ÿ53VZþÛØÉûý)³ÚÛM&%ÿ×þÿš÷úþÛØVZ9,- )/)³ÚÛ³ÚÛ³ÚÛaËÍ/M&%ÿ|*(ÿM&%ÿ|*(ÿM&%ÿ³ÚÛ¥¨³ÚÛMÑÕM&%ÿqõù/³ÚÛ½½½Z&öCCCÿÌÌÌ444ÿ\††ÿâââ444ÿâââ\††ÿRRRÿèèèôôôööö", ÿÿÿ ÿÿÿö îø ôôôèèè333bbbÿbbbÿ+OùKL;rÕðððCCCÿîÂÿ444ÿ¾¾¾444ÿîÂÿvvvÿ444ÿîÂÿÒÒÒ@êÌÌÌo?>ñññîÂÿ444ÿ444ÿ444ÿ444ÿ444ÿÌÌÌñññ444ÿ444ÿððð444ÿ444ÿðððbbbÿñññðððÌÌÌ444ÿðððâââ...444ÿððð444ÿ A444ÿ444ÿÿÿéÛäääÿ444ÿÿ444ÿ444ÿ444ÿ444ÿðððööö&&&ÌÌÌñññ555á½½v6éÛ³ÚÛÑüýp107Ñüý/M&%ÿ³ÚÛ)/ p10p10/Ÿ53f /)×þÿÑüýŸ53 h5üÏÎ’ôøÑüý³ÚÛ)/’ôøüÏÎ h5%(f ÑüýM&%ÿÑüý³ÚÛ„ÖØM&%ÿ³ÚÛM&%ÿ|*(ÿM&%ÿ|*(ÿ„ÖØ³ÚÛ|*(ÿ7M&%ÿ/³/+ÿM&%ÿM&%ÿ³ÚÛ p10|*(ÿCs9CCCÿ444ÿ444ÿCCCÿCCCÿCCCÿñññCCCÿˆT$Ø®®ðððÌÌ̤zzj6RRRÿÿööööööÿÿÿööööööêêêÿöööÿÿÿööööJ=;C IDAT îë èèèèèè ë7÷öööÿ666CCCÿCCCÿ¬¬¬ÿžžžžžž¬¬¬ÿCCCÿ444ÿ2>޲‚½½½CCCÿN~£srF¥rBBBƒLéJäU´444ÿÅŽ+}´ŠŠŠF¥rN~o?>vvvÿŠŠŠFrÿ!PÿBBBŠŠŠâââ444ÿñññCCCÿÜÜÜññññññ444ÿÌÌÌ444ÿðððRRR¾¾¾ðððñññ½½½ÿBBB¾¾¾444ÿÌÌÌöööÒ÷þñÿ¿ññ&ÌÌÌ444ÿääääääööö=þûlJÌüÙÿ˜ú:ÒÛþ ðÚÚÚòòò444ÿÌÌÌ444ÿÚÚÚ555½½½ÌÌÌ444ÿä““Aä4ÿÌÌÌ/8ô˜/Ñüý³ÚÛ|*(ÿp10þÛØ%(12oùÈütÉ2üÏÎ79,-þÛØ’ôø&%ÿ³ÚÛM&%ÿ×þÿX7 9í`ÇÏÐÑüý×þÿM&%ÿ³ÚÛÑüý/þÛØô˜ 99`7ÛØ:îôM&%ÿ³ÚÛ³ÚÛ|*(ÿp10¥¨M&%ÿ³ÚÛ|*(ÿ7MÑÕì[XÿÏШúüM&%ÿf 9,-ÇÔÓMÑÕM&%ÿ³ÚÛM&%ÿÑüý„ÖØŸ[Xÿ¥¨M&%ÿ/³³ÚÛMÑÕ³ÿM&%ÿ„ÖØ³/+ÿMÑÕââ⛟ ñññ½½½CCCÿñññZ&öºî¼¸Nÿ›Ÿ "ÚÿññññññÌÌÌ444ÿñññ¼¸NDH²ÌÌÌ444ÿÌÌÌ444ÿÌÌÌx¬ÜËÇ]59âÿÌÌÌèèèÿööö èèèÿööööööø", ÞÔîööööÿèèèÿööö"AÞ¿ èèèèèèÿÞ¿öøöëÿèèèCCCÿ!QRCCCÿ½½½CCCÿ333666!QR߯®ÿÊÊÊÍÍͽ½½CCCÿŠº»vFE———Šº»vFEÿ½½½CCCÿ½½½444ÿN~o?>CCCÿñññõ PM"ò¾¾¾ÌÌÌvvvÿŠŠŠ444ÿ½½½vvvÿ¾¾¾ñññ+Où¡}Ó444ÿâââñññÌÌÌ444ÿððððððÌÌÌ444ÿÌÌÌ444ÿâââðððÌÌÌ444ÿÌÌÌ444ÿ...ÒÒÒÌÌÌ444ÿðððêêêòû$æèèè444ÿÌÌÌ444ÿäääáááôôô ùë+û ÉÌÌÌ444ÿÌÌÌCCCÿËËË555ñññÌÌÌ444ÿÌÌÌ444ÿËàÃ&.ÌÌÌM&%ÿ×þÿ)/tbb㡚÷ú³ÚÛM&%ÿ×þÿ)/p10þÛØ%(þÛØ’ôø7š÷ú×þÿ)³ÚÛM&%ÿ×þÿ) VZüÏÎþÛØcðõ/Ñüý³ÚÛM&%ÿ/Ñüý/n VZŒžžÑüý×þÿ)³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ|*(ÿ¨úüXÑüý³ÚÛ|*(ÿÑüý³ÚÛM&%ÿ³ÚÛ¼ˆXÿ‡»ëñññÌÌÌ444ÿÌÌÌ444ÿ½½½CCCÿñññÌÌÌ444ÿfff©©©½½½444ÿ®®®šššÿ¸¸¸®®®ÿöööøë èèèÿèèèÿ ööö ööö èèèÿö îë èèèÿöööø õèè謬¬ÿTTTCCCÿ½½½¬¬¬ÿ———½½½CCCÿiiiTTTîÂÿ444ÿvvvÿ444ÿCCCÿ)T„ÿM&%ÿM&%ÿ_ƒ-ÿCCCÿ‘ÁÂÿ444ÿvvvÿùÂ_ÿCCCÿ444ÿCCCÿ444ÿ444ÿCCCÿ444ÿ444ÿ444ÿCCCÿ444ÿ444ÿ444ÿ444ÿRRRÿ444ÿ444ÿCCCÿÿ444ÿ444ÿ444ÿCCCÿ444ÿ444ÿ444ÿÿCCCÿ444ÿ444ÿ444ÿÿM&%ÿ³/+ÿM&%ÿì[Xÿì[XÿM&%ÿM&%ÿM&%ÿ$$$ÿM&%ÿ$$$ÿ$$$ÿ|*(ÿ|*(ÿM&%ÿ|*(ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿì[Xÿê60ÿ|*(ÿM&%ÿ³/+ÿM&%ÿM&%ÿ|*(ÿM&%ÿM&%ÿ³/+ÿì[Xÿ|*(ÿM&%ÿì[XÿM&%ÿ|*(ÿM&%ÿ|*(ÿM&%ÿì[Xÿ³/+ÿ³/+ÿCCCÿvvvÿRRRÿCCCÿCCCÿ444ÿCCCÿ444ÿ\††ÿCCCÿ444ÿ444ÿ)T„ÿÿÿÿÿÿÿÿ$$$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿvvvÿbbbÿbbbÿ444ÿvvvÿ444ÿ444ÿbbbÿ)T„ÿ)T„ÿ444ÿ444ÿ444ÿ444ÿCCCÿ444ÿ444ÿCCCÿÿÿCCCÿ444ÿ444ÿCCCÿÿ444ÿ444ÿ444ÿ444ÿM&%ÿM&%ÿ|*(ÿì[XÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿ$$$ÿ|*(ÿ³/+ÿ|*(ÿM&%ÿ$$$ÿM&%ÿ$$$ÿM&%ÿM&%ÿ$$$ÿM&%ÿ$$$ÿ|*(ÿM&%ÿê60ÿê60ÿ|*(ÿM&%ÿM&%ÿ|*(ÿì[XÿM&%ÿ³/+ÿM&%ÿ|*(ÿM&%ÿ³/+ÿ444ÿbbbÿ444ÿCCCÿRRRÿ444ÿRRRÿ444ÿCCCÿÿÿÿÿÿÿÿÿÿGó“õ IDATÿCCCÿ444ÿ‘ÁÂÿ444ÿCCCÿbbbÿvvvÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿÿ444ÿ444ÿ444ÿM&%ÿ|*(ÿM&%ÿ$$$ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿ³/+ÿ$$$ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ|*(ÿ³/+ÿM&%ÿM&%ÿ|*(ÿM&%ÿM&%ÿ444ÿCCCÿ444ÿ444ÿÿ$$$ÿÿÿÿÿvvvÿvvvÿ444ÿ444ÿ444ÿÿ444ÿM&%ÿ$$$ÿ³/+ÿ$$$ÿM&%ÿM&%ÿM&%ÿM&%ÿ$$$ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿÿÿÿ444ÿ444ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿCCCÿÿÒì IDAT€ÿ444ÿÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿœÿød³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ444ÿæAøÓÌßÙ°bbbÿžžž!'PÿßÙ°-QQÿÓ¯¯\††ÿÑËËÓ¯¯-QQÿ/55ç½½½½½‰…VÿÊÌÒðòêÓ¯¯ÿèèèÿõ õôèèèÿèèè444ÿùããÌÌÌ!'PÿßÙ°!'PÿßÙ°!'PÿßÙ°CCCÿ½½½CCCÿ73ÉÍü$$$àíñ àÉÍüñññ½½½CCCÿ½½½ÿööö ööö èèèvvvÿŠŠŠ¹ŒÁÿGt?444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿèèèÿ äääööö äääÌÌÌê60ÿÊÐ|*(ÿÑüýf MÑÕ|*(ÿn ’ôø„ÖØM&%ÿ/„ÖØM&%ÿ/Ñüýf MÑÕ³/+ÿMÑÕ+ƒÿ )Ùÿ4ý¥Ñüý+­¯Ø!'PÿãÿßÙ°?ƒTÿÖ¯µæèèè2 ÿ*QKÁ}¬ÿèèè444ÿÌÌÌÿèèèÿòòòÿèèèÿòòòÿòòòCCCÿ½½½CCCÿ73Öþ×WÔ(Ó.Öþ×*)-ÒÿzùÒаÙ0P'ÿаÙM&%ÿ³ÚÛCCCÿáááôôôèèèCCCÿ½½½CCCÿ½½½CCCÿ½½½M&%ÿ4-ÌÓû³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)/mûõ“ Ñüý³ÚÛ444ÿ...¿Åî-4øÓÌA;Çò"øÓÌA;¿Åî-4øÓÌßÙ°CCCÿ&}~Ä‘òòáááÛÖŠ‹à;kÄ‘\4vxqþÊŠŠÅÓ0¤zz #$ÿ õôõ õôõ õôõ èòâ õôõ õôèèè444ÿÌÌÌ444ÿùü332ÍÎþ à°ðððÌÌÌ444ÿÌÌÌ!'PÿßÙ°!'PÿýÔý,ýÔý,ßÙ°!'PÿßÙ°!'PÿßÙ°¼ˆXÿ–Êú733ÍýþÙÝ Z&öÍýþíñ à3–Êúñññ½½½ÿööö ööö ööö èèèCCCÿ½½½444ÿÌÌÌCCCÿ½½½0P'ÿаÙšššÿfff444ÿÌÌÌ)T„ÿ׬|444ÿÌÌÌ444ÿ®®®444ÿâââðððñññäää êêê ööö ööö&&&ÌÌÌ|*(ÿp10ÏÐ79,-þÛØÉùû7VZüÏÎþÛØ’ôø7Éûý¨úüXm /dïÎ/m /“óÑÑüýœ2É©|*(ÿ„ÖØK)Qÿ0þÖÑüýÔ+û3üÍßÙ°2 ÿùÜòòò2 ÿ î¿çAî¿ç èèèCCCÿ½½½444ÿñññññññññÌÌÌCCCÿ½½½ÿ êêê?þ×ÿêêê èèèÿòòòM% ÿÁé˜d4–ÊújÐ3É43š4Ê Ç ]+š4Ê Ç *)3úÏýzùÒаÙM&%ÿ³ÚÛM&%ÿ/¥ý(,ÿÕ/Ñüý/Ñüý³ÚÛÿööö èèè444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌM&%ÿã*Öþ³ÚÛM&%ÿ³ÚÛM&%ÿ/„ÖØM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ/mûõÿðÿ“ Ñüý€×ÙvFEú$$Å¡ÊpšrÑ¡ Çò"hm>˜“Â9ÞÇò"9Þíó"åß°ÌÌÌ-QQÿ/55ç½½¼¸N.VÀ<<<3232ááá Þòò :;FB6/55ù¢¡ÜÜsu@CC/55ÑËËòò-QQÿÿõ å,,òâ,,èõ è 444ÿðððòòññññññ(RRáááù444ÿ!'PÿýÔ!'PÿýÔ**áááFBÍýþÌÿ,—`ý½Žôÿ0=:p= vxqíñ ìììàööööööööööööûРšššÿ¾¾¾ñññùÂ_ÿ444ÿ›Ç’vI~ÌÌ̺êаÙ444ÿÌÌÌñññññññññðððáááñññðððööö÷ÿôøü ööööÚÚÚ¨úüÉùû12üÏÎ%(12127VZtbbúª¦Ã£¡ÏÐn ×þÿqõùŸ53“óÑýÜÿ78Ù6,þ×7m //œ2é7WÿM&%ÿ3..6ðððÜ23 44 2,-,-‰Sþ...â ÞýÇ )û3æ$ûùÜî¿ç$ûùÜâââ333444ÿÿôôô ööö êêê êêêí‡!yß3É4÷Ê+Ck ½Žôÿ0=:p= vxqfÌ6:“*n—\,9  eÍÑüýÈ0„ IDAT/Ñüý///Ñüý/!'Pÿ444ÿ444ÿáááÿ?þôôô áááCCCÿCCCÿ444ÿÌÌÌCCCÿÿáááöööèèèÌÌÌ444ÿ444ÿCCCÿèèèËËËÕÕÕÿÿCCCÿM&%ÿ)ÑÍú4-/M&%ÿM&%ÿM&%ÿM&%ÿM&%ÿ³ÚÛM&%ÿM&%ÿ|*(ÿX4-7³ÚÛ³ÚÛû×þ4-)/M&%ÿM&%ÿM&%ÿ„ÖØ/“ %%)A;ððËÅÄ5;<5;<ÄÄÄ5;</_`5;<íó"!'PÿCCCÿêÄ‘vxq]‰¿^_^_f;šÅû :;CC-QQÿ÷ÓÓõ 3F.333,ý× ððð...ñññùç½½÷ÓÓ...444ÿýÔY 4ý,*ý2*Öþÿ**Öþÿ*!'Pÿ!'Pÿíñ ÷ÇÍ8Cr 8Ìÿ,8ÆÄÄ=:ÞBà'#ôíñ ööö ðððšššêêêÿñññ¡Ø;ËŸÔŠ·‚׬|ÌÌ̽½½BBBáááêêê úú  ë÷ Æ =]_úª¦12oVZ7Ñüý%()aËÍÊøÔ6,6,þ×ÊøÔ7m /$dïÎÀ! 4488þ1­¨¹ïDðððøÓÌó×ÿüÍööö$ûùÜü ö$ûùÜA555%%%<<<%%%$$$ðððòòòêêêöööôôôööööööööö öööôôô g4ÌüÎ8ênØ 8Ìÿ,­4ÑÆÄÄÆmÖÆmÖ( Ç M&%ÿ//Ñüý//ÿ*ÿ*/Ñüý/,ÿÕ444ÿ444ÿ444ÿÌÌÌ444ÿ444ÿÌÌÌôôô+++Áéöööôôô½½½CCCÿCCCÿ½½½ÿCCCÿ444ÿ444ÿ444ÿ½½½ÿ)è555CCCÿÌÌ̽½½ 5 ô5 ôÿ ÿ½½½³ÚÛ/¯ýý/3M&%ÿM&%ÿM&%ÿ×þÿM&%ÿ×þÿ4-M&%ÿM&%ÿ³ÚÛÑüý4-ãYÉûýM&%ÿÑüýÞ0)f M&%ÿ×þÿM&%ÿ×þÿM&%ÿmûõ%%/Ñüý×þÿñññðððÜÜÜ5;<<<<<<<<<<<<<˜“Â/_` ÞæA¼º„/55ý :;f;šÅûf;su@/55ea2èðÿ#Ýÿÿ32Ýÿÿ 2 23#õ ôôôáááËïïááá(RRê/55ñññCCáááðððý,*§÷ÌüÎý2**ý2*ÖþÿƒLé=:› 6:9Ù:<<c:9ÙÌÿ,_(Å<<5<<5à$$$ öööðððJJJ«L©©©¸¸¸šššÿ\††ÿ\††ÿ444ÿñññ$$$ÜÜÜñññ333ñññ öööîëCCúîëÿôôúü öôôôððð’ôøVZ121277øÉýùÈü77VZ ÏÐ)/m /6,ÊøÔ9,-6,ÊøÔU3ÏÐüÖÕììì888› 6à'#ôü"óÞþÕ *üÍ äA1uFõåûü ö÷ ùÜ ×××qqqìììññññññ444ÿÿ öööööö ý!Ë£=™ùÌÆmÖ› 6,2á5¥Þ7Y—:9ÙCÌ]9:<<5&lû×þÿÑüýÑüý/ÿ*ÿ*/³ÚÛêððð444ÿ444ÿ444ÿ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌèèèÕÕÕööö?þÕÕÕ½½½½½½ÿÿ ÿáááäääáááCCCÿÌÌÌCCCÿÿ ÁéÕÕÕñññÌÌÌ+++ÁéÁé ôôô CCCÿ444ÿ|*(ÿ)LÚ7: Þ0)³ÚÛ³ÚÛM&%ÿ×þÿ)/)//û×þM&%ÿ×þÿM&%ÿM&%ÿ|*(ÿM&%ÿ]j "Ðýû×þÑüý³ÚÛM&%ÿ×þÿÌÓû"ÐýÞ0Î$ÿ4-)/)³ÚÛ|*(ÿmûõ%%/%/)Þä 44?op<<<ÄÄÄ<<<<<<ËÅÄ32œÇò"¤©zýÔŠˆ÷ÓÓ :;chþ£u f;šÅû–=f;f;šÅû :;£u òòvv; õôòâÍþÿ2í1/3ôÎûôÎû 2 23#-...òòñññÜÜgn9ÑËËç½½êCCý,Öþÿ*'3/3ý2/3ý2üÎÖþÿýÔƒLéÃ÷p= ¡Ø;e`Êccc:9ÙÌÿ,4ÔÄÄËíñ àööö8bb©ÙÚWWWtÓ $$$HHHWWWšššØ®®444ÿððð444ÿñññÜÜÜÜÜÜ$$$áááðððó·Òýáÿôô ÿôôîëûöþööö77o7778øÉý7%(Ñüý/ÉúýÊøÔýÜÿ$6,6,ã¡7/<_1prðÈýP&&)))íñ ç7Þø8Þ.4.h^ôøÉñ1uFÙ•Ä÷ ûöþ÷ÿô÷ÿôõãâ ýññññïïïííí$$$<<<$$$ÄÄÄ êêêööö&&& ööö êêêš?2Ã÷ùpØ¥l \–Ñ,Y—/Ôcá5¥uЖý›ÄÄËWÔ( Ç ×þÿ)/ÿ*þ\ÿ2ÿ*/ÑüýñññÌÌÌ444ÿÌÌÌ444ÿùÌÌÌÌÌÌù444ÿ444ÿÿööö?þÁéöööÿCCCÿÿÿööööööêêêôôôöööôôôÕÕÕ½½½½½½ÿööööööêêê èèèÌÌ̽½½555 5 ôôôôáááCCCÿÌÌÌÑüýû×þãYû×þ/M&%ÿ|*(ÿ×þÿ)4-4-ãYãY)4-f /XM&%ÿ×þÿÑüý]7: ë–ôû×þÑüý³ÚÛ)/û×þ"Ðýj Þ04-ÑüýM&%ÿ„ÖØÿðÿ/ýÛýÿðÿ“ ;_65;<ËÅÄÄÄÄ<<<ÄÄÄ5;<5;</55&T*Rý,›ŸÎóÆÅú$$Ð50–=0šÅûóÆÅ6¼¸NŠŠÅõ ,ðÿ3Ïüí1 2ÍþÿÑÍúôÎû 2ëñåõ ðððÒÒÒùñññ...CCÈÇü/55CC5ÑËËÒÒÒýÔÖþÿüÎÎýÿ22ÎýÿüÎ/3Y 4*Ã÷p= ;hec-cýc:<<Ìÿ,3àÙÝ ¤zz‰ˆºê$$$ðððÜÜÜ{«¬5a,¸¸¸+Où>ÌÌÌ333ñññáááðððÜÜÜâââððð÷ÿôîëìýþÿôôÿôô ú  øôôô9,-üÏÎøÉýùÈü8888 h5Ÿ53Ñüý/þ×6,6,$$ýÜÿÊøÔ9,-6,vv;ec-666a¬£tÞ@î#!QR<7¡>>>$$$ÐÆø\4=;64.B%$û‡°M  ü öü ö*QKýñæáááñññ)))OOOOOOíííñññ &&&äää5 ô êêêêêê?þ÷Ê+p= }™ ^ôý^þ¢-e,28þe3©,ØÑÍú/çúH IDATÿ*ÿ2ÿ2ÿ2ÿ*444ÿððð/55ððð444ÿ444ÿ444ÿ444ÿCCCÿ444ÿÌÌÌ444ÿ444ÿ(RR÷ÓÓ444ÿÓ¯¯(RRCCCÿ444ÿ+++ +++CCCÿÕÕÕööö?þ?þööö5 ô5 ôöööÿÿ444ÿÿööö?þ CCCÿ444ÿ½½½ êêêÁéöööôôôááá444ÿi>[)Ñüý³ÚÛ|*(ÿX4-ãYj  xd7: j Þ0Î$ÿãY)/M&%ÿ³ÚÛX4- xdÉÆ÷û×þÑüý³ÚÛM&%ÿÑüýÉÆ÷ xdÞ04-×þÿM&%ÿ³ÚÛM&%ÿ“ ÿðÿýÛý/8ÿðÿmûõ×þÿÅ¡Ê5;<ÄÄÄÄÄÄËÅÄËÅÄÍÎþ'!ò *ýÔ>>>&}~ÑËËÐþÿÐþÿšÅûf;ÑËËý]‹õ¤ÌûûòåÝÿÿí1Ïü3ðÿ 2ôÎûòâù/55ùÒÒÒÜÜËïïÜÜ89ú$$Ëïï5ý,*Ñùͧ÷ÌÖþÿýÔý,i úŘýcý4Ô=:3'#ôöööØ®® à°§§§ÍÍÍHHH×2•edHHH*Ç™˜˜˜äÀ©©©\††ÿññññññêêê  >  #C ø.K þÛØ12ùÈüùÈü78øÉýŸ537m /9,-6,12$9,-6,ýÜÿÊøÔÿ*×Ùß¹ïDˆ# ÙØëð†ììì"à6 ¦/+=;9:q<æ7áÌÓöööAî¿çðÛù€t®%$û÷ Ï‹º€ŒR<<<<<<'''cccMMM%%%555ôôôööö ÚÚÚööö Ëó êêê 555×ÿ™ùÌfÁÎúŘ\9þ¢ý^§ùiý›ÆmÖ‘ ]/3ý,ÑüýþÖÿ2üÎüÎþÖÿ*/M&%ÿÌÌÌÌÌÌ444ÿ444ÿ-QQÿù\††ÿ(RRê(RR-QQÿCCCÿ444ÿÌÌÌ444ÿ(RRÑËËÌÌÌØ®®êñññ444ÿÿööö èèèÿ êêê ööö555ËËË ööö ÌÌÌÿööö?þÁé +++½½½ÿ+++ËËË ÌÌÌM&%ÿ×þÿ)4-j ë–ôû×þÑüý³ÚÛM&%ÿ/)Þ0"ÐýÌÓû×þÿ)³ÚÛM&%ÿ4-j ÉÆ÷"ÐýÌÓû/„ÖØM&%ÿ/Ñüý/)j æmò)£Ñú)³ÚÛ|*(ÿmûõT ûÑú/ûÑúýÛýÿðÿdÜ._øÓÌ;_65;<<<<ÄÄÄËÅÄ5;<˜“Â32ÜÜ¿Åî2*ØÚ)/55 :;f;šÅû–;ЊŠÅ¤Ìû÷ÓÓéÿ,3í1áÿÿÏüÝÿÿëñåý× +++ñññùããCCöÌÌ 4489ΣØú$$Ø®®ñññ½½½!'Pÿ*ý22ÎýÿüÎÖþÿýÔý,ýÔRRRàp= Ìÿ,:9ÙcÆÄÄ÷ÇÍÍýþÙÝ ¶¶¶ööö èèèbbbÿááá×2)þέ«uSU‹$$$ÍÍÍñññ...žžž444ÿðððñññBBBÍÍÍðððâââðððððððððêêê÷ÿôû!îëú—Nø”¸ Ãéü ö÷ ›7VZ78ùÈüøÉý7øÉýã¡Éûýÿ*8Ù6,$ýÜÿ$ýÜÿÊøÔ6,ÜŠ4ÄÄË=;ÃÅúþ1xsÝ› 6îîîÈÈÈèß)2?9ÕRX¼ööö1uFÏ‹º÷ÿô  $ûðÛù  ‡°MyP³ <<<'''ììì±±±ïïïÛÛÛðððññññññÚÚÚ&&&ÚÚÚ ööö;_ *)ùpØwÍ1Ìÿ,á5¥Y—Óû›-eÓû›-eÆÄĽ4£n—\™ù̧ËÑÖþ/Ñüý/ÿ*ÿ2üÎÿ2üÎþÖÑüý³ÚÛ444ÿùããÌÌÌCCCÿñññðððáááÌÌÌ444ÿÌÌÌ444ÿùòòñññÌÌÌ444ÿ(RRÈžžÌÌÌCCCÿ ?þ ööö+++èèè  ÕÕÕ ööö èèèèèèÌÌÌööö Áé +++½½½444ÿèèè½½½ öööôôôÌÌ̳ÚÛ)f ÉÆ÷Þ0Ñüý³ÚÛ³ÚÛ³ÚÛÑüý¨úüÑüýû×þû×þ§û§ûÌÓûû×þÌÓû×þÿ)³ÚÛM&%ÿ/Þ0ë–ô§ûÌÓû4-Ñüý³ÚÛÑüý/ÑüýÌÓûë–ôãYû×þ)³ÚÛÑüýûÑúûÑúûÑúýÛýûÑú%“ ×þÿøÓÌ-4>>ÄÄÄËÅÄ5;<˜“Âhm>ÜÜk›œýÔÑÓü\4 :;óÆÅóÆÅf;‹ÀšÅûšÅû–;Ð.VÀà;k --éÿí1ÏüàÍûáÿÿáÿÿÑÍúáÿÿðÿòâ ááá5...ñññç½½ÛÿÿÑËËÈÇüÈÇüú$$ç½½êñññÖþÿüÎÎýÿý2**ý,ý,àíñ p= Ã÷ÕÙcýýÆÄÄÕÙ 93íñ '#ô öööÒÒÒñññ$$$ï¿ce›ÍÍÍfffÇò"ÌÌÌáááÍÍÍðððððð$$$âââ êá=îëW¸óÃéÕúþ=÷ öööš÷ú7ùÈü9,-š÷úýÜÿýÜÿÊøÔÊøÔýÜÿ6,“óÑŽÉÍüº”÷3úÌ£chþÜÜÜîîîïë¼'#ôIø8ÞÛÛÛœ¢‘Ì7Ï‹ºA$û÷ÿôü öùÜB%‡°MyP³ööööööðððììì<<<ÄÄı±±<<<ÛÛÛñññ ÚÚÚ?þ ööö555 555êêê*)ùpØwÍ1Ã÷Þ7Y—§ùi-eÓû›ÔþÎÆÄÄÕÙÕ5§ËÑY5/ÑüýÑüýþÖþÖüÎþÖüÎþÖÑüý444ÿðððòò444ÿ½½½ÌÌÌÌÌ̽½½ÌÌÌÌÌÌ÷ÓÓñññÌÌÌÌÌÌØ®® --ÌÌÌCCCÿáááôôôööö èèè444ÿÌÌÌÿÌÌÌÿèèèCCCÿ½½½444ÿäääèèèÿèèèM&%ÿ³ÚÛM&%ÿ/ãY§ûÑüý³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)×þÿ)³ÚÛM&%ÿ×þÿ]/û×þÑüý×þÿ)³ÚÛM&%ÿ×þÿ)×þÿXÑüý4-û×þÑüý³ÚÛM&%ÿœÿø%ýÛýÿðÿ%ýÛýÿðÿ“ Ñüý×þÿ8bbÅ¡Ê;_6+Õÿÿ5;<˜“Â32ÜÜáááæA&åß°ðððÛÙ£]‰¿ :;f;šÅûóÆÅsu@šÅûÄ‘/55 :; Å•w{ª #$ÿèðÿ3í1ðÎû#Íþÿûòåòâ0` à°...ÒÒÒCCÑËË/55ÑËËããù5ÒÒÒÌÌÌ!'Pÿ*ý2üÎÖþÿ*ý2üÎÖþÿA;'#ô22ß+'ñ:9ÙÆÇ'öÈýÎüÎ<<5±µë˜˜˜ ööö èèèšššÿ©©©ñññvI~Š·‚HHH©©©áááñññÌÌÌ444ÿâââñññ333ÜÜÜÒÒÒÌÌÌ444ÿÌÌÌÿü ö#:Má½½ È74 h5øÉý7øÉýüÏÎ12üÏÎÇÔÓqõù)œ2ÊøÔ6,ÊøÔ6,ÊøÔ9,-ÇÔÓ6,U3ã¡6,“óÑÇí ä#.ÿ)ö"#666ÝÙªÕÿÿâþ×)ôÎýÏÕþ äÚÚÚü ö÷ $ûùÜAî¿ç$û î¿ç&&&qqq³³³ïïïÛÛÛðððññññññäää ôôôööö ööö ööö )è×ÿ2˜þ3É4ç7Î9 !`"Éýá5¥“XÇl¦(<<5±µë®®®c×r IDAT)/ÿ*þÖÑüý/„ÖØCCCÿêÓ¯¯444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿáááôôô+++ööö ÿÌÌÌèèèÌÌÌèèè½½½½½½ÌÌÌèèè+++èèèÿCCCÿèèè444ÿ³ÚÛ³ÚÛÑüýÑÍúÑüý³ÚÛ³ÚÛ³ÚÛ)×þÿ×þÿ³ÚÛ)³ÚÛ³ÚÛ]/û×þû×þÑüý×þÿ)³ÚÛ³ÚÛ)³ÚÛ)„ÖØÌÓûû×þ)³ÚÛ³ÚÛ“ “ ÿðÿýÛýýÛýÿðÿýÛýÿðÿ“ Ñüý×þÿý,Å¡ÊA;ÍÎþÈÎýqwx+ËÅÄ<<<32ððï¿ôî¿.TŠ£tÞ–=óÆÅšÅûf;su@ :;‹ÀóÆÅòò :;Ä‘vv; õô õôòâûòåðÿíÔýÝÿÿàÍûðÿÍþÿòâ à°ÌÌÌÇò"(RRêç½½òòÑËË/55õ PòòÒÒÒ!'PÿýÔ*/3üÎÖþÿ*ÖþÿüÎÖþÿ*ýÔáááíñ ÙÝ DqÜ_(ÅÕÙÕÙÆÇ'ÕÙ>9×ÿÐíñ ÄÄËÜÜÜ ööö444ÿŠŠŠñññ(RRWWW¦÷l©©©WWWñññáááfff444ÿðððññññññâââñññÜÜÜÜÜÜââââââÌÌÌ ÷ á½½ü öXøÉýøÉýøÉýúª¦üÏÎ12Éûýf $6,ÊøÔÊøÔ6,ÇÔÓÊøÔù«Í9,-ÊøÔ ãâ.4. 3-ìììÊÊÊ<<5<<5+Ð&ôÎýñññ,ÿÕððð1uF÷ ü öùÜ1uFî¿çùÜ4-1uFAñññììììììÜÜÜìììÛÛÛ%%%ññññññ ôôôêêêööö ööö555 ööö×ÿí‡!íñ Öþ×É2}6VÊÑÞ7½4£Üÿþô¤j>9×:“*ùpØÄÄ˺ڱ))/ÑüýÑüýÿ*þÖÑüý/„ÖØM&%ÿñññ÷ÓÓ444ÿ444ÿÌÌÌÌÌÌ444ÿÌÌÌCCCÿÕÕÕööö +++½½½444ÿ½½½CCCÿ½½½M&%ÿ×þÿ]/£Ñú)³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ/mûõ“ mûõ“ Ñüýç Aôî¿DDDÈÎýýÎHHHÈÈÈíó"'!ò¼¼¼ñññÌÌÌ-QQÿ/55-ÿÐvv;DH²CC :;óÆÅÑËËÊý:4@K ÿÌÒâ½½½bbbÿCCCÿçá‚Zóþ^ÿèèè!ÿ€TSÿ¼ˆXÿ¼ˆXÿ€TSÿÿCCCÿCCCÿ&&&555ׯ– Ý´wO6^^^¾¾¾vvvÿ¼ˆXÿšššÿÿ=þûsEÿÌÌ̬¬¬ÿêêêÿc<;¸¸¸ÿK ÿq|O?ÿS*ÿèèèÿ})ÿ*})ÿS*ÿK ÿ, •ùø, ìZ2ÿ¼ˆXÿMöäääç(;5.CCCÿCCCÿ èèèZ&ö888&&&sEZ&öK ÿUqr®@h, ìZ2ÿÿä 0P'ÿ444ÿаÙêêêÿ7=f“··M% ÿ­ÖöööòòòRÿØþüRÿK)Qÿ•Ý<*ÜúÁ/ÿvvvÿÿ})ÿÿ5 ôËó W¸ó5 ô·Vÿ})ÿ èèèbbbÿ¶¶¶c_)|*(ÿ‰…VÿSQ(ÿK ÿÿèèèÿÿÛTTTK ÿìó#ôÝ äiiiiii#ô#ôááá#ôÿµô÷K ÿº¾üôÍøÁéèèèÕ§~iiiCCCÿ×ÿp71p71öööÿüÙüp71K ÿ³ÛôžžžiiiCCCÿûÈøp71ùÇÎi:þ÷!ÿ¤ÐјÄŤp@FBñññ,2,xœÍÍÍ   à<;5fffCCCÿÌÒâèè興ˆbbbÿ444ÿ°°°,-Ûÿÿÿ;5.èèèM% ÿòòòÿþëþÐüû;5.ƒ×ïM% ÿ¼ˆXÿ=VÌÒâMuŽ•ùøÅËÒ¼ˆXÿ¼ˆXÿ¼ˆXÿŸ>ÌÒâhœÌç(iii>ç5 ¼ˆXÿáááÈÈȳá á8Z&ö¼ˆXÿ¼ˆXÿׯ–ç¹Ëó •ùøS*ÿèèèÿÌÌÌ444ÿ0P'ÿаÙÌḬ̀°° *M% ÿ4.ÿÌÓöRÿK ÿ\0"ÌÓöM% ÿK ÿã¸MßÄÖ$½•ÿK%ÿM% ÿ$$$ íìÿ})ÿÐüûÁé5 ô?þþçýÆÓö:- 5 ô!ÿ¿£¢qm>ÕÙ"2, IDATM% ÿmûõÊÌÒÿ»½æ1òòò ÿ±u}888ÃÝ äÝ äáááü+Ý äÝ ä ÿK ÿvvvÿVYØþüFBRu vvvÿCCCÿp71xxxÕÕÕÉÏ'޽ÿÉÏ'޽é(+)QjCCCÿTTTâàÅøÈøÉÏ\›±444ÿ!ÿ!ÿRÿÌÓöbbbÿ¬¬¬ÿÿšššÿ">?RRRÄÌû‘žÍ‚‚‚ÖÖÖÿCCCÿÍýþ3ôñññúÔäøÎÔ~‚¸333ׯ–ÊÌÒ‘ÂÉÿM% ÿ Ëó ÿÿÌÌÌžžžüÛ%#ÿ±ro²ÔþøÒ·K ÿ0Oÿ®zJTTTÅËÒe}¬{ÿÿ­Ö4.S*ÿM% ÿöõÐøú„±K ÿM% ÿ4.­ÖS*ÿôëêþçý¿tqʹßS*ÿ=:M% ÿ6aÂêäääç(... ª‚;5.³ÚÛùÂ_ÿùÂ_ÿS*ÿÒÒÒx¬ÜÈÈÈhœÌÅËÒS*ÿôÁéʹßAöóʹß;5.S*ÿ 7öÿ!Oÿ¶ê!OÿаÙbbbÿ¬¬¬ÿÿÿ©©©×ÕÿëÇÇÿ4.M% ÿJJJŒŒŒM% ÿ²Ô+ÌÓö!ÿÚÿ.FmDÐà·W¸à0-)Qjá’¸ÿöööÿ×ÿ?þÔàøÔàøÐüû–Ïñ0K ÿ, A]^›ŸÎÈÈÈM% ÿM% ÿM% ÿM% ÿ/j, ø»á?þÛèèè?þM% ÿ?þÈÈÈttt÷öK ÿñññìóA-×þa¶¶¶¶¶¶3ÕÕÕü+>5.>5.Ý äbbbÿCCCÿM&%ÿèèè Ã```éëÑÓöÄ¡ ÍÍÍËËËK ÿ]/öööäääá8öööã|MS*ÿöööäääá8^^^ÍÍÍ>çS*ÿéë3šáÌÒâ+øÃÿÿñŠ[ÿÿ!ÿ`N&›ƒT!ÿÌÓöËó šššÿ444ÿCCCÿšššÿ444ÿñÈܬ+++bbbÿfffÿ¤p@ ãâìììö"#Mtu<<<    ãâÿ—ÉЭ¯ØÚÚÚñññö7õ#L333ÍÍͳÛô­¯ØÊÌÒqm>S*ÿááá=Vööö i;2S ,ÚÿGæ¹çåCýBS*ÿáááÖùûʹß* i;­ÖÌÒâ5ËøúÉß÷ÖùûËøú4.­ÖÿÿM% ÿ;5.ÅËÒÔàø éÿòþþ­ÖÅËÒxo5ÅËÒÃÆù4.IªÒöööááá–Ð÷ùÂ_ÿS*ÿÃÆù;5.ÅËÒáááÒÒÒ...Z&öÔŸiwpc<;5;5.ÅËÒÔàøKýòþþhœÌ;5. 3 ÿ#ÿA‚ÿ!Oÿi5!7ðíÔø!OÿÿTPÿ444ÿY'&SQCCCÿÿ ÿCCËËË)+ööö&PÿK ÿÌÒâþçýáááÈÈÈÔàøN,Õ4- *(4.…Ô®0 IÖùû¦Ù²mD7$$$ íìK ÿK ÿÿòòò5 ô=þûí , Ëó ÐüûM% ÿÿCCCÿšššÿOŽ‘ÔàøëêRRRëê=V=V/Ñûäø»á<`Jj, „ÖØbbbÿšššÿ=Vþçýþçýëê=þûÖùûìóÂËÒŒ]…<=ÒþþëÄÃñÈ”””B;ÂËÒå žžž¬¬¬ÿM&%ÿM&%ÿ>çèèè=þûwO6```hhhéëÐÔÕÕÕ=þûµô÷ÉÏ—Åîòòò¬¬¬ÉÏñŠ[ÿÿp71ÒÒÒÍÍÍñññÕÕÕ;5.ÿøÃÿÌÒâü öóõ+ïó1ÕÕÕUbÙrC92èèèbbbÿ">?;5.Éåæ=VJJJ~~~fffCCCÿs½»CCCÿM% ÿÿðððÅËÒááá888vvvÿh<;ÄÌû³ÚÛáááìììÈÈÈ   ×°¯3..ÿ;9ÊÌÒÅÇð ðððñññ¾¾¾ÍÍÍÕÕÕ64.ÌÒâ³ÛôÕÕÕ+++¬¬¬ JJJÌÒâS*ÿ0OÿËïïô4ÑèÉ ãã;5.„±ÕÕÕ">?Í JJJ;5.S*ÿ³Ûô³ÛôËøú ø ­Öèèè®zJocLhœÌ£Ñúìýþ´ô÷ÔàøÖùûÈ÷ù­ÖÃÆù­ÖÅËÒ­Öööö ñññáááËË˳ÚÛÅËÒÃÆù;5.ˆ‘ËDx¨<;5<;5£ÑúÚÚÚÒÒÒÒÒÒáááZ&öÄÅËÄÅˉDx¨;5. ´ô÷ÔàøÖùûËêêêhœÌS*ÿÿ¿~èý+êAàÍöíÔøv|Ñß±òòÝúí¿ÿèè芄ÿÌÌ̼ŒÁáááÿ èèèCC-QQÿ×Õÿ á½½ )+Ôàø ²Úþçý6G!áááááá">?ç(ÌÓöÖùû4.…Ô®Z'N*ÔàøÒùº\ݺtttæüýÿÿ[ê'Ðüûôôô³ÛôÖùû?þÁéÔàø³ÛôèèèËó 0M% ÿÈÈÈÜÜÜ þçýׯ–Ôàø³ÛôÿSQ(ÿ|*(ÿñïÆmûõ/Öùûw{ª­¯ØÈÈÈbbbÿ¬¬¬Öùûþçýí ÿ¾íÅúÕý4-.²Ø©JJJÂËÒ#ôìó———_†‡<=yn4-M&%ÿþçý   ììì555ÕÕÕöööÿ555½½½M% ÿ¤eO'޽èè輈XÿhœÌêêêòòòM% ÿ4.—ÅîèèèñŠ[ÿÉωÄÚ÷ ñë)¸]äIªå¼ˆXÿÅËÒá8ááá333 Ý´;5.Dx¨¼ˆXÿÅËÒ³á äääÙrCCªÙÕÕÕi;­ÖS*ÿÂðÕÕÕööö555333Fâ\Àèè輈Xÿ\Àèèèÿðððôôôh<;Íѹ³Ûô‰…Vÿ3Dx¨ÿööö èèèSQ(ÿ64.“ÂèèèS*ÿÌÒâ³Ûôÿ +++½½½ÿ5 ô4.­Ö-QQÿ»¸Öùûy•–‹‰nóõþìë01ùÓ¯¯S*ÿ;5.„±Ã +++ÓÁÀ !˜d4ÅËÒ­Öÿ öööòòò¼ˆXÿÅËÒ»ä õêêìýþ*q|O=:>¡ÿòòò¼ˆXÿ<;5‰£Ñúêêê®zJDx¨¼ˆXÿÅËÒŒ¯Øìýþ ˜d4Dx¨ÿòòòM% ÿpaŸê³Ûô#ÿ,i5!š õý+ê÷É öööý+êß±òM% ÿ+¬°îCCCÿÕÕÕööö555333EEwx-QQÿ÷ÓÓôôôöööòòò&Pÿ)+Ó¯¯M% ÿ4.­ÖCCCÿñññíÑÐ, 4.­ÖM% ÿ.F7ÉûþÐýÿµ×¯ÿø ?þÁéøëòòò})ÿÐüû³ÛôÿòòòM% ÿj1ÆÓöƒ×ïÿ JJJÂÂÂêêêòòòšššÿtttúg…e IDATòòò|*(ÿ×'­¯ØM% ÿÔàøßûüÿ÷ö, Ôàøí ÷öí òòò O'ÿå ìóŒ]…¶¶¶ü"óõÍÓúÕýËòó7B;JJJ¶¶¶¾íÅå ìóà±Ù¬¬¬ÿ¶¶¶˜_ÚÃÆöŸó×þÿ)³ÚÛTPÿùÕú³ÛôCCCÿ333ììì¶¶¶ööö 3ôñ³Ûôÿ ËË˳Ûôv¥M% ÿ³èÿÅËÒêêê ËËËÿòòò³Ûôâÿi;—Åÿèèèv¥M% ÿ éë %+í(óÿòòò¼ˆXÿÅËÒ­Öîÿ+++WWWttt ÒÿèèèDx¨¼ˆXÿÂðë3šÉfff"î¾E@Dx¨S*ÿ—Åî +++WWWÜÜÜÍÍÍ çi;­èÄÌûèèè+++ÕÕÕ +++ááá<4<4L³x¨ÊÌÒ4.SQ(ÿ­¯ØðððBBBÍÍÍÿ½½½i70—ÉÐÅÇðèèè³ÛôCCCÿ$$$½½½èèè³è³ÛÖ444ÿ(55ÉÒ·âtttö/óÛ%ÓhœÌýùû">?T$$$ÞÂÁ'èåDxÜM% ÿþçûËøú5µèèÿèèèDx¨ÿtQ( ²Ú`N&ÌÒâÃÆùÿiiiˆˆˆÿ½½½ÅËÒwpc;ÅËx¬Üñññx¬ÜS*ÿÅËÒ­ÖS*ÿ ²Ú`N&£Ñúÿ^^^ Ü ÿÌÓöŸê#ÿ|a)—Ëß÷ô ö¿Aö)3 àÍêß±ò³ÛôTPÿ÷¼÷ÑþöÛÝøxFEiáá+++333ÍÍÍŠ½½ÿýÇÿ9á½½ 5 ô4: ÌÓö³òüÚ°+Qÿ-QQÿÓ¯¯ÌÒâK ÿøñññäääèûüM% ÿÔàøþçß6G!þçý¦ù²'N…Ô® õÿÿöõ7! Áé=þûÖâþ÷ òòòvvvÿŠŠŠÐüûj1Óö³=þûÖùûõÿÿòÆÓöááá'èå'þçý% ÿÁétttTTTžžž„ÖØÖ!ÿþçý, àøÿßûüÿöööí paQˆì=þûµ#ôÝä¾íÅí2+4-Ø1=ôÎý¾íÅJJ¾íÅìóå à¡zy4-9:=ØQ‡Ü?³ÚÛTPÿ³Ûô½½½ÿ µ½½T+ÿM ÿ³Ûô 555³Ûôèèè 555³Ûô­ÖèèèM% ÿØþüåôü 555Dx¨—Åî+++ËËËttt èèè­Ö¤p@Dx¨½½½WWW©©©\ÀDx¨—ÅîèèèäääááḸ¸ÍÍÍááá—Åî\À€¬­vvvÿááá+++RRRWWWÄÌû­¯ØÊÌÒCCCÿñïÔÕ–“ âÉSQ(ÿ—ÉЭ¯Øèèè­ÖCCCÿÒÒÒììì繚ššÿÈžžüâü">?ŒŒŒ555ÑõÔùâââ­Öýáà">?ÒÒÒìì슊Šy•–M% ÿ4.Ëøú6G!èèè?þ, ßûüDx¨Dx¨ÿi;òññññ¶¶¶Mö>ç444ÿ­ÖDx¨......ffffffbbbÿ, `N&˜d4Dx¨R†¶ÿi:þìììõ$`MuŽËó ,ÉÍùp=ß±ò 7ö3t ß±ò¿~èß±òŠ„ÿ÷¼÷&éTPÿÿÿ»‰ˆÿS…†ôôôáááÍÍÍÍÍͽ½½9òòòöööêêêÁé¼øÁéÿÓ¯¯Ó¯¯þçý³ÛôÖùû âÉMö3ôñ³ÛôßûüʹßÌÒâM% ÿ“â¼Ðà·!ÿ  !à öööšššÿŠŠŠÆÓöÐüûÖùû,  5!ÿÐüûÐüûòòòááá½½½×ÿ?þòòòžžž*Ôàø2L$ööö=þû÷ödâ÷öñññ¶¶¶#ô#ÏÕÎýÕ¶¶¶B;M&%ÿ<4ûÇØSeéì³.4-"&d¬°îCCCÿbbbÿÕÕÕËËËRRRÕÕÕ¬°î+ÿäää...žžžÿÚÚÚ&&&...žžžTPÿÑÓöóõÚÚÚ&&&...òî°¬°î444ÿfffÈÈÈžžžÿ èèè444ÿðððôôô >>>žžžCCCÿ ãâç...žžžvvvÿ$$$fffÿèèèÿ5 ô,ÅÇð+++å64.w{ªCCCÿ>çÌÒâ×ÿ)è4.ÌÒâMuŽfff444ÿñïÔ ;ÕÕÕöööŒŒŒ©©©ññññïÔÛÝøCCCÿyEÅËÒ•±Ù¦„UÅËÒGpfffS*ÿÌÒâ³ÛôÿkO'ÌÒâ³ÛôS*ÿ;5.R†¶÷ößûü¼ˆXÿ„±µô÷S*ÿÌÓûç½½½·V.ÿ–ÏÞ³Ûô¼ˆXÿ¦Ú ëê³ÛôM% ÿ4.á8Z&öDx¨¼ˆXÿR†¶÷ö ˜d4Dx¨ÿòòòRÿ®êCCCÿÍÍÍ âÉþçý³ÛôA‚ÿϧp?Ñ!Oÿß±òSQ(ÿ­¯Øÿì³!*cõ0,îÿ èèèÿöB è¾òòò!ÿ*³Ûô!ÿ*þçýµô÷S*ÿ­ÖM% ÿÔàø*$MÙûÓW.¦Ù²ßûü!ÿí öõø òòòM% ÿþçýÙ'èåµô÷M% ÿ)Qj¢¢¢ööö?þö7½½½!ÿ_OOÓýÕ­¯Ø‰…Vÿw{ªÿööö÷ö">?ËËËTTT¬¬¬÷ö*µô÷444ÿÝ äB;¾íÅ>5.Þ ¾íÅ#ôñññÌÌÌM&%ÿpa Bs2N,Á­›SeéËòóööö èèèvvvÿ¢¢¢ööö 5 ôö7333ŠŠŠvvvÿŠŠŠèèèMöäää ððð(ùèèèMöðððÚÚÚ(ùTPÿÑÓöåôüòÿìMöÖãÐü öÚÚÚ–a+ùÕúTPÿÿfff...~~~ÈÈÈ888bbbÿsE555JJJCCCÿCCCÿ......öööööö>>>888bbbÿ=3..ÌÌÌžžž×°¯æº¹èèè;9,ÅÇðèèèÑÓüÊÌÒ‰…Vÿ âÉ×ÿ×ÿÌÒâ4.fffÌÌÌ ,ÕÕÕ ÷öÈÈÈðððÿ0OÿK ÿ âÉ ²Ú Z|«;5.±roK ÿM% ÿ³ÛôêüýÌÒâ4.­Ö‘´?þí „±M% ÿ·V.ÿ;5.ÌÒâ³ÚÛÌÌÌñññIªÒocL‘´‘´ëê³Ûô³ÛôÌÒâZ&öM% ÿÿ?þí hœÌòòòËËˬ¬¬„K¹âàųÛôµô÷³Ûô­¯Ø'Žß!Oÿß±ò­¯Ø=þû?þSdÝ)躾ü¬°î555+++^^^¬¬¬ÿöB)+öB-QQÿßûüþçý!ÿ*µô÷³Ûô4- ­Ö³Ûôßûü0W.…Ô®ßûüßûüÿø òòòòòòòòòK ÿÙ'èåÿËó èèèòòò=V½½½RÏÏ IDATßûüÓýÕ­¯ØÊÌÒöööí A]^ËËËÂÂÂÖùû#ô#ô¾íÅáááaÞ ðððÝ ä³ÚÛN,Á­›Seé³ÚÛèèèžžžèèèÍÍÍׯ–5 ô +++×ÿɯם–¢¢¢ŠŠŠK ÿp715 ô0{©ñŠ[ÿM% ÿp71)èÉϬ°îÛÝøöéüöéüCú‰ØþüÑÓöM% ÿèè賋r¶¶¶ ³‹rÿZ&ö;5.ÂÂÂ>çS*ÿ½½½¶¶¶/ØòòòòòòÒÒÒ繞žžÿÿ€TSÿ<4˜ÄÅÿÿËòó¼ˆXÿÿÿi70èèè½½½ôôôö7ÌÒâ×ÿá8 ¶¶¶)èõÔù0OÿÖùûØþü‘´*  ‘´ÖùûÖùûK ÿM% ÿ4- <4ÿ콇2ÿÿÿþçý ÿÍ Ôàø2*=:³ÛôÌÌÌÊýüùÂ_ÿ4.4.³Ûô‘´ÅËÒ4.ÿ5 ôÅËÒËó ôôôÅËÒM% ÿ®êhhh555I‚QSnA‚ÿ¿~èß±ò!Oÿß±òK ÿ D ×ÿ×ÿ+òòòCCCÿ333ÍÍÍÊÊÊvvvÿrP&òòI%%µô÷ßûüµô÷RÿM% ÿ®êþçýµô÷S*ÿÌÒâK)Qÿ{,Rÿ©øÒ7{,Rÿÿòòòêêêòòòòòòÿòòòÿÿÿôôôþçýÿ­©sŠŠŠc_)SQ(ÿc-‰…Vÿêêê÷öí ÿñññÝ ä#ôÝ1+ÎýÕB;å #ôñññå Ÿó×þÿSeé³ÚÛM&%ÿTTT¬¬¬ÿ âÉþçý³Ûô ááá'èåËó èèèÿ ð(Ëó ööö=þûËó èèèÿ3ôñËó ööö?þ³Ûôÿ3ôñÚÿóõööö=þûÚÿÛÝøÿ¤p@ÅËÒ»äsE;5.‘´Ëó èèèÿööö®zJR†¶˜d4ÅËÒ­Öÿ5 ôÔàø÷ööö÷ö, Ëó èèèÿ®zJÄÌû˜ÄÅööö?ob3\Àèèèÿqm>ÊÌÒ»½æ ööö?þ<`J<<5SWèèèÿ¢¢¢888 +++“““BBBèèèÿ5 ô4- ¼ø i:þ—ÆèèèK ÿÚÿ(þçýÍ 5 ô4- —Æèèèÿ3ôñËøúø þìë5Í èèèÿèèèÿööö?þþçýÃ=þûÍ èèèS*ÿxo5ÃÆùDx¨ÿööö ööö©H 2*Dx¨ÿööö?þ4.ÌÒâËó èèèÿi;­ÖÿööösE»ä?þ4.»ä èèèM% ÿþçýÍ ööö=þûËó èèèÿ)jÍŒö 7ö÷É èèèÿ<8úÄÈöööFB64 Ž”ûèèèÿööö=þûÍ  íìí ÷ö">?½½½CCCÿiiibbb ^^^ÍÍÍÕÕÕèèèÿööösD¼ø=þûËó èèèÿmD“â¼ š<™øýÍïÇèèèÿ3ôñÃòòòÿ èèèÿ èèèÿööö?þ0‘åý?þÁé èèèvvvÿÍÍÍÕÕÕ‚‚‚~~~èèèÿ;9ÅÇðöööECÅÇðèèèÿööö555áááêêê÷öí ñññìóB;¾íÅ#ôññññññÌÌÌM&%ÿ³ÚÛbbbÿžžžÿ5 ô³ÛôM% ÿþçýËó èèèÿöööú(Áéú&éËó èèèÿöööú(Áé=þû³Ûôÿöööúüâüí ÷ö*ÚÿÛÝøÿ5 ôËó i;—Åîèèèÿööö èèèÿööö÷öí ÷ö÷èèèÿööö ööö èèèÿ­©sÄÄËÊÌÒ»½æECi70—ÉÐÅÇ𬬬555¶¶¶èèèÿ5 ôÁé?þ4- ÌÓöËó 5 ôØþüéëú(Áé þìëø öõ5Í ööö=þûà èèèÿi;;5.ÅËÒ»äsE;5.ÅËÒ­Öÿ5 ô4.ÌÒâ4.»äsE»ä ööösE»ä i;­Öÿ3ôñà èèèÿ 7ö÷É öööAí¿ èèèÿöööú/- º¾ü èèèÿööö÷öí ÷ößûüCCCÿ333ÍÍÍËËË555333ÍÍÍÕÕÕèèèÿööö?þÁé=þûà èèèÿc:“â¼mD7ÉûþÐýÿÃå½ èèèÿööö ööö èèèÿ5 ôj1ÆÓö‘åý ööö èèèÿ‚‚‚ÈÈÈÒÒÒÚÚÚ&&&...888ÈÈȶ¶¶èèèÿöööEC64.…‰¸ ööö èèèÿööö555¬¬¬÷öí èèè444ÿìóå ìó#ôÝ äB;ÒÒÒñññÌÌÌÿèèèÿöööTTTžžžÿJJJëê=V骧ÃTTTëê=V¬¬¬ èèèÿööö?þËó èèèÿööö?þËó èèèÿöööúóõèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèM% ÿËó ôôôööö èèèÿèèèÿèèèÿi;;5.ÅËÒ—Åîööö èèèÿööösE;5.\Àèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèM% ÿËó èèèÿööömD“â¼ èèèÿööö èèèÿ5 ô0›ïèèèÿèèè× K IDATÿèèèbbbÿ€ÿ¶¶¶ööö èèè444ÿìóå ñññÌÌÌÿèèèÿèèè444ÿÌÌÌM&%ÿ³ÚÛ444ÿððððððÌÌÌ444ÿÌÌÌM&%ÿ×þÿüóä ðððÌÌÌ)T„ÿ32¤zz444ÿÌÌÌ\††ÿ5;<ËÅĤzz444ÿÌÌÌ|*(ÿÑüý³ÚÛ)T„ÿ32¤zz\††ÿ5;<ËÅĤzz444ÿè÷O ±ðððø_äÕ}!'Pÿ äÌÌÌS*ÿ­ÖzQÿ†ç¯zQÿ8NϬ|*(ÿ„ÖØM&%ÿ³ÚÛ|*(ÿ„ÖØM&%ÿ³ÚÛÿèèèM&%ÿ³ÚÛM&%ÿ³ÚÛ444ÿññññññùããñññÌÌÌ\††ÿ+Õÿÿ¤zz\††ÿ‡‡‡ÿ444ÿ444ÿ\††ÿ‡‡‡ÿ444ÿ444ÿCCCÿÌÌÌM&%ÿ\††ÿ‡‡‡ÿ/S*ÿM&%ÿ\††ÿ\††ÿ\††ÿ‘ÁÂÿ\††ÿôððð8bbcccSQ(ÿ444ÿððð444ÿM&%ÿ„ŠÀÿ‡‡‡ÿ/üóä ððð0`™bþüó444ÿ444ÿ\††ÿ‡‡‡ÿK)QÿK)Qÿø±€Ô¬Å~\††ÿCCCÿˆT$ÅŽ+CCCÿ444ÿ\††ÿ%ͤ+Ç–%ͤ444ÿCCCÿˆT$ùÂ_ÿ|*(ÿÑüýþ,K)Qÿ32%ͤ`Ò²ˆˆ)T„ÿ\††ÿOU„ÿK)Qÿ)T„ÿ%ͤE%ͤ)T„ÿè÷O ±ÌÌÌø_äÕ}!'PÿßÙ°è÷O444ÿ444ÿ!'Pÿ‡‡‡ÿzQÿ¼ˆXÿ†ç¯†ç¯Î#ÿS*ÿ|*(ÿ:--|*(ÿ{,Rÿ{,RÿM&%ÿ|*(ÿ:--|*(ÿ|*(ÿM&%ÿ/|*(ÿM&%ÿÿööö})ÿM&%ÿM&%ÿ³ÚÛ\††ÿ‡‡‡ÿ #ÿK)Qÿñññùùùñññ)T„ÿÈžžs:¨ÜÜvvvÿ¼ˆXÿ)T„ÿ%ͤúÌ£ÌÌÌ444ÿ444ÿ)T„ÿ%ͤúÌ£ÌÌÌRRRÿCCCÿñññM&%ÿ/M&%ÿ)T„ÿ£s±úÌ£M&%ÿ)wpc/M&%ÿ444ÿ€TSÿ`Ò`Ò€TSÿ)T„ÿ\††ÿ)T„ÿñŸ†ð’hñŸ†‘ÁÂÿ\††ÿ)T„ÿ444ÿ73Mö0`ñŸ†Æž…ô.VPûÌÌÌ/_RLËËËM&%ÿ|*(ÿÑüýüó/3üó ,0`Ñm«ÄÍÖ ðððä üó0P'ÿÌÌÌ)T„ÿ!£‹úÌ£]5K)Qÿ, •ùø, ÍÎþñññÃÆùñññõ P\††ÿÍÎþÊÖ'ÌÒâ‘ÁÂÿOU„ÿðððñññÃÆùM&%ÿ/Þ+3sE32ÍÎþ 1,3K)QÿÊÖ'沂ÌÒâ444ÿ444ÿ)T„ÿ׬|äÕ}ÌÌÌüÍ+ƒÿ )ÌÌÌK)QÿK)QÿK)QÿK)Qÿ!'Pÿµ¯†¦ÊÊÿÿ<4S*ÿ²1TÿBoDx¨²1Tÿ<4€TSÿS*ÿ<4:--ÅÕý:--M&%ÿþ,•Ý<*Ü­› K)QÿM&%ÿ:--ÅÕý:--|*(ÿ„ÖØ/M&%ÿ|*(ÿ„ÖØM&%ÿM&%ÿ„ÖØ³ÚÛþìë555m })ÿM&%ÿÉÞÞ0ìj0öM&%ÿM&%ÿ)T„ÿ÷Ë¢ÌÊ¡ÿÉú9K)Qÿ O ùùùòòêêêòòùêòò O ¼ˆXÿ32I‚áááìììvvvÿDx¨ÿ32p71p71ñññÌÌÌÿ32p71âââŸ8 |™e³ÚÛÖ¥³ò‘$xo5S*ÿ×þÿ£Ñú‰Ñüý³ÚÛ444ÿ444ÿ444ÿ‘ÁÂÿ\††ÿ©1©1)T„ÿ325;<32,2,xœ¾”Â5;<32ÌÌÌÒWÌÒâäää324.4.äääÖ\ÌÒâÉÍùM&%ÿM&%ÿ‡R|||ÛÿÿM&%ÿ×þÿÑüý/ðððä ’.ôÔýôôô32ÃÅóp71½•ìüó/3ä ÿTÕtaJp71ÍÎþ]5)T„ÿ)T„ÿ=VÌÒâMuŽ32\††ÿ\††ÿM&%ÿÅËÒõ P325;<32‘´Ü/xËÅÄBl>8bbõ P‘´ÅËÒ/v`90^3.4ÍÎþƒÓ&ÅËÒƒÓ&Bl>]5OU„ÿ444ÿ444ÿ‘ÁÂÿ32‘´Ü/x\††ÿÌÌÌ444ÿÌÌÌ444ÿ׬|)T„ÿ+ƒÿßÙ°)T„ÿ!'PÿýÔäâÌððð444ÿK)Qÿ0K)Qÿµ×¯‘ÁÂÿ\††ÿµ×¯{,Rÿ0K)Qÿµ¯†W{{èèèÿÿöööÿS*ÿ=: yn WÈèý²1Tÿ<4ynS*ÿÆÓÓsý/Ü._]5#N ÄÖ$½•ÿåÔþ,—ÏÐsý/„ÖØM&%ÿ|*(ÿ’äæ|*(ÿ/q0ù|*(ÿM&%ÿ/ 4üM&%ÿÿø Œ@Fð@äþ IDAT×þÿ¡Rq‰Ckj0ö³ÚÛÿ3264.64.€TSÿK)Qÿ‰…VÿSQ(ÿM&%ÿM&%ÿ±u}888ÕßÒÀï22ê/55gn9êòò2ü@îÎý¼ˆXÿ¦Ú \††ÿ)T„ÿÍÎþÕÕÕCCÂÂÂ\††ÿbbbÿÍÍͼˆXÿÿçù444ÿ0P'ÿ444ÿÌÌÌ444ÿ444ÿOU„ÿð’h%ͤ!'Pÿ32ÄÌû‘žÍ32)T„ÿ325;<˜“ÂÍÎþÖ\øÎÔ†hÆÚÿfŽ\††ÿ4.444ÿððð‘ÁÂÿ˜“ÂÍÎþÞ+34."ÕÍÍÎþ‘ÁÂÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ׬|üí•+ƒÿ)T„ÿ+ƒÿÉ5£-4ø_)G5׬|ÌÌÌK)Qÿ0@]60OU„ÿ*ÈÆ_Ðýÿ@]60K)QÿOU„ÿy®ð¾þð¾þ&Pÿ öööÿ<4€X>9侑ù)T„ÿzQÿåjÜ\††ÿzQÿ=: Ñüý®(232M&%ÿ325;<^Ðýÿf¹!0-Þ+3D›áZ4M&%ÿëèÑüýn’äæq0ùq0ù/’äæÐ³ÚÛÿvvvÿvvvÿþìëááᘘ˜òà߯Óö³‹r½•ì–Ð M&%ÿ¤d6¦a \††ÿhm>ÉÏñññðððñññ\††ÿœõÍÎþ32^3 Ô&]Omž32‘ÁÂÿ%ͤ`Ò(RRÄ9 ¬þ'Ó¯¯ÌÌÌä üó444ÿ\††ÿOU„ÿüó444ÿüó444ÿ 1p71p71\††ÿ!'Pÿ-4óÏþ`aÍÎþ!'Pÿ‰…Vÿ˜“ÂïÄ”32&ÊÖ'Þ+332ßÙ°ÍÎþ÷Ë¢SQ(ÿÿ¨ZøÓÌÔD32hm>¤zzÌÌÌ444ÿM&%ÿOU„ÿ55<82jÑ5á€EK/4&Pÿ„ŠÀÿ¥cÖ(*ÉûýÌÌÌ8Ê)32Dnn32Êe6ñ”Ó68bbmž¾”Â\††ÿÅËÒèèèÍÎþ 132ÍÎþ׬|˜“ÂÅËÒ‘´ñññÒÒÌCC!'Pÿ³/ÿOU„ÿ AÌÌÌBYÒ+REäÕ}׬|444ÿÌÌÌŠ„ÿµ×¯"ÕÍ32\††ÿóÏþ¼ŒÁPX½5;<‘ÁÂÿ32׬|µ×¯K)QÿÿOU„ÿüÔÍÖþÿÒÒÌÖþÿá½½ èè臒ëâm5ÍÎþûРÍÎþ32¯;3׬|ÍÎþ8bb32âm5€¨ë‡’|ÍÎþ&Á‰ÉªU2"ÕÍ®(2ÊùÔþѡ׬|³ÚÛÑÁèé ×þÿ’äæðçå7Ê¢ýÿÿ ‘åýùMevvvÿõÿÿø ÷öÎãøí oÎãøoƒ×ï³ÚÛ|*(ÿÀÑ™ùÍÌ-4Öþÿ¤zz€¬­׬|µ×¯M&%ÿ/M&%ÿÿþèÃéÃ**àþÿÜÜîÎý/55ú$$2](/55/55ÑËËòòùÌÌÌžwþb‰ 2½”ò–½6ÿžwþÌÌÌCC32¼’’׬|ÍÎþøÓÌ*ïÄ”¤zzïÄ”ÍÎþñŠ[ÿkü+öÌÌ×2øÓÌ*ÍïÇèèè\††ÿ¤zz)T„ÿ325;<fŽ*ÍïÇèèè\††ÿØ®®ÌÌÌ444ÿÌÌÌ\††ÿ¼’’èèè)T„ÿøÓÌ*ÍïÇèèèÿï“‘´àáðððÌÌÌ\††ÿÜÜéÇï]5ÍÎþ32¤zz\††ÿ5;<˜“Â"ÕÍÞ+3ïÄ”DnnÍÎþ׬|SQ(ÿ64.w{ªÿööö èè艅Vÿw{ªÿ “2 jÑ"*l-ÝIªÒM&%ÿ¥cjý_ñ Ÿ/_h—”Ó6ÍïÇèèèÿŸ>IªåM&%ÿ³ÚÛ\††ÿÍÎþ׬|RRRÿ×2”2žŽ£/ÍïÇèèè\††ÿ¤zz444ÿÌÌÌ)T„ÿøÓÌ*ÍïÇèè臇‡ÿÕÿÿ¤zzÿööö)¤d6\œÊ³ÚÛÿööö 7=l±«|\††ÿï£ËÞ+3ûРà, è¾öB%.4hm>¾”±«|444ÿõµ×¯ÿööö 7=l±«|)T„ÿ"ÕÍé ãÌÌÌ444ÿõÞ+3hm>ËÅıž,;_6¤zzÿk6'Ï®®®)T„ÿ32øÊŒ¬°î\††ÿÍÎþ32ÜÜéÇï]5ÍÎþ32ÍÎþ32¤zzÿ÷7ßÙ°!'Pÿüèÿ.ÍïÇèèèÿ÷7û ÉèèèzQÿ;©1ô»Ëñÿ¿Fv"ÕÍ]5¤zz\††ÿ$ÎÍ=3ßCyÎM&%ÿÜ._32ÍÎþô»Ë0Ö³ÚÛÿ/üú/¢ý^ÿް"rPÞ¢ýHíéÑùûÑòòòÿ+++333˜˜˜ JJJááá333¢¢¢èèèÿø =þûËøú \$ *ÁM IDAT ƒ×שּׁ¬ÿÐ~|Ö(*×2øÓÌ*ÍïÇèèèM&%ÿ<=é¬ÃÃé÷ö‘ú–¶¶¶ž¤ÁK#.ÕßÒàøÝ-QQÿããù5ú$$ÑËË/5589ÈÇüÑËË5ËïïããùÓ¯¯CCCÿ333ììì4[ÔÌ¥,ÍÍͽ½½)T„ÿ׬|ÿòòòÿèèè444ÿ½V'kü+¼’’öööòòò)T„ÿ׬|ÿöööNxx²ˆˆòòò)T„ÿ׬|ÿòòòÿèèè)T„ÿhm>ËÅÄÅ¡Ê*Þ+332ÍÎþ32¤zz444ÿÌÌÌÿh<;âëÄÃÔ+A;òñ€¬­444ÿÌÌÌ444ÿ!P ÞËïï/55ï£ËÖþÿ-432¤zz!'PÿpšrËÅļ’’K)Qÿ]5ÍÎþ"ÕÍÞ+3׬|444ÿÌÌÌ)T„ÿ"ÕÍÞ+332ï£ËÞ+3׬|)T„ÿ`1ÒÕÿÿãûßÙ°)T„ÿ32ÍÎþ"ÕÍÞ+3׬|)T„ÿ׬|bbbÿËïï/55ï£ËÖþÿßÙ°)T„ÿ׬|ÿCCð¾þãñ±ÿòòòÿèèèzQÿBoa‡÷ãñ±ÿòòò€TSÿ<4ÄÌû€¬­M&%ÿËòóööö?/Ñüý³ÚÛÿòòòK ÿËøúg%‘åý/üúÑ/üúÑòòòbbbÿŠŠŠÿ+++ÕÕÕ^^^ìììÂÂÂ>>>ŠŠŠÿø òòòM% ÿ4- ®êÿöööòòòM&%ÿÁèéòøë÷ö‘™ïóÕü+!.µ×¯CCCÿê5Ëïï/55ÜÜ2](™’ÇããÌÌÌvvvÿ¾¾¾b‰à¹@¾¾¾ÌÌÌÿèèèRRRÿÆÆÆ39µ×¯äääkü+Èžž39DDD =C)T„ÿ׬|öBÁ‰ÉNxxïÄ”DDD =Cèèè)T„ÿ32ËÅÄÍÎþ;_6â(ïĔȞž32¤zzÌÌÌèèèÏ1Çò"_-¬¬¬€¬­ÌÌÌ!P 1Ëïïώخ®é ã-4øÓÌÍÎþ-4ËÅÄÍÎþ39床ööö=CËÅÄ5;<-4ÑÓüSQ(ÿ)T„ÿ"ÕÍï£ËøÓÌÞ+3hm>32‰…Vÿ64.ÊÌÒ39`ÈaÂê”Ó#)T„ÿ³ÚÛÅÍô³ÚÛDDD ©H M&%ÿèèè׬|39Fv©H =CK)Qÿ׬|Þ+332 =C)T„ÿ¦a ¦a Ä¢Ê555Dnn32...š÷úp71ÅËÒÉûýK)QÿÞ+3øÓÌÞ+3hm>32³ÚÛ׬|׬|0`%.4%.4ÛÒÌ"ÕÍéÿGXÿ¦;5.ÅËÒËÅÄK)QÿÞ+3øÓÌÞ+3hm>32ÌÌÌ"Õ͵ׯ"ÕÍ"ÕÍï£ËÞ+3ûР"ÕÍ+ßæÿ+ƒÿK)Qÿ32ÍÎþ"ÕÍ\††ÿ׬|Ëïïώخ®é ãßÙ°׬|ÿá½½B AM&%ÿèèè²1Tÿãñ±K)QÿFvNxx=C<4úÅþM&%ÿM&%ÿ,-Dnn7=l=CÜ._Ñüý×þÿM&%ÿòòòËøú'‘åýòòòòòòÃöø ÑáááìììèèèÕÕÕ^^^ìììÂÂÂáááìììø òòòÉß÷ÔàøÊºóÿ39DDD =C)T„ÿ³ÚÛòòò?í ™ïó™ïóÖùûÿñññËïï/55ÑËËËïïΣØvvvÿ¾¾¾b‰½”ò GÀBBBèèèK)Qÿ555Dnn)T„ÿèèè¼’’555Dnn32RRRÿòÈç=C)T„ÿèèèK)Qÿ555Dnn)T„ÿ׬|5;<øÓÌÅ¡ÊØDnn0`¤zzÉÔWÏ/_üÖÕrFE±«|%ͤôÖÿäääíó床ýÔÈ6וÕ&]5Nxx=C]5>`ə׬|ÊÌÒ/-­¯ØïÄ”ü»(×*&ËÅÄóÏþ)T„ÿw{ªw{ª­¯Ø555Dnn32RRRÿM&%ÿ³ÚÛ®®®IªåK)Qÿ555Dnn/_M&%ÿ^30]5RRRÿ"ÕÍï£Ëï£ËDnn32RRRÿv¥v¥µ×¯Þ+35;<×2×þÿ\œÊÌÓû7M&%ÿ]532ÍÎþ*&ËÅÄóÏþ)T„ÿOÿ"ÕÍUUGÒæþû ÉÒæþá8ÅËÒÛ3\¤zz]532ÍÎþ*&ËÅÄóÏþ)T„ÿµ×¯ÍïÇÍïÇïÄ”8bbµ×¯ÿó×ÿÕÿÿ=;ó±üÍ Oÿ)T„ÿ(×ï£Ë床Ãå½ÍïÇ"ÕÍÍÎþTPÿôÖÿäääíóÿèèè ãñ±K)Qÿ* 8Ô+ÄÌûIPÿ)T„ÿÞ+3ï£Ë)T„ÿÄÌûM&%ÿ×þÿ/×25;< 1`a)×þÿM&%ÿø Ñòòòèèèááábbbÿ¢¢¢ááá>>>áááêüýhhhÿ \$ oÿ555Dnn32|*(ÿÁèé òøÖùûÖùûí èî òòÑËË/5589Ëïïòòòò444ÿ¾¾¾b‰žwþáã ®®®444ÿÿÞ+3ï£ËÞ+3hm>èèèôôôÞ+35;<×2ööö 8N,ÍÎþhm>ÿÞ+3ï£ËÞ+3hm>•Õ‡WV-4..4ÍÎþ327=lâ ÞÑüýÏ1ÎZ..48bb7=l*=C+1`v¥׬|8Ê) 1ï£ËÞ+3÷'(kü+­¯Ø­¯Ø;9,ÅÇðµ×¯üÔÍï£ËüÔÍøÓÌÿÞ+35;<×2!'Pÿ³ÚÛÿÞ+3óÏþ;4M&%ÿ³ÚÛÞ+35;<ù×ÿÍïǦa <^65;<×2)T„ÿ^3 :;ï£ËÖþÿöÆÅ32...Ëòó×þÿš÷ú/K)Qÿï£ËüÔÍóÏþ&M% ÿŸy ÒæþŸ¸ÊŸ¸ÊÒæþû Éû É»­ía‡÷œ¼%ï£ËK)Qÿï£ËüÔÍóÏþBl>&)T„ÿ\††ÿÞ+3ËÅÄÍÎþ`a)³ÚÛòòò/üúÿÿòòò½½½½½½áááèèèèèè½½½ááá>>>½½½½½½ŠŠŠÎãˆÇÞ IDATøÖùûÎãøöööÿÞ+3÷Ë¢mûõÿí *ÕßÒ òòòò5ΣØêÌÌÌžwþÌÌÌžwþ;_ ÌÌÌ39^3 :;32öÆÅ)T„ÿ39^3 :;ÍÎþÖþÿöÆÅ32RRRÿÿ=Cf`7?opÞ+3øÓÌöÆÅ)T„ÿ39^3 :;32öÆÅ)T„ÿv¥èèè& 1Þ+3øÓÌ)T„ÿÿOU„ÿ1ÿÏÈÆþÑ¡OU„ÿÿÿ 1óÏþ 1]5 1OU„ÿÿÿOU„ÿ32óÏþÍïÇ"ÕÍÍÎþËÅÄÿÿi70èèèµ×¯ÍïÇ(×h^39^3 :;ÍÎþÖþÿfŽ321+ÿ39^3ý9£5²]ËN82/_M&%ÿK)Qÿ^3 :;lÎbr]ÑöÆÅÞ+3RRRÿ39–ý, :;ÍÎþÖþÿöÆÅ32RRRÿÿ)T„ÿhm>ÕÿÿºhÙûÓýÔÄ¢ÊÍÎþ 4439)³ÚÛ„ÖØÍïÇ6*Ùï£Ë"ÕÍÙûÓÙûÓüÔÍüÔÍüÔÍK)Qÿ4.ÅËÒŸy 0½ãñ±ãñ±èèèèèèdDÛ0½dDÛÍïǵׯ6*Ùï£Ë"ÕÍÙûÓÙûÓüÔͺhüÔÍK)Qÿ)T„ÿ)T„ÿ32Å¡Ê"ÕÍ"ÕÍ"Õͺh²ˆˆ!'Pÿ!'Pÿ )ýÔ׬|+ƒÿäÕ}Þ+33232Þ+3"ÕÍ׬|ÿÿ 1óÏþ 1]5 1OU„ÿ7=lüÔÍÖþÿüèÿ*OU„ÿNϬÈèý W"ÕÍï£Ëµ×¯·í°þêÿï£Ë þ.M&%ÿ`a5;<óÏþ,3"ÕÍ&ÍÎþÜ._M&%ÿM&%ÿòòò= ÿÛòòòòòòÿ òòòCCCÿbbbÿááábbbÿRRRÿÿÿöõÖùûõÿÿÖùûoÿ39^3 :;ÍÎþÖþÿÑÓüj, |*(ÿÿöööòøàþÃòøàþñññêòòêÑËËú$$ããòòñññãã444ÿÌÌÌÌÌÌÌÌÌÕ±Õÿÿ˜“ÂÀ¥ý¢Íý^3)T„ÿK)Qÿ)T„ÿhm>ËÅÄï£ËÑ2 )"Õ͵ׯ)T„ÿhm>ËÅÄï£ËÑ2 )32ï£Ëµ×¯)T„ÿhm>ËÅÄÍÎþ"ÕÍÑ2 )^3¢Íý׬|ÿ39Þ+332ï£ËÞ+332ï£ËÍïÇèèèÿööörFEÍÒÒÔ+÷ñÈèèèÿöööNxxóÏþ 1ï£Ë]5¤zzÿrFE<4ÄÌû˜ÄÅ39ÍïÇ39ýÔob3ÄÌû˜ÄÅèèèÿqm>ÊÌÒ»½æ ööö?þ<`J<<5SWèèèÿËÅÄï£ËÑ2 )øÓÌ*µ×¯·VÿÍ4¥ËËÄ«l¸U”H55<ýÇs:µSeé³ÚÛ)T„ÿhm>ËÅÄaœ_¥a )"Õ͵ׯ)T„ÿhm>ËÅÄï£ËÑ2 )"Õ͵ׯ)T„ÿ32ï£ËÍïÇööö ð&é³Ûôÿi;p71\›±Áé ööö?þ¤eOÉÏ—ÅîèèèS*ÿ—Åîèèèÿ5 ô4.ÌÒâÁé èèèM% ÿocLÅËÒ»ä ööösE­ÖK)QÿÖþÿ÷ñÈööö èèèÿküí•ËÅÄï£ËÑ2 )"Õ͵ׯÿöööòøëòø àþë ñññùòòññññññÌÌÌÿööö"AÚBÖþÿ*Þ+3"ÕÍÍïÇèèèÿööö=C]5ÍÎþ"ÕÍÖþÿ*Úú·&é³Ûôÿööö=C]5ÍÎþ"ÕÍÖþÿ*Þ+332ï£Ëµ×¯ÿööö=C]5ÍÎþ"ÕÍÖþÿ*Þ+3"¸…³Ûôÿ39]5ÍÎþøÓÌ*Öþÿ*ÍïÇèèèÿööö èèèÿööö 7=l±«|ÿööörFE˜ÄÅööö h<;€¬­ÿööö·³}ÄÄËÊÌÒ»½æ ööö öööECi70—ÉÐÅÇðèèèÿööö=C]5ÍÎþ"ÕÍÃå½÷ö(Ëó èèèÿöööì³.½•ß;3 8Qh§`Ö8QKͳÚÛÿööö=C]5ÍÎþ”2žd¡.*Þ+3"Õ͵ׯÿööö=C]5ÍÎþ"ÕÍÖþÿ*Úú·&é³Ûôÿ íì, Áé÷ö, ³ÛôÿööösEp71ÉÏ»ä ööö 5 ô¤eOËþýÅËÒ—ÅîööösE;5.ÅËÒ»äsEÌÒâ4.ÌÒâËó èèèÿ5 ô4.ÌÒâËó ööö 5 ô4.—Åîèèèÿèèèÿööö èèè+ƒÿ )床 kòã‹ èèèÿöööú/- º¾ü èèèÿööö 7=l±«|ÿöööA.Òæþ.ýº³Ûôÿööö¤#FÈèý”õ½l C”õ½ èèèÿ39þêÿàA4"ÕÍÙûÓêêê ööööõööö èèèÿöööDDDáááÕÕÕööö555¶¶¶èèèÿööööõ í öõ í èèèÿööö=C]5ÍÎþ"ÕÍÖþÿ*Úú·.. ­¯Øÿòøëúîë èèè444ÿùããùòòCCÑËËããñññÌÌÌÿèèèÿ7÷õÔù ,Þ¿ÿ öööú ,Œ9I\Àèèèÿööö=CÍïÇèèèÿööö=CÍïÇ39ÍïÇèèèÿööö=CÍïÇèèèÿ39µ×¯ÿèèèÿèèèÿèèèÿèèèÿèèèÿööö=CÍïÇèèèÿöööì³.WÜèèèÿööö=CÍïÇ39µ×¯ÿööö=CÍïÇèèèÿèèèÿèèèS*ÿ;5.‘´Ëó ¤p@Dx¨ÿ¤p@ÅËÒ»ä èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿöööAû Éèèèÿb98Èèý”õ½ èèèÿèèèK)QÿÍïÇööö èèèÿööö èèèÿèèèÿèèèÿ uþºn IDAT ööö èèèÿööö=CÍïÇèèè€ÿÿööö ööö èèè444ÿùãã...ÒÒÒñññÌÌ̼ˆXÿ\À¤p@Dx¨ÿ¤p@Dx¨šššÿfff444ÿðððñññÌÌÌvvvÿ$$$TTTvvvÿ666TTT444ÿÌÌÌ444ÿÌÌÌvvvÿ$$$fff444ÿÌÌÌ444ÿÌÌÌò‰'ÿwÙò‰'ÿwÙbbbÿžžž444ÿññññññ!Påß°ñññÌÌÌ444ÿÌÌÌvvvÿ¬¬¬ÿvvvÿ¬¬¬ÿvvvÿ¬¬¬ÿ¬¬¬ÿ¬¬¬ÿ¬¬¬ÿ¬¬¬ÿ¬¬¬ÿvvvÿ¬¬¬ÿRRRÿS*ÿvvvÿvvvÿvvvÿ¬¬¬ÿ{ÿ})ÿ¼ˆXÿšššÿ‡kjRÀ˜©©©¬¬¬ÿÌÌÌCCCÿvvvÿ Ý´"î¾Õ§~CCCÿvvvÿ$$$îî¬ÿbbbÿ444ÿÌÌÌvvvÿ Ý´```ç¹bbbÿÌÌÌ444ÿ444ÿSQ(ÿÌÌÌSQ(ÿvvvÿvvvÿíZ!ÿò‰'ÿwÙ{,Rÿ{,Rÿbbbÿbbbÿ444ÿvvvÿ¬¬¬ÿvvvÿ¬¬¬ÿbbbÿ¶¶¶¶¶¶bbbÿñññ!P!P(RR!Pñññ444ÿ444ÿRRRÿvvvÿšššÿ444ÿ¬¬¬ÿ Ý´Õ§~¬¬¬ÿ Ý´Õ§~¼ˆXÿ¬¬¬ÿ‰ƒÁLá€TSÿܬܬ€TSÿCCCÿbbbÿ¡y`Õ§~¡y`bbbÿbbbÿ¬¬¬ÿׯ–¡y`vvvÿûÓº­ÖRRRÿ```·ÛÛbbbÿ¬¬¬ÿ Ý´Õ§~})ÿ*})ÿS*ÿÈÈÈ, •ùø âɶ¶¶CCCÿñññ¶ñññCCCÿ£ÑúÌÒâiiivvvÿbbbÿ$$$ç¹ç¹Õ§~888bbbÿvvvÿšššÿ¬¬¬ÿ444ÿˆT$ˆT$¬¬¬ÿìììæ²‚ÌÒâ888444ÿáã SQ(ÿ444ÿ­¯ØRRRÿ```·ÛÛ-QQÿò‰'ÿf÷ûÑúúÁ/ÿò‰'ÿaÈK)Qÿ•Ý<*ÜúÁ/ÿK)Qÿ444ÿCCCÿ444ÿbbbÿbbbÿ¬¬¬ÿbbbÿttt444ÿÌÌ̬¬¬ÿ¢¢¢߬¬¬ÿÝÛ²§¥|ÖÖÖÿ444ÿJJJÑ JJJÒÒÒ!P!Pôî¿ A A Aôî¿ 15;< Aôî¿ÌÌÌ444ÿ:æÎùº·Õ–“¸¸¸RRRÿ444ÿÊÊÊ;5.;5.¼ˆXÿÊÊÊ;5.;5.RRRÿÅËÒNƒ½!bbbÿvvvÿvvvÿ´àá,XYbbbÿñññJJJ,2,xœJJJ%%%bbbÿÊÊÊ4.4.CCCÿCCCÿö7bbbÿ„„„W{{%šššÿËïïÊÊÊ;5.;5.þëþÐüû;5.ƒ×ïbbbÿÂÂÂ=VÌÒâMuŽáááWWWvvvÿ¶ÃÆùÅŽ+‘´ö7îîî$$$bbbÿáááÈÈÈp71p71ÜÜÜ888ÍÍÍWðÁLáñŠ[ÿÅËÒÊÊÊCCCÿšššÿ³á ‘´×ÿÈÈÈbbbÿGAì444ÿÌÌÌ444ÿSQ(ÿ­¯ØÌÌÌ»‰ˆÿbbbÿvvvÿ»‰ˆÿ-QQÿCCCÿ„„„W{{šššÿàÒÓíZ!ÿaÈ64.f÷ò‰'ÿøÈøÿúCÿÉï9MßÄÖ$½•ÿåÔK)Qÿ444ÿ>ç‰SþCCCÿJJJ¶¶¶ÖÖÖ€–ž- IDATÊÊÊ­©s±µë¬¬¬ÿÊÊÊ64.64.***...ÊÊÊÇJJJxxxñññôî¿ A ABl>Bl> Aç½½ 1 A444ÿƒ"ç:- ÌÌÌvvvÿw$umç$$$:æÎ444ÿ¼ˆXÿRRRÿìììÅËÒ¦Ú šššÿRRRÿÅËÒRRRÿìììÅËÒ¦Ú šššÿRRRÿZZZá8RRRÿh¡3<;5jŸÕšššÿ444ÿvvvÿbbbÿøÃÿšššÿšššÿRRRÿvvvÿvvvÿñÈ Ý´444ÿvvvÿ{åvvvÿxxxÄÌû‘žÍÊÊʬ¬¬ÿCCCÿbbbÿJJJBBB¶¶¶ÿ*ġϱµë¶¶¶%%%%%%RRRÿìììÌÒâá8šššÿ333½½½Ëïïšššÿbbbÿ·Vÿ§S;%eÉšššÿšššÿÓ¯¯RRRÿFâÅËÒ¦Ú šššÿRRRÿšššÿçNS¦Ú šššÿšššÿ£ÑúCCCÿÂÂÂö7©©©333ÜÜÜ$$$bbbÿ444ÿñññÃÆù}´4.WWWÜÜÜšššÿáááÂðÉÏ3šÉììì®G9292bbbÿÌÌÌ¦Ú £ÑúÜÜÜ4.RRRJJJšššÿ444ÿÉÍùGAìÌÌÌSQ(ÿÚÚÚŠ„/ÿ­¯ØbbbÿvvvÿvvvÿY'&E444ÿvvvÿvvvÿ444ÿBBBàÒÓëÇÇšššÿšššÿóÝÜf÷64.ûÑúbbbÿšššÿíZ!ÿ÷œöûÇìRÿÒÿ.îÖÖÖÿ888mD¹âW¸à0-)ððð>ç<4¾¥ zDïÿÿÒÒÒ¶¶¶ÿ444ÿ¶¶¶ÖÖÖÿbbbÿ¶¶¶ÌÌÌ444ÿCCCÿÍÍͱµëÍÍÍšššÿRRRÿvvvÿ¬¬¬ÿ———RRRÿììì)˜ÀÙÝ šššÿÒÒÒììì¶¶¶ÊÊÊîîîvvvÿ Aôî¿óÉþóÏþôî¿ AbbbÿCCCÿÌÌÌ}ÞvvvÿRRRÿî¢ßþçý†fÓRRRÿRRRÿBBB:- IõÝvvvÿ¬¬¬ÿ$$$JJJ<<<šššÿZZZá8bbbÿ$$$JJJ<<<HHHRRRÿJJJÄÅË<<<šššÿBBB666ÄÅËšššÿç¹"ššÿšššÿŸ8 666vvvÿìììp71p71444ÿBBB666aÈ÷vvvÿ666<4)PQ¾¾¾iii¬¬¬ÿJJJ¾¾¾ðððñññ,-ìììááá%%%‡‡‡ÿCCCÿ$$$JJJ<<<ÜÜÜ®®®ŠŠŠÓ¯¯888vvvÿ« G:- ÛÿÿCk!<<<šššÿ¸¸¸bbbÿ¨oÝ~§:<<<HHHšššÿÈÈÈ888=V888¬¬¬ÿÞB888>>>333$$$ÍÍÍÜÜÜÌÌ̺îÅËÒ$$$ìììÂðÜÜÜÜÜÜìììÜÜÜbbbÿññññññ£Ñú>>> U‹ùÇÎ U‹888žžž>>>žžž¢¢¢ììì333£Ñú¶¶¶ÜÜÜšššÿvvvÿvvvÿbbbÿbbbÿÌÌ̽½½š õÿŠ„/ÿSQ(ÿ73EC„Ÿ×SQ(ÿTPÿ888y«¬666vvvÿÍÍÍDt?444ÿBBB666—ÉÊàÒÓ333... .-<<<šššÿ¸¸¸íZ!ÿ64.›ŸÎðò‰UÈÈÈÊüú d ¤ÑòÒÒàRRRÿÄÄÄÈÈÈ7ðððmD7RRRÂðï%zÄÌøÿ%ò𬬬ÿCCCÿ%òðÿÌÌÌÒÒÒbbbÿJJJJJJÖÖÖJJJbbbÿÒÒÒžžžÌÌÌ333<<<šššÿZZZììì———½½½bbbÿ$$$JJJÊ <<<¶WUÿ...¾¾¾ššš$$$ñññôî¿ A 1ËÅÄBl>/_`ËÅÄôî¿ A Aåß°ÒÒÒ¬¬¬ÿ=ÌÌÌ¿ [$$$$$$ÜÜÜ-F)Qjììì$$$HHHšššÿ³›« Gƒ×ïºî666ÊÊÊìììÊÊÊá8888ÖÖÖ¸¸¸bbbÿìììÊÊÊá8888ÖÖÖ¸¸¸TTT666444ÿÒÒÒ———–Êú888ÖÖÖ¸¸¸ŠŠŠTTT666Dx¨CCCÿÈÈÈ;5.bbbÿšššÿ½»½»aÈ÷666ÉÏCªÙBBB666ˆˆˆZZZvvvÿ666———ºî666ÊÊʬ¬¬ÿ§¥|§¥|ˆˆˆðððñññiii555888¶¶¶§¥|þÏCCCÿvvvÿ333ìììÊÊÊ=V888ÖÖÖ®®®ÈÈÈìììÒÒÒŒí(Ípë Ù^ÖÖÖÜÜÜHHHšššÿ888ÃÅóÅËÒûÇË888ÖÖÖS*ÿ¼ˆXÿšššÿfffáááÈÈÈ888ÈÈȶ¶¶îîîbbbÿ¼ˆXÿS*ÿfffWWWÈÈÈžžžfffáááWWW333ÍÍÍ~~~ááá$$$vvvÿÌÌÌžžžìììÍÍÍìììCCCÿCCCÿÒÒÒäääðððÒÒÒðððÈÈÈ©?„³ÈÈÈžžžŠŠŠèèèììììììÂÂÂÒÒÒìììÜÜÜ Ý´444ÿ$$$888888bbbÿÅÇð/-rl€“ÕÒÒàÉÍù­¯ØòÝú­¯ØŠ„ÿfff...666¼ŒÁ]BBB666ˆˆˆZZZÍÍÍ'ìììÒÒÒðððá½½fffÖÖÖÜÜÜHHHÊüúœž²íñ iiiÍÍÍŒí(B« øÈø,‡‰¤{,RÿšššÿvvvÿfffèiFvvvç6NϬžžž$$$“““ç6­ÖöööCCCÿA®uËËËCCCÿþìëÌÌÌžžž¬¬¬äääÒÒÒ¶¶¶ˆˆˆžžžÌÌÌvvvÿììì333ÍÍÍ888ÖÖÖ¸¸¸½½½òñ´²ÊÊÊæ8:Y'&ÖÖÖ23bbbÿÒÒÒxxxÜÜÜ A ÞØüÆ5;<ËÅÄÑ¡ óÏþ Aôî¿ôî¿!PÌÌ̈ˆˆ¬¬¬ÿbbbÿp87€TSÿ444ÿ¸¸¸ÜÜÜ®®®-FŠŠŠÈÈÈÜÜÜÕ)AŠŠŠÒÒÒìììáááÜÜÜTTT®®®TTT666666ÒÒÒìììáááÜÜÜTTT®®®TTTBBBHHHäääâââÜÜÜTTT®®®TTTÒÒÒÅËÒÞBÒÒÒšššÿCCCÿÜÜÜ;3;3šššÿZZZˆˆˆîîî³á ˆˆˆÌÌÌTTT€TSÿ¼ˆXÿ666ÊÊʽ½½lll¾¾¾xxxŠŠŠܬ¼ˆXÿ64.ÑÓüäääÊÊÊ%%%JJJáááS*ÿ âÉŠŠŠÒÒÒìììáááÜÜÜTTTÈÈÈðððžžžäää:søÜÜÜTTTŠŠŠ¸¸¸ÜÜÜÈÈÈá8ÃÅóîîîÈÈÈÂðÅËÒ½½½áááttt¶¶¶žžžÈÈÈ888ÅËÒfffžžžÕÕÕttt—ŒŒÊ¿¿ôôôÍÍÍç¹FâÍÍÍõ#Lfff¶¶¶¢¢¢ËË˶¶¶ááááááCCCÿ>ç>çäääôôô¶¶¶âââñññðððÆÆÆááá©©©JJJTTT+++žžž¶¶¶¶¶¶ËË˶¶¶ÌÌÌžžž;5.S*ÿvvvÿfffs‰Š‡¶ºêžžžèè譯؛ŸÙI:$ea'ÅÇðSQ(ÿ444ÿCCCÿšššÿÊÌõTPÿšššÿTPÿžžžTTTîîî333y«¬ˆˆˆÌÌÌTTT½½½BBBáááäää&&&fffTTTŠŠŠ¸¸¸ÜÜÜÍf„K¹iii¶¶¶ÍÍÍñññÌÌÌQº...¶¶¶Âñ-ÜÜÜìììžžž888ÈÈÈáááfffŒŒŒÊÊÊžžž= ÿÿbbbÿiii!´í= ÿòòòöööäääžžžÌÌÌCCCÿbçÑI IDATbbÿìììÒÒÒìììÜÜÜTTT®®®TTT666€TSÿ;55¸ ìììááá»íîxxx¶WUÿáááäääÌÌÌTTTŠŠŠ!Pôî¿Bl>ú$$ÜÜËÅÄíó" Añññ¬¬¬ÿ...DàÞòñÅÎü¤ÐÑCCCÿ444ÿÌÌÌÜÜÜ®®®®®®âââ$$$¶¶¶žžžÜÜÜ$$$ŠŠŠvvvÿŠŠŠÿööö&&&ÌÌÌS*ÿõ#LŠŠŠÿööö&&&ÌÌ̬¬¬ÿ¶¶¶ÂÂÂôôô¥n Ÿêç(ÌÌÌbbbÿ888šššfffÈÈÈ888fffbbbÿ%%%ËËËHHHšššðððvvvfff444ÿÌÌÌbbbÿáááWWWšššÌÌ̬¬¬ÿTTT¬¬¬ÿlll ½½½vvvÿ ÞÝ€¬­SQ(ÿ64.›ŸÎêêê>>>íííÛÛÛÂÂÂ/-64.w{ªvvvÿŠŠŠÿâ©$½•ß}ÞÌÌÌbbbÿžžžÿ¥n Ÿêç(ÌÌÌRRRÿ®®®bbbÿUô¹aÂý¥n ¥Ü@ÒÒÒÌÌÌCCCÿžžžvvvÿìììžžžbbbÿÂÂÂ333®®®˜d4Dx¨CCCÿ333®®®ôôô”””¶¶¶žžžCCCÿ>ç­ÖS*ÿ³á ððð...ÒÒÒêêê èèè444ÿBBB®®®333ÍÍͽ½½¼ˆXÿDx¨bbbÿ888ÈÈÈÒÒÒÌÌÌ ÿ ea'ÉÍùÑÓüôôô;973ª°ÌÌÌbbbÿ888ÈÈÈÒÒÒÚÚÚTTTŠŠŠbbbÿ¬¬¬ŒŒŒšššÌÌÌCCCÿ½½½ÿ&&&ÌÌÌRRRÿ®®®Rÿ¤ÑòÍf„íO¾¾¾ðððñññäääèèè%#ÿ ;¯Fä8?ÑvvvÿÍÍͽ½½RRRÿÆÆÆöööòòòbbbÿžžžÿöõL^_JJJˆˆˆ...ÒÒÒâÐÏ'ÑòòòÿÌÌÌ444ÿÌÌÌvvvÿ666———½½½ÿööö&&&ÌÌÌvvvÿ ÞÝ€¬­ÿööö&&&xxxÝÜEwxbbbÿÒÒÒÚÚÚ&&&ÌÌÌCCCÿ A 1ÜÜíó" 15;<Ñ¡ íó"ôî¿ Aåß°ÌÌÌ€TSÿp87D¨ª¼XVS·¹ñññÌÌÌÿööö&&&ÌÌÌCCCÿñññžžž¼ˆXÿDx¨CCCÿñññžžžbbbÿZ&öhœÌñññžžžšššÿ©©©ñññ...¶¶¶èèèCCCÿyEDx¨šššÿŠŠŠ¾¾¾...888fff444ÿäääJJJžžž444ÿBBB666ÊÊÊìììžžž‰…Vÿ›ŸÎ/-ÑÓüôôô:::ÂÂÂea2ÊÌÒ­¯ØCCCÿñññžžžCCCÿñññžžžCCCÿ:æÎÕ)AžžžCCCÿ888ÈÈÈ888fffvvvÿìììáááWWWÜÜÜ®®®]/­ÖCCCÿ333®®®ÕÕÕ‚‚‚ÜÜÜŠŠŠS*ÿ­Öÿ ...ìììáááñññ333ŠŠŠvvvÿìììááá333666ÊÊÊŠŠŠOU„ÿKEÜÜÜ$$$ŠŠŠWWWTTT%#ÿ.. §pVÕI:$­¯Ø444ÿÌÌÌ444ÿÌÌÌbbbÿ888ÈÈȶ¶¶+++½½½bbbÿžžž444ÿäääJJJžžžCCCÿÕÕÕ...žžžRÿÒÿúÔä=VÂÂÂRRRìììÒÒÒÌÌ̉…Vÿœž²ÛÝøò‰'ÿwÙCCCÿ½½½RRRÿHHHÈÈÈÍÍͽ½½ÿöõèèèbbbÿJJJ‘^\%XZ¶¶¶þìëø òòò444ÿÌÌÌÿJJJÒÒÒÌÌÌCCCÿ½½½CCCÿñññžžž‰…VÿÊÌÒ­¯ØCCCÿññññïÆ64.w{ª444ÿðððÕÕÕ...žžž444ÿ!Pôî¿ A 1óÏþåß°ÌÌÌ444ÿÌÌÌ444ÿL 53Ú®ÌÌÌCCCÿñññÌÌÌvvvÿìììáááñññBBBŠŠŠ444ÿiiiDx¨444ÿiiižžžDx¨iiifff"î¾½½½äää¶¶¶ÒÒÒ+++½½½Dx¨fff½»êêêÕÕÕ¬¬¬¢¢¢žžž½»‚‚‚:::JJJCCCÿxxxìììÊÊÊ666444ÿÊÌÒ/-­¯ØôôôJJJÆÆÆÂ¬¬¬¬¬¬RRRˆˆˆ«¯Þw{ª­¯Ø444ÿiii444ÿiii444ÿiii:- 888ÈÈÈ888ÜÜÜbbbÿ$$$ÜÜÜ$$$RRR­ÖWWWìììiii^^^~~~666CCCÿ...$$$ììììììvvvÿšššÿ444ÿ$$$áááîîî666vvvÿÒÒÌÜÜܾ¾¾ÈÈÈôôô©©©£©ØåôüÒÒàÃöéü·ÆÜŠ„/ÿÌÌÌÌÌÌòî°ÈÈȬ¬¬öööžžž+++:::JJJ444ÿiii+++äää®êúÔä³ÛôžžžYí666vvvÿÊÌÒ\/wÙ½½½ZZZ<<<ìììWWWbbbÿ ø èèèááá¶¶¶¶¶¶Ñ ø 444ÿ...èèèÒÒÒ¢¢¢½½½444ÿiiiw{ª­¯Ø444ÿiii64.w{ªÌÌÌ...ÌÌÌiii+++äääôî¿ A 1ÜÜÜÜôî¿ôî¿ÌÌÌ444ÿðððL €¬­ËúÍÌÌÌñññÌÌÌ444ÿRRRÿìììáááìììCCCÿBBBHHHÜÜÜ444ÿBBBHHHÜÜÜ444ÿBBBHHHÜÜÜ444ÿDx¨+++‚‚‚fffJ©«TTT+++555‚‚‚...J©«ñññÈÈÈZZZÊÊÊbbbÿñññ¶¶¶ááá666...­¯Ø­¯Ø^^^JJJ”””ˆˆˆTTTTTTxxx444ÿBBBHHHÜÜÜ444ÿBBBHHHÜÜÜ444ÿBBBCkHHHÜÜÜ444ÿCCCÿWWWááá666888bbbÿÈÈÈÂÂÂìììM% ÿCCCÿÜÜÜáááÊÊÊììì îîîWWW­Ö­ÖJJJììììììÜÜÜšššÿ444ÿBBBÈÈÈìììÜÜÜîîî666ysJììì ááᱫ|öéüea'v|ÑöéüÌÌ̬°îááá555 888bbbÿ444ÿâââñññÊÊÊbbbÿBBB¶¶¶333öööÜÜÜ444ÿRÿ})ÿ/ƒ›666ÊÊÊììì.î®êRRRÿ$$$ÜÜÜ888èèèÒÒÒÒÒÒ ¬¬¬êêêòòòäääÖÖÖ...½î p\ IDAT½½BBBHHHÜÜÜ444ÿBBB «©HHHÜÜÜ«¯ÞžžžBBB¶¶¶333öööÜÜÜ444ÿôî¿ôî¿ú$$ÜÜíó" AÌÌÌ´àá€TSÿÌÌÌÌÌÌ$$$333...ÒÒÒ333vvvÿ$$$ÊÊÊ$$$ÜÜÜ$$$CCCÿvvvÿ$$$ÊÊÊ$$$ÜÜÜ$$$CCCÿvvvÿ$$$ÊÊÊ$$$ÜÜÜ$$$CCCÿCCCÿÈÈÈCCCÿÿbbbÿ888333888bbbÿÿCCCÿšššÿ333ááá¶¶¶$$$888CCCÿÿÿCCCÿxxxìììJJJbbbÿÿÿFâ§¥|xxxxxxJJJìì숈ˆˆˆˆÌÌÌvvvÿ$$$ÊÊÊ$$$ÜÜÜ$$$CCCÿvvvÿ$$$ÊÊÊ$$$ÜÜÜ$$$CCCÿvvvÿ$$$ÊÊÊ95ÜÜÜ$$$})ÿvvvÿÈÈÈÈÈÈÜÜÜ<<<888ÿ888ÈÈÈîîî666)QjCCCÿWWWììì>>>ÜÜÜCCCÿžžžñÈñÈ Ý´ììììì좢¢ñÈ(ù{åç¹ÿÌÌÌ$$$áááìììÈÈȶ¶¶vvvÿfffáááÂÂÂÞä íó"ÿÿÿŠ„/ÿv|ÑSQ(ÿv|ÑWWW+++~~~888ÿCCCÿfffBBBááá$$$888CCCÿvvvÿìììÒÒÒ $$$CCCÿ®ê 5Rÿ§ûÑ}eÊÊÊìììÂÂÂìììvvvÿ®ê$$$***ÜÜÜÈÈÈvvvÿòòòCCCÿäää òòòÿ...JJJèèè¶¶¶tttvvvÿ$$$ÊÊÊ$$$ÜÜÜ$$$CCCÿvvvÿEÆÓÓdÜÜÜ$$$CCCÿvvvÿìììÒÒÒ $$$CCCÿñññ Aôî¿ AóÏþóÏþú$$åß°ôî¿ñññåß°ÌÌÌ€¬­ÌÌÌ´àávvvÿ$$$ìììÜÜÜáááCCCÿÿ666ìììðððZZZÊÊʽ½½ÿ666ìììðððZZZÊÊʽ½½ÿ666ìììðððZZZÊÊʽ½½ÿJJJ888ÈÈÈÈÈÈ888CCCÿ½½½ÿööö¬¬¬%%%ÈÈȶ¶¶ÿöööËËËWWW$$$ÈÈÈCCCÿ½½½ÿööö333ÊÊÊJJJ¶¶¶ÊÊÊ666ñȤp@\Àÿèèèÿqm>—Éл½æbbb?þU`J<<5SWäÿèèèÿ666ìììðððZZZÊÊʽ½½ÿ666ìììðððZZZÊÊʽ½½ÿG¬ïЉ„îchþððÜ­¨¸\ ×ïvvvÿ$$$$$$ÈÈÈáááìììÊÊÊÊÊÊ666bbbÿ¶¶¶èèèÿèèèÿööövvvÿìììÿèèèÿ333ÜÜÜËËË333áááìììììì333WWWÿ~~~èèè;5.ÅËÒÂÂÂôôô»äp71;5.³á ÌÌÌM% ÿ"î¾çÝÒ#L¬¬¬ËËËhhhŠŠŠÿJJJááá333˜˜˜ÉñÈ èèèÿÿ 73ÅÇÿèèèCCCÿÈÈȺ¶xŠ„ÿŽ”ûèèèÿöööËËËWWW$$$ÈÈÈCCCÿ½½½ÿ666ˆˆˆBBB¢¢¢ÜÜÜZZZÊÊʽ½½ÿ+¾÷ööøøD‘˜˜ǯ)ðÿèèèìììÄÄÄ<<<<<<ÜÜÜðððvvvÿ$$$fffÿ%òðÕÕÕèèèÿJJJÿJJJÖÖÖÿ666ìììðððZZZÊÊʽ½½ÿ@áßÅÞÝ:--¬ ðÜÜZZZÊÊʽ½½ÿ666ˆˆˆBBB¢¢¢ÜÜÜZZZÊÊʽ½½ñññåß° ôî¿ A 1ÜÜôîáññññññÿèèèÿÌÌÌÿ¢¢¢+++ âÉö7333ìììׯ– ÿèèèÿööö&&&...JJJÊÊÊìììááá½½½ÿööö&&&...JJJÊÊÊìììááá½½½ÿööö&&&...JJJÊÊÊìììááá½½½ÿöööTTT888©©©WWW~~~èèèÿööö èèèÿööö +++½½½ÿööösE»ä&&&BBB¾¾¾äääèèèÿööö·³}ÄÄËÊÌÒ»½æECi70—ÉÐÅÇðööö&&&...JJJÊÊÊìììááá½½½ÿööö&&&...JJJÊÊÊìììááá½½½ÿööö&&&‰Rî=; ÃÅó=; ƒhâ›ïèèèÿþìëø 555WWWÈÈÈéª§Í ööö=þû+jm®®®RRR¢¢¢èèèÿööösEp71…옘˜ öööhhhÍÍÍ>ç—ÅîèèèñŠ[ÿËþýÅËÒ»ä ööö®zJ<;5ùÇÎ'޽èèèÿ5 ô4.ÌÒâËó ööö 5 ô4.—ÅîèèèÿJJJÍÍÍÕÕÕèèèÿ;973„Šß|v!„Šß èèèÿöööú/- º¾ü èèèÿööö +++½½½ÿööö&&&...ÒÒÒÚÚÚ&&&BBBìììááá½½½ÿÕB gøÈø…çä{8Mß èèèÿJJJ$$$<<<ÄÄÄÈÈÈÂÂÂêêê ööööõööö555ËËË èèèÿöööTTT¬¬¬TTTJJJbbb ööö&&&...JJJÊÊÊìììááá½½½ÿööö&&&L ;55ñ#$ÊÊÊìììááá½½½ÿööö&&&...ÒÒÒÚÚÚ&&&BBBìììááá½½½444ÿ!Pôî¿ A 1ç½½ Aåß°ñññÌÌÌÿèèèÿèèèÿöööTTT骧Ã=þûVYáááÕÕÕèèèÿööö èèèÿööö èèèÿööö èèèÿööö èèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿööö èèèÿööö èèèÿèèèÿèèèS*ÿ;5.‘´Ëó i;;5.Dx¨444ÿÄYùÇÎ92‰­ÖÿöööêµùÇÎ92ùÇÎv¥ÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèíZ!ÿ!´í èèèÿJJJ888¸¸¸ÆÆÆööö èèèÿööö èèèÿèèèÿèèè\ý¿f IDATÿööö èèèÿööö èèè€ÿÿööö èèè444ÿñññññññññÌÌÌÿ+++½½½ÿ+++½½½!ÿßûüÿòòòÿòòòÿèèè444ÿññññññìóå ñññÌÌÌM% ÿM% ÿÿÿÿSQ(ÿSQ(ÿ‰…Vÿÿÿÿÿÿÿÿ0ÿÿ{ÿ})ÿ!ÿËU.!ÿK ÿM% ÿK ÿCCCÿ444ÿÿÿ?þÿÿèèèÿÿ2 ÿ ÿÿÿÿÿÿ #ÿ= ÿÿñññìóØþÉç ØìóìóñññÿÿÿM% ÿ4.4.ÿ?þsEÿÿÿ€TSÿ¼ˆXÿ¼ˆXÿ€TSÿÿÿÿδÜ.Ä ¶444ÿÿÿ÷ö÷öÿööööööÿÿ"úøsE})ÿ*})ÿS*ÿS*ÿ¼ˆXÿÿ, •ùø, CCCÿM% ÿ¼ˆXÿøÃÿM% ÿ444ÿM% ÿ6G!4.ÿÿÿËËËäää?þ?þ?þÿ?þMuŽ?þòòòÿÿÿòòòèèèÿÿÿ ÿ2 ÿõåûöéüÿ&&&{,Rÿ{,RÿÿÿS*ÿ¼ˆXÿ¼ˆXÿÿžžžSQ(ÿ‰…VÿÿöööãþÛÿìó#ôÝ äóÍóÍûòå#ôÝ ä#ôÿ¤#F{wHÿp71p71èèè¤eOp71ÿsE€¬­˜ÄÅÿ , 2,xœäää&&&ÿèèè, `N& DDDèèèÞ¤eOp71S*ÿM% ÿÿþëþÐüû;5.ƒ×ïM% ÿ;5.M% ÿ&&&=VÌÒâMuŽÄÅ˼ˆXÿS*ÿS*ÿ4.äääÁé;5.ÿÿÿÿÿööö4.¤eO4. CCCÿÿþçý³‹rÁésES*ÿöööÿèèèòòòÿööööBCCÿÿ2 ÿ*õåûöéü ÿ2 ÿ2 ÿ&&&ôK)Qÿ•Ý<*Üâ©K)Qÿ íìÿ¼ˆXÿS*ÿ2,—ÉБžÍM% ÿ øÅ IDATèèèTTTÿÊÌÒèèèòòòîëîëi-5Ý äíÔýÝ äÝ äÝ äèèè¡ ÔÊÌÒqm>ÿþçýÉÏ„³ÿÿ\›±„³ÿÿÿöööã|Mwpcÿÿ¼ˆXÿÿÿÿÿÿÄÌû‘žÍöööÿÿ öööÁéøÎÔIMƒöööäää ÿÔàø»äÿÿöööòö DDDÛÿÿÿöõ\›±„³ÿ­Ö4.M% ÿÿöööÐøúR†¶K ÿM% ÿ4.­ÖS*ÿ‘´4.äääÒÒÒç(©©©4.‘´¼ˆXÿ¼ˆXÿ<;5wpcÌÒâÌÒâŸ>ÌÒâR†¶Áéöööööö®zJM% ÿÿ555»äÉÏ»äöööÕÕÕCCCÿÿ?þsEÃÁé—Åî;5.ÿÿÿoÿÿÿÿ)+èèèÿúñýûöþ ÿ ÿ ÿ÷ õåû,PÖãÐÿÿÃå½MßÄÖ$½•ÿåÔK)QÿÿöööS*ÿÍýþ;5.Ä¡Ï64.4-ÿááábbbÿÿÿ_Ìîÿÿÿ¼¼¼ ñññìóAî¿çëêóÍØþÉ>5.>5.Ý äÿÒÒ໽æ“ÂÿÿöööûäÿÁé&&&ÿÿ÷ÿô\›±K&&&ÿÿ444ÿøÃÿÿööö 2ÿÿÿÿÅËÒÿÿ?þ?þööö¼ˆXÿS*ÿÿ &&&Žº»Áèé &&&ÿööö »ä öööÿí ÿúÒÒÒá½½ÿÿôôÁéÿ»ä4.&&&ÃÁéé(+4.­Ö;5.ÅËÒ³Ûô­Ööööäääññññññ­Ö³ÛôÅËÒ‰³Ûô³ÛôaÂê Áé öööÅËÒ4.ÿááá»äsE¤p@ËËËÿ4.»ä ‘´S*ÿÿÿ?òòò‘åýòòòÿÿÿÿöööÿ444ÿÿ òý3×Õÿá½½èèè2 ÿúñýõåû ÷ * ü öûöþÉ•ì·ÆÜÿ"úøø mD¹âW¸à0-µ×¯ðîÿÿ2,øÎÔ‘žÍyš7=;ÌÓûob3ÿËËËTTTnööö_Ìîfû{wHÿòö  èèèìóûòåÂËÒíÔýÿóÍûòåÂËÒå SQ(ÿ444ÿéë&&&ÿÿi;—Åîööö&&&äääèèèÿsE­Öÿ&&&ÚÚÚ&&&ÌÌÌÿü öûöþ  &&&ÚÚÚ&&&ÚÚÚòòòÿööö?þ³Ûôÿn’äæòòòÿööösE»äòòòÿ èèèÿööö ÚÚÚ ÌÌÌÿ ööö ööö ööö&&&ÚÚÚòòòÿ&&&ÚÚÚòòòÿúàþë&&&ÚÚÚòòòÿ"úøÝúü ÌÌÌÿ ÚÚÚ&&&ÌÌÌÿ êêêòòòÿööö öööòòòÿËËËêêê®zJ<;5‰­Öÿ®zJR†¶ ööösEÌÒâ³Ûôÿööö èèèÿèèèÿòòòÿöööòòòÿ?Áèéòòò444ÿäääööö ì8 è¾ èèèÿ )ôúñýõåûûöþ4 ïÖø êêêEC­¯Øÿ/üúѤ#FróÐW.7fçÄèèè!ÿßûü!ÿßûü!ÿßûüÿòòò‰…Vÿ3 8öÈüDx¨‰…VÿøÎÔÌÓûyš7öÈüDx¨ÿ&&&ÚÚÚòòòSQ(ÿ64.w{ª²ÿú–Ð~| [.w{ªÿòö  ÷òòò444ÿÙïðëêÿëêÿëêÿëêA#ôÝ äà±Ùbbbÿe]׌’ï­¯Øÿ555áááêêê&&&ÚÚÚ&&&IõÝ:- IªåS*ÿ—Åîöööêêêêêê&&&ÚÚÚ öööòòòÿsE»äêêêòòòÿi;p71v¥ÿü öûöþ  êêê ööö èèèÿsE­ÖS*ÿ­ÖÿrFEŽº»òòòÿ&&&äääèèèÿööö ööö öööòòòÿöööêêê èèèÿêêê èèèÿòøKµøþëêêê 99%®®®ÿÿôô ø ?þ×ÿñññÌÌÌÿöööðððêêêòòòÿ555½½½ÿ èèèÿ˜d4ÅËÒ»ä ¤p@R†¶òòòÿööö?þ4.»äÿôô ööö]/­Öÿ èèèÿòòòÿ?ÁèésE£Ñúêêêòòòÿ0,îÿ­{zS…†òòò444ÿÚÚÚ öööòøëöB è¾òòòÿ÷èïÖøûöþ%ùÜ/-»½æ èèè= ÿóþþÞêêê=C0…Ô®ÿ íìí ÷ö÷Ò$Ùð öööòòòS*ÿÑÿ(ùº·³ÚÛ¼ˆXÿÅËÒ;5.©D$ IDATÅËÒ­ÖÿTTTJJJxxxêêê ”””TTTÿEC­¯ØM&%ÿþæäÚÿ.. ­¯Øÿúîë öööDDD$$$ªÙ±å ìóûòåòâëê 3þòâëê&&&ìóà±ÙbbbÿñïÆ73ÉÍù­¯Øÿ êêêêêê èèèÿêêê èèèÿêêêòòòÿü ö÷ êêêòòòÿòö  ÷ ööö ÙrCv¥ÿ?Áèéòòòÿööö&&&ÚÚÚôôôöööòòò€TSÿÍÒÒÁèé èè艅VÿøÎÔ»ä ööösEÒþþ­¯Øÿêêê 5 ô³Ûôÿúàþþô ÷ äääöööòòòÿÿôô#Þêêê&&&äääèèèÿ öööòòòÿ?þËó ½½½ÿ öööòòòÿsE;5.<;5‰»ä öööòòòÿsE—Åîööö ÚÚÚ)è4.­Öÿ?þËó èèèÿ?ÁèésE­ÖÿòòòÿèèèTPÿº¾üúéëòòòÿ ööö èèèÿTTT --×Õÿ è¾òòòÿ$ûõåû÷ ü ö õåûI:$ÅÇðöööòòòÿ"úøæüýø mD©øÒêêê ööömD…Ô®!ÿõÿÿø ÷öí öööòòòS*ÿ­ÖS*ÿÌÓû³ÚÛÿêêêêêêTTTžžžÿ èèèM&%ÿ³ÚÛÿ/üúãþîë&&&¼¼¼Ý äûòåûòåóÍÿèå ÌÌÌbbbÿÂÂÂ/-tn9AÇŠ„/ÿÉÍù­¯Øÿ öööêêêòòòÿ&&&ôôô ööö&&&ôôô ÿü öûöþ&&&ôôô ÿòö  '޽ÿ Áèé €TSÿÿöööäää êêêöööÿÁèé h<;¤p@‰…Vÿw{ª2,&&& 2,64.&&&ôôô öööS*ÿàþ  ÷öööÚÚÚöööòòò &&&ôôô ÚÚÚööö 555&&&ÿÿsE4.öööMöñññÿÿ ööööööÿ—Åî\ÀÄÅË£Ñú òòò öööäää&&&êêê³Ûô­ÖRÿÿsD?þÁéÁéèèèòòò³ÚÛ—ÅîòòòòòòÿöööÿŠ„ÿº¾ü éëFBÿ ööö555öööÿ¶¶¶ˆˆˆÜç×Õÿ è¾ ÷ õåûõåûI:$·ÆÜèèèòòò ÿöõø =Côôô öööòòòòòò…Ô® ø í ööö¼ˆXÿÒþþ­Ö+M&%ÿ&&&ôôô êêêòòòòòòžžž :::³ÚÛãþàüôÚÚÚ¼¼¼ñññòâÿè444ÿÂÂÂÒÒÒ73Œ’ïv|Ñ­¯Øo5 ôôôô ÿäääööö&&&ÿäääööö&&&ÿûöþ äääööö&&&ÿÿòö ûåôôôööööööèèè€TSÿ öööööööööŽº»öööööööööŽº» ööö Žº»Dx¨w{ªw{ª öööòòòòòòÚÚÚ“Âw{ªäääööö&&&Áé­Öòø àþòö òö ÿæüýäääööö&&&öõÿ äääöööÕÕÕ555öööÿ;5.öööòòòMöööö +++òòòòòòòòò ÿÿ hœÌöööòòòòòò£Ñú ööö®êi:þÌÓöÁé?þK ÿRÿÿÿ èèèÿ òòòêêêòòòòòò;9„ŠñöööÐÔTPÿTPÿÿ 5 ÕÕÕ555£qp»‰ˆÿÿöBèó)bbbÍ è¾ÿèèè õåû÷ ÷ »½æöéüèèèòòòæüýÃå½ìÆööö&&&ÿí í öõ÷öM&%ÿÅËÒ­¯Ø<_1äääööö&&&ÿÿ öööÆÆÆRRRÿ|*(ÿÿîëêêê#ô,#ô#ôÌÌÌðððððð­¯ØŠ„/ÿÐüûÁéäääööö&&&öööÿ ööööööäää&&&öööÿ ööööööäääöööÿ ûöþööööööäää÷ÿôöööÿÿööö €¬­ööö ÿ&&& ÿòòòòòòòòòÚÚÚôôôòòòòòòèèè ööööööäääÿ + ÷öööòö ÿÿôô÷þÿööööööäääðîÿäääèèèòòòèèèäääñññöööòòò‘´ÌÒâ­Öòòòÿ +++½½½òòòÿöööööö sE¤p@¤p@òòò]/áááäääòòò¼øÁé Áéµô÷®êÿÿ òòòÿòòòèèè­¯Øòòò ôôô¬°î¬°îööö ööönccööö ËËËS…†Ewxÿ)+ × òý3èèè ;9 ÿ ööööööäääÿ÷öø  ÷öòòòSQ(ÿÿçÅÇðS*ÿ‡üà IDAT ööööööäääÿÿÚÚÚú;9®®®„ÖØ/üú ÷êêêôôôôôô#ôûòå,Ý äÌÌÌ/-v|ÑÉÍùÁé ööööööäääÿöööäääöööÿÿööööööÿÿûöþ  ÷ÿôööö  ÷ÿôöööÿöööûåööö?þöööÿÿ äää&&&ÿÿÿ?ööööööÚÚÚ?ÿÿÿÿööööööÿÿàþÕúþ  ÷öööÿÿ æüý öööø æüýÿèèèòòòèèèèèè555òòòÿÿþçý ÿÌÒâ0ÿ ½½½CCCÿ?þ˜d4;5.<;5Dx¨CCCÿÿ>çôôôôôôôôô5 ôÿ +++öööòòòèèèöööòòòòòòÿ èèèòòòööööööS…†ööö&&&ÿ×ÕÿöööööööBÿèèèêêê÷ÿôÑÓü ÷ÿôÿø ööööööÿÿêêêöööí ø»á4.­ÖèèèÄ ¶;5.ÿööööööÿÿ ú.. »½æÑööööööôôôñññÝ ä#ôÿíÔýûòåå #ôñññå ÌÌÌ­¯Øáã ÿ&&&öööÿÿ ?þöööÿ ?þ=þûöööÿ÷ÿô  ÷ÿô  ú=þû  öööÿÿòö  ÷ûå4.®zJ?þÿÿööööööòòò 5 ô íì öööíÑÐ?þ ÿÿsE4-rFE ööö?4-sEÿÿ öööÿÿÿööö qm>ÅÁ‹ÿÿÿ ú=þûöööÿòö ëàüôàþòö =þû ÷òö öööÿø ?þ=þûø þìëÿØÕâÐÏÿÿÿÿÿâÐÏÉÆÿÿÿÿöööÿ5 ôþçýööööööÿããú ÿS*ÿáªGÿÿÿÿÿyE4.sE?þ ôôôááá<;5¼ˆXÿCCCÿ½½½ÿööö£ÑúöööööööööêêêM% ÿÿÿÿÿ?þ3ôñöööÉÆ?þÿÿÿÿÿÿÿÿÿÿÿÿÿFBÿÿFBŠ„ÿÿ ÷öêêêíÑÐ?þöööÿööööB è¾)+ ÿöéü÷ÿôôôôôôôôôô÷ÿô ÿÿø ;B=CöööÿÿK ÿÿí ôôô ÿM% ÿ6G!—Åîÿÿÿÿ<`J‘´ÿ öööÿK ÿ{ÿ{ÿEC;9ÓѶÒÒàÿÿòòòTTT&&& ñññå ñññè(7å ÿäää öööäääöööÿÿöööú(Áéú&éËó èèèÿ=þûËó èèèÿ÷ÿô  =þûÚÿ(Ëó èèèÿöööòö  ÷ i;—Åîèèèÿööö öööòòòÿööö÷öí ÷ö÷èèèÿööö ööö èèèÿ­©sÄÄËÊÌÒ»½æECi70—ÉÐÅÇðööö=þûÚÿ(Ëó èèèÿòö  þô ÷ú(Ëó èèèÿ=þûËó èèèÿþìëø öõ5Í ööö=þûà 5 ô³Ûôÿi;;5.ÅËÒ»äsE;5.ÅËÒ­ÖÿsE;5.ÅËÒ»ä ööö555ñññˆT$x¬ÜˆT$R†¶ ööösE»ä 5 ô³Ûôÿ=þûà èèèÿ èèèÿèèèÿöööú/- º¾ü èèèÿööö÷ö, ÁéòòòÿCCá½½ ì8)+á½½ èèèÿööö ööö ööö èèèÿ=C0ìÆèèèÿööö ööö èèèÿöööEC.»ä ööösE2,3\ÀèèèÿDDDJJJlllèèèÿ3ôñE64.‡³Ã ööö èèèÿööö èèè444ÿìóå ìó#ôÊàá,å ñññÌÌÌÿèèèÿ 5 ôj1ÆÓö:- aÂýèèèÿööö?þËó èèèÿööö?þËó èèèÿööö èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿöööúóõèèèÿööö èèèÿööö?þËó èèèÿèèèÿèèèÿi;;5.ÅËÒ—Åîööö èèèÿöööáááêêêòòòÿòòòÿèèèÿ5 ô4.—Åîèèèÿèèèÿèèèÿööö èèèÿèèèÿ èèèÿèèèÿèèèÿööömDìÆc:ìÆèèèÿööö èèèÿööö å:óø IDATèèèÿöööžžžlllèèèÿ€ÿèèèÿèèè444ÿìóå Ùïð'ñññÌÌÌÿöööo›ïŸ>aÂýeù›ïèèèRÿÌÓö³Ûô!ÿßûüK ÿþçýÙýáà, Ôàøßûü ÿ ë$ûëÎ÷ÿòòòM% ÿ4- ®êRÿ®ê!Oÿß±ò444ÿññññññìóå ñññÌÌÌM% ÿM% ÿ·Vÿ³/ÿúÁ/ÿúÁ/ÿÿÿSQ(ÿ‰…Vÿ‰…VÿÿRÿÌÓöËó ÿÿêêêÿšššÿM% ÿM% ÿ{ÿ})ÿÿ!ÿËU.!ÿM% ÿ6G!4.ýáà)èýáà`N&4.ßûü ÿ ÿ#ÿ ë®zJsEùÜA ÿA ÿ!ÿÿòòò%#ÿÖÖÖÿ¬¬¬ÿM% ÿM% ÿpa®êÌÓö|*(ÿê5ÿZÅ!OÿÿRÿbbbÿbbbÿÿÿÿñññó*ÝêìóìóñññM% ÿ})ÿM% ÿM% ÿ4.ocL·VÿÊý YAúÁ/ÿ‡’ûÂÇ)M% ÿèèè!ÿ€TSÿ¼ˆXÿ¼ˆXÿ€TSÿ2 ÿ ÿÿýñúÔäøÎÔÄ ¶8”àóÈ ýèèè!ÿÿ?þsEM% ÿRÿêêêÿc<;¸¸¸M% ÿM% ÿ4.ocLÿ})ÿ*})ÿ ÿýñ, •ùø, TPÿÿÈ ý;5.é×ÿ ;5.²qT $ûsE 3þ¡GL!ÿ!ÿÿsEM% ÿÿRÿÿ%#ÿRÿÖÖÖÿ.Pz¥¥M% ÿ4.4.ÄÌôRÿþçý|*(ÿœîð7ð¦;ÿ0OÿŠ„ÿRÿ!ÿM% ÿrlÿÌÓöbbbÿ¶¶¶c_)RÿÿSQ(ÿ‰…Vÿÿ!ÿÿÛhhhÿMöìóå2Ý äb´b´å2#ô#ô0Oÿ†Ó4Ðüû})ÿÔàøM% ÿþçý;5.üÙü;5.M% ÿ!ÿ;5.M% ÿÔàø÷!ÿ¤ÐјÄÅ2 ÿ&9#ü öùÜ,2,xœ2 ÿßûü!ÿ4.³ÛôÌÓöRÿÿ°°°,-ÛÿÿÔàøM% ÿþçý;5.èèèK ÿÿþëþÐüû;5.ƒ×ï2 ÿ0P'ÿ MuŽÌÒâMuŽTPÿ2 ÿA ÿü öù܉ÄÚYª±ó] *æóঠçÅËÒ¼ˆXÿÅËÒùñýùñý”ßßšîâf<;5¼ˆXÿ ÿ`N&µÑÒocLRÿÿèèèÌÓö(—ÆM% ÿÖÖÖ)+4.ÌÓöʺó„ÖØèèè*ÚCÙr!‡Êr v|ãÿÌÓößûüK ÿ÷Îù5 ô¸0D IDATM% ÿÔàøžžžqm>ÕÙM% ÿ—ÆèèèÊÌÒM% ÿèèè÷!ÿ i-5ÌÓû>çêÝ äÊÆùÝ äÝ äÝ äÿ0OÿëòýxÉÎãø0Oÿ!ÿéw<&‰ÄÚ ëÎ÷ ÿw<&‰ÄÚ 8óÔàøßûü!ÿ, 4.ʹßÔàøßûü!ÿ*Í èèè!ÿßûüRÿ®êÿ5 ôØþü[1KÍÒÒ*íÑÓöÛÝø0P'ÿåââõåû õåû÷ sE¯ýýåââèÈñèèèTPÿ¶ÇòC½òøC³Ûô!ÿ*¹Gß´*Ê&ëÎ÷!ÿé \0"¤ÐÞ\/®êS*ÿʹßÍ þìë5þçý³Ûô0P'ÿõÓáåôü õåûw<&ÓýèÑÓö/- ÄÈèèèA ÿ ôãûïÖø÷ P$çÜåôãû Ù¢ïS*ÿÌÒâÁþú2ä4.;5.Dx¨M% ÿ½òø s0$ÌÒâ¸èö"]/ÌÒâ³ÛôÿsD®êM% ÿ×ÿ)è³Ûôÿòòòÿöööòý3ÍòòòS*ÿ<3øÄÍÌÒâ4- ®êM% ÿ4- <4 ކçµô÷ ÿ ÷ mD<*ÜjùàíÔøòÝúÿôôôôöööòòòM% ÿ³Ûô%#ÿ(þçýÚÿ\/ ³îßûübbbÿžžžTPÿùÕú×ÿ)èÁéòòòA ÿóÍECÈðäå¿ôM% ÿËó èèèÿööö&&&ÚÚÚòòò O'ÿå ìó-×þ4-¾0*èÛ½æÅ;íùñ#ôÝ äêÙ¢ï444ÿÌÌÌ444ÿñññÌÌÌÿ7÷ëòýúñý½úÐ5бñ`N&  &9#¼ˆXÿ  &9#ocLßûü¼ˆXÿô-ÔàøÌÒâã+›ƒT!ÿ`N&q|O3ôñÿÿ!ÿ`N&›ƒT!ÿÌÓöÿ ð+ÍѹÿçùÕú/- M&%ÿåââõåûöéüùÜ ‰ÄÚåââëÎ÷ëÎ÷ýñM% ÿÑÓö½òøCØþüM% ÿÿô-éÖùû!ý¸Ê&ÿ`N&C((ÌÓöM% ÿÙööö5ËøúÉß÷ÖùûËøú4.åââ÷ ñÿ ‰ÄÚÑÓöÛÝøýñS*ÿùÂ_ÿ2äã¹óïÖø*ã¹óÛ¿àã¹óôãû Ù¢ïÌÒâ4.ocL®eR®eRóÍ4.ÌÒâÅËÒM% ÿ4.ûöþüôþ„ºØ¸èöáéÞÌÒâ4.ÿ—ÆRÿK ÿ%#ÿÔàø].ò³ÛôM% ÿTPÿÿ­{z­{zÿì8ü öÍü ö&Pÿ<3øgž£ÑúÐÜã*¯ýù#ÿþçýÌÓöÄÌôÂöùRÿ  mDÙ$ÀW¸àZÝD"-!{,Rÿÿ0ÿæüýÞêêêöööòòòþçýþçýM% ÿüâüþçýÚÿ(ʺó`MÿRÿŠ„ÿc_)bbbÿÑÓö>>>ØþüTTTbbbÿ|*(ÿ âüú»½æ9‰…VÿÁéèèèýñü öÚÚÚü öÿå ìóÚ8ìîj/èÛ½ft ~™O%C,~™O%CêÝ ä Ö#‰…Vÿððð444ÿò?è444ÿ7÷åãúïÖøÐ5úñýïÖøëòý0Oÿbbbÿ;5.”ßßQ¼ˆXÿM% ÿÅËÒ”ßßñµÝÅËÒÅËÒô-þçýã+ñµÝÅËÒí ÅËÒÊ&ÿ¨IG¨IGÿí;5.K#È ý ð/- º¾üéþØþüÁþúùÕú*íÿ2 ÿ üôþü ö÷ ÚÇÝæÚÇÝS*ÿ³ÛôàêúCØþüÛÝø³ÛôS*ÿS*ÿM% ÿÿýñ&éØ(æýñÿ;5.ØþüÌÒâ4- 4.¼ˆXÿ³ÛôÌÒâ]/sEËøú ø ­ÖS*ÿS*ÿ8ó(òòòåôüñÿ ¶ÇòÛÝøÑÓö;5.ÃÆù½òø÷ ïÖø$û÷ óÍöéüå¿ôÙ¢ï­Ö4.;5.<;5<;5R†¶ëùÜóÍ?þÌÒâ­ÖS*ÿocL­Öûóþûöþüôþ"H |F(4.­Öÿ=þû)è3ôñ2óõÌÓöËó M% ÿŠ„ÿòòòDt?òòò)+ûöþü ö$ûî)+S*ÿ­Ö=; êÿâ +ëüôþÚÈõÞÔ÷?ÌÓö@# <4 {,Rÿ0P'ÿš·ÍÿümD¦#¼èÈñ0P'ÿ0P'ÿÐýÿ{,Rÿæüýø Áé˜è"µô÷µô÷Ôàø÷Öùû&éþçýËó µô÷ʺó5 ôÌÓöáï;?ubbbÿžžžàêú½òøëêØþüÛÝøžžžbbbÿÅÁ‹ÿžžž×'åôüFBÇñú§ËÑòòòÿõåûûöþü öhhh÷ ÿ~™Oh,ÄšŒôáÌÓOn2¹õft #ôìów{ªea2Ý äMtò?è444ÿ½ú8ó õåûåãúúñýõåûöéüå¿ô½úM% ÿëêbbbÿS*ÿS*ÿ!ÿÿÿ ÿS*ÿ¼ˆXÿS*ÿ¼ˆXÿÿúÁ/ÿ ÿ¼ˆXÿ¼ˆXÿM% ÿ!ÿÿúÁ/ÿ ÿÿ$$$ÿ¼ˆXÿ ÿ2 ÿ ÿ0P'ÿ0P'ÿ2 ÿ0P'ÿñŠ[ÿñŠ[ÿ2 ÿ¼ˆXÿ2 ÿ#ÿ0P'ÿ2 ÿS*ÿ¼ˆXÿ¼ˆXÿ%#ÿÿ$$$ÿ ÿÿÿ ÿÿ%#ÿ%#ÿ2 ÿ2 ÿÿÿÿÿ2 ÿ2 ÿ2 ÿÿS*ÿM% ÿÿÿ ÿRRRÿRRRÿK ÿ!ÿ2 ÿ!ÿ ÿÿ$$$ÿ0P'ÿ-QQÿRRRÿS*ÿS*ÿ!ÿÿÿ%#ÿS*ÿ¼ˆXÿM% ÿÿÿÿS*ÿS*ÿ¼ˆXÿ ÿÿÿS*ÿ¼ˆXÿS*ÿS*ÿ ÿ ÿÿ½†"ÿÿÿ¼ˆXÿ¼ˆXÿ ÿÿ ÿ ÿ ÿM% ÿM% ÿS*ÿ¼ˆXÿ ÿÿÿÿ#ÿ!'PÿRÿOU„ÿK ÿ%#ÿK ÿRÿÿM% ÿÿ2 ÿ O'ÿTPÿTPÿTPÿ»‰ˆÿ2 ÿ#ÿ0P'ÿ2 ÿ»‰ˆÿ-QQÿÿÿ ÿ#ÿ2 ÿÿ$$$ÿ-QQÿS*ÿRÿ ÿ ÿ ÿ ÿ#ÿK ÿ{,RÿK)Qÿ0P'ÿÿ ÿ#ÿ2 ÿ!Oÿÿ0ÿÿÿÿÿÿÿÿ#ÿÿÿÿÉ; IDATÿÿÿÿÿ ÿ|*(ÿ ÿ%#ÿÿSQ(ÿ2 ÿÿÿ ÿ444ÿÿÿÿÿ O'ÿ444ÿ'^ÿ'^ÿ'^ÿ'^ÿ?ƒTÿ O'ÿo½Yÿ@‚,ÿ'^ÿ'^ÿo½Yÿ?ƒTÿ444ÿ O'ÿ‚ö<ÿ5‚+ÿV¼3ÿ5‚+ÿ O'ÿ$$$ÿ444ÿÿM% ÿbbbÿÿÿÿK ÿ;5.­Ößûüú?þw;­ÖDx¨­ÖÅËÒúSdÝw;ÅËÒS*ÿ¼ˆXÿÅËÒøqÚ&9#5 ô ÿ õåû åââ0P'ÿ¼ˆXÿåââ?ÆÌ4™­¼ˆXÿ¼ˆXÿÅËÒæåââùÜ—ÅîÅËÒÿ[1K ôôô ü öøJ9 —eP>tSMSQ(ÿ ðsD?þsD§VOæèèè­Ö³Ûôú?þw;âââ®®®ÖùûìýþõåûÙ¼+ ')èаÙãã®®®;5.­Ößûü/üú=þû(­ÖDx¨¼ˆXÿ³Ûô ÿúúúS*ÿ;5.%#ÿw;?þsDS*ÿ;5.Dx¨­Ö­Ööéüü öM‘âúü öI…ªN¬   ûöþ¸èöS*ÿÅËÒ÷ÿô÷ÿôü öüôþ#ÿ0P'ÿìüÔ Õ:ÒÒÌK ÿÚÿ˜d*Ù—Æ5 ô³Ûôèèè? Üÿý¬°î¬°îDt?Dt?  ëùÜööö­Ö®ê   ûóþ÷êüåC…Ô®µ×¯аÙèèèûóþëùÜíÔøèèèÞ !÷ÿô÷ÿôøëòòò=þû=þû?þ÷öèèè!ÿ 3þ"B ×' éëòòò­¯Ø|*(ÿÿõåû  ÚÚÚ#ôìóùñΠÐíÔý±’ÎçÜåúñý¸¡¸ìóå ‰…Vÿ³ŒïëÍü,: ëÍü6m ^ÌÌÌ_ƒ-ÿ8þçý¨µ¢ü ö$û$û!Oÿ ÿµô÷ÅËÒÿ(4- ¤ÑòRÿÌÒâÿ(4- ¤ÑòRÿ­Ö­ÖDx¨­ÖÔàøóõùñýÈ ýôôôDx¨¼ˆXÿ ëÎ÷ðåââëÎ÷Œ81¼ˆXÿDx¨ñÿåââ -ñÿ\À¼ˆXÿÅËÒ­Ö5 ôùÜùÜ?þèèè­Ö¤p@\À¤ÐÑôôô ð/- ùÕú[1K­¯ØÊÌÒ%#ÿ\/ÌÓöØþüÌÓöRÿSQ(ÿ—ÉÐëÎ÷èèèÿ(4- ¤ÑòRÿÌÌÌìýþ&9#VÕ&9#ÑÔàøÌÌÌÅËÒÿÖùûþçýM% ÿDx¨ ÿJ9åôü/- %#ÿÌÒâDx¨Dx¨%#ÿ\/ÌÓöØþüÌÓöRÿ;5.ÿ<8ú J9 ÿ ûöþòòòòòòûöþ ½òøS*ÿM% ÿ­Ö­Ö ÿøH  C ÿ0P'ÿ ëñå#-)×ßÙ°K ÿÖùû\0"[‘æ)èèèèËó RÿŠ„ÿ¶ÇòõãâTPÿ»‰ˆÿ9õåûåââ9»‰ˆÿÓ¯¯ü ö÷ÿôøü öôôôÓ¯¯M% ÿM% ÿK ÿs/½¨5w;M% ÿK ÿûóþÖýRÿÿ"B"B"-!_ƒ-ÿöööêêêêêêø  ,øK ÿµô÷Ôàø*!ÿ!ÿ÷ëñå#- #$ÿSQ(ÿ­¯Øÿéëü öSQ(ÿ6óîhhh9,?ü ö÷ÿô÷ÿôÿñññùñå22`0bš54-úñýáÌÓw{ªÁ6m ³ŒïÎhñÿ² _ƒ-ÿÑÍúôÔý¿ ûXK^ææôãû8 ÿM% ÿ4- —Æ5 ô4- —ÆèèèM% ÿ4- —Æ5 ô4- —ÆèèèM% ÿØþüðñµÝô-ÕåËó èèè%#ÿåôü ÛÝøÿ èèèTPÿÑÓö(+¬°îÿ ð(ØþüÛÝøÿ<8úùÕú³Ûôÿèèèÿ5 ôØþüóõèèè%#ÿ\/®êM% ÿ4- —Æ5 ô4- —Æèèè%#ÿèßúý øÐù0ñµÝ÷èèè!ÿ*Í  íì*Í èèè ÿ ÛÝø ÿ /- ¬°îÿ5 ôØþüóõèèè%#ÿ\/®êTPÿÑÓöÛÝø ÿ /- 64 v|ã ÿûöþûóþ ÿ C³Ûô ÿ üâüäþ (³Ûô0P'ÿаÙ ÿ õåû&9#]±«|!ÿ, ÔàøßûüM% ÿ³Ûôÿi:þÌÓö³ÛôSQ(ÿ­¯Øÿì³!*cõ0,îÿü ö÷ òòòÿü ö ëü ö ùÜòòòM% ÿþçý4- ÌÓö4- <4 CzÞRÿ®ê0P'ÿ/3¡}Óÿ8/3¡}Óÿ èèèÿøë÷ÿô ÷ øòÝúM% ÿ³ÛôM% ÿþçýµô÷!ÿ÷)ôDB!¹•ë)ôDB!¹•ëèèè ÿ*å¿ô|*(ÿ„ÖØCCCÿáááêêêøë÷ÿô  òòò444ÿÝ äê%CáÌÓ>5.áÿÿáÌÓçÿ#ôñññÌÌÌ444ÿððð2˜Ê“ôb§ÁM½½½0P'ÿаÙCCCÿÇÔÁèèèÿ‚‚‚ÈÈÈžžžØþüèèèØþü5 ôØþüèèèØþü5 ô&éñÿÈ ý5 ô/- J9öéü/- %#ÿÿ=þû?3ôñ5 ÿùÕúÿËó ÿ ð(+ÛÝøèèèÑÓö+èèè3ôñóõèèèÛÝøÌÓöRÿØþü Øþü5 ô&é&9#øÐùåââô-5 ôèèèòþÿ3ôñ ÿJ9ÛÝøöéüåôüÑÓö3ôñóõèèèÛÝøÌÓöRÿ%#ÿ64 ÑÓöÛÝøöéüåôüÑÓöÊÌõŠ„ÿûöþûöþûóþûöþ½òø³Ûôø üâü "üâüØþüM% ÿñ×)*ùÜùÜ аÙ±«|÷ßûüËó Rÿèèè®ê³Ûô­¯Øø$ûVÕêÿ⬰îÿ?þ÷ ÷ FBÿ÷ÿôûöþùñýü öÿ³Ûô³Ûôµô÷4- <4 ³Ûô³Ûô®êÄÌô®ê0P'ÿ/3¡}ÓèèèаÙÑÍúÿ èèèòòòòÝúü ö 8 òòòòòòòÝúÿM% ÿ4- @sn IDAT³Ûô6F ÿßûüèèèèèèòâõ %#ÿ&9#å¿ôtbb½½½êêê÷ÿô ü ö#ôå2â̺èÛ½4-ÉÚ¼èÛ½çÿÝ äÌÌÌ^í‡Õý³Œï½½½444ÿаÙXK^èèè+++ÈÈÈžžžÿ\/¤Ñòóõ¤Ñò4- ÿ\/¤Ñòóõ¤Ñò4- M% ÿÔàøÖùûåââ*üâüåââØþüM% ÿÿ%#ÿ¬°îÑÓö/- ÿÿ5 ËòóþæäM&%ÿ ðØþüôôô ÑÓö<8úÿÿ+ÄÈÿÿóõÑÓöM% ÿÿÿÚÿþçýèèèÿØþüÌÓöÿ\/¤Ñòóõ¤Ñò4- %#ÿÖùûô- Óû8ó Óûÿÿþçý÷äûü ÿ ÑÓöåôü%#ÿÿåüýþçýèèèÿããú¯¶ð/- ÛÝøöéüÛÝøÑÓöÊÌõ%#ÿûöþ 2 ÿûóþûöþ!ÿ( ÜÜÜûóþÜÜÜ üâüÿßÙ°ø"-!M% ÿRÿi:þ×ÿÿM% ÿi:þ®ê#ÿ,!ò üôþ ðØþü úÑÓöTPÿùñý   üôþ ÿRÿÌÓöCzÞM% ÿ®êÿ/3¹•ë0P'ÿ/3òòòèèè ÿ òÝúß±ò!Oÿòòò 2ÌÓöRÿèèè0P'ÿ/3¡}Ó õôÑÍúR` öÚÇݬ¬¬ÿtvùñý   üôþ ÿñññÝ ä#ôå2èÛ½%CùñATå #ôñññå CCCÿË~Õ½½½ÿ² ÌÌÌCCCÿ½½½žžžžžžÿööö=þûÚÿóõöööú&éÍ èèèÿööö=þûÚÿóõöööú&éÍ èèèÿööö=þûÚÿóõöööú&éÍ èèèÿ5 ôÔàø÷ööö?þËó èèèÿööösEʹßÍ i;ÌÒâËó èèèÿ íì*Ã÷ö*³Ûôÿ®zJÄÌû˜ÄÅööö?ob3\Àèèèÿqm>‡³Ã ööö=þûÚÿ žƒSWèèèÿööö=þûÚÿóõöööú&éÍ èèè%#ÿ&éþçýÃ÷ö, 4- ¤Ñò(Ëó èèèÿööö=þûÍ ööö÷ö*Í èèèÿ3ôñËøúø þìë5Í èèèÿèèèÿööö=þûåüýÞ ööööõèèèèS*ÿxo5[޳¬°îÿööö ööö©H 2*Dx¨ÿööö÷ÿôH Ëó èèèÿíõê|F(­Öÿ ð(Ëó öööòòò%#ÿ(Áé èèèÿ3ôñÍ ööö=þûËó èèèM% ÿ×ÿôôô5 ôËó èèèÿýñæöööFB64 Ž”ûèèèÿ íì*Ã÷ö*³Ûôÿ=þûÚÿóõööö÷ÿôFÿÍ èèèRÿ—ÆèèèRÿ<4 CzÞÿ8Ù*ÙûÓôôôööö"BаÙ#ÿ õèèè ÿèèèÿ5 ô4- —Æèèèÿi:þ 2áï³Ûôÿ3ôñw$¹•ëèèèÿööö 3þ0ËýÍ èèèÿ)ô8ÅÇðööö¤Ê „ÖØÿü öööö÷ÿô]U`¶¶¶öööòòò444ÿñññíÚ4FáÌÓ#ôññññññÌÌÌÿ+++¶¶¶+++žžžÿööö=þûÁé=þûËó èèèÿööö=þûÁé=þûËó èèèÿööö=þûÁé=þûËó èèèÿööösE»äsE—Åîèèèÿööö èèèÿ5 ôËó íì÷èèèÿööö ööö èèèÿ­©sÄÄËÊÌÒ»½æECi70—ÉÐÅÇðööö=þûÁé=þûËó èèèÿ5 ô4- ʺóÃ=þû4- —Æööö=þûÁé=þûËó èèèÿþìëø öõ5Í èèèÿööö"úøÞöõèèèèÿi;;5.ÅËÒ»äsE;5.ÅËÒ­ÖÿööösEÌÒâ4.»äsE;5.ÅËÒ»ä ööö?þ4.»ä ööösEÌÒâËó èèèÿööö?þÁé èèèRÿÌÓöÁé?þ4- ÌÓöÁé èèèÿöööú/- º¾ü èèèÿ5 ôËó íì÷èèèÿööö=þûÁé=þûËó èèèÿi:þ<4 ÄÌô—ÆööösD¼øsD¼ø èèèÿööö=C0ÐýÿÃå½=C0ÐýÿÃå½ èèèÿööö öööòòòÿööö?þ4- ÌÓöÁé?þ4- ¼ø èèèÿööö=þûÁé=þûËó èèèÿöööEC64.…‰¸n×'ÅÇðèèèÿöööTTT¬¬¬&&&...¬¬¬òòò444ÿìóå íÚ"ô5Ý äB;ÒÒÒñññÌÌÌÿèèèÿööö ööö ööö èèèÿööö èèèÿööö èèèÿööö èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèM% ÿËó èèèÿööö=þûÍ èèèÿèèèÿèèèÿi;;5.ÅËÒ—Åîööö èèèS*ÿ—ÅîööösE;5.\Àèèèÿèèèÿööö èèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿööö ôôôööö èèèÿèèèÿèèèÿ39ÍïÇèèèÿööö èèèÿI²? IDATööö èèèÿööö èèèÿ€ÿööö èèèÿööö èèè444ÿìóå ñññÌÌÌÿèèèÿööö èèèbbbÿžžžbbbÿžžžbbbÿžžžbbbÿááá½½½šššÿ©©©ááá...ááá½½½Rÿq7wÙbbbÿÒÒÒÌÌÌbbbÿÒÒÒÌÌÌbbbÿžžž|*(ÿ„ÖØ!ÿßûüK ÿþçýµô÷ÿ JJJÂÂÂRRRìììžžž!ÿßûü444ÿðððÌÌÌbbbÿžžžíZ!ÿÐ-Cyγ/ÿMÑébbbÿžžž444ÿññññññ!Påß°ñññÌÌÌK ÿÙ)è³ÛôšššÿbbbÿJJJJJJšššÿbbbÿJJJJJJbbbÿJJJJJJšššÿÿbbbÿ888WWWCCCÿfffBBB“““ÿÿRÿq7 pRÿbbbÿ888888¢¢¢CCCÿbbbÿbbbÿ888888¢¢¢bbbÿJJJJJJ6óî!ÿËU.!ÿÿCCCÿ¬¬¬ÿbbbÿM% ÿ6G!4.bbbÿšššÿêêêÿbbbÿÿ®zJööö888>>>ìììJJJCCCÿÿÿ!ÿËU.!ÿ444ÿ444ÿððð444ÿÿbbbÿžžžêêêÿšššÿÿíZ!ÿÐ-gòÿÎ$·Vÿ{,Rÿ{,Rÿ888êêêÿêêêÿò‰'ÿúÁ/ÿ444ÿ444ÿbbbÿbbbÿ~W…ÿbbbÿÿñññ!P!P!Pñññµô÷'èå)è)è³Ûôbbbÿfffbbbÿ骧ܬܬfffbbbÿUô¹ܬܬ˜_ÍܬLábbbÿfffèèèÖÖÖÿ888溹"î¾WWWÿCCCÿvvvÿ888ׯ– Ý´wO6‚‚‚¾¾¾vvvÿ¼ˆXÿšššÿÂñ-Yƒâ‚Zó®êžžž©©©³Œ‹|||ÖÖÖÿ½½½žžžšššÿááá±ro"î¾***¡y`Õ§~Ê ¼ˆXÿbbbÿ, •ùø, ÿÿÿòòòbbbÿÿù7ÿbbbÿÕ§~888=V;5.bbbÿ¬¬¬ÿZ&öÈÈÈTTTsEsE–a+–a+Õ§~iiiCCCÿòòòöööÿ, ®@hUqrÌÌÌWWWðððÿèèèCCCÿžžžêêêÿ7=f“··ÿÿèèèò‰'ÿÐ-ò‰'ÿ­ÖÊýÿúdÿK)Qÿ•Ý<*ÜúÁ/ÿ±·°°°bbbÿ!ÿ...vvvÿøÈø444ÿ444ÿÌÌÌÿÿbbbÿ¶¶¶c_)444ÿSQ(ÿ‰…Vÿÿ~W…ÿä ݈ÔÎÿèèè!P Aôî¿ A A Aôî¿ôî¿ Aôî¿¢N 5šššÿžžžžžžÖÖÖÿVYÅËÒ¦Ú šššÿžžžÖÖÖÿ« GÅËÒ¦Ú šššÿÖÖÖÿÅËÒjŸÕšššÿžžžbbbÿbbbÿCCCÿCCCÿBBBvvvÿŠŠŠ<4~~~¤p@FBìììÜÜÜ888,2,xœ<<<   à<;5fffCCCÿËËËÌÒâWWW,-ÛÿÿbbbÿmmmXïÿù7ÿËËË6G!bbbÿšššÿCCCÿ²­4.;5.CCCÿšššÿ¶WUÿ„ÖØ¼ˆXÿÅËÒÒÒÒMuŽÌÒâ=Vžžži; 888JJJóðJJJUƒ¬¼”ÌÒâºî)Qj888 ª‚M&%ÿ¼ˆXÿ<;5ááá°°°$$$³á GpPPPwpcÕ§~iiisE‚‚‚=Vç¹×¯–êêêÿ¼ˆXÿ444ÿñññÈÈÈñññêêêòòòCCCÿáááCCCÿbbbÿ°°° *ÿöööòòòûÑúÄÌø™cûÑúúÁ/ÿóÃbbbÿé ãMßÄÖ$½•ÿšššÿ0ÈÈȈˆˆ!ÿßûüK ÿèèê#°Þ IDAT袢¢ò‰'ÿÁ¦ðËůFäÌÌÌèèè ÿÂÂÂqm>ÕÙ444ÿÌÌÌÿèèèÑþÿJJJÂv|ÿ ñññôî¿ AÕÏ  ABl>Bl> A Aôî¿ A`ƒÿšššÿ4«ãÔàø`Ëëêêêÿ`ƒÿbbbÿfffS*ÿ沂JJJJJJ<<<S*ÿ沂JJJJJJ<<<S*ÿ沂²ë}JJJ<<<bbbÿ888888šššÿCCCÿiiiCCCÿÖÖÖÿÍÍÍRRRÄÌû‘žÍ+++ÖÖÖÿCCCÿÍýþ3ñïÆìììÜÜÜúÔäøÎÔ¡×ÄÄÄׯ–ÊÌÒ‘ÂÉÿM% ÿ ö7ÖÖÖÿšššÿò‰'ÿ·Vÿ²ÔþTÅÿù7ÿ'޽½Êÿ1¸]ä ‡»ëÿù7ÿò‰'ÿÒÒÒç¹ÐøúÌÒâx¬Ü³‹räCE‘´...šššç(ÒÒÒ***;5.i;•} ªoFÝ{)#a« 4ááá=Vttt¼”2*³ÚÛS*ÿ<;5ÄÅËÈÈÈ$$$BBB¦Ú PPP°°°Ub‰Ub;5.¶¶¶S*ÿ;5.á8)QjÌÌÌ...ÒÒÒðððÚÚÚ vvvÿCCCÿ:æÎRRR½½½žžžšššÿêêêÿ})ÿ{ÿázu×ÕÿŠÊÚq©H íZ!ÿ”ù ¾Ý¥Û0ŒŒŒ·Vÿ^´95êêêÿÌÓûÊò‰'ÿ888...mD¹âW¸àá’¸nHÊð°°°bbbÿÿÖùûÕB ûÑú?Z pÅÍôíZ!ÿÿbbbÿšššÿÒÒÒ555>>>›ŸÎÈÈÈêêêÿ¬¬¬ÿ444ÿCCCÿbbbÿ¬¬¬ÿ)Ù#'Vêêêÿÿ vvvÿ]W(¶¶¶ÊÊÊêêêÿ èèè Aôî¿ÉÔåß°óÉþ A Aôî¿ Abbbÿ444ÿvvvÿ0OÿÐÌõUqr, )QjÐÌõþ!¸bbbÿšššÿCCCÿ;5.Dx¨ÊÊÊ+Y‚«}T¼ˆXÿCCCÿ;5.hœÌÊÊÊ+Y‚NNN;5.bbbÿ¼ˆXÿøÃÿDx¨ÊÊÊ+Y‚«}T¼ˆXÿ¿£¢ç¹"î¾!ÿbbbÿÈÈÈbbbÿšššÿñÈܬWWWCCCÿ***¤p@ ãâìììÃïðö“““    ãâÿ—ÉЭ¯Ø¬¬¬=Vá8888ÜÜܳÛô­¯ØÊÌÒqm>S*ÿááá‚‚‚MuŽ“““ÄÄÄç¹Éï;3 ç¸|},Æ~§!óð;È*bbbÿCCCÿ¼ˆXÿÅËÒŒí(Ÿ>GptØóðÊÿ1ÌÌÌÌÒâ>çø7:Éß÷íÑÐÓÁÀÿfff4.­Ö...xxx888ÅËÒá8bbbÿ¯3KõV‘º#…×ÝŸ¶¶¶888$$$–Ð÷ÄÅËÅËÒ âÉZ&ö³‹r$$$888xxxfff³Ûô­Ö4.‘´žžž;5.Dx¨ÈÈÈ888ttt°°°ÅËÒžžž...JJJ$$$>çCCCÿå9QÍÍÍvvvÿÿTPÿ444ÿ!ïîÝCCCÿ·VÿCCCÿšššÿÆ2)+ÆÓö pMÐ52Üí?áááÈÈÈľô¢Lüóð°°f òÅÍô±·ç6...mD7ffffff888*ÿí !ÿ444ÿ444ÿíZ!ÿ¦ßÆÕöûÈøûÄhIªåÆÕö444ÿ‹ø¿`'•JJJRRRˆˆˆÂ¶¶¶444ÿ...444ÿåááá¶¶¶0‚„Ÿ›l èèèbbbÿÍÍÍÊÊÊJJJtttYYYèèèñññôî¿ A!P(RRËÅÄ]W(ôî¿ A Aåß°ÒÒÒ¬¬¬ÿ444ÿS*ÿ444ÿxxxŠŠŠÖýбñÈÈÈMuŽttt°°°ÞÔ÷ÐÌõRÿžžžÈÈȇ»ëììì———ÊÊÊ­Ö¦Ú šššÿbbbÿ‡»ëôôôììì———ÊÊÊôôôDx¨888bbbÿbbbÿS*ÿ<;5=sììì———ÊÊÊ­ÖÅËÒøÃÿbbbÿ">?;5.Éåæ888žžžCCCÿTõ󽻚ššÿÖÖÖÿM% ÿÿÂÂÂÅËÒŠŠŠvvvÿÄÌû×þÿááá333   ×°¯3..ÿ+++ÊÌÒÅÇð Aà¥ÜÜÜAà¥64.bbbÿÌÒâ³ÛôÕÕÕ©©©ÈÈÈÄÄÄÈÈÈÌÒâS*ÿ0Oÿ¬ÿ;ÅÍô6~§!&ñãã333¼ˆXÿ‡»ë­ÖÕÕÕŒí(ÈÈÈãDpÙ;ÅËÒ¼ˆXÿ³ÛôÌÒâ>çkO', 7! 4.sEM% ÿS*ÿ­Ö¬¬¬JJJ¶¶¶á8ttttttbbbÿááá***ŒŒŒööö333ÜÜÜ ªo³ÚÛÅËÒùÂ_ÿS*ÿ­ÖÅËÒÌÒ⫞<;5«žç¹ÈÈȼǯ­Ö³ÛôS*ÿDx¨žžžìììÜÜÜŒŒŒ~~~;5.šššÿêêêÿÿ¬¬¬333TTT¬¬¬#혭ֽ½½žžž½½½ŠŠŠöööŠ„ÿÌÌ̼ŒÁ½½½})ÿIªå‡ý?PØÀ:- á)+ÆÕöúÁåÎ$­Ö½½½çNS­@yázu:+ ÌÓûľô0ÂÂÂ888nHNϬ…Ô®fffÿ÷öšššÿ444ÿÆûò‰'ÿMÑéÁ¦ðøÈø¹nèMÑé³/ÿ444ÿöööøÈøÂ¶¶¶666ÂÂÂTTTžžžbbbÿfffáááÌÌ̦âÚááá¶¶¶———ÊÌÒèèèbbbÿžžžÕÕÕìììÊÊʽ½½CCCÿCCCÿCCCÿCCBl>...ðð°ªtP&&>>> 1 Aôî¿ôî¿!PÌÌ̈ˆˆ¬¬¬ÿ...Dna‰SþTTTM% ÿ4- žžžìììÜÜÜŒŒŒ~~~òÝúÖýò‰'ÿÿù7ÿò‰'ÿ444ÿbbbÿÿ½†"ÿÿò‰'ÿÿù7ÿò‰'ÿ¼ˆXÿ¼ˆXÿS*ÿbbbÿCCCÿšššÿšššÿS*ÿ¼ˆXÿÿñŠ[ÿñŠ[ÿ444ÿbbbÿS*ÿbbbÿÿÿCCCÿCCCÿšššÿ¼ˆXÿÿ¼ˆXÿ€TSÿ$$$ÿ·Vÿò‰'ÿÿù7ÿ·Vÿÿ€TSÿM% ÿbbbÿšššÿò‰'ÿÿù7ÿÿù7ÿ·VÿCCCÿšššÿbbbÿÿšššÿCCCÿ·Vÿò‰'ÿÿù7ÿò‰'ÿvvvÿšššÿšššÿ$$$ÿÿRÿM% ÿM% ÿ$$$ÿÖÖÖÿbbbÿM% ÿò‰'ÿÿù7ÿò‰'ÿvvvÿšššÿÿÿÿM% ÿS*ÿM% ÿ¼ˆXÿS*ÿ444ÿÿÿ$$$ÿ$$$ÿS*ÿšššÿ¬¬¬ÿbbbÿ¬¬¬ÿò‰'ÿ¬¬¬ÿCCCÿ$$$ÿ³/ÿÿù7ÿò‰'ÿS*ÿ¼ˆXÿùÂ_ÿ¼ˆXÿM% ÿM% ÿS*ÿ¼ˆXÿS*ÿò‰'ÿÿù7ÿò‰'ÿêêêÿCCCÿ ÿúÁ/ÿÿšššÿbbbÿbbbÿšššÿšššÿbbbÿCCCÿêêêÿ½‡2ÿCCCÿÿbbbÿTPÿTPÿTPÿò‰'ÿ·Vÿÿÿ·Vÿÿù7ÿšššÿêêêÿšššÿ$$$ÿ$$$ÿbbbÿêêêÿ&Pÿêêêÿ³/ÿ{ÿ³/ÿCCCÿCCCÿšššÿšššÿM&%ÿò‰'ÿ{ÿK)Qÿ{,Rÿÿ$$$ÿÿÿÿÿÿ!ÿ{ÿ³/ÿÿ444ÿÿ444ÿò‰'ÿò‰v ð IDAT'ÿ·VÿíZ!ÿíZ!ÿò‰'ÿíZ!ÿúÁ/ÿÿù7ÿÿbbbÿšššÿbbbÿ$$$ÿíZ!ÿò‰'ÿ})ÿ‰…VÿÿCCCÿ$$$ÿ$$$ÿ²ÿCCCÿêêêÿÿbbbÿÿÿ¬¬¬ÿêêêÿ¬¬¬ÿOU„ÿCCCÿ\††ÿ\††ÿ‘ÁÂÿ\††ÿCCCÿvvvÿêêêÿvvvÿOU„ÿ\††ÿOU„ÿOU„ÿ444ÿOU„ÿ444ÿÿS*ÿS*ÿ½‡2ÿ444ÿCCCÿ444ÿM% ÿRÿíZ!ÿúÁ/ÿ³/ÿM% ÿRÿšššÿQº5;ýº#…ÌÌÌžžžšššÿ555w®”””šššÿQº5;ýº#…Dx¨Dx¨šššÿbbbÿ­Ö'ÅWWWXï­Ö¦Ú šššÿ¼ˆXÿJJJ3šÉqØfff¼ˆXÿžžžšššÿ—ÅîáááJJJŒŒŒ“““©©©ÅËÒ‚‚‚<4Œí(&ñci+¿ [ <4ocLÖÖÖÿB« ci+w}?ãDCCCÿ<<<¶¶¶èèèCCCÿÜÜܽ½½Œí(¨s›¡c¨sŠŠŠ©©©bbbÿbbbÿ<<<¼ø²Ô+Áé   ö7¨s›¡c¨sŠŠŠ©©©bbbÿM% ÿ=þûöõ=þû³Ûô»ä³ÛôÅËÒ­Öbbbÿ...555555)è>>>ááá¶¶¶º#…¶¶¶áááRRRù}•w}?º#…vvvÿêêêÿ­ÖÅËÒÃÆùûÎÖ³Ûô³Ûô³á B« 5;ýQº444ÿ°°°bbbÿ˜˜h¡3‚‚‚bbbÿ©©©ˆˆˆbbbÿšššÿRÿë곋r³‹ržžžÿCCCÿ333ŒŒŒÄÌø½½½bbbÿFB888ÑÓöFJˆ¬°îTPÿÉaä{ä{;3 ¼Q°°°ÈÈÈ)èð´c;"üÚ°°°°šššÿÎ$ÕÕÕËËË~~~fff8…ìñÿÃå½òòòTTTTTTŒŒŒí :+ ¥! ¾UóòòòÌÌÌB« wÙ·VÿüÙü¦ß¦ßûÑúò‰'ÿ¦ßøÈøûÈøòòò¶¶¶ÈÈÈžžž>>>¿R‹øaÃ/ƒ›444ÿ“Âqm>iii>>>Ê iiiYYYööö¬¬¬öööèèèTTTTTTôî¿ AóÏþóÏþ¾”ÂÜÜÍÍÍŒŒŒìììóÏþ 1ôî¿!Påß°ÿÚÚÚ·³};5.w­‘W‚~HÁéÌÓöbbbÿ­@yh¡3çkƒCCCÿÁé®êÿÜÜÜiiiÌÌÌbbbÿÜÜÜiiiÌÌÌbbbÿÜÜÜiiiÌÌÌbbbÿÈÈÈžžžQºXï`'•pÙ;žžžÈÈÈbbbÿšššÿhœÌvvvttt\ÀšššÿCCCÿÈÈÈèèètØáááÈÈÈáááÄÄÄtØ—ÅîÈÈÈCCCÿDx¨Dx¨>>>áááJJJ$$$ÄÌûžžžÈÈÈCCCÿ...<<< âÉCCCÿtttŒŒŒèèè½½½ŠŠŠCCCÿWWWÈÈÈ繚ššÿ½½½žžž   >>>ŒŒŒ×ÝŸTTTêêꊊŠ$$$CCCÿWWWÈÈÈ繚ššÿ½½½žžžM% ÿ4.Ëøú6G!òòò­ÖCCCÿÒÒÒñÈËËËÕÕÕ4.ñÈ£Ñú©©©îîî½½½žžž¶¶¶žžžôôôÍÍÍÊÊʾ¾¾ÊÊÊ666YYY¬¬¬ÿ­ÖDx¨IªÒá8ÞB¢¢¢...fffÖÖÖÿšššÿÈÈÈááábbbÿ888ÈÈÈáááÈÈȈˆˆšššÿ½½½°°°žžž³‹rH„þçýÅÞËó ÿèèèCCCÿ333G¼ÍÍÍ­ÖCCCÿžžžbbbÿTPÿPÅÇâÈÈÈ%#ÿTPÿ¬°î»‰ˆÿS…†« GÅÍô¨sEwxÿýÇÿÈÈÈÂÂÂ>>>MuŽáLMuŽbbbÿfffÈÈȳ/ÿÈåø?­Ö{ÿÕB ßL›ÿ{ÿ¥c¹nè‚‚‚ …Ô®888ÒÒÒÈÈÈêêêÿÿ÷ö“úÿýÛý?ZwÙÿK ÿÌÌ̳/ÿMÑé¦ßò‰'ÿwÙ?ÑèèèžžžJJJˆˆˆxxx———+++ÊÌÒ———JJJ×'TTT½½½TTTTTTžžžñññôî¿íó" ACC666ú$$ 1 A444ÿ^^^&&&os©ÅËÒ<4os©~‚¸½½½444ÿòòò³ÛôCCCÿ888ÈÈÈÂÂÂÈÈȧ§§CCCÿòòòòòòvvvÿ¬¬¬ÿbbbÿ¬¬¬ÿvvvÿ¬¬¬ÿbbbÿ¬¬¬ÿvvvÿ¬¬¬ÿbbbÿ¬¬¬ÿbbbÿbbbÿšššÿšššÿbbbÿbbbÿ$$$ÿò‰'ÿÿù7ÿúÁ/ÿò‰'ÿbbbÿbbbÿbbbÿò‰'ÿÿù7ÿÿù7ÿò‰'ÿCCCÿCCCÿM&%ÿ444ÿbbbÿvvvÿšššÿÿÿbbbÿSQ(ÿÿvvvÿSQ(ÿ‰…VÿCCCÿS*ÿbbbÿM% ÿS*ÿM% ÿšššÿ444ÿCCCÿšššÿbbbÿšššÿÖÖÖÿÖÖÖÿS*ÿbbbÿ¼ˆXÿS*ÿšššÿS*ÿM% ÿÿS*ÿM% ÿÿS*ÿS*ÿ$$$ÿÿS*ÿ¼ˆXÿÿCCCÿvvvÿM&%ÿCCCÿÿCCCÿ·V.ÿ·V.ÿvvvÿS*ÿS*ÿbbbÿS*ÿM% ÿM% ÿbbbÿÖÖÖÿšššÿbbbÿšššÿ¼ˆXÿCCCÿbbbÿbbbÿCCCÿM% ÿM% ÿK ÿM% ÿÿÿvvvÿS*ÿ$$$ÿbbbÿbbbÿCCCÿTPÿ$$$ÿ³/ÿ·VÿúÁ/ÿÿýÇÿÿÿÿÿ»‰ˆÿšššÿšššÿbbbÿbbbÿšššÿêêêÿ{ÿíZ!ÿ{ÿS*ÿ³/ÿ³/ÿíZ!ÿÿúdÿ³/ÿ³/ÿ{ÿbbbÿCCCÿbbbÿ444ÿ$$$ÿbbbÿbbbÿšššÿÿ$$$ÿ!ÿÿK ÿ!ÿÿbbbÿíZ!ÿ·Vÿ³/ÿ·VÿÿýÇÿ³/ÿ444ÿvvvÿCCCÿCCCÿ€TSÿSQ(ÿÿ²ÿ¬¬¬ÿÿ444ÿÿ¬¬¬ÿ444ÿCCCÿOU„ÿOU„ÿOU„ÿOU„ÿOU„ÿbbbÿ\††ÿbbbÿOU„ÿOU„ÿ\††ÿCCCÿCCCÿCCCÿCCCÿ444ÿ$$$ÿÅÁ‹ÿ444ÿÅÁ‹ÿ444ÿ444ÿšššÿ0Oÿ$$$ÿ$$$ÿ$$$ÿbbbÿbbbÿììì¶¶¶žžž———bbbÿììì¶¶¶žžž———bbbÿììì¶¶¶žžž———bbbÿbbbÿ888~~~888žžž>>>¨sci+ ÙkQºžžžžžžCCCÿpÙ;DJ ×QºWWWbbbÿ=3..ÌÌÌžžž×°¯æº¹èèè;9ñïÆÅÇðèèèÍÍÍÑÓüÊÌÒ‰…Vÿ âÉžžž³ÛôÌÒâ4.fffÌÌÌÕÕÕ“··áááÈÈÈŒŒŒ***S*ÿ;5.žžžDx¨fffM% ÿ³ÛôêüýÌÒâ4.ä{£Ñúq6ýCqßòòò·V.ÿ333ׯ–³ÚÛ½½½^^^ÕÕÕIªÒFâM% ÿ;5.wpcZ&öÌÒâ³Ûô³Ûôëê«}T³‹ržžž"î¾Dx¨½½½Z&ö¶¶¶tØpa­œ#Áé èèèŠŠŠ­Ö>>>žžžCCCÿžžž½½½¬°î>>>çkƒŒí(h¡3šššÿ9555+++^^^¬¬¬ÿEwxjŒ¶žžžžžžÈÈȰ°°…ìñ¦ß8l÷³/ÿÈåøqõ /óÚ÷žžž½½½éÇïGøÊðžžžfffÿêêê =þûµô÷ßûüK ÿòòòˆˆˆ4ƒ3é IDAT6'üÙüûÄhLΰ444ÿÿbbbÿ½½½½½½ÓýÕ­¯Øèèè°EL¶¶¶JJJÌÌÌJJJôî¿ôî¿ 1ú$$ÜÜíó" 1óÏþ Añññvvvÿ½½½ÌÌÌ÷ÇÍ÷ÇÍÌÌÌt‰lôÕÎí­¶¶¶ÿbbbÿJJJžžžÿiiiJJJÿbbbÿJJJžžžÿiiiJJJÿbbbÿJJJžžžÿiiiJJJëÃªŠŠŠ¶¶¶èèèfff³‹rÿñÈç¹áááfff>çS*ÿ½½½¶¶¶ñȽ½½òòòñññ繞žžÿÿ€TSÿ<4˜ÄÅÿÿËòó¼ˆXÿÿÿi70èèè½½½ôôôö7ÌÒâ³ÛôGpCCCÿèèèòòááá¶¶¶CCCÿM% ÿʹ߄±ÌÒâK ÿM% ÿ4- <4ÿ콇2ÿQº~¦ ôôô Qºci+ÿÿ2*ƒLé³ÛôÍÍÍèèèÊýüùÂ_ÿ4.ÅËÒÄÅË‘´³Ûô4.ÌÒâ4.M% ÿÅËÒÿÿÿÅËÒ5 ôÿ¿ [†½!|µGÅÞ èèèCCCÿbbbÿžžž888º¶xááẶxCCCÿ333ÍÍÍ>>>ÿyÁ©©©ǯãwÈåø7Êqõ 8Îe2›ýÁ¦ðMÑé.îê…ìñK)Qÿ0©øÒòòòÿÿòòòòòòêêêµô÷ÿµô÷JJJbbbÿÿÿò‰'ÿ g/6ÿÿÿ?ZøÈøüpÌÌÌÌÌÌ­©sŠŠŠc_)|*(ÿc-JJJCCCÿÿááážžžTTTñññ Aôî¿ AóÏþóÏþú$$óÏþôî¿ñññôî¿ŠŠŠÌÌÌx¬Üðððx¬Ü#ÿ", ôôôôôôôôô7÷ÿÿööö=þûËó ööö=þûËó èèèÿööö=þûËó ööö=þûËó èèèÿöööú/- ÄÈööö=þû D ÄÈèèèÿ¤p@ÅËÒ—ÅîööösE;5.‘´³Ûôÿööö®zJR†¶òòò¼ˆXÿÅËÒ­Öÿ‚‚‚©©©ÕÕÕööö555WWW~~~èèèÿ®zJÄÌû˜ÄÅööö?ob3\Àèèèÿqm>ÊÌÒ»½æ ööö?þ<`J<<5SWèèèÿ¢¢¢888 JJJtttBBBèèèÿ5 ô4- £Òêêê i:þ—Æèèèÿ íì, Áé íì, Ëó èèèÿ3ôñËøúø þìë5Í èèèÿèèèÿ¬¬¬555WWW©©©ËËË èèèS*ÿxo5ÃÆùDx¨ÿööö ööö©H 2*Dx¨ÿ ]/ÌÒâ4.—Åîèèèÿ5 ô4.;5.‘´ÁéòòòÿööösEÌÒâÁésE»ä èèèM% ÿþçýÍ ööö=þûËó èèèCCCÿ½½½ÿJJJžžžÿ<8úÄÈöööFB64 Ž”ûèèèÿöööo›ïöööoþëþ…ìñ{ÿľô èèèÿööösD¼ø¥! :+ ¦ßÿèèèÿmD“â¼ š<™øýÍïÇèèèÿ èèèÿ÷ößûüšššÿfffÿööö â©<˜ûÄhWéöööä{8øÈø&ñèèèvvvÿÍÍÍÕÕÕ‚‚‚~~~èèèÿd6óîfûöööTTTJJJ———ÕÕÕèè謬¬ÿ¶¶¶žžžÿ”””¶¶¶žžž444ÿñññ!Pôî¿ A 1óÏþôî¿ Aôî¿ñññÌÌÌ444ÿÌÌÌÿööö"A04 ÐÌõÞ¿ÿ"A04 ®‹ô èèèÿ3ôñÁé ööö=þûÍ èèèÿ3ôñÁé ööö=þûÍ èèèÿ3ôñÚÿéë ööö=þûÚÿóõèèèÿ5 ôËó ööösE—Åîèèèÿööö èèèÿööö555ËËË555ÕÕÕèèèÿööö ööö èèèÿ­©sÄÄËÊÌÒ»½æECi70—ÉÐÅÇ𬬬555¶¶¶èèèÿ5 ôÁé?þ4- ÌÓöËó ööö=þûÃ=þûÍ þìëø öõ5Í ...888©©©ÕÕÕöööŒŒŒÈÈȬ¬¬ i;;5.ÅËÒ»äsE;5.ÅËÒ­Öÿi;;5.ÅËÒ;5.R†¶sE;5.‘´ÁéòòòS*ÿ—ÅîööösE»ä èèèÿ3ôñà èèèÿJJJáááËËË555ËËË èèèÿöööú/- º¾ü èèèÿööö©H H£×ou`ÅÍôaÂýèèèÿeù:- ;3 …çou`ÅÍôaÂýèèèÿööö¥! :+ /Á¦ð[ß÷¥! :+ !´í èèèÿš<\ݺmD7ÉûþÐýÿÃå½ èèèÿööö÷öí èèèÿèèèÿèèèÿ‚‚‚ÈÈÈÒÒÒÚÚÚ&&&...888ÈÈȶ¶¶èèèÿööö¤Ê ’äæ ööö èèèÿ+++ËËËhhhÍÍÍËËË èèè444ÿ Aôî¿ A 1ç½½ñññññññññÌÌÌÿèèèÿèèèÆÀ\ÿšÃ¾f=BRX¼ööö"AÞ¿ÿ¸²NšÃ¾®‹ô èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèM% ÿËó èèèÿèèèÿèèèÿèèèÿi;;5.ÅËÒ—Åîööö èè輈XÿÅËÒ»ä èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿèèèò‰'ÿ&ñèèèÿööömD“â¼ èèèÿööö èèè.uY IDATÿèèè€ÿÿèèèÿ”””bbb ”””>>>...èèè444ÿññññññ!Påß°ñññÌÌÌÿèèèCCCÿ¶¶¶èèè444ÿÌÌÌCCCÿ¶¶¶èèè444ÿÌÌÌ444ÿÌÌÌCCCÿžžžCCCÿžžž444ÿ(RRç½½½½½444ÿ...ÒÒÒÌÌÌCCCÿÒÒÒÌÌÌ444ÿÌÌÌCCCÿ½½½444ÿ(RRç½½½½½CCCÿ¶¶¶ êêêòòòCCCÿ¶¶¶èè謬¬ÿTTTM&%ÿ³ÚÛ444ÿ(RRç½½áááôôôèèè444ÿÌÌÌÿèèèÿ ÒÒÒÌÌÌ444ÿMö­ÖS*ÿ­ÖCCCÿÒÒÒÌÌÌCCCÿÒÒÒÌÌÌM&%ÿ³ÚÛ444ÿññññññùããñññÌÌÌ444ÿ(RRç½½½½½CCCÿú$$+++ÌÌÌ444ÿ444ÿCCCÿú$$+++444ÿvvvÿÌÌÌCCCÿú$$¼ˆXÿÿ-QQÿú$$bbbÿšššÿùÜÜCCÿÿ444ÿùú$$M&%ÿÿCCCÿêú$$...444ÿÌÌÌCCCÿCCCCCÿùÜÜCC444ÿ444ÿCCCÿú$$+++êêê S*ÿ-QQÿÿbbbÿCCCÿú$$+++vvvÿ\††ÿTTT/ùÜÜCCööö-QQÿÌÌÌ-QQÿÿöööÿÿèèèêú$$...Möyn½‡2ÿ±íÿÿCCCÿêú$$...ÿÿ444ÿ\††ÿ444ÿbbbÿCCCÿêú$$...444ÿÿ OÿM&%ÿ|*(ÿ³ÚÛñññùùùñññùÜÜCCÿ âÉñÈ%ͤ½½½444ÿÌÌ̬¬¬ÿtØñÈ%ͤ½½½444ÿBBByEÍÍÍ444ÿ·~ìZ&öœ=R†¶®zJòò=`ÒáááÖÖÖÿfffÿCCCÿCCCÿ444ÿCCCÿ Ô»ñÈñŸ†DnnDnn\††ÿ¼ˆXÿÌÌÌòòëÄÃöÌÌÌÌÌ/ ÿÿñññ»¸`Òžžž444ÿ444ÿüó444ÿëê%ͤ½½½S*ÿM% ÿCCCÿ Ô»ñÈñŸ†\††ÿS*ÿÿñØäää âÉñÈ`Ò âÉ8bb>>> èèè444ÿ¼ˆXÿwpcòò¶¶¶ññññÈœ=>çæ`Ò¼ˆXÿÑüý Ô»888ððôôô444ÿãã-QQÿ?ƒTÿÓ¯¯ÿöööööö§§§ôÖÿÑËËžžžšššÿ<4Hö=: SM40 2ÿ 2ÿ^ÿ #$ÿ ÿæÍpÞ[Ш˜_Íòòòöööÿ¼’’ðððÿ¶¶¶šššÿ½åßi;žžžM&%ÿÿÿšššÿ|*(ÿ444ÿ¢¢¢444ÿÿÛbU³àþM&%ÿM&%ÿùêùòòêêêòò2ùü@ÿ-QQÿNÄÖ¬¬¬¡ÿÿÿ ÿ³Ûô;5.;5.444ÿ...TTTvvvÿmÎ ;5.;5.FâºîñññÌÌÌM&%ÿ-QQÿÅËÒ,a—ÿ ‘žÍ¼ˆXÿ444ÿCCCÿbbbÿ444ÿ444ÿÿ½½½<4ÕÕÕbbbÿ***¤p@FBñññ,2,xœÜÜ-ÿÐ<;5WWW,-ÛÿÿM&%ÿ7M&%ÿèèè&&&+++ÚÚÚ6G!ÌÌÌüó/3bbbÿCCCÿ-QQÿ8ÑÌ4.;5.\††ÿ\††ÿ;5.áááMuŽÌÒâ_‡ ÜܼˆXÿ5 ô4.5 ôà,E;5.ñÈ5 ÌÌÌÄÅË>ç555öööäääÄÅË£ÑúÅËÒM&%ÿ/M&%ÿS*ÿCCCÿ=Vç¹×¯–DnnCCfffÌÌÌ444ÿ-QQÿÓ¯¯Á}¬K)QÿK)QÿCC°°° *bbbÿfff444ÿðððÄÌø½~O"ÑÓüBBB÷Îûåô¹åf^ÿ 2ÿèèè 444ÿâ(MßÄÖ$½•ÿ\††ÿÿÿEIù IDATòòò‚‚‚444ÿâââ:::...99èèè~~~ÿ¶¶¶ŸO&ÕÙ³ÚÛM&%ÿSQ(ÿòòòöööÿO‹ƒ×'ÌÌÌ   ððð±u}888þôM&%ÿM&%ÿ/æ8:ö|*(ÿòòê/55gn9êÀï20:2êÿÿÿ÷ÓÓ“ùç“ùçJJJöööèèè ÿ-QQÿÅËÒºî\††ÿááá444ÿ Ý´>>>ÅËÒ\À\††ÿS*ÿˆT$x¬ÜÍÍÍM&%ÿ³ÚÛ7h¡38bbNxx¤p@4-Dx¨444ÿCCCÿ444ÿ444ÿùCCbbbÿžžž444ÿððð444ÿüóCCCÿbbbÿÿÿ CCCÿCCCÿÄÌû‘žÍJJJú$$CCCÿÍýþ3ôñññêúÔäøÎÔ¡×ú$$ñŸ†ÊÌÒ‘ÂÉÿbbbÿ²Ôþãã‘ÁÂÿbbbÿ|*(ÿf Ÿ#'/ˆT$ñññCChœÌ\††ÿCCCÿ444ÿ/3]+üóÒÒÒ>ç÷ÓÓÐøúÌÒâx¬ÜÜÜ%ͤ¼ˆXÿÅËÒ4.ŠŠŠö7———ËïïÌÒâÅËÒM&%ÿM% ÿ4.6Ëó ãã\À\Àaz[Ш;5.³ÚÛ444ÿCCCÿÅËÒÅËÒÌÒâ ööö£Ñúx¬Ü8bbÜÜÅËÒ;,/S*ÿ;5.ñññËïïá8az7444ÿ-QQÿ444ÿÈÈÈ?ƒTÿÚÚÚ?ƒTÿÓ¯¯bbbÿ\††ÿµ×¯K)Qÿµ×¯èèè á½½CC bbbÿŠŠŠ×Õÿ5\††ÿžžžÌÌÌôôô±íÄÌøMÇÜ劚èCCCÿ444ÿ  € ùÔèèèäääããmD²%ÿW¸à¦ÌDnnÿM&%ÿ!ÿÿÿRRRÿÂììfffðððÆÆÆÒÒÒ%ÿ::: JJJ›ŸÎÈÈÈ\††ÿ/M&%ÿSQ(ÿ64.-QQÿDDDJJJj, 5^\††ÿ¾¾¾ -- ÈÈÈ~~~ Óâþ<=pr8889çåÑüýêòòê0:%10:2ê444ÿöööÿSQ(ÿ444ÿ444ÿöööžžž žžžáááÿi;ööö5á8æÑËËñŠ[ÿ>ç(ùñññÌÌ̼ˆXÿ£ÑúËïï»äDnn¤zz­Öx¬ÜÌÌÌñññ½½½444ÿM&%ÿ/M&%ÿøÃÿ\ÀËïïá8%ͤDx¨­ÖÌÌÌùCCCÿíÑÐTÙ`Ò!ÿÿžžžÌÌÌüóä CCCÿbbbÿÿCCCÿú$$+++ÿ®zJèèè€TSÿ ãâêâ`aú$$ÜÜ ãâÿ—ÉЭ¯ØÚÚÚããà,Eá8ú$$ç½½³ÛôÊÌÒÿÿÿÒÒÒ©©©^<]ŽËÅÄËïï-QQÿÖ(*Ÿ#'aÝÙÑüý¼ˆXÿÅËÒðððãã¬þ'>>>ÈžžyEMö"ÐýtÈÏä Mö­ÖôôôÙà,E...ááá­ÖM% ÿS*ÿ£Ñúôôô --êêá½½³ÛôÂð-QQÿ×þÿM&%ÿM% ÿocLIªÒù+++JJJÜÜ–Ð÷ÅËÒ444ÿ444ÿ½½½­ÖÌÒâááá+++ôôô...ç½½ëêÌÓû/;4;,444ÿ444ÿ;5.Dx¨òòËïïÜÜç½½ÅËÒ444ÿÌÌÌÓ¯¯?ƒTÿùÝ!ò-QQÿKÛCCÏ ²-QQÿvvvÿTPÿ¬¬¬ÿvvvÿY'&£wAvvvÿK)Qÿ{,Rÿ0K)QÿK)Qÿèèè ×Õÿ --¢ÄîôôôòÈú$$>&PÿèìÿSMÌÓûûåC3åêäää40Ocb$ò$òÿ39äää¹â5mD7¤zzc:³ÚÛÿèèèÿöööÿJJJÆÆÆØ®®ÈÈÈ8bb ...¼¼¼èèè444ÿâââööö¶¶¶ú$$ç½½M&%ÿ;,ó,-M&%ÿ­¯ØÊÌÒSQ(ÿ5ÆÆÆððð: ¤¢bbbÿšššÿ...÷ÓÓ99¶¶¶Dnnb\?BZ?©©©âŽÑüý³ÚÛñññêããê÷ÓÓöÌÌΣØ%%¾”øÈÇü%1îÎýãã444ÿÌÌÌRRR;9tnBBB444ÿ444ÿððð444ÿÿ ôôô———+++¥¥ËËËòòò öööñŠ[ÿ­Öòòò¶¶¶ððëÇÇv¥S*ÿ;5.v¥S*ÿDx¨ôôôá½½555ÜÜÿÌÌÌÌÌÌÌÌÌM&%ÿ/@^0«hUc˜èèèëÇÇËïïÜÜ—Åî444ÿê7ááábbbÿ">?;5.A]^99444ÿüóQüóCCCÿú$$+++ÿÿ½½½ñÈ%ͤËËË hœÌ¼ˆXÿ€TSÿob3òòËïïÜÜÜÜëÄÃ3..ÿ99º¾íÅÇð ðððããËïïç½½ÕÕÕ­¯Ø64.;9TTTöööÿ99äääêú$$Ñ¡ ¼’’Ó¯¯Ó¯¯ûÔÓ*ØÖÉûý³ÚÛ¼ˆXÿDx¨­ÖôôôðððããËïïDx¨;5.­Öä ÌÌÌM% ÿ­Ööööôôô÷ÓÓááá½½½4.¬þ' þ.£Ñúööö÷ÓÓëÇÇòòò/55)/ocLÅËÒ­ÖöööëÇÇËïשּׁ¬³ÚÛñØ444ÿ¼ˆXÿøÃÿ4.ôôôÕÕÕ ööö¶¶¶ËËË4.ÌÒâ4-v`;4444ÿMöS*ÿDx¨ÌÌÌñññòòÒÒÒÕÕÕ;5.S*ÿ444ÿ444ÿÌÌÌÁ}¬-QQÿ?ƒTÿ÷ÓÓîÎýv|ÑÓ¯¯òÝúãã444ÿ444ÿ444ÿ®®®šššÿŠ„ÿTTTšššÿ®®®¼ŒÁŠŠŠµ×¯„Ñuµ×¯èèèüÚ°Ó¯¯üÚ°99öööÈžžÈÈÈ)++³ÚÛêòòJJJ(RR¤ŠØÜàóÜàóM"ûå0 ùðððáZ4NϬ…Ô®{,RÿM&%ÿM&%ÿ íì íì!ÿÿ444ÿ+++áááèèèÌÌÌÒÒÒÜÜ...Ûÿÿ444ÿ...ÌÌÌòòòöööÕÕÕÑË˽½½RRRÿãDeÉ­¯Ø­¯ØžžžâââËïïÜ܄֨é%ÿÈÈÈbbbÿ¬¬¬ôôô÷ÓÓ99ç½½ž¢µé¬Ãôôô9çåÑüý³ÚÛäää/55™’ÇòòùÌÌ̾¾¾hhh 2Œ’ïvvvÿ¾¾¾ÌÌÌÌÌÌÚÚÚ öööáááêòòòòòèèèÿñŠ[ÿÉÏ­ÖÿòòòS*ÿ;5.Dx¨ÿ èèèM&%ÿ/Ñüý³ÚÛÿ èèè444ÿˆT$ÅËÒ¬þ'5ú$$%ͤ­Ö444ÿˆT$hœÌôôôž?=~ÝßÚÚÚ èèèbbbÿáááyE þ.%ͤ­Ö€TSÿ<4Dx¨ÿ h<;Íѹ³Ûô-QQÿ/55¤zzÿööö èèèSQ(ÿi70Íýþ“Âèèè444ÿ...ËïïÓ¯¯ÿ&&&ùëÇÇèèèM&%ÿ³ÚÛS*ÿ;5.Dx¨ÿööö èèèS*ÿÌÒâ³ÛôÿòòòM% ÿ4.­ÖCCCÿáááôôô99á½½òòò|*(ÿ)ÌÓû4-ÌÒâ³ÛôÿòòòS*ÿÌÒâö7yE‘´4.ÌÒâËó ööö)èj1";4Š ò¨úü]/;5.x¬ÜÌÌÌ ÿí¿-WéèèèS*ÿ­Ö444ÿ½½½OU„ÿn1ž’Ïb±«|ÿèèè-QQÿàÒÓ}a š õ --Ó¯¯444ÿÌÌÌ444ÿ Þàä"ððð Þ¬°îCCCÿÕÕÕöööNxxç½½xFE Éµ×¯K)Qÿµ×¯CCCÿêá½½òòò&Pÿ)+Ó¯¯ÿSM­¯ØÿCCòòËËËòö SMúÕý³Þòüé{,Rÿ©øÒêêêòòòM&%ÿ.-þÖ„ÖØÿ íìõÿÿ ÷Ÿ>–ÏñÁé íìíxÿ} IDAT òòòCCCÿCC¼’’èèèRRRÿÛÿÿ÷ÓÓôôô+++½½½RRRÿ®®®ÿòòòšššÿ³Œ‹³ÚÛÿöööm…ìñšššÿfffÿ öööòøK³ÚÛ-QQÿãã(RR¼’’(RRöÌÌËïï5ËïïããùÓ¯¯444ÿBBB¹=; ÃÅöìòG¾¾¾ÌÌÌ444ÿÚÚÚ555ááá --á½½òòòÿööö èèèÿ öööòòò-QQÿòòñññ(RR¤zzM&%ÿ³ÚÛ-QQÿòòñññ...žžž444ÿÌÌÌÿ99òòÕÕÕèè輈XÿDx¨¼ˆXÿ‡»ëáááCC`ÒDx¨¼ˆXÿx¬Üù5ú$$Ø®®ÌÌÌCCCÿÕÕÕ995˜d4ÄÌû€¬­‰…VÿÊÌÒ­¯Ø444ÿðððBBBÍÍͽ½½¼ˆXÿ—ÉÐÅÇðèèèÿŸ>0Qˆìòòò-QQÿ5ááážžžM% ÿ4.­Öÿ --/55¤zzS*ÿ­ÖùÂ_ÿÃÆùhœÌ --5Ëïï5ú$$¤zzS*ÿ2ÜÎ$ÿ;5.ÅËÒ­Öÿ995ú$$ç½½½½½M% ÿ=VñÈ£Ñúôôôñññäää ]/6–Ð÷çÌÌÌbbbÿú$$ÜÜú$$ÜÜžžž¼ˆXÿDx¨444ÿ AÉÔ+++ AÒÒÌíç¾òòò-QQÿ]3ÞƒŸõ õôèèè-QQÿÓ¯¯444ÿùããÌÌÌ444ÿ Þïó1âàÅ7c~¤zz»‰ˆÿi›œ --/55ððÍÍͽ½½ÿöööòòò-QQÿÓ¯¯ÿüéÿ99á½½ êêêECúÕý³Þòèèè{,RÿÐýÿÍïÇ:::žžž|*(ÿÿ*;+ÅÕý;+ÆÓÓ„ÖØbbbÿžžž!ÿõÿÿø CC Ô»ÁéNxx²ˆˆ=þû³ÚÛCCCÿCCÜÜžžž444ÿù%ÆÆÆèèèÿžžžbbbÿžžžÿ --/55¤zzRRRÿÆÆÆÌÌÌÿöööòö  àøÝM&%ÿ³ÚÛCCCÿê52](ÈÇüÜÜËïïòò2](™’ÇããÌÌÌ444ÿ“‹muû“‹muû“‹muûÌÌÌÿ555¬¬¬&&&ù5Ëïï5ú$$¤zzÿòòò JJJJJJCCI%%CCÌÌÌÑËËbbbÿ³ÚÛ/55ÌÌÌËïï\††ÿÌÌÌ+++á½½ËËËJJJDx¨¼ˆXÿDx¨ê>>>CCÜÜDx¨¼ˆXÿ¼ˆXÿhœÌÚÚÚããËïïÜÜØ®®ÚÚÚCCCÿbbbÿê+++òòÄÌû<4ÑÓüSQ(ÿCCCÿ...äää·ÛÛCCSQ(ÿ—ÉЭ¯Øèèèÿ^^^¥0kw®CCÿCCCÿ5ááá½½½ÒÒÒCCCÿ³Ûô­ÖCCCÿi; --òò%ͤ\††ÿ­Ö­ÖÃÆùDx¨ôôô5ñÈëÇÇòòñÈÑËË\††ÿû×þû×þ­Ö‘´ÌÒâÿJJJ/55áááÜÜ%ͤ>ç444ÿç(ö7ÒÒÒ­Ö­Öôôô --99(RR...äääê...JJJ8bbôôô£Ñú–Ð÷³ÚÛÌÌÌÌÌÌ444ÿCCCÿú$$ÜÜžžžÜÜú$$Dx¨ñññ±«|7=lêôî¿;_6÷ñÈòòò2ÉÍù<<-óÝÜõ Ó¯¯?ƒTÿùããÌÌÌÌÌÌÌÌ̬°îàä"ê.IÜÜ%#ÿ»‰ˆÿS…†ôôô÷ÓÓÑËËÍÍͽ½½-QQÿJJJ555TTT\††ÿ×Õÿÿ+++5555CCJJJ ­³ï³ê9èèèÐýÿÛÿÿððð\††ÿ¨úüþÖ;+ÆÓÓÑüýžžžšššÿCCCÿ ø ããà,EDDD²ˆˆ¢N1½½½ÜÜ%âââ99èèèñññááážžžÿ 99êêêëÇÇç½½\††ÿRRRÿ444ÿööö àþ³ÚÛñññËïǼ’’ÒÒÒ5êËïïΣØÌÌÌmuû“‹Œ’ï“‹muûñññááá&&&äää5ë껸òò骧ÑËË\††ÿÿòòò99ÌÌÌÿ/RRÓ¯¯-QQÿæ¤zzòòú55CCCÿÜÜžžžòòêNxxÑËËú$$bbbÿžžžDx¨ëÇǬöö ÅËÒÅËÒ&&&ÚÚÚ©"çÆÇö¬åýTTTžžž½½½CCCÿëÄÃ..ÂÂÂ>>>€žžÄÿÊÌÒ/-­¯Øÿêäääèèè+òòÿÜܤ¯Ø99KLŠ?>Cÿd©ªo?>CCÜܽ½½ù55½½>çÌÒâÓÛÖCCCÿÌÒâ4¤Dx¨+++ñÈèèèÿ>;7¦ÚÜÑüý„ÖØ³ÛôJJJú$$ñ Ÿñáááž½Ö·V.ÿ6"ú–ñ ÿ³ÌÌ444ÿÌÌÌ995ͤÌÒâèèôÇÇÿë ôà,E5ÜÜDnn¼’’³èèÌÌÌêÜÜžžžžžžbbbÿ444ÿÌÌÌ444ÿÌÌ̱«|444ÿê;_5ÜÜ 8!ÿ..4±«|?ƒTÿÎÔso4:@¤ .-ÓÝÜÁ}¬444ÿÌÌÌÚÚÚÚÚÓòòTPÿ¬°îEwxÿôÇÇëÿòòËÓ½½-QQÿ5ÜÜüÚ°èèèÿú$$½¢µÓ\‚o;å­³¹èG¢µ×¯ÿùá½½CC5ÜÜ8bb„zz|ÿÑüý³ÚÛfffšššÿȬ¬¬ äääÏÑÐ !´íßLгžžžCCCÿÒÒÒÌÌÌb..ÿ44ÿÌÌÌÌÌÌèèèCCCÿòòë öööÕÕÕâââèèè®®®\††ÿÌÌÌÿööööööÚÚÚ ÷òø òòê99äÇÇù5ððð%Ëïïòòñ444ÿ“‹muû ÃÅöääéèèèòòòÿñññÌÌÌCCCÿëêþçýµô÷½½M% ÿ»¸òòòÿbbbÿ-QQÿÿ$$$ÿCCCÿÿ$$$ÿbbbÿÿCCCÿÿÿCCCÿbbbÿ-QQÿšššÿ-QQÿÿ-QQÿ\††ÿCCCÿ-QQÿbbbÿ\††ÿCCCÿ444ÿbbbÿbbbÿÿ444ÿ-QQÿbbbÿCCCÿ€TSÿ€TSÿ$$$ÿ$$$ÿM&%ÿ€TSÿCCCÿ$$$ÿÿ\††ÿÿ$$$ÿCCCÿÿ$$$ÿbbbÿCCCÿ444ÿ$$$ÿ\††ÿM% ÿS*ÿS*ÿM% ÿS*ÿÿM% ÿM% ÿ·V.ÿM% ÿM% ÿ444ÿ·V.ÿ¼ˆXÿM% ÿ¼ˆXÿS*ÿS*ÿM% ÿM% ÿS*ÿM% ÿÿ$$$ÿ444ÿÿbbbÿÿÿÿÿ-QQÿ-QQÿ-QQÿ-QQÿ444ÿ-QQÿbbbÿ\††ÿCCCÿ-QQÿÿvvvÿ\††ÿCCCÿÿÿÿCCCÿÿ$$$ÿÿCCCÿÿÿÿÿÿK)Qÿ{,Rÿÿ{,RÿÿM&%ÿÿ!ÿ444ÿÿRRRÿÿ$$$ÿÿ!ÿíd0äú IDATZ!ÿ|*(ÿM&%ÿ444ÿ\††ÿRRRÿRRRÿ444ÿÿvvvÿbbbÿÿÿÿbbbÿÿÿÿ444ÿÿÿÿ444ÿÿ Oÿ444ÿCCCÿCCCÿ-QQÿCCCÿ-QQÿRRRÿbbbÿbbbÿ-QQÿ-QQÿ-QQÿ-QQÿCCCÿ-QQÿ444ÿ444ÿ444ÿ444ÿ444ÿŠ„/ÿK ÿM% ÿK ÿK ÿÿJJJú$$vvvÿÿ+++8bb½½½ --ú$$ÿJJJCCèèèêú$$ Ô»ŠŠŠëÇÇ ÷ÓÓñŸ†ÿ>çTÙáááÈžž>çS*ÿÌÌÌñÈÒÒÒðððTÙ¶¶¶½½½ÿÿ€TSÿ<4˜ÄÅôôôôôôËòó¼ˆXÿÿÿê>>>èèèÿCCCÿÜÜÿ+++8bb½½½ --ú$$ÜÜM% ÿ4- <4ÿìpb&0ÿÌÒâÿÿþçýÿ2*¬S³ÛôÌÌÌÊýüùÂ_ÿ4.ÅËÒ;5.ÌÒâ³Ûô4.ÌÒâ4.+++>>>ðððÿÿÿ+++Ëïïÿ&&&CC555Dnn?ƒTÿÓ¯¯Ó¯¯-QQÿÓ¯¯ãã Þ÷ÓÓÂÂÂøÊŒCCCÿCCÍÍÍÑËË\††ÿ333+++èèè99333ÿ$ Üàó½½½èìÿüéèèèèèèK)Qÿ0…Ô®èèè…Ô®c:³ÚÛÿ/0ÚÚÚ ¼¼¼Dnn^²èÑüý³ÚÛöÌÌÛÿÿÛÿÿ­©sŠŠŠc_)99JJJËïïöööäääöööäää÷È OÿñññêòòêËïïðððããòòñññãã444ÿÌÌÌÌÌÌÌÌ̪°ÿµô÷K ÿÍ òòòÿ ð=?Z¶¶¶ööö555CC¤zzÿèèèÿööö=þûËó ööö=þûËó èèèÿöööú/- ÄÈööö=þû D ÄÈèèèÿ¤p@ÅËÒ—ÅîööösE;5.‘´³Ûôÿööö®zJÅËÒ—Åî¤p@ÅËÒ—ÅîèèèÿDnnç½½ËËË +++CC¼’’èèèÿh<;<4ÄÌûŽº» ööö?ob3\Àèèèÿqm>ÊÌÒ»½æ ööö?þ<`J<<5SWèèèÿ=þûËó ööö=þûËó èèèÿ íì, Áé íì, Ëó èèèÿ3ôñËøúø þìë5Í èèèÿèèèÿööö/üúóþþÞ=þûÁéòòòS*ÿxo5ÃÆùDx¨ÿööö ööö©H 2*Dx¨ÿ ]/ÌÒâ4.—Åîèèèÿ5 ô4.;5.‘´ÁéòòòÿöööCCòòËËËsE»ä èèè!'Pÿ÷ñÈöööB..4ÉÔèèèÿ'k<Ï‹º 99ëÇÇèèèÿ<8úÄÈöööFB64 Ž”ûèèèÿööö=þûà ööö÷ö">?½½½CCCÿiiibbb ^^^ÍÍÍÕÕÕèèèÿ$ ÜàóèèèÿèìÿüéÿmD“â¼ ööö¤#F™øýÍïÇèèèÿ3ôñÃêêê êêê êêê èèèÿöööTTTú$$ÑËËëÇÇ99%âââÚÚÚ èèèvvvÿÍÍÍÕÕÕ‚‚‚~~~èèèÿ;9ÿ*ÆÆÆöööEC)Ùmûõ%éñ èèèÿööö555áááêêê&&&ÚÚÚòö  ë ñññù%ÛÿÿòòññññññÌÌÌÿööö/üúþçýÃ?þþçýÃòòòÿöööú(Áéú&éËó èèèÿ3ôñÁé ööö=þûÍ èèèÿ3ôñÚÿéë ööö=þûÚÿóõèèèÿ5 ôËó ööösE—Åîèèèÿööö èèèÿ99òòËËËCCòòËËË èèèÿööö ööö èèèÿ­©sÄÄËÊÌÒ»½æECi70—ÉÐÅÇðèèèÿ3ôñÁé ööö=þûÍ èèèÿööö=þûÃ=þûÍ þìëø öõ5Í èèèÿ5 ôËó ööö=þûà èèèÿi;;5.ÅËÒ»äsE;5.ÅËÒ­Öÿi;;5.ÅËÒ;5.R†¶sE;5.‘´ÁéòòòS*ÿ;5.ÅËÒ—Åîööö®zJÅËÒ»ä èèèÿ 8íç¾ èèèÿ99ëÇÇöööCCá½½ èèèÿöööú/- º¾ü èèèÿööö÷öí ÷ößûüÿ+++333ÍÍÍËËË555333ÍÍÍÕÕÕèèèÿèìÿöööòö  ÷òö  ÷ èèèÿš<\ݺmD7ÉûþÐýÿÃå½ èèèÿööö ööö èèèÿöööTTTú$$öÌ̼¼¼DDD 44ÑËËá½½ ‚‚‚ÈÈÈÒÒÒÚÚÚ&&&...888ÈÈȶ¶¶èèèÿöööEC64.…‰¸ ööö èèèÿööö555¬¬¬TTTáááËËËòÿAó±444ÿùããùòòÛÿÿããñññÌÌÌÿèèèÿèèèÿööö ööö èèèÿööö?þËó èèèÿèèèÿèèèÿ ôôôèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿ ôôôèèèÿi;;5.ÅËÒ—Åîööö èè輈XÿÅËÒ»ä èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿööö èèèÿööö èèèÿèèè{,RÿìÆööömD“â¼ èèèÿöööh ± IDAT èèèÿJJJËïïá½½ öööCC%ÆÆÆèèèÿèèè€ÿÿèèèbbbÿ¶¶¶öööTTTááá½½½444ÿùãã...ÒÒÒñññÌÌÌÿööö èèèÿööö èèèM&%ÿ³ÚÛK ÿ0…ìñK ÿ0 èèèÿ íìZ …ìñK ÿ0…ìñÿòòòÿööö èèèM&%ÿ³ÚÛM&%ÿ³ÚÛÿ íìZ  èèèM&%ÿ³ÚÛK ÿ0 èèèK ÿ0…ìñM&%ÿ³ÚÛÿ=þû0…ìñM&%ÿ/7š÷úÁèéòòòÿ÷ößûüÿn7š÷ú³ÚÛM&%ÿ×þÿêêêêêêêêê÷öA]^ëÄÃÔßßßûüÿòòòÿ íì÷èèèÿèèèM&%ÿ³ÚÛÿ íìZ  èèèM&%ÿ³ÚÛM&%ÿ³ÚÛ{ÿ…ìñ{ÿ…ìñÿööö=þûµô÷M&%ÿ/Ñüý³ÚÛÿèèè444ÿññññññôáã ñññÌÌÌÿòòòÿòòòM&%ÿ/M&%ÿÿÖùûÐøúÿÿÃÐøúöööÿ íìÉ0vvLÿÿÃÐøúÿÿòòòÿööö=þû íìÿÿÿM&%ÿ/M&%ÿ/ÿöööí ÐøúöööM&%ÿM&%ÿ/M&%ÿÿÃÐøúööö})ÿÿÖùûÐøú!ÿM&%ÿÿÿÖùûÐøúÿÿM&%ÿ³ÚÛf @^0F“4f nÿÿä{, Ñ„#!ÿÿn7 Y-¬œ:M&%ÿ³ÚÛêêêöõýáà÷öýáàÛ?þÈ ¿£¢.îê[%$M&%ÿòòòÿ¼ˆXÿööö3ôñM&%ÿÿÿM&%ÿM&%ÿM&%ÿ/ÿ íìÉ1,¦Aöööÿ/M&%ÿ|*(ÿ{ÿ²ÿ…ìñÿÿööö÷öÖùûÿM&%ÿ³ÚÛÑüý/M&%ÿM&%ÿÿCCCÿÖÖÖÿÿM&%ÿÿööö3ôñÿÿÿÿñññôËËËÚÚÚ»½æôôñññòòòK ÿÿÿÿÿ{ÿÿòòòM&%ÿ³ÚÛÑüý|*(ÿ³ÚÛÉ06G!M&%ÿÿÿÜ("6G!M&%ÿèèèÙ¼+ÒS:92ÿ M&%ÿÿM&%ÿÿÿÜ'5HJ÷ö ÿÿ÷ö!ÿßLÂÌU íì=þûÿòòò;,/¨úüM&%ÿ ì³!FIM&%ÿ|*(ÿj0 Ñüý/ÿÿÚH6G!})ÿ§û})ÿÿM&%ÿÉ1,6G!,!!×þÿ{ÿM&%ÿ³ÚÛòòòÿÿöõÿÜ'`N&Ÿ)K ÿmÿòòòÉûýÃÆù[ßã¥ÛÜ÷ö[œå4.[œåm’äæÃÆù³ÚÛ®zJø õÿÿí dï4.dïZ Ðøú’äæ/M&%ÿÿÿ®zJÿ?þÙ¼+{ÿK ÿM&%ÿ³ÚÛM&%ÿM&%ÿÿèèèÿ&&&ÌÌÌM&%ÿ³ÚÛ³ÚÛM&%ÿ/¨úüM&%ÿèèèÉåæ7ñ *ÿ „ÖØ/M&%ÿ/7É÷ùöööÿ²ÿ{ÿ39ì³!–Q*Ù¼+3ôñ³ÚÛn ö/M&%ÿ×þÿM&%ÿÿèèèÿÿà!ÿèèè³ÚÛM&%ÿööößLÙöööSQ(ÿ‰…VÿöööÛTTTÿôðòáááÛ=þûÛÑÓüåðòÿÖùû=þûööö©H ?þÐøú¦ñõ\$  Ýúüµô÷M&%ÿM&%ÿÿµ×¯=Cí ¦Ù²NϬ…Ô®…Ô®1×cñn ö/0”””ÿê5ÿí èèèK ÿÿ ½½½=þû">?÷ßûüÕÕÕ7Z]Í%(,-ûÔÓßûüí íì M&%ÿÿ)Ùžžž ÖùûœîðSQ(ÿÿÿí ÖùûÐøúÁèé_OOöööô.»½æëêÿÿêêê6.áã ———_†‡<=:+öf M&%ÿ³ÚÛöööí òòòòòò ÷ö÷òòò5 ³ÚÛcñòòò³ÚÛí ööö»äM&%ÿ³ÚÛcñ\œÊv¥í èèè­Ö„ÖØ/’äæn„ÖØööö ³ÚÛn’äæ/M&%ÿM&%ÿÏâáÁèé`N&÷ö»ä0{©=þû?M&%ÿM&%ÿ ¨IG•RQÍ ÿ |*(ÿM&%ÿ4.í Áèé»äÖùûÐøú®zJÿM&%ÿ íìËòóí Dx¨<4öööÑüý×þÿM&%ÿ íì5 èèè í í ÷öèèè5 ööö÷öM&%ÿ×þÿ?èèè?þsDÙ¼+?þòòòèèèÑüý×þÿM&%ÿí èèè­ÖIªå³ÚÛ÷öþæä ø í í þæäM&%ÿ Ãÿí í í ÌÓû­Ö³ÚÛ ³ÚÛÌÓû5 ³ÚÛÌÒâ‰ÄÅˉ»äø ÌÒâ 'Ck;,ÿÿôô÷öèèè5 í Ðøú?öööí Öùû3ôñ/M&%ÿ³ÚÛ $û÷ÿô¯y$555òòòCyÎÚÚÚñññÌÌÌÿÿFBjô3KM&%ÿM&%ÿM&%ÿ.-)ÿS…†S…†÷öK ÿM&%ÿ.-M&%ÿM&%ÿ„ÖØ„ÖØ³ÚÛööö ³ÚÛÑüý„ÖØ|*(ÿM&%ÿ³ÚÛü×ûÖùû\$ ƒ×ïòòòÿôô‚ñýþ¦ñõ)Ðøú×þÿ ÿ{,RÿÙûÓí M&%ÿ„ÖØ³ÚÛ’õ ’äæo!0êêêuYX3ôñìuc§ IDATa×ëÍ +++èèèÖùûèèè3ôñCCCÿMÑÕÁ¡ üÖÕûÔÓ³ÚÛ÷öí ÖùûëÄÃMtuÿöööé%ÿ„ÖØèèèí ÷ööö ÿCCCÿJJJ¬¬¬í Öùû=þûûÀ¼ÿìó.»ä÷ö]/ECëêF./-sEj¯Ö6ô¬¬¬ÿ¶¶¶‹ø¿ÆÕ š÷ú×þÿÿÿM&%ÿ?M&%ÿöööööö³ÚÛdí 5 ³ÚÛ³ÚÛÿ÷ö=þûêêêòòò³ÚÛ³ÚÛÿ÷öK ÿnÑüý{ÿ÷ööööÑüýn/n à ­Ö÷÷öí ûäÿÿ³ÚÛÑüý/M&%ÿ!ÿööök®¯•µ´cü÷÷ö )/ÑüýM&%ÿ4-—Åî÷ö÷ö*ÃÅËÒdM&%ÿ³ÚÛÿí ˜ÄÅ ÷ö=þûDx¨?,!!×þÿ)×þÿ/ÿööö{ÿ/M&%ÿ³ÚÛ)³ÚÛËó ¼øMßÔàøèèèM&%ÿ³ÚÛ)ÉÏÿ÷öK ÿí Öùûôôôööö=þû)Ã/ööö÷öööö÷ö÷ö=þûÿÿ÷öcü÷/M&%ÿ×þÿÿööö÷ö3ôñÿ³ÚÛ³ÚÛM&%ÿËó  ²Ú÷ö÷öÔàønÖÙj¯Ö'DÕCkÿöööK ÿÿ/sEq|O/ÿÿÿsD?þ, M&%ÿÑûä/„ÖØñåðÛù  ÄÌøñññ&&&ÚÚÚ444ÿFB íìÑÓö÷¼÷¬°î³ÚÛ³ÚÛ8Ù —ed÷ö÷ö*×ed.-8Ù.-³ÚÛM&%ÿM&%ÿ{ÿ÷öööö³ÚÛÑüý³ÚÛ)\$ ƒ×ï ìýþ[åìßûüßûü ³î ³îÙ)èèè {,RÿÐýÿôôô÷ö=þûÿM&%ÿ³ÚÛ³ÚÛÑüýÜ'$Ùð“úÿöõí Öùû èèè½½½÷>>>¶¶¶CCCÿµô÷ÕÕÕbbbÿÑüýÑüý³ÚÛÿýáàÁèétttTTTòòòSQ(ÿÛã÷ö3ôñ »½æ|*(ÿèèè555¬¬¬÷ö*07 rFEööö#ô6÷ö*ÈðäºÒü.6”¶Û.¡zyëÄÃÈÆ7Ëòóêêêööö ÷öÁèéùÿ÷ö=þûÿÿ’äæ÷ö/=þûí Öùû?³ÚÛZ ÖùûM&%ÿ„ÖØÑüý³ÚÛ¦ñõí òòò{ÿ³ÚÛÑüýÑüý/Ñüý’ôøÜ("èèèöööí ÷öòòòöööM&%ÿ/@^0¤d6,!!í ÖùûÐøú,!!Íf7ob3³ÚÛ³ÚÛÌÓûèèè÷÷öí ×Åî)/M&%ÿ ôôôí Ãÿ³ÚÛ³ÚÛ)³ÚÛ)[%$¥ÛÜM&%ÿööö÷öí Ðøú’äæní ³ÚÛM&%ÿÿööö÷öí ÿ³ÚÛ³ÚÛ­ÖZ Öùûòòòßûüööö÷ö÷ö6G!Wðë³ÚÛòòòòòò÷ö*ÿí í Öùûmí Ðøú³ÚÛ)³ÚÛÿööö÷öí cü÷K ÿM&%ÿ³ÚÛM&%ÿööö ²Ú„±, ?þí *?þí Ôàø, Ù¼+½•ÿöööí òòòí à íìÑüýû×þÀ¢ÐÑüý ÿ5 ô¼ø.ïþçýÿç/„ÖØM&%ÿ ÿùܸz0³á ÚÚÚ444ÿÌÌÌ&&&ÚÚÚÿÿÿŠ„ÿº¾üõÿÿ&é0M&%ÿM&%ÿ³ÚÛM&%ÿÈý'Ç—ø¦£ ÷öí Ã’„Ñu7ÒúÓ³ÚÛ³ÚÛ¦ñõí òòò{ÿM&%ÿ³ÚÛ)ÿ=þû > ÿ\$ `Mýáà/èèèÐýÿÃå½öööí Öùû3ôñÿ×þÿM&%ÿM&%ÿ³ÚÛcñm=þû !Öùû í èèèÿ+++žžžöööÕÕÕCCCÿ3ôñááá³ÚÛ³ÚÛÿ íìí í Z òòòòòòžžž­¯Øÿ÷öí Öùû3ôñ×'ÿ½½½¬¬¬÷ö*=þûÃ7 8p87ñññ*lJ%.òâÿè”¶Û–Q*Öùû³á M&%ÿq0ùÐ$ØÞÒ òòòèèè/í Ü'’õ í í Öùû=þû÷ö*n ö|*(ÿ!ÿí òòò!ÿí òòò!ÿ*µô÷ÿòòòK ÿÃòòò!ÿ*µô÷M&%ÿ³ÚÛ!ÿí =þûµô÷M&%ÿ/Ñüý×þÿêêê÷öí òòòM&%ÿ/Ñüý³ÚÛÿ÷ö*0©)³ÚÛÿ=þûÙýáàZ Ðøúµô÷M&%ÿÁèénœîðööö=þûÍ èèèÿ 5 Áèén„ÖØ!ÿ*Í èèèÿ=þûµô÷M&%ÿ³ÚÛ!ÿ*µô÷ÿòòòÿsEÌÒâÁé=þû4. ²ÚßûüM&%ÿ/ÑüýÁèé?þËó i; ²Ú*1Ñüý³ÚÛÿòòòÿööö÷ößûüM&%ÿ³ÚÛS*ÿÌÒâÁé?þ4.yn'DÕ[%$„ÖØS*ÿÌÒâËó èèèÿ5 ô4.­ÖM&%ÿ³ÚÛM% ÿÁé íì*Í èèè444ÿÚÚÚsE³á ÚÚÚ&&&ðððêêêòòòÿòòòÿ;9»½æ ööö÷ö÷<8ú(ÚÑüý³ÚÛM&%ÿ.-ÒúÓÁèé÷ö*0…ìñ{,RÿÒúÓ³ÚÛK ÿÃòòò!ÿ*µô÷K ÿ2ƒ×ï!ÿZ “úÿ÷öZ µô÷M! ÎãøÔßß[%$„ÖØÿööö÷ö÷ööö÷ö*Í èèèM&%ÿ³ÚÛ!ÿí öõø èèèK ÿµô÷ÿTTTžžžÿJJJžžž!ÿí hhh¢¢¢ööö èèèÿòòòÿ÷ößûüÿöööòòòÿööö=þûø7:ËËËrFE˸¶g 8$Ùðòòò444ÿMöÒþþ»½æÿF..Òþþáã ÌÌÌM&%ÿf :+öÆÕ :+ö+¾÷èèèÿÒ$Ùð?Áèé öööòòòÿ÷ö,!!ù$ÙðÜ'Ëâÿí òòòßûüÿí µô÷òòòÿà ÷ÃK ÿ³ÚÛÿ* ÃÖùû³ÚÛ„ÖØ³ÚÛôôôí ÷ö³ÚÛ„ÖØ³ÚÛÿí ÖùûÐøúôôô³ÚÛ³ÚÛ Öùûí ¦ñõµô÷³ÚÛn?¨úü íì=þûÍ èèèòòòööö³ÚÛn?„ÖØÿí Öùûèèè Öùûÿ³ÚÛÿí µô÷òòò?þ³ÛôòòòÖùû³Ûô, ³ÚÛÑüýÁèésE ÌÒâ, ÃÑüýÑüý³ÚÛM&%ÿÿM% ÿsEòòòèèèòòò`N&M% ÿK ÿ³ÚÛM% ÿ;5.wpc;5.ÌÒâ³Ûô /ÔàøþçýúÁå¹nü–Q*Ñüýÿ;5.èèèèèè;5.³ÚÛ³ÚÛM&%ÿ³Ûô öööí Öùû3ôñÌÌÌòòò³á ÚÚÚðððêêê555444ÿòòòèèè­¯Ø öööí íìÐÔ(ÚÑüý³ÚÛ³ÚÛÒúÓ³ÚÛí ÖùûÐøúÒúÓ³ÚÛÿà ÷ÃK ÿ§û!ÿßûü*"úø ÐøúK Îãøµô÷³ÚÛ[%$Ñüýèèè=CZ'Nèèè Z'NÍ èèè³ÚÛÿø è2Ji IDATèèèÃK ÿ žžžööö¶¶¶ßûü èèèòòòTTTèèèÿECòòònßûüèèèòòòöööVYËËˤÐÑÖùû™ïóa×ëÂðÂðÒþþÈðäF.ÒþþÂð³ÚÛ`Ì7`Ìèèèööö.ãúnÁèé  $ÙðÜ'’õ K ÿÖùûßûü!ÿí òòòÿ÷ößûü!ÿZ …ìñÿ3ôñÖùûßûüÿööö÷ößûü!ÿí êêê=þûµô÷ÿèèè{ÿÐøúÍ  êêêm…ìñÿi;£ÑúMö­Öÿ íì*Í ööö=þûÍ èèèÿööö÷ößûüÿööö=þûµô÷ÿöööòòòÿöööòòòÿ÷ößûü!ÿZ …ìñÿ3ôñÃòòò!ÿ*³ÚÛÿ÷öZ  ööö÷ö÷èèèÿ íì*Ãòòòÿ÷ö*Í èèè!ÿ`N&;5.‘´³Ûôÿ )Áèé÷ö*1„ÖØÿ÷ö ôôôööö÷ößûüÿèèèÿêêê÷ößûü444ÿÚÚÚêêê&&&ðððÌÌÌÿFBÐÔ'èåÍ èèèÿ£qpi›œ‡UTEwxÿ3ôñÖùûßûüÿööö÷ößûü!ÿßûü!ÿ*åüýôêêê 'èåµô÷ÿ÷ößûü!ÿ*µô÷ÿýáàí òòòK ÿµô÷ÿ+++½½½K ÿÍ +++½½½M&%ÿÁèé?³ÚÛÿ?³ÚÛé%ÿy=EžžžSQ(ÿ64.w{ªÿrFEŽº»¨IGk®¯*ÃòòòCCCÿñññôðòåºÒüè8áã ñññÌÌÌM&%ÿ×þÿ)³ÚÛM&%ÿ³ÚÛÿ ýáàí òòòÿXÑüý³ÚÛÿööö=þûÍ ööö÷ößûüÿèèèÿööö=þûÍ ööö÷ößûüÿèèèÿööö ööö÷ö÷èèèÿ íìí ööö÷ößûüÿööö÷ö*Ã÷ö*Í èèèÿööö÷ö÷ööö÷öZ  èèèÿööö ööö èèèÿööö=þûà ööö÷öZ  èèèÿ÷ö÷ööö÷öZ  èèèÿööö=þûÍ ööö÷ößûüÿèèèÿ3ôñËøúø ööö=þûÍ èèèÿèèèÿööö=þûÖùûí =þû0“úÿòòòÿööö÷öí ööö÷ö*Í èèèÿ íì*0 ôôô5 ô4.;5.‘´Áéòòòÿööö÷ö*Ã=þûà èèèM% ÿÁé ööö=þûËó èèèÿ&&&ðððÜÜÜÿ&&&ÌÌÌÿþìë5Ã÷ö÷èèèÿööö÷ö÷ööö÷öZ  èèèÿööö ööö÷ö÷èèèÿööö=þûÃ=þûÙôôôèèèÿ÷ö÷ööö÷ö÷èèèÿ3ôñÃêêê èèè!ÿ÷èèèK ÿÍ JJJ¶¶¶èèèK ÿÍ JJJááá½½½ÿ=þûÍ ööö=þû0…ìñÿ;9)ÙœîðöööEC64.…‰¸ èèèÿööö555áááêêêrFE¡±±*à ñññôÈðäòâ6 ññññññÌÌÌM&%ÿ³ÚÛÿ÷öí òòò!ÿí òòòÿööö÷ö*à èèèÿööö=þûà èèèÿööö ööö èèèÿööö ööö èèèÿööö öööòòòÿööö÷ö÷èèèÿööö ööö èèèÿööö÷öí ÷öí èèèÿööö ööö÷ö÷èèèÿööö=þûà èèèÿþìëø öõ5Í èèèÿööö÷ö÷ööö÷öí èèèÿööösEp71ÉÏ»ä ööö 5 ô¤eOËþýÅËÒ—Åîi;»ä=þûq|OR†¶sE;5.‘´Áéòòòÿ÷ö÷ööö÷öí èèèÿ3ôñà èèèÿööö èèèÿööö÷öZ  èèèÿööö÷ö÷èèèÿööö ööö èèèÿcü÷Ðøú0“úÿm“úÿ=þû0“úÿ èèèÿš<\ݺmD7ÉûþÐýÿÃå½ èèèÿööö÷öí ööö÷ö÷èèèÿööö +++¬¬¬ +++“““ŒŒŒ¶¶¶èèèÿööö÷öí ÷ö*Í èèèÿöööEC64.…‰¸ ööö èèèÿööö555¬¬¬ JJJáááÞÂÁí èèè444ÿôáã ôðòÊàáF.áã ñññÌÌÌÿèèèÿèèèÿööö öööòòòÿòòòÿööö èèèÿööö èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿ ôôôèèèS*ÿ;5.‘´Ëó ¤p@Dx¨¼ˆXÿÅËÒ»ä èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèè{ÿ“úÿm èèè{,RÿìÆööömD“â¼ èèèÿgŠé IDATööö èèèÿööö èèèÿ€ÿèèèÿèèèbbbÿ¶¶¶èèèCCCÿ¶¶¶öööòòò444ÿôáã Ùïð'ñññÌÌÌÿèèèÿèèèM% ÿþçý³Ûô!ÿ*³ÛôK ÿ³Ûô¼ˆXÿhœÌ)è4- ÌÓö³Ûô!ÿßûüM% ÿ³Ûô})ÿƒ×ï0P'ÿаÙ0P'ÿаÙ444ÿñññññññññìóå ñññÌÌÌK ÿM% ÿM% ÿRÿM% ÿTPÿK ÿþçý>yMocLM% ÿK ÿM% ÿK ÿM% ÿM% ÿS*ÿM% ÿRÿS*ÿM% ÿìýþÀÝöK ÿ¼ˆXÿÿK ÿ6G!6G!þçýñŠ[ÿ)èÌÓö4- M% ÿ¼ˆXÿ!ÿ`N&M% ÿ³ÛôM% ÿƒ×ïM% ÿRÿ0P'ÿаÙÿÿM% ÿÿ})ÿ·VÿÿM% ÿbbbÿbbbÿ~W…ÿ~W…ÿññññññìó#ôìóìóñññK ÿM% ÿM% ÿS*ÿ·V.ÿ·V.ÿK ÿlJ%ocLM% ÿK ÿj1";6BM% ÿ¼ˆXÿ¼ˆXÿM% ÿj1"h8FM% ÿ€TSÿ¼ˆXÿ¼ˆXÿ€TSÿK ÿÖùûøÎÔ‘´ØþüK ÿ-FM% ÿK ÿlJ%ocLM% ÿ4.K ÿf M% ÿ4.!ÿ@# 4.@# Âöù!ÿ¼ˆXÿS*ÿS*ÿ!ÿ íì;5.ÿñŠ[ÿhœÌ4.4.K ÿ<;5ñŠ[ÿ¼ˆXÿS*ÿ, Gp`N&!ÿ})ÿþçýK ÿ³ÛôK ÿÔD¬ÿ;M% ÿ0P'ÿZ40P'ÿ0P'ÿZ4{,RÿM% ÿRÿRÿ{,Rÿÿÿ íì ÿ!ÿ!ÿ!ÿ!ÿM% ÿj1K ÿ íìÐüûÆÓö5 ô·Vÿ})ÿj1M% ÿbbbÿ¶¶¶c_)SQ(ÿ‰…Vÿ~W…ÿkΘä ÝñññÝ ä#ôÝ äAA#ôÝ ä#ô½‡2ÿS*ÿÁéã+M% ÿS*ÿ<4M% ÿ”¶Ûj¯ÖûÎÖ³Ûô¼ˆXÿlJ:4-5×ÿñŠ[ÿM% ÿ„±„±­œ#2*<;5³Ûô€¬­˜ÄÅM% ÿK ÿ>yM,ÒþþØþüdbNM% ÿTPÿOŽ‘,-Ûÿÿ³Ûô-QQÿ2*Ôàø­Ö!ÿ0Î$³Ûô!ÿ­Ö¼ˆXÿS*ÿK ÿ=VÌÒâMuŽ, !ÿÅËÒ;5.;5.‘´*ÌÒâe}¬3ôññŠ[ÿ92Ëþýÿäp71ÚÿSI|92ñŠ[ÿ ÿ!ÿÔàøç¹ ²Ú, !ÿÿÐüûÍ K ÿOŽ‘ *×ÿ-QQÿ!'Pÿ0P'ÿZ4ÉÍù0P'ÿfm0P'ÿM% ÿ{,Rÿª÷¶ÌÓöÌÓöÒùº{,Rÿÿ íìÞhMÿ IDAT í õÿÿ!ÿÿÆÓöÿK ÿ*ÔàøÐüûþçýÆÓö:- M% ÿ0žžžqm>ÕÙšššÿCCCÿÊÌÒðŒŠÿÿÑþÿ±u}888vvvÿìó#ôÝ äÝ äV'ON(WN(WAÝ ä#ôÝ äA½‡2ÿÄÌø—ÅîK ÿPvG.4.ã+­ÖÔàøK ÿÅÔú”¶ÛM% ÿK ÿ¼ˆXÿM% ÿ·V.ÿ„±K ÿ–Ïñ‹ ÍZ‚®)èZ‚®·V.ÿM% ÿ%#ÿSdÝÀ¢ÐUbM% ÿM% ÿM% ÿM% ÿM% ÿRÿÿ!ÿK ÿÄÌû‘žÍ3ôñM% ÿM% ÿØþü‡³.. ¥rei70dbN‡³ùÕúTPÿK ÿ|ji²Ôþ»¸M% ÿK ÿ%K ÿÀ¢Ð„±, ­Ö, !ÿK ÿÒýû×þʹßM% ÿK ÿ!ÿ, ­Ö;5.!ÿK ÿÖùûìýþ¿£¢Ôàø±ro> Ôàø*!ÿ;5.e}¬S*ÿ=:ÔàøÖùûÖùûÔàø, ÖùûK ÿS*ÿ92‰i›°&éØþü ²ÚÉÏ ²Ú(Úÿ‰92¼ˆXÿDx¨;5. ÿ*ʹß, þçý*!ÿÿ5 ô³ÛôM% ÿ3ôñŸ)þçý})ÿM% ÿM% ÿRÿK ÿ³‹rôÖÿ»¸)軸 *M% ÿÉÍùClfm #$ÿ0P'ÿ0P'ÿŠKífm #$ÿ0P'ÿZ4%#ÿM% ÿ¦Ù²(­œ#j1"­œ#ÔàøRÿÿ õÿÿWðëä{ !í õÿÿõÿÿ íìÿ:- eùþçý*þçýÐüû–Ïñ0ÿÆÓöÐüûšššÿCCCÿ‰…Vÿbbbÿ›ŸÎÈÈÈšššÿÅÁ‹ÿŠŠŠ‚~HSQ(ÿM% ÿúÕýSQ(ÿé%ÿ|*(ÿtvÿf?m¿¹ŠÈÈÈtttÿÿÿñññA666¶¶¶———N(WAÝ ä>5.ÂËÒÝ äbbbÿM&%ÿM&%ÿM&%ÿvvvÿ444ÿÄÌø—Åî5 ôK ÿÒÌÒï¡·¼âM% ÿ444ÿÄÌøßûüÖùû÷Öùûþçý;,ÖùûÔàøM% ÿK ÿlJ%Dx¨”¶ÛÖùûÖùûþçý;,ÔàøÖùû”¶ÛþçýM% ÿ³Ûô³Ûô;,+M% ÿ%#ÿ4.ocLM% ÿM% ÿ})ÿM% ÿ¼ˆXÿM% ÿ4.ocLÌÓö¼ˆXÿM% ÿ€TSÿ¼ˆXÿÿ3ôñËøú¡±±ÁèéÔàø%#ÿ¼ˆXÿ€TSÿÿØþü&éþçý>yMi70‘ÂÉ—ÉМž²q|OocLþçýùÕú-QQÿK ÿÿÖùûN,Öùûþçý!ÿϳ²Öùûþçý;,ÖùûÔàøM% ÿÔàø*Öùûþçý;,ÔàøÖùû*ÔàøDx¨ÅËÒ, ÖùûìýþìýþÖùûßûüÖùûe}¬ˆ‘Ë*ßûü**ÔàøK ÿÄÅËʹß&éÚÿ(*ʹß, 4- ØþüʹßÄÅË5e}¬ìýþÖùûÔàøÂöùÖùû S*ÿ¼ˆXÿ5 ôþçýK ÿ!ÿK ÿÖùûa×ëÖùû})ÿ›ïŠ„ÿTPÿM% ÿÿýÇÿM% ÿnd|²Ø»ÌÓö!'PÿÖùûþçý *ÔàøÖùû»¸þçýM% ÿ0P'ÿZ4ÉÆ÷wfîR` /3ÝÓý?{ ÉÆ÷F.Z4¦Ìø(Øþü*ØþüMßÄÖ$½•ÿ*Òùº¤ÑòM% ÿÿ÷öõÿÿõÿÿø “úÿ…ç !í ßûüèèèËó –ÏñÐüûËó þçýþçýËó ÐüûeùÐüû³Ûô©©©WWWCCCÿbbbÿº¾íÂÂÂRRR'#ôïë¼os©>>>CCCÿšššÿé%ÿ)ÙþçýúÔä+úÕýÛã6óîvvvÿM% ÿÿÿ5 ô͵„¬¬¬=þû3ôñׯ–5 ôìóŒ]…Þ >5.áááîîîN(WŒ]…å M&%ÿÒÒÒ_†‡M&%ÿM&%ÿ4-M&%ÿ_†‡×°¯á8+++þçýõÓáþçýM% ÿá8ßûüèèèßûüõ»ßÔàøK ÿÖùû”¶ÛþçýÖùûßûüßûüõ»ßÔàø, Öùû³Ûô³Ûô&éØþü–ÏÞØþüùÕú+S*ÿK ÿ(;5.þçýM% ÿS*ÿ})ÿi2I9.D³/ÿM% ÿ4.‘´K ÿÅËÒ%#ÿ‘´4.M% ÿ<43ôñÖùû÷ *?þþçýüâüK ÿ<4èèèÛÝøEq|O3—ÉИ€®Î´Üüâü—ÉÐ<;5q|OþçýM% ÿ%!ÿ íì*ø IJ±Öùû*K ÿÖùû*õ»ßÔàøK ÿµô÷ßûüõ»ßÔàøßûüßûüµô÷­ÖÔàøßûüìýþÖùûßûüßûüßûü­Ö­Öµô÷*ÖùûþçýÖùû ÔàøK ÿÌÒâi›°µô÷ÛÝøØþü4- ÌÓöÛÝøÛÝøÚÿ‘´ËþýóþþßûüÖùû* ìýþýáà;5.Dx¨M% ÿM% ÿK ÿ³Ûôµô÷µô÷*lJ%Ù M% ÿ›ïèèèK ÿŒ€æM% ÿŠ„ÿŠ„ÿM% ÿnd|N(EK ÿ¼ŒÁM% ÿ!'Pÿ *K ÿÿõÿÿÃ?À¼Ôàø, Öùû³ÛôÉÍù­¯ØR` Å¡÷}a î£øÑÍúÝÿÿÉÍùÉÍùаÙØþü&éÖùû&émDÐà·”Ó#þçý(öõí  !êêêöõWðëø êêêÿèèèËó èèèµô÷ÖùûÔàøµô÷èèè³ÛôÐüûËó ½½½fffWWWžžž½½½RRRÍÍÍ#'Vw{ªÌÌÌžžžÕÙ½½½fffÛã„ÖØÔàøúÔä³ÚÛNãꢢ¢ ð ðþçýÖùû=þûúÃØþüJJJN(Wîîî333Þ Œ]…²Ø©ìó³ÚÛMöˆˆˆ_†‡q7 pa ¡zy4-ñññááá âɵô÷³ÛôÚÿþçý&éµô÷þçýžžžÿòòòÿ íì*µô÷ÿòòòÿèèèK ÿÚÿ&é+ùÕú³ÛôS*ÿ;5.„±þçýÚÿ(þçýocLÅËÒ­Ö¼ˆXÿDx¨M% ÿ¤eOŒŸ¶ƒ×(XÿDx¨M% ÿÔàø, Øþü&éÖùû, þçýÚÿüâü, ³Ûôÿ íìßûüÿ *³Ûô!ÿ*µô÷‰…Vÿ3Dx¨!ÿí /-64.Ä ¶³Ûô!ÿ*µô÷ÿ©H W¸óòòò!ÿ*µô÷M% ÿ4. ²ÚìýþtP<4 BsÉ!ÿ`N&­Öÿòòò!ÿßûüÿ=þûµô÷ÿööö 'èå6G!­Öÿ3ôñÚÿ&éËó èèèM% ÿ³Ûôÿòòò!ÿßûüOU„ÿ±«|ÿ íì*6F În±«|ÿ3ôñ³ÚÛÿ3ôñËó èèèK ÿÚÿ(+ùÕú³ÛôM% ÿÔàø, Øþü&éÖùû, 4- ¤ÑòÛÝø!'PÿÞ´õÿÿêüýÿòòòÿèèè0P'ÿаÙ ÿ&9#—oŒ’ﭯؖ½6ÿ½”òCljCÊK ÿÖùû*Öùûßûüÿ èèè!Ô© IDATÿööö ööööõèèèèÿ=þûÍ èèèÿ555ñññÌÌÌCCCÿ½½½K ÿEø»áµô÷%#ÿ(×ÿêêêöõ õÿÿ í òòòM% ÿ³Ûô O'ÿå ìó>5.N(Wt£{V'O666îîîÄê»ÂËÒB;JJJ²Ø©Ö°ßìóà±ÙS*ÿ<4ÄÌø<4Ÿó³ÚÛÿòòòM% ÿ³ÛôK ÿµô÷ÿèèèK ÿþçýµô÷ÿ0,îùÕúocL<;5=sM% ÿ³Ûô!ÿ*Úÿ(þçýµô÷K ÿþçý06šöõ0ƒ×ïM% ÿþçýÚÿüâü&éÖùû(þçý³ÛôK ÿµô÷ÿòòò!ÿßûüK ÿ+¬°îK ÿµô÷!ÿ*µô÷S*ÿ ²Úìýþ> µô÷!ÿ`N&;5.Dx¨K ÿþçýµô÷ ÿìýþ> Ôàøßûüÿ3ôñÖùû, Ëó èèèS*ÿ­Öÿ3ôñÃsD—Æèèè!ÿ, ³Ûô!ÿßûü!ÿì ,ßÙ°K ÿr{)úÏüIªÒK ÿµô÷K ÿÚÿ(Áé=þûµô÷M% ÿþçýÚÿüâü&éÖùû(4- ÌÓö³Ûô!ÿßûüK ÿþçýµô÷0P'ÿаÙ0P'ÿÝÓýëêü ööéüSQ(ÿ 2¡}ÓK ÿÖùû*Öùû*µô÷ÿèèèÿööööõèèèK ÿÖùûßûüK ÿ³ÛôšššÿtttòòòÿECδÜ, ³ÛôÿèèèÿöööòòòCCCÿÝ ä>5.ÂËÒ>5.N(W¶¶¶ü"óÂËÒ>5.ÂËÒå ÌÌÌM&%ÿob3ÿÚŸó×þÿ)³ÚÛK ÿØþüñáû5Úÿ(³ÛôK ÿK ÿèèèK ÿ éÿM% ÿM% ÿ?þ=þû?þ0,îùÕúþçýDx¨=s³Ûô*ÃéëÁéÚÿ³Ûô0šöõ³ÛôÐüû³ÛôÛÝø*üâüÚÿ, &éþçýµô÷³Ûôµô÷K ÿ÷ö=þûú=þûM% ÿßûüK ÿþçýþçýùÕúµô÷!ÿ*ÖùûK ÿ­Ößûüóþþ> K ÿßûü ²ÚDx¨K ÿ éÿM% ÿÔàø*!ÿÿ3ôñÖùû**3ôñÿ­Öÿ3ôñ?þú=þûúÌÓöi:þ!ÿ*ìýþìýþþçý!ÿßûüßûü*>éå,þ¼÷ñÈK ÿÿ&1K ÿµô÷(4- òòòµô÷³ÛôÛÝø*üâüÚÿ, &éþçýÌÓö»‰ˆÿßûüßûüK ÿ éÿM% ÿаÙ_ƒ-ÿ0P'ÿÝÓýR` ü ö&9#SQ(ÿ­¯Ø¡}Ó¡}ÓÚÿ*Úÿ*M% ÿèèèÿöööø þìëÖùû, Í þçýM% ÿbbbÿŠŠŠ ŒŒŒ&&&ÿòòò?»½æí ³Ûôèèèööö=þû÷ö=þû÷öÿñññ#ôÂËÒB;ÂËÒîîîJJJÞ ÂËÒ#ô³ÚÛÅËÒ4-)³ÚÛ(5Úÿ&éØþüM% ÿ!ÿåüýÈ÷ùþçýÚÿK ÿ!ÿããúÈ÷ù4- M% ÿK ÿ+Úÿ+ùÕú+?þ=þûúØþü(M% ÿ³ÛôÁé‘åý›ïËó ³Ûô³Ûôí éëÁéÃÃK ÿÚÿ*Öùû&éþçýÿÚÿÚÿþçýÚÿ+!ÿ*åüýþçýÚÿK ÿ!ÿåüýÈ÷ùþçýÚÿK ÿßûü!ÿããúÈ÷ù4- M% ÿ ÿ, *Öùû**ÿ3ôñ6G!*ÖùûÖùûþçýÖùû3ôñM% ÿ­Ö3ôñØþü&éÚÿ&éØþüRÿRÿ!ÿ*ÖùûÂöù, !ÿOU„ÿ!ÿ!ÿÖùû*×ÿ íìOU„ÿK ÿÙÖùûûÎÖŽ…×µô÷!ÿ})ÿÃÁé¼øµô÷³ÛôÃí ’3¥dÃÃ×ÿEwx!ÿããúÈ÷ùþçýM% ÿ_ƒ-ÿ¡}ÓаÙR` ÑÍú&9#/30P'ÿ­¯ØM% ÿ(4- M% ÿÿÿöõòòòòòòêüýÿÿÿÿ\$ ³Ûôèèè0áááèèèfff‘WJJJ€TSÿ+òòò‰…Vÿÿ÷öÖùûõÿÿÖùû, öõ#ôÝ ä#ô¾íÅzKsÄê»¶¶¶¾íÅ#ô#ôS*ÿpa ÌÓûŸóÌÓûpa 4-M&%ÿM% ÿØþü&éÚÿ&éM% ÿK ÿ*Öùûñýþ&éÚÿK ÿK ÿ*Öùûñýþ, þçýÌÓö4- K ÿ D ùÕúØþü&éÑÓöØþü+M% ÿK ÿþçýÖùû&é\0"ocL¼ˆXÿK ÿM% ÿ=þûo3ôñeù³/ÿ})ÿ¼ˆXÿK ÿ=þûú=þû?þsDM% ÿÿÚÿüâüÖùûõÿÿÚÿþçýÚÿM% ÿ3ôñ(þçý&éÖùû&éùÕúTPÿK ÿ*ÖùûñýþõÿÿÖùû&éÚÿK ÿK ÿ*Öùûñýþ&éÚÿK ÿK ÿ*Öùûñýþ, þçýÌÓö4- ìýþþçýÖùûÖùûþçýK ÿèèèq|O;5.µô÷ßûü*Öùû*þçýÿþçý(Úÿ(Úÿ(ÌÓöÌÓöÌÓöM% ÿÖùûìýþìýþþçý, !ÿ±«|"Lßûü÷Öùûþçýýáàßûü±«|K ÿÍ ”¶Ûµô÷ßûü¤ÜóM% ÿK ÿ=þû?þúM% ÿK ÿ=þû=þûnÍíYƒâ?þsD)è³ÛôK ÿ*Öùûñýþ, þçýþçý0P'ÿ_ƒ-ÿ¡}Ó_ƒ-ÿ7: аÙòòòаÙÑÍú/3Øþü(4- Øþü4- ÌÓö4- ~™ÁÞ IDATÿêüý êêê öööòòò3ôñÐüû³Ûô½½½WWW¡×žžžüÖÕ­¯Øòòòw{ªSQ(ÿöööõÿÿõÿÿ÷þÿìýþþçý7! ööö#ôÝ äÈÈÈò!ü"ó#ôÝ äÝ äÌÓûÄÌø×þÿ³ÚÛŸó­Ö³ÚÛ³Ûôö7=V&éþçýËøúñáûç(ö7K ÿåüý*ßûüµô÷Öùû&éM% ÿK ÿåüý*þçýþçýÌÓöK ÿùÕú(Ù&é&éÑÓöùÕú+M% ÿK ÿÙ Ù£ÑúÅËÒ³ÛôDx¨q|Oþçý§ûÙÐüûÊúú?_GDx¨Úÿ&éØþü¤Ñò4- ÿÿ3ôñüâü*õÿÿ &éËøú&éK ÿK ÿÚÿ*ØþüùÕúM% ÿK ÿåüý*õÿÿÖùû&éM% ÿK ÿåüý* ÙÖùû&éM% ÿK ÿåüý*þçýþçýÌÓö ÿìýþ÷þçýÖùû!ÿÿ=:ßûüµô÷ßûüÖùûþçýK ÿèèè6G!4.6G!þçý((×ÿ4.¤eO¤eO4.ÿ÷`N&tQ(ìýþÖùûÔàø ÿßÙ°èèèßûüµô÷"LOU„ÿµô÷3ôñÿäßûüµô÷M% ÿ÷³ÛôÚÿþçý(þçýM% ÿÚÿ&éØþü¤Ñò4- K ÿåüý*þçýþçýаÙ¡}ÓjCÊ/3¡}ÓM% ÿ(4- ÌÓö(ÔàøÌÓö4- ÌÓöM% ÿèèè èèèèèèòòòÿ2ÐüûM% ÿfffbbbÿc_)SQ(ÿ:--‰…Vÿ÷þÿ> ÖùûþçýöõÿñññÝ ä#ô#ô¾íÅ666Þ #ôñññ#ôñññ#ô³ÚÛÌÓû)³ÚÛ³ÚÛ444ÿS*ÿžžžµô÷µô÷5Éß÷ØÕ>çbbbÿÿèèèÿŸ>–ÏÞËó ööö©H –ÏÞÁé èèèÿŸ>–ÏÞËó ööö©H :4-ÆÌÓaÂêèèèÿèèèÿ¤p@‘´Ëó ööö®zJÅËÒ—Åîèèèÿ¤p@ÅËÒ»ä èèèÿ êêê èèèÿ ð&éÚÿ(Øþü(þçýÚÿ(Ëó èèèÿrFE<4ÄÌû˜ÄÅööööõ¦„U\Àèèèÿqm>ÊÌÒ»½æ?þØþüéë=þû>yM<<5SWèèèÿèèèÿ:::ûÓºËó öööDDDÛÿÿá½½ èèèÿŸ>–ÏÞËó ööö©H –ÏÞÁé èèèÿi;ÌÒâËó ööö?þ4.—Åîèèèÿööö÷ö*Öùûí ÷ö`N&;5.ÅËÒ­ÖS*ÿxo5ÃÆùDx¨ÿööö ööö©H 2*Dx¨¼ˆXÿÅËÒ—Åî ôôôi;p71ËþýDx¨ÿööösE;5.R†¶sE»ä èèèÿööö èèèÿ5 ôËó èèèÿ3ôñÍ èèèK ÿÍ <8úÄÈèèèÿ ð&éÚÿ(Øþü(þçýÚÿ(Ëó èèèÿèèèÿ 8÷ñÈöööB *ëÇÇèèèÿGk¡}ÓÿGk¡}Óÿööö=Cã¸HÍïÇèèèÿ5 ôj1ÆÓö›ïeù:- aÂýèèèÿ‚‚‚ÈÈȶ¶¶‚‚‚~~~èèèÿ;9ÅÇð3ôñÃ=þûg ¡4ÅÇðèèèÿööööõ÷þÿõÿÿø 555ËËË ñññìó#ôÝ äB;áááññññññÌÌÌÿèèèÿi;£ÑúôôôèèèS*ÿ³á ÌÌÌÿŸ>–ÏÞÁé èèèÿŸ>–ÏÞÁé èèèÿ¤p@ÅËÒ»ä èèèÿ5 ôËó èèèÿèèèÿööösE»äsE—Åîèèèÿööö ööö èèèÿ­©sÄÄËÊÌÒ»½æECi70—ÉÐÅÇðèèèÿ:::Ûÿÿá½½ èèèÿŸ>–ÏÞÁé èèèÿi;ÌÒâÁé èèèÿ5 ô4.ʹßà èèèÿi;;5.ÅËÒ»äsE;5.ÅËÒ­ÖñŠ[ÿËþýÅËÒ»ä ööö®zJ<;5ùÇÎ'޽èèèS*ÿ;5.ÅËÒ—Åîööö®zJÅËÒ»ä èèèÿööö èèèÿ3ôñþçýÃ=þûÍ èèèÿöööú/- º¾ü èèèÿööö­{zS…†­{z]èèèÿ99á½½ èèèÿöööQu¯‹áQu7: ÉÆ÷¯‹á èèèÿööömD“â¼mDìÆèèèÿèèèÿööö èèèÿ5 ôj1ÆÓö‘åý?þj1ÆÓö:- aÂýèèèÿööö ööö&&&...888ÈÈȶ¶¶èèèÿöööEC64.…‰¸ ööö èèèÿööö555¬¬¬555ËËËòòò444ÿìóå ìó#ôÝ äB;ÒÒÒñññÌÌÌÿèèèÿi;—Åîöööòòòÿi;­Öÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿ5 ô4.—Åîèèèÿi;;5.ÅËÒ—Åîööö èèè444ÿÄYùÇÎ92‰—Åî ôôôöööêµùÇÎ92ùÇÎv¥ÿèèèÿèèèÿèèèÿèèèÿèèèÿèèè_ƒ-ÿ¹•ëGk¡}ÓÿGk¹•ëèèèÿèèè…êfª IDATÿèèèÿèèèÿèèè€ÿÿèèèÿèèèbbbÿ¶¶¶èèèvvvÿìììžžž444ÿìóB;ÒÒÒñññÌÌÌS*ÿ—Åîèèèÿööö èèèS*ÿ­Ö444ÿðððáááÌÌÌ444ÿñññÌÌÌSQ(ÿÑÓü/-­¯Ø444ÿÌÌÌ444ÿíÑÐ/0ÌÌÌ444ÿðððÜÜÜM% ÿþçýç(ÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿíÑÐ/0ÌÌÌ444ÿÌÌÌ%#ÿÛÝø444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿGø¹âÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿññññññ!Påß°ñññÌÌÌvvvÿŠŠŠÌÌÌñØ âÉÌÌÌ444ÿIõÝ:æÎ444ÿúÁ<ÿúÁ<ÿ444ÿ444ÿ444ÿ444ÿ‰…Vÿáã :‰…VÿRRRÿxxxxxxRRRÿM% ÿM% ÿ444ÿ{ÿ})ÿ¼ˆXÿˆT$íÑÐËU.íÑЈT$¼ˆXÿÌÌ̼ˆXÿM% ÿ4.6G!ˆT$444ÿÌÌÌ444ÿCCCÿ444ÿÌÌÌ!ÿÚÚÚˆT$ÄYS*ÿ444ÿíÑÐËU.íÑÐ444ÿMö444ÿM% ÿÛÝøM% ÿ444ÿxxx¢¢¢ÌÌÌ444ÿ444ÿÿÌÌÌ444ÿ444ÿ444ÿÌÌÌ444ÿ444ÿGøÌÌÌõ#ЫÔ)2jÈÉ444ÿÌÌÌGø444ÿKX¾ÿbbbÿ444ÿÚÚÚÚÚÚ444ÿ444ÿÌÌÌ444ÿ444ÿñññ!P!P!PñññíZ!ÿ=¹¡vvvÿM% ÿM% ÿvvvÿíZ!ÿˆT$4.4.ˆT$ˆT$**:æÎÌÌÌCCCÿñŠ[ÿúÁ<ÿ‡’î÷É444ÿ...444ÿÌÌÌ444ÿ444ÿ444ÿ444ÿðððCCCÿ444ÿððð444ÿ¼ˆXÿ€TSÿ€TSÿ¼ˆXÿ¼ˆXÿ€TSÿ¼ˆXÿ€TSÿ444ÿ‰…VÿÊÌÒñØ>çëêÊÌÒ¼ˆXÿbbbÿRRRÿÒÒÒxxx¡zy¦¦¦ÒÒÒ-QQÿ444ÿM% ÿ4.4.ÌÌÌS*ÿ})ÿ*})ÿS*ÿS*ÿ, •ùø, S*ÿMöÿÁé;5.×ÿÅËÒˆT$µ€Jÿ`N&sEe}¬ÄÅË;5.ÄY¼ˆXÿbbbÿ`N&²¢Ë, bbbÿðððMöM% ÿØþüM% ÿ%#ÿ³Ûô444ÿ444ÿCCCÿ-QQÿxxxXz¤W{{444ÿê444ÿÚÚÚËËËÚÚÚ444ÿÌÌÌvvvÿbbbÿøòp,×αY‡Úñvvvÿ444ÿÿCCCÿvvvÿCCCÿbbbÿµÈþéö\‰…VÿSQ(ÿÚÚÚ=J°&&&ÚÚÚÌÌÌ444ÿBBB444ÿ!P Aôî¿CC A Aôî¿ôî¿ Aôî¿ÆÕöÊúúŠŠŠM% ÿÔàø4.M% ÿŠŠŠÆÕö·V.ÿ¼ˆXÿ\Àp71p71\À¼ˆXÿ·V.ÿ¼ˆXÿS*ÿ\Àp71p71›ïCCCÿñŠ[ÿÉÏóp7192ÿ444ÿñÈ444ÿ444ÿ444ÿ444ÿ...ÌÌÌÄÌû<4˜ÄŘÄÅM&%ÿ€¬­¼ˆXÿUQ"ÊÌÒáã ,2,xœðò—ÉÐ'#ô¼ˆXÿ-QQÿÒÒÒîîî,-Ûÿÿ÷ÓÓ-QQÿþçýp71p71444ÿS*ÿ£ÑúþëþÐüû;5.§ûM% ÿCCCÿ;5.ÅËÒ\ÀMuŽÌÒâMuŽÀ¢ÐÅËÒ;5.CCCÿ;5.‘´ÌÒâ\À³á S*ÿÄÅ˵€JCCCÿ÷öp71Ð…WhœÌ‡»ëÄÅË<;5¼ˆXÿbbbÿáááÌÒâãW-Ëó ááá>>>£Ñú;5.Ëó TPÿóõ%#ÿM% ÿ³ÛôÛÝø444ÿ444ÿ444ÿ444ÿCCCÿbbbÿCCCÿ-QQÿ÷ÓÓ***)+ÌÌÌêòòñññÿää䬬¬555ÚÚÚìÆìììbbbÿáááñññmD¹⿹Š0-CCCÿbbbÿììììÆñññ±@¿Š IDAT íìCCCÿCCCÿí äªÙ±333CCCÿ444ÿžžž‰eš92w{ª64.bbbÿéÜv...333¾¾¾ÌÌÌñññôî¿ A 1 A~¨z~¨z ACC Aôî¿ AÊúúƒ×ïbbbÿ`N&bbbÿM% ÿÊúú·V.ÿ–ÏÞ‡»ëöööÉÏ„³+++¦Ú –ÏÞ·V.ÿ¼ˆXÿ‘´Âðõ ÉÏ™É7Z&öCCCÿñŠ[ÿÉÏÂðb×ÉÏ`yö îbbbÿðððñññwpcñññÌÌ̈T$ñññíÑÐÞÂÁˆT$444ÿÌÌÌñññ¿£¢¿£¢ñññ444ÿ€¬­M&%ÿ444ÿÄÌû‘žÍ+++bbbÿbbbÿ/Dx¨SQ(ÿÍýþÊÌÒáã ÅÇðøÎÔSWáã ÊÌÒ—ÉÐ%“2÷²ÔþëÇÇ“2÷%444ÿCCCÿ1ÉÏ‹ Íbbbÿ444ÿS*ÿÌÒâ>>>Ðøú\À>>>ÌÒâ4.>çÂðd±ro4.±roÂð>çS*ÿ=:ç(ç(öööÅËÒ;5.–a+–a+jŸÕA]^üÖçÉÏ3šÉYí¦Ú U‹\ÀbbbÿCCCÿÒÒÒñññ×ÿ£Ñú+++ááá>>>ÅËÒ444ÿ444ÿèèèùÕú5 ôb~TPÿ³ÛôTPÿTPÿÌÌÌ444ÿððð444ÿxFEðððñññ¬¬¬¬¬¬ñññ444ÿ-QQÿëÇÇÜâÿ*0MàÒÓÓ¼þ OÿbbbÿñññÌÌÌúÿööö¬¬¬uááá ÿÿñññ+++ÒÒÒÒÒÒÕÕÕ7ðððmD7ÒÒÒèèèÌÌÌñññÿÿCCCÿbbbÿ333ÕÕÕóV'O$$$AvvvÿCCCÿ444ÿ...444ÿCCCÿ›ŸÎÞØ¢CCCÿbbbÿÊÌÒbbbÿM&%ÿ{ÿTõó{ÿbbbÿÿää䬬¬ÿÿÿää䢢¢ Aôî¿óÏþ 1 1óÏþ 1 Aôî¿ A444ÿCCCÿvvvÿ444ÿÐüûK ÿbbbÿÒÒÒþçýÌÒâÌÒâþçýbbbÿþçýÐüûIªÒç(ñññ ³á ñññáááö7IªÒDx¨ç(ñññŒÐú,å CCCÿCCCÿZ&öDx¨½½½v¥³á ñññ õÐÜ&.ááá>>>½V'=sÌÌ̼ˆXÿ‡»ëíÑÐ`N&›ƒTÞÂÁhœÌ¼ˆXÿ444ÿÚÚÚÿ444ÿ444ÿ¼ˆXÿíÑÐ`N&›ƒTíÑЈT$CCCÿM&%ÿ\À/CCCÿ...Žº»ËòóÒÒÒÒÒÒÊÌÒáã äää —Åî ÌÌÌáã áã ®®®ÆÓöŠŠŠòÈ+++ñññÆÓö®®®>çS*ÿCCCÿñññ)û×þ)áááCCCÿS*ÿyE³á ç(áááé(+Ëó +++áááç(­ÖÂð\ÀñññÑüýʹß1¸ \ÀÂðˆ‘Ë&&&ÚÚÚ555ÌÒâÅËÒÄÅˉáááñññÒÒÒ:- £Ñú“2÷· #ñññáááJJJJJJžžžCCCÿñññÌÌÌñññ½½½ááá­Ö444ÿððð444ÿÌÌÌËó TPÿM% ÿK ÿØþü †ÑÓöTPÿM% ÿÄȬ°îÿTPÿÌÌ̽½½Dt?ñññÚÚÚ­{zñï¹ÚÚÚËÉ“CCCÿàÒÓ+++C= .-ùÔ!CCCÿÓ¯¯ÌÌÌéë êêêòã‹êêêööö ÿñññäääÌÌÌèèèäää‚à¹âfçÄÒÒÒÌÌÌÒÒÒ444ÿ íì!ÿ!ÿ3ôñ333ááá ÕÕÕÍÍÍÜÜÜ<EÍÍÍ333ÌÌÌbbbÿñññÈÆñññááá444ÿáááöÒŽºÒááábbbÿ ööö ÌÌÌñññôî¿ A 15;<ÄÄÄ5;< 1óÏþôî¿ A Aåß°444ÿðð𬬬ÿ444ÿ333666CCCÿxxx444ÿþçýø7:ááá...Í þçýþçýø7:ÒÒÒáááVYþçýÌÌÌäääÆ+++½½½ñññÌÌÌäää'#ôáááñññS*ÿDx¨ÌÌÌäääìž6©3ÂÊ¿ÒÒÒv¥x¬Ü"L;5.O€>>>x¬ÜÚÚÚ¨IG¨IGÚÚÚS*ÿ444ÿMöx¬ÜßKÅËÒßK‡»ë>çCCCÿ³ÚÛ5 ñññááá +++ñññäääÑüý­¯Øáã ÌÌÌèèè áááÌÌ̃×ïäää ñññÌÌ̃×ï½½½³á ¼ˆXÿû×þ½½½äää³á ¸ Âðáááñññû×þ¼ˆXÿx¬Ü½½½ÌÌÌäääñññ+++½½½ÌÌ̽½½+++äääöÌÌ̽½½+++½½½­Ö­Ö½½½IõÝ©H ñññááá½½½ç(Âð\ÀÅËÒñññ}Þ“2÷}ÞÌÌ̽½½žžžžžžS*ÿyEÌÌÌÚÚÚ ãâËËËÌÌÌñññÌÌÌ444ÿèè謰îØþü\/Ôàø&éùÕú³Ûôèèè<8úVPéTPÿ57m‡UTú¼ŒÁúDF|xFECCCÿ'ññññññ4.ÓµÒ!!- äñññÒÒÒúöööúú òòòèèèÿÌÌÌèèèöööÚÚÚÚÚÚäääèèèÌÌÌÌÌÌ444ÿÌÌÌæüý*;…†ÿÿÖùûáááììì 333ÜÜÜáááèßbbbÿžžžäääñññÑüýäääñññCCCÿ...444ÿáã ÕÕÕñññçÒçñññáááÿ ööööööèèèÌÌÌŠº»Bl>5;<<<<<<<<<<qwx 1N~~¨zôî¿!PÌÌ̈ˆˆxxxtttÊÊÊiiiˆˆˆÌÌÌø7:ñññááá Ùø7:ñññäääñññáááµô÷ÿÕÕÕèèèÿÕÕÕõ óÝÜ ÿ Ÿ>Œí(ÕÕÕíõêûóþÿíó ä½½½444ÿÌÌÌÿÙrCR¹èÕÕÕ¤p@Dx¨444ÿðððý,÷ñÈ 8A;ÒÒÒÌÌÌM&%ÿ³ÚÛÿ¾UóB« äääèèèÿööö èèèÿ©H W¸óòòò444ÿÌÌÌÿÕÕÕèèèÿ555ËËËòòòÿööö èèèÿööö=þûà èèè444ÿÚÚÚ&&&äää¾UóB« äääèèèS*ÿ­Ö444ÿááá½½½444ÿñØpaŸêç(ÌÌÌ%#ÿ&é6F ®êTPÿÐÔ>>>òî°ÑÓöÛÝø444ÿððð'êÍ ó3ö T=ÒÒÒÌÌÌ#ÿ$½ÁÔ 8ó±ÿúéëú.. ÅÇð ðóõöööúéëòòò444ÿÌÌÌCCCÿñññ½½½444ÿÌÌÌ44UNÏ! IDAT4ÿÌÌÌÿø ÷öí ;BÅû¾÷ö/0ÌÌÌ444ÿÌÌÌšššÿÈÈÈÂÂÂ>>>ìììÂÂÂ>>>888fffCCCÿ½½½ÿôôôlr¨ÞØ¢žžžÿäääöööm ½½½ÿöööòòòOU„ÿôî¿N~<<<‰ˆ5;<<<<ÄÄÄËÅÄqwxÄÄÄ£sr!P±«|CCCÿ333ìììJJJ>>>xxxÍÍͽ½½CCCÿ½½½ÿðððäääèèèÿöööòòòÿì³.ƒhÕ‘åýÿóÝÜ ÿöööü ö òÝú444ÿäääèèè444ÿðððÌÌÌCCCÿñññòñ/æ8:ááá½½½ÿ ý,"óñññäääèèèÿòòòCCCÿñññ...ÒÒÒÌÌÌ444ÿñññÌÌÌÿòòòÿÚÚÚ èèèCCCÿñññðððÌÌÌÿÕÕÕèèèÿäääöööo‘åý èèèCCCÿááážžžRÿ—ÆJJJð´ÌÓö4- ®êM% ÿþçýÔàøßûüÿ+++ññññïÔ ;ÕÕÕ ðÛÝøÿ 'êø5ñññäääèèèÿ ÷òö  úÝÿECÒÒàÿêêêEC73Ž”é ð.. ÒÒà.. »½æ èèè444ÿÌÌÌÿ+++ñññžžž444ÿÌÌÌ444ÿÌÌÌÿöõø ÷ö*Ã&&&ñññÌÌÌ^„Uÿò!®®®ôôôööö555ÕÕÕFl=ò!ŠŠŠÿÌÌÌÿÂÂÂ)çÌÌÌÿööö÷ö, þçýÃòòòCCCÿ A 1óÏþ 1qwx‰ˆóÏþôî¿ Aåß°ÌÌÌbbbÿ®®®RRRtttÂÂÂÊÊʾ¾¾BBBìììžžžÿ èèè&&&555555 ÿ&&&:søÆ2555ýôà O'ÿ&&&555555ÚÚÚ‰Rî‰RîÚÚÚèèèÌÌÌMö¼ˆXÿÕÕÕäääç¸ ááá½½½èèèôôôôôôýÔ äñññÌÌÌèèè444ÿ555&&&555TTTCCCÿñññäääðððááá...ÿááá444ÿ&&&555&&&ÿ+++555555+++CCCÿñññððð444ÿÿ++++++ÿèèèÌÌÌäääööö&&&oÆ2TTTTTT+++ðððñññááá®êi:þáááÂñ-=VÔàø®êM% ÿþçýrz÷M% ÿáááðððéëñññ ðÛÝøèèèôôôôôôÙÿé&ñññÌÌÌèèèÿ ÷&&&&&&555C?,þôòòò»½æÿêêêÉÍùöööóõÒÒà.. ÅÇðòòòèèè+++ñññðððÌÌÌ444ÿòòò÷ö÷ö !÷ö*ÃÉÆò!èß++++++ +++ò!+++5 bbbÿ5 òññññááá>>>çäää^^^í ÔàøÃÿñññç½½ 1óÏþÄÄÄqwxóÏþ 1 AžžžŠŠŠRRR¾¾¾———tttŠŠŠžžžÿ444ÿ555&&&555TTT íì íìÿíÔýûöþüôþ&&&†½!w®555bbbÿñññÂðDx¨èèèÚÚÚÚÚÚÕÕÕeù].òËžUóÿñññðððñññááá444ÿÿñññðððñññ444ÿÿðððôôôñññ444ÿÿááá+++ñññäääáááñññbbbÿÿñññ...ÿ+++ñññáááJJJCCCÿÿ&&&:- ñññááááááCCCÿ444ÿñññ>>>...444ÿ®êÕÕÕñññö7áááßûü6F hæèèèËó TPÿèèèêêêêêêÌÌÌÛÝøð 'êòñìÔïèî ÿêêêú­¯Ø»½æECöööóõ»½æöööÿÌÌÌÿñññðððááávvvÿñññÌÌÌ444ÿßûüêêêöõí ÷öÉÆø7:ñññìììò!½½½èèèÕÕÕìììÿ/ÿ.îêòñáááäääèèèŠŠŠ í öööôî¿ AóÏþ 1óÏþ<<<‰ˆóÏþ 1óÏþôî¿ôî¿ŠŠŠÌÌÌÂÂÂñññ½½½ íìÿÿñññðððñññááá/0 !ÿÿÿ+++ñññðððñññááábbbÿÿ9,?ñññðððñññáááXK^ýôà#ÿ9,?ñññðððñññÒÒÒ]U`#ÿÿññññññáááÌÌ̽½½ÿ+++&&&&&&+++Æ2£Ò5;ýQºbbbÿñññððð+++...áááááá·Vÿÿ+++ñññ...bbbÿ444ÿñññÒÒÒááábbbÿèèè>çááá...áááááá>çeùƒ"ç}ÞñññááátؾUóò‰'ÿÿˆT$ âÉÒÒÒááá>çˆT$öööÚÚÚ·~ìâàųÛô—Æ(³ÛôèèèùÕúÿ555&&& bbbÿ#; Ùÿç#; bbbÿþôðððñññáááC?,èî òòòÛÝøòòòÅÇðöööòòò öööÿÿìììÌÌÌ44„Îøê IDAT4ÿÌÌÌÿø Öùûòòòßûüé(+½½½ÌÌÌžžžŠŠŠ^^^ŠŠŠžžž+++ñññòñÇñññááá¹ %ñññ+++ÿ öööôî¿ôî¿óÏþ 1‰ˆ5;< 1óÏþ Añññ444ÿ444ÿÌÌ̈ˆˆßûü íìñññððð÷ íìñññáááCCCÿ½½½òÿìñññááá9,?Ý8äÿà±Ù õññññññ...ááá9,?Ëàà 8Þä õ 4)TAÿ׬|ÿ5 /çåÑüý/7û÷ &%ÿ³ÚÛÿ+++ðððááábbbÿžžžÿðððÒÒÒ444ÿäääèèèÿˆT$—ÉÐÑÓüáááôôô;964.½½444ÿñññIõÝ:- ;3 ÅÍÉÆæöI½ï>çûçþÈÆ8:áá὇2ÿCyÎñØ4- <5gòÒÒÒMâ‰S2ÿCyÎÿüÔÒÂááôôôáááÿ>çž½S*ÿ*ƒç;3 Å;Uó póðÅ͹ÊýÊÊÿòòòÿèèè5 ôÅËÒËó óääääá ÒM% ÿ³Ûô&&&ððð*cõ ;Ûݽ5 ô³ÛôM% ÿ³Ûôñññäääááábbbÿžžžÿ+++ðððáááM&%ÿ³ÚÛ#ÿ$ñññC½ÃÿúÝòòòÿÿòòòöööòòòèèèÿ444ÿÌÌÌÌÌÌK)QÿÙðÓáááæé ã444ÿÌÌÌ444ÿÿýáàêêêêêêí ûòÌÌÌbbbÿììììììAbbÿžžž ãâ /¸ññHöôöô &%ÿ³ÚÛç..ÂÂÂ/-áãööö öööÿèèèñññ!Pôî¿ AóÏþBl>¾”Âôî¿ Añññ¿444ÿÌÌ̈ˆˆÿÌÌÌ444ÿÌÌÌßûü!ÿðððÒÒÒýáàßûüÿ ð(Ëó ööö&&&ñØËó èèèÿ ð(½òø*0ñØÀþóÝÜÿ íìóõööö&&&ñïÔóõèèèÿ¤p@ÅËÒ»äsE;5.‘´Ëó èèèÿööösE;5.ÅËÒ—Åîi;;5.ÅËÒ—ÅîèèèÿáááñññÕÕÕèèèÿðððêêê?4-;5.\Àèèèÿqm>ÊÌÒ»½æ ööö?þ<`J<<5SWèèèÿöööo:- ÆÓö‘åý :::Ûÿÿá½½ èèèÿ ð(Ëó d)<4žÚËó èèèÿ3ôñËøúø þìë5Í èèèÿèèèÿööö=þûåüýÞ ööööõèèèèS*ÿxo5ÃÆùDx¨ÿööö ööö©H 2*Dx¨¼ˆXÿÅËÒÌÒâ³ÛôÿööösEp71Ëþý\ÀèèèÿööösE»ä?þ4.»ä èèèM% ÿþçýÍ ööö=þûËó èèèÿFBº¾ü <8úÄÈèèèÿ<8úÄÈöööFB64 Ž”ûèèèÿð +Óâþ+þèÕúþøõèèèÿ+++ÒÒÒñïÔ&éÍ èèèÿ èèèÿòòòÿòòò444ÿÌÌÌK)Qÿ0©øÒ'-µ×¯ÿ3ôñÃêêê êêê èèèÿ+++333ÍÍÍÕÕÕöööhhh$$$ÜÜÜ¢¢¢èèèÿ^^^ÍÍÍÕÕÕ5 /pr~~~èèèÿ;9ÿ*ÆÆÆöööEC)Ù×'»½æ èèèÿ ÚÚÚ ööö÷ÿô]U`¶¶¶öööòòò444ÿñññ!Pôî¿ A 1óÏþôî¿ Aôî¿ñññÌÌÌÿðððêêê=þû2ÐüûËó èèèÿöööú(Áéú&éËó èèèÿöööú(Áéú&éËó èèèÿöööú&éÃ÷ö*Úÿóõèèèÿ5 ôËó i;—Åîèèèÿööö èèèÿööösE»äsE—ÅîèèèÿööösE»ä èèèÿööö·³}ÄÄËÊÌÒ»½æ ööö öööECi70—ÉÐÅÇðèèèÿ:::Ûÿÿá½½ èèèÿöööú(Áéú&éËó èèèÿþìëø öõ5Í èèèÿööö"úøÞöõèèèèÿi;;5.ÅËÒ»äsE;5.ÅËÒ­ÖñŠ[ÿËþýÅËÒ»ä ööö®zJ<;5ùÇÎ'޽ööösE»ä i;­Öÿ3ôñà èèèÿ5 ô+º¾ü?þ+º¾ü èèèÿöööú/- º¾ü èèèÿööö­{zS…†­{zDt?Qèèèÿ÷ö, Øþüéë÷ö, Ëó èèèÿööö ööö öööòòòÿc:“â¼mD“â¼ èèèÿööö ööö èèèÿ^^^$$$ÜÜÜìì쬬¬hhh$$$ÜÜܘ˜˜ èèèÿöööŒŒŒÈÈÈÒÒÒÚÚÚ&&&...888ÈÈȶ¶¶èèèÿöööEC64.…‰¸ ööö èèèÿöööTTT¬¬¬&&&...¬¬¬òòò444ÿ Aôî¿ ABl>²‚ñññññññññÌÌÌÿèèèÿööö=þûþçýÃ?þ0›ïèèèÿööö?þËó èèèÿööö?þËó èèèÿöööúóõèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö?þËó èèèÿèèèÿèèèÿi;;5.ÅËÒ—Åîööö èèèÿà«uùÇÎ92‰—ÅîöööêµùÇÎ92ùÇÎ'޽èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿèèèÿòòòÿööö èèà¬J IDATèÿööö èèèÿèèè€ÿÿööö èèèÿèèèÿööö èèè444ÿññññññ!Påß°ñññÌÌÌÿeùÐüûËó èèè444ÿÌÌÌ444ÿÌÌÌ444ÿñññÌÌÌM&%ÿ³ÚÛM&%ÿf ÉûýÑüý³ÚÛ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌM&%ÿ/„ÖØM&%ÿ³ÚÛ|*(ÿÑüý³ÚÛ444ÿüóä ÌÌÌ444ÿÌÌÌ)T„ÿ32¤zz444ÿÒÒÒÌÌÌ\††ÿ5;<ËÅĤzz444ÿ...ÂÂÂXÑüý×þÿ0`32ÍÎþ׬|\††ÿ5;<ËÅĤzz #$ÿóÝÜ #$ÿóÝÜK)QÿÙûÓ'-µ×¯K)Qÿµ×¯S*ÿ­ÖzQÿ†ç¯zQÿ8NϬ|*(ÿÑüý³ÚÛM&%ÿ³ÚÛM&%ÿ/Ñüý³ÚÛM&%ÿ³ÚÛ³/+ÿš÷ú³ÚÛM&%ÿ4-yn‡’ûÌÓûËòó )4-ÌÓû³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ444ÿññññññùããñññÌÌÌ!'Pÿ*ÖþÿýÔ0`32+Õÿÿ¤zz\††ÿ‡‡‡ÿ444ÿ444ÿÌÌÌ&Pÿ‡‡‡ÿððð444ÿCCCÿñññÌÌÌM&%ÿ/|*(ÿM&%ÿ‡‡‡ÿÅÁ‹ÿM&%ÿf '/M&%ÿ444ÿððð444ÿ444ÿ444ÿ0P'ÿ444ÿ444ÿ444ÿ444ÿ\††ÿ\††ÿ\††ÿ‘ÁÂÿ\††ÿ444ÿCCCÿM&%ÿ`˜‡‡‡ÿ³ÚÛM&%ÿ/444ÿüóä ððð0P'ÿ)T„ÿ½†"ÿ444ÿ0P'ÿüó444ÿ444ÿ\††ÿ‡‡‡ÿK)Qÿø±€Ô¬Å~\††ÿM&%ÿ...µ€J›e...444ÿ\††ÿ%ͤ+Ç–%ͤ444ÿ...–a+›e)7/þ,'-32<ÙŽªåºŠ)T„ÿ\††ÿOU„ÿK)Qÿ)T„ÿ%ͤE%ͤ444ÿ2 ÿóÝÜ2 ÿóÝÜK)QÿK)Qÿ'-K)QÿK)QÿK)QÿÙûÓK)QÿK)Qÿ!'Pÿ‡‡‡ÿzQÿ¼ˆXÿ†ç¯†ç¯Î#ÿS*ÿ|*(ÿ7/¶WUÿM&%ÿ/.-.-M&%ÿM&%ÿM&%ÿ//:--//M&%ÿ9+f M&%ÿM&%ÿyn ÙkyneùYí)­› Gpyn4-M&%ÿ444ÿ\††ÿ‡‡‡ÿ444ÿM&%ÿ!ÿK ÿùùñññùùùêù!'Pÿ*0`Ñm«ñŸ†s:¨ÍÎþ)T„ÿ%ͤjÔ444ÿððð444ÿ444ÿ444ÿ&Pÿ}-ÚjÔ333BBBvvvÿM&%ÿ/;,/Ñüý:abxr°-É«³ÚÛf ';47444ÿ444ÿÌÌÌê444ÿ444ÿ444ÿÌÌÌаÙÌÌÌ0P'ÿ0P'ÿÌÌÌ444ÿCCCÿÌÌÌ€TSÿ`Ò`Ò€TSÿ)T„ÿ\††ÿ)T„ÿñŸ†ð’hñŸ†‘ÁÂÿ\††ÿõ PBBB444ÿ/M&%ÿ/_RLËËËM&%ÿ/7Ñüý444ÿüó/3üó ,ôÔý)T„ÿÑm«ÄÍúÁ/ÿüóаÙä üó0P'ÿÌÌÌ)T„ÿ!£‹úÌ£, •ùø, ÍÎþ³ÚÛáááùÆÆáááõ P\††ÿÍÎþÊÖ'ÌÒâ‘ÁÂÿOU„ÿðððáááùÆÆ/'73.4©H 32ÍÎþ 1,3K)QÿM&%ÿ444ÿ444ÿÊÖ'沂ÌÒâ444ÿððð444ÿ444ÿøñøñµ×¯K)QÿÙûÓ00K)Qÿ'-0K)QÿÙûÓK)Qÿ!'Pÿµ¯†¦ÊÊÿÿ<4S*ÿ²1TÿBoDx¨²1Tÿ<4€TSÿS*ÿ<47(*:--ÆÓÓ/Ïÿ)•Ý<*Ü­› K)Qÿ/:--:55:--Ñüýf 7óM&%ÿ|*(ÿ³ÚÛ4-I‚`'•‡’û4,ñÆ2m 4,ñ‡’û`'•I‚yn444ÿUQ"444ÿ)T„ÿ÷ˢƟž444ÿUQ"444ÿ³ÚÛÿÈ ÙK ÿM&%ÿM&%ÿ2ù O ùòòêü@ü@òòùêòò2444ÿ*0õYÛ*ý,'DÕþçýSdÝÿ32...ÿ92ñññ¾¾¾JJJ{å333ÍÍͳÚÛ;47xr°ò‘$8)S*ÿMÑÕüÙýÉôÑüý³ÚÛ444ÿùùCCCÿ444ÿ444ÿê/55ê444ÿÌÌÌ444ÿ444ÿüó/30P'ÿôÔý0P'ÿ‘ÁÂÿ\††ÿ444ÿñññ©1©1)T„ÿ325;<32,2,xœËÅÄ5;<hm>333PJæM&%ÿ/‡R|||ÛÿÿM&%ÿ/Ñüý9+/ÌÌÌä ’.ôÔýôôô32ÃÅóp71½•ìаÙüó/3ä ÿTÕtaJp71\††ÿK)QÿñŠ[ÿM&%ÿ)T„ÿ=VÌÒâMuŽ32\††ÿ\††ÿñññÄÅˉæA325;<32‘´Ü/xËÅÄBl>8bbæA¿“¡ÄÅË7;4=]_j15ÍÎþ dñÊýüMÐ"Bl>]5/_ÌÌÌ444ÿ444ÿ‘ÁÂÿ32‘´Ü/x\††ÿÌÌÌ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ õô O'ÿ #$ÿóÝÜ444ÿK)Qÿ0'-g7ÐýÿÙûÓF˜q]5K)Qÿ0070'-µ×¯µ¯†W{{èèèÿÿöööÿS*ÿ=: yn WÈèý²1Tÿ<4ynS*ÿ(*:55:55:--­*\]5#N ÄÖ$½•ÿåÔþNêo· IDAT,:--7ó"´Ü%ÑüýM&%ÿ444ÿ ²ÚWWW‡’ûÌÓûü×ûŒ@Fü×ûÌÓû½•ìWWWSeö×þÿM&%ÿL ÿ3264.f L M&%ÿ6;È74Öùû/³ÚÛããîÎý2îÎý2ê2bwqŽzªêòò2ü@îÎýòò444ÿ444ÿððð444ÿ444ÿ444ÿ444ÿ0ÅVÚðÎû;_6*$MÖùûþE32ÿç!'Pÿ32ÄÌû‘žÍ32)T„ÿ325;<˜“ÂÍÎþÖ\øÎÔ†hÆËÅÄPJæƒ}M&%ÿ7Ó+\y®eÉ©……&Pÿ/7Ÿ4 7M&%ÿ444ÿõ Pù];_ 444ÿððð‘ÁÂÿ˜“ÂÍÎþÞ+34."ÕÍÍÎþ‘ÁÂÿ444ÿ...444ÿ444ÿÌÌÌÌÌÌ444ÿ444ÿ444ÿÌÌÌÿ2 ÿ2 ÿ O'ÿõ Êæ÷,444ÿ444ÿÌÌÌÐýÿ0 X4Éûþ+1`*ÈÆ_ÙûÓÐýÿ7 X4K)QÿOU„ÿy®ð¾þð¾þ&Pÿ öööÿ<4€X>9侑ù)T„ÿzQÿåjÜ\††ÿzQÿ=: :559:325;<^Ðýÿf¹!0-Þ+3—šÛjm:559::55l ÿ×þÿ’õ ÞL$"´ÜM&%ÿ³ÚÛM&%ÿ444ÿ444ÿ444ÿÌÌÌ444ÿ444ÿ³ÚÛ`M©©©ÿìþæä‘åýááᘘ˜ÉÞÞÊüû³‹rj0ö)³ÚÛÌÌ̤û©1\††ÿ\††ÿÉϳÚÛM&%ÿI—cœõÕÿÿ^3 Ô&ÍÒÌ]O‘ÁÂÿÂÆüœm„ÖØ)³ÚÛ444ÿããù‘ÁÂÿ%ͤ`Òððð(RR•ÕdÃùç½½êÌÌÌä ÑÍúä аÙ\††ÿ_ƒ-ÿÌÌÌüóÑÍúä 1p71p71\††ÿÌÌÌCC½½½M&%ÿM&%ÿ!'Pÿ-4óÏþ`aÍÎþ!'Pÿ‰…Vÿ˜“ÂïÄ”32&ÊÖ'Þ+3¤zzËÅÄ‘ÌÃÅú}ƒç|*(ÿœ&Y55<82jÑ5á€EK/4ˆü(Ñ[•/õfø ÉûýÌÌÌ8Ê)mi²ýY32Êe6ñ”Ó6\††ÿ‘ÁÂÿ5.ýôà#î *444ÿ...TPÿµ×¯®(2¡ýþ®(2ÙûÓ 1Dt?Dt?8bbÙûÓw#0¡ýþ®(2µ×¯OU„ÿüÔÍüÔÍOU„ÿ39ACCööö=: €XbÅJ¯;332¯;3–$ÈèýÍÎþâm5hœÌmÌ,€X€XynÆËË¡58sý/ËÅÄ7Þ+3^7SÖ¤¾”ÂÆËËÆËË= ÿÑüýÐö×þÿ|*(ÿl ÿÌÌÌ444ÿ444ÿ444ÿCCCÿü×ûËËËü×ûÃêêê¤Üóø ü×ûÁéÆÓö³Ú۵ׯ׬|$ÎÍWÏ^3ÎÖ(Ü23*+©17M&%ÿ íìêêêÿM&%ÿ/ÐÆû,9ÐÆûbwq0:Áh•ed0:t©t2^@¥¾”øãã444ÿùgn9ù O du:gn9êµ×¯ñ×)ðÎû%.432ÍÎþÕÿÿ¾”Â\††ÿÅËÒèèèÍÎþ 132ÍÎþ׬|˜“ÂÅËÒ‘´ÌÌÌñññÌÓöú$$ðððM% ÿÿù7ÿRÿðððð´ñññ2 ÿ O'ÿýñà±ÙQa1+H;N÷ÓÓ444ÿÝ äááá444ÿŠ„ÿM% ÿM% ÿK)QÿÙûÓ"ÕÍ328bbóÏþ¼ŒÁPX½5;<mž32׬|µ×¯ÿOU„ÿüÔÍÖþÿÒÒÌÖþÿá½½ èè臒ëâm5ÍÎþûРÍÎþ32¯;3׬|ÍÎþ8bb32âm5€¨ë‡’îÆÓÓ¼jg˜“Â&Á‰ÉªU2"ÕÍ®(2ÊùÔþÑ¡ëifýØÖ¿’‘—ÏÐÑ/’äæêêêëèM&%ÿÁèé444ÿ âÉpìÔM% ÿ})ÿ³/ÿ:æÎpìÔ444ÿ¤ÜóoÎãø=þû=þûí oÎãøoÐý€¬­¤zzùÍÌ-4Öþÿ¤zz€¬­׬|µ×¯//Ëòó!ÿí ÷ö* íìËòó77/ããîÎý‰ˆbwqËÄÄ2=lk›œk›œ2=lÎÔbwqÔýÇÐÆûòòù444ÿ™’Çv§= Ùœ‹Æv§=™’ÇããÌÌÌ!'PÿßÙ°,6_32¼’’׬|ÍÎþøÓÌ*ïÄ”ÍÎþ32)T„ÿ\††ÿöÌÌ×2øÓÌ]05šÁ“èèè\††ÿØ®®ÌÌÌ&Pÿ›rfŽ]05šÁ“]޲‚333ÍÍÍñññÌÌ̇‡‡ÿÕÿÿ¼’’èèè&Pÿ*ÍïÇèèèÿ–Ð ³ÚÛ\††ÿÍÎþ׬|RRRÿ×2”2žŽ£/ÍïÇèèè\††ÿ¤zz_ƒ-ÿÕ±ÌÌÌ)T„ÿøÓÌ*ÍïÇèèèM&%ÿf >[0¥К÷úËòóööö)/7>[0¥К÷ú³ÚÛÿööö 7=l±«|\††ÿï£ËÞ+3$Ò¡·+ è¾öBz15j=¾”Âåß°æµ×¯ÿööö 7=l±«|)T„ÿ"ÕÍé ãÌÌÌ444ÿõÞ+3hm>ËÅÄñŸ†azç½½ñññÌÌÌÿõ E/.®®®ÿõ å #ôñññÌÌÌ)T„ÿ32øÊŒùÕú0ƒ×ïK)Qÿ]5ÍÎþ32ÜÜéÇï]5ÍÎþ32ÍÎþ32ï£Ëµ×¯ÿ÷7ßÙ°!'Pÿüèÿ.ÍïÇèèèÿ÷7û ÉèèèzQÿ;©1ô»Ëñÿ¿Fv"ÕÍ]5¤zz\††ÿ$ÎÍ=3ßCyÎM&%ÿ/Ñüý/­*\32ÍÎþô»Ë0…îg IDATÖ/Ñüý³ÚÛÿ/üú/¢ý^ÿް"rPÞßûü1ðçåÑùûÑòòò444ÿñØ0§ûÖ ðtïŒ:sñØ0· #ÌÌÌM&%ÿÔßß,!!þæäËøúø oƒ×ïM&%ÿ³ÚÛRRRÿ×2øÓÌ*ÍïÇèèè³/+ÿ9,-_±±Öùûí =þûÖùûí =þû¡OOÇÔÓMÑÕ-QQÿããù22ãýÎbwq,9ÔýÇž‰îÎý2õ±àùÓ¯¯CCCÿ333ìììA–,œ‹Æ7ó"ÍÍͽ½½)T„ÿ׬|ÿ8bb¤zz)T„ÿ¤zzÿöö¼ç¾òòòÍÎþ×ÌÌ444ÿÌÌÌüÚ°ÿöööse è¾ç¾òòòèèèsrÿìììñññÌÌÌyyy)T„ÿèèè è¾íÃòòòèèèÄ”ÿüÚ°+QÿÑËË/]5 ¡ÿ*ÍÎþÄ;_6ßz°ÌÌÌаÙ444ÿ¤ÐÑÜÜÜ€Tÿâ\œÃÔ+A;ÞÑ&€¬­444ÿÌÌÌ444ÿóÏþ ÞËïï/]5ï£ËøþÿýÔÑ/55³ÚÛ%ÿÜþþhm>“cbôôôÞ0`39床ööö=CËÅÄ5;<-4ÑÓü/-0`"ÕÍï£ËøÓÌÞ+3hm>³ÚÛÑüýÅÍô³ÚÛ)DDD ©H M&%ÿèèèÌÌÌ444ÿ׬|39Fv©H ˆ¯(_ƒ-ÿ׬|Õ±0P'ÿÞ+332 =C)T„ÿ³ÚÛÉûý>9äCkš÷ú555Dnn32...š÷úCkÉûýK)QÿÞ+3øÓÌÞ+3hm>32³ÚÛ$Ò¡$Ò¡Ü._%.4%.4ÛÒÌ"ÕÍéÿG9ÿ©;4ÅÌø/ÌÌÌK)QÿÞ+3øÓÌÞ+3hm>32ÌÌÌ"Õ͵ׯ"ÕÍ"ÕÍï£ËÞ+3ûР"ÕÍèá¸64.øñ O'ÿÌÌÌÌÌÌÌÌÌK)Qÿ32ÍÎþ"ÕÍÍÎþùÕúÐüû³Ûô׬|Ëïïώخ®é ãßÙ°µ×¯"ÕÍÿá½½B AM&%ÿèèè²1Tÿãñ±K)QÿFvNxx=C<4úÅþ³ÚÛ³ÚÛ)/Ö(*Dnn7=l=CÜ._Ñüý×þÿ)³ÚÛ³ÚÛ³ÚÛ)Ëøú'‘åý ÑM&%ÿ³ÛôÖùûÖùûÖùûƒ×ïÌÌ̳ÚÛ0Öùû¼ø})ÿ39DDD =C)T„ÿ³ÚÛÙ÷ìýþí ÿôôÃeéíÉûý³ÚÛñññ2îÎýÐÆûËÄÄÔýÇÐÆûîÎýÌÌÌBBB·ÛÛdu:œ‹Æ-‚BBBèèèK)Qÿ555DnnûР2!'Pÿv¥555Dnnhm>RRRÿÌÌÌòÈçpIwËÅÄ‘ÁÂÿ½½½èèèK)Qÿ555DnnÅÁ‹ÿüÚ°øÓÌÅ¡ÊØDnn0`¤zzä ÌÌÌÉÔWÏ/_üÖÕrFEÌÌ̱«|%ͤôÖÿäääíó床ßÙ°&]5Nxx=C]5>`ə׬|ÊÌÒ/-­¯ØïÄ”ü»(×*&ËÅÄóÏþ\††ÿM&%ÿ³ÚÛûÔÓIªåM&%ÿþ,555Dnn/_×þÿM&%ÿM&%ÿüó444ÿ0P'ÿ0P'ÿ^3ßgµlýYRRRÿ444ÿ_ƒ-ÿüóаÙ"ÕÍï£Ëï£ËDnn32RRRÿÑüýSeé‚iì×þÿÞ+35;<×2×þÿSeéSeé7M&%ÿ]532ÍÎþ*&ËÅÄóÏþ)T„ÿM&%ÿ×þÿÐé*"ÕÍUUGÒæþû ÉþêÿÃÃ#ÅÌøþXÇТÑüý]532ÍÎþ*&ËÅÄóÏþ)T„ÿµ×¯ÍïÇÍïÇïÄ”8bbµ×¯ÿ 3-=; õôíÔý O'ÿ-QQÿ(×ï£Ë床Ãå½ÍïÇ"ÕÍ׬|³Ûô³ÛôôÖÿäääíóÿµ×¯µ×¯èèè ãñ±K)Qÿ* 8Ô+ÄÌûIPÿ)T„ÿÞ+3ï£Ë)T„ÿÄÌûM&%ÿ×25;< 1`aXM&%ÿ³ÚÛ)/5Xh#"Ïâá5 /ßûü**³Ûô})ÿÎãø*=þûÿ555Dnn32|*(ÿÑüýööö÷ö öööÑüýòòîÎý20:5<<ËÄÄîÎý2òòòò444ÿ·ÛÛ2ñÇüîÎýñÇüÉ Þ444ÿÿÞ+3ï£ËÞ+3hm>0` ,ÿÞ+3ÍÒÌ×2ööö 8N,ÍÒÌCCCÿÿÞ+3"Ñÿ«ýÿÌ7ÿ *..4ÍÎþ32ÌÌÌÌÌÌ7=lâ ÞÑüýÏ1ÎZ..48bb7=l*=COU„ÿ)T„ÿ 1ï£ËÞ+3÷'(kü+­¯Ø­¯Ø;9,ÅÇðÙûÓüÔÍï£ËüÔÍšʳÚÛM&%ÿËòóÞ+3óÏþ;4)M&%ÿ³ÚÛаÙüóä ôÔýÞ+36¯'Éì5;<ù×ÿüóÕ±аÙÍïǦa <^65;<×2³ÚÛ/¨úü0`^3 :;ï£ËÖþÿöÆÅ32...Ëòó×þÿš÷ú/K)Qÿï£ËüÔÍóÏþ&³ÚÛ)èŸy ÒæþŸ¸ÊŸ¸ÊÒæþû ÉÏÈÏúÿˆÃÃ#–ÏËÑüý³ÚÛK)Qÿï£ËüÔÍóÏþBl>&)T„ÿ\††ÿÞ+3ËÅÄEßÚ IDATÍÎþà\^/òòò/700Wðë7Èåä0ÁèémnÑüýK ÿ M% ÿÖùûÃÖùûÎãøeùÿÞ+3÷Ë¢mûõ³ÚÛôôôìýþìýþÿôôËòóòòòòîÎýÐÆûÓÅËîÎý2îÎýêÌÌÌããîÎý™’ÇÓ¯¯™’ÇÌÌÌ39^3 :;32öÆÅаÙÀ~ÔßÙ°39^3 :;ÍÎþÖþÿöÆÅhm>RRRÿÿöBãÿ?op3.4ËÅÄ~W…ÿ½½½39^3 :;ÍÒÌ32öÆÅÅÁ‹ÿèèèÞüÍÞ+3øÓÌ)T„ÿÿOU„ÿ1ÿÏÈÆþÑ¡OU„ÿÿÿ 1óÏþ 1]5 1OU„ÿÿÿOU„ÿ32óÏþÍïÇ"ÕÍÍÎþËÅÄÿÿi70 ÙûÓÍïÇ(×h^M&%ÿ³ÚÛ39^3ý9£5²]ËN82/_аÙÌÌÌ'-6/©ûŒlÎbr]ÑöÆÅÞ+3RRRÿä ÌÌÌ39–ý, :;ÍÎþÖþÿöÆÅ32RRRÿÿM&%ÿ¨úü0`hm>Õÿÿºhµ×¯ßÙ°Ä¢ÊÍÎþ 4439)/„ÖØÍïÇ6*Ùï£Ë"Õ͵ׯµ×¯üÔÍüÔÍüÔÍK)Qÿ4.ÅËÒŸy 0½ãñ±ãñ±èèèèèè8@ÚÓ »:ÙÍïdzÚ۵ׯ6*Ùï£Ë"ÕÍÙûÓÙûÓüÔͺhüÔÍK)Qÿ)T„ÿ)T„ÿ32ñŸ†"ÕÍ"ÕÍ"Õͺh²ˆˆRÿ 8HýÔ׬|ýñëÎ÷Þ+33232Þ+3K)Qÿÿÿ 1óÏþ 1]5 1OU„ÿ7=lüÔÍÖþÿüèÿ*OU„ÿNϬÈèý W"ÕÍï£Ëµ×¯·í°þêÿï£Ë þ.à\^5;<óÏþ,3"ÕÍ&ÍÎþ­*\/|*(ÿ?7Èåä88qF#Èåä8 ³ÚÛ0ÿ})ÿÎãøí í Öùûÿ39^3 :;ÍÎþÖþÿÑÓüj, |*(ÿÿöööÿôô  ñññêòòê2#ßÎÔbwq2îÎýããòòñññãã444ÿÌÌÌÓ¯¯ããÓ¯¯îÎýK)QÿÞ+3Õÿÿ˜“ÂÀ¥ý¢Íý^3)T„ÿK)Qÿ)T„ÿhm>ËÅÄï£ËÑ2 )"Õ͵ׯ&PÿX`6ï£ËÑ2@["Ñÿ‚©{)T„ÿhm>ËÅÄÍÎþ"ÕÍÑ2 )^3¢Íý׬|ÿ39Þ+3ýÍ/55ï£ËÞ+332ï£ËÍïÇèèèÿööörFEÍÒÒÔ+÷ñÈèèèÿöööNxxóÏþ 1ï£Ë]5¤zzÿrFE<4ÄÌû˜ÄÅ39ÍïÇ39ýÔob3ÄÌû˜ÄÅèèèÿqm>ÊÌÒ»½æ ööö?þ<`J<<5SWèèèM&%ÿj0öÍ4¥ËËÄ«l¸U”H55<ýÇs:µSeé³ÚÛ)T„ÿhm>ËÅÄaœ_¥a )"Õ͵ׯ)T„ÿhm>ËÅÄï£ËÑ2 )"Õ͵ׯ)T„ÿ32ï£ËÍïÇööö ð&é³Ûôÿi;p71\›±Áé ööö?þ¤eOÉÏ—ÅîèèèS*ÿ—Åîèèèÿ5 ô4.ÌÒâÁé èèèM% ÿocLÅËÒ»ä ööösE­ÖK)Qÿü»Ëó ööö èèèÿýñæèèè2 ÿøñóÝÜK)Qÿ 'Á64 Ž”ûèèèÿöööNxxóÏþ 1ï£Ë]5¤zzOÿ.Öþÿüèÿüèÿãñ±zQÿª Ó'-µ×¯zQÿ;€¬­M&%ÿþ,þêÿs6óÏþÚÿ ¿ÌþêÿýÔ³ÚÛ|*(ÿÿêço!%þÛì%ÇÕùÉûýÑüý³ÚÛÿ5 ôf šöõÁéo6šöõËó èèèÿööö=þûÖùû*2¤Üóí ÷ö*µô÷)T„ÿhm>ËÅÄï£ËÑ2 )"Õ͵ׯÿööö÷öí ñññù2ÀïññññññÌÌÌÿööö=CÖþÿ*Þ+3"ÕÍÍïÇèèèÿööö=C]5ÍÎþ"ÕÍÖþÿ*Úú·&é³Ûôÿööö=C¹ýÿGÖþÿ*3.4«ýÿ32"Ñÿ‚©{ÿööö=C]5ÍÎþ"ÕÍÖþÿ*Þ+3"¸…³Ûôÿ39â(ü3øÓÌ*Öþÿ*ÍïÇèèèÿööö èèèÿööö 7=l±«|ÿööörFE˜ÄÅööö h<;€¬­ÿööö·³}ÄÄËÊÌÒ»½æ ööö öööECi70—ÉÐÅÇðèèèÿöööì³.½•ß;3 8Qh§`Ö8QKͳÚÛÿööö=C]5ÍÎþ”2žd¡.*Þ+3"Õ͵ׯÿööö=C]5ÍÎþ"ÕÍÖþÿ*Úú·&é³Ûôÿ íì, Áé÷ö, ³ÛôÿööösEp71ÉÏ»ä ööö 5 ô¤eOËþýÅËÒ—ÅîööösE;5.ÅËÒ»äsEÌÒâ4.ÌÒâËó èèèÿ5 ô4.ÌÒâËó ööö 5 ô4.—Åîèèèÿèèèÿööö èèè #$ÿ .-á½½ ýñùÜ èèèÿöööú/- º¾ü èèèÿööö 7=l±«|ÿöööA.Òæþ.ýº³Ûôÿööö¤#FÈèý”õ½l C”õ½ èèèÿ39þêÿàA4"ÕÍÙûÓêêê 3ôñ0n ö‘ßñ89+þÛì‘ßñÑüý³ÚÛÿöööoÐüûÁé?þ0›ïèèèÿööö=þûËøúø ÷öí öõ í èèèÿööö=C]5ÍÎþ"ÕÍÖþÿ*Úú·.. ­¯Øÿ ùããùòò){FÁ“ÈããñññÌÌÌÿèèèM% ÿþçýÖùûí ööö÷ö, ³Ûôÿööö=CÍïÇèèèÿööö=CÍïÇ393.4šÁ“èèèÿööö=CÍïÇèèèÿ39µ×¯ÿèèèÿèèèÿ ôôôèèèÿèèèÿöööì³.WÜèèèÿööö=CÍïÇ39µ×¯ÿööö=CÍïÇèèèÿ ôôôèèèS*ÿ;5.‘´Ëó ¤p@hœÌôôô¤p@ÅËÒ»ä èèèÿèèèÿèèèÿ ôôôèèèÿèèèÿèèèÿöööAû Éèèèÿb98Èèý”õ½ ôôôèèèK)QÿÏè!3 IDATÍïÇööö )/7Éûý’äæ èèèÿööö èèè€ÿÿ ööö èèèÿööö=CÍïÇèèèÿööö ööö ùãã...ÒÒÒñññÌÌÌÿ?þÁéôôô3ôñÁéòòòCCCÿÿû‘ÿ¬¬¬ÿ444ÿšššÿ¬¬¬ÿCCCÿšššÿvvvÿvvvÿšššÿšššÿM&%ÿùÂ_ÿM&%ÿM&%ÿùÂ_ÿM&%ÿ444ÿÿúdÿ444ÿCCCÿCCCÿÿúdÿCCCÿM&%ÿ³/+ÿ$$$ÿM&%ÿM&%ÿM&%ÿ³/+ÿvvvÿ444ÿ444ÿ444ÿ444ÿCCCÿ444ÿS*ÿ¼ˆXÿS*ÿS*ÿM&%ÿS*ÿS*ÿM&%ÿÿÿÿÿÿÿÿvvvÿ·~ùCCCÿ!'PÿOU„ÿCCCÿ444ÿCCCÿCCCÿ444ÿêêêÿoCCCÿšššÿùÂ_ÿêêêÿ¬¬¬ÿTTT444ÿCCCÿfffÊÊÊWWW¬¬¬ÿ444ÿšššÿÜÜÜŠŠŠŠŠŠÈÈÈvvvÿ¡Ø;ùÂ_ÿM&%ÿ4,ñp`ýM&%ÿM&%ÿÄÅÓ¬œ:M&%ÿËÆ0CCCÿ·~ì·~ìCCCÿbbbÿ¼¸NCCCÿM&%ÿf 9+/ùê5ÿ|*(ÿ9+M&%ÿbbbÿÿÿÿÿ444ÿ½V'444ÿ444ÿðððò‰'ÿúÁ/ÿ444ÿ444ÿ¶S*ÿ;5.ÅËÒʹ߼ˆXÿS*ÿ|*(ÿíZ!ÿq6ý|*(ÿÌÓûl÷íZ!ÿ/M&%ÿÿ èèèòòòòö òû$öööÿ%#ÿTPÿ})ÿÿRÿ·Vÿ444ÿ444ÿTPÿRRRÿTPÿ$$$šššÿ2 ÿ2 ÿA ÿŠ„ÿÃÆö·~ùCCCÿšššÿ€TSÿšššÿìüÔÍÖÿOU„ÿbbbÿñññ444ÿü@ü@CCCÿ444ÿ444ÿ444ÿ0P'ÿ0P'ÿSQ(ÿCCCÿ°°°¬¬¬ÿ”¿Šÿ½½½©©©92°°°ÿû‘ÿÿû‘ÿ¬¬¬ÿÊÊÊšššÿ444ÿøBCWWWCCCÿ$$$ÈÈÈîîî444ÿšššÿÜÜÜììì–½6ÿøÃÿžžžÜÜÜ$$$vvvÿM&%ÿ¬œ:#í˜}´MtuMtuM&%ÿšššÿMtu¹ïDÄÅÓ¬œ:M&%ÿ444ÿ¼¸N-bbbÿ˜áß444ÿ9+X7Èèø/f CCCÿŠŠŠ¨IGööö444ÿåL{§§§fffÅŽ+ÿ4÷É,444ÿ§§§øÈü444ÿS*ÿ;5.ÅËÒÌÒâÅËÒ;5.S*ÿ)/[þM&%ÿ/)`Ì/q0ùS*ÿÿèèèòòò ÷ûåòö Aÿbbbÿÿ()Ùÿƒ×ïööö—ÆIªåÿvvvÿCCCÿCCCÿCCCÿCCCÿÿ Þ¬°î®®®444ÿ444ÿÿÄÈ444ÿvvvÿ#ÿuR&0Oÿ#ÿ2 ÿ0OÿÊÌõÃÆöCCCÿ·~ùšššÿ⎚ššÿbbbÿFG|*(ÿ!'Pÿì+3*+ƒÿÍÖÿOU„ÿáááðððCCCÿCCCÿÌÌÌCCCÿü@=vp=vpü@444ÿCCCÿÌÌÌ0P'ÿ#Z4#%NK ÿM% ÿM% ÿM% ÿM% ÿÿÿS*ÿS*ÿiiiea÷k<DH²"î¾›Ÿ ëïYÿû‘ÿ444ÿìììÜÜÜfff444ÿÈÈÈ888¡ëìiiiÜÜÜìììžžž&Ë"žú©ìììÜÜÜ$$$ÄÅÓ¹ïD2ÝÄÌô<<<4,ñ#ìˆÜÜܹïDÿ²ß˜>ç[$Àÿ²™/444ÿ/07ÿîë› ‘ßñúLNM&%ÿCCCÿÿÿ555 òòòÖÖÖÿÌÌÌñññmmmìììPPPZHÉÖ IDATñ(‹xxx©?¢¢¢¶¶¶yEåL{ÅËÒ;5.ØþüM% ÿM% ÿM% ÿM% ÿS*ÿʹßÅËÒS*ÿM&%ÿl÷/M&%ÿ¥cq0ùl÷//l÷Oÿ 2ÿOÿÿ ÷ãõÈAÿbbbÿ444ÿ888Áéƒ×ïÿÿòŠ6ÿsDèèè})ÿ})ÿèèèÞÚœ½½½ÕÕÕCCCÿvvvÿ“““GAìÿÖÖÖÿŠ„/ÿÿ·VÿTPÿÆÀ\ÿ})ÿúÁ/ÿ})ÿCCCÿ+++ÆÆÆÐÔRRRÿ‡‡‡ÿ\††ÿTPÿbbbÿÿ...ÿ444ÿ:::oooTPÿ444ÿ;‰%vvvÿ444ÿvvvÿl¾‰ÿšššÿ$$$šššÿÜÜÜvvvÿ¦ËàZ5 #ÿZ5 Z5 ¬°îÍýë—Éà ÏÃÆöŠ„ÿ溹pr溹šššÿÿbbbÿšššÿâŽæº¹pr!'Pÿ..4ùԾΠüÍ #$ÿÍÖÿñññ½½½bbbÿñññCCCÿ444ÿñññÞÎý¡X¡XñÍÓÚü@ü@CCCÿ444ÿ%#ÿ#ìòGÝÛ²ÿÍ ocLocL4.þçý5 ô5 ôM% ÿM% ÿRÿRÿšššÿ;5.;5.šššÿDH²bbbÿ———cgÑ\††ÿQ|G¶Dx¨fffÒžnëïYCCCÿîîîììì“··øBCòÌËÜÜÜøBCBBBááá¡ëìšššÿ–a+–½6ÿÖÖÖÿºî¾“ÜÖÖÖÿbbbÿìììvvvÿÝh³› Ü ãwçkƒH„ü×ûÄÌôG¬ÄÅÓûÇË<3ø‡’ûÃÅó=; ¾Œß!M&%ÿ709+É÷ùûbg```M&%ÿp0 09+áááöööËËË888ÿ#ì‰Òžn>>>åL{N~#ì‰ÌÒâ;5.ÅËÒ&éØþüM% ÿ4.M% ÿ4.4.ÌÒâØþü;5.;5./ûÑú2›ý//M&%ÿ)//ñÿ¿ÿéëù·Oÿÿ ÷ãõÈòû$ÿÿbbbÿ888ÄYbbbÿèèèòòòèèè ðbÆÜÌÓöM% ÿƒ×ïƒ×ïÿbbbÿvvvÿ¬°îÿÖÖÖÿŠ„/ÿ¾¾¾333¹   Ž”éèèè***ÿÿ-Òìrl0644Ó‚Ò€TPÿ*cõ§û·Vÿ½½½ÕÕÕ<8ú...ÒÒÒÆÀ\ÿïïï>p¯¬¬¬ÿžžžèèèžžž®®®ÿJJJþÀ×ýÎ"&d¶¶¶+ÝAùGã...®®®ƦfffÜÜÜšššÿÍÍÍfffvvvÿ$$$#ÿ0OÿòÝúõåûúñý¦Ëà›Ÿë¬°î64 p=üÖÕüÖÕæº¹¶¶¶¢¢¢fff*+FGfffìüÔÍÖÿOU„ÿàøÝì+ßÙ°ì+ñø¡3*ÌÌÌCCCÿáááÌÌ̽½½CCCÿ444ÿCCCÿ&òò_¨s"2óü@Rl=vp=vpü@ -7373ºÚ±­¯ØèèèR†¶;5.q|OocLocLocL4.ʺóÌÓöfffÅËÒfffîîî888ú$$>ΣءØ;”¿Šÿ‡»ë°°°§§§CCCÿê¢ÄîËïï45òÌË45ÅÅøBCòÌË'ÝÜjŸÕ@ ¥÷`ÿ/êh8FÄÄÄC•þìììÈÈÈ$$$M&%ÿãw)H„Ðý<<<<<<ÄÄÄq‰ÌÔÄÌôG¬$$$¹ïDÌÌÌDH²!ûÇìÃÅó<3ø=; DIß/þÛìûbg‰°±```ÄÄÄùf CCCÿááá333¢¢¢ÈÈÈÿmmmÌÌÌñññÃÆù=:ÒžnÄÄÄ沂ØuñññÌÌÌ4.ÅËÒÖùû(4.4.ÌÒâØþü&éÚÿÅËÒ/8/q0ù/)ûÑú4-/l÷8)ööösE?þGãéÞñÿ¿òû$Aòòòèèèòòò ÷ûåöööòòòÿÿS*ÿÿM% ÿM% ÿCCCÿžžžfff=s!ïîšššÿbbbÿbbbÿ888})ÿRÿÿ()Ùÿj1M% ÿRÿ³Ûô})ÿM% ÿèèèžžžŠŠŠTPÿbbbÿ^^^LR§ŒŒŒÞÚœLR§^^^ÿrlŸ>ú÷3ó—Êð««“2÷™bþIªåèèèP 44²²²–Æ*¹ðê•ZòPQžüýÿŠ„/ÿÿËïïVPûO¨|h<-‚‚ÔŸ ^ôW%%%p›fª°ŠŠŠÜÜÜCCCÿvvvÿ¦Ëàöéü? åãú¦ËàбñúÁ<ÿÿÿ/- v|ã—Éà+bÌ„ÖØ溹ǘÄÅ ‚‚‚Ãïðfffì+ñø¡ÒÒÌç!'Pÿãñ±åÿÒÒÌCCCÿ½½½CCCÿbbbÿ½½½½½½½½½ñññ¡XÞÎýÞÎý®”ø%#ÿCCCÿ#ÉÍù›ŸÙvvvÿèèè Cs9Cs9Cs9;5.Í ³ÛôbbbÿÞBGpbbbÿÈÈÈú$$ŠŠŠáááÜÜÂììžžžfffΣؚššÿ½½½©©©ñññòò“··7_645'ÝÜ×ÕÿòÌËòÌËÉ¡ÊòÌËòÌËòòñññÜÜÜ$$$žžžÏ!Š1ßvNNN1ßvéoõ£:C•þÜÜÜ4,ñ)õ$`³Œ‹   ÄÄijŒ‹³ÚÛü×ûÄÌô³Œ‹$$$444ÿzCßûÇËÃÅó†½!Ä͆½!·~ìDIÿÓM&%ÿ6óîÿîëúÐüø«è‘ßñ=¹µmmmÄÄÄÜÜÜþÛìºÝ7óM&%ÿÍÍÍöööÈÈÈmmm555öööÿËËË444ÿ‡»ëxxx>>>Òžn=:ÃÆùÌÒâ*ØþüÌÒâ;5.Øþü&éÚÿ&éÅËÒ;5.8q0ù 4ü”ù ûÑúl÷q0ù8q6ý»ä×ÿíIÜãúãH-ƒÿòòò ÷S*ÿM% ÿS*ÿÿM% ÿM% ÿÿÿÿK ÿÌÒâM% ÿ5 ô4.M% ÿM% ÿS*ÿ=:!ïîY'&»‰ˆÿbbbÿbbbÿbbbÿÈÈÈÿ¨ú÷ÌÓöÿ<8ú4- )ÆÓö+ÌÓö})ÿTPÿƒ×ï³ÛôCCCÿÿº¾üÍÍÍ~z<~z<64   ```¹vvvÿêêêÿÿâ©-Òìi6Íþ 643óZãûÆž¸[ŠCkBuoÿ¬¬¬Bvw´®Y>ØÞ3×××(Ä_<<-‘ÁÂÿ‡‡‡ÿRRRÿ99^^^mII£Í"猡z¿jÔ7:ÉÆû?9ÕÛ8ŠUšššÿÍÍÍfffÿááኊŠÍÍÍÜÜÜåãú$ôÕ0Oÿ0Oÿ})ÿ-ëÎ÷TPÿÃÆörlº¾üCCCÿŠ„ÿCCCÿ¬°î\0"ÿ€¬­ vvv⎚ššÿ333bbbÿãñ±ì+ßÙ°ÿOÿä-ßÙ°ÿÕÕÕñññžžžCCCÿÿbbbÿ444ÿü@ü@"2Úááá&òòRl¡XÊÀïñññ%#ÿTPÿ ;í äÝÿÿÝÿÿ.. #¹vvvÿèèèCs9½Ç‚X™‚X™Cs9Cs9èèè888µ»êÈÈȈˆˆ\††ÿ<Ùááá骧ñŸ†K ÿžžžÂìì½½½°°°ÌÌ̽½½[[;ñð'ÝÜÂÂÂ?ó×Õÿ×Õÿ0äÓ¯¯Ó¯¯ñññîîîÌÌÌ$$$ÜÜÜ1ßvmmmôôô±±± ]ÆŠŠŠõ£:ttt$$$³ÚÛÌÔõ$`×°¯×þÿ®®®~~~~~~ƒ×ï<4 _(ųÚÛÃÅóBtBñññÄ͇’ûI‚½½½ÃÅó·~ìûÇËááá444ÿÉ÷ùºÝo!¯37ÕÕÕttt®®®cñ‰ŠÙ7 ÈèøÕÕÕmmmËËËááá555ööö555ÌÌÌ444ÿ}(z IDAT=:¬¬¬xxx>>>$$$‡»ëÌÒâ4.Öùû&éØþüÅËÒ;5.ÌÒâ(Úÿ6G!;5.ÅËÒÌÒâÑüýøÈø g/q6ý g”ù ”ù øÈø8$ _ñÿ¿òö æ¸Ü¯H-ƒÿOÿ M% ÿÿÿìÿÿ4.—ÅîÿM% ÿööö})ÿ4- 4- eùRÿM% ÿÿ})ÿ5 ôÿÿÿÿÿ?þÿ?þ2ÿS*ÿ³ÛôCCCÿM% ÿ4.ö7ÌÒâ4.4.bbbÿS*ÿá8žžž>>®®®ÜÜÜ$$$×þÿ)>>>^^^‚‚‚MtuM&%ÿTdÆÌÌ̆½!BtBchþ<3øzCßCCCÿCzÞÃÅóÃÅóñññÌÌ̳ÚÛÒ› qF#U:ï‚‚‚ŒŒŒ²²²f Éú qF#:=› ³ÚÛááá^^^ËËËáááhhhCCCÿ444ÿJäTTT¬¬¬$$$&&&=:ÃÆù4.ÌÒâ`N&Öùû(ÅËÒþçýØþü(ÛÝø;5.ÅËÒ³Ûô8øÈø”ù Ê/2Ü­ÖÁ¦øÈøM&%ÿòû$ùë+Æá‹òòòôôôòû$ 8÷ÎÆá‹ñÿ¿èèèM% ÿ4.i;ÌÓö5 ôM&%ÿS*ÿRÿi;­Öèèèÿ3ôñ0oÐüûÌÓöü×û)ü×û05 ô›ï³ÛôÿK ÿ})ÿÿÿööö eù?þ³Ûôòòò³Ûôƒ×ï)èÿÿS*ÿM% ÿ­Ö>çCCCÿö7á84.×ÿÌÒâžžžÂðžžžWWWÂÂÂjŸÕ»íî!ïî888fffèèè úØþü¨ú÷ÑÓö‹ŸÛËó [›Öi:þž:$×ÿTPÿ})ÿM% ÿvvvÿrlÕÕÕYYY¶¶¶ïó1ØÞ3LR§´®Yááᢢ¢BBB²²²²²²½½½ú÷ÊÌã›ï¯x-Òìp=Ÿ>ú÷[’övxqçå¯×'<8ú¬°î\††ÿJJJ<<<¼’’BBBìˆ2Ø<¡†°°k8ÚÙìˆ2v|ѽ½½ÄÈŒŒŒv§=5,&Â÷¢ tttO¨|vvv£Í"šššÿhhhŒŒŒ ÿ333¬°î-åãú—ËßZ5 ¯ýù)›Ÿë—ÉàI‚èèè64 ÃÆöp=öööº¾ü­Öÿ¬¬¬ttt溹FG©©©˜ÄÅöööòñ~~~ÿðÕ,ÿüèÿÍÖÿ7=l ,ÿCCCÿÿÕÕÕCCCÿbbbÿ0:=vp_0_¨sóÄ•ñññÌÌÌóõËËËÒÒà -#¹¿ÝÛ²0P'ÿ0P'ÿ¼ˆXÿ½Ç‚X™Cs9Cs9~¨gDx¨888ÍÖÿ˜¡Ãvvv">?*ö7½½½ÌÌÌÍÍÍê45¾½òÌËøBCÌÌÌ$$$ŠŠŠÜÜܽ½½ôôôáááéééfffÀç`ììì³ÚÛ³Œ‹)Mtu$$$ãw)PQM&%ÿCzÞ³ÚÛ½½½ÒÒÒÂðzCß444ÿw®BtB³ÚÛ³ÚÛ„ì@²²²<<<ÃGKaÌóTTTêêê®®®hhhÌÌÌÌÌÌÌÌÌñññÃÆùˆˆˆTTTÜÜܶ¶¶‡»ëñññÌÌÌ444ÿ­Ö4. ²Ú4.Úÿ(³Ûô¼ˆXÿÅËÒøÈøÌÓû2ÜÊøÈøš÷úÉûýûÑúÜñÿ¿òòòèñÜãõÈ0kòòòòòò ³Ûô­Ö—ÅîËó 4.ÿçÌÓûÌÓö5 ôå9Q›ï0›ï ³îÐüûÐüûËó èèèÿ?þ2oM% ÿ‘åýööö ?þi;Ðüû³Ûôþçý)è?þS*ÿS*ÿÌÒâ³Ûôbbbÿ£ÑúáááÂÂÂ4.­Ö½½½½½½ÈÈÈáááÍÍÍ=:èèèÿ5 ôËó 5 ôÐüû<8ÑÓü0×û‹×ÛêêýùÕþ:1ÐÏñŠŠŠCCCÿJJ3 Ïïó¶¶¶áááËËßhhh```******ÄÈ[’ööööoÓö:- ùÕú<8-Ò~,J@]¬°îÜÜttt888øÊŒDnt>ÈÈÈ(ˆ2¼”é¼¾¾¾ÊÌãžüýÿbÿ‚‚‚ðê•¢k888g‘·'ÿxttüTT \'öÈÈëÇÇÜÜÜ$$$¢¢¢èèèÿ˜˜˜ })ÿùñý‘òÝÓþüTPÿ¬°î½½½v|ãTPõÿ—ÉsE­Öÿ ¤ÐÑÐÑRRRÕÕÕ JJJ88dÖÕ„ÖØÿööööö÷ È ðÔíøÕÒÒ,òòò Èÿèèè½½½bbbÿžžžÂÂÂCCCÿ½½½áÌÓÞX&ÐÆûÞ”&òò O óÄ•ÐÆûñññÌÌÌÿöööú ;å333¢¢ÕÅÇ^^^ºÚ±Ð°ÙRÿÌÓöCs9C9½ÇÅËÒ~¨gÿÈÈÈÍÖ!äëÿÖäëÿšššÿÈÈȽ½½!ÿyWWú%ðžžñññÁã 7_5¾½ñññêÌËBCCÿñññÌÌÌfffìììöööHHH©©©îîî<ßvõ$ÄjCÊÿžžž³ÚÛM&%ÿMtuÈÈÈšššI³›)Pe°¯ÿ³ÚÛ³ÚÛ>ç<3ø¥Ü@ᆽ!·~ì‰îw®ñññÌÌÌM&%ÿt¿¨Œ$$$<<<ÄÄÄ``` f¹µaÌóÍÍÍ>>>¬¬¬ êêê®®®TTT444ÿððð.b§°°°888ÂÂÂ>>‹Òžn444ÿÌÌÌ`N&ÌÒâ»ä?þ(ØþüÅËÒÌÒâS*ÿ­ÖûÑ!ÿÊ×þýû×þþS*ÿ­Ö)*ÿqÈø 2ÿÜ èèèÿÕâÌèèèèèèRÿ—Åîi;—Åî Òâÿèèè³Ûôbbbÿ¶¶¶ ÐüôÔàø 'ôñÔàø, eùƒèòòò³ò³K ÿsE»ä5 ô×ÿþ¹ß6G!0çÿƒ×ï4.ÒâÌÒâ4.âÿ³Ûô444ÿáááÂÂÂá£ÑúCCCÿ½½½bbbÿÂÂÂ888ááá>>>,a——edèèè³Ûô5 ôËó ØþüùÕúóõÐüû§û Ëó Iªå³Ûô½½½ááá("ÍÄÈ333+++ Ï555´®Yÿvvvÿvvvÿèèèèèèrl©H [Ó.­œ#ÐÔÆÓö‘åý[’öÄÈTPÿ¶¶¶BBBº¾ü><<<¶¶¶„ŠßDnn<8úBBB‚†Ä8ÚÙ“··ÈÈÈŽ”étttÈÈÈ]3ÞÄÈ 888.ܶ¶¶‚‚‚l¾‰ÿ¢¢¢ÈÈÈ+++èèèìììfffôôôòòòèèèvvvÿšššÿTPÿ)ü×ûôôôëõåû9èÉ ÄȬ°î/- ¬°îÑÓöÄÈèèè­ÖÿJJJ\0/‚‚‚èèè©©©pr èèèèèèàøÝì+ßÙ°èèèèèè 87=lÒÒÒbbbÿ½½½½½½ñññ#ô"2ñññõ±àþÖ_¨sü@õ±àµgËõ±àñññððð444ÿéëËËËÒÒàðò;9;9¢¢¢Ð°Ùʺóþçý‘´N*{½ÇCs9Cs9;5.½Çÿööö¬¬¬F7ßš„~obLà¶¶¶bbbÿžžžßûüÈÈÈÌÌÌšššÌÌÌñññòòòÌËøBC444ÿžžž 333Ö"šííí<<< ÿCCCÿM&%ÿ<=ÈÈÈ$$$ÈÈÈ· # Ü MtuDIß<3ø=; áááññññññI‚=; 5:ÐÌÌÌ/þÛì‘ßñ<§ ššš   ÄÄÄÜÜÜÝYUž™7ó½½½¬¬¬TTTööö êêꬬ¬®®®ÖÖÖÿ444ÿððð 2Œõ IDATìì쇻ë­ÖÌÒâþçý<4¯y$þçýþçý(M% ÿ£Ñú³Ûô”ù )Éûý)û×þ4-û×þûÑúòòòòòò 2ÿûåòö èèè ñÿ¿Oÿÿÿì Ëó i;žžžèèè].ò×ÿ*Ù*Ëó ÐüûK ÿÙËó ÌÒâ×ÿ£ÑúÐüûK ÿÙÌÒâ×ÿ×ÿþçý×ÿÌÒâ4.ÌÌ̽½½ÌÌÌôôô>>>¶¶¶êêêêêê>>>ÿ¶¶¶vvv~~~ôôô>>>¬¬¬ôôôßCCCÿM% ÿj1mÎ ÿ ×ÿ5 èËó ööêú(³èCCCÿ½½½½½ÍÍÍÿ333®®áRR3ŠŠŠCCCÿèèÑÍÍÍÿèè莔ÿ¥n ÷Ìç—Æv|Ñÿ:> Ðüñ³ÛèTPÿ¬°îèèèÿ èèèfffÿ ><†Ä******ëÇÇžèèÿ¶¶¶JJèèž~~~ÿ©©©èèèÿÿèèèCCCÿÿº¾öB'È÷ --:þ®êÿúTPÿÄÈèèèÿ/-ú-­èèèèÿöööÈÆÃôôôììì$$$žžžvvvÿfffèèèðÕ!PÿßÙ°ÿüèÿÒÌÌÌÌÿ½½½ÌÌÌCCCÿÞÎý&ñññå ÊðððÌÌÌ ËËË ;ËËËÕÕÕèèèSQ(ÿ­¯Øµô÷óÿ„±‘´Rÿ®êÿööö¬¬¬¶¶¶èèèžžž888ÿžžžbÿ”¿ŠÿlAv444ÿÌÌÌ)ÌÌÌCCCÿ×Õÿ74øBC¾½ÿ^^^Þf³Ü³$$$šššÿfffèèèÿTTTÿ888½½½M&%ÿ<=$$$ÒÒÒÜÜÜM&%ÿ³ÚÛñññMö=; h¡3áÌÌÌCCCÿÃÅó·~I‚M&%ÿn ö‘ßñ7 › òñ¾¾¾¾¾¾×÷úe ÍÍͬ¬¬êêê öööêêêìììÄÄÄÌÌÌ444ÿììì>>>îîîÄÄÄWWW©©©þçýµô÷rÿCyÎ!ÿ,4.£Ñú]/­Ö­Öû×þÁÜûûý„ÖØ)*ÿÑüý4ÑüýÌÓû ³ÚÖüéèèèÿñö¿H-ƒÿ¸Ó}i;»äsE»äøsEÌÒâÿèèèM% ÿ4- £Òôôôêêê=þûÃs:þÌÓK ÿÙYí;—Åööê=þûÃ?èËó ôK ÿÙ)è×ÿ×ÿÒâÿèèèÿööö¬¬¬ ¶¶¶èèèÿöööööö~~~èèè¶¶¶ÿ +++ÈÈȽ½½ÿ<8úÄÈ ð(+¬°îÿ ð(³ÛôCCCÿ½½½ÿ5 =^øv|ãšššÿfffÿèèèÿèèèÿèèèÿööö èèèÿèèèÿhhhÍÍͽ½½ÿööö ôôôöööo×'¬°îÿööö èèèÿöööFB¬°îÿèèèÿöööòòòbbbÿžžž!'PÿßÙ°ÿ 8ßÙ°ÿ 8ìüÔóÝÜCCCÿñññÌÌÌÿ+++½½½444ÿñññðððÌÌÌ444ÿðððÌÌÌ444ÿÌÌÌÿ;9ðòÕÕÕèèèSQ(ÿ­¯Øÿööö=þûµô÷ÿèèèbbbÿ888fffbbbÿ2](lAv444ÿêããÌÌÌ444ÿðððÁã 7_6¾½ñññÌÌÌÿöööyyyOOOÄÄÄíííÛÛÛ```***CCCÿWWWfffM&%ÿ)PQ$$$ÈÈÈëÄÃçIõÝ)ÌÔ³ÚÛ444ÿzCß=; I‚ñññÌÌÌ444ÿ‰Rî=; I‚ñññÌÌÌM&%ÿe÷ñÉ÷ùÒ³ÚÛM&%ÿ.îêo!cñ³ÚÛÿöööTTT®®®êêêòòòÖÖÖÿ***444ÿWWWîîî<<<ÄÄÄ<<<JJJÌÌ̽‡2ÿCyÎK ÿpb&CyÎM&%ÿ/)ÌÓû³ÚÛ|*(ÿÑüý/Ñüý³ÚÛS*ÿÌÓû³ÚÛ 2ÿÜòòòÿèìÿüéÿööö èèèÿööö öööòòòÿööö èèèÿööö?þËó ööö=þûà 5 ô³Ûôÿèèèÿèèèÿ ðÛÝøÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿ+++½½½ÿèèè444ÿðððÌÌÌ444ÿÌÌÌÿ^^^ÝÛ²­¯ØÿèèèÿèèèÿJJJ888ÈÈȶ¶¶öööTTT888fff444ÿê45¾½ñññÌÌÌ444ÿê45¾½½½½ÿöööTTT888<<<BBBèèèCCCÿ½½½M&%ÿ4,ñü×ûå9Q888³Œ‹³ÚÛM&%ÿ4,ñÌÔ³ÚÛCCCÿzCß=; I‚½½½444ÿ·~ìÃÅów®ÌÌÌM&%ÿ.îêÒ³ÚÛM&%ÿe÷ñÉ÷ù7 › ËòóöööTTTÂÂÂêêêòòòšššÿfff444ÿ®GËþý‡»ëWWW<<<Òžn=:JäñññÌÌÌÿi;­Öÿ5 ôpb&CyÎM&%ÿf MÑÕM&%ÿ³ÚÛ|*(ÿÑüý³ÚÛS*ÿ­Öÿòòòÿöööòö üéÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèè444ÿÌÌÌ444ÿÌÌÌÿèèèÿèèè444ÿñññÌÌÌCCCÿê45¾½½½½ÿööö èèèM&%ÿ³ÚÛM&%ÿ0ì)<4  ³ÚÛCCCÿzC߆½!½½½CCCÿzCßw®ÌÌÌM&%ÿe÷ñÉ÷ùÒ³ÚÛM&%ÿe÷ñÉ÷ù7 rôôôöööòòòˆÞ¦ IDATñŠ[ÿËþýx¬ÜðððˆT$Dx¨S*ÿ—Åîi;—Åîèèèÿi;—Åî¥oCyÎM&%ÿ³ÚÛ€ÿM&%ÿ³ÚÛM&%ÿ³ÚÛÿööö öööòòòM&%ÿM&%ÿ|*(ÿ|*(ÿM&%ÿ³/+ÿM&%ÿ³/+ÿM&%ÿ)T„ÿ)T„ÿÅÁ‹ÿ¼ˆXÿ‚ÿ*‚ÿ6ˆ¿ÿiÀÁÿ*‚ÿM% ÿK ÿK ÿ!ÿK ÿbbbÿ%#ÿM% ÿCCCÿšššÿÖÖÖÿÖÖÖÿêêêÿšššÿCCCÿ2 ÿ #$ÿ¼ˆXÿ ÿÿÿÿ½‡2ÿ½‡2ÿ³/ÿM&%ÿ444ÿ444ÿ444ÿ444ÿ$$$ÿ½†"ÿ444ÿ444ÿ444ÿ0P'ÿ0P'ÿ)T„ÿ$$$ÿîÂÿšššÿ‘ÁÂÿÿýÇÿšššÿCCCÿCCCÿ½‡2ÿ=”ÿ0P'ÿÿ444ÿCCCÿ444ÿ$$$ÿCCCÿCCCÿCCCÿCCCÿ€TSÿCCCÿM&%ÿ$$$ÿ$$$ÿM&%ÿRÿò‰'ÿúÁ<ÿM&%ÿM&%ÿÿÿÿ444ÿ¬¬¬ÿSQ(ÿM&%ÿò‰'ÿò‰'ÿM&%ÿé%ÿé%ÿM&%ÿM&%ÿ^ÿ 2ÿ 2ÿ^ÿ 2ÿ444ÿ444ÿšššÿ444ÿ¼ˆXÿšššÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿM&%ÿRÿM&%ÿ²ÿRÿRÿ})ÿM&%ÿM&%ÿ|*(ÿM&%ÿ!ÿÿÿÿÿÿÿÿÿÿÿ444ÿCCCÿÿÿÿCCCÿ444ÿÿRRRÿCCCÿÿ #$ÿ¬¬¬ÿCCCÿRRRÿ€TSÿ¬¬¬ÿ444ÿÿÿÿÿÿ444ÿÿM&%ÿM&%ÿM&%ÿ³/+ÿ7³/+ÿM&%ÿÿM&%ÿM&%ÿf |*(ÿ7³/+ÿM&%ÿM&%ÿ7ìZ2ÿM&%ÿ)T„ÿ¤©z 4;d“ùhœÌ‚ÿî–*‚ÿÊ¢ÃSÈ—6ˆ¿ÿ*‚ÿ*‚ÿÖ~M% ÿK ÿþçýÖùûßûüµô÷骧&é)QjM% ÿCCCÿWWWÜÜÜCCCÿmmm   ììì<<<ÖÖÖÿêêêÿCCCÿ½½½ #$ÿ,¯e4Dx¨ ÿ0P'ÿ_ƒ-ÿ_ƒ-ÿöéü ÿ2 ÿÿÿÿÿÿ ÿÿÿÿÿÿÿCyÎCyÎíZ!ÿ³/ÿþæävvvÿM&%ÿM&%ÿ444ÿôËÅËÉ“úÁ/ÿôgž½†"ÿ444ÿÌÌÌÌÌÌä ä ü£0`BÁe¸¸¸öÆÅ’Äû5a,¶444ÿ444ÿCy΀ófm%|0P'ÿÿÿL yEL ==¼ˆXÿ=€TSÿ¼ˆXÿ=<4CCCÿCCCÿñññ/)0ìÌÓöwÙøÈë­›M&%ÿM&%ÿ/òòò÷ÿô ÿ ÿ!Oÿ!Oÿ÷ÿôÿÌÌÌbbbÿTTT¬¬¬ÿ¬¬¬ÿÿáã bbbÿ4,ñwÙ[þò‰'ÿ·Vÿùê5ÿé%ÿ/M&%ÿ/^ÿùÔ$òùÔ,^ÿ 2ÿ444ÿÌÌÌÌÌÌbbbÿ¼ˆXÿ©©©Dx¨"î¾fff...444ÿ/M&%ÿ})ÿ/™ïóúÂùü×û)4,ñ0ì|*(ÿÔßß,!!ÿöööÿÿööö ÿÿ444ÿËËËËËËCCCÿ444ÿèèèÿRRRÿ®®®‘ÁÂÿ„ŠÀÿ½½½‘ÁÂÿ„ŠÀÿCCCÿèèè õô #$ÿÿ¬¬¬ÿ———j6Òþÿ¦¦¦xxx”””ÿÿm÷öÿÿ÷ömÿCCCÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿÿ³ÚÛ|*(ÿM&%ÿ M&%ÿ|*(ÿ7M&%ÿ|*(ÿ7³/+ÿM&%ÿ/ÿÿÿÿÿÿf n $f M&%ÿÆÃäŸ4 4;i‹ÁóÌÅ×Öþ î–î– 93î–*‚ÿì!ÿþçýÚÿµô÷ßûü³Ûô+jmÕ–“Ëó CCCÿWWW"î¾ŠŠŠCCCÿCCCÿ½½½ŠŠŠ***   )%»ìììêêêÿ333;í˜Yª±öéüÞÓßÑÍú_ƒ-ÿöéüëÎ÷2 ÿÿöööööööööÿÿÿòòòÿÿM&%ÿK ÿÈåøÆÕö:+ h#Õ–“.îêvvvÿM&%ÿM&%ÿƒ"ç§póðüp8§pÛÙ£/-–ˉRîÿù7ÿ444ÿÌÌÌÌÌÌÌÌÌä à°]ÒÒÒÛÛÛÁ‘”ü˜ÿc—`ý444ÿÌÌÌCCCÿ'^ÿÿgò!™øY)fm%|8ÿÿ€TSÿÃïðhœÌŽº»=˜ÄÅŽº»R†¶˜ÄÅ<4ÄÌû==0ì“2÷:- j1ò‰'ÿM&%ÿ¥cM&%ÿj0ö;,óûóþûóþûöþä¾ôä¾ôp¼$ÿ!Oÿûóþ  ÿÿ'#ô444ÿTTT¶¶¶¬¬¬ÿÅÁ‹ÿèèèÌÌÌ'#ôÌÓöRÿM&%ÿ/ø¬÷;3 Í!ýcðîcðî— d n öœÿøM&%ÿùÔÜàó$ò$òùÔ @ 2ÿÌÌÌbbbÿZ&ö‡»ë½½½WWWšššÿDx¨"î¾888½½½½½½M&%ÿ0ì)ü×ûÏâáÐøúÎãøúÂù)ÿé¥ÛÜ*³ÚÛÿúööö êêêêêêèèèòòò444ÿÂÊ¿÷ÿô&&&&&&555ÂÊ¿ÚÌ 444ÿÿ RRRÿ„ŠÀÿ 7‘ÁÂÿ„ŠÀÿ“cb 7AG}CCCÿ”””ÊÊÊ–Êú$$$¦¦¦ÊÊÊ”””ÿ“úÿ÷òòòÿí ¦ñõÿÿÌÌ̽½½444ÿ444ÿÌÌÌÌÌÌ444ÿÿööö444ÿ444ÿùÌÌÌÿÿÿM&%ÿÑüý/M&%ÿf M&%ÿ³ÚÛM&%ÿ/’ôøf M&%ÿ7$ê60ÿf š÷ú7$7/Ñüýÿ=þû ÿ÷ö=þûöööÿÿ=úÿÿÿòòòÿÿêç6öòÈçæÿîë $7ÆÃäf îœeîœe$Ò¡)*Ü^–ìÜ^èjèj†™p§Ö~ê~K ÿ*ÚÿÛÝøM% ÿM% ÿ%#ÿvvvÿØþüÕ–“Í èèè½½½333“““vvvÿŠŠŠw{å)%»ttto<Ùõåû#ÿòÝúÞÓßÑÍú_ƒ-ÿ0P'ÿõåû2 ÿèèèòòòêêê?äää&&&öööÿÿH® ÿÿòòòòòòÿÿM&%ÿ0?ÈåøÆÕö:+ h#8Õ–“.îê|*(ÿSQ(ÿCkøÈøÅÍôûÈøøÈøüp¬¬ŸÑÓügž¾ëËÅSQ(ÿÌÌÌ...vlZ3aËïïˆç´ ÙØÖ9g¼·!äÎ6‚)ôaÂêš“ñš“ñY)-%|8ÿ´àáËËË“2÷˜ÄŤp@ öööŽº»\ÀÄÌû<4Ãïðñññ:- ;3 3ß3ßÅÍôj0öøÈë8j0ö;3 mÎ ·Vÿûóþûóþ  •QÞéÈö!Oÿèèèûóþ÷ÿôÿw{ªUQ"žžžTTT¡×¬¬¬ÿÅÁ‹ÿw{ªbbbÿðYü­ IDATÌÓöùn ö— ÅÍô;3 j1ããúʹßYƒâT Î1þ/Ñüýÿ 2ÿ,-¦ÜõpÜõp @ 2ÿbbbÿZ&öDx¨½½½vvvÿPPP¬¬¬ÿ¦Ú "ššÿCCCÿ½½½)ü×ûÎãøŸ)g núÂùü×û)`Múóõêêê ÿèèèÂÊ¿  ÚÚÚòñËËË555  èþ³½ÆïÚÚÚèèèòì¶>:ð’h5ÿš²‚{sAG} #$ÿõ õôvvvÿÍÍͦq;E$$$ÍÍÍ”””ÿ òòòèèèööö÷ÿòòòèèèÿ444ÿÌÌÌÌÌÌCCCÿ444ÿÌÌÌ444ÿÿÿÿÿÿÿÿÿööö 444ÿù444ÿ444ÿùããÿ?öööÿ+++ÿM&%ÿ/M&%ÿ7/M&%ÿ7M&%ÿM&%ÿp0 7f 9+$7f 7$n /K ÿÛÖùû Öùû=þûöööÿÃéîëöööÿÿÿ³ÚÛ|*(ÿ7qF#’ïò@lÆÃä:=7Ÿ4 f 7]/Xÿ¦ –ìì6^=÷ÇÍ 93ÿK ÿÚÿµô÷ÛÝøÿúCÿ4- MuŽ(ׯ–&éÚÿ5 ôM% ÿWWW"îvvvÿšššÿ``````CCCÿvvvÿw{å§Ù¢ïæ÷êüåââÑÍú/30P'ÿöéüõåûÿsEÁèé ? ÿÿ´[â÷ ÿÿÿ ÿÿM&%ÿ×þÿþæäÌÓûÐøú˜Ýò:+ :+ h#)PQ/444ÿš ùÅÍôÊüûûÈøüpÛÙ£/-gž¾ëŸ8ÿ\††ÿm™dÌ7Ih´TÙËïïOKŠŠŠtH}› 6¼º„444ÿôãûv 0 Þ¾çìÛ\š“ñ9Ý fm8ÿäää W¸órFEöööhœÌ¤p@rFEööö˜ÄÅÄÌûÌÌÌÿé;3 ÅÍôcðî%3ß;3 ÅÍô2›ý;3 2›ý–Ð òòòûóþûöþéÈö!Oÿ!Oÿ ÷ÿôÿw{ªbbbÿ444ÿžžž¶¶¶;?u¬¬¬ÿÎîʼn…VÿM&%ÿ/ 5ŒÈèøÌÒâ–ÏñÅÍô;3 ‡NåüýÅÍô,!_ðè×÷Ê M(‹öÀýì,888‡»ëšššÿšššÿ<<<ììì>>>JJJ¦Ú "î¾WWW½½½/(îü×ûlü Ÿ)Ÿ)žÈèøÉ÷ùÉøùnÎãøü×û0ì éëöööôôôòòòêêêöööÿ444ÿÂÊ¿  ½ñß?½Æï  ÐA555-QQÿììì;5.öÈüB6œmžáááDF|Kq6  õôèèè666ÊÊÊyEðððK€¶ˆº»Fâ$$$ÊÊÊ”””{ÿ íì!ÿmêêêöööòòòèèè444ÿCCCÿ444ÿñññ444ÿ444ÿCCCÿÌÌÌÿÿööö öööööööööÿèèèÌÌÌ444ÿ444ÿê444ÿ444ÿù`‹VããÌÌÌÿöööÁèéööööööCCCÿÿ|*(ÿê60ÿf 9+n  $M&%ÿþæän ÆÃä$ÿîëÆÃäÆÃäÆÃä$7$ºÝ$!ÿÃ%éñ÷*ìýþÖùû=þûÿ òòò ÿÿöööòòò7$ÆÃäqF#‰‹è8ÆÃä$$7ÆÃä:=:îô;5.4-xo5)*Ü^‰â­6r=)>†™ 9338èj)T„ÿÖùûÛÝøÿ½†"ÿ‚XÓç¸|4- rz&éþçýÍÍÍ<<<   æ²‚沂333vvvÿ```vvvÿC!ùñý#ÿ#ÿùñýÑÍú/30P'ÿ ÿ ööö?»ääääçòòòòòòöéüòòòööö ööö)0Ðøú³ÚÛµô÷0`ÌÆÕö:+ 8ž™¥ÛÜÌÌÌÐ,ó™òÆÓöq8 ‡‘çûÄhÉïøÈøûÈøûÄh¬¨gžÅÍôSQ(ÿCCCÿ5;<ÂÆüÑ¡ ‹“¬þ'šnèhÆ™c½½½fff›Ó_ïxHIÙìÐ÷ööö"Bñø¡Ð»š“ñY)'Êüfm8+ƒÿÿ+++¤p@ë´Qyn êêêR†¶˜ÄÅööö¤ÐÑñññCCCÿ:- –Ïñ0`Ëë%8;3 )øÈë8Îe)/M&%ÿÿ2 ÿ!Oÿ ÿ  ûöþä¾ôéÈö!Oÿèèè÷ÿô444ÿÎîÅ...0P'ÿ444ÿžžžbbbÿTTTÅÁ‹ÿаÙÙÝ 6óîýÛý¸\ç›ö4- IªåÅÍô;3 Â!lJ3ß;3 6óîþæäÿO!_q"mM ‘€Dõó³ðõ$!_,ùÔùÔ^ÿbbbÿ"î¾WWW<<<$$$ÄÄÄÄÄÄììì>>>JJJ¦Ú lü Éøù‘ßñ‘ßñ’ïòÉ÷ùžƒ×ïü×û)úöööÿòòò=þû ÿ  ûöþ½ñßA  ãúãæ444ÿòò/_`hœÌqÉùöÈüóÉþmžÊàá0AG}+++vvvÿÊÊÊÍÍÍ<;5âââµ€Jñññ<;5¾¾¾$$$ÍÍÍÊÊÊܬÿÿ“úÿí ÿí “úÿòòòÿÌÌÌÌÌÌ...½½½444ÿ444ÿÿd=þûöööööö ÌÌÌ444ÿê ¬­™’Çööö äääËËËËËËCCCÿÿöööÑüý/aÖÙ 77ºÝ‘Þß‘Þß  0/ ‹ÿ8ÆÃä8;= ;= 8ÆÃä$_²×ºÝqF#þÜþÑüý÷ òòòèèèÿôô ìýþÖùû3ôñÿÿèèèòòòèèèêêêêêêöööÿÿÿòòò|*(ÿÿîëþÛì@lÆÃäÐøú‘ßñ7ÆÃäþÛìþÛìÿïí75þÜþ  93ÄÅÓXÿ¦)*_0½†™“4Ô 93÷ÇÍì×ÖþS„ÿßûü!ÿi:þH„~¨-4- ŸêØþüÿŠŠŠ333```‡»ëFâ``````®®®×ÛE§```Ëòós0$üôþüôþ ÷êüÞÓßÑÍú/3 õåû³ÚÛòòò ôôôòòòÿòòò öööêêêèèèòòòòòò/.îêµô÷{ÿÐøú4-š÷ÆÕö8¥ÛÜò‰'ÿBs¦ß‹ŸÛxpI~§!ÅÍô½•ì™bþÆÓödóbbbÿWWW]β‚žžž®®®ü3›£)5ŸÿT444ÿ444ÿfff½½½CW®–ôyó(ôôôQuÝÓýóí:æÇ[jN sÉõÇ#ó7 z’³k=ÃÆùÃÆù\0/ öööêêêrFE êêꎺ»½½½ÆÓöÅÍô/ÅÍô¥c2›ýÅÍôj0ö/ÿ 7ö8óä¾ôûöþ ÿ ÿòòò   ûöþéÈö!Oÿ ÿ0P'ÿxxxÅÁ‹ÿY5/JJJY5/...0P'ÿ'#ô444ÿ;?uÅÁ‹ÿñïÆ³ÚÛNãêFÓè™ïó4- M% ÿIªåÅÍô;3 Í!ýÅÍô@lg ÿ<4,q"mÆj<4€;¿MDðß¡!_,ùÔ888hœÌPPPÈÈÈÈÈÈ$ëfììì>>>888"î¾888CCCÿ(îü×ûÉøùÉ÷ùAtIÐøúÉ÷ù?Éøùé%ÿÿ®êRÿéë?ÿŸ)ÂÊ¿÷ÿô  w<&Ðãúã555æµàáÛÿÿ“gœ`fœ 8B6œ’ÄûKqAG}666¾¾¾333¡ÊüûÊüûøÈøûÈøúÐù™bþ:- 888~W…ÿµ»êU´½½½׬|áááððð.þ©...444ÿCCCÿw­8Ò}Q8ÑÍú; _%$êùÜ Aл¹7YsÉõ!™ø¡\¯ÿÃïðÄÌûÄÌû=:<4¤ÐѤp@ 444ÿƒ×ïÿçƒ×ï¥d[œåðtâøÈëmÎ ;3 ;,óíõêÉæ¸èöûóþ ûöþ ÿ  ÷ éÈöB #lllçë!§ËÑxxx§ËÑc_)2;bbbÿ«¯ÞÌÌÌ;?u¬¬¬ÿbbb ̹ IDATÿ­¯ØK ÿµô÷³ÛôÌÓöÌÓöpb&S*ÿ3ß;3 ÅÍôC’b!_”ßß÷ʳ㠑žÍ<43..MÇðè×!_,^ÿ©©©vvvPPPììì$ëfÈÈȈˆˆÃÆöPPP¦Ú "î¾WWWü×ûm ÐøúÅËÒn;5.É÷ùÉøùmûõM&%ÿ®êöööØýã?7Ðæêêê  ÷ÿô sEòû$»ä  Mó"BËàÃ+++Üæ444ÿ—ÕÞØ¢ëÇÇöÈüöÈüóÉþÂØ¢óÉþ^V‹ 7CCCÿܬEºîºîÜÜܧÙÚE~³éÍÍÍÊÊÊ!ÿ{ÿÿ èèè? ÌÌÌ444ÿ444ÿCCCÿñññððððððñññRRRÿCCCÿ òòòèèèöööòòòòòòèèè èèèòòùZ66 8DDD`‹VFvw9>tñññÌÌÌöööööö ÚÚÚÿöööòòòM&%ÿÏâáQKÚ0ºÝg ÈèøÿðÿŽºîÈèøž’ïò³ÚÛš÷úÊ 8ºÝ™ïó‘ßñ™ïóýÛý7 qF#þÜþ’ôøMÑÕÿ!ÿóþþí òòòí Ã÷öõêêÿöööêêê 7Éùû:=nn78%%$¨úüÅËÒÅËÒ<;-Xÿ¦6^=)*D¢*÷ÇÍ 93Sm=×ÖþRÿÄÌôgž ÙkÌÓöþçý—ÆÄÌô<4 â©Í &éÿìììŠDáááFâWWW>>>ËòóÐÜùñýûöþÞÓß/3/32 ÿ ÿ öööäääèèè ööö0Á¦ðÐøúÙZ úÁåÈåøÆÕö:+ ßûüßûüûÄh0ÔÿøÈø:- IªåSQ(ÿxpIq7ÉïCk00ùÂ_ÿ•}«ýÿåß°½½½444ÿ;BÈÎ#ú$$½½½ÌÌÌÔPÛ8ð˜Ý\Jà]Ôþ,C3å AêùÜæÇ[eÕUúÏüŸ>áááÃïðÃÆù=: êêêhœÌh<;=ÌÌÌM&%ÿ;3 080%3ßÅÍô)2›ý)ÅÍô;3 ;,óØäûóþèèè  ÷ÿôü ö÷ÿôûöþä¾ô "Y[„­©s„¤{ä ,ôÔýÄÄËJJJ'#ôxxx¬¬¬ÿbbbÿbbbÿˆˆˆJJJK ÿµô÷µô÷M&%ÿ4.pb&-®ìiâôÿðÿÅÍôIªåûÇû)†Œi ùÔûå³Þò<43..÷Êðè× 6,ùÔáááPPPŒŒŒÃÆö„KÆÄÌøÄÄÄ888¦Ú "î¾CCCÿÐý%É÷ùÐøúÖùû ²Úq|OAtI¿Œ·ÐøúÉ÷ùÉøù/M&%ÿéë+òòòí  ü ö„ºØ½~òû$sEÁèéÞÓß.KñññµàááááóÉþw}?«ÁÂ99 8 8B6œÂÆüKqW9o>:AG}Dx¨ˆT$$$$§ÙÚ ÞÝ´².âââððð»íîE¾¾¾ÿí “úÿèèèòòòÿöööÿÿÌÌÌÌÌ̽½½½½½ñññññññññâââ½½½444ÿèèèèèèÿ ÿ ÌÌÌêgn9 89>t ¬­ 8óÈý`TSºŠ‰gn9ùòòòÿöööòòòòòòòòò³ÚÛ1o"!:=™ïó’ïò¦ñõoèî’ïòqF#Ñüý³ÚÛ³ÚÛÈåäaÖÙh#"qF#Èèø8ÆÃä$n M&%ÿÿßûüòòò!ÿ òòò÷öìýþóþþööö öööš÷ú7þÛìœnÉøùÿðÿüËübçì™ïóüËü%qF#ÐöDnaÌÓûˆ‘ËÄÅÓ<4×ÖþD¢*÷ÇÍ×ÖþÖ~<4 )è<<<4- µô÷èèè—ÆÃÅóèèèµô÷Øþü5 ôÜÜܽ½½mmmŠŠŠvvvN~92Cs9ÍÍÍ×ÛE***ýñüôþõåûs0$  üôþÞÓßÑÍúèèèêêêòòò?äää444ÿèèèöööòòò…ìñÈåøÒýáàZ 7 7 ÈåøÆÕö:+ ³/ÿøÈø gÅÍôIªå444ÿŸ8ÿ~0Ú„g²yoøÈøúÐùCzÞi çkƒ à°ÌÌÌ -ªðððÒÒÒ5;<›ew­Ôb9&§7&¥ì±e(§Ùè@üÍ%/þΖÐ÷”Ó#=<4=:‡’ôööörFEêêê˜ÄÅ®zJj0ö‹ ê:- ?Ä7Ê¥cX/mÎ ÅÍô;3 ûóþûóþÿ ÿ  ÷   ÷ÿô ûöþæóà„¤{;?uä üóä ,›ŸÎ›ŸÎÝÙªxxxJJJžžžÌÌÌTTT¬¬¬ÿM&%ÿ/<4ÄÌøËâÛãIªåÅÍôò‰'ÿ8‹’èßʆ G} 8 8<4€Dõ÷Ê$òvvv°°°ñÈÄÌøtttð)®"î¾°°°PPP‡»ëWWWÖùû,!!ßûü.­Æ1ÒÉÖùûÐøúÉ÷ùmûõ úÕýECÿòòòòòòòòòöööòòò  "-!÷ ûü0ö¨å¶üôþÿÖûQQ555Ðæ»ÑÒ%êòì¶ììì .-TÙöÈüóÉþÂÆü{sµú 7ÄÌûìììðððÒÒÒüÖÕ ÞÝmûõ˜ÄÅâââììì»íî444ÿòòòòòòÿÿÁèéòòò öööÿÿCCCÿCCCÿ444ÿ444ÿñññááááááÌÌÌÌÌÌÿöööòòòèèèèèèèèèÿ444ÿã㯄¹™’Ç`TSÇÂŒ™’ǦÊÊòò­­­444ÿòòòôôôÿ³ÚÛ„ÖØÑüý’ôø5«Ò1Ðøú[%$ºÝþæä„ÖØÐøú1Ñüýÿîë¡N)™ïó%8/M&%ÿ ÿìýþìýþ  òòòÿÿ èèèòòòèèèÿ³ÚÛÿïíÿðÿïdî%bçì:=Éøù¡N)ÉøùüËüýËën X÷ÇÍ×þÿ×X<;-ÄÌø 4;óÌÅ)¨½]°SÈ—Ö~ÿÄÌô®ê4- ç°LÌÓöèèèÄÌôBt!(ŠŠŠÞBvvvÿ½½½<<<úÇÎúÇÎ<<<888ýñõåûC!‰ÄÚ  åââööö"úøöööòòòòòò4-?ööö ÿòòòôôô ÿ…ìñµô÷³ÚÛßûüÉ÷ùÒ?ÈåøŽºîwÙøÈøIªåô8ƒhâ:- · #88<˜aÈ}ÞCzÞÒÒÒfffÌÌÌÌÌÌv|Ñù×ÿ>:’Äû444ÿÌÌÌCyέֺ°(Û*üÛ<4e(§õð2êöÍ'Àe(§r^áþ,ýÔ=:Žº» yn áªGöööÄÌûÃïð‚Ð&ÆÓöƒ×ïYí%8v_ÿ)ÅÔ  ÿíõê òòò  õåûA  ûóþöéüä ÌÌÌаÙÌÌÌä ,ßea2›ŸÎea2TTT‰…Vÿ¬¬¬ÿTTTµô÷K ÿ|*(ÿ)-®ìhÒóËâ²ÿé%ÿé%ÿ3ßÈèøNãêüéðè×ßÁPðž,M ‘º”÷öÈü€¼ 6)ÜàóPPPÈÈÈá8;5.ŒŒŒpH;5.ÈÈȰ°°888©©©üËü7 Ôßߌ g…ìñßûüÖùûÉøùöööÁèéúÕý;9ÿÿÿ ü öÿ5^Ü?Z– È·Mé÷ ÞÓßþÌÌËàà  µàáÛÿÿ—­®«ÁÂ;5.öÈüöÈü8þ˜óÉþ©Ç‘˜ÄÅôôô*+ö"#—/6öööäääððððððìììêêê ÿ©H ?èèè ööö½½½áááááá444ÿÿ ÿÿÿÿÿÿöööêZ66gn9™’Çòòããñññ`‹VóÈýããù444ÿÿòòòèèèòòòöööÿM&%ÿþæä¥ÛÜ[%$Ñüýg ¨úü,!!¥ÛÜÐøú0M&%ÿ|*(ÿÑüý/ÉûýþÜþþÜþþÜþ’ôø ÿ÷öóþþ!ÿ èèèí òòòòòòÿèèèÿ êêê öööÿ|*(ÿÊ 55ºÝþÜþ:=0É÷ù5$¨úü4ÔhœÌÜ^>¡¨ZXÿ¦<4ÄÌø)*D¢*÷ÇÍ 93ÿi:þÌÓö<4 ÄÌôþçý½%#ÿËó FâšššÿÄÄÄÃÆùÃÆù<<<ÂÂÂááá   õåû½ñß üôþC!s0$ùñýÑÍúM! "úøM&%ÿ<44-öööäää èèèÿèèèÿ ²ÿM&%ÿ…ìñÉ÷ùþæä ²Ú?7 7 qõ ³/ÿ})ÿÅÍô444ÿ444ÿ§pƒhâ}˜œû ÌÌÌüpÌÌÌ444ÿ444ÿ‡‡‡ÿÙûÓÂÆün9¢ñññÌÌÌCCCÿÐýÿ\Èõª"—ÅîêöÍ 3Ùè@£ÑúgòýÔþ,=ÃïðÃÆù h<;+bÅŽº» ãâÆÓö¸]äÐýM&%ÿ`Ëë;3 ‹ êv_ÿ/v_ÿÅÍô ÿ  ûóþûóþ 7ö!OÿûöþòòòòòòëÎ÷B  ÿÌÌÌ444ÿ444ÿüóÄÄË›ŸÎ>>>w{ªw{ª¶¶¶nÃUÓ IDAT¬¬¬ÿSQ(ÿµô÷/)<4Ûã²ÿ™ïó%ÅÍô@lðžùÔb 6MÇ3..ÍÒÒÄÌû‘žÍƒ)ðß¡ô¹ÂÂÂáááDx¨ììì®@h‡»ë¦Ú žžž©©©ÜÜܳÚÛbçì7**ðtâÿðÿïdáK ÿ*É÷ù³ÚÛêêê ×þÿECþÌÌY *˜ú:I³üôþáÒµ.K555Ü õôàÒÓ% .-wgœTÙ 8 8ÅËÒqÉùKq’ÄûóÉþÿ:::ðððâââÃïðÃïðöööêêêÆÆÆ öööÿ òòòòòò®zJ–Ð÷Áèéòòòèèè žžžâââ.........ÌÌÌ444ÿÿ òòòÌÌÌ444ÿy¯¯ÌAÌ4ÿÌÌÌÿòòòÿ öööòòòÿ³ÚÛM&%ÿ,Ñüýþæä›)þæä*ÙþæäM&%ÿ³ÚÛM&%ÿ¨úü)/6óîÉ÷ù ’ôøÏâáÈçæ8þ¨úüX³ÚÛèèèÿ÷ößûüÿöööíòòòÿòòò ÿòòòèèèÿöööööö öööÑ Õù6öòŸ*'’ôø7Õ6ºÝýËëaÌó)ÃÆù)*×Öþ—Åî—Å<)*D¢*Å9iÀÁÿ—@?3ôñÌÓ³ÛôÄÌôµô÷Rÿ<4 Æÿ(ôËó 5 ô³èfffšššÿ¨<<<ÄÄÄÜÜÜÈì œNvvv²²²NNNûóþÿò ìùñý³ÚÛÁèÿ$ ‘åöòøúÄÌøÌÓûêêêèèèòòò ÿòòòèèèÿ 7M&%ÿ…ìñ{ÿ ²Úh ÉøùŽùòMÜê·VÿIªååƒhÿYùáã ?ÑúÁ/ÿ¬¨TXñ4ÿÌÌÌÌÌÌCCCÿñññyyy444ÿº[Ž chÌÌÌRÿõ$`666ÊÊÊ]ÁîÆ$ÕÜéCô@ "ÏéÙ£ÐúôôôRËö®zJ=:Õž;+bÅêêêêêê®zJ\ÀöööËòóM&%ÿ³ÚÛÐýÿÔýM&%ÿ/³m “ôó8øÈëÅÍôv_ ÅÍô2=ª¨ûóþ ÿ ÿ 7öéÈöûöþ   ÿíõêéÈöÿôãñÿèèèÌÌÌ444ÿüóä xxxxxx'#ôžžžJJJÿ:Ø<4-®ìÿðÿé%ÿÉøù8ûÇûÅô;3 ,!_ðß¡MdzÚÛ³ÚÛ³ê9ÿ oÜðß¡ô¹xxxÆÆÆ888ááážžž888ÿfff½½½ÿ$$$ÍÍͽ½½ÿøg › ÚÛËâé%ÿÛãM&%ÿ/ÿêç7 öööêêê?³ÚÛÿ òòò+++ËËË øáÒµü þÒÛþãúã&&&ËàÃÿÖááý»ÑÒwgœ8þ˜5.:@¤S*ÿû×þ5dpqóÉþòòèèèÿöööËËËËËË&&&ðððäääèèè ÿÿ?‘žÍÁèéòòòÿööö444ÿÒÒÒáááÌÌÌÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿööö ööö èèèM&%ÿþæä³ÚÛM&%ÿþæä³ÚÛM&%ÿ×þÿ)/ÿêçÑüý³ÚÛÿÿôô ööö èèèÿööö ööö öööòòòM&%ÿœÿød³ÚÛ)T„ÿ×ÖþÖ~6ˆ¿ÿÊ¢ÃÖ~ÿèj)*ûРd›ÊxAM% ÿ4- ®êM% ÿËó i:þ<4 ÄÌô—Æèèèšššÿ<<<mmmáááÂÂÂvvv<<<mmmžžž ÿ èèè ÿûöþ ÷ $ûаÙS*ÿÌÓû4-»ä èèèÿèèèÿ ôôôÑ Éøù› ³ÚÛM&%ÿËòócü÷Þúü¿ íìÈ QYs¯§Ûã·Vÿ}ÞÌÌÌ444ÿÆûYù­¯Ø444ÿJ#QC©©©ñññÌÌÌCCCÿ—`ýi ááá½½½RÿáL§§§ÂÂÂ>>>ÂÂÂîîîÜÜÜé ·"Ðýá8ñÈ£Ñúêêê®zJ\Àööö ¤p@ÄÌûŽº»êêêòòòM&%ÿ/Ñüý/Ñüý³ÚÛ})ÿ)yo&øÈë‹ ê:- 2=Dx¨ÿööö÷ÿô ûöþ  ÷ÿô  ÷ÿô  ”””ßÄÄË“ÂJJJ¶¶¶ööö qm>“ÂJJJžžžM&%ÿpa 0ÓïýÛýÿðÿbçìg 8cñ³ÚÛò‰'ÿwÙÿ G!_ðß¡ô¹üé^ÿ!_ðß¡$ÆÜåMóöWWWTTT¬¬¬ÿ¶¶¶žžžCCCÿ½½½M&%ÿœÿøÉøù› ³ÚÛM&%ÿ/)1Êì7“ ÑüýÁèé?+»½æ öööòòòÿöööü ö 5 =ñññÌÌÌÿü ö &.ÌÌÌÿõ wgœ 7óÉþ|v@-QQÿTÙ7–Kqµú‰™dóÝÜ„ŠÀÿ|v@ÿ:::âââÚÚÚ&&&¼¼¼ èèèÿööö©H mÎöêêê èèèÿöööòòòCCCÿáááððð½½½ÿööö èèèM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ/Ñüý³ÚÛÿööö èèèÿèèèÿööö öööòòòM&%ÿ³ÚÛ)T„ÿïÄ”aÂýèèèÿíõê íõê ööö ööö ööö öööžžžbbb öööžžžßSW”””lllèèèM&%ÿþæär{)ÄÌøÌÓûùÿðÿdj0öIªå^ÿ!_ðß¡º5 ËòóöööòP 6:–½4ºööö?×þÿˆˆˆ>>>xxxžžžbbbÿˆˆˆÂÂÂTTTM&%ÿ/mûõÉøùÏ6û×þÑüý/@^0‘žÍob3-Å“ ÑüýÁèéúéëú.. úÕýÁèé èèè444ÿËàÃs0$ÐÜ5 =½½½444ÿ>çÐÜ5 =½½½„ŠÀÿ 7o?>„ŠÀÿ 7>:tH}ÕÕÕèèè-QQÿëÇÇ:::¦q;Zż¼¼DDD.˜ÄÅèèèM&%ÿÁèéòòò444ÿñññðððÌÌÌÿèèèÿèèèÿèèèÿèèèÿöööFvïÄ”aÂýŸ>aÂý;9§pYù§pWéèèè444ÿÌÌÌCCCÿWWW÷'(£srÌÌÌÿöööÛ/óûÑ %éñ èõ7 Éèõ7 Éèèè€TSÿÃïð½½½CCCÿ=´àáÌÌÌÿòòòÿ&&&ÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛÿŸ>aÂýŸ>IªåÿèèèÿèèèÿèèèÿèèèmÙ“ IDATM&%ÿ/Ïâá1ÏâáåüýL""mûõ“ mûõ“ Ñüýpa [‘æi;—Åîööö¯y$[‘æ¥o[‘æi;—ÅîÒÒÒêêêÿ€ÿêêêÿbbbÿžžžêêêÿêêêÿM&%ÿob3Dx¨¼ˆXÿDx¨¼ˆXÿDx¨M&%ÿ³ÚÛÿú(Áèé èèèÿèè轇2ÿ†¼zDzDïw­ÌÌÌCCCÿzDzDzDAG} 7²‚N~‡WV+++N~²‚N~²‚ÕÕÕ+++½½½ÿ¤p@\À¤p@\À¤p@\À¤p@Dx¨¼ˆXÿÄÌû€¬­ÿ5 ³ÚÛÿ èèè444ÿÌÌÌ444ÿÌÌÌCCCÿ½½½M&%ÿ³ÚÛ|*(ÿÑüý³ÚÛM&%ÿ³ÚÛ³/+ÿÉûýÑüý³ÚÛM&%ÿ/„ÖØ444ÿ½½½ÿ 5 ôËó èèè444ÿ½½½M% ÿØþü/- ùÕú³Ûôÿööö èèè444ÿ...žžžM&%ÿ³ÚÛM&%ÿe÷ñ;= ýÛýÈèø› ³ÚÛM&%ÿù’õ „ÖØíZ!ÿÐ„ÖØíZ!ÿ¦ßM&%ÿ/ÑüýùËâ-QQÿããððð --dpqœÓ¯¯-QQÿããÌÌÌÿ )èËó ôôôèèè444ÿÌÌÌ444ÿ½½½444ÿÌÌÌ444ÿÌÌÌCCCÿžžžCCCÿ½½½bbbÿžžžbbbÿžžž444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌCCCÿ-QQÿñññM&%ÿM&%ÿ444ÿ³/+ÿM&%ÿ³ÚÛ³ÚÛ³ÚÛM&%ÿM&%ÿ7M&%ÿ³/+ÿ³/+ÿ:+ö7M&%ÿf ÑüýCCCÿCCCÿCCCÿ-QQÿ-QQÿù444ÿ-QQÿ444ÿ444ÿ3ôñËó 444ÿ444ÿCCCÿ...333333½½½M% ÿTPÿTPÿ+(4.ööööööööööööÿfffˆˆˆ444ÿCCCÿ444ÿbbbÿM&%ÿ.îêê5ÿ{ÿe÷ñ8üËüÈèø\ñø³ÚÛ/n öíZ!ÿÐÑüýê5ÿíZ!ÿ/ê5ÿ/Ñüý³ÚÛ-QQÿããÌÌÌmždpq‘ÁÂÿdpqù444ÿÿöööööööööôôô×ÿi;ôôôööööööÿÿ444ÿÌÌÌÌÌÌ444ÿ444ÿBBB444ÿ444ÿÌÌÌ444ÿ444ÿ444ÿ444ÿbbbÿCCCÿBBBCCCÿbbbÿCCCÿbbbÿCCCÿ444ÿCCCÿbbbÿCCCÿ444ÿ444ÿÌÌÌfff444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿM&%ÿM&%ÿ-QQÿ?ƒTÿRRRÿ444ÿCCCÿRRRÿCCCÿÿ-QQÿCCCÿ\††ÿêÌÌÌM&%ÿ444ÿ×þÿCCCÿS*ÿCCCÿCCCÿ444ÿðððM&%ÿM&%ÿš÷ú 4üíZ!ÿ³/+ÿ|*(ÿ|*(ÿM&%ÿ³ÚÛ7 4ü|*(ÿ×þÿqõùf :+öýÜ/³/+ÿ/:+öñññê A"3"3êê ACC AñññùããÌÌÌ444ÿÍ 5 ôÿÿ444ÿ333$$$ììììììðððÒÒÒ®®® ÿØþüÑÓöÑÓö+ùÕú—Åîÿööööööÿ444ÿ<<<444ÿbbbÿ444ÿN~...ááá444ÿ.îêrF‘ßñK ÿÿÐøú;= ÿðÿ8àç\ñøòòòM&%ÿn ö%/n ö 4ü%/ûÑú’õ ³ÚÛê5ÿ%ê5ÿ-QQÿÌÌÌ‘ÁÂÿÑ¡ Ñ¡ ËÅÄÓ¯¯-QQÿÑ¡ ËÅÄdpqùööö555&&&5 ôÁéêêê³á ?þ?þi;5 ôÿ...444ÿÌÌÌìììáááÌÌÌ444ÿÌÌÌbbbÿCCCÿ444ÿ444ÿ444ÿÌÌÌ444ÿbbbÿžžž444ÿ½½½bbbÿCCCÿ$$$333CCCÿbbbÿ½½½ááážžžCCCÿCCCÿ444ÿCCCÿCCCÿCCCÿ½½½...^„Uÿû$Á...444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ0P'ÿ0P'ÿüó444ÿüó444ÿùM&%ÿM&%ÿ/ããÏþ444ÿRRRÿâââÌÌÌñññ®®®444ÿÿöööÿÿ\††ÿ-QQÿããêÑËË÷ÓÓããM&%ÿñØ]/>ç4-Âð ãâM&%ÿñññòñ)ö³ÚÛ`Ì/:+öq0ùv_ÿ 4ü³/+ÿ|*(ÿ|*(ÿ|*(ÿ×þÿf Éùû¨úü É6ýqõùÉùû:+öq0ùýÜf ÌÌÌòòÞüÍBl>/55êdpqç½½ôî¿ùããù444ÿÌÌÌ444ÿÿ?þ4.3ôñììììììðððáááñññ444ÿ444ÿM% ÿ àêú/- ùÕú-5 ôÿôôÿôôÿôôÿ¢¢¢   ÂÂÂ]ެ¬¬ÿ444ÿêêêÿˆˆˆbbbÿ444ÿ444ÿ9/_`ñññÌÌÌÐøúýÛý©K ÿ¤Ã%éñ?M&%ÿ³ÚÛ%/8T //Ðn öT ú$$œááá¤zz/55/_`ÜÜËÅÄ444ÿ?þ>çsE×ÿMööööôôô4.³á 4.5 ôžžž...CCCÿ444ÿ444ÿñññÒÒÒÌÌÌ444ÿ444ÿÌÌÌ444ÿÌÌÌbbbÿbbbÿ½½½bbbÿÂÂÂCCCÿ444ÿÌÌÌžžžCCCÿbbbÿžžž444ÿñññáááCCCÿÒÒÒ44&¬ IDAT4ÿ444ÿžžžñññ444ÿ½½½ÌÌ̽½½CCCÿááábbbÿ½½½ÿúdÿò‰'ÿ444ÿ444ÿðððü"ó...444ÿ444ÿ7:ŸvÙ...ÒÒÒððð444ÿððð444ÿ444ÿÌÌÌñññÌÌÌ444ÿüóüóä 22üó444ÿ2444ÿããÌÌÌM&%ÿ³ÚÛ/œîðÛÿÿù444ÿ®®®ááá444ÿèèèöööÿÿ-QQÿ/55ÑËË/55ç½½êÓ¯¯444ÿÌÌÌ444ÿááá]/£Ñú ãâ³ÚÛ|*(ÿÑüý 4üÆÕ :+öÆÕ 'üÙýÉûý„ÖØM&%ÿ 4üýÜÉùû:+öýÜÉùû:+öÆÕ š÷ú³ÚÛCCCÿê/55Ú9ÍÅç3;&þÇÑËËããÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿ5 ôþçýÍ i;ÌÒâç(Mö­Ö444ÿðððáááñññ½½½ ÿ /- ùÕú+ùÕú4.­Öÿöööÿôô ÷þÿ òòòvvvÿæP&&>>>rœœÜ܈ˆˆ444ÿððð.../_`Ñ¡ ÂÂÂÌÌÌÿm¦ñõí =þûžÿðÿ“ Ñüý³ÚÛíZ!ÿ gøÈø8øÈøûÑúýÛý%/ø¬÷’õ „ÖØ444ÿùdpq²‚CC5;<²‚N~o?>-QQÿëÇÇMöÂðÕÕÕööö?þÁé 5 ôç(>ç­Ö444ÿ...áááááá½½½444ÿÌÌÌbbbÿÒÒÒÌÌÌbbbÿtttŒŒŒJJJˆˆˆÌÌÌbbbÿ888©©©žžž0Oÿåãúбñ444ÿVPéìòY¾¾¾ÌÌÌÿTTT¬¬¬ èèèCCCÿáááñññ“‹ö+ÊýB« ÌÌÌ444ÿððð*P!Ö°ßaŠ'Ü?Äê»Ö°ßðððÌÌÌ444ÿ½½½444ÿ...žžžCCCÿñññÌÌÌ0P'ÿä üóä üóä üóä ÌÌÌ444ÿùããÌÌÌM&%ÿ³ÚÛM&%ÿ×þÿôôô5 ³ÚÛ-QQÿ22ÑËËÓ¯¯bbbÿðððââââââñññ®®®ÿöööòòò444ÿùÓ¯¯CCCÿááá --ããñññÌÌÌ444ÿòñö>ç£Ñú)èö7ñññÌÌÌ|*(ÿ¨úüXq0ùÆÕ :+ö¦ßM&%ÿ³ÚÛíZ!ÿÆÕ 7$ñÆÕ :+öÐq0ùýÜÉùûš÷ú³ÚÛ-QQÿããù/555;<ËÅÄóÏþôî¿êÓ¯¯444ÿÌÌÌ444ÿÌÌÌ444ÿáááÌÌÌÿ5 ôþçýÃ&&&>ç—Åî5 ôç(MöÌÒâ³Ûô444ÿððððððññññññÌÌÌÿíõê (4.üÖç×'ÑÓö(³Ûôÿöööÿôô æüý÷þÿ òòòbbbÿìììáááN~Y)(ÂÂÂTTT‘ÁÂÿY)(°°°fff444ÿ...ÒÒÒñññÌÌÌK ÿÃÜ'%ÅÃõ8Éú ÉûýÑüý³ÚÛ|*(ÿq0ù gøÈø8øÈøŠ¡„ÖØ444ÿùdpqœ/55ç½½N~ËÅÄÜÜááá½½½ÿ555>ç³á äääööö 5 ôËó ööö?þç(Mö»äòòò444ÿ...ÍÍͽ½½444ÿðððÌÌÌS*ÿÌÒâö7½½½êêêÿ°°°ˆˆˆ...JJJTTT2 ÿ…h‘ÈÈÈÎí­04 µ¯ïæèèè·VÿnÍí’3W¸óòòòÿööö èèèÿ èèè444ÿ...Uô¹imu ÌÌÌ444ÿÌÌÌbbbÿ888ÈÈÈÒÒÒððð™cØ7)ì•Ï­Ö444ÿññññññžžž0P'ÿä Nøô²üó2ðÎûä ÌÌÌ444ÿêòò½½½M&%ÿ/Ñüý/œîð )³ÚÛ-QQÿããÛÿÿãã O Á}¬444ÿÒÒÒñññ½½½ÿ èèè-QQÿòòñññCCÑËËããÌÌÌM&%ÿçMöÌÒâç(òñ4-­ÖM&%ÿ³ÚÛ³/+ÿqõù :+ö/ûÑú/wÙM&%ÿ/„ÖØM&%ÿ³ÚÛ³/+ÿ:+öÐv_ÿûÑúÆÕ :+öÐ7Éûý„ÖØ444ÿù/55ÑËË/55óÏþÞüÍÓ¯¯CCCÿñññÌÌÌ444ÿ½½½444ÿ½½½ÿ?þ4.ʹßËó >ç—Åî5 ôç(Mö­Ö444ÿ$$$ìììááá½½½ÿöööúåôü (+-¤ÑòÛÝøÿööö ööö èèèbbbÿÂÂÂ>>>JJJ>>>YYY½½½444ÿñññðððÌÌ̲ÿ\ñø=þûg › .îêÐøúµô÷ê5ÿT 8øÈø8øÈøûÑú gøÈøŠ¡„ÖØ-QQÿdpqËÅÄÑËË/55ÜÜú$$ÜÜáááêÓ¯¯M% ÿ4.Âð>ç»äôôô5 ôÁé?þ4.ÌÒâÁéòòò444ÿÌÌÌ444ÿBBB¾¾¾ðððñññÌÌÌM% ÿØþü\0"­Öÿ?þÔàøßûü³/ÿù}•ƒkMÑé444ÿ...žžž`ƒÿÁÌôåãúñÿóõèè芄ÿÁˆìÍ  ðea›ŸëÛÝøÿm èèèÿööö èèè·Vÿ;3 ÅÍôIªå444ÿÌÌÌbbbÿñÈ<4ÄÌø³á ÌÌÌ444ÿÌÌÌ444ÿ...áááñññÌÌÌ444ÿüóä Ùïð'üóаÙ444ÿùããêòòñññÌÌÌM&%ÿ/)£ÑúXÑüý³ÚÛM&%ÿ³ÚÛ-QQÿããí1å¡Ð --2Á}¬444ÿââââââÌÌÌÿ èèèÿòòò444ÿÌÌÌÓ¯¯CCCÿñññùêêËËòò½½½þæäµô÷S*ÿÌÒâ4.4.öÌÒç­Ö'ÙqõùÉûÑú/Š¡¨Êü|*(ÿ7MÑÕ/&%ÿš÷ú7Ü7ûÉûýûÑú/:öýÜn $ñ7Ü„444ÿòòç½½ A/555;<œËòòêòò-QQÿããÌÌÌñññ?þ4.ÌÒâÃé?ôö>çÌÒâ þçñ³á MöÌÌÌ444ÿñññÌÌÌ444ÿñññâââáááCCCÿ½½½éëCØþüùÕúÓ+\/Óþü(ÿ³Ûôÿöööööö èèèžžž444ÿˆˆˆxxx444ÿ...áááñññðððððð444ÿÌÌÌÿ™ïó0É÷ù7 ÁèéþþûÃ÷%888ûÈøýÛýó™ò gøÈøø¬÷„Öâ-QQÿËÅÄÑËËç½½ñññááê÷ÓÓ\††ÿ¤zzç(ö>çÂðúôôôööö Ëó ?Ø4.³á M.ËÅîòòò444ÿÌÌÌ444ÿ...ìììÒÒÒRRR¾¾¾ñññÌÌÌK ÿ³Ûôÿ¤ÐÞ(÷öþçÃMÑéb¶¶ÿžÑéÌÌÌÌÌÌbbbÿžžž2 ÿ¦÷ô ûñÿõÛèè莔û èèèÿ›Ÿ”àºÐ IDATëéëøòòò…ñèèèòòòi‰Uå…ìñÌÌÌ444ÿñØñÈÌÒâ³á ÌÌÌÌÌÌáááñññä 'üóä ÌÌÌ4ÿùòòòòññññÌÌ̳ÚÛ&%ÿÓý]/û×þÑüýS*ÿû×þÑüýRRRÿâââÌÌÌ-QQÿí12åÐããî...ðððÌÌÌÿ èèèòòò ööö êêêÌÌÌCCCÿ½½½ÌÌÌòòããòòñññ444ÿ444ÿµô÷­Ö³á ÌÓûÂðÌÓû³ÚÛ–Ð÷?Zü)7ÊÆÕ Á¦;, ;,ÑüýMÑÕ/Éùû:+öÐÆÕ ’ôø$ñÉùûM&%ÿêÞüÍóÏþËÅÄ/55 AêããñññããÌÌÌÌÌÌÌÌÌÌÌÌñññCCCÿÿ4. ö7>çÌÒâ4.)èµô÷ØÕñØÌÒâ444ÿÌÌÌ333333áááñññúØþü0ØþüÑÓöùÕú+%#ÿöööÿôôÿôôÿôôÿôôöööèèè...———ˆˆˆ444ÿ.../_`...444ÿ444ÿ=þûÃ7 =þûÖùû“úÿÉ÷ù¤Ã/øÈø88%`Ìó™òûÑúø¬÷ËâM&%ÿ‘ÁÂÿ/55/555;<ããòòCCêããmžç½½MöÂð³á ËËËôôôööö 5 ô5 ôäää³á Mö»ä444ÿÒÒÒÂÂÂBBBBBBÍÍÍáááñññ444ÿµô÷èèèÛÝø³Ûô!ÿí Ãßûüžžžžžžæ›ïëÎ÷ÛÝøèèèèèèèèèèèèóõ|v9AÖ…ìñÌÌÌ4.1ÊìËó ­ÖÌÌÌÒÒÒñññÌÌÌÌÌÌ444ÿððð#-3_ NøüóÌÌÌ444ÿ444ÿÌÌÌÌÌÌããñññððð444ÿ4-û×þÑüý³ÚÛ³ÚÛÌÓûÑüý³ÚÛ®®®ÌÌÌ --ðððãã444ÿðððñññðððâââ èèèôôôòòòñññ444ÿ-QQÿ\††ÿêùêÌÌÌÌÌÌÌÌÌS*ÿCCCÿ×þÿòñö>ç4-×þÿK ÿ³ÚÛûÑúf  :+öÆÕ :+öüÙý'üÙý×þÿM&%ÿ„ÖØÑüýf š÷úq0ùq0ùûÑú7ýÜÆÕ ÉûýÌÌÌññññññòòòòôî¿ÑËËóÏþóÏþÞüÍããÌÌÌÌÌÌÌÌ̽½½444ÿññññññ5 ô4.ÌÒâ5 ô>ç³á 4.³á µô÷³Ûô³Ûô444ÿÌÌÌÌÌÌ444ÿììììììññññññ444ÿ ðàêú(ÐüûçÓþü0%#ÿòòò  ÿôô444ÿˆˆˆ§×Øááá§×Ø...444ÿ.../_`9ððð.../_`444ÿÖùû¤\ñø0í ¦ñõ\ñø¤ÿwÙ88Z/7ÊcñM&%ÿ/ËÅÄØ®®ËÅÄêêdpq]ŽËÅÄ444ÿ—ÅîMö 5 ôËó 5 ôËó Ëó  444ÿÌÌÌðððððð>>>ììì¾¾¾ñññðððÿí ÿÿèèèèèèèè莔û­Öfûèèè444ÿÌÌÌðððüó2ðÎûä аÙ444ÿÌÌÌÌÌÌê444ÿû×þÑüý³ÚÛ³ÚÛ444ÿÏþãýÎÌÌÌèèèèèèÿÌÌÌùòòÑËËòòÓ¯¯­Ö ãâ4->çÂðʹß)M&%ÿ¦ß'qõùÊü :+öüÙýš÷ú)³ÚÛ ///$ñn $ñÑüý³ÚÛÌÌÌÌÌÌññññññ 1Bl>444ÿÌÌÌ444ÿñññ³ÛôÌÒâÌÒâ×ÿ)è4.³á ÌÒâMö4.ÌÌÌ444ÿ½½½âââááááááðððÌÌÌÌÌÌ%#ÿéëéëØþüóþþüâüÑÓöÐüû-/- ÛÝø  ø    ÿ...ëêëꈈˆ444ÿÒÒÒÑ¡ ÁhÒÒÒ/_`9/_`ñññ444ÿÌÌÌÿZ ™ïó¦ñõ÷öí É÷ù ööö|*(ÿûÈøZþ¦n ö)ýÛý/M&%ÿ/ÑüýØ®®5;<(RRòòòòêÑËËËÅÄç½½ððð>çÌÒâ Ëó Ëó 5 ô5 ôöööËËË—Åî 444ÿááá>>>áááÂÂÂ...ÒÒÒððððððRRRÒÒÒÌÌÌêêêòòòêêêÿÿèèèÿÿÿÿèèèñññðððÌÌÌðÎûä ÌÌÌÌÌÌ444ÿÌÌÌããðððM&%ÿ/Ñüý/³ÚÛù%Ûÿÿ/55ùÌÌÌñññðððâââÌÌÌÿèèè èèèèèèÓ¯¯ñññ÷ÓÓêãã444ÿ³ÚÛ½½½­ÖÌÓû6G!×þÿÿçK ÿ³ÚÛM&%ÿIªÒXÅÔú:+ö/ÆÕ š÷úÉùûûÑú/88/$ñÐÉûýêòòÑË˾”Âòòñññ444ÿ444ÿ½½½½½½ÌÌÌ444ÿÌÌ̽½½³Ûô³Ûôôôô³á ñØñññÌÒâÌÒâS*ÿM% ÿ444ÿÌÌÌÌÌÌÌÌÌ444ÿ%#ÿéëú +/- ñýþüâü¤ÐÞ-èèèèèèÞ÷þÿ÷þÿ 444ÿˆˆˆ§×ض¶¶...ÌÌÌÌÌÌÒÒÒÒÒÒÌÌÌñññÑ¡ ðÇýÑ¡ áááÌÌÌ3ôñ“úÿÃí ÷ö“úÿ3ôñÿq0ùøÈøûÈøþ¦Z88/%/’õ /(RRËÅÄÑËË/55êòòê/555;<ËÅÄêê —ÅîËó ôôô 5 ô)èi; 444ÿñññ...áááñññ>>>ÂÂÂRRR>>>¾¾¾ÌÌÌÿÿÿòòòôôô ôôôôôô èèèÿÿÿÿÿÿÿ< ó© IDATÿÿÿÿÿÿÿÿÿÿèèèèèèÿÿÿÿ...ÌÌÌä ðÎûä ÌÌÌ444ÿÌÌÌêÌÌÌM&%ÿ/Ñüý4-M&%ÿÛÿÿ2ÏþãýÎèèèööö444ÿÌÌÌùñããÌÌÌM&%ÿ>çÂð)â³ÚôM&%ÿ³ÚÛ„ÖØ|*(ÿÆÕ :öš÷þ³ÚÛ³ÚÛ&%ÿ7Ü$ñ87ÉûýÌÌÌ444ÿñññ"A 1ÞËÓ¯¯444ÿððð444ÿÌÌÌÿöööçMö³á(ñØËó i;ÌÒâ4.³ÛÖ444ÿÌÌÌÌÌÌ444ÿñññááá½½½÷ÿô éë ÀÝöþü(, Ø/- ¤ÐÞ%#ÿÛÝø ööö#Ýôôö èèèëê£ÒÒù§×؈ˆˆËïïÿããÌÌÌÌÌÌ444ÿÌÌÌÌÌÌ444ÿÒÒÒ¡ áááñññÌÌÌÿÃí ÷öí í =þûÃööÿ`Ì/Ðq0ù:8qùýÛý’õ Ñüý×þÿ8ÑËË/55ÑËË/55ç½½CCœdpqç½½CCØããäääñØ×ÿ]/ÌÒâ×ÿ]/³á äó 5 ôË ôôôÜÜÜ444ÿÂÂÂÒÒÒ¾¾¾ÌÌÌ444ÿÌÌÌÿèèèÿèèèÿèèèèèèÿèèèÿèèèèèèÿÿèèèÿèèèÿèèèÿèèèÌÌÌÿ444ÿÌÌÌ44ÿÌÌÌÌÌÌ444ÿããðððÌÌÌ„ÖØ/(ÿÑüý³ÚÛ444ÿùÏþÛÿÿÎý444ÿÌÌÌâââÌÌÌÿöööèèè444ÿÌÌÌCCCÿñññÌÌÌM&%ÿ4-­ÖM&%ÿ³ÚÛM&%ÿ/„ÖØ³/+ÿ:+öÐ„ÖØM&%ÿf :+ö gó™òÆÕ Éûý„ÖØ444ÿñññùãã½½½444ÿÌÌÌ444ÿðððÌÌÌÿööö&&&ñØç(ñØ×ÿ)èþçý6G!³á Mö³á ÌÌÌCCCÿáááñññÌÌÌ ÿ éþéëúèßú!(+ùÕúØþü(³Ûôÿöööÿôô#)×úûÝúü èèè444ÿù½™™ÂÂÂ¥¥I%%666>>>CggÓ¯¯444ÿ...ÒÒÒÌÌÌÿööö÷öí òòòM&%ÿ/n öT 88Zþ¦ûÈøøÈøûÑúýÛýcñöCCÑËË/55ç½½êòòêòòCCÑËË Ô»Ëó 5 ôç(ñØËó 5 ôç(ñØËó 5 ô×ÿôôôèèè444ÿÒÒÒÌÌÌ444ÿÌÌÌÿèèèÿèèèÿèèèÿèèèÿèèèÿèèè444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛ444ÿêòòñññÌÌÌ444ÿ½½½ÿöööòòòÿèèèCCCÿñññÌÌÌ444ÿòñ³ÚÛ|*(ÿ7'IªÒM&%ÿf :+ö/ûÑúÆÕ š÷ú³ÚÛ444ÿñññùããÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿñØç(ðððäääñØç(ÌÌÌ444ÿâââÌÌÌ%#ÿåôü åôüC+ÑÓö(ØþüÛÝøÿöööÿôô#)"Þúü×úûÞ èèè-QQÿI%%·ÛÛI%%·ÛÛããÌÌÌ444ÿÌÌÌÿ ööö ööö öööòòòê5ÿ%/8:bþ¦ûÈøøÈøûÑúýÛýY%ê/555;<ËÅÄÑËËdpqËÅÄÑËËããðððôôô ôôô5 ôËó i;ÌÒâËó ôôô ôôôèèè444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿ ôôôèèè444ÿÌÌÌ444ÿÌÌÌ|*(ÿ„ÖØM&%ÿf :+ö/ûÑúÆÕ :+öÆÕ :+öÆÕ š÷ú³ÚÛ444ÿ½½½444ÿÌÌÌ444ÿÌÌÌÿÌÌÌ444ÿñØç(ñØ×ÿÌÌÌM% ÿç(ÌÌÌ444ÿÌÌÌ ÿCØþüÛÝø%#ÿÛÝøM&%ÿ/Ñüý³ÚÛ444ÿùI%%·ÛÛããðððùI%%·ÛÛããÌÌÌ444ÿÌÌÌÿèèèÿèèèÿèèèÿöööòòòÿòòòê5ÿ%/ø¬÷%/ûÑúýÛý’õ „ÖØ444ÿêÓ¯¯444ÿ(RR5;<ËÅÄÑËËããÌÌÌÿ ôôô )è³ÛôM% ÿ³Ûôÿèèè444ÿÌÌÌ444ÿÌÌÌ­ÔÀz IDAT€ÿ444ÿÌÌÌM&%ÿ³ÚÛ444ÿÌÌÌ444ÿÌÌÌÿèèèÿÿ #ÿÿÿÿÿÿÿÿÿvvvÿvvvÿÿÿvvvÿ¬¬¬ÿ¬¬¬ÿvvvÿvvvÿRÿCCCÿ¬¬¬ÿ¬¬¬ÿ¬¬¬ÿCCCÿÖÖÖÿ#ÿTPÿ`ƒÿ`ƒÿ`ƒÿ`ƒÿvvvÿvvvÿvvvÿ½‡2ÿ$$$ÿS*ÿvvvÿvvvÿCCCÿšššÿbbbÿšššÿvvvÿ444ÿ444ÿ!ÿÿÿÿÿ444ÿ444ÿM% ÿM&%ÿM% ÿ|*(ÿÿÿÿð ÿÿÿîëÿÿÿÿÿÿÿèèèÿÿ ÿmöööÿöööòòòÿÿÿÿvvvÿ444ÿ```vvvÿÿÿòòòÿÿ¬¬¬ÿvvvÿCCCÿvvvÿììì¶¶¶¶¶¶666vvvÿRÿ®êñññCCCÿ444ÿ¶¶¶ÊÊʬ¬¬ÿ½½½CCCÿbbbÿ***ÖÖÖÿÖÖÖÿšššÿ õ#ÿ ÿ ÿ ÿCCCÿÐÔôÍøôÍøôÍø`ƒÿ`ƒÿvvvÿìì슊ŠšššÿvvvÿCyÎ]/­ÖŠŠŠvvvÿ0ÿM% ÿK ÿ|*(ÿÿÿÈÈÈáááÜÜÜ$$$vvvÿCCCÿÿÿÿÿM&%ÿM&%ÿÿ 2ÿCCCÿ444ÿ444ÿ444ÿ!ÿ444ÿìýþ ÿÿ íì÷öÿôô=þû444ÿððð444ÿÌÌÌ444ÿ²1TÿM&%ÿ¶WUÿ³/+ÿ³/+ÿ4-Ëó S*ÿ„ÖØÿöööÿÿÿöööÿÿîëòö =òòòòö ÿÿÿÿöööÿöööèèèòòò ÿ ÿK ÿ÷öK ÿ ÿòòòèèèÿÿÿÕB ßLöööÿÿÿòòòÿ ÿöööÿÿÿvvvÿ$$$BBBÄÄÄ```444ÿÿÿTTTCCCÿŠŠŠžžžÍÍͶ¶¶¬¬¬ÿvvvÿ<4 ÌÌÌñññ444ÿžžžììì¶¶¶¬¬¬ÿvvvÿ½½½ááábbbÿbbbÿ***ÄÄÄ<<<ÖÖÖÿšššÿèèèF-  9,?333æóରîôÍøôÍøôÍø`ƒÿžžžñŠ[ÿøÃÿŠŠŠÜÜÜ$$$vvvÿ­Ö½‡2ÿº’Þº’ããú´ÞÞùÂ_ÿS*ÿ¬¬¬ÕB ¶¶¶M% ÿ¼ˆXÿ®®®±roŠŠŠ½½½mò‰'ÿòòòÿÿÿ íì ÿ!ÿ!ÿ!ÿ!ÿ/ÿòòò444ÿñññC:ÚÌ éÛK)QÿK)Qÿ444ÿCCCÿÌÌÌ!ÿÿÿÿÿCCCÿCCCÿCCCÿCCCÿ!ÿ  ÿ íììýþÃ*‚ÿ444ÿ444ÿ!P+1`CCCÿCCCÿ²1TÿróÐ|*(ÿi10ýØÖE”b9+|*(ÿÿçS*ÿÌÒâM% ÿM&%ÿÌÒâÿöööm÷ö3ôñÿÿÿÿöööÿÿÿÿòòò  ÷ÿÃéÿÿ  èèèèèèòòòÿööö¤÷öcü÷ÿÿ èèèòòòöööÿ íì¢N*¢NÿòòòöööÿÒŸwuŸÿèèèöööÿÿü öœß,ü öü ö èèèèèè444ÿvvvÿÄÄÄBBB òòò ÿŠŠŠbbbÿžžžáááììì¶¶¶666vvvÿgž½†"ÿBBBiiiBBBCCCÿžžžááá¶¶¶666vvvÿ½½½ááá—`ýS*ÿfffÄÄÄŒŒŒ<<<ÖÖÖÿTPÿºÓô=l_r”¡Ž ÿ ÿ¬°îÁâ÷Áâ÷ôÍø`ƒÿ`ƒÿvvvÿìììvvvÿùÇÎ$$$ÄÌøM% ÿ0ÿ=þûããúŒ€Rˆ‘Ë;5.ùÂ_ÿÿ +¾÷äääöööÿÿç(¼ˆXÿááá2¼ˆXÿ“úÿ…çÿöööÿäéYV IDATÿÿÿÿ0ÿ0ÿ0ÿÿÿ íì í èèèõÿÿ!ÿÿM&%ÿM&%ÿÿM&%ÿÿÿÿêüýÚÚÚ444ÿðððñññ&4ôÕzØÒæþµàáËËËñññ444ÿ!ÿí !ÿ5 ô3ôñ5 ôRÿK ÿÿCCCÿÿ333!ÿ÷ ÿ÷õêêìýþ,  Oÿì444ÿ!P!P 182!PñññÌÌÌÿ:*X:--ýØÖ>[0p0 ³ÛôÌÒâ|*(ÿM&%ÿÿç×ÿM% ÿööö¦ñõí Ãöööÿöööÿöööÿÿöööèèè ÿöööèìÿÿ  øõ ÿÿöööoèîí “úÿöööÿÿèèèòòòöööí ^²èÖùû4«ãöööÿööö ÿÿöööa×ë|Ø…ç|Ø=þûÿÿòòòêêê÷ d!Ô&8 ü ö&8 ÿÿÿBBB$$$<<<¾¾¾ÈÈÈÿ öööèèèööö ÿŠŠŠCCCÿŠŠŠáááááážžžÊÊÊ666ˆˆˆÄÌô¬¬¬ÿ666ÊÊÊ666333vvvÿ333¶¶¶ÊÊÊ666S*ÿ¶Jäxo5bbbÿfffŒŒŒÖÖÖÿFJˆ õ\0/zmÜvä¼C! ÿ0OÿÁâ÷ôÍøôÍø`ƒÿìììS*ÿ\›±92ñŠ[ÿS*ÿÍÍÍÜÜÜvvvÿ­Öpb&4.QK$‘´xo5ÅËÒÃÆùS*ÿ ööööööööö ñØÅËÒÅËÒ˜d4)è?_Gÿÿòòò0ÿ{ÿÿÿèèèÿ÷öø¦ö0ÿöõòòòöööÿÐøúÞæüý0ÿÿÿ õÿÿòòò{ÿä{êüýí õÿÿõÿÿ íìÿÁèéÁèénM&%ÿ/M&%ÿ/M&%ÿöööÿÿèèèêüýÿÿ555ÚÚÚ½Æï+†(ãúãæËËËü öí äûQQ444ÿßûüK ÿ?þ, þçý4- <5‡‡‡ÿCCCÿ%%%­©?!ÿìýþõêê õêêìýþìýþ*ÀÝöèèè OÿC6ô!P 1+s> 1ñññÌâN²1Tÿì[XÿÆÖü:--4ßÛÉûýûÑýùÇÎ&Ðö³Ûô„ÖØÿçi;ÿç³Ûô)è³Ûôÿÿí öööööööööòòòèèè úòö  øõèèèèèè í ööö òòò Ãí í òòòèèèòòòöööÿÓúÿ“úÿÃÿÿ ÷ Þ¿ÿ÷ èÉ öööÿ òòò```   ¾¾¾¼ˆXÿ·V.ÿbbbÿ¾¾¾<<<$$$444ÿÿöööÿ¼ˆXÿ·V.ÿÿÿÍÍÍCCCÿbbbÿááá½½½ŠŠŠÊÊÊ666666½†"ÿG¬JJJáááìììCCCÿbbbÿiãi JäáááCCCÿbbbÿšššÿ$$$   <<< †“$”ú!3..C!C!v=O&8 $8ôùÖôÍøáááp714.ùÇÎ444ÿììì$$$S*ÿÄÌø³ÚÛ6G!ocLÌÒâ/ocLÃÆùDx¨xo5S*ÿèèèòòò&&& ocLÌÒâÅËÒ4.‘´„±ä{{ÿòòòÿæüý›ðô !þìëÿÿÿÿòòòÿ0ÿëpÓêüý˜è"ÿòòòø æüýÿ÷öõÿÿõÿÿø “úÿ…çßûüí íìmv_ÿÁèéÿ/òòòöööÿÿÿÿþìëÿñññ555ËËËÚÚÚÜãúãööö÷ÿôûöþÚÇÝæ­„ìBB!ÿßûüK ÿÖùûþçýþçý4- <5Ž…×Ôàø‘‘‘iiiÿööö555%%%”””ŠŠŠ!ÿ ÿ÷  õêê> ìýþÂöù"" ÿ444ÿ444ÿ4'å½Ó?ÚÿÍÖÿÀ¥ýÈÎýæÂóÏþÌÙfçÄ¥¨š<\ݺýØÖ’ôøn ÿÚÿÚ„ÖØ²1Tÿ³ÛôÿçÌÓû/³Ûôÿööö ÿÿ ööö òòòàüôú àüôèèèèèèòòò òòòèèèèèè èèè ÿööö ÿòòò èèèôôô êêê èèèÜÜܾ¾¾vvvÿ‘žÍ2*CCCÿÒÒÒÂÂÂŒŒŒööö öööÿ‘žÍ2*öööööö½½½>Ó333ÂÂÂ=€TSÿRÿRÿ Ü Úvõ$`FÝ{TTTŠŠŠÊÊÊÚv¹ðTÊÊÊáááááá¶¶¶iiibbbÿtttì ¦888[$ÀzCßzCß888ÜÜÜ®®®$$$   vvv¤ÐÑ<4ÍÒÒÍÒÒ3..3..ÍÒÒ$×,A×3..ùÖÐÔTPÿ®GCªÙp71R¹èp71âââÂÂÂÜÜÜ£Ñú½‡2ÿS*ÿ;5.Dx¨³Ûôœîðû×þ‘´t€®­ÖÃÆùM% ÿMöi;5 ôÌÒâ³Ûô­Ö4.…ç›ðô ÿÿöööòòòêüýêêê ! ÿÿèèèòòòöööÿÿòòòí Ðøú0ÿ ø ÿÿh-Öÿø æüýæüý0ÿöõí êüýø ÿöõ{ÿèèèÿ ßûü“úÿ…çöõ’äæöõ"úøÿêç’äæ/=þûÛ !ÿ÷ö{ÿ ÿ ø èèèÌÌÌñññòòòòòò&&&4+Üòû$   ûöþõåûæ­„í ä444ÿßûü!ÿÖùûþçýÌÓöŽ…×ÖùûllloooTTTïïïÛÛÛcgÑ666CCCÿlllßûü õêê íììýþìýþ> éÞÞ  ÿÌÌÌÌÙ)*@[…ÏBÍÖÿÈÎý±¸Ë4'åìèèèfçÄÛ)I6,p10ã!0)ûÐ×,¾æì[Xÿ²1TÿNϬM% ÿ³Ûôÿç) òòò èèèòòòöööÿòòòèèè èèèÿ ÷ ÷èèè èèèòòòêêê  êêêèèèèèè òòòêêê öööÿ444ÿÄÄÄðððáááj0 ½½½ÒÒÒÜÜÜÌÌÌ èèè j0 ûÎÖ òòò¬¬¬ÿ Ü <4 G¬ Ü ]/ÿ×ÿ=®êCzÞŠŠŠwÙÍÍÍÊÊʹðT Ü ¥Ü@G¬ááážžžŒŒŒ***#ìˆ<<=[$ÀŸê#숩©©ÍÍÍ™bþ#ìˆ Ý´ÄÄÄ<<<–ÊúËòóÔü¿3..ùÖËòóÍÒÒ3..\0/¬°îŠŠŠáááÉÏ âÉôñØ™c Ý´RRRÄÌøÌÒâèèè´ÞÞããú¼ˆXÿÌÒâ4.£ÑúMöç(ˆT$x¬ÜËó ­Ö­Öòòòø #{ÿ0ÿÿöööòòòèèèêêêèèèòòò ÿÿòòòÿmò‰'ÿ÷öÿ0ÿÿ ñýþÿöõ›#m IDATöö"úøêüýÿòòòëöõöõòòòêüýÞÿòòòòòòòòòµô÷òòòöööÿòòòèèè êüý ø æüý“úÿm’äæM&%ÿÃ%éñöööí ¦ñõðîWðë êêêòòòÌÌÌCCCÿÚÚÚÚÚÚ555Ü  ûöþõåûåââ!ÿ!ÿ*, `MÖùûþçýÖùûí èè臇‡ÛÛÛáááááá¶¶¶333èèèèèèõêê *> ÀÝöÂöù  ‚ÿÌöNC6ôó×ÿó×ÿÍÎþˆZ¿±¸ËC6ô4²*‚ÿì[Xÿ²1TÿÑ?$/o‹ ÍÆ×"š<,½ÀNϬ³Ûôû×þM% ÿÿ èèèèèè èèèòòò ÿèèè ôôôôôôèèèèèèèèèèèè èèè èèèèèè òòòòòò ôôô  òòòÿÿòòòèèèòòòòòòÿÌÌÌÜÜܾ¾¾>>>ììì¿ H‡»ë½½½ÌÌÌìììèèèöööW¸àaÂêèèèòòòèèè ¬¬¬ÿÊÊÊõ$`ÿ=ÿ)ÍÒÒÌÓûÿ=þý†"ÿò‰'ÿCCCÿììì666õ$`ð´™bþáááÊÊʬ¬¬ÿžžžˆ‘Ë<<=¬SŸêÄÍzCßzCß<<=<<=<3øfffÄÄÄRRR 7Õ+++ØýãËòóÍÒÒ3..Ôü¿>çÌÒâÉϤeO73<4ÜÜÜ$$$³Ûô­Ö¼ˆXÿñýþþçý³ÛôCCCÿšššÿGp˜d4£Ñúäää\Àäääÿ0ÿæüýÞ{ÿÿÿÿÿÿòòòòòò èèèòòòÿòòòòòò“úÿ/|Ýí 0ÿcü÷æüý èèè!ÿßûüÿe K ÿêüýÿø ø ÿèèè èèèÿÿÿòòò ø æüýÿòòòêüý5 òòòööö"úø7""’îóÿÿòòòòòòí õÿÿñýþ¦ñõ äâÿ444ÿËËË555555ËËËöööòû$  ûöþõåû444ÿ!ÿßûü*pb&, þçýÖùûí í !ÿTTT¬¬¬¾¾¾áááiiiiiiááábbbÿ÷öÖùû* ÿôô ÷444ÿ4²CÁó×ÿC6ô½Ó?ÌöN4 ²²1Tÿ²1Tÿ"³¶—âü$/ûÑý¡å'\ݺfçÄèèèM% ÿ×ÿÑüý³Ûôèèèèèèööö èèè ÿèèèöööôôôèèèèèèÿèèèëööö ÿÿòòòôôô ôôôòòòèèèèèèèèèèèè ÿèèèòòòÌÌÌUôÌ®®®UôÌŠŠŠ½½½ññññññÒÒÒòòò èèèèèèCCCÿbbbÿÊÊÊìììG¬ÄÌôÍÒÒÍÒÒþæäÍÒÒÿ=ÄÌôwÙíZ!ÿCCCÿJJJ¶¶¶×¯–].òáááìììÊÊÊê60ÿTPÿŸêiãÄÄÃÄÄÃÌÒâÄÍÄ͈‘ËÄÄÃÄÍfff```„íOÒïÆ/- Áâ÷ÍÒÒËòóööööööËòó`ƒÿÌÒâÉÏ3334.ÌÒâ\œÊ›ŸÙ4-ÄÌøÄÌøG¼õ#LÅËÒ ÿ*Dx¨Dx¨333ÈÈÈÈÈÈGpÅËÒêêêöööööööööööööööÿÿƒ×ïÿ ÿòòòø µô÷òòò…ìñÿ0ÿ ÿÿ"úø"úøe cü÷ÿÿÿòòò$$$ÿÿêêê ÿÿèèèòòòí òòòÞ›ðôèèèÿÿßûüÿòòòèèèñýþµô÷Ã0ÿ=þû0ÿ{ÿ0ÿÿöõòòòÿÿèèèÿèèèÿÿèèèòòòòòòÿöööø þìëÿÿÿòòòèãâá "úø’äæòòòöööÿÿ òòòø õÿÿí æüýêêêèèèááá555555Ü  ûöþÌÌÌ!ÿ÷ÿÃþçý4- ÄËäÌÓöþçýÖùûí ÷ö÷ö ÷!ÿoooáááyyyñññDDD***§§§ÍÍÍCCCÿ%%%!ÿ ÿóþþí ìýþÃ)Qjí ÿôô  õêêõêêèèèÌÌÌñññ½Ó?4 ²@[…ÏBó×ÿ'Àñññ4²4 ²ÌöNÌÌÌNϬfçÄ Åû¾‘âúýÜÿø­üýÜÿ%×·û ɤ#FÔC@³Ûô)è4-M% ÿÿÿèèèèèèÿÿèèèîëúÿÿÿ öööòòòèèèèèèôôô ôôôèèèÿèèè ööö¾¾¾ÌÌÌ;4;4ÌÌÌÌÌÌ ÿ©H ©H èèèòòòìììžžžŸêÄÌôÔßßþæäÖùûþæä×þÿÍÒÒÿ=¦ß¯FäáááÊÊÊžžžÌÓöÄÌô£Ò™bþÂÂÂìììTPÿFßùÕú4.—úÄÍ<<=pa4.ÌÒâÌÒâÄÍ<3øS*ÿ   ®®®? Áâ÷ëÎ÷³ÚÛèèèöööËòóÍÒÒÑÓöôÍø³ÛôÂðÌÒâ4.4™­Ôßß(ÌÒâʹßÄÌøŠŠŠ­ÖDx¨M% ÿK ÿÒÒÒÈÈÈGp®zJòòò öööÿòòòóþþÿÿôôÿòòòÐøú ÿ ÿ÷öæüýñýþ¦ñõµô÷möööÿÿôôôòòò ÜÜÜ $$$ÿèèèòòòòòòø Þÿòòòêüýòòòòòòí ÞöõÐøúµô÷Ðøú…ìñèÿÿòòòòòòòòòø ÿòòòêüýêüý ÿÿòòòÿÿÿòòòöõ òòòêüýø ÿÁèé?êüýðîÞòòòöööñýþ³ÚÛòòòòòòêüýèèèöööÿêüý ø öõÿÿ444ÿñññËËË555ËËË555555>6Añññßûü÷öüøÊºóþçýÃí ÷ íìèèèCCCÿ‡‡‡ÿ¼¼¼ÕÕÕ‘‘‘ÚÚÚ)%»ìììiiiÕÕÕ¬¬¬ÿ!ÿìýþóþþ  ìýþÿôô˜˜˜  ÌöN4²óÏþ®[¿'À'À½Ó?ÌÌÌìèèèèèèl C8‘âú‘âú%×·¤#FèèèfçÄ"³¶ì[XÿM% ÿ/ÌÒâ³Ûôèèè èèèÿ ööö ÿ èèè èèèèèèôôôööö èèèôôôèèèèèèÿ öööÿÌÌÌ·V.ÿvÊ“2 vÊÌÌÌèèèÿÿä|(W¸ó IªåòŠ6ÿžžžžžž4- ®ê<4 ,!!µô÷ßûüÖùû'èå³ÚÛÍÒÒRÿwÙÉ6ý|±ŠŠŠ4- ™bþCzÞ™bþð´¬°îбñ½òø‰ÄÚ<3øÄÄÃCzÞÌÒâ³ÛôþçýÌÒâCzÞŠŠŠ0,îØ(ÿÍÒÒ òòòöööËòó˜ÄÅ/- ÑÓö½½½(÷Ëòó­Ö)芊ŠÂöùþçýþçýK ÿM% ÿŠŠŠBBBÒÒÒòòòèèèòòòÿôô å‡%mä{í ø í í ÞÞ“úÿöõþìëÿ èèèèèè ôôôÿÿÿ òòòêüý0ÿ§ ©÷ IDATòòòêüýÿèèèø òòòÿòòòòòòÿèèèòòòòòòèèèòòòêüýòòòÿèèè ÿòòòÁèé!ÿÞ? òòò ÿèèèòòòø ööö ÿÌÌÌCCCÿËËË555ððð&&&ËËËËËË&&&ËËËÌÌÌÿ3ôñööö*÷ö÷öÃÃ÷öí ßûü½½½‘‘‘ÕÕÕöööžžžáááÛÛÛ­±ÖÖÖlll”””ôôôTTTóþþÿ  ÷ íì ÌÙ4 ²ÌÌÌÌÌÌåß°åß°ññññññê~|*(ÿìZ2ÿ8>[68ª Ó >[6èèè ÆÖüM% ÿM% ÿM&%ÿÿÿÿ$$$ÿÿÿÿÿÿÿÿÿÿÿÿ$$$ÿÿÿÿÿÿÿÿÿÿ$$$ÿÿÿÿÿÿ·Vÿÿò‰'ÿò‰'ÿRÿM% ÿRÿ½†"ÿK ÿ€TSÿò‰'ÿRÿRÿRÿ#ÿ½†"ÿM% ÿS*ÿS*ÿM% ÿK ÿ½†"ÿS*ÿ2 ÿTPÿ2 ÿM&%ÿM&%ÿÿÿ`ƒÿTPÿ%#ÿ%#ÿM% ÿS*ÿM% ÿS*ÿ!ÿ!ÿ ÿK ÿM% ÿK ÿCCCÿvvvÿvvvÿšššÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$$$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM&%ÿ0ÿÿM&%ÿÿ!ÿÿÿÿÿÿÿÿÿÿ444ÿ$$$ÿ$$$ÿ444ÿÿ$$$ÿ$$$ÿ$$$ÿ$$$ÿ$$$ÿ444ÿÿ$$$ÿÿK ÿÿÿ!ÿÿvvvÿÿÿ!ÿÿÿCCCÿ¬¬¬ÿÿÿbbbÿ‡‡‡ÿCCCÿÿÿ$$$ÿÿû‘ÿ ÿÿÿÿ ÿ!ÿ$$$ÿÿÿ!ÿÿÿ444ÿ444ÿ*‚ÿ444ÿ444ÿ444ÿñŠ[ÿÿÿ|*(ÿìZ2ÿ|*(ÿÿì[XÿM% ÿ³ÛôM&%ÿ×þÿ)è³Ûôÿèèèÿèèèÿèèèÿööö èèèÿèèèÿèèèÿööö èèèÿòòòÿèèèÿ öööòòòÿööö ööö èèèÿèèèò‰'ÿÉïÌÓö³Ûô½†"ÿÄÌô®ê!ÿ*µô÷€TSÿÃïð½½½RÿÌÓö³ÛôRÿ<4 CzÞÿ5 ôþçýµô÷M% ÿ4.ÌÒâËó i;­Ö2 ÿæ5 Áèé öööRu ôÍøÑÓö(³ÚÛM% ÿ³ÛôS*ÿ—Åî5 ôËó i;­Ö ÿßûüK ÿµô÷ÿòòòÿòòòÿöööòòòÿöööòòòÿèèèÿööö èèèÿèèèÿööö èèèÿèèèÿèèèÿöööòòòÿööö èèèÿööö ööö èèèÿöööòòòM&%ÿÁèé"úøÞòòòM&%ÿãâáÐøúÿöööòòòÿööö öööòòòÿööö 3ôñÍ  íìßûü¬¬¬ÿlllööö ”””TTTÿ”””TTTÿèèè ÿ÷ íìßûü444ÿÌÙó±444ÿÌÌÌÿèèèÿÙrCv¥²1TÿNϬM% ÿ³ÛôM% ÿ³Ûôÿèèèÿèèèÿööö èèèÿèèèÿèèèÿèèèÿöööòòòÿ êêê èèèÿööö ööö èèèÿ èèèÿ5 ôËó i:þ£Òôôôööö öööòòòÿööö?þÁé¯x[’öèèèÿööösE—ÅîèèèÿöööFBÑÓöóõöööòòòÿööö?þÁé èèèÿ íì÷3ôñµô÷ÿöööòòòÿööö èèèÿööö èèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿööö èèèÿööö èèèÿööö"úøÞòòòÿèèèÿööö èèèÿ3ôñµô÷CCCÿÕÕÕèèèÿèèèÿèèè ÿ÷èèè444ÿÌÌÌìZ2ÿÐö„ÖØÿèèèÿöööòòòÿèèèÿèèèÿööö ööö èèèÿööösD—Æööö èèèÿööö èèèÿööö èèèÿ ð/- ÄÈèèèÿööö èèèÿõêê ööö èèèÿööö öööòòòÿèèèÿèèè€ IDATÿèèèÿèèèÿ€ÿèèèÿööö èèè!ÿ÷èèèÿèèèRÿ®êÿòòòÿòòòÿöööòòòSQ(ÿáã ÌÌÌÿèèè³/+ÿMÑÕM&%ÿ³ÚÛÿöööòòò444ÿòñçÌÌÌÿöõêüýM&%ÿŸ4 aÌó³ÚÛé%ÿ’ïò“úÿ èè謬¬ÿÞØƒš õ/-73v|ÑS*ÿk¦Îÿ èèè!ÿßûüS*ÿ­ÖM% ÿ4.­ÖRÿ;6BDx¨M% ÿ4.;5.ÅËÒ­Öbbbÿú$$zPP^^^ÚÚÚTTTžžžM&%ÿ³ÚÛM&%ÿ 4ü`̳ÚÛÿJJJžžž&PÿüÚ°&PÿüÚ°&PÿüÚ°&PÿüÚ°&PÿüÚ°\††ÿ¤zz&PÿüÚ°RRRÿ$$$ŠŠŠÿööö öööòû$,þ°òòòM&%ÿ³ÚÛ|*(ÿÑüý×þÿ)³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛCCCÿ½½½CCCÿ½½½M&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿÁèéöööÿôôÿèèèM% ÿ4- ®ê®ê})ÿƒ×ïÿèèèòòòÿòòòöööÿòòò444ÿôÿööö!ÿßûüM&%ÿÉûý³/+ÿÉûýÑüýèèèÿÿèèèòñ+§p+bÙ(ò444ÿÌÌÌöõø Kþûÿµô÷M&%ÿ³ÚÛM&%ÿf gýfÕ³é%ÿy=E˜á“Ëöööÿèèèÿèè謬¬ÿTTTbbbÿŽ”éJJJJJJbb¶ÿžžžK ÿÌÒâ•.ÌÒâM% ÿŸ5&¦ÎÿòòòöööÿòòòM% ÿ éÿ§òõM% ÿ4. ²Ú, ßÛôS*ÿÌÒâY ÿZ šÒâf ÿ èèèS*ÿ­ÖS*ÿ<4CyÎS*ÿ<4Cyν‡2ÿCyÎbbbÿÌ꾤ÑòvvvÿÍÍͽ½½ùÂ_ÿÃÆùÅËÒ;5.‘´ÅËÒüÖ缈XÿDx¨\††ÿÓbbbÿ¼ˆXÿûÎÖ2Üí;5.ÐüûùÂ_ÿM&%ÿ¼ˆXÿùÂ_ÿ444ÿBvwÄfezPP...ÜÜmÆ‘444ÿ|*(ÿÿç(îÌÓöûØ[œåËòó;,ó//ûÑú gM&%ÿCCCÿJJJJJJÌÓö4- 333bbbÿ&Pÿ-4òÈòÈôôô3ûÔÆûÔÆòÈòÈòÈò/`&Pÿ-4?55ÁËËç½½^<ÁË˺ÍþÁËË^<bbbÿ&Pÿ þÔÁËË\††ÿbbbÿáááp718$$$~~~ËËËCCCÿ$$$÷É,ÿ4ò‘$$$$vvvÿ¬¬¬ÿöööòö ûåùÔÚÚÚÚÚÚž¢µòö  ÷ûåùÔM&%ÿ×þÿ×þÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿÑüý/M&%ÿ/M&%ÿ³ÚÛÿ#ÿ#ÿ#ÿ#ÿ444ÿ ;;99ñññ444ÿ444ÿ444ÿðððñññóÅÅ99³ÚÛ³ÚÛÿM&%ÿ/’äæÿôôÿôô íì×þÿM&%ÿ”¶î½•ìÃÅóyoRÿÿ})ÿƒ×ïRÿôôôöööTTTÿÿ ÿèèè´T0P'ÿ444ÿô.4].ôM&%ÿM&%ÿ³ÚÛÿø Œ@F*M&%ÿþæä˜ÝÞ7ÿöööÈÈȶ¶¶èèèèèèÿááá5 ôK ÿÒÒàYùØýãËøúÈÈÈy=Eø %#ÿ§pš÷úgý333ïdîŸ4 M&%ÿ˜˜˜áááÖùû?þöööôôôèèèÞØƒ———Š„/ÿŠŠŠ¶¶¶"(}...Š„/ÿðòÝÛ²¶¶¶666¼¼¼âàÅ,bbbÿS*ÿÌÒâ骧þçý¿tq•ùø•ùøÌÒâS*ÿ ÚÚÚÚÚÚöööM% ÿ4.¤ÐÞÔàø=VÌÒâ=VÌÒâ4.paÄÍY ÿ4ëØþüô÷¬© éÿ¬¬¬ØþüM% ÿÄÍpaTÙÏÍüY ÿ0ÿ[[ÄÌø+Y‚³/ÿS*ÿ£ÑúÏÍüCCCÿWWWvvvÿRÿÌÓöáááxxx—Æxxx$$$Z&öCCCÿ=:ÅËÒ6nÍÚ÷§¿0ûÎÖÃÆù³ÚÛ=:jÈÉüž¬¬¬ËËËŒŒŒ¬¬¬ ¬¬¬†°°5ÜmÆ‘|*(ÿ(î4- ÌÓö¥d(î¥d;3 (îq0ù g‡‘ç/CCCÿ333áááñññ¶¶¶ëêØþüÂñ-bbbÿ8£2 IDAT&PÿÅ”ööööööööö@[ú(@[öööÅ”-4&PÿîÓÌ333°¬­F3°¬­rP&ù--ÓÓbbbÿááá½½½ÌÓûÉÏTdÆ©©©ÙrCêµ®GvvvÿìììÍÍÍ$$$ÛÛÛÛÛÛ\œÊÉÏ\œÊíííííí¶¶¶ìììÊÊÊvvvÿÿòö ÜÛ=þûé!ûå³ÚÛ))/‰üö‰üöM&%ÿM&%ÿSQ(ÿSQ(ÿSQ(ÿM&%ÿÑüýM&%ÿ7/M&%ÿM&%ÿ/ÿ#ÿ#ÿ ÿö îF-  #ÿ#ÿÌÌÌ444ÿÏq:ÇÇý1Æ)T„ÿ1ÆXˆ¿ÿõ P뻄ÇÇý³ÚÛM&%ÿM&%ÿ/=þû/’äæ0,!!)³ÚÛÔàø–ÏñúÐùÃÅóyoi:þü×ûRÿ öööÂÂÂÜÜÜ ÿ ÿÿ÷ÿôÂÂÂÝÓýüóŒÐúÒþþÑÓüM&%ÿÁèéþæäM&%ÿþìëááᘘ˜ÿÔßßÖùû=¹µÉûýÿêêê¶¶¶èèèÿ5 ôÉÆ=V+jmçÒÒàÒÒà.. âÐϬ¬¬ÂÂÂúèßúþæäYù+bÙò™„K¹QYýËë×þÿ.ïì³!êêê`Mþçý=þûöööèèèÉÍùiiiÉÍùvvvÿŠ„/ÿŠ„/ÿ¬¬¬ÿÞØƒ("Í"(}vvvÿðððDDD:¶¶¶WWW,ðò_‡ ñïÆM% ÿ³Ûôôʹß­Ö³ÛôÌÒâìZ2ÿ ÿ4ëÌý8 ¿£¢ éÿ¿£¢ØþüCzÞÌÒâ(EÌýµ Ký4ëØþüÌÒâCzÞ­ÖTÙ-QQÿS*ÿ×úû)„\Z¡y`Êúú<4:`1TÙvvvÿWWWŠŠŠØþüááá vvvÜÜÜ‘´ âÉÃÆùÃÆùIªÒ(ÊúúÐüû–Ð÷ùÂ_ÿ¼ˆXÿÃÆùbbbÿÂì쬬¬ Ø®®ÄÄÄ5Übbbÿ(î6q7öööÅÍôq7ÐøÈøyo(î333ìììáááÕÕÕááá5 ôØþü(ÕÕÕÍÍÍìììüÚ°òÈF3öööîÓÌüÚ°üÚ°¨ ÊY%%ìììáááqwxáááÍÍÍììì?558bbÁËËááábbbÿ‰°±p71‰°±ììì®G9292ŠŠŠÒÒÒ¸¸¸áááááተ±p71vžËËËËËËðððììì```vvvÿòö  ÷ ÷%éñµøßú ÷òö ÿM&%ÿM&%ÿM&%ÿM&%ÿ/ n ‰üö/M&%ÿM&%ÿSQ(ÿ+.áã áã +M&%ÿM&%ÿ/×þÿX7// õüôþ Áâ÷9KQ2 ÿ2 ÿ#ÿ444ÿÄ‘ŠóÅÅæA>L³ŠŠÅËÒ­ÖÁéúšöõØþüéëòòÛ4Ëÿ.ˆ‘Ë­Ö8ÚÙÄÜÜ&&&ÚÚÚ ööö&&&ÌÌÌÿ<<<;3 –ÏñËó &ñÅÔ ó(ûŠ¡ÉçìììáááÕÕÕèèè5 ôÿâþüñ(Øþüèèèÿ&PÿòÈööö²ˆˆNxx²ˆˆööö &PÿüÚ°üÚ°&PÿްÚ-4LvFEŠº»ÁËË?55ÁËË㯯bbbÿÒÒÒåL{ U‹ÙrC'޽šššÿfffññññññððð±±±OO{³  ñññ333```ÖÖÖ ÷ ÷òö ,ÜêêêM&%ÿ³ÚÛS*ÿ<4CyÎ/Zøó%(n’ôøÑüýÿ4-ÌÓûÌýM-ö£Ñúððüó-*ÿ­ÖM&%ÿX79+Ⱥä¥ñõÏ0/7&%ÿ³ÚÛèèèÿûöþ ùñýùñýÁý? ? Áâ÷#ÿòÝúæA/4; ;;<;;99/4; ;;óÅ; ;;Ïq:ððð|*(ÿÑüýÁèé.Ãöõ ¦ñõn%$ÏâáÃèèè})ÿ‘å Ëöõþ/Ÿê­œ#‡‘ç—Æèèï›ïÆÿ öööÂÂÂÜÜÜ$$$ ôôôèèèÿ÷ÿô ûöþà#ûöþà ýôà÷ #­ÌÌÚÚÚÿ ÷öí í÷ö3ôñ³‹rà ó èèèÿ©©©^^^ŠŠŠý÷ EC·ÆÜ åôüñáû÷þÿ+ÚÑüý7¦âÚbøúí %éñì³!ÊKÚn¦àçíÿèèèGA칿å¶¶¶ÝÛ²ÑÓüvvvÿŠŠŠJJJTTž¶ÿJJJìòG¬¬}ÿTTTk>>ÈÒÒÒäää RRRÿÖ­¯ØŠ„/ÿ"(6ìýþ´ô÷÷8 M% ÿ•ùøòòòÿööö èèè³Ûôâÿ(Û(ÿ´ß÷ßûü8éÿÿô³Ûô³Ûô§òõÿ§òõ­Ö%#ÿ×åûã)üÖç üâÓÍÍÍ333µô÷K ÿ³Ûôôÿ>ÓÂá-áá>>>ááávvvÿŠŠŠ­ÖS*ÿòòòÿéòòò­Öÿ­Ö888ÂÂÂ&&&ÚÚÚööö&&&ÌÌÌ(RRžžžM&%ÿûØ(î/Áöæ…öä{nÑüý¨Î “2Ê(îûØêáááèèèËó ð(ØþüóõèèèèÿüÚ°ÿEvÅ”ööö²ˆˆ þ;lø»Š þÔà&PÿüÚ° þÔàÓP&ááávFE´ñ"Ó ¨ÕÿCCCÿÒÒÒäää |||„„„^^^ÈÈÈ8?½„³ S*ÿ£ÑáðððêêêËËËOOO Ý´>p71åL`ÖÖÖîîîòö  ÷òôÿ  ÷òö ,þ°ôôô òòò³ÚÛS*ÿp718øÈü½‡ÿŸó³ÚÛZøó%(12üþÛØn ’ôø&%ÿ³ÚÛS*ÿÌÓûÌÓûçðððÌÓñäää ÒþþS*ÿ­ÖÑüýÈåä˜ÝúÃÿýþËøúËøú5øáÿqF#ÉÐö#ÿòôì  üôþ Çñú? ÍÿüòÝú444ÿ1Æ99/Ñÿÿ ;;999>ºŒÂððð³ÚÛÑüý/n8˜ÝÞmmø *0í Ïâá1?Rÿ})ÿ›ïog%X ͵ò0ÃÅó6i:þRÿèèèèèè ööö÷öýáà‘*% èèè ÷ ÝÓýûóþöéü÷ &&&áã ??òòò =þûöõÖùûòòòèèè?³ÚÛ÷ö÷öÃÁéèèèèèèÕÕÕ$$$ ÒÒà÷ òòò÷ åôüéÒÒà  ÒÒàš÷ú’ïòÃòòòòòòSdÝÖùû/óûÈ ÿCCCÿ"(}333ðòììì:666Š„/ÿ¶¶¶vvvÿñïÆ¶¶¶®®®¹·ŽÌÌÌRRR666:"(}ÌÒâaËÚ@# ìýþìýþ`N&òþþÌÒâ­Ö ÜÜÜKýKý5 ôY ÿÿ Øþü4.M% ÿ³Ûô´ô÷èßúô4.M% ÿÿÿM% ÿ(õõ)üÙé6½½½ÍÍÍÌÓöCCCÿbbbÿJJJáL666­ÖM% ÿú?þoM% ÿ­Ö­ÖžžžÈÈÈÚÚÚ ÚÚÚÿzPPŒŒŒ³ÚÛÑüýÅÍô’äæ…ç’äæÊüûÌÓöûØÑüý½½½888èèèéëÁééëèèèbbbÿ‚‚‚¦· IDAT&Pÿ îÓÌ555hhhîÓÌà,üÚ°üÚ°à, Ý333vFE333´ñ"îÓÌ þÔ>ç>çäääôôô¶¶¶âââ^^^ðððÆÆÆáááÍf7ððð&&&ÆÆÆ´…wpcwpc´…ÖÖÖîîîÜÜÜŠŠŠ ÷ òû$ûåô¹êêêS*ÿS*ÿ<4øÈü8<;-4)pa ³ÚÛÖ"ÿ‰üö9=%(12%(ZøóM&%ÿÌÓû4-çäääòñç5 ,ä ÝÿÿÌÓûM&%ÿ/Ïâá›ðôËøúÿôô ÷þÿ÷þÿËøú¦ñõºÝ7/ õ ûöþüôþ üôþ3Íÿüôãûùñýõ PÄ‘ŠÇÇý///9999ÇÇý뻄³ÚÛ&%ÿ07 o!7ÐæÃ¥!š÷úÑüý³ÚÛ—Æèèè:ÿ—Æe$Ðüû£ï›ïRÿü×û—ÆRÿ®êÿòòòòòòÿ*þûÖ÷öí ¦ñõö ÿòòòÿú.. ­ÝòòòÿÌÌÌ?³ÚÛèèèµM% ÿ4- ®ê³ÚÛ,ÿÿööö÷öí öööÿèèèèèèÈÈÈÿÛÝø%#ÿÛÝøøòòòŠ„/ÿ›ŸÙ.: 73€“Õü öÛÝü³ÚÛM&%ÿÐøúòô÷²Õ7î`Þ`ËëÁé÷öíòòòÊÊÊ®®®/-ììáááááá§¥|Š„/ÿv|Ñ"(}ÉÍ|ÝÛ²áã x[J¶¶¶vvvÿŠŠŠðòÝÛ²¾¾¾ìììJJJÿTTT³ÛôtQ(ÌÒâßûüÿ6G!­ÖöööÿöööÌú(ØþüéèèèÛÝø0ÿY ÿ´ô÷ßûü³Ûô4.ÿöööÿòòòS*ÿ¤ÐÞ(Øþüô4.Üí'0Óã³½½½³ÛôbbbÿáááÃÁ¦ ;M% ÿ4.Òâ4- ÌÓö4.4.ÿ­Ö***ÿööö ööö***ÊüûöööÌÔÑüý³ÚÛfffM% ÿØþú(4- ÿ®êÈÈÈžžžüÚ°+ƒÿ,: Íg öööËËËÕÕÕ þÔøu,:ü©CüÚ°S„ÿîÓÌ®ÑÔêêê ÕÕÕî8ò/`îÓÌüÚ°³á ú...ÒÒÒÚÚÚ ÕÕÕÈÈÈ+++ÕÕÕöööp71aÈ÷RRRÜÜÜ92~³é{åÉÏ?ÜÜÜòôÿòôõ æöööòö òö  ÷ööö èèèM&%ÿÌÓû<4ÉÏ<44)øÈü88ÅM&%ÿ³ÚÛw  þÛØ%(12üÏÎ12úª¦‰üö&%ÿËòóöööM-ö£ð )//öôÑüý+ÿÿüó#­ÚÛ³ÚÛM&%ÿÏâáÖùûø ÿôô  ÷ôôµô÷ÐÝÞ1M&%ÿËòóë öûöþ ùñýùñýÁý? Í÷É òèèóÅÅÇ;99ºŒÂÑÌÅA ñ°M&%ÿÁèéþæäÏâá8‘˜ÝÞ×þÿM&%ÿèèèi:þ})ÿ—Æi:þeù›ï0Ðüû)¥n yo›ïèèèü×ûòòòÃ÷ÿÿÿü ö÷ éëàêúÒÒà ÿ #$ÿòòòÌÌ̳ÚÛÉß÷ÔàøÊºóÿ³ÚÛ555=þûí ööö ÿÂÂÂÛÝø„ŠßåôüÒÒàŒ€Ô ü ö µô÷K ÿê+Ú4«ãÁé’ïò*½½½666ðòááá333ˆˆˆY[„"(}TTTY[„bbbÿY[„ÌÌ̶¶¶JJJÂÂÂ666vvvÿDDD46_ñññ...žžžvvvÿM% ÿÌÒâkòòòöööéëØþü(ÿòòòòòò¤ÐÞ4.ô, M% ÿM% ÿÿ ÿ-QQÿÝ1+Ý1+(ããú( éÿ¬þ'«U>ÆÓã6M% ÿžžžëêÃÁ¦ááá½½½ ;âàů­’666TTT4.ÌÓö4- ·V.ÿ444ÿöööJJJTTTÿ³ÚÛ6©H j0ö)³ÚÛM% ÿö7ØþüÌÓöÌÓöRÿžžžžžžôôô ì8 öööôôôûÔÆ&PÿS„ÿ-4>>> ^^^rP& þÔîÓÌ­Öäää...RRRTTT555DDD+++öööÂÂÂ333555ÜÜÜv¥$$$ Ý´ Ý´...BBBK€¶FâCªÙ…ì—Åî$$$ŠŠŠòòò %òý3 èèèòòò ÷ ÷òö èèè³ÚÛpa ÄÌø<4ÄÌøÌý×Ìý×øÈüøÈüøÈücðõììëüÏÎüÏÎþÛØþÛØüÏÎ%(ììë’ôø¦ w ÁèéÌÓûX/)Ñüý##­¯Ø.îêÖùûìýþÿôô ÿôôÿôô  ñýþÿêç ÷  üôþÇñúúòþýñ#ÿ à°/4; ;;99// ;;/4;M&%ÿ11“úÿÈèøÈèø\ñø?êêê³ÚÛ—Æ›ïèèè®êƒ×ïeù‘åýÃÅói:þ³/+ÿ›ïRÿèèèööö ÷JJJ555 ÿòòò÷ hhh åôüºÒü #-ÿ *=þûÿ3ôñ)è333à ÿèèèèèèôôô èßú÷þÿ'èåöéüÛÝøžööö +jm RRRGA슊ŠÊÊÊTTTTTT("ÍžžžRRRTTTvvvÿ666ïïïyyy...ðððÊÊÊ("Íxxx6664.k³Ûôßûü³ÛôìZ2ÿòòò 4ëØþü4ëÌÒâßûü éÿ4.ÌÒâ³ÛôÿöööÿS*ÿTÙ_Ý¢|«³Ûô§òõÓ¯¯#ÏÕ@^!Êúú04- —eP>ÓáááÛÝøׯ–TTT4- ÌÓö­Ö6·V.ÿ¼ˆXÿ444ÿÚÚÚTTTTTT&&&tttîïÿûØÊüûÊüû?òòòööö5 ô¥c³ÚÛCCCÿö7(4- ö7Âñ-CCCÿäÕ}ß©Côôôööö ì8 þÔì8 öööüí•äÕ}&Pÿ þÔîÓÌ`#òáááÍÍÍRRR þÔ þÔ&Pÿ&Pÿ...(ù Ý´555)ììì+++WWWŠŠŠ Ý´ñïÆðð𢢢ÕÕÕ\À$$$ÈÈÈbbbÿÜèèèÿòö ÿ³ÚÛÄÌø<4ÄÌøÄÌøÉÏÌý×Ìý×<;-pa ³ÚÛ³ÚÛ³ÚÛw þÛØþÛØþÛØììëcðõÏÐþÛØZøóÑüý³ÚÛ³ÚÛèèè sE/Ñüý)ÌÓûÁèéËòóÅÇð»½æúÕýS*ÿM&%ÿM&%ÿ* ÿôôöõöõ*åüýÐøúèèè ÷ ÷ üôþ ÷êüùñý9õ P ;;óÅÅÇÇýÑÿÿÑÿÿÑÿÿÑÿÿÑÿÿ/99Ft>ç¤d6ñÈDDDÜÜÜkp71p71.âââ ñññÈÈÈ^^^áááùÖöööÿÿ&&& ÷òö ­ÖŸóÌÓû<4ÄÌøÌÓûŸóŸóÄÅÓ‰üöþÛØ’ôøcðõ¦ Ñüýììëw ³ÚÛÌÓûÑüýÁèé»äËòó èèèèèè ËòóÌÓû³ÚÛ³ÚÛÑüý0*      *0³ÚÛèèèü ö üôþ  õõåûóâúÁâ÷ùñýòÝúđР;;óÅÅÇÇýºŒÂÇÇý‹‹ÁÑÿÿÇÇýÄ‘Šï¿³ÚÛòòò³ÚÛ³ÚÛ=þûòòòÑüýš÷ú[%$þæäòòòM&%ÿ})ÿ›ïèèè ¥!Î#ë³ÛôÁéÌÓö].òèèèèèè xxxËËËèèèòòòÿÿ  ûöþýôàÝÓýÿÿöõÖùûõÿÿÖùû=þûÿÿöööêêêÿÿèèèÿÿü öéë 5Öùûÿé%ÿ0bçìí ÿiiiŠŠŠˆˆˆ½½½SQ(ÿJJJÌÌÌŠŠŠ:¬¬¬ÿbbbÿÊÊÊÿS*ÿ•ùøÌÒâÿÿÿ•ùøÿ§òõòòòÿY ÿßûüôôKýòòò§òõòòòòòòòòòúKýÓ¯¯#ÏÕ_Ý_ݧòõ)TÙ_Ý_ÝMÑéƒ×ïÿËó ÅʾÕÕÕ¶¶¶ÿÁéÌÓö4- j0 2*=:­Ö³ÚÛIªÒùÂ_ÿ8ÚÙ888ÌÌÌÌÌÌžüýÿsD³ÚÛ³ÚÛÌÓöM&%ÿ+++ÈÈȽ½½Ëó ÛÝø JJJà, þÔì8 &PÿrP&ìììÍÍÍrP&üÚ°žžžñÈp71ÆÌÓÕÕÕÕÕÕðððäääp71úÌ£˜˜˜S*ÿûÐ×ÉÏá8...ááá$$$ç¹ Ý´½½½ÿ  ÷ÈÈÈÚÚÚòö òû$ G³ÚÛÄÌøÌÓûŸó³ÚÛ³ÚÛCyÎCyÎM&%ÿw ììë’ôøÑüýÑüý³ÚÛw cðõèèèËòóËòó èèèèèèèèè³ÚÛM&%ÿåüýõÿÿ   åüýÒü ö òÝú õùÜ à°Ä‘ŠÑÌźŒÂÇÇý ;;óÅÅÑÌÅÇÇýÇÇýÄ‘Šï¿ñññÌÌÌM&%ÿ³ÚÛ³ÚÛ&%ÿÃ÷³ÚÛèèè Áéö4-ÿòòòèèèÿ¬¬¬ÿòòòòòòÿööö÷ÿôôö"øêÞ ÚÇÝ0P'ÿаÙÿööö í ÷öÖùûööèèèÿööö ÿèèèÿöööööö èëôÖùûí %úÿÛÝøK ÿž’ïò¦ñõ*nïò¦ñõí öööòòòŠ„/ÿ¶¶¶ñïÆÿÅÇð#%ʬ¬¬ÿTTTÿ#%B¶¶¶ÿ+++("ÍJÿèè謬¬ÿÊÊÊ¢¢¢ÿööö˜˜˜¹¬¬¬ÿTTTÿ5 ôÌÒôÁéöÁöÒâM% ÿ³Ûôöööÿöööööö ÿöó8 ÷ÿööö éýôM% ÿ³ÛôY ÿôÌý ÿèèèòòòÿ ÿöööµKëÌýM ÿ³Ûô—Åî¬þ913Îÿ¿ÿÄÌøS*ÿ­Öÿööö5 ô4- ÌÓöÿööö4- Rÿ®ê2*=:ÃÆùÿöööòòòûÎÖÃ*=:šššÿÂììÿöööÂììÄÄ&'žüýÿbM&%ÿ4,ñl ”,ñ³ÚÿÁèé?¥c[%ÿ³ÚÛÿöööÍÍÍèèèÿ $$$ÿèèè+ƒÿ,: Íg þÔ þÔà, þÔøk,:!ÿß©CüÚ°&Pÿìììááá333+çPÿüÚ°p7192ùÇÎmÎöööö Ñÿ(ÉÏp71;5.p71v¥wpc‰p71'޶+++ ãâ ç¹ÌÓûööö&&&888 ÷ò,ÿèèèÌÓû³ÚÛM&%ÿ³ÚÛ³ÚÛ|*(ÿw üý³ÚÛ³ÚÛM&%ÿ³ÚÛèèè³ÚÛM&%ÿñýþ*³ÚÛÿ òÝúòèèèèÿ õ òèÌÌÌ4ÿæAóÅÅ ;;óÅÅÑÌÅ à°Ïq°õ PæA ñ°³ÚÛM&%ÿM&%ÿ³ÚÛM&%ÿÁèéòòò})ÿƒ×ïÎ#ë®êèèèÿ—ÆRÿ®ê èèèÿòòòÿööö  üôàаÙÿööööõõÿÿ ÿèèèÿööööööÿöööúööü öèßþí ü ö åôüÿèèèK ÿÖùû%éñ Ãööí öööÿ èèèÿ”””ìòʬ¬æžžžCCCÿ½½½ÿöööxxxlllÿöööiii¶¶¶ª°ˆÿÿxxxêêêžžžÊÊÊÿËó ööö Ëóèèèÿööö ÿööööööÿèèèÿöööAöóÈ÷ùöµKéýôM% ÿ³ÛôY ÿôØþüéëöÿ öööµ?M% ÿ³Ûôÿi;ÙÏÿööö»ä ÿÁéÁéø ööösD®êÿÃÆùÅËÒÿöööÿÊýü;ÃÆù¼ˆXÿR†¶TTT<<<ÄÄÄ>¼ÿöööÜÜ8ÚÙbbbÿžžžÿ4,ñl /Éõÿöööööö?þ4- ÊüûÍôj0³ÚTTTìììÕÕÕÿêêêÜÜÜ$$$JJJžžžûÔÆ÷ôô ö¾ê‹uÿöööN`6§ËËûÇÇöööTTT˜˜˜CC?55¤¯zñŠ[ÿ9292˜þý‡»ëâââp(192<ùÇÎÿùÇÎ92wpc‰öööËËËËËËô i;ÌÓûËòóÿ ööö öööÚÚÚþ°òö èG¢³ÚÛM&%ÿM&%ÿ³ÚÛ³ÚÛM&%ÿÑüý³ÚÛ³ÚÛM&%ÿÿêç0åüý0üýþæä0Ò³ÚÛM&%ÿ³ÚÛèèèÿòÝúèèèñññÑÌÅÌÅ à°ÌÌÌ4ÿõ PRÿ®êÿèèèÿòòòÿööö÷ÿô  èèèÿ ööö èèèÿòòòÿööö èèèÿöööü ö óõöööü ö éë èèèÿööö èèèÿèèèÿööö èèèCCCÿ½½½ÿööö èèèÿööö èèèÿèèèÿööö èèèÿööö èèèÿèèèÿèèèÿööö èèèÿèèèÿi;;5.ÅËÒ—Åîööö èèèÿŒŒŒÈÈÈžžžÿJJJ888ÈÈÈžžžÿi:þ—Æööö èèèÿöööhhh$$$å|û IDATÜÜÜŠŠŠ+ƒÿ,:ûÔÆüí•èèèÿöööu,:ß©Cÿ ôôôöööCC?55¤zzñŠ[ÿ92ùÇÎ92ùÇÎ3šÉ>>>€ÿžžžñŠ[ÿ92ùÇÎ92ùÇÎ92‰p71ÉÏ»äsE—Åîèèèÿöööòö üé{ÿÑüý³ÚÛM&%ÿ³ÚÛ444ÿõ P à°ÌÌÌ444ÿÌÌÌÿSQ(ÿ #$ÿ¶WUÿ½‡2ÿ³/+ÿÿK ÿ{ÿ{ÿM% ÿRÿ½†"ÿ})ÿúÁ/ÿò‰'ÿRÿÿ2 ÿÿÿÿ 2ÿ”ÿA‚ÿ{ÿ³/+ÿ²ÿÿÿÿ²ÿê5ÿê5ÿê5ÿê5ÿvvvÿvvvÿÖÖÖÿšššÿšššÿÖÖÖÿšššÿS„ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ #$ÿ #$ÿ #$ÿèèè444ÿ­¯ØM&%ÿM&%ÿ¶WUÿóÝÜ #$ÿËüÕÄÌø½‡2ÿ #$ÿM% ÿM% ÿbbbÿbbbÿCCCÿCCCÿCCCÿbbbÿ³/+ÿ³/+ÿš÷úÿÿÿÿ ÿK ÿ0…ìñ…ìñ ÿ2 ÿSQ(ÿM% ÿM% ÿ³ÛôRÿ½†"ÿRÿ—ÆÄÌô})ÿ})ÿƒ×ïò‰'ÿíZ!ÿíZ!ÿò‰'ÿÿò‰'ÿò‰'ÿRÿúÁ/ÿ‡‘çwÙ®êúÁ/ÿRÿúÁ/ÿúÁ/ÿÿ2 ÿýñò`ƒÿ0Oÿ`ƒÿ0Oÿÿÿ  ÷ ÷Üõz+ƒÿÿÿ'^ÿA‚ÿ×–A‚ÿA‚ÿp¼$ÿA‚ÿp¼$ÿ³/+ÿ{ÿÿ7 nÖÙÉ÷ù›Aöóÿ²ÿ³/+ÿÿ²ÿ›ÿ{ÿê5ÿê5ÿT %T %vvvÿ0€ºìììšššÿÖÖÖÿ†°°<<<<<<†°°<<<á°éQQÿ0P'ÿ!OÿéA‚ÿ`ƒÿ`ƒÿVPéÆû444ÿÿÿ #$ÿ #$ÿ #$ÿ #$ÿ #$ÿ #$ÿ #$ÿ444ÿÿÿSQ(ÿSQ(ÿSQ(ÿS*ÿSQ(ÿS*ÿ444ÿM&%ÿøÃÿ»‰ˆÿ¶WUÿS*ÿ|*(ÿS*ÿTPÿÿ #$ÿ #$ÿ¼ˆXÿ½‡2ÿ¶WUÿ #$ÿ%#ÿK ÿÿK ÿK ÿÆÀ\ÿ¬¬¬ÿÖÖÖÿ¬¬¬ÿbbbÿÿ%#ÿÿ0Oÿÿ|*(ÿM% ÿRÿRÿRÿM% ÿÿS*ÿbbbÿÿÿCCCÿCCCÿÿÿ$$$ÿCCCÿbbbÿ²ÿM&%ÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿK ÿ{ÿ ÿ ÿÿ2 ÿ ÿM% ÿRÿRÿÿRÿRÿRÿRÿM% ÿ})ÿíZ!ÿò‰'ÿM% ÿò‰'ÿíZ!ÿò‰'ÿò‰'ÿò‰'ÿM% ÿò‰'ÿÿúÁ/ÿ½†"ÿúÁ/ÿúÁ/ÿM% ÿúÁ/ÿ})ÿò‰'ÿM% ÿúÁ/ÿ2 ÿ0Oÿ`ƒÿÿ#ÿ`ƒÿÿ#ÿ`ƒÿ0Oÿÿ`ƒÿ`ƒÿÿÿÿÿÿÿÿ 2ÿÿ'^ÿA‚ÿÿA‚ÿÓø3ÿÓø3ÿp¼$ÿÓø3ÿp¼$ÿA‚ÿp¼$ÿÓø3ÿp¼$ÿ³/+ÿK ÿÿ{ÿY ÿ²ÿK ÿ!ÿ²ÿ!ÿY ÿÿ²ÿ!ÿ³/+ÿê5ÿò‰'ÿê5ÿíZ!ÿÿù7ÿê5ÿê5ÿê5ÿê5ÿê5ÿê5ÿbbbÿbbbÿ$$$ÿbbbÿp¼4ÿÖÖÖÿÖÖÖÿšššÿšššÿÖÖÖÿ444ÿS„ÿS„ÿQQÿCCCÿ444ÿ444ÿ444ÿA‚ÿA‚ÿp¼$ÿŠ„ÿúÁ/ÿ444ÿÿÿÿóÝÜ #$ÿ#$ÿ3_ðÎû$ëÜëñåå¿ÜÿääääääÅÇð444ÿMö³á .ö—ÅîS*ÿ³á áÌÌÌi10ÃÆûDt?¼ŒüÕÿ5+Ö¶WUÿBl8=sÿ‘ùüo×h^Fh8ÿQ›Ìõ@ÅËÒ;5.0ÚÁÿèèèóÝÜK ÿþýöööµô÷K ÿÍ µè謬¬ÿ÷džl‘¼+++zDïd^*JJ¬ÿ———½½½S*ÿÌÓû³ÚÛéë%#ÿ ,èÉ èèèÿ ð ,÷èÉ èèèÿd„ÖØ4- ®êRÿÌÓö=_44- ÿ®êèèè—ÅÿM% ÿ³Ûôžžžÿ êêê>>>áááS*ÿ¯µÜQK$­Ö²ÿMÑÕfû›³ÿöööü öûéþûóþÿòÿìÿÿööö òòòÃøú{ÿƒ×ï  ÷ÿôüåÿòòò®êi:þü×û®ê})ÿ¦ßûÑú0wÙ¦ßí!ÿò‰'ÿwÙ¼½ò IDAT&ñŸ>0ûÑúi:þøÈø=; Sd݇‘ç¥d}˜?Ñò‰'ÿ2 ÿèÉ  ±æ", ", 7÷ÐÌåãú0Oÿбñòòòòòòòö Üòòò×–/: ÄñÿÄñÄñÄñÈåäÍ èèèÿñó0g §ñõ8 Y Z˜ÝÞ‘ÿîëûÑúýÛýë<çÿðÿ²ÿÿðÿÛãê5ÿÄê<ÿ:ÂÂvvv888ÈÈÈf¢ÄÄÄŒŒŒbbbÿNNNÖÖÖÿ***ÌÌÌ4ÿááááððð²ÓÁÑ?ÕæûõÆ :s4ÿÌÌÌÿöööÿÿòòò@èG-î ,G-îðÎû2l"2å¿ôèèèòñi;òñ³á äää³á Òþþ8—ÅîäääÌÌ̶WUÿM&%ÿËüÕùÆÆ=::6^ËüÕ¶WUÿøÃÿBl8¾”È õô‘ùü‘žÍtÈÏ#-#-@4- 1óÿÚõ |*(ÿS*ÿÿK ÿÍ µô÷³Ûôµô÷òòòµô÷èè謬¬ÿlll[‘æèèèÕÕÕ[‘æHN²———iiiÆÀ\ÿÿS*ÿvvvÿ­Ö³ÚÛ7÷"AõÔù7÷èèèóõ3 )j0Oÿÿ|*(ÿŸ>ÑüýM% ÿRÿÁ鄊ñ 2Rÿ5 ôi2Ièèèèèèööö555!ÿK ÿK ÿÿM% ÿvvvÿM% ÿ,ÌÒâfûš÷ú²ÿèèèš÷ú³/+ÿÿöööü ööéüèèèöéüûóþòòòèèèèèè ÓúÿÎãøÎãø{ÿ})ÿ ÷ÿô  ûöþûóþÿÿ òòò?ÿRÿ})ÿ®êü×ûÐüû)4- íZ!ÿíZ!ÿ¦ßƒ×ïò‰'ÿúÁ/ÿÏðèèè;3 ƒ×ï¦ß6Éï·Vÿ­œ#·Vÿü×ûwÙƒhâøÈøwÙ?Ñ7÷ÞÔ÷ }æ }æèÉ èÉ ÿÿöööòö Üò † 2ÿFù)ôÿ¨\ôÑÆôFù¨\ô·¢í·¢íÑÆô㢠¨\ôÑÆô¨\ô3ôñK ÿèèèèèèòþþÐøúfûòþþ{ÿ"oèî0™ïóNãê‘ßñ^²èÿðÿé%ÿ:ïÿðÿ²ÿ’ïòê5ÿ8Ûãÿðÿë<çvvvÖ"š<<<ÂÂÂŒŒŒŠŠŠbbbÿÂÂÂÖÖÖÿY'&>>>ÄÄÄÐ Zšššÿ444ÿñññæóàñåðððñññÁ+±“ê'ŽßÿòòòÿŒŒŒÿòòòÿÿ<8ú¹Óè%A ÎæÜ2áÿÿðÎûëñåå¿ôÿ5 /Ñüýçðððôôôööö ôÝÿÿQ­Ö»‰ˆÿ=:ÃÆû=:ÃÆûDt?ùÆÆ¾”È23ÆÊ¢­Öÿõ G-î(ÚÑüýpa ÄÌø<4Pœò}aù,Ó81Q›ÌóÝÜÿ3ôñÚÿÛÝøCCCÿÕÕÕèèèÿJJJJJJ———½½½S*ÿ—Åî5 ³ÚÛ%#ÿ_U;‚[âèèè%#ÿóõ)jïÍ÷бñ²ÿ@m [œï³ÚÛÿsD 2Ž”ûööösD 2p=?Ñÿ5 ô³Ûôÿ+++333ÍÍͽ½½!ÿ÷èèèK ÿpb&CyÎvvvÿŠŠŠS*ÿ<4CyÎÿ¥!ÿîëNãêÿšþ:=ÇÕùMÑÕÿöööü ö÷ òòòÿööömƒ×ï ÿC³ÛôÿèèèÿöööòòòM% ÿ0)ÌÓö4- <4 Ÿê³ÛôRÿÌÓö³Ûô})ÿp1Ïðu`‹ êu`[œå¥d‹ êƒ×ïò‰'ÿûÑú¦ß·VÿÊüûq7Éïü×û:- ;3 wÙúÁ/ÿ?Ñ2 ÿKQ¸•þýñëÎ÷0Oÿ04 ¸•þ7÷бñÿòû$Üòû$Ü öööòòòA ÿ ôãû&A æÜù$×–)j¿~è²ÿÉ÷ùÐøúg eéíšþ˜ÝÞg ™ïóÍ èèè{ÿÐøúŸ)ÿðÿ’ïòÐøú¢N/‰‹ènÉøùNãêÖÖÖÿŒŒŒtttÄÄÄÜÜÜ$$$<<<ÄÄÄ!ïî0Õ9Æœ888<<<***444ÿñññËàÃüôþ úñý+ÌÌÌÿèèèÿèèèK ÿµô÷ÿöööòòòÿ&&&ÚÚÚòòòÿÿõ ÑÓä÷ðÎûð29Çù2Îò#ýÿèÝÜËÿ 4-£Ñðêêêððð#ô­Ö¶WUÿûÎÍÃ3ûÎÍÃ3=:::B=sèèè #$ÿoÑüýùÖ-p4 ÿ&<4Út0ƒŸ#-ÒÈèèèÍÿööö=éû& ÿÚÿ&éµô÷CCCÿÕÕÕèèèèèèÿááá°zDïCÿ½½½ÿ—Åî5 )PQ Ý´³Úóõä¡ðšÍ÷)j ïÍ÷ÿ3 ïÍ÷ ÷ U;šÍÙÿ\ñön òËòó|*(ÿÑüý³ÚÛòòò®ò®ÿsD 2uvGœ¼ˆXÿDx¨5 i1=³Û«¼ˆXÿDx¨ÿJJJÍÍͽ½½÷ íìK ÿµô÷2@^!CyÎvvvÿ$$$ 9+"´øšþ:=ÇÕùMÑÕÿ÷ÿôöûôûóþÿòòòèèèÿ3ôñÐø2:- }ÿƒ×ïöööòòòèèè³ÛôM% ÿ)0ÌÓö4- 4- ÿü×û³Ûôƒ×ïÿu`u`‹ ê¥dò‰'ÿûÑú+¾÷Iªå·Vÿq7ïü×ûÊüû;RÿøÈøúÁ/ÿ?ÑëÎ÷2 ÿµ¯ïKkµ¯`ƒÿÐÌõýúåãKQбñ öÜòö ò †õzòû$÷Îå¿ôA ÿ$ÚãûÔ°ñ,PæÜùI^/: ¨\ô)jàÍö÷É ²ÿoèî’*'Þßà"oèî’3ôñ nÖÙ’*'ÈåäÐøúµô÷ô÷…ìñê5ÿT ûÑúŽºîo!ÿðÿýÛýýÛ÷Ðøú’ïò…ìñ***ÖÖÖÿ†°°zPPÜÜÜ<<<Ð ZÜ F!ëxNm»žžžžžžÖãÐï ,íÔø,?4 ® ìüôþùñý&.ÌÌÌèèèÿöööbbbÿžžžÿ èèèM% ÿþçýµô÷.*ÿ 1v|ÑM% ÿ³ÛôöööòòòÿÜì:þ°ÚÚÚ ÿòòòòòò5 ôåðùñýõÓáëñå$ëðÎû97: ðÎûèÈñóÝÜèèè5 ×þÿ—Åîôôô )ÿM&%ÿÆÓÓBl823=:ÃÆû|*(ÿM&%ÿM&%ÿ|*(ÿ@Ñüý4-;5.ÿ&úÏýÿ&ÿ&;5.t0ÖþÝÓý õôèèèòòòÍ Í (%#ÿÿ½½½èèè œ¢5 i;4-ÌÓûvvvÿS*ÿóõÞ¿ÿïÍ÷õÔùïÍ÷3 õÔùfn'ïÍ÷‚[âбñM&%ÿšþn;,d„ÖØ³ÚÛ5 ô 2œ\ÀS*ÿÿçÊýþS*ÿDx¨JJJÍÍͽ½½èèè÷Öùû ÿM% ÿK ÿƒ×ïÀ¢ß—ŒŒfff­ÖÄÌø½‡2ÿ?³/+ÿìZ2ÿìZ2ÿÇÕùMÑÕÿ÷ÿôööö÷ÿô   òòòeù0þëþ1:- })ÿöéüM% ÿÿ0<4 )<4 <4 )u`ûÑú‹ êp1‹ ê‹ ê:- ÖŒŽc IDATûÑúûÑú+¾÷èèèCk8u`8úÁ/ÿ‡‘çøÈøúÁ/ÿæÁÌôÁÌô® ì® ì`ƒÿïÜÜÿ æÜù æÜù$c<)ôàÍöàÍö÷É èèè’*'˜ÝÞòþþÐøú‘ÿîë0É÷ù‘ÿîëÍ ø¬÷^²è7 T ’ïò‘ßñÈèø0©ê5ÿê5ÿ>ÄÄľ¾¾ÄÄÄ0া¾¾ˆº»ŒŒŒ333tttÖÖÖÿ444ÿËàà EBR`?4 3 µ¯ï  òÝúÌÌÌÿÿ¬¬¬ÿòòòèèè³ÛôÍ K ÿ 1÷ÏûM% ÿ³Ûôÿÿ ÿ êêêºòP ööö ÿÿÎñÿùñýðÜ2À”óïÇùÚÿþ$ë8óÝÜÿÁèéêêê5 /òñÝÿÿ0P'ÿèèèM&%ÿ/‰=:=:ùÆÆ=:|™e/4-M&%ÿ #$ÿ´&ÿã*4-ÅËÒ1ÿÚÎüÅ;5.4- õôèèèèèèËó Áé( ðÿJJJtttJJJ†¼½½½ÿËòó»äõ#L Ý´ËòóŠŠŠ­Öèèè Þ¿ÿ ,3 3 U;‚[âèÉ èèèËòófû’äæÅÔúv`4- ÷Îù»ä6­ÖbbbÿÍÍͽ½½èèè÷ Ëó Âöù!ÿ%#ÿ#­ÖÄÌø½‡2ÿèèè,¾æf ÿîëÇÕù2X9+eéí ÷ÿô   ûöþíõê  ÿÿ})ÿþëþÃ1½‡2ÿ·Vÿ½òøM% ÿòòòÁéöööM% ÿÿ})ÿ)ÌÓö4- <4 ò‰'ÿûÑúÏðÏð:- /èèèRÿ½•ìÅÍôq7q7®êwÙSdÝÿýñôãûôãûñÿåãúR`åãúµ¯ïR`öööòû$ òòòòòò'^ÿ$&A ÄñX¤ A‚ÿNãê˜ÝÞÉ÷ùÉ÷ùÞúüÐøú™ïó§ñõÐøúèèè{ÿa×ëÿðÿg 8ø¬÷ÿðÿÐøú8o!ÅùÄê5ÿ***“··ÈÈÈÈÈÈŒŒŒ$$$ÄÄư°šššÿËàÃúñýáÿþíÔø»¾ò® ìÍ¡îùñý 444ÿÿ öööèèèÿ5 ô4.áݗÅîþçýM% ÿòòòòòòèèèèèèèøFþ°öööööö óÍèéþùñýëñåÿè03ó9ïÇùì2$ë0P'ÿÿööö 5 4-ööö¸ #³ÚÛÑüý)5+ÃÆûÃÆû¾”ÈÃÆû|™eÌÓûM&%ÿ õôÝÓýQÀýÿ;5.5+˜ÈºúÏýÿ&÷Ï ÎüÅtÈÏŒÐúõ èèè Áé( ðÿÿbbbÿÆÀ\ÿJJJŒŒŒ———½½½5 sE Ý´—Åîi;èèè7÷úïÍ÷š’Ù , ðèèèèèèèèè¤ÅÌø|*(ÿyoM% ÿRÿÿRÿèèè 4.ÊýþS*ÿCCCÿŠŠŠ½½½CCCÿbbbÿÿCCCÿèèèõêê@# ìýþ*èßúôM% ÿM% ÿK ÿÌÒâÄÌø½‡2ÿ[ßã\ñøÿîëüΨ2Xšþ³/+ÿòòò   áéÞ   ÿÿ›ï“úÿ“úÿ=þûþëþúÏé:- ¾ÝÆÓööéü4.M% ÿòòò ÁéM% ÿÐüû<4 CzÞ³Ûô<4 ÄÌôÀ£ïŸê½†"ÿûÑú/ƒ×ïƒ×ïûÑúp1p166ÏðúÁ/ÿq7IªåIªåÅÍôÉïÉïøÈøq7ÉïúÁ/ÿ­œ#04 ëÎ÷æôãûùñýµ¯ïÐÌõåãúåãú¸•þ¸•þÿÜ ÷ûåäÞ¯öööööö”ÿ$Ù¢ïæÜù$Ú¿ô«…è·¢í$$’vp¼$ÿ"µô÷Í Þúüòþþ0"ÿžÛãNãêa×ëa×ëo!žT %bçìËâë<çbbbÿmIIáááBBB¢¢¢888·ÛÛffffffzPP<<< Ï,F- õåûÚ¿ôêÌöüôþ÷êü&.ôãû2 ÿäääÿèèèôôôêêêòòò ÿÿK ÿ5 ôËó 1Ëó 5 ôÍ Ëó M% ÿÿöööþ° èèèòòòÿ ëêèÿÎæÿðÇæáÿÿðÎûÄÈÝÓý 5 4-ÌÓûääääääËòó.#5+23Dt?ÃÆûùÆÆ¾”È—ÏÐÁ¡ ÃÆû4-³ÚÛ³ÚÛi;¯e4ŒÐú¯e4úÏýžù½ùÖû×þËüÕ;5.¦Ì Öþ #$ÿÿ3ôñ5 ô?þ(ÿ+++¯y$tttœ¢TTTžžž½½½bbbÿÿ¬¬¬ÿööö4-ÌÒâÌÓûèèè­Ö%#ÿ%#ÿ0OÿèÉ õÔùÞ¿ÿõÔùÞ¿ÿ ,|*(ÿ\ñø6óîÅÔúœîð|*(ÿÿMßuvG 2=_RÿRÿRÿŠ„ÿ 2ñìV 2h<;—Åîÿ×£ÑúS*ÿCCCÿÍÍÍCCCÿvvvÿvvvÿvvvÿyEZ&ösE333{ÿM% ÿcü÷³Ûôóþþ})ÿ<40ÿ#)è4.K ÿM% ÿ×ÿÌÒâÄÌø½‡2ÿ ?&:=eéí³/+ÿèèèèèè  ûöþ   ÿ{ÿ})ÿ3ôñ=þû=þû0úÏéÆÓö þëþ})ÿÿ ÿ ÿ ÿ2 ÿSQ(ÿÌÒâ4.ÿÿ  ÁéS*ÿÿÄÌôRÿ<4 CzÞÌÓöÌÓöÐüû³ÛôÌÓö‹ êíZ!ÿ/¦ßÏðÏðÏðƒ×ïûÑúøÈø8øÈøCkü×ûÅÍôÉï®ê‡‘ç?Ñ?Ñ ýñ ", ÞÔ÷ùñýæKQèèèòòò  ÷Üòû$õz”ÿôãûæÜù$Ú¿ô/: U{ôãûý× æÜù¨\ôÄñÿÿ3ôñòþþ0Y 7  òþþ›ÿ7 {ÿ00%T Éøùø¬÷ýÛý0ËâËâbbbÿ888“··CC·ÛÛììì888šæ^<<<******ž93ž9  óâú  ûöþ ððð+ôãû ýñÿèèèòòòèèèòòòèèèÿµô÷³ÛôèèèËó Ž”éËó 5 ôèèè³Ûôÿ êêê èèèèèèèèèòòò ôôôýôà  -!åââÜ$Íåðû2аèèèèÿ çöçÚÚÚ äää—Åîi;­³ÚÛnccÿ=:ùÆÆÃÆûûÎÍ—ÏÐ’4-«hUc˜Ê¢wpc­s—ÅîŒÐÌt0úÏýËüÕÜL);5.ÅËÒ¯ýýQ¯*ÓýéÿóÝÜK ÿ ô4,ñ®Ûiii¥¶¶ž**CCCÿ“““ðê†JJ”¶¶¶ÿööö4.­Öóõ7÷éëúú ,ÔùÞ¿%#ÿ ,бñM&%ÿœîð \ñö? ýèèè„èèèèèÿª|vuvGûÇËÃîáïÁ¼ø„Šª €¬­ÿ;5@õ#ŠŠÿááá333333ÿF⇻ÍÕÕÕèèèŠÖ})ÿÐüûÒýÔàøËèûñ·VÿÆÓöu`wÎÿ ôããú4.ÌÒâÁéü&çýä×4èèèÿf ÿ÷ÇÔÓ9"´Üòòòeÿèèèÿööö  ÷öôæàûöþûóþÿeù‘åý=2:- 1À¢ßƒ×ï…ìÿòÿì öööðÛô²ÛÚ p4ºÿ  ëÎ÷ÿööööööööö »äsE—ÅÿèèèRÿÌÓöü×ûM% ÿCzÞ³Ûô³Ûô4Ì ÿ½†"ÿCzÞRÿÏðíZ!ÿ/wÙƒ×ï·¨D IDATRÿøÈøRÿü×ûƒ×ï×ïö î ÐÌõ2 ÿ ?4 ¸•þëèñòèÿèèèèèèÿöööòû$Ü"Qüí•öööðž 2ÿ÷ÎA ÿ $^ÿ ãc<{DÜôºÿù)j¨\ôèèèRÿúÂ…ìñ ÿÈåä›Mèè!ÿÉøù²ÿÉ÷ù7 NãêoÛÿýÛ÷Nãêã{ÿbbbÿ888“··/55Ëïïúììz<¢ÄÄÄ/55ÿÓ¯¯šššÿfffšß,bÇëüôþ &.ÚÔÒ8 ÷É õôôôôôùöùÜA÷æèèè òòòèèèèèèþô ÿ ôôôòòòÿ ÿòòòôôôúðððââøñÞ¾çÝ#-@l À”óMö³á òñËòó ;9»½æòòòÿ—Åˆÿ=:ÃÆûÆÊ¢:6^—ÏÐi10Bl8‰/û×þ,a—S*ÿ­ÖèèèÿŒÐ t0ÕŒÐú¯e4ÅÒ¯ýýŒ›ÌG-îÖÌþŒb3˜º¹ÓM&%ÿÿçËó èèÛ³ÚM% ÿËó 5 ô³ÛôÛ†d^*bÿtttç±\CyΤ —ÅîèèèèÉ èèèÿéë"AU;šÍÙÛÝøÿéëÔù0Oÿбñ³ÚÛÿn³èèèÿ„ŠñŽ”´èèèÿèèèòòòÿöööÄÌû<É Šêêê®®®˜d4‡»ë¢ÕÕÿèèèM% ÿÐüûËó èûôèè·VÿÆÓöu`wÙöööØ üéÌÒâ4.ØÐÞ(4."ÌÒâ(4.šþš÷úeeéí›Ó?³òòèèèÿöööü öö÷öô%ðÛùÿûóþèèèƒèÿm÷@^!úÏéľôÆÓö:éƒ×ïöööûÿþ òÿì $õåûCÄÌø  ÷öôðÛù ÿ >­¯Øööö êêêööööööÌÒâööÿ èèè—Æi: £Ò)èÌÓöRÿ®êÌÓö—Æi:£ÒÏípò‰'ÿwÙ—Æï®êq7ƒ×ïq7 õÞÔî +êèèèòû$Üÿäî æèèèý× ôôãÆ÷ôæ^´h ˜ñÿôãû$èèè—Æi>®êñ ÿ"µô÷ÿåä÷oèìßûü{ÿnÉøùËân…ìñtttÄÄÄÈžž --NNN --/55mII<……ÿÄÄÄfffºÓô ôôôôôô )öööAèèèµô÷ÿöööòòò ÿèèèòòòÿ8åââøñ õôööö 3þаÙÿäää ,ôÔýêêêòòòÿöööòòò»‰ˆÿ=:„g›Ñüý4-wpc„g›:--23=:Uc˜/Ñüý³ÚÛ|*(ÿ)ŒÐút0;5.Q›Ì@Àýÿo)­Öÿi:þÌÔÿç³Ûô%#ÿ(Øþü\/®êÿ¥oï%z°}ƒçÕÕÕèèèÿööö èèèÿ7÷бñÿèèèÿ5 ob3Dx¨ÿèèèÿèèè!ÿ\$ :- ľô®êÿööö÷ö÷ íìí ÷öí ÷ößûü!ÿßûü\††ÿÑËË©……ÄÄÄÂìì¤zz-QQÿ/55ŽddrœœŽddÿööö$û ÷É èèèÿòòòÿèèèÿèèèSQ(ÿ.­ÖÿèèèM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ #$ÿ õôèèè|*(ÿ)£ÑúéÿóÝÜ #$ÿóÝÜÿèèèÿèèèÿööö èèèÿöööòòòÿèèèÿèèèÿeù›ïeùƒ×ïÿ öööü öèèèÿöööòòòÿèèèÿèèèÿdâ § IDATèèèÿi:þ—Æèèèÿèèè€ÿÿöööòòòÿèèèÿèèèÿèèèêêêÿêêêÿCgg½™™ÿèèèÿèèèšššÿPPPK ÿµô÷M&%ÿ³ÚÛ½†"ÿÄÌô®êÿòòòbbbÿáááZ&öDx¨#ÿ øõööö èèèÿúîëòòò#ÿ", ÞÔ÷òÝúCCCÿŠŠŠŠ„ÿÉÍ ­¯ØŠ„ÿv|㬬¬ÿ¨¤f64 v|ãTPÿ¬°î¬¬¬ÿ>>>JJJÌÌÌM% ÿþçýµô÷M% ÿ4.­ÖM% ÿ³ÛôCCCÿŠŠŠvvvÿ666TTTCCCÿñññððð>>>JJJÊÊÊŠŠŠ444ÿ½½½bbbÿžžžÿ+++êÓ¯¯ÿ5 ô³Ûôÿ5 ôËó èèèÿèèèSQ(ÿ73š õôôô;9ÅÇðèèèbbbÿú$$¤zzS*ÿ<4CyÎÿò †ðž÷Î444ÿÌÌÌM&%ÿ×þÿ+1` Þõ#‚©{444ÿüóä ÌÌÌÿ èèè-QQÿÓ¯¯ÿòòò444ÿÌÌÌ“··‡¶êêêÿÖùû!ÿßûüòŠ6ÿÅÌøüÙý?[ 6ÿ[œï³ÚÛ½†"ÿgž½† ÿCzÞÿ ÷òòò¼ˆXÿ‡»ëááá½½½áCCÿ¼ˆXÿDx¨ëú+Ãööú(%`Æá‹öööÿèî òòò0OÿÞÔ÷", ", 04 ÐÌõ, ÿÞÔ÷òÝúCCCÿñññäääÕÕÕñññääävvvÿìììžžžÉÍ 73õ73ÿv|ãTPÿX\šÑÓöÑÓöTPÿX\šTTTTPÿ64 v|ã™ 8ÉçÈ7¬îTPÿ64 ÊÌõ¬°î444ÿBBB楥/55¥¥5.....ÿžžžM% ÿ4.Ìâ!àÿÔàøâÔàø!ÿ4.âÿ³ÛôSQ(ÿ­¯ØSQ(ÿ64.<<5;?uÅÁ‹ÿ÷ÇÍDx¨CCCÿëêËó ËËËáááêêêS*ÿá8ááá½½½ŠŠŠbbbÿJJJCCCÿ333666¶¶¶JJJ>>>ÊÊÊvvvÿìììžžžCCCÿñññäääBBB666>>>ŒŒŒÿìììžžžbbbÿÿ+++ê5$$ëÇÇÿ+++CC¤zz-QQÿ/55¤zz½†"ÿCzÞ½†"ÿ=;ÃÅæCzÞ½†"ÿCzÞÿ èèèÿòòòÿòòò5 ô0Ðüûÿeù›ï5 ô0 ô³èÿ;9ÿÅÇð;9·ÆÜ ·Æüw;ÌÓö73­¯èbbbÿáááq–щŽSwr­ÔÊ'ÿóááá½½½ò‰'ÿÊÌÒâ³Ûô­Ö*ÿ½‡2ÿCyÎÿÛäžÿòòò444ÿ”ÿðžÜòòò/×úü¡7úªÎx,~W…ÿ‚©{üóèÈñ844ÿÌÌÌöööÿèèè444ÿù13Ö°ß-QQÿÓ¯¯!ÿíÿòòò444ÿÌÌÌCCCÿâââxxxTTTÿ *°°°ÿK ÿßûüK ÿ!ÿßûüSQ(ÿSQ(ÿM&%ÿÅÌøüÙýMÑÕMÑÕÅÌøÅÌøf òŠ6ÿÄÌô™bþÄÌô½†"ÿÿÿÿ 8  ÿ¦Ú ½½½½½½¦Ú bbbÿÿîëÕúþîëØÛ :uèìÿKàþÿ0OÿÞÔ÷ÞÔ÷ÚÈõª”êÞÔ÷ÞÔ÷", 0OÿCCCÿìììááábbbÿ­¯ØÊÌõ%#ÿ64 îîî/- eaFJˆTPÿ64 ÊÌõ ÿ8Éç/- göñRÿ64 ÊÌõ64 TPÿ444ÿ...æmIIP&&mII888JJJêêêÿbbbÿÌÒâØþü, 4.`N&ÌÒâ4.SQ(ÿrpc¥reSQ(ÿM% ÿúÔäøÎÔˆd%#ÿÄÄË 93¼ˆXÿáááááá3ôñ&&&&&&ÒÒÒCCCÿ444ÿ¶¶¶˜˜˜®®®bbbááኊŠìììCCCÿ¢¢¢ÊÊÊ...ìììááábbbÿÂÂÂììì+++òòËïïÜÜ ÕÕÕñññ¼’’CCCÿòòÑËËbbbÿRÿ=;=;½†"ÿRÿŸê‡‘ÚŸêK ÿ=;=;½†"ÿÿ öööÿ¥!=þû¥!ÿ ÿ6:-05 ôÎãøÐüû¤Üó5 ô06:-0;973tn73;9ÒÒàI:$.. €m+ÌÓö4- =; ÿbbbÿbbbÿú$$ÎîÅ]XôÜ܉ŽS2;0P'ÿS*ÿ½‡2ÿM% ÿÊq6ý~¦ 4.M% ÿ­ÖÄÌøS*ÿ±u}ÜÜòòò444ÿê-þÜò †ÿM&%ÿM&%ÿ)òàßÂv|íó"ÑþÿÿèÈñèÈñüó444ÿ #$ÿ¹±öööèèè444ÿù¥§ÚÚÚ»¸M% ÿK ÿí ÷öù444ÿ444ÿðððlllbbbÿ¬¬¬ÿxxx...444ÿÿDnn×Õÿ×Õÿ“··\††ÿÃM% ÿS*ÿ½‡2ÿS*ÿ%#ÿÍ ßûüÿSQ(ÿ­¯Ø³ÚÛüÙýMÑÕIªÒIªÒš÷úÅÌø444ÿ444ÿÌÓö<<=™bþ£Òÿêêê 8ùÔþôÿááá½½½ÿÂÂÂáááÿúêêê=îëÆá‹úK ÕúþõÿÞÔ÷üôþ &8 ÞÔ÷üôþÞÔ÷0OÿCCCÿäääðððñññÂÂÂÕÕÕáááCCCÿÊÌõÊÌõFJˆÑÓöØÞEÑÓö½†"ÿTPÿÊÌõÑÓö åôüÑÓöÑÓöÌÓöÊÌõ¬°î64 (RRÜÜ“··¥¥ÂììÂììîîˆM% ÿ4.ÌÒâþçý&éþçýʹßÌÒâìýþØþüÌÒâ4.M% ÿi70‘ÂÉ64.,2,xœÊÌÒÄÄË<;5CCCÿÒÒÒññññññØþüØÕÉÆMöÌÒâäääÒÒÒCCCÿ...ááá555iiiÊÊÊŒŒŒžžžbbbÿäääÍÍÍÂÂÂÕÕÕááá>>>ìììžžžêããËïï+++JJJêòòËïïRÿ<4 l×ÓM IDAT‰±Ê<4 ‰±ÊÖùûÃÅæ=;½†"ÿÿööööööÃGKåCÃGKööö0Øþü2073=; ÃÅöÉÍùáã ÒÒàáã ª°4- ¤ÑòÃÅö=; 73;9áááÜÜ2;ä ÎîÅÜÜáááú$$CCóS*ÿ<4ÄÌø³ÛôÌÒâÊóðS*ÿM% ÿ<4ÿìòòòtttÿ444ÿ Aðžx,2ðžòòò/'&xy———ÕÏ 8ôÔýüó›£8 ù¥§ŒŒóQué(+Éß÷ÖùûßL-QQÿããvvvÿ%%%...^^^ÛÛÛ%%%JJJÿ99ÑËË)+×ÕÿÑËËÿK ÿM% ÿèèè þçýÿS*ÿÌÒâ<4K ÿóõèèèSQ(ÿÿÅÇð5 ôúÔäÿSQ(ÿMÑÕ³/+ÿ|*(ÿ|*(ÿ×þÿüÙý·V.ÿ444ÿCCCÿXˆ¿ÿCCCÿ³Ûô>¡CzÞ].òÄÌôÿÿöööòö  ÷ááá›Ç’½½½CCCÿ444ÿÿ òòòàþ=àþÕúþ=þû=þûîëÕúþîëöööúÞÔ÷üôþöéüüôþüôþ÷êüÚÈõÞÔ÷üôþöéüüôþÞÔ÷ááá½½½ RRRÕÕÕvvvÿÿ.. ¬°îˆˆˆ=?ZÊÊÊyw\ea64 ÊÌõ/-  /- (4- ÑÓö\††ÿËïïËïï5>ÜÜÈÈÈîîîbbbÿµô÷ìýþÖùûÔàø&é³ÛôÌÒâÌÒâ4.SQ(ÿ 93ÄÄËÊÌÒ3,úÔäøÎÔ†K~(úÔäÊÌÒÄÅ˼ˆXÿðððÌÌÌÛÝøØþüÌÒâ4.èèèÌÌÌììì>>>>>>¾¾¾ììì444ÿìììáááèèèäääáááðððê5ñññððð÷ÓÓ --ááááááÒÒÒêëÇÇòò\††ÿ<4 =;ÃÅæ‡‘ÚÄÌôÌÓö«|@ÄÌô«|@* ¯­’¯­’ööö ›ïÊúúüÙé(ÎãøÎãø(ØþüüÙéÐüû,ñïÔñØÌÓö.. bbbÿú$$žžžááá...óÎîÅÒÒÒ½½½ÜÜ89S*ÿ<4CyέֳÛôʹßÊÌÒâþçýÌÒâgòÿ&&&òû$ò †ÿÿÌÌÌ AKE{F÷ά¬¬ûåÿ³ÚÛM&%ÿ0‚„/)çV ËËËêêêÿôôÿÌÌÌä üó2; õô¬¬¬êêꥧŒŒó°Š¹°Š¹ÑÍúñïÔôõÿÿ!´íßûüããùìììâââ®®®¼¼¼­­­ˆˆˆ——— 8ëÇÇÓ¸áüãâDnnÿÿµô÷Ëó K ÿ5 ôÃ3ôñÌÒâ4.Ž…× M% ÿÅÇðM% ÿ;95 ô,,~¥M% ÿM% ÿÅÇðeéí|*(ÿœîð|*(ÿ7]/–Ð÷444ÿ$T‹E| Ú£Œ¸ƒ]ŽbbbÿRÿM% ÿRÿ<4 ÿÿ  ùÔàþôôôtH}ñññäää444ÿ+++>>>yEžžžëÕúþë=þû¢N=þû¢N=þûàþúîëöéüûöþ  üôþöéüöéü÷êüÞÔ÷ááááááÜÜÜÍÍÍáááôôôèèèèèèÍÍÍ­¯Øÿ­¯ØÌÌ̈ˆˆŠŠŠÛÝøÊÌõÍþû%#ÿTPÿÊÌõÑÓö¬°îÑÓö/- ùÕúþçýÌÓöÛÝø›ŸëÊÌõððããÓ¯¯¤zzú$$mIIíííÒÒÒÂì숈ˆÌÒâØþüµô÷ìýþÔàøìýþ³ÛôM% ÿÄÄËÊÌÒ­¯Ø—ÉÐi70ʹßÚÿ³Ûô­¯Ø—ÉÐ<;5CCCÿÜÜÜ(Øþü4.—ÅîñññCCCÿááážžžììì333xxxÌÌÌááážžžììììììÜÜÜôôôèèèìììú$$êêêòòùÜÜ=;ÃÅæÄÌôÌÓöpaÌÓöʺóÄÌô‡‘ÚÃÅæÿ öööòòòóõÞ¿ÿéëöööÐüûÊúúÚÿþçý&éÊúúÊúú³ÛôÉÍùÃÅö,þçýáã ÉÍùÃÅöÉÍùžžžžžžáááí ää ÌÌÌááá%#ÿ%#ÿK ÿr{)þçý6G!pb&4- ™c®êðððûåðžò †ööö444ÿåß°µ»êHÜbbbÿTTT}òö ÿ³ÚÛÑüýÐ~|0‚„çªóööõ/üú¾­~ÌÌÌаÙÙïðÒÒÒ öööÿ.žï/üúõÓáÿ÷ L$CC444ÿ-QQÿaŠ'13­­­ÒÒÒ...áááðððððð *ëÇÇ  þÔá½êöööÿ òòòèèèÍÿöéö?þÁé=çûÌâËó äËôM%ÿþçýµô÷èèèËÿÇð5 Cl:*Ëóâ;9ÿ­¯Ø³/+ÿÉûýœîð›'ÅÔúךüýf f/+ÿMÑÕ444ÿ뻄/_`ÇÇýáááCCCÿ½½½ÌÓöRÿ<4 ÄÌô—Æèèèÿþôà þô áááêêê444ÿÌÌÌäää444ÿZ&ö‡»á‡áÿàöôü  ÷àþî^²èÃ!´í î òòòòÝú#ÿöÿûóþûóþÿûöþFÿ³ú CCCÿÜÜÜèèè+++ÿáááÿä5 ³èááá­¯ØÚÚÚXïá‚ ;Û444ÿÌÌÌÑÓö/- ÛÝø-ÓþüÛÝøÛÝø(ÿ(þçý4- ³Ûô\/Óþü$$$ŠŠŠÑËËÑ/55ؾ¾ÌÌÌÌÌÌP¬¬ÿ³ÛôS*ÿÒâÛßûü ÿìýþµô÷³Ûôâÿ64.úÔäúÔä‘ÔäØþü&SQ(ÿ64.ÄÅËÒÒÒðððØþü(¤ÐÞ5 ³èÌÌÌ...ÿñññ¬¬¬žžžèèè+++ÿáááýáà èžžžbbbÿžžžëÇÇÑ÷ðð ÌÌÌ444ÿÙïðããÌÌÌÿ꽞žÃÅæÄÌôÌÓö³ÛôpÿÌÓöþçýÖùû, ÌÓöyo&ÞöööòòòöööúéëòòòÿöööèèèËÿ0ùÐüû0üþçýÖùûü0ÿèèè­¯Ø(ÿÅÇð;9áã ,ñØþçýñïÔá,ôÅÇðú$$ç½½áááí äóññÈÇüçáá­Ö*ÿ(#ÿ˜d*ÄÌøÊ¹ßÚÿÒâ<5ÄËäS*ÿ­ÖêêêTTT¬¬¬òöåðžÿèèèÌÌÌ444ÿåß°ŠŠðvvv888ÿÈÈÈõûåÿòòò¸ æ¶¶xxx¶¶¶áñññÖÔ ÷þÿÿòòòÿëêÚëêööö ööööööK ÿÖùûÑêê ý*Quÿ3!˜“öÓ¯¯iii$$$âââðððñññ½½½ì8üçÿêêêöBÿ èèèÿ3ôñ?þËó ?þÚÿþçýÌÒâÁé3ôñéëËó µô÷;95 ôCl:*s!¸5 ô;9ÅÇðÅÇð|*(ÿM&%ÿqõùÑüý›;,'üÙýœîð’äæþæä'eéíÌÌÌÌÌÌ...ö&]ÂÆü Ú£/_`E|ññññññ444ÿM% ÿM% ÿ4- <4 ÄÌôÄÌôÌÓöi:þèèèÿèèè , ôôôêêê 444ÿ444ÿäää444ÿ ðððáááááá¦Ú ñññ444ÿCCCÿ ÷K ëúÃòøîë=îë Fÿ ³Ûô ÿ òÝú%#ÿâàÅ)è\/³Ûôáááhhh¨sj/&&&xxxÛÝøÑÓö-þçýÁéÃþçý®êRÿÓþü->øÒ·ããØ®®ñïÔbbbÿ¶¶¶ÌÒâ4.M% ÿ!ÿ> M% ÿ%#ÿ³Ûôw{ª,³ÛôþçýüâüÖùû&é³Ûô3Dx¨ÜÜÜ&ééëÁééë³Ûô444ÿCCCÿááá½½½ÌÌÌTTT&&&&&&&&&&&&ñññK ÿÞÂÁÿä*ÛÝøžžžòò õôÚÚÚèèè/55CzÞ<4 ³ÛQŒxK IDATôŸêþçýÖùû*³Ûô³Ûôòòò=þûéëèèèeùÎãøÔàøÖùûìýþ*Ëó 6:-eùÿáã èèèÅÇðÖãÐñØþçýÖùûþçý.. ô73Ø®®í äCCCÿñññ2;í äí äÜÜñññ­Ö³Ûô\0"ÄÌøÄÌø¤ÐÞÚÿ&éØþüÌÒâžÚÌÓö­ÖÿTTTÒÒÒ ÷ò †öööÌÌÌŠUŠŠŠfúÂÂÂðððbòö ÿ³ÚÛÌÌÌžžžTTTÛ¨¦ñññ ÖÔóþþêêêÿí úúú +ë+++Å¡÷ÏÍü¢|«¢|«Ó¯¯444ÿˆˆˆÌÌÌfffááá×Õÿüçÿ)+×ÕÿŒŒŒ&&&ööööööK ÿM% ÿÍ Áé5 ô4.˜d*Øþü=þûà èèèèèèSQ(ÿSQ(ÿÅÇð,XÒT½”ò¨.¬5 ôËó ÅÇðèèèèèè³/+ÿÑüý×þÿ f ';4üÙýeéíööö"úøW¸àŸ>³/+ÿ444ÿñññáááö&]뻄ÇÇý²‚/_`Ñ¡ Ü¬u$T‹ÌÌÌÌÌÌRÿpa4- <4 <<=<4 Áé—Æi:þRÿÿ ÿ þöã÷Ôòôÿööö èèèÌÌÌääääää>>>˜d4yEáááÂÂÂááá444ÿð öööÕúþ Õúþ",  #ÿ¿ û(þçý ÿ#ÿ ", áááCCCÿ,(ØþüÌÓö444ÿCCCÿááá½½½vvvÿBBB¬¬¬ÿ¬°î/- TPÿ D ?þ=þû-®êêêêÿ(ñïÔñïÔ.I888žžž³ÛôÌÒâ, ìýþ> Úÿ4.M% ÿ(3Öùû*‰…Vÿ¥re—Éн½½...CCCÿM% ÿ=þûú?þ333êêêÿÒÒÒBBBBBBBBBÌÌÌxxx§§§$$$ÿé(+*&éÚÿèèèêJJJÿ99òòòCCCÿ¤zz=;<4 þçýÖùû*µô÷³ÛôÃÅæ òòò=þû÷ö=þûòòòÿ6Ëó Ù*> µô÷5 ôÆÓãÐüûÿ;973ôèèèþçýÖùû*E7373ÉÍùèèèÌÌÌ2;áááóÌÌÌbbbÿ,6_ÌÌÌRÿRÿRÿʹßʹßÌÒâ(ÿ6G!\0"þçý4.&&&ÒÒÒÚÚÚðžý—ûfffvvvbIÎêêêêêêðžòö ÿl ÿÙúûÚÚÚóþþæüý ÿôôÿööö ööö444ÿðåü -éëéë#Szó --á½½!ÿZZZ———ÌÌÌ®®®ŠŠŠššš...RRR è¾ þÔôôôòÈüãá½½ 辚ššÚÚÚòû$ÿK ÿÍ Ëó =þû4.<4ÄÌøËó &éÍ  èèèSQ(ÿÅÇðÅÇðÅÇð®ZÈÅÇðËó 5 ô;9'f )eéíüÙýŠ òeéí5 nL""Áé©H aÂêMÑÕÌÌÌܬuñññÇÇýܬuRÿRÿRÿ¼øxpIÄÌôÄÄÃŸê¼øsD—Æ®ê èèèööö Bþô èèèÿÿèèè+++ ááá¦Ú ¦Ú áááËËËËËËÌÌÌîëú àþúòòò+úàüôúîë öööÞÔ÷òÝú ÿ ØþüòÝúüôþÞÔ÷žžžñññ$$$ÿç((ö7444ÿ...vvvÿ666TPÿ®êq7ž9%#ÿþçý=_TPÿq7TTTÂÂÂCCCÿØþü(-QQÿ¶¶¶³Ûô³ÛôM% ÿØþüµô÷&é¤ÐÞ4.³Ûô³Ûô—ÉÐi70ÅÁ‹ÿ!ÿ*ÚÿþçýM% ÿ3‘ÂÉ­¯Øáááö7é(+(ö7444ÿááá½½½Â¾¾¾ÍÍÍ444ÿÊÊÊÂÂÂé(+ ;444ÿ$$$ÿ+++ããêbbbÿCCCÿÃÅæRÿÖùûÖùûM% ÿÃÅæèèèÿÿÔàø*Ãÿ :-eù'èåÚÿ, ÊúúËó èèèÿ2L$EÉÍùÉÍùáã ÅÇðú$$CCbbbÿÌÌÌñññbbbÿÎîÅÜÜžžž444ÿ®ê®êÌÓö×ÿ4.]/ÌÒâ­Ö4.­ÖÚÚÚÚÚÚûååß°µ»êfúž¢µbûå ÷Ñùû^ÿæüý÷þÿ ÿñØÙúûèÈñÅÇðÿ%¥§á½½CC!ÿñññ½½½ðððÌÌÌððð...TTTÿ êêê èñòû$ÚÚÚÿòòòÍ  íìÍ ÄÌø3ôñÍ 3ôñ3ôñ­¯ØèèèèèèèèèÅÇð,Ëó ÅÇðSQ(ÿÿüÙý'f 5 eéí[ßãœîðdf Ñüý©H aÂ꛳/+ÿñññ½½½E|뻄뻄ö&]...ÌÌÌRÿxpI—Æ ÄÌôÄÄÃ<4 Qˆì4- —Æi:þèèèèèèòòòAùÔë ÷ öööÿ bbbÿCCCÿÕÕÕôôôááááááÂÂÂôôô555 ÕÕÕ444ÿòòòöööëàþµòÛú ôôô öööúòÝú&é³Ûô 0Oÿ#ÿ üôþ½½½ÌÌÌ444ÿÕÕÕÌÌ̳ÛôÒÒÒ½½½666wÙò‰'ÿ/- ÑÓö³ÛôÊÌõ64 TPÿ®êò‰'ÿTTTTTT\††ÿ=?Z(³Ûô5%“··žžž%#ÿ&éßûü&éM% ÿ­¯Ø—ÉÐ÷ÇÍ*&éµô÷(—ÉÐw{ª½½½½½½444ÿç(ÕÕÕØÕ³Ûô444ÿ½½½½½½ÊÊÊ444ÿÕÕÕðððŠŠŠ444ÿÊÊÊ444ÿÕÕÕÌÌÌCCCÿÓ¯¯êËïïËËËÚÚÚÓ¯¯ËïïêËïïÄÌôÄÌô½†"ÿÌÓö*, 4- RÿúÁ<ÿ=;CzÞöööÿí ÔàøÿèèèÿüÙéÛÝø³Ûô})ÿþçýÐüûÿÚÿáã áã ÒÒàÌÌÌèèèÜÜÜÜ444ÿí ä2;áááÌÌ̳Ûô³Ûô³Ûô]/ÿìʹ߳ÛôØþüÿìÿÜÌÌÌåß°ðž}òö ÿ= ÿóþþø Ñùû÷þÿ 555ööööööþçý;_ öööCC»¸!ÿßûüßûüÌÌÌRRRÿ®®®®®®ìììèèè ÜåÜ$ÕÜòû$ Üòòòèèèèèè íì÷<4¤ÐÞ<4Í 3ôñÍ Í M% ÿK ÿèèèèèè;9ÅÇðèèèèèèèè譯ؚ÷úüÙý[ßãÁèé5 ?›;,'ÑüýÁèéüÙýèèèMÑÕMÑÕ444ÿÌÌÌ뻄ñññÌÌ̽½½ܬužžžÿxpIÄÄׯèèè¼øŸêÄÌô —Æi:þ®êÿàþ òòòèèèèèèÿööööööêêêÕÕÕÕÕÕ+++ËËËÕÕÕ+++èèèÌÌÌîëúúKÿÿîëöööîëöööð îëöööúàøÝòÝú0Oÿ òÝúòÝúòÝúöéüðððèèè½½½½½½444ÿîîî$$$îîîîîî444ÿ¬°î¬°îbÇë3šá³Ûô¬°î›ŸëwÙwÙ+HHHžžžØþüú$$555Z66(4.ßûüµô÷¤ÐÞúÔä—ÉÐEµô÷³Ûô³Ûô,64.SQ(ÿððð3ôñááኊŠÍÍÍððð ÜÜܽ½½ŠŠŠŠŠŠðððèèèµô÷½½½áááÓ¯¯òòêòòòá½½ñññòòëÇÇ<4†ñß IDAT µô÷*³Ûô½†"ÿÃÅæÃÅæ , ³ÛôöööÊúúÚÿþçýÍ eùÅÇðÉÍù;9 ðñïÔñïÔñïÔ.. 444ÿžžžÒÒÒžžžä ÌÌÌžžžÒÒÒ½½½ÌÓöµô÷&éÌÓöS*ÿÿÿÿ ÷Ìå`ëƒ ÷ðžòö  ÷æüý +++ñññööö ÿÖùûø su5ÚÚÚÉÆú[YïÃ, M% ÿTTT¬¬¬ÿâââ®®®CCCÿððð444ÿÿòòòèèèæ êêêòû$æ öööÿÿ*[‘æ\0"[‘æèèèËó Í K ÿËòóÁèéf š÷úËòó eéí³/+ÿ444ÿÌÌÌÌÌÌ444ÿÌÌÌÄÄÃ[’öèèèÿ¥n Áéèèè®êèèèÿ û Éë ööööööáááËËË555555öööËËË èèèñññ #ÿòòòàþàøÝÕúþööööööúîëÞÔ÷üôþµô÷òÝúÚÈõ0OÿáááôôôBBB444ÿ444ÿBBB666ÊÊÊÊÊÊÜÜÜÜÜÜ$$$¬°î/- ÑÓöÛÝøÑÓö%#ÿbbbÿ%%%fffÛÝøÿ¼’’ÛÛÛ%%%¤ÐÞµô÷Úÿ&é,úÔä$$$ÿáááôôôµô÷ÜÜÜBBB444ÿáááôôôÜÜÜBBB444ÿ$$$ÿáááôôôBBBÿê÷ÓÓ $$$ÿòòòÚÚÚDnnÿ®êÄÌô³ÛôÌÓö=;èèèòòò³Ûô òòòèèè›ïÊúúÛÝøµô÷ÎãøŸ>Ëó Ðüûèèè­¯Ø,ÛÝøÅÇð.. ÿáã ô%#ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿÿÿÿìØþüµô÷Øþüÿìÿöööööö ÷>>> ÷ ÷ÿÙúûø /üú ø ÿÿñññäääööö ÿí ÷ö‡°Mtt 13á½½Ôàøþçý!ÿTTTÿÿ½½½555fffCCCÿÿÿÿòòòÿöööòû$Ü èèèK ÿÍ èèèÿèèèM% ÿËó èèèÿd’äænÑüýÁèé©H üÙýMÑÕÿ¥n [’ö¥n <<=Tc­³Ûôÿ èèèÿ ööö èèèÿöööòòòÿ+++ÕÕÕ+++ÕÕÕèèèÿúàøÝÿú+Ãé öööúøõöööòòòÿòòòÿö î÷êüûóþÿòÿì  õèèè$$$ÿôôôèèèÿ+++ñññäääèè謬¬ÿîîˆ Þ64 ª°ÌÌÌÿ ðÛÝøÿöööú/- ¬°îÿfffÈÈȶ¶¶öööŒŒŒPPP...èèèÿ5 ô4.ʹߵô÷ÿ3ôñËó èè輈XÿÍýþÄ ¶³Ûôÿ5 ô<`J<<5;?u$$$ÿôôôèèèÿ+++ñññäääèèè$$$ÿôôôèèèÿ+++ñññäääèèè$$$ÿôôôèèèÿ+++ñññäääèèè444ÿù5ÂÂÂôôôùòòÒÒÒÌÌÌÿ5 ô4- ÌÓö³Ûôÿööö?þ4- —Æèèèÿööö èèèÿ èèèÿ3ôñµô÷ÿ3ôñ2›ïèèè%#ÿ,ñïÔÛÝøÿ ð.. áã ñïÔóõèèè444ÿÌÌÌÿööösEÌÒâþçýÍ èèèRÿÌÓö³ÛôÿöööTTTÒÒÒÚÚÚ èèèÿèìÿ ÷TTTÒÒÒäääè|ðžÜ èèèÿ/üúóþþÝúü ÿôô òòòÿööö ÚÚÚ?þ…ÓVÃÆù˜“öëÇÇööö"BZ4¹¿ÕÕÕèèè!ÿßûüÿäääööö555ññññññÿ öööæ öööèèèµô÷ô÷èèèþçýèôèèèèÿ„ÖØÿœîðööö¥!MÑÕèèèÿèèè[’ÿ¥n <<=ÄÄÃ4- ®êÿ èèèÿöööèèèÿöööèèèÿÕÕÕ+++Z&ö¦Ú ¶¶¶èèèòòòÿøòòòÿµòò #ÿøõúàøÝöÿòòòÿÿö îüôþÿööööööûÿþö îCCCÿÕÕÕÿöööñññÿèèè%#ÿ¨¤fÄÈööö&&&ÚÚÚ VPéÌÌÿöööFB ÑÓöÿöööÿèèèÿJJJ888¬¬¬TTTÂÂÂèèèÿØþüÒâÚÿ ÿööö4.ÒâËó ÿèèèÿ 93ÄËËó  ÿööööööÁöÌÒ3ÕÕÕÿöööñññÿèèèCCCÿÕÕÕÿöööñññÿèèèCCCÿÕÕÕÿöööñññÿ99ùI%%ÍÍÍ --ùñññÒÒÒ...ÿäää5 ô4- ÌÓöÁéÿöööi:þ—Æÿèèèÿööööööÿöööÿèèèÿööö?þ éÿöööÐüû0èèèÿööö&ôÒïÿööööööööáã ôá,óõäÌÌÌèèèÿ i:þÌÒâ4- —óöööÿ4- ³Ûôèèèÿ ööö¬¬¬ èèèööö TTTäääè|ðžÜ èèèòòòòòò= ÿóþþæüý òòòÚÚÚ ³Ûè…ÿëÇÇööö޾焾 éßûüðððêêêËËË äääèèèÿöööòòòÿöööòòòÿ›'IªÒÿèèèÿöööòòòÿòòòÿöööòòòÿèèèÿ+++ÕÕÕèèèÿòòò #ÿàøÝÿö îüôþûöþ öööü ö òÝúCCCÿÕÕÕööö555ÕÕÕèèèÿöööFB¬°îÿ<8úÄÈ<8ú¬°îÿ ôôôèèèÿ5 ôËó ööö 5 ôËó èè輈XÿÍýþøÎÔ—ÅîöööEC64.ÊÌÒ­¯ØCCCÿÕÕÕööö555ÕÕÕèèèCCCÿÕÕÕööö555ÕÕÕèèèCCCÿÕÕÕööö555ÕÕÕùããÌÌÌ444ÿùããùããÌÌÌå?{ IDATÿèèèÿööö öööòòòÿööö èèè€ÿÿöööú,ñïÔóõöööúóõèèèÿi:þ—ÆööösDÌÓö4- ®êÿèèèÿèèèÿø òòòÿèèèCCCÿËËË èèèÒøbÿôÈúRX¼èèèÿÚÚÚ èèèÿÿÿ444ÿ444ÿ444ÿ444ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ444ÿbbbÿRRRÿÿÿ444ÿ444ÿÿÿÿÿÿÿÿÿÿÿÿ”ÿ 2ÿÿÿ$$$ÿÿ$$$ÿÿÿ444ÿ$$$ÿ$$$ÿÿÿÿ$$$ÿ444ÿ$$$ÿ444ÿRÿvvvÿ444ÿ%#ÿRÿM% ÿM% ÿM% ÿRÿ444ÿÖÖÖÿÖÖÖÿ¬¬¬ÿvvvÿM% ÿM% ÿ444ÿ444ÿM&%ÿM&%ÿ444ÿ #$ÿÿ #$ÿÿÿÿÿ íì íìÿ......444ÿÿøÿÿÿÿÿ ÿ ÿ¤÷öÿòÿAFvÿM&%ÿM&%ÿ|*(ÿ²ÿÿM&%ÿM&%ÿÿ ?þÿ%%%$$$ÿÿÿ ÿÿèèèööö  ÿÿÿÿò †ðž=þûêêê=þûêêêòd ÿ444ÿ444ÿððð&&&=þûêêêðððMâáLÍÍÍÌÌÌRÿ(®ê³Ûô³Ûô³ÛôÌÓöRÿRÿBBBÖÖÖ   ÊÊÊÖÖÖÿvvvÿCCCÿÖÖÖÿÖÖÖÿM% ÿ¤eO¤eOM% ÿ444ÿS*ÿÌÌÌCCCÿ444ÿ444ÿ444ÿMöCCCÿM&%ÿ³ÚÛM&%ÿ³ÚÛ444ÿ444ÿÌÌÌ444ÿ444ÿ-QQÿ-QQÿ #$ÿóÝÜèèèóÝÜ #$ÿM&%ÿM&%ÿ|*(ÿM&%ÿÿm=þûÛÿÉ1,ööö444ÿžžžbbbÿ...bbbÿbbbÿ444ÿ444ÿR`øÿöööÿÕB cü÷ÿÿÿÿÿ444ÿüê ÷öööêêêoèîßý èêõÿÿòòò¿×µ®ÿ³ÚÛ@l¤ä{/M&%ÿ³ÚÛööö=þûj1ÿ½½½G¼ööö"Aø"AM% ÿWWWòòòÑ =þûöööòòò öööêêêêêêöööööööööÿÿÿÿòû$õzÜÜ6F ÷ö6F òøöÀuÿÿðððÚÚÚ=þûŸ*'ÚÚÚÌÓö¶¶¶ âÉRÿÌÓöþçýM% ÿM% ÿM% ÿRÿM% ÿ×ÿÌÓöM% ÿvvvÿ¶¶¶ÍÍÍÍÍÍÍÍÍŒŒŒ¢¢¢ÖÖÖÿ´…´…CCCÿÿK ÿZ‚®ÉÏÌÌÌ444ÿ£Ñú444ÿ444ÿ>ç444ÿCCCÿ444ÿðððCCCÿ444ÿñññM&%ÿM&%ÿM&%ÿ444ÿ444ÿxxxvvvÿvvvÿÖÖÖÿ444ÿ444ÿÌÌÌùSQ(ÿ-QQÿ÷ÓÓãã-QQÿ444ÿ #$ÿÿ #$ÿ õô #$ÿÿ|*(ÿ³ÚÛÑüýM&%ÿ³ÚÛM&%ÿšššÿ444ÿ444ÿÿööö¦ñõÃ8àç í $ØÞÿ$$$ÿ...ÂÂÂbbbÿRRRÿðððððð...ÂÂÂ...ÿ® ìëK ÿööö+¾÷ ÿÿÿöööööööööööö˜è"ø...   òôÿòôÿí öööÿ?þÜòôÿM% ÿÿÿÀÜÝ‘ØÚÀ”ï\ñøÀ”ï‘ØÚÉÞÞ ÿÿÿèìÿòö µö”¶îòòòÿÿ&&&vvvÿvvvÿÜÜÜQ‡Ü½†"ÿÿ?þÞ¿ÿëÞ¿ÿRÿÿpaŠŠŠHHHÿÿÿbçìÃÿòòòèèè 555÷ööööÿöööýñ òôÿ ³îí  ³îò †Üó°...i:þêêêôôôêêê)èÃaÖÙ0,îööö4- 444ÿRÿØþüþçýããúþçý¼ø%#ÿþçý)è4- ÌÓö4- ìììáááñññÕÕÕááá^^^333ÿCCCÿ444ÿvvvÿ\›±ÅÍúñññbbbÿK ÿ ðÚÿØþüEp71K ÿÌÌÌMöÂð>çññññññ>ç‘€i› IDATM&%ÿ/³ÚÛM&%ÿM&%ÿBBBjÈɰÚÚ¾¾¾444ÿvvvÿ(†‡vvvÿÈ&'ÖÖÖÿ444ÿÌÌÌ444ÿSQ(ÿ444ÿ­¯Ø444ÿ/-ððð444ÿ #$ÿ õôéÿ ÿ #$ÿ #$ÿ õôõ õô+++444ÿ444ÿ444ÿ444ÿ³ÚÛÑüýM&%ÿ³ÚÛM&%ÿ|*(ÿ³ÚÛM&%ÿ|*(ÿ³ÚÛvvvÿ444ÿbbbÿvvvÿ...fffbbbÿšššÿvvvÿööö÷ í ÿÿöööòòòèèè>>>áááÒÒÒââââââÒÒÒ¶¶¶444ÿ...žžž ÿöõÿôôëòòò{ÿµô÷ÿöööööööööÿöööh-Öëÿžžž&&&TTTòôÿ   ÿÿÿÿÿÿÁésD4- òû$ ÿ \ñø\ñø# íìÿ  Õü#ÿ ÿ&&&&&&BBB¾¾¾ŠŠŠׯ–hhhÄÌôÿsD¼øÿöööÄÌôccc³‹rÿöööà èèè öööêêêÞÂÁÿôôõêêÿë èèèí ßý ûåÿ„Ü ÷ááá¼øsDööö4- Ã?þº¾ü(Úÿ%#ÿ?þñáûÚÿþçýʺó³Ûô®êvvvÿ666áááÕÕÕÕÕÕ¢¢¢¢¢¢+++333ÖÖÖÿ444ÿÌÌÌvvvÿ666ŒŒŒ¤eO1áááM% ÿ.. (δÜ4™­4.K ÿS*ÿ444ÿMö³á Mö>ç>ç>ç>ç<4ñññÿÿé0ìM&%ÿ³ÚÛ0ìM&%ÿ0ì³ÚÛxxx666¾Š‰ÜÜSSSBBB666Øzy(†‡°¯xxxÖÖÖÿžüýÿô¬ªiÿû‘ÿù444ÿù÷ÓÓ64. --ããù-QQÿùÂ_ÿ444ÿ444ÿ444ÿÿ'^ÿ õôõ éÿõ õ èèèÿ444ÿÕÕÕ444ÿÌÌÌÌÌ̉Sþ³ÚÛM&%ÿ³ÚÛM&%ÿÑüý/Ñüýšššÿ$$$ÜÜÜ...888$$$ÜÜÜbbbÿÿöööü ö9Cá½½ööööööÌÌÌÌÌÌ$$$ÿäääèèèÿñññ444ÿñññÿöõ ø ÿcü÷Ðøúÿöööòòòÿòòòÿÿèèèöööëÿèèè...BBBÌÐãþôþö >>>JJJbbbÿòòò 2ÿèñܼøM#ÿ·Üÿ èèè ÿ õÿÿø 555ËËË6AAËËËñ÷ö ÿóþþöööþôà ÚÚÚÌÌ̘˜˜?þ Áéö?þÁéÌÓö öööÌÓöÁ¼‡? öööèèèÿòòòèèèÿõÿÿõÿÿø ööö ÷èèòÿ>ÓËÓþü¼øsD¼ø?þÁé Ëó?ôÂñ-ñ®êM% ÿÔàøÔü, ÀÝö!óõµôè***333ÍÍÍäääðððááá333   ¢¢¢^^^ÿÌÌÌ```ŒŒŒëêñ½V1qØCCCÿ½½½þçýÚÿ.Ò,`.6–Ð÷Øþü(Û³á MöÂðMç<4ÄÌøzDïÄÌøÂð>ç 9*ÌÎÿöööM&%ÿ0ìþëþýM&%ÿì0ìÐýˆêÛÛJJJòPQæÚÚóÄÄCÈ&'8CCÖ““ÿÈ&'b‰…Vÿvv;59£UQ"Òª@59£444ÿù÷ÓÓ›ŸÎ¡ghÆç~¨gÄÌø<4ÄÌøzDï<49;5<4>çÿöööÿÿÿÿÿ444ÿCCCÿ444ÿ444ÿ444ÿM&%ÿ­› ÎãøK ÿK ÿ0ì:-{ÿñññ½½½ððð***ÜÜÄ‘¶¶¶°¯ÖÖÖbw{ªoôà;k.VÀUQ"ùçEm2<4 9*E9÷ÇÖÄÌø<4Bt_¾Œ¡ÄÌøÂì$ ü IDATðèèÖÿöööööööööÿòòòCCCÿñññCCCÿñññ½½½444ÿ½½½.îêïdmûõ%üËÿðÿb¶ÛŸ)ÿðøb ÿ…ìñÌÌÌ444ÿãã..°¯ÒÒÒ5..xxxzØÙP&&TTT-QQÿ¬ª@ÐÄ‘à;kÒvÐÐp::Ð :pàÅû ŕ˽½½½½½444ÿðð÷0`š?Û…\&j=]Îm>(ËÿkŠcmžÿ½½½èèèÉÿõ í õô)ôëð3Îû/3èÈë­¯è O'ÿà±Ù444ÿñññCCáááJJJú$$Ûÿÿ5..áááÕÇÇÓèè Þi7 —Éài7 ’317ÄËäÓþü—Éà444ÿÌÌÌ/p10_äý/Ïâáÿ 0 nö’êòÐøúž’ïòÐøúìñ...ÌÌÌbbbÿfffvvvÿìììžžžCCCÿCCCÿbbbÿðððááá444ÿÿèìÿþö ÷ÿôû÷ ÷òòò!ÿí öõ5%NÒæþùÔàúê òòò$$$ÿ>>>¶¶¶èèèÿ íìõÿÿø èèèÿöööòòòÿ èèèÿöööòòòÿ öööòòòÿööö èèèbbbÿžžž ÿ  ÷ ^^^666ÊÊÊŠŠŠCCCÿžžžÿèèèÿòôÿ%!ûÛß òòòÿ öööÿôô öööòòòÿèî ûå ÷òòòÿèèèÿíõê C½òøûöþûóþÿööö ööö ööö&&&ÚÚÚòòòÿööö õêê ø òòòÿööö öööòôÿQþ° èèèÿi:þ£Òêêê)è4- ~§!¾ë[’ö ÌÌÌCCCÿñññÌÌÌM% ÿØþü&éµô÷ÿöööúüâüßûüK ÿÚÿÛÝø¬¬¬ÿ———ááá²²²   ÍÍÍñññÌÌ̬¬¬ÿ———½½½vvvÿ666xxxôôô >>>¶¶¶èè謬¬ÿ¶¶¶žžžK ÿÁéECúÔä³ÛôM% ÿ³ÛôS*ÿ<4Bt_6þÊÇÅË9;5¾Œ¡ÄÌøÂð½½½ÿööö öööòòòCCCÿ½½½444ÿáááÌÌÌ444ÿ½½½M&%ÿ³ÚÛM&%ÿ.îê7 8%Žºîo!%Žºî„ÖØvvvÿìììžžž\††ÿØ®®(RRzPPÖÖÖTTTiÀÁÿf;0ËÐ5šÅûÄ‘ããùÓ¯¯444ÿÌÌÌ_ƒ-ÿ;mä½ëCTõ(U´ñññÌÌÌ)T„ÿ׬|ÿõ ,øÉñ7íÔýå íÔýóÝÜÿ+++ú$$ÜÜËïïããäääèèèTPÿc 1úÏéú÷ÑÓöÛÝøM&%ÿþæä0ÿè7 7’ïò7 7’ð Ñüý³ÚÛvvvÿ$$$fffvvvÿŠŠŠšššÿfffCCCÿáááááááááñññÌÌÌ  ÷ÿô òôö!ÿìýþø ã÷Ô ÿòòòäääÿ+++½½½ööö%Ùúûø öööÿòòò öööÿòòòèèèÿ öööòòòÿÿ èèèöööÿòôÿþö&&'ÚÚÚÍÍ;¾¾...CCCÿiiiTTTèèèÿ ñ ÿööö÷öíöööòòò ñàö ÿèèèèèèöööûöþÿòòòööö ööööööÚÚÚòòòÿöööööö÷þÿòòòèèèÿòö  ÷ öòýñèèèèèè³â4ÿðôôôÁöÁéøÌ,ÕÁé ððð444ÿÌÌÌ&éµô÷%#ÿ(4-þ•²õßûüµô÷M ÿ\Rÿ®êÊÊÊ“““mmmÕÕÕ+++bbbÿžžžÊÊÊŠŠŠñŠ[ÿEf7R¹èÒÒÒèèèÕ§~71žöõº±Ú!!ÿßûüþçýÂðE9¾Œ¡ 9Ë9;5ÇÅË9=k9;¾Œ¡ÄÌø<4†¼ñññ öööööö òòò½½½ÌÌÌ444ÿñññ444ÿ½½½M&%ÿ³ÚÛ³ÚÛ&%ÿ7ðõŽºîÒÒÒàÒÓ5ÛÿÿËïï.../55TPÿ Þi7 i7 -1<5i7 M&%ÿþæäÔßß[%$ÑüýÐùþ×þÿ,!!ÔßßÐøú0ê)³ÚÛÿÿÿááááááÌÌÌÿèìÿþö ÿëêòôÿ%ÜòòòÿòÿAKµÙ¼K'DÒæþñÿ¿òòò444ÿ...ÒÒÒÌÌÌbbbÿ¶¶¶èèèÿþìë ñýþí ÿôô òòòÿ èèèÿèèèÿòòòÿöööòòòÿòòòÿòòò444ÿÚÚÚ öööòòòvvvÿ˜˜˜òòòbbbÿJJJTTTÿöööòôÿ!÷í èèèÿöõ÷þÿ òòòÿòôÿ þö òö  ý,ùÔàúêþóÿööö÷ÿô  ?þ¸èö ûöþ èèèÿ öööòòòÿööö÷öóþþæüýø òòòÿòö  ÷òòòÿòôÿ%ýñëòòòÿöööFBº¾üòòò444ÿÌÌÌ444ÿÌÌÌM% ÿ4- ÌÓö³Ûô%#ÿ&éµô÷M% ÿ³ÛôCCCÿ¢¢¢èèèÿ333ìììžžž444ÿxxxTTT¬¬¬ÿTTTÿ ð’3&–ÏÞ³Ûôÿú(³ÛôCCCÿ>ç~¨g¾Œ¡Bt_ÇÅË»“Î<4Bt_‚X™³á ÌÌÌÿöööòòò444ÿÌÌÌÿ+++ñññäää ÕÕÕèèèM&%ÿ0ì6˜Ýòh#ÊúúÎãø2Îãø³ÚÛÿöööžžž¶¶¶¶¶¶öööNxxP&&lllèèè-QQÿç~¨g¾Œ¡ÄÌøÂð>ç~¨gÇÅË»“ÎÂð½½½ÿööö öööòòò444ÿÌÌÌ444ÿÌÌÌ= ÿÃöøK ÿµô÷ÿJJJ¶¶¶ööö èèè-QQÿããÌÌÌ444ÿ5ŒÄ‘ããÌÌÌ444ÿùçÂð>çÂðññññññ½½½ÿèèè-QQÿããÌÌÌ444ÿÌÌÌ-QQÿÓ¯¯ÿèèèÿèèèÿèèèÿèèè-QQÿÓ¯¯-QQÿÓ¯¯M&%ÿ³ÚÛÿèèèÿèèèÿCCëÇÇööö èèèÿèèèÿöööòòòOÿãñ±ÿJJJ¶¶¶èèèÿööö èèèÿööö èèèÿ ööö èè謬¬ÿTTTÿèèèÿèèèÿ èèèÿööö èèèÿööö èèèÿööö ööö èèèÿ èèèÿ èèèÿsDÓþüÑÓöéë ööö <8úùÕúÁé èèèÿ5 ôËó ööö"úøñýþ÷èèèÿööö èèèÿööösEp71'޽ööösEp71v¥ÿi;p71'޽ÙrCÉÏ—Åîèèè444ÿÌÌÌCCCÿ½½½444ÿMöÂðñññÌÌÌ#¨f0 IDAT444ÿÌÌÌ€ÿ444ÿÌÌÌ-QQÿÓ¯¯ÿÿM&%ÿM&%ÿ444ÿ2 ÿ2 ÿ444ÿ444ÿCCCÿvvvÿbbbÿCCCÿK ÿ444ÿ6ˆ¿ÿM&%ÿ·VÿM&%ÿM&%ÿ²ÿSQ(ÿSQ(ÿ})ÿ·VÿSQ(ÿSQ(ÿS*ÿS*ÿ ÿ ÿ!ÿ!ÿ!ÿ444ÿ444ÿÿÿ444ÿÿèèèÿèèèÿèèèM&%ÿ³ÚÛœÿø444ÿÌÌÌ)T„ÿ׬|*‚ÿò¢2åÿÿëÎ÷444ÿÌÌÌCCCÿ333ìììžžžS*ÿ­ÖM% ÿþçýÛK ÿµô÷444ÿT‹óÌÅ444ÿÌÌÌ)T„ÿ׬|M&%ÿj0ööüÙü³ÚÛM&%ÿ.îê7÷ñãúÕý›ï›Âý})ÿ· #®®®ÿ;9ÈðäèÈñ­¯ØSQ(ÿ.­ÖS*ÿ—ÅîM&%ÿ³ÚÛŒÿïýý7 Ê ­Ö·V.ÿV¬Ôó\ùÔ ùÐÿóþþ ÿ, þçýàøÿßûüÌÌÌÿCCCÿñññÌÌÌ444ÿÌÌÌ0P'ÿ.4.âþ×ðÎûèÈñÿFl=¢|«444ÿððð444ÿÌÌÌ444ÿÌÌÌÿèèèÿèèèÿèèèÿèèèM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛÿ&&&ÌÌÌ444ÿÌÌÌ444ÿ½Æï÷Î*‚ÿ)*ôýÍøá¸ò +ëåãúåãúëÎ÷M&%ÿ³ÚÛ444ÿ...ÍÍͽ½½M% ÿ4.2ÜíMÑé³/ÿÎ$­ÖK ÿþçýµô÷M% ÿþçýµô÷6ˆ¿ÿóÌÅÛÒÌüÚ°)T„ÿ 4;ÊxA)T„ÿ 4;Ξ‘üÚ°³/ÿÿîÿ› .îê7 ÿîÿNãêÿòòòÿèèèÿ5 ³ÚÛ})ÿ›ï5 öñññ...%%%yyyÿ8#ÅÇð5 Ëòó5 +­¯Ø&Pÿü2Mü£³ÚÛl ÿ 8îþþ\ñønœîðd)­Öÿõêêó0K×Öùû*Öùû*Öùûí ÷ö*ÔàøßûüÿñññÌÌÌ444ÿüó.4.6;5ÊÅ˺”à ôôôÌÌÌÿW¥AïÇüÒÌÒä ÌÌÌ0P'ÿаÙÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèé%ÿdŸ53aËÍ cðõ³ÚÛê5ÿËâM&%ÿ³ÚÛ444ÿÚÚÚ555ñññÌÌÌCCCÿ½½½444ÿñññ½ÆïC:½½½*‚ÿÖ~)T„ÿ×Öþ)*ûРù--øá¸åãúбñM&%ÿ³ÚÛM&%ÿ³ÚÛ!ÿßûü444ÿ...áááÞÂÁßûü³/ÿÎ$2Üíšöõ³Ûô!ÿ*Öùû*µô÷K ÿþçýÖùûßûü444ÿõ PÛÒÌ%.4Ä<úcÛÒÌ%.4 4;ÊxAM&%ÿf òÿîÿÉ÷ù8ÿîÿÉ÷ù8š÷³ÚÛÿAãñ±äÇj3 IDATÿöööòòòÿeù* 1÷Ïû­Öÿööö555ññññññ½½½S*ÿšîâÖþËòó5 ³ÚÛSQ(ÿΕãÏ“òÈ5 ³ÚÛ{ÿ">AÖÀ½ðœîðèèèÿõêêìýþ ÿôô ÿôô, ÀÝöóþþ444ÿðððÌÌÌ444ÿÌÌÌ444ÿüós¨gñÇüÊÅ˺”ÃÌÌÌ444ÿäää K™5%1ÊÅËÒÌÒä ÌÌÌ444ÿÌÌÌ_ƒ-ÿ¡}Óÿ íìÿÿÿöööÿÿ ÿÿèèè444ÿê60ÿd 12 ’ôø³ÚÛé%ÿì[XÿËâM&%ÿ³ÚÛCCCÿÿ¾Uó=þûÕÕÕCCCÿÕÕÕÿññññññ*‚ÿ$ú¢*‚ÿ×Öþ)*ûРÜ^ÓÓåãú444ÿM&%ÿ/ßûüK ÿCCCÿíÑÐ...¿£¢ááá*Z ËVTÿMÑéÌÒâÎ$³Ûô*ßûüµô÷ßûüÖùûM% ÿK ÿþçýÖùûõ PÛÒÌüÚ°üÚ°0ä 4;<úcÛÒÌ0äóÌÅ444ÿf òÿîÿ› › 8G’…ìñš÷ÿîÿ³ÚÛ AÿA,ÿÿÿÿèó)AÿÐý—Åîó¥âŠ„/ÿŠ„/ÿM&%ÿèèèèèè åäääDDDCCCÿ—Åî##–Ëòó O'ÿ±Õ(ãÏ“ è¾5 ³ÚÛ7 9 MËüÕ‚÷üœîðèèèèèèèèèèèè ìýþí ìýþ  , Ôàø ääääääððð444ÿCCCÿ444ÿððð444ÿüódocÛþÏÒÌÒ444ÿÌÌÌÁ“Î;<<N(Wdoc*P!äää444ÿððð444ÿCCCÿ0P'ÿÑÍúÿÿÿèèèÿöööööö ööööööôôô ÿ444ÿÊП53]%(n Ÿ53é%ÿê60ÿ6;aËÍM&%ÿ³ÚÛM&%ÿËËËYƒâÃöööÇÔÁìBBmm8í äÇÔÁÇÔÁÖãнÆï&4ôÌÌÌÖ~Ü^)*×Öþ)*×Öþ0`$ú¢ôÕfnåãúM&%ÿ///M&%ÿÖùûÊ¿¿éª§Z ýáàìýþÖùûÐøú¹· íìM% ÿËó ÌÒâµô÷þçýÖùûµô÷ßûüüÚ°444ÿ6ˆ¿ÿõ PÊxAüÚ°ÌÌÌ׬|óÌÅÌÌÌÿîÿ› ³ÚÛ³ÚÛÿîÿ¸\ç› f òÿîÿNãêÿõ¿ãñ±·í°òòòÑ =þûÿòý3ãñ±òý3ÿèèèËòó›ïÌÓûâö÷Ïû4-½‡2ÿÇ¿9ÿS*ÿèèèÅÇð;9ÿÖèèèfÈðä«…Ø;9;9ÿSQ(ÿä×)IÕ Ëòó²ÿ79=Í þ—Åî èèèèèè   íì3ôñ, þçýõêêèèèèèèäääôôôñññðððñññCCCÿÌÌÌüó?m2ñÇüÑÅÓèÈñ ÌÌÌôÔýÁ“ÎÊÅËÅÄÄí"6;5+++äääÌÌÌ)T„ÿÍýþÿiÀÁÿ)T„ÿÅÁ‹ÿiÀÁÿiÀÁÿ)T„ÿìZ2ÿÖÖÖÿšššÿ“““ÖÖÖÿCCCÿCCCÿÖÖÖÿÖÖÖÿCCCÿаÙ¼ˆXÿ0P'ÿаÙ_ƒ-ÿÿ ÿ5 ô5 ôÿ íì 444ÿ444ÿÿX¤øöööööööööööööööôôô444ÿCCCÿì[Xÿ12øÉý12%(þÛØ6;%(þÛØ/é%ÿM&%ÿ/M&%ÿ•¾[ÿ0P'ÿ0P'ÿ_ƒ-ÿ0P'ÿ555ø7:555òû$÷ Öˆ}Öˆ}Õ½ÛÚÇÝ&9#ûöþÜ*‚ÿN–?1)*1N–?Á–f04 бñ444ÿ444ÿ444ÿ444ÿÿÿRRRÿ‡‡‡ÿ444ÿÿ/ÿêç6óîmûõ6óî.îê!ÿßûü!ÿbbbÿìýþÂöùÐøúìýþìýþÖùûÐøúZ ÿËó èèè³Ûô!ÿßûüÖùûßûüÖùûßûü444ÿ׬|T‹þ¬u׬|׬| à°› ³ÚÛK ÿ™ïóNãêe÷ñM&%ÿÿîÿNãêòòòÿ%éñþGòòòõ¿ãñ±õ¿òòòèèèèèèËòóËòóÒþþ—Åî[‘æöÈù<4Ç¿9ÿ»½æ.ÛÛÛ888—Åîý× 8ÝÿÿX¤SQ(ÿÿÅÇðãÿÔ+èèèÉøùþÛØaÂêŸ>èèèÿ ð íì3ôñ`N&4.÷ ÿèèèèèèôôôððððððñññ444ÿ444ÿ%19ðÎûÌÌÌ444ÿðððèÈñÒÌÒÊÅËèÞÊÅËQ|GÌÌÌ)T„ÿ 4;i‹Á à°;?u\Ê\ÊiÀÁÿiÀÁÿ׬|ÖÖÖÿê|¤ÈÈÈ***沂“““CCCÿDDDŒŒŒ***“““_ƒ-ÿ0P'ÿ0P'ÿŒ81_ƒ-ÿÿ3ôñÍ 3ôñþçýþçýé(+ÌÌÌ444ÿðððôôôööö èèè-QQÿããùòòáááÌÌÌM&%ÿ/p10 h5øÉýüÏÎþÛØcðõ³ÚÛê60ÿcðõ³ÚÛ0P'ÿ¼ 1s(Õ¡}Ó•¾[ÿÊÅÒ§ûp10s(Õ6;.ì”»Þ1¡}Ó444ÿÌÌÌ444ÿ½ÆïÜ÷ÿô  555ñññÌÌÌ*‚ÿêÀh’Ú­[À%l=.9nñ&éIÃÅóÊÆôÐÌõбñÿòòòÿ&&&BBB«Žßûüÿèèèÿ&&&BBBŠŠŠCCCÿ½½½vvvÿ$$$fff444ÿðððQRfu?ŒWŒÓ¯¯444ÿÌÌÌÿ:::555...âââäääèèè{ÿ7 ;= ýÛý‘ßñ…ìñ!ÿ*à õêêìýþóþþ!ÿìýþ*Öùûßûü!ÿßûü)T„ÿ׬|444ÿÌÌÌM&%ÿ.îê…ìñM&%ÿ³ÚÛÿòòòÿòòòK1–õ IDATÿööösE—Å!öÈùÄÌø­Öÿ...ááá>ç­Öÿõ #-/3¡}ÓSQ(ÿÅÇðõ ,aožf³ÚÛÿŸ>ûÇè7 §!STèèèS*ÿÌÒâØþü(þçýþçýÂöùóþþÿðððÌÌÌ444ÿäää8doc9ñÇüœ‘èÈñðððÌÌÌ444ÿðððôôô8docÊÅË"ÐþÞ0º”ÃèèèÅÁ‹ÿqÇ438À”ÃûРEœ—@?6ˆ¿ÿÊxA¼ˆXÿÞBfff¼ˆXÿN~   àw{ªCCCÿµð]XôаÙÿh<;<4£ûÕ¡}Ó_ƒ-ÿÑÍúаÙÿèèè!ÿ, þçýÖùû*Öùû*Ôàøßûü444ÿÌÌÌÿ êêê öööòòò-QQÿòòê5áááêòòêòòñññÌÌÌM&%ÿ VZ78ùÈüøÉýúª¦’ôøtbb]š›]6;.ÊÅÒ6;.ÊÅÒ"Ïé¯þ¼ 1ÏÐãYÑÍúаÙCCCÿÚÌ ãúãÜ÷ÿô  555½Æï÷Î*‚ÿêÀh’ÚÒÇý.9nñ&éIÃÅó=; ·Œêš Yíƒ×ï!ÿ/0íÑÐ*Í èèèÿööö&&&ÚÚÚ èèèCCCÿWWWÈÈȾ¾¾BBBÍÍͽ½½M&%ÿ/„ÖØ³/+ÿMÑÕ³/+ÿ9,-ÏÐ„ÖØ444ÿQRòÌË45òÌËÓ¯¯ÿ:::555­­­ÒÒÒääääääèèèÿcü÷o!ÿðÿÉøù™ïóµô÷!ÿßûü!ÿßûü!ÿßûü!ÿìýþ*Öùûßûü)T„ÿ à°ÌÌÌ444ÿÌÌÌ{ÿ…ìñÿööö¯y$ 89AÇ444ÿ...%%%‘‘‘èèèÿi;—Åîi;Þ0ÑÍúаÙÿì8 ýÔ .-Ó¯¯ÿööömo"!%(¥¨S*ÿÌÒâØþü\0"xo5Tc­Ôàø*Öùûí èèèÿ ððð½½½444ÿðððäääFl=6;5ÊÅËÒÌÒèÈñ ÌÌÌ444ÿððððððA6;5ÊÅË"ÐþÞ0º”Ãèèè444ÿ‘W¤ÿ6À”à 4;38ÍÈþóÌÅ׬|CCCÿ¶ÝwŒŒŒðððj6N~   ¾¾¾ÌÌÌ0P'ÿŒ81tÈÏ/3ÑÍúèÈñ¤p@tÈÏаÙ$$$ÿ'èåÖùû ýáà*Âöù*Í èèèÿèèèÿööö èèè-QQÿòòááá>>>Ù#$¾½øBC;ñð®®®ùÓ¯¯é%ÿ%(12oùÈüøÉýúª¦ÊÐ0P'ÿen4ÊÅÒ"ÏéÞ16;.kB¥444ÿÚÌ &4ô½ÆïC:ËËËòû$ÜA&4ô½½½K)QÿÙûÓÆÆÆ¨çf8ò·éI·Œêó¥ô:- mÎ Yíƒ×ïÿ&&&ØÕà öööòòòÿööö ööö èèèÿ‚‚‚ŠŠŠáááÌÌÌ|*(ÿ79,-ÏÐÿêç7Èåä…ìñ444ÿùt©tŒWŒ÷ÓÓ --ëÇÇèèèCCCÿâââÚÚÚ&&&ÚÚÚ&&&äääÌÌÌÿèèèÿ3ôñ0Ðøúµô÷ ÿóþþ!ÿßûü!ÿßûü ÿßûü!ÿìýþßûü444ÿõ P à°ÌÌÌ{ÿ…ìñÿ¥o 8öÇé 4-­ÖÿJJJJJJ———>ç­Öÿi;ŒÐúR` FsÜ]í­Öÿi;×XüÎK/4ÞüÍ&×­¯ØÿŸ>ûÇè7Í þIªÒM% ÿ4.¤ÐÞ&é6G!xo5Tc­Ôàøí ÿôôóþþ444ÿððð½½½444ÿÌÌÌ444ÿðððäää8.4."ÐþÞ0"Ðþ2ÝNϬK)Qÿµ×¯444ÿðððððð ,P,Þ0 Ó0nÓ’ü-ÔûÍÆÆÆèè輈Xÿzg9ÌqÇ438ÍÈþóÌÅ׬|¼ˆXÿN~íííÄÄÄÛÛÛZ&ö¦Ú žžž¼ˆXÿtÈÏôÔýôôô¤p@tÈÏаÙÿ íìßûüK ÿµô÷!ÿ÷5 ôËó èèèÿèèèÿèèèÿööö ööö ööö èèè-QQÿããQR;ñðÅ;ñðÅ;ñðÅ韞 --Ó¯¯é%ÿcðõŸ538ÉÌÌhf7øÉýüÏÎ12üÏÎþÛØcðõ³ÚÛ_ƒ-ÿÅ¡÷qš7kB¥•¾[ÿfÉqš7›’ÌаÙCCCÿæÍïÇöööòòòCCCÿ½ÆïC:½Æï÷ÎK)QÿÙûÓ'-¡iª_—VŸÁ™‘BhXÌá·Œêp=½•ìÆÓö:- Iªåÿ3ôñà öööòòòÿòòòÿèèèÿòòòÿöööòòòCCCÿ¶¶¶öööTTT¶¶¶+++ñññ½½½M&%ÿ³ÚÛ³/+ÿÈåä©Xÿêç èèè-QQÿëÇÇ#mnÝ“’99ëÇÇ99ëÇÇèèèbbbÿ¶¶¶ÚÚÚ&&&äääèèè444ÿÌÌÌK ÿÖùû÷3ôñÍ èèèÿõêê ööö÷ö÷õêê  íì÷ööö÷ößûü²ÿNãêS*ÿFl8;+¾Îÿð[’öi;­ÖCCCÿWWWç¹—ÅîèèèK ÿÃýQ`'ÂÌá>4¡}ÓS*ÿ­ÖS*ÿ×XK.<ë0KËk­Öÿcü÷7 E¨®ò`YÎ1IªÒÿ5 ô4.ʹß4.—Åîõêê õêêóþþ444ÿðððÕÕÕèèè444ÿÌÌÌ444ÿ*P!Ž×”ùûlÆÖüróÐŽ 0™øýÍïÇèèè444ÿÌÌÌ444ÿððð:`1 Ó0nÓ”ùûl’ü-4ÚÏfçÄèèè)T„ÿ 4;îœe0` 4;óÌÅ׬|šššÿ<<<沂=:Íþýýg×××ÈÈÈžžž0P'ÿÝÓý#-Œ81ÅËÒ£Ñúéÿ¯e4tÈÏаÙ$$$ÿôôô3ôñÖùûí íì÷ööö÷ö*Áé èèèÿööö öööôôôööö èèè444ÿððð --Ó¯¯CCCÿžžžbbbÿÙ#$Å{zvvvÿìììžžžM&%ÿ³ÚÛé%ÿVZ7ñb6;12]š›³ÚÛM&%ÿ³ÚÛÿ8en4ÊÅÒ¹•ë}¦CkB¥_ƒ-ÿ6;.›’ÌаÙCCCÿÚÌ ãúãÜòòò444ÿéÛ%åÚÚÚ&&&ÌÌÌK)Qÿd9§=0_—VÙûÓÈn×ý”4;þõÖ Ù7'ÉüøÈøwÙÿèèèÿöööòòòÿèèèÿèèèÿèèèÿèèèCCCÿÕÕÕèèèÿ+++½½½CCCÿÕÕÕ+++½½½ÿcü÷“úÿm dœîðèèè-QQÿëÇÇ99Ó¯¯ÿèèèCCCÿÕÕÕèèèM&%ÿþæäž/óû íì*Í 3ôñÍ èèè ÿ ÷öí ÷öí ÷ö÷èèèÿèèèÿèèèvxY IDATê5ÿ%Ð-ÿð 9QYßi;—Åîèèè·Vÿ¿ [$$$ç¹—ÅîèèèíZ!ÿ”ù ÐÜQ`'FsºðÑÍúQ­ÖS*ÿ×X %¥<ÑSÈ2—Åîi;­Ö·V.ÿûÇè7ÿïí/óûèèèÿi;ÌÒâþçýÚÿ\0"—Åîõêê èèèÿèèèCCCÿñññðððäääÌÌÌ444ÿäääFl="Ðþl,½À39gfçÄèèèM&%ÿþ,¡2’ü-nÓ"³¶¤#FfçÄ39µ×¯)T„ÿ à°T‹îœe0`“4ÔzgÊxAÖÖÖÿÄÄÄÈÈÈÂÂÂvvv<<<ŒŒŒááá½½½ #$ÿ ,ôÔýéÿ#-ÝÓý#-аÙ444ÿðððôôô3ôñÍ ööö=þûÃ?þËó èèèÿööö ööö ööö èèè444ÿùÓ¯¯-QQÿ45Å{z-QQÿ45Ý“’ÌÌÌM&%ÿ³ÚÛê60ÿVZüÏÎ12úª¦VZ]š›Ÿ5312üÏÎþÛØcðõ³ÚÛÿööö‡°M›’Ì޾燰MyP³‡°MƒZ½èèè444ÿ½ÆïÜ èèèÿèñÜ 39ÙûÓ'-0+31 sœÇY0XÌá'ÉüøÈø‹ ê}˜øÈøwÙÿèèèÿ èèèÿ5 Ëòócü÷…ìñ-QQÿÓ¯¯RRRÿÆÆÆèèèM&%ÿ/œîð3ôñÍ 3ôñµô÷K ÿµô÷ÿ íìí èèè!ÿ÷ íì÷èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèê5ÿ.ãú¥n 0Ôÿ+¾÷i;­Ö·Vÿ¿ [$$$llli;­Öò‰'ÿwÙ0P'ÿ/3"Ðý­ÖS*ÿ­ÖíZ!ÿÐa %¥<Ñ7d+Áèé i;—ÅîèèèÿŸ>2Ïï6;ýÊÅ/óûŸ>IªÒM% ÿËó ð\0"—ÅîèèèÿõêêóþþCCCÿñññððððððÕÕÕèèè444ÿÌÌÌK)Qÿg™øýgfçÄ39µ×¯K)QÿÍïÇš<™øýg™øýýÔe /NϬÿ>>žžž #$ÿ ,ôÔýéÿ ,ôÔý ,аÙ444ÿððð'èåÙôôô3ôñÙÌÌÌÿòòòÿöööòòòÿèèèÿ9945Ý“’öööCC45Ý“’èèèé%ÿ%(12úª¦ÿïíÛãM&%ÿ VZúª¦cðõ³ÚÛ•¾[ÿƒZ½}¦C›’ÌèÈñèèèÿööö èèèK)QÿÙûÓ'-d9§œÇY0ÐýÿžýÞÎ0ìH£ûÈø½•ìIªåÿèèèCCCÿÕÕÕèèèÿèèèK ÿµô÷K ÿµô÷ÿ íì÷èèèÿèèèÿèèèÿèèèÿèèèÿÕB +¾÷èèèò‰'ÿwÙšššÿ~~~èèèS*ÿʹßÙ]/­Ö³/ÿ[ß÷Aý* 3床sE—Åîèèèò‰'ÿÅÍô2ÏÿïíÎ1þaÂêŸ>IªÒÿi;—Åîèèè444ÿäääÌÌÌCCCÿ½½½²1Tÿ‚àääääää39µ×¯K)QÿÍïÇ '-Ã彤#FfçÄ39ÍïÇèèèÿp§âYööö(z±âYp§âYèèèÿöööÈÈÈŒŒŒ¬¬¬TTT¬¬¬ÈÈÈŒŒŒ¶¶¶èèèÿöööÿëê"BèÈñèèè444ÿðððÌÌÌÿèèè444ÿÌÌÌÿèèèM&%ÿ³ÚÛé%ÿd³ÚÛÿèèèK)Qÿµ×¯K)Qÿµ×¯{,Rÿ…Ô®ÿèèèÿèèèÿèèèÿèèèÿèèèÿÒËâS*ÿ6ñIªåò‰'ÿûÑú¦ßS*ÿ­ÖÿÕB /&ñ5 Ëòói;—Åîèèè·VÿaÂýŸ>W¸ó èèèÿèèèM% ÿËó èèèÿ+++ÕÕÕèèè444ÿÌÌÌK)QÿÍïÇ39ÍïÇèèèÿèèèK)QÿÍïÇ '-ÍïÇ39µ×¯ÿèèèÿèèèÿööö èèèÿööö èèè444ÿ444ÿ444ÿ444ÿ444ÿÿÿÿÿÿÿÿÿÿÿÿÿi]â IDATò‰'ÿ·Vÿ€ÿ³/ÿíZ!ÿò‰'ÿÿÿS*ÿÿÿÿ·Vÿò‰'ÿÿÿÿ444ÿCCCÿ444ÿK)QÿK)QÿK)QÿÿK)Qÿÿÿÿÿÿÿÿÿ2 ÿÿÿÿÿÿÿ ÿCCCÿ444ÿ ÿ ÿCCCÿ444ÿÆÀ\ÿ‘ÁÂÿ„ŠÀÿ„ŠÀÿCCCÿÿ¼ˆXÿvvvÿ»‰ˆÿÿCCCÿ€TSÿCCCÿ€TSÿùÂ_ÿCCCÿ€TSÿCCCÿ444ÿM&%ÿM&%ÿM&%ÿ½‡2ÿ444ÿ444ÿ444ÿ444ÿ$$$ÿ$$$ÿšššÿ‘ÁÂÿÏûÆÿbbbÿé%ÿÿù7ÿ)T„ÿ)T„ÿCCCÿCCCÿCCCÿvvvÿbbbÿ ÿëÎ÷0P'ÿK ÿM% ÿÿÿÿ ööööööÿ ÿ444ÿ>6AÂÊ¿áþÕCCCÿ"÷ ÇÔÁûQQCCCÿCCCÿ444ÿRRRÿ-QQÿ„ŠÀÿ:@¤o?>{s 7AG}„ŠÀÿCCCÿèèèCCCÿCCCÿhœÌFâÅËË^^^444ÿ½½½Ãïð¼ˆXÿ444ÿCCCÿ=<4L¯ÿ€TSÿyECCCÿùÂ_ÿ=ÌÌÌCCCÿÖÖÖÿCCCÿ‡‡‡ÿÖÖÖÿ¬¬¬ÿ!Oÿ444ÿ*‚ÿ6ˆ¿ÿ ÿ2 ÿ0P'ÿM&%ÿM&%ÿM&%ÿ/³ÚÛŸó³/ÿ{ÿ444ÿ444ÿ444ÿ444ÿÌÌÌËÅ444ÿ444ÿ444ÿÌÌÌ+1`šššÇÇýÂÆüm™dÏûÆÿ‘ÁÂÿ444ÿ444ÿ444ÿÿÿÿÛã{ÿbbbÿšššÿ)T„ÿ*[M×Ådö^ÿWWW444ÿCCCÿWWW333$$$*‚ÿÖÖÖÿbbbÿ ÿ¼ˆXÿ_ƒ-ÿ0P'ÿK ÿK ÿM% ÿÿÿÿÿÿÿÿÿÿ$$$ÿÿ444ÿ444ÿ444ÿCCCÿ ÿ2 ÿCCCÿCCCÿÿ2 ÿ0P'ÿ/……ÿCCCÿRRRÿ-QQÿ„ŠÀÿÅÁ‹ÿ‘ÁÂÿ„ŠÀÿRRRÿCCCÿé%ÿ€TSÿÿCCCÿCCCÿCCCÿ¼ˆXÿ¼ˆXÿ€TSÿ444ÿ444ÿ€TSÿÿÿÿ¼ˆXÿùÂ_ÿÿÿÿ$$$ÿùÂ_ÿ¼ˆXÿÿÿÿCCCÿ$$$ÿÖÖÖÿ‡‡‡ÿ¬¬¬ÿ=”ÿ444ÿ444ÿ444ÿ444ÿ*‚ÿÍýþÿ6ˆ¿ÿÅÁ‹ÿ¼ˆXÿÅÁ‹ÿ6ˆ¿ÿ ÿ ÿ$$$ÿ2 ÿ0P'ÿ_ƒ-ÿ2 ÿ%#ÿM&%ÿM&%ÿM&%ÿM&%ÿ²ÿ²ÿM&%ÿM&%ÿ³/ÿ³/ÿ³/ÿM&%ÿM&%ÿ444ÿÿù7ÿÿýÇÿÿù7ÿSQ(ÿ444ÿSQ(ÿÿù7ÿò‰'ÿSQ(ÿ444ÿ444ÿ444ÿ|*(ÿS*ÿ444ÿšššÿ”¿Šÿ‘ÁÂÿXˆ¿ÿ‘ÁÂÿCCCÿ444ÿM&%ÿÿÿé%ÿé%ÿÿY ÿê60ÿì[Xÿ_ƒ-ÿšššÿ_ƒ-ÿ_ƒ-ÿ$$$ÿ$$$ÿ+ƒÿ3ƒTÿ444ÿ444ÿ444ÿ444ÿ444ÿÿ!'Pÿÿ!'PÿCCCÿ!'Pÿ$$$ÿšššÿÿÿRÿ*‚ÿ6ˆ¿ÿÖ~6ˆ¿ÿŒŒŒÖÖÖÿÖÖÖÿtttC! ÿhœÌ]+_ƒ-ÿñÿçµô÷µô÷³ÛôRÿM% ÿÿööö=þû öööÿòòòêêê ÌÌÌñññ>6AùÜËËËËËË.:Õ½ÛÛ’í ä444ÿ®®®%ÎÈ’-QQÿ\††ÿšššÿhÆ5ÿšKq28nRRRÿCCCÿ333—/6ö"#^^^xFEñññºî<4BBBÿÌÌÌ´àá®zJöööööö\ÀÃÆùë´QrFEöööêêêV¹=:CCCÿèèè5 öööÿ‡‡‡ÿìZ2ÿ¬¬¬ÿ±±±ÖÖÖÿyyy———¬¬¬ÿCCCÿÃlå `ç]à)ÿúÁ/ÿ¾Uóô444ÿ444ÿÌÌÌ444ÿ6^=i‹Ád“ùDx¨C!C!æóàòÑÍú_ƒ-ÿÛÝøK ÿ%#ÿK ×ÇÉú IDATÿCCCÿM% ÿ/e÷ñ³ÚÛe÷ñ j™ïó.îê²ÿ.îê:+ M&%ÿ|*(ÿ¾UóîaêüpóðŸ8ÿôáã 444ÿ%+íB« ¬¨¾Uó444ÿÌÌ̸ ÎZHöô®“éÄÉ5 ÙØÜ¬u ÙØN~ÿÿ³ÚÛ?ÿé%ÿÔ5é%ÿ¿ ÚéèþÛØ;…†ÿ¡}Ófff=”ÿiÀÁÿ_ƒ-ÿ v ¼¾ßÛÕÎ ›é%ÿÍ}¬3ƒTÿQQÿ444ÿ O O 444ÿÌÌÌ444ÿ444ÿÌÌÌCCCÿíç¾CCCÿìüÔ!'PÿÞä K)Qÿíç¾ý,fffÿÿeùöööÿ½‡2ÿ®ê²1Tÿ*‚ÿÍýþÿ6^=ÅÁ‹ÿ9Ì6ˆ¿ÿÊxA6ˆ¿ÿbbbÿìZ2ÿÖÖÖÿžžž沂#ì‰ÖÖÖÿ***ÖÖÖÿ0P'ÿÈ ä²qTæóàhœÌ"Ðý_ƒ-ÿß±ò0P'ÿ®êþçýRÿà öööÿÿ êêêæéÛæAòû$òö >6A÷ ÚÇÝCCCÿ®®®ý2dpqj:Öãã:@¤1: 728n½½½ŠŠŠ€¬­¢¢¢ÍÍ͈º»yE‡UTFâx¬Ü‡»ë ÞÝ^^^CCCÿ€TSÿ‡»ë&&&ë´QöööR†¶V¹˜ÄÅrFEöööV¹=CCCÿÿÿ³ÚÛsE?ÿ‡‡‡ÿ%%%×i‘vvvÿñññ沂ÖÖÖÿ½½½½½½vvvÿCCCÿÃlåÄoå!OÿúÁ/ÿó™ò p¬¬Ÿððð444ÿËÅ444ÿÊxAóÌÅÊ¢ÃÚ9*‚ÿ÷ÇÍ9Ì6ˆ¿ÿ¦ö0ÿÁýáob3²qTæóàôÔýåââÑÍú0P'ÿëÎ÷2 ÿšššÿµô÷ÛÝøµô÷½½½þçýK ÿ%#ÿK ÿbbbÿ³/ÿA] M&%ÿ½‡2ÿM&%ÿM&%ÿ¾ÝÒÏ67 ¹âöÏð:+ f ò/Ñüý³ÚÛ pŸ5;ýûÑú¬¨‰Rî444ÿ444ÿðððô5;ý t ‰Rî³/ÿÅŽ+... 3;K•I”? Ú£-%Ÿššš£srfff444ÿK ÿo=þûÿÿ³ÚÛsEÿê,æ¦ßÊ 39ó7ÿïí¯±ªÿÿÿÃlåÔÔZ;…†ÿ1WðÅ ë<çÿðÿÍ}¬2-QQÿS„ÿvvvÿvvvÿCCCÿéft ft ;‰%CCCÿ444ÿ444ÿ{PVŒCCCÿ444ÿì[Xÿ³/+ÿCCCÿCCCÿWWW ËËË"󵯆øòBýÔCCCÿ‘åýÿM&%ÿ³/ÿ³/ÿ³/ÿ³/ÿRÿ½‡2ÿÄËäNϬ²1TÿñŠ[ÿ*‚ÿ6^=i‹Ád“ù*‚ÿóÌÅbbbÿtttê|¤ÖÖÖDx¨ÃÆù#ì‰ÖÖÖÿbbbÿ沂2 ÿ£¨ ‘žÍC!æóà;5.ÑÍú2 ÿñÿçšššÿšššÿ¤Ñòÿèèè  ööö 444ÿÚÌ §`Öãúãøò&4ôòö ááá555÷ ÇÔÁÿù7ÿ A^„Uÿ\††ÿ1ÿÏo?>Œ’öç¹SSS444ÿo?>ÎÈ’‘ÁÂÿèèè½½½ÕÕÕx¬Ü=:ºî‡UTñññÃïðŠŠŠ€TSÿ=Ãïð=ñññƒ"çL¯öööööö˜ÄÅrFEööö¤ÐÑÿÿeùööö­Ö4-sEÿyyyTTT===½‘PJæxxxñññËÿ/#쉇‡‡ÿ‡‡‡ÿܬ‚ÿÿù7ÿ1½ÿÍÍÍzDïêêêÿCCCÿå&E 444ÿ8/5;ýûÄhËÉ“ððð444ÿ444ÿ444ÿ5;ýËÅ׬|¼^ÖDx¨÷ÇÍ9Ì6ˆ¿ÿ2 ÿŠZ÷"-!Yª±‘žÍC!êÿâõåûÞÓß/30P'ÿç¸|Rÿšššÿbbbÿµô÷ø7:ÛÝøµô÷骧%#ÿbbbÿ%#ÿÿõ–äÿîÿf òö¨å 4üíZ!ÿM&%ÿNãê…ìñ³ÚÛ³ÚÛÌÓû™ïóÎãøÏð:+ 7ïM&%ÿÉ5;ýf÷ÉïBsËÉ“ËÅ™bþ‰RîüpÄÌô444ÿšššÿçkƒV“%áááܬu›£)¾”Â/_`ʉyEÅŽ+fffÌÌÌÑåýµô÷?öööÿÌÓûÛãÛã XÖþÿ)ôaÂý5ÿïíž?=öööÿÿÛ„ý.;;Å¡÷ôÔýôÔýG*ø1 î3fÎ1þÍ}¬Ó¯¯6ˆ¿ÿׯ–Fâ333444ÿ"2ÐÆûñññÌÌÌ}ƒ¸þ»’<<;AG}444ÿ444ÿWèëeéí­IG½½½fffý,+++ Üå,­IG¥V|“““"óV `½½½èèèòòò?èèèÿÿèèè³/ÿpa M&%ÿÎ$Î$Î$³/ÿ³/ÿ²ÿ½‡2ÿ®êÄË佇2ÿ®ê½‡2ÿvvvÿšššÿ~ÓÁ§ùì[XÿÖ~ÊxAÊxAXÿ¦)¨*‚ÿ÷ÇÍ9Ì6ˆ¿ÿ6ˆ¿ÿ×Öþžžž***沂bbbÿÄÌûÃ÷aaa¦Ú ]XôQÈ äÔ)é&9#N¬Œ81JQ$!Oÿ½†"ÿ#ìˆ#ìˆRÿšššÿK ÿM% ÿ4- ÛÝøèèèèèèôôô öööêêêãú〠C:ñññC:ûåËËËááá÷ 444ÿ„ŠÀÿ’ȋְߤzz€¬­®®®N¨œ :;CCCÿ®®®o?>RRRÿèèèÌÌÌ=sFâBBBÕÕÕ€¬­´àá=´àáÚÚÚW¸ó ë´Që´Q rFEööö˜ÄÅë´Qêêê=‘åýÿÿÿ€¬­öÈü***fffCCCÿOOO‘žÍ‚ÿú;8†(‡¿ÿ½½½†¼ÓHWWWÌÌÌ L `çÉwÙ*cõüpËÉ“¡g‰RîMâSQ(ÿËÅ5;ýÅËÒ31)**‚ÿëÎ÷аÙаÙl!!È äÈ ä"-!üôþÑÍú/30P'ÿ2 ÿùñýRÿʺó~¨-ç¸|M% ÿð´Rÿ¼·šššÿVYÛÝøÃÁ¦( ðMÑéNãêNãêÎ$³/ÿš÷ÏðÆÕö 4üM&%ÿM&%ÿ³ÚÛF 6G!ÎãøÏðe÷ñM&%ÿ×þÿM&%ÿÌÌÌáã ü×ûóðüpBw¥ËÉ“¬¨Bsóð®êÌÌÌšššššš±«|ñññÌÌÌžžžåß°£sr¾”ÂÕ9jOk$ÅŽ+444ÿòòòòòò³ÚÛ?ÿÁèé?ÿö î½ãÎ1þç¿"A=¶ #mnÛÕvvv2;YŽF7ß2зVÿÊ¢Ãvvvÿ4.Dx¨õ±àxZñšŒôt¬×444ÿ‹’Ã14ÇÎþÌÌ̳/+ÿ­IG†êìíç¾ÕÕÕõ "óÐýÿÑùÍÿöööòòòS*ÿ»äòòòÿòòòM&%ÿe÷ñË û6eéööö  nÄÌø2ÜíMÑéRÿ<5ÄËä®êM% ÿ4- <5CyÎRÿ®êvvvÿ‰ƒÁw}?³ÞM"òºÚ±‚á-:*0Ð+,¸Ó}ÅÁ‹ÿqÇ4óÌÅ“4Ô 93qÇ4ÊxA)T„ÿ 4;†™Dx¨ùÂ_ÿÝwÄÄÄíííÛÛÛððð73MQ€|||555yyyÿ¤p@Yª±ñÿç›9J£ûÕÂÌá›9JDx¨½†"ÿކç´î:‚XÓ~¨-¾ŒßŸê4- ʺóµô÷ÿöööòòò444ÿÌÌÌCCCÿ½½½444ÿÌÌÌCCCÿËËËòö  ÷555ñññÌÌÌ‘ÁÂÿœ5ÒÒÒÌÌÌCCCÿ333ÍÍÍxFE]èèèCCCÿ=<4=:ÃÆù=:V¹ööö áªG+bÅÌÌÌM&%ÿÁèé?4-­ÖS*ÿ»äòòòM&%ÿob3N~   ìììZ&öN~|||ZZZM³>¡S*ÿ¨Z׬|–½6ÿÝdPPPA ÿBŸ×T ÌÌÌ444ÿôj5ú 98: ‚UODouþŸöÇøCzÞ*‚ÿ¼^ÖzgóÌÅ×Öþ¼^ÖzgóÌÅ 4;ÊxAS*ÿ¯ýýÖþ½ñß&9#/3¡}Ó2 ÿùñýs0$ÌÒâ4- ®êR´½Ùb IDATÿ~¨-¾ŒßÄÌôÌÓö4- ʺóµô÷²ÿ¹âöÑùû¢N`̳ÚÛ²ÿ› /)ʹßh#ÿîÿ› ³ÚÛ444ÿ¹&íGÚËÅ~0Úu` püpóðÉï³âÌÌÌ444ÿÌÌÌbbbÿ888ššš!PªmÛ;rÕÌÌÌÿööö öööòòò½‡2ÿlÍRü£ÞÓß÷êü²IWÍë,6 þñkÅ{zšššÿ¶¶¶žžžbbbÿ‡ÄÍÎ0ìÃÚi¢ûÿ,ÔþäÿÿÖ~vvvÿÍÍÍ9çå„ÖØ444ÿñññHöô¨úüÌÌÌ444ÿAG}¥ÊÄï¿ñññ½½½³/+ÿ9çå„ÖØÿ èñ!UO&zS·¹Þä *µ×¯ÿöööòòòM&%ÿÁèéòòòÿòòò})ÿÐüûþçý!B2ÜíMÑéM% ÿ4- <5žÚpb&ÄËä®ê½‡2ÿÄËä®êvvvÿ³Þ׬|½‡2ÿƒûúðÎûF&O<»Þjú/ )׬|¼ˆXÿmÌ, 4;Ê¢ÃÅ— qÇ4Ê¢Ã)* 4;†™Dx¨ùÂ_ÿÝwÖÖÖ¶¶¶ðððñññ“““ÖÖÖ———½½½ÿ8åââ ôãûQ­ÖRÿ®êRÿ<4 Bt!‚XÓ<4 Bt!½ÿööö öööôôôèèè444ÿËËË555½½½‘ÁÂÿÁ‘ÒÒÒ/-GIrfffCCCÿ333ÍÍÍxFEEwx444ÿ=Ãïð=<4ÄÌû¤ÐÑêêê Õž;ÃÆù=:>¡ÿsE­ÖÿèèèM&%ÿ‰°±ÖÖÖ¦¦¦ñññ“““   ƒLé>¡)T„ÿÿ3;'ÎÅùØÿþíwm¯ÝhPPP7e$E Ãlå444ÿðððÎeÉïFm8: ‹‹æ3CzÞ*‚ÿ)¨;5.zg럑ãÿ…_­iÊ¢Ã)* 4;ÊxA ÿýñl!!Òþþ·ÆÜ&9#ÞÓßs0$­ÖM% ÿ³ÛôRÿ<4 Bt!¾ŒßÄÌô<4 Bt!‚XÓÌÓö³ÛôM&%ÿf ò XÄÌøúÁåÐýf ò:+ ÅÃõNãê{ÿ7 Nãê0ÿñýþ8 D Èåø7 Ê „ÖØ444ÿIõÝp1GÚMâü×ûu` p‚YßÒÿáã ÌÌÌ444ÿÌÌÌ444ÿ]޲‚ Aåß°ÌÌÌÿ i;»äòòòÿöööòòòS*ÿÆjb01ÞÓß©3 Éý½4¦ çÙ¢ïÿööö š<–ü/2¢ûÿäÿÿÖ~³/+ÿMÑÕ444ÿÌÌÌ|*(ÿ„ÖØ444ÿñññÌÌÌé%ÿ’ïò…ìñÿööö 8*/3žè”èèè5 ÿ×þÿsEÿ ÿ*ÐüûÚÿÑùûÌÒâ­ÖMÑé³/ÿ³Ûô®êŽ…×ÄËä4- žÚ<5RÿÄËäÌÓöŠŠŠ׬|CyÎ}2ºÚ±G¼á$0äÕ}׬|\††ÿDx¨“4ÔóÌÅ)*÷ÇÍKËk6^=×ÖþóÌÅDx¨i 沂***HHH   ܬ 7öåââ§VO`Q¯ýý®ê®ê%#ÿÌÓöÄÌô¾Œß¤ÑòÄÌô¾Œß½†"ÿÿ ööö ööö ôôôèèèÌÌÌ555555ËËËCCCÿo?>?op...­¯Ø"ÁÂÿCCCÿ½½½½½½»íîÌÌ̽½½´àá=<4ÄÌûôôôÕž;‡’ô=:‡’ôÿ»äÿÿèèè³ÚÛ沂***$$$$$$>¡”3®'ÎÅÚÿ(YP#혰°°úòþ÷ ÌÌÌÖ wÙü×ûº“ìûÈøÉÍ w®×XGÏeëÏþ-4{¡ú)*“4ÔûРóÌÅ6ˆ¿ÿöéüòÿì —Åî²¼Ú  ÚÇÝ/3s0$­Ö³Ûô½†"ÿʺóÄÌô¾ŒßކçÌÓöÄÌô¾Œß<4 ³ÛôM&%ÿe÷ñ˜ÝòŸó ²Ú?5ôf òš÷ÆÕö;= ³/ÿ…ìñNãê 8É÷ù6óîM&%ÿÌÌÌÖ(Ÿ<4 )‹ êóð~§!áã ÌÌÌÌÌÌÌÌÌ ÙØñññåß°ˆT$ÌÌÌÿ òòòèèèÌÓûöööòòòòòòÿÿ­Öb)Ž7 ; ^ÜîQñá8¦ çÙ¢ïÿù7ÿÿööö ÿ)ôèiFjÑÎýÿäŒ|*(ÿMÑÕÌÌÌ„ÖØñññ½½½ÌÌÌ444ÿ“ …ìñèèè ööö÷ñÈ*Öþÿžè”èèè4-öööôôô£Ñú?èèè­ÖÁéf Ž uS*ÿ³/ÿMÑé4- ÌÓö4- žÚÌÓö³Ûôw­CyÎøñ/OU„ÿÍÎþDx¨ 4;ʢÓ4Ô 93;5.)*“4Ô%%%¦Ú ÄÄÄ ÞÝJJJDx¨®®®2 ÿéÈöëÎ÷N¬‰ÄÚ‰ÄÚåââ\/³Ûô®êÄÌô˜c¤ÑòŸêÄÌô½†"ÿèèèôôôööö ööö èèèèèèñññ555ËËË555ËËËËËË444ÿo?>®®®Dx¨Á‘‘ÁÂÿ½½½ÍÍÍŠŠŠvvvÿ<4ÄÌûÃïð¤p@ öööÃÆùÃïð‡’ô<4CCCÿòòò?öööÿÿÿÿ‡»ë888òñ"î¾ÖÖÖÿPœòn2®&ùØÿ;9§k<¨YP#í˜YŽøÈøƒ×ï*cõûÈødóô444ÿ$ú¢ýÓÅßÚÿ 4; *|.KËkø9zg0`ûР8 íÔø, «”ׯýýRÿŸêµô÷®êµô÷ØþüʺóÄÌôRÿ³ÚÛµô÷³ÚÛßûüʹߙïóÿîÿe÷ñMÑé¦ßÿîÿÃöø ÑùûNãêÈåø…ìñÉ÷ùe÷ñáã ÉÌÌÌCzÞ<4 )2›ýîaêóðÌÌÌ444ÿfffÌÌÌ 7á444ÿòòòèèèS*ÿÁèéÿÿÿòòòèèèáž×ärÄÌø–)!l!!Ø(ÎîÅ;Qÿ×òòòòòò%| ã©©©róÐ,ÿ„ÖØÌÌÌÌÌÌ444ÿ½½½ÌÌÌ444ÿÌÌÌ„ÖØ|*(ÿèèè õ ìüÔÍïÇ÷ñÈèèè­ÖsEöööôôôËòóÿÿ ÐüûòòòÊúúNãê³Ûô­ÖÎ$M% ÿ®êþçýÌÓö4- —ÆÿÿÿäääðÎûä ŠŠŠ¶Ý¯444ÿ׬|)T„ÿ)*mÌ,;?uDx¨óÌÅ 4;zg*‚ÿÛÛÛÂÂÂÃïðܬܬ```‡‡‡ÿëÎ÷öéüöéü åââ8 õåû2 ÿRÿ®ê®êÄÌô(³Ûô®êBt!ÿ öööèèèÿñññááá&&&555®®®o?>RRRÿ½½½CCCÿ=‡»ëÃïðÃïð=hœÌh<;hœÌ=Ãïð‡»ë=ÿòòòËòó?sEsEsE?öööÿiiimmm<<<Ãïð‡»ëíííÖÖÖCCCÿMÒùØÿþí­Ö¯µÜ0YP_(ÅfffwÙ:sH£áã ÌÌÌÖ~à,õ”ü3˜ÄŃÓ&ßÓÅîœe 4;0`óÌÅ6ˆ¿ÿôãûòÿì"ä¾ô  M% ÿÌÓöÅ:U IDAT³ÛôÿúCÿÄÌôÛÝøÚÿʺógžÿúCÿ˜ÝòM&%ÿÖùûµô÷Ãöøÿîÿ³/ÿ444ÿÌÌÌ0Ôÿ£ÒGÚûÑúÌÌÌÌÌÌmuûfffÌÓûèèèòòòÿÿÿ);ð4ü>­ÖCyέ֦ßjJs444ÿòòòòòòòòòêÊöèÜ÷¡2ÿÿÿÿÿÿÿÿÿÌÌÌÌÌÌÿœîðÿÿèèèóÝÜóÝÜèèèèèèÿööö?4-»äòòò³/ÿMÑéÿ›ÿMÑé³/ÿMÑéÿ5 ôËó i:þ¼øsDÌÓöËó èèèÿööö"B2ô²äääf?møñ¾¾¾äääèèèÿp§ÊxA*‚ÿÖ~)T„ÿ׬|ÿoooÛÛÛ888<<<***bbbÿttt±±±yyyÿööö$ûõåû÷ Aí¿ èèèÿi:þ¤Ñòóõööö i:þÌÓöÁé 5 ôËó èèèÿ ôôô ôôôèèèÿèèè444ÿðððÚÚÚ555½½½ÿèèèCCCÿ½½½444ÿ=ÃïðñññL <4R†¶ +++½½½ÿööö èèèbbbÿ%%%ˆˆˆ***mmmááácccOOO*** #$ÿýôà Võ-üÖ…ëÙ0ÿ}0\ó¾¾¾ÌÌÌÿŸ>0[’öçááèèè6ˆ¿ÿóÌÅûРd›îœeôôôõ ó^$ú¢d›îœed›ÊxAÿýñæòÿìûöþ ýñæýñëÎ÷RÿʺóÍ i:þ<4 [’ö ð&éÍ i:þ®êM&%ÿþæäµô÷²ÿMÑé³/ÿMÑéÿ3ôñÍ šþÉ÷ù…ìñ²ÿÉ÷ù…ìñíZ!ÿ”øõ£ÒôôôÚqwÙÿ5 Áèéòòòÿòòòÿè|bà"öööTTT¢¢¢èèèÿFùôãûý× öööÜ'.ãúööö èèèÿèèèÿèèèÿèèèÿèèèÿööö èèèÿööö öööËòóËÅ?Áèé ÿèèèÿeéÿööö¥! ÿeéM% ÿ³Ûôÿ5 ôÁéösD¼øsDËó èèèÿööö"BÎŒâ:uÊÖþÖ äëäèèèÿöööp§Ø†O)T„ÿ×ÖþÿFv 4;Ê¢Ãÿ èèèÿöööyyyÛÛÛ¬¬¬tttÄÄÄÿoooÛÛÛ888 oooÿèèèÿööö$ûùñý÷ A$ûæÿèèèÿ—Æööööi:þÌÓöÁéi:þ ËÆÿööö êêê ööööööÿèèèÿÿÚÚÚ ðððÿöööööö ööö ÿèèèÿèèèÿèèèÕÕÕÌÌÌ€TSÿÃïðñññÌÌÌCCCÿ<4ÄÌûÃïð555ËËËÿööö 5 Áèé èèèÿðððÛÛÛˆˆˆ***±±±ÕÕÕ‘‘‘OOOÿõ Åù’üÖñÿðîæ|æýÿÒ¢¢+++ÿöööW¸¸óñë)¾ëèèèÿ>>RRR½½½CCCÿ¬¬¬ÿBBBÜÜÜÜÜÜSSSšššÿ444ÿšššÿšššÿêêêÿ444ÿ444ÿšššÿêêêÿCCCÿCCCÿ§§§-QQÿšššÿêêêÿšššÿêêêÿ444ÿ444ÿÌÌÌ444ÿ444ÿ%#ÿ–šØ)ôÿÆÀ\ÿáݳÛôM% ÿŠ„/ÿM% ÿ‡e°½½½ÆÀ\ÿÌÌÌbbbÿ`‹VjÈÉfff444ÿÌÌÌ444ÿÿ òòòèèèèó)üéõ¿òö òý3ÿK ÿ÷öí ~0ÚIªå¼ˆXÿ64.4-M&%ÿM&%ÿ2, 444ÿšššÿBBBÍÍÍðððhhh^^^bbbÿ 555hhhñññÍÍÍ$$$ÿÿû‘ÿº¾íjÅ0ùôããùf;.;;QRù¯®Å{zQRãã444ÿE|BÛÊÄÄE|‚‚‚fffÍœÖûuu?Xˆ¿ÿ444ÿÌÌÌK ÿÚÿþçýÐüûþçýÔàøÙñ!ÿK ÿÜÜÜ::::::333ïïï```ìììñññCCCÿ¬¬¬ÿîîîÈÈÈ666ìììÜÜÜËËËfffRRRÿbbbÿêêêÿfff“··7=fêêêÿ444ÿÌÌÌ“··7=fêêêÿ444ÿ333ŒŒŒRRRÿ®®®bbbÿ“··7=fêêêÿCCCÿbbbÿbbbÿ“··7=fêêêÿƒ"ç444ÿ444ÿ444ÿ444ÿƒ"ç444ÿ4.—Åî.I7=f âü)ôœ¢³ÛôM% ÿK ÿØþüáÝ})ÿþçý³Ûô‡e°ÌÌÌ2](è::bc...444ÿÿèèè Aÿ ×ÿÿõ¿ÿ=þûÖùûí ¤Üó!ÿS*ÿÍýþ;5.Ä¡ÏøÎÔÒþþob3S*ÿÿ0ìÐýÉß÷þæäþçýØþüM&%ÿBBBÜÜÜììì333$$$®®®¢¢¢ÒÒÒCCCÿÿ öööÕÕÕ¢¢¢®®®CCCÿÿvvvÿvvvÿŠŠÅÒÅÅ>>ììì¾¾¾ííí„„„K ÿq|Oq|OM% ÿ¼ˆXÿ¬¬¬fffˆˆˆ444ÿÿëÇÇ×Õÿ©©©%#ÿÌÌÌ444ÿá½½×Õÿèó) ÿ444ÿK ÿ×Õÿ×Õÿ“··þçýJJJl ÿF Nãê½½½ñññáááÿëÇÇ×Õÿ~~~vvvÿRRRÿCCCÿl ÿF NãêRÿìììÉÆñÈÕ§~¬¬¬666&Pÿ á½½×Õÿ~~~öööTTTbbbÿÌÌÌ‹ êÆÓöt؃"ç444ÿtØ®GÌÌÌ‹ êÆÓöt؃"ç444ÿÌÌÌi;Ëó M% ÿ3ôñøÒ·×Õÿ©©©Çñú<8úK ÿÿŠ„/ÿ×ÿ骧(Øþüö7I—KŒí(j1y›P„ÖØ|*(ÿëÄÃ5ܪäà¾ÈÈÈñññÌÌÌ—Å2ÿòòòÿ})ÿ½‡2ÿS*ÿòòò × AÿH-ƒÿH-ƒÿãñ±Oÿòö Öùûí Áèé‘åý ÿòòòí o·Vÿ<_1­Ö+ob3“ÂÄ¡ÏÍýþS*ÿÿÐýÉß÷5ØþüõÿÿêüýÎãøÿvvvÿžžžÕÕÕ®®®ìììôôôÌÌÌáááÿ ÜÜÜèèè ½½½ ÍÍÍÿ „Ø„ì@vvvÿbbbÿbbbÿðòÌÌÌÅ{zËts–;КÅûšÅûÄ‘.;;^V‹½½½ ÖŸ©ÙÚèèè¤zzÉÔÈÎýÓ~豫|èèè4d›ÖûñññÌÌÌ&éØþü&éßûüÖùûÔàø*µô÷M% ÿ$$$ÜÜÜôôôñññðððÜÜÜððððððáááñññááá„„„îî¸áááÜÜܦ¦¦666¼¼¼±±±ÅËÒ³ÛôÿsEñÈÒžnÌÌÌ&Pÿööö)+ËËË.I%#ÿ444ÿê444ÿÿ è¾ öööŠŠŠBBBµô÷þçýß´»¸à,EÙ¬¬¬ÿˆˆˆK ÿßûüºô÷l ÿäääñññ)+ÍÍÍ$$$½½½K ÿßûüºô÷l ÿÌÓöÿÃp71p71=þûšššÿvvvÿ¬¬¬^^^ è¾öööhhh¢Äî444ÿ})ÿÎãø*Êý}ÞÊüûÈ»ñññ444ÿÌÌÌ:æÎ‘åý*Êý}ÞÌÒâèèèþçý)+âàÅ9͵ò<8úÿv|Ñ'èåÚÿ&éØþü&éƒ}zƒ}ÆÓö:@¤ì[Xÿ|*(ÿ ŒžžR´ÆÍbW!ÒÒÒÌÌÌCCCÿèèèÄÌøS*ÿS*ÿòòòÿÿÿ&Pÿ})ÿ·VÿÎãøÿ})ÿ})ÿ³/ÿ})ÿS*ÿ½‡2ÿ=: yn½‡2ÿS*ÿ½‡2ÿS*ÿèèèõ¿Æá‹¸Þ¾H-ƒÿÿû ÉH-ƒÿ ÷ÿÿ=þûÿòòòƒ×ïIªåøÎÔ3ÿ*ðòèèè³ÚÛÊÌÒ;5.èèèÐýÿç5Öùû&éµô÷ÐüûeùM% ÿCCCÿìììôôô¶¶¶ 333 ½½½ÿ½½½CCCÿ RRRÆÆÆìììÍÍÍððð½½½ô444ÿÒª@59£Ëts»dcÒª@.VÀÖû444ÿ‘‡W¢¢¢444ÿ6<<ÌÌÌßûü*ÖùûìýþóþþK ÿÚÿX þçýŠŠŠ$$$:::äääñññ½½½RRRÿÖÖÖ¸¸¸®®®áááññññññÊÊÊ$$$ñññÖÖÖÿRÿ4- ÅʾÌÒâM% ÿRÿòòòDx¨;5.bbbÿCCCÿá8ÞBêêêÿbbbÿbbbÿ)+=þûá½½ ×Õÿ.IM% ÿÌÌÌñññ×ÕÿêùCCöB è¾èî ÿììì444ÿâEHGæ¹Úÿþçý÷ÓÓ --¶¶¶ÌÌÌø7:kKLJFH×26èèèäää+++ëÇÇ:::ìììCCCÿñŠ[ÿ²ÿø7:kKLJFH×26ñŠ[ÿRÿ=VñÈ555„³Z‚®ø7:ÜÜÜ Ý´ÿììì è¾¾¾¾^^^ ìì쬬¬)+&PÿÌÌÌCCCÿ· #Öùûp71p71¾Uó6Âñ-ÌÌÌ444ÿ· #p71p71444ÿ444ÿñŠ[ÿà,E&Pÿ-QQÿ¹Gþçý/- øÒ·ö÷¼÷*·DÇñúÖùû&éÚÿzì[Xÿ¥¨„ÖØ„ÖØ%(]š›bÒÒÒÌÌÌ444ÿÕÕÕS*ÿ—ÅîS*ÿ½‡2ÿS*ÿ½‡2ÿS*ÿ­ÖS*ÿòòòòòò è¾&Pÿÿÿÿÿ})ÿK ÿƒ×ï_®èlJ5:- K ÿ·VÿÎãø'0ÿ)·Vÿ½‡2ÿ­ÖÄÌøÃÆöö¨åynS*ÿ½‡2ÿ½‡2ÿùÖ¼ùÍ Aÿ0kÕâÌòö ÿÿÖùûí ìýþ=þû2,/Ø ãâÅËÒM&%ÿ­¯Øÿç*Öùû(M&%ÿþçý0M% ÿ333$$$èèèÌÌÌvvvÿ888ÍÍÍvvvÿèèèÍÍÍvvvÿ$$$ÿCCCÿRRR¢¢¢555ŠŠŠŠŠŠñññCCCÿ64.UQ"UQ"59£QRf;Ó2*lJ;3 Æ2ñññððð444ÿ444ÿ¯Fäo ¯FäÅÍôÅÍôCªÙÌÌÌÿøÒ·ëÇÇòÈûöþü öÁé64 2 ð.I9ßûü&éØþü(¯­’‡e°ÉƳÛô|*(ÿÊüý³ÚÛÕÕÕCCCÿM&%ÿS*ÿbbbÿ444ÿÕÕÕS*ÿèèèüÖç4.ÄÌøÌÒâ*0 è¾ è¾öB=þûsEg%2Îãø™Ûòµô÷šöõÆÓöÊúúľô(oÄÌøÊúú<4ÄÌøƒ×ïÊúúMÑéÌÒâžÚööö*Íòòò ÷ãõÈéÿ*Ã$Ùð÷öÖùûìýþ=þûÒþþ­Ö+?³ÚÛþçýØþüµô÷Ðýeùµô÷³ÛôŠŠŠìììžžžbbbÿÌÌÌŠŠŠ...444ÿÂÂÂììì½½½ááá½½½èèèèèèÕÕÕCCCÿ½½½ŠŠŠ>>>¢¢¢ááábbbÿ½½½½½½444ÿåDH²‰…VÿçÂð½½½S*ÿ­Ö})ÿƒ×ïS*ÿ­ÖM% ÿ³ÛôÿòòòÿòòòK ÿµô÷})ÿ™ÛòêüýM% ÿ³ÛôÿêüýK ÿlJIªåS*ÿÌÒâf Î$­Ö})ÿƒ×ïS*ÿ­Öšššÿç¹Gpfffÿòòòÿòòòÿöööòý3 ×èèèÿ÷öí òòòÿòòòÿ÷ößûüM&%ÿ4-­ÖSQ(ÿ64.w{ªK ÿÚÿŽ šöõ³ÛôK ÿ2Ðüû³ÛôCCCÿ333ŠŠŠbbbÿ¾¾¾ÌÌÌÿ +++½½½ÿBBBŠŠŠvvvÿ¢¢¢èèèCCCÿ333ŠŠŠ444ÿUQ"«¯Þððð¼¸NjÅ0—@?-QQÿ444ÿðððÈÈÈCCCÿûòå‡= vvvÿCCCÿ»‰ˆÿß!ïî¶WUÿšššÿì8üöVX`6Ó¯¯bbbÿÜÜÜîîîîîîÂÂÂPPP$$$šššÿvvvÿvvvÿøñùñýåââåââåââÑÍúаÙöööAGvüí•ÂÂÂììì   ¾¾¾ öööôôôèèèÿM&%ÿ4,ñl÷ÃÆöûÆ«ûÆ«ÿû‘ÿ½‡2ÿ&Pÿ9öÿ%.4XOÉÑÌÅ‹‹ÁÍýþÿ&Pÿÿ„Æù:o:ü2õ”:ùÆ:õ”×Ý8ÿÿ#ÿ$ÐÆø¦ú™£¨0P'ÿ²ÿ{ÿ8779,-ã¡ðŒŠÿì[Xÿ|*(ÿM&%ÿÍé(„ã',.-]þ,)³ÚÛS*ÿ|*(ÿžÚpb&ûÄuÿýÇÿS*ÿM% ÿS*ÿ¼ˆXÿwpc;5.wpcà«uçå¯S*ÿTPÿÿÿÉÍùåþçý0,îéÿÊÊÊ666ôÉÍùöööòö òö èìÿÿÿÿÚÚÚbbbÿáááÍÍÍchþbbbÿw|$$$ÿúdÿbbbÿ444ÿÿÿöööÕÕÕ555öööÿM% ÿ!ÿáאּî³Ûô+þçýÑÓö¬°î¬°îìììTPÿ¬°î(þçý+ÌÓöþçýáááÊÊÊÑÓöº¾ü"&dCCCÿvvvÿÊÊʽ½½¬¬¬ÿÍÍÍÿÿÿ ,ÌÌÌñññâââñññâââÌÌÌ,M&%ÿ/„ÖØM&%ÿ/;,ó”¶îà Ÿ>ÅÔ Ñüý³ÚÛM&%ÿf z"&×Õÿ è¾òö  8ñÿ¿ èè謬¬ÿˆˆˆfffÜÜÜÕ–“Ãhhh¾¾¾ÌÌ̼ˆXÿð$T¶¶¶ÂÂÂvvv¸¸¸®®®444ÿ½½½SQ(ÿÑÓüea2w{ªSQ(ÿ­¯ØRRRÿñññ½½½bbbÿžžž #$ÿ,?4¡}Ó@‚,ÿàÍûà±ÙCCCÿxFEß½» ***&PÿüçÿX`6¼’’èèèÿ+++333ììì$$$>>>°°°ÜÜÜŠŠŠÿõ ååââåââåââåââèÈñèèèÿöööAGvÉÔ ```   ```888òòòÿööösE<4=: ÃÆö=: :UûÆ«:U¾Œ¡CyΔÿ b)Ž/4;ÑÌÅ/4;¬ž‘üÚ°ÿèûZJõ”ü2üÎü l)#ÈÛÒÌüÚ°A ÿúñýõåû ,"î0:5;,›‹ÌðÎûаÙ{ÿ7 Ê 77%(ÇÔÓÉûýÑüý×þÿ)üí+Ôüÿ,17˜óü‡j§U IDAT3.4ÍÒÌ3.4‚©{K ÿ1)û×þ)ÌÒâpb&=: ‡’î­ÖM% ÿ4.ÌÒâ4.;5.<;5‰¯ýýä ôáã Ùïð@èç(ðððRRRÍÍÍiiiˆˆˆô­¯Øÿöööòû$ûå ÷òö  ÷ žžžCCCÿìì쉄îchþááá½½½ÿ ‚‚‚tttòòòTPÿùÕúÔàø3K¬°îTPÿ64 ÁˆìþçýÚÿ/- º¾ü èèèTPÿ64 v|ã!ÿßûüTPÿ64 v|ãK ÿÖùûßûüTPÿPááá333ÍÍÍ Ï64 ÊÌõº¾ü555½½½CCCÿñññxxxÊÊÊ¢¢¢èèèÿêêêòòòCCCÿññññññññññññÌÌÌM&%ÿ³ÚÛ|*(ÿ;,óÆÓö‘åý ›ÿ'6`̳ÚÛM&%ÿ/±')×ÕÿIÕÁèéòû$Üòòò444ÿÌÌÌM% ÿ4.»ä?þ³ÛôCCCÿWWW>>>hhh®®®444ÿ½½½‰…VÿÊÌÒ¬ªiŠŠÅÊÌÒ­¯Øbbbÿðððâââ...ááá½½½bbbÿððð®®® O'ÿíÔý,?4ÁÌúûòåó(ÌÌÌê60ÿÌ!%äCEfff&PÿòÈèŽ-5«×Õÿüçÿ\y7¤zzÿööö$$$îîîÜÜÜŠŠŠÿõ ååââåââæèèèÿ99ëÇÇ 333```   ììì¶¶¶èèèÿi;l÷Ð-=: ÃÆö=: :U6ûÄu:U¾Œ¡CyÎrÿ"(:)Ž/4;¬ž‘üÚ°ÿèûZ" ¼ü¦ŒüÎü l)#ÈÛÒÌüÚ°ÿöööø,!"îïïé0:ÐÆøðÎûаÙK ÿg É÷ù7 Ê 77%(ÇÔÓÉûýÿêç©)³ç*,1Ïúÿ1o‘âúÏúÿ5D5Ÿ¸Ê.µ×¯|*(ÿÑüýþæä4.ʹß4.ÌÒâ­œ0‡’î­ÖM% ÿ4.ÌÒâ4.;5.ÅËÒ—Åî8#ðòñññ‰SþŽ…× D ïó1áááGAìv|Ñÿèñûå ÷òö  ÷ öööòòòCCCÿ¹¹¿ñññÌÌÌÿ +++ËËË èèèTPÿ¬°î!ÿ, ³ÛôTPÿº¾ühhhìììžžž!ÿßûüÿòòòTPÿ¬°îK ÿ6F ÌÓö³ÛôTPÿ64 —çßûüTPÿ64 v|ãÿ555žžžTPÿº¾ü èèèÿJJJ¾¾¾½½½ÿöööòòòCCCÿáááñññðððñññÌÌÌM&%ÿj0öÆÓö)—Æööö©H ÆÓö6 YA‘žÍ³ÚÛM&%ÿ×þÿ)×þÿêêêòö  8ñÿ¿ èèè444ÿÆû8w}?¾¾¾ÌÌÌCCCÿyE¢üý<Eîîî©©©½½½444ÿððð...žžžS*ÿ2,vv;oCCCÿ888¸¸¸®®® O'ÿõãâ?4+ƒŸõF.­¯Øê60ÿÌ!%äCE<<<mmm½½½ Oÿ)+Ó¼þ Éì8üÚ°ÿ$$$ÜÜÜ$$$ÜÜÜŠŠŠÿö îåââåââаÙÿ+++Ùè@òã‹ùòò```ŒŒŒ¢¢¢ööösE<4ÄÌøl÷Ð-=: :UûÆ«ÃÆöC’b ¼üóDî:ùÆ:)#È/4;¨±7øÆõ”üÚ°ÿè| ¼üóD ¼ü lùÆ:ÍÌB7)RüÚ°ÿöööøÿè2ïïéßÿ!î0:ÐÆøðÎûаÙK ÿ07 Ê 6óîÊ 77ÉùûÈåä Üé+,1oÈéýÉùýÏúÿÒæþãñ±S*ÿÌÓûþæä1Ñûä4.<4žÚpb&ÄÌø—Åîöööú\0";5.ÅËÒ¤ÐÞéë f` ¹¿åáã BBB666¡y`­œ0ÃÆögòå­¯ØÿèñÜ èèèSQ(ÿ:ñïÆ73ØÞ3ÍÍÍËËË ööö èèèM% ÿ³ÛôK ÿ³ÛôÿèèèM% ÿþçý4- ʺó+¬°îŠ„ÿÊÌõ¬°îÿòòòÿèèèÿ^^^ÍÍÍáááôôôèèèÿööö öööòòò444ÿñññðððÌÌÌ444ÿ2=Ðý2Ýi:þ p1Éû‘žÍ³ÚÛ³ÚÛ)³ÚÛôôôòû$,òö ööö444ÿh¡3SY666xxx444ÿ½½½‡»ë+<<<***©©©½½½444ÿðððáááSQ(ÿÒþþøÎÔTV—½½½ðððPPPñññøÉñíÔýøñoC# 3h< –Ëø'°dj½»WWWCCCÿ OÿW÷ÓÓ99òÈüÚ° ÍÍÍÜÜÜÜÜÜ©©©¢¢¢ŠŠŠèèèÿùñýåââ_ƒ-ÿÕÕÕòã‹ù"3   ììììììJJJèèèööösEl÷0Óï”ù 0ÓïÃÆöûÆ«ûÆ«ÃÆöÃÆöCyÎÿ„ è¾õzïüÎëê:õ”×Ý8ÑÌÅ)Žõ”òÈüÚ°èèèÿ„üí"büóDüí"ùÆ‹‹Áÿöööå2ßÿ!îßÐÆøðÎûаÙаÙÿÃÐøú7 É÷ù6óîÊ 6óîÉûýÉûýÉùû7 èèèôôôãþÔüÿÔüÿÏúÿÈéýÉùýÏúÿÏúÿÔüÿÒæþãñ±ãñ±M% ÿÌÒâ1þçýû×þÌÒâÄÌø4.pb&ÄÌøÄÌø­Öèèè éë(;5.ÅËÒÅËÒ¤ÐÞ¤ÐÞÓýè/- éëFB ôôôÉÍùå#%NBBB¾¾¾ˆˆˆç(:søw­ñññ73áã ÜöööbbbÿÿÅÇð»½æ¶¶¶¶¶¶áã ÉÍùñïÆ("ÍñïÆ$$$áááöööÿ+Øþü³Ûô+K ÿ D ³Ûô³Ûô+èèè+þçýÌÓö D þçý¬°îv|㬰îvvvÿTTThhh¬¬¬ÿCCCÿèèèÿÍÍÍáááôôô+++ÿ òòò444ÿðððñññðððñïÔñïÔM&%ÿf òÎ#ÿ2Ý?ZÅÍô–Ð ³ÚÛÿöBüãâÜòû$I ·ñÇ ÷ èèè444ÿJJJÊÊÊìììÒÒÒÌÌÌCCCÿFB3hœÌ²²²***444ÿððð½½½SQ(ÿ.2,ÊÌÒ­¯ØCCCÿžžžÿõ èøÉñõ ,øÉñ ÌÌÌvvvÿ@áßÀ!$$$½»4ßÛÑSXEwx444ÿÌÙW ª,*×ä ÐòüÚ°ÿööö555¬¬¬ JJJÍÍÍÕÕÕèèèÿõ â"-!åââ/3¡}ÓCCCÿñññááá --òòÂÂÂôôôèèèÿööö?4-ÌÒâÁé?4-l÷Ð-ÄÌø­Öÿöööò † ¼ü¦íZ%.4ÛÒÌòÈèèèÿèûZ¦è¤ùÆ:)#È׬|ÿöööø!NßèÈñ8аÙÿööö=þû0ÐøúÃm7Éûý„ÖØÿöööA,1ÏúÿÔr’¨Ø IDATüÿñÿ¿ èèèÿnÑüý4-ÌÒâÁésE—Åîèèèÿ )è4.¤ÐÞéëúéë êêêECðòñññBBB$$$ÈÈÈÒÒÒñññå­¯Øÿööö ööö&&&¢¢¢***ÿööö ;9áã ôáã ô:¶¶¶ööö ööö èèèTPÿ¬°îÿ<8ú64 ›ŸëÛÝøÿ<8úÄÈ<8ú64 Ž”ûèè芄ÿÊÌõ¬°îTPÿ64 v|ãvvvÿìììáááÍÍͽ½½ÿ+++½½½ÿèèè444ÿÌÌÌ444ÿñññðððÌÌÌRÿü×û6Î#ÿ6ÅÔ Ñüý³ÚÛÿCCá½½òû$ãúãæöööòòòÿ:::âââÚÚÚhhhìì쬬¬÷ö, ³Ûô444ÿüóä yEÞB–¶Œ81¢üý<E©©©í ää ÌÌÌ444ÿüóä üóóáááñññÌÌÌS*ÿÒþþÑÓüô64.ÊÌÒáã üóä ÌÌÌRRRÿâââððð>>>žžžCCCÿåáã ç Øòâ}a Ž”éõ ,3áã ÌÌÌ444ÿÌÌÌ444ÿñññüóF&OEˆº»333$$$©©©½½½444ÿÌÌÌ444ÿüóä üóä üóä ððð ,ä ÌÌÌÿööö öööôôôèèèÿèèèÿ8/3¡}Óÿ ôôôJJJÂÂÂôôôèèèÿööö i;­Öÿööö ööööBüÚ°ÿè¤)#ÈÛÒÌüÚ°ÿööö"BèÈñèèèÿèèèÿööö=þûà cü÷„ÖØÿ öööA,Ôüÿãþ Éèèèÿööö?þ4.»ä èèèÿi;—Åîööö ôôôöööôôôVPûÉÍùðòñññ...ÒÒÒBBBìììñïÆðòå73v|Ñÿööö öööTTTžžžÿööö&&&ôáã ÌÌÌÿööö ööö èèèÿööö èèèÿöööú/- º¾ü èèè%#ÿ/- ¬°îÿ<8ú¬°î%#ÿ/- ïó1áááÜÜÜ%#ÿ/- ¬°îÿèèèÿèèè444ÿÌÌÌCCCÿ½½½444ÿññññññÌÌÌM&%ÿ0ì6Î#ÿ6ÆÓö¤Üó[%$„ÖØÿöB è¾òö ûå ÷òòòÿööö?þÔàøí íìßûü444ÿÌÌÌ444ÿí äóí äаÙ444ÿüóä üóä ÌÌÌ444ÿüóä ôÝÿÿQ2,§ËÑä ÌÌÌ444ÿÌÌÌ444ÿüóä ÒÒÒüóä ÌÌÌ444ÿå73¹¿å73ÉÍù73ÉÍùðòñññÌÌÌ444ÿüóä üóä üóä üóä ÌÌÌ444ÿÌÌÌ444ÿüóä ÌÌÌ444ÿÌÌÌÿööö èèèÿ8аÙÿèèèÿ ôôô ôôôèèèÿèèèÿèèèÿèèèÿ êêêöBòÈèèèÿì8òÈèèèÿèèèÿööö èèèÿèèèÿööö öööòÿAãñ±ÿööö ööö èèèÿ ôôôèèèÿèèèÿööö èèèÿrlÉÍùáã åðòñññGAìv|Ñÿèèèÿöööòòòÿööö èèè444ÿÌÌÌÿèèèÿööö èèèÿööö èèèÿ ð/- º¾üú/- ÄÈèèèÿ<8ú¬°îÿFB64 ÊÌõ¬°î444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌCCCÿ½½½444ÿÌÌÌM&%ÿþæäÖùû\$ ‘åý=þû³ÚÛÿì8)+×Õÿ è¾òö Ü èèèÿööö èèè444ÿüóä ÌÌÌCCCÿ½½½444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿüóä üóä ðððÌÌÌ444ÿÌÌÌ444ÿüóä üóä ÌÌÌ444ÿôáã ÌÌÌ444ÿôáã ÌÌÌ444ÿÌÌÌÿèèèÿèèèÿèèèÿèèèÿèèèÿ ôôôèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿVPûÉÍùðòåðòå­¯Øÿöööòòòÿööö èèèÿèèèÿèèèÿèèèÿèèèÿööö ööö ööö èèèÿöööFBº¾ü èèè%#ÿÛÝø444ÿÌÌÌ444ÿñïÔ,ÌÌÌ%#ÿÿööö èèèÿöööòö Ü èèèÿèèè444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿèèèÿèèè 0œð IDATÿèèèÿ ÌÌÌSQ(ÿ€ÿ­¯Øÿèèèÿèèèÿ<8úÄÈèèè444ÿÌÌÌ%#ÿ,ÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ%#ÿ$$$ÿ%#ÿ%#ÿ%#ÿ%#ÿ%#ÿ%#ÿ%#ÿ%#ÿÿÿÿÿÿÿÿÿÿ!'Pÿ444ÿ!ÿ%#ÿ #ÿ!ÿÿÿÿÿÿÿÿÿ444ÿÿÿÿÿÿÿÿÿÿÿÿ)T„ÿ)T„ÿ)T„ÿ\††ÿ444ÿ_ƒ-ÿ0P'ÿ_ƒ-ÿ_ƒ-ÿ0P'ÿM% ÿRÿCCCÿCCCÿCCCÿbbbÿbbbÿ})ÿ})ÿbbbÿCCCÿ·Vÿ·Vÿ444ÿ,ÿä,%#ÿ,%#ÿÛÝø444ÿ%#ÿ,%#ÿ,%#ÿÿ%#ÿ444ÿ%#ÿ444ÿ%#ÿ,%#ÿ444ÿ%#ÿÿ5 M&%ÿÿ8444ÿ444ÿèèèSQ(ÿÿèèèÿM&%ÿèèèÿM&%ÿÿèèè5 ÿÿM&%ÿ 444ÿ444ÿ444ÿ 8!'Pÿ444ÿ*!'PÿCCCÿÚÚÚ÷&é-éðî 5 ô #ÿ%#ÿÿ #ÿèèèÿ #$ÿÿõ 444ÿõ Ùïðÿõ ÿÿ ööö ÿÿÿ¼ˆXÿS*ÿ¼ˆXÿS*ÿ¼ˆXÿ·V.ÿ¼ˆXÿ“4Ô`1Ò50ÑþÏ)T„ÿ)T„ÿ\††ÿCCCÿ]+Œ81ÑÍú0P'ÿÅ¡÷ëñåRÿþçýʺó444ÿbbbÿ444ÿ444ÿWWWbbbÿžžžSQ(ÿSQ(ÿÿtttvvvÿ444ÿƒ×ï})ÿíZ!ÿƒ×ïSQ(ÿSQ(ÿÿSQ(ÿSQ(ÿÿ})ÿ0H¤I})ÿ%#ÿñïÔSQ(ÿñïÔ Þ444ÿ,ñïÔ%#ÿððð ,M&%ÿñïÔ,ñØÿ)èÿñïÔ,ñïÔñïÔ(ñïÔ444ÿ,èèè³ÚÛ³ÚÛ5 ôÔýüó0P'ÿüÛ444ÿ0P'ÿÝÿÿ5 ³ÚÛM&%ÿECöööM&%ÿM&%ÿ³ÚÛèèè5 ³ÚÛý,íóOU„ÿíó"óK)Qÿ"óõâ("óÞä 5 éÿ)5êçÁé íì- åþ5 øõ%#ÿèèè444ÿ #$ÿ #$ÿäääõ Ùïð .-Ùïðõ óÝÜÿõêêööööööþìëêêêêêêöööööö ÿèèè;5.S*ÿ;5.0P'ÿ0P'ÿ2*¶WUÿ³/+ÿÅËÒw{ª¢|«¢|«`1Ò`1ÒÍÎþ\††ÿCCCÿ\††ÿêCCCÿ-QQÿ0P'ÿÌÌÌÅËÒÈsfëñå÷è ãA ÿS*ÿM% ÿʺóµô÷µô÷SQ(ÿ...žžž½½½JJJM% ÿ})ÿSQ(ÿSQ(ÿSQ(ÿSQ(ÿŠ„/ÿM% ÿ})ÿBBBxxx444ÿÿÿSQ(ÿSQ(ÿ€TSÿ¼ˆXÿ¼ˆXÿ€TSÿ¬¬¬ÿžžžCCCÿCCCÿÿÅÇðSQ(ÿŠ„/ÿÅÇ𬬬ÿbbbÿCCCÿ O'ÿ O'ÿÿvvvÿŒŒŒ&Pÿ&Pÿÿìì좢¢bbbÿbbbÿêêêÿvvvÿÏðbbbÿ¬¬¬ÿvvvÿbbbÿÒÒÒÅÇðSQ(ÿŠ„/ÿÅÇ𬬬ÿbbbÿCCCÿÅÇðSQ(ÿŠ„/ÿÅÇðèèèCCCÿbbbÿáááƒ×ïÀ£ï~/­ƒ×ï$$$ÿÿäóõ<8úÑÓö/- ÑÓöÿ ,õÓáÿÿäÛÝø%#ÿ(Øþü(Øþü(Øþü(ØýãÛÝø444ÿüóаÙ0P'ÿõÓá,üó#ÝÿÿèÈñèèèÿ òñËòó )Ëòó5 ôç(äääèèè0P'ÿèÈñèèè444ÿõÖþÿ1+ÏÕþ..4ÒÒÌ *Øâ(ØÖþÿ*µ×¯ÿ%òð"ïèüáÿðåüòþþµô÷%#ÿóõ éÿéÿéÿéÿóÝÜ #$ÿóÝÜÿöööÿôô ööö èèèS*ÿ¤ÐÞÛÝø0P'ÿаÙA ÿ8Ýÿÿ/3¡}Ó·V.ÿÿ'ýØÖMÑÕ‰…Vÿw¥,\\ç½½½½½\††ÿÜÜÇò"ï¿æAýÍÓ¯¯444ÿÌÌÌS*ÿ­ÖS*ÿ;5.<;5ÄÅËÅËÒ­ÖS*ÿ 1v|ÑŠ„/ÿ—ÕßûüSQ(ÿ73 9½”ò­¯Ø444ÿ...žžžS*ÿ­ÖS*ÿ­ÖCCCÿ333ŠŠŠCCCÿÕÕÕeùƒ×ïSQ(ÿ73v|Ñÿû Ë IDAT /-73ÉÍù­¯ØŠ„/ÿÉÍù­¯ØCCCÿÕÕÕeùƒ×ïCCCÿ½½½CCCÿÕÕÕeùþëþ…ìñCCCÿ½½½CCCÿÕÕÕöööòòòCCCÿ333ŠŠŠvvvÿììì¶¶¶;9 2¡}Ó¼ˆXÿDx¨¬¬¬ÿTTTRÿáLJJJÕ¦j—ÆèèèbbbÿáááåÝÿÿ2;ëê³ÛôbbbÿžžžRÿáLJJJÕ¦j—ƾ¾¾***RÿáLJJJÕ¦j—Æ^^^```ŒŒŒžžžbbbÿž™1˜>>>ÿ&&&ÌÌÌbbbÿáááåÝÿÿjJsÈÈÈëê³ÛôbbbÿáááåÝÿÿ2;888ÈÈÈžžžCCCÿWWWfffúÁ/ÿ½•ìľô„æU¾Œ¾CzÞ ðÐÔ/- ÑÓö/- ,ÿä)èôÔý,ÿä,(/- (Øþü/- \/Øýã,,ÿSQ(ÿüóä 0P'ÿ0P'ÿ -ä Ýÿÿ;9èèèñïÔçööö)èç5 ç(òññïÔ5 ä èèèK)QÿÖþÿ *öÛ1"ó"óØ,3NÛ"óé ãèèèäûüòþþG 0òþþM% ÿ #ÿÿÛÝøõ ôôôéÿ õôéÿéÿóÝÜóÝÜèèèöööÿôôöõòôÿööö ÿSQ(ÿ¤ÐÞéëÿÿëñåå¿ô­¯ØаÙ+•¾[ÿIªÒJ©« X³/+ÿ{ÿ{ÿ|*(ÿ*‚ÿ*‚ÿ #$ÿw{ª‰[ÔþÏ^·‚CCCÿ¤zzú$$׬|ñññ à°òòããCCCÿ)T„ÿ444ÿÌÌÌ­Ö¼ˆXÿ¼ˆXÿÌÓû‘žÍUc˜ÄÅË<;5;5.S*ÿ÷Ïû½‡2ÿK ÿáÝi+­¯ØôÇù­¯Ø–½6ÿŠ„/ÿ888­ÖS*ÿŠ„/ÿ½½½˜˜˜})ÿâàÅ+++ÐüûÐüû444ÿbbbÿCCCÿ­¯ØÉÍùM&%ÿšþ'èå73*ØéS*ÿM&%ÿÉÍù­¯ØM% ÿñññJJJÐüûÐüû444ÿbbbÿCCCÿiiivvvÿâàÅ+++ÐüûÐüûÐøú{ÿCCCÿbbbÿ âÉÿWWW 444ÿbbbÿšššÿ½½½$$$ÿŠŠŠèõ7ÝÿÿôÎû!'PÿšššÿvvvÿÿÿRRRÿÄÌû‘žÍvvvÿšššÿvvvÿRÿò‰'ÿxxxCCCÿ{ÿʺóð´FÝ{ʺóJJJ”””CCCÿ¶¶¶áááÂááåââ³Ð§,ÿJJJCCCÿ #$ÿŸýð´FÝ{šïö¾¾¾ÖÖÖCCCÿCCCÿ&PÿƒÔ:ð´FÝ{¨nJJJ Ü    P»´ìììûbgûbg>>>p7íZ!ÿ¥! ÌÌÌžžžááááááÂááåââ³Ð§,vvvÿáááÂáá2;tttÈÈÈñïÆbbbÿWWWfffSàCkBr„æUûÇËCzÞñïÔ,ÿäÑÓö,ÑÓöñïÔ.. Ëó )èñïÔ,ÿäÌÌÌM% ÿùÕúç(Øþü(+ùÕú+4- ¤Ñò((ÌÌÌÌÌÌ5 Í·ûüÛ#ä üÛõÓáä #ÅÇðÿM&%ÿÌÌÌ(òñÁéòñçòñËòó(ËòóM&%ÿäääÖþÿíó"óôÖÿ(æüÔÍ;B/(ý2êî662ôÚãÓãåèèèóÝÜõ 'éÿõ éÿ'.-ÿ #$ÿÿÿ ÿôô  !÷öööéëòòòÿòòòòòòÿ0P'ÿå¿ôv|Ѿ“ÍÏûÆÿCyÎ X¶WUÿ…ìñ œîð|*(ÿ*‚ÿ #$ÿ #$ÿî–Ö~óÝÜw{ª+»ŒÁê¤zzÌÌÌÌÌ̽½½ñññ à°CCCÿÌÌÌÅËÒ¼ˆXÿ¼ˆXÿÅËÒ4-ob3ÅËÒ=sDx¨­ÖM% ÿʹߞÚRÿM% ÿ!ÿÖùû³ÛôÉÍùŠ„/ÿSQ(ÿÉÍùÉÍùSQ(ÿSQ(ÿŠ„/ÿôÇùv|ÑñññÈÈÈ÷Ïû­Ö?þÐüû%#ÿ&éáááö7þçýfffááá:æÎ­¯Ø+É÷ùg ÁˆÚÉÍù6+ÅÇð0ñØç(þçýfff âÉCCCÿÊÊÊÍÍÍ&éááá.ïþçý0È/4:æÎCCCÿëê=Vfff555fffáááttt©©©‚‚‚ÿÝÛ²3н(ø»áÜÜÜé ·qm>ÆÆÆÃïð<=ÜÜÜÈÈÈ×°¯ÿÉïYí>ÓçNS0ü×ûYƒâ0JJJ———½½½èèèåááá ÓûÂáá6ÚëêrlCCCÿ>Óåf]Úêü×û.ÆóÍ   ———:æÎ:æÎ^<üçÿƒÔ:7Ë]ÛÒÌJJJü×û Ü ŠŠŠíZ!ÿráááììììì쎺îíZ!ÿÆÕöÈåøå>>>òÑÓüÁ¤Í:¾¾¾CCCÿ444ÿÒïÆáááM0Y:888ÄÄijЧÿ©©©½†"ÿ½†"ÿ³/ÿ…ìñÃÅó=; ûÇËÃÅó³/ÿ$$$ÿñïÔ, ÞÑÓö ,$ÐÔñïÔ,ñïÔÿ0,îÑÓö(Øþü(+)ÙÿÐüû,ÒÒà,ñïÔÛÝøSQ(ÿí1ðÎû#ÝÿÿôÔý ,ôÔýäääÌÌÌÿ /-ÅÇð5 Ëòó ð,òñ³ÚÛ!'Pÿ)×óÞä ..4üÔÍ5+þ2ýÕÍ+3ä ÝæË!ûÀæµ×¯%#ÿÿ äâM! 6'üÙüÈåøñýþßûüåüýôôôôèèè #$ÿéÿ .-àÒÓ .-àÒÓéÿóÝÜÿ êêê÷ö Ùúûø òö  ÷òö  ÷ öööòòòSQ(ÿ»½æòòòÿòòòA ÿå¿ôSQ(ÿ 2¡}Ó½‡2ÿö¨ùÈåä„ÖØ*‚ÿî–èè艅Vÿ Ï.ýÍÓ¯¯-QQÿòò½½½S*ÿ­ÖM&%ÿob3<;5=sÿ3ôñþçý4. 1v|ÑK ÿµô÷SQ(ÿ73ÉÍùCljCÊSQ(ÿ­¯Øÿòòòbbbÿëê=VJJJ¶¶¶žžžÿööö=þûµô÷ÿ 333Õ–“³ÛôÿšþÉ÷ùÐøú4-6Êýü­Ö})ÿÐüû×ÿ...ׯ–0ƒ×שּׁ¬ÿÊÊÊÕ–“µô÷ÿ3ôñ0Ðøú³ÛôCCCÿ âÉÁé èèèCCCÿáááËËË èèèÿQuÑÍúаÙvvvÿ«±Úß2vLôŸ¼“>­¯Ø€TSÿŽº»&&&ûÔÓ3..€¬­ÿ eù¤Üó">?骧0çNSááá:æÎƒ×ïÿrl‹®Úæ ð&éÚÿ&éÍ ýñ>ÅÇð”””¶¶¶žžž O'ÿõãâl ü×û)¼øsD®êÿo)Âñ-Çò"ÛÒÌ^<ááá½½½íZ!ÿÏð§û½½½³/ÿMÑé2 ÿ.:888ÈÈȶ¶¶ñØ4- ³âÌÌÌSQ(ÿ:éª§Í ýñ>73„Šßòòò})ÿ:- H¤I|«…ìñ·VÿüÙü[ß÷m8MÑé%#ÿ,ñïÔÿñïÔ -õÓá/- ùÕúã*ôÕñïÔÛÝøM% ÿ×ÿ)èØþüÿ +ëõÔù,ñØ+ùÕúØþü,ÌÌÌ0P'ÿ2ÏüÝÿÿä ñïÔÛÝøÿ?çòñçÚÚÚú(³ÚÛ!'Pÿ*øòÞä _-úÜ1$Ï53ÆÒÌÐýÿÞ+3"ÕÍÖþÿßÙ°ÿðîõGîG Êúúïèüíýþßûüãâá,.äääõ 'Ùïð'éðÒÓ'Ùïð'ÙïðóÝÜÿþìë ñýþìýþ òö  ÜÞé  öööòòòSQ(ÿ»½æ&&&ÚÚÚòòòÿ ÷èаÙŠ„/ÿ¦ÌøÐ°Ù½‡2ÿúÏüüÙýÈåäœîðèèè)T„ÿ×ÖþÖ~*‚ÿÆ–ÚÃÅú Ï.×ÖþÖ~444ÿÌÌÌ444ÿððð½½½2 ÿJQ$]+<;5‰ÐÜòÝúŠ„/ÿ÷ÏûʹßËó i; 1v|ÑSQ(ÿ73 9jCÊÿöööòòòÿ+++JJJÊÊÊììì("ÍáÝ=Vžžžÿèèèÿööö ð(³Ûô ÑÆê IDATK ÿ0:-Êýü­Ö})ÿ¨ú÷ÿôôôrluvÕ Yíƒ×ïvvvÿÍÍͽ½½K ÿ07 fû ð(³ÛôCCCÿÕÕÕèèèÿöööôôô3ôñÃòòòSQ(ÿÝÿÿаÙÿöööB÷ñÈ8/3¡}Ó¼ˆXÿDx¨ÿööößL gWéèèè€TSÿÍѹ³Ûôÿèèèÿ íì*ÃmÈ/4ËËË i:þü×ûƒ×ï2 ÿ>ÅÇðèèè!ÿõÿÿêüýÿ;9Y[„TTT O'ÿíÔýâëo)ü×ûƒ×ïRÿ£ÒÜé+¿òÿAC6ôËËËöBüÚ°})ÿþëþçNSÒÒÒ333ŠŠŠŠ„/ÿÉÍùÑÓü âÉ4- Âñ-½½½2 ÿ>73ÉÍù­¯Ø·Vÿ0CzÞ·VÿaÂýööö©H Iªå{ÿ8 W CzÞÛÝøÿÿäñïÔÿ,õÓá/- àä"ã*õÔù)èÌÌÌè³Ûôÿä×ÿÿä)¿ü ,ñØ+ùÕú(ñïÔ444ÿÏüÝÿÿÝÿÿ##üÛððð,ÿM&%ÿ&&&òñäää?(çÿ444ÿ444ÿ äÖþÿÞä "óÈÙ0$Ï2ÝÉýÿ,3"ÕÍâ( äßÙ°èèèÐøú&éáÿÊúúÊúúþëþ"áÿþæäôäääèèèèèèðððÙïððÒÓÙïð .-ÙïðóÝÜÿø ÷þÿõÿÿó òö !í,ùë+ ÿôôööö ÿ»½æECúÚÚÚTTTèèèôôôý× Þ¾çëñåA ÿ2 ÿ2 ÿSQ(ÿŠ„/ÿÇ¿9ÿ¦ÌøÐ°Ù½‡2ÿö¨ùüÙýeéí“úÿÿêçddïÄ”)*)*)T„ÿ)T„ÿ)T„ÿÆÀ\ÿ‰…Vÿ‰[Ô˜Äù Ï.×ÖþÖ~444ÿÌÌÌÌÌÌê2 ÿõåû+gÀ ”ßßüôþ#ÿ2 ÿ2 ÿŠ„/ÿ÷ÏûÌÒâ­Öþçý íì—Åî÷Ïû½‡2ÿ.îë•àM% ÿèèè|v!S*ÿ5 ôááá¶¶¶ìììáá᎔épb&ëꬬ¬ÿèèè444ÿ+++555JJJ+++èèè(g Ðøú:-ÊýüüÖç‘åýóõ+++¹¿ch^^^ƒ×ïÐüûÍÍͽ½½K ÿ07 °EL+++èèèóõ½½½½½½èèè+++555>>>+++èèèµô÷M% ÿ­¯ØÞ¾ç^^^555A;^^^èèè#ôÎûÄÌû&&&GÚh¡3^^^èèè<4ocLèèèÿ3ôñ*Öùû“úÿËËË555ü×û)ò‰'ÿ>èèèÿ">? CCCÿöööbbb #$ÿûòåâ‘åýü×ûü×û—Æžû¼øü×û£Òà,¿ËËË555üçÿ)T„ÿÿƒ×ï¹ %²­iiiÍÍÍvvvÿÉÍùôôôááá¶¶¶ôôôáááö7ÌÓö.:òÅÇðÂáᄊßÉÍù­¯Ø­¯Ø0¾ŽíÆÓöŸ>¥! H¤I W ’Ïb444ÿðððÿä,ñïÔ,ñïÔ(ØþüÿÿäÛÝø%#ÿÿÿä(Øþü(+)Ùÿ×'ùÕú+ÐÔñïÔÛÝø0OÿôÕ/-Ýÿÿ#Ýÿÿä ÌÌÌM&%ÿ³ÚÛ444ÿñïÔóõ5 ã*Öþçäää5 çäää8аÙ!'Pÿ"óÙè@d)ÐúÜ1$ÏûØÿ²%ÿNÛç6éÇïµ×¯ÿ ð( éÿ$þëþïýýñýþíýþäüýäûü÷èèèÿõ éÿ .-àÒÓ .-àÒÓ'ÙïðÌÌÌÿ êêêòôÿö  ýáõÿÿ7""þ,é ãÌÐãööö öööòòòSQ(ÿÒÒàéë&&&BBB¢¢¢èèèÿrl¦ÌøåââëÎ÷ÿúdÿ¸\ÊüÙýMÑÕÿööö¥!MÑÕÿ®¨DÃÅúÕÿÿËÐ/׬|444ÿÌÌÌ444ÿÌÌÌCCCÿ½½½A ÿúñýõåûUl)+ÚâôãûïÖø å¿ô!ÿ, ×ÿ]/­ÖM% ÿþçý,­¯Øÿ èèèÿòòòS*ÿÌÒâ=Vžžž444ÿñññ½½½M&%ÿ4-6ÆÓãÎãøµô÷bbbÿÒÒÒðððñññŠŠŠÿöööòòò{ÿ[ ¥òô¹ %½½½ÿ +++½½½CCCÿñññWWWfffK ÿOŽ‘fffvvvÿÍÍÍñññBBB$$$fffbbbÿðððñññ333$$$fff€TSÿ<4\ÀèèèK ÿø7:ñññ...666———ÕÕÕi:þ®êÿýñæJJJÂÂÂððð>>>žžžÿöööòòò O'ÿíÔý,#ôñññ...ð´q7QºÝ äà±Ùvvvÿ˜˜˜Fv×¹ËC6ôñññ...666———Áã üÚ°CCCÿ½½½vvvÿž™Æ2²­çNSžžžÿ$ûëÎ÷bbbÿÂÂÂðððôôôJJJÂÂÂRRRŠŠŠbbbÿÂÂÂððð>>>žžž})ÿƒ×ï·Vÿ0=; ?ÑúÁ/ÿÃÅóCzÞÿBßÙ°ñïÔñïÔÿ Þ/- ã*/- .. ÿä,%#ÿ,,ÿäØþüØþüùÕú×'ùÕúØþüÑÓö)ñïÔ,å% ,Ýÿÿ#ÖþÝÿÿ#ÌÌ̳ÚÛ444ÿðððÿ5 +ÖþËòóòñ5 òñ5 аÙ äÞä 6'ÏËÕþ$ÏúÜ1²%ÿNÛç6Êð!'Pÿ5 åþôòþþÜåúñÿ"$,!!èèèéÿ'àÒÓ'àÒÓ'é --Ùïð #$ÿ ôôô  îëÿø þèÖþÿýÔìÔï ÷öööööö òòòòòòòòòòòò­¯ØÛÝøòòòñïÔ˜˜˜JJJÿèèèèèèrl;9¦Ìø¦ÌøÐ°ÙаÙаٺɽ½‡2ÿ¸\ÊüÙýMÑÕMÑÕèèèèèè ³/+ÿèè讨DÃÅú Ï. Ï.ËÐ/äÏ ÛÒÌ×Öþ)T„ÿ\††ÿCCCÿ0P'ÿ444ÿ0P'ÿÌÌÌÌÌÌ444ÿ0P'ÿê½½½A ÿúñýæöéüÚâôãûúñý÷ üôþúñýA ÿM% ÿ*, *þçý)è—Åî­ÖŠ„/ÿ,þçý,73Š„/ÿòòòbbbÿ&&&&&&TTT¬¬¬ÿÂðØÕñññÚÚÚÉÆ âÉCCCÿM&%ÿ+ÊýüÎãøEbbbÿÒÒÒÌÌÌØÕñññÚÚÚÉÆìììèèèTTTCCCÿ…ìñuêî¹ %ÌÌÌâàÅ âÉCCCÿòòòööö333ñññááá©©©CCCÿµô÷©©©šššÿCCCÿºÚ±ñññÚÚÚŠŠŠÜÜÜšššÿCCCÿòñââ⊊ŠÜÜÜšššÿ€¬­ºî!ÿÖùûÖùûñññBBB¿£¢¾¾¾ÊÊÊèèè®ê®êèèèæJJJááá/-...áááöööòòòèíÔýñññBBB¬Á¤¼ø„íOíÔý O'ÿÖÖÖÿ¾¾¾òòòÛÒÌñññBBBÒÒÒ¾¾¾ÊÊÊüçÿ)T„ÿ333ŠŠŠþëþžžžŒŒŒùÜbbbÿááá/-...+++ÂÂÂ>>>ŠŠŠbbbÿááá...áááƒ×ïö©õ?ѹnèCzÞ ..4,ÿä,ÑÓöÑÓö#ùÕúÒÒà.. ñïÔðððððð,(Øýã/- (+ùÕú((ÿçÿñïÔÿ444ÿüÛä Ýÿÿ×þÿõÓáÝÿÿôÔý444ÿ0Oÿ444ÿñïÔ)èèèúÕý5 ++Ëòó³ÚÛ444ÿíó*×2Ï1É¿ئûþÊðÔ)2øò äÿËòó,.þæäïèüãâáèèèÿ #$ÿ'.-Ùïð .-ÙïðéÓÓ'ëÇÇ öööÿôôêþ ÷þÿÿôôíúß÷öÃéÞ´×þÿîë êêêöööÛÝøÒÒÒöööÿŠ„/ÿÉÍùÝÿÿаÙаÙA ÿ0P'ÿA ÿz}O1:Bs2üÙýMÑÕ³/+ÿ›Øtr(*MÑÕÿqm>c”( Ï.×ÖþïÄ”ïÄ”ëê è¾ ù¢×ÖþÍÎþ^·‚CCCÿ0P'ÿ444ÿä аÙ444ÿCCCÿóÓ¯¯A ÿúñýæèèèôãû,èèè ùñýK ÿ4.þçý6G!6G!þçý5 ô³Ûô­¯ØÉÍùèèèbbbÿñÈ...ñȶ¶¶bbbÿ½½½=VžžžÿÉÆÚÿÌÌÌòòòµô÷þçý:æÎÇ*Á IDAT+úÕýüÖçµô÷73CCCÿžžžÌÌÌÉÆÚÿÌÌÌòòòµô÷骧ǯbbbÿÒÒÒñïÔÛÝøØþü âÉhhhìììÚÚÚËËËËËËËË˽½½©©©vvvÿí ä#ÌÌÌòòòºÙ™Åé“=ÌÌÌžžž ÞÝæº¹```!ÿ!ÿÖùû/0ÍÍÍíÑÐÍÍÍáááèèè¶¶¶ÒïÆ¶¶¶âàÅáþÕåÿòòòòâ'ÍÍÍÿøÍÍÍáááíÔý O'ÿ   ÌÌÌ&Pÿüçÿ4'åÍÍÍÐòÍÍÍáááÛÒÌCCCÿŠŠŠ©žžžƒ×ïšššÿÈÈÈòòò¶¶¶ÒïÆ¶¶¶âàÅáþÕåôôôžžž¶¶¶ÒïÆ¶¶¶âàÅáþÕåÿüÙüÈåøÿÿ'úÁ/ÿÿÿ¿¹ŠOU„ÿÌÌÌ,ñØ -ñïÔ,.. ÒÒàç(ÒÒà,ñïÔ(ÑÓöØþüØýãùÕúç(Øþüã*ÿç×ÿ ,ÛÝøèèèÌÌÌбñüóèÈñä ÿää ,аÙаÙ ,ôÕüóÿÛÝø)³ÚÛ³ÚÛ³ÚÛÿççÑÓüËòó+ÅÇðèèè444ÿíó *Öþÿ"ÕÍâ(üÔÍÞä Öþÿ äÈñüÔÍÞä èèèñØËó Þúüïèü° øÀá÷Ñùûõÿõ 'ÙïðÓÓ.-'ð'ÓÓéÿÙïðõ õôðððêêê     ìýþÿôô÷êêêöõ ÿÿÿÿ&&&ÚÚÚòòòÿÿrl=; ÝÿÿôÔýA ÿ0P'ÿèÈñkB¥ÿ¾Î¶WUÿ³/+ÿ³/+ÿ'eéí(ŒŽJ©«ÿ®¨D×ÖþÖ~èèè ë껌Á½½½ä ÌÌÌÌÌÌÌÌÌ444ÿñññ½½½½½½óâú湕ëÕÿþ 2 ÿýñ  ý× µô÷4.­Ö6G!×ÿÿÿÿÉÍù73³ÛôÿÅÇðÉÍùŠ„/ÿÿÿñÈÌÒâÌÌÌ­ÖñÈñÈžžžÿ5 ôÚÿ(ÿÚÿÐüûÿŠ„/ÿËòóƒ×ï³ÚÛÉÍùŠ„/ÿ½½½ÿÿÚÿ(ÿÚÿÐüû¶¶¶ÿðððÂÂÂCCCÿÿÿ})ÿÛÝøÿóõ})ÿŠŠŠáááÿ½½½òòòÿ½½½ÍÍÍbbbÿÿÿSQ(ÿÿè­¯ØÿÿôÕôÎû_ƒ-ÿÿÿ€TSÿ<4€¬­ÿÿ¤ÐѼˆXÿ   ½½½ßûüßûü÷÷`MIõݽ½½½½½÷ÞÂÁ:æÎò‰'ÿÿ;9>­¯ØèèèÛÝøærlÿÿûòåóÝÜÌÌÌ>Ó:æÎòÝú>Ó:æÎóÝÜóÝÜà±ÙvvvÿŠŠŠ&PÿüçÿÌÙ:æÎ>ÓÐòüçÿÁã :æÎò|Øüçÿ&Pÿ½½½})ÿWðëžžžÿ{ÿÿÿšššÿ©©©žžž;9>­¯ØèèèÛÝøærlÿ>åèèèÛÝøærlÿ W  öööööö0öööèèèM% ÿã*$ÑÓöÛÝø444ÿñïÔ,ñïÔÿÿä,ñïÔ,ñØç(ñØç(ñïÔ(Øýã,ñïÔÛÝøM&%ÿËòó5 ³ÚÛ%#ÿ,äää;9ÅÇðèèèM&%ÿ³ÚÛ444ÿñïÔ,ÌÌÌÿ 8 äíó ääää ÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛÿ ðÿ'êÚã(Óâþå åþõûå-é×ÿÿäÛÝø444ÿÙïð .-ëÇÇõ 'Ùïðéÿ'ÙïðóÝÜ444ÿäääööö ööö õêê þìëø òö èèèÿööö&&&...ÒÒÒÚÚÚòòòÿööö 3þoC#¦ÌøëñåóÍ èèèÿ¯y$ö¨ù(*:55ã¡'aÂêèèèÿööö{wH Ï.×ÖþÖ~*‚ÿ)*32¤zz444ÿÌÌÌCCCÿ½½½ÿö î å¿ôÿöööPc&‘½Ý 8%ÈÛäôãûå¿ôÿrl÷Ïû—Åîi; 1Ž”éèèèÿööö|v!ÉÍùÅÇðöööEC73Ž”éèèèÿi; 1Ž”éööösE 1Ž”éèèèÿööö?þËó ööö?þ³ÛôÿöööEC»½æ eù›ïöööEC­¯Øÿööö?þËó ööö?þËó èèèÿööö?þØþüóõöööú(Ëó èèèÿööö öööòòòÿöööECÝþçåãúæöööñå>ÅÇðèèèÿ®zJÄÌû˜ÄÅööö\0/<4‡»ë½½½ÿööösD¼ø i:þq7&ñèèèÿ;973Ž”éöööEC73Ž”éèèèÿöööòòòRÿ¼øòòò})ÿ)ü×ûƒ×ïÿööösDü×û‘åý i:þq7&ñèèèÿöööm‘åým‘åý èèèÿ;973Ž”éöööEC73Ž”éèèèÿ;973Ž”éöööEC73Ž”éèèèÿööö©H 0Qˆì¯xQˆìòòòÿööö%#ÿÛÝø%#ÿ,ÌÌÌ%#ÿ,ðððÿä,ððð)èØþü/- ÑÓö(Øþü,ñïÔÿÿä,ñïÔ,ÌÌÌM&%ÿ³ÚÛÿ5 ³ÚÛÿèèè444ÿäääèèèM&%ÿËòóèèèM&%ÿ³ÚÛ444ÿÌÌÌM&%ÿËòóèèèM&%ÿËòóèèèÿ5 Ëòóèèèÿ ðÛÝø%#ÿÿôôô ôôôèèè #$ÿóÝÜ #$ÿóÝÜ #$ÿ'ÙïðóÝÜ #$ÿóÝÜÿäää ôôô êêê èèèÿèèèÿèèèÿööö èèèÿööö 3þóÍ èèèÿööö¯y$úÏüüÙýeéíèèèÿööö555FB Ï.×Öþ ù¢1`32¼’’èèè444ÿÌÌÌÿòÿì*óÍPc&Õÿþ¼¾ß ôãûý× èèèÿi;»äsE—Åîèèèÿööö èèèÿööösE»ä ööösE­Öÿööö èèèÿööö èèèÿööö ööö èèèÿööö ööö èèèÿööö ööö èèèÿööö ööö ööö öööòòòÿööö ööö èèèÿööö ööö èèèÿööö ööö öööEC»½æEC­¯ØÿööösDü×û‘åý èèèÿöööo)¼ø öööo‘åý èèèÿöööEC»½æEC­¯ØÿEC»½æEC­¯Øÿööö¯xúÐùW¸ó èèè&Pÿ!ý¸,ñïÔ,ÌÌÌ444ÿñïÔ,ÌÌÌ0P'ÿаÙ%#ÿÛÝø%#ÿÛÝø444ÿñïÔ(Øýã,ñïÔÛÝø0P'ÿôÔýñïÔ,ÌÌÌÿèèèM&%ÿËòóèèèM&%ÿ³ÚÛÿ5 ³ÚÛÿÌÌÌM&%ÿ³ÚÛÿ5 ËòóèèèÿèèèM&%ÿ³ÚÛÿèèèÿèèèÿ5 ËòóÌÌÌ #$ÿóÝÜ #$ÿóÝÜ #$ÿóÝÜ444ÿÌÌÌÿèèèÿèèèÿèèè444ÿäääèèèÿèèèÿèèèÿèèèÿ+++FB Ï.×Öþî–èèèÿ)ôý× ööö Gk¼¾ßý× èèèÿööö èèèÿèèèÿööö èèèÿèèèÿèèèÿèèèŸ|iY IDATÿèèèÿèèèÿèèèÿèèèÿèèèÿèèè€ÿÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿeù)—Æèèèÿööö èèèÿ;9­¯Øÿööö èèèÿööö©H aÂýèèèÿ444ÿ444ÿ!ÿM% ÿ444ÿCCCÿvvvÿCCCÿbbbÿCCCÿbbbÿM% ÿ2 ÿM% ÿM% ÿvvvÿšššÿ444ÿCCCÿ$$$ÿ444ÿ+++......K ÿK ÿ¼ˆXÿM% ÿ{ÿ³/ÿbbbÿvvvÿÿÿÿK ÿS*ÿúÁ/ÿúÁ/ÿÿÿÿM% ÿ`N&¤eO444ÿBBB¬¬¬ÿ 2ÿÿbbbÿ444ÿ444ÿM% ÿM% ÿRÿM% ÿM% ÿ âÉ®®®CCCÿvvvÿM% ÿiiiJJJM% ÿM% ÿ¼ˆXÿM% ÿM% ÿ!ÿ!ÿvvvÿ½½½!'PÿÿÒÒÒbbbÿÿK ÿšššÿþçýM% ÿõåû#ÿ2 ÿ2 ÿM% ÿ4.ocL¬¬¬ÿŠŠŠl ÿé%ÿ 2ÿ”ÿÈÈÈ444ÿÌÌÌšššÿbbbÿÿÿRÿRÿñññÿáááM% ÿM% ÿq|OM% ÿ4.?Èåø²­ŠŠŠbbbÿM% ÿM% ÿâ~|?ÿK ÿ÷ö6G!M% ÿ¼ˆXÿS*ÿ;5.ÂÇ)‡’ûúÁ/ÿ©H ?öööÿÔàøp71...ìììÕ§~ÿûåOžžžxxx444ÿÌÌÌM% ÿ4.ocLRÿ6ocLM% ÿ4.ocLáááÍÍͼˆXÿÿþçýܬܬM% ÿj1"ocLl ÿÅËÒM% ÿ4.ocL!ÿ, `N&CCCÿ Aÿíç¾sEÌÌÌ444ÿÿsE6G!šššÿfffµô÷þçýM% ÿÿÿ2 ÿ s0$l!!ëÎ÷þçý;5.ÅËÒÿÿTTTK ÿl ÿBÓc;M% ÿS*ÿÿ”ÿJø¼oÄšššÿÒÒÒ¶šššÿç¹ñÈÿ?þsEvvvÿCCCÿK ÿY ÿ%#ÿÌÓöÌÓöM% ÿÌÌÌCCCÿÕÕÕocL3/GM% ÿÄÌûi10þçýDx¨;5.S*ÿ;5.AtI…ìñžžžocL4.M% ÿÈÉi10=þûÿÃ`N&;5.þçý;5.%#ÿM% ÿ¼ˆXÿ¼ˆXÿþÊyn‡’ûÊýü4-èèèÿ444ÿ÷ÉÏ'޽444ÿbbbÿ444ÿ骧ñÈp71ÿ ÷M!õ444ÿþçý;5.¼ˆXÿÌÓö2*ûÎÖþçý;5.áááöööLZ³ƒ IDATbbbÿÖÖÖÿVYÅËÒ¦Ú šššÿ¼ˆXÿ³Ûô2*ûÎÖÿ²ÿ—Åîþçý;5.*4.p71333ÍÍÍ?þŠŠŠÚÚÚ=þû;5.Gpfffµô÷444ÿvvvÿbbbÿÿK)QÿÿsE®zJ #ÿëÎ÷6Ú;5.;5.bbbÿÖÖÖÿVYÅËÒá8šššÿÿi;òòòµô÷”ïó;5.bbbÿM% ÿM% ÿÿòòòçl;5.ÈÈÈÌÌÌWWW;5.;5.bbbÿ4.p71ÖÖÖÿvvvÿŠŠŠ½½½K ÿdy'M% ÿ¼ˆXÿ(ocLocL4- äääáááñññèèè<42 ÿ0P'ÿCCCÿ¤ÐÑÊýþÙbbbÿ\À;5.{ÿûÎÑ´;5.CCCÿS*ÿM% ÿÍѹÆÓÓM% ÿ÷öû×þR†¶ÖùûM% ÿ‘´ÅËÒ(‘´ÅËÒDx¨CCCÿ¥Ü@‡’ûá8bbbÿvvvÿÂðû×þ555bbbÿvvvÿ5 ôäää...áááÌÌÌM% ÿû×þ\›±M% ÿÿèñòö /¸ÌÌÌTTT...ÿÖÖÖÿVYÅËÒ¦Ú šššÿ¬¬¬ÿÅËÒK ÿì÷§¿ûÇèl ÿ ÿ¿ ûÅËÒN¬ñå]/˜d4Dx¨òòòJJJ沂JJJJJJ<<<l ÿÅËÒ= ÿl ÿ÷§¿ûÇèl ÿšþºô÷”ïóèèèÖÖÖÿVYÅËÒ¦Ú šššÿ¼ˆXÿM% ÿ= ÿÖùûû×þ0{©M% ÿÿvvvÿÍÍͽ½½ÿ!/¸®zJS*ÿÿÿOŽ‘ÅËÒ~~~M% ÿK ÿM% ÿK ÿocLMö¾¾¾žžž39åÔòû$ÅËÒ ÿ¿ ûÅËÒN¬2 ÿCCCÿbbbÿÒÒÒ«}TJJJJJJ<<<ÿsE;5.ÿM% ÿÅËÒi›°0ÿM% ÿšššÿžžžÿÿÿ—Åîÿÿþçýèèèÿÿ‘´R†¶ÿM% ÿÿÒÒÒñññi bbbÿÖÖÖÿÈÈÈÅËÒ¦Ú 888šššÿÿÂðR¹èvvvÿÿCCCÿvvvÿmmmŠŠŠÍ (EÄÌøÅʾ³ÛôÅËÒ®êèèèÞÂÁÌÌÌÿtÈÏÄÌûocLJQ$Œ81€TSÿCCCÿÒÒÒbbbÿèèèDx¨ľô4.³/ÿ·VÿM% ÿR†¶R†¶4.ËËË;5.S*ÿM% ÿþçýØþü*+þçýM% ÿöööí )*ÿM% ÿþçýØþüÌÒâþçý³Ûô­ÖCCCÿtttvvvÿëêììì*+ׯ–½‡2ÿ¤eOäää³á +++ááá>çM% ÿþçý)ØþüþçýñŠ[ÿèñÜÑûäÍÿÿëêsE   JJJ<<<šššÿ­Öÿg Î$F l ÿS*ÿ  &9#;5.Dx¨bbbÿÅËÒÊÊÊ+Y‚«}T¼ˆXÿÑùûúÁåÎ$F ºô÷”ïóÖÖÖžžž­Öžžž"î¾ÅËÒCCCÿ4.)þçý¼ˆXÿsE˜˜˜½½½ÿ®zJíç¾Ñûä × Aÿ AÿM% ÿÅËÒ»äS*ÿ®zJi;±roʹß5 ôËó Ã4.q|OʹßÌÌÌÿµû ÜÌÓûÌÓûîë #ÿS*ÿ  &9#¼ˆXÿÿbbbÿñññžžžÌÌ̼ˆXÿÊÊÊ»äbbb888sE;5.Dx¨TPÿ?þÔàøÌÓû åþocL¼ˆXÿS*ÿ©©©M% ÿ5 ôöööööö5 ôØþüÍ %#ÿ?þ4.?þocL¼ˆXÿsEÌÌÌÌÌÌ888   ("»—Õ<<<ÈÈÈ444ÿS*ÿ¤p@ôôôÕÕÕááá Ý´ööö333ŠŠŠ½½½ÿööö»ä»ä³ÛôÌÓöRÿRÿ‘´ÿìM% ÿRÿRÿ›ƒTh<;åââ°üÔtÈÏ=BBBÃïðñññ‚#!ááá…ìñ F 1Êìºô÷™ïó”ïó¶¶¶¬¬¬ÿ¬¬¬ÿ¬¬¬ÿÅËÒUƒ¬iii;5.ðåü ²Ú*Öùû‘´S*ÿÌÒâòòòM% ÿsEÅËÒsEÁéHéHé4.­ÖòòòS*ÿ;5.\À»äÃÍ Ëó ööösE;5.Dx¨‘´JøÁèéob3?;5.§VOs0$”ßßÞ¾ç®zJ¬¬¬ÌÌÌÅËÒ;5. Ý´ òòò­ÖDx¨ÿùÕúÔàøãâáËó Dx¨S*ÿÅËһ佽½³Ûô4. Áé 4.S*ÿ!ÿ&éèèèÿ\0"Øþüú»ä?þËó ÅËÒS*ÿR†¶—ÅîÌÌÌÈÈÈžžžììììòYFl›¡c沂888...³á ÅËÒ¤p@˜d4 Ý´5 ? S*ÿ³ÛôÌÓö4- ÌÓöe}¬<4k"JåââåââÑÍú•Þ¶¼ˆXÿ€¬­½½½ÍÍÍáááðððÊýþ=Èåø8ÅËÒ¼ˆXÿS*ÿ6G!4.‘´;5.ÅËÒmüßûüÖùûþçýüâünÍÏ3/GöööÌÓû4-sEÖùûþçýööö¼ˆXÿÅËÒµô÷Öùû&éþçý<<<ÄÄÄÈÈÈFâúÏü ¿£¢ÉÆ¿£¢Áé­ÖÊýü½‡2ÿ...ÉÏöööÚÚÚÚÚÚñŠ[ÿM% ÿp71ÁéüâüþçýÖùûßûü­ÖñŠ[ÿÿèñÁéËó ÌÒâ­Öòòò¬¬¬ÿÊÊÊÒÒÒìììáááÜÜÜxxxÄÄÄTTTÍ ™ïóºô÷µô÷Í µô÷ßûül ÿÿSQ(ÿZ473uv5¼ˆXÿÅËÒаÙùÜùÜÚÇÝ»i6- IDATñññððð'ż¶ô|±­ÖìììÿÑùû…ìñ™ïóºô÷µô÷Í ÒÒÒ———lll£ÑúÄÄÄ———¼ˆXÿ‘´Ãöøüâü*Öùûßûü³ÛôÌÒâ³ÛôÌÒâ±í»ä ööö»ä±í¸­ÖDx¨+++i:þ5 ôòòò­ÖDx¨µô÷ÌÓû®zJsE4--Dx¨ÅËÒ;5.§VOŒ81®zJÅËÒDx¨òòò­Ö»ä¤p@ä{?þØþüçõ4- ööö­Ö»äòòòèèè¯x5 ôèèèÌÒâM% ÿ`N&6G!;5.éë&éú4- ööö­Ö—ÅîòòòèèèÈÈÈžžžÒÒÒììì|„ÜÜÜhœÌ"î¾888bbbÿÌÌÌ­ÖÅËÒi;ÅËÒ£Ñú»äS*ÿÿS*ÿÿÿÿM&%ÿS*ÿM% ÿM% ÿM% ÿRÿK ÿ¼ˆXÿÿ ÿ2 ÿ¼ˆXÿ0P'ÿ€TSÿÿÿÿ$$$ÿ$$$ÿ¼ˆXÿK ÿ³/ÿ{ÿ·Vÿ¼ˆXÿ¼ˆXÿM% ÿ¼ˆXÿ¼ˆXÿM% ÿK ÿ!ÿM% ÿ$$$ÿ¶WUÿðŒŠÿÿÿÿM&%ÿÿ!ÿM% ÿÿ¼ˆXÿK ÿ!ÿK ÿK ÿÿÿS*ÿbbbÿ¬¬¬ÿšššÿÖÖÖÿÖÖÖÿ$$$ÿ¼ˆXÿS*ÿS*ÿS*ÿ$$$ÿÿ½‡2ÿÿS*ÿS*ÿbbbÿ$$$ÿ$$$ÿÿÿ444ÿCCCÿ444ÿS*ÿÿS*ÿM% ÿÿM% ÿ!ÿK ÿS*ÿM% ÿÿÿ 2ÿÿÿÿÿ¼ˆXÿ¬¬¬ÿ$$$ÿò‰'ÿÿù7ÿò‰'ÿ444ÿl ÿ²ÿ!ÿ!ÿl ÿ·Vÿ¼ˆXÿÿ0P'ÿSQ(ÿÿúdÿ$$$ÿSQ(ÿSQ(ÿ¼ˆXÿ ÿ ÿ#ÿ¬¬¬ÿbbbÿCCCÿ444ÿCCCÿ444ÿ¬¬¬ÿ¬¬¬ÿ!ÿ!ÿl ÿ·Vÿ·Vÿò‰'ÿ444ÿS*ÿM% ÿ!ÿK ÿÿÿÿÿÿÿÿÿ AÿCCCÿÿÿ ÿM% ÿM% ÿK ÿÿK%ÿÿS*ÿÿÿM&%ÿ¼ˆXÿS*ÿ ÿ ÿ ÿÿÿCCCÿ444ÿ¬¬¬ÿÿTPÿM% ÿÿS*ÿS*ÿÿCCCÿS*ÿM% ÿÿÿÿÿÿS*ÿÿÿM% ÿ¼ˆXÿ!ÿK ÿ%#ÿÿò‰'ÿÿù7ÿò‰'ÿ444ÿšššÿbbbÿM% ÿ$$$ÿM% ÿ%#ÿK ÿS*ÿÿvvvÿÖÖÖÿS*ÿ£Ñú ËòóØþüʺóÚÿòÿì ÿ€¬­ÿ öööôôôÄÌûK ÿ0˜ÝòľôDx¨Dx¨ÁéR†¶R†¶ÁéÿK ÿþçý)èJ©«ÆËËTTTÁèé÷öòòòÖÖÖÿþʽ†"ÿÃ*ÞžžŸ`]ÈÈÈŒŒŒ'èåÅËÒ;5.ÿ»äÌÒâ'èå?þhœÖ=þûM% ÿÌÒâááá>>>­Ö&&&bbbÿ³Ûô?þþçýK ÿ»ä4.èñòö ÿÅËÒTTTQº5;ý`É+...”ïó9*8 F ÿIªåDx¨8ëñ勊Ë/-­¯Ø­¯ØÅËÒ#ÿ ÷ #ÿžžž½½½BBBiiiÌÌÌbbbÿTTTbbbÿ*8 F ÿŒí(}Þ`É+...ÌÒâM% ÿþçýK ÿ Aÿ ÷ÇÔÁŒŒŒ555 0P'ÿM% ÿþçý³Ûôµô÷èèèÕúþòû$»ä³ã d€Ë­Ö ÿ   0P'ÿÿÿhhhiiiÌÌÌbbbÿöööùÕúÔàø÷öÌÒâöõšššÿÌÒâÿòòòÿèèèèèè ²ÚöööÔàø‘´`N&Öùû(sDÿ444ÿQº5;ý`É+...žžžM% ÿþçýýáàþçý&éÚÿʹßòòòŠŠŠmmmvvvÿ­ÖôôôsEêêêèèè­Ö-/JØþüþçýFI&éÄÌû&9#ÄÌûÖþ8%#ÿ h<;ôôô€¬­h#µô÷>>JJJžžžÿiiiJJJú(Øþüüâüõÿÿ õÿÿ;5.i;ÕÕÕžžžžžžòòò!ÿ³Ûô®zJ;5.i;ÿ444ÿ$$$ÊÊÊ$$$ÜÜÜ$$$BBBCCCÿÿÿ5 ôÉÏßûüÅËÒ4-½½½ÿööösEÌÓûÁèésE­Öÿööö?þç(ÚÚÚ i;;5.„±µô÷ÿ5 ôËó 5 ô³Ûôÿööö?þþçýÍ ööö?þ³Ûôÿ5 ô³Ûôÿööö=þû³Ûôÿi;;5.\Àööö®zJÅËÒ—ÅîèèèÿöööòòòðŒŠÿ(ŒŽööö¨IG:55tvÿööö÷ö*à èèèM% ÿ³ÛôS*ÿ­Öÿ3ôñËó èèèÿ5 ôþçýµô÷ÿööö=þûÖùû÷ööö÷ö*µô÷ÿööö=þûËó ööö?þ4.ʹßÍ èèèÿ3ôñËó ööö?þþçýÍ èèè444ÿÌÌÌÿ íì, Ëó ööö555ÞÂÁßûüÿ èèèÿöööòö  ÷òö ûå ÷òö  ÷òû$÷ÎÿèèèÿØÕø7:JJJÊÊÊŠŠŠÿ3ôñg ™ïóÍ èèèÿööö"B#ÅÇðèèèÿööö=þûËó öööø=éÍ èèèÿööö=þûËó ööö=þûËó èèèÿ3ôñ07 ™ïó!”ïóÿ^^^666ÊÊÊÍÍÍJJJÊÊÊŠŠŠÿ íì, Ëó ööö íì, ³Ûôÿèèèÿööö öööòòòK ÿÚÿóõööö ööö=þûËó èèèÿð +,ÕßÒ+æÚÿ(Ëó èèè%#ÿóõööö ööö=þûËó èèèÿööö=þûËó ööö=þûËó èèè%#ÿ åþããúñýþí öõ (Éß÷èèèÿ ðüâü÷ööö÷öóõèèèÿú&éÁéú(Áé èèèÿ...888ÊÊÊŠŠŠÿ íì, Áé íì, Ëó èèèÿööösE—Åîèèèÿ5 ôocLÅËÒ—Åîèèèÿ5 ô³Ûôÿ5 ôþçýÃ?þþçýµô÷ÿööö?þÁé?þþçýµô÷M% ÿËó ööö?þ³ÛôÿööösE;5.R†¶®zJ\Àèèèÿööö?þi2IX·¹òòò¶WUÿJ©«ÿööö=þûÃòòòÿ5 ôÁé ööö ööö÷öí ÷ößûüÿööö?þÁé=þûËó èèèÿööö=þûÁé=þûËó èèèÿööö?þÔàø÷ööö÷öí öööòö  ÷òû$ûå ÷ öööòòòÿööö=þûÖùûí =þûø7:½½½ÿööö=þûÖùû*Í èèèÿèèèÿööö=þûÁé=þûËó èèèÿ3ôñÁé ööö=þûÍ èèèÿööö=þûÖùû*0ÐøúÍ  íìßûüÿööö=þû+jm666ÊÊÊÍÍÍ333ÍÍͽ½½ÿ?þÔàø÷ööö/üúäûüí èèèÿ5 ôÔàøí ?þÔàøí ú(Áé=þûÚÿ(Áé öööú+æÓãîë èèèÿ ð(Áé=þûÚÿ(Ëó èèèÿ3ôñÁé ööö=þûÍ èèèÿ3ôñåüýÞöõ5Éß÷èèèÿ5 ôØþü(Áé öööú(Áé 3ôñÚÿéë=þûËó èèèÿööö=þûÖùûí TTT888©©©½½½ÿ?þÔàø÷ööö/üúäûü÷èèèÿèèèÿèèèÿööö èèèÿèèèÿèèèÿööö èèèÿööö ööö èèèÿ3ôñà èèèÿööö èèèÿööö 5 ôËó èèèÿööö?þËó èèèÿööö÷ö÷ööö èèèÿöööòö èèèÿööö èèèÿööö èèèÿööö èèè!Úsµ IDATÿèèèÿèèèÿööö èèèÿööö ^^^ÍÍÍÕÕÕèèèÿööö÷ö÷€ÿööö èèèM% ÿËó ööö 3ôñ³Ûôÿööö èèèÿèèèÿööö èèèÿööö èèèÿèèèÿèèèÿ5 ôããúèèèèÿèèèÿèèèÿ5 ôÁé èèèÿööö èèèÿööö÷ö÷ööö èèèCCCÿCCCÿ¬¬¬ÿCCCÿM% ÿ0ÿÿÿCCCÿbbbÿ!ÿ!ÿK ÿ²ÿ{ÿ444ÿM&%ÿ444ÿbbbÿvvvÿCCCÿšššÿ444ÿ$$$ÿ$$$ÿ444ÿšššÿCCCÿbbbÿCCCÿM&%ÿM&%ÿM&%ÿšššÿ444ÿšššÿCCCÿM&%ÿM&%ÿÿOÿM&%ÿM&%ÿM&%ÿM&%ÿM&%ÿÿCCCÿ|*(ÿ|*(ÿM&%ÿM&%ÿ|*(ÿM&%ÿCCCÿ444ÿ444ÿ2 ÿ+ƒÿ$$$ÿ$$$ÿ$$$ÿ$$$ÿ444ÿ2 ÿM&%ÿ³/ÿ})ÿ&PÿS*ÿ444ÿM% ÿY ÿ³/+ÿ})ÿM&%ÿS*ÿ444ÿ·V.ÿ¼ˆXÿM% ÿRÿiiiCCCÿbbbÿÖÖÖÿbbbÿˆˆˆ!'Pÿÿ444ÿiii444ÿS*ÿS*ÿÐøú?>çšššÿžžž!ÿ`N&`N&µô÷™ïó7 ²ÿ{ÿ444ÿ444ÿCCCÿM&%ÿM&%ÿ{,Rÿ{,RÿM&%ÿM&%ÿÿÿÌÌÌ444ÿÿÿ666ÿÿ444ÿšššÿÈÈÈÌÌÌÿ‚ÿ444ÿ444ÿ444ÿiiiJJJWWW/M&%ÿ ÿ ÿ/M&%ÿ•‘~ê÷ÿç¹ âÉÿÿMtuòû$}‹K/Áèé0ÿ|*(ÿ/ÿ Oÿ444ÿ444ÿCCCÿÿËËËM&%ÿ|*(ÿ@^0ÿ0ÿM&%ÿ|*(ÿ/@^0|*(ÿ³ÚÛ·V.ÿ¼ˆXÿÿ·V.ÿ¼ˆXÿ444ÿáþÕáþÕùzüÍñåêêêêêêáþÕ8ô0ì:+ 6M&%ÿÿrÿüÚ°&Pÿ&PÿÒþþ= ÿ”L'ðua%*íSQ(ÿM% ÿÌÓû444ÿÌÌÌÊýüûÎÖ4- ÓþüTTT333ÿÿÿJJJCCCÿááámmmJJJÌÌÌÿíç¾sEÌÌ̶¶¶ÌÌÌM% ÿS*ÿK ÿÌÒâM% ÿããúbbbÿvvvÿvvvÿCCCÿÿÿÿÿÁèéCCCÿÿÿ¬¬¬ÿfffp71p71CCCÿ¬¬¬ÿbbbÿCCCÿ{ÿg 99…ìñØÕƒ"úÅŽ+M&%ÿ.-M&%ÿK)Qÿ­› <*Ü•Ýþ,M&%ÿ.-M&%ÿM% ÿsE®zJÿÿÒÒÒfff444ÿ·V.ÿ·V.ÿ·V.ÿ¼ˆXÿÿÿsE®zJÿÿòòòŸ>¼ˆXÿÌÌÌ444ÿPPPÒÒÒ444ÿ>çñññ444ÿÿrFE⬠444ÿ444ÿ444ÿððð<<<CCCÿšššÿbbbÿCCCÿܬܬ{ÿbbbÿbbbÿM&%ÿ³ÚÛ ÿÜ#@$#„ÖØ/M&%ÿbbbÿbbbÿM&%ÿÿ<=[ßã°D7šššÿvvvÿbbbÿbbbÿvvvÿöööÌÒâÿbbbÿbbbÿÿ©H ®zJÿ³ÚÛtttC:âŽÏâá©H Œ€R³ÚÛÑüý;,/M&%ÿ 2ÿ©H ¼{ BBB...ËËËÿ®zJ?bbbÿCCCÿÿ³ÚÛÑüý¥ÛÜ/M&%ÿK ÿÛŒ€R³ÚÛÑüý¥ÛÜÅËÒM&%ÿ”¶ÛûÎÖ·V.ÿÿòû$ÿ2*ûÎÖ444ÿáþÕùz õGüÍ,ÿÕùÜ©H ®zJíó õGp1 g:+ &Pÿ 2ÿ©H ¼uæüÚ°&Pÿ­µûIõÝ4,ñ^´Ck!ÅÌå-úÕý})ÿþçýØýãñØM% ÿ–ÏÞ0OÿM% ÿÓþü¬°î˜˜˜sEÿ?þsEbbbÿËËË>ç®Gbbbÿˆˆˆòý3?þÿ¬¬¬K ÿÿ0ÿ4.ʹß{ÿS*ÿ4.Ðøúáááìììׯ–½½½ÿ?þsEÿ TTT»äÕÕÕöööžžžTTTbbbÿ¬¬¬ÿ÷ÉÏ'޽ñññ¶¶¶ÒÒÒCCCÿ…ìñ›ö2*l ÿg ;4i ñññMtuM&%ÿþ,åÔ½•ÿÄÖ$Mß9,-«h³ÚÛ4.ÿÿ»äR†¶ ðððÈÈÈÌÌÌM% ÿ”¶Ûj¯ÖM% ÿûÎÖòòòòòò;5.ÿ?þsECCCÿááá444ÿûÎÖxxxJJJÌÌÌ>çwpcÍÒÒˆ‘Æÿðððññ0Ñ©õ IDATñ>çmmmWWW©©©ÅËÒ÷§¿ááážžžÖÖÖÿ©©©M&%ÿ/Ñüýóþþd3..M&%ÿ/CCCÿ888Áèé ëÄÃTTTÒÒÒÈÈÈÍÍÍžžžñÈ$$$Ëó JJJëêS*ÿööö2*ûÎÖèèè444ÿÿòû$ËËËÑüýåüý2*ûÎÖ„ß Ü2*ûÎÖIPÿááásE—ÉÐÁèéáááÕÕÕsE³ÚÛR†¶„ÖØ³ÚÛåüýÓc;ûÎÖK ÿÿÔßßí —ÅîÑüý³ÚÛM% ÿÃW¸àK ÿM% ÿM% ÿ·V.ÿ”¶Ûÿÿ&PÿèñMÚ©H ÿvvvÿÍÍÍK ÿM% ÿð$TõV~K ÿM% ÿáþÕ,ÿÕ2*ð$T[Ø*å¹þæä gó™òÏð/&PÿüÚ°ûå2*ÞBrÿ&PÿòÈ3úݳÛôÀá÷})ÿûØçTë6úÁå0ìÎåé(+ç(%#ÿM% ÿþçýÌÒâã*ÞÔ÷þçý!ÿ-S*ÿ?þ%#ÿÌÒâ%#ÿM% ÿsEèèè444ÿvvvÿ ÌÒâCªÙÖÖÖÿvvvÿbbbÿJJJÌÌÌÿ!/¸òòòsE= ÿ4.¼·ÞY ÿÿY ÿ= ÿŸ>K ÿÝúü×úûÌÒâÂöù›ðôK ÿÌÒ⯵ܞžžþçýS*ÿCCCÿÌÒâêêêÿvvvÿöööêêêáááöööTTTxxxCCCÿbbbÿááálll...áááÌÌÌbbbÿiiižžž{ÿì÷§¿üÙý|*(ÿ²ÿF Q¹ ÒÒÒñññM&%ÿ¸¸¸}—;Mtu)0-W¸à¹âmD888¦q;M&%ÿnHM&%ÿ»äÿêêêááá444ÿÔàøK ÿÅÔú”¶ÛM% ÿÿÿ‘´R†¶ÿ ÌÒâÿÿ333¶¶¶½½½bbbÿxxx}Þ« 4šššÿÿšššÿˆˆˆÌÌ̽½½ÂðK½Èþäääÿ3..Žº»k>çwpc½½½>çáááÈåø6yECCCÿÄÄĽ½½M&%ÿ/*+/M&%ÿ ÿf òÙº¸Œÿ/*+M&%ÿ€TSÿááá~~~888TTTêêêËòó¶¶¶áááÕÕÕ³‹rŒŒŒööö=VáááÌÒâ444ÿ444ÿÿÿôô÷§¿rþV444ÿìó444ÿöööÔßßñýþ‘žÍj¯Ö!ÿÿ³ÚÛW¸à×þÿ Oÿòû$÷§¿I³ÔüÿIPÿM&%ÿ444ÿìììÕÕÕ­ÖúÕý èèèòòòí !ÿÿñýþ÷§¿j¯ÖÖùû3ôñí òòòèèè³ÚÛ·V.ÿM% ÿþçý=þûÖùûþçýK ÿþçý”¶ÛÖùûÿÿèñ"9üãâûåj1"2*òòòììì½½½ÿþçý¶¶¶ØþüùzüÍ,ÿÕ/0ìð$TÑ}eÏâáËøúÖùûQKÚÏðÿÑüý&Pÿ 2ÿ ÷ÞBbOð &Pÿ444ÿÃöøÐýÝäãf Bqû86EñïÔ,ÌÌÌÛÝøããúÖùûþçýÞÔ÷âþåüý¯µÜ³ÛôÌÒâM% ÿ&éú4.Øþü&éS*ÿ—ÅîMöììì^^^4....    Ý´¬¬¬bbbÿíç¾Ñûä × Aÿ!ÿÌÒâÙúû×úûÌÒâÐøú´ô÷ íì= ÿÈ÷ùIªÒ0ÿ ÝúüÀÝö0ÔàøK ½½½6G!M% ÿÌÒâ5554.ö7ŒŒŒ Ý´M% ÿ ËËË  TTTÂÂÂêêêËËËÿžžž>çi;äää³á +++ááá>çM% ÿJJJTTTK ÿÐøúG YAE”b7ºô÷NãêáááÌÌ̳ÚÛûÔÓ¢× ¸¸¸ûÔÓ7mDððð7ÈÈÈ¢× ,-¢× ³Œ‹³ÚÛöööòòòËËËßûüÖùûßûüÖùûþçý;,ÖùûÔàøM% ÿÿ4.öööÿÿööö4.Ëó ?þÿ666žžžxxxÒÒÒÈÈÈšššÿbbbÿ®zJtttÌÌÌ444ÿñññûâþÿjòøÍÒÒòö êò°âãNððð»äC–ñññÌÌÌ©©©ÿ¼ˆXÿ>çúÁå8Î$¼ˆXÿËËËfff³ÚÛÑüýÁàà×þÿ= ÿ0Î$äüýÍ÷ùM&%ÿÁààÑüý³ÚÛ´àáôôô‚‚‚ÈÈȶ¶¶?ööö ñññËËËÌÒâ×ÿÈÈÈŒŒŒ¬¬¬áááÕÕÕ³Ûôö7šššÿìó444ÿìókÎ$ó×ÿ)T„ÿ\††ÿððð444ÿå ìó444ÿ©H ñÿ¿òàßõÿÿ\$ –QöööÿÜÜé+üãÜÎ$ãþÔüÿM&%ÿ×þÿM&%ÿ444ÿBBBáááöööòòòÁèé+++ÕÕÕÌÒâS*ÿòòòí \$ Î$¦º&í Ãòòò”¶Û!ÿããúÖùû=þû!ÖùûÖùûµô÷µô÷ßûüÿÿèìÿûåüçÿûå ÷IªÒDx¨bbbÿÒÒÒ3ôñþçýÖùû¶¶¶ ¯«µô÷&éM% ÿüÍ,ÿÕ/‘åýo¡zy:- ø ÐýÑüýçüÚ°ÿûå&&&ÈÈÈž§Ðÿ þÔà,èûÍ3%#ÿÛÝø%#ÿW íê^ Éúùš÷×þÿÿä(³ÚÛ0ÿ D ºÓôâþ, ³Ûô0ÿ³Ûôÿ3ôñÚÿ(Ëó 5 ô³ÛôS*ÿ—Åî...ÒÒÒBBBׯ–4.p71v¥ÿòòòS*ÿ±í ÷ èèèÿ5 ôÁé þìë÷þÿ0Ðøúí /üúÃöøl ÿÑùûäûü÷ íì*Âöùóþþ%#ÿVñ…ìñM% ÿ4.­ÖCCCÿááá§§§ŒŒŒ×¯–³Ûôÿööö ööö555½½½ñŠ[ÿ'޽ÚÚÚã|M'޽5 ô=VžžžK ÿ07 š÷úi10ìî½½½444ÿÌÌÌM&%ÿ/æ8:888ÈÈÈÈÆæ8:888fffÿ èèèÿòòòÿöööòòò!ÿK µô÷, ³ÛôÿêêêòòòÿöööòòòM% ÿÁé?þÁé?þÁésE—ÅîèèèbbbÿJJJܬDx¨ÿèèèÿòö  ÷ têï¡þô 4)óÌÌ̼ˆXÿDx¨{ÿ8MÑéS*ÿ;5.ÅËÒ­ÖM&%ÿðäãäûüäüýäüý³ÚÛ€TSÿÃïðWWWPPP:::ôôô5 <=ÒÒÒäääJJJžžžšššÿ©©©ËËË555ÕÕÕöööòòòbbbÿáááÝ äå ìóå õ Pó×ÿcÌ ÝùÈžžü+ 3àÍûå ÌÌÌM&%ÿj0 _®Õ í =þûÖùûí =þûµô÷ 2ÿÜòÿA¿òÿAMÖ³ÚÛCCCÿÕÕÕèèèÿòòòM% ÿÁéòòòÿsD¼ø÷ößûü!ÿÐøúÿ^ÿµô÷, ³ÛôÿòÿA÷È"9üãâÜòû$Üòòòÿòòò¼ˆXÿûÎÖj¯Ößûüÿ^ÿµô÷ßûüK ÿµô÷444ÿíó,ÿÕÔßßí ©H ”¶îÃêêê÷ö"L,ÿÕÈ äëÎ÷ 2ÿÜŒŒŒÈÈȬ¬¬òû$ @Þ33*µÑÌÛÝøM% ÿ444ÿÿÑüýõ;’õ eéþæä+ÿäÛÝø³ÚÛK ÿµô÷ºÓô", J ³ÛôØþüèèèÚÿ&éþçýèèè³ÛôñŠ[ÿÌÒâöööäääÒÒÒBBBŠŠŠ³Ûôp71v¥?þS*ÿ¸sEòý3 ÿèèèþçý èèè 0Ùúû ßûüßûüòòòÃöøáÿí èèèí lJ åþ…ìñ³Ûôʹ߽½½ááጌŒ˜˜˜S*ÿM% ÿèèèòòò 555öööv¥ÙrCÚÚÚÚÚÚ0{©5 ôËó ³Ûôžžž7 ™ïó˜ÝÞe÷ñk®¯ÕÕÕÌÌ̳ÚÛ³ÚÛÑüýÈÆÈÈÈ888Ñüýžžžfff èèè ÿèèè©H í K µô÷, þçýK ÿM% ÿêêêÿöööòòò4.Áé4.?þÌÒâööö¬¬¬ˆˆˆ¶¶¶bbb\Àèèè  ÷ ÷ têô¿õüvÑZ IDATéëÍûâÌÌÌ444ÿR†¶Dx¨,»ä­Ö³ÚÛäûüßûüÛäüýäüý³ÚÛ€¬­=ÈÈÈ Áèé¶¶¶...5 ëÄÚššÿÿ©©©ËËËòòòòòòÕÕÕöööCCCÿ½½½å Nø—<7_õ Pó×ÿ )@[ÝùÀ¥ý0`8bb_¨fwÔ 3ÌÌÌËòóW¸àø õÿÿ÷öÃÃí Í M&%ÿÜ=þû÷öòû$}¿³ç*ÿ &&&ÿÁéhhh555 ¼ø÷ÐøúsDG ’*³ÛôöB÷ÈÜ Oÿ©H ÿ„±j¯Ößûü÷ö¢ýí µô÷lJ%ÌÌÌ,ÿÕÔßßí ÆÓö X?í Ï^ õGûå ÈÈȶ¶¶òû$ÜöÀ è¾3*3M% ÿ,âÐÏÿä×þÿ´ÞÞd6F ÑÓüÿñïÔM&%ÿ%#ÿ6G!=é)¿üÖýµô÷/- M% ÿéëÃÃÉÏ×ÿöööÚÚÚ˜˜˜Áév¥M% ÿ4.­ÖÍÌÒâ 8òý3µô÷èèèí zLø èèè4.µô÷òòòÿôô”¶îKýÐøúñññ¢¢¢ ³ÛôÌÒâÿ +++öööÕÕÕ555êêêËËËÿÉÏã|M÷öÿäÐ…W¤eOèèèµô÷NãêÍ ÖùûMÜ!Ñ„#èèèM&%ÿ/ÑüýÈÈȸ¸¸èèèÿööööööòòò–ÏÞTTT.‰A]^×ÿÖùûÖùûj1"·V.ÿÿ÷ö=þû?þ òòòS*ÿÌÒâ ÌÒâ³ÛôËó òòòTTTÚÚÚ¬¬¬TTTòòòèèèòòòø÷Œûâèèè ëÌÌÌòòò{ÿþëþiiibbbÿòòòDx¨äûüßûüìýþäûü5 ÃöøÃöøáááôôô555ööö×þÿËòóÈÈÈÿÿŒŒŒËËËòòòšššÿ^^^TTT555CCCÿ½½½žžžÌÌÌàÍûrþVÍÎþó×ÿäÕ}ó×ÿÍÎþÀ¥ýù¡ó×ÿÀ¥ýª]÷iùùô²444ÿèñòòòø í =þû èèè³ÚÛòòò)µô÷\$ sDIä§û·Iß³ÚÛËËËèèèöööäää&&&ÿòòòÍÍÍ333èèè÷öèèèÐøúʺó¦ßôšöõK ÿÿòö üçÿ ÷ûåüçÿ¿òû$¿–ÏÞòòòµô÷ßûü!ÿ*Ký?þK ÿIªÒ!'PÿÔ+í o:- rz Bû3ù†ßÙ° 2ÿ ÷òö ööö÷Îòòòܯy$ÒÒà7! ,)ÌÓöM! ÿé)è)ÛÝøØýã,­Öµô÷Öùûòþþ-Øþüÿ?þúM% ÿ)èTTT555&&&ÖÖÖÿòòò=V»äÁéèó) ×ÿ= ÿ"úø”¶î^ÿ= ÿ­Ö!ÿËøúäüý0ÿþçýÿâÐÏðî³Ûô³Ûôÿ +++½½½òòòöööËËË ÿ ðÌÒâÉÏ`N& ;ÆÌÓv¥3ôñ*ZÔÀ”ïÿM&%ÿ×þÿÑüýMtuHHH,-M&%ÿM&%ÿÿ òòòÿÁéK ÿ骧¿tqëê'èå, *IªÒIªÒööö÷ÃÁéêêêèèèÌÒâ³Ûôêêêöööêêê³ÛôèèèbbbÿðððTTTžžžvvvÿbbbÿ444ÿèèèþôÿèèèòòò {ÿçNSÌÌ̶¶¶Z&öS*ÿßûüìýþÑùû³ÚÛÃöøâ°°°ôôô+++òòòÒÒÒ>>>èè謬¬555èèèêêêÿÈÈÈòòòç¹ììì âÉ O'ÿå ׬|äÕ}üÍó×ÿ )ôôôäÕ}äÕ}à±ÙÌÌÌÜòòòòòòòòò÷öÖùû3ôñ³ÚÛ‘åý²œ½9%ï,)òòòIªÒòòòÿ öööÚÚÚòòò½½½CCCÿK ÿK ÿÖùûòþþK ÿ"9üãüãÜÁéÿ!ÿ*ÖùûòþþK ÿßÙ°,ÿÕÔ+sE‘åýÆÓöކçêêêÑüý,ÿÕüÍ2 ÿ÷ΩH $ òö ÌÕþÿöB_¤Q2þ¦ÍÖÿèûÍØýãÿç(ñØ0ìþép1 Äè×þÿ%#ÿ444ÿÛÝøÌÌÌK ÿÖùûþçýM% ÿÛÝø5 ôØþü &éØþüK ÿ­ÖËó ...ÉÆñØ^^^vvvÿJJJòòòÿòö  ÷Íèó)þìëóþþæüýËøúµô÷óþþ!ÿK ÿ÷þÿµô÷"úøø ÚÚÚæüýÿöööÕÕÕòòòèèè!ÿ5 ô,ç(­Ö­Ö½½½–ÏÞñŠ[ÿÿÖùûg šþM&%ÿ×þÿ)<=ììì^)óHHH/×þÿM&%ÿÿ èèèèèè ÿòòò!ÿåüýÈ÷ùþçýÚÿÿ555 öööêêêÿ³ÛôòòòbbbÿJJJ¦¦¦JJJxxxòòò ööö?çNSñÈžžžÅËÒ;5.!ÿ0M&%ÿžžž=ŠŠŠžžžòñÒÒÒòòòñññšššÿêêêÿŒŒŒžžžM% ÿëêììì âÉ4.å ÌÌÌ׬|üÍV£ –ÏÞËó ööö©H –ÏÞËó èèèÿêêêòòòÿööö ööö=þûÍ èèèÿŸ>aÂêööö?þj1"–ÏÞËó èèèÿöööòö *ûâõèèèÿööö=þûËó ööö=þûËó èèèÿöööÿôôäüýäüýÃöøÿ...áááÕÕÕööö&&&¶¶¶JJJžžžÿJJJáááËËËTTTžžž)T„ÿó×ÿcÌ 4öcÌ ™!‹èèèÿööö÷öìýþ òòòÿöööòÿA÷È 8ãþIÏÈèèèÿööö ööö èèèCCCÿ½½½ÿööö÷ö*Öùûí òòòÿèèèÿ5 ôj1"aÂêööö©H –ÏÞËó ööö÷ö÷5 ôj1"IªÒÿööö©H –ÏÞËó ðððôôôöööoÎãøÃ÷ö*Í  ñå+áþÕëÎ÷ÿöööòö  ÷òö æèèè&PÿüÚ°%#ÿ&ëçÔàø0ì£ßå(ç(ñïÔÛÝøÿ5 ôj1"–ÏÞÁé?þ4.¤ÐÞóõèèèÿööö èèèÿ&&&...¬¬¬&&&...¬¬¬ èèèÿöööòý3 ×èó)Í èèèÿööö÷öí èèèÿööö èèèÿööö=þûÁé=þûËó èèèÿööö öööòòòÿ555iii———ËËË èèèÿööö=þûÖùû*!ßûüÍ èèèÿööö>>>888¸¸¸ÆÆÆèèèÿöööòòòÿŸ>–ÏÞÁé èèèÿööö ööö èèèÿööö=þûÁé=þûËó èèèÿŸ>–ÏÞÁéòòòÿöööòö  þô ë èèèÿ3ôñÁé ööö=þûµô÷ÿöööÿôô0äûüäüýäûü÷èèèÿJJJ888ttt èèèÿöööTTTáááËËË +++ááá½½½ÿ6AñññÌÌÌM&%ÿ×þÿ'-d9§zòŒÁ–f?jš×¬|*‚ÿ)*׬|bbbÿžžž_ƒ-ÿ7: jCÊS*ÿ­Öan'üg3=“ôÔýêöê•ê€Þ[œ—ÅîÒÌÒd|c ;;Vb/3ëÎÙµô÷K ÿÚÿÛÝøßûüRÿ®êÿööö ++++++ÿÆÆÆ›eéíšššÿfffbbbÿJJJƒù}žžžÿJJJáááñññ888444ÿááábbbÿžžž‰…Vÿ<<5;?ubbbÿ¶¶¶­©sžž888áááÿ¶¶¶JJ“CCCÿÈÈÈWWW½½½šššÿïë¼w{ªbbbÿJJJ888c_)±µÜžžžÅÁ‹ÿ;?uCCCÿ½½½M&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿöCÿ ãâ×þÿM&%ÿ³ÚÛ|*(ÿprŽþ ÿ×þÿôôô 555ÕÕÕèèM&%ÿþæä’ŒprâŽM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ.îê7÷ñ Ê ÿêç8ëüþCCCÿñããÆÓðžžž444ÿÌÌÌfffÜÜÜ$$$ííí­­­-QQÿÓ¯¯\††ÿËËËòòê ÕÙbbbÿïë¼áááJJJ888­©sááááááfffšššÿCCCÿ+'ñw{ªðð𸸸_c™bbbÿÕÙCCCÿCCCÿbbbÿÆÀ\ÿSQ(ÿSQ(ÿCCCÿ³ÚÛM&%ÿ¶WUÿÆÀ\ÿ³ÚÛM&%ÿM&%ÿöiii¶ö)³ÚÛÑüýâŽprÖùûX¥n í¦Þ—¨ IDAT M% ÿþæä¥ÛÜÃŒŒŒâބ֨CCCÿ³ÚÛ/M&%ÿM&%ÿM&%ÿM&%ÿe÷ñ7 É÷ùÉ÷ù^ %CCCÿCCCÿñññññññññbbbÿ444ÿfffšššÿÜÜÜšššììì®®®®®®ÈÈÈ­­­ÌÌÌ444ÿ-QQÿ-QQÿ-ÿÐç½½áááããÒÅÅsu@ããÌÌÌM&%ÿ/ê60ÿ ðŒŠÿ=]_9,-%(%(üÏÎ12Ÿ53M&%ÿ444ÿ444ÿòòÛÿÿê-QQÿ-QQÿøBCñññ/Ø/Ø<4 9*ŠŠÅ»“ÎøÎÔ4ÜÿÑÄÄËÒÒÒ444ÿ444ÿ444ÿËËËËËËöööòö ÷ÿôü ö  ¾¾555×þÿW.0d9§qf©þXïa?g‘BhÈñœ*)dÖ×ï¿ÌöNžžžêêêÿ¬¬¬ÿllllllJJJ¬¬¬ÿ0P'ÿ_ƒ-ÿ¡}Ó¡}ÓаÙ_ƒ-ÿаÙ¡}ÓаÙèèè¡}ÓúÁ<ÿCyΗÅîúÁ<ÿ½‡2ÿ"+øÎÔÖþh÷555Gp©©©À£ïLÚYÒÙøÄ”ÿ(ëÎ÷Úÿ(ʺó(6F &éØþüþçý ³îK ÿÖÖÖÿžžžÖÖÖÿÿ ññññññ^^^àŠŠŠ“ÂäääñññbbbÿCCCÿšššÿCCCÿÅÁ‹ÿRRRÿ½½½TTTäääôôô›ÒÒÒÕÕÕ½½½|*(ÿRRRÿÕÙ¾¾¾âââ:::ï뼉…Vÿbbbÿ›ŸÎÈÈÈšššÿÅÁ‹ÿšššÿ'#ô›ŸÎŠŠŠ¡×½½½fffÅÁ‹ÿ‚~H;?užžž...ÆÆÆ...¢¢¢žžžfffÅÁ‹ÿ½½½ëÄÃ}ÔÚ>so4:ááábbbÿM&%ÿi10öUW…NɶWUÿM&%ÿ³ÚÛM&%ÿÉÆˆˆˆRJª¶/|*(ÿM&%ÿ³ÚÛ±roZ ’äæÄÌôÂÂÂööö4- Öùûí ázu¨úüM&%ÿ½‡2ÿšššÿCCCÿ½½½M&%ÿÑüý/|*(ÿëèþæäþæäÿÿÿ{ÿ{ÿe÷ñÊ É÷ùHõð'T |*(ÿM&%ÿCCCÿñññðððððððððððð444ÿžžžšššÿ...©©©ššš¾¾¾...ÂÂÂ>>>888¶¶¶Ó¯¯-QQÿããòò«¯Þñññ÷ÓÓù!ºŠÓ¯¯ÌÌÌ tbbVZ%(üÏÎŒžžÏÐÏÐ12üÏÎ¥¨³ÚÛM&%ÿùùê45gn9gn9Ó¯¯ÌÌÌñññ~¨g<4Ìþ$»“ÎøÎÔ<4<4:Y÷ÇÖøÎÔ...ððð444ÿÚÚÚõÚÌ òû$òû$òö  ÷  "-!S|óññññññ³ÚÛ'-ÒúÓ46¦=0_—V:::øòþÖ®G9¶dÖ×Û”Ã×ÖþæAÂÂÂbbbÿTTTèèèèèèlllˆˆˆbbbÿаÙ¡}Ó7: _ƒ-ÿ½‡2ÿS*ÿ?ÄèèèWÜCyν‡2ÿS*ÿ0P'ÿ.4.¥¼ÐýËòó íì\$ q‰ç¸|¼ø?/;,yúù.4.ÒÌÒаÙK ÿÚÿüâü*4- ʺóµô÷K ÿFIð´áLžžžÿööö äää ôôô½½½‰…VÿÉÍüÆÆÆ^^^®®®ea2#'VTTTÿ ööö{wH“ÂðððRRR¢¢¢öööòòò|*(ÿ„ÖØ444ÿHHH+'ñ;?uÅÁ‹ÿ_c™RRRÜÜÜHHHfff‰…Vÿw{ªbbbÿááá½½½vvvÿ૯Þ...žžžÅÁ‹ÿ;?uCCCÿ½½½vvvÿ˜˜˜>>>žžžÅÁ‹ÿ¡×žžžšššÿ+'ñ;?ubbbÿc_)SW+++½½½bbbÿ'#ôw{ªšššÿ³Œ‹×þÿWWW,&¶jÌÑüý/Ñüý³ÚÛ|*(ÿ:--üÇÖ¢1‡fɳÚÛM&%ÿöááá>>>ÒÒÒxxxÐ~|Ñüý³ÚÛM&%ÿÔßßí ÷ö, ÁésD¼ø÷ö*Öùûí ?³ÚÛvvvÿ666îîîÜÜÜÍÍͽ½½M&%ÿ/ÿêç7 É÷ùÐøúÖùû*µô÷M&%ÿe÷ñÊ ÿêçZøóÝ ü?ZÁ¦ðÉûÑüý³ÚÛ444ÿùòòññññññê13Ö°ßÌÌÌbbbÿÍÍÍñññBBB666îîîPPP°°°ššš½½½444ÿù\4›ŸÎùI%%æÑËË\4¤ÌûÓ¯¯é%ÿ%(12üÏÎÏÐp1012üÏÎþÛØcðõ³ÚÛCCCÿ½½½CCCÿÛÿÿ45Å{z444ÿÌÌÌ444ÿÌÌÌCCCÿFB4Ü 9*9;5¾Œ¡Bv•ÆÄÄÄÄËøÎÔÑÿ(®®®444ÿÚÚÚ=CÒæþãúãÜ$ûùÜ +++½½½M&%ÿb<ÓœÇYÙûÓ‹>ÔÍÈ0u`3ÿ/Œm:ÒÇýÛ”Ã×Öþ)*×ÖþÖ~¬¬¬ÿ¶¶¶žžž¬¬¬ÿTTT¬¬¬ÿTTT¬¬¬ÿlllèè謬¬ÿTTT_ƒ-ÿÑÍú/3¹•ë8аÙ_ƒ-ÿ¡}ÓS*ÿ­Öÿ¥oCyÎS*ÿ­Öÿ¥oCyÎä ³'Áèé í ¤Ü󩩩ʺó=þûËòóÑüýyúù.4.ÒÌÒаÙ%#ÿ&éí ÖùûØþüʺóµô÷ϳ²éª§ÌÓöð´ öööäääÚÚÚäääôôô...ÕÕÕšššÿº¾íZZZèè芊Šea2#'VÊÊÊTTTÿöööD>>>$$$ööö ¶WUÿ„ÖØšššÿ$$$©©©;?uÕÙ...ìììÒÒÒ¸¸¸ÉÍü888½½½vvvÿÍÍÍ#'Vw{ªÌÌÌ888½½½CCCÿšššÿàTTT>>>žžžÕÙffffff~‚¸‡‡‡ÿ%%%ÕÙSW­©sñññ444ÿ888w{ª³Œ‹Mtu½½½ÈÈȇfÉpr/Ñüý³ÚÛM&%ÿÑüýÆÓÓ°D7^dȳÚÛ³ÚÛ9çåRRR—`ýBBB———Ñüý×þÿM&%ÿM&%ÿ×þÿí =þûÁé?þ¼ø÷ö[%$1*³ÚÛÿG¼e`Ê$$$ÕÕÕbbbÿCCCÿÿ³ÚÛÏâá8rF!ßûüµô÷!ÿK ÿe÷ñ› r6óîZøó8?ZÅÍôðÑüý³ÚÛÌÌÌÓ¯¯ñññêêA13ÏÍüÌÌÌÌÌÌÒÒÒ$$$xxxttt>>>PPP©©©ÌÌ̽½½ÌÌÌÓ¯¯/55=; -- --ùZ66¢ªuY…PÑËË«¯ÞTÙÛãcðõþÛØù™“ÊüýúLNtbb1277 h512’ôøŸ53³ÚÛCCCÿñññ½½½ñññÛÿÿgn945ÍÌÅ{z444ÿ444ÿÌÌÌíñ Ìþ$ÃÅú¾Œ¡ 9* 9*þÊ:<<=;4Ü³á ®®®ÌÌÌ&&&øòÃå½û Éãúãûåòö ü öS|+++½½½M&%ÿ/ÌÊZ1×X:Ä7n ÒÇýÛ”Ã×Öþ$ú¢TÕÖ~TTTžžžlllÿêêêÿ¶¶¶JJJ¬¬¬ÿ¬¬¬ÿTTTÿ¹•ë/3ÑÍúèÈñ_ƒ-ÿ0P'ÿ¡}Ó­ÖS*ÿÿ[‘潇2ÿúÁ<ÿ½‡2ÿâ©$ÄÌøÌÌÌÒÌÒ.4.PvG ,sEí :æÎÖùûr{)8È äÒÌÒаÙ&é³ÛôÃßûü(ʺóµô÷ÔàøRÿ*¢N4- ÌÓöèèè ÚÚÚÚÚÚ...¶¶¶èèèvvvÿšššÿfffiii¦¦¦¬¬¬ÿw{ª¦¦¦ŠŠŠèèèööö{wHÜÜÜäää¶¶¶ïë¼ ÆÓÓÿÿM&%ÿvvvÿfff‚~HCCCÿ‰…Vÿ¸¸¸®®®ááá>>>®®®®®®‰…VÿšššÿfffŠŠŠˆˆˆšššÅÁ‹ÿÕÙ½½½©©©<<5ááážžžï뼞žž½½½yyyyyyfffos©­©sos©äääÅÁ‹ÿ©©©³ÚÛ³Œ‹WWWëÄóÚÛâŽÑüý³ÚÛ³ÚÛ„ÖØëÄÃ)³ÚÛM&%ÿÑüýÍÍÍ+bÅÍÍÍ/)³ÚÛ)=þûÙZtw7v IDAT pa7Ñüýµô÷×þÿM&%ÿCCCÿ+++¹ïDÛ†­²He`ÊJJJ¶¶¶½½½èèèÑüýñýþÈèø!ÿ!ÿ÷Í › ×þÿXÿêçHõðg /ûÑúø¬÷ûÇû‰ ááá÷ÓÓññññññòòÏÍüÏÍüòò444ÿ444ÿššš888888***×××xxx°°°°°°§§§êêêÿCCCÿ444ÿ£u g‘õñññÌÌ̡מžž+++vvvÿÅÁ‹ÿ©©©M&%ÿ³ÚÛ×°¯TdÆŠŠŠ³ÚÛM&%ÿM&%ÿ×þÿ1Ñüýf *í ‡e°Öùû_²×|*(ÿM&%ÿ7³ÚÛÿÕÕÕ+++TTTÕÕÕÍÍÍ¥Û0iiiááá¶¶¶CCCÿÿòòò÷ö¦ñõa×뎺îÃ=þû íì÷!ÿ6óîo!É÷ùcñ³äöø¬÷ûÑú%ýÛý/e÷ñM&%ÿCCCÿ½½½áááòòããÏÍüCCCÿÌÌ̽½½ñññ¾¾¾$$$PPPPPPììì°°°ŒŒŒðððñññ½½½ù¾½òÌË13I%%ãã«¯Þ --¤Ìû³ÚÛÊÐÏÐ]š›6Dr ÿÐ:-- ËÆtvÌÌÌRRRÿñññáááããòÌËRRRÿCCCÿñññÌÌÌ444ÿÑÿ(øÎÔ2,Ìþ$6#í˜/Øñññ½½½ÌÌÌ+++ÕÕÕËËËæãõÈü öôôôññññññ½½½ÌÌ̳ÚÛ×þÿ™áDõÝ¥3Ë9: ÛÚú^`¢ÆÓöu`Œí(¶¶¶””””””¶¶¶TTT¶¶¶¡}Ó0P'ÿå¿ô)ôÑÍúfmGkèèè_ƒ-ÿ_ƒ-ÿâ©$¥oi;[‘æ¥o¥o[‘æ—Åî—Å2ÿ0P'ÿаÙÿ÷ö`M¼ø=þûµô÷0P'ÿåââëÎ÷ÿööö?þÁé=þûÚÿóõèèèÿñññÚÚÚôôôÕÕÕèè艅Vÿw{ªRRRÿ73w{ªRRRÿ®®®ÿööö...¶¶¶ ôôôÚÚÚòòò¶WUÿäCE<<<ÄÄÄ<<<ŒŒŒžžž¶WUÿJ©«vvvÿ666ˆˆˆ333666***^^^ÌÌ̶WUÿÆÓÓ„ÖØ|*(ÿæ8:áááññññññ...ÒÒÒÌÌÌÿêêêòòòšššÿfffÅÁ‹ÿ;?ušššÿÜÜÜŠŠŠšššÿfffbbbÿžžžÅÁ‹ÿ¡×žžžšššÿ¸¸¸®®®444ÿUQ"w{ªšššÿfff‰…VÿÙÝ žžžCCCÿWWW+'ñ;?u|*(ÿÑüý/p0 5«Òí ?þÁé÷ö*17ÉûýÑüý³ÚÛÿööö¯y$[‘æ+++ÕÕÕööö555ÕÕÕ+++½½½ÿ íì÷ íì÷3ôñà èèèÿèèè|*(ÿ„ÖØM&%ÿe÷ñ:+ Ïð5ô› ³ÚÛ444ÿêããùòòñññ½½½CCCÿ½½½CCCÿiii>>>ÙÙÙÄÄÄÛÛÛ½½½-QQÿããððð --45!89í"¥¥÷ÓÓea2w{ªM&%ÿ/77%(Ï.0ÿÐúÏýýØÖš÷ú³ÚÛRRRÿñññáááQRòÌËòòñññÌÌÌ444ÿMö2,vv;ÇÅË9;5ŠŠÅøÎÔÑÿ(âââ®®®CCCÿËËËAãúãK×Í  ½½½444ÿÌÌÌ2 ÿåãú04 6: =; ò·×EøÈøÅÍôIªåÿ”””¶¶¶¶¶¶”””TTT–½6ÿjCÊÿGk¹•ëèèè_ƒ-ÿÑÍúèÈñ87 ÄÌø­Öÿ¥o[‘æâ©$WÜi;<4CyÎ2 ÿаÙÿ\$ <4 Öùû2 ÿåââëÎ÷èèèèèè Øþü?þÃóõJJJÿÿÿöööäää ööö#'V›ŸÎ‰…Vÿ¬¬¬ÿ®®®RRRÿÿÒÒÒ:::ÚÚÚÿÿÿM&%ÿbÁý»888wPO½»888BBBžžžÆÓÓvvvÿŠŠŠ «©ÌÌÌÕÕÕ´²lll***ÌÌÌJ©«„ÖØ¶WUÿTõó½½½ÌÌÌ ãâHöô¶¶¶žžžÌÌÌÿ n nòòòòòòšššÿ~~~ÿÿÿ±µëvvvÿÜÜÜŠŠŠ¸¸¸¬¬¬ÿ888¡×žžžfff®®®73ÿÌÌÌ«¯ÞÅÁ‹ÿfffíñ áááÈÈÈÕÙÅÁ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑüýf 7_lÍMå IDAT²×?þÁé÷öÃÏâáÑüý³ÚÛèèè †¼öööËËË+++ ÕÕÕèèè½½½ íìßûü íì÷ íìÃà èèè„ÖØM&%ÿr'/m › ³ÚÛÌÌ̽½½ããòòðððê½½½½½½444ÿCCCÿšššÿWWW>>>ÂÂÂééé%%%ááá½½½-QQÿ-QQÿããÌÌÌ --òÌË1¥¥Òª@Òª@ea2w{ªÑüýš÷úÉùûÊüýÿÐÄÌûýØÖ9,-M&%ÿCCCÿâââY:òòááá444ÿ444ÿÑÿ(Ñÿ(øÎÔÇÅËâââÌÌÌâââËËËòû$ãõÈK×Ù ññññññCCCÿ444ÿÌÌÌ2 ÿ04 åãú×EøÈøB« ÆÓö444ÿèèè”””lllÂÂÂÿÉÆ÷0P'ÿ)ô¹•빕ëÑÍúGkÿÑÍúèÈñèèèаÙCyÎCyέÖ[‘æÃÆö—Åî[‘æÿ¯xQˆìo‘åý=þûµô÷0P'ÿаÙÿöööTTT¶¶¶ööö èèèÿ ÕÕÕññññññäääèè謬¬ÿ¦¦¦®®®ÿ+++ÕÕÕ:::ÆÆÆèèèÿ ÚÚÚôôôðððäääèèèÿèèèÿèèè|*(ÿ„ÖØÿööö¨IGX·¹¨IGX·¹ ž?=bÁÃèèèÿööö¨IGbÁÞ?=bÁÃèèèÿž?=bÁÃööö¨IGÆÓÓ’äæòòòÿöööhhh$$$ttt èèèvvvÿŠŠŠÿJJJðððÆÆÆèèèšššÿfffÅÁ‹ÿ;?uCCCÿWWW©©©½½½šššÿ©©©ÕÕÕèèèbbbÿžžž‰…Vÿw{ªÿèèèÿööö èèèÿööö èèè|*(ÿ7nÖÙí sD<4 ::÷ÆÆÄÌôÌÓöŸ5&aÌó³ÚÛÿ+++ÕÕÕèèèÿèèè!ÿ÷ íì÷èèèM&%ÿf ò:+ `Ì×þÿ)³ÚÛ444ÿ½½½CCCÿñññÌÌÌbbbÿ888PPPËËË®®®CCCÿ½½½444ÿùÓ¯¯444ÿ(RR89™’ÇÒª@o-QQÿÓ¯¯M&%ÿ³ÚÛM&%ÿ ÒR(úÏý—ÏМÿø6;aËͳÚÛCCCÿáááðððùããðððÌÌÌ444ÿÌÌÌS*ÿ~¨gŠŠÅøÎÔ³á ÌÌÌ444ÿñññËËËo:- aÂýðððÌÌÌ2 ÿò +ëåãúKQÐÌõÊr ð)»Íl1}ÞÌÌ̬¬¬ÿlll”””TTTÿ”””TTT_ƒ-ÿ¹•ë)ôý× Gk¹•ëGk¹•ëGk¹•ëèè轇2ÿCyÎÿ¥oÄÌø—ÅîèèèÿööösDÌÓöÁésD¼ø÷öœgžñåëÎ÷ÿèèèÿèèèÿööö&&&ËËË&&&$$$¢¢¢:::ñññÕÕÕööö555ÕÕÕèèèÿ&&&ðððÚÚÚ ööö&&&ÌÌÌÿèèèÿèèèÿèèèÿèèèÿööö èèèÿ+++iiiÝÙªíñ ¢¢¢öööhhh666lllèèèšššÿšššÌÌÌÿ‚‚‚~~~èèèÿqm>w{ªÿ+++‚~H_c™ôôôèèèÿJJJŠŠŠÿ^^^ÍÍÍÕÕÕèèèÿèèèM&%ÿÔßß, 4- ¼ø555333ׯ–f š÷ú³ÚÛÿèèè!ÿßûüÿèèè444ÿûã:+ `̳ÚÛM&%ÿ³ÚÛ-QQÿ13ÏÍüÓ¯¯444ÿÌÌÌCCCÿ€€€ŸŸŸáááŠŠŠ‰…Vÿw{ªiÀÁÿõÄ”¢|«‰…Vÿw{ª444ÿÌÌÌM&%ÿ³ÚÛM&%ÿi10ÊýþüÖÕÑüý³ÚÛé%ÿÛã444ÿðððù45òÌËòòñññÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿ>çEm2ÔÚ>ïë¼øÎÔÑÿ(/سá ÌÌÌCCCÿ½½½444ÿ:æÎ:- mÎ ÌÌÌ0Oÿ04 ÐÌõåãú£©$'ÉüøÈø‹ êƒ×ïÿJJJžžžÿJJJ¶¶¶èèè_ƒ-ÿ¹•ëèèèÿGk¡}Ó½‡2ÿ[‘æèèèÿèè轇2ÿ[‘æ¥oCyÎÿööö¯xÀ£ï‘åý¯xÄÌôü×û@][’öýñëÎ÷ÿèèèÿèèèÿöööŒŒŒšššfffÜÜܘ˜˜hhh¾¾¾fffšššÚÚÚòòòÿèèèÿèèèÿöööhhhÍÍÍñññBBB¢¢¢ööö&&&fffšššffffffÿèèèÿ+++333¢¢¢èèèÿ‚‚‚ÈÈȶ¶¶ööö&&&...888ÈÈȶ¶¶èèèÿ‚‚‚šššäääööö{wHº¾íËËË JJJ'#ôÙÝ žžžÿööö555FBíñ ¢¢¢èèèÿ5 Áè錌ŒÜÜܘ˜˜÷ö*Ëó ‚‚‚©©©½½½ÿèèè|*(ÿ7ïš÷e÷ñNãêCCCÿáááÌÌÌ444ÿWWWPPP°°°ÜÜÜÍÍͽ½½bbbÿžžžÿû‘ÿŠŠÅ¤Ìûç³á ËÇ]cgÑððð/ØÂð½½½444ÿ/Ø­Ö444ÿ¾UóB« ÌÌÌ0OÿåãúåãúëÎ÷–½&ÿ\ÌwÙ¬¬¬ÿTTTÿèèè_ƒ-ÿ¡}Ó½‡2ÿCyÎÿi;­Öÿööö öööo›ïèèèÿööö èèèÿèèèÿèèèšššÿfffÿèèèÿ‚‚‚šššäääèèèÿ‚‚‚©©©½½½vvvÿàÙÝ ¶¶¶ööö èèèÿöööuŠ- IDAT ööö èèèM&%ÿe÷ñ› ³ÚÛ€ÿCCCÿáááÌÌÌ444ÿfffšššÌÌÌ-QQÿ13¢|«444ÿÌÌÌì[Xÿ¥¨444ÿùÓ¯¯444ÿÌÌÌ444ÿññññññÌÌÌ444ÿÌÌÌRRRÿ®®®444ÿÌÌÌ2 ÿëÎ÷–½&ÿjCÚ¬¬¬ÿ¶¶¶žžž_ƒ-ÿ7: š“ñаÙS*ÿ­Ö½‡2ÿCyÎ-QQÿ{ÿM&%ÿÿÿÿÿÿÿÿ #ÿÿÿÿ #ÿz0„ÿ!'Pÿ!ÿ!ÿÿÿÿK ÿÿÿÿ{ÿÿM&%ÿM&%ÿ³/+ÿM&%ÿìZ2ÿ|*(ÿK ÿÿÿK ÿ³/+ÿK ÿK ÿ|*(ÿM&%ÿíZ!ÿ{ÿ!ÿÿÿM&%ÿM&%ÿ|*(ÿ|*(ÿê60ÿÿÿÿì[Xÿ|*(ÿðŒŠÿ|*(ÿM&%ÿ!ÿK ÿK ÿM&%ÿÿÿ!ÿM&%ÿK ÿK ÿ|*(ÿM&%ÿM&%ÿK ÿ²ÿé%ÿ¶WUÿé%ÿCCCÿvvvÿšššÿÖÖÖÿÍýþÿCCCÿÃÃÃÿCCCÿÿÿÿÿ\††ÿ-QQÿÿ&Pÿ-QQÿM&%ÿM&%ÿ{ÿM&%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ #ÿÿz0„ÿz0„ÿ!'Pÿz0„ÿ!'PÿM&%ÿM&%ÿÿ!ÿ{ÿÿ!ÿÿÿ!ÿÿÿ{ÿK ÿÿÿÿÿ{ÿ!ÿ!ÿM&%ÿK ÿÿò‰'ÿÿò‰'ÿÿÿ|*(ÿM&%ÿ³/+ÿ³/+ÿ³/+ÿK ÿ{ÿ{ÿ²ÿM&%ÿbbbÿ444ÿ½†"ÿK ÿšššÿbbbÿÿK ÿ{ÿÿM&%ÿìZ2ÿ|*(ÿ{ÿK ÿÿÿ{ÿíZ!ÿK ÿK ÿ!ÿK ÿK ÿ|*(ÿM&%ÿM&%ÿ|*(ÿ{ÿíZ!ÿ{ÿÿê5ÿ{ÿò‰'ÿ{ÿ{ÿM&%ÿM&%ÿì[XÿM&%ÿM&%ÿK ÿÿê60ÿK ÿê60ÿK ÿ¬¬¬ÿðŒŠÿê60ÿ¬¬¬ÿ|*(ÿ!ÿÿÿ!ÿK ÿò‰'ÿ²ÿò‰'ÿK ÿK ÿ!ÿK ÿK ÿ|*(ÿM&%ÿ0ÿK ÿM&%ÿ¶WUÿé%ÿ¶WUÿ²ÿ{ÿM&%ÿ²ÿ¶WUÿé%ÿCCCÿbbbÿbbbÿ¬¬¬ÿšššÿvvvÿÖÖÖÿÍýþÿÍýþÿCCCÿÿÿÿÿ¬¬¬ÿÿÿÿbbbÿÿÿÿÿCCCÿCCCÿ444ÿ\††ÿ-QQÿ¨ ÊÓ¯¯-QQÿüÚ°Ó¯¯-QQÿM&%ÿM&%ÿ.îêM&%ÿM&%ÿf òÒ³ÚÛÿ öööíõêööööööööööööíõê ÿèèèÿOÿ=CAòû$èøF 2ÿÿÿ  ýá íì!ÿ #ÿK ÿ #ÿ!'Pÿz0„ÿµZ†ÿ§÷̧÷̧÷ÌßÙ°444ÿ444ÿM&%ÿ/SQ(ÿSQ(ÿ‰…VÿÿÿôôÿÿK ÿ¦ñõ{ÿÿöõ =þûZ öõòòò Ã3ôñÿÿöööø ÐøúÈ í !ÿ{ÿ³ÚÛM&%ÿÿK ÿÃYƒâ=þû…ç=þû{ÿÿM&%ÿ¨úü/˜ÝÞ[ßãg ¦ñõ“úÿ™ïó.îê²ÿM&%ÿÒÒÒšššÿ444ÿbbbÿ...QˆìÃšššžžžòòòÃÐøúòòò/p0 Ðøúæñõ4«ãÃÖùû7/7ÿ“úÿo!‘ßñ“úÿ/|Ý“úÿÐøú.îêM&%ÿM&%ÿ|*(ÿþæäÃaÖÙÃ$ØÞß`]ÈÉÂv|DàÞM&%ÿ¥ÛÜí mí ÃYƒâ\ñøYƒâÖùûí 0ÖùûÏâáãâáe÷ñ3ÎÈ’ïòŽºÉ÷ù7 ²ÿ èæ› 3ÎÈÍ28²+ÿú$$bbbÿttt***šššÿ¬¬¬ÿÍÍÍ    ÙØí슺»CCCÿÿòòòÿÿ¤=¶¶¶ÿöööÜ'=þûÿ¬¬¬ÿžžžÿÿÿ CCCÿ444ÿ½½½CCCÿCCCÿCCCÿ½½½ÌÌ̼’’üÚ°ÿ×Õÿì8-QQÿ-QQÿ-QQÿÓ¯¯{ÿM&%ÿ³ÚÛ{ÿM&%ÿ.îêÒ³ÚÛM&%ÿ6ö³ÚÛÿ ôôôööö   öööÿÿ=Cñÿ¿Ãå½ãõÈÜô¹ûå|v?þÿÿøõ  õÿÿõÿÿõÿÿýáÕü[$/K)Qÿ #ÿßÙ°§÷ÌlÍÊû3ßÙ°û3!'PÿµZ†ÿz0„ÿz0„ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿCCCÿ³ÚÛM&%ÿ7M&%ÿ³ÚÛ‰…VÿM&%ÿ|*(ÿSQ(ÿ­¯ØÊÌÒÿÿôôÿmßLÃí ¦ñõÿ÷öø í õÿÿž“úÿe èèè§}èèèˆÎ©¾ IDATÿööööõöõ÷öÃ’ïò í wu{ÿM&%ÿÿmÍ ÃÃ÷ö0“úÿ3ôñÿòòòÿ³ÚÛ)7˜ÝÞÙïóZ Óúÿ@l.îêÌÌÌššššššÿÌÌÌžžžžžž ÌÌÌK ÿ÷öÙÑüýºÝÃí =þûí í ÃÈåänÖÙ÷ö!´í%Ü'“úÿí =þûÃÐøú.îê×þÿM&%ÿ/þ’tbbŸ53ÃÃ÷öÃŽº»¡zy¼ "ê60ÿÃÖùûí m¦ñõí åüý7’ïò…ìñÒÒý›öÉ÷ù"þæäÉøù3ÎÈé%ÿáááÑËË%%%÷'(¾î%)))iiiÍÍÍÄÄÄììì ÙØŠº»CCCÿÿÿ™ðúÃéÃÃÃÿÒÒÒúÿÿa×ëËøúÿÿbbbÿöööÿCCCÿ½½½ÌÌ̽½½CCCÿ444ÿñññ½½½×Õÿ\††ÿ-QQÿX`6òÈëÇÇ\††ÿ-QQÿëÇÇÓ¯¯{ÿÒ³ÚÛÒ.îê8.îê{ÿM&%ÿ.îêM&%ÿœÿøÛãòòòáéÞööö÷ÿôöööÿÿAÃå½ ÷ ÷áïö7žžžèèèøõø ø õÿÿöüà¥ÜÑã¸+!.{,Rÿ #ÿßÙ°Y 4üÍ!'PÿßÙ°üÍ”36lÍʧ÷̆Ð|K)Qÿz0„ÿÌÌÌCCCÿ AÌÌÌCCCÿ444ÿyE¶êyE444ÿCCCÿë^ˆÿCCCÿ/M&%ÿÊÌÒ‰…Vÿÿÿ/mûõbbbÿ|*(ÿ­¯Øÿôôí ìýþ ÿ=þû’îó^²è ÿßûü ø bçì “úÿÿòòò…çÿø Z èèè?…ç8{ÿ×þÿÿ=þû…ìñèèè*nòòòÃcü÷÷öM&%ÿ³ÚÛš÷úÃÃÐøú?òòò…ç“úÿM&%ÿÌÌÌttt{ÿK ÿ3ôñ{ÿÿÖùûßûüÜÜܳÚÛÐøúmí 0ÞL$=þû“úÿZ òòò!´í%mm=þû=þû¦ñõýáàn qnú^`_±±=þû=þûÁèé%(/÷ömmÖùûmí ÷ö¹j, µô÷K ÿ³ÚÛ4- Òý› Éøù9*ÉùÜÜÜããÍœŒŒŒþÇ :;***“““ÜÜÜ   ÄÄÄ ÙØ“““ÿÃéÿÿÃÃÃÿ€€€ÿâÐÏ5 ôöööÃ÷öööö=þûÿöööÿÿÿÿöööñññ444ÿÿÕÕÕCCCÿäääÌÌÌèèèòÈ-QQÿ\††ÿÈžžëÇÇÑËËèè訠ÊÓ¯¯èèè…ìñ³ÚÛ³ÚÛÒÉû8Ò.îêÒ³ÚÛ’ïòM&%ÿé%ÿ{ÿÿ   ü ööööñÿ¿ òòò ÷ö7âàÅžžž¨¤f¬¬¬ÿèèèèèè ø öüàÖùûÕßÒÐýÿ^Ob0ÿµZ†ÿ†Ð|Y 4!'Pÿ²1TÿY 4lÍÊßÙ°ßÙ°z0„ÿz0„ÿÖþÿ†Ð|!'PÿRÿOU„ÿM% ÿ½†"ÿM% ÿñññÒÒ̽½½!'Pÿ³/ÿOU„ÿ AÌÌÌ444ÿCCCÿMö âÉÅËÒ— 444ÿM&%ÿ AgôÊÞä f œ&Y7³ÚÛ|*(ÿM&%ÿó¥ÒSQ(ÿ!ÿ5 ô5 Ñûäj, ø»áM% ÿbbbÿñïÆmûõ)Ù444ÿ‰…Vÿ‰…VÿSQ(ÿÿí =þû0Ü#0cü÷ÿèèèÖùûèèè ø ÿÿÜÜÜZ  ¦ñõ?[ß÷“úÿà ÷ö0ÛãòòòÐøú!ÿßûü³ÚÛ³/+ÿM&%ÿ/=þûÖùû.îêòòòTTTÔßßòòò“úÿÿ!ÿµô÷Ã÷öÐøú ßûüÐöÃqF#m÷ö0qF#Ã¥!Ñüý/í ÷öÒM&%ÿ!´írFÐøúÖùûÖùûÃÃí ,!!³ÚÛcðõþÛØÃ=þû÷öÖùû_OOa £=þû¡zyÏÐí m÷ö*í *0¹j, k æüýåüý0ÿ.îêÌÓö4- .îê9*$$$ÿùïïïðððÁÇý•Åü```<<<***vvvÿòòò ÿKKK½½½ (þçý÷öø ?þÖùûöööÌÌÌÌÌÌ444ÿèèèèèèñññèèè99Ó¯¯¼’’8bb99Dnn/55&Pÿ)+\††ÿ{ÿM&%ÿM&%ÿÑüý6öf ò…ìñd…ìñÿ÷ÿô÷ øÿèèèòòò555âàÅ/- TTTTTTèèèþìëöõõÿÿýÕÍ #ÿÅÖþ!'Pÿû3¢ûÿ‘ ™øýÑùÍY 4~W…ÿ!'Pÿ§÷ÌÑùÍßÙ°OU„ÿ OÿìüÔ Õ:ÒÒÌRÿRÿŸê444ÿÌÌÌßÙ°OU„ÿ OÿìüÔnø9ÒÒÌ Oÿ±«|ÌÌÌ444ÿ>çÌÒâ4.ÌÒâÌÒ⇻ëÌÌÌM&%ÿÔ+±¸ËÆÆÆýÔ!'Pÿœ&Y-Õ¤š÷ú×'<_1úÕý„ÖØ­¯Ø2L$<`JÿçþçýúÔä<`Jžžžc-“ ÇBBBÊÌÒ|*(ÿì[Xÿw{ª­¯Øÿôô ÷öÃ÷ ’îó’ïò¦ñõÐøúmßûü÷ö í èèèòòò÷öK ÿòòò ÿöõ¦ñõèèèòòòí {ÿ³ÚÛ/?)/ èèè*…ìñ!ÿžßûüMÑÕf 7h#"÷öí žžžŒŒŒ,!!òòò=þûßûüÿõÿÿ0öööM&%ÿÇÕùqF#mÐøú_²×mÉûý³ÚÛ¥ÛܳÚÛ/!´í0í í mn/aÖÙ$$$=þû,!!,XYDàÞ=þûÁèé¥ÛÜÿêçmZ ÃnÿêçÒ’ïò–Ôõ XÛL^_æüýK >ÌÓö"Þúü™ïó3ÎÈ[[MMMâââöÌÌ?9uu?666ÖÖÖšššÿ***```òòòòòòí Éß÷Ãí ñáûÁéõÿÿ ÿbbbÿšššÿbbbÿÿCCCÿCCCÿÌÌÌCCCÿÌÌÌCCCÿ444ÿ444ÿ-QQÿÓ¯¯ÑËËëÇÇÑË˨ Ê)+ì8ëÇÇÑËË\††ÿ-QQÿM&%ÿ…ìñ.îêœÿø.îê“ Èåø.îê³/ÿM&%ÿ³ÚÛèèèööö  ÷ÿôøø÷ÿôëöööòö òòòËËË ;¬°îÿÿ íì íì    +!.¥ÜÑåüýøõK)Qÿ†Ð|^b,)2/3ÑùÍ7ßÙ°ßÙ°µ×¯OU„ÿÒÒÌ!ì+ßæÿßÙ°RÿÌÓöþçýØþüÌÌ̱¸Ë!,ü¸ßæÿó±444ÿMöyEÂð4.;5.ç(>çyEM&%ÿ..4!÷7Üé+..4±«|Ñüý³ÚÛSQ(ÿ)ÙÄ ¶þæäM&%ÿ|*(ÿ­¯ØÊÌÒ<`Jþçýµô÷ÊÌÒ€TSÿúÓ¨úüáááÍÍÍ­¯Ø×'ÏÐSQ(ÿ òòòí òòòèèè  ßûüµô÷“úÿ=þûÿÿ*öööÿööö÷öÿßûüµô÷K ÿ{ÿ¦Ò† IDATèèèòòòêêê í ÿ{ÿòòò…ìñÿÿêçòàßÁèé/Ñüýööö{ÿ0ÿK ÿí ’ïòMÑÕÉûý=þû÷ö¦ñõ{ÿM&%ÿfff³ÚÛÃÿòòò›ðôòòòÿÿ{ÿ/Ñüý=þû[ßãÇÕù¦ñõí ÖùûºÝÃm8„ÖØìZ2ÿí ÷ö[%$M&%ÿn=þû¦ñõ=þû=þû?8ÿêç.îê’äæÃ=þûÁèé=þûí ÔßßüÏÎÃÑüýí q0ùn nn ¥ÛÜóÚÛµô÷’ïòçNS´¢¡L^_><54- .ï7 ÞúüòþþÉøù3ÎÈÊÊÊŸŸŸÈÈÈÁÇýÁÇýíííìììÛÛÛ¶¶¶šššÿ***òòò"úø/üúööö "úøòòòòòòø öõø ø òòòèèèÿJJJžžž~~~888CCCÿÿCCCÿ+++ñññ½½½CCCÿCCCÿ½½½CCCÿ444ÿÌÌÌÌÌÌÓ¯¯ÿ/55×Õÿ)+üÚ°èèèëÇÇ-QQÿÑËËÓ¯¯³ÚÛ{ÿM&%ÿ…ìñdœÿø8ÿêçÿêçÒMÑé.îê{ÿ³ÚÛÿ ööö  ëø÷êü  ÷ÿôòòò ÷òû$ÿiiiÐÔTPÿÿÿ ÿZ'N+!.+æ+æÕßÒÕßÒèèèèµ×¯!'PÿY 4§÷ÌÍÒÌ–ÏË/3'ÅÖþ~W…ÿ²1TÿOU„ÿ±«|ìüÔðÕOU„ÿRÿ®êÌÓö4- ØþüÛÝøK ÿó±ßæÿ*2|ó±ÌÌÌ­Öx¬ÜñññÌÒâÅËÒ4.£Ñúx¬Ü444ÿM&%ÿ|*(ÿ/_¾Î ðÕ±«|³ÚÛ¥ÛÜÔàøÖùû³ÚÛ0‚„δÜÊÌÒþçýM&%ÿSQ(ÿÓýÕÑÓüôôôêêêËËË„ÖØ­¯ØöööÐøúÿµô÷öööK ÿµô÷=þûòòòÿ í cü÷Öùû©ÿÿ*ø ›ðôé%ÿòòò“úÿ ¥!7ÿòòò“úÿ{ÿ=þûK ÿ÷öÃÐøúM&%ÿ˜ÝÞÃ*Z ?í “úÿÁèé{ÿ{ÿÿòòòÿöõ5 òòò?þ“úÿÑüýf h#"=þû[ßãí ÐøúmqF#ÉûýìZ2ÿÐö?ÌUq0ù/¥ÛÜ’äæh#*h#Ôßß8M&%ÿþæä=þû?í bbbþÛØÁèé³ÚÛ!´íÿêç$ñÿêç‘ÞßÌU÷ö÷öM&%ÿ@uyTõóTõó<5úÂù7 É÷ùòþþåüýãâáÍ28ÍÍÍJJJáááÁ‘‰?9 :;íííììì©©©¸¸¸vvvÿÞóþþ/üúAöóÞòòò èèè òòòèèè ÿÿ¶¶¶é%ÿÒ©©©½½½èèè½½½½½½äääCCCÿÕÕÕ½½½CCCÿ½½½ÌÌÌÿDnn¼’’)+ëÇÇ/55-QQÿ-QQÿèèèÓ¯¯Ó¯¯…ìñ.îêM&%ÿ’ïòMÑé8f ò{ÿÒ…ìñèèèöööø÷ÿôøë   òö Üòû$ÿÿÿòòòTTTêêê 2ÿÿòòòÿöõ ÿ+!.+3ÕßÒåüýåüýðîëîëîëßÙ°†Ð|”36Ñ2;*üÙÿ¢ûÿüÙÿ™øý²1Tÿz0„ÿÒÒÌóê+ìüÔóê+±«|OU„ÿþçý¤Ñò&éÚÿµô÷ ÕßæÿκËOU„ÿÌÌÌ4.ÌÒâ£ÑúñØÌÌÌÌÌ̳ÚÛÓ+\þÑ¡óê+ìüÔóê+­¯Ø*, , SQ(ÿTTT, >yMÖùûúÕý/-+ÑÓüôôôöööÿ­¯Øòòò Öùûcü÷òòòµô÷Öùûööö÷öèèèòòò¦ñõK ÿÿßûüêêêòòò0òòòòòòø 8àçK ÿ?[%$[ßãÉûýòòòòòòÐøúÿÍ “úÿ0í òòò=þûÍ ³ÚÛ|*(ÿM&%ÿ7Ã=þûÖùû“úÿ.îê??“úÿ“úÿK ÿ=þûòòò Öùûßûüÿ³Ûô=þûM% ÿ³ÚÛš÷ú9+¡N)Z ÞL$mÃp0 „ÖØ 4ü gÆÕ 7í =þûh#í nÖí˜Ýò8?¥!þæäÃ?ŸÞáÄÅ_†‡?$ØÞnßL?²ÿßûü÷önÐøún /n ÐøúÐøúrF!´íZ /ƒ¬ K 23žÚÄËä70ñýþÚúü•µ´WWW¥¥ÞüÍÁÇýÄÄÄÎþÿÖÖÖPPP888 AñññìììÞѵòòò èèèööö÷ö(ÿèèè òòò èèè/óûËâ½½½444ÿèèèñññèèè½½½ÿCCCÿ½½½èèèÑËËì8÷ÓÓ¼’’/55Ó¯¯-QQÿ…ìñ.îê.îêÒM&%ÿÈåø7ïÒš÷n.îêM&%ÿ÷ÿôë  ÷êü÷ÿôø ú ÷Üòö òû$òö ÿÿòö ÑÓö÷ÎüéõÿÿÕßÒÍÒÌ^Obð+!.pIwú èèèÅÖþüÍÑ2ÅÖþÑùÍ3.4^ÑùÍÑ2Èÿ0§÷ÌßÙ°!óê+$Õ2F5±«|®ê&éÙ&é!'PÿB2`ó±ãñ±ÒÒÌOU„ÿö7ocLÌÌ̳ÚÛ±«|³ÚÛ!óê+$Õ2F5K ÿ>yM³Ûô³Ûô64.ÿM% ÿþçý)ÙÊÌÒ*M% ÿ³ÚÛ€¬­ôôôh<; èèèÿòòòí ÐøúÿòòòòòòßûüßûüßûüÖùûÿòòòòòò÷öÿòòòí 0³ÚÛÑüýnÑüý³ÚÛ ÿÿµô÷ òòòÐøú0èèè„ÖØf Éûý0ßûü¦ñõ=þûÁèéÁèé?òòò444ÿšššÿµô÷ÿZ ßûüòòò!ÿµô÷=V³ÚÛÇÕù÷ömqF#qF#mÐöÐöM&%ÿ¦ßnÖÙ=þûŸ)h#¥! í Öùû³ÚÛ³ÚÛÃ=þû_†‡¢ @¯¬_†‡?¥ÛÜ/³ÚÛ;= M&%ÿßûü?’äæÃÐøú$ñŸ*'m[%$ÑüýãâáëÄçÙÚ4- <5n")±óöòþÿ===šššÒÒÒ$$$mII΋óÉþ¾”°ÚÚÂÂÂKEÿ èèèÿõÿÿÔàøèèè èèèòòòèèèèèèÌÌÌCCCÿäääCCCÿèèèñññ444ÿèèè×Õÿ)+ --èèèÑËËÓ¯¯…ìñ…ìñ.îê…ìñÈåø.îêdÒ.îêÿ    ë %#ÿéëú ÷Ü ÷òö  ÷ÛÝø%#ÿTPÿ%#ÿýáÕßÒÍÒÌ+!.ð3.4¢±žBZ?ð !'Pÿ¢ûÿ‘ /þ΢ûÿüÙÿ§÷Ìg^§÷Ì!'Pÿÿ..4 ÉêêêÒÒÌOU„ÿÿÿØþüÍ êêêM% ÿÿ!'PÿßÙ°ÉÔÿÿí羿¹Š!'PÿÌÌÌ;5.ÕÕÕêêêÅËÒS*ÿÿÿ..4 ÉêêêÒÒÌOU„ÿÿÿÿE“ÂÿÿÊÌÒ‰…Vÿÿ5 ôþçýEmûõø»á,K ÿ„ÖØÓýÕ÷ö íìÛ|*(ÿòòòÃèèè÷ößûü3ôñqÝã IDATèèè*“úÿÿÿ¦ñõ{ÿÑüý³ÚÛèèè òòòÿ èèèèèèÃ=þûÿ…ìñM&%ÿš÷úÏâá=þû…ìñòòòí 0òòò³ÚÛÌÌÌÈÈÈMuŽbbbÿÿ÷ö…ìñÿÿÿí !ÿ888M&%ÿš÷úºÝ¦ñõÇÕùÐöqF#“úÿ_²×p0 Ñüý³ÚÛò‰'ÿSeönÖÙí h#9+7MÑénÖíí ˜Ýò|*(ÿ=]_DàÞqnüÏÎÏÐDàÞŠ¡|*(ÿýÛý/M&%ÿ/=þû=þû/$ñ’ôø^²è„å(q0ùn ö×þÿ;CF²­ÄËäÒý£òõ’ïò®óõ×úûÐøúÙúûäää%PPPPPP¤zzØüÆÜܶ¶¶îîîÈÈÈðððÿöööÿèèèöõø ?þÿèèèÿòòòÿòòòèèèÌÌÌ-QQÿ-QQÿüÚ°ëÇÇ99×Õÿ99×ÕÿÿM&%ÿM&%ÿ{ÿœÿøÒM&%ÿÒ…ìñ³ÚÛ…ìñ{ÿòòò èèèóõéëúú ÷òû$%#ÿéëÑÓöÛÝøõÿÿýáÕßÒÕßÒ+!.¢±žz’wÃÁ¦üÍÈÿ0Öþÿ¢ûÿ*Èÿ0§÷ÌßÙ°ßÙ°ßÙ°ÿöööÒÒÌ7=líç¾ÉÔèèèèèèÿÿ&é3ôñÃËó èèèÿÿööö òòòßÙ°ÿÿÅËÒ5 ô»ä—ÅîèèèÿöööÒÒÌ7=líç¾ÉÔèèèèèèSQ(ÿ|*(ÿööö)Ù;9öööÅÇð“Âèèè³Ûô1Ûã/64.µô÷;9c-ßûüßûüòòò“ 0‚„÷ö K ÿÿ÷ÿÖùûÿ=þûµô÷òòò ÷öZ “úÿÿ³ÚÛ³ÚÛÿèèèÿ=þûèèèòòòà ³ÚÛ/õô÷òòò“úÿòòòžžžÈÈȬ¬¬÷ö÷ößûüèèè í ÿššš³ÚÛÐøúí ’*'ÉûýÑüýÇÕùºÝm¡N)ÇÕù/8 4üí 7%³/ÿmÖùû7¼ "þæäÇÔÓþÚÆýÁèé‘¥ÛÜT Ñüý/’äæÃŸ)Ã/q0ù1׎ºîijÚÛÜÜÜÙþæä237 ÌÓö4- ÁúÂöù) 7""èèèñññðððÂÂÂŒŒŒìììCCCÿØ®®ÕÏ ÂÂÂ888PPP888ññññññööö öööÿöööø öõñáûØþü?þÿÿööö444ÿ½½½CCCÿ½½½444ÿÌÌÌCCCÿ½½½-QQÿ×ÕÿüÚ°ÿ99Ó¯¯ÿì8)+Ó¯¯&Pÿ)+Ó¯¯M&%ÿ³ÚÛ{ÿÒ³ÚÛ{ÿ…ìñÿööö ööö÷ÿô  èèèÿ ðéëòö  ÷FB¬°îÿööööõ ÿå/- ´ñ„–—fff!'PÿY 4ÑùÍÖþÿßÙ°!'Pÿû3äÕ}z0„ÿ†Ð|ÿööö èèèÿ3ôñÍ èèèÿööö èèèÿööö?þ4.—Åîèèèÿööö èèè|*(ÿ„ÖØÿööö èèèÿdœîðqm>` Ç“ œîðöööEC64.“Âèèèÿ;9ÅÇð5 ËòóÔC@ýÊÅÛãÿööö èèèÿööö=þûµô÷ÿööö ööö÷ö÷èèèÿôôôööö=þûÃöõø èèèÿöööm öööm…ìñM&%ÿÁèé èèèÿööö=þûµô÷ÿööö÷ö÷ íìí TTT888fffM&%ÿf [ßãnÑüý³ÚÛ|*(ÿ’äæ=þûh#"Éûý„ÖØM&%ÿ­› øÈøûÑúÆÕö?Z8øÈøÁ¦ð9+ÇÕåMÑé{ÿ“úÿ¥! 7$ØÞÜ("’ôøÑüý¥cø¬÷$Ùð¤@lÀ”ïNãêM&%ÿþæä0o!%Ÿóðø­ ’ôø’äæÜ'%Ð„ÖØK ÿåüý‚°EL²­Òýeø ~ëðÞòòòÿ+++333```   ®®®êêêhhh```ììì   ŠŠŠÿ öööòòòÿööö=þûÔàøí èèèÿööö ööö èèèCCCÿ½½½444ÿÌÌÌ&PÿüÚ°ÿDnn¤zzM&%ÿ³ÚÛM&%ÿ.îê…ìñ{ÿ…ìñÿèèèÿööö èèèÿèèèÿ ðéëúeav|ãÿööööõ  BZ?ÃÁ¦=?Zžžžz0„ÿÑùÍÖþÿßÙ°K)QÿÖþÿßÙ°!'Pÿ*/3†Ð|ÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèSQ(ÿ­¯Øÿ;9»½æECúÕýÁèén’äæECÅÇðèèèÿöööEC64.…‰¸EC–Ôõ%éñn×'ÅÇðèèèÿööö÷ö÷öööm èèèÿööö÷öí ööööõø èèèÿöööm“úÿ ööö÷ö*Í èèèÿööö=þûÍ ööö=þûÍ èèèÿööö÷öí +++žžžM&%ÿþæäÃ?³ÚÛM&%ÿÁèé=þû1Ñüý³ÚÛM&%ÿÔßßí ì³!‚iùp0 gýøÈøúÑ ºÝrFŽºî“úÿ÷öí ¥!ÉûýÑüý 4üÐtbb‘Œ;= /À”ïÊ „ÖØ!ÿZ o!%4«ã[%$q0ùŸë<ç’õ Ïâá¢NŸLÒµô÷$$$ÿ>>>²­“úÿ¤É÷ù“úÿTTT²­çNS÷¬©µ ¾¾¾ŒŒŒttt   ¢¢¢öööÈÈÈ888ÈÈÈ888ÈÈÈ888 ööö èèèÿööööõ *Öùûí ööö èèè-QQÿÓ¯¯{ÿ…ìñÿööö èèèÿ ðéëúeav|ãÿ íìÿ#; ½½½!'PÿßÙ°z0„ÿ†Ð|z0„ÿ†Ð|ÿ;9ÅÇðèèèÿööö èèèÿööö öööòòòÿööö ööö èèè.A; IDATÿ ööööõööööõø èèèÿööö ööö èèèÿöööôôôööö èèèÿööö€ÿ èèèÿ )Áèé=þûµô÷M&%ÿÁèé=þû1Ñüý³ÚÛ!ÿí ¥! Éû7ï:+ 4«ãí ÷ößûüÿ¥!ÉûýÑüý³ÚÛM&%ÿ 4ü/ûÑú!´íòòò!ÿí ÷ö,!!³ÚÛ|*(ÿq0ùŸë<ç$ÙðTTT¬¬¬m…ìñÿTTT¬¬¬TTT¬¬¬TTTžžžÿèèèÿ^^^¢¢¢^^^¢¢¢^^^¢¢¢èèèÿööö èèèÿööö èèèÿööö èèèÿ èèè5‚+ÿòÜæ$Ä¡ Yí6š÷×þÿðððððð...âââððð)×þÿòñ×þÿðððððð...ðððñññìììððððððñññÒÒÒ)×þÿ)ÿç×ÿ<_öáÿþïÍ÷ôÕL˜æþ@Úÿþ´hôôôööö öööòû$,þ°áááááá)+áã òñ4-Òþþáã ððð444ÿÌÌÌûÎü ÿèïÍ÷04 *í6ôáã ððððððððð...$$$âââááá+/ôðòæýÔ)×þÿðððêêê ðððáááðððáááññññññ))0ì6 ÊúíÐýÄ¡ ^ô¿¯¤AQ\ýÜÜÜè)Vÿ<ûÎL˜æþæª|Ô„,@þôôôöööòû$,4$ÖÚÚÚ...¬¬¬ûåòPþ°êêêñññú$$3ÒÒÒòñ.ÒþþôúÕý+áã ðððôôô ôôô íì,!!Ëòó5 Ëòó ì[Xÿ|*(ÿM&%ÿM&%ÿBBB|*(ÿ|*(ÿM&%ÿM&%ÿvvvÿôÔýôÔý$Öÿý÷Îù÷Îù÷ÎùÊúú "+Mâ.îôôMö]/]//-...ðððÜÜÜððð)/- 2 2 2 2ýÔýÔööôôôêêêöööêêêôôôððððððððððððìììáááèß 2âââÖ \0/\0/0ì0ìf ò0ìþ,.-.-ÿ660ì"Èdt% ,;_ Y ÿ ´hO:AJ"Úÿþöööòö ûåùÔÚÚÚÚÚÚž¢µòö  ÷ûåùÔ...$$$ðððç½½ÜÜæ 44>>>×þÿ4,ñ+Òþþÿì.îdó.4-.cü÷cü÷)) äâ5 5 5 5 ðäãþæä5 |*(ÿaËͳÚÛ|*(ÿ„ÖØ|*(ÿÑüý³ÚÛ³ÚÛ444ÿ```ÍÍÍÿ½½½Ñüý|*(ÿÑüýÖÖÖÿ***ÖÖÖÿ***/&%ÿ³ÚÛM&%ÿ/³444ÿ```ŠŠŠ444ÿÌÌÌÖÖÖÿ***ÖÖÖÿ***÷Ï IDATÿè 4 *÷Îù§û)Òÿ.<3ø þ ôðð%%%ÒÒÒâââðððááá)ðòÎåÝÿÿ# ãâã*äáþÿððððððööööööðððááá333ìììÞ ñïÆ* 2ôÎýâââððð)3..ÜzmÜ*cõÐý0ì/ÿþÖÿéÊúÿÿéÄ¡ ¹×BÖû¹fmÿÊÆôQ:O*É6J"Lt$P&ÓþÛ[ Ãÿû‘ÿqÁ“´hêêêòö ÜÛbçìž!ßúûåú$$$ððìììðððÌÌ 44ô.î<4 <øÄÌôÒÿÑÓüð7 ÞèæäüýÁèé Ëòóööö %òðM&%ÿ„ÖØ³ÚÛM&%ÿ|*(ÿ7|*(ÿŸ53³/+ÿ|*(ÿÌÌÌŒŒŒñññÏâáCCCÿbbbÿ******bbbÿCCCÿM&%ÿ|*(ÿÑûä//Ñûä|*(ÿM&%ÿÌÌÌŒŒŒ444ÿBBBbbbÿ******bbbÿbbbÿbbbÿ +ë<_öZ5***÷Îù÷Îùáã ÑÓüÑÓü73 1ÒþþÒþþÄÌôÍþû÷ÏûúÕýÒÒÒÛÛÛñññáááðððððð×þÿ9çåúÕýúÕýÒÒàôÔýÑÓüôÔý/32))ðððêêêöööâââìììððð 2ðððÿ*ôÎýááá)ôôôÁèéÁèé´àáI‚Seöccc)Êúú0ìÿéþÖÑüý0ìÿéÿÐýaUa¶o9Ÿz­ôÖéM„=ot%#°þÚ*‰$$$ÿ1U–À”òö  ÷ ÷%éñµøßú ÷òö êêê$$$%%%ææg==ææ%%%ç½½áááôFmÄÌôQˆì 9 2ëüþëüþòþþäûüè 5 5 ?ðäãM&%ÿ/Ñüýp10šËͳÚÛ„ÖØM&%ÿ|*(ÿ„ÖØ¿£¢ßûü³ÚÛM% ÿ³ÚÛáááááá³ÚÛ&%ÿ/ÏâáÏâá1Ñüý³ÚÛ¬¬¬òòòìììbbbÿžžžžžžbbbÿžžžžžžbbbÿžžžbbbÿžžžZ5÷Îùü×û4-ÌÓûðþð.î3 ÷ÌÓûÌ4ñü×ô×þÂÂÂ...ððððððáááã)ê.ÝC.Ø%Ö þëôÕ)ôÎûäÔýðððöõ ìýþ ðððü"óÎõÍÓ:ááá'#ôº¾ñááá×þÿêêê-R$$¼¼¼ááá)ü×ûÿéÑúýÑüý×þÿ„¤{•dÒ8ȱÆöôÆåhg ÂØ¢ïÄÄa‘a ÷ ÷òö  ÷ èÜêêêÕÿÿP&&åÎþÿ5;<ëêîîîÛÛÛñññòñúÔçØþüjc¤ÑòÃÅóÊÌõ-.ùððð ñôåüý÷ëèÞúü äíì/³ÚÛ³ÚÛaËÍ/|*(ÿ³ÚÛ„ÖØK ÿK ÿM% ÿK ÿM% ÿìZ2ÿ³/ÿÿ*ØþüCCCÿ444ÿM&%ÿM&%ÿ|*(ÿ|*(ÿM&%ÿM&%ÿ444ÿ!ÿžžž½½½½½½žžž!ÿ³ÚÛ„ÖØµô÷K ÿK ÿµô÷„ÖØ³ÚÛ ááá444ÿ444ÿÿžžžžžžÿžžž444ÿ444ÿžžž÷Îù÷Îùü×ûü×ûü×ûü×ûü×ûÐüûÐüûÐüûÐüûÐüû/-]/ 256ñ*ðððñññááá...ˆˆˆWWWÐýÿþÖÒÒàÿäöðò ,þ,þ,\$ p'"úø?þ?þÿôôôÎýÿ*ððððððÕÿÿA+++&&&¹&íÜÜÜ ãâ)×þÿÐý)0ì0ì6ÐýÐýkœÄÅÌ>WÿóÝÜ¡ÁnËÄ£ôÔý ,òö òôÿ÷ÿô ÷òö  .-,)¿ôôô ÕÿÿP&&ååÕÿÿç,ÄÌô+Êý˜c¯x=; ÷Îùº¾ü 2.îôÛÖùûè3ôñ183 3ôñ÷÷„ÖØ|*(ÿÑüýM&%ÿ„ÖØM&%ÿ„ÖØ|*(ÿM&%ÿK ÿµô÷K ÿh#Ÿ5&f ÇÕåÊúú3ôñÿÚÿ(444ÿvvvÿ“““...!ÿK ÿ%#ÿM% ÿ%#ÿM% ÿþæä/„ÖØ„ÖØ/þæäM% ÿ%#ÿM% ÿ%#ÿK ÿ!ÿbbbÿ¢¢¢vvvÿ444ÿK ÿßûüßûüK ÿµô÷M% ÿM% ÿµô÷ ñññvvvÿÖÖÖÿ...ÿÿ$$$ÿ444ÿCCCÿbbbÿvvvÿ444ÿ444ÿvvvÿbbbÿCCCÿ444ÿ$$$ÿÿÿ...ÖÖÖÿvvvÿÿèèèèèèÿ ¾ IDATÌÌÌÿÿÌÌÌ)))×ÿ×ÿòñ³á +f` .÷Ï  ÅÍô4,ñ×þÿÌÔÌÓûððððððáááôÔýÏÿ)ÿ/- +ååí1ôÔýõ0 5  ððð 2ÿÖñññèß'#ôÞ ò!áááGÚâââ¨oÝËòó)ÿä)ÿç0ìüÖçü×û:- 0ì0ì ,22ÛþÙÀ~ÔÖÖÖÿ& ÷ ü ö òû$æÿÖêêêååðððúÕý(ÌÓöÉï5=; ÃÅó<4 ¯x<4 3 2.ôôô%òð*ðîöööïþþ'A %òð|*(ÿÑüý/„ÖØ|*(ÿp10¥¨M&%ÿ/„ÖØM% ÿf ÊúúÎãø2Îãø2ÎãøÍ èèèM% ÿ³Ûô%#ÿÛÝø444ÿÌÌÌM&%ÿ/„ÖØ|*(ÿÑüý³ÚÛ444ÿ½½½M% ÿ³ÛôM% ÿ³ÛôK ÿµô÷K ÿµô÷444ÿÌÌÌ$$$ÿÜÜÜ444ÿÌÌÌ444ÿÌÌÌÿèèèÿèèèÿòòòÿòòòŠ„ÿ÷Îùü×ûÐüû×ÿf` ÉÍùáã ðððf`ù3ÄÌôÌÔ+ÑÓüññññññðððñññðððæå'Ö/3ôÎûí1ðÎû2ðÎûä õÙûÓáááêêêÿôô ÷þÿ ø &&&ñññððð 2Þ ððð 2Þ ðððÒÒÒÒÒÒ¶¶¶ /-§pYùÑÓü)0ì6ÊúúÐý0ì)ü×ûÐý×þÿ ,/3áÿÿyšÛšæ^ïÇùÑÍúôÔýêêêòôÿ øóõö îÿ õôööö  44P&&åËÅÄÜÜÒÒÒððð/-.îÌÓö4- <4 =; ÃÅóÍþû3Íþû÷Ï ÒþþÑÓüôôô%òðåüýè5 Øýãxö ÿîÿ§ñõËæäç„ÖØ|*(ÿp107ÿÉûý„ÖØÑüýÿM&%ÿ/„ÖØM&%ÿ³ÚÛ})ÿ‘åý0úÐüûÃãøÃãøÃ èèèØþü&éÛÌÌ̳ÚÛ³„ÖØÌÌÌK ÿ³Ûô³ÛôK ÿµô÷µô÷!ÿßûü!ÿµô÷ôôôÌÌÌÌÌÌ444ÿÌÌÌèèè444ÿÌÌÌòòòÿèèèÿèèè÷Îù)ü×û0üè×ÿôôô;9áã ÉÍôáã ððð/-ùÍþûü×û4-ÒþþúÕý+ðððððððððððððððí ä'#ôÎûðòðÎäðÎû/33îÖñþððð øøñññ 2Þ ððððððáááñññááá333^^^®®®úÕý¼–&Óôôô Ðý0ì4-üÖçÐý0ì×þÿôÔý ,ÑÍúï$ìì&Ú9ïÇùêòû$òý%Ç - ÚÇÝ âòÿþöö ÷ ðððððð<4 ÄÌôÄÌôÌÓö÷- Òÿ ç Ûôô5 èòóËòóßïèêôôôÛôô„ÖØ¥¨š÷úp10M&%ÿ/|*(ÿf „ÖØM&%ÿ³ÚÛ})ÿ‘åý›ï ›ï0Ã=þûÍ =þûèèè(ÖùûM&%ÿ|*(ÿK ÿµô÷µô÷K ÿ|*(ÿM&%ÿßûübbbÿCCCÿCCCÿbbbÿßûüöööbbbÿÌÌÌÌÌÌbbbÿèèèbbbÿbbbÿèèè 2ü×û0)è%òð.Möáã ôúÕý)ÿì×þÿÑÓüÑÓüááááááRRR...ññññññ ,2/3í1í1áááôÔý2áÿÿÑÍúö5+ýÔñññðððAñññÞ ððð 2Þ >>>®®®$$$...×þÿìîÿ*×þÿÐýÐý')ÿìüÖç0ìôÔýôÔýY5/•qdÏ gì9æÿ*)ôÔý Ò ãåôüõÓá ",  òö êêêñññÜܰÚÚððñññððð))áã Íþû<4 q7<4 Íþû 24- <4 Òÿ.îôôôôôôôþæä3ôñööö íìœîð±óöàúûÈ÷ù M&%ÿ³ÚÛÏП537p10MÑÕM&%ÿ³ÚÛÐüû èèèèèè5 ô‘åý =þûÍ èèèÍ K ÿM&%ÿþçýM&%ÿA]^444ÿM&%ÿ/Ñûä11Ñûä/M&%ÿááááááTTT444ÿbbbÿžžžñcCL IDATžžžbbbÿžžžbbbÿbbbÿžžžÊÌõ 2 2) 1 1ðððáã úÕýòñ×þÿ÷Ïû÷Ïû6/-ðððððððððððð)ÖþÁÑÍúðÎû , ,/3ðÎûÖþÃïðñññ ñññôÎýáááâââñïÆ73Þ ðððáááñññòñ= ãâððð ÞÝæº¹ûÔÓ3335550ìf òf ò6 W q76Ðý0ìf òÐýD%)_#·ýÖôÔýôÔý #- ÚÇÝÞ¾çÚÇÝéþ ,üôþ ÷òö ñññððð ÙØ ÙØììì...++ª°ÄÌôËýû 9q7h 3<4 ÄÌôáã úÕýÓþü5 3ôñ ööößûü5 M&%ÿ/p10aËÍ/„ÖØÿèèè})ÿ›ïèèèK ÿµô÷M&%ÿ/Ñüý³ÚÛ444ÿ¢¢¢mmm½½½|*(ÿÑüý³ÚÛM&%ÿ/„ÖØÖÖÖÿ***ÖÖÖÿ***444ÿÌÌÌ444ÿ¢¢¢***ÖÖÖÿ***ÖÖÖÿ***$$$ÿ0,î64 ÷Îùü×ûÐüû éÿúC.Òþþ.6–Ð÷çHöôZ÷Îç£Òðððâââðððððð...ÒÒÒðððæýÔ×þÿ ,2ÑÍúÖþöåÑÓüËËËôôôööö&&&ááááááAå¿îAÞ áááðððñññáááôôô‚#!úÓÑÓüôôô \0/6úÓðòáááYí6 W 5ÅÍôüÙüÊúú§ûea2MQ€***¥ö=ÿ[ Ö½6ÿÀÿýÀ”óôÔýôôôíõê éëÈÈÈ888òö ,$Æ8bbç½½ú$$5;<ËÅÄöÌÌÒÒÒô.î 23ÍþûÉÍ úÕý+áã ðððôôô3ôñÈ÷ù*Öùû÷%òðÛ3ôñ×þÿ³ÚÛ&%ÿ/„ÖØèèèM% ÿ0›ïÍ ô÷/„ÖØ|*(ÿ³ÌÌÌ   ÿ½½½Ñüý³ÚÛ³ÚÛ&%ÿ******ÌÌÌÌÌÌ   ÿ******ÐÔî64 ü×û.ï©Óü/-ÌÓû4-–Ð÷+V3û÷Îçðððððððððññññññðððí ä ã)Öþó2áÿÿÝÿÿñññ öööêêêñññ...ðððü"óïåôÎÞ ðððððððáááêêêÆû¼–áã ôôäööö DjÚD†“´àá§û§û)0ì£úÀ:- ÊúúÿÑýý)×þÿÛ×m×ÛE***[ Ã¥ö=ÿÝÿ@ÇúþTUq_c™ööö  éë&&&888 ÷ò,ôôôCCððððæËÅÄ>íííÕ44ÜÜáááðððôÑÓüÑâÉô+úÕýðþðòþÿ,þæä÷òóòæä|*(ÿ„ÖØÿèèè444ÿÌÌÌSQ(ÿáã Þ64 ÷Îùü×ûþëþ©ýôáã ððð/-áã ððð]/ 1ó÷Ï £Ñúððððððñññðððááá)çððð ,ó ãâöí äôÔýôôôööö ...ñññðððììììììáááñññAå¿î¶¶¶ööö ööö )0ìÐý0ìÐý0ìÐý×þÿÛ×mo¥ö=ÿEô­ç¥ŸÃ¥5: .çôôôööö öööòö GbRú$$+ïïïÂìì+ïïïìììðððÒÒÒ/-ÑÓüôôô íì,!!Ôßß÷%òð×þÿŸØ#a IDAT`ƒÿ*÷Îùü×ûþëþ©ý€ÿððð/-.³á ðððððð)×þÿôôôööö ðððáááðððñññáááÂÂÂôôô ôôô )0ìÐý×þÿ)0ìÐý×þÿr™i>k69ÿýÇÿþÊÓýÑ^XÅôÔýôôôöööòö $ ...æððÜÜÜÒÒÒòñ×þÿôôô $$$ÿôôô ôôô ý,ýÔø_ )Ùÿ4ý¥Ñüý+ÑÓüý,ãÿýÔôôô êêê äääööö äääððð/-.îÒÿáã ððð/-úÕý+ÑÓüôôô ôôô +1`ÕÏ É6ý©cWû7ÊðððôÑÓü\0/˜ÄÅooo‘‘‘ Åù£òõñÿu`ÅÍôÆÓö) 2Öÿý9 åøîü”WøíýþíýþÛúûÙúü'îýý<÷jäëÿäëÿ;ðïÿðïÿtYÇÎþ92ÇÎþ92ÇÎþ92|ŒÂäëÿbLàñïÆáã ððððððññññññáááAáÿÿîÎý2îÎý2îÎý2áÌÓî¿ç&&&õýÔÔ+ äððð)çðððüäÿ+!.ÙûÓüäÿ2J/ù×ÿÙûÓôôô üäÿüäÿüäÿüäÿøõð îëú,õ5+©1ûРôôô7=l55<ËËÄÒÒÌ..4ÒÒÌ..4ÒÒÌû3/-;ýÕÅ(ùØÿü: "Ç1ÿÏ344ÿÐýi 5ÊÏþÿóÈý4úÑþý9Éýÿ7üÇËúÍÏ1/ýÎâõ#ýÎö"# ÞÝÏ1-Õ¤Ö(*ññññññFüPÎýÿÔþ ±ñññòñ+úÕý+úÕý³])2þÏÿ×íÿþ)ü1çÎÿêÃþbö£ê)ß1Öÿþÿþ)ü1þÏÿ×í *÷Îùü×ûþëþ) 2€)þ1  úøøøû*ÿêý,ú!üê! ñññ+þëç2èÿëéþÿýëÿýëÿé, 3þþýÿêôôô êêêõõõ öööíííûûûûûûûûû÷÷÷èèèøøø/-.î 2åç ä÷ìÿ)üú.îì éêþôôôðððûûûûûûûûûÿÿÿôôôöööûûûëèÐ'êí +1`ëèЕhÃJµWû,Ïþ*`ò·ç)üøøø)ìÿ'-ýúøøø/-„}ü îüýOJ÷üýéêþ/-„}ü:7ýüôûåçéêþøøøôôôúúúˆˆˆ‹……÷öÄÒÓh<;ÕÏÏôôôúúúúúúdþÂù)4íåþýÓ..Öÿýëÿáÿþر ßëðûõþüøñ§ê÷ÿÿ åüü÷ÿÿ÷ÿÿ åüüÙúü÷ÿÿ åýý žü5ýð  äëÿ; ù°Tç[Sö“ðý6 ûýÆâéäçÿÖÏ’ù6º¶‘ù6º¶‘;:UÍÒÒ òö!àùøãñòù÷Î-$$$þþþ%%%"""ìÿçèçþ2 ÷çÿêåÕáÌÓ *ñßßäã'ÿëÿ òâââ - ûõòðððøøøôôô/4ýÔè ùöêø%ýìýú!úùüþþþüäÿüäÿ,ôÜ÷êï øõèèèâóßíMèöÚ,Iñææâééæ1+ÑÔåééæééæ Ùúïò-/UýÕÅ(ü:ÿëã+;ýîûïíüèÑÞBï !ùåèÿúäÿÖ8-æÈäâAùÞÚþäþä2;ääÉÏ1èÏ1ü ÞñññÿçÔð ïÖèëÒæ8: äãÜùùùùùù$úöþçþçýú¢ùùùôñòôñòôü$)2ÿèÿ×÷ ÿþôçõâÿ 1ûÒ õðöÿû÷ÿÿèÿèþÿèì÷üçýþìþÿöÿÿöÿÿöÿÿöÿÿöÿýáýýáýýáýÿöÿþìþþìþþìþúÓúúÓúúÓú5 ã*2/3íó+1`íó"ó'-"óõâ("óÞä )5+9(Ö(*,- ä äd)Ð3*,:û3ý, ôôôööööööööö /-.îÉÍ áã ×þÿ/-4,ñôáã ÒÿúÕýôôôöööôôôôôôööö W.‘6bW.G_+1`+1`ÕÏ Z3aZ3aöÖ7Wû©c*÷Îçœû “2÷+4,ñòñ¡gÛÙ£×þÿ)>>>>>>/-VPéðîðîôôôÔ¨§÷÷34÷ôôô%òð%òððîôôôÍ!ýÖ(ü×ûÐ,ÊüûÉÍ áÿþ9 õßøîèÇ æÇ!ÙúüÜûûîþþÜûûîþþÙúüïþþëüþëüþÙúüÙúüKB<KB<ýðKELüÍäëÿKB<ï mö“ç[ç[û3!”ú”ÍÖÿýÆ*1nÖÏ’*1n92*1nKELüÍ555ÿ*ññññïÆ'#ô:ìììëÄÃñïÆùÍÌþÏÏÍü24-áÌÓóþÖ ÿé ã äíóêêêé ãíóððð é ãþ,ðððøõñññõìÔïöòñüäÿøõðððüäÿú ÚÚÚ¹âQÜ *ËËÄÒÒÌÒÒÌñññ A,—+;ü:ýÆýÆ+;ýÆSÉ/¥/Ñÿ0ò'ò'ÎûÆÂÆü'Êþ +ÉÿÐ>1Ó2;ý9ùÒþþ2/Ï1 Þ ÞòñìììÑþÿüÔÍÞ0â/Ñæ8:ÿ*ÈÆ¹âþÖþÖüÎüÎüÎ222à+,þÏíþëþÿ×ÿ×Öÿý 2þìþìþìþìþìþìþìþ€ ,/3ÏüÔç'+ÑÔå..4ØÛí÷)ßâ(ØÚñ*íþê)3..6Æö÷ó34éýýzDïê/ñ ïèøõ÷îýÑðððÿôô ý ý ý ýñÿùüûûûííí'%ü.îÒÿÑÓüU&ê 3þåç ä÷ìÿìÿúúúûûûûûûõõõûûûûûû øøøÕüé¸åÏf2KíýÕüé'ê×óÐëèÐÖ Àã[0Á…Û€™Ë>>>ááá...CJahî×ÕKË’üçó·ýúÕýÑéêþìÿæê×þÿ âüûêêÚÃÝçéé×þÿìÿìÿ333 ×××øøøýúåöâøøøéêþ¿Ã ÕØ áâöÝàúÆÉÿ§¬ ÅÈüÍÐéêþûÁÄøúùèÌâãÑ V_jÄÇ÷ö÷ö#ãÕî* øÖÿýÞÎ î1ðüàÚùùïý" þ)éÏçÿàÞ&âûý âûý âûýöþÿåüýØùúçüüàûüöþÿ× Uµ»´KELý$#;ýÆòä°ø7ø7ô® 8þþ5*ãíßð6úíèã²ý67º¶‘7ÖÏ’*1n&!åîîîù÷Îééé×Eû“ IDATúíïððð.üèÿ¾åýèçþ÷çÿ îÎý ñæêòÛï ý âù÷ú äðððõõõú ûþ äðððêêê,è ùý%øãòÛÛÛ6G3ü ùë÷êñññüøøøÿ-ÿ O+þê ëìÔïúùï öêøþ þåêÿééæééæ"ó ;ééæòïÛú÷úïòééæÑÜk"ÇÿãÚÿBå:ÿã Á+ÊàÁëè8þ9Û3Éîå,é9ô6æíúäÿæÿù+ï !!ïîÿÈ“ç7Íýý²ÿçÏ1/Ñïâ)÷ú&üÿç ü+øàû÷Þú*#øïâ) ïïâ)"Õ¹Þ#ý$ÿëä ñññùùù$ûúÒûèíÿëÿüþçáôÊñññëêìùùùùùùùùùñ(2þÏÿ×÷ û÷ ÿþôçõâÿ;ûÒôðñÿú ÿÿèþÿèì÷ëÿüçýþìþþëþÿ*þHÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/€(-îêÙõ Ü2'¿þ. Ùß,3=Ùèèÿ óíþêøøøÛ!"ø""8÷å öö¥  ˜¶+öööðððäÔå÷îüÍìéÔ õ4 ìÿò(ìÿò ýôê÷úé é áã '%ü>è 23çÿéÿ 2Àýæéý1ðÆÝûööö òñ ü%ëìÿý%íþê¸åÏf2K¸åÏ<`ëèÐWñåOéûÕÿÀã[,×ÎPxÈ*ëèÐ...Öõµ8)Iõû*ý9d…#Ï›p­HE áåñé äù:çã1,ü½èìÿ¡gÙ´ÎÊÓì ÊÓì H//Òèé,éêþîîîçççñññøøøùùùøøøøøø'%üOJ÷+(õ‘VTVTáßîûôõùú'%üÆÊòòòùøî¾ _ Öÿ˜ô Ö9—ñüúÞññÞó ÷öõøþçúòøëÿáÿþ÷øîïýêÍèð ëè( 37ËÈþÿöþÿåüýçüüàûüðýþÿñýþøÿÿøÿÿà!V&#&ÖÏ’ýÍÖÿéêãçë-/Uôã“ø7ü Sô® OÝð;'ãí5*ý6ÖÏ’77ÖÏ’*1nµ»´F8Ú+åæû Þùú#! öööéééùùù×ÿÿ2 îÎý )ÛÞÎúæÕþè3þèñßß ý þ äíóÿêõõõ ý é ãíóúøøøõõõ8øãè ùíÕð÷ö ßýúììì(%í(è% åø û-J(ÖÜú÷âüäÿîúíüû ÷)úëïòééæýÔ ò%(B ÙòïÛÿJ6Ü+ õÝßù Á÷ú÷ú õÝðáCÒ1ýçæý,-öÛè8çÎûÆúäÿ4÷ÇøÿÐÚ5þàãþå+PèØÙôÞú*/Ñ"Ðþû÷÷úÐéÿû÷õ#ü Þíó"÷úàñ9åø¼ 2ôô æ ÿëä êêêùùù$ûúÿëÿëýÒÿüþç#Aå àùùùùùùùùùùùùñ( ÿèì÷û ìü éÉÿ#ûÒôûñÿû÷ ìÿÿèÿèì÷÷Îùþìþÿöÿ ÿ*þ3ÿÿÍþææ·ûÿÏüÿÏüÿÏüÿÏüÿÏüÿÏüÿÏüÿÛÿÿÀôÖÿ.ÿý*ü¤A-õÍÓ#!%ÿýÙ1êÎññüÖÕì888› ¼ÕÿÿÞÌÕ **ôÖÍ ä÷ñ ööö5 ÿç.Ió·ÒØã(+-ÌöØþúÿäðððð)+ô.î<4 Íþ ÷ÏûÒþþ.îÉÍÑúüã ðööö õ0(ËÕ,W:&4ÚãðððÕÏ WñÈ. Aй¡!PÐÚ¡'êG_›•fekšÔûþ›•f:: ÒÒÒ'Bí,"/Ñþÿj1ž˜ŽÉcš õ/-ÑÓü)ØÖ,.ÈõÔùã,êã)êÒÒúÕýñññðððððð73é=; 8: uu‹‹æ73õÉÍ ððððîÑ ´ô÷,æê,æ%îþþ\ ¤ñôè è$+úäÑÓü1þæÜù òý*ü1;<’ÞûûïýýñýþíýþïýýÖÏ’..4ÍÖÿù¡+ó+&¹š»G?$ÇÍúküÍû3;'ÅÙÿB!•¾Ùk;'ú”ùl*1nÖÏ’*1nKELþÉþÏááñþ1ìììÒÒÒ/-Óÿ*2îÎý2ÿÖý*îÎý22á½Öþÿó äíó,¾íóþ,õòÔ,ðááá)òñçèî ööÚÚÚÚå&&&*é õ/3ð4ïÚýüÍôî¿ñññ..4ÒÒÌóÏþ,\éíó,:ç¤ú$$Ïþ/Ñ Ó0ô7Ð75ü•!ïîÌþÿ22:ÛÉ'ÊþÌÞB"î¾ 93ðÉ55ÎûÆ%Í7Ê"ËÞÞíÑ/Ïü"óÑÑþÿ/ä1ÿÏÜSØ®®ÿ‰âÑ/¥Ô\ü úÆüÎÿ*þÖÖ(**ØÖ9çå¸Höô)û×þþÖ¹âñññññññññçÎÿ21þÏ íÿúÍ õíÿÿ×þ)ÿ×ü×ûþëþÿ*þ3ÎûÿÐýÿêÿ>€ × úê(4üÔÍ;HìÿØ+ôðãæþ¾ ØåöâQ`2C[øøøóøäÿH % þþþÜÞõñ?Îïïþ(èçþbIõõãÿçìÿþìÿþ÷Î÷ã#+ 3úçüêÿþìÿì /-Fðùé é ùçñëüçôé éêþ!úùýëÿæùúûûûÿÿÿðððõõõ !úùÿX_7áÕæR05ÆÒÌ^*Cíýf2KÆÒÌÕüé9_ÂÂöïæñ$0$0.äÓê /³¶Í›•fNK3ekšëèÐ>>>áááíüùà:à¾Å„›•²ôéêþüáâöÒé!úùÊÓçéîûêýI éûñ×Dï)ýëÿìÿøøøøøøøøøøøøøøøøøø'%üûâãú;; ;; áßîûuu‹øøøòñúÿÿ™÷ÿÿ ñôÞûü#Ûúûîýþ.øÿÿÞññô úúó$û÷öø×ùÍúêÿý*ýçÿ XYð娉ñýþÝúüùÿÿíýþ÷ÿÿ íýþ÷ÿÿ ñýþùÿÿè"Xýïä¡ü0/.1íðíðºÆ9'äÍÖÿþ/-;ý6ÎÖûäÃÛ7ÖÏ’7åÿè àÎËòòùùùîîîåÿ*.45Óåå2÷çÿ  îÎýêæè3 èÆÝï Öþÿ ä÷úú÷âÿêõõõ  ëÿ äíóúøøøï ýÔÔ+#ùãü!úùçòñ×þÿøøø õõõíííÞÞÞÞÞÞÞÞÞÞÞÞÖÖÖÚÚÚ$õòü ù)ÿ-¹ÞÑ-/UýééæýÔíóéééÿééæ+,:æî(öÜÜóýKûçûÞÝ9ìüÆèèTÑâûëÒÇúö$ÝöÙ6.æø÷ 9ÕÙõøÎûÆÝÐ(ùàû÷ùùàé0 Þ÷ú/Ñþÿ)âáè÷ú/Ñõ½åý$îîééé&/ê½ç.×è./¥Èè¤ bÿÿüþçëÖÖ(*ìë$ûú) 1--þüÿþìÿ$ûúä ñññùùùùùùñ( ÿèìû÷û ÿþéÉÿ#ûÒôëÿñÿû÷ ììÿì÷÷Îùü×ûþëþÿ*Ì2çþÐýÿèÿêÿõõ 3   $G...ÿüü€÷í+ôòØÛíJ,üèÿÛÙ*)ÏÕÔØß :ñíÚñÿÿê©§T332òó9î™st÷Ð6!QR7„bêêê»×Å äD=;ýýÆÈßò(ÌéøüüþìÿþôèæûãÔøõýëýàôLö 2Îæ÷ î÷ÏÒÿúÕýìÿ,ýëÿæùúûûûûûû  ùù/ /ûË6 3ÆÒÌo¾˜ëèÐýùùù4XÒÒÌÞî !ÕÏ ÈÎý³¶ÍÕÏ ;B9GÛÖ8 ýÉòÍëŠ6´Eçîñéêþøøø!úù/÷ê ÷+ùøçü×/(î÷ì éêþøøøðððý% ûíþêåçû;; ‹‹æuu;; TXñáâöî)3ûø®ôöáûüùÿÿôÿÿâûýÜûüÁöø Êøùô öòãúêÿþõùÍý*2ÿ3ÿææèèñáÿ͸>ÜŒæüýòþþþ÷ÿÿíýþäüýæüý÷ÿÿ æüýù%ZÿãèëüþF7ß÷úÍÖÿçëìçÍþ6'Ïåí ¤õû.ü±7ÖÏ’77ÖÏ’7å±ÙþÙðùùùðð?öP¼ IDATð"""îîî #$8ýçæéä Ùçç2îÎý÷çÿ÷çÿ3öè÷çÿ èÆÝ  âùÿÿêô  ûþ äíó äðððìøëøãþ,þÕ ü%ÿê ùùüôÜ÷øøøüäÿ ï  ðððï äðãÞÞÞææææææéÍÌÓ%þäÒÒÌýÔõû$ïòòïÛÿééæééæCTÐýèÿ¸Óð$ÿ ¤ýÊà"0åæ(´þàê91äÿçêü2;åÆê»èÒÔííõàÔïèÕÔéè¡øåÈáòÀñàôéãâäÍ÷0êàé0 ïÞú* Þòñ÷0êôõõ)âùé/Ñ÷Óþ 1æææñññµæqZ1¦×è. ú´ ø‚çÿÿýãþç×'*ØÖëëí 1--ÎÑûñññùùùùùùðððòñ$ü ä÷ä÷øøøøãï. ôçèÿì÷û÷õý-éÉÿóÿ1ûÒôëÿñÿû÷ ìì÷*÷Îùü×ûþëþÿ*þ3·ûÿèÿêÿõ ) 2Ðèèþ¿ÿÓÿÓÿÓÔäÖóä "óÒþ 1Û+ÿÿ) 1"ÔÍâ( ãððð×ÙıÊDÊ<< ÙØë†ììì"à6à'#ô=;9:4à…‰ê?Øþü ÿßô4ëÌÔù4ëôÕýÿú+ 3ÑÓÛÒÿôú¢ý×þü)+ 2î÷Ï ÌÓûç)òñ+×þÿôôô ððð6bÆÒÌÀ£ÊÊ÷ÍÒ:.4ÆÒÌo¾˜5d:::íó..4ÕÏ åßä!PÕÏ ÕÏ Z3a -ªÉÍùBÖÑk5ñ¢(øoØPú»°EçÜâÿ0J$ëÐÔ+Óý×ã)ê3 @Ñ-ÿìÒþþúÕý ãâþ,ááá)þýÔáãô‹‹æ‹‹ø73ÑÓ ñýþÞúüÐøú] {ÿ÷ùñýä ýü1;<ÒÎÿþÍÛÐþÆÞúüòþþíýþòþþßûüßûü92ËËÕÏ ,üͺÉ33* ±!Pü:;ÑÓÅ/-;ù;/-éö\ú”ùlÊÙ13*ÆÒÒÌï mÖÏ’ï m;1nÅÙÿ1'ô+ôí äïäÕÕôïïïììì%34þáÊ î*2áÌÓ *2îÎý2îÎýîÎý2ôôô5<ËÕþ äðððÜâÿM þõíó äíóðÚÚÚCþ,ýÔýÔþ,é ãòñíóðíóÿäïüäÿüäÿ,ìÔïððìÔï*$.Ãå½3ÍÖÿüÇ3øñýÆéö\ÏÆ&óÏþ' Þ ¢òý"ý9ý9Éýÿ7Z&öÍýþ,Õ0ÿ1WÖ7ø$53ÐÍâÞíó"íó"í/ÓýÎÏÑ1ÚÿWÏÈ©0([Ñòâââ...ÌÏžÏZÍîz4•älÿ2Ø"Î*ØÖ*ØÖ)âö=^ ª°ñññòñçððððÓüÿäôõöööü1þÏþÏ.íÿ*ûèü×û÷*2Öÿýáÿþ õíÿí *÷Îùü×ûþëþÿ*þ3Îûÿê)2þÏþÿ×í õððð"óÙè@dÐÑ&ÿ1÷Ïý­ýþNÛÎã[ø¿îáððÆÆúÄÄ€=;úþ<7¡› 6îîîÈÈÈèßÕÿþÇ+Õ èØþäë!ú(µéå—Nø”¸ 1©ùüÓüÓÛéëÔá,ðþðçôÌÓû+úÕý êêê ööö ‘6boÊž‘6bÆÒÌÆÒÌ:.4a?gé ãðððý,..4ü¹¡íó¹¡¦ÍŸÍø4šKÿhÆd¢ Û— ú»Eç0J&l Ê“ ððð))Ùûþ/Ñüýû×þ)û×þÑüû×þÿÒññõù×ÿ'-)ñññãâÙûÓVPéÉÍ ª°ô73õ=; ÃÅóuu‹‹øÉÍù73õ73ÑÓå÷ý< íýþÞúüÑùûÛ ]ÿøýÆ *÷Ó ,ä ùþÌÌëê×þ'ê×þÿòßûüäüýòþþäüýòþÿòþþòþÿòþþËËÄ55<ÍÖÿZKóÙßè÷O:ÑÓÅ/-;ú”ùlùl/-;ÍÓÅ3.4üÅÙÿ mÅÙÿÒÒÒðð#ïúçâââËËË$$$ïïï ÞÝ4-îÎý4-îÎý2îÎý22îÎý2ð ËÕþíóðý,ÈÓâ ,ãíóíó äðððé ãòñþ,þ,ýÔòÿáÓ,íóüäÿ,ððððððìÔïBûüÍíó"óÞä,ýÔý,..4ÒÒÌÑþÿ/áøñá/ÐñÑ 1íÏ" Þ& .ÈÕ8ý9âaË%Í7ýÎ25ÄËûûØÿ]úÑþÿ1ýÏÿ1/ûÎÍÞ0óÞÞíó" Þòñ©1ÿ"ÕÍ"È26*ä Ýüèß¡õ[ÿðÿòákÛ”%älüÎ)ÚÖ(**ØÖ 1=^ ª°+OùÕ±áááòñ×þÿððüäÿåêëúÿ òìê×þ)þ)ÿ×õí Îûÿ4êáÿþ õí *÷Îùü×ûþëþÿ*Ì2ûÿÐýÿê)2þÏþÿ×í  äÞä 6'ÏÃïð 1ñ«.­ýþNÛç6#ÏÕåý,ŽÉÍüº”÷3úÌ£chþÜÜÜîîîïë¼'#ôIø8ÞÛÛÛœ¢‘Ìéë ,*íníúßW¸óÃé¤ÞûW èßú éëðððô73÷Ï Ã¢âö++ôúÕýçôôôôôôööö ÆÒÌÆÒÌÐýÿ:.4ÒúӘ̟ýÔ äÒÒÌé&..4é&'4šKeh½ÏÒjGñY˼ú½%.…ÕEç0JвæßÆø 3ðððÑüýÑüý)/ïÍ÷´%çÌÓûÌÓûÑüý×þÿ)))ðððððððððé ãâââññññññ×þÿáã ÑÓüÉÍ 8: uuÉÍùáã ÉÍ "\ µô÷íýþóþþœÿøööööööéÿóþÖ --ý*ùçÎÿÓÙ1ìèØýíòþþòþþòþÿäüýåüýòþÿòþÿòþÿòþÿ'!òÇÎþZKó'ÀüÍÙßÍÖÿ3*ÑÓÅ/-;ùlú”+¸ú”/-;ÍÖÿú”ö“ö“ððð:+...ñïÆììììììÜÜÜ 1îÎý2îÎýîÎýøõÖþÿý, 8îëìÔï*,ÿÕíóððð ÚÚÚþ,ýÔþ,ýÔþ,ç-ÿáÓüäÿ,ðððüäÿðððìÔïý,,'-ÖþÿýÔðððû3..4333..4ý,ôî¿ôî¿øñ³ÞÑþÿñÑ/ 1/ÑþÏõÞ9óÏþû¸ÔúÆÿÐ<4A\ýÏÿ1ýÏúÑþÿ1íó"1ÿÏü"óÏ1ÙÿWÏý25+5ßä Ýíó"Þ Þ Ï#‰b1¦ÌþòákÛ”Ø"Îÿ2)Úª°ª°Õ±Õ±Õ±ñññ/-òñç×þÿåÿ úÿÿÿäçÎÿü1êÿþ3þëþü×û÷Îù* *÷Îùó¥ôü×ûþëþÿ*ý ]Ì2Ðýÿê)20Ðý¦ÿ×ÿÄí *I*****€íó*Û3Þîåþ1߿߾ýÿ:èùàEïðûéúêÿôôô#æÝûÿëúçêú û$$$ïíÕÐâåæâèòß÷ÇÍöúøøñïÔõöõúôý õúó ý ý2;ý½æëèßú ûûû 53 j6 çÿÿÎæüäùô ä÷4-éÿÿúÕýçøøøúúúöööûûûöööûûûÿÿÿúúú¸åÏ,:.4³æåèÿé ã$ü£äÏìÿìÿøøøøøøÿêøøøëèÐøøø0`­ÇßÈ–sSˆáC1.8EæÁ~¶|çæ¾æàÑVA6Ýùú ùù+êþ齿ëûêý$ýêñ/*1ðì ýëÿìÿùùùðððøøøñññíþêíþêéééøøøÝàôõ73õ+(õ+(õ30ýå笨‹‹æ“þáã úåçåçéêþàóô˜úþ| ¥ý üüäüýëüý ïþþ ¯íð÷ ü+ 6^ÿææé3Õæï4ê×þìóðÿøA÷ó¥ùÿìýþúÿÿùÿóþþúÿÿ óþþúÿÿúÿÿúÿÿúÿÿúÿÿúÿÿüFü±¸Çòðíû3;éêãïä¡ü0 ¤õû.ý6ÅÙÿZCÊ B·ëñ$92àê5ú”Tý6ãíø7ø75JÕ ÷%%%îî=½/2 IDATîùøã% ñïÆøù ù÷Î ú¼ËÒ   îÎýêåÕúÿëúÿëþè ÷çÿ÷çÿ÷çÿ2èÆÝûûû"ëÿýÔÿêÿû3øÜõñÔ+ ä òþþþõõõôíô-ÿýÔþ,øãþ,õò#úä÷øüäÿþòþòüäÿúùüäÿ÷ %,ÿÕô ûëÿÿê/.1ééæÿ..4;74ùöÛáÞÆ ;ØÛíïòFñ#!òíðúèÿÌÏ,Âíó"Úÿ 2óúèÿ°ÉN0ìé¦Ú 'å˜ÌŸÌæÐúGéïâ) Þùùàé0!ßñóæë ï ïü"óþúÓê4ÎÕ-C‡ï÷>fE¹ÍÞ$2TÉö±%älò6ýãþçþÖëìë¸ 'û 1ÕØ+Où(ýëÙëÙòñôñòä÷øñññøøøÿä!ûüÿýâûåöõú/õöõöÿ  ÿèì û÷õÿÿýýõâÿóÿÿÿüÿ÷ õüçýëÿ* Ïûüçýü×ûþëþÿ*þ3ÎûÿÐýÿÒþõ)0Ðÿèÿ×í÷ %*÷Îùüçýüçýüçýüçýüçýíó *ÖÖÿ*ÕÍâ(ÔÍê(ãäÈÎ 1#Ñ ãâ^0ÏÕìììÊÊÊOK5ÄËôÐ&ôýñññ,ÿâ×ðÿôõ êéë¿ÿÞæÿôú! ôj6 5õÄÌáã +òñôôô ööööööé ãðððð‘6boÊžôôô 0`ü£ üŽ r!SlÖÈŒÊÅ+X„nÞjId òOV©ÁªF›­¼BTCÃÑÓöü´üèúü!õÔùÑ åþãÞÔÌ×ÿñññððððððTXñáãáã ððððîÇ÷öÞûûïþ\ñø  ù--þÖ6^é3í9êþ×þö:Øýðþî4»þþñýþñýþñýþñýþÊÙ13*ÍÖ3'À;...ù;éö\ÅÙÿ;'ÅÙÿÄÑ792ÕâH92ÇÎþ92ÇÎþ28nÇÎþÑÓÅB'ϾßkÞ ñïÆÿ*þÏ%%1ÛÛ::ÊÌÒîÎý2îÎý2óÌ *2 Ùî$2úé ãóüäÿîëÿÔþõ ãíóýÔðððîëýÔþ,þ,ýÔþ,ýÔõ,ñððüäÿüäÿ,ðððéÛ%å äÔó+*õé ãòñÀýðÒÒÌ"ó ..4ü:ü92ÕâH ÒÒÌ"óÞä ý9û¸Ùßü:.ÈÜÜéÒ\.È&ú$$Ïþ9ÞðæßÕêÿýþY'&úÑþÔ+Ð-Òÿ23úÑþ˜ÌŸ4-Ý/Ñ1ÿÏââÞíó"5Þü"óüÞ ñÑ/ ÞýÚÿ½îyš»G4è­77úÆÿ**ØÖÈÎ#82Ý+Où Nøô²ôáãððð,ððððððôÑðîê ðððêìê×þ21þÿ×ÿõíÿþ)íþëþüû)÷Îù*2÷Îù÷üü×ûþëþÿ*þ3ÎûÿÐýÿêÿ)2ý×í *÷Îùü×ûþþþ€úë äâùúëþ äôââüêêéééõìéçýïúêÿ)<=ïßùþÁåèØþêäø ÿÿ3/æââæÀæýî ùù..=èþÿâââõöõöÝßþõö ä÷1âåèâæüÊáõøøøøøøíÒÿÑÓüü ùù+ ä÷æùúûûû ûûû ôôôðððõõõq=VA)¢Ï¹õõõ7"ãéæ¢Ï¹õõõõõõÿÿÿôôôúúúðððûûûûûûûûûûûûûûûÿÿÿúúúúúúúúú0âßàâ ÓþßâѺ íåÐÉñÔüí±ÿýBë'Ý5ÏÐÖ5{ýÜæ êñëúïôê÷ýòþùñþóþÿë áõëÿ æúñññøøø///ñññ/-áã ÕØ ôõå綺éêþéêþéêþøøø'%üúñòðððîÇíî¯ÿ÷þýùÿßÝôöË÷ù ýÿææèè ÿçÓÙ1ø:ýá9ëêö' þë0J7 ³ë¢ùÿÿùÿÿùÿÿñýþòþþîþþîþþûõÿÿ,{ÿã [éêãåíÅÙÿãíãíZCÊÿäÇÎþ92ÇÎþ92ÇÎþú”MLV±½ú9'äáîö“ø7™áã åééíïñïÆùøãøù 3êåÕþè2áÌÓúÿëþèùÞÎ úÀò-áú$ äöêøéû úë÷ôß@ ü%é ãíó äððð õõõâóß ûýÔþ,ýÔþ,ýÔþ,øã øøøøøøøøøüäÿ)ûìÔïþÕ ü%Øýé -0J !äíþäçÿþþý !ééæ,TüÇÕïü:0÷òÀâÑ[AÉÑËË3óÏþã* 2ÍÐåÄÇÛ ÔÿÕÿ:0èýéÔ+Ð,Õ0•µžÌæÐ4-ìFáèè÷ú ïæË!)ø.Ñéä*ÚÀ öþúä* òòéÇ«¼æÿD3ýãüÎþÖÖ(*ìëÜÚñ+(þïÈÎ#îáÿÿå²úÙòñ$üáã øøøøøøøøøðððøøøøøøùúðððê øøø)ý0èÿõ ôç üì ÿü1ôçõìÿõöóÿþüÿ÷ÿõóÿöÿþìþüçýüçýüçýüçýø¾øþìþþìþü×üÿöÿÿ6þ3Íþ·ûÿèÿêÿ)2þÏìí *÷Îùüçýü×ûþìþþìþþëþÿöÿ  äðððððð)ËòóôÔý)Ëôô× )ÜÜÜêÑ2êü[%а¶Dìì×ááíôä öðÐÑ&&&ÚÚÚ ööö ööö ×þÿçá òÒÿöððð).îáã ððððô+ Ó ôôô c¾’ööö“â¼ìÆ ôôô ûРõ0`ýÓÌýòò÷ýýÔýÔO€ôРÕýÂÂ$"ï¢ù.. .îÓþüº¾ü öõ(,úÕýçððððððððððððñññ73õáã f`ùÉÍ 73õ73õš  ô Û %òð"úøè 44çÎÿÓÙ1ýÚÿõë)ýíAî4Ñú25 :ùÇõÿÿ õÿÿ õÿÿõüý õÿÿ÷þÿ ìýþ ìýþ ýÎùlÅÙÿ;-;ÅÙÿ;' ¤®Ï[òì¶92J92ÇÎþ92ÇÎl/-;ÒÏ’tc<Œ§mÿ*òÓ÷Ïýü"óð¿Ö,>5.áÿÿîÎýîÎý,Ôó äíóð$êêêÓâþ+!õ ãðððÚÚÚðð'-þ,ýÔþ,ýÔþ,ññãòñðððððð-íó+!ÕßÒö; Þäÿ,ýÔðððÍÖÿÅ3*ÇÎ:ÑÓÅ/-;ÍÖÿý9úÆ ¤ù\éö\ "ÆþÑãàl"Ç 1óÏþÐþ Þéö\ôÉ[@3ÿÐùÒ.ýÏ,Õ1˜ÌŸ4-à-ÐñÑ/õ#üWÐàñÑ//Ñä Ý("ü"óñÑ/à/Ð Ó0ñþ/ß.¦®Ï[B!•òákúÆ*ØÖ)Mö³á 1Ûî£øôòñççðÓððððððððððå óôÿðö0Ðýÿêìê×þ)çÎÿ0þ)ÿ×þ)êìÐýÿ24*þë¾üûþëþÿ*þ3ÎûÿûÿÐýÿêÿ)í )ü×ûðððôôô ×þÿ5 ×þÿôôô ×þÿ ÍÍÍááá02ø9û×ÿù¡Ì4$¹ÝÛùááüááððð&&&ÚÚÚöööêêê ööö&&&äääðððððððÓüôúÕýÒÿúÕýðþð ûР÷ÓáýÔûРúÕý, þöõñññáááñññðððáááÉÍ ððððð/-ÉÍ 73õÉÍ ü Ûïs&5Éùþر7èÆùAî0 :ð2ùÇûÏõÿÿ÷þÿ ìýþ ìýþ ÷þÿ÷þÿ÷þÿùlÅÙÿ;'ÅÙÿfE¹š»G[wVÊÈÎý82ÇJÞØ¢92^929292pðïÿ Ö3..÷Ä# IDATðððAÞ ñïåÿ*îÎý22îÎý4-áÌÓ4-îÎýîÎýõ ãíóýÔ,õé ãíó äðððêêêêêê'ýÔþ,ýÔþ,øòãñç€ÿðððððÔòñþ,,ËËËDDDöÛ1 %ù×ÿððÍÖÿ/-;52ÇÎþÑÓÅû3,:ù:üÇ09Ð:ñÑ;'ýÀ¥ý3*ù\ÿÇÍý9úÑþ.˜ÌŸÐ4-ñÑ//ÑþÿÑþÿÑ//ÑÿñÑ/'!òò2ÈýñÑ/ÍÔÌ9åâââ¾ßkòák3Û”(Þ2üÎþÖMöª°VPûî£øçòñçððððððÑÓüöööööö2Îûÿêìê×þ)ãÐ021Ðýÿ22üÖþìÿèÿ*þ3ÎûÿûÿÐýÿêÿê×þ)ÿõí áÿþÖÿý1*÷üû·VÿúÁ/ÿò‰'ÿÿbbbÿÿÿÿ|*(ÿé%ÿ2 ÿK ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCCCÿCCCÿbbbÿCCCÿM% ÿM% ÿM% ÿM% ÿ$$$ÿbbbÿK ÿS*ÿÿ$$$ÿÿÿÿÿÿÿÿÿÿÿ;3 ÷É,:fTTTÿ¬¬¬bbbÿÿ5ÿÿH-ƒÿÿÿÿÿ|*(ÿ„ÖØÛã2 ÿ0P'ÿA ÿ6G!WWWCCCÿbbbÿCCCÿK ÿK ÿ.ï.ïK ÿM% ÿËó >>>ÒÒÒM% ÿM% ÿS*ÿ­ÖM% ÿ444ÿ444ÿ444ÿöööôôôÿÿööööööööööööööööööööööööÿÿ·V.ÿøÃÿbbbÿ92·V.ÿøÃÿ¬¬¬ÿÂÂÂÿÿ5ž3ôñÿø ~W…ÿ¸Ó}H-ƒÿH-ƒÿ~W…ÿÿEC†±|SQ(ÿÿSQ(ÿ‰…Vÿ„ÖØ0P'ÿ8óŒ81å¿ôCCCÿ­ÖS*ÿK ÿK ÿK ÿ½½½½½½ááá6G!6G!M% ÿK ÿvvvÿvvvÿ…ìñ…ìñÍ .ï4.JJJÃÁ¦ñïÔf S*ÿM% ÿM% ÿ444ÿ444ÿCCCÿÌÌÌOÿÚÚÚCCCÿ444ÿÌÌÌ444ÿòòòööö öööööö ööö{ÿRÿRÿ½‡2ÿAm_ùÇÎCCCÿbbbÿtttÅÍùÇο“¡bbbÿšššÿÖÖÖÿñŠ[ÿ:4-·V.ÿÿòòò êêêöööËøú-ßæËøúe ~W…ÿ‚©{~W…ÿ¸Ó}H-ƒÿÜ÷¡ÊÖþ~W…ÿM% ÿM% ÿS*ÿM% ÿòòòÿÿÿ²ÿèèèÅÇðõÆÌ èèè_ÌîÊÌÒаÙ¼âÔàøÅËÒM% ÿbbbÿ½½½ʹߵô÷M% ÿK ÿÿM% ÿM% ÿK ÿM% ÿµô÷©©©vvvÿ¼ˆXÿyKÁ„ IDATM% ÿM% ÿ444ÿñññáááCCCÿÒÒÒ444ÿ444ÿÿ)þçý·Vÿ2ìììÿK ÿ3ôñ©—Åî²­\0"(4.Î$ÿʹßÌÒâ4.³ÛôÌÌÌCCCÿ½½½CCCÿÕzØAÕÕÕ444ÿ ööö ööö {ÿÐøúRÿ<5M% ÿ<5ÄË佇2ÿRÿ444ÿvvvÿ=sÆÌÓ·V.ÿWWW€¨3šÉ€¨888ÈÈÈÄÄÄ92v¥=s·V.ÿaÂêèèèÿöööÿôôÿôô„–—L^_›ðôþìëH-ƒÿ‚©{‚©{H-ƒÿH-ƒÿ¸Ó}$ _¸Ó}‚©{H-ƒÿ4.bbbÿM% ÿÁéM% ÿbbbÿ4.ÿÿ­{zñï¹ÿ”””|*(ÿÿÿÿööö…‰¸öööSQ(ÿ)ÙK ÿ²ÿ|*(ÿ)Ùÿµô÷*á8ö7žžžµô÷ÿ³Ûô³ÛôK ÿM% ÿM% ÿM% ÿ5 ôþçýÔàøµô÷³Ûô>çºî O'ÿÿ O'ÿÿ4- é%ÿM% ÿM% ÿ¬¬¬ÿÌÌÌÌÌÌñññŠ„ÿ333ÒÒÒÌÌÌÌÌÌ444ÿŽº»Ê¹ß‹ÊÍÿÿAmr:- RRRÿ¾¾¾^^^vvvÿµô÷bbbÿÙôôô ðªùõ#L)Qj/ÌÒâû×þÌÒâËó ñññCCCÿÂÊ¿…çãúã39ñññCCCÿÿöööööö{ÿÐøúµô÷CCCÿvvvÿ¬¬¬ÿvvvÿ444ÿRÿ<5ÄËä4- M% ÿM% ÿžÚÌÓöCyήêRÿ444ÿÿ Ü RÿIªÒ:4-ÜÜÜ666êêêmmm<<<tttfff=s;4ÿ 01ttt¬¬¬„–—K ÿ¸Ó}s\µZ†ÿµZ†ÿ¸Ó}ÌÒâñÈSQ(ÿsEo9`4.SQ(ÿñÈÌÒâÿÿ—ÉʼŒÁÐ~|Ê *+»‰ˆÿ‰…Vÿ€TSÿ»‰ˆÿ‰…Vÿÿ{wHÿÿ)Ù×'¡4p10Ê ×'qm>SQ(ÿ0P'ÿS*ÿ¼ˆXÿVY‡Ã» âÉM% ÿS*ÿS*ÿM% ÿTTTšššÿµô÷þçýÔàøþçýµô÷ßûübbbÿS*ÿFâìììS*ÿ444ÿøÉñ O'ÿ O'ÿ O'ÿýñà±ÙÿM% ÿRÿM% ÿK ÿcü÷ÌÓödïocL4.TTTƒ"ç-Òþ¯­’ƒ"çÚÚÚÿÚÚÚ&&&‹ÊÍ^^^®zJÆÓö·Vÿ})ÿÿñññ...¾¾¾bbbÿÿbbbÿŠŠŠbbbÿ>>>5 ôVñ@áߢ¢¢úLN)³ÛôèèèñññCCCÿÇÔÁ ÷ÿôܵàáÚÌ ÕÕÕððð444ÿööö öööµô÷444ÿvvvÿiiiÊÊÊBBBM% ÿžÚ®êʺóRÿRÿ³Ûô³Ûô®êÌÌÌCCCÿ²ÿi:þʺó+Z–Rÿbbbÿ888ttthhhìììžžžCCCÿWWWfff|*(ÿœîðd;,aÂêŸ>IªÒÿÿôô ø öõ÷þÿ> µô÷H-ƒÿ¸Ó}µZ†ÿ/¤ûm-“Óý¸Ó}H-ƒÿ¸Ó}CCCÿ½½½ #$ÿè2ä4.ÌÒâÎå¿ôbbbÿ888tttòòòM% ÿþçýÃ÷ö, ³Ûôÿ;964.ó¥Ò×'h8`EwxÿEC»½æòòòÿèèèÿn6óî™ïó1×'­¯Ø‰…VÿÊÌÒ­¯Ø2 ÿŒ81‡»ë¦âÚ, ìаÙ2 ÿl!!;5.Dx¨ÿòòò½†"ÿCzÞRÿʺó26MÑéšššÿÈÈÈáááñññ333 Ý´Âðááá...®®®é%ÿ7* ÉÖö/óûèèèRÿÌÓö4- ÌÓö4- ʺóþçý6G!ʹߵô÷Š„ÿÁˆìÍ  ðÕž'+bÙÛÝøÿèèèÿÈÈÈ888òòòK ÿ2:- ”¶îµô÷·VÿIªåCCCÿ®®®RRRÿÆÆÆ+++¬¬¬ +++½½½CCCÿ½½½M% ÿ×ÿ>>>²­8ÃGKž™Òýf ×U÷Ïû2ÜMÑÕ444ÿÑÙÎ%ðÛù  ü öûöþû÷ûåC?,½½½CCCÿËËËòòò{ÿ…ìñK ÿµô÷{ÿ…ìñbbbÿtttÂÂÂÊÊÊììììììÒÒÒÌÌÌRÿ®êK ÿ6F hÓdï³ÛôbbbÿP»´:>BÆÂ¾Nãêÿ^^^ìììð´—Æèèè})ÿƒ×ïÿ5 ôËó èèèCCCÿiii***NNNêêꌌŒfff444ÿ...žžžÿ©H ;4Š òœîðèèèÿÿôô ø öõ÷þÿ#Ðøú~W…ÿÊÖþs\¤û¸Ó}ÿ5 ô³Ûô ÿ ,aÒþþ·ÆÜöéüšššÿÈÈȶ¶¶èè軉ˆÿƒÖùûí =þûnd|Ewx€TSÿ˜ÄÅèèè€TSÿ€¬­ÿ ööö öööòòò|*(ÿ×'ø»áµô÷ÿd×'ÅÇðèèè0P'ÿÚÇÝöéü ÿ9,?ÇÔÁöéü2 ÿ§VOR†¶òòòÿòòòRÿ—Æ›ÿeéèèèCCCÿ½½½444ÿžžž444ÿñññÌÌ̉.Ž= IDAT O'ÿêÈÝG ùñõãâõåû8#à±ÙM% ÿØþü&é4- ÌÓöØþü(þçýµô÷ÿèèèÿ ðéëòòòÿ ööö555ÒÒÒÌÌÌS*ÿ»äòòòÿ555ËËËòòòÿ èèè·VÿIªåøÃÿSI|lJÆÓöƒ×ïK ÿµô÷444ÿÌÌÌÿ+++½½½444ÿÕÕÕèèè³/+ÿšöá=VñÈÌÒâ.ïÿêç? 1÷Ïû 1)«üšöáç(ðððêêêTTT¬¬¬ñåùÜTTTáááËËËòö C?,½½½ÿòòò{ÿþëþþëþÎãø0µô÷K …ìñbbbÿ666ÊÊÊìììJJJÊÊÊŠŠŠM% ÿ³ÛôRÿ®ê²ÿ7Ûã})ÿq‰Õ¦j 2ÁˆìÍ èèè})ÿÎãøËó 5 ô0)ÌÓöËó èèèîîî<<<<<<ÈÈÈÌÌÌžžž W¸àÅÔú p.èèè òòò ŒŒŒ&&&÷þÿæüýH-ƒÿÊÖþm-¤ûs\m-èèè4.CCCÿCCCÿöéüýôàûòåÒþþöéübbbÿPPPÒÒÒèè軉ˆÿEwxÍ *sEÖùû³ÛôEwxÿýÇÿ€¬­h<;€¬­ èèè EC×')Ùèèè„ÖØ„ÖØÅÇðèèèаÙöéü÷ ·~ìXK^ëÎ÷ëÎ÷Dx¨½†"ÿ®êèèèeéèèè>ç½½½âââðððÌÌ̽½½... ,óõãâ>8#êÈÝÿ4- 4- (Úÿþçý¤ÑòÌÓö&éËó ÙÿèèèèèèèèèóõsDÿñññ¬¬¬bbbÿ444ÿ»ä ËËËöööøÃÿ·VÿK ÿIªå…f„­·„”¶îÎãølJÌÌÌèèè½½½ÌÌÌJJJšöáþçý.ïñÈ 1Øþüûbg;CFÿêçÒý÷ÏûÌÒâáݚöáËó 555áááTTTêêêõåû÷ÿô¬¬¬555 ÷CCCÿ …ìñÎãøþëþÎãøþëþ2BrbbbÿtttÊÊÊÊÊÊÒÒÒ>>>³Ûô4- ®êNãêÛãÿvvvÿÐüûç¸|Õ¦jÌÓö÷Îù?x})ÿM% ÿÐüû5 ôÐüûü×ûþçý0eù})ÿËËËÜÜÜÖÖÖÈÈÈŒŒŒ¬¬¬ÿÿÿÿèèè ;,¸\Ê·V.ÿ|*(ÿòòò èèèööö÷þÿ|jiŒŒŒTTTâÐÏ0ÿ~W…ÿ¸Ó}¸Ó}“Óým-¤ûúÑþ“ÓýH-ƒÿ—ÅîK ÿS*ÿM% ÿS*ÿK ÿ âÉS*ÿS*ÿ ÈðäS*ÿˆˆˆ°°°äääèèèEwxèèèà²Ú9€¬­èèè èèèèèè ÅÇð‰…Vÿ)Ùœîð1‰…Vÿèèè ÿü öVÕ¨µ¢šššÿK ÿòòòCzÞèèèÂð...CCCÿ½½½žžž'^ÿêÈÝùÜ 3-tSM 3-à±Ùöéü'^ÿ5 ôÌÓö&éÚÿ&éØþüØþü3ôñ'èå5 ô¼ˆXÿèèè—Æÿÿ ööö ñññ¬¬¬...ÿòòò èèèÿÿsEòòò=sIªåµô÷¼ˆXÿ})ÿƒ×ïÄÅËlJlJ})ÿIªåK ÿbbbÿÕÕÕððð³ÛôçNSá8›ŸÙÕ–“•µ´ªùþçýÌÒâá8Ëó Ëó èèèÌÌÌ555òòòááá%n áááÂÊ¿¬¬¬öööööö2þëþÐøú©åüýÐøúþëþÐøúÐøú¾Ží³/+ÿ³/+ÿTõó@áßa"ÍÍÍììì666ÒÒÒŒŒŒ666vvvÿbbbÿ®êÿ5 ô«Ž4- 2 ³îÔàøÃ¡ïeù)Rÿ³Ûô³Ûô³ÛôËó Ëó Ëó ÎãøÔàøÖùûÐüû›ï})ÿ˜˜˜xxx¶¶¶ˆˆˆNNNNNN¬¬¬èèè èèèŸ>W¸à;4œîðaÂê„ÖØèèèèèè0ÿ |ji´¢¡÷þÿ  ø 0‚©{H-ƒÿ¸Ó}K¦z“ÓýÜ÷¡Ü÷¡H-ƒÿ¸Ó}èèèµô÷ÌÒâÁé³á S*ÿÁéÌÒâá8t0ïÖøÈðäG!Vÿ°°°ÜÜÜèèè?þ`M?þ`MM% ÿèèèÿööö êêêèèèw{ª|*(ÿ×'èèè„ÖØó¥Ò  öéüöéü{˜obbbÿ>çCCCÿžžž®®®CCCÿ ÿùñöéüòòòÂËÒÕÿÿÂËÒ ÿã¹ó O'ÿ³ÛôÌÓö4- &é&éÚÿ‘´¼ˆXÿèèèÿ ööö êêêÌÌÌèèèñññ ÒÒÒ555444ÿèèèòòòööö­ÖDx¨ƒ×ïûÎÃÆÓöÎãølJbbbÿžžžèèèñññRRRÿµô÷骧ëê(&é00&éÚÿTõó)Qjèèèñññ½½½ËËËü öæ­„ ËËË  555})ÿþëþÐøúåüýÙ…ìñµô÷…ìñMÑÕMÑÕÀ!ø7:ÒÒÒ¶¶¶ÌÌ̾¾¾¶¶¶vvvÿM% ÿeù4- *ÌÓö÷Îù*ü×û_‡ Ðüûõ$`ü×ûM% ÿèèèèèèþçýÐüûÍ ßûüþçýÐüûèèèƒ×ï})ÿÿòòò|*(ÿ’äæä|(ÅÌøIªÒK ÿ0ÐøúÂöùóþþÿÿôô#æüýêüýH-ƒÿ¸Ó}H-ƒÿ¸Ó}H-ƒÿ¸Ó}H-ƒÿÜ÷¡Z3a‚©{ÿ5 ôÁé +++ÕÕÕèèèS*ÿÌÒâ×ÿôôôi;ÌÒâËó èèèšššÿÜÜÜÍÍͽ½½M% ÿþçýþçý³Ûôÿèèèÿööö öööòòòSQ(ÿø»áµô÷K ÿE­¯Ø#ÿ"-!аÙ ÿ .: âɳÛôÿòòòCCCÿ½½½444ÿÌÌÌ444ÿÌÌÌbì<ý IDAT O'ÿÕýü+õãâëÎ÷ O'ÿà±Ù'^ÿùñà±ÙK ÿØþü&éÍ 5 ôËó èèèS*ÿ­Öÿèèèÿèèèÿèèè444ÿÌÌÌÿòòòÿòòò})ÿ:- –Ïñ0:- ”¶îÍ èèèCCCÿ½½½CCCÿ½½½RRRÿ®®®ÿ3ôñÚÿ&é+jmž™ÐøúVYñÈÌÒâ)QjìììžžžCCCÿñññÌÌÌCCCÿÇÔÁûöþ  555ËËË555½½½ÿ öööòòò{ÿµô÷èðîô'èå0…ìñ³/+ÿ(*bÁÛ(*~Ýßðððôôô^^^ÍÍͽ½½êêêÿYYY½½½ÿööö?þ0)ʺó6F ÌÓö4- ÌÓö0Ðüû³ÛôK ÿµô÷M% ÿ³ÛôK ÿµô÷K ÿ³Ûô œîð ÅÌøW¸àåüý#óþþn ¸Ó}H-ƒÿ¸Ó}H-ƒÿ¸Ó}~W…ÿ¸Ó}$ _Z3a‚©{ÿÿÿ+++ÁéöööÕÕÕ+++CCCÿÿÿÿÿÿ4.êêêöööööö4.5 ôÿÿÜÜÜììì½½½ÿÿÿþçýÔàøÔàøÁéÖùûÿÿÿÿöööèèèÿöööÿÿ‰…Vÿµô÷ÿÍ ‰…VÿK ÿ2 ÿ"-!аÙÿ ùñý½½½þçýÿÿÿÿÿÿÿÌÌÌÌÌÌÿÿî¿çêêêøÉñ 2 ÿÿ2 ÿ2 ÿç°ýÿK ÿÖùû4- óõµô÷èèè­ÖÿÿÿÿèèèèèèèèèèèèèèèÿÌÌÌÿòòòÿÿÐüûAmrËó {š|2=Í èèè½½½bbbÿ½½½$$$M% ÿ{ÿèèèÍ éë0ž™ÐøúÚÿ5+4.ׯ–ìììžžž444ÿáááCCCÿbbbÿÇÔÁûöþ  555ËËË555ñññòòò ööö ÿÿK ööööööÞÞêêêÓúÿK ÿ{ÿÿÿeéíýØÖž?=[ßãýØÖôôô^^^^^^ÕÕÕÿÿÿŒŒŒÕÕÕÿÿÿÿÿÿÿÿèèèòòòËó ‘åý6F ü×ûËó ÁéÌÓöËó ƒ×ï³ÛôM% ÿM% ÿK ÿÍ ÿK ÿÍ ÿËó ÿ3ôñËó ööö?þþçýà èèèÿd„ÖØ0ÿåüýÝúü mÐøúåüýÐøú~W…ÿÊÖþ¸Ó}ÿööö555ÕÕÕèèèÿèèèÿööö èèèCCCÿááá½½½ÿööö÷öí ÷ößûüÿèèèÿöööòòòK ÿEø»á07 §ñõ"Ø=ÅÇðèèèK ÿÚÿóõööö ööö=þûËó èèèÿòòòÿööö èèèCCCÿ½½½444ÿÌÌÌÿöööAî¿ç èèè!ÿ, Áé?þÁé èèèÿèèèÿööö öööòòòÿh<;xo:ˆ‘ÆŽº» èèèÿööö +++ÕÕÕööö555¶¶¶èèèS*ÿ 1Ž”é3ôñÚÿ(Ëó i;ÌÒâþçýµô÷ÿööö÷ÿô ûöþ>6AËËË555ËËË&&&ÌÌÌÿ èèèÿööö èèèÿèèè¶WUÿbÁÞ?=bÁÃööö555ËËËhhh˜˜˜555333¢¢¢èèèÿèèèÿööö ööö èèèÿèèèÿ5 ôËó 5 ô³Ûôÿööö?þÁé 5 ô³Ûôÿööö=þûÁé=þûÁé èèèÿõêê mµô÷èèèèH-ƒÿ¸Ó}ÿèèèbbbÿ¢¢¢èèèÿööö èèèÿööö èèèÿcü÷Ø=64.‡³òþþg Ê ×'ø»á0…ìñ%#ÿ(Áé=þûÚÿ(Áé öööòòòÿèèè444ÿÌÌÌ444ÿÌÌÌÿäääèèèÿèèèÿèèèÿ5 ôocLÅËÒ;5.R†¶?þocLÅËÒ»ä èèèÿööö?þþçýÃ=þû³Ûôÿèèèÿööö555¬¬¬555¶¶¶èèèM% ÿËó èèèÿ5 ôËó èèèK ÿÍ i;—Åî‚‚‚³‹rþçýÍ ööö÷ÿô  òòòÿ èèèÿööö ööö öööòòòÿèèè¶WUÿJ©«ÿ+++ËËËòòòvvvÿŠŠŠÿèèèÿèèèÿèèèšššÿ~~~èèèÿòòòäe“q IDAT€ÿÿ5 ôËó èèèM% ÿ4.Gp³‹r4.ÌÒâ³Ûôÿèèèÿööö ööö èèè|*(ÿ„ÖØM&%ÿ³ÚÛ|*(ÿ„ÖØbbbÿðððáááìììððððððááá½½½M&%ÿ/n cðõ³ÚÛ-QQÿÓ¯¯ÿòòòM% ÿØþü(³ÛôM&%ÿ³ÚÛM&%ÿ³ÚÛÿòòòÿòòò444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌbbbÿðððáááìììððððððááá½½½ÿ5 /ÑüýçÌÌÌÿèèèÿöööòòòvvvÿŠŠŠ444ÿÌÌÌ444ÿÌÌÌM% ÿ4- ®êM% ÿ4.;5.ÅËÒ­Ö|*(ÿ_ƒ-ÿ0P'ÿ_ƒ-ÿ_ƒ-ÿ_ƒ-ÿ_ƒ-ÿ0P'ÿ$$$ááááááìììððððððáááððððððððð³ÚÛÑüýÑSX/M&%ÿšššÿêêêÿ444ÿ-QQÿ^„Uÿãã-QQÿ!ÿÿ444ÿA ÿTPÿTPÿ%#ÿM% ÿËó óõØþüM% ÿ2 ÿCCCÿvvvÿbbbÿvvvÿbbbÿbbbÿbbbÿvvvÿ¶WUÿ¬¬¬ÿM% ÿÿ³ÚÛM&%ÿ/£fe/M&%ÿM&%ÿM&%ÿÿÿòòò444ÿ444ÿ444ÿððð444ÿ444ÿ444ÿððð444ÿ444ÿÌÌÌIPÿK)Qÿ$$$ááááááìììððððððáááðððððððððÿM&%ÿ5 5 ÑüýççÌÌÌ444ÿÿM&%ÿÿÿÿÿ CCCÿCCCÿvvvÿöööÿ444ÿääääääM% ÿM% ÿþçýÌÓöocLþçýÅËÒʹßK ÿ0Oÿ0OÿCCCÿ„ÖØ¶WUÿM&%ÿ³ÚÛ¶WUÿ„ÖØ¶WUÿ|*(ÿ„ÖØ2 ÿаÙÑÍúg=/g=/g=//3_ƒ-ÿ0P'ÿðððìììâââáááìììðððññññññðððÿM&%ÿ³ÚÛ’œ„Ñüý³ÚÛ“··7=fbbbÿ444ÿù¥§ÚÚÚ»¸M% ÿK ÿí ÷öùbbbÿ$$$ÿCCCÿbbbÿ\††ÿCCCÿÿ%#ÿ-Rÿ/- Ëó èèèÛÝøØþü8ó2 ÿ444ÿ‰ƒÁbbbÿ444ÿS*ÿ‰ƒÁ½‡2ÿCCCÿ—ÕìììbbbÿýØÖbbbbbbÿbbbÿ5 ôM&%ÿ³ÚÛÑüýù™“M&%ÿ³ÚÛ³ÚÛÿÁèéM&%ÿÿÿÿÿ444ÿ444ÿIPÿK)Qÿðððìììâââáááìììðððññññññðððbbbÿbbbÿbbbÿ^„Uÿ”¿Šÿ^„Uÿ ÿÿ5 /ÁèéËòóççÌÌÌ444ÿÌÌÌM&%ÿÿÿM&%ÿËòó ÿöööÿöööôôôèèèèèèCCCÿWWW333$$$ ®zJ®zJèèèvvvÿŠŠŠÕÕÕŸ>Ÿ>ÕÕÕ·V.ÿ¼ˆXÿÿ444ÿÌÌÌM% ÿj1j1M% ÿþçýS*ÿûÎÖʹß;5.Ãq|OùÂ_ÿM&%ÿÚÈõ7CCCÿWWWšššÿ|*(ÿÆÓÓÆÓÓ|*(ÿJ©«„ÖØ*)_ƒ-ÿаÙRX¼g=/g=//3ððð$$$...áááñññððððððñññÿÿÿbbbÿbbbÿ444ÿCCCÿbbbÿCCCÿCCCÿ³ÚÛà,E·+ *888ÿù¥§ŒŒóQué(+Éß÷ÖùûßL-QQÿãã888CCCÿááááááÜÜCCbbbÿCCCÿÿ<8úö âüÑÓöÓþü 2-<8ú)ôÛÝøÎ2 ÿ...žžž‚Zóáááááá...Âðci+ìììw­ááá‚ZóžžžM% ÿ%#ÿÿšöáúŠ„/ÿRRRÿeÜx IDATëêf Ëó ³ÚÛdïÑüý/M&%ÿ|*(ÿÿÿM&%ÿÿööö?³ÚÛ¼ˆXÿS*ÿS*ÿŠ„/ÿ¼ˆXÿÿÿÿÿññññññððð444ÿÅû¾þêÿÃå½ððð$$$...áááñññððððððñññCCCÿCCCÿCCCÿÿCCCÿ^„UÿT™ÁÊÅËï¢ÐTmQ ÿÑüý/?5 ô½½½MöS*ÿ³/+ÿËòóööö5 Ëòóöööööö½½½‡¶«±ÚfffÿöööÅËÒ\Àÿäää5 ô”¶Ûj¯Ö M% ÿûÎÖèèè444ÿÌÌ̽†"ÿM% ÿocL3”ÏÊýj1ÿÂðnÍÚþçýÃR†¶=þûûÎÖÃÆù³ÚÛùÂ_ÿùÂ_ÿ%#ÿ0Oÿ&8 sÉí0Oÿ2 ÿÿ333~~~vvvÿ„ÖØ¶WUÿ|*(ÿ„ÖØ|*(ÿ„ÖØ2 ÿY5/ôÎû0P'ÿÿ8™ÃÑRX¼:@¤jËg=/_ƒ-ÿáááìììðððððððððñññâââÿ?öööÿ+++ÿÿÿÿÿÚÚÚÿËËËÿËËËÿËËË·µ)+ÿ0ÿÿëÇÇ×Õÿ©©©¥§ŒŒó°Š¹°Š¹ÑÍúñïÔôõÿÿ!´íßûüããù!ÿÿšššÿ©©©CCCÿšššÿbbbÿÅùôôô¦âÚÂÂÂÑËËáááCCCÿ<8ú-9.. Áâ÷Óþü-f Š„ÿTPÿA ÿžžž­Öñññ­֞žžËó Ž # ðÿ¬¬¬ÿ=V‘4M("ÍáÝvvvÿf èèèM&%ÿ×þÿ„ÖØ³ÚÛ½†"ÿúÁ/ÿÑüý?öööÓâþ ?¼ˆXÿÅËÒÌÓû 13ÅËÒ¼ˆXÿòòòÿ!'Pÿÿÿÿ òòòÌÌÌñññÌÌÌ=CTTTáááìììðððððððððñññâââÕÕÕšššÿÿ¬¬¬ÿWWWÿ¬¬¬ÿWWWÿööö¬¬¬ÿWWWÿõÍÓ¡4/ÂËÒŠ¨†#ÿ ÿËòóöÑüýúÕý ãâM&%ÿS*ÿû×þû×þ³/+ÿËòó5 ôôôøööö ÿOÿìüÔ!'Pÿ)T„ÿ\††ÿßÙ°ÿ&&&»äS*ÿÿÿÿŠŠŠ444ÿÔàø'èåÅÔú”¶ÛM% ÿäää444ÿ444ÿCzÞ·Vÿ×ÿ—i@;5.mÎ ·Vÿµô÷Ôàøÿ&é÷ö–Ð÷CCCÿšššÿÃÆùÛÝøÖýQQMÚëÎ÷ÍÍÍÜÜÜ ÍÍÍJ©«M&%ÿþæä;,K ÿ„ÖØì[Xÿì[Xÿ·V.ÿ#_ƒ-ÿGk¹•ëèèèаÙRX¼áááÍÍÍðððññññññáááÿöööÁèéööööööCCCÿÿÿ ¬¬¬ ¶¶¶ ¬¬¬ hhhÿá½½ø Þööö)+ËËËöõÿ.žï/üúõÓáÿ÷ L$CC444ÿ-QQÿaŠ'13ÿš„„ñï¹!ÿÿttt½½½ÿááá©©©CCCÿCCCÿú$$;ÿ;ÿ --Ó¯¯½½½ááá-ÑÓöóõÒÒàÊÌõÑÓöÓþüÓþü÷Îù-9æCCCÿâââððð...ÒÒÒ...RRRÿCCCÿèèèŽ #JJJbbbÿÞØƒñïÆúÓ›ŸÙ-FÍÍͯ37½½½³ÚÛ)þçý})ÿúÐùÃÅó})ÿ³ÚÛM&%ÿM&%ÿM&%ÿÓâþúööö³ÚÛÅËÒ­Ö4-÷Ïû—ÅîÅËÒÿòÿAßæÿ ööööööÿ444ÿññññññññññññññññññññññññÌÌÌIPÿÿþêÿQ‡JOç±îIPÿáááÍÍÍðððññññññáááöööshh555ÿôôÿôô©©©ÿôôÿôôÿôô©©©ÿôôÿôôÿôô555shhööö­¯Ø­¯Øï¢ÐI—c>5.zd|†œ„TmQ ÿèèèáááËòóö+4-2Ü(*³/+ÿÿöööAööö%òð×þÿ íì õ ööööööÿ1`­‚RÍÎþÿÿððð&&&ööö —ÅîÌÌÌèèè÷Öùû÷Öùûþçý;,ÖùûÔàøM% ÿ 2=]/‘´6ñ‘´˜d4Amr*5 ô½½½ÃØþü÷öÁé³ÚÛÅËÒšššV¹Dx¨0S*ÿèèè®®®>>>³ÚÛ„ÖØ1ÅÔúlJ%|*(ÿ|*(ÿ·V.ÿÏÐËûÖÅÔú#ÊÌÒÅÇð 2¹•ëÑÍú/3Gkÿèèè¡}Ó_ƒ-ÿ$$$ìììðððâââððððððìììööö äääËËËËËËCCCÿÿöööŒŒŒ ‚‚‚ ^^^ TTT ¢¢¢ ŒŒŒõ á½½ø öõK ÿÑêêêéë ý*Qu13*P!13˜“ö¢|«÷öÆÊ¢¼ŒÁí ñï¹ ööö...xFEËËËCCCÿØ®®½½½>>>99÷ÓÓ444ÿžžžÓþü&éèèèóõ9ÑÓö/- ÇñúÑÓöÓþüf Çñúý× èèèâââððð...ááá½½½MÑÕÂÂÂÈÎ#­¯Øÿ*-/JZZZÕÕÕžžžððð³ÚÛ´ñ¾³ÚÛ‘åý›ü7þf‘åý/M&%ÿ|*(ÿ/þè+- Ëòó;5.ÌÓûÍýýèèè—ÅXÿòòòòòò Éêêê ÉöööòòòòòòÚÚÚòñððððððððð ãâááá ãâððððððÚÚÚ444ÿIPÿK)Qÿ1û8̹¯y¶ç±î×õÓIPÿIPÿIPÿ$$$ìììðððâââððððððììì ÓÁÀ##íÅÃ#  íÅÃ###ÓÁÀ³ÚÛ`b}õÍÓE."Œ°Ÿ±8# ÿèèèôôôËËË»½æ++û×þÉûýÑüýš÷úýØÖ Xèèè ñÿ¿Ñôôô÷ øööö 8-4øÓÌÏe:*T¬­‚R? ²Úƒ555šššÿS*ÿGèèèM% ÿ¼¼¼S…†M% ÿÒÒÒáááòòááá\††ÿÓþü D èèè64oC#ÇñúÓþüf ðCCCÿÌÌÌñññÒÒÒáááìì슊н½½ñññžžž...®®®$$$ÿÖ¶¶¶èèèkUtv IDAT®®®LB»‰ˆÿ444ÿ¼¼¼S…†444ÿM&%ÿ/¤Þû0\"³ÚÛèèèèèèM&%ÿÅËÒÌÓû÷Ïû5 ÅËÒòòòööööööBòòòòòòòòòòòòÿ÷ö×þÿ)×þÿçðððäää·í°µ×¯ÍïÇ,̹×õÓ) -ÏÈ·í°µ×¯·í°IPÿìììðððñññâââðððñññìììÒÒÒÒÒÒáááìììðððìì쌌Œ-?@÷þÿ|¤¦æüýæüýæüý–¨©æüý|¤¦ÝúüÝúü-?@˜˜TTT9aMrpc3PaO3TmQ ÿ ÿèèèèèè »½æ)Ù’äæf ùÐ#M&%ÿÿ öööôôôôôôë üèÿøÓÌìòòòêêê=þûm èèèÌÌÌÿí K µô÷, þçý'èå5 ôÕÕÕää伈XÿøÃÿ½•ì£Ñú6ñ0£ÑúÅËÒyn½†"ÿ;5."î¾3ôñúN,Õ^²è5 ôÌÌÌèèè­ÖS*ÿ?õåûÐüû0åãúÌÒâÍÍÍRRRèèèžžž³ÚÛµô÷Ñüý–Ð÷ÅÔúµô÷ÑüýŸ53ëÎ÷™ÃÑCöjËÅÇð¯ Ù_ƒ-ÿèèèððððððððððððìììðððìììáááðððöööööö ÚÚÚÿöööòòòJJJ ²²²^^^RRR¾¾¾vvvØþüòòòöõöB-QQÿ444ÿðåü -éëéë#Szó --á½½!ÿ»‰ˆÿÒÒÒí Öùûššš­ÖòòòCCCÿšššÿþçý÷ö=þû»‰ˆÿááá...½½½ñññêÌÌÌÜÜžžžÁâ÷ùÕúTPÿÑÓö/- ÊÌãea'2äÇñúÓþüÓþü/- ½½½½½½ñññðððñññbbbÿñññÝÛ²áã JJJÚÿEwxäää&&&ää仉ˆÿ/M&%ÿÑüý’äæ+1ÿ4-ÿòÿAíç¾ OÿòòòòòòÌÌÌí ôôô×þÿðððððððððôôôèèèèèè,VîèèèIPÿ·í°ðððÒÒÒððð¾¾¾áááðððtttÊ¿¿aVV÷þÿ÷þÿjXW÷þÿaVVÊ¿¿shh¬¬¬^„UÿSQ(ÿõÍÓÒÒàrpcõÍÓÍþÿ°Ÿ±I:$  ÿ#ÿ#ÿÿÿECEC’äæsEf (*ýØÖèèè öööôôôööö öööû É-41›ÆðvS~®ïÄ”òòòÓúÿÿèèèÌÌÌäääèèèTTT.‰A]^×ÿÖùûÖùûj1"Ÿ>444ÿÄÅËIªå'èåÆÓö–/Ëœ_ÒYí­Ö‡’ûøÃÿCzÞÅËÒÅËÒ‘´6G!(þçý4.S*ÿ­ÖËó ÷ ÁéÞ¿ÿëÎ÷³Ûô½½½ÍÍÍCCCÿ|*(ÿ³ÚÛj0 Ñüýì[Xÿ³ÚÛ¥¨·V.ÿM&%ÿÝÿÿÑÍúаÙ0P'ÿаÙGk¡}ÓòÝú*)ñññðððñññððððððððððððòòòÿòòòöööòòòòòòòòò¶¶¶>>>NNNððððððBBBððððððBBBððð®®®ððððððôôô~~~JJJ(ÿööö?þkNÞêêêüÚ°ñØÙúûèÈñÅÇðÿ%¥§á½½CC!ÿ»‰ˆÿEwxäääñññ555áááÌÌÌÈÈÈp}*Öùû³ÛôS…†»‰ˆÿ½½½ú$$bbbÿÌÌÌòòñññÒÒÒžžžëÎ÷ùÕú³ÛôÛÝøÄÈÑÓöáÝÊÌãØþü2äÇñúÇñú$$$vvvÿCCCÿ...ñññ444ÿBBB$$$ÒÒÒ½½½bbbÿY[„ÌÌ̶¶¶¶WUÿöööôôôÚÚÚèèèDt?/’äæú1Ñüý„ÖØÿ³ÚÛ­Ö5 ËòóÌÓûi;³ÚÛ­ÖsD òòò¿¿ÿ444ÿ÷ööööôôôôôôôôôôôôôôôôôôôôôôôôööö÷ö444ÿIPÿ̹îÔø #ÿIPÿ̹ñññðððñññ......ðððððð 6AA  6AA÷þÿ÷þÿ÷þÿ6AA6AA õÍÓ­¯ØÿêÛÝøŽ`b}rpc3,!·ÆÜ üôþÿM&%ÿd5 5 )Ù)Ù7? Xš÷úËòóèèèööööööööööööööö öööèèè÷ñÈøÓÌ1›ÆïÄ”èèèòòòÿÿèèèK ÿ骧¿tqëê'èå, *mÎöaÂê+++Dx¨Dx¨lJÎãøCk=; QˆìÎãø;5.ÄÅË­ÖʹßÔàøS*ÿþçýþçý·V.ÿèèèøø˜ ø$ûS*ÿ½½½½½½|*(ÿ„ÖØÅÔú¥¨·V.ÿÿÅÔúËòóM&%ÿаÙаÙаÙÑÍú“Š„/ÿñññðððáááâââááá$$$ðððáááðððáááòòòÿÿ¬¬¬êêê>>>êêêìììêêꘘ˜êêêêêêêêê+++ööö¬¬¬4- Á镲í"úøòòòÓ¯¯þçý;_ öööCC»¸!ÿßûüßûüEwxèèèäääÕÕÕí ÕÕÕi›œlJ¯xœ S…†bbbÿÜÜžžžbbbÿÌÌÌÌÌÌ444ÿ³Ûô¬°îèèèóõØþüÄÈóõ³Ûôå¿ôý× ®®®666¬¬¬ÿ333ñññðððbbbÿ666$$$ÌÌÌ("ÍüÆÁvvvÿ&éòòòŸ>¯xo9»‰ˆÿ„ÖØ/’äæm\"ÑüýÑüý³ÚÛÿÿÿèèè4-èèè³ÚÛü×ûèèèsDoòÿAÿÿÿÌÌÌí ÷ö ÷öí äää4áGIPÿ) -ÞKÁëÎ÷ñññðððáááâââááá$$$ðððáááðððááá ŒŒŒËËËWWW   WWW   ËËËŒŒŒ ­¯ØTPÿÑÓö.. `b}3I:$òÝúùñý ëÎ÷5 /Ñüý4-7ÉûýÑüý4-2ÜÎ$ÿö¨ùbÁÃËòóèèèÿööö èèèßÙ°ßÙ°ßÙ°èèèòòòòòòèèè!ÿåüýÈ÷ùþçýÚÿñññÌÌÌÊýlJÃÅóÃÅó©H lJûÎÃDx¨µô÷*ÌÒâþçý­Ö6·V.ÿ?s0$òòÌÒâS*ÿ0Oÿ2 ÿM&%ÿ¨úüÿ|*(ÿœîð|*(ÿW¸àööö’äæd³ÚÛаÙèèèÕÿþðððáááìììñññððððððÿòòòèèèòòòöööÿ¬¬¬¬¬¬ËËËËËËËËËÿöööø æüý"úøÿÖùûø su5ÚÚÚÉÆú[YïÃ, M% ÿŒŒŒšššÿÕÕÕááá–ÏñÄÌô?þÄÌôèèè šššÿžžžžžž444ÿ½½½444ÿÌÌÌ ðöèèè)ôÍÍÍÊÊÊ666333$$$iiiJJJîîî~~~ØÞ3ˆˆˆžžžú'«¥ IDAT°ELׯ–ÿW¸ó[’ö&&&· #EwxÑüýnÒþ„ÖØ³ÚÛ³ÚÛÿÿöööÿ­ÖM&%ÿ—Åîƒ×ïÿòòòòòò¼ø)¿òòòòòòÿ÷ö*ôôô ôôôí ÷öèèè ÖîÔøîÔøÌ¹ÞKÁÙ¢ïðððáááìììñññððððððèèèfffTTT 555~~~ TTT ~~~555 òòòTTTfffèèèÑÓöÛÝø­¯ØÛÝø­¯Ø­¯ØÍþÿòÝúùñý/)//2Ü7ÉûýËòóÎ$ÿ2Üèèèèèè êêêööö òòòÿK ÿ*Öùûñýþ&éØþü'èåÌÌÌÌÌÌS*ÿ­ÖIªåCzÞÀ£ïIªåÊýšššÿŒí(M&%ÿ;5.³Ûô³ÚÛµô÷þçýŒí« 4ãDlÿÈ ý¯üåôôôôôô×ÿ”ßßåãúëÎ÷ÿÿÿÿÿÿÿËòóêêêööööööËòó òòò„ÖØS*ÿðððáááðððððððððáááðððÿÿÿöööòòòòòòöööèèè ÌÓöÿööööõæüýöõí ÷ö‡°Mòòòòòòtt 13á½½Ôàøþçý!ÿ444ÿ‡UTÈÈÈððð!ïîbbbÿèèèÕÕÕ)èþçýÌÓöÌÓöK ÿèèèfffšššÿžžžÌÌÌÿÿÌÌÌö9èèè9ÑÓö333ÜÜÜÊÊÊ666ñññiii¶¶¶~~~+++SQ(ÿJJJÌÌÌCCCÿááá›ÿÿÿ 444ÿ³ÚÛ„ÖØ³ÚÛM&%ÿM&%ÿÿööö èèèèèèi;5 ÿRÿoÿòòò¼øòòòòòòÿ*Öùû íì3ôñýáàööö íìööö íì3ôñ÷öí ÿ·í°) - ÖòþêÿæÙ¢ïðððáááðððððððððáááðððÿbbbÿ¬¬¬öööËËËööööööööööööËËËöööÿÿÿÛÝøSQ(ÿ O'ÿÈðä O'ÿ O'ÿûòåòÝúû×þ)7ÉûýÉûý×'2Ü X X³/+ÿÿ ÿÿÿÿÿÿÿÿÿÿ èèèÿK ÿåüý*ßûüµô÷µô÷&éþçýK ÿ;5.ƒ×ïi—Àç¹½½½çç(¦Ú šššÿµô÷ËË˶¶¶~~~444ÿÿöööýñÞÔ÷öÿôèèèÿööö èèèèèèÿ œîðòòòòòòœÿèèèÿ¹•ëi;S*ÿ—Åîðððñññðððìììáááñññááá öööÿööö ÿööö òòòèèèÿöööòòò ÿòòòÿòòòÿòòòÿèèèÿòòòòòòÿôööööõø æüýø ÿòòò?þ…Ó^ÃÆù˜“ö ÿ^XÅZ4å55ÕôôÍèôè!ÿßûüÿöööØÕ’œØäó äää íì’œ„³ÛôÿöööþôýÔàøí ùøM% ÿ³ÛôfffCCCÿ½½½ÿööö öööÿèèèÿ ð/- ÑÓöÄõ ÿFBóõÿèèèÿÍÍÍ®®®666ÂÂÂJJJ+++ÿ#%B¶¶¶ÿÕÕÕ+++Ëó eøë++-èèèÿþçñööêêêðððôôôbbbÿžžž³ÚÛÿÿ èèèÿ;5.Åîÿ5 Ëÿèèèƒ×ï ÿòòòòòòÖùûZ ¦ñõZ Ðøú0 Ðøú0 Ö÷ö÷ ÿ1û8üäÿ 1û8ÏÈÿèèèðððñññðððìììáááñññáááèèè¶¶¶ÿ ööö ¬¬¬ ööö¶¶¶òòòòòò ÿ ÈðäóÍA ÿõãâïÖøA ÿóÍ ×')ÙÎ$ÿ××'ÑÓü»äsEÌø5(+³ÿMÑÕèèèÿ ööööööAñö¿ èèèÿèèèÿöööööö ôôôèèèÿööööööÿööö444ÿäääèèèÿèèèÍ Ÿ>–ÏÞËó öö ÿé1 1ÏÞÿËó èè輈XÿR†¶ÿ^^^ttt...à«u—Å‹ÿèèèÿÚÚÚÒÒÒ¶¶¶ÿööö+++WWW...ÿžžžÿööö èèèÿèèèÿèèèÿèèèÿööö ööö d„ÖØCCCÿðððáááðððñññááኊŠÿööö èèèÿèèèÿèèèÿèèèÿi:þƒÔ:)+×Õÿ è¾öBüÚ°ÒøbÿÃÆùƒZ½ööö èèèÿööö÷öí ÷ö÷èèèÿööö÷öí ÷ö÷èèèÿööö èèèÿèèèÿöööFBº¾üFBÄÈ<8úÄÈèèèÿöööDDDÒÒÒ...ÒÒÒ...$$$ÍÍÍ333ÍÍÍáááÕÕÕèèèÿöööžžžlllööö¤[ßã èèèÿööö555ñññÚÚÚ&&&¶¶¶èèèÿèèèÿööösE;5.ÅËÒ»ä èèèÿööö èèèÿèèèÿèèèÿöööTTTç±îOç±îÅû¾;BOç±îO¶¶¶èèèCCCÿðððáááðððñññááኊŠÿèèèÿèèèÿèèèÿööö èèèSQ(ÿðò½½½CCCÿ½½½ÿööö¥!Î$ÿ2ÜMÑÕÿèèèÿ êêê èèèÿèèèÿèèèÿèèèÿööö&&&ÚÚÚ ööö&&&äääèèèÿŸ>–ÏÞÁé èèèÿööö®zJ<;5K555WWWÈÈȬ¬¬®zJ\Àèèèÿöööòòò444ÿ...¬¬¬ ÿèèèÿèèèÿèèèbbbÿáááððððððìììðððááá¶¶¶èèèÿööö èèèÒøbÿôÈúRX¼èèèÿööö èèèÿööö èèèÿèèèÿèèèÿèèèÿööö èèèÿööö èèèÿöööÚeÍ IDAT èèèÿööö ôôôèèèÿööö èèèÿööö€ÿ èèèÿööö ööö ööö èèèbbbÿáááððððððìììðððááážžžÿèèèÿèèèSQ(ÿ­¯ØSQ(ÿ­¯Øÿ›MÑÕÿèèèÿèèèÿööö ôôôèèèÿèèèÿèèèÿèèèÿèèèÿèèèbbbÿ¶¶¶ööö èèèM% ÿ})ÿM&%ÿK)Qÿ444ÿSQ(ÿ½†"ÿÇ¿*ÿŠ„ÿ·Vÿ½†"ÿÿýÇÿÿúdÿ444ÿÇ¿*ÿ½†"ÿÇ¿*ÿSQ(ÿ444ÿS*ÿbbbÿðŒŠÿ$$$ÿ$$$ÿ$$$ÿbbbÿbbbÿ444ÿ!'Pÿ$$$ÿ$$$ÿ444ÿ444ÿ$$$ÿ444ÿ$$$ÿÿÿ444ÿÿ0ÿCCCÿCCCÿK ÿbbbÿšššÿCCCÿvvvÿCCCÿRÿ%#ÿM% ÿM% ÿ%#ÿRÿÿ!ÿ{ÿbbbÿvvvÿÿK ÿÿK ÿÿÿÿÿÿ$$$ÿÿ$$$ÿÿÿK ÿK ÿbbbÿbbbÿvvvÿvvvÿ-QQÿbbbÿ444ÿM&%ÿM&%ÿM&%ÿM&%ÿÿÿÿÿÿM&%ÿM% ÿocL‘åýÿ×þÿ|*(ÿM&%ÿK)Qÿ0K)QÿK ÿK ÿK ÿK ÿiÀÁÿ-QQÿôj5ú 9ÃÅó÷Îùú÷ŸêN(E‚X²“‹ö8>Bw¥8>¬©<‰RîS*ÿM&%ÿ2ÜM&%ÿìZ2ÿÿÿ444ÿ444ÿ·V.ÿ¼ˆXÿÿ444ÿCCCÿ444ÿÒÒÒ]™‚Ž*(áááÌÌÌ444ÿ!'Pÿ÷ñȃ"ú˜d4 ÿ ÿÌÌÌÿ"úøÐøúåüýÿÿCCCÿ²­fffÿÿÿÿÿÿÿvvvÿvvvÿCCCÿCCCÿ333iiiCCCÿvvvÿêêêÿ¬¬¬ÿÿÿM% ÿ¤ÑòÁéÁé¤ÑòM% ÿRÿÿ÷ö*…ìñžžžbbbÿŠŠŠbbbÿ{ÿÿÿ÷öÍ èèèÿÖùûÿ ÿ444ÿööö©H öööôôô ôôôöööÿÿÿÿÿÿÿÿ íìµô÷!ÿbbbÿ888ÜÜÜÍÍÍòòáááùbbbÿ444ÿÿÿÿÿÿÿK ÿM&%ÿM&%ÿM&%ÿ.îê0ìM&%ÿ³ÚÛM&%ÿÿJJJ÷ö©H ÿÿèèè444ÿÿ½ñßM&%ÿM&%ÿ444ÿ³ÛôûÎÖ®zJ )Ñüý/q_Ðýÿµ×¯444ÿ444ÿ444ÿK ÿK ÿ0 0µô÷M&%ÿ²ÿ{,Rÿ{ÿ{'ÿK ÿµô÷;…†ÿiÀÁÿ-QQÿ-QQÿiÀÁÿd==>>6j0 6vvvJJJ555sEöööÿõÿÿø èèèÖùûí í í í í ¦ñõ0èèè888$$$888òÌËööö÷öèèèÿßûü K ÿÿèèè òòò/Ñüý/ÑûäcÕØÐøúþçý˜ÝÞ0ìM&%ÿMtu¬¬¬ÿÿÿÿúòø èèèAÌÌÌÌÌÌÿööö 8ãñ±³ÚÛèèèOÿM&%ÿé&/ÿ!'PÿßÙ°444ÿÿø ÞòòòëîëâââßÙ°ãã444ÿç÷ÓÓQºà\^çððððððÑË˽½½²ÿ²ÿ{'ÿNãêNãê…ìñ0ÖùûßûüK ÿ%#ÿ0Oÿ&8 sÉí0Oÿ2 ÿØÕZ&öZ&ö âÉòÌË;…†ÿ444ÿÒÅÅÒÅÅ444ÿQR.;;ù444ÿM&%ÿ×þÿM&%ÿM&%ÿ×þÿM&%ÿM&%ÿÌÓöÄÌô6Êüû 9ÌÓöÊüû6½½½fff444ÿÌÌÌöööäää–½&ÿ/qÿTPÿl!!Î$ÿÓýèÎ$ÿÑ&A ÿ/qÿ–½&ÿS*ÿøÃÿÿÿ ’äæÿÌÌÌêêêðððäää)èþçý4«ãßL/|ÝÖùû íì)è5 ô©H ÿ!ÿìýþ&éØþü4- scyÊüûj1òÌËãã½½½Ûÿÿ45Y:-QQÿ-QQÿ45gn9òÌËCCCÿýñýñ 8ÿôôy²Øæüý÷þÿÝúü÷þÿ"" 0öööø Þ"úø=þûø ËøúÿæüýæüýÃöõ!ÿüâüäûüäûüÖùûòþÿþçýM% ÿ!ÿ ÿбñ¦ËòÍþû7rl¢¢¢ô4F'gF'gÜÜÜQ¦Ëò¦‡Çòòò òòò ÞòòòöõÞèèèí 0“úÿ…ç¦ñõÿ÷öø í õÿÿž“úÿe í §}èèèÿÿhhhäääÿÿòö ÌÌ̽½½>>>888çkƒãDlçkƒááá]/ öööø òòòÿòòòòòò÷ö÷öòòò í “úÿ{ÿÈÈÈÈÈÈššš~~~ÂÂÂ3335ÿ=þûZ ÿ ÷ö èèèÃ=þû!ÿèèèÑüýf Ñûäþçý5ËøúÉß÷ÖùûËøúÐüû/³Œ‹ #ÿ1û8ú;Bàþëàþúÿ òòò444ÿãñ±ÿÿÿöööèþ³ÿÿOÿû Éèèè²ÿMtuùUM&%ÿßÙ°!'Pÿ!'Pÿ444ÿšššÿbbbÿÿø òòòßÙ°!'Pÿê444ÿù --Ø®® --òò{ÿ@lÉ÷ù…ëÙ…ìñZ#ÖùûK ÿÛÝøÖýQ¹Ö½úëÎ÷CCCÿÍ ÅËÒ_‡ CCCÿ¼ˆXÿK ÿ÷ÓÓòÌËQRQRQR;…†ÿòÌËËtsÌÌÌM&%ÿM&%ÿýáàþæäþæä'èåÔßßÁèéM&%ÿM&%ÿM&%ÿáã º“ìÈÅÆ8;:zšÌÓö 2‹“(6}Þššš èèèÿTPÿŠ„ÿ¾“ì%ßýÇñú¤ÐÞÁâ÷Óýè5õÜÑ&%ßýôÇ÷Š„ÿTPÿ­Ö‰öööööö ööö©H )è íìããúÃí ·ì4«ã, í *þçýÁéaÂêèèè!ÿ Úÿ&éo:tù™“vs®ÆÓöK ÿ½½½òòù-QQÿ444ÿ45òÌË™’ÇããòòòÌ˯„¹òò½½½,6_‡øÐùìÛ² Ýúü÷þÿ@# """"ôôôùÜöõæüýåüýÞ"úø=þû5ÿÿÿòòòòòòø êüý ø ÿäûüõÿÿ÷í Ñí äûüÖùûç*! ÿ ÿбñÊÌõÍþû3 ®®®ÍÍÍ$$$ÜÜܯýùº›Ûèèèèèè"úøÐøúòòòêüýòòò÷öí “úÿòòòí =þûµô÷ßûü ø bçì“úÿöõòòò…çÿhhhÿ¾¾¾êêê ÷òòò444ÿžžžÈÈÈÈÈÈ888£Ñú»äòòò òòòÿöõZ ßûüèèè ä{ÿžžžÈÈÈÈÈÈ~~~~éâvvv$$$ÜÜÜžžžèèèÖùû“úÿèèèööö 0*M&%ÿf ÿçÊúæf 1Ëøú +(/Ïâáþæä5 ë·óÓàþÏÈúÝ òøëøõ èèèÌÌÌ ööö÷ÿô+C%öööÿû É5 {ÿÉ÷ùO‹ƒq«+ù_Fƒÿ1½ÿõð2ï mW½ÿ O O =”ÿ¥÷`ÿfffžžžÿ òòòsD¥! ä{èèèòòòÌÌÌßÙ°ÌÌÌããÌÌÌããáááòòêñññÌÌÌÓ¯¯ñññ…ìñŠ¡Òÿÿ7ï{ÿßûüµô÷ÿ444ÿþçý˜. bbbÿ¬¬¬ÿñññ+++\À—Åîîîî>çS*ÿ6G!K ÿÌÌÌ -- èßú¤Ñò]™‚ʺó³ÛôM% ÿ444ÿÓ¯¯êÓ¯¯-QQÿ-QQÿCCCÿÌÌÌ444ÿèèè õGåââ õGÿôô #éÞÞ 444ÿÞòòòø ÿòòòòòòÿ0òòòø “úÿK ÿèèèòòòòòòòòòø Éß÷,  ÿÿí eø (g (œ$ÝåÜ#ÞÔ÷¦ËòZ5GAÚf`ùˆˆˆÖÖÖ:::G¬Üÿý"úøòòòòòòÞµô÷cü÷555í ûbgí ÿòòò“úÿ!ÿmµô÷öööÖùûÿ*öööÿööö÷ö!ÿßûüµô÷K ÿ{ÿÿÿòö 555öööàþ= ÿÿÌÌÌñññ&&&o555žžžòòòÿÿööööõ÷ö=þû èèèòòò í “úÿÿòòòòòò½½½‚‚‚ÈÈÈ©©©“““JJJ$$$ÿcü÷*òòòÿÖùûí í ÷öÿòòòèèè³ÚÛ˜ÝÞËøú/M&%ÿ³ÚÛèèèÿàþI -444ÿÌÌÌ  íõêÿÿ444ÿ³ÚÛ‚ÿÞ ¡0ógÛLîÔøU ÿþçýÙ0³ÛôÌÌ̽½½CCCÿ-QQÿÓ¯¯45ê-QQÿ½½½ÌÌÌ õG÷ñÈìÛ² ÷þÿL òòòöõöõø òòòöõ…ìñ ËøúK ÿòòòÔàøÿÿööö7i2I[åìeø $Ýå©USÛãTPÿ½ú¦Ëòbbbxxxf`ùÍþûбñÿK ööö æüýµô÷ÿ÷öËËË®®® ÷ö÷öÿòòòßûü“úÿ{ÿòòò*µô÷=þûòòòÿ ßûü í !ÿÖùû…ìñÿÿöööÕÕÕòö µøþööööööèèè444ÿÌÌ̽½½BBB6CCCÿèèèèèèÿÿööö÷öø õÿÿ’ïòèèèòòò íì{ÿÿ©©©tttWWWŒŒŒ888ÿ÷öÐøúÃÿ÷öí í ÷öK ÿM&%ÿ7*f&%þçýÑûä³ÚÛòòò³ÚÛèèèÿë×õÓÌÌÌÌÌÌÜÜÜ  öööÿ ÿÌÌÌÿ Oÿ‚ÿ÷Í Éôôô2ò,€t®888bbbÿöööë¿ ÿ444ÿÌÌÌÌÌÌñññðððððð444ÿÿÿöööööö èèèèèèÌÌÌòòò­ÖöööøøÊ&$û³Ûôÿ:::333ááá~~~444ÿ³Ûôµô÷ù444ÿ-QQÿËts.;;ÌÌÌ-QQÿÌÌÌèèèÁèé»äsEøÈø'DÕ÷i;ÌÓû³ÚÛ®êŸêöÇøÈÅÆð—ñ9AÖ—ÆÌÓö¾‰[8> 9ÿèèèôôôÿ444ÿTPÿ-òÛ![ÊÌõ64 TPÿòòòsEÌÌÌôôôÕÕÕ*ÖùûñýþØþü骧ôôôðððôôôÌÌ̵ô÷K ÿÙêQ} IDATòò444ÿÓ¯¯¾½4545444ÿ÷ñÈ æüý×úû5êç ôôôÌÌÌòòòÿø ÿèèè ø µô÷õÿÿüâü þìëöõÿôôÍ28üÆÁÜ#[åì©US3ÎÈÿTPÿÜÿý?Í Þ¿ÿ„Šñ„Šñø™bþ3¦Ëòöööµô÷òòòöööø èèèòòòêêê íìí òòòÿhhh…ìñK ÿµô÷Öùûÿööö÷öèèèÿ íì ßûüÿßûüÿòòòòòò òö vmDööö ÷òøàþKÿÌÌÌÿ444ÿ...:+ áááÿÿÿööööõ÷ö*ø ÖùûÐøúcü÷ÿÿÿÿ!ÿÿÿí ¦ñõ{ÿÿ!ÿÿ!ÿèèè½½½ŒŒŒÈÈÈ888©©©333©©© í µô÷ í 0ÿÿ³ÚÛ/šöáþçýÑüýf&%ÖùûþçýM&%ÿ³ÚÛÿÿÿòø;Bÿ444ÿÿÜÜÜÜÜÜ öööôôô 444ÿèèè É– Éööö`lq«êêê^ùÜttt888ÿÿöööÌÌÌ444ÿÌÌÌÌÌÌÌÌÌÿÿöööööö ööööööÿÿÿòòò?s0$8ól!!444ÿâââ®®®ááábbbÿÿããÌÌÌããQRÄ‘;…†ÿãããã5 »ä/|Ý÷i;ÌÓûÌÓû×þÿM&%ÿÿŸêð—ñ–Ïñÿööö4- ý8>½†"ÿÿÿèèèèèèäää444ÿ64 9¬°îÑëv|ãÄÈ¥íøBm»äÿäää 3ôñåüý*õÿÿËøú&éØþü3ôñôôôèèèÿÿÿÃêêêêêêËó )è›ïÿÿ444ÿ-QQÿ45òò½½½ÌÌÌCCCÿ½½½òÌËY:;…†ÿ÷ñÈ éÞÞ  ÷þÿæüý×úû äâ 444ÿöõöõÐøúòòò=þûèèèööööõÿø õÿÿìýþ ' n W«­7’ïò©US3ÎÈ/óûÑ CCCÿPå%×ÿ =þû ø&.sÉíÍþû"úøôÿÿÿ"úøèÿÿ÷ößûü÷ößûüí ÿÿòòòŠŠŠÿÍ òòòí ßûüòòòí ÿòòòòòòööö ÷¾¾¾òö ëòø Õúþ= ÿ...=¹¡GÚÉ6ýbbbÿÿöööööööõ÷ö È ÃõÿÿÖùûÐøúÛöööÿÿööö ßûüòòòòòòòòò í ÿ íìßûüòòòßûüCCCÿáááÜÜÜWWW$$$ÈÈȽ½½ íì=þû!ÿööö í “úÿöööÿM&%ÿÑûä4- r{)³ÚÛÑüý, 6F pa òøëàþ×õÓÿÿèèèÿ ÜÜÜ$$$ÿôôô ùë+û ÉÌÌÌé&/ÿ’îà ‚‚‚ÈÈȶ¶¶èèèÿþìëø ööööõêüý444ÿÌÌÌ444ÿÌÌÌÿèèèÿööö èèèÿööö$ûùñýæèèèÿËËË555¶¶¶èèè;…†ÿù¯®ùÓ¯¯444ÿÌÌÌM&%ÿËòó5 4-ÌÓû4-£Ñú)³ÚÛÿ5 ô4- —Æööö?þ²ÕX¾Œ¾Qˆìòòòÿööö èèèÿöööFBº¾üFB64 ›Ÿëéë èèèÿööö èèèÿ ôôôþìë5Í ööööõ5Í èèèÿööö èèèÿèèè444ÿðððabòÌËããÌÌÌ444ÿ½½½-QQÿgn9™’ÇããÌÌÌÿ ôôôõêê ÷þÿ öööÿôô ÷þÿ èèèÿööö òàßÞ èèèÿöõêüýÿööööõ5µô÷ÿöõ÷þÿn ’îó©USX·¹Û%éñÛÍ28bÁÃ+++¢¢¢ööö&&&...¢¢¢èèèÿööööõø öõø íìßûüÿ÷ößûüÿòòòÿ èèèÿööö ööö÷ö÷èèèÿòö  ÷òø îëôôôèèèÿJJJwä«7ÊYíùMeìììžžžÿööö=þûà ööööõø èèèÿööö÷ö÷ööö÷ö÷èèèÿèèèšššÿÈÈÈááá½½½ÿ÷öí ÷ö*0¦ñõí ööö èèèÿèèèM&%ÿþæäËøú+([ßã ›cÕØ5Í èèèÿèèèÿööö ööö èèèÿèèèÿ ôôô ÌÌÌÿööö=þûà èèè444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌ444ÿÌÌÌÿèèèÿööö èèèÿ333¢¢¢ööö èèè444ÿÌÌÌ-QQÿÓ¯¯;…†ÿù¯®ùÓ¯¯444ÿÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ×þÿ)³ÚÛÿ5 ôËó öööñìV¾Œ¾CzÞÿööö ööö èèèÿöööFBÑÓö/- º¾üFBº¾üú/- º¾üFBÑÓöéë ööö èèèÿööö=þûà èèèÿèèèÿèèè444ÿù%âââÛÿÿòòñññäääõêê ©H aÂêèèèÿööö èèèÿööööõø èèèÿööööõ÷þÿn ’îó m“úÿÛ/óû+++˜˜˜555¢¢¢èèèÿööö ööö ööö ööö èèèÿöööhhh˜˜˜555ËËËhhh˜˜˜ èèèÿööö÷öí èèèÿ ööö ööö õêêittwä«GÚÚÚÚ&&&IõÝùMe¾¾¾äääèèèÿööö ööö èèèÿööö÷öí èèèÿööö èèèÿèèèÿööö÷öí èèèÿööö÷öZ “úÿòòòÿ5 ÉÞÞ7""Áèé?ÉÞÞ5Ëòóööö èèè444ÿÌÌÌÿèèè444ÿÌÌÌÿèèè444ÿÌÌÌÿèèèÿèèè-QQÿÓ¯¯444ÿÌÌÌ444ÿÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛÿi:þFm†fâ³Ûôÿèèèÿèèèÿèèèÿööö ööö èèèÿèèèÿèèèÿèèèÿ§ÌÕ IDAT444ÿÌÌÌ444ÿÌÌÌÿèèèÿööö èèèÿööö èèèÿ ööö€ÿ Ñ /óûÑ Ûãÿööö èèèÿ ôôôèèèÿööö èèèÿööö ööö èèèÿòòòÿ èèèÿ...¶¶¶èèèÿööö èèèÿèèèÿööö èèèÿööö èèèÿèèèÿööö÷ö÷èèèM&%ÿËòó5 Ëòó5 Ëòóèèèÿèèè!'PÿßÙ°!'PÿßÙ°vvvÿìììžžž2 ÿëÎ÷2 ÿëÎ÷2 ÿaDmŠŠŠ2 ÿëÎ÷CCCÿ½½½bbbÿðððáááìììððððððááá½½½ÿòòòvvvÿ®®®RRRŠŠŠCCCÿWWWÜÜÜÍÍͽ½½444ÿðððôôôèèè#ÿüôþöéü|*(ÿ~—‚iù„ÖØ|*(ÿ„ÖØÿööö èèèÿòòòM&%ÿ³ÚÛ444ÿðððôôô ôôôèèè444ÿÌÌÌÿ èèè-QQÿ/55¤zz\††ÿ¤zz-QQÿããÌÌÌ444ÿÌÌÌ 2ÿ$òˆˆˆˆˆˆˆT$dÇÏå ðððáéÞ öéü!'PÿßÙ°)T„ÿ32ÍÎþûР8bb¤zzCCCÿÉÆµô÷CCCÿ½½½ÿòòòÿööö èèèÿèèèbbbÿžžžbbbÿžžž!'Pÿû3ù¡ø_ù¡ý,ßÙ°CCCÿ!'PÿK)QÿßÙ°K)QÿßÙ°!'Pÿvvvÿ666ˆˆˆ2 ÿò2 ÿaDmÕ¸á2 ÿ2 ÿ—z£ŠŠŠ2 ÿ2 ÿA ÿ¬¬¬ÿ3332 ÿ0Oÿ`ƒÿ`ƒÿ0Oÿ#ÿ0Oÿ`ƒÿÿ$$$ááááááìììððððððáááðððððððððM&%ÿòòòòòòÿM&%ÿŠŠŠRRR äâM% ÿK ÿ|*(ÿÜÜÜ$$$333¬¬¬ÿé%ÿé%ÿ{ÿ444ÿ444ÿðððôôôööö %òðAöóöööööö444ÿÿÿ2 ÿ#ÿòÝúöéüÿ0P'ÿ´&ÿ6øãY0P'ÿ~—|*(ÿööömõêêÿÿ÷ö÷öÿÿ/M&%ÿÿððð  444ÿCCCÿÌÌÌÿÿÿ®zJöööÿM% ÿÿ-QQÿ½äÍÑËËñŸ†-QQÿ-QQÿޝ˜½‡2ÿÓ¯¯ÌÌÌ-QQÿ444ÿ444ÿ€TSÿšššÿ444ÿÌÌÌ-QQÿ})ÿ³/ÿ 2ÿ÷ÎûåvvvˆˆˆÊÊÊÌÐãD|¿œ91ìóáéÞûöþA ÿ!'Pÿ!'Pÿ!'Pÿ*!'Pÿ³/ÿ³/ÿ)T„ÿ\††ÿ\††ÿ325;<5;<32328bbqwx\††ÿÿÿÿbbbÿÉÆµô÷ÿK ÿÿÿÿšššÿáááÿòòòòòòÿ!ÿÿÿÿÿÿÿ!ÿöööööööööÿÿÿÿöööžžžvvvÿÿK ÿvvvÿžžžßÙ°û33*e(§3*ø_üÍà,ÜçßÙ°!'Pÿÿ!ÿvvvÿ½½½!'Pÿíç¾0!'Pÿ!'Pÿµ×¯ßÙ°K)Qÿbbbÿvvvÿ¬¬¬ÿCCCÿÕ§~ÒžnCCCÿêêêÿvvvÿòñå—z£®®®+HaDm.:i†]ëÎ÷ëÎ÷úñý—z£bbbÍÍÍ–½&ÿ`ƒÿ04 ÐÌõ04 R`бñ }æHkÿðððìììâââáááìììðððññññññðððM&%ÿ³ÚÛÿÿ!ÿÿÿ÷öÿ³ÚÛº’Â!º’ããú´ÞÞùÂ_ÿS*ÿ½½½ŠŠŠtttŠŠŠlll’ïòÅÍoÖÛ¬¬¬ÿÿðððêêêöööêêêêêêçäüýKý/üúM&%ÿèèèÿèèèÿÿ0P'ÿüôþ0P'ÿ•¾[ÿ_ƒ-ÿGk¼âLÚM)/36ø„ÖØÐøúóþþöööí í ÷ö÷ö’äæÁèéËòóM&%ÿÿööö>>>...ááá CCCÿ...½½½ÿ ÿ ÿèèè=þûûÎÖÿ5 ôÔàøòòòÿÿ6á7ò20Ó¯¯7ò2ÄÌø½‡2ÿ444ÿ-QQÿÓ¯¯ù-QQÿvvvÿBBB´àá"î¾fff444ÿ})ÿ* YA÷ά¨•ÊÊÊ®®®é!{øhœÌûòå4 "ûöþïÖøßÙ°*ÖþÿßÙ°³/ÿ' YAÿ)T„ÿÖ¦àÍÎþo?>˜“Â5;<5;<©ÙÚqwx\††ÿööösE®zJÿbbbÿžžžÿÿÿ=þûh#"3ôñöööšššÿŠŠŠêêêòòòÿÿ!ÿsE›ƒTÿsEÿÿòòòòòòÿÿ÷ö`N&ÿÿÿööööööèñK ÿÿ˜˜˜ä{2ŠŠŠ+ƒÿ3*;5.m3ÔüÍãÿüåñùÖÿßÙ°ÿ÷ö`N&ÿ444ÿCCCÿÖÖÖÿŠŠŠí羓â¼ÿZÿK)QÿÖþÿttt>>>333ò‰'ÿ=¹¡ÌÒâ6Ïÿù7ÿŒŒŒÍÍÍñå.:o•`ñåëÎ÷ŠŠŠ½½½ëÎ÷2 ÿM0YlllžžžØþÉM0Y0Oÿ`ƒÿÐÌõ® ìÄ¡ ÐÌõ–½&ÿ }æ7÷ÿððð$$$...áááñññððððððñññ/M&%ÿòòòÿ÷ö*÷öÿÌU íìM&%ÿ})ÿM! YƒâããúŒ€Rˆ‘Ë;5.ùÂ_ÿ®zJùÂ_ÿ})ÿ})ÿÿ·VÿRÿM% ÿööö“úÿŒŒŒ qEÞ¯ÿ{ÿ¬¬¬ÿÿÌÌÌôôôööö ÷ö°Päüýç×þÿÿÌÌÌ444ÿÿÿöööÿèèèèèèÿåââëÎ÷Ul)en4ÊÅÒÑÍúh#"Ïâᄤ{Å¡÷|\…Oÿµô÷ÿ ? í í m÷ööööËòó ¬¬¬...¾¦Á¬¬¬>>>...>>>ËËËÂÂÂÿÿ ôôôöööôôô bbbÿ#ÿÆÓãêÿâ”””Ôàøßûü°^š IDATÿä{½‡2ÿCyÎ`,ÚÓ¯¯}˜M% ÿPØÀ,þ¼­ÖCyÎÌÌÌ-QQÿããmIImII Þݾ¾¾ÚÚÚR†¶"î¾444ÿããù¼ˆXÿƒ×ïÅËÒšššÿ>>>ÜÜÜ®®®V `_fnWðëûÃ÷¡GL÷è;u*!'Pÿ*0*!'PÿÊúú2*èèè]Œ"À¥ý׬|‘ÁÂÿhm>ËÅĘ“Â\W†3ÄÄÄqwx\††ÿ ;5.èèèáááþçýÿ Ã[ßãÃ{wHŠŠŠêêêÿòòòööößûü;5.sEp71ÿòòòÿÿòòòÿ `N&p71èèè÷öÿ AA=Cûå444ÿK ÿËøúø Yƒâ™ÛòK ÿüÍÍÖÿÍÖÿHžøýÔüêMäM" ÷ `N&p71ÌÌÌWWWmmmòòòBmDööö“â¼÷ñÈ!'PÿK)QÿÖþÿßÙ°K)QÿÂÂÂûÑú?Z4. p¾ëÕÕÕ˜˜˜½½½3332 ÿA ÿ2 ÿ2 ÿÎí­^^^ÊÊÊG!V³Ð§ÿ04 ÐÌõjCÚfn õ04 +ëбñ }æš’é–½&ÿ`ƒÿÞÔ÷7÷áááìììðððððððððñññâââÑüý/ÿ÷öí Öùû*?!´íí ÁèéÐý64.QK$‘´xo5ÅËÒÃÆù·V.ÿS*ÿÃÆù})ÿY­Åå9QÖÖÖÿÿŸ>ÊüûÌÓö_‡ ?þåL{ù`é%ÿn «© òòòööö ËËËí ÝÅà!´íçêêêüäÿÌÌÌöööòòò öööÿÿÿ ÿÿ0P'ÿ#ÿÊÅÒÑÍúÑÍúÞÓ߬Th#"ôôôTTTçÿÿ5 /5 òòò’îó*÷öööö +++ú»­íÂÂÂý,ú¬Á¤¬¬¬TTT öööööööööáááüôþÁýá‘úõüôþ¶¶¶÷¼ˆXÿvvvÿÿ…çvvvÿCyέֽ•ì0ƒ×ïj1CCCÿÌÌÌšššÿ<<<ÜÜÜö"#®zJÄÌûÌÌÌÌÌÌÅËÒ!ÿ{ÿÌÓûʹß{ÿŒŒŒš»G$ _ióÑÉùne Z|«¡GLçÜå öéüßÙ°0A\0ßÙ°ÿ‘´R†¶!'Pÿ32¤zz@[¤zz‘ÁÂÿ<<<ËÅĤzzÍÎþ׬|o?>3¤zz\††ÿvvvÿJJJÅËÒºîvvvÿCCCÿ½½½K ÿµô÷öööööö555…‰¸êêêòòòÿÿÿ‘´N¬ÿ444ÿ OÿòÿAÌÒâƒô&PÿvvvÿÿòòòÿÿÿòòòÿM% ÿ íìû×þ0{©M% ÿßûü÷öööööõãõÈòö Aòö ñÿ¿Ãå½ ÷vvvÿüÔÒËøúÃø û3üÍù¡ÅËÒô¹4-ob3vvvÿÖÖÖÿû×þ„³¢¢¢CCCÿÿfff½½½ßÙ°¦ûþmDöõ íìíç¾0!'PÿK)QÿßÙ°ÖþÿÂÂÂÍÍÍ”ù ûÑúq6ýóðÄͼˆXÿööö ëÎ÷Ÿ¼“F'gvvvÿ2 ÿ(72SºÙ™¥Ë–³Ð§Hk6: бñÊÆô7÷ÐÌõ04 `ƒÿÊÆô‰¢R`áááÍÍÍðððññññññááá³ÚÛ„ÖØÿöööí í Öùûòòò³ÚÛòòò M&%ÿ³ÚÛMÑéocLÌÒâ/q7 ¥e*ÃÆùDx¨IªÒ6R†¶Dx¨›ï沂Z&ö***ÊüûÌÓö=yqžžžþçýs¯§ÂÂÂÑ bçì’ïòJ©«èèèÿêêê êêê=þû÷öý,=CüäÿîëÿÿòòòèèèöööêêêöööÿåââÑÍúÑÍúÞÓßÞÓßÞÓßÑÍú¬TLÚGk&Pÿ&PÿüÚ°÷ööööÿôôÁèéÑüý/ Öùû‘áááÂÂÂÒÒÒBZ?ùÔùë+îãêÿâüôþ... ôôô©H ®zJyEXK^üôþ¢•¨£« Ÿ>vvvÿ¼ˆXÿÄÌû666žžž®zJ¬¬¬ÿŠŠŠ-QQÿ?ƒTÿ^„Uÿ5‚+ÿ2 ÿÆÓö6})ÿ·Vÿ–Ïñ½½½vvvÿ   $$$ ÞÝHöô\ÀrFE€¬­-QQÿÓ¯¯úÁå!ÿ*Ðøú.îê1ÿ¼ˆXÿšššÿîîîÕâH27ðÐ8ÉÉ÷übçìo!e Z|«ôãû6k(!'Pÿ©øÒR†¶“â¼ööö¤Üó4.ÿßÙ°!'Pÿ¤zz¤zzÍýþÿ‰ˆÍÎþ)T„ÿ׬|׬|)T„ÿ\††ÿ\††ÿ)T„ÿ¤zzS*ÿììì$$$$$$¼ˆXÿááἈXÿq|OöööêêêËËËËËËòòòòòòÿ òòòòòòÿ4.8MöbU³èCrP& Ý´S*ÿ¼ˆXÿÿòòò ÿ555TTTÿòòòÿM% ÿþçý)þçýñŠ[ÿÿ÷ íìööööõø  ÷A=Cñÿ¿ ÷A Þêüýø "úøüÍýÔà,»äÜì:-M:ÌÓûR†¶ AÿÍÍÍ´…^^^’äæ «}T®GK)QÿÖþÿ¥ÜÑíöö=þû¦Ù²í 0DÖ'Pÿ*µ×¯ÍÍͽ½½½ábbÿáºá333Š­Šÿvvvÿ666bbbèèè2 ÿò¥Ë–(7i]iÊÊÊ666ììYJJJ¶¶¶ˆˆˆ1W"úñýëÎ÷0Oÿбñ }æ`ƒÿ6: ‚[òèèè04 §w^ò6: ÐÌõ$$$ÜÜÜìììáááâââððð$$$ðððÂÂÂáááM&%ÿ³ÚÛööö÷ößûüÿ!öÿßûüòòòòòò³ÚÛM&%ÿj0 ‘žÍocLDx¨ (ÿÑûäããÐÐøúIªÒÿšššÿRttŒŒŒbb ÿÒÒÒÌÌÌèèèÌÓ ÿ4- úÂù=yqÏ´ô÷ÖÖ=yqžÛãööö+++êêêýáàÖí ùÔÃåëùë+ñö¿ ÿöööÿèèèаÙ0P'ÿÞÓß.K/55ÑËËáÒµý*¯‹½Qu¥£#éÿãñ±ÿööö÷öí ÁèéË M&%ÿ³ÚÛ ÿ*É÷ùôôô áááBZ?ÂÂÂêçêü þXK^áááÂÂÂôôô êêê‘´“2"I…ª>6AXK^¬Á¤———mÎö'^ÿÙ¢ïŠŠŠ¬¬¬ÿÊÊÊDxŠv"#ÿžžž———½½½vvvÿ-QQÿ13ÏÍüú æh÷:- jÑ5M%¼ÿ:- CkI?åòò$$$ÜÜÜÍÍÍ"# hö"#šššÿ“··ãã̯¯444ÿÌÌÌK ÿßûüÿ*Ðøú0êç…ìñ!õÿ{ÿÅËÒPPPŒŒŒ$8üÆ7óÑ8ÉÉù¦%*åâÿðÿo!ô?GGdÇÏ@‚,ÿÀ~Ôý,¾ÿí —Åî555ÕÕÕòòò!'Pÿ*ß)T„ÿ¤©zÄÄÄËÅĤzz)T„ÿ325;<ËÅÄ32„ÿ׬|;5.—¶‚‚‚ÜÜ~~~+++]/Dx¨òòòÿöõø ÿòòòÿÿèèèÿööö‰ÄÚÚÇÝ0P'ÿаÙS*ÿ;5.Dx¨¶¶¶0Ð?ó¾¾¾ÌÌÖS*ÿ;5.ÿòòòÿööööööËËËáááÿööö4.Ìâþÿ ²Ú*ÖùûÉÏÿèèèöööíì*Ëöõê ãõÈèäë  ñÿ¿0ÿ¾¾¾òòòÿÞæöõK ÿµô÷ûãÓ³ÖTNÿÁèÍ ÿèèè½½½\â ÿ4.sEp71\›±òòô!'PÿßÙ°!'PÿZ“â¼=þûÖùûí mD¦ûþ*µ×¯vvvÿŠŠŠò‰'ÿ póðwÙvvvÿŠŠŠ2 ÿò÷è‘k ¶¶¶Âˆˆˆxxxˆˆˆi†].:333Ÿ¼“ëÎ÷`ƒÿ6: 06RX¼èèè`ƒÿ }æ`ƒÿÐÌõбñ`ƒÿÐÌõ2Sðððáááñññ...¾¾¾ðððžžžÿ÷ößûüÿ÷ößûü!ÿßûü|*(ÿ;,;4Êþ"ÅËÒÌÓûãâá³ÛôÿòòòøÃÿjŸÕÒÒÒffftttTTTžžžCCCÿ–a+=sÿ5 ôþçý0ûbg=¹µêêéqõúÛ´ô÷cçìÿ555ËËË÷ÿô  555áááêêêA.ÕßÒøõèèèÿêêê ööö èèèÿ¥! eéèèè0P'ÿý*ëÇÇ99/55ÑËËá½½ 99ëÇÇööö÷öìýþìýþ èèèÿ÷ö*Öùûí >>>ÒÒÒ...¬¬¬÷öäþ"ÒÒÒäää ôôôööö áéÞ"ÂÊ¿%,Ù¢ï |ªò IDATCCCÿ333ŠŠŠ-QQÿú Àó@1Ú )Ö¯µëÛF·IÌ–Ïñ­œ#¹nèMÑé444ÿL ˜ÄÅ+++½½½vvvÿ ÞÝö"#ŠŠŠÿ íì*ÃòòòvvvÿÕâHÅÙÿjÿÇ7ðИóüØìüÔ>éå0o!%¯¼&„úÔÀ~Ô!'Pÿíç¾òòòÿôôôööö +++yE¡ùµ×¯‘ÁÂÿËÅÄÍÎþ׬|)T„ÿ32ÍÎþ׬|)T„ÿ32¤zzS*ÿ»äòòòÿRRRŠŠŠK ÿµô÷ÿòö  ÷öõø ÷ÿô èèèÿòòòÿ÷ÿô  ü ö òÝúÿòòòS*ÿ;5.ÅËÒÌÒâÁé ÌÙó±ÿ ööö öööTTT¬¬¬ ööö öööòòòÿòòòÿ íì*Öùû÷èèèÿ èèèÿööö÷ö*Öùûõÿÿê ë ûöþ  èèèÿø òòòÿöõêüýÿ"úø,.ÌÌÌ!'PÿßÙ°&PÿüêûãÍCCá½½òö  ÷ èèèÿööö èèèK)Qÿµ×¯!'Pÿ÷ñÈööö=þûÖùûí mD¦ûþßÙ°vvvÿ666ÊÊÊ666———½½½ÿòòò2 ÿaDm666o•`G!V¹ßª(7iiio•`úñýaDmŸ¼“.:½½½`ƒÿf=Bj³ÞÔ÷òÝú0Oÿбñ0OÿèÉ :::ññññññáááñññááááááñññ®®®ÿòòòÿ÷ö*Ã=þûµô÷ÿ=þûµô÷M&%ÿ³ÚÛM&%ÿj0 –ÏÞ4.ÌÒâÔßß\$ Îãøµô÷ÿòòòšššÿÈÈȶ¶¶èèè{ÿ"L Ê MÑÕÿöööêêê÷ÿô"üäÿôôô÷7ùÔîë öööòòòÿòòòÿòòòÿòòòÿöööòòò2 ÿèÈñk&Î×Õÿ)+/55À¥ý&Î/55ÑËËëÇÇöööÿôôí ÿôô*Âöùí ööö ööö +++¿£¢*ÃTTTÂÂÂôôô+++ÕÕÕöööòòòÿöööôôôòÿìööö÷ÿô²I2=Dx¨CCCÿ333ÍÍͽ½½!'Pÿô ¹ õGô ¹ëÛF-DPØÀß]u[ЕüÙüMÑévvvÿ ÞݘÄÅ+++½½½vvvÿ ÞÝ€¬­ÿòòòvvvÿÕâHµ¾Ä!Î(ìÄÔ, 3 ŠÝlJ%3ßðU=×'Uß$À~ÔÿòòòÿêêêBßÙ°Íýþÿ‰ˆ¤zz)T„ÿ׬|)T„ÿ32¤zzÿòòòCCCÿááá½½½M% ÿ³Ûôÿòû$ûå ÷"úøÞ÷ÿô ÷ òòòÿ÷ö*Áéêÿâs0$­Ö OÿüãÜòû$ó±ÿòòòÿ“2÷”¶îlJaÂýööö öööòòòÿ èèèÿòòòÿòòòÿööö÷öí öõø ÷ÿô+C%ÞÓßüôþûöþ  èèèÿòòòÿòòòÿöõ5µô÷bbbÿˆˆˆxxxžžž!'PÿßÙ° Aÿõ¿ÿ  äóõèèè AÿùÖ ÷òòòCCCÿ333```***K)Qÿµ×¯µ×¯ßÙ° 8BÍ í ÷ö“â¼vvvÿ666>>>ÍÍÍÍÍÍÊÊʧ§§¬¬¬ÿ 2 ÿ¬¬¬ÿ—z£666o•`áááí Ìo•`[5j—z£ÍÍÍaDmÒïÆ2 ÿÿÐÌõÐÌõšÃ¾04 04 ", 0Oÿ#ÿÞÔ÷0OÿQèÉ èèèñññáááÂÂÂññññññâââÒÒÒâââÂÂÂñññ¥!í Öùûòòòõô÷³ÚÛM&%ÿj0 –ÏÞ¥e*ÌÒâj1"ÀÜÝ’*Îãøòòòfo˜ž§Ðèñ1˜8qõú´ô÷’ïòÃGKÿöööêêê  êêêùë+ð .ý, ÿ ÿÿèèèòòòæÞ¾ç99&Îü3)+×Õÿá½½@[÷ÓÓëÇÇëÇÇÀ¥ýèèèZ ÷ö ìýþÖùû> ìýþ÷öööö òòò5 ñññÂÂÂ*Öùûü ö ÕÕÕöööèèè ôôôö îJJJ555555TTT IªåDx¨333666iiißæÿøñH-Dß]u%ͤIªåMÑéCCCÿŠŠŠüÖÕ˜ÄÅh<;ÕÕÕCCCÿbbbÿŠŠŠ€¬­üÖÕmmmnŠ  µÒÄ`,ÚØ·óÓèûòåàÍûõv#ľáU=ÆÌÓùñçÜåòòò?þsDä{ôôôòòòòòòßÙ°׬|׬|׬|׬|šššÿòòòòòòááááááþçýòö öõæüý"úø  ûöþÿÿ÷ÿôéºù½òøü öêêês0$;5.üãTTT555&&&ÿ ÿ êêêW¸óÃW¸óööö öööÿèèèM% ÿ=þûú?þK ÿòòòöööòö òö =þû÷ÿôø öõ÷ÿô ÞÓßë÷  ÷ÿôöööòòòÿòòòöõ5êüýËøúK ÿžžžxxxÒÒÒvvvÿßÙ°õ¿üéëê/- õ ÿõ¿sEÿËˢ˜˜888ÿÿµ×¯K)Qÿ!'PÿýÔ* B÷íç¾666YYY½½½½½½ŠŠŠ—i@Õ§~èèè—z£———„£c„£cúñýå¿ô½½½[5jëòýúñýŸ¼“i†]ÒïÆŸ¼“ëÎ÷ÿ7÷04 Q }æ }æ6: –qMбñQ", ", —Åîèèèñññááááááððððððñññðððáááÿ?M&%ÿ[ßã=þûí ÿòòòòòòM&%ÿÅÔú¥e*ÅÌø¥e*ÅÔú³ÚÛM% ÿK ÿÿæ,{ÿÏhcÃGK1˜žžžÙ]b;CFÕ–“ êêêêêêüôþøêêêÕý,Òæþñÿ¿òòòèèèèèè òòòèèè öööÿèèèèèèCCü3ïÚ2ïÄ”×Õÿá½½ è¾¼’’ÑËË8bbkk&Îð¾þÐøúìýþÖùûn ‘÷öêêêèèè|*(ÿèèè ...ÒÒÒêêêÖùû  ¬¬¬ èèèèèèüôþXK^ÂÊ¿ÂÊ¿ááá§Ÿª#ÿ€TSÿFâFâTTTÔ¨§¼ˆXÿó±óê+ìüÔTÙôÖÿÅ¡Ê-QQÿ|*(ÿœîð+++üÖÕèèèááábbbÿ|*(ÿ„ÖØ{ÿÐøú…ìñÐøú¥ÛÜ{ÿúܸܿŒ»ä›aïÖøßªàÍûõ3”¼ñ)àÁ7ùñÁé¼ø&ñ+++òòòÄÄÄ\W†\††ÿÿÿÿÿ)T„ÿ\††ÿ32ÍÎþbbbÿfffCCCÿ½½½M% ÿµô÷ Ü ÷ø ü öòòòÿ555 ÷  ûöþûöþøõ#LDx¨ÿ4+ááá½ÆïC:üãÿÿèèèöööòòò ÿÿTTT555þçýÖùûÛÝøÔàøÚÿòö !íÃí  ÷ÿôô+C% ëûöþ  òòòbbbÿÔæçø ËøúžžžÌÌÌìììêêêÿ!'Pÿÿ Aÿòö -ëê ­Ööööòòò ÿÿÿK)Qÿµ×¯ßÙ°ý,ý,ýÔc:BòòòÕ§~TTT½½½;5.i†]iiiåãúåãúëÎ÷2 ÿúñýëÎ÷ëÎ÷Hk04 ÐÌõ­ÖÿÐýÊ`ƒÿ­Ö–qMQ04 7÷ððððððòòòf µô÷ M&%ÿM&%ÿ³ÚÛ„ÖØÅÌø–Ð÷ÅÌøÑüý’*ZÓë2þçýþçýK ÿM% ÿèñ,èèè!òÿÿ¬¬¬ÿnnž™Ÿ`]Ÿ`]Õ–“•µ´µô÷èèè êêê÷öûöþüôþøùÔû É444ÿèèèèèè èèèÿÿäÕ}èèèòÈ ÷7×Õÿ¨ Ê@[@[ëÇÇû É|*(ÿÖùû*÷ö  í ¦ñõoèî*÷öÿœîð³ÚÛèèèÂÂÂTTTí >>>T?\TTTÒÒÒ #ÿJJJááá ÂÊ¿¶¶¶¢•¨üôþç¥Ï IDAT<4ÄÌûDx¨€¬­Dx¨€TSÿó±t0­ÖÓ¯¯ßÙ°ßÙ°—ÅîS*ÿÓ¯¯½½½CCCÿÇJJJ½½½„ÖØ½½½ááábbbÿ„ÖØ{ÿÐøúµô÷µô÷ßûüÐøú|*(ÿòtR†¶õïÖøHÕûòå8#R¹è q…ìÿööö‡WV5;<\††ÿ)T„ÿèèè>>ÂÂÂôôôèèè#ÿüôþ9,?áááæóàûöþ>6AÇÔÁöéüÿ^^^ÍÍÍÕÕÕööö +++333®®®ôôôèèèÿi;<4ÄÌø<4[‘æööösE<4ÄÌø£ÑúêêêTTT¬¬¬ ööö555```   ¢¢¢èèèÿòòòÿ èèèÿòtK.<ÍÀZöööã|MqØžžž^ÿð¢ÿ öööòòò)T„ÿ׬|ÿy©ª‹jÁ )¤©zÄÄÄËÅIJˆˆ èèèÿöööTTTëêËó ööö555éª§Í èèèÿ èèèÿöõêüýÿöööòòòÿ÷ÿôFÿÃ=þûÃòòòÿ+++ÂÂÂÜåÜ 3ôñþçýÍ èèèÿöööòòòÿ èèèšššÿ~~~ööö ööö ööö èèèÿöööAñÿ¿ü ö÷ òòòÿJJJ¶¶¶ööö"úøµô÷ÿèó)ùÖ%ñ/- º¾ü èèèÿööö êêê ôôôööö èèèÿöööB÷ñÈèèèÿJJJJJJÊÊÊ¢¢¢öööhhh666TTTÿ”””lll”””bbbTTT¬¬¬ ööö"A04 f=BHN²"AåãúùÜRu ®‹ôòòòCCCÿðððáááñññ...ðððñññááá×°¯/’äæ©H ÅÔú7'ÅÔúÑüý³ÚÛM&%ÿ³ÚÛÿeù¤Üó÷3ôñµô÷ÿööö èèèÿööö èèèÿööö ööö èèèÿöööòòòÿèèè-QQÿëÇÇ÷7ãñ±ÿk )׬|ÿ99ëÇÇööö÷öí èèè|*(ÿÑüý³ÚÛÿöööòòòÿöööêêê èèè444ÿÌÌÌÿèèè444ÿäääèèèÿöööÇÔÁ÷ TTT¬¬¬ èèèÿööö®zJR†¶®zJ\Àèèèÿ ööö i;»ä ööö èèèCCCÿ“““mmm333˜˜˜hhh¢¢¢JJJ˜˜˜hhh˜˜˜ ööö ööö ööö öööòòò*‚ÿK.<öPTTTˆˆˆÂÂÂTTTÿèèèÿ êêêòòòÿDnn5;<}ML èèèÿööö=þûÁé=þûËó èèèÿòòòÿTTT¬¬¬òòòCCCÿËËË555ËËË ööö?þÁé?þÁé èèèÿ?þþçýÃ?þþçýà èèèÿ öööòòòbbbÿ¶¶¶ööö ööö èèèÿööö ööö÷ÿô  èèèÿööö&&&¶¶¶ŒŒŒ˜˜˜öõ5à èó)ùÖ ÷ú.Iá½½ÿäéëòòòÿööö555333˜˜˜555333ÍÍÍËËË ÿööö èèèÿèèèÿèèèÿööö èèèÿ7÷бñÿ7÷бñÿöööRu  }æ`ƒÿ }æbbbÿáááððððððñññðððááážžž|*(ÿÑüý³ÚÛ|*(ÿÑüý×þÿ)³ÚÛÿõêê ööö èèèÿööö èèèÿööö&&&ÌÌÌÿèèè444ÿÌÌÌ-QQÿïÚ2äÕ}ÿ99ïÚ2äÕ}ÿ èèèM&%ÿ³ÚÛÿööö èèèÿèèèÿööö èèèOt5 IDATÿööö èèèÿèèèÿòòòÿööö èèèbbbÿ¬¬¬TTT¬¬¬ èèèÿèèèÿèèèÿööö èèèÿöööòòò€ÿKX¾ÿµ¨BKX¾ÿÍÀZ3@¦ÍÀZèèèÿJJJžžžêêêÿêêêÿÿöööòòòÿ èèè‘ÁÂÿ‡WVDnn¼’’èèèÿèèèÿööö ööö èèèbbbÿ¬¬¬TTT¬¬¬òòòCCCÿ¬¬¬TTT¬¬¬òòòÿööö ööö èèèÿ3ôñÁé ööö èèèÿòòòÿööö ööö èèèÿèèèÿ÷ÿô  èèèÿJJJtttŒŒŒ˜˜˜ èèèÿööö ööö èèèÿöööhhh˜˜˜ ööö ööö èèèM&%ÿ³ÚÛšššÿ³Œ‹³ÚÛšššÿfffM&%ÿ/Ñüý³ÚÛ#ÿüôþöéü!ÿ*Öùûßûüÿ÷öí òòòÿöööòòò!'PÿßÙ°ÿ à,ü¦îZüÚ°M% ÿ4- ÌÓö³Ûô444ÿôáã QRÐþ±«|Fƒÿ2+:¹Ùvôáã ÌÌÌÿòòòÿ êêêòòòÿòòòÿòòòÿèèèÿ ööö èèèÿööö èèèÿööö÷öí òòòÿ÷ößûü½†"ÿÀ£ïƒ×ï})ÿ:- Ckƒhâƒ×ïÿ÷ÿô ûöþûóþÿòòòÿööö èèèK ÿ³Ûô/&%ÿ/Ñüý³ÚÛÈÈÈÁèéÿÈÈÈM&%ÿ/Ñüý³ÚÛ ÿûóþÿýñõåûà æÿöéü!ÿí Ö÷ößûüÿí ÷ö÷öÿßûü!'PÿßÙ°èñÜòû$æÿèèèßÙ°!'PÿßÙ°à,üí"Z6§ðYÿ!ý¸þçýÌöj1ÿ³Ûô444ÿôí14RÐþÕÏ K ÿÙ ¡"í_Îÿ2ÕÆG+Š /hCÿñññäääöööÿöööööö êêê ÿèèèÿòòòòòòÿÿòòòÿèìÿ÷7Èÿöööööö÷ÿôöÿ èèèÿööö 2ÿæèèèÿööö÷öí òòòòòòÿí !öÿßûü})ÿ=; ƒzïå9Qã88ÂǾ· Ìÿèèèÿ÷ÿôûöþ+C%Þ¾çÿÿêêêÿêüýÿ  àøÝ ÿûóþvvvÿšššÿ444ÿM% ÿj1"K ÿ444ÿ444ÿ444ÿ444ÿ444ÿÑüý/ÁèéÿëÄä=þû¤¶¶¶Áèé’äæ;,/ ÿ ÿýñùñýûöþ âæûöþM&%ÿM&%ÿí ÿ í *ÿÿÿ!'Pÿ!'PÿßÙ°ÿÜn‰|$ööö!'PÿßÙ°òòò üí"øÏüí"ìÜÿüâüÚÿÊüûk 'èåq|OWñò†Ü÷¡ÎýÿÍÒÅö¦Ä19˜åöööööööööêêêööööööööööööÿÿÿä{ÿÿòòòööö3ôñ}%úãúã ÷òòò!ww$û ÷ÿôööööööÿÜ÷7ÿöööí ÿÿ!ÿK ÿÿ í ÿƒ×ïƒhâCzÞ¶¶¶±roûÎÖÌÌÌèèè    Õ½ÛÚÇÝ!wwòö öööôôô #$ÿê #ÿK H-ƒÿK%ÿÿ ÿûóþPPPÿBBB³Ûô4-Êýüµô÷444ÿ444ÿ444ÿHöôCCCÿÌÌÌÌÌÌÌÌÌ/œîð’äæ÷öÁèéoèîÃoèîööö÷ö÷ö_®ÕÑüýM&%ÿûóþ ÿ %üôþûöþûóþöéüûóþ/ÿòòòí íìÿööö*§}òòò ÿ!'PÿýÔßÙ°èèèmûõÊÌÒ !'PÿýÔ!'Pÿ!'Pÿ #ÿð üäÿÞýìÛ|>~)®Õ+þçý¤ÑòñññÐÆøûZÐþü·…†ÍžWñþíþíÎýÿö¦Ä( –áááööö"úø"úø 555ðîòòòYƒâòòòÿA§}‘åýæèèè ߉‰  ü ö÷ÿôòö öööööö ãúãAÿòòòòòòöööÿí ÿòòòèèè ?_GS*ÿ0P'ÿ¥n ÆÓã_ƒ-ÿ'^ÿÿÿÿ?  ûöþÛ’!ww  8òö öööð!ÚÉ IDATbbbÿRRRÿSQ(ÿzdcRRRÿ 2ÿüé&`á¢3I`K%ÿÿÿýñûóþŠŠŠ·Vÿ½†"ÿK ÿû×þʹ߽†"ÿ·VÿÌÌÌHöô¾V;,9çåñññM&%ÿööö÷öí í í *õÿÿ5Ôßß/ ÿ ÿ  ùñýåãú&8  M&%ÿ„ÖØ/òòòòòòí ø ÷öÃ…çÿèèèòòòßÙ°ý,û3 2ÿ%éñü\öööû3ø_û3!'Pÿ #ÿàþ) -Z.âÓ¨”,*׌‹úw$³Ûô NøûZÐþÒ°€As1o! 4ò†þíÎýÿÿÕÆW7š555&&&ÿôôöööËËË"úø"úøÞòòòÃÿÿ39ãúã{ð öööòòòÕ½ÛS|"-! +C%ïü ö÷ÿô÷ÿô÷7=Cñÿ¿òòòÿm0=þû÷ö!ÿÿèèèòòòyn0P'ÿåââsÊj0ö³'îÔø ööö 4-?  ûöþßž 3þêêêñÿ¿òòòSQ(ÿ—ÕÿÖSQ(ÿÿ*ÌÊ¡RRRÿæÿùÍ ¥xý^þìëíõêëÎ÷ŠŠŠ444ÿŒŒŒ« GúÐùÚÿÑûäúÐùÊý„ÖØŠ òIªÒ„ÖØÌÌÌ/œîðí ÷öø Öùû*œîðûóþ", ùñýüôþùÜåãúûöþÿ³ÚÛM&%ÿ„ÖØÿí òòòòòòòòòÿû3üÍ+ƒÿÿòû$òÿABl>òÿAòã‹üí•ßÙ°üÍû3!'Pÿþô×õÓÏúÿZ. ý¶üôþ ÞÓß® ÷ÁÌúÑÍúÛÝøÐþÒ°€,!!þè†Í’ð ÿïíå£I{Þ ¡þíÿÕÆ ÕÕÕÚÚÚ,.Þ"úø "úøÝúüæüýÿ÷ÿô÷ÿôöööÿAµÛÆûå ÷èèèòòòÿööö÷ÿô Ë¢åââõåûÕ½Ûòæ,øKMFOãúãµàáñÿ¿òòòÿöõmwuowu0í õÿÿmÿÁ¡¹ÃÅóåââ0P'ÿõåûyú ‡ôÑÍúò'^ÿèèèêêêòòò»ä4-5  üôþóâú êêêòö )Ù³$ß)Ù»½æ»ÑÒÿÖRRRÿèìÿöüàûÕþ+‚ &6*5 "ûóþ...CCCÿ888Iªå’3Øþüj1Iªå­Ö¼ˆXÿ¸ 444ÿCCCÿbbbÿCCCÿCCCÿ444ÿ444ÿ„ÖØööö=þûöõ*õÿÿÖùûööö ÿ ÿ åãú÷ÿôùñý%7÷2 ÿ³ÚÛòòòöõ÷öÿÿ !'PÿßÙ°òã‹ÜøÄ”òÿAèñÿßÙ°ßÙ°àüô¦ïÒ÷êüïÖø#-ñµÝK ÿûZ+ob3qz3Ðùþ˜. Ðùþ,À£+1`Þ ¡Îýÿööö+++hhhÙÎÎ&&& ÞÿôôöööÝúüø ÿ   "BèìÿãõÈ ÷ÿÿÿèèèòòò ëÞ¾çS|û÷ûåãúãñÿ¿Ã彿æ ÿ÷ö“úÿ…ç¤Üó/|Ý“úÿ=þûø ›ðômÿ:- CzÞëÎ÷аÙöéüåââ0åââîÔø'^ÿÿ 4-5 ÷ üôþ÷ÿôêêêñÿ¿ 8ÿp10è}„„ÖØ ë껽æñïÆÅÇð555RRRÿ‚ÿüéèìÿgñ2¿àüôÊÖþÿ@‚,ÿžžžttt½½½fffj¯é&é–ÏñR†¶¼ˆXÿÌÌÌÌÌ̽½½áááññññññÌÌÌÌÌÌÿ =þûÖùûnø õÿÿ=þû#ÿ% ",  ÷êüëÎ÷åãú§VOÿø =þûø ÿòòòèèèüÍ~)úÕý·{V ²Ú›ƒT* !®zJe}¬qz3nöo! 0Ûë ø Ê¿¿&&& 01÷þÿø ÿ:- =þû§}Aõüôþ÷ÿô=þû÷ÿô òòòòòòÿööö ÚÇÝÜA öööööö ÿööööõ Ã÷ö÷öí Ã=þûí í s 8ó–Ïñh÷ôôôöööúÐùQˆìÿ?Áèéöõ=þû§}êêêÒæþòö M&%ÿ+­¯ØèèèM&%ÿSQ(ÿ­¯Ø #$ÿÆÆÆÿ*ÿ Aÿæø öüàËöÞœ+0êûóþýñøÉñæòòò!ÿ=þûú÷öK ÿ»äõ#LCCCÿ444ÿCCCÿ444ÿ444ÿÌÌÌñññððð444ÿ444ÿn;,þæäöõø í Ëøú”¶Û2 ÿûöþÞÔ÷ùñýüôþ÷ öööÿí í Ã=þûêüýËøúK ÿ!'Pÿ+ƒÿèèè¿Úÿ¿ òòòèèèßÙ°õÿÿñýþóþþü×û6Rÿ¶¯Ü 2¸çÝe}¬›ƒTûÎÃûÎÛƒTR†¶bé‘ß÷¦ðÝß.¸Ü¯èèè  ÙÎÎõêêöõ üÔÒ öööÿW¸óÃ…ç¿ û  Ãö î èèèÿèèèòòò3ôñööö ÷ ü öãõÈ39ööö=þûèèèèèè***Ã=þûÃúÐù˜ ø½òø0˜ ø W¸óèèè?»äø „–—OŽ‘…ç.|*(ÿ³ÚÛ­¯Ø|*(ÿ|*(ÿ+­¯ØSQ(ÿèèèÿÖèèèõ¿èèèèñèèèòö ø œ:>Bÿîÿ8   ÿëÎ÷(jèèè})ÿœÖùûÛÝølJ·Vÿòòò¾¾¾“““444ÿÌÌÌñññ444ÿÌÌÌÌÌÌñññÌÌÌÌÌÌ”¶ÛÃöõø =þû©H ø ËøúÑüýí ùñý%üôþüôþ÷ ÷ÿôòÿìòòòÃ!ÿø ËøúÿßÙ°üÍ!'Pÿÿòû$ó×ÿòû$öööÿ!'PÿýÔüÍbbbÿbbbÿõÿÿñýþäûü0Ðüûü×û»Â€«”× äþ†ÍH¤(lHöH¤(“Í,ÿôôÂôÝñ!üÒèèèèèè555÷þÿø Þ"úøûöþ  üôþ8ÿÿ ÿòòòÃ=þû3ôñ=þû÷ KòµàáA=þûà ÿø Öùû÷öÃÃ=þûòòòÆÓö ÿ @]8 4-Áèéòòò|jiòàßòàß|jiòö Òæþܲÿ6óî„ÖØ­¯Øÿ õô­¯ØRRRÿ‚ÿ÷ÎÿìMÜ!ÇÔÓÿîÿ  ÿÕ°Ý:- úÐùßûüßûüÆÓö0ÌÌÌ***BBBÌÌÌÌÌÌ444ÿÌÌ̽½½ÌÌÌ’äæ1ø ©H 1n=þûø Áèé ðÛù  $û÷ÿô 2 ÿA ÿÿ òòòòòòí òòòø þìëßÙ°ßÙ°÷ñÈöööòû$F7ßööößÙ°ý,ßÙ°bbbÿáááJJJVY'ƒ×ï0ÆÓöƒ×ï õåûûöþûöþõÙÿ´5ÔüÙü¸\ؾ­~  íìß.H$QÿËËË Þöõ ÷ÿôûöþ  èèèòòò ÷ ÚÇÝö îòòòèèèèèèÿ Í Ã2=þûÃK×.ýºµý)öööÿèèèí í Öùû=þûÃTTTTTTÿƒ×ï%úÐù/3 èèèèèèÌÓû?êêê !e + !êêêòö òû$K%:ãõÈ=þû”Jº, IDATNãê6óî› ²ÿèèè­¯Ø;9ÿÖbbbÿõ¿ÿä{¸]äÿîë¢3üèèèèèè æ ÿj¯é–Ïñÿ¤ÜóŸêÿŠŠŠCCCÿ444ÿððð444ÿ ?’äæn”¶ÛÅÔúÑüý15  Õ¾óûöþ&8 ÷êü+B 4 úñý)ô2 ÿÿöööòòòöõòòòòòòø !'PÿöööÜòÿAòû$ßÙ°ððð———µô÷ÃöøÃöøÐøúƒ×ïƒ×ï+Ul) ø> #ôôô˜ß˜ßÃÚi  * !* !H$Qì±ÿòòò   èèèèèè÷ÿô  ÿÿöööë ÿ#ÿÿ ÿööö ‘åý2©H 2Ãæ öööÿTTTßûüòòòÃTTT¬¬¬ŒŒŒ¬¬¬òòò2 ÿ/3‡ô ,èèèÿòòòÁèé?êêêçNS,êêê=þû ÷ÜµÛÆKòNãê³ÚÛNãê­¯ØSQ(ÿ­¯Øðððÿ‚ÿ ×èèèÚq…çaÂý\ñø'ž9èèèèèèûóþÿ3ôñÖùûÔàøö ÿíìþçýööÿ èèè½½½444ÿ444ÿÌÌÌèèèÿnœîð1Ñüý/’äæ?Áèé³ÚÛ#ÿ ëòý4 ëòý óâúêêü öéü2ÿèÿöõ ! ÿööööõ ÿòòò÷ñÈòû$bU¶¶¶übY0¶¶æÿ 8ßÙ°®®®RRRÿÂÂÂÿööö ööö èèèÚÚÚ+I:$úÕý3è Ãél"v”ÞŠ=/"_Õ%äÃäèèèÿêêêöööòòòòòòÿ ö öööööö èèèòòòÿöö÷öôèèèÿòòòÿ3ôñà :-ÆÓö‘åý=þûÃöö ööö>>>¶¶¶888¶¶¶öööÿööö¬¬¬ÈÈÈöõÿòòòÿ/30úÐù/3Â9'ÿ&ñèèè4-Áèéÿòòò4Eÿ¬¬¬?=æäû6G!­ÖÿJJJðððÑÒÒÿèèè~èÅÍôòòò ÿ W¸ó©ÿ5 ôþçýÃ?þÁé èèèbbbÿáááñññÌÌÌ444ÿÌÌÌM&%ÿÁèé ööönÑüý³ÚÛ|*(ÿ’äæ èèèÿööö÷ÿô íõê w<&»ä èèèÿöõø öõ í èèèÿööö555áááñññäääööö555¶¶¶èèèÿööö ööö ööö èèèÿi;‰ÄÚ²qTÅËÒÊ»ûÍ óööö®zJ†Í6E;5.R†¶òòòÿòòòÿòòòÿòòòÿòòòÿööö÷ÿô  ü ö÷ èèèÿööö 3ôñ§}&ñèèèÿööö èèèÿöööŒŒŒ~~~ööö ööööõø ööö©H ;3 múXÓîW¸ó©H ;3 8WéèèèS*ÿÌÓûÁèésEÌÓû4-ÌÓû4-­Öÿööö öööEC»½æEC»½æDDDÿÖÅÇðèèèÿèèèÿ©H Iªåÿ5 ôËó ööö èèèM&%ÿÁèé?³ÚÛM&%ÿÁèéòòòÿöööü ö ®eRR›®s0$»ä èèèÿööö ööö ööö ööö öööòòòÿööö&&&¶¶¶èèèÿööö ôôôèèè444ÿˆT$\À¤p@hœÌ˜d4hœÌôôôööö®zJhœÌ˜d4\À¤p@Dx¨ÿòòòÿööö÷ÿô èèèÿöööòòòÿèèèÿèèèÿööö öööòòòÿòòòÿöööä{…ç èèèM&%ÿÁèé)ËòóèèèÄÍÎF IDATÿèèèÿèèèÿööö èèèÿèèè€ÿbbbÿÿÿCCCÿvvvÿbbbÿCCCÿvvvÿ¬¬¬ÿ¬¬¬ÿÿÿbbbÿ$$$ÿ$$$ÿ$$$ÿšššÿ!ÿK ÿÿÿÿÿÿM% ÿšššÿšššÿ444ÿ!'Pÿáááÿöööööö444ÿšššÿ333šššÿŠŠŠÕÕÕvvvÿ$$$———***ÿÿööövvvÿJJJ>>>>>>~~~ÿ, Öùûÿÿööö ÿ5 ô4- ÿ<<<ÿffffffÿÿ!'Pÿ-4ËËËöööbbbÿ¢¢¢ššš¬¬¬ÿfff”””CCCÿ```©©©ÕÕÕbbbÿÖÖÖÿ3ôñ÷öòòòCCCÿìììÊÊʈˆˆÂÂÂCCCÿÿ5 ôËó ßûüvvvÿÿööö ÿÿööö èèè444ÿêêêÿšššÿvvvÿ444ÿRÿ5 ô4- —Æÿÿ bbbÿÄÄÄšššÿÈÈÈöööÿÿöööÿ!'Pÿ-4×¹Ë !ÿÿÿòòòòòòvvvÿ888ŒŒŒäääCCCÿ666ÊÊÊvvvÿCCCÿÕ–“ÊÊÊvvvÿšššÿ888ÕÕÕèèèJJJ———ÿmÖùû÷ÕÕÕáááììì:::ˆˆˆ>>>èèèò‰'ÿÿ½½½vvvÿCCCÿÿ5 ôþçývvvÿvvvÿvvvÿÍÍÍöööèèèqéÛ IDATÿÿèèèK ÿM% ÿbbbÿšššÿÖÖÖÿfffxxxttt¢¢¢fffM% ÿÿM% ÿ4- —Æèèèòòòÿÿ èèèbbbÿ~~~èèè444ÿÖÖÖÿ¶¶¶ÿèèèööö CCCÿvvvÿÿÿCCCÿ)T„ÿ OÿOÿK ÿK ÿ!ÿÿÿCCCÿvvvÿÿÿCCCÿK ÿÿÿÿCCCÿÿÿCCCÿvvvÿÿÿ{ÿK ÿÿÿÿCCCÿbbbÿbbbÿêêêÿvvvÿ·Vÿ})ÿÿÿvvvÿ!ÿÿÿÿCCCÿ¬¬¬ÿÿCCCÿvvvÿÿÿÿÿÿÿM% ÿ444ÿvvvÿšššÿbbbÿ444ÿvvvÿÿÿÿ444ÿšššÿRÿM% ÿÿM% ÿRÿÿM% ÿK ÿM% ÿÿÿbbbÿÖÖÖÿÿbbbÿÖÖÖÿšššÿÿÿÿK ÿÿÿÿÿÿÿ ÿÿCCCÿvvvÿ444ÿOÿ!'Pÿ€TSÿM&%ÿK ÿ!ÿbbbÿÿÿÿÿM% ÿÿÿbbbÿÿÿCCCÿbbbÿÿÿÿÿÿ444ÿ$$$ÿÿ$$$ÿbbbÿvvvÿTPÿM% ÿ·VÿM% ÿíZ!ÿÿCCCÿ444ÿêêêÿCCCÿÿ$$$ÿCCCÿCCCÿêêêÿÿÿÿbbbÿÿÿÿK ÿÿvvvÿÖÖÖÿ444ÿvvvÿ444ÿÿ 2ÿÿbbbÿÿšššÿ½†"ÿÿS*ÿM% ÿÿÿM% ÿRÿM% ÿ¼ˆXÿS*ÿÿ444ÿÖÖÖÿšššÿbbbÿbbbÿ444ÿbbbÿÿÿÿÿÿÿÿbbbÿÿ!ÿÿöööèèè ÿ!ÿ èèèCCCÿWWW¾¾¾äää-4CCCÿö"#3..Í *bbbÿ¬¬¬ èèè!ÿ èèèS*ÿËó èèèbbbÿ¬¬¬ èèèæ¬¬¬ èèèÿöööÿÿOÿè÷Oêêêôôô®®®ÿ«­µ¥d–ÏñÁé/èèèbbbÿ333$$$333èèèRRRWWW:::^^^ÿ^^^ú$$&&&ÿÿ ¾¾¾äää¾¾¾BBB^ÿÿæòòò¶¶¶èèèÈÈÈM% ÿŸêS*ÿ;5.Áé èèèM% ÿ4- ÌÓö=VÿS*ÿÿúdÿÅËÒ—Åî ÿbbbÿððð888~~~žžžšššÿ¬¬¬ÚÚÚ¬¬¬ öööÿTTTööö¶¶¶ÜÜÜí èèè Oÿÿÿÿ ÿK ÿbbbÿšššÿCCCÿÿ!'Pÿ!'Pÿÿ¶WUÿ÷ÅÄÿ€TSÿÿM% ÿÿ!ÿÿ¼ˆXÿÿCCCÿÿ²+ÿÿÿšššÿbbbÿÿÿÿOÿOU„ÿÿÿÿÿÿCCCÿò‰'ÿò‰'ÿ})ÿ})ÿÿbbbÿ¬¬¬ÿCCCÿÿÿÿCCCÿvvvÿšššÿvvvÿ$$$ÿÿêêêÿÿ±h% IDATšššÿvvvÿÖÖÖÿÿÿ%#ÿM% ÿÿÿÿÿvvvÿ444ÿÿÿÿÿøÃÿÿS*ÿ¼ˆXÿÿÿM% ÿK ÿÿÿšššÿM% ÿ¼ˆXÿÿÿšššÿÿÿM% ÿ444ÿÿÿÿCCCÿvvvÿÿ444ÿvvvÿÿ444ÿbbbÿ444ÿbbbÿÿÿÿvvvÿbbbÿÿCCCÿšššÿCCCÿÿÿ)T„ÿ!'Pÿ¶WUÿÿû‘ÿvvvÿCCCÿÿÿK ÿÿÿK ÿÿÿ¼ˆXÿÿÿ%#ÿÿÿK%ÿÿÿšššÿbbbÿÿÿOÿOU„ÿÿÿvvvÿšššÿCCCÿÿÿÿbbbÿ¬¬¬ÿvvvÿÿvvvÿêêêÿvvvÿ$$$ÿÿÿvvvÿÿ‘ÁÂÿšššÿÖÖÖÿÿÿM% ÿÿÿRÿÿÿÿÿÿS*ÿS*ÿÿS*ÿ¼ˆXÿÿÿM% ÿM% ÿÿÿS*ÿÿÿbbbÿÿÿM% ÿÿÖÖÖÿCCCÿbbbÿ444ÿÿ444ÿêêêÿ444ÿÿÿÿÿÿÖÖÖÿÿCCCÿ444ÿvvvÿCCCÿÿÿ!'PÿÿCCCÿÿû‘ÿCCCÿÿÿÿK ÿÿÿM% ÿÿÿS*ÿÿÿM% ÿÿÿM% ÿÿÖÖÖÿbbbÿÿÿ+ƒÿ+ƒÿÿÿCCCÿšššÿšššÿCCCÿÿÿbbbÿvvvÿÿbbbÿêêêÿvvvÿ$$$ÿÿÿÿÿšššÿ‘ÁÂÿêêêÿÿÿ%#ÿÿRÿM% ÿ 2ÿÿ¼ˆXÿÿS*ÿ¼ˆXÿÿÿRÿK ÿÿS*ÿS*ÿ¼ˆXÿÿÿÿÿÿRÿÿvvvÿêêêÿÿšššÿÿbbbÿêêêÿ444ÿÿÿ444ÿCCCÿÿvvvÿCCCÿCCCÿbbbÿšššÿCCCÿ$$$ÿÿ!'Pÿ!'Pÿÿvvvÿ÷ÅÄÿÿÿÿ!ÿÿÿK ÿÿK ÿÿM% ÿÿÿM% ÿÿCCCÿ¬¬¬ÿbbbÿÿÿCCCÿšššÿÿÿšššÿêêêÿêêêÿ¬¬¬ÿCCCÿÿÿbbbÿêêêÿvvvÿÿÿÿvvvÿêêêÿbbbÿ$$$ÿÿÿvvvÿšššÿêêêÿÿÿÿK ÿÿŠ„ÿÿÿÿRÿM% ÿÿS*ÿ¼ˆXÿÿÿK ÿM% ÿÿ¼ˆXÿ¼ˆXÿM% ÿS*ÿ¼ˆXÿÿÿÿÿM% ÿÿCCCÿÖÖÖÿÿbbbÿÖÖÖÿÿ444ÿšššÿbbbÿÿÿÿÿÿÿvvvÿÿÿÿ444ÿvvvÿCCCÿÿ!'Pÿÿvvvÿ÷ÅÄÿÿÿ!ÿÿK ÿM% ÿÿM% ÿÿK ÿM% ÿÿK ÿM% ÿÿCCCÿ¬¬¬ÿbbbÿÿÿCCCÿšššÿÿêêêÿêêêÿêêêÿvvvÿÿbbbÿêêêÿvvvÿÿÿÿvvvÿ¬¬¬ÿvvvÿ$$$ÿÿbbbÿ\††ÿ$.Ù IDATêêêÿÿÿK ÿ%#ÿRÿM% ÿÿÿÿÿRÿÿÿM% ÿM% ÿÿÿK ÿM% ÿÿÿS*ÿ¼ˆXÿ¼ˆXÿÿúdÿÿÿÿÿK ÿRÿÿšššÿCCCÿÿêêêÿ444ÿÿšššÿ444ÿÿÿ OÿÿÿÿCCCÿÿÿÿCCCÿÿ!'Pÿvvvÿ€TSÿÿÿÿÿÿK ÿM% ÿÿbbbÿvvvÿvvvÿK ÿÿÿ!ÿM% ÿÿ!ÿM% ÿÿvvvÿÖÖÖÿbbbÿÿÿCCCÿšššÿÿšššÿšššÿÖÖÖÿvvvÿÿbbbÿÖÖÖÿvvvÿÿvvvÿêêêÿvvvÿÿÿšššÿbbbÿêêêÿÿÿÿ%#ÿK ÿÿM% ÿÿÿÿÿÿÿM% ÿRÿÿÿM% ÿÿÿÿÿÿÿÿÿÿK ÿRÿÿbbbÿvvvÿÿÿbbbÿšššÿÿÿÿÿÿ OÿÿÿÿCCCÿ444ÿÿÿÿM&%ÿ€TSÿÿÿÿÿÿÿÿM% ÿK ÿÿCCCÿÿ¬¬¬ÿvvvÿÿÿ!ÿM% ÿÿÿ!ÿM% ÿÿvvvÿÖÖÖÿbbbÿÿÿCCCÿbbbÿÿvvvÿvvvÿvvvÿ$$$ÿÿCCCÿ¬¬¬ÿvvvÿÿvvvÿêêêÿvvvÿÿÿ¬¬¬ÿšššÿÖÖÖÿÿÿÿÿÿÿÿÿÿM% ÿRÿÿK ÿÿÿÿÿÿÿK ÿM% ÿÿÿbbbÿbbbÿÿÿšššÿÿÿÿ444ÿvvvÿÿÿbbbÿÿÿÿÿK ÿK ÿÿÿvvvÿÿ!ÿ%#ÿÿ!ÿ%#ÿÿbbbÿvvvÿbbbÿbbbÿÿÿCCCÿbbbÿÿÿÿÿÿ¬¬¬ÿCCCÿÿÿ444ÿêêêÿvvvÿÿ‘ÁÂÿ¬¬¬ÿÖÖÖÿÿÿÿM% ÿRÿÿÿÿÿÿK ÿM% ÿÿÿÿÿÿÿbbbÿCCCÿÿCCCÿÿÿÿÿÿÿCCCÿbbbÿÿÿÿÿÿÿÿÿÿÿÿÿbbbÿÿÿêêêÿ444ÿÿÖÖÖÿÖÖÖÿÿÃvä IDAT€ÿM% ÿRÿÿÿÿÿÿÿÿÿèèèÿèèèÿèèè‡O5ÿy±Ë$$$ÿ)×þÿ)×þÿ)Ëòó5 ×þÿ)è×ÿ)è×ÿ)è×ÿôôô ðóõ5 Ëòó5 Áèé?Ëòó5 ôËó 5 ôËó 5 ôËó òñçòñçòñ×þÿ)çñØç(ñØç(ñØç(ððð÷è ã÷è ã)Ëòó5 ×þÿ)è×ÿ)èÎ2ä×ÿôôôýñæýñæ5 Áèé?Ëòó5 ôËó 5 ôÈ ý8óËó üÛå%üÛå%òñ×þÿ)çñØç(ñØã*Öýç(ððð)×þÿ)ÿç×þÿ)ëèá×þÿ)ÿçËó 3ôñÍ 3ôñÍ  ðóõ3ôñÍ 3ôñÍ 3ôñÍ  ð,òñ0ìÐýçòñÿççòñÿççòñÿçìíýþíýþôëèáëèá èæá èæíýþòþþòþÿòþÿÛ3ôñÍ 3ôñÍ %òðÍ %òðòþÿ? Ñüý/Ñûä/Ñüý/Ñüý/Ñüýëèá/ÑüýöööÿÿöööCCCÿbbbÿ¬¬¬ÿ¬¬¬ÿbbbÿÿò‰'ÿÿÿÚqöööÿbbbÿbbbÿÿ444ÿM% ÿM% ÿM% ÿM% ÿÿ¼ˆXÿ‰…VÿŽ“ÿ(@;x«¸ÿúíÿÊSÿÿÿÊSÿ)èØýã)è×þÿ)×þÿ5 ô×þÿ×ÿ)è×ÿ)è×ÿ5 ôóõ5 ôËòó5 ËòóúËòó íìËó ðËó 5 ôËó ñØ×þÿñØçòñç)èçç(ñØç(ñØç()è âü)è ã÷è×þÿ5 ôØýãØþü)è×ÿ2ä×ÿ5 ôæ5 ôæýñËòóúËòóö îËó ðËó 8óËó ñØôÕñØå%üÛç)èÎçç(ñØç(Öýç()/×þÿ)ÿç)×þÿá)ëè5 Í Í  ðóõ3ôñÍ 3ôñÍ 3ôñÍ 3ôñóõòñ/Ðýçòñÿç0ìÿçòñç0òñ0ìáÿíýþ0ìáëèá èæôíýþëèÿçôíýþÚÿòþÿ/5 ôÍ 3ôñÍ %òðèòþÿ3ôñ ðÛòþÿÑüý0ìÑüý00ìÑüý/ÑüýÿçëèÑüý0ìáëèÑüý/ÿÿM% ÿM% ÿÿöööÿÿöööCCCÿËË˶¶¶ÊÊÊÿÿCCCÿÊÊʶ¶¶ÿCCCÿ OÿB„(³/ÿÿÿ+++›ÿ…çBèõ7%%%·V.ÿ%%%ÿ444ÿ%#ÿCCCÿK ÿÿ!ÿ4- CCCÿM% ÿRÿ%#ÿCCCÿK ÿÿ!ÿ4- CCCÿM% ÿRÿCCCÿCCCÿÿÿbbbÿS*ÿ¼ˆXÿS*ÿK ÿK ÿK ÿS*ÿ¼ˆXÿS*ÿCCCÿCCCÿbbbÿbbbÿCCCÿvvvÿ¼ˆXÿ¼ˆXÿ444ÿÍýþ÷ÏýCCCÿbbbÿbbbÿCCCÿÿÿbbbÿCCCÿvvvÿ£¢žØÀňUH27D;ÑŽ$×°)(ÜÕvÿØþü(×ÿ)èÿç)×ÿ)è)è×ÿ)èËó )èØþü5 ôËó 5 ôËòó5 óõ íì5 ôóõ5 ôÁé5 ô×ÿ)èç(ñØ+òñç(ñØñØç(ñØ×ÿñØØþüö×ÿ)è2ä)Îÿ÷èÿ÷è×ÿ)èËó )èØþüýñËó 5 ôæ5 ðòÿìýñóõ5 ôÁé5 ô×ÿ +ëç(ñØ#òñã*ó(üÛüÛç(ñØ×ÿñØÑüý×þÿ)0ì×þÿHíé×þÿ0ìá3ôñËòó3ôñ5 ôóõ3ôñÍ 3ôñÍ 3ôñÍ 5 ôÍ 3ôñ0ìÑüýçòñ0ì0ì· #j1ñØÐýç0ìÐýìíýþíýþïèü èæáëèô éÿáì èæ$íýþ&éòþÿÑùûì%òðÍ 3ôñÛçÍ &é%òð/òþÿ0ìÐý/ÐýÿçÑüý/ìá/Ðý0ìá0ìÑüýM% ÿS*ÿööööööÁéÁ鬬¬ÿS*ÿ555555555TTTÿÿËËË ^^^ÍÍÍ ®®®^^^ËËËÿCCCÿ Oÿ!ßæÿ¿š÷ááá[ß÷òÿAßæÿ!bbbÿÿÛÛÛ‡‡‡ÿÿ;3ùÿÖÖÖÿÛÛÛÿÿ+++ðððfff444ÿÿÿ&éáááËó Úÿ5 ô*Âñ-DDDØþüÌÓöCCCÿ&é_‡ Úÿ5 ô*Âñ-DDDØþüáLáááÿCCCÿ ÿÿ:::444ÿÿÅËÒÌÒâ6G!Öùû6G!ÌÒâÅËÒÿvvvÿ333>çëÄÃëÄÃ>çFâvvvÿ¬¬¬ÿÿCCCÿCCCÿCCCÿ¬¬¬ÿvvvÿÿx¬ÜºîUQ"ÍÒÒ333444ÿbbbÿáááiii ÿÿ:::666bbbÿ£\u1 IDAT]^b(@;æ8Îɼю$ÿ GR/rÜ@j:Fëõ¹®ÊSÿ(×ÿÿä×ÿËòó)è×ÿ)è×ÿ)è×ÿ )è×ÿ(Ëó ðËó ðÁèé, óõ ðËó 5 ôËó 5 ôËó )ç(ñïÔç(úÔä×þÿñØç(ñØç(ñØç(ñØç(ö ãÿä×ÿËòó ã)è ã÷è ã)è×ÿ ÷è×ÿðæ ðËó ðÁèéæCæýñæ5 ôËó ýñËó +ëå%ñïÔç(úÔä×þÿå%ñØå%üÛå%ñØç(üÛç(×þÿ)0ìÐýÿç)ÿç0ìáÿç)ÐüûÿçÿçÍ 3ôñÍ 5 ôËó ÚÿÚÿ5 ôÍ  ðØþü ðÚÿÐýçòñ0ìÐýÐüûòñ–Ïñ0ìÿçòñÐüûÿçÿçíýþôíýþô$ëèá èæôá èæáÜåúôòþÿèòþÿèßûü/3ôñÍ %òðèÍ %òðÍ ÑùûèïèüÑüýÿç:- 0/ÑüýáëèÑüýÐý/Ðýö7á8sE=þû=þû¡y`¤ÐÞCCCÿööö áááDDDáááTTTööö^^^^^^˜˜˜ËËËJJJoooÂÂÂôôô˜˜˜RRRJJJ½½½¿ßæÿ¿Áèéccc¿"󬬬 žžž‡‡‡yyyäM¯yyy888¶¶¶èèèÿÿ+++ÕÕÕááá<<<fffÿ'èå óõç(ø7:iii­­­&é4- ÿÕÕÕVYÉÆxxx=?Zç(ø7:iii­­­&éÂÂÂ>>>ÿ+++ÿ—ÅîÌÓû4.;5., ;5.ocLÌÓû»äS*ÿìììììì×þÿ×þÿºîìììS*ÿbbbÿ———”””ááááááiii¶¶¶vvvÿŠŠŠäääÍÍÍ÷Ïý¤p@Ä¡Ïììì¶¶¶ÍÍÍŸ`])è5 ôûÔÓÍÍÍ———žžžbbbÿCCCÿbbbÿmmmÿùÀ¢B"ÝÛ‰mmmÿFŒ î~§×°)Å»Fºtô GRgÞ×þÿ)èÿ)è×ÿ5 ô)Ëó )èËó ×ÿ)èËòó5 ôóõ5 ôóõ?þ5 Ôàø( ðÁé íìËó 5 ôçñØ,ñØç()èòñ×ÿ,ñØ×ÿç(ñØ ã)èÿ +ë×ÿ 7ö)Ëó 2å)èËó ÷è ã÷èæ5 ôóõ)ôóõ?þ5 Áþú8ô ðÁéýñæýñå%ñØ,+Oùç( +ëòñ×ÿ#ñØ×ÿüÛå%üÛ)×þÿÐý.îê×þÿ0ìÐüûëèÍ 3ôñËó Aöóóõ5 ôóõØþüóõ3ôñóõ&éÿçòñçÐý0ìç0ìÐüû0ì0ôìïèüá èæô éÿëè$ èæáè&é!ßûüÍ %òðÛç3ôñ/%òðÍ óõáëè//ÆÓöÑüýëèá0ì0ìÑüý/ âɶ¶¶ÌÒâ6G!_‡ éë âÉÿ¼¼¼iiiááá ÿ˜˜˜RRR¢¢¢¶¶¶­­­ôôôööö˜˜˜>>>¶¶¶¿òÿA=úêêêÛÛÛüäÿ?ËËËòÿAèèèÿÿ‡‡‡á€X‡‡‡ öööÿ+++ÕÕÕ ŒŒŒ<<<...ÿ4- Í >>> ¶¶¶¶¶¶xxxäÑòöööJJJJJJÍ ¶¶¶xxxxxxÃÆÆÆáááËËËáááááá ÜÜÜèèèÿçÌÓû‘žÍocLÅËÒ‘žÍÿç ÿ»ä¬¬¬ñÈõ#L>>>]/;5.Fâ¶¶¶­Öÿááá¶¶¶ˆˆˆRRR¶¶¶ááá666bbbÿöööÃïð‘žÍ+öñÈ$$$¬¬¬ ãâ_‡ ”””_‡ ÿçÉÆéª§ÕÕÕCCCÿbbbÿ¶¶¶bbbÿiiižžž!"&(@;ØÀÅn\—éæÐMÇ@j;EºFŒ ;EºÏÏÏ)Øþü)×ÿ)è×ÿÿç )è×þÿ×ÿ )è)è×ÿ ðØþü5 Ëó 5 ôËó ÿç÷5 ôËòóüâü 5 ô÷ ðËó òñ×ÿòñç(ñØç(ÿçñØáã ç(ñØñØç()Øþü÷èôÕ)èÕÿç )è×þÿÎ )è ã)è ã ðØþüýñý× 5 ôËó ÿç õ5 ôËòóð 5 ôæ ðæòñ×ÿüÛÕ±ñØå%ÿçñØáã ç( +ëñØå%ñØå%×þÿ)ñýþ'èå×þÿÐý0ìëè0ìÍ òþþðîËó 5 ô&é3ôñóõ5 ôÍ 0çòññØçÐý0ìç0ì4,ñÐý éÿ éÿáÿáÿÜåú èæô èæ$áÿÜåúôëèáÿëèççÚÿÚÿÑùû!%òðÛ%òð/ÚÿÑùûÛ3ôñÚÿ3ôñëèáÑüýðçåÐýÿëèá/ÐýÐý0ìÑüý/S*ÿÁéööö=VÌÒâ=þû=VuYX=VM% ÿèèè öööñññááá>>> ˜˜˜ööö555ððð 555 ¶¶¶èèè n|Ùµöò+n?ÈÆ-³ç*¿òÿA|ÙM&%ÿòòòW¸à TTTèèèèèèÕÕÕ ááá^^^¬¬¬ÚÚÚÿ3ôñÌÓö¶¶¶ˆˆˆYYYiiiááábbb&ésDÿÿ———öööôôôˆˆˆYYYiii>>>bbbxxxiiiÿááááááðððñññäääèèèèèèËó 4-ÅËÒ4-Áéèèèèèè ìììñÈõ#L¦Ú èèèÿ+++¬¬¬JJJÊÊÊ666JJJËË˶¶¶ááávvvÿèèè <=.åÌÓûÿþæä<=ÊÊÊ———ÊÊÊ_‡ Í èèèQQÿ^„Uÿ âɶ¶¶èèèM% ÿëê———ÿ0ÿßÞÚØÀÅ›¢=(éæÐéæÐéæÐéæÐéæÐ×þÿÿ×þÿ)è×ÿ)è×ÿ)è×ÿ)è×ÿ)è×ÿóõóõÔßß5 ôËó ðËó íìËó ð÷Ëó 5 ôóõççñØç(ñØç(ñØç(ñØðððç(ñØç(×þÿ âü÷è×ÿ÷è×ÿ)èÎ)è ã×ÿ)è×ÿ÷èóõóõõåûýñËó ýñËó ö îÈ ý ðæËó 5 ôóõýñçå%üÛç(üÛç(ñØç(üÛðððå%ÎñØç(üÛëè)×þÿ.îêßûü0)ÐüûáÐøú.îêÐýëè3ôñAöóåüý)ØþüÍ 3ôñÍ ×úûAöóËó 3ôñÐüûòñç0ìÐüû0òñÐüûIõÝÐýÐüû0ìÌÔÿç0 éÿôÜåúô èæÐý éÿô èæìáGîçÛÑùûÛ%òð¬ çè%òð!&éÍ á//áëèÑüýëèá/Ñüýëè:- 0ìÑüýM% ÿ=V¬¬¬÷öí ööö?þ4.­Öÿööö555áááôôô+++ËËË èèèÿööö555DDDÛÛÛáááËËË èèèÿöööòö *þòÍn’äæ èèè|*(ÿ„ã' ÉöööòÿA|Ù„ÖØÿööö èèèÿ ð&éà +++áááÕÕÕ ð&éÍ èèèÿ+++¬¬¬ +++ááá>>>¶¶¶öööTTT¶¶¶èèèÿ555ðððñññËËË èèèÿ5 ô4.ÌÓûÿçÁé èèèÿööösEá8ñÈá8¶¶¶èèèÿJJJ¬¬¬hhhÍÍÍJJJbbb ”””TTTÿ...Z&öÅËÒÑÿ(ûÔÓ4-á8¶¶¶èèèÿ555666ÊÊʘ˜˜ èèè¡ß¤ IDAT444ÿ5Œ*)xxxžžžRÿ¼ø èèèRÿÌÓöËó èèè0ÿéæÐ‡O5æ8!"&ßÞÚª­ÃéæÐ$$$ÿ)×þÿÿä(×ÿ)ÿçØþüÿ)è×ÿôôô5 Ëòó ð(Ëó 5 Ëòó ð(Øþüóõ ðóõòñçñïÔ(ç(òñ+úÔä,ÒÒà,ñØç(ñïÔö ãÿä(Øþü ,ôÕý+ê,ÖþÎ2äØþüÿ)è×ÿôôôýñæ ð(Ëó )ôý× )ôý× ýñ8óØþüóõ ðóõüÛëòý âü(ç(üÛå%òñ]î¢ßã*õÔù,ñØç(òñ×þÿ)ëèá×þÿ)ëè¸).îêÒËòó3ôñÍ 3ôñÍ 3ôñÍ 3ôñÍ Aöó¿ 5 çòñ4,ñÌÓöÿçç(òñ0ì· #òñ0ìÐýçòñëèá èæíýþíýþô éÿáÿ éÿÐüûþçýÍ %òðòþÿòþÿèçÚÿç!¹ûX Ðý/Ñüý/Ñüýëèá0ìïèüá0ìÐýS*ÿÌÒâÁé 5 ôþçýø7: âÉËó èèèÿ+++333®®®áááÕÕÕèèèÿöööêêêêêêôôôèèèÿööö ööö555%%%OOOŒŒŒáááËËËòòò·V.ÿI·! Éèèèÿd;,aÂêèèèÿèèèÿ5 ôËó ööö èèèÿ5 ô³Ûôÿ5 ôËó êêêêêê 5 ô³Ûôÿöööêêê öööòòòÿ íìí ÷öí èèèÿ ôôôèèèÿööö555iii———ÕÕÕèèèÿ:::$$$ìììáááåúÕý4-³á ÌÌÌÿöööêêê öööòòòÿ&&&...¶¶¶èèèRÿÌÓöÁé èèèCCCÿ>Ó¼ø èèè0ÿ3ÝÍé#éæÐÿM&%ÿØýã(×ÿôôô5 ×þÿ)è×ÿ)×þÿ)è×ÿ)è×ÿ)Øýã(Ëó íì,!!Ëòó ðóõ5 Ëòó5 ôËó 5 ôËó 5 ×þÿ)èç(ððð)çñØç(òñçñØç(ñØç(ç Ø âüö ãôôô5 ×þÿ)è×ÿ)×þÿ÷è ã)è×ÿ÷èúñýñÿðæòÿìC!Ëòó ðóõ5 Ëòóýñæ5 ôËó ýñ ã +ëå%ððð)çñØç(òñçñØã*Öýç(üÛôÕ)×þÿ)ÿçÿçìÐýþæäÍ  ðóõ ð&éËó 3ôñÍ òñ0ì· #IõÝÐüûÿç0Ðýçòñ0ìÜåúá0ìÐüûìíýþÜåúáÿçìÑùûÍ Tùõ¹û&éòþÿ!ÑùûÍ  ð&élJ–Ð 0ìÐý/Ñüý/Ñüý0ì:- –Ð /Ñüýëèÿ i;ÂðËËË?þ=V¶¶¶èèèÿööö&&&ñññäääöööòòòÿööö öööòòòÿŸ>;3ùŠ¡„ã'$ÕÜé+¿òÿA Édv_ÿwÙÿèèèÿèèèÿ ööö555âàÅéëú‡‰¤———½½½ÿöööòòòÿ÷öí 555áááiiibbb÷öí òòòÿäää ôôôèèèM% ÿ4.ÌÒâ4.;5.ÅËÒ—Åîèèèÿi;õ#LìììžžžÿöööTTTJJJ———ÕÕÕ+++½½½444ÿBBBFâºîÜÜÜááá>çÂð½½½ÿ5 ôÁé?þþçýÍ èèèÿöööòòòRÿÌÓöocL\ÀèèèCCCÿëêö7ÕÕÕèèè0ÿéæÐ¯pÿQqˆNÂã÷¶Ïó$$$ÿ)è×ÿ)è×ÿ)è×ÿ)è×ÿ)Ëòó5 ô×ÿ)è×ÿôôô5 ôËó ðóõ5 ôËó 5 ôËó 5 Ôßß, Ëó 5 ôËó ñØç(ñØç(ñØç(ñØç(òñ×þÿ)èç(ñØç(ððð)è×ÿ)èØþüÿ)èÎ2ä×ÿ)Ëòó5 ô×ÿ)è×ÿôôô5 ôËó ðóõ5 ôÈ ý8óËó 5 ½ñßCËó 5 ôËó ñØç(ñØç(ñØã*Öýç(òñ×þÿ)èç(ñØç(òñ/Ñüý×þÿ)0ìïèüáÿç×þÿ)Ëòó5 Ëòó3ôñÍ 5 ôþçýÍ  ðóõ3ôñÍ 3ôñÍ 5 /ÿéÐýçòñ0ìÐýÿçj0ö–Ð çòñ èæô0ìïèüíýþíýþô èæá0ìÜåúôðåüÛTùõßûüòþÿòþÿÛ%òðÍ TùõÑùûè(ëèKEÆÓöÐý/ðçåá0ìÐý/ÑüýÿJJJñÈ»ä?þ³Ûôÿ ôôôèèèÿ ööö ööö èèèÿööö?Áèé?j0 –Ð÷Áèé?Áèé èèèÿööö)èÁé?þØþü‡‰¤———ÕÕÕèèèÿöööˆˆˆxxx>>>ÂÂÂêêê èèèÿ:::ñññááážžžS*ÿ;5.ÅËÒÌÒâ4.;5.‘´³ÛôvvvÿìììñÈ»äTTTZ&öDx¨ÿ”””¶¶¶JJJTTTÿ:::ìììZ&ö¦Ú ðððÿÖúÕý)PQŠŠŠbbbÿÕ–“<=ááá½½½ÿ5 ôzšQYîèèèCCCÿyE‘´=V¶¶¶èèè0ÿéæÐ¯pÿ&##ùÝýÚÝý´œðô$$$ÿ)è×ÿ)×þÿ)è×ÿ)è×ÿôôô5 ôËó 5 Ëòó ðóõ ðóõñØç(òñçñØç(ñØç(ððð)è×ÿ)×þÿ)è×ÿ÷è ãÿäö ãôôô5 ôËó 5 Ëòó ðóõýñæýñæñØç(òñçñØç(üÛå%üÛå%òñ×þÿ)0ìÐý0ìïèüá0ìÐý×þÿôôô5 ôËó 5 ôþçýÍ 3ôñÍ 3ôñËó 3ôñ0ìÐýçòñ0ìÐý4,ñÌÓö0ìÐý0ìÐýç8ÝÙíýþô èæíýþô éÿô éÿ$ÜåúíýþíýþòþþòþÿÛ%òðòþÿèçèç/Ñùûòþÿòþÿ? Ñüý/Ñüýëèá0ìÐý0ìÐý/Ñüýèèèèè謬¬ÌÒâÁéÁéÿöööôôôÿòòòöööèèèööö/?ÁèéW¸àÁèé?Áèéöööèèèèèèèèè ÁéÁé(ˆˆˆiiièèè ¶¶¶ÂÂÂñññááá333ðððCCCÿS*ÿ;5.ÌÒâÁéÌÒâÁéÿÿ Ý´»äñÈ¦Ú èèè¶¶¶JJJ¶¶¶bbb¶¶¶bbbÿðððÜÜÜ¦Ú ððð.öCCCÿJJJìììÃiiibœ” IDATËó º“ìèèèÕÕÕ\À=V¶¶¶èèèéæÐ¯pÿÕ²sÿÜÕvÿ-F#ÓºúÚÝýØÀÅLdðô0)ÿä×ÿôôôÿä×þÿ)×ÿ)è)è×ÿ)è5 ðËó íì ðËòó5 óõ5 ô5 ôóõ5 ôòññïÔ,ðððñïÔçòñç(ñØñØç(ñØ÷èÿä×ÿôôôÿä×þÿ)Øþü)è ãÿä)è ã)èýñ ðËó ö î ðËòó5 óõ5 ôæ5 ôæ5 ôüÛñïÔ,ðððñïÔçòñç(ñØå%ñØå%ñØ×þÿ0ì)Ðý×þÿÐýÿç×þÿÐý×þÿ)3ôñ5 ôËó 3ôñËó  ðÍ 3ôñÍ Ëó 3ôñÍ çÐý0ìòñ0ìÐýçÌÔ0ÿçÐýçÐýçòñíýþÿçíýþô éÿ éÿôÜåúíýþíýþôòþÿ ðòþÿÛççÛÑùûòþÿòþÿÛÑüý/ÿçÑûäá/ëèÐý0ìÐý/Ñüýëèÿööö èèèÿööö èèèÿ >>>¶¶¶èèèbbbÿÂÂÂôôôèèèÿd;,”¸÷Ãén;,ÅÔú’äæ=lH ;3ùwÙCCCÿ âÉÁé ooo­­­ÌÌÌCCCÿJJJbbbTTT%%%‘‘‘èèèCCCÿááááááððð®®®ÿööö èèèÿööö èèèÿöööTTT¬¬¬òòò€TSÿ<4ÄÌû<4ÄÌûö"#ÜÜÜ/ØÑÿ(ñÈÑÿ(®®®K ÿÁé=þû³Ûôÿèèèÿ+++½½½ˆNÿÂã÷‹f#ÓºúQq0éæÐ$$$ÿ)è×ÿÿäÿ)è×ÿ)è×ÿ)è×ÿôôô5 ôËó ðóõ5 ôËó 5 ôËó 5 ôÔàø÷ñØç(ðððñØç(ñØç(ñØç(ððð +ëôÕÿäÿÿä(×ÿÿä(×ÿ)è×ÿ÷èý× ýñæ ðóõ5 ôËó 5 ôËó 5 ô½òøýñ+üÛå%ðððñØç(ñØç(ñØç(üÛ××þÿ)×þÿ)ÿç0ìÐý0ìÐý×þÿôôô3ôñÍ 3ôñÍ  ðóõ5 ôËó 5 ôËó 3ôñ2Ðýçòñçòñÿç0ìÐý0ìÐýçòñ èæô éÿáÿ éÿíýþô èæ$ÜåúôËòó%òð/¹ûçÚÿçòþÿÛ%òð/ÑùûèóõTùõáëèáÿ/Ñüý/Ñüýëèá/ÑüýëèáÿèèèÿèèèÿèèèÿJJJ¶¶¶èèèÿJJJ¶¶¶èèèÿööö ööö ööö èèèÿ+++ËËË èèèCCCÿÕÕÕèèèÿ+++ËËË èèèÿööö555áááËËË èèèÿööö èèèÿèèèÿèèèÿèèèÿööö èèèÿL <4Íýþ3ºîÜÜÜñññ½½½ÿööö=þûà ööö èèèÿèèèJ1 ÿßÿðô0éæÐM% ÿ×ÿ)×þÿ)è×ÿÿäÿ)è×ÿÿäÿÿäóõ5 Ëòó5 ôËó íì÷ ðüâü÷ ðóõ ðóõ ð(ç(òñçñØç(ðððñïÔ,ñØç(ðððððð)è×ÿ)×þÿ÷è ãÿäÿ +ëôÕÿäÿÿäóõ5 Ëòóýñæö î õ ðéþ õ)ôý× ðóõ ð(ç(òñçüÛå%ðððñïÔ,+OùÕ±ðððððð)×þÿ)ëèáÿçëèáËòó3ôñÍ  ðóõ3ôñÍ 3ôñÍ 5 çƒ"çÆÓöÐýÿç0Ðý0ìÐý0ìÐý èæÜåúô èæáÿ éÿô èæ$ÜåúôëèáðäãðåüÛ%òðÚÿçÛ%òð/ÑùûÛ3ôñÍ 5 0ì:- –Ïñìá/Ñüýëèá/Ñüý0ìÐýÿèèèÿèèèÿèèèÿèèèÿööönœîðd’äæòòòÿèèèÿèèèÿèèèÿööö èèèÿèèèÿèèèÿèèèÿööö&&&ˆT$Íýþíñ Fâx¬ÜÌÌÌÿööö èèèÿèèèÿ0éæÐÿ5 ×þÿ)è×ÿ)è×ÿÿäÿ)è×ÿ)è×ÿÿäÿêêê?Ëòó ðóõ ðóõ ðóõ ðóõ5 ôËó ðóõ )çñØç(ñØç(ñïÔ,ñØç(ñØç(ðððäää5 ×þÿ÷è ã)è×ÿÿäÿ)è×ÿ)è×ÿÿäÿêêê?Ëòóýñæ ðóõ ðóõ ðóõ5 ôËó ðóõ )çüÛå%ñØç(ñïÔ,ñØç(ñØç(ðððòñ0ìÐý/Ñûä×þÿ)ëèá×þÿôôô5 ôËó 5 Øýãóõ3ôñÍ 3ôñÍ 3ôñÍ 5 0ìÐý/Ñûäçòñ0ìÐýçòñçñØ éÿá èæô èæáÿ éÿíýþôëèáëè¹ûçÍ %òðÛ%òðÚÿçòþÿÛ3ôñÍ 3ôñ!á0ìÐýÿç/ÑüýëèÑüý/Ñüý/ÿd;,ÅÔúœîðd;,ÅÔú„ÖØÿèèèÿèèèÿL ö"#ŠŠŠÿèèèz5·Ü IDAT€ÿM% ÿ×ÿ)è×ÿ)è×ÿ)è×ÿ)èËó íì÷5 ôËó 5 ôËó 5 ôËó íì÷5 ôç(ñØç(ðððñØç(ñØç(ñØ×ÿ)è×ÿÿäÿÿä(×ÿ)è×ÿ)èËó íì÷5 ôËó 5 ôËó 5 ôËó ö î õ5 ôç(ñØç(ðððñØç(ñØç(IõÝÐýÿçÿç×ÿ)×þÿ)×þÿ)ÿçËó ðóõ ðóõ3ôñÍ 3ôñÍ 3ôñ2Ðýÿçÿçç(òñçòñçòñçòñ èæô èæíýþáÿ éÿô èæôëèíýþáðäãèóõ%òðòþÿÚÿçÛ%òðÛ3ôñòþÿÍ 5 ëèá/Ñüý/Ñüýëèá/Ñüý/ÑüýRÿÿRÿÿCCCÿ444ÿ444ÿ444ÿ444ÿCCCÿ444ÿM% ÿM% ÿ-QQÿ€TSÿ€TSÿÿÿK ÿÿM% ÿM% ÿ®êÿTPÿFB®êÿòòòÿÿÿÿñññMöCCCÿ444ÿ444ÿððð444ÿMöñññ444ÿððð444ÿvvvÿÿÿ%#ÿÿS*ÿS*ÿRÿRÿ³ÛôCCCÿ444ÿ5FGâ+++-QQÿšššÿ!'PÿM% ÿ!ÿÿ!ÿÿ3ôñM% ÿÿ5 ôããúj1"M% ÿÿòòòÄȬ°îÿÿòòòÿÿòòò ÿ Aÿÿÿÿÿ Aÿÿòòò444ÿððð³á zDïMö]/Mö>çMöððð444ÿ¢¢¢vvvÿ ÿ Oÿÿèèèÿÿÿ%#ÿM% ÿ%#ÿM% ÿ%#ÿ%#ÿ%#ÿ ðèèèÿ»äÿÿÿ»äCCCÿ³ÛôʺóRÿM% ÿM% ÿM% ÿ®êCCCÿA...ÂÂÂÈÈÈÂÂÂ13CCCÿM&%ÿM&%ÿâŽ!'Pÿßæÿÿ5 ôþçýµô÷K ÿþçýåüýñýþ, 4.ÌÒâ³ÛôTPÿ¬°îÿòòòÿòòòÿòòòTPÿ¬°îÿòòòÿ ööö èèèÿöööòû$!íç¾òòò444ÿ>çEm2÷ÇÖÄÌøÂðzD>ç³á ñññÌÌÌÿ^^^666———Ùè@3*±«|+ƒÿäÕ} Oÿ󱡗sË IDATÿòòòÿòòò%#ÿ(Øþü/- 64 ÊÌõùÕú+ùÕú½òøöéüÿ?þÁéòòòÿöööòòòvvvÿŠŠŠM% ÿþçýþçýµô÷ÿ5 ô4- ʺóµô÷444ÿ...òñ6äCE溹âü"óÖ°ßÌÌÌM&%ÿ³ÚÛM&%ÿ³ÚÛM&%ÿ³ÚÛ|*(ÿ„ÖØbbbÿžžž!'PÿßÙ°!'PÿßÙ° Oÿó±M% ÿ³Ûô3ôñÔàølJ})ÿ{ÿµô÷åüýÐþZ ããúÌÒâÌÒâÔàø{ÿÄÈÿòòòRÿFBÿFB¬°îòòò èèèèèèÜÍßââòòòòòò444ÿ>çÂð»“Î 9*<4>çzDïÄÌøzDïÂð>çèè袢¢¶¶¶ÕÕÕF7ß ±ÍÖÿOU„ÿäÕ}+ƒÿ+ƒÿó± ÿòòò%#ÿ(+(ùÕúÊÌõùÕú¶ÇòØþüÿ ÿÿ Áé4. ÿööö444ÿ666CCCÿTPÿ0Oÿ%#ÿ+ƒÿ³Ûôþçý6F RÿM% ÿ5 ôþçý ³îµô÷444ÿ...888òñâäCERÁ¾½»V‚ƒòñÏÍü...444ÿ³ÚÛM&%ÿ/M&%ÿ³ÚÛM&%ÿ!'Pÿ!'Pÿ!'Pÿbbbÿ|*(ÿvvvÿúLNCCCÿÈÆ!ÿK ÿßÙ°!'Pÿßæÿ 2ÿüãó±M% ÿ4- þçýM% ÿM% ÿµô÷`N&Iªåƒ×ï})ÿ})ÿ…ìñþçýŒ€R{ì…òK ³áÒýèèèòòòÿÓþüº¾üòòò¬°îÿÿÿ...òòò©H ÿÿ©H ?þòòò·MéÿÌÌÌMöÂð>ç<4÷ÇÖ 9*Em2<4 9*zDï>çÂð>çkáááJJJ3*ÍÖÿOU„ÿ+ƒÿ Oÿ3*èèèÿ<8úM% ÿM% ÿ%#ÿ(+ùÕúØþüùÕúØþüØþü åôüèèèòòò ÿ ÿ2 ÿ÷ òòòèèèòòòòòò»äöööòòò òòòÌÌÌÊÊÊ ÿ¶ÇòõÔù/- ÿM% ÿ{ÿK ÿM% ÿ})ÿM% ÿÿ+ƒÿ+ƒÿOU„ÿ3*+ƒÿOU„ÿOU„ÿ+ƒÿS*ÿµô÷ÌÓöÌÓöÔàøþçý, ...tttÈÈȘÄŶ¶¶ÈÈÈ®?B½» ª~}âããü"ó...Rÿþæäq0ùþæäM&%ÿ³ÚÛ!'Pÿ!'Pÿšššÿ"óysJA;CCCÿ!'Pÿžžž„ÖØ|*(ÿÕ˜¯ ÞÝ333|*(ÿ„ÖØí ÿ!ÿK ÿµô÷!'Pÿ!'PÿOU„ÿßæÿ 2ÿó±÷Î OÿM% ÿÌÓöþçý4- M% ÿ·Vÿ­ÖËòóþëþ})ÿ¤ÜóM% ÿM% ÿÍ ûÎÖ? …ò{ìÔàøß4.ÿTPÿèèèÿ¬°îsDÿÿòòòÿK ÿÿÌÌ̃"çžžžIªåÿööö?þaÂý?þ³Ûô–Ïñÿ 8CCCÿÂð>çÄÌø 9*÷ÇÖ9=k 9* 9*÷ÇÖÂð>ç³á äÕ} Aááá¾¾¾!P±¸Ëä׊±¯“äâÌäÕ} Oÿ¿ Þ Oÿ ÿK ÿ?þ÷¼÷%#ÿTPÿÁéM% ÿÿùÕúØþüåôüØþüØþü(åôüÿ ÿ ÿå(Aõõåûòòò2 ÿòòòÿÿòòòòòòèèèÍÍÍw<&C(ºÓô&8 M% ÿS*ÿK ÿÐøúÖùû0Ðüû05 ôM% ÿ})ÿOU„ÿZKóKE'!ò3*ÍÖÿ3*+ƒÿS*ÿS*ÿ444ÿM% ÿM% ÿCCCÿpa³Ûô³Ûôßûü6F þçýM% ÿ…‚¶¶¶æº¹ª~}â¶¶¶äää"Ðþ®êRÿÿç^²è³ÚÛK ÿ!'PÿßÙ°!'PÿUO&ÈÈÈWWW©©©¿Åî½½½ßÙ°„ÖØvvvÿ5F.€¬­„ÖØbbbÿCCCÿoÑ„#2ÿÿbbbÿ!'Pÿ..4±¸Ëüã÷Î Oÿó±ó±þçýÉß÷Éß÷þçýþçýÌÓö4- M% ÿIªåèèè¦ñõÎãø*S*ÿbbbÿšššÿM% ÿS*ÿM% ÿK ÿÿÿM% ÿËó ¤p@2*¯µÜëê!ÿáÐøú!ÿá;5.¼ˆXÿòòò¬°îÿòòòÿ¼øòòòòòòRÿÿ?þ2S*ÿöööbbbÿÌÌÌ–Ïñèèè ³Ûôèèè³Ûô³Ûôÿ 2ÿÿüé÷Èÿñññ>ç<4<4<4÷ÇÖ 9*9=k 9*>ç<4Mö>çTPÿTPÿŠ„ÿTPÿ±«|Ùè@!P±¸Ë4 B Oÿó±òòòž«íOH5ß2Ý' IDAT 2ÿþó³ÛôÍ (ÑÓöTPÿM% ÿM% ÿM% ÿ!ÿØþüsE ð(ØþüûöþåôüØþüåôüîöéü ÷ ûöþa×ëÃûöþ ÿæÿÿòòòöööòòòòòòÿòòò½½½Õ–“M% ÿS*ÿÌÒâÁþúüôþõÔùÁþúM% ÿ})ÿüÖçØþüÖùûÎãø0ÐüûþçýØþüÐüûM% ÿOU„ÿF7ß$$$PPP```'!ò3*ÍÖÿäÕ}S*ÿ¼ˆXÿ;5.S*ÿ|*(ÿû×þ‚#!á8S*ÿ4.M% ÿS*ÿM% ÿM% ÿS*ÿCzÞRÿµô÷<4 µô÷þçýM% ÿÊüýèèèèèèÒÒÒÃïðìîÃïðÒÒÒFGòñ®êþçýÖùûÚÿK ÿµô÷ßÙ°!'PÿUO&«±ÚáááÈÈÈÞä ßÙ°!'PÿŠŠŠö"#CCCÿ´²¶¶¶ÿÉÆ‘åý…çÎãøöööÿK ÿöööááá 2ÿ..4ÒÒÌßââ÷È 2ÿó±0ÿåüý7! 4.7! åüýþçýËó ÌÓö4- M% ÿ!ÿßûü6G!µô÷­Öááá"î¾4.ÌÒâ4.3ôñ4.5 ôèèèÅËÒñýþ"úøí Ãí ßûüÅËÒÅËÒ!ÿvvvÿCCCÿÿÿòòòèèèòòòÿ—ÆTPÿòòò³Ûôƒ×ï)è—Åîÿÿÿòòòžžž³Ûôèèèÿüéÿ÷ÎþöüéüéÂðÄÌøÄÌø9=kÇÕ9=k 9*÷ÇÖÂðÄÌøÂð³á ¬°îTPÿŠ„ÿ'ÄýÊÌõM% ÿ¬°îäÕ}ÒÒÌó±äÕ}üéüçÿ Oÿõ¾±¸Ë+ƒÿ Oÿ Oÿ 2ÿ 2ÿ 2ÿ÷Î 2ÿ³Ûô<8ú³Ûôóõ%#ÿ|*(ÿM% ÿþçýØþü, &é­ÖocLÿ(ØþüØþü åôü åôüî÷èèè  Ã÷ÿô ÷ èèèÿèèèòòòÿòòòÿòòò.ï­Ö³Ûô½òøüôþC\0"?Øþü%#ÿM% ÿ})ÿÐüûÎãø&é, *Öùû¨ú÷þçýÚÿ(00ÿOU„ÿ±«|áááÈÈȰ°°666ÍÖÿ3*ÅËÒÅËÒÌÒâS*ÿ„ÖØ„ÖØJ©«žžž³á 4.á84.ÌÒâ4.4.bbbÿS*ÿá8žžž½†"ÿ®êCzÞµô÷³Ûôü"óäCEJJJÕÕÕñññ+++ <<<FG6F Øþü*ÛÝøµô÷!'PÿÍÍÍ333¿ÅîßÙ°´²½½½„ÖØ³/+ÿèèèÖùûÖùû=þû íìÃÕÕÕ Oÿ!±´®ßââûåüã÷Î0ÿèËó q7 ããúþçýðîÌÓößûü­Ö½½½Dx¨ÌÒâ4.Gp4.ø7:;5.4.ÌÒâÅËÒßûüK mm?þK ÿÌÒâ­Ö÷«ŽÞÂÁÿèèèòòòTPÿÿòòòèè謰îþçý5 ô öööS*ÿÿÿÿÿ 2ÿÿþó½½½ÂðÄÌø<4 9*¾Šk¾ŠkÇÕ÷ÇÖÄÌø>çÂðÌÌ̬°îÊÌõÒý¬°î³ÛôßÙ°ó±ó± Oÿ B4äâÌó± 2ÿ ÿ 2ÿó±ùÛ 2ÿ÷Î÷Î÷ÎÿùÕú<8úùÕú&é¶WUÿ|*(ÿ„ÖØþçýÚÿþçýüâüØþü|*(ÿDx¨,(åôüåôü åôüî÷èèèÿ÷ÿô÷ÿô  òòòòòòi;òòòsE³ÛôÐøúS*ÿM% ÿöéü ¸èöÌÒâ¸èöåôüÛÝø³ÛôÐüûÁéþçýØþü*üâüÚÿ&éÐüû5 ô±«| AáááÜÜÜÄÄÄp×3*ÒÒ̼ˆXÿÌÒâÁéÌÒâÌÌÌ­ÖñÈGp=VÌÒâžžžÂðžžžCzÞÞ ÿbbbÿðððññññññ>>>ÄÄÄæº¹ÿK ÿ¤Ñò&éÚÿK ÿK ÿßÙ°ßÙ°333ßÙ°«±Ú"óßÙ°bbbÿ|*(ÿ„ÖØMÑÕšššÿòòòßûüÿ÷öí Öùûí òòòòòòèèèüãßââûåûå÷Î 2ÿ Oÿèèèèèè&ŽâæüýåüýÉß÷åüý4- ³ÛôM% ÿ4.ÌÒâö7>ç—ÅîèèèS*ÿÌÒâþçýØþüÛÝøCCCÿÕÕÕèèèÿèèèÿèèèRÿ®êK ÿ6G!ÌÒâËó 5 ô4.ÌÒâËó èèè Oÿó±CCCÿñññ>çEm2»“Î<4 9*÷ÇÖÄÌøÂðñññÌÌÌ%#ÿ(³ÛôTPÿ¬°î OÿüÚ°OU„ÿ'!òÙß±­‰ Bó± 2ÿùÛ%÷Î ÿ%÷Îÿ5 ô³ÛôM% ÿËó íìßûüK ÿµô÷|*(ÿ„ÖØK ÿ³Ûô!ÿßûüŠ„ÿ›Ÿë/- ÑÓöåôü÷ èèèÿèèèÿööö÷ÿô ÷ èèèM% ÿ³Ûô ÿ³oÀ£ïÎãø¿ ûöéüM% ÿÔàøí =þûØþü&é0Ðüû³ÛôOU„ÿ±«|+ƒÿ3*±«|OU„ÿ±«|S*ÿGp³‹rÁésE­ÖM% ÿ4.³á ÌÌÌS*ÿÌÒâ³ÛôbbbÿòñFG~~~+++=ö"#·ÛÛ÷ÓÓäää‚‚‚½»¬ žžžM% ÿ³ÛôK ÿµô÷!'Pÿ"óÞä ßÙ°ÿöööòòò Oÿüãûå÷Î 2ÿ÷ÎM% ÿËó èèèM% ÿÉß÷³Ûôÿÿ4.ÌÒâÁéËËËi;öööÿÿ·V.ÿÔàøÖùûþçý\0"CCCÿiii^^^èèèÿèèè®êµô÷ÌÒâ³Ûôèèè³ÛôËó ÌÒâ4. íìó±ñññ<4}ƒç<4ÄÌø»“ÎÄÌøÄÌøÂð>çñññÌÌÌ%#ÿTPÿÛÝøÛÝø³ÛôTPÿ¬°îüçÿ ÿ±¸Ë¦µ ±¸Ë Bó±÷Îþó÷Îþó÷Î ÿ^›·¸ IDAT5 ô³Ûô³Ûô5 ô<8ú*!ÿµô÷K ÿ|*(ÿ„ÖØÿkKL/|*(ÿ÷|*(ÿSQ(ÿ„Šñéëåôüåôü÷ ÷ òòòèèèèèèÿööö    èèè³Ûôþçý.ï ÄÌô) Áé³ÛôöõÃ(Í ØþüÐüû³ÛôOU„ÿvvvÿ±«|+ƒÿäÕ}±«|±«|'!ò±«|GptttÁé ­Öbbbÿ4.—Åî...444ÿ­Ö=V4.ÿÿÿÒÒÒâ溹JJJö"#$$$5ôôôðððJJJ¨-ÒÒÒËó ³Ûôµô÷ßÙ°Þä ßÙ°ÿÿÿÿÿèèè÷öüã 8 8÷Î÷Î=VèèèM% ÿããúÐøú)Qj)Qjÿööö èèèÿèèèÿ5 ô4.—Åî5 ôËó èèèM% ÿj1"Êýü—Åîèèèÿ5 ôËó èèèÿòòòÿèèèÿèèè0ÿ³ÛôM% ÿÔàøßûüÿèèèÿööö èèèÿèèèÿööö èèè444ÿMöÂð>çÂð>çÂðzDïÄÌøÂð>çÂðñññ½½½TPÿ¬°î Oÿó± Oÿó± Oÿõ¾)vä׊þóÿ5 ôØþüÛÝøK ÿµô÷ÿööö¨IGX·¹ èèèÿ ööö|v„Šñ èèèÿ ôôôèèèÿèèèÿèèèÿèèèK ÿ³ÛôM% ÿ³Ûô!ÿí ?þ³ÛôÿeùÐüû³ÛôOU„ÿ±«|vvvÿŠŠŠÿèèèÿööö èèèÿööö ööö èèèÿJJJ¬¬¬TTT$$$ÜÜÜììì¶¶¶JJJü"óÞ ¶¶¶èèèÿèèèÿööö èèèÿööö èèèÿööö èèèÿööö ööö=þûµô÷bbbÿŠŠŠM% ÿããúÐøúbbbÿΦ¤FnpŠŠŠÿèèèÿööö èèèÿèèèÿèèèÿ3ôñÁé 5 ôþçýà èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿööö"úøÁé 5 ôÔàø÷èèèÿööö ööö èèèÿööö ööö èèèÿèèèCCCÿñññ>çÂð>çÂð>çÂðññññññÌÌÌÿööö öööòòò Oÿó± Oÿó± Oÿó± Oÿó±ÿööö?þÁé=þûÚÿóõèèèÿèèèÿèèèÿèèèÿ<8ú¬°îÿèèèÿööö ööö èèèÿööösEÌÒâËó ööösEÌÒâÁé èèèÿööö?þÁé?þ³ÛôšššÿfffvvvÿŠŠŠÿèèèÿööö èèèÿJJJÒÒÒÚÚÚ555WWW©©©xFE§ÙÚ888©©©ááá¶¶¶èèèÿ ôôôèèèÿööö èèèÿèèèÿèèèÿèèèÿöööòòòÿööö÷ößûüòŠ6ÿ&Žâi;­Öÿðîèèèèÿööö?þþçýÃ"úøÁé èèèÿèèèÿööö ööö ööö èèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèèÿèèè444ÿÌÌÌCCCÿññññññ>çÂðññññññÌÌÌÿööö èèè&PÿüÚ° Oÿó±ÿööö èèèÿèèèÿèèèÿèèèÿèèèÿ5 ôÁé?þÁé èèèÿööösE;5.‘´Áé®zJÅËÒ;5.‘´Ëó èèèOU„ÿ±«|vvvÿŠŠŠÿèèèÿöööŒŒŒÈÈÈttt^^^¢¢¢^^^...888ttt èèèÿèèèÿèèèÿèèèÿöööòòòÿööösEq7 Éô»ä ööösEq7 &Žâÿööö?þÁé ööö èèèÿèèèÿèèèÿööö èèèÿèèè444ÿÌÌÌCCCÿñññ>çÂð½½½444ÿÌÌÌ444ÿÌÌÌ&PÿüÚ°)îÆ IDAT€ÿÿèèèÿJJJ¶¶¶JJJ¶¶¶‚‚‚ttt JJJ¶¶¶èèèÿèèèÿööö èèèÿèèèÿööö öööòòò!Oÿa¦ ŸZàëòýå¿ô#ÿòÝú0Oÿñÿß±òA ÿ&A ¿~èM% ÿ³Ûô!'Pÿ,ÿÕ³ÚÛM&%ÿÔ+íç¾=CÖþÿßÙ°M&%ÿ³ÚÛÿ555§§§!ÿßûüÿ5 ô³ÛôÿòòòM% ÿ³Ûôÿèèè!'PÿßÙ°·VÿIªå})ÿƒ×ïK ÿµô÷ 2ÿ÷Î Aÿõ¿bbbÿžžžbbbÿžžžbbbÿ888fffšššÿfff!'PÿßÙ°!'PÿßÙ°M&%ÿ³ÚÛ ÿ öéü$$$ÿ333ìììáááÜÜÜââââââÌÌÌbbbÿžžžÿêüýbbbÿðððáááìììððððððááá0Oÿ®Záa¦ ñÿ#ÿòÝú0Oÿ`ƒÿÞÔ÷úòþ0OÿúñýàÍöM% ÿ!ÿRÿM% ÿ!'Pÿ,ÿÕ³ÚÛM&%ÿÔ+íç¾òÿAÃå½M&%ÿÔ+ ãâ—i@">?!ÿÿèèèËó %#ÿ #$ÿ0P'ÿÿBTTTÿRÿœM% ÿÿèèèßÙ° 2ÿ})ÿIªå})ÿƒ×ïµô÷})ÿ})ÿ 2ÿ÷Îvvvÿ})ÿ ÿ Aÿõ¿bbbÿžžžbbbÿÖÖÖÿžžžÖÖÖÿšššÿ888ÈÈÈÈÈÈbbbÿšššÿ!'PÿßÙ°ccp!'PÿßÙ°!'Pÿ!'Pÿ})ÿM&%ÿ×þÿ})ÿM&%ÿ-QQÿ-QQÿ-QQÿûóþûöþ#ÿ#ÿTPÿ...333áááëÄÃÞÂÁÉÆÞÂÁëÄÃëÄÃÜÜÜ$$$...ñññðððbbbÿCCCÿM% ÿM% ÿ!ÿ!ÿêüýÿ$$$ááááááìììððððððáááðððððððððíÔøŸÖß±òÞÔ÷,0Oÿ04 ® ìR`?4 ÞÔ÷KQM% ÿ, ÌÓö4- M% ÿßÙ°Ô+M&%ÿÔ+`,ÚB¿sE,ÿÕ³ÚÛ,ÿÕ!'Pÿ444ÿÿövvvÿšššÿ, ÿòòòÿM% ÿööö(0Oÿ .-ÚÇÝ0P'ÿS*ÿÿ..4³Åÿÿdïþçý 2ÿ÷Î})ÿƒ×ïƒ×ïƒÛ} ß·Vÿ¢¢¢vvvÿM% ÿ})ÿÎãø})ÿöéü ÿ AÿbbbÿžžžbbbÿñÈ«}T***ÖÖÖÿÈÈÈfff888žžžbbbÿ888ÈÈÈ!'PÿOU„ÿßÙ°!'Pÿ!'Pÿ..4!'Pÿ!'Pÿ..4!'PÿßÙ°!'PÿM&%ÿ})ÿ:- 0ìYí:- })ÿ×þÿM&%ÿ-QQÿÓ¯¯-QQÿÓ¯¯Ó¯¯-QQÿ-QQÿ TPÿ÷êüÑÓö#ÿ...ììì×°¯ÞÂÁÔßß*Öùû*ÔßßÔßßϳ²×°¯TõóJJJËËËCCCÿÿM% ÿ+ã*, CCCÿM% ÿÿoK ÿÿðððìììâââáááìììðððññññññðððšššÿñÿ", ÞÔ÷J M% ÿ", ® ì", ÁÌôÁÌôR¦", ÐÌõбñ³Ûô³Ûô³Ûô³ÛôþçýÌÓöK ÿßÙ°½ñß,þ¼ Ô&ßÙ°B Ô&4-M% ÿ³ÚÛßÙ°ÿððð ÕÕÕ³á tttššš×ÿM% ÿ!ÿ!ÿY ÿöööËó M% ÿúÔàøõÔù/55#:MÝÓýS*ÿŠ„/ÿÁçTØ IDAT­ÖöööTTTκˢú(ŒŒŒöööÿ®êÃÿòòòK ÿƒ×ïƒ×ï·Vÿƒ×ïÆÓöööö«Ž!ÿÎãø2ƒ×ï  2ÿùÖõ¿S*ÿM% ÿ¶¶¶¶¶¶á8;5.BBBS*ÿšššÿfffžžžÈÈÈbbbÿRÿð´fffžžžßÙ°±«|!'Pÿ..4..4ÒÒÌ..4ccp..455<..4!'PÿßÙ°³ÚÛÐýÆÓö:- ;3 :- YíM&%ÿ‰…VÿÓ¯¯/55-QQÿ-QQÿ/55-QQÿ-QQÿÓ¯¯ ¶Çò%#ÿTPÿ éþ#ÿF- ëÄÃÔßßÖùû*Öùû**Ôßß×°¯ñññJ©« «©žžž+++ 2ÿ!ÿ+ÜÿýϪ(ã* âÉþçýM% ÿCCCÿßûü!ÿ!ÿ¤ÜóòòòK ÿððð$$$...áááñññððððððñññ!ÿK ÿ!ÿK ÿM% ÿM% ÿ})ÿM% ÿvvvÿŠŠŠvvvÿôãûÞÔ÷òÝúÞÔ÷ÁþúÖýëòýÖý", бñß±ò®Zá04 бñK ÿM% ÿM% ÿþçýK ÿûöþ¸èö3)Â0Oÿü¸ßÙ°ÐÜ#ÿöööêêêfffŒŒŒäääbbbÿôôôMuŽšššÿÿòòòY ÿßûüßûü|*(ÿÈ÷ù3ôñÔàøüâü*üâüM% ÿ\††ÿ±ž×Õÿâ\††ÿ÷Ïû½‡2ÿS*ÿŠ„/ÿÿ¿Åî2F52F5‡¶ÿÿþçý ÿÿ÷Î 2ÿ2ÆÓö·Vÿ!'Pÿ!'Pÿ 2ÿ÷΃×ï})ÿÑ„#ÁéZ M% ÿ!ÿµô÷#ÿA ÿ`ƒÿA ÿòÝúÿ 2ÿüé»ä4.i;M% ÿÿ3ôñëꄱK ÿM% ÿS*ÿi;»äbbbÿfffRÿ[$Àð´M% ÿRÿ;6BRÿÈÈÈ!'Pÿ55<ccpËËÄ..4ÒÒÌ..4|v@ÒÒÌM&%ÿ0ì:- u`Ck!ÅÍôÆÓö³ÚÛ¤Ìû¤zzÓ¯¯-QQÿ÷ÓÓ‰…Vÿ-QQÿÈžž-QQÿ÷ÓÓòÝúöéüåôüºÓôüôþF- %#ÿüôþÑÓöÖùû*Öùû¬¬¬ÿS*ÿkÐûC:ÿCCCÿbbbÿbbbÿ!ÿ"&dÞÔ÷w}?þçý âÉCCCÿßûü!ÿ!ÿßûüÿµô÷ÿÿÖùûáááìììðððððððððñññâââ Oÿ!ÿ**0Ðüû0M% ÿvvvÿšššÿCCCÿšššÿCCCÿ®®®RRRE|*(ÿùñýòÝú0Oÿ òÝú^2äØþü½ú#ÿÞÔ÷0Oÿ½úÐÌõÃÁé³ÛôM% ÿRÿÖùû6F ã* ¶ÇòõÔù/- #ÿüôþ½òøCCCÿòòòêêêðððÜÜÜÍÍÍèèè¶¶¶³‹r©©©ÿòòòÈ÷ùY ÿÿÿëÿßûü Ã÷Öùû*±ž\††ÿ-QQÿOcb)+Nc€\††ÿÑËË0P'ÿ0P'ÿ#ÿ0P'ÿS*ÿŠ„/ÿM% ÿʹߞÚÿM% ÿ!ÿ÷ÏûüèÿκËκËüèÿBAÿ3ôñÃèèèòòò Oÿ÷΃à!K ÿ 2ÿƒ×ïÆÓößÙ°ßââûå!'Pÿ ÿ÷ö…ç=þûÒý½òøZ M% ÿƒ×ï})ÿ ÿóâúª”ê0Oÿ`ƒÿå¿ô0Oÿ Aÿÿ 2ÿ÷Î÷Îÿòòò­ÖÌÒâ5ËøúÉß÷ÖùûËøú4.­Ö­Öòòòÿžžž½†"ÿ<4 ÄÌô<4 pa‘´;6BžžžßÙ°OU„ÿ..455<ËËÄBl>‡R..4ÒÒÌ!'PÿßÙ°!'Pÿ;3 88ûCk!:- Ðý³ÚÛÓ¯¯-QQÿ/55 --à;k/55 --÷ÓÓ÷ÓÓ-QQÿûöþüôþºÓôåôü#ÿ#ÿ éþÛÛÛ*Öùû*Öùû*ZZZu{¤+Y‚‹…\JJJJJJááá¶¶¶, «Ž", ºÙ™õÔùþçýµô÷Ôàø âÉM% ÿõÿÿí ÿÿ?þ÷öRÿM% ÿK ÿ=þû íìßûüáááÍÍÍðððññññññááá#ÿ OÿÿùÔ!ÿÖùûþçý00)0})ÿÍÍÍÜÜÜWWWWWWvvvEÅËË*+òÝú0OÿÞÔ÷EB0Oÿ }æËó (6F ??½úµô÷бñòòòòòò0x›Ùm, ÌÓöØþüÖý³Ûôûóþ\0"C(ºÓôüôþòÝúÿ444ÿÕÕÕòòòòòòêêêñññ¢¢¢èèè íì½½½ OÿÿüéCCCÿbbbÿCCCÿí §òõ|*(ÿY ÿòòòÞùä ð*ÖùûØþüóÝܱž-QQÿàÒÓÑË˨ Ê-QQÿàÒÓ0P'ÿjJsÞÓß"-!#ÿ0P'ÿ0P'ÿ?ƒTÿаÙ­Ö÷ÏûS*ÿ4.ÌÒâÁé?þ4.i+­Ö­Öÿ2F5..4ÿÖùûòòò ¿2})ÿÎãø 2ÿ"QüéßÙ°!'Pÿ·Vÿƒ×ï ÿ÷ í ÷ö½òø÷ …ìñ})ÿò‰'ÿ·Vÿ})ÿ})ÿƒ×ïöéüòÝúòÝú&8 ëòýÐÌõ`ƒÿ04 Aÿ÷Î÷Îòòò³Ûô³ÛôËøú êüý­ÖòòòM% ÿÄÌôÄÌôü×ûocLÅËÒÒÒÌÒÒÌ..4Bl>Y)(›•fÒÒÌ..4OU„ÿßÙ°³ÚÛÐý‹ ê½•ßûÈó™åÆÓö0ìM&%ÿÓ¯¯j:Ö>>¬¬¬ ¢¢¢BBBèèèÿèèèM% ÿ4- ®êÿèèè!'PÿßÙ°!'PÿßÙ°!'Pÿ..4ÒÒÌßÙ°M&%ÿ³ÚÛM&%ÿ0ìƒ×ï-QQÿÓ¯¯-QQÿÓ¯¯ÿöööøë÷ÿô  üôþ ë ”””¶¶¶éª§Úÿ(4- ÌÓö4- ʺóÚÿ(ÔàøA]^JJJTTT 2ÿ÷Î 2ÿ÷Î 2ÿ!A;íó"±´®÷Îÿ ööööõèèèÿòòòÿöööòòòRRRÿñññðððììììììáááñññáááÿèèèÿèèèÿèèèÿ^^^ׯ–ö7ÕÕÕèèèA‚ÿ £ôÔ* 3 àÍö÷É ö î, 3 àÍöß±ò Oÿó± Oÿó± Oÿó±ÿi;ÌÒâÁé?þ4.»ä èèèÿööö555ËËË +++ñññBBBŠŠŠÿèèèÿèèèÿèèèÿèèèK ÿþçýà èèè Oÿó±ÿi;»äsE»ä èèèÿöööBýÔêêê ÷7íç¾ èèèÿööö èèè 2ÿûåûå÷Î 2ÿ÷Î!'PÿßÙ°ÿööö ööö ööö èèèÿèèè})ÿ›ïèèèM% ÿ³ÛôM% ÿ³ÛôM% ÿ³Ûôÿööö èèèÿèèè Aÿþñõ¿ÿJJJttt888TTTtttBBBèèèRÿÌÓöËó ööö èèè!'PÿßÙ°!'PÿßÙ°!'PÿßÙ°M&%ÿ³ÚÛ-QQÿÓ¯¯ÿèèèÿö îë èèèvvvÿÍÍÍÞÂÁ, 4- ¤Ñò(4- ÌÓö4- ÌÓöØþü&éVY%%%yyy 2ÿ÷Î 2ÿþñ!ßââ÷Îÿööö ööö ööö ööö ööö èèèÿööö ööö íìí èèèCCCÿðððáááðððñññáááM% ÿ³Ûô!Oÿ÷É èèè#ÿëÎ÷&PÿüÚ°ÿèèèÿööö èèèÿèèèÿèèèÿí.' IDATööö èèèÿ7=lÒÒÌ÷ñÈ7=l Þíó"ÉÔèèèÿèèè 2ÿ÷Îÿ÷Îÿèèè€ÿÿèèèÿèèèÿèèèÿööö èèè!'PÿßÙ°ÿèèèvvvÿììì¿£¢, 4- ÌÓö4- ÌÓö4- ÌÓö4- ÌÓöÔàø">?333ŠŠŠ 2ÿ÷Îÿèèèÿèèèÿèèèÿööö ööö èèèÿèèèbbbÿáááððððððìììðððááá#ÿ#ÿ#ÿ#ÿvvvÿRÿCCCÿbbbÿvvvÿ¬¬¬ÿCCCÿbbbÿ¬¬¬ÿ¬¬¬ÿ¬¬¬ÿTPÿ¬¬¬ÿÿM% ÿÿbbbÿbbbÿbbbÿ444ÿ444ÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK ÿM% ÿÿ¬¬¬ÿÿ!ÿK ÿ#ÿ÷êüüôþ ÿüôþ#ÿ#ÿ#ÿA ÿ`ƒÿ0OÿvvvÿRÿ<4 Rÿ½½½¶¶¶ÍÍÍÊÊÊCCCÿTTTŠ„/ÿ¬¬¬ÿÛÛÛTTT64ÛÛÛŠ„/ÿ¬¬¬ÿRÿ0P'ÿÿèèèÿÿÿÿÿÿÿÿ·V.ÿ¼ˆXÿOU„ÿbbbÿRÿM% ÿM% ÿ4- M% ÿbbbÿCCCÿÿCCCÿbbbÿbbbÿbbbÿÒÒÒÚÚÚäää^^^ÖÖÖÿÿlJ·VÿM% ÿÿ+++———CCCÿbbbÿCCCÿvvvÿbbbÿCCCÿ%#ÿŠ„ÿTPÿŠ„ÿÿòòò*¢N Oÿ#ÿûöþøûöþ÷êüüôþ÷êü#ÿ ÿïÖøª”êìì좢¢RÿM% ÿRÿÌÓöÄÌô½†"ÿèèèÕÕÕÍÍͺÉ!ÿ·V.ÿ¬¬¬ÿØÞ3ÛÛÛyyyv|Ñ%%%ýXÛÛÛ¬¬¬ÿÿÿÿÿÿp8EÁ:4Rÿ #ÿöööèèèèèèÿöööÿ”¶ÛûÎÖ¬¬¬ÿÍýþÿOU„ÿÉÔk›œ¬¬¬ÿ‘ÁÂÿ!ÿM% ÿʺó³Ûô4- ÌÓöM% ÿ³ÛôM% ÿ666¬¬¬+++ÿCCCÿbbbÿ¶¶¶ÿÿÿÿžžž444ÿááá...&&&BBBmmmbbbÿ+ƒÿÿ+ƒÿK ÿÆÓö½†"ÿRÿ³Ûô–Ïñ0M% ÿ íì®G®Gbbbÿ333ìììJJJ333bbbÿTPÿ/- ›Ÿë¬°î›ŸëTPÿ#ÿA ÿA ÿ#ÿA ÿ!ÿK ÿK ÿÃ!´íK ÿÿó±#ÿ÷êüüôþûóþßûü÷ûóþûöþ ÷êü#ÿöéüöéüöéüÚÈõ·V.ÿ·V.ÿ¶¶¶èèèÌÓö4- ÌÓöþçýÌÓöÄÌô Oÿèèè½Æïž§ÐäÕ}–Ð÷¬¬¬ÿ¶¶¶ááá%%%TTT%%%ý¨¨¤f¬¬¬ÿ CCCÿÿGT¹ IDAT #$ÿv¥™ÉxpI0P'ÿRÿîë èèèèèèÿÿÿèèèòòòèèèèèèèèè0P'ÿ¿ û‰,þ@‚,ÿå3±«|qm>ÄÄÄTTT<<<!ÿ`Mµô÷!ÿK ÿM% ÿÌÓöþçýÔàøM% ÿRÿèèèÔ¨§$$$hhhJJJááááááèèèÿÿø K ÿÿvvvÿCCCÿÌÌÌÕÕÕáááBBBBBBìììbbbÿžžžäÕ}OU„ÿø_äÕ}¼ˆXÿÐüûCzÞ<4 })ÿþçýÐüû0·Vÿÿ444ÿ÷ÉÏ'޽444ÿbbbÿ444ÿCCCÿùÂ_ÿùÂ_ÿááááááìììÊÊÊìììááá444ÿ%#ÿÇñú¬°îÛÝøÛÝø¬°îTPÿ ëóâúA ÿSQ(ÿý× ëóâúí !ÿÿÖùûÖùû=þûÖùûK ÿ Oÿüé î ÿûóþ #ÿ òÝú÷êüòÝú{ÿ©'üÙýyùá³/+ÿÿèèèM% ÿþçýRÿM% ÿRÿRÿÔàøÌÓö<4 Rÿ 2ÿüãÿ 2ÿOLROLR+ƒÿ&Pÿ444ÿ444ÿ444ÿM&%ÿòòòþæä·V.ÿ¬¬¬ÿ——— âÉ———¬¬¬ÿ¨¤f"(}64TPÿòòònöööËËË ÿÿCCCÿÿ#- #$ÿäg7>¡Ér8p8ERÿÿööö èèèÿÿèèèÿÿÿÿ·V.ÿp¼4ÿí*&9#ðÎû0:K ÿo?>‘ÁÂÿ‰…VÿOU„ÿw{ªÑ¡ šššÿÅÁ‹ÿ‘ÁÂÿ3!ÿ, ʺóþçýRÿ, 6F Ã`M4- ÌÓö³Ûô˜ÄŽ»$$$!'Pÿ!'Pÿÿø ø ø ø æüýËøú0ÿ0ÿŠŠŠ333CCCÿèèèËËËÍÍÍÍÍÍžžžžžžCCCÿ„ŠÀÿCCCÿ+ƒÿ¿¹ŠAGväÕ}Dx¨€TSÿ¼ˆXÿbbbÿþçýM% ÿŸêÐüûM% ÿµô÷þçýÐüûÆÓö·Vÿ5 ôäääöööxxxáááÌÌÌ333>¡·Vÿ¾”¼½½½ÒÒÒììììììÒÒÒ½½½9%#ÿ¬°î%#ÿTPÿèèè õý× ÅÇð ëA ÿÿòòòÿ÷ößûü!ÿßûüH-ƒÿ¸Ó}H-ƒÿ¸×” 8ó±#ÿ÷êüFÿÖCä¾ô  òÝú #$ÿnñë’ýôàVl }æÿòòòA ÿå¿ôM% ÿþçýpaÄÌôÌÓöÔàø*³ÛôRÿ®êÿüé 2ÿûå"Q3*ÍÖÿäÞ¯÷Î 2ÿ÷ÎCCCÿÉÆØþü(³ÛôÿŸ>IªÒÿ?j0 IªÒ·V.ÿIªÒ 2ÿOLR±´®÷ÎCCCÿááá âÉþçý?x&"(}¨¤fïó1GAì"(}TTTŠ„/ÿ"(}TTT·V.ÿÅÔú’äæòòò #$ÿ#-аÙRÿ®êùÂ_ÿˆ·ŒÑäg7v¥ÿèèèÿööö ööö ööö èèèÿèèè ÿ&9#í*çÕÿ+ÿÖ2ðÎû2±/v¥OU„ÿô½½vvvÿ૯Þ!P±«|ÿ÷ö*4- ÌÓö4- ÌÓöþçý6F <4 ÄÌôÌÓö³Ûô€TSÿÍÒÒ)PQ```ÄÄÄÈÈÈìììááá AÒÒÌßÙ°ÿÛbçìžbçìËøúêüývvvÿÍÍÍ333ŠŠŠbbbÿŠŠŠvvvÿŠŠŠÿ‚‚‚ššš½½½ÿòòò+ƒÿh_=ËËÄÍÖÿäÕ}444ÿÚÚÚTTT888^)ó=sK ÿÖùû*Ôàø*þçýÖùû, Ôàø, 0Ðüû³ÛôÿÙrC„³ >ç­Ö¬¬¬ÿTTT0OÿбñTPÿ¬°î0Oÿ$-®ê444ÿñññððð½½½444ÿÌÌÌ%#ÿö9¬°î ÿûóþÿíõê ööö 3þý× èèèòòòòòò÷ößûüßûüK ÿH-ƒÿ OÿÿH-ƒÿ¸Ó} Oÿ¸×”H)ló±òÝú ûóþÖùû¶öB øøûöþüôþ#ÿ ÿØ=F.ê`ƒÿÿòòòïÖøþçýÖùûÖùûþçý ³îÔàø, ³Ûô®êRÿ 2ÿOU„ÿ+ƒÿûåOQm"Q'ÀÍÖÿäÙ”ûå&Pÿÿ 2ÿCCCÿÉÆÚÿþçý(%#ÿM% ÿèèèaÂêM&%ÿÿ þæäÅÔú·V.ÿ·V.ÿ–Ð÷ 2ÿ"Q/ÑÒï0+ƒÿ¬¬¬ÿááá âÉ_‡  D "(}64iii"(}———ØÞ3CCCÿšššÿãDlÇ 555AGv+ƒÿóÝÜQï®ê #$ÿ®êóÝÜ™ÉRÿèèèÿÿööööööúöööú öööÿèèèí*㯯ñ´ÿÖí*À~ÔðÎûv¥ÿ¼ˆXÿ¶WUÿÿ±«|½½½OU„ÿÀI5.ñÑ/±´®÷Îbbbÿòî°ÄÈ<8ú(ÚØ&ê-ÌÓö_‡ Þ؃"(}TTT¬¬¬ÿTTTvvvÿ$$$ÜÜÜÍÍÍËËËAGvÍÖÿäÕ}.è« IDAT #$ÿ#-аÙñŠ[ÿv¥ÿèèèÿööö öööúîë èèèÿèèè ÿöéü ÿ÷ ü ööéüÿž?=ÆÓÓ@^0úÏýbÁÃèè輈XÿDx¨+ƒÿ ±ÌÌÌK ÿ³ÛôM% ÿ³ÛôM% ÿ4- ÌÓö³Ûô·VÿIªå!'Pÿ..455<ËËÄÒÒÌ..4ôî¿ááá+1`ÒÒÌßÙ°ÿöõ5µô÷bbbÿááá½½½vvvÿŠŠŠCCCÿ½½½vvvÿJÚ©©©AG}Ú©©©AG}Š„N èèèÿòòò Oÿüãó±ÿüéCCCÿ$$$^)ó¢× ÈÈÈááá½½½!ÿ*Öùûí ÷ö*³ÛôK ÿµô÷M% ÿ0ƒ×ïÿ ÌÌÌÿòòòñŠ[ÿ„³555½½½·VÿÊüû<5ÄËä<5ÄËä<5—Éରîÿ+++ÕÕÕ >>>ááááááWWW¸¸¸$$$ŠŠŠbbbÿžžž ÿ&8 õÔùÛÝøSQ(ÿ­¯Øÿöööø óâú å¿ô÷öí ÖùûK ÿòòòµô÷!'Pÿüã÷Èüã¸×”H)lH-ƒÿ2 ÿ!Oÿ 3 ¿ê 3 íÔøõÿÿ*Öùûí,ß±òÚÈõöéüûöþF.éÚÈõÚÈõÌÌÌßûüµô÷ßûüµô÷*þçýM% ÿRÿ 2ÿÍÖÿ3*ÕÏ ôî¿ ÞÙè@äÞ¯ûå&Pÿ×Õÿ)+&Pÿ 2ÿÿüÚ°ñññ ;ø7:ç(=VÃÁ¦>Óëêbbbÿéëèèèòòòµô÷ÍÖÿ/]új±¯“÷Îááá64”””„ÖØ¬°îÌÓöþçý¡y`÷Î犄/ÿ¶¶¶+ƒÿ¦µ µ»êµ»ê¾î%$$$333555 3;<]<OU„ÿt/òаÙñŠ[ÿ8™É0P'ÿRÿRÿèèèÿèèè úîëÿèèèÿöéü"B6k(0P'ÿÿ¼ˆXÿê5ÿ¶WUÿd—η:--úÏýÆÓÓ1¤p@¶WUÿ¼ˆXÿDx¨RRRÿšššÿ'À³Ûôj1³ÛôK ÿ4- 4- ÌÓö³ÛôüÙü·VÿßÙ°ÒÒÌËËÄÒÒÌ..4ÒÒÌ A+1`ccp..4!'Pÿÿöõöõöõø CCCÿvvvÿvvvÿCCCÿCCCÿŠŠŠCCCÿ½½½OU„ÿ$$$Úêð&333òì¶½½½¿¹ƒTTTèèè Oÿó±üã÷Èüãÿüébbbÿ$$$ÜÜÜ¢× ^)ó888µ€JCCCÿßûüí Öùû*=þûí Öùûþçýäääÿ &&&555444ÿ„³ã|M½½½M% ÿ6ÄËä6ÄËäÓþüÓþüúÏé-0Oÿèèèèèèáááñññ333ÈÈÈñññ666ááá ÿ ëòý,ÿ#ÿ»ÒÞSQ(ÿíõêòÿìøE."ïÖø õå¿ôÿ÷ö÷ößûüòòòí H-ƒÿ'3èõ7üãûåûå¸Ü¯Åö¡ùñýàÍöàÍö í3_2 ÿëÎ÷öéüöéü ÄÌø.¿ û÷ öéü0OÿA ÿöéüÿµô÷!ÿÖùûþçýÖùû4- ÔàøÊºóK ÿM% ÿ 2ÿOLRù¡ôî¿>>>JJJÙè@3*ûå÷Î&Pÿ&Pÿ 2ÿ)+)+Ó¸áüãâûå"9üÚ°âàÅÕÕÕö7888(Óþü4- ð´ÿú·V.ÿ÷ÎäÞ¯±´®¨|X'lbbbÿ½½½"(}TTT¬°î³Ûô+Âñ-ÞØƒ¹¿¬¬¬ÿžžžäÕ}+ƒÿ3*±«|±¯“÷Ížî%ÙßE|Jz±Jz±¶†O÷Íű«|ŒÑ0P'ÿRÿñŠ[ÿ8ˆ·óÝÜаÙ®êŒÑRÿèèèèèèÿöööîë öööÿèèèèèèÿ&Pÿ&9#ÚÇÝðÎû@l 0P'ÿž?=úÏý’õ ÆÓÓœîðËó ÆÓÓ•µ´¥ÛÜÀ¢Ð1úÏýbÁÃDx¨ý2fff½½½WWW444ÿ³Ûô;3 ³ÛôK ÿÌÓöÌÓö³ÛôMÑéaÂý!'Pÿ..4ÒÒÌÒÒÌ..4ÒÒ̱¯“ÒÒÌ AÒÒÌËËÄÒÒÌßÙ°ø ø 0333ÍÍÍvvvÿŠŠŠììì½½½½½½½½½!'Pÿ55<±t‹ÈÈÈ¿¹ƒ˜˜˜˜˜˜êð&ÿËËË888ó± Oÿüãûåûå 2ÿ OÿbbbÿCCCÿááá½½½888ìììÜÜÜ¢× ©©©jŸÕWWWòòò* `MÖùû4- !ÿ³Ûôƒ×ïòòòööö iiiòòòv¥³Ûô–ÏñÊüûÓþüÊüûÓþüÄÈÄÈW¸óÌÓöÞ¿ÿTPÿÿÿ ÕÕÕ444ÿÕÕÕáááQÍÉvä¼îîîñññCCCÿÿ ÿ  óâúðððCCCÿ444ÿø 뻽æ#ÿ   E."»ÒÞë÷ ö îA ÿÿßûüßûüÿ=þûµô÷¸Ó}6*ûå 8 òûå~NSH-ƒÿòÝúß±ò 3 àÍö 3 ,íËøú,àÍöôãû #ÿ ÿ ²Ú ²Ú ÷ ü öA ÿÚÈõå¿ôèèèÿßûüßûü6F ßûü®êœÖùûµô÷³Ûô"QÕÏ ¶¶¶JJJÊÊÊááá3*±´®÷Î Oÿ&Pÿ)+üÞÇûåÓ¸áÓ³Æûå-H"9üÚ°ÿ&é+++WWW âÉ+ùÕúÓþüÌÓöÛÝø³ÚÛ–Ð÷÷ÎüéäÞ¯ÿžžžTTT³ÛôX\šááṿÞØƒCCCÿäÕ}±«| 2ÿ 8±«|Ä£Ä 3;÷ÍÅģĨsAGvÍÖÿóÝÜÝÓýRÿ0P'ÿŒÑ8ˆ·®êóÝÜŒÑRÿöööú ööö ÿèèè&Pÿ+ í*ÐÆøbÁÃbÁÃ„ÖØ„ÖØèèèÏâáúÏýÍ ßûü¥ÛÜúÏý1èèè6ˆ¿ÿ±«|fff‘WbbbÿwÙK ÿ6F ³ÛôÿÿÿèèèßÙ°ÒÒÌ..4ccp..4±´®ßââßââÒÒ̱´®ßÙ°!'PÿÿÜÜÜòòòòòòÐøúŠŠŠ333ŠŠŠCCCÿÚG_¶¶¶ËËËŒŒŒ¿¹ƒ fffûå 8ûåûå÷Îááá½½½šššÿŠŠŠÂÂÂìììWWWžžžÜÜܵô÷Í èèè<4 í  ³î`MK ÿòòòôôôíÑЈˆˆÿM% ÿËó ÌÓöùÕú—ÆÄÈŸ>ööösDj1FB¬°îèèèèèèôôôöööÚÚÚáááWéÍÍÍDDDfff½½½ÿÿöööïÖøôôôáááCCCÿÿ óÍ üôþø »ÒÞë 3þE."ý× !ÿßûüÿ=þûµô÷!'Pÿßââ0Gõ/3ÑÍúй ûåH$QÅö¡óÝÜ!Oÿ 3 àÍöôãûùñýáý K 3 àÍöÕñåùñýòÝú ÿî*Öùûí ¥!MÑÕ½†"ÿCzÞ½†"ÿÄÌôÌÓö³Ûô+ƒÿh_=¿¹ƒÍÍÍ AÍÖÿäÙ”÷Î&Pÿüãâûå^wÏÍü×ÕÿüÚ°ÿööö555ññññïÔ(=Vëê+-®êK ÿÍ èèèÿŸ>IªÒ 2ÿ÷ÎTPÿÐÔGAìk©©©½½½ Oÿó± Oÿ4äÙ”'läâÌó±u©Ó IDATÿèèèñŠ[ÿ8ˆ·®êRÿ®êÿèèèÿööö ööö èèèÿèèèQQÿÿÖåââïôG,*×2Õ°ÝëÎ÷¶WUÿJ©«¼ˆXÿDx¨K ÿµô÷¶WUÿJ©«‘ÁÂÿo?>bbbÿ/_`o?>M% ÿËó ööö èèè!'PÿßÙ° 2ÿ÷Î 2ÿûå÷Îÿòòòÿòòòÿ"úøK …ìñbbbÿÍÍͽ½½„ŠÀÿ¿¹ƒ½½½ÿ èèèÿèèèÿòòò Oÿüã^Ø¢ú(ãúãûå÷Î Oÿó±bbbÿììì¶¶¶ööö555½½½CCCÿWWW~~~JJJ˜˜˜òòòM% ÿpaCzÞ!ÿœŸêþçýµô÷S*ÿ­ÖñŠ[ÿÉÏ­ÖÿsD¯ýùÞ¿ÿFB¥rML¯ èèèÿööö555ÂÂÂRRRìììáááñññÌÌÌÿöööü ö÷ ÌÌÌ444ÿÌÌÌA ÿý× eùÐýþæä¿ û*ïÖø÷ EC­¯Ø*òòòÃK ÿ'3ÝÓýÑÍúн( ò~Sn òóÝÜ!OÿíÔø £ô 3 ,ÿ.ôãûàÍöa¦ ^ôæòÝú ÿ**í ü öWèÙ³/+ÿCzÞRÿCzÞ®ê³Ûôh_=ìììÍÍÍJAG}ÍÖÿäÞ¯ 2ÿûå 8^{#¢…ÝÓ¯¯üÚ°ÿ ËËË ;ç(4- ùÕúáLÂñ-Ãèèèèèè–Ð÷·V.ÿ÷ΚššÿÐÔôôôôôôôôôGA쎔éðꕽ½½ó± OÿüãäÙ”äÙ”èèèÿ™ÉøÈüxpIRÿ0P'ÿRÿñŠ[ÿ®êèèèÿèèèòòòèèè èèèèèèèèèQQÿïôGüÚ°üÚ°í*Õ°Ý0P'ÿ¶WUÿK ÿbÁÃ|*(ÿK ÿÍ ÿ1Íýþÿo?>žžž<<<ÿM% ÿËó Ëó Ëó ööööööööö èèèèèèßÙ°ßÙ°÷Î÷Î÷Î÷Îÿÿ ÿÿ ÐøúÿCCCÿìììÍÍÍ333CCCÿ|v@½½½ÿ èèèèèèó±ãþ¢ú(ãþüéó±ÿÿ¶¶¶ììì¶¶¶555ÿÜÜÜöööìììòòò³ÛôŸêßûüކç³Ûôµô÷S*ÿp71'޽p71ÿ —ÆèÉ òòò c L¯©H òòòèèèööö555ñññáááìììðððDDDÌÌÌÿööö ÷ 555 ððð444ÿÌÌÌ8èèèèèè‘åýþæä¢N ïÖø÷ ÷ øÈðäÿ íì*Í èèè!ÿ*µô÷H-ƒÿ¸Ó}H-ƒÿ6*ÊÖþ¸Ó}H-ƒÿ¸Ó}!Oÿôãû  3 àÍöí¿ø, 3 àÍö 3 àÍöß±òÿíõê öööü öööö èèèÿööö èèèÿOQm55<ËËı¯“÷Î 2ÿüã÷Î&Pÿ)+×Õÿ)+Ó¯¯ÿööö ööö&&&...áááÕÕÕèèèÿöööúóõèèèÿööö©H IªÒÿrlk~~~ööö|v!Ž”éèèè Oÿó± Oÿüãûåûå 8ó±ÿööösD—ÆÙrC'޽ÙrCÈ»—Æèèèÿööö èèèÿèèèÿèèèÿ5 ôj1"SÁÖööö©H –ÏÞËó èèèÿööö®zJR†¶ ž?=1\Àèèè‘ÁÂÿ£srÌÌÌÿèèèÿy©ªo?>ÿööö èèè 2ÿ÷Î 2ÿ÷Îÿööööõðî2Z\¶¶¶ööö555áááËËËhhh¾¾¾ËËË555333ÍÍͽ½½ÿòòòÿöööTTT¶¶¶èèèÿèèèÿ+++333¢¢¢ööö555iiilllèèèÿèèèÿèèèÿöööTTTááá333666îîîÈÈÈžžžÿèèèÿèèèCCCÿññññññÌÌÌ444ÿÌÌÌM&%ÿ4-ÌÓûÁèé ööö 3þý× èèèÿööö÷öí ööö÷öí èèèH-ƒÿ¸Ó}H-ƒÿ¸Ó}H-ƒÿ¸Ó}H-ƒÿ¸Ó}!Oÿ,ÖþÔ* 3 àÍöí¿ø, 3 àÍöß±òÿööö èèèÿööö èèè 2ÿûå'läÙ”OQm±¯“ó±&PÿüÚ°ÿööö ööö èèèÿööö ööö?Áèé èèèÿööö ööö èèè Oÿó± Oÿ÷Èó±ÿööösDp8E„³ã|MÈ»—Æèèèÿööö èèèÿööö©H W¸à èèèÿèèèÿèèèÿ‚‚‚œî%âYööö ‚‚‚ÈÈÈ/_`o?>ÿòòòÿööö èèè 2ÿ÷Î 2ÿ÷Îÿööö555ËËË555ËËËTTT¶¶¶èèèÿööö öööTTT¬¬¬TTT¶¶¶èèèÿòòòÿööö èèèÿööö ööö èèèÿööö555ËËË555333¢¢¢èèèÿ+++ááá½½½444ÿðððÌÌÌÿööö èèèSQ(ÿÈðäý× èèèÿèèèÿèèèÿèèèH-ƒÿ¸Ó}M% ÿ³Ûô!Oÿ÷É ö î ôãû ß±òÿèèèÿööö èèè 2ÿûåûå÷Îÿèèèÿööö èèèÿèèè Oÿó± Oÿó±­kâ IDATÿööö èèèÿèèèÿ€ÿèèèÿèèèÿèèèÿèèèÿ+++ÕÕÕèèèCCCÿÕÕÕèèèÿòòòÿèèèÿèèèÿèèèÿööö èèèÿööö555ÕÕÕèèè444ÿÌÌÌÿèèè!ÿ444ÿCCCÿ444ÿvvvÿ‰…VÿM% ÿRÿRÿM% ÿbbbÿM% ÿvvvÿ 2ÿ 2ÿ 2ÿ 2ÿ 2ÿM&%ÿ|*(ÿ!ÿ!'Pÿ!'PÿK)Qÿ!'PÿM&%ÿM&%ÿM&%ÿM&%ÿÿÿÖ"ÿì[XÿÖ"ÿì[XÿY ÿÿCCCÿCCCÿ-QQÿ444ÿCCCÿCCCÿCCCÿCCCÿ444ÿÿ444ÿCCCÿCCCÿ·Vÿ444ÿ!ÿËU.!ÿ444ÿíÑÐÞÂÁ444ÿSQ(ÿÅÁ‹ÿÅÁ‹ÿvvvÿOKvvvÿÅÁ‹ÿÅÁ‹ÿbbbÿw{ªRÿ³Ûô®êÌÓö4- ½†"ÿK ÿ0ÿëêׯ–÷Îÿ 2ÿ÷Î÷Î 2ÿ 2ÿ÷Î÷Î 2ÿbbbÿRRRÿ|*(ÿ³ÚÛ|*(ÿ¥ÛÜ·V.ÿ|*(ÿ!ÿËU.!ÿ·V.ÿ¼ˆXÿšššÿšššÿ!'Pÿ*!'PÿOU„ÿ¬¬¬ÿßÙ°!'Pÿ*M&%ÿM&%ÿ|*(ÿK%ÿÁèéÓâþÓâþþè|*(ÿbbbÿ #ÿòøòøÿÿY ÿ*Þå¹·Y ÿ*Þåm³³§òõY ÿÖ"ÿÿ+++ê/55ÿCCCÿCCCÿ\††ÿ-QQÿ\††ÿCCCÿvvvÿ444ÿvvvÿbbbÿCCCÿCCCÿWWWCCCÿÿÿCCCÿÿÿ5ÿü@ü@CCCÿ444ÿò‰'ÿ·Vÿ})ÿIªå444ÿ444ÿ ÿáþÕ444ÿS*ÿK ÿUqr®@h, ìZ2ÿS*ÿˆT$`N&ÞÂÁÌÌÌ#ÿ0P'ÿÅÁ‹ÿøÃÿ%#ÿ%#ÿÒÒàŽ`b}%#ÿ‰…VÿSQ(ÿvvvÿŠŠŠ±µëà;?u‰…Vÿvvvÿ‰…Vÿ;?užžž<4 ò‰'ÿ·Vÿ³ÛôÌÓöÄÌôRÿCCCÿµô÷4- Áé¬S÷Î÷Î 2ÿ 2ÿûåSQ(ÿ(ÔÿÖ #$ÿM&%ÿ|*(ÿ¥ÛÜ|*(ÿÑüý|*(ÿßûüW¸à¥ÛÜK ÿ·V.ÿ!ÿM% ÿTPÿS*ÿ!ÿUqraËÚ‹§¨!ÿS*ÿ”¶ÛûÎÖÿ‡¶CCCÿÈÈÈ!'PÿßÙ°,3*!'Pÿ]W(ÞØƒ444ÿ*,3+M%K)QÿM&%ÿÁèéÁèéÏäýÕúþú\"\"Ñüý|*(ÿM&%ÿCCCÿCCCÿCCCÿCCCÿááỉˆÿÿàøÝ#ÿúÝ#ÿ òòòÿòòòÿ…ìñ§òõY ÿ§òõ§òõY ÿƒìð+++/55ËïïÜÜ ÕÕÕñññ¼’’CCCÿòòÑËË\††ÿ$$$CCCÿzCß¾¾¾[$ÀCCCÿ½½½áááÜÜÜÿÿ9¶ü@ø ÿ3ôñž5ÿÿü@=vp=vpü@ò‰'ÿwÙ·VÿIªåƒ×ï444ÿ444ÿ444ÿÖãÐ üóCCCÿ444ÿS*ÿ;5.ׯ–ç¹Ëó •ùø;5.S*ÿ¼ˆXÿS*ÿ\ÀÐ…Wp71÷üôþZ4ö#ÿŠ„ÿ¼ˆXÿ‘ÂÉdbN(.. 64. žƒrpcøÃÿ666vvvÿŠŠŠíñ w{ªOK‰…Vÿw{ªCCCÿ¬¬¬ÿM% ÿŸê½†"ÿwÙ–ÏñRÿÌÓö<4 Rÿ333S*ÿM% ÿ¼øL¯S*ÿ¼ˆXÿM% ÿüéÿ 2ÿûåÿ÷Î 2ÿ)ÙÀ“à)ÙS*ÿzdcRRRÿS*ÿRRRÿRRRÿ’äæ;,/M&%ÿ|*(ÿ„ÖØ·V.ÿí ÃF1ú IDAT”¶ÛM&%ÿÿÿ–QÁé͵òM% ÿM% ÿS*ÿ;5.ׯ–lll, ;5.S*ÿvvvÿÙ¿ HÿCCCÿìüÔ!'PÿÞä éÇïí羚ššÿüÔÍaƒ[*¶¶¶"(}...Š„/ÿµ×¯üÔÍ666ÖþÿM&%ÿÔßßúÕúþ\"-Ñüý„ÖØ³ÚÛ³ÚÛÑüý³ÚÛM&%ÿ333½½½bbbÿšššÿvvvÿCCCÿvvvÿxFE333vvvÿCCCÿ½½½»íîCCCÿÿòòòúÝ #ÿ#ÿ #ÿëîëÿú#ÿ §òõ0ÿ×úû{ÿY ÿ×úû§òõY ÿêç½½ããËïï+++JJJê/55áááÜÜÜCCCÿ†½!ää䆽!ááá333ìììááášššÿ 555òòòbbbÿí ä¡XÞÎýü@ e Ëøú-ßæËøúöööÞÎý¡X¡XñÍÓ·VÿÅÍôò‰'ÿ·VÿIªå444ÿÂÊ¿ÑÙÎÖãÐCCCÿ*0ÿ5^ÇÔÁMö444ÿSQ(ÿS*ÿ;5.ÅËÒôÁéʹßAöóʹßÅËÒ;5.¼ˆXÿ‘´³á +++ÉÏqØ^^^ ÿ ÿÿ÷ „Šñüôþv|ãSQ(ÿ 93ÄÄËÊÌÒ,ÒÒà§ËÑÄÄË(ÊÌÒÄÄË‘ÂÉSQ(ÿÊÊÊŠŠŠ‰…VÿŠŠŠçë!w{ª‰…Vÿ½½½TTT‰…Vÿ4- ÄÌôþçýÌÓöRÿRÿÄÌô<4 RÿbbbÿbbbÿŠŠŠvvvÿM% ÿS*ÿ¼ˆXÿS*ÿÌÒâããú"úø?þ¯µÜM% ÿS*ÿ¼ˆXÿ‘´ããúüé÷Î 2ÿ 2ÿ÷Î÷ÎüéÿSQ(ÿ ]_Î7=¨úüÑÿ(úÌ£—Åî555®®®÷öí ”¶Ûj0 Ñüý|*(ÿ·V.ÿ;4Öùû/öööW¸ó í ÔàøTPÿS*ÿ;5.ÅËÒí ÔàøÔàø3ôñÔàøÅËÒ;5.vvvÿ666RRR666ÖÖÖÿ ËËË"󵯆øòBŠŠŠCCCÿµ×¯ÊÊÊaƒ[!'Pÿ¬¬¬ÿÞØƒ("Í"(}vvvÿvvvÿÖþÿÊÊÊßÙ°ÔßßZ \"-¥ÛܳÚÛÔßßK ÿ{ÿ{ÿ³ÚÛ³ÚÛM&%ÿvvvÿìììžžžÈÈÈvvvÿÍÍÍ»‰ˆÿ333ÍÍÍ»íîìììE333vvvÿììì½½½CCCÿ ÿÿÿøõëü#`A #ÿøõëèèèY ÿ0ÿ\ o"!"Y ÿ0ÿÐøú×úûê5ñññððð÷ÓÓ --ááááááÒÒÒêëÇÇ罽罽\††ÿ½½½ÍÍÍCCCÿáááñññ½½½áááCCCÿÍÍÍááá½½½ÿbbbÿŠŠŠÿÿqm>WWWÿžžžšššÿŠ„ÿK ÿTPÿÝÓý"2ΠÐþìë›ðôL^_„–—ÿôôðÒÓ_¨sÝÓýÆÓö})ÿ·Vÿò‰'ÿwÙIªåÑÙÎÂÊ¿  ËàÃáþÕåââÛ’èÈñw<&—ÅîUQ"S*ÿSQ(ÿdI®é·RÊýüÒþþ­¯ØS*ÿ­Ö!ÿ8 ôþçý§òõS*ÿ­Öÿñññ...ááá½½½¼ˆXÿDx¨ ÿ÷ ü ö òÝúSQ(ÿ64.ÊÌÒ­¯ØSQ(ÿ64.Ä ¶ØþüdbN<<5;?uSQ(ÿ¥re=sCCCÿiiiÊÊÊŠŠŠbbbÿJJJ¶¶¶c_)¡×žžžÿ‚‚‚ÈÈÈžžžK ÿ4- ®êM% ÿ4- <4 ÄÌôʺó4- ®êvvvÿŠŠŠÖÖÖÿ***444ÿ...¾¾¾ÌÌÌ444ÿüÔÒ³ÛôS*ÿ»ä?þÁé?þ³ÛôM% ÿããúÐøú 2ÿ÷Î 2ÿûå÷Îÿ÷ÎS*ÿ­ÖÿÿF.ÅÇðooo‘‘‘èèè!ÿí =þûlJ%ÅÔú;,”¶ÛÃ÷ö–Q*ÅÔú¥ÛÜ,!!³ÚÛÿòòò!ÿí ÷ö(³ÛôM% ÿ4.­Ö!ÿí ÷öí =þûµô÷!ÿ, ³Ûô·V.ÿ2*N~ÖÖÖ***^^^¢¢¢***!'Pÿ"óÕÕÕèñ!Ïe:@Ħ†¯mmm7íA†Ð|!'PÿUO&ºÚ±#Y[„ÞØƒ¦Ìø|\…TTTÿ÷ößûüM&%ÿÁèé¯xdâí ÷ö*0 èèèbbbÿžžžvvvÿ$$$fffbbbÿááá½½½bbbÿŠŠŠCCCÿ½½½ÿöööv|²™…ã÷Ôëòøõèî úÝ #ÿÌS5¹·…ìñY ÿ3 `DFþÛØÈçæÉ÷ùÞúü"…ìñ0ÿÐøú-QQÿ/55Ø®®ÚÚÚ&&&ñññððð --ïÚ2ù¡ --5žžž444ÿñññÕÕÕöööTTTááá½½½CCCÿ½½½ÿêêê&&&ÚÚÚòòòÿòòòK ÿÃòòòÿÿ.-㯯ÿ„–—ttt&&&ÚÚÚòòòQQÿðÒÓëêòòò·VÿIªå·Vÿ;3 wÙ·VÿIªå ÿ  åââl!!îj/–ÑÂðñññÌÌÌ444ÿS*ÿ Aÿ Aÿ Aÿ¶WUÿ AÿµZ†ÿ~W…ÿS*ÿ ÿ!ÿ!ÿS*ÿÿÿ444ÿCCCÿCCCÿ444ÿS*ÿ¼ˆXÿÿÿÿM% ÿ ÿ0P'ÿ‰…VÿÅÁ‹ÿSQ(ÿ0P'ÿ0P'ÿ‰…VÿM% ÿSQ(ÿ‰…VÿSQ(ÿ‰…Vÿ‰…VÿCCCÿ‰…VÿCCCÿ¬¬¬ÿCCCÿ¬¬¬ÿCCCÿ‰…VÿÅÁ‹ÿbbbÿ Oÿ OÿOU„ÿÿšššÿbbbÿ+ƒÿ+ƒÿ Oÿ OÿK ÿM% ÿRÿM% ÿRÿRÿM% ÿRÿ½†"ÿM% ÿM% ÿRÿRÿÿvvvÿÿ444ÿbbbÿ444ÿÿbbbÿÖÖÖÿ444ÿvvvÿS*ÿM% ÿÿ0ÿÿS*ÿ 2ÿ 2ÿ 2ÿÿ 2ÿÿ 2ÿSQ(ÿÿÿ|*(ÿÿ #$ÿÿM&%ÿ·V.ÿÿÿ!ÿ!ÿÿ!ÿ·V.ÿ|*(ÿM&%ÿM&%ÿM&%ÿ|*(ÿÿ!ÿÿM% ÿ!ÿTPÿ!ÿ!ÿÿÿ!ÿ!ÿ!ÿCCCÿvvvÿbbbÿbbbÿ¬¬¬ÿ¬¬¬ÿbbbÿvvvÿ¬¬¬ÿ·V.ÿÿÿ #$ÿ 2ÿCCCÿðŒŠÿ #$ÿÖÖÖÿCCCÿK)Qÿbbbÿbbbÿ¬¬¬ÿÿÿÿ})ÿÿÿÿÿÿK ÿCCCÿšššÿbbbÿ444ÿšššÿCCCÿCCCÿbbbÿ»‰ˆÿCCCÿ#ÿÿ#ÿOÿ#ÿÿ#ÿÿ#ÿ#ÿ{ÿ{ÿ{ÿê60ÿêêêÿê60ÿÄÿÿY ÿY ÿY ÿ-QQÿbbbÿ$$$ÿ+ƒÿ444ÿ #$ÿ$$$ÿ444ÿOU„ÿ$$$ÿbbbÿ\††ÿ+ƒÿCCCÿCCCÿCCCÿ444ÿÿÿbbbÿCCCÿCCCÿCCCÿÿÿÿÿÿÿÿÿÿÿÿK ÿÿ #$ÿQQÿ #$ÿ #$ÿ ÿÿÿÿÿÿÿ #$ÿ #$ÿQQÿ#ÿò‰'ÿ})ÿò‰'ÿ ÿ#ÿ#ÿ2 ÿ0P'ÿS*ÿ‰…VÿS*ÿ 2ÿ 2ÿ 2ÿOÿ444ÿS*ÿ¸¶LùÖJ´ìùÖKª‘‚´¼µZ†ÿOU„ÿ;5.¼ˆXÿ ÿìýþìýþ!ÿ¼ˆXÿ;5.èèèÕÕÕÕÕÕÌÌÌ­ÖDx¨ÿü ö?þ½òøöéüÚÇÝÊÌÒÄÄËY5/Y5/þçýúÔä<<564.<<5ÊÌÒ½½½w{ª½½½ÝÙª½½½‰…Vÿ———w{ªçë!žžž Oÿ 2ÿOU„ÿ„}qÉÔŒŒŒÈÈÈh_=OH5+ƒÿOU„ÿ+ƒÿó±6F ÌÓö4- ÌÓöʺó4- ÄÌôþçý³ÛôÌÓöRÿ®êèèèÿÿ```¢¢¢ÒÒÒ   äää¾¾¾0ÿS*ÿÌÒâ³ÛôÿÞÿÌÒâS*ÿS*ÿ¼ˆXÿ÷Îûåþöûåûå 2ÿ)Ùnd’äæöööE/.?³ÚÛIªÒnä|(–Q*ÅÔú;,]â IDAT/³ÚÛ„ÖØ!ÿÿßûüÿ÷öí ùÕúTPÿ›ƒT,  ÿ÷öÿôôìýþ!ÿ, ›ƒT½½½ÍÍÍžžžÒÒÒbbblllžžžìììIªÒòòòJJJ õôÞä †êìãifmmmÞä žžžvvvÿñïÆ¶¶¶èèè {ÿòòò‘åýÿ òòòööö ÃK ÿ½½½ÈÈÈbbbÿCCCÿ...ÜÜÜbbbÿ444ÿCCCÿ³/ÿbbbÿbbbÿbbbÿCCCÿ½½½½½½CCCÿááá»íî½½½ #ÿúÝ#ÿÿòòòëã÷Ôë õÿÿë…ìñY ÿÞúü%(LFììë×úû¿ 5ú$$>>>3* õô!Pø_ú$$ÑËËCCCÿ444ÿáááCCCÿWWW333òòò ööö444ÿK ÿ{ÿÖùû=þû!ÿ{ÿ õôðÒÓóãÿëê&&&ŒŒŒëêóãÿãµÒõ·Vÿƒ×ï·Vÿò‰'ÿ})ÿ})ÿò‰'ÿ·VÿöéüòÝúòÝúëÎ÷аÙS*ÿ—Åù¶Ü.éÛ­ÖHé·KíúÓ¶S>ùÖ*~LDK±»/ÅËÒtQ(`N&ÅËÒöööÚÚÚööööéü4.öéüöéüÿ­¯Ø‰…VÿúÔäÊÌÒÊÌÒŽw{ª‰…Vÿ­¯ØÅÁ‹ÿ¬¬¬ÿw{ªw{ªžžž———¬¬¬ÿ‰…Vÿó±üãOLR55< šdJJJ©©©áááËËÄÍÖÿ±´®äâÌ 2ÿÌÓöµô÷ʺóÌÓö6F !ÿ³ÛôÌÓö   öööäääÒÒÒmmmBBBÚÚÚ¾¾¾^^^ÌÌÌ0ÿÌÒâ³Ûôÿ?þ öööM% ÿ³Ûô¯µÜÌÒâÅËÒ÷Îÿ 2ÿ þöûåûå²ÿ6óî„ÖØÿ/سÚÛM&%ÿ„ÖØní –Q*/{ÎÅÔúj0 „ÖØòòòÿÿí òòòÿ÷ö÷³ÛôÔàøùÕúÅËÒocLtQ(í  `N&ocLÅËÒ½½½BBBhhh”””áááÊÊʶ¶¶ööö櫱Ú1›ÆæY 4ÍïÇÝÛ²áã JJJbbbÿèèè¦ñõÿ òòòèèèÿ èèè÷öµô÷ÿ888ÂÂÂbbbÿbbbÿÂÂÂááábbbÿÒÒÒäääÿÊúúJJJˆˆˆCCCÿCCCÿ½½½ŠŠŠàþúÝòòòëöööõèî ð èèèèèèòòò§òõ0ÿY ÿ§òõþÛØììëÙúüÞûû)×úûAöóÿÿºÉ!ÑËËú$$ÞüÍ!P7=l`fœÍÖÿF7ßïÚ2ñññáááÌÌÌ 333CCCÿCCCÿ©©©ìììòòòòòòÌÌÌ!ÿæñõßûüÖùûÿßûü…ìñK ÿèèè õôë ÷þÿâÐÏTTTŒŒŒ|jiöõëõèèè;3 wÙ})ÿÅÍôu`:- wÙIªåÿÿÿ»ä39,AÜgSQ(ÿ.­Öë^ˆÿÊüþÉýÿ«ýÿU‚´¼OJC±«|S*ÿÌÒâÔàø`N&­Ö444ÿ½½½ÿòòòÿü ö÷ òòò ÿ&9#аÙSQ(ÿ64.‡³Öùû, Øþü&éþçýµô÷‰…Vÿw{ª¬¬¬ÿ———½½½vvvÿŠŠŠCCCÿ‚~H;?u 2ÿüãOLR55<ËËÄ55<|rüã÷ÎK ÿþçýµô÷·Vÿ–Ïñ4- ÌÓö³ÛôRÿ®êÿ ^^^¢¢¢öööòòò444ÿäääöööòòòvvvÿŠŠŠM% ÿ³ÛôM% ÿ4.»ä ðîQK$ÌÒâ³Ûôÿüé 2ÿùÛ ÷βÿNãêÿòòòSQ(ÿ­¯ØM&%ÿ/Ñüý/;,–Ð÷/„ÖØÿòòòÿòòòÿ÷öí ú(³ÛôS*ÿ­ÖS*ÿÌÒâÁésE­ÖbbbÿJJJ¶¶¶ìììžžžÿJJJ¶¶¶ 8*ÖþÿA;žžžbbbÿJJJTTTbbbÿJJJTTTÿ èèèÿ öööòòò!ÿ÷èèèÿRRR¢¢¢BBB$$$fffbbbÿžžžÿËËË&&&ØÕé(+ááá½½½bbbÿŠŠŠÿòòòÿööö èî õèèè#ÿúÝY ÿ×úûÐøú{ÿqGIþÛØÈçæÚúüïýýÞúü×úûæüýC ¿ èèè+ƒÿF7ßú$$ÜܺÉ!äÞ¯"QF7ߺÉ!äÕ}CCCÿññññññ½½½CCCÿžžžCCCÿ½½½ÿòòòÿ öööòòòÿòòòÿèèèÿòòòÿòòòÿòòòK ÿµô÷ÿÿôô ÿôô ÷öí òòòÿööö ööö;B2ÎçþÏÈ÷7ãñ±­¯Ø­ÖSQ(ÿ¢xÉýÿ«ýÿ×·½ÑþÿÚÿ;5.4.­Ö;5.ü ööéüòòò0P'ÿöéüÚÇÝ#ÿ­¯Øw{ª*ããú&éÚÿSQ(ÿw{ªw{ªTTT½½½ŠŠŠvvvÿ½½½çë!üã±´®|rËËÄ|rËËĄބŽOLRüã÷ÎOU„ÿÖùûþçýþçýÍ ·VÿIªåþçýÌÓöÔàøM% ÿÌÓöòòò®®®òòòÚÚÚ^^^òòò¾¾¾³Ûô³ÛôocLòòòöööÐøúÌÒâ4.¼ˆXÿÿ÷Î÷Î%ûå 2ÿ 2ÿNãêSQ(ÿÿSQ(ÿ­¯Ø³ÚÛ³ÚÛÑüý³ÚÛ„ÖØÅÔú/³ÚÛ„ÖØ„ÖØòòòÿòòòòòòí ÔàøTPÿ­Ö;5.4.÷ö­Ö;5.bbbÿttttttbbbÿèèè¶¶¶õ ìüÔÍïÇ÷ñÈžžž("Ížžžvvvÿòòòèèèòòòöööòòòÿ÷èèèsDÎe®®®äääìììÜÜÜvvvÿbbbÿáááÿñññðððÖùûäääááááááÕÕÕáááìììCCCÿòøÿèèèèèèòøð úÝèèè §òõÐøú0ÿY ÿÞúüþÛØììë$ïýýÞúüµ)C "¿ èèèäÕ}ÂÂÂÜܺÉ!ž§ÐäÞ¯ûåäÞ¯ºÉ!äÕ}+ƒÿ444ÿ½½½ÌÌÌñññ½½½½½½žžž½½½CCCÿòòòööö ÿòòòèèèÿÿòòòÿÿòòòòòòÿòòò!ÿµô÷K ÿÿ  öõöõ÷öÿÿÿèèèèèèòòòèèè 27£H1û8ñÿ¿û É­¯Ø‚©{ùÖ±¶½OJC׬|ÿÌÒâí Dx¨;5.CCCÿñññðððñññááávvvÿ ÿöéüÿòòòÞ¾ç ÿ÷ òÝúM% ÿ,EÚÿ åþþçý,64.SQ(ÿàÝÙªó±÷Î÷α´®OLR±¸Ë|r55<|r|r±¸ËOLR±«|ÿ*Í 3ôñaÂýÿÖùûËó *ÔàøM% ÿÌÌÌôôôÚÚÚòòò ðððÖÖÖÿ0ÿÅËÒÌÒâòòò³ÛôÌÒâÅËÒ÷Îÿ÷Îüéûå 2ÿSQ(ÿÿ*óÝÜ.RRRÿM&%ÿ³ÚÛÿœîðœîð³ÚÛNœ€ IDATÿ÷öÿÿòòòòòòéëí ùÕúÿÌÒâí Dx¨;5.ÖÖÖÊÊʾ¾¾ŒŒŒtttCCCÿèèèóÝÜóÝÜèèèèèèØÞ3ˆˆˆÊÊÊÝÛ²ÿÿèèè£Ò&ñôôô JJJ¶¶¶ììììììžžžšššÿ½½½èèèËËËÚÚÚêêêí öööËËËÕÕÕ½½½èèè½½½žžžCCCÿëÿÿÿèèè #ÿõàøÝèèèÿÿàþÿÿÐøú¿ "‘ÞߥòôƒìðÞúüµKýµ èèèø_ÂÂÂäÞ¯"Qûåüéó±äâÌäÕ}äÕ}444ÿÌÌÌ444ÿááá333...444ÿÿ&&&ööö ÿèèè÷öòòòòòòÿòòòßûüµô÷ÿÿöõöõöõöõÿôôÿôôõÿÿK ÿÿÿÿÿèèèèèèÿööö;BÐýÿ>[6ÆÖüþêÿ&&&ÿ׬|OQm)IC±«|)T„ÿÿ5 ôÅËÒËó ÿÅËÒM% ÿñññ...333ÍÍÍCCCÿöéüÿòòòÿòòòöéüòòò,úÔäµô÷&éõµô÷<<5vvvÿw{ªCCCÿÅÁ‹ÿw{ª Oÿ÷Î Oÿ÷Î÷α¸Ëüã÷Î|r÷α«| OÿÿÍ þçý3ôñÍ 3ôñ*÷Ëó K ÿ³ÛôÿÿòòòÿŠŠŠÿ    ;5.òòòããú¼ˆXÿM% ÿÿ 2ÿ÷Îüéÿ÷Îûåûå 2ÿÿ*®®®­Ö®®®‡‡‡ÿ³ÚÛÿÿÿÿÿèèèÿßûü!ÿÿÿÿ ÿÿ?þÁéÿ5 ôÅËÒËó ÿÅËÒM% ÿ¬¬¬ÿÊÊÊ666žžž...ÖÖÖiiiÿÿÿÿÿÿÿÿÿÿSQ(ÿJJJÌÌÌŠŠŠ:¬¬¬ÿÿÿÿÿöööòòò òòò!ÿÿCCCÿvvvÿ>>>èèèèèè>>>888èèè¶¶¶žžžÜÜÜÿööö òòò èèèááá½½½ èèèòòòòòòàþèèèúÝ#ÿèèèèèèÿöööµô÷“úÿ“úÿ""µ×úû èèèäÕ}äÕ}ø_"QäÞ¯üéó±444ÿÌÌÌ444ÿÍÍÍCCCÿÌÌÌCCCÿCCCÿ½½½ÿÿöööÿÿßûüÿÿÿ !ÿÿ ø ø ø ÿôô5   ø Öùû!ÿèèèöööÿöööÿÿÿÿÿÔüÿþêÿ[Ç:*þêÿäääèèèèèè)T„ÿ׬|ÿööösE»ä?þ4.»ä èèèCCCÿááá½½½444ÿñسÛôÿü ööéüÿü ööéü¼ˆXÿÍýþÄ ¶³ÛôM% ÿËó 5 ô<`J<<5;?uÿ­©s±µëà“Âööö qm>#'Vlllèèè Oÿó± Oÿó± 2ÿ÷Îÿ íì*à ööö ööö=þûà èèèÿ JJJ¶¶¶ööö&&&...¬¬¬hhhŠŠŠS*ÿ;5.‘´Ëó ööö"úø4.—Åîèèèÿüéÿüé 2ÿûåûå÷ÎRRRÿ555‘‘‘oooyyyÿèèèÿèèèM% ÿÔàøí ?þÁé èèèÿööösE»ä?þ4.»ä èèèÿèèèÿ5 ôj1"ŒíËËË©H –ÏÞËó èèèÿööö ôôôèèèÿBBBìììžžžÿ+++GAì"(}TTTÿööö öööòòòÿ3ôñµô÷bbbÿÂÂÂ>>>¶¶¶JJJ¢¢¢ööö555888fffÿ ôôôèèèCCCÿ½½½#ÿõèèèÿöööòòòÖ"ÿ*ÞåY ÿ¿ èèèÿðîÐøú Oÿ÷È 8ó± Oÿó±444ÿÌÌÌ444ÿ333ÍÍͽ½½CCCÿ½½½CCCÿ½½½ÿöööòòòÿ÷öí ööö÷ö÷èèèÿöööÿôôí ÿôô  í öõø òòòÿööö èèèÿöööA,µ×¯ÿööösE»ä i;­Öÿöööú(Áéú&éËó èèèÿòòòÿòòòÿòòòÿòòòÿ­©sÄÄË“ÂöööECi70Dx¨ÿööö ”””bbb555iiilllqm>w{ªM% ÿþçýÍ ööö ööö èèèÿööö öööTTT˜˜˜ êêê èèèÿðîQK$ÌÒâÁé"úø³Ûôÿüé 2ÿ÷ÎÿèèèÿECÿ*ÿÖ»½æECÿ*ÆÆÆèèèÿ5 ôÔàøí íì÷èèèÿööösE»ä i;­Öÿööö©H W¸à èèèÿèèèÿèèèÿöööžžžlllöööžžž¶¶¶ÒÒÒÌÌÌÿ ööö ööö÷ößûüÿööö öööTTT¬¬¬ èèèÿèèèÿòòòY ÿ¿ èèèY ÿ“MMm³³×úûèAöó§òõ Oÿó± Oÿó±444ÿÌÌÌCCCÿ½½½ÿööö JJJ¬¬¬ öööTTT¶¶¶èèèÿèèèÿ èèèÿèèèÿöööÿôô ööö èèèÿèèèÿèèèÿ÷7&4ôñññÌÌÌÿèèèÿööö?þËó èè輈XÿÍýþøÎÔ—ÅîöööEC64.ÊÌÒ­¯Øÿööö èèèCCCÿ½½½ÿèèèÿèèèÿèèèÿèèèÿööö èèèÿèèèÿ5 ôËó ööö èèè 2ÿ÷Îÿèèèÿèèèÿööö èèè&\À¹ IDATÿööö÷ö, Ëó èèèÿèèèÿèèèÿèèèÿ€ÿööö èèèÿööö öööòòòÿèèèÿöööòòòÿèèèÖ"ÿBöýèèèY ÿ§òõ Oÿó±ÿüéÿJJJ¶¶¶èèèÿööö ööö èèèÿèèèÿèèèÿööö èèèÿööö èèèÿÌÌÌCCCÿbbbÿbbbÿ444ÿ444ÿááávvvÿvvvÿááá444ÿ...áááñññÌÌÌ444ÿÌÌÌCCCÿ333ŠŠŠCCCÿáááæóàöéü©è3b IDAT444ÿxxxááá...444ÿÌÌ̽½½ÍÍÍbbbÿbbbÿáááêêêèr#S*ÿ444ÿ...áááññññññÌÌÌCCCÿ333ÍÍÍááá>>>¨µ¢ êêêòòò444ÿÒÒÒñññÌÌÌCCCÿááᬬ¬øë èèè444ÿBBBÍÍÍññññññÌÌÌ444ÿÌÌÌÿü öööö ööö èèè”,#I IDAT...®®®ñññÌÌÌñññÿ ÷ ööööööòòòöööÿ444ÿ444ÿ444ÿ444ÿÿÿ444ÿñññÌÌÌÿòòòÿòòò444ÿÌÌÌÿòòòÃíX IDAT444ÿÿèèèÿööö èèèÿèèèÿööö èèèÿ5"€S÷IDATÀ?ü¡ùÎÿÉúqIEND®B`‚angband-v3.3.2/lib/xtra/graf/Makefile0000644000175000017500000000016611651552410016715 0ustar chriscchriscMKPATH=../../../mk/ include $(MKPATH)buildsys.mk LIBDATA = 8x8.png 8x16.png 16x16.png 32x32.png PACKAGE = xtra/graf angband-v3.3.2/lib/xtra/graf/8x16.png0000644000175000017500000011253311651552410016473 0ustar chriscchrisc‰PNG  IHDRÀt91È,tEXtCreation TimeMon 27 Jun 2011 00:10:01 -0000ë÷ÃtIMEÛ7g6\ pHYs  d_‘gAMA± üaPLTE€€€ÖÖ¥À€@€@k1ÿÿ¥¥¥Îœ)ŒÀÀÀÿÿÿIk9@ÿçççPPPÿ„¥J­ç÷0¯ÀR) ÿ^¿ÿÿ  ÿÿ@@ÿÿs”ÿ”Z)ÿ„„€@²oý555ll0ss{”>ŸÿœÿB!½½cÖïÞs÷¥k­÷÷÷Æœïcÿÿƽÿ½™RR!ç!sssŒ÷Œ)”9!ÿ„ÿRR)ÿ¥¥k9ÆÆÆçÞ”””{”­”¥µµ½Îsïïç﵌ÿsB66-''­„)1))ÿ€­”šª­µÆZZkµJÿR!Œ”œs9ÿJÿcks{„ŒÎÎÞÞçïçÞÎ1997©ˆ tRNS@æØf“|IDATxÚ콉v\É‘,@¬I‘ ¸‚,¼Tž’8êbMW/R/Ò¨zúIýfúÍ{=Kÿÿg –s÷{3o®H€;'3¯çÝÃ-<<6üïÿZP÷ÿ·;†ã‚ÿþß'júüÇüßÿñu½_Ýÿ¯ÿú^é9”þC×¾{%û³Î&ÿû¿gùìl6ùøx†ÐO€ÿïã з ð ÌC€íüN‘“î?Vl ^ªØß“äÿ÷ÿù?I~C½T±¿'ÉÇÇù )põÝUñdÐG€?üøÃú ðŸÿ©íÿüÏ® ~äþñØ è#Àv^ëü€*¤½Í`z"Hý"ÂtŠ·,õ_a`Q@õú eÀaœe@^ˆ7欥(X†0™þ³¶ÿüçù€œ¯ï!œeP^ˆ+·‹+/`õ`:è·›þP<Í_gä" ªÿöZ›÷éd›©7ªxH¶ðßnÂ&@´ý ¦!À]ô–e¬ä!y¢x³ÀµVû3 -Àt>ÀÒ °r °hÙߟϧ´ËñþßKÌO€hºé?ÙÌB€‹‹Ûh­Z­ÓþÊü/ÑÌO€a'p²p¸! 0o5p!`9>Àÿ3Âx —ÏëÌV ˜T ¼ az¹Z€¨òIòÒ[—E€ùZ§¯ÞV °ˆò§Wû,îü! ŸjêïL®Nj œ¦xûÛ«J½s‹[€Å  `ž–Àþj ï~j·ÊÌêÔÇèîÿ?Æ9“}€YŠ ?]>zܘ°,j%@ì^†P>H€Ysx;~òñÓdªÓÓ™óáÒ°W0soÇ/J€··?~üù Óª ¹{^•o^ƒø¯—€êùÛ,À,ÀÇ?ÿ<=dàû÷þüó§kô nAñÌûüÓ<¼‚§ìãµötÇ¿|™‡ùrþëO£þ·oA?]a^ ðá"€a ì_bJÌž#><º‚(`™ÇÇý·-‡Vq¥@Ý/üå/ùúùK¾¾öO£þ·o¿ûîãÇ?ýéçŸI€¬^›ìÝÝ~|øðúuÌï  òŸ?÷þn° €z?|©~Ëy?“L´®/Y×÷þ›±P°¬€ ˆ‘"P/ÕŸ YxýZŠñV?¨°jà¡xâ÷¿€ŽùðÊŹR1¶\o?ïŸÂ0éÿíßÄpªæßþÍ ò~©—úÉ2ÎÖã“QÆõó~âÏÞÜŒ9rLpï'/‡÷~ço|Síþöíwîæ·s?¿ë~+¾Oý¤µÑðý·.ÑOààÀÖù_è³ÈÿÂT8>þ·+(‡Zæ Æý6ï2òC²ÕKÉx¨ww*¶ú!+Á½Ÿ*9!ª_úM*–€J·Òe^¾dÞ¦ºù±ú%Kýø(ïS¿!…! ¶F˜žGG‘Ÿ>^B`g‡êßÙé+:ÕÀÙ,@¤r¸=åø,[Á§§Yáý2ÕËD ¢ŒçÉû­ÞÝ]R Ê8>ïå;¶bù/RdK!ãÎ-—þܪû§%€kཡ~63ÍC€gÏ@€gÏDPßÝûöTg/C©by{’Mʳ€êU"lnÉQ½ãd)Ùyß>@,r Õ;ßËð~zÃEÀË—¿ùÍÆ†s<0›°…µxv [{?Ö™ØZR-€*v-@²jÞËx–úY®ûç³V7-€åºßŠÕwô\DK0›0Ù ¤êó?™¢€Õ?xt [ä¤ÀãÇKj˜T T- VéõKýªØ d-ÀNàì>@T?eé°úZÀdPÉ•™PZTÿd ÷?ºÂ»wÏžõûCýKlˆÍ<±È ¶¨š§ëÆj`ÜOÌS zíæZ@¬8Çò?>On p9ïÒ?@ûç#À"èa¸°µ• °±QkTþÒ,Àí<ž¹ÝÇåj (P¯OÐ ú(²Ü–Àn0 &ï6Bß>¨`‰-íøEpÓ¨í­7pͽëÅ-X÷ó4444444444444444444444444444444444444,uþy† ÔiF/_fyx.\íF#À½F A¹i–=ÓŒxyËq²rÃUoPõ&UoPõ&@ ¹?‚ä8=øaÉç#øþ™€GXÕû?¡Êú§>žpÝ}ÞÝÝúÏ-ÇrÍÿþþ›HÍ̓˜`?üðhRàü\™HÏäãs<|øa„ÕPÀSS©pÌÖÿX|~ÏÞå?×PÆ©ÿÜÔ D•½u®y.â|xƧ€úß_bŸÉ…Ä€J77øS˜8“íÝ»~8?‡­À98þüÜÇ’šjÎ)‘« €'©s~~ \ f¾gÙRñþjæS“ T|üçŽ`Yvê$d¤TY@@dD€ÕX©úø˜ÀÊç?šŠ.“ïÉéü‡og“/åß¡B`ù>Ô}˜õè<{&õ €ÔÏ;ƒÑÀdèUùµˆ!kúŠ€ÝÝÉEÀÁÁ+–_ˆ. ]( º€@tõQ^¥ ˜cpM"@L>pÿ$@kÈiQ)QÓf²— °îw™á¥ëKfù> ¡¡¡¡¡¡¡¡¡¡áËG7J_îü©•¾zü¸Î yÏŸõúõø¡óbÂá;GÕŠUbnÕãëþ!yèüY¯_:¿¡ `cƒ}/–k3Ö“Küú×–Ùg™v–Ù×c™± -3r©eöŸX~q‰¯¿¶< iw ®¹`¹¶E£¥™„Ҏ糯*%“·î#r‘Ñí ¨„˜Uº~Ý?tþÐþåšpêõ—ðõøé?ýù³^¿_ñãϯБúu¯‡’{±ß¡ë×ýCçíŸõw£¾µv^Uª_÷ÉCçÏzýzüÐùµã¦&ØÓKDY˜…8 ¬ïzu?c÷•p(㢜KÀîõ½†ñêQF¸1÷¼à_P:$?} 'Èà€QÊe×±”\¯§ý’½[²˜Xýß]ÂØÛCw¼)P¯ÏÑR¦À«Wp‚LÓS¼î:×+½å"”“àÊb¶ýxñBr#À˜\PýOžøŸÉE´H ÕG‹\ÿë¯M€Å‹€†dõwQ °ØP\þ÷õäu§É½Bv»¨9¼¡¡¡¡¡¡¡¡¡¡¡á–£6Ü/¹¶ÜÕ–¹ímôxîç3{.“Ê•üÓO˜ûÓO’1ÇðÁN=jKàÙä³3É''¨çŸœøiÑä'fK!– '8wR+ ol|þŒ† ÏŸ}~n Ì-™W €¦ÊØ 9¶…Cv]x²'=|Ù ðìd/cçÞ2 ǦPÈNð“ÈN€­-Èn¼ÿø²àÃȱ)rl Íž?‡¬ð\d¦€&³ŠxsöP?ÐäUQêçJ¾¤ÔϦ`¦Õo @ý$)õý5Zú˜P?›‚ùP?û ˜¸;›‚I¨ŸMÁ¤Ô‰xzÌÄ.˜­7¬Îý«s÷ê*–˜iå¡Þ°“«¨½a?Zý¤ÀlM¡±)7®1ÎwÏ3û¨~wQýÎCT¿ó r ;Þ‹67s€ Ç Lõ“|w­Î4 úÝ]Dõ»7€êwoÕO @¦úIkõõ†ýË%¢@F M r€Õ_-ÀäÎjkgH5³v†dxï PM @´©þù—_ÿš @õ{¸V Wº”±–‡?=Í&P” §@õ#H%ÀoËP_Ùwß‘ãà7¿aPý[[Ÿ>ÙrLØWD…аP#šèýc@¸ Æ„‹ÂEá"€p HÀ^€Þ?‘À÷ž<æ69¥Ý"pÅ÷«“™ë8råÉ5T âTײ>Aòã$×qø'#H¾^èx„#HV¬_7¾r\\Rõ¥Ë ÷ ‹N ©Máµé{Ö‰!µÞ^›Â[5n©XlbH·)¼öþÍ:/ öþÕ¦puî¬;ݾ@Ù™p{C3ÎÏ3@H€‹‹L´†F ù7àñãL€ííL€ÓÓLP¤`©h…ÀF À$ÉrQ#a{@ñèQ–k0Êz~¿Z§>äèNŸ¨Á*k0Ëš`ס£·Ïï[üF À³3¢¢NO3¢àÛçôˆˆ€û—Dw…@…1Î-Tþä‰;Cóá’Ø››£¶}ÄŒ8:r_â‰>zäÎP$©Ã®£µÞ]¡ãz1î.Tþâ…û ½=÷…áúoߺ/ *ýÚ]Aˆ)ñò¥;CCbkË}a¸Þ›7î ‹”™•þ™>]ú׉"ujÖý+Ýk¬Öº)T˜- ¾$ ”Ð-ËÏžó?º„£\ €‹‹ZdœåüŸ¦à~µ÷.¿=z87–‡U{µ¸…ÀýƽõˆU{³kðî3ÐåêÔÉáhŠ2Z¢¬Åg4E¹–øÕã¨%>‚¢Œ† u§Ù…ÖÐÐÐÐÐÐÐÐÐÐp¯ñóÏŸ®±îgiX~h¸/@½~kë矯„?¬ûÁnlؾ¯(ð§?©¸@GǰA!Àö1†Iu°TL çôpMÖ˜86ˆb$ǰC#8€ ¢èáx-È 1qlÃHŽ`‡0:B8&Ž ¢ ÀñìÆHŽ`‡0Fp<;„1€ã4=ZcúÜ ûü9Ô?jakྚ®Eäýûcî;àí¥Ì®ÜßpðóÏ0ü#÷hà~ ýÑ|€{O ë~š†ÇVÀºŸ¥¡¡¡¡¡¡¡¡¡a¥¨Ñvg•ѰLù¦Q£Ï*ÿñË”oèF‰•ÞYeD ]¦|Ó@·V¼ÿ¬òÿ¸¿¿Lù†ÁÄgã÷<òÑÑrå›ß÷ŸUþã—+ß8k—Ý©³ÊVÌBaQù¦¡ØÇšî1«Œüƒç.*ß8¨Ð¨`ô¿O’ãñ  X¡å¾ýøí“oTèÎNTð“';;OžXÆûG9þoW°BÿøÇ,÷íÇoŸ|ãèW0U’¡ü(Çã¥à˜£)ÅçýãäGŸè€*§Œ­L€®‚sÇ?ãr|µ7> @s¼eÑ#UÁ9‡ãŸq9¾ZŒG?&B+X˜ÊÅ’k'=Æï'En¨þq@ïo(K®9œô¿Ÿ¹Eˆ žÖ˜”õ°Òøý·Ëˆ žÖ˜”Ã)MÚ¿F ZšO®^ü¢òM#{õ³ËÕ‹_Tnhhhhh¸QÔ8D ÷ ÷¨å4 ̉dîîêOÀ\¾u?Ô-B^F±ƒUðîagg?€ÊŸDØl1¬™nŽWåü‚Õ_ÃÌÝE "X€‹KŒ;´®ó¹(M|MoUcb2¿ùO]:u"vÞ\\„f¨!•lm!µ–5o‚“LJæaÔØßKƒ–ðö7€ñi1€ç:¾Ûž@Êò[[PÉxŸ°.ǾWsh*–‚^€þØ÷þw Üíb Yü­-v†ôªõèwv–c¸ÀÔ¯«\‹Ü=TÿJ)0´øÁ î¶'P ü­­ß^â& -ÀQd«ßë/ àn{k%( À€3Zˆ ÅRÿÚ,À@5ðn—þ@!Àö60É \öäÙ|Ň#X¢úkTî%bXCÀJrcN¾»¦Ÿè©ñÝ®† ‡7tËp·K`|•ÿÖàUßÅ ¸Ë¥CCCCCCCÚ°¿ßFÅ®¥Rs²ö÷±”:qvvEL”×§áF}q£»Ù«WËj–Ýßß ¸$ÀÿxvæÏºSæÞ ´û¢;(îÌCZŸ{7î†@X樓‰¨¿oØÙ)MÿQÝØIð?´ÌË @§À,À àà-ŸnçÁÔ­ñ![Üò÷ûix¤stò@” ;ÌvÍ,¯{βû(ÉAn( jc.( í'Wˆ{G¸¡‡[9 ªÉ_­P \ø››ü£?7’T~´´ýGy SÀD/`•>Pq/oÅsKêV »~ø—…D€¨xþÃIò‚ÈŸ?£ðùó²n Ðm—øÒ)0v×qäÏ˹y"€}Büy#/p»tÇ5K}Ùƒã‚Ï˸G"@ÃýC#À½Gv¸&ãí%Öý ‹@­¦DN°·oO.‘(0ãRë ýÎÅh¦FN0¨ÿÅ%°´o¢ÀäUÅö÷Ÿ_"R æÈYsèÐñõyš˜ I)ŠäžL¬þœ#§È¡ig÷øªðú<·kÙ»;€˜`(ÿa‚0H€šã`¢¬°F€›Å<ˆL&"qOoFؘåøF€±JðØù}6ÌnAfÄ*‹€nþŸ•Cd˜ XÄ äùùz&”×UƬ¨W¨ög¨ˆiÀì˜|= R¥ï~]å?ú4éj3#'(Pz;šŒ¡äŸñr3ßm¹×¿‡¸ÛÁ · ÓÊ“V l…úŠÑŸÀI%#!þw½Ó{?ÿ…­\sëÞ+î¯Ë’.êÔïí­2õ¾ÔfÏßèß$ð'ýÅj_Ð)÷Z¥ØJ”ûq™Èøß«W‘ cÖ¨BÔþ¯þH«Øé/ÖöG‚öBGüKÚšž¯^moÇʼn³¶¯/¨¿¼Øh8Àlh˜µa{ »&@°—û®3¸Î§ltLDÅ©àÕ«X ¤ñ:PJ××ÃÐ a.U¬;o5b c(¦³3ÂWèàì,þWGtÙ‡©¤‘Æ!öi chrÐëýä" ^?y½v¼ÿyúäÞ?¦:¿ÁèO°>'j*™¯œ^Àz@Ç©»"@ì1n¸aLL°jj7Æh¼#Ž#@-£‡Ö°bLA€IÇO7¦)f“{ÿl˜÷7M€…žgÜŸócÁ<½) ¡¡¡¡a:<¾ÄºŸ¡aÌ4¦¬:T~£À‘ºVûІ%Ž*@‚xýNô‰AàŒ­­u§Ñ—ƒŽ¶)^ÿ©ÞV7Õ²ó6÷ˆ]?oßj?)Ð9?_¿ÀŠè©–6 ,EÛ=mnæîv¨6’†s?Dä~î—¨çwn øîtÎoX&:ðæõ °¢€:~'÷C€Îõ7²2wvòo=߯ Q`9(pþêÌá¦-€‹íï-:×߀*ý/¿·×pSC€TìæÉ½]-{qˆ3“Àû‡æÉ[± âwv®‡ðt-ÐË“5äa*q;:GÓ`Ì~.ȃ3Bþ'J¸Ö–‡ *¨„XZ2¢×H¸€êCþﹾ߰,$?^HG¬Àä¦WI€ ×§â›ú—‰P“ïí¸[:*2zv'±5-“'_-J€)0±Ç¸u'ß1´ùå wàʭ̽?ØÞ.Á€‹ØðEc» üÁƒî]kÖxÿôO7{¿%-~ ×~Õü«‘x…ÝÝL,õvÜeÄy­Ãø§+ÜÜý– êR™ýRÒÞ ä.ûLˆ­k¬é–„7o Nqü£G×›5 ÉTxýúzóèhmo=%r®Ïò—bÞ¼¹¦@%@ï¹G®)P €ðQþçKtÎýúšk$5IŒtÊ?¢ŠïzCPßV(tž €Ø/_šÿüϸD¡@ÒùÝ&ÀðR·åé P²üÌ(_+Ø› yü1IáUþÂÔ?XtŠü‹€Ž¾Ö8¸=Ž=þŸþ)ëö 38»»=Ú^3['׺Çß%ô†3Ÿ°îioïÝ»Åî*·$*&µ|qØßŸméÛwW˜ÿ~¯_‡ Áz0@€/\á ÷ /Öý,«Á˜È´×Èk—ßV½ôuœÛíмZ&øbŽù£àñÝO€n|‰»-v0Ž ¨ÈØšK¹áé©?BðéC rî*)À8¼»þûßsoVh‡L«ëèá¿ûÝÖÖï~ÇïÕ=ó2ñ`„úþqçø%à4Ë%:jµ`k ú“ ˜†"AJ¾ŃPø^åS/ P=ÞM¨@ü×L€½½ÓÓ~ æÍÍÇýá´«#AðQ ÓO\\@fé?žwÍPý¤ß_3¥Æ€A]¦Œ#2„!ìí½¸ÄξWEÉ€â©þ\\;_œ¨Ðú+"ÀÎ5H€ˆ›"À¬E@ñî¸ ¸U À­ü}Ãøúkàë¯WE€ìŠ#}ûL¾Aå“«yÞåBηêÒHQÍT¿ãy-Å 8>Þ»–hÐ;Zdg/aU‰PC|mn^ësàÔC€ÎÕH‚U=íj! LªâwiÕÀ!¬^ý³¡5±p£ A Ëc$‡`Ù—ˆíÓ`ÖãnÞ¿Ç÷›+¨õµ\*Õ-àxtÜïÿ±ÿÿàï»‹Ú 04¶¡†½S­ Àþþû÷oÞìïS±h÷Ó+ˆê ØÔKÄþr6ýÃÖýf󪋣3v•Õ#6°šÅÔk°ÆU@fÅ›7ïßCýø@©ÇÇ¿û×Ð4¬ &Žæ^$ ÷’HŽø‡ž º·T½ûþ¨zö–ôOÕ3>8dªþzÖ»ªž`{9ßêßÁ/Œdwö‚,»»ÿøÚ«"‰ï»ahóT¤i0ˆ ÀŽ2 ¯­¬Ðð&›‰ïÞ¿§ z~d¤\åqª^ î%ø¹ àw‡PûF¿¼/ @2“‚>sôïO `@½W>@ØËãÙMtW|’”§ŠMz&½ <#€^€ pG¼€÷× ,ØŠåˆÌy¯û ïFþ÷ûPÑcõR½öGêI„—/¥z\÷ûM¨~ k’ßK ¬û¦"á[µV¼¶¤xQ€9ŸV¿R¼(‡ŒÞ¨@èŽã©*Îþp· è.@€ªÕâaðmMÊ,.@¾­ 9`ÝïÖ0ê,Ÿ*×*`íXmÞÉù ÷z¥Ÿ~ŠòO?U÷ðü<ÊççFùáú?÷"noþåÏŸÕÞBkŠ0qzzrå““¼šÙþ~Ý¿îô¼sxüøìŒ$ÀïãÇÏžýôI€ßgÏ=%lw÷ðpÿüœJÆïþþÑÑÇ$~Žêþ§OÕhŒß§O_½úü™$Àï«W§§ÇÇ$~1=“„9mxoïãÇ“ª¿?>®%íðûüù‹qÿ‹KJ”ÜÎÉPY¾SýÝß ògÏ=" ¸ux*@¢SÉÜ::úþ{’€[üçsëéÓ'OHn±ÕÊÇÖééÖIÀ-N¦ò±õñãÛ·$·ž?ó†$àfŒ‘Üš+Àà¸x)¦¥fÄšíÁÁÓ§»»OžŒŸ8q—@õûûÙ3¨ßßT¿¿‘ôP¾¾Ž ~s¦ñpÿÓ§P¿¿Ñ} å몆òõ3ã÷ÇP¿¿Ÿ?‡úý9£P¾¾çJ>zL”!<¹ÄºU·8ïÓ(ïË8ïÓ(ïË(ïËà?Î÷à0ïË(ïË(ïÛ0ïË(ïË(ïË(ïËÌ•÷™ € 9€oo@ŽPê‰?–YÖGp¿ 9r$äHÈ‘ÜoÌ™™T¿)àî Ê_Tˆ*D"€Š@E€ @ý"€Š@E€ "@P ¨D@@EÀBùß0 áàÀú¿ @ý$-I` @ض$ 'Ï€$°ˆû¡~’À€$° lH[’`aÓàK /'>@táD'>@táD'ðáC(J9üReŸ©x9ð¢ :ªÊ „@øÑ „À¹(€²b ¹[“X·Ú–›þþôS¬’®‚±Äj €Ò9%7« @¬‚±ˆïX b5ˆÕ@ V[CÐè: Õ¹ëJ*@ª2UFuA&¨~ȤÕ™ ú!“TßõHªŸûA¦þp6‚äŸF\#ƒž ùá’OF\Ãf~Aòñ’4°ÿzû#ŒÛßÐÐÐÐÐÐÐÐÐ0¢·JßÕ#`9i,ÊœCÄ (»î矮à-7€åÁ€BÆFÙõƒÝÝZ[ÈÿäÁæ:ß³Š1ºøÕ¸Õwý(/'ž]ájSa¡"Z3µE`?·ØRÇ3´åÝÂë+@õÜ’š¿¡tP€ê¿{c¨~{NPœ%(['sËs€øíPóüíÛÏ·âó–¾ëùU^†úÙ÷Éß )?þÚP²À?P<öCý, î˜÷ý͘íÎû°q?í‚r$mEß~çÛ¼ÿìL#ƒ4RH[ú®×¯òJ` @EÛ¶8"Z€»G€‡_<ü•9‡ÒôO’™ÇX@w¦qh]$)áóA€˜ãÑ>Cñ~þ\¯Ù`†Ÿ¸Ú®Î,¤/Ϙ~ø KÝC²Ì¼Ì;®ÅîþÇgÚ‰*Wß{­~X€|>eZ€èP.Ž~ÄçJ¬+„Héòðí òŸhÖ­ÎÙÈÀ–>·dÆe¾ë~»‚öð'À1°M³¯Bê&¶\¯ßw¿Eá"àJì@€R%@´ëVçì   LRxjŽÌ£)&[ˆ>Ø"]Çr¹  A‰>åT…-ÀÝ+à¨xez `“ß'ç2¾.1Ó·ß9™ˆ D‰ê”ò\¹”ËÉrˆµ€>Üõu# gõ5ÀÔýy±L€îþ¨PÈÑ „ 0î~ª¬;í¾|øàöÀ®‚ò>ÝýÃ+‰NÞ«}úÇíý÷k VÜs,¯¸¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡á.¢F-_÷ó4Ü0VŠÃÃé9xŠ1Žq^}gçÎÎàù>¤çà¼C/|HÏÁ9Ôb/|HÏÁ£!ù“àCÊÁž²5ñü÷aðf3cݘ"v¥é9ø 've,›ƒÈ”çR޼Qv Ð9Ñ'œ­ ŒcŸJý‘='¼{„>>ø€t(ô)õåøåR`ˆv(ÿ ³Ù£4;âŸÝ:ÿ­b³«äi 0yáûå"hô0 ÷€¾}rAš¼,Í ‚Fwvž±É<>Éè—B–×f´×óöúäNеQ^E0hº»'Ù€>uO^Üu¨èˆôOÑoÎý@Ux%DÖgŸºóB ×pNŸý _6 %À P Pv]~¤:ú¬$À P vöØôáÝéß >Àx5I°÷‰ã°Æj`ÿÎôïDõ÷M…,ÿM$@ÿÎôïDôïLÿNTŸ×_þ›X ìßyýï`Vïšûåû+&Àà¿‹€þéß`ðß•`Ú¾<ô×î †‚¾t4Ük ´6,ÄÅúîÁS,{íCÊÁÐ¥>cw÷¼ÈýׯÏ÷!={Ñ€±ˆë tvnm žïC¦8xvL²Ð‡t~ûvðtR¾Ä¥Ù{–i¿õÀòÔ}ÛKà òõðAä’T°èž2Âêøgù€ÎáƒÈ”çPÿð? âö ‹|@ÏáE›ƒê޸ݘFÝ«$@˜ßsÀÆD¼xñv„˜È˰c ô‰MùI¥þxÄõzؘL€¸^@ï=| úÄ&ü¤Rÿ¦-@wwþgÀtw‡,@w÷° èþ5IÚ´ÝÝåŸ ÐÝ=\ä¿&IKÁí!@µS`иåÔé="@k‹b"úwÆ' çõ¿S;þ™¨þžj_ýo"úw¦' gúw¢Fûª}K¯ NlêßÿPÀÄo€ƒÿÞrLÿï‹Öp¯Ñúî9€¾™S‹@­ÆSt)_A­´÷Ì _^²k:<¼BügŠé×  ª¿vT4õ"Nðª‰þ¯Îõˆƒô¡ü££JM¤©3&û1EoåX7Rª7jÏNÃDþâü@ÒŒ¦”¯åë#õ‘ÙL.p}tKò“»îmÌE@· ªÇ"€¢@+ õÿâ¤þ¸R*f~G€©{²R?)Àÿ”ûæà]ƒËK’ú;#Ñ®m@, ôø¡Ú¹*d¥@CV@€ ¨xò„êÇ$À4~¨ Kä~}r”„>+ õ¡9ªùß 3 ¡Õh=X|·b`*,×Ìšûyω 7ÙèZÁ š˜ ·Ü¨ã:ÕÀXR{ófÀrk1÷/\ è ¢ ÕÆ-kè¨?·t«-ÿ¯«o œÜÔŠ€†††††††††††††††††††††††††††††††††††††/—X÷3¬qQÊ{ãKXº¸@ŒªIøÒ’¾¿÷¿UÈ –gÁééñ1^øøøô”ÿl0îú{—¸I Ô9$ÏöþR8ߟR¦À2ï7Ž·/aCãåY@/Ü%—~;AgìíaÜýÞÞM½?T5YÆûŽ—û®0ßûël¼}¼Þ?ÛŒ•&Àéé§Kèñ ÈV@•kŽÍê\ÂR~aÚÚ€’ŽßÙÁý<õOæ§[6 ~¾?“êæûîoyLŽÍ Mw‘ßÿü\òù9ÏÖûëþz]O¶º÷ߘ0æ0ìÊÁÛÛ[[˜e¡¥<!Læ^ÿââ8`:Ôë¯ûý³ÅØßçóUJÄëûýÏÏãêä¤Àä÷ï»þ ’ 3 `©&€ *ÁãÛÛR”Xe²»»pþ¤þ‹‹ºŸwS莹ÀXÅÛÏB€j1üþ:~ïv~NUã]Lؾ}$Àø÷_ì(Gfyo2‡ò<€ н^òýðâ¼ßÎŽîÇü³*P%RQWÞÛƒû2@ ~¾¿(¯×G€|?¼?ï' ÷_©ú©$ñŒP˜l© ›ü.º÷!|?8«I„¨idüƒ÷„ayÞ}î•‚yL%@¾¾Žöøïôÿ®ˆHj&8óðLuH)x%l¥¼Š˜@üâ¿|>[¨~&YÞïz?nÏ_„OŸÐLîý}(v²œ&™ŠE€œ<ŸOs.Y•AïßÚê¿_¼þÒß*ƒUö—¡2;Táé©}ÐÐø¸š)@6DW£¢)Ãà Ú‡•¼þ•Âä´)¿M’‘ócŽU¶z°êç9x~›x¾¿ н>“Œ\¯û­êý7úÚ†dˆ°ìêù&@w?gYô[Uþ&ûÓÈ–ª‚¿þ­#ÀP;@%H·¥o<úd«{åèiå¬ åÐE:Òùë°Š÷Ÿ4âÝ;É `ºî÷Ÿ#²ÅP½ðáBõš±Ê‡ÿ R`Úñwåý<À˜Æ¾ñ½ `Óu¿ÿÌ 0¹;JFPþæ?’ï­þ[Ò>÷xˆƒƒøþ($ð=¢ª¶¶LG!¡™Ü>àÅ&ËYa’ù1¡`õO<ŸæL2sNÜ_å¾ë/T ¿‘àC2~©$šu8sìä½{‡÷Ç/þóù<…;¸iØóõyÝx¿ÓSn¯Ì"aéµ+¿M’‘ócŽU¶z°êç9xl›xÖ‰M€îõyœdäzÝo5oïîga,û'ÉγR(U.tôÇOÄ (,ìäý$“dXô«¬v<ÄÆ°0l©*xñ믒€2­œUÒULzÿùÇÇ‘@u?gÙÒ,+ÞÌ åèiå¬ åÐEYäÒüõ¾«ó ªò@Â*°GG\ ¯Œë+t?%€®©ë¯ª9tYã¤t®sk Ä*ßþþÁ†}ïî’&Ï1úã/,Xe•Œewå½=È"@%Œ»CÙÿ‡—âˆ)4^okËØÜÄK×ûqZøî®¼€ýh?VKM‡—ÂûåqÝáRÐæ&ÞkÝêMóÀäØƒƒÃ u Çð|½ÿÊ …ÈDO’«Åˆ ¥sj$»CE x> À67ñZõ~ÂÁð~Ê?«¡ó$zÞ˜ÄUFpØÁyã#På¼^òýðþ¼ß ÅG 9¦ hh&ËXš `‚ Mk;ã¥>tð|æy|›ü‡¼¾ßé)¯¿ X!x§!$ç´q©¥:§~÷ Ÿß%@ÞpÐw?D#9<\Ñx*IþéÓööL©§Q§Œ—ÁKonrHÊA€Ç°4|øPË{Ãøy?rQ÷~*267Ýz¾Ì÷GB3¹¡’!™ C•‚°’V¼Ç6Þÿ"MA-G¼~•ÑÈûÑ‚¬,ƒ¡íq2^É9ZedP܇„Ø‹Ž­æ®ëÉкM¯¿*  2úà€ >IÆ?R ÆH"° õó?<¹?œ l QKÞäþðÉ÷[uø‚º ë¾”ëñÑ äûŒ ÁÞ“ïׯ444444444444444444444444444444444444444444444444444444444444444444Ï/ñäÉÎΓK`{ÝÏs+ñÛk¬ûI€%n/C |l+º€ízüºß ˆj_?r1ÆâÁš]“ä¡ã½ó /.Á­ºÝïC`Ø'lQåÏŸ¿¹„÷s‰ËOŸ>y#Ûžœ -ç P¯^½¼„e„‡«„íï3ÇRGT©–m'÷Kýx î_·fnŠî+cHõ¿y#•Pý^ãêòäððéSÊT?‘²Ãªó—êùòÕ+ÊTÿуOJýÏŸ÷K¤:ÁS*Ñ¢¬Ri•‡ŽÏû¡þ“K|õ)P÷¯[77©_yVê— úevwŸ\²Ô/s>(%õËHý²R¿ €B> …*‡ŠY:>ïßÜ„ò  î_·vn¦mÀx Ð<}zxHИ´1" ¾MÚS€6ÀèÚ¨L gâ«vùÏoÒ@ûŒº x*p`y£=ü«_½áW¿‚|~®X¾çç£ý‚틪2 ª_X·fnu‰3Ên èß?^ŽÊ\PþJ§ÌÅh*TØPàËȯ ï@Þ `þ6è_}uxøuÀ=!âÛ.SŽ«éȳڎàkAF!Ð¥ò?m·p-Ún9ÿÓ ÿÓp ù_ëâƒüÎ<Ï­,#ÿ«Àgݺ™¹">–MGÿ&Æ@j§Ü5Ÿu Óð7Ô¾±áo^Ãßô[üdzþÜßð”x( úø]e_ð‹pÐø}ü˜ÖNVÁ ñ+þ~åQÕóµþ˜ja ºß|cãÙ3.3­Ê‘b¼.AZ¾ÁܸI4ù¢e· TÈÄë¹UŠ'YÉq¥Rô(Ç£IXIHkÀèç²ýOÅAYŒNÅ?~ P¼W¢â¡,9Õõ|E^WEœï*χŠö 4 X[²Ó,ëµ ¢ •Å謰L·ÖA±Õˆ­ }¨ :Ä z”X"€Ð÷,T2>PŸ<ǹçìŒJÔZCX9¶ˆDÐ3õ3ñ à9ðÆZ?á§ŸH„Ÿ~â–ø@ýÇÇ´`²bjŠ›‹Ë”•"â~ÙIÇåÿèFõ‹Ñˆê¢ˆd‹NŸr€N`ÿ‰Q}ú¢€WôgšóµˆfT¿>€( %yD¹ÕßÐpËñ¥¬4~gqq‘×óùå/76¾ùFÒw—À÷2ïHWxòd¥«jÝÔ…IsSMwÁ&•HÀÅ%Л&ù——øæRêû–Ÿe>ï³güUóóùù|K®»[;vpßCäúnk]T0€ª%G ÷ãû›oH¨þääíÛ/–I«Ÿ®*uÊ5|¦ÝKlÅq yŒÃ½C¤Q=u)Xxü8R@øå/¿ÿ066@ÖDß¾íÞ×Õ7nùÜrý[0þT?¶hüY§ßßÇâ.|»ú‡-W(¹õæÍæ¦b´uÏ š©Ô¯š¬×úc•Cê§Ú³úM©=€6 ŸOž|ú¤–-l¡wÞ«’ãÃåY¡~l=zôî> ~líï£ö pks¾¶^¿~þœàÖÑÑ÷—@Å¿X÷ý{¯­{…8ÜP‹•€å ¨åq®p|¼½-õƒP½Ô¯"`°/êðX•—Mµó›£o°ØØ€â¡~€M(¨Ó#÷Rùø†úñvPþóç¨ã£Nll@ñ ¬Ž‡â¡þ®ß3ؙ̭>yX“÷ÇŒÖ'W¸Ö÷kû_§= .ÜhõV¿Àê·êãc¹Ä/©Ü?¾ \èŽQÎ-‰n÷väDèö6憦ڮXŸ vmó‰ò`¸:8Ž¿ZQUÈk€Ýûü<+<[ÞŸg×`¶ ¸2>T¦@,U T¨èü¯¼Oô@E€ïæo'µ) Î'¿ùôþî;­ŠnkDÙÏãÇyÍ×ðÄQáJb@m„ –’Ïêð:ʇ³p‹YÑ*§…VŸFKùÝ™Î÷w–s¿…û5 ²IÖõ1€íÇׯU²býÍ7pYƒ ëøÓ%8[>÷ý÷êï`ÍŒ,ëh˜Þƶ64F•ÜÈ#äéÂPùü@¦òùLåóÃGU£“ÆÄÒ–Çðçæßi _ˆ/Äb‚1@€ÓSVÙ°œŸ³J…-’›û±@-T °½ÍñˆØðæjNNXc茫òy±up€ªôß_ìÝJä£k0S~ fZ×aHöR©Œƒ”MÏ÷'hLZÀó÷ùúü–ÚÉU>®r?ç±ñ…ñÊññŠ11Á4L[ €$ðP±V »æý«k+«ÿº8»*,g7PåèRýÑ TAÀm©>ÈxöÌù_êWþ—ú•ÿ¥~å©_ù_êWþ—ú•ÿ¥~å©_ù_êWþ—ú•ÿ¥^å÷I²<¨÷“ ÞUzkR? §œ)ƒ7·úAu_1¥ðæVÿˆn”$hr,Ó ´L'Ðr¶©Z€(P§‚iJçüùî_Ìÿpÿbþ÷Ü"9€9ÿÃý‹ùî_Ìÿœ<æý8H”ÿáþÅü÷/æ¸1ÿ;FÒ,êߨ¨ÑUzAé!"èýE¥ˆ ÷®s¿ë‡Ì–™û-“o–™_,3(ƒÌý±þÉÿ™Pt¡þèBýÑ„ú¢ õGê. ½»€»»„+«z†9Çv¡þèBýÑÔœb¹|“d©_€Ô¯"€.µênðÛT/’cîán|bÕ“Ô¯©zЈL+ƒIa™¹ß2“Þ2“ʲœ@IÌýQÙL¬ùÔïgPe²Œœü\AùÁ2š²s2‚jLÓÃõNªÜ’tïÞ‘¼§œ“z#Um!k €ëtò!™VF…ÚXàãîd@ÓBE¾½ ÀÔ1Ô½<"@T?Ã%XýH–¨~Ø‚¨~Ü0ªÉÕd`-€2¸;¿ñ犯°úI«Ÿ ³úI«Ÿ°úI«Ÿ°úy=«Ÿ°úùfV? `õRÁC2ÃX@ý|^«ßòiôFò‰”"ò”ò‘”Bò”/xA»L»l °ûÇÚýc’Ùý£;¤v :‹¹ž–€¨~üFõã7ª¿QýøêÇoT?~£úñûâÅß^BeëÑQT?~£úñÕߨ^šùÉ2¯h&°Qýøõp¾•RB©¢7W*(e”JyxÉU v@–’9?ìí±HÍÁGGl’ž=c#’mŸ-ajb`0x-À|MAÑügðÍ&?ÑügðÍ&¯Í&?Ñü・ʼルFw²ó?-@4ÿ•Ø €ôˆÀóF }ò¨ïK ˆ& ƒM@›€ 6l2 ° È@@ ê2{a`ê±& °'À`O€ Àž€=&{L’=ú›¿ÁõDö˜ì 0Ø@0î=}^ß²ÆJ–@£s´j¿tÐ+6V.“Âì® _˜ð ’NR ŽÀœ¤@Œ Ę„  /€ˆ1Ç@£ ˆ#AÞŸæ*æõ-óþ–iXìî¾~-ã°3(¬9MXrAÀƒT+eòøYRÍã¤#Rã¬~ɱú9+ÈêG¥4ª•Ö ä°úAñÅ€[©Y 0Ô‹Ô(.'‹<ŒÕð:T? ù©,¦!@M ¡¯ XP´*¤ä‘”àîm”Q_§ú^Òk¸(ƒˆàÞÉ+"»÷rä¨ "¨ "¨ "¨ "¨ "¨ "èz»»L4ÕäÜ-õÓž¨¡ÙPµžGÔº¿ÎÑýÔA­÷Sµî§j=¯:¨µçÇUœí8åËÙöK Ó lBl‹ÝpEP;UÔÀPUIWy W5¯UA-,…ë¡XÝ“ªNoØxÛ­b‚1Á˜€Qi’c‚Q!€É÷À†¬®½~=‘žFOdÊðxÝÍÃðÜ7Ÿ^o §Õãi@\O¹_ßÊýúVî”ûÜóE¸gŒpO•&ʼ^ò‰°9"Øúî €QÓ &ÐP‚׬ ¨ Zâ4mØ`³ ÀAz&À(æK/ðüy\ Û9¼>±ðöm\ó ÛqA)l³3Å89Hiò¿ºnXÔ(΄Q‚£€A`"„Hixl™”B¢ù_ ÄŠ œÇ[z>MàóxlŸ'S&Žèáý<6ïg Ìç·…æó’ŽHM.§‘›”Ac+@lò Ö˜LHL ÀÈE€š‚L\¨H0r ¦ S '‘š‚8ìÅÇç†%[€L÷Nƶƒh2Ü;ézL$€{'™ö~"¦y •{H7”¥†.ÍÓMè@™±ƒr!€õ¾"\'µW `h*§e%¶ Ä”xB\‡”ˆ+†hê¨euí çç*0|½«BåúiøD*Ô9­Bàúø‡º›ÖÑÛñ U¨sZ…€ÈgàÀË¡j{MÚW%¯:§Ãû]r¢@ìÿæÈ÷Ç0ot,² ìÌÝK''°€:I˜Ž kYí'WKt"«ÃÈjç(²Úmùdµs¨âüšÍ<¿»Häm¡K;¸8n6Lu³ÁŠœvpò“æ©»š§ ²§cG/ÛµbOÇV3‡gã@öx5sx6dOÇæùl…d§Ô¼ Ÿ!R>óƒÏÔ¯öw#0u\i[«+ u $„ªì S9nUÂÙ5ZÓhUãöwßqÕ¤ Ÿô:zPîÍ“)×ùçu¾yÆÇÎÝuZo0~<Îwõ“^È|ÊïÛžMý9½Ú @‡—/©~6ƒåzºêÏéEõg LZÒCÂ4¾ÂµªX’ƒô0Ôs%©?_Ðôg Î?¯óÍë|ô:½ÌGïŒ7¨ãâtl¯Ð§EçSàd ™ô®úcï¿2“*÷Ò!S€ 8¶˜•Ž!6Yý¢@^ãh \),«_´a¯©¢üŸ-€#à¬{:¶F$¨)zvDݯüÉȈõ~^Ýêç´xΈp””¸Èî0"º$`k…†¹ƒ¹EEg »KªÿšV?p¶ú1è9×rqz¬åêu¢úc-r¬åB޵\ȱ–÷[ýÏÈ&ºѤS啦@%ÓPPË[ŒžLõ‹µÈ>@^U´‹®È+Æ:šþe¸^Q ‡®Ë¿zåÙ¯$‚Fߨ«C£oÔÕ¡Fuuhtº:4šG]­£®ÎQW‡ö`š“|€8$mvD=NýyÂ{¤ÔzŠ8³Þ½óñꦀ]@*Ÿßqö^—R¦@œCU}*5º~]õÇPÝ ß`”žT¿—[Õäg;‚Kìî¼ H0ÔÝyzŠäõb˜Óù(M´U$oêg’ijœãû-À$DÕëW6€çZ Ý~q wOëþ¦@]ÞgV  Ü¯oåþH€%vw^`ºéؾޢ«uW¨Œö?Ñ­ã2Ò2úR¢ÍpñR-Áè2[ý¢@œúŧÕ8Þn”öH~Hý}¸:'öæƒ 6þ, –<{sÚ騱Ë%.Ù>rÍ \°Ô÷ÒËÌûÎsV?ÿá’U²Ó [e™\D/  .[Ww›L«Ÿ`U1ØMAŸ?›h úð!FŸÀoŒ6ß¿1zc¤éØ›q´~ãh$ürü€§c/îf hærŒe×Þf޷¹}|Ìo/ØÞ%@× ÌˆÈÈ>ÔNå‹òðÉa7#ºn  p|Ìoô"h@GlˆÍ@KžŽ½9ëtìXþ/BåÑ.`ÕL€ªð.òñDô3ú‹€üÛgD€_üBÀ£©i Ï8ĪàdÐVô"€#`d,i:öæ¬Ó±E&žŸ¤@Ÿè ZË18† J&)ÖG€þz@tc@ Þ[kTn V”±iŠ€BQÀ½¤{–<{sÖéØ|\wE/BAÑ $g§.ª¼z¹PCÔ/}êm'"@Wý¦@¿¨f ¨~ ÷µF pÁŽ¢~R€MAâ€&?ØXp:öîìÓ±cÀÌ$â#/s6a·˜}zO÷î“»Çç–†ØHµWõÇÔÒÔ?œ¿èÆ_S@[9ubK ÷¼†Ž.êohhh¸ÆûkÌw¾ë€ÓÊ_]Aò»wܯzÕ×_S^MW`CATû<€zY$RÅþÎð–’?]AòW_Ñ«$ ~ú(¤ÔψsR૯&Ëy]Žnÿ}=þËÃP­ â¾Ïý¢G>ê§O @ÆjH(™kAc5hÈP?kM ösmh4òø·oÙ  Ìñz_6äøÍ¨ï×Wpe@ê§BHüOÇ•Àñ>p¡ O°nipY<€«Á›\(Ü`‹° K0'¾<  ú¨YRnš—P?«™ ä÷ï©`¨m£ˆ]†B,‰ýœŽŽÑß<^±Ù¿ÿžò­²¸$È–ÙÌDÎCæˆwÞrÄ‚¯‹R-ޏ":ÆîÇ}µëgkK½“œ¢ªÕc À|;wŒ@õÔ`·@$g#˜lÝЂ˜·È€w‰oÅû—¬a™ü V") õt¼Ö#XŽºûÿ«½}5ŽªÇ(p4(Û!Àò,À­«è⺜)€—C8X>ÍK+<ªæ¯ØÏ|{þ!©çDÏ¥žz››î&³˜¾'Q›§iòÇËqžƒÔO pI\Í×P»ÞTðB{´îk¡ð`€9,Ç'Ø™Óx’µpŠŒ•ÂbÈÔ2 vg¯À—¶,8¶0qzªŽ~ïä`Ï››ümÌG€èo0_Sýnªó´ªìi.¯^²À¯¬+Ó˜E–ßžgÄ:€û‚({nê/æpT¡×?¸’<_°©#<ÿa~ ÔŽúÏ À$ úùÁ9(¢%ˆ€gl.Nªˆí€Ój§sÈ_ªÿðPÙ ™Aƒæiü/.øá-MýçÒ„êžs^ˆG×RyZS²Q•A%²*ƒVÛ"^@vå,€ÞÀH‚å¨s¦'@ßÔ¨_M>?$€ÔqAHýHý6ïû]a] BV¼~ã‚ô,°Å_&[ì¸ÐŠä“Ãn'bÎë^ 謹V?›‚NOÕ$ôàr¥ÕϦ «ÿjÁ—+pèÇmVCCÃüø0%/q{BÖ7$TmÒäÔahœ¶Fi:^at¼Œ¸ˆÍºSbZ̼~Œç.÷ž?$àoG kíÿKä8’gpt$û¶(Å Zë(bv´ðròÜÂL¸<Œ|:ħç=b =³åè²u–DÛX§²Eê!a­¢˜þ~àþ8p}ƒ‹`QÉZÂL2kHSSàãGÜžC(é¬i. ðwå㛉çéÚ} ©ÀÓðòL RßÙÙßÇëà›gä˜-ŠV*yLÞqvhª¹ž_!õDµë‰®ÇKýš7"õk^ˆÔ6@¶2EÑ ~<1(€Ô à£ôÔ¼’~p= |(CõüP†êù¹!¨kÙˆùc2¶[‘A‡,@m¨Sɾ8Ä…ÛVA€ÍMµárš"@«GÖTlM)ï¹(.ÉÕ)M4ïå ³ûšp.ÉÍ”“é郔ÝvO¹N–­IP= ì¾Êµ`ttŒ‰¤þk ,½XÄàà'åG }èÎ$â^ô^¿ŽE$)Èu€ês̾(¯§™˜±ŽA `Ù³L8W:Ç^'âóÑX¦°L `9ÄŠwø L\a‚Œ–%Š×‹ š“39™Ù‰ „”ï6Ûù­_Eärd. F+É.•œ@¾o%€£1D Ää-Á`€¼W"œe lÉÁ]#ÄI/$,»os.Fì(1ì¤`wpì åR¢²XP&°È€²p#×!ÖºUw5—&UäËósÊj&?9™’Ùð„xÉòœ„6 Ó ÎƬ »yª|—PKœŠ‡c4ïŠgÏîÜ©" "&ÀU™¸ä"@·×ÄÙV¿)Ð ÙâA#ÈErh]&h-âlÉ~ØpxhÃ7O5pÝE@^žcb°±Ñ e¹‘—aÌ™Úw–°Ä#Ô^èìµ>j$€¿‡«Ñ ì{_.åà×4öæiZ7fðz °T`qÈü늵ü_”9ÆÐâíz‹(׆æL>u”k­LV£œ À§®ZˆrYèšÁ,ÃÙÄÐÃÄL‹ñø°þ2fóô¶ã-@ט‡ÝÎðÚÐ\ƒìÕ1Ì5âbÃ_ƒZÔQÒõi³Ós„Q @È¡ýò*ÖÀ }¥·‹¹!HÞ¹|uQ}ŽÙj yÖ¾€:\Ã5þNnб“Õ`h: ÁmUæo lh¸YhÔ8¹aŠý~7Áqnš БãÀ¯;:lÅøî˸Zì·ÅvlTÌ ŒÏ}„ i¨H—+²æqJè¦ìÁ£Gß}‡Ïòpx„[lS‚|ÝÁÈì™ûðªú\©lpS@‘9XË`ßHŠ>~ÌÙãä³3ÈnH¨ò¬×ÂÀõ;`èù'^ŸêÇd]R€ê§|EMiéàªæÂ0ïÑ Pýö@5ÍÒõ<(¸ÈP?W«~û6·¬ œ»æzð¬ryüK>{¸_ǰ­ÜÖ¶^¿Dì‘ú¯íñðóåÃiÿ ¤!w‰±¾2ª·ˆ¢É‹+¨©+!l£ñ„ }>?!ʉS¹:w·Ê5¾næòâÀ¢lñnš×|ÞÏfÒØXZ/#Œ¤þë.Ä¡çSظE ÀƶZ„aa‘ ®Ê¦Ȱ•¸¦pp`'pD¨ž LYœžâyãÚáYÞÝÅÔN+±)¦DŒÞN•¥‚ñòƒœåç½°z:¦8¿¹‰ã£¯•åîñ—ýƒLõ“=Çwïwr‚óÕ ÓösÒŽÊ|´Ê·6º;Ú€ zäÂÄüU+”{x¨||@p ¤€§ÛÛ/^@¾f(U?ƒ ¸(rS*ž(zdÿ²Û–ë€ €$ØÛÃõU䡉&›ø|ÿ®\û:..pý‹‹qxþO¯žƒÇë²¼éü«þñ°f#T®Ø´")Àß8“9àºê®b@˾ÔbÀ¹¿êV"ƒÀµ™ó¤S`w h?zÙmÓ/^€6/^`¿d€ГéŸÉûcdÔÑû#y°w|‡ÉÈ-]nÈü¼Gç|>@éùîÎgK¤ðÍÊ5œÃ›3GJÖDv©?d'ŽÕ/ °ˆ3Ü=Bd ¨öø=¨~Æ Ñ,àjr]A#OžŽ²"€,  ິh¼~%ž ‰ÏC™Ç3 ¿ùü#\tÄ(Ú×@À¤B¶t À °8›b;jtjY€”ÎÒ—Ft 1æ¨<¶E«ü7 TÆÆ° x `âP@ùS96D Üd©ŸòW_É$rr'“šÉ>"ùh¯;q`Rd¾›÷«ž×óûãŠ$€ ¦Q‚ºïúdÇ3÷kò·ÊððÁDÚtýø|NO¨àõAí¿&@í¼ÐŠ2—BVôö®c†h‹<¢HÈ!FT&ʈHA£RRíS(_6 O@uÂÞ·#g [ÛHµ°îŠñzŠ&Y³“êý¦üÇKÿ!óêÏðáD•¿™Úo²…é¾ïd‹Ô%@ þP{ÑÖBfçk¨"Õ¯6Áîáp!hbËↂ–yƧ–OïuºPÊï[÷Cy*³û€ÿåÔõ©2º HÌG€›(pw;;–]÷S4¬ u¢ÖªàéÜÓí’ï Ô¦©Þ@Æ&uËêƒ}Í`®ln²ÙL^ùé©'†q'‚-6ik>ßF ?v}¿¸Ÿõ%·³‰<œ¿ å«]FÊWrHùj —òÕv©6S5Kù®Ü/ Hù%hÊà•Ãjżôu-–¢÷ƒ^V•àî’÷÷¹ìÁ'“(‡zF'¸WþÜgJ"x>‰`ãÏ-+~YVäzý:¨O½W£…¸³ãý €ÕO ðüù=UFå_“$ŽŠê8¥:•#GäΓB€eÙ€Úòxݹ2z<¶âúÙëx(.QƒËÎ /âÒ/ÇÑt|œíhàÚõë8ºO9Æ¡^ƒÜUõËZ"ôÄõ¥•ÐAÄRT>ïê»ó)ß¿¯³qçÍS-jÀ2CØ>iL­©8š2—ŒµåΆ2Èã…>ë²ñ×"Bp±¯À:€eÖ,{0በËA-4«™­V×4Ðóv'cÏnéx .@’×&·ÃJÊ:Šãè9à s”âÙäõ¿Ôï5rt Ð †/јH÷ æð( ÉÊÁí1Z‡BÂ(ù—Mƒ„rñz¯jVbø+€_Æ´¢Âñ«õúU]ý"1eð˘V´Ë¡À*€mD%¸IÜ8äšIe›OnÙrËæ’[î©ç–ÿ²Š¯û£çÌÍ"jò̈<ˆÍQ}ôœ°WžÜâøà”jݺjhhhhhhÂ,}úê˜tLÅØpëðàAœ1ÜíÓ¯K4¸ˆÎ ë-n=ÐbÖD·K{ûWiXT/ º«üÔhºìLá²ì ë®äÕ{kpXí·ˆLà ÃÕÂ~¸šHHý"€¯HW#û Àý¯_7Ü,lÁ"U~û¶àÖ @.`-ú Pã…w P§²µûh ç¨KlÖê¢QuªºèT]¼FÀjª1æK Xñ××sÿºhÕÊ›Ñ<ÈN`íËË«Œ9:¨ä:io/;µ/3}âñ³Á½-ýûÝO™êÿíoEªßñ+¨~-Ú-õŸžŠ|÷÷ïõþTÿw߉\Qý׿–GDõ_GT°úÓRr†;œz5~ù’Q;‡ëPŽÚYìÜï$‰u€Ú™\ù‹™ÿó7kw @…I]µ_öHk+«sÍѳ¤PW”}Tžý5ž@ñA4= ¹Ÿ ¬©W“ûþú¯½~Ð5rŒ&5¼×UÝjøê%"¸îtòšÛâ€* ]ÄÙàÖàÐŽC<jkU˜û_‚ÃÒo RºU$Ì„°ôáÒÀ dœžb6© <Ž)øøÑ@˜8ô”ˆè4óWa€zìžÄÀ‰‚v¬Dýôbù»9èÈÈ ÜßÏ•ÀXþÇ_¨` p˜À!5ŽGƒaó™€»×Yx¼’s@ÍBÀÝõ,!ˆ…€Ã°pèî«BÀ- ã48 ÝÃ4€ÀXI! Å›™îÛ”úó¯û.¥þü+µ‹îÛœ—QÅvXå¶z(‡‡$@Vø³„.¡h‚ a…øx àé5H€Ók\§K úãC´ • 7@ŽStþ_”‘ãü¿b÷ÇZK#ºaèÎyŒU•ëõL½ivzMÊ&e`#ú×ï“c>Å<ß¿%ˆ.`¨ZÇ9{`«>zô)ÃFwHÖêÆ9744,)¶ÎÈË=®ØË°ˆHæëΰ.ÎíB/ž_V?Ëy«îEM´T‚|ûíºß/¿!ºUW»ŠGí(-ööX>êxºM*4ì…!_nú‘þ3„ ©ËÖeÿ4/Ž…4‹€\hæ‘ùÍ3ΣŒËE>@”íð_$·XÛ†À°¨ÓÍ`¯Mµ››°Ó¶õù] yD€ØN&Å£À7ÐììÐ @ýè.ÚÛÑ™÷ONæ)ªÂ«B¥É eÿ?{vzª–ÈðfrwwÙÚËD??ßÝeËåÓÓÝ]>"åW¯vw¹ð"å¸Â< °»ËØš"À7ß0Pâ4XÔ(’«eE‘¬ˆ!”8óGÝE§§0þô~üñô”5zûû{{T¼úþß¼¡âr+PŽßׯOOãʬûû§§¸ŸŠŠÝ]èD¡4OOÑü葯ÀiJày1L"½lœ"czùu®¼i)º¶ÃÁã‘ÿ»á¡'a1 @ Ô¥‘óߨ~|ËxøÐ mr?ëETz®@é´ó´E*øÛV]aÐêãâBKe;…4 Dg(´íT¨‹Kùò¤|]LÊ—Póg\òoʘ¨ˆGG¨ Rñ,p/gçÉ T^‡~¯åV—×™ãÕa+x„Ψ#‚RlãÉ88Ðê"’µúˆä¸^dä{å~ŰrCÿÁsöð³DÆ]¤0+\`a€"@Pà5YPDE@ôæu5ÄK -½+Îÿ$@_Ô‰¶n‰Ke[ʶ”m(Û8à2D³ä`È<~ À«ÎÛ¤UЮÞ¡©£ðÛßz@Ô³ï:À?"ù¹EÅ+ÿq”ãq€´/^`¥EZ°þG®ö½~åHÓÆº*ñøgϲ|r2C;€ƒ¤ò$Ë ,/ÀêɃüäH–0íóÔåßeÚ䜟€ àä—Xö‹tM€e´tåÚ];t|W@]ì¼Þ®†. U• PâëoÌæ.Šº4.Õo Pý¦Õm€:¸ÕÇ+) õ‹ó€ Ïn~^¶<€Wožßw¿.ÃßzüMP {®ÏѺëü8‚äš!4ˆ\r%|CCÃ"plÎu?IÔ¨]³Êöú¥z6Ì6 Ü ­4$ç!±avx-dz^Ë—õ4öh FÈØÁC<ÐüÃZ8‚ÐÀÂqÿZÓõþu§ü-ÁÐZ¼Crmø9:Âþ:›gZÔZ@mIôÄ Ï äªçŒñöDÿJ¨÷Z|qÞßZ³¨ûçy¦jaj5µÖªW_Ç9‹’ï¼×?ÿ4¦>¸©ØkÜÏ"3±c×ý³ãøç{WÊEàýnÛ'>„ú]Õ™?·}Ù·)°l ,·¨ûg}šÜ{¹¹™{+· £™Pss]=ü]äºøõÄrÕ$FbÛÄy¼ àå݉W¯ {DQ¬­Õ¼çy–­‚Í‚íY‡ÑïÙë‚w/ nFcK@Ž”O ,‹u%RÆ ŽÈÁØ— ûÿݶ>;T€¨Q_%ó?ÌvþßÞöò/ÜB®wþ¢DàV€‹Æ>mi¹”þ gË ÀÙ+qZ5àáC†ŠVz~Ζt/xø= žùÆy±*NNز>_ µ{& p1‚àý @&Ôî™s$€eÀZª—ZãQä©|5à ×Ú¼×k?å‡E«-|g/¤©ƒRíÜ™õéÿ/\ýì9ÿã;æ|Çüï˜ÿgO`TÕ¶Š rµÒy öÃôò W-g¨JÁ¨¢(Y AËÂ,Éôz&bHSë­5äw¢zˆBb¾;Aà5®xùRû磀  `Ñ"€‚E»7=€¤5èÄÎÕyrØö¶’ää]\@ýjÐ~¤'*&¤TKP;€dµ¨»yÉêg2Zý¤€Õχ°úùè»0³;Žðã`Èý€'O¬~Rê×dÝù(àuøòŠ ïîT jÐhÍ/rÌ>Ò@Ý«ø×€Âc;@ž‹Ž•É1¨Âû³FUAɨÚ^.: |ÍÀ‹T‹Ø»¦å<¦-R€r Ûh Ì—¦³ ;æðF Э§îíåÇÇyBŽÁ™kô8¡ÿéÓ<¡¿Ê9~„=€ù½€nد–,÷§ÓøÇÙ…5 Ú"U,6±1HϦjÕ/l`kÕ/¸€p; p+ë w9(S!@ÉjC’ <ʵŒÏ½Ýýõú5ê`•ëñU®S°Î?ëNéÂ7ß Þ '‡MƒºRfÆé©Æø1‰¾`˾[÷ë<ƒÝ]¯Í’¹ׇG¢ë?x jU^e:èøú|ëx-øVcæh!A ‡¨ý׳-úýýãUVh/ËEYMÿÀ- ¬PÊǘ,#èÐ7߀”êõº2=|¯‹§§7H€:€K Rhn˜ýø½=Høæe¯·Êµ]ÂSÁúÚ†åW¯¾ù Åwßõ†äqˆE€ÕŸgî¤@,¬~S ùúTy,²\¯2)àÞȯ¾BõÕW#±`èöGçþëYïÊÕ •‘µŽPGÙN–» ­×’38I…s ;ÎÆ ¥'O$ó QÀñª`f.Á†¢/ä¨Ö ‹•^)Nfžv5ªö_×CÇW¹ögy%wîäÎÄÉ ­f¹»¿*´veys³î¯êP ‚Ú÷àÏŸï¸ „Ó+_ÔÞB¶ÇPý©Mõµw3 ¨~UIUmáþAý×N &ùÄü VÆZ4äØPb-ÇÇ:*ä8-ƒ |v=¦´Þ?ÊÝýy€ö£Gû«BÙÚ—Ÿ/Ê ^<¿ ÷ö!×;Ì* H¿È¯ @´h €lçØr¦ã»w$({ UDAa4“’Ƚƒš ÉgsQÜvd8nõ*Ä”Õ ¤ µ•Z67u~Ÿ—<-¸ÚÇxiª+(p3€ òGÈN›\!ø%²‚cSnLPµ%Š–¥þ|½_ýŠáž¥`ß_êæñÚ?þ|©Ÿ²êó¥~NiÖùês×ñý%¨Ýõlà#ˆN À> àvP [·»’¾ àvUÀ3‹ ðM`Ì©~õAghÝVðë×V?¶q|&z­"4*F×ÛÜÌ ¬|ù2+üÉ“*çóŸ<Éxù2àåËL€—/3t|?0LÔ ùô ®” ðÕWœ¶-¼yƒÇ88Àù&ŸÚP680-² À˜ù&7x¼eº~Pþù9>WŽ ó?ozt¤ 4ÁèÈdw&M¨ó?ç¯c¿‡-«/!ìÇýx=¹'2᎙Ãû¿z¥îSïý”Ÿ>Õõu~–_½’Içñ¯^å"àÕ«\øøq1Aª\—[¨ëäZAí¯Nj­5Õ¹„µÖS‡‡ M–•úñÙ ŠbЬ(H–Ó¥ÆÒ:y±ÎÆåôlÏϯµ‚z|½¨Q÷×”}ý<Â§Þ¯Ž²¦j  €ü #y*`¹<–ƒX@;E$€B©‹¸_$€B§ëysï`í}¬û©ükõS%¹•¯†.å€&#O¶®èFä¨=W5àB=¾Þ¿_÷‡ÕBz¯WåºÄQ]qcòú;^NhN•£h`‘þöF‘þ¨úHëqeÑ:z©Æ7¨û]\¿R#ÀôP7‹~Yúû# â5dŒõ«npýªcZ¿Ò…~Õ-¯ßØÍŽ_ÅÖo]QDï®_¹€ Àè•j™VË :&°_ P¯òPKà¢r-"½^¤šgg‘HV¥ÃÜøJÜúá‡H€~øü9àóg·J5d¼HÈ‘ -!|øà~¿«3vÜ:+Øh¸hÊo¨è–yyfl,3Ù8ÃöCý—T9ÊÖäu%»aÕêñµÌ¯>‹¦RG0žVÿýêóÆ®§¾÷óú7Dõi††gÕ¨cyÌ>Ôá(y^E}žî»ÍЋ®—ËÐ\oUŽ…Õ1u©ÎZï­NYõ9êñµX} öGv)@õÃWQVßóÖ%‘ºï——@ª‡e5ýx] Ú»YÛ ºRHy«?Öûé=èyêx -39ŽX‰‹ÇVæ„êáИœÔ ë­ŒÜë:8€úL¼lÜóIÎêÏõîÚ¹Tg«`ìm̳o1™bk+6”£†DÀ“&@~ÞnÀˆü~Ln?Ïd§½™„ àvªOc Ôv (ÀVÿöv$À?loÿðƒPGCýáôˆÙë›otüõ©:€êG€„ȸ¨ïD4OrVbÀƒ®€³·¶|þ‹x ¿p[¯“=ëñPÿ§O&€ß‡6€½‘°~^oáõôFõý~øáâ⇔àjÌŽ˜,×û×!5= ~? ÙÀ³lmž½=¼›Ýùޏ_‘ï!#dHFþßÚ²˜L¼*_ňÛÈæÊ í?D€ »¨ïS-L}^@M.ùý@H›Üîõ†ä8¾F&@=~gr$dà‡kH…ùü8¨¿ŸÝîüŽXãÄ ö°99ùYï$dò饃ÉÓm¨ÉÇG@AÜÈ‘móZ¼õ…óóÚéÓóÖ÷‹Ï3\Fçô½îýk¬aÙ#)¸ž¯¶Ýc"'ܯ:µ!%;eî>–*&'9¯#|¾®®Þ@›Àz|,£9sîtÈM£œúA Hý¢€ÔÏ) 8–šª‘þø1FE¨F-@Á±)–(Ðí¯®ýïµ¾ö÷×þp¨ÓM°Ñÿ{{ÇWƒ'µ?wv`âžçÅ ¾„êA?Q@C%ï1..Ð;G @F{b\j?"ø!šŸdwDz¨Áš9qZ2[ ]Öù£)ñµ»·ö‡³ÙE³ßEwÞD‚á ãóàøØË Óè¹Çƒ$+jwaµUA‘È·•9G»ÿ ’øg˜±?ÜKACe°•±)v)>g › ÑÙößcp °¥L(6ïßÚBމ#r\PÍy¾J€nÿ»]@A£k¸'9Œæ/–‰+öh£ü<4ûö@(ßóAÒ U¶Üßò~e( 1—Ù „šÑÈ’@»tT?ºwÜÿ« €œ@@M!êwCW¨}ñâø"úõ±ÿ.ÁˆK.ÙÀŒEØ’{ìhµ |«»0÷w“êÜ€êI€q}B§oî?û1®1ʘ g’øöÛy׸ã Ò¡jåØLÅ”jÿ2TOàÈãc¨>®ƒ×%€&z(dKìŸïö÷Cínæªb;,€âæR}P»£`žŸçý\ÙÞ2,­‹ƒ{‰ìtû‹å¨¢÷ñcc@`›1ðûúã£Ûýšûç»=Pª×êÝ™A w.áøÍMO@€—]Ì>À=.€L€nqvg%€¯Ç)Øã þù.jxìÍê#@<ˆûz0Ž’g!@“×½^_ÿ{ìŸ2ºýáùùªXÏN`÷ø{ï.J‰d°H^m€LW24ÍÁ=& ¡íîohh(øí,wËï¯`Ùa)ˆÜ·Ó=þ¯®`¹„ªÝøÍ,çO +†T¯_©^¿R¥~¥zýJõú}ÿžö_ÇÿÕ_±¡Pøê+FøÍo%M@õ¸5˜oñ»‚˜ó±s>¶cNÆvÌùØŽ9ÛP?%Rê§L @ý:€ú)“ŽÏvK(@gÝO±Zäu"ååY®ñ#òº‘ÁÁm¶±QÛP¿‚v²©Ps»¸Í•8QÛl¡¡Gv3«"åà#Z áK¦€Æ!‹?¾½‚(PW]ÓÊqJ¸gRªÖÿêWLEErÓ‚±‘Ãù«­÷æœò<›—“N¾dh@@õã›Л"€æj‹ª³‰T?¾Iªß$€úšEÅrTÇ[*Êp¶,Æè3W`DËq-„»ƒ:Äwœ9¥êm¨zÛªÞ6€ª·  êm¨zÛªÞ6€ª·  êmÜX¿4 ìïÇå).ß0Šu‰Áóó.ò×õ †Ùª1€r*ÎZ´<~­q–ÿWIP>ý–ÿ KŠØ¬òß“…I(Ÿ~Ë(Ÿ~©¢å*ÿ.—`‡ßÒZfʈD‰ºvQœJÔ!¯ÓÂÞñÎNŸ›Q×S÷Œ'OB× þH®ÕïüÍÁ7Æ9UÎý¶±¨Kï:÷ÛÄBÀ¹ß Îý¶±pîŸÚà¶.ƒ˜”.cÊ TŠùêšÜ^ÕŸÅ™Ný8ÛçA8¦p|flU{gG‘EI…‰À7(€Ž/Èœ‰üøñË—6oxÑçÏcì¾gUþ^€¬ŸHá¯íÈ 0ýÞÚ^€¬€ÒPV€ïÊü½YRUá­§"€Ø§2HìÊaZ’¨EL˜yæžh¨öYêñ$•BI^gYûãòvø(4,ÏÑD=Z<©îÑ£@u¥xáúâÓÕâ Z€:`*v>¢ €Ò¿ùÆßÿÅo(ñ»ïüm`@Ë«‹OžøÛãÑÔºÞ%€Ç—ô`Ø ÌxóÆß4¯þöø5~3ÿû{£²W ­:½ÅÓ`·ëüý¿Ë£Bºµžˆ}áWèVBôvRœSᣠzüË-ŽÎÌ-„n`/ åÅgvz°ß›[8^Ë¥ãxŽEƒ¬-©Ž A[Y[2þjâ2~ó¼¼`†Œ?‚ vöjÿÿí] sÇäÃÁÈÛ$818 T9¼ÿÿëV»gæNw’la¦«twë;ŸV;½³³_3¼B±êûpåz¤ºÑ3½Â PÞ’ø¿7—G¼_Ÿ÷¯zûVÀZKF14NȈÝÀ«&`œô"•3$€æ½ü€Ðs"€Ò$€¼"r¥Œ@Äÿ'”¢êƵ·p¡Q^@¥ëìI4j¼Àj"·¦ ”””^I€Ò ­î÷Ó¦·÷Og°ˆA>^‰;róàoÔñ¾|û˜:Îõ^i邈JÔ{?ÿâÅQ cp± ž<˜Aìþ!>ÑN@Ý~CØ…V5±¹£ýáè5©¾r:ƧC*/²wP"§€¼ú!dc:ŽØ(Å& Þg°L¬95@ ?逹h³ÈG ÀÚtú”ŠÎþ]w6PyŒº†cî~ã£.xΖþpoLõÜYUXmc§¢m¡ÞîÞY3ZZ<—Sç½®w~6ì{£†ˆ[)P}öÔ~DígOGÛòz²zÿÕJ× J±¯å“ZK‹¿UŸFן ûü 7)¹™ŒŠHîÀm`|ï]"€ãöŸ—Xý|Þ=?Ôhy6²Æl‚¹š-ú<•]c0qÿÝú¿¦àËàˤé¸ÕÞ{µ·K{¾~¾~EúÍ€nà´íOý…XÄ.¤ÿþ[i­ų́Ïkɰ ÇШH¿{'p*½ú¬mŽØíÂïÖõ?Q»QŸ?#·« ƒ]Süyna8…÷™ˆúø±)Pç2Dp‹?î¾ß»ñü¹C+3Їvuj'Än¼x±ˆÄWå£çþwÅÓ(.="s¤_àáÃׯÿðúµv±jO+ÄnœžÅüi““¶:AìÆzZ€ûw¬ñj8öa¥†»ÇY>‡lzEŸFN•Æf³½½Î~oÏÝåós¤·ÜÁ ¦Jü`.˜*ñƒ¹Ø%ñÃj‚ÄšN‰Š0[Ó1@,qrØøäDÅ4¼Ãçѯ·øÙ¯·ã8`±ø1ˆÚ¡ü –À¯±ÄÿÆôL¬»(¢ ¨¦õ»,@¬yÄrüƒƒÜì§ß_ÓØ ¿Ç« yÇ^Ó`»Å‘»NÅ/÷ýgpžÜ¡ëáûæPÀ;O€) p»½ûûÕ¬Væ»ÕÑÜß¹W´S#°5À<²8O€ÍŒÀ!¦À¸WXâ¿–( 0Û̪ĈtË¢øAQ€“”üi? ‘FG ¦*ÄÏŸ]Ÿç®q‰Ÿ“;¤ÄˆœÔe'PâDF8àD¨Ä¿ê¢JÀˆÝ<í¼ÙTQ•ò‚€`9˜µ×ãÝÂ4k/mCp^]xöŒ{âD̾E<ÎiEà×_9±%ÐO„ðûïÜ’)k‹¦Ó¨=&b•Eœœp^_xýb7°"`±à:àåKˆÝøøž6"À:«vëvn(g޲Xc×ÍæÃ½Ìù}uosôÀoÈÑÕ£“­tÀ¼ÊbÝw«VûÅuQcíçV+¹¦«Ê«÷åHÌÏ{ PtÔðó× žÌ]¼òçäú_ã"¢œ(<@d¨ÑÈM€Ü'ˆÜ,‡0cÍÑØ Æ‚"´+׋X7Ê6@­Aõ÷]˺üÑÆhe™ªŸG‡W˜ ×­W—AQõ¥©úٌݯ.„ªK£êÂ(.)“øãˆØÐуáÐwµ*aç†ÖWùYE€:ô]{×jÄVÅVUûuVmй®S»uVá¬:³ö˵ËÛ·õ¾j¿Î¬ +g­Pí×YµCgÕþåù½Wð®¯æPç.î¼Äë& pO®A\6\ ´\^ò›Vç1ígîùöSÄi[žiب±<‚¥zBl/œµLQ÷ÿù$Àé‹‹³³‹‹ËK‡¨2µê6æ±N¨Æeª´ ¤†¹ü™Ë¡ù}Ÿ>A¨8"ýæ–Dq¶9¹¼<<ÄQùÃóJÿð°5Ê«èeé¸ÇìÕîÉ“ÅBm$®â~u\Aðº+ŠŸ0ì¨' >îÕ˾oã²i‰Ÿ± !~¯ƒßÛƒàõ}¸‚ø5Rˆ+ŠŸà‡ùû¡ñ{ÿ’–º§dÄ}3HÇéZÀ  °^Õ÷åEš"ðþ=Žÿþ ±$€A$€AäüÝ=ÈÜÄçÉ$²U{üKµj«•Z·Ve«õÅ‹K°‰¸¸ÐX?‹w8’•cŽ Ý6z½Ó^1p/,÷Ãâ7]\¨‡€†5_ßÏ%#——J» `Ïß¶°‡°MUÝMo‰ØmËE®'ÔMd*vÛøuÔAõÓIˆž[Å@.ÈR7Œÿ!WÂüú˜UøÙ(píœÉˆÝD vSé{×ãÐñûA€šŸ8N°žÈ6Tµ‘†6M¶‘è-PG Ú\ööMÁú„߆#ÿbïà× @ì— pS€6öf€+“¸R iŽ:Ä•óQ@í[ Pµû—;’¡ö­bÑHænÝ 7 óý|7"aä˜<ÙÙDO˜ó»êì”dÆÙ-{âÖ®¿¼½K— ƒuŸz€6€½id b?/Je àE¨²DتûÒj./Ùäèãhõcš6Å¿‰ P—ÁWD1®ªHLWu^×Ôy˺Šx—:Aü1ê ‡€I| „WvöÍé á•Õ?Ï?)½WƒÕy:Óâ¼JQÑÆ#p„WХĕÅÏéŸÐŽeüíSòcñ“ ëŠ?R ÖðK¹ŽìՑƪqë*æªQ†Ëì7@Ý¿¿_ Ñëˆÿ‰M€ê¾ô@Õ ªO¶ý¬ÿ ÷ขøI]eO¯@¨Tä”W?Ž‹Ó<º:S—ògWpýÙ‚ï§ø7¨èÑV ¢ D#PS¦ê¨m€ÓS âZ~Û @´þøƒ¾ä5Ùt~^ Àþ>múÒˆfàá!Z~Ûø`) Gä[F//Õ¨m>l÷”+æqÝ&à{jŽ·x»¦ˆÓ“\ÚèéKLÅ =.û_}€™¡p 2h€i(„O‚E<{HxH 4@ž.†ê· ðâ‚s¢øc›o±G¸¸I’ÝÁSü¤Oñ“Œöã˜?Œâ2*q Œ‘¦ úñÛŸþc8½ Ìà0A¯ŒŒ”ÇŸèõ‡õŸÙ×ÏóO4øƒ]à*`5ü®gÏyN]Oiå·îDŠ;‡¸pC5 ) ©  nÆÆrzÝŒé{dV›t1,1Õ ÄýØ ÌA,âØ DOÃ*“]!kŠß6À*N)ìz6§§"\6ª2†ÝԞʼνÎÊL4}¦ø‘ÖÙ¢wýGš`ñêG¡ˆ©üžQ…¥³úÿPÎy%Ñë¬Âäâwþd¸P)~¥%þ˜¿uJÐGŠßGþY2>2§>²¤}dN|¤ø}¤ø}l4F£ÑØs.\6M7îæênáŠØÂ¯A‡“\¹{jjcÕ‡‹F Q :múP!Îu»j¿·v»b2æ&ãoêoÙ£ D/§Mü» J=U L¦óPÏðþ2+<Ÿ?9ùð¸ŽÇû>hnA÷µëiUi*¶Ê0¯©tÐ-å?®¡diç2Ïk.½P#¯Ü}}–Ö\®œ›¨«~çFÞêÐgy‹›%þH¼.µXûì õÈéE²Q‚_,NN‹ÿ€ñ>nˆ0 Õ÷YĤ€éñô)r¼J8ð£J7»ÓÖ‰ïÉ“Ç!|m¶µÁ-ñg7xp…ü¨=ã–;%86y~þò%J{"wûÏ‹®‡sô»™  ¹7@ÕMàÜ €-a?½vJˆœ»0“÷íM¦‹Ð6 ÝWÝ DÞG m,Å9UxèñÅaÒžJu«£¦Ä5ÅÖÔ,iy9“ø=ÙEñÓ r§=— ØÉª©ýM?Þ7©âþÿa³¡âÏðä«Ê<€¡VMú °¶Áñ,IMÞêÌÆQ`hõ}_ŸHKô¤ÁRø¾u¯HÝgQ×XÇS¨¡_£°çP j6ÖžîÖæÛ¬Li@Õ4k€‰éé(~s¶¢øùeو⪽å¹CBâ—À¼Y‹©ûr½;žÅ6¼¿2}’ð ÆÌ“øeP1ë>­…/0'~j|¢ 7ö\jQà5>Qà5>nýM¦y5ÀJ ìÒÐN¶·:6¬I›¶ùOŸ"å6¹ØÔÿçC¹ 0F€ì°¡‚õß6€‡Ö$ö|fý· à¡7¦µïZUˆõß6€Ä¯˜Í’‘Ö(±þ¯´ž\Ôíä'5üúy­€<ž¸) Xåˆâi/…8 @þßXûAÙê¿  †‹ÓÖn^ÕÈŽÙÖnnÕèºö³ pígàÚŸÅë€;H†nroCP ‹9_ÎN ŒÀü]®ý´òë›e’\ý4EêO™€¤€gVÆ) +€Â8óB È `‡Pí¿÷¯®ýÒ·2G( Ì)›Úz©ž€2£lÑþW DTÞ¼Ò¬z´ÿåˆJÙšâ9‹lx¿ž™û¥%_Ào èqŽÍŽõ}TºCpÊŒ@@4³UsE…¨ÔD³;j5ÖÑ Ìµ_$˜Ôh™lp?¾m€ƒ´¶à|9Ú?–íä'(&êû÷ˆµmàÓ'¸±úG*ºfb²=à‰lì~M#÷Çßð-Å ð-sõ}âU}_%bƒ‹L­Ö,“8µ†ÒÎf`ÔÜn§ÞPúÖ,CkæI#"‚F$#k¾o¢ˆ?ᦌ@28û´z·FgÐ*µic郃éûüÇÇØ%Ic½ñù< À‡êû(z]SF`¶Ø ˆ#¹·Ä^@ È6{q$ ÛìªÔ@FÙ˜µ¢øã*ÜHhDñ‹Éæz0ôü9ℽóì¾A"KïïOß'  –<9¹’ß*çá} ¹êi™ŠÎÑð6¨‹Þ34À“‡Öó}üÿúÎå÷öþü“¦÷÷á°¤b s Ëé[¢ÀƈpðE»Äò3vkeáoK»¸Zïy÷…®ó+óN)õôxÍñ!úisnmÌí›Ù.PÃ4LJâ¿^À…ÚðÛj<âzZ` ä&`HMÖSÖ¥ònÎ8ćºÕ—܈ÓÈJµe]ÁýnØKï30„áA)Ù!¦Zk«ó ?*M¯€« À÷­&@]pWèy€Àêˆáóµ 0XÚSâ‡÷× H.Ä™–ãp5y¤(#”Ÿ$ÞØ!Óò58—>8À€nlUUPTÀ&.ÓåÉm&';ûM›ÉE©’¢%´Y\¢‹Žó½Z8;“_t€SÒ&Àþ¾ßgÄQSŒ…˜XC÷­6³Ë+³6«‹ õyöÿEŽe¸º­ªv‹ü¾KVnð±÷hq>zÄð×_ü\€£Xþ™d“Ó9Ÿ†ØÿÌÝŠÀð?‹Åö ÀLàéSú4×/‰àûþbs›X‡öþL¡“¨ô¼G{öÂÜ  ƒŒPÿé¾A?koïíÛhV<~|vcŽ8Åð>t@$€ËŠpä G‘ b$€ÆÕ¹ýî¨3øV¡@º"€æ+%0²²€÷÷ý¾JGfP ^-YD(®PŸ—3nù#ËÜ×9(Xìgz†ø1±ÕÅkêUi|UÜDæhÙã÷©Žÿ‰à°v$‚û«+(Èf®äÜZ¬nÁj\4«lMx»^iÆ0x ¾¯jý?óÄ÷y ÜÎsc •AÏ¿{çç=P_‡×W[^Š–ÿxÅ7§ÓpþöHØÏb^WÍ®He)³0[ù>›Ÿs\ÃHe/ÏgVtzj—q:\?!Aqº[??Ï$D¸ÆÔ_k”mþ€÷WÅPÒ¾ @ÏSüïÞ1'ë†ù­¢Ï (x7.¯dȳÅîä/Éâv¡j§#ß·˜'€;)‘¢‹;ú7À1”¶%@ÅjH¼zuHüz~3˜Yy ¯c è´cÏ_x|½;¢Cü²ù´D À³ À3Ó}Ô<ó©:¸bèÏÙjàÙày5T¬c(#x6x6x¾®šŠõh͘,³ºìõV³­z¾(Šx.=lòY‚7ò™V‰ód“JÈgå5Ž…gäó\$Ïú¾:[ Ašù,Á›ù\Ÿ÷ÂðñüÅŸ¯ÔŒF «£51¢Ô’ÚÛ– ›yQÄÓi™~6iúÙdÄ=eúÙä\¸Î2ýl2Û6Yï]ÿI4›€Z·$}€UÛEëû†â§)§üÈ”³ HbØäó6óó2ýlæü6wÕiã§Â£%n;­±©ør—© p§S‡âðXÚÀïó ܬ;¿|¯8o,à?‰ï±‚¦1†u¾¿£ÿoŠÈ¡,°Gj ÞÛÃh»)ðË/H›qØ„äZ |ÄÉž%ª@3†¯`8¬W˜D ð¨à¶‹ãçCê]þaèÿߢ¡ê¯ ;× )Pä¨ù¿t@´ðk”&À÷Ç@ˆù¡¼&&ßÖÞÕ6P›€&Àm‚6*ýÕj‹\ceÓ ä‘áì~´@ˆljWàö!«o)a™eòÇyö­ ¼¦ctq¤)~S @àñ¶ ãç„eýÀ“Ÿ«»~®óìrœ f`ìšÝ¼”&\ÿd› 6ùºæ\žgô<³4Fw+[ø·4ÉÊËFß0.`nóÝó½€8{›€Û.†Ÿi ˆX‡NùLu'U7·ùº’píÖÍõDý… Œã@º"„×Ïà¬ÚßZ Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£q'ðDìH{°øIEND®B`‚angband-v3.3.2/lib/xtra/graf/mr_att.png0000644000175000017500000000434211651552410017251 0ustar chriscchrisc‰PNG  IHDR›ŽÔTg—PLTE333DDDwwwˆˆˆ»»»ÿÿÿO\ tRNS@æØfbKGDˆH pHYs  šœtIME×$Ä.sóCIDAThÞ­ZÉnã85$ þ„¹…W#P¬«1†­«ÎXw/Ê5ÐÒõûÃEФävˆbK*kyõªèÅb¼ªÅO®Uû£âjXÿ¨vs¶[óÄ-fÜ™A?O\»É»ÌÔnAÅMz#øž)®l'_‘9;P¾ø&¼[Ã<±•Âë´U|«d~tÂÐ1ÇÑ­¾’Î{É·)Ò67€.l\ènO´^ãš3ÀS@ÚÀéðY{×4ô¡ö0ÜkSƒÿUEë7^CÍ'ü»dÿÀ¾ÒïbW¦£vXû¾¤âšY4¤äzf³ ošé…/€82y·z0«ÝðlOMó âÒ—ðß-•ÇTë¸èœ ÜÐÏ=•Ö”¡¨+hFùœ‹cîØ6r}r ßùk‚I¸‚³Çz ó- ®‹\WªÛþß9˜ƒ+¸yð#ƒŽéÀ¬ŽÝ{Ëÿ) œïÍkÉ%“éÊ¢{¥Û:ù®&0œ¹yÀ|©&)½^zb…áösÖÛnM–°müÎÁâ,ú’s\3æ,˜Ó<÷‰»AGbÈÉÄÕã2¿r4‚ã…Ž=v§`-òl¼ÎqX/YlKÚ&°â°^°çF»Ídü{ÖWT»KÏÑn؆Ä]¢U.á$½ç%uEÊmîî¶hÃâÊ>JI^=QvaqEÔÂèΞ`¾ˆr¡NDç¸øV “‘Ò8…“VÙ´7€ÅT¤¸µ©´åìD’©³‚=á¥+KãHÁ'/šOÍwBE×½-l/¾fÉ yS_y¼ˆC¥6ŵÛË=ßö¥únPœW­Ýص(Tä»7-¡v%øgw ý¦o±È ÌB¹úÌÞöTeDªGwz0¸uø—…‚BHðϵwÚI-#e¦’\-g/R^•ñ€õåÒ_èŸUÐí ÛÔ+ˆ6w€ÞñëN¢ £Œ’ÆË¢ÊIS¸u —£²Å0[G•“×_Gdp±R¸ÊÑLØ3­÷ûýAôlÐzêoå"9CÊÝnp¸ŸÙ…N¾oð¸o×Üx+Üód:Ø…o¹Û“§œ·®/¸ñJk¯™¦ÆU­^“8¤“éÚá¾WÄIŠx)M7Ò!í¾PaMÜIµ<* žQ¤58Ñí¼Ø²vø¨è”{…Š“•Ñº¡”Câ˜/.TÚVÑ©LšÎ²ÊaÍD~Ÿ8ȵj¼¥M>´_Œ¸‹¤ÁG8âj´ÿM-ÇfOŒ¸+w5›Ç‘¥ÀÑtýÕÊ·ÔnF›åfC¾0âØ¸DvÃ7ÎÛqºî`WÔWdlÓ+‹0=÷ [\¡Ýì 2Çí¦(ŒšçØâŒ›qS˜DHÑú›qÉÅÌÍÁ]µp“ìl%ÙUëØ•’‘à@©ª¶S‹ãÞo3î6ÕŒ+Å0ŠïÒÆ¤o' o[î.dÐN)Úáúpò4W"Qjþ*M­LaÍP‘M&Á£Ý‡àYš»”d 15Tz:„vgÅ)ÕÄŒ»–Q|ÅèÿŸ>æ9f0Plê†ÖÒAKIØÉ¨¹ð—í«³¢­™ç¤ñ¾1 Æí øh¶ñħd%1ôb|hèn™ @y,ÀXk´PñŸá¦Ë¨×hfÀ‚ ”j·5êé Ó«ütÑšk“_*T“í¦Eýã©Ú3¬åéqÕ%GÈ{ ¾âuã4o–TKãéKŸy®ý%û fâW»B|9qú‘ÅÛw’už:ì©=MTšæq¦2ܧñï§lÍ[ÇÕ{q”k£C‹xÏÒ¶Ö .ðvYEÕ0À^ïVzÄÓäa1)Τ8²hšjE‚çVh³ÖÊâ³°»\–ÐOj&<‚[ÂVx‘ð9[Åxü"àð@Ìm<? °¾íÍ«¯±“Íç‚6|Ë9/z󠯇 Kx–]Îß‹û#çì•i<¾þ:Ñl ‹S­—e2Èò,-'íû½à$ʨåBM37¨_æaǞӈثÕ@n-z_˜õ èO¨GW3;õé7¿áx+gü–§6¿O@ú ]0Ÿ‚üÐåEÔþü@èYƒ„µ´cXªFƒÝ ¾ RÉ­Ó7èøLõÄ5:îš,ek8‘iª'>Î=̳'¸Ÿz<$üš0žo‚«Ô3ð¼N„ŠïÄXÈs^{›ð…ïÄX=»¬4?*Îsb¬F#’•Þ%®ˆ˜;õüêà~í ÀyN§ï×îqíLá&Ý}?7ðŽúMé*Ú½³JØLÄÝ)ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ›óüÉ”¸ý pHYs  šœtIMEÛ12q€ßD IDATxí†y/1.ÿÑÐÒ/0.ÑÐÒ/0.ÑÐÒ/0.ÑÐÒˆ‰‡ÌËÌzDºñ&ÌËÌzDºñ&ÌËÌ454ÌËÌ454ÌËÌzDºñ&wtFUW†454ÌËÌ5«¯wþÿýÍÏ›”1elÏ›”1elÏ›”ÌÌÑ44/1elÏ›”ÌÌÑ44/ÌÌÑ44/1elÏ›”2hŸ‰ÿwþˆ‰‡xwy‰ÿÿŠ…v{wþÿÿþÍÿ‰ŒºwtF3þÏÿ2þÎ1x˜‡Jg/ŸJþψ1b.ÑÐÒ/0.###®­¯¨£„X]|/0.ÐÍŸ3/0.###­ª¤"%+111®­¯¨£„X]|/0.ÐÍŸ3RSQ­ª¤"%+ßÞà/0.ÑÐÒ/0.###ÏÏÏ111ààà ààà 222ÌËÌ454ÌËÌ454###ÌÌÌ444ÌÌÌ444ý÷ÚŽ”±rlO®´ÑRL/Ž”±rlO®´Ñ©¦xUW†«©z‰ŒºwtFUW†«©z‰Œºwtnx{ˆ…¬¯µTQKx{ˆ…¬¯µ‹‹‹ÊÉË675¬¬­TTS#$#ªªªVVV‰ˆŠ/0.ÑÐÒ/0.ÑÐÒ/0.ÑÐÒ!" 111ÏÏÏ111ÏÏÏ111ÏÏÏ555àààP*Ðö222ÌËÌzDºñ&###ÌÌÌ}D·ð «««àààP*Ðöààà àààRRRÌËÌzDºñ&ÌËÌ454ÌËÌWXWÌÌÌ}D·ð ÌÌÌ444ÌÌÌßßßàààP*ÐöRL/Ž”± àààRRRÌËÌzDºñ&wtFUW†454ÌËÌWXWÌÌÌ}D·ð TQKx{444ÌÌÌà‡‹©ÿ‰ÿwþ­!!tÿ‡dÞ¾¿"BAÞ¾¿"BAÞ¾¿ÜßÚ$!&yœŠÏ›”1elÏ›”1elÏ›”ÌÌÑ44/1e”õ¿• Akõ¿• Akõ¿•ÉÍÉ737´çúÞ¾¿ÜßÚ$!&ÜßÚ$!&"BAÞ¾¿yœŠÏ›”ÌÌÑ44/ÌÌÑ44/1elÏ›”1e”õ¿•ÉÍÉ737ÉÍÉ737 Akõ¿• DvWÿ©ÿ‰ÿ˜#ŒÿSÞß/0./0./0.ÑÐÒ/0./0.ÌË̆¼òÌ454†¼Ì45ÌËÌ454ÌËÌ454ÌËÌ«©zUW†45454ÌËÌ«©zŠ«¯wþ‰ÿÏ›”1elÏ›”1elÏ›”1el”ÌÌÑÌÌee™›”1el”1el›gee™›hŸˆ‰‡v{ˆŠ‡xwy‰ÿÿŠ…v{ÿŠ…‰v{wþ‰Œº‰Œº1xþψþÎ2˜‡éhyŸhJaÿ¶ÐVWUVWUª©«YYYˆ‰‡xwy/0.YYYŠŠŠvvv111675ÊÉËÑÐÒTTS¬¬­/0.ÏÏÏVVVªªª111ààà ààà ààà ààà ÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454ÌÌÌ444ÌÌÌ444ÌÌÌ444ÌÌÌ444Ž”±rlOŽ”±rlOŽ”±rlOŽ”±rlOUW†«©zUW†«©zUW†«©zUW†«©zx{ˆ…x{ˆ…x{ˆ…x{ˆ…‹‹‹ÊÉË675ÊÉË675¬¬­TTS¬¬­TTSªªªVVVªªªVVV/0./0./0.ÑÐÒ/0./0.###111111ÏÏÏ111111ààà°Öòòþýþ†¼òÌïïììààà °Öà ààà ààà ÌËÌ454†¼Ì45ÌËÌ454ÌËÌ454ÌÌÌ444ƒ¼Ì44 ÌÌÌ444ÌÌÌ444¿¿¿rlOŽ”±  àààrlO¬±Ì«©zUW†45454ÌËÌ«©zx{©ˆ…x{44 444ÌÌ̈…X‡‹©ÿWÿwþ‰ÿtÿŒÿÙ¾¿"BAÞ¾¿"BAÞ¾¿"BA¾ÜßÚÏ›”1elÏ›”1elÏ›”1el”ÌÌÑ&$• Akõ¿• Akõ¿• Ak7ÉÍɺ·ÊFcg¾"BA¾"BAº™Fcg›gee™›”1el”1el›gee™›¾Œ^Bt¢7 Ak7 Ak¾Œ^Bt¢v/0.zD454454454454454454ÌËÌ454ÌËÌzD454454UW†«©zÌËÌÿÑ3«©z‰Œºwþ‰ÿ1elÏ›”1elÏ›”1elÏ›”ÌÌÑ44/e™›Ï›”1elÏ›”1elÏ›”e™››ge‰ÿwþwþΙaÿ‰ÿΙaÿ‰ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿþÏÿTUSÿþÏÿþÏÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿ˜ÿÿTUSÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿÿÿ˜ÿÿ˜ÿÿÿÿxÿÿ‰ÿÿÿÿÿÿÿ‰ÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿeÿaÿ.ÿaÿ.ÿaÿ.ÿeÿÿwtFwtFwtFwtFwtFwtFaÿ¶aÿ¶aÿ¶aÿ¶1xc0.c0.1x1xÉÿÉÿ1xRL/RL/VWUwtFwtFˆ‰‡ÑÐÒTQKTQKŠŠŠÏÏÏVWU¨£„¨£„YYYÐÍŸÿýÍYYY­ª¤ÞÛÕ ààà ààà454454ÌËÌ454454ÌËÌ444444ÌÌÌ444444ÌÌÌrlO®´ÑrlOŽ”±rlO®´ÑrlOŽ”±«©z‰Œº«©zUW†«©z‰Œº«©zUW†ˆ…¬¯µˆ…x{ˆ…¬¯µˆ…x{/0.111P* zD454454454454454}D444444444444444 ààà àààP* 454ÌËÌ454ÌËÌzD454444ÌÌÌ444ÌÌÌ}D444 Ž”±rlOàààýá|rlO®´Ñ454UW†«©zÌËÌÿÑ3«©z‰Œº444x{ˆ…ÌÌÌõˆ…¬¯µ©ÿWÿwþ‰ÿtÿŒÿ"BAÞ¾¿"BAÞ¾¿"BAÞ¾¿ÜßÚ$!&1elÏ›”1elÏ›”1elÏ›”ÌÌÑ44/ Akõ¿• Akõ¿• Akõ¿•ÉÍÉ737FcgÞ¾¿"BAÞ¾¿"BAÞ¾¿Fcgº™e™›Ï›”1elÏ›”1elÏ›”e™››geBt¢õ¿• Akõ¿• Akõ¿•Bt¢¾Œ^Wÿ©ÿ©ÿ‰ÿwþwþŒÿtÿtÿÑÐÒ/0.†¼òÌÌËÌzDºñ454†¼Ì45ÌËÌ454ÌËÌ«©z‰Œºªz­vEyUWÌ454‰ÿwþ‰ÿÏ›”ÌÌÑ”ÌÌє̼ûOœ IDATÌÑ44/1elÏ›”1elÏ›”1elÏ›”1elÏ›”‰ÿwþ‰ÿÿÿŠ…ÿŠ…Î™aÿ»g¡E™_»g¡E™_g¡ÿwþˆŠ‡ÿxwyˆŠ‡ÿxvyˆŠ‡ÿxvyþÏÿ2þέV†SþÏ­ÿ1ÿþÍÿ3ÿý͉ŒºÿþÍÿ3še2ÿetFš2qòˆqºx«%še2fœÎÿˆ‰‡wtFTTS¬¬­ÿÿÿ˜˜h‡êÿˆÿ‰ÿvþ‰ÿwþÿÿý͉ŒºxvyˆŠ‡ÿxvyÿþÍÿxwyÿdaš.dœÿ‰ŒºÎ™aÿÌÌÑ44/ÌÌÑfœÎÿˆŠ‡ÿÌËÌ454ÌË̬¬­ÿÿþÍÿ‰ŒºwtF‰ŒºxwyÿΙaÿÌÌÑfœÎŸJaÿ¶aÿ¶ŸJaÿ¶¶™Ñéhy˜‡éiˆéhy˜‡Jg/ŸJÏÒX]|¨£„X]|03aÐÍŸ3/0./0.SV\­ª¤"%+111111ª©«RL/®´Ñ§§§wtF‰Œº§§§TQK¬¯µÊÉˬ¬­ªªªààà ààà ààà ààà ÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454ÌÌÌ444ÌÌÌ444ÌÌÌ444ÌÌÌ444‹‹‹rlOŽ”±rlOŽ”±rlOŽ”±rlOUW†«©zUW†«©zUW†«©zUW†«©zx{ˆ…x{ˆ…x{ˆ…x{ˆ…7:¿ÊÉˬ¬­ªªªÑÐÒ/0.ÏÏÏ111°Öòò†¼ò̃¼ììàààP*Ðö °Öà ààà ÌËÌzDºñ454†¼Ì45ÌËÌ454ÌÌÌ}D·ð444ƒ¼Ì44 ÌÌÌ444àààrlO®´ÑoMËO-«Ž”à ÌËÌ«©z‰Œºªz­vEyUWÌ454ÌÌ̈…¬¯µˆz—TFcx{i444Wÿ©ÿWÿ‰ÿwþ‰ÿŒÿtÿŒÿÞ¾¿ÜßÚ¾ÜßÚ¾ÜßÚ$!&"BAÏ›”ÌÌÑ”ÌÌÑ”ÌÌÑ44/1elõ¿•ÉÍÉ7ÉÍÉ7ÉÍÉ737 AkÞdN"BAÞ¾¿"BAÞ¾¿"BAÞ¾¿Ï›”1elÏ›”1elÏ›”1elÏ›”õ¿• Akõ¿• Akõ¿• Akõ¿•Wÿ©ÿWÿ‰ÿwþ‰ÿŒÿtÿŒÿSÑÐÒ/0.ÑÐÒ/0.ÑÐÒ/0.ÑÐÒYYYÌËÌzDºñ&ºñÌËÌzDºñ454ÌËÌ454‰ŒºwtFÿÑy/Í«©Šv{‰ÿwþvel”1el”1el”ÌÌÑ”1elÏ›”ÌÌÑ”ÌÌÑ”1el”2œÎ‰ÿ‰ÿv{ÿŠ…v{ÿŠ…2hŸTUS˼ò¬þwhŸÿxwyTTSÌË̬¬­ÿxwy2TTSV†¬¬­­¬3TTSUW†¬¬­xwyqòˆÛ«FxvyˆŠ‡ÿxvyÿwtF‰ŒºwtFxvyÌÌÑÌÌÑÌËÌÌË̉Œº‰ŒºÎ™aÿÌÌÑfœÎÿše2ÿ2hŸÿÿ¶™Ñy¶™ÑJg/ŸhJJg/ŸiJg/¶™Ñy¨£„‡ªÐÍŸSV„­ª¤©¦X]|ª©«RL/ª©«ÿýÍ3/0.§§§wtFxwyÿýõ"%+111§§§TQKvvv675ÊÉËTTS¬¬­VVVªªª ààà ààà 454ÌËÌ454454ÌËÌ454444ÌÌÌ444444ÌÌÌ444rlOŽ”±rlO®´ÑrlOŽ”±rlO®´Ñ«©zUW†«©z‰Œº«©zUW†«©z‰Œºˆ…x{ˆ…¬¯µˆ…x{ˆ…¬¯µ675ÊÉËTTS¬¬­VVVªªªÑÐÒ/0.ÑÐÒ/0.ÑÐÒ/0.ÑÐÒòòò111ÏÏÏ111ÏÏÏ111ÏÏÏ555àààP*Ðö222ÌËÌzDºñ&###ÌÌÌ}D·ð ßßßÐöàààP*Ðö àààRRRºñÌËÌzDºñ454ÌËÌWXW·ðÌÌÌ}D·ð444ÌÌÌ ®´ÑRL/ýá«„rlàæ‰ŒºwtFÿÑy/Í«©¬¯Ý¬¯µTQKõ 舅¬Wÿ©ÿ2ÿ‰ÿwþ­Œÿtÿ‡BA¾"BA¾"BA¾ÜßÚ¾WœŠ”1el”1el”ÌÌÑ”1e”7 Ak7 Ak7ÉÍÉ7"BAÞ¾¿ÜßÚ¾ÜßÚ¾"BA¾1elÏ›”ÌÌÑ”ÌÌÑ”1el” Akõ¿•ÉÍÉ7ÉÍÉ7 Ak7C­WÿWÿwþ‰ÿ‰ÿtÿŒÿŒÿ/0./0./0.ÑÐÒ/0./0.ÌË̆¼òÌ454ÌËÌ454†¼Ì45ÌËÌ454wtFÿÑ3UW†454wþ‰ÿÏ›”1elÏ›”1elÏ›”1el”ÌÌÑÌÌee™›”1el”1el›gee™›hŸvþˉŒºvþËŠ5ÿTTS¬¬­ÿTTS¬¬­ÿTTS¬¬­ÿTTS¬¬­ÿf›Î}32ÿqºf›FˆfœÿÿxvyÿwtF‰ŒºÌË̬¬­ÿêhÿÿ˜ÿhêyˆÿwþÿvþŠwþÿ3ÿþÍÿ3ÿÿý͉Œºxwyÿ›ŸÒÿaš.ŸfÒœÿ‰Œºÿ‰ŒºÎ™aÿÌÌÑ44/ÌÌÑfœÎÿΙaÿÌÌÑ44/ÌÌÑšd2f›ÎˆŠ‡ÿÌËÌ454ÌË̬¬­ÿˆŠ‡ÿÌËÌ454ÌËÌTTS¬«­ÿþÍÿ‰ŒºwtF‰ŒºxwyÿÿþÍÿ‰ŒºwtF‰Œºˆ‰‡ÌÌ«šd244/ÿÌÌÑšd2fœÎÿÿaÿ¶éhy˜‡éhyŸhJaÿ¶ŸJÒaÿ¶ŸJy˜‡ˆX]|¨£„®´Ñ03a/0.ÐÍŸ‰ŒºSV\111­ª¤¬¯µ®´Ñ¨£„X]|X]|‰ŒºÿýÍ3/0.03a/0.¬¯µÞÛÕ"%+111SV\111ßÞàrlOXÉË«©z­ˆ…ªªªààà ààà ààà ààà ÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454ÌÌÌ444ÌÌÌ444ÌÌÌ444ÌÌÌ444Ž”±rlOŽ”±rlOŽ”±rlOŽ”±rlOUW†«©zUW†«©zUW†«©zUW†«©zx{ˆ…x{ˆ…x{ˆ…x{ˆ…‹‹‹rlOŽ”±«©zUW†ˆ…x{/0./0./0.ÑÐÒ/0./0.###111111ÏÏÏ111111ààà°Öòòþýþ†¼òÌïïììààà ààà °Öà ààà ÌËÌ454ÌËÌ454†¼Ì45ÌËÌ454ÌÌÌ444ÌÌÌ444ƒ¼Ì44 ÌÌÌ4441+ýá|Ž”± ©¦xÿÑ3UW†454wtnõx{444©ÿWÿwþ‰ÿtÿŒÿÙ¾¿"BAÞ¾¿"BAÞ¾¿"BA¾ÜßÚÏ›”1elÏ›”1elÏ›”1el”ÌÌÑ&$• Akõ¿• Akõ¿• Ak7ÉÍɺ·ÊFcg¾"BA¾"BAº™Fcg›gee™›”1el”1el›gee™›¾Œ^Bt¢7 Ak7 Ak¾Œ^Bt¢v/0.zDºñ&ÌËÌzDºñ454zD†¼Ì454ÌËÌϛںñ&vEŠ»‡wtFUW†«©zUW†¬þ‰ÿ1elÏ›”1elÏ›”1elÏ›”ÌÌÑ44/1elÏ›”1elÏ›”1elÏ›”e™››ge‰ÿwþ‰ÿwþˆŠ5Š…Š5Øï« IDATéhe2ÿºð!­ÿÿxvyÿÌË̬¬­ÿêhÿÿêyˆÿwþÿwþÿ3ÿþÍÿ‰Œºxwyÿ›ŸÒÿœÿwtF‰ŒºÎ™aÿÌÌÑ44/ÌÌÑ44/ÌÌÑšd2fœÎÿÌÌÑÌÌÑˆŠ‡ÿÌËÌ454ÌËÌ454ÌËÌTTS¬¬­ÿÌËÌÌËÌÿþÍÿ‰ŒºwtF‰ŒºwtF‰Œºˆ‰‡xwyÿ‰Œº‰Œº44/ÌÌÑÌÌÑ44/šfœÎÿŸJþψˆÏÐÏÒ2¨£„®´ÑÐÍŸ‰Œº­ª¤¬¯µ®´Ñ¨£„X]|‰ŒºÿýÍ3/0.¬¯µÞÛÕ"%+111Ž”±UW†x{ ààà àààRRR454ÌËÌ454454ÌËÌWXW444ÌÌÌ444444ÌÌÌrlO®´ÑrlOŽ”±rlO®´ÑrlOŽ”±ÉƘ‰Œº«©zUW†«©z‰Œº«©zUW†«©¢¬¯µˆ…x{ˆ…¬¯µˆ…x{Ž”±UW†x{/0.111P*ÐöàààzDºñ&ÌËÌ}D·ð ÌÌÌP*Ðö P*°Öà ààà˜a,ºñ454zD†¼Ì454ÌËÌ h7·ð444}Dƒ¼Ì444ÌÌÌéÍÐöO-±ÓURL/Ž”±rlOŽ”±Ï›”ºñ&vEŠ»‡wtFUW†«©zUW†õ¿•·ð TF¬ºTQKx{ˆ…x{©ÿWÿwþ‰ÿtÿŒÿ"BAÞ¾¿"BAÞ¾¿"BAÞ¾¿ÜßÚ$!&1elÏ›”1elÏ›”1elÏ›”ÌÌÑ44/ Akõ¿• Akõ¿• Akõ¿•ÉÍÉ737ë1Þ¾¿"BAÞ¾¿"BAÞ¾¿Fcgº™½°Ï›”1elÏ›”1elÏ›”e™››gee™Ãõ¿• Akõ¿• Akõ¿•Bt¢¾Œ^Wÿ©ÿWÿ©ÿ‰ÿwþ‰ÿwþ­ÿtÿŒÿtÿÑÐÒ/0.†¼ò̆¼ò45ÌËÌ454†¼ò454ÌËÌ454†¼Ì45/Í»º454UW†4545«¯wþ‰ÿÏ›”ÌÌÑ”ÌÌÑ”ÌÌÑ44/1elÏ›”1elÏ›”1elÏ›”1elÏ›”‰ÿwþ‰ÿÿÿŠ…ÿŠ…ÿ¬¬­ÿTTSTTS¬¬­ÿ¬¬­ÿTTSTTS¬¬­ÿ¬¬­ÿTTSTTS¬¬­ÿ¬¬­ÿTTSTTS¬¬­ÿf›ÎÎÿÿxvyTUSÿ¬¬­ÿêxÿˆÿwþ‰ÿwþÿ3ˆŠ‡ÿxwyÿ›eÿœÿ‰ŒºÌÌÑÌÌÑÌÌÑÌËÌÌËÌÌË̉Œº‰Œº‰ŒºÌÌÑ44/ÌÌÑ44/ÌÌÑΘaŸþψ2ŸJaÿ¶¶™ÑéhyϨ£„®´ÑÐÍŸ‰Œº­ª¤¬¯µ®´Ñ¨£„àæ‰Œºÿýͬ¯Ý¬¯µÞÛÕ ÊÉˬ¬­ªªªààà ààà ààà ààà ÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454ÌÌÌ444ÌÌÌ444ÌÌÌ444ÌÌÌ444‹‹‹rlOŽ”±rlOŽ”±rlOŽ”±rlOUW†«©zUW†«©zUW†«©zUW†«©zx{ˆ…x{ˆ…x{ˆ…x{ˆ…7:¿ÊÉˬ¬­ªªªÑÐÒ/0.ÏÏÏ111°Öòò†¼ò̃¼ìì°Öò ààà °Öò ààà †¼ò45ÌËÌ454†¼ò454ÌËÌ454ƒ¼ì44 ÌÌÌ444ƒ¼ì444ÌÌÌ444‹‹¿ „ÓÑ Ž”± †¼ò45/Í»º454UW†454ƒ¼ì44 èµ444x{444Wÿ©ÿWÿ‰ÿwþ‰ÿŒÿtÿŒÿÞ¾¿ÜßÚ¾ÜßÚ¾ÜßÚ$!&"BAÏ›”ÌÌÑ”ÌÌÑ”ÌÌÑ44/1elõ¿•ÉÍÉ7ÉÍÉ7ÉÍÉ737 AkÞdN"BAÞ¾¿"BAÞ¾¿"BAÞ¾¿Ï›”1elÏ›”1elÏ›”1elÏ›”õ¿• Akõ¿• Akõ¿• Akõ¿•Wÿ©ÿWÿ‰ÿwþ‰ÿŒÿtÿŒÿSÿTTSäääPQPÌËÌ454ÌËÌ454wtFUW†«©z‰ŒºwtFUW†«©z‰Œº§§§ÑÐÒ/0.%$%¬¬­TTSÛÜÛ%$%ÛÜÛ%$%ÛÜÛÑÐÒ/0.ZÏÔ¦1,ÑÐÒTTS454ÌË̬¬­‰ÿvþŠvþË3TTS454wtF‰ŒºÌË̬¬­ÿÿ˜ÿhêš.œfÒdTTS¬¬­daš.ŸfÒ/Ì.k4•ÌüÑ4Ò/Ì.ÐÍŸ3/0.ÐÍŸ3/0.ÑÐÒWÿ©ÿ/0.ZÏÔ¦1,ÑÐÒ!" 111[ÎÐ¥20ÏÏÏßÞà675 àààÊÉËTTS454ÌË̬¬­!" VVV444ÌÌ̪ªªßÞàWÿNÿ²üQ¤ƒX]|‰ÿvþŠvþË"%SŒÿRüý®RÜÔ 675 RL/®´ÑàààÊÉËTTS454wtF‰ŒºÌË̬¬­!" VVV444TQK¬¯µÌÌ̪ªªßÞà§bžÿYÿÿ˜ÿhê!" ßß™îg!ÿ!ßÞàdbœâžš.œfÒd!" œ/ždÑbßÞà675ÊÉËTTS¬¬­!" VVVªªªßÞà@;eÅ›ãÀdaš.ŸfÒ/Ì.òòòeü`w7 ‰É+Ì5®­¯/0.###íÌžÀã@Àšd2•ÌüÑ4Ò/Ì.ŽY%•ÊþÕ4Ë+Ì5®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63VP3®´ÑRL/WZI‰ŒºwtF(¬¯µTQK¦‡ YJ$ ó!" ßÞàx^ˆ¢9HA(.›ØŠ$x^Lj¢þÎ1x˜‡Jg/ŸJþψ1b.òòòÞÐí+.‹èœguBT£"EÕÒuSaD®¬¯ÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454UW†«©zUW†«©zUW†«©zUW†«©z§§§ÑÐÒTTS¬¬­/0.¬¬­TTS¬¬­TTSÛÜÛÛÜÛ/0.ZÏÔ¦1,ÏžÒ1Ô1.%$%454ÌËÌ4545«¯vþŠvþˉŒºTTS454ÌËÌFaEV IDATÌËÌ454«¬˜ƒÍ3}˜Íhÿ„/fÑÜš/$š.œfÒdTTS¬¬­TTS¬¬­daš.ŸfÒaš.ŸfÒ/Ì.•Ìü/Ì.YYYˆ‰‡xwy/0.Wÿ©ÿ¥„{©ÿZÏÔ¦1,ÏžÒ1Ô1.###[ÎÐ¥20­Ÿ¼/Ð21 ààà 454ÌËÌ454#$#444ÌÌÌ444à‡‹Nÿ²üQ¤ƒ®´Ñ‰ÿvþŠvþˉŒºŒÿRüý®RÜÔ¬¯µ675 ààà/ààà 454ÌËÌFÌËÌ454#$#444ÌÌÌTQKÌÌÌ444‰ˆ1bbÞužb‹ž§ÿX˜ƒÍ3}˜Íhÿß™«ÍTU™¬ßgßdcŸáêadb6:fÑÜš/$š.œ##"mÏÚ“1&œ/žCÞB675ÊÉË675ÊÉËTTS¬¬­TTS¬¬­VVVªªªVVVªªª@;eÅ›ã;eÅã$aš.ŸfÒaš.ŸfÒ'#`w7 ‰É`w7 ‰É­žÀãÀ•Ìü/Ì.•Êþ+Ì5¥²ü¥ÿ[ýÐÏÒŠÐÏÒ01.­ÊÍ®­ÊÍS63®´Ñ®´Ñàæ‰Œº##ݬ¯µ^{L¢…´1xþψ+.‹ÕÒu¥„YJ$íHA¸¿Ø¸$(vÜ蘇éhyŸhJaÿ¶Ðèœgd™£E]Þ»ô454454ÌËÌ454454ÌËÌ«©z‰Œº«©zUW†«©z‰Œº«©zUW†%$%ÛÜÛ%$%ÛÜÛuÏþ¦bzD1eFFUW†«©zÏ›ÚÌ0›ÎvþˉŒºv{«þËF«©zF«èfΉŒUÛ«î%UèfÎh2‰ŠvþœÑ4Ò/Ì.k4etFwtFxwy/0.YYYwtFÿýÍ03aN…ÿ©|uÏþ¦bRÑì¥aP*"B//Ž”±rlOÞ¾îH71eFFUW†«©zÏ›Ú&$ AKTQKx{ˆ…IànÈÃãQ¤ƒ®´Ñ¨¬e1›ÎvþˉŒºv{ŠQ”ËRÜÔ¬¯µuwr‚c/rlO/WZIF«©zF(TQKˆ…TQK‰ˆ²¨AÜ®õ8 éÈô8¨AÜXž#èfΉŒUÛ«î%UèfÎh2íAö¬ðWÝ©î#WíAö TµNÿ[ýb‰Švþœƒ‰Rüý"ž@Àb@ÍðÑ4Ò/Ì.k4¸ïÕ4Ë+Ì5k6S°²üN…ÿ²{N…ÿ¥ZÏÒŠuÏþ‹1uÏþÿÐ1Òíð®RÑì®/RÑì­+ÍW:7RL/®´ÑwtF‰ŒºTQK¬¯µ8¦ÑÈZ/aÿ¶ŸJ]Þ»£"E^{L8¦ÑÈZ/ýc\¤[{,aÿ¶ŸJ˜‡éhy*! ]Þ»£"Eèœgd™hÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454UW†«©zUW†«©zUW†«©zUW†«©z03a¬¬­¬¬­Ñ4Ò/Ì.ÛÜÛÛÜÛZÏÔuÏþ/ÍÿÑ31el«©z1el”›Îvþþ͉ŒºwvyŠUW†454ÌËÌ«©zUW†454ÌË̬š2ètFš2E™_ÿ6Ÿ2TTSaš.ZÏÔvþ01./Ì.•Ìü•3aÐÍŸ3/0./0.§§§wtF‰ŒºWÿN…ÿ„ýá|ZÏÔuÏþ/ÍÿÑ3[ÎÐRÑì èõ"BArlO"BA1ZI«©z1el(ˆ… Ak$¥¹ÃãNÿ „®´ÑO¬«²44/›Îvþþ͉ŒºwvyŠ737ËRüýà׬¯µTqt®Ž”± àààrlOŽ”± àà଱Ï454ÌËÌ«©zUW†454ÌËÌ#$#444ÌÌ̈…x{444ÌÌÌ1X¿$¨L/X¿$ÿš2ètFš2¿ íQKK¿ /bB#½|E™_ÿ6Ÿ2G›i6ƒ0675TTSVVV;eaš.`w7WÿNÿŠZÏÔvþS##[ÎÐRüýÀžÀã/0/Ì.•Ìü##+Ì5•ÊþS²{N…ÿ²{N…ÿ‹1uÏþ‹1uÏþ®/RÑì®/RÑ쮴щŒº¬¯µÈZ/8¦ÑŸJaÿ¶£"E]Þ»8¦ÑÈZ/8¦ÑŽ‹¤ýc\aœ†ŸJaÿ¶¶™Ñéhy˜‡]gT£"E]Þ»‹¾¬d™èœgDh¸¿HA(.›ØŠ$^ëéhy˜‡Jg/ŸJÏÒd™èœguBT£"ExÒº454ÌËÌ454454ÌËÌ454«©zUW†«©z‰Œº«©zUW†«©z‰ŒºTTSTTSTTSTTSTTSTTSÑ4Òœ%$%%$%¦1,uÏþ/͉Œº‰ŒºÌÌÑÏ™aŠþ͉Œºv{454454334jÅ06Ÿ2ÐÊaþÎfÒd¬¬­¬¬­¬¬­¬¬­ŸfÒŸfÒŸfÒŸfÒZÏÔÐÏÒe0ÿŠ…Šk4k4ìp; IDATÑ4ÒÑ4ÒÐÍŸÐÍŸÐÍŸÐÍŸÑÐÒ§§§xwy©ÿN…ÿ„¦1,uÏþ/Í¥20RÑì è®´Ñ®´Ñ‰Œº‰Œº¬¯µ¬¯µÜßÚá^C²ü „®´Ñ¨¬ÌÌÑÏ™aŠþ͉Œºv{ÉÍÉõŸl®à׬¯µuw 454454444444ý`|ý`|33 ) )"Cá#½[|áÝC¥„œâž4jÅ06Ÿ2ÐÊaþÎfÒd7kÌ 6ƒ"0õÊ}ÞÐídÑbÊÉËÊÉËÊÉËÊÉˬ¬­¬¬­¬¬­¬¬­ªªªªªªªªªªªªÅ›ãÅ›ãÅ›ãÅ›ãŸfÒŸfÒŸfÒŸfÒ ‰É ‰É ‰É ‰ÉWÿ¥ AÿXT²üZÏÔÐÏÒe0ÿŠ…Š[ÎЭÊÍh2þ‹‰®b@b@@@k4k4Ñ4ÒÑ4Òk6k6Õ4ËÕ4ËRL/RL/RL/RL/RL/RL/wtFwtFwtFwtFwtFwtFTQKTQKTQKTQKTQKTQKދŽ‹;Cu;Cu¶™Ñ¶™ÑJg/Jg/‹¾¬‹¾¬uBTuBT(.›ØÒeJg/¶™ÑuBT‹¾¬í†yÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454UW†«©zUW†«©zUW†«©zUW†«©z§§§«©z­«©zUW†Ñ4Òœ/0.ÛÜÛÛÜÛÐÊa03/Í‹11ï›ÐÌE™_‰ŒºwvyŠÌËÌFÌËÌ454èfÎ33èþÍh2Ì–;þΟŸ2š.œˆ‰‡xwyÿ™Íg3ZÏÔe0îY…›Û«ï›ÐÐvþ0Ìü/Ì.03a/0.ÐÍŸ‰Œº‰ŒºÿýÍ3/0.03a/0.áÝC|„²{ÿÐÊa03/Í‹11õÊ} 6 è®/2õ¿äÜ/bB®´ÑO¬«²ï›ÐÌE™_‰ŒºwvyŠð˜ÎÉhG›i¬¯µTqt®ààà/ààà ÌËÌFÌËÌ454ÌÌÌTQKÌÌÌ444¨AÜý`|ý`|¨ „Xž#èfÎ33èþÍh2íAö ) )íà× Þ½C¥„½½[|dbÌ–;þΟŸ2š.œÉ•47}ÞЃƒ"0œ/žVWUª©«ˆ‰‡xwyŠŠŠvvv¨c„X|ÿ™Íg3ØvÙ(Š'Wÿ Aô8½éÈõ¿ä¬NÿØZÏÔe0îY…›Û«ï›ÐÐvþS[ÎÐh2îY‰¾Ý©ð˜ÎÎRüýSÀãÀ•Ìü/Ì.•Êþ+Ì5®´Ñ®´Ñàæ‰Œº##ݬ¯µ8¦Ñaÿ¶]Þ»¤ýc\¤È/8¦ÑÈZ/ýy˜‡éhyŸhJaÿ¶ŸJ*!™èœgd™£E]Þ»£"E­(vÜØŠ$¿HAÇaÿ¶ŸJy˜‡ˆ]Þ»£"E™èœgu454454ÌËÌ454454ÌËÌ«©z‰Œº«©zUW†«©z‰Œº«©zUW†UW†UW†%$%ÛÜÛ%$%ÛÜÛœ–2•ÌaZUW†454Ï›”1elÏ›”&UW†544/ÌÌÑF4ŠéþÎ3ŠvþŠ5éþË›12gxxwyg3ZÏÔvþŠ›ÐÐeþŠe0Š›ÐÑ4Ò/Ì.k4•ÌüÐÍŸ‰Œº‰ŒºÿýÍ3/0.½¼žÀ|Wœ–2•ÌaZ¾—F•Ê\[Ž”± Þ¾¿"BAÞ¾¿Ž”±¬±Ï454Ï›”1elÏ›”&UW†#$#444õ¿• Akõ¿• x{$!&ÜßÚ0!&²ü44/ÌÌÑF4Š737ÉÍÉI3®¨£Ýý`|²üNÿ¯\}¨¤ƒWZÎ3ŠvþŠ5éþË( )®Rüý®$,ÿÜÔe!}ž L2gx6d‹ ª©«xwyvvvX|g3(Š'WÿNÿ²¿ä¬Cÿ² A²¿äZÏÔvþŠ›ÐÐeþŠe0Š›Ð[ÎÐRüý®˜ÎÎBüý®h2®˜Î@Àb@ÍðÑ4Ò/Ì.k4¸ïÕ4Ë+Ì5k6C­¥ÿ²{²{[ýŠ1.ÐÏÒŠ1‹1101.###­ÊÍ®/®/+S63RL/®´ÑwtF‰ŒºTQK¬¯µÈZ/ŸJ£"E¢…´´…ßj…ãYJ´ˆÏÐÏÒ$ uÒôxÒºÌËÌ454ÌËÌ454ÌËÌ454ÌËÌ454UW†«©zUW†«©zUW†«©zUW†«©z03a¬¬­¬¬­ÛÜÛÛÜÛE™_ÌÑÌÌÑï›ÐZºñ&ºŒº&E™_ÌÌÑe›Î›E™_ÌÌÑ›Î4544542éþ͉ŒºwtFÿŒºUËÌ«©z2„/Ïš/$TTSaš.vþ›e2ÿ%UÛ«Š›Ðî%UÐ/Ì.•ÌüÐÍŸ‰Œº‰ŒºÿýÍ03a/bB ßÚÜßÚõ¿äWE™_ÌÑÌÌÑï›ÐZV‹œ„ IDATG›iÍÉÉÍÉð˜Î[ÐöдѺñ&ºŒº&·ð ¯µ /bBÜßÚCÃã½/bBÜßÚÃãE™_ÌÌÑe›Î›E™_ÌÌÑ›ÎG›iÉÍÉB”˾lG›iÉÍÉ”Ë 454454444444X]#¨£„®´ÑRL/ÿ´Ñ‘ààrlOX]#n\2éþ͉ŒºwtFÿŒºUËÌ«©z2ê$ÿà׬¯µTQKþ¯µxÌ̈…& daš/$“1&675TTSVVV;eaš.`w7Nÿ½=ÿ8 éȲ¿äô8¬vþ›e2ÿ%UÛ«Š›Ðî%UÐRüý¾l5þ#WÝ©®˜Îî#WÎÀžÀã/0/Ì.•Ìü##+Ì5•Êþ[ý¥ÿ[ý01.ÐÏÒ01.S63­ÊÍS63®´Ñ‰Œº¬¯µ¢…´þψÕÒu[|[|!"óØŠ$(vÜØÒe¸¿^ŸJaÿ¶¶™ÑéhyÏ£"E]Þ»‹¾¬d™ÒÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3še2ÿ44/1elÏ›”1elÏ›”ÌÌÑ44/2hŸšd2fœÎšd2ºð!454ÌËÌ454ÌËÌ454§§§ÐÎ6œ/0.ÁÏÒ/0.Ÿh32hŸ/0.ÐÎ6œ/0.ÁÏÒ/0.Ÿh32hŸ/0.ÍÒÎüþ—32—ÍÎiidaš.ŸfÒ/Ì.ÐÏÒ01.ÑÏÒ/1.ÿÐÏÒ01.3ï$!&"BAÞ¾¿"BAÞ¾¿ÜßÚ$!&ï44/1elÏ›”1elÏ›”ÌÌÑ44/ïñò737 Akõ¿• Akõ¿•ÉÍÉ737 Dvb@žÀãb@žÀãšd2fœÎšd2‡¾îœg3d™Íœg3y®â ààà ààà þýþ454ÌËÌ454ÌËÌ454ïïï444ÌÌÌ444ÌÌÌ444UTV¥¤C[\½/0.ÐÎ6œ/0.###­«9"$–111®­¯™gÿ/0.ÁÏÒ/0.###­ÊÍ"111®­¯†aCzŸ½/0.Ÿh32hŸ/0.###¢i9-f–111®­¯¥¤C[\½/0.ÐÎ6œRSQ­«9"$–ßÞà™gÿ/0.ÁÏÒRSQ­ÊÍ"ßÞà†aCzŸ½/0.Ÿh32hŸRSQ¢i9-f–ßÞà!¤ß\/0.ÍÒÎRSQ«ÊÌ$ƒ‚D\\œ¤¤dXZ332—ÍÎiÿ"SV˜­ªhG@;eÅ›ãÀdaš.ŸfÒ/Ì.òòòeü`w7 ‰É+Ì5®­¯VWUª©«ˆ‰‡xwy!" ŠŠŠvvvßÞàWÿÿXT¨¬©ÿ‰ÿÿŠ…v{wþ!" Œÿþ‹‰uwtÿ6ÝáÿXT¨¬2ÿŠ…v{$"þ‹‰uwSÞßÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ344/1elÏ›”1elÏ›”1el”ÌÌÑšd2šd2fœÎˆ‰U454ÌËÌ454454ÌËÌÏžÒ6þÎ2Ò/0.}ÏÓ¬ÿTÐÒ/0.Ÿ4Õ3Îd2œÒ/0.32—ÍÎiÍÎiÿ603aÍÎidaš.ŸfÒaš.ŸfÒ/Ì.ÐÏÒŠÐÏÒ01.ÐÏÒŠÐÏÒ01.$!&"BAÞ¾¿"BAÞ¾¿"BA¾ÜßÚHXD1elÏ›”1elÏ›”1el”ÌÌÑZXX Akõ¿• Akõ¿• Ak7ÉÍÉb@b@žÀãšd2šd2fœÎ½‰Sœg3d™Í555 ààà àààRRR454ÌËÌ454454ÌËÌWXW444ÌÌÌ444444ÌÌÌ¥„¥„[|ÏžÒ6þÎ2Ò/0.­Ÿ¼9ÞÐí"0Ï111mm“}ÏÓ¬ÿTÐÒ/0.€ÈбùOÏÏ111…A…A{¿Ÿ4Õ3Îd2œÒ/0.¢5Ê9Ófû-šÏ111\\œ¤¤d¤¤dÿ X]|¤¤d32—ÍÎiÍÎiÿ603aÍÎiSV˜­ªh­ªh<SV\­ªh@;eÅ›ã;eÅã$aš.ŸfÒaš.ŸfÒ'#`w7 ‰É`w7 ‰ÉVU¨¬VXUª©«ˆ‰‡v{ˆŠ‡xwyŠŠŠuwŠ‹ŠvvvWÿÿXT¨¬ÿXTW¨¬2ÿŠ…v{ÿŠ…‰v{$ÿþ‹‰uwþ‹‰ŒuwµAôNÿ²üe0îvþŠh2îRüý®3ÿþÍÿ3ÿþÍÿ33ÿþÍÿ3ÿþÍÿ33ÿþÍÿ3ÿþÍÿ33ÿþÍÿ3ÿþÍÿ3ÌÌÑÏ›”1elÏ›”1elÏ›”ÌÌÑ44/fœÎfœÎšd2ÌËÌÌËÌ454ÌËÌ4540d0dþÎÑÐÒDÿDÿ¬ÿÑÐÒ4^4^ÎdÑÐÒÏžÒÐÎ6ÿþd}ÏÓÁÏÒðÿŸ4ÕŸh3ΘaÖXÒÍÒ2ý32—ÿ603a03aÐÍŸ32—ÐÏÒŠuÏþuÏþuÏþÿÏÐÏÒÐÏÒÿÏuÏþuÏþuÏþuÏþÿÏÐÏÒÜßÚÞ¾¿"BAÞ¾¿"BAÞ¾¿ÜßÚ$!&ÌÌÑÏ›”1elÏ›”1elÏ›”ÌÌÑ44/ÉÍÉõ¿• Akõ¿• Akõ¿•ÉÍÉ737žÀãžÀãb@fœÎfœÎšd2d™Íd™Íœg3àààààà ààà ÌËÌÌËÌ454ÌËÌ454ÌÌÌÌÌÌ444ÌÌÌ444» b IDAT C C¥„0d0dþÎÑÐÒ } }ÞÐíÏÏÏ,,mDÿDÿ¬ÿÑÐÒ-ý-ý±ùÏÏÏ C C…A4^4^ÎdÑÐÒ4o4oÓfûÏÏÏ¥„¥¤C¥¤CÏžÒÐÎ6ÿþd­Ÿ¼­«9ÞÜjm™™}ÏÓÁÏÒðÿ€ÈЭÊÍÞûþ…A†aC†aCŸ4ÕŸh3Θa¢5Ê¢i9ÓšjW!¤!¤ÖXÒÍÒ2ý¹ZÑ«Ê4Üû\\œÿ X]|X]|¨£„\\œ32—ÿ603a03aÐÍŸ32—SV˜<SV\SV\­ª¤SV˜õ¿äCÃãCÃãNÿï›Ðe›Îe›Îvþð˜ÎB”ËB”ËRüýš/œÿš/œÿš/œÿÿ‰ÿÿÿÿÿÿeÿaÿ.ÿaÿ.ÿÿÿÿ˜ÿÿ˜ÿÿÿ3ÿÿ˜ÿÿ˜ÿÿ33‰ÿÿÿÿÿ33eÿaÿ.ÿaÿ.ÿ33344/ÌÌÑÏ›”ÌÌÑÏ›”ÌÌÑ44/1elšd2fœÎfœÎfœÎšd2454ÌËÌÌËÌ454ÌËÌÌËÌ45402Êœ1b./0.?1.ƒ1-/0.a˜Í2hŸaÌ+/0.1b.ÿМÿМƒ1-¼¼aÌ+̢̢*¨.Ó‹Ó‹ÐÍŸ03aÍÎiÍÎi03aÿ6óV%ÿ™Íˆ%‡ˆ%‡ˆ%‡'‹Yœ‹1uÏþ‹1ÿÿÿ™/ÿ‰ÿ‹1‹1‹1‹1$!&ÜßÚÞ¾¿ÜßÚÞ¾¿ÜßÚ$!&"BA44/ÌÌÑÏ›”ÌÌÑÏ›”ÌÌÑ44/1el737ÉÍÉõ¿•ÉÍÉõ¿•ÉÍÉ737 Akb@žÀãžÀãžÀãb@šd2fœÎfœÎfœÎšd2œg3d™Íd™Íd™Íœg3 àààààà àààààà 454ÌËÌÌËÌ454ÌËÌÌËÌ454444ÌÌÌÌÌÌ444ÌÌÌÌÌÌ444[\½[\½[|02Êœ1b./0.SUÇ"$–SaD111gÿgÿ“?1.ƒ1-/0.S63"€80111zŸ½zŸ½{¿a˜Í2hŸaÌ+/0.^—Ç-f–^Ë6111[|à½à½1b.ÿМÿМSaDôƒôƒ“ÔÿÔÿƒ1-¼¼€80ÓþÓþ{¿ÿà½ÿà½aÌ+̢̢^Ë6̑̑ü©ã³ã³*¨.Ó‹Ó‹G¦/¶¯¶¯¨£„X]|¤¤d¤¤dX]|ÿ ÐÍŸ03aÍÎiÍÎi03aÿ6­ª¤SV\­ªh­ªhSV\<û’¨c„VUVUVU²8ÀóV%ÿ™Íˆ%‡ˆ%‡ˆ%‡'‹Yœðz#ØvÙ„%Ž„%Ž„%Ž$®Wú›ÿXTÿXTÿŠ…ÿŠ…þ‹‰þ‹‰ÿXTÿXTÿXTÿXTÿŠ…ÿŠ…ÿŠ…ÿŠ…þ‹‰þ‹‰þ‹‰þ‹‰O¬«‘45wvyUUSTqtx[X4jÅd dd dE™_ÿÏÿÏÎ4aÐÒÐÒ¸™bç7ç7¸™bç7ç7E™_ÿÏÿÏÎ4aÐÒÐÒΙaÿþÏÿþÏÿÿÌÌÑ44/1el44/1el44/ÌÌÑÏ›”fœÎšd2šd2šd2fœÎÌËÌ454454ÌËÌ454454ÌËÌÐÎ6ÐÎ6ÁÏÒÁÏÒŸh3Ÿh3ÐÎ6ÐÎ6ÑÐÒ1b.2ÁÏÒÁÏÒÑÐÒƒ1-TÿŸh3Ÿh3ÑÐÒaÌ+2œýÍÒÍÒÑÐÒ*¨.ûx32—454wtFwtFš0ÿ~iÿú+ÿÿÿ‰ÿÜßÚ$!&"BA$!&"BA$!&ÜßÚÞ¾¿ÌÌÑ44/1el44/1el44/ÌÌÑÏ›”ÉÍÉ737 Ak737 Ak737ÉÍÉõ¿•žÀãb@b@b@žÀãfœÎšd2šd2šd2fœÎd™Íœg3œg3œg3d™Íààà ààà àààÌËÌ454454ÌËÌ454454ÌËÌÌÌÌ444444ÌÌÌ444444ÌÌÌ¥¤C¥¤CÐÎ6ÐÎ6­«9­«9™™ÁÏÒÁÏÒ­ÊÍ­Ê͆aC†aCŸh3Ÿh3¢i9¢i9¥¤C¥¤C[|[|ÐÎ6ÐÎ6ÑÐÒ1b.2­«9­«9ÏÏÏSaD"0™™““ÁÏÒÁÏÒÑÐÒƒ1-Tÿ­ÊÍ­ÊÍÏÏÏ€80Oÿ†aC†aC{¿{¿Ÿh3Ÿh3ÑÐÒaÌ+2œý¢i9¢i9ÏÏÏ^Ë6-š!¤!¤ü©ü©ÍÒÍÒÑÐÒ*¨.ûx«Ê«ÊÏÏÏG¦/uþ\\œ32—SV˜ RL/RL/454wtFwtF444TQKTQK¨¬¨¬v{v{uwuw¨¬¨¬¨¬¨¬v{v{v{v{uwuwuwuwQ¤ƒ „ „ „ „‘45vþËþÍþÍþÍþÍUUSRÜÔà×à×à×à×x[XΙaÿ06Ÿ2ΘaþΟ2ÿÿΙaÿ06Ÿ2ΘaþΟ2ÿÿΙaÿ06Ÿ2ΘaþΟ2ÿÿΙaÿ06Ÿ2ΘaþΟ2ÿÿΙaÿ06Ÿ2ΘaþΟ2ÿÿΙaÿ06Ÿ2ΘaþΟ2ÿÿΙaÿ06Ÿ2ΘaþΟ2ÿÿΙaÿ06Ÿ2ΘaþΟ2ÿÿ44/1elÏ›”1elÏ›”1el”ÌÌÑšd2šd2fœÎˆ‰UÌËÌ454454ÌËÌ02Ê/0.ÐÎ6ÿМ.?1./ÁÏÒ¼a˜Í/0.Ÿh3Ì¢ÿ6ýÿþdœ/0.02Ê/0.¼ÏÓðÿÿÏÒ/0.?1./̢Θa2hŸ/0.a˜Í/0.Ó‹Ò2ýÒÎ/0.ý3./003aÐÍŸ02aÐÍŸ03awtF‰ŒºwtF‰ŒºfÐ0Zúš+Ôè™,ÿŠg×wþ$!&"BAÞ¾¿"BAÞ¾¿"BA¾ÜßÚHXD1elÏ›”1elÏ›”1el”ÌÌÑZXX Akõ¿• Akõ¿• Ak7ÉÍÉb@b@žÀãšd2šd2fœÎ½‰Sœg3d™Í555ààà àààRRRÌËÌ454454ÌËÌWXWÌÌÌ444444ÌÌÌ[\½¥¤Cà½.02Ê/0.ÐÎ6ÿМQSUÇ111­«9ôƒgÿ™Ôÿ?1./ÁÏÒ¼S631­ÊÍÓþzŸ½†aCÿླྀJ IDAT.a˜Í/0.Ÿh3Ì¢N^—Ç111¢i9Ì‘ü奤C[\½[\½ÿМÿþdœ/0.02Ê/0.ôƒÞÜ}"$–111SUÇ111ÔÞà™gÿgÿ¼ðÿÿÏÒ/0.?1./ÓëóÞûýÊÍ"111S631ÿெaCzŸ½zŸ½Ì¢Î˜a2hŸ/0.a˜Í/0.̑Ӛo-f–111^—Ç111²³à!¤ß\ß\Ó‹2ýÒÎ/0.ý3./0¶¯ôJÜùÊÌ$111ýU611ßÞàX]|¨£„X\|¨£„X]|03aÐÍŸ02aÐÍŸ03aSV\­ª¤SV\­ª¤SV\RL/®´ÑRL/®´ÑwtF‰ŒºwtF‰ŒºTQK¬¯µTQK¬¯µQ¤ƒ®´ÑvþˉŒºRÜÔ¬¯µQ¤ƒ¯\}vþËŠ5RÜÔ®$,¯\}N…ÿ½¼, õŠ5uÏþœ–2Fï®$,RÑì¾—FFð2gŸΙaÿþΟŸ2ÿ2gŸΙaÿþΟŸ2ÿ2gŸΙaÿþΟŸ2ÿ2gŸΙaÿþΟŸ2ÿ2gŸΙaÿþΟŸ2ÿ2gŸΙaÿþΟŸ2ÿ2gŸΙaÿþΟŸ2ÿ2gŸΙaÿþΟŸ2ÿÌÌÑ”1elÏ›”1elÏ›”ÌÌÑ44/2hŸšd2fœÎšd2ºËÌ454454ÌËÌ454ÌËÌ454ÛÜÛÐÎ6ÿМÁÏÒ¼Ÿh3Ì¢ÿМÿþdœ/0.¼ðÿÿÏÒ/0.̢Θa2hŸ/0.Ó‹2ýÒÎ/0.ÍÎiýÊÐÍŸýÊÍÎi32—ÌËÌF‰Œº‰Œº01.ÐÏÒŠ1‹1101.š0ÿfj+lðÕfÖ‚0ŠÑvÿÿÿ¦01.ÐÏÒŠ‹1vþ01.ÜßÚ¾"BAÞ¾¿"BAÞ¾¿ÜßÚ$!&ÌÌÑ”1elÏ›”1elÏ›”ÌÌÑ44/ÉÍÉ7 Akõ¿• Akõ¿•ÉÍÉ737Cw­b@žÀãb@fœÎšd2fœÎšd2d™Íœg3d™Íœg3y®à ààà ààà ÌËÌ454454ÌËÌ454ÌËÌ454ÌÌÌ444444ÌÌÌ444ÌÌÌ444¥¤Cà½ÐÎ6ÿМ­«9ôƒ™ÔÿÁÏÒ¼­ÊÍÓþ†aCÿཟh3Ì¢¢i9̑ཥ¤C[\½ÿМÿþdœ/0.ôƒÞÜ}"$–111Ôÿ™gÿ¼ðÿÿÏÒ/0.ÓþÞûýÊÍ"111ÿཆaCzŸ½Ì¢Î˜a2hŸ/0.̑Ӛo-f–111ã³!¤ß\Ó‹2ýÒÎ/0.¶¯JÜùÊÌ$111¤¤düਣ„üतd\\œÍÎiýÊÐÍŸýÊÍÎi32—­ªhÄ­ª¤Ä­ªhSV˜ààà/®´Ñ®´ÑÌËÌF‰Œº‰ŒºÌÌÌTQK¬¯µ¬¯µ¯\}XTŠ5Š…®$,‹‰¯\}Š5®$,Cã½¼CÃã²1dÏΜ–2e›ÎŠ+BÕº¾—FB”Ë®ΙaÿÌÌÑ44/ÌÌÑ44/ÌÌÑ44/1el›gefœÎšd2fœÎšd2fœÎšd2î%UÌËÌ454wuÝÿМò1¼"™`Ì¢0jý0d­DÿÞe4^7ðŸ-uÊ—32—ÍÎifiaš.ŸfÒ/Ì.ÐÏÒ01.ZÏÔŽ˜ý‚—ðÑv™)ÿÔè,fÖ02-ÐÏÒ01.W1ÜßÚ$!&ÜßÚ$!&ÜßÚ$!&"BA&õÝÌÌÑ44/ÌÌÑ44/ÌÌÑ44/1elõ¿½ÉÍÉ737ÉÍÉ737ÉÍÉ737 AkcC(žÀãb@žÀãb@žÀãb@8$fœÎšd2fœÎšd2fœÎšd2#%!d™Íœg3d™Íœg3d™Íœg3™Îààà 222ÌËÌ454###ÌÌÌ444úø™à½ZzdÿМ0ŠôƒšóÔÿƒÿ¼SÓþ´F"ÿà½IWaÌ¢&X‡Ì‘±üå CY*½0dô© }nv,þDÿâ!-ý†$â CHÀ4^&ðº4o›vMää-uÙ°"JQùO¦I\\œ¤¤dXZ332—ÍÎiÿ"SV˜­ªhCG;eÅ›ã$aš.ŸfÒ'#`w7 ‰É/Ð9ª©«ˆ‰‡xwy«¬ªvvv6ÝáÿXT¨¬2ÿŠ…v{$"þ‹‰uwªÞàNÿ½¼CÃã²ü2vþÿÏœ–2e›ÎŠ$"RüýÕï¾—FB”Ë®SÞß&[ÿ]{B}*¯ÿ/0.###®­¯¥„[|/0.ÏžÒ1b.###­Ÿ¼SaD®­¯b¨žX/0.ègÑ™/###Ài®@—R®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.ŒÄyŠ IDAT###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯/0.###®­¯/0.###®¬¯—Et"æ²}¥„[|¥„[|ÏžÒ2þÎÒ1b.­Ÿ¼"0ÞмSaDb¨žÿb¨žXègÑÿhè˜Ñ™/Ài®îgÀ™®@—R¥[ý§¥Y[ýÐÏÒÿéÏ01.­ÊÍáÿÊS63¥²ü¥ÿ[ýÐÏÒŠÐÏÒ01.­ÊÍ®­ÊÍS63¥¿b¥åž[ýÐÏÒ›/œÐÏd01.­Ê;4 ­Ê`S63¥²ü¥ÿ[ýÐÏÒŠÐÏÒ01.­ÊÍ®­ÊÍS63¥[ý¥[ýÐÏÒÿÏÒ01.­ÊÍ"ÞÊÍS63¥²ü¥ÿ[ýÐÏÒŠÐÏÒ01.­ÊÍ®­ÊÍS63¥[=¥Ã[ýÐÏÒeÿ›Ò01.­ÊÍ(jþØ–ÍS63¥[ý¥[ýÐÏÒÿÏÒ01.­ÊÍ"ÞÊÍS63¥‘45¥ÌË[ýÐÏÒUUSЫ­01.­ÊÍx[X­¥¨S63¥±TU¥¬«[ýÐÏÒ‰Š‡Ðvy01.­ÊͬŒ­qtS63VWUª©«YYY§§§YYY§§§¥[ýÐÏÒ01.­ÊÍS63í†y½ ƒÿ"²!D˽ ƒÿ"²!DËÿ/0.###S1¯[|¥[ý¥[ý¥„YJ2ÿÿÿÿþÎ$ "0Þûþ"Þûþ"ÞÐíp›žÿ¨£ÝX]#b5WÿhéþÎ2˜û%îgÿÚö& ™“GZüÿÏ1Õï+¦æâ¿bAåžZü›/œeÑd¾4 BÌ`¦æâ[_¨¥¡XZü˜ÿèhŸáía¦æâZüÿÏ1Õï+¦æâZüÿÏ1Õï+¦æâ–¢j^ãZübÿ.žÒˆá5x˦æâ–¢j^ãZübÿ.žÒˆá5x˦æâ–¢j^ãZübÿ.žÒˆá5x˦æâ–¢j^ãZübÿ.žÒˆá5x˦æâZüÿÏ1Õï+ãâVWUààà ª©«/0.YYYÌËÌ454§§§###YYYÌÌÌ444§§§®­¯¥[ý¥[ý/0.ÐÏÒÿÿ01.###­ÊÍ"ÞûþS63®¬¯C`}½ ƒÿß¼ÿ²!DË[ý¥[ýÿÿ"Þûþ"X]#¨£Ý¨£ÝX¿$2éþÎéþΚ2& ÿÚöÿÚö¿ [|§¥„Y[|§¥Y1ÿèÏ1ÿé1òÿÏ1òÿó០aóáŸïÑf/šïÑfðÐc0ðÐcd¼ºœDFd¼ºƒ—}icƒ—«•¿UkA«•¿²{N…ÿ²{Nÿ‹1uÏþ‹1vþ®/RÑì®/Rý[|¥„[|¥2þÎ2ÿ"0ÞÐí"0ÞþZää¦Zä(ÔØÿ,(Ô&#ÎÚÝ2&#ÎÅ›ã;eÅ›ãjŸfÒaš.ŸfÒž ‰É`w7ð)'¹ IDAT ‰ÉxÅ[ã;¥Å[ãjŸÒaþ.ŸÒžš$ÍfÜ3š$Íxû’nèû’ãóV% ªÛóV%Òðz#†Ýðz#˱ÓUO-«±ÓUO«Š»‡vEyŠ»‡wy¬ºTFc¬ºTtÊÉË675¬¬­TTSªªªVVVC`}¨£ÝX]#béþÎ2˜ÿÚö& ™€€€ÿ€€€¥[ýÐÏÒ/0.­ÊÍ"111¥[ý¥[ýÿÿÿÿÞûþ"Þûþ"X]#2& 675TTSVVV¥ÿÿÞûþÿúñÿ†€€€ÿ/0.ÑÐÒ/0.###ÏÏÏ111®­¯¥„[|¥„[|/0.ÏžÒ2þÎ1b.###­Ÿ¼"0ÞÐíSaD®­¯b¨žÿbžX/0.ègÑÿh˜™/###Ài®îg™@—R®­¯¥[ý§¥Y[ý/0.ÐÏÒÿé01.###­ÊÍáÿúS63®­¯¥²üNÿ[ý/0.ÐÏÒŠvþ01.###­ÊÍ®RüýS63®­¯¥¿bAåž[ý/0.ÐÏÒ›/œeÑd01.###­Ê;4 BÌ`S63®­¯¥²üNÿ[ý/0.ÐÏÒŠvþ01.###­ÊÍ®RüýS63®­¯¥[ý¥[ý/0.ÐÏÒÿÿ01.###­ÊÍ"ÞûþS63®­¯¥²üNÿ[ý/0.ÐÏÒŠvþ01.###­ÊÍ®RüýS63®­¯¥[=¥Ã[ý/0.ÐÏÒeÿ›01.###­ÊÍ(jþØ–S63®­¯¥[ý¥[ý/0.ÐÏÒÿÿ01.###­ÊÍ"ÞûþS63®­¯¥‘45oÌË[ý/0.ÐÏÒUUS««­01.###­ÊÍx[Xˆ¥¨S63®­¯¥±TU›@¯œ IDATO¬«[ý/0.ÐÏÒ‰Š‡wvy01.###­ÊͬŒTqtS63®­¯VWUª©«/0.YYY§§§###YYY§§§®­¯/0.###®¬¯€€€ÿ€€€/0.111[|¥„[|1b.þÎÒ1b.SaDÞмSaDžXb¨žX™/è˜Ñ™/@—RÀ™®@—R[ý¥Y[ý01.éÏ01.S63ÿÊS63[ý¥ÿ[ý01.ÐÏÒ01.S63­ÊÍS63[ý¥åž[ý01.ÐÏd01.S63­Ê`S63[ý¥ÿ[ý01.ÐÏÒ01.S63­ÊÍS63[ý¥[ý01.ÿÏÒ01.S63ÞÊÍS63[ý¥ÿ[ý01.ÐÏÒ01.S63­ÊÍS63[ý¥Ã[ý01.ÿ›Ò01.S63Ø–ÍS63[ý¥[ý01.ÿÏÒ01.S63ÞÊÍS63[ý¥ÌË[ý01.Ы­01.S63­¥¨S63[ý¥¬«[ý01.Ðvy01.S63­qtS63ª©«§§§§§§€€€–!ãc0.ˆ Fþ„¼º|·˜›aâ•À^[ý01.S63[ý01.S63[ý01.S63[ý01.S63[ý01.S63[ý01.S63[ý01.S63[ý01.S63[ý01.S63[ý01.S63ÿÑÏÒÑÏÒÑÏÒÑÏÒ;¥Å›ã;¥Å[ã2ΟfÒaÎ.Î25« ‰É`«7ËUþ„bÞÞ„b|➟ÿlËÍŸÿla”¢þnÊÉ¢þn^’"dÞãœÿi—ÿmÿ“Wÿ©ÿZÏÔ¦1,[ÎÐ¥20KµÔDÔ,¼,ÑEÒ/».AB¿á¾8þ8ÈÈ6ÿ8ÊÈÑÐÒ/0.ÏÏÏ111@@?ÀÀÁ545ËÌË666ÊÊÊ¥[ýÐÏÒ01.­ÊÍS63b@žÀãk4•Ìük6•Êþ(¤Øå\ ûÐô0ý®R6ÊÑ$Ô/Ü,Ô#Í,Ý3A2¨ IDAT‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿše2ÿše2ÿše2ÿeÿeÿeÿxÿxÿxÿxÿxÿxÿÿþÍÿÿþÍÿÿþÍÿ=?<ÿ=?<ÿ=?<ÿÑÐÒÑÐÒÑÐÒÏÏÏÏÏÏÏÏÏ;¥Å›ã¨c„¨c„¨c„¨c„Å›ã;¥2ΟfÒÿ™Íÿ™Íÿ™Íÿ™ÍŸfÒ2Î5« ‰ÉØvÙØvÙØvÙØvÙ ‰É5«„bÞÞF…DF…DÞÞ„bŸÿlËÍfÎffÎfËÍŸÿl¢þnÊÉA«mA«mÊÉ¢þn"dþ@þ@"dÿi üg ügÿiÿmüAüAÿmWÿNÿNÿWÿZÏÔvþvþZÏÔ[ÎÐRüýRüý[ÎÐK?Y?YKÔDÔcŠþcŠþÔDÔÑEÒdfîdfîÑEÒAB#ÿ #ÿ AB8þ836368þ86ÿ85ÿ55ÿ56ÿ8675675ÑÐÒTTSTTSÑÐÒÏÏÏVVVVVVÏÏÏ@@?hcEhcE@@?545›™j›™j545666wtnwtn666¥¥ÐÏÒÿÏÿÏÐÏÒ­ÊÍÕïÕï­ÊÍb@$!&$!&b@k444/44/k4k6737737k6(¤åiÿåiÿ(¤ ûÐŢŢ ûÐý®×Ÿþןþý®66Ñ$Ô  Ñ$ÔÔ#Íý"ý"Ô#ÍvþÿÿwþwþÿÿvþÿÿwþwþÿÿdjÎþÏÿf›Îf›ÎþÏÿaš.aÿ.ÿ››aÿ.ÿ‡ÿÿˆˆÿÿš/$š/œÿˆˆš/œÿÿþÍÿ33ÿþÍÿKKKˆŠ‡ÿÃÁÄÃÁÄˆŠ‡ÿÑÐÒÑÐÒÏÏÏÏÏÏX|X|¨c„g3g3ÿ™Í(Š'(Š'ØvÙF…Dº{¼º{¼fÎfš2šš2šA«m¿U“¿U“þ@þ@ üg ügüAüANÿNÿvþvþRüýRüý?Y?YcŠþcŠþdfîdfî#ÿ #ÿ 36365ÿ55ÿ5675675TTSTTSVVVVVVhcEhcE›™j›™jwtnwtnÿÏÿÏÕïÕï$!&$!&44/44/737737åiÿåiÿŢŢןþןþ  ý"ý"‰ÿÿÿÿÿÿÿ‰ÿÿÿÿÿÿωÿÿÿþÏÿÿÿ‰ÿþÏÿþÏÿše2ÿþÏÿþÏÿþÏÿše2ÿþÏÿ11þÏÿeÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿŸÒŸÒaÿ.ÿ˜xÿÿÿ˜ÿÿÿÿxÿ˜ÿÿêê˜ÿÿxÿš/œÿš/œÿš/œÿxÿš/œÿfÑdfÑdš/œÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿ33ÿþÍÿ=?<ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ=?<ÿˆŠ‡ÿxvyxvyˆŠ‡ÿ¨c„¨c„X|ÿ™Íÿ™Íg3ØvÙØvÙ(Š'F…DF…DfÎffÎfA«mA«m]³` IDATwþwþÿÿÿÿ1wþ1wþÿÿ11ÿÿf›Î111f›ÎþÏÿ11þÏÿ›ŸÒŸÒŸÒ›aÿ.ÿŸÒŸÒaÿ.ÿÿhˆêéhêˆÿÿéhéhÿÿˆfÑdfÑdfÑdˆš/œÿfÑdfÑdš/œÿ33333ÿþÍÿ33ÿþÍÿÃÁÄxvyxvyxvyÃÁÄˆŠ‡ÿxvyxvyˆŠ‡ÿ/0./0.111111X|X|g3g3(Š'(Š'º{¼F…Dº{¼š2šfÎfš2š¿U“A«m¿U“úÀúÀô™ô™ÿ¿ÿ¿²ü²üŠŠ®®Á§Á§vvœšœšÝàÝàÍÊÍÊËËËËÊÉËÊÉˬ¬­¬¬­ªªªªªª˜»˜»eg–eg–‰Œ’‰Œ’11++ÜßÚÜßÚÌÌÑÌÌÑÉÍÉÉÍÉ——;^ÿ;^ÿ)a)aëëýàýàÞûÞû‰ÿwþ‰ÿwþ‰ÿwþ‰ÿwþ‰ÿwþ‰ÿwþše2ÿf›Îše2ÿf›Îše2ÿf›Îeÿ›eÿ›eÿ›xÿˆxÿˆxÿˆxÿˆxÿˆxÿˆÿþÍÿ3ÿþÍÿ3ÿþÍÿ3=?<ÿÃÁÄ=?<ÿÃÁÄ=?<ÿÃÁÄÿ/0.###®­¯;¥Å›ã;eÅ[ã/0.2ΟfÒaš.Î2###5« ‰É`w7ËUþ®­¯„bÞÞF…Dº{¼""|âž/0.ŸÿlËÍfÎfš2š53a”###¢þnÊÉA«m¿U“6ÿ7^’®­¯"dÞãœ/0.ÿi—###ÿmÿ“®­¯Wÿ©ÿ/0.ZÏÔ¦1,###[ÎÐ¥20®­¯Kµ/0.ÔDÔ,¼,###ÑEÒ/».®­¯AB¿á¾/0.8þ8ÈÈ###6ÿ8ÊÈ®­¯/0.ÑÐÒ/0.###ÏÏÏ111®­¯@@?ÀÀÁ/0.545ËÌË###666ÊÊÊ®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯b@žÀã/0.k4•Ìü###k6•Êþ®­¯(¤Øå\/0. ûÐô0###ý®R®­¯6Ê/0.Ñ$Ô/Ü,###Ô#Í,Ý3®¬¯í†yÿ/0.###®­¯;¥Å[ã/0.2ÎÎ2###5«ËUþ®­¯„b|âž/0.Ÿÿla”###¢þn^’®­¯/0.###®­¯/0.###®­¯/0.###®­¯/0.###®­¯/0.###®­¯/0.###®­¯/0.###®­¯/0.###®­¯/0.###®­¯/0.###®¬¯Tƒ´ IDATÿÿÿþÍÿTUSÿTUSÿÿþÍÿÿÿÿþÍÿxÿxÿÿþÍÿÿÿÿÿÿÿše2ÿše2ÿše2ÿÿÿÿÿÿÿÿÿ‰ÿ‰ÿÿÿþÏÿÿÿÿÿþÏÿþÏÿΙaÿΙaÿþÏÿaÿ.ÿeÿeÿaÿ.ÿ˜ÿÿÿÿÿÿ˜ÿÿš/œÿš/œÿš/œÿš/œÿTUSÿÿþÍÿÿþÍÿTUSÿTUSÿÿþÍÿÿþÍÿTUSÿÿÿÿÿxÿÿþÍÿÿþÍÿxÿxÿÿþÍÿÿþÍÿxÿΙaÿše2ÿše2ÿΙaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿΙaÿΙaÿΙaÿþÏÿþÏÿþÏÿ‰ÿÿÿÿÿ‰ÿïì™k IDAT‰ÿþÏÿþÏÿ‰ÿΙaÿþÏÿþÏÿΙaÿeÿaÿ.ÿaÿ.ÿeÿÿÿ˜ÿÿ˜ÿÿÿÿÿÿš/œÿš/œÿÿÿTUSÿˆŠ‡ÿÿþÍÿÿþÍÿˆŠ‡ÿTUSÿÿÿÿÿxÿÿÿÿþÍÿÿþÍÿÿÿxÿše2ÿΙaÿΙaÿše2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÍÿÿÿ˜ÿÿÿþÍÿ˜ÿÿÿÿÿþÍÿÿþÍÿþÏÿše2ÿΙaÿþÏÿΙaÿše2ÿþÏÿþÏÿÿþÍÿÿÿþÏÿÿþÍÿþÏÿÿÿÿþÍÿÿþÍÿÿÿ‰ÿÿÿ‰ÿ‰ÿÿÿ‰ÿÿÿþÏÿÿÿþÏÿ‰ÿ‰ÿþÏÿÿÿþÏÿþÏÿΙaÿþÏÿše2ÿše2ÿþÏÿΙaÿþÏÿaÿ.ÿeÿaÿ.ÿeÿeÿaÿ.ÿeÿaÿ.ÿ˜ÿÿÿÿ˜ÿÿxÿxÿ˜ÿÿÿÿ˜ÿÿš/œÿš/œÿš/œÿÿÿÿÿš/œÿš/œÿš/œÿÿþÍÿÿþÍÿÿþÍÿTUSÿTUSÿÿþÍÿÿþÍÿÿþÍÿÿÿÿÿÿÿÿþÍÿÿþÍÿÿþÍÿxÿxÿÿþÍÿÿþÍÿÿþÍÿΙaÿše2ÿΙaÿÿÿΙaÿše2ÿΙaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿΙaÿΙaÿΙaÿþÏÿþÏÿþÏÿ‰ÿÿÿÿÿ‰ÿ‰ÿþÏÿþÏÿ‰ÿΙaÿþÏÿþÏÿΙaÿeÿaÿ.ÿaÿ.ÿeÿÿÿ˜ÿÿ˜ÿÿÿÿÿÿš/œÿš/œÿÿÿTUSÿˆŠ‡ÿÿþÍÿÿþÍÿˆŠ‡ÿTUSÿÿÿÿÿxÿÿÿÿþÍÿÿþÍÿÿÿxÿše2ÿΙaÿΙaÿše2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿše2ÿše2ÿše2ÿÿÿÿÿÿÿÿÿ‰ÿ‰ÿÿÿþÏÿÿÿÿÿþÏÿþÏÿΙaÿΙaÿþÏÿaÿ.ÿeÿeÿaÿ.ÿ˜ÿÿÿÿÿÿ˜ÿÿš/œÿš/œÿš/œÿš/œÿTUSÿÿþÍÿÿþÍÿTUSÿTUSÿÿþÍÿÿþÍÿTUSÿÿÿÿ¸­> IDATÿxÿÿþÍÿÿþÍÿxÿxÿÿþÍÿÿþÍÿxÿΙaÿše2ÿše2ÿΙaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÍÿTUSÿTUSÿÿþÍÿÿÿÿþÍÿxÿxÿÿþÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿše2ÿfœÎÿ‰ÿwþÿÿÿêÿeÿœÿþÏÿ/Í3ÿÿÿ˜éiÿ‰ÿvþÿeÿaš.ŸÒÿˆŠ‡ÿwtF‰ŒºxwyΘa06ŸÐÊa2gŸc¨ÿ5Wû%ñCMý,*! Öàh!" ß@ˆ5Wû%5Wû%5Wû%ñCMý,*! Öàh/0.###®­¯/0.###®¬¯þÏÿ/ÍÏ›”ÿ™›UW†ÿ¬¬­ÿÿÿþÍ3výÍŠ5ÿwþÿÿþÍÿš2ÿh—ÿÿhÿêÿaÿ.ÿžÿŸg3ÿýÍg3ÿœÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿ/ÍÿÑ3šd2fœÎÿÿ˜ÿhše2fœÎÿÿ³>sÛ IDATvþŠšd0fœÎÿÿaš.ŸfÒšd2fœÎÿÿwtF3ÿÿþÍÿxwy06Ÿ2ÿþÏŸÿd¼ºœDFƒ—}ic«•¿UkAaŸáêš/$fÑÜ“1&mÏÚ675ÊÉËTTS¬¬­VVVªªªžXb¨éi—ÿf!ñšß¤ýc\éhy˜‡d™èœgžÿbÿh˜îg™¥¤8[\ÈÿþU«ÕÝ]+#£¦?ZÁÐ1Ò0Ï.­4ÑSÌ/™gÿÁÏÒ?1.­ÊÍS63Ï›”1el3þÍÿh˜g3ÿ™ÍÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿÿþÍÿ‰ŒºÛ«î%Uÿý›3ÿÿše2ÿdjÎ1›e2fœÎÿše2ÿe™›ÿÑ3œ–2fœÎÿxÿ˜‡ÿhêyˆÿeÿÿ™ÍbaŸfÒœÿše2ÿdjÎ1›e2fœÎÿše2ÿe™›ÿÑ3œ–2fœÎÿxÿ˜‡ÿhêyˆÿeÿÿ™ÍbaŸfÒœÿ3še2ÿ44/šfœÎÿÿéhše2ÿ44/šfœÎÿÿše0ÿ44/šfœÎÿÿŸÒše2ÿ44/šfœÎÿÿ3ÿþÍÿ3ÿÿÿþÍÿ3ÿ1þÏÿ2ÿÿþÏÿ2œDFd¼º}icƒ—UkA«•¿ŸáêafÑÜš/$mÏÚ“1&ÊÉË675¬¬­TTSªªªVVVb¨žX—ÿéiñšßf!ýc\¤˜‡éhyèœgd™bžÿ˜ÿh™îg[\È¥¤8«ÿþU+#£ÕÝ]¦?ÿÄeÿ!›ßÐ1Òžl”1­4Ñ–ülÿ”7ý™Ìþ!?ÿÁÿàÁÏÒ«.6ÐÊ0þ­ÊÍ¿ÿ69ÌÇ4ü1elÏ›”1elþÍ3þ͘ÿh˜ÿ™Íg3ÿ™Í3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿ3ÿþÍÿF3ÿf›F}3Íÿê›yÎï›Ð›3ЙaeˆJg¶ŸÍÒœ‰››ÊÏ9nŸÑ܈f›F}3Íÿê›yÎï›Ð›3ЙaeˆJg¶ŸÍÒœ‰››ÊÏ9nŸÑ܈f›Îšÿ44/šfœÎÿÿf›Îšÿ44/šfœÎÿÿf›Îšÿ44/šfœÎÿÿf›Îšÿ44/šfœÎÿÿ3ÿþÍÿ3ÿÿýÍ3ÿ1þÏÿ2ÿþÎ2ÿd¼ºœDFƒ—}ic«•¿UkAaŸáêš/$fÑÜ“1&mÏÚ675ÊÉËTTS¬¬­VVVªªªžXb¨éi—ÿf!ñšß¤ýc\éhy˜‡d™èœgžÿbÿh˜îg™¥¤8[\ÈÿþU«ÕÝ]+#£¦?ÿÄyý‡@ßü!ÊÐ1Òž2ÎþdÒÏ.·#­4Ñ–üS­ûüAÊÉ6®™Ìþ!¹ßGÿ!&þ ðÁÏÒ«.–Ôj,6ÿþÐí#­ÊÍ¿ÿ6”Îlú23ýÿÌ®í†y1elþ͘ÿ™Íš22bag333ÿÑ3Ï›”Ï›”›geÏ›”‰ŒºÿÑ33babaš2š2›1Ï›1Ïxÿ˜‡ÿhêyˆÿ‰ÿvþÏ™a»g¡wþÿeÿaš.ŸfÒœÿ‰ÿ/šfÑ܈ÿˆéhy˜‡ÿxÿwþŠ1gŸE™_‰ÿÿ›ŸfÒaš.dÿwþïÑfš/$ÿxÿf›ÎÌÌÑ44/šd2ÿf›ÎÌÌÑ44/šd2ÿf›ÎÌÌÑ44/šd2ÿf›ÎÌÌÑ44/šd2ÿ3ÿýÍ3ÿ1þÎ2ÿçO£ IDAT‡yýÎþ2­ûüSGÿ!¹ßj,–Ôlú2”ÎÏ›”1el3þÍÿh˜g3ÿ™ÍÿþÍÿš2ÿh2ÿþÍ3ÿÿÿþÍÿbaŸfÒg3ÿýÍ3ÿÿÿþÍÿ3Š5ÿþÍ3ÿÿÿþÍÿÿÑ3ÐÊa06Ÿ›gÑÿýÍ3ÿÿÿþÍÿÏ›”ÌÌÑ›geÿýÍ3ÿÿÿþÍÿÏ›”ºñ&‰ŒºÿýÍ3ÿÿÿþÍÿÿÑ31ÿÏ3ÿþÍ3ÿÿÿþÍÿba‰ŒºÿýÍ3ÿÿÿþÍÿš2‰ŒºÿýÍ3ÿÿÿþÍÿ›1ÏŠ5ÿþÍ3ÿÿf›Îšÿ44/šfœÎÿÿf›Îšÿ44/šfœÎÿÿf›Îšÿ44/šfœÎÿÿf›Îšÿ44/šfœÎÿÿþÏÿÿÑ3þÎ2ÿÿaÿ.ÿcaþŸÒÿÿœDF}icUkAŸáêfÑÜmÏÚÊÉˬ¬­ªªªb¨—ÿñšßýc\˜‡èœgb˜™[\È«+#£1elÏ›”1elþÍ3þ͘ÿh˜ÿ™Íg3ÿ™ÍÿþÍÿš2ÿhêy‡«ÿþÍÿbaŸfÒg3ÿýÍÿ3Š3ÿýÍÿÿÑ3ÐÊa06Ÿœ–23ÿýÍÿÏ›”ÌÌÑf›Îše2ÿ3ÿþÍÿÿÏ›”ºñ&ÌËÌ454UW†ÿýÍÿÿÑ31ÿÏ1Š5ÿþÍÿba'‹Y‰ŒºÿýÍÿš2qòˆ‰ŒºÿýÍÿ›1ÏïÑf/šŠ5ÿþÍ3xÿ˜‡ÿhêyˆÿ‰ÿvþÏ™a»g¡wþÿeÿaš.ŸfÒœÿ‰ÿ/šfÑ܈ÿˆéhÿ˜‡h‡êÿˆÿÿwþÿvgŸ™ag¡wþÿÿ›ŸÒÿaš.ŸfÒdœÿÿwþ‰Ñfÿ/šš/$fÑxˆÿÿf›Îšÿ44/šf›Îf›Îšÿ44/šf›Îf›Îšÿ44/šf›Îf›Îšÿ44/šf›ÎþÏÿ1ŠvþþÏ2ÿÿaÿ.ÿ¶™Ñÿh˜aþ/ŸÒÿÿd¼ºƒ—«•¿aš/$“1&675TTSVVVžXéif!¤éhyd™žÿÿhîg¥¤8ÿþUÕÝ]yý‡2ÎþS­ûü¹ßGÿ!–Ôj,”Îlú213še2ÿ2h3ÿ3‰ÿw3ÿ3ÿÿéiÿŸÒŸ3eÿ3ÿ3ÿþÍÿ‰òºwtF‰ŒÌËT«©z3ÿÿþÍÿ'%ºwtF‰ŒºÌËÌ«©z3ÿÿþÍÿ‰ŒºwtF‰ŒºÌËÌÿ©z3ÿÿþÍÿº»º1/Íî%ºÌËÌÿý›3ÿÿþÍÿºñºwtFî%ºÿºËÌÿþ›ÿ3ÿÿþÍÿºŒºwtF‰ŒÌËÌ«©z3ÿÿþÍÿ‰Šºw/F‰ŠºÌËÌ«©z3ÿÿþÍÿ‰ŒºwtF‰ºÌËÌ«©z3ÿÿþÍÿ‰ŒºwtF‰ŒÌËÌ«©z3ÿÿþÍÿ‰ŒºwtF‰Œ…ºË·«ÏË3f›Îšÿ44/›Îf›Îšÿ44/›Îf›Îšÿ44/›Îf›Îšÿ44/›Î1þÏÿuþÿ2ÿŸÒaÿ/ÿgŸÒÿœDF}icUkAŸáêfÑÜmÏÚÊÉˬ¬­ªªªP% IDATb¨—ÿñšßýc\˜‡èœgb˜™[\È«+#£‡Îþ­ûüGÿ!j,lú2TUSÿ454ÌË̬¬­Î˜a06ŸÐÊa2hŸÎ˜a06Ÿ/ÍÿÑ3/ÍÿÑ3ÐÊa2hŸTTS«©z‰ŒºwtF‰ŒºwtFUW†¬¬­Î˜a06ŸÐÊa2hŸÿΙaÿÌÌÑfœÎÿΙaÿÌÌÑfœÎÿΙaÿÌÌÑfœÎÿΙaÿÌÌÑfœÎÿΙaÿÌÌÑfœÎÿΙaÿÌÌÑfœÎÿhigÿ ! xwyÿÿþÍÿ3þÏÿ1þÏÿ1˜ÿÿéhÿþÍÿ3ÿ/0.###®­¯/0.###®­¯™g/0.ѽÖ/C*###®«ÂRU>®­¯§Y/0.çÏÑ1/###®Ð®R0R®­¯†aCzŸ½/0.Ÿh3a˜Í###¢i9^—Ç®­¯675ÊÉË/0.%$%ÛÜÛ###%%%ÛÛÛ®­¯¨£„X]|/0.ÐÍŸ03a###­ª¤SV\®­¯¥[ý/0.ÐÏÒ01.###­ÊÍS63®­¯c¤¢\^/0.iÎÏ—21###i««—UU®­¯¤¤\\/0.ÐÎÓ02-###¬«ÐTU0®­¯¨£„X]|/0.ÐÍŸ03a###­ª¤SV\®­¯b@žÀã/0.k4•Ìü###k6•Êþ®­¯…¥{ã[/0. úÑ`/###Ÿÿ®aR®¬¯454xwyxvyxvyxvyxvy45406Ÿ2111106Ÿ1el231311el4543xvy3xvy345406Ÿ2111106ŸÿþÍÿÌÌÑÿÿÿÿþÍÿÌÌÑaþ.ÿÿþÍÿÌÌÑÿÿÿÿþÍÿÌÌÑþÎÿÿþÍÿÌÌÑš.œÿÿþÍÿÌÌш‰‡ÿhigÿÿxwyhhgÿhigÿÿÿþÍÿÿþÍÿþÏÿ11þÏÿ˜ÿÿ˜ÿÿÿþÍÿÿþÍÿVWUYYYYYYVWUYYYYYY™¾™Ñ½Ö›üѽ֮«Â ¯®«Â§ÿ²§çÏÑêŒçÏѮЮ ý®®Ð®†aCÜßÚ†aCŸh3ÌÌÑŸh3¢i9ÉÍÉ¢i9675ÊÉË675%$%¬¬­%$%%%%ªªª%%%¨£„ÏÕò¨£„ÐÍŸº½ëÐÍŸ­ª¤Þâç­ª¤¥²ü¥ÐÏÒŠÐÏÒ­ÊÍ®­ÊÍc¤¢¾c¤¢iÎÏ™iÎÏi««W¾i««¤¤तÐÎÓÿÐÿÐÎÓ¬«Ðô쬫Ш£„ü|¨£„ÐÍŸ4ÐÍŸ­ª¤ÿ,­ª¤b@Üãb@k4ÿÊÎk4k6ÿÉÑk6…¥Üä¾…¥ úÑÍÕ˜ úÑŸÿ®ÍÍÀŸÿ®xvyˆ‰‡ÿˆŠ‡ÿxwyÿ1þÎÿþÏÿ2ÿ3þÎÿþÏÿ3ÿxvyˆ‰‡ÿˆŠ‡ÿxwyÿ1þÎÿþÏÿ2ÿ3Iÿž}3Í|›Íêÿ31ele™›ÇšüŸÒÿ31ele™›e›Îÿ31ele™›djÎ2ÿ31ele™›ÊjfÒdÿ31ele™›î%Uxwyÿ˜˜™hhg˜˜™hhg˜˜™hhg˜˜™3ÿþÍÿ3ÿþÍÿ31þÏÿÿþÍÿÿþÍÿþÏÿ1éh˜ÿÿéh˜ÿÿéh3ÿþÍÿ3ÿþÍÿ3VWUYYYYYYVWUb¨YYYègÑYYYÀi®gg/C*/C*RU>RU>YY1/1/R0RR0RzŸ½zŸ½a˜Ía˜Í^—Ç^—ÇÊÉ;›Ù’ IDATËÊÉËÛÜÛÛÜÛÛÛÛÛÛÛX]|X]|03a03aSV\SV\[ý[ý01.01.S63S63\^\^—21—21—UU—UU\\\\02-02-TU0TU0X]|X]|03a03aSV\SV\žÀãžÀã•Ìü•Ìü•Êþ•Êþ{ã[{ã[`/`/aRaRxvyˆ‰‡ÿˆŠ‡ÿxwyÿ1þÎÿþÏÿ2ÿ1ÿýÍÿÿþÍÿ2ÿxvyˆ‰‡ÿˆŠ‡ÿxwyÿ1þÎÿþÏÿ2ÿÿhèfÎba3ÿÑ3›1ωŒºÿ˜—™hhg ! ˜—™ÿÿ331ÿÑ31éhéh33ª©«§§§§§§ª©«žXb¨§§§™/ègѧ§§@—RÀi®xvyˆŠ‡ÿxwyÿ1þÏÿ2ÿ3þÏÿ3ÿxvyˆŠ‡ÿxwyÿ1þÏÿ2ÿÿÿéþΚ2ÿÿêÿÿaÿ.ÿžÿŸaþ.ŸÒÿÿÿÿþÍÿÿÿÿþÏÿ/ÍþÎ2ÿÿš/œÿeÏ1š.œfÒdÿÿˆŠ‡ÿwtFˆ‰‡xwyÿÿÿþÍÿ3ˆ‰‡xwyÿýÍ3ÿÿþÍÿš2ÿhêÿþÍÿ3Šwþ™üBBgѽÖûeÑeÖ/C*®«ÂõQñ®QÂRU>§NNYçÏÑtçÏt1/®Ð®àRàÐRR0R†aC$!&†!&zŸ½Ÿh344/Ÿ4a˜Í¢i973773^—Ç675675ÊÉË%$%TTSÛÜÛ%%%VVVÛÛÛ¨£„1+¨£„X]|ÐÍŸFCFÍŸ03a­ª¤"­ª¤SV\¥NÿN[ýÐÏÒvþvÏÒ01.­ÊÍRüýRÊÍS63c¤¢cBúB¢\^iÎÏgþgÏ—21i««©BýB«—UU¤¤ÿ ¤¤\\ÐÎÓ0ÐÎÓ02-¬«Ðÿ ¬«ÐTU0¨£„ÿ„¨£X]|ÐÍŸÿÌÐÍ03a­ª¤ÿÔ­ªSV\b@ý$b$žÀãk462k•Ìük67/k•Êþ…¥$B…B{ã[ úÑ3+h úh`/Ÿÿ®33@Ÿÿ@aRš/œÿ¥š.œfÒdÿÿÿÿ1ÿÿÿ˜ÿÿÉ—éiÿÿΙaÿÌ̫Θa2hŸÿÿÿÿ1êÿÿÿÿéþΚ2ÿhêyÿÿêÿaþ.žÿŸbaŸfÒaþ.ŸÒÿÿÿþÍ3ŠÿÿþÿþÎ/ÍÿÑ3œ–2þÎÎ2ÿš.œeÏ1›1ÏïÑfš/œfÒdÿˆ‰‡wtF‰ŒºÌË̈‰‡xwyÿÿikš ! hhghhg‰ŒºàßàþÏÿ/ÍþÏÿ1ÿþÍÿš2ÿh˜˜hÿÿêÿþÍÿ3Švþvþÿwþ¨£„X]|ÐÍŸ03a­ª¤SV\¨£„eáû„£›áX]|ÐÍŸÐé6Ñÿ0Î03a­ª¤'õþÔ6¬Ù øSV\¾ü›ü ¯ÿ²êŒ ý®ÜßÚÌÌÑÉÍÉÊÉˬ¬­/0.ªªª111ÏÕòº½ëÞâç²üÿð|â„ IDATŠ®¾™W¾@àÿÐÿôìü|4-ÿ,0ÜãÿÊÎ.ÿÉÑ-Üä¾ÍÕ˜1ÍÍÀ4š/œÿ|Ñc}ic|Ñcš.œÿÿÿþÍ‰Š‡þÍÿÿÿ˜ÿÿqòˆƒ—qòˆ—ÿÿΙaÿÌÌÑdjÎÌÌÑΘaÿÿÿêy˜êyÿÿÿ2ÿhêybabaŸfÒ33ŠÿÑ3ÿÑ3œ–2›1Ï›1ÏïÑf‰Œº‰ŒºÌË̘—™xvy˜—™xvy˜—™xvy˜—™ÿþÏÿ/Í/ÍþÏÿ3˜ÿhê3vþŠwþ¨£„ÏÕòÏÕòÏÕòÏÕò¨£„ÐÍŸº½ëº½ëº½ëº½ëÐÍŸ­ª¤ÞâçÞâçÞâçÞâç­ª¤¨£„X]#X]#ó|¨£„ÐÍŸ222ÐÍŸ­ª¤& & Ú1­ª¤ü©ûxuþ§usžÀãfœÎd™Í‰ˆŠGFHDCD²ü©ÿŠwþ®tÿžXéif![|2"0\\ÿ#$ÿ›ägÒeÐüŸÿdicafÑdš/ÿ—/fÒdÿÿ3ÿwvyÿéh˜ÿÿiéiÿ2gŸΙaÿœ–44/2hŸÿêÿÿÿh‡êÿêÿÿêy‡êy‡êÿŸÒaÿ.ÿŸfÒaš.ŸfÒaš.ŸÒÿÿÿŠvþŠvþÿ1þÏÿœ–2djΜ–2djÎ2ÿfÑdš/œÿïÑf/šïÑf/šfÒdÿxvyˆŠ‡ÿÌËÌ454ÌËÌ454xwyÿ1þÏ3ÿ/ÍÿÑ31éh˜ÿÿÿhêÿÿŠwþX]|¨£„X]|‡ªÐÍŸ03a###­ª¤SV\®­¯¨£„RLÝ£X]|‡ªÐÍŸwtÎþ03a###­ª¤ÿQöÚSV\¾ü©›üûx ¯uþÿ²§êŒu ý®sÜßÚžÀãÌÌÑfœÎÉÍÉd™ÍÊÉˬ¬­ªªªÏÕò‰ˆŠº½ëGFHÞâçDCD©ÿwþtÿ¾žX™éiW¾f!à[|ÿÐÿ2ôì"0ü|\\4ÿÿ,#$ÿÜã›äÿÊÎgÒÿÉÑeÐüÜ侟ÿÍÕ˜diÍÍÀcaΙaÿ2hŸÿˆŠ‡ÿxwyÿþÏÿ2ÿΙaÿÌÌÑfœÎÿÿþÍÿ‰Œºxwyÿÿ675ÊÉË/0.%$%ÛÜÛ###%%%ÛÛÛíÌÜãý$8$ÿÊÎ62#%!ÿÉÑ7/šv®Nÿ²ü2vþŠ$"Rüý®øcßÿ dàœYJþ0—Ði$ ¬õT†²›ûáÿHZW1ýÏ% ýôq¦£"Þú5Z[5Ëþ#ÿ7Éýê†ÿ dàœÿ dZ*œþ0—Ðiþ0—ôv ¬õT ¬©¦Ë®´ÑRL/WZI‰ŒºwtF(¬¯µTQK VWUàààÊÉË/0.YYYÌËÌÛÜÛ###YYYÌÌÌÛÛÛ®¬¯¥€#· IDATí†y‰ÿe0ï›ÐwþÿTUSÿ454ÌË̬¬­ÿÿþÍÿ‰ŒºÌË̬¬­ÿˆŠ‡ÿÌË̬¬­ÿþÏÿ1þÏÿ1ÿþÍÿ3ÿΙaÿ2gŸˆŠ‡ÿxvyþÏÿœ–2fœÎþÎ2ÿΙaÿÌÌÑfœÎÿÿþÍÿ‰Œºxwyˆ‰‡wtF‰Œºçççxwyÿ685ÿ#$#4#$$é±ÜZü¥‡FXZ3ÿ"¥¨êZYY‡¦¬HZW%²¦eàœ„ýá|ÿ dàœWz—Ði/ÍÿÑ3þ0—Ði/¹õT èõ ¬õTWeH222###«««àààRRRÌËÌWXWÌÌ̉‡Šeÿœd›TUSÿ¬¬­mnl“‘”‰ÿe0e0‰›ÐwþÿÿTUSÿ454454¬¬­ÿÿÿþÍÿ‰Œº454¬¬­ÿÿˆŠ‡ÿÌËÌTTS¬¬­ÿˆ‰‡xwyˆ‰‡xwyˆ‰‡xwyˆ‰‡xwyÐÊa‰¡ÿuÏþ‹1uÏþ‹1ÐÊ_Ÿÿÿ‰ÿŠ5‰wþÿÿše2ÿ44/ÌÌÑfœÎÿ‰ÿe0ï›Ðwþÿmolÿååå“’”ÿ2gŸΙaÿÌÌÑxvyˆŠ‡ÿÌËÌΙaÿÌÌÑfœÎÿΙaÿÌÌÑ44/ÌÌÑšd2f›ÎÿþÍÿ‰ŒºwtF‰ŒºxwyÿÿþÍÿ‰ŒºwtF‰Œºˆ‰‡še2ÿfœÎšd2ï›Ðwþÿÿêÿÿêyšeº44/2gŸΙaÿÌÌÑï›Ðe0f›Îše2ÿï›Ðæqlççç‘’oqnÿçççxvyˆŠ‡ÿçççÛ«f›Îše2ÿî%Uççç+ôÄe™›3ÿþÍÿ›ge44/06Ÿ1þÏÿÐÊaHgž˜éh˜ÿÿÿhrŠˆwtF3ÿþÍÿ‰Œºxwyopn‘’oqnÿ‘’ÊÉË675ÛÜÛ%$%ÛÛÛ%%%ý$Üã62ÿÊÎ7/ÿÉѲüNÿŠvþ®Rüýàœÿ dÐiþ0—õT ¬áÿûÏ1ýô ýÞú"Ëþ5Éý7àœÿ dÿ „ýà|Ðiþ0—ÿ6/ÍÐ3õT ¬< èõRL/®´ÑwtF‰ŒºTQK¬¯µàààÊÉË675ÌËÌÛÜÛ%$%ÌÌÌÛÛÛ%%%›eÿœd›¬«­molÿ“’”mnl“‘”wþ›Îÿ¬«­¬«­xwyÿˆŠ‡ÿ¬¬­ÿTUSÿÌË̈‰‡ˆ‰‡ˆ‰‡ÌËÌÌÌÑE™_ŸuÏþE™_ÌÌÑþÏÿ‹1Ž˜ýrhØÿ,‰Ôvþÿÿ2gŸΙaÿ2hŸÎ˜a›ÎxvyˆŠ‡ÿxwyˆ‰‡¬«­1þÏÎÿdj2ÿΙaÿÌÌÑšd2fœÎÿÌÌÑÿþÍÿ‰Œº‰Œºˆ‰‡xwyÿ‰Œºf›Îše2ÿfœÎšd2ï›Ðwþêÿÿÿêÿÿêyˆ44aÿ2hŸÎ˜aΙaÿ2hŸÎ˜aÌfœÎšd2še2ÿfœÎše2ÿxwyopnˆŠ‡ÿçççxwyˆ‰‡xwyˆ‰‡ˆŠ‡ÿxwyˆ‰‡xwyˆ‰‡ˆŠUÿÛ«î%Uxwyˆ‰‡et›3ÿþÍÿÿþÍÿ3ÿþÍÿÿÑ32þÎþÏÿ2þΟ˜žéi—ÿ˜ÿÿéi˜ÿwfF3ÿýÍÿþÍÿ3ÿýÍççç‘’opnoqnÿ‘’oqnÿÇÇÇ675%$%%%%ÜãÿÊÎÿÉÑNÿvþRüýÿ dþ0— ¬û1ý ý"57ÿ þ¾Bc„ýá|ÿ6›^e¢/ÍÿÑ3<¿[A¥ èõ®´Ñ‰Œº¬¯µ675%$%%%%#>$ IDATeÿdmolÿmnl3xvyxvy¬«­¬«­¬«­f›Î›ÎŸV†Sÿ4Š4èfÎfËÿ‰ŠºUË̬­še2ÿ44/ÌÌщÿe0ï›ÐmolÿåååΙaÿ2hŸ2gŸ2gŸˆŠ‡ÿxwyxvyxvyþÏÿ21ÌÌÑÌÌÑÌÌщŒº‰Œºçç牌ºwtF‰Œºççç‰ÿšd2xÿÿÿÌÌÑ44/ÌÌÑï›Ðe0ï›ÐçççççççççççççççÛ«ççç+ôÄî%UçççÛ«ÿÑyÿÑ3/ÍÿÑ3ÿÑ3ÿh˜ÿh‰ŒºwtF‰Œº‘’opn‘’ÊÉË675ÊÉËùùù%$%ÛÜÛþÿþ%%%ÛÛÛ$Üãý$$ÿÊÎ62%!ÿÉÑ7/²­ÝNÿ²üävþŠ$Rüý®àœÿ dàœМþ0—Ði$ ¬õTáÿ›ûáÿÏ1ýÏ% ýôÞú"ÞúËþ5Ëþîÿ7Éýÿ düàÿ ÿ dþ03Êÿ6þ0—ÿ"Ä< ¬RLË®´ÑRL/WZF‰ŒºwtF(¬¯µTQKUTVVWUàààÊÉËùùùYYYÌËÌÛÜÛþÿþYYYÌÌÌÛÛÛeÿmolÿ¬«­¬«­xvyÿ44/Î4/ÿÌÌÑfœÎÿe0šÿï›Ðwþˆ‰‡ÿååå“’”ΘaΘa2hŸÿÿˆŠ‡ÿˆ‰‡xwyÿÿþÏÿœ–2fœÎþÎ2ÿÿf›Îše2ÿfœÎ‰ŒºxvyˆŠ‡ÿççç‘’ÿˆŠ‡ÿxwyÿ‰ÿe0ï›Ðxÿ‡êyçççî%UÎî%UÛ«ç <î%UÐÊ/ŸÐÊa03ÐÊaŸÐÊa06ŸÐÊa06ŸÐÊaŸ675675%$%#$#%%%îɯÜãÿîãÿÊÎÿîòÿÉÑNÿNÿZüÿvþüýRüý¥ dÿ dþ03þ0—ÿ" ¬êû1ý1ý ý""55%7³àœ„Bcýá|М/Íe¢ÿÑ3$ èA¥õ®´HRL/®´ÑàæwtF‰Œº##ÝTQK¬¯µVWUàààààà675RRRÌËÌÌËÌ%$%WXWÌÌÌÌÌÌ%%%eÿmolÿ“‘”2hŸÿÿfœÎÿÿÿxwyÿÌÌÑÿ44/2hŸÿÌËÌ454xwyÿf›Îše2ÿfœÎÿf›Îše2ÿfœÎÿxvyˆŠ‡ÿxwyÿxvyˆŠ‡ÿççç‘’ÿxvyÿwtF‰Œºxwyÿe0ï›Ð‰ÿw‡êyxÿ2gˆÿ2gŸÿf›ÎΑ’ÿopn‘’ÿxvyÿxvyÿÛ«î%UççxvyxÌÌÑaÌÌÑ2gŸÿ1ÿéhhÿ3ÿ‘’685ÿÊÉË675ÛÜÛ%$%ÛÛÛ%%%ý$Üã62ÿÊÎ7/ÿÉѲüNÿŠvþ®Rüýàœÿ dÐiþ0—õT ¬áÿûÏ1ýô ýÞú"Ëþ5Éý7ýá|ÿ dÿ ýá|ÿ dœÿÑ3þ0—ÿ6ÿÑ3þ0—ôvõ ¬<õ ¬œRL/RL/®´ÑwtFwtF‰ŒºTQKTQK¬¯µàààÊÉË675ÌËÌÛÜÛ%$%ÌÌÌÛÛÛ%%% ¸0 IDATeÿœdm l“’”mnl“‘”še2ÿ44/ÌÌÑfœÎÿ‰ÿe0ï›Ðwþÿmolÿååå“’”ÿΙaÿ2hŸÎ˜a2hŸÿˆŠ‡ÿxwyˆ‰‡xwyÿÿþÎ2ÿˆŠ‡ÿxwyÿ‰ÿe0fœÎšd2ï›Ðwv‡êÿÿêyˆ685ÿ#$#4#$$é±ÜZü¥‡FXZ3ÿ"¥¨êZYY‡¦¬HZW%²¦eàœÿ dàœWz—Ðiþ0—Ði/¹õT ¬õTWeH222###‹‹‹#$#‰‡ŠˆŠ‡ÿÿþÏÿÿˆŠ‡ÿefdÿˆŠ‡ÿefdÿÿše2ÿΙaÿΙaÿΙaÿše2ÿÿˆŠ‡ÿefdÿˆŠ‡ÿefdÿÿše2ÿΙaÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿÿÿþÍÿˆŠ‡ÿÿefdÿÿþÍÿÿÿþÍÿˆŠ‡ÿÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿefdÿΙaÿše2ÿΙaÿΙaÿÿˆŠ‡ÿefdÿˆŠ‡ÿefdÿˆŠ‡ÿÿþÏÿše2ÿþÏÿše2ÿþÏÿÿefdÿÿˆŠ‡ÿÿΙaÿΙaÿÿΙaÿÿˆŠ‡ÿÿΙaÿΙaÿΙaÿΙaÿΙaÿše2ÿÿefdÿÿˆŠ‡ÿÿefdÿˆŠ‡ÿefdÿˆŠ‡ÿefdÿÿ‰ÿþÏÿÿÿþÏÿ‰ÿÿΙaÿše2ÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿefdÿˆŠ‡ÿÿþÍÿÿefdÿÿþÍÿefdÿˆŠ‡ÿefdÿÿþÍÿÿˆŠ‡ÿÿþÍÿÿÿþÍÿÿþÍÿˆŠ‡ÿefdÿÿΙaÿše2ÿΙaÿΙaÿΙaÿÿΙaÿÿÿþÍÿÿše2ÿΙaÿše2ÿÿefdÿˆŠ‡ÿˆŠ‡ÿefdÿÿÿþÍÿˆŠ‡ÿÿŠ^s¦ IDATeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿ‰ÿÿÿÿÿÿÿÿÿ‰ÿše2ÿþÏÿþÏÿþÏÿþÏÿše2ÿˆŠ‡ÿÿxvywtFxwyÿ1ï›Ð1ï›Ð2ÿ#$#efdÿxwyÿ2hŸÎ˜a2hŸˆ‰‡xwyÿÌÌÑÌÌÑÌÌÑ44/#$#FÚefdÿ#$#ÝÜÝ#$#ÝÜÝ#$#eedÿ‰ÿuÏþ1ÿÏ1uÏþ‰ÿÿÌÌÑ44/ˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿefdÿÿÝÜÝfh—Ï›”Û«››œFÚ›ge#$#‰Œº#$##$#fh—fh—ÿþÍÿ‰Œºfh—xwy›šœΘaÌÌÑfœÎΙaÿ2hŸ1el2hŸÿΙaÿ2hŸÿΙaÿÿše2ÿΙaÿΘaÿ#$#ÝÜÝxwy›šœΘaÿˆŠ‡ÿÿÿþÍÿÿÿþÍÿÿÿþÍÿÿ‰Œºxwyaÿ.ÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿaÿ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆŠ‡ÿÿˆŠ‡ÿefdÿˆŠ‡ÿefdÿˆŠ‡ÿÿefdÿÿþÍÿefdÿÿ‰ÿÿÿ‰ÿÿefdÿÿˆŠ‡ÿÿΙaÿÿÿΙaÿÿˆŠ‡ÿÿše2ÿΙaÿše2ÿÿefdÿÿΙaÿÿefdÿˆŠ‡ÿefdÿˆŠ‡ÿefdÿÿ‰ÿþÏÿÿÿþÏÿ‰ÿÿΙaÿše2ÿÿˆŠ‡ÿˆŠ‡ÿΙaÿefdÿÿΙaÿše2ÿÿše2ÿΙaÿÿefdÿˆŠ‡ÿÿefdÿˆŠ‡ÿÿΙaÿše2ÿÿΙaÿÿÿþÍÿÿΙaÿÿÿþÍÿÿΙaÿΙaÿše2ÿΙaÿše2ÿΙaÿΙaÿÿΙaÿÿše2ÿΙaÿše2ÿÿΙaÿÿΙaÿše2ÿΙaÿše2ÿÿΙaÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿþÏÿÿÿþÏÿÿÿþÍÿˆŠ‡ÿÿaÿ.ÿÿeÿaÿ.ÿaÿ.ÿeÿÿaÿ.ÿÿÿÿ‰ÿÿÿÿÿ‰ÿÿÿÿaÿ.ÿÿeÿaÿ.ÿaÿ.ÿeÿÿaÿ.ÿˆŠ‡ÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿefdÿÿþÍÿefdÿÿefdÿÿþÍÿefdÿÿ‰ÿÿÿ‰ÿÿefdÿˆŠ‡ÿefdÿÿefdÿÿΙaÿÿˆŠ‡ÿÿˆŠ‡ÿÿše2ÿΙaÿše2ÿÿefdÿˆŠ‡ÿefdÿÿΙaÿÿΙaÿÿΙaÿÿše2ÿΙaÿÿše2ÿΙaÿÿΙaÿše2ÿÿΙaÿše2ÿÿˆŠ‡ÿefdÿÿˆŠ‡ÿefdÿÿΙaÿše2ÿÿΙaÿÿÿþÍÿÿΙaÿÿÿþÍÿÿÿþÍÿÿΙaÿÿÿþÍÿÿÿþÍÿÿše2ÿΙaÿše2ÿÿÿþÍÿÿΙaÿÿΙaÿÿÿÿÿˆŠ‡ÿÿÿÿÿˆŠ‡ÿÿÿˆŠ‡ÿÿ¶™Ñ›ÿ¶™Ñ¶™Ñ›ÿ¶™ÑˆŠ‡ÿˆ‰‡ÿxvywtFxwyÿÈb7 IDATefdÿ#$##$#eedÿ#$#xvyÿxvyÿše2ÿ44/ÌÌÑfœÎÿefdÿ#$##$#eedÿf›Îšd2ÿΙaÿÌÌÑfœÎÿše2ÿfœÎÿefdÿ››œÿefdÿ››œÿΙaÿÌÌÑfœÎÿ3ÿýÍÿÿþÍÿ3ÿ3ÿýÍÿýÍ3ÿše2ÿΙaÿ2hŸÿše2ÿÿxvyÿÿˆŠ‡ÿwtFˆ‰‡ÿí†yŸÒÿŸÒÿéhÿ„e3ç7ç7„e3éhxvywtFxwyÿ›šœÝÜÝÝÜÝ››œÿÝÜÝše2ÿ44/ÌÌÑfœÎÿ›šœÝÜÝÝÜÝ››œÿÌÌÑ44/ΙaÿÌÌÑfœÎÿ44/ÌÌÑ#$#ÝÜÝ#$#ÝÜÝΙaÿÌÌÑfœÎÿ2gŸΘaÿ2gŸΘaÿ3ÿýÍÿýÍ3ÿ›gee™›e™››ge44/ÌÌÑ44/šd2ÿÿþÍÿˆŠ‡ÿÿxvy‰ŒºxwyÿÿþÍÿÿÿþÍÿÿÿþÍÿÿÿÿþÍÿÿÿÿÿÿefdÿˆŠ‡ÿÿΙaÿÿše2ÿΙaÿše2ÿÿΙaÿÿΙaÿÿΙaÿÿΙaÿše2ÿÿše2ÿΙaÿÿΙaÿše2ÿÿΙaÿÿefdÿˆŠ‡ÿÿˆŠ‡ÿÿΙaÿše2ÿÿΙaÿΙaÿΙaÿÿΙaÿše2ÿΙaÿΙaÿÿÿþÍÿše2ÿÿΙaÿÿþÍÿΙaÿÿΙaÿΙaÿΙaÿše2ÿÿaÿ.ÿΙaÿaÿ.ÿÿþÏÿÿÿþÏÿÿˆŠ‡ÿÿÿÿÿˆŠ‡ÿÿÿ”_; IDAT/1.ÿ2ÎÎ2Ÿÿla”ÑÏÒaÿ.ÿŸfÒœÿΙaÿ2hŸÿše2ÿf›Î‰ÿwþÿ2ΟfÒaÎ.Î2ŸÿlËÍŸÿla”‰ÿE™_ÌÌÑfœÎÿ‰ÿE™_ÌÌÑfœÎÿ‰ÿE™_ÌÌÑfœÎÿ‰ÿE™_ÌÌÑfœÎÿxÿ˜‡ƒ—fÒdÿÿˆ‰‡ÝÜÝ››œÿÿÿÿŠwþÿxÿ˜‡ÿhêÿÿˆ‰‡v{wþÿefdÿš˜i‰Œºxwyÿefdÿš˜i‰Œºxwyÿefdÿš˜i‰Œºxwyÿefdÿš˜i‰ŒºxwyÿxÿÿþU›1ÏfÒdÿÿÿéþΚ2éiÿeÿÿ™ÍbaŸÒÿše2ÿe™›ÿÑ32ÿ‰ÿvþË3ÿÿþÍÿÿÑ32ÿΙaÿ2gŸ2gŸΙaÿ2hŸÿÿþÍÿ‰ŒºÛ«î%Uÿþ›ÿ3ÿÿþÍÿ‰Œºv{ÿŠ…ÿtF3ÿÑÐÒ/0.2ΟfÒÿ™Íf3aÎ.m1lËÍfÎfš2šËÍŸÿl2fe044/44/e044/44/e044/44/e044/44/š/$}ic}iceed#$##$#‰ÿvþvþ‡˜˜‰ÿÿŠ…ÿŠ…#$#wtFwtF#$#wtFwtF#$#wtFwtF#$#wtFwtFš/$eÏ1eÏ1˜èfÎèfÎaš.žÿŸžÿŸdjÎ/Í/ÍvþþÍþÍÛ¤’á IDATÿÑ3ÿÑ3ÿÑ3ÿÑ3ÐÊaΘaΙaÿše2ÿaÿ.ÿ(ÔdÿˆŠ‡ÿˆŠ‡ÿºñ&ˆŠ‡ÿˆŠ‡ÿ3wtFe™›e™›wtF3ÿ3wtFvþËvþËwtF3ÿÑÐÒÑÐÒg3g3ÿ™ÍfÎfš2šš2š44/ÌÌÑ44/ÌÌÑ44/ÌÌÑ44/ÌÌÑ44/ÌÌÑ44/ÌÌÑ44/ÌÌÑ44/ÌÌÑ}icƒ—}icƒ—f#$#ÝÜÝ#$#ÝÜÝvþŠvþŠþ˜ÿh˜ÿhÿŠ…v{ÿŠ…v{wtF‰ŒºwtF‰ŒºwtF‰ŒºwtF‰ŒºwtF‰ŒºwtF‰ŒºwtF‰ŒºwtF‰ŒºeÏ1›1ÏeÏ1›1ÏèfΚ2èfΚ2žÿŸbažÿŸba/ÍÿÑ3/ÍÿÑ3þÍ3þÍ3ÐÊa06ŸÐÊa2hŸÎ˜a‰›weþxvyΙaÿ2hŸÿˆŠ‡ÿºñˆ‰‡ÿxwyÿ3ÿþÍÿÏ›”»g¡vþËÿ™Íg3aš.fÎfš2šaÿ.ÿŸfÒœÿï›ÐÌÌÑÌÌÑï›ÐÌÌÑÌÌÑï›ÐÌÌÑÌÌÑï›ÐÌÌÑÌÌÑfÑ܃—ƒ—››œÝÜÝÝÜÝwþŠŠêyÿhÿhwþv{v{ÝÜ݉Œº‰ŒºÝÜ݉Œº‰ŒºÝÜ݉Œº‰ŒºÝÜ݉Œº‰ŒºfÑÜ›1Ï›1Ïÿhš2š2ŸfÒbabaœ–2ÿÑ3ÿÑ3Š33þÏÿΙaÿΙaÿÿΙaÿ‰ÿ‰ÿÿΘaÝÜÝÝÜÝÿþÍÿ33ÿýÍÿÿþÍÿÏ›”»g¡E™_Š5ÿýÍÿ/0./0.g3g3š2šfÎfš2šaÿ.ÿŸfÒdÿaÿ.ÿeÿeÿeÿÿþÏÿÐÊaÌÌÑ44/2hŸÿΙaÿ»g¡e0ï›ÐwþÿΙaÿ06ŸÐÊa2hŸÿaÿ.ÿŸfÒœÿΙaÿ2hŸÿˆŠ‡ÿxwyÿÿþÍÿ3ÿþÍÿ…õÊ IDATÏ›”»g¡E™_»g¡E™_1el03a2ΟfÒaš.Î2ŸÿlËÍfÎfš2š53a”ÑÏÒΙaÿÌÌÑfœÎÿaÿ.ÿŸfÒ›Ιaÿ2hŸÿÿþÍÿ‰ŒºwtF‰ŒºÝÜÝš˜i3ÿÿþÍÿ‰ŒºwtF‰ŒºÝÜÝš˜i3/0.2ÎÎ2Ÿÿla”ÑÏÒΙaÿÌÌÑfœÎÿeÿ›þÏÿÿþÍÿÿþÍÿÿÿþÍÿˆŠ‡ÿˆŠ‡ÿþÏÿΙaÿše2ÿefdÿÿþÍÿˆŠ‡ÿΙaÿΙaÿΙaÿÿΙaÿΙaÿΙaÿÿ®Ð IDATÿþÍÿÿˆŠ‡ÿÿþÏÿÿþÍÿþÏÿÿþÍÿÿþÍÿÿˆŠ‡ÿˆŠ‡ÿÿÿþÍÿÿþÍÿΙaÿše2ÿΙaÿÿþÍÿÿþÍÿÿþÍÿΙaÿˆŠ‡ÿefdÿÿþÍÿˆŠ‡ÿefdÿΙaÿÿΙaÿÿΙaÿÿΙaÿÿí†yþÏÿÐÊaÌÌÑfœÎÿ‰Œºšd244/ÿºñþÏÿ/Í3ÿwtFÿxwy3ÿþÍÿΙaÿÌÌÑ44/ÌÌÑï›Ðwþÿ2gŸÿþÍÿ›ge2h3ÿýÍ3šd2ÿþÍÿŠ5š˜ifh—›šœˆŠ‡ÿºñˆ‰‡ÿxwyÿÿþÍÿÿelÿ3ÿþÏÿÐÊaÌÌÑfœÎÿˆŠ‡ÿxwyÿše2ÿ44/ÌÌÑ44/2hŸÿΙaÿ06Ÿ/Í3ÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ΙaÿÌÌÑfœÎÿΙaÿÌÌÑf›Îše2ÿe™›3ÿýÍ›gee›ÎŠÿŠ…xvyΙaÿ2hŸÿΙaÿ2hŸÿˆŠ‡ÿxwyÿΙaÿ2hŸÿ‘mtÛ IDATþÏÿÐÊa2hŸÿ1Ÿše2ÿï›ÐwþÿΙaÿÌÌÑfœÎÿxwyÿf›Îšÿe™›ÿÑ3ÐÊa2hŸÿΙaÿœ–2f›3ˆ‰‡wtFÿ3ÿÿþÍÿ3ÿΙaÿ‰ÿwþÿÿΙaÿÌÌÑf›Îf›Îfœ3ÿÿýÍÿýÍ3ÿËfdÿš˜ifh—›vyÝÜÝ#$#ÝÜÝþÏÿg—d06œeed™iœÿ2ÿþÏÿÐÊaÌÌÑΘaÿΙaÿe0‰ÿÿΙaÿÌÌÑï›Ðšd2ÿˆŠ‡ÿxwyÿΙaÿÌÌÑÌÌÑf›Î3xvy3ΙaÿÌÌÑf›Îÿ›ge›geÿ›šœfh—š˜iefdÿ›šœxvyxwy›šœÿ™iœg—d™iœÐÊa2gŸÿÌÌÑˆŠ‡ÿxwyÿše2ÿ44/›ge44/aΘa2hŸÿÿÌÌÑf›Î2gŸΙaÿï›Ðwþÿ2gŸf›Îf›3›šœ#$#ÿš˜i#$#ÿxvyxvy1þÏœÿ2ÿ­P° IDATše2ÿf›Îše2ÿf›ÎþÏÿ1ÿÿeÿ›ˆŠ‡ÿxvyÿþÍÿ3ÿþÍÿ3ÿÿþÍÿ3ÿþÏÿ2ÿÿÿeÿœÿˆŠ‡ÿxwyÿÿþÍÿ3ÿše2ÿfœÎÿše2ÿfœÎÿþÏÿ2ÿÿÿeÿœÿˆŠ‡ÿxwyÿÿþÍÿ3ÿše2ÿfœÎÿše2ÿfœÎÿLÿý,*! ÖàÿXê$?©5Wû%5Wû%îD¨ÿ¥ý[ÿ¥³êy‡êy$‡*ý™Ög*ý™ÖàbžÿbW˜ÿh˜éŒ™îg™-„ %!äÛß%!ä,05ÑÐË/05ÑðñQ83ÊÈÍ683ÊA¦žÿbžÿ—Xÿh˜ÿhü½îg™îgÞdæþéæþé)MÔþß,!ÔþßR"FØÿÚ(&ØÿÚÖà;¥vÅ[Š;¥vÅ[Š;¥vÅ[Š;¥vÛZâKÿ/µÑKÿ/µÑKÿ/µÑKÿ/Ÿ%чÛTy%¬‡ÛTy%¬‡ÛTy%¬‡ÛT|ù8¦ÑÈZ/8¦ÑÈZ/8¦ÑÈZ/8¦ÑÅZ[aÿ¶ŸJaÿ¶ŸJaÿ¶ŸJaÿ¶É"j]Þ»£"E]Þ»£"E]Þ»£"E]Þ»!¥1X¿$¨AÜX¿$¨AÜX¿$¨AÜX¿$ÿ›%š2èfΚ2èfΚ2èfΚ2èfö¿ íAö¿ íAö¿ íAö¿ sè©ûáÿûáÿûáÿû)Y\1ýÏ1ýÏ1ýÏ1ýô ýô ýô ýô ýˆŠ‡ÿxwyšd244/šÿfœÎÿˆŠ‡ÿxwyšd244/šÿfœÎÿˆŠ‡ÿxwyþÎÐÊaþÏŸÿ2ÿše2ÿf›Îše2ÿf›Îše2ÿf›ÎˆŠ‡ÿxwyšd2fœÎÿÿˆŠ‡ÿxwydeÿœÿˆŠ‡ÿxwyˆ‰‡FÚŠ‡ÿxwyÿˆŠ‡ÿxwyÿý͉ŒºÿþÍÿ3ÿÿþÍÿÏ›”ÿþÍÿÏ›”þÏÿÐÊaŸÿþÍÿ3ÿÿþÍÿ3ÿše2ÿfœÎÿÿšd2fœÎeÿˆŠ‡ÿFÚxÿþÍÿ‰Œºše2ÿ44/œÎše2ÿ44/œÎþÏÿÐÊaŸše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿÿšd2fœÎeÿˆŠ‡ÿFÚxÿþÍÿ‰Œºše2ÿ44/šfœÎÿÿše2ÿ44/šfœÎÿÿÞX"¨éÍ3ÿËë5ãÿ¥ý[ý[ÿ¥êy‡‡êy*ý™ÖgÖg*ý™bžÿžÿb˜ÿhÿh˜™îgîg™%!äÛßÛß%!ä05ÑÐË/ÐË/05Ñ83ÊÈÍ6ÈÍ683Êžÿbbžÿÿh˜˜ÿhîg™™îgæþéæþéÔþß,!,!ÔþߨÿÚ(&(&ØÿÚ;¥v;¥vÅ[Š;¥vÅ[Š;¥vKÿ/Kÿ/µÑKÿ/µÑKÿ/‡ÛT‡ÛTy%¬‡ÛTy%¬‡ÛT8¦Ñ8¦ÑÈZ/8¦ÑÈZ/8¦Ñaÿ¶aÿ¶ŸJaÿ¶ŸJaÿ¶]Þ»]Þ»£"E]Þ»£"E]Þ»X¿$¨AÜX¿$¨AÜX¿$¨AÜX¿$¨AÜšWèfΚ2èfΚ2èfΚ2èfο2íAö¿ íAö¿ íAö¿ íAö¥¨ûáÿûáÿûáÿûáÿZýÏ1ýÏ1ýÏ1ýÏ1ýô ýô ýô ýôxvyˆ‰‡fœÎfœÎÿxvyˆ‰‡fœÎfœÎÿxvyˆ‰‡22ÿˆŠ‡ÿÿše2ÿ44/44/še2ÿÿˆŠ‡ÿÿše2ÿ44/44/še2ÿÿˆŠ‡ÿÿše2ÿ44/44/še2ÿÿxvyˆ‰‡ÿxvyˆ‰‡œœÿxvyˆ‰‡xwyxwyÿxvyˆ‰‡33ÿˆŠ‡ÿ31el1eleedÿˆŠ‡ÿ31el1eleedÿˆŠ‡ÿ206Ÿ06ŸeedÿÿþÍÿÏ›”Ï›”Ï›”ÿþÍÿÏ›”Ï›”Ï›”še2ÿ44/44/44/˜ÿÿfœÎfœÎÿÿÿeÿœˆŠ‡ÿxwyºñ&ºñ&eedÿˆŠ‡ÿ3wtFwtFeedÿˆŠ‡ÿe™›ÌÌÑÌÌш‰‡ÿˆŠ‡ÿe™›ÌÌÑÌÌш‰‡ÿˆŠ‡ÿ/Í06Ÿ06Ÿˆ‰‡ÿše2ÿ44/44/44/še2ÿ44/44/44/še2ÿ44/44/44/ÿÿ—ÿfœÎfœÎÿÿÿeÿaš.dÿˆŠ‡ÿwtFºñ&ºñ&ˆ‰‡ÿše2ÿÿÑ3wtFwtFšd2ÿf›ÎfœÎÿf›ÎfœÎÿÞXÞXéÍéÍËËÿ¥ÿ¥ý[ý[êyêy‡‡*ý™*ý™ÖgÖgbbžÿžÿ˜˜ÿhÿh™™îgîg%!ä%!äÛßÛß05Ñ05ÑÐË/ÐË/83Ê83ÊÈÍ6ÈÍ6žÿžÿbÉa2à IDATbÿhÿh˜˜îgîg™™æþéæþéÔþßÔþß,!,!ØÿÚØÿÚ(&(&Å[ŠÅ[Š;¥v;¥vÅ[еѵÑKÿ/Kÿ/µÑy%¬y%¬‡ÛT‡ÛTy%¬ÈZ/ÈZ/8¦Ñ8¦ÑÈZ/ŸJŸJaÿ¶aÿ¶ŸJ£"E£"E]Þ»]Þ»£"E¨AÜX¿$¨AÜX¿$¨AÜX¿$¨AÜX¿$èfΚ2èfΚ2èfΚ2èfΚ2íAö¿ íAö¿ íAö¿ íAö¿ áÿûáÿûáÿûáÿûÏ1ýÏ1ýÏ1ýÏ1ýô ýô ýô ýô ý‰ÿvþÿÏ1ÿ‰ÿvþÿÏ1ÿ‰ÿvþÿÏ1ÿˆŠ‡ÿxwyΘa2hŸÿˆŠ‡ÿxwyΘa2hŸÿˆŠ‡ÿxwyšd2fœÎÿxÿ‡˜ÿhêÿeÿaš.ŸfÒœÿ‰ÿvþÿÏ1ÿ‰ÿvþÿÏ1eed››œeed››œeed››œeed›šœˆŠ‡ÿxwyΘa1elfh—››œÿˆŠ‡ÿxwyΘa1elfh—››œÿˆŠ‡ÿxwyΘaÌÌÑË2››œÿÿêy‡êeœded››œeed››œeed#$#wtF3ÿý͉ŒºÝÜÝ#$#wtF3ÿý͉ŒºÝÜÝ#$#wtF3ÿý͉ŒºxvyˆŠ‡ÿwtFÏ›”ÌÌÑî%UxwyÿˆŠ‡ÿwtFÏ›”ÌÌÑî%UxwyÿˆŠ‡ÿwtFÏ›”ÌÌÑî%Uxwyÿÿ˜éi—ÿÿhêeaš.ŸÒaþ.ŸfÒed#$#wtF3ÿý͉ŒºÛ«djÎ2þΜ–2f›Îefdÿ››œÿefdÿ›šœLÿý,*! ÖàÿXê$?©5Wû%ÞX"¨5WéÍ3ÿû%Ëë5ãñCMý[ÿ¥ý[ÿчêy‡!™Ög*ý™Ög?©žÿbžÿ—Xÿh˜ÿhü½îg™îgd>Ûß%!äÛßXXáÐË/05ÑÐË/XYìÈÍ683ÊÈÍ6ywVbžÿbW˜ÿh˜éŒ™îg™ñCMæþéãþ,!Ôþß,!þÿ(&ØÿÚ(&é„_Å[Š;¥vÅ[Š;¥vÅ[Š;¥vÅ[Šaþ‡µÑKÿ/µÑKÿ/µÑKÿ/µÑqÿTy%¬‡ÛTy%¬‡ÛTy%¬‡ÛTy%¬;‚ÈZ/8¦ÑÈZ/8¦ÑÈZ/8¦ÑÈZ/^ÿâŸJaÿ¶ŸJaÿ¶ŸJaÿ¶ŸJ‡ÿÛ£"E]Þ»£"E]Þ»£"E]Þ»£"EÖB¨AÜX¿$¨AÜX¿$¨AÜX¿$¨AÜoô{èfΚ2èfΚ2èfΚ2èfο2íAö¿ íAö¿ íAö¿ íAö¥¨®áÿûáÿûáÿûáÿyZTÏ1ýÏ1ýÏ1ýÏ1ýô ýô ýô ýô‰ÿwþvþÿÏ1ÿÿ‰ÿwþvþÿÏ1ÿÿ‰ÿwþvþÿÏ1ÿÿv{‰ÿ»g¡1gŸþÎÿÿÿv{‰ÿ»g¡1gŸþÎÿÿÿv{‰ÿþÎÿÿÿxÿˆ‡˜ÿhêÿÿeÿœaš.ŸfÒœd‰ÿwþvþÿÏ1ÿÿ‰ÿwþvþÿÏ1ÿÿ››œˆ‰‡››œˆ‰‡››œˆ‰‡ÝÜÝ2hŸ3‰Œº››œeedÝÜÝ2hŸ3‰Œº››œeedÝÜÝ2hŸ››œeedêy˜‡œd››œˆ‰‡››œˆ‰‡wtF33wtF33wtF33efdÿ1elfœÎe™›wtFˆ‰‡efdÿ1elfœÎe™›wtFˆ‰‡efdÿ1elfœÎwtFˆ‰‡˜éiéiaš.ŸÒŸÒwtF33djÎ22efdÿ››œ››œeedefdÿ››œ››œefdÿÞXÞXeÜeÜéÍé͙ʙÊË˕˕Ëý[ý[ÿ¥ÿ¥‡‡êyêyÖgÖg*ý™*ý™žÿžÿbbÿhÿh˜˜îgîg™™ÛßÛß%!ä%!äÐË/ÐË/05Ñ05ÑÈÍ6ÈÍ683Ê83Êbbžÿžÿ˜˜ÿhÿh™™îgîgæþéæþé,!,!ÔþßÔþß(&(&ØÿÚØÿÚÅ[Š;¥v;¥vÅ[Š;¥vÅ[Š;¥vµÑKÿ/Kÿ/µÑKÿ/µÑKÿ/y%¬‡ÛT‡ÛTy%¬‡ÛTy%¬‡ÛTÈZ/8¦Ñ8¦ÑÈZ/8¦ÑÈZ/8¦ÑŸJaÿ¶aÿ¶ŸJaÿ¶ŸJaÿ¶£"E]Þ»]Þ»£"E]Þ»£"E]Þ»¨AÜX¿$¨AÜX¿$¨AÜX¿$¨AÜX¿$èfΚ2èfΚ2èfΚ2èfΚ2íAö¿ íAö¿ íAö¿ íAö¿ áÿûáÿûáÿûáÿûÏ1ýÏ1ýÏ1ýÏ1ýô ýô ýô ýô ývþ1ÿÏvþ1ÿÏvþ1ÿωÿwþvþÿÏ1ÿÿ‰ÿwþvþÿÏ1ÿÿ‰ÿwþe›ÎdjÎ1ÿÿ‡ÿh˜ŸfÒaš.vþ1ÿÏvþ1ÿψ‰‡xwyˆ‰‡xwyˆ‰‡xwyefdÿ››œˆ‰‡xwyefdÿ››œˆ‰‡xwyefdÿ››œî%U˜‡éhydœˆ‰‡xwyˆ‰‡xwyÿýÍÿýÍÿýÍÿýÍÿýÍÿýÍwtF33wtF33wtF3fœÎ—ÿ—ÿaþ.aþ.ÿýÍÿýÍþÎþÎ#$##$##$##$##$##$##$##$#ÞXžXžXéÍéiéiËf!f!ÿ¥ÿ¥ý[ý[êyêy‡‡*ý™*ý™ÖgÖgbbžÿžÿ˜˜ÿhÿh™™îgîg%!ä%!äÛßÛß05Ñ05ÑÐË/ÐË/83Ê83ÊÈÍ6ÈÍ6žÿžÿbbÿhÿh˜˜îgîg™™æþéæþéÔþßÔþß,!,!ØÿÚØÿÚ(&(&;¥vÅ[ŠÅ[Š;¥v;¥vÅ[ŠKÿ/µѵÑ;aXì IDATKÿ/Kÿ/µчÛTy%¬y%¬‡ÛT‡ÛTy%¬8¦ÑÈZ/ÈZ/8¦Ñ8¦ÑÈZ/aÿ¶ŸJŸJaÿ¶aÿ¶ŸJ]Þ»£"E£"E]Þ»]Þ»£"EX¿$¨AÜX¿$¨AÜX¿$¨AÜX¿$¨AÜš2èfΚ2èfΚ2èfΚ2èfο íAö¿ íAö¿ íAö¿ íAöûáÿûáÿûáÿûáÿ1ýÏ1ýÏ1ýÏ1ýÏ ýô ýô ýô ýôE™_1Ï™aE™_1Ï™aE™_1Ï™aE™_vþ2Ï™aE™_vþ2Ï™aE™_vþ2Ï™ašeºêêÿh„e3œœŸfÒE™_1Ï™aÿŠ…1‰Š‡eedÝÜÝeedeedÝÜÝeedeedÝÜÝeedeedÝÜÝeedeedÝÜÝeedeedÝÜÝfœÎeed‡ÿh‡ddeedÝÜÝeedeedÝÜÝeed‰Œº‰Œº‰Œº‰Œº‰Œº‰Œº‰ŒºÿýÍÿý͉Œº‰ŒºÿýÍÿý͉Œº‰ŒºÿýÍÿý͉ŒºÿhÿhŸfÒŸfÒ‰Œº‰Œºœ–2œ–2i3ýxwyxwyi3ýi3ýxwyxwyi3ý"¨eÜ"¨›F¨›F¨b¨b¨3ÿ™Ê3ÿ~iÿ~iÿ—ÿ—ÿë5ã•Ëë5ãVjÛVjÛñšßñšßÿ¥ÿ¥ý[ý[êyêy‡‡*ý™*ý™ÖgÖgbbžÿžÿ˜˜ÿhÿh™™îgîg%!ä%!äÛßÛß05Ñ05ÑÐË/ÐË/83Ê83ÊÈÍ6ÈÍ6žÿžÿbbÿhÿh˜˜îgîg™™æþéæþéÔþßÔþß,!,!ØÿÚØÿÚ(&(&;¥vÅ[Š;¥vÅ[ŠÅ[Š;¥vKÿ/µÑKÿ/µѵÑKÿ/‡ÛTy%¬‡ÛTy%¬y%¬‡ÛT8¦ÑÈZ/8¦ÑÈZ/ÈZ/8¦Ñaÿ¶ŸJaÿ¶ŸJŸJaÿ¶]Þ»£"E]Þ»£"E£"E]Þ»¨AÜX¿$¨AÜX¿$¨AÜX¿$¨AÜX¿$èfΚ2èfΚ2èfΚ2èfΚ2íAö¿ íAö¿ íAö¿ íAö¿ áÿûáÿûáÿûáÿûÏ1ýÏ1ýÏ1ýÏ1ýô ýô ýô ýô ý2gŸÿÿ2gŸ2gŸÿÿ2gŸ2gŸÿÿ2gŸ2gŸÿÿ2gŸ2gŸÿÿ2gŸ2gŸÿÿ2gŸf›Îÿÿf›Î›ÿÿ›2gŸÿÿ2gŸxvyÿÿxvy››œeed››œ››œeed››œ››œeed››œ››œeed››œ››œeed››œ››œeed››œêy‡êyœdœ››œeed››œ››œeed››œÿý͉ŒºwtFÿý͉ŒºwtFÿý͉ŒºwtFÿý͉ŒºwtFÿý͉ŒºwtFÿý͉ŒºwtF—ÿÿh˜aþ.ŸfÒaš.ÿý͉ŒºwtFþΜ–2djÎ2gŸÿÿ2gŸ2gŸÿÿ2gŸžXžXéiéif!f!ý[ÿ¥ÿ¥ý[‡êyêy‡Ög*ý™*ý™Ögžÿbbžÿÿh˜˜ÿhîg™™îgÛß%!ä%!äÛßÐË/05Ñ05ÑÐË/ÈÍ683Ê83ÊÈÍ6bžÿžÿb˜ÿhÿh˜™îgîg™æþéæþé,!ÔþßÔþß,!(&ØÿÚØÿÚ(&Å[Š;¥v;¥vÅ[Š;¥vÅ[еÑKÿ/Kÿ/µÑKÿ/µÑy%¬‡ÛT‡ÛTy%¬‡ÛTy%¬ÈZ/8¦Ñ8¦ÑÈZ/8¦ÑÈZ/ŸJaÿ¶aÿ¶ŸJaÿ¶ŸJ£"E]Þ»]Þ»£"E]Þ»£"EX¿$¨AÜX¿$¨AÜX¿$¨AÜX¿$¨AÜš2èfΚ2èfΚ2èfΚ2èfο íAö¿ íAö¿ íAö¿ íAöûáÿûáÿûáÿûáÿ1ýÏ1ýÏ1ýÏ1ýÏ ýô ýô ýô ýôí†yþÏÿ2ÿÿÿeÿœÿˆŠ‡ÿxwyÿÿþÍÿ3ÿše2ÿfœÎÿše2ÿfœÎÿþÏÿ2ÿÿÿeÿœÿˆŠ‡ÿxwyÿÿþÍÿ3ÿše2ÿfœÎÿše2ÿfœÎÿþÏÿ2ÿÿÿeÿœÿˆŠ‡ÿxwyÿÿþÍÿ3ÿˆŠ‡ÿxwyÿ;¦ÿ&Y&%yB­$'#Ù¹ä$'#Ù¹ä$'#Ù¹ä$'#Ù¹ä;eÅ›ã;eÅ›ã$aš.ŸfÒaš.ŸfÒ'#`w7 ‰É`w7 ‰ÉÙ¹ä$'#Ù¹ä$'#Ù¹ä$'#Ù¹ä;eÅ›ã$aš.ŸfÒ'#`w7 ‰ÉÙ¹ä$'#Ù¹ä$'#÷¦ IDATÙ¹ä†!CÜßÚž$ãÎ4aÌÌÑ#êÍ5nÉÍÉÉØðÜßÚžãÎXaÌÌÑfÎôXŠÉÍÉjþÉÙ¹äbžÀã@bžÀã@$š2•ÌüÑ4Òš2•ÌüÑ4Ò'#–7•ÊþÕ4Ë–7•ÊþÕ4ËÙxäþÏÿÐÊaþΟ2ÿÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿÿšd2fœÎÿÿeÿdœÿÿˆŠ‡ÿFÚ‰‡xwyÿÿÿþÍÿ‰ŒºÿýÍ3ÿÿše2ÿ44/šfœÎÿÿše2ÿ44/šfœÎÿÿþÏÿÐÊaþΟ2ÿÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿÿšd2fœÎÿÿeÿdœÿÿˆŠ‡ÿFÚ‰‡xwyÿÿÿþÍÿ‰ŒºÿýÍ3ÿÿÿþÍÿ3šd244/šfœÎÿÿÿþÍÿ3šd244/šfœÎÿÿÿþÍÿ3þÎÐÊaþΟ2ÿÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿÿþÍÿ3šd2fœÎÿÿÿþÍÿ3ddœÿÿÿþÍÿ3ˆ‰‡FÚ‰‡xwyÿÿÿþÍÿ3ÿý͉ŒºÿýÍ3ÿÿ¤D\¼äÿh-˜ÓØj6(–ÊÅ›ã;eÅ›ãÀ$ŸfÒaš.ŸfÒœ‡ ‰É`w7 ‰Éú›;eÅ›ãaš.ŸfÒ`w7 ‰É;eÅ›ãaš.ŸfÒ`w7 ‰Ébžãbžãš2fΚ2fΖ7jþÉ–7jþÉ;e;eÅ›ãaš.aš.ŸfÒ`w7`w7 ‰É†!CÜßÚÎ4aÌÌÑÍ5nÉÍÉbb@b@8k42k42#!k67k67Cä12ÿše2ÿ44/44/šd2ÿše2ÿ44/44/šd2ÿše2ÿ44/44/šd2ÿÿÿ›œÿxvyxwyÿ33ÿf›ÎfœÎÿf›ÎfœÎÿ12ÿše2ÿ44/44/šd2ÿše2ÿ44/44/šd2ÿše2ÿ44/44/šd2ÿÿÿ›œÿxvyxwyÿ33ÿ3ÿýÍfœÎfœÎÿ3ÿýÍfœÎfœÎÿ3ÿýÍ22ÿÿþÍÿÿše2ÿ44/44/šd2ÿÿþÍÿÿše2ÿ44/44/šd2ÿÿþÍÿÿše2ÿ44/44/šd2ÿ3ÿýÍÿ3ÿýÍœœÿ3ÿýÍxwyxwyÿ3ÿýÍ33ÿˆŠ‡ÿÿÿwvywvyÿÿˆŠ‡ÿÿ¤DݤDÿh-Ìþÿh-Øj6ËþØj6;eaš.`w7eÜeܙʙʕË•Ë*wã*wãÀ@80Ò80Òœd5TÑ5TÑú›eü;e;eaš.aš.`w7`w7;e*wã;eaš.80Òaš.`w75TÑ`w7žãbbžãfΚ2š2fÎjþÉ–7–7jþÉ;eÅ›ã'›*wãÅ›ã;eaš.ŸfÒ9f80ÒŸfÒaš.`w7 ‰É6‹5TÑ ‰É`w7VUVUˆ%‡ˆ%‡„%Ž„%ŽžÀãžÀãžÀãžÀãžÀãžÀã•Ìü•Ìü•Ìü•Ìü•Ìü•Ìü•Êþ•Êþ•Êþ•Êþ•Êþ•Êþefdÿ››œÿΙaÿ2hŸÿΙaÿ2hŸÿše2ÿfœÎÿefdÿ››œÿefdÿ››œÿefdÿ››œÿefdÿ››œÿeÿœÿeÿœÿeÿœÿΙaÿ2hŸÿΙaÿ2hŸÿše2ÿfœÎÿeÿœÿše2ÿfœÎÿeÿœÿeÿœÿˆŠ‡ÿwtFÿÑ3/Í3ˆŠ‡ÿwtFÿÑ3/Í3ˆŠ‡ÿwtFÿÑ3/Í3ÿþÍÿ3Θa2hŸÿÿþÍÿ3Θa2hŸÿÿþÍÿ3šd2fœÎÿÿÿ˜èfΚ2éheÿaš.žÿŸbaŸÒˆŠ‡ÿwtFÿÑ3/Í3þÏÿ/ÍÿÑ31ˆŠ‡ÿv{ÿŠ…ÝÜÝ#$#xvy;¦ÿ&Y&%yB­$'#Ù¹ä¤D\¼ä$ÿh-˜Ó'#Øj6(–ÊÙ¹ä;eÅ›ã$aš.ŸfÒ'#`w7 ‰ÉÙ¹äeÜ›$À@$™Êg6œd'#•Ëk5øú›eüÙ¹ä$'#Ù¹ä;eÅ›ã$aš.ŸfÒ'#`w7 ‰ÉÙ¹ä;e'›Üã։śã$aš.9fÿÊÎÈÐ.ŸfÒ'#`w76‹ÿÉÑˬ/ ‰ÉÙ¹äbžãbÜã›$bžã$š2fΚ2ÿÊÎg6š2fÎ'#–7jþÉ–7ÿÉÑk5ø–7jþÉÅ›ãbÜã›$;e&YŸfÒš2ÿÊÎg6aš.&% ‰É–7ÿÉÑk5ø`w7yB­VUààà ªé«$ˆ%‡ÌËÌ454xÛy'#„%ŽÌÌÌ444|ÛrÙ¹äVUàààÊ Ë$ˆ%‡ÌË̬­'#„%ŽÌḬ̀¦Ù¹ä†!CÜßÚžã$Î4aÌÌÑfÎ'#Í5nÉÍÉjþÉÙ¹ä†!CÜßÚžã$Î4aÌÌÑfÎ'#Í5nÉÍÉjþÉÙ¹äblÕ IDATžÀã@bžÀã@$š2•ÌüÑ4Òš2•ÌüÑ4Ò'#–7•ÊþÕ4Ë–7•ÊþÕ4ËÙxäefdÿ››œ››œeedefdÿefdÿ—Í—Íeedefdÿÿefdÿefdÿ—Í—Íeedefdÿÿefdÿefdÿeedefdÿÿefdÿ››œ››œeedefdÿ››œ››œeedefdÿ››œ››œeedefdÿ››œ››œeedeÿœœdeÿœœdeÿœœdeÿeÿ2ÌŸ2ÌŸdeÿÿeÿeÿ2ÌŸ2ÌŸdeÿÿeÿeÿdeÿÿeÿœœdše2ÿfœÎfœÎšd2eÿœœdeÿœœdˆŠ‡ÿxwywtFÿÑ3/Í3ÿþÍÿˆŠ‡ÿxwywtFÿÑ3/Í3ÿþÍÿˆŠ‡ÿxwywtFÿÑ3/Í3ÿþÍÿ‰Œºˆ‰‡ºñ&1elþÎÿþÍÿ‰Œºˆ‰‡ºñ&1elþÎÿþÍÿ‰Œºˆ‰‡þÎÿþÍÿÿÿê˜èfΚ2éi˜ÿÿeÿœaš.žÿŸbaŸÒaÿ.ÿˆŠ‡ÿxwywtFÿÑ3/Í3ÿþÍÿþÏÿ2/ÍÿÑ32þÏÿÛ«Û«FÚÝÜÝ#$#ÝÜÝ\¼ä¥Ã˜Óÿ›(–ÊØ–Å›ãÅ›ãŸfÒŸfÒ ‰É ‰ÉÀ@œdú›eü;e;eaš.aš.`w7`w7;e;e'›'›aš.aš.9f9f`w7`w76‹6‹Å›ãÅ›ãÅ›ãÅ›ãŸfÒŸfÒŸfÒŸfÒ ‰É ‰É ‰É ‰ÉžãbbžãÀfΚ2š2fΜjþÉ–7–7jþÉú›Å›ãÅ[ãŸfÒŸÒ ‰Éš$ÍVUàààÊ ËàààÀˆ%‡ÌË̬­ÌËÌœ„%ŽÌḬ̀¦ÌÌÌú›VUààà6÷5ˆ%‡ÌËÌTðS„%ŽÌÌÌPñZ†!CÜßÚÎ4aÌÌÑÍ5nÉÍÉbš2–7#$#efdÿ››œˆ‰‡xwyeedÿ››œˆ‰‡xwyeedÿ››œˆ‰‡î##xwyeed#$##$##$##$#š2fΚ2fΚ2fÎeÿœdœdÿœdœdÿœdfΜdš2fÎï›Ðš2fΚ2fÎwtF/ÍÿÑ3wtF/ÍÿÑ3wtF/ÍÿÑ3ˆŠ‡ÿxwyˆ‰‡wtFÿÑ3/Í3ÿþÍÿ‰Œºxwyˆ‰‡wtFÿÑ3/Í3ÿþÍÿ‰Œºxwyˆ‰‡e™›ÿÑ3/Í3ÿþÍÿ˜š2èfÎiaš.bažÿŸŸ3wtF/ÍÿÑ3ÿÑ3/Í3FÚºŠ…î2gñˆŠ#$#¥ÃÐü¥Ã[=ÿ›ºÿ›eØ–áØ–ü(jþ'›ÅÀ@9fŸœd6‹š›eü›$$g66k5ø5Å›ã;eÅ›ãÀ@ŸfÒaš.ŸfÒœd ‰É`w7 ‰Éú›eü;eÅ›ãÀaš.ŸfÒœš`w7 ‰Éú›;e›;eÅ[ã$aš.faš.ŸÒ‡`w7‹`w7š$Ížãbý$žÀã@fΚ262fœÎdjþÉ–77/d™Íeü¹Àœú›ªé« ÀÊË@xÛy44œ¬­d|Ûr44ú›ªªeü¹6÷5ààà6÷5ÊËTðSÌËÌTðSÓÉPñZÌÌÌPñZ‰Š†!CÜßÚžãÎ4aÌÌÑfÎÍ5nÉÍÉjþÉzß½†!CÜßÚbžã2ÌŸÎ4aÌÌÑš2fÎ3Ë’Í5nÉÍÉ–7jþÉbb@b@8k42k42#!k67k67Cäi3ýxwyxwyi3ýi3ýxwyxwyi3ýi3ýxwyxwyi3ýi3ýxwyxwyi3ý5ÿÎxwyxwy5ÿΛÿœxwyxwy›ÿœi3ýxwyxwyi3ý#$#xwyxwy#$#Î4afœÎfœÎÎ4aÎ4afœÎfœÎÎ4aÎ4afœÎfœÎÎ4aÎ4aš2œœš2Î4aÎ4aš2œœš2Î4aÎ4aš2œœš2Î4aš2fœÎfœÎš2fÎwþwþfÎÎ4afœÎfœÎÎ4aˆ%‡fœÎfœÎˆ%‡FÚ33/ÍÏ›”FÚ33/ÍÏ›”FÚ33/ÍÏ›”FÚwtF32Ï›”FÚwtF32Ï›”FÚwtF32Ï›”„e3éiéiš2ƒÍ3ŸÒŸÒbaŸfÒFÚ33/ÍÏ›”Š»‡22ÿÑ3Š»‡»g¡v{xvñv{‰Šxvñv{[=0[=eFe(jþýü(jþžã@fÎdjþÉeü*wã*wãÀ@80Ò80Òœd5TÑ5TÑú›eüÅ›ã'›Å›ãžãžã@@ŸfÒ9fŸfÒfÎfÎdd ‰É6‹ ‰ÉjþÉjþÉeüeüÅ›ãÅ[ã@ŸfÒŸÒd ‰Éš$ÍeüÜã@ÿÊÎdÿÉÑeüÀ@œdú›eüààà@ÌËÌdÌÌÌeüÊÉËÊÉËÊÉËÊÉˬ¬­¬¬­¬¬­¬¬­ªªªªªªªªªªªª†!C†!CÜßÚžãÎ4aÎ4aÌÌÑfÎÍ5nÍ5nÉÍÉjþÉzß½$!&$!&bb2ÌŸ44/44/š2š23Ë’737737–7–7žÀãžÀãžÀãžÀãžÀãžÀã•Ìü•Ìü•Ìü•Ìü•Ìü•Ìü•Êþ•Êþ•Êþ•Êþ•Êþ•Êþ—pÃ1 IDAT2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿf›Îÿÿÿ›2›Ÿÿÿÿ2gŸÿÿÿxvyxÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿf›Îÿÿÿ›2›Ÿÿÿÿ2gŸÿÿÿxvyxÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿ2gŸÿÿÿf›Îÿÿÿ›2›Ÿÿÿÿ2gŸÿÿÿxvyšeºÿfœþÿšeºÿfwÎ[=e(jþ›$$g66k5ø5À@œdú›eüžã$$fÎ66jþÉ55žã$$fÎ66jþÉ55žã$$fÎ66jþÉ55Ê Ë@¬­d°¦e@ÊÀË@d¬œ­deüª›ªeüܹڞãÌÌÑfÎÉÍÉjþÉzß½†!CÜßÚ2ÌŸÎ4aÌÌÑ3Ë’Í5nÉÍÉ@@@Ñ$Ò2Ñ4Ò2Ñ4Òø#î7Õ4Ë7Õ4ˬÿþÍÿ3˜ÿÿÿhê˜ÿÿÿhêaÿ.ÿŸfÒœdœšd2fœÎÿše2ÿfœÎÿše2ÿ44/2gŸše2ÿ44/2gŸÿÿêÿTUSÿ¬«­TUSÿ¬«­ˆŠ‡ÿxvyˆŠ‡ÿvEy1þÏÿ1þÏÿ1þÏÿ/Í3ÿþÍÿÿÑ31þÏÿV†S¬«­TUSÿªz­1þÏÿÐÊaÌÌÑf›ÎÿÿÿÏ1Ιaÿ2gŸΙaÿ2gŸeÿ4#$$é2ÜYJ$ cN8$#%!¥·Ê8$#%!¥·ÊÙe'›Ùe'›8$Çšü9fÇšü9f#%!Êu6‹Êu6‹¨“­ý$Üãý$Üãý$7îã62ÿÊÎ62ÿÊÎ62"îò7/ÿÉÑ7/ÿÉÑ7/Cv­ÿþÍÿÿþÍÿéhê˜ÿÿÿÿéhêaÿ.ÿŸfÒdþjÿf›ÎfœÎÿÿf›ÎfœÎÿÿf›Î2gŸf›Î2gŸše2ÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿ˜—ÿxÿÿ¬«­TUSÿTUSÿ¬«­þÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿTUSÿTUSÿþÏÿþÏÿ2gŸ2gŸf›Î44/44/še2ÿ111þÏÿΙaÿΙaÿžãžãfÎfÎjþÉjþÉ'›ÙeÙe'›žÀã9fÇšüÇšü9ffœÎ6‹ÊuÊu6‹d™Íý$Üãý$Üãý$62ÿÊÎ62ÿÊÎ627/ÿÉÑ7/ÿÉÑ7/Ιaÿ‰ÿΙaÿ‰ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿþÏÿTUSÿþÏÿþÏÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿš/œÿ‰ÿš/œÿš/œÿ¶oœ IDAT3ÿþÍÿ3ÿþÍÿ3˜ÿÿÿÿéhê˜ÿÿÿÿaÿ.ÿŸfÒaš.ÿÿÿ‰ÿ‰ÿÿÿše2ÿšd2‰ÿÿÿše2ÿΙaÿÿþÍÿî%Uî%UÿþÍÿš2˜ÿhTUSÿˆŠ‡ÿ454454ˆŠ‡ÿTUSÿˆŠ‡ÿŠ»‡Š»‡ˆŠ‡ÿþÏÿþÏÿþÏÿ/Í/ÍþÏÿþÏÿ/Í/ÍþÏÿÿþÍÿ/Í/ÍÿþÍÿþÏÿ/Í/ÍþÏÿTUSÿ454454TUSÿþÏÿþÏÿþÏÿ2gŸf›Îf›ÎÿþÏÿ11ΙaÿÌÌÑÌÌÑÿÿÿ1gŸÌÌÑΙaÿΙaÿΙaÿbžãbš2fΚ2–7jþÉ–7*wã*wãžÀãb@80Ò80ÒfœÎšd25TÑ5TÑd™Íœg3ý$ÜãÜãý$Üã62ÿÊÎÿÊÎ62ÿÊÎ7/ÿÉÑÿÉÑ7/ÿÉÑΙaÿ»g¡E™_»g¡E™_g¡ÿwþˆŠ‡ÿxwyˆŠ‡ÿxvyˆŠ‡ÿxvyþÏÿ2þέV†SþÏ­ÿ1ÿþÍÿ3ÿý͉ŒºÿþÍÿ3š/œÿïÑf/šïÑfš/œÿfÑdÿþÍÿ‰ŒºÁÀÁ··¸ÿÿÑ3aÿ.ÿf3ÿÿÿþÍÿÿÑ3ÐÊa2hŸÿÿÿÿÏ1ÿÿþÍÿ›1ÏfÑ܈ÿmolÿ“’”ÿéhÿþÍÿšÿÿÿhéiaÿ.ÿŸfÒŸÒeÿþj1eÿ›ÿwÿþÿÿÿf›Îÿwþwf›Î›Î3þÏÿtÍ3èfΚ2ÿh˜h454xwyˆ‰‡ˆŠ‡ÿxwyˆ‰‡ˆŠ‡ÿwtFÿþÏÿ/ÍþÏ3ÿþÏÿ‰ŒºþÏÿþÏÿ‰ŒºþÏÿÿþÍÿÿÑ3ÿþÍÿþÏÿ3þÏÿTUSÿxwyTUSÿþÏÿ/ÍþÏ3ÿœ–2Ι/ÿÌÌÑÌÌÑše2ÿdjÎ1þÏÿÿþÏÿ1ÏfœÎfšÌÌÑΙaÿ2gŸ2gŸΙaÿΙaÿ2gŸΙaÿ2gŸΙaÿ2gŸžãbžãbbfΚ2fΚ2š2jþÉ–7jþÉ–7–7ý$b$62š67/œ7ý$Üãý$62ÿÊÎ627/ÿÉÑ7/2hŸvþ†¼òwþ1gŸwþxwyÿÿÌËÌxwyÿÿxwy2ÿÿV†S2««­23ÿÿUW†3wvy3fÒdvþº&·fÒdvþfÒdÿþÍÿ‰Œº?@?IIHÿþÏÿc0.aš.dÿÿþÍÿÿÑ306ŸÎ˜aÿþÏÿÿÏ11ÿÏþÎÿÿþÍÿ›1Ïš/$ÿxÿmolÿ“‘”“‘”“‘”“‘”“‘”mnlÿÿþÍÿš2˜ÿÿÿ›eÿ2še2ÿšd2ÿÿ‰ÿ‰ÿÿÿše2ÿΙaÿ‰ÿÿÿ/ÍŠ53˜ÌËÌÌËÌwtFwtF/Í/ÍŠ»‡Š»‡Š»‡Š»‡ÿÑ3ÿÑ31Š1¬¬­ˆ‰‡¬¬­/ÍÿÑ3/Í2hŸfœÎšd2šd2fœÎfœÎše2ÿše2ÿÌÌÑΙaÿΙaÿše2ÿše2ÿÌÌÑÌÌÑ2gŸše2ÿΙaÿbžãbš2fΚ2–7jþÉ–7ÙeÙeÇšüÇšüÊuÊuÜãý$ý$ÜãÿÊÎ6262ÿÊÎÿÉÑ7/7/ÿÉÑí†yÿTTSU¬¬­ÿTTSU¬¬­ÿTTSU¬¬­ÿTTSU¬¬­ÿTTSU¬¬­ÿ3ˆŠ‡ÿÁÀÁ··¸ÿ1Òeÿœÿ3ΙaÿÌÌÑfœÎÿŸ1še2ÿï›Ðw2þÿ3š/œÿfÑ܈ÿ“‘”molÿ“‘”molÿ“’”“‘”3˜ÿÿÿhêz $¯ IDATÿŸÒaÿ.ÿŸÒÿœdÿ›fÎÿÿÿwÿþÿÿÿf›Î›ÎwþwþÏÿŠ5vþ3ÿþÍÿ3š2ÿhwtFwtF‰Œº/Í/ÍÿÑ3Š»‡Š»‡vEyŠ»‡Š»‡vEyÿÑ3ÿÑ3/Í1ŠŠv1þÿϬ¬­ˆ‰‡ˆ‰‡xwyTTS/ÍÿÑ3ÿÑ3/ÍÿÑ3djÎ1ÎΙaÿÌÌÑf›Îf›ÿþÏ1ÿÿÿÏ1šd2ÿšd2f›Î44/›Îf›ÎΙaÿ2gŸÎ4/ÿÌÌÑf›ÎΙaÿ2gŸše2ÿše2ÿ2gŸΙaÿ2gŸeÿžãbžã8fΚ2fν!jþÉ–7jþÉ;›Ùe'›žÀãb@9fÇšü9ffœÎšd26‹Êu6‹d™Íœg3Üãý$Üãý$ÿÊÎ62ÿÊÎ62ÿÉÑ7/ÿÉÑ7/­ÜÿþÍÿÁÀÁ?@?IIHÿaÿ.ÿdÿþÏÿ44/šd2ÿþÏÿdjÎe0‰ÿÿÿþÍÿš/$ÿxÿˆŠ‡ÿ“‘”“‘”mnlÿÿþÍÿ˜ÿÿÿŸfÒÿÿÿše2ÿšd2ÿÿše2ÿšd2še2ÿΙaÿše2ÿΙaÿÿþÍÿ‹1Š3ÿþÍÿèfÎÿh˜xvyÿxvyxvyxvy111111331vþvþ1¬«­xwyxwy¬«­3/Í/Í11Ιaÿše2ÿše2ÿÿ1ÿÿþÏÿþÏÿ44/f›ÎfœÎÿÿfœÎf›Î44/2gŸΙaÿΙaÿΙaÿΙaÿ2gŸ2gŸΙaÿÌÌÑf›Î2gŸΙaÿf›ÎÌÌÑbbžãbš2š2fΚ2–7–7jþÉ–7*wã*wãžÀãb@80Ò80ÒfœÎšd25TÑ5TÑd™Íœg3Üãý$ÜãÜãÿÊÎ62ÿÊÎÿÊÎÿÉÑ7/ÿÉÑÿÉÑÿTTS¬¬­ÿÿTTS¬¬­ÿÿTTS¬¬­ÿÿTTS¬¬­ÿÿTTS¬¬­ÿeÿœÿaÿ.ÿŸfÒ›ÿÿÿÿÿÿÿÿÿþÍÿ‰ŒºwtF‰ŒºÌËÌ«©z3ÿÿêÿþÏÿ1þÏÿ1þÏÿ1þÏÿ1þÏÿ1þÏÿ1ˆŠ‡ÿvEy1Švþˆ‰‡xwyÿýÍÿÑ3/ÍÏ›”ÌÌÑf›ÎÿÿÿÏ1še2ÿf›Îše2ÿf›ÎΙaÿ2gŸΙaÿ2gŸše2ÿf›Îše2ÿf›ÎΙaÿ2gŸΙaÿ2gŸeÿ4#$$é2ÜYJ$ cN8$#%!¥·Ê8$#%!¥·Ê8$#%!¥·ÊÜãý$Üãý$Üã5H2ÿÊÎ62ÿÊÎ62ÿÊÎ$[SÿÉÑ7/ÿÉÑ7/ÿÉÑD­ÜˆŠ‡ÿxvyˆŠ‡ÿxvy˜ÿÿéh˜ÿÿç71þÏÿ/Í3ÿþÍÿbaŸÒaÿ.ÿg6›šœefdÿ›šœefdÿ›šœˆŠ‡ÿwvyÿÿþÍ3ÿþͰI×â IDATÿ3ÿþÍÿ3ˆŠ‡ÿ¥fÑdÿÿˆŠ‡ÿxvyÿþÍÿ‰ŒºxvyˆŠ‡ÿxvyÿþÍÿ3Ιaÿ2gŸþÏÿ/Í3ÿþÍÿ3ÿþÍÿ3ÿÿ‰ÿwþÿÿvxuÿЉ‹ÿ¤¦£ÿZYYXYY222###‹‹‹#$#‰ˆŠ!" 555222###‹‹‹ ààà þýþ454ÌËÌ454ïïï444ÌÌÌ444«««ààà ààà ààà àààRRRÌËÌ454ÌËÌ454ÌËÌ454ÌËÌWXWÌÌÌ444ÌÌÌ444ÌÌÌ444ÌÌÌà‡‹ß84!ÈÌß84!ÈÌß84!ÈÌß84SÈÍËUQ5«¯ËUQ5«¯ËUQ5«¯ËUQYÍÎÊWU6©«ÊWU6©«ÊWU6©«ÊWU‰ˆŠ675 RL/X]|/0.%$%454wtF03a###%%%444TQKSV\®­¯675ÊÉË/0.%$%ÛÜÛ###%%%ÛÛÛ®­¯/0.###®­¯/0.###®­¯/0.###®¬¯ˆŠ‡ÿÿˆŠ‡ÿÿÿÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿh˜ÿÿÿéhéiéh/ÍþÏÿÿ121‰ŒºÿþÍÿÿ333ŸfÒaÿ.ÿÿŸÒŸÒŸÒ››œefdÿÿ›šœ››œ›šœefdÿ››œ›šœ›šœ››œ››œefdÿŠÿÿÿÿÑ3ÿþÍÿÿ333ÿþÍÿ‰Œº33‰Œº‰ŒºÿþÍÿš/œÿÿˆŠ‡ÿ33ÿþÍÿÿþÍÿ‰Œº‰Œº33‰ŒºÿþÍÿΙaÿ06Ÿ11ÿþÍÿ‰ŒºÿþÍÿÿ33ÿÿŠŠŠÿÿeÿeÿaÿ.ÿÿÿÿÿ˜ÿÿˆŠ‡ÿˆŠ‡ÿÿþÍÿ‰ÿ‰ÿÿÿÿŠˆ‹Šˆ‹ÿÿÿvxuÿàààÌËÌÌÌÌ àààààà àààààà454ÌËÌÌËÌ454ÌËÌÌËÌ444ÌÌÌÌÌÌ444ÌÌÌÌÌÌàààààà ààà àààÌËÌÌËÌ454ÌËÌ454ÌËÌÌÌÌÌÌÌ444ÌÌÌ444ÌÌÌß84ß84!ÈÌß84!ÈÌß84ËUQËUQ5«¯ËUQ5«¯ËUQÊWUÊWU6©«ÊWU6©«ÊWUÊÉËàààRL/X]|ÛÜÛÌËÌwtF03aÛÛÛÌÌÌTQKSV\675 675%$%454%$%%%%444%%%†ŸþÒ¢ýÏˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆ‰‡ˆ‰‡ˆŠ‡ÿÿÿÿÿÿÿÿÿ‰ÿ‰ÿŠÿÿÿÿÿÿˆŠ‡ÿxvyxvyÿÿÿÿÿh—ÿ˜ÿÿ˜ÿÿ/ÍþÎþÏÿþÏÿ‰ŒºÿýÍÿþÍÿÿþÍÿŸfÒaþ.aÿ.ÿaÿ.ÿ››œeedefdÿefdÿ››œeedÿ››œÝÜÝŠÿÿÿÿÿÿÿÑ3ÿýÍÿþÍÿÿþÍÿ‰ŒºwtFxvy‰Œº|Ñc|Ñcš.œš/œÿš/œÿ›/œwtFˆŠ‡ÿÿþÍÿˆŠ‡ÿ‰ŒºxvywtF‰ŒºÿþÍÿþÏÿΙaÿÿÑ3xvy3ÿýÍÿþÍÿÿþÍÿŠvþwþŠeÿ›ŸfÒaÿ.ÿ˜ÿÿêêÿh˜ÿÿˆŠ‡ÿxvyxvy‰ŒºÿþÍÿ‰ÿwþŠÿÿÿvxuÿÿvxuÿÿÿЉ‹vxuÿààà ÌËÌ454ÌÌÌ444 ààà ààà 454ÌËÌ454454ÌËÌ454444ÌÌÌ444444ÌÌÌ444 àààààà 454454ÌËÌÌËÌ454444444ÌÌÌÌÌÌ444!ÈÌ!ÈÌß84ß84!ÈÌ5«¯5«¯ËUQËUQ5«¯6©«6©«ÊWUÊWU6©«ÊÉËàààX]|ÛÜÛÌËÌ03aÛÛÛÌÌÌSV\675 ààà 675%$%454ÌËÌ454%$%%%%444ÌÌÌ444%%%¨£„¨£„bcabcabca675ÐÍŸÐÍŸiiiiiiiii%$%­ª¤­ª¤ggggggggg%%%††ŸþÒŸþÒ¢ýÏ¢ýÏÜÛÜÜÛÜÑÐÒÜÝÝÜÝÝÏÏÏΙaÿΙaÿΙaÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿΙaÿÛ«Û«xvyxvyxvyÿÿÿÿŠÿÿÿÿÿÿŠÿÿΙaÿe0e0ŠˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿÿÿÿÿhÿÿÿ/ÍÿýÍÿ‰Œºˆ‰‡ÿŸfÒdÿ››œÿeed›šœŠ‰ÿÿÿÑ3þÎÿwtF3wtFêe|Ñc}icÿÿÿ‰ŒºwtFwtF3wtF3‰Œº3ˆ‰‡ÿvþ VP IDATvþeÿ››ŸÒÿÿéh˜ÿÿêéhˆŠ‡ÿxvyˆŠ‡ÿxvy3‰ÿwþwþÿŠˆ‹vxuÿÿŠˆ‹ 454444ààà ÌËÌ454454ÌÌÌ444444ààà ààà ààà ÌËÌ454ÌËÌ454454ÌËÌ454ÌÌÌ444ÌÌÌ444444ÌÌÌ444ß84!ÈÌß84!ÈÌ!ÈÌß84!ÈÌËUQ5«¯ËUQ5«¯5«¯ËUQ5«¯ÊWU6©«ÊWU6©«6©«ÊWU6©«ààà àààÌËÌ454ÌËÌÌÌÌ444ÌÌ̺ÀÝ™œÊº½Ã†º#?º#?º#?ŸþÒ–6c–6c–6c¢ýÏ”9g”9g”9gÜÛÜÑÐÒÜÝÝ !ÏÏÏΙaÿΙaÿˆŠ‡ÿxvyxvyxvyÿþÍÿ333ˆŠ‡ÿÝÜÝefdÿefdÿÝÜÝxvyΙaÿΙaÿÌÌÑ44/Û«FÚΙaÿÿ‰ÿ‰ÿÿÿþÏÿþÍvþËŠ‰ÿ‰ÿÿÿþÏÿvþŠÌÌÑ44/e0E™_Ιaÿÿÿÿê3xvy›ÿ›šœÿwþ13ˆŠ‡ÿ›êe}ic}icxvy‰Œºxvy‰ŒºˆŠ‡ÿ311wtF3‰ÿaš.›aÿ.ÿ˜éh˜ÿÿwtFxvyÿþÍÿvþwþÿÿÿÿvwuŠˆ‹vxuÿààà àààÌËÌ454ÌËÌÌÌÌ444ÌÌÌ àààààà ààà ààà454ÌËÌÌËÌ454ÌËÌ454ÌËÌ444ÌÌÌÌÌÌ444ÌÌÌ444ÌÌÌ!ÈÌß84ß84!ÈÌß84!ÈÌß845«¯ËUQËUQ5«¯ËUQ5«¯ËUQ6©«ÊWUÊWU6©«ÊWU6©«ÊWUÊÉËàààÊÉËÛÜÛÌË̬¬­ÛÛÛÌÌ̪ªªŽ”±UW†x{††ádÁŸþÒŸþÒΙ¢ýÏ¢ýÏÍu”2gŸΙaÿše2ÿše2ÿÌÌÑ2gŸ2gŸxvyˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ3ÿþÍÿÿþÍÿÿþÍÿÿþÍÿÝÜÝ#$##$##$##$#Iÿž2gŸ˜ÿÿΙaÿ44/ÌÌÑ44/ÌÌÑ2gŸÿ‰ÿvþ1ÿÑ3ÿÑ3wþ‰ÿvþ1ÿÏÿÏwþ44/ÌÌÑ44/ÌÌÑ2gŸÿxvyxvyÿÿÿÿÿÿê˜éiêÿ3ÿÑ323ÿxvywtF3xvyÿ›aš.ŸÒ›ÿÿeed››œÿÿÿÿefdÿeedwþvþwþÿ1/Í31ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿ‰Œº›Kÿ/Jg/Jg/éiêÿÿþÍÿwtFwtFÿþÍÿ‰ŒºÿþÍÿˆŠ‡ÿˆŠ‡ÿþÏÿÿÑ306ŸþÏÿÿþÍÿÿþÍÿÿxvyÿ‰ÿ‰ÿÿÿŠŸfÒaÿ.ÿaÿ.ÿaÿ.ÿÿh˜ÿÿ˜ÿÿ˜ÿÿ‰ŒºÿþÍÿÿþÍÿÿþÍÿŠÿÿÿÿÿÿvxuÿvwuvwuvxuÿЉ‹vxuÿvxuÿvxuÿàààÌËÌÌÌÌ àààààà àààààà454ÌËÌÌËÌ454ÌËÌÌËÌ444ÌÌÌÌÌÌ444ÌÌÌÌÌÌààà àààààà ÌËÌ454454ÌËÌÌËÌ454ÌÌÌ444444ÌÌÌÌÌÌ444ß84!ÈÌ!ÈÌß84ß84!ÈÌËUQ5«¯5«¯ËUQËUQ5«¯ÊWU6©«6©«ÊWUÊWU6©«ÊÉËÊÉËÛÜÛ¬¬­/0.ÛÛÛªªª111ÔÔÔ¼»¼¾¾¾º#?º#?º#?ÀÀÁß\ÀÀÁ–6c–6c–6cËÌËý3.ËÌË”9g”9g”9gÊÊÊýU6ÊÊÊ44/ˆŠ‡ÿxvyxvyÿþÍÿ33#$#ÝÜÝÝÜÝéhΙaÿ˜ÿÿΙaÿ˜ÿÿéh2gŸ44/2hŸfœÎwþ11ÿÿwþ11ÿÿ44/2hŸfœÎxvyxvyÿÿÿÿ˜ÿÿÿhéi—ÿÿÿþÍÿþÏÿ/Í2þÎÿˆŠ‡ÿÿþÍÿ‰Œº3ÿýÍÿeÿaÿ.ÿŸfÒŸÒaþ.ÿÿefdÿ››œ››œeedÿÿ››œeedeed‰ÿÿÿŠÿÿÿþÏÿÿþÍÿÿÑ33ÿýÍÿxvy‰ŒºwtFΙaÿþÏÿŸfÒŸÒ—ÿÿxvy3‰Œº33ÝÜÝwtF‰Œºxvy2gŸ1/Í11ÿþÍÿ333ÿýÍÿwþŠvþ›ŸÒeÿŸfÒŸfÒaÿ.ÿêéhÿÿÿhÿh˜ÿÿxvy3ˆŠ‡ÿ‰Œº‰ŒºÿþÍÿwþ‰ÿŠŠÿÿÿŠˆ‹Љ‹"""Šˆ‹Љ‹Šˆ‹˜™—ÿŠˆ‹ÿЉ‹Š‰‹vxuÿ­®â( IDATààà ÌËÌ454ÌÌÌ444 ààà ààà 454ÌËÌ454454ÌËÌ454444ÌÌÌ444444ÌÌÌ444ààà ààà àààÌËÌ454ÌËÌ454454ÌËÌÌÌÌ444ÌÌÌ444444ÌÌÌß84!ÈÌß84!ÈÌ!ÈÌß84ËUQ5«¯ËUQ5«¯5«¯ËUQÊWU6©«ÊWU6©«6©«ÊWU675 ¨£„%$%454ÐÍŸ%%%444­ª¤ÊÉËÊÉËÊÉËÛÜÛÛÜÛÛÜÛ/0.ÛÛÛÛÛÛÛÛÛ111ÔÔÔÔÔÔÔÔÔÊÉ˼»¼¼»¼¼»¼»¼º¾¾¾¾¾¾¾¾¾¸¸¸ádÁΙÍu”Ιaÿ2gŸ›ÎΙaÿ2gŸxvyxvyˆŠ‡ÿ33ÿþÍÿ‰ŒºxvyˆŠ‡ÿxvyIÿžéh2Ιÿ2ΘaÌÌÑΘaÿ2gŸvþwvþwΘaÌÌÑΘaÿ2gŸxvyˆŠ‡ÿÿÿ˜ÿhêÿéhÿÑ3/Í3ÿ31wtF‰Œºxwyÿ3aš.ŸfÒœÿŸÒeed››œÿ›šœefdÿ››œeed›šœÿÿŠwþÿþÿÿ/ÍÿÑ32ÿ3ˆŠ‡ÿwtFxvyvÏÿÐÊaŸ2ŸÿéhÿþÍÿ3ˆŠ‡ÿ‰ŒºÿþÍÿ3wtFÿwtFÿvEy13ÿþÍÿþÏ3ÿÿÑ3ÿþÍÿ3ÿÿˆ‰‡3‰ÿvþwþeÿ›aÿ.ÿŸÒaÿ.ÿÿÿê˜ÿÿéh˜ÿÿˆŠ‡ÿxvyÿþÍÿ3ÿþÍÿ‰ÿwþÿÿÿÿÿÿhfi˜š—ÿhgiÿhgiÿÿvxuÿŠˆ‹vxuÿ 454444 ààà 454ÌËÌ454454444ÌÌÌ444444 àààààà ààà þýþ454ÌËÌÌËÌ454ÌËÌ454ïïï444ÌÌÌÌÌÌ444ÌÌÌ444¿¿¿!ÈÌß84ß84!ÈÌß84!ÈÌý5«¯ËUQËUQ5«¯ËUQ5«¯îyt6©«ÊWUÊWU6©«ÊWU6©«675 ®´Ñ¨£„X]|%$%454‰ŒºÐÍŸ03a%%%444¬¯µ­ª¤SV\ÊÉË675ÊÉËÛÜÛ%$%»¼º !ÛÛÛ%%%¸¸¸###ÀÀÁÀßÁËÌË3.ËËÊÊÊU6ÊÊÿþÍÿ3ÿÿê‰ÿwþ‰ÿwþ‰ÿvþŠwþÿþÍÿ3ÿþÍÿ3ÿþÍÿÏ›”2gŸefdÿ#$#ÝÜÝ#$#xvyÿþÍÿ‰Œºxvyše2ÿf›Îše2ÿe›Î›e2f›Îše2ÿï›Ðwþÿÿÿÿ˜ÿÿéh˜ÿÿéhΙaÿ2gŸΙaÿ2gŸÿþÍÿ3ÿþÍÿ3Ιaÿ2gŸΙaÿ2gŸÿÿefdÿ››œÿÿÿefdÿ›šœˆŠ‡ÿÝÜÝ›šœefdÿC> WZI(7:@rlOŽ”±rlO¬±Ï«©zUW†«©zx{©ˆ…x{ˆ…©¦WZI(©¦WZI(©¦WZI( ÿþÍÿÿþÍÿþÏÿþÏÿþÏÿÿþÍÿÿþÍÿ3bÿ.daþ.ÿþÍÿ‰ÿ‰ÿ‰ÿvþ‰ÿ‰ÿvþÿÏvþvþvþvþÿþÍÿ3ÿþÍÿ3‰Œº‰Œº‰Œº‰Œº‰Œº2gŸ2gŸše2ÿše2ÿefdÿ#$##$#xvyÿþÍÿÿÿ3wvyÿÿf›Îf›Îwþwþ‰ÿ‰ÿÿÿÿÿŠŠŠÿÿÿÿ˜ÿÿ˜ÿÿÿhÿhÿh˜ÿÿ˜ÿÿΙaÿše2ÿ2gŸše2ÿÿþÍÿÿþÍÿ‰Œº‰Œº‰ŒºÿþÍÿÿþÍÿΙaÿΙaÿˆŠ‡ÿˆŠ‡ÿeÿeÿ2gŸΙaÿΙaÿ2gŸÿÿþÏÿþÏÿÿþÍÿÿþÍÿaÿ.ÿrlOŽ”±Ž”±rlOŽ”±Ž”±«©zUW†UW†«©zUW†UW†ˆ…x{x{ˆ…x{x{X¿$X¿$Øê IDATš2š2¿ ¿ í†yÿþÍÿ3ÿþÍÿÿÑ31þÏÿ1þÏÿ/Í3ÿþÍÿ3bÿ.ŸÒÿeÿaš.ŸÒˆŠ‡ÿwtF3ÿþÍÿ3˜ÿÿèfÎ3ÿÿŠvþÿÿŠvþÿÏ1ÿþÍÿ3˜ÿÿèfÎ3ÿÿÿÿše2ÿî%UÛ«f›ÎÿþÍÿ3še2ÿ44/ÌÌÑf›Îefdÿ#$#ÝÜÝ#$#xvyÿþÍÿ‰ŒºwtF‰ŒºwtF‰Œºxvyše2ÿe›ÎÿÏ1›e2f›Î‰ÿvþŠwþ‰ÿvþŠý˜ÿh„e3f›Îše2ÿ44/2gŸše2ÿf›Îše2ÿî%UwtF‰ŒºxvyþÏÿÐÊa2gŸÿþÍÿ‰Œºxvyaÿ.ÿŸfÒ›ÿþÎ1efdÿ››œÿÿþÍÿÿÑ31þÏÿ/Í3efdÿ››œeed››œÿaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒˆŠ‡ÿÝÜÝ#$#ÝÜÝ›šœ¨¤„ÿWZI(©¦Ž”±rlOŽ”±rlOWZIUW†«©zUW†«©z(x{ˆ…x{ˆ…©¦®´ÑRL/X¿$Võ­RL/WZI‰ŒºwtFš2qòˆwtF(¬¯µTQK¿ ™ð«TQK©¦®´ÑRL/WZI‰ŒºwtF(¬¯µTQK©¦WZI( ÿþÍÿ3ÿþÍÿ3þÏÿ1þÏÿ1še2ÿf›Îÿÿbÿ.ŸÒÿÿÿꈊ‡ÿwtF‰ŒºxvyÿþÍÿ3ÿÿ˜éhše2ÿî%UÛ«f›Î‰ÿvþŠvþŠvþÿÏ1ÿÏ1ÿþÍÿ3ÿÿ˜éhˆŠ‡ÿFÚÌÌÑf›ÎˆŠ‡ÿwtF‰Œºxvyše2ÿ44/ÌÌÑf›ÎˆŠ‡ÿÝÜÝ#$#xvyÿþÍÿfh—š˜ifh—š˜i›gee›ÎÿÏ/ÍÿÑ31‰ÿuÏþ1ŠvþŠvþŠŽ˜ýÿh˜ÿh¸™b2gŸΙaÿÌÌÑ44/ÌÌÑe™›‰ŒºwtF‰ŒºxvyþÏÿ1ˆŠ‡ÿÝÜÝ›šœÿþÍÿ3aÿ.ÿŸÒÿÿefdÿ›šœÿþÍÿ3þÏÿ1efdÿ››œÿaÿ.ÿŸÒaþ.ŸÒˆŠ‡ÿÝÜÝ›šœ¨¤„ÿWZI(©¦Ž”±rlOWZIUW†«©z(x{ˆ…©¦®´ÑRL/WZI‰ŒºwtF(¬¯µTQK©¦®´Ñààà RL/WZI‰ŒºÌËÌ454wtF(¬¯µÌÌÌ444TQK©¦®´ÑàààrlOWZI‰ŒºÌËÌ«©z(¬¯µÌÌ̈… ÿÑ33þÏÿ/Í1ÿþÍÿ44/ŸÒΘaÿÿêxvy‰ŒºwtFxvyÿþÍÿ33êÿhše2ÿˆŠ‡ÿÛ«44/še2ÿše2ÿ‰ÿvþÿÏÿÏÿÏÿÏÿþÍÿ33xÿêyÿhÛ«Û«ºñ&ÌÌÑ44/wtFxvyΙaÿΙaÿÌÌÑ#$#ÝÜÝ3š˜ifh—fh—#$#3f›Î›e2›e21ÿÑ31›e2›e2‰ÿ‰ÿ‹1ŠvþŠÿh˜ÿhše2ÿΙaÿ2gŸ44/2gŸ‰ŒºwtF‰Œº1xvy›šœefdÿ3ŸÒþÎÿ›šœ31››œÿŸÒŸÒÿýÍÿýÍaÿ.ÿÝÜÝ›šœŽ”±rlOŽ”±UW†«©zUW†x{ˆ…x{X¿$X¿$ª Sš2š2x¿ ¿ gU®´ÑàààrlOàààX]|‰ŒºÌËÌ«©zÌËÌ3¬¯µÌÌ̈…ÌÌÌ"%+®´ÑàààŽ”±‰ŒºÌËÌUW†Î¬µ IDAT¬¯µÌÌÌx{/ÍþÏÿÿþÍÿþÏÿÿÑ3ÿþÍÿþÏÿÿþÍÿÌÌÑΙaÿΙaÿ¸™b‰Œºxvy3ÿþÍÿÿÿ˜î%UÛ«44/ºñ&44/î%UÿÏÿÏÿÏ1/Í/Í/Í/Í«ÿþÍÿxÿ‡˜î%UÛ«44/ºñ&44/î%U‰Œºxvy2gŸ2gŸše2ÿ44/xvy#$#ÿþÍÿ‰Œºš˜iš˜iˆŠ‡ÿ3f›Îf›Î›e21›e2f›Îf›Îwþwþ‰ÿvþÿÏŠvþŠŠwþÿh˜ÿhÿhêÌÌÑ44/2gŸše2ÿše2ÿf›Î‰ŒºwtF‰Œº‰Œºxvy›šœefdÿ1›šœeedÿbabaŸfÒxvy#$#efdÿrlOŽ”±Ž”±rlOŽ”±Ž”±«©zUW†UW†«©zUW†UW†ˆ…x{x{ˆ…x{x{Võ­X¿$Võ­Võ­X]|X]|qòˆš2qòˆqòˆ33™ð«¿ ™ð«™ð«"%+"%+RL/rlOX]|ÊÉ˨£„wtF«©z3¬¬­ÿýÍTQKˆ…"%+ªªªÞÛÕŽ”±àààŽ”±UW†ÌËÌUW†x{ÌÌÌx{31ÿþÍÿ/ÍÿþÍÿ13þÏÿÿÑ3þÏÿf›Î2gŸΙaÿÌÌÑÌÌÑΙaÿˆŠ‡ÿwtF‰Œºxvy3˜ÿÿ˜ÿÿ˜èfÎf›Îî%UFÚÌÌÑFÚ2gŸvþvþÿÏ/Í/ÍÿÏvþÿÏbabaÿχxÿ«˜‡˜‡˜èfÎf›Îî%UFÚÌÌÑFÚ2gŸˆŠ‡ÿ‰Œºxvyše2ÿše2ÿ44/ÌÌÑxvy›šœ33wtFše2ÿše2ÿ‰ÿ‰ÿuÏþ‹1wþwþŠwþêéhêÿhêf›Î2gŸše2ÿf›ÎÌÌÑf›Îxvy3xvy‰Œºxvy›šœefdÿ›šœŸÒŸÒŸÒ›xvyrlOŽ”±rlOrlOŽ”±rlO«©zUW†«©z«©zUW†«©zˆ…x{ˆ…ˆ…x{ˆ…RL/Võ­RL/RL/RL/¨£„¨£„wtFqòˆwtFwtFwtFÿýÍÿýÍTQK™ð«TQKTQKTQKÞÛÕÞÛÕààਣ„ÌËÌÿýÍÌÌÌÞÛÕÊÉËÊÉËÊÉËÊÉˬ¬­¬¬­¬¬­¬¬­ªªªªªªªªªªªªÿþÍÿ3þÏÿ1þÏÿ1þÏÿ1ÿþÍÿ3ÿþÍÿ3Ιaÿ2gŸΙaÿ2gŸΙaÿ2gŸˆŠ‡ÿwtF‰Œºxvy˜ÿÿèfΚ2ÿhéþΚ2éhˆŠ‡ÿxvyˆŠ‡ÿxvy‰ÿuÏþ/Í3ŠuÏþ/ÍbažÒ˜ÿèfΚ2ÿhéþΚ2éhˆŠ‡ÿxvyˆŠ‡ÿxvyˆŠ‡ÿwtF3še2ÿ44/ÌÌÑf›ÎˆŠ‡ÿxvyÿþÍÿ3ÿþÍÿ‰Œºxvyše2ÿf›Î‰ÿvþÿÏ1Šwþ‰ÿwþ‰ÿwþÿÿêÿÿêše2ÿf›Îše2ÿf›ÎˆŠ‡ÿxvyˆŠ‡ÿxvyefdÿ›šœ¨¤„ÿWZI(©¦Ž”±rlOWZIUW†«©z(x{ˆ…©¦®´Ñª©«¨£„WZI‰ŒºxwyÿýÍ(¬¯µvvvÞÛÕ©¦WZI(©¦X]|¨£„WZI3ÿýÍ("%+ÞÛÕ ´’g IDATˆŠ‡ÿÿÿÿþÍÿÿÿˆŠ‡ÿÿÿÿþÍÿÿÿÿþÍÿÿþÍÿÿþÍÿhigÿhigÿˆŠ‡ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿhigÿhigÿÿÿÿÿÿþÏÿÿþÏÿÿÿþÍÿÿþÍÿÿÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿÿþÍÿÿþÍÿaÿ.ÿaÿ.ÿeÿÿÿaÿ.ÿþÏÿþÏÿeÿÿÿaÿ.ÿeÿ¥…ÿ¥ÿ¥…ÿ¥ÿ¥…ÿ¥ÿ¥…ÿ¥ÿþÏÿÿÿþÏÿÿÿþÏÿÿÿþÏÿÿÿÿó ÿÿÿÿó ÿÿÿÿó ÿÿÿÿó ÿÿÿ¥ÿWÿ¥ÿWÿ¥ÿWÿ¥ÿWÿÿÿ‰ÿÿÿ‰ÿÿÿ‰ÿÿÿ‰ÿÿÿ­"!ÿÿÿ­"!ÿÿÿ­"!ÿÿÿ­"!ÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿWÿÿWÿWÿÿWÿÿ/1.ÿ‰ÿ/1.ÿ‰ÿ‰ÿ/1.ÿ‰ÿ/1.ÿRTQÿ­"!ÿRTQÿ­"!ÿ­"!ÿRTQÿ­"!ÿRTQÿÿWÿÿWÿWÿÿWÿÿ/1.ÿ‰ÿ/1.ÿ‰ÿ‰ÿ/1.ÿ‰ÿ/1.ÿRTQÿ­"!ÿRTQÿ­"!ÿ­"!ÿRTQÿ­"!ÿRTQÿþÍ3ÿÿþÍÿ3þÍ3ÿÿþÍÿ3ÿ3ÿýÍ3ÿÿ ! ! ! 1xˆ1ÿþÍÿÿÿÿþÍÿ3ˆŠ‡ÿxvyÿÿþÏÿ1þÏÿ1þÏÿ1ÿÿše2ÿŸÒÿÿÿ.bšÒŸfÒaÿ.ÿŸÒše2ÿÎÿÿÿÿÿÿÿÿþÏÿ1þÏÿ1eÿ›eÿ›‰ÿwþš/œÿfÑdš/œÿfÑdaš.ŸÒÿ›aÿeÿ11ÿÏ1ÿÏ1++Õï+Õï+²ü²üNÿ²üNÿ²üŠŠvþŠvþŠ®®Rüý®Rüý®þ`A ¿þ`A ¿þ`A ¿þ`A ¿™fgš™fgš™fgš™fgš¼‡b—žib—žib—žib—©ÿWÿNÿü©ÿ¦1,ZÏÔvþÏÔ¦1,¥20[ÎÐRüýÎÐ¥20©ÿWÿNÿü©ÿWÿئ1,ZÏÔvþÏÔ¦1,ZÏÔÉ##¥20[ÎÐRüýÎÐ¥20[ÎЮÿþÍÿÿÿÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿÿÿÿÿþÍÿÿþÍÿhigÿÿÿÿþÍÿÿÿhigÿÿÿÿÿÿÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿhigÿhigÿhigÿhigÿÿÿÿÿÿÿxÿÿÿÿxÿÿÿþÍÿÿþÍÿΙaÿΙaÿÿþÍÿÿþÍÿÿÿΙaÿΙaÿÿÿÿþÍÿÿþÍÿþÏÿþÏÿÿþÍÿÿþÍÿþÏÿþÏÿÿþÍÿþÏÿÿþÍÿþÏÿÿþÍÿeÿÿþÍÿeÿþÏÿÿÿΙaÿΙaÿše2ÿΙaÿše2ÿše2ÿše2ÿΙaÿΙaÿΙaÿeÿeÿaÿ.ÿeÿaÿ.ÿše2ÿΙaÿÿÿše2ÿÿÿΙaÿΙaÿΙaÿÿÿÿÿÿþÍÿÿþÍÿþÏÿÿþÍÿÿþÍÿš/œÿš/œÿ‰ÿaÿ.ÿaÿ.ÿ‰ÿÿÿþÏÿþÏÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿ‰ÿÿ‰ÿ‰ÿþÏÿþÏÿaÿ.ÿeÿeÿaÿ.ÿeÿeÿeÿ¥…ÿ¥ÿ¥…ÿ¥ÿ¥ÿ¥ÿ¥…ÿ¥ÿþÏÿÿÿþÏÿÿÿÿÿÿÿþÏÿÿÿÿó ÿÿÿÿó ÿÿÿÿÿÿÿÿó ÿÿÿ¥ÿWÿ¥ÿWÿWÿWÿ¥ÿWÿÿÿ‰ÿÿÿ‰ÿ‰ÿ‰ÿÿÿ‰ÿÿÿ­"!ÿÿÿ­"!ÿ­"!ÿ­"!ÿÿÿ­"!ÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿWÿ¥ÿ¥ÿ¥ÿWÿÿÿ/1.ÿ‰ÿÿÿÿÿÿÿ‰ÿ/1.ÿ/1.ÿRTQÿ­"!ÿÿÿÿÿÿÿ­"!ÿRTQÿRTQÿÿWÿ¥ÿ¥ÿ¥ÿWÿÿÿ/1.ÿ‰ÿÿÿÿÿÿÿ‰ÿ/1.ÿ/1.ÿRTQÿ­"!ÿÿÿÿÿÿÿ­"!ÿRTQÿRTQÿª½~ó IDAT3ÿýÍÿý͈‰‡ÿxvy‰Œºˆ‰‡ÿý͈‰‡ÿýÍ3ÿýÍÿýÍÿýÍÿýÍÿÿÿÿ3wtFwtF3xvyxvyxvyxvyÿÿÿÿ333xvy‰Š‡‰Š‡xvyxvy˜—™˜—™˜—™ÿÿÿˆÿxÿxˆÿÿÿˆŠ‡ÿˆŠ‡ÿ11113/Í/ÍþÏÿ3ÿ™Íÿ™ÍeÿþÏÿ1ÿΘa2hŸ2hŸ44/aš.eÿaš.ŸÒ›e2Ï™aÿÿ3ÿÑ3ÿÑ33fÑdš/œÿš/œÿfÑdvþ(Ôaÿ.ÿ‰ÿ1ÿÿ1ŸÒeÿaÿ.ÿŸÒÿÿaÿ.ÿžÒÿvþvþwþÿ‰ÿ1ÿÿ1aš.aš.žÿŸaÿ.ÿÿ™Íaš.1ÿÏ1ÿÏÿÏ1ÿÏ+Õï+ÕïÕï+Õï²üNÿ²üNÿNÿ²üNÿŠvþŠvþvþŠvþ®Rüý®RüýRüý®Rüýþ`A ¿þ`A ¿þ`A ¿þ`A ¿™fgš™fgš™fgš™fgšžib—žib—žib—žib—WÿNÿ[ý©ÿZÏÔvþÿÏ01.¦1,[ÎÐRüýÕïS63¥20WÿNÿWÿZÏÔvþÿÏZÏÔ[ÎÐRüýÕï[ÎЉŒºxvyxvyˆŠ‡ÿwtF333ÿýÍhhg˜—™‰Œºxvyxvyhhg ! xvy3xvy˜—™ÿˆÿ3ÿþÍÿ3ÿýÍhŸ3ÿþÍÿÿxwyÿ‰‡xwyˆ‰‡ÿÿΙaÿÌÌÑe™›þÏÿÐÊa1elþÏÿÐÊaÏ›”06þÏÿÐÊaba›jÿΙaÿΘa2gŸÌÌÑ44/ÌÌÑ44/eÿaš.ÌÌÑ44/ÌÌÑ44/ÿÿŠÿþÿþÏÿ1þÏÿ1š/œÿïÑfš/œÿfÑdŠØÿ,ŸfÒaÿ.ŸÒvÿÿÿÿÏÿ1ÿaš.ŸfÒaÿ.ÿŸÒbÿ.ŸfÒŸeaš.ÿŸÒ‰ÿwþÿ‰ÿŠþ‰ÿwþÿΙaÿ›ÌÑ44/šÌÑÿf›ÎŸfÒ›žþÿžÿŸ3aÿ.ÿ ÒÿÏ11ÿÏ1ÿÏ1óï++Õï+Õï+Nó²ü²üNÿ²üNÿ²ü¨þŠŠvþŠvþŠvüý®®Rüý®Rüý® ¿þ`A ¿þ`A ¿þ`A ¿þ`Agš™fgš™fgš™fgš™fb—žib—žib—žib—žiDzWÿ©ÿWÿZÏÔ¦1,ZÏÔ"[ÎÐ¥20[ÎЪNÿ²üWÿÿÏ1vþŠZÏÔ"Õï+Rüý®[ÎЮÿþÍÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿhigÿÿþÍÿÿÿÿÿþÍÿhigÿˆŠ‡ÿhigÿhigÿhigÿhigÿˆŠ‡ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿˆŠ‡ÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿÿÿxÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿÿÿÿΙaÿΙaÿÿþÍÿþÏÿþÏÿÿþÍÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿeÿþÏÿþÏÿþÏÿΙaÿše2ÿše2ÿše2ÿše2ÿše2ÿΙaÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿΙaÿše2ÿše2ÿše2ÿše2ÿše2ÿΙaÿÿÿ‰ÿ‰ÿÿÿþÏÿΙaÿþÏÿþÏÿþÏÿþÏÿš/œÿ‰ÿ‰ÿš/œÿaÿ.ÿeÿeÿaÿ.ÿÿÿþÏÿþÏÿÿÿaÿ.ÿeÿeÿaÿ.ÿaÿ.ÿeÿeÿaÿ.ÿ‰ÿÿ‰ÿ‰ÿÿÿÿÿΙaÿše2ÿÿÿaÿ.ÿaÿ.ÿ¥ÿ¥…ÿ¥ÿ¥…ÿ¥ÿ¥ÿ¥ÿ¥…ÿÿÿþÏÿÿÿþÏÿÿÿÿÿÿÿþÏÿÿÿÿó ÿÿÿÿó ÿÿÿÿÿÿÿÿó ÿWÿ¥ÿWÿ¥ÿWÿWÿWÿ¥ÿ‰ÿÿÿ‰ÿÿÿ‰ÿ‰ÿ‰ÿÿÿ­"!ÿÿÿ­"!ÿÿÿ­"!ÿ­"!ÿ­"!ÿÿÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿ¥ÿ¥…ÿ¥ÿ¥…ÿ¥ÿWÿÿÿÿÿþÏÿÿÿþÏÿÿÿ‰ÿ/1.ÿ/1.ÿÿÿÿó ÿÿÿÿó ÿÿÿ­"!ÿRTQÿRTQÿ¥ÿ¥…ÿ¥…ÿ¨¤„ÿ¥…ÿ¥ÿ¥ÿWÿÿÿþÏÿþÏÿÿþÍÿþÏÿÿÿÿÿ‰ÿÿÿÿó ÿÿó ÿÿþõÿÿó ÿÿÿÿÿ­"!ÿ†W­› IDATˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿÿÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÍÿþÏÿþÏÿÿþÍÿÿþÏÿþÏÿÿΙaÿÿþÍÿþÏÿþÏÿÿþÍÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿše2ÿΙaÿaÿ.ÿaÿ.ÿeÿeÿaÿ.ÿΙaÿše2ÿΙaÿÿÿÿÿþÏÿše2ÿþÏÿþÏÿþÏÿš/œÿš/œÿaÿ.ÿaÿ.ÿÿÿÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿ‰ÿÿÿ‰ÿÿÿÿÿaÿ.ÿaÿ.ÿ¥ÿ¥ÿ¥…ÿ¥ÿ¥…ÿ¥ÿ¥…ÿ¥ÿÿÿÿÿþÏÿÿÿþÏÿÿÿþÏÿÿÿÿÿÿÿÿó ÿÿÿÿó ÿÿÿÿó ÿÿÿWÿWÿ¥ÿWÿ¥ÿWÿ¥ÿWÿ‰ÿ‰ÿÿÿ‰ÿÿÿ‰ÿÿÿ‰ÿ­"!ÿ­"!ÿÿÿ­"!ÿÿÿ­"!ÿÿÿ­"!ÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿ¥ÿ¥ÿ¥…ÿ¥…ÿ¥ÿ¥ÿWÿÿÿÿÿÿþÏÿþÏÿÿÿÿÿ‰ÿ/1.ÿÿÿÿÿÿó ÿÿó ÿÿÿÿÿ­"!ÿRTQÿ¥ÿ¥…ÿ¨¤„ÿ¨¤„ÿ¥…ÿ¥ÿ¥ÿWÿÿÿþÏÿÿþÍÿÿþÍÿþÏÿÿÿÿÿ‰ÿÿÿÿó ÿÿþõÿÿþõÿÿó ÿÿÿÿÿ­"!ÿí†yˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿΙaÿΙaÿΙaÿaÿ.ÿaÿ.ÿeÿeÿaÿ.ÿΙaÿΙaÿΙaÿΙaÿÿÿÿÿþÏÿše2ÿþÏÿþÏÿþÏÿš/œÿš/œÿaÿ.ÿaÿ.ÿÿÿÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿ‰ÿ‰ÿÿÿÿÿaÿ.ÿaÿ.ÿ¥ÿ¥…ÿ¥ÿ¥ÿ¥ÿ¥…ÿ¥ÿ¥…ÿÿÿþÏÿÿÿÿÿÿÿþÏÿÿÿþÏÿÿÿÿó ÿÿÿÿÿÿÿÿó ÿÿÿÿó ÿWÿ¥ÿWÿWÿWÿ¥ÿWÿ¥ÿ‰ÿÿÿ‰ÿ‰ÿ‰ÿÿÿ‰ÿÿÿ­"!ÿÿÿ­"!ÿ­"!ÿ­"!ÿÿÿ­"!ÿÿÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿ£dAÿ¥ÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ™fÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿÿ¼‡ÿÿÿ¥ÿ¥…ÿ¥…ÿ¥…ÿ¥…ÿ¥ÿ¥ÿWÿÿÿþÏÿþÏÿþÏÿþÏÿÿÿÿÿ‰ÿÿÿÿó ÿÿó ÿÿó ÿÿó ÿÿÿÿÿ­"!ÿ¥ÿ¨¤„ÿ¨¤„ÿ¨¤„ÿ¨¤„ÿ¥…ÿ¥ÿ¥ÿÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿþÏÿÿÿÿÿÿÿÿþõÿÿþõÿÿþõÿÿþõÿÿó ÿÿÿÿÿΙaÿΙaÿΙaÿΙaÿˆŠ‡ÿˆŠ‡ÿÿþÍÿaÿ.ÿþÏÿš/œÿÿþÍÿþÏÿþÏÿÿÿþÍÿˆŠ‡ÿÿþÍÿÿeÿˆŠ‡ÿše2ÿše2ÿše2ÿÿÿÿÿÿÿÿÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿÿþÏÿþÏÿþÏÿhigÿÿÿÿhigÿ¥ÿÿ¥…ÿÿ¥ÿÿ¥…ÿÿÿÿÿþÏÿÿÿÿÿþÏÿÿÿÿ!# ÿÿó ÿ!# ÿÿÿ!# ÿÿó ÿ!# ÿ§ÿÿc¨ÿÿ§ÿÿc¨ÿÿÿÿÿ˜ÿÿÿÿÿÿ˜ÿÿÿ$ÿÿ!# ÿ½ÿÿ!# ÿ$ÿÿ!# ÿ½ÿÿ!# ÿAÿÿ;¦ÿÿAÿÿ;¦ÿÿeÿÿaÿ.ÿÿeÿÿaÿ.ÿÿ'ˆÿ!# ÿ‡ÿSÿ!# ÿ'ˆÿ!# ÿ‡ÿSÿ!# ÿdbÿÿ¥ÿÿdbÿÿ¥ÿÿš/œÿÿÿÿÿš/œÿÿÿÿÿ½R¾ÿ!# ÿÿÿ!# ÿ½R¾ÿ!# ÿÿÿ!# ÿ"v« IDATΙaÿΙaÿ2gŸΙaÿΙaÿ2gŸ˜ÿÿ˜ÿÿÿÿÿÿþÏÿþÏÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿaÿ.ÿaÿ.ÿÿþÍÿÿþÍÿÿžÿŸÉÿfÑdÿþÍÿÿþÍÿÿÿÿ/Í/ÍÿþÍÿÿþÍÿÿeÿˆŠ‡ÿÿþÍÿÿÿÿwtFÿÿˆŠ‡ÿÿÿÿ™ÍwvyhigÿÿþÍÿÿþÍÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿhigÿhigÿhigÿÿþÍÿÿþÍÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿhigÿhigÿhigÿÿþÍÿÿþÍÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿše2ÿše2ÿše2ÿÿþÍÿše2ÿf›Î44/f›Îše2ÿše2ÿÿÿêy¸™bêyÿÿÿÿÿÿŠÏ™aŠÿÿÿÿÿÿ긙bêÿÿÿÿ˜ÿÿéi·béi˜ÿÿ˜ÿÿΘaΘaÐÊaÐÊa˜˜™ÿÿÿÿ˜˜™ÿše2ÿΙaÿše2ÿše2ÿše2ÿΙaÿše2ÿše2ÿÿÿ˜ÿÿÿÿÿÿ‰ÿÿÿ‰ÿ‰ÿÿÿþÏÿÿÿÿÿhigÿˆŠ‡ÿhigÿhigÿÿhigÿÿÿeÿaÿ.ÿeÿeÿÿþÍÿÿþÍÿÿþÍÿÿÿþÍÿÿþÍÿÿþÍÿÿÿÿÿþÍÿÿÿÿþÍÿÿÿÿþÍÿš/œÿÿþÍÿš/œÿÿþÍÿÿÿÿþÍÿÿÿhigÿÿþÍÿÿÿþÍÿˆŠ‡ÿÿhigÿhigÿÿeÿˆŠ‡ÿÿþÍÿhigÿhigÿˆŠ‡ÿše2ÿΙaÿše2ÿše2ÿhigÿÿÿÿhigÿhigÿše2ÿÿÿše2ÿše2ÿhigÿþÏÿhigÿhigÿše2ÿΙaÿše2ÿše2ÿše2ÿˆŠ‡ÿše2ÿše2ÿše2ÿše2ÿše2ÿše2ÿΙaÿΙaÿΙaÿše2ÿÿÿÿÿÿÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿše2ÿÿÿÿÿÿÿÿÿΙaÿΙaÿΙaÿše2ÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿše2ÿÿÿÿÿÿÿÿÿΙaÿΙaÿΙaÿΙaÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿΙaÿΙaÿÿþÍÿše2ÿΙaÿΙaÿΙaÿše2ÿΙaÿΙaÿÿþÍÿše2ÿΙaÿΙaÿΙaÿše2ÿΙaÿΙaÿhigÿÿÿÿÿhigÿhigÿÿ¥…ÿÿ¥ÿÿ¥…ÿÿ¥ÿÿþÏÿÿÿÿÿþÏÿÿÿÿ!# ÿÿó ÿ!# ÿÿÿ!# ÿÿó ÿ!# ÿÿÿÿc¨ÿÿ§ÿÿc¨ÿÿ§ÿÿ˜ÿÿÿÿÿÿ˜ÿÿÿÿÿ!# ÿ½ÿÿ!# ÿ$ÿÿ!# ÿ½ÿÿ!# ÿ$ÿÿÿ;¦ÿÿAÿÿ;¦ÿÿAÿÿaÿ.ÿÿeÿÿaÿ.ÿÿeÿ!# ÿ‡ÿSÿ!# ÿ'ˆÿ!# ÿ‡ÿSÿ!# ÿ'ˆÿÿ¥ÿÿdbÿÿ¥ÿÿdbÿÿÿÿÿš/œÿÿÿÿÿš/œÿ!# ÿÿÿ!# ÿ½R¾ÿ!# ÿÿÿ!# ÿ½R¾ÿΙaÿ44/ÌÌÑΙaÿΙaÿ44/ÌÌÑΙaÿ˜ÿÿ˜ÿh˜ÿÿÿÿvþŠÿÿþÏÿÿÏ1þÏÿˆŠ‡ÿ ! àßàˆŠ‡ÿhigÿhhg˜˜™higÿaÿ.ÿaš.ŸfÒaÿ.ÿ‰Œºÿ3‰Œºhhghigÿÿ‰Œºÿ3‰ŒºhhghigÿÿˆŠ‡ÿÿˆ‰‡higÿhigÿÿ‰Œºÿ‰Œºiighigÿÿ‰ŒºÿfÒd‰ŒºÎ:ËhigÿÿÿþÍÿ3iigikšiig˜˜™3ÿý͉Œºxwyÿ ! —•f›wtFg3 ! —•fwtFše2ÿf›Îše2ÿÌÌÑše2ÿ44/44/Ιaÿše2ÿhhghhghhg˜˜™˜˜™ÿše2ÿf›Îšd2še2ÿšd2f›ÎfœÎÿ˜˜™higÿjšghigÿ–f™–f™þÏÿhigÿÎ5še2ÿÌÌÑše2ÿ44/44/Ιaÿše2ÿf›Îše2ÿÛ«še2ÿî%Uî%UˆŠ‡ÿf›Î44/ÌÌјƒÍ3Ï™aÌÌÑàßààßààßà2üËàßนbÌÌÑQÑhÌÌÑΙaÿî%UÌÌÑÌÌÑÌÌÑ44/ÌÌÑî%UÌÌÑÌÌÑÌÌÑ44/ÌÌÑhhghhg˜˜™higÿ_#= IDAT2gŸΙaÿ44/Ιaÿ2gŸ2gŸΙaÿ44/Ιaÿ2gŸéh˜ÿÿ˜˜ÿÿéhÿÿvþÿÿ1þÏÿÿÏþÏÿ1xvyˆŠ‡ÿ ! ˆŠ‡ÿxvy˜—™higÿhhghigÿ˜—™ŸÒaÿ.ÿaš.aÿ.ÿŸÒàßàxwy ! ˜˜™hhgàßàxwy ! ˜˜™hhgàßàxwy ! ˜˜™hhgàßàÿÿwvy ! ˜˜™hhgàßàš.œ¥ ! ˜˜™hhgg3˜—™˜ü™—•f‰ŒºxÛyxÛyg3ÿ™ÍxÛyf›Î44/ÌÌј˜™šd2f›Î44/še2ÿÿÿ˜˜™˜˜™˜˜™2Î5Î5Î5ÌÌÑf›Î44/Û«še2ÿf›Îše2ÿÌÌÑÌÌÑ„e3„e3ƒÍ3ƒÍ3›e2›e2ÌÌÑÌÌÑ2üË2üË2üË2üË„e3„e3ÌÌÑÌÌÑQÑhQÑhÎ5ÌÌÑwtFî%Ue™›e™›1el44/wtFî%Ue™›e™›1el44/hhghhg˜˜™Î™aÿΙaÿΙaÿ¥„[|¥[ý¥„[|¥[ýþÎ2ÿÿþÎ2ÿÿÞÐí"0Þûþ"ÞÐí"0Þûþ"b¨žX§Yb¨žX§Y—ÿéiÿÿê—ÿéiÿÿêñšßf!ßß!ÿ!ñšßf!ßß!ÿ!;¥Å[ã@À;¥Å[ã@Àaþ.ŸÒdœaþ.ŸÒdœfÜ3š$Íeüú›fÜ3š$Íeüú›¥[ýdbœâž¥[ýdbœâžÿÿš.œfÒdÿÿš.œfÒdÞûþ"œ/ždÑbÞûþ"œ/ždÑbΙaÿÌÌÑf›ÎÌÌÑÌÌÑΙaÿΙaÿÌÌÑf›ÎÌÌÑÌÌÑΙaÿ˜ÿÿÿhêyÿhÿh˜ÿÿÿÿŠwþŠŠÿÿþÏÿ1Š11þÏÿˆŠ‡ÿàßà˜˜™àßààßàˆŠ‡ÿhigÿ˜˜™˜˜™˜˜™higÿaÿ.ÿŸfÒ›xŸfÒŸfÒaÿ.ÿhigÿ˜˜™ˆ‰‡xwyhigÿ˜˜™ˆ‰‡xwyhigÿ˜˜™ˆ‰‡xwyhigÿ˜˜™‰Š‡xwyhigÿ˜˜™fÒdî[ëxwyˆ%‡ÿ™ÍÿwtFÿ™ÍhhgÿþÍÿœ3ÿýÍÿÿ™ÍÿþÍÿ›3ÿþÍÿše2ÿf›Îše2ÿÌÌÑÌÌÑ2üË2üËšd2šd2še2ÿf›Îše2ÿÌÌÑše2ÿÿ2Î5ÌÌÑše2ÿf›Îše2ÿÌÌÑÛ«44/še2ÿ44/f›Î}3Í„e3}3Íf›Î44/›e244/f›ÎÎ52üËî%Uf›Îàßà44/„e344/f›Î2Æ5ƒ—2Æ52Æ52Æ5f›ÎÏ›”wtFÏ›”2gŸÏ›”wtFÏ›”2gŸf0ú˜˜™f0úΙaÿše2ÿÌÌÑΙaÿ2gŸše2ÿ44/2gŸ2gŸše2ÿ44/2gŸéh‡˜éh‰ÿvþ1vþÿÏ1xvyhhg ! xvy˜—™hhg˜—™ŸÒeˆaš.ŸÒhhgàßàhhghhgàßàhhghhgàßàhhghhgàßàhhghhgàßàhhgxvyÿeÿ33ÿýÍ33˜—™‰Œº33344/še2ÿ44/f›ÎfœÎ2üËfœÎf›Îf›Îše2ÿfœÎf›ÎÿþÎþÎÿf0úf0úf›Îî%Uše2ÿî%Uf›Î2gŸf›Î44/f›Î2gŸéhf›Î}3Íf›Îéh2gŸf›Î44/f›Î2gŸ˜—™f›ÎÎ5f›Î˜—™2gŸf›Î44/f›Î2gŸ2gŸfÑdfÑd2gŸ2gŸ3›ge32gŸ2gŸ3›ge32gŸ2gŸ˜˜™hhg2hŸÎ™aÿ1gŸe›Îe›ÎÌÌÑ1gŸÌÌÑΙaÿ[|¥[ý¥„[|¥[ý¥„2ÿÿþÎ2ÿÿþÎ"0Þûþ"ÞÐí"0Þûþ"ÞÐížX§Yb¨žX§Yb¨éiÿÿê—ÿéiÿÿê—ÿf!ßß!ÿ!ñšßf!ßß!ÿ!ñšßÅ[ã@À;¥Å[ã@À;¥ŸÒdœaþ.ŸÒdœaþ.š$Íeüú›fÜ3š$Íeüú›fÜ3[ýdbœâž¥[ýdbœâž¥š.œfÒdÿÿš.œfÒdÿÿ"œ/ždÑbÞûþ"œ/ždÑbÞûþΙaÿ2gŸ44/44/44/44/2gŸΙaÿΙaÿ2gŸ44/44/44/44/2gŸΙaÿ˜ÿÿéh˜˜˜˜éh˜ÿÿÿÿvþvþvþvþÿÿþÏÿ1ÿÏúAö IDATÿÏÿÏÿÏ1þÏÿˆŠ‡ÿxvy ! ! ! ! xvyˆŠ‡ÿhigÿ˜—™hhghhghhghhg˜—™higÿaÿ.ÿŸÒaš.aš.aš.aš.ŸÒaÿ.ÿ˜˜™hhg˜˜™˜˜™hhg˜˜™˜˜™hhg˜˜™˜˜™hhg˜˜™˜˜™hhg˜˜™ÿ™Í‰ŒºwtFˆŠ‡ÿ33ˆŠ‡ÿ2gŸ44/44/f›Îf›ÎΙaÿ2gŸÿfœÎfœÎf›Îf›ÎÿÿfœÎf›Îf›Îÿÿÿ1þÎþÎÿÿþÏÿ12gŸf0úf0ú˜—™˜—™Ιaÿ2gŸxvyî%Uî%Uf›ÎˆŠ‡ÿxvyΙaÿf›ÎΙaÿ˜ÿÿf›Î˜ÿÿΙaÿf›ÎΙaÿhigÿf›ÎˆŠ‡ÿΙaÿf›ÎΙaÿΙaÿ4jÅfÑd4jÅΙaÿše2ÿ3Ιaÿše2ÿ3Ιaÿf0úΘaÿ˜—™f0úΘahhg1gŸŠŠŠe›Îe›Î1gŸÿÿÿÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿÿÿÿÿ‰ÿÿÿΙaÿΙaÿše2ÿΙaÿÿÿ‰ÿÿÿÿÿhigÿhigÿÿhigÿÿÿÿÿþÏÿþÏÿÿÿaÿ.ÿeÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿÿÿÿÿÿÿÿÿÿÿΙaÿΙaÿΙaÿÿþÍÿÿþÍÿÿþÍÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿ‰ÿÿÿÿÿ‰ÿÿÿhigÿhigÿhigÿše2ÿΙaÿΙaÿše2ÿΙaÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿþÏÿþÏÿþÏÿΙaÿΙaÿΙaÿÿÿ‰ÿÿÿÿÿÿÿÿÿÿhigÿhigÿÿhigÿþÏÿÿÿÿÿ‰ÿÿÿeÿeÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿhigÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿeÿaÿ.ÿeÿeÿeÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿΙaÿΙaÿΙaÿÿÿÿÿÿÿÿÿΙaÿÿþÍÿ÷és- IDAThigÿˆŠ‡ÿhigÿˆŠ‡ÿaÿ.ÿeÿeÿaÿ.ÿ‰ÿ‰ÿÿÿ‰ÿÿÿˆŠ‡ÿše2ÿše2ÿΙaÿše2ÿΙaÿÿþÍÿΙaÿΙaÿÿÿ‰ÿ‰ÿÿÿÿÿhigÿÿhigÿ‰ÿ‰ÿþÏÿ‰ÿÿÿeÿaÿ.ÿeÿeÿÿhigÿ‰ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿeÿeÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿÿÿÿÿΙaÿΙaÿΙaÿÿÿÿÿÿΙaÿΙaÿΙaÿΙaÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿeÿeÿaÿ.ÿaÿ.ÿÿÿ‰ÿ‰ÿÿÿÿÿhigÿhigÿhigÿhigÿΙaÿše2ÿše2ÿΙaÿΙaÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿΙaÿΙaÿΙaÿΙaÿhigÿΙaÿΙaÿΙaÿΙaÿ‰ÿ‰ÿÿÿÿÿhigÿÿÿhigÿhigÿÿÿ‰ÿ‰ÿþÏÿþÏÿeÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿhigÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿí†yˆŠ‡ÿxvyeÿˆ%‡xÛy›ÿÿše2ÿf›ÎÿÿΙaÿ06Ÿc0.ŸÒÿþÍÿ3Ιaÿ06Ÿ–›eÿ›ÿÿše2ÿ44/2gŸÿÿhigÿ ! xvyΙaÿ2gŸÿþÍÿ3ˆŠ‡ÿàßà ! xvyeÿaš.ŸfÒaš.žÒŠvþˆŠ‡ÿxvyΙaÿÌÌÑ44/2gŸÿþÍÿ3Ιaÿ2gŸhigÿ˜—™Ιaÿ2gŸ‰ÿvþŠvþiig˜˜™hhg˜—™ÿÿŠvþÿÏ1aÿ.ÿŸÒÿhhg˜—™aÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸfÒaš.ŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒˆŠ‡ÿÿxwyˆŠ‡ÿˆŠ‡ÿše2ÿFÚˆ%‡eÿše2ÿše2ÿï›Ðï›Ðše2ÿΙaÿše2ÿÌÌÑÐÊaÐÒaÿ.ÿÿþÍÿˆŠ‡ÿ‰Œº‰Œº‰ŒºÿþÍÿΙaÿše2ÿÌÌÑÐÊaþjeÿˆŠ‡ÿˆŠ‡ÿˆ%‡eÿÿΙaÿÌÌÑΙaÿÿhigÿhigÿàßààßàˆŠ‡ÿΙaÿ2gŸÿþÍÿ3xvy˜—™xvyàßàˆŠ‡ÿŸfÒŸÒŸfÒ›ŸfÒwþŠÿÿhigÿxvyf›Î2gŸÌÌÑΙaÿÿþÍÿ3Ιaÿ2gŸ=<¡ IDAT˜—™f0úΙaÿ2gŸŠŠwþŠÿ˜—™˜˜™higÿwþŠÿÿaÿ.ÿŸÒÿhhg˜—™aÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒŸÒaÿ.ÿŸÒ›ŸÒŸfÒaÿ.ÿŸÒaÿ.ÿŸÒŸÒaÿ.ÿŸÒŸÒaÿ.ÿŸÒˆŠ‡ÿhigÿhigÿhigÿÿhigÿÿˆŠ‡ÿΙaÿÿÿhigÿÿÿeÿ‰ÿše2ÿše2ÿ‰ÿ‰ÿ‰ÿ‰ÿše2ÿ‰ÿše2ÿše2ÿΙaÿÿÿÿÿÿÿše2ÿÿÿše2ÿΙaÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿÿþÍÿΙaÿ‰ÿ‰ÿÿÿ‰ÿ‰ÿš/œÿÿÿˆŠ‡ÿÿÿˆŠ‡ÿˆŠ‡ÿše2ÿše2ÿše2ÿhigÿΙaÿÿÿÿÿÿÿše2ÿÿÿše2ÿΙaÿhigÿhigÿÿÿÿhigÿÿhigÿΙaÿΙaÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿeÿeÿÿÿÿÿ‰ÿ‰ÿÿÿˆŠ‡ÿˆŠ‡ÿΙaÿΙaÿše2ÿše2ÿΙaÿˆŠ‡ÿˆŠ‡ÿΙaÿΙaÿše2ÿΙaÿše2ÿΙaÿ‰ÿ‰ÿhigÿhigÿÿÿhigÿþÏÿÿÿ‰ÿ‰ÿÿÿaÿ.ÿaÿ.ÿÿÿhigÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿhigÿ˜˜™hhg˜ü™‰›weþ‰›ßie!—›vþŠe0ï›Ðe0e›ÎŠvþ›/œ|ÑcrŠˆàßà ! wvyŠ/š|ÑcrŠˆxÛy‰›ßie!—›ßie——™Švþiig˜˜™hhgf0úÌÌÑ44/1el‰ŒºwtF3ˆŠ‡ÿxvyˆŠ‡ÿxvyeÿaš.ŸÒeÿaš.žÒŠwþÿÿhigÿ˜˜™hhgf0úÌÌÑf›ÎΙaÿ2gŸˆŠ‡ÿàßà ! FÚÌÌÑ44/ÌÌÑ44/»g¡vþ‰ÿvþiig˜˜™ÿhigÿ˜—™ÿÿŠwþÿÿaÿ.ÿŸfÒaš.ŸÒhhg˜˜™aþ.ŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸfÒ›aÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿhigÿhigÿΙaÿΙaÿÿÿ˜ÿÿÿþÍÿÿþÍÿ˜ÿÿÿÿΙaÿΙaÿ˜ÿÿ˜ÿÿÿÿÿÿÿÿeÿeÿÿÿeÿeÿaÿ.ÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿeÿeÿeÿeÿÿÿÿÿÿÿÿÿeÿB&Í IDATeÿeÿhigÿhigÿÿþÍÿÿþÍÿeÿeÿÿþÍÿÿþÍÿþÏÿþÏÿeÿeÿþÏÿþÏÿˆŠ‡ÿˆŠ‡ÿΙaÿše2ÿše2ÿše2ÿÿÿaÿ.ÿŸfÒaš.ŸfÒaš.ŸÒaÿ.ÿŸÒÿþÍÿ3higÿ˜—™higÿ˜—™Ιaÿ2gŸΙaÿ2gŸÿÿÿÿ˜ÿÿéhÿÿxÿþU3˜ÿÿéh‰ÿwþ‰ÿwþše2ÿf›Îše2ÿf›Î˜ÿÿéh˜ÿÿéhÿÿêÿÿêÿÿÿÿaÿ.ÿŸfÒaš.ŸÒhhg˜˜™hhg˜˜™aþ.'‹YxÛyaš.ÐÒc0.ÐÒ/͉ŒºwtFg3aš.ŸfÒaš.ŸÒeÿœÿ‰ÿwþ‰ÿweþœd›ÿêÿÿ˜Jg/µÑêeaš.¶™ÑJg/ŸfÒaš.j9 ! àßà ! àßàù–ÇŸfÒaš.ŸfÒaš.'‹Yàßà ! àßà ! vEyÐÊa1gŸ›e2e›Î›e2djÎ1molÿ’a3ŸÒaš.ŸfÒaš.aÿ.ÿbabÿ.bÿ.eÿhigÿhigÿhigÿhigÿΙaÿΙaÿΙaÿΙaÿÿhigÿhigÿÿÿh˜ÿÿˆ«ÿÿéhÿwþÿÿwþše2ÿÿΙaÿše2ÿše2ÿΙaÿ˜ÿÿhigÿˆŠ‡ÿ˜ÿÿÿÿÿxÿÿÿÿÿÿÿŸÒaš.aš.ŸÒÿ˜˜™hhghhg˜˜™ÿxvyaš.ŸÒ1ÐÒÐÒ1c0.3wtFwtF3ŸÒaš.aš.ŸÒŸfÒ›œÿwþ‰ÿ‰ÿwþ›dd›êÿÿÿÿêJg/ŸÒ˜›ÿaš.ŸÒJg/žÿŸÿ™Íÿ™ÍžÿŸ˜—™àßà ! ! àßà˜—™ŸÒaš.aš.ŸÒŸÒaš.aš.ŸÒxvy ! àßààßà ! xvy2gŸ44/f›Îmolÿ33aÿ.ÿaÿ.ÿeÿeÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿþÍÿhigÿhigÿÿhigÿΙaÿΙaÿše2ÿΙaÿÿhigÿÿÿhigÿÿhigÿÿÿÿhigÿÿhigÿ‰ÿÿhigÿše2ÿ‰ÿΙaÿše2ÿ‰ÿΙaÿΙaÿÿþÍÿÿ˜ÿÿ˜ÿÿhigÿ˜ÿÿþÏÿÿþÍÿše2ÿÿÿxÿÿxÿÿÿΙaÿÿÿše2ÿÿÿÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿÿÿaÿ.ÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿaÿ.ÿaÿ.ÿaÿ.ÿþÏÿþÏÿaÿ.ÿaÿ.ÿþÏÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿeÿaÿ.ÿaÿ.ÿeÿeÿaÿ.ÿeÿeÿeÿeÿaÿ.ÿeÿÿÿÿ‰ÿ‰ÿÿÿÿÿeÿeÿÿÿÿÿÿÿÿÿÿÿ˜ÿÿaÿ.ÿ˜ÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿþÍÿaÿ.ÿaÿ.ÿÿþÍÿaÿ.ÿaÿ.ÿhigÿhigÿhigÿhigÿhigÿhigÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿše2ÿÿÿše2ÿše2ÿÿÿše2ÿmolÿ‡–r" IDATŸÒaš.aÿ.ÿaÿ.ÿaÿ.ÿ3ÿþÍÿ˜—™higÿhhghigÿ˜—™2gŸΙaÿ44/Ιaÿ2gŸhhghigÿ˜˜™ÿhhg˜˜™ ! ÿÿ ! ˜˜™wþÿ˜˜™fœÎe02gŸše2ÿe0še2ÿ2gŸΙaÿ2hŸ3ÿýÍÿéh˜ÿÿQÑh˜ÿÿéhþÏÿœ–23e™›še2ÿêÿÿÿx‡êΙaÿÌÌÑe›Îše2ÿÿÿÿÿc0.ŸfÒeÿœaš.ŸfÒœdwþwþœœêêJg/¶™Ñ¶™Ñ33Θašd244/“‘”aÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿhigÿhigÿÿÿÿhigÿΙaÿΙaÿše2ÿše2ÿše2ÿΙaÿhigÿhigÿÿÿÿÿÿhigÿÿÿÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿhigÿhigÿhigÿÿše2ÿše2ÿ‰ÿ‰ÿ‰ÿΙaÿΙaÿÿ˜ÿÿhigÿhigÿ˜ÿÿþÏÿše2ÿÿÿxÿÿÿÿÿÿΙaÿše2ÿÿÿÿÿÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿaÿ.ÿþÏÿþÏÿaÿ.ÿaÿ.ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿaÿ.ÿaÿ.ÿeÿeÿeÿÿeÿeÿeÿaÿ.ÿÿeÿÿÿÿÿÿÿÿÿÿÿÿÿaÿ.ÿ˜ÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿhigÿhigÿhigÿhigÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿše2ÿΙaÿΙaÿše2ÿše2ÿše2ÿše2ÿΙaÿmolÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿhigÿhigÿhigÿhigÿhigÿhigÿΙaÿΙaÿΙaÿΙaÿΙaÿΙaÿÿhigÿhigÿÿÿÿhigÿÿÿhigÿÿÿÿÿhigÿÿ‰ÿÿÿÿÿ‰ÿΙaÿše2ÿše2ÿše2ÿše2ÿΙaÿΙaÿÿþÍÿΙaÿÿþÍÿΙaÿ˜ÿÿ˜ÿÿhigÿhigÿ˜ÿÿ˜ÿÿþÏÿÿþÍÿþÏÿÿþÍÿþÏÿÿÿxÿxÿÿxÿÿÿΙaÿÿÿΙaÿÿÿΙaÿÿÿÿÿÿÿaÿ.ÿaÿ.ÿÿÿaÿ.ÿaÿ.ÿþÏÿaÿ.ÿÿþÍÿÿþÍÿaÿ.ÿeÿeÿÿeÿÿÿeÿÿeÿÿÿÿÿÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿhigÿhigÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿΙaÿΙaÿše2ÿše2ÿmolÿmolÿŒ)¯ÿ IDATaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿeÿhigÿhigÿhigÿhigÿΙaÿΙaÿΙaÿΙaÿÿhigÿhigÿhigÿhigÿÿÿˆŠ‡ÿhigÿÿÿhigÿˆŠ‡ÿÿÿÿÿÿΙaÿše2ÿše2ÿΙaÿΙaÿÿΙaÿÿΙaÿÿΙaÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿþÏÿše2ÿþÏÿše2ÿþÏÿše2ÿþÏÿÿÿxÿxÿÿÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿÿÿÿÿaÿ.ÿaÿ.ÿÿÿaÿ.ÿaÿ.ÿþÏÿaÿ.ÿÿþÍÿÿþÍÿaÿ.ÿeÿeÿÿeÿÿÿÿÿÿÿÿ˜ÿÿaÿ.ÿaÿ.ÿaÿ.ÿhigÿhigÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿˆŠ‡ÿˆŠ‡ÿΙaÿše2ÿše2ÿše2ÿÿÿmolÿmolÿ˜š—ÿmolÿÿÿÿÿÿÿÿÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿÿÿÿÿÿÿÿÿ˜ÿÿÿÿ˜ÿÿÿÿÿÿˆŠ‡ÿÿÿΙaÿΙaÿhigÿhigÿÿÿÿÿÿše2ÿÿÿÿÿÿÿÿÿÿþÍÿÿÿÿÿÿ‰ÿhigÿhigÿhigÿÿÿþÏÿÿÿ˜ÿÿÿþÍÿše2ÿΙaÿí†yÿýÍÿýÍÿÿýÍÿýÍÿÿÿýÍÿýÍÿÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿÿÿÿÿxxÿΘaΘaÿÿþÍÿèfÎéþÎéhêÿþÍÿΙaÿΙaÿˆŠ‡ÿ‰Š‡ˆŠ‡ÿΙaÿΙaÿ2üË2üËšd2hhghhgfœÎÿÿÿÿÿÿþÍÿþÍÿþÍÿÿÿÿwþše2ÿše2ÿ˜˜™˜˜™še2ÿše2ÿše2ÿš/œÿ›/œœ`œš/œÿ˜ÿÿÿþÍÿÿþÍÿèfÎÿþÍÿše2ÿΙaÿΙaÿ44/Ιaÿå2úø IDATÿ3ÿÿ3ÿÿÿýÍ3ÿýÍÿýÍ3ˆŠ‡ÿFÚºñ&FÚºñ&xvyÿþÍÿ‰ŒºÿþÍÿˆŠ‡ÿxvyΙaÿ2gŸˆŠ‡ÿàßàˆŠ‡ÿˆŠ‡ÿxvyhigÿ˜˜™higÿÿÿÿÿˆÿÿÿΘa2hŸÎ˜aΙaÿ2gŸÿþÍÿ‰ŒºÿþÍÿ2gŸΙaÿ2gŸˆŠ‡ÿàßàˆŠ‡ÿΙaÿÌÌÑΙaÿî%UÛ«2üËÎ5šd2|›ÿÿêyÿÿÿþÍÿ‰ŒºÿþÍÿÿÿÿfœÎhhgfœÎhhg2š/œÿfÑÜš/œÿˆŠ‡ÿxvyˆŠ‡ÿxvyÿþÍÿ3ÿþÍÿ33˜ÿÿèfÎ3˜ÿÿéh2gŸše2ÿ44/2gŸše2ÿf›ÎÿþÍÿ3ÿþÍÿ3ÿÿÿÿˆŠ‡ÿxvyˆŠ‡ÿxvyÿÿÿÿÿþÍÿ3ÿþÍÿ3hhgÿýÍÿýÍhhgˆ‰‡3hhg3hhgÿxvyºñ&xwy2hŸFÚ‰Œº‰Œº3xvyxwyxwy2gŸ2gŸ2gŸàßààßàxvyxvyv{v{xwyv{˜˜™˜˜™˜—™ÿÿˆÿxÿÿΙaÿΙaÿˆ‰‡šÐˆ‰‡‰Œº‰Œº32gŸΙaÿΙaÿàßààßàxvyÌÌÑÌÌÑ2gŸxwyÎ5fœÎfœÎ˜˜™fœÎî%Uêyêyê3‰Œº‰Œº33ÿÿ˜˜™˜˜™˜˜™fÑÜfÑÜfÑdˆŠ‡ÿxvyˆŠ‡ÿÿþÍÿ3ÿþÍÿèfÎéhš2èfÎ44/f›ÎÌÌÑ44/ÿþÍÿ3þÏÿÿþÍÿÿÿhigÿÿˆŠ‡ÿxvyÿþÍÿwtFˆŠ‡ÿÿÿÿÿŠÿÿ˜ÿÿ3ÿþÍÿ2ÿþÍÿÿÿÿÿÿÿÿ‰ÿ‰ÿÿÿ‰ÿÿÿÿþÍÿˆŠ‡ÿÿˆŠ‡ÿÿþÍÿÿhigÿÿˆŠ‡ÿΙaÿeÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿhigÿÿˆŠ‡ÿˆŠ‡ÿhigÿše2ÿÿΙaÿΙaÿše2ÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿÿhigÿhigÿÿÿÿÿÿÿxÿÿÿxÿÿhigÿÿΙaÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿΙaÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿΙaÿše2ÿΙaÿΙaÿÿhigÿÿÿÿÿÿˆŠ‡ÿÿÿxÿÿÿÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿÿÿÿÿÿÿÿÿhigÿÿÿš/œÿxÿš/œÿš/œÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿhigÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿÿþÍÿ˜ÿÿše2ÿΙaÿše2ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿþÏÿþÏÿÿþÍÿÿÿÿÿhigÿhigÿÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿ‰ÿ‰ÿþÏÿþÏÿþÏÿÿÿ‰ÿ˜ÿÿÿþÍÿÿþÍÿ˜ÿÿÿþÍÿ˜ÿÿÿÿßš”* IDATÿÿÿÿhigÿÿÿhigÿÿÿhigÿÿÿÿhigÿhigÿÿþÍÿÿhigÿÿÿeÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿhigÿÿÿhigÿˆŠ‡ÿše2ÿÿÿše2ÿΙaÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿÿÿhigÿˆŠ‡ÿÿhigÿhigÿÿÿÿÿÿÿhigÿˆŠ‡ÿˆŠ‡ÿΙaÿˆŠ‡ÿÿþÍÿÿþÍÿΙaÿΙaÿhigÿˆŠ‡ÿˆŠ‡ÿše2ÿΙaÿΙaÿˆŠ‡ÿše2ÿše2ÿše2ÿhigÿÿše2ÿše2ÿxÿÿÿÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿÿÿhigÿÿÿÿÿhigÿše2ÿÿxÿš/œÿš/œÿˆŠ‡ÿhigÿhigÿÿþÍÿˆŠ‡ÿˆŠ‡ÿÿþÍÿ˜ÿÿÿþÍÿÿþÍÿΙaÿše2ÿΙaÿΙaÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿÿÿÿÿÿÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ‰ÿ‰ÿÿÿÿÿþÏÿÿÿÿÿ˜ÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿ˜ÿÿÿþÍÿÿÿÿhigÿhigÿÿÿÿÿÿhigÿÿhigÿeÿÿeÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿhigÿÿÿÿÿše2ÿÿÿÿhigÿˆŠ‡ÿhigÿÿhigÿÿÿÿÿhigÿÿÿÿÿÿÿhigÿˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿΙaÿΙaÿΙaÿhigÿˆŠ‡ÿhigÿše2ÿΙaÿše2ÿše2ÿše2ÿše2ÿhigÿhigÿÿÿÿxÿÿÿxÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿÿÿše2ÿÿÿše2ÿÿÿše2ÿše2ÿxÿš/œÿxÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿΙaÿΙaÿÿþÍÿÿþÍÿÿþÍÿÿÿÿÿþÍÿˆŠ‡ÿˆŠ‡ÿ‰ÿÿÿÿÿÿþÍÿÿþÍÿÿþÍÿÿhigÿhigÿˆŠ‡ÿhigÿÿÿÿÿÿÿÿÿÿÿÿhigÿhigÿeÿeÿˆŠ‡ÿÿÿÿÿhigÿÿÿÿÿÿÿhigÿhigÿÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿΙaÿΙaÿhigÿše2ÿhigÿhigÿÿÿÿÿÿše2ÿxÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿhigÿhigÿxÿˆŠ‡ÿhigÿÿþÍÿˆŠ‡ÿ˜ÿÿÿþÍÿ˜ÿÿÿþÍÿše2ÿΙaÿše2ÿΙaÿÿþÍÿÿþÍÿÿþÍÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿÿ˜ÿÿÿþÍÿÿþÍÿ` C IDATše2ÿf›Îše2ÿf›Îaÿ.ÿŸÒaÿ.ÿŸÒeÿ›eÿ›‰ÿwþ‰ÿwþÿþÍÿ3ÿþÍÿ3þÏÿ1ÿþÍÿ3aÿ.ÿŸÒÿdbAåž¿bD…"X]|š.œeÑd›/œeÏ1"%Sœ/žBÌ`¾4 B¬7 dbœâž¨£„X]|š.œfÒdÿýÍ"%Sœ/ždÑbÞÛÕ ÿLýc\¥"X„X]|ÿx˜‡ç7/Í"%S þxèœgí6 è 675Ê+s6ÕrlOX]|TTSÃC¬=½T«©z"%SVVV›D‰e¼wˆ… 675 àààrlOX]|TTS454ÌËÌ«©z"%SVVV444ÌÌ̈… dbAåž¿bœâžš.œeÑd›/œfÒd!" œ/žBÌ`¾4 dÑbßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàÿLýc\¤ý´ÿx˜‡éhyˆ!" þxèœgd™÷ˆßÞà675Ê+s6ÕÊÉËTTSÃC¬=½T¬¬­!" VVV›D‰e¼wªªªßÞà675 àààÊÉËTTS454ÌË̬¬­!" VVV444ÌÌ̪ªªßÞàWÿNÿá^C¢½²ü©ÿ‰ÿvþÏ™a1gŸŠwþ!" ŒÿRüýõŸl a”®tÿßÞàdbAåžá^C¢½¿bœâžš.œeÑdÏ™a1gŸ›/œfÒd!" œ/žBÌ`õŸl a”¾4 dÑbßÞàdbAfž¿šbœâžš.œd dœ`œfÒd!" œ/žB¡O¾_±dÑbßÞàÿLýc\†ÿ›ze¤ý´ÿx˜‡·bIÿžéhyˆ!" þxèœgâ‹ud™÷ˆßÞà675Ê+sbÞuCDã[Þ¨6ÕÊÉËTTSÃC¬ƒÍ3djÎÉÿ=½T¬¬­!" VVV›D‰«ÍTBiºÊòe¼wªªªßÝàše2ÿf›Îše2ÿ44/šÿ44/šÿf›Îaÿ.ÿŸÒaÿ.ÿ9fÿ.ÿ9fÿ.ÿ9ff›Îše2ÿf›ÎÿÿÿÿÿþÍÿ3ÿþÍÿ3ÿÿÿÿeÿeÿ›ÿþÍÿ3ÿþÍÿ3ÿÿÿÿ‰ÿ‰ÿwþˆŠ‡ÿxvy‰ŒºÿþÍÿ3þÏÿþÏÿ1þÏÿ1ÿþÍÿÿþÍÿ3ÿþÍÿ3eÿŸfÒaÿ.ÿŸÒaÿ.ÿŸÒdbAåž¿bD…"X¿$š.œeÑd›/œeÏ1š2¦/žBÌ`¾4 B¬7¿ dbœâž¨£„X¿$š.œfÒdÿýÍš2 œ/ždÑbÞÛÕ¿ ÿLýc\¤¢…´„®´Ñÿx˜‡éhyþψ/͉Œº þxèœgd™ÕÒu 謯µ675Ê+s6ÕrlO®´ÑTTSÃC¬=½T«©z‰ŒºVVV›D‰e¼wˆ…¬¯µ675 àààrlOX¿$TTS454ÌËÌ«©zš2`VV444ÌÌ̈…¿ dbAåž¿bAåžb6:eÑd›/œeÑd/œ##"BÌ`¾4 BÌ`œ4 CÞBdbœâždbœâžš.œfÒdš.œfÒdœ/ždÑbœ/ždÑb¥„´´^{L¢…´…YJˆˆ1xþψÏ$íuu+.‹ÕÒuÒ7E5Ê+s6ÕÊ+s6ÃC¬=½TÃC¬TT#$#›D‰e¼w›D‰e¿¿¿ ààà 454ÌËÌ454#$#444ÌÌÌ444à‡‹/bB½ßÚ$½=$!&N¢½ü2E™_›ÌÑ4›e244/vgŸÿ$ÿG›i¾ÍÉ7¾l5737Ra”·b"Cá½ß$½=$!&A¢žb6:4jÅ›Ì24›e244/egd/œ##"7k̾Í57¾l5737Ba`œ4 CÞB¥„áÝá"Cá#½šbœâžþÎÐÊÅ4jÅ06Ÿ`œfÒdÞÐíõÊÌ7kÌ 6ƒœ_±dÑbÿLƒb÷ÜÞu!&bÞu$!&zceý,ΙéÌÌ34/ƒÍ344/I˜žéh þ ÊœòÉÍT37«ÍT737œud67Ê+s6ÕCMã½¼6÷Ê+s6ÃC¬=½TdzΜ–2=ðTÃC¬TT#$#›D‰e¼wBzº¾—Feïw›D‰e‰‡Š44/še2ÿše2ÿ44/1el44/1el44/ˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿ˜ÿÿ˜ÿÿΙaÿΙaÿaÿ.ÿaÿ.ÿše2ÿše2ÿaÿ.ÿaÿ.ÿxÿxÿÿÿ‰ÿ‰ÿþÏÿþÏÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿ9faÿ.ÿaÿ.ÿ9f44/9f44/9ff›Îf›Îf›ÎhhgŠ››š2hhgwþwþwtFxvyÿþÍÿˆŠ‡ÿ3ΙaÿΙaÿΙaÿΙaÿΙaÿΙaÿΙaÿΙaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ11þÏÿ1þÏÿ33ÿþÍÿ3ÿþÍÿ››ŸfÒeÿŸÒaÿ.ÿþ"»D…"X¿$d¼º6–eÏ1š2ƒ—8•B¬7¿ «•¿b@¨£„X¿$žXšd2ÿýÍš2éiœg3ÞÛÕ¿ f!_AÑ¢…´„®´ÑO-«šeºþψ/͉ŒºvEy“i»ÕÒu 謯µTFc, èrlO®´ÑàààFß«©z‰ŒºÌËÌF݈…¬¯µÌÌÌ, èrlOX¿$6ÕFß«©zš2=½TF݈…¿ e¼wÒÓ±TUò9óò9ó±TUÒÓº&·‰Š‡î[ëî[뉊‡º&·º'¸¬Œî[ìî[쬌º'¸b¨D…"¨£„¨£„D…"b¨—ÿeÏ1ÿýÍÿýÍeÏ1—ÿñšßB¬7ÞÛÕÞÛÕB¬7ñšß‘³5±ÓU±ÓU¢…´¢…´±ÓU±ÓU‘³5V†SŠ»‡Š»‡þψþÏˆŠ»‡Š»‡V†Sx†i¬º¬ºÕÒuÕÒu¬º¬ºx†i!ÈÌ¥"XoMËoMË¥"X!ÈÌ5«¯ç7ªz­ªz­ç75«¯6©«í6ˆz—ˆz—í66©«ÍÈÇ .ç-.ç-Ç ÍȬ«%¥FÚIFÚI¥¬«%³¨"¥FÙHFÙH¥³¨"¢½Ô÷"BAÔ÷Ñž¾1gŸºð!1elºð!»g¡ a”ºï# Akºï#¹e—¢½Ô÷"BAÔ÷Þ½1Cz¹ IDATgŸºð!1elºð!Ì–; a”ºï# Akºï#É•4¿šb°Öò„°Öò[|œ`œ†¼ò/͆¼ò2¾_±ƒ¼ì 胼ì"0¢´#½Fcg"BAFcg#½¥¡Xÿˆ06Ÿe™›1ele™›06ŸèhÕý† 6ƒBt¢ AkBt¢ 6ƒía±ÓUFcgŠ»‡e™›¬ºBt¢1el”ÌÌÑÏ›”ºñ&ºŒºwtlˆñ&ÿxvyxvyše2ÿÛ«ˆŠ‡ÿwtF33eÿg3ÿþÍÿš2éhéhÿÿÿh˜ÿÿ·b2gŸ2gŸše2ÿÌÌÑΙaÿ“fÍŸÒŸÒeÿŸfÒaÿ.ÿ9ff›Îf›ÎΙaÿšÿÇšüŸÒŸÒþÏÿÐÒÿ.ÿŸJˆˆÿˆÿxÿˆÿÿhigÿ˜˜™ÿ‰ÿwþwþ‰ÿ/š‰ÑfÿuÏþ11þÏÿ1þÏÿŠ»‡xvyxvyÿþÍÿÿàßà˜—™˜—™ÿ˜˜™higÿ40úfÑÌÌÑdjÎÎa›Î‰ÿwþše2ÿÎ5˜—™higÿ˜˜™ÿÿÿýÍ3ÿþÍÿ3ÿþÍÿ3þÿÿÿÿ›aÿ.ÿŸfÒ›˜ÿÿéh˜ÿÿÿþÍÿikš˜—™higÿ˜—™ÿÿwþÿÿŠwþ3higÿ ! ‰ŒºÿþÍÿ‰Œº3Ιaÿ2gŸΙaÿ2gŸ2gŸΙaÿ2gŸΙaÿ2gŸêÿÿêÿÿêÿÿÿÿÿÿÿÿÿ1þÏÿ1þÏÿþÏÿ13ÿþÍÿ3ÿþÍÿÿþÍÿ3›eÿ›eÿaÿ.ÿŸÒ¥…ÿÃAåž „X¿$¥¡X¿bdjΛeÑdþÍš2èh›/œBiº”BÌ`à׿ ía¾4 CD㿚dbD…"X¿$d¼ºœdjΜʚ.œeÏ1š2ƒ—fBiº¾Èkœ/žB¬7¿ «•¿d$!&ýc\¥"X„®´ÑO-«^{LË™ÿ˜‡ç7/͉ŒºvEy1xô½èœgí6 謯µTFc+.‹\A«Ê+s¨AÜ®´Ñª S644/ÿÃC¬èfΉŒºx=T737›D‰íAö¬¯µgUeÌCÃã±T8 RL/X¿$Võ­àe›Î‰ŠU454wtFš2qòˆÌB”ˬW444TQK¿ ™ð«Ì ààà ÒÓ ààà 222ÌËÌ454º&·44ÌËÌ454###ÌÌÌ444º'¸44ÌÌÌ444¨÷Ú¨£„¨AÜWZÎÿýÍèfÎ(ÞÛÕíAöW ±ÓU 222Š»‡454###¬º444.ÿ[Þ¨¥¡XoË[_¨¥XZüÿÉÿèhªÏ­1˜ÿèüýÊòíaˆÕ—+Ÿáíü¢´±9UÇ .ç-ò9ó¢å´Zü´‰[‡¥FÚIî[ëÿшý¬[Œ¥FÙHî[ìÕ̆XNÿvþRüýAåžeÑdBÌ`dbš.œœ/ž^üL¢´ý|„ýá|[_¨¤xÿ1ˆÿÏ3/ÍÿÑ31˜ÿhy+zÕ+†Õ èõ+Ÿád™Ê+s õ­Ê+sÃC¬4òˆÃC¬›D‰4ð«›D‰Ï›”ºñ&î%U1el1el‰Œºxvyše2ÿše2ÿˆŠ‡ÿˆŠ‡ÿÛ«3eÿeÿÿþÍÿÿþÍÿg3éhÿÿÿÿ˜ÿÿ˜ÿÿÿh2gŸše2ÿše2ÿΙaÿΙaÿÌÌÑŸÒeÿeÿaÿ.ÿaÿ.ÿŸfÒf›ÎΙaÿΙaÿše2ÿše2ÿ44/ŸÒþÏÿþÏÿaÿ.ÿaÿ.ÿÐÒˆÿÿxÿxÿˆÿhigÿhigÿÿÿhhgwþš/œÿš/œÿ‰ÿÿÿïÑf/š1ÿÿÿÿþÏÿÿþÍÿÿÏ1xvyÿþÍÿ˜ÿÿÿÿˆŠ‡ÿbawvy˜—™ÿÿhigÿhigÿ˜˜™ÌÌÑdjÎdjÎ44/44/06Ÿwþwþf›Îf›Î˜—™˜—™ÿÿ33‰Œº33ŠŠeÿeÿaÿ.ÿŸfÒeÿeÿeÿéhéhèfÎ33˜—™˜—™˜˜™ÿÿ‰ÿ‰ÿÿÿЉÿ‰ÿ‰ÿhigÿ ! wtFwtFwtFˆŠ‡ÿ2gŸÿÿÿÿ2gŸ2gŸΙaÿ2gŸêÿÿêÿÿÿÿÿÿÿÿ1þÏÿ1þÏÿ3ÿþÍÿ3ÿþÍÿ›eÿ›ŸfÒaÿ.ÿ½¼¿b „X¿$d¼ºœ–2ÿÏ›/œþÍš2ƒ—¾—FÕï¾4 à׿ «•¿½¼AfžœâžD…"X¿$žXœ–2d dfÒdeÏ1š2éi¾—FB¡OdÑbB¬7¿ f!ÜßÚ†ÿ›¥"X„®´ÑO-«[Þ¨ÌÌÑ·bç7/͉ŒºvEyÉÿÉÍÉâ‹í6 謯µTFcÊòÜßÚ†ÿ›6Õ¨AÜ®´ÑàààÌÌÑ·b=½TèfΉŒºÌËÌÉÍÉâ‹e¼wíAö¬¯µÌÌ̽=0 îàààRL/X¿$6Õ›e2FÚÌËÌwtFš2=½T¾l5IàÌÌÌTQK¿ e¼woÌËààà àààoÌË««­ÌËÌ454454ÌËÌ««­ˆ¥¨ÌÌÌ444444ÌÌ̈¥¨¼{ÞX¿$X¿$¼{Þ›1Ïš2š2›1ϾTÉ¿ ¿ ¾TÉO-«O-«vEyvEyTFcTFc½=½=ÿÏ›e211›e2ÿÏÕï¾l5++¾l5ÕïŸáêAfžAfžŸáêÿÏfÑÜd dd dfÑÜÿÏÕïmÏÚB¡OB¡OmÏÚÕï²üŠ®¿b›/œ¾4 œâžfÒddÑb6Õ6Õ=½T=½Te¼we¼wºñ&wtFwtFÏ›”e2ÿî%Uî%Uxvyeÿÿ™Íÿ™Í3ÿÿ˜˜éhše2ÿ44/44/2gŸeÿaš.aš.ŸÒΙaÿÌÌÑÌÌÑf›ÎþÏÿc0.c0.ŸÒÿÿxÿxˆhigÿ˜˜™˜˜™ÿš/œÿïÑfvþvþŠfÑdÿÿÿÏ/Í/ÍÿÑ3ÿþÍÿqòˆŠŸfÒ'%ºxÿhhghhg˜—™djÎÿÐÊaÐÊaÌÌÑšeÿf›Îÿÿÿÿÿhhg˜˜™ÿÿÿþÍÿ‰ŒºwtFÿþÍÿ3‰ÿvþvÿ›šÿ›ÿþÍÿš2èfΚ2ÿþÍÿš2éhÿˆ‰‡àßàhhg˜˜™ÿhhg˜—™wþvÿwþhÿ‰ŒºwtFeÿ›2gŸêÿþÏÿ1þÏÿ11ÿþÍÿ3ÿþÍÿ33eÿ›eÿ››ÞE½¼»CfžX¿¨¥¡X¿bÊjœ–d dšÿèh›/œÈk¾B¡O¿òía¾4 žÀ㥄ãX¿$d¼ºœfœÎ2þÎΚ2ƒ—fd™ÍœFÞк¿ «•¿d¡¿/_ÑCÐÓÑO-«^{Lcf›Fšºaº»ºvEy1x˜m—E“i»7}·ðµTFc+.‹œÔ÷ßÚoÌã®´ àààºð!ÌÑ««Î‰54ÌË̺ï#ÍɈ¥Ë¬44ÌÌÌÔ÷ßÚnX½$6Õºð!ÌÑ ªü™2=½Tºï#ÍɆ¾ e¼wààà ààà ÌËàààþýþ454ÌËÌ454«­ÌËÌïïïT444ÌÌÌ444¥¨ÌÌÌ1+¨AÜX¿$¨Aܼ¼èfΚ2èfΛ—íAö¿ íAö¾•õ¿ä…õ{ä"ï›ÐÿÏï1Ð3ð˜ÎÕïð/Λ„ÓÑ–!„/I»ºc0./Í(µˆ F è ç454454Ú444444Ùf_M IDATí†yFÚ›g«44/1elÏ›”1elÌÌef›ÎÎˆŠ‡ÿxvyˆŠ‡ÿxÛy››3ÿþÍÿ3ÿþÍÿêh˜ÿÿéh˜ÿÿÍ3f›Î›ÎΙaÿ2gŸΙaÿ2ÌŸ›Ÿ›Òaÿ.ÿŸÒaÿ.ÿš2gŸše2ÿf›Îše2ÿÎ1Òaÿ.ÿŸÒaÿ.ÿŸÒÿˆxÿˆxÿ™ÿÿÿfÑdwÿÿþÿÿ13ÿþÍÿ3þÏÿ3eÿ›xyˆŠ‡ÿxwyÿ˜—™higÿ˜—™higÿ™œ–2Ñ44/ÌÌÑ44/2gŸÿÿÿÿÿÿÿÿÿýÍ3higÿ‰ŒºwtF3ÿþÍÿ3þ‰ÿŠwþÿÿeÿaš.ŸfÒeÿ›˜ÿÿÿÿ2èfΚ2éhÿþÍÿikš˜—™ÿ˜˜™hhg˜—™ÿÿ‰ÿþvþЉÿwþàßà ! ‰ŒºwtF›þÏÿ1þÏÿ1ÿþÿÿþÍÿ3ÿþÍÿ3eÿaÿ.ÿŸÒeÿaš.ŸÒd4ÿCDã½¼¥DX¿bdjΜ–2çj›/œBiº¾—Fíi¾4±CDã½¼¥DX[âdjΜ–2çjiBiº¾—Fíi"f$!&ÜßÚ0!&^{L44/ÌÌÑF41x737ÉÍÉI3+.‹$!&½0 îà44/›FÚÌ737¾lIàÌ$!&›ÚK!›°44/fÑm4b†737‹Éâ3‹ƒ.ç-Ëààà ààà.ç-6÷:­ÌËÌ454ÌËÌFÚI#ý"¨ÌÌÌ444ÌÌÌTFÙHCˆBdb¨AÜX]|X]|š.œèfÎ3!" œ/žíAö"%+„bà[Þ¨6à ààà[©¥„«YE«Éÿ=ËT454ÌËÌ1§.Ïžy$ ÊòeÌw444ÌÌ̧§D­Ÿc7‹5+‘³5¯ÐC1V†S#$#D+x†i¿¿± Å[Хޔ±¬±Ï454µÑyUW†#$#444y%¬*™x{wtF›g«f›Îšÿ1eÌÌÑ1eî%UÎÿ™Í›3˜h44/›Îaš.Ÿ›ÒÌÌÑc0.Òÿxˆ˜˜™ïÑfŠþŠuÏþ1ÿÑ3‰Œºˆ%‡xyhhg˜—™ÐÊaÑÇšü9fÿÿÿÿÿÿ˜—™higÿ˜—™ÿ3˜—™higÿ‰Œºxvy3wþ‰ÿwþeÿ›Ÿ›Òaÿ.ÿaš.ŸÒeÿéhêhÿÿ2éh3xvyˆŠ‡ÿˆ‰‡xvyÿ‰ÿwþwÿÿvþ‰ÿw—™higÿàßà ! ‰Œºxvy1þÏÿþÏÿ13ÿþÍÿÿþÍÿ3›ŸÒÿeÿaš.ŸÒAfž½¼CÃã½Cfž½¼åd dœ–2e›Î›2d dœ–2ÑB¡O¾—FB”˾FB¡O¾—FÌ¥„½¼ÞE½¼»¥„ã½¼ÞþΜ–2Êjœ–þÎΜ–2ÊÞÐí¾—FÈk¾Þк¾—Fȃb÷ÜßÚž"‹bÞuƒb&ÜßÚž\ΙéÌÌÑ}3̓Ì3Ι/ÌÌÑ}‡ÊœòÉÍÉU3¬«ÍTÊœ7ÉÍÉUgP*ÜßÚž"‹bÞuP*&ÜßÚÊzDÌÌÑ}3̓Ì3zD/ÌÌÑÃ}DÉÍÉU3¬«ÍT}D7ÉÍÉ›P*ÜßÚô8ÜßÈoÌã½=ô zDÌÌÑî%UÌÌ«««Î›e2î4}DÉÍÉî#WÉÍ©ˆ¥Ë¾l5î4oÌËÌË««­«­ˆ¥¨¥¨T¼{Þ›1ϾTÉ^{LcoMËË-[+¨^{¤[{,˜ªz­­EÉÿ1y*! œˆz—TFÊò+.™ ©c§©Ž˜ýŽe›ÞeSX ® ˆŠˆŒ«oÌËOoÌË««­©z««­ˆ¥¨…ˆ¥¨O¬«L/O¬«wvytFwvyTqtQKTqt.ç-.ç-.-FÚIFÚIF.IFÙHFÙHF/H[_¨¥X [_¨˜ÿè1þ1˜ÿŸáí+à+ŸáÊ+sÊRÜÊ+sÃC¬ÃwÎÃC¬›D‰›Tö›D‰˜ÿÿéhÿÿhigÿ˜—™ÿÿše2ÿ44/2gŸš/œÿfÑdš/œÿfÑdš/œÿfÑdš/œÿfÑdš/œÿfÑdš/œÿfÑdaÿ.ÿŸÒaÿ.ÿŸÒÿÿÿÿhigÿ˜—™higÿ˜—™ÿþÍÿ3ÿþÍÿ3þÏÿ1þÏÿ1Ιaÿ2gŸΙaÿ2gŸÿb@FcgX]|šd2e™›3!" œg3Bt¢"%+ßÞਣ„X]|ÿýÍ3!" ÞÛÕ"%+ßÞà675rlOŽ”±ÊÉËTTS«©zUW†¬¬­!" VVVˆ…x{ªªªßÞà675nèû’ÊÉËTTS ªÛóV%¬¬­!" VVV†Ýðz#ªªªßÞ‡¨£ÝX¿$¨AÜX]#ÿXéþΚ2èfÎ2ê$ÿÚö¿ íAö& ÜMý[¨£ÝX]#ÿ¥ý,‡éþÎ2êy*! ÖgÿÚö& *ý™-ßiNÿ²ü2vþŠ$"Rüý®Sßßb@žÀãšd2fœÎ!" œg3d™ÍßÞàdbAfž¿šbAfž¿šbAfž¿šbœâžš.œd dœ`œd dœ`œd dœ`œ‡ô„œ/žB¡O¾_±B¡O¾_±B¡O¾_±C¯B!" 6Ýá©ÿWÿ2wþ‰ÿ$"tÿŒÿSßßWÿQ¤ƒ¯\}©ÿ‰ÿvþËŠ5wþ!" ŒÿRÜÔ®$,tÿ6Ýá Aõ¿ä/bBÑž¾2e0ï›ÐE™_»g¡$"h2ð˜ÎG›i¹e—SÞß¹ÃB IDATÿÿÿh˜ÿÿéh˜ÿÿéh‰ÿŠÿþÿÿÿÿÿhigÿ˜—™higÿ˜—™Ιaÿ2gŸ›Îše2ÿf›Îš/œÿfÑdÿÿbÐ’ÿÿÑdš/œÿfÑdš/œÿfÑdÿÿbÐ’ÿÿÑdš/œÿfÑd˜ÿÿéhÿþÍÿ3aÿ.ÿŸÒhigÿ˜—™ÿÿaÿ.ÿš/œÿ}icéhÿˆŠ‡ÿàßàþÏÿÿþÍÿÿÑ3ΙaÿÌÌÑÿþÍÿ3ˆŠ‡ÿwtF‰Œºxvyÿÿêÿÿ˜ÿhêeÿ›eÿaš.ŸfÒ›ÿþÍÿ3ÿþÍÿÿÑ3/Í3‰ÿwþ‰ÿvþŠwþþÏÿ1þÏÿ/ÍÿÑ32b@žÀãFcb@žÀãšd2fœÎe™šd2fœÎœg3d™ÍÞtœg3d™Í¨£„X¿$¨£„X]|ÿýÍš2ÿýÍ3ÞÛÕ¿ íÛÕ"%+675rlOX]|¨£„X]|675ÊÉËTTS«©z3ÿýÍ3TTS¬¬­VVVˆ…"%+ÞÛÕ"%+VVVªªª675nènè6’5ÊÉËTTS ªÛ ªÛTVS¬¬­VVV†Ý†ÝVVªªª¨£ÝX¿$X]#ÿXž#b¨AÜWZΚ22h2˜èfÎ(¿ &  ™íAöý[¨£Ý[\Ȩ¤X][ÿ¥‡éþΫÿþ‡êyÖgÿÚö+#£ÿÝ]&g*ý™©ÿß45!ÈÌNÿ²üwþËTS5«¯vþŠtÿÊ[X6©«Rüý®ô8ààà RL/º™î%UÌËÌ454wtF›geî#WÌÌÌ444TQK¾Œ^AfžAfžd dd dB¡OB¡O675 ª©«TTS454xwyVVV444vvv©ÿVWUÿ¨­wþˆ‰‡ÿ˜štÿŠŠŠþTVWÿQ¤ƒQ¤ƒX]|Wÿ©ÿ‰ÿvþËvþË3‰ÿwþŒÿRÜÔRÜÔ"%+Œÿtÿõ¿ä AÑž¾ï›Ðe0»g¡ð˜Îh2¹e—êhÿÿÿÿéh˜ÿÿéhwþÿ‰ÿþÿÿihigÿ˜˜™˜˜™ÿ˜—™higÿ˜—™2gŸΙaÿÌÌÑf›Îf›Îše2ÿf›ÎfÑdš/œÿÑdaÿfÑdš/œÿÑdaÿéh˜ÿÿéh3ÿþÍÿ3ŸÒaÿ.ÿŸÒ˜—™higÿ˜—™ÿÿaÿ.ÿŸÒaÿ.ÿŸÒfÑdš/œÿéh˜ÿÿéiÿÿ˜éiÿýÍ3ˆ‰‡wtF3aþ.ŸÒdaš.ŸÒþÎ2ÿýÍÿÑ32ÿÿÿÿÿˆŠ‡ÿxvyˆŠ‡ÿàßà˜—™þÏÿ13ÿþÍÿ3ÿþÍÿ3ÿþÍÿÿÑ31Ιaÿ2gŸΙaÿhigÿ˜˜™hhg˜˜™ÿý͉ŒºxvyxvyþÏÿc0.¶™Ñéiš.œïÑfvþÿýÍ3þÎ/Í3ÿÿ˜h˜éhheÿaš.Ÿ›Òaš.ŸÒŸ›ÒÿþÍÿÿÑ3ÿÑ313ÿÿ‰ÿvþ‰ÿvþwvþwþþÏÿ/Í3/Í33ÿ¨£„X¿$žÿX$¨£„X]|ÿýÍš2ÿh2ÿýÍ3ÞÛÕ¿ îg™ íÛÕ"%+¨£„ÿýÍÞÛÕnènè[ ªÛ ªÛ†Ý†ÝªX]#b@uC„ãX]§n\2„e3dÏÎÿê$½fTBϺ&ò QlOý`|454v©z3444R… )¿šbœ`œ¾_±ª©«VWUª©«675 xwyˆ‰‡xwyTTS454vvvŠŠŠvvvVVV444¨£„®´Ñÿý͉ŒºÞÛÕ¬¯µº™›ge¾Œ^žÀãb@žÀãWfœÎšd2fœÎ‰d™Íœg3d™ÍŒêÿÿêÿÿ˜ÿÿéhwþ‰ÿwþ‰ÿÿÿ—™˜—™ÿÿÿhigÿ˜—™2gŸše2ÿf›Îf›Îše2ÿf›ÎfÑdaÿ.ÿaÿ.ÿŸÒfÑdfÑdÿÿÒÿ.ÿŸÒfÑd˜ÿÿéhéh˜ÿÿéhÿþÍÿ33ÿþÍÿ3aÿ.ÿŸÒŸÒaÿ.ÿŸÒhigÿ˜—™˜—™higÿ˜—™ÿÿÿÿŸÒaÿ.ÿŸÒaÿ.ÿŸÒþÏÿ1fÑdÿÿÿh˜—ÿéiÿ‰ŒºÿwtFÿýÍ3ÿŸfÒÿaš.aþ.ŸÒÿ/ÍÿÿÑ3þÎÿÑ32ÿÿÿÿÿxvyhigÿ ! higÿ˜—™1ÿþÍÿÿþÍÿ33þÏÿÿÑ3þÏÿ12gŸΙaÿ2gŸΙaÿ2h™hhghhg˜˜™ÿ‰ŒºÿwtFÿwtFÿxvyc0.ŸfÒ3š.œwþwÿÿÿÑ3ÿ/ÍÿýÍ3ÿ˜ÿÿh˜ÿÿÿh˜ÿÿéhaš.ŸfÒaÿ.ÿŸfÒaÿ.ÿŸÒÿÑ3/ÍþÏ3ÿ/ÍþÏ3ÿ1ŠvþÿÿþÿÿwþwÿÿŠÿþÿ/ÍÿÑ3ÿþÍÿÿÑ3ÿþÍÿ3VWUôVW8 éÈô8®´Ñ8㈉‡îˆ‰UÛ«î%U‰Œº%UÎŠŠŠîŠŠWÝ©î#W¬¯µ#Wͨ£„X¿$žÿÿ¥ýž[X$¨£„X]|ÿýÍš2ÿhêyh‡2ÿýÍ3ÞÛÕ¿ îg*ý™Ögg™ íÛÕ"%+Ž”±rlOŽ”±675UW†«©zUW†TTSx{ˆ…x{VVVû’Ê Ë;eÅ›ã6÷5ãóV%¬­aš.ŸfÒTðSÒðz#°¦`w7 ‰ÉPñZÍž"‹¼uCDã[Þ¨ÿ}3Í–3djÎÉÿU3¬«—TBiºÊò¥¤8Ý¥¤8¨£Ý8WZIÎÿþUéþÎU(öÕÝ]ÿÚö]Xi éÈ, éèºÈÛ«FÛß›g«Ý©FÝݾŒ©Afž¿šbd d1ÿÏœ`œB¡O+Õï¾_±675VWUTTSˆ‰‡VVVŠŠŠX]|¨£„X]|¨£„3ÿýÍ3ÿýÍ"%+ÞÛÕ"%+ÞÛÕ$!&#½CD²{44/06Ÿdj‹1737 6ƒÞi®/b@†aCÑž¾šd2Θa»g¡œg3Óšj¹e—êÿÿêÿh˜ÿÿwþ‰ÿwþŠÿÿÿÿÿ˜˜™higÿΙaÿše2ÿf›ÎΙ‚²Å IDATaÿ44/bÿ.bÿ.˜ÿÿÿh˜ÿÿÿÿÿþÍÿ‰ŒºÿþÍÿˆŠ‡ÿaÿ.ÿŸfÒaÿ.ÿeÿhigÿ˜˜™higÿÿÿÿŠÿÿ‰ÿaÿ.ÿŸÒŸÒþÏÿÐÊaš/œÿ›/œ‰ÿÿhÿÿÿ‰Œºˆ‰‡ÿŸfÒdÿ/ÍÿýÍÿÿÿÿÿÿÿˆŠ‡ÿ ! xvyxvy˜—™ˆŠ‡ÿÿþÍÿ333ÿþÍÿÿþÍÿ111þÏÿΙaÿ2gŸΙaÿΙaÿ˜˜™ÿ3xvyˆŠ‡ÿŸfÒÿh}ic}icÿÿÿÿÑ3þÎÿêéh˜ÿÿ›ŸÒaÿ.ÿ31þÏÿЉÿÿÿÿÿÿ13ÿþÍÿžÀ㪩« éÈfœÎxwyÛ«d™ÍvvvÝ©X]|¨AÜbý[b¨AÜX]|3èfΘ‡˜èfÎ3"%+íAö™Ög™íAö"%+ÊÉËrlOÊÉˬ¬­«©z¬¬­ªªªˆ…ªªªÀ'›'›Àœ9f9fœú›6‹6‹ú›žÀн¼[|§|›Íœ–21ÿC𬾗F1ò[\ÈX]#[\È[\ÈX]#[\È«2««2«+#£& +#£+#£& +#£FcgCÃãFcgô8e™›e›Îe™›î%UBt¢B”ËBt¢î#WÿÏ1Õï+ÊÉËàà઩«ààବ­ÌËÌxwyÌË̪ªªÌÌÌvvvÌĮ̀£„¨£„ÿýÍÿýÍÞÛÕÞÛÕ#½áÝC[|N…ÿ06ŸÐÊa2uÏþ 6ƒõÊ}"0RÑìõ¿ä$!&Ñž¾ï›Ð44/»g¡ð˜Î737¹e—ÿÿÿÿê‰ÿ‰ÿwþÿÿÿÌÌÑf›Îše2ÿše2ÿΙaÿÌÌÑÌÌÑŸÒŸÒŸÒŸÒÿÿ˜ÿÿ˜ÿÿÿhꈊ‡ÿÿþÍÿÿþÍÿ‰Œºxvyeÿaÿ.ÿaÿ.ÿŸfÒ›ÿhigÿhigÿ˜˜™ÿ‰ÿÿÿÿÿŠwþaÿ.ÿc0.2ÌŸÿÿ˜ÿÿ˜ÿÿwþêxvy›3ÿxvyxvyÿÑ33311Ιaÿ2gŸ2gŸÿxvyxvyÿþÍÿwtF››ÿêeJg/Jg/êe1éhéhÿÿÿhŸÒŸÒeÿŸfÒ11ÿþÍÿ/ÍwþŠÿÿ‰ÿŠ33þÏÿÿÑ3ª©«ª©«ª©«xwyxwyxwyvvvvvvvvvX]|¨AÜb¨AÜX]|3èfΘèfÎ3"%+íAö™íAö"%+X]|3"%+àààààààààÌËÌÌËÌÌËÌÌÌÌÌÌÌÌÌÌÿÏ1Õï+675VWU TTSˆ‰‡454VVVŠŠŠ444X]|X]|33"%+"%+áÝC#½ÐÊa06ŸõÊ} 6ƒ$!&44/737˜ÿÿéhÿÿ˜éhÿÿÿþ‰ÿvþÿhigÿ˜—™ÿhhg˜—™še2ÿf›Î›Îše2ÿf›Îaÿ.ÿaÿ.ÿŸÒaÿ.ÿaÿ.ÿŸÒéh˜ÿÿÿhê3ÿþÍÿ‰ŒºxvyŸÒaÿ.ÿŸfÒ›˜—™higÿ˜˜™ÿÿþÿŠwþŸÒaÿ.ÿŸÒŸÒaÿ.ÿš/¶™Ñÿh|cêêÿÿêÿxvyˆŠ‡ÿxwyÿ›eÿœÿ3ÿþÍÿ3ÿÿÿÿxvyˆŠ‡ÿàßà˜—™1þÏÿ/Í33ÿþÍÿÿÑ312gŸΙaÿÌÌÑΙaÿ2gŸ2gŸÿÿÿˆŠ‡ÿ3ÿþÍÿ‰ŒºxvyêÎ4aÿ0Пc0.œÿ1þÏÿ2ÿ˜ÿÿéhÿÿ˜éhaÿ.ÿŸÒeÿaš.ŸÒþÏÿ3ÿþÍÿÿÑ31wþ‰ÿwþÿwþwwþ‰ÿvþÿþÍÿ3þÏÿ/Í3 éÈÛ«Ý©X]|¨£„X]|3ÿýÍ3"%+íÛÕ"%+¨£„X]|ÿýÍ3ÞÛÕ"%+b@vCD㥄Y[Þ¨„e3djÎèÏÉÿ½fTBiºÿÏÊò¥lOÿÿ©zÞûþ…¿šbAfž¿šbœ`œd dÿÏœ`œ¾_±B¡OÕï¾_±ÊÉË675ª©«675 ¬¬­TTSxwyTTS454ªªªVVVvvvVVV444¨£„¨£„¨¬ÿýÍÿýÍv{"ÞÛÕÞÛÕuw#½áÝC#½¥„²{ÿ06ŸÐÊa06Ÿþ΋1þ 6ƒõÊ} 6ƒÞÐí®/ÿÑž¾»g¡¹e—ÿÿ˜éh‰ÿvþÿhhg˜—™še2ÿ44/2gŸaÿ.ÿŸÒaÿ.ÿŸÒ˜ÿÿÿhêÿþÍÿ‰Œºxvyaÿ.ÿŸfÒ›higÿ˜˜™ÿÿÿP@-ú IDATŠwþ˜ÿÿJg/ŸfÒ›˜ÿÿéiÿ˜ÿÿéiÿÿþÍÿ3ÿÿþÍÿ3ÿaÿ.ÿŸÒÿaÿ.ÿŸÒÿþÏÿ2ÿþÏÿ2ÿÿÿhigÿ ! xvyÿþÍÿÿÑ31še2ÿ44/06Ÿ/Í3še2ÿ44/2gŸhigÿ˜˜™ÿhigÿ˜˜™ÿˆŠ‡ÿxvyˆŠ‡ÿxvyþÏÿ2ÿ˜ÿÿéiÿÿþÍÿ3ÿÿþÍÿ3ÿ˜ÿÿéh˜ÿÿéhaÿ.ÿŸÒaÿ.ÿŸÒþÏÿ1þÏÿ1ÿÿÿÿÿÿÿÿÿþÍÿ3ÿþÍÿ3ÿb@žÀãšd2fœÎ!" œg3d™ÍßÞà!" ßÞà675ÊÉËTTS¬¬­!" VVVªªªßÞà675, èžÀãb@Ô÷ÊÉËTTSFßfœÎšd2ºð!¬¬­!" VVVFÝd™Íœg3ºï#ªªªßÞ‡bžÿÿX˜ÿhê$™îgÜMý[¨£ÝX]#ÿ¥ý,‡éþÎ2êy*! ÖgÿÚö& *ý™-ßiNÿ²ü2vþŠ$"Rüý®Sßßb@žÀãšd2fœÎ!" œg3d™ÍßÞàdbœâžš.œfÒd!" œ/ždÑbßÞà675 ª©«TTS454xwy!" VVV444vvv6Ýá©ÿWÿ2wþ‰ÿ$"tÿŒÿSßßWÿ©ÿ‰ÿwþ!" Œÿtÿ6Ýá2$"SÞßÿþÎÐÊa2gŸþÏÿ1Ιaÿ2gŸÿÿÿÿþÏÿ1þÏÿ1þÏÿ1þÏÿ1ÿÿÿÿÿÿhigÿ˜˜™Î˜a2gŸΙaÿ2gŸše2ÿf›ÎˆŠ‡ÿxvyhigÿ˜—™˜ÿÿéh˜ÿÿéhˆŠ‡ÿwtF3Ιaÿ2gŸˆŠ‡ÿxvyÿþÍÿ‰Œºàßà˜—™ÿþÍÿ3ˆŠ‡ÿxvyˆŠ‡ÿxvyÿdbAåž±TUÇ œâžš.œeÑd‰Š‡¥fÒd!" œ/žBÌ`¬Œ¥dÑbßÞàdbò9󪩫š.œî[ëxwy!" œ/žî[ìvvvßÞॄ±ÓUO-«[|þΊ»‡vEy2!" ÞÐí¬ºTFc"0ßÞà675Ê+s¨AÜX¿$6ÕÊÉËTTSÃC¬èfΚ2=½T¬¬­!" VVV›D‰íAö¿ e¼wªªªßÞà675 O-«‘³5ÊÉËTTS454vEyV†S¬¬­!" VVV444TFcx†iªªªßÞà675 O-«±ÓUàààÊÉËTTS454vEyŠ»‡ÌË̬¬­!" VVV444TFc¬ºÌÌ̪ªªßÞàWÿNÿ²ü©ÿ‰ÿvþŠwþ!" ŒÿRüý®tÿßÞàdbAåž¿bœâžš.œeÑd›/œfÒd!" œ/žBÌ`¾4 dÑbßÞàdbœâžš.œfÒd!" œ/ždÑbßÞॄ^{Lý´þÎ1xˆ!" ÞÐí+.‹÷ˆßÞàb¨žX—ÿéi!" ñšßf!ßÞà675 àààÊÉËTTS454ÌË̬¬­!" VVV444ÌÌ̪ªªßÞàWÿNÿ²ü©ÿ‰ÿvþŠwþ!" ŒÿRüý®tÿßÝàˆŠ‡ÿxvyˆŠ‡ÿwtF‰Œºxvyÿÿÿhhg˜—™ÿÿê‰ÿvþŠwþþÎ/Í1/š2Ÿš/œÿfÑd1š/œÿfÑdš/œÿfÑdš/œÿfÑdš/œÿf6d›eÿ›ˆŠ‡ÿxvyˆŠ‡ÿxvyÿÿΙaÿ2gŸÿhigÿ–f™2ÿÿÿÿ1þÏÿ/ÍþÏ3ÿ1ÿÿ1þÏÿ/ÍþÏ3ÿ1ÿÿÿÿhigÿ–f™2ÿÿÿÿ˜˜™˜ÿÿéhéhç7˜ÿÿéhhigÿwvyЇÿxvyÿþÍÿ‰ŒºxvyˆŠ‡ÿàßàhigÿ‰ŒºÿþÍÿ3ÿþÍÿ3675ò ó±UAåžbð6ñî5ë‰[‡eÑd/œÝJÚî4ì¬[ŒBÌ`œ4 CÞB675ò ódbœâžTTSî5ëš.œfÒdVVVî4ìœ/ždÑb¥„‘³5 ÿLûÏ´V†S454ÿxÞЕx†i444 þx67 rAܨAÜXs6454«fÎèfάTT#$#444ˆAöíAö‰e¿¿¿P*#« zD06y454#$#}D 6c444¿¿¿oM˽¼è- éÈCDã±Uªz­œ–ßEÛ«djΊ‡#$#ˆz—¾—FÝ©BiºßßßQL/®´Ñààà W¨¬1ІvtF‰ŒºÌËÌ454‰v{"ŠŠRQK¬¯µÌÌÌ444Œuw©WUA-ž±ÓUààà ódb$k%dEd‰»‡ÌËÌ45ëšœ~BFO¬ºÌÌÌ44윞C@ê¨AÜX¿$žÿbFžX—ÿèfΚ2ÿh˜céiñšßíAö¿ îgšßf!¥„„®´Ñààࢅ´^{LûÏ´/͉ŒºÌËÌþψ1xÞЕ 謯µÌÌÌÕÒu+.‹@h;eÅ›X6÷5Ê@¥D[àaš.ŸfTðS¬dþj)¹ü`w7 ‰PñZ°eüØkñ©±„ýá|ËáÝC#½±UÉÆ˜ÿÑ3­ÐÊa06ŸŠ‡«©¢õõÊ} 6ƒà‡‹ß84± W¨¬2ËUQ‰54‰v{$ÿÊWUþ44ŒuwSˆŠ‡ÿwtFwtFxvy3xvyÿhhghhg˜—™˜—™˜—™ÿÿ„//š/šwþše2ÿÿ2Š»‡Ï›”3èh˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿfÑdÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿÿÿþÍÿÿþÍÿÿÿfÑdš/œÿš/œÿš/œÿš/œÿfÑd›eÿˆ%‡eÿeÿeÿxvyÿÿþÍþÍþÍþÍþÍþÍÿÿˆŠ‡ÿΙaÿΙaÿhigÿjšghhghigÿÿ23ÿþÎÿ2/ÍÿþÍÿþÎÿÿhigÿjšghhghigÿf0úŠ6ç! IDAThhg2hŸ2hŸÿše2ÿΙaÿÌÌÑÌÌÑΙaÿΙaÿˆŠ‡ÿše2ÿÎ5î%Uše2ÿše2ÿhigÿˆŠ‡ÿàßààßàˆŠ‡ÿˆŠ‡ÿÿhigÿ˜˜™˜˜™higÿhigÿˆŠ‡ÿˆŠ‡ÿéhÿÿ˜ÿÿ1ÿ1ÿ˜ÿÿ˜ÿÿéhhigÿˆŠ‡ÿàßàikšˆŠ‡ÿÿþÍÿše2ÿΙaÿÌÌÑÌÌÑΙaÿΙaÿhigÿ ! iigiigˆŠ‡ÿ‰Œºàßàxvy—•f ! àßàše2ÿše2ÿÿFÚˆŠ‡ÿˆŠ‡ÿÿ›1Ï›1ÏÿþÍÿˆŠ‡ÿ›1Ï›1Ï.ç-O¬«Ç àààFÚIwvy¥ÌËÌFÙHTqt¥ÌÌÌ.ç-ª©«àààFÚIxwyÌËÌFÙHvvvÌÌÌ^{LoMËàààààà1xªz­ÌËÌÌËÌ+.‹ˆz—ÌÌÌÌÌ̪ SŽ”±®´Ñ¨AÜxUW†‰ŒºèfÎgUx{¬¯µíAöÐö‘³5áÝCºñ&V†SÐÊa·ð x†iõÊ}±ÓUõ¿äõ¿ä‘³5Š»‡ï›Ð1ï›ÐV†S¬ºð˜Î+ð˜Îx†i±ÓU±ÓUŠ»‡Š»‡¬º¬ºoÌ˨¬ààà0 î««­v{ÌËÌFÚˆ¥¨uwÌÌÌIàí†ywtF‰ŒºÿþÍÿÿþÍÿ‰ŒºÿþÍÿhhg˜˜™higÿhigÿ˜˜™higÿ„/ïÑfÿÿÿÿïÑfše2ÿ44/ÿFÚ1gŸ˜ÿÿÿhÿh˜ÿÿaÿ.ÿŸfÒŸfÒaÿ.ÿÿþÍÿ›1Ï›1ÏÿþÍÿÿÿÿþÍÿ›ge›geþÍÿÿš/œÿeÏ1eÏ1š/œÿeÿˆ%‡xÛyˆ%‡ÿ™ÍwtFˆ%‡eÿþÍbag3g3baþÍˆŠ‡ÿxvyˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿše2ÿše2ÿše2ÿše2ÿÌÌÑþÏÿ˜˜™˜˜™˜˜™˜—™ÿþÎþÎþÎ2ÿ1þÎþÎ31ÿ˜˜™˜˜™˜˜™˜—™ÿ2hŸhhg˜—™ÿše2ÿ44/44/44/ÌÌÑΙaÿhigÿÛ«2üËÛ«Î5še2ÿhigÿ ! ! ! àßàˆŠ‡ÿÿhhghhghhg˜˜™higÿhigÿˆŠ‡ÿwvywvyˆŠ‡ÿˆŠ‡ÿ˜˜˜éhÿh˜ÿÿhigÿ ! wtF—•f—•fàßà‰ŒºÿþÍÿše2ÿ44/44/44/ÌÌÑΙaÿ ! ! ! àßààßà˜—™44/44/1elFÚFÚ¥xÿxÿfÒdfÒd3ÿþÍÿ¥xÿxÿfÑÜfÑÜAåžP* éÈeÑdzDÛ«BÌ`}DÝ©db, 訬š.œFßv{œ/žFÝuw[Þ¨oMË, 訬Éÿªz­Fßv{Êòˆz—FÝuwÊ+s éȯ\}X¿$ÃC¬Û«Š5š2›D‰Ý©®$,¿ ÜßÚ²{454ÌÌÑ‹1444ÉÍÉ®/ 454444NÿoÌË éÈO¬«vþ««­Û«wvyRüýˆ¥¨Ý©Tqtxvy3ÿþÍÿÿhigÿwþý}icš/œÿ44/ÌÌÑΙaÿΙaÿÌÌÑÏ™aÿhêyêyÿhŸfÒœœŸfÒaÿ.ÿ›1ÏfÒdfÒd›1Ïê3›e2fœÎfœÎ›geþÍfÒd›1Ï›1ÏœxÛyg3‰Œºˆ%‡ŸfÒœœŸfÒˆŠ‡ÿˆŠ‡ÿþÏÿ2gŸ44/44/44/44/44/ÐÊahigÿ˜˜™ÿÿÿ21ÿÿ23ÿ3ÿhhg˜˜™ÿ˜˜™higÿhigÿÿÌÌÑÌÌÑ ! Î5î%Uàßààßà˜˜™˜˜™higÿ ! ‰Š‡‰Š‡àßàˆŠ‡ÿÿÿéhêikš‰ŒºàßàÌÌÑÌÌÑàßààßà˜—™ÿþÍÿ‰Œºàßà ! ÿþÍÿˆŠ‡ÿºñ&ºñ&ˆ‰‡higÿÿ3ÿþÍÿˆŠ‡ÿºñ&ºñ&hhghigÿÿfÑdˆˆ3fÑdˆˆ¿bÇ ›/œ¥¾4 ¥œâžª©«fÒdxwydÑbvvvO-«[Þ¨vEyÉÿTFcÊò6Õ=½Te¼wààà‘³5ÌËÌV†SÌÌÌx†iàààÌËÌÌÌÌ®´ÑRL/ààà ‰ŒºwtFÌËÌ454¬¯µTQKÌÌÌ444±ÓUO-«ààà Š»‡vEyÌËÌ454¬ºTFcÌÌÌ444X¿$¨AÜžÿbš2èfÎÿh˜¿ íAöîg™O-«®´ÑRL/ààà O-«vEy‰ŒºwtFÌËÌ454vEyTFc¬¯µTQKÌÌÌ444TFcÅ›ã;e6÷5Ê ËŸfÒaš.TðS¬­ ‰É`w7PñZ°¦ýá|„áÝC#½ÿÑ3/ÍÐÊa06Ÿõ èõÊ} 6ƒ²ü²üŠŠ®®33ˆŠ‡ÿ‰Œº˜—™˜—™˜˜™hhgfÑdeÿÿh}icf›Î2gŸΙaÿ˜‡‡˜aš.ddaš.ŸÒeÏ1š.œš.œeÏ1þÍe™›šd2šd2e›Î3fÑdš.œfÒdfÒdfÒdfÒdfÑd›xÛydœœxwyxwyxvyaš.ddaš.xvyˆŠ‡ÿxvyxvy1xvyΙaÿ2gŸ2gŸ2gŸ2gŸhhghhgÿþÎþÎ2ÿþÎþÎ2ÿÿhhghhgÿhhgÿÿÿ˜—™˜˜™higÿΘa44/ÌÌÑ44/ÌÌÑÌÌÑ44/Û«î%U2üËî%UÎ52üËàßà ! àßà ! àßààßà ! hhg˜˜™hhg˜˜™˜˜™hhgàßààßà˜éh˜ÿÿÿhÿhÿh—•fàßàÏp:¯ IDAT—•fàßà—•f‰Œº}3ÍÌÌÑ44/ÌÌÑÌÌÑ44/ ! àßà ! àßààßà ! ÿþÍÿÿþÍÿÿþÍÿ‰ŒºàßàÿþÍÿ3FÚFÚàßààßà˜˜™ÿ3àßàhhgÿŽ”±UW†x{¨¬O¬«v{wvyuwTqtÇ O¬«¥wvy¥TqtžXd¼ºéiƒ—f!«•¿À"¨‘³5œ3ÿV†Sú›ë5ãx†i‘³5V†Sx†iÿþÍÿÿþÍÿxvywtF3higÿhigÿÿ˜˜™˜—™þÏÿaÿ.ÿ›êeéh2gŸ2gŸše2ÿÌÌÑéh˜˜éhŸÒaš.aš.ŸÒ3eÏ1eÏ13ÿÿ33e™›e›ÎþÍfÑdfÑdš.œš.œš.œÿ››ˆ‰‡dˆ‰‡ÿ3žÿŸÿ™Íÿ™ÍžÿŸ3xvy2gŸ2gŸ2gŸΙaÿhigÿ˜—™˜—™hhgþÏÿ11þÎþÎþÏÿ11þÎþÎhhg˜—™˜—™hhg˜˜™ÿÿÿÿÿ˜˜™2gŸ2gŸ44/2gŸf›Îàßààßà ! 2üËf›Îxvy ! xvy˜—™hhg˜—™ ! àßà ! àßààßà ! éhêê˜ÿÿê3‰Œº3‰Œº—•fxvyéh44/2gŸxvy ! xvy3‰Œº‰ŒºàßàÏ›”higÿšÐšÐhhgÿhigÿàßààßà˜˜™˜˜™ÿÿÿxˆO¬«®´ÑRL/ ¨¬wvy‰ŒºwtF454v{Tqt¬¯µTQK444uwO¬«±ÓUO-« Ç wvyŠ»‡vEy454¥Tqt¬ºTFc444¥d¼ºX¿$¨AÜbžXƒ—š2èfΘéi«•¿¿ íAö™f!^{LO-«®´ÑRL/ O-«[Þ¨1xvEy‰ŒºwtF454vEyÉÿ+.‹TFc¬¯µTQK444TFcÊò"¨Å›ã;eÊ ËÀ3ÿŸfÒaš.¬­œë5ã ‰É`w7°¦ú›‘³5ýá|„#½‘³5V†SÿÑ3/Í06ŸV†Sx†iõ è 6ƒx†iÿþÍÿ3ÿþÍÿ3xvyhigÿ˜—™higÿ˜—™˜—™þÏÿ1Òaÿ.ÿŸÒêΙaÿ2gŸše2ÿ44/2gŸéhŸÒ3˜ÿÿéh33fÑdxvyxyÿ3ÿxvyˆŠ‡ÿxvy2gŸΙaÿ2gŸ2gŸΙaÿ2g™higÿ˜˜™˜˜™hhgÿÿ1ÿþÎ2þÎÿÿ1ÿþÎ2þÎÿÿ˜—™higÿ˜˜™˜˜™hhgÿÿÿÿÿÿÿf›Îšÿ44/ ! Û˘—™higÿ2ü˘—™higÿ ! ÿ˜˜™ÿhhgxvyhigÿ˜—™higÿ ! xvyÿÿÿh˜ÿÿéhwtF3àßà‰Œºf›Îšÿ44/˜—™higÿ ! ÿþÍÿ‰Œº—•f‰Œºxvyxhigÿ˜˜™ÿhigÿ˜˜™ÿ˜˜™ÿÿÿÿxxÿˆA垢žeÑdg1dBÌ`aB`dbþ»dbš.œ–š.œœ/ž•œ/žÊ+s,ÞuÊ+sÃC¬FÍ3ÃC¬›D‰FÍT›D‰ éè 454Ûß454444ÝÝ444ÿXT¬«ÿXT ÿŠ…vyÿŠ…4þ‹‰qtþ‹‰4O¬«®O¬«wvy‰wvyTqt¬TqtO¬«±UO¬«wvy‰Š‡wvyTqt¬Tqtd¼ºXFd¼ºbƒ—cƒ—.œ«•¿A«•¿/ž[Þ¨¥-X®´O-«[Þ¨ÉÿçE‰ŒvEyÉÿÊòíF¬¯TFcÊò"¨Å›X"¨"3ÿŸf3ÿ3ë5ã ‰ë5ã5±ÓUO|±ÓU Š»‡v3Š»‡45¬ºTF¬º44Nÿ¢½vþgŸ1Rüýa”BˆŠ‡ÿxvyÿÿÿÿÿþÍÿ3ÿÿš/œÿfÑdˆŠ‡ÿxvy˜ÿÿéh‰ÿwþˆŠ‡ÿxvy@E IDATÿWÿNÿ²ü©ÿ‰ÿvþŠwþ!" ŒÿRüý®tÿßÞàdbAåž¿bœâžš.œeÑd›/œfÒd!" œ/žBÌ`¾4 dÑbßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàWÿNÿ²ü©ÿ‰ÿvþŠwþ!" ŒÿRüý®tÿßÞà675Ê+s6ÕÊÉËTTSÃC¬=½T¬¬­!" VVV›D‰e¼wªªªßÞà675, è$!&ÜßÚô8àààÊÉËTTSFß44/ÌÌÑî%UÌË̬¬­!" VVVFÝ737ÉÍÉî#WÌÌ̪ªªßÞàb@$!&ÜßÚÞEœâžšd244/ÌÌÑÊjfÒd!" œg3737ÉÍÉÈkdÑbßÞàb@FcgX]|šd2e™›3!" œg3Bt¢"%+ßÞàdbAåž „X]|š.œeÑdþÍ3!" œ/žBÌ`à×"%+ßÞàdbD…"X]|š.œeÏ13!" œ/žB¬7"%+ßÞàÿLýc\¥"X„ýá|[|ÿx˜‡ç7/ÍÿÑ3#T þxèœgí6 èõó675Ê+s¨AÜX]|TTSÃC¬èfÎ3!" VVV›D‰íAö"%+ßÞà675 O¬«[ýTTS454wvy!" VVV444Tqt"ßÞàdbò9óÇ œâžš.œî[ë¥fÒd!" œ/žî[ì¥dÑbßÞàWÿ aó៩ÿ‰ÿ/šïÑfwþ!" Œÿ0ðÐctÿßÞàWÿNÿ²ü©ÿ‰ÿvþŠwþ!" ŒÿRüý®tÿßÝàÿþÍÿ3xÿˆÿxÿˆˆŠ‡ÿxvyÿþÍÿ3Ιaÿ2gŸÿÿΙaÿ2gŸš/œÿfÑdΙaÿºñÿþÍÿ3Ιaÿ2gŸ˜ÿÿéhΙaÿ2gŸÿÿwþÿÿxvyˆŠ‡ÿxvyhigÿ˜—™WÿNÿ²üÿXT¨¬Nÿü2vþŠÿŠ…v{vþÿ$ÿRüý®þ‹‰uwRüý·bAåž¿bD…"¼{ÞAåžb6:eÑd›/œeÏ1›1ÏeÑd/œ##"BÌ`¾4 B¬7¾TÉBÌ`œ4 CÞBdbœâž¨£„X]|dbœâžš.œfÒdÿýÍ3š.œfÒdœ/ždÑbÞÛÕ"%+œ/ždÑbWÿ/bBáÑž¾Nÿü2E™_Ï»g¡vþÿ$ÿG›iõ¹e—Rüý‰75Ê+s6ÕP*°ÖòÊ+s6ÃC¬=½TzD†¼òÃC¬TT#$#›D‰e¼w}Dƒ¼ì›D‰eëȧ$!Üßè0 î è75d-ý44ÌÌFÚßTSi573ÉÍÝIàÝVVëȧ$!&ÜßÚ"CábßžÀãšd244/ÌÌÑ4jÅšÌ2fœÎœg3737ÉÍÉ7kÌœÍ3d™Íb@žÀãFcb@žÀãšd2fœÎe™šd2fœÎœg3d™ÍÞtœg3d™ÍdbAåž¿bDdb6:eÑd›/œeš.œ##"BÌ`¾4 Bœ/žCÞBdbœâžD„š.œfÒdeÍœ/ždÑbÞÕÿLýc\¤…ÿx˜‡éhyÏ þxèœgd™Ò675Ê+s6ÕAO675ÃC¬=½TfzTTS#$#›D‰e¼wAVVV¿¿¿ ààà675454ÌËÌTTS#$#444ÌÌÌTVVVí¦ì"CázŸ½†aC†CÍY4jÅ2hŸÎ˜aÎaï¹]7kÌ-f–ÓšjÓjcCw AœÀžbAW¿ä2e0fœdše2‰›Ð$ÿh2d™bœh3Œ˜ÎªÿNÿ‘45 àààoÌËü2vþUUS454ÌËÌ««­ÿ$ÿRüýx[X444ÌÌ̈¥¨Shigÿ›1Ï›1ÏÿþÍÿ˜ÿÿ˜ÿÿÿÿxÿˆxÿš.œš.œxÿˆ˜ÿÿ˜ÿÿÿÿxÿÿþÍÿˆŠ‡ÿˆŠ‡ÿ‰Œºhigÿ›1Ï›1ÏˆŠ‡ÿˆŠ‡ÿHgžHgžÿÿÿÿIÿž2gŸ»g¡»g¡š/œÿš/œÿ1gŸ2gŸ›1Ï›1ÏÿþÍÿ2g2g˜ÿÿ˜ÿÿÌ–;2gŸˆŠ‡ÿš.œš.œÿÿÿþÍÿˆŠ‡ÿˆŠ‡ÿFÚΙaÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿÿhigÿeÿeÿhigÿˆŠ‡ÿxÿÿÿhigÿˆŠ‡ÿ ! ! ! ! ˜—™0 îFÚIàò9ó®´Ñò9óî[뉌ºî[ëî[쬯µî[ìý`|3 )¢½"BAÑž¾/bB1gŸ1el»g¡E™_ a” Ak¹e—G›iP*†ÿ›, è, èP*†ÿ›zD·bFßFßzD·b}Dâ‹FÝFÝ}Dâ‹$!&Ðö°Öò$!&44/ºñ&†¼ò44/737·ð ƒ¼ì737$!&Þ½zŸ½$!&44/Ì–;2hŸ44/737É•4-f–737ò9ó±TUò9óî[뉊‡î[ëî[쬌î[ìò9óVWUî[눉‡î[슊ŠSX Võ­SX ˆŠqòˆˆŠŒ™ð«ŒWYoÌËoÌËrh««­««­›e"ˆ¥¨ˆ¥¨Ç .ç-¥FÚI¥FÙHÐö†aC†aCÞ½ºñ&ΘaΘaÌ–;·ð ÓšjÓšjÉ•4©ÿÞEb@b@õ¿ä©ÿwþÊjšd2šd2ï›ÐwþtÿÈkœg3œg3ð˜Îtÿ‘45 ‘45UUS454454UUSx[X444444x[X¥xÿ˜—ˆŠë3ÿþÍÿ3˜ÿÿÿhêyˆˆÿxÿfÑÜxˆ˜ÿÿÿhêyˆFaÿxΙaÿÏ›”xwŸ¥xÿ˜—ˆŠëh:gÿÿÿÏ™bIÿž‰ÿ4jÅ1gŸ¥xÿf6dfgÿþÍÿ3xÿ·bÌ–;¥ÿfÒdÿΙaÿÏ›”xwŸxÿxhigÿ˜—™ˆŠ‡ÿvEy/ÍvEyÿ1ˆŠ‡ÿàßàvEyjšgþÏÿ1higÿ˜—™ˆŠ‡ÿvEy/ÍvEyÿ1ÿÿhigÿ–f™Š» þÏÿ1eÿ›eÿþjc0.jÒÿ1higÿ˜—™ˆŠ‡ÿwvyþÍwvyÿxÿˆÿÿèÏɇþ7ÿ1ˆŠ‡ÿwtF3eÿaš.ŸÒhigÿ ! xvyÿþÍÿÿÑ31ÿÿ˜éhÿÿ˜éheÿaš.ŸÒ‰ÿvþxÿš/$fÑdˆŠ‡ÿv{vþþÍ3Ιaÿ06Ÿ1àßà˜—™higÿÿÿNÿáNÿvþÏvþRüýõRüýO¬«±TUO¬«wvy‰Š‡wvyTqt¬ŒTqt×c IDATdbåždbš.œÑdš.œœ/žÌ`œ/žNÿ¢½bC¢½vþgŸ™agŸRüýa”GŸla”"BAX¿$"†ÿ›ž"‹¨AÜÖ±1elš23·b}3Íÿèfμ† Ak¿ 3â‹U3¬íAö¼"BAÐ´Ñ "B/Ö±1elºŒº4541eF¼† Ak¯µ444 AK¼"BAÞ½Þdb"B"Ÿ½1elÌ–Ïš.œ1e1hŸ Ak•Éœ/ž A7–VWUôVW8 éÈô8®´Ñ8㈉‡îˆ‰UÛ«î%U‰Œº%UÎŠŠŠîŠŠWÝ©î#W¬¯µ#WÍAåž±TU®´Ñ9eÑd‰Š‡‰Œº[BÌ`¬Œ¬¯µ[¯VWUdbò9ó®´ÑVWUª©«ˆ‰‡š.œî[뉌ºˆ‰‡™™™ŠŠŠœ/žî[쬯µŠŠŠ«««ýc\±Ó ÓÑU22˜‡Š»»º‡##èœg¬ºµ!ÈW ADãoË[_¨¯\Y845«¯e0ÿjΫ1­˜ÿŠUQ6©«h2iºˆ+¨Ÿá6$"WU.ç-Afžšbò9óO-«½ oDËõªgd d`œî[ëvEy›2ªj­¿ƒ¾B¡O_±î[ìTFc¾Fˆi—e¦U0 î†aCFÚΘaIàÓšjó០"b@õ¿äïÑf60šd2ï›ÐðÐc82œg3ð˜ÎoÌËÌ˲««­«­Šˆ¥¨¥¨T®fÑdˆhiïwtF3éh·b·b˜˜‡˜ÿÿˆˆÿéh·b·b˜˜‡˜ÿÿšÐÿ2hŸ2hŸhhgΙaÿfÑdˆhiïwtFàßàêèÏ06Ÿ06ŸwþuÏþ06Ÿ06ŸfÑdˆˆœ3ˆþψ06Ÿ06ŸfÑdÿÿÿ2hŸ2hŸÿx‡˜ÿÿ˜—™ˆŠ‡ÿ/ÍŠ»‡ˆŠ‡ÿàßà˜—™˜—™1˜—™jšgˆŠ‡ÿ˜—™ˆŠ‡ÿ/Íš2Š»‡˜ÿÿhigÿÿhigÿŠ»‡jšgeÿ›eÿc0.–ˆŠ‡ÿ˜—™ˆŠ‡ÿþÍ‰Š‡ÿÿˆÿÿÉÿ1ÿhigÿwtFwtFeÿeÿaš.aš.ŸfÒeÿeÿhigÿ ! ! wtFÿþÍÿÿÑ3ÿÑ3xÿ˜˜xÿÿÿ˜˜ÿhÿÿÿÿeÿaš.aš.‰ÿvþvþÿÿš/$š/$|Ñc‰ÿwtFvþËþÍše2ÿ06Ÿ06Ÿ ! higÿ˜—™ÿÿÿÿ²ü²ü²üŠŠŠ®®®¿b¿b¿b›/œ›/œ›/œ¾4 ¾4 ¾4 œâžœâžœâžfÒdfÒdfÒddÑbdÑbdÑb²ü²üŠŠ®®Ž”±¨AÜ6Õ6Õ¨AÜX¿$UW†èfÎ=½T=½TèfΚ2x{íAöe¼we¼wíAö¿ Ž”±RL/RL/®´ÑUW†wtFwtF‰Œºx{TQKTQK¬¯µX]|D…"D…"¼{Þ3eÏ1eÏ1›1Ï"%+B¬7B¬7¾TÉžÀ㪩« éÈfœÎxwyÛ«d™ÍvvvÝ©¿b¿bÇ Ç ›/œ›/œ¥¥¾4 ¾4 ¥¥œâžª©«ª©«fÒdxwyxwydÑbvvvvvv¤¤­¨÷­¨÷éhyéhyxvñxvñd™d™tîtî Aõ¿ä6Õe0ï›Ð11ÿÏ=½Th2ð˜Î++Õïe¼wŸáê[|§[|§Ÿáêààà‘³5CD㑳5fÑÜ1ÿ1ÿfÑÜÌËÌV†SdjÎV†SmÏÚ1ò1òmÏÚÌÌÌx†iBiºx†i"Cá4jÅ7kÌWÿ‰ÿŒÿ²ü²ü²ü²üŠŠŠŠ®®®®˜˜™xvñ«ÿþÍÿ1el1elèfÎéhyéiÿþÍÿ1el1elèfÎéhyéi ! hhgºñ&ˆŠ‡ÿ˜˜™xvñ«˜˜™àßàèÏÉÿuÏþ1eÿœþψœ`œÿx‡˜éhàßà‰ŒºxvyÿþÍÿxvy ! higÿˆŠ‡ÿxvyàßà‰ŒºèfÎxèfΘ—™˜˜™àßà˜—™ˆŠ‡ÿ›ŸfÒ›aÿ.ÿxvyàßà‰ŒºxvyÿþÍÿêêyÿhê˜ÿÿhigÿ ! ÿþÍÿhigÿ›ŸfÒŸfÒ›ÿwtFˆŠ‡ÿÿþÍÿÿÑ3þÏÿxÿ‡˜ÿÿˆêyéhyÿhêeÿaÿ.ÿ‰ÿÿÿÿÿêy|Ñcš/œÿhigÿÿŠ…33ÿþÍÿše2ÿ44/þÏÿ˜—™˜—™higÿÿÿX¿$rlOrlOŽ”±š2«©z«©zUW†¿ ˆ…ˆ…x{º™FcgFcgº™›gee™›e™››ge¾Œ^Bt¢Bt¢¾Œ^º™FcgFcgº™›gee™›e™››ge¾Œ^Bt¢Bt¢¾Œ^ª©«ª©«ª©«xwyxwyxwyvvvvvvvvvÇ Ç O¬«¥¥wvy¥¥TqtÇ ª©«Ç ¥xwy¥¥vvv¥­¨÷­¨÷ª SxvñxvñxtîtîgUõ¿ä©c§‘45‘45©c§ï›ÐŽ˜ýUUSUUS1Ž˜ýð˜Îe›Þx[Xx[X+e›ÞVW®67ޱÓUrŠˆ>UTŠ»‡«‰«wUw¬º"Cá4jÅ7kÌ A AWÿe0e0‰ÿh2h2Œÿÿÿxˆÿÿÿ««ÿÿÿÿxˆÿÿÿ3«ÿÿhhghhgàßàÿÿxˆ˜˜™˜—™ÉÿÉÿÉÿ111dÿœ`œœ`œœ`œÿÿÿxÿx‡˜—™àßàxvy‰Œº3ˆŠ‡ÿhigÿhigÿ ! xvy˜—™àßàx‰Œºéh3ÿ˜˜™˜—™àßàxvy››ŸfÒŸÒ˜—™àßàxvy‰Œº3ˆêyêÿhéhhigÿ ! wtF››››››hhg ! ÿþÍÿÿÑ3xÿ‡˜ˆêˆêêêeÿaš.‰ÿvþÿÿêyš/$higÿ!—›wvyþÍþÍ33še2ÿ44/06Ÿhigÿhigÿhigÿÿÿÿÿÿÿä¦ä¦Øÿ,Øÿ,ÚÝ2ÚÝ2¥„¥„þÎþÎÞÐíÞÐí/bBÑž¾E™_»g¡G›i¹e—Ž”±"BAº™\F IDATUW†1el›gex{ Ak¾Œ^ô8Þ¾¿"BAÞ¾¿Ô÷î%UÏ›”1elÏ›”ºð!î#Wõ¿• Akõ¿•ºï#ÞEÞ¾¿"BAÞ¾¿žÀãÊjÏ›”1elÏ›”fœÎÈkõ¿• Akõ¿•d™Í éÈÛ«Ý©O¬«wvyTqtª©«xwyvvvª SxgUß84‘45ËUQUUSÊWUx[X38é38éTUÛTUÛMXÞMXÞCÃãCÃãCÃãNÿe›Îe›Îe›ÎvþB”ËB”ËB”ËRüýÿÿxÿxˆÿÿ‡Î2«‡êyÿÿxÿxˆÿéÎ2«‡êyÙu§ü˜—™eÿaš.ŸfÒvÿÿxÿxˆÿÿéhš/œÿfÑdš/œÿf˜ÿÿéh˜ÿÿheÿœdœeÿ›fÑdÿÿÿÿfÿˆ‰ÿÿeº|›ÍÿhÿþÍÿ3xvyˆŠ‡ÿxvyhigÿxvyÿþÍÿ3™Š‡ÿ˜ÿÿéhˆŠ‡ÿxvyaÿ.ÿŸÒÿþÍÿ3˜ÿÿéh‰ŒºwtFàßà ! ‰Œºÿh˜ŸfÒaš.ŠvþêyfÑÜš/$„/!—›ÿŠ…‰w3þÍþÍgeÐÊa06Ÿ ! higÿ ! àßàj^ããj¢žÒÒžgxËËxA垬eÑdÑBÌ`Ì¿šbšdœ`œ/`š.¾_±4_œ/á^C¾¿/bB¢½Ï™a›”E™_1gŸ1õŸl¿•G›i a”RÊ+sX¿"‹ÃC¬š3Í›D‰›¿3¬ÐöдÑ ºñ&ºŒº&45·ð ¯µ 44 Þ½Þ½ÞdbÌ–;Ì–Ï;š.;É•4•É4œ/žb@šd2œg3AåžeÑdBÌ`dbš.œœ/žýc\˜‡èœgÊ+sÃC¬›D‰ 454444Þ½ò9óVWUÐöÇ ÌÍ:î[눉‡ºñ¥ï#"î[ìŠŠŠ·ð¥©ÿ bdÞ¿©âž©ÿ.œšÊ›/wÒd!ÿ4 œÈ¾4tÑb6NÿvþRüýí†yΙaÿΙaÿΙaÿΙaÿÿÿše2ÿše2ÿeÿeÿΙaÿΙaÿÿWÿ¥ÿ¥ÿ¥ÿ¥ÿWÿÿÿ‰ÿÿÿÿÿÿÿÿÿ‰ÿÿ!# ÿ­"!ÿÿÿÿÿÿÿÿÿ­"!ÿ!# ÿÿLÿdbÿdbÿdbÿdbÿLÿÿÿxÿš/œÿš/œÿš/œÿš/œÿxÿÿ!# ÿ*!˜ÿ½R¾ÿ½R¾ÿ½R¾ÿ½R¾ÿ*!˜ÿ!# ÿÿ¥…ÿÿÿÿÿ¥…ÿÿÿþÏÿÿÿÿÿþÏÿÿ!# ÿÿó ÿ!# ÿ!# ÿ!# ÿ!# ÿÿó ÿ!# ÿÿdbÿÿÿÿÿdbÿÿÿš/œÿÿÿÿÿš/œÿÿ!# ÿ½R¾ÿ!# ÿ!# ÿ!# ÿ!# ÿ½R¾ÿ!# ÿÿ§ÿLÿLÿLÿLÿ§ÿÿÿÿÿxÿxÿxÿxÿÿÿÿ!# ÿ$ÿÿ*!˜ÿ*!˜ÿ*!˜ÿ*!˜ÿ$ÿÿ!# ÿÿdbÿÿ§ÿ§ÿÿdbÿÿÿš/œÿÿÿÿÿÿÿš/œÿÿ!# ÿ½R¾ÿ!# ÿ$ÿÿ$ÿÿ!# ÿ½R¾ÿ!# ÿÿdbÿÿbAÿbAÿÿdbÿÿÿš/œÿÿše2ÿše2ÿÿš/œÿÿ!# ÿ½R¾ÿ!# ÿ½ŠSÿ½ŠSÿ!# ÿ½R¾ÿ!# ÿÿdbÿÿbAÿbAÿÿdbÿÿÿš/œÿÿše2ÿše2ÿÿš/œÿÿ!# ÿ½R¾ÿ!# ÿ½ŠSÿ½ŠSÿ!# ÿ½R¾ÿ!# ÿÿdbÿÿ685ÿ685ÿÿdbÿÿÿš/œÿÿTUSÿTUSÿÿš/œÿÿ!# ÿ½R¾ÿ!# ÿwyvÿwyvÿ!# ÿ½R¾ÿ!# ÿÿdbÿÿeÿeÿÿdbÿÿÿš/œÿÿ™/ÿ™/ÿÿš/œÿÿ!# ÿ½R¾ÿ!# ÿ¼S$ÿ¼S$ÿ!# ÿ½R¾ÿ!# ÿÿWÿ¥ÿ¥ÿ¥ÿ¥ÿWÿÿÿ‰ÿÿÿÿÿÿÿÿÿ‰ÿÿ!# ÿ­"!ÿÿÿÿÿÿÿÿÿ­"!ÿ!# ÿÿWÿbAÿbAÿbAÿbAÿWÿÿÿ‰ÿše2ÿše2ÿše2ÿše2ÿ‰ÿÿ!# ÿ­"!ÿ½ŠSÿ½ŠSÿ½ŠSÿ½ŠSÿ­"!ÿ!# ÿÿ†bCÿ¥…ÿ¥…ÿ¥…ÿ¥…ÿ†bCÿÿÿΙaÿþÏÿþÏÿþÏÿþÏÿΙaÿÿ!# ÿô½Šÿÿó ÿÿó ÿÿó ÿÿó ÿô½Šÿ!# ÿÿ§ÿc¨ÿc¨ÿc¨ÿc¨ÿ§ÿÿÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿÿ!# ÿ$ÿÿ½ÿÿ½ÿÿ½ÿÿ½ÿÿ$ÿÿ!# ÿÿÿ§ÿ§ÿ§ÿ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!# ÿ!# ÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ!# ÿ!# ÿÿÿdbÿdbÿdbÿdbÿÿÿÿÿš/œÿš/œÿš/œÿš/œÿÿÿ!# ÿ!# ÿ½R¾ÿ½R¾ÿ½R¾ÿ½R¾ÿ!# ÿ!# ÿ‰ÿwþše2ÿf›Îše2ÿf›ÎþÏÿ1ÿÿše2ÿf›Îÿÿÿÿÿÿaÿ.ÿmš32gŸeÿ›še2ÿfœÎÿΙaÿÌÌÑfœÎšd244/2gŸše2ÿfœÎÿše2ÿfœÎÿÿÿše2ÿfœÎÿWÿNÿ½=CÃã²ü2vþ›e2e›ÎŠ$"Rüý¾l5B”Ë®VÞ+aþ"»ÞEŸáêý,š/$6–ÊjfÑÜ*! “1&8•ÈkmÏÚ{dh[|b@žÀ㥄YJ2šd2fœÎþÎ$ "0œg3d™ÍÞÐíe,Uœâžb@žÀãdb6:fÒdšd2fœÎš.œ##"dÑbœg3d™Íœ/žC¯éÿ¥_AÑ¡¿/ý[ÿXêyšeºf›F‡ê$*ý™“i»m—EÖgdûcD…"X¿$žÿbžÿd»6:eÏ1š2ÿh˜ÿh„/##"B¬7¿ îg™îg½.¿§Í¤D…"Þ¾¿ÜßÚ$!&ÜßÚÞE6:eÏ1Ï›”ÌÌÑ44/•àøí IDATÌÌÑÊj##"B¬7õ¿•ÉÍÉ737ÉÍÉÈk§Í¤D…"ýá|½¼CDã½¼ÞE6:eÏ1ÿÑ3œ–2djΜ–2Êj##"B¬7õ¾—FBiº¾—FÈk§Í¤D…"®´Ñààà ààà.ç-6:eÏ1‰ŒºÌËÌ454ÌËÌFÚI##"B¬7¬¯µÌÌÌ444ÌÌÌFÙH§Í¤D…"ý`|À@çÀÿb6:eÏ13š/fÑš/œ##"B¬7 )½5CËú½5ÿšš®CNÿ²ü AFcgýá|½¼õ¿ä2vþŠe0e™›ÿÑ3œ–2ï›Ð$"Rüý®h2Bt¢õ¾—Fð˜ÎªÞà Aõ¿ä¬Kýc\žÿÿ¥Tµ2e0ï›Ðwv˜‡ÿhêy‰Š$"h2ð˜Î}ÿwèœgîg*ý™ƒ‰Ù@"#½áÝCzß½¨c„“™Å›ã†!CH706ŸÐÊa2ÌŸÿ™ÍbaŸfÒÎ4a&$) 6ƒõÊ}3Ë’ØvÙˆ^ ‰ÉÍ5n Dbžÿd»Afž„¼{ÞœâEÿX˜ÿh„/d d/Í›1Ï|Ñcê$™îg½.¿B¡O è¾TÉCÒAݧYb@Fcgýá|½¼žÀãÿÿêšd2e™›ÿÑ3œ–2fœÎ!" ßß!ÿ!œg3Bt¢õ¾—Fd™ÍßÞàWÿ©ÿdbœâž‰ÿwþš.œfÒd!" Œÿtÿœ/ždÑbßÝàvþvþvþ‰ÿ‰ÿÿhigÿÿΙaÿΙaÿˆŠ‡ÿeÿfÎfÎfÎf›Îf›Îÿÿ|›Íf›Ff›Ff›Îf›Îÿÿÿÿše2ÿ1þÏÿΘaΘaΘahhgÿ44/44/44/ÇšüfΚe2ÿΘaΘaΘaÿÿ‰ÿÿΘaΘaΘaþÎaþ.ÿΘaΘaΘaˆ‰‡hhgÿmš3Ιaÿ›ˆŠ‡ÿše2ÿše2ÿˆŠ‡ÿˆŠ‡ÿˆ‰‡Î™aÿÿ2gŸ44/Θa44/2gŸhigÿhhgxÿÿhigÿhhgÿÿÿhigÿˆ‰‡še2ÿÿˆŠ‡ÿˆ‰‡Î™aÿ „ô8ô8 „þÍî%Uî%UþÍà×î#Wî#Wà×D…"ô8ô8D…"eÏ1î%Uî%UeÏ1B¬7î#Wî#WB¬7¨£„ô8ô8¨£„ÿýÍî%Uî%UÿýÍÞÛÕî#Wî#WÞÛÕ¨£„ô8ô8¨£„ÿýÍî%Uî%UÿýÍÞÛÕî#Wî#WÞÛÕ¥¤8ô8ô8¥¤8ÿþUî%Uî%UÿþUÕÝ]î#Wî#WÕÝ]žÿbÿh˜îg™ÜßÚ$!&ÌÌÑ44/ÉÍÉ737½¼CD㜖2djξ—FBiºààà ÌËÌ454ÌÌÌ444À@çš/fѽ5CËú¡¿/X¿$[|§¡¿/f›Fš21ÿf›Fm—E¿ 1òm—EýA´;Cu@YýA´eˆJg/êeeˆýg„uBT'dýg„eÜX¿$Å[Š¿L™Êš2µÑ›x•Ë¿ y%¬™|œâž±ÓUŽ”±œâžfÒdŠ»‡UW†fÒddÑb¬ºx{dÑbõ¿äý`|áÝCõ¿äï›Ð3ÐÊaï›Ðð˜Î )õÊ}ð˜ÎWÿNÿNÿNÿ¨£„‰ÿvþvþvþÿýÍŒÿRüýRüýRüýÞÛÕÿþÿŠÿÿÿ2gŸše2ÿÌÌÑše2ÿf›Îeÿ›eÿ›ÿÿ‰ŠÿÿêÿþÍÿ3ÿþÍÿ3ÿÿše2ÿf›Îše2ÿf›Îše2ÿf›ÎþÏÿ1þÏÿ11ÌÌÑ44/2gŸhigÿ˜˜™ÿÿÌÌÑ44/2gŸgaÿ.ÿffΚe2ÿf›ÎÌÌÑ44/2gŸÿþÿÿwþÿÿÌÌÑ44/2gŸþÏÒÿþ.ÿŸÒÌÌÑ44/2gŸˆŠ‡ÿhhg˜˜™ÿΘa2gŸΙaÿ2ÌŸ›Ιaÿ2gŸaÿ.ÿŸÒÿÿaÿ.ÿŸÒˆŠ‡ÿxwyˆ‰‡FÚºñ&FÚ2hŸÎ˜a2gŸ2gŸše2ÿ44/ÌÌÑf›ÎˆŠ‡ÿxwyhhg˜—hiˆÎ˜aºñ&ÿxwyhhg®—˜Rih®—˜êΘaºñ&ÿxwyhhg2üËî%UÛ«fœÎΘaºñ&ÿxwyþΊ»‡FÚ2hŸÎ™aÿ‰g ý`|R „/ý`|3wþÍF3 )Tà×K )¼{ÞR…//¼{Þ›1ÏwÏFF›1ϾTÉT¬KK¾TÉX]|¨£„/X]|¥„3ÿýÍF3þÎ"%+ÞÛÕK"%+ÞÐX]|¨£„/X]|db3ÿýÍF3š.œ"%+ÞÛÕK"%+œ/ž[\È¥¤8/[\È#«ÿþUF«2+#£ÕÝ]K+#£gbžÿb˜ÿh˜™îg™$!&ÜßÚ$!&44/ÌÌÑ44/737ÉÍÉ737CDã½¼CDãdjΜ–2djÎBiº¾—FBiº ààà 454ÌËÌ454444ÌÌÌ444@çÀ@çfÑš/fÑCËú½5CËú¬Kýc\žÿÿ¥¢´²üwv˜‡ÿhêyÿˆŠ}ÿwèœgîg*ý™Õý†®©Aÿ;eÅ›ãbõäweþaš.ŸfÒš2ïÐzfû`w7 ‰É–7ðÎß»½ÿbd¼ºŸÿꢅ´áÝCË–Ÿœƒ—fÜþψÐÊaÈ–šÿš«•¿mýÚÕÒuõÊ}YVWUàààÊÉËb¨žÿꈉ‡ÌË̬¬­—ÿÿh!ÿ!ŠŠŠÌÌ̪ªªñšßgWÿNÿá^CÑž¾©¦Y‰ÿvþÏ™a»g¡ýŒÿRüýõŸl¹e—SÞ!ÿ!Љÿÿÿ˜—™ÿše2ÿše2ÿΙaÿˆŠ‡ÿˆŠ‡ÿfÎfÎfÎeÿxÛyˆŠ‡ÿ››eÿˆŠ‡ÿsêxÿ3ÿþÍÿ3še2ÿše2ÿÿÿhigÿhigÿhigÿΙaÿΙaÿΙaÿše2ÿše2ÿše2ÿeÿeÿeÿf›Îše2ÿ44/1˜ÿÿ˜ÿÿ1˜ÿÿþÏÿ‰ÿ‰ÿ‰ÿ˜ÿÿ˜ÿÿ˜ÿÿhigÿhigÿhigÿf›Î2gŸhigÿ˜˜™ÿf›Î2gŸaÿ.ÿŸfÒf›Îf›Î2gŸÿÿŠÿf›Î2gŸþÏÿc0.ŸÒf›Î2gŸˆŠ‡ÿàßàÿ2gŸ2gŸþÏÿ2ÌŸ2gŸΙaÿˆŠ‡ÿˆŠ‡ÿ9f9faÿ.ÿaÿ.ÿÙu§ˆŠ‡ÿ44/î%UΘaÿˆŠ‡ÿˆŠ‡ÿÐÒÐÒaÿ.ÿaÿ.ÿÙu§FÚÛ«ÌÌÑFÚºñ&f›ÎÌÌÑšÐf›ÎFÚ˜—˜—ºñ&FÚ®—˜®—˜ºñ&xwyf0ú44/Û«2hŸFÚœ–2œ–2FÚºñ&X¿$X¿$š2š2¿ ¿ ý`|ý`|33 ) )“™“™babaˆ^ˆ^®´Ñ®´Ñ‰Œº‰Œº¬¯µ¬¯µýá|ýá|ÿÑ3ÿÑ3õõb˜™$!&44/737CDãdjÎBiº 454444üËìé IDAT@çfÑCËúÿÿÿÿÿÿÿÿhigÿeÿfÎfÎ2ÌŸˆŠ‡ÿˆ%‡›››xvyˆŠ‡ÿ›eÿ›xvyÿŠ…‰ŠwvˆÿþÍÿ3fœÎfœÎÿÿ ! higÿ ! higÿ06ŸÎ™aÿ06ŸÎ™aÿ44/še2ÿ44/še2ÿaš.eÿaš.eÿše2ÿ44/še2ÿ44/ÌÌÑΙaÿJg/˜ÿÿJg/˜ÿÿ1vþ‰ÿvþ‰ÿƒ—˜ÿÿƒ—˜ÿÿ˜˜™higÿ˜˜™higÿhigÿÿÿ˜˜™ÿaÿ.ÿeÿeÿŸfÒ›ÿÿ‰ÿ‰ÿŠwþþÏÿaÿ.ÿaÿ.ÿc0.ŸÒˆŠ‡ÿhigÿhigÿàßà˜—™þÏÿc0.aš.›ˆŠ‡ÿî%UŸÒŸÒŸÒˆŠ‡ÿxwyºñ&FÚ2hŸˆ‰‡ÿˆŠ‡ÿŠ»‡ŸÒŸÒŸÒÌÌш‰‡î%Uî%U2hŸÛ«še2ÿÎ52üËhigÿÌÌш‰‡ˆŠˆŠˆÛ«ÌÌш‰‡rŠˆrŠˆêêyÛ«ˆ‰‡ºñ&ºñ&fœÎÌÌш‰‡î%Uî%Uºñ&ºñ&Û« „X¿$X¿$ „þÍš2š2þÍà׿ ¿ à×D…"ý`|ý`|D…"eÏ133eÏ1B¬7 ) )B¬7¨£„“™“™¨£„ÿýÍbabaÿýÍÞÛÕˆ^ˆ^ÞÛÕ¨£„®´Ñ®´Ñ¨£„ÿý͉Œº‰ŒºÿýÍÞÛÕ¬¯µ¬¯µÞÛÕ¥¤8ýá|ýá|¥¤8ÿþUÿÑ3ÿÑ3ÿþUÕÝ]õõÕÝ]žÿÿhîgÜßÚÌÌÑÉÍɽ¼œ–2¾—FàààÌËÌÌÌÌÀš/½5^üLýc\žÿÿ¥Tµx˜‡ÿhêy‰Š+zèœgîg*ý™ƒ‰žã;eÅ›ãW¿fÎaš.ŸfÒ‰›jþÉ`w7 ‰É†šÀ˜ÿbŸáêƒb÷›`œfÑÜΙé½`ÿšmÏÚÊœòžXVWUàààÊÉ˧éiˆ‰‡ÌË̬¬­ÿÿf!ŠŠŠÌÌ̪ªªßßWÿZNÿá^CÑž¾©ÿsvþÏ™a»g¡wþ­þ"RüýõŸl¹e—tÿ©ÿ²ü²ü²üwþŠŠŠtÿ®®®ÿÿŠŠhigÿhigÿÿÿ˜˜™››xvyxÛy›eÿ›xvyˆ%‡›eÿév{rŠˆ‰Šxÿ3ÿþÍÿÿÿše2ÿše2ÿÿÿše2ÿše2ÿhigÿ ! àßà ! higÿΙaÿ06ŸÐÊa06ŸÎ™aÿše2ÿ44/ÌÌÑ44/še2ÿeÿaš.ŸfÒaš.eÿf›ÎΙaÿÌÌÑ44/ÌÌÑ44/˜ÿÿJg/¶™ÑJg/˜ÿÿ‰ÿvþŠvþ‰ÿ˜ÿÿƒ—}icƒ—˜ÿÿhigÿ˜˜™hhg˜˜™higÿhigÿ˜˜™ÿÿÿÿaÿ.ÿŸfÒ›››eÿÿÿŠwþwþwþ‰ÿþÏÿc0.ŸÒŸÒŸÒaÿ.ÿˆŠ‡ÿàßà˜—™˜—™˜—™higÿþÏÿc0.ŸÒ“fÍxvyxÛyf›ÎeÿÛ«hhgàßàšÐhhgxwyšd2xvyxÛy1eÿf›ÎxvyFÚxwy2hŸf›ÎΙaÿ44/˜—™f›Îf0úΙaÿf›ÎxvyFÚxwyˆf›Îf›ÎxvyFÚxwyˆf›ÎÿxvyxwyxwyfœÎÿf›ÎxvyFÚxwyxwyxwyf›ÎQ¤ƒX¿$žÿX]#Q¤ƒvþËš2ÿh2vþËRÜÔ¿ îg& RÜÔ¥¤8ý`|²ü¯\}¥¤8ÿþU3ŠŠ5ÿþUÕÝ] )®®$,ÕÝ]„“™Å›ãX|„/ÍbaŸfÒg3/Í èˆ^ ‰É(Š' èD…"®´ÑàààŽ”±D…"eÏ1‰ŒºÌËÌUW†eÏ1B¬7¬¯µÌÌÌx{B¬7¨£Ýýá|²{¯\}¨£ÝéþÎÿÑ3‹1Š5éþÎÿÚöõ®/®$,ÿÚöbžÿ˜ÿh™îg$!&ÜßÚ44/ÌÌÑ737ÉÍÉCDã½¼djΜ–2Biº¾—F ààà454ÌËÌ444ÌÌÌ@çÀfÑš/CËú½5dbQ¤ƒQ¤ƒQ¤ƒš.œvþËvþËvþËœ/žRÜÔRÜÔRÜÔÿÿŠhigÿ˜˜™eÿ›eÿxvyeÿ›eÿxvyˆŠ‡ÿxvyÿÿýsvÿŠ…v{‡sŠÿwþ3f›Îf›Îhigÿ ! ! àßà ! Ιaÿ06Ÿ06ŸÐÊa06Ÿše2ÿ44/44/ÌÌÑ44/Îÿaš.aš.ŸfÒaš.m43ÿÌÌÑÌÌÑ44/ÌÌјÿÿJg/Jg/¶™ÑJg/(hÿvþvþŠvþŽ˜ÿÿƒ—ƒ—}icƒ—Îigÿ˜˜™˜˜™hhg˜˜™ÿhigÿ˜˜™ÿÿŸÒaÿ.ÿŸfÒeÿ›ÿþÿЉÿwþw1þÏÒÿc0.aÿ.ÿŸÒÒˆŠ‡ÿàßàhigÿ˜—™˜—þÏÒÿc0.aÿ.ÿŸÒxvyeÿ›f›Îhi5ÿ˜˜™ÿhigÿf›Îxvyeÿ›ÌÌÑÿše2ÿfœÎΙaÿ2gŸ2gŸΙaÿ2gŸÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎÿše2ÿfœÎÌÌÑÿše2ÿfœÎ¯\}¨¤ƒ®´ÑRL/®õÑàÕàr£O¯\}á\~èþˉŒºwtF‰òºÌ½Ì«þzŠ5$"íÜÔ¬¯µTQK¬‰µÌ¼ÌˆÚ®$,[Þ+¥¤„®´ÑRL/ÿ´Ñ‘ààrlO[\ÈX\ôÿþ͉ŒºwtFÿŒºUËÌ«©z«*! Õà׬¯µTQKþ¯µxÌ̈…+#£{d|m„®´ÑRL/Ñà’à¨lgýá|ÿÑ|ž/͉ŒºwtF'%ºÌVÌÿ©ŸÿÑ3$ x 謯µTQK$%µÌzÌØ…¢õ¼{UR…/®´ÑRL/®´àààrlO¼{Þò‹ÏwÏF‰ŒºwtF‰ŒÌËÌ«©z›1Ï##ñT¬K¬¯µTQKÌÌ̈…¾TÉX¯#¨£„®´ÑRL/ÿXÑ‘³àr¤OX]#n\2éþ͉ŒºwtFÿŠºV†Ì«þz2ê$ÿÚ謯µTQKþ‹µx†ÌˆÜ& dX]|§žXb3ÿÿéiœ"%+ßßf!žX]|b@zŸ½d3šd22hŸš."%+œg3-f–œ/X]|b@[|ãd3šd22Κ."%+œg3"0Íœ/X]|675ª©«.-3TTSxwyF.I"%+VVVvvvF/HX]|e[ýäd3™.Òš."%+›0"Ðüœ/¢´¡´ÿˆhˆÕý†a†b›'O_>ì IDATAš2f92e–7‹67h@hžAe ddC éOÕb¨ª++—ÿCCñšßgDUD‰©¦©ýŸdýgžÿSÞgu¼{Þ›1ϾTÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÏÿ2ÿþÏÿ2ÿˆŠ‡ÿxwyÿÿÿÿše2ÿfœÎÿše2ÿfœÎÿÿþÍÿ3ÿše2ÿfœÎÿˆŠ‡ÿxwyÿÿþÍÿ3ÿše2ÿfœÎÿše2ÿfœÎÿÿWÿNÿ²ü©ÿ‰ÿvþŠwþ!" ŒÿRüý®tÿßÞàdbAåž¿bœâžš.œeÑd›/œfÒd!" œ/žBÌ`¾4 dÑbßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàÿLýc\¤ý´ÿx˜‡éhyˆ!" þxèœgd™÷ˆßÞà675Ê+s6ÕÊÉËTTSÃC¬=½T¬¬­!" VVV›D‰e¼wªªªßÞà675 àààÊÉËTTS454ÌË̬¬­!" VVV444ÌÌ̪ªªßÞàdbÒÓ ª©«š.œº&·454xwy!" œ/žº'¸444vvvßÞàÿLTµN…ÿ[|ÿx‰ŠuÏþ2!" þxƒ‰RÑì"0ßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàÿLý´ÿxˆ!" þx÷ˆßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàVWUª©«ˆ‰‡§§§òòòŠŠŠ§§§®­¯ÿLýc\¤ý´ÿx˜‡éhyˆ!" þxèœgd™÷ˆßÞàdbœâžš.œfÒd!" œ/ždÑbßÝàΙaÿÌÌÑfœÎÿše2ÿfœÎÿÿšd2fœÎÿšd2fœÎÿšd2fœÎÿšd2fœÎÿšd2fœÎÿšd2fœÎÿšd2fœÎþÏÿ2ÿˆŠ‡ÿxvyˆŠ‡ÿxvyþÏÿþÎ2ÿÿþÏÿÐÊaþΟ2ÿÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿeÿœÿš/œÿeÑdFÚxÿÿÏ™ahŸ44/œÎše2ÿfœÎÿ44/šfœÎÿÿÏ›”ÿýÍ3ÿÿ44/œÎÏ›”ÿýÍ3ÿÿ44/šfœÎÿÿ44/œÎWÿNÿ²üNÿü2vþŠvþÿ$ÿRüý®Rüý·bAåž¿bAåžb6:eÑd›/œeÑd/œ##"BÌ`¾4 BÌ`œ4 CÞBdbœâždbœâžš.œfÒdš.œfÒdœ/ždÑbœ/ždÑbÿLýc\¤ýc\ý,˜‡éhy˜‡éh þ èœgd™èœgd67Ê+s6ÕÊ+s6ÃC¬=½TÃC¬TT#$#›D‰e¼w›D‰e¿¿¿ ààà 454ÌËÌ454#$#444ÌÌÌ444‰ˆŠdbœâž65ª©«dbœâžš.œfÒdT&Sxwyš.œfÒdœ/ždÑbV'Vvvvœ/ždÑbÿLý´ÿ[|ÿLý´ÿxˆÿ2ÿxˆ þx÷ˆÿ"0 þx÷ˆdbœâž¥²üNÿbœâžš.œfÒdÿÿŠvþ/œfÒdœ/ždÑbÞûþ®Rüýœ4 dÑbÿLý´¥„„ýá|^{Lý´ÿxˆþÎ/ÍÿÑ31xˆ þx÷ˆÞÐí èõ+.‹÷ˆÜžÀádbœâžÌdšÒš.œfÒdÎe–Ðýœ/ždÑbdbœâždbœâžš.œfÒdš.œfÒdœ/ždÑbœ/ždÑbdbœâždbœâžš.œfÒdš.œfÒdœ/ždÑbœ/ždÑbVWUª©«b@žÀ㈉‡xwyšd2•ÌüŠŠŠvvvœg3•ÊþÿLýc\bÞužc‹ý,˜‡ƒÍ3}˜Íéh þ èœg«ÍTUœ¬dhdbþ"»dbœâžš.œ6–šœfÒdœ/ž8•œždÑbΙaÿÌÌÑfœÎΘaΘaÿˆŠ‡ÿhhghigÿÿÿˆ‰‡44/î%U44/ˆ‰‡Î™aÿÿÿˆ‰‡ï›Ðî%Uï›Ðˆ‰‡‰ÿÿÿˆ‰‡fÎî%UfΈ‰‡eÿÿÿˆ‰‡}3Íî%U}3͈‰‡˜ÿÿÿÿˆ‰‡e›Îî%Ue›Îˆ‰‡ÿÿÿÿˆ‰‡Çšüî%UÇšüˆ‰‡aÿ.ÿÿÿˆ‰‡}3Íî%Ue›Îÿÿ˜ÿÿÿþÏÿþÏÿÿþÏÿþÏÿÿΙaÿþÏÿÐÊaÐÊaþÎÿΙaÿFÚFÚÿv{v{ÿ1ÐÊaÐÊa2ÿ12ÿ44/44/44/44/44/44/aš.þΚ/œÿ4jÅ4jÅ›/œxÿˆŠ‡ÿºñ&ºñ&hhgˆŠ‡ÿÿxÿ›e2ÌÌÑ2gÿxxÿÿxÿxÿ2g2gÿxxÿÿfœÎ44/ˆŠ‡ÿÌÌÑÌÌÑe™›ˆ‰‡ÿÿÿ1el1el«—ÿÿeÿeÿ2ÌŸ2ÌŸdeÿÿˆŠ‡ÿˆŠ‡ÿˆ‰‡ˆŠ‡ÿÿÿÿ1el1el«—ÿÿˆŠ‡ÿÌÌÑÌÌÑe™›ˆ‰‡ÿxÿÿÿ1gŸ2gÿxxÿ675 VWUTTS454ˆ‰‡VVV444ŠŠŠWÿN…ÿ¥„‰ÿuÏþþÎŒÿRÑìÞÐí@FCFCFC¨£„f.hj1hj1hj1ÿýÍj0fk0fk0fk0ÞÛÕþ"»†aCb@6–Θašd28•Óšjœg3BC¿¥¤C¦a!ejÿþdÿ˜+Bk’ÞÜjÞš0b@ž'ò IDATšd2œg3¨AÜô8ô8¨AÜèfÎî%Uî%UèfÎíAöî#Wî#WíAöAfžô8ô8Afžd dî%Uî%Ud dB¡Oî#Wî#WB¡OÌÌÑÌÌÑ44/šd2f›ÎˆŠ‡ÿxwyˆ‰‡àßà˜˜™hhg ! ÿxwy‰‡FÚºñ&FÚ2hŸÎ˜aºñ&ÿxwyˆŠ‡v{ÿŠ…v{wþ‰ÿÿŠ…ÿxwyˆ‰‡xÛyˆ%‡xÛyœdˆ%‡ÿxwyˆ‰xqòˆxéi—ÿqòˆÿxwyЇwvy‰Š‡wvyÿÿ‰Š‡ÿxwyˆ‡Ùu§'‹YÙu§ŸÒaþ.'‹Yÿxwyˆ‰wvy˜ÿéi—ÿéhÐÊaŸÐÊaŸ1elgŸ1Ιÿ2ÿ1elÿgŸxÿ2gxÿˆše2ÿšÿf›Îše2ÿÌÌÑšd2ÿf›ÎÿþÍÿikššÐhhg—•fÿ3ÿ‰ÿÌÌÑï›Ðše2fœÎÿÿhigÿÌÌËî%Ušd2Î5ÿ˜˜™ÿÿgŸÿŠÿEš3Ð3Ÿ˜ÿÿfhygžêy˜ÿÿéhxÿˆ‡àßà ! ˆ‰‡xvñÿˆf›xšeºšeºf›Fˆÿxÿˆÿxˆÿxˆhigÿ2ü˺ñ&šd2Î5ÿ˜˜™ˆ‰‡wtFF3ÿ™›hhg®—˜ÿêyÿhÿêše2ÿ44/2gŸeÿœdœdˆ%‡ÿv{ÿŠ…àßàˆ‰‡ŽvxÿéxÿhÿéÿvyþÍ3ÿ™›hhg˜—ÿˆÿxˆÿxÿ‰NÿvþRüýAåžeÑdBÌ`dbš.œœ/žýc\˜‡èœgÊ+sÃC¬›D‰ 454444ÒÓ ààà ààà 9 âº&·454ÌËÌ454ÌËÌ4[4Òº'¸444ÌÌÌ444ÌÌÌ4[4ÑTµN…ÿ²{N…ÿ²{¢…´[|‰ŠuÏþ‹1uÏþ‹1þψ2ƒ‰RÑì®/RÑì®/ÕÒu"0¥²üAåžœÿÿŠeÑdfÞûþ®BÌ`¥„„¢…´[|þÎ/Íþψ2ÞÐí èÕÒu"0dbš.œœ/ždbš.œœ/žVWU éÈô8㈉‡Û«î%UÌ§ŠŠŠÝ©î#WʧX¿$¨L/X¿$Èš2ètFš2«¿ íQKK¿ ¿šbOfž-㿚bžœ`œv dEΜ`œd¾_±T¡Oº¾_±b44/2gŸΙaÿ2gŸΙaÿ›ÎFÚxàßà ! FÚxÛ«ÌF4ºñ&v{Û«e0ïv{ÿŠ…xÛyÛ«š2fÛyˆ%‡xyÛ«ƒ«}3ÍqòˆwvyxÛ«›e2wvy‰Š‡Ùu§wÛ«9fÇš§'‹Yxywvy˜ÿqòˆxˆŠ‡ÿºñˆ‰‡xwyÿÿÿÿgŸ‰Š‡ˆ‰‡xwyÿÿ3ÿþÍÿ‰Œººñˆ‰‡ÿ3xÿˆxÿˆxÿšeºf›Îše2ÿf›Îše2ÿf›Îše2ÿf›Îše2ÿf›Î3ÿþÍÿÿÑ3/Í3ÿše2ÿfœÎ‰›Ðe0fœÎ‰ÿwþÿÿše2ÿf˜™ˆ‰‡ÛËÛ«Î5˜˜™šd2Ï4/1gŸÿþwgŸ˜ÿÿéh‰ÿuψ‹1whˆ˜ÿÿéhyÛ«F4/ºñšeº44/Î4é2hšeº44/2hše2ÿf˜™ˆ‰‡ÛËÛ«Î5˜˜™šd2î33ÿýÍwtFikš˜‡éhyêy‡ˆŠ‡ÿî2gyš244/2œŸÛ«44/šÐ ! àßàx˜‡hyêy‡‰Š‡wtF33ÿýÍwtFikššeº44/2h²üNÿŠvþ®Rüý¿bAåž›/œeÑd¾4 BÌ`œâždbfÒdš.œdÑbœ/ž¤ýc\éhy˜‡d™èœg6ÕÊ+s=½TÃC¬e¼w›D‰ààà ÌËÌ454ÌÌÌ444NÿvþRüýýá|ÿÑ3õb@$!&ÜßÚœâždbšd244/ÌÌÑfÒdš.œœg3737ÉÍÉdÑbœ/ž¦a!ÿC"½Þœâždbÿ˜+f9šÇfÒdš.œÞš0B:¾ÆdÑbœ/ž éÈžÀãVW8Û«fœÎˆ‰UÝ©d™ÍŠŠWýá|„ÿÑ3/Íõ è„ýá|/ÍÿÑ3 èõí†yÌÌÑf›Îše2ÿÌÌш‰‡xwyΘa˜۫̈‰‡î2hyΘaÛ«e0ˆ%UîxΉÿÛ«š2î‰UîwÎdÛ«ƒ«î‰‡îéiÛ«›e2ˆ%UîΚd2œÎÛ«9f'‰‡îŸyšd2ŸÛ«ƒ«î‰‡‰éi—ÿÛ«ˆŠ‡ÿxwyˆ‰‡xwyˆ‰‡xwyÿÿˆŠ‡ÿwyˆ‰‡xwyˆ‰‡xwyÿÿ3ˆŠ‡ÿxwyÿΙéÿ2ghiΙé/›ÎÎ5Î44/›ÎÎ5Î44/›Î«x«44/›ÎßieÿßÎwþΘaÿ2gŸ44/œÎxÛyüÎ44/2gŸ‰ÿþ·b2vþ1vþw·b™ºñ‡î2Ìyˆ%‡xvyΙaÿºñ‡î2ÌyΙéºñ‡î2ÌyΙé/œÎxÛyüÎ44/ºñÿýÍ3ÿýÍéhy˜‡éhyˆŠ‡ÿàßàÿhhgf0úº%&î“f§hÎ4aÚºŠ…î2gñˆŠ ! éhy˜‡éhyÿýÍ3ÿýÍΙéºñ‡î2ÌyΙé‰g.ç-œÉž675ÊÉË.ç-FÚIf¬dTTS¬¬­FÚIFÙHdªbVVVªªªFÙH¬K©|´W©ÿ¬{L´wvw2ˆ‰wþw1xˆ}ÿwt0ˆŒtÿ}.‹ˆÀá½ähAšÒ–Ï™e–Ðý•Ðt@$!&†!&Üß»â44/Î4/ÌÌ–Ò737Óš7ÉÍ•ÑÿC"¥C"½¿œŸf9ÿf9šfhB:ÞÜ:¾’fb@$!&ÜßÚžÀãšd244/ÌÌÑfœÎœg3737ÉÍÉd™Í¨AÜýá|ýá|¨A„[èfÎÿÑ3ÿÑ3èfÍhíAöõõíAè+Afž„„Af|œ|d d/Í/Íd 3f2B¡„)à IDATO è èB¡02gŸΙaÿ›Î44/2gŸf›ÎÎΙaÿ2hŸ2hŸf›ÎÎΙaÿ2hŸ2hŸf›ÎÎΙaÿ2hŸwþf›ÎÎΙaÿ2hŸœf›ÎÎΙaÿ2hŸf›ÎÎΙaÿ2hŸfœÎf›ÎÎΙaÿ2hŸfœÎf›ÎÎΙaÿ2hŸéif›ÎΙ/ÿxÿàßàÿxvyΙaÿ2gŸFÚxÿàßàÿxvyΙaÿ2gŸhigÿàßàhhg˜˜™ÿ2gŸ˜˜™ÿhigÿ2gŸ˜˜™ÿhigÿ2gŸ˜˜™ÿhigÿ2gŸˆxÿ2gŸhigÿ˜˜™ÿhigÿ˜˜™ÿ2gŸ2gŸÿœd2gŸwþ‰ÿ2gŸÿÿ2gŸeÿœÿeÿxwy2gŸeÿœÿeÿ2gŸeÿœd2gŸˆŠ‡ÿœd2gŸˆŠ‡ÿ‰ŒºwtF‰ŒºwtF‡êyÿh‡êyÛ«ˆ‰‡xvy˜aÿ.ÿŸÒwaþ.2gŸ‰ÿwv‰Š‰wvvˆŠv{x‡êyÿh‡êy‰ŒºwtF‰ŒºwtF2gŸeÿœd2gŸWÿ675 VWUÇTTS454ˆ‰‡¥VVV444ŠŠŠ¥WÿN…ÿ¥„^{‰ÿuÏþþÎ1ŒÿRÑìÞÐí+.[ý¥ÿ²üNÿ¿bâžÿÿþŠvþ›/œÒd"Þûý®Rüý¾4 Ñb[|¥„|„ýá|^{L´2þÎ3/ÍÿÑ31xˆ"0ÞÐ èõ+.‹ˆdbD„"š.œeÏ1œ/žB«7zŸ½dbž2hŸš.œd-f–œ/žb[\½dbßœš.œd"$–œ/žb°ÖòP*†¼òzDƒ¼ì}D¥¤8ýá|²{N…ÿ¯\}¥¤ƒWZIÿÑ3‹1uÏþŠ5ÿþË(õ®/RÑì®$,ÕÝÔ¦‡h„®´ÑRL/±ÓU¥„«YJ/͉ŒºwtFŠ»‡þÎy$í 謯µTQK¬ºÞÐc 2gŸÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎÌÌÑÿše2ÿfœÎ2gŸhigÿ˜˜™ÿhigÿ˜˜™ÿ2gŸ2gŸhigÿ˜˜™ÿhigÿ˜˜™ÿ2gŸ˜˜™ÿhigÿÿÿÿÿÿÿÿÿÿÿ›e2›Î›e2šÿf›Îš2fΚ2fΚ2fΚ2fΚ2fÎÿš2ÿfÎxvyš2ÿfÎÿš2ÿfÎwtF‰ŒºÿýÍêÿÿêyf›Îše2ÿf›ÎΙ/ÿx9fŸÿ9fÿŸwþšeºÿfœþÿšeºÿfwÎÿêÿÿêywtF‰ŒºÿýÍš2fÎÿš2ÿfÎNÿvþRüýAåžeÑdBÌ`dbš.œœ/žýc\˜‡èœgÊ+sÃC¬›D‰ 454444¥NÿAåžœÿÿvþeÑdfÞûþRüýBÌ`¥„ýá|¢…´[|þÎÿÑ3þψ2ÞÐíõÕÒu"0¼{Þ›1ϾTÉ$!&†!&z꽜µž44/Î4/5Ü¡fŒd737Óš7/Ü™dŠbÿC"¥C"½ÞZŸžf9ÿf9šÇhdB:ÞÜ:¾Æ"fbžÀãb@Üßèô8VW8fœÎšdÌÌî%Uˆ‰Ud™ÍœgÉÍÝî#WŠŠW[\È¥¤„®´ÑRL/ÿXÑ‘³àr¤O[\ÈX\ôÿþ͉ŒºwtFÿŠºV†Ì«þz«*! ÕÝ謯µTQKþ‹µx†ÌˆÜ+#£Öॄ|áÝC#½0 C¯\}O…ÿ[|[|þÎ3ÐÊa06ŸFaŠ{vÏþ2!"ÞÐõÊ} 6ƒI}®$,TÑì"0óše2ÿf›Îše2ÿfœÎÿše2ÿf›Îše2ÿ44/2gŸše2ÿfœÎÿše2ÿ44/2gŸÿþÍÿ3ÿÿþÍÿ3ÿÿΘa2gŸÿΘa2gŸše2ÿfœÎÿše2ÿ44/2gŸΙaÿ2gŸše2ÿ44/2gŸþÏÿœ–2f›Îhigÿ˜˜™ÿþÏÿÐÊa2gŸ˜ÿÿÿhêyš/$fÑdš/œÿfÑdÿÿÿþÍÿ3ÿše2ÿfœÎÿÿšd2f›ÎˆŠ‡ÿxvyÿþÍÿ3ÿÿΘa2gŸÿþÍÿ3ÿhigÿ˜˜™ÿÿþÍÿ3ÿÿdbAåž¿bœâžš.œeÑd›/œfÒd!" œ/žBÌ`¾4 dÑbßÞàdbœâžš.œfÒd!" œ/ždÑbßÞàÿLýc\¤ý´ÿx˜‡éhyˆ!" þxèœgd™÷ˆßÞàb¨žX—ÿéi!" ñšßf!ßÞàb¨žX—ÿéi!" ñšßf!ßÞàb¨žX—ÿéi!" ñšßf!ßÞàÿLý´ÿxˆ!" þx÷ˆßÞàÿLý´ÿxˆ!" þx÷ˆDúàý$Üã462ÿÊÎ#$$7/ÿÉÑD®ÜVWUª©«VWUª©«/0.YYY§§§YYY™™™111YYY§§§YYY«««ª©«ˆ‰‡§§§|||§§§®­¯K(9¤î¼äê xµt'Zû–ÑØ4ýŒþ!" v5ZÜú•öÑ.þŠýßÞàWÿ aAfž¿šbó៩ÿ‰ÿ/šd dœ`œïÑfwþ!" Œÿ0B¡O¾_±ðÐctÿßÞà§b¨AÜX¿$žÿYÿÿ˜èfΚ2ÿhê!" ßß™íAö¿ îg!ÿ!ßÞàVWU éÈ$!&ÜßÚô8ª©«ˆ‰‡Û«44/ÌÌÑî%Uxwy!" ŠŠŠÝ©737ÉÍÉî#WvvvßÝàše2ÿfœÎÿÿf›Îše2ÿf›Îše2ÿf›ÎQ­C IDAT44/œÎ44/›Îÿÿÿ‰ÿï›ÐÌ44/‰ÿe0f›Îÿÿêÿ44/šfœÎÿÿ‰ÿï›ÐÌ44/‰ÿe0f›ÎÏ›”ÿýÍ3ÿÿÏ›”ÿýÍ3ÿÿÿÿÿ›ÌÑ44/‰ÿvþxÿÿÌ̺44/xÿˆfœÎΘaœÎxÿÊ$Ì–44/š/œÿfÑdΙaÿ2gŸxÿf›šº44/xÿšeºf›Î˜ÿÿœ–344/›Fÿ˜‡éhÿÿ1ÌeÑ44/‰ÿvþ˜ÿÿÿhêyˆfÑÿÿcÿêþÏÿœ`d d`œÿfÑdÿÿÏ›”ÿýÍ3ÿÿfœÎΘaœÎhigÿ2üË44/œÎÿhhg˜—™ˆŠ‡ÿÛ«ˆŠ‡ÿxvyÏ›”ÿýÍ3ÿÿ˜ÿÿÌÌ344/xÿ˜‡éhÏ›”ÿýÍ3ÿÿ–f™˜˜þÎ1Ï›”ÿýÍ3ÿÿdbAåž „®´ÑàààoÌžb6:eÑdþ͉ŒºÌËÌ««d/œ##"BÌ`à׬¯µÌÌ̈¥`œ4 CÞBdbò9óàààdbœâžš.œî[ëÌËÌšœfÒdœ/žî[ìÌÌÌœždÑbÿL¢…´^{ýc\¥"´[{xþψ1˜‡ç7ˆ,RxÕÒu+.èœgí6up¨¤ýc\b¨5Wéhy˜‡—ÿñ%d™èœgñšß¦©¤ýc\b¨5Wéhy˜‡—ÿñ%d™èœgñšß¦©¤ýc\b¨5Wéhy˜‡—ÿñ%d™èœgñšßCMý´ÿLÿLý,ˆÿxÿx þ ÷ˆ þx þxÿ´ý´ÿLÿLý,ˆÿxÿx þ ÷ˆ þx þxhý$Üãý$Üã62ÿÊÎ62ÿÊÎ7/ÿÉÑ7/ÿÉÑVWUª©«VWU/0.YYY§§§YYY111YYY§§§YYYåNÈÅ›ãVUÙu§ŸfÒˆ%‡ÜR© ‰É„%ŽKµ9µKµtýŒþZýŒþtýŒþvþŠýZþŠývþŠýWÿ aóáŸó០aWáŸ2/šïÑfïÑf/š‰Ñf$ÿ0ðÐcðÐc0ŒÐcS§bžÿAžÿbž§ÿX˜ÿhfÿh˜hÿß™îgÚîg™ßgßVWV éÈô8îô8 éÈVWU222Û«î%UÚî%UÛ«ˆ‰‡###Ý©î#Wàî#WÝ©ŠŠŠUSVfœÎΘaœÎše2ÿ44/2gŸf›Îše2ÿf›Îxÿ44é›ÎˆŠ‡ÿxvyeÿÿ›gŸedÿœÿhigÿ!—›šÐ!—›higÿ!—›wþΘaÿgŸe0ï›Ð»›Ðše2ÿf›ÎêΘaHgÿê‰ÿÌÌÑ44/e›Îïwþÿd0ï›Ð»›Ðše2ÿf›ÎˆŠ‡ÿ1eFÏ›”ikšÿýÍ3ÿÿaÿ.ÿ1ÿlÏ›”g3ÿýÍ3ÿÿï›Ð0jÎ0Ï1ÿÿf›F›xÿˆhigÿ2ü˺ñ&šd2Î5ÿ˜˜™šdººf›F›Üše2ÿÌÌÑšeºf›F›še2ÿf›Îf›FþjˆþÏɇ˜ÿÿéhhigÿ˜˜™hhgÿ˜—™ï›Ð»›ÐÿÿéhΙaÿI˜ž‡‡ÿéhêyxÿœ`$1ÿdΘa2hŸÿÿše2ÿ1elÏ›”3Ιaÿ2hŸÿÿhigÿ2ü˺ñ&šd2Î5ÿ˜˜™fœÎþjÎþÎjšhigÿ˜—™ˆŠ‡ÿxvyΙaÿ2gyˆŠ‡ÿxvyhigÿ1efÏ›”3ˆ‰‡xwyÿf›F›˜ÿÿéhÿÿelÏ›”Š5še2fœÎÿÿhigÿ2™jšghiÿ˜—™˜ÿÿ1eÎÏ›”2ÿþÍ3 „®´Ñ ‘.çþ͉Œº454UFÚà׬¯µ444xFÙò9óàààÒÓâî[ëÌË̺&·Òî[ìÌÌ̺'¸ÑáÝCTµN…ÿ²{N…ÿ²{µábCÐÊa‰ŠuÏþ‹1uÏþ‹1ŠÐ™aõÊ}ƒ‰RÑì®/RÑì®/‰õ›}TµNÿ[ý\‰Švþ‡ƒ‰Rüý"gýA´;eÅ[ã\eˆaš.ŸÒ‡ýg„`w7š$Íg38é ª©«\TUÛ454xwy‡MXÞ444vvvgWÿNÿ[ý‰ÿvþŒÿRüý"WÿNÿ[ý‰ÿvþŒÿRüý"¨£„Þ¾¿zŸ½ÐÍŸÏ›”a˜Í­ª¤õ¿•^—ÇŽ‹;euÅ›ãbô¶™Ñaš/ŸfÒš2¬uwT ‰É–7î(„¤9DD¤îõäŽuZÿj/*jýðÑ-Ž1Zk 7kßúïöNý žN…ÿžYJÿduÏþd$ìORÑìO¨±ÝA¨£ÝAWZÎféþÎf(ÚÿÚöÚ‡dî!&î0 î!&îFÚ4/ÚFÚ4/Ú&37àIà37àhigÿ——™ÿ‰ñ&šd2Î5ÿ˜˜™šd244/ÌÌÑše2ÿî%UfvyxÿÌ–;fÑdeÿœeœdhgÿ˜—™higÿ!—›ßie!—›wþ‰ÿwþhigÿ2ü˺ñ&Ìe2h5ÿ˜˜™f›Î‰ÿf›ÎΙaÿ2gŸhigÿ2ü˺ñ&„e3Îgÿ˜˜™‰ÿvþ›ÎŠ1›Îf›Î‰ÿf›ÎΙaÿºñ&àßàikš‰Œºˆ‰‡Ùu§ÿŸfÒŸ3baaþ.Ò‰ÿ‹1wþΙaÿ2gˆxÿˆΙaÿÌÌÑf˜™ˆ‰‡ÛËÛ«Î5˜˜™šd2ÊjÜf›Îf›ÎFÿf›ÎΙaÿIÿéhxÿ1xΙaÿšÐ!—›wþhhg˜˜™higÿ—™‰ÿΙaÿ2gŸÿÿ1eη›b2gˆš/œÿ|Ñc„/|Ñc„/fÑÜÿ2hŸÿše2ÿf›Îf›3ÌÌÑšd2ÿf˜™ˆ‰‡ÛËÛ«Î5˜˜™šd2Θ—™ÿ2ÿ™Ιaÿ2gŸÛ«ˆŠ‡ÿºñˆŠ‡ÿÛ«higÿ˜˜™˜˜™àßàhhg¯éhxÿéhΙaÿ1gŸŠ5e›Îeiigÿ!—›wþhhg˜˜™higÿ¯/˜ÿhh2žš2˜ÿÿ‡cO¬«±TUwvy‰Š‡Tqt¬Œ.ç-ÒÓFÚIº&·FÙHº'¸ÜßÚ/bB½N…ÿ/bBÜßÚ5ÌÌÑE™_ŸuÏþE™_ÌÌÑ7ÉÍÉG›iƒRÑìG›iÉÍÉ/bB#½|E™_ÿ6Ÿ2G›i6ƒ0¥ÃDãÅÿ›ÿjÒŸØ–kºš RL/ª©«454wtFxwy444TQKvvv/bB#½|E™_ÿ6Ÿ2G›i6ƒ0©c§QAÜ]|Ž˜ývfÎ3e›ÞRAö%+ý$627/¨£„Þ¾¿"BA†ÐöÐÍŸÏ›”1elŸ”ºñ­ª¤õ¿• Ak¢·ðŽ‹;eu›žãV8¶™Ñaš/ffΈU‹¾¬uwT‹jþÉ„WØ|\Kµ(„¤î¼äêÀxKÀê2xtýŒþ*Îý–ÑÕœ2týœþö¾ vþŠý7Ðßú•öÏ›+vþ›ýSbX]#bžÿ¨£ÝX]#bžÿn\2˜ÿhéþÎ2˜ÿhê$™îgÿÚö& ™îgV4 éÈô80 îÐö éÈô8ñ&Û«î%UFÚºñ&Û«î%UÝð Ý©î#WIà·ð Ý©î#Wše2ÿf˜™ ЇÛ«Û«Î5˜˜™šd2f›ÎxÿœˆÿxˆΚe2ÿf›Fš/œÿ4Åxš244/2œŸ!—›˜—ý—êˆßiešüËÿf˜™ˆ‰‡ÛËÛ«Î5˜˜™šd244/ˆ%Uÿÿxvñˆ2gŸše2ÿf˜™ˆ‰‡ÛËÛ«Î5˜˜™šd2ï›ÐŠŠvþvþw44/ˆ%Uÿÿv{2gŸ‰Â6 IDATˆŠ‡ÿ—•fikšàßà ! ÿ™Íg3ŸfÒaš.Ï™aˆñ&ÿÿvy2gŸΙaÿºñ‡ÿxv2gŸΙaÿœÎÛ«djΜ–44/º%ëˆ[xv44/ˆ%Uÿ‡ÿxvy2gŸΙÿºŠ‡ÿ‡ÿxvy2gŸhigÿšd2Θ˜™f™aˆñ&ÿÿˆÿ2gyÿÿêyÿÿÿfÑdcÿ|Ñcêy|чêˆÿˆ‰‡ÿxvyΙaÿ2gŸf›Îše2ÿ44/œÎÛ«djΜ–šd244/4ú Їÿÿ2gyše2ÿf›ÎÎˆŠ‡ÿxvyše2ÿΈ‰‡xwy˜˜™hhg·bºŠ‡ÿ‡ÿºñ1e0ï›ÐŠvþšd2Θ˜™—˜éþÎ2ÿh˜ý`|b¿bÇoåË¿-3/œ›/œ¥«Ñ­›/I )4 ¾4 ¥ˆÌ¨¾4HÇ ÊâËÊËâdbÊË¥¬Ò­¬­Òš.œ¬­¥ªÑªªªÑœ/žªªž"‹¤Lýc\¿¤}3Íégyx˜‡é›y*!U3¬d™‹èœg—™B†ÿ›#½[|†aC¥„½[|Xb¨·b06Ÿ2ΘaþΟ2—ÿâ‹ 6ƒ"0ÓšjÞЃ"0!ñšß¥¡X[|¥¥„[|Xb¨èhÿÏ2ÿÿþÏ2—ÿíaÕï"0ÞûþÞÕí"0!ñšßVõ­RL/X]|VWU¨£„X]Xb¨qòˆwtF3ˆ‰‡ÿýÍ—ÿ™ð«TQK"%+ŠŠŠÞÛÕ"%!ñšßƒb÷#½[|†aC¥„½[|´ÿLΙé06Ÿ2ΘaþΟ2ˆÿxÊœò 6ƒ"0ÓšjÞЃ"0ˆ þxýc\¨AÜX]|b¨¨£„X]|ÿL˜‡èfÎ3—ÿÿýÍ3ÿxèœgíAö"%+ñšßíÛÕ"%+ þxÜãý$ÿÊÎ62ÿÉÑ7/¨¬ý¬«ý¢½±TUv{vy1gŸ11‰Š‡uwqt ” T¬Œ;CuދŽ‹bÞuJg/¶™Ñ¶™ÑƒÍ3uBT‹¾¬‹¾¬«ÍTKKttvv²{ aAfž¿šbóáŸä{/šd dœ`œïÑf$"0B¡O¾_±ðÐcbb˜˜™™ éÈ!& éÈÛ«4/Û«Ý©37Ý©44/œÎxÛyüÎ44/›Î‰Šÿwˆÿše2ÿf›ÎFÿ6–f›ÎgΙaÿº%&î“f§hÎ4a4wgŸ‡êy‡êˆf0ú/œÎxÛyüÎ44/2gŸxÿxÿˆ44/œÎxÛyüÎ44/»›ÐvþŠvþ2gŸ‰ÿ‰ÿwþikš—•fikšg3ÿ™Íg32gŸxÿˆxÿxÿˆ2gŸxÿˆxÿxÿˆºñ&fÎf–Î2gŸš/œÿïÑf‰ÿ/šfÑd2gŸ‰ÿ2gŸ‰ÿwþ‰ÿf0úºŠ…î!v{‰ÿ2gŸxÿˆxÿˆ˜‡éhyêy‡fÑdêy‡˜hÿxwyÿÿ2gŸΙaÿ2gŸºñ&fÎf–Îþj1Îhigÿ˜˜™ÿhigÿ˜˜™ÿ44/ˆ%UÿÛ«fvyˆŠ‡ÿˆŠ‡ÿxvyxwyˆ‰‡xwy2gŸ‰ÿwþ‰ÿwþwÿï›Ðe0ï›Ðf0úºŠ…î!v{‰ÿŽ2éþÎ2ze†Ý¥„½½[|b¨Iÿž·ÊþΟŸ2—ÿuâÊÞЃƒ"0ñšß[_¨¥X¥„[|b¨˜ÿè1þÏÿ2—ÿŸáí+ÞÕí"0ñšßª S´­¨£„X]|b¨xŒˆÿýÍ3—ÿgU¯«ÞÛÕ"%+ñšß}ž ƒbC¥„½½[|ÿL2gΙaþΟŸ2ÿx6dÊœ}ÞЃƒ"0 þx¤X\¨£„ÜX]|ÿLéhy‡ÿýÍÎ3ÿxd™œgíÛÕö"%+ þx!ECß»½5jaË–Ÿ8jfÈ–šÿXT²¨¬Nÿ±TUÿŠ…Šv{vþ‰Š‡þ‹‰®uwRüý¬Œ'›'už"‹ž"‹;Cu›9f93}3Í}3ÍJg/f6‹«TU3¬U3¬uBT‰µ9µKýŒþZýŒþtþŠýZþŠývóáŸó០aïÑfïÑf/šðÐcðÐc0žÿAžÿbÿhfÿh˜îgÚîg™ô8îô8 éÈî%UÚî%UÛ«î#Wàî#WÝ©ºñ&œd2gŸwþ‰ÿÿe0ÿf›Îf›Fšeºše2ÿf›Î2gŸaÿ.ÿŸÒwaþ.2gŸˆ‡ÿ2gŸˆŠ‡ÿœd2gŸxÿˆxÿºñ&œd2gŸ‰ÿŠvþŠvþ‰ÿwþ‰ÿ ! àßà‰Œº ! àßàaš.ŸfÒbaaš.ŸfÒˆxÿxÿˆˆˆxÿÿÿœdïÑf/šïÑfš/œÿfÑd‰ÿwþ‰ÿwþ‰ÿ‰ÿwþ»g¡ßie!—›hhg!—›ˆˆxÿéhy˜‡éhyÿÿêÿÿ˜ÿhÿÿÿÿÿše2ÿf›ÎÌÌÑše2ÿf›Îÿÿœd2hhg˜—™˜—™higÿ˜˜™ÿÿºñ&Û«f›ÎxvyˆŠ‡ÿˆŠ‡ÿfvyhi5ÿhhg˜˜™àßàhhg˜˜™wþwþ‰ÿvþŠe›ÎŠvþŠ»g¡ßie!—›hhg!—›˜ÿhš2˜ÿh}ž Lý2gx6d‹ ñ^üL{ýx1+z. ñ­¨÷­¨ÈLýxvñxv«xtît£ xñzŸ½2hŸ-f–žXXžéiif!"ß»½Ë–ŸÈ–š©ÿ©ýV¦1,¦Y¥20¥YÙe;uŽ‹;e²ÇšüJ/¶™Ñaš.‹ÊuuT‹¾¬`w7®xvyš2ÿfÎÿš2ÿfΚe2ÿ›Îï›Ðˆ‰ÿï›wþ9fŸÿ9fÿŸxvyš2ÿfÎÿš2ÿfΚeºf›Îšeºf›xvyš2ÿfÎÿš2ÿfÎvþŠvþe0f›Îe0›Îàßà ! àßàŸfÒaš.ŸfÒšeºf›Îšeºf›Îšeºf›šeºf›xvyš2fÎÿš2ÿfÎfÑdše2ÿf›ÎÑdše2ÿf›de0f›Îe0›Î(R¼Á IDATe0f›Îe0f›ÎwþšüËÿfþÿšüËÿfþšeºf›šeºf›‡êyÿh‡êyêÿÿ˜ÿhÿhhg˜—™ÿhigÿ˜˜™ÿÿf›Îše2ÿf›Îxvyš2fÎÿš2ÿfÎ2üËf›Î2üËÿxvyˆŠ‡ÿˆŠUÿxvyxvyše2ÿše2ÿΘ˜™hhg˜˜™e0›Îe0›ÎŠvþŠwþšüËÿfþÿšüËÿfþÿÿh˜ÿhAåžeÑdBÌ`dbš.œœ/žýc\˜‡èœgýc\˜‡èœgýc\˜‡èœgýc\˜‡èœgÿLÿx þxÿLÿx þxý$627/VWUYYYYYYô8²V­²8î%U'‹'ˆ‹Yî#W$®™«®WKKttvv až a/šd/š0O0bb˜˜™™ éÈ!& éÈÛ«4/Û«Ý©37Ý©ÿÿše2ÿfœÎÿÿþÍÿ3ÿΙaÿ2hŸÎ˜a2gŸše2ÿfœÎÿÿþÍÿ3ÿše2ÿfœÎšd2f›ÎÿþÍÿ3ÿÿþÍÿ3ÿΙaÿ1el3ÿþÍÿ‰Œºxvyhigÿ˜—™ÿþÍÿ3higÿ˜—™ÿþÍÿ3ÿþÍÿ3ÿÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3þÏÿ2ÿ‰ÿvþŠŽ˜ýÿh˜éi@À/0.Ñ4Ò/Ì.ÑÐÒ!" 111Õ4Ë+Ì5ÏÏÏßÞàVWUª©«VWUª©«ˆ‰‡xwyˆ‰‡xwy!" ŠŠŠvvvŠŠŠvvvßÞà675ÊÉËTTS¬¬­!" VVVªªªßÞà675ÊÉËTTS¬¬­!" VVVªªª555àààP*Ðö222ÌËÌzDºñ&###ÌÌÌ}D·ð «««àààP*Ðö222ÌËÌzDºñ&###ÌÌÌ}D·ð USVÿÿÏ™aÿgŸÿ44/šfœÎÿÿÏ›”ÿýÍ3ÿÿÌÌÑšd2fœÎÌÌÑ44/44/šfœÎÿÿÏ›”ÿýÍ3ÿÿše2ÿ44/Î4/ÌÌÑše2ÿf›ÎÏ›”ÿýÍ3ÿÿÏ›”ÿýÍ3ÿÿΙaÿ1elÏ›”ºñ&ÿþÍÿ33xÿÿxhigÿ˜—™higÿhigÿ˜—™higÿÿþÍÿ3ÿÿÿÿÿÿþÍÿ33ˆŠ‡ÿwtF3ÿþÍÿ3ÿÿ3ˆŠ‡ÿ3ÿþÍÿ3ˆŠ‡ÿxvyÿþÍÿ3ÿÿ/Íÿÿ3ÿþÍÿ3ÿþÍÿÿÑ31þÏÿ1þ‰ÿvþŠwþh˜ÿÿÿh˜éhÿ@À¥„[À/0.Ñ4Ò/Ì.ÏžÒ–Ò/.###Õ4Ë+Ì5­Ÿ¼(•Ë15555ª©«VWUO-«[|«VWU222xwyˆ‰‡vEy2yˆ‰‡###vvvŠŠŠTFc"0vŠŠŠUTV675ÊÉË675ÊÉËTTS¬¬­TTS¬¬­VVVªªªVVVªªª675ÊÉË675ÊÉËTTS¬¬­TTS¬¬­VVVªªªVVVªªªàààòäo¢äþý¯ç׫m×hÏ+ÿÿ1Õš13ï[‡ï[‡ˆŠ‡ÿGEH¹»¸ÿ¹»¸ÿljД–0þ0—jšg–f™ÿ6ÕdjÎ2þÎGEHGEHÏÏÏGEHGEHœ—ÿ1ÕÊhhigÿþÏÿ/ÍþÏÿÿþÍÿÿþÍÿÿÑ3ÿþÍÿþÏÿÿÿš0gš0gÿÿFÚvEyjšg–f™Š»‡g/0ÿ:7¹»¸ÿ¹»¸ÿ:7RŒˆ™ÑÐ2éþÎ1Ÿ]aÿ£›2g*ΙÖf›ÎºùF3èg™þê1ÿþÍÿÿÑ3@ 3þÏÿ/ÍB  f›ÎΙaÿÌÌÑAx¬ ›aÿ.ÿŸfÒ®ß ê˜ÿÿÿhøy ÿþÍÿ‰Œº‰ŒºüÿÿüšÑf/ÿ2™–Ï1elÏ›”œ›«ª«UVUœ›öù¸³ IDATÿÿiig˜—™˜—™iigÿÿÏ+ÿÿ™>h˜—™˜—™™>hÏ+ÿÿgÑï[‡¥yGEHþÿüÿþÿüÿÏÏÏˆŠ‡ÿljД–0jšg–f™2þι»¸ÿˆŠ‡ÿ111¹»¸ÿ¹»¸ÿdiÐ0ý0ÐÏ9˜—™ÿþÍÿþÏÿþÏÿ/Í3þÏÿÿþÍÿÿþÍÿÿÑ31š0ggÐgК0gÌÌш‰‡Š»‡ ! 2ÐÊaÛ«:7ÿÆÉ®tx®txÿÆÉ¯®¯44/f›Îše2ÿf›Îf›Îše2ÿf›Î44/ÿ13éþÎ/Í1ÿ›ŸÒaÿ£aš.›ÿf›Î2hŸÎ™Ö44/f›Îÿ32ùFÿÑ33ÿêéi™þ˜êÿþÍÿÿþÍÿÿÑ3B ñïóñïóþÏÿþÏÿ/Í@ñïóñïóΙaÿΙaÿÌÌÑu¬Ûñïóñïóaÿ.ÿaÿ.ÿŸfÒ¬ ñïóñïó˜ÿÿ˜ÿÿÿhùñïóñï󉌺xvyÿþÍÿxvyÿþÍÿf›Î462f/ÿšÒf.f/ÿšÑÿ™+ÿÿgj1™–Ïgj1Ï›”Ï›”«ª««¬ªÿÿÿÿhigÿhigÿÿÿÿÿÏ+ÿÿÏ+ÿÿhigÿhigÿÏ+ÿÿÏ+ÿÿˆŠ‡ÿ™/ÿ™/ÿˆŠ‡ÿ™/ÿþÿüÿþÿüÿþÏÿþÏÿüÿ—ÿüÿ—ÿüÿ—ÿþÏÿüÿ—ÿþÏÿÿ™+ÿÿ™+ÿþÏÿþÏÿþÏÿÿ™+ÿþÏÿÿ™+ÿše2ÿþÏÿše2ÿÿþÏÿþÏÿše2ÿše2ÿ¹»¸ÿhigÿˆŠ‡ÿ¹»¸ÿ¹»¸ÿ¹»¸ÿœ—ÿ™0gÿ™0gÿhigÿ™0gÿÿcÿþÏÿþÏÿþÏÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿþÏÿþÏÿÿÿÿÿ™0gÿ™0gÿÿÿÿÿΙaÿÿÿÿÿg/0ÿg/0ÿhigÿ¹»¸ÿ¹»¸ÿhigÿhigÿše2ÿše2ÿÿÿþÍÿÿþÏÿÿþÍÿÿþÍÿþÏÿÿaÿ.ÿÿeÿaÿ.ÿaÿ.ÿeÿÿΙaÿÿše2ÿΙaÿΙaÿše2ÿÿþÏÿÿÿþÍÿþÏÿþÏÿÿþÍÿÿ˜ÿÿÿÿÿ˜ÿÿ˜ÿÿÿÿÿþÍÿþÏÿ ÿ ÿþÏÿÿþÍÿ ÿ ÿΙaÿše2ÿ ÿ ÿaÿ.ÿeÿ ÿ ÿ˜ÿÿÿÿ ÿ ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿf/ÿf/ÿf/ÿÿf/ÿf/ÿÿÿÿÿþÍÿΙaÿΙaÿΙaÿΙaÿÿþÍÿΙaÿdecÿ¹»¸ÿdecÿ ÿÿÿÿÿÿÿÿÿÏ+ÿÿÏ+ÿÿÏ+ÿÿÏ+ÿÿˆŠ‡ÿˆŠ‡ÿþÏÿüÿ—ÿþÏÿüÿ—ÿüÿ—ÿþÏÿüÿ—ÿþÏÿÿ™+ÿþÏÿÿ™+ÿþÏÿþÏÿÿ™+ÿþÏÿÿ™+ÿše2ÿþÏÿše2ÿþÏÿþÏÿše2ÿþÏÿše2ÿhigÿˆŠ‡ÿ™0gÿÏ+ÿÿ™0gÿhigÿ™0gÿÏ+ÿÿÿcÿÿcÿþÏÿþÏÿþÏÿþÏÿþÏÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿþÏÿþÏÿÿÿÿÿÿÿÿÿše2ÿÿše2ÿÿg/0ÿhigÿše2ÿše2ÿÿþÏÿÿþÍÿÿeÿaÿ.ÿÿše2ÿΙaÿÿÿþÍÿþÏÿÿÿÿ˜ÿÿ ÿ ÿ ÿ ÿ ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿf/ÿf/ÿf/ÿÿše2ÿf/ÿf/ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿdecÿ¹»¸ÿdecÿ ÿw÷V( IDATÿÿÿÿÿÿÿÿÿÿÿþÍÿÿþÍÿþÏÿþÏÿ˜ÿÿ˜ÿÿ˜ÿÿÍÿÿÿÍÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿtvsÿÿtvsÿÿîÿîÿf/ÿÿþÍÿtvsÿtvsÿÿþÍÿÿþÍÿÿaÿ.ÿaÿ.ÿše2ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿdÿÿÿdÿÿ˜ÿÿ˜ÿÿÿÿxÿuÿuÿuÿÎ/ÿÎ/ÿuÿþÏÿ1ÿÿÿþÍÿ3ÿÿ˜ÿÿéhÿÿÿþÍÿ3ÿÿaÿ.ÿŸÒÿÿhigÿ˜—™ÿÿÿÿÿ™+ÿgÕ˜ÿÿJg/ŸÒÿÿýÿ—üÿiΙaÿ2gŸrŠˆxvþÏÿ/Í3ÿþÍÿÿÑ31‰ÿwþÿÿŠwþ‰ÿwþ˜ÿÿéhŒÎ™Ö2g*˜ÿÿéhÿÿÿ2Íÿÿÿ3xvyˆŠ‡ÿFÚºñ&ˆŠ‡ÿxvyŒŠtvsÿŒ‹ÿŒŠœ—ÿsvñïóΫ]ýÏ7ÿ51hf/ÿšÑÿþÍÿ.3ÿýÍ3ÿÿaÿ.ÿ9fÇšüfΚf2fΚ2ÿ.ÿŸÒÏšý˜ÿÿÿhêyˆuÿ‹ÿþÍÿÏ131ÏÍ23uÿ‹þÏÿÿþÍÿ/ÍÿÿÿÿþÍÿþÏÿÿÑ3ÿÿÿ˜ÿÿÿÿÿhÿÿÿÿþÍÿˆŠ‡ÿ‰Œºÿÿÿaÿ.ÿeÿŸfÒÿÿÿhigÿÿ˜˜™ÿÿÿÿÿ‰ÿŠÿ™+ÿfÖþÏÿÿÿÿhÿÿÿÿÿÿÐiþÏÿüÿ—ÿþÏÿ2gŸ2gŸþÏÿ‰ÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿþÏÿ1ÿÑ3ÿþÍÿÿþÍÿ3/ÍþÏÿΙaÿ¹»¸ÿÿþÍÿº½ëº½ëÿþÍÿÿþÍÿÿþÍÿþÏÿ/Í/ÍþÏÿþÏÿΙaÿ˜tIÿž˜t·b·bÿÿÿÍÿÿÿÿÍÿÿÿºñ&wtFtvsÿÿŒŠÿtvsÿÿœ—ÿ3+h3+h3+h3+h3+h3+hïŠÎ™aÿ‰ÿ7ðŸý6751hÿþÍÿÿþÍÿux¦‹ˆZÿþÍÿhigÿ3ÒÍÒÍ3ÿ9ffÎ9ffÎΙaÿ2hŸÿéh·b·b˜˜‡˜ÿÿ‹Î/ÿÏ13§Ñ§ÑÏ13‹æ¾÷ IDAT€ÿþÏÿ/Í3ÿÿþÍÿÑ31ÿÿ˜ÿÿhêÿÿþ͉Œºxvyÿÿbÿ.ŸfÒ›ÿÿiig˜˜™ÿÿÿŠwþÿ™+ÿÿ6Õ1ÿêe›ÿÿþÏÿþ0—ÒšÊ2gŸþÏÿ1Ιaÿ2gŸ‰ÿßie!—›ßie ! wtF3þÏÿ1þÏÿ1ÿþÍÿ3Ιaÿ2gŸΙaÿ2gŸÿÿŠvþŠwþhigÿ ! xvyg/0ÿ36f›Î¹»¸ÿFCº½ëFCÿÑ3ÐÊaIÿžç7œ–244/2fžÍ3Í3Ιaÿºñ&xvyÿþÍÿux¦ŒŠœ—ÿ3+hÍÕ˜diΙaÿÌÌÑ1jfÊÉÌÌÑÌÊΙÏÍ02ÊEFÜ‹ˆZux¦‹ˆZikš˜—™ÿÿÿþÍÿ3dš2djΖþjœ–2fΛΙaÿ2hŸÿÿÿéþÎÏ›”2gˆÿuÿY/§ÑY/§Ñ‹ÿþÍÿÿÑ31þÏÿ/Í3ÿÿꈊ‡ÿxvyeÿ›ÿÿ‰ÿwþÿÿÿÿÿÏ1Ιaÿ2gŸd™ÿÿœ52‰ÿßie!—›ÿŠ…vEy1þÏÿ1ÿþÍÿ3ÿþÍÿ3ˆŠ‡ÿw¤Ï62gŸÿÿŠwþÿþÍÿ‰Œºwuzº¼·FDIÿΙaÿÌÌÑf›Î¹»¸ÿFCº½ëFCº½ëFCÿÑ3/ÍÿÑ3/ÍÿÑ3ÐÊa06ŸÉÿç7œ–244/2fžÍ›jhe–˜3Íšbºñ&xwyÿÿþÍÿux¦ŒŠœ—ÿ3+hÍÕ˜svñïó‰ÿÆF˜51hf/ÿ™ÏÍ02ÊЖ1 ux¦ôóô˜—™ÿþÍÿ3ÿýÍ3eÿ›ΙaÿÌÌÑf›ÎÿÿêyÿþU«‡_‹Î/ÿ§ÑY/2Ñuÿ‹ÿÑ3/ÍÿþÍÿþÏÿ/ÍÿÑ3þÏÿÿþÍÿ˜ÿÿ˜ÿÿwtFˆŠ‡ÿÿþÍÿaš.eÿaÿ.ÿhhgÿhigÿvþ‰ÿÿÿŠÿÿhigÿüÿ—ÿÿÏþ0—Ιaÿ2gŸΙaÿÎÿÿd™ÿÿœ5dËÎÿÿßie!—›ÿŠ…wþàßà/ÍþÏÿþÏÿþÏÿÿÑ3ÿþÍÿÿþÍÿÿþÍÿxvyw¤2gŸŠwþÿþÍÿikš‰‹†º¼·ˆŠ‡ÿΙaÿ™–Ï44/še2ÿFCº½ëFCº½ëº½ëFC/ÍÿÑ3ÿÑ3 0côgd 0c 0c 0cf›ÎÍ3e–˜33ͺñ&ºñ&FÚxwyÿþÍÿux¦ÿÍÕ˜svñïóûw:ºhËϘÿÏ›”Š‹!ºî‹ºî‹02Ê»º$3ÿý͉Œº‰›š2›™52hŸf›Î3™bÿÿ3™bÿš2êy‹§Ñ§ÑÎ/ÿ‹¿iDÐ IDAT1ÿÑ3ÿÑ3þÏÿ3/Í/ÍÿþÍÿéh˜˜ÿÿ3wtFÿþÍÿŸÒaš.aÿ.ÿ˜—™hhghigÿvþÿÿwþŠþÍÿþÍÿýÿ—þ0—i2gŸΙaÿΙaÿþÏÿÎÿÿdËœ5dËÎÿÿ˜—™wþßiewþ˜—™31þÏÿ/Í/ÍþÏÿ13ÿþÍÿÿÑ3ÿÑ3ÿþÍÿÿ™+ÿgÕgÕgÕgÕgÕÿ™+ÿvþ‰ÿÿþÍÿikš ! Ιaÿ™–Ï3644/3FC31/Í/ÍÿÑ312gŸõõ2gŸ3Í3FÚFÚºñ&ºñ&ÿôóôœ—ÿ3+hÍÕ˜svñïóûw:ºhf/ÿšÑa—6vu߯®¯vußôóô»º$ÿÿþÍÿxwywþï›Ðš2še2ÿΙaÿ™5gÍeÿ3˜béhyš2uÿY/‹‹§ÑþÏÿ/ÍÿÑ31ÿþÍÿÿÑ3/Í3ÿÿ˜éhˆŠ‡ÿwtF3eÿaš.ŸÒÿhhg˜—™‰ÿvþ‰ÿvþËikš˜—™üÿ—ÿÐi1þÏÿ1Îÿÿ2N™²gêÎ2êhigÿ˜—™ˆŠ‡ÿxvyÿþÍÿ3þÏÿ1þÏÿ1þÏÿ1ÿþÍÿ3ÿþÍÿ3‰ÿwþhigÿ ! ߥ©36f›Î¹»¸ÿFC3¹»¸ÿFC3ÿþÍÿÿÑ31ÿþÍÿÿÑ31Ιaÿ2gŸΙaÿ2gŸÿÿÿÍ3ÿÿÿÍ3Ιaÿ2hŸÎ˜a2hŸÿhigÿ˜˜™ÿœ—ÿ3+hÍÕ˜svñïó‰ÿwþ‰ÿwþÿÍ-ÿ4ÓÿÿÍ-ÿ3ÓˆŠ‡ÿxwyˆ‰‡xwyÿ‰ÿe044/2gŸgÎeÿÌËýÍhžÿÿêy‡êy‡êy‡êuÿY/§ÑY/2Ñg/0ÿg/0ÿϘÿϘÿˆŠ‡ÿˆŠ‡ÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÎ1.ÿÎ1.ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿše2ÿše2ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿhigÿhigÿÿþÍÿþÏÿþÏÿþÏÿþÏÿÿÿþÏÿþÏÿþÏÿþÏÿþÏÿše2ÿše2ÿþÏÿˆŠ‡ÿÿþÍÿ¹»¸ÿÿþÍÿÿþÍÿÿýÏaÿ ÿϘÿ ÿÿÿþÍÿÿ,ÿ¹»¸ÿÿþÍÿÿ,ÿÍÿÿΘÿÿ,ÿÿÿÿ™/ÿÿ,ÿÿþÍÿÿþÍÿ ÿÿþÍÿÿþÍÿˆŠ‡ÿ ÿ ÿÿ˜ÿÿ˜ÿÎ1.ÿÎ1.ÿÿÿÿÿûH&{ IDATÿþÍÿg/0ÿRŒˆRŒˆg/0ÿ›.ÿ›.ÿ›.ÿFÚFÚ333h3ÿþÍÿÿÑ333344/ÿþÍÿÿÑ3333f0úÿþÍÿÿÑ3121¾˜`þÏÿ/Í12144/þÏÿ/ÍÿþÍÿÿþÍÿÿþÍÿÏ3avv¹»¸ÿÿÿ ÿÿÿ ÿî¾TϘÿÿÒ͹»¸ÿÒÍÍÿ¢˜ÿÿÿ¢˜3 ÿ33 ÿ3ÿÿÿ)fšÿ)fšÿ)fšÿ)fšÿñïó ÿ ÿñïóÿiÿÿÿ2ÐÒÿÿ›-1ÿ‰ÿ‰ÿ›-1ÿÿþÍÿ¹»¸ÿg/0ÿ¹»¸ÿg/0ÿ¹»¸ÿ›.ÿÎ/ÿ˜ÿÿ›.ÿ˜ÿÿþÿüÿþÿüÿÿ,ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿÿg/0ÿ ÿg/0ÿ ÿÿÿþÍÿšÿšÿÿþÍÿþÏÿþÏÿÿÿþÍÿÿÿÿÿÿþÍÿþÏÿþÏÿÿÿþÍÿgeÿgeÿÿþÍÿþÏÿþÏÿÿþÏÿ™d›ÿ™d›ÿþÏÿÿþÍÿÿþÍÿÿþÏÿÎ1.ÿÎ1.ÿþÏÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿÿÿþÍÿš/œÿš/œÿˆŠ‡ÿÿþÍÿ¹»¸ÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿÿÿÿÿÿ‰ÿ‰ÿ‰ÿ‰ÿÿÿ ÿgeÿ™d›ÿ ÿÿÿþÍÿÿÿÿÿ¹»¸ÿÿþÍÿ¹»¸ÿ¹»¸ÿÿÿÍÿ;,þÿÍÿÍÿÿÿÿÿÿ;,þÿÿÿÿÿÿÿÿÿ˜š—ÿ˜š—ÿ ÿ˜š—ÿÿÿ ÿÿÿ ÿUÿUÿÿˆŠ‡ÿUÿUÿÿÿþÍÿtvsÿtvsÿÿÿþÍÿÿÿÿÿÿÿÿ)fšÿ‹ÿ‹ÿ‹ÿ‹ÿ‹ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÎ1.ÿÎ1.ÿÎ1.ÿÎ1.ÿÎ1.ÿÎ1.ÿ›-1ÿ›-1ÿ›-1ÿÿÿÿÿ›-1ÿ›-1ÿ›-1ÿº½ë¹»¸ÿ:7GªH:7„h/çgýš››Ð0þÿüÿÿ,ÿÕàßà ! ˆ‰‡g/0ÿX#X# ÿÿþÎÿdÍÿÑ3ÿþÎþÍÿÑ3ÿþΘþhÿÑ3ÿÿýÍeke/ÍÿÿýÍ0žÒ/ÍFÚFÚÿþÍÿikšÎ:Ëuâqÿ,ÿÿ,ÿ¥ÿþÍÿÿþÍÿFCÿþÍÿÿþÍÿÿ,ÿÿ,ÿ˜ÿÿ˜ÿÿ3wtFwtF3wþvþvþvþðïógeÿ ÿ™d›ÿ—Ï›366ï¾ó ÿÿÿþÍÿÿþÍÿÿGEHÿþÍÿÿþÍÿGEHº»¸c3;,þÿÿΘÿc3žÍÿ;,þÿÿΘÿÿÿ˜š—ÿ‰‰Š˜š—ÿðïó ÿÿÿ ñïó!yþ!yþwtF!yþ!yþ3!Îÿtvsÿ­X­Xtus!Îÿ@éþÎéþÎ)fšÿךñÿþBÿþB‹ÿñïó ÿñïóñïó ÿñïóÿ˜ÿhhÿ˜ÿ›.ÿ2ÏÒ2ÏÒ›.ÿ3þgÿIV@W IDATGEHg/0ÿ6ÿÆÉRQÍÑ.3/Ò0Ðüš››f—/ffg›Û«F4/ºñ™ÑЙÑÐÿþÍÿ¨@œ31ÿ31ÿh˜1ÿ›•›3ÿÐb.3ÿ,ÿi=gšÐhhg ! ÿxwyÿ3higÿÛÜÛÔdÿþÍÿº½ëGEHÿþÍÿº½ëGEHCEBÿ½»¾ÔÔéhéh‰Œº‰ŒºÿÿŠ™d™ÿv­rŠSŽÎËÑ›•›rÿ3ÿ¹»¸ÿº½ëGEHÍÿžbÔÏž25c3ÿÿÿ<-ÄÓÿgd6™œÊÌËÌðïóÿ!ÎÿßËfߢ¼œÿ¬þ3!ÎÿßËfßËhhÿ˜˜™ÿß2vÿßËfîC ñïó22uÿ‹¾ñïó ÿ ÿñïóhÿ˜ÿh2ÏÒÎ1.ÿ2ÏÒeÔÏÿÏ›,1¹»¸ÿ¯®¯QRQGEHÎ/ÿÍÑ.Ée5f0úºñ&£ªí]Vxvyg/0ÿ¨âÝñïóÿ™ÿdÍ3ÿÿÿþÍ3ÿgÿe˜þh3ÿ™c›eke1ÿÎ0.0žÒ1ÿ,ÿi=g ! xvyhigÿÛÜÛÌÌËñïóÿþÍÿº½ëGEH¹»¸ÿŠŠŠ½»¾ÿ,ÿÔ˜ÿÿéhÿþÍÿ3ÿýÍ3ÿÿþÍÿ3ÿÿŠvþŠwþgeÿ2d6366Cw<½‰Ä4f/ÿÿýÍ3ÿÿ¹»¸ÿFC3¹»¸ÿGEHÍÿbÎË2hÍÿc3ÿÿÿš0ÿgÑÿÿÿÿdecÿœ›decÿœ›ÿÿ ñïó!Îÿß2™fÿ¼œ¬þÿ™fÿhИ—™tvsÿŒ#ótÝ ››šñïó˜ÿÿÿh˜ÿh˜éiÿ‹ÿuÿ ÿYXZ§¨¦ñïóÿ˜ÿhÿ˜ÿhÎ1.ÿ2ÏÒÎ1.ÿ2ÏÒ›-1ÿeÓÏÿÿÿÿ›-1ÿeÓϹ»¸ÿ¹»¸ÿeÿhigÿÎ/ÿ›.ÿdecÿhigÿ›-1ÿÿ›-1ÿÿg/0ÿg/0ÿ ÿ ÿg/0ÿg/0ÿ ÿÿÿþÍÿÿþÏÿÿþÍÿÿþÍÿþÏÿÿÿþÍÿÿþÏÿÿþÍÿÿþÍÿþÏÿÿÿþÍÿÿþÏÿÿþÍÿÿþÍÿþÏÿÿþÏÿÿÿþÍÿþÏÿþÏÿÿþÍÿÿþÏÿÿÿþÍÿþÏÿþÏÿÿþÍÿΙaÿˆŠ‡ÿˆŠ‡ÿ›-1ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿCEBÿCEBÿCEBÿ ÿÿþÍÿ¹»¸ÿ¹»¸ÿ¹»¸ÿCEBÿÿþÍÿÿÿþÍÿÿþÍÿÿþÍÿÿÿÿ ÿÿÿ ÿ‰ÿgeÿ ÿ™d›ÿ ÿ ÿÿÿ¹»¸ÿ¹»¸ÿÍÿÍÿÿÿÿÿÿÿdecÿdecÿÿÿÿÿ ÿÿþÍÿUÿUÿUÿUÿUÿUÿÿUÿUÿUÿÿhigÿhigÿÿtvsÿUÿUÿtvsÿtvsÿ ÿ˜ÿÿ ÿ ÿ˜ÿÿÿ˜ÿÿ ÿ‹ÿ‹ÿ‹ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ˜ÿÿ˜ÿ›.ÿ›.ÿ›-1ÿÿÿÿÿÿÿÿÿ›-1ÿúäX( IDAT€ÿeÿ¹»¸ÿ¹»¸ÿeÿhigÿhigÿÎ/ÿÎ/ÿdecÿhigÿÎ/ÿše2ÿÿše2ÿÿg/0ÿ ÿg/0ÿ ÿÿþÏÿÿþÍÿÿþÏÿÿþÍÿÿþÏÿÿþÍÿÿÿþÍÿþÏÿÿÿþÍÿþÏÿ›-1ÿÿ›-1ÿˆŠ‡ÿhigÿCEBÿ ÿ ÿ ÿ ÿ ÿÿþÍÿ¹»¸ÿCEBÿÿþÍÿÿÿþÍÿÿÿÿÿ‰ÿ‰ÿÿÿÿÿ ÿ™d›ÿ ÿ™d›ÿ ÿÿÿ¹»¸ÿ¹»¸ÿÍÿÍÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿUÿUÿÿUÿUÿÿUÿUÿÿÿÿÿUÿUÿ ÿUÿUÿ ÿ˜ÿÿÿ˜ÿÿÿ˜ÿÿ ÿ ÿ ÿ ÿ ÿÿ˜ÿÿ˜ÿ›.ÿ›.ÿÿÿÿÿÿÿ:æ÷ IDAT=·O IDAT‰ÿše2ÿše2ÿhigÿΙaÿΙaÿhigÿˆŠ‡ÿˆŠ‡ÿÿhigÿhigÿ‰ÿþÏÿþÏÿˆŠ‡ÿÿþÍÿÿþÍÿΙaÿþÏÿþÏÿΙaÿÿþÍÿÿþÍÿ˜ÿÿÿþÍÿÿþÍÿΙaÿÿÿþÏÿà\¼ IDATÿÿ‰ÿÿÿf›Î2gŸxvy˜—™13133ÿÏ1‰ÿe0še2ÿhigÿf0úΙaÿhigÿ ! ˆŠ‡ÿÿhhghigÿ‰ÿuÏþþÏÿˆŠ‡ÿwtFÿþÍÿΙaÿ06ŸþÏÿΙaÿ1elÿþÍÿ˜ÿÿèfÎÿþÍÿΙaÿ06ŸþÏÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿÿŠÿÿ‰ÿe0ï›Ðï›Ðše2ÿhigÿf0úšÐšÐΙaÿhigÿ ! àßààßàˆŠ‡ÿÿhhg˜˜™˜˜™higÿ‰ÿuÏþ‹1‹1þÏÿˆŠ‡ÿwtF‰Œº‰ŒºÿþÍÿΙaÿ06ŸÐÊaÐÊaþÏÿΙaÿ1elÏ›”Ï›”ÿþÍÿ˜ÿÿèfΚ2š2ÿþÍÿΙaÿ06Ÿœ`œœ`œþÏÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿΙaÿΙaÿΙaÿÿþÍÿÿþÍÿÿþÍÿΙaÿΙaÿΙaÿµÓ— IDAT€ÿvþ4jÅ4jÅÿþÍÿikšikšÿþÍÿ33‰Œº‰Œº33ΙaÿšÐšÐΙaÿÿþÍÿikšikšÿþÍÿΙaÿšÐšÐΙaÿÿÿ‰ÿÿÿÿÿÿÿ‰ÿše2ÿhigÿΙaÿhigÿˆŠ‡ÿÿhigÿ‰ÿþÏÿˆŠ‡ÿÿþÍÿΙaÿþÏÿΙaÿÿþÍÿ˜ÿÿÿþÍÿΙaÿþÏÿÿþÍÿhigÿÿþÍÿˆŠ‡ÿÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿΙaÿhigÿΙaÿše2ÿÿþÍÿhigÿÿþÍÿˆŠ‡ÿΙaÿhigÿΙaÿše2ÿÿÿŠvþ‰ÿe0f›Îhigÿf0ú2gŸhigÿ ! xvyÿhhg˜—™‰ÿuÏþ1ˆŠ‡ÿwtF3Ιaÿ06Ÿ1Ιaÿ1el3˜ÿÿèfÎ3Ιaÿ“fÍÐÒc0.ŸÒÿþÍÿ‰ŒºwtF‰Œºxvyÿÿ‰Š‡àßà ! xvyÿþÍÿ3ΙaÿÌÌÑf›ÎÿþÍÿ‰ŒºxvyΙaÿÌÌÑ44/ÌÌÑf›ÎäeüU IDATÿÿvþÿÿÐÒÐÒŸ3ÿþÍÿ‰Œº‰ŒºwtFwtFÿ3ÿÿwvyiigàßàˆŠ‡ÿxvy32gŸ32gŸΙaÿÌÌÑÌÌÑ44/Î4/ÿ2gŸÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿõ}Ù$ IDATÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿš/œÿš/œÿš/œÿÿ‰ÿÿÿÿÿÿeÿaÿ.ÿaÿ.ÿÿÿÿ˜ÿÿ˜ÿÿÿÿÿ˜ÿÿ˜ÿÿÿ‰ÿÿÿÿÿÿeÿaÿ.ÿaÿ.ÿÿ‰ÿΙaÿΙaÿÿhigÿˆŠ‡ÿˆŠ‡ÿÿÿÿΙaÿΙaÿÿÿhigÿhigÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿÿhigÿhigÿÿþÏÿüÿ—ÿüÿ—ÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿyÑ‘P IDATΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿΙaÿþÏÿþÏÿÿWqw IDAT€ÿTUSÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿΙaÿþÏÿÿþÍÿþÏÿÿþÍÿþÏÿΙaÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿhigÿÿþÍÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿþÍÿhigÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿΙaÿþÏÿÿþÍÿþÏÿÿþÍÿþÏÿΙaÿÿhigÿÿþÍÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿþÍÿhigÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿΙaÿþÏÿþÏÿþÏÿþÏÿΙaÿÿΙaÿþÏÿÿþÍÿþÏÿÿþÍÿþÏÿΙaÿÿΙaÿþÏÿþÏÿþÏÿþÏÿþÏÿΙaÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿÿþÍÿÿÿþÍÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿÿþÍÿÿÿþÍÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿÿþÍÿÿÿþÍÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿ ³1ü IDATˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿÿþÍÿÿÿþÍÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿÿþÍÿÿÿþÍÿÿˆŠ‡ÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿhigÿhigÿÿÿþÍÿÿÿþÍÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿþÏÿÿþÏÿÿˆŠ‡ÿÿþÏÿÿhigÿÿhigÿÿÿþÍÿþÏÿÿÿþÍÿÿþÍÿþÏÿÿÿþÍÿš/œÿ¥š.œÿ‰ÿ1‰ÿÿeÿc0.dÿÿÿ1xÿÿÿΙaÿ۫ΘaÿhigÿŠ»‡hhgÿÿÿÿÿÿÿjšgÿˆŠ‡ÿ/͈‰‡ÿÿŽvxÿÿÿ1ÿÿÿ˜ÿÿÉÿ—ÿÿΙaÿ۫Θaÿÿÿ1ÿÿÿÿhigÿhigÿhhg3eÿc0.dÿ33ˆŠ‡ÿ/͈‰‡ÿ3%Ølî IDATš/œÿÿÿxÿÿÿš/œÿÿ‰ÿÿÿþÏÿÿÿ‰ÿÿeÿaÿ.ÿþÏÿaÿ.ÿeÿÿÿÿxÿ˜ÿÿxÿÿÿÿΙaÿše2ÿþÏÿše2ÿΙaÿÿhigÿˆŠ‡ÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÏÿþÏÿþÏÿÿÿÿÿhigÿˆŠ‡ÿhigÿÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿÿÿÿ˜ÿÿÿÿÿÿÿÿÿþÍÿˆŠ‡ÿÿþÍÿÿÿÿ˜ÿÿˆŠ‡ÿš/œÿˆŠ‡ÿ˜ÿÿÿΙaÿše2ÿþÏÿše2ÿΙaÿÿÿÿxÿ˜ÿÿxÿÿÿÿhigÿÿhigÿÿeÿaÿ.ÿþÏÿaÿ.ÿeÿÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿš/œÿš/œÿš/œÿÿ‰ÿÿÿ‰ÿÿeÿaÿ.ÿeÿÿÿÿxÿÿÿÿΙaÿše2ÿΙaÿÿhigÿˆŠ‡ÿhigÿÿÿÿþÏÿÿÿÿÿhigÿÿÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿΙaÿše2ÿΙaÿÿÿÿÿÿÿÿÿhigÿhigÿÿÿþÍÿeÿaÿ.ÿeÿÿÿþÍÿÿþÍÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿÿþÍÿoz½ IDATše2ÿþÏÿÿÿše2ÿÿše2ÿÿþÍÿþÏÿše2ÿÿxÿ˜ÿÿÿÿxÿÿeÿÿþÍÿaÿ.ÿeÿÿš/œÿþÏÿÿÿš/œÿÿše2ÿþÏÿþÏÿše2ÿÿxÿ˜ÿÿÿÿxÿÿeÿþÏÿaÿ.ÿeÿÿxÿ˜ÿÿÿÿxÿÿ‰ÿÿÿΙaÿ‰ÿÿeÿaÿ.ÿeÿeÿÿ‰ÿš/œÿš/œÿxÿÿÿˆŠ‡ÿhigÿÿÿhigÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÏÿÿÿ‰ÿÿ‰ÿΙaÿše2ÿ‰ÿÿúZê† IDAT€ÿxÿ˜ÿÿÿÿxÿÿ‰ÿÿÿΙaÿ‰ÿÿeÿaÿ.ÿeÿeÿÿ‰ÿš/œÿš/œÿxÿÿÿˆŠ‡ÿhigÿÿÿhigÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÏÿÿÿ‰ÿÿ‰ÿΙaÿše2ÿ‰ÿÿxÿ˜ÿÿÿÿxÿÿ‰ÿÿÿΙaÿ‰ÿÿeÿaÿ.ÿeÿeÿÿ‰ÿš/œÿš/œÿxÿÿÿˆŠ‡ÿhigÿÿÿhigÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÏÿÿÿ‰ÿÿ‰ÿΙaÿše2ÿ‰ÿÿ¹ä=× IDATše2ÿþÏÿÿÿše2ÿÿše2ÿÿþÍÿþÏÿše2ÿÿxÿ˜ÿÿÿÿxÿÿeÿÿþÍÿaÿ.ÿeÿÿš/œÿþÏÿÿÿš/œÿÿše2ÿþÏÿþÏÿše2ÿÿxÿ˜ÿ3Ð! IDATÿÿÿxÿÿeÿþÏÿaÿ.ÿeÿÿxÿ˜ÿÿÿÿxÿÿ‰ÿÿÿΙaÿ‰ÿÿeÿaÿ.ÿeÿeÿÿ‰ÿš/œÿš/œÿxÿÿÿˆŠ‡ÿhigÿÿÿhigÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÏÿÿÿ‰ÿÿ‰ÿΙaÿše2ÿ‰ÿÿxÿ˜ÿÿÿÿxÿÿ‰ÿÿÿΙaÿ‰ÿÿeÿaÿ.ÿeÿeÿÿ‰ÿš/œÿš/œÿxÿÿÿˆŠ‡ÿhigÿÿÿhigÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÏÿÿÿ‰ÿÿ‰ÿΙaÿše2ÿ‰ÿÿü‘H IDATxÿ˜ÿÿÿÿxÿÿ‰ÿÿÿΙaÿ‰ÿÿeÿaÿ.ÿeÿeÿÿ‰ÿš/œÿš/œÿxÿÿÿˆŠ‡ÿhigÿÿÿhigÿÿþÍÿˆŠ‡ÿhigÿÿÿÿþÏÿÿÿ‰ÿÿ‰ÿΙaÿše2ÿ‰ÿÿÿÿ˜ÿÿÿ‰ÿÿÿÿeÿaÿ.ÿÿ‰ÿš/œÿÿhigÿÿÿˆŠ‡ÿÿþÍÿÿþÏÿaÿ.ÿÿ‰ÿΙaÿÿ¹½@- IDAT€ÿ˜ÿÿÿÿše2ÿÿÿÿ‰ÿše2ÿÿaÿ.ÿeÿše2ÿÿš/œÿ‰ÿše2ÿÿÿhigÿše2ÿÿÿþÍÿˆŠ‡ÿše2ÿÿaÿ.ÿþÏÿše2ÿÿΙaÿ‰ÿše2ÿÿéh„e344/šd2ÿe044/šd2ÿŸÒš244/šd2ÿfÑde044/šd2ÿÿ2üË44/šd2ÿ3Û«44/šd2ÿŸÒœ–244/šd2ÿ2gŸe044/šd2ÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿýM±š IDATše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿÿše2ÿΙaÿše2ÿše2ÿΙaÿše2ÿše2ÿΙaÿše2ÿše2ÿΙaÿše2ÿše2ÿΙaÿše2ÿše2ÿΙaÿše2ÿše2ÿΙaÿše2ÿše2ÿΙaÿše2ÿ{˜èï IDATše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿÚö IDAT=·O IDAT€ÿ˜ÿÿÿÿÿÿÿÿÿ‰ÿ‰ÿÿaÿ.ÿeÿeÿÿš/œÿ‰ÿ‰ÿÿhigÿÿÿÿÿþÍÿˆŠ‡ÿˆŠ‡ÿÿþÏÿΙaÿΙaÿÿΙaÿ‰ÿ‰ÿÿ˜ÿÿÿhêyÿÿÿÿÿŠe0‰ÿÿaÿ.ÿŸfÒš2dÿš/œÿïÑfe0‰ÿÿhigÿ˜˜™hhgÿÿþÍÿ‰Œºàßàˆ‰‡ÿþÏÿÐÊaÌÌÑΘaÿΙaÿ»g¡e0‰ÿÿ3Æ¿ IDAThigÿhigÿhigÿÿþÍÿþÏÿþÏÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿÿþÍÿÿÿΙaÿΙaÿÿΙaÿΙaÿše2ÿše2ÿše2ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿþÏÿþÏÿþÏÿÿeÿ‰ÿΙaÿΙaÿΙaÿaÿ.ÿaÿ.ÿše2ÿše2ÿÿše2ÿše2ÿhigÿaÿ.ÿeÿÿÿÿÿÿÿš/œÿÿÿ‰ÿÿÿÿÿÿÿÿÿÿÿ‰ÿˆŠ‡ÿhigÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿxÿš/œÿš/œÿš/œÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿeÿˆŠ‡ÿhigÿ˜—™˜—™˜—™higÿþÏÿÐÊaÐÊaþÏÿΙaÿˆŠ‡ÿˆŠ‡ÿše2ÿfœÎ44/fœÎše2ÿše2ÿÏ›”Ï›”Ï›”ÿýÍÿÿÿÿÿÌÌÑÿÿÿÿþÏÿþÎÌÌÑþÏÿþÏÿˆŠ‡ÿÿše2ÿ44/44/še2ÿÿeÿeÿf›Îše2ÿše2ÿFÚFÚFÚˆ‰‡ÿÐÊaÐÊaÐÊaÿÿÿÿ›weþ1gŸÿΙaÿÿÿ1gŸ‰ÿΙaÿaÿ.ÿaÿ.ÿše2ÿše2ÿÿše2ÿ44/44/šd2ÿše2ÿf›Îše2ÿÿÿŸÒaš.êe„/eÑdŠwþÿÿþÏÿÿÿŠÏ™aÿÏÿÿˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿ˜—™˜—™higÿÿþÍÿÿÿš/œÿhigÿ ! ˆŠ‡ÿþÏÿÿÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿaÿ.ÿΙaÿþÏÿΙaÿþÏÿΙaÿše2ÿÿΙaÿΙaÿÿše2ÿ‰ÿše2ÿše2ÿše2ÿΙaÿΙaÿΙaÿÿÿÿþÍÿÿþÍÿΙaÿ‰ÿÿþÍÿÿš/œÿÿÿÿÿÿÿÿÿš/œÿš/œÿš/œÿþÏÿþÏÿþÏÿþÏÿš/œÿš/œÿˆŠ‡ÿÿΙaÿΙaÿÿeÿΙaÿše2ÿš/œÿˆŠ‡ÿˆŠ‡ÿΙaÿ‰ÿˆŠ‡ÿÿÿÿþÏÿþÏÿ‰ÿ‰ÿÿÿÿΙaÿeÿΙaÿΙaÿˆŠ‡ÿeÿÿΙaÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿΙaÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿeÿaÿ.ÿaÿ.ÿaÿ.ÿše2ÿÿÿše2ÿÿΙaÿΙaÿÿše2ÿˆŠ‡ÿˆŠ‡ÿΙaÿhigÿhigÿÿhigÿÿš/œÿš/œÿÿaÿ.ÿÿÿš/œÿ‰ÿxÿxÿÿÿxÿþÏÿ‰ÿÿÿΙaÿþÏÿ‰ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿÿþÍÿ˜ÿÿˆŠ‡ÿÿÿxÿš/œÿš/œÿš/œÿš/œÿxÿš/œÿš/œÿš/œÿš/œÿxÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿþÏÿÿÿeÿˆŠ‡ÿÿ.ÎýÊ IDATàßà˜—™Îaÿm™3ÿ1»¡1™f›Îše2ÿÿºñ&šd2ÿf›Îï›ÐE™_ÌÌÑ44/ÿÿŠ53ÿ›‰ÿwÑdΙaÿÌ–1š/œÿfÑdΙaÿ2gŸxvñx2gš/$þΟœ`œÿfÒd‰ÿE4_»g¡‰ÿÿŠ…fvyš/œÿïÑfÑ»¥š.œeÑdÿŠ1ŠÿÿþÏ™aÿ2hŸˆ‰‡2ÌyœÿeÿwþE™_»g¡wþEÿŸfÒaš.ŸÒaÿ.ÿf›Îše2ÿfœÎÿš/œÿÌ–š.;ÿfÒdšd2f›Îv{ÿÿ1elgŸf0ú˜2Æ5ÿÿfÒdÿÿþÏÿfÒš/eÑdˆŠ‡ÿxvyˆhigÿÿÿÿêÿxÿˆˆ1vþ06Ÿ‹1vþÿЇÿxvyxvyˆŠ‡ÿxvyxvyxvy ! àßà3ˆŠ‡ÿwfΚxˆŠÿxvyêxÿˆŠîë6ÿ›fÑdš/œÿfÑdš/œÿfÑdš/$fÒdš.œš/œÿfÒdš/œfÑˆŠ‡ÿwtFikš˜—™xvyhigÿ ! ˆŠ‡ÿxvy2dˆ‰‡xwyÿÿhigÿ2gŸþÏÿ1ÿÏÊf›Îše2ÿÛ«fœÎše2ÿe0ï›Ðe0ÌÌÑÌÌÑ44/vþËŠ5Švþ4jňñ‡ÿÿvy2gŸΙÿˆñ‡ÿîëÑ2gŸxÿˆÿxš/$d dœ`œfÒdš.œfÑdše2ÿ2hŸše2f›Îvyše2ÿÊvþËŠ5ïÑf/švþËŠ52ÌŸxvyΙaÿ2ÌŸÎ4a›eÿaš.ŸÒŸÒhigÿüËhhgÿ˜˜™š.œfÒdš.œfÒdš.œf›d‰ÿweþÿ%…Ûy‰›ÿwþ3ÿþÍÿŠ5»g¡higÿ˜˜™fÑdÿhhg˜˜™ÿþÏÿœ`œšeÑdxvyaÿ.ÿ90nfÑܘ—hiïhhgù–/ŸˆxÿˆþÏÿÐÊa¡xyxvy˜ÿÿéhxvyˆŠ‡ÿàßàxvyˆŠ‡ÿÿþÍÿš2xxÿþÍÿ3ˆŠ‡ÿxvyaÿ.ÿŸÒš/œÿfÑdfÑdfÑÜš/$fÑÜˆŠ‡ÿàßà3ÿþÍÿÿ˜—™higÿ ! àßàˆŠ‡ÿxvyeÿœxyˆ‰‡xvyhigÿ˜—™‹1vþ1Î5Î5Î5Î544/44/e044/f›ÎŠ5vþË2gŸvEyvEyxvyÙu§aÿ.ÿ2gŸxvñxvñxvyxvñxÿš/$œ`œd dfÎdfœÎše2ÿše2ÿf›ÎŠ5vþËŠ5vþË2ÌŸÎ4aÿΙaÿ»g¡»g¡E™_ŸÒŸÒaÿ.ÿhigÿ˜˜™!—›ï›Ðï›Ð!—›˜˜™hhgî[ëî[ëî[ëî[ëše2ÿwþ›àßààßàœÿ3ßiehhgÿx˜—eÑdaÿ.ÿ90nš/$˜—˜—™µÑaÿ.ÿˆŠ‡ÿš/$š/œÿþÏÿΙaÿÿÿÐÊa06ŸE™_Šqòˆ˜ÿÿ˜ÿÿÿþÍÿhigÿàßààßàhigÿš2éh3àßàxvyŸÒš/œÿxvy ! higÿ3˜—™àßàxvyàßà˜—™àßàœÿÿxvyÕ{ IDAThigÿhigÿhigÿhigÿhigÿ‰ÿÿÿhigÿÿÿhigÿÿΙaÿše2ÿΙaÿÿÿÿÿ‰ÿÿÿ‰ÿÿÿ‰ÿÿÿeÿeÿxÿxÿΙaÿÿš/œÿÿÿš/œÿÿΙaÿeÿeÿše2ÿš/œÿš/œÿ‰ÿš/œÿ‰ÿš/œÿ‰ÿš/œÿÿÿÿÿ‰ÿÿÿ‰ÿÿÿ‰ÿÿÿΙaÿÿeÿÿΙaÿΙaÿeÿaÿ.ÿeÿÿÿ‰ÿÿÿ‰ÿÿÿš/œÿÿˆŠ‡ÿÿÿˆŠ‡ÿÿš/œÿše2ÿ‰ÿeÿÿeÿÿÿše2ÿše2ÿše2ÿÿhigÿhigÿÿÿxÿÿxÿÿÿþÏÿÿÿaÿ.ÿ‰ÿxÿeÿeÿeÿÿÿš/œÿþÏÿΙaÿþÏÿΙaÿÿÿ‰ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿÿþÍÿhigÿˆŠ‡ÿhigÿhigÿÿþÍÿˆŠ‡ÿÿÿ‰ÿš/œÿš/œÿxÿš/œÿš/œÿxÿÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿþÍÿˆŠ‡ÿhigÿhigÿÿeÿeÿš/œÿhigÿš/œÿš/œÿš/œÿ‰ÿ‰ÿ‰ÿ‰ÿÿÿÿÿhigÿÿhigÿÿΙaÿΙaÿΙaÿΙaÿÿÿ‰ÿÿÿ‰ÿ‰ÿÿÿ‰ÿÿÿše2ÿše2ÿše2ÿše2ÿš/œÿÿš/œÿÿše2ÿše2ÿše2ÿše2ÿš/œÿ‰ÿš/œÿ‰ÿ‰ÿš/œÿ‰ÿš/œÿÿÿ‰ÿÿÿ‰ÿ‰ÿÿÿ‰ÿÿÿeÿÿΙaÿÿΙaÿ‰ÿΙaÿeÿ‰ÿÿ‰ÿÿΙaÿˆŠ‡ÿÿˆŠ‡ÿÿΙaÿše2ÿ‰ÿÿ‰ÿÿše2ÿše2ÿÿÿÿÿÿxÿxÿÿxÿxÿÿÿþÏÿÿÿΙaÿÿÿeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆŠ‡ÿ˜ÿÿ˜ÿÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿÿþÍÿ˜ÿÿeÿ˜ÿÿ˜ÿÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿˆŠ‡ÿþÏÿÿÿeÿeÿeÿΙaÿÌÌÑf›Îÿÿÿÿÿÿÿÿÿÿÿÿ‰ÿwþÿÿ’+³ IDAT€ÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿše2ÿfœÎÿ˜ÿÿéhÿšÐ˜˜™ÿÿÿýÍ3ÿþÍÿ3ÿýÍ3ÿþÍÿ3ÿýÍ3ÿþÍÿ3ÿýÍ3ÿþÍÿ3Θa2hŸÿþÍÿ3 ‹T%u¬ÛñðóÿþÍÿ3‰ÿwþþÏÿ1še2ÿï›ÐwþÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿÿþÍÿî%Uî%UÿýÍÿaÿ.ÿaÿ.ÿÿ˜˜™hhgÿ33333ºñ&‹T%u¬Û‹T%higÿÉÿÐÊaÉÿΙaÿ44/e0‰ÿ‰ÿ‰ÿ‰ÿ¹ÿÿÿººÿÿÿÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿÿþÍÿ3ÿaÿ.ÿŸÒaÿ.ÿŸÒÿˆ‰‡xwyÿÿÿÿÿýÍ3ÿÿÿÿýÍ3ÿÿýÍ3ÿýÍ3ÿÿýÍ3ÿΘa2hŸÿýÍ3ÿ ‹T%u¬ÛñðóÿýÍ3‰ÿwþÿÿ‰ÿßie˜—™‰ÿwþhigÿ˜—™ÿÿýÍ3ÿΙaÿÌÌÑï›Ðe0f›Î˜ÿÿ·bIÿžéh¹ÿFºF®¦o IDAT‰Œºikšikšš22bag333ÿÑ3Ï›”Ï›”›geÏ›”‰ŒºÿÑ33babaš2š2›1Ï›1ÏŸÒŸÒÿˆ‰‡àßàÿþÍþÍþÍþÍÿýÍ3ÿýÍÿýÍÿýͺñ&‹T%u¬Û‹T%wþ‰ÿÿÿŠÿÿ‰ÿþÏÿ‰ÿßießie‰ÿþÏÿÿÿÿÿ2gŸï›Ðï›Ðe0ï›Ðÿéi2hŸéiÿººÿþÍÿ‰ŒºwtFÿýÍÿÿþÍÿikš˜˜™3ÿýÍÿÿþÍÿš2ÿh2ÿýÍÿÿþÍÿbaŸfÒg3ÿýÍÿÿþÍÿ3ŠŠ5ÿýÍÿÿþÍÿÿÑ3ÐÊa06Ÿ›geÿýÍÿÿþÍÿÏ›”ÌÌÑ›geÿýÍÿÿþÍÿÏ›”ºñ&‰ŒºÿýÍÿÿþÍÿÿÑ31ÿÏ3ÿýÍÿÿþÍÿba‰ŒºÿýÍÿÿþÍÿš2‰ŒºÿýÍÿÿþÍÿ›1ÏŠ5ÿýÍÿ˜ÿÿ˜ÿÿÿÿxÿÿÿˆ‰‡àßà˜˜™ÿþÍþÍÿýÍÿýÍu¬Û‹T%u¬Û‰ÿŠwþ1wþ˜—™‰ÿ˜—™˜—™ßie1˜—™Θa3Θaf›Îf›Îe0e0ï›ÐΘahhghhghhgΘaFºFººFÿþÍÿ‰ŒºwtFikš˜˜™ÿýÍš2ÿhêy‡êyÿþUbaŸfÒÿ™Í3ŠwþÿýÍÿÑ3ÐÊa06Ÿœ–2fœÎÿýÍÏ›”ÌÌÑf›Îše2ÿf›ÎÿþÍÿÏ›”ºñ&àßà ! àßà—•fÿÑ31ÿÏ1ŠvþËba'‹YwtFš2qòˆwtF›1ÏïÑf/šïÑfvþË3aÿ.ÿŸfÒœÿÿÿýÍ3ÿÿýÍ3ÿÿýÍ3ÿÿýÍ3ÿÿýÍ3ÿÿýÍ3‰ÿwþ‰ÿwþhigÿ˜—™higÿ˜—™‰ÿwþÿÿÿ‰ÿe0ï›Ðwþhigÿ˜—™higÿ˜—™¹ÿFºF3‰Œº‰Œºxwy3—•f ! ÿý͈‰‡hhgÿýÍ33èfÎrŠˆéþΈŠ”Ú  IDATRihÿþU33žÿŸˆ%‡ÿ™Íˆ%‡hgÿ™Í33þÍ‰Š‡vþËÿŠ…ßieÿýÍ33/ͺñ&/Íî%UÎ5ÿýÍ331elî%Ue™›ˆŠ‡ÿÎ5ÿþÍÿ331elwtF ! àßà—•f33/Í‰Š‡/Í‰Š‡iigvþË33žÿŸ'‹YžÿŸàßàwtF33èfÎqòˆèfÎàßàwtF33eÏ1î[ëeÏ1ÿŠ…Î:ËvþË3ŸÒaš.œÿÿÿÿÿýÍÿýÍÿýÍÿýÍÿÿýÍÿýÍÿýÍÿýÍÿÿýÍÿýÍÿýÍÿýÍÿÿýÍÿýÍÿýÍÿýÍÿÿýÍÿýÍÿýÍÿýÍÿÿýÍÿýÍÿýÍÿýÍwþ‰ÿ!—›higÿ‰ÿšd2šd2‰ÿe0ï›Ð‰ÿ2üË2üËGGºîÿîÿîÿîÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿÿÿxÿxÿíïëÿíïëÿÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿîÿ‰ÿîÿîÿ‰ÿîÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿÿÿÿhigÿhigÿÿ˜ÿÿÿÿíïëÿÿÿ˜ÿÿ˜ÿÿÿÿþÏÿÿþÏÿÿÿΙaÿše2ÿše2ÿ™/ÿ™/ÿÿÿxÿxÿÿÿíïëÿš/œÿš/œÿíïëÿÿΙaÿþÏÿΙaÿše2ÿše2ÿše2ÿ‰ÿ‰ÿše2ÿše2ÿΙaÿΙaÿ‰ÿše2ÿše2ÿÿþÍÿÿþÍÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿ‰ÿÿÉÿÉîÿüxvyˆŠ‡ÿwtFwtFhigÿhigÿˆŠ‡ÿ ! ! ˆ‰‡higÿˆŠ‡ÿ˜ÿ*©˜ÿèfÎèfÎÿþÍÿÿÿŠ1ÿÿ1Šÿÿ2U£ÿ44/44/ÿgÑ™/ÿgÑüÿ—ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿ¶ÔŒl IDATÿÿÿÿhigÿiigÿþUÿþUiigÿÿ2gŸΙaÿΙaÿ2gŸeÿfÎeÿÿ™+ÿÿ™+ÿï›Ðše2ÿe0e0še2ÿï›Ð‰ÿ‰ÿˆŠ‡ÿΙaÿ»g¡‰ÿ‰ÿˆŠ‡ÿ‰ÿ‰ÿÿwþˆŠ‡ÿˆŠ‡ÿše2ÿše2ÿše2ÿše2ÿΙaÿÿþÍÿ‰Œº‰ŒºÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿÿwvyhigÿˆŠ‡ÿÿþÍÿÿÿÿÿÿþÍÿ‰ÿÿþÍÿÿÿÿþÍÿ‰ÿîÿˆŠ‡ÿhigÿÿþÍÿÿÿÿþÍÿhigÿÿÿÿÿÿÿÿˆŠ‡ÿÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿ˜ÿÿ˜ÿÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿÿÿÿÿÿÿ‰ÿ‰ÿ‰ÿÿÿÿÿîÿîÿše2ÿše2ÿîÿîÿΙaÿΙaÿΙaÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿhigÿÿhigÿÿÿaÿ.ÿaÿ.ÿhigÿÿÿÿÿxÿÿÿÿÿhigÿše2ÿ™/ÿÿÿÿÿÿÿhigÿhigÿhigÿÿΙaÿþÏÿÿþÍÿþÏÿΙaÿaÿ.ÿeÿhigÿþÏÿþÏÿ‰ÿ‰ÿ‰ÿše2ÿše2ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿˆŠ‡ÿΙaÿ‰ÿΙaÿˆŠ‡ÿÿþÍÿ‰ÿ‰ÿ‰ÿ‰ÿše2ÿše2ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿše2ÿ‰ÿ‰ÿÿ‰ÿÿ‰ÿše2ÿΙaÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿˆŠ‡ÿÿþÍÿÿþÍÿš/œÿÿÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿÿÿÿÿÿþÍÿÿÿþÍÿÿÿ‹3ÿýÍ‹3üxyhigÿikšÿýÍikšêŒÿþB¾˜˜™hhg˜˜™ÿàßàÿ ! qòˆxqòˆ‰Œ‰ŒºwtFÿÿuÏþ1‰ÿv™)gÕše2ÿï›Ðwþüîÿf‰Òüîÿüÿ™+ÿgÕÿ™+ÿ›ÌÑΙaÿΙaÿºñ&xvyÿxwyÿˆŠ‡ÿÿÿ˜˜™ÿ˜˜™ÿÿaÿ.ÿ9fÿ.ÿŸÒœ—ÿdi®—˜êyˆêÿ‡®—˜™™/ÿ5jagŸÿÿhhg——™hhg˜—™þÏÿŸ/Í/Í03þÏÿ1aÿ.ÿaÿ.ÿŸÒ›˜e™ÿeÿ›þÏÿÐÊa06ŸþÏÿ1wþ‰ÿwþˆŠ‡ÿàßàE0úEÿÚxΙaÿÌÌÑE™_še2ÿÛ«Š5e0e›Î›e2še2ÿf›ÎˆŠ‡ÿxvyˆŠ‡ÿxvyxvyÿÿxï›Ðwþ‰ÿÿuÏþ1wþ‰›Ðÿ4/FÚFFÚÏ›Ú1elš/œÿfÑdš/œÿfÑdf ! êÿÿ2ÿêîÿ›üûeüˆŠ‡ÿàßà ! xvy‹ÿuÿ‹uÿ‹uÿˆŠ‡ÿxwyÿÿþÍÿ‰ŒºwtF3ÿþÍÿ3þÏÿ1ÿÏ1ÿÏ1‰ÿwþše2ÿf›Î‰ÿûxΘa2gŸ™/ÿgÑ™/ÿgÑÿ™+ÿgÕΙaÿÌÌÑ44/2gŸˆŠ‡ÿxvyÿÿˆŠ‡ÿxwyÿÿÿÿÿaÿ.ÿŸÒše2ÿf›Îaÿ.ÿŸÒœ—ÿci—dihigÿ®—˜êy‡êÿÿêše2ÿï›Ðwþÿÿÿÿiig˜˜™hhg˜—™Ιaÿ06Ÿ/ÍÿÑ3ÐÊa2gŸaÿ.ÿ k€' IDATŸfÒ›eÿ›Ιaÿ2gŸše2ÿf›ÎˆŠ‡ÿàßàf0ú2gŸΙaÿÌÌÑf›Î‰ÿe0e›Î›e2ï›ÐÿŠ…xv€ÿyˆŠ‡ÿxvyˆŠ‡ÿxvy‰ÿwþ‰ÿvþËÏ›”1elÏ›”1elÏ›”1el3š/œÿïÑf/šïÑfwþˆŠ‡ÿxvyˆŠ‡ÿxvyˆŠ‡ÿxvyÿÿêÿÿêîÿîÿˆŠ‡ÿˆŠ‡ÿÿþÍÿ‹ÿ‹ÿ‹ÿÿþÍÿÿˆŠ‡ÿˆŠ‡ÿÿÿˆŠ‡ÿˆŠ‡ÿÿÿþÍÿˆŠ‡ÿÿþÍÿ‰ÿ‰ÿÿÿÿÿ‰ÿ‰ÿše2ÿše2ÿ‰ÿÿÿ‰ÿÿ™/ÿΙaÿΙaÿše2ÿše2ÿΙaÿaÿ.ÿše2ÿaÿ.ÿÿÿÿÿÿÿÿÿÿÿÿše2ÿše2ÿš/œÿÿÿÿÿÿhigÿÿš/œÿΙaÿþÏÿΙaÿeÿaÿ.ÿeÿeÿeÿhigÿþÏÿþÏÿše2ÿše2ÿše2ÿše2ÿhigÿhigÿΙaÿΙaÿΙaÿΙaÿΙaÿΙaÿše2ÿše2ÿ‰ÿ‰ÿše2ÿ‰ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿΙaÿÿþÍÿΙaÿΙaÿÿþÍÿΙaÿÿþÍÿš/œÿ‰ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿîÿîÿˆŠ‡ÿˆŠ‡ÿ‹ÿÿ‹ÿÿˆŠ‡ÿhigÿÿhigÿˆŠ‡ÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿ‰ÿÿÿÿÿÿÿÿÿÿÿ‰ÿÿ‰ÿÿüÿ—ÿΙaÿše2ÿaÿ.ÿaÿ.ÿÿÿÿÿše2ÿše2ÿÿÿÿhigÿÿΙaÿþÏÿΙaÿeÿhigÿhigÿeÿeÿhigÿše2ÿše2ÿΙaÿΙaÿΙaÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿše2ÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿÿþÍÿΙaÿÿþÍÿÿþÍÿΙaÿÿþÍÿš/œÿš/œÿˆŠ‡ÿˆŠ‡ÿš/œÿš/œÿ˜ÿÿ˜ÿÿše2ÿše2ÿše2ÿþÏÿÿÿaÿ.ÿaÿ.ÿeÿÿÿ˜ÿÿÿÿxÿÿÿÿxÿÿþÍÿˆŠ‡ÿˆŠ‡ÿþÏÿše2ÿše2ÿþÏÿÿÿš/œÿeÿÿÿÿ‰Bäà IDATxÿxÿÿÿÿÿÿÿxÿˆÿÿêyˆÿþÍÿ3˜ÿÿéhš/œÿfÑdš/œÿfÑdš/œÿfÑdš/œÿfÑdÿþÍÿš2èfÎ3ÿÿê˜ÿÿéi—ÿÿhêše2ÿe™›3‰ÿe0f›ÎÿÿýÍ3higÿ˜—™aÿ.ÿŸfÒaš.ŸfÒ›ÿÿ˜éhÿÿêyˆÿ˜ÿÿÿhêy‡˜éhˆŠ‡ÿxvyše2ÿï›ÐvþËŠ5e0f›Îš/œÿfÑdeÿœÿÿÿxÿþψ2ÿÿÿÿÿÿîÿ›üûwîÿüîÿüîÿüîÿüxÿêyxÿ˜ÿÿš2ÿþÍÿ˜ÿÿ˜ÿÿxÿÿÿxÿxÿΙaÿΙaÿÿþÍÿš/œÿeÑdeÑdš/œÿ‰ÿeÑd3ÿh3ÿþÍÿÿÿééÿÿ˜ÿÿ—ÿÿh3wþÿþÍÿþÏÿÿþÍÿÿÿýÍÿþÍÿhigÿ——™——™higÿŸfÒ›þjÿÿ˜ÿÿÿÿéþÎéþ·ÿxÿÿhꘇ‡êÿhˆŠ‡ÿxwyxwyxvywþ33wþfÑdfÑd}icþjþjþÎþΚ/$ˆˆ1xš.œÿÿaþ.aþ.ÿ›ü‰ÿ‰ÿü›üîÿîÿü›üîÿüš/$š/$ÿþUÿþU˜ÿÿš2ÿþÍÿÿþÍÿÿþÍÿ˜ÿÿƒ—ƒ—xÿêyxÿΙaÿ2gŸÏ›”fÑdxfÑÜxfÑdfÑdš/œÿ/š›/œš/œÿš/œÿfÑd˜ÿÿÿhêÿþÍÿÿþÍÿêxêyxê˜ÿÿéþÎêf›Îše2ÿþÏÿÿÑ32ÿÑ3þÏÿÿ‰ŒºÿþÍÿÿþÍÿÿþÍÿÿþÍÿ˜—™˜˜™˜—™›aÿ.ÿÐÒéþÎèfÎê22êyˆÿ˜ÿÿéh˜‡êÿÿˆ‰‡hhg‰ÿ‰ÿ˜ÿÿ˜ÿÿƒ—––2d2xÿÿfÑdš.œÿˆfÑdÿÿŸÒaÿ.ÿaÿ.ÿÿîÿ(Ü1ûw‰ÿ›üüîÿ‰ÿ(Ü1›üîÿA"Ú IDATš/œÿš/œÿš/œÿš/œÿÿÿ˜ÿÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿš/œÿš/œÿÿÿš/œÿš/œÿš/œÿš/œÿxÿxÿÿþÍÿÿþÍÿ˜ÿÿ˜ÿÿΙaÿΙaÿΙaÿxÿ‰ÿš/œÿ‰ÿš/œÿ˜ÿÿÿÿxÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿ˜ÿÿxÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿÿÿÿÿše2ÿše2ÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿÿÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿ˜ÿÿ˜ÿÿÿaÿ.ÿþÏÿþÏÿeÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿÿÿÿ˜ÿÿÿÿÿÿxÿ˜ÿÿÿÿÿÿ˜ÿÿÿÿ˜ÿÿˆŠ‡ÿˆŠ‡ÿhigÿ‰ÿše2ÿÿþÍÿÿþÍÿše2ÿ‰ÿ˜ÿÿš/œÿš/œÿš/œÿeÿeÿeÿeÿeÿÿÿeÿÿeÿÿÿš/œÿÿš/œÿÿÿeÿeÿaÿ.ÿaÿ.ÿ‰ÿîÿ‰ÿîÿ‰ÿ-e1ÿ-e1ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿîÿ-e1ÿš/œÿš/œÿÿÿš/œÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿÿÿÿÿš/œÿš/œÿš/œÿš/œÿš/œÿ˜ÿÿ˜ÿÿÿÿÿÿΙaÿxÿš/œÿš/œÿš/œÿÿÿxÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿxÿ˜ÿÿÿÿþÏÿše2ÿše2ÿše2ÿþÏÿþÏÿþÏÿše2ÿÿÿþÍÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿþÏÿþÏÿeÿþÏÿeÿÿþÍÿhigÿˆŠ‡ÿÿþÍÿ˜ÿÿxÿ˜ÿÿxÿxÿ˜ÿÿxÿÿÿ˜ÿÿÿÿÿÿˆŠ‡ÿhigÿhigÿ‰ÿše2ÿše2ÿ‰ÿ˜ÿÿš/œÿš/œÿš/œÿš/œÿš/œÿeÿaÿ.ÿeÿeÿaÿ.ÿÿaÿ.ÿeÿeÿeÿeÿeÿÿeÿxÿš/œÿÿxÿxÿš/œÿÿÿÿeÿaÿ.ÿ‰ÿ‰ÿš™0ÿ‰ÿ-e1ÿ-e1ÿ‰ÿ—™ÿîÿ-e1ÿ‰ÿš/œÿš/œÿš/œÿš/œÿÿÿÿÿÿÿš/œÿš/œÿ˜ÿÿÿÿΙaÿxÿxÿš/œÿš/œÿš/œÿ˜ÿÿÿÿxÿxÿÿÿÿÿÿÿ‰ÿše2ÿ‰ÿ‰ÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿÿþÍÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿaÿ.ÿþÏÿeÿhigÿhigÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿÿ˜ÿÿÿ˜ÿÿÿÿÿÿhigÿhigÿ‰ÿ‰ÿ˜ÿÿÿš/œÿÿš/œÿÿš/œÿaÿ.ÿÿaÿ.ÿÿaÿ.ÿaÿ.ÿÿaÿ.ÿÿeÿaÿ.ÿxÿš/œÿxÿš/œÿxÿÿÿÿÿeÿaÿ.ÿ-e1ÿš™0ÿš™0ÿ-e1ÿ—™ÿ—™ÿ—™ÿ-e1ÿ—™ÿ-e1ÿ÷*lK IDATÿÿÿÿÿÿÿÿΙaÿš/œÿš/œÿš/œÿÿÿÿÿxÿÿÿÿÿÿÿ‰ÿše2ÿše2ÿÿþÍÿÿþÍÿÿþÍÿeÿhigÿhigÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿÿ˜ÿÿÿ˜ÿÿÿ˜ÿÿÿÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿxÿxÿxÿÿeÿeÿaÿ.ÿaÿ.ÿš™0ÿ—™ÿ—™ÿ—™ÿ-e1ÿ-e1ÿ-e1ÿ—™ÿ—™ÿ-e1ÿ-e1ÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿše2ÿÿhigÿ‰ÿþÏÿ‰ÿ‰ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿþÏÿΙaÿΙaÿÿþÍÿÿÿÿÿþÏÿþÏÿÿþÍÿTUSÿTUSÿÿÿÿÿTUSÿTUSÿ‰ÿÿ‰ÿÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿTUSÿTUSÿÿþÍÿˆŠ‡ÿˆŠ‡ÿaÿ.ÿaÿ.ÿaÿ.ÿše2ÿaÿ.ÿþÏÿþÏÿÿše2ÿše2ÿše2ÿÿÿþÍÿÿše2ÿÿÿþÍÿ˜ÿÿ˜ÿÿhigÿˆŠ‡ÿΙaÿhigÿΙaÿ‰ÿÿÿš/œÿÿþÏÿÿÿþÏÿš/œÿˆŠ‡ÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿaÿ.ÿaÿ.ÿÿÿÿÿÿþÏÿÿþÏÿaÿ.ÿaÿ.ÿÿše2ÿše2ÿΙaÿše2ÿše2ÿÿÿÿÿþÍÿÿþÍÿÿþÍÿÿÿþÏÿÿþÍÿÿÿÿþÍÿÿþÍÿaÿ.ÿeÿÿÿTUSÿÿTUSÿTUSÿTUSÿTUSÿÿTUSÿ‰ÿše2ÿše2ÿ‰ÿÿΙaÿΙaÿÿÿÿTUSÿTUSÿTUSÿTUSÿTUSÿTUSÿTUSÿTUSÿΙaÿše2ÿše2ÿÿaÿ.ÿše2ÿeÿše2ÿeÿaÿ.ÿše2ÿaÿ.ÿaÿ.ÿÿƒt|Ó IDAT€ÿΙaÿï›Ðï›Ð‰ÿΙaÿÿ›geþÎdjÎþΛgeše2ÿÿhÿþÏÿÿÿþÏÿÿhhigÿhigÿþÏÿ˜—™xvy2gŸˆŠ‡ÿˆŠ‡ÿΙaÿˆŠ‡ÿˆŠ‡ÿ˜˜™ºñ&wþ‰ÿÿÿýÍÿeÑdÿ1›/œ1eÑdxvyˆ‰‡ˆ‰‡xvyaÿ.ÿ¶™Ñ¶™Ñaÿ.ÿ—ÿ—ÿ—ÿ—ÿÿxÿ1þÎþÏÿÿΙaÿÿÿaÿ.ÿÿÿÿÿÿše2ÿ44/44/še2ÿΘaΘa3ÿþÍÿš2ÿþÍÿÿÿÿÏ/ÍÿÑ3ÿÏÿÿÿþÍÿ3ÿþÍÿ˜ÿÿ3aÿ.ÿžÒœÿÿaþ.ÿwþwþÿÿÿΙaÿ»g¡‰ÿÏ™a«©z454454454454454še2ÿ1gŸe›Îšd2še2ÿÿfÎ9ffΚ/œÿaÿ.ÿš.œš/œÿÿΙaÿ2hŸ‰ÿwþÿΙaÿ»g¡e0djΜ–2|›ÍêÿÿêÿÿéþÎikš ! xvyhigÿ ! xvyˆŠ‡ÿàßà˜—™higÿ˜˜™hhg ! FÚ2hŸÿΙaÿ2gŸš/œÿeÑdþÍ›1ÏfÑdˆŠ‡ÿxwyˆ‰‡xvy˜ÿÿéhy‡êeaš.ŸÒxÿˆaÿ.ÿŸÒÿÿ˜éh˜ÿÿéhyˆþÎ2ÿΙaÿHgžêÿx‡êÿÿ„e3f›Îše2ÿ44/ÌÌÑf›Îše2ÿf›ÎÿΘa2gŸÿþÍÿ3ÿÿÿÏ1ÿþÍÿš2ÿhêeÿœdaš.ŸfÒ›TUSÿ¬¬­TTS¬«­še2ÿfœÎÿΙaÿ»g¡E™_»g¡wþTUSÿFßfœÎ‰ÿe0ï›Ðwþÿše2ÿf›Îše2ÿï›Ðwþš/œÿfÒdš.œïÑfwþš.œfÑdhigÿ˜—™higÿ˜—™wþï›Ðœ–2ï›Ðï›ÐêÿÿÿÿéþÎéþÎéþÎÿÿêikš ! ! ˆŠ‡ÿÿþÍÿΙaÿˆŠ‡ÿ ! xvyxvy ! hhg˜—™˜—™v{ÿΘaΙaÿΙaÿfÑd›/œ3›1Ï3fÒdˆŠ‡ÿéhˆ‡Kÿ/ŸÒˆxÿÿÿ80Ò80Òaÿ.ÿêéh˜ÿÿéhyÿþÎ2œ–22ÿše2ÿΙaÿše2ÿÌÌÑKÿ/êy44/ˆŠ‡ÿî%Uºñ&ï›Ðf›ÎþÏÿše2ÿše2ÿþÎþÎ06Ÿ2gŸ3311š2aš.›dŸÒaš.TTSTTSTTSTTSše2ÿfœÎf›ÎfœÎf›Îšd2ÿÿ2gŸwþ»g¡wþ454454454«©z454454wþï›Ðf›Î44/ÇÐ’/šÇÐ’˜—™˜—™ÎvWÁ IDATÿßieï›Ðï›Ðï›ÐwþÎ5ê222ꘗ™ ! àßàÿþÍÿ3ÿþÍÿΙaÿ2gŸΙaÿˆŠ‡ÿxvyàßàΙaÿxvy ! ˜—™ ! ‰ÿwþ2gŸΙaÿΘaˆ‰‡ÌÌÑ2gŸ2gŸeÑdfÒd›/œˆŠ‡ÿêeêyŸJxÿÿÿýÍgÒÈÐ.ŸÒ˜ÿÿxÿxÿéhyˆf›Î‹12ÿše2ÿÌÌÑše2ÿše2ÿf›Îˆ‰‡ˆŠˆŠêyKÿ/2gŸxvyv{v{‰ÿœ–2djÎdjΜ–2ÿþÍÿ33ÿþÍÿÿÿþÏÿéhÿhê›eÿ454454‰ÿï›Ðï›Ð‰ÿÿΙaÿE™_E™_ÌËÌÌËÌÌËÌUW†ÌËÌÌËÌf›Îÿwþšd2ÿf›ÎwþŸÒÿfÑdd dd dwþÿŸÒhigÿ2gŸÿΙaÿwþwþΘa2gŸ˜—™wþe0wþe0˜—™êꘗ™àßààßààßà˜—™ÿþÍÿÿþÍÿÿþÍÿ‰ŒºˆŠ‡ÿΙaÿΙaÿΙaÿºñ&ˆŠ‡ÿxvyºñ&‰ÿwþ›/œÿeÑdeÿ›xeˆeÿˆxÿ3ŸÒeÿ˜ÿÿéhyˆˆˆxÿ1ÿþÏÿwþþÎÿÿÊÎÿÊÎf›Îf›ÎŸÒxvyxvñxwyˆŸÒ‰ÿwþwþdjΜ–2œ–21f›Î331ÿþÍÿéhêÿþÍÿŸÒaÿ.ÿŸÒÌËÌÌËÌf›Îÿwþwþf›ÎΙaÿ2gŸwþΙaÿ«©z454454454454454še2ÿwþf›Îšd2ΙaÿÌÌщÿš/œÿœ`œœ`œ‰ÿÿ˜—™ΙaÿÿΙaÿÿhigÿhigÿ˜ÿÿÿ˜ÿÿÿˆŠ‡ÿˆŠ‡ÿÿþÍÿΙaÿΙaÿÿþÍÿΙaÿše2ÿše2ÿΙaÿÿþÍÿhigÿˆŠ‡ÿhigÿˆŠ‡ÿΙaÿÿþÍÿÿþÍÿΙaÿΙaÿ‰ÿÿ‰ÿÿeÿxÿxÿeÿxÿxÿeÿeÿxÿxÿxÿÿÿeÿ˜ÿÿxÿxÿxÿxÿxÿše2ÿÿþÏÿÿ™/ÿ™/ÿaÿ.ÿÿaÿ.ÿÿše2ÿše2ÿše2ÿþÏÿþÏÿše2ÿþÏÿþÏÿþÏÿÿþÍÿÿÿþÏÿþÏÿeÿeÿTUSÿÿÿÿÿÿÿTUSÿ‰ÿÿ‰ÿÿΙaÿΙaÿTUSÿTUSÿTUSÿTUSÿTUSÿTUSÿTUSÿTUSÿše2ÿÿše2ÿÿΙaÿše2ÿše2ÿ‰ÿ‰ÿ‰ÿš/œÿš/œÿ‰ÿ‰ÿ‰ÿ‰ÿÿõÐ'Å IDATΙaÿÿþÍÿÿhigÿΙaÿΙaÿÿΙaÿΙaÿÿÿþÍÿÿþÍÿ˜ÿÿ‰ÿ‰ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿaÿ.ÿše2ÿaÿ.ÿΙaÿÿþÍÿΙaÿš/œÿš/œÿš/œÿš/œÿš/œÿše2ÿše2ÿÿþÍÿhigÿeÿeÿÿše2ÿše2ÿÿþÍÿ1elÿþÍÿîÿîÿÿ˜—™higÿˆŠ‡ÿÿÿèhwþÿÿˆŠ‡ÿxwyxwyˆŠ‡ÿÿþÍÿÿþÍÿÿÿÿše2ÿše2ÿwþuÏþuÏþwþaÿ.ÿŸÒše2ÿe™›‰ÿŸÒaÿ.ÿˆŠ‡ÿÿÏ›”še2ÿÿeÏ1}iceÏ1˜ÿÿaÿ.ÿaÿ.ÿΙaÿše2ÿše2ÿΙaÿÿþÍÿÿþÍÿÿÿše2ÿše2ÿ˜—™higÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿÿhigÿÿÿÎ4aÎ4aÿÿše2ÿf›ÎÿþÍÿ3ÿþÍÿ3ÿþÍÿ3Ιaÿ2gŸ‰ÿ|‰þûe‰þwþˆŠ‡ÿxvyhigÿ ! xvy‰ÿûxÿÿþÍÿ3ÿ™/ÿgÑ™/ÿgÑÿþÍÿš2èfÎ3še2ÿf›Îše2ÿf›Î‰ÿwþˆŠ‡ÿxwyˆ‰‡àßà˜—™˜ÿÿéh˜ÿÿèfÎ3ÿÿþÏÿ1še2ÿf›ÎþÏÿ‹1uÏþ1aÿ.ÿŸfÒš2ï›Ðweþ›aÿ.ÿŸÒΙaÿ1gŸ›e2f›ÎþÏÿÐÊa2gŸše2ÿfœÎšd2fœÎÿ˜ÿÿéhy˜‡ÿhêÿeÿaš.ŸÒΙaÿ2gŸΙaÿÌÌÑ44/2gŸˆŠ‡ÿwtF‰Œºxvyše2ÿf›Îhigÿ˜—™higÿ——™ÿÿiig˜—™ΙaÿÌÌÑfœÎšd2fœÎ‰ÿe0f›Î˜¸— IDATše2ÿ‰ÿ‰ÿÿþÍÿ‰ÿÿþÍÿ‰ÿše2ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿþÏÿˆŠ‡ÿˆŠ‡ÿΙaÿše2ÿΙaÿΙaÿše2ÿše2ÿÿΙaÿΙaÿÿþÍÿÿþÍÿ‰ÿ‰ÿš/œÿ‰ÿ‰ÿ‰ÿ‰ÿˆŠ‡ÿ‰ÿÿhigÿhigÿhigÿhigÿÿ‰ÿÿþÍÿÿhigÿhigÿhigÿhigÿÿÿþÍÿ™/ÿÿ™+ÿÿ™+ÿ™/ÿÿþÍÿ˜ÿÿÿþÍÿÿþÍÿ˜ÿÿÿþÍÿše2ÿše2ÿše2ÿše2ÿše2ÿše2ÿ‰ÿ‰ÿ‰ÿ‰ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿ˜ÿÿÿþÍÿÿÿÿhigÿÿÿÿþÏÿše2ÿ‰ÿ‰ÿ˜ÿÿ‰ÿ˜ÿÿ‰ÿše2ÿÿÿ‰ÿ‰ÿ‰ÿ‰ÿÿÿše2ÿÿ‰ÿaÿ.ÿeÿaÿ.ÿΙaÿše2ÿÿÿše2ÿΙaÿΙaÿše2ÿ‰ÿ‰ÿÿÿše2ÿÿše2ÿÿÿÿÿxÿxÿxÿxÿxÿÿÿÿþÍÿeÿeÿeÿaÿ.ÿaÿ.ÿΙaÿΙaÿΙaÿΙaÿΙaÿΙaÿΙaÿÿþÍÿˆŠ‡ÿÿþÍÿše2ÿ‰ÿ‰ÿaÿ.ÿ‰ÿaÿ.ÿ‰ÿše2ÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿhigÿhigÿhigÿhigÿhigÿše2ÿÿše2ÿΙaÿÿΙaÿï›Ðwþ5ÿuÏþŠ5wþ‰›Ðÿ‰%ºˆŠ‡ÿˆŠ‡ÿxvyikšhigÿ‰ŒºŠ»‡àßàÌÌÑÌÌÑ2gŸ1el33Ιaÿ»g¡/š•¦œ/ïÑfˆŠ‡ÿxvyàßàˆŠ‡ÿàßà ! xvy1Æ™—0ĘgÑÿ™+ÿš–ÕgÕfše2ÿï›ÐvþËŠ5vþËŠ5še2ÿï›Ðwþwþ‰ÿÿŠ…xvyÿþÍÿ‰ŒºÿþÍÿÿÿÿÿhhg˜˜™ÿˆŠ‡ÿxvyˆŠ‡ÿŠ»yï›Ðwþ‰hÿuÏþ1wþ‰›Ðÿ‰ÿvþÿÿþwþwaÿ.ÿŸfÒšd2ï›Ðeÿ›ŸÒ›ŸÒÿ2gŸΙaÿšÿ›Î›Î2gŸše2ÿwþfœÎêy˜‡éhy3eÿj9ù–Ç2gŸše2ÿÌÌÑše2ÿÿþÍÿ‰Œº1eFÏ›”&ï›Ðwþ‰ÔÿuÏþ‹Ôwþ‰›ÐÿˆŠ‡ÿàßààßàˆŠ‡ÿxvy ! ˜—™higÿ ! xvy ! ïv›ï›Ð2λg¡wþ1wþxvy‰Œº‰Œº‰Œº‰Œºxvy˜—™àßààßààßààßàΙaÿ44/44/44/šd2Ιaÿ3ÿþÍÿ2gŸxvyhigÿ ! higÿxvyxvyÉagÒgÒÉaÏ›”hÕhÕÏ›”ÿ™+ÿš–Õš–Õš/ÿþÍÿš23èfΘÿÿï›ÐwþŠ5uÏþŠ5wþï›Ðwþ‰ÿwþwþ‰ÿwþxvy‰Œº˜—™xvyÿþÍÿÿþÍÿš2˜ÿÿéh˜˜™ÿˆŠ‡ÿˆŠ‡ÿxvywþßie1ßiewþ‰ÿЉÿŠÿÿaÿ.ÿŸÒ›ï›Ð›aÿ.ÿ2gŸ44/ÿÿΙaÿÿÿΙaÿ˜‡éhy›hghg˜ü™44/ÌÌÑÌÌÑ2gŸ3xvyÏ›”1elxvyÿþÍÿ3wþßie1ßiewþxvy˜—™˜—™àßààßàˆŠ‡ÿˆŠ‡ÿe0hhgΙaÿwþ›‰ÿÿE™_!—`A IDAT€ÿhigÿhigÿhigÿhigÿše2ÿše2ÿše2ÿše2ÿše2ÿše2ÿše2ÿše2ÿÿþÍÿÿþÍÿ‰ÿ‰ÿš/œÿš/œÿš/œÿ‰ÿ‰ÿhigÿˆŠ‡ÿˆŠ‡ÿ™/ÿÿ™/ÿÿÿ™+ÿÿÿ™+ÿÿÿ™+ÿ™/ÿ™/ÿÿþÍÿ˜ÿÿÿþÍÿ˜ÿÿ‰ÿhigÿhigÿ‰ÿ‰ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿhigÿÿþÍÿÿþÍÿÿþÍÿ˜ÿÿÿÿÿÿÿhigÿÿÿˆŠ‡ÿše2ÿˆŠ‡ÿše2ÿhigÿhigÿhigÿ‰ÿhigÿ‰ÿÿÿ‰ÿ‰ÿ‰ÿ‰ÿše2ÿše2ÿše2ÿ‰ÿ‰ÿeÿeÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿΙaÿše2ÿÿ‰ÿÿÿ‰ÿÿše2ÿÿÿxÿÿÿxÿÿÿxÿÿÿÿÿaÿ.ÿeÿΙaÿΙaÿše2ÿše2ÿΙaÿΙaÿÿþÍÿÿþÍÿΙaÿÿþÍÿhigÿhigÿhigÿhigÿhigÿhigÿhigÿˆŠ‡ÿΙaÿÿše2ÿÿ˜—™˜—™˜—™˜—™Ιaÿ3ÿþÍÿ3/šïÑfhigÿ˜—™ˆŠ‡ÿàßààßàš–Õwþhigÿ˜—™˜—™higÿˆŠ‡ÿ‰Œºàßàhigÿš2ÿÿ˜˜™ÿˆŠ‡ÿÛ«f›Î˜—™˜—™˜—™ßie˜—™wþhigÿwþwþše2ÿe0‰ÿeÿeÿ›Ιaÿ2gŸf›Îf›Îf›Îf›Îÿe0ÿe0f›Îêy‡êyaÿ.ÿŸfÒeÿ2gŸf›Îf›Î2gŸÿþÍÿ‰Œº31el‰Œº˜—™˜—™˜—™higÿ˜—™˜—™xvyÌÌÑ44/ÿÿÿÿše2ÿše2ÿÿÿΙaÿše2ÿÿþÍÿΙaÿÿþÍÿΙaÿþÏÿÿÿÿÿÿÿÿÿhigÿhigÿÿþÍÿÿþÍÿÿÿÿþÍÿÿþÍÿþÏÿˆŠ‡ÿþÏÿ™/ÿše2ÿ™/ÿaÿ.ÿeÿeÿeÿþÏÿþÏÿþÏÿþÏÿÿÿþÍÿÿþÍÿÿÿ˜ÿÿaÿ.ÿaÿ.ÿaÿ.ÿ˜ÿÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿÿÿÿÿÿÿÿÿš/œÿhigÿhigÿÿÿÿÿše2ÿ‰ÿše2ÿ‚°ÕÆ IDATÿÿÿÿÿÿÿÿf›Îe›Î›e2ÌÌÑï›Ðše2ÿÿše2ÿÏ›”Ï›”ÿˆŠ‡ÿš/œÿš/œÿš/œÿš/œÿˆŠ‡ÿ06ŸÎ˜aÿþÍÿþÏÿþÎhigÿhigÿÿþÍÿ3ÿÿÿÿÿÿ3ÿÿÿÿ3ˆŠ‡ÿŠ»‡Š»‡ˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿfÏÍÿÊÎfÏÍˆŠ‡ÿhigÿhigÿŸÒaÿ.ÿeÿ›þjÿÿœ–2þÏÿÿ12ÿÿþÍÿÿþÍÿÿÿþÍÿÿþÍÿÿþÏÿþÏÿÿÿÿÏþÏÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿþÍÿÿÿeÿéÍŸfÒŸfÒaÿ.ÿeÿéÍŸfÒŸfÒaÿ.ÿÿÿŠÿÿŠÿÿÿÿÿÿÿÿš/œÿeÑdš/œÿhigÿ˜ÿÿˆŠ‡ÿÿhigÿ‰ÿ‰ÿhigÿše2ÿï›Ðwþše2ÿï›Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ÿ‰ÿΙaÿ‰ÿše2ÿÿše2ÿše2ÿše2ÿÿÿše2ÿš/œÿš/œÿš/œÿš/œÿš/œÿš/œÿÿþÍÿˆŠ‡ÿÿΙaÿþÏÿÿeÿˆŠ‡ÿÿþÍÿ‰ÿÿÿ‰ÿ‰ÿÿhigÿÿÿÿÿhigÿÿþÍÿÿþÍÿÿÿÿxÿÿÿÿþÍÿÿÿ‰ÿÿÿÿþÍÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿše2ÿÿþÍÿˆŠ‡ÿÿþÍÿˆŠ‡ÿše2ÿaÿ.ÿaÿ.ÿaÿ.ÿÿÿÿþÍÿeÿÿþÍÿ˜ÿÿše2ÿše2ÿþÏÿþÏÿþÏÿÿÿþÍÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿþÍÿše2ÿÿþÍÿše2ÿþÏÿaÿ.ÿÿÿÿÿÿÿaÿ.ÿþÏÿþÏÿÿþÍÿaÿ.ÿÿþÍÿÿÿxÿxÿhigÿxÿÿÿÿÿÿÿ˜ÿÿ˜ÿÿÿþÍÿÿÿÿþÍÿeÿeÿeÿaÿ.ÿÿÿÿþÍÿeÿeÿeÿaÿ.ÿÿÿ‰ÿÿÿÿÿÿÿÿÿÿþÏÿÿÿ‰ÿÿÿš/œÿhigÿhigÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿÿhigÿhigÿhigÿÿÿÿÿhigÿhigÿhigÿ‰ÿše2ÿše2ÿše2ÿše2ÿ‰ÿe0‰ÿE™_f›Îšd2fœÎfœÎ‰ÿï›Ðše2ÿš/œÿeÏ1eÏ1š/œÿ‰Œºxwyÿºñ&ÐÊa›wtFÿÿwþwþÿÿ˜—™ˆŠ‡ÿ‰Š‡‰Š‡ˆŠ‡ÿ˜—™3ÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿ3ÿÿÿxÿxÿÿ3ÿÿŠvþÿÿ3àßààßàxvyše2ÿf›Î‰Œº¥yš13f›Îše2ÿaÿ.ÿŸÒŸfÒeÿÿþÍÿ3ÿ™Íš2éh˜ÿÿœ–2þΚe2ÿÿ‰Œºÿxwy‰ŒºhigÿÿÏ›”ÿfœÎÏ›”še2ÿÿc0.žÒeežÒc0.1ÿÑ3eÿaÿ.ÿŸÒ3ÿÿêyˆŠhiêyÿÿ˜˜ÿÿ˜ÿÿ˜ÿhš2ÿþÍÿg3j9aÿ.ÿg3aÿ.ÿÿÿŠÿÿ2ÿwþŠhigÿˆŠ‡ÿÿþÍÿhigÿhigÿhigÿ˜—™ˆŠ‡ÿàßàf0úwþï›ÐwþÿÿþÎÿÏÿÿ‰ÿe0E™_ÌÌÑfœÎwþwþ›1Ï›1ÏfÒdxÛyxÛyºñ&g3z‚D IDAT3‰ÿŠwþÿÿˆŠ‡ÿàßààßàˆŠ‡ÿ3‰Œºxvyÿÿx‡ÿÿþÍÿŠvþŠàßà ! ! ! higÿxvyf›Îše2ÿxvyxvyaÿ.ÿŸÒŸfÒ›eÿÿþÍÿ3éh˜ÿÿf›Îhhgàßà˜˜™hhgÌÌÑšd2ÌÌÑ44/fœÎšd2ŸfÒÿ›ÿ›ÿÿŸÒþÏÿ–›ŸfÒaÿ.ÿêyhiïxvñ ! ! xvñhiïêyèfÎèfÎÿhÿh›hg›j9vþÿÿÿÿÿþÎÿ/šeÑdaÿ.ÿ‰ŒºÿþÍÿ˜—™ˆŠ‡ÿàßà2hŸÿ˜˜™ÿÿ˜˜™ï›Ðï›Ðwþÿÿÿÿÿÿÿÿÿÿÿÿše2ÿΙaÿΙaÿ‰ÿše2ÿše2ÿÿÿÿÿÿÿše2ÿÿÿÿÿš/œÿš/œÿÿþÍÿÿÿþÍÿeÿeÿeÿÿÿþÍÿ‰ÿÿ‰ÿÿÿÿþÍÿÿþÍÿhigÿhigÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿÿÿxÿxÿxÿÿÿÿ‰ÿÿÿhigÿhigÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿhigÿ™/ÿ™/ÿþÏÿaÿ.ÿeÿþÏÿÿþÍÿÿþÍÿ˜ÿÿxÿþÏÿþÏÿþÏÿÿˆŠ‡ÿÿÿÿhigÿÿÿhigÿše2ÿÿÿÿΙaÿÿÿše2ÿÿÿÿÿÿÿÿÿaÿ.ÿþÏÿþÏÿaÿ.ÿaÿ.ÿeÿxÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿxÿÿþÍÿÿþÍÿ˜ÿÿÿÿ˜ÿÿÿþÍÿÿþÍÿhigÿhigÿhigÿhigÿÿþÍÿhigÿhigÿeÿaÿ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿš/œÿÿÿaÿ.ÿeÿhigÿhigÿˆŠ‡ÿÿþÍÿhigÿhigÿhigÿˆŠ‡ÿhigÿÿhigÿhigÿhigÿÿÿÿÿÿÿÿhigÿše2ÿ‰ÿše2ÿÿÿΙaÿše2ÿ‰ÿ‰ÿše2ÿše2ÿÿ‰ÿÿÿ‰ÿÿše2ÿš/œÿš/œÿš/œÿÿþÍÿÿˆŠ‡ÿÿ‰ÿÿ‰ÿÿˆŠ‡ÿˆŠ‡ÿÿþÍÿÿþÍÿÿÿÿÿxÿÿÿÿÿÿÿÿÿþÍÿhigÿhigÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿše2ÿše2ÿhigÿhigÿaÿ.ÿeÿÿþÍÿÿþÍÿ˜ÿÿÿÿxÿxÿše2ÿþÏÿþÏÿše2ÿÿþÏÿÿˆŠ‡ÿÿhigÿÿhigÿÿhigÿhigÿše2ÿÿše2ÿÿše2ÿÿše2ÿše2ÿÿÿÿÿaÿ.ÿeÿaÿ.ÿeÿþÏÿeÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿÿþÍÿÿþÍÿÿþÍÿaÿ.ÿhigÿaÿ.ÿeÿÿÿÿÿÿÿÿÿÿÿÿÿÿš/œÿaÿ.ÿeÿhigÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿÿþÍÿhigÿhigÿˆŠ‡ÿhigÿÿ‰ÿhigÿÿÿÿÿÿÿÿÿÿhigÿše2ÿ‰ÿše2ÿ‰ÿše2ÿše2ÿ‰ÿ‰ÿše2ÿÿše2ÿÿše2ÿˆŠ‡ÿÿÿþÍÿÿ‰ÿÿ‰ÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿþÍÿÿþÍÿhigÿhigÿhigÿše2ÿŸÎèÛ IDATþÏÿþÏÿþÏÿþÏÿÿþÍÿÿþÍÿ˜ÿÿÿÿÿÿxÿþÏÿše2ÿÿhigÿÿhigÿÿÿhigÿÿhigÿše2ÿÿše2ÿÿÿše2ÿÿše2ÿaÿ.ÿaÿ.ÿaÿ.ÿaÿ.ÿhigÿhigÿaÿ.ÿeÿeÿhigÿaÿ.ÿeÿeÿeÿÿÿÿÿÿÿÿÿÿš/œÿaÿ.ÿaÿ.ÿeÿhigÿˆŠ‡ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿhigÿ‰ÿÿÿÿÿÿÿÿÿÿše2ÿ‰ÿše2ÿ‰ÿÿÿÿÿÿÿÿþÍÿ3ÿxÿˆþÎ1ÿÿÿþÍÿÏ›”2gŸhigÿ˜—™higÿ˜˜™ÿ˜ÿÿèfÎÿÑ3Éÿéhše2ÿf›Îhigÿ˜˜™ÿeÿÿ›še2ÿe›ÎÿÿþÍÿ›gee™›3ˆŠ‡ÿwtFÿÑ3Š»‡xvyaÿ.ÿ9fÇšüŸÒhigÿ˜—™aÿ.ÿ9fÇšüŸÒaÿ.ÿŸÒaÿ.ÿŸÒše2ÿf›Îše2ÿf›Îÿÿÿ‰ÿwþÿÿÿ‰ÿwþˆŠ‡ÿàßà˜—™þÏÿc0.ÐÒ1ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3ÿþÍÿ3š/œÿfÑdÿÿÿÿÿÿÿÿÿÿÿþÍÿÿÿÿxÿxÿÿÿÿÿÿÿΙaÿΙaÿÿÿ˜ÿÿ˜ÿÿÿþÍÿΙaÿ˜ÿÿÿÿÿÿ˜ÿÿÿÿÿhigÿÿÿÿîÿÿþÍÿÿþÍÿÿÿhigÿhigÿÿÿÿþÍÿÿ˜ÿÿ˜ÿÿÿþÍÿþÏÿ˜ÿÿ˜ÿÿše2ÿÿþÍÿΙaÿÿþÍÿše2ÿše2ÿþÏÿhigÿþÏÿÿÿhigÿÿÿÿÿaÿ.ÿeÿaÿ.ÿþÏÿÿÿÿše2ÿše2ÿˆŠ‡ÿˆŠ‡ÿÿþÍÿþÏÿˆŠ‡ÿˆŠ‡ÿaÿ.ÿše2ÿeÿše2ÿeÿaÿ.ÿše2ÿaÿ.ÿhigÿÿˆŠ‡ÿÿhigÿhigÿaÿ.ÿše2ÿeÿše2ÿeÿaÿ.ÿše2ÿaÿ.ÿeÿÿeÿÿš/œÿ‰ÿše2ÿþÏÿše2ÿše2ÿÿÿÿÿ‰ÿ‰ÿÿÿÿÿeÿeÿ‰ÿþÏÿþÏÿ‰ÿeÿeÿþÏÿhigÿþÏÿþÏÿÿþÍÿÿþÍÿþÏÿaÿ.ÿhigÿhigÿaÿ.ÿþÏÿše2ÿše2ÿš/œÿš/œÿš/œÿÿþÍÿÿþÍÿš/œÿÿÿÿÏþÎxÿxxÿxxÿÿxÿˆˆÿÿÿÿ2hŸ2hŸÿÿhÿhš2Iÿžÿÿxÿÿÿxÿêyÿh˜ÿÿÿÿÿ˜ÿÿþÏÿÿÿþÍþÍéhéhhigÿ›geÌÌÑ›ge}3Í}3͘ÿÿhigÿ1——™2ÿhigÿÿÿÿýÍ®—˜ÿýÍÿÿÿÿÿeÿŸfÒ›aÿ.ÿŸÒeÿ1še2ÿ‰ÿe›Îe›Î‰ÿše2ÿxvyx=gý@ IDATvyfÎ9ffÎ9fhigÿˆ‰‡xwyˆ‰‡ ! higÿfÎ9ffÎ9faÿ.ÿ›dÿ‰ÿš/œÿ‰ÿïÑf/š‰ÿ‹1f›Îf›Î‰ÿw€ÿþ‰ÿþjœweþ‹1‹1weþœþjˆŠ‡ÿˆŠ‡ÿjšgŠ»‡ˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿÑ3še2ÿf›Îeÿeÿf›Îše2ÿeÏ1ÿÿ12ÿÿÿÿhigÿhigÿΙaÿΙaÿxÿˆˆˆˆÿxˆÿÿhhgþÎhhgêéhêêΙaÿxÿ‡éþÎÿþUÿhÿ˜˜™ÿxÿxÿxÿ‰ÿ‰Œº3˜˜™3‰Œºéhš2/Íç7˜ÿÿ}3ÍQÑh˜˜™higÿhigÿ‰Š‡hhghigÿ˜˜™ÿÿê32êêÿÿˆŠ‡ÿhigÿˆ‰‡ˆŠ‡ÿˆŠ‡ÿ›eÿeÿeÿŸfÒ›‰ÿЉÿÿše2ÿï›ÐßieŠiigÎ5še2ÿxvy‰Œº/ÍvEyˆŠ‡ÿŸÒfΚ2þjfΚ2fÎ ! ˆ‰‡àßààßàŸÒfΚ2þjdjΚ2fÎaÿ.ÿŸÒœ‰ÿ/šeÑdvþ/šše2ÿ‰ÿše2ÿše2ÿe0‰ÿЉÿŠΘaœweþweþœÎ˜aˆŠ‡ÿwvyàßà ! àßààßàˆŠ‡ÿÿþÍÿÿÑ3ÿÑ3/Í3‰ÿœ`œ90n˜ü™˜ü™µÑ‹1‰ÿþÏÿþjeÿ›1Ïš/œÿÿÿˆŠ‡ÿf0ú ! ºñ&eˆ«eˆÿÿÿxhhg˜˜™hhgjšghhghhg˜˜™hhg¸™bþÏÿç7ç7˜ÿÿ2gŸxÿ‡éþΚ2š2˜‡êêˆhhgéhš2/Íç7˜ÿÿÎ5Î5QÑhQÑhhhg˜˜™ ! àßà˜˜™hhgêîê™xwyàßàˆŠ‡ÿeÿ›aš.››aÿ.ÿßieE™_ßie!—›!—›ßieÎ5xvy‰Œº/ÍvEyˆŠ‡ÿ›f›ÎÐÊaš2š2fΛàßààßà ! ›f›Î––fΛŸfÒeÿÿeÿ›ÿeÿ‰ÿ/šeÑd›/œ›/œ/šfÑdfÑdï›Ðe0ï›Ðe0ŠvþvþvþŠ2üË2üËàßàŠ»‡ÿÑ3ÿÑ3/ÍÿþÍÿf6dšÊœýše2ÿ–ÿ›1eÿš2fœÎ›1ÏeÏ1eÏ1eÏ1š/œÿÿÿÿÿˆŠ‡ÿàßàFÚΙaÿxÿˆˆÿxÿÿÿxÿˆÿ1Æ™1Æ™1Æ™1Æ™2gŸ1ÉÿÉÿ˜ÿÿš2ÿhéhyÿh˜ÿÿˆˆ‰‡˜˜™˜˜™ˆ‰‡éhš2¯/˜Î5¯/˜˜—™˜—™ÿàßà˜˜™˜—™üÿÿêêÿÿÿüˆŠ‡ÿàßàhhgˆ‰‡àßà›ŸfÒaÿ.ÿŸÒaÿ.ÿhigÿ˜˜™šÐ˜˜™hhgÿÎ5e0e0!—›xvy‰Œº2gŸ44/‰›˜—™àßà ! àßà˜—™›š2‰››ÿd›aš.›/œš/œÿe0ï›Ðï›Ðï›Ðï›ÐwþvþwþŠ&×rQ IDATŠvþÐÊa2gŸd››d2gŸÐÊaFÚþÍe™›e™›wvy——™Š»‡Š»‡‰ŒºÿÑ3šÊœf6dêef›ÎeefœÎÿfÑd›1Ï›1Ï›1ÏeÏ1ÿÿÿÿˆŠ‡ÿàßàf0úºñ&›ÿîŒîŒ›ÿˆÿf0úgÒgÒf0ú˜ÿÿéhéhˆêyÿhêˆêyÿhhhghhgˆwþàßààßàhhghhgàßààßàÉÿéhéh˜—™¯/˜˜—™éhÿêîêî ! hhg ! ! eÿaš.aš.ŸfÒeÿŸÒf0úhhghhgf0ú!—›ßiee02üËŠ»‡xvyΙaÿše2ÿÌÌÑï›Ðwþ˜—™˜—™àßà˜—™Ιaÿše2ÿš2ï›Ðwþÿdœ›eÿŸÒïÑfïÑfï›Ðe0wþwþwþwþwþ2gŸ›x›x2gŸ1gŸ3‰Œº3 ! ——™ÿÑ3wtFvEy/ÍxvyŠ»‡ÿÑ3ïÑf‰›‰›êeï›Ðš2‰›š2fÑdeÏ1›1ÏeÏ1›1ÏeÏ1ÿÿÿÿàßàšÐFÚFÚÿÿ2hŸ2hŸƒÍ3éhƒÍ3êéh1˜˜™˜˜™éh˜ÿÿ˜—™˜ÿÿ˜—™ÿ˜—™ÿàßààßàeÿaš.ŸfÒeÿ2gŸ˜˜™2hŸÿ!—›f›Îf›ÎxvyΙaÿÌÌÑï›Ð‰ÿhigÿ˜—™higÿΙaÿÌÌÑï›Ð‰ÿd›daÿ.ÿ›aÿ.ÿaÿ.ÿwþïÑfwþwþïÑfwþï›Ðï›Ð‰ÿwþwþ‰ÿxÿˆˆxÿÛ«Û«ÿÑ3/šïÑf/šše2ÿwþe0‰›ï›Ðšd2ÿ›1Ïš/œÿš/œÿ‰ÿ‰ÿhigÿhigÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿxÿše2ÿše2ÿxÿþÏÿþÏÿˆŠ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿÿÿÿ‰ÿ‰ÿÿÿ‰ÿ‰ÿ‰ÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿše2ÿše2ÿˆŠ‡ÿÿÿΙaÿΙaÿÿÿÿþÍÿÿÿþÏÿÿÿÿþÍÿÿþÍÿþÏÿeÿþÏÿÿÿÿÿÿÿÿÿÿÿÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿÿÿeÿeÿeÿÿÿΙaÿΙaÿÿÿÿþÍÿÿþÍÿÿþÍÿÿþÏÿÍ'•c IDATîÿüîÿü‰ÿwþhigÿ˜˜™ÿˆŠ‡ÿàßà˜—™higÿ ! àßà˜—šeºf›ÎþÏÿ1þÏÿ1ˆŠ‡ÿxvyhigÿ ! xwyÿÿÿÿÿhigÿ ! xvyÿÿêÿÿêÿþÍÿ3‰ÿuÏþ‹1wþÿþÍÿ3þÏÿ1þÏÿ1þÏÿ1þÏÿ1Ιaÿ»g¡wþÿÿÿÿÿþÍÿ3ÿÿÿýÍ3ÿÿˆŠ‡ÿxvyÿþÍÿ›gee™›3ˆŠ‡ÿFÚÌÌÑf›Îše2ÿ44/2gŸhigÿ–f™jšg˜—™eÿ›ÿΘa2hŸÿÿÿÿÏ/ÍÿÑ31ˆŠ‡ÿàßà¯/˜QÑh ! xvyΙaÿ2gŸeÿaš.ŸfÒœÿ‰ÿwþÿÿÿÿÿÿÿþÍÿÏ›”2hŸÿþÏÿ1ˆŠ‡ÿxvyˆŠ‡ÿxvyîÿªûèÿÿÏü˜ÿéîÿΫ]2gŸÿÿŠvþΙaÿšÐ˜˜™hhgÿÿÿàßà ! ˜—™higÿàßàšeºï›Ð0e›ÎxÎ1þÏÿ1¯/˜éhþÏÿÿ1ˆ‰‡vyÿÏ2ˆŠ‡ÿFÚ2gŸêÿÿuÏþ‹1uÏþþÏÿ1ÿ3ÿÿ1þÏÿœ–2þÏÎÿœ–2þÏÎÿ1š/œÿ|Ñc»gE™_ýÿ˜éhÿþÍÿ3ÿþÍÿ3aÿ.ÿ(Ô3ÿš/œÿfÒd3‰ÿwþ—ÿéi—ÿéiÿxvyše2ÿ›geî%U›gexvyF™aÿše2ÿ‰ÿuf™jšg–f™–fÿ‹1wþeÿaš.ŸfÒaš.ŸÒÿ›eÿœ2hŸÎ˜aÿÿ/Í/ÍÿÏ31ÿÿxvyˆŠ‡ÿQÑhxQÑhˆŠ‡ÿxvyeÿ06Ÿeÿ›aš.ŸfÒaš.ŸÒaÿ.ÿaš.ŸfÒÿše2ÿ44/EÿÌÌÑf›ÎÿÿþÏÿ2ÿˆ‰‡‰ŒºF1elÿel3ÿÿ2ÿþÍÿ3ÿˆŠ‡ÿwtFÿwtFÿxvyªûéhyxÿÏéhyΙaÿŠŠše2ÿΙaÿ˜˜™˜—™ÿ˜˜™ÿÿÿ ! xvy ! šeºe0ï›ÐŠ›e2šeºþÏÿ11þÏÿše2ÿþÏÿ1˜ÿÿ˜ÿÿ‰ÿ‹1‹1ÿÏvEyÿÏ2ÿÿxwyàßàFÚ1el1elÿþÍÿÿÿÿÿÿÑ3þÏÿßieœ–2ßieÿÿxÿýÍÿýÍÿxÿþÏÿœ–2œ–2/Íe™›œ–2þÏÿýHgžÿhaÿ.ÿbaeÿg3aÿ.ÿŸÒwþ‰ÿÿfÒdÿ‰ÿwþéiéiˆŠ‡ÿî%UÛ«Û«ˆŠ‡ÿˆŠ‡ÿ44/44/44/‰ÿuÏþ–f™–f™‹1uÏþaÿ.ÿŸfÒaš.ŸfÒaÿ.ÿeÿœšÐhhgÿÑ3ÿÑ3ÿÿxvy ! ! QÑh ! àßàeÿ››eÿŸfÒaš.eÿΙaÿf›ÎÌÌÑÌÌÑf›ÎˆŠ‡ÿÿ2ÿÿÿÿàßàºñ&‰Œº‰Œº‰ŒºhhgÿÿýÍ3ÿýÍÿþÍÿÿþÍÿÿˆŠ‡ÿwtF3ikšwtFikš3wtF`ê˜ú IDATtéhy1x1xt2gŸ2gŸE™_e044/2gŸ2gŸhhgÿÿÿxvyhigÿf›Ff›Fe0e0f›Ff›Fšeº1þÏÿ‰ÿœ–21˜ÿÿxvyéhéhQÑhéhˆŠ‡ÿwþ‹11ˆŠ‡ÿˆ‰‡šÐikšˆŠ‡ÿÿÿêêêÿÿ111!—›!—›‰ŠŠ53‰ŠfœÎ›ge›geœ–2„/„/„/„/¸™b·bŸÒaÿ.ÿŸfÒˆ%‡ˆ%‡eÿŸÒ‰ÿ/šš/œÿfÒdÿ/š‰ÿf›ÎÛ«î%Uxvy44/44/44/ÌÌÑuÏþ‹1uÏþ‹1ŸfÒ››ŸfÒj9››ŸfÒhhgdhhghhgd1ÿÑ31ŠÿÿˆŠ‡ÿxàßà ! xvy˜—™Î4aþjþjÎ4aaš.ÐÒf›Î06Ÿ06Ÿf›Îàßàÿÿ®—˜àßààßààßà3‰ŒºÿýÍxvy3 ! g3 ! 3˜ÿÿéhy˜‡éhy˜‡éhyΙéÌÌÑ44/2gŸÿhhg˜—™higÿ˜—™higÿ ! àßà2üËe™›«šeºf›Î‰ÿe0f›Î˜ÿÿéhhigÿ˜—™ˆŠ‡ÿxvy‰ÿwþ‰ÿvþÿÏ2ÿÿ‰Š‡àßà—•fikš ! xvyÿÿêÿÿêÿÿêþÏÿjšg–f™1ÿÿxˆÿxˆÿše2ÿfœÎÿΙaÿÌ–;|ÑcêΙaÿ“fÍŸfÒhg˜ü™aš.90nfÒdš.œfÒdÿˆŠ‡ÿÛ«f›ÎΙaÿÌÌÑ44/ÌÌÑf›Î‰ÿuÏþ2ÿeÿhg˜ü™hg˜—™eÿhg˜ü™hg˜ü™ÿ›ÿÿˆŠ‡ÿàßà ! xvyeÿ›eÿaš.ÐÒc0.ŸfÒ›Ιaÿ2gŸÿÿÿÿRih®—˜êÿÿþÍÿ‰Œºxwyˆ‰‡wtF3ÿˆŠ‡ÿxvyeÿ›ˆŠ‡ÿxvyƒ—ˆéhyˆˆéhyéhš/$2gŸî%Uf›Îî%U2gŸÿhhg˜˜™higÿhigÿhigÿ˜—™˜—™àßà ! f›F3›ge33›geˆf›Fwþï›Ðše2ÿhigÿ˜—™E™_vþ1Ï™a ! ikšêêÿÿêÿÿêþÏÿœ–2˜—™1ÿxÿxf›Îf›Îšd2šd2šd2ÿ2gŸfÑd|ÑcfÑd2gŸŸÒaš.hg˜ü™ŸÒfÒdš.œš.œfÒdÿÿˆŠ‡ÿÛ«xvyxvyî%UÌÌÑÌÌÑf›Îwþwþ‹1ÿaÿ.ÿaš.˜ü™hgù–Çaÿ.ÿeÿ˜ü™˜ü™Šÿÿÿÿxvy ! ! xvy››aš.ÐÒ/Í/ÍÐÒaš.ˆŠ‡ÿºñ&2gŸ2gŸºñ&ˆŠ‡ÿÿÿ®—˜®—˜ÿþÍÿ3xvyÿxvy3ÿýÍxvy›xvyC©ûã IDAT€ÿfÑdþÏÿ1ˆˆþÏÿ1dgf›Î2gŸ˜—™ÿþÍÿ3ÿþÍÿ˜—™higÿ ! ˜—™ˆ‰ÿe0še2ÿf›Îéh˜2gŸÿÿÿ2gŸˆŠ‡ÿ ! àßà ! ÿÿ꜖2djÎdjΜ–higÿ˜—™ˆˆÿxf›ÎÿÿfÑdcÿÿÿêaÿ.ÿŸÒaÿ.ÿŸfÒ˜ü™›aÿ.ÿŸÒfÑdš/œÿš.œfÑdÿÿÿÿxvyˆŠ‡ÿšeÿî%UÛ«f›Îf›ÎÎ4/ÿf›ÎÎ4/ÿΙaÿ2gŸ2þ1uÏþaÿ.ÿŸÒ˜e™ÿfaš.ŸfÒhg˜ü™hgÿÿþvÿ‰ÿþxvyˆŠ‡ÿxvyš2fΚ2fÎÐÒ/Í/Íc0.ŸfÒàßààßà ! ÿÿÿ3ÿþÍÿ3ÿÿÿÿ‰ÿ‰ÿÿÿÿÿÿÿˆŠ‡ÿˆŠ‡ÿÿþÏÿ˜ÿÿþÏÿhigÿhigÿše2ÿše2ÿše2ÿše2ÿˆŠ‡ÿ‰ÿˆŠ‡ÿîÿîÿše2ÿše2ÿ™/ÿ™/ÿ™/ÿ™/ÿΙaÿ™/ÿÿhigÿše2ÿhigÿÿÿþÏÿÿÿše2ÿše2ÿše2ÿhigÿhigÿÿÿÿÿše2ÿΙaÿΙaÿše2ÿ‰ÿˆŠ‡ÿ‰ÿˆŠ‡ÿ‰ÿÿÿˆŠ‡ÿÿÿ‰ÿš/œÿÿþÍÿÿþÍÿš/œÿÿÿÿÿše2ÿše2ÿÿÿÿÿÿÿÿÿÿÿše2ÿše2ÿÿÿþÏÿˆŠ‡ÿˆŠ‡ÿþÏÿÿ˜ÿÿÿÿÿÿ˜ÿÿ˜ÿÿÿÿ˜ÿÿ˜ÿÿhigÿþÏÿþÏÿÿ‰ÿ‰ÿˆŠ‡ÿˆŠ‡ÿ‰ÿ‰ÿÿˆŠ‡ÿˆŠ‡ÿ‰ÿše2ÿ‰ÿˆŠ‡ÿˆŠ‡ÿše2ÿΙaÿΙaÿše2ÿÿΙaÿΙaÿÿÿÿ™/ÿÿþÍÿ™/ÿÿÿ™/ÿÿΙaÿÿ™/ÿÿhigÿše2ÿše2ÿše2ÿhigÿÿÿþÏÿþÏÿþÏÿÿÿ˜ÿÿÿÿše2ÿÿÿ˜ÿÿše2ÿþÏÿše2ÿþÏÿše2ÿše2ÿΙaÿhigÿˆŠ‡ÿše2ÿše2ÿˆŠ‡ÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿxÿΙaÿΙaÿxÿše2ÿše2ÿΙaÿÿÿše2ÿše2ÿÿÿΙaÿ¹»¸ÿ¹»¸ÿ¹»¸ÿše2ÿše2ÿ¹»¸ÿ¹»¸ÿ¹»¸ÿÿÿhigÿhigÿÿhigÿÿþÍÿÿÿþÍÿhigÿ‰ÿeÿeÿaÿ.ÿaÿ.ÿš/œÿÿÿ‰ÿÿþÍÿš/œÿAD¶ì IDATše2ÿf›ÎþÏÿœ–2djÎ1še2ÿf›ÎÿÿéÿÿÿêΙaÿ2hŸÿÿˆ‰‡wtF‰Œºxwy—ÿéhÿÿê˜ÿÿQÑh˜—™ÿhhg˜˜™ˆ‰‡àßà ! xwyÿ‰ÿwþΙaÿ2gŸˆŠ‡ÿxwyΘa2gŸˆŠ‡ÿ¼vy»š/gÑΙaÿÌÌÑ44/ÌÌÑ44/2hŸÿše2ÿfœÎšd2fœÎšd2f›ÎÿþÍÿ3þÍ3þÍ3˜ÿÿƒÍ3e™››ge}3Íéhše2ÿ44/2gŸΙaÿÌÌÑf›ÎΙaÿšÐ˜—™‰ÿuÏþ‹1uÏþ‹1wþÿÿýÍikš—•f3ÿΙaÿ2gˆŠxvyˆŠ‡ÿÛ«|›Í„e3|›ÍrŠˆxvyˆŠ‡ÿÛ«e™››geî%UxvyˆŠ‡ÿvuu»¼¼EDDŠ‹‹xvyÿ‰ÿwþÿÿÿÿhhg˜˜™ÿhigÿ ! xwyˆ‰‡àßà˜—™eÿaš.ŸfÒþj1š/œÿfÑdš/œÿfÑd˜ÿÿéh˜ÿÿéh‰ÿ/šfÑd‰ÿ/šfÑdše2ÿÎ52üËf›Îÿÿêyˆÿx‡êxÿÿþU«ˆˆ‰‡àßà ! àßà ! xéhÿÿ˜éh˜ÿÿéhhigÿ˜—™ÿÿhigÿ˜—™ÿhhg˜˜™ˆ‰‡xwyhhg˜˜™‰ÿvþŠwî‰þvþŠwþˆŠ‡ÿàßà2üË44/2gŸΙaÿ2gˆhhg ! xvyˆŠ‡ÿ–wykÿwþþÏÿ›`5jaÌÌÑ44/ÌÌÑ44/ÌÌÑ44/2hŸšd2fœÎÿÿšd2f›ÎÿÿþÍ3še2ÿï›Ðe0ï›Ðe0f›Îše2ÿ44/ÌÌÑ44/ÌÌÑf›ÎΙaÿ2gŸhigÿ˜—™‰ÿe0ï›Ðwþˆ‰‡xwyˆ‰‡àßà˜—‡¸™b2gŸˆŠ‡ÿxvyˆŠ‡ÿÛ«î%UxvyˆŠ‡ÿàßà ! àßà ! xvyˆŠ‡ÿ111ÏÏÏxvyxÿˆÿxˆÿ‰ÿwþÿ‰ÿwþhhg˜˜™hhg˜—™higÿ2üËÎ5˜—™Ιaÿ1el3ÿýÍÏ›”2gŸ‰ÿweþaš.ÐÒ–›˜ÿÿéhš/œÿ|Ñc„/eÏ13˜ÿÿÿh˜ƒ—fÑdš/œÿfÑdš/œÿfÑdš/œÿfÑdf›Îf›Îf›Îf›Îêyˆˆÿxˆˆêyxÿˆˆÿxxwy ! àßààßà ! xwyÿh˜ÿh˜—™ÿÿ˜—™hhg˜˜™àßà˜˜™hhgßiexvþÿüvþxàßààßà ™k$Î2gŸ2gŸ2gŸˆÿx˜˜™àßààßàxvyxwyàÎuÏþþÏÿ1gÑfœÎ44/fœÎfœÎï›Ðšd2›e2šd2ï›ÐfœÎÿÏ3333ÿÏwþï›ÐwþšÐ44/44/44/šÐ2gŸÌÌј—™wþfœÎfœÎwþÿxwyxwyÿàßààßà˜—‡ê2gŸxvyî%Uî%Uxvy˜—™àßààßà˜—™111ÏÏÏÏÏÏ111ˆÿx˜‡wþÿ‰ÿwþÿ˜˜™hhghhg˜˜™˜˜™ï›Ðï›Ð˜˜™ÿýÍweþ‰›(Ô–eÿéh˜ÿÿš/œÿš/œÿ˜ÿÿ˜|Ñc3ÿþÍÿ˜ÿÿ˜ÿÿÿþÍÿ˜ÿhfÑdfÑdfÑdfÑdzeà IDAThigÿhigÿxÿÿÿÿÿÿxÿΙaÿÿxÿˆŠ‡ÿˆŠ‡ÿxÿÿΙaÿˆŠ‡ÿÿÿˆŠ‡ÿˆŠ‡ÿÿˆŠ‡ÿÿÿ˜ÿÿ˜ÿÿÿÿÿÿhigÿÿÿÿÿÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿÿÿ‰ÿ‰ÿ˜š—ÿxÿ˜š—ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿxÿÿÿÿÿÿWÿše2ÿΙaÿÿΙaÿše2ÿÿÿše2ÿ‰ÿ˜š—ÿÿÿÿ˜š—ÿ‰ÿÿþÍÿÿþÍÿÿÿþÍÿÿþÍÿ‰ÿše2ÿhigÿhigÿhigÿΙaÿše2ÿhigÿhigÿhigÿîÿîÿf/ÿ‰ÿše2ÿše2ÿ‰ÿhigÿˆŠ‡ÿˆŠ‡ÿhigÿxÿxÿÿÿhigÿhigÿhigÿhigÿΙaÿΙaÿÿhigÿÿhigÿÿÿ‰ÿÿÿÿhigÿÿÿhigÿÿše2ÿ‰ÿše2ÿše2ÿ‰ÿše2ÿΙaÿˆŠ‡ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿˆŠ‡ÿΙaÿeÿeÿ‰ÿˆŠ‡ÿþÿüÿeÿeÿ˜ÿÿš/œÿš/œÿš/œÿš/œÿ˜ÿÿš/œÿÿþÍÿ˜ÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿþÍÿ˜ÿÿš/œÿš/œÿše2ÿše2ÿše2ÿše2ÿše2ÿše2ÿxÿÿÿxÿÿÿxÿxÿˆŠ‡ÿÿˆŠ‡ÿxÿˆŠ‡ÿÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿÿˆŠ‡ÿÿÿÿÿhigÿÿÿhigÿÿhigÿÿhigÿhigÿÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿÿÿ‰ÿ‰ÿ‰ÿ‰ÿše2ÿÿše2ÿÿše2ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿše2ÿˆŠ‡ÿÿÿþÍÿÿˆŠ‡ÿše2ÿše2ÿše2ÿhigÿΙaÿše2ÿše2ÿΙaÿhigÿše2ÿÿÿΙaÿΙaÿËϘÿf/ÿ‰ÿ‰ÿ‰ÿ‰ÿhigÿhigÿhigÿhigÿÿÿÿÿhigÿhigÿhigÿhigÿ¹»¸ÿ¹»¸ÿÿÿxÿÿÿÿ‰ÿÿÿ‰ÿÿhigÿhigÿhigÿhigÿÿše2ÿΙaÿΙaÿše2ÿΙaÿše2ÿše2ÿΙaÿeÿeÿaÿ.ÿþÿüÿþÿüÿš/œÿš/œÿš/œÿ˜ÿÿ˜ÿÿ˜ÿÿš/œÿš/œÿše2ÿše2ÿše2ÿše2ÿxÿÿÿÿÿÿxÿˆŠ‡ÿÿˆŠ‡ÿÿˆŠ‡ÿˆŠ‡ÿÿÿÿÿÿhigÿÿÿhigÿhigÿhigÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ‰ÿ™/ÿÿ™/ÿÿše2ÿše2ÿše2ÿše2ÿše2ÿˆŠ‡ÿÿþÍÿˆŠ‡ÿše2ÿše2ÿΙaÿΙaÿΙaÿΙaÿ‰ÿΙaÿ‰ÿ‰ÿËϘÿf/ÿ‰ÿhigÿhigÿ‰ÿhigÿÿhigÿÿÿhigÿÿÿÿÿÿÿÿÿÿ‰ÿÿÿÿΙaÿΙaÿΙaÿÿþÍÿÿþÍÿΙaÿeÿeÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿš/œÿš/œÿÿþÍÿ˜ÿÿ˜ÿÿ!³K± IDATΙaÿΙaÿÿþÏÿ‰ÿš/œÿÿÿ‰ÿš/œÿÿÿš/œÿš/œÿÿÿ˜ÿÿ˜ÿÿxÿ˜ÿÿ˜ÿÿxÿ˜ÿÿ˜ÿÿîÿîÿîÿˆŠ‡ÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿÿkÿþÿÿÿΙaÿΙaÿše2ÿËϘÿΙaÿše2ÿf/ÿÿÿÿþÍÿÿÿΙ1ÿÿÿÍÏËÿÿÿÿÿ™ÎšÿÿÿÿÿÏÎÿÿÿÿ™—ÿ™—ÿΙaÿΙaÿfgÿfgÿÝàÜÿÝàÜÿþÿüÿþÿüÿÿÿÿÿš/œÿ1‰ÿÿÿÿÿÿÿÿÿ˜ÿÿxÿÿÿ‰ÿûe‰ÿfÑdŠ/šeÑdŠïÑfeÑdéiéihiïéhyéhyhiïéiéiîÿîÿîÿh{ch{cˆœƒîÿˆŠ‡ÿ˜ÿÿèfÎèfΘÿÿÿÿhigÿÍÏËÿÍÏËÿhigÿhigÿkÿþÿlÿþlÿþkÿþÿ2gŸ7ðŸk$Î2gŸf›ÎþÍþÍÍÏËÿÎÏËÎÏËÍÏËÿ™ÎšÿšÎššÎš™ÎšÿÏÎÿÿÐÎÿÐÎÿÏÎÿÿ2Ífgÿ2Ífgÿfgÿ™—ÿ™—ÿfgÿfgÿ™—ÿ™—ÿgd/ÿgd/ÿgd/ÿgd/ÿgd/ÿgd/ÿΙaÿΙaÿþÿüÿÿþÍÿÿþÍÿfgÿfgÿfgÿÿþÍÿš/œÿhigÿš/œÿš/œÿhigÿš/œÿÿþÏÿÿÿþÏÿ‰ÿ˜ÿÿ‰ÿ˜ÿÿÿÿÿÿÿþÍÿ˜ÿÿÿÿxÿ˜ÿÿÿÿxÿhigÿîÿ‰ÿš/œÿ‰ÿÿÿ‰ÿÿÿÿ˜ÿÿÿhigÿhigÿÿ˜ÿÿÿîÿeÿîÿîÿeÿîÿîÿîÿhigÿîÿîÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿhigÿš/œÿš/œÿÿþÍÿ˜ÿÿhigÿÿhigÿÍÏËÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿΙaÿkÿþÿkÿþÿÿÿÿÿkÿþÿkÿþÿ‰ÿ‰ÿËϘÿf/ÿÿþÍÿÿÿÿÿΙ1ÿÍÏËÿÍÏËÿÿÿÿÿÍÏËÿÍÏËÿ™Îšÿ™Îšÿÿÿÿÿ™Îšÿ™ÎšÿÏÎÿÿÏÎÿÿÿÿÿÿÏÎÿÿÏÎÿÿfgÿ™—ÿfgÿfgÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿfgÿfgÿ™—ÿ™—ÿÝàÜÿkÿþÿkÿþÿgd/ÿÝàÜÿ™—ÿkÿþÿkÿþÿgd/ÿÝàÜÿkÿþÿkÿþÿΙaÿ˜eÿ˜eÿΙaÿ˜eÿΙaÿþÿüÿþÿüÿþÿüÿÿþÍÿÿþÍÿfgÿ™—ÿfgÿfgÿ˜š—ÿÿþÍÿ”Ègþ IDAT€ÿš/œÿfÒdhhg˜˜™š.œeÑdÿêþÏÿ1ÿÿÿÿ˜ÿÿÿhêÿÿêyˆhigÿ ™ûwÿÿŠvþŠwþÿ—ÿéi—ÿéid‰wü‰h{c˜…h{c˜…üš/œÿfÑ܈ŠxwyÿýÍš2éhhigÿ˜—™ÍÏËÿ»»¼wtF‰Œºàßàf0ú2gŸΙaÿ2gŸkÿþÿ•kÿþÿ®šÒRf.®šÒRf.•‰ÿûw‰ÿa¦šÑÿþÍÿÏ›d2gÏÍÏËÿ315ÍÏËÿ•Íýk3•Íýk3ÌÿÏg2f™Îšÿj§h–Y˜j§h–Y˜6e12ÏÎÿÿÇcÑ9/ÇcÑ9/1˜h30ûÍÐ30ûgi™—ÿûgi™—ÿûgi™—ÿûgi™—ÿûgi™—ÿffg•gigþÈ™œÑkÿþÿ•gi30 xvXS"™œÑkÿþÿšš™ xvñïó˜eÿ64aÊÌŸh›þÿüÿ-Ôfgÿš™fgÿ30“hfi˜š—ÿhfiÿþÍÿ3ÿþÍÿ3êœ`œ‰ÿŠŠŠŠÿÿéþΘÿÿÿÿxÿ˜‡ÿÿxÿ ™ûevþŠvþ‰ÿÿxÿx›þjwüþj› ! ˜…ˆœƒüˆŠ‡ÿˆŠ‡ÿ}ic˜‡hiïwtFš2higÿ˜˜™higÿÿhigÿxwy‰Œº‰ŒºÎ™aÿΙaÿΙaÿÿþÍÿ••Rf.çg0„w„wšÑ3315315ýk30œhg2fg2f–Y˜ý‹þ12129/jÏ0ûÍÐûÍÐÍÏËÿûgiûgi™—ÿ•š™š™3030™œÑ•š™30b˘™œÑ•ûgiûÍÐñUZ ÿΙaÿÏÊ0ÊÌŸ64ag/0ÿþÿüÿÿÑÿÑÒÍš™30ûÍИš—ÿ˜š—ÿf5if5i˜š—ÿÿþÍÿÿþÍÿÿÑ3ÿÑ3ÿþÍÿΙaÿÿhigÿÿÿhigÿÿΙaÿÿÿÿÿˆŠ‡ÿÿþÍÿ‰ÿ‰ÿˆŠ‡ÿÿþÍÿÿÿ˜ÿÿÿþÍÿ˜ÿÿ˜ÿÿxÿÿÿ˜ÿÿÿÿÿÿ‰ÿîÿÿÿÿÿš/œÿxÿ˜ÿÿÿ˜ÿÿ˜ÿÿÿ˜ÿÿxÿeÿîÿhigÿˆŠ‡ÿîÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿîÿ˜ÿÿÿxÿxÿÿ˜ÿÿÿhigÿÿÿÍÏËÿˆŠ‡ÿÿÿÿÿΙaÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿkÿþÿkÿþÿ™ÐÿÿþÍÿÿΘÿÿþÍÿΙ1ÿÍÏËÿÍÏËÿÐd˜ÿ™Îšÿ™ÎšÿuÿÏÎÿÿÏÎÿÿ–1Ðÿ™—ÿfgÿ™—ÿfgÿfgÿ™—ÿfgÿ™—ÿ™—ÿÍÏËÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿfgÿ ÿ™—ÿ™—ÿ ÿfgÿ™—ÿ™—ÿfgÿ ÿg/0ÿ˜eÿ˜eÿ˜eÿþÿüÿÿþÍÿfgÿfgÿfgÿfgÿfgÿfgÿ™—ÿ˜š—ÿ˜š—ÿ ÿ˜š—ÿ ÿ˜š—ÿÿþÍÿÿþÍÿ ÿÿþÍÿ ÿÿþÍÿ¥ÜjÍ IDATš/œÿÿš/œÿÿÿÿÿÿþÏÿÿÿˆŠ‡ÿˆŠ‡ÿÿÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿxÿÿÿÿÿÿÿxÿ‰ÿ‰ÿÿÿ˜ÿÿ˜ÿÿxÿ˜ÿÿ˜ÿÿxÿ˜ÿÿ˜ÿÿîÿîÿhigÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿ˜ÿÿÿxÿÿxÿÿÿ˜ÿÿÿhigÿhigÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿ™Ðÿkÿþÿ™ÐÿÿþÍÿÿþÍÿΙ1ÿÐd˜ÿÍÏËÿÐd˜ÿuÿ™Îšÿuÿ–1ÐÿÏÎÿÿ–1Ðÿfgÿ™—ÿfgÿfgÿ™—ÿ™—ÿÍÏËÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿfgÿ ÿ™—ÿ ÿ™—ÿ ÿ ÿfgÿ™—ÿfgÿ™—ÿfgÿfgÿ ÿΙaÿΙaÿÿþÍÿÿþÍÿÿþÍÿ™—ÿfgÿfgÿfgÿfgÿ™—ÿ™—ÿ˜š—ÿ˜š—ÿ˜š—ÿÿþÍÿÿþÍÿÿþÍÿš/œÿÿš/œÿÿþÏÿÿÿ˜ÿÿÿÿxÿÿÿxÿ‰ÿÿÿ˜ÿÿxÿ˜ÿÿ˜ÿÿxÿ˜ÿÿîÿhigÿîÿîÿˆŠ‡ÿîÿˆŠ‡ÿÿxÿxÿÿxÿxÿÿÿÿhigÿÿÿ™ÐÿΙ1ÿÐd˜ÿuÿ–1Ðÿfgÿ™—ÿfgÿ™—ÿ™—ÿÍÏËÿ™—ÿ™—ÿ™—ÿ™—ÿ™—ÿfgÿfgÿfgÿfgÿfgÿ ÿ™—ÿ™—ÿ ÿ™—ÿ™—ÿ ÿ ÿfgÿ™—ÿ™—ÿfgÿ™—ÿ™—ÿfgÿ ÿÿþÍÿÿþÍÿÿþÍÿ™—ÿ™—ÿ™—ÿ™—ÿuÿuÿšÿšÿ1eÿ1eÿše2ÿše2ÿše2ÿÿÿþÍÿÿþÍÿÿþÍÿÿše2ÿše2ÿše2ÿÿše2ÿše2ÿše2ÿÿÿþÍÿÿþÍÿÿþÍÿÿÿÿdÿÿÿdÿÿÿdÿþÏÿÎ1.ÿþÏÿUÿUÿUÿΙ1ÿ—/ÿÿ—/ÿÿÿd-ÿÿd-ÿÿ˜ÿÿÿÿÿÿÿÿþÍÿþÏÿþÏÿþÏÿþÏÿþÏÿþÏÿuÿuÿ2þÿ2þÿÓ ¬ IDATªÿªÿšÿšÿ1eÿ1eÿÿÿÿÿÿ¹»¸ÿÿÿdÿdecÿÿÿdÿ˜ÿÿ˜ÿÿ˜ÿÿÿÿΙaÿΙaÿΙaÿše2ÿÿÿþÍÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿÿÿþÍÿÿþÍÿÿþÍÿše2ÿÿÿþÍÿÿþÍÿÿþÍÿše2ÿÿÿþÍÿþÏÌÿþÏÌÿþÏÌÿÿÿÿdÿÿÿdÿÿÿdÿÿÿdÿÿÿdÿΙaÿþÏÿþÏÿþÏÿ ÿÿÿÿÿΘÿÿΘÿËϘÿΙ1ÿ.šÿ.šÿ ÿÿÿ—/ÿÿÿÿΙ1ÿÿ˜ÿÿ˜ÿše2ÿše2ÿÿÿþÍÿÿþÍÿΙaÿΙaÿþÏÿΙaÿΙaÿþÏÿÊÿ+ÿ6Õg/0ÿ™ÑИeÿh›˜eÿh›uÿ‹g/0ÿ™ÑÐΙaÿIÿž–ÓÓÓ.ÿ¹»¸ÿGEH¹»¸ÿGEHdecÿœ›decÿœ›òÿúdÎÿÿÉ`ÓÓÒ.g™ÿ3Ì244/šÐÿ0™™geÿg4!ñ‡wtFg3œÿ©«¨ÿñºŠe™›ikšABAWVXÿˆŠ‡ÿÛ«e™›ikš ! xvyhigÿ ! vEE/ikš˜˜™ÿˆŠ‡ÿxvyΙaÿ2hŸÎ˜a2gŸÿΘÿ1iVËz–51hΙ1ÿ2gÏuÿý‹þuÿý‹þuÿý‹þ.šÿáw ôdõ œ ñïó—/ÿÿiÑˆŠ‡ÿxwyÿÿÿÿÿ+eÎÿÕ›2ÿ˜ÿhÿ,ÿÑÔ0Ιaÿ2hŸÿÿþÍÿ3Ï+ÿÿÈiÑdecÿ6Ï44/ÌÌÑ44/—–;56–44/ÌÌÑ44/2gŸše2ÿfœÎÿše2ÿfœÎÿÊÿ+ÿ6ÕÊÿ+ÿ6Õ¹»¸ÿGEHg/0ÿœFÒü‰Ë3Î1.ÿ2ÏÒÿþÍÿ33fgh›Î1.ÿ2ÏÒÿþÍÿ¬3˜»h›Î1.ÿ2ÏÒÿþÍÿœ3ufY1.2ÏÒÿþÍÿ2g46Ê/™ÑКe2ÿ44/2gŸ˜ÿÿ–ÓÓÓ.¹º¸GEH¹»¸ÿ«ª«œ›decÿœ›òÿúdÎÿÿÉ`ÓÓÒ.g™ÿ¤fc]j£–ü\š™Ìg4™hd©F¨454‹‰‹uwuÌËÌßßß111¯®¯QRQÏÏÏàßà ! xwyhhg˜—™‰ÿwþ‰ÿwþΙaÿ2hŸÎ˜a2hŸ‰ÿwþÿΘÿ›—š1jf4ÿ›—š44ÿ2gÏuÿý‹þuÿý‹þuÿý༠ñïó—/ÿÿiÑ—/ÿÿiÑ—/ÿÿiÑˆŠ‡ÿxwyÿ͘3hÿ˜š—ÿhfi+eÎÿm5Éhfiÿ,ÿÑÔÉ/gÑüÿ—ÿÿ6ýÊiÿÏ+ÿÿ@æ‡ ÃjÏ0decÿUVUáªz44/ÌÌÑ44/—–;h /Í–g44/ÌÌÑ44/2gŸþÏÌÿ24ÿþÏÌÿ24ÿÊÿ+ÿ5-ÕËÓ+5-ÕËÓ+Êÿ+ÿ6Õ¹»¸ÿGEHw511ÒÎ.ÿ3311ÒÎ.ÿ¬311ÒÎ.ÿœ311ÒÎ.ÿ2g4f›Î›Î˜ÿÿ–ÓÿGEH¹»¸ÿ¹»¸ÿGEHdecÿdecÿœ›úòÿú"-ýÏ IDATÑ–ÓÒ.-.ÒÿÓÒ.]j£–ü¤fc\šg4™hg˜™Ì‹‰‹uwu454ÌË̯®¯QRQ111ÏÏÏ ! xwyˆ‰‡àßàhigÿw˜™ˆ‰‡ˆwvyhigÿ˜—™2hŸwþÿ1iVË2hÎ41ÿý‹þuÿý‹þiÑ—/ÿÿiÑÛ§Gˆ‰‰¼ïˆ‰‡Û§GÿÐ2˜š—ÿ“˘š—ÿgd63ÑÔüÿ—ÿiüþ—iüþ—iÈ«ª«UV†«ª«ÊÌj4/˜`Ñh ™˜`ÑËÊijdÎÿÿfÿdÍÿÿœ3ÿÏcÿÿÑ”Ïbÿ@®ÿñïó6Õf×f×6ÕGEH«ª«¹»¸ÿ¹»¸ÿ™ÑЙÑÐý‹þý‹þÏÏ.2ÏÒÎÎh›h›ÏÏ.2ÏÒVVh›h›ÏÏ.2ÏÒff‹‹ÏÏ.2ÏÒÏ›ÿÏ›ÿ™ÑЙÑИÿÿ-.Òÿ-.Òÿ–ÓÓÒ.¹»¸ÿ«ª««ª«¹»¸ÿ¹»¸ÿdecÿ«¬ª«¬ªdecÿdecÿòÿúœ2/j5dÿÿÓÒ.ÓÒ.]j£–ü™hg˜‹‰‹uwu¯®¯QRQxwyˆ‰‡higÿ˜˜™àßàxvy ! ÿ«þ5†jËϘÿý‹þýàiÑ—/ÿÿiÑiÑ—/ÿÿiÑc1ÎÿÐ2Ð2c0Θš—ÿm5É“Ë7™œÊ˜š—ÿÿd-ÿ0É/gÑҚʉŒº‰ŒºÒšÊÿÿÿiшò‡ ÃjÏ0j4þ«ª«j4þ2gŸijŘ`ÑijÅ2gŸdÎÿÿœ3œ3dÍÿÏcÿÿ1ž@®ÀRòÊÿ+ÿÊÿ+ÿÊÿ+ÿdecÿdecÿdecÿdecÿuÿuÿ2þÿ2þÿªÿªÿšÿšÿ1eÿ1eÿ˜ÿÿ-.Òÿ-.Òÿ-.Òÿdecÿdecÿdecÿdecÿdecÿ ÿ ÿ ÿ ÿ ÿòÿòÿdÎÿÿ-.Òÿg™ÿg™ÿ ÿcÿ ÿcÿ ÿcÿg™ÿ ÿcÿg™ÿeÿg™ÿeÿÿg™ÿg™ÿeÿeÿ©«¨ÿ©«¨ÿÝàÜÿÝàÜÿÝàÜÿ©«¨ÿÝàÜÿ©«¨ÿˆŠ‡ÿˆŠ‡ÿ¹»¸ÿ¹»¸ÿ¹»¸ÿˆŠ‡ÿ¹»¸ÿˆŠ‡ÿhigÿˆŠ‡ÿhigÿÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿÿhigÿÿÿÿΙaÿÿ‰ÿÿÿ‰ÿÿUÿUÿΙ1ÿuÿUÿUÿ ÿuÿ ÿ—/ÿÿ—/ÿÿÿΘÿÿˆŠ‡ÿÿÿˆŠ‡ÿÿÿΘÿ˜š—ÿÿ˜ÿÿd-ÿüÿ—ÿˆŠ‡ÿÿˆŠ‡ÿüÿ—ÿÿþÍÿÿÿÿše2ÿdecÿΙaÿše2ÿe/œÿΙaÿþÏÌÿÿ+eÎÿÿÿ+eÎÿÿþÏÌÿÏcÿÿÏcÿÿ ÿ6Õ6Õ6Õœ›œ›œ›œ›uÿý‹þý‹þuÿÎÎVVšÿffšÿ1eÿÏ›ÿÏ›ÿ1eÿéhêj--.Òÿ-.Òÿ-.Òÿ-.ÒÿÓÒ.œ›œ›œ›œ›œ›ñïóñïóñïóñïóñïó/0—ÿ/0—ÿ/0—ÿ/*¥/*¥/0—ÿ/0—ÿòÿÉ`Ó-.Òÿ¤fc\šg˜™Ìg4454ÌËÌ111ÏÏψ‰‡àßà ! ˜—™ÿÿ2gŸÂ+ö4 IDATE™_ÿE™_ÿ‰«‰«2gÏý‹þuÿ¼ ¼ ôdõ œ ñïó2hÿxÜKÿxÜK2hhfi€ÿhÿd-ÿÿ˜ÿœÓii3ÿÿÿÿþÍÿÿše2ÿœ›Ιaÿše2ÿ›ÑdΙaÿ14ÿÿ14ÏcÿÿÀRò ÿ™/ÿÿÿÿ™/ÿˆŠ‡ÿÿ‰ÿΙaÿ‰ÿÿÿΙaÿΙaÿ™/ÿšÿΙaÿΙaÿˆŠ‡ÿ™/ÿÿÿÿÿΙaÿΙaÿΙaÿ™/ÿ™/ÿ™/ÿ*M#Ó IDAT2gŸše2ÿÌÌÑše2ÿf2Ÿše2ÿše2ÿ2gŸΘaË–Ÿ™/ÿ™/ÿÿ™/ÿeÿ™ÊgkË›™/ÿgÒ™.5jaË–ŸgÑÿÿ™/ÿgÑ››››f›5››5ja™.5jagÑgÑÿÿÞ‡Lè IDATeÿeÿ™/ÿšÿeÿeÿeÿeÿΙaÿ™/ÿΙaÿeÿ›™Êg6›5ΙaÿgÑΙaÿ¢¬q IDAT=·O IDAT€ÿ.ÂÌ„ IDAT=·O IDAT=·O IDAT=·O IDAT€ÿ/1.ÿègÑ™/2ΞÒbÿ.žÒbÿ.žÒbÿ.žÒbÿ.Î22ÎÎ2ÐÏÒ01.kþn•’ÐÍŸ03aÑÏÒÏžÒ1b.ègÑègÑ™/žÒbÿ.bÿ.žÒbÿ.žÒbÿ.žÒbÿ.žÒ01.2ÎÎ2kþn•’kþnègÑ™/ÏžÒÏžÒègÑ=½TèfÎ=½TèfÎègÑÿÿÿÿžÒbÿ.žÒbÿ.žÒbÿ.žÒbÿ.Î2•’kþnkþneÑd3ÐÏÒÐÏÒÐÏÒÐÏÒÐÏÒ™/ègѹ+fÜ IDAT1b.1b.ÏžÒ«©z«©zêe¸™bbÿ.žÒbÿ.žÒbÿ.žÒbÿ.žÒÏžÒÏžÒÎ2bÿ.bÿ.›/œ01.ÐÏÒ01.01.ÐÏÒègÑègÑ™/ègÑ1b.ÏžÒš2š2þjœ`;žÒbÿ.žÒbÿ.žÒbÿ.žÒbÿ.žÒÿÏÐÏÒ01.bÿ.bÿ.žÒkþn01.ÐÏÒ01.ÐÏÒÐÏÒ01.™/ègÑ™/ègÑ™/ÏžÒ1ÿbÿ.žÒbÿ.žÒbÿ.žÒbÿ.žÒègÑÿh„þdžÒbÿ.žÒkþn•’kþn01.ÐÏÒ01.ÐÏÒègÑ™/ègÑ™/ÏžÒ1b.géžÒbÿ.žÒbÿ.žÒbÿ.6îà IDATžÒbÿ.žÒ1ÿ˜žÒ•’kþn•’kþnÐÏÒ01.01.01.ÐÏÒ01.™/ègÑ™/1b.ÏžÒ1b.™/ègÑ™/ègÑ™/ègÑbÿ.bÿ.žÒbÿ.žÒbÿ.žÒbÿ.žÒ˜ƒ—kþn•’01.01.ègÑ™/xÿ‡˜=½TFßfÎTðS454ÌËÌ454vEy1ÿÏ1ÿÏ1ÿÏ1ŠvþŠvþŠvþŠuÿúþÎ2ÿÿþÎ2ÿÿê—ÿéiÿÿê—ÿéidœaþ.ŸÒdœaþ.ŸÒš.œfÒdÿÿš.œfÒdÿÿÿx‡éþÎ2êy‰ŠvþŠwþšd2fœÎš.œd dœ`œd dœ`œd dœ`œfÒd‰ÿwþ‰ÿwþ‰ÿvþËŠ5wþ‰ÿe0ï›ÐE™_»g¡wþšd2e™›3ÿýÍ3TTS«©zUW†¬¬­TTS ªÛóV%¬¬­ÿÿéþΚ2èfÎ2êÿýÍ03aÐÍŸ03aÐÍŸ03akþn•’ÑÏÒaš.ŸfÒ454ÌËÌ454ÌËÌ454ÌËÌ454ÌËÌv1ÿÏ1ÿÏ1ŠŠvþŠvþЇ+Î IDAT‡éþΫÿþ‡êywþËTS5«¯vþŠî%UÌËÌ454wtF›ged dd dTTS454xwywþˆ‰‡ÿwy‰ÿvþËvþË3‰ÿwþï›Ðe0»g¡šd2fœÎe™šd2fœÎÿýÍš2ÿýÍ3TTS«©z3ÿýÍ3TTS¬¬­TTS ªÛ ªÛTVS¬¬­éþΚ22h2˜èfÎÿýÍ3ÐþÍ03aÐÍŸÐÍŸ03aÐÍŸbaÐÍŸ03akþneÑdÇÿ.Î2aš.aš.ŸfÒ454ÌËÌ454454ÌËÌ454ÿz­1ÿÏ11ÿÏ1vþŠvþŠŠvþŠþÎ2ÿÿþÎ2ÿÿ—ÿéiÿÿê—ÿéiÿÿêœaþ.ŸÒdœaþ.ŸÒdfœdÿÿš.œfÒdÿÿš.œfÑÜ454v©z3œ`œxwyˆ‰‡xwyTTS454ÿý͉Œº›gefœÎšd2fœÎ‰ÿýÍš2ÿh2ÿýÍ3ÿýÍ ªÛ ªÛ2„e3dÏÎÿ33þÍÐÍŸÿÑ3/ÍÐÍŸ03aÐÍŸbaŸfÒšaÐÍŸ03akþneÑdÿébÿ.Î2ŸfÒŸfÒÌËÌ4544541ÿÏ1ÿÏÿÏ1ÿÏŠvþŠvþvþŠvþÿþUéþÎÿþUÿþUéþÎÿþUÛ«FßÛ«›ged deÑdeÑdd dd dTTSˆ‰‡4543344/djÎdjÎþΚd2Θaˆ‰‡î%Uˆ‰‡šd2ˆ‰‡‰Œºî%UÿýÍš2ÿhêyÿhš2ÿýÍUW†UW†TTSóV%ŸfÒŸfÒóV%}3Íœ–2ÉÿÿýÍ33ÐÍŸÐÍŸÿÑ3ÿÑ3ÐÍŸÐÍŸbaŸfÒŸfÒbaÐÍŸÏžÒïÑfÿêeÿžÒ2Îaš.aš.9f9fÌËÌ454ÌËÌÿÏ11ÿÏ1ÿÏ1vþŠŠvþŠvþŠþÎ2ÿÿþÎ2ÿÿ—ÿéiÿÿê—ÿéiÿÿêaþ.ŸÒdœaþ.ŸÒdœÿÿš.œfÒdÿÿš.œfÒd«2««2«e™›e›ÎefÛ|F IDAT™›î%UÿÏ1¬¬­ÌËÌxwyÌËÌÿýÍÿýÍ06ŸÐÊa2uÏþï›Ð44/»g¡fœÎxwyÛ«3èfΘ‡˜èfÎ3€ÿ¬¬­«©z¬¬­œ9f9fœ|›Íœ–21ÿ03aþÍþÍ03a03a/Í/Í03a03ažÿŸaš.aš.žÿŸ03a1b.uÏþs›ÿéxÎ2aš.œœ454ÌËÌÌËÌ454ÌËÌÌËÌ1ÿÏÿÏ11ÿÏŠvþvþŠŠvþÌËÌÌËÌÌËÌÿÏ1TTSˆ‰‡45433ÐÊa06Ÿ44/xwyxwyxwy3èfΘèfÎ33þÍþÍ03a/Í03a03ažÿŸaš.žÿŸ03a1b.uÏþsx/1¶ŸfÒ9fŸfÒfÎfÎdd454ÌËÌ454454ÌËÌ4541ÿÏ1ÿÏÿÏ1ŠvþŠvþvþŠ2ÿÿþÎ2ÿÿþÎéiÿÿê—ÿéiÿÿê—ÿŸÒdœaþ.ŸÒdœaþ.š.œfÒdÿÿš.œfÒdÿÿÿÿ«©z«©z«©zœ`œÿÏ›/œ¬¬­xwyÌËÌÿýÍÿýÍv{06ŸÐÊaþ΋1»g¡»g¡Û«3èfÎ3ÿýÍ„e3djÎèÏ03a03aþÍ03a03a03a03a03ažÿŸ03a1b.uÏþ/1¶œd454ÌËÌ454454ÿÏ11ÿÏ1ÿÏ1vþŠŠvþŠvþÿ‡Î‡3›gee2gefÒdš.œœ`œfÒdTTSTTS4543‰‹1¡»šd2Ï^C IDAT3TTSUW†TTSšd2fœÎšd2ºð}3Í}É03a03a03a1b.ÿš.œeÑd›/œeÏ13š.œfÒdÿýÍ3ÿx˜‡ç7/Í3TTSÃC¬=½T«©z3TTS454ÌËÌ«©z3š.œeÑd›/œfÒdš.œfÒdÿx˜‡éhyˆTTSÃC¬=½T¬¬­TTS454ÌË̬¬­‰ÿvþÏ™a1gŸŠwþš.œeÑdÏ™a1gŸ›/œfÒdš.œd dœ`œfÒdÿx˜‡·bIÿžéhyˆTTSÃC¬ƒÍ3djÎÉÿ=½T¬¬­TTS454vEyŠ»‡ÌË̬¬­‰ÿvþŠwþš.œeÑd›/œfÒdš.œfÒdþÎ1xˆ—ÿéiTTS454ÌË̬¬­‰ÿvþŠwþš.œeÑd‰Š‡¥fÒdš.œî[ëxwyþΊ»‡vEy2TTSÃC¬èfΚ2=½T¬¬­TTS454vEyV†S¬¬­/0.ZÏÔÿŠ…v{¦1,ÐÍŸ03a%$%ÛÜÛÑÏÒš.œeÑd›/œeÏ1š2š.œfÒdÿýÍš2ÿx˜‡éhyþψ/͉ŒºTTSÃC¬=½T«©z‰ŒºTTS454ÌËÌ«©zš2š.œeÑd›/œeÑd/œfÒdš.œfÒdš.œfÒdþΈˆ1xþψÏV†SÃC¬=½TÃC¬TT454ÌËÌ4545«¯E™_›ÌÑ4›e244/vgŸÿ/š4jÅ›Ì24›e244/egd/œfÒdþÎÐÊÅ4jÅ06Ÿ`œfÒdÿxΙéÌÌ34/ƒÍ344/I˜žéhTUÛÃC¬=½TdzΜ–2=ðTÃC¬TTªz­œ–ßEÛ«djΊ‡454vtF‰ŒºÌËÌ454‰v{ÿŠ…dEd‰»‡ÌËÌ45ëšœ}icèfΚ2ÿh˜céiþÎ/͉ŒºÌËÌþψ1xeˆaš.ŸfTðS¬dþj/ÍÿÑ3­ÐÊa06ŸŠ‡5«¯ËUQ‰54‰v{ËUQî5ë‰[‡eÑd/œfÒdTTSî5ëš.œfÒdþÎV†S454ÿxTUÛ454«fÎèfάTTzD06y454ÛÜÛe0îvþŠÐÍŸÏ›”ÐÍŸ03a%$%FÚI&ÛÜÛ6–eÏ1š2ƒ—šd2ÿýÍš2éišeºþψ/͉ŒºvEyFß«©z‰ŒºÌËÌFß«©zš2=½Tº&·‰Š‡î[ëî[뉊‡º&·—ÿeÏ1ÿýÍÿýÍeÏ1—ÿV†SŠ»‡Š»‡þψþÏˆŠ»‡Š»‡V†S5«¯ç7ªz­ªz­ç75«¯¬«%¥FÚIFÚI¥¬«%1gŸºð!1elºð!»g¡1gŸºð!1elºð!Ì–;œ`œ†¼ò/͆¼ò2ÿˆ06Ÿe™›1ele™›06ŸèhŠ»‡e™›Š»‡ï›Ð1ï›ÐV†SŠ»‡Š»‡««­v{ÌËÌFÚFÚIwvy¥ÌËÌFÚIxwyÌËÌ1xªz­ÌËÌÌËÌxUW†‰Œºèfκñ&V†SÐÊaï›Ðe›Îe›ÎvþÐÍŸÏ›”ÌÌÑÏ›”ÐÍŸ%$ÿµÈÇ IDAT%FÚIfÒdFÚI%$%djÎeÑdeÑdeÏ1š2èhdjΚ.œš.œÿýÍš2ƒ—44/˜‡þψ/͉ŒºvEy1x44/ÃC¬ÃC¬«©z‰Œºxe›Î454454«©zš2qòˆ454ÌË̺&·º&·ÌËÌ454èfÎÿýÍÿýÍèfÎ454Š»‡Š»‡454vþÉÿ1ªz­ªz­1Éÿvþÿˆî[ëFÚIFÚIî[ëÿˆvþeÑdš.œx1ÿÑ3ÿÑ31˜ÿÃC¬ÃC¬454vþ««­Û«wvyeÑdzDÛ«š.œFßv{Éÿªz­Fßv{ÃC¬Û«Š5š2454ÌÌÑ‹1wvyUUSÐÍŸÏ›”ÌÌÑÌÌÑÏ›”ÐÍŸ%$%FÚIfÒdfÒdFÚI%$%œ–2ÿÏ›/œþÍš2ƒ—œ–2d dfÒdeÏ1š2éiÌÌÑ·bç7/͉ŒºvEyÉÿÌÌÑ·b=½TèfΉŒºÌËÌ›e2FÚÌËÌwtFš2=½T««­ÌËÌ454454ÌËÌ««­›1Ïš2š2›1ÏvEyvEyÿÏ›e211›e2ÿÏÿÏfÑÜd dd dfÑÜÿÏŠ›/œfÒd=½T=½TÌË̉ŒºwtFÌËÌ454Š»‡vEyÌËÌ454š2èfÎÿh˜vEy‰ŒºwtFÌËÌ454vEyŸfÒaš.TðS¬­ÿÑ3/ÍÐÊa06ŸŠŠ›/œ¥fÒdxwyvEyÉÿ=½TÌËÌV†SvþËþÍþÍþÍþÍUUS03a1el44/44/1el03aÛÜÛº&·š.œš.œº&·ÛÜÛÊjœ–2d dš2èhfœÎœ–2þΚ2ƒ—f›FÌÌÑÐÊa‰ŒºvEy1xºð!ÌÌÑ««­‰ŒºÌË̺ð!ÌÌÑ ªÛš2=½TÌËÌ454ÌËÌÌËÌ454ÌËÌèfΚ2š2èfÎï›ÐÿÏÿÏï›Ð/Íc0.c0./Í454454v{wvy¥wvyéiƒ—œ3ÿV†SV†SUW†Š5ÿÑ3ÿÑ3›ge›geFßFß03a1el44/1el03aÛÜÛº&·š.œº&·ÛÜÛL_¼ IDATdjΜ–2ç7›/œdjΜ–2ç7fÒd44/ÌÌÑFÚ1x44/›e2FÚ44/9f·bFÚIÌËÌ454454ÌËÌFÚI3èfÎèfÎ3vEyÉÿÌËÌÌËÌ1b.vEyV†S11V†SUW†µѵÑUW†wvy‰ŒºwtF454v{wvyŠ»‡vEy454¥ƒ—š2èfΘéi1xvEy‰ŒºwtF454vEyÉÿ3ÿŸfÒaš.¬­œV†SÿÑ3/Í06ŸV†S11djÎe›Îe›Î03a1el03aÛÜÛº&·ÛÜÛd dœ–2e›Î›2d dœ–2ÑþΜ–2Êjœ–þÎΜ–2ÊΙéÌÌÑ}3̓Ì3Ι/ÌÌÑ}‡zDÌÌÑ}3̓Ì3zD/ÌÌÑÃzDÌÌÑî%UÌÌ«««Î›e2î4««­«­›1Ï1x˜ªz­­EÉÿ1yTUÛŽ˜ýŽˆŠˆ««­©z««­wvytFwvyFÚIFÚIF.I˜ÿè1þ1˜ÿÃC¬ÃwÎÃC¬ÿŠ…vyÿŠ…4wvy‰wvywvy‰Š‡wvyƒ—cƒ—.œÉÿçE‰ŒvEyÉÿ3ÿŸf3ÿ3Š»‡v3Š»‡45vþgŸ1eÑdg1dš.œ–š.œÃC¬FÍ3ÃC¬454Ûß454ÿÏœ–2›e2e›Î03aÛÜÛše2ÿþÏÿÿΙaÿÿÿþÍÿˆŠ‡ÿÿˆŠ‡ÿˆŠ‡ÿÿÿþÍÿÿÿþÍÿÿˆŠ‡ÿÿΙaÿše2ÿÿˆŠ‡ÿÿþÍÿˆŠ‡ÿÿÿþÍÿþÏÿÿÿÿÿˆŠ‡ÿÿþÏÿˆŠ‡ÿ¦]1 IDAT€ÿdjΜ–2ÿþÍÿÿˆŠ‡ÿÿˆŠ‡ÿÿΙaÿše2ÿšd2Ιaÿÿ‰ÿþÏÿþÏÿþÏÿþÏÿ‰ÿ‰ÿÿ‰ÿÿþÍÿÿÿþÍÿÿÿþÍÿ‰Œºˆ‰‡ÿhigÿàßàhhgÿþÍÿ3ˆ‰‡ˆŠ‡ÿ3ˆ‰‡ÿˆŠ‡ÿÿˆŠ‡ÿÿše2ÿfœÎÿΙaÿΙaÿše2ÿÿˆŠ‡ÿwtFxwyÿÿþÍÿÿÑ3þÎÿÿÿ‰ÿ‰ÿÿÿÿˆŠ‡ÿhigÿhhgˆŠ‡ÿÿþÏÿhigÿœ–2higÿþÏÿÿˆŠ‡ÿhigÿÛ«higÿˆŠ‡ÿÿΙaÿ2hŸÿœ–2djÎfœhigÿ ! wtF3ÿþÍÿ‰Œºàßà ! àßà˜—™higÿ ! àßà˜—™ÿþÍÿ3ÿ›geˆ‰‡ÿ2gŸhigÿeefšÐšfh™ÿhigÿ ! Û«f›Îše2ÿî%Uàßà ! wtF3ÿþÍÿ‰Œºàßà˜—™ˆŠ‡ÿxwyÿvþ2ÿÿþÏÿ1ÿþÿe0œÎÿd0‰›ÐÿvþˉŒºÿýÍ3ÿÿÿþÍÿ‰ŒºÿýÍ3ÿþÍÿ‰Œºxwyhhg ! àßà˜—™higÿ ! àßà2üË44/2gŸΙaÿÌÌÑe™›‰ŒºxwyÿÿþÍÿxwyÿÿf0úšÐà˜˜™‰ŒºxvyÿxvyˆŠ‡ÿàßàˆ‰‡xwyÿ44/ÌÌÑše2ÿ44/2hŸÿ44/œÎ‰ŒºÿþÍÿÿÑ32ÿþÏÿþÎ1hieÿ‰! àßà˜™ÿˆŠ‡ÿxwyhhgwtFikšxwyˆ‰‡xwyÿšd22ÎþΙÎ2šd2fœÎÿˆ‰‡xwyhhge™›ikšxwyˆ‰‡xvyˆŠ‡ÿºñˆ‰‡ÿxwyÿî%U/›3 ! xwyÿþÍÿ‰Œºxwyˆ‰‡xwyˆ‰‡ˆŠ‡ÿàßà ! xwyˆ‰‡›geàßà ! àßàhigÿ˜˜™ÿ ! xwyˆ‰‡šeÿî%Uxwyˆ‰‡xwyÿþÍÿ‰Œº‰Œºxwyˆ‰‡ÿþÍÿ3ÿýÍ3ÿÿÿÏ2›e2e1Λe2œÎÿÏw1þ›Îše2ÿfœÎšd2ï›ÐwþÿŒºÿxwy‰ÿÿ‰Œºxwy‰Œºàßà˜˜™ÿ ! ÿxwyˆ‰‡higÿ ! xwyˆ‰‡4ú2hŸÎ˜aΙaÿ2hŸÎ˜a32üËfœÎÿxvyhigÿxwyÿše2ÿfœÎÿ44/ÌÌÑÌÌÑ44/ÌÌÑše2ÿ4ÚÏ›ÚxwŸÿ3þÏÿ2xvyÿxvyf›Îjšgÿ—•fikš™f›Îxvy ! ÿ‰Œº—•f˜˜™xvy+…¨ IDATˆŠ‡ÿxwyxvyFÚxwyxvyÿwtFàßà‰Œº‰ŒºàßàwtFÛ«àßààßà ! àßààßà˜ÿÿÿ˜˜™Û«FÚ˜˜™higÿhhgÿàßààßààßà‰ŒºwtFàßàhigÿ‰Œºÿ‰Œºhhgÿï›ÐÿÏÿÏï›Ð‰ÿšd2ï›ÐxvyÿÛ«e0e0v{xvyFÚ˜˜™ÿàßààßà ! àßààßààßàÌÌÑÌÌÑÿþÍÿ‰Œºše2ÿfœÎÿxvyˆ‰‡ÿˆŠ‡ÿxwyÿf0ú44/ÌÌÑše2ÿfœÎÿ44/ÌÌÑþÎÿ1ÿàßàxvyÿ‰ŒºwtFwtF‰Œºî%U ! àßà ! ˜ÿÿèfΗÿÿxvyÿ˜—™ÿ˜—™—•f ! ˜˜™ÿÛ«Û«wtF‰Œº1‰ÿ111‰ÿÿþÍÿÿe™›fœÎfœÎvþËÿþÍÿ3Û« ! àßà ! ! ÌÌÑÌÌÑÿþÍÿ‰Œºxwyÿ44/ÌÌÑΙaÿÛ«FÚšd2ÿÌÌÑše2ÿfœÎÿ44/ÌÌÑf›ÎfœÎÿše2ÿfœÎÿhigÿÿþÍÿ2ÿwtF‰Œºxvyÿ‰Œºxvyÿàßà ! àßàxvyéhÿÿéiÿÿþÍÿ›geÿýÍ3ÿÿ3ÿþÍÿxwyÿÿf›Îÿf›ÎÎÿ‰ŒºwtFikšxvyàßààßà‰ÿvþvþÿwþÿÿe0e0ï›Ð‰ÿ‰Œºÿý͉Œºÿ‰Œºÿÿý͉Œºxvyÿ ! àßàxvyxÿ44/ÌÌÑ2gŸÏ›”ÛÑfœÎÿše2ÿfœÎÿ44/œÎ44/ÌÌÑše2ÿfœÎÿ44/ÌÌÑhigÿÿÑ32ÿˆŠ‡ÿwtFàßàŒdB IDATΙaÿÿÿþÍÿþÏÿše2ÿþÏÿÿÿþÍÿÿÿþÍÿÿše2ÿΙaÿÿÿÿþÍÿÿÿþÍÿˆŠ‡ÿÿ‰ÿÿÿÿÿÿše2ÿÿÿÿÿ‰ÿˆŠ‡ÿÿˆŠ‡ÿÿše2ÿΙaÿÿΙaÿše2ÿÿΙaÿše2ÿÿΙaÿše2ÿÿΙaÿše2ÿÿše2ÿÿše2ÿΙaÿÿΙaÿše2ÿÿΙaÿΙaÿÿhigÿÿÿˆŠ‡ÿÿÿÿþÍÿÿÿÿþÍÿÿÿþÍÿÿþÍÿˆŠ‡ÿÿÿþÍÿˆŠ‡ÿÿÿþÍÿˆŠ‡ÿÿÿþÍÿÿÿþÍÿˆŠ‡ÿÿþÏÿše2ÿÿˆŠ‡ÿÿÿÿ™ÿÿÿÿÿÿÿÿ ÿþÏÿÿþÏÿÿÿþÍÿðÿðÿÿþÍÿþÏÿše2ÿÿÿþÍÿÿˆŠ‡ÿÿþÍÿÿÿþÍÿÿˆŠ‡ÿÿþÍÿÿhigÿÿÿÿÿÿ‰ÿ‰ÿÿÿþÍÿˆŠ‡ÿÿþÍÿ˜ÿÿÿþÍÿÿˆŠ‡ÿCEBÿˆŠ‡ÿCEBÿˆŠ‡ÿÿˆŠ‡ÿCEBÿˆŠ‡ÿCEBÿˆŠ‡ÿÿ.šÿ.šÿuÿÿÿÿÿÿÿ ÿΙ1ÿ¹»¸ÿþÏÿhigÿše2ÿhigÿþÏÿÿþÏÿ'™˜ÿše2ÿ'™˜ÿþÏÿÿuÿðÿðÿlÔÉã IDATše2ÿþÏÿÿÿþÍÿˆŠ‡ÿÿÿþÍÿˆŠ‡ÿÿÿþÍÿˆŠ‡ÿÿÿþÍÿˆŠ‡ÿÿhigÿxÿhigÿxÿhigÿÿhigÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿhigÿΙaÿÿþÍÿΙaÿΙaÿÿþÍÿΙaÿˆŠ‡ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿˆŠ‡ÿhigÿše2ÿhigÿhigÿše2ÿhigÿÿÿþÏÿþÏÿše2ÿše2ÿ‰ÿÿhigÿˆŠ‡ÿhigÿhigÿˆŠ‡ÿhigÿÿþÍÿˆŠ‡ÿˆŠ‡ÿhigÿÿše2ÿΙaÿΙaÿÿΙaÿΙaÿše2ÿxÿš/œÿš/œÿš/œÿš/œÿxÿˆŠ‡ÿÿþÍÿ˜ÿÿ©«¨ÿÿÿþÍÿÿýÏaÿÿÿÿÿýÏaÿýÏaÿ¬ÿÿÿ¬ÿÿe0ÿ™ÿe0ÿÿ.šÿ.šÿuÿ.šÿ˜eÿuÿÿþÏÿüÿ—ÿüÿ—ÿüÿ—ÿüÿ—ÿþÏÿΙ1ÿΙ1ÿ˜eÿ¹»¸ÿ¹»¸ÿtvsÿše2ÿÿþÏÿþÏÿþÏÿÿše2ÿÿše2ÿÿþÏÿþÏÿþÏÿÿše2ÿÿ˜eÿuÿÿÿþÍÿˆŠ‡ÿÿþÍÿÿše2ÿΙaÿÿhigÿˆŠ‡ÿÿhigÿˆŠ‡ÿÿˆŠ‡ÿÿþÍÿÿhigÿÿþÍÿhigÿÿše2ÿÿˆŠ‡ÿÿhigÿˆŠ‡ÿhigÿˆŠ‡ÿÿˆŠ‡ÿÿþÍÿÿΙaÿÿþÍÿΙaÿÿþÍÿÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿše2ÿÿhigÿše2ÿhigÿše2ÿÿše2ÿþÏÿþÏÿÿÿÿÿÿÿ‰ÿše2ÿše2ÿˆŠ‡ÿÿhigÿˆŠ‡ÿhigÿˆŠ‡ÿÿˆŠ‡ÿˆŠ‡ÿˆŠ‡ÿhigÿhigÿhigÿhigÿhigÿÿΙaÿÿˆŠ‡ÿΙaÿΙaÿˆŠ‡ÿÿΙaÿÿÿÿš/œÿš/œÿš/œÿš/œÿÿÿÿÿþÍÿ˜ÿÿ©«¨ÿÿÿþÍÿÿþÍÿÿþÍÿÿýÏaÿÿÿýÏaÿýÏaÿ¬ÿÿÿ¬ÿÿe0ÿ™ÿe0ÿÿ.šÿuÿ.šÿuÿuÿ˜eÿÿüÿ—ÿÿüÿ—ÿüÿ—ÿüÿ—ÿüÿ—ÿÿüÿ—ÿΙ1ÿ˜eÿΙ1ÿ˜eÿ¹»¸ÿtvsÿ¹»¸ÿtvsÿhigÿtvsÿhigÿÿ'™˜ÿ'ÏÎÿ'™˜ÿÿuÿ˜eÿÿ44/ÌÌÑ ! àßà ! àßàhigÿ ! wtF‰Œº‰ÿ‰ÿwþÿÿàßààßà ! àßààßàÏ›”Ï›”1elÏ›”Ï›”1elï›ÐÎ52üËÎ5Îï›Ð›ÿþ‰›ÐÿŠUàßà ! àßàxvyÿFÚºñ&FÚxÿÏ2fÑÜþψ1xÿÏ1þÏÿŠ»‡qòˆx3©«¨ÿWVXÿýÏaÿýÎa.šÿÕÛ+%þÕÛý‹þ#eÝ›Ðiþ0—ÐiΙ1ÿÊÌÏh›Ι1ÿÊÌÏh›¹»¸ÿ»»»ŒŠ¹»¸ÿ»»»ŒŠ#eÝ›¿(×ò IDAT€ÿše2ÿfœÎÿhigÿ˜˜™ÿhigÿ˜˜™ÿàßà‰Œºàßàwþe™›wþÿ ! ! àßà ! ! 1el1elÏ›”1el1ele02üË2üËe0ÿwþwþ ! àßà ! ºñ&FÚFÚºñ&/Íc0.c0./ÍvEy‰ŒºxvyýÏaÿÕÛÒfý‹þuÿ‹ÿÐiÐi2gÏ641˜eÿ2gÏ641˜eÿGEHEEEtvsÿGEHEEEtvsÿuÿ‹ÿ44/ÌÌÑ ! àßà ! àßà ! àßàhhgÿxvyÿàßà ! àßàxvy3ÿÏ›”1elÏ›”33‰Œº‰Œº3f›ÎÿÎ5Î5f›Îxvyÿxvy2gŸÿÛ«ºñ&ºñ&Û«2gŸ3ÿµѵÑ3œ–2vEyþÏÿÿþÍÿÿýÍÿýÏaÿuÿý‹þ#eÝ›iÿþ0—þ0—i2gÏ6412gÏ641˜eÿGEHEEEGEHEEEtvsÿ#eÝ›ÿþÍÿΙaÿÿˆŠ‡ÿÿˆŠ‡ÿÿˆŠ‡ÿÿhigÿÿÿþÍÿÿÿþÍÿÿþÏÿše2ÿÿþÍÿÿÿþÍÿÿ©«¨ÿÿýÏaÿýÏaÿýÏaÿÿýÏaÿýÏaÿýÏaÿýÏaÿÿÿÿÿÿ™ÿÿuÿ˜eÿÿΙ1ÿ¹»¸ÿÿtvsÿÿÿ'ÏÎÿÿuÿ˜eÿÿT÷¢ IDATÿÿýÍg3aš.ŸfÒÿ™Íš2éÍaš.ŸfÒaš.ŸfÒš2Çšü9fÇšü9fÇšü80Ò62ÿÊÎ62ÿÊÎ62djΊ»‡v{ßie!—›ßie!—›ßie!—›ßie®—˜Kÿ/µÑKÿ/µÑKÿ/µÑKÿ/ŸJaÿ¶ŸJaÿ¶ŸJaÿ¶ŸJaÿ¶9fî%Uàßà ! àßà ! àßà ! àßà—•f03a989ÇÈÇk4ÿÊÎ62fΚ2•ÌüÑ4Òš2•ÌüÑ4Ò/Ì.989 ! wtF03aÑ4ÒÎ4aÌÌÑ44/ÌÌÑfÎ/Ì.ÑÏÒaš.ŸfÒš2fΚ2fÎaš.aš.ŸfÒš2èfΚ2èfÎéÍ3ÿŸfÒaš.ŸfÒœd9fÇšü9ffœÎaš.62ÿÊÎ62ÿÊÎ62àßà ! ßießie!—›ßie!—›ßieKÿ/Kÿ/µÑKÿ/µÑKÿ/aÿ¶aÿ¶ŸJaÿ¶ŸJaÿ¶àßààßà ! àßà ! àßà989989ÿÆ™ÿÊΚ62k42k42•üÇÈÇ ! wtF03aÎ4aÌÌÑaš.80Òaš.fΚ2š2fÎaš.ŸfÒ9f80ÒŸfÒaš.ˆ%‡ˆ%‡qòˆš2qòˆéÍéÍ80Ò80Òœd™Ê™Ê80Ò80ÒfœÎšd262ÿÊÎÿÊÎ62ÿÊÎàßà ! !—›!—›ßießie!—›µѵÑKÿ/Kÿ/µÑŸJŸJaÿ¶aÿ¶ŸJ ! ! àßààßà ! ÇÈÇÇÈÇÇÈÇÇÈÇÇÈÇÇÈÇ626262626262•Ìü•Ìü•Ìü•Ìü•Ìü•ÌüÇÈÇàßà03aaš.9faš.ùª=Ü IDATš2ÿÊΚ2ŸfÒŸfÒˆ%‡ˆ%‡àßààßàˆ%‡wtF‰ŒºqòˆwtF3ÿ3ÿg6g6dg6™Ê™Êg6œ6262šd262ÿÊÎ62 ! ßie!—›ßie!—›!—›ßie!—›Kÿ/µÑKÿ/µѵÑKÿ/µÑaÿ¶ŸJaÿ¶ŸJŸJaÿ¶ŸJàßà ! àßà ! ! àßà ! 989989989989989989ÿÊÎÿÊÎÿÊÎÿÊÎÿÊÎÿÊÎÑ4ÒÑ4ÒÑ4ÒÑ4ÒÎ4aÌÌÑfÎ2ÌŸ44/š2ŸfÒŸfÒŸfÒŸfÒfΚ2š2fΜŸfÒŸÒˆ%‡àßà˜ü™àßàœš2š2xéÍé͙ʙÊaš.aš.œdÇšüÇšüÿÊÎ6262ÿÊÎ!—›ßießie!—›ßie!—›ßieµÑKÿ/Kÿ/µÑKÿ/µÑKÿ/ŸJaÿ¶aÿ¶ŸJaÿ¶ŸJaÿ¶ ! àßààßà ! àßà ! àßàÇÈÇÇÈÇÇÈÇÇÈÇÇÈÇÇÈÇ626262626262Î4aÌÌÑš2aš.aš.œœfÎ62fœÎœdœxÛy˜ü™œ˜˜™dqòˆš2qòˆqòˆ33éÍéiéiŸfÒaš.aš.ŸfÒœg6g6d9fÇšüÇšü9ffœÎÿÊÎ62ÿÊÎ62àßàßie!—›!—›ßießie!—›Kÿ/µѵÑKÿ/Kÿ/µÑaÿ¶ŸJŸJaÿ¶aÿ¶ŸJàßà ! ! àßààßà ! 989989989989989989ÿÊÎÿÊÎÿÊÎÿÊÎÿÊÎÿÊΚ2k4š2š2k4š2Î4aÌÌÑfÎ2ÌŸ44/š2ŸfÒ92ŸÒdÿÊÎdœdàßàdwtFŒˆwtFwtFwtFš2‚—~iÿ~iÿéÍ80ÒŸÒd[Wø IDAT80ÒfÒšd2ÿÊÎ62ÿÊÎ62ÿÊÎ62àßà ! ! ßie!—›ßie!—›ßie!—›ßieÇKÿ/µÑKÿ/µÑKÿ/µÑKÿ/aÿ¶ŸJaÿ¶ŸJaÿ¶ŸJaÿ¶fàßà ! àßà ! àßà ! àßàÇÈÇ98962ÿÊΕÌük4•Ìük4•Ìü989 ! ÐÍŸ03aÎ4aÌÌÑfÎ2ÌŸÎ4aÌÌÑš2•üfÎ66fÎ66fÎ66˜ü™d3ÿýÍéi—ÿg6662š66262ÿÊÎ62ÿÊÎ62ÿÊÎj ! !—›ßießie!—›ßie!—›Ø–,µÑKÿ/Kÿ/µÑKÿ/µÑKÿ/ŸJaÿ¶aÿ¶ŸJaÿ¶ŸJ9eº ! àßààßà ! àßà ! 989ÿÊÎÑ4Ò2Ñ4Ò2Ñ4Ò/Ì.989 ! ‰ŒºÐÍŸ03aÌÌÑfÎ2ÌŸÎ4aÌÌÑhigÿ—•fikš—•fg3ÿ™Íš2èfΚ2èfΚ2èfΚ2èfΊ5vþŠuÏþþ0—ÐiÏ0ÿ1ýÏËþ5ËþfÐþ0—Ðiþ0—fi/Ì.YYYàßàÇÈÇÑ4Òš23šÍ1ýÏ1ýÏ1ýÏ1ý™fgš™fgš™fgš™f‰ñ!àßàf0úºñ&àßàf0úºñ&§§§ÑÏÒÿþÍÿikš—•fikš—•fikš—•fikš—•fg3aš.ŸfÒ3ÿèfΚ2èfΚ2èfΚ2èfÎ3ýÿ—eÏ/˜Ði/ÍÿÑ3þ0—Ði–ˆ%‡àßà˜ü™ÿh-˜Óš2fΚ2fΚ2dšÊÏ1ýÏ1ýÏ1ýÏ2šggš™fgš™fgš™fMŸÊo IDATgšiigÓ×-=iÓ×-=iÇÈÇŸþÒa.ììì€ÿÑÏÒ—•fikš—•f—•fikš—•faš.aš.ŸfÒèfΚ2èfΚ2èfΚ2èfΚ2èfΉŒºwtFŠvþÐiþ0—Ï1ýËþ5Ðiþ0—ÿ6/ÍÐ3aš.ŸfÒàßàÇÈÇ989ÿh-Ìþÿh-˜Óš2fΚ2Ï1ýÏ1ýÏ1ýÏ1ýgš™fgš™fgš™fgš™fÐÄÒÏ<.1ÄÒÏ<.1f0úmÃÄÒÏ<.1 ! àßàÐÍŸ™œÊÐÏÐÇÈÇŸþÒŸþÒa.ÜÛÜááâ/0.ikš—•f—•f‰Œºàßà—•fŸfÒaš.ŸfÒš2èfΚ2èfΚ2èfΚ2èfΉŒºàßà‰ŒºwtFvþþ0—1ý5ÿ6›^e¢/ÍÿÑ3aš.aš.ŸfÒ989˜Óÿh-˜ÓfΚ2fΚ2š21ýÏ1ýÏ1ýÏ1ýÏ2™fgš™fgš™fgš™fgšig<.1<.1šÐàßà™œÊŸþÒa.–6cÌËÜÛÜÑÐÒ/0.ikš—•fikš‰Œºàßàikšaš.aš.9f9fèfΚ2èfΚ2èfΚ2èfΚ2‰Œºàßà—•fàßà3ŠŠŠŠŠŠÐiÐiÐiÐiÐiÐiÏÏÏÏÏÏËþËþËþËþËþËþþ0—ýÊþ0—ŸfÒŸfÒÇÈÇÇÈÇÇÈÇ ! ÇÈÇÇÈÇÇÈǘÓÿ›š2fΚ2Ï1ýÏ1ýÏ1ýÏ1ýgš™fgš™fgš™fgš™f ! ÄÒÏÄÒÏÄÒÏÄÒÏ ! ! <.1<.1 ! ! ikšŸþÒŸþÒΙtÂ+„ IDAT—•fikš—•fikš—•fikš—•fikš—•fikšikš–aš.ŸfÒœ32èfΚ2èfΚ2èfΚ2èfÎwtF‰Œº3ÿýÍ3vþý0—þ0—1ý1ý5Ði/Íe¢ÿÑ39fŸœdYYYàßààßà989ÑüÒÿ›ºÿ›efΚ2fÎþýÏ1ýÏ1ýÏ1ýÏ2™fgš™fgš™fgš™fgšàig<.1<.1àßà-=iàßÐÏЖ6cËÌË3.ËË—•fikš—•f—•fikš—•f˜˜™hhg˜˜™üš2fÎfÎdèfΚ2èfΚ2èfΚ2èfΚ2èfÎàßàÿýÍŠvþÐiþ0—Ï1ýËþ5ÿÑ3þ0—ÿ6ÿÑ3þ0—ifÎdàßàÇÈÇ989eÿ›eš2š2fΚ2Ï1ýÏ1ýÏ1ýÏ1ýgš™fgš™fgš™fgš™fГmcºñ&àßàf0úºñ&àßàÐÏЧ¨¦ !Ι2gcÿþÍÿikš—•f3ÿýÍg3š2fœÎd3ÿèfΚ2èfΚ2èfΚ2èfÎ3ýÿ—eÏ/˜Ðiþ0—Ði–hg˜ü™š2dšÊÏ1ýÏ1ýÏ1ýÏ2šggš™fgš™fgš™fgšiigÇÈÇ989§¨¦ !ÜÛÜááâ/0.3ù¦' IDATÑÏÒ/1.ÿ989ÇÈÇÑ4Ò/Ì.ZÏÔ¦1,ZÏÔ¦1,ZÏÔ¦1,ѽÖ/C*çÏÑ1/Ÿh3a˜Í989ÇÈÇÐÍŸ03aÐÏÒ01.iÎÏ—21ÐÎÓ02-ÐÍŸ03ak4•Ìü úÑ`/ZÏÔ¦1,ZÏÔ¦1,ZÏÔ¦1,ÑÏÒ989 ! 989YYYYYY¦1,ZÏÔvþZÏÔ¦1,ѽÖ›üѽÖçÏÑêŒçÏÑŸh3ÌÌÑŸh3989˜˜™989ÐÍŸº½ëÐÍŸÐÏÒŠÐÏÒiÎÏ™iÎÏÐÎÓÿÐÿÐÎÓÐÍŸ4ÐÍŸk4ÿÊÎk4 úÑÍÕ˜ úѦ1,ZÏÔvþZÏÔ¦1,ZÏÔ989 ! àßà ! 989YYYYYYègÑZÏÔvþvþ/C*/C*1/1/a˜Ía˜ÍÇÈÇÇÈÇ03a03a01.01.—21—2102-02-03a03a•Ìü•Ìü`/`/ZÏÔvþvþ¦1,½p§ IDATàßà ! àßàˆ%‡hghg§§§§§§™/ègÑZÏÔvþÿÏ01.¦1,ZÏÔvþÿÏZÏÔ/1.ÿ989˜˜™/0.Ñ4Òˆ%‡àßà˜ü™/Ì.YYY§§§YYY§§§ègÑ™/ZÏÔvþÿÏ1Ц1,ZÏÔ¦1,ѽÖ/C*çÏÑ1/Ÿh3a˜Í989ÇÈÇÐÍŸ03aÐÏÒ01.iÎÏ—21ÐÎÓ02-ÐÍŸ03ak4•Ìü úÑ`/ZÏÔvþÿÏ1Ц1,ÑÏÒÇÈÇ989˜˜™/0.hgàßàhgÇÇÐÍŸ03aÐÍŸÐé6Ñÿ0Î03avþÿÏ1ÿÏv1þÏÔ¦1,¦1,›üêŒÌÌј˜™/0.º½ëŠ™ÿÐÿ4-ÿÊÎ.ÍÕ˜1vþÿÏ/ÍÿÏ31vþŠ*6ì© IDAT€ÿÇÈÇÇÈÇÇÈÇ/0.˜˜™˜˜™˜˜™˜˜™ÐÍŸº½ëº½ëº½ëº½ëÐÍŸÐÍŸ222ÐÍŸ1ÿÏvþZÏÔûxufœÎGFHŠwþéi2ÿgÒdi/Íd˜˜™d03aÐÍŸ03aÐÍŸwtÎþ03aÐÿÏÿÏ1vþÏÔ¦1,›üûxêŒuÌÌÑfœÎ˜˜™º½ëGFHwþ™éiÿÐÿ24ÿÿÊÎgÒÍÕ˜di/Í/ÍÿÏ31vþ¦ÿÿêy‡êy‡˜ÿh˜PÌ005ÑÐË/05Ñ€ÿÿÿh˜ÿhšÔþß,!Ôþß/1¶ÑÏÒtë±ì IDATêyêy‡‡˜˜ÿhÿh05Ñ05ÑÐË/ÐË/ÿhÿh˜˜ÔþßÔþß,!,!êy‡‡˜ÿhÿh™05ÑÐË/ÐË/ÿh˜˜hÔþß,!,!‡êyêy‡ÿh˜˜ÿhÐË/05Ñ05ÑÐË/˜ÿhÿh˜,!ÔþßÔþß,!½a>… IDAT‡‡êyêyÿhÿh˜˜ÐË/ÐË/05Ñ05ј˜ÿhÿh,!,!ÔþßÔþßêyêy‡‡˜˜ÿhÿh05Ñ05ÑÐË/ÐË/ÿhÿh˜˜ÔþßÔþß,!,!êy‡‡˜ÿhÿh™05ÑÐË/ÐË/ÿh˜˜hÔþß,!,!Ø€›ù IDAT‡êyêy‡ÿh˜˜ÿhÐË/05Ñ05ÑÐË/˜ÿhÿh˜,!ÔþßÔþß,!ÿ‰ÿvþŠwþš.œeÑd›/œfÒdš.œfÒd‰ÿvþŠwþhhg¯/˜QÑh˜˜™hhg2üË44/ÌÌÑî%Uàßà˜˜™šd244/ÌÌÑÊjfÒdšd2e™›3š.œeÑdþÍ3š.œeÏ13ÿx˜‡ç7/ÍÿÑ32hhg¯/˜èfÎ3hhg ! wvyš.œî[ë¥fÒd‰ÿ/šïÑfwþ‰ÿvþŠwþš.œeÑd›/œfÒdš.œfÒdÿx˜‡éhyˆ—ÿéi—ÿéi—ÿéiÿxˆÿxˆš.œÎ:Ë ! xwyÿx‰ŠuÏþ2š.œfÒdÿxˆš.œfÒdš.œfÒdš.œfÒdˆ‰‡§§§ÑÏÒ‰ÿvþŠÿŠ…v{vþÿ/šeÑd›/œeÏ1›1ÏeÑd/œfÒdš.œfÒdÿýÍ3š.œfÒd‰ÿE™_Ï»g¡vþÿßie¯/˜QÑhf0úšÐ¯/˜hh2üË40úÌÌFÚÌüÑhhg2üË44/ÌÌÑ4jÅšÌ2fœÎšd2fœÎe™šd2fœÎš.œeÑd›/œeš.œfÒdš.œfÒdeÍÿx˜‡éhyÏhhg¯/˜QÑhfhhg ! àßàhhg2Æ54jÅ2hŸÎ˜aÎa»g¡e0fœdše2‰›Ðvþiig ! àßà——™ÿ/šeÑdþ͉Œºàßà——d/œfÒdš.œî[ëàßàšœfÒdÿxþψ1˜‡ç7ˆÉÿéhy˜‡—ÿéhy˜‡—ÿéhy˜‡—ÿéhyˆÿxÿxˆÿxÿxˆš.œfÒdh:gxwyš.œfÒdÿxˆÿ2ÿxˆš.œfÒdÿÿŠvþ/œfÒdÿxˆþÎ/ÍÿÑ31xˆÌdšÒš.œfÒdš.œfÒdš.œfÒdš.œfÒdš.œfÒdˆ‰‡xwyšd2•Ìü6#¡r IDAT€ÿFÚî[뉌ºî[ë31gŸ1el»g¡E™_f0ú·b2üË2üËf0ú·b44/ºñ&šÐ44/44/Ì–;2hŸ44/î[뉊‡î[ëî[눉‡ˆŠqòˆˆŠrh——™——™¥2Æ5ºñ&ΘaΘaÌ–;wþÊjšd2šd2ï›Ðwþiig ! ! iigþ͉Œº ! iigî[ëàßàÎ:ËÐÊa‰Šþψ‰ŠþψrhÐÊa‰Šÿˆÿˆˆeˆaÿ¶aÿ¶ˆhiˆŠˆ‰ÿÿÿÿÿ‰ÿÿÿÿÿhhg ! ˆ‰‡‰ÿuÏþþÎf.hj1hj1hj1ÿýÍ6–Θašd2ejÿþdÿ˜+šd2vþÏvþwvy‰Š‡wvyš.œÑdš.œvþgŸ™agŸ1elš23·b}3ÍÿèfÎkš1elºŒº ! 1eFkš1elÌ–Ïš.œ1e1hŸˆ‰‡îˆ‰UÛ«î%U‰Œº%UÎeÑd‰Š‡‰Œº[Òˆ‰‡š.œî[뉌ºˆ‰‡˜‡Š»»º‡!—{e0ÿjΗ1™˜ÿ!ie2Æ5d dœ`œî[ëvEy›ü2–f™œÆ5FÚΘaïÑf60šd2ï›Ð——™Šwvy‰Š‡2Æ5Î:ËÌÌÑE™_ŸuÏþE™_ÌÌÑ3E™_ÿ6Ÿ2ÿ›ÿjÒŸ ! wtFxwyE™_ÿ6Ÿ2Ž˜ývfÎ3Î:Ë ! àßà ! àßà[Ò‰ŠuÏþ‹1uÏþ‹1þψ2ÿÿŠeÑdfþÎ/Íþψ2š.œš.œˆ‰‡Û«î%U̧ŠŠŠ›/œ›/œ›/œfÒdfÒdfÒdŠŠikšèfÎQÑhQÑhèfΚ2ikšwtFwtF‰Œº3eÏ1eÏ1›1ÏfœÎxwyÛ«›/œ›/œ¥¥fÒdxwyxwyéhyéhyxvñxvñe0ï›Ð11ÿÏQÑhfÑÜ1ÿ1ÿfÑÜàßàjšgdjÎjšg4jʼnÿŠŠŠŠ3¥›/œ›/œ¥——™¥˜˜™fÒdfÒd˜˜™2Æ5}3Í2g1x1x1xIÿžf›F·b06Ÿ2ÐÊaþÎéièhÿÏ21þÎéiqòˆwtF3‰ŒºÿýÍéiΙé06Ÿ2ÐÊaþΈ˜‡èfÎ3š2ÿý͈vþÿÑ3šd244/ÌÌÑfÒdfÒdÿ˜+f9šÇfÒdfÒdÛ«Û«Û«fœÎ§UQ IDATš2—•f—•fikš›gee™›e™››ge›gee™›e™››gexwyxwyxwy¥¥wvy¥xwy¥xvñxvñxï›ÐŽ˜ýiigiig1Ž˜ýrŠˆRihŠ»‡4jÅe0e0‰ÿIÿžÐÊaþÎ06Ÿ2—ÿ˜ÿ1þÎÿÏ2—ÿx‰ŒºÿýÍwtF3—ÿ2gÐÊaþÎ06Ÿ2ÿxéhyš2ÿýÍèfÎ3ÿx2Æ5xwy˜˜™¥wv2wþ1xšÒ˜–Ϙ–Ϙ–Ï44/ΘaΘa6–f9ÿþdÿþdejšd244/44/fœÎØÿ,EšØÿ,(ÔþÎ1þÎ2E™_»g¡1ikš—•l›ge5î%UÏ›”1elÏ›”Î5 ÊjÏ›”1elÏ›”fœÎš.Û«wvy›/œxwyxyßieiighiïhiïe›Îfe›ÎŠ2gxx1xvñxv«x2hŸéiihhg ! ˆ‰‡¥‰ÿuÏþþÎ1ÿÿþŠvþ›/œÒd2þÎ3/ÍÿÑ31xˆš.œeÏ12hŸš.œdœš.œdšÐf0úžÒÒžgeÑdÑœ`œ/`š.Ï™a›”E™_1gŸ1¯/˜¯š3ͺñ&ºŒº& !Ì–;Ì–Ï;š.;šd2eÑdš.œ˜‡¯/˜ ! Ì–;î[눉‡ºñ¥wŸ.œšÊ›/wÒd‰ÿvþeÑdš.œ˜‡˜‡˜‡˜‡ÿxÿxÿÿvþeÑdfþÎÿÑ3þψ2›1Ï44/Î4/5Ü¡fŒdf9ÿf9šÇhdfœÎšdÌÌî%Uˆ‰Uÿ‰ÿvþŠwþÿxš/$fÑ܈þÎ2ª™?Z IDATþÎ2š.œfÒdš.œfÒdÿÿêy‡êš.œfÒdÿÿêš.œfÒdš.œfÒdšd2fœÎš.œfÒdš.œfÒdšd2fœÎš.œfÒdš.œfÒdhhg˜˜™š.œfÒdš.œfÒd™.gÒš.œfÒd‰ÿvþŠwþ‰ÿe0ï›ÐwþΘa06ŸÐÊa2hŸÿÿ˜ÿhêÿÿêš.œfÒd‰ÿ/šd dœ`œïÑfwþÿÿ˜èfΚ2ÿhꈉ‡Û«44/ÌÌÑî%Uxwy/0.Ñ4Ò/Ì.ÑÐÒˆ‰‡xwyˆ‰‡xwyhhg˜˜™hhg˜˜™ÿý͉ŒºwtF3ÿx˜‡éhyˆš.œfÒd™.62ÿÊÎgÒ/0.YYY§§§YYY§§§ÑÐÒt'Zû–ÑØ4ýŒþ/0.ÑÏÒ‰ÿvþ›e2v›Îÿwvš/$6–šjfÑxþψ2šd22ÎþΜ`œfÒdšd2fœdš.œ|Ñcêyšeºf›ÿÿ„/eÏ1}šÿÿh—ÿ|hš/eÏ14›aÌÌÑΘaÌÌ–šœeÏ1dÑΜ–2þΜ––šœeÏ1àßàˆ‰‡ÎßËšœeÏ1eÑš/ÿÿšdš.œïÑfvþŠe0e™›ÿÑ3–0‰›Ðe0ï›Ðwv˜‡ÿhêy‰ÿŠE™_06ŸÐÊa2ÌŸÿ™ÍbaŸ–ŸÎ˜aHgž˜ÿh„/d d/Í›—Ï|Ñÿêÿÿêšd2e™›ÿÑ3œ–2fœÎïÑfwþš.œfÒd‰ÿ/šïÑfïÑf/š‰Ñfý˜ÿhfÿh˜hÿrŠˆÛ«î%UÚî%UÛ«ˆ‰‡§§§Ñ4Ò/Ì.ÏžÒ–Ò/.YYYxwyˆ‰‡vEy2yˆ‰‡xwyhhg˜˜™hhg˜˜™hhg˜˜™hhg˜˜™‰Œº‰Œºÿx˜‡ƒÍ3}˜Íéhˆš.œ6–šœfÒd62ÿÊÎ62ÿÊÎ/0.YYY§§§YYYÙu§ŸfÒˆ%‡týŒþZýŒþtýŒþþÍî%Uî%UþÍeÏ1î%Uî%UeÏ1ÿýÍî%Uî%UÿýÍÿýÍî%Uî%UÿýÍÿþUî%Uî%UÿþUÿh˜ÌÌÑ44/œ–2djÎàßà ! š/fÑf›Fš21ÿf›FeˆJg/êeeˆ™Êš2µÑ›xfÒdŠ»‡ikšfÒdï›Ð3ÐÊaï›Ð‰ÿvþvþvþÿýÍuÏþd duÏþuÏþd duÏþéþÎèfÎéþÎéþÎèfÎéþÎFÚ44/FÚFÚ44/FÚþjþÎwtFwtFwtFwtFwtFwtFèfÎî%Uî%UèfÎd dî%Uî%Ud dÐÍŸŸh3¶™Ñaš.š2š2*Îý'Zû*Îýÿj/*Îý'Zû+dÎ3wþÍF3›1ÏwÏFF›1Ï3ÿýÍF3þÎ3ÿýÍF3š.œ«ÿþUF«2˜ÿh˜44/ÌÌÑ44/djΜ–2djÎ ! àßà ! X¸• IDATfÑš/fÑwv˜‡ÿhêyÿˆŠweþaš.ŸfÒš2ïÐË–Ÿœƒ—fÜþψÐÊaꈉ‡àßà˜˜™—ÿÿh‰ÿvþÏ™a»g¡ý2˜ÿhéþÎ2˜ÿhrŠ&Û«î%UFÚºñ&Û«î%UÍÑ4Òþj/ÍÿÑ3xwyþÎ/ÍÿÑ3hhghhg‰Œºš2ètFš2«œ`œv dEΜ`œd62ÐÍŸÏ›”1elŸ”ºñ¶™Ñaš/ffΈUÖ2týŒþ*Îý–ÑÕœ2týœþ/0.š2èfÎ3þÍbažÿŸ‰ŒºwtFÿÑ3/͘44/djÎ ! fÑ‹1/šd dœ`œïÑf˜˜Û«4/Û«/Ì.ÏžÒ/͈‰‡vEy/͘˜™hhg˜˜™hhgwtF‰ŒºwtFxv«ÿÑ3/Í/ÍÿÑ3ÿÊÎ62v{vy1gŸ11‰Š‡Jg/¶™Ñ¶™ÑƒÍ3ttþÍš2š2þÍeÏ133eÏ1ÿýÍbabaÿýÍÿý͉Œº‰ŒºÿýÍÿþUÿÑ3ÿÑ3ÿþUÿhÌÌÑœ–2àßàš/x˜‡ÿhêy‰ŠfÎaš.ŸfÒ‰››`œfÑÜΙééiˆ‰‡àßà˜˜™ÿÿsvþÏ™a»g¡wþwþŠŠŠïÑfïÑfÿhÿhî%Uî%UÐÊaÿÑ3–ÐÊaÿÑ32þÎþΈ‰‡ˆ‰‡‰Œº‰Œº‰ŒºwtFwtF‰Œº‰Œº‰ŒºèfÎÿÑ3ÿÑ3èfÎd d/Í/Íd d5ja5jaÿЅЉЇ9fƒÍ3}3ÍÇšüýŒþýŒþvþËš2ÿh2vþËÿþU3ŠŠ5ÿþU/ÍbaŸfÒg3/ÍeÏ1‰ŒºàßàikšeÏ1éþÎÿÑ3‹1Š5éþΘÿh44/ÌÌÑdjΜ–2 ! àßàfÑš/š.œvþËvþËvþË ùÁÒ IDATœ–203aœ–2g322xwyxwywtFwtFwtFwtFÿþUÿÑ3‹1Š€ÿ5ÿþUþÎ/͉ŒºŠ»‡þÎË–ŸË–Ÿ¦1,01.01.01.ÇšüJg/aš.Š5èþˉŒºwtF‰òºàÑà—þfŠ5wvÿþ͉ŒºwtFÿŒºißà—•f«þψž/͉ŒºwtF'%ºàjàÿ™ŸÿÑ3œ`œwÏF‰ŒºwtF‰Œºàßà—•f›1Ï|Ñcéþ͉ŒºwtFÿŠºjšà—þf2„/Ï3ÿÿéiœ3šd22hŸš.3šd22Κ.3hhgxwyš.53™.Òš.ÿˆhˆš2f92ee dd—ÿ/—˜ýgžÿ›1Ï/šd/š˜˜Û«4/Û«Î4aÌÑÌÌÑfÎ4ΘaÌÌ«ÌfœÎhhghhg‰Œº«ÿþ͉ŒºwtFÿŠºjšà—þf«þÎ3ÐÊa06ŸFaŠ{vÏþ2™.62YYYî%U'‹'ˆ‹Yttÿ‰ÿvþŠwþš.œeÑd›/œfÒdš.œfÒdÿx˜‡éhyˆhhg¯/˜QÑh˜˜™hhg ! àßà˜˜™/0.ÑÏÒ‰ÿvþŠvþÿ/šeÑd›/œeÑd/œfÒdš.œfÒdš.œfÒdÿx˜‡éhy˜‡éhhiï¯/˜QÑh¯/˜hh ! àßà ! hhgÇÈÇÑ)ì IDATvþeÑdš.œ˜‡¯/˜ ! Švþ›/œeÑdfÒdš.œéhy˜‡QÑh¯/˜àßà ! `{£á IDATvþeÑdš.œ˜‡¯/˜ ! ~/D IDAT=·O IDAT€ÿn ÀÁ IDATªÿºE­ IDATªÿ›ÿÿªÿuÿ›ÿÿªÿÿþÍÿÿxÿ˜ÿÿÿÿ ÿˆŠ‡ÿàßà ! {ë{ý5þh¿g˜˜™ÿ‰ÿcàg ! àßà ™ûxÿˆŠ‡ÿàßà ! wtF@ñï󈊇ÿàßà ! àßà˜˜™ÿˆŠ‡ÿàßà2üËfœÎhhg˜˜™ÿˆŠ‡ÿàßà——™ÿÏ1 ñðóÿIÐù IDATàßààßàý5þ›Ucàg˜ì›}ÿy ™˜ì›càgàßàFªÏ›d›geàßàwtF˜˜™àßààßà——™ÿÏ1 YXZˆŠ‡ÿàßà˜A™›UÍjghhg ! ÿxË{4þûÌ4þ˜Ì›hhg ! ÿFªAxÜx@YXZ ! ÿàßà›gehhg ! ÿàßàhhg ! ÿhhg˜—™àßàh¿ge™hàßàhe˜Ì›4þûÌheàßàf0ÊÌÌ‹T%u¨¦YXZàßààßà——™ÿÏ1 YXZÏêí IDAT€ÿhigÿ˜A™h¿g ™càg ™càg§¨¦YXZ–f™œ–2djÎ2hhg–f™œ–2djÎ2hhg˜—™ÿd-ÿÓÿhigÿ˜˜™ÿ/1.ÿÑÏÒþÏÿ1üÿ—ÿÐÊ•ÌÓÿ¹»¸ÿÏÏÏàßà˜˜™/0.Ð1Ò0Ï.ÁÏÒ?1.ÑÏÒÿþÍÿ‰ŒºxvyþÏÿ1ˆŠ‡ÿxvy˜eÿh›˜eÿh›ÿÿÿÿše2ÿf›Îše2ÿf›Îýÿ1ÿÏþÿüÿÿÑÏ`3ÓÌÿ›ÿ9ŠeûÌ«þÿ™ÐÿÐÊ/͘diÍÏËÿ»»¼xvy¹»¸ÿÏÏÏàßà˜˜™ÿhigÿ§¨¦ñïóÊŒÌ IDAT•Ìþk4•Ìþk4àßà ! àßà ! Ð1Òžl”1ÁÏÒ«.6ÐÊ0þÿþÍÿ3ÿþÍÿ3ÿˆŠ‡ÿxwyÿþÏÿ/ÍÿÑ3ˆŠ‡ÿh›˜eÿh›˜eÿh›ÿÿÿÎÐÊ206še2ÿše2ÿf›Îše2ÿf›Îýÿ1ÿþÿüÿÿÑ1 ÿÍ`ÿ3ÓÌÿ›ÿ9Še4þûÿ«þÿ™ÐÿÐÊ/3chœÿdi315ÍÏËÿEEDŠÿxvyÍÏËÿ»»¼àßà˜˜™ÿFښИ˜™ÿhigÿ§¨¦ ÿñïóþk4•Ìþk4•Ì ! àßà ! àßàÐ1Òž22dÒlÏÁÏÒ«.–Ô–Ô6ÿþ6ÐÿþÍÿÿþÍÿýÏaÿΙ1ÿΙ1ÿΙ1ÿ‰Œº;+þd™ÿÿd™ÿÿþÏÿ/ÍˆŠ‡ÿàßàxvyh›g/0ÿg/0ÿh›ÿÿÿ‰‹†še2ÿf›Îše2ÿše2ÿše2ÿf›ÎÿÍ-ÿýÿ1ÿÿÍ-ÿÿÍ-ÿýÿ1ÿÿÑÿÑ9ŠeÐÊ/Ι1ÿÊfEED¹»¸ÿˆŠ‡ÿˆŠ‡ÿhigÿÿÚßàßà˜˜™ÿGEHÛ«˜˜™ÿ§¨¦•Ìþk4•Ìþk4àßà ! àßà ! Îþ2j,–Ôux¦ux¦ýÏaÿýÏaÿ/60/60Ι1ÿ2gÏΙ1ÿ;,þÿÜxÜxd˜ÿÿ`.ÿÑ31ˆŠ‡ÿàßà ! xvyΙ1ÿÿþÍÿÿþÍÿ˜ÏÿþÍÿ˜ÏÿþÍÿΙ1ÿÿÿÿÎÐÊše2ÿše2ÿše2ÿf›Îše2ÿf›Îše2ÿše2ÿ44/3Ó3Óþ2ÏΙ1ÿ2gÏ315FÚàßà˜˜™ÿ315£ª˜˜™ÿþk4•Ìþk4•Ì ! àßà ! àßàèÖxŸ IDAT‹ˆZux¦‹ˆZ1ŸÅÔדÿÄÒÏ›eΚ6œhÿÿ/.ÿ›33ˆŠ‡ÿàßà ! xvyþÑ”º½ëþÑ”º½ëþÑ”º½ëÿÿÿ‰‹†še2ÿ44/44/f›ÎΙaÿΙaÿf›Îše2ÿ44/44/ÌÌÑf›ÎÏýÿ1ÿÏÏÏ`Ï`ûÌûÌ͘͘Ι1ÿ2gÏGEH˜˜™ÿþk4•Ìþk4•Ì ! àßà ! àßà2Îþ–Ôj,‹ˆZ1ŸΙ1ÿΙ1ÿ2gÏÿ/.ÿšÓÒgþ ! xvy¼ìWD©¼ìWD©¼ìWD©ÑÞšÐf0úše2ÿ44/šÐf0úf›ÎšÐf0úÏÏ3ÓÿÍ`ÿ3Ó«þûÿ«þdiœÿdi2gÏ315˜—™higÿ§¨¦ñïóÿd-ÿÿd-ÿÿhigÿhigÿÿ/1.ÿÿbÿÿÿÿÿÿÿÿÿÿÿ›.ÿ/1.ÿðÿ›.ÿ›.ÿ›.ÿ›.ÿ›.ÿe0ÿÿþÍÿÿþÍÿ;,þÿd™ÿÿ;,þÿd™ÿÿd™ÿÿd™ÿÿd™ÿÿÿ™ÿΙ1ÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿÿþÍÿΙ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿše2ÿše2ÿše2ÿΙaÿše2ÿše2ÿΙaÿÿ›-1ÿšdfÿÿše2ÿΙaÿÿ\ý IDATÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿ/0—ÿ üg͉ÿvþÎuÿcŠþЉÿ/šÿhhghigÿ ! ÿÿÿÏÏše2ÿ44/ÿ ügô™vþŠcŠþv/šïÑfhhg˜˜™ ! àßàÿÏ144/ÌÌÑÓºOû IDAT€ÿ ügvþcŠþ/šhhg ! ÿÏ44/ô™ŠvïÑf˜˜™àßà1ÌÌÑ ügô™vþŠcŠþv/šïÑfhhg˜˜™ ! àßàÿÏ144/ÌÌÑù±ÅÕ IDATÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿÿþÍÿÍÏËÿ/1.ÿÑÏÒÿi—ZÏÔ¦1,ÔDÔ,¼,8þ8ÈÈÑÐÒ/0.545ËÌËÐÏÒ01.k4•Ìü ûÐô0Ñ$Ô/Ü,Ú.J IDATÿi üg ügÿiZÏÔvþvþZÏÔÔDÔcŠþcŠþÔDÔ8þ836368þ8ÑÐÒhhghhgÑÐÒ545›™j›™j545ÐÏÒÿÏÿÏÐÏÒk444/44/k4 ûÐŢŢ ûÐÑ$Ô  Ñ$Ô üg ügvþvþcŠþcŠþ3636hhghhg›™j›™jÿÏÿÏ44/44/ŢŢ  ½úÔ™ IDATô™ô™ŠŠvvÍÊÍʘ˜™˜˜™eg–eg–11ÌÌÑÌÌÑ;^ÿ;^ÿýàýà/1.ÿÿi—ZÏÔ¦1,ÔDÔ,¼,8þ8ÈÈÑÐÒ/0.545ËÌËÐÏÒ01.k4•Ìü ûÐô0Ñ$Ô/Ü,ÑÏÒ/1.ÿÑÏÒG’ ° IDAT€ÿ‰ÿΙaÿše2ÿ‰ÿÿðÿýÏaÿÿ™fÿðÿÿCEBÿˆŠ‡ÿdecÿCEBÿÿhigÿ©«¨ÿˆŠ‡ÿhigÿÿhigÿíïëÿ©«¨ÿhigÿÿϘÿÿÿdÿÿÍ-ÿϘÿÿ˜ÿÿÍÿÿÿdÎÿÿ˜ÿÿÿœ—ÿÿ™ÐÿÏ+ÿÿœ—ÿÿ[Q IDAT‰ÿΙaÿše2ÿ‰ÿÿðÿýÏaÿÿ™fÿðÿÿCEBÿˆŠ‡ÿdecÿCEBÿÿhigÿ©«¨ÿˆŠ‡ÿhigÿÿhigÿíïëÿ©«¨ÿhigÿÿϘÿÿÿdÿÿÍ-ÿϘÿÿ˜ÿÿÍÿÿÿdÎÿÿ˜ÿÿÿœ—ÿÿ™ÐÿÏ+ÿÿœ—ÿÿ= £ IDAT‰ÿΙaÿše2ÿ‰ÿÿðÿýÏaÿÿ™fÿðÿÿCEBÿˆŠ‡ÿdecÿCEBÿÿhigÿ©«¨ÿˆŠ‡ÿhigÿÿhigÿíïëÿ©«¨ÿhigÿÿϘÿÿÿdÿÿÍ-ÿϘÿÿ˜ÿÿÍÿÿÿdÎÿÿ˜ÿÿÿœ—ÿÿ™ÐÿÏ+ÿÿœ—ÿÿ¾NQ’ IDAT=·O IDAT€ÿ„¤#û IDAT=·O IDAT=·O IDAT=·O IDAT€ÿ7«ê. IDAT=·O IDAT=·O IDAT=·O IDAT€ÿ:o³@ IDAT=·O IDAT=·O IDAT=·O IDAT€ÿ2dÌ· IDAT=·O IDAT=·O IDAT=·O^IDATçãûÀÖ°ë{›`IEND®B`‚angband-v3.3.2/lib/xtra/graf/32x32.png0000644000175000017500000203370711651552410016555 0ustar chriscchrisc‰PNG  IHDRÀ‚£LÂgAMA± üaPLTE $"033-("1 5%%*!<$9'22!!!%%75'%444Gq)3@/*iDUexf22f3g3Zn2@O#f22f fIG[C)lClO0ffee1CCCBDQMZIOPTTNJVRGVVVL[nY`feYLi[WzGGv\@b]dk`W}g@~cSx{Gfffovvtieukvxukuuu¡0™/?—,,µÕú0Å3ÿ3Ï33ÿ%f™fÿ#eÎM5“f™f ê`i™cgˇ™ ž™3ª ¨2™2(™fÌ3æ2Åÿff›f™fNñ2^Îe–™ ™ø1Í™ÖÞe™™H‰ÇOž×eΙeÕúˆ›™3™2™33ªµ¡9™f“I„X'‡a˜e˜p žx€e.…c:™e2§|¿o?€[AnG†ug†zt™ff“wc‘}­zG®{{ÒØÌ3Í2Ì22õÿ3ÿ3ÿ33Ï!fßeÎe0èffÿff™"™‘6¦™ Иf˜™fÌÖ3›ÍÍÎ2ÿôfšÌfÝ™™‚€iŠ‚{’ƒn”‡|›g§‹w™Ò ™ëf̙͙3Å£4ý™ÿ™3æ­Ì™eÖ¡qݵtÿ™fâ®HÍÍÌÌ3ÿÌÿÌ3ÿæÿÿÿÿ3ÌÿoÿÌfÿÒg………”‰‡™’Š–––‹ž¶¤–ˆ¨š•¿Ÿ‹¨£·©š§§§«¬°²­«°­´·±©µµµ™™Í™ó™™ÕÿŒÿÍ»ÂÔì–Æ·«äššæ™äÌÌ™ÉĹÿΙÿÖ¡ÿü™ÇÇÇÚÚÚÍÍÿÎÿÎÍÿÿÿÍÍÿÿÍæææéôÿÿÿÿ„(btRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS÷% pHYs 6 6ØU‘òtEXtSoftwarePaint.NET v3.5.6Ѓ­ZûuIDATx^ìý}ˆWš' ä%Ø·JžõÝ.ÅÌ[º¶ävkñ­f’‘˜.9wwî{·/³³3yçNª‘qs-£2”p—Œ[H¸PIÂ&i†„„íi³;¡:1ÂK{FÚÞ6U)d„9M^Ð[•;ÃNîìÍ*õN[}…2­Üý'÷÷{žs"ÎWDä‡dIö‰üx?žˆ8ç>k kà>j`SÀŽoqk¤vìx‘[‹|Ž[‹|™[‹ü2·ù-n-òUn-ò!·VŠã>ê>Ÿêë¥b½ÙèÍ–vÉÛµø¼´´¼¼²º²¼¼´´´  ÞRNQ¬®lùÌÅÔEþï½÷ÞÌÌÕ©˜˜:.ÐÿäÉ“'N$帹ý¿üòËÛ·“òWúã?{6!ÿzõ¦¯WkzÃÅå•5Áq½µ•å“;ü ‚Mɨî(­þv»òõLdàëu;>¢­o‡Øµk‡-µ|Yë÷Í»D=¹›Ý5]Ž9Oc%ÚåÝç_ïhþÈZûÛ«´ýéÖ¤íÍŸ¶táóAY_o l†ü#(€¤RÿE -Ÿ›ùÔTƒ|yYä‹‹ òË—Eþþû ò[·D~ölƒ|uUä++ òáPäããmN_ïþ[·u Å •(ŠßmgZ‘ùââ"ñ?2ø´‰sU˜>~ã–YÊ/´SMÒâêÌÌ$6033c€^\=qb60'NOÉoß~€Û·/§ägÏÆàìÙW2°õŽúÕÙ›^¸0±² Ù[YÙ¿iчø½Åti…™=tôóÞÖ´U¾]€ßûýßÎÁ¢\ý€/«ÒwíŠäøªRcoŒFp<¾ªåƒA$ÇWµüïý½HޝjùîÝ‘_Õò}³‘|Öõ˜z+’¿5åÿ ‘_Õç?z4’ã«Z~øp$ÇWµ|8Œäøª–ÏÌDòÛžÀÝH~w[[&9¿ú[ç›SâÈÈp¢¨øœEâ>Ьä++©bXÚTÓøudb5ÁK¿oßM„»ŽŒ, 'Öúã)Cë72r\ߥê?22ƒ=Rrv‚îóc—dómyà/ÖÚË?3²ÐZ¿Ô°­þ ­í«»rŠ([þ¯übye©‰(ЉMÌy¾9÷MniÖÀ–5° @ñ?œüÅÿ”§€‚ÿ)O3;ÿSžfvþ§<ÍìüOyšØ!øŸò4°Cð?å!Íhò'qOtÛ’‹cmZ/nze«W¥ÿ/MUàÒ°«¶µЯù>‹ö]|0¤àÀÁÁ YOaǸŚå·7A\¼H €ÿ|€®ràþãBà/%î¿,þRràþW„ÀߣD(b ¤‹p;vè:þaË·<ºTz0qá—_ (î-¿ýöþýû‡nøâ Ü–õ÷As­ù ð‹¼wölBÿøÒß%_ïý¤·[µ¿|ø‰PÉVÉý¨26¶´<\þbñÏ—þ§å$P¬ ßãFïß¼_ÖÀ×M'vŒÒùŸ£b=ìØEçnŒHÈ÷ÑùŸ&)ùÿ¹ë¤äGéüÏ ó”ü:ÿsƒ—pJ¾Dçn+I`Çÿ¹áþعwýÙEquãððëÖ§ÛSLwضG;ä{Ú2ÛMŒ-¶pÔÅ¡WÝ*^i»,»`d 'í Ñ¿©)Œ–MQö‘íÅõžCtr …ã  €|¾?€%rañYÆ=úoþ ÑÁSW±‰åØÿùç#ü/r±ü¼ìÞá‘‹å7÷Ñ£þ¹Xþ4 ðÿCŸÊVÿ#A­yz êH]êAË;ŽNýûA€ÁâžKo 01QÙÀ{ÿø5vt¾áì’wø.ùiØû± %AÛ?ߟv €—e3rýPñä4t3rû©ºzÝŒÜ~ªå8ƒÍÈõCÅ@ì 6#×ù¬AÐZýPñøJ"ïææÌñöS]þ‡º¹ýTËߗлËF®*>€bs°¹~ð=$¶ÎÈå½çpíÚ<7#Wüï®\Þ×|À懯b €sXoZ¶êþõ?¢}ò Ö €$¹kÏ\^KXùQþnÙªúù!Ð9^Éý¾\á?lÓŒ #ÀŒôÈüÈÝ{ °Nc'^Œ‘ˆÀñ$îÝ#ø € “Ä­fà ízŽÿøüçùáÀODYZ¡q}'fõÑŸ 8tøÅÿg8 $€ Εø=ì]çÚö§š/ËW`ròB‚0õ»`n:ALÏÿ :~tÔÈA¤Ú7L¨Š±%äëcKÿñ?.ÿÙ?û‡ãÿì¿üŸ‡  , ÖŠ¥<­ÝàÓ&ï–5° l‚8~ô­¦¦v¾õÖèh `¿øâ®)Çë®”|nnßÜGûö휚ڷ/%_^žXæñ‹‹)ùåËG/SN„’ߺõÊ-Êi'LÉWW—V)_YYZJɇñ!åããcc,´¿â:[ÀÊ5 ·S7û>Ç´œ·BQ\mãEŠbú¹é–¦(^{úµ&yø/@C¨ø/@c*ÆÆ(Æ'ŠÄÿ££)@ü?7îßà@îË+‹Ø7vmu Þýƒæ>²|¼n––öî=}zïw¾ €s¨ð,Åð?¶„@!ÁÿŒý¿xñùçŸÇS^ €B‚ÿûü8f¯±\‚ÿû›\JŽ—àÆþ¿ò ̯¡¼×À!_ :>;ÏôM;÷?b½sç*û®#ÇgçxÓÀØOöêôZÌ£ÍýÄ@¼÷Þ;Ÿ}fŽÿì³÷Þy§6˜Bž>¼h]ò÷ är‹Ï©×ñ]ìv¢7Þûí!Üþ?ë}¶Ö[T`åO£?ª°Ü[Zî-/õ佺èÖ)? #?6£?}ïøvy¯ÿê46a2øæ¯ðMßV ,{‡^~ó6‘óÍ›Àÿeiªùò2"sáÀoVÁ¸rÌ¢qã O~ä™q„ç›÷€ÿÝã÷yvâ„Ï7'ÿ]ùìµ;bCçÆ7w€ÿ]ùÜœAÐË;°®üÃ9ØWþþesðÊçÆ7_ÿ»ò3Ž|s øß•‡t•ÿw‰àWN@¿°ð3‘/ü ð¿/g«4P`†oÁTò Ls‚å2|] ‹ 鳋vŒo2üÌÎ'‡¹¤ryåñ`?Õý_Ÿ:îÞ‹«œÑ°šß­ŽÙ€½m9½Û ÀŒ(åc ýváî½{wA`‹ €™™Ÿ¾÷A²à`ô0  aö¡ ¼:ÿ(¿qz\PÀf1Ð>8€‘4@Þ÷|+ çm€óÓ˜¿jªù ° ™‘A0¶üÿý/~çŸ<ñÝ‘'þÉïüñ¿ûÅx˜  ü `›©”6ý°Èd |5° ` ÀGM}4Š7çc„L€]”ïÚ…9zB€}}´@Ò`<&xüÄDÒ`<ŽRNaÂ`<^¡\…%ʇÀå˜~¤\è0FùØØCthøÚ‹b ΋©I„Eq÷S•?< =Å9%Ûk=}=uj§¿[Þ«W§ÍëÕ«¡|ú:aÕhO_§§CùÄpñóÅá±Æ|…u1aÀ¾J`´1• ü@<×,ÀÓiy!ð?Lò‘ø&HªHá¿ œgáøNàÿƒE®?$|}c±_–å  7(0\Z™HÅÎ!B öî}óM%”˜p"îú‡ .]":Ÿ‡Äÿÿ[ÿKOtÀÙ+ð?\ÿGrZÿá ø?’Ó¢üÁÿ¡ÜX蚸XðäO'È Ö+ƒ¾RaÔÈí§zNY ïÕ "Nx›¾a€ìM”€ð d¦ðï¼ó™@l @u¬ápÎ;ÿ\ÀZ· ê´oýÜ,îíBoBðÿ°· Žã³Ï–¡ 2¬ @o'¸w{˜ÞË_]iÌè”Àáø/Ÿ’W²÷küœ>÷Wäÿÿ ïä;S~¹Ø;Ìë€ÿoÝp¨·X‹=ææ€‹î ÖX)y:<ù˜80ü[k||àÉáðÞgŸ¸Ð›™D÷üLœqê â3€‡§N ØãÉápç8€Þ,ð?Þ‘p'þ¿{¨ùð?ßÌÏ9òOzÄÿ"_²ò{Ÿ8ícb޵50Gÿ×ÖÀ¼ïŸ‰9ÖÖÀ\³¶6à°'bÐÅð»„ö/aƽ0ôäÀÿŠú'P>©€ŸÝòå@ÿÌ0‚õ˜dÀ|-ßôô¬Xõ<p§â‰«.† ¡»„KÍÍQgµü®K ð¦€yôîÂü´y›sž.¦zÅ< €ÔðƒûõGؤ|¾á¥®ûgŸ.D6À­°¿¸ àá¬oz‹Þóã‘–Ÿwl,Ì“þÈÜÈw¸{°2"&h!hÁŽ€……™™?þxa!M(€†W˜ðþ`]=?X9¿GŒŒÃ!Fp%h?G(€G üÈü|ì{~aaòâ…7r~ˆJÐ <ÿÊ©æ?òÀØ\þ÷ñß|÷‰‘'°ýÆÿø/þüŸ| ø&È^›~äå²’Ø ðÖG}´cþHV IX9€„ös~0 9ìÿF !‡ýßÈÁ$ +ÃþoŽðp\ŠâWŸ·PH^©âKIä¿^|ú)^®ÂÊ-ÿ¢ÍÎèÖ×ëwîN]rì €9›>ØÎs>O=ž{¯½vê5l$øúÚž€˜ž¾*°Œ,€@ýP~Ã*`Ág°¶óóµ äÿSà?ýä­ ð@”mwø ê®ÔÌØ¸þ`€¢@„‘ý®þtH]@`{Z‘¤u>P,ÿóÇÀ ]€ÿÀÿð^!à—€~Ç—.]÷Es­çP›Àúÿæ¹s  À!Šú?Šß£"ßÅÿ\àâó¥h¯|q8y’sØã»U{¾\ñ?W€—OB®øŸÄ)”èxAøw.åk@_s~¹ѽšð±I÷sT¾êÈW=yïºåu .–€?y7oµ@ÌÀ¼÷,Ñj‚À|giéÎrË»÷B%¹‡»/uúZ>×{oiéÓOÉðüòî½ÞœðZ×°²€ØøÆ‰è–&¦„JÿðüÿÎò2€ååw`‡À¢M×þ‡EV h¦¸Âg]²"ºäçzçà¿ @ÿÅçNã›s€o›ö÷ú¿?Öû+4ì4ôßÃç±ßï÷¥ åx¹, ~Hðøß×rÉι*_ÿ}9üà+ð¿/'€²ˆÆ…@.©3O ÀWàÿx2ø!ÀWà_®Jˆ€#ÿ°¼) å$¸}Ø»Y~è´ORs~)_ÿýóÓA?$øzö•@N?$ø üïOôO·ÿ‰žDÀÁß—k~Ñ·@¼¥‰FkyòaÞúeá{ô€ÛI;PR8ÞÍá[s’rŽò»Â›P.ïð3öæÖFﮂWü¯íóv`$ü€@€ råz'€ùO‘ ü—w'z?²çïêáщoé$€?ywßÚúl‚ Êjo¹÷Ãþ°·¼Úƒ H©êþ®åè[­rÞ×mÇóØ&§—L›Ã{,>Vxåbîè.`mdt­o €µ~L¸sû˜ø„ÀÊÈJc;KŸ?X‡^ €‘‘åed"Ò÷LüŒYà"_âá?ÊoœË,R@ñÉRÁ#I`¸f ž€Çï <ÿ €‹ˆ“x< €¥?ÿwÿdä‰'¿ÿ¾ÿƒïÿûßý¿øó‰ä™Šè·¬¬û Moÿ“Àô7í`ä»R1;à`äûR1ô0r<ê’Àe#I·Œx!í`ä˜' €¡‘Ã㵉h·ÐÓòÙþpj•¿ú€_ýªáŒ(pÀàž˜wý?½{÷&üܯNË_Ô;ÊAIËB9Lør´’O'A>…wú/yŠäæáóÏÁDeø ì7¯§"@qÿ(¾^Åý;{ú:;w~¾“€¼âX’"$$ Àו0€´\ HèL&öà§é íPúÝWøƒ$tˆå@÷ÿ@ùôdî[Ü9…È™©ƒôýÿÆø1ÅÊâ×elel¬ÜÑÇ@é^ —þ ð? r0Aç• œ\w¾„ÿˆt ·M0:}KéË`hÅ:~<%GD1† Ñgܳ Dƒ kÏ+É$ Iî€å= £¹3ôfoÆn¯T»¢{<å8F ˆóy¯/ž)×ïà‡€¼Nã”@öúýáA>@à!a””! ÀgKwD|ï–Þé}öö;‹wÒ.!‚Ó/ï²u/Î`?<¿¼”{7v~|ÀØIàOÞyK»'ùšX\z{bX¾ýÎ;L–¿üÎ;o—ð±Z¬¾˜ÿK,ˆÀæ–âPíò^ÿìXï x0ð_ÀÑ;küÞòVB~˶×g¬ßû+v;ýë¿êá;cbí•Ëå ^¦ ñÿßjU€ˆ`à\@€ºÿ‡rMpÈ_ß…r0t8AâÿP®iôfüõ](W ÷µ9eæ<ùÍR}€ÿQÅÿŸ”7½ö Àût þÏOvøçç›W"9:(Ð~¾Frƒÿ‘RDrÂà„¼E À‘óD”dÛ(Lüïäèõa¯'€|yëMÏÙþ3]Î €Êåu®7_:ƒdontô.Æ%óŠO€áG ð+W/O €òz¢w ßkÿêß- ~HÈëñÞîã¶~‹%hõ_î=ûì³ø'€ÅÞji@¼Vrðn­r&ªh;;­ò—^z©U.BP?4±›˜6ÈØäЯ€~‚:†ùŸ[’X@’ð¤ø§±‘0€ïæPü/¸Ÿ;Êðá#tH°ÏâçñšÎ0rC+åà¹x÷Ó€ükÀ û¿ð'#%0¶ü׿ü‡O|÷ÉüàýÛ?øþÿá—᾵Ä\€í«-ÝX”O‘5ðÍÐÀæÉ€&@²~´ëP Y?Ú—L@@²~4‘LÀÉøf! €düè•d€0¼IÀ8O’ð#rX›'°=¶É—Öšå€þŸ#p,yÅÿËçá1€ð)Ý€p‰ÿÓÀ d2–ÅSìD÷.GGñ;:}µ¼š"ý?ÿ|9û—wþr6I . âÿˆÂË?Y›P€=¡kL³ª  =8¦2 [#ðÖ×€ºþcöbBá½h€’±þpÝÄþ¯$@,êû¿’±|lbq€ÿ\ Ð/RÞú]üüçr¡ìÆÔsbä'ÒPíQ,-Á1€€K€Ð XÀú_Ž!=ÑŽ10›#†$Ô@c@ÔnÅÑ£ããÿ¦ðÿ:B@HÀL3 q'𠉏ÝLHÀÙtÅ÷¬r8 ¯)@÷åDø /À—×`/ Á4œ _ 䣠‚z@èá; a R¼ LurW ,äòúÎg wØ®å]TÁ釸ÖÔ§ß|zHÀ)þ=œÿͧ]Û|~©#üWÿÓ " \þ†µ@}µáý„» b z%‹:àÉÑrì[3µà!”+€§Õ¿ðç¾ðü­ò\$?]Þ²ú=Ýÿµyú÷_°÷÷õD¿î›,pÅX,'÷÷^<£¢:ð­ÑŸÊ•€‘[ÞÄr%Æ•HÈ= !Wठ¹G$äJÌ+àÉ?)?)?Ô¯Yyó!¾ûÄkŸ—•Hœ_ œ_ÞÄíWí—7±üÖ-žviüûcùä[çÏ÷fægzçÏ¿5éÊ…XõŸwþÇðY‹‰†³;úÏ4‚Œ „¾ ü½?æÕ@cåså¼é?rH 0WgÔ²áÿ¯Jx•í•§J{zþ«¶=°¶öû»`Òè v×õÖ'p þꯞ•ü= þ妸4ʧAÁ7Ê€€ @£œì>\|9õ ðƒôáòÈw¤‘›G 9Ã'rt„`€BAº4{‹H’·\$<$`d•€U$pC) Ä—,MР™˜” Þi#p~ñÆ €%%fFG€±•þ;ßý.ž|òÉOþÆ“ßùîÿ<áçD Àµ ü|K à›Ïr+³¬6Lp€Q!Ò9˜à¨étØ'@:€¤ @RÎ )„Hç þ_ @RМ àø…MOŸ‚ðÿå˜ú¬9ÀÊ¿´Äÿ¿"pìX’@ÍÿÈçžZ¾  Íÿd(šð?ýÀai£\Ìüc+§¯ÎŒGrÿ°1ßÁß_ÎâmØ1¿Àü’Â:”Ð7`ü®Å€ÕŽçw$DHWù@ó…!À(´rG½©þqaß3a)àéa & ‘ °cpø³ù‡`üÇ&‰@øõG§ÙùÜsωq¾Ë )?|vî´ì€®d-T®ŒõK ÿþŠ÷Ðî°^ —– @#üÿ‡ô8­€é-€ç‹çI̧–çCÀžÝÅnú¤åð8ZàÿrZ€C Pà”sð wª¼'Qˆ.>7“N òàU9è>®¼w§Gc  ‘üV*Ñ_ìkú3‚lâY}©¿¨y» Àì‰ ¸È÷f÷‡Ó?ÜH»w!œÀ;ý¾«êÓs¨=álñåÜÓ>€m<¿6BBÔ€!¡‡sD@xúg{÷¿ý΢äX|çíýøþR‚éÿùâ@+»W@ ¸ôÂéþ9ðgÀŸU®ðçÊs%¿så§ñ‰èííïíá__ãÆUù­† )Ëq8œ€Þ8¾q=(8óMJ.p0”‹ÿñ&u¼8œ€¤\èü7©ãÅ`^\ùM´† €©¿àÿÒó`ûÄ7*ߤÎ/0éú¿ü‚ À[Þñ°ñ‹WÞ´¾ Xo¡¿ —Ÿ«%`ã·zýçʹ’÷´+ŸÆwsEEàÏGƒ!b`º€oz©áëÿ£ þ„ À\ÇñÝLù§ú§¤FäHÿpß^ßjý–Ñy÷~XÈßNà;.ºéÉß+ä§QNÿ5ü4ÊÉŒã§Q~¤ŸF9™würÖËòu°ÀÏÏ  «l„xO=>^ˆ’.Ñ @¬Ý@Àþä Àö[ `¸ 1ü?×à$=n,¸«¨€Â~K “(h…IQàå@|Äs à_ü“'G~ðG?øGO<1"nOü‡_Lüï½ €bð­¥oa“D 2ÌpòǬ-h`WP@dAßÀK€ˆåü·(€XN'C€ˆåü·(€XNë !@Ärþ[@,Gà¿%@¤B€‰£u«v ¸é$v¤ŸN0å® I$0g-]@Q …-·”¬ÿô z’€ñèŸóÖð7ÁÿÍãÖøHNôü‡ ¼ByÐÿ+àÿÏñ¿‡”D²U¯AéZN¿7 ÿI—¨@ÐÈÉ k„r-ìyMìÿ⯄76˜(À¤HðÿG“ A0>d2 €­HÍ €€ ª<^@±Ìk‹èÿÅA„«y#d°N^i/]œÏ`üè‚péR¢o“‘ùÑüäU?¿\æbÏqdþãâUó{’ò÷/#óW˜?)?Ì  ®¾>ÿJJ.Ó\€G ȉñ ð‘ 0Šàåùä½é>æÄ`hd^Î .¨ lˆ:ïOôù‘Ç©Þùà‡øºò(Ëwà`·!¢ÊýŸ½][èÀBy @aë/wà  :ŸJ× |º‡@%z߸mçWUT€!¥_—߈å$`¤„õO€pÃäÝÒª“)÷×"âœWWá ;æÅg€?æøc€?‡;ã´pºá=¾9gKasz{ÿ ÿÚï—{ÿêµ½åÞ½¯íu\€6ÇY»Þ¤ @÷š|«š±r: QCo¥AN€ º4ÈI0ýÿLƒœ'éÐ 'Àì×ät˜§ @ ÿè_S•ó[·}ƒ¤¯éöÓ€ç?Û §Û¿””óüð@Ð §À]|¹@J§Vã—ÝÉïßÅü\17_LW€ë[Yî€ÝŽãSY{ïòïöê·t@ÿ¸­ß*öþaìÿúÏ‹Ÿ¿Ž×â‡øÆõ(Ë÷ `ÿϾ,¾ü ¯Å{‘ì5¢×è_H"·`p<=äŠëwŠ;שa¶ß?ÿ‘Øÿì¹âÜY¼G"9=ðŠOo7é¤X\uä¢)¸¸9@x €9€$á›o ÚsÀ`d<>†~¼ ÀØ XD¢ÜU( Î «¬‚ü+¿ë €n#kÈFhÞºY$Ø\š–€ # k‡òüfQ/ÆÀĈ¦PÐ!`Vàã2€fóõ[-Sø€–4…r€¨ü±å¥?~bÇ÷ð¯~¹†Ê¿ówÿÁ~ð÷Ÿüëá/`bé[Ão}ˤÈ@4‚æ/²6¯Äÿmñ¿ñHÄÿÆ Iÿ·ÄÿÆ Iÿ·ÄÿÆ Iÿ€4@ÿÿi0O§>ýÿGIìØÑ Çô†°“Ç#À±V®aÃ-å€ €Å=C¤|Ø×‘€Ñÿ8\"ý€È1…yLÀðO ðÿ:àPÀoáWÅ€_á5rbèÑì¿gÇúyM6!—ׄ\ÖY‚\WŒÄ÷¸A.¯‘Ý"* ŒÀU%±Sa@ñÚf.¬€(   ÿ¦O0ük*€ßMÏ>'Äú°QBŒ<˜Z°¯Ó‡SùÚ2låXYzIºË81®£Jq”Àb$à°^<ÿüÔÕççu@ïú{à°^ìÞ=uu÷¼.èËqoC~ôèÔÕ£óº  /? €õâС©«‡æuÀUÃ;7M÷ïoòm«œ¸_7] <¾Q.rtzçôõrçë;ËëL àú°Ëã –peÆJ@`Ç E[ Gòårõíåýï¼=Ø…Þ~ǘ*Çß"oe€î@ÝE›ÿò®Uü-îì‚ßZ·—öéExœ+ß„í/Žßئó«±ÖOâþ„I%×§Ô¸[ѯÈÜÿ"¯xìÿ ÞÆ§P>ðU,Âþ` ”OûA`f`?FÇP~¤x ìÿ ^Ê1oÛÄ(:ri$02=7#Yîgæ¦ãe‡#¹²I“9>^øø§0¯# þ§ RG¤ˆ’þ#Õ"#ü$€„âv@·[LhÀ&,p‘<ò{ø]ç0Ñ$<#)€¡ŸðO^†ðAUŽÇ*Éc}ïŒý¿~ùçß}â·ÿåFþ7ÿŸÿïÿúo÷ÿûÿåúãÿ:&ÖßÒTÃLÄChþ&k`ÓØ80 ü_q@xþ¿X»Àÿ°/á`sˆ³SÂÀæÅÈÀÿ'„ç¿É ±° àÿŠHåxt€T@—À`#$@vf€À?!ü ß\¥ø3œH>ƒà`þäÍÄ!ÇŽýêóµÏ/€Ç‘V€Àk†@2À`aúþD€0[fáÌo$Œì3À &âïêf¸zG|$¢(°7ï1Àô{ôõÆ›Ð`Ïk§˜@W3À›°ÿ‘7‰‹É4€ÈøJïü„i‹Ñçvÿ#@Òýã×M°²Â|‹ü€„ÿšpÊåHŒõa£Žà­OàI£Ú/3 .ÕB€ÎÙI-ÿ3 @ÔµŠÙ¹9®ý‡… ¯^½xñ3ŽñîN”sí?‘?~ ™½ÊyV‘_ÆŠãö 'a"òW^YCŠ(‹b¯75E'd`b¦ÁC¾RÉWRr]`§pÆ X. òÕ„|' €;;Ë;;¯ƒð¤â_ú,-#0ÿ `evÃ`½gñ¿vÏ$Ní,Oí<À¯> €g5B DUå Þ6r!B9F.¬_+›¡À~# ”ƒxÉÈ…å:©›Ž\H vµ @è°ø3ãž$º–4ËH{Œ3¨ÝL1’P¬€“©ù‘Öc­/Ëö™¥Ð|Q{1¿K@uàæu?koÈ[W¾‘ó“XÑEÈO„]@E[ToÂú…{lNÞJüâ¿xâ‰?ú—ô·þ‹cÿ¿ý·G¾ûþþåÿß…ë àÒ·˜`b-§Œ&Àù‹¬-h`£Àd¨=/¾H@s¤"àP{$"˜Ú´òHDÀHX{$"˜ ¼"p¨=p¨="`ã§@ÃBqX>®ØA¼$-üXÂdHø‰§=0üÀ€ÿ“r¤ÐEbL‚ê©,%\h—è€?‰zK‰ì4þó³üH^@ •7EÌ̬!õ¯ff€¬€¯«D]UW_ƒ\^“r€`ÊQ·°¸8&À"r¦4x€;àW¡xnTR‚xOÃ9ø ฆ‚&u%q”ñ20`#yì 4@xv°ÿƒ ¬ü> ApàZsS‘€i<`ÔßGöÿ!Bèd\^€ý_[“m2 ,a%Àøéÿ0`ĘOÍÎÂÀ65…< Þ{oÒe9ò€8yÒËáÈIòa™±/½B9ò€¸u ^Á^B'Ä §>œàCÞ›ZƒX–Œå²£x—Èkt<¾1—L¸  €‡Ë)øŸ0¾ÄF²ß@¾S.¾=ûöýËå{ø‰æ8ÓÎfðè8£þ@J¾öÿ— ô(SrªzóÎO‚Z#ùüG;b<_Ç9ü^”&°àâ;X >š%à:\M€Äô¢£EøsÈxúl€ßËLÆà´¯?AX^óãç\(„ÁU–@ÅD?”3‹~›\²à·ÏUÚä\ MÎUÚäÌÒß$GÞ?©?ÖH¶”¬°ÕóS?]퇇Dëù¹ @²|DØ“·Àì¸ÿýŸüÿL1}NHá„DÈßNÿkàÎY€9r Étü‚¥?Ež’ˆ‚e8€S!˜Èœ0Ìÿž÷NDÈßNÿË®$Šâõ×ù‹w$<‚Š@Q|öñŽ€/ É…ð‹w$|9€¢¸~¿xGÀ—ƒ(гgù‹w$|¹Ì›¥ˆ_¼#àßcÀü-€0# æAàÝ´Ÿ×x[sŒOŒŒ,)Àþ)ãì/œø9ŠÕÅba!€ÿ©}}!úB˜/œÀ߬ðâa×ÂOú9F~O+x¹ö9õCêÿ®óS —GtE¤K õÓE`ØD×¼woäÌ™Ä2„ëÕ*# !öüMòVà¿^üã'žøW¿ýGç?ÿ/þöÿ¢ø[ßýû¿ýý'ÿÓ¿û߯ƒÌ `é[Ù` X/’5i`3@ípþ|x¢ j€C‡"¹DX€©©H.6`q1’K€ xÿýH.ÖàìÙH.6`e%’K€õOtN-„ÁHt~Ï iÒÀàðß[„Í–DbCïç $Çû¸\ºH€õFá°nÃÚ8\ h!ÊÿqñyIàùÙ¿œ¹³vg¦˜}~†ù£Ç.|¾V^(u!‘ÅÐP !†àIC|o  èUfhD’A‰ˆà*Œ !5‰TÈU@G´$EŒCX¢ø“&XÊ.°N€Ê HHp®i¦ Kˆ#À’“ ·öËeäÄVŒÀÉ<\ “XG† 0 d|ªû:$]ôIì:šZ°F—L?ffàÆŒYˆÓq¼Èw3 Ö±:yâ¸Ï9)>.8Ÿ0òCÌxöìÚ­³¯„ €àHp™¼O÷(Ç~ ¹"ÿÑÂ/% Ê{3Ü?£åNãP¦\äáPŽ-¯Œ­Ž-Yç{÷b€wùÿ³ýKoÏîo˜Æ @04Ã]©ã÷>ýc ÿ°?n°Íç‡~I Á%ÿ'nЋáO=ÿöïgïÄ–°PŠÁi‚€ #T‹Ýž‘ÿê€ Ñà Iþ€¿þý½¿~-QCâ{¤UCØS¸Ç]Ž˜0=¬ÿ÷a²}a8Õö˰,9tާW_=ñC{ŠéWSÀÎér§qðûõT’èAx€Dÿ!ó(Àh¼ ŽÇ*ÓŒ@,£êE^LM™€™ÿO 8ÿÎÝåNãP" Ø$ðßò6”k!äm(×BÈÛP®9„·¡\s oC¹æ@ÞF¨ b‡ ;ˆÐǾ€üñ²Á?$€§×ú@ŒÀZ:²€O Í"€ s5€ @æñ$@VI;ãÃÍ*Æ Î`íã+UŒ}°àøYþüÈ‹‡£ò¿h\¸ÁÕ\¹bÐx~!VFÔÃ>"Ö£þ•?© €¨~&G£ø‘Ü„4ʵu§ü±ñÅ_þ¯~ãÿê÷?ÿϾõŸ Àÿðýßøëÿ[ì0ø¬xX(^b©&1gÏ_e d ´i`ã@{Àq¨rD!;Ä 9`‡8T9¢€âPåˆBvˆ@sÀq¨rD!;Ä =ÐBW«o ;bk!Ö–QHš@-ðÿ8þIü¿.kc@ükò€ˆCkj»B€eqòåj?Á¶(Ä༠@x@ (ÖÞywAÞÉU$ ”€ØÂ"Ùÿé@øœöJß©Êi OÈ'Ç$@ƒU1LäZ%Q’; `zÿÒ@íñ/XÅ€3<˜v d¹â*i õÐïÊ*a ýblÀÔs®Ï }MhV à*€SîbVÅQý¢,Ê‘üb6ãÞöE7` €%¼“3|µ8p@Âo¤Ø)ÊiÿŸ¼ø]ÂååxÚÿ÷?E€p9@‘óÿ2ð?)¿‘Óþø•5º„Ë pý:>×ðK+•|¥àú’<:M¬²cŠŽQDŒ€ ÀTX¼ÐC±RÃb’óí÷`ý_}ûýï4Lx4Pàæ‚ HÔ§‡@.çhÿºÀ6žð\úŸùŸòp“ø¥æg½ý}¬B6·Ð@€°@|w³/ãþ²i#ÒÀ±÷Üٽ璞·à@á&¹ÿ‚?Ù¤ª‰ÁráÂìÜÝ»s³¸%ä/¼på“»w?¹ò·„|vöÚü;ó×f¹máø®úuÉ_øð“›wo~òᇠõÃ2éHÒ¨k¨¥úO×ù»ä·áß¿ð3,È×DûÛå`ÕÉÀKö$ðêÉãpس €Þ´ —ˆú‡àÆ0`¼FÄ“¡ÑO/¢~8'ÀƒéÂÿÿ bÿá 蟻%I¸ @$7I “ –küh@Ä hüh@$×$øÑ€H®Ið£‘\“àG#b.ÄÞHÐÅžöq,X}C`YÇ@·z!f>DŽÇ*‹‹«p‹(€}X†ç:€ˆˆW”§#VXK&\GÿXè5àp’`…˜\¸ñ|HØÌ8*  ñ€´‰?Â$€báÚÿ  !„XƸåýï—~ç‰ðG`Fžø[çÉïÿà·ŸüOÿ÷þ߆ƒÁ·CY Õf Ü l˜üßœ@S´‚ÿ[Áÿ-€àÿ@ð  ø¿…üßA0|MÜÒ~2ãšä0ñ ê‡Ý_~ä]<„b@Ì#ˆÿ› ÉNŸ$¤ëÁÓ&®ÿW 9Bàð<Rœy}€Y•˜ÈâÈ]D z ŸQgªŽÙÔÈ¢¤& šü¹ÐrØýiùïÑ ¥>$ÿ'€¼y.Úƒ+’@Þ$äHþOxót|üØ À@—L•è,%¢v%àÿí¹Ñƒ! új¢&pptjËH°€±ðþÇÆ€~PƒÂH42‹X P=Ü“k·3#’‡s5@?»ˆPæ‹c 1×ÄG(3’qEsDÞáï#à2r]–üà•µW΂xÅ;ø~ÑOS ÿhHóßc¿²!L¸TŽò* !¾ïâ;±@|ûb¸Ñ-Çö)óáþÏÄÿ׈H•`"-¯rLp €äñs’`/sÆòv€ÆN@"@áÄð§’œ"I` ÀÜBÑ‹”ÚH 6þËÿé»#;ž|ò7žü'žxâÉ'¿ÿä_ÿù¸ÿ׋Á zæ„.˜ž€ÜD”O’5ð ÒÀÆ €óÀ¡€aËmÖˆj%€ Z ˜[ €•`|€®4 ‡íÔˆ°»UN|¯Ç§sT¨?íY݈+õ¤zh=¬F€l˜c© ‹‹üxg¨ä†h”ƒ¸ó—³‰5ÌÌz¢”fÁäy’¯§¢=”[‘$Jt´HÈ9¾J@ì€8Ä@E±‚$ôÉl 1³?æÈÀ¥ruí@)9=ü @,Gü? €¢‰z%P4Æ ý¼èpÐ'Db*€9ñ˜BÆ+Û1²¸XŽ  ¬`±²*IšRȉÀ,M€ÀlZ±ü‹ÍÀ$ ldRÀØÈ¤¬3ÎÛ\€XNø_NMÈ˘ò ¼G9÷LÈ,Iþ’þ’„Éä/‚2Ú›F@¸H˜@‚Ð`©· (]%¯wCÜÿ""àíÙ20QeéO{T«Œ'=öâøOáÁ¼ŒSÜ€ÛóBíÀÄð'žOHß_ôûXÚ/)Íò‡™-_’0h÷öû›àXÊ‚O]ùÿS‹'Fp€z$ ”!TÈ$ŒMÍã-—˜¸?ihßx•„òQl?ž¼CŒnpP 9>" €qHõÏéÞÂùSshÀh (ÝOsØÀÃ!1>ÐïŸÁÿ ä:€âð#¼KyìîG@¸ `š€ç?r  €ç?<Ð@@…ð Eš€} ƒLðü‡ŒñðÀØÛ@Œ[ Œ`çÕè–${ô™†´È°¼‚U‰ÿ/6H°\ RÈù‡óÿóƒ“K€ð €Q?@¤àR€ r9ƒ•XÁ  çØ_ƒàüd4Ë?R)Äë#40þò_?ùýõ¯þO?øþþÁ?úÁžüw<ô€Ul‰@‘ €o:ÍM}àØ °cTðÿ[Hž¯ë´ËìØ%øÿEÊ‘›ŸfÇ>Áÿs”ï“-ü$ä² @°ã¨ÊÅ 9ˆØH ä‚‚ev`…f! —U‚€c‚ÿ‡”k¢®h™Ç®ÞLèõj×?i¡/læ¼K2 ]€!Ö™o×ï8—“ÐÊ÷WÎGw‹±cïÔ©S0ýÓàµ=xßókXô€L%û?ÖS£›~$¸ƒéŸ£È³~=’¯ Uþ˜x ¾‡÷œE qH¹ Bk$Ä •C¡P@\¢à§Ç‘ú³vÞØîëg‘ú¯ø]º±'<,ðÜsÏMÁ Ž¥ƒ¾2¤¦âÇóÀ9+F@DøäÑ€šðìÕ$ö‡€Æ$6xLr#0ó^ì€E¸d H'NÆ.ìÿÜHÜþ2v‡r˜ €³È¦àÕBb˜»!ÀeìV*ùJ€S˜T€)‚`Udü[M…  7@¯w¿wÒµ7@¶}¬¾Ä@ò4ÀDÀý\ `K Cp\ íðcäXæ*1ÆÂ‘øi¸=/ E81ü òhøöÆ;o¿ ¨åAìp¿4ì= †¢îUË‘,&%ïLâGßrdRÀO°.À^”¿·÷“dùÿ¾$y¾®r2ÌÐÔ¾åG·ý‚”hx:a¸ˆ@êñ…¤þˆÜ™ÇïBÃýÉu™@V úg¯Ü&ÄÖÅûhüA–BâÈQˆ'ÌJ€dýswow¯w¿§ÒωÀ2€XàdröÀ,ˆ€„´Ã.d“t·Âý$ÐÀÿ3Ë" á Á‰È½ÃQ8ÿe!YÈ~)vè$€çÖúôXëÏ%bྲ"iø'?™p1"É€Ìac‰Ã0=Ç(CàsÝ„àPz˜wî*€$0ù ¹Ìßáå¿x€V0ä'„à¼bÀó›wáù-°2’"Öe•Å* åbáæHÈu•FãŸë2ƒíò* 8î·¿ü‹‘ïÿ6¶üàï~ÿ7þõ¿ÿãÿ.˜@úlàÿ‰'ïÙàÃ\À7C["Οo'j'¸"@@²3{WäÀ¹GpE€@î\à+'ÄûßÕ»§€(²ë‚tSøÕèéž]ø­È;ðÔùÐß¶q0!pðmôÌ?,¦Y € €ïû¿8 .±€,C¤‚Ec7H  !ú/”@0@ä€BdÀìA¶Øz5°=ÙWP³`ÄŒñ?}5E=  ±#¤«øÑ¾ ½®Ð 7)üa’@U@ƒ ð?6à€d]ÄÌ " Rn9ØÿYd\ O{0Í(äÉ~ɸ„<‹éðýÿ1Žë¦s´žŸ) ªURíC÷· ûçðí·qK’À,{íí˜è­­˜È€ÞÄÊZ‚è’÷Žõ^;+ú?{,¥_Úý¹ 9€”ÀO~Ý{ àÿ4þÿú'‰oöÞìÝzóÌ‘#x}3"²Ò[é­­®¬,ãu%!ÿƒ¡ã|;@¯7ƒŸÏpÛðu&qüÉÞÉÞ)$Ï8ד ùµÞµÞ;×®ñõZB>t{—kÐá87B°]ò/{_ö@νÿ>^¿lhÿ-Þ– í§VÄÿ¬Aþ³Þ-€o$ÀëÏç?ßÃ7¾¦D¼Ïª¦b)@fH>ÀpÛö¦¡lpHÜŸŒýוæ"â: .‘@gz¡‚â*õk€ HçèíþÇ€Ó?Ä_À…ø÷e’ ÀÉ…ñ—xö À…øw'yü$0ê­Àêâô’e=y‹Õ5Æ4,X÷L2{½5j™ô6øßœÉE:"þ7€(  þ7€(  þ7oqÿü$àþox¤ø^¢Øœk¦<ô•Y2)t‘Ãÿ+$ÄýÈ4¤sЈÍÝÆá Õ¯,ßC€;ðXB€2!¯]°Ó«Œý#‡þ7¬ 9‘ÙçïHÒ¶.€Y é£/1Ãõîb€ôKEñÎ;.`"·ôvÄ@5‹F+½Œu@í‹þrNüHÀñ ýiÀ†Uz¯ ÀÀkQùGÎô^ì•·^~±Äë™#‘¤ÅRobmy ëØÌˆäãX¯W ÇÇ ¼£ÞÌg½ ½ ŸÍ\ÀÑñ'NööôÊS'ö”x=y"’_»Ó›íÍÞAA¼Þ¹Éçïöæz/Ü¿ö^ïΧäRþ ½SòË·{G{%–,ñzûrºý‡oáM·_ôS"‡C™–ß"PÎÏÜ.IÜŠÎ?IØ_¿¨$0™ŽéA‹pHp¼ò t& Õl ™€àþé’Y1ã—!ÈŠ1à Bš €úÀ€ä*¨ß):ôà À“™ÙÿÈ Ã³ÿ3 é .ˆÀ¿t„¡0xÂ&äüÌþÏ€¤€¸ ÿ’xXÉ‘$n-‰ÿ»`ä€0v"†`dq ¶õ5:€cHt$Lãƒäát,À€›€§åÃa>hì®d Yú±F—ÙK–ø÷˜ýŸ‘ƒ‚œ+í x~¼Ð >E$®²h=’å;I¹ãÖ_íÐ$·‘Ùq~ñ¯ÿú?}÷‰'Ÿøî¿þëýËü_…4½'¬ýÿÖV2Ðõ¤Ëò¬ i`c"àüy×D¾c*$òäK!05å‹‹¾<$Þß—‡ÀÙ³¾<$VV|yHŒÇ.RèÃÜI³ë&sì>øj™NÃôJÌÿ:­íO±`7©ì²’Ï-˜‚A^Ù]™-’þÿ›ó“h˜! @ƒ…pß('€êGàV)$@2Ì"ä¿‹@¿û» üsDKm…P7ô©ƒ£;ñ)Q GÉdÛŠšh$yX€tšÉücéÀ0ÉH@†H€DYëSƒ°Å8’ Ð(Ÿ€@aü?\E’öALì;äœÁ¡k%Ä… M1Ê% †!í0.ñëˆb‡«{ P÷—³È° ÿ,€X>”/bA¶„œ9(ÇkRþô"¬ÿ%ò," ` ·'©“ö›Uší¯è<‰Ó €aÏð8ÞòDõMo'ÿ ‚]òõÞq¦€~OŸýƒ²ëœÛØ€†ÐBϧ—Aé•GHðr Çܾ·Ü+aá.ñ 3\ €ôʉq¤8€›Å3a÷/gf.”ê ¬ 6Ê“$† Žòk ®õÊk×fKzÀÀS rÔߥ|~þåw‘èÞ—ù ”¿Pâõîü‡ü}— pÀûéöŸ}åpºýF? ÒòÛ ?ëÝFýIÜîýlávpþ™ÉÉÞ[lêÿVor2bH66À5>qݧ‘üŸ,ÀcâûcÖÿyôŸY 잀ÿö®çƒ~é‡0 0 €øÿ$ÎÏuÇ÷'p?’ÿ“8ÎX€ÔÙ% ™P÷ðvS€ÈÐ r4ˆœA "g@cv€ @3@IöWFFî¥=„€@#ôxýÓ-ë´½3É ñ'ú}ÿ@:> @€QäðrȾ†8ÓB€ q„‚žÀŸÀ y~2 ð”GšÀ/ÿøßÿÅÿå¯ÿý/þú?üòÏù_ýóÿË| ÀR*IöÆžy¯¬¬Z$ÿWôðô”M`r„À’M`r„Ö4Ó&@HLÙ&@HLÙ&@H cšã@€ þ6€ÉðXêÐlÄ ŸÀ³Ù€S—ªxïƒ~û å¶lúÀÑ ða€ç’ÒÍ€D$–1 æ1{‚™”Æ“5’`™d®•¯(3$fhÄÿÖÀ$Ø9l°Ô4\åbAW¯¦sdבÀ_ƒZHÀ€€õ)$Dž"¸Ö‘§8y@H2[RV΃Þz ˆ@\þi@€HNø½DË"ÐÒB_É驟ð»JØþy<"’öü?ÞÒùѰ* ?ê £°qâ@Î x¼ƒK7Œ€ÞÄ ´JéaÅÒˆè¯#à,~PMø$=J ꇹ"·÷µŸ˜Ð2?yÍ?CïÅ—÷¯ °ŽwxukˆÄôp_`>îðõp´€Ä$ôûǵ°Î)ƒÞ…™÷€û×…XÇ»÷f.xÇï9~¶_ Cëxw⸷’joV<ÿ×…Xg ÀµYïøksôð_`1sCÐ{áC+Ç …”ø‚w<"ð€ÿ×Å`ï.¿4Ù~©ö[ýHÉgyÏö“`ûæ=„öÌô`õGýÁñn&d8¶=´áîë-°ÿˆ@òþœ—þÃõ£û¯kü2ç+¦% Áðòþÿ‘œÿxÚI{§X?ñH¶—>økÔ}RKVƒ#Ù»¦'?Ç'uáo>?&–¬ÎÏ€Ü;ö‚ @CO12 `dánÚC@0CFR|>ˆþ÷@4¸àxp÷M‡#À®2F°nXÛyð~ø‰<’¤o„@CùÈpf„ëø¥"ºÏ0Êë¤/VY4 åÏ/Ü»×V¿*@Ãñ•@£Üx¤äccÿð¿þ_ÿŸ¿øÅ/~É8ÆtÿF–Æ•o}k­XC¢ÏmßñùYY$tÀ·¨/“ÐcèáO@äšPýýÍ·û52"×$€çñ$D®Iýã!' rMÉɈ\̓‘œ€È5 `$' râö也tk@¸‡îÝòjj&*¶%gü$–ËF6€FëÂw©’ª* -ø…Å!’ÐsÁ:®'¹)e«H£‹;+™`Ò9€æñµÕ{@" þO4£ƒÿSr‰0ø?%—ƒÿÏÕ¤rFŸú •…¿x7~ üß$ÇÜ¿¤€0ë) =ä°ðá7ÉéÐ&ri—·†U!iøÑÜ‹‰·ß^–5P†È-×Þò0pð¼"0"\¯‰„œ*'ôoÔ¿èÂDúíí}í×½¿ÒBñúë˜8Ó;Sx«XÞÁx\üÐxŸ Þ«€÷ÿ-€÷p‡ì“!ðþ¾·a˜·ÞG€¶_ €¸ýXVäJÄòk „ÀàŸ q!ÁÝ»w… ¸ÖdbßÔÑÝ™ýGR#4ܿҤÿÀþߟ+¸yx‘óÃ@€ÄùY?@ÿæç +€€-øŸ>HØRS!ÛäÉà¸ú¤lÁÿôhö½ãYàN¨EŒ€€~Sórxȯ®} éz|ãá0C`êFˆW}&*€>Qºè`7–Oë禄bh=?ôƒIA‹~ ÐXþ‚rI…† ík•+ÐpüØØÿalð‹±ØÿMÊæÿ"{Þä½²Ú5°1¨ß:XÀO¸£ ñ_˜×Íàdòà~¾Îã»Îÿ€å¹e tk€YjtK§©a@Ý’ie ׎ka;Å €/›Ãÿ87Spm`èl¶ÎŸçfš˜Ø±ØÍ­E.Ô^‹\(š­ûz|•{<*î—Yz\tµCZ.SÁ ó=¿}ÈruÒió°hÖv1rWB,CÂ×ÞpyècüÐå>"—ðHÁ]úo×Óÿü/ @àC€°$þ㥑%T˜0ðèõ˜¸ÐÊ׸܃£„ýÃq¿–cÄ1O~¡×ûÌ‘ÖC"÷x„OÿWçGÀÀ¡'Ž Q½Þ]G~·G¸]oðúå@‰ÿêò‘0ðèh?˜¯Vý k!æ­þ€Äýú!3?¿°rìcý}ݶ×¶_•®û»«~ZƒŽáã‘—ÓŽM—è-bÀÍ! ZÎРá†Oó>Ìÿa€V æÿñqì3\j*‚Þù°ñ7¶!#3òîó³íú‘–ò:ê7Õ [Ž_ë“h>^Moië¿ôn“n*Ù`ûœ|†¬õ ë;v˜€ŠÒèï09þ* ”‡Àfï:ÿƒ•ç®’5ЭjþÕ0ë’o¤¡¶‚ÿ1€’Øm°Õñµ¨á²%$ÚÐ{QÃÿôñ5üïÖÔCÛ£ ™tÉ»¬‹[¾Å‚·ò»ò!v©a Åè![81x ¤¨Jä2.#HàTˆYý¦Ø·ë éîù„ÔÐÃGÿx„¸Ç¿‡uœúÀï›ø¿® ²úr¤påÈèË}‹y7'G ÷üȸ¹öwéçg ï!#€~äçsË—µú¶ÜCÚì:o×ý·Ýju¿«~Û-ÿ¡ß `»kF€Þ²W‡¸@úà ÿMà<k Ú«× à»Îߥ¡í•ßU¿íË;ê¿ýùS—‚²=fw²t¶¿K?·±ö_xþ[·*Ê¡ÇÿHÎï¾Ê>’ËÊ€õ_¼²&²²²¾Ø8ðuhmnCÖÀã¯Ñ3r ² ÄæäÐ ªh`¡Îò@_¥~‘^”«ñµ×@§ Á×^¹YY_ dàës-sK²²²²²²²²²²²²²5 €Ü9²²²²²²²²²²²²²¾ÈÀ7à"ç&f d d d <¢0=X Ô^ŒO–«N$ò)ëçõíêw»Ç?¨þÿˆÞö¹ZYYYS™x˜ÚÏeg d d d |“5Pû4§þ„˯* (öÄò=®Kc†Çrå{cù^W>ËG]ùD,ç:\–—(>Œåºò±ü€+7–¿åʹ¾RRp½ùªüåøx.;Yɱ:k¨Ÿ+ÐúïjÿÃ.¿K¿]ýc»Ç?€ëçô¿oò³esmß·¯}ÿ={Ú凵Ël—8Ð.ß»7!®þnß¾çœOëëòáéZ¾gÏÓÎ'#ÚUËÚå|Z_—;kùÁƒ;OFäÔù6·†òá;õ7{÷~Çùä‰6w¡òÞY÷G!ð°“‹åòïÏuÝêY²þ·ª¹ûs\ÖÿýÑãVÏòM×ÿVõ–Û²ˆD÷ñ#˜T~ö)$¬`+à¾'ߣ”@%Ü÷䇔¨ä€ûž|¯R•pß“*ä«ä€ûžœ r»rÀ-Oþ¡RÕñ€ûžü€BâJþn W)J¸Ïã 4åçHE(¸ïY!eu<à¾'(%PÉ´þ»Úÿ°ËïÒoWÿØîñ÷ûú¹ýϹ1ŸÞ½Kãg½ßb¹`cù·¿Ý~þ§žj—û¼k,ºßò}ëü1¿‰ÇÙžuþ˜ß„üÐ:ÌoB~p?æ7!?°Îó›ï]çùuäû è—úÛ&@þœ¡3öÐ/õ·M€üiCg2 _êo›ù.Cg4 _êo›ùNCg\2 Ÿµ¿t©®ÿKZɽôKýmðýwRtÆ–‡‘|`ÖÀ4yt=U¶PƦÉåoJ]÷}ç¬ÿû®ÒM0ëSêºï;ÓõßšOØ­âö ê'ð/ä#²±8N9Q?!=ùK”õø?zòÓ”õø?zò)ʉú ü‹‚=ù"åDýþEÁžüʉº(( ~ôä—( ê'ð/ ~ôä³”õ¿%r~ôäg(¿…ÿBüèÉW('ê'ð/ ~ôäã”õø?zò­ÿ®ö?ìò»ôÛÕ?¶{ü}»~$žâþ§wàóòÃ_e^ žõ5MËk›–{?üMËŸZçÓò€§åõsdcr: ¥7=žNFÕ†Â/\À~°Å‡8?Ž?ü`‹åÎ/½„?ü`‹åPÞ•+øÃ¶Xå<_ÂO`F×}œOŸÆ~°yÇ?w^h ©ÿùóUý÷7ÄÀÓÇ…¶Ðú¯ê¿ç¸!v½$´…Öÿ¥ªþ‡^2ÄÀÎ+B[hý¯Tõ?xÅ>Ò7õÿàƒªþ—>0ÄÀwN m¡õ?]ÕïiÏ éZåï³ |O„‡:Îågý?ÀÎÞyêÜÿrÿëì$p‡‡Ýÿ`Óò©[4P\"2 ¹Ù)zqŽ‹œ,€|äf§øÄÅDý“ÜÀ­x€ú!' ¹1@äWñ r²ò‘ãD\MÔ9YùÈq"_À ~È…àGnôÃùe|†œ,€|äÆ8‘_à~ÈÉÈGnp Pù-|È„ü±&?rƒáY嫸 9YùÈq"g¥ú!' ¹1@äZÿ]íØåwé·«l÷øûwý’ý—ØÿÝwñ‡Ÿç‹ý‹o¹ € @SrÀ¦äÀþÀÅßÞƒŸo§äÀþ‡ã?O¥ä.Oɵ£šîš¨¿'ÇCb½Øs²‰àCøÆg /=7°<=7°<=7°<=7ë@\zn `;xzŽ €õ}“çÁHý''mýÏOV4ÆžÇÁHýOœ°õ?~¢¢1y €ÔÿÈ[ÿ—ŽT4ÆÁWÀHýoܰõ¿r£¢1.]þ €Ôÿòe[ÿ.€ÿ7OãŸÔÿÍ7mýO¿™ÜN›ß? ·„^ÜZkrùYÿ[í;õø˜ûßVu˜ï¿oðý×õÌÎòöAm‹ú\zqß>Aý€ÿ ð ÿ.è]ä'öìÔø\>áßqà+.>tHP?à?ˆ|¿—ÿ‹üͽ{õþƒÀ'ü;­ø_äWGGõþƒÀ'ü›Rü¯¸zbBP? ó¢|¿EÅÿ"_øðCAý€ÿ ð ÿ>Qü/òËêü€OøwIñ¿È¯½û® ~À×Þ…'ÀµYÅÿ"¿u䈠~4¯øD‡Åÿ"_]^ÔJ‚À'ü[Qü¯¼Å` ¨ðD>á߸âÿ¯Dÿ]íÐ׿«ü.ývõí¯_Øÿä¦-Öûß}èÿ]àÿ[Àþ>þ/à @Óòƒ `Órà~˜Æ¿  -î?|èÿ0ðª|Üò€§åŽ?PòxG¾ç$°¿ÿÝ99 ?°¿‡ÿiõ'ô¿°OÒ­þ„þÇ¥¤#Zý ý_–Ž|hõ'ô¿, ùÐêOèéž ¤‚d´úúŸ–}Î_œ4õ' õŸ¼RÀnÇOâ‰)õ' õ?q¤€Ý^:ƒ'¦ÔŸ€ÔÿÈv»²pÃÔŸ€ÔÿÆH»}p÷—ÔŸ€Ôÿòmvî7õ' õÇ›Zžße <$ DÀÒö ‰Ê Ú³AR@Œ ]©NUm§|‰Üæ¶ò%p›ÛvÊ—hÓmnÛ)_¢Y·¹m§|‰–Ýæ¶ò%Úr›ÛvÊ—hÕmnÛ)_¢‰·¹m§|‰FÞæ¶ò/=¼òM»›ŸåÒ/î³~ˆù ù1kµ–ÿ}Š}…`q4ùòcÖj-ÿ{Ž{N@9Mþ€ü˜µZËÿ¡—ŠC„È*§É³N`~¾-øþMá(§É  ÿ*]½¯|UøÊ8/O,ô// Ææ{±´‹\ÿ>ü„ _BŠ?)>\>€ršüù1+æçÛ‚ï/ @9°>!ÿ,lÿ×èû ,èá(—†Ü*÷%oœ |åR‘ÕåÔÈXþ—WŠåUyO9Mþ€üã&€íÁ{ñdùƒÖWûvù]úíêÛ=þþ_?¯ÿé=ûbÜ_ýƒUô±ð Èð´A~r° ràþè¬\úüÀý7È÷A.¼A^…,$åbò×'¡?ƒ…\I2b þ„þ 6r¥·»méùãæ¢OUÀÍEŸ–×¹èÓò:}Z^çOËë\êiy‹>-¯sͧåu.ò´¼Î…¿59 ; ¯/(¦ßþsˆÄ°ÃUÚ®þ‹LéKÈ0ô¶+AÊ"@:ÀÊú¿gb~Ê1-HX9CÿG§®NóS2  `å ýŸX\^ÔÌzB¤¬zÿ˜ëb~)ÿCZÿ«™ mc°Ž©de«ãúÿîìµYÁüâ ÖÿJŽv¡ç¿´GŠ3°þã“^2ËË+«ÿ¥|0¤¬œ¡ÿƒÅá¸Vr|±hÒòø­ÿ®ö?ìò­~É”¨z|ývõ{<‘¼ªsÇoúúá€Öëç÷?¦¤¹Ÿd™^äÿ;r ·V9Ð_«œ·eÛùáÐ*zm•³»¦ÎO´o?žøàâbÿÚäg >D žŸñ+™˜ Ðn4ŸÃxÎMmèøa2@»Ñ|ã97µ¡ã‡ÉíFó9¼ç¹‰=˜ Ðn4ŸãñÀMmèøa2=»Ñ|.àðYlèøa2@»Á}jfFëÏ&컀O~ýOñsã j~ýÏœ;'ÕÀúŸ;wƯÿÂÝ»R}¬ÿÝ» ~ýoù¥Tëÿå—·ýú¿ùÅZ6aïi|rëŸOÇï†åãXëot# 7·¬N?ãI¬|Û9·ÕHÃímÛ+Ÿ‘‚ÛÛ¶W>#A··m¯üã¹|F²noÛ^û)»½m{å3w{ÛöÊß>Ý^ùŒ$ÞÞ¶½ò‰¼½m{åÏ<¤ò ª\ä 37åU.úy•‹¾A^å¢oW¹ÆäU.õy•‹¾A^åšoW¹ÈäU.ü-ÊOлC¯¯ÓÉ€^|ï=µE óýÿMOPàÄ©“ê DÌ)úÿ[¹G`_ ¸Eÿ+àÍ/$õŸl§‹/èÿoåð®Þ•Ô²MwéÿoåB,¯Iê?Ù‹5úÿ[¹ ÷ ¸üˆóAn$%`#ƒË¿n—nYÈ•ëÃâ¿0Ï7tx·˜_ €• À¼µö…up8R|±&æx«k«65>¯ÑÿßÊ…(†tù—mPL áPÉ+ýWòý×ò´þk¹§ÿ®öWå‹/„„A¤¯­ßtùâë!a›*¿ÒoU_¿]ý£:^lù$6w|uýjýµ^?¸ ¤¯Ÿé_x¹Çø{ý÷ÅjNÊ}ñ ùÿõ9Ë{%¿Œ•6ù@ËñpÍi•.@´@mr!3Âãù$ ÕŸ&:œ’/ðß´OZýiò'ð‘|ÿÕ8G¯y5 Fã…þH‚¦×¼FÐFã…þH‚¦×¼FÐ?“ ?’ƒ é5¯ôÀÏäà hzÍk=ð39ú9š^óÖ€.}˜ÊÏÌÌÔ>„õä—ú“À¨Ë¯ÿ¹sç¤þ$ŽàCXÿ»wïJýIÜÀ‡°þ_~ù¥ÔŸÀe|ëÿÅ_Ô>xõßð„ãOÖÿ䯨ãËãpí6¬ä­ï8Üú¡;òþ_ЧwË ´knL9O²D*8h¿ì8ž‡.Þò%WqX~5ciÔ5Ë· ‚“;m´ýt#ˆÊ¯f­åÛÐÛ*_rI‡í¯f”­å¿ú—\ÕaùÕŒµµ|›Àz[í—\ØaùÕŒ¸µ|› {[åÓº•_͸[Ë· ¸·U¾äòÛ_Íè[Ë· º·U>­{QùÕŒ¿µ|›@|[åK.è°ýÕŒ°µ|›€|[åÓÖ•_Û4›*Àç€æ§ÌFŸ?’o-lë•åÎU.úG­*}“œ÷.³Ð5Ém.ú&¹Í5Þ$·¹Ô›äâ€Ós“Üæšo’Û\äMrŽMÌ‚·U¹xíÏχÇ´º]xï=8þó}¡ ¾Àæ ´ºÁhtÁgèñXãVrZÝ^:sŽÿ|ƽù3 Æ­ä´š>wNƒ žc0m%‡íjêæM <7§F`ˇíqqeÅæÎÃ@º²8p+‡íÿ“O¦ÿ»w?@%§UïÒíÛ6÷ßâ6ð?|­íñ°ýÏÎÎp$€p˜Ÿe8€•Ÿ¹uëÌ™/¾äÿLx oIxXùÊêê ÿ4àJ±Š÷Ëøhå°ýc\× €xÅçÁÄx%¯ô/òA³þ¼QÿFê¿«ýUù’q¶¹|Ép÷Ióõ— §£ëßU¾Õ¯ðA¤_Û?j€î÷{¼ËÇWAпªëgô×xý4î±áúI†ÉK̵Ÿ|hûŸ`l·Ôð¯Ð_Ø]°Y®&èf¹š°›åº&`³\×l–« ¾Y®Ý[°?¶“jøWè¯l€Ê‰ý±Í¨á_¡¿²v#ø§éœVtàhR^‚k>Ç£‡ÚË@ðoÍçxôB{yþ­ù|a>ð¤pòü[óùíÛì­x^8yþ+û¹øàyæäúô£þä䟛Ç@êÐôO@þ¹y ¤þý@ÿø'oãúôýãŸàÿ¸þý@ÿø'ø?®?@?Ú€§ñd@˜Ç ºëëâ¼÷ßþÉT3Ð|Tãé6#nÜO•9ãøÖqòñõã*b#Õxû,ߟʵ\ÿÁý¾þ±@#NÇCŸ-ÓP–x 'q 3gn›Å‚hÄé.¿ ï«/±”oÎÜ^~m;ȆË×i†w¸q­“oÛ˯-?[._¦‘‰ò Ð^~mYÚrù2MM”o€öòkËÕ–Ë—ip¢|ô—_[ƶ\¾LÃå ½üÚò¶åò%‘w¢|ô—_[æ¶\¾LÃå ½üÚr³åòu9²øþ3 @{ùŽïqP ßÿ2O”o€Žòˆ —?#@9n¿a˯r¡7<¢ª\ôMreŃ']D•‹¾I~Ç‹LÃñ6—z“Üæ¢o’Û\óMòUAÍå~,nCN`>q<¾6KJ@ÌÒ/\”ɺ¹†›%% fùHa]¯À±Í,(á€Öõ”3`¯.p9ø¡Z€rÆŒêSÈÀÕ2v"`B—XD~¨Ö ÷œÚ§… /uýp@Ó\â >TkðøwߥqVÌþ¸ð k¸]@l p+?RHà?ÿ$Þá–s~³ d]Y¥YÙ‘€ÿ8üþD1>>A·Gnõ/3<6—Ïåã%,_õ;ÎëË¿A¨_í 'ú‡8 ]ƒq9}¼!hÇÛë'úk¹~<ùjËõc†IétKÑëËœz·¾øÿ4 €„À žW QnÑ5o³k’[ €Æó?¥@£Ü&âk:¿}Àƒ8yòÔ)ZµÅñŸ„À©Êþ/ ÀÌÌGÑ*nCö}äÙÿ%€a¢/  ^\ÌFc9Óç‰ýœAôL©G³ÑXÎôyb?g=SêÑÀl4–´ ƒè™R.f£±œéóÄ~Î z¦Ô£ €Ùh,Çã«v¡gJ=º˜Æ~Ô_á¿Ô”G\…ÿRh(®?‚Î õ§ý?®?‚@-¡þ´ÿÇõGÀmD þ´ÿÇõ·À›ðêÌ3Öòïìç å¨¦³mêûñ  Û]~Ç›ëu|ª…h9nS-mØy±ì<ËÆÚ¿Øqž?4_ÿf å¨¶ò\€3Ÿ‚®s‰ø™5Näifâ OÁ‘gI¼ šç¿R>ó m¯üEœ!:ËGèbwù0 l³|’åcÒ]> ?Û,adéò‘[ª»|–¶Yþqœ!Ù~ä®ê.†«m–ÿRʉ€×¹±ºËgž¬íõ¿Ó)'–ÐÛîò™‡k{åO¥œX>B{»ËGä6Ëç’×ÿ€:îØ·Yþ')'¶qÊÝåÓ ¹=ýϦ <ËÆé.âí–Ÿr"`ù3"hÐ?%N.úH"¯sѧåu.ú´¼ÎEŸ–×¹ÆÓò:—yZ^ç¢OËë\óiy‹<-¯sáoM~â//®s<¿À¦´íEY @c,a«r¥UOÈb ` U•+íyDÐXKxʇ7uñ?ˆxÉ?üé ä‹á_ø"KXÂPä¨u ¼È’–P9°›0ÕùõÒíeYÀ‚ZÿÜHÓ‡f 3ù–°Ÿ/²¨¼§C@u~µþ# 1¨5E;ò › «è2€Æ%Ï«´ý„, ¦n_ÿ±Ü×,÷ô¯í7šð;lÿ[Òþk²‚ªÂ/_iÍYlA¹¿|¥ß¬®lpýµ|YDñŒÀÿ |£_]-N²_Ü? §ú‡9^ï 84/Mêxãáê_¦‹¶"%ë¬çO]?¥ëž¥Z’9©x¼x‹–%˜Ðâÿ&y @ÓÇ×6-·ø¿éüÿ7Ékž>ýáêt å_ ftäâ°o†–%˜Ðy1 ÿ 1 à;oLèŒð(Éßù3BAƒ p!´d€ïüÐ?ÿH¸Z2Àwþ¶@Ðà\]g¨òx€Sešë¯ @sýÅ  ¥þâÐRqh©¿°$3š)‚ü²³Ÿ:ß$*4°Þ o»÷@»¦ÊÆæI«Û@~‡¬Ak÷éëndCíï: |óõ´\ÿfÞ EQ©ó„‹#¥2êÈCUŸ«áie—¥:ø.j@žééñä+‹Û+Ÿ®‰É)4ê&Ô@GùC].8jÛFÛOצò…è(†À6ʧëhSùB t”GÓm•O×Ô¦ò…è(ެÛ*Ÿ®¯Må 5ÐQ¾ÛÐ?]k›Êj £ü›$¶Q>]w›Êj £|&êÞNùËËQGùBl£ýtýlj¿PåÃùx[å¿+™ÌSÏ7à>ñAoþ"n§ý'Ø€M—o0§ÉEçóà sš\ôÇr7=œÏ£ã <1¹èc¹x­T¹èc¹™Þ›\ò±ÜÀ#&Ÿ£óoT¾Ÿk>–x!¹äá<ïçÂß¼œˆóÎy\tçxéHˆK»?fâꨫM_Åa…ãL\}5# •# NÄÞÛ¿ÉhåxðÄÑ9õºZAïü‹ú€m¹‚þž\,þþ €ž\n|ÙÄD+ÿÜúÏ ìåÿ·ˆ€ÅîÊ5ç¿$„¡ÙÄà“™‹¨é‰—  T¿¨õ#¦m:`1i‡@üZ.úÇÊëÒ¿'Oèß“ó‚Ôç¯Û/Fx_.å£ýïÎâO€ÄõÿvíOŒm;uýéäa};‚ë_—EÞŠË·ú…~Ô7ÂhÛêý#&8œöÙ㙌ÑPErµœãc‚Æ9^®Ÿ§¿ÄõÃN8µÜctýèd$)¾%$¤ª{X[#±ó’ €±\и˜‰­/whêxÀ¦ä\и$ÏÏõ @RîÚ°SçwG•Kì¿ä`,@,—ØÉÀXo„bÀãÿÅ‚ÎM$¬waÀãÿłΉô$€ 8bü?пnL¤ï$äâ Œÿú×MT¬ÏÏ€ Æÿýë& 2Ör,ÕšI¿öX_Üëï^Œó-ø_Ðsš+Á8+Þ'Ðë¦ßvî€ÓuíÓjäß=µ»©ýë%Ž|­®ÏÙUõζñT]'9ß‚ÿ××m×°…ëï‡à1²ºÂþxÓ‡ÌVر[r†Þ%gРŽ.–Éù©Lf¾‡Î…åñ½üEåR§À÷„„ßhê'ØeȰ±|ŒíåÅ.ÒP>&Q©ôUq8îW-å3Yt«þá¾ÕR>Ö–‚¸µýpïj)ŸÉ¨[ˇ{XKùX»Š©°Ûô÷±–ò™ìºµ|¸Ÿµ” ĭ僛m)s¬öò%Õvãõ‡âÖòoÒù¶±ÿÁ³½ü©›Ü¡©ÿ!Ï7Ä­åƒ{o)_á½nÉû_R}7–Iæþ­åߥófcû1n/ÿ“»2ók¨ò”3Sy[ÿ›ç¼±|Á(míŸäÒP>òœCÜÞÿ¸¾[cù'Ntô?517•aSÿ³¹Ð1L—ÏÙ%nLÓr“‹Á´œ>çu.ú¨…´7;¹èc9çõu.ùXNŸ_t“‹>–ã²V¹æSú%n|AüïË™€€Ý$ ³3H=³I"@gfzf“D€Î:Ì ôÌ&‰u˜@è™M:ë0€O0 @ðq¯¿w5`ãoĸ­ð±,ÏO%®»ýj¼’ÿ“?Iø˜ãË?Ö;ûuk©wì·Ù¥ÍÉ¿Y'ÐÒþJ´ìUj?|½»ãø®öuÉ7Ò~Øø[´g5ÿ,_+ØXþÄŠœ¾LÀK  ¦y€G›-Õþ‰aóéy†!V#j+ÿbñÓŸ:C=²Lš‡~Ú^þÅîÐØþ}?ý)= šÛ¢8uêx“þi~:Õ^þ‰“Ü¡±|¸©Ñà¹|†y&b´Pš·Œ%ˆSú‡¨­üCXŸ¨ÉA@Ù7 Ì šÚOóʹöö¿);4¶´F)ÿjqW\’ýŸ³ó›íå_½y·­üÑ›rúfý_*àÀÖT¾,ÕÓ^><ùÚÊÇMfgMÏ) ˆ{÷1Z(Í_÷ÚË_¸Ëõÿá½{ô0h.ÿZ± .IýÓ<'ܺ¥úßµy×ò䟇¼;/§o.ÿÍâÌ› €­ÎÎÏ;ø?Yþ›o¿Ý„ p†órúôüÐä¢oHBRå¢oHB‡sÉEßă ”¹èP’Pà*ú'ÑF\}?—|B.À®¯õü ´OÃ*sÍ7$yÐÅä0>5x°‘¹e.|¤¿KׯKN|˜dÇ“®1tRjþÿjQFö2ëó€“&ÿ{µ(£Êmþÿ—` — `z¨¦9¼¹~®þR×O®¯IP18Žþ`} Gi¼Ã#£WÍ"þJ²ÿ}A÷|,Þ}~Ýz(uäøˆ4•Uz°Ž ÀÒEñõùñ±Øóíuë¸/ëÿUåóÓá§Ö­€XGŽ…¿ïÓúx¹k£AJ²ÿ2îÿ ¹dÿûȸÿ»rFÐ3ÀLIÊuH+%~+¦$å:¤•30 Âÿ˜¨Á ò`ÆTø e@ë ÄnåÀ”¡\'´ò0ı“€øßfÑ{nßùÉIIaXoø89y~ßsÔÑÓÌ_P‘‹q|ÏÓ”ïbþT]²rÓ7\på;™¿U—,€Üô —ÜIùKy!Y¹é›Ë—?@Âö“¿@³J"@}szïwâq¬ÙÄ/û¶AL¸Ö7#àáò”³Å8²tåË yú:n7îÜc;%´µÝU@¢ùÔmµ55¿‹áèl]× ÚLürý[€u\ÿf`¸ ô‡–á§?}¤†91Ï ç€ÿó óóHYÎõ¤“å/Р¹ý8ÿ|ÚÃ@Ë?Ÿì—.ÍÌÌÿŸ‚ŸŸ™‰-Ìó÷L{ÿà æÓ|º¡k.ú:ý¼§…*}~Þ—Û\ôuúy_nrÑcî–$@ “k Ò§å&—9æ†i¹æ¢¿Ë\ôÁõ3×VrÍc¹y/¿ÚÕ5`&7¹ðëô÷~ûºäœóáuœñëG¬GVB8óÖ\´K¯*’ÎéWàÌ[?pÑ/•#éœ~…μå}µ$öˆ>@䢌zü¨]pÏ]eT9hqýjã§.È•I×ô+ptB­Vc Ö¿!úpÔ&Zæ4ç‹ö~Ù€ÿ E#9üˆX¬…ÀóÛº›c#GÒ8=!j!æÆEµþ‰[‡ï=¬Ûjäæ'ä4òJÿPn ý{ò„þ]¹£ÿºý.‚®Û_•àÆ$Ê÷ø•Dùðð 2’ê'Ë?‚lx²€‚\_¿BÀ@¡±´áGýÃ#8êþ¡×Çu¡i8Þ%hœþU]?O¿ñõÿ]ï!¸~¦ÿƒ_"rÔú[ý°À­€,ÈEÿ°1 @@ÊkZ°¡¼°ŒÎ!àŸÿÛN€¾ü)'€<”×\GšP^?}Œ\—¬Ÿõ£Mץ맋•3Ú€™ó*ÍÀÇÿàzG“ðñ?B™ ÀEI|üBfC;ø^„ÌÆ €S ÿÇ!þ_w€Šh \ˆ­3 õo&´þÛ!º d‡¼™(Çukö¨viÌøßÎOtÕ¾ÿvaË퇃€ÙÚ<*”©)¾k/¿«öÝíoø¬R‡¼™hºþA€% Æ &Pª ø{Y²üG;q/‰‹&ÐV™ÜaM;0¹¸óo·|¡¸ײø“@™ `”’ùAúòÒËmØQþ"f:CH•?!þ–òM&å¦ò÷]¤}¨­ý?åù±ü‹ôh+1UtaT ñ1í((±¦ÛB ü-íG @ƒ R§²’¥¨­ý°pWJÿGÄÀßR>b0‘l¼þ{Ń¿­|˜ðņ™n?hÝöò 1ÉMLpåþë =Õþ«bàoi?bÀ4–@Mü-÷Ÿ ÎåÓtÒZþ¥¢Åb måÃfÖOµþmíG @›þ]5ñ·´Ÿð_gè©ò¹~Ykùˆ }³éúÿ–òÿµŒdùðèê#Øð5MA‚žØ_Ò¤!èi9MA’~¾A®¹èmö¹ 8HsÛìs±\s©Ûìq±œ1ôh*Ÿf ±N×ß aŽ„ƒ4¾Í~—ß%Çì’Ì瀚hÄ·äÿÇÄ[Ðr¥–"×À+äÿÇÄ[ œÏ4Éÿ‰·ºzÓª>žÏæÿs¢'ç3O„ÿÀ=žcæ"3€þ°Ñ•óžâWû¨Ó§.ß:¹&ZWÎ{½šAðóˆÚ‹µ´ l4O¬{¼ÌZ˜ÿ³Æp„r÷÷~‹ï½ãUåHqª}ªòf¹êß•ûú·í÷´£-ÿ*Ââúkù~„…Û~-ÿM0<ð²‘!,]þ‘3_¬ Gèú•I 8ôc'8õõ3ýÃènù8^&~``4‰Fp~s¼GÐÄׯY¿š‚¤Šßñ®Ÿ¶è2|LëÐ*[õKä, _—bV4Ë6ËmzÓñÖ€Ý$¯R4”_¥hÛ ü¦óWÓjýº L4fUÀêgò‹êR€XÀ¬ è<aQÒAホ`Í`4>¸)Öa‘цÀ7À:"&4€aðÁM°N“‚ä0 >¸)Öa|ñBðÁM°þ¸×¿I¶ [€z¸"ÌÆ7Á¾öÛXl%ÍY±GGõÏo»y]%¬·ø@T-N6ß鉙ómk„BGûŽw¶¿ ÿwë- @úú;€ !­å[ôŸî"í*¿)K ÜÿXN¼µ|8·è_à_WùÉUlû±ykùÖA7Ý~—]å'W °å‹}>}ri÷›þ%¯?|¶Z¾jó>`‘0FTÞ²é2©S•ë2‡ÒðšÕ>qÖŸs¡Çë2°-&›Ç$ß’K¾Q®ËTëÏEç×eªõå"¹MbÞT¾.ÛwCýºä–p—~ÅKÜ·¼ò!/P.„È¡x‰û–W>„Ê…9/ O^ùH$BäP¼% ÀÈ¡x.0 ø/ ¡,  Bç„ÅËp€êÉ?Q„È¡xÚÿë,u’@.„ÈÍú •‰V–Ð )r¹0äfȯU7™\(‘Óo›.`—@#­\Ã1wW†q ÊñÈnOˆ«IîµêØd!ÀZÿ ï¹_ÁA>¥WžÒ¿+ôoÚ_!è°ýrÝ™ûðÝ·ðcª|*¢g>Så ÅÃëŒA*]>àÈÂò~­~tG¿Ò?\€ôs|½ŒFêx—  Ž—ëæê/qýxee€Äõ“~n zÆ? CŽ~õ J€® ˆWss™½ÇZΨlðÍ”]¯¶}Œúdž…%@WÄ«}Šu$þ¯Àt¤uܘ8ß.€éH뀗œY/€éHë€+\ ^<À•Î:z`mˆÿ«E'ˆEpšÁ—~@P™ð¸×¿ :b'Þnœ¡l@À…»µ×I ›•s>íoËQˆ…mìNR؉ÿ; € ]µ0 ƒìª{›|¥ƒ¥n2lû8YþÓeÉQ–% 5Q&„ßFùU–ÿöòÉ!4•Ï$[n•忽|rMå3Éߖ˯²ü·—O‚¦ò™äoËåWYþÛË'‡ÐT>“üm¹ü*Ë{ùô h*_€­öÿ*Ë{ùäšÊg’¿-—_eùo/ŸMåë*€[¼ÿ«,ÿíå+K¾ÿ…ØjùU–ÿöòÉ!4•Ï$[.¿Êòß^>=šÊ×U·¨ÿ™6÷9«<…”!OsÍEO¢ˆP¹d=Ž¿ˆP¹dè¤ NĨ\2hÒEF€§»©\2\Ò…%bTNvJ¼É#@å’!R ÑéóKGêè­´ÜYƬõŸ_r5Èi[^Ù‡ã ÆaÊ­þÅ5Àвs ÿHè?’ý;íwtÕ~[¾¸þ[ë?ß凫,†×_\ÿ…×ÁÆ÷qùˆ¯ƒâ4†¢*ßÑ/[OÍxú­û‡ ÐëþáOíÓúßp¼KÐÔÇÛëé/¸~Ü'Ç×Þõ³ý_\ÿ+W¼·±J° ú ä×Dz€ 0OÇ^NÓ¿B~M(,c-õ)†'  ¿@~M(,¸ûÜ·Ž“DýàgZ=÷¬#òÈÒ“ ?ü@+ù¡uD™,€$è?ÍJ~p!& ‰ú  ’XG†ÉH"€þ°%Tò½ëˆlq(úÀ³’»õçj†mõçj†-õ?w®½þwï¶×ÿË/Ûë¯Ëõ· éÆ¿€È±£Û¦>r•†°HaË©Z4Gu-‡ÝºUT.oª9›Þ¹…h]À uyC­E7þßÀ.-yRm —\žÜìü19wåbò4ž€Ï"™ƒŠA¢ À‹[/ßäè._Fùtùœlµý&/@wù2%I—¿óï­–oòt—/SŽtùeÛrù&/@wù2¥M—ˆ®‹[ì&/@wù2eH—ÏyòVË—;xóCEû¿LÉÓås¾ÕòM^€îòeJ—.ÿ@œÀîØyÿ›¼ÝåË”8]þ‡tÞâõ7yºË¤’.¡¢[.ßäè._\œÓåÇ9â«ý:õ À~Cý/¦Q­>Ÿ&' ðŸTQµú|“\}gþÓÇ«ë9ÁZ®‘'ÿi¹ú†ü§åêYN«rZ.HD¬Æi¹‚C‚ÿ­ÉÕq¨×;^×_0KÿI"1˜‘ÁôM¿h–þ;N9"1˜‘ÁÊ%ý"µ(Fú… S@Æ•Ê1—AæÏˆBuRΠ ó§†¹ U.MhÖT P¶32È Àð/ðT‡‘š¡6z~m08Û7ÑÒS[å¸.º>΋?24´… G9¢Áÿš¼øFR¨Ñå}€?Åù‘Ìè`ånÜÎFÈÈ‹ÿ&Ô]WýCK_RÿCã"OêrTKäþëö»ºn¿–Æå …—,ZFù¤·Òåã £|‰@k,*ƒUx¤¨Ë¯õ«¹~MߺPÕþõ1ÚO/ž#AS¯×úƒPjÐ|ýì-ê]?íÿÐ2"6ÿúpÄÕ¥ÿлÈèz•€#¿Ý!_èŸèÿ÷ò™¹.¨¿.ý#&”'FÅÒ²GÉÒ“Ðõk€u1¡_ÀR\ Ù$É”KÐà8xâZÈ I \€./a&®€l’¤É%èpå óæq8þ»].]bz!.À—  €0櫺€ÔŸI ø âú3‰3à@\bÿ—ðï%$HÕŸØÿ þ]A€Tý‰ý/áQ~™ª?±ÿiü;,€~ýuˆßþÝ^/—rø§§U›þ¶È·B| ËÖÂÛÅrl7°^.nºI›:àxc5Û €õæ7~ý7Àlîú»€LåÛ óÀOKÖ7j‘2¸kâ$"[Ürù©ÌQ)Z~:P@d­1ü:à5´_'}IËÇ®Mí—à–ôŸÊ ÐÐþt €Ôíø–Ëר€ µ?( åË vKí×ÜW*?( å·Æð·^Å7*_\Òצ5†¿µ|ÅO*_\Òå§Á¡îÛ~ÿ+>ÛPùâ._f¸[ºþŠÿ6T~:P@®k «þ_n¨üt €”O¿µöË•ÛXùI–‡@ˆŽ^4 %/ïZÎ1›ä¼«ðCóòxözü41’?M €ä-ÇO y¿ñÓÄH^yü41f…ØFÀ¬àÚÈtÊ5º)b€^,Þ“Ü.dqëOr×ÉtþDqR¢¯È²ÖŸD.‰Ø$7 YÐú“Èüó¿y¼1£^Á„yêÁÕŠz5ChîƒEÊQ¯† €YA8¸O ÀYÁ¬ß`ÖtM´Ú[Åóß®ÏÀÛDš»ZƒIÿ_|!À_>·Öà`z»I?/Žÿê@?ñz5“Þž–Ѥ ›ì^Ê÷4N˜Û¦ÊÛôOy !ÐîÈÄmÚï•O±­|j¸­|R= åK~±þ«­þ„¸EýR?±~•€ odzôúx^€¦ã!ÃñBÇ{WŒJj¼~ž¼:?§AùÒWu%ø.8r þW¸_®\‚ÿÕÜ/àŸŽ|}}(æú·æsÉhDz=ë\æ@п5ŸK@+?´yþ­ù_²ZùÁuÈôoÍÿ’ÐʱÞ³ kþ—,€VŽÿ€˜ÍJ€j>Çç: €Ô°_„ ÔŸ c “! @P¤þCõ‰ýÁêÔ¨>±?X2Aý‘úÕ'ö @ ¨¿æþ'ö @ÀËb€¦3ï9sŠàñaÙ1 Ùž¸È·Ûø»ðÿ†*µ’äÁ¶¾¥šÇÇZ1~G½6tý7Blêúû!JtÏaS{˜ñ¤ëhNìПFfµüf[­†úݧö7{|5åÈúoöøjÚßìðÕ”ßìðÕ”ßìðÕ”ßìðÕ”ßìðÕ”à¡<ÿlÀ¹©'³œ+’kÀ¹)¹œ+’kÀ¹)¹Œ+’kÀ¹)¹øýCùÿËÎ6`œåôñðN—ø­É‘U]Ž1Ðõ@È.Ð?|¿ÝÕtý’ú‡o3¦°Õj ´ö#ú錄OÑû¾ßgðI"X¦¬¿ÈOÿp—Ov5]ÿª€3†È'»ByŸøKrè§E{~»þ‚Fÿ…»B7`Ó# Nðý¿„ÅFªÕûO×gÐ ¼¼U¸«5ÐÚæÌ‚-Ñ>ògÌ.¦}’_ÍË’„NVŒ·ò*÷¿pôˆòë,woŽ÷õøÿVý:ôz m? E㉠Ãöûå¿ÕQ>âÿ[¯?âÿ“åC{(Ÿ$@X¾Õ/í)ýºýƒ=ìöxλŽ'Aï_¿Aóõë®^Ýëç÷Äÿ»ú¡õŸ&ÿç±€bF×.`å@kyà¬\l-¯ •›fòZ¾Ç.`åOUKJù‡í"V.¼>¾°V®·rUÿêÿ“4ù«\­ÿ•÷?¿bâ?kñ1ÖÿÚûßœ†sºýK2@Úÿ×ìC‹9Ýþ% íÿëŽä´˜Óí_’Òþ¿î8@N‹9Ýþ% íÿëŽä´˜Óí_’Òþ¿î8@N‹¹â~y–Áúï8@®ø_jÏú“¨#¤þÄÿ‚ýY2uƒÔŸøŸ^ tc Ž`úÿÓ‹n ÂÔ Râz1È*Idê©?ñ¿Ie¨ @Á`/e‡œ»/w³ 9îRƒÖ¿kB²2Ö’Yö¶Xœ{Øæ6¶YÃr[m|(×?Ì vü­¨Ažý9;ɾ©9ÁxÈåsް‘f„ûܯö‹§Ö¶ûU¾x’ma»_å§3ˆwWè~•¯nü›ßîWù´ão¾tsOmäÀŽûvüœæAõbˆ‡Y¾cÚT5î×õwLO_eùÚ+ÄtŸÆ·Yþàôƒ.•àìú üT­Æ }ß`%@»þ?U«1X9V´ë/@^¯Æ`å ùWu°«1X9C²Õ@À è'+gÈ¿Yÿ@^ìjVÎõp¬záHD€TÇ#@“À.âPËÍú z8‰³Zƒ=?c€`5ŠB"ô“•Ã%  BróÉʱŒ/ô € ‘~úÉÊ´þëöAÇíÿêÊ—€‘þ»ôëôqûÇ&ŽW€ðøí^?¿ÿ{÷‡xû¿û~†ƒ@¡hô¿Pî&y¹£Fÿ ànpøË?Sàg¬ž£¿ú0°þ`üú‹Ñõ`O~HÜþQYdú€3žü ¸ý£þ Xÿ»wüú‹Û?ê€õÿòËÛ~ýÅô¯> ¬?Ø€MîÕÎ_g¼!ÜaC=š;Ý÷ëäXoðÎïÔ†Qî­Ï|¢\×óïÏï¢Ü]¿æŒ`´¹MèH·qu.Dâq"¯> ßõÀõßÕþjýtý»ÊïÒoWÿØîñÛ½~~W+¹ÿùç5€ïH×›ÐJŽw\l%Ç»@sÿ·¿]Éñ.ÃÜÿÔS•ï¹ðJŽw\jZÉé4à×_å’P/ À´S( /îÆ…œ¹ú‚çëøy»¤“cç‘ÀƒÿÜ!óؘûÁóuü¼=!óؘûÁóuü¼•#dsÿ1x¾ŽŸ·r„Ìccî?Ïñóç/NšúOÊÔò¢“‘y MýOÈÔÉ êæ#o¡©ÿyƒú#™A-GúSÿòõG2ƒZþÁm,?)õ¿,oPÿË·?¨å°ü›úëÔžžþ󇬇¡Ðizõ$ÿÐ5Êå?8 dýçþ—ï¿wuùaß]õËò ý…x5] Ðf_ô?ÉÌ_óŸšì‹ñj ºìˆÍ¾è’ãÕ°k²/úŸDî­à¹·þ‚ÿIäÆù_Çv)Ë[ÍÁþMvFÿ“¯žÿL¢À_ï“ÈÕóßÀ}ÿ“ÈÕðÏUÿøë}¹æÏ5Ù/€þ»Úÿ°ËïÒoWÿØîñÛ½~~ÿ÷î{»ÿ+özááìDü‰þOȉÿ!Ñÿ 9ñ?$ú?!'þ‡Dÿ'äÄÿèÿ„œøßXÿ›äÖúO ‘©ÅbaÂL/´÷“ áßIŸW=ìøIÐðï¤Ï«ä´÷“ áßIŸWÉiï'@ÿ“>¯’ÓÞOMÿ“>¯’ÓÞO€†ÿ(}Þ¾Éó¶þ““¶þç'ë$†'$bõ?ÿÖ!UöìÈ_hë䈭?Bª¬élýoÀð¯õ¿r£òa¸tù[ÿË0üký?¸L?Ù¿ÐÖÿMþµþªZ—ßd <$ „ÀCEßÔÁÃD¹ü¬ÿÜÿÒ“È›õÿpõŸKÿê5௿¯Æ@È_¯¿à’1Ë[Áÿ$roýÿ“ȽõâÕüõ âÕüõâÕüõâÕüõâÕ4û×äøä’úKö9Mß(/Î'‘Kv;¾ˆÜû$roý‹ oýŠDûvù]úíêÛ=~»×Ïïÿ©ÕJž'~®4‚qæ€'€ ä=9 _ ÿ¶'‡C@ Ê“Ã! ïó䀮Ñ8èÖ?5Of2@uÿ7ÙZƒç˜.¨ ¦çÙ‚ýõ/¹ ö׿ä&Ø_ÿ’›`ýKn‚ýõ/¹ ö×?o{Nà¿-ì;¾ªÿ¾óÏénO›„¬ûqP¦þ{Ž?­ò]&aëþ( SÿC/íRùN“°€u¿ ÃÔÿà•*?ðB}Öýƒªú_VÛwLÂÖý4( Sÿ½§¿ÓÐÐüuÖÀW¥ˆÈü«R}C9=Ü õŸõÿ05ð°ûßÃlû7²lý…x5cÍãÜ^ìçáj jú'²ïª¦ÊeFï“ÊÝõüO*w×?ð?©Ü]Áÿ¤rwýÿ“ÊÝõüO*'ð¯ï“ÊeÝKxŸTNà_Þ'•D¤.Þ'•»ߊþ»Úÿ°ËïÒoWÿØîñÛ½~~ÿoZ­~óÅó$ž°”|¶ÊþZåß&Ðrþ§H´È¾[åìŽÇëR€ «´æÒ~–^åE½)ߘ-åûïÊS¾ÿ®<åûïÊS¾ÿ®<òý×Z Öÿ9Ãdì1@Ÿy \öâiÃ2@Ÿy \öb—a Ï¼.{±Ó0uÂB,^P™ýÁ˜÷{+ ï×ÿ;ÙÀ½¸ùýÃÐ@L<ŒZä2³²²²²¾iÐɉyõ[¢.²<ë'÷­ßõó¹‘  ÙÂnŠæÛF¹ [äßF&€6ùSÈÐ&Þr~iË“?¦OÞ þ³þÏùŸøUÿåƒÿ‰_Uð_>øŸøUÿåƒÿ‰_y ¾û‚ˆ<;ÿwüO©Êsµ¿6ÈÀ׿Ræ†d d d d <®ð§öñD?ËÝ+›õöóÜ?ÚûÇãú\ÈõÎÈÈxÈÀƒÐj>gÖ@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@ÖÀ#¦LyÖ@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@ÖÀCÒ€›` À½„ ÃÚ €«ôäohÊl­d2 ÀŒŽŽÆ î;ßùÍßü­ßú§ØšÏRÁÿ¤ @Yÿckˆ€ÿ+`ÖåÃáÒÒp8l˜e9{íZ+° ˆŒV—åï9Óbÿ.ËÑéÑæ"ÿ'À Ûü¿¸¸ØRÀíÛ|ðAJNøÿ ¶FÕPïEs'§õ_íÿÜÞ}7>ÑEÀ >ð?á3P–‚ÿ¹m©xH7j.6k k k k k k k k k k k`»ð’ÎÏm€˜l ü¿w/Mþ·Qå~ú¨Àè=l!DûŽÿôŸâ·©ÑüOÿ71ÿ79”Àÿ€ÿÍ @y Ûììl“¼¼ˆ­zšÍü÷~ïÌïak0ƒ6!’"O@”ëÿ70%ÍÿL¹¼œ2‘ã;˜ÿÿS€ÅÿŸ\ih^q ÁÍf@„xW·à<¬¾ €„ jüßàø_áÿLl÷É‘ÏÈÈÈÈÈÈÈÈÈxì4ùùá|›Àøäd#0}õÞô½é«Ó "=”ÿåèh3@àÿ{÷þí¿ýÃ? à¥ÈüÖo•‰X€’¼œÿ™`j*aC6Ý@Ò  „ù¿• ùð¿ôêkÆ÷?üá~ô£bKÚØÅüOüŸ¤`ûWôÏ-j;BàúoÒá¿%È—è¿"àà‹AÐþÿÉ)pü÷îÍ»W[œ*ö£L0ÿ³D»Oê6£ÿåŠpÌÿþ?vª\ᬬ¬¬¬¬¬¬¬¬ík æçð³U€Øè?éPN_:…£ÿ… ÓÉ@¤`þÿ·² À¿C” øÿcü(üOz”â‡Þ ìchuÿoñ €)€ÿÜšÿþ ^ÚÖÿ3ê @ÐÕþŸ&ˆÿüOÿÿ¦‚kÇ :¿xX€¡à 6ìu%οPܼyõæUüÞl£ðiú×ÍkžäþãwåÉ'š´'ùÿtK¹ÿ§Î½ý{(Ÿ!k k k k k k k k k k kà±ÐÀ}% øÿjÜva.Ÿ‚H%P`ÿtqïßÒÒåoþ& úüÓßZO¦¸ü¿™\ ÓÇ^wHæ@@Çáeiñš( ÐàPþ°‚ÿ± ñþÓ.¨ÂÿØ 4¡ÿlS› ðõ‰ÿãTûÄ´D\ÀH€tF0o%Ãÿá÷Oè_â¥9ƒäçÎ%OÊpçjyõj"»Äcq§æJf d d d d d d d d d d lSI+6œ–10ðæè%ºo_€Aj û¿úšû%ƒÿÐP9q ü— €$N,Sàñ¬*,Ð" tûñ7¥h7@—týoÚ€Àþf nê¨;ªÎº±ö7÷©>MxÚÿ¡¡+‰\€Åô¨w0I¶›@ÿ7çî&2”3oÅýÿM«Z<¤Òå¹³$’›\¿«É Û¼‰òáYYYYYYYYYYYƒ’ÀXó-Ì«ôñ¦·w£ÿÿ¨¤ˆö0ÿßö’Ðwÿ7‹‚öÿ–÷Ö@à–‹Í9ð•Ø¦œYþ’üœý/Ýÿ¾· zÖ-x4L‚è·Û>D47•H1—xÐHñˆ7p¸;—&l¸ZþÍKã 5¾@ŽÿžK¹ŽYYYYYYYYYY@p}^~áÿº:`[Ž«"ÀO"½›!œ$ u´Dþ¿·<¼ ~S€f€5 þ nˆÛ•·¦ù/ÿò/›âÿF¶ Л~Ml«ýëph´°ß”%J}ñ¶btTÌÿX¤ÓÓ æ@Ò@ΤÈ;r–ìðž!ù”YYYYYYYYYY‰ [® ÇÝ`k@•¢½ a&ԉ̰Mïß/÷–A9Kø|ç;¿õ[¿Iÿüdœè@ üß¾¼Ã€¾ŽL­Íß°-€ÞLp”d>¶Ë/à Ý.  D@ÿÑQ.XmÑ-RΤ"t72ÌИ€û @›3d€ÇäÉ”«™5555555555pß5àÅØØòúââ°9 ÕÀÀø­yX@–#üÔ¯€Äqƒˆõ€3h@sŒ€8зylWÿN Õ`»½åxRÛnŸ >X @Wˆº¾DпÿÉ,\™;%R:¢¦à o—Ä-Ò%¿ïwU>aÖ@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@ÖÀ#¨šüÓ­¹šãûšC¶Õ8v\0•gN†–;EZXÙÿ˜^о²ïøDìºÖ.þ]@k€íôôñ‚N^§Žæ‡ðÏBôt BY~±é2ÖnÑåiÙjtíÒ%ßV×Íg d d d d d d d d d d <&ðÁhð0x|Ÿ2û9¶Õ`ŸüÿÍ™sëÕAc\˜l`FÜÈñM&l©” ’SµlGà>ÿÐÜ­BpþÀßî}< øEt\“3M&|UPššiy@Kl9û¶úm>8k k k k k k k k k k kàñÑ@Eìb½™Š€}÷ÿ ?<¸y Ü/UZ”ÚÎ4—Ö!»@ðöä>úNåÖóoþvïcŠh /šÐ;v÷€ûu=óy²²²²²²²²²²²²6§ŠPÿìVüÿï”åøp|¸|¿íÿH¼÷‡ÜÇ¿¹F<{w!èíÉ[ÐwÝú®"šž]ÿZrÁYYYYYYYYYYYß8 ¸«´8hS/ð?<Ì[’ìmG{Š»Òøm§„|lÖ@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@Ö@ÖÀ7W€0ì6=É•¼Å:P‹“Ío<Új¾S¿¨aâ"¥ÚŸ¼ší§š"¸í÷’M&ºK]½Mµßž)ç²L<ÓºîÜ•‰î\þ Üÿêÿný×ÿÁôÿ <˜¾cÜšÎ3¯R¿UO×ÝSË¥7ÄOLÐ2ç骀߀Ä%KžÀ»ú©=î[û‹¢µíßZû=t*ÐîûMº#ܶvΞŽLgwœèþÿ;žõùÄø÷UÜÿ-KI=ðþßÕýä½ÿ¿cDndÖ@ÖÀ×F ŠëÓ£óq~]Ãþéëü>)ï¯÷/Ú¯ýþó½üòËfòסõŒÅÔµ¹À)ŸÓÑHÍ~-ÇC`NÉÝöí¨Û_— Pû‡üÕoêS¢o믮®ØöWú©÷(¯][¸V»ü§%É Ô'¨Å©æÅäääù”Š‹¥ ùº>¾a†W~úé§!n1ªÝÃo?*`ÛÿLj„«º¼¼ºìêÀm¿_é9. ®^ºýcccýašïœ>¸ ›žðnú€Í>2ðš›uu¼þ?;;kh ê¿óòËýD/;/€¼Yï¿_ÿîþïÜ]¶|Wq;P¿Y¹ÀéëèС]­ý¿:~Ý…ºÎpש£<ðþ±áŠn|GoÖúþ¶¤k™ÖZ.ËþŸF ÄÐ<ç÷ž‹Òˆ`‡Xů¡£·ÿ'O°…öóÙ×=l1‡çÿTõ| /LgûCDWvKíOõäý½#¥Ÿöë|_Ù³.ÙVçî/WWW[‡?g‡JGÎüGÄæùWϪR»Ÿ5¿€Þ=8>˪ó7<ÿÆ;üׇ»?Li´†_Ñýßd¹y`ý?Ù>¿+è˜"[ÔG6zÿo¬¯ç½²²² þ¯ €ë×§®—ø4LÉþû3ÆÚ ìßÁâÿÇ“úç×:)Àð³ƒøà·‹( [>Ç.0Vu¹ü@9LóI “VÁ;¾º~ûvìF;[ÿOÿsÙ?4ÓY¡ª)wוååe2®~´â2ÀL]Ãfg€æ¸òoÆœ†E\êxžÇŠÍü?Ï-…€'”¨/¦R@‰¹‚ংAûïÞýôSZ`µŸ Цù¯\ÿJ›FC¨hy±Ö±Û~§øºÿÕú[wä©ö|öË2ÁÚ|÷pŸ>rA@pMÓ·0CNœ¨Í÷þ Uló;yývtTûqcAïÿàòƒ † ¾üÀþý-þÇ5'ôϯ °»ÿàŽjùß3Ï÷ú$(Džºþ@ÿÜÚú}¼Ó\ lTà>ô¯•ÅXè+€jïo«OœêÍÕáx^öÙo‚thüóûÏE9SPø¶ñ:5s®>_Þ´ ¨vÙxûoõɳïõ%þ‡ôÁ»cb)Bw…=^ë Z™²Ú#Í/Õòt7î’×Möîl–ÃnôöñöKŒô[:ÏÖr¯?ð»AðÕ¹¼ç´ÝÁ>ùO%öæ?ò´”Ë×9þ B¯žƒcv˜4“§øMÿvü«kïò§frÄîõ³öûß'ï+o¸ÿÑ~¹ÿ¯ø†þ¿Ñ¸ÕK·ÏÛƒ>nAûky}ÿ·—¾µî—ÊÈÈxHÀÅÿ0kËü~0\ºn €XÞŸ½ØŸí_œáèÿÊ'ŸñÃþØXÐûW^À¸hh ?$~;àS~zäñˆ´ÊsåžBµ ‡k~¡žìÔí/9´Ñî†)ÀŸý™5g9ÚQœÙ½¿lÛïè‡å*ÿP^KPÌÞD/]{`‹wú_­? øªz‰ö þÿôÓ¤ €6ß9ܧ6 cú#D;°ˆc S¡tï@§—³³ö¦?xcÁ¼õ/ÿ,?t†j/?Ðÿ‘sç€øaÿï¡óúy€¡6Ñÿ {úâãïÕ·¢Â•  A‘¸þ‚ÿggÓ.ÚœãßÈݪö:@|­SôX÷IÝ=¶‰Š{Vs-ÊòÌ+¯®x‡êõâè<µléŸýÙŸÁk*Ð  -c@pþ‡ˆaØáå—ë´Ôйý¿œ¾~(Ü?rÃí¿‰Ñ…ãÁwêÔ©aû…À&§ßa(Ùº(pæxù.E€Ô{$ßÁí÷JhëÕÅ—[½ÝCÆa7×ÅÍÞ)ª£ûDÉ^9m¢û»×u°ºZ¡n;¨;Ãéî`tTÏÖ+±7ÿÙøó¯ø|þ«€êùWß4þ¯¬$ úøsw:9ÂHý³7Þx¶åþ÷ĉÞeå]÷úâÅ'û¿Wƒˆ! Î`kh&aûêÀÿTßþJ^Ýÿííïî²y¬¬¬GIJTJäë˜ßÃû €Æ 9æ8³}tqV'xý>™žþŸç0üŽœ€º`²SNï@äw-ažsžÄ¦ü† ˬ—KÑ8âÉ}-k~Á)Ôm?&€°Þÿ3`Câ×¼˜žLàýÕeˆåxW?P±± âÓ{Ýž°C˜#N6ÿüy8$ ¹ÌçøF`n:bèÝöZS$)àS(EÚ)ð ñ-—ôBY,:)Þëõ±Dð¶zÉöÿOO§m¾{¸ÏŸlº3䨖ö€oü"Å¢;¥'ÅóÛÊT·¹ puÿƒÐûÿà• –s/Å8Ïþ‹ç¦§Ïòƒ –ëON@ÝœkßÕÿ+¢øø…?vˆI3E?`oäõ'þM¦ÿ;Ç; vå ®Z¢ˆv§0Ú!²vwž4ì þç-¡¢:€" Õ^¢xÀ¾âøÀÚ˜×Pž­’sþæÌ™?ûÓ?,|­´a Ο"‚ú…NL<ÃË-q¾é8 ;\½€7Ñ~-øÿúôô©×¡‰Ó¥€.g£LŽo|8{4Þ¢Ëí•džÑû´6õ»Ý·¢GÓv5(gHõ²:¬0!v¯ô†#gÒ!@|ðÁ–I[*à^ÿÕAº«vôÿ _šáßÛÁ‰ùÏ`Àù¶9Þ›ÿ8ãÿ±c!¿à¡òüÃpí??ó§§?çϯ¬Kÿ2þÕµ÷ø™©üí÷¿+NÝÿ"çýÿÆo4ßÿM€W|’p÷ˆ{@Ø[ÆöÕ þÀo5*ê4¯IÜñTÍ⬬¬GT.Àáý:‹r@À ?ÕYËû}à¼éìô®ÿÉõ럨-øú?þ18zú§9ªUás¸õùe \ Y=ÎÿÕG³ôÉÍôÅ‘GãÓté_ɽöMÏ­`·`–BTÌË—.„®Pc¥‡Õe…Ç}äpôc(8}Ài'¬€R(R:N 5›ñùó(^'ñ [Œ-9ǧf(þÓé¹¹9hÀÓž´ÿ¶¶ÿnÍP¤%2ƒ°èŦ ¨7šà\»ºýuñ^ÿãIlûµzíï“\HëÅØªiÖÊSÐÐZ}Hl =à6lÑ‚ÿÓ@ÓïŠâ™gvëÕ¨…רKìöÿÑYéÿå•+ l'Ë¿¦—ß0ò¾¢¿úç®_?§£¦ÿàêû_¯_Wÿ¯N_~ü _q:¡×ÿ›¯ÿ®]ph ØVœûÇéWŸîÜ}rþf‚˜AMâð9´ÁÏ[ Ü ©©Ö’éý€Ãt0Nð.{§óäý¾»\+YÀµÈÉž¾IañRõó fØ;óòa¸$ÎÏ{‚ri /·Í¤œoxø{p‡ µÿ&ކ @Ñ~Êk¿±ƒÐÂ’:›œß¯<ÿØ>ÝõO<¾=yâZK|ƒ=ÞB ³›€Æ'L>€BÞ%U nàk)zÇFॳ¹#àÒêj’AÐö8DÊþƒ.]ºT¥‰VòÆÿz4ü·X-”ïîP=>9vŒóôËüœ@âùwlÐ2þ[€_4?ÿôüìÑôGÆð ã¿<þêÃýñý‘ðgo”thºÿ}qÜ­÷? ÿþgèúo”Ï^KÜ qñÉþ¯%àL¼Äÿû¿•‡Ýßo_\…cãö»d‹xƒô¼[Ö@Ö@ÖÀ#¦‡(ÆÇi"ž.–Êr8>ÅsÏ='òë€ÿ£Ï]¿þ‘qñÛ}ýLJi@ˆáïdLÔ­\ZUó÷µrµz|76 —gäü?—8æ ?¡s„Ò áz ?däKQt¥N€…ßäÕ<í“©(o‚ñ Hf6B—3Ô¿hêÇL¸\ëG5€™a9mtZÌ`n/¨|}‹Ó§÷Jn…S9eO‰XÇ¿°ù¬€ëJ$àÔèpB—¹LœºBº[ÜñË×ö_¾,í¿« …Ûþª1˜›ø?‰š`,—¾ºà¢ƒ•eè€qUß0ÑîÒÿX|ÐÿLbû•Àc“íï—sÓ @95ºÿ [ù`þäMÛnÑz êàßÊÞZÀx¤€,â,ÕéƒÞo'à&‚% ïŠgvs“Ëžº\N D呉®êÿ¤ ~¹P–7è`n½ü++rù Cà]~Xû¯x­Ahÿ ÆúÊ TÛFú¿9ý½²¼wåÊÇ/x7¡ôì€úá.h¸þ»vAA €t€e/p;@})„Q÷jr_ï«;‹‹A¬ýÏvp¸C§K™SiÇõn}sÊ껺üDõR€ÄÂjÂjêÛ¤V!–¼õîo·oß¶b¼0Z!±Ëz8Þ%’Áú9 ìB{\ÃÁÂãå‰éfÁ(~ö3àjx«õóaÅ3O? †à×}{_n.”j€\µT[lÿ½{è•Z<ÞÆg¿|ù²‡'Þ%øqDA9ÝÈVF@>ÿW1Сú“ã©¿¨ý¨…´Oö`ý£Çwqè{ö ©ö—Ú~{¼Ÿª¹Ôã­è*2\áA@èø?u xS ‡^BÏHûP#.A‘p'þGû„ä ¬ï93Œc~C|?ÀøêUÏ?çÎéðÏìølŸW>9&óì@ñºÌ '`‹1Ï¿ €†ñŸ+d¡·=ÿ´~Íã?Oÿå€ãŸ>þ¤âzÿ_§ïíŸ"¶ýÓ}”0¾ÓÊñ¶(Ÿ}öÙàþ_Bÿ»Æ3€ˆfhæþ÷ÎÄ@s£¶œª(—t8«/ã3¸=´†‰þÞÏîoÅÑsÐm?nïçýO»ƒ9o£û¿é±š¿ÏÈÈxt5PÅ`||¢@>@0`± þ9"GGŸûè£ÙMt€·æë 6†?ÌÃ>ùä ½âdÃ#y©œÇþú¼¼µßºÏaâÿWåü?/_}ƒ¸Ÿ­˜›š~õc½ˆVùPäáVŽ–C+÷ì/v¨í-®—^z;x´!¤•C\QÌN „ž/9T€¤B€–W–‰0ÿWV–ký˜Ö®®NX/ÏPÉv²¾ÅÞÓ§Ï¡cÅ­òôÞÄ vjj” ‡à2€‹É}à+å$“´Ås[0€ÅŠKÌ GÞáð)€z]4KÛÏymñþÑâî§Óåm¯ýv:Ø??yžðéNYX— 4 @¥Û~í,>èæBbÎÛÑþ±ïõËé1\ÁÄýÆæƒ{ þ#uôž Ë7u»ÖðÏz“ÖñŽlR“Ô¾¼¤€S@5à›ïɃ?&‡¥Í‘‚w@ ŠB €`\Nà”)N>fû?ðÿ á€÷–0—]wÞ Ál¹æ_~ÐÀÿ÷ ®pîÜ@ãZ•¸âýnrzL€ñèxÁ'0ùÖë™Ø«¯&ûÿ¡ïÚ|t(yýÁ ±,//ÅÀ£b'Z 3kS9@Ñ|´U!éÕ›7m喙”^;ú?K€ €ç©írÎÙÃÜ aéQõS€¸.¶GUPâáÕNMI€Ã¥èÙy¾¡%/——o_6b¼‘ç•{m_.'ðX××ðx)¾ð²Â5þyBèÃó+œ‹»hJñ¥/RÒæ¹(º{ãYØÍT~Cêç‚`²_OK€Ãåx€`(A LL˜L”‡¹^(ðCPž€ô°PEIû?¾wÅ}ïã¸ýSåÑ÷J„þt‰7ë%Þ¸YeÔ[™'þžž_rÆ@36LKûõøTû‰ÿÙ>Ýc¢ßþ¾WËðDdÚoá“zØ0þÌ>Õ£+§ÏKÝ„äs=£ÍÖ üËoŸu€äñæB8Oçdìÿ×Õ ŒŒXÕÑÿ§úxxáêºã¿yþP`X^@ÇçŠ0óXþåøhþ#]øóÏϘñÿóÏUý=z ÚŸ<ËøòÓã98&ã†ÿÄø§½·“$îÿgÑ?­ØôOïþŸ*'g­s$Þ¯Áýÿl9bÞÄ»xñY¯“àct~ïþ‡®1ý³%àør5ðqãýQÉÁ?ø xÓ¾ ¼ ¨ÐdûmÁe~¶Ä#Ѫ‡D„ÿü‹;|þ&k k kà‘×€%›ù—`a<$þ¯q s€ÎÏaz@ù(&£Ï=×ü·ø¿äÿð@øióàØ9"ç{K×®MO_»F#´>œK]0ÇŽí¯?óúÏÎó¿Zb†ÿ:hng¨  L¯"À 4d(ò`Ãüc€•»qþ~ûÆÐ>4öF{,ø§’Ýìá)‚yä2€½C'KÈø¯ÉWAa+iTú1s¼¥!à7ÚεQœ<ÇßpþSçöž»u §/N—%| ªí"“IÌ‘#¤ÜwìÄè`´ @âŸë£¨Ã ¤ð:£×ïÜó)TO_€JÚþ÷ßÿ2þ€Ð?-n— jpuîÏ€ €üG]8ÿõc0-Kè@Û_õ?)Þ릃t¶Ÿ)± ÝÌqâ)¨4×e©ÀT#è|®+‘%’S]³Ì“EÒ!‹lrr½˜œݱƒ·Ë¤ë¯ö§0$ˆŽ°“Ö§÷{¿5`i€Eb~+'øß±cZ €àÜå—P@׃pn=½¿oò/ÀÂ_\ü^~ô¹Z^¸LàZ 2 æ¿ýO€9Øÿÿq-èá™@ÛûÿzñÂÇ0­òô‚ÿCÆéÿ¯‚*Lô" ]€G£ƒ] ÒÖì¥D/ä-Ý¢5wªô‘᪂«7kþ¨"lŠ­0x•£ °ðÊwùO›@³¡~öŠ ×MPçñ`®8 °×¡Y˜þ`€?A U *@ÄdÎ0Ò·öïÞ@äx>Ó¿@¨J"?ƒ9¾˜ ¯]ƒϸë¿K¼.€Ï78¿y.Ê)JÀüšø–|«÷‹Ù@?`¤ü‰aR.ÍT ˆ™ö¦  ©Ñªò†øØ  l?zÂã ¬¨ÓÓ^û9VÍþÃÅ€8^9ox—»íWüöéC@‡¿Z®™XjýÓ³í·Ç>½\<Ã4GŽH’@¢Wîn›ãƒ  ¿©6r aßÖ,@lºç V?ë@4¯urÖŠ=àÖ z\ vè^^;¿íþûã¿§ÁÎãŽ,Õø¬:âDGç?ý—åøxþÃößúÕ¯ÐmÊòW¿*Ë[·jíÛë\ÊóüB×ó¯müŸœ\LŽÿÀÿÇšÇ?Óûß7¿  ¾ÿ «ý·¢wÿo“P¹I@xý{Àÿ÷ÿ2æ€ \„ÎOÑùƒþÏáß–@üÏ9Œ;ˆñþ¨åoø @ñ¦‚ð!±¾=ôîÚoÅ`Õ£íO,s?Yó7YYY¬Ì*°í †Ãá²%H pýsðj¬XË{µU\ò†`ŸÄ÷Ë…Áÿ‡ñµmµ8V¬À€³™œ¸øVÿׯ¿þº%À¼ä€1ó â*é>Ã9"ÄôÈÌ€8²rΰÌñ~û„ ÅáføÃdØÛü<úlYN^›·YÀú}dCÄF»ÿÊÊÒPñÿr¥­Lòå3?¸‚bªìà3þ·€ÿϳ€[."þÁ/êfŽ÷›OÈÉ'§Ëñï¡q!ºT`bfgÀ øÏw€ÿ¯_·Lm/`ûý¿ïßOïï—åÑË·ëöÃ=íþ““ð‚ÿÏ×AÓUÔGRÚþªÿ)àö?Q_wû‰9ûcG¦ŽHûÃMñßò œg±º®°YmÉìWazŠ[Á ñw²H:3d±€ÿ“$ðñ<àÅþ¤€Là8bÚE0üÞor h ;SböK%íÆJ;”ŒnH>&ýøÿŒþ–ðH^~°ƒKKkkÜ!+ð°0Šÿû}þÇÊÿ;$Å­ ®›ú?ð?_óô$ë¿{ý_þ/Ax·?vthnj.yý•kè5P ·‘(fD¯Š‘<ˆÔ'ýè¯@eÀ¬ú‡MA.â`áÝc€lM§ôĈâD¹À\q@ñ¡†û9Àè( ¸CºÜ&ð‡7>üÏ”4ðë¾|™ŸÉJÊáKÅ™—‘]¼ì! @yø0ô0Ç0Qݤz<è%9~iEÏï*À`X€gŸeýjâcú¿ÈÀÿØå“ˆålfy}†Éô4ñ¿…@ª)ì€úÜû.,þ^Ô~‰{yÿ(aàÒa9£jv>Œ€+ ÀËkl¨7B©”_óx´_x>¿Øöqph{jø“3ÈèsàZ ‘>…9½œå8¼ ™å$¸UŠƒ”% ‘òÂqðþ/€‡Câ§/;‰2 Fp/~»~ÖÑ áx%ßêû3~B ðüðOJˆ©ÞM`ÍÀtÿ|þÁ=ïôiôJ˜ñY oþóÔÅÿîüGnàþq ØÿóÏÿ]@Æ¿øŸÏ?œ¾ãù·µñ_ ÿ„cpÇ¿òYÀðÛǦ÷? ®sÿ¿ñ3hÔˆW šÂÝû_¼sf­|¶=§Ýxÿþ ýÞÿÏâÜ•«4<¿ßÿeúcK@퇾Þÿ•\=ââ¥Îhdoφö›"ô€úÕê1í÷ îÄó8•555ðHk@ €%šfÇa@¦¶ç 9à ŒþÀÄÀ `þið³ ÃÛ§0âqà{ù©§ ùß•Ëä3LqVVìÜÇ™Àþÿüõ×_}æUP (_Àó€ÿï €Õ%N^ à 1&ÿ$†í€ÈiH`¸§·O||'`»ÉId8²€¼Õñÿâ VD@`œâh’æ¯ýÿ™Z`3Ùñ¿gž)ÿ†&sçNï=-~†˜%œ.oa¶á¬ƒŽÉ®´ó(9>B°ÀÜtXD CBŒò1ócn=$xTŒºXc¼¢¸s*Áo˜±L—wÈöÔ+"ö׋£G¾³%ä­¶ÿ™×‘ñFüþ''÷‘ú÷¯?ÁH‰´xÛúŸ^¤®öÿÓàˆ¶?¼ç´ù;ÈæÏ£ûÍ»ÝÇÆÚ)®s/ɵ™›ãPxq09«²à•°cOð`‚xâ‰lvêOvÊóab¢"Þ€Ôe’€ªï°CŒge ü:],,ܸqå )PÀßa.?ž ¸{×Ð4vyk!îÿ’ä‹àÿòÀ¡bܼøÅÒò*ï‡xÒ$úÿ8ÐÕÇøøcž)#ü__ÿgˆÿý߀M]Óÿ:€Cô T$9ÝØ­H€¬Oh÷ßµÓéR_ÃÿÔ¶ßÊ3R °ðÎî3@&‰¢Sz<ª0Nu§WÍÁ–Šç66’ŸxÌŒ£–éÀÇËdá~ûr!€+£š(_ð|¶ñ𥉀÷Ÿ$ð@ 0tHÐÁ„B`9ŸÜZWÀ™;a6ÚÿŸ•ú-VX³ÀüŸXVñôo €€#¹4ŠeûÉý þçj“Õ­¢ÀÇd°¡“†í—á .4ýã%"þ ž+‡Öw¢¥ªöËùœö“ÚóÚvøÓö…€”ä¯í'|Š(rؽ§ŒjAžŸ1€ÁYȲD—çºÖJªO²ÿçA¸¾suW~ÈdÿíÅoÛ–¢j ÒÇ3üÞš"$iþ'þŸ.8uH< %PÈAÇeã?Ú·w/‡ç[ç˜ÊŽφ!ïœÿ°ºƒòXù/~uëÖ-â¿ùèçÕóO€¶çŸàÿ ý´7@kip¢ßÖÿx®îö€‚0í1œ6ŸÉ0Ï`óçW]üo§»Å3º †×ÿë$×´Q¾°àÍi;?)1°êü?901ñR@Æø{èéÁ’12ÄrÄü÷i:À”ðP‰g¿r}žyz7úõ3Åîpž™wļIGÄÿW÷àÿƒ~ûå(… pê!\\„@¿çàƒpýwf`:ñâêêÖèDÿªBùÈüÿ1 €©ù¯¹ÿGK±ô$ú¿A@ ×ßôÿ†`-œ´1b Ô¤ W9993Yj>0iÛsè‘«WÉhÎ" sL¨ô{°üÍçÆQAð¬uÏ2@$\yt% Ôlož‡‹¬Ólo ‚çs}jêúu0® áà øhÂ.¡\Å›*`D9ª aÝ#Ѿ‚m î Ø<‚ÿ…Ð ö?šž']@¤ð?u €€ÜÚ p¬ §Oc|‘ø%¬¦«öWÇû–"ï}0}À€;å\€0÷A ‰×/ÀdH{¾xþyÌ„ˆÿQ¾þ•†Àeä þJÓþSÓÓ XP¨F¢ý«¸æÂÁÄ:àD·­ÿÉ5²×¿©ýÿ˜—Òô#í ®ô@§¡³kI%_m2ÝÅÜöÎ_—”Îf–¹+#Oùè~î*x´€1ûiÌ0 ‚)Ö¤ç†M)Ñ €èš‹p ƒ0Ø›%sþË &¾KŒ‰¼¤P ––v;T •ÖAÓék–m_¸r¨I¯lÀÿrûÅLËû˜@uBïÐ>ÿ)<óŠÅŠHö”ù1f½/¼ åÿï\ZB N…€®ÝÿS@ q'M´PmXðu$¸ÄF/î¿àk0W§oâT7ñ_+ö bþ¬ø“Õ#$ÀÂ\º$ I~/¥3!~4ªÈ€¸J˜ß.|Þ)äP£6[‚–Ñãø„@˜+ <Ãëå¥K$í^ ¿R Âs>ßMðp“<'zÂj“=Hàöd*I>€k{<úÔ|”)UJáo ¾·õ#ÎÀÖ¯&ÿ? z)N%n€ÐÅ€5!ånù†àx €¸AˆÇˆyH³ýüæÊµ_àûz )pâP¬#ÌpuõâEŒ ¤1c`=(/Êñ±j¿Rõøgо€°ÃŸi@gŒ1õ!¨ðI|M¼1HæØ¡S¼œ€¤z$ ÜÜ!XÂOïŽ|L°–KîxLθ ךÀ4½Š›ðà^.Ë•] ä³1ÑU`!—_&éÌS0@å4ç£"ã Ï5I/¦ŸH¡€Eãñ8“K„YþsØÚ¥"Àù8”¸'z¿Ë“’é\Ô@0^.]2¿x~Ÿç»ù•§««@ø¸‰þ37OZŨ”Ãüšâ@ë'³n…Z¿¡a0ÿ7Ä8|Ö#`cÀƒT¨A4•\žÿJSZ„ Àæâ¶×ß°ýREÀüFí·îAm¤ÐMµ€ﵟ5ª€¨}ðup=@›þoÛÐ#øä]/-|òËg] A<Äœ>F_p6’žŽ»!FB‘]€— )€YÉ—Ëœ€õf\HzIBHhjÈá•þ0¡CÀ$ 0ܲ… p‚ÿ衼Iâ!i`1_ È‘.(‹ôR¸f€òXj~#ãÿà˜×ˆx|®ä­óê÷sÁÿvü?¦“Ùðü;¶Ùçß1àù–ñ_¾ã½ÀRPb=þáƒ#/iž×Þ_ßÿ –WÀAÿ„£…O@އ£þÆ÷¿)ÆyÌ.¥íÈP{hñ^ÿçm^õôO|G™àÑ9?{ÿs!Esÿ{€À ׿ÀhxÐÀ¯ÇêùÇ èS̶_\ø+÷?ÚŸ o̲²7 @³®ñ‰÷éìì˜?v+Ð(×c„çדּ‘8ñ.§®ƒ8O—s•šqy?'þ÷Ë/žq- &DuFXL-ø ÎZð=l̆$€( Vö}ïç7ë0BÉæ]$CDåsU`Oq`ÀùI !°³ýÏö ÿ×û³B„í—9=æ_œ±þx‹˜š`âÿJºÆ“-&ý<Ê Ž@ñl…ÿ§ææw”ûDÁ†!*àœE± Â@yÄÿZ>¢ÿI0!]Üþ§Ž2àí£hÿS$Ø~Y&]Âþû³BD×SÏ9xsêê€_ÈèºÉú—ìrýüöÃH´ßâi¿Zàüö›æ[ýÓ Åí˜â2üäUNqá…‚wˆxµ;0ɵÌya!‡Àñ?gÈnï l’¶ÿ‚ôPôI)s@ÒþVb¥„ˆPU¤ Ðu`„‘ùïÄÄê šýІ$ | Á±;˸èW¯2þ^Ò;po˜ä'”P@@¿Ñ 0dÀ5tB€º¡âÑghâúÓæRaÿ—ë¯kþ™òº®¿Åÿrý¿—¸þ¼å¼þïv³Ëc5 qàö ,\<èßQž‡ è0ãw’H7üKüÓ€‡àÙåês/±÷Q8)T;Ë@_zø©x °gá€gMŒ¸×%˜Œ—Z,÷óÎxN{*P¥ •þ—ùlˆ¨w=ö5-(”ç·<Á)ïceP$G—2ƹ2ª+÷ïÙ$–ìÂÈvýàŸŸEÕ õ«l¸OcþKkˆÊø.ü-€õ0Q>¯¾\l;°‰¾ÍëàÑÙ~¢õ¶öCð9æéQAiS§º‰;šÓ~£~‡Ú‡ ¸©Ô¸¨†¿ªý^ œÀo<± |b3ý9‰BÐèoº8Kº_Ÿ<ñˆD¢†8”ë>€ƒQ@¼ŸÄÀ=”T˜/ÑÉ€”~OxHMàñÆyñ80`J¾„ïùXñÿfˆL‰Š dð¥ ʲÀÿØÐøOõb‚TÏõÑ2ÿº‘úßûŽûÜ>_„ØÜóo”1.ÂÇ`ì¹€'€á?=þ‘ZÓ˜¼ÿ•h¹ÿyxëýÏ~èÃêþ+´DÛÿ«âëç‹ÜÿÖ@&|œ‰ïè “D½©% €¹³oö£Ùùøs^˜&IòÓÀ›^ó‘üóÄù 7RF̘à™Ý@„3 düž å¼8 Ö5ãŸ6[/]Kp#íó&0ÕX¥3B<l,¨ë 'ÛöŽ`È€\<Ìü3}€}^€·ßv.€Sÿ Ñz¼Xó\vAóÿyxßã{¤æ‹pyrâÐzüç´¶"8´ß©Ê¿sÇv€”Ì è)¶ß$D€þ‰¶ö›ùìüª¤ 0:XÈuîè_AûÅK×k¿ÀO.ÁÄna6ÿæÓæWes=Åz‚`Ï`‚K€Á(•ð¿tYÌ;^Aš<:CöºÎæAzßÛ9>! \˜Âézñ)׳êGÔÆ…8AÈtÜ €„óßÂdÕVçÝ¢P"LsâîP,V€± ‹‹ð‚•ðþ­Ñxÿ»Õ¤fט*‡¹9Ì>M÷?=Ÿ%À¢\ÔŒ˜íÿ÷åúú·?ú¿>‚‡¯ßÿK§ðê FFà7ìi– ìà Åyúy0@ßø*ìGÀÕ«XT@ ää fPYÃÄÏbç™CFÑ3 ,édÜrðl\?>„CÏ ì>îí¡ŸXÌEú€—„Esô#Ê_ýlªÜú¦J”—/Ñÿ— Z.ð§\ÝfGã„ܘãÍ Ç=¦Ø¿XöpsÈ$”ñ¡>¾zþ7ÖÏ'Øÿ5©’­s OlÓ@ýÂ*Þ\G`Ð^\ð-`Úÿñúÿk*À ýØ×´Ÿú‹TØq °nµPЦz(ßä´ßŽ öD p´}r¥b€Ã_Õ~©R5j ¡ÚGà“}4>àââL±šÞS h•9z˜‚S2è$B£›Œ°P` °¾4AòÀ˜/þà:ÓÀB3}u,ØM Ð¥8ðüC鸞š<½ç?а\"Å‹x–HÞ#ILÄO¡" z¤æýÏÁ qü˜O‹¡Ÿ²& >7?þéøï&(èÿÛÆ?اq åþ÷îOÿþÇá¦ÿs©äóqÿ— ,ádîp7G€J›ïfú§Ã»xA99ªûüæþ—*U÷?>a6Ã;¹8–Ñ=…3.p´ñ³Ъß~s¸¹ÿÁI‹Xç*˜Gû%„úü9k kàñÑ€YP*¬Àóûʥã•s,O@î7€>5§…íOÿçwŽÿ½Þù±€_ë°3'yX×N- ÌXŽ‘q|uê U A–x¢W½m¼}>ER;ùbÅ?q{FÀG ‡AûÕ€ìC5ÃE㘠ÀNôÆÍdª‰LCçDÕ Dð[ÏÐãæcO™ÿïÛS:¶D€pUÍEI` '€s.ru¤|Ésî•_éÊ£ˆœö?cÚ¿o_úúËåd»a¤RÕunèê൳tçòsU2 ãBL*ó¸‡JóÍüCè§ À0"|}ÝÎ@™äZ¬N˜Ã^¹rc€™!û}±€1b\¶@2͹ þ4#ú?õvS™dÚ‡—"]8|@ç¿ÄO¼“K|Àh ±÷§ÇÀÿBÀ€ÀC=`©Šú?ân4Üß¼ükÈhì¥Ñc ÿTÿ£¢€,o( ¼¨ÿ;Ï€¬ƒò»¯?oàÓÿñ4H´ÀïÿN(p^]d~Ç«<ƒ(ní+ü<˜ ¡ˆ¸ø_¢í]@ð7¯>Ÿ‚Ì‚êå@©ºaA)@ÈÓÁÉjB˜%>ògÅõ+pÿ#HB h^öd´|fpAfS$qÁ7 ‹˜ð5í=À#@³’ðY€K²85 Ø<ú&ž¹ËKÃqæq—ëëoÌúyû§5ˆä#:è!çuVH×Ï<ÂÌüŸýª|`ÿ~àléã@ü?ª9cšFhû% Vª ÐÜ~¤F6Qsˆ«Qìß…´8¨õWµßmŸ­¿K8ßÓ~wä#AOlLÈøN(Ïd×ÁI2Þ³ÏðùŒj‡{E¹€ ÿ÷íƒÕMhv;¬¥.^GŽŽ ÀýëBÈñJÔ(¦¸tSL!D–OÀÆ$p ÒðñZ–ïÌMÑÅfÑ'61¿‰ÆçHÎÔ€ã?WÀŸ¼œ¡S€ßÏuüÛÈóÓ˜ôëG‡ÿµŒÿ-ãŸC4ßÿ^ÿl¼ÿqáÁ„ý¿|ÃÜÕmý_ñ?'@ÀésðRÀ‡¨ï\öjœøàÚOÀ÷M€ÿ»€Û~Û ½ÿG% ë;s®œñø¤ÏŸ³²# (`F"Œ+CÉÔê žž|+|·²Ïµ°n‚€iKæwÈ7ð:¬ ?ÿ¹”‚힟'â9 ¨!œuÜ…äG²‘MàꂪØwtÛßÚ>C‘Ð|À!¡6š5Ï€,·++Q„²Þ ·®?Û© çãVÀrÞr €´õÌô& fdÁøÏ €\ÝH¾&á"¯ ÐD\‡ôÎfˆÃx9Ý~NLN¦ÇE8‚íÎòµ’èJøíÇ*Ønû‰ÿ€îßÓ |h`—U¤áí"ŒZAåVbJ €&j¤   j3§† — Ô„íÉš3Y Xtgt‰ (8$B ¡{…Ô1.+æôÞvþËú!¼catàÆ €áÅP޾zu±`Ùtæm€ù¶Ù¼ûû ×aú ¦3T.uá_~»·,ÿwLLx¸!–ýûý_»?Nÿ1V¸w/(¿óú[úÏôòQäú×ýß©"} 4œ%„ o Ö°"ð6A6ÀÖgJÀÀ®xÀ@/ɳWùAÒST@X?õ‚íU=\pû»ü˜Wþ¬ð¯ALV=¡Ï@ÝÙŽ¡`Úÿ/á€õ~a.3ž´úÄÅÆ4€âååop‚"ùÀÞ€žzy Ç<àBz¼ãÑP?`ÿG´Áð÷Îþù91r%½‚þOx6 Àuy¼ø;´ÿ#Wñ€tû/#Kêå$€¤ã`àxsóûßyÇí,KØa°7µþÀ´ÏÔß{|›  í׬·äŸ‚ö‹®M]Pôê;þ-¼?d'C„ôiu­%Ì>¦€Ñ)+Ò›@ÂÐ;@Ü8æJsoçxúÔÇKäúåèÈ_èÀŽ W¡øŸ!”‡bR÷òú;ûçæ t‚¡!,ºñùM8>‡>@Móv&ŒÿŸÿŸ9c€ªƒyãߟ›ÿÛÇ?v@cï¿6ôÿYÆ€Ä €½ÿœ;|3ýßD sK¬>÷þåègÆ¿¦þ¯~¡àú†Ø7Î,W²¨Ó~ïQ¡ )réQ2›555ðxhÀ#h¥bžÖxS$T<¾šãnª} Q®a%qü9’Ô¿?\ @Ä~’}f¸¦‡8–®Ëÿq±áÓ! ãØK€T~ºÒ3ÿÿü¯ @d‡F»§1õà –zP›€q‚êp%À;fÂ÷`¶ŸsÜÛ·“í?€4é$š„†³|3ý³×?ÕÿHt´_"ÀLÿë$¸ï«!ˆ‰²1þUN85Dxt€çªóµJÎr°FBS§×’åË?pþËKG¿ºR<¾7Å{ð§j¿€üÀûENØ?%4Wèé§=÷˜š ³!3!N…£©>jÀ•n\i!Vп×ÖR—Ø0 b0åZfêAá…ýås%@˜X# ãúKðíÿt Ûô·sKxuœ]áàE°DÀà"  5:ËïÊ €ÀAIû¿3š@“Aª4­º/ñ?ny#& sîÿ¨|„p‡µí4¡ž×%ˆÿ ÿAà½PÍùîÕx¾Ë& µš*ã Hφ¸ å2>0û}ÌáÅ@$ëgaÒûÙÿŸ–gÊy<,‘ªÞ½ÁÊwæçðôùoÐfÊ"ˆJðÏí=ÜøŸð‰€Tûß?zù}y8Æ @±¼*€4~ejð?žDwCWà·€ê îðÇöaDûý\Äà€l=# úлøNG@ÿ”€x\0ßÈ 0+‹ÀøOõ bØú½ÐþÅ1¾rüÒD|<) üÒ‰õãèM&²ª‡Ü„ùA ýüKxýºú€Ì!û0ÕøWó*ÈŸ yþcÆÿ[Xà ¢ýÄ Új`ËÏ¿îñ¿cü㣎›ïÿ¸†÷?2àN’À*‘T§÷ïpøãGOò_ý_© IO'%teÞ¿õ-ÞÿoÄ÷?‰_CpÜž÷ð¿vø¨ýÕÓ•÷?-ÿJèJ±ÿKãm‘YYY¤€æ#¤ÉÅ9tÇ«·jøׯ#þO3ý€ÿøñrÄÀÀÃðZ<ý ?cQ}Ó¿]ð¿2€™Høb¬ãTQ<¾Çe„ÿÇØ?U„&@š\1tP\OŒ9hm«„ €ÄÿÈtÌ û€ý!V{‚ÀêZÂÀ°ÿP¼7þÕ½½X@ðÿiŸ°óº¨Ëñðð®™ÿû…q jž©î[ß{€ê‚øRàÿ¦ ´Ÿ+Þ¾ü~ªýÿŸÇ¿4ÀU¸ì,ßÕmSÿ3c3 ¦öÿò ²5.>ÐT¶3ÆK—#Ã$ã{0ƒÕE€,'„"áh˜¤¹fˆt^Î 2ÔŽHñÁ í{½¿nÿnÞÂøøU¢L€zLx1µ¡Eèb1–¹ì¶ÿÄ*‚ÿ¯408+W\ÃRî àþþïŒÇ /!@çMý‹¼ ø**¿³ÿÿãæ¯ú‚û¿û46°9:Ü5ºü‡vÑSíg2 BtEé>Uÿh1ëõŸ›&L‰‡ïì’±Ú‡§v’ipí£_?€ˆùX€ú åƒ¹Õ 1º‡_<Å;ܦ u;'À1lXœK üK¸7`ñëæ-•K÷`:!‚u0õ«1ò`$ÞªxÚ}Bbè'àZ‚3Tn Ü)BxÜž1µÿ¶ˆH,sÙqæ˜äX©!ìctTëÏ÷¨Û'!Zä慎—3ü)Àh°D‚ðÙa(`¯Ö\u/÷ñæß-€$¼–XV\øÜç |ò ·€¤ˆXÀ»?…ؤá_ù/¿gG%p€I8Œ—„õFÈýPÌ !€ZVàÎo¸€?>ûC@Ëü€ZàÛW;æ3Õø·ÁçŽßôøïÞ~8>¥#W¾ùþû§‰`1‰ ŒœÕýǵ<£9`kÿ׫/ÄñÀòÎP<êûƒÑáýÏhþLmx üÎØÎP ›:ÐðEš²X&@Â`A$•Ç&@øŸÊèŸ7Ú>L4`ÜÆøülï `yÜI f€»ˆKþÇ!€BF9Ë!0Nrzëq Z”*ø¿‰áY/Žb­kÁÿ çýÉ4Âq–ïéÀ!’ýOs‰¨©ý² dÇ"ÀhÀü#Y¶;Æ“ßÁB€è„¯6ÌqËráÊ Üh#‹ùrÎ ç^¬ÐÇÅÒ‰µ‚÷‡8¡ãöCxªöýã—= ¥ú@ÿ޼¯»±,0÷ ¯c!-~ª ÁÿàÒëèbuÄÿ¸„1Ò?ÐŒH%®:²oGמ•t&À‚ÿ1ö×è¾þ†ýCÿÿžôp¡ @Øÿ=€alÀ¸ˆÀoÆ)%þÑÄ9#@ŸêˆqaéýÄôwŒáðòO:õ(%þüë{ɯEmT•…¾¾Âêz @Åð§ÚÅåÿó›0q9‚ptÚ2 Ž€q€&nòŒÆŠ A]B9€…øL9±ïŸy™ÅëŠ  Q?½ Lï—N_”˜ÏÀùÛ䀗¢œÇ«\}Ü;t ø] ã ]¢ö3ôEIý¬žÇõ(ŠeÀxƒ1 ÷H鯺/ôî®Ú'\!Û>¥¿uø3 ob,ÄLj·¿ÀÆjºWL`m”×Mφ‰M_rÀ% ÜæP0W¸äj¤áÓÏ’!¤‰˜ZÒçÛÕð¨ø_8Md«‘\òÆP0ô )×@Y®ñ߆Ç®ÒëÏ!Ð8ÿA@k}ÀÚ‚Çp/8*ØäóOŽßìøÛ¸_ž¿r|"MGûý¯z!¨R÷wÁ ?‹Ù‘,!³#CÀêþBG“÷gúÇþËD(˜IÖ‘JÁýAù³Áý_ÊQÏâèEð@ÀhäW0ñüs&Æ@º$nŸ†{"555ð¨j &¸‚Ö*Ÿ€€zAûàh+ã2CÌäi ÿ^>€ÿ1Àé·<ò鈘~z"ìø)Ø€Á„¨q…ÿ—8öË)ðZÍ2«Ð.8>‚ Ó¡à)Í¥d^)ë˜;×ÃÚ7ºÚ'€àð“1ês¼2Äÿ؀잰¨ž7·7ÓŸbïiÌ/NŸ†—¡Ï(Âü¬7~õxÇBæûœÿ€ 2‚ùCleÕ"N˜úKª;D ¸ÔE ø<Œ€}p˜<€ÿi³O!! |Oæ:7ö?C´´_¦¶@üÏdúž¨©l¿—¯*ÐÄ”7” öè³_ô¹[":+mÀòÂÅþX¹ÒöBlY'¾N_]ÿW‘b÷«2ÿõ}”À-R "òÔ7°NxÅ Ò|Ë9°uó±ý‹Þ€õn SÌÿ›4¡†™©?Æ0€˜Pä_{y$hK‹®®\@Àtö Ðÿ… °+pÒ^Ï­~\}ɨ@QtOà Éw`%°€81» Ë\y‰l^ª·½;—è_òÊsÊ_€iûÄÃ%á  L+ÖÏÌÔ`6†$àÈÒ¦)ð‡{lzJB>Lïr ›@€˜`‚Éâ/!Á ï?Bôà RúO'•Rm”Ê;OÉúnI„!gÀ=àß#óøžW7%˜þ ÍFóÓÄiÚ »p­  ï£r¯x½/<~)EÀ7 ¥6ð÷°øƒ 8é0Ám¥ÀBøiZÚp‰nºÈ` y Á<+à9eH¸Anã!ôÄÜœ{C;^×øÏÐ6ÿù´8Æ$ ÿƒc©ñÃÏ?=~sã?ž¿(_o¿°|sñÛïéŸXÌ¥áþ.è÷%R úü³ÏÚûïÙ7‚þ—z~Týߟþâ<8¾žV ½?DÜÿ²C>‹§°¬~±7”ηßÁ©þÿBd ~zäo²²? Tð ^aáÕü/n¤ €þS/ÿøeDF"€( ïfÝBi×ÄüÏUÒ§ $ˆcKâÛЮ©9ô À÷æ¼QÆ©B9„«|0èlñ¿nˆ ÿ—VVaFZ…#@˜€¾×(RÙúe˜ÿ±y.ÕüGGBžÉ3Wó´jŸÆD.8ÈNüñvŒAmá,æÂlI 8 Ì\˜ä ´-£ç"H¦Hƒ0msÿ3«™‹Ÿj¿âÿCÄ?šIöÅР5æXJ‚¢ k"‹—¼Ìãý=€ÿg'ûüŸfÆÂdîÎ>ÌA;'YìüHSÓÜ;Tñÿ‘ &2šÉur–¯qý0¨§žiC qÿöç*I.ærv Ráå_ï—cdb<ÐHÐ ÀÍõ÷`fYó]:û¿š?§ ôÿïiÿ\¢þï^;Ñ€„)ã¾"–&kíázxØý‰ü¯Þœ¾yiC‚ˆÚ ÞÄ"ï'×ü1@DòpŸ,ß°?¼vŠÿábŒês;o=¥¤B„IÏ{ËÀÔo«9vB‰úùoM…É“Ñ'ظòËçØK0'7r!ðŸèD@@°‰S„ b@ü ÚOèϧ#ŒÐÞEí/&†°~‹†¯c%PÿÙ‘Ò_HÔíS~Û¾pøÛÅ €h”/ͽ_¿uj¡ÌRÅ/EØQ%šü£€ÿÏÿKø˜-˜]€ýC(0¿õÚRà¬rÊMPÐ0H°OWµ~êPŸÄ—p\bÆp0¡xHüR<þoŸßÿ‡ã³7´Î ¼ÿù®Þ6ýüÙ6=þ¯kùÒýªwÁÕo»ÿyå8<éýwAÿ'ôç"¸x:r%ÜÉÈ€+÷¥ï?©Sâùvú7Zü §ª'€–¨ïÚøƒû_ŽY/–ƒ'€ðî”§jØþêá„û_™#ó„h¿ çOYYY,@ü…øun$é]@†9޲šÌÁ„À>€ÿË °½ €Ã^"ÀbÌ%?ÿÿìýOh_W–5 '.Ôûfš ªJLW Jàš¤4Ò¼=Qšvš& •COã¢*Ó!eûs0=ÐD³žRþè›®'žçÞóïÞ#égE²½¯-YÖ¾ÎYçœû;kí}öÉòÿÏ>#ùGòç=ãòù/ÓJ%2 ø3x%û@Sõˆâ¸†4ϽýéÄKÙÂ;Š·»ú ÿ‡ûŸôG&Lm€ÿ38, !‰Ð„yƒ§„¸ æ·n‘ü3t€î.MÖÊwÀLáçÿðÀñЂÚûHo°38Só~dÿ'ù—V.(àÿðn‘þ3Ñu*L12šìHùÑù‚0@¤þcý¯Zåÿ¯q+\^h_9r*€$p€þ/]oHà€8F€©%  @!MØÑwË/ îȹU&tíêß ÓóA « ô~, þ§!ý{¶öðD6Hqð¸ÿIÿqäÀˆ?Öþó˜Aveˆª9BÀµýÁÿéYvÅ0€¾íêý_ùÿ5Lÿï€((ëÿÃ`ë£ÿË»M{÷v&ê²É£² žþ«€ìÿ S7§r€ O¢9¸…Šìè&ز ŽØDPœw!æ>X[ÃcaþèbNœ\ýóKý¯™aÍ€åDçþ/oXü½Ãeþ®bÇ)É)~üД¬!åòÉ,<{ýË*|@<~Oàx6ˆr€Ê&. Yp‚p~áÿr~Œë/®áÿŠO&´³'±½§c`xÇ&õ/áç…áôãY4DÐú…õ—T˜" þÑ ?C ÿ vÂ’×—Rû£0<Íi¹  (("€%0/@C†‰€ðzÙÛW’ÿ³‹Ð¿µûã šç‘ÇG‘6¬íîóŸü?ý|1ÿëV§ÊÀçÿ^Þo¾¹÷ÏÿîùR”¬õkã_ú§ð߉Јë_ø¿Øñc6þ…{Âñçùúþè"û韆ú‘Ì÷À°ÿ;;€dü73úøÛ4q@ @±þ ®]^"]Ì€ŽéX C CÀ Ì?Eâ/ €jIåÇÒÿë6Òzˆ#:zÅc~áÿø‰©B ™›ñ¯ÜVègz¨ó•k:  éÍž…¯^¦·èþëöàì hw³®¸.RfÊ»©Ÿòÿ•’¦€Ób@,àuy¾„!Å @@@"õÕ!Bza¬à€NðÕñó$>?!ðAD7ÿ _%Óô6€k†ÚczžX_,+ €j‰ŸšüŸÁ­âàb@\Ð"nE® Sä À cýGûŸ›ÿ Öÿe¯½ÆOæÖÕŸ{Nµ¯õm”Jð]pHh+ÀÔ¥©%CxÑ „d0¿Þ Wºoœ‚ë¬ï.>!¢?úØgKÿg@ pè4€´ùÁÿ·±¶‡,a_\ÿôIDATy?·bT€©b`i&ÀRïª×ú÷O­ý½þX ý9£ ¼ÿ×€L-u‚+*@"ÿ3þŸßEH"DøCí/ü_§×¢dúè ¾¯Ò.Ôÿ°o(/÷°ñç+>z½¾`܋ѽ Åñ/s_ߣîÛˆcpØŽ»ö/ –0ù (Z# X>G€Eý•è÷ªwg؃£'Äo`%€ÁØRw_ @-4Ò5Gê/Žÿ‘ú·3èã®aXý¬þü:Àׯo`ÜIȰ´Žªßü×âH9‹Æö䔈3 ;AÞ^ Pǰ€üß¹€K‹D„düC&JM§Ð‡º’(@pE=!huù"ì_€ÒýuHM}’ ÷ÿ¾šØ®>ÿ‹ŸÏÁŸÿììÌx:^è}pŸÿ»yÿÍNðù>?ë}¾{ŒŒÿÊøÆ®püïzü§ wŽôõþÈÛ¥4¾ƒþ?<þ»á¯ã<›‚߾砙å#f¬~É`²ÿ†€!pôð€¤`w‡SNú÷)?þ%E¾;œ ðó;ø ðÞÎm Ît €là§t€{ñÝ™ñ!2ö®ÿ*ÛeP©×ÿ2ÂÍm!¬@øùþÏîÝ·" & úà&(€SÀHýd,ó.%ða„›ÿŸûÇ n€4xÂï¤ñ ËhEÐÛ£÷ •º%àò;I²ÿÊåÒ Â5,•PÖ±gkÿw @ D™Q:Ñ'DP òÑïßUù°ŽåÄc\Ûß) àƒ’þÏ÷]ÎÚ¿ó€û?Ìð²€\P8î}å™ ÿ Í] ¶¿ó]õwOsH¶·z‹°éEþýÖu‘~ßüÅiçÖâæ×þA€«vÿþI>ÙÔ.¿tcz‚¼€ÜT‚ ËW²F@±|*¸cìþŒ1ŽìáX«ÙŸàoØ•'LZþ«ý·þ~ÙÕëŸG÷þë†×øû/ÿ,¶ß†€!ð Ð ò!w’Î R±~#ÿ)vF,«ÐÈ[8%€¿—q&Rêü0Òùàg˜@2µ›½àóIî¬çŸ©Ð Ñôè§°úÿò#*××ê3dF¬¨ S _(ƒõ—ù[0{Šj œC¬Åà/G¯O(<÷(Çô¾1ºBåùÉí¹àŽJqý¹û]©ý£9z†p°úýô~•ú×ñs7N JKB£øÐŽCÅÐúÿ…7È®N‡bvBß½¥ÿe.€ŸP{v­ÿGµcÀ¶JÚü]ÿWî/]-ÿ£ý·ëÅî?qû³¡òþ©;R“¨šD3n¢¬ ÂUÒåÐÝ!¿¶Òü|x2~÷òHKÑ=$í?ÑÓÓ·cÿòãÛ½™üí£—ÛÜî;Hð ŠîÐý'¿¿‹òg¤'Äpèþµçë知*ÖêW³×ž_«ùzWäè¶Xün€â£^Àò#¿¼àbH©\¿d~:8|*ï7ㆀ!`<˜@èæ¾Á«2ªL>- 'Çþ*?ûçÿÝÏî.~bÕ?)[»©E?JÁ¬Ýb"ûxý´Ôà ½Zÿ2I×p‡3<,"èÑä4˜ìx‚?0ÿ ˆœÑ7uÿ`f³ŸÉê/$Qï4™Â ô¿!üú5Ëãõ¼¾G¡¿Ç¨0š=†ʨ‰üü`Ê®wWw 1t‚Ì7S£»»»ùPÙ:[¼|øb?ÿ*ór“hüWûåù“¶¿¿½§3|Å‘äÔßG›(ÔÂ;Ôî]xzÈj¥ë†Ö`#v¿àíÙU (}É,Íœ¿ßãÏ’îã¨Ý_5w7*% á¯Þ ®¶>b×õ«–?ùàKn_¬^ˆ¯YF¨Õ¯†¿ù‚YôŸ~dÄ/ÙOnÄèWî(Å÷g÷b ‹×ɯýÕ=ÎñØì_lÅ úšÕæ?á磞–gpþ3üþòïyW€Cûü;êã¿úØGöðzØÍø.|&Û¯ CÀ8Úˆ}pfì#1Ò“Ñ)Z…hvqˆÕžÏ~ ÐW£Ÿ½Fén‚zŽÍ®Ò9y0Φga[íÆñçg>ö¸‡=)|~8kOË_ïñœïõ¯(ñ‡½ õž·aZÉÑî:ð¶ÜKÿÏî•`ÒöHÛ̪e÷½}þ'LßÙGLðùãÏyÃæšôýgŸ÷¥“ØM CÀx¨ðÀCU)«Œ!`†€!`†€!`†€!`Ĥ@ØYDªóòï Gï1¯Ü|÷LâbwqN s3XvwWϪÖ` êå|èXãÈмˆ@•}RÆþŒ>Æ÷ ãé'À§»4 ’ð¿ßWûå)__xª›¶ó8øŸûÛÿû,} ªß<õö­ŒÐÎ\Hä]m÷äéÑ-jø9{°CX¸M {t*3P7~º—†/Ö£ÞûxûÒûa×ã|±A ÊÅìßOÃÕ¨¶“`†€!`†€!` !Ð/3Ú¯¾újxæÙp+¼ó{&ÐÍò‚l)߯›KKã÷Wëçõå~{ãÆ×7Ê—ð‰þQ:í­­­]*¥Ç ×ÀÕèÉ2…qõ+^žŽ‘:r7õ1bP|8׿òoÚÀÉ>ÛÒ¬OrŸÃr§|­Àßúfm¦– ·©âW¨íÆÆÖF€ï_šÍZn¡5Žv"lŸzê©2v¨ÉÔÔkRŸ–ýc°Ø%ãäI¿ÝtýâÉ`ÔÝÿ¢]Œul5T¼èö ÷ð¡]û&» Ö+“ßî5üû6  §v¦N¥=ˆ;‘ÏL ¸/Ÿ´O³“v¯N™ÿúÆkC ˜¬ž×ëZ¹>‡›ŒÕ†‡»A×ZIaŸAÿ-Úõý«M]º~WÍd'†€!`†€!`Ã8ÀÍp9ÿüê«!þúTïçw«ôÛÿ‹Ð`ó›>wz_(<ýIü/Zª6•Â%Ÿç|n÷ç NÃð¿í)Bûß3݆Zäc /¸gyßÜ,×€²ÀMóä“Ë9CÕú€Âåíɨ¦í@y¹lÂ>*4ÿ™•oêÃúpê_?T‚Û7pˆËöN–R4àÿÓÙr|Kü-ìdØM½Û%=u¨Ô†¨kÿÕ kiù׿”¾K=¢Jï<Å_ÿ—pÿ©S=ÿî ÿ²É½¶WVŠT³BsÉ9qYºNÞCäË?8>|ó»ot{ðÿ?ýéOà ۗý3j|yµȺow‹~}jj°þ:’@ÿ»½ÀJãHº—{€¿C,(CoÆ‘l}ã®ÏÀ2p:ÆõŸv5ì yÿ-ÙÝð” cû.ZÇN1 CÀ0 CÀ0v€”¶_MõÕMùÿW_íRè}ŒØFXnÞž}ýõ¿/Eèb~­Àò²§M$¸z{£â0Œ®Æ=Eˆ€Ù­­7Ç(twƒÒ¼mo¢„åc¸%Éð– €Ö¯|y» å:òò-0ÊÑÈí¶ýÏßüæoÒSÀ?ùDùØÀ1ä^Ï0/MOOgåÏñ-ñ·¸³éý’c¸Tzªoÿbû»þ%üßÓ÷©?ùĉ;OIß.ŠØÿkçΑâ‘þ¡üiI€T JSŠ^£=-l€ “wULJ†4O±xá훯ÿ´¼¼<(´K®&ïBtâVHôI÷í€ ~=¾àþT P“©×N¡W9ÙE«üssjD‹èˆ»—{ìÀÅÏ#} ¾=GÒÓëóŒ )¼† Ô†:U¡ÿ–ìÑðÌt®]¼ÍíCÀ0 CÀ0 C ‚@¿@ÆWÓ×Ch›üaaw@@1$y{½Ì`Ÿlž$5Â7ùNÇ o´ 7¹ƒºg ½/³£‰ðælIÈ× ´W;k°\®ù?þ@(pGê'K —Ç DŽÂ-è´ÝýoM>à7yù¦>*á|}'N`lkÞÌ6KÓ…‡ Ùá[àoŽÅu¾ä²0Ø„EåŽhWaÇÐÚ¶Ô|þQýjœø‰§°rÂSO}¹ðe`ç¢?unaá() \¹(EGE€„"o¬^)°6@ÐÉ}¹ëãƒGó ¯¿=ù?(þ Ð@þ™>„¢ï^ñXL€¤ûö·˜ªà×Ù!àý±ÀF˜¢æ¢aþhòÿ7+€kŸ¸{éø‚ QºHÈ÷žtdyþ•/ñõ% bxxH×pjߢ÷GÐßt¯Ÿ’=|ÿ–Þ?öif†€!`†€!`LŠ@ŸPf¸_-\»vmgBP æFOÙþìëÏ€Ò*€vÙ·póegÏ o´×6³ù=}¸žÁ5K7nx Á¹ C®Ó4³obž<;]¸‚d3Á–ûùÞ$¿*/c`ø?°Ô&¬ßÀåízH8P½¼ŽíJÛnÕè?Ë÷Ÿ¿iL‚ØlËC\KK#¤ÄÍÌÖfR~÷Èßë7oòFMÎßx‹À\ ÚJð½üòËOÇÑ]•‚àÍBÃø–îéWs-Ý `ÏЗ²%Çš:·¼|N"´ *p@â¡ Õ+¹¾çÿ" D²vrÜ•›ÿÖÆ‡kžbñºöÿgÀòŸ†œè´¦@:"Àþ§.‡!úR>íý®ù‚[ÔðóvZû©©ÙYh.iÚŽ©)Ðû1Àß;ßT_Bý©°‰ ¶¡ë=éÈjÏ_Ïþ™]ï†ÇéÓåá¡íÊÆìË·wÓ¾ÿÎ:CÉ Ï<׍ïz»Þ0 CÀ0 CÀØ vhŽýú×2ÃJ?Å€k * œÔ;qc ùþûï@þK1¶ÿÉxªÿó?…aÆ9ð@ÎðWnL/Èü>i9a 1àÿ] :Ú­EÀu x³íg™ЭAÊŸùæØO~~A´¾^X3 þý$YË™w¬õb/ÇOÑ 0PÇöø¿òŒÁÕÚÍË?–„Ä囂¸¹I‚2‹þÎÝ#É×ÎOonlLàî]#wø^¿©%h~™ó7W<L‘,hYÀ = „èÿÓ<‚®Ph×þ›³$P À‘vòŠ÷é§"t MC º°ÑíÜò¬œ«ý£à Œ@: ‰Qb-@‘¤ý¤“«Ð Ì®éÑÁß΢y¤xY÷íKþûÂÛmªEûjBÎ./F̦]›ZZœZšZ¼ÜÅPpm…ë¾øQ%@ xóGñë쮡x-è?¥Ñ\úƒ_†–Mˆ‹¬wh×QBøø!QÜÀZ¤uJoÿw׳®‡}~úô±cåá!h8ðµ|ìfmòþý7·Ë"¾¥¥vû¬2 CÀ0 CÀ0î½€î¯õ+ÌpW]&õôöÍ¥ã—η 3—È Ê9ªp,¼Ú~óý›’àïÛï¿QšÍþÛéö7˜þ"[Ào0U.\á=çb|ÓšöÙgŸ~øÊŒ·ýÍoÜåø!:¡%7W3PǶ—KB{RƒüÀñ7(ßßüM÷äÿÃzx›ààsMƒ5ØÛláÖã⟽°L`c½mwéÚXð½N|!ßææõŒ¿) êL"ÀÜœësítšÉQùÓ Š&HÚ_Õ€“~ýòãdûÓyþÐWÜÈ}‡ £û ÀÿE˜j¡0ÌÎU¤Œ;9ç¤2èÐCKê'Ä2—b{m–©ùø—ÒÉïD$åµ=é¸Cƒ,;íì›hžéið˘Zíû5„)¶€´o~4 á›n7p5~ßV]&ƒ©¥Ï?_\êà[h×7×]÷ÅÂP»[Ôðëì¨?þc½ÿ¹s¯qÕEw43-Rþ ðÑ8i®MÏ7shØ}Iöǘ[…me±‰HTYŽrýú ª¿_Ù,ì¶Ñbx@8ölÛœÖ6N_xÄÆ†T€ý3#ð>ϺþË^’Ù›f~ÂÇi<Á€ûññf÷0 CÀ0 CÀHÌp¡`îÜü*g·˜r#àñó—.­MÏÇü´”£ Œ‡›w>F!8߀÷c€V€³gܱ3N¦áü ðÿß`Š™E¬¯®‚A¶¤‘‘kW“a€ú‹X·ÿýßR’öد?ûìX³µuš3ì_§®tYƒ qÜRþdNþÿì³-²øãÄ98s }‰§ÿ?›Æ@0@ýþÓ]®5 ¯´ulWÚk+½Ç÷ɹháÀù?0¼ ¿ nÿ;(\ïÓ ˆOXÁ§7677Ö›u0LÖyQ‰/¨¿²JãæÍë)“Û(€úcÄÐÚW_=Ûέº!àÕW“>îÿ4®Žn> ¤¿ýXä?þøS|5ÌŽßX2åÿ³Cø¿dŸG`ú þÌêftÙ«¢A Àví>=;CtBr'Äþ›o‚ÎÎC-§—`¤|¹Ø†wZˆa€óþÀñ­ÁÿÓ5vçªgïÛw}}aa]Ú7­èÿÆ*úÇtËïnPèI¡àœæ‹……Ï{þïéýØ»[0!Ä~‘úwRÀ¼¬/dƒ_µS3ÚJ¾O†~üærÓln¡x?Ä€4ïêê Fݸ±ÚBª‰GXÞ{bþÏë×7Ýõ"qÄý/¨åéc§O{¶9Fz-­ÞM`+{udþ[ß|ƒfm[ô‘öÖ­ÌÎêÍÏË,ê ™Ý>º CÀ0 CÀ0 û@'È ÷W¿Æ¼µ9VÈÿÏŸ¿´6¿Öžü1fÀ¥íè@PI•@÷>FLÖ1õýþ„  ýÿÃÿ#‚&¹É¨ü Ù19f(ô”§a¤/}uáôT¢ù9€F—¨-ޝøõ¯í(§±Þ!PBÔùhü+Þh?xòümÚ›Àó2,Ÿ øÿµ•ŸÅôƒÕS—ÿÆ/ €O±wHêØbݢˡÞáû¤Û·ÏUüÿå§áøç…ÐUZK³JZ²½!¸Òæv í¿±± 'ò:½¨L:àn øRh|ÁÿbþæH˜J‚ùª49ôð™ðôÓ¸8b™§Ã&å¿ÒÒÍO òNsç¨6<í¡ÀÔÎ2À«ìœaõ”¿b]ºìñ7¥5ˆÈÿgfN^›¿†…1Áßi§¿­kšï‘?@¸qˆÑ`ü’źs‡Åÿ¸mù)~ê—œKçÀñqÉËX‡ß5¡ Ú<ð4o¬¯õ»Gôí+E¢±}c  ÙæŠÛÛ«¿]ÎæÞËËŸ»ç³k,ƒ÷#Ýw}Ó¯vp‘5Üb ¿Ä.ÏÝÿH@Á_Ítðf[ ²Œ†Iô%)áêÜê Bˆ«'®ë¾}‰GV(HÿDÛ¼ÑþýßßÿÏú§ ÇN?Û4Ç’áÁwMð÷~Šßèràýo€÷ßúþ{Ðü½_vX=*'Aÿ!Äöûñ®·{†€!`†€!`}0íÔn ù?CÖà@”嬥œt\$ ¨@ïcT!oŠŸí›F¦Ûaˆ¶R ²V0ˆ¹mÖ'yÀyÖ×Éÿãò‘JHö¿æ<°A¡>Q€Ï~ýëÓÇÀù Šˆ96€$€žÑ –‘·O*Ø€ÿSCgBIõ¸†sÀÿŸ] »>8¤z¬Ó@æÚ™ÚUQBþ”´_ù10¼Ž³õΟ×ññùçK\ #²ò…4OOóêêo¼lÙµï¶ؾqùÁÿñWÊø-ç`ŒDÐ4÷î}Ñ?_G'H¤ç¬ûþÛå¨à‡ØŠßú“p}ü2ì¿øCàÿ>)A©†âr‹ñ;ÏJÀyà“÷]ß_üÈÂÛý3ŠàP .Ø|WB÷šöX:<ø®éE»”šâ$~õfûÆ7·nÝ"ÿÏíˆÿ¿&À1òÿ¡¬}`†€!`†€!`"à#¸ª]f­n†›Þùÿ.Q˜†ól`gÆ$—V—¨“’A;¡pAø{Û7¿ÿþ›oðÕ’¾Š˜ð.I§×`Ä`ÿÃmìù¿DX_?¿¸¸µµŠl}s볈À6ó·Ÿ_‚°tžº@$üú׫=†,‡È€[¦€ìH6v f Š”UPüÓÿÙÕU¡bL¨$-6P ÿŸË„ñ£€ ‡Tˆõû›¿ùÏÿ¤‡ž‡üíÎ@Èvó?õ¬Ö14KÎðëßäÙ øññåË$ƒE,.¥€Á÷™ ô\3;HÙ“&Ѓø.\‡p}7¯“§ÛÄK5 à´ 24,@“³j¾|ÒÂ6D Cl°Ð¼ì0Rú@éWlH€µ/øâ‰zÍ5[XjÏ…ö‘û»óý‹>"}œ¹Tuªm©`%:–¢ÏÌ _b¨AÿSpý?ÒTo~ó íÉz®˜(Äþßÿÿ%Cãã8¾ºñá=ðìBìªÚ<ÍšòÿPÚa®}ãòÓù6vo]ûº‚°wiŠBðÿ/¦|‚ᆱX‚5"P\çýﮋÔð‹ìÄ:{½Pa ´'¥¡3 ÅdÐóižëKòÆøŠ£¡ó)Ÿ}ñ#k¹ý 5 ß?,êW±%J; ŽžÎ†€óx?áà c÷ÍÙô©ý÷7*r«`—õ Ói„÷[é;á«Þ.7 CÀ0 CÀ0vº8V8éÄ ÷WÎñ3’ÿãøÂYî¶2Ÿñx·4~ ÏSŒöìݺt’B@¬4"Ây@p-Àé5~û7P¹N Ö:€N`)_ÒxpœŠp£ioà_r™.ˆÊi Y?bkOƒ?ÿz¶ÔÉ9×áªú÷Û•­ ‚ ÿÿ ÒÌÍâo‹EþiPfÎÞáÿGª*×®¹B*±gý|ˆ¾(ÃGŽñù¯€¤‘OAÉ9ºZÊþû#¾ø!©>¼çÂÿìʇP€h €‚mü†Ðd:ˆ8>eÙ‹N¼ â䌘,ÀM,`:Àüh^˜žÆ"m|g¼B,þƒÅ<â‡&Ž×ˆ‚Á”q–bG²— -6$À‘о)À3Pà þR@R>.`Ô¿¤”›Ù.€ 8ä›®O'GI#—f³ÿcôýC€7!n±Œl[MÙˆ€MÇ=Uô–#Å¿ÄqÏ÷þ_ð€‚ó/€\§?ÄÉ%@‘b@êçþŠÄlˆà×®5í–ðÿö†ÔQÎéH ËÄå‚ïo~µ *ÃýóDðåã†A×Y˜€>`ê«‚žàÓ… 1;ÜM=Í‚†ò\ `ˆÿ//¿ðÂô /¼°ð}Ì™ ­.à‘X†O¿Ü4×ÀÞ¸ˆ$]Dßn "6ì Ú¼|Dà—ÏÐÁ޵õüLªOˆ»ß òC¾ÜEªJ?ÿù¨Ðxþïû04V!ßSÚÀý¯Á›¦Ô²6Ï ;ùÓ<óËHÀuÇ»¿~|tIøwšÌ.ÏæAý×VAPAQÃânµoT~Ïÿ»ñ4¾Š5ðûqõ$€/Hÿƒ‹zìþ²Žì¿Á-jø%öôå¸;þæ!A~3ÒPAƨä2yœ Ȫô_[¡ºþâFㇰªù|1DÀ5ZÃfíå—øß'ù‚b›/È –­hC~lgvÏÿ§uìs3Ãøúûô¶·Û†€!`†€!`<òIÛy¸-…¡)  =ÿÇ)O¶Ç9¾&²‡ÓŸôÿ„@ xG€Nhèá”tÎmåþ`\Ø ¹Ñ=‡#×…aeE­ôV4޶N@¦nNï±Ä6Ét Á(€¥óP+à*€‚Pàíøü¯––d#w¨þY.HÄ.À9 ¬|(ü˜ý1WðÓÒ 8'§ŸÄ¡›ìPÏ&ˆ²Ð§† ±EftÞ™¾UJ_íê Ëíß ãrt·ù12hfw#Í^a´Aî‚íg‚¸m`Û$£¦áDý Té‹üø2 àz²[ׄ*°ª’Ä!ì? ùPîÏôu"^À/®!Â]×>„)èþ¿³bã½­]i(€õ7¿¼#äzH¦è…"ƇЩ%H¼›(òÖ©ÿ_ú¿Òß®¨P# ®´ë?Þ+ ý)î F¡y†€ôÄâøˆ¶áÎØ<@ÀOÁÿ·ÖR¡ƒ!AûªÒ¢£ÉñÿU)?’Dì]²(ÂïžÄþ“ÿGåﻯŽ_Y×PCÇO–ßèÿRáEû_î;¸ww'@ )%D”€¾bœç.ïûK?²¤_}Õ=€¡/ r±GÈ¢‚‘áDpìNƒá·ó]ˆ®–¸§`lGv´ÝÿóÈ/¡cžEðþyä?¥ CÀ0 CÀ0 û†@/Ч¿‚ ÚIcþŠ *ÝÿØ©œYÊÿ$‡¤ÿܹwÞiÁü¹@~¸ÕGˆƒ±ý.R¬€•T€àÿÿ:õ!·/ÓŠHîtrOì„]àÙ”kôïÁú2Ù!á׉„Aàd€’ P% ìwç´òsÌú³èé?‰ÑÇõ9ê|ƒÀŽ Èøã®|XLQBgÑ·¡r7¤—H‹ƒA¡õÇ?н ð(™U4AøÿÂô‚ü L±†8‡ÉûÖæÖ4 àw®ô$°D~éA„û•Ø0Ä›Càµ/øR2kôÌÒR׺1ƒÅn0×5ýAŸZú|iåsu¼7a@0Cn 7Эڃo²“wœ$Ô,’B‚¢F2+’,ÑrM2¦Ü™ZZœZšZ¼ÜË»æQHP ü_‡m×¾AfÜ€)Q~®”O—pÕ?Ž«_ÜC @ÒÀÚ}×ç˜ß_ì§Rî¨ÿð7ƒø9B{ˆ àeFaýÞ¨‰ANH’¢„'N ûúJ‘õ}Ñ¡…ž´Îdàû]¦¥lg›•«o Šìððè"äÕÊ(ìô_ ÿÊÊ7Þà8ì,#Þ ×®áí¡%”¥&Ü·9»‘!`†€!`†@@/`Òù>vß+@ —Àÿ—±F÷äIF*sÃjw¸« ¼óNÓ¾C„h„±ääJi(Ü~ÃY0€’€I¼kÜÍ „®P:…ÓÍÎE8~îUt†ß+˜a·-¶ˆ7ä)"HŽ9õÓ×ÛUÐñæ˜oO®"ã7R‘Ïg.P þ• ¤Ñú&½PÜXþ/”—ÿ2I’ðâƒîâÿç € |€ È6rÄ ¹†0äc)Å…Š¿^„ÉÆ‰Ä7?DBñ€$qèðoÖææÖæ$¿øÔ –žk°eýw´ˆ^ØæŠ Ýyö…ž¾Á-(ƒ\õ$Ú -žl¸ÀƒNü‘Ñ?õÌÔçȼ§½2ˆÀP™Í(Í+l°ëÜ¥¿`ÏF ÷èË%’ Âm©±I’MªÇ1>°àå8Yž6Ôÿå—Ñ7òfˆÛ7$¸° ˆ¿”Ÿ?ÏLàêÕ«PðoIh渿Ýêl¯¤ýÀ~”ÈE€Mƒ¸yoRGÃ"Š©  °¡‡¬¯ÏÎR£è*Ò_zý"Þ`RÆÂÙ'$‰-hÀÒRb1:<œ°ÆUFHâ7߀ÿû¾ ì¿Ü_²Ü ·;þÏÅ X©¤×χïû¼2 CÀ0 CÀ0îþ÷þûïSÈ  ðf„ÿDôeàæyàÅîü óÁ‰@ÿÿ›øƒƒ ÀÎTçyÇ£%^ØÀü\æ÷X3ïhlÄ †ƒ܈è“:¢K~þkìðÙgw’0nP¾D¡;Ù ¨ [€ÕýŽýqz!¥^ØÎÿ,¨'`}€è}C܆¸DWXêŠâ­ýi½ ëÀ­À6€cåÃE¢€`+Ýu0Pq]D½<¨ôøfýO$”kÀâ%.Z À M÷¿,3ýÓ²~{ˆÿóÇÙ"z!Üpï*6JèþËvÔö?ʼnÀÇçSSd{ºŸ#  S:€ÉÿÉPY q£vE’þ}ÿͬtí‘C€eƒ]Øc9Âð‡–Œn@í]¾yf¡l`'Ä‚ µoàáf€n Ý“ @*€þ7PäHo;&üú ÷Ô®YðóˆÄøv8 ÿ—-\ñðÿ¨ÂÿeõwBܽàdo¹²„ À,·Jàv€]ë¹þ¢½‡êÀ œžŽ¾û·ü®ƒAa¹‘ðÿñáဠnB?:õpý÷{òÿ³gEˆìà€†ÿ×ë¡ ŒJU÷íýo72 CÀ0 CÀxÄèqÌ"ƽ@uò“à êBŽŸ<°Mÿ¿ŽŸß‰òÒ89Îù?8¢‘Q [ìÅÅ èr~Ϥy¥8k!¨Kçycœ“ ÈHþút.H7úu ÂBÃõÿðÿ?ûqâ7Ø"Nògsª×‚]áo!€kÚQ7Õ8Ê!öÍ lñ†f©£h iWäïD ³4Ž??Ýhù~#å{ºP>ðÏMì°½M2€q"  8 ßë Yw¡ƒL¬7;³>ãèaÌа¾c^J sÂþÃ'Hù±€«ÜÓO£R'´º¿]û£3„üWÕܹƒ>- Ý}*ƒ#Üv–€SB†ÊÝf˜‚Îû¨%‘„;DßA·†0®°p(ã§w¸d¡Û(å'ÿ'ýÇ@©-ˆOï›g ñü[@ß¾}ùtÀÆʯÝs.æòáçrä‘ÿÏA@ €H‹ ƒø¹Û Ù)È6Œ¾xèá‘Ðäþ„´{¡o`ð´ÜD’Dò_~d±¥‘C¬LÛþÛÊ<ú>_0 ±¸±K,Ì02<Ü ©E„ÁGjøÀ-lpyR$ 8$ö C\ÿˆ}*Yu CÀ0 CÀ0 @àöXðÒ"x6%€ ù?(?ÈÓ¸€@ðáÒÝv¡—‰€"p·´Kâ$^NPXáÇ©°Æ%Œ€&ýßÜL'ØŠ&¼! @¿'*ÏÅÞäÿ%üßyè³5ü²ôÿ'Ø\ÂR‰æ'¹Š@vÕRHI¦fµ×åÅ,,¯rlC^à0R=Çü*‰®OÈ€s)V °|?Î"XwÜÆ^çƒî#[èFêåþ¦IoÙ]~üµˆà×[¡@ˆú‡ !g@ ¯ô ›ÿ‹Š€ ‰4AlÞdʵÿ:àãO© `âk ҼဩŸÿüêç³pö'â3´3¹àB"€úŽto/n ŒW<Ÿ;ÞùôãLÀ¸ÖF€ðàŠpo#õ…4Ïúz)€Õ Ú·¿ž!«Z~vÏXàPùmNþÅÂ/DÀ— †ñs£s߆ü”¿+^.(ANH€à½%„»x6aüŒö—pd†¾Æàé«/o¥ü¿2<$Oé–dÅPÊý—;¥Âž(|÷áoÃJE¿È®?°÷¿ÝØ0 CÀ0 CàC 8of2p¬ÝÆ¿1 ŒÀ_Íqð¿0ÀÝJ|{G„ž‰1D[ä/YR6r‹Ëè'§÷,Ñ èÚÛÐù=鿬¨Í[j ìéüˆ ü:€ì r,¢PãȤü_4 ’=ñËgÓ›(õ/ Ø×»üµ‚ïôBÆàõq‡‘6ÈÖO Ьü_4)ü ~™phM‡¶.ü0¦\,äPÒ €û–ÆÁØÿõ…²ö‰%Ó \@üR†Ö`«µ³¯6 ’ à«Áý]ù!h帩á»P÷+÷€‹ù¯æ˜øøcQ>þå/‘c?k\ ĸYáNžúùÔìÌ XjA n@Ù )ðn ú$æ¹YРl ÿÿ˜ @°ÀÈ0c@Öµfì ý_›§Ô>Iûö0Yþ9æ"ö®k(( €|¥øi©¿†ä.ÄOï6hg}þ/‹'[„=ÄäàW䮜nëÒn|F*û‹SÊ#‹ÑK\þþfÖ Ä!•áÑ>«/(¼Y¸‰!ƒÆúïl…`\ó`` ®—f!ØÇ’U×0 CÀ0 Cà —Þ½a ÷˜ëÒúóàþ*P8Ÿå‚ÿû—<€*øsœ¬û"ð*Mjׂ ²FJ7ë ÿØ(þÐ ’)îþ·„üº YÐ; þüŸ@vµKÑ'3ñXè€g÷!èi˜ïÏ`­@ïý8"+6½0 @ÖXf€ŒI¤žlÈ#:àizÏá?Ç€¿á/Ó@~&Ù'ÿ‡À}b.Š(–8´«õÈñ…ÿÀ@nÈMðUÎbç?d\[Qz5Ȩ{ü…÷•Ó„× ¹ßDzqÏξn!àZšäú—NÈ·ãýcÜìS3\(h 3\À €™ÐÇÛ~ó}»$µEÖñ5|r}õ×¾ŠÍ#»íÛµ… ×*@Htlà€L`z}ÉO)€*YÀ~® Svï‹'€©ÞŽ '¤z­ßŸBÇgØ{ñòY|í´Ø²»bT²‹ÊðÐíM¥KÿD*Ѝiÿõ åÿèÚP¿¦ÝØÜŠã > 쾆€!`†€!`a@G‹Àùµ¬ð¸®(„  È?¿Ý ¸É¿|c@B“À«„ÿS(¤¥ôáqŸs‹»³ƒFÿ?þ@Ò$ø¿ºÿ¹ @Aô‡pB3S]â½óþ$d²J‚k"Žª®†™—ÒŠãXòú‡H= OÚ@.ÔØý§?¼ð4Ê'Ü™‹shfR?D&·UJà:a@<Ú &ønä¼OÀÔ¼ÿ×± ßJipaúɈK³Éû_ìÆF¼€ÛÄ…—øÍØ È :HpŠœ$ ä ìO:zÆG– z¶UUŠ]Œ;UDøW†3\ }¸Í'^ ø‰¡:‰1Ò•ÿo9¡ƒe•€€¤Ø CÀ0 CÀ0 Éð@2æp“µMø¡ŽGyúd t@$çþ/ô?&ì™@˜Ftu–†€üÿ$ò˜‹.Àî0à&€$`*Èÿ?ûŒäA Ȧ׈0€ÿßcö “q×”¢âטišgSŽê<ÿ% ™Á]Di~±cm@ŠÒ 3AÇåþ/Ê—phð¸‡IÿqdÀL'4`¿XÆïsÿ$nH@Br@ø¿^À’‡xI3£ÿ ~ø±@Ëp½º!•Ë«•ŸÑý÷O˜\€,HZ·§ýƒö¡ï—dt3@Zúž@+ÿ÷Ô A”wÞp´ˆo)S7ð„ÿc‰‚4„ó ÿ€˜p#Û`•ZfH•“ÁŸµo_~åÿ,$tÓ S÷¦ `/@ Q ÿ×)~L€ü¤ Ãv¦®}åù=ÿÇ_uòšŒ˜ùø¹?  ‡@<À*#K®ï7¦d“Í@ûc|x4dý³”U@°Èôt”¦¡k¿¼ÿ"d{+l!É.÷þ•uv†€!`†€!`÷/d3Üþ)Ìý·¶&é±@5 UÂÂÝäÜ!ü{à Äñïèó Èi`ÞÌá·z+$\ÿL€™eìĦû×+AÍåÿ"à{"pƒ-QTÈbÜ•%p nȯ5õžß7ZD@Šß¡=>& ~¨¶èCØi÷\ÿü°úAù¥D%€uò€¯@Z?¦±S†4d¹ Ü / ò< — XÎì!Ü?®k§ô*€k ¹ñ'Hr´T8\cuET^âÒÜ„üÿ^Nöú‹ë_£øe•‹ºx¥î õÜ_½ë¿ å#©ŠÞ?ÌBÊâç±öÿçHbÏÅÿþè‚àëý¿çÇänÅá‰p @¯U8ˆjã£6>ù¼bûúÞ#ÅCîI7~Ø2:(ü’`¨E×+ŒßXÆÁWÁ“1+¯—×8ø¥¯xNëNïÿµÞSëŸãã{‚ëc©€Fû­³gßðÛoܺôɾ}®¿Ÿï{»—!`†€!`†À#ŽÀcÜö­6Ãå,œ€NÆE HÂß;çG";wÇ–v §½ÉÌŽ“ÁéßŸŠÆ•ÊIÛEùŠàBN¡¤Ï baÀg*„x˜rPbÁ\ù¡'Qy–§ÈŽTòdÀ"Éþ'圣—+jW…¼®~»/Ÿ¿DsÁ3`$UhºòE·*Q°ßéòtp8-&(\(ÔàÉÉÑWn ú×ÇßÁ¡‹ë%Ç~P8ÄscIww ÉиîDO «Çüüòršo´ÿwüX¹_òNñ•Ó¢é*…;wàðÃ}ÃÕ°}Ãb€a3¯¼4¹v€0¥í¦ÂYô¯8~Â'hŽàW³ËHŠ—¯ÏIOˆõ¥ðÏÁ‘Õ!PéŸ~ø ZûˆýÖ­7Þèzyûò ¸þ¸›þýˆDYõ CÀ0 CÀ0î'ížv3`pôÑõ»wðB1%tGÏÅ<Áp¿Q{bÞGùÜsº%þáýãÒËïƒGw?ö …^Z®»m$@ µôaFI¸‹Ïc€ƒ>T+ƒ0j®ØV)À3 .r=iÀ°u#SÖúZ°„YüjåsЧðïøYwBCEåÖ ÕXý¯GWzœ¸¯å¾æaÿsÜ_î `^òй›$E‹û??­G*4Pt9×Üñ*ÏÚÍø~;Tÿbûö…W€Â£ãù¾s•Z·«B‡vÞûuÅ‹ƒøÕìµâUË?Þ¿`E¯«Ààß^Yç¯õOÚAø{þ‘Ò»àîç ßîe†€!`†€!ðh#À%:#ÍX€f€Ä$GI†£còCO ü½å†înòÈžãu¤-›_+·+_ÄüÂVÍ™K¦NÇ{FúqK5èŸÍèåf J0~¹¢Rªcp“Þ4̼R>ÏΪ”4°ûoÂ^ÃF“îš*8¾„¥ë»fî-ñð7íªÜ|¨ý»ö°Kyûë#¶åé^Ô8zlwªûYϪô˜û¶Ó;¤È)üe¹*ã£V0¿}Ð=+Pá…/Ÿ¯Ó~5{õõR=Á‰(þ…¿Bvñö½¾ïCã£Ö>ƒv§ Ûí&«½!`†€!`†ÀA à“:æUàß ÑA§|Ï€ÑÏJa"qX¦ûq¯™¼Ž#OÌ8Ô^Kw¸çgØ ;ØK B E9 ®N€NÈøËô¸º›„Ï,  ’ˆ°'@ÃN_|Àhû†Æ¿üÂHßjñª'ìfìë9û|{Ô«Ö>ÝW&ºe*YðÿµgšÝ0 CÀ0 CÀØ~Àý\k׆€!`†€!`†€!`†À‚€ HCY1 Cà˜Ù™Ùáß¡£f?äâÛã CÀ0 CÀ0 ¬†€!PC@x?ùÿLY¨Ùk÷7»!`†€!`†€!ð `À²=Â0lÈûßÅ7üSThø¯ûƒ]{+½!`†€!`†À€ KKZ= Cà ðüÀ»¢$*€çÿÐþ«d?¨rÙ} CÀ0 CÀ0 =!`Àžà²“ Cà‘C@<ûヒ¿8øcNÿAüÿ qÀޝG#«°!`†€!`†À€ D3Y! CàðÎ/jÊÿ%ß_wçÇ5åÿ±ýðJnO6 CÀ0 CÀ0BL°þ`s8Š€´ó7æçoܘ¬vG~v{n[«ß'8Ë¿ÿ{ ÷—€™ßó¾2þ¯3·ø _c›ì¿ v¥!`†€!`†€!0&L†Ÿ]½G>ªœÿtÅþlÅ~bBû«óPNâ?7×â˜k ý-m;??I¥ÛeÞ#WÚõÕõUŠü¾ÏŒ—ü¦É‹0ú¯$þs Þý=þ¸dþŽbw þëþ$ö}VÇ.3 CÀ0 CÀ0î;&ÜwHí†%<ñç¿þ+<Ïþë¿B»'þü×…vOüù¯ÿÚ‹ýÐ[­¹6??íÚµ*H»Äcþâàíá8ñÇÏ( Žø·í$AÂýsÐ(ðû~$€jùG}ìlô&Œþ+aÿpýÿþ÷Oâ`€ßËŠC û‡ëÿÖ-Ú™à–¬8 –´Û†€!`†€!`ûGÀ€ýcgWîDàwùÊ.}Z$~—¯Ìþì³ü¿ËWf?!¿ËמíÝàáƒõj_^sP7/Í_|饽`ƒs›kלƒ}H€ë}°díüK/ÍÏ¿4=øPð¹ýÒPÝÈ¿ÁÌç¿ ´7º¨€¶t“öbx d@X_Å%,!¾ïȆ¡„ïxù«øúøc0ÿ>&ÿÿèã‚ðÿæÿô?ÿ?ýàØ10ÿg‘ÿ?{ìÙœà¿ÿ>˜ÿ‰÷ÉÿO¼_*vwÃùùééé– úßðך—jò³8’òÃÿïøu[ý ¿oilÛaÀ3ÿvi  R5Ê+ú"bÚ‹ª_¸£ü®ÿg5KKz¯?£Fù ßñòWñyìVø&| ÿ}ÌýBòùÑëú$(zÿçzýAÿ_Ç @o·áo†€!`†€!`!L8Bñpå#Ð~ý*ñ:þ¡ÈW‰ÿÓñ@¾JüŸŽ(òUâÿuû=ì ÿh…²ЀþKAlªæ¥‹"4ÅRÿYáȉ€Ë òۃ’9K@®O´ú´v8  ]Ò{úÓ'´a•ÆVÈMòEmDùãÿu5ãú^.*@| ð¿;m,`ßñòã²ÿØ_øÍ•à±÷ÎýŸ[çÜ¢YàÀé߉ð$¾ÛÐ.Àëï‰ð$þ—<ܯ3«!`†€!`(±°¶±µµ±6\•Ù¹µµ¹Ôyœ¾¾¹½½¹>|}Í>}qiéâpóÎÅ¥7†\˜|jíúš½V¿š}éÚÊÊ5Ç´J(\\º}{¬üµû×ìµúÕÊW»¾öüáûkèÿGÚ„hèÿÓúÆ$!úÿ¬Ú€ÿ‡‡†þŸÐ0 ¨ÙIúáúú?,x’< œ¾_ û!½Ç(¾£åÅç±³çnýåÿü…”¿;ÎõBÿß}—üÿžW èn€\@úÿ_ÿEþÏ+t7@; CÀ0 CÀ0 #…@$ll]ll •ÐetnnòúÍÍ¡ëkö‹F|q0Q™®c^dصëköZýjv]Æ=œÇ­VþÚýköZýjå«]_{þØýéøÿÈwü˜ö:þŸöÀ©Žÿg½?¦v:þOøàǽÚ!ô¬v` @çù/ Öà³ý…þ_ôý]946>øo\B¬OÍ:Q@úKyøûß1H ²1ˆq#k( ¼ØÅüÀíŸGD.ÿÿ—Ýÿ´ú…òkïø‚ÂZTð/ÿ(>]ÀÜúæúÜöæææcï/F*34@B˜Яñ§0C@#$€i-À‘ú¨³Â†€!`†€!`PXSæßÅÌ*Ah‡bÖ•ù·C15û´2ÿv(à¢2ÿÁe̵ëköZýjö%uÛ¶C1µò×î_³×êW+_íúÚóÇï/þ‘ÐAr@ýÿ" ƒå€úÿ§xÀž êÿW»Ä¤G;,ý/úÐAëçÜ÷oÿSd¦ëø=Ó¤Ï÷Aÿ² € ’:ŠÚ` À|¾ ³s={þò HŒ@!È^Π€ín;°¿× Jwg @w}a€îþ§ö!`$`øòÅ4Rþ >Xô?·ý‚üÛss›á{Q6Ä ¥ÿ§Ç$šP]ü² V(ýý=&Ð$€wTû!`†€!`†À¡"LtÛµ-‰þwÿdÅjg×$úßý“Û×·7W—–V7·Ë‹ZÚ‡íÓKÓ ?ýéþ)BÒ^Døÿ3Ï`À@†1^ß¶Ã××ì¨Øê,þj5‹õ_ýè£aûҊжk+å…öâm)¸û§|ÿŸþtüùÏ<3lwÀ â‡ò]»páÚ`ùˆÏÅ‹ÃøŸ¿1Z¶ÏÀý±ò¿ï̘€•ÿ|À«¯òO##`bÇÊÚ g‘0±cå?*¸²$ßN ã_fo ¢§;Ç?;À0ÿßi$ Ÿ»ªA¾¾B÷Ñ4@ àOm± ~&ÿ/™w¸üö·—[ äˆR ¾(ÅþZÏ ‡¿ò¿T=Éàï4€¢Ð!R^0° |«åÅ»lnnÏm ýÇß¹þÅ(±þ\ð;w¸$º@và"îpIl@qÙ/ CÀ0 CÀ0~žËàÿ-9ÊK`Çlå% þ_]úú€bľxû2€!ûÅ¥ŸþçéŸ,’gðÿÅgþò€áëÛùãCä'Kãö¹µÙmÐËÁúÍ­}t瓆íX€Î£¼Ë[ŽÁòÏ­±þcÏgý‡íÈ 0?ï"½3Œ¸8aåÂåÅ Ã廸tñö|ÂwníßoÜüç±ú³|åû“òw ”ìÕÿß;¯®Í²’òî²’ò£‚ì€+× YO¼/h•³î´Óóø«yóÃñn›—\î?.þ/¸ÿåÇý‡Æ;`@Yk$à ÿW;ŠÞ²å4úu`0;/@‘ÿ»’û—WtÕÀuPÚ`Wøzc¨ücø€CSô €ðì Av†€!`†€!`G Hh×6p¬ °ŠY/k…È\V™¤ouøúÕňíÓ?=}ú§ÓÃö‹Ï¼`äúöøñväúéŠþÄŒÔÿ£O>ùhľDÿòÒHù—pŒ”–õ{>ë?bŸföHý—.,.^)ßôÅ+WÆ®Ÿÿ?;V–¯|‰ýo](¯xìÕwÞyu¶-¯xv¨¼àóCÜ@ @[\Àê¨`—¼º¶:Dÿ¹çÈN€…Ü6਴cñ¹ýeŒ ‰Áððgú:Ñ:ˆJÐ(Æî0]à/ÐNtgpììŒQÒŽ@Øq ɰ¼ÌJð[épkÿ‹)v…ï.Ê?ˆÏc­Ë!îÿ0`g‡KfÞmúmnÐí(Kfþ«é·l¸ @o?R/|+Œ!`†€!`†À£@¸`08¹gø#þIõ]2ÏÝÐüžöÅÅqûO:næ™q{1¸zåç&mcå'‹³Oúüƒ®ÿ… ãågÀ±úýóÙýµ$þvÒ($‘ÄÿPÚW_mÁÿ3@ÿCh ó&×Kâ(Ò™°`÷ý»dz¾º¶±6 O‰10eú/kÜý‡_(íÜúêè÷ RA Lj0½tmiÀ£ˆè7–pùñr?óÌ›o>óÌxoŒD ȇ¸¢³\ÜÐA&”v‡ï3o9óV¥ü¿ø_ÿëü±uzÿçÖ·!D¹Q5 `Ó< à¹çž|²iÈÿ‘ÐeùÓ$€´ŸÂA;ù?’ZÀGûÃÕjo†€!`†ÀQD œéÖŒÙÇôÀ1ØÌ°]6ÜAä?0@2€|n¸ƒÈØ‘ ߀›î òv$HéÿŽl¸ƒÈ~Ø‘ ß@ì®ì f{(þ…cs£èý÷ ^gßs«ãüçóßÝ@6Á¡>ÔÎ_ûîÚˆ ¾ÛØeðôÐÿÿ€ö™77žsœ@ï´ß ÿ_à*Ÿ C'ýßr l0°ïýÆÙ³oŒ ¯gÎü¿oŸ©ÿë‹ïþ×Ð- lRˆù¿äòcÀ†Ÿôžý&jåïíÜÐ68ŠwV&CÀ0 CÀ0 ÈÕep†5€Å÷_ÀSAúÁüéû/ÀÒæOß!vjï‹ï¿° ;D Ìfs{³ýß!ÖÎmoTØ÷èrÜ‹ó7ÆäðÇ“±5µ"€ÿÿ¡¨@xÀ(Áoßø~\€€U>CÀÿýôÓÏ?ÿôÓ# À˜„Öž½uëì¨ð6€ñòÿ¯/¾v[§øÿÁïw¸à÷¿׃{BðíN;ÿ­[ÞÎ=¡ØH²†€!`†€!`ûFÀ€}Cgî²Èbä^dÿú=‹;Ù¿~Ç?…ƒì_còmyzÅ`„>JÀX•á~¯°oh ã˜Õ–È&c÷Ï2@‰ü饀V—Œ°ýãG|ð¼tt•ÏÿýôóÿïDdp JM%€ÿ×0ÿǦ¨ë{/~+"–_vœ €[2 Ïð»ì8#·d€eÜóëÁ.0 CÀ0 CÀ8xL8xŒí OûËì_˜¿eö/Ì_÷O†«§ýeö/ü_Ž!{…ŸƒÝUØeÍÁ_ï ãIy}EC¨I ¢”# Tø?žþÇŠ„1Z@¿ûçQàÆÍ›7†@œ 0»(¾ÇèÿìÖcÉkQ³Hà¿l ü?Hñ¯Y$ð_6þo[Ô»»a†€!`†€!ðC#`Àø#üpc8à€Ë¦·lç±Çþ’E0€îü'ôùý#ÿ>€ÝùOèjÿAJn1 CÀ0 CÀ0ê˜PÇÈÎ0 ûD1iI± »#úéüW ï;% ÿŸ~»Þ0 CÀ0 Cà 0à ѵ{†À‡@ñ¥H†Ïl€ü·´¼_í’üÏ–ÿ?pMn6 CÀ0 Cà‘AÀ€G¦©­¢†€!°OÕÏÀ~9 ÷¨Ù÷ùX»Ì0 CÀ0 CÀ¸¿˜pñ´»†ÀC‰y?½üCþýšý¡Å*e†€!`†€!ð€!`ÀÖ`V\CÀ8,”ä5ûa•Ûžk†€!`†€!`(&XO0 CÀ0 CÀ0 CÀ0LxÙªh†€!`†€!`†€!`- ©4ÈaÛ»¿výkÏ7|ñç×Úï°í‡Þa׿ö|Ãç°°ñu´[ÀJg†€!`»@àH ÍsM³ƒ¿CGs¬b?]±Ÿ™Ì¾ <ô”æB¥üTìKûŠ}eÜ~ •ßÅÍ«øÔð»T©ÿbÅ~ùˆãót¥ü/Wì§&´¿rÄñ±÷Ïè(k¬ÿ>»xÛ)†€!`†€!p´8:xóÜsÏá‹@.ð—ÇŽÃ×°ýôéÓ þ^æÌ™÷e?ìvd¡/\¸€¯áòðÁ þÖoii©ÁßAû7ü´¯¬¬4ø[´?øÔð»téRƒ¿ƒõ_\\lðwÐ~ùòå,>O?ýtƒ¿ƒåùå—ü´Ÿ:uªÁß}Û_yå•,>öþÅl4ë?†Ïa¿çíù†€!`†€!01GF€÷Ÿ À³Ï=û,%|Åuƒ÷Ÿ ÀsÇž{޾ûiÚO;}ì%|%ö3´Ÿ9}æôiJø*Ú!P%Èí#=á àݦpüÂñã”ð•”ÿÚ?¸ðÁ… ”ð•Ø—h_ú`éƒ(à+±ß ýÆÒ¥%JøJì+´¯ÜX¹qƒ¾&¬Ð}¾¼Šâ÷â…_,ãw‰öK.]¸@ _Iýi_¼´xé%|%öË´_^¼¼¸H _÷¹‚ÞÞ[2¸?ýãSÀWRþ—iùé—Ÿ~š¾û)ÚO½|êå—)à«h‡D@• `…׿rê•S§(àk ÝçËíý3¨õÃç>9»!`†€!`GHí‡ðìO~B €ÿ‰(‚xþ!ˆ@ÀH€ÔNÚ@F¤vÒz"ÇOî¯ö3"ì‡Ô>ÝcÅóàø /Pàb|Hû!ˆ@ÀH€ÔNÚ@F¤vÒ~"0 µ“öC€‘‰ýÈã£ø½øâñã”rüHû!ˆ@ÀH€´þ¤ýD `$@j'í‡ #Ž>¤ýä '7-?i? ÚIë!ˆ@ ?éj?%AÉNÚ@F5|ä•cq,‘#Ö_s†ÏaØó CÀ0 C`· €Kƒáüî¹Çûƒ"€¯ípþ;Ø)„v8ÿOŸìB;œÿgÎv’üÈNÚ?`ß-šuëçÿ… AùHbÃòÃùÿÁ"@h‡ói)°Sípþ߸Ø)„v8ÿWV;E€ƒªï^ï»|àüÅÎÿK—‚úQëçÿâb`§Úáü¿|9°SØk=ê|âçÿÓO壖Îÿ—_ìB;œÿ§Nv’üÈNf?b‡óÿ•W;E€ƒªï^ïkïŸqĬÿ>{Sv¾!`†€!`YŽ„ ëþá|{öq°*w<O¿'âý‡kÿ¹ÐOg— êÁõðôwv ê§>ØáéíäÿO]zʇÁ!7ŸxÿáÚ?þø\w<OW~ ú'¿ ìðôwv ú§>ØáéïìôO} °ÃÓßÙ%èŸú@`GÀQ!p=>ÿØ>‚ß‹/¾øx`‡§¿«Ÿý¿ÀOg— êžþÎ.AÿÔ^ïtµ##ˆw’ÎÿÇ1FÜñ8<ý]ù%èŸú@`‡§¿³KP?õÀOl'ÿì@ ëþéüíGFèß?î(¿{ñýØ‹ïŸÀ^|ÿö£ôþéúÏ;ÝQî?½Ø{±ÿöbÿ‰ìG§ÿtø|Òe|{ŸÀ^Ä'°ñ‰ìGŸCþø´Ç†€!`†@‚@,º"Regö?Äþü|ññžÿkö?´ß¸yCXüã=ÿçÚ„öGúÀâã=ÿçÚ„ö‹>ë®ïù¿Ú!€ÿ_€œßTý=ØC÷gö?Äþ“¯¯+ ¼çÿ\ûÐ~ÑÖ;{Ïÿ¹ö¡ý¢lÉÁë{þϵÿíô¹Ç{þϵÿ++çíõ˜{¼Äÿðóõu%é1>À±ÿàï(º³÷üŸkÿÚ/ú€âÃë{þϵÿíô|¼çÿ\ûù2‚Ç_?ë×/ñÿCÃäÞñÿõu%é÷üŸkÿÚ/úðqöžÿsí?BûEP|x}ÏÿÕ à÷dz@Pþÿ+À^à'‡†{ÿ`˜¬¯+ /¾hööÒûgiIñáõ¥÷OÏï—/½„£ÇÈ#ôþqýü{}]Ix±ÿÐìí¥þóÎ;Н/õŸžß¿Sì?ïœóìG©ÿ8|À¿×ו„ñ¡ÙÛKø|ò‰âÃëKøôüþ“">Ÿ|êØÿÛlÏ0 CÀ0ÊD¼¦þx¼túÁع˜koÿ/ðó›‹7o*¿ü'Pd L;×þ‹>p㦠c‚.Û¨kÿ5~ »þ9ÌÀ;;×þ3~@nÎoc‚.Ûèõ"ÿ_zjQ4€Ç1Awö‰Ð^Ä'pß?;ËǵÿOÊã·¶Dxüñ tåçÚêë˜=:ûq(kÿ©l‘¼óŒÇ¿ ³sí¿è0Q€ý(kÿ?€›ã¯ð²@x„ðbýùý³÷øÚ£|Âÿc|¸öÿIòâ£öãPºúqí?õ‡í/Bèì\û/ú.¦<û(kÿ/<þúÖÖYüÅñúãd;€Ÿ·º£<¾ÄN|dí¿ðsÔ_ø¿x(»òËÚòâãì`(kÿiwøðú§ÁPz;±ãK¯—\~|‘þCØÚúþ’2|x±ˆ½ÿðö¨¿ðÿÒûüŸø¨½ðþÁÕ:¾h/¼hÇ—^_xÿàá7ðWøñý8À‹øˆ½ï?¼=ê/ü¿ÔÀÿ‰³çýW+>¼¾ÐhÇ—^_è?xø9üÅ{©ÿð">bïñáíQáÿ%|Àÿ‰³çøàjŇ×ð¡_z}<üSüÅ{›†€!`†€!@Büþ"Š%‚r0vzÿéþWþïþþ÷_å \v Ÿ @òÚ1—àý§ûŸüÿ&¹í˜ËÎâÝÇ-Òûc®;¨û_øÿeð pxs;áÔÁ®.ö">b§÷ŸîòÌ •àß¼y W2ÛÃûO÷¿ò@;Ù€|ƒã÷Bòi‡ ;áÀ-<ÿ÷÷‡ ;ÀûO÷?ø?榎ÿ(ñ"ðÁ‡4¿ˆÏØ{|Èï‰øyˆñƒû_ù¿óÿ >Ü@½ÿtÿ+ÿ§„€o´Cà"zÿéþïø¿¿?ÙÞºÿÁÿÏ‚þ+ÿ'>PâE¿õ–àCš_Äç@ìÜ»ÍóÅã‰õ“íÔûO÷¿òçÿ;·ðÞ}ÜÂñ{!ù´ƒ¡èÎêþïø¿¿¿¤ dæuÿƒÿÿ ô_ù?ñ‘í"}Dìêb/âs öþýC~O|ðøííµüý#vÕ hÏÞ?ÊïåíÙûÇñÿìýƒñ|d8òúüý#vu±ñ9{ßÈï‰_ì?bW ¢Ø”ßË·bÿqüßß?ë?ðÿáÿåþ#vu±ñ9{ù=ñÁãÙ~Ùø»jbOÇ—ò{ùF{6¾ÿ÷÷ÏðÿøÿçõÙø²!`†€!`‚@ €ßc zÓOðÿÂJ유ŽÙßxcÔþ8Ö‘§×«ûŸü¿sЃ¿ÿ7cpÕƒ(î·>@ýÿbï"Äýïò@PþÿߌÁÕëÅý/ù|€Ø»·>€Ž,Üæ?˜_®07æ'ssˆžßÚÚ ƒ<ï? ÐpŸÚk×—ìêþÿ?&Âð1¾Éw­Ÿ¸ÿu}€xk÷Êÿor €^/îåÿ.€@îßEˆû_ø?íT Ÿ4üßáþ_ÂvÅgØ®õ»'$vãÿýó1>âþ'ÿ‡]ãÿÅÞEˆû?åÿ7¹@ñ÷¿ò@ ×wâþþOùÿ ×Äýç­·>àÿ%|`W|†íŠÏØõÄ'¶»ÔíôÿêiRþ.@Üÿ°.Þ{gï<”âþOùÿMÆ(+>ýú@ ÷ï"„þ ÿ§ €ü…1Ê)ÿwøÐA^_KKŸa»â3v=ñ‰íþýÃøàãøývöþ{Çÿ·³÷OÌÿ·³÷í.€ül;{ÿ0þ_ðþ¿¿ÞyÇáCyصÿ ÛŸ±ë‰Ol÷ý‡ñÿÀÇñû¼ÿˆ½ãÿ7A`}ÿÐþóÿ¼ÿÐîŠý‡ñÿ‚ðÿBÿùä‡ä|`W|†íŠÏØõÄ'¶{|ÿ|¿ßÎÆ—Ø;þ¿áóÿíl|Ñã‹ñÿ‚ðس›ó†€!`†€! Âï+ÿ§ƒ&ÅGùÿãÂßío@³?Ž<ó™3pñÿK?]øäçWÏw«p¡¨ÿßø;»_…‹.þ?¾Þ¯Â… þ® îz¿ 1ôÿ3@ÜÿÂÿo<•¬Â%¿¿~_¬¿ê˜Û…ïÙ†ëâÿ9tüþzŸ €øÿ;€ógØ}äÿËüÿ´û,P2ÿ?í> òÿ©ÿßÇÿ >iáÿ‚Ïë¯ñQ}@øû]ñ¹žë2»âCbO|¿¿Þg@þ?ñÿw€àóT¤“#ÿ_æÿ§Ýg€ùÿi÷YÿOýÿ>þ_ðI³Àÿïðyë­býUþ>dW|F®|R{Ÿÿø8~½Ï€ün}€Ÿcd(ŠÂû3þ»_¥  óÿózŸ€ùÿ<ÿ÷þÿ•i€ÇÁïµÿ¨={ÿÐ.ø ÛŸ‘ëŸÔ®ïR{â£þýíµ> €¾Ôîýÿ´Çÿÿbÿ?¯ß?Êÿ½ÿŸö8 Úá£ô Õ„¿ÙŸ‘ëŸÔ®ý‡Ôžø¨ÿæõ> €öµ{ÿ?íqÿIø?ìqÿ‰ýÿ¼>î?Êÿ½ÿåFšàqòé?ê@ÏðQ}@øû]ñ¹^ðI튩=ñQÿþöZŸ@ñQ»÷ÿÓã“ðØc|bÿ?¯ñQþïýÿb·,6É3 CÀ0 ]€úÿ/wüýf:Rû–çÿöŽÿØÕÿ/ž 4˜{~îýûWÏŸ—U¸Ê@<W¾òw n(¹>p^VáêõgÂüÿÝõ\…ëìÈÿ/ÇâbÇÿŸ’U¸])…ÿÃùíø}^¿˜ÿÙ½~°';®K? ”ßÏÉ*w-¿ðwQ¼ÿŸvfP;ù».þ_®gµcÍqoîîÏ,jGÀvÆÿ)KÔÿO|„¿çõ‹ùÿÝë{ºžø¨kø¨ÿ:–é÷ø»÷ÿÓÎ,Z?ðwµûø¹žYÔ¾èóÿûõbgµ_Fþÿ”ÿ¿.Yúþ#üžø?Ïëóÿ!»øÿ÷z=ŠËÏ|Ô¿i}@0o÷þ± Åç÷sñÿr=W)ký»üþ~}Øu‰í¯hþ¿>þüŸAÀP„ÿ >JÀ³÷OÌÿ‡ì^?ØÓõ|ÿ¨k_ (ÿ_Šß?ÎîãhÞ?j÷ñÿr}ôþéÍÝý£÷OÆÿ)„ïá÷ÄG x†OÌÿ‡ìâÿßëõì?êÚ—Êÿ!„ýÇÙ}|€ØÃþãÒ¸ø¹>ê?j÷ë ÄõŸŒÿS ûð{â£<Ã'æÿCv¯ìéz⣮}Y€ ü@ˆ³ûø±‡ø¸ô.þ_®ðQ»__ öŸŒÿS 0 {ÿÚ†€!`†€!Ð#àÉï‡ß {Ïÿ…¥ðÿÈ^âÿáõþ]ŸñY`«ñÿ7 ¤ü Ÿø(ÿ¿ždü€“Û;}!¼Ïÿ»øþþÙKü?Ô ü?º>ãÿº€ÄÿßÀ*†”ÿƒáåïד,ˆ¸öN_ïßóÿ.¾€ÿÇöÿõÿ®Ïø¿î ñÿ%þ†O|:|<¾H '·wúìÝý{þø÷‹ü?²—ø¨øt}Æÿ]þ¯?¤ü ŸøtøÒçÉí¾|OÇÿÿ~‘ÿÇöÿõÿ®Ïø¿î ñÿ7 ¤ü ŸøtøÒçÉí¾{„ãï¿Ïùàÿ/óÿðúÿ®Ïø¿îÐéÆÿm¢g†€!`eœàóû3 ð“$ àÚE8ÿ–R|ÏïÛÿ+ Èí0¹æ ·Ãœ?¿à6Ôøÿ§Z—£KaóôÐz væßñÿöÉ$ µÃ¤v˜£€Ôs0· )=ÿoaî|þfTþ jW`Þùðÿ?ÄG2{"¤v˜£€ÔsðúÂë²  çÿ-Ì}€ð{̨ü?Ô®À¼.ï÷þÿaËÌH½äöXÈì‰Ú]3ÞŸÇŽÉ&€žÿ·à/½ƒÒ9àe>O€£ñåìbW`Õ=Â=>yÿäöøý“Ûã÷Onß?bâÿ—’÷s ‡øŸƒ´kÀ¼{„óÿ'ý§d€ìúDHíqÿyç…wd@Ïÿ“þãxè€ð9H»¬ºG8ÿ‚OÉd×'@jñ‘û‡ü?ÆÇ¦?†€!`†€!`ô¨ìï7Êÿ&0¦ìËÎ%¸íùóW¯Šàüûœ»\‚›Û¹G€ LÛ™£[¦ÈíÌÑ­SÀ~ã†H!ÿï"pƒýÿ:|‰ÿ‡öûfç÷vnîúu¡èÿw+˜ ·s˜ ·s˜ ·s˜vàÃç;ÿ?ù/ûÿò†Œéû² >ÿøÀ'ðß“ÿ{|°Â¿`?þ¢[À¹{¨À¹{¨Àíë¯ßùÿÉÿ{Àó{jcüÿ@ì\¢Ü;|þï.Q.ÙŸv…) vä0צÈíä'ÎŽ°>ßùÿÉOzÀóÿÐGÎÄ.¥µ5‘þ¾2{òþÉìÉû'³'ïŸÌNý±ÿ8ò:Ð#|Ò.ýçwЂǓ߆ý§`úOnûOfOúÏ;ï ÿðùÎÿŸôŸ‚>Âç í‚Ï'Ÿ ÿþûŸ‚=Â'·ÇødöŸÌ/›ñ†€!`†€! Àáóÿ ü­«ÿÍCÖ÷‹ÿM3ÿÏìô¿ü?³ÓÿðÿÌNÿ[Àÿi_À¶vÜñ®óÿ!þß‚Ï_gŠD]ÿ/þm]Á.ü?³ÓÿðÿÌNÿÀÿ3;ýÿÿ§½Çϧÿ¿ 8|þß‚¡÷øüã?†øÿçv·  ¦Ìíôÿü?»žþÿ€ÿ·Pz|^]üÿ]Àáóÿ ¼ÇçØ1ñOj€ðÿ‚]7)Ó€{ç€þŸ]ŸðÚ{|ð|úÿ»€Ãçÿ-€Õµm²þ?ÿ$öìý“س÷ObÏÞ?‰ýˆñÿ @ßÞy'ï?™=é?©=í?‰=ë?èÞÏx~Ü’ßóóqìþÂÿ[(}ÿù䓟̞à“ÚS|{†Obð±!`†€!`!^˜§ó¾÷ï·JÎŽ}¸IðIÁ¯Bèù¿Û$¬Á&™]âo]36ùËìÛeø;Ù%þ¶³Ÿqvø´Ãøÿ.ƒ[!?Æ'пvìsOK ~@Ïÿ}ù±É_f—øŸþôz‰ÿ÷áàOíÿï3®Üpv‡ãÿý&næéýîýûIÿ9H{‡ƒ¢øW~lò'åìŒÿ÷áàOíÿï3ÂÁŸÚ%þßg¼¼(vþÿ`@ón €óÿ'ø¤û”“ ‚;|ÿ÷åÇ&m»ßÄMüÙõŒOî2žÊìB_|ÀW¼ÝáãøÐòùxü¤½{ÿÐ Åÿ»òû÷Oh/½B{éýÚKïŸÐ.òdÿþÉìc|ÒÞõ:飸¿€ÄõŸØž÷ŸÈ^è?¡½ÔøÿƒMî ø1>yþý³wøÐ Åÿ'øÄöŸÈ^À'´—ð í²¾¦ë?6å1 CÀ0 C ÚãÇà9ÈÿwÖÞ4Jð þÿ~\üÀþ“>—v%ø«üÚ•àv¬ð b;¦˜²þ?rÀíäòq':X{Ó(Au€øÿûw–_ ~`¡_@»üÀŽèx¿€v%ø«üÚW:;ñ!ÿì€û¢ÿ òÿ¶÷øÅGþ¿_`ï°~—\ý:ûñ~íJð„Àûcõ€_@ûeg ùÿZ¬ì´o½|‚øþ˜ÿ°½i”à; ùÿ$>Ùg@ù•àÇv Ìú)ì]€rÑŽ‹ýÚ_é®'>äÿq€r€ŸŒ¯,@þ~Úû÷Ppñÿ—ß?}àýÓÙÞ?}àýÓÙÓ÷O ŸÔÿ@í}ÿŠŽüüCý'´—úO`/öŸÎ>ÐD@þ¿¬ÿdð >jïñ ŽüüCø„ö>½ˆOgÀ§³'ã˦<†€!`†€!`¤¦çpñwæÇ§üä€íX„ë¢pÈüû9¿ ,ˆíœó)% @lçüû´O(Ib;çßg| @Iàí’Ðñÿn€Pã(?™_°‹Ü}ù$ ðÛ ~@YÛÉÿ?ð)% @l'ÿ_ò)% @l'ÿ¿áSJ€ØNþP ïa‚.þ®ÿ€gø¨=ÀGfø¸¡ðjÁ÷{Ê"_?µ“ÿ_ò)% @l'ÿ_ô)% €·K„ðÿË}áâïðyë­Ÿµ#HÙ—OÒêúäNà"€ÌþôË>E™,Hí ø~@IÛ•Ÿ¸=aw!"!ðùä'¯ôðû$>ë?jÞ?’k`äý£öá÷Ú‡ß?j~ÿ¨]ùøþIä3|ÔôÉ50Ò:û@ÿñö¡þ£öáþ£ö¼ÿ$ð>jð‘µ#øtö|¼}µã£ö›ñ†€!`†€!!À%2{g€Ëï—ð“·3 ×ÿÕSt¬¿å.ÊÇ,? ìLx +<eÀ@Bh™ðtãRðzd $„–ÑgÀú»ë‘°“$ÿ?p£ x€Ÿô!)Z ŸíÌr÷dOÁ±¾¸¬²¼Ø™þîƒÆ¥ Y ¡ezÀ¥Æ¥ Y ¡etÀÆ¥ Y ëÿ¹@Ÿ@Í —߯ØÐá#ëÿ| Ãvü?dèð!ÿ'Áo\ ÖYuH-Ó.6.íÈØá'ëÿ¹@Ÿ@®c@1þß¿´s•r ¸üd.Ë,‰ìߥ Y"; X7~°H Zz/#;²‚ËßÖ§|ÂøÒø9@{ôþ‘õÿ#ïòÿ±÷ùÿØû‡üìýCþ_zÿ„ò%|ÐõÏÿùÞµØ\~€ÁþCûXÿ!ÿë?ºþêQÒÂø>hðñü—`ÚÇð!ÿÇü?ÁǦ<†€!`†€!`”'`ÿ¿”¿©p€v®ÂÅœÛS,¸ÿÓ 8þ³…—è€XÁ®£ð øÇº(‰H€3˜sûçKt@&òirŠÀýûmç*wpZ_>¸ÿSÿxGA%: @ð/t^¢bÿƒ. @¢b ÀR Ñ™à$ìÿ7T‘Â^ÅYÀù;üŽ¿˜ ø/vøIt@,€à_¸ä¯—è€X€p©‹è€LpöÿÂG$€ƒ°s•r ¸øÿÀ‘Áu^¢b‚‚ÿtGáaÌ€Sà$ñ^Æ€>J@¢2ç$àŒŸ.@þ~Û÷O ?Pÿ³? ý§ €ÀçÀìG›ò†€!`†€! žá# G6ÿv.J‘ÆŽU¸ øÎË/áÿˆhtÈ‚ï¼üþÏ€]³€à;/¿„ÿ3 n ×“à;/¿„ÿ3`@;•4ü6²{j£øy:h;V¹ƒà;/¿„ÿ# ÑM´~$øÎË/áÿL¨›¨ßyù%üŸ)uµ“à;/¿„ÿ3 n ö.¾U‰@Âÿ!4Ý€®ÿhü0>e¯ãC‚ï¼üþÏ€!~$øÎË/áÿL¨›hýIð—_Âÿ™P7Pûe,ùw $ü@ÓmÐá#‰Gð9(;V)“Õ«_Âÿÿßt\fÁw^~Øø?ü.¨ ¾óòÃÌÿ!3@h'©W‰@Ãÿ;nÈCÂÿ™¢¬Û ÃGà‡ûÏAÙ”÷ÀãsPö¥ÿhü0>e?êøäˆØo CÀ0 CàQF@v)~aþôØð¯ Èÿ5ü¿ã¤Xø×…’[Âÿ#;þu!€äß–ðÿÈN—¾H’[Âû3»H’;³÷Ÿ¢>à·_;Öu!ù¿†¯GåGÀ¿.üÿþÙð¯ $ÿ¿„ÿGvüëBÉÿ/áÿ‘ÿº€ü_ÃÿC»Ç§Èÿƒú”½Šñ“…äÿüð¯ $ÿ¿„ÿGõGÀ¿.üÿþÙð¯ Èÿ5ü¿„O‘ÿø”ɺ@²ÿ‰÷?*?þ5›ü_Ãÿ#;]ú"ÿkøf‰@ò“çvlëBÉO.áÛ%|Šü?Àç ìÊû§Èÿ|Êþ ôŸ"ÿð9(ûQÇçQžâXÝ CÀ0 C EÀ ½0‘§xcwpÿ“ÿÃ%™<Æ òŸÛUØÿÜ®€Ä€ü—í&@þŸÛüOþ_(¿ òŸ×O‰ ùÏí*HlÈnW@b@þ ;Llÿ¨áï€a|T@ð?ù¡~*HlÈ^$6ä?·« ± ÿG'¸ìÿyùÀØÿÜ®€Ä€ü—í&@þ_°« ÈÿÑÃGH{ÿ”õÍOp­ÿ”?ÿŽ>>6õ1 CÀ0 CÀ#Ð Žb #ï ìø×u}òÿèQø×u}òÿØÎ˜%ø©x ç!à_×ôÉÿãëi×£x½÷"Týk÷GÀº®è“ÿÇågÌ¿ürýó¯¿lgÌ¿ü²1ÿ\Ð'ÿO¡8Ðþ11>ÄO ~¹~ŒùW‚_¶3æ_ ~ÙΘ®è“ÿ-|óï‚ÿK}ÿº Oþ÷/Æô+Á/ןv=ÊvÆü»àÿ1t¸ýÇÞ?£øcÁˆõŸ‘Ï¿›ô†€!`†€! %€qXÒΘ`ºáúäÿqYhç:€>ùng@Ÿü?·KpÿÁçýÇì¼ÛAÖ¿v–nì>ù^?†ôÉÿs;Ãúäÿ¹a}òÿÜÎ0€>ùÞWŽ:>5üÐ'ÿÏëÏ0€>ùng@ŸüÿèáÃ0€>÷_^~†ôÉÿs»÷— >úù?jg@Ÿ¼ýèácïŸá÷?Û×úσMz CÀ0 CÀȀÆ‘Áa8bïsÿ•íå9W®ôð×íGŸ²»¯_9 ·—#z{9 ·÷¹ÿŽrû×ð©ÙË}ý˽½Ïýw4ñésÿ•ñësÿ•í@7¾jö>÷ßÑħÏ=jïŸyZÿ췆ϑÒV CÀ0 CÀ( E „†"ð}áÛ~Ø výkÏ7|ñç×Úï°í‡Þa׿ö|Ãç°°ñu´[ÀJg†€!`Žž`Mf†€!`†€!`†€!`÷î;¤vCCÀ0 CÀ0 CÀ0 Càè!`ÀÑk+‘!`†€!`†€!`†€!pß0à¾Cúˆß°Á1 Á¨uüRÜ´zÂ#޽Ußx˜xqçÅþ=j{‘<ÌYÝê'Ðpƒ—ªß壕ߣY³>Ö?l|ØûaïÇþÌ8Ò·À€1ny¤q~T ×47oÞ»7¤T¬wï./ªµen–~ðO±'&ÏV[x?ùÿ‹ã @{üøÈ­¸Gv«õ®hšåå»wGõí±š{÷nÞü€¶6wñP~“åËø¡+²Ù Ÿ#Ý?Nž<Ù4ø&ÿò‡f?<8ý÷A/¿½?Fߟ»z÷?¤'=P@Ó¬®I €´Ðˆ!EhÒLsŠs¤që&58F$€ê ?FÛÏ?_ZÚ§0á;c5¨]ðµ·'ìØ0Ÿ ¼´óÒK/ ^ÿ<Ur€¼ ßðϸÐ_ž¡ÍÆÚš½¨'hÂ#|éýx?V¢×Èîñ5¬ožÐègã€0bmîÞ»w—ßð|—rtÅ0»ás„úÇݬžœ›;ÙàþÁï³¢ø—Éë¿_ùã÷G^¿öýrØÏÏÞŸGøCíÀ‹¶`RïÉ„×7ÍÆúÜܸp?&{Ǽ}÷Žw÷I ÷þ¼Á+w 1Oð1Ç)(ãVˆË:{”ª'ÜG nÕ.]lÛ‹ûSôݱîYµ£“N÷>x\þ ÷‡õµ¿ûì³Ï~wøãüàñ:€'ý‡0¤ÿ¿ûîλ –ÁóhK¢U´r;|¹RšÕµÕ¹ûÓ!»å4_}õÕ¤ïÇææÊµ»ÇçSYÐðù+žq\€²0fîÒ/W‹ ?w €Ùï>wTf98|_Ùÿýѯºýñ>c‚úk,F‚¹ÿÉÙ••jò³üƵ°ÿ4þµñ3iùk÷?h{±üÁû£fŸ¨|?’c´ÿèó÷ù~œàSç¿t÷@†27·|ÓÌÎNp}ÓlmêÛc}c8Šî©éi·Zîlðÿíí[·~ 2Ái^;D "øY9Æ­ÒXœ@JÕ¼Í[rù¶ç£AçŸ[][ê»U;ÈÑ»çnÝÚÿÜs‘¦ ÚÅ{©N‘#¶¿ýì·ˆà÷½ÜËÎ%ôü ÿïþ qÏ?:85 I€xþ—–ð,0úäŸ_eа:7Û¶‡øš´Þp04óׯ_ÿê»ï&y?6+ø€-+»/uŸê 7,ŒY±:³êŽÿ»Ÿƒ€‰í Žü*o½‹vâûwå_¼ÿ‚špLO<ÿ˜X¾…{Ãå›ÿWn©0€ïÜ“OÎ Ù—··½0t=µ'Ì¡öß~þûm¥wùó1÷YY9¹tÒK Pè_®†û}~Çû¯¶âÐý'.¿+ÀÝó8ÆÆûñŒ¯¡òû:×ìuüôŒ2~?š–ƒ Àþ»z>úÀ¾Ú¿{ìùúƒùHz îºkô~~zš~_Ó'\ò¤J£kèfn͆£ÿ|sln Ü£™~ @3??Ò0Òl‘þíó f[çÞ}~ˆܯÍïüq ¼¿œ;4`búŸ$€‹—/Ž ¼š}tÐJÀ>C„àã’ªv 8¶·w5þ|¨¡úLj ^na!Oì^hÛk+¥¡ü[õý·Ÿýî·‡Xý}½}±¼úh2ÿ«T®âÃâ‘ó ÷G/gGÏåýÔ”ÿK>Àä`ôÿòòüüüÐ"FÌεs&†‡ÞˆG¹"à˜@PîßÌç½£Êî«'(tû”4ú?;â˜/ËÑ—Ùƒ;mGvRß`MàÓç“‚“DÜàæ§†í Wû‡$×/l9ÓôÖtñþÇŽ½-‡Hùó777ï݃ÁŠÈ÷äþ4GG©üwCÕï6{ò]®¿g > ÿŽÿS (_ÿä“}“ò…@,NááCE¢ëáÙÇp«î‡Rù£gŒõŸbû“Þýu«ë-ýõàû+ˆù_—È"pG–NþVú×ùÜîÛ]›^»r±}ç‚8š´ÿî²ü—/ÏáÏå$‚!êZç1{ ¿ìɽÚ}ùÓñɆë"@ð,¿«sÍ.Ãgp|ò¡£ïð^¿°`oý#z¿-Ïx(mŸ3£ãwá²½ÿVjÿ“' ãë(®tÙ"`$F¿™›ŸÆÌJ$€Á0€ÑëçÀ€T¹~c½Hoš5ÿ‡Çf9 @€¦™FQçæö ]§·_@ÁÿâzÆ ZN\9wÚßþÇänCðÿ¿þñ£ÁÉkóÚ¹×^;7Á¨YRËúË.gă—»µÿüŸµ`,Œ=ŠŸ^£QÕj¿f¯mûùR»¯€f‡J«ERͮҔnU[«iÖy GÊTí·xìJjØó0Ûݳ³ãçÅöã…#¹^€],áoqmåji$·Ÿéoñ¯û©TƒƬ٪¶þîþ!ÏbÜÿU¡þø†#°ê_:÷ó ¿ñót‡p xñK~ÃW‰ÿKô?4€›ƒÀ>… <€îµ¹ö6~ò»?h×CõŸW ໯vѼ¥O2 t¤—Çì¾póê ¼xìHÀÕY_0H`._V{'¤`q///¬n$YYswð?¥ 4¹÷±·•—ìäþ§Îª|Þ~áOò]ž´G¤ICŒÁJ÷ <†€.>$.þ!Ô@âëoã€|°ÊYý5?C` ýœó_§døÁùO@b|ØhˆÀáÔ•þËÍÚöööFS"PËÛò<Òÿ•¿Fþ|!ÕÒGÜ·ÂóIÿÿºõw×u×_ ×®-áϵA€}‚Ǘ눥þEîþ²*{(¤qﱇÙx²ò‡-þò~4&CONüQî?ÆE€tWZÿáò»°‡ÁöñÝvaù믗»!ã{™öNaLí°poy@¨•Ͻ›0ÖœÞÿÌL¬¤ïËì7"¨áƒß‰àõ]|Nìõc÷;?ÄÉ?à ‡ò/À Ý­(ÂÚÌ!öR%€¡•ä_ ðo6gVWc `½¦îy-¨ÿSø ¹¾¾g ]ݱ:äÆßiÿŒÏn™D”4ðÿíío¿\hþþ?"ÿŸèÔÍ…+//^¸ ¯àáxut,ø>ÑœþõÛ§Ÿ+\ÞE6‚þ3`tJ$Ü»w}„–2År($Éâöè ;'W76¶7†GaÍ>>~Áü/âØ— »89  ¬ìÂî4€Š@ú/wmPæ¨5û­[¢hAØí m×'îŒÓ¹gl‡Ë—Ž_~€ˆûW¾ã[ü¬‹ï_Bï¿ôþà'»ý_(Ÿàýþ ÿ¿ýÝP5Ð{ï3ò¤î­ þ÷ßE«ÔbFFn!kÿ…ú»/MBú¿}·Yn @Èÿ±äß-Xú\2Àä‘ýæÿnX˜]›]CÀ º „Sö6~Jô/ãïH\Ï&u@Uhšïx$C @ƒÏ®T—ösys.pkÿ‹'x|šæ:vÈ %€9ÊVÏO˜]àÊ•'®øéºŸàªôßÙÝ=¶ß»÷õ×_ó ÇÂÚÆjOðåzüW׿˱páBbÎ <þM¹^xé)áþ©àÊ/Îÿ…¯ùMÃÒò!Ç´Hí`M.Ä8Üý]€ó†ÚaV`ùí„ »ú®C— À½iõúÛëøã€·C #¼S8|ü{\?ÿ%…€´þ`ÿz¸Fí`z,;u¥€ºæÖööÖ–ˆî¯7Àý=¿† +_×=Šö»ÍmN ÿn5˜þoåä5,á{¯œŒð]€$å:Ÿû)z¾pþóÂýS€ÏóQê‚V !)ÿ]:ÿïÎò›†¤öÝ–“ô¡_‹yùGÚu½ {/8»¶»«H¡ãìƒ ~1„¿çÿãv>üëk×8@‡Úÿ2í™àë÷# èzÉ®ñ•ò-/¯ÏàÏìÌÌÊŒ;$ןÁìùŒÅòõƒ÷ëW$ô!)àÿPÒ÷çƒð~`e :ù…â4€fNLÝ·’f†4½xýÉ“ ð"H@žÍ¿YßPŠ_ðo¶ÐøÞî…€Õ }¨7SüÍSXÊõ¹éd£.~ð¼G€ö*#n^ŸNùAPÌØ>ÿûo¿ÝúýoWì¶q«À¹×N àÿ½þ:À…Lhn½:¦4§OŸ¨›Óÿûôs¹€öæˆï¿þJ‰ ÀõZ*ë׆Ÿö#?ë4‚BG›žÞ^ófm Ð.B†PÝŒ|gjª@#›æ¸„áySûqñ”Æy¸ÁL»lPFòÀ¨]é?€]“Í~V<~Ié¼YðÂ_ºßÔì;|i ëwÄ_õ€\X<7À‰KËÚ…••k¿(óÿÎí†Bšfaa×ívس[lµ þMÓî@Ø]À}Ö “;÷ÆÝ}Éý™žü_}é‹/¾ ú(>ºå[°o¿• €`€„ýÃõÿå—œs~ÉU…%Ú Æ€µ9ä„¶´í ¥öŽÌ}¸¢6>v{!Þ¯0®þûå7Gol®­ à5 /õ}ÃÎgöÓøR‰/9ŸbåÁ×\ÿÇÑIáç—ü’r«N`¹¾ûÊøþÄ•Òýr`/ οÆ€…õ͵ Ä8P†@ ý8Ä÷îþ‰'è ý8Î ÿ× Þ P¶ðù¿°åV$@ø¿ 1V &›«««q@dß„pöeD_ÇF‡oÏ\ÜbˆàzÆü¯ßÞPàrÐ œÀLݽ;•Çù5À+·$` ˆ/¶0ÝXs!ñýIﵨ?Tð¼Ú…®àöí!Ü_ ÷ htˆWÂòƒôã@\½¨°GB¼ÿ4  ,LP~ÞÒóG›àÿ¥ò¹a;ºpXþ$ø#+_ѵ@‰`Ë#vbÿõ‚(tyÿÕß\þú2þÙ©ÏÑæo°—ò‘þC›Ç ^OÚOì¨*db/”F p’ˆˆÛÿ>|?¸·ˆñï‹Ôˆ@ À¿žŸƒW0<õôÕç¶ìüØ?‚Ö×qRrN³5·á%€4ÀÛÿ±SlnõQë'7½‚(¿Eø6Oþ_¿ômÀØÎ®RXÍø½¯fûç sqz$ ˜ °ý­²)¬¨-2ÐGqª_êQLPŠpç7ç€‚å• —…þãï…øöÍ-¢=câ÷ 9}¦ `^s½éè?ŒÍ^H­0–E©I•áƒLElÊóÿÁˆÙÉ™±€š}}}d$ƒpt=h4ÏîѶ °%àø¼J䣚U `ÀÞàz‘Fɋ 3„†ª½[n°kŽÔtoãáK€G£Ûeâ ?u“oþ6ˆ]pßQûÎ GÔ˜ï/žpy Plfаÿ«+׊!Jú•ý—tÛ……'Æ›f`l÷Xä—“®¶`àtÿk@ö~M+Ô¬FPìõ‹ôÞgøäÿwïþ#¡À€Âù¿ý–À»Â$.ýß—KO>ÉYè“O~ þ/@*Àýèÿ5òüµ9æh‘ `uvíaIP»=èÌŽs%À¨Ð(ýçj?ŽªQ]ÅÏ ŸB’Ø_馤'ð#¬(xþO@%ùòÑè?ò…ükŠÀÔªsùÊòwŸ¸{åÊ•eU:!Bì—C»ÌÑc»óý3`acsñÖ>VI<¨pz3@¸/‚EDò†v¿üžîKY‡Ÿ\ÒÏCüÿî‡äùŽ_NG12ûw7Ä+tAhDZ~°°¼Lö”ÚéàÄ÷÷ÀòÛ§ñGbÍÃú má_B$ûbþ)@è–då¿;ŶŸÂáױݑ~ ÿ×…9>1 Œì=ìb,²ë%€Å…çÃóÒGœ ¿¾[fPÂßÓ¾îß¼þ $€¿vKz»¦H€ÙYßù•aY $€… §døqQ=×Õ“c»’þÛ­Op« ø‚ýÏÝž“ €Rý1ïÜUùÅÿT&.¿ÜTJ§ü?o_Øeô(ÿì]ð‡_j‘´O*Îì©ü]Èû@ýºÈŸH(”?2û¦u¹»ïwï-¯ƒú¯âÏÆÚÜôÍ ‘¨¢ëéþ@T‘ÒûÃïï¼ÿ…ÚSà`b5÷:³:ìó{Àù“çgNv‰¾¢> þuÄÚ'ó'¬ÎÎ’¨K@T1\ßÏž\… `}ÿË®ç6žâoyrßQb'8‰`kr¢w…1𼟀ÓësOåÀ‚½}ŽcHhW•ž»rö¶‹€b6À> š @¨|3·$H A±ÿ$#¦ —//^f~ZŒZ§yõU Pš³çnÍ¢à÷ÿõ¯E€ €ÇÙ5§RŒÔÉk8€ªbôV1^Ç2€¤y4îŸVcá3Œ«P@`Ûr5‚T!Ø…poX!@ˆþ˜pq§=9³´=³Ñ.U†m{bö¼ØÙYäïoá“ÿƒ¸ ÚÝõ5€CqJœÿˆJÑ®Ù]¶,ÉÞíû sd×ÞÝÊ«Œ“*íwä?8õ–¡'®Jª„óúqû ÈjüMx‹‹¸¥SŠ[ùÓùß®,’pƒ9åÿ’ oZnb!ôœÿoo•=Ïrço¹“î¡óÐð‡ c«“ ¢¨Эv×t UÑ"¢€ø€¿xp±òý¹únHÚž s´óøêzóóøs\´ ‰ü¤¿ä)’ï^ÐY¾¼@@ä1ý_^@Ÿ?Dâ5fh›5þûð¤˜püèø;¿ïñ7éøÝåõ7ßÝ8˜¿ÎøEæ†üLºŽ]±o û»ºÓ\ÅxB”¢lO~µá_ýüâ§PGÿå DÁÝõsªÓô3Œ‚AúÒÅÇžûpħ$I~/èªýääÁ¥ò©ªEPàîþÛî Nìb»¸~5ÀÂæ}¬±]sºøãÛ;W-sÝ2×õ‡øúSgùkÓ|Êñ¸þÀùÿãòÓŠÏ}\å€ôz ° @b'ÁW¿; všÀÛ`œ<ug^„»üÎFvúÿ×o †*ü1· õ›Z¾ÇUø'oŸÿ_Bd@V^Õ'Ìì ‡ºò%b-(ä×/?Ñ\Fï¿Ü<¡[ùùèúO"Ÿ„™—Ë7ˆ¯Tó6|L8ÿjÿ|þÏeýV€qù$¦ç>ˆ<~>WÕs]=Ãëõ‡}”ïÞÝÛÀçvV¾.&|²ò 6P~´5R>f²ØÊÇO²ú#¿Ý¯oê?„­~ÎNmŽK\†Ž¬‚`ËM2’?_—þãSZ~ØSù–WgçfNâ¼_Ó7×0”ƒ—,;Ô&·¸9=·¶!:ÁÚìú™´| —W$ú_VžŸÑK|·Ó܇ï¼@X_×þó ÷ ;¹¦0Gâ¯þõ§žšÎI>)2vßÌ!pƒžM„Ì­’ÿ?õÔLv=¦¶ë3.@Æÿ8ΰÍñëâÜ ýLJµÎ‚ý1ÇåÿÌ(ߦ§S.×NSXº8àâï#ò\* ì" ” °¨%hn~wë×6#çTóGç÷w@L¿‰²ÿ#ô¿ ûfQqÿ' ¶08wëÕ[Øeþ칿@8—¬hž{îmUœÀ%rôSýhÐ)ÌÅ‹˜Ï¨€‰L@ÿý)ÉüŒkû—•ü÷ÀÝHà)Ñ”ò€ëñ¾`†à6;&ì,áúkÛ3PÆ_í LµSÙYBàÉÃ`Äî¯U˜ü†Àï«Ù%;ý°Åë‹ÙùüÚWúÉÊÄRÇR¬HØ—°~™=áÈ€qû /§Àoäç^ˆ ¯qÿ] @Ö‚íÊ5UZì€DÉ ÿ@1 yéÿ(«nbTŒ=ç:6Â7Sö Óy?¾1@<<[[Œ_ïÐñã:›¨ éÍFÛ®w¿Ì¾6yô‹ôl)J Q,BaP˜‡ãˆN`@îÝS@B\Ùõïy¬ÿGVAs À·ï~‹,Üø?ƒ @ y’‰— Û ,.óÿ¯Í6ðÿË.kЪ‡Âl*Ù'wޤ}²ñ#ãë<ÆßyùK5 iàûpÿ Æ·”o…ï‡ú~(îÒÁ þäùwèÀg’ÐôD/4þ€?7Ðÿ Ð{|Ùü¬ÿôB¦Yæ ˆÏåÿþÃQ>))8ŠÏÅÿ7##?O{@wUâ‰+g7žX=‹,Ý‘5ß—#ûå`þ-vYú/ßÁÿ7#þ/öŽüãSwó6üÿAùiWÿ;ˆ‹ÿ7±ƒ÷Ó~¶û7± 3þO€ ô{|º´õP ™]ŸŒK·DHí¡ }Óû'9 ÏgfDx á€Îñ Š(”¾ÿ{díÙýý ÿÇÏ¥ú‡@n'9?{÷ý/ß—H‹ÂõH°Öl7k’0³«ù¤†,ñïÍå׳ͺ0†‹ê¯€Ë°Øg©,1àÒRÎÿµÿ²ƒ|Þl}¾Õ| ñÛñýÁûÙ¿.wÿ&véSa˼|è\šüeŽÉ üç5CaÊÿ»úÉîèÆ ÿ{¶ )_°@'Ú{)Ÿ8´Ü>ÿ¯5  Dèîÿ¿$”EÅç3€ݞ˷¬3ó™lÓ;sS–ÄíÃw ,Ô æfWÏtïW×(à üŸ@©|wƒÆÿõã)f‘9OÒüçìž+ö/žü4úÏ_DqÍì #û1±ÊÙ=Åó €×“Ê'×oÎl`Ð{xù“)&„$œ[—Têk’áŒû(ÜÆg=¾A·‰Yˆ4†ö¢æXÐEä¹|úŸ@¹L÷ùÞç¨DŒ%²wï;øÊ% Ç¶süËÜÑD`ñÓèèùä§Y¤÷ÿÂâHÉ̤§ý½Ï]¼à€_ÿï3¿Æá²pjsÏóÿ{KK÷îýá7©ˆЀÿ;ëEîñÄ]‡¡s—ÿð‡»w—–îú ü.ˆÀ(¿Hë]œ¥g003]q=îáß9©kà²RUðùÊŠ„\ÌW ÷ýÞÿY¡òñáø»2|Ÿ'8ÅñÿA{=èyázÍü›ÿŸ­²QûTÅ~™Ø}NöÒº<³nî~ˆW6çÁbW8gLXd¡eèí?óAdé—~!€GT†÷/éú§\ÊøÖRr‘­ß¿¿_P¢¿'<ý‰ S|i¸åÈóqÄÁO ®ˆW‡þI’/¶ÖÜJ€ž¾S$pT†Qø³Ñ´|›º‚jd(#4|€áüÈ*Ђ©wgèË¿(’{8ÿµzÿ‚@ Ã)ôI À/š¥ë_Qøêú€«ÜÐÃÜ–rûeº•Õ·Ý6ôô“ð“ÿê $Ý Ðî}¬k’$Mƒ·)ú<œ øÎmÓ"H-Õ ü½F˜£œríýøøIq|ÔÇ×ù)þן×h€ “ׯßíøí¾½ßEÈÿŠ|c´P>ÿ¯(HÅGîŸü¹ùs£üÿ$~úsÐ ì5ÂîùÙ£ŸP‘ ŸEî ý„Zæ'T¬àSò¢ûpÄ¢ LN>Éÿï]¼Ù}8:+óåºAMF ÞOþ‡‡v=ö˱)#»ÒLз¶ÉÿÓëÉí\ Àæøz=x p~ôö(»3ƒY|±ŸUûÙSÙó®þék'|ý§«äúIù–À«UHí]ÀTHì^àçžéõðþk|€&ÌËÔ­+¾^öp9t€¾ðýC(]ï×ýû$¯ ´OŸ0ǼôÿîûwEÈŸ7'>øC µ§@±ô9>ÝÝýê_B1Sü ¶r@. €<ÍXÜO`\Î þ: .xµô¯ËÚ¿b ß»'Ÿóyýï"ûAB&áøñãc¿ågl‚(lÓÿŸ=Ÿ±3@³­,Ùóµé<„7Žh)qùâ$€å—,ÙþÝΊN¢)õfpGáýÀ¢]öv øÉ&l¥»Ž«bù–gO®­#´Ÿ€&Œï/KnÎÌ­®9¥àä™ÿ P*Ÿ„øaùK³ÜGåwá°ú9Hsø7%çüIV­2vìÂoæÀê縸ÿæ×+ã>eü' ÐDœƒþ§K6`Û„°‰ÈÿagT€ÌÇ ZÈ@N@„} \¤Ä1ð¥0@³ÏåèÓÿ»Év€Ü@éMq?À `8@sæí3ÿä"ä-dKCò‰ À­ÿz‡G°! óý¿ÖˆPÞ Àe äÿñúÀÿ~1@Üýÿs\€O(]¿ˆ9YþdŽãBta£aùθ˜„hÒ»Ïé'X^¥” ‚Wžá€lŽÅþcþ“D¼½PV.ÜQÀÿgVnÞÜ^@ü{éæ T `§…‰N°wÀN HÔà‚v:‡ð˜âÐÿ)¬]±ÇÚfˆÿK î€på(ß\¹‹ï~X¨½ÿôÿwß{’ ú¯nDMð› ô3|Ú¦ö…’}YܧPˆð¿tb§•Ń‹‹l™— /xÃpäæn÷¿b@ãè?j7’YšËßXnT6Éò'ʪž·;¼Pu.Ë漣€_Ï`zþßÊÙ[XƒáÐ¥ï4ë\Z ‹ øƒòÜ`ø¹Â9 ‚1ÙZÑT¢ˆ"Hÿ¯"óyø¿p?¿ ðÿe¿=š,Âfï"0@«GàE  !LØç@vÎeêº]@¸ zûì ÊßÐÿ¿F@Žà%«OéßGÙÎññÏ 7¾.”íçÏÿH{þü«üƯtü¹ëOßÿµþ(Œß©öWýQ´ë*_92;hÿÊ ˆ pcåFô~èFȤ`(€YþÑ…ÿ‡Íw;"\'1ù @ yi¢O¨(Â_>½ô¤è*Ñ}8Ê'bð Ù8v¦n«ÃUúXùÿ œ¿¯Ü[~Bc¼ƒáy÷ÞåØŽ9zlDzKÞ@Êps»ü'Ж]æÂIùÈÑu ~|(½]’¦Ï#Jv(Âÿ5—Xr}—!Æ…ç§éõÜ@·P}vx…>‡šüSvˆžÏ,€² @w”ð“ €Ù.ƒl?·ó®Y_y¥ˆ¸\RÿS$€ï‰X.à€¨ýY`d\Ûb€fŒíòêìŽöIfr½xw)’h$ÀPÿ!õÊûC¸ÀŠ ßú7ÌÒ²`Þ¿Á¬ûþ%I³úËcÛö6·c|yûË“¼÷Q~dÿ“­ÿ”ÿG9 eü"ûŸlý§üŸÃ'+¿hC¢$í›îPª?#JåïVùó…úɯ$ÀÍ.GGvÉp³K˜Ùû%:¥ñ¥ =À*VåIøøuÝ0º¿KÉ××NΞ)¼ßÀü),P(ön(&öG…íê `Ì èà÷ëëXSžŒ„ücŠJÞO ÷¯cé:<ÿr=ÈýS3Éõ3ùÇõäý$'@" lŠ@ÏþÆæl2 ¦MnЬ¯mœÄçͪƒ YÿewBè< ¥c”B÷—½m(ÀïÈIÔj— À#Ð/þ×]²íÛç}úøÐ·Î½û¼£zƒ>@'hÞÞ~ûŒÎ²ÿåÖ¿œ øüïˆÀµÍ¨zRñ­0´`#ÑÿÂÿo#@ à™,]:À¸«PÀâÿßžk àÿ<|ûƤýΆOà·„QÃ(„!L@Ÿ‰ó遲Ÿ¿ úxŒ ÈÖYú8¢!?C€®PR^¼È0&œ8±0@ÿwzþN 'Ò=ÿ/Û£ëŸ/¬Ï'ù”uTÇ ”þOM ÛIÿ3MìÉž¼/Àýå(iÍ•o¾ùæC|鿹\ù޾ëP¬‚|þÁ æßþÌ PP‹ xâøg@ ,}{þ{òŠö}l†ù>Î^†íJp”Ï’ 9ÜbeN +Íœ4¤ØùÕ°è çë/~y:‹w°ë*— °ã>²F¿Ýñ ½2öéÙkø„Š?›ÄaEþßB¥Ÿ_ è?eêÒäȧgôá(6ŸDGøƒºtïÝÆøI÷<`°ÓeßÛÅG×˃’•©M?ßñÿÌÞ ‹÷ð’Líºø_Ž8 ¿+Ÿ.þ—#ÞÀÙ…b9òòm€ÿKÀF"HýÓÙõ] À“è"˜å§õïHFäþ,—ˆRÐ-ãü¸`xÒý™ x¥ýËHe¿ 5Ç+{+ß©³ìQW¸àKͲ˜_¯äÑåÜGýEé¼ÅÉý)tòþ—¢á§{ããU“x3 ü—>Ѐ]ü/G¼ @п”þßÄß›ˆHÛE r$ö»ºÇ$€üù»(?ŠwmEù¿&+Lîî{mEù¿æÐÌÊ'4®v—ޤü^ð™B õÝ Üÿ´R>ÁB±ýD¡ƒàc`RüX1 š Ç·kM–+xÃRÄv,ùÞåÿÙõg  |k«±àúØÿ×+7nÜ P*_ÒEÁ~ʈç«çAß™L?€F] ú×e/žæQÃõ˜aÅ×3-€FðËõø7ôÏËõôòó„iÎÎ&9@`3hè[›8G§ ðìýŸ›åêòJ²H¡‹èòÿ•st;Ê.…Ÿþ_" ÉÁÿ··±”þÝV|üïFÛ"âdòÒ–qÎßÚ¾õ/ ]ü¿¦ !øF)€‡w4¯AhÎýÀ ÿçäÇ1ŒÅÛp;X àg÷x¸$ îí(é¾\à€¾Bò1ùÃäåp›-tÜŽÆ{؃AøŒÁüLfX´rE+ÿÏ…—}’ ¸¹œ›K¾à”ezþ?ƒ7hqH¯VF~·Ãy0³„,€Ãè?V‚—Èì©]ÿ“ÏOC d¯\ßÓÙzú?d÷ôŸöç³µèÒú¢.¦ÖÒÿU8…×uŽWù©ï>šÀEèIÀ),LµËðC*¸ÜYõ'ìì,^:Á‹À5$üÅ5,ÿÇ‘÷Çûa+îÐÂ`€Á½qÖš8ëË‚¼Ï¸ã^ˆ±œ~ÇÿóSHðÝ}ŽAø{¸4 ~- 3 p§Îƒ[ñçôr.-à Ð¿:þuîø‡%P°Æé+|ãÏ’À¯`À èknѦEF@OÿAóî’". @¿ =‰ÒÛÈÌQLà´Ü bÿÙñðñ4ƒÝ6N†"œBô«_•û·}^¾À÷\²4*”ÞŸŽþË>ÇÿMب,˜Þ“޵ð*ð×-l b‡ŸPÑv’ üpÔ~®ƒOŽúY|¼«Ž{p^{eáîÑY“FöHpYÙ®][ÀÇó«~‚ÝÙ½@°xïÂâ…ÔÎsü…‰Œ^Ïg×m» v·Í ]Œ$.Ⱦ{½x^°Éô1ͦðÿÂó»ãÒó™póž.Ðí¾£ûëGpÊ@ø¿Yù!Géú{÷°®þ¯Üâ^v瀣ø|q³—ŸÏݰà bÎ^¹ ý>çËHàöSÿˆ"åí3¨ÝÛݦÃý^òS§¾úòCA Z§$÷g€ë_ ÁîêßÓ†äå‹wˆí~É^èí»)?€kçÏ‹ÿr@Ôÿ(\;vLüÿØH“‹âþ/Á˜Ôb3r|ö‚ʧåW©B_ËÛ¼~âüï:`¡}‡4Ü¿E ƒ0Ôÿñ’`ÀÞmÈ·Q¡|ü–KùAN•-ªÿò,½û öHU:0þÎÌ`+@U NbÀÂûe«æ²îvü¹Â£òË$`®_rü'žIÿ èJ€Ô¿®ŸcŒÐëIï³ëÉßà¼ÿÔ’ »bD`!'Ÿ¤ÿþ™q^4 à)|ºO£Bÿû<…]ô??B”`„Sü>ÿ #zež ‹Ôõ/ÿôzñ¿ÇñÛo·~ÿÛçû˜}oJî/HÀí;wz‚D?€¼ßñÿ?þ±›!€ôÿ¥9×`ÞÕœ*ùÿÝ»t‰·/_¾}ùÂåÛ·C†í7x•*„Û0 à]éž{îcWÀî¿þݺ(qrt1Œ:lj"tõ£ö]úWBú/'b†G6ñ¨ µi­‘L€P°{x¥ÿC¯Žˆ¿NŠøÁ>~}Dÿ úBDÿ‹ö€þõ !§à¶Eþ•ÿ²ú_²a}ˆ“² °Ëèøñ?…ÝËùÝØ”“‚;àJ0ò~üƒïø›)Crÿeàûiþü3÷Î`¡ó`@áýBò/Þ/ñèï|=r?vh4]èŒÿyLàÉ­A²Ÿ¢%ó¯»IæÜ,æUŒ,€ÉõŒÀõ´¨=Ý)€¹ïè˜Å'¹L%:@ Œ@6g% ÓMê‰B¶) PáJÑçÿ#ÀÚ'r Ä;ŽD(¸ê“v½%HÈ€^óËßy§?ìcdv±¹ UC\D·ÿzûŠVF"zÀûü»Êþñ¯A„Àk¯ƒS/Dø£ïÉAÄ¿3^¸€Q2À`žsîܹ[Ñ Ä§ýïv(<†™d™c ÈKËç@B¸Ù‘Ì®’–±sŸ;,É€#+,µ²½0³ßi¯ÁUX`Žó7Å8ýO /šý d ýî®vüŸ?Xíýx j£ƒÜÌéÿ¸@.xâïE€ÔÇî´'ð)ñÑPÀ— Yð‡‹÷Œ¯—­ßÿïÄ⥬ŠíÊ/äw¿È0îñ·¿ ÞéPøÁUàZQB ,sþ÷æòzP‚í < ºÞ) ø»£wÑûîjüDC'xŠ/^}aþTÚV†°jLS y üÿÝ-y]Ô€Âÿ!|¡”fè—ìÈŽXÀà,hèÿï’îìp À‹KM¿ `ÃmÂ}¡Ì1À'h©4ã°ïRcjt¤ ôo=M/,:—ÛÞôe€|üPÀþRÈíßÀo¥¿ŸÏÆ|á/e€üúW@úÁÿñ‡sû[ ýàÿøÃ¿¹ýH?ø?þðon_ºx¼ (GÐàºm»€þ§'Cð;lS¼$Á.®åÓ,5Ü¥Š{ÕvýGÂ’,5bæ¹`@ž Gì2/ ?cúï¶ÔÛX㕹ðœ‹_Õžºè:ë+\ ÷¹ËUÜžÀvv/¸„vî_ÞGÄ‹˜y=ýÓ}—¨g÷_¸ÊgÓý/?åÏ¿ç¶ùt@R¾` B²AËOò Yýºðv· 8­? †¦ê’ÔîÜÿ úo¡ü1ÁÈž/rü±ðâÂ…‡  7JŸêì•»_~ùå]ÈÈPz~—A®x½w­úeÐYû{"}~Ìï¹EßûÝÎÿ:·'üZþz@Ú)Ü‹ÓþDÄ‹ì]ÿŲÿ{÷üOú÷†ÏÝ9öy÷ä§Äî°ÿèî4‚=°»òkêWø´ü,"Æ—:ÿ‹íwìmØÕù_n_¢à?àÃ5]„_KK¸ü °MûG—ëŸMS_²Ê!‹ñï#tÀï äÿÐÙÑ?.þtýCy*$å_µÇöT«ÈÊEÜ(ÄONúe>ü¿ðþŠ€|ü¿è”7÷o'à Lw‰_{@ÆžøÐÿãìÉ>€òüuáù"$;0:€yÓD÷g"3%à§sˆPàüT% ¡ÿý^aþ¿n9@?Eì#Xï…ìÚ?eü­®„.@/Ž’ª¿ß¯ÿŒà\à¯Û¥[¾Ÿ¡ú2¤óVÉ Ð ¨Ø'¨îŽ„ è.#þåNHoìHû«·n=ô€Fóþcýÿs§eG@Äóg„ÜtËü% `¸ŒQÔ0Ñ1cî© +(}ŽedˆÓ'Éj—b©Û Ûf7êD‘”o»*/?Û¸‹ ÇþÅÄ‹…j¤»œ8±|qØûÏj† ÷ß7ÿÇ”¯[û_¸oƒ­Gè¿–k7ôßl°.ÙsÄÆœœs@t†Ž í4ÇïáÍ’& »·/ØÓñÁÿG7y»ÿ‘ß¶— »8â?´Å˜àåÅ.àD¡A)G?\ð&Ì* op~.p\»sÐ_0ãŸßªRžÙóý5òw]À/-G_°àö)„šÀ*Ñ:U¢«!ùÿK/Ñíï#¾øB4pD€û/7ú(º. `Ó< `aáÉ'›†üI»A˜ íñãýÛ™;Âg°6Ç{ž'&H½ÿa·.uÀ#nïÇÏ[hà¼{õöË;ØÿèõHQ²{íùeˆ%»_Bö,D€’¤_ŽóJö‹Î~‘ü¿ôžâÿì´ ýO/gRR4HR>Ï~€> ;Ué}¸OÄý‡aššå`Ÿ—ĆÉþu“Üp€ ÁŸf¿ôŽÈÐÛÜèì'Àž; žO¡8@0^yåe,p"—?9uãÿ“ 6hK¸@9L0AÇÎôááÿéý%0W½ÿqŒnOpðQæ6ȯ§ÑR€˜ 8K\@N$ý?Žaàs—ƒ¾ˆo~€TíOÈ^Ì—eGŽÏâ…Ef©½pá¼2ð\ýÿòË+¢5!A Ë^¿|y´þˆ=pDúüX˜®¹=¶};Ø+â%aýA«Ã%ʱãúñ?Jÿ£,€Mì Þ·SaH0uIl1 ÀÅt÷÷åwü_#’ò£|:¾\†‚´|?ÎÞ)‚»üDq_LóY°‹†ˆ?ÜI« øÅ ~@v¿@Æu¢\po˜Ô.€῱p÷äíÛà– ¾‡ÏGPsœq*AYx x”Ç×½W_”[ûMÀç‹ü ýçqŽrZUèýë/A½fù/]Oq@–À.?®ßÓç€ ƒµL/WWIýUAØ@*çÙµÕ¦§s tþóÖ" (À@·¢]g/mà9øo0IH¿žž§ÿ#°€n·ZMð¼»…Õt7¿»yM’ 1΋øÿÿ»Ôþ.3ú©KñŸÜ[~õU,ÿg²üçì­`3Áæm €äÿô”>ØÍX–9ö`¦#ÙÿH¾ ý×t…%æW’üù¼cþ/9–UèÏ(ñø¦¤°‹ ˆD˜çÿ…=àäv/î´Ç5x$`îAUú°€KýW¬5—ú¯l‡E‹©ÿšÕÿzÔŽ^#Ÿ¾—†wò¯_ø&@ª!Ìv¬žæ|¯ÀŽ €ÌÞ?µô|V`ñDPÌ8€nÁ·wüÝoÇ‘B°)@‰¤tC½rƒµpìwø»èþÀ×.¦àã:‰ïßOüM×î¤÷s£‡Í]½}ô)ý¯ð‚Jx[vÎQ¶õ 8B‘°Á"€«_p€@` @Cþ/:€¦ô{Pà*ÜúIø‡›†›@˜‹#¢]¹àšãÿsÍWþ#@´þß0Iÿ'B‡x}0>0:~ ƒÚ‘`ÔŽ €QûË/¿Õ¼øE Ÿ¿–`b'ÿ_`˜?F¤×÷AÌÿQ‡»ŒYKœÿ=¾”_Ú5`vù¥sþÙ±ÀÀûÿÓë¹tº?òûwiþ½á£ûÿ‘ÿ‹PÀ¯œ  ÁðÌDÿMñ¿eç¾,Üÿ‰(úUºýžï·'ŸÄT²ò:û%ºrÄü_Ú§p¤×/ƒA åú/œ?ß éó½ Oñ?Ú¨]éß=TÈ¢å«W`û$xÍ“2¦^ö/çcOê'ú3Ìâãœÿ9þ€-&!h @p)?I¿†.ÊŒ/æ@ÀXŸÐñó6ù?ó¸ åñkÈãÀŠã‡klQ4|]ÌìL åNúþÁÑ5=í×ìñý‘õ°àú®h‚8@DŸ÷äåËÛ—©,ÜDn,4ˆŸ¿¼ê¸ýC$J©{÷ý;2ûÂÊ70ÆðuõOãÿü|IÙ ]VÔ÷Ÿ’~nH Àû×Ù‘B’ßÏÇ®§ÿŸK„þG"AýúÒûcµiø)M«FH„ÀÜlƒ}±‚(ÎE™ûEÂÒ¢Y]ÀöqgÄ€î!Žù¯"ðuK“ÆGwuFýõ¼„ñ+åï¾Äd;„‚Ÿ[;¾»÷]êàäD7Dn@dŒöÀMщyêCº ýñï]~á >Ø€9Îý%4ë¿D óÎvà³”â |ƒ8££ÿ÷dä>‚ŒÖ(w+µ o—NÐIXY@20éÏl ñ¬_E&’ÕÿšÇƒÿ_\bÉTØý?°A(÷¹‡-;Fÿ‰°Ëü_¡/cæÿb(´NˆoþÒ¿îã=åÄš½T€ø '$ñŸË°ø‡Bm|€.;}áÔä³ß~öÛü Ÿ[¢Á{·Dÿy½¯¦Þ«#ÝBð;ç¼;©^v7,ö“¬êÍ‚ä\6äÿ8¹” ,SXÛ—º]¾â.€Ü@‚v€çÁ¨èù§Àú5L÷Æÿå—¾öÜ @ÿÉÎé×Hôøžnèÿ—?ÈÈ„ø'%@?ÿÜKËÑskã㵟z9ÜC0¿Ï=;n?Úƒ0¿þƒ‹Ùõ迃0ÀçåÖþµ_ƒ¾úså¤whVÙÐO)ù„êè?×:…7”L5z†"\—ÿNPžŸ}0vŽþ¯Fc=Á øn‚+Ù¹ÅO¦Î²d‚-ü?H1—Ø^ й~:ÁV@RDx?ÁVvÍXyàŽûH@\$øpÞ–Ed7ðÁXès”¿çA{/?ØÉyù[ÀüûüqŽ#GÞ¾TX p@²Íb¡äø/#ñó"€rýGŸ¯Ï/Bq@& Û@bé À½$÷è:HН è_Ža§v  ý—Eñ.A« ô?Í€-&E"Û÷–_¹?=ÿºaT~”ü_·t«ÂòaìÿëV€n@©ÿÀÑÅ<=kÜÉ¡d\`C¶Í¥h¼?„ûë:€ìýàâîÅ‹#!:ñóÝ{EÞ/|ÁDö® 3/(èx>ø¿(RíüþËPé××7ÖV×K»è‹íÞ& ä:Õ0 `¿Fjå 1ÇÿSü–_„€àÿo`?¢ê?H±2T;I ’{†H’@Òÿ‚H T}ìzYàèÿÐõÉSÿüMÙ `ff ô{Fúø©+i?üþ"aàÀ*€¢Sf€Åït› Îï[®þÿâzA!ˆ4•v ¶ø=Þßþ~€DHe5 mÿÆmÈ3twÊýêÝ~YÄ?Õh‚l Ì‚áa@# `„Ý0Wÿ®Å–‰aw–Žþë $°~ÊÄX€˜ÜÓJÝÌ*}øFyätöý¬!àÄÂxð¿bz@+¿RÒ½®–² 8\k³d#ö]ÀõÀ„¦*-d\¿dc¯Í£ü£°ÿ)Ƨâ§VìÅŒRìÿ‡ßÈ.‹‹¥ŽB² À»—€¿Øä!¢C~`êà<1~Á ÇÙµ¹À €ì®à#ï€ü¾¤ú ü}#¹€Á™Ø ÛN€ý?ÿíóØ:ÀŽ ÀIˆõ—_ €[2 ËHÿ?§0ú¿]ßÜÞÞ\×–D憌ý¯õqð®0»kŽ£Ö„ã‡C3èA{ÉõFÇ/€Q;€Q;€Ä>"P¨Ñ÷"¼&€‹H½×©÷_ö¬K eóô_¬$Ö­[ð9!øḬ̀=¼ñ;sÐa=±¯®G@òÿðˆí¹@Ýß­Â÷Û˜ev· nRÇõÌÁóóâ¥öLàH®íÙý•¸pl AþÉõËoŸÆŸ€Ë`”Ù©¿0tÎIV'+Ÿó\ŠHS¬ÿ×VпV®©_¿püÂq/@à:ø ?„`€ãÿ{Žõr$€ìáùìÕJ?ÿ”Ð÷}cö, it¿K°¤ËA_¨¿ÛÐo³—àÓEýÇÿöÖÿÂ\¯€þw1aùÏ_Æø‚0@Æ*dí{ìmØ!œ!€±4…öׂÉïÚÚîËÏL!K² àbnï“–îÏÈYÄí#ö†Ïèû¥kv‹Bÿ À¬cÛd¬´ÈúÿòÜú¸ýƺDp Êwf}u gA+`Àl|à%'ãKqbqu^Äý7°ýÏ÷ƒ+a” ›¢EÏ‹f×οÓ²ÇØõ~‰@<ÝÕõ›š#@r`‘@x‡èzMÈí÷ÄkâTÌÛ?ë>T%À¯ Œ`"€l€rÖg§.ÿ¿Rÿø”è¿ælB“…¤nÄ¿”c ”¼ŸË¦h+f/„ô_Oìý¼)i3±F@ªhQvËÿ÷?–F"ª7=8þˆ0f¯hÕʹùó©ÒL–!=,]æ?“nºi£4 5{Ú9åÿ)‘?qä¿…pùeŽß^ÅNÅWGù¿t²ñ »„­xÚžÞ[{bã2TŠ;îE±ÛKt "ÿe@dMüÕÈö/›§b€~㶀ѭ¹@$ù.ÿ[œ”¥µ‹‹NÿßÜd;á{÷fàî-#f©@AžÁá.€»­Ê‘<¯6>~h{>? Híi@jÏCF¶ÓnTSäS(¤ÿévŸA:4‰Ê’O·ë©À.‚n$'tóë<ôÏ ê—sþ¹ EABª~9p9tp‰à¦Ån/÷0–×çA!ëš[…ï¶1ËíLHò#Ú¦>Œ`Ðð{~}Ì1öhG4Z–ø‡»zeʽ‹Î¾Çû“·h†&PHðÍùQéþOœ:þŸÚŽ/þ;r@# Àâ…8À @Ü€ÀBàñˆüù.À@ýÇžïggÓ ——@!S'L×í‡ìÉ>zâA"°ŠW^~&äºÍ^joáÿÇáéf÷žíþ§9¸ €ngÞQl$«éÿõˆÊ@cÿ5=¡pùàú»4ö_Ógfö®ûè>q@(b/Ñ¥ËKÜH»Ð¾ÏG³›'võþ³ò. µûø"e”Ø»ø"eÚûþ!:PÖ?¼pÁ ›Q€ÔoÎýU$\…PÀGßng:•àLqüá-‡#Πáß`þ«’Àý”ÿH~¦ÿ@… ¶LY¥/A2»Î–¸ó2Vzׯc§ä˜Å.Ycm"ìæs¿GÚsÈ!ì ùÿÓS± ŽwsÑ­ H–”Ÿ%`¦¦¸!öÒAƨYÿš d„D`èŸ5ÔIä ýLFèÒDœæÄôß 9컸ɬi  °àAÿ[ zäIj­ñ5|‘Žž :†ˆžð7±P³ËÞ…#)2ÿa‹ql56LñÃe9…ê8ê¿+`WhÖIL&ðƒ>[Bþ)èŒÿ籠쨡T>€ž„5¢¨ ô)H#ùÿ‹ÛªÐÿ¯or@æ¯ €lÈ òo0‡ûAѸÏ«C°G @áù‘P°G @Áž)c{ÖötÍ7ˆ¹T <6dÕLÿ³9H÷!,ÊBê‹XH£üõǸg@öÁ_Œ ºúRÝ…Ý»V•Å … ¯w·É:»?S*ƒ‘o™©uù¶§ò){ ŽôúØ^¸ç¼ç~¥ÏOr$ö, »{'8ç¤âß? ˜.ÉaVÿ'ü¡mØ.¨ŽÙ%LìÔWð÷\„ÅñÇrI]€=<ßuk¡ŽÓàx:UëËW³#úÉyy C^?¦T†-ßb| @½ÿ%|Ýoû¢ëÓÄôv-¿Û ‹¯§8l=ŸâY°À`ù°õuâÌ/. Z—äÑJÆ?“àå€Äîy¿ÛKdïã3ƒ/x~ßþìyÿ`™V°ª‹6 ïÄçs÷(ÔŸKV‘`uŽY3|DÛÑH RýÒ$€?ìè>è߯Ûõ€÷âçwNæÖ™÷¿ë‡EÚšFÈv}Åâës2Süøµµõ¹”þ+¥ˆ$ˆ›ã6´8À_•çÿOIÆ»çðš¸UT*1»jÑAb^¹z—h„ø̓ŸÄyŒsóè?šIÿ5õ÷ˆõN w?K"¯Ö>  €àŽaP³×Ðï²×ÕºHùFÉÿÇ#Æe‚X¡{5{ œÝÛ‡8Š+²oû‹7f—µu€9*½¤V×Åx@­ª÷ÝδdþúSÊO€Îÿ²°£;ÿ ý‡&ÐíÂÑž” q8»Ômo®..®nn»Ea|ØÿŒô‘î{-ㆵññ°Ûù†Ûp·À¼‹^0Nÿñ¹%ÛÕb„¥@æåï$dʹdÉé²Ë9O>E;&ö~‘®øè2»›À;väÃæõ2mî½€™—' &~>ìtüGlwþó>‘ARþœ`d÷ONIì:íçüïìzŸ_Í{~~èÿßÏõ÷°@Ö˜$Yʵ}‰þyp$dt&.¿¨+.ÄB×Xdøz %ÙeÁßßoƒˆÊë?ü|çžéòû'>^¿ˆsÐ>{²”°{ýºú§= k¿„aÇvGû;ú_ÀGÛÞÅã§~ºþý]Êï£ÿ»¢òS™+•³Úø!mãçÛOðAl ‰D|؉àû@NÍûG¼(²ûÀ'qeã¿[ûßå î_ëR4$èRþoa] ’–Ÿ¥vù å—_üŸ¹w"@qü!ŒIÆWqüà úÿy¸-Ÿœ¡0ÿ ÝÎKäÿH?þı7H¸“îbLèÖçÇ @nkÛ{º0´ Hýr{|=WçëÁüx¾7'ö<Â`oåßEû$ùýCÿeV~r~Iñ̨ì³|õføO£ûcJÏnŸß" òæÜmÔŽ½W]ø|¿†>¢×öMr(ê3ì¸þnn4Ã>ñéî\Ïò ÝøëâÿcÛÙ»øÿ;;½ì¦,]y ü]’íÄî|ÿ}À}¬íýRkÿäú4H÷ï¯3¤þò­€O°ûú?ð“«ýW`wÀ.>+E¨~ºŽ^¿A>;mn·«ÿý7ב½’ü_€!ú¯Òþ êêçW Uœ@ {€ƒEF¥“öñ$ãÿ´aÎU#c#ö4 ,È6~v’÷_÷ÄúÿLú €@|þ’ ÿvîܰ]=î€NhW‘éaqÕë4ssÜ·`Ãõ f1„³Øà°8˜çN0~”ÿÖ>Á°}—>þð•Iа{pü"ÁU€ÆY”áËž%€SY) @¢hH°_ã.4!™ÿ@vÏ`†žï#«|ž¼Ùóïoÿp[1õ‰šâ4ï5»òIŸâUô»îßžaÿÐíKþ¿òKú&Øgù²Jì|è*ÎÜßö¯½jí_»þíµ†‡Ø¾[`xÀnÁÑO×Ýžž7™€°ß§îãºZŒÀ>nù@\¢ ÷ycW~¯B{vÈÜŸÔñJËü# êÀ¾;Ñþì€}ÝÀ}Áf=<0èŸì_¾†ïýïwðg2ê_âb÷?ÍPT8îRÈ+;=8þ?·37³Ól ^üq Y„çð_üïáÁ÷‘®É}j~ŽF8~¶BMäáÿŠVUXøÉGz?ôù%Ï Rµ§,’æ9È .?é/âE°f7|ª¸…-tÔËIû—ìˆ0h'õ?y’‘ô³ò“¤ÕëBè5‰ÅQî¿@ù©NÊûAR•üÀï‡Zÿ8âíûxî^8l&»ôÿó9}c÷2â)c*'ùåsp)'Y‡e-?d¥L5é«¶6½výa@bÏ4~Hèög@äÿ€« 7V7”ÿû¥k¸ Þ33ÞŽülÇCÀý{?öž†0òñ3ôÙ4(t7Â¥üFÜké ͹†ew…yá§( ›ûŸÙ Ÿƒé–ÎÙÜ3ú“þÆõd÷¿a;ÓžÄU³'ñW~Òßøëzÿ~ÐËÐøÖúÇA?Âû?û¬Äƒ#쳂vÙ†À.$šzÈøMê×Xm'M#x`³ *¤GªÎå©:à÷—­'ÕåÏ%"`!JÏÙ}=½Pºbìóg’g`´$Å›t¿”l¨~c+³w¨>Ö?Ü`À"/¼wìýQ|?ìþ³áá;Ó€‡¯M­F†€!`†€!`†€!`†@†€ Ö) CÀ0 CÀ0 CÀ0 GD¨­E®!2éõ“Þ¿öüšý ŸØ÷¯=ÿ í‡ÿ¤Ï¯áS»ÿ¤öƒ~~íþ“Úkõ¯Ý¿v}Í>éý'½¾V¾š½öüš½vÿ£nŸ´~GýúZùÌn†€!`†ÀäÄ@‹l “ìŽ4éõµúÔî?©ý ŸØ÷¯=ÿ íµö©=¿vý¤öÚóköIŸ_»þ Ÿ_»ÿ¤ö£^¿Ã.ߤϯµOíþGÝ>iýŽúõµò™Ý0 CÀ0 û€@(´íÚòÂôšß=¹t÷QѤ×תS»ÿ¤öƒ~>î?~µúÕÊÿØ'ªßAãsÐøÕî?©½Ö~}ÿZûLZ¾I¯¯ÕÒûOz}­|5{íùµö©Ýÿ¨Ûkõ¯•R|îÃók·0»!`†€!`@$lo.LO¯¯ ÇŒ{ˆÚ ¯¯Õ¶vÿIíý|ðÿÑ‹ƒ.­~“Û'«ßAãSÃwÒú×î?©½V¾ƒ¾­}&-ߤ××ê?éý'½¾V¾š½öüZûÔîÔíµú×Ê?)>“?¿v³†€!`†€!ð Glonm GÔ<,-f`ã×/ Â`a,Â`´Æõûמ?nÇÃ+ìÉî?9~“•Ý©¶¸Ò>ã$õö›ôúÉÚ§Öþ5{½~—ï@ÇG½~“FMÖ'Å·Öÿk÷ŸôúÚýköIÛ§vÿ£nŸÿÉÞ/uü«ý»V³†€!`†€!pðD9ÚÕÕ“3«ƒUKíú»àÿÓøÚ¯P¹ÿΤöЇ~ÒûOŠ_õùµòW»Sm ðø &­ß¤×Wñ©õ*~|j÷ŸÔ^k¿‰ï°Õö©á?qý*ÖîÐøWŸ?aûÔîÔíâ?ñûeÒþY+¿Ù CÀ0 CÀø!ˆ€õq âá¯MðÛöîòòòB» `_u;à jÍC_«_Í^ó°Õ®¯Ù«å¯F8°‡·&MØ¿jøÔì5üjöÚý'¶×Í„ã£V¿Zÿ­]_«ÿ¤××î_ƒo×GÈ´ãïÏêý«ãcBö„ýcÒòO|}­+ø×úo­|÷ÏÊû·V=³†€!`†€!p_H€µ“3#îùÚuss 7˜!XÀÿ»O :Á®MÀ+G-‡A+õI‘P{~%¢Šß„åŸ0Am mm½Sm¿IñoŸ¶‚oÍCXµOØ~U|j#¾Šï„ý§6þ+ãgbü'Å·Š_e|W=Àë•÷gíýp°íSí_Õþ3áø:ðö«á?þ~©áSÿµë«ïÏZÿ4»!`†€!`÷X˜ˆà¶ÞÞþóÚÉ“3ƒ¹]`gX˜ÐÃ6á»–Ã`{{“õ8jÏ€¶›ÛÛ[ãøM¡Qó`ÕñõÀèûv{ûÛßþô§?ùÉ 4µö«¼kÖf7 CÀ0 Cà~  ³$ÿsC!Ôí]÷Èà‹!Îí/ ü_ýŽ|ŠÕ.,ãzeÐÓå]j’š§f‡ ¨’ÄoÌÞ¾ ìyú… þü±ÑüuNl”am‰üÌÕo¿9 Ú÷Þ{íµS3§öw}‹m¸@¯œ???!>Ïý3°ÿcÇŽ pïBt᲋RÄÚ÷áRÁ·=àõ×Ïýã(`sóW¿:súW#øŽçЬå(¨z€'éÿ"T<´zÿþ%Îÿ¯¾ú ß`x|¶·¡È1¸ Ö¿Æß/pÀ‰ ö~"vÚK$ÿ—/FTËWKR9åBð?XþZû 8WI®¿ûî»{û‘’ÿ;å%í¿A`ÀÊ¿á£Idk9&X@è/½T¾ûoEøíO†€šQy¿ÖÚ·ºÄà~| Û= CÀ0 CÀ¨!Ð í ‚ÿ±>ÇÉ"ÁZ¾{üŸ~¹äá!ïwÇÕ¿-Ø›ª0ÀÆ=lç¶·Ï$komoßš(Iܽí»ÃI®Úºc@¿@¿¿^^\œy_&,0ÿ5ŽÁ%›k#ävIÒÆ²”·ïmo¿÷ÞË/å8¹Þ‡h#úRyŽ$`ßU’¸y Ï<÷Üs ÿ8Êsª_á(F‘·sÀwn9æÊ “0ŽyPÛï··¿ÿæÍ7ÿî™âðxí’ÿ×^;÷^ñŒ3ÛÛg œ.¯` Ám_ØëWοøâñ!þº½ Çžìžw¶ïT’\ކˆ3Âg¸}°ô¹ˆCKÐ%É_¹÷ü;ˆÿm’(ÿ^Ä—ÏGŒÀ‡Vp4Lj?É?ŽÁ5cYæÛ —.3þÇâ¿­ô¯Šõû’ø•o_ ÁG÷ÙÞ¾}eq±<:ùA1ÚÿZw×´?'t`ÿ?ÿy9€Ä_Ï‹k88þ*IGÛï%”î%9Êåûéo¿ÿGÀO:,@½_Çû÷NûÞoB\‚ ÚÈ.;µk³†€!`†€!p?eÿ3J¾o®áW_ ø$ÿÈø‹_p@fG@Gÿ‡CF×XŸ;·ý—sçÞA-R„ö²°«Iâf§Ô'·QÁ…†.ÿ_¦0½\èÇ"åÅ÷ßTF=LŒP_ú¿>£>ÁÐÞáóï|ø³Ÿ '¡pxí½í[ï½öòÓ?þñ÷㡽¤!Ú—.Áz¾ÔV$ ÜÊüüH’¼±%pýÓûìL9@Kæ/ô¿œ€v9 È×)¬Ÿ¤V´óýö÷ßÿÍ3ÏüÝß•ªGæ Òÿ÷J@û«3ÛoŸùŽò%`ûßfÒE`\:Ž£Ì?ÛF…ç~òì€Ð~Ä$xÿ7*` ÆOܼ‹ñsóÆÅ‹ø)ù \¾“šäoàrrˆ¤ÿÿ^ÚÛw tûʇÿú¯ÿº~Kæ/ô8 ÀèøñúùR‘b·›Û[›ë|Ãû×€ ¾ì_²~>øàƒRÿƒ¾ Á/gácŽ‚+‹ ƒí;Z?ðk.°§Ÿ½X~2¡ÿň@ €Òÿ+%À½?¡P,n1úù äô¿ÈÀÛŸüô§ ÿ<¾ýv`Àøûøß½ûå•Áþý5ÄH +µñ}?>Ð톀!`†€!`Ôˆ"<ÿ/ Bá‹$€+ À‚óþ­ AÅÚjðÿ÷Àð_)N@OºEþÿÊ+¯ D`3Iœ9 ÄPà 81ààû_` …á"“”.÷°uKÔ‡b:Tüïÿ“ÿ ¸@+׿Œôu¯½Ìc`Àèõí%(W8}?£(0 B€WV®ïÇ×’ûóï™ú§bûW >Nàú€!à$ûÇpŒöM°oâÄÿþ_Àü…þ ãíC`t|h’¼K/¾øb ~\Í Ï=÷ì  Ið†#à+â7Éÿo€Ÿ ~ëýÿƒ.lMòW¦÷;X Ç¿# `Y¸rû.p …Œã§îÿ;Ý*ã‡äŸ! Øe É= •(HäÿCI@Û¥/Á?UC) A~Y @‡€A R?ïÿÇBû!àÊûŠ [¨Tí¿‹‹Ë‹åŠZÿ'ùg@y‰Bû(?ýé·ß~‹%e Rÿ+ÄÿÊ,ò(ö/¤ `Ž„á,‰> áHÚ§µÙ CÀ0 CÀ¸t@+áÿü†• Õà}]_ŠïÿHÀB‹?’C¡âØçF< X¡NþO~_"øí©³`ÿg5»Ä`±ÄaüÇÉ©âö߯“üµÂþ0=]Ú }ÿ²$Ãüpqq`À¸‡IÔ (–!¦_iˆuiþü³?¼þã“O~V:À~ Eñþ/¿üø¿H(åçãúφŸÌâÉÿùó— yÐÛù••›Âÿ¯_¿>? Á|{æÌ?ø“ý:ÿÿ1lP,Ÿ¸ÿP&ø­ÿCàN%|NJLQJægÞ|SÙ?þ),hÅû?ÐÒ÷¯üÿ?ÿ³”+œ±ô›Ÿýl(J¸ý~l|hà//BoŸE¬¢À:Š"ÿA÷§Ÿjü`üˆ‡¸½¸tãæÍ¤§7n\,èÝÿ²ü±ü8n—rüµý€!@®Gÿ¿}{X`ްhÅý ˆ ƒý¿8þ.añ?Üÿ.€vF“|JžŠlýò&-­QÁŠ/•ÿùe Þ>?•N¸´(ú^Qe‚ýo›"Øz±ÿµâþGÀP€ºÿ‘ üxñþG´ïKÿ•ò]zþu$G„ ÿ—€B–BÝQ\ ãïëD(MÛwñÃ+_~Éîõá•â矤HÐ$‰Å,‰m{s{û&Þ~óó¶ à>Ì\솀!`†€!°ozÀ/îzú_Êâ$€n ÀP÷§,´ù‹¬ñ`‡âZ‹º4¿=ÅEØÂþ¡”NŠÁÿ655$HŽ?†ù €¦X€P hßñ2þ€ý¿?0Å SÖ˜ÔÏG—´íôWˆ ÿêúÒE‰AÍC,~@Ø?d.´-WPÈ Y埗¡}šÎè+O?ýtÁÚþäß~öû†¹øü ¤žJÿK ´‡@ò 0¦À¥ |ÀÿË)þ:€KÆ#†õÿs@™áÏÐû[yÌö($ÿXðLIè–”#œðöÛoSÈ›¯ýÛлŽ ø Aq’ T`€ýÀšDaÀêÖp#`h €ô_PØrã]„p±àâ°0¼ ý³üݾMOiøvK†"þUă۷— üâ00þ| €ÿ¸SÚvôn›¿’ÐbÐÇ*¬) Pä(¯@~¾4 hQø@Éÿ—Kdõ=è·e@“CÚv‹ü‹¤Œ¥÷C—` @Ýÿ\P||· Ð./ l8–Þ¿, ýÐÿó–ûŸóÿKÀ¨PLж+_oßûzA^OxÁçtyáCÈKäT k¿¾z™$ÿÆ÷õ•›àÿ+òú3 `ß»Ð0 CÀ0&G 4`9`«ø)Üå?¥ù¥óÿÿíàHŠúÖ¹s·ÈžÊÛ¨·dX¡þrÉC,ì.J@ñ,þŸùÇQ^ƒû¦¨JòËkü] €–‡=.cXÛ?msŸª¡}ª»¥€ôÊeP ¸~=§X-h¿?>ÌA·¯¼Â ]AACiAüÝ‘Ã×¾õwáÃ6|\…ÿOÿT#o Ô?nÊÌWæ¿7‹kÚ3g¾¹RÜ€1@cÊkü[Ðúÿáà‡¶(¹¾?;[Ž ñ×£ÄÁ¥{J€@–ÿû(€ôùh=pè Žýä“ 1í7Xƒ !eD4?^\Ðbñÿ³ê-&hƒä?åèõ¡ò~w,©+÷ aßàâg¼=¸€ÈéQŽÀ6yÈqÀ ‡rõîÀûÏeÿñi.´àõðÑ>`ѹą3èþ‡0À°;uffµeµaÊ%-…µ þî(Eì@Àq@¹‚X£Ó9?åþ#àÿÐplm‚PcF–HÀø€+Kð¹ /Oþ[~r‰€E}Öe¸: ìt!¥$€-¶¦…> þcåë¯óW|»0½¸¼ ?,lôȉ?ûƒýB$ â¾*€ò‡ tòÏs»ƒ!`†€!`U¼ÐvE^°\†s(ù\€ÿ[äÿ\é_œáqqºÐÿ²ƒ~‰,E‚æOú™£xlðñÄ',ÃûÏð€²KHýåOq+öÑîŽâóÇr´W û¯ÉZÉ–·tüóëg¥,hí+ïAÀ!ì¿DAà€¢:ðˆ¿|öÙçrQ0逳àRûüÓ?aŽ5ò€3Šø‘þËW‰ß# —ðÛjy @Ëøv}ì&P*Þ›`þüý†r´²þß-È*@ùF8~†äq,Åpèà›oŠõóQèÿ‹/í`ÿ" @Ñþ(r רoàØ,áóº%¿.e©«ä`Œ?Ãü™ä¯ Y†s€ù_!ýØ ý”9x÷©ß‘%øB €¢ÀoóWØè‚üß%ä*û< ÅÒ~þ—:òôI@‡BË@€bûiÓ …àc—Bw”r´º)¹?È1 ,¯J€„JDPá÷?(v©üÏÿyîðÿ¿þ57·> FŒ…”( äþ+§§§³¥¡ Ðäoy €[ 1$@îÏ÷ ä€rJõóÚN0 CÀ0 C`bR@ÉŸHè矺€ñÿ[œõ P˜Á½Çìéïýå/J¢&ôŸìÁ$€pꕳÅ ýׇ¢]è¿ÌþJóOD@(ù°s+YBÁƒ…ª‹¡åTµ4Á•=†fßú¯Ü_8Öõ\Pú/Ð|#´² trÿWN½L 'ðBÿ’¶Ï> à­·„üƒþ?— ˆA—õçňP'ý_™¿~SfÁ…ög`°ÿÍÀSƖкZˆ ö{¨}­àão…þ&äÇþÿ®äƒG×§ˆÊRT°¸À 9øAü†6b#PY‚°Ó ýG À$€ˆ ó¿¬Þà=ÒyËûÈ÷!êå%ˆQ @)j©;ï?ŠãOè?ãûÿ½˜#N÷P{ñ¡ÿ¢¢Íÿñàþÿñw$×_©|}„è°œ˜·îïçœá‹÷?Öÿ_ºt¹° «HºÎ¤8þÇwi? ýŽ @*ûŠpèò×€à€È“C )d{Y€ ÿ_ÖQü±T=Ý@’<|^èx‚ý/,Pe).1ûŸrüõ¯å?yéDP÷? Y4€ñÿ…]Ûi8ýåKþ™ŸÏªØ’ûc™W*³À¶tþóÙȘº§9ø4`⹋ÝÀ0 CÀ0ö‰@/Hþ?*Má˜ýOVÉ'/L ì¿¼ “OXγÿ?™“|g@!:úO[œ€’ýÃÿÿÚÙ»£ÿ+vZGÿ%Oaͪ]ý/óÿÞGUÜ(J–Ð÷Vœ} íç×ÒÒ ×äH:‘•ý6Bo…Ø;ç?c(ò, Œ-ŠF²~Gýu%y¡”þeG@q‚­`!l‘ÿsqEŠO€ì(‹¾l袨 ÷gð¿äÀ·â"‰ÀÁsŠíïèÿP >׸Î[Ž`ÙàbØó&lÿ.\P Apô`á?¾Ë®‹ /ðcðÿþ(g©pô Ký’Øi@e@éÿ@’xY"0jw}`‰¹r{áÇå4² Ù?Ž¢Àü ’g]¦C¼•ø¦Ú€1V.ËÄÐ.£Û€r €×PÊ/`¥ÿüc‰Càñyá™_ß|û0 aä%Bÿ‘ån@ø£~±Ü@Ùÿ@û;ö ûÒûSù¿…UAÀðF€Bÿ±`áõ0MÇ?¾æ¿&UÇ[*ï ÿ Ó ÿXPì¿\àò– ~Ò0Ƙ°Ï‹]f†€!`#à€~€Ë”Wâ@Lâwˆÿï´âüÿùÿïŠ$·…},ùÉ“.àñ—üqþ¿Fþ?°ÍW¼rö•׊úÀŽVQ‚¼Ëâýѽ ‹å¯ÙÉþéÿÇ÷²ƒÊíQ%óè|­sðÍk®û_!÷ç ²0‡òø‰$,Ë'/ÃñOî_Ž¡P@ì Žºçéˆ/"¤Üg`›ñV .ûÜÌññÜŸQeŽßŠIlKÈPEQÈ¡¦+ÿÏ”Zò"¨sVv(ÖŽ¡ÿpþ3`Ñ.ÚÒ,–:/Ç©.(¾¤pðì¼;þïË¡翤a,l€Njóÿ˜ì0,(EÎÁl%ƒ½jT‚(ÎÝ xa¯_‘ÿ}U´‹s_÷¨ØË‹ÀÅù/×çv²{Æ÷;?–äUç¿.(ŒÏþ]€ä 0 ¾œ>PxHÿ"†«Å]>¸É£‹*ó{Ý@¾•Ù#+ ú_æÿNÐT¡~®]·\€ÂBn¿#ÿ/ Òsî°9¸ìþÒ²+lÿ"ûmY¸ÿKïÏ€ûK€d€ðÿñ÷+J0ÈÿaSÇÿüu]¦_¨a îÿÿ‡" Ü@~€<€b}ÿ•Þ€’Û CÀ0 CÀØ%¡à¸¿zA sœäyùîÝç]Ddÿ¿û][ÜG‰ÌZc,‹€[þ¯ôÿ/€Ô_6,nˆ9œ˜^{åìÙòó…ú«›wL  qèöA ðÂ.çÏW•¡¥-' ê|£÷­¸ÆúºdP÷Qy- kÈ?)Õ_ø=È=÷Q,çHPi@V ”ßå×Hýò رŸ¡þáæ¾7oðQYÁñû"IFŽÀî(¶ßhÝ"ÐgY+æY”S4Š \=!ÿÜ Ø¿v°Ï‚ï»å}Ô\ñß~»X|½¡-˜ ßVÔ/@HÒÎ$ŒÂþ‡Ö`õ ßÀðQï¸pä²@ö?ì!ö.~ìP¤~dÿ8ŠAÔDþeü{sñýÒ_> °fÂï‘  ¨©ltt—ðrFïÝ ‰ ÐL­!’c¿€‚‹µø#€ì0$|ÿ±œáp»\¸Ö¿{˜`«ôê/»Ü}W,¾<Ï(A«íÏ·W¹‚‹L±'ÅËNh½ç_³b!@|‹]¼_œÿ¿ýí·ß–ŸÎý¯…ü)~¸Lÿ?x ì“èñ)Âã<ÿÜ oÀ]~<Ûi†€!`†€!`Ü: €žC´â€ö.LÊS¨¶ùú_<…Éÿø?&gÞóîÏÝê ógd²w™Ö&`m{–Çàó[ñÁþ—kЪÀûµ·²Uéù­'ÿ:G,.RÅܻߊG\èB¢‡Êׂ: ý/ÐrŸ„S¯¼ †?t½5—ðwô¨Ô½8Ü?8÷%ýÏNi#òÏD…ôü¿<÷qÌ…ò·žük¤s9 €œDú?ˆ/ˆ·Ðÿ€°%¥«A;öä1t¹“o´ €“P„âFm«°M}±Z¦Qä1h8è~}ëÉ¿öPÐÔRiAþ…þ—ñQòOþ?Ð~Êînãß› û´ÁÅÜß …Ï“ÒSæ,îô§Æ;Cí㨽Žðø²cg‡›½´`«tŸ¶pË­«’òÿ¡pWüÒE«¯'÷‚ÊÎЧ“ýo õPCø(ùWËèÞ^å4Ö÷çNëšÔG&íæý ¿å1ˆ/Þ®Âþ‡ß¯²`¤ý:x ÕÇFƒtýû7àýÿ(·;†€!`†€!°;ºnZü“ß <§8ʼnnR˜bÎ09ËŽÌÅŸ1^¼Ò4yÂpù†L¥c÷Øë'`NÐ?Ÿ]Ü?íƒ?hÿHáKûïa—ÿ><¿6ü&Åôþ÷¡ü£å»÷¯ŒŸ*~“Œ¿ZÿÛ…½Z¾Ú “¼?wƒÿAã3éýw÷‰mg†€!`†€!0!^Hè›Ì§ö¬ÄSä½–¬ªTBõù{“jCÅ^0J>ÌûZ¾ªD3aýîwÿ¨¶zÂË_½¬`Ôú1ÎwOÈ!—¿Ò~yÂñ¯ ({}~úŠªÁ—Qì±ü{-ß^ûWe|V‡ï¤ão¯õË>"j/¸ZÝç÷çñ/}<íéý»÷öK>Àöúi熀!`†€!p_€\˜LØGùj>¢ê ªBÀöt}•î}^«_;§òO<Ã!Ôž¿†3)>“^_óñíɾþu_ËÐÏßGûtÿ>hüötÿ}ŒƒÆgO÷/.Š˜LØGÿ¹¯ø×ÆÇA´ß>>3íCÀ0 CÀ0öˆ@,$Àø§ü¤~¶Ç’¸Ó÷Bá'+ß`&ƒ®“Mñjø ,„8„çï‰ÂN†ÿaã3iû×Ê_³Oúü£~}±þ‚X]FôÏßZùköZûOz}íþúûkR|j××ìe|÷÷©iW†€!`†€!°{2 ×o¢“øágÔìµÒ9’°ïÔž_»ÿý±×Š? çHü‡àÁ¨ÿaãSïf¯•¿f¯ÝÿA·×ºï¤õy‹TÀýßWþÚøu"È„ïçIËÿ ¿¿&ŸµëkvÛ 60»!`†€!`%à€e·5 CÀ0 CÀ0 CÀ0 ÃBÀ€ÃBÞžk†€!`†€!`†€!`ü€˜ð‚m2 CÀ0 CÀ0 CÀ0  ù‡è¹ÓÓÓ£µ™ÔþÔSOèýkå{ˆšÊªb†€!`†€!`0&<Ÿª>½°°0¦Tí/¾øâØõO½ôÒKc ÀôüüüèóçææFí•çß'˜ì6†€!`†€!`†€!`.&ìÿÿçÿ»jaaüžÿãŒÛ_|qܾº:n¿tiÜ~üø¸ýþaÜ~þ|dŸ^X^ªö/\žzéêÕ1`zþÚµ1`zn}}L˜®<?Ä®1 CÀ0 CÀ0 Càè!`À~Úäÿù~LX¸;®üÿ=®¼xi\XÝW.ÝWŽÿÇ€8;®œÿ:R¦nŽ*Uû‹‹£ ÀS/}1ªLϯŒ*Ós[£ Àtåùûé v!`†€!`†€!`GöÑ&‡Ëÿ×6×FËüóÿDøW€ŠýÅq–à¿8¶à)J#‹¦‘`lÀ4%€‘EµçØ%†€!`†€!`†€!`=LØ{›.ÿ?jÄ< ÀôKÿcDÀõ£ À$€ùÑ4X0šyFÓTž¿÷>bW†€!`†€!`†€!pä耦iF wÐö™™™ÑçOjþùçGï¼–¯¿úp€#–ÀÁRQv¦_Uvj ¼¢ìLÏ/ï0®Pðù£;¹k2 CÀ0 CÀ0 C`¯ôÀÖê¨Ðܾ2nëÙqûÚÉQûÌG%€™ùkãöKïÚŸßzoT8þõÕ]J3ëcRŸug§jŸBN,œmãIíÏoŒ %¶/>¿ªŒ®@Áx ÀN]Ý ™ –Ç÷¬({Xv¾!`†€!`†€!`G ^X]]cèÍ•+£ Aóì³³£×Ÿ„0d0óñÇsc ~æÚµqûûïÚŸï½Õ1àøÕ«K»Sràý dØ£>ôÊ*€û Œ®ØÁ*€š0¶áQ¸VCÀ0 CÀ0 CÀ0öŠ@Ÿ Y__[Ь®®ŽÚgggGíàÿcö™¹¹Qç÷¤öçQþ1n{|iii|{<Åö!çÿû 0uàWÌMöü½-;ß0 CÀ0 CÀ0 £…@ @˜aè €1†ß4³³íèõã À þXx;íÓ#áï5ûóPž)ßq(ÇËáíQ“=äÀ~v£þ*€ñ…Ç‚£5r­4†€!`†€!`†€!`ì`€¦™ÛWfׯ€v®¢Œ.˜™Aù(ß^W¦ß³# àÆ¸püëî¨9ÿßÀn€ñ½~@=€­Øã ÄN7 CÀ0 CÀ0 hÀŠ°ÓŒ+;͸°ƒ ÑU'Æ€ã ì£ ÀN3®ìÌ_«+¹0AÀ®€É¢ðë™+{ÔòT2>8ãÚJj†€!`†€!`†@†@$ì˜PSrþ?QÀn€Ã^PÍ`«ì-i†€!`†€!`+±` @-à!& Øpø«Æó,,Û*€‡õegõ2 CÀ0 CÀ0uÀ€qà!çÿ“ìJ8äUµ<¶ àQ'Zý CÀ0 CÀ0 ‡T0`TxÈ€‰v£ú*€õ¹é‘ñ{]f†€!`†€!`†À!"`ÀîÁÈ€û°`âUW+ ÀµŠPS Æí»ï5v¦!`†€!`†€!`GvÝ9ÿ¿Ÿ»Q&^PSVÆ€Z€Š}×ÝÆN4 CÀ0 CÀ0 Càˆ `ÀîbffìÜqëÎΤö'ÆK:©ýù}&F*Õt%•ãôKã©§‘‹¬ÆO½tõ¥1;WŒÚk嫨wßoìLCÀ0 CÀ0 CÀ0Ž&‰fx 1]IåXµòÿ§FùÿÎÎô(ÿ‡}Âò=Œmfu2 CÀ0 CÀ0 ‡æÖµº†€!`†€!`†€!`¬+†€!`†€!`†€!`&<lU4 CÀ0 CÀ0 CÀ0L°>`†€!`…@3rã1ÛA•Çîk†€!`<Ò˜Phþ¦9s’Z1žxâ‰Á¾;fóíæžûóŸ?ÒCÄ* €>¹‡±±—s æÃGÀÚëðÛà¡,Aóôð[£¹ÑììáòPâc•2 CÀ0~XJØ-¹œ ¶#SŠÚD¶2ßh>ÿüÌHšvsn¬O´+׆€'6V7FäAý ÜXAØÙñ þÿÙ{Ÿ»Ž,]— FoÈþ¡k Q Ò¤œ£ürr4ÐC—Vã6­é‡ SׯM=§KFôàLr¦‰¸²š×ÙBªüìIQ¤IªhRÜÈÙ™¤Û“*a*³î-i–ïûÖŠˆ;"ö‘R²l+¶åÌ“gí;bEìØñ}ëGò}ùýôB]jVWGÛ+ºÈ« cÊF‡yý&c—穱ÅcöŠX¤ù£Š9¡Ò>ò%qNT9]*ñªbýžmíG¶H­ý³®ß«£5h'4 4 ]šî €ÙÞ£G³¼?<¶º´º_9ì)ýpÖ,uÊ,ÄüdãæÆÍJ·ûÉÆÇø rñr»nñs£3ÍêÚdu²VâtioÞ$vçúQÃχff3ü_ÕtK=öªüR®dƒÎf P,ÞÌç¹ú©êUSMUî‚Y+ÞÍØÛ›egcÖfÅ57ËfV©²Ù=R{žÖ3aVäYõÿ/­©!Gê·ïÕÅÕçë‰ç‡±'¾ÐOk|”n?®¬V_$£ý†™êÄÅš À&ñÿïaîÜ»wg#{Ò¨'×âR¯r¡Q^lä§ÉL=¿ÌN½ãvFûõ'œ;wñŽ#”pøLë÷öÛ_¼ãÉë÷LkøúÆißÛú½ú껯âxòúµ+›š¾ <  NŸN«ÌêÆÂÂÅœ9*pf‘5ô"çÛjæuó>D_nTxŒcÝt2]*®ÌŽMVVöj À±nu²Z¾÷ŸÌ ž5Ý €—!ÿ‚£H!gޤ9¯Òå@»FK²[[]Ëiý10}·ºúdK|ÜÜþË3æg‚úÍϰ ü~ŒÀØ<~Ö‹ º†ÿ—þöW˜ýÝT´“ï# Ž1Æ™Ýݽ€RÍ)üo&EnbQ(Í’¹Ñ¯Õ3Ë#|jð2™ääÒ½´õfù€²ºÍêQsù”ò³Bí=9°üoi¿ñÚLֲϙ¿pL>~‡g|ÆÆvåé©=_ÝÚÚ“Íc *ôŸ¹7>•ñQ¸ÿw OT¨»ûÁýÿÄ… 5€»ÿy㑵Øû÷I Ï!C=¦ZÊ·¦[[¢Hc–tÝÖVáa¶0›àÿÎ@CîÑÈÍ.dÁ{=³Óîîl>³ÂÏ¿xñâù‹G žmýÞ¾ýÅ_Üþ≠€g[;Àÿ_߸qã×7ž˜xÖõ{õä»ï¾{òÝWŸÝj%7 4 < <.°Ð+lœÊ+xìm?†VWJ€ÙØ8Sõ0+“ÝJñæêÕEsùHos3ÝÏH]ŸÂþÿóŠ’H±,}ZÉQÅBûÿRͲcNmLÔD `u‰ À©~ró'¼@þÎfi¶¶6J,´¼^ÞØîoBØ ØÏ˜(€Y Á;Áô€wãúÝêliå1ø‚¾¥‚ý…(´°ß˜3BŒ ±,~ö¥ þ_>ê×ó <ØÍYÀ­ÙÜgVÚ†è*S{€d‘½·7xÈÌdbNMO™ÉîÞAþzÒ“÷Ád]ÈPW0Uì#ü?-ÁÃL Ï·ØÑÿ8Ìê„<ôjfR *dû<ÛSv6ïlÖ=þéŸNV«ðÏÿüF‘$;wñ<ðs€¿D¥üg[¿·¿¸úÕ ¼ÄŠõ“ÚÕéÑÃþä°æ?úƯO¯­Õ €ò¬ë÷ê»'_ÝÝ­“êÛãÙŽîVzÓ@Ó€j G”Íó¦«{Û-N¹Ø¼ÜÕ €ŸoÔ<‚ÿ³ÖC€º™lÍL Áõâ¼€Y]>ÊËœ@v š¯aÉ6bÿÏÊm-ÁãrÄþÈ€<=pìk^¿€ý¿G`V `”²°?ë`–€0”(I@ê 'FÐÿ¯`á…B;v₹û»Õ=*Â_Ï<'Àw”ï‚I tC7³\ÉÑ`¾oÁL}zæSøpFòG?÷g¼/ø¿¯]¿žöù‚ý6‡íÊÌpƒLÅ๿·»;›žBÿÕ–ë¨zy°¢3ÀK§`ÿáš?‘Þ·øˆ:Ð9ÂÀE¡4˜Ùœ®-y¼!.ô XŸOóÄÄ2ò”zK‚±(€"ÂAeà0ÎplŸB´@¡êF³éìU‡_×Áÿ`®VWr¨>³±[}DWVëò1ÿ€1ùQßß5ü ü|ÁÿnLcóÓHý2.@ù8fSaj¢‘†ñ€Úø€ ô™!©…0úì6 xk5>†¡â ÈÀà"\ö@€¸p"— À,oþ'z¹fÀßÜp?Ûa¨‹L»é€O¿CX0–é‹?xývÈùH€³³€ "˜•yàõÓ7èÏ$Ž)˜€±Éí¨Cûi\gs§ pq‡zÿŸþ©v£þ¸Nà€0€r ÀÖ½*ðlëõC@9 ÊoJíêÀk#üÉÿüFY½§}z²  âPåOžuý^%þPqØ­ÓÇOc ·2ššÆ4!ÌRé]'Ñà•§‚ÿ/WD5üoWàÿ,@ 6‚ÿá^" Òÿo.è03G!Šø¦Ù¯&_´ÿÛÙ‚¼fÿ Cü_"¤ü¢ýßùÀþßw4 ^ÍPLȸÿõg]ÄËX)€"Ì@n‚ƒùà³Æ~Añ:ª„X33ߔ٭²P „(eêþ‡@ÓŽðRHô”CL>Àý V‡Ÿ¢ ü  Œÿ·'CüœM„RË_ûúõyüJa2:žlðBÌF ò ˆƒ´¼€95)ÀÿÿG±Ì1tå±c³Ý €¡Å HoQÐ. Œà:: z/ ùâLñ¿=C`>-1 à1ÂÄ>”;1# ÐÐÿ©Ž?† Rï‰<¥`A^Æ2I],þ_[þ_ÀÉëÌÆ™jœÎ ž FÆú¹úf“½ÖÆäUüŽ/>_ÀÿpXˆ¨ðèfÇ|7èFÀ[áhö:ajî%=Œ¬Ž ~k4`ô_þR`&c Àî¼âo`­äâþ¹ü$©§Y†G`1€O"€{FïßË3`¨‹-€Á_?õ÷ÿ-`ù¸Ä P`˜`1ü/K3ŒïÜSrü ]‹Ê=6b?>¬ûßVàãØ0ùæýÝIå>³ñOÕçûÌÆ?—åp ~®yLï•Â1líGê·:©×ouR©ñ?êWó˜MªüæHíO¾ÿOU ñÿ¹,‡œØ œüI­›Ÿmýàý!À«Å:`°Ð0l'5 4 ëóP«63 ¬Á—€÷‹ëÈ2µÒù´ƒ‘ÿhÚê*bŒ?=Sv0ˆn¨A`M ”r‹¹^w‰-ØÿYsZ×.—¼SˆÞacñ84Û«Ù$XÓS¤jòfw1àT¾ÈàFÐøVÃÿ`8`.-œ¡š™â‹©ÄÏl‰ A{H uQÅÿ˜êëNO‚ï-0H(ðŸÆ3 ¼;Äÿ$ô[œAÿs þ¯=ŸÄÿ5ùÑüŽnCÃÿåçË:Ô=DÉå½hV©®þMeî1ÑzåLÇ_Óé½è’¨3kÕ¼6R!¼3ÿò—¬=Çú0/{ùÖ3À0 à‰]bÿÒv€ðؼ  !À¡ @4bò&.z.å'M‹¾íÜ çž­|•øtEf$g0º,0?»|Ù&wå+ x‘ƒÐ'oy£>·k-gÕÇrD^£kžpæÚn7-߃Ï‚ üŸ—îtþÏ?Rœ/:LïMëy€Vëõ£}£V?ÊËõ»}ˆ·;RÜ.:ÌfÕúÕkõ‚?©Ïµü5®Ÿu¿F@©Œ1þd¬~+«õú­¬ÖêwVâÿ“¯–êþbd/4JÛIMMGÓÀ0ÓnZ0ŸUY1pzˆT¿xþ/ÔÚ| yÙü­ïPsŸn’Vàç @ì·‚üö9€øŸÁÑdÆÞõ 3/ö];oÖÆ‹åߣ þG ŽÛ?VaZàÁ¿s¬¿ÕØÞJ1€$åçí9ØHŒþ‘ý—˜E"ˆ@º/ Ðú Y`‰éàP&Ž\ãý\ëÿ žYZ!wŒªÀ ÷ºùžx¸3J™ú$ÀÚÊ¿0²_°?‡JÔòÂaŒ1áÿ)ææÓO» ¨ƒ >€(´qü¿*6ÊÒCtýÊé*P°ÿëÃÅL"?,BX–Uâÿzù‹A&})]Sîîdjß;8˜šoß1àûcÀÿy€0€ùà…öYµ›e›GÀ²$è/Pbè r8Ö”;eZsò'à ‡\³Éð˜ ÀOÙ:°ÅJ°AøãÎetPÄ™p)æO>>Âü À"{tÿ…?ËY7þBÇÿÅçK2 ‚¨¶~Û/¦ÿÇIüñI·{×E’çŸ À‹AD³Ù=|]g&»õÔ™Àÿ÷ðï^‰ÜËî ÒëòœcÊ{ÎT´žÿ'fçÀ  ûˆ˜é&2Ò `ðä æC";$Ä•¯ŸYC]`þé¾–@ž;(JòÒþOÖ >´€ÿ7=Œ<€SÝ~@æv'„ÏPþZmžðç‹E^‹ƒÏNñòüŸ,çyŇr$¬âÿªª à+õ£¸V?‘WêG9Vñ­~g6jµ#þRé@áOFäµò'µú­`“rï’¿­ÕòZý(¯ ?Oµ~ã3x;£i iàih $ä•HüŸ]=ãËñôP#àÀÝ»]ÿš¯¿®š¿åº²ÇPÀüۘΕŒÈëFüÖÖ²øŸË.â\?ê@€:@øõj~­c`/yTæ¸ÒB"€RïÛÛ;`¬E±÷áŒR.:¶{pÀD 1v ¶ÿóD2Ìêv%$'€?$àX€Cd‘X]‚™»ækp|4 `Šÿ9&`oëAŸîÃÔpˆˆðz)S_'†€îðç`±zì&€Ï:`Þ|3›МùNöŸüÏO°8<󳟽™÷XÿWš#à>ÿ—×’WðoÐAHp-F|8ŠWÖÂZÿì>BÈ&üÞ+tviÐÛÞÿÿþ·Û#"w>ŽÀÿ£+ ×è02€M„(ÒÞ@.* €ø²‰_€ Âsˆ_™¥C)\*h ¡zÔÀ¿ μËyÐÍ<ËöÄÿK6†¦þfy^ø_1†ÉHÖú±÷â"ø¿ô|q àÿcì ´”ŸâÌ£}Èm¾©«Ø÷õƒB„ 7‚êøàà$ËO%hõ;÷þ]Nd1ó¨1óª€zÿ# üο§6 `° bÿÿ/yÐÌÂ{ Ó XºüÊøì€ªÚ¸á§å€€<2Áé£ @ˆÿ™&¼C¿íÀ Àê^Ýÿòš…–ò k>[@ é^‘*~­˜@å¯~\zÿŸ;w4ü_©ŸàûJýT^®Ÿàÿ·ß>þGûGü'ÀOzȪ¿’Bú»qútÅþ?†ÿWº•Ê)â¿U©ŸÈ+õ£üÝWËY þ{C5yÓÀw¤ˆ@"Áÿ¹{sµÊª_/§4oß­Yw!ÿúXõ>ÀÿYó¤Ö¾–Ö—ýG¿,ÞÁ^ÿU½ âPÚÓÇl!äðÿjÑÄ;™<*Ö©ÒŽí ªxrl§BÀÄ ¿€âÿ”_"Ì10qÑñ’¸Ï©ynHìã‹ý{€‚€]WÆÿÀˆ Õ/¸7ùÿÝyâÚ¡CÀîÖ@Ra/òÚà -ÒYµ,Å ä<ºžwzóÔå7ß6øÁÿ»ÿóÿýŸ0·Çÿõ}»Œÿ—Wà¿’a e±³EÜRWÿœñ?!\ÎðW3LÖ¸CgŸRàÿå"þ'>ï~"üLþ竳¢½TóÿIÂBì6@>æ¢@¸üe@{™`ÀÂsÎÝз¯gzuíæƒgw’XifN:¤×<zm>7üô¢#<Ì£o¢Êëy.‹ùÿÙÇïÕž/ÎcB€ÖÎO–8êù£µ·ï,¿É_OÌ }4t#ÀºÀÌ3C+ú2ñ¿¸5cöŽÂ0  €y‘Ð  ì‡éSÐA0Í`î0ùžeJ60å%Yq´Áøð4!øf*ß`‹éËâÀþÏPª¨*²ý íí°tUü¯ò²VåíÚÞé+å¿ST…}þ‹>öN^JC@yÙûÀ~Ä~ }4°\?Å÷‡Åú9y©~”—½ÿžÿÿÊô"ôI¹vŽ^y­Há8þ¤tÊËÞÿãú#>¯ÕOã·ÊõSù«%ŠIüÊÞÿÐ_³ÿ׆O“5 |‡ˆ €®€ÿ‘vttÕµ8¥y»¶€˜¿k7"þ¯¼…iÀ¯©?ªâ^oj-ˆÈ0-z‚¨ÁìàŽJÉnCÆL€ùfˆŠAT\ŽÍpV!-³àÿÝc(¿ä°·ûüðæô˜ï#ØYý?T´ÛÐãþ|€âoIÏôÔq€Äãµ.\™Ì'ýþa j ôû0Å…c=ÆÑ wuP,¹Ç@:$ ÉÀ]£àÔ0oþŒÙÿ¼@a<ÿ_Žo—Ý>±ÿ¿Øÿ¾×Vöæk“, þ§Ÿxy\©¿8°Ž{9§ˆéñ)K(þ‡ù¿˜sLRALrl¥ÚÿC FýÁaóÿ  3ž‹ÏÀ;P^ÂÐ Òk €j&`pµl È.¼€ø¸ŠË¿Kpèy¡šÿ©0£ ­y°<ÇŽÇÿ?™ÿ?c‡¨? yÅñ‡“ª«s¬?á_Úÿzïÿ~­ö‚á†m¡ý2³1 ­ ÿÍþœAyØ{HW'ÑI <>´0³ks/y7Iþl›;’Zä( Èÿ €D€ðÿ?±' È=ywî" q‰À_€×íî‘äÊ­{ðiþ›·ë6 Üók}è^ÇöÿUE]Œ,‹1ËÓíªýÖÊ‹ƒ¼&_[Cr¶µÃyùá¥d!û?²ª`ñ1ÉÞ¸þ/[Ø-¾/ÖÏÊ‹õ³ò¢ŽÁÿ£öòuý}ìª?™ŸÇìÿ•úÙù½X¿±ù¿áÿúãפMß¡¢0¿ïÍó\ò_ù ¹8óv… c•¨ãu¨”W­ z}€±Ž‡êKï†õßt«lýgéûûÅu6D-ïçY«bîPȤ‰²÷(w‚ÅÿÈøuFLÕìíïË<2Î7QËðw¸ÿ'708€I”{h!ü¿R¾Þ€]Ð}˜†çôK „ G`x¦:(dêBÝ·(œÑ.¤œáFðÿðþß‘<’g>ýÙÏriGíÿãø¿º%v9ÿŸ@âÄØìÎWý;Q…:ñ—;°ZOä3ðÓoŸðÁÿ!@žËü°Ùý 8€«r9#ÏPvÿ?>‡}Àž,È0æQ°`‰°Vú" 1%@q%› áæBèÕAÀînD¨ ™ów¢‹6²n€àZY„[Ž­ÿžôzzì yk_qÀs]Fç2bˆÿûíA†zÿk‹2üßcz1ÂïïBr`ß@ÞØL}ÿ!»»`Ä`® }Т–iþÿ;àjÄÜÂ>™çïÂÊ>tþ¿pb®Qù0sç.Rw0wÀH»F|f“}„©å&õ°àWs«v#€ð¦¾ÿ3 lÀ˃d"¬FÀEg¹ˆîQÒäX[ñ˜×°9~áëžßRŽ='¯Ùÿ˯ïqûµÚÿP …8ü^ªŸ“×ìÿµú-„ÿ‹µsôÊóãOt~.0;ù+/ò'cóÃÿµÑÕdMß­b ëÚn·Ìì…H½B IöyìAW§o+Eÿ|]vÇÿã@EÁ²<“erí¤ÿØâQˆ”`xÛW €Bùÿ—x‡ÿ™É¯TÃc{$pdNpø¿p=¶Hć/}Ñ€bàx‡K@pxƒ¿e xÿV™cíÿUü¿T ëÚ½¹ ‡ýlñvì(«Ipa'vˆ0pIòTÌ€ #»|zÆ&ŒŽ°ÀÑíÿGÆÿ€È³5<¨Y'z‡áKã·VÿþÚü"ôÀ‹€àf±,°Œñ#Šÿg»Ùîÿ'øßÂ4±ðû“‡ €yn¹X`|ÁIÙÆÔœd^²9¢ºs8*„ì“òoßDÙaÞû™§íFwÏòqã À“âwwÓ'¾žÔ™XþS#z°»µýú}Oÿ—Æ>,ðÿ²Ðü=O€¾ÿ|À¨ÿØñžÀ©íaöÀp‡‡tpÍÿ?‚ g²ïøcÇ<<¡0ú_`þ¿%aPðؼ»9Ü é À°ï« Z¾·gQɰ“Ðú±ü{OÌ$ø[$'€>a™¸òÙ:ðžý·|µ*ÿï¾,ßëÄ Î< ^\¨ãÂòÂC´ ý¿¸<óöûBý–î°þ/¯=2¢¿R޽±ùsLcøÜÉKþ N^ªßXù ÿ·ø®Ý­i ª(€æ÷ ÀlÅ|/ûÏse^Yž‹…¢ˆŽÿל Fðÿ"U‚`Ì@Ti&ÿñÿ‘ÇÿºÂÛX`âõzÙÀãÿ|Ÿõø¿Ò§Ç€ÿgy€t Ù×àÿ_¼ØþG 3áßš°'RÀçÿSä_pàvÍ5à)àÿªƒ4øc;¿Û¹8d‘aÀccü»Í@Á€#GŠÇåȘÝ#âû`ÿG5a‚wþï‰.Ž‚ÿÕzZ¹yàE@ñ­„üχ·¶C¢óÿŸ ü·u®æ €yçûÊFpŸ>¥K €ÓM=Î;GH±B˜WϼJ gQvªª2Èî2›­®)/20¶þ[ÿázu]Ð…ƒŽ=Øå±ŒŸŽjÿ¯ a&­P€uÌÄË9øÏlЄ¾ÿ¡žö;øÚ5½¨>>ö™.?‡~5ÿÿÓbŽme=Ð ±9Çþ?§ÜÿÞÿç–æBRšûÙÝ%ƒ¡4kÌ`w&>Øä/§ƒÑ üc@É Éÿ·F'´tæDD‡· ä€õ+Ÿ}¶þY9†åÕÿöÿøê?–åçÿûßÿýù¿¯ÄÀt‡ÌP‘YÿžÀ±ç{L>†_ý¿4ŒùïUþ´ðÉÿ¬ù“±ùÙË sèÂòB5ü_[¾4YÓÀw­žàëæwlxSˆEÿ}k“+Û¥eé½äkËwÈ«[-€ÿk Pƒz„€w¨‚Œ]8ðg ˆþsRQbÙà©àqÈ6àpÍ^ÿÃDÃHˆEB,þ¼~²q“ýä&¹Œq1¦#P#ÀöÿqüØ-_’Ì½âŠøŸYÜ&j„ŒT„ˆn ÐíÑ  äàðÿ§gp“‰ø~àò?{Ù$zhyÃÔŒø¾àÛÁ=') SÀÄKÞÀgê+…ùo»¤¢5„—õЊ lüÇ3ÿx* k>H™‹¥#u`lý>¶¾<Òõ‚ÿKiÞ¬ Ás-ÏàÉ G´ÿWñ?hУÿ©ÇtíáNôß4×(ps1àÞµõì¹Öýýé0HB›ŸÅ Åÿ¨>1?þ?wn—Ÿ [‚øO¤"xø w1€­üFÆãøŸŒˆñÿÏ~–£ ‚-ƒÝìÚã"ºÀ•2}Õu þ[M à¿Wè¯Ãõy=EFÃÿUõ=5ü_X`ŽÍcò1þdl~~Öò†ÿ¿k|×î×4PÕ€'$õ1ÿÕ|‹)üa›⿊œáWÅÿ”W}ç«ùÿ¸†RøZ<ð«Á"pà/$ê6vë¿*°¿ŸSDr@»ñX¾‹ÙÿgE€cX Öñ¿&ù+©Ïî Iu€(àO€ý7nnüDvÌ%P|€§…ÿ7¶//¿ùx$ÇV ¶bü¿:Ùëæ®dZ€¢€³ÿc/@ó3`¡«úÙâ’7µDžÿ¯@ ^Ùa {ÈÓÁÿ !ó)¾+ûÿº¥|˜ԩ(Ëx€b¢¿E€  €ŒõXGl `¸|Ì\ÔO[ެ_¹þÕ±õ'&æ,Ïï Ì© œ£âÿ À´ï$ ï/¸ý{n Rýrÿ-ʘ{ëë¥à4}¶ëqôP{ cšÞþ§÷߀!– ÿ 'v…@ @ÖOÿþ](-ñÀ.¹ùA2ÊŒY€îòæe7™ƒ 📞ÆÝ}©ÉàtµÌƒ@MþßáP_ðNªþ? þ߯æ¿#Ê7FðÿØüú¬å“†ÿmø~i 'Ƴü#xÿn×]ξ[-PCß°þVñ?ädì`Iݼm÷ë.Õb„ (ò}µiÏV‹ïp‰WY¤d›½²Ÿþ‡~*Ûæ¯Xl/nØ?Æÿ¸ì'rlœ +Ä"àÊ©;<=ü¿ñ8øßîȽ`º–ÛH¨cubs3¨ÿ?–¶?;ƒ °#àw‰ÿQ{p;.Àÿ•Õ÷ðÿh€MÀ§øh*QÏóÂÿ™= b™QÒ•~. Àl‡Nþ™'XèVÙ,`zªEaþq…,d¸`p‚ÿ=d*3GÄÿÿ8rý?Žã#y‹·­0ÈÏÿsrÀÎ’Ü)±S5nÛ6‰ý—‡ï„î‹ø°“KûÓÚ×è(`îß)maˆ"À`šÊ{ @ Ìƒì/€3übÀt¯=í¾îG€ü=ð(8°ô±(€'bºóÇÉâD7'¢Íõ®«8`ëµ®«8žïººêSóhøÿ(øt~›ÿŽ(¿3‚ÿÇæ×g-ßmøÿû…ýZmšƒ€ÜÎY‘† w齜eŽMŠsÙu¶W¯âÊëöÿºyo÷ª(ä#A‰@Ê6ÛÆäj!»–/¶ÄþÏÓfVÈ`¬÷^ÿç7H;6™àÿúýQÁÿ+ÀÿW®pl8|€ÿ·7Îdñ¿s/?uuü¿<žÿo!ÿ¦‚Ê/ƒò² ¬Má+ Wé\ò@¬«V‘뇒@Ï~˜þù¢‡giÿçæ—óG·~]w÷öÿʬXs«ÿ(àðþLÅõxnøÓÆ`ÞÀ}›“¹?Ó…p'ÐO’{2C/B`ù$)`0óæ€õ+õõéú•üÎõñ«•6ן5¹<€ ãj/Åá»q´üÿ¼‰ÿ2K+p¢(Âÿ 7@Dô_‘P :>$ÿ:·\[1ÆÜÇàÀ6†%E2`…€ÿÿ_/çxflÿ‡á°' ™rÌ}Ù °ìd0æplk †ºPû1`œÈùø„25üŸÐðVIëˆ/Ök²êùù*„­/xŸ+þßï‡Ï7þmwÄÿt~›ÿŽ(§þ†>%}ͯÏZNü_ߢ>:›´i ià©k V'õM€4°Q€Áëéÿë önª§'‡¼ °Rueu áð„:APä`Üרoºøg¼°b^p‰'ž ü?©xß? ü¿;Ÿr*¬ßŸþþÜÿîÿK0x\–}ã}Pàÿ™ üŸ¦GtXÞXËÿ¿8þÏV°”@6uR%I @þ!ÄÚï·‚@ØxÀ3Øp ?׳ױÿ*ò¼=z4ÇNï¥ùcAü_!Æê¿0þç^÷C[êóÃÿY—}2~K13|¢óQð`Š>RœÊB4: è&‹åTe€Ïñ‰ë+! þÇ®p%”ɸþÙþÿlü_ó_æú³î߬ @ ÿWߎÛ³£ìÿ7‚ÿ‘"¤P³7VØÜ)Œ =‘ s–Ƈµ©`ÂH8Tñ€ûÿòr–@÷I"sbïCRJ„Éý»›æ?+«…*Zazl«L_<Àvdÿ/à€PÙŸMo1†ïÇä•G¤ú€ócþAuùÆÎXüzÿ£~nžlÇäcôÂBø¿:¿¡ýÏRNüg„_=Êü;6?ɉÿw0:Ÿ:òi6 4 ˆü]«bt÷’0Ã,™c”¨:ˆïfmYûê3ÝuRLá=T$|@IXÇå IÛ‡ñ¯cøùHøŸÈi2ßM·¦ ÆæBöÿj´±¶ÆkÿW7˜ ž#þGö‡LGñ¼™©I€ô::Þ¡äL´`.Âã($ !ÀðþgJ€24`ÿWܓ׉ÿkîË´eýé^>GÀÿßnËþ$ùü÷¿6VvÍ üî°0k1BÿÂøp6ua*­©#hâÿÍÒÕÇÿ¿ÔqþÏëæä\¾\`¸Œÿ {h™ˆ0µÝˆk> ÈÿúÕ¢ F€\J{ ¸+HŽ… T__ÏP8ðÇù¿1ÿ ºüÎÎ:~ð¨ßäL^ŽÊGøƒµùä Š_Gç·±ùïˆò†ÿŸáÃÑŠnø±j Úp 9ÌÇøÜ¾þ…˜ &ðÏþ_êFìÿÕýdÙ°V8º®¨E~îýžÈ-«HŒ/ñtƒ@†dÝ#ë ÁÿÇŽ1ÿÿÞZ®øc£ø¿~bÀ}Ù@ÄߣÅYÿ‘àÉðÿax:øŸûÿ=6þÇÈ‘€ÜÛ9Ø 0ÿ äF¹gŒÿiQ^+§à\Ìþ_q>«?¿úÜÿ¯8÷yÿÿìô|íÿ¥‡zl>@bý:YTœ-d®!0kÈPó€–«bË,0‘Áa¤g°|¬­¯¹¼¬ÛÿÑÔúþããòßMùÓ~(øýSÍß§­“ñ‘fqŒŽ €ʽOb™ª ÀaÑÀ½`Ê>Zœødý™ ¶Wäÿ3×n\{B«£¥JÄÓ³`ÃÿßK` À+ÿW~GäcÅÞ‡ÃÊNÀŽüüxD~àöÿ½þ óÛQçÇúõGšßÛÅMMO¤'!J7:¶´T 3¢úÉ‚g͝«¢~#«ìÆÊŸ¸†cÊ.ÐÅ G$›ïL*Šuèÿà ò-!«új-þ$A£oóþ‰×¿úÀ¤l€Ÿþ3ö¿dýgÿŒ€üOcëùÿ;úÿ¿Yòr©8ôËîèTr¨WïYãÿ%âÿ²Ÿ²¹\7eûî/9ŒÕ_ÕW‰ø!âÿ±G^pÚøIÅ3@<>Àô‚#\ê¢DfÈàø÷×ålä˜sÙ˜üª<|øÿ»q °Ø¨Pu+¦"§ €øTƒàP;áØ2²æ;­¾W‘üÿfsìþc{¬TržòRjÝB.€Eñÿ÷‘ð ðU~pŒ?àÖ÷kìôúUýÈoÎÆðÿ‘ç·±ùïÇ.?ÊüÞ®mhx2 €õJ®>´;?ŽûúëücîU+@§#úÔÓ!Ôæk-×Nöñ,‰ŸˆèÆòÿõw“4„ߣçe}þo¬xì*þ+àˆüäXñ¬ß(þ?ÊãÖ®mhhx.xªÀsiÁ¢7ƒ9còEï“=¯²nKxlw¶ZÃïp·$úÏgÿCeŽ!ÙR A-†ž úû¦‘Xóøÿ¶ÿšõ_®1=süøñüš¬žÿß–½H÷0ÅVé¼1€EÊ7æÍ7ßÌ´¡n 6•µ¨4®¾æ¸|²_w^¤iÚ…ùÝëGê­Ç«VÏZqL?c¬Ó +ç)Ÿ˜Åÿc÷xš’¦Ì|PÕ¾“Uü™ÊëùÿÍxþûOZ)7ö1€Ú.GÖ&²è1Í_Ý Éæ(Ü­h ÷*¨pð¨nÀ<U…zí«e÷€ ±ÀñÁ-°7îÏóÝ€ïPøŒÏ©óUù>‡Jëåð|ëwäÇ­Ð4Ð4Ð4ð<4ðâÏC»‹Üs,Aâ±ÉR¿ãH°VDIHÍP¿~AWåxÓ?ÝÀS£ðTµ, µýÿF ^ô„±EÄ"å,ê_—5F=]¾èÊt¬yƒÝ‚c…?±|L?åè½åøõO\µ#\øDµËðXõYpbx¬2ŸËɵýÿîÿ§1?Œ¶Éë}VŸh|ŒVÀ°ÀLöÄÃÃÕÜL¯UZk–vF\ž™ìêøþ#yŽ#Íã¿pO|'Ž5x¬ºGáؾñòLjº–žuý¾‹>j÷hhhxÊhÀSVèã7¶ŽY °¢zÊ×?~¥ÐG<ÁõƒKXr>Û´2ž¶ÆÆïÓ¾_+¯¢Ö?ìáñ"õ²TƒÂ^$]<ßQ;ÀX»#äŽÄ±õíò¦¦¦ï§ðýì—V«¦¦¦¦¦­žØ‡àG«‘Ö°¦¦¦¦¦ïFønôÜîÒ4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ð\5ðx€wÓÖ@ÅEßk ¿Ë›÷nìÍ}ñ»Ô{»WÓ@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@ÓÀ¨‹0[SMRdö Ð?>Ö1æ­>Oì8Z¾þ˜µŽš˜»ÚG¨I"»ãBLæÙ»ñî¥ívrÓ@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@¯Ç&$å·Á¦ö{?K•ØokyYðqá0×77‘7¯o– ®m¨7V¾Åÿ%`tnv2©‰»5›£¶ÛÆNvº‹ñd’ϘÞã§¶y¬¾i'7 4 4 4 4 4 4 4 4 4 4 4 üÈ5°Ð¸é°LÀìýãçci§ÛB¯í~ýúõMü«B"ÊèþT/_¹Ù.mòk6 ªñ¸zÇ`s¢ne¦ @·½±Ý|6…=”y O?xÞà±”ØNnhhhhhhhhhhhhx ŒÝƆÂ[3Õ½Ú¿ÍŒè?£[ŽYлíÛÛWóà$ƒ¡õ_(ü,ñ]•xÿO?¯sÀÿø/¨ÀóªÍÆÎÎÆÎàœnu.*ê¶ñµ°Q(&¼}7[ù~mü$ç]Ó4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ðCÑÀÀö¶%lqH¼™ñHðÿ˜~wu»@d0_³ÜëÛ$Ìuþ‘;ºåå¼î~þ§:pâ¶-¡‘o–·‹EÛs»í pØ­Á0ÀÿÝ•+Wò‰:8Ç D7_møÿ‡ò”´z6 4 4 4 4 4 4 4 4 4 4 ü4°°±±l¡ª°¥Õ·ÌÃò«·¯fsðwæ¼2ÈY€¾ðó÷^ÉñwB°e€^”-G胡àüä 3ëWÖÿ'“ù\¢£;ÀaPw[æ°;p‰~ƒ¨5¡i i i i i i i i i i i iàû¯qà^÷[tÑ÷lA·Ã €Œ€WPI²`Ù¬f¢à€¥^Ħÿ1`{ ºÌ,›S…(ƒÃîÄò ðÿ¹ìõF‹¶Yü²Ñfgy#“ïfÝ|~e}]ð?ó äîf:Ýê&Íþÿý:Z ›šššššššššš~DH€l·LÈÚu[jÀÞ‚[2$j ûƲ9y²Gß­®®®t]–€½è¯Ãàz?Û›Ñ ‰…-bìO>ùäT¶|œz—.Ïßœ€3~îr4o™I¥yY?YáèŸÃîÝîA7™w“Ù|²Œ‚2.¸ê™»›6ðG4’ZSšššššššššššš¾×ˆ €BŽ}øµâ ,&~-çÝrWdºÕ•Uø äà7Ð9@æ4‘onÌã]·,iÒs¾ûäÔ'Ýû7³ðžø{y2›MN ý~Ö@ @7V#í¸®CâC³w°·›eæ`&«]7YÎ¥ÀíA€> þßÍSßë¡Ò*×4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ðCÖ@Bp£¾Ì.{’{Ÿ,02‰ÚêÜôí“'_É©¦ùÕ••îv> £¶;&¼{w³#0,øiQ“œƒ>âï?9uªûùoæð¹%&³Ÿv³îĉ!€Ø–¼AøžÝ+ø—ü{Y ëöÀt;;šâvNèÛ@þâî þŸwCíýGQ«{Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@ÓÀ÷^)À0þ¬qˆ¶ë)ñÿr‰ò»,ÐÝÜ&€@«Yû>q3€Í»›ph´:Ь‰ýý?’èþøÇŸgÊþg‰BèæÝ¹sH˜»?7½@_„L¢AÜ}wï`ø¿·—VÊ… @·C”O7‡¸|%„èö I‰£hGÓ@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@ÓÀw¤„€>O°:–`Jøêgrt`Äÿ}èL|ÀU¸¸m-6ü]àtJÄüO|=H@Ðýñç ®ÀàÌÛÝ Às˜àOüô§C$7 »€òe·Ã¡ÿ?îàà`¾»†Ýþ¢Ê3ý¡D0ìt[È•(á )€tü/ÎßQ·Û4 4 4 4 4 4 4 4 4 4 4 4 4 @ @Cu1?‘ÿòø›¿ÍÔnèÔH|N€®î€ðÿæUxÙ#þêÕ¼ )ׯ<‹=€Ñø“¨7WAŸ ÿo"øŸåßćAßJòÿý“ˆK0ž4I¼½zÌwwÙÒ” }ùá߯äÅÐ{_NX}›R¡1í lhhhhhhhhhhhøî4Ë-ì¿.@S®Ë7L EÈÀCÜîÙøýÃkp@,@¡=@6 p¤ÇGuá @߀@Gà?ʇ\n]N˜Ÿ²^ÛèŠÿ@¢þ ƒÚÉí‘tH ÒðÿÎ6KÐSs’å ”˜½Íw×ííNMMMMMMMMMMMM/š"Nð¿~ûí_ÿº¢^xà‹}ÞLC®æú4—.]:ÉXþTšÓÏÛ·ËÀu8Ð@Ž Ô^ ¶Ü%¯µ|%Þ&æ°ßý­0üó§!F‡×ÿ6·€7‡èØýÐz¬eBüqïuZG’ëið]@Õé„€<xÑž³ÖÞ¦¦¦¦¦¦¦¦¦¦¦ç®˜xû×o›) Üy ä9w²—JÇ9öš“—N^ºT òþ¿ºzI²iúñ+ˆ.©…Ä·(ÔïÊ©+Ÿ\0(ßâ8gá'p@Hb´mg'`©ì°+LJë먙öp,›€JKpÅ;ÝVcžûÈohhhhhhhhhhhxÁ4ÆÀCþ×HñŸÛcOàùêêdu2Qx¨¨JQ»9yR€¡€\W;Äê´Üa&,u‚äé+¹ÏÓþàJ¦|1ùŸ0Àà¨63¦ R°þ(úÍ7—7†.R!bwå'†ð?ò" p)€ì¯žäµ'Ðb^°Ç¬5·i i i i i i i i i i iàùk ' Óî¿ä°Ëôè‡#'ÿ— ƒ-®®bÀ«ÛÝJáL¸y·J£çãô ¶¸ò öD €Sqù‚ÿ%AMôŒÿÆ<‚Ãð?€L€k8VðOv,ŒûΜ‚KÒd ƒ²W¡›šWOÂE€,ò("•ó(>ÿîo5hhhhhhhhhhhhxQ4D¨LæWJôO@°ïp@8`ŸÌæàpþ¯ñ?~ôI’^pÜ«oÐAtþÏæ§'h—gËp%s2 L`¶Ý{„ýÿýy“¼ €!ÂìRþSð"`"A”B" v0ËæU8XˆsÜÿ% /ÊCÖÚÙ4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ð}Ð@phÞ–${e€UD”€;äÚË• xîœkzë?ìPrè¿àÀò™0-Ÿ_ð¿âó©Âÿˆ0æÞÝ{J àͼ Tž,@£`¦¸/](Ì:É(xêÔ´o%A¿ðÌ_ è¿1߇áßêÐ4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ðâh Þ@×½] &««ÂV €á(pú<ÀÐ"ðííÛ™;ÐþOè¯~¹`ˆ¾pê9€?þQËÿãßË7S‚ýR=îþ·å€¡ÿú“›ÀfY!fëÔ:,þôü—ƒŸðÍ–+ßÌYs†Xð÷Ü3-àÅyÐZK›ššššššššššž·â] ûõ40]ÕcÖ`@Ø‹óIäö07-îLJ„ ¼z0ý«ï·YØ€þûpâß@®=¸Ô§š3ïÿñ¦|in’ ð‡Ù¢Ç?€? À–Æà,‚!þ—Bä¶”B¬¤ €™N×áÜ 7°AfÝëÑÐç÷'þ_6žhÀóþíþMMMMMMMMMMM/Ž’ma]7¿Î{èÿs+€©8xÛol¯ Th.[Àmno+R÷G·âöq5üã#öÌËuê+>Xq5H޾üŸG@ç'Ôï@.²©Ó4|•ä/¦xä\ý¹×AΗ› ´Zôö_Ál ±yâTøfÀqp0çpŠÆ¼8OZkiÓ@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@ÓÀsÖ@BÀ°n¦OH[@K,<°â›ÍËj¶÷H= 6€ÿAè7ò9«AñËǧËW$ümYæ!p¦ú¸òK ñáÔ°ùg³à¢9Kà“Ð Áò¶Q¸¹0óF<çÑßnß4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ði &áéhŸSw ý[%Ìo?þi×á£~°ñãæ&ìú<©B ù{«Wù uÖp¬|\ØçáÃ0Ï4¸|mM˜C~( ˆ³h›aÒ×FÃ;Ä-~À“Iž€xÆ]kjÓ@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@Ó@ÓÀw¬`@:ÿÿZd*Ñ9sF=ôõC`A¿`Bû KA"¿|ùò2]à& ØmÀzý+.î–ÓƒÙF\=ägïb?Z¾rà'„w`ƒ¹àóà&r_$ø×‚ÝïXÜa@Ú9h‘·H´.þ(ÉÝA ˆùΈô;îèv»¦¦¦¦¦¦¦¦¦¦¦¦[–Ø Ï{û£ת¢cÀþN>ð>LwU`‡…tm!²ØÆc.à[„–@ˆ¿=|çÈßÛÛ¨ ý0#å êNÂßú‰^åÛ§uè+¡çF÷gÃå[÷¡o½­Bßw§áléÜJAïÿb½Öú¦¦¦¦¦¦¦¦¦¦¦¦ïP!àákŒ}mÞ<Ž˜ì*ê ¸ÂcÒQ#ú¢õTžeOˆïª¸ïbüŸžÜ¡R¾ð‘}^k8$5‰o/®!þ/51UB7½Cz÷ï°»Û­šššššššššššš^T ¸€üÆêbtý¦?«?ÃåÙOêÏO¯tçÛâ‚[eëP(^I ^1,_ZÒ!lGXºýÞ}•´Íêì‡ÁéoØ×‹Ut,À‹:äZ»›šššššššššššž‡¢$€Ï£?”{ztŸe~(­hõlhhhhhhhhhhhxQ5Ѐµç[»{ DÞ,ÅüØåhrØÄ\s¿ïröšø×¸q7bgç°Ä}DDè?_ž Á÷Tþ:°:|†ÃžÐ ®8Cÿì?…^¡÷ŸêkÔç;¯Åã×»]Ñ4Ð4Ð4Ð4Ð4Ð4Ð4ð}Ò@#¾O½ñÜëòcGº¥ö™sæÏÀž?ä³ùk#ò•ùúˆÙ1uðê‡'«r³f´À_i‚‹ó‘üü@>‹ä^vDƒ Fû¥å¿ɽºüõÑÞ¤Æ7×6Š ?4WñÿYÂzùáa=?­bë åð‘ÿä;üS¥=™üÌßw9»ýw‘7P°mªU˜h 쑞I$rÒgV`øO?%ƃÀú)9.á[0ü§Ÿòjþ>T¢P·öuÓ@Ó@Ó@Ó@Ó@Ó@ÓÀEž|Qï`÷H¸°F÷H¸ O¡_ršI¡]*O¡a*O¡i*O aZKã‘p$1çÎá fÌjÀL§›NžÓ€™ÍæNžÓ€yíµKNžÓ€YY@Óûç4`Öׯ8yNfyyÃÉs0“ º–ŸÑ€¹r@o"7ëWp»þ0.¨zôa94ç/\ˆäó¹ïä³9Ô\¿º  ¯(w‡9y@ íäÉHÎ JB96 íå€ßý•ù4ó;òÀùÔ,~íôÛÏ<ËUÂ<3ågîø¾ËÍ[¿{+Rü(xeÐ#ƒÆ?r¤‰|JÏðígŸÉ?~ÈÏãÛóçå? ä—ðí¥KòŸòZÞµCôÐàS¦ »¸¹VŸ2UØÅ͵ø”©Â.n®•À§BW·¯›šššššš~ìh€ö°‡}9ûåö•äö•äö•äö•äö•äö•äö•äªèH8³ú¶–RèH¸&'®É‰„kr"ášœH¸&'®É‰„sòs€  L½y ˜é榕g5`yõú¬Ìk€*ÏjÀ«<«ä*ÏjÀ«<«3™Í¬|¨síñ¿5€ó·Y¿v-@Ø^$þåç/~Èíÿ‡òÙ~#Ídø?”¯¬M‚ëß½DüÊ_»ôn ¿‡ø?”/ß¹ïù‚³W¯ž½z? |ûAœ5øJY=ÁüDýûÃ@)üPÒßû›0›CÃü¾ËÑ‚W¼…ZZƒýlÞzðJ À%t‡>å$fem)~ €Ëu€(Äý*/3*/3*/1Dý¬N*ã'/á'/á'oøÿǾ²iíkhhhhh(j ŽpÀ·äî€oÉÜß‚Üþ‚Üþ‚Üþ‚Üþ‚Üþ¬¼÷q6@‘u×aE`67ïBp=ð~M$ü^M$¼V“ ØÔìàþ@Âwj× gð`ÿ¢¶0§w<§Àþ}'Ïi°ÿ='Ïi°ÍÉsì¿æä9 ößqòœà°ëä©€öið6”ìƒÌùiðä.|èƒÌì þ‘|>äƒÌÊD¬ð!€_]x´yí]ü#ùÉ“ïú ³|ŸÿH¾±qßòóßÒÞ@þ0ÿ_Ÿˆ£ÿêUù'®’(àG`ÌÒ€ßñŸ|tCÊ…]`åüèä–Á€Ç;(3+çG'¿há¶9uÊËùÑÉ·ÔŒ»žÜ>Ed|¼œ¼ Ì+$~¿#à4 Ç—{˜×H }Ê €Èa€/ùˆ:(ùˆLXÎ@P¿Ñ"þÿÌÉ øÿ¼“ðÿ%'oø¿­‰šššššš^\ 4À­§AÈâ×ÀÚ™3ƒPùNÞ@åò&pX¾Uþ^ÞË·Ê'y8,ß*¿–7Ãò­òûy8,ß*ÿë‡Ãö)6àO"á‹çRr áiE$Üc?÷`× ¿|óœ@$ÜcÃÌõ@Â=6ÍÈ„=6ôÏuP>ðüö°ƒûqÒ—´ç5 ý/ò¼¤ÿEž×€ô¿Èóþy^Òÿ"Ïk@ú_äy Hÿ‹<ÕÍý€Èy„@Î $r!ó €œ€%ìߺXëêÙ[W ž¾9¾ÀG}-b} ~/ /pé[«³UÈñYq¿1k“5‘_DÚ;ÈÏxr|VÜoÌ…‹D¾}Ѝÿ­Sßž‚Ÿ÷³±-ϩٟõ¿5{4ƒŸ÷£²û2˜ëëDýo­ßX‡Ÿ¯[ù•~ @ËyïÀ?cóJ@À(Op€ÔÈ-à³Ú‡Œ°_˜%\V@÷ ö‹Ü.+ „…xðeŽÀ½Äíÿ3'OÜKÜþáÄ£×'î%nÿpÂQy#^Ü%OkyÓ@Ó@Ó@Ó@Ó@Ó@BØ%sQ/?b9‚ˆŽ`Áºx~€¹$ŸZùæÎæSNk^?Ä€èÁèw•_zpg(_±òÕ ãu‡òu+ÇÊ?ÊØfÏDb4-ã>¦‡×O¬ü›fûµžgû?d@ÂÏ¥ åÓÍiª€P>ƒñ7U@(íÒ{¯¥ å+0§ åë0N§ åË0§ å“Ù_?(aílþÃ/‰B²þwò¬€ÿ<«à'Ïjøßɳþwò¬€ÿ<«à'5@BA<8ÈÅpÐÀ*¸J=B9=,Ôª¡œv€ÐP€PNÛÉ DÔ ”ÓÀêÊéà"þ³Ÿ_½¥À­ÏoÁIÙ AýWÍiâ0Çga¤½øÀýk`l €0«k+RCð%|?™±ü,ÖÖ&³µ5ºª˜‹/BE&q^>‹üÂ…‹P]iÌöö6€ÿö·`ä³È76¶¿ÝDf_8#0òYäp£R™HÁ\¿~]tý˜ù,rô: ½Æê À@>ËðЯt¿†¥%<ÿ¾ƒ'úU™OT>™ý×{Ðt2€œÞz С¬‘c/€’D.6Û¼D޽J9Ð 9m¾ ˆ\lÊy ˆœýk€nåð)!½ô–Ø™™N;%Ó­ýÃ È A?wÚ¹)Çß Ä€nëðy!ýõ–ر)ÇßnÿÀ©ÑÇð›g/üí:ø¯¤CãG‰Áß dÀLíˆ>¾ƒt€”ãoßÉÊ|þgü÷ùçx¶Ñ··þ|ëó³·ÀâwÀÿS§>Á`¶A€ ø„nùp€M·!@ý°?µ¸¬Ï€ÿÅ“AûS ¸`8%dìOÊéö/Ã(!`ªá@€á”°?•€ †PBÀþ¤œÖþß=@Ò?|úÝ`|xÀŒ†ê k“‰:L4Ôa†ÈZ%?( Í#Le~×yR¸ýŸÊÅr¤ãž!¡OE.ƒ äBŠ\< G:~+§ýW=v…b޽¸óå òøÖ` ×8•Ç·¹Æ¨¼ùä^Áí»¦¦¦¦¦¦B= °øΫY@`?ðÿÝ Ø Ð €À~&C/0û‘› εY@`?ðÿõ °øÿNØo&X æºïJø¿CÄìà`ø¿C„‹Z ÿ`Ș÷p0ü_€!B÷b ÿ`È U; µÖ``îã`X±C^ÅܬÌ!–¸÷ Òjµ§ãÞïJ«Ø¿SÀù0C.Æß”`Ü»þÑü À¸wø\S.Æá”p>Ћq:%÷~GZmÄ8œŒ{ߨof»ù€Ô/Én€ õÃÎ]Èe7ÀŒ`Ñ|´Ï nZo3@ê‡÷Þƒ\vÌh!Ú“5Èe7ÀŒ`ð½vAà´þf4€Ô÷ï@.»f4L>ß…\vŒ4À-Á€[¢Žo\'ÈÄ„ŽÕÜ[‚7F?÷ñŒà!¹Hü¯[¢`2p]çx´Oköù èV€ÀÏd€7ÙÇ“5ö²Yã×­¹ <È“‰'äF‰¹Dü¯[Â[ž Ànopd/›;ãv+@¤ý7·nýÿùÏŸ««;>ÿŸµ1Ä{ü§Nöâ3¡ðiüM/o««4ý3&~‰á@Ì̯4§ >–«È€Ÿ À3ç@¹LP€ñÉJ@·šþ¿¥CÀ|ë(‡Û?Mÿd g @ÿ0‰†ÒcÆ£ À :0€[40eƒÐ<áwoÙâÿpàÿ·~§°bCÐHvª!lî,v!„*ë¥ÄÿV.ÛðAŽŸ ǘ°rq‡€œÃ¤‡áè^+—mø ÇO Ãõ^$È`¬Ç·æ½$€øˆ¼gxü/)Ä@äÑ­y/I ¾"o À ±¾ilhhhhhÈhÀ ú€.œƒ/XÙ‹Ôìtâ ÓÀÓÃ\ä3‚Ìax@•¿†x3LÏíÏE¾Â «†ià±êUù:VÃð~4EÍþ@ Èf†ià¹ý¹È'»™$pÁȉ¶ ´Z6,h5Ý‚‹Z %” ú3ïX‰ Ï/“€‹@†@«¡„2Àµ/] Ìl€¹÷ï£ €†O ƒ¶9ü‡öàC`¨aÖ$3=†ÀPÂþHÐ7ò?d4 ìÏ•#ÿCFÂþì²Wÿ!Ö†(p ] 8Æp+n5` €‹ .|HÀ€`¨ âÛÿ@íF‹eôäñù§K³Ø þD»Ð"Ý4<óù¦K¾ùÉK N¾KjºÄgä]ð½È7Ð.ô©Œn4’cü]ð½EÀØÑÿ0ÿc„œ²ýóŸá@ìÀàpú“O`ó_:uú“Ó§pÆ©O>9-{à¼áû“$€ºEhŽL(Ø_v 7€Y`U˜P°?‘¯$4²C÷N œIû“$€fC€SêÀ$€‚ýÉH@2ˆBh vb²’€Ðʘ·ÈÀçÿŸpZ>á|/ D:Ciþ?8-Ÿð?Ózü¯˜¶wþ³~^,6•K@¾õð¾øbóW9ñ¸óð¾øbóW9q¿ó_|uþçO¹9F'HZùŽP¿³ý˽Ü2P½³ý˽Ü2xäœí_îìåh ¢¦¦¦¦¦¦T= «ùs€Á I€D! ú€ï ’Håú±úŸcu‡Åì@. «ûK@‚H? è:X$ –/ Ÿn°@‚Xäúî ’H¯ÿ«È'XÎÍ{âkLÛMô—À<ÓÀNô—À"‡û3Ñ_‹œíÎ`‘ÃNô—À"'D»sXä0ýå°Èa'úË`t»$@Î]ÀEx‹’ÐíB™ÞX¸×º]}˜‰~ÅúkÍ¿öt»w¯½'æÁõ+‡øŸèW¬ÃÖ<ì®øh¢_±N[ó´“/â¢_±;ó°ž@Çp$@&»³¿]æˆ CAÜvž­††€h¯M¶Jj@"¶Ñý`ˆå ç…íØj(a¨¡fÐý@šPÂPñ-¨œJj4‹³ÕPÂPLŒgÐýh5”j€%(ïá$´{ƒ4,ß Î<ÿᇰÿ_$œ¼B`ûy\Ð%øž8/°ÿﮢ÷¡L`Êžã{âX¶Àþ¿'ö.š¹B†k mœp·ìø.ìÿ—àÀÑ!$Ìÿ@†ø,[`ÿ¿'ö.š¹L—;hã}·ÛLþ€ÿfý%Ñ>|­% €fö£Å^þ°þk€îéG§|K!dA¨n‘ç q±#— 0pà"âB¤  !æ[¦ÿc:zx@B \'0‚d@Cä 0pÍ0`@Ï0²ió$ÿzúÁéE zè÷êTµBÏ9üëéÉéE¸=ô{÷±ëÐéÃdˆ7€•xÇrÝ ÀÉ ¼c¹îàäÞ±\÷`‡) aúfm—N*…}Å( –[@¯ –[@åBÄòF¤oÀöwÓ@Ó@Ó@Ó@Ó@ÓÀ ¢K¨åÿм +0€ ?G‡Zþ‰¯§SA~Nä´`aiL_V±f¥r„€CþŠì‡.Ÿ“ëiù?43†‰@*W·×Óô…UØäzZþÍq¦ /€T>ù¯¥~’à/™p4ÑnB_À z *ñ?‰B_ÀðˆäÀÿ$>}c=ÉÿI|ú Ô‰äÜV í&ôìrYKüOâƒÐW°Ï¦—øŸÄ¡¯`XL£òÿ ¼}÷§éýΟ ?.`„ó°ðrQoo{?ú?AÜÅ.›wñ_/—ôeâà úCÌ¿û²‹™»ö~ô;’þ æêß–{?ú?Aˆyxöa/—4hâMúƒ@øôJ/‡½ýΟ ?Ä<|‡öa=ÀÛ9HÀ¾ø·ßàþ PÆE¸¸£ÅâùÑ€ÙAÜ Z,ž ¾=¢%\m¹C ü‘ÝèùÑ€™ î-χŒ¤ó¹ûƒØ‚‡0÷÷‚‹çCFfŽQÓÏ Õ€ä :É0o$”€zYHPÈ0ð-ÿŠr€Àæxð‘€Û`þ[/É €&t‰ó 1ðßzyHP'ÉÈø„¿¢ °¹|`ˆãá¿÷ò@ÀÕ«°ú£?}-fvƒ€€[Ÿãy×GI…8uêk_˧SÜ PÇ]dÉÉ¿  €-Ã]H_PÎpe¬ƒG4€r†(`åÈÀ] ·€œáÊX9Ü&Ds:g0@²b*ÕúÁ-Cz†[Õ¾Áoé šû™Y$2H~O9Ã}…ÒHû>ÚÇó…GC˜jä Vø\ã´‚ûéõ r‚ýT®qø'Àœ> §0CÏP•¿“Æ‹œ@*×L€*'Ê5 ÊI¤ò– 0~G¶¿šššššš^ 8‚~˜aÒ`ðè è‡ùP@! åýX: €æ²Šå‚ÿ`ò!òf§Š±Á‚€ƒ!ð²è…ó«$fgð?cƒ#BàÍä[šð`þMêGp±pžc8-Á/†:  ø]î0e8-Á;;¡èáºO++àú?‹ùÓâNƒ< 3 <”ÓœøðHý£Å<Ú_Opî@x¦þÙ Bð;ÜðHý£½yT—Ñô§…vbfûëíÉß¾ýË}ãˇß;íÞh;›þ>ßPˆWüÞi÷FÛÙ|ðwñ#P€À²>ð€ öëí¿Úø½Óî¶³ùà? ¦ððÈWXx@ööa{=¯ø@Âش·O[9¯°>ð€ 6ŒíÃDTĽ`?àü×Û»»3´ß †´ÓÍý¼Ù¢"€ùìÌ1ÐÍ·0àÂú¿CE 4 ñÿ 0[TÄ@èà2š ·¨ˆ$þŸf‹Šhvqc8Ê›*b <–``nP©ijcŠSÐ Œ²Ïvøü“` ¸%`¿  ¤$À4`‡Q d˜SÐ Œò À4€$˜€’ÐŽfd@L@€(Êžþg‰÷1?Ü¢{d8+ý‘ù§Í©¿>úäÑ_O! €§ðyÓñé“21¾¸Ì“°.â@²Š‡‡q?]u¸  €Ü'dIq%â€ÖrŸ‰á°½qŠÑ6rŸTÂ$1šÄº@î“2J˜ Fƒ¸ · Ýþ% räv Û?ð¿MxìÐ` èFÀrÿ% À?ÀùQå’@v ×ƒ{øQå’@v`¾“ó£Ê%)3J~>Þ8ö|"G ‚N;Góÿ‰ï¿Ê?ëå¤4ÿŸøþ«ü|/' ùÿÄ×@å—zy£^”eNkgÓ@Ó@Ó@Ó@Ó@Ó@¨ž |ùe† !Üp8d›b)Î~¸Àu†Ý±ÀZ€±2e€ƒ‚ÂVL×1€.À(ëæôiZÁøqà€ aËæøq†ðãÀ`2¹ fì|L'ߤ €èEË·¦„Àƒ@¿q<@/Z¾7#úƒàz±Œß¹K DûgØBpà=P¾@`I<@/Z¾5%J¢}4º ^à[SÀ<’ x€^´|ç.!0Pí£Ñõó ìÿ¢€ÀÀ¿»†(xgbc-ô=Zm¦Ä¿‰€û<€X9on¢ïÑj3#þÝ!îóBŽpoDÀ‡ù.ñodÿ¥ýö7ô=©Å¿a<µû!jJüÙ‡åzú<ˆôÔâß0 äGÀ;æ.ñojf‚€@`sƒø÷›áÿí DÑá?p- €)ú?Õ€À¤$0Cÿ§tC/x@¶»èÿÜÂSô¿2½þ‹‰|rab ¹…ÿ$¦èÿ…žðŸ^ò€”wÑÿ©þ#JŸÀÝ»ÂÄ­¢N ¸`gÆOU/ó Š‚˜Ðÿ$°sã§ìˆAcåâøÀïM†Áà§&Ad>D…×ÂÀ£c“Ø?5É¡KA‡”ÿdñ¿IÕà§ìˆ$€özql@| $tsÙ´I™ïPÊ¿ÊÝý‡O¯#®ÿ”Y#ðùÕ«gIÈý¡Yæ@É€ ’.Þ€´ ÐÿÖbˆÿ´À¸7F`—&úßÚi@üŒ ßÙ1$šƒ´Å ÀÿH—ß99<P·­-Äÿo‹ ˆ ðrjn¹dP¤‰8ãÛd*ãì™uÈ%C#@èR DÂ?†èn’ý_>ÛJrDÝ @²ÿËg»   `Æm‘s>×@zWø_ ¯ÈWäôÃ'40§©~•8 @ I®÷/Ëõþey‹hË¡¦¦¦¦¦¦O.€ ÿ‚yY=è týwͲzÐ ‘ôï›5õ7ÒH—úß3¯¨}9AÿšéÔ€Ö·DNÐÍœVú$r‚þ;æ¸zÐ ‘O&ïM®!xWCÔ•7<ðñßôüË/3’7³€@Í&ÊÞÙ¤/xrz?`‡„9`ì#æEOÓàÓô„«.ae.™Î„0˜òÕ®c¤qf<Øÿ!¿rú4!ÛàþÄw7Ž7÷™7}°àŇ}0Cýæý&L‚Çí¥ßÉþ&9ð¸ý¡ô; Âß$ £À÷7  Øþ‹> þüAˆð7ÉÇ(qç(±‹Ç³÷N”ا!G”¸ó”Ú‡aQäî² ðö@ø1ž‘ôôÿgÈð[ªIÿGÿ†<ìím¦ìfôÿgÈÃÎÎ<Õ€Âñû`ù—R Hú?úÿ3äø2Õ€Âñû üJªIÿGÿ†<ììl¤ôôÿgÈÃÿúr–Ñ*hó‡{‹°,´,ËwÎʶ0Ò}J˶|gå ø Í²@SZ®å;+g@mþ˃— Kq™×àñO›?$Â’ -þÆwöztÐæ YŒB ò°C»0ýßi<§ß¿²BàÒj ì÷§»ÐõøŸº €ÃÿJS þ€1§"påLQÁ”9™@6è=‰$…'æ´{$z€×o#> rß2 €l` Ê1{RN7ªGvOP~ñOÓ Js@àzGíëþvŒpŸ5— Ú—øt@ÿY#ÄÌ ‚úi¢çwz±nù—•¦ø¢ñwQŽœ˜v &DÈ'ü'Ö@¢Ö¦ÄmÊrñ@€ÎK׋÷(”߀oÍÓZÜ4Ð4Ð4Ð4Ð4ðÂkÀç êùe0°ƒ§èXVÑ€¼€•›´ƒg值ð‹E)ó¥¥zÅõ€¼ðKåNLùòú» ìàÙë±â=} Àõ‚÷øq0°ƒg¯ÊBýh[‚Ÿð ße')Áp†G À`<ØÿÁ1€æ3Áp†þ\… þ“$pC€éÅÿÁøh°]~ÿI¸!@—bÁp†>$enügøÛ ïu y4 ñ¯lÈýðÜò\ò>h@â_Ùûá9¹ä}Ð$€Ä¿‘ý—Cò>h@Á¿² @ŸPó>h@âßÈ>ÌëÁþ¸$€‚Cû4å’÷A“ÿÊ6€Î>,Ø ÀÛ$€À¿ïíþ•ˆƒ§_~ù¢yD;¢:$0hìŽyÄ„êhÀÌûxÊO½ tÔýh;?3ðÁÀ–]üL@/ô¥-q°ø?"¸EY…\õ ‘Ÿ‡\ ‘Ÿ‚\Áÿ òäÂèü"_‡\}þ{àìðÓ¿Í Ÿß²)„X’­UÔ  ·d°)0€ñ…`ÎóÎ€Ž½œÖx''.W —ó)rrÙA€^ΧÀÉeK %(øïÀJ€¯ÃIÀ}I8VÂË¥J8¹<Êîz©RN.¢“7à…_54 4 4 4 4 ¼xð»È² .pcøë2Ç2¡þ½|ЙMÝõ¯0ºR~Ç@èŠü4¡+òã „®ÜŸøüÆo‡øŸÛX¸h:¸è,æ¿W@kM˱nWšØ%\,‡Óƒ:À.§éàb9VèêM˱îW¸h:¸X§u€ €¦ƒ‹å°ÿýööÛp@ýþú· @@'ð—ü5`#b`&AøKþƒädć™ð7¶ÿÊÐ!¦\à/ùz=ö"¦s²Àߨ>,דhÂߨ>-r2ôøÛ‡EN€IþN¾ùI}íÿ ÝžN…J5Z14÷΄J5@«)w¼‡ú…J5€†3™–(ÕýQÄœL9 TDyõ*”j.ˆ°÷”j€•“”r‰È@p(јšþe«ºHÒu0g„„dü‡é»Èoü @Üa9fÈ‹8( D¤ÄÀ÷"gÀ¼dü‡é_íè²38Ýøãà¾dü‡é_X"º¼û.8ሰ¹CZÄ@Yº å¾—!D ÿúéSëflÍ %Wð›Y(ȈãùAŠÀ~Žð? €Žäá?ìÀ€rq@䂦¨Lü).`Î4…fBàOq8Ä ÞŽrŽ8P ÈÅ€ýž0o½õr¢USfÀÿtÐB@|/ ””¢DáS8ýOð?åP¿ËÂc¿ `úüKf>‰Ò‡^¥ÿ$Ùäò;‡ï[@ä’ô/‡ï[@ä’ô/‡ï @h.€8ðà~ñÒ²øß È™@’JIÉ™@’JIÉ™@’¾xoüÖ⦦¦¦¦¦^=@KßE0À€Ì…à ‚0AÀA9!à+—ÊåÓ:Ý­–åt…>}¥,L@@ùþ…†ñîîݹúay üwNØ i¢mðfÿM…€<#£Áü ü§›»¢sIRþ¥×„<ðá6xR>ñߊÜ5=tOV˜Cü·.€ä·Úîrÿe!¸k:1a|ÿ7~;ìBý&ˆÿËœt\?¦Ú|ºÃKH¼/›t\?fÚ|ºÃKH¼—“îÀrþ®6ßÚ{0Íwx›jó¥õ¡Qh•œjó­}¸·ÎÒÀËTèSm¾µO÷  k ¶A@ ˈ}¸WÝì¹ÜÿH›ÿâ1$^ëP[6Õ;0Ôä ”Øý3C h¨6ÕÀPc L-_ D «\ D‰«\ D ëý…"hr"ªoßþð弄b HŒÕln ˲Eo&°æûÜÖNäŒt9wøP’Ü‹¿¸ý@NHä „l9‰q ÈÉòˆœ;¨ŠØGȿʙ@äÜàÝwEÎ êœ,ÈAù0òrÄúƒ€ýÉÿ™?æs¤øü–º€üû0ýÛòiû? Zéàc³µ€ Ü”$"¸Gå`fô¤ˆCp=Bh( ôunsè8Û8.r0ßbS@r6Aäsè¡OÉm½þÊi‘ƒzré!`ý0÷SA6ôÊ+ÜPä3(|/9(‡SG‚}xÉÊ'øŸYÀèÙ›KæáÊ%¿$ªÁõ’‡_’Ê­Üþéù/ÄWŸµÑ_8d€Dnw°÷Êí®öþC¹Ý áÿèÑþhhhhhhx14x õ=³gd<`/¶¾[ÞÊË‘¹šY˜.?§;À^„ÿ¿r©X>Rß3 @QÎÔ÷ Šr¤¾g€âý™[Àÿú_Ùúam ëÀ?쀰xçálÛÿÀ\´ÅË®a3a(FŠ5Wþ„‹w,hY¾` ®§\°…Gº:w‡\¯8„g½œ÷Wlá‘ÚGýõ7À|(†ìµÍÿxOìkz0ýÿÔlIóÁ°ñ0brØûgfOð?ø6ûr`†»fÇÂËÐþkˇ½åKóÁhRü ýLÿ¹4üG`¶×Ãà ¹4üG`Ÿ¶răãþÒ|ð¡}XÛ{ÿ‡æ¶4ÍÜþæ¯àÚ$wb_wû?Ô€Aô?íÿ$€8Øÿ¡åoü§ Œý0ñONÿë‚x)nÑRÂlÀøîÃ1àüŸ¯ú]û§@<¦KøÌ3'CÎ@òtbªÂŠBœ€äÅT ðÖ`zê8w*Øø ë0EvAfPhŽ ë€I€„X0Mh¼"Þþ¯¼õ;xGÐùÙüî-n€ïÁ˜5¸30õ?ˆ ÈÑýËLs(mÔ}û]ÿ ne"‡Í¨YˆÿÅ€Ëe'>f þÏÈe'>f þÏÈ5 Ø—C"UÔôOÌO)™‡¡\¹½dL¯W@n¯$å+ЀðÑ>7 4 4 4 4 4 ¼ ð»õ`ï;ñÀ*Ðz¬Ÿ¸÷x <'çÞwâ`wŽÎÁõ–@ù1ôUˆÔƒ½ïÄnª¹ò-¹¸&Ç®çÞwâ€~N€Þ‰q^+@&ø—9ádCø(U€x€ þeN8Ù>– ¾¤M6„å,_ð¯ú§‰åþ‚i• á‡× þ¥eVBž‡÷üK˨%*5˜»`>Ô< ç1¿׋ÁTÙòDÀ!"þýJ,3ã… € ]J¬¢å+ú%ÿ¡@À ˆ\ѯxq³‚¢×+ú%ÿ¡8¼ž÷WôKþCìÃÌ ¬õ“ÖÓÂ2–pë¯K8Èõ¿×€%äúßkÀ,_4`ûßkÀŽrýï5` G¹þ÷°€#€\ÿ{ Ÿ:`àoàò/‚ÿmÿ; È&ƒâTûx¦M|€ß*¾þð"ÿ‘×Þ˱#¬ÜøBåLϼõ^ÿî ¡yäd—âÿ‰—ÿ…»>`ŠüÝKïÿ¿ëåØà5ùVåØå€øÿ¾—ÿ…»>Çë£K®ýŸsàÀà”€-dÎ,«WW¯nßg¬„æÀ‡«ÛBÄ…Ø·–ì(L=„Äcy4ùô$€•s# +<Üõ§ì(M=œœy:íõ‘€“ƒrrõ Ö'þ@ d ÙD*@e¬-þÇ Vý à¨4K•Üÿ2Ë8V|èå$(WHÛEØëIP® ¶‹°r”c@›ìÏzÿïò.òdú›Ó'€€_$VÎ ¹›SNÀÊY!wsÊ øC9+Ôðÿà5Ù¾hhhhhhx4à’JÊ&8 0W·Ñ(èM¸~ZmnåDt@@à¡\R>ÁI†rfÕ¢’åÜ÷šH<”s_m: ðPN@N$ȹ¸f oâÿ Üq¸"d€»Üq¸"¾×=°:î5Ø‘å˲àpDÊe1a ìƒH¹ì ÛÃ}yÙ[¥Ã@:Øñ?pcÙ`w—‰’E,ÐÊ~ ÷‘ÿáƒbWö½$ø/L¶(pe?2lí¿Áõ,_[ÞGü‡}ù”+ûÞ§u˜öáD®­GïÓ:Mût çý•ý@ïÓ:Lûp 'Vô˘xqøÆáï`ùf4—ië`ùf4@BI=,ÿì`Ö¶~‹ÿ™ Ѐl./–ÿaV€@ØÿÁÊ-ÿìŒ÷°ü³ÍåérÅâÿD4$“Q…<˜ çWhÈÆÆz9ÜÏ#Ài—†êòx9Dx9³;pNW>‡87d°½¬Ovð]/Gü?rEJ€@xfw@/çG4€•›³Ü€:¬ Ç­ÏÏÞR@’lã¸_¶ïãìÈ)'œç„Ù"¯çˆ¨¥ÄÀÉ•Ã0 vÄj¯WöQLx¹#ªNE!ýõžH‹ ½'ÂlaZEú?’¢øàwØ Àm€ŠÑ€þUNŽ ý¡Ï®ÝÖB˜ü- a¾ þ^.†y+C¿ þ^.†y+C¿ þ^.†yþ-^ þâü¯1ýËGåbðäR! P¹ü¹THT.ÿ@.jöÿa…ÓÚØ4Ð4Ð4Ð4Ð4Ð40ЀÀ»t\ÅÎÕºp½€~x*V•p òÀÇð€‡°ùÐÖÀØÈ¼Ë%=?Ù-*iª˜þÝÊa-LÂsáòÊôïV.9Ë£ë‘ôéß­ÖÂ8ž[Kc8.yÌvÝeÁB“æ=0ôo†.RËá=Ø€É~ ú}° "—Ë´‰“ý@øÿ`DÊY>Ùî˜+Ÿr²œ¹?åd?¸ `NÎû“ý@ø÷`DÞÿ½>úˆì¢ß3 K'þGד`†·±õÄÿèz2øËywât=gÿu –Ö+þç0Àá¿7§Äÿèz2Î>]¯øŸÃ€yë†÷'þGדèíÃZ‚`ât=øŸ~÷×ðþÒýhù¨ Ôål¿t?Z~*5@¹°ûÑò}¨ Ô€/_º_UjÀËÙýhùTjÀË¥ûU¡üýÙýhù¨ ÔåtÙd÷£å»PA¨Œ&ç°ã="ÿï rñˆåÎ@äâË€ÈÅ –;‘‹@,w"/Gª¿[èÇÎ’Kb æÿϱ €„€ù€'?ØE ~üGÀà#€«Û𠈇äà‰À ƒ¯‚§f¤7„œ¾ÿ+äø]]¦ƒ ÊéûYàqñà Œÿ"§ïÿqdø5ù6œ¦À›RNßu#‡N£à=)§«†ºq*Ðú¡UÖ`K$±@•‹@2Å8}uÝPäœâCœ©ù­^ªàCœ”²5‹܇89(a1Âë=hŸß•Ôü<€÷เ½/.Äþ^/à_ïËMÄþÊøïvûÔ4Ð4Ð4Ð4Ð4Ð4ð‚iÀ²îB䪬XaÒL</`Ò¿åå»ÉÝÀòr®ç¹S·ïaùÖ¢ÆdÕY9/`¿Y9ñ`’Ÿåå²6Víj\JïO‚›éü2$\S¾#›ÐødH*$›ÐødH*G =@„ÿáHr@¨Üò?±ìõ–ÿáˆ5 ôþ‡ ÖÀ¡¡È—–ÿ¡ b ¸â-ìÜe"Q8Á ^NŠ$‘ƒ˜{9wÁH䀟A·Üå"‘ƒ8éåøï‘}¸ëŸ»ž»\ô×s»?¤ü3HúGؾ €?ÿùs2ð €[€DþÃ꿽 çáè¥À¾xd‰ÄàäÍú‡  œ©JáBÂÝ"7F’PÎTªŒ¸ð!Ȥðz$þ§|u@ðÿ·ß‚ŠåÐåœC ’A"¹4|R8}ˆÜÿ“rNŒüð–W>¿=¿«L°âåøœ˜ÿÅå z‘)û%?z@$@$W#¼’ ’ƒ«^ÉÉÁð-ä\˜FûþÞ¸ ypcñöOåÁÅÛ?•7 êÝöGÓ@Ó@Ó@Ó@Ó@ÓÀ‹¤K¨fvÞ"ÿAp¬•oŽÈ ; ®µ×_‘¯ŽÈ¯ŒÈ7Fä°|fêgæ´{ÃýAð?ò’Å+H‚?§Ýî‚ÿüÏ7NÄÚK÷Áÿ’MÍ{¹³{ÿ#$øŸF©^N»7-ŽÄÿ’"M6/ïåÎîMü/)ÚÑû@˜9íÞpü/)Òƒ$øb÷ÆÊZð?BÂÿÃm Ù~/ÈþÀ @Dæƒöc÷Gfdò?ú?Dæ¶»?2)³—Kñˆ_˜ÓãCʧ"èÿ™ÿÍ&a•ss8Z‡Cïð54uŠœŠ ÿCdþgû±û#ïÏÍáh½ÿq=p?oý%ãÄÿ!âgdìK|÷žíÔT;@¨<@TPAì¡ ðQ 0>P¶üKª¨ v€p÷_U 0D>{ýÕCôS¹ÜC5ÀùTNw12©¨ ÖCÌúæ& Ä››dÀl/g@4K2 3 –Ã9?3 –# SA±!œ!þé@€³Wo}~ësæ`Š;$øü¾8{ Y\@ÁÿöpŸBËøN,ü¨þ3o~XK>’+”3†ÈàAÂ:pÊ8Gù‡0û›9Šð3 )øï8åßÂìo¾ÝØ@ª‚Ѐäå`öG&~’H¡_œ¦œÏæ!t0âðÿ;¶_‘o¼Qu 0KV¾$ßį9hJÝÀjnN üg܉/•[ÎÉdC¹Eáœì6”;®°#„ý'ŽúÑû㳡Õá¡M8?”£:ÄËé†Ëò%€ú?0ÀËé¥M¹d@Pÿò!^Äs…rÉ þŒðr ª Þ_2 ¨ÿù/GÏ€øè#É€ þäCœœjz€h8ï"jz€x'ï"rq¡ˆw‚ð[äâB ÁXð> "z€hÆ‚÷¹8€ÐDC@0 m€ÈÅ„ ‚±à}@D. ôñN‘ìË’Y÷`zÉ$†7K•èˆ,IA² Àl9©%î‹LèPŒiÈÅM?ŽðaùØ€…Ø`p=7X¦ ó0pßw0<€ÿ¯Ò΋HxV$ 9€UB~ ûé Û¿¸ô,‚Yàïº-&ȇwÈSà­@A’ïž ä8 gò¿ÈÃ` à¨%?ƬŽÂ¢ý<–KH€Û0#—· `F.!v@ºüË/›ÊÓ°+7íàþH˜•»û# `Vîî$€YycÚB¨i i i i i iàÔ@D¼€í5Þ£ÑkŽÍ$r•Q EXs`‘oÒúË]´q;9–ì"‡ï3Mÿ ¹úæçÀ{"Ç6çùʃ(Ð]…¯ÈáMÓ¿DNŽ%¿Èá›MÓ¿N¼'røFÓô/Q “«ÍU¢õ×nµE l忢Ä<àx®ïLÆk4ˆèÇìHÌì¶w—É ÐxQù#‰yÀ±·e&ƒ@ã{ÿeÀ_‰yÀAüËdh|€¿Ä<à`ð5“A ñv“r)im5ñ/“A ñA’:lG¼‹ã8\ß™ ×h­ß\b¤~HôÆ;?cóP¢þÅÄ&´. Ê™‡õ/ 6 ¤uQÈ<”¨q±I ­ ˆâ7óÐ'>º¨ ˆ2@æ¡Dý‹ˆMi]@Ÿš‡>ñD€Ð@]@,þ{(Qÿâb“@ZÅ—æ¡DýïJ‡&´. ¡•.æ4i%š©o«;÷ 9¸MˆpHè=„Èu “ É:@úŽ´tršâòYÍ«ÿ¿Šgcpÿedø”](——ÑÉaŠK„ÀYÿ‘`Tþu ‘Ö€!² þ‰ë¿=zŠ 9û¹%á1ãp„ð­§‹w§3 D€å¼œ.DÜ=îCBXÀË·7¶ûŸGþVÀË1~0@Ù;|>ñ[y/‡Ã?æÆÿŸá(@úWöÖ¤ €$þ÷Ÿýµ¶5àÖ†’÷Oùì;8ÀxDHª›”: |–•˶s2ç³rÙ`NàRV.ÛÌ… }^~‰‚5úFÄþC½?ä¼]N.÷‡œ·ËÉåþóv9yc’ç¼ýÙ4Ð4Ð4Ð4Ð4Ð4ðh \{b¡ÉDï4Ï<ìG*/;"¹‡ýØ™>'÷†u&_×#ºÞÃ~ãQN$÷°¿7@FrûGi‘ÜÃ~ õÜý{Øï?AuæüËL  ÖÇr¢_XbA„ˆ:3Ê—èPPŒm>Èu‚»K¯0)dD€@n·&$úT d$ñC¡¯ª r壥ÜÜ€ø0€Š B„,€r3D¿ˆã í7èÿpÑïÝF ĺ€ˆÌú?ì8¡@¬ ˆ(À< ÿÃ#ç"ˆu˜ô¿OXQ€y@ÿ‡‰ß[Žˆu˜ >„ñÐëÕ B\@Dæýî;¡@¬ ˆ(À<à°ž;¡@¬ HÂŽ>Ŧ:˜Çœ³BÚCÌÛÑäˆ;ø  ‚Éäð)>i_Ïä€ €;.Ìäð)>äå€ù>„ûtòç¶€ t@€’%æ_©ùÆmHÌ)pŸÔ€‰8<þ瘳¿ Áÿ H¸§¾þ–6üP@ðòoîãøV@ðr?|©#€òh½Üw¿ì¢{AXüO€%¿òÖ[`ìûÝ[}Ò8–ðHiñYüÜäÀ 0n‰AìØà8$àg2ÀrMøÈ|v>/W"õ‘9)/W"ô“îZ"ƒqn{…U ˜<àýñIî–•ãþËݲrÜr¹[VÞ€`‘ÓšØ4Ð4Ð4Ð4Ð4Ð4k ½>”Lc1ÈatÄQ. àÎÃâ<þÀÿ—_–¢'ß„Ä&þ1•œ±ù/’Ãï_7ÙãV‹kò/’_‚Ä%ü3€ÿ¯¼"ÿ"ù*< Vñ–⮓‘ü < ®à-Õ§OË¿H¾ˆ ü£¥øøqùÉAL/Á4nH±Çáÿ 6m J aàÿ€Dÿ˹„ƒHˆ0ðpm Jð&" üò/Ñÿ–! A ÂÀÿ€Ñÿràz  aÄûNù’ÿ_(²" üòè9 — þëÖ¼J O­?tE,®æá|~1æüC¸ˆ\°ò øü0bÌì!FÉÜʱŀy%0+Ag­Z9 ´yù˜×‚;iå'ñùaä`–‚yÙ°rd4v @Ÿp-ã'ЄþB Èðô/[þ‘ pÊ€òÿ| ©GØmä%t1 6„X\äWð¶ù‡.Ä ‹|ÿ`èb@lB TNTއ¾‹‚ Æ<ÄY°¸âùŒýÁ/¿§rØýqð‹Ë?]ô Ðm%Ÿ¿þrÀ_³lªß}uÌlE6á—+ó¥¹w?ñrøç[ùÚ|É,~÷ò ^~a~~îhúòAPÙë7æ§æ.þ¿—Sª÷ƒäsˆör`V~e¾>×ø¶ÏlIÿˆ¨íÓ‚œ@?€É^É•5›…  ,×€²\CÊr ØÝEb’]>éþÿЬá*¬„\Êr¹E.÷¯ÈÐ^MMMMMM/žðâõy©Åb.p_ô‡?>9ÁÛ†_“Xë?=4 ‘[ë?=4 ‘[ë¿DÃçäÖú¯Ùî2×[ë¿DËçäÖú߇$÷·Ö‰–Ï]o­ÿênà†‚€Dõ~¡;?G£ä{,—: Þ—JËð¯ßH"€_Òo´ž™„ñÓl©ßQY"Çê†òó#òS#r8TË_‹hé·#Ø6V•ë@5yv‹UC|}@øÃZóŠ!₯rþ†Ü¹A@ŽqÁW9Cî¢=lزÀÏè#hé'ûËÞ ·å‚€ ±ràÖ¡\BP!Ö@Ü:”K*Ô¦ÿ¦¦¦¦¦¦¦MxÑz¼µ7Ö@/GºÃH#Œr§ñÇè¿ʹs¿×[ë{–ø7ä²Á°5A ú!yLÜMdˆ|oäSéŒ1¹g ”'ˆ9>üÍ÷ì/ÂmÙ€ïP6áÓmø¸ãžýE¸-ðÚt‘”sÇ=û‹p[6à;”˜ƒmø,)Ów¦ÖÝÝ‹L€îHˆò½Ý†ÀnùG&@w$Ä?VIÙ›) ;âŸ|ßðf·¯šššššš~ìhÀª‡‘Ÿ¬X_J —_¹“Fäc—K¡G(a=ç›7iØÀ£Ê®Þ÷D¯¢òúá6®Õü»Ð€¸WäÈïâæ?þ{(Sjg]ê/}f×;†èÇß­…MMMMM?r <Ÿ=”XREª[4ÖlÙ–Ëc-EWŽU€À¹‹‹ÆW¶},À­°’“´þÖ3öÙ âïb Ð@+.@èº|ìr~¤òÔH×M§™þîfá—ñ_Ò¯G”/X»g{šeoj$OeüŽáûnÏžá?$­-À_ä—t (?ÈQÙÇçÙ*ø‰Kÿ!ÕõC÷惌yã2Äåj Âì§àÌòŒO¨—ï„ûŽïT>PÿÈ c×—äÁ0+bó’ز\Tm˜•Å==¾€l¬Ê‚oÃvZÓÀ‹ … "ß„èæsÎ?ÀþKç{ü?  ¸0Ð|cA]êëzî¬ô €ào…Ÿà1VÁòvgÝÜÉ‘áÞ¯d–þí_–þmé_þÍ®áI¶Àÿ'ŒyBÀÚïËêèºß¿ÿþû¯&qÝæeü,`A„È܃@‡ ä:| ¸™ØOøÝÖ~ и¼|ôm8¬ƒÂÿŸý,S½n> Vf3xáqTùóÖ©\,@ÝÏ\‰Pøœ41ð¦(ŒT´·×‡/T@z:Ä| xÆÜ­"ˆ›k£|W~èŸÕõØPAÖkG,?{yÚÅ{¨†­ž‡ðoêUë?†îùÈü  @Œ—P;cüêQ5¬aôT8x xÂÍÏ¢ 0åU£ôOA Ó±3"y˜/¨Þ<þÇý#iôZt¯ŸE¯_:IÒþž°u©ß?­ÁàùDݸaei. åYúïq ÈÝdäúXœT/5L¿˜^ý¿„åDw°šždçNC@ˆ‡NÜ©=ÂûÜ@àÍÇóND¤×º @±~öd/Ç>Ý~à7¿Qü7ÐD‘ˆÿïï?)@û~œÛw1§ï÷KðÀÞæå½ËàWùU…øª[þÊÝ2 ¾¶Y #ø tz£Û¸áà òŽ«©a'”)hÿ@ÿx:ßÛçðı¿7Àÿ¨ÝåÏýi†zm<ò?ãúˆNtq7U ´Ô%ø~@;îu7nðg¶±iéIuùØÕ¬r\ÃðÓ{E7SÇTžê  B•®1È¢ôq®–Ÿ¿Ü΢îôò=º˜›nOb]rð/®^ˆUë?D÷ÃÑ|Dô_t(ñ¾.5a„]ùµN@Œ`ôžgLè7nÞ<Jÿ˜¼4èç±3BùñÉ|ˆ”Í¿-Øÿ¥ù"µovô×线—û/-ý‚,€pÐ;®ª÷‘Ó¼n–{#{:|"y†=ÿ°€ô :¢<¹<™;¼î6–7:0à:…vþÈp™S’ ŠXX®¤Jþú˜Þ¾t%°¢·GrgÝÂ× ÀANNè ±¤OñÙò£:˜mÀkîg˽uxãHÿø>•Gý„±ëËrŽôáÜ!~¦Üýàírû¹ñ?Bþ«y lwüê¨]®Cºb\HÕÙþnhx4Ç_å[ Àn?¹ùgéüÇ««_<¿D|£òà±aVqä²-1×B¿t¸ô‰Ë*–`0¿ññÇØÊKËb*]ÖÍH”ê§S¤—ÀáÒop‘}GèI´¤ˆI…¨Äÿï< ö}gÞgz³&Û‚ñŒŽçº¨ÛÜÜìèP’cg9KX`ÈH.²BØâ*DËwΉx£œ *¡‘5!•e^Eub£'ð<£Bs$ÉÒ–‚4Pdù ëµ”<Ø„Óa¾ÀQdbiÞÀ_Ÿ{ú}éK'ñË_þò]zg8è P¿ÿ˜æÿe@x8H¡ƒáˇôßaRÀ`„Qž\žj¨ÛøWXÿÿµw¥=±õÆ®/Ë{ ­bìÅJ‘ ¬~çÅ^ùïüòÍÊÖV/î#.°ÿÒ'1þÿdiéŠ]Ÿ„oлßxãã\Mƒ„ªÁTê'+ /O #1 ÐŽ4ÐqÂJœ„=źS‚YP!¼ú2¯kß—ÕFüò0³Ùô/'¼O€¡Ÿ€„÷ÿ P’ÿ 0”ËåÄö$ؾ”h_àIz½ƒE6t2”s  =Ê4$Šþ+ €!þp¹€`*^Ï ÷ ¸/ìŠþ䂳÷ pÀ=z”€ßç Àƒ7†Î~¡Y'F„!½0@èñ)á3&ÏnlæàÈùGä&zH†×;¹®à·ü”»^æ¢çFSVœ•2ÌWøïz™ˆ.Íõú%è>F˜ÁÂü_xEÀBßó…ÛPPA!•E ·! RŒž°¨1¼Ï èÎÜü )ÿäæ¹¼4èèÂõ~>äÇ7:5º‡\è¿øâ ü¥Y ¿>÷ô;)ñÿ·nýòÞàx·ÁÚÔï?&„A¼¾¼Á º@¼@îÞAû“2ê‰ x\yzÿÄÀù–ôw…ˆäYn\Ä ‚Ñ-2. IúyÙ4YyLôoˆþîê¿Ôu9™>VR~zB†(”à¤Ò-²åÌÆ| ü?uÞ! F,Ï̯#'Œ]_’cÙèn–T1J<,’.>27þcyfü''D-ÌÊܫÚl¢ûgôS+?÷ºjß5 4 üÈ5›ÛÛ›ùÕÝñõõÖó.X®úK?~gU¬ $pÎR¦Œnuyk*âÀ›V•»ôÉ•k7nóËD0õµOÀ XRÀ›^wÝ7|ð±÷DEƒ…® ;(J }JöÃÉÃz˜5¢{‚mƒÎáà)Þýå/íZŠÀ;@@<˜éë_ð5íûpÀÇYbÜ4{ó=3øçñ:4Ÿú‚Pl„ÀedþLi ­ÿøMÀ¯aÁžAÇ äXÆ/®ázgHâQ¼Ã'kôày«øƒÚP ®R§»ë×U8­|B¬é"Ý}ùÖ—Ö±½Æl“67iÓúuÒåÏéQfX¸O§˜»ñÞÖ½eø€§šßg sãÆÐÂÙ+pŒ ¨ÊãÛËÂ2Mô‘Ô0ô0×8¢àe-…üCy‚ÿ×÷r2]~BŒ]/• zn0åÅ P.Ã|€*Ð3CÞÑú™Ý'»|ˆ_N”X¸m…T Â ¤² ¬‰ó•€à"‚·ºOóÌDÂ!BÅÄh!~Bpžã¤l¥Å$¬¥ë9G®ÌâÒ©Q«L|vy)¨T>²È07®êÖèhÈ û£ë—–@|ñKï “8_LîJÅ&C˜ÓŽÖ`H?kíÍ}L]g Šäy€â 濱ë“û<Üa¿õø?C`оÛ˽\XÏä”AByΤt½%hà UAË’Ú7D°¼ ðLçån?¸ËÒ'766nôšÛ_|Áõ›!# Nß²âùàK0¼lÔ¡'*b66$ÁlÞ½[Ä÷¿°ººúÛ³ù3Ìöò†ÔŸ AO ÿß¿ýæ7 Ö@¬˜0øO2Ãð$˜S~ñËî –M?=ó¡ û¿$?¿þ;H‹@Å2_M¡³ÙÛ‡€XÿAÌf]Ð]†{dH<  ®ñ?ÊI€å4÷“ ˜(""õظ\#ÀHà#™Ž ¸€ÊÿO±ZGÞk¨ë¾üò-ébù”qtîn˜ÝËÙzdùs{â-`¨/¨š‹ïÐS¬mT~Šî€ÖÌHÀÉ;KÓ…%„k Â@jNN!‚粨C?È2vî§â“^ uCüñç?ÿù %¾ÀÇÌ ÊÁerFz½L¢«óî÷¿Wùïqd_AÀ×&¿ “ß8)?¯E׉æä+î Ö?Foæ.Þ‹¶t~ìnݺõ‹wà;¼Îýp·ù€=A³Âò³ã›ä¥mYÖC!çÐ!„ê><›ExäúH<4p€ùîà Þl¡|кÖé)ÊÐdŽ ˆ¬ Hz‹à)•‹ÁÝoæÖÌÇRÞ±‹Ÿ#°r2w¼—qµ^l_ƒ‰ô„h‰£õs·²GIùïoñ†wãÖ/ûì:+•gÇ_XÀð„¨üÌõ<]X6ú‡,ªb’ŠÈs÷òÀg åöõ]1Ü0#* ©`Fæ_¤yKg;ȾN(]ؾohøQj ' <Žéc߀ôN ëÖí¤ÃõU€ÿÿA,-­,ÑÇðrà€ÞYžn€#`xµhuéÆöö zyÝþbùøq"Û`lÞ½ÄÖѽññ7ßþ† F¨p¶ôñööÇFð¿^Ÿ›Þ{«c9°øgsïgšm,³þL‡NÏØðߖȬáxI€"X€Ãzüòæ”ÃîüyäƒpîÜùó¾v–Pæ¿þ»×ß'¦·æýIwZN»×_7{{æõWöº½W^ï&89dà÷¿i–OwÈÈ$€B„ €ô ãÿ÷ þ)t²â8@î-ãŸÐwàk…xëË{{–Øêôæä$¬ü2Ð)ÁÛN^‰X@ìh”x«üOÀº¤ˆzﱇ6ÀiUþnõ”0°ýÓ£»õ`µ¤žZ-üãߤ»Ç5†HZ€þàºÍã{JÒõ›¹rê”=aà?¢ºO HW Uyîê¡gn,Ìú51Ü!éoû·«CFãÿáõ¡ Àã—õë}={ˆžƒ²âp+8ÛËè%áò8i–Ca]€þÍùà! Ñ½Î É –V8˜×7ÃUτܟëçá=‚á° Bbx9ížé$ΙÝé Á#³6ð­Àoù¤ ‹0ÈßúSÎéÎNÝgŸ¥£þŸu_€t‹4À+à•½^Ÿ®µƒî}•Ó‰ëýá+í³Yü‡ïß[Ý|ßI÷çÝ-à?ûZô#ï䫯º3&Ý­¸û1g\ÙtÒÍ+¸!A@Ô tý<h` ºIP>j0œîËkDáo.Å‚•ë…Í„ žL1½< #ùðéKÅ‘†ý‚¾ÞÅ;ÏgwÐ’ðm/×¶' 0 Ü)™ Vá±½…Lñö·È$hüõ!Aüÿ@vàÈvo7Æ]EI`9Y–À2 ¥Ü  §†/\î„„ S±~ýíÓ4½°|DåMè Ч+ß–Ápò<Í'+, 3?UÄŒ=ì/OF—e¢SXÅЈ%Ýkÿ/Œ+·KÇ?wÂÂú§…;»1ÄÉ9¹æñ‰+8|BÚ7MM/˜<€7ÒT ¬fÚmL·ð»_^ÇAüY§ÛífŸ%l Ǫ L=–"€N  €é“¹0J—÷oÀ¥k7¶WocA`c{ðû‹Û`4G‘®u;à$þ'þ6‚ÿÃ~B ÂöªxoÞ•ë3,+XÃìTA‚¨ÓCÑåÊöƶdY‹¦ç¥Y2+@ÿp}·|Öïþ bEüÏ3Ø ¿Â[8†–ï6Mã+˜–ýÙ¤{)ºöp€q É ˜½C0<¸ÒÄÁ)„ü , ôO ”‹ÉŸxà³Ð^âû¯Èœu“C"äMFK4þ7“5é²°D= r¨íºÊ‰ÿ™Àîà^xÿþï$dA|ŠÞoõãb8dz§›.w{s†9l\6ó½}uàQåÏó©W *”ºa&ª.ô  úÇ7ÀýT¯ø"R¨%¬ÛÄÀoí‹© ðÊúº#&è©´Å]·¿¿¯àðêòœ4ÁÿX/7àƒWðt!øáŠnw€H刈YXŽÜàúÑòC`:r½®ÈPlÔ?7žÊb™KõšâI؃æ¿þ /ÍaÙ@ÿæb?GË´êÐ} q  !ˆ_ òÉHr_BÌh¨­ i¾û3ð9Ôm/³öñÃnvø˜!$þgq.¤Q¿ˆEí>€æu8ðA¦˜˜C!þ{{Ó BWƒ*èÛç ‘’¸yoˆ“A €ÿo‚–Í_ÏnâŸ@Rñÿ0“«ÁnÓô1•K6°]2üš¸:92(y÷ç€ÊÏ÷Ýc¤_b ¢ËÉùÀï}w>ÐF!œ¼ðWÚýt\t%½áñ ÊϘ8ðÖz|j^ǧäñ¤¦ÍÇDèà>Œ¦{¡ÿô„o¾ùÕðõÓÖ²ˆ™jp8? ¡—ãC:ú÷eD„§°y! BåîÉÎ Æ?‡¿ãö³ãŸõ èõÇw»•©rämѯÀI‡b“®Òåúb‰+˜]eåÞZí»¦¦¯Ðø.a`«t†$zGHx@l…³lÿð€þA,ÁXÞOÔÉ\¡uË,l×ïøixéÊ'«·éúO°XhܾqãÚÝ€+‰o>þnÿl €d#*Æ lÒõŸöB:ø_\ 2i ‰ÿñ¯Û¦øñÛ¾hÝê¬àX*wð{ædãè%q‚ûÂü¯ø?X_Ñ|Æ7¼ ó‡}*RXÎO`æx ¾ò´'é Âp‰5Á­%€+£#àGÀé W1ÿGAâà ÿjþƒÄÀþÅÀýh<ò k€;(_¿¾³׃eIø’ÀÕg¢Ü8=@÷Ö—H@+Ì|Ù½õÖÐEçow{,Ãè0ÁvIG”?ÏçÛzP@cTŽø^¨úz ‹÷Åò/ 1ËK„O?Å QüŽ¡ò)×o»á:Éÿ¯[+>b¾†d‡àX!`3üõ8rž?¸:BèbC Oa ý Ú¬ ÀAÀü €¡gä(½oߨ Àc–-J맺 ä¹U“Õé°xí{’PŒ{9€øÒÐ×ÿÐ\<àüEÕ!à<¦E÷Y€Œ=ÚÁÂóê "ä¿/!Yÿ[O¡)`w)þFü™0zíý}ð»@+ðÿíÛH àbÖ:ÁÿÈüÿ1ñwš„ øß¬; à`€ÿÁРc˜~ªpP@—´O—Ùœƒ"€µUs€Ö±¥X.IÑpr’žèŸ äìÖ€ú‚C Ë=Š—0ÿÄ_ Jqì*Þïh5Òjʼÿº2³½醘РÿååÓJ\F w ÀÙúG.$@? ìWìOª†_òþ´îK€‚p¬âçò8¡º'— DƒêFzÐ̽ñïô!üWC¿þx Ç—8@| àË/CìÊ*06¥3ÂÎ Ýn,ð(·yI¿„#û<ŽÈûë —ûr#¹ó°P€ÁOÂå ª}@%G«¤ïÇpÑ•/F þŠ âüC˜>-œšì?j#/AžI9öæRÀcÈsWøŸ½™9Å?cÀïtá‡ÿ 0<~ø»grr³ßy†`\Žç¾/¿ÓfVʇ€…tõAýÀ`ØúQÔÏjŠõ'DGýsã§&¦uP.bˆN®Œn“þ‚ûªÌþö²¾¤ðBI[6 0Ì›êñ? ؉G¶•ÔÊ%?¬ðIg0GO°®ÿµ]ÿ÷bég8í9-뢖ûçŸq¬ÿEp¬äfâðÈÌ\¢Ç:&þg|™EðdQ=‚xN­úû à#„j€ÿ%€ø?O öŸR†HyHü ÀNЖ˜ä®7³Ý½=pu»”Kû^éá 7ÀH?•S€ÿã÷“ÖF0+”ë<ÎÂpOȼˆ|@ ð ÍÛ* AãßBhô¦ $²c®½4 Ä$”}ñÅŸñþ^ú·q. à“ùòBÇíðOÌÁ=ƒlOÀýåý#o¨ˆÀ“+86yBO¹&j‰¾|<œ¼Áu‰ƒ\ûHÿÄÀ€?`@"à݇Bô¤ Ÿ‹8á"пÕny_â„mØ·øæŒ×vôìÏ ç0ÀüÆ#|$ì‡STË¡«Šîsã½µyW{6ñ{8þmý©_W@?þeìjú'¡I¨œÐ' 7häƒË£¦µ—8Á”¶É.|Ú—MM?N ôÀ6^n3à>„oïîF.ê’þŸîq4t¿óÎö;ÝVà1s”âþ/|@†Àz€àå€AXrÙÿHà&XŒ¼mŒšÿ9 b¥óÁÇ@ýû0HBÍþG×gÒÒàìY!Œ¹7t€¼BðËNC7 æ5`f¤ ݬ".!­!Q „%YB–%ÏR“¡Åû_fpxù‡übù—Ê ó8üÇHè?}CÊß8cU€=¾%ð/² Üçæ ˜$Ÿû0)€Ï¨¯3}1ËòÙç´]ë@¿ì„¤€½½ÂÀþâA_Ù%œ& „ã?ÆÎtzúôi,PùÖ¯À ^î7À üG ðSSö ` ðQoæ(*O*×½ô'ó—^bpŽxiªr®‘‡ò—^âªH¾i+üôß*ß åž ŠÄCà?ñ ÐõƒPf Äß„ƒ WЧ€ô1|ÿ>ñýpýƘúõ+BП!:)`®ì±€Ø *· ¾äj t[?›#?6 OA ň«¯¡nW®ÑO[Bæøt ß ïžìþ”“£ôÇ’Ó÷Ç–ßì”Ë¿Iƒÿ.ÿÛû£¦8ù¦¯åëWTÞw0º@ô9ÐúðmA‰Ã”MPñt$aéô«¯aQ8h€¯ Ï4üaP>ä ÿÃ꘯\pÝŵö“ªÒ@Ð=~ãÏP›|UÎfÇà‚űJLÅÁú]J@Õ¤,1#±„ð~€Ù.r†ýì` ‘‘x½½» ¿ÁÇ^Ná=ö@ÐúqeñƒúEí¶D΂ÿñËn„üÿÿÃmM/8ôAôø¬ën@,5`®‡øæ/]ïÃÃ_É:¼ÞÌ–§wî ¹LKýqúþ âe°B§%>4ÐÓ< o‡ýý½½}.âõï_xÒà•W„ ˜‡ÑëLøLøGÂÀ2Wp==ú«…~`‘˜]öÀ/“=Aˆ€w03¼\þáÎ!‡®Ì?„‘œCˆ1`¨æfŒÇÂá#r ÈñÜ(¾Œö±ü`}ÇâLlý X¿a~Y/7sЉ׮­‡ùgzß¡xÂPðý"ô2*Oè×ÍP}a›#ÀÂ~È #‘Êž‚ƒá$Aüöa¦#Sx\xF ¾à„^OýŠ˜ÌäBÐôH@üÜr‰‘ °H‘Àú;¿ùͿРÀïÿ^‘&%¨h×c|G ‚R‰,  þ20–ÐòùpÊS}þº)¸}_'þGÿ0@(&Ðü‡øšüòÙAȾÜ‚ÿIÿýê"ñÿ7¸žUïÇ”üH@5•q5jäèòGûfƒÜÚ'JƽXex«òU˜Œ‘ß%€ãîpü»úÏgRD<þåÎÔ¹‘ßcéÅõ[°~¶ &g¢r@qì¥ôp_AN0 Ú2o¨á;«}Ó4Ð4ð£Ö€Dk»}òvK°á­ºïÿó¯nK¼B½øW àìÙ%$P _³ Lßwÿ×ÿR(ÓM€×P÷ömlpûm¦Aúⶸֻ—C÷à,(áõO€¹’9µ[ÇÌzws,¼­R‚÷ÄÿgÏvfzOöú‹{ÿ A‘#@ML¸€ÀÝHCP ’Î8'Nb"²­€ù -€¿†ù àj@K?ñõÎN‡õNà1&ÿÙ €ÉGû"€ö¸é`á(Êù¥Þ¦¹]ˆXcë$ Ó¿ˆ…âQž‡õ=l?ƀϠ§‚w` 8êH¢@`dw@ù+ì2ŒøÈé1XÀÃÅ3€oð€^8ª\*òÒK³?íÃF?;@¨ú>(€ä±饥éä+ –þÓ´°õ&N‘Ÿéå²AãåÍeÈå§—÷ûû=(°Àá Ó8ÿˆÔ'ÿuÅ÷¯­Ú™YoŧÀ©S €œ#‘ €rÀç,€‰ À@<ÿÞÂ]íñ¿¡£y'u" 7ÐnH ­¯OÓ1{Oø| #€o…!ÈÉQücÉIhùÝ£ˆl‰‹åÓ€“¬¬Ón¬õã'saA/tÀè{â€×F"޼0™ó+؇¸MÊG–£ðsÄ&ÄLmGüŠ]bû¯>åÁí ðƒI÷×—-ŸxzDØ y±ã{ÀÝŸ+TrÃð$r=ÐO,ü¤ø¿ê‘1àì° · d¨GYËËþ  èŒG™Ì|tA ƒP (¶y,]1ma‰ñhœÖOèAÔ,jà<€fx 4<:³7¡¿ þÿ).æõðåîzw“I’oAá>ð à^Qÿe‚Öë1%úëu}Žñ¶‹'s™9K Aënݺ^²°ìÏwe7¿ŸÁ£ÈŒÓ{\ß³* B@ñÿ+d/8?¼Jåõáÿ!³MpW® ÷pý çpz¿ €&ßÕÏçΡf¾}q € uQ@ª™ÂB‘3„ør:;¯ÇßhŠ`ð6쟢à ³€VÀìf X iE婟@”q0òwbÁðHy·A.Ìð?Nà°¶” ’B á>ÑûÉb1P. AŽ€‰]©"’ïÂ÷×süï?jRž€VIAPzüX¿$°@üÝßý݇¿q.–|q¡Cð "Ÿk ù¢'ôo!¸,$o»~cå3 QȳÙ?üÃÁg`ÄüŽò™¨!Žì_å`Ûîq,|øxn0Lÿ° üáÐ  OÿýêWÀÿð ?,Q£¤&R¾l›é`OßsŽ®„È,œ|ON‘ÿ9„/Vz½Æã_äÄþ înÇ¿þÐ\:þål Œ  á|v¼ÎM0œœÕþìÔ7ÐÜS×z¥˜áÛª}Ó4Ð4ðhÀx¡NgÈ‚ƒåKDPk ñ:Rh˜ 7ª ØVú8=» Ôk⇴‰#B¡ ²{ûí·oÓ.a:àÿÜ@âi¹3òÌnnаºØd|•Ó ’5vqrøkOð§gùŽŽúÖâÿåîøÖÎñîM®ä6ö¢kZÝÐæP¡Dýÿ‘€*[}‡[X1@>ZæŸâ ™÷<€ÒÔ)À^Ìy_xaÄž/ï îþØ{k“Ó§Ùó}Ó4÷òk‘û4€6×8’ Øë8Rµ&ËKr9|…„6s{(ÀÒõË4’€!‘þýßYþÀ>pý§ #È>âÿHMã5G„ž,püòáˆrñúæ'òßÇO¬¢ð;„ð3òA ?¢@äwñ_øÏ,—²ÄÀê&Ž#xIàÿ2þ¦wF/·¹p 4°÷ f‰>—¹P*žf S`à|úé§7"@ñÿ)Ѻ ñ(À° 3à9ÖÿR`°üÖôr)[y`á ¯và?œÍ»¨| û°†JÐ=)Ë>ņøñS˜G™Àúø§róéMâÿÇ“c w †Ð®d3€yiâàþˆ^ε¾|)õ£a†Ñ£¼SŒÎúóSúîHĉ&žè¯6·®oÛó=Gáæ<ÌÌA øOöW݃„dˆÊÇý{À20¾ì¹áG–”*œºÖŸ€»·0Ýã›Á f§ÑVH^äõ§‹8 Âý^Ü}°ŸÈ0£e.¾I2/÷žl‚Ni¿ÿ=]ˆÿñ•Ùí£ ÔIAÇ?—èaùÒ…®~¨d í8{ŽÓG Õbÿ™tpÖ‡9’ÿÀÄŸ@`fýGJ>  ßÚø<$f 7¨?Éö† 'ÈÅ;=Œ0hGlün)gä·þãÕ¨FO$T£;|J\è¯ÿ"vW^^J  `Ý“"KÌ‚öE ^­=Ч L÷úW¼ÀðA [7’×A@xþÆ \H”FN8ÜA}äÄ-Z$0³`ë‡á…!fïoÐi¼¥—1ü¡]>_ÄÒxãøá¯ïšG€ÿ9†o‡º:v*)x?_»@,F!ÐÒ6e¸9¾Õ”¬£pþ4 éËï¶… Fhƒß›ã ß݇LX€ÿBØõ… {:b„rb$à%ffâÓ€Ÿ\a €“ãÑ'@6»€q ü<Û4qè+Ò/#ñ7|ûÁÐÄÍþúïÕ ½ÿåÇÀ?.d ÿmG`ôôß7@ÿß|ÃlBL„Ð?@Z>fže¤dùJCú();º@qt ù#>Û01û2Np’¹ÇëGG_ ŒÇ¿þÿ0ÿýð‡ püs©e•~F—N,Þ[à<ÃÈÉe&“3N>÷•WòÄhíƒÒwUû»i iàÅЀ#vùÒ' ð, ^ªºb,oUYKXùî|Eüs¢$€²æ  Á3)ÐuowôHð?n†7±®T——ß“Ð2}ƒo×`…yŽœdhþ¿õÛîÞ=± Ñ>aûn#4†¹îÍ739d­ðé§APÒ`+Wç h€½‹¸Èк#pàaÀ° ý™ra#yêËš#€¸ÏÙKì €’rk¿‡>J€.Éù'S?¹÷P%è&€Øþ(g4ŒË––vvèß#_K}óaZ¦Û²/ŸõE%-êˆøÆh-p ~Âúvc@i^z ÌçÄáü#"d)F9µ—‘ׯ?|éMÀÿìB ×1ûûÀéMÀÿÿZ[ÅÅ$ˆŒoY[‹ 7ß|“ ¿¦ÓXß¼–ô/‡ü¾|ù/è/w#Z0¿Çý~œ3ß¿.±¼…Qè€Þ…’€_p°¡Jz1R \᪀8ë) Ç_ÙåòQJô‡½•k²“NwµÁÝû£ð_0XÖpÃÖP83µ!˜“ÀÇA/ïø#@Ã?"·6 kg‘…5Ù60sÿÏn:€À(Nà¾~Æ@"/ÉEP½ŽâiëmÁaR‰Õæ©fòˆÕÈf:ê9 7Щ€]óK¡¬!Þ~ó+_}ËÀò³lT€‰àp‚«¿âï +%ðÀpÉœ¥vE°|Kô6~3;8¸v O!Pøà{%Àð0þçäÖ3ö‡/|„…ø”û§¯·æý¨|¾lúú)‹Šúy.:1ÐìÍžø)2·?Õé #àà¦_£âñË_¾û ?€dºÆÓå¦×èúÙ²õà¹/Ù”Nr#@Rð¡û¹Mð?çÇÐD1à¹^û÷CàÀð p'Ýýá¸Ha Fœ4y’€€]Bì -¾à í“müŽ&xѰ¸(ð§÷ˆùÿxðjqó ðü°í2¤¯âÔÚ=0@8ˆJ2z¯îõß¿ŽfïofzG/üR€Z*V"Ü!Ñt9¡'‚C€Xf€Ö‰½¾Ÿ:,ƒz„'¸„MLH^2ÆÝ$(‹ ¬€³\ÏïHÿ|Y­…'ÈÈ_Åòî 3³sçþGt=NÝš8,Á ÏŒ¾û÷m÷¸þÁ$á ˜£0táààU°Øpó·£ÿ„øÕ`üØò—·¥-øÇ^>„']CþÏ G¨âêL§ìÀ,ÕÖÑÉo"a8þ)Gý/‹ý_l5ñø‡ÿ`üƒ ˆ”ƒ¦wñFÝx£éãèE)>|½H‘ýŠó‹«=ŒäÔþlhx±4às`ÆÀ„Èý“ÿÓLúgP±@¨©gé奯¾<’süôêfi .Ô«%Sà $øÀ àöí·“Š“e'ÖÝH˜«®‡Àææ:Öó‰ €ßþöìYLäÝIip6º= l€Æ]0o±='zÂ9E*0$à!ˆ4+D 9\¼ù Ÿ£µç Ãr0ÒWÛ÷£ˆœ3A¡Ÿœïƒ˜òðúôé €þä²'øæ  åž 0×<àŽíånE÷˜¬­ÐœÕý+DN3sàþ‘ €õI /5¨LRÒðñÁ‰Á "Ar&ñk!b9— rs®_µ ˜€xé¥7ßü?“€1X‹‡ørÁÿKò»>@¡\ð† À¿üÀÏ0 à%šÿ- 4@,·ý,þÿ©q ‹]†hÒ§±_¡IP¥¡„ƒ>ñ{¼€ë×o‡ææ+`!6ˆˆ   @0äˆ"$HÙË@íNP„îºÀ yÜÓ: þô†`üƒ’üErs)Ή%Ü4\_Ó†ƒò-ºF@éz.P?ûÌÌœæ\8ƒžX×ú™+â b¹€Ñ]ý31t¹‡¦4O󸥇ŽàCÔ1P©= ö}BtùІ°|{{aÌ̹tá?º€ígr4¹“ó` ÈÄë`{h5»Å8`»ó9uLüÇ=è#„k‰åq¨ ŠøIR³§5¡ÌÌÊŠyŸgD1Â}òÝâXÔåëg;}PŪÁ”@ìÖOé›ÀcQ.ÉF«#*žþÿøá÷Àÿ'Í/Œc]‚mÌŽ–C¾p/>¡sr" ŠÌò’… ŸßÀ¯nMe >$”ïåBtsNÿsü(iA%]dìïݪMhƒ&ødèÙs Ðx‡0Áìⲃ8wn&壙pÓ#eLÐ ¥ûí H,B:ÕÂ?­}˜ ào¤€7£grºf¡Qv‡·*¬€ób`€1jïéðÃÃ;5Dޱ+2>qB@ÄRgà$¶B×ffUŒŒà‹6Âq wèAZƒ€  Þ_ô X–\v†7Ån”èeì·¥ûÍoþåß¼ ýùãôIXjLp…œØy‚5à-œ#¸n±&}þúAèñ{týx`À%X0?\HGÃçâE¤6ŒGt²M(¦À)B ‚8]9þH GÄøÃÀÿvˆ§@$ Æ¿~ÈÍŒ@I5Ë„ã?þƒñÏtœ½r¤—Ã'Xßhœ`½˜&‚ÉLPûŒïð¥Ô¾ihøkÀHÈI¦]Ë&G–Mîpä¡¡;UÀÑYd”/âE®.o‰“”È xSs´Ò!ð1vøæ›ä Z:é ànè¡Gü $ñ; àÿˆü¯°ÜÖ ž€ý¨´…©ÀÒÒË/õÕË/‹–~ÁåDk÷ ­‰øåm ‹_Äwá?dhcxn0»ƒha‚É `füƒqíô†â{4¼c^@†he¥ äÜÀ ‹¬yˆÿéŽëfÁÿ4}£ùŒÀ†Jž0בÉÿÀAðþd._ß°DàÓé¿‹‡<ø Š3‡  {ð=©ë|\Qò/.³;Ùâ%r=‰o¸~Í]50úŸÈ_ð¿2±‰9ˆüeˆ+ÿà € @²‘‹ÿí¯ìFé ¬ï=]nX€£ Á„ë¿OQ/ëU¯ Î`ý&º °çÆ0‰'ð~\€|Ñ?¢ü“êã=%H9”{„­šA„î¯6cQÆ* jh ò‡÷f“Šݣù• ±ÈÑ•häcÉ­ ‡åkR6„dË—G’€}ÌI`îa õÃNfBRDD¤bt­>€Ê/Ìü¨“…‹RÀŠÎ΋Q¾ž”& no«ïcH€°eû{KfùRÜõûÑǯ9LR@ÜN,‚sÀÀ‰¬kH»&rD™ð§o£äà_œ„x‚xøû4âÞÿ†hŽßô`+G@Ë< Ï X°€3­ÿ¸ ñ@Ûf;ºüÆ0n\¼6CùƒƒéÔ:Í ¡Fì=€Cƒ-ñÏ*xÿÌà|üC€º#dþ–üAjûêÕ3p©šnºùQŒþîñæ†Óÿ|¶* @<Œâæð÷²"ÁÄ­[hÒÞ|¶†T9d’Ñ'Ih«¼C”„ ÀÝâ-í4g΄€t€^)Ñur^ê”øü €^?¹é•°f S 'Á©"Pθ×ü¯BR? /û( ˜î‡¿Üÿ'ˆÆ‡ã³ßÅTH– ‘7ŽU³…” PKØ’ÐC@kÏAkóýÚpm €  Þ$UIçˆ`(ðgä,fÐû·%Lj?&œÇÞG˜¬^úçÛÓÉ Á{pê «8>zðÒ€¾ð¶[Î~w? é±oùƒÌøØï + Œ€þÓ8?¶|Œ œ…âÅi<º¬@8~p GI»éŽ Rè‡W~ü÷Ã?7þëõG÷1øÅ Ü‹ÃO0vú.®PLPx+‡hí%”»Mû®i iàG¦Kàå´vw+ ÿÏÌ ²²#º®ÌÀþð`€PU$_mœ4&¢†ô÷4 ÿüA€-Û,a?”ƒ½]ì  €K\àh~bŠÿ³ø"(C#0Ï¢ýÖ ïÀ]h_µÈ !––Î_Ä2àüEq‚XÂ&a 4¬ mìÀoßÝBÐ:7ŒÔ€† DTpafãÿøÏ7?3ðÁá´pd ïñ¿,z@å ¡s®#®äŒt3ð?Ž%xÀS‚@¸Åíÿ,5¸Dp}@ó 1fÜÖ¨Ú[a@YÌX»À޳(á$ä1ÙLvEÊAp}ζ_ 'Y˜Ø J(Àtº™4€ž€GLL vþê0LãÿÂ6ƒX¿Á̇ÿ‡ÊL ŸØ„"pœê•æÑK• È¯`Ô€y€3$\Ò?9À)ÇòÞa±9¶ˆÐõÑ„¡Îæøƒô›"WC}|€äéïOÀv F\»Æ†rv4brË0È@ˆå6øGâ>…þ/—Ï›® ØûÓÕ´"–:€ÉJý`!wõ/Ö 3#î§1”ÑsîkðyPêdpfû9ÀUO´D8#ª´õ·=cKgξ¡…Yv_±'*¾–Ø}A°tè60–Ø…Ù(`UJôºqs)è0Õþ˜€UºÒs¶Z1À mChñ?ë¤O5BàjŸOtÏ¡( »·Š‰^¦á K´ÿ‰+T>”1à;Mü,lÊ¿‘g^¢f#Ž:”.–øp‹þ¿øB'(òü…€xoÚÿgs¸Û ¢ØJð -¨÷•G¿ ç@¹ Û@c |‚IÈìE€ÙÚ9sõj´J´@Ÿ¨£uPˆ)*‰[“H1 ÙA•Dˆ¶tt´Ë0„A¬ë–Z/{ˆÊ(À^¸HÐú1À{Þy É» ú”_ñ³¯þº -WE²`?>½S@ õI@à…Â<tᛲQ €c¨€Ü®=AÜPFô¿Êrp0‘mBMÇöÐã?ç øñÿ‘xŸi8åˆH ®`Oàìsÿྭ¨9ÜEÎÁòIi%ù=c€l­ûñmŒ?`€?p@œ=ýÿä”g7?b!˜Âôω;·ºíG—>D劽2,ΧgàûáŸÿ2üÅÿ¿÷ËìW˜}ý]éQýy1Z#[(ô©£ûzÊN0:9sÓæ¤œ[ðþ¸‡%dÿ€†%´ÏMM/¢À à–öïÀµ¯_á`Ò†ëàrX:{–ñÑgW׆ –~ ¸üøÐl_õ×s“ï~fˆÿù¹ šwfHÐ~ÑãØU]rýèþ2Ÿ¼"SØ_€óؘðpÉmÀ6HbÆüÒD$F À,­x§6Ìßx³ÒG› ÿ‡(QÜýIp†ø ´Ûzè€ü+;å`Ó³” þGöAD÷ZÀ§A6‚ÿ±~µ÷Ç'F d®¸Í³™þ;~p«Éag.ÕAEŵcú%ï’¶ÒÜÿ?ùŽOåÎÀfñÏ@îô €wîå'^Þ ôPà¯@Þ¿Úÿ ð_Öo“É|’ ‘1é'ÿ×E½››xÀ°N%_ÂÞ'Œ Ðþ}r*÷<¹Ú"pyF'Q6ðšÞÖÐyH¼?ü¢ħNâòu™ÖºùôrüÉ!s†]‹6ä˜ •ò]O—‘Ï¿\>oŠõ¯/#Uá*V"á¥]ŒVõý@Œn!,> V™«æ4'îgÚ£J—쀂ÿ¤è¡@p{Qšwð ë¯ú‰gOAÓw\®Šý7šwKx‹$5¢ß—bv5vÑ‚ýO Ä9€øYsH˜¿[êËþ®¨C°‚}Ü4âÀš÷iaÏR?’£ BàœL:$ýÿôv©åVa7» Ò¾}œæ‰ÿ ÿ”IȈ§×«;[píëoâ¥\ kZ€L!?À4¸O9:¦ö Š Þý¡€ìpEÿ¯¼úŠÖ™t1Ê{ #•ÝAÐ v`p\Ž<€¨®OÞ@`à€rùßßÚ‰á?*C„##hu8|8\ @`}õŠcˆü-@Š‹ßñ´‰Ý ~À_À!PT€ @„ÿµ~È¡ÆTêDõ»ˆµ¾çW÷ִ€|ü‹€%¨ Kôh6[¿@,.|Ì—ä° uèA’ܬ9ˆAÃmeJ˜º!…ÁÝ&™ ÞŽ±µt¸dúuÎ…W!}d+e‚}Dêïm0A”ˆR’xŽÀ`b°{À ë‚À_‚` @H`ôŸà2áøáËH‰1}ýä¬OÁè}1àØBŒ>%ƒ!îâ~øçÇ¿ ¦ØÄk˜ñã?¨¿+=ª¿N{’!ÑÞxŒÒ|dÊR9^ˆÜE‰ø49§ýÙ4Ð4ðÂi`H¬IŽûäPè?F,­®¬€ÈÄýœ€±ß;«0Ñæ4-þöÛoÇ @@þ§õ)SEˆpþ’"´Ï2mþX–ÅÚÈtø+t þ 0°L`pî(!ð ¨—EvL,8èÂ~#C¾>H ·øé¿[ðA(€Áò™‰°°Ñ]¼>dÀ¿¼š•À•üoÁ)Bø€<óXáu"gýí+À€ypJ‡5²ìó Ž’ü…r ˆåâ\ëéæˆøïÒõ„b^'þ/—ˆ®ë_¯@é€hZ?ú«:^£×ÿ­œþúÃ)ô«MñÂ\Fþìì'WÈ=) ü+ ¿œNá’úõKü¬­+@Ÿûƒôj¼x 0_ç6)2¼,°ùVÆ…ÿx¿…oKÿ3Ž›ˆ€€€+¾@`…«,(…>Œö7´n$J„ï .¾Æ“÷+ûÿêß2ƒ à?DøŸ³¿$²å’½üШ‰Û[¹Ãâ‚Cû?¼ð?Z΃Ç»^4âÐqû"1 ö‘¯¿< aòâ) @ÌÉ# ÑŒð~ˆ‡h‡aüsø‹ùvË$€þZ@4þ%#Çn?xÓÙG'. id¾^¸¼ÄóICÿ€_Q훦¦K= b×wáäÏðå€%ر—V0dðŠ}‡fsºÑ"Ÿ ¦£Œš—ð6 €˜°oîNý1¬ÿX€%qoÄg=fhðįð8Û/ðžm íJ€È†-¦£„2àâÅs$¬ @¤Aú¿Êë_Ò÷¥ígì"¦wa߇Ž^âÀïyOÑÄ0ÑûGÞ,*×—L| ~n(‡fŒ 4€*µã9BÞÀ5ŸF‡å°[ÙGY¸@Ö@B ìTk®,›/¿ü’¨Œ¿–mø·_Ã0m=¸ò!Y€àoÍ€uoAn×çùëí}€ÿòðÒìO¤.ð^€—–¦Ñ6o"M Œÿæxˆå€ë·-†PNðkÈP?dN áQbýH’>w¨—øýÕãU¤ø_8rÞÔœ Ÿò )'ΈÕo@âý7”; §“2é_0|lNèËšE5ô€Ú×a¥÷¦ø€ÃC«9wäȱÄ;c¯ÏÊíõöðWÀj ø@Kå—:XŠ^.iàÜ´~ø„6‘׈tÏ~„ÚãÿÂ7†{ó¨È‹mMxDXŽ"ž@€ÿ±-•¬L ‰ôö®ú}ë„Ѳý QáL #î’÷*~þ²Â–hÀí@ŒÇ2Áaö”Õÿþ”â`XúDRp ÀÿS|F®Ï¹D·½záZ—Y¢£†IëG.LK8¹t'tVºŒ'«B‰&èû _žðÝyMä]oH˜Ø}„Œ\MŸf¹ÃDd‚”T¶éëõ%pçÄ_a@VU’ÃÆõﻇð_8Ä›á«A Cÿ7¯@€á¾Ã‡zV€‰ÃÃìAgÄÿºKÙÖΰ !Ž ?{¥#Ü®ÜPº>„¾ço|t¦J‡´9Ñú0HJŒÐQY38àj¯NËD¯ç•²ôJò„‰Íž^hAŒJ@Èà±ãÇ$=D.ký(G0Í2sÖ&# Ø›#@· Äøç›.Ѐ'ôÍÇg˜L@BÔ ,ê…ï¸Èï÷¡ûXA=Á%' ¬î1ÒF _ÿ\r8CAz9îFïÝëÞ¦ ’\’þú' 9;OôÃçWæW¿2Ûd‚ñÃg“7^ü⊵CÖÀ.¸á ù#}Kèï‡xð„^'Âdü›»we`Ù0ÿ}Ù—ŽÝ Ä~ð¦™`ìå9;DVjŸ×þnhx!4œö€‡ow:H"Ü2°Ô­¬® ` 89“€vÂöŸb ÿq·¿ˆIÿaþöç.Yà¬r¸ÀI%nÑ&€ómì  È=üOOyK$à€`¦JÈK4ý#àÜy9’@B ŽÕÝùÓ ÞQx÷Ê{éÓ o@¿F =x_.NÁ|Ï$EAÿ¶ð)qó0ð€ð o!Câ¾!þWˆäAäP±1Ü»¼5#Ïè…ÏÏôÖäç(iyóÑ¿-C$þÿ’ PüzË$îEHYàê§äéä·Èˆ åý6ÛÙë¥8›šn/½ô§›ÀÉáðÒKÓžøç7 ý3ùýˆÿq(ôÏæÿ£§ {âü¬p¡æQ¢~˜N)Ñâw1Ú`wdìƒÅÁ[R=þCˆ¹Ž®ƒðIðÙ'Ê hÿ ¢~ºH·¡ÜX §½šgGë[¹J*¦ØÕÐÚ™LŽ®íÕ®“ío+‡%&•˲‰æÊmù"~ÀjI+bQ\>ïÏ §OV¥Û}¸òUŽ%i° ­¿äZo:xa2KÀ=“Ûš džä8Šp3~“!"ê0$P?{­¾¿ZÖ?­ »â®?p‹›¬þߺ…Æ&r ò—$ì앎ÐøýŠ&#áÕ±ÔòK¾‰§Šn‚ÊÅ7HjÀ èFŠéô<Ýp •ç¿CÉ$Dc:]HPã û:Á$9›ûA‚Æf$píw€¦ ôoÈ~¢1cŒÀ’·‹zɡDAhBOp¹¢=Æ÷XÂÀ }\õ„åÇý'&nþ?鼨@ñ?þ“Daï†ô¬ÿ ¶‘Ÿ%? ,a>¿3ó³]2~3ü+dGx?ă …Éøï€ÿñä‘PþÍŸ€^Åð·¥GõïÞÇæ'Œõƒ7}úd‚áã—­œ¨³VûAq틦¦AY`eðv·À¿°àØ@Ê+KI"@à›9ïsQ‡K·—¾Xâ>€$ø,3)ñÿ7ßü3x€ÁþpisÐÖo‘›âÒÖøà €³~§øÿÀBTo˜7£<0ÄÿÄÀDÀ8„ˆ<–ÎÑðŽ]Π܀ð²Ð¬O`œp¨?øtÃóÿ“#`¨^ÜGt0ó_EØk\Ø‚þ¡E¾»£?T,¹ÿèø Íç/ß|³ù: ¼8ÿû?®_Þ@H¿½8@¦ï`c° .€±à 2»²z)~à¶@c@l€†ò-¦6°ëóŒ÷%F—Cð?€„ðrÁÿ`¼Ð_ûkñýå°¿²€úPð5NWŠŒ‰94U?Üî,é~èÓ9í›O?ý”@{@¬ã M2®_¿~ƒn!ˆ °»]†ãË0†ðSn Ý0#¹ ô›îÓGc´+@¥† Mçk–ŠœmÇ[F¡•§~ÙÄ÷‚®ˆ“ú¥…Ýý)÷sÅÀbXà³b[I=©ç(¼á‚Ô‰XÐ €Ãøö1DÖ§¸X?Ø×9©R1šœOÚánáö®Åœ*% ?¹.GÑëH»ˆÖÞÀÿBä\8+«}Ü£ã˜%5£dù‡xúÔO|\?BQ ¡‘Äàžñåf=~jsœ €‚íŸà_~Ð`ÐùvØÚ]2#@Âçµ7ƒý‚´ý.°€þÿ©~Xÿð*ê/É$ˆdÀ+.G+ùa@8Ð=o |Ô_­¯]~ |ÇŒgp‹Áœó—¤Êw³Wje@$2)àù)@2ªôã‹Ã1½ARÃ.@ npyô|üŠ¥‡RÀº¦Ð?Îöã€p ^4;!D•÷ðÜQ-a ‚Úçl¼à} à‡¿–ÕŸ…3=9°lŠîàéÈUŽõ¬Ö~¨ŽöMÓ@ÓÀ  PXÎqéìü/¬i™ îÇz(ž=3!°²b·Ñ‹nCü÷ÿÛ bΤ’3 ‡0ʤ“4ñ? ¾!˜€†³?hÅ‹iô5Æa÷°õÄ\`.ÓÊD`ùÍ€ÅFúx6 vÎÌp?þÓˆø(†çv?éëq%&†‰YéA?É€Ô‚¿’ñ ÷ïoÿ%:%‚ù Í‡ú®+l•3äÐ?®#ë®ïb~gß»´a!]ÿåº ÞÐâáo ?»òõ;ºÐcùœë匜”÷ ìbŸÜB 'ñYýèpJòчBÇ#³] §¯@‰¡HåâØ¯_J?×ov9¯~«úè6™Ô‹?Äý2ü`9¤ª÷´5Œ²ÀÂÝ ­|T?îN` è2?1S¹kŸ¾ìó¡Ó/7æ„wEØüÏ€0~óÀÇÁ NÖ@”Ñu³5ì4“têºX fx¢n7?x®þ¾{†õ·@¯NLÿ‚ÿ¥þø˜NÀÕû£_ºUyÌd°d ;}qöІ HèÏ@$ÙtHX~I @§Ð :t#wó£¿A:bÔáÆæÏÁå±€ç‡=?a2>Ù @BX‚„-õ$:+Âs§Ÿ¡Ø–PýÇï·žð¯ÈøŒE,yekUÜÇ„`˜Œnyfô  þ¹2å‡EH€#}¹’º@¦0þÃüÏÿéÐW`@ÿqnŒøÿ{þa¨\6:xû[§z©œ2&óÿI@qÀã—ž^Ž)Á#Ì›Y9Vn¡=Ú¾hhø±kÀp>VXΕf2÷× ±û»$üˆ@*ÀˆÀºÖ/yÌêà¸í°?2d6@Ö¥ö°,@쀀˜^s׫W)b„OqU­WA·Ü+ðzæ càuKiÈA„øUbèÉ,ÀJ@ÿcw`pqH(oüx\Q=N?¼Ñ ‘3ÜqxFX€p8I£òºƒ‰ÔOÈâ à_aҚȩÀþ5“5èëŸa€ü àZ2í*8t`ð÷gí2aý²ëóÞü¯M}) HÊ#€_”ð¿û/Ë£u—_€%Sψ~zõ:í{@à ÷Nnv¥¤ƒX‘Çú§.»Zæ?\ SÀƞ禙™rrlO¡¸„‰ÞÕuý±®´_Ÿ!ŽVþXõtï!=G5ʯœ@tiŽ(ןޭÿÝÇž¥'C‹ÅIöášj,½½lBmÓ"IÈöÏCþˆ¦@ur¼ @@V†øÙ(ü¯Õï4Pƒ:øIp‡*´!¸ò|ئØyÚ‡LmˆW<3àõOOæéô3x×a;ÝÇœá«OP®þ=àžo×%Ý#Úö#†­>¦×PäO©ÏÏò˜Ùòr´YqPO‘ àîÀw°'@€þFkÈd¨DãkpƒDÁÜÙF¾Ê"Ðaý‚á•ð+B¥@h W&ÇEÀ)£‰z ‡’>=jÏÔ`X"†z€AË×/BŒX£€?A_ ÉøßZ¹FØ4ˆþ™ç{dAý_þA?øq;>ÐÔ`ü˜•ÉÙWBþ#ë Ú ¶u`€\xà\Ö]X¸ô«§aýã_cï˜?¢DT+'ÃÏ?>™Ú§}Ùþnhx14àî¢ ÃUüþñ.kúÁû ö*Ì¿$Áÿîè½ðyþ|‚âíú‘›œBw™´F÷k”Ž3)þ”4Ðâð ŽA@ñz ZÏp› iÞ¤(׆j+õ¥"7•¿ÄÉ ?Ü¢ £ýËɉDôféÞüç."ÀQ ÅÂ0 )Dq"©ÎPì.vº^@®ˆðùˆXêî"8œÂü H*mÛ¦#"מáê?¤˜lŠä2â¨üŽ)ãëóÁ Kú-úOñ?%‰n_?ø¨dcÄ2!\ ~zJ?9ÉG«ÂÂåÁø£µ/Aøë!> &@œáF¥/Åóëò¬f¸âó—Ö?¨®n˜6mÿp~Lº?(@¦×aýÓ'89 ²‚Âí~×; àªéùo øQ—ïÞàL9Š<é~«âPžA ÃËCÀW. Gb7q4XK‰c¬${@ ‚éã!«7hÍ$ˆ·s#¤Ÿõ ;6Ýã €ÒÐtO`é{f0‚—Žû˜p½þ3WȺl8”2`™òþÀ0xµv‰€Áþ÷8÷ôŸýÆMA+˳‡½¦7På‡W8ûÚ?ÞÃëãñÓ0Ç¿9þ(þ™ñÏgF_d_Ó7£Î(¡©`^q`Þ7Wlû®i iàG­O„³eü~è:ÚÌíÑòj ð7)»C¶úóþï‚ú¹=lç—*X Èfvn™¤‡ûý\©wp€|M€oHDT¯·3< ]† 0°Á3 ¾Êµ=8éçn|¢ñâRœÔÁ€À9ÑÀ:¬«Q€Ó á|}ãe%¨GÁÏP¬ù±Ü¨BP€æ´€ä È£û§Ì^ÏØæ•¯U”à[¶ß¶ANϱz2í‹8¼ÿ¨œõé; ó€{¤^xøSù㞟)–RÄÑ‘œà˜ÓWP¬^Gاȫ×+¸¿…Ó`©êò±«ƒ!šÔ°Æ( «Æ9¢³ÓC¨‚ç O€Aý\ȃ¤ªõ«¾£†e¸q­P;xæ ¹ÓÄð*S~¼|Ç©~Ã…¤sb9Þ}(¹E:€¢…¨àÏ$H6T((À¯æmg= ¢èüaDzLéR®¶éèöí“VÇ30sµã°}‹÷A2{Q½k3¸{@¤HÞK¶Kôåͬ~îýeÀ9} W¢d£E[¨;z¿$³¯T*7?;}Èýô® ¿k\œ¥B4ÈÙmŲߞ°ïWß¿¶€äñ·+ˆàÁ ®þ¾1ˆ©üp~ìG—Þ\¦Ù°þ G¼ÎÐyÚRñc=]î†xO¡ç\ #@΃$&˜B ‚#ü $}…t …Pdæâdq¯'òëÔ_æùó› °è„båìY2|õí·:Ð?àåý vÒL‡[?DÃcøö“Aoç;úÃÙÅ>ª®7‚§ÈHñë[¹*;þÝðŒ·ºL§·pzãœ:qĺ/V.(£ª€¤+ÛŸMM/ˆú¥cz‰ËDËœc±¿LpX]r,»µ½Nbvrí§àbû?‚ÉW’?×É9}…ë×;“µ?K € „äzë€àMFrëLø]b±Ñpÿ‡T`ø)l‚èÀãûúèEz—P¬ø¿tî‰ñGZÄr_zæò |Í3ðŸÔP €¸z¹ò{ ¹AÒ@-COÐ#jÿ°ùqG•‡ãÞ¦ç+ÂùŠÜ]“Íð‡{Tä:°õ¡z=?>cEýD ê·½ÎHÿýüȰ\ÿ„ÊëRÿ|¸1–©¡} D ácöŒß<ºo}T¿x =R¿±êKS‡÷ðø?¹»<‡uõÄüO¦l_•‡¯!"ÿ@zF•€E.ìÁAð‘S'Da8e²ãK€ÿgø)¸t´À Oïko¯†¨Ô'ú©×OŽ,ȶOZd›§•òͳóÛÅÒ Hj;€××fð1yøË‹'ÀJéàë‚‚‹A¦3Õé^=òøDÓ«µ+† èÏP$l‹÷å«\(|÷x‡/xÛY€¶ Ö$וaù2(_{{0ý¹Ð"úñïTË÷o®øÿy±µõÃÃvÏ*œÆtøƒ^kЀ´ÿùx8ý«éBPPð½œå&¹$T€ÊåyüG?Jô” ‹ñðsðú¼^l§8ýûׇOZ™œÀüÓKE$rz è ÚE¥òýlÀçψx{mD?¼8€ûáaOÖñÓÍÉÛÍ?¿vö°åó>ÑúÔ_W­Já”`ñ’–ï§Ov™¾Ü¦dd]®Ô?¾µëXŒ×üZýã·ïPá+¤}nhxá4°àæcþV€@ONèÀ/ÿ¶ŸÝü/§¸é§ÿÌàþËÞÁ<¸…±»{Å‹ïág®ÞØ}ãßO…Sl¼´×&à^ öë¢ìÊk¡/Ư¯BÅb¿t5¨Ei ‚J)>·ëWÃ…åzazy®|[¤¾áÓòYBÒÿ§Ö/‘FeDðï/½"Óéýõ”èQý2òä‘÷9 SAYþäWú —ª×·a¨Ÿ¨B®úè'îÁ\ÿ„ÊëÒA–1>kæŒénבߥ⇀ ‘#Öoìò¸éþlWºš:pgÔV¿Ÿç2úEÿéÅÆO >üiïl!¶}J€ð½]o ž`zúÊõÅû{À—ê.÷?|£ú9qµVÜU?¹~+ó‹QâëÝÕéä>|¾FÊ ðzõ·ïïôþÃç;8Ãj%Sÿ@]ZÂ@Ƀú§%$ ¶Uï7AÄýà k`ë¯S@þý=",±½y¯ÿ´ü Îÿo¬Çä¾×üÓ¡HÑ=çª/h,‘;ÝáOñßYúÁ•Î`j±¢wp¸.¿ëëàë§@x’Ÿx²å‡@yÐ7>ã0h[<€ãÄŸ¤ûµªáÜnOHŸ¯ÑS¬þ å÷7ñµÔ!_€­¶r½îƒÇ7­ðö²c6z¾úǧ}jhxA50NÄK„döô Êð~Nè—¡îÕö:^_G½ÿQ¯O_KƒùUI—ÃA&ßœ‚½þSfG<¯ç¤€±ŒÈÛá¿:¤í¡Ý–)—È ¿ä¦'ã7jàðê`ð÷Åû2½¶û „5°5r} -bû éרðý6àYËûé ˜âùÇ>ó9y4|ì“©7è~+އçPžŽßp„ï0z}°¢‘§#.~¤þý³•k›ŽÀ~@؇ó±¸È«¢Ó4Ð4ðãÒÀBÀ«ÉO¥5bŒ{*%ý0 ¬è~ÕþÞÖr°Âx*5Å/o¶¥ÿØåOE‰­ 9]’ÉùyˤÒg3YëHµk7 4 <ŽîÞ½ËÓ¯=Î5Oá\ÇÑ=…¢ZMM? üÈ€˜:È®¡Šrê=Ó¿îzó: Ö¥!°xùÁ}ú#—‡âz=+U¢QÛ­‰}ìß¾¬^½òU®rî;÷;³ªMOñÅ+ÝRG÷Ô³âÄß kg¿yœdÛXÕmXz¢¿úí1cÎAI犲¯s?¶Š|ù¬" ò×*rî ‰Ü˜… cÿ/ȱyQŽ<œÆfƒÏŽ`ÄÞr¼EÒÎ{Q4`ÂãeŠ¿0I ø óq*¿Àó±*“/Ì¥òô‹~.+_µÞ ú¬Ÿ, 'eç õGöcåg¯ì÷Ï‹2[;Ÿ¹ÆÆÞ÷\~õ°ùÌõ”Ü@VPíåù]«½Ý¯iàû«HVƒD¯#ðÔ¯0*­+âˆr£;žkB„Ù!O@¡<1•ü›K Üáä¢×s»ëmw¹O·;R½HœÙçÛ­ð²úkzµ÷ºµ]2¾ û·¿‘Sï66ûf-¶“m¾å»Xf/ ëšžÒk÷"Þ]ç‹b9/–†ê¥Œ[Î ¨Œ‘Q¿(¼d£ÒUŸ~ôTô–tf™*0æ<ð?nî|ö-퇵•Slžûfüù,³K˜4ëð?~¿†±Ÿ½~Uwo[ñ¹Þ¢³Œáî߯_)\/ûpðÉ(Ègš{kR£(ê+œ'^üT0˜‚ õŒ³”YUþ?±üÿ|üQ(ßÚIƒ¿ìpknÿÿÿúßñõÿû¿þGa©mdÞÏ qc¾þë_¿~稛é\Q<Á®l³'§Ïâõ#åg¯'ØÌtоjxFÀ–ÕÉ>ÕñÌ¥KÛLð´Þ¿¿ðpêsö·¿ý­*ÿâ‹/ªò=¿cf\±kÄüwïlcmîî´óÌ@:Ýÿ¶3P>£^jÅ6 4 |ï5{3Oe .GºÓ4Væ‘<×´±Sž±ÜLOâ?iCˆ0ñ™ @$ÏÔa¹yýÒïÿz6a>Nù†8Ç-Ü,”¹},Îe”?Ö4yñé‹Îâ¯^0€uêÝÈ…—å¤Õò7’ÙKÂNHO ÞØç/,CË¥¼GÒP½¢wpu¥vìÚ é°…eöƒÊoê¯~ã+”9 sá¼ç/ ×'æî¦›w3ò}¬ªT>Ÿ‡àÉ Ò÷°ªRù¥Kïe®_cbw‘¯®®eä×®(ðpåZF~‡›oˆ|cãNF¾;SàoÌl¶›_™‹8þ¯òÚÌÀ÷òîfE¾…#åu8•l[²êßÞ¶àsðˆ– V–÷mÝñÙ‹;·`4X:~q«R+8„&Éή›8®×–ž‡æ[žYL 1áø ºtÅÒùÒÉâ\ÿíO•Ì#™Áã*Â¥»ÒL…Îpd¿»(Í?,@&›Á03Ý×ýÇ;ïtI;kË'¨2JrÃÙ“Ógé#åg¯'Øb‡6AÓÀSÖßOkkk?²K—^}õÕŠüþ}.Pг,f¹?ý鳊Sø­[ù÷‰ÎË7w`þÿæ›ÿçƒà ÉLÆ]¨ûýž¦îIJ½ýl šme5 4 |G €éòò²_—tVâ|±f åy7ïø”áôö„r7›&UÌž§¶z´uŠs{„0B äᵂ+øAîןNüßu¿¿ä}a>Æõ¼W¿ Œ[ ŽÜ>ç€ ÊkkÒ'‘j»]Ùš7,£› €Ó5V…Ë|Ç —ï¿D–! ’üåX¾žÿøã‹ç+¥SŸÑÅzIH·sƒt ?‚âÓÛGú«é öˆ¨Â‘œ»xÁˆ•?/\_€hˆO±ôpò»;Cø1psòýGf^{ï=/ï=ñˆÊ_™¬yùšß4ÛŸbÖ¯]óòk× ×,9»ûß¹ßó¶s{¾ëå»óÛ¹å›âÿÿ«È(þR˜[àÿ¡óÊa·©˜Zñ¿-Àlo&€âÿ;ʘûwzà–ZŒÿcñXª€àÿõâøÿzPüï芴‹ÿcéY|µÐtvéäÉ øÿOe@ñÿ~‘Pü"§Ô~ÁÿXÜ—ä‚ÿ±¸N[æ g>šñ^N€@î<¼œÜyx9=¹óðrzä›÷(.Ū][c¾F‚³¯ùã”ÐÑË'T ÐÙ“Ógé]µüÂõÑ[QMÐ4ðT5@ø/)€ÌFzZRY9'iµtäåúÿ„øìO¹ÃIdËŸL„ 0” üðÿÀ@€ä5º„ŽÕÓSÕYÿÞþvûÛF<å¶R›~€ˆÌU ”g}Í4”‚4óÚkï]òòKï½–0fe»¼»û¯b¯aÌúúµ+^~åZ rѬû^¾q?]™É‡yùì¯J4@ºzø_%ˆ¡k@Þ¦»|Ù}æòå!øï€é´'Ξuà•ü¯€ÿc9м ÿGÀÿø_'ÿ«!~Ð¥}áE ß]Z§ÖAbÌÎÎ]ó‰ÿ÷û óðžÆx9ðÿ½>(ÀüŸ”ðràÿú ó—-e¼ø« 0ÿû(àåÀÿÿ# àãoQ‰x§ëþŠÿ_û–( ê0_çä2{^Ôé³p}W+¿x}8Áþ>­Ê?D üWüŸ(þ+þ`ðŠ üWü‹ög™¿ýÀÿ@ÿ8þöþ/ÆŽãNdÜ0f¦™%@ W¥ÖÀ·! ®5èz*4æ¡®Ýâ^‰0,ª5ˆ»Ær„Õ…iÓC‘4Z®¶Qw_lPš^‚Ú··ÉC`™êjÙ2µÞk·Þª·dû’‡0ËUãî÷}¿ˆÈˆÈÈ<§HQÿœÁâ9™ç—ß¿?ÿ “ŸðŸ®¥®U ÿg•÷÷'íá& Åà– ÿ÷îýÒ±àúÁøØ~ûýXç±îL ¤PH‹i+™¼ªˆìI•)z"ÿ£Å®!WO~·€iå?réŠáÿª~'•“Ž# %{äÉû!äošåÕÄ@UëåWòó\`Úé³Ò{€^£Rµ<ÜýágˆYýÂoE[»k[«[-jÍPYȉ͆^qüÝwcþ(ÀfÝ!5˼ù»Tã½Nb8_s_ý5šê×_¥@…¸åÐ(Ù ×£H#ð|”C B,D94*ÀÙ(‡@±ÊM`%Ê¡P,‚¸Å£¿\òõ_­PpîþzT óZ@”ó6ÎØ‘.}Û¤QÞL I (8·‚?©T4 àŽºG_IÀGb`½Ý9ü™ @Å héÂzVÆÞ£XÓÆ²S?€Ù³s{ðg*í|õ`ë°.ÖË@À9,¼÷1˜½Ã~ƒ&u„OÔ]\üïèc²Ó¹®{À–_¹}FM÷Ž'Z¹€àÀõ@+¼¸Kžhå"‚÷MO´rßÌ.ÓmlnZ/Ââ¿}ä7 .Þýí³ÿòÝÿߌÃoß¾œz=¡Y€á³ïÃå÷å‘Ä™‘¥´q j+ì” O€>y úäè“ •›ñ?_@T[Ñà‚ðÿ—nઘ`MJ ¶©öùÇ®9¶ÀØŸ¯È4€Þ5RyªÃÞ˜¥ìNS¡øxŠ?ªxJIåiæ?j–¥Ð'3 G.-á_WÀ;Žò{ sÜŠ<92È]sm¹I¼úÉÐÌùu-5 €¡Ó祀Ÿ£W ­{iÍF²ˆï©Ð#@ ~‰(-£¹ž¸±ký-àþ®V¸ U/“Uœ–‡´ÝêɃ\Ý*Jèö®ôÜ5 €¼Iþ„¨V?ô¯ì]šc˜ŸÈ«Ÿµ_ye²YˆøÀeLYí$ÀÿÔp_}ú—OÝ@ÆÐ+4ÜW—¯-CN €¬ö€^Ôp_ÝØÞ€œHþ§€ûêá_†œLF ÷ÕµëkS c€i©à¾úÊ{¯@N €ŒàÄ¡~ÔÈ0€ÏÿèЗ¿ö‹çkƒÇÁ[[øÛßKœßÚÂß¹’h.]R÷¼´´µ…?3ƒò?êÎ7çÏS_œbØ)Lù·¶ð·D;© ÀëTp^ßÚÂßcåÊQsú´*púÄÖþ©Ú¸óçPwœ]ª”Hª'¨-ðo[­Ñ´=²µ…¿‡{mÜ¡=[[øÛ- 9tÈŸ¡¹qCÕ»ñÞÖþÎôÙ¸íë[[ø«¹Põ6Ö¶¶ð·ÐK,@¸µ5×£àæç ÜÚÚU²KXþ—\óc~ \N uHi´r­@‡åi´r­@‡åi´r­@‡åi´r™@Nü×76eCRü(YâsÀ `1²5[v#zÃS½®ákø,ó‡óL)¿'ÿHt^@ãw²2å³ÄTžëS-?S¾ÿ Àúw|Èü_úÒ—hPgI‡[Å>õÔS½9§* ÿ_üÅ_ÜÊ™ïäË[`l;Ó™@èï:ÌäÙ«æ'®q{uˆ«-Oé“só–SëOS"/'AËX¯ås³¶FuçMr'€€›Ä©<œ Õ0¯É“Š„ü ‡jL¨Zˆf`¾Z¾VH&¯›Äêwow^z޲á¦Ì®¯A¨T­$zs7ëÞ UÖ¼þGÖ³±æÕ%šy÷¬z‰,ÉÒ¶OOvjh4Ïþ¾±ê¥Ç;™ž»‡¨ÕNÄÒPõë'¨CôAÑIûuÚ•O¦8XVm´F±ˆøš{úéoýò[O?- €.p½ 5ºÀuzÿÛ¦/@jt €çÝáÃ/þêÅÇ5ºÀh„ë°ñvÔègÝ+¯¼öÞk¯¼â¨Ð%Vbý¨Poÿf=–¿þ›·ëÀº;¸î€uwyÝUiëƒXw—Öá¨TøwI¬€%8Ì¿îV× €.þ'æ_wW× € ÿ#ÿëÀ€XwÖ]…8á €uwzÝõëðÀ¹:°î®­C‘´2…sG¬»£ënXw‡Ö'ö´À{žXw7ÖÝð¿¸íÿÅ ë®Üãu7@¬»ùuWÐ8@Ø&®Wœ)à¿ÊÔÿ— @”KÿMNýÙD¹ðßäÔÿ— @”KÀ¬ §þ¿l¢\ ønƒ»ÂÕ¿%įH €bŠßH‡m¿³H6 ›’ÇB jré·qø$Ðæ÷VoÓËù‘#-$З܏{G[ úþwpRß‚ï¼Fjà™Zìy]Y©©(Fßÿî'?y­V~ðýU¬WkòàûLó©\êÿ—¯˜ïèü»o|ãylt¢`}žð_ø_†Ý“x#¢~€ÿm¦ÓçiQÜÿÌ42w´#…-ðéiO4ïK0¢f¢Í: ™C=)Êíçbàöß©„i1üî‹À6t‘0>µòN 5[[QŽU¦2½ª { ¬w†0›_ÿQ2y2m‚Žäê5¨HöÈã‘QîàJ%«¾5Eo~wRë¹¹4p‡Ý¯ðÿi$  0ýîëø?' €„ 4N¸W Bþ â’Hi>^Å´Íê·WÉü ‹ç¯!  •¿¸ví<~ɧA0âA:;§€Ú­J€f/ 7„S t¸¥½Éè‡<§0AC´@Xÿ&-dªÿôIDATÏ]8L0¡ÿO+Ø`ý¿u@àuè0€£@éCºy£#@ÿzl›òxVèÿÓ 6¨Þ¹Ò»Ð‹^Š=àƒ&=*Ð…þ?­`€3ìÙí 9ÀÑ96>hPUì†Ò=:yâ€/CÔÝ…­|<‡|ŒçïÐÿ§@ÕÇ7£K@ÿŸV¹m(xwó²­ó  ÈMÀ{0"‚ܼó  ÈÓ4­óÐ4 ‚œ{©ZŸ [ñ™Š¥À^2ôXèxÞFËAu@aºå›Ò χ_v…0|*?Årù¬Ø‹ÇFò¾ò«ù;¯ÿÎ {üáSÙŸz ïzßÿ'ʶõšÿì«ðÈÜÅΞ½ï·RñóªáÍ|ÿ»Ÿ¼Ö%0pßÿîü«]À¹èûß1NZ?¸þO}ÿ»oÀšrš$‰ào=iÿwẠ›åôYMÎãÿ'jò¦Aµ™úVçpåÿÿ]/Ãð©ìÒc¥Æ[à[À·Et­áa/¶ÆêZ%oš•y˜]æ€Ûß}ñÅ.¾`OOQhŸS¬A8E—@ZÝà«¿Åks%ƒ­XçyäΕö(µ¹ –¨›Xɵ Õ&¬qpA¿ùö·½üÛßî°*嘗s)/û m€U~ŒëÜYG Á´\r áteP’±ÂL|áBåôùÕEÌê«ÑÐåX?ƒöÄ— æ$Ô¼ PÍ–>É®Î&ˆeq]ª%[ +|C6øÎ.¡Aû6°¦l{[¥%JšŠ‚ÀêU‚ïN ` ë] Šë6ÄPY–Ôk.w (uc…Gà»(>ÇŽé€cÇj÷߹ݒ^QÜ!úùµ¦Úù݃¬ý`ýM‘©‚j-Ñ0Ñ#i=¹K± ˆøšDôyð<ˆ€ €öe- &2#×E´Ï šTTD` ûm¬eóͶˆàÐD´³ "[P€-ìã’Cý4ṊàV¿­±"nøââÙX¶ò××nœ]\,t,®[~;Qnƒ™}ºñ»œ=¾Í%´ªÀyÉ £4M†àOè?ê¶°ÝÁÿyå0Çÿ¸môsùØcØA¾@Ž;C¹¸?cù~“ü#нŸŠ_>„xŒºo>ÖÔèÓd(ÏÐCUÄ\ ;x#Ctý‡íŽ›Pü]ÿa»Cà·èúÛ üöÊ?Ðõß+ÿ@ßÿ ü]ÿa»Ã ã7øþ÷~ÿX¿¼‰©üï]ÿÉòÿßø†n÷ ¨1†ÁoùÒC¬d~‰øRñpp"‚ÄÏžVv `P'VI1:L®j“+Ѐ ÀHÌЋÇCÆø´€€foƒÙ?–ß±z»×mh…!ÓÀrØR”cÛTfSLüÀÑ`š3M3·& Bp>k=BÄÅ(_Ìf߬!ÓZ”¯5óå0Öœ:‡Ù1F8Ì“±<–ë˜Óâ?Úuîµ×¢’“KØüÁÃB½ÙAÑ[µÖrC7cXil ü¯¦hð^ÁÔ_ï—Äþ÷¦Ã¼î,¦u˜ü Ä“ž`.¶ $ ¸>ˆïîŽW®ŽsÿB€+ì ^1¯– ðlnÌÞpkÛ†/ñÿidTîÔ½;UδŒÀzs‹æý÷/¼ÿ>&ÁúN/ÍÛ`† &§¦.a:¸0mNž=‰WÔ*–À°Õi÷ìoél@Y,o¹ÁÂå*–/­üŽ—:ú¡'“Q0 ÇqƒWyƒSðçsŠ.¼Jè'ûë’h€±„âñ]ë=Ö~«ñ¤ÀjƒEßU,ýÂÌ!Ö½ÕAç;l—ÄÀ]}òkø×4¿ö¤{ú[OcÊú3-v¸Ëø×4W°/ÃØ…2€~órèí_ÇCíhoó?”ô›—â?Ô4Ïà ÀáÔô›—Ï/à_Ó,bÞ³†EÞù(è7/? Ĉ{^^yíx€2€~óòåükš«+˪ßò ”ô›—¯­ã_ÓÜX_Sùkë7þŸ‹úrKÍ~@;mQ`ÿýù-Ь Oå¶ÕŽÍ¥¥í*¥ÊÀOI'hûÓr€f‰ðEù S0@n£yñÿëµlNŸhà@Z”ÿŸx${~NþŸ“Ô€¦9Ÿ3Z÷7ËCˆÿWÓ¸yX$ô¨Šw—Öýññcšæ1Í÷Ðø„ÿïIl‘Š9h³Aø]ÿ£Cåãûáÿšä„úk‰dŽðArâÿ…‚ßmv)€äÄÿs»bùÎ ¨v -Z|™À¶=5Î  ðåfð¡ùñwf@‰!¿|pÜäf@‘AÞ¬^Cù Ü RNê8ård¯Ž>™@ê@Ã+ÞÂÿøÛwƒ‘o¯0þfƒxÛÆÍ³Íæ&U+æ×67±SÜß›>)>Á‹˜ÃîñãÿÏT~žŸ”/ÁòŒãþ'ÐëÅ£™¼æäB€`÷èâÛô2úôw’cÚQ¹ÓµÀ¹ßÎ(D·¬¿¹þ¾ÿÕ‡³'K®ÿ£ïÊs2¹þ¾ÿ)Ï àn$¾ÿ9´aŽ˜•/×ÿÑ÷?å™ Ôßÿ”§ €wýo¾ÿÍùŸ3 &š”ŠóZÂÿ_*€d¨ÏžäˆÿŸz¢Â4Ë×ðæ«_€:Àÿñw#ð <ºã)Çøø[€@³w¦ûRÅÔm•S_šøú@G– €É Ÿ¤›A,àªØ!XÁL,›ÁÿÍc ß䋋ăéÅÿ¯60‘ôò§û« t€ƒJé¥ AsE3e|^¡ @r ÄýüGñÙôþ+Dþ‡¿­Ï+•Q(¯'7˜–$bΰTþͧÿ`^{øŸà‘k‡ç1[Ä45^˜ ƒøÃk†ùèöê¨ýëÖÒË[ºÖ€[1Š*¤Z¢N&‡hmLÀŸ`Õ®,'à€ŒËŽ|¿'Þ¿“(fÌÊÈ]KØá}”AüŸj1àîñOStÒŸhï„©F^á Š7°3}x¶Qð_|ü¶ë( åSs™€Êo›×÷ÔЉÕõnžFw1&#ÃS4 ‡4¬r~,ع(ë«x¹¯`á»[{k?ä÷ m? j}“ÐÌÄž¬cy Fb¸ýè‘O~ 6Pþå·¾…Oœ ZjÜ-Á1úùË&DZɡpåŠl k·×MN%9´¶·eààÿhßä¿zñE“ãx|“Ÿù“Óƒ€äЀ7dÉOœâ?kò÷ðJŽ_à @ò½˜œ-¯õƒÀÕ«šÆ¹Å_þâ7këEùëk¿ùÅ/[+€Æ\-C=€âФöè>|”c-{$Ó¼4¾à?å"ˆà %nzÀà»@ò„ ÿ¯HÜÔÃŒÐÔH9>‚ÿè”S]!}€…ÿÏIªqZ@WB÷\ya°©©øÔø€²=òp¼|RDPnÙÃþ½GÙÑÏI¤€à?æÆCà½ïi Ðõ ÿ_×Ô(¡áhoà—ú1ÌäC”ðÿ‚äÔË—Ë}@Ê©0×"À4Xºƒ-?âÿŒ ÍÊñ)üŸ`—”ã³!þÏ2ÔQƒœ]tuAàh‘PNõìu®øç ‰«¼ÑÃO^9y_~Œ¶º¹‚‘ï#?þæƒxr‹ßm7×6æçׇ¼y·:|šî»xlŠà˜±|0MÈO…)Ý©Ç>©p~¸ÝËY#þïhׄÚ‡hOëIX| 'ßZ½qD©ÙìLK§žÒñΪ(p„J\ÿË@Vä‰ëjtä‰ë9(ó‹àdà?$ê1–òÄõ?µ:òÄõ?Œ0QM®Ð4ˆý ýÓ€ :Zþºÿ@þ†ÿ ó›ÙÐEpO ~Ûm<å6jgäeškݱ!æþg·ñnc$>©x<ïØk €þÁ¤ëXúƒ…;€”0à €Ëc{1“!ÄÌà÷²ÀûœÐT‘œ-,òÓG8, ~@j«`(ïäç,EbþB>ßlá ¹„©15eOÃú]‚0™Ó3@Ä×^{ä5à~þ¯æ–‘ú%@ÿo‹¸TBhUáðá±c$Ê[€s Ð_ŠÀXþK§ßŒÖ‡V¯{ðýzEq¥3Ìÿ?Ѱ€½nï™ÇºôCC€KRoàÈÔ e‚8 üÖ<$“Cˆç°è¶†uµ ‚Fzr ñÿix¹Çº{UT­@§e,áEÂu)Ÿ„æÑýñò|Ÿø?Å8)»Øui cÍ•8S¥öi.ú¿ú*i€Ú €aÂeo1–ÏuKÌ>¬ü”N€°K»zê¿iéèë— høÿÞ>àÿò`™°þÕ`cÍÎ l–Ðñ Ò~<UâÁ½±êê`i/#€·~•ÄÀƒO6XØ“@ æé¦õ¨WÎS.'€”ƒîŠ^`F5 ÿAB¾Ñ´~*Ë å‡›Ö Bà¡„\N)_kZ?€ ÈåòWšÖ B\].ê×út‹Ï¿}íÆZQþµ·ŸÏðÿ~†ÿ³Rþ7—/ƒ¤ºƒÔo˜þÉœ?wù2"Ò§ò¿Æ7&3È cB§ Ð^Xbø?Kº$bü0HI>ú½"öÛ °Šáÿ,™!@K4×®a8ÅU˜B%Üä”þ˜áÿ,q?yØ4U`:³ˆöÿ"ИÌ %¨üokcHÿdÞ;ÓúH}D“¶3àúˆôrmg¿ÁÐDfÏ’¶3€fJÿ4ýWÒvPð>¡XÔèÓ>b™úðÞ  ÷øø(RZ\†ÿåÐû<ŠAHqñµ1ü//€Þà%¸Ðà?°8+ïÐ|Jlj$ù_òÌ  žg21än8ž}Ã]¼‡ïÑTÞ¶:@º8 K€2ìv`-³üÎ4ÂAÃÂ7¨ó#2`cÍ,å³þ1ó[z/`»'ý³–Q~gÛ'iyÃÿÝðÊþ²Ï´¤éÃß³âôÁ¾"èHćív@HÃØÛZgòO>ß‚âÊc¹¸€ytV0É/.` tГ?:ˆrÿOÝÀs Ýxõoûàé°4™²3 kÐmtûêí „p®KpDâ¬cÛ „pn$ú‡³Q2¶Àç¨HpòH€µf½YÃäMû2° åê­Í‰×i ü0…Y î½ÿçqÈ<Ôe‹¥›[››ëÍ"0#åbÒ ø…ðY…  ùr3tŠüÍ@jR¾U’Z™^`)a0#¶«ü/¾º|­ I `Nç5? /<!xXÞN¸I¢Ð˜ÀÿÉ( …2U—ùÁÈAjCBB¹kkXB® Rà±,{¼:NûIoœBMàLqíZû Úâghäƒ<3`ŠÍ©#σkÁ_Šÿ±L+ªu:½!Ú#XsÏ##û„•â—ü¯¾%8ùv¸@ø1xu¡ƒ´D¸äŸ›û:a(;òŒS­Û€µ¼Ý,š Öi  UãVë£ïñå£:±}Èϰ¹Ù‡A°ÿfŇ;€+´l­”½~]h¸>R¹ìm€TGdi üßqq‰Û`àÛ‹|Öªê¹K@dˆÿuk¡­Gü_0pž“A.€m4æ`©ùå·šÄ  ”Ú%÷Ny?/€ò(¹ùXœãd?–/—”›€¥æW/6‰@ù”Ülô—À&6‰@ù”Ü|,5fëë@òXÖ/q‚Jð<4Còòá0éÿ\7‚î(ׇ¡°‘‚ tÎá}€ÉAÀ„þ<ˆ#ð¼¢Kð{9ø!þià0?¡€S©§vA>­|l×:/|ø@¤*h‹æ‘G`` Px‘¨µIiß„>580±÷S¿Ã¢ñ¨aEÀ åÇ6骣ø3`Ïnü!;8;‚{»wGà½÷š3g`` P8ƒ €¿p"àÐIf‡.Üɱ]¨ˆÀÏ&Çv¡ ÈÅäØnU‚ Ž0Эº†i/€Á W£÷8\{#|o€gã¨Ë hGØó/€Áó€æÛ„cÐ`~¹À# 9mGhf$yê@ã¼TL €ÿ ìñ,1;à½Á÷¨¢E¿!åà@ &çè½Auœ¥Uz !x ð$PŸ¡pÜFÐYÊ×qI~0ËÐ#à¯x+¯Éڇ˿]¬ë^ÿÿñ?’úê“SCˆÔWŸ|ÿÓO?-k¦žò÷]¼xq߀\‹ò‡¿óïP!¦¯ü`³á¯WN§¤¦úòŸû‡ø’w}ògÐ~ÏL¹~ ï}ù³·Ô‡Û7âÄ[º4é›%ÉOK¹;-'8a¿uäQ?„‹ïÔ“ëÉOâÿ®Se W¹qézp¡¢šñƒ‰3€üMˤÄ@.§ë?¤Ä@.§ë?¤÷þ!êärºþCJœäršV %ÎRùe÷<,ÿ‘g1@Tð ÿ´ÈB7ØÔoFqøÜ®¶ÓÈÊ@Í_ ˆ«3+kï`´èëÿãïc |ÎZ`èBÓ#€;ø"þÇäw xlµõÒ&ý{þŒ•2LŒ…ÿñSD°:<þ¿×Í7p3ÓÜ' ÌA0ó[;{! ›50kF¤+øªN—Ó? A„É1{Yk¶Ö¹ÄR¨˜£yBd̹œ‚0Ny"^1Že³„ —:$š<ˆï\ƒ–÷œž6âǶÚÅ¡/Ф@Åà€ò·WP+«æ' ÷ÝâO,€‰–ÿ ³ ô¶xuPpÀÒŸä×@´‡ÎÉqƒð3—ë3fB˜´¼35Jsü—²ÔŽ9½-@u,5»}»q~¬Ø·0‡ÏÁ&xŸw¦P4ãý¥N , ªõ9K·×”Õ§\fçœdqö¼‰lv Tè< ½<¹V¾¡h;z—HÙp ïŠûïÀÍæ€€¢M@«¢¼}µ@ú‚Ö@<üp—?’ŠÃ~ß~ÍÂ:IŒÐ~¨è*i`ø’»ŒþÃH¡%1¢š‡ƒ@,þóžB(„_ÍþÄ Î€ö„œëÄâ§À0š½µï:Œ Ç ¢_ÍZ\HrðˆÅÊ¡@9¾šÅüœR®aàØ’%ä4Ÿ‹vT/Áâ?åxü(ÇWs"‚ÊkS§~{£™ŽƒÀnùŒ©æ 0C@ q8ÀNë@Ï5º “Jó´ŸIþ#€¹€²lèD‘ðSdá&®F™B@Ø ÀD;ŸÏ+ÀäTÅI¼ÿ³Ö&å)€è ^!n®" £8 ÿ“0!vÒË-AÀŽ © )ï«ÿ¬ƒÈ Àñ? ;€;™á&çNæ@øŸ?›œ;™á&çNô@Û|Ä [å?¶ÍÀ‰7Zšo‘ ` @`ˆå잆ŠÌ€rèþ‡ü I­l (P‹L “FÙ,] iÄÿ2qi~ûÛgßþçè ëߣŠ@ü½ôRÈóÛå#¼®³v|‚.èzÀ©TØâþ;Ø]i¥|ÿ¦òùÑeÙ´ ÏȤVòß~`hýæþÂÔ_üw*WHQ„Hþ;•?ý¤%Éýw*¿¸Ï’äþ;•“k1ŠÉ§òïÀ5&“äþ;•ƒü§(P$ÿÊé¸Ò(P$ÿÊÿAæ;^ǧòµg,)¿ÿήŸX/’ÿNäaÔ½øð €~0sóncÀ@ n½ €¹‹•^zÚ°mËÿÀù:­`"H!æÎ²K'b.œdrºþ+œdrºþ‹Îà!29ƒÿÎ29]ÿÎ2ùóσèßô`fºoê t@Åÿ/•Qþ÷ìÛ à|£¢›ïÆoù- úW @âÿŽ øˆ% €Ú½“@Å$þUªm4þ8¶Àç¬H\rrp}c†Ø„9VR~íG Â7:É'ôàìEð,#€ÿ=Ð`房ûîË€uO`вøSh16¥1 7ð1 €F¦Âêk  ‘ä’ äŒDÆâ˜ŸFà €ü @óWÛç'l¤@iL%·ׄ¡“ø,uw¥2„òÃ@r#«,Û‘LØÇïj-(°hŠÓÁëÿ˜Bš›Å¶á‘¾À<}uëô°Œág™³'¹•™kçÄÎÄ÷—rü“͘–G¸kü\´2°AB Yaç’8Z*]žÙ·.„{¿VIHÌꨕËö¹ G€¯Â  ˆu—䆬ésšâÝ®†¦ËŠ]ÆælÝ<Ð)€U$Ö%t`2JÙ½Ýfô7¸¼´‹Fé»›Ut/(òé ð ¨ÿ—SÈ}®Ùoæ½ëÀÿIû9ÜD$8Óún5k’;øæ+¨SFbþJMåx.@ÒpQýì‚r)¨œ{ˆ ˜È¡ü/9ñ?ü6ÐH*‡ò¿äÄÿK ÷0Éåɉÿ¡m‚½¨iªúAù_râÿ%<†ïq½{°~1˜³òwˇ¹Pèâ°w Q³· éM°Åc ÀTøA¢ås'»õ ÌÀ{g÷TûÑüà (gÈÍUºwƒîĵ(SšåA»G@LJ'Ž>|´4†„GòÖ ášœªÍ V¿S=]Þ€\%ž ÐÅ›£€ü ÌU~ùá Irétõì ¾zX“|@Y@³ Ì!Ltq“¾dÚñkˆA<“âxã3‘¯“„5>àî¥6Í<¼þƒð k÷‚ €w°%7|4¥[y žòƒøì6à ‰ÿ[0­àÓÿ øqÂÿâN¢w%É/üOîïGïÀû€üÂÿ^^:  -ÀeÛú¿EàÚ=—ï›G0¼Š ¶?ƪ@ÑâèìãŽá:@Ãhƒ” Q}dŽs‹RÄü$üJ=P_©å[Q1J`{ÌOä¿¶¾÷güdÁ¸ÑªŠa~~RbŸ&‡b¾ óó“û4¹œ„xÌOäO‰}šŠø2ÌÏOJìÓäP 0p…}~RbŸ&ÇýÀ—a~~RbŸ&‡b¾ óó“û49ðe˜ŸŸ”اÉËÂâvê“û49ðe˜ŸŸ”اo¿g(7ÌÏOJìÓ_¹Tî>t¿¦“Šî½×ÄEtÆÑì‘ÓMÑÆy·1¤@Os-`@ø€pÜFÕ}”:Hë Õq¤Ô@&÷Z©3€LþË¢ u™ÜÛ¥Î2¹·_Jdòç­üÔ@ è”-ð?IÿÛ(nÏâî}»÷ìy`ñ}øä>¶Òúþyâ©'Èÿ×l8oÇd¿º²"øÿoþî/þŽ ðÿHÔŸ ñ×±>_-à ­ø?¾Ý ù[€«Ï$@à?f: ¹î^$pûï%À |Ç™å€Ïž…ƒp.kÿSc:`~A¶1öÀ猊5€-$–7eà_„À8×ŀд—˜5u±Épó “6«©y8Ræ6î!„Å"Á cÝümÒÀ€Ì Ÿ1mó]ÖOoãd…“b·´B# ª;FüDkáê,{Fø«~†=Q~¦ îB1¶X5* H_ MÞïØ#tóÔœ(€Ò*n ü„ù2Hñ“&h_@âW¬…iÐÃ3Ó‘uŒþYhÄÅêæ$üÔŠ€QA‚ðÃõi©…Øãï¾ ÖP¯àF’"//¢x|¯ÌŠæ>$bc†\Ü9F—ù%[âHo€ïŽR¬~˜½7래s@¯& ë @ÖÙÛöƒu &5¡¯94ÞÛ{„gŒ •7"‰´š_þ¾ÿ¹æ/„M|­hØÂ—(W4†¤Ð£ @ÿ·ù wËä¿ú|ÿsÍ?æW4†]”šCŠÐÊ €tžäXKyÆÿ­\Ñà÷ÞäžÅò ÀžèjùGU~k£ =ž€¹ò/ ë\$,UÂHëù¨-‘EÀÈ|LǧLa-`Aø xG€äâꀭ$ö.Б°ÔCÈ Õ  PžH^¾wHwåü?ò8@Èà O€€­µæ—ÿéZ„‹[$¤åJø%TÔ½m$~Cà f>°üwÀïÇI¼Ž/¼=°ü%Ê/ÅüWØïÀèùþ œP¿3§_Øë~aòßýîßÌÊl` ´´×“ÖÁ• òAý&o'\®¢E]!£'ý1S¼EÐ `U¨Œo@Í €Þ4¡òý-Œº3”o9²üa€5\£µÓøÉpVŸÐï!ŸØ„j@"yüÄ&T9Èã'6¡ÈÁ@?± Õ€DŽ™ äñ›ö ‡ú€<~bª‰ äñ›P Hä¸sÇOé°ˆð O.äñ›P Hä` ŸØ„j@"yüÄæÓ¥®¼û‘0 \>Ÿ||™ä ß@NDt "ñ^`ÛÀ_?5'ÞãŠþ:jHïðãR3à˜ë¿Ðœ–Ð?•·QjýC‚åÿT޽|€ôOåØ+äæú/œ{…Ü\ÿyj¡Æ €†ÿAŽ=zЋ…ËiœP{èOÀ”ü)Ü‹‹{ù÷ììß½ç}p/%,¶‹a¥nûÿΉ³¯Â¿a2ì¯TéAÅû`Ü[`lÏ| ÈÁ4&ÍCllæfBpA·$V¼ÞK_ZŽÊÊTÙƒˆ[N±¹…õçb…*Ý:µüƒó t£\h šm6"P8  RVùíÒ5Þ@@•ZüBOR~•¤‡ Ç”]ÍßN†üù¡uže÷çKó'Í·®•0²O«(õƒäêøÖ`¦2?#Ñß`¦ óXu¬Gcù*u³/#mi`†et܆ô)«ÿü^—¯evª°ÇÓ'.ý5y­óÌYëe·'–o `aÿ‡‹€ÊÀñ¦ñ¬ê®Rp£*K¼»0€zÕ¶ý#³ ‰ªXÜbÁ<£óþp¡4¿žl¢€€œ_p Äîó[LTþo =Ûö3 éY¾ó~r›k4ãgÑÄðj0ø  €ýÁ@Eç {À×ìQ&âtuçåW0çhÎ_69Ô·i™Ûš(‡'„O$^<Œ¿¦y •?X™Í¡çMç!ô‡˜û lšƒÿWhwÓ ÄA8ÿYî4"c¤õÛÛʯ²~Ë+yù?lå¿dùkñ €Ã:w³HfDŠ™rþ˜cº¥@Äÿ5¾Þ< uáî³EÙÿœ:;T/ øŸÏ['µÖ£!Á õáüÚŸDFãôt[§cð€ÿ{ÇgÀã-(E .qb•;àÿº €Ùïþ7€,Ñ7¶…8ƒTˆI9„øŸ»i W…ï0ÿá¦AL€T€‹¨^BüÏÝÄÏÿÍŸØ2àîîò^éL0ì…ûˆ¨Àçôw bøá‡ >à)íCû%:ô8zaux€èÐŽþÍo~C× ܽ',.~ñ;üð»ßý 6¸û 8ÈÚÉ”ÿÙDd½L!@¼¡ÆßTE ê?oPƒDýýÕ È_ >HT5òü¾r³”o]!;`mFÀÛCí½øiVtõ)+³D4Z¹ÃÍÀÛx èóË Àl¼M­Úü²0[o@Í€V®ÇZÈÊ>µ•Èe`¶Þ&€M›_Vf àm¨ÐÊÕkÍÀÛ°·r ;f àm¨ÐÊe`¶Þ&€š­\ÚÙx›€Ì]ž€¥\Ôlð¸™ö¼áï² }À•ßpÕFøG¸×oFüÅÑ£úˆž÷ÿpø« p?€W]ÿ›ë?S {ñ´ô/9ð³)dgÇøÌQr9{m~ØþÿƒäröZ9—þ%—3€°×Ê7í~;9{Aü­1rà÷(&þWÚý«SzøÀ¿øÀâ<ÔæAì^Ü*„Ñm÷ÄPýO9€î¾¹°¹¹¹Ž‘©ûj‚Û¿¿ƒêÊTÞ`|ãc Œ-ðÙn²¯_ÜÚÂè>¿tíßö¿öC×çeß}S¡âä¶þ‡×A`’ò•¯$¦vô°î6 ¾u>øÌÀó@—rÆM¤“üXÌ‹ [¼…:–€,À]ËM¾® J@¹ «‘Ý!ÐßÄæÁo[úÛLÉÅûÆêµ7@PÉԊ@¿špà0^\îxSiÍ)¼bO1Š<Çý8~‹€AÎ1ÄFé@­îÅV¯: ‰ùkÆÐ-•ßa ªÕoÎoóË#äÀ¬ëtÃé%UÑå’À7»c%‡ ÐQÝéG´n¿†v‹—Û\¸q!J »z„–ÃZ³•Ûõ“§_O‹!-&Ž_[MVøãyæ¨ +0ǽc(+‰†$ðgnåW €f/Pm»K%›P¦—‡*€D'^ ½žèá¨u üb0¢¹|®‘zÚ~Œ š6^éÆÜ€¤6gü…ûó[Äiut›$àåTMnådˆ®\àåTmnåTÀÍJä˜í&r* `"Çì'‘S!`qQ €/Ÿ½«-Ÿ  YÑÊ1ñ)ê‡G)‘cE¥(ÿ7¿ €¢72„ƒHy{ÙÒW' rÞ7´sü&@À#ƒŽO9É–O¾FÖpqÉìK1»LÇȤ˜`@JøOŽ2³“  U§O9u5H¨œ=”B@<˜’ÃnÉâ9oîܽ<¸¹Püï!Èþw €m,=s“0;]î¶×'‚ÀîOSøDnîõŃê4P µI \€w}~0 `ÝÚ‘ÞÅ>âF%ÔHÿÀìLx 1ÂùülrZÀ€’C&´09º08“Éý~69ŒýaÉä~?ÇRÇöƒ }W·—I€üTÑGJU´ ³óaš•j¾©S%yÞó¦—ïÏ‚8°¨ŸÅŸIXîzOÉW¬·¨?ÿÉ•´¨?ÿ©<¢þþ§òˆúøŸÊ#êOà*¨?ÿ©<¢þþ§òˆúøŸÊ#êOà*¨?ÿ©<¢þþG97ÐZxüHèñK; Ù6ÖjtÆ¢r&Ž~t³ 7$‹Nßè {òx Ñ4&Jjù«§ƒ @1ùáÛó·³£ûxÕõr:°Q$Tÿ!7gÅ(&įÉ+ô¶{±ºÿËÀ+ÿ`{QîUÿi‹%gFeµr¯úOÛ%90*ÈËñ¦%âg@töô ¿ðÏÙ‚4øÇ€þÅ=n÷>ÿó»ðí I $@Xÿ¯Äpë› ë뛉ë\_9ŸŸëþA`ŒPôÏqwlÏg ˆàÊ)°9Þî Fßvyg°¬0p,`ù¯1Ö]ºòúŠ<ŒÙ'Îÿƒc€ïdNnrÀû_ùŠV'”Ÿ8!øô '\N\ʹ$(„vúèg't$r=x±­rPzwIî+\À `·h¬ÿz£iÞ8ôüHèÌÀ‚Ö6@<¢ ~¹X]5ôvåj`:+üÉLœ6¤-ÿR%ç.õø…ÿ—öBùÚR« >h@ããýü¿Û@ê‰GNÓ=µ-Úfˆm ï¿ã‚–·‡ø_z¹^?±JÈ„{¹ÂÚ.Öd/LÄ×ú´I0\õû9G KøéÆ šÃÉÙ£ª g7ÀèXìÔª¿þ?un-·bnÁÙEØmg„ÁstÖùÀèG“5D—|Ö`ý›ð‹Éô•¤’•q,e/Š@àõÐa™¨ï!ü¿ŒÝÀ-_®¢Þ¸,½ª^€ MÈ¥À@wüMåÉØ—ƒýåë1ãå#‚ᮜ0€u·ˆpà¶e›@§€‰\KÿAœ&r-ýyp ˜ÈµôäÁ)`"×ÚjûåÿäöhÕ?ʃSÀ$¿–þCþà0‘ ﹡¿#kÕ?ʃSÀ$¿–þCþà0‘ké?ȃSÀÐ/ðìú»q »ðÿÚuöæ(5ø/àï qÉaéŸßÀÿ'ò49{\ú§ žRF~È0úМrñ)qìbÊ@ñ¹ø¯`¶¦¿…q¼à¤ÿo˜¾BÛ½pÔÿ÷ráÿ°ä¤h½\ø¿”SÿßËå °”SÿßË…ÿK¹T[ý„ÿùÙóÄÿxW1]¾ €dOORÂMÉ Ž#' â(ß h›ÀÀXìž§€ES?¡8$ZØÿÔ%?ƒÃ77×6ÓIKì¾ZÈàßüÅßuóׇŒñ×±Æø ·¹Lþ_ X$`:-`&ÿ‘+‰Þwï}\gÆôæú¥+€ÿ÷µS#6ñ?N†’ä¾Mˆ*uæ+°¨4Œ1Y€ÖQª«€µú˜‹z i!ôó¬Py»ñ?þàˆ¼~Èÿ°#ÇùÐÂÿ˜B;Ø•‹ @,ÿ#@@ü?8׸Ýjˆ—&þg¤zzŠ*ù^²x€+TÕŒ¹z.ŸŽY⊒Ø|ÐØ£¸|ÿ¹òOõ:|¥öþ-ð ÝLÆ*‡œ@šB[ÿãïÆû•&þÇŸ-+×5ˆÿ°³ÂoY€ÿñÇ ÄðE «ô1€oŸÖ `´ªW‚ Á…kLILB€& ~À[ÐâÉà ô¡ ð*½Fð@Ó +è)|4$’Þ~›6ü ¢«¸~—!#M!Ä/ñû~ dˆçxD’Á"¿…ùƒ»rù ð¿q@’ƒKÃoQ¾ ÀŸÉ±~ߢkýÀÿI~Xpýß·´[\XþOä1ø-ÊÁêÿ'rXª ù¯®\þÏë‡ß¢|cž§Šòñ[Û‘Ñ4AÔl@ñÏ€`Âßg`‹÷¥rv¸!A?Ö/‘|züÏ0 =&­8èTмc™5œ$r^^ÀÿôP·ÑEh}ÐaIlæøŸ>ª^ÃòŸÁ—C$½cùÔÕà¹B uÓX¾b€çž­ñ{/âyÀÿ‚+•üÿÓ¼&ü2ÝBᯱS?ù ¬j¯Äþ‹ˆ?pøþ vÈÄ´|\“¼èñg€(â@éî vÈD90àð§ü¥1«˜è›@ð,sì´!®ÂøÆEÿåÃÞu8pïÂí x×Õ]´òúûo¨|ŽŽ´ÁâýE bˆÖá ø´Ýö,²ý±åùò)ò[€(/ÅËö_Q®Ý´| åÚMå¦[åÚMå ʵ›Ê- @”k7•âòtù—wÎð+/Ìdû…ÿ˜_»iùf×åÚõrRo×®™~Í di®_÷}jzï™­m‚±v‹LóßT‹¥øÿ¶Z À4ÿœ#IE5v„6N¬_qGú£° L-ÀÚH¹XÜ€Ú¢7nÄ.@'Xþ?ãv)‡õÿõžð ÎöCàßXÅH§(õcüul±>Û-@€c ç=@{þ”à$0L%kЙÀ½÷Á €cc.Ý›Ž 6 *ƒ2$^£ž¹r N¤9½Ú 076.&D*Fú8 *¤­áy8ô @…ø7dõ±Aá°ÊÀ  ;RxGUó H 2}ƒœúã ŒÈ꥞ÃI±'ò*²<6  nº2wx¡8€2À¤9W£š¢…ÀæCÆ{tÐe"ðt•`@ó6§²k '€d*+üæ €¶`v! ¸€g*ÐOÁqfyÿ ÌÿÃó 8€.`¶ÑÒ@,G1 8B+þ¡¬ºƒëH¬ãâówr+¡iÛ._Y`ù€*-Kàk¸µœÀSæ?À¯ÿÇü`.§r®Ï¢»®Øw‡iÀ;®ƒúA¿v@«“¼ X’+ø¬¶îHݳ@ òüôòÀ2@¬:ó6²èoÀný0dY!ÐtVø©õÕ˜|`Îé»—0ÛÝ$×FsòÕœÀ‘lhù€¾õ®“€NäZ]þÝ€í‡ü«Î¼´)kÚøsStH0ˆ ;\<Jžã¡=†å+šÑ‰œ¶4aù?È·9=†åÿ >‘Ó#`XþòÅDN%æ°üï¯ÁMäôhC‚}Q¿°üÊß(ÊO–ÿí ¥>Jôï5Ê;L¡ÿ@è¿GÀ–ɈþÍH¶,Ÿ€Ðÿ ô?@ý÷BÿÀРô?H(ަéð–×G¡ÿ!@è€à²¡Ö‘» Q"„þ¡ÿ ÄÏwÇùóXÿ@¯^Õˆ>`ðÏ‘›À1ó ðN¼F Ã?¬þ‹xß¼˜€:ôÎ0húŠØ0¯í(‚@tøgã ‡yøfPH( HÞ¬}å€+÷Ú€ÒɱvÇt¾ÿª€t0 89 èv­¼gh(ŸÀÆÙW6K‹ü?Ñ>×ÿÃþNüfdÿáïßBâ¿>õ›¿D¼SàïßBâ¿>õ[íjýjô¯¨x Ÿð÷o¡ñ_Ÿú-ä·àEøQÖôI%èÉH´ïCüþCž0ðùÿ AØýfd¥EYS3Ğߌ VÿáïßBâ¿>õ[¨ѾU(@ž0¸`øû7„¯?2âŒ"À‡&Á?aGåJW‘¹˜,€z' ²¸aþÃ8Ë7”FJ6€ù üûð”zóŽˆÄin?qNÀ_TRÈ"Ìor9Ââ¿­8ø008…½u…Rÿ÷”Gú à7è'ò²¬>]üÛÜY¯;_ÁÿŽá•l¥©|M³|®ýÀºøÌ=Öþá@Š™€U¾áÚ?ÙÊ3üïå\û‡)ÿûÛ`“&>^žÐ϶ø¿ÀIà¸Y„7€v‰Þö ÿ#%ޱ—>çNÛ!-k[À~á¤Ä`‘¿:fŒ?Ž-0¶Àg¸<@Åiÿ‹Ð ¾ ¤›Žq ¡Jõ3¹`rn.ÞŒy–˜ØOÛØ$°—kÅôë,‘;L¨¸ðEX¶)xŸ‹Cc‚.Hû¼³‚ @‡pTx¥_žÍ¿ý ãVU8Äcé@U@“!¼[èhÆT*]ïD‘*ÀUCpÕ@t@§ä½n€ ލ0 ä!ŸÞ"jŒÓ[s;F^Ð^*@!ù»˜ +0!=À·µ£—Ð**˜”ocFU*Ö‰_ESà»1oƱÑÒŠT:­C¢t¯Ð%´@lj_WÀl%: ,ZÉ(F*¸ák×_}áªtÌpög휚\Âàí)øŸ~;‹“€rß’ ûe/eQ.!&§È¡K]Ïÿ¢åÿUŸ œr õü˜XQþÞ­Öo°üèÿ/,Ú-úÿ«¤€­š@eü þÿj¥`Ò¨t¨—›ÿ¿°¨`ôÿgFy¨`Jº½©`þÿB Àä´°Eξ@€ÔðDW- 5ÌÿŸè¶Oôÿ×ýÿ™@§ƒFÿÒè¨Wzÿ\º,UdðOüÏÖ€ÿ“ Ç?*p‡ €öÛ Ê €¨xÜC£)˜´Ü¤ùeðo㋆—ŽÔü9I¤òáÅýnàÇOø]ãK9VúV@ù³ïRþ.ÜTÓTù`ùº|Z`Í™ @Bxüoèßðƒð¿¡á ò€ÿ ý{°˜ÿökuXù[Åû#è7ô6ÀãCÿÂÿ Îð¿¡á ò€ÿ ý ÿ+`üoè߫۷*Š÷GÐoè?l&€Çÿ†þ…ÿ0”ð¿¡ýQ U¥þGæ€,ƒ­¼J @»“üýü){÷sÛ€¸+ø­û«t‡ñrä‘þ9¡•¯"`Ü"ðïådv´öÏ('¼ÕÖ±å×’_ú·Í6í{ºÉws>³òÊUYÛE ¶Ì"ÿÝjj¥ÝD ìYä¿6ÅÝlp>nK¿šè/1€tþcŠ»õdüul±>-4ý‰üAlÀ‘ÀýKÒ©JT ŒRkX:„3 ø†÷&s$Ì}‚^jÀƒ3q `cAeY2Ý9Žüÿa–ÌE2ª”ñ?Bx­¦@üÿíÃ"wU´ÆÈ$–*l ₹¨LÁˆÿ‰!ä @Ñš\È!!°›N`í59€ €® €÷jß,Õμ7¨ý/€GI5¬Ý%iôã‹ep7[[ÿ# €÷Kâz—¶N— þGgSûºð–§Ù!&¡ÝîüO#7”vÎÏ òä Èïgä>ø‚âò%){.ýœ¾Ÿ}W?Ô5—p×5oCûá‹íÇÝ  ˜ÛÆêíÉÇ™û¯$°æ‡`€œ$É KË“â£I®`iùƶÉé°&G0@Éé°&G0@É顯&G0@ÉéðVê7X>žÎ07Pvh]†¹·¨€Ž‹·¨—TƲwZ-Óc\ö ó2M±Fnþ Ìû¿BHumàмÿÓÿg× W_¹TÞÿéÃmÞ… ÐFT@eø4ÇÙÌ®©¼¾7äýIT@÷ú ßcîÇi еðŽ»)йÐîñàIyG>?oÞÿ¹Ð\BÀÿ?!Œoîæ×}?~kø®É¹öOçÞø®Ê¹¤Jå|Wå~|ÑðR– û ÿ—VünIwÀŸß_ø]éBÓ€wéúùës7M>T¾V”þI J@Í;/„a3#ìG¬û÷ûÍŒ°.؂ē ð—€÷!àÖý¡ú.yë@€ýˆuà~¿ÙjðyÖ¤÷âfF˜ëþÀý~3#ìGè÷ûÍŒ°ñvÂÂ¿ß ]X€ýˆuà~¿Ùj€°±îÜï73À~ĺ¸þè@}ÍÒ5„cMv=O~Ñæ|ÄÿšUÄtÂìH„î˧(ÍNüßîóVSžøã¸4årJüÒ¿m²#!yVCé"·Mi ‹’ÃÄ ¼@¿‚q|H>i¹êÙ¹´”€?.þç@BªˆÈîƒW àoÔÜÐþƒ‚]`td´ùÏï]}[`lÏI ˆÀ”ÌtÿÍ{)¶0P@0l•§zómŽIR¿!ì7æýòH€Ž—Ì}Ù48AíUÏÈ,^ÖX‹²}§æÇ´øÊ¥+—l•ŒõO#ñaǰ?Tð]qà€ý™:`:§þ?p€r­!•nµÅ°¿_¬äÇÜ4ÔO6 -B…¾?3szh&VVb„mh:Mû¶`•×{øª«Ô,âÿ-´; *<’˜ÐþÜÔß=€DBÚ?o‹R[;ÃþPmV;HÀ«'F°µ¹à€ýytÀtï?@Ų¯ìÂÔˆRóÖ§ÉR‚€ÄÏö÷‹¼EñÞâÂÖ³˜ 1±ÇËí÷ÏΧƒ*¶jŽ"R-ÔÆÀmï$=´w÷§Föæt°z{ò»ÜKÜtÀý:¶yú[Ý›Œî7yUNÜ|Ð øj~à~ËøÅª¸ßäÂä€ûMþJÕÇÔú –XaJÌ'µÃ8ÃÿzŽh P2Îð¿ä µÖaœá OYE7ü/1ºn& ÿëÀÌà ÿK.3Ù¬|LËãÙQù€ö‹+¼æ €3ü¯Ò  Â8Ãÿ:B†¼Åõþ—˜ÆÝ'˜þÓ'_‡pZ=·äH¬è#Îð¿ä4(gø_r¬a*øÑ¸U©˜íržØ+ÀÝV‡ïpSàP*jùéÿÄÔäíøR£ ²ÊÎå.™ö•l|Ñ\1Tš¢€ðxÑ šÌ5à€|€à=øç­QÄH·\ì÷îäÌ@ÍÙ.öØ×–ßLäÔ0¹é”ùEèÇ'¥ _ÊEèGÓ(åõíG³(åÔ°M ”SÀ~4]€RN ûÑtJ¹ýhº¥œö£Ùt¯?\´é”òÚøÐ‰‡¶É„F„_“ 'N)ÚˆW×o1d<Äkßû}ïŒ/;#¼²¬÷AÄŸ­§È@L ૺ“Õ<­¿ðY—ç÷É®.¼@Œx\ü'—ÿUnah‡ÐŽe¡p]Bàp5ô·©¤í×Þšn­Æ_Æ[àóÔF´ ÑÇüðš‹ñ͉ óï N}a =ǧ‰n2DéèåàÌ-–>ª(žŸ`ˆ¾b<'/¯Ö3T{húrþcͯ\¢Þ²]@¶]"* 2úüÔ¨ˆrÎ$ À@x}Q ¸3kËçLSÔ8¯cVSñ”†'ËÉtXÕÞw† Ö¦\Á‹Î"C;¼£“<^õZoQ*vö¤:°ÐÒ™H€‚h¯žZ˜] 60µ: @[µ:ð!f&6'Ð6/Ï¥ÆÕú¬H€rŠ>…°¨_ÈŒù³&мþׯkM#k¿éýMDS—!à[¬*øËÀG>ì¡Û|þ¨!¯Šƒ€•ÿ« ×{€×|þºÎèÓ°¯~P0°óWÊ7ÿЙSéì 4€ § @Π‹‡]GÖù þ±µü÷~³ÒÑG ¡|Yù¥5@^A)9URÓòäì²(,û·®ÿЖ™@¨´·nÍÁt˜ïp~Y¤gÀ²ëú @Ç –ý[×èJ¥@Så›[±´a9à©3¥Z×À0¥@€/0u€\(§¯ˆËÑèŸrFø®1tÑO¹yÂï ïíøR^@y\G €¨…®ð_¹´$Ì%xÇ—išÀ4€?M>L„ËÇb´€¬þmÑzÿç Í’Ùþ‡­<=•SKÜä­÷ÿTî ,_2»0ÛËßzÿOó·îÔ#Ë—å§Ö¿åo½ÿ§ù©õoòÖû*çœÉä‘ÄÊÊ÷ ø­õþŸæ÷ ·ÞÿS9×Ç­üÚõK€„a±›ÒgÌÌñö ‚ÀúBdÒà…ßߨÖÊ=9kKĬ•Já>ŸæÏmñ%‡É WŠJ饨ɒó|åÅ}Òj PO$<ü×w¶D¦kïÑ-“®K®\ÅX)%N€+í5½°ñˆ±ÆøÌ·€™À7ÿ¼aî†hж~bFܽ¨Ñ†#ìuä54ú@?¡À¬9ÜüâFÈ~ÜÈäù+´b~8ŸS’7D*Ÿ‡¾Bg¼C%‘‹±Ð¡ÄÛ%¢±_y¥2ƒ+ò—·¶,?• a†ü}^ÀŠò[„ erkPÖ¿Aôtít5¸Rq…η;Àó%dÍ7 2øÏÙC’;=›bVFv€7WUÚrÝi½Š Àð j5Wv÷;@{DÅË[0¨¶RœY×ßñÐÛÆÖVí—‹tûýÿN/ì?‰Iê÷¿=ýçQŽö ¦±v³À¤ýÛÁôÖä` y0 69Ø€òˆž²uØ€älzõßWÀ”ù½ú¿?l@Q¯þïå`Z9¶ò³Sÿ °ëÕÿ}`â!Ø–Í&çÇ^ÞmG€ ȯϫÿûÒÁ”×çÕÿý`Šë‹ŽÄuØ€BC•IYȽú¿/l@Ñö|c®úh´Ur2…ƒq{Ay9€ÖC}òòòºÃ6gxáåêšAÀÉ-¶ »?„Ỽ¼xDmxOÇÿ;$Wóðõ¨š4 @¦Ž\{3‡™n_åÍ:ÊC¼…öQï…Ò6*%Ä7G…}`1Dc¬aI2_vßÙJ/wvÁ ¼Ç~?V‘JÙ…„­—–“ŸôçZÝ?ëòz[Å«Š=Ã7|OÓÎò3Þl—@`~Œ˜&³d[`lÏs € vún8â@èz_M$h{ùàöŽÐŒ¥U²¶T‚J™Ç!­§?nÿãK#`kÓOÃa2m~ei‡(F¤Ü²³|°HÙi@;X>½%ºQryç®ùw"'ps‡ù3'€<™Ï?ïÃ0–çÏĸʎ’q8Ó-a@޺ηN%·Õd¨ ßÖC-PÊjQ†oÐpû–ÒJ€þâјêåÖêMIÙÍŠ0œ{°ýjYÓÉVÛúO%Óªÿy”Çye¶Ñ6ÛíÊãC’”Ì«kgHžàÛ«À´ÜŒ«©œv÷4Ï”ìSÅÓ˜v·+ø íìSí•ý‰É­NÂgŒrÓ¦´–z~)š:OyAÜ©ü±‚Ýú·oj{õ–i”‡¹3í£Þ?Ðó»a}J;XFQ>>V2Ä ‚^ºŒ…túIXõè b®t?«1Ü4õDZöî¸3篗îhÒqzœEš€÷U3K®ñ˜±Æø\·€†«•Ænñy—„%ì(÷„2BŸ&#pÌNÂ’š>Ô­”ç €X *ÛÊ|Þòü¾Þ–hsÇùÛ7oõP?ÿU/©¾/Ê¡ë›VµÀe­Wôúá2²œ‚ÒÖÖ±nöTêoóà šV˜¹Ò>ÖÀå }T`‡7 ¬]vn§{u¯¬gÆ2p’´Œ°Á‹¤÷åÉpáçÂyÿ½]¹Ÿ_ûBÛ±)Ø':ÏYì´üSäÓª@O§çŸrÄÔ¦p§åh@< vÛ(°OXéô;©¡KŸO1ðyý“1µöø²ûäã[yùñ¯|ûuÆÇâêV°ÛÆŸë™Ò§ùâz^µ*wÇ®´ÆI×ô«Äø½ÙOß«Š>­ZŸuùôÖ¾½#â¨Ãˆ¦Ò×ÿo¯EÇÜc |.Z@&þíz¸U€ì·ó·0–ð7¯rܲ±„brà¢Âió%ÓÃv†h‹£V÷5âÏ «!ÚSJNÑ•wg@>‡Ï¿¹Ú,œqçùC}Yã¡Ú³Áã±E÷Óï¦Kju‰òi—n= /·3­Œô ÚkØI¦œaXÜJ©RÜú¶új”pD ðÛ&H¯Ö_B÷ô‚`°ª?­iËN\»ÇIè@Ýø¼Ë?Cñx·Ñþµá_`5üÞí‘Ý7 Ÿ5r»å_ZúÈÚvÀûa-¾ ò"ãCïó— ˆ Éë±ïýV-zoãÞYÇ[àN·@;±Þ]t§+5–?¶ÀØŸd ˜€OWšÆç~ºj;ÖæciÛ§¬o¿„i:í £| šÒÀŸtûM»ÿ£|l?œ˜ö4Þá–è’®pnÓVçúOèi£~ÍDE@œÅYnå A†ŸõÑ›œ Ñ[…w¼ LO ÎþêÍïc8öʯN)߇7ëÍïý2õÊ}xµ^¹žØ+?:¥~‡¦ÈoL‘ûÀнç÷žC{åÞ¬õF6×35žç¥Ô¡í#ëíOm#˜¬—~/Ä6"ï0U‡ßj]b•cÕóS¹½µh¦iùTwPòTA㣈Ðçq”í°þãác Œ-0¶ÀØc |>ZàÓG¸óŒæÛ‰Ã^å5ýÌöE? ÓŸ¡•ƒaå¨)ªS3hV r›Ùãônàún÷SóßVûõ92¤“Íu}õO:Ý·¾õ-p÷­Ô;v Äng¨F¸o ºgöÊ™a1êßŰcüšbŒ@Pc•]ØP"‘ÊÊsûC€GùžºáêùÃeŠ@ɾó‹@T®¾ó‹€+è¾ó«âð¨ß—_Ú¸ïü"œ;ÒW¾FX¬­N€sïõÉEÐÓZOû‹€óJ~IDÀQvOùŸð*n‘Óà“| -8-ÿ4ù´»s»ù§•ÿé•k\rOòc{{[c¨íåÁlÝC/<Ä¡_•‹)ÄòjX»æÌã_~† Âe&ÇÇÞùsz±v%`Ϫ€Çtoë„8 €iùͯûÙ-y“çfSQ nò{LŸ| Lüä3|÷Õhš|Z¾?ÔüŸük0¶ÀØŸêø4û÷³Ÿ!†)þ×@.C<3ðAs;ÍŽè_Jç¬zO$… Ñškà‘éP™X”le4N0~gÞ]Y^]íÆsñ±÷äŸg°‹Ÿ)P9€}Idåÿ{À]ú¯Íâ&‚-ºÍÅrdøôÞ»[¬Ùäf1±ëü0\ðGž¿rºÉ@ü~x:Ùº¥Yêd#”ùÖò‡l“ŸßZþÃùßZþBþ°q‹aÌ6¶ÀØc T[ MÃk·cãy€®jxåêÕ7~†ä9€”0øðuà€B‚wjlðß2£€WøgRPðü›UeWLî"»üöZYQDðJƒ9'ðϤ˜àÙÜKðÐëÄ Å¯føgRHìò!C^Ú¹sµ zø/ £¿†ÿLŠžÂà?ÐÙž= ^i?& /ÛOàŸIÃ+Ùþ™2<à6·7×7[_ßÜÚâÜ•“ÑnA€ qÛ«Ð]^ö€b¦cÛBÀ/äüÿÎy—Iè'‹Æìš[X˜Ûm¦Õ"tAìèпý[õ@›¶E4K‘PìÃ`¡ öÊ}´ó_]éœßwÀ2ãc2‡NØ[~xxŠ«oV#zÉëX¸k«óûîÕ[¾ïa½rßÁz律Ùõo_ïœß÷°Jç›'èÁö‡‹ÿñÌ,.X„×&=uÉhlÛå’ xÅØ2œÿN—¯Êd×} °Ã6ûøÇÍxòøñã€ûîúÒÿðÃAü‚Òët=ô{á}Uj—‹±þ¿†ÿåq)/×è¼/_Yölg;¾Cçà7Þ Ú¹Á à'ê#ØXÞ9@7¬ òò#@*ÿFF0â-2TòÇw>æ3MÊUïÎÃúÈówO7Ù{CgÁÇï‡Öè!ß¾•5ü _þå{nOî¹òÿü–ò?ø;…¿÷VÎÿÁáün%ÿÇÜãÆÓ-0¶Àg¯ld ‹»Ü+k7ÑUû×ýy®ÿWð¿? Îo\yŸP¸x1®Úê¿À¿¥òÝn«ÿ!%w°Å‚Kù„Ðÿ þ-åÙmõ_àßRcØâ?Á¿¥ä[ýø·Tƒ(†ND•ŠCÿÿ{*ÈY.þü÷ÖÐÿ þ-e³C[ü'ø·Ôi?[ü'ø·”·Ÿ-þü[êd·Å‚Kñhl®¯CÀãrà:Žˆÿ[Zƒ'úÆwdHÞ,/»½«DýÈ .`u5'Î7çßÁ´°y§Á7ð?@ºÈ$h<ÅŠø×ƒ E@mŠì(ÕÍ=ù¤²' }Pw‰rÏ.HÚøº@ §óX!¸Œ˜¿öÌ¡Š‚²ó/-uÎïù§²íßáÐ ÅAõÍ‹ÑÇD0uòûþŽ>¦Ç¤÷üž]ê-ßL½rÏ/õÊ=Ãdçßèúâ'LüNøŸ€¶¾ò?¢qîSZŒ[\_€/Åò3U–ÏŸ:ßpÆÂåè2ç:äâpþ;]¾¶×ú ¾gjð°ðøÁ¦9~Ðm/mëoÓ<Þ4ø5×à}ê®?™ëÿkø_ŽpÆ/Öè÷®AË{:ñYõ½q¨iÈÄÜÀÿMƒŸÅ ÔÐÞ!Òò[`¯ ÿ:qn˳ϴƒrÞ'ÊNZóSy,€bŽ0'o½åÒŸ&÷Ö[Å!Ižnþ—_Ίl&n»X¦Oótó¯¯Oc&7n¼ÒO©>4l×ÖG©ó•5A@ûÉ Àcv;é´ü©ù=›pÇÊçÝŸ¦Áð™½ý¸°ãÍêêqØ`-m»ÕmÀ_]mðKq›è½ÒT\5¥)0~ÑýAäø_ ÿª÷¾#C€ŸP?þ¤ÞÓ= FÀ„*)?1XÛœŸ; ÿgU(¬¡.tœ¡|6ïñÝo]-þ¯þèÇ âŸ¼õO/¿\7'ñ—ÉË–ù_~éÑå—ã“íßoll—Çl†_&[ ¥lc~@sN&7î{,˜l^ßR˜Ìϯ½ºµ3%,ÿŸýò.â”ÿÝï~÷ XÍßÉÍL.ÿ‹“'OZþï}ÿ{ÿâç;Íÿá¿øæw¾ý{7'˜UÝu|§ù?˜;vìnÿ¹g/L  °“úÇŽ-0¶ÀØÓ[Êà?ð?À¿¥¡€ÍÁjåÊz– êXD~ÞΦú©àùžõ"~¯`Àŋ˭€s\÷Ý* ÚÜi “&ü+q0¿þŸ€ã¹¶4ÊìØçÚmШµ~ãºÐÈÁ×ýƒ@Ovi¡‡õÿîÔM •©j4zNÁuÿ ‚=®û €jûqÝ?h`—+üA šëþA h(õ› úÈ:LZ‰ù¬ŒUúþD¥Xÿ7fÉ,‚Š@9³yçÍó »ˆà?:HsþÍ–˜ûíqyøãñâÛmèvq@~: @<€ÐñM6ÁÁ°y¾–]`1 ôN˜¾ª¨¬º·ÇÀ­ZþS¦B€r^(ýÓ He€xþ ¸É /¾@}¿î ³œ>A€ TþéÓeùtž¿SP,aþkpQ€¿%ª`'Ö¯9zTç?z„A¨|û1IîÐ: PÖïÆ å¿ñ‚(åfî¥: ÀóCݤ,8Ë– tþVC *ÌÑ H€[¿naÈûȳÜN½Ý:4ŒjûJï¯wÏÂöæŽo²oòûáù4ûßT·S pŸ\Pí0ÿG~£îDû{ ¥Àê2/>úƒ‡ÒåÕbýŸ7æ/ôu£\\1à–büÎýê5±i=õÜb‰_ÕKr³~ZÿW©ÀŸ»NÓò£@*Œ…ŽÔ4‹MÃÛÿú…÷ßÇX¸³'fÚñ·+ŸÖ-¾øÅ/V™TðÿOßúÑÿù­·îžðR'иïå*U"0yù¥þù/Ýëµû÷Oüóÿ^ªÜœ\7 ‚ÿ·Ö×ç>¨0¹ñòËÿä ¬ l ©Ì/®¯•ôô¦šl|yq~—'¾ÿÝïîT`rùäÉï{à¯/~ï¯wª0ùÝ·¿óâaâO9²S*@@ùŸ}î¨0í†ò±ÆØy L€ÿeØ  r=¯E98Cz²bcOø?ej¤¯Øj †Éú ÷øï݈Ãôù3¬þ_…ñÿÕŸÁ8ž¡ÿŸO&X²”ÿ{Ïÿõ dNÄj üUÊÿõòù³”ÿûgIù¿sq—‘S²Kù¿ç i;jÚšwÏTC)ÿ×NÁ¥ü?ÔÀRþ¯@df$À`v)ÿ—Ù±àžE(€}´= ký†ù¿E+0\ýÇ‚¼¦²÷_…÷?£¤`N¬~ïÿíßš…Ë 1úy÷·k&28~ ~æçÿâƒ_– ? @*A€ÛÁÇ6µý#pY@Â.ðP`½HÀ à €«ðÀù*7€$Rü³¹ðº&Ú$°ðÕ!n §#p¢J€èÚ¬^ nI¤øXÿˆÎOn=p¤JÀùW…xOùIܨÂú"à@ÿÃ(èÝÏkÑD %à@ÏøÀ“Ôp2ì:wïÎá4ÿÔò0‹õ÷© ¦oôƒÀº»¸Ï}eËmõS+žðž7è8ûw ¯àÇüÄÿÁù£œø.ZíýÀßpS4b~âøñ°£ü·uC?¾Ìû{(ùl–¯a\[Z½|å2À6×–±[z|áÞÃ`Ï͇ƒÀ7è&ÐÃòº«ÀƒgÓ‚fõê ý¨{£-ùTõ°ísûúP;Àö¬žk0Ê_YÆGƒ€¿g…n«¡“ âÿ¦y&QS–ôÙôºW}·”*DC·{(ˆÍ,Ýä‹GV€ÉOËõÿ›“«?ýéÅýøG?&ž`¥éŸþ©Tð @wý‚åï?úèKøÇüÛÿ;_ÛÛ¿ï`pc&Ûåú?~Z‡ À€9‰€ÿÉ \ßлÄ=™_\XÛ‘ ð¤û'ßý›ï^º´“%ôÉäÒ¥“ç ÿSà¿÷öÛ;Ëÿ«¿øÍÿÈÑ#O?½³ü-þ§ Àß_¸ð÷;É?Ko[`l?ø íîT  ö3øÿ$S×Ížà?ð?ßîJÝàbJNì«;±—và<çwç© ”šåü_†öW<üß·¯ nrõ•É¢°uïÙį‡Ífü5 …Ø2?×^éÓ‡J~Å^³ÒÍ»r~Î6xˆb3¹E^£L‹°=ù±2ig¨.Q*:åøîFjãäÊËm ¨ZC®ÍÚ)*žÚžB­ÓV³ciÖ·P¹HK½lãx‹ÓV$©fó­Ó&BYÿƒð ð h6T ð7NËþ²  0äÌ@œz}èG@æÁa=þ±ü/‘ËÀë² €€•Ôplaþ¡ƒ4àP ‰Ôvi«I/”Ðÿ§làŽ"ò%Ð €âOÐ cXT  ð´¨z‘¤#èÿÓ € 7›ó§|ý|è`ÉÑ 6ôGÅÍc èƒúÿ´¨ØP@!(h”â‘¢|Å— @Å€:Š/A+44½M´ç°?ƒKÐ 6(ÿÈÃYù´C‚þ?­`uæ `†— lrù™€þ?­Ð×èn"¯>@ÿŸVèh8ÿÚB8˜Ÿv! 﫺iþ„²ß²7 tÊÖe`ÐóOËo9û2ëÙTåúŽq¯ÆJö !*»÷ÀÿPÃ2è6L¼&‘›ÀÿÁÅiRKÕÿ©å$/§~?ô\»lÒ·ÀÿRÈZÂïðAþ.Z+åCi÷ìY|ô”Os£’—´Hoš‹Ó¼~õ¶üôýºÿ“õa×Ó€ò4vW.CϾá-Fï/#¾pˆT<:BÒÈœ‰+Ï z³¾¹ÙàÜWŒÝV¾WÂa-Bõ„àËúU`9à~ùË_Ò†àŠ6Pâ¯â6þmÎ…‰EÚ¸pãýÅ÷ËÞ\íÝé›H3ˆþÏ8¢ƒrÑÖùdÌõE%€ðÓŸþôå‹þïôc#p·Át €·D<ú£zƒø×/=~ÏãR5`òÿ“{žÍŽpþuʺÌÀÖ:ìåø¯êQ¥É?ý“W  ÀÖÖ6 ú‹‹“¾Â*Í9Ù5‡ÃL€6ó739{vf%z‹·l$¾ÿÿø fÏÿâá f ßi €£G'ø›uÈ€öÿÝQ@Àß_Àë{æü³žgÜ«+¹í”$¨ÀNfû¡–öp⃠,µMì‰õ]×ç72E~/7>$=åÿ¿  §|{fy“{ò³ó…BçËê÷Y™!ì'9ßWY¬±¯‚ÞÇO,´g·‹/ãw•6/¼‚¨ÄÜàñ’œ¾l ƒsƒ‡´kô FìÆÁtï’Ó¦F½ÄO§ªwÐr¬Õ/;@Vsý‚cO;fåÃ&(×DÀjÚ\¸Àa­qÇhÕÌÏëÿx3ôÈÕ{D6X=“Ê1jôk€¢uÝ÷øá­r¢¿³}ñ‹ýbW `òÓŸ–üoÿ¿üxpÍÇïÇÁtmŒxéÿÞµxô¯þä_¥ù×767·;^~¿) ôÐ7ÙZ_$üî÷ Þ`{óúõ €ÉÚüÚââŽ"@ìî'¼ €³;YAŸLÎ’ð&ßÿ€i|áW/¾øâáoz:V:º³óp<5ðî]w}VÆ¡±žc Œ-ði‘t­‹·/æõ~õ?pÉ»*©@ö*³öÿU'ö@s€˜ßAÛÿâÅ••‹+XüG(ìrùßrУà¡û-øÛww@ØïÑ à?H˜ vŸvâ~ü·Ï²{™k¶ÀTÃþF˜6@'õûÿÁS[‚Ðä›-UCÿrÒV2÷ßp} J˜$˜+.þ& ö@p¡}9Ä”Tþä€Jj4¸Çʼô¯sÇø(%,.ÌÍ-ÌósQ Ž?b‹‰áü ôþ…ÿáüßìdÜÁ£:»iû›u ´9åùÀ# ܿ˜ü^Ú›OиŸþ‡Š1ЧMÐN‚f(ÚJ`€É¯ÅŸJ£@ÖHX J42Ms:aÌxøç÷N4ÒîÓöÿãü~3^-`ñoÑ%]`ðSÂ4ð.!üUX~ïÙÝ^s㽦±0/W‰ÿ `o @I@©ÄLºÀ4ÍFÊ÷@ xD´nˆ?k«ÛÜ  @ÿ,žÝ­á{®Êps¥ †éC74€Î€šA—úß:;»õ‰Wû¹a€^àDE?É·HIÈÌ_µô-‹u"®1æÏ €˜?Ês [>^5€jù9ÐÍOöÉdù?#oò›71ôè} Zc·|¯–Ëôñ_|å1Í9<؈øÂCxÔOK‡Ÿæšf㊉1¶Ð½H‡€ÎÊÇMæà‘@Þ d¾¼@JàØkxq+÷Zýòtƒ’‹h.ö?Åò¹qì~Pð6þN¸ÅEwC ä^IZfXË翌ÁRʹÂAæ0¾“ò&E‰÷×þ‡}pöu·/~ðÂôt¬&]à­ÿh_†ê'{+*rÂO°üÒãÿ*Ï¿¶q½ëÀûèÛPËïµË @a…|ôþ °¸¶/3¯€ÿýÏæ ÿ{ €³;p€"Bþ¿&°7€“ɇÀÿ© îÛÜN&'Îÿìs0Ý~fâ±¢c |VZÀÆLúäâ­ß ` °ú•’wUT0#Ì«±ø˜r=sXt,º‹{^À¿••7°B%ôß!¸ê* €:û0 gfÔ(—7âÊ @$úU@Hùºª@½¿üßg€\³{€^€gèÍÍÔ úüõa­úË Àÿ¯`vù¿Kø•ÿ™i´‰˜«Hð@€â¸å¢¾ÿvô CÙ˜ €–ûA+ý32Õ*y ð?^øPþÇê?ð: ÄÐðð¾â0îÖ"ññŽÛrq¨dC8þ¹ƒß’ÖþåøOé|…“ˆAT„gè–@~ÎÊ~ À? Èñ­ˆu±´¢€ô@‰:ÿÚ<]þc 9ý´ÑR[ùbý  ji“€Ž;eî3u~âZdù öëüø*Žì+ѹTm"'ú¹ðO¢#“úƒüçÂ?]€xO^,5 ÿú!À¿(W=à œ€6×p"!0þÙÒ?ýk˜Ÿ8~f}PÞ;,~'Û­>O÷@uðW[[î™ä;€¤þò#P=Á«¯º Æ  W À¹³gåç¡Z¬ÿï»Èk»ˆ•S0Û×»yu:þ¼f±‰B+Y}èã„ ¢™´ï±ÍoÁKKµ„òM xiÉ @y¦@ §|ÓnT:ùM@4TZ¿t$²·eµù[É'&ÇÛøßõ1ðö àĉ¦‚ÿõXë¡æÆ¹Ô¾¨yè¡F£ŠÜ„á¥$šK8!× ž@tÄ`iæ`¡äæó^’áÓ ÞàÈ}à@¥~ÇÛ0†s¿ÜSpø|êØЫ  —y³ýúë ÷»Ã^}»™Ç‘<2üËÞûùõ™ýŸŒ¯Â;'[ÀÒ?ä©âíÚ„ä|qÕ;È=ž¿—ÀÒ?\þw½LV2å~¬®_½ú£•œ˜<7PH1ôD ´È€ ô_zô_)' € >y~)tTà3ýà†ÿéF@~{ÝL `F7€ÿ_ÿúüŸüòÏR±g¢ÿ…ÿ[“É%13R€ÿ¿{ߌKöPÿ'0#øüüØS±¶`F  wàc Œ-p+-@€˜‚ ‹H!¥o/ü<ì·V~)Ç|Ó˜e´§Ú7ÈYµy ¤ fÇžÕv…>Àþ{.®¼`ð? €}‹»RGÞ@@Å@jû2!@­©¼ê¿ÀgycF hÔ¦Ï@ÿ2ý¯Äþ$Ì@ åoPê¼ÚKpÙÛ´öÏ,Ëö{ì¼‚@Kt.ÑtÿM «-û®ÙDõ3H'O@úÐø'°‰ØÓšGÿÇÉVüñwxŸzÛ…ÀHx¼O;ÌIü¯‰>ìÿéûOÊÿ—åûïüùmo Z ÃžAwíZF‡@Žÿ1ë&Orv©kh._¦‰"H€I¡Ï…v¡b¬ç;…ÌT Àüæ’!±ï €æêUÌÌÿ93×$ÖqªÞÎå°Ìt³‘  ÀëYt;?A¿ù tfà RBüv~†pŽ•ˆùÉøóƒÈÎ¥~.þK€É R {d‰$¹B¶*Ô0Ðoþ%B¶*$¸ø/&-þÌ@l F““¤€AÓ ç†ñéuo‹ÿшõEtÊM8+‹Ú ‘VDI¸cè´cªå³xh,È V† b* •ùÏž…röwÝ«ðÐM°ÿü¿éöá_÷ñ(FvOÏ@k<@• ¬$ævI´+ü!ÿþ5ï Èä{×¼€žòs [þ®5ï 'N´ñZÍì½êþ^Ç|²r¼ö6¨†ÄÏÚý½é@@…v÷î6p?“Œ H”(4Âý+gR àÈwÅTŒB$7@fyõÚj³œÄÿØä“X¨õ„ïy•ú\«Í¥§Èü’Ú%2€ùÉu—¯¾qøàëPZÌ|„˜ÿÞL »>››m;C:‹†#>’1##ø¾âK+{¯¥Ï.Öÿ{ @€¨QÕ¼þhå×T··äÞþ¿ú«° /€ð|ú‡ôVPÁ @›À,ÿàåG/5þ3Üþ~;ÉÍ}OÀ @›¶¶××Ô·—ððápý>Øù¨uÜÉÚú®@T;vö#àÿÂ׿þgú/žˆ÷œ% `†üÿÏŸ={OX¿çQ3äÿðwÔÿ‡Àƒ!ÿ½6%!0C~Á(<€»žC‚ )€éùÇ#Æ[`l[NÓÄHïÇmó¼â4þïxh³Û¢¨WhÕÇh uÔŠ#@"s.îSûjÐþ#°²ÇËÄÿ vãTË©§@ú^7ô_QÖ~KôÞþ¿£Uÿ{l¼€\Vm¸úßO@èˆàô[*¹À 2%ÐßGk·y+cÿ™Ò¿ÙþWœD€~ ­ú"ÿö #ÌößÛÿçã8ÁêŸVTÐê?¶²Šn Vÿ´0üÏM]Íòò*}þ]“ð5tõç°òî šÈÄý2Ì;]ø °Ÿê×»v­h­˜[íšü+Q7ñ¢…2Ïáú㌈ÄX”T@ØÁôm‰¡(©J‰ÂeŠÄ`”˜¦ŸŠÀʼÿ¡|FDb4ÊÌ‹ÐóØc°`Ø+)j?uv`5üµ'i‰á(›æ‘G" O@@ÞÂ΀8Ä@r ‚èüPÈ*°ÿðÃTù—œ­á‰ @ÃÅFDb¬Iª´Ü–ûÏœx%$†š¤@+GÀ?` ð’3ØdÚþpý‡?ÔŸAkêÈ 9€~0Oß$*ýI$C Nøäè®’Ð3EôIa¢/7 l¡nv·ÿë$Ðq{”ôe  ç÷?` @MÌKþÐãfoŠù¹wªHc› é;T3YSó¥PEEWp{Í4B¬“H „ t°Æ8€1[> Òdkz=TÊ7 ™è”V­X?|G­éÎVò›@tâó'­àÖ¤bÒ‡â0„}\òʦò[8€Pâk‚}€|ù÷°ðvéH_×Þ<ôFóÐ tTº²"G#mè*°íÃ6Žƒ“8”/¬ÿ‡5úæÚµåUá(ô»0ÙÆÂÿ°ð§ö§ó.ѸGÀßœ¥À´ü—Ï ÿŸø¿GÀ?^¢À´ürõŸÿ#`h0-ÿß¼ qþJýù«=küql±Æèk‚Øý¢È Rž45V”=1ÚÑOžàÇ–™Ð6s £kYyÓö¥`_AvÁŸkÕ à?𿌠 €{ @ €=A`ù¬v·€ÿ@tÞ²-l÷Zµé{ê°\ßäAdÊúö÷·Ê¼ @(trþä—þ£€rª¬þwf ¼óÿ€üheÓD[³â!@Z-PTÐý[ ðhqÚÿôÊžµ’wþ'ì_ûÐP,ª(, SÌ°ŽˆUXÕ—Ç  @áÀ\ùçÚ•ÿ©­Ï0}ˆÜ×^Þ®s¯½÷Ú9_+WV‚&ñÍ@ÐcH€:¸2=ðÉ1T4€LH€øÛ¿Íç¿ T?`z  *­À“ #k|«€X>h©à“H;_ƒ5YÚ¯+@›'ÚlñHLÜ¥@€åã;/4€@-?‚Øù x ÿ@üˆ`b›P>¾CÐ,ØM@€¨Ð`åŸù@&$ÀD€+ÿ”#€ð €äúcû€ žßÙ  €:€Ö£óDþ¿ÐoFOc…¨&­0Zª9ÙðuPøÈúORðù¨ïî7 Jð1üÿÝ/÷Të©>žˆ5¨â”Æ“|þý‘€ÿ}1‡üGÀˆÈVà“ü€þHÀÿiþDèü_/ÿäš÷ÐW> ?ð=ÿî5ï ×Ho[jäMxÏ@(¾(4lZõÝ> aôÁXѾUp§Éá Eð¿HàÿßGl;) !»÷Q@ÝØÿ¡ ‡A’}Àÿö› /¼?0Ѐ¦Ñ6Þxá¡ÜÒ¾îIöœÕkЛÆC8ƒap­Ñs PZ߀ 9TôKüC±úðÀþ|\̆²p@Å„1V'h @îQ¸ÿkϸ%¸çƒñ?$Ôˆ0¿˜žæÙw:–‘°LÙmÆërù_ òÜ`žr­oyn°é^{ü¶¼Øø”^ÿíü2@*îðÿÙ#_¤÷TZXjþ‡~ÿUþÿÑ?þ—€ w`lçŸZ¾üèK?øÿòòþêÑ—ð¹œðø{þ÷ ƒòl´ùç¾×ÿúÆúÂ"U:(KÿL È”ª@€n@lÿž©¤&ë´Xœ_[ßÏPÓå§æ?j²8ÿ§ÿ}b@/à»`”êùMQ@Xÿg3Oî°@©žÿwòŸÐ?R‹ÿ#€ÛÇÅýº-5ÿ™t¨¬Öù_îÂßà àÂ…ß~ðþf³eèÇÇßÇ[`lµ@;Lóµ³g÷Ð €ô-äö՘͛±G¼Ý¾¨ÿe\ Üï_a æ:ŒÀåÑ5G€ˆý·ºý`<Ê|¬€8€•@`õŸÊÿ»Aà|QrÕ_+ÿu€Ör¿? @`€¨º îÿ# Pô¯àþOø_ÁÊý‘Š–•N>#ì¯øô@ˆX÷Yÿ§6eÀdšÖöyÿ“ë¿è  ‰lÍßôÿyê PFÀiP Ø1uÚÚØëÿRð·òøÇS›Ù?Tÿþ‡0€$˜ŒW’Õ?·¯zü/7ý\‘÷ÊÿZçnÎSA?<»Î½wã½s§O`òº¼råÃ++ËR€w@ψ ãsÈ`€•áÅl„ÿQ6”ÊœrËQ­€²x'€¦‡ê=iµ…˜ @ÿÇ#ÑóÌ `ßúuph¯[~p˜èÁf48,’/ :&æö&yù x}Á  FŸÔÀ–"©÷/'€ ;€Ø>¡üà° œ¬’w¸Ðs}Á   ]Ã(XÒ°W¹ÁbC}€êý§“þ¯øto·ƒ€_øÿú×÷×5T<‹Ð=õ @íìl@|÷Ë_î[†ÿ:¥'ò³ë)ñÒ±ðaTKûðD š¬©ƒ…øòÏX> ºXC€•ïëG€.ÖÄG t †£ø!Oñ` ùb¬<üö^€½ú&—ÆüÄÿ€#þ—'€'+øŸ†>U€Îý€ø©þ/mXýó'O¼€RªÿKÙˆÜÀ ì±tOŸ¶ Ç‚¤ 0 nkôÆÀÁ0€œ¦ Í ×À@ ‹ÿo6˜] í(1z2Àíæ)X<õjE~€ €EX(¢ê'Ï_ý·â:xY+;z@LùóO¹€aL]¹©7†”Ë_³wX’ºùe`©ì_<+iŠ ×ÿW~´²òÓŸþøÍŸ¾õÖÊËüyžð?¡w»Öð=úþý•>~ðƒ¼ôøK.çøŸfúÀÿtðŸ€ýÉ¿kwFü[€vÿÖÿItð?¡¿_ûð'É“­­-*øQ €¿ô7('ð±¨/:p) ‚äw¡ûÏ´kþ¿ÿÓùV ße4êÔlhøï×þOŠèÍhÔ¨ÙÀðÿWaí¿‡Óg `†ÿ!u €À@ àïÿ~´è"GÁØc ÌÞqFnÆáÆ Câmuèûã[sSy6ç";—9¡ ½0­ñðŸ ÿ˜ŸoìÇøR³hÞ@û’ €)XjO~ñ0 €jìÛ½DþݴHK bàÎ]®ó±ÞP‹ª€HxO€ùÁûë–ðÕj@ €ÚØy~Áþ°K´.-Öas …ýtw é ñû \`N|Øù›5ü=I݆Úzçÿ¹ ýC¦Áÿ<€5ÚLQÄ#~|¹ˆV%h øPØötrmêÿ4(5€«)èúƒÿqöA[NÐÕ¹¾u€Ÿ}KºÿÀýÞ•©u€Çÿ\^' `€W#àWþÍË|ô㓈á°L³º¸€]Ä‹H5ôlø¦*Oì3>õ>aS•°ú¸¹ÿ§+Àêóî\Öå €®ërk º¬ËÍý?]Öåæ® y$P1SÀ  ¸Ì € 7G€tX?¿È`]nîÿÍû_n n’ÿZ ?ðOùTîà__~@$àÿ4ÚÔnukikHààÖ­! €ù­¹­uª‹?ß÷ó! €³[§·ÀÀZ§ìà×Ñí·.lA / Õz`ÜS>~Àûø€Ê´€q´ÿ ‡ÆMY˜m½µàÿÁãÇ›kdVéJ$œ¡X£ç; CêÄù#p©†ÿA`ž±H = %èÞ©¹r'aµPÁ_‡6BMY_š.œuŠò(È×.‚ÕB €ÿµ5€2@zó{ì¼ ×@€GŽ Àd`H¼¼ò#âþÕŸ®üùV–ôf'2¢çO ‚üÉãÿÝ£ýî#ðWõø¿~úŠ`צÉïÿ^¼ÿ ÜÿÿL[§ò's»À´ÿ¨ЪXòûïÍDDD’Ÿ€9ù‘)=>ç×мTÀÆââz'ô Wþw-À÷?€¹]úgÿmNû׃mØ×GÃ[úGø?lœÌ øÞ÷¾/àÁÀ ÈOÃÿÃaõ?· €t,=À¯ÒýþÛÊ¿ÿ*5ààu@ÿFo•WàøÓØc ì¬Â8üÅç¨CŠ7)MIïÏ€ƒÒo¶Pg`”¡¦¦ýÞ·ŸkæÃº?_ºðRRR’3G€¡¦|uè ò {¯\<,Žûþ‘¥®à¯wšaG@t@v€Íø¼ó?}ï½”ù!H5ÿ+^ˆøÍôßìÿñYhŠrÍßþ×Çÿ›-±å@Lß|ÿáÞ¬ªkãæ—膕ÿj$@SÈÃ0B;,cQ))P,mñEÉ)"pæ=ü/Ñ ÐfYöÔþ¿ãÀb@ÀG œq Ó˜üóÅÊ>€à]P $´òµ:ê£ù?\ôÃBÿüXí«úP 1€Žâ[@J°ötàù8x´Ü›6$€¾¬»TÓ‹ó½—(ß›is+?¦è§ª1ÙépiIaº»Iu´/ôÈ-à#œî‘[ @èÁöÈ-àÒÒµ¹|øá£¥¼1•#ÑØÙôÝΞ9sƒr˜—R‰]dcc»çü“Óy 11wïâÿcûгuµZœ<_}ÉG¨Þˆ ÿó€¾[ô*ÕêÙYxOW_,ÿcýŸ }Eô”ìó‹ÝÀÿ|`Q××ßcë$ÖI=gÿùau ˜ÿ: €uiþ(ß»N`À-•¿ë,à³$fÏŸq4W©%Þw ú_ r8Š#}Û›ÿâ›ßìW@ü;íNÔžPèÿ¿îÞÇ?S¨ž‚0¹# :49‚‡…Õò`ÛëR]ÚoNÅ\òç<@†â?(+ð**0½½0; –ŽåþÕkð4píZC€cv}¥@Æ1`õP†6ËÑC.†_ `Àÿø¨ÈÈp…„E‡‚À. wàÿÌ`xü0ÿBÿÓ ¼¤U@~Ûyèºÿã£<ÿo~‘ ¡ÿé V>ÿäñ¿ºruòè¾,¿¼òçW~ôp%@5`YÿÿäqDxy9áOþ›Ç}éåÉó¥Çÿ×µ÷¿{ô¥?ù«Â@}s ï_ýÿ&Û›kAË‚+_XŸÐqêüÌ ¨PjLnDÓDðí&Šð@ZÜ)‚~¾ve@M€°ögŠ2Î=?÷õ] $ve±??©è«Kxà¯/! êÇÅÿ¿þþ÷¤ð½¿Ð! úÿ‹ïßß9œP(b¾þÈáè«J(̱c¤Ž{:Õx~_×'¾á`$_U£pl±fiHÜÿüó÷c®&#R}?Ÿ795 ð?f8š¨ú7[ÓðÍg˜ž€gŒ“÷ǘ4™—úmPçÏÓ ¡¨?ÃÀž•ö¼ÚÿÊS5¨ÚÐkyFH ;&yŒÞÿ¹wÓ%×ý£;€¤€ˆýÀ¥’ì‘ð$@vsÔ4 ÀÕ²\À KäNÊêçƒ2@1ƒ àÿyî @€¬Jˆ i”ŒÿUk©H/ ›Á)iË!@~àAÒ„aáß;ÌŠ¶µ¨Ð×»ES6Haõ!Ôü8MìH`¹Ô‰”ä}.¨Ðzb'§a'ÖþªïŠXècµ* Ý]s§-4Ã7¸U.<ÿ× wu .ºˆÿ뀻¯ÿ$ $\Ük¦Ótþ¯ðþBêù¯-]£|ÖåGÆä‡ø¿K`ȹéí&§ü/àС²}nœ¹A7ø¤üÆR¾½A¥àÿ:à6°jEü_'àÃËx.Þu¢”„þ–t»j#¾ºñjõêCW X¸–ÙwÕ~ ƒ›0˜ÇÿžÌ¡¯×Å”ýÿßü—nSîä …Ò¯o ÀÚ¦bZCy©_î×ê°4›|3zâ ÿÄ&œ¬m>‘æOË_Ú„€µMihÕÊGýõ•?÷·gwí:û·Á†¢S?Žt¦ØÔÖ/}ˆ¡ÓTª7Ÿá?iD:°’|„I© Tå÷ìÛwÏ=÷àœ¬°ER¬ø§0G "«ghôˆ›on¢cO³èé`„ïQ&É‘ Q?N@†–ÀëÌð?=r6ð Ø\ºÒ=K³ÿ Môœŧ$¸t#@8øåSÖ89`ËûÍÉËWöoÃ`ID}–è}ˆãƒ°Ön1\úc–-V§¸¬Atʤv‹ñàúƒàÁÿw'ú´ïK¹ýdr °Bì¿ÓüßøÿþÀ_þOðùv™ÿW‡¿ù‹ tðïÛ“ï|óÅÃßLóKó 4@ü~ºÌþ= @mûÂÀsÏ=£Ïçž{VQG7½¯¹Q0¶ÀØ3¶@K`ñ+ÿ÷kmwC ¨ßlúÿÞþßäXéÁý¸ƒ·Ÿªj1~º bZ€+œ¦ xÁ ÀAñåðžãË€}ÐTÀ4c´­"Y i%Dc€´¨o~Ýù): ›ß5vÍjð¡_²>°5"8µšNäûé*U¼±XZ€bÿ%$@>õМØTÿCÀ@øÍ7™ÙÿÒÈ¢˜axåžq*`±rÀ¸ªþ[D@ûo‰Í¬,‰€JÈç@Þò.`©ãÍÖ½æ?JPN ˆû'Ê¢Rð °í:ª¬þ ÿþéà8¶é œ‚pŸG­®BíàN3€ö º¯´Îçêÿ• À•óô ñ¿šï-þÃÔ»Élü§0ìt®î ~ê ça•Ë÷K—|3l@~) М—úÆ©ó¶þ”u½øŒ2 |t“¨))ÆÝiÃFwöJýpï¢ 59âöšþÖä×®-Áî3hlÔäGÂ×$U°QÈF…í‘ù`Çé€6 €õÂ7 ZBl@ŽØ€yûmoo\‡7i5„!5Æð²(ñZ¾«\é±ë¯?uo}~¬åï[öÒÁâ{×­vƒ)<8ÓŽ«ÂÅFX¯ÔÀˆÇÖ¶^}ˈÇ]/ÿY'°ÎÁÎÏX’åß¿¶õÄ[>@VG“ï]ÛZZÚòA*åŸ\'°N Zþ €‚ÏÙ©}ýv¯“Xg÷+ò#—­å#Ÿÿj0Æá{Òõ X8È¥y>kJ(“áƒ0æ];Üæ4Vÿ¡ÿïªþÉÍë\ýÇÿ («Æ(Ögýñfõõ|3æGýôd€ð …±9!6^×J'hÏð €¾ƒÜüDÀZ Òœ´º…e7ÌHLÌÍ¼Ê  õŒ‚ 5Ú ?þ˼oÀu¸ûí7ÁÚÔã–€@Cïÿ d¾þõÉ»î'®ïÒãÄüÿßÓOÜ“0“Ç/…üoï»û{ßûë Iü»Ý!°äÿ‹ÉnàþÃßùæáÉá÷íɃ¿ùŸþ—ÄþÿßËðôäi&Pþ8¬òO.Ü ÌÿÜÝ2à{æ™gàÝ‘˜ò®Åc Œ-0µüåñ8íþ°P€~–ÔÂO¤…ù¥ Y“€Æ¦XV€/É^hT@Z9)HÓÒyÀ3P1G.îÙC`å08€ÃFœ8½è6v¥‹Ð˜way€Ú£‘ ÈˇÄãwÁ½DÈõþK¶`ï 2ù 8 ÀM`± @C[Y?¡ôÞõ¿{ è«tè¯øwTñÖ$=þ·0€å$œ°ß”ÿé$ž4@nåÐ:ô[Ù2²`?ZúH°%"’6'€ .µI\ÿa7[ÿ—¿ÿh`feX#è ½B¨m’X§ò'”t÷'äàpÜOI‘SpŸúª…`‡gªÐ=ý°ú²þþ³1+àÿ´ ¥ñOûðùù§ £÷¶’ÛË˜× xðIü;ØYtˆ0pYö°>blÅBÜ%L<ý©À¾—©È²üUL<ý©PàW1©ö§@€v6°?õê°Àõêìƒ1ó¥@€û`êÔ ¸ÿö§@× ®¾G0ðì¦y½REØÝ€f °?õè°#߆v¦¥Ô¨pAìO=€:€;Œ±‹z=+´SÓ€täcÖ'«ÚýÙ}Çí= ·èl(œá:j‡û¾‘(Äa0¢‡I¹ðC½ øê»›p°¶I®ÕFËräÏäÙâ¬åJË?» 'k›g{Ë'‹¡Y7ÿžM8XÛ”º“ݨv˜m¤¾´ÔèÛ¦hðÜ1}€Ñ@* å879Ð?¨Äòˆ/½{ܾ üsu€Ì××ATJ§êÀÿþÁÀ…÷+ ṜôÕ»I^ùÙÔï?âg´.4¢ ÀÁ'·ÑV'HÎ!:,<"îEÀSú蜂𞾆0ŒÖ{hq@b`ÀsûÓ ``ò0€dFúôì¹Ë?û_“è0"¤ %:à°z ?ê%¤ €>À4ÈI¤f6?‚ÀËoÝ@{ûö=ºoò£_-}ððøÞG±üÏmòv…ùÑÇ_ž¼€ÉäKÿê¿þÒä¥GKÿ¼1{¿ÿóo®Q Í¿€]Xô‡Ò…À -úO&{I0<þ'ÜÃŽ1( Àõ͉ âÀh0Ùš3À¯3‰˜+Ðö’É4žxbrŸO“'æ@Üg5œÿ‹€v “v¾;I°£•ÿxˆv<0y{ßdòýï¯Íà¯'©ÀäÃÉ7¿ø‹É]»ü¯Dšü»#Pxð²˜ÿ‹¸×’vŽLR#€Étß§'wCAŽ÷&˜\xæ®É3Xøögâ4F#€[|ÙÆ[ ´@FÀ€€–ð‡Éï?Í›ÍþŸcÒÖ2qq>†hûŽi©„À@ à±dšmöÑTúgJÝp)ú"p?þVôIËÿ}ˆ–³×AI`þ X€ž Hî2ð0LLw™>Ÿb(ô É ÉЭï³ãJ@aؼjaq ïÀ1úºH€´Âáu;9ßP÷†Í}ÊÁ~S`Ôv•sÒ—â; Ž*ñ?C³Qÿ?Fôþ³zàÒòúC/›Úx³ÀØ8 Ì&À3Q7µú æçˆÒÈ,&E¬œÀwàù„â¿n%½&ªÀýTeô(*˜kÀöjˆ Óÿ?ñ?{$Äÿ¥àøo“H¨!ÀòŸá+£BÀÏ û³vÌÚ°Úÿþ¯;¦ÿý_EØÅÿW‘öCûßÿUä€ýÐþ÷¹-}ù¿Š°‹ÿþ¯"ìÇâ¿ÿ«ÈÍù¨ÿ«Èû±øïÿ*rÀ~,þû¿Š\ñ¡ð_¹-Ýù¿®|¶7†å»ÕÜ>oö ™~ÄPuoµzZþ§‚NoœCz9©8a“hXxdmëĉ- V ÷„Ã_å­½šQåŸ\Û:{v˨FðÝŸ÷ÚÖž=[>@yßjR$Ç«¢ª€epÓ’ƒ_üÚ9¨½y“þµWùx‚pU€~âDZŠßõr†$Ü”õµN+ÊC?,0z(àÁq°©3\º'Š÷Oô Ôa1ÚaÜãpk'HÎÐô@ë+ î×ðÕT^q @'€} @y@‡€ö¿€_ªõs/ç•æõ×_=wyßß> ãï¯-½Èiçn2 §«ÅŸr‰C~á!WUôÇ‹½i +ýÎÏNœ!@tÇиÊü«×–øÚÿ"Zò6½ˆò€œpRHT2À ^¿`À1¹a~‘L= "˜z,0€˜¼Ç@$SîGCÍHÌ/€©Ç@$ñL¬ÿO~fr“åOJ€<¬@kö0AEù÷¾4y©‚,'ÿŒH{ñ °X¸·*Lè bþÉÀyº:ƒøß€?ù§EçQ1þŸÜ€b‚€#@jXɱüÉâ®É†è0’oÿOæžxbmr_ä$äpàæä¬6¿Îü}O >€ÿ=ðýp”\*ëD–“(¹xÏäm: ðsü'~ûî ð?€Cþo’B¹KÀQå?$Oy€ µ°”üOÈ|ò4`¿Ò¿ÐÆ„Ÿ“gµù\ÈÿÌ3Pxîïïú/ÀŒZQnüal±fov¤&þO€çŸß½°D…ËýÐ2öÂRâk,Ý©×Â3Š ¨#Ü^yþÓú¿ÿA+ò~ça0‡ŽÀ`B:Lü¿o·Vÿ@~ªME$É¢¯û Z·èû ²µGõãÝoÐ_ÚÿÙìxz9(S»ð×ߪÉú#}ãa" ÿ K<ÿ›©]о‰UcÍ ÿg* ðëk‰¡¬Å´Õ °ßî ?A T‹ÐV´Ðì*Í/ýƒH1þËî_ª:G Xýg ¶šy#ñÃøjÐÀQò`GÐKþp`À_öÿY²(”  Õ=ði³¼ÿßÑ¿4¼ÿ±E¡O«,S?”}(êEÚÁ,H—ÿEðjSO€„þ‘åà0¹Äÿ(#Pð"‰ÿûŸ°F þ@¥úG Ô@a~âÿ@TŒPý#k¿Øù‰ÿ³K&'þ@—[’@$J æ'þ@¦_â;ñ ¤gRtâÿ@ÔL̆É€"ÄfQÔ¸Û×xªð\næccþ$zG§õ¦åŸ&G7¡€~x=½~Œo2À˜@À›°cñ~ršêBn&úk( €{*~úY òK «üϼ¼ªõKšZFQúê*ˆü÷ÂCõU»¨DI Õ1ÜiX·´gðÝ-ipðç7|ö“ð~¤|O¢í€ÿTÊ2€øŸøï˜T2@£ü#žÚ‡ Tø?+ÉÙ³T ÀÙ€ò±+‰>/Jà{±~Ø?Ÿì»t‰ÿð‹»‘ÿÛppøWñ o3ÏaO‘ˆ€ö¡€,ÿò¨$´÷ççñ»Ÿ:&-ÞA ý‰ý'ÏýA„}“›wß ¿€õ‘tüul±Æ˜¡â¢õÿoó{€=€ ê` À'im¯ÔBþ #§N –À¢ŸmßG§-ËTù0¦ë°#pH†ýw§ ˆ_52" _}U)­=wé0}ÇEßXÈ&zÄÓ$Ètñiÿó40îqá_ ýÑL¶˜pîTp íæÐïwœõ{íCðÞÀͻ¡Vÿ©GK ½òb¹Ë|Õ À?u¾¨âÚ§.€gã/mÑÑò?Â÷p .þóˆ¨ Pöbv*þ £€:ÿðÿ/* zÿOšNúÀH€4fÍ;ï¼ù·:9ÌPäÿ*0g”`tà}1æ €{‰"2¤¨ €czü/ ûïÜ;]ü/ ûŸ·½ÇÿÒ°ÿ…Üð¿4ì!7ü/ û_È ÿKÀþrÃÿÒ°ÿ…Üð¿4ì!7ü/ û_È ÿKÀþrÃÿÒ°ÿ…Üð¿4ì!7ü/ û_ȽïÁûv¼Ì0æ~© ˆ©ÕöuçÙŽ±€Þþiù§ÉñxÓà–Ëg~˜ h ˆ;톈‹ƒŸyÚô4•ƒ“I˜ì%^ƒÐë @~‹÷õ¡€´à9d´Ð²„çÕ0‚7±ôßððæ¡‡ªÐKx]v»å‡3Dw—üžÿ8þ6°P5ì$©ÝÿaùŸÿàSµÛ‚ÄÿÙ)àŽ=õÔ•KW.ዎ™½ÔP„³"^À¥6\ˆ­ÿ“@}Í §øùú ÀW« †Ùû“:ÿ" 7+€\.¿ÿ$ 7+€\®õ’›@&—οH‹À½HˆX™L¼a 6Úeü ñã0 ´üùc~htmü ñ+ÿ?§Ñ8–äÃù¡F¤ÙNøVj™`çööÚüßâL*“íÿM™ô›>N§ÚÀÿVÎÍÿöÿGm¦ä×õÁ”ùÿMW@I@–?rT €ÀÝùù¿ð? ëÿ7o~á0óÁ|¨¨ €Í£0åùÿ'·ç7 €¤þAàæÍ»Ÿ›L.À à&lzšñç±Æ[`†h €ûE%Ñày„ 6Œú€öÄÖØi£z´>éÂ!xµíþ·‰ KqM7£¸: ì S¨x ò¾T¿æˆ€Nu’×ié/96Qý+´¹®n,@EýÏBòZ8­¨M^ò…ÿ¾)fßâ¿Õ0ýeº3^û_'Û¬–ü ÷ëÐÿwïž¹ÌSþµ“ë¤ÒÐV}Ü?·ö9¢&@¥?÷¯“°oÆô #ÛÿomK÷¿zn^3‘¿ƒÖ¿1Rðõ ~)åsÙ_þÿe­‘ì*„ûå@ßüòçþÇ9ô€[Ô‹ }Sør¹À·à°•Kÿßÿ‹àVrjTÔfœr@leréÿ ÿ‹àV&—þ¿ð¿neréÿ ÿ‹àV&—þ¿ð¿…À¢*l{‡üy~¹À·2¹ôÿ…ÿEp+“Kÿ_ø_·2¹ôÿ…ÿEp+“Kÿ_ø_·2¹ôÿ…ÿEp+“Kÿ+w\ý×Tþ6üî`$üÔj+º;NáyìÉ8uJþP©¾ºÝnùÓó¯ÊQ|ŸíáñÜÔ2ÉŒ·²¦r©þ?D`õF= êÿ0 pó¦i„DÐMˆ¬%új ‘€ @íöözò'`$QO,-Añc‚9N$€t¢` a´Çêዎ»pܲʳ“#/K½"@ @NÀ7Åcm#LÈù}ÿöÁƒp“o=4K‹C4~ ¦tˆ³áoP®‘c ¿H€¹H€º\zÿ"Òdõk@L&þã—‰À‰Î4yù§°ÄLï!¬2Eø#xÜnÁ?Öý_òÒ»¡À#‹üÛ$|~ øÏ!?w@lé €iyŽú㞯ÿòO±þ¯xp €¿ÄQ%$þVði”¿,”Á?<Ü…ü/=z·€H0ÿï×&›ñä_[û?†ü„ßÉù`Ž @B!pÅç‰Z7'à}úK»§ ¤‰Çó’ÏS^Àþ €xÖÌ  +Nùïaþ’`~ø µ|&o—ù[²€‡û7ôó·Ú’?ä¿—ç/`ÿ@ÌWð`.Xÿ»žcþV#à³ù²k=¶ÀØŸ| ´Ã¬à§€½œ¹âÐêvo¹öí•¥aB (dw ÍÞ¿P;:V°·~¾ÄËË`ÔòÛ\§.O–„‡çØ}ý" ÷wpŽËçëøýí“v jû „ô´=ÿiýø?¸ôVÿí )º«’¥’`z$þOÂ$u‘OJò?/€dýßÔ’‡Áã‹€ˆÈäA Àè±™<¨ V “5£Ä dò `t€XLÔŒ+Ƀ€Ñb2yP0: ØÁ¶OgP0:@¬@–?¨ V “5£Ä dò `t€XLÔŒ+Ƀ€Ñb2yP0: bÇ{ËãÝg"c{#dž۹?bÖáóíìóÞnùƒù§µÏg@n9 ä²Á „Þ¹&÷øJdÅ}D<…èÍâÆ|Ã6jæ7hNÓÍ]T <€]’Cbùºd€=èV=z¤ ÊcÉÙýý«wÃöæ~2ò–èœ_˜ö.Þ˜4¯À£õÁ¤üQ†6•! ûÿn¯óÃ5ßNòOþôÏT¤¯-Î]øü§H! €—‹^ÊÍd>ð YK”#` '6þ™Ûbb"öÇo÷­­ÅÃîƒ~‚Ÿù¡ò^ñËwóü'ùÛ=ýïãaPHòC ä¿/€8ö{yþÃüíÁ_Œ‡A É€ÿ)xıGòü¿=|ìx< ’üÏñúìæ<÷Ü~æ' 0¦±Æ[àvZ Õ°wœ•ßwù^Žog—ž ÚÜU ÌçUTNöÿíe—Ç„ýîë½>Kó×[àÓÒ~Ö!íÓà?Ô|JíÒÎ,Ý ¤@€Þ$ ëì±ÿÙÉHä–ù”ÿ?ûL³kÍÀÚ~Ó¨P--ü+™€OQ®5%Ó(åZóW2€R®5%Ó(åZóW2€R®5%Ó(åÁvt…eÄúkÍ_ÉtÊüZóW2€R®5%Ó(åZóW2€R®5%Ó(åZóW2€RxGW^vÀí ®Ÿ¹¼m³üa]÷l7ʺC¯ø”Ë3ˆÜ½âi]r¤€ß»ñ;¼%\£¿R¹Ù}°:¹Ë*æ$·›Ýò[ 1ª"\Àçî±NÁØ6HoM(ܘAüpT+/ËøóëôZüO‰†Éã" Ÿ#`¬€’@‹ß °”‹h/O‹ÿYùˆËÿ÷¿ûƒ¤æ×â–ÿžï·ù…ù·#‹üZüÏòï`×'ÌŸç×/mýµø?™€‡ûw óÁt$€ª«ÎÙ†²ñ¨±Æ[ºE9È‹M¦Çþ‡|2ܘL:k³ÎT¬í.þO‹dfŸÞÞN)Åd”wZ {:>Éö©œ;½Ë}â!ö"ìÿ×JêŒøçAzëhùû/a”ÚçæMÑ3|þÁ\ÿç÷BSˆ\AàÃØ#"xÛ€@²YÇàqÞ‚Ûñ>PpÑÒS‚¡H”åó—0yY’¸¥ âÖçñvG¤˜®Ç§_ñGŸŸ8Yü@Øß!Š zbòûíë)@îÈÿ¼ÆÌî[ûÿ–e¤ B)û÷F Xk0ÿ=ß‹ÿ³ÔÏÔ’üÉâÿ,ùM ÉŸ,þ‡üw'í“ixD5€Q`zw[`lþø¸™2éÔ²Kx•Oa Æ;ý¹liøyªUÊ|ÞÐwÒ˜;é ã±c |ÊZ È5> ¡{PB´dX^å2½ŠÁóC†ZdÚù=m0D!ôÏšT+¼—í}ÊîÓç²:‚øƒÈÍ;.¶í]¦®ßüvË¿ýü~ñþ¯/º`˜-ÿZoŸË3^ÔØc |-ð) >ŽËÏ1¶ÀØc Œ-0¶ÀØc Œ-0¶ÀØc Œ-0¶Àv ŒÀÇ{ÿ§O“¼µñl;5þ¨/r§çŸñ²>éÃ>§—õI7ëÔó÷uÏ™ºímªeÞfv¬ M½¼Û:à[uûe®³M©ßN÷[)?=ýÈ?­ü)ò\~5JåN ¸×?åü;©Þm_ß§èQ«2¶ÀØc Œ-ð©l‘øoKˆ¡Ð_¤{- `Þ=Q w4Qø+ëEuÝA —å¶nñ{²¹ÒYß­_Êmäluüo£l’¼r‹ÍôÿSWÌL| Ö3æw{öÔŽDèò¾ìÉ9o×1Ó'ÚM¿ÝúM+ÿó!wóÝGwÚ(åÞýqw•¡Áýpù÷Têb¢Îp Ãè =isSäÝ@ˆîúìÕG(Ä·o6´>QÉdö 8E2ÌÓ”· ;:{ñ7Ý{•ò×vPÀ ÷prFÆè!†º €™º Ëï!fÎßCÌœˆ`ý†ÊëÀL§W,—`¦˜¿‡˜90ŸÀLÅëúz€Ù ø<F€Sµšùù…f‰i†Š¦]˜A'ÏŸoæçoàùáä|qqgçŸÖ¨Îé¢n»~ÓÎóyý»ù²ý¼ƒT?SéÜoßu³)ý»•wŠû‹àž?t³)8vñCü×V!u†€å÷ú…þþ…Y„›C Í¾¢0Ãp»pL6„»íënF% wât§þ—Û7}ÖžpüG87“–ÿÝ"¸èüäVñÈ[¼ÁÚËß}pñOgi^¢÷ÞNùk8íLÌpÇCÆ[`l±þÐ[ äì#Ðeð‰ýI8ÚË_€|÷áèDoB·iˆÿ2ÒG;cý$î«Ð½aüÚ .þQP¦V9 .ÿ¸®È=…´³‰E~U´•ú¾ÉÐ4 ç~ÞÉ«,ÕÌþf=Ïíþû7Ü €‰ëFàÞôpˆþßÓÕ7?ìTåãÄÿóÀÌaÿªáoL:ë)Ü»CÅøÐ €©ZhÇ]ó•|üþChàc¨~õ_$@ZÓ轌¦Ù˜Û˜ßhx3ñDÔ¡@ul8¯þÛ óÜÆ –ý`¦çïiî©÷ >vÙó=Cýf½ÅŸçãÀ@ÍÏ“‚ñ]ˆ««$xzºä¿ýí»HSOÂÊ; ’ò/\@÷žAÃEùÁpí9 ÉíÚ*ÒŒçé(€ž!ÞÍ!-€è“3”ê(“ó{{û:Òl§Çú?ÒéÓYý/_îoßΛö ¤ƒ ’ë?zôÒlÀP¶¸¸¾^Ü_±~Õ‡~ðÁQ¤ÙŠ€tãFVþÆÆÒŒ|ž®ñÚÆ[`l±>šð8{¾ùæ?¯¬|çÎüŸAúо;rMùdŒõr ?‘è­2ä¤>šKº“¥ôNjlf¦øò= ·¶øÏIG"°ÅɹõI%àÿýûw΀0 ¤å¬¢ÈQ >3 ÇüüçËëw\ùòÀÕü/¤7ß|íµó;Z@çú?4àN\«:à&oÝb?ÀõhÔ·7Îèuœà÷ÐHw¢[°lÔ”–K>ë¹±šÝÁï€Î‹X¡_ã §Þ- ¼€?V>M ` Zý'Q.0 ü3?´úó#›Vÿ 3€¨þ/`èüÍÜ\ wî+šòR"dTÔ+ÃöSÃüý£d'{§.éù;„ ÏœŸžùg©_Ðg®ß¬ýãó~{ {ÕÍ_¾"Kwå W§+O…5å ¼*¬WOCÙÓàV’òˆó±‹ÏÔ´¾“ïIòcõÅÌù_ç{Ýçïœ3L&úå»v|õä.“óò¯£8àÿÙª«ÇðÄŒí[©ßOà„O$ù±úï€ÿg«VâÉî,&ùmòSÍÏëÃê¿þŸ­x\Þ#¯º÷’ò±úï€ÿg,`¦^04¶ÀØc Œ-ðÝFùƒ“Ÿ›;;w–ßüŸ¾lˆü¿Bô¥~ó&'Þ\âj°¶‹—)€Á©;(€éï7N·îוóÍ?¤\kÈ·¯†¤Ô†=ÛíÜ>$Àé Q‚³æèGOAWcG €¡î½HÂýÂþÚK¸ÛJ|åôX÷÷éb ÿså?$..µ%´ç—õù×^{Sçß ÷vÅ66œÈÍ¿€Õå*@ÝMõ‡ 箼Z½ò½€ûHïøøüWŠ'¿ƒs?-XÎOaú—´‹[‰JŸ:ß]‚ç“£‰ó´ÑV8¨X êÿ†|ú‹ð«ÿ"R`kÀ‰ i(¿à0HºXPÿŸf€5øà½0·?#·üÿìÍpdï%:ÙYXÑÙù‹ÆîÉ?CýÚ±|¨~Óî쌣Ÿ'¤ó@¸îŠF%àÿS§ªOÿ•óZü÷ÝYiW¼eðp ðåkñÿ‡?|fˆÛJZ3º8Õ|~-þ¯®.÷8¯)oœ{ì10T`þn‚+ L8è‘s=I2r4ÿ¯_Ã;[q<€jyûž;7[˜‰€ €Ï¯Åÿ#G~xÆüÒïàTÀç·™Þz•ü¸>-þSÅ`¶â¡_y/ªøòµø¿¶f/™1-0¶ÀØc Œ-ð´€½¬ç¨–'ðï7Ú·p뙯ˆø÷‰Ü£>û‹P%0h€JL·0…þ¼ÁÐ!ùn¤!ù ­Þù</ŠÑ€ßóžF3~)çNZˆwðŸËР¦¹ *Q 1ËGÐØ €ÓïªÛJ½äŠaUOÊÚnËÀï¿’!øx|ZeÀÿ‹>uOä°è-:Ê¥}ç?/w3&¿‹÷ôª[îÙS_ÆÑ& êv¼zþü«÷¢Únó¥7Ù=»ƒk™ñ’ýa¶b¾4ˆÍ Á¥Û3­h­sÖ”a¿jZÃ%øÕÿB:ªÿO±@µú_šDõÿa€h'€ÙÔÿ§ÙàÚü\7 ö9·î·ÍY†÷ÃeCîy[ÅGÂN·1Óó§·”Ç+Ë¡2¿ªäë÷N­~éxÖ[¿iãD®™Ø–Ý:$lýÿ’¤EK@®õY^Uäùá:‚oW¯ òÉjþƒ˜-?ß‚bº|ý´þ¿Œ4cþÇà€:«a ’ {äj#þ‡ÕÇÒ¿ü÷/†)ãó>‚äuÚö=‡4cýù–‡#ê(¿ÖÿFš1¿L‰ÔWKâÿ̓7û^7å} Ûmóߨ¬2nßEâÿÍ¥¥M2Ãn‰r²†t›õÐe;ïŽø_<@9Sz\‚Ðä$K °n Q¬½tÅÇþ§™‹Y”€~9îž?' l·çí·ß$^xá…*~ 7Ý óÞ\×pxõÊ•+ƒÀÀõ¹M0¾þ}³È©Ø«š‚©ìÞ½ÃØœÏø Z~õ¿bìÌZKsvêŸ*ÎgêÿÓl þ3€th0õÿ)6 Âê?RÌNøÓ¯0ä èµy1HúàI€¤øY‚XXnª6^÷%¶fê3ÌòÃîø?ϟזåF¤ôîTÚgçãÌç0‡=¾\–¥Ð¦Û¶VÄç6öHЀ–öM““ '€Ž<jZÿ‹^/Ë'@OSòÓú_4x™Ÿ¯Nz˜’ŸÖÿ$ÚüyýøŽ&Ð'ÖÿQ=ôžÞð´þ'Щ? z˜Rÿ'žxúiÍDÊë' eúòþä×GëiL•ùI¬®;¸öþúë#@OÓ®ÖÿÒ,ËçÔ‡žú ø>Sã%-0¶ÀØc Ü©0oeiýïÚ€Ÿ3³ÀOa–â¸æ/ÄÿÈI˜@”sÍ_Zÿ{!'`jHå[—«Ë=—"/`zg›p-¼òêÖõ CðÿúÑ£×ATËp€ÿׯ]»  .üÇâP—/ÎmüÚ×nÏÕK±`òòÊý£·¿±gÏ7¶Û–K¦ ßýÛl¶íû÷ ºä$s3«!âãíÛS µó^¨ä¡¦lõ¾_ Ñìþmv¢Ô:°}fv*,e@$yËz;¨ÿGq½Žªÿo&eœÏM¨2 — 0M*Ý&e‡´é w£v"*T5àÁ@ší!½CS€âÙYwçÏúe€ª:À´(4/éi·ˆ[7eqËÙ¦0Ì¢œò®:wÐÛÍN³@ך¦ÿÞ à€€h€•³üNÑÀ;r€EQï 0 àz#5§Q)´“gT[`wZ $Já÷©V]yZ|x•‡GKª²ÕˆNzTÒóÇÖv‡aÉ÷’¾U%©„ú½C·røÐ7}Ì…akªk¸¼E†²´_´ŒVöëPˇ½Èˆ ç¿Ýú¥-Z«¿Ý!w´:L€u@¸Ð„›Øƒ €ZÊ)Ê¡ G€–ºŠÒù·`¥S>TäÐR%?uþ-ØÓÉ9´TÉOK`^OóÛõKP À\W.*JèÊ»9j*rh©¦FK`NtÛø¿§}­~Ôù·à‰N~¨È ¥Êõ+¸†€ÅN~¼ºÿCÊT|x}([Ž-Õ®ÏâÈÈ Êþ9´´ƒQhç“€1ÇØc Œ-0¶Àç¿@ÿ›Ù?¦„²q¦ €~± €«™ýCŽ¥ÈÍ @À±@‚ü  Owæ ÃÁÿ?ÀV˜Ëi"äÀÿ§ÁH  ö‚þ?{Ö€Î4ç&þòIc*ráÿ½{¨È…ÿר½¹ ø}D÷_Ù0J§cÑñßýFlÜ?ä8p~/¦é´­`–IÁ´ƒ<ÐQàú?ô${ Sl½¤‘-¶VüöSÂÀ@?É @åÎëüðýRŽ÷Ñ37úÜ3ZKÞª€ºcJ=€â»> œz/½¦öì Z ÛEø¿ÂÿF1þG'©£3*LÑÀCmÌÞ0p“*}Ng°ˆ…ò°E¤ €!'€ >ËÚß:M¥ž³þ§ƒL¡ÆBX €iN2þÒll¹‹ÿ>q)Xúà¾ße =7(@+£p‘Vdm”JÇ…@ÈàÛ|¿{ Éêgà_ô“R¨_FT©­–*ÆÕöV¯‚¿§Âj¦9S’ßÂ[Í»åßw~Ýct½ÅEwH@Ù%ŽÑØBÀ– "ÌâÕQþÛ„ "@®>•Kÿ –&+ÿBBPæÙÊ- ZP–ÿZBPæY~˜ý_¸¼ƒ öÏ¥ÿ„ÀÛ"“cj!ÍÂ@àä¼üí„ "~Jo>Ôþ¹ôŸ§‹ú_>ßTË–ÕfÿO?Où&`åÇÝ]_OT0¿¿ @E€d Âëû !¨P0 PûçÒBÜ(ÊßH* ÄYüüÏZÇ+[`l±Æ¸í @FÞ›Ö>´]Ä0d¤üþ9ÙÄ09ÃÀ{ßwA.}á,ûúÓðŽ6Jx„: ~B~º‘_X7º`ӀͪøÖÛ4`³ê€5s» ¿©Júµ¹ëÛn_Ÿ«‡ãAàv“è-å^Ûw}ûߨ¾¾ïµZõwCïÿúöÒäûÜÄì"þ/¦G2žŸÅ À½V;w:Ó1„š:Ÿú¤ÂlØßéU0 qù`ð‰»ÙÊ0XšZÀ¹‹…ýu%(Ìäcš!d7 ÖûÎoduübNÔ8ÙÜtæš3Q (¿Rñ’¸ŒDØ{p– ´ÃL‹b ÷’ûz€Ù4ÐÀSñ¿€>'€ótœ5ì@Å  ú£4ð9€*æ x‚…ýe00¸ØSÀxhñÿ< L\ c Ô‡ð?`ÿS§¾üåÀ´]øëË–QV»Àjjá‡Îï àú}KY€¬‰´“bÿ•ù™³á=}õ‹ž€ïÍÁA® dOK)tÀÈ^:ÅÊ»õ›Vräghö?€Ô"7S]6lóS*2Ü= '€‚ê툭;PZ€GüÿeüÏ_¬7„ÆêÀߤ©\-ÈHØ´ƒ ³õœßƒ(®ÿÓó».ËôÊ¡‚M˜ÑШyÐ`x8{tKx><”Ù¥l€-Xïx9ôÏ=_§;v¡¥Qw’ß| öæ_¯?)ÿiõ»V)߯-«¿ùP,Î/üß!²ç³Cd @…Hà_ùý+€¬ü0Yå÷¯ ²ü ap~ùý+€˜rùý+€V.üÏ.œÉù»@ÊþïYý;@Â(´m—Èòw€„ÀùeÙQùý- €”¨)à„ÿ;@VþÆÊù… Ž0`¡2È–ƒæ¸?¶ÀØc Œ-0¶@O €ðÓ»lÊüv»rÍ–ü‰þià·3EàOôO#€/Ÿ<Éí ˆúd£`æ·67·†õÿ>:ˆè¶âúèì{ ëÿU‹œÐØwëÿ…x¸uXÜ´Hô}ØÀ€r_{&7°¢S¬50½* XœZœ»€Vÿ߀xÙáÜ]wy¤{×]r`œB¼¸wTxîD€®º¦€ø^ùÿÍÚù‘[!*lò^m`¨Xó¹NBk¥ù P¶2£60Á`üì>opà €JùÊ1XÃÒÊ¿!F(@<”×—–¼ÃÊ¢ø‹{÷zç’å2:T¦çÏH€ÎåÏLx+€nd†ñ?”™Ì й @)Ú<ôFKãÊ¿EL}²¹üÿ-üxŽÿ {[/úþmùúþ#à—Á?žz*LX÷6„¹ÚñÒïU§E( þùË‘JIÏŸá_O·hý_~ß½€ Ùäá£Ù¿-'ð/ŽÑtܲ€X?CÈì®m·Î €'ò÷‰ÿÄÿë"Œ¹„Ú>ü³å7ˆÃù!µFÈ—¶|y9,庺uwÍá¯V¾—›ÅÎùmýß/ýsƒ^ËŒ«ôÈ•¯Pêü–>¹òÿ¹ôÏûB/€ÑGƒÂ/Ð Wþ½"@¢ñ?—þÙè0½ý¼½×è+ÿ^ шøŸKÿ$èqèøŸKÿ$è0¡¥O(óBtan(B@Þ?¶é+ÿ^ ÕˆøŸKÿ$è°˜¸ËôÈ•¯èDüÏ¥ô €4¹£ôÈ•¯èDüÏ¥ô˜½¼Ð~«ô(_ȦPè|@€\ù÷Š©@Äÿ\ú'@/€ÐÈê·±tÀ¹¥ÝGž¤+2¥§˜î+güel±Æ[`lžPÀ;Ìÿ)x¿‘Ì ˆýOY¾üFа¿º–‹CÁŒaà›Ç÷*Š¢BÇ:!Îs9E'ü¯×g¾Šy4?ª5tDþöQ—¿ÌŸø¨_¡›7ìßÛTèodþ¯dwèó´Á ½LÅ¥E·n1Œ{ U+(ÿ×Ö‰Ý]Ñ ïÕ/6® B‚"@· @B„Ôi…ìüoÖܪӈv%U5r8ðÀŽ4TQw‰¿AÔn`¯€?ø?5Ÿ¨•AÀ€Á'`<“Ûƒ @åÝEÌKP*,îJ0Üÿ(5€Êí“v¾t×û`Êž2+€J~8>3Oùñ€0›X€¬b #zÏOÿË(€Ä¶æ€,@A°BêÎþMc&àq¿­þCÑéË­ € !ø'þWQëV ‚&ixj¯† Ìϼÿ*è‚úæ(5˜rƒ%stØ%<î·ÕÚpOF_¿ˆÓúé˜ ¸%ãqÁ…ÜRаÇÚ­DzA\ËIÔNþóyþÂb=?ïyÁµô"ë×ãåõƒÕ;À¿¿ËòKŠ™\ø÷Æœÿ€˜=Ptà@S±A­–8]¸@ÐöWÁ @øô¥9ÿ3÷&c°¿ M0Xÿ‹ü¡ó?#Ð2Àû»@Ð!ƒ€ð¿“>Œpø‘ÖÿúÏœÿ—‘ðø_:,-Ðúfûû»@Ðw/ZÿCõÏœÿ—à€ý] h €>¬„ÿ¡×gÎÿŒÀ2DÆÀGßÃ.4@HÀ` ü¯ètþgìWrúØß€ íÍZºp )¼ F+áœÄœÿ—€çcÁà1©À&nšÆ_ß87þ>¶ÀØc Œ-0¶ÀÇAhýŸ/`®þÓ íE¤MÍ¡~‡ÿth{‹ƒÕ×î(°†Pd®k@ˆB¢®ùkø'  z Dÿ€¾äª ×nsý~€úÿ¯=‡Ô)£F@+ ‡¹ØÃ³‚ H•( Î0á°ÅrŒ˜¤Ê£B–Ò6ÊoV},hQsXÀ·^¯€G•] Љ€¾CÊï¢{õÕ~ Þ<èý§©Ú‚îE Ðk½Ð«™ÜÖ0µ@WêyJ°oÆJg '{,œQµW©hýûçß’¨’Z™–/ôÞü4½@üU–O€D@$@ßùw{;€² ‚öÿildùݦyù/ðoê1Ñ™ñ p, (Kˆ@sA›wÎz±Ø6ä3Úþ$­%ÀøKŒçÏñoô· 1W…ü-@C€ö7ïrÀ$Ð!ƒ *T"d^±êgÉmnú곇Xj…Á÷AðƒÈ£‹ûŸäžòcáˆÕüat ÎÚÓSðŒ=^EqX2 @^~ׇb*wgÄËÒó¿ghÔ »€ÔˆÿÙ Ú@:$¤ÀĈ”?%7îŒh/zþ÷ ð_#¤À„>®NþŒÜ¸‹´j1ßØË»€˜ñ?Ò²ÙøyŒ;ôüOC19ÐPNÏÿ4Æ# ü+‰ HUDH@ô ñ?óÖ=qôüOC1U@ вAütÎê¥6$zþ§!€€* &Güô°o±–[‚“Çõ* ùš!þGÚî¯)(€6xÄ^Åî't¯L€ñ•d p£Jl¬= €‡Ÿ| &-z.Ø[yLc Œ-0¶ÀØc ì¸>€Ì;ÿ~„ $`jq ‹ÿBü_†œöðS÷íæðÞëDGuÕ;¨€â}@Ý !å˽ùÿoЍß'ÂZˆ÷© OÃÿ îï›þÿ¥¦_s;Äük'ëÞ =Šøßiª1` OÐÃHüfÉwØ.¦û¾¸ešY-ÝÉ@T5 · ïAæÒ¿f—ÏŽoO`6 7РH`êí¡‘>üh£¥w˜Ð?¤ßötLG5Žà¤>iÝ$›¡ÿpSëÿ\åF(zÿ!™@µÉ`Hñó¢ÌâQdÀ¿­"ŒÔÿ‘û±òÏÛ' ¨°‚°QÀ{ù—3V—¢Œ _«d<¿ÇO1Z™÷X :-< 3€p‘aÑ`¿<ºÈç"T>¼ ÃåY y£/âµga`É|´þ-bçñVþ¶¥½Hqjc2ˆÝü¼ü6T›Üð%©âå°½~Þ6ž©dy+>Û± ø_·ª'J ÷@@~ðG`CY"ȯ@^Ž ÉÉÿkwÃÁ¸7¾¢µ¨`Ék¹ˆ þW~õk&‚ÿÂÈšüP†² þ×K$¸ç»ß™Æä ,‘àž—‡`B9€½¶‰ùÀ€ kQ–ÿk€%ÜKï.½þS À6”… @Œkƒ ‡%øÈòÓë?µ,aCùɸ3þ9â]UâêëÂRµ\jX Ds`P´x16”I ñ¿ö@X"À½ôúèõ€?"øÜ€¤ÆÍ±Æ[`l´ÀÇ@8*†‡“yªè{Å9*0 'Ææ Ëü0Rÿ°ÐÒí€ €Ôÿûm Ãè¿3û -N“æ~¹äoS  GN €á[;Œÿÿ{²ƒÐÔÓn‡-˜$”À:¼Ð +¸«À€yÊk’ŒP­çŒ'g5ë@Ä®Ç@$êjtÁ`SµŽ€áÔšû+œsδ€)‰ 3<¹žp—иŸU'‰ €Âe'®ú­SOή€ð,ÐU<5]›ðF€Zèx؉·¡Z»HO­†>S"ðÛJeÈàPZ‰ë’æ2[MMˆø(FJ·@i±þiŒ4B£Â@ÚSÀ"‘Óy›Ÿ}›@‹¹äP0Tm ÿêBÚp> ‚úRûÝ;TYcLVáT¸­ó§ø—ªÊ>¿½àÔÀð¿òÇ5`÷ŽYù…T­žPz @Æ:yZ?kD.NÇë×hVª§ÀwX’7Äâ“AŠ]HKä D ÏbèýtÎð?ÜMRS;{::^=»¡ÊËö΂¾óGË\(T}(R@…ÐÀ9³Bi).ýþ—€õý ûü/És€N”HˆoØ?à(NxêGàßX€˜_Ø?à(NÀÀÎO*@,€ŠŒLN*@,@ì¿ê]ô°kòà À÷ÃþÿËÀZ4'``ùIˆˆõöø_* 'l ‚D*@,@Ì/ìð¿ ”?'8H*ñÖŠˆù…ýþ!p½ €ÇþÿË@ÅŒ¬|Rbbù´ +K%¨€…Åcä3Œ_c Œ-0¶ÀØc LiƒàûÖûýÇëKsî"€*Åÿè÷?ÈÉ @QùOУÿo—‚iTþ¿ÉAôèÿ›@@¢´['°þÿ—s3R=UÀ ?­‹THnU0ÔÝÏn'§)Àí2U€+h2ö„’ ü \)TÛ*Ü€ruÕÎL‚@©à^=ió¶“5`Ç€ÛÌðm€ÚÀ @ Pú˜ÀWè*6’XZ6Æq³Ò~ ¥à½i'VúìoýŒ7kù‰ù©«î½¡§*æS\°Û³Õñ“ÞÖ?u‘ŽEò\=:ÌÂOCYA,ì’ÛÍ0¨)þÍðò¸_é”n@ h €V“-€éÄÐ8È"LÈsR«::R£½Š[üï骸þÛº7 îP§#ÁÉ‚—Ç"c„C„Æ =•þÍÎÆ€„ ’ËC°»Þ‚úÑB¢÷BèòMG>á¤ZŸù@,-ÁÈHP«DèY¼þÔ Žÿº^ÛûO½w\ž1TE 7À¤vC>ã€ÎZâœT×0€@ª¡À @)¯Íîãè€üò ”Ó ȵvhþ¯ò½ |øž-üÏJi²H ìˆÅà^àç¹èÁ+PJ6$©_{~*ÿ+¿W¸ 7­œÊÿ’{ƒ©ÑÝŸz¯ÉÕ™IeéÁÜÞ¾Ž]’Ò œÞ€°GåâU‚‘ »,üϵ/5Lìæ1o4pãê~üó*O{7Ü+PJC€jû©„^ Ô“O¾WÐÝi»¾êî>ÐÚ??(¦!@(Þ4beiÀC¼ (e»Š á~PJ€!ËH Í*FÙØc Œ-0¶@ Üy€ŽõðË5î´Ôn¿Áñ?wN§BíÈ&‰øE‚…ÞÅJ­ ÐGî—‘¤F”^Ûúú“å0& C ùPL€ w]×,ð:àºÈb·q—$@Âën## g’AÎ-eÍ €X>Fˆå3€ð¿/¿‡ˆùÁ0@ÌÏ$Bþ æÀHÊŸQ€‘Lž˜ª„öÀ^lò Áá«~àÄòÁ0@¬?#ÿûëï!b~0Œó3I€Ÿ[yûó‡ù˜ #ÄüŒ@ ä¿ˆëŒ üï«×GÄòÁ0@,_$@(@š,,ØatF«ñ‡±Æ[`l±[àc Âü2­Gò[9™M¦¦ÎÒËﶈSÚž6½“rÚ9G7J•îë˜î/¡{ð—ù—p ”©ÄLò$€)s@ÿÚDà ²4rÄ ¦p(CÝP T‰[½Àl7ÝÕ>®ÏdîÉb¥ý íw?ì:®Øú$í«ðÆÛ/„°Hò Nôÿ* €“p€dªÙAÓÚHg`|LY‚ žÕ¿V[ع}ÖÌeÞ ÝûOG¥誽8!W,ýs![ñÎjýSÁ³¤›mŠ© €_ú§&€â¡Õò+ø™¼ ›"@j0ƒÍ†”N ´¶þŠ×#Íò+ø˜¼hTñovwÙ®÷‡FnõàÍ ‡¿dZ€*K HÊ7 À¿±ëÛo_J`:õ‹¸?œŽ|¤%-þ d3~ò§"È·2ðò ’{ óxc><þ§:@j$0àѪgÊÿ¡pªœÐ‚‘CÍËaûô“Þ ó’@Ð!`Z¿Š~ŸmÆ8Žj»ëÿúP t“ƒø šü©§rù³üÙþ†´å üçå?óLQ>ÛÅktò üçù——{êgžôòëø÷ùy –Úú ü{yÛ}[¹À’cëþñôë*Œ'õØ“Ÿ¼6¿À^ÿsçzê/^¥¨ŸÀžÿá‡{Û¿{~ÿ<ÿÞ½Õó‡Û{äHEÜjõøÏË_XÈ ÐS=C¯ÌQ6¶ÀØc Œ-ÐßwžhÏÝ,Eµ¦Éù÷$@ßQ–/jÇP^×ïö]È{ã~’ýh€j < `A¼ ¦ŠA@”ÕÀ¬þ·ƒPüÖ€¶rw€ar˜]fw­ò¤%P¸•$‘/-í¼;Ðï_ô/ %ÿ±úßjp«È?…`@$˜Á‚€õ"˯¬ªÈ.Bà¿OK—NïÂᆚ& }°˜iïÄÛ•7ÛVÿ3: Àær,ÿké_3!ht<Èîß¼˜@j€%6þ„ÕpäH´B¬5ÆÎ Îác‚1@w‰ZÓü)šÏÕÃì%HÁGM ‰^™À@ í'+‚—/Ü ‘œ! ÍM@/€úŒêUþÌ0L`  ÷CÜ! [÷WâØ€N7¶ê›@Õÿƒ@©@/€ÁÉ5ÏøÔ.ÿ$ºjï=€¸~½ÚOHÀt´smë€dú áÝ¿ÿ£rƒ1جþ$ò@iIýc¤Y~R`‚?ÀT Ç¿<:Ç¿±o7ÍF»)¡®ßñ‘i`T€ÌìÄ©­?²7í“KÊñ/3µø—ý9ö•žüõúÑå\¨²êRGÈÌoÆ5¦ùÏ­´7Àß=þ×ÁIû‡ü^óŸ×_høü>B_~¯ùo=8+_€«_…Ðõþ/Ë÷‘!h@aIý½|{[â»Ç{h?ú›58Ì2ÛA\ü' ðY ³áp;ò?ü‡Ê¹%Š@èI±±6QÒ[¿)×7½~òZY©¢­òSu¥›TýHdÈ«Þ6ghÒþú{ÓŠîIø¾Ë²§7)´¿ƒçOoGr§BËôŠŸ³0'•FøÉOêGw#þ/Œqwl±Æ[`Öø˜ €aðígH³Öý“8Noìß!y€f•¨Ø\nžÀwgú)éÿ‹0/€Œ×“wûM4Ò Q?Yãö ›þoÁ`}øÖ'§’+€ÊÑä‰_†{íꛯu#Ñû3ÈS†N4û2ä €ÿk@4 ;ëÀàú_åÏ9µ0ä €ÿ AÊW²F+ú{¸ì-}Õ ?¬9 öXk*(̵´¨™ÌZ~‚z «PKXK\ý÷p6ïÔ* €¥ Ÿ¡ýAX"P (ÿtÔ°”á721Ø ãT¥ÅúÅH³üÀÿ",%1Èx,ß»=ÌÎGé1Äúí3[Ìð¿äA‡™ãdgþÎèƒfX*¸þOc,ÊŸ˜Ö/Áÿ­cCȪ_¦$¯_äÍÚ§xÂZàúäºÓkQþè)?ù@Ê:XÑ¿¼¢½¢TûOTÑQ)?ó¡˜Ë±×â|‹ãn ÄïáÍx÷ß[b ÷ëžUbñ‰"žmT›x| Û^”O @7à?(EÖÄ@thFV,ÛŒ­C žçáÙ²úM»¾©õ£ûŠØÓýã“ô|ô]ó–(7Žm|Pê ‰9hL !Ö [åàš·§þ!Ê-Ym£¹y:~o‹V`½ý§ŸßžÍpi¾rvÛbU»âç€ÿñ8›?Qò¼¾ƒƒ@_¿=GŽ8 P çå.è<úǘÆ[`l±Æ¸…0 [‹÷ÊG%ç«+ž0©m(¿O½Cð:ÖdJù|çúÖª6õ“{ÅÖ`®xJÙä¹ `S9ýÿò.MPÄþ—“\¿ì/'æ0=„ÚÿwÝ…ý™(ëEô2¥- €)NÒ¾'eí¬ÏLu>à§IW¯¨ è¦©½ïÐþ×õÝo‰×—jPùBrº#G¢¼CÀë%*@û_ùOZ¢8×p+ÐjïWÀñ0;FÌÞ%næ Ý*€éâÅ}û xožP õLÀ¹îºŠ¦œØ)‘  õOÃþžå š¿ë)RbòüÂþ¾å $zc°Yßé ”ëO#«#Íçöø?70ø¯Óôà_/ÆúÿÜÆüº µý³N”6úfù~°4ódžƒ@~k ”Âù«ø9íâêùÛÒÒú)ä\+j•ä£uGâ¦ÀšÉ_ÿ¸¶5îÁ®×Ìã½1@¥wRêñÿ:S‘nÎòûh=ùýõoRÆüþÖhßw  \]Qþꪕ|@ÂÁ{ö˜Ü3E¹ÜЩ©úö b­þºë鋈0XðW2€JçZbÉM uC/ `‡Mÿ­/þn6-ø·³ yšuJýÚ ó—Ù¹¾öÊ+õSÏéÊÒRè\‚ùªfЈ,¤ÿ [#´]'ÎôúÕ¶ç&ºÈ€zûã±™r~ö…¦%QpÓbgݤqÏ…äÅþ[?!æo¿¸ëûOFx–Ú½~âIB<-Ö?Æ4¶ÀØc Œ-0¶ÀŽ[Àkð}â'kÉW2ÿûhäþ]ß]cñçï•ûšØ{±ÿ"ï¬Üøúþ Ü9y €æ*®]Ûêý²Uï¢ç?BP%¿‘ÎbåõßRÜð-­ôü—ä?ÒïG/ÛÜ-Ü5' Üû&|öht˜¡ófí8ÇØä¦,GÚº>zþK®/õ(9=ÿ%òÜ àÒÿ{Q?»i¼#@ÿ4¹»èù/É_úD 9âÊZ pÉÇ çí»‹veƒ’¾0† 0*­íöí3€ø.ð? ¹õ ¯¡­T ?ÐU¼Ç¸ÿ¼ @I!ê¼I‚ÔÅüTþW~¯ðÛÔ õ#¼¡!@q½1Øt'éµ@iñü}1Ò,ÿiá~ðüe @;Éã_oÐé„Àóó 9ºRÿÔy3xÏX‘ídÈ©Y˜Ÿo:7>Ò`iÍ9¬ž‘ìv×ó'ªêgFeý϶éȧõó§p÷#Vy›ßίø˜€¼ƒJq%¿/` aH¼–?àþ"¬_ÀýCõ L@R~VÿÀär¿òï磊¤H¦Ãésåþ@ý1Rˆ÷Ï#ÿ$˘ @bàü+¬Ÿ§þ,{Tðü´ú±¦-üf ‘ð˜¡~vÿ#î÷Wàc¶À?1ºH±÷æÁç-ô&¬6y³ö…´5pSÞÖ­Tˆ­ËÐþ*;“t#ù‚øHîLl¬ÐGÁ}Kžàf|üÒ{’H¤½\oˆ6]þ<Œ{c Œ-0¶ÀØc ¶@$ôBÒÛÅ>“÷S˜?}‚ò8$Tçˆx›rk5OµM' ’÷X»™!€ÂÞk¯‹þÞÛãÿøüRÿ?rÄ”ù“’nW€ø¿ÒÂ3k¼ÙÕÀÕ}3:9áVzl³ž·t{}Qîí×- @rývÖý¥þï“WP‡ôí'ÿÿ>,Ú·_€6ÿ {@UåoÝ_`Ô`(;¨—ú3uà.zþKN!cêp|”÷ºŠsX,ðúh` ÀbX@ظÎ$´‹@h)}¥ßžŠùÁ0@žŸH„ü] ƒ-œ¿/PZ¬âîzŒ´Ÿ„ÿ}ýú‰©ÅývË+¸Ù@x´Röýw`’[Žhš…Ö‡@z‹u@îÆ!=ÿÔü¡¬Yꘀb€Ð9óãåå UBÏ$í“\ÿ ùÓâk!QÍ¿³ò»õ p_ýy¬P‚‘-]øD;Ì»ˆkLýŸÉ,jM¯ÆÃPî§€¿¬ Ä^õßwÔLÀúî´úÅsÖ®/öÿ¤¹™ÂäB¤] È­à·ÃÓ«÷š*÷LSŽß;¯$Ò§¬¯ý­…Â5”ççEä?²­ ÿ“†¨<ß-ãîM²!Ä5+ÁÐÊ‘NO:ŒÛc Œ-0¶ÀØc ì ‚€î:/ä“–‡Iv>3ÈêØV±~ý¼þæM›¨Vƒ[•[> ¸å=6:i 0™AH$/…òß쮘¢å`„ÙôŸagž­P5µº€m¡¦vn( `vœà¯(€Ð–wÝÕ–ÓíÛá—À(-ä^ÿ?øžV¾µ1V/Ϊlúÿ>ÅK 1|7oÉc›„  ˆ} ²N «pv•ÐÆèø÷Ù4Ã÷ù;+?²'¿À%?bŸÍ”¿Áf„`8-PšªPÔ¿‘–çGì±Úùûnou èÂÿ¶•‚Z á…È_–;ÓùÃA•üÙ³{kõk«–¥{ŸÒ¦=¶öÞ™ü·[¿äjªõ÷]¨{AÝ$ëóŽ?b^€þyž|TÕElz´v¸ºâôEßÉOlyüoiê©_zxxb²ú2jõK{xR)#Z¾¢¯úvH«cÍ¢w}õWMúÚÊù# •Øíµzz5ql„¾þïIãΟ8ñúëéôÞnŒ-0¶ÀØc Œ-Pi^`à[L²·x|Äù“udæ’ž$›W®ôvå)Ž®v¥ä­¼o†h{HêÑ9n»Žîä%N>Šž&¬´—“×õ€{;_êÕ°˜ÿ³§ø%¿Ëú—í³y_û÷vÏbro3Àü_ôü¾n<íäSº‰«‘ºâ^Z„P²©i'òÏoþôM}ÇtÑK'KÛ–ÝÒêÙ‡räeL=ýÔvtµS›ãs{@þŽl…|Dî2ÍÔ{‰WƒVB~¶ZÊβ¤#®T‡ëW¼0ú^súU:râpZõãê2ÑBÕGÆŽº½ú§ú+ùYÚÛR?¸ä ×ôþ+Ã~ßP¿£ýõûÜ>Hã…-0¶ÀØc Ü™ˆQlþºžî?iy: |k¼eÃ[üöò÷߈ôÔ¹y‰ÒÊ3L“WŽÏš:óœ½vnÁf>Cg™µ˜Y›ýŠf8r§7`ê é»=ÓzÑ u­RT¿8"íÉ‘vTöC½}®óï¬Á§«° ”w[™m€Ÿ–f8dZ£ü–[`Ú+*}Ünù$w6c|Ö§ å;íh34Íí_ØÀI†Î?åšgj’™*ÿ±4ÂL5[`l±ÆøL·ÀÇð3ÝRcåÇ[`l±Æø„[àÎP€ÝE}Úë÷Ñ]i,iÊ%ÿ¶Èhä±È±Æ[`l®Fà£k˱¤±Æ[`l±>‘ðËýçž&ÿD*=žtl±Æ[`l±>ö €¾É¿€të¥NÑŒìïH£²çàiºóŸuù­ß•sN[éù´Ëïf¸Öϸüv«?c/øä»í ü¬?á·[ÿYn]ßH;ó\­ä´š£fCž²=÷?°{÷ý»¹Ù¹üäV¿´¼wï—u'Yfi‘ñ˜±Æ[`l±ÆøLµÀHìàvMƒoVÔN"Ý`“6·\›GÆ)»œ1õv[Á©òÐ…c¬KítÑmoßèž½…„îСª˜BIW®\”ol, Êx¢+oéwãÆ{ƒù¤pæYøîû̇ºƒHê%õ,hàíí!9cÉCï¾ò†4”i@~÷•++ËxßÇܽ¶¶0× ÈÑAîÿ/ä_ÿú“ûï3ÔÞ È_âKCòùyV¯¯þw:ôà`õ¦ÈgîŸÔwßfûbôY]z‚ÜÂÚÚ üC‡å+ï¼3(ÿá… ƒòc¿|wP¾zíÚ |c+Œ“·|Üî^út¶2ÝrmŒwçÎMã~×Öæ+C(ñÝ»w»={@à,@Y”îw«« uï—>Ñar¶f[`l±Æ[`l;Õ#0{Ë*ýúú”å“/üƒxd§J†üÝÞêäpcsÓóWÎcÃÓIÕÝu?±D@íºB>§Rlßeo{|_áÝÿ·ÿÉ¡ºS¶|‘Øý¿êvÉjϦ—nÁ|r~«ˆpü˜Ïà‰ýFodù¿ðêikKwã½×$ÉÙwáuŸÿ葇+ùg¿Á·{¤;xà€sè«R˜Û?‡Ôôàç=ˆ4P½aùíöŽ;žß¹Ûk_²Äˆýàø?<ÍÕñøßÕ«uÀÿ+U†ÓwÀÿ?|fàüÀÿÇK­'9àÿÕ¡òÿ7ª FJÚMÃá{ú€ùÙ`õ­ëz«öý÷ƒùàÜýÐ(ZÈ ø‹þÇÇïã Æ[`l±Æ[àSÛŸ*Àã¸Oic9@&PC5@ˆºSÀ#ÿ  snlÚ¼Õ {àmêì €HÔ'àøçÀ¦1.âÿÀXwÿOÆ´ø?0~Öþ3cÜ•€ÿ#àås†ZüŸcwÌñ`,ÿNÐâÿÀøò_7ÀEü¤ ¦)ØÞ®\÷ààýûÝþýÐÀw÷ÿc}uuZÕuV^àkîµ× €ïJþ‹_½çwÏ=PÀwEþ32_ý*´ð]‘?ÿ  ‡…hÔQÄÝw¯¬@àÿÏÞßÅæuœi¢(Aãà _Àël& K²àt`p„0°Í ìùm IÉ>¦áXQ`ålj±b€-9D:›bn28‡H"#Mè¹ð´tãí¦ b GÞnŒ |là;T4²!4y:1ïxžç}«jUÕªZ%YI,×"ù}k­wU­ªwý°ž§ÞŸÉÉñü>>>77ÌMLå‰ÿ‡ÿ¡(?~sÔ_úRQ¾¸€G)ʧ¦`Ð#Ÿž&AÑäË?þxóÊòQ^=ýž¡™MþÝq¯åõI¿7ý‚ykV€#óMänšÙòƒ#äWGÈ;B¾0B¾1B>ÌÊñ‚ m¿¼iËV<§ËÀÜ~pµùðjö0³æM²r4\€,w§ÿÉÄZ‡0_ù pÿ 0<Ø(^ã*¨¨¨¨¨¨xà5÷Àã!ÅÝ 0däuw:ÿ4Nßf‚óúM„Ø{hõMù› Ò’®¬]¿vÍ,ÏaÒËõkk0ßïfw{{W´ç,²}±ål-î³µ NÃã¬Y“{€—Æ[ü¿çM¬Üü°Mÿïy“'Ÿjhñÿž7 pò…³ÏAîðÿž‰ 2ЩÇÿ{Þ$À•¿tùi”wøÏ›´:ìî7 ~ë­~Óão~s~äIÀü  D`Îxä ­¥‡¿ägÀƒ0¿˜ß/00^YàµWð /€Ü4"Xžqج¬Êss33€rØ<öX sÔGÊWa;3Y@ø”‹ @|vzzb"ϰø÷aÐ×¼’ü¡ÕÕ }&=p.x¹/v‚±gé 3~åÊ{½åggGƒË{Õ¯ømä}´á¸m6³·Ž{šS&ã%äß4WÍû&µþßšËø+¾‡Í‚¹‰¿²|ÃÜÎ>Z®}CH9 Öb6››Jìšá€¯Ú­ÍkJøEûLü¿ ³2ŠP "YðÌ΢•¸2 ¿1«„¸°j¸§Õÿê! g€ºT T T T T T |n5[ÜïŽ BtÜ‘îoÀ·OàOÿ©\_Îýï#|’eîÌÀ"ÿ@ø¿¼ «mú\_xŽZ-à‰€l‡]9­¥=Ä€ þ·öf7€Žƒàü¿Ur3ªß€ þWà¢á5§ aÿï\ÈDrÄÿ5òáò—½]XŒÁ˜@ü¯ À¤Ãç)0=7¡y @Ÿü(€’œÌŒðë(€ÿ[9 „ãã+W`ÿ?&øßʉÿ!@Œÿ­”?  ÆÿV~æyÂ~¸a Ä! è…£ãð€ÀDQ~JfØé/ÿÿúäå«««¯?|_’¯ˆ@Y. Àÿùòãßÿþ÷ïk^YþÐ$€ `ü10=ÞÌ‚ ë¹¿ÆÐW~ ÀÈ—(bÜ“~a#Þï° /tûçÞ0xIô»¼¿Òïpù·ý.7nöºÜÞèwØæ] ÌbÔÀ`eÓì¤f^^õ¦h@ eiÒkeæ6•y(@²¦ŽYf¸Ùa{à~/|‡0 ýw~U€Õó ÌùOA.äSÕàSÔJªªªªª>£H €> @3ƒQ¢‹9Œžr³øáᙬÝe0‡bA\áGutõÍóþjíZöôý´Â葵žæÿ£9€Ä`?œŸú‡îTj€Ö8nZ?ج¥žóþ»øå4>§e‰¤ûø €ZüŽ`xh,;ÖÝÀË``dŒåG?(¶üï~W ¬œqä¢Öñ«€œa¡@¸V`Y]*¶üåK]*d|°2„"ÐG0% €nÿ8·0e˜?‘ônÿ¼6BìÄHäpû‡Ü†80ˆÈáö¹@øôƒ…nÿ+€ã:ú‡Û?ä¿}Aæý bäô0®1hÕä"§Pž1 ³‘™×!ÊÓG%ùêÒÒÒä$ÐI¡¼Ìÿ½ä³3ˆ 'Çé1¿ÿx_óúädú(2}€> € @`ÀôS÷ª_yÃ=éñ¡yÖÝ^oÊ{,¤|€È{,DÞc ò¾(†”ç,@‹ †4À-=Ä6PxfÜgôYLøÃÒG ÿ“*.R ÀÀ³ðBÀO'A<øßþ1à pИßN˜ÿ›O`w„§gÅ`­øŒŽ×j³«ªªªª> XÀÃn M‹u#„áÆw~dER? v0tÊ ýȨP…Ì¡ÎlÍmÑŒ2À*ëZ‡!Ôu}§WŸ¨Sª-V¨\€Š„áÂôq‰õ¿‹€±[v¶§ä?€®€´ØûþO ‚“áâ8€™ùE0ž`&€Dþ(O @* €'˜ )? À¼õ3%˜  «…q±ÿü €î;ü?];üÿXAîð?,²õ;üÿ•‚œø…ø¿$wøúÑ|‡ïKÍë•?4ù:ÜV‹Vã!üÁË§Š³ø@˜àæ¶‹÷×ø£ÏÀ àJ¹üÄLÞúÛ]Itð®õëß™ oÿ„*lå¢ú"/÷yB rì- €½ò›7]ÄÐüù°·<‚fäì¼Ø1ý?;;Híÿýôýž9]Ê J™°È½;‰Ï*„†ûPý±æWï ‘XüŸ™€à퉗ó'¸" ‰ ÞþøÀþ³ƒÕOÈÄïx|ò±™‚|Ê|üIõøTOµ’ªªªªªÏª¼€ð©­•-ºv!r u-‹£H0\}Pgª2”›Ã€NùN©Òé×`/_j›mx†€ SµŽÉC˳…8ëzÔ€± @P‚0*j ¨Ó"Æi" Æû(x%h É5Nä™%cþõ_ÿõUõPþ Kp ) O/uØKd 3þ’.„ÿ0ön5©€Sžà“·r%BLÊ%­ßÆ<§ å'‚Hú–01H<ÂÉ—çÊ+`ÌÓº°ük¯½_!ƾPœda0o‚£GaðÍoæo=0óþO# ˜avüg70à Ç!}ŒÌ0¼+a`$`†€áMŒÌ0à KK@o´vÎecþ‡ý¿@ì¼)ú8Êm2Ì>ðn™1j»KÇ?Ù¾÷Yh™¸š¸ÑbŒ_Ú÷{ú¢€«3ßÀ~‡ýu”ØKˆ+@?€°éëtÆUÌç ÷ŒøþùÓDs#7ƒãaì "'þmN/ÂúóÿÌ5¿k6¯·ÓÀæw×7Iüë¿Jqø\[_ 7@Æ—)6id,Ëîî­[·vÝDôøÄÀ¼ôøã€þ ÿ wÜsÏB\yæ[þúu„-¸¾nOa0çO@Œ³e#= 5˜ó§ÀsœÄ—PúèÑÇlù‡–ÄÀ,9è¯ðÿ"¢å;Kyk@oË¿öÚO<ñÚ«Á$àäàÎÞ¼"þ¿t©GüüxNâÿÿ€ÌOv[MLºÊÌEè[Màÿ«ÐVÛÛ¥4¢òvþ晞òÀÿ3ÎI*mÄ=è—®ÿ|ûã ÜŒ/Þ¥A0R@P€MÜC4=Ç:¢è.÷þ€ë?v<õXA¬#V¿ZùûWßÇ®«ˆð¾Á:Ø~µr¸þc×o/¿/¬# ¿Z9\ÿ±káæÉ›7 Ö‘_­®ÿlòíÿÍãø=ž“ƒ° ¹€NyL_ƒ€\@GBº€\@GŽùaÞ“dÈtäÜiMº.P «Þ{ ¹€L=úœ|‹Ž%LP{  ÷@An q@È_€Øä@ÇŒOÀ…Ýò@€Bñ~¹à¯ãWÒ|$‹àwñ{0Cóéý³»=Àï sÿhù÷®<ƒßgŠåñ›5›Ó,w¬_@ RÂü®ðÕ΀OBÿÁ<ð¿ ’h†Î]N€þð<'üÇ/AÂ8ˆ»¼ü* ÿ á?~¯ò×€ -`øoÿñû[þ°¡ ÿ á?~ø g!ç Àö‰oá?~Aµ1Þ'wùó·®ÿÉ ·ñ‹wóð1Nifö_Þvú^ ,|@ºƒð4èNâ[ëPs+W‰þ›¡Ÿ?ãlȬý ‡( ëÛóÿ͹™ÍOÞfæï˜}û“Í™9pS$öàñO@H%x¬ü›§¤.UUUUUUŸ? „AuŒ=:(CCDØ šæn•ÍÐÕ ° r_,o¢/‡÷žÝ¢ïô Ø9½J¹VÅ}T'ý´Ûæ¿x ëÄo¶=wò @þË/9€Î$gß„`’¸Î >:ðÈò5p¶‹þvwwÌÊ&à?,i l€øýï_]2×`è  õ`Â+K`è)ø_Â8%aúß?®ø_ÂÐ@®]þ•€€à àÊsúß0ü/Ἔ.ÿJ± þ—pNŽéG9¢ø_ÂÐ@ÎO—Oþ—p™;ŠqÎ)¿ üÿV.† ½;çÿ¿y<ño… hmÂ'Ç6“€sˆÞÜ9”äÎ  $wN%9&ñÕ ódcsÈY©°ã[[[L²åÖ (‡k„MÐyÏJýtÐy9]  R~nnnVSd»÷ƒü€.Åê{äRŸ0Àÿ«…üÂÿãñÈúðþÚþßäÍø…þ¿òÌ£Åòèá̬µ3Oï±ñ»Õ/^>œö‡rÁ`]þHØÛ„æ#œýŸ%€uù#àä‚ùaDëòG*ÀÉó3þ?¬Ë©'ÌÿâÿƒÀºü‘ prÁü'ÿ ÖåT€“ æ'µëòG*ÀɇÛÛÃMÄÿü¿9Ä7©€èÔQ¾5Kövú]ø.O¿‡ð0èLâÓ&À.®ˆ! >bAvá&vqƒ­Åþ €ó«çÀ °À4?p¾# ÷M2ZÝU5P5P5P5P5P5ðÀk ÉP„ÿPɼ-><=覱á“c!–9ÛßàÃÂüÜØi”0Á˜•X<ÇÙa¬ž€vþôÖ°=9=V& ²Núæ¿\ᤫô)7gg¶eùC’ÏLæ ÇÇÿi`€®%C(7€Î >ëÏ ü'þ‡í?¬¸IPÏîîåºÀÿ¥ ôÍúÁ^1DýSà"0@üï dÇõO-3– þÿ‘)Qÿ” €„ôØYD°A-À[ȃ ƒ¨J€P@ºò]KjpÑX€øßûb´_R&j á3·‘ºL‰•KnQ€§K>]ŽÆý¼¢-òIaFqÇDò¥#myËDò™¦•[ ’Ã?ßß2‘—ÄË-Ð廈ÿG¸x €‚ ÿéOÇ ƒÀºô¸(x €lûÆ~âm Í! @\&‹ >Õà± D & Í ÷ŸºœO/‚äˆQ(A& rë°2U @€œÜød ÅûåÐ…xþOJ–Î"„ÿ…(ˆâ@ø_ä'„ÿ–,hþøï^;Éõ¹'ýâ Ôà& ‰µ¦”sîkM'$(çÜ?ÖšN&H8Pι¬5Hp œsÿXk^x!ù'Ê9÷µæäÉT~[êçÜ?Ö2õïlRÎùÿíAÓ$iô AކG˹¹Ó,POÒôñùq’ ‚ûøb¾Fÿ|¸BKÿè^EÙE߀_½K@ „o€OÞ €ç6 Œ´AC€Ø9,P~dá'ØArvOö5—»µë¾ªªªªªªJa 8~ê[w``›ž{ôÑi s, Æ!·ú›;J $Uh3x7#v; Îou✫çþÜ@ÀNÚsü̉3ˆ gΜ±4@fÝžÞÍkwzÊ †~â;¸ŽtÒ7æ¿`a i?ð¿'`×@¹Øˆ:9ð¿'DŽüôX`®.è€ø?"VA(øçVnÇùŒ½@ÿfú§?òÈF:ƒ/-}ä‘ ’]O@ÌÿÕ€Ü&y$R"º„â’COº8€­wi[vÔ¦«Cò?k €0àÔ hߥl ¨ÈþgÕ%R³‡€ÐŽÄ"! }—°5`*€³Š¢‘üÏZ( T4³Ký€í!@r° .2Íÿ‰!‰ÿs“À4ÿ ø?+‡ù?Áÿñä! iÇYtÀjK`Á"rÌ:ªV[‚Å,]P€~«¼?í­83§6ý6 VÛl™ÊÄT€ ˆU’¶üúuµè7C°?”)Α‚ÎÙØ¸~}CÒ,tLÐy$²À”ZPv^~ðàéÓ‡òqö¥ü dJ8ñ%.ùò¼?éñòÂåÓˆiòæ@dÒˆøÔ©÷ï¾DéäOß#—»æÿ ÿçâÒüŸaˆÿsqühþ@£‡f ÍÿAþÏ–Gççø¿Sþ^õ«÷‚ Ôd➈\<6¥ó-€`YŠrñxÿý¢\<._.ÊÅàæÍ¢\<nß.Êé ž4#'€—;ßš™k£ÿ*Ì¡‡f‹î +AÓ±acTW¡€à>›†“ð$L`wµ@³ð !Âw›ÁàL €=ÐÿÃ>‚/@ó2ØSìh·suOÕ@Õ@Õ@Õ@Õ@ÕÀƒ¤–àp€¶ŸòÝÝ`XJ‹xc?3Šà‚l2ì ¶9ÛÙÏNœ3 q”èð^Œ¿Î8WøÌXèé-Ðm¿`_L¶vDL ‰êÆÅ`q± pÈ'*fÈ&*ÿwHôÇ\@šß/û¼E. àÿ—± ¼CÈÑ àÿ÷° ôÓÌ9@Ó{Ô/F0 ò ¢¥ €á\zvatPxþƒ(È9ÿÕ€(È9ÿÿ[  çüÿ‚PsþI6ŠrÎÿ €îBnÿs€1Â$ó¿­­ŒÒ‰®‹=IÃ4ñhqÆ„‹HžÈI€ÙqÀ Ü=M ²AP €€Óÿ¼²J|…Fÿ»j j j j jàÁ×€'*X àí¼)¬ÊGª¶ RXW„=WŽœlâ’”Öm·¿#õ§' z$¸†(€™(!”ï`ܼÏHvÂ\¹BK€gŸekæ@¼?ÜòK¬”Q˜Š³Î¸=4dv0Úó—–““ àbý£²Ãø€GÁ`³e³›²œ/3øé2Ñ@‚Ÿ.€‡Þ˜m"7Œp#ŠF6šÉIµ@fhÀ®Y4À6/¤¶A ˜Œ¿'€¸‰JªÎú ÀCøoË# 3 ÀÙå¼ü9g@€fÏNƒÐóSµK¬|X¼þá¿Ë²Àøÿúýž6„ÿá5𦠀긫]úÿÓ€KVŽùÚpI匭Ä@¾¤zW“€[î!5/ѰÊIà¾<D/2UVNWD/Î7€€10°&ò+ç@€± ¾üòi~ÁúúºËÓh=%€ÿsö)P˜Â†\ L±Ê+@þ/È•þ/È¡^l r%ÄI)÷rR€\…â½râÚpÉœ:E.y>¡JÔå ®\¡ —¼€8È’+ÏWç=é—÷¡$(äɤ\äO/·$@B€ÂÿMMpµ,—DHP*/‰ük¡s”&È>Þúœqþ±²õÛ›¢tnÌÿ7§iÐÃÈÿ¶‰™¹ © €Ö vq…ȹèn³v^ÞÌñ=*6|M •Ìÿóh2˜üç’xØg[À¿È¿‚…ß%×ÝUUUUUU¼b ÀUJä³èHàPM :иèýyK uìÈ(?Dyz$ð®íá¥ÃpSßúÑ% &ÿ¯˜íU$Sî×_0˜juA‰ÿ!—<ÑúKS^G<„Éÿ×zÿŸ¢°ý¥©°'€öe!òçÌ?x~F&â 2ÓŸ¹ñH ÐðÚþÿ¯ >BºÀˆáXâ>˜`Úœq@"ø_¢sÞbê?Ÿ€¨ÿ3 bh©˜@¢èU—(€œý_fê?1€@pQ‰ø1õ/æÿbÿÏ(Z^¢röÿ(Sÿ‰àtQ™è_0 Bºò¯½ ÀÏÙÿ'Hˆ â0€L ¾±Ðe›àZòàÿôîôî¥KoåäóßT,ßLäà+Ð~Ì÷à @ Ø0Œ'8È1Gã®%` n%Vù 8ß’J ’ôVqr(œï‡€°€]@+Ac0ß'ñ ìZ9¯æûá0| Úb(ØD·N5î|peSp{Üù”ä‡à`mì³å逫|´TÞù”ä¤ph'S’;€®\šÿ}ø0`©xœÿyÿ€áËå|ùà³Ûì¹`@ ŒX!Â%Ì :@]0ÿO« qØ%þoLÛÿ#˜ÿÇß’:ü‘øß…$­6e$Vè€[ôQ O$þ_Âü?þ~ .ˆÉð¬FP9lÿÕ3+Ã3Ï?Ïi|, >Ù☒œ&òt-ÉËqÃ`|œ @öô=r!ôþ)» —2 åË€–/*ϪßqhøøøxQ¿ãȵˆ ý2½r™ÜHš 0Ÿö”rÍxêT !k&À÷ß/É5`º#¼NF3Þ¼Y*¯™a\“¿¾¹@ÂHŠ”;\€Ìé .E€RÐÂLÓÐ9Æ\m>¼Ê¯drØIéùµw›À:Ë>ÂD·0à·xwÙˆ;`FáÌãüóPŠY€:ÿ‡×¿^5P5P5P5P5ð@iÀ€K @ë%½ ð"¥ù!@Ð<·eâj‚sF'Ô¡Ÿs÷ü÷~z­SëIšv°$•éx¦€L`B¦ÿ-þw &úi ¡Â€Í­¿@Ð1Â0€‚lÿc®?w“ÑQ€ø_|:¤ù?˜¬„±kËjøÀ ‚SÍBá‰>¸³%€ÿõ †ú{‰ LLøß&@¨¿+ÂÀÕ¼%0ÿoï$˜,Kqú÷F°VŽ™óç„8& €5 ?½œŸ¡þ^'ë„€þ·I€ž Õ¿yUk €ùÿXE` s—á£Ähª ØL¾ Ï6Ná­«†ˆÀQ \¸ì€8%ÕË{H 0M §ñ¿ˆfÂÀe„œæ¿b òæ!`9ÿÅ@ Ä~Åøì€Óø_ŒÌð·¿}áÄqƒ@›Ђ ›`mMl…;w öí8  ùÐ!Â+ûЂ@¡¼˜Ø“(ÈÅ…£¨—Ö™òØõ“ÝmØìn—|zå`ÜýSbž7°(˜¸ò%À•/1NžgÐÁùÝmèww»¨ßÝmèww;«_¾ÿÓdZ€}º[æç‚ÿ+!d£øß²Ì™;Lñÿ ÅòŠÿO–ëü_®_M||ýýÿ+çÿÅÿEûï… €ÿO¾&ðzFžB5„Ët€y=(:ßDñY쳩@ð—\sÈ1h#çÿ“K@jç+_!@nT¸Ô#«ªªªªª>³ ?$ àHÞ芫ñ €ÜèÇ3 E@Êk€ öðúu '£pž.ùÓ÷‚î̉ù‰þ±"1\CDŽqþ‰þ±"1œ\Ð?ð>1?Ñ?V$€·‡ã¿Ø€x€üŽÃ ®‘ þRš:†œB€?„sFH'ËÔøÁ7£ÿý['ˆHûjKä ¸ˆRï!nÑ@"9ìò¨q¤t €LtûrfàL*ìÍ= À2]Àü³ÜIŒøg!¦9†U/•/x@€£t ý¼¦Ò{i ÀEº0ÀC’@Rþ‘xÂX‚ûàátúÞO.ÂDJn~ù­ééI Ïéé§cï;—$€\ˆ²½ÿhú/†5ög/×PŽb.!X¬šÁ0ÀÿVŽ‹qD5ög/ÿ­¦ÿ3¨°?}S€ÿ­¦ÿ hÀ¨°?â+‡éÿ²0bðÖ[?#‘EüŸ$¸Ô øûhNÞ3¯oßñùíqèw{¼¨ßíqèw{<§_ÔÀ(qx”,ð¼bþŸ©óèÑ þÀ?RäˆÿðT€9âÿü#`AŽøÿHX#þÀ?øµ‚|ˆ|©›f_œ;þ­o*} Ë…U.‡uî/gÑū߀@\ίïлBLë½±`@Ã0‚ÿ%]kÔJKÐ4 óÿx†*pÇ·@-P5P5P5P5P5ðàh HÈ¡‰ìŽpÜž3äFA(9@°=Îw´*HH¤ó´ô>ÊÊ ÓÞ×ð“¢Ù:Úºƒ³ ø' °“Ìýà $àŸ0„‹«A€½‡$àŸ0’ÅŒ«.ûøø0ÆôÂùp]*•Øf`ˆâs7q«ÀU€#¹8˜ ”Чêàÿ.€+,ÔPa“®ÀG à¥zh  €˜Àé_ 4€@¯UÁŠ€ÆðQÀ‚†ý¼h  €€Çê 1|0B¼*€Hù8 ,&7é±Y$vqí€>ËÀÑ¡ÁóQ@K`ÐÀ&`b%0 ^G°ÐÀ&Ø" ‹D¦‰*Å€mgbˆ|Æ2Fñ¿$`bÎRþËÅÿ’€‰` òuËà¦N œ‰`ÝgããHI€-@wßÙÙÙÒ|çy9bàŸ’D{Y€ñqäPø¦p(Yõñq§ |f6 £qšNh¶ŒüùaÚ€4¥¹D€òš¿Çùû¿7y€qÜHàÀåä ÜýS"ìýS$\ùàÊ—'ÏÔù~̯~e úÄÇ;¯¬€d”hñùÿo’f¹ò~a@¤ =X*Ï,€Æ @¡~fÄcûÛ’œY üJrf4´ô)ÔÏ,€0cö@øÂö¨D±xßQüçJüßÇ(‡ ó/L1¿µP‚+@ê¦ÿF ü”¨'J|ņ¨ήö¤j j j j jàn4D¥N4-ÑEé¼ ~³õNoulÃÃKˆe éÙ>N¿¶ƒŸÜéÛqW–ü(€Æþ³+¾Ñ" @cÿÙ/w&ÄýÿuÅÎŽÿ#€`‡%ôšazxg؆õ?h1Ãè,bØO#±Ó°Žt™PŒX>O pþŸV4ˆ®‚Ôó— ð? 6É1\—V0 ÉÿÃЗ$2€¶YùKÐ’sÍX•È*G@þrËiIÐ’¿d€ÿafO2@ ë¥<³ò— ‡ODÈZ?² ðÚˆo'øÿ’ÁÚå§ã9bào•,,.¿%À.R ä%3¯a¸ÜÔ½;& 0†Ý6¾%0‚øŸÞÿ¹Ÿ\:ÿ¯Þÿ²Ø(@ûb óÿêý/‹´/&:ÿ¯Þÿ²Ø(¼$4àü¿ÿcE–8 ¶Ç`|übÁ`gœ1ÆÇ¬<ë!ðòø¸„À?x /Ÿ‡Àøøñ‚…úz¨¯Ž/<nÛöI”Ëîóa6ÇÇIMŒËÍ•½‚ þ @á$€¼ €Þ?Ș«}üåSzÿ² "S‡–‡ýE¶ü{W´<ÞÙÖÏͪ¼5=J#@À‚ —3P<ÞÁ=!ˆýaPØ0ÿ€¼'±?¬Š±?¬Š±?¬Š±?¬Š±?ƒqæÔïãóÑsT"q´¼¤J¦ÑYxN9srr0ãJšÚ'¿ë@Ì/1ZÀÎÈÿŸ@W €Ñ÷@=¢j j j j jàÕÀþ,2ÝOG(ë1œ¼¢²ø€ýŒ¹PH3›íïà°Qþ¤þæNU™Ú9+p”[€Ö€ý±Vü¢¶Ñ@ÜYÐ@<\ÀññmùUÜϱ½ÝA¯ÛÖÝ]„Ç,ü@¦ÿsNýkpëüO¡±¯®%H xd`RyøoM"€&¸n[ŠLa².ÀÀ…øÄdL¦É…øÆDL!®¸4Düô`W?XhT@Øh#AcÂ|AcJ4}Ϲ™>1@€%‰ȘLðÐë.  ˜(@3ð„I ù15¸€M1µÈÝїߺ´;¹;ù4€¬|ùÿd€n¾–Àp!ìŠ,Î "XhîÏ_Î@8æþx.H8á\@šûó$€3À…¤¹?AÿCû‚ýcÀØÿïnƒØÝ–ùÿôù5°ÿ‚݇Ìÿwå/ŸÚݰ»-óÿ]ùü7顎Í¼Ìø…Uz¨ãCbvå·]û4 @§ü曆‰˜£þàÿ]xX”"ÁÿåÿdþS^àuÞ?@á¹<€{ òþËåñcªÎË—òøÁà–—(!¹ûsnv†ryeÿ!Éô?Ò tbÈÙ£eú ¼0¯ÆÿàKúãÄ(ÉÅøqJr1þG Jr1þ7/ 1þ7'‹€ÿ›•"0Ü+”ÙÌɧcÿð_ßa½%Âÿ?®æ¶€_ NšþVË-s)…D³¬@έ˜X Ñ»T€v@W;V5P5P5P5P5° ‘·N>ï€êîqqÕ9©FÝmʧQ£&VãB×ïä ÀáYÁýä€þ!ƒ0S=&ü¹Ðõÿ!Ìý#' è/‹'4€÷À”0³ƒoîî ø—‰þtü‡ØŠÿ©$ºþÇ#u2b° ¦f ‰°{ÛšDÔ:ð>lÒIì2;½Ù…©l›¬š Àø—d?BvyM ð’7”&`~÷Œ$øç¦û?×®<Óu‰÷ç uàŒ0`žXzgÏÒý_|êŸpr2-‘d´aÇç"4}¤ÍÀ™ÿ'^s~.r±"˜ã`õ—4‰Ûû._ºt ðø?/ŸWÿuqPÊ"0Ī-,b‹2X$à½E´•9=.mLt.Û·À'¹DsþíR°õ/ºÊ«ªªªªª ´À§À…:¸;ôžÌXÜvïöôb[MæC²¬ þ—hk®€ÿb·+<À„àúx9à¿Ø ðˆàÿÐ@ðþ+¯´T7é `Ú€{Ì5¨Óÿ:Û©@o6<´Hƒu  c]>é;$þ#Úûf€ÿð?xüG„ýÿñùR€ÿ¡–ßýîwÏüް_à?6¯ørx¯bÖJ¨ñ¿8xõ"æß „ýÿ±ù\€ÿ>ñ«$þ?´º´àÔÏy$¸â5YÓž?àiìà—nv5VÝ €ÑãáyP™R9:1$†K0’`!@ê¤Ï5Ÿå‰÷°!ü'À5Ÿrâ}f$üð—5Ÿrâ}f$üð—µ8 Lhýqe||e<ËŒÓúû¹‚œÖÿ~ä´þ?~”IêòõÓúq’Iêòr´·øøøTANëÿÙéññéœ\.¢Âÿw o¨q ÿs3ÐBîáñv ?RÀ>Û`ÚÕìý`½¿l!0Ïô•`ý?²}°ð?Èñ™´Báq ^"À]û—]û—]û—]û—]û—]û—]`ýO#“0ÀÆ={Tö¿SO%¡È½Œ2÷Gûžê¼aÿ¯5\€Iù˜èäaH€êpwŒZªj j j j jàÁЀ'>5~· À§ OíÃføìPð?¬«!wµu8;ü <ƒ|¶•?4œ þÇ¡:<Ä]­§0ð¾r–°Ál—¼AÐ@ aé/≀$9˜b´.‰×,$$ÀYUî!ºì ¾8·e ¬‹Á:¾|툛þ8rÀêŒÀPên1À-@þ ð™g$"¾Z9êG.ˆŠÿ·À,øŸò×H€°æ§M=¾|ù‡Ž9²d ¬KD|µõ£ü«Äÿ¯š×Èà‡‘"õ¤ãóä~ƒd,à±ÿ“è%XxI–Ž,ökŒ¾ êàÕ‹Ùþ™Q˜@ÿá( h^úa¿À|ŠS@[~AÿÖ ûþãSœZð–_[쉯Œ…=äWA`Y¹Z,UÊ_-•‡ W~õësð.-z\(1ȽŠ,Ð~%…재ßáýu¯å¥ƒ×$ý§¾%² -J(/.Å €ŠýËAû—ƒ*ö/Tì_¨Ø¿P±9 ±è¼ÃwCQ¹q=áËyÔë¥û~ /¡™þ„‘T?‘Z>ARóIÌ0ük Q#iXÖšÈF¡uwÕ@Õ@Õ@Õ@Õ@ÕÀƒ¯0ÀƒßÛ 3æœ4Ô/Óþ²_Å vCQ¿LûGò‡Ú–_EýböïvéùýÛá½° з!ÿ+ ÓÿÅë!~ôˆ>Ð5S® ‡fjèo{ëö 'Íp¸„ŠcSdyC”;;Mi[b“ ÀãÀu Ú" yF"¸Ärâþ9‰—/ ÀÀÉc䵄`G$"€3ÃŽë'îÇæˆ/w|`÷V¸9üœ'0Ðx Ð# xò×H€ðüß{PXä/•'ø?$P^zé% oÁÿ-°Çô @þ Þ‚ÿC@nSÿà;ÕÐ8;åö»#¿×ò÷¹~>G°þ' }ðA£ýÉ=¾»UÄþÎï¯{-// Xÿ“(v°Ï AÇG“/ €ô}*Åhr|”Ê_%ÀìÒ  äøÈ—or|”ä$ðQ’Ià#+žÿžËWÒmø¢.è/8EzDxöî{ ™ýˆþñ%Xç—?Îü‘Y³ÁA¬1fåóó+_Áú'•蹎UT5P5P5P5P5ð€k ÁÈËí¾}D@(p'¢yBÎýwæ÷ܹ½@ÿk >™ç§ðb`Z‚©ÜøvÎûøu‹Ôî‘! Y ŽGÕ_l»¥F•¿Wygî5Ø÷¯{¦?ÁÓŸ”¸?Ë»K,'îÇpüSxq?~š’œ¸? Wž¸?š§1ÑÎø5"|ýÌ-ãï‹\>³ò{-Ÿë€^ !€NAvgGÕB¨|×ÃúŸsðÙ#d€ÜÓ$_™*„/Ü„\¾ròSž‚\¾rò÷¯^}rùÊÉ/ÿö·—!—¯œüæÂÂMÈå+'G†ÍÛËWN¾=nC._yçÝ¡Âh–>© ,nË4!=‰’ßëŠ;)wÝï#Xhð'xMÖST T T T T T üåh é@+:ôÌŒpj,ï…ÿ:¨ƒ±¡,vž?Fhíè/2Fòz‘Œ0‚ ? MÕíCÐÍÎZ†Ìír¯ò, põß¿G.Û3»37¾°Bfüÿ§–·š£”lz=æ³.í$wìgÿn{¶ƒ@Åüaüo˜€ÅÞº±9‹,€”ã›D@*?uY)Ç7‰€TþþU$  ß$Rùåß" åø&Êo. åø&Êoo åø&Ê·‡ÈHùp[ˆ€VîžÒðií¼Zâ×dçuâžÚð°ø àˆàíœ3xäKvÞ4aƒKA—4Pó]îßk±Ö\5P5P5P5P5P5ð«JüÙ/Mø‚Í}6-EŒýÅîìè}6¡v¯ÇŸ»|½‚Ÿg ¦i ” &&1<~ÐåŸík_¤ m·FÉ?Û½¯­¯¨¨¨¨¨¸S Ä@ï¬@WØ™A5«Ð/UºlZéz=ª†òÓ"£'M8Š.9ÀjKG¼f;—³¿#Ï?ꀬ<¼Ì£*¸ÓûïÏx|Ô­»hÇ}Ÿ=û ›Ÿ}û;cæ¢2÷QÅ]\ˆZ¤ÕÀÈ›ò^U~”MÝÇ!wwI÷QñÈCÚò‡Ž¨`dý#ØÙ^åì«ò}”oÅ=½» VKý)5Pß¾Jm×sU T T ü…k "ÌÄíÛ·WÚìvQÛÍÄ­[·~ 4:N¹l&åj¦Pž#¿‰7n+ÉG•Fñ³gÏ~ QøK:•žè;ÿÆÆÆSE9RûÁ¿uv†ÿƒÅan³º¸º´´¸i†7D{ßô€ùf°ƒe«sDs]v„×ý:j†¬=ãàêzÓܸ‰åF±Ù ,¸Ï7Ð w±”ÏPcÜÁèã.+ÙÇÂC ")º ÝÌî—€qš„Cðñû=^6[÷û wòrB7ä™xª˜dÏ÷Ò=ê5/úÞ¡Cý¹ºUlן«Aw¢ÿ}kN¨ièGyí„o»þF 1G5´¯ŠØî WSOõ£ÚÆ;4ì]î‰Yu'È?}ÝsD,øˆ&ŒÔMÔÀô´þ¡‡Aò–QW"‘„Xä2º•ÉÿGÝžwréjþ¼åc-<üpŸÖú¥,yËßᮋùîÁï~ç;¿S¿ÜMíµLÕ@Õ@Õ@ÕÀgS1p H.Ûsëâ/°Â꿚²”!ZyIæÆ‹Ç°ä£Jg¾…¥‡¸‰ ðIú·°-hðSXŠ8`0 0³Š¬ó‹‹@|«XÂ5l/­ú¡¢;E³¹Jd3!Kþǃ E @sí_°(_zuüÚ‡Ã2¾_¸‰Jä; y mû‡»·n],ŸÁœ>}? Q–t:Ú9Ô±{+ÙÇ¢CLÁÝéÍìà 3ß1€ÙÇ+`4±•p8=÷ÃHè¸÷AðíP|‘bB 2ð2€Cû!î„ìCóx=È·Ý<ýôhc‹»¹ØûjÕ§wšÈGÏ÷%g ÅÜig›Ý !­!iÛ1! ra”ïþ‹HÚŸ!ôÌÏ_~Ùs´ôhÌuÀù±/³+ï]I:WÐ^–nãٛ̽hfæf€¢™+4"i —ÏÞÅܼ)Î~é‡ÿøÃ—Ì_ê¡ÿ/Þ2oýñÖÅ7wågæ[$ EÛËwy V[+ò¸ò”c\ùoÌ/œ]˜7 ó=^]ÈAyõýñ&Ë2€ÿ·ÞWàÿ³ï(+ñaZ@‚(”_Xø´ÛWžŠ ŠgÀôÊÃe @ßßé[Üëícü"Ç/ÜAK€ºT T T T |n5ÆàH¿  dÑsß 1÷‘r2ÑóŘ_,×ÿÞss¼×-Äô-eÌ™3½èÁ˜W_í??L©«6›@0’¹}³ÃÿELû‹ €€nw«i ½•>x—9‚ÀÿÚ…µ5|_E P=yþø€.˜ÌVàq2·nÁ¤ÐC˜¨"…á!ü¥ÆªIЯÍ̡Ȕ«ç­Q<·¿LC\ÇšAk4Ѱ[©™?{–øiÑ;7B·{ÏApñâ¹ò)B :Ôñ%n‘>A.‹Ý~篴æéRa ¼qû#z»ðg}g+7ÓÓ›d¦§ ò¾GàÀÑcÏ. Ðùøü™3tbɰ' ²­1sÜL2à:mð3¡Œ¹t 9è._~ [¼©Ú{ç7‹v^X¼¼’ŠD°9@’¹ííœé†È¯¿½±ññÇÿ.Ó‘Ï€@Ç—³ãù8˜÷ß?ÅŽÒ˜ß À6¬C,/OM µ< Òýõ‹÷€Ož ,½°;m´Gê×4gžþ˜®?ÒÕ91€™Ï]Ãmëè'C°×=wN(z³ cjBAdßÒ£¥¾iÍòúõëo^¿¾îØÌ÷þ%ýWWIÿ@Odî@’ÃBDàc¹—å³w ÏÈ£Ú1‹¯Ï¿[ò§iå€ÿò½Àëÿ~Ëþky¤;õåü÷[ž4¦=ÔÔ‡o½ñÆ·ÞÈÏÁ?üð³ï=ûì³ýô?˜)•ÿÆÂ7¾ñ~ŠO•mPõÃ3%~|ˆ:†æ ÿbÚ_L`  Û£n‡*¯¨¨¨x5` 7&´¿œ2Ó½‹V(CšÀ7ܪh‚c×à»ÛW5 €Kõ›+,ÝÚýë¬0°83Ñ­ß_ ‰W±ôÉiÜÊS±?çW•X=/ÿÝ~±øÇ„ÿpGä’ZZŸ€háÌU³¹²± YXËÜ3²@€ð¢þk×ÎK‰wªRªáÌD:¤ @áüÚ@3i`sæÌÉà$Åxœ,g¸xëVþ ¨cª]þMv'Ps’Æûp,ç4Ö­Ä[«çÕëjÝé!¾cCë“Ѱ#ióÎ•æ¬ ¬78•éf8÷ˆÜQçš‹ç.â3÷FINž%šðºD ¿7ÍÓOgkçÙG¼Çš§/¡pî(ºÎàö·ÿS"Éž r!Jr{tpn'J핃žé~;ÿP†øÇÀ ÿ_âÄ¿9,FôÈ=ÿ´þ—éÂÿ7.^Ä&§ðGÒ‚ðFŒè-îQ¦ÿ ÿñÂ&œXþߘçÄ¿ù†Ð [žä?§ÿÅŠé*Þe, €P9Îÿ?K ÌÀ@ÎàaÌÿãá‡aPœàóÿ?  d€ùF(Ø ‚žn "Züc¸#Þ¾ßù®øÔ¥j j j jàs¬ˆ˜@"eø BnnßÞˆÀÀ†½æ¿há3`AòOdBÿ}wö‹74îÜÄ Ìÿ;¦õ߸ñb 6J¥þ•˜8‹ùÿo}«ÌLœÅüÿO€ ´ãèXÞl-Å”+=6u\x:w~Åÿ«fv(ÀpÖ`«Ã4ð  >þ¸–¹¥8)6;8bGÖÜ`ÖÖ@^_pMñ¹ Ôz`Ãéh#¾6lîO~ò[;׺ço°aþ웲†'O Ž+v€F®¢Ì<6»¨`WÖÒ3ÈÞL^3×&sc‹ŒÄœ î¥ôÐÈ”«çu*žÛ75>Ä.¨!úvîÜW;Û‚bì¿råY•6ͳς`G“a8äŽ!¹#€þS ­~}}ÅžSÉËs›€žuºAˆ=|vt/ ñi.—.ðýï9(L =å ÜþBàö×0!G°ü7  ÙÝûŸr†ø^FN=®qY>¯ËZ0Å­øÿÆÄ±c'œ ÀBD(þÿñÎ`Ϋ@‡ê—ß×`:˜§_˜xk"°øÜÜ•°HüýKDÍ3‹¿ôbÁÿ[bcmvC@ñÿ'€OB@ñÿ\Øp†×/Šÿ×&€µ”Àè¿y啿•ÃxlÁÔöGƒf0Ó`ó!šæôéæ´­!¼hÝ3ìž ¾Æom5[ qý Z‹ƒrḬ́y¯ qxçw¢gJÎà›çÞœ'‚ïºä+nMŒXÞúI6é+xsµY=gÛŸ:¸ ¾ôÏ¥H¡ƒk#—ÇÒ3\™ï¤ž?¹€aÀDf¶†ƒð¿{õXѹ†öa‘öŒyöø™ãÏ– €ææM9ÿMÆo0 XÜîŒ.1­#ÔC"¸7IøGÀ—^ú!LÄ }þ±ë‹0¸EàÏ?€mOøGÀ¹9 X†0È–‡rþ1š¯#ü#àü<ž#Ö™óãåu‘Lüù'ñLròÉBäÏé÷ѺÌÔÇ ‘?Ë&ÀÈ,–€ @G,ÉÌàÂàý¯ÂT6ÿßE „/†¬Ar*®ûªªª>7ð@ƒ)dÄ\ßÊÄ '"ñÒâ\n! \~1ñ‹_ØáFlÀÑ%²2FÝÄÌL„q ÈQáÈÈ(€Éc“;½š{Jï5ÇhÀâg% ‹Ó À‡ZšæìYpóÕWŸÀ@»;}Ñ`†èÕS@èÁ©™¸í'0(C3`šFös\ØÄ¿„•OÌ'ü" ÑÛöCY‹KÍ`C`D {Òi÷ßÜÙG0À2˜þo.¬Ñƒ·¹~ý_ð=׬iTÀ !@n€Õ0€ˆh¶‰ûaÀÚ" e˜û‡0¸¹p£ÙböŸ@ …¤ÁÅWpÞüñVsõýfy ¢àÌÞéá&|ļ͈SŒèE•Vijy!Ù­%m÷P [‰­ )s†xøŠòçшó®ŽðYýõ7*Gk¹Ã0û¯¿Í³0`@鋉̽ Àž !Ô¼'±®{€éC‡fbÂvsÓÃHÒ+@›˜ÿ+ñø¥ÐýÒåËÄÿ¨:7ÙO =s^îTÁCW³AÌoVpûóËæLÔlÌ,AÀNå…üä˜ÊÍ:æþû?¸vͱëÁÓeÎÌÏ;†¢gNçBÿ„ õòþ°Àƒ°œþÿC‚‚N¼&e_ƒ=bšÙ^xë­·&D—>úè2|ZüO+ ‰‹xmx€w×~£_‡à¹ xspA¦Ì(‚œùï?ž}â‰ÿøÇ°nÀòÉ'ƒh›€éO€>ø|éІh(”omÍ^xêÊ•+`¸|¢f²yåÛí­‘ÆÀ%0—>·Œh› 9}JïöSúm×ùjDùøéIš?HTú«€ÝÌjg €c@ʇ_é´’†Só':†}ÿwÛ¼Ý! ÁÖ¬®jŸ!´ý ¬ ¸t>—H¯z пžÞ%Á. Óu¬ß8 @$Ãý†‰òÁÐÞþŸþ‰4s 5Œ|¥ˆœ1¼œµ´¹)×L„´À‚°áøOŠ*I£¾ÿ˜ü+ k`¬ß?q?l8ýJ€o~ñýÇä¿XØ@]cýþ‰ûa Àé°b,/¾ÿ˜ü+ k ÿø/Hfÿ% `dv†ŽÒ@fØs>ôa9 -t†>ã@–£Ð@)ù¸à]èªÀÔÁœ­ìâGô¿ïàíË/2 °.UUUUŸ[ 8 !ôg¨o,€É·C”AÜ"©{°€¸xKÆ ¡%)– ]% 8€¹A8z`]„þpààE8¢‡ð³¯4M¾uùÿ\q¬’ð¡dìäÏ€\ ðÕ³)Dô'f粸ˆD+T4ä¸ÖÜXfÍæÌ Á¬k¡ø,šI³ô±ùx ߨŠc4˜™ÀÌ?|6‰ÿI஼À½-L³h6oÿ?‡É2Ç4çAïCgבšÄD:£Z@ÊÓ¸Oƒ°sಚÀôDº £~XüyÿA°ç—èï €;ÃáÑ£'O6@¦-ýC ÑÀv3ÿðÿ_#”0ÍiÌò¯¬E©1ñõÊ+" ‡ö­€Œ·Õ w¨™|%öÁ¥Ö';gˆæ±»åÝ)w¬2pé/1ÿO€èî…µ?t )˜¬ÿ?‹ 57¢6;~$¥q² ÊÙ1°›@ÀÆ q‰qUmõ`„z““'ÀNܧëÐ,ŽÁÈbP%f0u ÿD 9pó&cD ªàÔÿkJt- ð8Ðà­>š˜ø(Æÿ°Ø^\d”_ʲöî»ø ÇÏ kðÚ›€­Ý݉ ĈlÓ¾IbðãO>™˜øÄÄ î^X,Ì‚©ÇvÜÐÏ…58ÐàÊï\¿þA\ÿžпòÊ·¿ýíÃ.Ž~â€[˜ó«|oÄצAPBîáwúô©S§PîÈS§[àô)í ºè\Ê/lmAÿ O#Øè €¨ñíÑñÏÁ=Ь$¼.gÎÑ4BtþY³åxµhçÃ+Á[­G­zHJ°qæŸí?÷曈h-t`bO½Ö¾m+à†Ý×R—]ýíÌ´0$HºàÃP>l0´ î²Ø+õ!Ϋ€4Œÿ D»P,øÚ€9ÃÒ §yè•›Íó žg¼ðžOMüÿÑüüG €Yxü·ØŸ64ˆÏÆéÎÿëÿ/±ÿLjBbi`Ê_&ÿ-ö'ù•ä1àëïÎÿky±ÿ'’gyLùËä¿Åþ´ @r~Ú.aþßþÿ´fW££vÑÿÀd,¬ï?œøaš¯0 ëû0¥ò.ú˜€ì!~gZ½™ÜÏ<Ìúm·Uà 9`¾ƒ·ïwð­ ô4ÔýUUUŸ €áð?ãë&‹ðkë@üÔÏ$€b€8X2^±ÿ=¥€†àk8ÃÝ1¤—¡‡ö®^OHL6O¸CåxÀÐÕ•¼™J\ÿ'{0>â8´ƒØ¤<«TÛd¨LÎÝ€8G Â×ÍÜ`—?ºûw¯ˆ–@– ÒÏDãg¡D’CñÜ?†Í¦³’oÖYý… ðú@ ´9q@¥WÀÈ_̯H'Þ]Bà{‡àå°V9±V€b—Eé—“ÈÒ@m8ø i@g à{p” Ú4‚%€pÏŸ—ƒ€œ@$Ggׯ-¯­­__?Ë\)àõ‹ùzT Ë{xùk@8$QNûà?Ž!Môþç¯ÂÿN2ÀÿŸýŒõ¿ðÀ?—·R´áڄؼûá»ï¾{ÛÝ›þß„6pnàŸ Œöã)z•ã¥òÇ!©¹V;rC¾†<õÑG7o¾óÎÄÈE_8œd¦‘9™\w ùöÉì?+ÇË$1ÐÂT³¼§^£€Ôð.Þá‚cÀ–ÌbC¼´ÝÚö-ÆÙ‰²€ièð8hsÂ6 w¯¢²f“ €5Îîk„ýÞf¾¨¬ðuç;Ï¡/Ñ@×þ¥ ºå0B'xœcœÿv@]?<@9 ä@ÕhàÍ °`a À„æ+S$Ô  ã_üÄà'ø|vv'‹Ÿ9y¿–ÀPy8ä0Q(7Tît@|%¬ÔÜZ6ÝÄ ŽÈI(!HEqXþ °)qê›6]84ø¿óÎ+b`´*×Xz‚)Q‰j¶Í`k ^²b˜q>[‰áPë0ˆÏá2a#è 7Añ4Ï?˜GÂߣëwèª&ø&þoOù°BAúÉ&‚ ¨ÛĦÀæG.5+ðó€¯G‚ Àß’žœÅç)W€DåâiXXS‡‹àà'ü’H,lŒqȈå‰ ìîÂ{=©ù>»Z­Q0ÿLCàO¨ø8üío·}[NŸN¾1Ûr+$`mÁó«<ßòHZÏ éQÚ?z2ù€dtD» žÐC ‚»÷8bX%8àÍÿ÷‚]ÀøŸÞ<ÿ<‰ÐÖ1 ¨fú7»$þá7QšOÖð_HÀ”eŸŒ&Œ¾ÖÀþk‰˜-/% €ÈÉPõ˜þ×É q³å% „9„˜ØsÉÒ<ÿ_˜Àq …$@§|þdy&è¼_‚)¿€7 €ímé×ö¶1Ý÷Wß «¬j j j jàÓ ™îÞ#‚# þÿpKð?v“€EYц˜¬ÓòP†!2!ž¬Êè!„ÿÇ`ÛIøO9Çò„ ö XZà?ŠË7ÿÙUKðþÿ£†›2våP;ÁèCÿûe˜¤ oà Xìœ? €8Œ@Lˆ ÀùÕóÖ bÈ\C`‘HtRذ¸y“x¿9ú(€4 pÀÿ8@sŒNÒD °ø%¨`J® Ð+ªÝfg@¸Oæq2ø{œÜ ) ¨q ?~𯙣þ0gÏ~òÉõà ®þ°Û¥ y ‰9ê¿òÎ;7o~ôѬ]ÀÃÒÊõ}±}7Ø×ÏbZ„ÈKÍ×ŘÁ|p—»iÕ¿fk€)ü Ð>‡O7‡ÉhXñbóíèæ‘ú·æ _@ýXã챯_ÅšoŸ&FÕ6ZK ™iߜ⣾<p‚ïcFüLBpößœ‚@äÀ{z÷©<¨¿µC@̇ÂsLÿùß<·ŠΡüê9Æh#(í+æ× Ü–àyPÿImŠ÷qs:Uàù‡¶ô‡ b ƒ†ú…ÇŒ¶¤˜ÈQÀ¾Iøôøß› ï7ø+ÚÀAˆÂ]`sñJÔøE ‘¾äÿƒdBÀ K\˜þhw~~÷£é8%#ñI @„<Ìr;6€ò_ļÁI øM"Þ'?…×ã ?ÜŽù/¢}ñM\)_E@½ÆRb"à7øÁl”I*@¢}cÈ]›~H €ÿ»*ç@çÿrþ¿øQÍyÐù¿œÿ/)?ÿï%ô™CÌøcH'~ÚÀ ‡¯’ Ñ?gþÿîãÖ úïÔy™ÕUUUU¼@ö'¤“€baÎ`dÞ:㯠ƒâ,€Ž‰ö…Hfüuá–ìôÓœ6 gÿé*  ˆQ‹µ(•&ü§€Zý‹ÅÕ(@†žOÜ|ˆçÇŒ¿.ÜÂI;„@rƒÄMahêpˆ¨k ãÑÛL 1ÎK ˜À›`iÑ ÂÕØ¿™$@StâkjÕéøOø¿Çiw0Ïz#(¢ˆþ yHЋ‚Ê8èøU@–Gi¶jJœ.¬¹ŒúöšÇ'ðýÇçù1‘bÏ/ÿdH eø/ÕºÛ;ÓÐ`™v›¬Qà ÿÅk½%à©°²èŽÆ ¥q; ¼· Á*#DÑÒUĺ!þ'>¸¶b\%‡Í€ ÀæÚ&((ÐJŽµë øŸ±)œÌœG&r@;Á(˜eæš“isà¸ÿƒ À\óU¸¸!Á¿˜þƒ/ïûâ_$pøô,ÜÿÁ¤‡ Ô5žqîà32ÓìÌÁÀ>>ÿbú@¾À€ €ã™!œP€JïÅUg ÞMjÞ×@øBsüdæp€0ÈŸÜ tìÿo èW ÊXÁí¯“o<>"€ñŸy¦™;a@laWK8ù!È0”ë„S;ñ?}–—×á þß3ÇæoƒÀ< °Çñ£Ç¿Y¸ñ ÿ‰^:ðYâH@±H,˜òïg/\zëªñ·—…-¤…ï¾»ØKÝÎã¦eÛBê LÅ%ÿ9èñožxûǯÂàmtä<¸æpfù–¹æÊSÐÑÊJ’œ—¼,ÈB®mpO‹'hôÏw -´p€7Ð`ߎDšæð©æµ×HŸ¾úêkpÊEÄ¥8E€­mƒà©Lvòíà6[´ûZÀ¬?0$à?‘$6ÜiZ¿øå~Øx™^ú‡–éåOäk <ësÆüˆ”woØ¢{yËŸ™?qÿ)NàMw”¦-ÁМFü}ÝáE8ÇMýÇäMŒpr‰Àž; ØšÕ7ñËøbtkÌà’ùòÿ1î1ät';÷ʲù6ñ¿«}4ßòÄ_C6‰/4”æK­ù6ÑqK0ˆ~¡ðm>ÙÍ3¸§x€#p?‰…íŸÔ À¿½÷aÔAíÂöþü÷…5ðöœ<ƭϳ‚HnM"ýÿó·Xà"jhÀv1¦§I! `Tcñ‹õ¿„ä Cà3( ¬/AIˆaÅër{€ë (‘„Йè Ö— ÄñjþÏ ®¼„ !,¸Âø ÏàÏ ÀþR‰ø`=Q…næ<$ú_ï´|[bôeŽDô¿ý–/xø3„¸`oMã˜m†âÀð2sØÂÏwVÿàq‰süÎÁBÿ³J©;«ªªª, h Á‚@NŽ·ðP¤@~»":Ðrå%€NþwÁ  “ÿaýLäË”KËìô¿Äàá Z€«ígYhùßi""óúsAÄ~í². ¯Á¡‘Ç .XZúBF)Ìÿ·ôÉyfþ—y™¥Å#v¡p»0¼çJµâë§=¥ìCŒ%{„Œ“- Ð%(NØFt"€Ýn]k Î5¯#Ïï70ºÓD9 0Tµ½i{(!N×ÖVð+×@ Õy4Zõÿ3ÈÔu4ÀRëþ×4$l%8‹Ì j< ÛU[ VÂ,¸8ä]€LxD ÇОANzžôDÛQ hškšÈ €±@4€_þ’]BÈ?qý· zÄãb¹;vp]Í4½$½BlÁ€:`ÄN‰Á®›Mº(Ь ùïž%0üÄ0ëQw3`‘Êp Q+`äüO#@(DH<‚Ëdè.—‘!ȸ h$”(q'a™\Üþ ÈÇu¯yûY—Í&üÇ„,ç‘€8I÷¸„n}YÎ# À¡X.!JÞòú2`ìXÖ®Á ¼A% Ò‡Ð}ÖÊY€Qoh À¾@#H$@Àÿ¸vt™Apbâòå°&Ôö0ðÿ‡3 2ôÀ.0½Æ‚L™9€Qpbâã0ù7"™aÀgGfBS9DDÀ‰‰÷¯‡IyVÆ€üÿ ÄÔ{DfüÉ*Š…–¼Ú„k”×´¼)>Æcƒ)haðógtûc ´†Z85‡1™ß¶OfüñsîX:@>{ÝA4ê<€h\>%Øð¬¡ãö•Ü'°øw@s&ÿtÿ'Hðæ· °9a£lˆs=Ìàê]ÛÞ®ž#þ‡^ušÁlÂ5fç[ß: x'ý‚#"˜=‚Éÿ„`ù„€^ ²–€°ô¿Ý$o¶€_È=¬r#ã°J `óÿ­yk÷^RÃáþc’ ;߀é¿MÀcÄþ_MøQ^<^ü2-ÎÑSNdð@±ÿG-、Žo,œM2bçÊÕß·!tyŒØÿa‚ÇíᜀXìÏ ë û3xøÎ<„<Þçÿ­-1àíF€a}·È ÀãÌÀ€ÔÁwH_3É[§nV T T T <°ði2«@ qd®—‹Z¨0ó¿SÇ®âÃÞ…H2ÐÔôô‰q‹þUš€ß9ÿ³|ç$¬ÿÕW™  +â|6%8¸$ê£@›§câÝn›)fA€EV°°CdQšEðîsT,ƒa ªâËð 8LGÈð €z=ÀlCPÊKóa s¹‰–‰H€¬úYœóÿ4è á0^]]Z:¢7‚?(˜«z =.2  ?@T«·Åp“ @\ dÁô=ÇiâŸO}¼7‘›¬ª·”­äk  dŒZ V|íöB(@á$F7á0ü5Íùk´‰!Å4»ù Lü#öÍá°AØ<÷Küò ó3àÿ^ó+uRÿUW»¼n˜¤ wƒÈ gÎD <Ç9âÔ ðaºå¹!÷BréÂØ1ÈEÆør8¾©€(——“Å.ˆ UrfÒ@¤ô®e(xØ‹t½ÔàîÁ 9ü#!± ½ŠkÄH„ŽÐgÿ›°N`2 ÉÝd*?„iÓï}ï{9‚,®ÁàÚ:T|mýÚu¯^«gD)þ$H9ø󇛈xó¸!ø?Nü¯è Yâú€Õ# ¦8ŸæÅÀxyñ—p`€>¸…€IP4pkÈ0W €4 ;€L€# \Ò€”Ó÷_^ €yi@Ê·VÖ®#øßøàf ­°Å`ÿ<¨©µ Eÿç¹G_dòdY†ÓYh‘P“"YÌé?‰ÿ€ÿ›P”¼ýÄ^G`®âž£ ©68¤#–¾×½3pÂm'ÆãàœÉ“=†Âïà uCæáù'µòñž²½ÆÍ…|¦H‹Ù<ßúícZ—ˆßš2á?ì¡á3m 2„óãßAÿÀÄHà¿?§?·Y¶†|:55§Ìÿ»¿sfYsbá|ÿéÌðixþŸF4Ç+êÀ·ïuÛ§ ôªbHŸ'T[ø!§ÐM¼¼ÉÀâ´ûïa5ÁÉÿ7W·AB’8Õ|,XàèÑ‘þà8Ü„øsþõO´+6üÓ}ÒB @î±özy1óÏ}7Õ³ÿÏKF€çS €s|=¬â'~ð«Àÿù‡0‡_ò‡N÷ÿ¸N œýKx/ƒh7üCIlg;Àé~LO<'Îþ¿%¼ÀÿÿàómyN÷ø>þyûÿ.ð°,6 ¿ÁuEòÿÉ’‚M•Ûl€iyæÿÛWy› °x—lÀi‡3ÍìL†´ãƒDQøNû.—`ü€r_ª¤j j j jàÖ@HÀ@¡\›N4_ö,@#–ÿ˜¶ï¨E‚þÉ’f"ÖC›7$=E…a¸¦)ûJkqz ÿ_ƒ±~ý“ÅYþû³pò_\Tw€0 €= ÿ>eê?Û~‚KÐö_Ф€ÍâÝí>g¢Á‚„GPV1ɳŠçê`«sÿqGÈNBBÏ`‡NÀÿ0†ÍÞ³£¥üÌÉC‚kÛWx6iŽÉÍ%à hφ ©¯]k]H$f¼x?lH ßÊ5º¾;½Û ûžS"t¿``Ñ3€~±ÐJ@„÷(àñÿ$¬p!$@ý¹3€ü—³à–NN¤ùš`p&J-0Èà—×€ã{|ýÊ.åþÿâ)«|`rz[ ¡ƒ" Æ @søMs>¶zÉ2ÏùUåybÀZlŠ5º!j‡ |Ø<3-ÄÍ¿½ÿÅ@‹ºˆ@Ò Áÿ;ƒéÝé£FbüŽ7Tqõª„TiGl³(p(Í€þÔÒ€Þ0’äîzŒ2€Ø1‹I Ü 7Ô°p“äÌŽÃa0÷/y^cF€¸~ºÐµ3 9€àüÿÍoˆßA€Â@ÆÐqÞ[ÃèÍMm`œ@î½·¯?†Oåp ˆ¾ÿ¦iŽuf”_yçæGkÈ€ò‘€tjqÓÿAšM1•Ñ´Z–Þt§o@H {–ÐЩz[ú Ì€7&Ä– ÿOø_gòä*0ËL¿'0ê²"weËï?°“Àÿ>‹jƒùvža½@þ¬_öhãÞÓ<ž €Ã@ÈÞóît˜ýY<xîÐÂÆ>œ÷“V€üžXÿÛ ÿý[D(ô lLŒóî®…3Ò „]ùöiíP5.3Ðã4Q™Z=Š5–à8­&E»–  0ëë6 üŽómê/¯˜¢Á‚ €$)¨Z»ýÃ3Š<@¸WæÕÁÐ@]$`ë@g¦”Ô6wz¨+€DlxœÄþ³¦ÿôˆ1Þ€6â ® °u ³¿Äþ³¦ÿâH€]ÐÓÿÀÿÝ€BÀ€‹õ—<¿Ø„Óÿ Ï›w3 ¿ rÅsÙÜ,eøžÈêd °¾¼Lð.¼ŽÑØ£yûšü°€ €­‡µU£9in,œüp3Ê £]#^d@0#@pšü#ú?à?(Æì†¯-" ð;>™âžb0; ø `A» y{vðÀ'˜‘cÒRŸ.ܹ‘¹YAüÿ äÀo Çô=Áµó€ë@ÌS§AD÷˜¼›ÐÓ·#lÍ•ã‚ûÿk´ Êÿ¯Cx:Ø Ä |Ü¿ýmL`à„Uñp&OîÒ`Æ[ƒÂ™)€|º„gÀÓâ<"È…q&Œ `Tƒ "… ®!P¿ yÞaf£‘Ω €31bVC=MÄ@ïçâß¶„%ð¿}0ã&&ˆÿ­Àô´›þ+j³kS xˆêé /FW´-±œ;º Ðó3¾~l@G @”Ûþ½YøXí†T&È— `Ä8@ýÒ@ˆ EJìþó#ˆ? Ä–xHè†hq±(“ãÅá|ÿ­Å€Û+øòtý€ ¬ÄðåQ³óý§Ÿ¼…Äþ_â ØóÓõ_H° <¿óýçÿ'Ûz~¿WsöŸø¿;Í]4³V¹ÄÍþg :‡”³VÅòDÿÀÿ93¡ˆþS33m=šM<˜ÄP€8WÃw¿C',Àÿ•Èé¿î«¨¨ø|i ¶„ÌL‘¼À⛘   !¦™ÛbJ LáKøfˆ«Ô…‘¡å²'àä?ÿ l áÿ1ŒMk(m&Ù/þwe|Cêo’1¶$W—öû}m+ ¬ã—ÄB~•øXÊ’ hë°üœ;f,ƒ,CAȯG4 )€p²‚Nx™sµ£åþ3YâÀóUCfŠ# £‚è¤Ò–ëC€ Í "€Àš³µÿO$^ü@rêÀ`X`ØHdN zÙÖbë‚ùŠ™á´&¾Ò…àÀò”E@›U1ü·•‡¶ƒ7ƒ¸‹’¡Ñ3¨)‰«íøüüYˆädÊŸwà‰¬ÍA'ü#$ UW}(,¿úUNH@ë8zú-\€¡&o5tâ§UM¤9ÜMpÀâüK"€bè°80° ½‚9žØÀ¦ñ#ôÇŸ¸„søÔ‡Æ Ô4€ ˜<ã6 à`'gÀYÉŠGˆC•°5´Qþ‘ÝKC › Áüÿ÷¾×håîBa†ò=`€$gÈØÃô?‚Üø–,ñô½½m¾…@&.  #¡?#’ /#¾ðjw9: ¯-ðþƒ¸ øŸ¹ ¶UH€üôÄ!—,y9æñJ•.™pÏH…7<ÄšhLcܵ°àE|l1Ÿœü·°{Ü¥=½lƒÂû6F÷þ–<훌ŸOŠL€à ŸüÒ¬ Àþ¸É=rR‰%@Ìïã¯8í €Ú7vÞ¾÷3€¼6ÊÐ@,¢ë-“÷ , €¸…Û»ÔŸSJ‡`üÁ–€ðAp=R _â§Ã¿9Ýй{äÿÕºšh@¾P]S¬ƒ8ž'‡£û­‡Zt¥À#`t[™ÛÒÌÀi»Ê…‘EÔB~+D Ya6Pb[óþšþ‹Ð®¼Pà. á ð’ùaPóþÂÈ"t@t~B~» ‘T¦çw‹Nÿ¿A®¦*ä>šh$€Ü ¿æÿ£@©<àÿ‚F(”Çì? ²p'ª¦ÚT f°÷Õ Wø„ €˜¶½3Íw¿ûüaiþOÇ/Þ ÷²©ûªªªªl ´€ÄäøG¾“^K @ å;«‹|e&<ç 1Y…|§U4¡„ÈzH@Xð Õt›Ð 'ÿõ;’ B”€”Ë7mÆ£q bêä¿]‰O`mã‰ÿð?mk Ã%Zþñ´~¥ÛEz‰€x|…ó2Ò=çËéÅ›S1],ly¡’2|»Ô®D@giÎ0P" Ó<5ÿ"@Wì‚ë¢Yâ~ éVÒ*ÌU ã#ºÐ‘`^WLbxÓ éüÜVÅC  =þg:3`¼ê+a€6šµtŸ·g`¼Á¶ù `Ë‘/Ê[¢:~V Àh\¢Òž!€XŒ¹;çÄH@tÛ¸ÓÀ­„u ábK8 %†ÉÛÍÌ€ ‰¢è–ÎÕ Vf-hœ¿B0éÄÌáÆù+€Œ‹?(¡þiÐÄ€Ò° åhê  â›"$0" Qþ7§…EƒH> À¡dšïêf øÿ€ÿ >sÈ¥šg*@Ĥ­{»÷7cIJ°xtÅ>  Ñ=‡M¨NtèÚüÍ,xøsçÇ噀~ÿïqéP#•·údï0Xà›µàðÎ;ɤp.Œ€$€îÞï Š@ƒ€€Lª™Þñ “KLÎGÐC¥3ˆ €ßão_—q†^b¦®óà^ @]0sÄÿ ä ÷Š_Áïÿè"º=r }™bgû 4Ón"xîÌüˆÜ’?ø‹o|ZÿüÙ³ˆ>¶1¯úžg0ÜÝ^=Ç'Huªxý þ÷Š3‡Ï;现%I Ò‹H÷‹£â“ Õ†NÜÆ…c€ôYpQ£ZèÿEd¹ <jà±üP­,Wüå"¼¸\T#ì½M† -/”H$‡°¼à€€X(ªö‚qËbŸ]Pk€ôüLa«!l¤AîüÚAxþ«ñÿoÜ’ù÷¢sÏÿ§Fê -bûÏ!ÀÌÌ \~AÔ )Ï®ÉôÿF®<Á¿ÿà –ãC{\…îHÐ+«î ¾s€ ×àø¥5H]5P5P5P5ðàk "$<^‰P?€^@üW{IX"øW(€"`mÀÎþD—§9{S’‚¸™’›#‡~@Û¯L@<ð!(†q¼˜<Ö<€. öÝ.õGx@FÉá)šëk×.÷^s ”ké0Ѽ{(ùgCÜJróêÌ?8ƒ@uÝ1¾íb†XV«Vâ~™·.jâo$ A¬@'Iâ—K½ˆ-Óü˜ O!¹ž, Ô³ž aApcY‹ÿéœ<9I˜÷ì¨BŒÃ2Š€|©µ%ff9UÂôèÍÑŠ]ó¤Ç‹y–Nê×€ÿŸõêà¤ò£fNrhyòLlÁ€ýç4 €ø7ã ´ˆÎÐ,M¡àcðM-óg  2Á£cX07ð´òÇ ?HNòç,Hˆüe¡w@ÜA[þ²ÙîD@¢†ÀÃCf‰Bø…}·1ÿ71 e <@Ù,‡8i‚,ö*__;˜ …Èôø77æÁ Ÿô°ȼš.'å„̨9 ´ÿôû¿ô‚TÙîJ½p¿  }²ÕŸÃF[˜û¿¯ÿß½ýD·|x}óå‘`å©\yضãz*þ_;¿á‚oò¹ b-´$ˆdüætHóÕ›Àÿôè¾øœÂÊÆ¼·Îøy9œOl€nÿÅÜ"Ôå© Ê ³ƒ§tüçaAO ~8èèè‰ù'˜@ršºCä‰HÚÍ­ìkø`‡&Fö<é¹;ø{äJðc:l»¥G‚oCÜ”Ý`@øÝ+Àþ˜åÿIt؆w€ÃÕÕÝ]ë>â €-O8řà¤]×XZ¬·oÍЀ:£ïÆM†¸y“>Ù[˜à?•©€óÉWäÝ»8ø/6øðmù @¹ ÿÅ .ÓÿÑ‹ƒÿöüÒQ™ûßÑ:ÁÞ!d·†رv­ŽdîGô•ôÿð޵ÊsîñÿmÀÎù9÷¿¤¤½AûŒøûÃ* O2ˆÒ¯2þRÁøŸÌ„ Ð<€5 @þF¯{«ªª>ðÃâé¼­Œñ|€ì:ñß0`nüÇø61½ª‘ú`ýo'þ&LÇ Zðã©îô6ÎË4þ—o¬¤×Öÿvâ¿a2ÀP.1â`ýà©bb] Æ24þ·°¿ÙG€ðtê_âì&@åÃHàì/0µü Vgþ¯IB1Ðõ¨ ­eEæ ìÏ3ÿ‹ @—°]”k¬=t'w³w˜ÄÀ í®+ˆ÷Ü&>GøÎ§ßW»£ËèbÉ¡†©¯¨IÚ ƒÙ*D„„±¥z¬ØŠœâçá¢Ê¢Sˆ¬LúZÇr×ç žº3©ÿŸ˜JIo0óΕgQðWæÊ•ìðX¸Dÿà ¡l-X»Ä„ÎÖa¤ X0ѵ]„ ü:CËcŒ®áå|ÀD€;3ðµ™%0©/Óøpåÿî¢3ÿrXNÊýˆÀßn@ž)/I¥™Öáô4 6þga @6è!¶€À!€ÿƒ ˜€)…¸ÿ×Γb@f†œøßÌÎß8~œIhÐY÷o)¾¥–×]9LA˜ ©ÐWÁù‰ú÷ô쥷.]bÜ+q¹ Ío‘ðÃ`v°µ¹‰$ÙÓÿ÷ߙٷ|ýúÙOòr&œÅ»ÙòL¸r…yysê^kfM2âËj¾CH€kF^Gpþ_òæâÿI’Å>³À@\ ð™S>Ÿ‚eC œß1ØBšûåeÁf’ä$©ÛBÌ¿ôˆåȶ%“Çøâ¡™¦çîâï¤qÝzNþëopvtEÎøÍ)vôÏÝÀ GBÓû#APØ2iý ˆ,€«Û)jimG ¼âŠýŠÚµGH­Ý?½ªÂöÝ„õ?°?~Š@üëcAWzGxü-Îöœügìëyß Ù-8²<² hT`á ú÷r~öA]ÿ~xçá7ná«h¢T€Ïâ ‰ædàbó‡gÑ &þHø –×`í]ô°Ìý³üSøê–·®ÿK ‘ìC˜÷95G‚Š î´ ^¾€ú¿ÃÙÿL^¿Äÿ5`öEVwV T T |.4à€pÞ¿cÎûlBLšCÀá¼× -ÿì9ç@(ÅH€'€Ðð?u0“˜Ãu·ëζÿ!ÃiÿŽ €õ‡•¹¤ÁV¬ÅŽ4(3Ïqà*Àˆ°°ÿš`~aÖt=XlŒlvUþ gøŸ#"»ÿØ ÀfË íþ³6°°wà^£ý·ƒß¢D zê*áhÏU‚H@T€«kÂX—W¢ÒLóÄÞ‚§é4/ .øÿ6¿1¡køÿʳ¸2$²&ì|ÿg™÷phÁ ]$Àlàu@ž˜$™%âÆöƒ…?ipì"Ü€þ—ª0¿žÞ2!êÌÄÖ¿ƒñ[Üg€.DSú€ÿÆ/¿Ú¼ýñÇRh€ÀCD¯ Ÿ˜¡â“Эðæðþ?ˆÏƒÒ[‰†p q÷ÿö.¼ÿ1ίw3è1æÐI[SŸ1 30 €¿E ö‰D`ð‚Xpò¿cƒ€L³¿¹øË_Ò n¹«kˆç’ ìdÐæý÷ÿøú”ç"B®0{— ¸µvý©\ýœ?äþ„A8úþÈh¹hsÀÿ„ÿ¯’èÜ ÄÿKx°Ö‘æ>«âMex“†¢)@ ü/zšZÑPúíÄüôèüQ<˜Gç}{  s âRÔôÜü=ê€=ÿgÃÆµÎ x|¢+»¡¤c{ó€ðŠ4€(7}ÀÿwAl)@ž)ËËì™´€•*.Ëp”µ«· Ö»ÿè:À~LþÛßü ž¿ëo¯ÜÖÈ®ñB{}¹QðA»ýDÌ(ˆgiå‘Z &ô yø‡‡¸¯ò}çg§8ÿ¯¸ÿaÉ Ô/»üõ8šxÏùÅý2GßSÀ_£)@[^&þe¿dÈÍÿëÄ¿f!Läú<Šç?žo zwÌÎúÐÐm¬Ù;ºî¬¨¨ø|h ü´ŽðÓþeÀÏš?íŸ%úKÛée£„†ÿ ÀÀÕÖ€L” dlÿE²´-H¬u¼¦iƒ#€Gü/žÿ4–òðI—%1¬Cxîµ5ºH5 @:ï?’ËüùsyÀеðÒ‚( @KøYÿ¼€A°?]V÷%Iç)Ë*'þÅ€Á` {ä\rQ ý± V.µÓž SsD˜¯ø«þ±òÕtLX¨¬™L@a| »KÀ_Ý‹CÐ9f'ÀPmê öܬøëɱ¢ãéa<ç 5&Û3þ,Lß~bÿNŒ?ÊZØŸ°-á! ¥„øøY&Ñ`hò@?TYà#0í„á'8df\^¿ž™á¶÷`ûñX0`þå  g;9õž”4€ò¡°$¸3ôF¢wÄG0{€ä €ÿÈhÅ!“@*@„]Xdrj cïìõ럘@æ¹$€®ü;ï¬!GB—ahΛSôQY3§OkßBŒqÁ[¬›¥ÄpPßéÛ‡K &‰#»ôYï ?Þl e€m$HFã(„ýõ«zšoÝ„Ý?ˆ?ø–áõATŒÐ'¬Xü :K3•œ»KÐÁ{sU×±€é¿Lÿ›ÐÀÆú‘Ùä†ï[x8L‘¸úa‘€ñ¿jBâ P?Hð^a*§8×U´6$l|™Ríòî£À²¸RuÕ£øß8 äQ, é•·Ñ\cëó{Y…õ¹âšjíïgÑ}”gVA%b0,„û)ß{~¶kæ?XÜxÝ™ÂWÜ €zܳ0èë~Øïô•G@=î0€§Ö̰ØÈ”RA0 Ò¸°}VŸpàÀ>þ:[÷öU'€ƒª@æ~®»ªªª>/h €Àì_œ} 4·³L`f|žº"™LxÍÀìyb€Q¥ÕÀÖ¯ëÉ0¯9˜ý#`ë`–5 šý T’Ñ ?’E$º°ýI€f•&ñGŽþwyòŽD A¦îlÿÃõV‹²WdIFøØBÚ†£™àBwÛ†‘çq€vÑ_À0  #B«Í˜<$÷‘PË Ð2Åf \×aKä Z/€ìV_ýª»Á¾úÕ$Gßž¹ò,“Þ‘Øh0 ”ÅÓ‡[•Âqjt”áì¿\tøœ»ÂÍz˾­¬¬K·R€3ëZ7qv¾Ø+ý]úHlüõ*”–²$ 2 h6šg9ÿåãß–dš] Zý#Sñ?ÖºÍNüµÀ9Êk´yýJƒ4€ÌXXÌ·'ð†b%³þHNÌGþúid”€é9tó6,~ùËâù¥›Ù€î¶@Àl@'gÀ¼€ÞV7o~SKöžhŸ>zÉ4§P¯ot µ¦ÿ'EšF ø €N៲$4Õy¼Ä@"›ÈZî!7a§î83=eè‘ ˜šŠr˜ðû[ @\_ÅöC:@sîÍUQàê›BÏu]Ì4Ü­Ád €ž¾É¥î¿J³ 6ùHü€#Åâîðbz€–`³Ò‹ÛQpÓL€áafæ&é ey1ò ¡¿'`P~ÂXStî‘Ë *±õí·€p6Þ[XKŽ.oÓ ì!è¿ýû{fŸåÙòùQп˜^g Àœ?ÏI€<_JˆÓÿúŸJäPËãK©)é ýO %â¥Eü8CÖÁ€ªW¿5 ¾Ò«×|7~û p `È”o{Ý[5P5P5P5ð€iÀ!hèàÓ>¡*$*’AÀýòQ¥9íßb~ñH†˜Å̺L‹\ñš%NòL ÖrÍ÷UŠ<8n·€­,¸ Ýs&’/-7gΜyÎ9¯rãLxDtÆŒú àÞ34?ùÉO¾ï*äÆORýìì …œmqƒèirKúØŒoz¸Œ„1¯·°  ª/n¦ž¸÷‰`˜þ€¡,mú°8Ü!°H€ÉÉLöQ€KÎ}]àÊ‚¤@Ðû2PéJ¨Bé½Gè`uK¯'‡Ð|Û߬eˆ¸—óðßçKË‘‰þìÛ ÿ߆!@éñ€ô-ÓÙ[œQ>€&Ê3Äœa¿…‰Ðq¹Ó/€f!_øè ñ0˜ÿG.Ý€ré°0ÿ/âà ŸP¯üŸ8;‘ÏhŸ5w”Gæ˜âÿ`¢!Q«v©ùšÃ§l÷ïð^c,ÀD…ÄÿK°™¢§ V» Ø7Bk£»‚ÉÌ+!`&¯âCß|Â[ñóÓí|zk¤úéNð÷ë»í2Ýå€=äÿ›ctµ°nW9eS#‚ èj‰çÅNŽˆ@ü¿»4€$¶Å %ú×¶Å÷k&’׃´G\ø&€DŠÿÅ@ÿ²Oß¶¬©çu‚gHcû›]Xþë‰ñ «®ògõåÊ#©€– ÿ}'çÉîæü@ÿ‚ÿƒ€™.–Û(€j‚ÿƒ€¥òPMB@ð0.o9 `¦~×â^YÒyº‡"À2QQ*!põ*ÿÌÞg[A7ÓEìHêË3 ‡àþŽÀˆÝ„®ÒÒýRw¦>Npl›¬Ú’™ê£ÆáYÛÚbˆ5]ææq­„² à®ßO¹’ü’ù¡¯9=m·ÃsX§„)à‚C’ Öéß(y6€\’eD³Ëò Ìû øƒ¶¤|« —@€gæß /LÐ €’xJWÑu¤)øàÿ:bPÂc=6Â@•ñ6Å ªË4[t@Ö— WsK¦r<–!|°Œ½½Iê ‘Ôû2sÆŸAõ›$tƒþ…ŠÃ6¤‡Üì?=Ï€»,`{Ÿ!Ào àáý°€à]Ñ@ÿ! ˆe>= ÐßßâÿÏ]€ÓÿÂtã`ˆib³Ÿ^gÛŸOƒ­ÁŸ­õ¼ŸzËGùJîáü3@/~W€˜ÉF•gøÿ’‹“ô–·I3=×GH yv¢·³Íüçß¾º}×ÿ$jÁªªªª@Bà¿Æmk®c0·¥ô€ 1‰ !Áº‹K¯‡$Qê±ç†uûW¹Û² ì/mÿ  ¥#:À¶ÿì«j õŸ ƒÈNG¨<¢(÷aÿTGt€Ÿ#j:*¤úÚóc3ÃÔ¨@{6=Àf‡™£ { zÏШ@[;6=  €ölƒtiÔÙd¬¶m²#ì|j‚ÈÓ%säeIç Êй+Ö›•èp”Ktîx„«'é–o16/9ˆ^|za‡øƒ·OÔuGe@º“â;Ã\31 ùꣅx¢h!ÒK–9šˆ`É¿€>å¡ü<¡ÜþJ„çv€ß?!yÀ],dƒð*årz%ŽÆÿz©ózQ×»=8Ø`þ¾ |¢ÚÌDnþÛ‚òåSóì÷Oîoïöáó÷7¯œµÐ’û;ɨ įÃ<oŠþ°ƒ7åbõ“uZÇ©¿ ÓFûÊ#‰§Ï=ËxIWÊ îöIR=9DLÈ´VÎúÉ(çâÐþr¤çN-lÚ÷ƒU`çÞW „) ¸™Î^/ì=ø3´_¤ÜÄ Õ/² }Öº»§dì ›ÙÒÛЫ1½¿[3P:@XøÎêèyÀ$¶Nîãý÷?"åòú¿ €»=¿æèm„qüÿðhÍ0²|ÿ?*/¹zÊk¦ÜÂGE!>#öÙi³aÿÛ·o%F]¥*¯¨¨xð50f!óíFs}˲ˆlñ7ïí­ðb E*<ñø‰©h$å´¨Oå7^lºÏ-/6ðäÙÒAqNÿÃÀ-Ø G@XÿÙW›'Ú^m@Drô“˜na6óHÀ¶©Öá õ³fü›#méf©a‡v)£ÀìÕnÑMw÷È^ý# ¿_tÓáð—Ò™°EX²»x‘Âàñ vÝôµC£?ì7ÛëC€°â ]À {Ùˆ@Ø~¿£íäœ@õ3r2/êHaôˆáÎI*¡Xƒ$’°\§X÷¹ÍÕì‡àhŽE X#Ìhñ‡Þ=ÒàÏ‚t+5sÁ-` Õ'€+©ísËŸàý„Sð‡^bÞÞ|~à½î>@.Uwð7ù!„Äv¦ý½º^ïGQn¶n}œ Ä*¿äáí͇Oz¦Öj ß-‚¶ƒ ¨A¹è¾†@Aíó—p$¶R‚~·0@P¿µpx†ö¶h €à×óÄÿvQ»HãŠ3·UW? ¾u€í4!¼žØ«ÆÆHíoBF¹i|®zOì£TÂ2[]¦6ÿ¡¾'Ã)RæüeQ€V¿¶t»¯ï.ŽÂòGç•xÿ£h7H+—— ÿ£ò{8¿æØµ”úӔ϶Ï=/¸FþqÒ¹ À½}¿ÓÐ ÷öÕù*¯¨¨¨xP4 €`\ÞY%uÿbJuìCÞz7é_8jõèߨö5¯e øLü ¹šàgz„œÀÉýÉ`B!ëí?ñòx\Œÿ…ˆ‹Çø_w¿Q{„ÿi`» ³nl~„ÿ‘Éœ€m¡íBÀ0Ø <º |nµØJÒGHõ*@Æd+ñÀbÔò5“Øhõ+-ÄyÐÛ¶±~U–ƇtëÐ ÌÁ³|è¢Ûª=¶øä‰‰r0ïŒÌï뻨UFw-Ñ^îаƒù}m~§ò‘bds‘§¸³ÒÛÛ=Dö깂á =]Z?±xdýî%Ý=Cû‚Ó›ZΘ¹¿왬:~Î7"ó~ÉêÇ',ÐÓi@«y;Eo o½Ðª7Óu)—…E}ÈWžyã xø{%¸õýÞG}ú ê.R¹f»^ ó¿ÜòûÕÙ_ÚqÑóÓ6®ïý])€¿´‹XÛS5P5P5ð§Ó€s°ÿ'ÜXÍýÛˆ¶sBiiŒ˜Â9áÓžÇÅ 'Uý½žDùøôÝæ'ýïv?ÕPrDÿfFƒ3D-ÌÄA‘ô´GöI.¿3š!µ½Þá­´ç&Á37xGÍZ 蓻ᲗtnOÚ+D'L¡-ŽGûö¾à· z[gbäŒñعE;Ò¥\Á} –ÿï‰Ñ·òüô<໩Aïýú ¤cK`ù[¨ÿño¥n~5®±}}i[í ‚†|ÿ´·D§ûí‹+=ZÍüóh;ßÖ›×OPߨ\ULZíßN8w·Eí?‡T¹,—¼Ü#ýÚ·_Ô¸àâ†z+ßûÕnë±8]ì¿p=ò/Xûxÿ·¾6­j j j jàþhÀe¸?µ×ZïH£ GÉíø¼xÎ}•åùŽ:Tþô4П^ÅPM6Nùg£GcõÝûÙ¸Pµ•UUUUUUU”ê ô/çršAOzw4Ó¬]m~Œ€Ó¥ƒÌì~‚¨™Ó™4V9Jzà[’XØþ"Êa›¼kµOš¸·Ò÷têûVñéÐ-|”;wZûT›>öX¥>U…Öʪªªªªªªªö¡JìCIšCÌ`¶–í ÿm3ëòÐõ÷Ǽ\€;ºârÕÚpwT¶s°™ºzue*½ ÿë$ý èdMë–ulA,ñ¶p}°…ÌÎÇóSMNgZÂùf}t"ò»¼|wú"{¬y¬¹ÓBwÙ¶Z¬j j j j j j j j jÀi A?{!vÙî:p’¸ Šs÷ÒÆ}OåÁÝþ €C:üt.r¾$(ÃÅ9.:cºÅÖ¯ýnÔh®‚Hƒ˜ú˜öo ˜lnvX‚@4ÕlØêÌR;Xa‡™Æ¤Å¬þ´%~ºšëžÁá§[aŒK¨½±½;{‘²üccî¬Ðƒt¹j_ªªªªªªªªþL¨CÐVñ³^>³W£,7@h!ä0sȤb0ÌàFÛØì@LÝÏöÁFÁÈ7–Ëf‘Gà>ðòéJÜÉÓhŽ3EYÁÿp7UˆM€öyÿ˜1õ哱>3CN ZB‚ ¼ù€ÿuj|j™ÂDb4À,®®.: ®gì#0ý?5uïFïïÍ̆¯Nwð*ú¬wòÕc«ªªªªªªª>% ÜÁ¨õS:ã_l5ÍË/ã W2­lþøGübáJŒ¼67w"›j³³ À´6DÀ`1á†ÀìÚr¢“8 ¨A ÿ âÿÂ!0ÀÒGý¿Lü?Š&ø‹½†††AYÇÏž=;O€æEÀÿÖÀ_©;`̛̖Ý!ÄÀ|<;»9;û1“‘àCADèåDzp,˜ÝííÝ;hÔŸA­wvJ³¸¸j ÄÀ‘a-˜þŸZ_YÀ~êNçøÃ2ccä g‚wçØØ4Löý2•ùÿÇšj°Ÿ+Q©¨¨¨¨¨¨¨ø45°ï1ë§yÒûW×= ׿åÝ]ÂÿÓ‡Nïîê2Íww ÿo]¼µ»{1”cúó¾ÀÇvËþO €<0X^ž-G4kKBôg–7–—Ÿ"þ/af•(•7§_>}úñÿ¾0Òý»Œ¡5¯®®îñ/‚•ÇççÏÎ70Í‹3/¶€×¢‰.~ç8ÿÿfLÀá_,€úû7åÒa⦘뷷IÄ€l5SÍFƒ•Xý)9’#?õÖ‘¦¦Ö××W`°Ûkln惙ÄÎ?(66 $¦g„ØçøO ¡ûÔW=¬j j j j j j j jàSÓÀ¾Ç¬ŸÊï7°4÷`¼Sÿ§€O7Sÿ·nhR`ggÍ+šá €ø6 ð$€Œ•²á‘åX€F(€@ü¯ð¿ˆpŒRy9Âÿƒýø_"ˆ®ú-ztÖkÁpårò^õô‰Åc.D¸Ò˜³Í‹/žeZï¦yqö\~ïÖÀ³C#s'H@* €M%àk"ù@`WÇ`ssww7 ‹%V6Vð Àìîlãw?@øSyìï{%0 sñâÅ_#-ºNÆüWXŒ¼líØ¢,öú±Yøöå963113½ß ~cF€•¸ïwF=AÕ@Õ@Õ@Õ@Õ@Õ@Õ@Õ@¢?1àGåû†ßáÕ2æÔhLSþgä?¼%rÌ2þºi0]­r› 6I&3Ã9sÎÀ Ï, •Ïak{ó$È`®Çåap$G þ_¾ã¡þˆcs&‚ÿ…Èj›­&þ§€`z[—6nolÈap³Ž+¢˜øÛ …HËSNü@€œœøŸd9s*¤í‹°¼~}}]X€lûˆÿi@ ©øŸóÿÀ 2ðh¨ Îÿ˜ýo6‰§_|‘&!í5Ø1W<½%@áŽ6·WnÓF>aŸþÃtÆ ¨“·nýÂlãçÖ/~!S¸MŽ…"?,`ox4m W†7°D ØŽ¢VìIf;}d]ßGÉG¼™ÌlêÑ‘éÜG^Ϥ»h<ˆÇCtßÎÌÍ͑摷Ors! €Us6xÛ`;~Š˜íbnÞ4ÿ•_ášìo†Ã,06ûå‰é‰0†øÿÈ > €hOY!cœÿ‡Àþß½#”[ÅUUUUUUUUUûÕ@4•¡u*üW €«Ý\Â¥€D£w7ïÙ›`”ˆøBÊ»#sí³nÿ¿^ÄÏŽ\]—Ø ØNýKøÿfÖÝ» $ `™ú—ðÿN€,€0fsHü?7ÍiÚ5‚Wâ{슀!` è&èY{c’ò š`W kƒÙ'³¶¶v!g O Jì[hÅ>aˆÿé€Ï\Òˆ'¸)ä߆'DÃAE²)°Þ[C™Ð·/zà×YyDÄÕgÛ×9Áº'DKiû" ¯Òè?&°DþnòN˜™ÅZÌ 0² ýsûꊷ²2…5{›3/ONòø™Aøi!ð à0æV°mÀ˜Š'GL4hB35ů« æÿåbø[elì?Ê"0_¾ã»hlŒ^+³¾Xä{¿/=ø Àÿÿ<ý?ãi8B8ßhC°9säuucü¹×QÈüõ—ùò_ÿõ—ÿÊ qÜOø ¿ÿÕÆà¡\4 ¼°‰Ÿ¶’fá¹…2+f«üóÀØØœù¿LOLç]Æfg¦'&&¦ €8 €œZ”: 4&À§ÿþ¦Dáˆ>“ÖÜÙ…¬GW T T T T T T T |Æ5ÐŽX OuÉp ÿoýý…UÏDWøþÞ¡ãC9?jŒº`Þ}WHí0^Šýã¡WNeËëÁæŒ.qûàøÊûÿëË¿w4@‡ þlµ‚¯{Ðõÿ¥—èÿßls~Tlˆÿ=@Óúÿ;9Ð?ñHLLoÎaŠwm­›ÚO €‰ Ø=›7D‘%Îh˜µ (& |RK/ ‰…ˆG@ûY€úWåñù(`*¥XäúaÒY€¡é"Ü´`$€œ4@> Àèö­Ë4:Û—S’AЉÀÀÿ@cÐ`é‚FýÓýŸ .ó,Lý’ˆ3Etúo€ù§®Þ&BøÇ·­“뻓»ë“ôüG ÐÞ¿ +ƒ<í¶@ô¹4ËËSËË ¾äø?ôPøÿ·\þãü›¿ùÛ¿%‚ !«ô‘f€ÞîNâã‡$×í«$»¶—ª¶ûE*aB†`nsóÄ-C`fç@ÌÍÍþõ—ÿúß‚À0ðþØ_]døE!€¯±]«êàˆ?|ÃdaóïÜŸ#ÿçf¦ÿ'2Y0?ì/KB@ab€ôÐÅÕ7&À§=ÿ?6¶òïWä´ú–ëR8ÇŽ9¾eõ3þŸ«6¿j j j j j j j jà®4à†ý[ ®ÌÎÿßúûÕ¥, æû Vž*o ú?Âå]†S—yЧ0ón ÒXôo)€@JÓG¼|ÊèÐß± Dý:2V7`)o¿@¼tð Sàûã[ˆ¿þ5€[CØÿã[0W· væ0Åi-ÄÆ~–a$3€¡À€Ó†ÖÀÈ"Q~@Là ‚%À¹¥%°¤iBÚ* Ÿµ»l¸4/J5 ð_s­ µèXµúÏGL-:å €Ž<±ˆåH“Z(d‚Ší?ñ©}‰@TÆ ’ÃùŸ¨’q®%õF{“ü“Í?—GÈæömLüË=:K¬9×mrÝàg¼pëÆà^Äü¿»Píö&<Hüð§#HÇ4€ýøUü?ÕìÐÀûÿûÿ  ¿|ƒð·"rÎØ·-¬Vð ÀL8þwccGN`lì?pIà¥Â{Ç Ã™D €Í€!€ËŒ³_&öWàËí=j#®6@÷B¬¯7ˆÃØÆ4s›ƒÍ͹YXóÜÂs 3!ð?¢ÿñAƒ'º}¶ð_1XŒ‰£ˆu¨@z@~Ï”€à¾ Ò9}Y.lÌØÊß}M^n_û¹~9 (?†~ ôçÛ‡«•¸«ÿ˜µPÕ@Õ@Õ@Õ@Õ@Õ@ÕÀg\v¨“ÿ﮽¿î­B| ÔáÂßÿÃ-¢¬¨+@{áÿÆÆ¡+ï?bEMùCÍ`ÞèÿŸŽ¬.‘ œÂ¬½Àò¯¼rè•d9¬dÊ î?{ææYoà«Wôÿûß¿üÿjWÔ¸‹Ü¥àÿÔÊ©CàYó2ðÿAš¿ŸÞlNÚ„û?`0ÑZ`Vš“®·6›[7áþ/`õ¢Z€ØbPM` 1ì‰e&&°¯%su“xcÓ¸²˜Ÿf°± kÖ–g§aÐap. €„Àúƒ` 2#¦dÈР5¿ Ûábè°…;5y 'o]†»‹È!+‰œjKÚS¬? «?$¹èb@¸Í,+Úbƒx&…óÿoJd?5™âð áÛýä¥+3)`‡Cð3`®ÿ_ŸâüÿõuóÇ[;¿0Þ…Än£,pîì°zÇ] @ÁÿjàîDÿJÈ8°îê€ úW@¾À€hŸð±¿Ãòµ±¿ô¯@ôøã†"žÐ ̘À'|ÃD "„ ¬¸ÌÌ‘°ø?0‘Èͯ ‚‰ KŒ&01º)Ëîÿ0XY k€éÿé/óá@Csøf–$ž,Äô à €^Vàÿ Ä‚;‰½±Ç°Ðè`ÚNú+âÛ™{ñûÚ~ãÿ,Ö Cå)ý‚ùþ•±•ŸØ?O>Š›Ã/`?¹ &,àje>ãÿ»k󫪪ªªªªîJ:Ì´óÿï®­/[ œa¦ý?â¯Á@W`@W€@ö¯¬À@W`@W€!0ïøÿÓ‘¥E18rŽîÁÿ§NÁ@W¿é •·€ÃÿthâñÐXpÓeçK:XxCu2ˆú‡³Ã€5`‚ €·õ>Ì@€L€D\¶Ì2Ä”ö?ï sìØ+33ìBŠ;3Én޶F(iÁÿ‘€ø|y#™ˆ‡ ÅåðXZZ àõÇ©1 £E1OÐ-ÿÕ €Q¾Ô܇š¤äÜ¡h@=Ad& r€9¹#4cb·¼#Ô +w€º„rq˜è´/ˆ(r@%tëw€º„rÆlch"À”+Ùи<-øŸûS+pñ÷‹·½Õ?íþõxšþcþ_ñ¿»@Àÿ°^°|}ͬ]_^3„çÿ/$! >¿ºMß‹MÜîàb€ ;ƒËˬøÿv³Ë0¶ø¦ýÿÿÍßÀÀRØåŒú1í¯ø¼•[á®–!ø7ÿøÿkÿák_û¿ñ3ˆüà? ¥ÿ'÷µt —!Ð |ÿÉüÕ—ùÕúìÆ\l.‚¸h`V´Ü ÿ» €¼ãׯO¯#JÇÂML­¬ãÉm†;JD¸…ÖÿòdL¬³rNÿ[üžàð3ÓÂpîž]mº¥$!»Dý# bÁÿ„àË0¶µa‘©{®=&4L!ÀÅŒ‘‡™ éòÿúÏñóµ¿ù“S_xòIìj/À~‹ÿ¥)h^%¢«_7ªªªªªªª>/A"çÿߟvE"x(°à~¬€W€Ào¬<à~¬€W€–!`âôÕ#kÿDì.>'ê‰ø¸+@ââ ЖÞ¿yóÌkÿ±¢nmû÷Ÿ‚p?Vè€?¤ÐC‰0ûjåô)1Ozøà°Ï¸ÿj|@Ûÿæt˜Àãþ‹ŸºØþ7·l!è­Óÿæ Ä$:Š‘Ëô¿™D@Ê@'ÑXI8m¦ÀËapáÈ’YjMhÀ8ñšÀ˜ÜÁ¾¼„˜âj ¨º5ÈT ŠE»Ý^•3€D°/È} €‚ÜÇ(È} €DîììÓöµ÷¶1Ø>k!Ü@*÷1’úWM@LÕ5@b Uh‚wµhcCûÓû,€|ÀÀÞ·ü&îfUf pˆ ü×' :ü¬MY€À@\P­D¸îØP +¸2Àü€Ç(üÞ  @kÐâÌý{àoþ›eÆZü¹ÏLü7ÇŒý›ÿöoˆûeÑ•¿ƒC@ ¹éˆŸqc{Ú"<`C =îÿkhýo#Äûk.Þ" Aw@0. S)É‡ëø±ôDwÿ¥þ7ÍÿHpL¼œÎÀÃ^ÇNþKøö‹û?³¢à?t„ –P,3p@9Ü#Fr“;Fñÿ“Oþüɯýüç_{’«aÿ£Y AȰEè—¯?ƒiÿ/`ÚÿQü>9õ$—¿€#p¾øENû£[øÔ˹« @òެ›UUUUUUUŸ 8àýõu‹ÿ×ap›žßË|?ñ¿à~â,°° €‘ù~âÁýÄÿX`༹Ûÿ%ÿ/Á ž˜Cµú52ßOü/¸ß¢pX´åûÏž…ñ?VÔÀ——ù~âÁý‚ÿmB ±ûÑ"ÅÿHf=Z( ýþÇláÅ€‹DÿdžÃÿ’#rûËB€ééM—`ˆ@ €ýe€‰Y¤5󷘙 Àÿ$€`ªÔ\Ð茜ÿ¿]bN› \A`â¿e°Ö Ó'Ù×Y^ XC(†M-~Z’ÆII()ƒs{ ªyò!…gᢑér üÓ¹(.Í,œ¿Å’ (-Kü0©dX £Øöe"°¸Ò#=í;)pþ?Z$ÜŸD9çÿÁÄQí†Ì㜚ñúŒÚö @ `xÑb pÛGÀ F€uàLá_ÇÏòÔ xÌ Ÿ¢=1·Q鯯Udb¤ÃΉ´p{C / ü¬4Û»®ì˜8ÿ·¸ÿoÕ @"Ê”µ8ÿ·¸Ÿà“{°¨|ì?Š€(þ+€ÀšF>œ_¨¾Ü¥ÅÈõÇôÿ— -°üÛ–ù)ÀþOÅ"gÙXü«‘ö™…~¦çà¹Áõ&Äÿÿ„ÿbý/3ó)þ—鉥áËÑvcì ½0<ÎØÔœ²L0lÃÇ™®Àaô/|˜_–ŸóãkOÞ䔆ÿ‹!ÿÌÄÿ×Ó/_¿ñõŸcÎÿIOZø/UØ;l싾(°?ê6+PxÕÝUUUUUUU²8À~ €•eë à&Ð÷k¿`6vÉÄýÀ/O9ÀÈ¿¬,Â`^®~ÁýÀ/§è àÜO| öWO'ܯÂåTk@Ü€•+ê  ‘æe`~ üOsÿ ÂIÜæÀüýÉ(àäfc1€"ßL˜Ø[¤ dkóÿIÐÎ Œ‚çååâ†PÚbÆŸnÿ €ù. çþ- 6 0EY† –@ H@Ì$Ú÷€2ð@<À¤Á¾¼ª8–ô™tȉerÜÐCöÿÙd¯XWôÈØQÞ3ç—(mû:€ŠF ¸žöÁöÿ¹”{°þX‹#8mÀd¨1ýH‹Ç®zü/VÖýæ6 < ¦ÿŒÐÜM„õ#mdÖ¦Ö€cñ¹ ›ÿ_àd€í•)Øl0…¢2 %VNIÐð@m@õú×e ÀŸ‰”øßÿO|õú׿ç’@+ÿ?ÿ÷¿•ùëÿðµÿ`íä«EȘõçô5ÌNÈä^§#)$ðÿ¯ÀÀ iõà žJƒ0Øi 6˜ Ðe €uÞÿׯ7dšõxþ_Ñ9¹ºÈ;_~×RÀúY9‚÷}ÿÃé4Ö˜‡Ô°ß#ý´åm“`]$,0ö%dò^Ø@ƒ®†1¸ YG ú ¥_þ=ÿYò Z²¥x‡!úUï®TàAþ×^ûV5P5P5P5P5P5P5×€ ýGü/Àø ¬ ÿÿ,X€ÿÁ p® ˆÿmº+ù"RtSøæBÿÿKà,À°Ö@Ëÿ‡åÿÁ Ø<ýthCÐÀJôÿ‡‚ZØ#úø_€?ÛFó„þ0z¸ø? /Ä&À¬Í96+ óÿ$°gÖÂ3lúЀNr$B|¢cÌÿÏ,Ï! àììÚ²$03Ëø²§ G `mMçÿÿÁh6qúÇB2ÄÿøL|ÜÅ‚VjŠ-¾Ì’·@.·Ô€ €à|DHÍzÙ+xÐó&à>àaºb{€$ìFlÇRÖ¿"WÈ%`'‹»(mû‚®zÑ»ŽzåöI"ÀNÖï¢(Pˆ€¹úÙMÊ%@çy›º:%>øÎ Àôp3þü&ü'Š·„d`Aƒù~ºñ/Ú6·p[ÍÀ¨Ýu‹NÓpW` )}@ZfèA$” !à8&yÿ<ÀH€ ÀÄŽþy€‘?¹Cåôr'Zeè?Xþ˺DpðÁ g`·.Ñ/³óÿ{£÷ü€¿ú«/ÿÕ¿õyô®€yŽùiƒ8@öÍOÁ€`ÖH)‡ÓÓ`Î  ƒ`A Àöi@>ºå+øè?Gæ÷þÛ£$ãzä ð¶xøÅªÆÃǰ<îqbIjøÿ ˜ÅWó}Çlx€¦ áÉÜdS¦¿ü·ÿoÊÇ6þýß=ú䣾è˜-ŽâE@ü5 ¤¸³‡´î¨¨¨¨¨¨¨xà5€!"=‹×Ö.J·`¦ûßÃèÿg?û‡ø‹þW±Å¿%üýŒX Fÿ\¹rÅÂ÷lñï)ü© 2ð?0¿p ¢Ø-ªÊ'ýé ³ÿÊ Hý–ØàÜ? ¬äðJ ˆ³¶d `và2ÝÎD3þ?ÑÿÚ9ÄÔùÿV.‡ Q8#Æÿ'ú—éàÁÿ®~WÜ3 S4,`€aEÓÀŽ ¥æ˜àŽ 1À1±Mzž«@ e<@X€Œ(œ˜N}âógÚ §€XçWçôÚ>x€°>Qý«´ú§€øQˆ@Κ¤rÓw‡„ÿg‚vHÖÎO9„Óÿ·­;s`Ý\µ;D.SýÓ3ø/wÔvàîõ'Á6föí¿µ°  p•.R1Pü?¦ €|Ñø_vIŠÿ19.ü¢ñ¿ìj{(±éÿ û9s- €—ƒ¼|üŸwɸ3™/“0_þ·ð×út›ÕÅŸ.2ÀEkÙÏ9zÀÎEÜ,r €i ÏÝ\h0°Y¿®w°X„ÿŸÇÆ"@Âøµ½ð3Jƒ 88Ô„–#À7ð¿+ZTð?>Ÿ#~ÿù“?çWpJ~DýcÐÀ1&ãºÖ@èßáþ'ÝÊØßÁ@OA{o›àV¬…©"êvÕ@Õ@Õ@Õ@Õ@Õ@Õ@ÕÀƒ«1q€këï¿ÿ>9à`ølü-þîà/àŸ åîÿÿ ððïœ  þÿ àÛWtþ_Ô0RÞâ~ÑÀ.Ð/ø°^ÁÿˆÅÿ¿ÿýïø øwVÿOÁ¯@'`§xçøZ ¿|ÐWZ D8MøË*WQn Ž‚C›aÑX¸é¢ì!¥'?¹[#`ᦟ 5ƒåe„ÆãYŸÛ(¾ƒÝÿÚµk× }†ÿ·óÿ­\‰ü‰ €àØýÏÒÇYà?­£ú}qˈ€’ jK€­|³²%ÀVèZ>8fxA€ … fqK€­BÊIl¹ànÉSiF´owK|ågstK€­Nq÷¿`¦™ `Ö\°A»µ€ÝÊ…Ë2ûñˤoŽ+)×™öÿ-À3zþiâ}Iä· däζ Àþ Sü0£'l L#J#Ðÿí ܸgøß"\~µÞÿ¶8ñ wÞÿaz=rÌšÿ»ƒ@ ÄÀ½K/ݨüñ˜þ§ €0v§ÐB?E’Ž‹bÙ?;Ü„],ü§g`®Yx €YxÎ `hµè?!âÆfí¿ÂûÄ; (KÅX\°”||á ?ÿ¤_øàûןüùÏÁ¦DôŠà:(Á=˜Ê…7ÐÅ®âh´a°qÌYØ6pöE† ùǢ¨¨¨¨¨¨x 40ü¿¼Dò¥%ºÿc]]ÚÎÿÃìßAÿ tÚù˜‡;è/ð_€é»ïùÊWPÿW¾B÷ÿEËÈŠX袼›ÿ'nü´åv¥’ǘñXOléiÀŒ4˜‚•–lr ܼ-Úà& Ø&Àmø… ¶Ûæ ôw¨ŒØ_>ØtÜÛpy1_Çù×sÚw,â€20×S¡3†¿¿B>@o€Ý ðH¸QþÀÜúÿ4Ñ3dæ6çH^XÇW³(a~± @ÇLƮ鋌ÉÊu#ð–qàÿö ±//Ý? €¯}«a cÀÿ¸Bð¡»À¿ÿ;@ÿ¿#ä×åk_ßû¹Ï$@€“þâ €åfÿå£.UUUUUUUUŸ+ À@âÉÛ‰;ùUH€à‹7€:xÐbͯêè´ºJ,<àЩ_Ë“ˆÊ;üßNþÃ@à?––€`2{.’@ÐÈü?å ,þo'ÿq N†Š¼ìo þà‹ùÿÓ°ýošmÐC[@»‚ÿ±ðû×·`ûß4»À(˜Pèo Álv¿÷Tèo Êu?fdœÓÿ\– °KXüÏ艖|†ÆðVUü/ Yi z0ø—øaÏfÐÃÿ–€N’0ÒVûWxDFˆG–UŸ¼yûÙ·ôY˶ð^Û'÷pÿ·–fˆþõûËG°øH€4Òˆæá`ᦃ,k‹0ÿïð)~Úµ˜«0%p5‡T‚0JØ3Œý~ÛÇxFÀNn™ÏøæiÚ?…þbà<ôjYl2KØ–ßar4ð$h`xŒž’Ÿ6³b€‘†1ÆÿÀûx Àðø|e}ª=‘Çÿ°do#ÇDâ±kø‘ °æ÷ÿ#òàõ}a:S‡}Øì?¤PÀNÖ'D Vi!Ÿñ2öÿÅ{È?öó¯s;$Dî ¿®ŒUàsõß¾v¶j j j j j j j€#ÊvŸpØòWi `t‹°±Ãùþ{€.à¤]œï w«o¾‰52Ì ¸¸hñ¿›ñ´Gõ”—#\š$í;ÈmçûUÙŽø ‚€¦¶<18~˜lã sÿ$d/-þ‰óðÃ`_˜û'! {,–o2-àçšPìßNnfgÿ}ð?3 ¢(ðöÒä%¤ÌÜ»$D®$)K@h Mþ‡e¢HØ‹ J$Ð3[þöô`Ú¿ùXa?¾ &÷Úf†x…¥µð^ýí‘cšöO¡¿X¤”Â’˜GGÞ$¤‰˜ icÚG_aéÈ–À¨ ÀUPz.`uúZ&Àùxª €Ê}òù‚ªÕ?øs䉕€wP*Œ À“drì“`’,@ñ®ƒèë+Oÿãè/LJaæ}Ï#þEèDäÀ²„Þðç7r!H,Žå¨¼7‹ÇŠCÿ]üïŽZg|™þˆÿUE€ùÓYê`ì±þ'Ëÿú§Gˆú©b™öǪԡ_v±—€a¬þÇÒ c+_‰@õ;È?ø·sþ‚ý+P|–« j j j j j j jàAÕ@B(ÀãktÝ"ÃÌ—ê¥OîdÄÿva,@ä´ç²ÿòÁ9¬ùT>0°Gj ‚\ÛtžÔŸX^á>æü‡ø!üJ@¾]ÜÇœÿ~ÿ…°€¿7Ä @]²‹8¨ @¸p†TCÿic§—7¢Cä‚úW9Œº§ðøŸGèô¿'$üÑ¿–Ï14°bb(>;w= Åÿ¼`÷‰¥¸š»6XvÇ_µúÇÔïrâ€[Õ|¢0¾ ò4—©;7Ñ »˜À Mèž!ܳ§ØŸ×\"Sm¯`/÷€ú¸Ef¾Yiíã×¢c‹ÿþ‘‚àë¤üÙíã¯øà ,€Ò\1 `w}Ø@ÐÄœ0ˆÖ''1ã/ àÀíÉõV_!üÖƒëaÁ?€@–€²øˆuŒÆÆÃù­«?-$þ7wˆ¸¨Š=@ _·Lø«\ëO€ðn´ìR;ç/hsÿäW€JŒz¤«¼j j j j j j jàÓˆvt|9 ìn÷¨x^–‹D þí_!öW·fõÿËgÏnèÊ ç·X¾EýŠþ%â$w¨_¿½Üõ‚AiäPb™ºþÇ𸆂H¦7µ³N€.‰@ÿ¨§r“ú»Q €¤¸ÖõY¹áIø¶þ™€fn[ÛŒ4€CÈHh¯RÆÂ‘ ô ¢ê›O"3õ ŒûW¬ÑÍ'>@Óú˜á”W†eê,hŸ½:ñMÕ•çŸÞ|ï‹O~ÊBæîŒ¸!Ý#œýEƒxÿñá÷µ5ϰb½Ù÷»d8€Þ¢)=ÀéàÏÄ @Ð3¯ß£›•;û Ü^ˆ$ØÖAª äÇbº§c§°_…Ô㪪ªªªªªª>£ÈËÃô`¤šíoQÛä–€p»GŸwß>­´†ÜõU…ðGÈC1c¢ÍÍ•Í#8[záB"“ÿ.€wýIêG ÀøŠ¸¬ ‘~¤Ð]käO]°õÇH=3þ$-鸄d47Â6Wo3 ›««­MƒùؘOPücL|c•ëXm—>¹zjØl"€˜föÙìÞ½ÞÑIÄþ‚ mf†s­æ\#Äwtª;>ÓÿiäÌÿÿocËíëwĽ‘˜i¥-p¥c~©½Ê£äwÜ£Z j j j j j j j jà3ªüPô GÉ=/hìÏ]þn/¤Ž±¿Ð­¥W ÿ] %„–•+>°'+“û¬ß·º=þnÕQËÝ¡À y"ÔËB#~$´ó@V€¿†¤õ;×£ú{ä0˜Î—à[ø—|¸qöÎ#a8úÅ÷»gÖ€ 8 ÿŒÈÝ·dI3J~÷g®%«ªªªªªªª>C¨6 +žxMgh=~ ~Òî¸HgwTýr†°ÊN zz`[áQˆýìÅ;1&£ÿŒJrNЇ3â!|PÔÉ.:Ã]Onæ^ñŸA i?Cê)«ªªªªªªª>¨Àçñª×>ß/ ?~|ïxO寿þúÞë÷ëäµÞªªÏ‹>;ÞYŸ—+RûY5P5P5P5P5ðYÑÀçŒ8qâDï•Aúƒ^9‚åõÊ/]ºÔ+Gô¾^ùææf¯Ùüzåì__Ù¿¾"ÀÞ¡ž3°}=dÿúzÈö÷÷àÞœQîÿ÷*;‰òÈûøqÈ›"ðúë¿nz€Q0÷Et)¨?ÛÑ{=ÇÒ$ºÞ£jçÁ=Çì£ø¨CFÉûNß+sýu‚>ù¨²ýÊÕŒ¨cÔ)úåb\Ò÷< òeêÔ4¢øˆ³‡âžV–jÕ7§Þ?07[w~¢QW÷Þ^¾µtÕ@Õ@Õ@Õ@Õ@ÕÀgDŸ/àF@½øò>||ò>àä½øò>|Lçì>`òü|BúWîáÒûWîá!f8dŠ À%é_¹‡’Ûq­Üà i_îí©1†é ÊãbcNž<Ù+¿|ùr‚1fyj !ö ÍüWyüWy‘0;[þqý}‘›üXxØž?ØÛv÷^ÏÚÓÃQµ €-—ßGñQ‡Œ’ßÏæ+€¼'õŒl~P f+û#ó >ï~F1½UŒ¨ß ·¶ÜœkÝΖ¸ ³¬ä4¨ û –öGg º/`»­Ô˜(—Ǿ^œæ½­SýÌG¹¹¯3Ôƒªªªªªª> ø\'Ìp0×Ã,‰¼Ìœy™¸$ò2°&ò2°)ò20aæf§Ëøð_ñeãüWy¡‡€ÿ*/0€ÿ*/ôð_å…þ«ü>Ù˜™YäOœ)qͱ“7nÜ8y¬(¿tù£>º|©8F6SËÀgqþøà!?îäEüoË÷àÔßÍéÏavî‹<ÀÿAý~oˆÿïíü¸¨¡ÀqŒêäb öQ|Ô!}­³øü¾5¿­¿pŒl\¯r€wê3S+={ 3[ãrìˆ&˜Û¨št2¿Œ<`¯÷ˆþâf@ È°íîá2xÍî ÐYÂÃBai‚ÿý9²ú¥ õ:ôÓ'ý;nóÿƒ;µ0ï(¾]ðrþú×Í×ïܬà³0Ì©m¬¨¨¨¨¨5ðy"N 7gŠ À’•—€ÓV^b.Yy‰X³ò°iå%`ÂlÎÍ΀ñ¿ÅŸEüoåEüoåEüoåEüoå÷ ÿïâ0E€Oü ('þP&–M³Õ-Ž'Ï3¯{y‰@ü:ÔßgÂp?äÀ6n‚7<»Û¿0îµ}´@/÷`T킜Êå÷Q|Ô!£ä÷³ùŠýîI=#›Ôo€P»@îôæø¼! 5/° hÿ˜Ûf£Ÿq€ž#úëgï{žž@læ†$ær`¸TˈÚU á9rúÅb¸_€î½BÁÿžýÂü?èâàu§Šoóu›[Er³Žšªªªªªª $Àí#ÂL^ÀO ò2 ò2 ò2 ò2 ò2 ò€>áñežXòò|yyž¸äåù®yy¾ƒ^ÞÃŒ2œí‘ÿcZ¬ÈàƒŸ`€ÿ ~Ê €YÞÂ}£äÀÊ‹€• Êû,îܸÉ~œÝŸûºñÏ/Ї?Ù7hxöö€&:6Œ¢¯LãâÂÙCÂêûZמãšßìí»ùÅ>¸æ—©½×5<ÐQn®>w  {z­½C[ìAW9II!@ºg`N"Ï0wÐ|9©ù…} NeÝþ›ï™àˆ,vÏrFÆœÝ1gÓÛâ`ΞeÆ‹€˜Æ›wcceeoáÜ#jŽóE9à‹ë™þ›Ec&åˆIƒõø5O‹ði"Í©kÊö­˜!Ϋ €î –«%®=>M¤^WØê7á`zÃPŒŽQÑrÞ@ØÞ0B1BïÍe_έbéPñYÚÔ¶W T T T T T ”4ŠÿË €âÿ2 ø¿Ì(þ/3ŠÿË €âÿ2 ø¿‡8!# r€%‘÷”÷”÷”÷”÷”ñ3®_oÿpýzû‡ €”—“¨¼Ø?\¿Þþáúô¶Ø_KèhúÈÒôR€y°9I”ŠŸ„þŠòËðÀ_C`zp£:moï8~¸¹]·û¸ÿuüÈ·ÈíºÝ5ö^gØKå=¿—{«wz#£}'oJfî÷˜¥ ´Aè^¥lëS|æZÐéA'‚~Žè¶?:*nÁþ*ðýH›Ÿ%îAÙú{nŸ¶ùb±/GîÛÀþCÀy³cQ­'þ§Q@d`f&ÌòI¬˜‰ülŽ}ÑðÅNNÛ¸¥I{ÄäRç!4—Ÿ¶Â§ Oè¾-h0ÀúÚto°ÑÐAH~„êm3 ¨ ^yá5êÓ0*ˆCˆà[ ´g课ïæë›•¨ÃƪªªªªUBØÜñ‘|˜OÞæŽ_²>ô‚Ã|ò§÷Ÿ¶rÝÐ}²ØÜñ—¬\d˜OÞæŽ_³rAÈa>ùÍ=Å›V®ºO›[~ÂLNòWr˜oÞõ%´Èô/²Èô/²ÈôoY¼@¦{Èà-2ýC)×~eú·‡,Þ ß¿8á*Á‘ïåJp„ý;´§ ÿú–pûÂkuIäJäûÇú•àûçÚ:!øW Œ°ýî:Þ-`Ñ ƒL»a{'G€c.@NŽ —\€PðägCÉ0I{ƒŽ`õsN”‹®ë>.¯üÈ·.º®û¢ÅÊÓÝ~»$Ñ>â>™â÷å39þè™ïäE/}=àŽÛ×èëa^㳞tŠgfÈ3íJªØ_þîM+Ïû¹ÀMAÁ@h±ò;Í+4»a±¯NüA3­‡³ïàÿ77üý‹€Dw‚™žÆý¢ðÅ£©€#(Ìâ¤1¹Ø±@C.=-§ i:¬~Šô^Ôw.ÖFöëò‰êÚÇ¿«^û‚°@b`ÐF#á"xº‰àÝûÇYóG $7@ÂÞ|;èûL^ÎA¿+P|ÏUAÕ@Õ@Õ@Õ@ÕÀg\$9ž¨Ñˆ €Ý'½Cæx¢Æ%;»Oä§ ~øåÙ}² sÖ9™õÇüÿ±æ˜†pûDngý1ÿ©¹¤!Ü>i›ƒËæ{ßûžüû°ŠyüÀ À˹®û¸`Þ?°ðr®ë¾h 0öîø•ä¾}Aùâ+þoåÙ^^ð"¾»ö…3 }5ddR4BèåtŠgà{N¿ÁaiŠàƒ Ü;j¾­8n>îÝééèwê6îñ}¡7¡ù⣛£‹ÿ·ÎãµrÞ×n ³þí×1ãïå².û¸ û~0#îå².û¸ û~0#îå².û¸ û~0ãïå².û¸L0´½ôiÔ‡ÃMY×}\NÈ}rø”ëºOûÇuöÉɹ®û¸`Þ?˜ñ7È!\×}Ú?®³O®<×uŸöëìÓ¢àƒEY×}Ú~®³Í—.Á×u_»ðæú GPôOü”ÀýøÁ8°··õÓŸY ·Oä°û'êgÈÅÀí³íƒ]ÜØ9ø½ï}ï àcÝ'Ëq¬ó·rÙ ,h÷ÿz —­þˆB”R @Šr…ó,Ø–!>gCy:K(Џëó« å›M¡ûΑiÉ¡-LzÐ-îxßÙ‰}ýi*H›ïß‚‘¸î.^—¬'¸SÿÓOçlÜa@ ,k›w/¨½í×<ÃøÿÇ7HJ°ù¾ †^þšüO/®žÛ5#)€çÓÙÛ¶C+€þàŽF@KP pþ^ àðI€æè—@,›e_:2®}ëS â§Ç«Ö^3¥äQà—Î Ö}Usmq‰tèÌ‚bõÆuB ô‡ñÈzéO·ÞeÚù4¤5hÈÔ`Ë¿÷ž9uÊœ²¥ßsôÚí¹—»÷T ½CêZÕ@Õ@Õ@Õ@ÕÀ¦µà¤‹ÿÝ–s–'Úñ¿ÛRü¨ 1q»èVkÀIÿÿ»-çLN´OÌØ.ºåœå‰ö‰‰ÛE·œ€ ;óÀ_ºåð%Ѱ`b!·ýS|ÜÊ!·ýÛ‘þµrÙ ú§ø¸•+Bnû§ø¸•+Bnû·#ýkå²ôo(=ü‡ã'¿d+èíþOøR¶‚þÑî)Ë–ïß!¬óoì=±sâÄQeœ/ÚýãÓã_Ù úG»ÿ5È'w0r×Þ:_2´û§‡ðÓ—v.]zZÙç `ñ…ƒþ–H3à~…þ–åDûŠÿ8Ÿ–pc|ñüü㘀c¼Üãÿ@P|äŒ8þ£Åæ Á@ù `:$k+€õö‰ø[97[ :þñ·rn&D/˜eÅ_ŒÝ}WI ‰<5PH”yFAýÙSxyö%‡Óºöå3”äÍÀá5œµÔöö‚ØrÍŽ –Oß9W¼îÈi[€íK·g öuVî|Ò|DYÛB ø ÂNô$»°'=?&˻͘ªçipd/w£¨¹[¹{A€³ÍŽi‚DNoVbÝ´×}hàîs6AòÉý“x €.Ù °=~¿øEô=‰,,‚Æ‚#&'þñ‰ €æKGÁ˜õë`8¸š2f}yy™íØóŠõ—Ç‹# s…ä /‘}t\q‹½]ÿM¤^ÿ€:ývc Cñgͧ[ „ÒË'!  ïd0@þòv8µ^×¾]Ì{î>Í‘›|l¶ôñ©KÕ@Õ@Õ@Õ@Õ@ÕÀƒ§g€yßpÑM7ƒL€,@»è¦"dAþ§Cüï6Ý 9ä˜÷ Ýt3ÈX] ñ¿Ût3ä#çQ¸è¦›!ç Ó>íT6Ý 9@:ânûDü-:áf`°OÄßʹXìñ·rn€ÄDü­œ›À>+çf`°OÄD ÀÍÖø ñ%7[ ÈÑ¡PÎÍÖòCDü Ô €ØŸt€·€ Ës³µ€‚œÑ»1u§›­ÿ‰ø xÃŽW7 Eý2÷oWp!à? @´¸ÈÖþÇTØ¿tÓF$ò?iÿ3 ~éN©ƒ3ÿ— ?ùm¿t§;‡aã·Lsð ¡@ÃÍÀ_þÒYy /<€¿Ó¨Ãå:3øÆ~'OM܇åeOðºÂ&0 ¯ßNû%ï3/ϽçÐ&/G[úu*´Ó>oeݰ;ü%:K{è4øÞIçåh§„†X$)÷ Pž/îŒàÀ¨´?D¡½EèmëTýŽAІø Ìðù_æ¹´€N-/_½º<…g‡=Ú¨LóõÚ®'õ?}ér‡ þ? S¡{mó1yp>ºA„0Š €îý bzï3£ôœtžüéÅà–è: )ªÛ8bÒ/ѹ0_:º|´ùÒ2¾¿ÖC_€ÿ×AÈí•Þ?áåQqŒÿyD·ˆ<ƒÁ3æî.W»­í|¤^_8OØÿbù‘D^<Ýì m[xùÐ5iðÿ#ÃÇóÔ)ñapJ:ìÀ@ß~)¹Ù¹}¼AOíQÕ@Õ@Õ@Õ@ÕÀç]΀#‡ÆÜwh“+þoÿÓò¡@®|h“‡9yh“·y|ô/‹Ÿ‚þeåAÿ²ò Yyп¬<èÀÿÀ4Ö a¶{¬ýËâÏ Y¹ë|ÿU~ô¨¡€Ã·m €<~ ú§å1kG WÞõdŒÊáÝL '÷þ·@äàáÿôôä⤣ü£kfa ¿ЮÏúlæ$LäW‚Úõ“>€¹ ù• €výr4 >¦1ép,çÇB|‚ùþH~œòãm:@Ì÷Gò×)=ŽÀ©cËqº.z1ɃI#~?Ç·ì Gù¨_f¢ÕE8iŸJ¹s$N^¾|÷µ(Mòò°Â-ÈcÜ~»_!vÓ\îòsÌm»¥ÙQ- Ì.Ýòœ+ úœ¼[;>»;Ä1 z*ÒÎ>A·]âÓºÀ` ø_:Õ|zÀˆÆô:Gõ7@ÿ`’€¦óG6vj:ª¿Û=ÛÛ|¸ÿÜEƒDÚ¹â¬ÆÎF×—ó¿pˆÂüïßSý€çëª0c]°·ž]\ÙXiüÇ€ü~1þO,V„ ‚åKMb¼°g€ÿÁ€çÈ\Ó^+N €äÕg¬}ÝÝåj·€EÐ^½æõðè·5/ Îâ§ žÞçÞ,}üøöÅQõZTÖ,ÕGÏÆ)¶©¡ùÿ)y;ÀÀ]¢”¼äíûDOßç}ŒTû_5P5P5P5P5ðÀi@³p¾¿ñF'NÊŸhÓåÉ|ã––(_rø §ÿopú4姃,œïÇÀÖ —.Q~©M''Óÿ7X[£|­M—'óý7ØÜ¤|3ÈÀùþÆLLP>Ñz˜Ë|?û7„ùä=#>Šû9ú§rôò¸£*Gÿ û9ú§rôò¸£*Gÿ û9ú§rôò¸Ãû7‡Ø€sèY3 €¿µ->Í÷¯•§ýÃ|?Ë¥Æ×æÏ¨M(ö AýùþÑxw¦»“&íZÎòOÓÎf‚õ·íW·¤›°W¸j;hmÿ§›À$®pºÑ)ÀÎ÷ëì? ±uú¿!v¾_gÿýô(Œ¬5l¢‡1ÐýÍÎA€( ƒÀñ@Îͨ8¼ȹ™¼K‘ª²h¬•ÓX €“ ÀQ„6×OüwâÈ霩—§S¨NÕzþîb-¢Ûúˆ!¾+j3íÚ/EÐ@@\z§çz˜)êÖCü/9.ÏôjA+“ª“â¹³G‡('ƒ!ýÇk‡€ð§7›]`ÓzñJÍG€îE8óÇ7o %@\˜ÿôþ¡o~t/08O@÷üÎ<¦ýaÐ<š\Io¢fe¥9Ê8è‡,ÁÓ'Ú€@èÿ%¼D¬ €?B5ÀDàK`(ý‰Ñ @€)XaÃQ;€ðþ1Áå±×'  ·Qt‹è3ØÞáîîrÏæÿOŸ5ÿÌXõš Rù,:`ý¶b#*Œ ükŒeùÛ¥ÜÅ“²ln{ù´´#lõ¼»|µhÑ?>ñƒ=n .@ôrÏܾ¹BÝW5P5P5P5P5P5ðÙÕ€Ðφþ“•þS¾À?‰{\t¥…ÿ”ƒ8}ð  ý'+-ü§[k¥¼®ÄÙä1t];Ï,‘¿¬´ðŸåê6gflè?Yiá?å`&šÆ†þ“•0À\Ð?LœkG ýƒ¼·kG ýƒ¼·÷övþÅþÍAhÌ\¡¾Ìö/w®†…‡@`ðyÔœxŒ£Äþ»ë”Ï^?f`4;“ÄëÇ ò§Ë;¹>ûŸæ«dfèK, €ŸG$ r  ¬   €A°¨ƒvúߎ1ßoŽYà?ýoå˜ï7—Äüÿ£Ëè]<ýï‡Òô8GþÌóŽù~0VŽõÿ#ãþ99Ö»)ãþà d@ßÎÐ+RHÒ3ƒ/õÝ­Ü*(2œaÔX`O›fYQO`Ã൚–t¼AÌNùä tÍ#Ââ¹³Çg þ#8³[Ø ] £ Š0hÍ3’æ+Cà/SèdÄB¹ú‘çn§ú'^[†Íþÿ"-˜JB˸ÒçKÍÆ·µ…7"G@{ݾÕ5ŸokFèGILÿOàÑ\Ù˜æJÇ€˜]éGDàÁF¸€`ÀË—Aøéë€F è@Àn­°¯âÿ)±˜Jïk j>ÓÁÿ 4ô ‰ Ô¾¡}¼¢ý8l… €wp!…"çÖàkkƒ,ZÀ7[úiíc²ô@l U/—}B¥ÇíÂCÌkˆŸïwshçÔ{[ÿœþn/ÔÖ’›éí•yÙÕ]UUUUUUŸi XFÿ+BŽñ1ÿ!ÇøŸFÿ+BŽñ1ÿ!Çø¡ä=þW„ã0ÿ+BŽñ?ÿ• ˆñ?Ø?Lœc`TîŸÊËýSy¹*/÷Oååþ©¼Ü?kPèŸÇ—…ëçå™ëwèÐc!,ðùØcÁô¿ÞÞ¼~¾|áúÁ4øÌ\?^„€>“ö«Ƥ û…cªä û…Hc²€â˜€è@cÿa #·ø_€Æç·›‚Ë>ô˜1y þÝÁ˜÷yüË^æžýgx‚êûx{|D”fðRº+y;'?àxA¤®~·CÏÛ vÛ@U®‡ii9@¼·â¦å;ýn•'š,›¶xçìzHx`hºF»ÖÁ]%$ ¢ ¼@€°dŠyyj ZHÏî›ev‚6òh©|÷˜«ÿiæ¹³!üï-0…žÔïJŸ_C$8Ô n>›äÁ`{8€Š†œõ÷®oPH Ÿ“á#NÏ‚ÿ'ÔùÕMAƒ–#Ž)€˜°šD“fIÀ¿Ù6ƒØ@¾C_‚À—À 6ìñZ €)1¯®ZðòXmç|{íÜ ªWHUàØ6×÷PZJ îW¢Ò`]ôs3ÿR˜+ز,ˆoŒÆNòƒªº¾¼Pe1J—¦¯Ÿ$‹£$6ìŽ(›Èƒ`1þ)á|?a?¾Å fwåÚ¶ÿXÁ²ù?Ú§/}ØêvÕ@Õ@Õ@Õ@Õ@ÕÀg\Ž@7¬€„ËõÊÀ6¾;þãñÖÀœ~9;Eºg Ì¥·žÎÖo ÌÚµî ë·fsÐu1¥ÜÐB>[¿ôcôÞþAÞÛ?È{ûyoÿ ïíä½ýÃ,Voÿˆ/û®å…ë÷æˆd€yú±¬þäúQÞwý(/\?¹>”w®Á¼?GÌ–€Àx5²0œíw¹$O³:  ?g€œ€ù<⎸Œ\ù§Ú\¹rÅ<óÌ•‚ø¸¹xñ¢ùêW/€× T ¦*s 4Ýp¿NŒ>{F+×ÖeZÉ3}¸[¹C+aùÁ´@CÛß=3®ØŽä-/ö°•qmP)D iùä ¡ò2Å3¥ã3CsöÔëëMD@DÍW€C*Âü//4Ÿ™,TA¡ÿмº¤~FÚvG:Ê/IñpŒ$ítbõØÒp1²·OÚüV[ÑT€*!ÍYúû÷ÝŒïiåXI®1ŸF2|F¹’ú€Ý¿¸2¤>ö^&±@À¹´ ü€ÿ…¹Þ ”(|¬¸Çß x¦h°¼á²DAÁå±×ç|Çv&¾Ed4ÿhJq‡¼„ X}Hø× Ì@ËZZ(äIP· û´óyòö1bN“¼ôî”O¹nqGæà „Ä %l”N½=H¤Ï¯­¾œ¹’>}ù·aÝ[5P5P5P5P5P5ðYÕ@@œ`xÀÇÐ;>ìÖ’Y¢_KÙÞž6š9+GŠ5ÊñõVV¾FËqº°®]ËÊáÿN9¾Yù-ËijÞ™þ×ÃÙ?îíä½ýƒ¼·÷öòÞþAÞÛ?vî~õ89¾Ró կ߽ô×§Ð~’bfTæÿ1?*ø?ðPyCd1Ý@pVí`lê/‡ÐÍII(‰²òË’PôWž Ú…¸øUy!–T Fî‹@²ëL8yáms¿äŠ„õwIŠíc ù¶™¶µ3Ù|§‹qùX,ÐÅ+'W<)³r0­þ60ñro+°&Ï!syêÿÏÞÿ…Ö‘ÝùÞðCÌ[àF·*eyLƒ0&dƒÚˆ¶®öM_yßÈ¡»'/ÝÐñqðrÂéwBˆ¦ì;b&qÎ3Â4}rÂé¾1Am©Ó÷ã~°@wºQ˜›™¦;VÈ´™½Ÿïï·VÕª{ËÝvÏ$£’´U»VÕªU«Ö¿ï÷÷OÌ /—ôÅ_(n &^{®z[é¹|¶xÌ•ÿù–üUºÕQÅ÷›UH¢ð ÿ„ÿGµ/)èÇô† c’úf@ÑøV{>ù8’   „ʈ¨dÊ3x2ŒÈ€ýÃ9/T^x„G¡‚–jT¾?’¤·ô ä ë´Ò¿h]áõ:òη«-DT?v’TR€ûNëÙ;zøôïC#¾<9ù³GËT}Óü°0[#R€pýïBÔŸ^ïVäæüü{øahk¾#ÎÁáƒ8¨ƒ8¨ƒ8¨?ǨFÏ·>‰(Ùi¶¦‹q<*ò­é2GE¾5]€ŒÇQ‘oM ãTä[Ó`ê£&› gó`Ï7âý‰0_'¦ŸÉû÷~Œ€0À´ÒM€ìŒMƒ€ª”Ѭ¬‘´­ïE@@´§‹€€è0Øc‘,€GRøÆ@ ½VƒFtá×N Êm¯è™¥™a%ÿ¦q\ùÜÄ¡ó ËÜ; 0:ïV^ÃA£WUz÷¶Srs3è¥[kó‘Xdðú멞ƒ¦ðx9íÅ7n2Þ EIžtùÈ0UÀ$<‡ ”^~å˜DÀEñÛ›hõF²™àã&päûS|¾ârtôkèSÎÿäM Ãq äΠn ÷#ÓÿÜtR%Š0‡«@,%ÐF*;@Àÿî€ êÕ*¨|=¡ótöïÐ@ë}0¶®ôò<ïÒyÁÀŒä°ª…¨d¡P.‘å£^£ Šîþª>4¼ûЮªÙ–Ô¸÷±bj±¨ÚD E@üÜ‚áp,r­,þê>PéP1Ü]wâÛ”èéè €¾‹ÓÒPK?"W~@Syp+€:»g¾ÿsÎÀ €[¤ߢ‡þK •vM®ÒÉ`%óòõŒz?á­é­ T^°WMry¾½° PRýaÂIìW k^’÷G% 9nHnáM.ÑÀhkƒÞ¸b«»r`*›W¨·E{{øl´O½P‘›(ÌËÃp°V<¨ƒ8¨ƒ8¨¿ìH}dBn}fÃþþÛš^ÀÿËíéüï0±.àÇêµ€ÿíøŽHÂl-ÄFd8ž¯¥ øŸDˆJOû²ïoÜû‘Tß=ˆ5¤½èv˜³ÇV'À~ùH´ß¶÷+°¿ý¶¦£ö·ßNôÏ:5ôÏ:5ôWœ²V/€zÀné¿WÀŸyúè'÷tcj`—;e\z|ÛÄëLÛñ;w${­ÂÆJ+ÂfE€Ÿ£Ýš•¼P-¾p;o‘Éþù?¤ >7˜Sž»v;ÆÐ´Œ¥„ÚpåèÚÅ6\Üo Ý*Jdè î9ÝQgƒ8_áa€~#P0-€²Š!Ž ÌN¤*™ìÿe[ƒ¥ƒ¨3Åë©ÀúÖ^n¨ÓêE<®R¸ÃíÿNÒþ‰š‘¾é ”J˜ gfé¼ðñ&–=bPhBYéZñ¿ó"7€¿ìßÁÓÔÀA ÔÀA Ô€j !Lö/-ù9»Ž@Ön°‡ê¿idí{Šÿ& €¬Ý`…«idí{¨þ¾ËÚ-ÈÊeYu ~ð|£ßß âÿÉ  ÝàË¿¿1ïÇ)ù7}ˆ‡÷hñôÓŽài¢°h_Úãý_@‡À^†÷Q ÑQ· +l"t›N$€‘@}¬ŒÂ0\ZÝx^ÿÞé£K0®tcž`—;e\z¬À†Š€@ãè‹åúb‹Pú³ýêè$ÜO˜ ’bï0S›W˜NبµŒ Ÿ»Øðgû]ð¶DU/r£kWú°üßU¤°_a@„ÿy&Ó°ý*A"óL€÷„äø^{üúos‹^9Ã9ò7'úïoRÁö+{plÕÊ ¯gdç(»HÛiÖ­’¾•W}Èó?†ÿ»Šȇ}iÖ¯º`P² .@s¢­Ä2šp~ÁTP€hò ¿cthawÃûúgà{Ï‹£ƒ8¨ƒ8¨ƒ8¨¿äHMÀþ¯š¡|dz@¸~  ƒØ#’Ðwg`: 9q ¯8p]ù_Ãî”qé_¢øAèOñ!¤P£¹€ýü¸‚ÿkøßˆ¨©¡?‰Rà§­T° P»Ÿ?ýÉ@*ü¤70'€Òj˜r¯¦ଅ€ Í€ƒÐÓvaX«>\äoÀ Pè‘@nEH€ŸEb¶ó#:OÄÿí§ù…•ËSžÙ N(YÀ._; S¢ÈÁÿD4hvðJ$áæ± u ËËUw»½Óà³]8¨Ý5¾[â;f™FÉk¾ƒg;¨ƒ8¨ƒ8¨T?ù dôº€=©h¹ÐUoÄÿûn63ÓEì?îWrçÔu=ñãîD¾‹Ø#þß–ÜÃw]/3áÃ:4žoÜû#þßålzº‹øÒïoÜû‘ €‘]/XJî°è/ª},–Áª'!þøÿ//·FdñìàŸ(lÝ÷-a…õ·ýu»üu>ßh‚añ>Ý-˜»(”1ôŠ#œîë÷qù¸SÆ¥áâgk`bµì-F(þ‘§Ü¼?Öš$þ`\$¸ ÀÓƒøÿœ¸ }r­®fÐuºÀŸl®UÎ(î“T_‹„ºëù³5éç#Þ$ògêúé Dð|k<Ýš=[¥»Ù¬ðþH¶ÖЬ ž"ün¥ @Q9 @mÅûG`‰úéQ:éôzÇ·V7‚½‹o¢ã´æåÉ4“­ÿ…ù·DðaömßÑØåêü?’àóÂÇGh#"G` )õAÆÌÿ›P¼ÛÞ-w{°J:¨ƒ8¨ƒ8¨ƒøK«T@^Í ë!O_lj|§ ÀÞÞ À @×õ/À¼Е~ à@Wz Еîâ.€½ƒçóþ¦a¦¡žÕû÷~PÀUz=„xRt<ô‚;Ê—‰è/6¢èG F€3ü;ÿÁUøÇ©ÈKÿK1hm€#>{àòqégûŸÉÉÄ–œ=pÏöžöàÁš6ÌÚ ð)À½¶àK77úŵœñ@_1Tcîúz-9£(oZÆ6 ½ýe c¤xÝÄüô§Epüÿ€üÀ€¤“:ä/€kFaT9Á`Ài²0Î(+'š3 ¿µ~¬ d Ы?~]‡¿k©©úƒGÇq+Â!~ÜþÙÝíƒïÔoËH%‚zÛðË6š€c`%©pÕ;dß‘@]1 ûZßíÿs`ð—¶Ô;xžƒ8¨ƒ8¨ƒ(k J€ýÏ¿Úå‚|oïtveïÊõîtiÿÏ|·;]Úÿ/üª;]Úÿ×îu§Kû¿¿Õ.íÿ|ª;]î ž¯»~¤ý?}ùÙ½¿qïG€ýum2ôè$;p±³ü Ýé¨òÝîçϤW›­7ŒkCy^Qú+JoW¸ªô«Jáð?´ ÿ8€?.ý?-°¶&ôŸ<¾8€µBJ­­ ý‡tö ñ¯À¿˜P×Q,@y­Ö„þ«¹¯¦g|Y`mMè¿zƒ+É „ÃPÐÿä…Ý7{üÈ;]Û {ÙãBÛÎ(+`O&Vo‡ûgNxýÄÁÚ0ñ, €µ5¡ÿx÷ðŽÚ Ð?[;þã£c?@ÅO`8ÑJŒ{·«¥ƒ8¨ƒ8¨ƒ8¨¿¸¨ÙÙ¤Ní+Û» 0*`d:ÀÈt€‘é#ÓY ŽL?x¾Ñïà™¾¿ÑÚ^G“žÑ:F·Q£Ú¯(€®ô<[_—ü.Ûå_Ë@ô_úc Í è¿ôÇ@ÿÚ6'v»¢|ÿy§órG<Á¸§30Ù}ý>.wʸô/^ü ‘]¹Aª¥]OšuDkÑ mK=½ÖNiTNõŒÐÚªy ë­¸óùÇÝ®°vÙý[LßJ#|<Þ íQ[OØË=r‚¡ýŒø(áòàâ£8šÖOÑ{oÏ6ªsyu6úò´~Ê"4êWù‹Èóö.>ºýyÊìnbé;žÒsÿ]ýÖ•wÈÍÖÆó·ö9x ƒ8¨ƒ8¨ƒøO[‘ËMÍüÅÒ3­”ƒt[ÔÏ3jÞêþn€íéÏ´}‚ú øó“ü¯9›ñ? yøßQdü@þ7Gnòç_Ë€ô瞎Ñóˆ'÷tªçìãòq§ŒK–Å·×ýåªglñëùg5€:.ƒéÖûòÅí>}¢¿½˜‡Þi‡@çužŒ½î3T=eþÝÇ ÙHeïHŽçw¶¯Ëë'Õë×ÞpJZ 9ºþ‹Üã#dKµÇÔeHØ©V‰¿³Ñ /€mõ3šÜüO»>:xðƒ8¨ƒ8¨ƒø‹¬@D)Jñ¿ö°éµ8¨ŸJ |ÙöQÊ9cNOVÁ_öþã®÷eµ˜°ÿÚŠ"úªþÔÿ_Iþ—gxúUÔÿ¯&ÿëéÝCD ]Äôtê,à’¶'WzÃÆÝ×ïãòq§ŒK–Åwèÿ¥ªglñÛóGE=4áqŒK÷'X\\´í}²,ŠŸèŒ—W WÐtEïªTm39£+7±kv\Þ~qY¿ÝoØï>¦~«OË Ê¥ .ÚOñ×Päî@ 1cýìãÝþE.|ê jà jà þ3×@% ` ƒZ«$AIé-5pP?]ü‘WÖŸ{ýŒ'lôßý×–œoß‘þ[ºþ·¥w aÿgœ>ú ¾tÑ+ Hj?g—;e\º£¨Ž"޽8¢°/øÇçÿ…ÎHõ¼Çe0:ÝA¤7é(ä®SÍÌl¡ÞG*Y$gŒÊ?-\ =ç^åÒ{h°wßP8ÍÒ’7ßyy[jzômUX<ý>ê7­ãªH‹?¶ñ{÷ÿ™—GÏ~P5pP5pP™5Pñ0þm÷ì67e}vù?뜿Xù» ÞŸuiÿòòÿbõêÁð7poäµüWQ]ãÛþ¸3F¦ï£~Êë[rÚÇõ_¸–Š^à÷ízŽÎãI/úwxq_ø±ÿC\øäVÆ^?ú>AOsC¡–­Z g4Kµµl¢F6Øÿ/xL!ƾ¿¯ì!Ú_î”ò=ûrtoÕWнf5Œ[i|®îõyÇË.èqsÐh-ûí°ýÿ Üó .9t¨~róÈd÷§nl ×7†7ü?lìñwß;×{é\oÞÿñÃÆó~üÌ™SSgNòü°±Çß)?~éÒ¥‹/]ä“_ѰÇûd;yòÄÌ̉>ùµô|9qRŸl““Ä>>=i¿–~œÓÇ'9¨íY—¿¬ÊÉþàÂdkÍNLœÜýÅQ†É2lÙdÄ|²7yxrò ì‹<ÌÁ55ÐZOFr˜gS›Ù¯˜Zìã©nÏ~ÚÅýbå'øòS}ÜX˜Ñ¹îwÆ­í+˜~ǬQF&±úOôbLg¹²W^¥^‡ øÂï«RÍ”]NµµÛêÍrŒL7‰Q-³¬ÂØÒ,“úý"}ª=,šavë–C©Ìþë³åéö²o·6kÓE &î€oHbD·¾ôFuÜÅbÅ'ªŠýö J¦ñKYvï¢$eEÙ ltël¯¿^¼¬ûú˜¢ÿù Æl޼>ûÜÞ¬}¶nÙèë‹k²ííÅà°šO¾™¨ú-œ9²ùÅÊly¿Ií¶ÌOÙÇü¨ÉÝ;Š{3ª¢ñïï =£.ÌX»{úØöóåî?úù²Þý^{û$HÆ~ʧ××Ò-Ò2²ü#Çg¢Xloïã%>q u^>?‘TwÞô¯áöúÞÑ‘Ël¼ÊìŸow7Ò‡{{Ÿ{÷À·úæ!&)BøßÞ‘ÇÕOûºc¿r¥Îþ 3®ût°ltõÚýÝ¡ñóe³A <ñkß×ÃË7.¿þÝ׿;äçõËCýhŸÿ»<öfæg¾yé›—zü|s¦§íóŸc3½Þ©éSÓGgŽÎœâç(ûühߎòy ÀÁ?€?ÛÚÚRà G, à„6 ú}(Žè Ò ŽøðgŠÿJ$gÑA‘û7înüaåÃ?ÜøÃÆÝ¡~Ø>®¬ÿýao8?oƒÿ‡Û‰íž =öoÁÿû=›`§ÞšÒoxzîmP^úè¼»)ôFžC¨ÁêÀ¤‹Fá0¿ð¿u¯Ï¶àÿˆü›øß äÅ „ ãÀˆ­éçÛæÝ}4®ÎþïwÏΟ?tÄýË1 ÒÉ2æyøx­—ú»¿»u ضG6¿*à°ÿ¯/ÿµAþ¿†øë˯ýù®¿ËëÃy`?ß ÿQˆ€£3ßúó]3/õûù Ÿ3í›› dýY¶µ-€ „oÆ  Y¿¤ýš]DÐËøfÀÉB»@Iûéz "x“R0y|òÆVînÜ5°ÿۻ؀X„¤À]Êgnxnh`Ÿýs/BR`HùÏÎöÎô ì³`*½©„8ö_/lý×€Ù à??O¤€¨~k{ à>9\ˆ~ðG¶íÎOž>¼‡ÀáÓoôM¾xòEþL öädùئl©B8„É^ªû¼Ä ,§ÔÀ¸˜žëÿôIDATx" ÏïpœÔ™ëDmÔ ÐNÁF^û]ÍOÿùè@¶ÑÕ­fÇqë°Êœ:z=]©‰ì‹”_’Ö¬%¤Ó¸77&™Ú¨y8]Á'wïbÈ·ª²¥{îµ0qSÞo¤fD±xû»àNŸŠS äפÉÕ\Â%íõß,_õâðÐ"òµ!ŸFdòéWÊtI¾¹ÃV͇ñÎQé"qu¼ÖVdZm<'.Ÿ€È.G˜Õ €¬~FíæãÒ÷ …„ñ»†&p•naйÃB¯1¬¨ßrd\{Õâ«Æ-Ôxÿþ½[üù3 €€ìÛo~ûÛo: Pé£7oJ $P¸y3=Éoãõߊ©—ïÑÈeJ›:qüøqß'¦Àß¶@/‡µÙ. æ¶Ë­3ð¯{ø,º_Fë/ÊŸÿõ%ÏnöÕîý½À@5‘±vþ9be?Êøm¼,î7 ‹<ÐrÂ: åÈ–ÀÿbªOaÂQ¿^\@åz.ºöÏ>¹SY^WÏq}ù€à¶6€|{³˜–ò|3¶+«s«ûîæöŸ:ñÿË/¿,`ê¬(RÛ#Œ?mã ÀêÇ«÷Æ´ïìÄñ1è>û”Ê?ªKåŸÔ”0ìQïßÉ/!âëà‡$µ ïO\@Ç‘Ýg0röäŒû¡*ZpÕ‰‰u]Û‚®Ý¿ÿ îÐvƒìmxKo_âZËü_bõÑë`tQ¶û }ÖÇðz³¯ÛÖ1>ÓB?]GÜq£`[zìßDÏäùø‡·¦þaê­°‰Ô𿱼?\_·ê…hc<‡PƒéÀäÃßhü»×çOB¤ðy`Tu ý”_Ó6’ý* ØZÍÀÿ£Ú:h9d‹i)¡³3=…j¸½}`Û#ß¾2`Ã!¿kùÿ_»üŸŸÃsù] ÈÿºüŸŸùÞ‡üúƒü_š®àRõ¿”ÁoÁ@,`†Eœ”ªÿ‰l±¿Hë;b¦w›®?Ëýˆ0@¤ZŸ òCþ]þ?„Ðwí oœ[ä‡ü»ü¿% ïÚëÍŸ™ä‡üGùÿ¬}7M€„˜|þر횖>¯tâ´¡ìÙYÿ¿¿íØ`k{û°:×ÀOöM¨ÏáOt8hèÙONO>ÜÓ¶“ßñÒ÷_¤Zâ@ü[ пC%ß9¦ÌnÈÿ÷÷6Îzv5°? ¬[$‚Z©Íê±g|ët¬«èHîáKí¼û«§ ÿ¯¢Ø,{ÝA>n±–¾¤G¹AøåÏv¶¶X¸”“Ö~Ü,tŸSºôôbzž¬àãÝ»^5·hÀ=mÍõY\ÀÕ6õº–ÎU É 4HüÏ Î•*È[âj‹@l@íõß(_µqæâ´8$àV>¼ €8`©¾cBØ‘½‘s”WEO ò[ }ûñ—][ë þG¼, äÔªj4Ψd\ºÕ`¼{ËCP¹ÌßNP ÿßä¯~‡Ð?+äÈ>§|·¿»{¡Rye«YvoU¨_¿¶Fo%þàÛß® } ü³OÌ„5û\`óúuqq ú.ÙÂêjàðß!fþ‚'ß©ï]„Ÿ@_/q€iÅ/ZóÕÑãã£ÇB¥8Hhç·ñ‹›j~Üø?øÁå:@ÍP%bñÖIXíüÓ~ôO­@ï}¡+Hqï7BÌÀ:›06ÛUò(^RzT^Ï“Pþ;wôk»±yWšîë“æ%zpw±] ;ßÞyd˜evRü¯Á‹{v7?Ðÿ{ÿø ~äÿ/1äÔ{g!-P– e|qüÿã{-¼rR‰äKï§} Ͳ/ ÿd¡Âøü¿’´`\;ÈÒ-ßÖôé陸þàf=?£€ï;€ø}Éž¸$±Âéy6\v\¸ٞ3°ËÐÆqMÁ˜‚?—ºð¿„ÿÙU}ÔÕâøüõ¯_µŸöñ^+_§xO] ôoÁú¯1ÿëü° 2—• 3Õý¡ ªdõ»-Ij0˜¼CÜÁ@Ñûc÷êp EE‹@Ÿ“h- 93Ò‡B„DLFç|{a»¿MÕf?IŒêÿÜÎðÿ£G#€ »LBª`âHÄtöãËÞ.ø«Já!<¸u붯–X Êÿh˜ò¿ˆ®Ìå|3°ï2)Л› Êÿ"Ì À?d€é̺økˤ›PÈù®Œè£þOx­äÀð¿LL`õ±ë†ÿsü `zô7îÞýíŠ)ÿoÈ@?ï>D ýsÌ™òÿ9ège~€ô¥ü?kÊÿøË`€Tàù—ýð¥½}x(HúïUíü޵ ÞnßÞÞ¾à'˹À`K˜}o¯¿½-%€p›É'÷ŽõûÇ÷·&ƒ?,z¨”:Çî@ìM¾Õ[vw} Áb(JiMÐQƒÃ5ðlk`ŸÀÀ&iD¸Ô^¬lyýü*(À‡c#²wÙž¨çÕ@±¬‡Ë–AþDòöʌב¿hù«@gþÉdÚ]†$¥ Þôþ\‹Ø˜d_yþÞ{g Š ­Ù‰|8ÁúRWÛú²² ˜âèÔë¯LÁ„ï¦b[|󃬶_i0,@zˆàQ°Ú¬ËÂH^Á†ä´¡UÚOÙÊšå«¿hÑjk¹T,¡f\b…üYž‚€ê-ÎOŽY¢%@%íTL’ƒR=øý{þ‚¾BµýÙdà96êgÔ_Øtá™°uiˆ\Ñ&+­ó6k½¢~³5TžS&¨/Ö[ ìB¿ìþ%ÿÏîߺu_ÿÛŒLÀ¶êí$î—@öÉÏ~vëg?CNh)à¯#[è‰hƒú¤u@Á+¯) øeéà—ËÉßZÖ½±1Ct5 uÉÇljX–ê|¿PïþÿÅÍ›?ø^M ËnRš›]*Ù´Aü©…ì`½'ò¤×{ÿa«6øTúÿ6lU@¶õ–x=\Àãœ@ç õŸ½rëÊYCo6YvýæõôEt]_éæ7sy…:H;•;ìÕ;Ÿ$#šßÔÙÿÈ/«½_q®PnmóSöñÇ«ÈÿW?¦íÖÞ|yÀ€?M̵ê=#¹ÁMtZŸ®Ñ›*왆eŒg¨kTúžÜ's»:4éÏú^ëDÈýÃû‡ 81]I 6è<×ëvØ  ÿÓB¢ @1€­ª·“ØÌNßâ'Ûl« Tbùà~Ù¢&8Å<&¡C þû^åÅê;òâ´Â\mŸE‰Þ„¸ùL+ j‘ÐÞ= JþWa`’y5°ìSúÒæYlNTg#–:Rݲ,;<«€ŸÀ´Ô¯y(º@› Q¿õº‹ð™{êöÒ“B½ËÔÓ-/‘>ìv’š/,„çþ¹(€®R°õŒ,þ¿0Š` PY ÿýÇy.‹8@w°ê‚8tÈàÿƒC 0R_¡»›?IÊŠÉÿÑpËÿ M¾­ çLþ€[þ£ø_hðm®7ëò—øC$š|›ušöw¶wøÝÜ4#²(ÿ7€“šYiC€ÈG à#¤Ø´äÿðC ÿ€Büb™ÿ9~äÐ(<¬@ðíœ<ð#?ÀÿHþýÛ™’˜<Öþù ¥~~YɧK£üÉ¥}ˆÝÁè;·ÿaýÑç:wÖ— ˜Ä2@Ûh^†ÿ‡¹-kÒÉþ4ÄD=€Â@ߨƒ·~ûéÃOœ0;Ø[ï=IS88÷ žz D ’àí 1óýNfàQ€(¾ê¼SŽ–ËëëËi&c]±'¾Ô´·ûî»»O6ªÖé¾ÿä'ßH–@.Ïe¡ÐۯǪ ”&ß.Œü¤å• `sq)ÎVóO'¡rVì8‡“IÁZÏž%"¸²Í¤W&+ø‚8›¿wö½ü¬•Œç¬¼&Ãþ9*±ÕfXêSS"Ôáü4é¼RÇÿF4Tl{=™˜D#’ õml ‚õ”¶ŸÄÉÁ¥Z'Ìþ_m[»z¥ ¼çÏòríQU¸ÚH"þËòßüf5oYaʿϲ nëÍêøÿ“_lýâ'&‚¶vW#pïW;£öƤ{û ºú¸1»ueá Ð-ñ¦²~³µ¥ª&Hx˜bøh.â!.T€Rù¿tPü‡x|iÚdßþöçö[Í‹Óõ_AG󊀿kç›ðla½×kk>ªÏ‚Óô×1ÌBôL‚95uÿK? º%O”í`·Ò54Åü i@]ƒxþ8üèq\¨æâö/®Ha À/~ÐÔ`íæ6&µÆeÄŽm?ú§â·åé$¨N|.o)p[ ¹²Ow×wÃÂ=¯=Ãdqýæöã²ñdtiÞ Ô oFû*œÞ/Mo-l×û¸æ]"#-.R6BÕÆ!ä³FôbrYÏÙãóÎæ·7õëëÿè.¡žšúááš>šó÷¼¯VU¿~#ŽêÿÆt´.»æÓõOØõÁ!™âÕ àþƒºjUÑTÄ`¬Uܸo¸-ÜZÞ²½­­š+ üïï_N¼N Ò›T_°AzÆü;lÐï¯Ã`D@8+Œ‘á/Ú› À¦×~þíóíþ/ßn2BŸØ©´Z ¹ðߟöjƒ§êDø_?nPO"êOóa–?u€XMèõGzPTK$\`¥u¯á¾€Z/HŒð»èdÿ|Ý(€–è!@ѽºÜºì¾ruŸUiÁà?kºÐ¥ÏF¤OõV´ [0S¨•¯½ÿ7޹“Ès& ~N «*ÙÐ&~üûßÿX-c¤—=¦8îÀS0KzÆ[tøg°_rL\ú/*þì—Ü“—þ‹ @ÖÿæþO¦20“€£3gDˆÞÛÚÿØ€‡àCч.ÿ‡03ÿÌÝèCÂsþçæ¦€ €¹Ð@Ås(õÿ»Ÿ¡ pwcEG6þp»)þ›@©ÿÏ-£ 0<7§#hòG7€¶fM€Þ™Y9„(€cýc/=Öÿ!¶øµ721;+—ûÒ˜”‰²‹õšÉU“üïk²ÔÛdý! €}ëþÑÀÖù?¨¿ßûŸË[}óàN£÷ €î  ß¿#qï·0~ÏcÔõÖs/°Þ{³„gÜвÿOY}ᣧ^â™Y¿™ñÑ-ÕÅHºüÎò ³¯n!\ÿšCÎ4°¾Û× )íˆýôüùO¾ñ>Ë« ×’Vžu¾ëv)˜wbd_öò×é‘b-aÊL8!`]—ÏOó/ ¤…K9gµŸcÏ~%¿~å:ŸLÄmï§ZúbŸœQ¿®¼€ü£‡"Ö!~T}5å:ÏV· ý‡?.ü|ýÇ|u¸äu!×´©Æêjwi8¢«Zû ¥õŸo.…¬•¯þžù÷r ãMµoDùU¾puÅÞè#žÙT󨼟ì7»¿ÙýY­ú |™ÀbÔ¨Ÿ‘ç[[ù듸hn¸¬ŸQ{úM‘C[çQýˆ@i¶OÏõÑþBÎî%hèè¬}sbÓé¹_sÓà·¡Ÿzéà?X}¥K\d«·¤ݺwïæÔÒ³¯™hyô÷ßÊêÁ `RÇ€üä!à|ùfât>÷õe¶€²]@ À ³ð·WÕ>@˜øâøú:Ür-x¢|w'h8·]Ÿ-ìÒ~h@ž}µ*T>€_ðÞF…0_ç3nÎoÞ¼‰BzJ-‡’Ä ­Iu¤%úÿ'm’ÿ®ß–çCpúIö‰;ë¢Ъði¶^ ênËë·Ñ(Ù#Ii·ô!t›=Ô‡ÔÒzF°ZÜ¿zý^¾þé§^+0PyŽ¡ƒÕß§ŸÖf 'Ñž—¼§ 7 £ù!í_ÿáËÒS ÷ûþö²sÕÍÛåX†ÀýÕáýÕ{~„!ð 7ûrTÿaϲ#Ã᜙µ¶ÀdzN ÃÿFÜ`º(Ãÿû• j qŠú?Ž@B$6èÊ” úýõOK €’Øs ²Lð€ö¯7Ù¦…‡ÑÑfþ—ï¿¢|}4Z ð'm Ã$ûøõÙ¨]ëô¦p=jÔÏ¡lÀï¡4UBm$FmX `gwÍM ²wA¢aÜŨfѼl:?DQ 6¥€P½jï¢UT(B[—L@•0Y?nÿ>— €u¯Ï¥Ð@¨½AŒŸw3Ág½V¿=¬3~Ë8Jq‹¹³ÒŠ£{M ½ÿ7ëY@ün`3d(NÕçÞW^ÿýÍLÙ}úG]‘ç0ß} þ*"²Ç_A$€ “þÿµ¹ü‹–ÿ|ƒ NÀ•s&ý?j.ÿ¢å?ß ¤0?w¦ûÁó¿™ÈÀtf¥üOóB µ-Wó¡å ãÿA_Z|°¹š?&8°8€( üGÀÖî2À1€ÅÜø-òÿ?à @qä Ÿõ?Ü}ˆô_û+&ÿ¿ƒ'Å3@~^º3¿‚ô_ûx@þO¦€3@~øDÀŽÌ†f0Ùÿákòÿpì¿ýÐuõ‹mùo Ø/=ÉÿL qÌ×lHÇóÿ0ÿ“Ëëw˜A;* ¶wîô£°¼¶~›ì€C@ò x{[n>ðÖÃßþö·oÙ­&·î€ŸŒX¾v ðä£èÁO±"à½Íƒmk<Ûy„€Iÿ!67ÛP|vý4 @'þ— IXËá¾x”;wY_e €œg»hªë™[p~'POK²=ßA¤`ÚrF–Z^,ÍJµpq³R»ž=FªÊк*çÕJþ±l&µ¨e*Õô÷ßvü/z!)}±‚÷™X÷¯‘ÿs/Šs] lùG}”ßG²~ßvÓû 5Äÿx}ýÇå2 …ÓÈÞxç_)h…PS Ðá‡@ðbÓ°†•³àþÖ>ò·+õŸo÷“%EÈÇw“rÍQJɯ޼z€Ð._®r+÷§Ñ÷ƒšåù+ï'û uÀzø_<úÀ4šÝ üžo-ÆœöŠÒ3š=¢Hoé÷@€g—ûOÞnUÀ!z»up áéÔ·ê$]¾Õ3ûyv-xa§¶÷ÿævþÈy4òómÜ¥½Ö\ýÞåËßë-U‡. ¿ðG—û÷oÞ6Œ¸`"`^=zðà+Áÿ{ÁÞ?Àyÿ—&€\šY€4Lî/øÿšyÿ—&€\šY€4Lî/øÌA00³€SÿÛÆq#b¨Á`g‰ùÑ0Çr8ãÊÿ¼ÿKÀ4$ý×Ç$Þÿ¢ñT€¤ÿú0Å(€8þ[·p€Ò@@~ð`ŠÿPòð’…4ÕÿeäÿÒÿ³À h„ò¥ €cÇú¯=ìè7{¾_#&fÁý×zöÇv€‰É ï'Ó ˜ä÷ ù‡¼^{ƒA‘øÿáþ‡ÛÑ£éö'r€À±åõû÷nÿì)X<L&ŒxñdO:w.ðÓŸìݾ 7jêÇÐ@LÀL4šñÁƒø k šj–Z Ô¥õ 7 eÃé|gz˜/nŠ¨Ï¡×¯\¹r:KWåV÷E@{µ‹¥T€]óðÛÙ"ÌëÞñÊÍûa…Ö ´8':N1G qS5ѶD°ÆzçwÞ}çµLôX˜ÊqÒ–ó’ïÓÒ·ò)ê U LLžs‡é›<$…tQÿçyþû /{÷ÂP+ÏëVZ´)¨èJ¤ áäC6¯ÇÛ#ÈvQ h 3Õúj'ȫʄþŠÞO¼€¨?5eH.eŠîõ6'7µÎË\ {û½,AýÅÉ:ÀÌþ¿pôèËÏ×<ëa©ßëÍ‚û—z§áNðôí?¹yÿ  Àú[ŸÜ¹ è?ù?£@ÿÚ?Ü^ßê/¯ð¬?áNMày œüŸkë«·ßzËhü!BLšýO¾¥€ Àòò5X„O^”> /ý* ñàËA |Å5P:”nžDèÐÕÇO×wÃhËq¡*wiÕ¢fàÿëÝ?WšwJ×nÊÆÐéft²„„5•àŽ®’tD ,à'"Ø €[IkËóü+l- ‚Ó6—å Œüða#ƒÿßu'†‹ù» ¸8@…¾ä% ]¸2  ” 'ÊO¡+”ë|ågOpzù„EÊ-|˜@c Tæeîd^®à£ÀÌ/ÜÏËAý?ÿu¢`$üG8ÄÏÔû=üè£÷߯{‡EãÁu?ïO½þãõ¾ð¿ë*[öÎR¨.°iT0+û€1jø7ÿ‰ŠÏþéÍzûÈå€×¾»˜ÿª¬‚hmÜ(¨E®ÝöÛûÿ_½IC­. ªçóë¿ÅM™m ç¯Ä?½>´×ÀIsrx6P€ÆÒÈd÷[ܧ²š@óŒjKMÓYÖš±@¯w¸Žø¹Á0{cÀCNiWÒå›ð?@ѾŸŒþ§Âÿ.È:e’ÿ ú³ê² €x`}i ü¯ξMb¾)ào“¥%uY8ÿÓõ•ï¡ì^¼»×^”êÒÊ+' €)`7Þ ÿŠº7%¹¿;r7[gìMù›×½wwvõŸ¶SGÖƒvðT¿ýmÆ&ÀDêa&'€‹ÀG¨gØËK¥a†bÀ•Ó¨°ò=}%ƒ.1@ÞäÑZø'ó‘Úw‹&–åöüÿ'ð}eüçÞBy 9è5€@:À>4•ïO¥}Èö¾jÏÍ4üÍ  Œ~&ó±• ÀsCQ à?ÃoãzïTÔŽ ü?•÷³Eá°õOË¡ÔN¡r)¼(–¼B’Úï‹ho~ ù'`J‚ÿ׎½àøÿeW:‘T'BûÿÑKcˆ À½UýEô/øÏ†c€ø’¬öåb¢ ™ˆœûþ‡ ¨õ`¯ÉôœòIŒà "¨Ó@ð©o… @f ‹‚®¤k“7•TÀ¤| PmJ\ 2¥ ::z\ÏgbƒnX@v)ˆÐjmx/ûŽuŸï|çx>8R%6é bh9¶ù¾‹Õ÷K6/ßÛbD ÀNKŒ¡ ×û¾+2øÅnvuú±šÀãé«M7€z‘Т4ÆH ô áö낾é-¼9g ûí3ýY§¨\È›ÿ—w߀ء‹ýË¿@¼s?›’ø_çJ€ +Ž<{¨¶»ˆ_[úTÖ?;ôû……`“ÔªeÁS ˆØ‘ý ÿ€/üÞ»×…—_†ÐÑ2€¨ÿÀnÊÔyÝ ¿ÉwåŠnŸï>Šßuš @–]ƒy†H+Èû?Íë–ðæO~Ò?YÀó ðÖ¾Z¶œ»ð«ß»Ü“'€ú ¨ÈÉ"í»åíz öwü€ÀWƒÿEŸÿFü=@p HÀèóßH€¿ÇN Xøüöÿ èœ"ü8¢B@ðß €‹3}ð{2(°péKþ"`f†ÁÌŒ&£€¹ÿsù¢f˜ˆáþ  ¢`º1Ü4C @tL †ûƒ€8+û ÿw7€®€àÿ›ìã }¹8ÛŸœí¡pImvvoötÛÂöá¿/žjÀ±¿¶;<ë ,èŠöÿð?n_üÐdO yéïomݹðGÂù[~kù.//¿õB¿÷Öÿì þ¿ÈÇ /ôú/¾(àÙ-¯/]ƒøíoo/á/PFxEÁäí¶–zpì ¾ª( €,ûõ¯Íÿ«« ÿaÐXL@Pµ1˜‘ßÐg¹UÃ_ÎÿVµîü—-Aå ó·ß}7ßÄüÌ‹ZÀ¥2ôzm¤ÓC2f߀›ÈÂ=~’óÿïÃ=l"’%i­«°W^yUÀ+¯6n· 9¬Yíý÷Ff§ÄÈéÛÖ߹Еò»‹³¡$@áK.Ûá±UBS‚ù‹Ø/üâ˜t¥˜<…ãtþfú¡ùuP²aO7Ï<æn™+xsœýš2þšSÎæ¨Ö’³´Š_Öó‡ ÿ‡ëü›7š¯o%À¶ÇãÀ½Õ+¬Žâ ƒÿþïÀÜ!æx#õèÙȸ`h;e¾~“üÍ7ßD@ø?³±ÀGàWRÁ°-ßÝÔb¹\xl.É¡•/;dlÎ-%÷g“™èU¾Â‡%TrsÍÈn]ÆØW|•÷ƒŒWÛ£ÒGZ,‡9|@YÄ»¬oê5h †]UhžQ{¿e9­¶‚…º`ƒ¨m±&Âáþ%`›_%„ÿ¥`›Ú·Ä|I Ô€¤ ר¬p¢X}/አaSù¿€NÜ'Ú÷¸%5êà ¨ÿÓÞ|óoÿÖþ% WnÎÿ2sˆþpˆl°g3ï­‰ ©3Z^ÒmÄ4¨|îËã¿éý ùÿÕ_Iü/—q±öÜ‚Fv#&Â3û‘B eÉLA?ÂÔ›7+€QO4ÎGagPQn!°èŸU ÈûeZÂc‰hM&}€ÐÎMî/wà*µ!VÙ#A Lè{ïPhâxÿÓ˜± ~ìÐÐT%²‡ƒ®¸=2 ø‰1×ÿ¼ÐŸÁйƒ5À0ä·^‚m\¯{ã˜Oä ý_`136%µPÝ1Žš@Ú'x)ÀÿÖLþßÒü,"É1·€ÿkÇŽ½ð‚ÄÿÉû ÃD/—í‰6œÄ~C^W?‚ÿ1ð°ø[b¢ÂþfТ`n°Ž€èOIηdûŸžÍIe.ï° ò›ÉÀé À0A€q ÎËD˜*_.‡p…„4õ¦é#އxfƒNŠ,XÌŠ¥°Açö çÏXØ#igOeKI,ð?¿gtBÞMaD¾ÿv@ûü‡[P²};VŒÕÙ/U>¢ øöÀ€èŹ??¼DB’ÈŸöýX™%›Þv`{ºâ°Ÿÿõær|æQ4æ‹a@ÉQ68nÂVäb϶&ð¾¥]ç,@Y6û½ûî;¦ *àÝwÞxƒ+"¿H¯ÜÝ6çj1™¨h ë€]ÁÆ?k-öìŸÿùŸoWTýnøÿå²{AÀ(%RŒþgö«Ì…Mγ%·Ïpf,â«öÿ•*kL¾ŽHúë?ÿùÏ“Cÿ— `èÿHþ/€µžôük‹Àúè}ŒZíÀ^àýc_¨ŽŽ8|LÀàPÀ¡¯ ÿï™$þNÜtÀðò__´c7̧æЛ9zÜŽÍ›Ôÿˆ!¥`ß Ð@` ðïþ0²Ä1Àæ–ô0ˆŒ !П,Б&QÀdÿ¾Á â@zÓÇ øû]ù_Ÿr ¸Ý0àÏÄáÊÿú”[À¹xlÞ€¿‚šò¿}š9@8fØÿµÉÉ#ÚÐøo‰ù>‰’ûÏâ @ÃÿÒµÓ<Ýë#•_Z”ž'ïöï1&N€ø,¢ ôܾ¸}çÎêò`°º¼tGüˆâ7ØÞ @áüúË·—ûoõõÛ«‡ð¿·ÜƒNèõ¥ï?9yçùÞþííåÛëxX«W°w¤ °œû5ðU×@¢ÐË¿/t=û~ÕÀ?Û¦ç¼ÿþª•0›;›Ò„nR8}`9_¿Ý€%f5@üÔéAfzð4ª\@{µø°ÌZ!…åÎÿõ÷ A0ÅÐDØH«ñÊùÕL ŸÕ· JBžÍ…û…‘™ÁR.TeþF"jTM€õ3ò÷{r"Ï<ì•^´¥>g€MñÊ?®$øo\áþmÎ gðß«„"X ¸–²î² ¬¼‚òt+½­ ª@†V/FLîg Ð ¦„ tFðÿÑGí€û¶á©Š0ë—2 À+Ù ˆþUN3È…ÿßxC¡“Šæî80„YÊðd@¬¬½v`˜¢…ÿ SyÏ 3…i ÛîÞØÒ6" €|R¾š†¶5FW2>Þºz®¬âŒ°ío=‰V¸Aò~x;Ùo²Ÿ±þ)_€/$õ)᳉’ì Lè~ X³Õß2z§K e…wh·òŒúó#å@CèÏɉ°EÀä¦5JofkŠ Î‡~@eùHA-e}3l'„j°ÇMnÏsK ú^[b& Ó<˜¨"h,†ø‰€"€@àÔ¬$ÞDú/Ñ¿úo€iyáüï 5/ 8 ¡wE=ò·‘]ya*ýßý@þAÕ¿ù›Úè…Ïýõu3û?„ÿÇ+²á @##‰ðäLBö#U„ $øC´KM%ä~Áàðõübj0 ®Ú`°&ÎLÞï‹ ‹FõT”ŠÑÄ=þéOî°ò‚Ã=C¨úKì tõõë·ÐÓiR¸ã@ùL²Eƒ'úE_¥«ë ßì–¬pÞ4èïÎð£×mÐu=S #«®wtkÃ=È\†Ø{BþbPáÌÕMÚ†%ü§ I3O#ibt“ K˜_øQ¿á[Šÿ9ø¥žÃäþoc`Å·Q`ŠJæ_ß}áíÝ·ß~ÁÙ€h ^$žÿn^}ôxiéñ#YTZ1>› @s|vü´ãÿ+Ö½ó×\Éü{=yØ«9ÙSEõ üÓÅý7LÛþOÀoˆ07«ï¼‘ô;…c!òÅÕÏ(.ž òi=ïcD"|ý!©= ·þ/Gðb®Aý'€ÿ,€Px°ÿËôg!þ ±{½l_óüeÓ° Öú­9@ø¿æ#Öq¼½½ÈÂB@þ[Ö÷-H`<¿ªd&IŠÿõk×®% @ìÿ7cÒ$Àÿ"z´/•½Ñ÷8Ü?Ík\0KØÆÙ…\ýCäuà ÿ‡9 g€øÚ¼Å³8‚´ÿ²; rwÿgÁ!ð@@óäþîþÏ‚B àÀlý!%ýÁEÈù›üÿóÇããÇ€Ìrx"Äÿ3ÿÿüÉHÓ´qäðxˆÿgþÿÝ ‹ E€é!RÿuÌ\ý_fúŽÀÆÝ‡è`ï/Ûÿyóà±ôoçæWÐ@Þ/ÛEú¿ÌÂ÷3§À€Ã/›¥‡š^m ¾Âø˜ÿƒe€¨˜¯~^Mûf¶.NëéÕWÉúUÿL©—çtòY0?ÀŒ þO0r¶‰öçî·¿}~€=Âê§©”ßð÷ïaaŠ€})MhYÒèFQ›üÍNìa­˜ZMqŠ1ïùñð¿^kÜíð#ºâzE <]¥gqV÷‹%`‚ÎAügÝ?£$mz:~ŠW¤ÆÁ;ÿ}Tÿ³á‚¬ã,§¨<+ë^Éú„þ‰ŠE ‚BB*&ÀœÿeÙ/¼ÃÉh8¾ñJ£Å2[9™&>ȟʸrÝ,L*‹…AŽê?ÉàÿɆj[;Ö#¬‡cºÊ÷kôZ¬|ìT5´½)s9*†àÿ›·ÀW ¢À9¦º~g} üÿ `âûÙüo» @¥yE æ&Úq‹LÌíU¶gŽJ »ÌDôË3ì[ÚF…ÿCàI_‹Øtª[ɆÁm<ç§Ä‘ª*0°ÂŒÇ¼tãÓ—óñ·–¬Î¤ ö- €öM›©ôOë™j¦PÃÿÿr; 5l…Õåú…|e´Õ›þøAþf¹löÌ÷ °\(¢`ªÿß~ý׿b)@.æˆLø3äÌkKá{Àÿ28ØÅ%ˆ±/{/LÅ€užÿoþ†7ó7ߟ©;_˜úÁp€ôR€´ÿ+ëuÞlIF$/k@U¡ BPÒI‚ÿç¿]'Ðç¿ù ®ø4{¬Pã0IØüC`ïåЫ€SPEÇ÷ï ÿÝ€"ÿÉò?þ E€rðƒvxôø„ÁfÙØÃÄ¥þÒ Ç»£Ó&? ù§jZI{=`¹óþC.f7!þ7É£‚Ø '€¼²µáiÓ Fˆÿ¿õú·0àz€æõ꣟°IYŒdƒ PÁ +…å~¶'P³ùÙLIôå\’$íøßÙo -/ùéÞǯbî/÷2Üþ},D÷å04R 1ÁK5Oí€iŸ˜˶ÊÔD›½°K6=§€ (XEHuJ€œ%h‹@‘n Lƒ"=¢‹ÌÃIöã Oÿ ¬ì¹Ÿ¬äÖ!æo$óNq}c²«DÐ/¿ô7u2]Z¼!ß:°¯7WÕò‹(ñ£¾Øÿ~iå{ @DÀ/ßæ+FFãõûBü³ €°¿è€ª;Àìê­«WÁí*;õÚ C²“ÿ× ùŠÎE¬vï@Òð[ÁˇÂQ?’µ‰ðÝ0ãf÷ß}ã @Žý?T@¥t¨Ä„ꇿdê¸c˜Ž€OäúÝ1þD¾üM€áÆz§Üè%²K €Ÿ\¿ €"€ßEÂþRúÿ= €º×Ë"±HX‡ýdúÖ æ ¸·7ý‹b,鎨1& ’Ì”Ë8k{Ô-Ùb¤ @ìÿ·`T@tó/»˜mP±.¹@34Šù—ÍH- €†wè¦€Š€ÔP@‹{sýçà]¬ÿ‡ÙÇ€ohÌ›ë?ÿè`ýß[a¾¡ …ÿþƒõ?.-@$ˆýwlÒ‚ Vø5wð7iêý2Æ?=19%€¼Àè(~NO^³xÚú¼ƒeÿ¶LJÅÕþ¸õ1 Xÿàwëï-/­®­} ‘þ GT€ÁöЇõññ'…@?RT$þgŸOœܹ°¼~q¹¿ü[Â,£ `ò˜¼ ޽¸¾z@5}°óïQ‘p @vRøß–q}gÁ·`üتڈ×úŽž yƒX :VF««|°N«ª ^·Eî5z›0m)"#Óšê˜Ö¢÷ó X/óËö ¬RWNÒ0¢ðð÷ÑH@g!ø/nPU`LûõÙ DŒR<ºÿ9øŸÏ#àüù-=Å.×Ë/X6¸#Ê*²µQ &_˶ÏûÛ»é`F+$”¿‡,;EOH-lÞ¼I0fË#¼" |žÍ-CTTÊÓÉįß;[®àqlÌÃÉù¼šÙ1ðSi’0®mr˜½ßBä …Íàω«ù* 0}ý¬§ópû0ø_îOÙ0¿.ÿ»·0µ’"›àmVÂÿ[9"¸´}½ÍºœBÛÄŽDÉXùû§æÖ‡ðZV¾ïÿ$ëÏÔ†3¬ª€ŽKŽ#ßuÓ Ìm©àAÿ±!nÿ†»(Ë**^ 6™˜@e‰ºwÓÑVô¡}ÉûÚN€8â :Jƒà€-{Àÿ°÷u@ðß\y wÕbÿÞÊdÿ>¶Ïl)ÑvüߣmkËkß ‚ €/n“×ÃÁa·0=Çš ˜üBÿÿWW…ÿe E€û2¹Düÿ·"Œ0B ¦Ò^äüouí~€Ù»¿¶jßá‘b ¢o`+X5È$%:§åÏümu?¨Sß»üƒüOMéó¯þªI0"¡\±†h5ìGˆÖ¥x€¸ÁŠÕ`š¸‰ Œk@¢¢!€˜ ˆPï—õf>¼. Þô÷_W‡)*Øþå÷_f2ïf•fž£ÑþÿOHÿõ5èüüؽâÅ<Põ˜›ò¯ã)*aƒ5¨ að‹ зb”è? ù¡“CP ÿ¯É†ÆHk~à?ÃEp½€ÆõNMê:Ò— Ï"ÿgp5o±ŠXû[çµæ‡*p¥ùy5Ûç /k0Œh/` û Fy™x…Ü{÷…ÿW± ð6`¸†s€âýK@|t)0à”ø¿A˜½,D-I†þI´¸÷57™±þ@äÎ$,4À I7ü_¦{hà?ã‹6] À qÑ Z+eþ†ÿËë‘ û­ç? ÀÔô¦â+PΆÿw5JÑײÍr…À„.ðŸàG"GÜÀàÿ/ü”ïÕWø¥8€Ò ‚yÚ׿ðB& 9£Ñoí52œÈÏ ´a4ŒC”W&¦PŸ)àøã€uoÂÞ½Í럃S®j:X @¨ýÿny}XRÑ€€µ7ŽAÃ0K«Þ<+«î‰þ·@ý}*-DQñS}ý#éz PdF"ºEÚÿ|È@¥µ‹#`¨ÿ‚¹Ž>Œ“N¸ë7ªÕÖoNÈ%c¼½©Óáöƒ‚¾)SÅðø'Nk¸¨Ä„b…Ž£§ðu+»†€¯WU¬ÿËÇÛO¤,U5B  áÿ#Ö¾D1Óç‹ä|“Ý?€é¬q ^x{LÑMQåøAäò´’Ó¿CAüÿw_‘€9”¼°/™ ,€›xø?à½Iý`ÜÀ¤ÿn`º¦´Ì`ÝA ü5‡,•ZË$á4.]º„€,æÌöÙ€¹še !:,›9i€¹þ |Sº̦'!\æo*ÿ2ˆnuíùÌßTþeÝê8Úæ™¿©üË ºÔq¨7ÀýÀ7aPà›Ìóorv’8{Æh— üõg×ð `'¸q?Nþ﨩AíõÖ>xøpíZ5ȵ%Î^úÝÚÚêRü? &äH`òØ ½qõ÷¿û/LìAHà…þíc{d}û!6ë·×/ÞžÄ#þÒ`ù—×–ÂÖ‘ƒ¯_m ¤Àpôý“%î%³²¡ÙñøŸ>à†ü5ð4,æÕ`€&ÝÍOk±_v+óG"Áí›—±¸…ØËXi"‚n·1®Iðï?º'òõoÈ „HÒLBÏ©?ùûBE@Où*.žùûLðL=ÌòMˆ4kù¾•n½ÄÈ@œ )¸Ûr=)¿¯Àms„Æú͵’ò÷–P/0n:hÙ–@B“ðSô„RÑ2 Lž%GÃê÷–Š@0Àtާ³dñþŠ|þëM",ii,Ù•6]™bŒlΖۨ0‹á#Èï!ˆÍ)RY¡f÷®(a}zemö^ŽÞÁ þO9ª¸vJˆçr$a+y9H(hÿ€LÜå?y=î@« áiceÓºgiÑ'Q@ठК6œXq_•ÿ?}€ýåº<Ô¦ùLÀ¦9Ÿ424‚¹ ~¶J@ÙyG£™ÔÎ[@ÌœèÏ*}ÜŒþñá§ŽôñsÐOà·5êú@YÈ7ÖÏàÚXýòæ²P›ôÆYW`HªË5ø\ [*üb4¤;)àxÀ3ºÜ=]þEü?ÁfݲêÙ¿,̹|—…¯· <"î[@y ¤/«+«K÷WÉa ú/êôjNžOÜÇ!è”E” @ÓÌ …˜ù›™(@õ«åíÿ{@­qŒØÜ¬Z|º„f¬à—‚IJ}ÄZïzfN.Š›pln`I @j¢¡f§þ@IézWÑFæ€ZU›¥8Þ§o Ì™¹wÒÌt‰Åð#œJû?éÿKaÿþýá@@à  ‰xÏ£ZbÀ`  x0÷Òÿ—Á¨B@ê0?ú—fÁl´ —û?éÿ ·‰\L@ãzçÙ'*Éß)€,ïe}c@<Át?ÕüˆYk~á-;Æû]5`µNh~2Û$8À+çsÖÿ¢*‰À/Nøh>€~ÅÿëÑÿ§@ØI óó<‚ö‹ö´R¡…@S¶éù“8=C}sHŠ_ ˆ©¹N $Št8I:˜kø"V—B½\ô‰H½Š(®‡ØJ®· ¯¼Žµ‹E`Pa]=€2bÓðièÁÿ_Z»?‘ψ‰L€=“÷Ó¸PT˰£C‹ MöÍ€ÿåþï—Øý«|o¾Ù'Þkÿ— 5/€^†ýdÀDƒ"×W=ÌjùßR4ü¯w o¼Ià?@3=!¤€SíÞØüíÿ€¬#Pú€ðÿÝòðŠ)˜@T4’EŨ?{ã_Þ@* 2=ìÕZ«MßF-°‚(8Ö?âLhbNa¶gKFd0XbIáý?HÙ³ëv9–þÂû>0»ê¿6?TXðrmýƒië·ªM¨@ü“êöx))¤G^³[[úø7jF$€Šçч<¾Ä5¬þþ|òD$üiìÿ@[eYàk_G4_ÖÍ F…*vhõŠ?û‡áĀ‹¡Rm>8„–”3Ýúêóÿ/C$þ¶‡@´¤ 𺢘ÿ ñ·=Ü¢ ]€o* €ùÿ7iéúϵH! ÀEé‡ÿ‘þ³JØÙ4`íRwxbÆYÉ.X@ªI Üàq¤ýÿÍM¯ d €@¹þCà.4ÀÝèO@…ô›ìߺ.€Âº'ÂúMñßh×psý', ›¼†ìÿØ1( #{‡#0I˜½c‡÷°ùß;ÿ¤¥ÁÆ€LŒåËZÚ€•à:1¯ÐõñÅ·‰`Á&ñ €Àò@ Ãä@&“×Þ Àm€;½> %°Œ6ÂÁvPÿŽ5Ãö {bNJHâfÑ>{¶\”ãY"iùÕ€‚ 0…ìÍ2Pà?àÝ}ÆßUŸ ðc”Ûa·-#ã:À°’<Ü}·ER7ÿ{Y† VÃ@A¤i&¡wyR2×¾š½ ôÿ—Ýww!ñ£Ì²œÓùm Ùðî·ÏŸß̤)­h2Vþb‚ßZ¿Úf¢ kꘇ‡NÅ— EÀ­<=‚Àâ ·j€AN³Ò°çPH.+N79«^0Ú!ØC‘ÌääräÕ\)OÄ—àÿ!Ò>'IÂþ‡À6êÿõLxJ¦ ´0¨*˜©à¿=›k9[4ÈD߀qh:±ntð±FÆÊÛ/å“pêä¯QpQó6ñXUCÛnøuÉoåàë2¹–¾¼i ¸€è3ÄkêGü%ýäýh]/ÿ¹U/…’ ¹€²ý8 iÂ8»eÝ =äàâ:È‹ –da>Ñ*Ù%‚âùV 3nä z ÚgM!¨ø¨ñ0Ë3ƒû LX6'Ð~³ë­ÿ6[ÉÝ„ÀJ¢EºÀà ¶8Ãi„…ÿÓeÀøU:nà˜ î»è7€Æ Œ‰7!ÌùE»ÏëJÿ~½P¢7ƒ5 a@Ù²KŽ]2Œv9bÛû«6ú¹5V0ÿLžH;˜ÔU‹­óZ 2 èx™Y¶Ä I 602عYÁÿ±‡Ô¢ò*‡WëÙi{c儼¾YK@îÝ­…¹Q@lzÖä|à;pª\ÉÿYiÿM çNã8ß(÷ªÀÎ/¶·Ô‹0•¨È°]ÞS€Øt'€ýÝÉT¾~%; @$ÐÅAþ¯@òvý1×sÁõåêó` Ž€š_R e¹s€ña«c|"KL~óTêµkõòÚ’à¿a €d~’ €Üð­âP€Äÿ!`ÚLûßBI„x’ém¤oGì¿— üë£Ú…Üÿ$â!p4OW˜ –´:uåÚ55õqý¿vmj b-[2ß\.ÒmAª«ŽIþ¯÷ï1úDL»@o>æ„®íúÅÝhãQ¶ôÜt¿Ë܈àï “»ÈwΦ¸SxKí&$ÿ'äðß Þv'€E@½:™Ëà>…H]Dü¿ Ç…ôë@æÀTÒDÌš €\pà Ðê¥èÞÒÿêwü/ýzçŠ<ÿ3±¢ ü?D K€ÿkbשê_}„ ²Ö@ ¹@l?ù¤éiþ (*fðRbê±´e €/DðöŸÍå$Ò;Ãc€Ü6Šæcj9À+=¡øM@±ƒàŸC‹:>7·ñ‰%Lý«bæ© Ñ¿n¯ÿ•ê·¢Dô¯H‚¾Ùø"•Û~þsÓÐ+ aû­!͈šóUP>È3]Ó…†ƒÒ``°þ;1míÜå˜@öãßÿ äî‡pk‚¬Àÿ_Àžäü’þ»úp hºr¸1”œ_ÒWÿ.M@NÏõó övÿ‰Àô™S¨ù3oXP½4¶ä3uDdâÌœ8©eIù©4P@¯ÝôNœœ™>>éKN6Ò À¾ŸœöCÈÞßn  ù?à:à®ÿ¡dïÒ¿|  ù?àž})þCä·¢B ÀSÑÀÞQ´ÿ‰È{?,s€×¶Ñä/X¸Z`²,þ (ØO7ƒÐIÇìT‹°õGy¨i@ï?û‡Õ>øËŸkÈÖ×Ö×1@3‹ÿm¼È®`²×  O`@) ôû·ß^^zÑ"ý¡÷Cл¶¼Š#€õ÷½eô N`yõÿ·öÃ_Y 8Pêx@ôÙ(–ÁàÌR3àâІÍ,CammÊât¡ÁäkˈS™5ŒhܧëµèTú®¿ ÐF À*-Dþ³éDî‰]©Ñ†%{¸o¸Cµ4­¥~Qx;û~\ vFxZ)¼ÊÛ^U!Û‚þ·)Ò&é¹¹„ˆf¿› ÙŒÀFè2% °Š4VW‘¶8ØõòÛÓØJmK&v‚ÝBŠ+ —ßOŸ=zE4Zh¶ˆZž5j.ÆKr唼ÏÕZ*ÙT !Ê›çƒ9ÜXRµN¿ÕÄ„Æãó¸7©¢ü¯›]/#‘Ä ZYR¼ºá°VtŠlz•lKßp'V&W9øG ÀâGˆøò (•/ɷߌøŸ A t ËP9ÿËVQÀ@‹õ]Çc ðš5OpvJTa<9hÌüMù"<ùG»™0$VE©³m¹")ž­R¾ÊÍò­ ñ‘U¶ƒo¡a7]åPƒl£uX=u¤ÄH€ÀSýw€ð¢q üÿþûl¦ÐoFý^ÿ<.õwµIù?UbñØhî‹”¾ï@h3ƒs*–3~]Ž>Ö`Ÿ`acjë¿U\/+ücí×KÀþµv1ªÆ(‚ʼؔ5ëo_ͯªœ\­Ç)Åxáµ×š @¾¼<Çöí€Â@qˆÂ‡Ìß(<½Â|ŒA@m˜ûNB˜Gü4]¨Ÿ€m^Qàü¢¸è{ìð4i€ðP¸Žê š×®]YˆQp_/ñµ+ C– €í»!½^”@„ÿ)“ËèY¸£Ú `%T3]â 5c*2e QtN¬G à¥~OaC%üo!€X±ÆeG_‘Ü_2àMÂMê&”øÿ*€•Ï$’EïOòqð'ú X£·÷ÿ--€Šƒ’p^ŸÿWÇgª‹ÍF|uo%ëÅCÀŸ ìec_ë@þ+(øãCKޤêæXB4a­w££Á¼a ÂíÛ›¦‡#K¦ÒM ‘iõÌ-Rýß ö?±‡ªÈNhÝmCD"¾É58Ü{Ö—€‰ÿ ËõÍ–mbqâ¤aJÏT)¨Šp{‘À•ž/Ë'4Jì¯v–R0¦5&¶€ÿ _E)èÿ¨uº›âtùiø_¥Üå@#І&4Æ^‡¿û»¿ëRâíjF¥åÇy^±àBÀ€G· ÿe æÀ¢X@70£ý.Nƒë?èÆf ‡€—pXºþ ÎÿD‡€ò` €GÔàÑeˆÈ[êèÀ%9úsŸþ¶zYíÉŽˆ*<®áH«õ=óhÿìÈ4ÿqùwcEàßœÿA¬˜CÀ»ÿúýa(ÿ¸ü›Ÿø7çÐsæpþ§§îô@.ÿf ök:`Ö¢œziò¬GØ;zÉ;jGŽL>†GB«1›ÿIi$ñ}#w %'Ràd(˜Ÿþ¿öâdïgÿ·$ÿ²À¿ßÒ[HCn{ ¢nœž|qrzßÿºR9L `y¹ÿâ‹ßßCi`‚xèݾxûöàEÌn£p‡€ËeÂÖñêààA <ã@¡ãm©zOá)áÿLÀ<ØÿWá¿Ø_·PÀôÛª°¬.çÀÿ K¬ÎYÇT iü[[ÀÉKŒ°Pýɳ©÷ßgØ~7ÍQXÁ Q£Pñ’æ§·§•7A@–| oxµ °˜ëÿòx]#v*@¶vn›â"è›Â¾+yMà „*ŠhvÂ÷ ÿ3§õ·b Ÿâ)¢¯Ü,ð? –ci¤cÐð§ÅJ8=©›dïX1;+7ùDÒf§Ñêx+îÂü}¤Ó¸|˜¬½ ôHölþxíÛ ãßÜoèØf?&¤’egŠ %¾©„ác|öeOþ_4ÏKÍ·²‰Pˆ.­Ñ"cNð|ë Ÿ«R mÃÿl_—›(tì€ø”NX<-… 6Gú¾üª½­3ê*ª[­ðXˆn[ó«}+Š kÁ@{å!Ã,oKk‘„Ä¿úø¬N— Qäœ×ô6S3òËå¹ûp‘HTºØx´B[‡ž³æP#Lvç×K .ÞµÒX½ÖÊO‹tÅ[ü;P!îïÜ7àÖ=¹„¨¬ÁþkIŽþ?›<Ú1»åMÚŒt÷Û•…¥éȘ¤`\iÙÄN”À‹“¨è=þÏ5þg€ü6 ­Í/›(¶%  ²ÀÁq$:Ú?ëß¡dP,ü ¼Ôìaj¡è¸GÅ €r÷ß þ3ÈÍÚÒH¤â5-áMâ0¾½€?ýɽÄ,2¬ÿ%ÿ—@X÷õŒç„ëó*¶ÅaP$Ïïý,õ<Aäˆ jò{ ðehϹ›¸€€WH7×XºòuÍÇ4G'°þןüï¸ÉŸIÿí_£÷‹“ô‹AU%¨[Úž7¿öS/¼öÃЍ3Rè‚@ƒÀ`~Þ5ÁùRèWРB @®j¯Gø!€ùóÛDz‚(á# ,%¦J‚ί €aH+J°*@°_.Tn]WŠÀ+•p1(˜*J7C2¢;Jþ/½º‰–í|ƒ˜ñômš•Y È/~=ͬJðè\¢•œê6t@äœð“ºÜ›Œ)üð»uôh¢=“ \þ/9z¡|oã@a Ë6L‹šBžý²ië`rÐ¥ÿoƒ×UŸqXŸ ÷,¨ß\‰*EC’W=Ãÿü…ÿƒ@8´åeásþgC! %Tr?ôÆ»]Æñÿæ`“  0QTÒ9€æ K°E‰P¨ŒàÙnÿÁÙÿl–htˆ†¦ qx(üïÒû÷ùžÿÈ üœ­J”0'‹¦jï¦Îãík*ýC0Hþü'#d€ò¿' 9f²PlEÿ¯¢e`Gʉ_TH)$Å(ÿ–ž6Gµ¶šï‚œ, ,ðcY%%·Gà ¸ü*Ðÿü €(˜˜ÀËÃ}wøà÷HDÀ,Àõæƒë?Søa“Ѐ".^ò:aS4!§Â&`F¾KÃs¨? [¡2'Ší¸)þÿa¸!Mý˜1À6~kN‰`Šÿwzç¤  3p}ù˜7Åÿ³§ÎH@?f àúòà–üÒ½?²wD˜^‚ù½½#PG ìË.¿gŸÇ&åÀΑ/6ì÷ô(`ÿØ…OÉ'/”QÜKÿñ~v{uí‚!]»¶ –ïã `õE…Äy€ NNžœè/›çÁ#¢zxèOž|Ñt –·–—ÞêõP¦ûËK·×XÏ%Ñ*}éàËA |E5P8$Y[°¤ÚºmK2{¨õ]ŹßœË][5;ü´‰¦Xš²2¨ Ηï“ÚVÀ0iRÑD‘-ÜM‚ ®føÜ¤Qùû&ý×gÝ€ ð’ùÛèÅÂÄÜ”Ä,ìôŽ´ò.¯¼Šr!ÒþDÄ·2ÂÈ"0Ù¯ÔQ¶³º‹À»ÑdÙ£µû üú.kúµg³@óÅÍEQß ƒ ù65O-ŸÂ}‰#ŒP{öp ' qʺIVðPláÿ÷¢j@ò LÞƒ˜ƒ`ÞOx>ØNnŒ$ oÞxÃÍ©Ë-†‘V¸¸Ò/tœSÀøDj0 €é]žXbJîŒU¼‡…)ThÀ°þðʬhhÛÊ#d `OdĆm°%öì¢Åy~ð±ÀBRú~œg¨« 8Ú·UÍÎåŠ_cÍúakË|ýA}µu}¿Ôüƒì?d‘ž¨‰ $”Å` ZÉFp_q %ÎJÞAh<†Ý ½Bøº*¶PôOÔ¼›R”bÖ¯Ü9Þæ×«‘ V £Î˜øß Zf¡™ßäÿc À¤#Qí½Î$ý}Üóràz8Z4@˜ h :@eª¬.û¯ Æ¡ádøŸÚ‹˜ÒÚvùU rà?eig̾F5$è­ Psð)¼ÅUMˆðæ€ÙYµî­ÙCHû¿ˆà­]æÿr(À(€â%€÷ ÿË' Kùö‹ ×óÚ~&1÷êÏîåçÏ¿šI€ÀŽáù¨È·`ÀÚ•i-j8 ë ÿË'`ÛõRýí"Ĩ` óU@Và ͯ­wÙ1”Àÿ/¿ðÃ:à]ßfúB€—wþÛ% ßÌ€Šp€ëE×nd‘ðäÉ ©I0#F€š øßBPZ61 pou‘?uH@Z‡€ìÚ•laU˜Y³O ÀKü/&Ñ7 ¡0á5ƒÀ Ãÿc¼+Än €« ë‰ÿP×s¨PA/ž"P¥@ewŽ*$AÁØC Mà•Hˆè·(¼jøß|â@$@¬dÏ@€"fÖ«ßÊ#¢Ö„Êøìï.aÈL@ˆPsý4C¢zÀ‰†ûÝ@² ^{- ôGõß âQt¥Póç;ïŠÀ`mÜ‘<rç4&ÿ¦ÛÅ'NG4ˆV©äAqHù•Ò6×”®9&€ø‰–‹²è¨˜¢¹Àóû€üë ®h½¦ÌLî¢NµŠEê·¯Õ ´¼t†Ö>’þ_e&NT¶ò¬îþŸ ÿ9Jûfz*-€|ûë ÐÖ„ÿ:WÕ½n‚òæY† À¡CÿÿÝ¡. ¡stù¢ Aö/×}ñõ‹Òð €úÆ^Öÿ‚ý¢Žó¸ö=( þ°¡WØ?‹ðÜÑçlß#ð#ùú¿ê¼JàTÂV!NÊ€Tp3H €I†‘u¬þeÿ¸2à†{ÿw#|¼„Õ¿ìÿçûórþ‡€à@~ÿƒã?‹`ûæ Á€Åü›<Š@—ûO€Ìîûð;ŠÛ ý4!ÄèˆÎîçO˜=€;[FÀž`ïÅ“'qp{iyI^ð°¼tøÀ' €-ÙÿON+ÏcR 8†ËÁ‰£daú/Šj ÆÀ ×{ #ј°·$µ»ÛÁvPÿ~5 a 9M†VqbGðiñK[Ë•%lLp)(NµüÀ²±ŸJä€e’f&Pº ¯|V´ÈÓ-àXmeM 8…èùú‘K‰:)ÞÓ ï'=E»)'ÚÓŠ«1ûÇà»Ûüà àÝie G„KuŒœíBl ÿ=B¡BQŽ¿möEƒ_€¯¢ÃtÈÿ=ÿ=®Øuü¯3ñÊÉS„Sðë—S»RÑà ËÀäÙãóùéžù{ž^¬Q½°Êø,êu"š*ò_fëk9 w›Åb Nʀ栶~)Ïc… ûK.Nò)”Äé~¡P!¨joJ Öe‚9*þíÆXÏ.@µc¡ìŠö]y9Àø?¦}žÜ¿¤?à†&Ù§ïü/E—º ‚/ÄË¿: · õÎcé³u4à†Š¤Rûr% -RøÕ\¨ŸèÄLâáBÁÏŠÇHq):VÕ0P ÿMUÕtu므k0¨¯±¡ò ú› ð»*}øƒø±üw@@C~*üï^ЈBéÁþr‰iƒ—^/ûW\º6S@4¨*SòýDy°ÍjñofP}Òj*ê$2QHŠá×öå‡Ò›"´¼bá~qPi‰UᮣéYÁ’µdàVÿFXH€ƒ– j(büÈ(€¤v €€ÿa$}ö/9{5Ï ±€ód>rÕþïÿÃà€ŸÇ•FPÌÈW/Í:E¡ð? @óz|#E,Y­ŠÕfå À@á”El ÏÔ:G'€—øÚk°u@Ö×9.úÞÍßÅ ÚÆd•)©<~ÿåÐåÿÂÿ-ï7Ã@@Þy€T ;"/”‚vxp+€$'N „¥áë}}Íšm×— ^mÐp#„S%¤á4þ‡0ÁÞ4¢¿’@á2#k; üoCÙS ñô¼ãN¯z9Å „T\þÏ/_R€B àœðóËо,ñiþÛ¯Ö"­ï uh X¿s|Žò µUÀ# ÿ/ƒ°ÂŠ–¥yýþŒàÀÿx]Ý}|àW À;8É©Á>\® Á†Å|=Vz¡™_Ë€** ÿL³¤˜ÿeÆPpx’óŽö¿$ÿø„`§Ôÿ1o>ÿ¤U£n«uÜ}óõŸzáö¶¬$*ˆ¨y±Í\Y¤í‡ÿ¦ü  Ï”(²Ñÿ¥À¯èù#FȼÉü]—ID@Ûl2NiHrµDŸ ß{ @øÿ±áÿ-B’öÆõ%nHÀú F—ïB íw'€þcÁ¥ `´@áPD€Ì‚ €Q]—ˆ3µH€. €І DÀ[h«€b( ÀqYúûMîïT!¥ ð[íS~û™7¹¿S„”&€ˆ|ÈÝ_ph¶ÿøþ7]‹5òôìw„DÁãbˆp€#‡'fO¼”Ʌð}àÊÿ“¢€1ŠÜ' €%Ä÷×€õ€ø·ð p[F¨¼øbˆ(øÖ±½ÃÜý7¤<:ѽ X‘úuçY¢ôN¿€¼ÃÖ€/Ù=.ÿ’5P¬øMÈÙ$LK¸Ý$Xà¿5Ø€6€qxȼ¦•jÀ˜˜1¨FAbdñm@MÀ}-ƒÜ þ`9«QôT¥}ߪ1þO”<ÀOÈ)ŒÞ\âø¿™ï"·078f¡ñ­–ŠuŒì@]ƒWá¢à?t¿<Ó/ØPŒùã?Ë0œBœ€Šºpüo§È¯_"ååKp‰ÿsBA_/ž½˜ÁìtÏœ*épV©·(†ÆÓ›ÒG»¬A*ÉN˜@ã:ÖØ ÿwPaàÚq$­5â• â´,êoåÍìMª Y>I‡l}òö¯œ±*NQ>æ…È ¬–¡Íw ^”€€B BX §?pÕæY–F6 ¿©« ÄUªÉÿüHZÂíNt19’ôz;Î0çÆ#rȰaÌÄ ¡‹Xã1 ·0 ´ñË6¯=ê×úÈV£RÉò²­•iR¿êKÚ  ©€Ã?#€ýŠpË(€Ú;€á}@È `ò‚Uj""ËRH~-üï@/z1/ÏÈeöÿÓÐu0 àøeðYU(LmiA€l;J_âÿ+9‘õõ§Ø_D FDF´1Áí_…ïoÈþåé¿Ç¬1¼mtÖQú—üÿÑãGÛ0ß/á¿4°Qà%AäM€ë‘÷ãÄ_ò4¤ðºM>5žð¦5/½¨¯»Ö†45¬#×Kþÿ­×¿…[ùúõ‰æ‹@äÿDšŸñjù#Ý ÀÔ1^{Ï`^;í6ÚôýÓTå(»÷ñÇf€õˆã¾Öé+öÏ"  Jœ/¢°5 €Û»4]kâÙ_›€âD `ß\ÆBsËb×}È›€}H´MõÿsK ù¿<‚Á˜æ¯¥š :R`“ €}/mÐC3–LœByÆ1ŒJT`À05àè+G_)àÿfÆ·Š²"(A$ÿürЇàIOI9¦€ÿS€Óºº–YΡ´]ã³<&ÈŠ^rtTa$ÿ_^þ×ý×åe™ÿ³o›ï¨bÁÿ/8ô—ùÿ•ÀØN sjÀÿÀÔÇ>ApÉÞ! Áÿj|•qV^ÙpþOïÞ5Wl¼ Ð d¢ðÏ÷vsJ ñ†A=ma ¯ÿÁ P¥ }à´ƒ­áÖYÎUA¾S0áöÚ­0Òþ/ ›ƒ›‡¨ŒoiDÿÿk; öw@ Àц€ìBp¤0 7’ u¼»I|m>>ôèÖ¡Ç8hÕ’ÕÆ¾pš)ú ò‹0ÇD @¹¼<\1EA~Ñæøɾ\Ê5àLo.Èþ=€}:`®§OÍ"ý¿ˆçE9…Ôê"˜\d µE=1¿¼Ê [ИÑ8vBˆùÝK -¾ Ó :2ÀáSÿ÷‚ÿPG0Í|ÖÔÿ=€à¿…Ô̤æïêÿ@ðß4ts€`0ydò¨ ?FüH÷ßþ±±q p DnpŠ«Âš­€6<ùû‰ý æZES0<¼AqÆáÇ÷&‘ø¯á÷…”GI÷0ùâÉWW¯éš¤`ôJ µ ¶€ý‚ü8#5,Dé-¨ƒÒÔà 7ƒ jàKÔ@I”BÎ6„dŽÚ –˜€ô¦æ@£>‹”ìuLË®” ²%%edÀа Å (™£¦w:]¥™Þ½;»“1@£‰`ui¥ ÂI‡á€|_¿³ó˜‡NïJ OÁ’ËìðóƒÃº@(0òû-YÀHàÿÉ î >x*Ðñcý…9z{ñ]±.EzŠ‚&—HÃF_)bò\§ÇÌkô…Ý={ƒ¾fË‘°QÄ«Vžk™¤Û5«øoc}£0íqа}çÞ‘RŽÔ Àèvü…@KQÄÙ ÙÉÞÏßFüJ/ÎÞÿ«ðÏX’Àªökê þ#£^ŽÁ6§?ê/0y ÈI!**ÿWª,ܵ¨E¹P62âoÔ}8™É'gÿGæ@“dÝ' cK.¥êò{›Ü]?ž™¾XÚ1w€Þ?Ñt¨²›¬ð îíM |V'ä*©{´@S¢xv'Vù÷@ø& ÁÀ°?Ðü¯O‘ep½Ð`¿ºþ,äĵ¨Y”*†ÿМ¹+ifæ5` åbóïrÅ @±ÎF…D€G¬mæ ´µõõª„Fõ^¯® E5ÝÃ]­´8õþ䨋º_Hü{{ãºÿ P!Ó>,nÕ|÷±”¥SZ¿ç!@xMë™{¨l¢Àw 8E¨ÇÕSpÊ`Ö_"„ÿñÙ(i„ë!¾¥¬ç×»°WU‹‹óáµù¬ÞÛ5Oè½#T¦Ž½öÃ×°xG7R/gþï¥Ië4 @ ¬©cïÁà­ 24#L@¶³?Ñˤ@(@tøžô¥nïf0Ïjã¦P' ÿß²@‘×¥P' ÿ+мdœ¤§€ÚˆE 50#Å ø?´WwB'ü¿»#@æE:P'Ð € |S!NH-Nn*Ú/žÀ/‘ÿ&îK$åî‹HUT>¦d'T>Føø?¶@{CàòÜÄÿi0gµÚè’ÅÕ~buJKyP3à?šÿ"®Cx »L@ßð¿P¿`¿°IÊNˈ¢Çÿ× `1c- Ô‚ÿo$€jœ\;CѾ–Ñ‹(¥´õÆóÉõ?L¡<€XcÍEÁíë9ñ¯_ÿúõr¡PÔÈÇÁ@Žÿ€­ßÔ»´~{ÄO²x[ñ¥c¸Õ9·¶¿:ØáÔ{Oúq*SJ`ýoò´ÛØSü¿†v™uú®þïÀÑ%lÛ :U°ˆ-ºUiÈè³Ùt²©8£D ñ?Äæƒ²t¶«§“°íýÝæŸoQ@Á1ˆöþnóÏ·¨  à€˜¸ÿð[D€¨ pÊ¢\ÄÍ'c7ˆ>»d‘† ék°P€™“32§•{¼þ®7'æF”Qczüï>uøûl¯tqèÀñõ?ll˜YÿKùßM$ý¿»rw'€çΙYÿKùßMÌ(`nøNÏœ1²þôQä`¶7}LJö/aþ©_ û°TþQÀ‡˜ìßy'DàÈä`@ð€ÁÛ#p¬("úïÿ¨üO.<@¾zk}åBÚ‹8æ0±G0Bžß3ƒ½þ™ðØ;vŒ³ÙŸ #}l5ðï[) Ù¨ 9[@SsòûÂ=šM1¶B‘w- Pv)´Ë”¸æ¦Òü×È Âå¦Ïšäâ€Ï©R²lV‹ ·4: €½ì'ß°Àl —ápÛÓül\ú4 ´m” bd,c›™'[Üt]}…H«¯å÷ËÖ¥f\Ï:Èàƒ[ñq6ж€ E°S²èÃKaí/fŸ½¸ù•™Ÿu* l0ò zO!ë׫Ø1{,,Xnq=ZW< @W$À©¦Þ™‚  € `9,̹Y9ÛÚº²Œ— @-dÛÂøf¿úÕ¯bû,w=cå³PÖ~Këþw@JÜòP»àœþè\\f¿ùj1QAˆçV.©“¥ê—Nä\ÚÏ—ƒBª¢0Äõ×› ¡³úhæ3s4J͸¡°ÄÂß58Õ?¥Ð™(ùx~õ'³%ÁÂÒúZ%`øeßùg·œëÿÏù–ù¿tÿC @b œaÚä4>EX•úºüGµIep V%XC8Pd°æ7 tÿÍ@ÍÀð¿ã7/Æu¶+\• @³yxó³:’—¾–&(¹` *UÀ0¿á[¿7á,·C»”ûiw}úòßbVZ€üË¡0„0€p+iõ¾zþˆÒgÜ„ÿÅÔ ³×è)¿—ƨXjh^ꤛ‡0ž®ãÅ.1¬õc¢Û g`\š €˜¿2ÿ2)(`4H €k@=Ï€8dkòà†Ì¿ŸmõaD°U—RxóÕ>€1Y)þg¤²×rro ¤5ñBYÆÆË;>ü¿mÐ" m€¢ê²,âÿRøoZËö¢©¹U)™Îˆa„€ õ¿ øï­%Ò003€Zçt Àߨ&üÖ¨bB`Rà§Büÿõ¯ã¤ðzôþªÅéýó]ûî0lqý&×%„iÔ !›êú-P0Ü`×40j*j2¥à¿J¸eÛÏQO` @£ÿŒèÿFe†A€NmŽTÅDÙBI´z2ÑOf­S2Ø;Ķ'€Ö0“B?…ø&¦%ÿò€&ÀÊ |Óˆ’ù@`n’ý»Ý¿Ëþ“o³§dÿ¿µÈšÀð>Spk˜ò$«(ƒ…žBI¦€œc"òu¼ `3-K‘óß½û[E0-—üã €à€ (¹?P_QL À%ÿèP%ï×QL À%ÿÒ€ ௠PøGÊü_Bu"ññ‰1¾¿€Ã`ó#ßûòûÏ~ÿœ@ð÷ÿ8p2à˜" ÈàNŸ¬äÀô§=“IbˆXFî†7`M:‡-J/ôDˆS‚Kßw»ö-Å!˜ì‹&?ýÇ»àÀSè Y|©HLäáKø¢©ãͲ…ô ËWÍÏþ;sõ®U=xá÷Ù”àÊ56TuäJªj Tuæ å©´¸d4Š <…ôýãæ@kš°> ÜXúÍH‹Þ—ad)Ô1r<Å;¯ÞF`èy}A×e•œm® ù+ü+=žÜ}  ˆúEõ×ÖÇ#3w ¼µ€„‚§¯Ç¼¹^ÂþöRM  q{,l§dÞˆ€>«*þtÒ"”ƒ³ å,®$mÙškð)mËúz¡J¤íÓm,ËÚo¹š…«üÇ­@$kI)+÷O\þ¨6TªQÏ–vIZ r×Ê0¾‹ïÙÚÞ1àø Ùw[yDaÀ¤Ô;«Zk¹«‚m[ò+þ—¹ðЀÔÌ"¼Bá‚Z…Èñ‚Æs¾oÌúBÒ÷åýO R>GàÖƒÿQÉŸÿfüï ¿nV/eÚ @ÏYò kR=àÞ¶Š– €ÈŠ#j#ÀüÚäÿÏ€´O™ì?ÈoOœø«¿ú«‚ˆëls“T¯]õ®Ð$%OiºO‡`Rë¦P%¬S„ÚwûþJ-ÛrMèÎú‘{,NˆoÍcÿPQ°ôÇF®ƒ €,ÜÙ#i¥g þ¡ª€%üùóbìú‡&Âß *DUG!@~ÊO'ãÕèA`ÀQªÞW°òë]€›¡”>£I–â ©| -O $<²y+Kë'?=–   ßð?{r€€NÛüäUió“{dÀ¬ícœþßG àcÉÿ›CK(žcÿˆÿúÏ‹8’­¹Fs™•Ý”yÕbÏH@ ÑðîªXlbVŒÐçÿ 糊·…½D„‘À¼þMÅSPÃ\:”ÝóýëD8Päk:»zõ×ÿïЏê x·£ò×Öð!  D”0sü#?뾿|®ÿ'6²O×£AÂÊ÷KSÀÆÉT¤ãU–/H,þòºx!OuÕtÏ‘è£Þèa8t¤èÂÞ&Â]HÀú7æC ¥ÚxGÿ[Õ¢¹¢™Qâ6´« @„àÆ¿ñæ±hˆOÖ¤¤€Œv‹àÏâ¶#xÿkd´&r»F õ· Ðo*á‹Çµûú ¡°W’­ØÊõ%t f €?#`R'Ž‘I€­¦À‘íkZ>þ5XÈ @Ú5iuöµ(µ0å‹€q$ŠwôH•BJ‡à Êñ1ŽACÆÜ4ûqv 4£ïêêèÕR?…oÃË+þ/HþCL™ègcØ›™³ðAòbÈ@?çz§¦g-ü_ü›€ù°ipKþcìÅXxÍLj¾]ÂàIÆŽДa2<†ô¸œ¤ã9Ü7ãYöð Ò›×3ÀýŸb È+76иa^ÿÍ÷ hnÏ çVÎC`Þ¼þ› @h¶ÿgz³sgÎ$fìOuÙäO²F˜p+ÊØM7à~Çý õÉcJg¿¿³Uûe¯¯M^J×e(K\÷âñpÍt f'•nF0ÄÀñ¿Ô p4@æ  t‹4%àÂþ`3 ËÂýŸB9Èâ ¾h ¤>¢Ä ¡ã­i@ÃgX€i%_‘a…κ8ÈÉh­P`þ®×po‡*B¦H´P›Š‚dßaP€Ø8IÅ¡=¸µ´´Þ XY` @jµJ…‘Ñ+$ŠmšD·ÿ—|Ž©®jD4öQ§KGýHw |?è5½|ùâõ‘¿_ àfEô—–Õ9Y‹¶Fƒ5+B™:«Ž$f©b ¼ZÃ6æßa5d¬"(*µ_¡/,ËûxmІyxӨܿ à×—âWäl@¶JÔV7-½Ùë×_@ÛýÇå¼_EƒÃï†ê¿÷OâxXï  þ-Ÿ Òö3fMY/§]W=è1X—Y4@á–G¥ïƒø!ˆ(øðà~• €tÿ$@Õ *Ù×- ‚fÐfR V°™ÐOÓ­âˆÊ€üÀ°ÿßðÿ?@þŸÂÿ—üçøÿrƒutõ*<Òý€BMèÕл@,Þ7¤.•®gU`.„–€0ôZ3ð!ÖßS£{ ò›@­j£3€øPùÿ‘ þ…ÿ}3Wá„ìs³úÇ4 ɹ‚ @0#tCËx| €Wåz\ÕþÐ×óAÅ?ûܬþß—}ò¦‚À#ô”WÁR&þAøþ“ˆZÿ°çùܬþ¿e×+*çñ Ç–¼DŸ•RÿD¸xÊ$èA-u)L Æ]4¿zÃþ'@ÜÓþ0ŽÆéü·h<’ ˜È@,@¼D‘Õb:ä/€kæ°žW!Ð÷iº$B£$f" 4ÿøþ¼×†tw釼þÍêŸõ¿ DȽ—­ƒ[¯°•\_¼×ôÿpo%w ñ4/?)Ú\²aÐtCÄ5§êŽsÍ ÀTT ]*ýg4@ì±1Áªo««³³ák¨¦ýË€7’¥NÿÓWuÀÚó¡’n~ÿdÿïö5ŠÀE Y tJÕÖ…1ðü§üs€ØpTˆR14®”ŸŸñ úŽ·7‚"foj*sÀÿfÆi›RÜñ¿‚?óO²ÿìë?ÿùÏk+ýß,¿¸tN+H+Ç£USV­B‹nSÂ’†ŒFàBE¦:DÀ?‰PéÿzµâµzêÓývã²ùÿ.€ìß VVæÝÿôpܨdÿn0}DϹ$€ýÌÎâ @ûª54ø„¸h¯å"á@ËÞ°ø„p `GÿÚ×_§oPŽÿVî®|fM`=¸\ÎPŽÿæ†sËæÐ4^ .çÌ€ÿÍ ò[H@iL¹CÀTl?!7€hì)ú d ñeˆpßþØêsÞß"üŸû À}¿”äRp¯ïéÜ9f2X4÷Ù&'zºQ 0¨ÿ#ÿG»€Ì'N~ÿû/N&÷"ÿc½å¾¸hîP-ßÓm4¹ÔÀ>k 궨Ö}AêBjÃg˜”°6NñMXÖ:î×ÐC¥«ºÀÕ xÛ\”UVÀIÍ?^Ìß ríÈXø_fò'ÓºÔê±û¸ÜÍñÿ·dâœyÀ0 #ó\TŸ—¹  ©"–Ôæ‚–õ¿câs×ÁmíJ‹/ †×[ ÍÊ>Q¯ŽéÀßžÓNÑln¡r4ÇgE@ ð°ìlS¡N¦÷:DÊU¾Fí7nî궉PS zÖQÎ.ô7¯fîMÜ0^ÚÀ«í¹öðùVaùŸì¦—Œ;c\:ð-Úpx8‡úÑI„#óÀðèÿ­\ ,p]C`VA‘¨½zŽÿ¥ Wéû!úšã¹ÿ voš+À˜B £´6/—wˆ--ŸøÛKžÓ^ÚU8T  üOksÿg–Ò¾F,½þ¿é<’è¤âöÖklô‹ÅÓøéŠ{Dêþš´ÌÛD¡ä.Ûv.OFÏzã* »…‡( À!³þþw‡€I€ì-½Ëìß¶Ö÷€qE³L8B€”L€ªÉñÇ«8ŒµÄOè]ˆy$ô×6Á Ô î¾í iüá#¶Âÿrñÿ' ¿W^7¡¿¶c™æ ¯t4 ³ÿ °¾¾Yé]åê¾…"©5¿ÊÐëÕ4õ2˜ÿe3þ[|¿¡õ´Ÿž$7€r€ú½O…ïÙö#E àõ™m'²Rÿ·Ç— @Nó—‚JªÀL‰mz6žU³#ÿ?Ôº0!^ã ÓZöôì.Â}HˆÁíª†™ƒ^™ g¸·ú³[ï¾m Ç þþÙzÁùŠLÈ9*³œ?Æà?aµJBÃÛ—Ê÷ËjùÞÖ$}¾”d"• P½>y%Ž[´³ì>ÕwW¾K3ÀpõFõl‹Ãásx1øø&[$ü Kp…ÿ°a `€§Ó¿MôoØßñ?S•‚[mºrx[h—k_*™†Neƒ)j‚o%Š_E–¡>¯™ýàôm³40ƹeýV”Û»ÓÕôöWR3Q{î÷Çzðêñ?ØÔ¼ÂÃ=Fõ¿Ð†t«–¹9¯»äêêXŒh£`Ó:2€ûk¥ŠL™ þ?U»(Ôÿ§²ó_àa_7ÿÿ7ø”€èHÀÃ~ÓCò)3Ñ2€‡4Àï{¦ \¢€£¡ý‹ªÃ2 E ‚/Й“°J/Ãrpï3'O*XÈdˆÞ,§ñ€h\®ÿnàôÏÃÿ ÿ@(@(ÄàCÊÍ¿œþyø?ö]À]®P~“ü+ìŸùýÚî pàr߬ïMÀÕÿY@Èž°ð²'d¾ÈÃøÛÒ- `ß”ÿõƒù>W+\@L·Ü%àÇ} €yòcƒ?ˆ?s7€‡¥ Z«åýïä$ù[º’'Äp£¥ÛK( ( Î’ü“Vx°{P_m ˆ°•¨C$íØì–,O‹¬– ¤J„•ʰüò€û-=nñQøÎ’Wô½ŸY¬€ý;½ Hè8e”ÿõÔ9I¸žSõ-¹wrãËïWÙ*ó€Ñsl¨¨F-…rŽ»xdºÞˈ÷£’J=8>€„¯IùYÀÔ¯:¹†º¸¿¨‡j% 娂q!ÐK%Û‡7®ÐúŠ«cói@$o?F4k¿ûr×ׯEëŒyTœµš¹.Ž/Þ¥…ÐJzGÔê·–ÔŒ˜í<#\Õ–nÇ>• u؆ÃO?µÝôÄõe±À¬øK§•t/á"j¤käÊAÞsñÞÅ^y¶”ÿùO€6P˜:CÇó×ÞŸ±É"ýÊçx¸þ¹­?¿Îþç5`º>À~NÑ^³‡Kê/Ó™¤ìœŠ.©H‹%Œ^‚et[”PeÂ`Õ—¾m]m½«x„Xé Qëû‚|* Î"—)Gbø O K…øå«Mû¨È`RùýûQÊJüÓŸøò¤ÿxÛŒð (²Ì¢±mÇÏÏò¼B©ãˆYÀÿÃ!Zµq®9ÀeÛ7oÚbžÿ®`[AÑ þÒW0PÛH2áˆÆ<ß•€ã¶ò[8 q±èþåü.nk~eÛµ× €(€—[ޯߢ“À6ü_ZÍ&*Ï5 í¹°³À¿kkBÿ±†‰—&Ê Ev*_1=ÓŒ>€y~ðª ;ÕÞ™nÆy40]æWš €ð¿«ù6.k%Þ„k€_.¿>Éú4Ð6xd{ŽâÊ£þ#Où~i›•ÂÿhT’ÎÇh_»>y‚ÐôŠšO.‹*ý³žG<Ë{‹oiö_k¤Ó¿ßyç_ØÌ €ÄÐGêJe>†@.7‚$‡»e柑( Vå.Vh{þë,LÒ>Jvÿe÷*¼#·WS¬@Ö®Þ>áwÊŠOöZKféµ2¦ÿ{ûò!]WÃ¼ß Œ¶•!¸Pª´³Ú\)Ÿy=µÊ"  ­5^Ú—?°aÐ_îÿ,üŸ«þK@>.q(è/÷þÏUÿ¥ 3=œ–îÿ è/= p  /¤Ÿa~…€‹—ìÀ``›¬â„ÿÑ ÀÀÌIK‡ 8qÛþúBûÒ PØ¿IK?-`ðz€@¹þîË ÀoQü¿»ñÙÆg|ÿíðþrýÜ·X(þÏ-Ÿ[æû°7@@¿\ÿ÷-Šÿ½3sgæ¤àQ |»v? àüÉ é×|{ :_ø<¤›Ò?ü‚íh𻢧•é²)€[CÃýå¥eÝ þ ¸Þ<ç‰ÃGä ØD <(Üÿ©ràö©†Â—o(9ÔÀ¨’ÐÔâ›Òq}oG> Ãw‰àÃ2Êa}y­ÎK ò- €x ¡Ó4²÷¬_÷УÓ*,p±F¨-ÀÿbU«.ÿ €×iÑïÛPñ³OðÀ9ŸÐÙÕ>»Å®Žbÿ"³ôùTLwÿ§%WDÚ9`„þí8 À’íyù|m¹–Õ—ÞÝ.ênü~›Pÿñ¹ €@º¦@xO¡öu…cÛ +ÐŽ"ùoÖ¡ÿsÉþ·³Ïõ‹Àσ°Ó†%• XÇÙç’ýsñ_¼|Ô{¤ó æÃ«;’mý¿ÎI¦Ù•]ß¾²}½xÿŸ þîdŸ¿Â/öÿŸ£úï›x€Øþ€ü9>V¶“‹(ßOuzâ-$ü[Gó«ô½SÔÿÛßo9´ØXÐt?¾—á  e^*†ƒüN$[làiP÷³Sbcë‰O¯´¤÷5ßkqd\ÿñ÷¯ÆÃûëó‹4ìsÓÖ& ÞZîSíõõ&\¨PÕ®,Hryx`=µŸ]vÞîò…°/Eïs$Z»¾> T2/«Rå Úúgýüú³¤PË-VG¼„ï‡f}ÆgH­å&Eo69UkÉŠ(ÿ{iôO/.!ÒW@ ]¿M¤&¿…åØÝ½âa SöE7¬½þÚíËÔòæmµ–¤VvÓæ?º€µöUŒóåó…"'6z=fmNÊïÊÿ{øô?½Ð-±’G4Š/š$€ ù'‰¿9´°€˜ð‰qÀ ¹TÈ?IüÍ  …Ä€OŒæÍÞßeþAú¯h@?84A¿©ü! Ä ˜€ûópBLœ¤ÿ0lF€ò1ðAê¸bŽJúà$€ìý×åðO.ÿ$õ¿{ã·7~»â1>P@BÿÉáŸ\þIê/—€Ã9 pNa ý'‡rùçQäÿßcœ1ÀµöMÁßÔûM>Ï%ð¡ê˸~²(ÓQç· ãÐ|’nÇeX@ö¸[ ýý4î|XŠ&ý7&¡š?q,àúÍò}ÑrpÝA |ñp€dEYŒîqu_Ž÷å8ë³>꣼ŽÕÙ¯8¥µ¹+¹£§4Š0þñÒ}ñÎ’“k“—Þö| ?ñrµê‹2ïßë úì•ú-2hÔë î¬ÿÊåÖ>âõ¡‡ïeë{-­§hùµ.ÐÂY¥ë¯ä5O{¢m4Ú¹–Sï`v‚=o©•ö‹7ÞZ¿¡ŽöÓjer€d¯ÞUÃÉñ8º‡B ø»àP@ûIÑÚ²./íYD(п»ì^êhØ÷~LY¾W£íFõË“"ö÷—•¼Âøðiƒ¬=k"l¯`&Ê–¢N²O‚ô?1ðÇìx¾ÆõAúïñ"”sü`ŒB¶yÅwìyê÷ÒÿÄ`th6Ïjÿom~Iãˆéïמ=nʹ>Àà€w¿%ø_¼OY÷•R#mõöSÀßDØŠ‹k!½WÚdšÙÖúÒÿÄ`\þ^–âèèÞZAý¤òáêíƒò¹þaÐvä—»eŸ¯'wϱÂ[úg7ÿi7j-Bò¸õ¶QiÈÉÅI‡O:å~) øÿS¥Ò**1º{ÅnZ^rjt¡úí+càˆÊH›¢ÚÒúSÀ/Ô¾¼Â*Ï0b7©usM€g¿m¬ ‡ÈÏï‡ìñ»²Á'NõWØáwxn®×››ïÍ÷zìñ;wŽOœêϱÃoïÌì)\èkcßÙ3öyj–~EHÞÑkñ"DŸÂÿ8É&3OŸÀWˆPiH e÷I,¢î€_3ò‡üAŸ+Ãu+öÆðO¡´s*ù|ï%ÿœë½dÅ>×›ç)”F…ó§üsöÔ”›}=i¼Iì…¿õ3~>Û«©õÁ4è^%= ˆa”W™}ÈG1ü°APËßµþ¿ˆ*Âd&µ¿¿4Ð Àù¿‘*Øa¼è&#Ljgß´îpP{‰ÀîÚ¨¬@+`î)Õ`Û÷‰³fä)&ÞÆ$5*mŸw™EzÃ8cï3ß0T,¾gÕ<%ÞbÜÅãÒ÷_Ôgu¦5Ë\ÕW_[…“9¡RŽ/Ý~𝝠ý†qµñ«¡\ßè'[qqgŒKw”šÖo:÷”x)62_%ç|Ùúµ =wßêÕ«µüÿÄ\ya]ù§¯0}ÀZÍZyç^!EÃ=’f­²ò2ö÷ñïã_ ƒÊë,ßt¼{m4¬~ õÆ¿bUSÄÊk ,žl_×{=¦·x¢ëÇ4ðêüÞP݈£µgµ¼ßâ WÞ݈ÁßõÒôl_£h_&·ýµ»øV/ç ŒrIÇ®µ´oB““ò?Aûú£Gw…ÕäNøTyõÔñc_õ¹’¡¼Ìȇl~|ñA$½O­Ó§#FuÈêî'#žpìí÷[;í~dÿÒöÕ*‚èn¾¡É¶Ì(û}¦/uPy(ÙøÇm7ôÿP¹'º5þ‰ `3V`^ 9p✠H¶€ÿ¥`bÕ¦ö£€“÷›Øÿ¤™hß•œh_ÞÌ@*†ÿCXYUÚä_ô0ÃáêŽ"”6ùGÁõ0z•¿m‹’Tn*âÿRuž^l¬‚A‰òñãW߈` G<ò_ðG`g òG퀣0) ñÔ yÑA |Áø?šÓÏÁ‘ƒøÏSîíª{K´î¦ë¥¶}ÓÉvµl,³« mU/ßÜhÝ;Â3à\º?5ÀØÎ¿yhsx-µ\ŒLøÁ[¿Æ’Ñ3ŠùÇ·VÍÿ?zúÓhk£ê÷)ä?òý=ëú} åÿwÌM‚³gÎÎ.œ}éì¦8{öìàœìõÏœÉó3SgôG(Ê|ê%}ɦΜá¿"®iU9™#UÉ'±3ÅÏ»¾d9K-þ?ëüq‘W¼Ð/ˆ”½iߣ©/úºIÅ:–0Ø}…a,ðÏlJ¾öè¤Èp„R+R¶3gõ,Ø}ÖùgÙåËöúý³ñU½vÜ?_=v›6¾*¤£oI#«|ŽmIzå«bghKÒk_¿\ó÷üãÒÇ=߸ôË—m|¾ÆÿË—müç`ÿOœ°ñÿDÿOœ°ñŸƒaü?~ÜÆÿãaü?~ÜÆ6Ææ+Lÿo¶Ì/ö&Âür½e~±7¡ü¹ÛÕúüÒ>›ßÆ=ÿ¸ôJþ-Ï7:½9³—!¡9©Ç°žÒœÓ†–Ä µoø?~ØØãï†?wNBíyÿÇ{ü!ïÖñ3g$Ô>åÿøac?äÝ:¾±qz…ßÓü?MпÓëú®?íŸFKþÜÄ¿üŸ8×›xIßõ§ý‰Þì™3‡fù=ÄÿCgNMšÒwýiÿЩ‰Ã®øõ§_\uÞ°S+¸pΣŽ÷ýÞ)ýéwLn“s³ü;…þ©‰ÙS“úÓï„8}šàßää)¬ý7¨>ã÷3,ÿ?à+ûQU­o¬l¬HÎâÛ:_ÙçÈ Ûpe~e&cžÎâe걯’±õ曋ë[ƒÍÏ6·>ûLt¦ül-nm¬Ódû+C>7Vú‹ 3å¿°²¾Ø_\jÁ5ßãse~¡¿²Â·©LùOÍ+i¾7Õ,¿å?¢ü–ÿˆò[þEùy17Œ¾‡;†°çÇŒy1þÅ÷pÇöô'ŒÆ¶èÓ÷pÇöô}r’úÙÚ¤~v¨ŽÕÏûÛƒ­mlmª~6µ0ÝÞì/no«~6·7·6±)]Ü\Tý#fª¿µ¸ÐßÚRý,¶7§5ó-2F5êßÞïˆú·÷;¢þíýõAµ±3õÙÆ¥KŸ}&eËÿ¿/n¬_D?ee3µ±ròÄÆö*|%ÿüÎ̬ g §æ{0S+ó“ÇWV0J9nùçwš”ég]þgÝþ¿ î/.û?lrQðOíXÐðÏp‡ùBç®Ïº†ž£Cö¯6Œ²Kü<M-Ø?×Ô¾›Ò»‚?6;}ÛrL×?Íôlëßþíßv!¸=ÿqé”±Õò1^h$ kŸþÍøKþñûJWÚë×¼mÑÓÚ>,tØ~Òíy;ޟ׿AIÅ{Rȧ–ú—Þùþö÷ü_¼þöõü_¢þŠ‚¢håT[1 ÂL[œÚŠ¡X ¸ÿ€Š‹IeÜ+‹>µy´v°ã!}ýô%: qÜGë?E›2Ÿ\ú CFo4€\µþ#²^‘½•ùûýŸFz¶Å¸úW[þãÒÓþU^?²Q?ûI·þÕ^¿ûé?ãÚu˜®÷W©ß¢uÔÿHßÏówö¯ñõ÷4êgDýÿ7ç6û›ú8·ùÒÂæÂ¹ÁÄÀKÀÿ¾€?,À™©~dhÚg¦rˆÁÿ)X€I `è“y&àYç¿eHÛ࿆Ͼ}ò•ïL—›t.Ìc·aÔ?§˜ÑèÊÏOÑOž_0±¡ÿÆ"Àzq¾ð¬óï÷¸éüÕ×ËÅüÎïP}=QÌïéüÕ×ãa~'²ÁÍdþ1ü³X?sö¯'ëÃÿ׋õƒ0çÂÕdý`øŸZ?Œ[ŸŒOýüãêgÜóKãRÿõ•^y¹ÿ…ø“ñ__em]ŒÿBüÉø¯¯´œãµñá¦O7x6¿hϸ€0¿\·ùåúïÂæíæ—«6¿\Íy6¿hϸ€qó׸ôqÏ?.=äßù|£Óë@–mT¦ø:À|S™âë@–ÍW€!nú/wå»+7¾{Yûß]^^Ù¸{™#++8éëá¦æÒÜ¥¹ùK3Ú¿4×›™;7?ѹ9œôÂMÿôÌìÌì©™ií³3 :ŸæÈì,6úÃË—ÉæôÝÓ/ãôÿôÊŒ8< %0sñâ•Óçz`Â^ob~âø Nÿ'æz8«éM@ €çç&Èjšl:ôÜ4NÿÍžzî¹çN‚8ÌÿÙC½áå^6á2Öø½ûù2|€öçùœíQØ„âS¡84 }lñAûÓÜdbúÔÄ©‰ öa¦á´?ÉçÄ&¯BüŸ­ûÎg¢>ØøS!6>ù`“…€ý%°¾²>bã“¶•žïˆ€¡‚Fù€ÿEþâ–Þ/»‹Ÿ}°¸øÁZú@€: øx/æý²ÛßXï÷××û F0f¯ÌOMÍCèý²»°2œšòW/¿å?¢ü–ÿˆò[þIùë€òOÕ å_kÊ¿$ Àù ü-ÿâ€vwˆ*³Í´Fýóÿ›ýþ&$€vûÛ[}¿Õ0ð¿ô'ÊZ»Ì[SS›üÕë°ÈûQÿÔ´^EgýçS¼ß¤þ€¸¸±!Ëò§‚>ûàâ¥>¸tÉâTl¬œ˜YY‘e ùSAë3'××Oœ0€8+óǧç祖BþTÐÊpzr8œž~ÖåÖíÿ)4zÿØtlÿ3arCóJ0—À´¡öõO˜ŸOEšÕùñUŽ¿)¢¹Œƒ• º&€läÑ”®9EP*0 O-=Ûý·ÃNgþãÒ)°V>º«k/éŸöí«ú°Üsò~Òµ@wV¢^¿\ú=°åÿûI×< ú–÷7¢~%±õ~Æ¥‹]ØÏóñúÛ×ó‰ú |™Ëyv÷a óþËvö½¤œUú™³5À×OBúŒŠ®` €ÄŠ¢|}&¤ÏW×0@ðBt€¯Ï„ôùêÆ85‡ËpËßÈzÿòüŸbz¶»·—ô¯FþãÒký˯Ý~ö™ûWKýî§ÿŒk?EÿjÉÿ)Öom||ŠõÓÙÿϺ“¨°yð¿ ì_À=ƒÿÙß ãGÒßׯùñŸBìϤÁ‡öû@~°¿„þS“Æ¿åˆý¡øÐþTþ¬ó_@öoq¬‡ø6$ú_æ ZųM‹_›Ê7Ÿ_x~j äù9¡h) HcA³â×è²Fß§b`VŠF<ãü)Çåì2·¾ç÷Ë6¿_.ç÷Ù àDœßOØüN˜Ë8¿ÏŽóÇãü~Üæ÷ãåü.°__?ÜLÖûõõÃõdý °__?\MÖãÖ'ãÒÇ=ÿ¸ôqÏ72ñ÷2•=X€ÿú²PŒÿ'¨ìþ”ôlü×®—ãÿq*{!—€ÿú‚ÃõÊø_Ì/01q~1ü_Ÿ_`bâübø¿>¿ÀÄÄùÅð˜_FÌ_ãæ·qÏ?>=?›ÏW½#½F¯†ÙÂs%P#HíeSÏ•@^ÊòçJ`ô2ý_þ.Ÿwõ pyC¬ÀåõáèdúŸ¹Äç¼>áfΉ˜y©7 ú™ƒþ§gâ'|Àô±ÓS§6ž“T¸wzefà4ˆ€™ç._¼xúô¹Ãþã³sˆ€gf&ÐøCœ›> p €?DÀ™Ã_›~î¹C‡z+ð =htøD‹¡Ç' Ü2`v>áÜ,´º|¢Å0Ë' Ü2`báÌ´È_Ÿb&ø`hÿÿ÷?ÛߊÐWÓ@è϶Žà?Å@·<7@_M¡¿VÚþµè^™×r@_M`^ùk,ío.’¿Þïà¹lƒo‹l ,c4××ý{¿¼ÿ¾õ×W,`ËÔ‘?ù‡÷‹ÀÂÔp>·üÓò+ÿuåß^~˨ü;ʯü{ÏeEù£ä?èXù/>çZ…¡BXþ3Ϲ€ü0ºÔ¿Ð°òO?µ¦§w¶€ýªbû,îÿoéÛß··P@`õ³µ5èoo‚ÿ7õ ¥mJ€aKõÃñ©­EðÿâTNÈ!ΚÚ\Ì©òJýƒÿ7”WýKÍBùwÕ?ø^ùWêßÎÀè›>KAÁÿ3gÐi>3  oú´µƒP¹Ö(ZI$÷ t€-µ*GÕÓ!?ArŸ@@§’ª§C~FÉ}`€åßÕ¿,ÿ§—Nÿÿ'ý«–ÿ¸ôFÿ²ëÇ´Ÿý¥§ý«V¿O¿UßßÓ«ßFÿzzõÓÝÿžuÿäË@FçØÛü)ÆHíù„À< _¿¶×—þ?Z|B`È—€°‡F€þKûB€oÏ:Ö=&ò‡¦5a½LèÂç„ÿùŠB@޼_`?ÿ³ã¬ÝIV9|Ê7u "ê®nÁf°¦Òðð¬ó§<Àô‹ °ù]€X~¾`!ô‹ °ù]Ÿa~î½m~PÌïý›Z?À”ë})ó¿®õÿrý!¬®jýp5]?@”ë‡1ë[PŒX¿Œ{þñ食 ˆQÏÏø{yQB€Ë6þ#û‡€Æÿ ý!н`ôGö¯ˆkNhü?Þ—ÐÝ FdÿÐÁ(çþÓù¥0Lˆó ÿéüRfÄù…ÿt~) 3ÆÍ_ãÓG?ÿ¸ú‰ùw=ߘô@8Ê8·ó{ɺdVéÅ‘pÊÒ‹ÃÀýËÂýÀ}8€aøŒ_o÷ÏÍ÷÷ázá3~?33s½Á}>¥ ÏøõÔ†L°€¿hðÇ sø;!€€L0€¿³‡$û”¾<ÀO¬õ/ßp€ù Ìð‘ýKûæz=>±ËŸ™w€SçfõO›öÿô$z§øDÿmÓ ˜<31Ô·ÅÏ>ËN~/‹ßdØçG@nc#?s)ßdØçG@Ûɬü›ÌæW6ùŒÉèÙÀ߯”,ÿ0ßÖ×ÊÀ߯”,ÿþÂpžU^Aùç§&”.eË¿Zþ$Ñò'ù›YC½üIþ¡ü ÀËßMxù» /a€B¿0¼ôýY&ò·#ØoÊÛ;ðÚZ!¡@Xþ¶ýúÖI°¹Ý_ÀL@õ#{¢œ?ô Ð’2€È¾õOþ<Ð:’ª·Ô?ùCð@ëH+£¥þÉ‚‡¶HþEý_曑Äy_òüaDXýŸ<¹NW€ Y!ïž?|€h«ÿÉÉ!¨Ÿmž¼§=ÑõöóLÊŸ´Êîå÷ÞÐh?”ÝË。Ñ~(»—?mÿ_š0HúŒ7”Îeé6°ÛÀ_ØžRºrÛÕGGþãÒCø£zù:¼Øae¹ŸôÀN©U¶×I×MÀÇ¥›AʤwyJõÛñþöóü]çì£þžNýtÖŸ­Sÿm;wÎy}–€ÁÛ„òÅè³$ þÛ69é<€># @j¢xÛqØïf`"Cþ¶ié-’ÌLLä/Q¿!ÛDœ™ €Œ ºú—òzéÍþSÍ\z³™ ÄÈö³ÏôzÿJë÷Ùô¯âý=½úmö¯§V?ýOVXOcüéì_†õQúGØÀK››/é€5ãÍs› ê*fúïV&û— mèäô(7ýw+“ý› 6Pt6Ù™ÿ‡còŽÉA ò,ÞAÎoÂ~À?ÿƒ­s†ûQŽÏm-ôïôŸ_ÿ?Ϭ#º©Å“f7uHÖˆLΊ$Sn"úì¤1ãù!>¦žuþª¨è ºÐ!Û¢€è€w D'Ñ )î ˆöÿ¥/€Ô#QçÂlTúˆGÿ¸ô¬ú4Í4ÓË#ȯþŒÿ¦Ç ß9(wŒÿÆSˆã?Ž8(wŒÿÆSˆã?Ž8(w&Hß¿:¿ 7€0¿HÜ_™_Ð0€0¿HÜ_™_Ð0€çüµô‘Ï?®~Æ=ߘô@DÓ>ˆ¨cFb ÐðóˆÄ/‰ @@úòIgá$ýCDþ(ØŽýj?|"éï!òG ÀvìWûákI¿à>J¶c¿Ú_OmœFà*ÿü‘ü?wqæòå"øß;}n€yTþ ø#ù?||ÂA„ÿg'ÎB@*ÿü‘üí¹Ã"ø?qh8¤èÏçÊ õç>¸Ð'ÞøN!éúó97¤þÜ7úÄ©à$’~ ?Ÿ.õ—6€Žà lÿ…v€kŸeß;ù½“™t„ä .¶ÿB;r_:séŒb’K$¸˜À™ð #€ìÄä‰IÞžc ¹˜ÿlkñ³Ï¤PŒº?÷*Þ¯å?@`±¿ÊÏ2Ôý¹Wñ~-ÿ4û¯Èµ êþÜË Þ¯å?% +?ù«´µüËò“¿J[Ë¿,¿,ɲ–?GÌ ãE|/Úÿ‹Eù]þ/&ëg,Æ#bûtù¿4ÌþŸ±ewÄòGôýwvkî»óø¾•mmooã`G.ÐXìoƒò¶¶òÍErÉ!ð€!.Ð@î¿Å¬Ep ÙWHpë6Ë"¦Ððú|ðA‘ù~Ëú_ îtÌ¿|¿eý™ºÈ¿|¿ª3ý—ºÌ]€Ø~D œ<‰é¿ÔýcþèÄö#Z`rÓ©ûÇüшíZà™—¿hÿ±ü¦ ÓÒþcùM¦¥ýÇò›.LÑþ¿4<È eáò`è.#ÓQð¬ùMÀÕý¸P掦Àw[⸥² ¤:‡õ’duÎrIºõ†ÿÍ🀢fœþ4Ó3Å»Õÿ¸ôˆPÒòÅ ÈËŽ"hòÈô ˆ®AàNt¶×ï“/gZ®0ðÌj,ÀӬ߶÷÷Tê§»žNýŒ¨d'@þ¾…€ÐGJD€oÈ€¯”N±-‡€ÐG ÈßÍþõöí›}µŽãfÿúûö;ºÂ°)}ê#ìÛ7ûJ‡Õ¿t£§—Þì?ÕüÇ¥7û—4Ø`5K+7æ|;²ÏôÖþåõû4¶ýëiÖo³=­úS¿O£Ž:òì£ýâ?¢ÿÍÜÔL%ôoÿû28#×ýÌÔL%@¦ ÔojÿüB€ýM%@úß•ÿ‡KK#óg(™?Þ­,‰ù­ßÊ›’d)r×"@t+‡$æ?”zkH3¦ì?Oš‹÷ûÏsH½”ôÃ’ý›þDÈŽCÍü—,ÿ¥Îüç-ÿùÎüOYþôË_ó-VÿÌ´Øk~Ç€ù š¤ õ  v¬&å‰ 6i~—@†½¿†)45¿cÀÆ!Íïǹyðõƒ ç¨õƒ ç¨õƒy¨®bþõæååë‰àÖ&='M×ó7®¿ìÏëgTºžï‹Þ_³HPú¿,­‹´ìþc—Ae¥ÿ2»àe¨~ÅØ?ÿAéÿ¸Ì.xöÅØ?åÏüâÎñjó nâüâÎÿjó nâüâÎÿjó nbþÝó׸ùmÜóï#}äóy~›(½,ÿ5˜Wz9ß[$dùO—`)|©˜Fß" ˰LîñÜèQðïªßýîÝ!p?¢DÁ¿«\º4h}:¢DÁ¿«@à°ÍÿÆP6ÿ§Oß5àO€! Ç‘ ÎÿäP6ÿwâ`Ïgú'lŽó?9”Íÿ¡C§ øãà |ŸïýôFïî©?Eߨû)>8À¸qê§| ø/ÍÏÎOο„¾oö%|p¤w 7€/ñÑ›œ˜BõÿЩ)‰þ'¦ð #“ÜuŠSøˆ–ÿë`¸ï¼|2l–ùtÃi†»tæÄ™\°YäÐ ÿÍòŸBÌL › Kk5Ý›—Æ9¼_‰¨%¡÷÷«üQÒÚ”Æ9¨Îk­- ½¿_å/ QsŽÖ9ªó2…•„Þ߯òG· öÀÊOÎëÔóOÊOþÃõzþIùɹG±ªù«ü‘å¿Â0Æò× €a¦ "¼üu`>“¯\^þHHãŸ?lÕvþSO(qf4€êGÿ÷oæHÿÿÑ7Ýf7‡0Š{qÃS˜R½®·½°%çÕ\éõcõ¿¾‘ä/A·hž¤þ‡+Iþt‹æIê¿7Ÿä/A·hÏ'—’üåÐóG²²rò$Iþ3XxþâHæç''ùKòŸÆÀóW´Êg_þÐþ‹ú‘ä寴ÿ¢~D$yù+í¿¨I^~µŸ§AH.2¢ö_ß% 7<î 2¢ö?X˜€)ó¹HÃðˆ>´‘e€-zÌBO €;?·U½,¢e^nwxjéÙîÖ¿-lítå?.½³|¨^˜°ßü‘òÇîÊ#ÁEÑ ¦'‹„ZºàRŒÌ´ (vvŸŽ¤*·¹Ùø}–ÇÔÑbz™}Û1[ UY94ßL£ê\ú>ÞÏøç§þ\ø·–ús¼ëí«¬ß±Ï?®~’ô˜š§ÂÿÈý ÿ³‰ 0[€Pñšÿgû¿Äü&à—-@X dhþKyÖ“Q°?÷À¢!.AÔ,ô[C+öâD €ƒ~sÚPìÅž%ÀA?™ öF½_ù´ÒÕöjý+Í\z[ÿ²Š ýܯô/ŽxM•é•þUIïì_iÿy&ýë)ÖïØúé~~ê¯Þ¿õWë_1ý úOqÿŽñ©­½„Úÿ&þÿÝl+½~îà@F ýЯQPèÿ¬²`jÿnà–óÚ9c¶SSíùþ•¿&ÏQùËÁµçok )йø·MV•2 lmÚÅ-Ó7ë–üȬBާä|S“ &P%ÅMaÌ+ º•ü?\"ÿ¥¥»òΓ?³HWþ½SH}ñÏòï›áPþ˲gŸßI3†C ü€ìÙÜüˆ0Ë@ù/Ù³Ïï(¦›¾gBœ£ÖBœ£ÖBœ­ëºFe}aƒZ1ÿš•[mKÒíù×K o €×Oãú2Ýžï‹ÞŸñˬ-ÈúwЯý0þ£|`îÔ@¨ýÚã?¢?s·`~ÿŒÐWé^x} úó‰Ä<1¦ó‹½ )"øDbžÓùÅÞÄõb"qî%™_ìMHcÜü56}Ìó«ŸqÏ7:=–@$€–Ï)áÉâì  ÷XVgJó»Õ>€ÿÙJ°œ‚WV¾‹›¾»þý—¿{U€•ïòßr¸27w 7}à<éÿÏ\šG`î_ñ ç€ØÒÏà¦OXЯßé3‘N€¾ÎÎnÜuçwE `eCßoœ^Y¸;<}nÞÿáé Û4ÎéûüÄܤÀ|Àÿ@$€Ù3Áà¬HS‡ÌÖ¤áò~>o˜'õé8òfIýçäZPò~>çͪ:ŽIý±pyá À4¤`¢NáýÏŸÀÿßë„0Wú&êÞßÀüß hu…S0Wú&êÞGh6ï´¡ (³\é£pŽºú@$@x¿ÿb¥-Î1ý7Ï"ÂûuÁÛ J[(œ/H·ÀßïBx¿þþçQ‰ åµÀ4Ô~>ìËΠ(¿\ÿÉ;@ÈÝV÷Iùýù‘€Úëù«üÁÖ_®ÿüÏòG€MiîëÆû³ö‰*›ÒÜ×ÿq¹þó?ËU6¥¡ðàò›n4LÀv¶¹³“a —˜ý#ìßÌ·Â:s#€f Ç6@zþ‹8ªEÜŸ¹“1!–­M\¥/fØXýXýo$ùöçÿARÿ+IþëžÿzRÿÌiEþ+¼'å?ôú—é[þÍ`]Þÿ™Ëò‡ügÌ`(ïÿ‚Ìü§ÍàÙ—ßÛ³~ªí¿Yþjûo–ßÛÿ—'Ü‚Î%üH@`t}ޏ÷üW8ü±lîþÖg1àaŽ0Ý †ÚçH€´6à& |Lã îÊê^KªÆ Üš^ðöë·v!ÞZ¯—Ú`åzêGfÊ(yñ\uÞe–VSEzrqi6Ó# ¿E@ϯ0ÿ#`Ǽ~â~zƒ"½³Þ;+,€‰7ž¤~DtÖ_|ÿíõ3æù•³4g%< Zê/m_IýŽyþJý”åo«¿²ý–yªÉ›üÿ¡‹þ!¤`D€1¼áÿ3ï¹è" Ðìj…ÀR@øò¬‹þ!¤`D@ôX©˜gð¥è?-ý+6Š®þUMoö¯jz³ÿÁnGÿ nõÛì_•úké_IýŒyþ–þU­Ÿfÿ 飯—jý4ûWšÞÖ¿Ô…@ýHÿMàO @þn°ùÓsgYv˜Ë?á~sûgÀß­pp†˜Ë?á~Þ’û‹ 0+…hÍø¿4* ¿£òþ«½)DþÈOPýG+ÒF/–LÒ•ÓÆ&µÿE‰úÑå¿ ÁD±‘˜…;¦`¾&¼«šG'à˜€„´âÄÐͲ¯ÕòÿpiñÕÿ‡ä@=E¬ÉHþ‹F½ß"ú·ø§  OHÄÞo‘?&•ü‘àVò§t•ü!+*ù*ù›/CÏ¿ ¬ü"hŸ=ÿ `å@ûþ+ÿ `å@ùÿÊßbþáð§ ›Ùv!ð S€M ýqößßN¨ðÿ"ä´¼Þúì‡Ð? ÂÿýÃÈ£4-†úÿ,Éÿƒ˜RÿIþÂÿ–Rÿ+IþÂÿ–Qÿý›ùË, ´„þÍüqÛÏôtKþ8(Ûϳ-¿TH"³I#µú¯¶ÿ¢üƒ<ÔOµý7ëÇÛÿ—&º‡×§• ¾wáyÐôƒþºGH¯ß®ž.Øm4Œk^¯%øÖÖ®l„oËßÓ}«§+úAZ†"ƒÔ´úW±õ¨Ã’Xze‘@Šù5õkÐÀa5cñlCXwt,lé~˱¸€ö‘pBa¿õëðëoôóÇúië_û¨??¶ÿ ¸ü“}þgñ@ ÀÍÁºþ¸üCÕ_Êÿ Àð¦—r €®?(U|)ÿ[$w¨5š\dmù¸4:dè#óG†^äO73wlrÖG,€Ü(j.-"2Ï S¶~ÿ᳋pèé’TÜà¶#˓ʅq6?³pÌ8C2Wº\µTÉ_ Àðÿ‡6?üÐòÇ+r’¿€÷´6zo€ßj媒¿–&€ü¹Q4qOÌÞ+‡Öt‹ÿR9Afbö_9”vLÃdÔ‡‚Ö·ë:@@}(`}3ÌI@}(àÓØÚLüCµ¤žê·2 >âþ­Ï—œÒåûÏÇ2ÃãÍ  ñ_‡p`£}ŸJÇ# ÿ  V¦C¸ðñ_Ò~ù ]!4þs¨œ_¨í‘ó µ=r~¡¶[æ+i½’ùk|:Ä6y~ê§™%Ýï_¹~ÿ÷€Äÿ¶Úp^¹€üAÕNîÕÙ@¼:ËÕŒà÷ÍÜ«³çžO[îÙqü‡(Fˆ %à4À ü‡(Fˆ %à4À|ú›ï?£ô)JÀ¿* *ÿ2À€4bÀ?î6ÿ2@, €馎»Í¿¤ý¸@ xØp8\7ëþ/÷€þfýïÇ- `¯‡ò~þgfþfýïÇ-  ?ZÿOO”t\aeþïÚÿ'œdü7C7ÿwíÿãNˆü7C7ÿwíÿi'D þ›!€T¸?€æû¥ƒ)ÿþºœ4ß/HùOåC9(Þ/Ú߯ ­¤‰àåoæ_)KþÕò7ó·ò»ª¿ŒÿíS¾ï.ºª¿ŒÿíS¾ïf¤ê/ ßR~ó}'€íÅl«ïݻǃmn=Þb ¢~ä篿°µÝÏ·vò.K€|×àŠÏüüÞfkŠkÊëQÓ Eý,n†úïÈ¿¨ÿŽü‹úïÈ_õÀÏ.µåOÍ)ÿxû;Ñ–?5§üãíïx[þ²™‰íç–ßÚåoš¡þÓö£òû6(ê?m?V~ÛL¢kõoíçKêÏÜ’YxàAaѾ»]ªd>çÅoʹƒØ0ÊéCmá ~G=RS9ÐóxÐdÒÃã¥ÿ*év½; ‹çTÒ-‚Ÿ©vÙžT€ZòW‹­~}•׫~ hY˜ýwû@—g«ú*Ó+OPI$'è1$†2ÿm#Šå?bž¤¸ob‹Ö'¨_Gþ4Ó«Uê§þþcú~žßꯚKý¥í«R¿û{þjþHë¯Ò~‹ô…Ì5þ…ü%ã7@:x0 ¾a÷íç@øo™kü ù«ÿ ¼h‰àªÂòEÓ ~5ôšc@\CYˆn6ýç~š4ÃbíŠ9@ Ïî§I}ÿ2 (úÏŸkÿRýtõ/’Ó›ý+¦‡ Úú—®ïî_žwûJÓÿú×~ž¿«Uë¯Ù¿Búþž¿­Uꯥ‘þSIüñû‡È_q]@»ðÜæKBüøý“ ÿ® ]  Äo:5â$”—NÊùú:9ÕÌõÿ‘ù3ÌU×$Á|4 ‘ûc™/“I“{lîÈîŽ `¤Ü[—Uzíý~ õHKkc(aZíý® {¬¬k\^éáü$¾ß‰ð~‡´þü°(#S(ÊßÌ5€´üüMžYõüeõòË %êùË @õ³³‰bôæî½{««ÆåÎðØ_Ø^Ì5Ã…ô@Yºì€ ù– H³¸>Pfk)¨þ»òõß•¬ÿ®üç‡òØ‘¿EÄ3â‰akþÐ&+ëxF<¾ÒkÍߢ>ëò{û±ú±Î*Þë?iÿV~Ãÿ0þ9Fú—´+¿]ï2A'ÔþŸ ×ņ*´p }æ(7ßE%8z0Ë÷i$)©Q¤ú=˜e€W2®’ÑP Õ£…lxOoÙ*é•ëýäJ:pEüÛ¶'FH ßÌ_éqk\_#<ݬèMa½… ÚÊôÊ#8À éý¦—3Y=‹Ë°;tJ(ýú ô$½PŠÒ¤õÈî–ús[Àÿ¬R*õÓòþëõ£\­¡h«<¿=~5ÿfz¥}U®Ož¿ÈߥõSÍ¿™^m¿EúBfÍý³xþw @_Eˆ˜Êäϱú²ÿàæ ¿Ú¹A~Iõ`œÐWÑb,ˆ¸…fvÇ!†œØ®…Ä´ÐÌLB@†Pl×Ìp,43‚p€! ØîWÛ¿öÆô/¥?Yÿ2•ˆŽþåѧcz³ÅôAzBì_º~Áfù ˜’ô§þU}þjÿªÔOKÿªÖ_:~{ÿ éÝýËë¿$ÓÊñ!Kë¯2?éØÿ/¼üG€thÎDàÍð¿Ôûédæÿ_ø?gϬtü¯u6Ìüÿ ÿ#zÐP4šù¡Gæ }dþ@è$JiˆU}©B‚è8ÐG@ßÙŸz*n+êtðÜÏ¡ÐÔÖæŒÌ#`×ü‚1€yìš_00€6¿X°-©R®ˆƒ!ÿ"=­¾¶ô"È ­?yþÖëÛÒÓë“çk½>I€·!üPf᥀/[¤òã"qMfZ6–l³1 ô‹àíß8‚êëàíß8‚êë|ðöo€;èß¿âÐÿmÌ<'¯=ÿ‡‹ @€àüïÜôayý›õðø°¨DÎÿÎþš¼þMxø?Š @€!Îþ°×ôÿ-Ù?þÿp(CÄü§z 8+ß/õÐ@öÿ?Ê@¾R `zB¾ÿð=rF:@ÊÀýým €ï €Ç4Óè>s+AàÒq¢x,@s °¾áþþpŸoÀ‰i¢x,@s 0\‘_VÙ¸’Jù~Ÿñ~?ûÀœ·¬¯Gãòý.lð~7Ö€yj8”G“ð~'<Ž^¾Âû]â„ÎË ƒJþ(u+ÿ¢üòë–¶Ü(ÿ¢üüKnCœAÏÅ}ýËÿ5\ Ð}ýËÿ5l„z (ù¿4Ìè?É¡S ¨úÁæsg÷ñîãÇ7oÞ¢#l=~lhrsgÛê¼Â(5+q4äp  úAç_P[¿ÛÓNVA«ÿ®ücýwåë¿+ꟻò¿øÙObçÎ|kùg6ÖgA ÛÊ?½2AòLËoí§¨Ü'$õ_´ÿ\†ªÿE‚ —õ_´ÿ¢üÃ4ÔXÿjÿ_šÑ{%vÔò¦péãß è›£Gñ-\†ïôµ¦‘³`E5Š.Ã÷‚Ђä˕뭭·’û;ÐAø•×·G-”ÿÎvJø°´yMˆéiÞÕôAz‚]¯ÒÊ…@'àùw”4=(©“®ý®/ ¯†H%†®$Í÷ïéÕç/J³~ªù·Ô_Ú¾*õ× PêÏ_–?ÔiZ•ö›¤KÚ¯MÑÿž5Ù¿y@ &ñWô¿Ò€i8`Ì]ž›•¸ÄЊ…-£kKì¯k*&;1I-’äQbýh ÎBŸe™Ij¶YŧÙ~ıI-+DôY$þlû—*¤«YðÄ"½Ù¿búbÁLL¸~¤@‘^É>˜åøýÃõêaû ûWõù«ý«R?-ý«ZÍþÒGlµç¯÷¯´~ªóC Ø™Eü3ô?8ÇŒ":àì¦Ô_¤ @¢¿ üP¹è¢ÿѯ¤ "MUnèŸö ˆÎG_.‰1ÿ¥? ù?XjËŸUdÈÿ=| 5óGšòŸ?•æoêPÅÁý ð£ÁÎÿ¶4H"B05æùó€~"úIÃzê¿M-NMáN™IqÀ®º­AW3`ç¾°yt\…º‡ $ôùóƒ-ôÿ¥óΗùóS‹èÿK æß;UæÏcä òR#K9å_Ìïò>¯ù=x`ÇÜó»¼Ïk~Ø1·€Åü.ïóšßƒGvÌ-`ëúÁ€ñˆõÃõ¸žèX?\ë jÊóQß«¬/ø‚×¢"½ÖƒËt)<4¯7W6(‡ôÚõeú—¹1þû­Ðúã?;˜¿ã¿|ÿiüÇ ÿì°Ê/ÆùþÓø¯*· Vùmó‹áßó‹áÿó‹áÿ0¿ˆ³Ö8Á=EDó€Oæ¯"=­½¶ô4È ¥ûów__KO¯Ož¯õú$½ " R×%Q`€Â . Pñ7¶N>K wû' ù0FLrÿD¸ÝþKðN/¾® ø' vÿ.ò×'8½ø:‡àŸ(2p·ÿ²H¾Î ÕÿÓþvz@>¢ó¿ wˆF;³@>¢ó¿Cîv&<*ß]ùß\Ú' &°$ì߀påshŸ 0(UÃ’°?/ÀBÿ™+@û”ëÿ¸/íy÷+à‰ÌÛ㸥 ýoâ~E<ž`{·´ÿMܯ€°=¹ÑVÊ_säOÀ9{?<¼_³º”×>kµü 8géþ~ͪR~ûôþ-,­Âûÿ»dÃý<åW$À"ù4Q@R~ìò—OÜ  P”ßtžÕ~”¿|àn@Š p1É_boùL €È¨ü (Ÿ€)å¯À€ò È'–þ¸þßÜÜÝÝ„èß»ÇðÚð=õƒ#[@0¦ Ð…{÷˜ÏÌ€ ÔÄæ¢”¸0€˜B9”K ±”´šwÛ‘?ö¬þ»òÇA£ÕWþ¨êå¤ùÓ÷ÊòË àÉ“•ü5Gå—ÀÉÉJþ”º,¿¼ÖÊ_Ë¿QþZþò×ò÷ö“ÔO-oÿ^?Õ¿å4ä ÃÚOR?µü翼ÀtÜ~†ûè$ö ;;€–öûmÅõW-U°Äþ¾÷$6¦/оPš0üw|TÜ’u‡1 ùÕO¨^þ%}D€’–=Ú-WŸ§¢PMÒÚ^€œwèdtVhñx @I½"(½šÿÕ_iÏ_Órm€Jù+¤É(Ò0þæPVæÐ_ Àľn€+¾½aþLŠÈþµ«±S ÀY'¤Ÿêþ™]œb A7pÃÊý3‡/Zº€Ö„îÉ­ŠÃ-Ý ¬J¨†?Ûþ¥*qüÞì_f5Q¤WZŸµŸ˜Þ$Ø,Ù­.P ¡aS¦×wÐ0I®¯Œ_Yÿª>µUê§¥í³þFiØ”ÏßÖ¿Òúí¨?¿iûÃñ›çÿÍÁ9võùý“#Cüæù_¢z™T$æ7m8!~óÌ/Ñ¿E=žù-“œ·ä/@ù¿7lÏ_ €òŸïUò×ÊÎûÖ-m54礕/‹®[Ð’”„ž½…þ×òCS 'ÁKæ×BæÐuUjEÈýZv(?Fùeœ/WŠºüáR‘ÿÒƒ•¿)ùç‹üçß*S(òï*ò?5ßSþ¦àù¯¥bö¯£5÷ŠÙ¿Òu d·aöoÎè[ÿ†É¿{(lý&ÿ×-½°õo˜ü?ñQ['¯Ò_ûÜFz»/ƒòôît{þbü /NØŽLŠñ_€¾8`;2(ÆúâD€íÈ`q 5‹0¿ÜôùÅcÆùYœ_®{lY ç¹ûó &š¼<& Ï/lS^“× ÓœÌ_EzZ-é6…ûøõþüÝ×ÇtžûW®OžÏž¿ 0å¥HÒKÀf^‰ˆþ¯6¶JDð0Ð/€€ÿ@ä/%€ û7èÇ€r¸@@Yü ô—1q (‡€sˆÖeñeÿýqÚog!NmÜôßX±P€+ú3Õÿ@à‡ÿxûŸ³P€sú3Õþ‹À) ‡œµP€³ú3Õþ‹P€!vÿåþ]¾Ñ#î 9¼NÀŠÙú[@” ø73?KÜAs8N1 ÷[@” øÇ'¡Ì Ç'ˆ cÿÏä¦_°ÿD 00 TÆþÈú öƆ¡ÊØEnúû§MÀt C#%4´6>Û’Bly¿r0(}ä…»²±(…4‘õ~å`P~úD?ëÝù•¾ ìýNXœA)ègóSS±ü®°PÏ¿,¿+,Ôó/Ëï õüÍ£ƒyðÍóב‹*?D€ìü] @›ç¯#ò("@vþ® Íó·€*?DÀžü@ü›; þÇ[·˜­6È p0e‚C  ô@äòþg¡ÄÌÊ Öà>T·ê¿3ÿPÿù‡úïÌßëÿb’¿È™²üp`++3Iþ ¬S–ŸÎ«œNòwò.–Ÿ˜™µò×ò÷öÓ¿·Ÿîü½ýt—ßÛˆqÔOý{ù;x` í¿;ÿ•§` OñŠ©+ñ€…„‹Þ<À¯)ó¹Õ¿{(¼Øqq¨JÓ ©š|€õãLjhCºÿÿÂÀ—ˆ¢gc¿œà”Þp’®Óýúä”$] ´A¿zÞ˜`IŸÍ€Ïïhýûüî¡çù\_@ª€Në,ÞÛÖ€N×`ñß¶~°tZ??›ë‡X~N¨­/ÊùSÏ×¶óïeÒ[¯çùU?JoÙ¬~Âóußߟ¿ëþqüW,<Ì<#ÿàÆñ_±í‹Çbä¿qüW,@ûâ±ùï€åO@ƒ·a~!#ø?™_˜Î/Dcÿ;`ùÐàm˜_ˆÆþ÷ùEùjœ¨ðdþŠé•çoKàß4bÊçï¼>Ô¥]¢7y¾"=-@-]½Ãפв†ˆXëADµîÀ©Ù©ˆX¥ ÍQÀ&u«!¡¤ë9²aÐ_4Àw  ñÿ3ýóõÆðœAÑ— ñÿYÓýóu¾wÆcBÌ@â‹€ûŠ ôO8@Dò+h ùŽ’þŒÀ99ýý‘ü$ð¯Çwd÷ç`ˆ¤_Þÿù0{ ‹V‡‚þI`Cvÿû§´`!1ü· Ò8'»ÿÞü¤ö¡,$ €xÓ8#»²vm ˆ €Ùú#íÏNœüÞ÷NšÀ f°ñ™Ûú#íÏŸ¹téŒi`+në/ÙÓ“'NL0-À æW64ó~¸ áèÂûU u½_å/ÃfÒ¹ áE÷ÇŽ½_å/³JÒ¹ÍÁâx¿ˆÐh]ïWù«üžÿzkþ*¿ç?lÍ_å÷ü{mù@z ¼}êˆÊ Òà埘Uù#@z ¼üÓ³*?Žü‘ôoílBìn1šÝZ‚uÞÌP ¢ßžmrÙ·Áì0¡-(} @šÏjÙÄG€Íf)°É€A:ƒƒæ!9Ê]Ü¢þGäoõ?"«ÿùSÿ°"iù¥Q–ŸüOœ¨ä€NÊOþÌSiùÕgËò[û­üükåoäÀÈò£`õ¯hÔ#F•ÿK›h”›¾`§e@açFv²èóX€65Öÿ~ÌRtG’{0®¯òíC êË€‹Ì€6@a”äj®Kòž¤s}s†MÒ1HkO¿]_/‡]ßEHf©úéÀiz @±°ñúQ&£ ¿¿__eü˜¤Eýúhó m•úÑ›vG¯Ôâ’ô¶÷ïééó'ÙeR©ŸjþÍtãÝcûrHX©Ÿb÷âÇç+ž¿šKz¥ý&&ºxdëŸæŸâæSû z"¤¡ÌoöÒJ¶ò“‚ýR@€ùB}xj.›£Úæì7èðß…36 EÝC_…п¿½r9–lœ–^–î«ýK¶Ðþ|û—!È‚MïßÞt‘^슘ޢàÉ~ý I¯/ðÓë[ú—ÒŸqÿJŸ¿Þ¿*õÓÒ¿ªõ×ì_•úië_éó·õ¯JzKÿ"ÝÄÿçäüóœö¼$9ºÂºø_ÎÿýPØ_BKéœ1ÀïÎÿýPØŸ^ }ަùßy HÑ[ó¾ór„ç­ùßyW–ùËÔ_¥î•á#€Å—Îa Ç€8Í Ùæ4ÁŒú'ÑÀfÕôü„*Å‚jÈs­šòç§&&ÿh)"òæ"®ÿÉï…”¿?Fš¿EDVT¤÷”¿?Fš?n Èq"‹¾©Ü#äïó;a׌ÀNtj`5õsÁk~gyYÌïfw.õÍïòÀs±¼,æwùà¿Â²¦@±~ÀÙßÈõÎþº×q}ÂsÕÖåüén†›[œ?pó§zi»^_n»®7Àh÷ý=½ãþ>þǰwzÒ:`ü—ùÞ ôSÙ®k¡æ¢=š'ó¡3T¶+`è´Çø@“buËí%W²”È'ÉüBõ£`O(e2Å @¤œ) Õ€=”È'Åüâ3•n&"›Êù«H¯<ÿ¸t´³Âów^_¤‹ÎhTnñ|@––ôòùî7´/ïÿ&bõ(kF x8Ú—÷±†`Jòq´/ïð¦àQÖìm€òïF£(>@zæ `U(?ý{0@ñÒ ð(‘(¢ =€" €lÿÍ  E8#@ýÝÅ`xCQdûoN-ÀŽõ‡z³i|í¹`ó/Û´ˆhæàÔ¡áŸZÐ?>ý²ûÇ+²ÿaï§Ã+RøÉ‚þñ è—Ý¿9ÿŸëá`~N¡ÿÌî2o—Ý¿9ÿÇ4€#³‡&$ä—º?x–F~ò$ž!Ü àgrJÝ7€4ò3g ðàN7€ùŠO~–K»ÉI<B¸ÀÄþ‹›†–±Õ«½ßÅò‡ù´÷«å}õýö”¿ú†½_ÿÓûûûe(%ÊïlÂõü‹ò;›PÍ¿(¿³ r^XÉ_åwûCûBý•ö)rÀíÿ í õWÚ§´Üþ_ùË @5‹°ƒú£ÍM$ý›»˜ôgJþ}ט°|›¹ÆTÜXËä9é n€ÿÿíÅ-¦Swcjc˜Ý#ÁMw(^ŒÊ_õ?*Õÿ¨üUÿõü(EùÛò€‰åoË_Ëÿ&W1´ú·ò›À4X³~ªåÿò d³Ø“Þ·ùVw²ï6™°Çì5ɰÖ&µô˜ÒþOk%X|£Â€Ž6€$‘hB¯…;¦o¥Ät»¾> ¤×–ÿ©Àþó·ØuÀòÇÃp¡ ëÛðàƒê*Ò+Å«¤w”âún ¥çß©Âï¯À™U (ÅŠõ['ªõï/ÓþE¤·½?éó7JR?Õü[ê/m_ÕúÏŸä$IýÔÊÌÊú«¶ßâú… U}(@ÿú§°qpú§ƒlFœèiå¥9qú§ƒZˆÐo蟚ã€þé ‘Ïz³÷ûçÛ¿¬zPï_EÕµ˜ØTo6Ll*É_ÖÄ®¼µYùžqÿ*ë'J±l9^}`}ké_Õúkö¯˜ÞÙ¿Â –ÞÖ¿Òô¶þEºýw,ÀäŸã@$€…Àà¬ýg±û· gÉ`~)°Þ€˜B‰frê *6ôOd\ƒR€˜yLó7ßyžwäo¾ó$<ïÈß|ç©+%ùKÖ˜ÇÚß ™çN-Š7‘±[XœÅcâþÛæ@ÊýÁ ÙmJ>i‚|o6\„ÁaêŒç#@òÇökóC¹ÿð`©’?KEòÇös0”ûÿ÷ÞÓlXæ#@ògŽ$*€ÜÿGåŠÏïòhטßAÿFðjq÷ßœßqȯÍãÇÛæ÷ã·üoÚúA~èÛ××mþ~v¬®ÚúA~èë‡Pþ MÓ½ëé-ãl™èn¬O0‚àùýúöpE:Ï×v}‘¿Ò;î·Þ€ƒñxbkQfÄÁx<`TîÂÁ㥉B‡-Bj‚Ñw±b‚ñ”â.vNyæW€_see?*΢§§U»Þî3ÆDÈ TÿM'|%«‚üoªŽtYôßÝ€\"V‘°Æ XAQ ÷ Ôé~Ö#RþÇÿ\óÿò]Å0W€úäë >ˆøgFÿæ €¯òýwNŸ|Ãÿ\ó_Ÿÿ³s&|Åæß¿G8½‚ÚóE™à ÀÃàïQ&æÎIÀ}xÀü= À¡Ù3Òp_"V,èŸdÿ=¢ŠKÀcÈ?=ê½9 ú'Ùÿ,.ÿ¥à±Nñ9yq´Iú%ûŸ85iz `’OÔ ð@m#‰ÿlýZ3¡NžT(@\£ox @:#‰ß"|AþåJ" ”‰>’xB€qÑþgUF$B8°¥÷Âoy¿R@ÿLnÁxÿmïW èÖs§*ïw"¼_,ÐçWÌùÿÚò·ò+‡-íÇ*‡Iû)ò7@é[ó5pÑ€™ÖüE ÌØÀ0Ýš¿¨é-(xLô·ùƒØ•ÉÌm<.{n!)[HMáOñ4x¥cͦƽo{wŽž]70õê¸Ý“ÿgcò§þGæOýÔË/ˆR”ÿ³ò+½(ÿÆñFþz°¢ü´ŸÑù7Ë_Í¿YþjþŸýÿ©û{׺Îu݇ i5A„XÂ`L`!0F UjRYUdíâ`0n’*» ‹4@V¡n¶S¸ñ_pW1HfUßb Ô©ñpüsªæü>Ÿë~ž1Ç|uÖÎÎ:É4ÇË3ç£1ÇÏËuÝ÷}Ýo©_~C»þ(é ìJ]žŸùë3[ÿ¯&|~~û¥B¦üxü KûüêOÌÌeþe €XûV-ñ(nÉ•r*óðE€4ù9€2÷†Ùâ_ P.±C–-¾/Ë8ƒy`öÛ6[•æ*‘í¿´´ˆþy`¨Ãòiý‹×gV`¡ü”ÆGÕù/ÀZ ðÿöyh„7þîhŒ2Dð;Åtòþ¿‡ýÿãAþß;ûøcÇ~ÀŠs„fŸ`ÿÏtakr¯¦ÿ¹„”šÆ.Ùšè÷M¶ôÑô™3LÃ@˜Xû¦ÂâÆkz áÇìŒÏh›laœÞ¦?pûòú¬h_e¡îå3OäÈÀ‹:ÿ•Iûü[<Ö¥lÿEûê®4íÌ~›ö5úþË=ÚõYÒ¾~áõÚÊ"Á–ï_åsýÃÔCbýõ òŸ|¬â?ôÜ‹ë¿ Ø @ä¿ÅÆÜ‹ë¿qläÅÞæ^\ÿ `ƒfÚëÿîÜüÿ ðÝwKêß¿n~`Iýw7ÁÍ!˜Ïõ_ž`61ÿß}çY]á¾pùÁ•€vH€Mö‰CþÉmúŠ-Lø—(¬yy‚?#º©:B­Ò`µ3Ѳ% $ª~N½Áþãï¾£~ögêçÔ ö“šzŸúÙž©ŸSo°‚îg€ýVÿL”;Vÿa]±ßf­šº¶ãvÚCÿ €6;tmÇíÔ­9ûlÙXà›™–[¢cA€¹XÿD /ÌÖñË÷Ö!L¿ÿÛÊ¿ßÂÿ^´OÞBF;;}Û“Ðÿ– 7b€ÇÁ¹þÕÿï¤ÿÏõo yÉÂë_ý¿ž$ôzgBˆ QMƒ¡*mW=›Óñ¥.µ•¶«žÍéøR—Ú*ÛUÏæt|iW< f8±g̳ýÏl‹AU^_œTˆ|œ^ž)¾žß¦|öÊVy~«þóùÿ£òùÏ[Ž×é·™ýÅ<€‚5ªñ0ìÚr³ÿ±˜PôO´uº<­ÿ1=™ŽÅ<€ Då%ÀáþXý ú翆V.€‹Ó÷÷ÇêoÐ<ÿ5üs°r<Ø»Ÿ¬þƒç¿†V.€ûwM÷'ðÿ!DÀEËðÑédð¸éþþû!¼_ÙÞßÛgíqÓý ü£²ܸ{—µÇOO_ û·‡€¼"ÏŒWé~¨ ˆ«?rðzï®J\¥¿á°ÏÅð²¼@)ܽ³©?°øèþ¯¿X%} v‰8G@¿zÜÿñõ+Ÿ+°c À}LŸ§hèWû?¾þbåS…n°IÀ^’ìký_u¯®.." °âþžœ°pÕ2¨û{t´¿ÖßÊúsþkêÏù¯©ßó×ú¿êüÕÐú¿êüÕÐú?û|NÏß'Ã}¨kmüȈûŸ¾>bó¨ •Ö*eN™rh¨ºKqEdÁ@»}: ³‰ À[ê¿xKý\ÿµõs}æÏ?$r?ÿ fÏ?&ô~þg Ìžšm?žŸõõ/žÿlý‹ç?[¿³×öüÍ``—ºþÁý3çoƒuçÿë €J—«ý;ë¨eÝÄà z`&hDïŸ{óô¢ö£È–!6äøøS±õpi™Z~÷•ÄŸ[t½ïýø¨¼}~¶‡~†Èý_Z?œÅ9E}žëSø‚oÅuÉW@°\Ôã_ÙÊg*xKyŠKlŸñuÀ¨|îüšÛýÿì Ö9}Oޤþ_t}ù`„¤üÔÂŽ®ß²ûßÊù÷××®<î6¶–\Ÿñó5s}×h Œ®ÏÜù®O03Ïo›È# €Ë €ø_ÀT3Xÿ›‹`p|ñ¿,€}X¿¹檇( ¥uÈÅNÕlóà}µÙL.@¶’½Ù™™Zÿâ}µŸ£Û¤™æ%÷LgMÑ`NvË$ÈÙñ¯þàí+“¸Uí+ièzù’öµ²¼/¯¯=ÁÊö5._Ö¾zý«Ú—Þ?¿qûú¾ÿbûš¹>KÚ×/ûþuý–µ¯ñçgLJú åÜ}|xù»?}DÑÿ{æ #>—ü1ýëë¯DÜüÇÙñÇ'àƒ¿ÍJ»¿q6RnîÙe¶zý„Ï'{ž~ôÿßwß-Ô½(Ùóô£ÿßûé¹ú ŸOö<ýèµïõúµ1ò+['hs&úß±Ÿ<&ïØâåê8ÐB/ ¸´Ášöïä+ÉH³Bðm†ú›ãê÷KÌ×_ŽÿU¿_b¾þZ«~¿D«Õÿ øw|ê}ïÉ@O`´þ½ôñ=úóìƒ@Y@šŽïôñÝ÷KP`fþ O:^Û+çú¤JWÎôI”¶ùC¯ŸÏ/ºÀðÿÆïöÿû÷_öy¿ÿP>_A»>¿òÿŸ˜Òª%ýÿcppëÿÁÿ"ÜcSþAµ¤ÿßÙúoK²˜òª%ýÿööÐÿ÷Ûò$¸?ãK‰Ì/ß÷g|)1†¹ñåëàþŒ/%Æ07¾dnZr3^á*ºfçCùÌìå-σWcY<h –?¦pT¾ðyÊëaªÿ¿ðyþÿ¸|Ùÿ÷sfˆo¨_€Ê¨ˆZ=PɰÞP¿•ÃÍë#Ö*Ô òáËÛ“ÿ·AÿZý³avÈ€¿•·?&ÿ»AÿZý³avÈ€ýòöÇä² _Ï7Ì€s€éÿð̯4€ ˆ'Àéㇷö>:-Àg~¥L(@<önmß¼óþ^~<ó+  "€å p÷æ{テ^ï1ÆõSìýÃíŸ×¿íÅ'Àd€²%@ÿ{R" ¨°¿'>&$™?þ G• ¨W¥ï’ðB Ð>L€áÿxìš?Ï,Æè'?f4ü_y%r$ €1úÉÀÙ ÿc¦” žWLÑWÞ_êW`låý¥~¦Xs÷·åéóþª:_W¿j‚ëêÏ>?³õ›ÿoeý¨ý­¬_Çÿ•õ› @Ñ]2£@ ïéäé‹£K'áºN”š 7ÂÿK³Ö<ÝzúâÐ Gc%óEÿ$´qa<ÝxúŽ9&.ªø·×¯7ݺó7Wͺó÷Ä×ÿ¿¹þ°§^ÿ(F0˜ówcÅõŸ=ÿ_Oô4¸ñ÷U4_[‡àh‹}ÕìwU€ißœ°¶×R=îë<@έsÐIÀªzõêû£òñç‡n~T.%ÄÒ^˜ó þ…úë£sS€öyžúJZÇùãs¸9Ü,•¸Êg–·”SèÏC#°›Wz­îÃ?”Ïܨ|P œ'ªþv}(‡ÅÚæ®OîZûË?•/»ÿ½¼ÿ™ê—y…ú[R>~¾fÊ0{ú‹×göüÊgŸßáúÖ³î˜b@op‚5Ýi@œd@ÿ÷Xüñóm@âa[šK@Ãÿ¦ù&ñbÚ¿XLZRÀL«r{JþÙ´ÇŠf¶¤€QiÊY”ü³“§tÈ-)`L)­ýüqÛ—×geû*‚¤•/i_+ËÓ¾r}ýx'Ú׸|Yûêõ7’…öà·m_Ó¦}Íÿùö5S¾¤}Í|ÿ%ík¦|Iû—/k_âB,ÿHjñ' $Á——ϸ4 S¾4¤tØÓøtÀ Ý?2 ›ep ìßi‡ÆêÿÇaàÿ?¬ÿ¤üî9éFõŸNÿO­ÿ”T€û¤ÕʬðÏú WÛº{Ÿt›[@~2qO@÷¦B>~`ô}c¾þ¢/ZýÌŠçëoÒU?|† %ØQçBý+ž‹kß»€ÿm|߉î¼'_ ðü8ÿã›Ëðm^ã{)Àa,?—]ÿgÅüá›C ÿNVé4gæ_oIø†ú½‚£ùE)Ôø›.|aiåýû/û<>þÃõYöyˇúÿ{ÿ_K¿7¡úÿX¼ÓÿËx[Ž@ú„ú·þŸëßúo‹–~Bý[ÿÏõoý¿Œ€·Üßǰð²ñÀ_ ^–/(Öøñ²8¾dzjÔË8˜Òv\>s {y1íóÒ5~Ås€Ãø å Ÿ·ˆ?ýÿsŸÏÿŸ–/ûÿsÏF¼jlÏ0_sÛé/€Û3ÌÏ»CÆ  ÆvÇühœAèÙÿQR=¼ @dÿGIô Pð€~‘ý%Ð3àѿ&þ·wvþøVD#xº÷@Äè_ÿ»sïã[7# !À½;÷EüÄú7ñ¿÷ïlÝ|·DK°D£ð_Jîï¡pA@®F‰F"àã»{÷îÝA àãB”`4 ¶6ÑH|%€­$ ™#þ‘C#üøO€œ@tÍÀÿ4âË áÿfÁú_þóÚÐ5ö'âŸ1ð³¿`ýÿ¿Y^kë–v¯.^rìÂ3ð¢ÝßÓ(÷™#°¢@ÚÒîïÖQ”ûö·¨Ÿ(ô…ú=ë¯ó_|~<ë¯ó_¬ßó·þʰX¿Ê¥L7ÿÅúUà(eºù/Ö¯2G-cÄÂö“¹®î'Ðû!&|‘W¾8í›Á-VSp'å[Êh‰ö)w P+ƒ”/ˆ¨ÐWþÈ$ðo®ßÈ7†ð•çïykƒ^uþå›»úüÿÔo óˆºþÿâùÿz€Î=fвïøWäX+à_$R3H‹) ŒlFFgÕ[Ɖ|* Çåòkhš.öJ7z0·1þ娼d•>?}㨜)™õÔ Ïr0ô¿P>?õy¹gšëÈà 6:€`B•Ï,o)W$€Ÿ è¿~§À´|î5€[ÿ0woêÅñìÈ[$æ®O&ø5ÉJË_¿e÷¿•ß)0{}˜f¶3\r}ÆÏ×Ìõ]GŒ®Ïìù®Oûãç·+”o(¥hÏ ý–‚ùrØþµþwä_ÃõrŠï®}êx)€Xý£ÑÌUSU©Iv€Xý#Mèi^@[[<bõï¤ù˜í$¦*Mìö ÷êöU«Û׊ò´¯ÜرÀ’ö5-_Þ¾ªþÕíkÚýFíkúý—¶¯Ùï¿Ø¾FåKÛ×èû/%ØFåKÛ×´|v|èíkƒ€eÉœ§© "ÿŸ'' Q¬Áñj&`"ÿI PQ†¨þgÃJ1?íÉ hœÎæÖ¸~à«:¿óõ3÷oõ3™äw¾~¦V?&t~­ÿòi£(]m†\±ÂÀIÕmÆ‘?AÿëˆÿÃÏñ úÈæH¹Ï#ŸÈŸ!óÃût ïÆ°Í(éôêðþ¸þ0½~Î× ×OBÀùúÃôúI˜úQ¸cdi:¾PL@$E œHÓ+ Œ€Ä€ŠôÈþ‹ôk|/ ˜€ŠœÎÏž8h@ ϾqþЀeó‡¯?4`Z¿ÎU£ùE#º`Ñ*€òöý—}>)ùzùü ¤]Ÿþýþ›ÿ3·­ÿŒÁ;ý?×?¯x >@õÿ;G:ð°pýóÊmêCTÿ¿}¨C—ëŸ×´ï'5¾$óß0¾4A@=̾ážS2ÿ ãË75°9¾|]ãK2ÿ ãKåûSø1×¥Aûÿ´|æ êòÇ¡;òù!• à/ø—Ï|~(÷‹µÿ?þ<¸¿ÿÿ^>óùVÞÇ÷PY3–|Éø^ã:*kwzôÿìø^ã:*kwzôòøùÿ­´ÿpÐïÚÈ6b€4€ŒþòÀ‘F °Tÿ¢ÿ?hÿI„ ·cþÏö>:ûèô£óS3pºKvBüK*À{wHý·÷þÇ{f $`o“ì„ ù—T€wÞ'õßÝ[É@HÀÝd¸A@¡ÒþÀ+Ð? áþkïoˆ‚õþIh€:€&„`q@±¾¶ÿ¤|WÐ? ÙVÐ,I¤ú3?6 @ØÄÖØý“™?ˆ† °ÀÔzšþuö"€a,0µÞ•õ`Fúº¿ÿ×D´¿FâýÄú‹¹í·û ð¿Õ^ Qdý5+5#ý>_`~xz£{†¤JÊ9ï^ÿüù§œóîõÏŸÊ9ï^ÿôü+ `Êýuþ¦lK¥L¹ ¿žOÓ¶E Q‚þ:Ó¶%zF.ñÿõ%ÄÛS}ÿŸ¾°B€xHJÆ€>ý©ý (?H4€ËÄz&ýóÁ ÿîúª—qùù—>v†Š¥ç_€4è%çÿï®_þÓ4×ÿ_<ÿ_OäÙú­Á‘@¹Ðï]½:©À•_ºL?¿üK=~iå>JbVx"˜Ã€ßBööO èF ¼­\£aYé¢ÜÞ±.†=oYPf.À"@™»>cØú/\:ßšï? Þöýÿ¥òúþKÊÌõ™=ÿñ5[wý¦sÌÿ3ð¿©×\IïÿDú—镈%kfifÿØPšIºqµÛÌþLú*!”ŒkqµÛÌþñœŒÉ¿Ù‚Úvþ¸íË볪}y}¦å3ÏdžŸ5嶯\_ÿÖ… ås|waÏÿ_EhëËoÔ¾¦ß±}ýŠë3¾~« ¶ñõ›y°[—3S>{§!ýñþ¯,AýLG>V àc-{à|À?~ÉÔÏtÃ-üüü¤#ôê×#G5€•ÔØëþõÿ¿›¯ø?Ô¯¬ô|ýÀÿ¡~àÿÝÔ¢_\ô®dˆ À‰)úô pV¤ÿ?.ÿ4Ú“Ý÷=eÞsûòè¼ûu6þ©ÜæûVéXx´EèÛ£úÂðôúa0fëOÃéi¯c¶þ„04ó%õÃ`Xé¬ ‘î}£‚ß³çì²)L7v¦‡;4èúÆvÍJÓÿ—†Åÿ¿Y6ÀŒÿçdþÅáhöí3ß±höú,)ÿUÿ\¹{D€êÿá_ÂÀÄ!€þÈ/Pý¿)ìÿa’þÈ/Pý¿)„Á0ìš’±ÌþU¿ÎU¿‰Ûø³Õ¯3@ÕobÀ6¾Äì_õë Põ›0þk]© àÉoë¤Iêk(Ÿ¹RCy1€ïšÚ6òF‡hås×¾—Ëd$Áìç‡ú‡òÙÏ·òÙá|ÐGôU@Ò €¾éþ€þ ú¯6j q¿zIá¿HÔ.âþˆ&è¿B+ €3 €?é]»€àãhÜÃãÀŸt€®Ý‡@…x€;Mô/i%ŒÀúÿλ7K ,ýþ;㕌•ÐW(ÿµôßBøï¯d¨€yÝC ,ý7þ»Ã+ ¿…TzÀ8ÿ›ðO{‘@ý/¹âüoÂ?íýED€‡É çþiï/ ²gû.ìïƒ[__€žˆöG’¾Ý_ë?9yù’Bzè‹3(O,ýG' [ÿÑÑù¹6íCp>Œ¬QaG [ÿYWxxfÎ\ÿ²ó׿ìüÇõ·ó7ý_‘!Ð÷=2ý_‘!Ð÷wv:ÔwÃ#ÜN,!8÷_ª` q½µñŒE)€"ã‰'>[“gz “ @ ´Qj8¸DDOñ¬ps>_úß[?ÿupÙXvþñ oÍuÙù÷Ó¶³Xvþÿöú+8X‡Â\ÿõü5PQì‰â3_\m—• ü“Ûky#בø•=eïZ¯ú© ’áêq½(Mžò‘€rE˜¹ PQ`MíQy}~n(~™À¿Pr,¤ôü¼>Ø£‹('Qõa ÀfNÞËgÎîmåôbÃç×jèÀ´ÀöÿßòôÌ<\ßE€2º>ßyuGX–ÝïÆ÷GÕ‡ùû_åÓï¿„_Ÿ™»§ýmáúž¯™ë» Tý)Ÿ?ÿŽÙ†ë7{þc €6GØ…žÇÿöRøÿãyüßûÁBËö5KTødûMb£qNl* T¯µ6{jhþ'òâΚú­©ÍžÚ.ºµŸ?nûÊ,uEûòúLËÛךò´¯V¾º}Uý«ÛWÿÿ+ÚW’o¥cùÚ×ôû/!Æ×gIûš»> íkæú,#ØF×giû_¿eí‹òƒå¸åƒÿyqO£=Îó¨ÂÉýêòæÅ=œn$ý&Ð/j΋{:D-žã›ÓúAÌkë§ÏY[?ˆyIý†ä_’õ{¿ 3T@‚öÞÙ:þ_»[‚½¶¾¼}Ìú†RÆôw¸¾ªð¡Yÿì &D °~‡-TrÞÑP1­?Úý[ýÌÔ ƒÿ}:ÔOÀLý‘0Ðîßê'€úÉeO”{Äî¸x7ÝÃm4'ðüh§÷ˆnüyß Æ¯ðøXÿB@Ìÿ¤  òÔî§úù?Pó?騼µ»¿§Ÿÿ}u1ÿ“«å¨]<’þï‹?±ÿ¸þÿý¿µ,§Š&ö¼‡ëÿ~ö÷[€=EûêÖm¿²pÿ±PÔ@ŒÏhHyW³ºK| @Åý£ °w÷¯¾wçîæÍMíý£è¼6ÕàðL"Ðsóè²æÚO"€³‰!ztYsíÓ¯ñ‡Ý­<º,€¹LÇ €Ï?/(öÅ‚~\²¤ØÊàóÏ Š}± –ì)¶0^ÂûbAŸ”ìÀþÙd2:]š‡A¯æü>VýMÖ`îüuah½þ3x ß˜`øº>Ù:z5îb6|ÀðL\&àNF1–ÔèÆ*)ËÓ(NÂ`õ®‰s!ø¼­·>¯þß\¿¼ÅÀ,9;­)°xþÁý.KÎÿß_Fùáúÿ«çÿë ¦ÝÙ_<—í¾Ò»Oθ|ÿ½ðµÝW†4oÆ@åÙ8¬ŒáKžlTTj~±âˆ¬ô6Í£=׃Ëýü|ñÌçg¾Y~iýV¼ŒÈç%@Ê!=JË* –áé(ì?†òY€ò/”¯(å¿¿’èÿß7Š?£œoÅ¥ÿE×W€ùb_üŠß¯ß²û_å¿øûo 1\‹×oô|Í\ß·}ÿFÌž×®ßìó;«P5Öj¬#ÔèP}¸”5aÅP#m‡SR`m¨ÌzÉþP¤À4Ú°@ÒMIvÿàí+×gEûJhÆP¾Ø¾~aùšöU~¡«ÛWûÿ+ÚWnçoܾ~ñ÷_Ò¾æ®ÏBûjåoûþkÚ×èú-m_Xè/ÿKÐüü9vzŽ¡Ü:8F€×ûG;;8¨ Ìþ8$€„×xþ›‡£‚Ô)À šÊæd¨?øMýÁÿkêþ_¬_à 3$ý8þ³Ó’¢ßÏA (Ì ÐUšÛÑ ¡•Vvû i}"®ÞNï÷6ÿÀTþ´~Ñ©¤þïþñÝlý¢ÿR1Hýt¡³õw5)–»{w­?ÿÁÙì™ñ@uK@广ìÏ*ã»fhtK@å¹röçk€ÿõÿw˜—2¾Ûÿó”ÿÖÎðû_;Àï~þ0ªßÀÍ2,Œæ'ãòiÑN#ããðýg?ß¾ÿ¸|æóCùTà¿óÿ¹ÚqA¨þßÍbа·ƒ/¤Káÿ±ÿ`oéH—Âÿ9âÌ<@ëŸ_€À£ñ%ÊyU *GþÑø"3;¾øëÉ,_–š(g°jÿcÞm=ãò™.º07!|ÑÅ&aüeå£ÿ?SqX_>C˜P™ÑÁý³6à$þF§“"/³ËG±ôÿp¦ Qƒá?îðhÿž"€F †ÿD¸ ¾`+h@…Hàî]Ó’–]-þ¬;!pë!i÷’´|ïßÛÔâϺ7·Ix'iIˇû¿Öx÷=€÷o˜ú·£ÿ/NÿF8˜›#\'þÛœŸÐß ÿ»Hþ퀰Gÿã¿¡ `ê?Ýþ‰þGR€p^9‚üŸÉ߇üÇ{~ã ~õx ŒðBtP¸ðŸøÿÉ#~%.€^ˆ þ«éCãØ‘8K€sT ±òkü?¹¤.ûs/8zÙê?:ÒøtL]*öçþžaû?nõojü?<¢.û9eõi,­þ~þ³õ/žÿlý‹ç?[ÿpþÝÕ?6ÿ~þÍ@r »úÇæßÏ?þ»»ztWÿØüûùÇþ¿I }kW‡?ý8™$@Ó}su~ñÔðcThÀý×W[[ ÐôOëðñ”HûG“ËË]5‰ ½¾ ‘ÏëÃöo®¿¡šê –œtg—œ:¸ˆ¼äüÿÔ€×ß”B9ñéü5 Õ¿Eñù`Ô¶«d760PE#ç-Êè¶í92°˜§TôËìÛr¯¸ó”‹àGZøºB`TÎçg:ÿìŒ??Cžÿ¥õoüüãÆ¡s u ÊÂ?M ås ÊgN°ò’Í”GB³/ãòu@ë þ?ͳ7ëé¿ 0ʸ®¯‘&³ËÌõ‘ íi_Üûn|ý–Ýÿ*¾ÿlí‹ßìÀBwþúŒŸ¯™ë[ßî쑃Á`öüçˉ?¿s¿°øØþùý·¯ÿ»®}åj¬j_Ck™Mªé'fòj¶œ í«øõ!6+ÚWë…~Ëö5\Ÿeík|}–µ¯Ùë7zþg¯ßÊö5º~óýÃBˆÍ²öåeÓÛÿðÚ¦ý#ÀÁñƒhô+ß§mAÓ´ÿLûæÿ;žPšöæäˆ»£îC€ÞˇùÑëÿϤºoi§qþË!übHÃØÔzgÑÒ0Nã0†Sž¹˜Mĸ±ñÍܨ3›ˆqcc>æâ·HÄX*6NÊÛR×au"ƹ’¹Ïão²v©ò9@d»Ž0 à:À4€3€J`ýôüÇöÿƒ¸Ûÿç?€@<Àúûzþcûß÷cûG@mBtûèëùí?¸ÛÂP ܯëÿ{·üž³~øð‡Î.â@¸_×à¼éÿ>fþý{â@¸_×ÿXüoÜÝbí;÷ãpÉ?tÿOO÷%€Ó¿í#ŽöõÿÇèþïí%î%RáÀѾ²BþÏ,‰û¿%€Møe=ü¾øÙXà?·Ó4€2Øþë°aþ:ÿŸÿw H(€í¼æ¯óÿ>ÍÙ;ÓÚb°ý×áýªÿ ¥PLðþªjwB€«“Vÿ þþJ˜‚û'?xD€“£VÿþþûûÁ)w! 5É·zƪÕb½~þåüù[¿©ŸsŸ?ë× õsîýüç€:ÿÕ@Õ¿š¨úÇÀåå«“7oì:ÆDðÿ¤gÁ† ÀøS&vv’òb(W@^[×S‰z\þißß>OSþw×ÏÝ‚µ ²›?Ç×ÎD?{îüÓzàP2þ°ú5°¾ýŸ*­üITmž¢¥î|~Ý–¿ðüüó¯)€éç§yÊãг oxKûžælIJôå×>¿ø]7?,Ë€ÙÏðÍ:þ/añûÏ”Èfù¨R6g¾ÿB÷ g®Ï2 ½!×oîüÿ¿‰@å;ŠÂªfáE#ÿôIDAT?²í«Ñ@€,Q«…n­í*ñY@yOY—¨t¦¤Sg¿çöõÿïúöÅ¥XѾêúôò™ç± ÿLùŒè¸|5ÁVŸ_M°MË—·¯”gù ÛWûþKÚ×Ì÷_Ò¾~áõ[M°¯Ï²öõ ®ßñÿÁåxí5Ð_Lô 8¾ü¯LÔÁÿ÷…ÃèÙÒÀÃ[GßÇØüÏ‹s”ôðˆû½þùo]ý§Æx®©¤^Ëêïæ~Û¥ð?Zʬÿît . 4þó‡Ãg¥¢ÓÇ{·Õÿ;væäÂk +ï’ؘÜÑwNŽ ¹hø¿<þõ'øÿøïàÿqýþ·Ny¿ÁÿÔþ×OÄ?õïQ‚ÿ'wÀÿÖßÖ,ôœAV™]gªžæ&mtzÎÄþ°æ’å 1`Ïiìÿ7C3ÊÁd¨ßaÍ) ÍÁd¨ÿÕËj€YU¿­|$m0>—áû½­ÝÿJxGg¡ä½{ãþÝ”wÒÿáÞ¸ÿG÷%ÀíôÿF`¸7îÿ¯\€ÕùïúåoãKËHy_úåoãKËHy_úåw|‰Ð¿ß| ÀkK—;”¯Î¨œïŸÏ‹ý+zư¤|æFÏÖŸ¯6óùöÛÿOùÌ2”/KE›É_·T°ÍŒps"€ëÛÿß0à1¨] vÿ†€±þ±ýƒþ¥ðÿ¿ v÷5ö ý› 4þÿwúîÝ „þ<{˜P€=<bù8 úSðÞvBîàËÄù»ÐŸB€wÞK(ÀûxÄò_â€÷oœšôï á?£ÿµúGàoqû”é.üÂ=„ÿŒþ×ê €}ޏRJ"ügô¿VÿÒàˆÛw7õ0ãÍl #ý‹‹—z¨¾ ü€d" ¦Ö ™nM ,áq ÐFÿ’Þú/®^¾< '9ê‡xyNS‰ºóÉù9jÂu• ~X€s²ÂlYÿ>ìªû 8<²~ºóÓ~þÔ ÀÔï¹Ï?õE0õ{îsçO}ÑLýž{;­üµàÐë@…hå×Ö¿»‹Í¿×=€ÒÐʯ­s›¯¿ÅÿGÐ,€?ý¨/ >ÜÏâüôéÆu²y`€7ã €@\Úúôéä*ÑÞ—¦” éòù"aóùË·Ôÿò-õŸ¿¥þÓ…úÓIÕù³,Ö_&ôš»X¿_¤?›ÿïë·÷oןµÄ ÿ…óÿÕÂ|Ʊÿ‚Š$|Äœ IB€JGžØÿ˜JÙÂô«8„’Àò-Ý,¢ifðÅä÷ Ê"`e2)‰¢ò wÛ€ ƒ ÌÌ÷àìÊóùù·Œ?¿Œøeõ_A mùjL–Èç½>‘îØ¨ˆa¼r$×g(Ÿ9½™òã9Í@¼Ñç׈”¥þÕ¥þ‘Ÿq1(«Qu}—”¹ë3uhÆÄqù’û?w}fÿÃ’ë35QB±xýÆÏג볌˜ùþ³çß¿ÿp}fŸßzêβñÖкkC6î- ÐEƒµ\U2@_¦|j“ôjV…f,o• ÐW/Ó&iB…f'AQòÊ£™´€¿÷ö°¦}ÅYgEûÊõÊÛW/GEpÞE Zù›Ô¿ÆÃf\^tL_ÊÄò߸} ßIûš½>‹ík¶|±}Í\Ÿ¥6ã¦}Õýézãñ¡yØœ¨>lÆ¿Êû‡ÕŸÇ¸D”ä@¸­âý}Åêj-ee\³OÞ?À?׿D”ä@Õÿ¬¯ÿôt}ý{{«ëWïØo0éÕIä0ü`rÀ+í!fG—GÇ»šððˆ?åÿOP2GÃ:rrá ø®\ŸªÿßQÉÿ¨çÿÅú™¡*ôqJýx¾.Ö¿w—úIþGý8ÿOë§ÿÃÄMÄu´}› `£wÆwüÒ}z1ûC¤Ü©ñÇwüÒß1û“ˆ>%D8¾³ãøŽ_:¾³$j?|²0ð ‹õãlnèÿìüÁƒ,Ö³y…þ''`›?xÅúŸÔcZæ'­|aþ0-÷û/~?ü|ÿº>‹Ë´œ¯²äóýûåû/ù|+§} þ_E|úÿ¤0ÿ@úT!ÒÿïTÿŸTægHÿ @úÿíêÿ“ Àü ôÿÔ1e[úøRz ªã;¾LÙ–>¾”Ã7m|™²-}|)=†¯[ý9õ®nuâ^Ò?Wùx™)¯¯Î²<dª<¹«>ßÊý~sŸßÁoýÿ*/Óò1 ‡µ6Ú±[À8@kLÜwV…èaâýmˆ}9ýü~häš  »„ì ôC( ÐÝ5Ä«¿áþ·"À¶Qz¸["€Ïý; þgmZÀôÀ Eÿý»üÏÚ´€ïë`À~‰šöïNð?kÓÞÐÀ°ýwKÿŸÿ‚@âþOÉàeâ•Óß,ýþ ÓöÄýï‘ÀËÄ+7JÿŸÿ¢½ß¸½Øô•@psÔþ_o|ñÅãò @ç¼èˆàŸ€Þ•¡:ÿãEot@ÿÔ>Г:ÿƒ!ø£ç½¢vEÔ -h÷÷êêåÅñqê§ÿÑ ÀÞçb¸¿ä8;Mmôïœ×åŒÕiqd΄nEÀÍ:êÀãþ›@KÌç¡_DGyèëó £ŒÐÔOÐ?Ûs,À\žûõoü@ €¼`®<×®òù\ èæ9%2#ÊgêoŸèÄHûS1._£œê×Ä(OË›¤_ÿPøÉõYJÌ]Ÿ)ÃÒÆå-vÓ‰l¿ÿs×g @™½>3õÏ\Ÿº¾yœZýýŠ×å_0*WU¢-žÿþÃçëqíç?.¯9B$’LE7Äÿ I¦"€â[À좙:jÉ™&µ$Ðæs‡£¶‹íköú-¶¯™ë³”`_Ÿ%ík|}–µ/ÊYÐúûøðA¤Áþ¡”ÿÃàðãZ Z[¢þûlâþïUþÏØ€­ûÜ´þ&¢~]pÿwÊ®üŸÎ“ÍÔûÿÚúuÿ_W¿îÿ+ê'åŸ6}!?£ŠÇGŠÿ]1Àèp ‹üÖÑm£àþÍ;‡['Ç“ÉÉ‘NAûåø¯À‡ôAˆÿ91íÞd£×ÿ]êÿ®ê'`¾þýÔ¿_õ0_ÿÝÔ·ê' ×ÏõI²? ¿Ý±+Ø€ßU§ãbšìÀ<¬™j×ø®:÷ÇøÿÃíÎY¡èC’ ^…¶'‹ó‡'Gi?Iÿ`öùØÚøæ ôoÒ†˜Ÿ?|½E:™éªsΜb4¿ˆûS_f¶åi¹ßvñó\‰¦Î—ò…eZηXòùöýêû/ù|+§ýõGùo#ÛqÈeôÿAýQþÛÈvܲCß#¨?ÊÙŽ;@v(Ëø’ˆ²ã I †ñ%ÿdÆ’@ ãK"þ¹ÖÃøB€Œ/ ËÏxDZ*˜–¯ÁLy}uBY—ß®Ÿ—cÉõY`fÊóýf?Oæ€áÿ/0Óòz~ÚSqûèØ, ‡5Aâ+4âÁmùhˆæ¿Â§&høÿ·Ý³hþ+üG@9€xàÿßvÖ«¿Îÿý%tîÞ)õ€üüÏü‹`bJý ÿ{þE01÷£þ?€ÿÿ’ 1QûǬÃ?úÐýÏeòõ´Ôþ±úãðþ4@Eÿs™|Ý/ñŸì%8Dÿ«P:Ðéäáõñcb.ÀÐçæ¨<ìj&ºìì À©¹*ßãýÎï-b؃€nÿC¯øú_:ÃKÀ7püìojÜÅí½B¬þ¼+ßÀñ{¨¾¿µ©Û?2ˆÞÝ” Ppóý;h$’£ 9ÿë¶ï¢¿ÆrDÛ"ž>·E½|åXwúØ>·åâŠú !Ê`z‘<¶ö“—g'Ô/§|‰þv‘<ôïQ¿]2Q çh2~Ñü[§ÃùÏÖ¿xþ³õ/žÿlýÃù€Ñù—û¿Ë4 ø¿Ÿ¹ÿ»èæß€Ñù÷䀸'þÚ‹gÏä¬cC?1àxÀÿÑ«I9‹÷áÈ€Ãÿ'Ôòt¦ Ç[†¬«_ýuõ뢿®~]ôçêß1¥ÿ£%õß±¼ÿî’úoÿ×ùo¾¥þ“·Ôô–ú·ÞRÿË·ÔÏCµp}Æçzú« €%CçopÈÉceÐÑã¥nYû«ž}¼L?Ÿ7.”Ç€ = ÛËì·X€‡w<=ÜøñŠ=ᜣp8ZšJye˜Ã;f#Ú=&ZׯÑHýk4ÆåKÚW…²¼­ý¼­|uûêßIûš¹>o+_Ò¾Úç6SA«ëûËÊ—µ/>/Øí«÷g€»€§9xO@,þèýàn‚H 7À!Móà~šV…ÿãCXáwß­¯}ýLZWÖ¯¿¡Púøãª_ÑQ<þø©Wý—5×$qB€DŸÜf yWÄö7¾R“ƒÐ फ़¼¿©Bàòú\[?B€këG°Õß5úí™^{¬Y®4zym´]âL»@/¯ðÿ& ÊôÌ2¯=7ÿXÏkÏÍ—ÿOÅýë]ãŸïÿ¶òÕMó•”¿¿JƒA«lèPý¿ÿ¿üýU_LÿφþÕÿ{ýËß_õÅôÿlèPý¿×ßñã?fòBÃËÆŒÿ˜üW/:ZÈ,_¬?Ó±1çße\ çÐÊÇWc\Î÷7ñ„6¢$p•«p’ïïõIùÌ=•çû%ümúù¹ÿ¿pZ>ôjøãü/þŸa†‰!a™8ÿ‹ÿg€—bÀÀù_ü?ÃýÿCaý˜ÿ (YÀÚUp¿°~Ìÿ†”,`í–`°~Ìÿ†”,`íšPñ?,þcñ¯,xD ,‰ùWp;ÿÊ€@ÄɘEߋſ²à1À÷oDó¿Vô²°­6ªÑü¯€ýŸ,l« €*@4?€x4Ÿ€xHœ'~>‘# ™Ö5”'~>‘£òæ ¡<ñó‰•7×êWîï˜,ãûûý¿¸P¿rø÷ÏÜßsôÿâz`<àˆúyâ€Ó#Du=ή~$zýuþsõw׆áüçêï® íÏ2[?пT*Ú?ñøùä©(]ïr–ÙúC ¨ €¼ùe"æßOûbTñô©Av7W¯®. Ç Ö¿“kK÷1-Ÿ\^_ˆÿù<ƒ—åu6TY\W¿×]ý^ÿuõ{ýê/(™ó_Zÿ´-É%õOŸ!´$ÿðõÿj yìâÀ'×#²n퀑{†ñ‹O* À©nTN@g2ñ p@ŠåßãäÌáMÉ“m 6]!±WWmÝ™#7*›[í´|øüŠr±ÀûgËdÁÓú—­|ôõ£dþÿ3÷<÷ÔT*åÉb0&¿ªýoÐË[ÁN[Úò‰”ƒÕß0ÛFöj]ÇÜëå³#ä²rÓòUÓÏèõçõ]@Æ×ç-åËîÿÜõY@f®ÏÛÊó ôçkÉõ‡Ñ÷]ŸéX^>­TÞ>T ÊÎp©†K]ýLž†(ÜcáÊ)hÝI)Ô$Íî²w›½?&‘܆²¨4ÛE<‚÷cî1¨ý•o@ÍÉh^1÷רïäм}M-ü‹íë—z i:Ê*0´¯|~}ûš–/o_ãòeí‹iüoÛ¾†ë³¤ýÌ\Ÿ·•/i_3×gyûÿeík\¾¬}ùýþõ¸¼üXEýþ‡n À#Ùõùlºÿø»M$·%²ÿêÿ £uÿ÷…¦Hëÿî-õï¿¥þ»kê?ÂÍŸÑ‹¼Ú‘h3ê<:JNLݳ51Ž'¥Dþëå°ƒúYHÁxÊe•Vœ×x0l­¨ÿß}·¶~|H×Ö:W«ÿ/sâÜûø® @Dri€C0&:}| €"ßwØÅÈŒ@ßã @ÆwœÑçæø¢¯?ö¿vþ@ØÿÌüaTyó‹>Tó—Ùìl7Ëðý—|žï?*Ÿ¯ ×gúý~ùÿÍŸ´pƒÊ“ùÏþ¿6â•_=èÿ“ùÏç¦6â•_=x’ùÏç¦6â•_€6¾@Týµ±0¾@TýµQ;£ñ  ê¯Ú)³°ÕsÜÿÐòÿ åã«7.¯¤‡º ø÷ÑÏ5©ïß’"Î^ûqyþ£Ï/üÿ9€iyï´„‡Dª±N¢ŒŒûÄPx…¾ºë2.–µñ]}8ËÍ@y 8[vúC€þç` ].>ƲóøâvI¬GÄ|¢î=  j€î=`çÖƒ}vI¬GÄ|¢îÜ' j€÷ïÜgÛ?»€é"þæÄõŸý¾N@¿ùqýô«uBBü͈ë?û}íñýÓÇ;ýˆÿ3?Þ?ýU€¿Ýåb=6&{ÿ-f"þ±÷+X@*€;·ö7¹X¤6àu³Ùþojïß¼¹I¤ª7Òñ xÜT\>WH¿_OÖì!ˆwšùÂýS…ôGåzÑŸƒûúË{ éÊõ¢?ÕËú—Ý_"Ôf9´þe÷—H©Û‰õ ÿÁÈjèoÈäþ£ÛÏYýãó_Vÿøü—Õïùw`Yýc`Yýc`YýE\žL'¬°x[OŸ!ïŸïwr}¥;ÚµÃÀOy@yG×Çq«/ˆ Ÿßº«ÚW»J­|±}õr<–¶¯”ÿÚöó¶ÏÿÆík¸>KÚÏÌõy[ù’ö5}ÞÚ~Úf®é¸--i_xþëünÿ¦ˆCÀ¥y>þìãÃøÿ#p_)Àr0+ *€·ud÷×<Xýke|¢(ø­ë'öÿääàß\Ò&M:~®´2±“‡ÇWŽG»æW²ñJ ü÷œ@€££ÿu€‹dÿ¡,ª½RNP÷!¾J0-­`mýŒ%k뇨ú¸£ñ]ÄïÀžPVŒïCÿ.âw`7"À{Ãø¾ àÀnD€+¾ñxþ€ãyÕ¿bþ€ãùÚùŽçsó‡QýúŸŽÊÃÐgümßo®ïíåùþ‰ó_ü¼ÒˆÓòù ¼>ÿ­ÿ?úþ*ÿO{|¢/jùû ßñ÷ïýyÿËäyÒ#þþ…›Ùi{È/ø<é€1QJy°/®çÆ—R^lÿÍõÜøRÊ‹í¿¹®ú3txÇâ¹ßËg®^GàŒ·ÃüÒ¾ßÿmå+ë—ëX÷ÿS>ôiu!¦Ëˆ¨ƒ!¦Ëˆ¨ƒ!¦ (6ZoºÌ_üàÆÙâXLÖ´xÜ»·÷€ß½½ûnÜÛßÓŽÀî=6ð€M¸ÏïÝü¢0ˆï¼>no±Bàñã¿™ @ƒ?DÀ)ÀGQ½b€xìaðß7€ˆ€=€÷ß§zÅñ¸[éþîßÕàpàÆ ªW ðýg€|þx…¬ÐÀD€@í¶»wϯÒl˜#m—3}_O^õ~7Ûöû ~qÜ`ÝЦ›//¸Hâþ¸Áº•»y~Æ©ˆûàëVîæé¾Îÿ—Ç/Û=™»¿/ålÏÏŽÏ[ùÜý=Á¨¯ZŒP#¦÷÷tÒÏEýÃù¯¨8ÿõïKø·¼þG*ú¿%iYx>wvzÀòúoÞÄ#xh}’î˜FöÕ5Ï«k®O§åÊ À®FØwMš[^”„™ôë¡€;^´«Kú)üVÕÿú%õ¿öú/¯ÿâœú/¼þËë?;¥þ³S¤!ÏŸëõðõ˼<ÚÝ]¬Ÿëuëâo+áÞŸ¯ºâÿÓ×g¨tç&³Ïˆ=}ªÛ jb¿¸ ŒêòâÿÉ{üo_¹+Ú×p™ÞV^,´¯ÿÉ˼²®ß¸} ×gIû™¹>o+_Ò¾þ§¯Ï²ö…ÛÿÁ1bÇþÎýå<£p|€Ûÿ}xâé³%À „¿èlÝÇí“¡¥Bÿ°EÙ(£0Ùü­ëg¨ÁÑÑñ!Sè üWà¹À‚[¥Àõ>S1f<;ü_Ï3»K3sÚb*”^4Vl™€pàùëŸß ÿw|Ï*–èÙñý¿Œï˜ ßÙ›ß ÿÏøŽ ÚñMºn9èó=ÖÍÊ`õü¡<†ùèþ(ÓùEØãòùçy¾|ñ󥌰Š@ðúü·þÿèûÏS“Bëq á}¦ßc0æ¿R¹è1óå³9 çÅñ+'ãô3£Ívp6õâÿDÆåLûâ+Ã/ÞV^µ.~¿ÙÿFù´[\r"™ÞöeI¹tX–”SògÎtý³Ó¿ñêâ*ÇžüÑ }ÜGï%V¹Âº§M ØobŒ]õÚ—Ú»øá^~¸øï|ˆ€ÌðÑG$ ÀG§Þß»C*À½ýïãð¾ÞŸdxï>ÆxRB(ú%n˜ ™nÜê¯_*èaårw3Nó+—ˆå'ãªþÇÀî°–@‰ë%®ªþÇÀî°V,?–3"Ø1}^¨=ôYÓŸ¿FðbI&l’ ØsŸ^ x6NáÓoåÙ¹@gïl i¯e½ýÓ­éù/¹ÿ3翤|æü—”sþ@pq! Mqö=D 7—|/!&x(¾&žíúêŠ×ã«k¯ÏôÏÖׄL7^™K·çgÈäœ0þiã=¹ÜZ¬ÿ%5s_­¿®ÿ\ý^sî«5×õŸ;ñSêçþZ?×?Á3‹ÈŸúy}t!°;_?ÈŸúyÝ9“0qÐxùS?¯7÷%æœÿÙóçù™?ÿùçþüçŸÿùóŸyþ5° ŽM;Èå[sg¿°K¼ä¥:“†Mæ…]ƒ(ýµ$3¥Y€Ñ.:oY4Ê05«™Ô5²l¸Âª² ¯Ñå‰cxŽ=G©¦ø>DÇÇÁ  ‰éÌA·*A§4]~k•V[:äè”pâ5¿»va#"ºáð¬m¶ßÍ&й͆ú7“N„žNñµQR<Úd/ WjŽ3¤0¾„e?ÙEaÕJ4›!EFE~”ýd%»H¸ÒÐ,]Xþ“¥dýÕÂòK;ÈÚ½Ï>û²½º¾ÍÒŽÞþò³ÿ`ùÏ¿üå?þÌÏþ™õ_þò)Ë_jÿ?ÿÃvÛ«ëOXÚÑÛÉÞ'Ÿü¹½ºþ€¥ýó';[Ïvêwkçà9«ƒ7x=88¸Å˃ƒ[õ»µ{ðàÁÁ.%·8hùý› ^ëw²}ŸCÛ¸ßä àƒ[úÉ'ÜL^òçK>üäïïpg?ù ÜÖœ`Þúàï/v™››ll2)ó¶~`ƒu–›Ü”-G2_ü㕌ÞçÙ?åå»ï¾ÛâïÌÿxEÁ‹w±µÇ £³á3û¾TÍä®"8nßååúúz‹¿7¾øÇëÕÖÖ›ì_ñB£Û⣵Á+mÊw]]Aá¢q~ÿ>ÿü"˲ù'àŒ_ÕûÕüÓ#}þ™ŽîÖv‹$gÇßt!ÕôëóS-+¯Ï«ZV^ŸL-®¯?'uuɨûêêÑ£W¯<ÿ«ËWW×ø}øðêÒñ÷ò„S¾¾Üݹ¾ö´/O®/¯vø½uëòÄñ÷ä˜ñ÷êdsûêÊñ×iýå6¿ ÛcÇ_àÄ1už\½zåø›úÁ¶¸ºtü5\öøšéúÚñ7õƒmɹˆ £»EN—ãzvS?Ø–ƒx—sA®.y_]ýüÓ«W^ŸÔÿ3¿?ýD KúWo®/ß8f—úßðûê•6öK7Ï#ƒ§à'»ÔýÛLÉ_ÓõLçã‹óõ~dÍûúçg>\Ž/L×WLÛgß—^pù4m瓾hUÏ4ô\˺­¡pŒ¿hkñýÏZüÅçð׿ßñÿ×â;ùÄuøŽÏ/à»ß?À<6å$þl46઀ùh™cÞJtØ"*€öåfQzn°?>ìÕ,´Åö@HP§ G¤_-7ŽýÀ":0»ÜÎdíZF†$'ø¿X€¬=âAÉ™Pó•š+5<)’)YK à%"j¾Ò0ò¢HŽd-%€—ˆL¨ùDÃÈ‹"™’µ”^"ö Có×ê)˜ï k¡þø¿*äÿÙh-Ú`†#êp+ëÛ£5³#û˜¿°ÿÿ…W× ÿ¶/öðÿ%?Ÿ‚øù¹=Z‹ýüÎL€?£ýƒç[B~о¯[m]™Ïî<ØòþÃle½û 2ŸÝ½0‘íû:Ézû 2ŸÝÀð»!ê—pÛ îá'Ÿpü|"«Ãérs=è÷ðƒ¸³þ¼¹Ü\šfD)Ù‚ýõêþûŸm±Ç÷oíÕ¨_Z ·XcîŸÜ­?P?ð?ØLµwqì¯?P?ð?Øÿz‹µóÏ‚ýõê—ÈÁ­æûëÔ?`6ª‘l½xñýDÌ?™<öÛ.Pƒhgßôògãòз¾ýökÝŸùü÷ϾGÚÐÍg!ª~ueÃì¯ú!Z·ƒðÍظ´V`Í€‹(æîë?‘1¼6û-/R ÷àahㇴ/î¯.d/_æþóÿg;·Bߢ}qq!Û=?Ïýæþ÷·o6ژ͸mžžÞ¼ÉhÌ7ñ‰fúê§ãÁabS@‚øÄš!˜fP?ç ÂÄ’Œ ~$ä §“'Kñ!̯>'<:[ô_~IðÙg¯/¾üÒþHÿàAöí¤Àú0ŸÙ?Ð\y¶<Ȇýƒ4UžíOnÛ?@Ð?x'éô§ßõù»- àß«kªÂÿÌaò€9³‚¸ÎmP¿Û°þ%…^áÿdfw'@t1I{ù`þù¾wxø|ü|ÉAŒAÑKÓG™I*ÓÞ%€U+Ê*à7ªÿ7'zÿ¹±ñÏJM>ÿçÆÎó%ýçdòü¹ôýƒç“¥ý'îÓñ“=8Ý÷Ÿ³ýÛÆîø ¬îß&÷Ѭîß66 zŸéßfÇÇ2†¬«|õøXåãñQìϰ•1‘­¬ÿ2Z‹ýü_ù©½°üðË|Pìøí>ùgý‘ öo`·Ö?~ì¯þÍ­æ*¢«•óÎVîVï?™Q´þ“w¶þÓ­ þaÿpèið>è Š€ðð“'Áû ÿ(:ÀÃ_=jh†n¬_´<Ä~¸r|AL—Ùñ¥ ýûÙ-üßèÏýëØÏnáÿ†Dßô¯_`?»…ŸR¿ÕŸó_Sÿ¸±seý9ÿ5õ×ùÃ1¬=ÿÉ[ÎŽa|þ™ú¯åaöš9Êñ‹IfëîòÞ[ÙkóO£Ä£§bœ3Õ⸴ëól/t¯ç?eúõ‡i‘î•àü§L@]ÿ`ÿÌéj¯_ÿœ-Àë+Ç_”çèô^]?|t}ñ˜ø¿Ü¹uyéøËG¯¯ní^]eüæþO¶±f;¿b–Ïø{uysóò2ã¯ó}*•—vüͦ.îŽPŽ¿À|ÀHŒ¿ÔO›têÃdÈñ˜ø‡t†(`ü¥~Æ_\Ü·¤£¹>ÀüŸB\]ù|R?7úÕõÏ?__ÿäõæ¿ @F9w¯/y>¯D¯®^y}À"\"΀aÑÝ«žO®7úòz~>¾l¾îŒ}Ýû†ùü@Lß?7_>]_œ¶/yßòiþÚÎg–( ?êšÆìÀªÂþJû-Öͱ3ø+ýÏü•ö;¿þø.ç¿ßåü×ໜÿ<¾ûÝ#´_êÉhÞñ˜_ÆÀÛ¿¶ÿù³=Ýc„-üß!¶§{AûšýCÔK©4žØrhö‘kÙ:ÊHãkù¤ò·l­¿MŸ«LçŽ.(ôZ±ö‹ùcõw/ÀæöfоÁP$-Ñ7D.àÜP)öâàlÆ`(’–è"pj¨{qp6c0ˆ \tàn¼ð( ‡}H[Û;´#ýϲñæokY€vĘ8ü‘ûkÿÖÿfUë?ÿå3äþòçfñó‡û³5]-þeùÿO½ž/Ë‚©_ k¨€- ¦±[;¦å°Uî1h<îÇ)å> ,@ÖP˜¹ðÀ‡5æþÂý¡ ¼ÊÜïýícñ×êïÞ'üG'”¹¿B‹$% +¯pð8÷ܦsàœ§Nƒýx"<æÃg[Äâñ·×¼8¸Ç®˜9Nzû“»wý»ëô8Ø€=­o@ôþ] ÿƒý™ª±Ç’ùZkªkÍ+€ƒÉ=@ý•žüëþÐØk[ÌÿϾxÿVàû‹ïЫ¼HvXÔc¦åϾ±¼ùXÊÈCæ8æÿo¿}öuŒÃõyÆ‚6~ò$õëÐ):>‘«i0–µ¼zìÿÓŸZùG¥Âî`ûÊýí¿¾ÿ €€2i_¹¿¢}+ €€2i_¹¿§§Û°Xý›óO÷·÷­?ýÏ˗ļ!“¬Ä$%f¸GC&õ§ÿ9?'æ јd%&)1g†LêW+åð“?˜pN”ø!‡jÈìù%¶~û‡Ï>ãïKÜ>³`Kfàâ˘ûínßÎnö·?£ø G®:Þtð ÔŒÀ–ýÃÖmú‡Û“ý ó¾†ù™¯è P{þg>×1¿Óª6ÁÃüø/ð#—˜ßÛ•îq —ÀߥuÀq¨=;æC_!¿¢µ_*Àûé³ÚaUNŸïÃCžï×Óç»Í}76>ÿܦøøs§á Z7¨/|·üÖ#-èáÊ¢Þlý»»–ßÜÕ‚ ìèCý|^QÿóçÇÏWÕp`ùýƒ¹úgíýqíƒM˜Y{<À›ïBѳö~øSûÿÍ›­ÿþ?þO^À°ÌõŸÂÿžór 0Û ÿè¾è6‹hýçLÿ¶ñÅ©¬êß&î?º?‰×ÓÒþmcgsgµÝQÿVã# ßñ‘»üÈû¼0>ú¹v·¼Ï ã# ßñ‘k‡2š;ÃøØ,þ`þbíÿúYüÏ$ä´ÿëÀ €ð¸ÿÃÏxÿöAëß0üsQÁü þôo_|ñù£þã.åAxUê{4ê?1îRžGõŸ ¾ÛO›cÇꟿ¹™t#bõîë°ŒˆÕÿkØ~g€Ñø²ñê'CôVŽ/“ËWœøêñÑp¥gÇ0s'4û»÷s6¤âðU'4û»÷&Rñø²šýݻΆ”@<†úëüW׿Åýpkuýuþ«ëÏiÓ4Öž?wqíùóù™óà¿ÝÙ”( TóÏꢄøƒ¤<{mþ9À»»ÆðVBx}Xjh@íN¯?W;Ã@çjw¸þ þ‹o‹à-àú¿b/ã¯hÿÕø¿X]_áÀû2þŠö¯/ÁÿÅà°su‰#CJÆßËËmX}ÚÃà°}y²}býùgì€ÿq:c n£q—ú3üà`vt¨Îí Mì©q—ú3þr|ëêüs;żK»Ôvê.é »Üè8\_±¦þ°SWWº¼úŠ]žÏ8à+ú‹ ŠÀå—ìò|ƀדfæãKæëKçí£÷Õ|~Å<n:¾dº¾tÚ>z_¦ñ+§ù±ï¯ê|Ò­+ŒÛÒ²nkèÖFø«ÚïjüUýürüUíwýñ]ÿj|Wç¿ßÕùÏá»?ܳпȿ;°»Œ{ ÿlÿ¸þ_2¶ð§MˆALãmZª¼IÅÆ_²4kŒ*ô¡Ñ_LŒü³ÈÆû?‡ñÐsÿo|@È(:à þxþ—ãUçâšÐQ?ýVÿ;§5RüIxT©C´½F8™á'áQ¥Ñöàd†Ÿ„G•:DÛ+2 ³‡SW£©¿žbýZºëß/Ï€Xý³t×ÿ¾B€fF.pŸŽ§g‰Õ?Kwýïû!ü0€¸_Çÿ¬]±Æ@ÔÏ­lŽÿ®¸¯åÀ²‹?÷ZBÇOŠû* CŒÂê|°ñÁÈF@?i€ìàì¯Ý_ƒî t€,€Ø ä@ìþþ·`€g²b&ÉšmAýÀð?€ûC°‡³@šP:  þB~váb÷×0³œÅ ì5»¿†¤dþì°[‚…¸û×ò쟥k2Ø ¾À{ùÓ¦;-¯ö _åû ¸<ûöûÊŒØêwàp1ÄÙ(" -ƒþµee£yL €8Ì»U6Š ý¾õsm_¼Ø¾¸¿Ò!ÛvwÏAýÜ_Û/¶/î¯4@ȶÍM¤b]l_¼Ø¾¸¿Òi_—Àüô?ÖÞ·~½pHýÇÀ|‘1Àÿì¼oýzà úÐ bÚyD"YŽª~XR?.ÿ`}Ñ>¾7y ö7,ÀÈœ/ ùívôo£dO/€ìPu¢}$õÎ&¼ûëÀÖÖ„¬ÿ ¸* €™ þÿüx…“)mþšWBð¬éÿ¯Ãã5s,ýƒÿy À¼Fÿÿx}1¡¶<*ÞÐ0úÿ'¹*zo!†ç›Ï>~xH–ߟ¾œ>ß韅ÿ®?„pÏ×) ü¿4|ĬW€­¤CÿoÞ¤'¿ù €{¾N €yø ž«< !ùT,ÀÖ\ýàeǃû›0¢g_SÿD]Kð©µÀÆÆ»³@õŸÿYDùòP£þ3ð? ýfx€ÉLÿøŸÅ¯!•‘þs¦ƒx¼Ë{Wõo;÷ãд¼ƒ¸µ-¡Ëèî×îÿš›;WNrE–;:‚ûµû_ä6S^NrE–;:‚ûµûŸá/r’KûŠÕ?Kwýïû!Ûâ÷?rýö%(kÿ@¸ŸÁˆÖ¿úg©þïó/>Ÿé?§Ð®Ê¿xôE•·þ3`/K•?ÚyTýgŸB3é©ËmúRˆÒøüÀÈ@/ˆÒøüÀÈ@/€éø²AŸ€¾ÅÊñe‚ 6#ÅÊñeƒ>ý‹¹ñEp%èoîÿåàKýB¼z#èoîÿåàKýB\^ ú›ûyøR¿½þvþ+ëߢOcη²þvþ+ëÓÂÆÆ›uçOÄdÝù#ÕŠÄêèü»ù¿ÍBûsÒvÖ5&þÝXGû®óϘÿ3Gç“^5eÍî6@ƒÿº€NØÝvý§ð¿€N\×õïxß! æ÷“_>ægü¥à/ 2Ò×€æW»»W ~ÎR€iÁõõææ%¨¿‚Ù¯xÑ¡˜ñW@pÍÃQ|©ŒÑÄúügŒò0?ã¯õƒò­_¯†­ÔOzÐŽÐ_UýŒ¿:¤~ÿUžOëçÅúÙ…ø9õƒü/ó|Z?/ÖÏ.4À›Ô¯£žOëçÅúÙ aaýÓùy÷ÔâZh@wýŸ·ÿ‚ÏÅk`n:¾0]_1mÞצñ+§ùÁï«:ŸYv`®gš‚ÿ9G! Éš§ø«µß ®f†Á_­ÿY‰¿ZûÃ_#|WF‚•õßšLvˆ[ï›Và»vþ+ñ];ÿ•ø®ÿ¾û#Ý=¨ˆç†pµÖü? €«i€ÌJMÚMÿ2‚95p|ßÓ„¦ÿîx?Ô"*µd QÛ¤¼NÚK=!=( ½©1Ñê üP›º0Å Bþ+ì?Oˆ¶'wûïl†éŒ±ÿš÷tý/ÍJ’ UTƒ˜ÚcÞKÆúh¦P’©ê¤ÀÔóž®ÿ¥™r¦ÀB„Q…TÇkcº@…!Êhˆ¿¯ øwB€Ð ÿ|–µ’å ðYëYØlˆ¿¯ øwB ¼þ?ä§ÖEL ƒç;;áõyÍD@1„ìî.+ÏTöà`{[ Àý¼æ" ˜€í ýíÇù¿À_8ü ÷ØÙ?æV:)„ ôŸFÏýöcö/?b¹€ÂÜÜàvÉhøüçÖù0óB‡ö´ý‹ÿ5›Å;Ö•ØŸ(‘wG@Ãà?²Ny! €CWÚþÅÿŒAÂÿ7ì‡@ €ô@Ãà?^Ü–óá-;P @ ÿÂÿZ‰ýëéÌ´÷§W†׆ÿOñ<AqUž€raþØ÷¿måIÝÆ~üP1ó>{öí·U^LõyíV-Vl:LPÝ4ÞhЪ5¸œYÖ a‡½?¬Z°>šN`ã@Ø?¡ÿºû?|hûâþNÛ—´Àî.¡ÿºûߺeûRAfh_Ò››„þ—»¿í‹û;m_Я¯N^“†øXwë‡zœÖ ÎÅÉÑ(ÿPwÿ$%><™Ö Îv‚ó':ƒXÿÖähZ?Aûxù'Ü¿\þáÎñðG&Zó…ûëòOˤ˜úë@àå_áþ¸ü‹þéXñ#€¥¿üÿ› @Qª„øQ—Åøÿkü¯ø_˔ٶ˜¿z\mÿE8Ý ¹•,ñh®îØçÌn›E @0㪟7#K¨[|'ûó ô߀<äõ|Û?þg1W¶<€¯é£\fÑj.àëF|ìÿ³hO—ðu#>©> ¢GõÛ ðX@6`T¿M–ÍÍâ|Öß wÍ{¡ð^?묙¢H2Ž5 úYw" y/Ô7ªþsËGøâ{ø‰™þs‚å¿-G0à0î?7°ü‹o„ĨþsÚ¿©Í`Eÿfb +ú7¦CÌôo´)GÚý!\?ÜðÐt|”‹‘בp½½¡æ÷t|”‹¹©ÝÀõ{ú0´ñ‘1°!þ¾.àß ù?]Ç` Dú2mñÏk èZÕ¿aïw¡Äà‹Ï5õÏôŸ æQnœ÷šúgúÏòòóó¼³ý§õŸÃ4z±ÿœ!–ôŸJ À’þSi€?MÇ X?™ zÕø‚ë½1 Àòñ€ Àx|ZÕR–èòý×Jï¦Öê™Dü_5Ïó‚þúhjÐ(¶ÿØýô×/@Së´þ~þ«êÇ .Këïç_ÔÂbýœ?Ö€ ,=ÿÉäA+Îv€ ôú¹ë-ø?¦ÏF”'ªý†SüoçüßÌR1NðÿvÇÿ-y<\íøÆlÀ›7uý§×xÿ__×õ/Ä_À˜ 8ÑÕ°Bÿu÷øØyÁ¿¹Æ‘þÕ+hëÝ]Bÿu÷¿uKÇxÆßÂ^h«ÍMBÿËÝì P¦sA>´þþ¯^)k‡§½õ3þNë/™»kP>žfG‡ÖÏø;­?2wúIN&ºû[?ãï´þ-<~þù¸ûÿõ'ë/@?ÿ¿" CL†Ì¯$Cÿú ´óÿ )C"2N~)ö)Ë?ÿ/¯O¦.ÿCŒÿü|}êØ?š·Oçõ+?—Ð߹鸒éúÒiûð¾ X1ÍoŠ# “·Á×ÙÌn*Z"yØ¥UìÀõö» õþgþêíwÍÔO:¸«Æ,â;êŸÀ5`ßQÒ¶¯ÂwýüWá»~þ«ð]?ÿY|÷»'Šö«Éá³ß$ÓU”`ÀyW˜X ý«$è_ø/ÃVÓÊØ–ô Å’õÇî” ¨€¥è€øè‰ôßàƒqР{ô¨“š’y€tÀªÿñ‡Ã]ÿ;P€áþ<›q9ëE¢ø“ÀÿDþŸƒûÕý ìW@=À üOäÿi|Lj$€0Â@ÿ!òŸ .Ñý‹€ê0(Œ´È Î,¦dŒÿ›@€W0â?*€FþG 0sœA ÿ‰ý7òŸuï1š€ÿQ4ò?ñ”šÇEþÇ "€ƒ€¬ýq`UÛ™¿ À²òÌ_‰Ð @ÜX±þôà  ‰ÿE Aÿ3dÀ£GÀÀˆüUÈýýŸ€ÂÿŠ6o*¨Åsûÿuý€žÛÀ;mþ‰8ïÑÜ:(€ÜNbýµù'•ÀŠ€€Èö2mþ‰À#¼¢¸±PÙÒk“IÀ› À Ѐ¸èø/€ëÑѬ ü±ãóÿ‡(_M ò/ž}Ÿ&!'ðÏgyg¶ø <¡ÿ¡\à‡o‰úoåß`Ùöí×©ÌÆ†í¿—þ[ÿà¶zrÒ<ÂB s»žniðÛªÀñqIXÅ™UO€o(+{€££’°Š3«ž"”ÿèäŸ ïo"h_:;ÛÝåïäÑÿÜßDо¼¿ûû››üíañßÜ®h€Š }Uû%ñÖ|ûŸ‹‹ô?ˆ øò¥ýÿüÆ àì,ý"ˆžŸÛÿ`êçvníÅ @އk„ ¸ýôt›û×ôÿ¥ýƒ;ô¬ðP ÂÈþÅñÿüü3DèpýÇ!@Es&ï¯éŸ„D§· €À!üOÿÐüýËTï€ÂûFÄðŸIv¦1¨î6Væïï0³À0Õݦómþþ…ç;P kyd½…hÏ÷äðÎç?ÿ|pãΦcχç»-·`à|%x•î7H:´ÀˆhÚï½÷néÿ…sð¹0ô”`Àò?ùcä_ËÀ—E@lû¹¶èå@lûH…&lè·bÛÝw鋚(`ûÏàìþÿŒc?&þà@0X=ýgð¿ßéàà¨b¨Àÿö–­ÿ þ×°ß¾åÁ}ð¿Ÿç½3üã±=Û’þÍðÿÉŽÀòþÍðÿ[3ý›"ÊÀý"ÿ—09†xȸ[ã£qþàm……ßwk|¤k÷‹üOé—oAȸëóoÄÅÈ% Š¥ PJ‰üýg5ÀˆЉø/‹?‘ÿáÆ+$ )àö¯½{~ë?±ýCô[ÿè (Çö Ðoånú‡þÛ?$ê7Þ„Juõ¿¶1kŽ«@ÿÞÖº÷ŸR© ôúÏêG{ÿ©À0¾8ýé˜Kç0Ãj~|qþúJ?2‡Vóã‹ó×+¥Ö/sUãK€r üAÑåû_öÿŸÐ/9,@ùþ—ýÿÍ›å˜Ã”ݵìÿ¶VÿpþVËÿŸ¯_üÿJy«e5_ÿpþVËççëçü©tãçW?Â,?.ʧp€åçÏE1·²R‹ÃùÛ „þI÷6HfÏãeÎïVþÌOã P„§ÚTE{VXbm'Z(^ŸÖõø§ÑźÔõH–p0Þ3Ž\ÿÖõø/:PCØý]‚ü³áø›H>í¡ËËÝ]þN@þ¨ýÏø›Hjòkœl¢Ô¾yŒÅs»¢*€“m!àE¸éŒ¿¡õø—¤Ž€)kY#ò‡xfHÂÔªÛ:ŽðÎñA@â±// öÿ’¸íþy>£@ý>ŸèpBÜ¿vÿ<ŸÑÐc€gÈ®Ï1dˆãežÏèñ|"€Se®š°•º¦»ññù÷Íígž?7_˜®¯˜¶Ï¾¯ {-›æ¯í|†©Þ5Û3µž«÷_K Ÿ< ×Ð~}jháFøkèÄ_ô?M `À_Cûñù†¿FõþC¬ª?ð`Uýÿ3õøn8ñÿß ç/¾ãüçñÝpþâ;>ßðÝïžèaÅ4 U:€’â$º|h€·Âü4üÂþ‰j‰(˜_ÞÆÍª!F)Ê„ùâš²<•$@Ûˆ±CþæPO]“pe I¬–Ù?ÎÙ.&j,ý—ÀMЍ'0¦þ þWú?;¸Ÿ“ ©bê¯à¥ÿ³ƒñ©T©bê¯à¥ÿ³ƒñžT©F±ÿÓ^¥GÑ›ŒbÿG¨ª(þ×ÂQ<Àœû‰ôØùøOÈ‘’µ†h±ÿÅÌ)°_ºÿ‰üùnýg0>æ~¿7ÈÀU^ü=Œßÿ§[®øÏkÊ{,méþ€ßù¬«¼JôX€"J Ô€rPýß3äfæ…„µ]š€Qÿ/k?ëÜßа–€ý@þÿ^ÏAá"pæ'>Ôò¹ß•ÿþ+¶_žö¥Iˆø-”ó¿ÿŠð€óSÀ €_AüþM-p;ýœÁé`N÷ý } üoÖ¶"jaÚô" + fWAÿ üoÇÆ}:}oÐÿ[ÁànËL}>#}pÑÈW8¥«ç›\Ó7pýÿùé¨BhþÏóÍ<8ø_«øŸE6 ±N†ÕÍÇó_±Oâééu|óë#Pàö¶ºùxþ¿çDZü¯|~þÚzXÿ|BJßëÿ ŸxrñùP?žÿ›âêM3â?bÊÃ`Üe‹¯"†|ô`¨XÿšÈóUpN˜úèÁP9 Šૼ`È `¿)Tg m!ð ‰!þ¹‘~3Ì(ýb…ÐÉj¬§³Ù²ßlŸ­!öçßö”¤|­Óø¿S@é›Ìõoÿ·‹¨øÿ¹þMã?Ñ ñˆ¾Iëß^þÇöï¬ÏP€À–G0>þçÂèûo(@à?Ë-‚ ÿcû×÷ßPW¡N `|l±ÿÅÌ)°oÄ¿±ÿ‰ü7`Fà?þœHÿh|ú!CdŒÿ¯õg²aûúO}ÿ›'—–¯Å?Ð[ÆDßÿæ @ù™ZDî¯õŸúþ7OʦÑå:;7ÍžöŸÚû XJÄo*Ë<ÐÆ—x‰ÜQØì'`:¾LÄ; '²F×§ÄLÇÛ™ðåQÿµ p|Th¿šwþ4!€âke@óΟ&àP¡}þ„Våý?MÀn¯tþ(õ{þE ôú@Á¶ÑW|ó !8(õP ½þÑù__æü‹x˜=ÿŸ¿ºÐ,œÿäÕÃËm€–Ð`áü7N¶Þƒ(Nךm–iigÿçÁÐÖßBNãÖÔ½ZQ™¨šàðÿàþÔ[ÛuþÕï‹ÿo€é×§@¿ø ÿU½¯ëSý¾ø?¸v:80dú¯î¿Q_¹ù¿bTÿó-J `÷ÚmÌÿ  ú?Ã* ÿo^ÿù?±8üøÕý—JÎø›Ä5¸0Z™àÀ¯î¿>f#}Œ[€9ˆQ›ø©ŸW¿Æ_õÿx¶‰ `ü½Æ×?õsq |TÑÿóºüŒ;€9°¶X?"ÀGý?D¯ßàœÿ×('‹î­¥íH\Ç 7š/¯wÔÿ–÷u­¯=àýsÓñ¥Óõ%Óö™÷iÚ[5Í/ÜÞ—EŒ¿¶0½ÕÒnkèÖ:þµ_FÛoytü5êàFífñרý2ŒÚ~ Mëo£Ü•äñ²úÛ(y‚ûÕÒúÛçd §õw|7:ÿ×/Sÿ,¾ÿÅyêŸÅw£ógL³þÂw¿  ÿuäß”ÄþŽ}à[Át ±Õ4€}Mü’€¢ÿ¬›6` œø`œ‡f,-§ƒòú/äüP›`OcLþ£ü×|ÿ+ ¥bL÷È?õ=iÁW™fT¿rþï¾ÿ‰ ¨c%ö¯»?~ÿ¯³é_~ÙÓó_S¿¡Æ»é_~U[.±Ýýñûg7‰RËÀ‚½Î0¦ŸQ*dð¨ÁÕ¿e˜è®þQþ“ ˆ;@­]†´©ldTAôÏY£Ð]ýÅÿºþ»V øµ´åTÏKh© óOÐ?Ñþhü)ýw@@l%áÛ·R®…k¦|’„7™° û™ÃÅ#ÿú£ÿÏ­®ý& Ђþ‰ÿO€·ºâÿ¹ÛžyÿýõýbTü¿„Kùý 9€’Ôrf@‘„HD ¤õ  üþ ˆ@Iê @@ùýØÔŒþñ(7é"^E ¤u€ýj~ÿ„HD³m4 ߥûŠЀÿ̹¬‰$äßÿ”§Wy¶¶^ ó=€ïÿ·ÄþW9çòí·i~[x|û z D«žL'Èì¤þæÖ2V бgÿs­O@ËX5èè öÛ|Ò¾Äûêú+ ÀýÚ—x_À@´ÿ丿CûÂûÿŒûË=ôþ üÑ@€ö•úƒ÷ úÇèQ€HõïôÑÿ0¢‘ê— ß¡~ý£‰0/ñ]Àý=}ýã Ø' ðŸÌQãÔÔѰO.@:³šýo÷¯€áä¤c þŸ ƒdØ2@±?yÅb Ò ¢@ß ØŸ<€bM°¥pSbð È 0ŽÐMì/¾VéyëI*wöÞFÔóýþa!ÿç›7tˆKf=ß ÿ?ü¼LÿvÊ!`$‚ÿ·5åi€äaáÑô ÿ¿·ÛRÿI¼÷nˆ €rŸÿç>W ¼ð¹êýÿyƒÇ À¡V¿øó Lÿú„€X ?D¢ìÚ|€[ÛHîÞì> ÀMÎ}cóÝîðÞ{öŸÂþhzÚÁpÊ ÷@ÿ©»?QÿaHUFÿ{sJð¦æþûDý³ÄsA —-õ{ÿÖ€ Ì ý[#¶% 3ú·FÜ”ØØ˜öoÄÿ—¼£˜¿Á¿Ëçøœÿ_òŽ)@ðïò2èìÑ@ÍoV€öÕ]ý£ü'w€Z»€ý“ö/¸¿­“ Ð`7þéðÁ§%ÈZ¹³¦y*öWzÿÕ‚õ«ÿ4€?ÅþJï¿úO|ªÿ´„?ÅþøBCÿ‰/@õŸ± ïì´þsFjkjTC eükRlÁTãþ3°?¶ÿi0U|ªúøbk'³¾zOO€Ñøbk'˜¿bJ_Œ`íó×£wõ`|)ïÿA`Ph^ hÚÿ-î¿Ôš@iÓþoÎÿ ;7 ×?:ÿŸêü‹gèõ«Ð€W¤¸œ„(ë·õÎ_üÏùÏ0{þÛ¯6~|“(€™úë¬!¶/™ë' `¦þ:kð?†Äú.üÄèOo ܯAù ×U–~Ä/`püûΞB´EØÖ|Ô4€*/²À ñÿ!Þp}4úcÝÖ:4v("@µ{®5°¶õþà€1õðøyÇ_?†€ ï«èöŸ\ßF| ó°Þÿ¸ûßä¶8þ üÑ@…™Ô¼ŸÄ´Ž¿ŠD p¨?xß Œþþ;d)8Ôß´hsÛÿ?Ù"ñw¨ù?ü_úGöŸ¡'NÜß¡~äÿÔD4°Aÿ¹8p‡ú‘ÿãÊ!®*NIpr¼ŸÛ<Æóõeóöñ¼¾YþcñŸŸçÏMÇ—L×—NÛGï«ô=àü4¿9oN¥üÆÏ¬Ý 0rø‰.|Òtü5j¿«ýÎâ¯Qÿs«úŸ ²ÚïÍj¿…¿¦õ7‰ÞÒúpA÷Ø*³ÿØ…¨1(³ÿX°+tÀ.ÐEƒÿË "€ÿ35‚…’ÐùQì"qý¯p€ü7ÀÈþ5"`,B ¢ý™Æêó¯3€ÀÔ@óÔþ’0{É Ð}¶*ÚŸi¬>ÿ:HL}z@þ'@9t. ÄÿMû§Ï? €»‘ðI‰ÿ›öO/w#.àƒ ÿ ~‰þ‰ñϱ¨T@ÏŽÑÿ;ËsÌ·ýõKhôß³'Ê1=ƃþEøIÿ§Q&1˜9U€” Ù™õi³<Ç|kB‚úõÐ(Ób43c•g,ü^éÿ²@%÷_\¹UD ÐòofÊÛ\Ve€°˜ë_ ]]1ÿ•û/Û”{¬®@0› Ðê§÷?9yªn€‚}‚l€š+3‘=>~‚¹_¬ß Ú}™ íÑÑ×zý¿ý§})þ¯C@Ú—í×öâý§}áøÏýmíËûkûñ#ö…ã?÷·µ/ïï>ž8'Ç/Hý8þÓÿ´úí¬ÿèð€ÔãÿÉ!Ó~í¬?Òüê;Åñ—ŒV?@ Ô.ò'Þÿúü³÷ áÈ €Þÿ:ÿG ÝpŸY‡ +æÀ‡*án‡ˆõ_Ÿÿ`~&úYûšÙUYÿË¡S¤šõe/À¿¬ÿeÉWæ(yXË À¿¬ÿºûóÓOg« Ï‚Ñþ.kæ ¥çûF–L¾îÜØlQ½íùnöÿ„ÿÇüOøBØÔ Ùÿ+vœ^o…pS€fÿ!½Ôóo†pS€fÿz^¼ç ÿ·qS€ÂÿtNQM„ÿà  À{ g°~Âÿcþç- `S€²ÿÇ£—Ž Æ&°•#,Ó”…•@K¶>ì=¦¡ìÿÉ]ÈQ ¨l†,ô˜žpÔÿÌRpð`€Ó| ¾‡ 8x0Q³ ¤ˆìÁ)RY=‡%=ØÐó?êf1€€àÈß9Âç[ÿVÀ;d0`¡+àÑ6Y XèߊعIƒ†þíYÿk‘Ú²:ÿ×"0Ü_Ú—¢ úw‘€ýSgÍ%ÐEƒÿË "€8ÿG°ˆ€ìgU„@ÒýÝþPësý/ù¿®þñ ¥ÿ«ÿ,. úO€ê?)ý_åS.@å€GÕbõïýgqÕ 0õÄ›f7@üè?RSbÿ@ÿ‘šJ€6¾dþjÀ!Wñõshšñø’ù«!¦Š!§0_25`Âçõ `•ñ¥…ý5ß2ÿ5빚úü6´oÔ|Ëü׬ç¦0Õz…ý5_žø·ZýËÎ\ð¿!^ØÔÛYë_vþãú=¾’¶ôj¿I0{þ\uã¶'%V*€Ùó÷’Àþ¼—öÝÏ?Fÿð]ÝâÙ°¿3ÌPD,bþ©úôà0dFÀ8ý7ÿ¡©+@ÃÿŒpÝé¿_ÿæÖñ?׿¬þýú<¾ÿðÔ߯‡þ¬¿Ô¯×ÿ5èß°ùkÅÿu.Ç I@ü ÿàÅÿÍbÙñWÏ~?"†Í_*þo.cŠØv°‘àÏúqügümõÇ(A}x…@êWôÿøú­gk‚¦ì$õƒ¼[ýŽ¿ÖÐ¥ ?„üs½ZýÞ_ëès!R?!ÿ^®ª?þ#Êå(d“°<%¼T­~ŸÏ“Ëél¼‹ÎÏ×í‰ÆïšߪÏÕgœž¦ã ÓõÓöá}m¿ršß]û«ÛY‚ñWöLº\ùÉ4üµ¬ýŽñײþ'fÙ†¿–µßà¯iýmˆ¸ú·¹ú ÷osõ·ÏÓ³µþmŒï–ÿß-;ÿ1¾[vþÁw¿{ âs|ìþËð_ûù‡ÿdÀHàm€Ö~'¢Eù ÀKÃ-kÄ-ó¿ÓÑBreõ¯µÌÿ&è‹á î7§dÕ×Gî_~(ÝíªâZ@ ÷G )ÆøTà_&àeÂÿ•ü'€‡x­ßó„ÿ+ øO6ÿû{jbH `)&€‡‚ÿý]LO€ÀÆt9À±à쀨ψÎä%H’Ÿ h=Ëìöš'@÷ ‚ý#àÞ¬ †ÿç YÇ Ôÿ[ÀlhøppËr¶Jý¿åÌÆ†ÿƒû7•ýc«Ôÿ[ÀlÜ÷&¶0o®ÀßÝ! ÷TMøA” ¼áŸ|àýe:ŽAq3U @BÀûûArR—ÀŸÞ þÒ„0Hcë<&ÿ’þ·• „@RœÅäï_ÒÿøKB€ƒlÆäï_Ò3øK€¯³ÙV¹Ë:ŽÜm¢ˆÙ ÌÏT¬!þÒŒ2`6iÍ3fò"âTþÿ”“XR^‰lSrjý¯òoò-~G‚A€aÌ(ÒêGSÖ¾Üþým‚Œõª•óuy–ÇÚ?LZ[óý“¼¿¯ÏúþúÿúB>€4¸¨àý½8ÝÙ¥ayYÉ•¼¿g{Û›4,ï/+ùÒ¨Àk|þÏ‘ý7ðŸÐÿ×8Ð)]¼Äú}Å+g~qŠì¿ÿ„þ_œáÀw:;§ÿ9áUŸÿ½#€9ÿ‡®pàìŸ"°p´jgP.ŠÿÃ|FýƒrdÀéÕ¿è(þp›ž-åÎ9jg ä?˜ßþ[@ýƒr§Eê¤/öWõ?KR&k¬ú0ª{¤²ó;ð_ᾆ ±¿ýy¬—òIÀÚÙ¤+Úü¹™Þ›˜B“€õÛ€<ßEèû#@# wáù~höù{ÃDûïaT¶#š_~ôÍèÕ´ÿ0µsð½ˆæ—ý»,áô@ @;úCÍ矣ô@ÎQøœú#é×µýЍX€¨¼·Qÿ"§á ØŠ À@Ðs<Üà‹ˆOC:Ïö,Tè(RöÿZ€r ƒÍþ_öÿFàØo†‚l=@à5:€|ìÿϼkÀþ#·M0þCshÿ¯È`¿€?[|ß¿«x0ôofl@¶æû736 [óý›­Þ¿½Tü|§}âÀøX‚€/)b|,•Ë€´Ï)b|,¯S–;=h žÁþ=è¿ÿN Áþ`Nàïk# þÐÖÐô_½ü|Ú Ɉ@//qÀô¯•Àþ  ÷Ÿ¦ý§ÁGÝ‚6Ÿþ¯+´€ÿ)Õ©’j øŸ àK(_6~¼º”FªãËD£ë@à”k2_6¤ ÆA²®ç1™g£âçÿÊkA²®ç1™g£Ìÿ_ñãZ¯ü_LæÙèt@2Ôc²µþ¥ç?ªK³ì<0ªéùê¬ÀãÇ??|üY½J58wþ“ *x»¯¶_½"`ñüåôpw?zïÞÀé:ÿF8ïl=G´9iîïÜ@Wö/Ç`ìóvÜœjþ÷.C€(RÇ;`Fó¿n©Þ8A4"ƒ|÷}é×?ŒV¢$øfɰP×?³qüŠ/vü}E.`¹çÏJ>×ÜTpü½>ÙÙåzò¬äpýÇ-@%Çß«ãíMüzí¾YÉ@^ãó¯À˜ÿ@˜ø€(î3þªˆÏ?툊U,€ðitüUŸÿã#‚>ü?tEmŽœìŒ¿'—!q ‘¨ØçÓÕõ+î/1\þ—™p@ bŸOWúû|F ”ƒ\ ÿ¿¬9;ïoãùø’ùzXñ¾ ˜ ‹öéø’éºþ Óöá}m¿ršßC÷»ŽßàÒf þ¯*läÀ(L`4銅¿–¶ßþZÚÿ„+üµ´ýê‚¿êg²u|—úÃØ±µþm¾þ|^f³#|·ôüGønéùðÝÒó¾ûÝeô÷wºU¶ÿò@ÿŠ·å÷ïnšÿ¤ À ŽtÁúÁûÊþU$@\LXÂ%à_óÜns Q¯Íÿ?‘ÓCzMà|±šO@”“°¡VåûßðÿÍÒûKJ£” @eP  ôþ’Ò(A%PYT(½¿¤4J@ÉTÕªW¥\ŒêøgAý¾ÖzPûüßE* ¾íxûã#Ô£º¯PÛ¿à±­‡€¶¿üß=šÀŽÀŸ¨ÿ„äaȦ±¾û¥¥ laûåþO,€ñmÙÿco5ç_GüÝ ö‹ À#æé?KD9¿§Áún?}ÁàZþ¨OèåOŸLË›0­éÉ ®Ä÷÷{¸‚jÒ“'ϺW¸@Ÿ×fêBí5A®”Å%dÓ­oâ Í0l’ ·_c’ø/6šUX×/s•ûKâ?îoÚ—÷WBàâ<÷7r&þãþ¦}y%ÎNQ&>ÁÕŸÎFWúŸÔïe{}q|ùúe 1¢xˆù!õ{bg‡ÇçL=´Ï£ +@ ?õû˜ž‘ ðì”Ø5¨5ÿ/ÿ“05€ÏÒ?ì¯ã¿ýƒÍ3Ø_Uì ö×ñßþGCŒ@ `ë¬Äþ£ú_&ÿ†ýá<.ìg¾'èpW†•0a®=ªÿeòoØß)V€8fEõ¿LþÞÈòðx¨^H×|J:̦àCR^wnÜ €óÿ½;ú¸¼¹‘çÐ,äißBù¿(w¥`šÿ û›Ì‡‹pW ° hC¿ûî;ï¢ü_€»Ò0ï=Ôm^ì¿y€òQîJÀPƒü˜Ê»û“ù— þ@~ Ã à®4 @² ܺ>~èé•@©«\¾ zxz¥Pêqåm¾ z¼# €RØÙÀck¿““âð8ØÀ €üyR·&°Xû=³#âðà)„ø;ÛœðÍ€¿ß÷óÆHnð•7þþñ=·ÚÕ¿…؉@|æû·bà_€=ú·7ã_€Þ¿] ÷ÿõ¿xý{qàù/Sÿë3äþ‰@ Yöó6žÿ2õ_ì#÷O:EÏ–Ï%l9ûK‚ÿü«õÐö‚þ{H@¨`$zð hûåîÀþÓh€Ö¿! ÐûOÌþ­Üh€VÞ…t÷`ÿÉ·ëý'[4Ÿ1P>´CTn¼sÇ@åOÉßJeLêÏ߈ÐnOt3ÝÀbŸ±“±îãË„¹VdÝH¨Î$‡ìSW$$Àç¶\1„<Ÿ©¿+0Üߺ>”& üü<ýmóö_úþ¹éøÂt}Å´}ùû–Ló`Yç3+ »6àb·5ôcÁ_+Ú¯EÁ_+úŸ­h¿±Ùú¯.uqêýÛbý'I‹Õû·Åú ÞõoÖ|·âü|·âü|·âüÅw¿{ <„ú_M=¥lEk—·±0©Hóû—+@ùØ%”¿à…p¢\ÊžèØ,|0:ªÿ-( àätì-ÿÁ«‡ÿ7ß‘h°F…5D@†lDÿ_«¿=YBÿ›$@‹ HØ¿\PþxMŠc}‰ ¨¬Ño•ÜX£*+€Úÿý¯’ë`T€G‚þ炎’ΉT°¿âÿË×Dé%„?$µ6}r­+Ø»ÿŠu‚þËî¿t½S`„øóT_oا<·L ˆå¿ÔÜ,°ìÀÍû&l9¤:äù{£üà³rj:þ›=ÕŠÿsãñéiï/«’|€ÿ'®¿ÿËæýß[*€hä–€{±ú‡ €0ò?‰K &Ê€O€¶ý$,€àK`%^%` ¸'žì€QÔõ_ `y¨ØH¶$‰éú"B¹dxñ¢tÊ%(wòÙËñÿ¯†f“ üëï!T¯f‡ò.È±ÅøÐ&Àtü­~uZϰ…Ūš¤ù#Öif€çp7û£úÿÑG­¼1†üÓªDþah_iÑ*xdw7mKo€]ÚW»¿¶/ïoÚ–Þþ2›´¯vm_7· ù§~ ý§ÿ¡þÖÿX¿ýOê'ÊŸÐ\å©¿õ?ÖïIýÜÖS%1ÿ£Ä$Ö?™hô/€dT õ†Ø?Äã?ÿvmåqÚl=qXÿ‰Ñ qÿ­0 `œ/Ð/ #tÿ—`GØ©£àbD€îÿìh؋ʲ.F°g³/p~záöË+NqxM‡‡FÜ@”úà—,pú¼@4Ï+³ÿ}~+¶ÿ¨àP@adä~°Žùš0,5õBˆúYÌþ·ûnlÿQPS/€¨ŸÅ\€ÿ”SL˜ ð¹1‘§;*Û9C„vŒÛýPlÿzè0K€ÿ±H(X˜< àõ½w#X˜< лïlrþ•` €ûØûÚªþ þÿ€æ „ $€ûØûé:Tÿç†`„~þ÷¿sÆÈBöÿ÷bM;ð÷?–À= ÷o;»_|±``¡›lßôè~€m€…þ$ÊäÌ Zßèý[ÆGP¿ÖÿïÀíÊÿm0>B ñ.@ë?Àþ®¼ŸãÄd|õkýG[€K£üŸÇ!ˆ¨`Åÿ—¯ìñÿåkp~øð¬ä(€a]ý§¨ŸŸd€­ckÚŠú)¾kålMûOQ?åÁw­ÿdËþsª¿Õ©6GÜ•[Öþd˜S%@0¿`?™¦ÀT Ðcƒþã—0àvBBôñÅ81Bw@F| €f!C °Ææ¯]Ã(ènŽ/š™cj.€RKtÅè×$\$@Üç+F¿ V^“p=!û=€}²ó­8ÿ^?Qß‚H€š ×¿êüK`8ðÿöÍŸ~ÞÞVpÉùƒÿ· À‡]&`ñüÁÿïð^€ÈнЋ¶”€:ùwÍÿèTç¡ÙkþÏ$(u€Ýí€ÿ‘ÿ«½PQí@à# ÿ'økH Ä @È?ã…È? ø¹¿ÎVƒ ôö—Ø?·ñ×O;þJ/àùÏñàÜÆ_‰ÇßÔo¿Ìÿ©¿¿ÖïÈ“úMø§ Amüµ~GÚÔªSpË €6þZÿŠÔ š<ŸÔ¯d‚ŠÔïó™úq@óç“úÛóiýy>­¿BL™ `{>xÛüü×–ÏMÇ—O×§í³ïkÓùeÓü&á·¼óùµ…|ÞzUûõAòù^Õÿø ‰¿Vµ_¤ßº~ǯUçßñݪóïønÕù;süýûåü_ÐÿjÀx þå à^–í©‚Mq6W÷"úøÐ Šà”æUù)³4ëÌàù_à!þX!f+ÀÊG-ÁVø¯ƒLÒš @<ÿ£Ø\š`\þ[Nc þfK@8cÄü-§±Y‚ûC˜€_1ËilÖ£àþ¦8+ €i&Ñ9 ÀÿD°býkY¤,.ÿ-ðm@õOP¤yB\Ìšõ_þ³„þzÜ?1áÚ¿€ŠþàRëŠÈV¼úË€E›¿™K°–Xåz¹z–G°Œ&™Œ7Ý?gåf,I@Q¾žÿˆ3@ûÏ àE¹?MýÞuCÙ3KP_ ƒM7˜ÙèL€7oÆõ¿–øŸqÿ,§§j&ûûYKXâ‘€ ØS°¹þW"ÀÿSåî]5ïÞë%Œ§âþY€s1õÇõ¿–ø_$´¹ªøs?h¿‰ÿUý´‘ø§‘àøo¾¾ïÿIÔ?’ì@4ÿÕ”“òo~0'€ )ÿy°êøo®¿¯)GúÏïŸ|[ü[y°øO[XX*{R®þV!`Î?á¿‹[l6WÙ"<(üwq‹Í´_šR<ÿuþÇòçk_ÚÿM¨Üžÿ:ÿ_ìêùßÚ—öÓ*÷‡ç¿Îÿg›zþ·ö¥ýŸ"ê§ÿ¹x}eýý·úñ ~¾âÙʼnõôØêÇ@€úù†ûgGÖ?ÁóÒêÇ3ý–Áþ¯±û“ðK’°§€4€ÎÐ@ ÜŽ" FèL€Ðè´C lEP£tH&À³ÓDþÇ ð¿è_*€Cñˆ >…ÿEÿÑX2"@ßJ½ÿãPø_ô/À¡xÔö«›)ú/÷«ò°›-÷G„zr}0K @€7pçgÕÿè Fç#Èç¾÷^$x/nü~ÞûÜwß-Àìfë1G70ó;ï`v3nüî6@Ì¿¹}ásýe€Ïý¼’H‡F bþøÎcûwÓ']à@ lÿeÞ&›ÁfrüÔé×O³¦[»5äÀ77P'¨ãÉbв{ºA(€:‡/¡Eܯ}Óƒ-änlLàî?yðw;48»ƒ#ìÿ.>þ¿÷1 €†9¿ ö—ûˆöþm#ÆE€Ç‹ýÛ„3ÆãêþdG`±³ÝÜ„0ißFïß2>–»ÿÆÆß6L€¤€1ªÔøXîþàÿ €x :@åîþ7_k|ŒP@ cý[Ü©tU“´Xÿ¨˜ «¦ À8÷Uõè/÷¸¨ÔòÙíê?AýFü›—Ú÷Ÿ ~#þãÒ-ðÿQÿ ê7âŸo¦ô_íTÿ9K”¢js¼]-à¿-`&à˜h^ÿ3¹_@üDÅc·›%é²€6¾€øMt†ÝÀòãW’É€Âøâ–/#ýlæHŽàñfjNÄ|п’€¡j§Iþ'b>è_üßó$åZL剸úÿ—@v¬cåù·úAü̱û_& ŽHE 0õ¯<ÿV¿QüìÿoT ÁQ ç/ê¿Rà2ŽIm0>íÿGQРŸÇÿN/GøgH 8‹ÿ‘6‡€r,åü›KP)FøÿÍ8 @'怩;@#ûH ²îeÈl³¸rxþëüåÏÆ•´ÿó¢=^^ëüO<žÿ|LBGû?/ @ô ýE÷›zþÇÞ£Ì7oª´ÇVZþÁ÷Ç­~|$¨Š†¢å]Ë¿îý­~|$ä°q ¸‚Àò‡À¤Õj€[TÌSrõêgë×óàŸó'€õë'rm, Aè´úI @ývv"§Qç¯b¢@ésÍÌË×Í×ÇïŸß²ÏÍMÇ—N×—LÛgÞgvï©Àì4„ñ;Ÿ_[Ø €UýOÃ_+ûŸ†¿V¶ß˜t0XÑ¿ýÔïøµ²þ†ïVžÃw+Ï|÷»'*Ö?®/ýwàFÀ(òz´àÊêEØo P)ø[AqVE[JØ_6ͦûß’4T}ü‹±½³´ˆã-³TOÚ`ÿH0ž‰ÿo¬Å4IÀ¶6+dB®¦^ÿ% Ø´+Ö¿’Bvå¿–P>àuÅúWRÈ®ü×2Ê\T¬%…ìÊ-3 |ÀYs1jQÿ‹|bsùò‡XLP.ÿAüµŽ@S à4H¨bÿ[ÎÐVôçæòÄýJ àÓÛ]üošpª  Ww~§d›×ÿÎ&þ­(VPÀ­’l^ÿ·¦åz0Ý vÂÿËëÿæ}]&NÅõ Põ/!ÿ þoöÿ¶íTÿ¼¿Âûž0ù%t`&îýu:ÓÓ& $€N妵¿@¥ÿL”ÍfÓ,‡ÿý•þS4 o§%õŸ¨?/LœU ­ ‰ý7/š¯ŒB¤h.ñæì¶ ¬ýº]4@^Ê7»rXíMØ&Ï^ àÅ‹JUžlaû—¨XÕ”êIðì‡*‡æWyÿ¿}öý7ßXnåUþí·þx‡p0[F‘0q©aq«'kcê(o¬ÑVOÖhzm_xýÓÔÊý_M€×æDÐûëmÂ럦Vîÿ;¶1ó¢èýµ}áõ¯@Üÿ·mc漨þÇúIXnl¨ ðÚü€g±u+øF:Àr`CM€ óîóýùŽÖO¾r`J`ÿÌü€jýÑ?ÞÛð¾”L@¤qPëþ!ð¾2(ÿo@˜‰ôÞzRÿéþ¯ü¿9ÍAqûvIÿõ¿– 0?1!üñÇrÂï-`‚tùÕ›Ä _ÿc&g€Ly—‰—íiû_˘ Þ©Èß[€7oZÀÁó7`ÿ…²À ø|?Th¼«ÿ­0/Bà°€¿‰¯ÞüN„“Uzcð4z!Dÿ(Úƒ €Ø €ÀBþˆþE8ÏnƒU<Œ0¨'`€ü÷Ï ŸuëòGôÞ›PîJ êw` f-ü¯k.öý0P~ëÁÿ&ê` âÍ>à€bŠÀå °qð½žo9{|ðóòÿ€ôÀû_¾)@tÿ?†ظÿwöô8Øÿ³IѨÛØÀþÿPA&€eýÛd‚ý‡KC&€eý|)Þÿ\(2 ý›ãcTúûÛß°í—`%S®ñ1*ý‰êþ\,šå5>Æ`ccVA’ R€•Lyÿ¬¹üù3fíO­P.ÿ ÿÄþG`ª@À©ø_Åþÿ“°Ò?Æò¯ñ?ý#$€Ë¨ÿlžÝ_Ty »=õŸ±üküOÿÙ’ÂUÿ¹‚è¹'ò_#`HÐòÿÅ`®ÿÌ1Æ— :\™¯~ú{>îҸʾo¼kÆÔŒ¿4ý:ßÕŸYØä\^Gœð@<±Å×´ÿæ¢@PKsòt§ùr~6]Ksý›Ó|9?³,–Ñ¿9Í—#@4†{Íù§~\ÀAê0CîìI% p¸È¥þ5çÈ`;¦Ÿß€ûomCÜzó#$ÀÌùóµé0'רÿ/'$±càž9>O‡¸qŒýÿhÃ?ù –fÓ×¾4Æÿd¨€Á¥œP£â—?¤ÛS!þ.‚€{ø«Fÿq@o´pCü_±žšÿÝáôC¸Þÿrÿƒo+%ÀU¿ xý3~”û¿š¯Ìˆ ã¯C^ÿàƒrÿßñnš @Ç_ÿ ^ÿºÄý[zŸ¢^^9Í_†ñ‡Îç×òy#ãV÷?Á_kúŸ•¸W÷?ÛÛ¿uý«­>ÿŒ_kÎ?ãךóßÿý‡”€ícp¨©a£–zü "€:ÿSaa‡!ŒÿFÄ…ø† B®<^ÿ‘£.l_¶ÅÈQiðï!ÿQÿïÖ6¥RèâLÃAˆøîïßÿ (Wº¶nïOÀfõ‚èÚ"üü@°uÎk‰¾Žð_ðIÀÖ)¯%xá¿àÿ(XÎÖ¯% €q€©RHyôèÿÙØÿ®ðÕW=úš°¬ÿ=- s¢ #êÁFÙ'X¨ŽDù¯Rþ‰®K È¿‰ü[´ÿ8 À‡Áâfظ£þÍ ‰ßƒÙ}~k(7êß\C¹»nÆá"þ7€.îg÷ Žÿ‰ø/À y˘€€8þ'âá?°øšÔ»•N$2IP;Q¼¹ùÁZù£öGJ*œBTެzÑʵ?Âý‰ÀéŸh€ÈÖ‹Vþ¨ýíû¢Ó?^‘¬—Ró×òï‹N™àúÈÖ‹Vþ¨1‘ý'€Ð•°^´Ò”ÚŸ/þ/e@^ô…yúâŸØþ_€ü+‹Û[O (µª­$|VåYÀø½Üùà7)ÆÑjw‡$|b @Ù[‚ÿ»ˆ­vP“3¬Ñþ=oN¬üû>›Å) Ê#ZÛRÔÇ,Çöýÿm_Þß×ç9Âýµ}åþÆÿßöåý½8Íî¯í+÷7þÿ¶/ïïÙ÷÷”P¤5ûK(hýö?¯ÏéLˆ& f %­ÿˆÆÅ)×Ád€hš•O @O·Ò>ÛãâhþŸìŸ©öOÿ ðÇöÿå—öà4L @ÿ ð?ÿÛ?ä5šTd˜6ÀÿTüoÿ×hHÄë?$€Ù’ ^åk#œ]ÅŽ/Ÿ4]|›_ô ^e ªG¤€Ö g'Z€ŽÌXY|• p©íKT¸ý“±ºqƒÜ7nÜ{sh@ý̽õ@€çû!H àá­÷ž½xïų÷Þ{‘ßæ€A4 °}óÝýïÞýnÿÝw¿ËoóÀ©~CÄÿÎ{ï¾swサS—ßæ°`R÷†Ï_O^Ÿ“‘ßæ`ýúñ»ññÙÆ~ñàN~)`ý"~â6¶îmÜà tæ·ùlÄñ0æPð¿Jl¼ëKhçÌ×SnpJl¼ãKB{ÿŸrƒâ€_IAEúüžþý#ú v`@|ÿþý?(àï½yõèÿ@!p¦3üß@€]#–ôo†ÿp߀%ý›áÿlPý›Ã"üÓÿßþvŠÍ¿\$$xÔøRç{ØüË@b@€G~DJàà.©ÿÊ@b GÿOÓ¶œE˜°Eû÷t€Ã~ĉý¯hÿiì¿Û !€$üû)€Þ²7ê?5ýcù'@ï?ÙkåöŸšþ±üoáôßúOöZÿ9&¦¹§jÜc ‚6 ¤À˜¨ €MM7ºu…+Îb˜ ™Ž ÀQ  €þª¹_º’ÍuÖT€hÆXKì € J´>±4‚ãnù/{¿ 9qùû+¼@·ü—½\М8€ü}/Ð-ÿeï& _ €ÿל¿õãd¦^»!áŽjåp¸eýëÎßú9U¾ËcLÿ!Þܺ…À»¾LÏŸ¯L¼«]ì®ØMÀpþZ$6!Ž@€ç_¶%&–ÿ+ VþLAU›®øþÿ+ `ÂR›jlOŒWU 5PhYQ"÷÷Wð‡ÿ-" ןE¹?ÿfáÌ ]LÚz¦¡ø7˜ÿ‹pt¸ +ð*ãoüÿÕç·O{u™#Œ¿èëœjüÿu÷Ë^Ÿäã/ú*ãoüÿuÓð»\ó}. @P³¿€ÀúAý• M@ÍþJZ¿ãïµ£’ÉÑ<‰¿Ù!ÀÍêwü½:¦qiþ‡éæK7cì×ÀX€¿" Èó™ˆëg Ϙ~Æ|…( Ïg"¬¿ÂRÔH´~ŸÏ+üTp~>>?_ŸÕ§ùë*=½÷òyþÜt|aº¾bÚ>¼¯MãWN󌿬óùµ…z°²ÿ­ëÄ_ëÚ/áv¿qý¯×¿ã׺ówüZwþ ~@rÚÿƒúƒüi´µ7³öÿaoÀw+6®lìåúo@r0L^–䡞SÌ„´I"€ñˆ@ð€ƒAÿò°ó-Bsø…bôÿ›úÿ.‘&(: ÿôÁÙ†ÐܼiR€pB¯µðõyÓ €É ©ŠpB¯µðâ´éÀä†Ô-  †ì5â˜Ü €ÿ¢9ÕÑ%~ÿ-$@˜Z Ñÿ£õLý"™D#ɺü{ZÀ†õ 󷀕°ýæuÿAsüøwÏ€çÚùãÎOÌ?øŸ6C Dàñþq0 øÿÁƒ]6C D3Vüþ“üp@ÒÔ\Rƒú[@¨ àý­Üšú?ÁÀ8€OvÊ!àƒ¼¿n#ø¯³qî/Âÿ¦Üd¾îýu³'¢çáþRl*€ƒ©_ÏÿÂý¥ØT³¥)LÏÿÂý¥ØT³¥TÏÿÂý¥ØTS¿žÿ…ûK °©fË™šþÿÍî€?¥&d‘ûg÷«à\. K8áüÓòÎôrNòøn‘ ž80ψõ7šU~ðoÎZi´Æôi­ÿ!îþ~Þ(ÖÜjÓÚoòy W–(_ž­6­ý“g›•!xû“ JþÙ¾x Ð'oÄ!àìÜûk‚À³ €>AÑýc êçþîŸzM¸veý}ñÿÉí.^Úÿ°ëqëè‹ÿÏH¨)ììœË][?Ð_ü¿O2@g $äKê౦©{ÿgôÿ'  ¯ôR°*\àìJ&ÀJ(ö§0 [*@2Ð? üŸ4€ÈØ?˜g§äÿâöŸ(€ `÷*Çšü_ÜþPáÎös¬ÉÿÅí?Qà¤?Çšü_ÜþPáÑdñØÛ€7“ ܸqøæ°{ÿ è!žw4ûý߃xö­€+ŠŒ%°úcô`ÿ®€+ •%°úcôà+²„Àÿ£ÿ¶À•YBй`ôÇJ~†c<€«xü%°úcôÇàyok"à*éÐX$Äþ›Í€ çåqWod3#ˆØ_ýzº“G|­0Qh€ØŸyŽø·}-!DI>GÄPV¢ªÿéü_ÄÀÍü‚þ"TÿÓù¿ˆÍü‰è€ê:ÿ10Ó¿þ/Êп’ŸÆ‹ièß ÿ×9b§§ÅþÍðÿ\Ö8=¥s|LØÿùËï, ú?Žñh§à>Gp@ãÐ<6öÀÿºpXÇÇò¨èÿ¬{ @Žü…%iÿ¬¤MÖ= z£,ºÛÀ´èÿ™,qÀÝ?ý')ZÿY­ÿ|„»ÊMP jDñk²ƒ»úOR´þ³è?§äiyþÏ/S¹?=ÿ;ÐûÏo¾™ÊýZ@ï?ÿô'üÿ§ÅœK*€É–.LMøÞ!vêx-¨·€³µüäXI\®âÿ_øß¡1_Œ8|þÝÉ@òÿµ˜ù)ø@ PJ—ÿ3?ÿ¡(Jéòßbæ§à?%?¯?ÿŸÞ (aYñßp’ ¸õêzýù ±ýÿñ7zƒÀö›[ÄL°LϨüß}¸{…À6?2fhçíøÏ´ßÿ£÷ø ;Òο¹{4øÿE&¢L4û4&~–ÌJYl}eÿoóϦZâ»»=yL~·É[èÒÅÿ9€áú— À(ú¿ö‡ëŸG7áaÝûßý1^ÿH@ â $àŸí«W}Üý¡ˆ @.¯Mxy ÐÇÝ?º¬AýŒ¿'—Ž¿&tP¢~€~œ~Qõsü%_¼AÇ­ /þ¿$ ã/<ãÁg×*ÖœýÅÿ'Øb¥¯É €À šÿºûKüÄZ@íŸX\þz%Ð'@'Â;$FˆÈd¤¼Òõ”… ˆ³ ÏÛ—å°`Y\ÀÊ÷Åò¿GÐÞß]÷§éþf§ë+¦íô~Õçz½]ÈiçÓí:« —f˜ö`öhַ߇;ëûFϵýÏÍߺþ×ëÏÿµøMÿ‰ÛÚóÿý{”ý¿<†|îE2d`£ÞFжlè]úÏŽ\* Aa†LÔN>ã‹jB€&tÖÝìâТBHX:†þ¢ÿŠHgÛ,4ág«»MÊÕHß\ô«¦š(O•$`IäE÷|ýã ìTãPÞºÿ3Ý€²ÿQŒ@yèþÏt?ÊþG0^å Ð\ŒF«¡ÃØ£ÿ§ëþ] ° ýoIõmÌQœcT3ŽV¿PûˆVÐ{­@€"J  °ÿ8ôðˆÀA2ÿ¡ Üßyž”E |š´\)€€pÿÖƒ¤(JàÓ¨wÅÇ÷CáþÍdl”À‡ÉÖUÿâ'·6Þ$û‹ÅßÄ ñÇ€[o0,þ&þñk÷'€™Gô0úVOoÔ©îÿΊÝP›Mâÿ#W2€6+vC5@%¾‹Ç¿ø ÍŠÝP PI€½xü‹ÿø˜ü5ËÖKÌÞ†§%ÐäÏA7Tt”S>³R Ð<¢H¹ÀÖ äü1Öîrià 6å5m}öíLù·ßÆ!ôÅ·ÍëÆòLi…í ÐŒå(‘ú üO\8sæ­.K €ªžÆÛE@b/¥«»'@O9‰¯cñO⿤ÿ+O€—Ü_Ú—œ@,þIü—ôå pÎý¥}É ÄâŸÄ¤ÿÓî¯'À)÷—ö%'`ÿCýö?/q(»?~¨ý½¼º‚âR¿ä9Îe÷ǵ¿ó“S@ ÑÏ•:EOìþ¤<¤þ££ý}û ÿö÷Oÿ øœ~Äð€ÑíDÿ*H¸M@\ýžþö¢¤t<€&àÉ1»–~!–höl¬cú©yU–hölIòª¦O@M£س°9;uºj¹WÚSTª— Ðe8Ž£!†£TÑSÜû/=\.Ÿ_¾9À1àÆ9Ï7Æ^ñÿ·Øÿ}¢Þ{ö-¥È7¶w-èq¸‹ýŸ–t÷Ýý»ßíã  ж¡Šÿ7±ÿÓž6ß¹»IKû¿ûŽ•þ¸D?Ñkr~†~žýDð·úÅÿ÷°ÿü1Øøã{gèãI/ qR=ïá/ òßšÜÓ Ú5JÜ>)Q47¡ÁéM{FI€ðIŸ`nBuFzfý-O @TõÿßÐüß24 ÿ)>ÿàvþôh!è  ÀQ|@¿Ùþ‡ñùï¾0 À¸3üø/þ_Ú¿þ/»ªš«ª:êß|þC`Jùî;¾(ŠÿÇÇèþ]$`EƒÿÇãctÿ0¥°"€×·…ý[èÖüsg€Œo ùWè÷{ìÿ‡0ý 1ûð³Ú¿};½ÿü¼’ü¥ÿŒ@úOÂý[ÿùÅ£iy¬½é? ÷o‰v¦ý's¼_GÀàF¥ë «=%á;ΞàÉ”„ÿí8{:€¯¯ `M<.ò0â~çJ'‡ÊeC\1ÕáRGL¶Äý–³¡3@)–0EQáÅ6ŽI—Wÿ] ž‘Hhéþ*â¿Kt€"¾"]^Eüw €.P¤À—]þý €H8kÄœÁÉó7._®?ÿ/=۟ƶ_m¼¹µ¡ùtþÁûÿQؾœ\mO`:£áùûyÿ(`ù?zÏ\bÑÈüslü/ü?$àüü/Î. *ç§«ðf¬îåúÕÿ2´|ýúÕÿ‚ÿ[>€~ýÛ ¿ÿéð¿¬)?×?ÿ$þKú¿ò¸füE._N ÿ$þKú¿ò¸âÔXäbñOâ?Òÿi÷×à’n•çMNÀñ—ú¯q(»¿öÔïI8þR¿ÏàÎe÷Ç rÿ<Ø)@’§ö Ÿô¥§KËÆëCý>Ÿ×h”')¢~Sø|R¿Ï'ÂËÍ€£¯¨ßÔÞ_Ý…üÌÅÊ@™ êÇ?à¤[øg üâ¤=p~ˆñ4½æf>WŽ/L×WLÛgß×½–Ló×Í)˜Ÿv>XÞ35êrmá“'è¯éê°¦ÿ¡ã_Ûÿ@ðÿ¶õ+°æü/Îן?nkkÏÿ÷/˜é\\dåÜ0ö¥/#ÇÀrp«Ñ°-o#ü£ï¶/€ þ·ÈkiN•U‚*ø_KT^)Ôà_iËY hB_qJŒý…ö§ ²_GÈ\_«þÏŽ]kÑ–‰ù[ê?gƒìÄo³l’&B¼_ _.^"€þ_²C¬1¥%<4œ#/,ÆWú¿$<4ìŸ"Àü+Y¢°(8NºL°K$<À€E§¡ÿ$,)×ÌŽâê_±F³î‹ý#8 ýOX€û®Åþ,á¿Zö“þO8/òÏŽ;Äè `ú¿*7 ;ìXþà¤ÿÓí_äŸ vˆ@`’ûk@…ÿ—Ù?¤@IäþPÙÿpüß + 1ÀÜ_a?€?³ýíí°Ôä/ìW,[¬_Éÿtˆ$À©&aÊÿW2ÀîI€=MþÔÿ×$VÉÿtˆ$À]¾°_ù±~%ÿÓ ’Wšü…ýÊÿËTò¿°–—OªÊÿ] °%ÿk’Zë_<µÕØ„@íÕvlÏ^|ÿìû”WÃŵ\þäÛ'!Èì<§ëZYõ÷Ͼþöë­-ª~E™C¦~4SR0¿êõ÷VK€”ÌoMVW€Ú45`1ö¿4î_د € !H@ûÊýëï/ì×À€;i_¹¿`}âý…ýº˜R€´/:3\’öï¥$À|€á¯_^¥~ff8&íß¹$À|€¨ÿâü$õ#æ’óOÇG®Ó0>&à_Ûÿ4ôŸ€%à: ´ýOCÿ»@Öc@]ÿ#ðiI|ðég!>úÏDþ·þSà‹_ ýg"ÿ[yܽCï¯õŸ;;ÓþS`§õŸ¡K{Û0ïúOœýM ØDT‰„§zÿc jªé?A¢‰_&Ùº€.ž¨éKH,~I X—UF«¹£Ý ~üiúìÛ3A`tz¡À¶J,¯yü—'@%€ÒZ ÿÇã¼<Ð(!V<¬ãq^ž h”À%üÅúó‡wŒËh\Guû–Ø¢ÓNBÀã­_zþ?=ÿoÜ‚x¥`2òÛÏrýü?‘@r^Àúýü7Ž·Áÿºþë  `}ǯÁû¿ñþÂ~]L)°ÃÄåò:ã/XŸxa¿.&„Ø.™Ç_ÞHŠkIÎÂ4}¨àø‹ÉŸ´WÁú:zÐÆΦ€ã/XŸ´¸·@ðo>LAêÏó‰Éíþ(¨ˆ 28>š˜ü‰Ñî¯ *2”¶Ré?þ_Ùý£©«GŠÍ éÁºÉω®xßÔùöséÓœ–cˆ›NÏ—L×§íK¦õ˧ùóiGí‡ÒÚYÑ3Mó•6íç¹OVÍok¿¿¶ÿù£×ÿ»øË€ n„¨È€EÈ?˼Ð4ÿÿ.ýŸÄ€åPÒ¤¡Òå´dËÄ• ¶åã¥D(åж[¶¿þ7)€6=“fïOÕÿš@ØW¹€fùïÿ.P.†ñ6â_@£#À®ÆþDüËhô'\8#xÕØŸˆyþHdYÊÂQ2!5ÏIX@["€q÷ñGpX·Ø#æOø_w‹?±FÕCD@ù€¿ "€ý+Ø$†uwõï1ÿ‘y”£eHþ?hcÿKößp€ääêåêþ K€åqô¯,ÉÿÇ|רÿJ p“,IX€¿dPöEtô7 Qÿœ?Üפ @ ý ÷û£òˆ;.¥ÿ’ÿ¯d€ÉXî’Úùã$Û“&`¹p,vþôd€ÉXî&wÌ' 'L>Àry' @O˜|€åÀ±Øù+ %L>Àî€Å þx”Ý¿™¨ôÜÁoÊ¿]ZþäÅ9•¤¼ZU‚ þc¹†8@2>yÚêÇ ´­KÀ¨€fç¯ÿ¿Ej€FÐ) hT@MSK àV áÿd0*à5fÚWóÿWùŸö•0Hc0ûs?šÿ¿Êÿ´/î¯ö´ÙÝÞ¦}aë×ú¯ò?í‹û«ý&àôõëŒýˆþéÿ¢ò?õÓÿà  »GûýÓÿÿHåêÇ‚†€Z€ìnQùÿo©üOý“­#;€[§šýÅþþâó_DD¡(&àË2ûÚ÷ã¿?ô¢|4û‹ýëÁÃøïD¡ò’ ìe¬‹ü, €Ê •× hÔŸ¤8€à~w]òÊDFŸÿr¡- î̦óBÝž{JGÉØÚnNX-¨£ä(Qe&cS=ªð\7àðàÍÄlÞØ|óüŽø÷UБ¸úW]ˆ!", ™ ôoMÊE„:-á> è?è¶Ý° 몟ƒ0étõ,_¨¿Ð?ðX}üùú‹ýÛéÌÔ_gùÐ0Ž?|,ðH/€œÏ0Ê·ñk0 Ý(€šÍ7µÃ('!ñžaÿ[ô% @€ÞÿýZ•Ã!€€hÑÿ 0ÀLÿÖ€•ý[#Vöo÷o1ùÓ¬H ì?Ÿ³J|\ahVI`ûbwv|„ Y%E€í‹Ýhä8>v@ókÿÖÍâïxÀ©$@I "€d+ÁÿŸ~ˆ kD0í 膈ØêÍßû×î"@#ˆ(€ý'†þ¡ÿÄ' ÷ŸhýgM³g&ã˜&ü _ZL€«&0%Ò‘öŸD+ÑPQ`ƒÉ¶唌ÜôáÕʤý?Iýtò¡ø¨â0}ÀËŠîÚ‡A{«I•ýŽ…ÿAþ¼¤%4½ÊùW ÖÊ þÜD+ç_%X+w€J ¨ØZ l%ÁZ¹¸bý¶óGj$“GÏž¯QøŸÎ§†+œu~Ùùo<þÙöKŽÒ(ºž9ÿÉÃW¹Æ(ºž9ÿí•>`M£èºÎŸùgÇÿÕ! øßüŸ;þ/çÿÿ·tÛÉQmÙÿ§r€·n•ù?ø¿»ÿñ?’ °ÒýÍâÿé‘\ÿŽÿÛÀuŽàÙŸý‡åÿ¯ò?H 8vÙŸ!£ùÿ«üÏ»9cíÿhRÓ6ñœhýWùŸw3þjÿ‡ uCþ_ùÿŸ¨üOýŒ¿ªÔÀP¿„´ƒþÿG*ÿónÆ_M0Ôæ£Aúÿo©üÏ»Q@p‹úÂØO€þÿÈÿ¥~žKÕÈ(?ޱŸ¢ÿ?ª©ßçR‰\s p êd‘ÈÿeCq@Û/óóñ%óõ¥óöÑûj>¿bž?7_2]_:m½/Óø•Óü¡ÏYÖù ÀŠÂqòÀ9‡€Þ›½­ýþÚþç^ÿïžÐô‹ÿ€ù6 Ç †¯^~P ÿâ7¼‡>Wg „ü”–xCü£lTåPÈD¯`‡ÈÀê På®0ÿR€èW1ýëP”@^%ºêLÿñh¤Êåßl‘M÷¯"tpî£ìŸ‰Ž‚þ£ûW&”PöÏDGAÿÑý«äXÄæB4õÒEh”ú¯¹þ9£Áÿ’ˆ±cºB€€–òobß„¡M=$‚ÿ#Àé~C†ÈÿŠýRFPwQŸâ þ'æÿSˆŽéî/êïå·(G €rˆÊUõð!.âÜP?4<€|JM ƒ~‘ý–@i„ˆéW2 ¿’ÜßhÈ€éS2 ¿’ÛÛ];’XäÆ êÇåÛ I€.‡I,rcõïE0$@—ÃŽ$¹±‚úïF0$@—ûäŸnÜÅ$(@ ËýGò1/¨ÿ(:€!ºþäÊŠ BˆÇǵš€ÿ´uþÄž<}q|bJÀ' ®eåOZù7`2þˤ‚`kÑ“¯QˆzÀ±s×Ôo@«ŸÍ4dᢪŠsHT”?Mó›okÓvªZÌíô Ò©àøü§}1é0íŸöÖ/Ñ4À#ÿÿ´/î¯iÿv±ÿ³>GÐd;8þÿi_ÆÀlŠúù%ÀdÛWÖ½ÿ%ýþÿÚÿYpÀpoýØûÏéôÿ×þÏš €Nßú±÷Ÿö ÿ¿öÖ§g|Û3Püûcêä/Ȳæõ¥Êüƒø ÿ/É?^¬ßs•à@ü„ÿ—ä/ÈÖ/!ÿ¡¢ÿ ¨Tn¶™ kg;ñýÇØÑI€ÎDxÙ¹•¶þò§,à_«¬C¾ÚýšÝªÿÆ” Kô™XN4ü7üÃÄþÿŒ"ÀáÏfçðúMºscDçM®eJ€oÁ :øwúÚÏaŒWb½ú+ëêú±ýký_YTÛÄ<3õP€ü=üG°2¶4€%hŠÁT+`#Jðò‚ÿ¨V&@5¦9£ÿ?xD¼ßÌÿÑÿ…þÀD‚êÿw ³ð¥ZöÜx¬êß`â°ªÆ`¦ËøXˆ?€ÑÆ1`<>â`ÆGÆãc!þhf|Ô1«üÏÒ]ÿû~‰©ÿ×ÿ– P. `Hù7dÀúŸÁ²DÉø€#à¿úOt{ÿùÅçÇ'*hè—"H9.½üÑÇ'rú¡ªÿ,Ÿ€¼¯MãWNóϸ¼ó±sç$­7Ϻ*­þdÞü¶öûkûŸ?zý¿{ 9ÿ—½?Y7šŽc5ô/ýÛ€fè Dn z£ÁПÐÿ˜ûg‚ ºíP 9ËBL—Hÿ—¿mf§kàb*Ò/ÿÚÌNQöÈ…þäoÊ=+ ‚jhÈ`Z#Üw;Yÿç•P¬oørÿ¹¬€€ÀdihÈ`Z#Üw;Yÿ{É ðëEôïÿ ˜DHÒÅ|ÆÏ°¥øYëY*Ò¿Güw*`,¨Ïÿ‡üôu©ÿwÏ€ÿ“è4@äÿ1ýó:ˆÿÉtÀ|€»(" @y‰ÿÉt@ùÿm”‘ 4 …üÇüŸ0€ †XCþñýùß´²ìTP@Ý_qDÿMûç^T»€•8x¿ÌÿL–›À)!Ôï—ùDÖ”öØ  x¿ÌÿM à.!Ôï—ù2 )¨ó@Û-ƒZ™ÿ!šV™"ÔÐâß^Ê€¹€ô­&ü3Þÿi,WØü«i€Õ_¼8>sQÎ+¦ùÙò'UnB@ËIÚgS~ò¬ôáäÊ¿ÿ6óG{úrüú¤Wo4@3k±ªúŸ”‰=£Âî±§­ªhN¨2î/8?’†˜ú5Ú—¯uÁù‘ü3ÀÔ¨о|­û«Ë¿’†œ¹§ó¿z¦ £ò÷AÿCý„œ[?á8H@ù‰ûÑcö¿ àèÐú À @–~gÌþg„lM¬Ÿp’Ò(ý°  è_@@ˆôú ì#ˆ zruxù›"Î š€‚}ÑDÀ;°¿ÇÿÙßOð¿^ÿ†øŠ&@˜@“±© ˆÄ$æ x¾1hè/g>]7Hl˜HòʪÜ,})ÕǃòÑR@o€««û7û„Ü;¸#æãŽ›€„;7°#¥/æOó¦Ãõçkw¡‡ŽÓûÿn9æ×_¥Ñ+zôÁÿ›å˜_c}ê×+ó+ê×ûÿÞšúµæNæëÏYF0Àc¼L†@<J01dØÝ H!Bñ` â@Ð3'ý®6-ÀÍH$ @ÿ­wó‹>`´þ ÿ––ÿú­4€!šÐYvó[Õ¿ml|Á¯ÀnO‹ýH–_ €ï&d¤\èßH"ȯÀÞÆdÚ¿Õøˆ‡¿/hf|$ `v|Tv€£hf|ôí3ã#Ñh(ñÑ··ñ±"ý{ħ¦„@Eú÷ˆÿR( €©  €ñŸu€ÿ‡ükéÿÚ™Ó™õ`L3` ¦fh*ßT¾”Ê¡Ò7l*ÚÀxJL4­ùØPia{,ÿS/RŸò€-@ô?P·(«kH/ €²ü€(¹òþÉ´t€¨rLè_2IÐÒJ ©µ„Y—׿²ù• ²¾|ÛùšÀÌ‘ˆo­E—àœ?4àÿ‡¬Þ}ø§ñ)ÐÎÞE‰>V“Ëäˆ@;ÿ °? €Û››¬H¤„B×—CüƒÿüGøŸyfÙÿüÁ†˜KþgòÓ>`Þþÿמ ñóöÿ¯æÒÌÛÿ¿Ôï0ÐfàŒ¿àüHþñ‚ €Îÿצ`üçGòÏPSÿ¡À@ãk¿ºü+ùg(À•{:ÿ« @ÿÈû¯^ÀÔO(ÀÉqÌòXÿkx2»£²•†ý_ pÄÀ¢c@ܹÇú1$Çìsq\ÏüÈá¡™(¯x“ú`ýðˆø|‚ó …à‰¤þX¿ÃdÝ_p¾Ñþ<‘ž€@ u,×—¿¹`9æöéø’ézŸ¾/ß@¬˜æh¾oŒ;ŸF,çõ_óŸlÀoÛÿ¼­@ëWõo¿uýÀ‡½yüg•Ý"šüÍJ óÝ+y€’û« ³Ë’@4‡›Ü_þü¯øSnëtvêÈ›eûüŒÃ]·3 ùk°isË„7Øßt›@ÓPË4ÑþJ˜´$þ_2€j™í'@„âØØeÌ ´ŸDˆã—07@Ð~D Ž]ÀÜåí_"¡ãt€}¿¼ý£Ð׃'@bŒôW°Gþ—'À°_!FµP£Þc´ýDú«Ø#ÿKpØoÿÓÈàÓˆ€QþÏ5öcñÏC @¥Ð iÍÑ­Å(¯Tz$ `´±øgV¢@¥ÐàÀûÛÀÿ& KÝßbxÑý?L@mèàíDPð¯úQÿñȆn][ó¿y 8­ðÿÈv=lÍÿæ4`¯ÂcÐõ°5ÿ›Ѐ»þÀ&ó¿y ¸ªðÿÈj½MªÀÄè€ @…ÿ'< –ÿfþ7 êð¿©ÙìnŠ6Lý àäž<ýç qŸØž5‚såàÿ”ûí÷f P/Ðú¤<þ'4Ôfx¬”U>ú›`o½&¬üÍ é6 ‰› @#˜À¼ôþ @µ¯0ùðþ @µ¯0ùðþbé/ ÚW˜€üÀwÅüèýüSd«þ‚»bþèýUýÒ­þ„U͉ªÅ€€jë `Õ?™Ø?û‘ÿîG‡ßX7`Ò?ûÿ ïÛ@0ýƒJ€ÿ Ð÷¿mLnŸí5Å?ÐÔÿÊ4~åÐÿ@ÿQÿ+oPfKò gÌ6ù«UÙý4ô  #@guŠÜy;Ð=îÜ9¼£J€’å 0"ÀÿÏÄÌ«:ø?)àVàÿ»bæU€×z]ýàÿ×ÕþßZ¨?î â>VË> ‡3ÌÀüOlœ…¾ÿÀü]ƒ BaÄ}AüOlœEÉÀp8Æ€'àÁó–`ãù@£'À°ª¤˜ 8C€û  Cµ€—Þ¿ÿñ6  LÀbÿüÇ“Ý4€2‹ýðŸ/j@™€iÿVãc‰þ«˜ñÑH€´¯>>–è¿!Hûíãc‰þëþ‘ñÑH€´¯³½Dú'6®Eþ—'À°þ׈6U(à?ìWÄ,þù?õÈ>€ý'¦þF´þüŸþÀþS#Z9(/åöŸM°{7þ§ÿ̬yÁ}v0Õû_NLõþWøþ_ŸlJI­ À ºá†àÁ¨²Ç„þ£ù'PÚÿñÈX_™¬«ïf´i@g¨§Üýý+[té|ö”€?ÿµÜý ÿoŽ—–€:ë‚Âÿ›#@sVoQ×_n¼åüõÿ¾dnÈ÷h€1ÕbÚ·Ÿ¿_â± €ß ù94ÿëóŸÿ£°‹?;°Ÿé æ=rþH)€ÿQØ< öÇoGó¿×_–@3òǧtê ­ €ò hþâB = £äÑ£7·¹ê£øórÚC@À_å]Fþÿæä´‡#_%š=K¦áædX˜îŸ8þ €òÕ«0ùpü#Ê.É|PÊy5þbé/@Žùä*L@~`ƒÄürÒÇUd«þÅü0XÿÔ/Ðê¯ñ£ÿÄt4“ª?2€Uÿdâó©¥_Ѽ¬?¢U=ŸZúýÇÀú# Pç_ϧ–~*6èßú¹z½þë/§â~ óôµóö%óú¥ïŸ›Ž/L×WLÛ—¿oÉ4mçó« Ÿ>}[ûýµýϽþ?P„× ýW;±±±úWIëŠW®jJ™ih´ÿû¾]q*-”ÓÐÀ‰¾_î±ö H‚jš×ßR)[ûK$@ 6À‡¥ûßþì‘›"@“¼Uºÿ£¿îÐŽ1‹þWü??laÝд€¸ÓÀÿŠÿ÷ Óƒ¢¾„>@¿†>ýŒ¾4Ñ8Bùx¶ç{…Y€¿þç<úŸUþ/¿ÿñz¤`Ä?>F 5Â]¨­K ©Aÿ¦œY”ˆøÿ°üþ—®ÿ,ÔGào~ÿ¢ˆ·? /DªÂLËw“@aË“@¦þm'!€^P 0qÿÞß þã6šÀ'»ºûs7ÅûbÿÒþ«4’›ºûÇÀàÿ8þþ+ ÇûK[@5³Õ,íla~Ë‘ÜWPy@õ+7‡ûK[@s¨X¹´#´€À}e|DþN“xu#ìçMiH•@=@×E´€ÌüKPó1¡ŠEÁ?í@¢iˆ ˆ´µ7i¦¸Øšž¾¨h›”þÎÛúö›Ìª¾VÑ6O¾­Ô! ø¸:üóy,è‘ãøö?ÉÄì›oRÎû[QAH$ÿ¢Pûx T Ê„pÓ¾¼¿i_ÜßÖ¾v ÿ÷þ¦}yÓ¾¸¿­}mšþûšöåýMûâþVûÂʯñÿä2õÛÿ¤~´úõÃøtœú=ùÔÏV?Yÿ0þ’ú™{¦~nLÕÿ¥vû‡~û‡ää (6à3¡¿ýƒØƒ*ÿG”ù ,¹-ô·àâ#ü—€þ!ë<)ÉýG— èu,Ö”¢Zµ³$²•ä!–qp)çÿnªcò¯•Y%}±q¿µ±ö[«ŸPÏ¢¼z ¸ûÿÏoîܸ|ó€ƒÿ=À7â“È¿¡@üæ»ý¿èù‘ƒ¨Èÿ²ÿ7Ý ÿ†-ò¿ìÿ.£úÕXW¿ëêW`¡þ‡¨ÿþbÅÿÈë?ÎþIèBw’óØð'ÿÁ&&ˆÉW âPð¿ñË`«åˆÀí¯yÐö·ZÀ|²CýH@”S@;z¿÷oÀÿx¼±Ø¿ÿ`g²Ø¿ÿÀˆýÞ¿MÇG’ ¸z|ôCw7VF å0?>–âEþ÷õH ‘þÆ$âqmÄ?Cc"ÿñúoëRðµ÷Ÿ_Ä÷߀ôÄÌöŸâûo@Ê|³ýçNùþþÏ€ê?§’Û‰íŸò͵vª÷ŸØþÿ‘,þ¦zÿÍ  §,9€6Tâ8üéG ׆PZ~×Cü4 «A €nÉÿÈBG.€>¤ŠE{ ÔBDL‡ýMýoýö["€8Ô®PyZ"€æu=4Þrþ˜}1ü¿b(ŒËRæ|êBg!À[Ï_Áÿj¿?£ý§ëÿ»Û¯~L€œ?ðÿÓ?Wð]ÿQ䥟?WñÓ?Wãí?]ÿ+ SókÙþŒ‰$€}^¦ô»ƒ¿G¦dAº:Cÿ{gæº$rÜaÍëïP~ç:ýO%< ã…³…J ¥¹a* à/ ú»°1Hæ1pöÉÀeìÿôjÇG0Üò««]Âÿ=mà2öÎΩ`ðÁõå&F~O8Žýßè5Ä8wþÇ¡æø›úcû³þpÑ©_)ÇœÔo‹Iýhõ“õã?‡­ßñ7õ3þ¶ú“þ;™ú};­oÓùeÓüÝ¿¼ói+ ëÃ˺­¡[{[ûýµýϽþß=ÐLÿ%Ÿ¸ôÝÿ ÿ¤jå\@ÿ8pXïLOJ–å¿&¤jFÐ4gúx)ú?ãûO— €.ÄäÏ̲BB Dd*Iê7è¿¥¬{ggôßÿ5U€tÊhtçÿEü®`Úa]þËù?]@‘úü—óº€ "‡÷£¢DÈ\ƾ+¿±þÓÌ=`ÖQü3¨±¼ÿkmf€¶Oæ¿ø™Ð`£¬œÌú/ÿ!þ7Ö¿x€¶æ}_Å¿¸üWü­Uhûøù—žhÿÓOqú"à_F€4øùW9hÿÓOw¥¢èŸô~þ¥÷ÚÿðÃmõÿ£èÛ7럖ñ¿îo6â -ÜÞ÷µî¯šòÖFì|ÜÞ÷µ;ª à=vf¾ý°ßoבÕ'tC^ 2@!@P?S\d#¼€"€â|sŠúãPᄎâ|Ý`¹0óµ^ 2à"­a¶Ú/  8ŸVÑáK è‘æ§þü(NZjÀAÚm¾¼ã?‹ úÿEh!š Xó׊§^\ŠHýîÑr]ŠHØR•j ²»°Žç&v­ÇSíëÑCÃiêþÒ¾r±ÿã Píkç–÷¤î/,÷û?®Õ¾0þÓ¾êþÒÈr±ÿã Põ_áï¯ €ýõ§ÿÁàŠˆÿÔ‚¿Rþñ¥¨?ý®'Dü§þ#üý÷ñ°Ç1NŸ™³â}G‡û•}ãµRhÚ?p ý,;Áý¸ÿûZýM“ÉäÏ>t‚ó#€Æ€ýnüKŽðöoGìÿJ ­Ü† pßÅ@-ºÖš·”W¥“˜÷]"öï$‹¬|áÕ}—¦ºÚ˜Ø$y”–U‘µ-¿Ø¼sç€7n\ú²yyw€?>@lArl|þp#Qþ2·”ü+@F1¢~p‰òÇÿŸ— 0 €éÍ[°ûÞ¹ ãÿÏK ÖŸØÿµ/Ï‹PpãùNúqN w€£É2ÒŠNÜ*C?–\ÖÏNãÜ8¸9ôo_|ñ¸<XÒ¿a³Þ)B–ôo4¾ò `Ú¿MÇG“@¬M‰œeã£I "‘3£ø§`yÿ×ÚÌm?¸Ÿ—–ù¯Öf¨h€ÿøàÓrùga2ëøÄàvˀтûõHÿÙñkHþ=j@•wü?ôŸèÿPýgÇÿ‡ óçY—P>‹ Äýµž%Äý&Ðÿ¿Ö:” ðæÄqd—è â!€GÔ†˜à†fâjý1ŽØó6A!iÿ„&|Ê· @lý0› =#‚ö+`6 {FÄã¿"PÀß#Þvþ°x‹ª<ªŒAm »¿àü«ý>þùáâÛP ]‹‡¯v'hÅiý—ൟ]‹í“M´ÿŽ´þËðšó¯©fBK]¿:ée›v:ÓuQå§…ÿ»$-¨ß曕0Á©N?oµ ß{Q.áúõï6ÿÄ^ ”€Cu©«³ÏØà¨  @ø!8¿z¼Æ_`y¾ö\Jaç–Ÿ©ñ|ñû?®¥æ…ñŸ‘µÆ_׌¿Øÿq¨úe¨uˆPÁýš«þüý“ò/Aÿ—q0gmê7D@ÿÇ_>œñ÷„”I°©ŸüÔ_î)ÔŸ‹võÊÈ€ªß±3<@Yÿó¬^’,ñM«?€°¿¬ÿuÉ®Œ X6/_7_¿þ}Ë>77_:]_2mŸyÓø•ÓüYÎq®ó™ƒö3ÎJé¸fË‘¿À´ðmí÷×ö?ôú÷ÀòŸna*МEW{ ÓÃÆÆ®X™0‹Öÿ$ˆ¤«Q, ª`~©!kÑJ¨a*T€)`”Ûq#\{öï<@Gþñÿ7 õ3¸4 @3œ”@ÿ·Ó­ž8a(:¥7ãF¾rÿ×üOby’üÔ,4Q¹üc²ã”ÞŒùÊý_ó<‰çì÷,0Ÿ?”c- @þ©þ_£"ØÄÿŠ(üßtYò Â³8/ úÿÿå?"óPQÿµNFÀ¶µ˜ rÖòçOôûÇé_ùÿû‰ÿõ  6€~ÿ–+˜ò˜ýÝå˜{qúWþÿ>‰ÿÄÿú„P`°õG÷¯\ºC÷÷<JúŸ×º¿ ýWàîï'x”ô?¯åê‘™·rÜß¼ueó×üW€îàmÓÖOî?A¿*Iо–h_mrÿ úUˆ+@wP´lˆÀô«àø[¡ÿ|Þ‘X[?™ _€¸t‡[E¤×Êæ)€¦ÿoVÀè6å%È_ý~z‰ÿÇå¿EèÏ”cÙÊ€nÓ}ò­\Åäë>!pÀ°P[b^ãÉÊ¿L å.þë:‰¡?†‚WI àRù š€óVÊ“Êj –råÔÖŸöÅkÝ_õÿy¥}q_žsÓ¾x­û«þ?¯´/îïù)÷7í‹×º¿êÿóJûâþž¢øø§~²þUÿC:@å¨_]@ÿÿÔOÖ?ÓgëþÏ¡ë§÷9?¡§~²þvëãí'‡§XÿKúÁÿêþM€X¬ÿ%ý`ú¿Z€îSTëö:€éþjº¿›¸ÿBþ™¼øê6j÷G=ƒüóðøšDF1ôè©§d#^ã àâaÁ #­¿Š¿JðèFÀjíÏn‰pÇG ¿N=î˜ðâ—(Jül@±Ý sÌši浤¯—@ÿ랥•¨€.þ×ÔõIÓ7Ô€5õÇ`Mýñ˜¯¿ìüøXÿ£%@3ÔÔžM¸>Öÿ(D Ðh𨳉 Èì€( Lúßx`ÿ¹qðZ@g€J ÈÊþSnÔþsrô\ %deÿÉçé8q¸ÿw é‘?÷7è?{ÿ†Cp ¯±!á9Ó¿EËž…W5íú·$N`Q¯ñÖΆ„gú·éø˜$§0+ÆÇDìÁ¬@žÀÙñq*þWD@áÿ¦ h­Aü¯ˆ€àÿ¦ `dÀÔå¿eú¯t€¶ÁÞ~þEúO,ÿPøÿ0Ó~¡¾?"(ÆKÏ×éSÿNúO5¤ Héâ4º&Ïíø,x€tžµ°“®²‰È‘ZØa‚|yòÓÊý]âL µbÃwÌ`ˆ÷ÓjKüo=>8á½a6ü^&íó“’üOüe¤6·d8^›F/¦~åÿš×?È¿`¨yKò?ñÿqìoÉÌ ø–óÿY÷#´ããªîHëzÀ›·œ?Zðž?ýOïýü.'©Àö-cêüÁÿ×8hûâ…P ÎŸ–| €€÷< 7 Y4?iòov¨ž°rÔüs—Ça˜–C”œAËPM¢0•<€Þ¥ U@[ú…éõD~40£Î¿‰0Vî…Á`zýÛ÷ëßñ¿€_“É´„×ÕÿçozNôÀ?ŸçµÆ_õÿyÅ›žïv…àŸg×Õÿù“póæ%Šÿ²ñIkóÚM À0ÅÚú9Tã/v~åÌ_£. rêgتñ—t€Æ³ð ÆßKãüSÿ_ ù÷ùÄüÏóiý\Cþ©ÿ+CþõKÁüÏóiý<Ÿ†T„Äð|ò¯y>­ßÀ•ž¸oºN43__6oŸ† ©ÿ>ÀÙéø’éúÒiûè}™Æ¯œæÏaøÙÎgÁ¶?î™æz®…OVÍoi¿ÞÒÿì¼¥ýnÿ?®ÿå[Îÿü-çúû'Ò:š ½_‹þO€¬ÜšÅ!n=üW;º;þî72 ‚z9‘lŽÿñð¯ÿV‚-< ;þ´ÿHZÀí!Þ?¶ÿ P¯?:a !•„¥çPp O¨ÿ îßTܵÿrmŒ @‹oÄ›×è€þ%áŸV£ˆ[|#XÒè€þ©«†QÄ-¾äÈiôÿ´céþ• Gÿ í;îoªzôhÿ!ö?öÿpjT‚ÑHÛÏ'¢ý‡ØÑ?º€¼ª´o´ÿ4ö_ô@-a>?¸_K¿€ˆ?™ðæ[.îoå|º•Lxóa‚ûõH&¼¼¿eó/“sRzcüÇçß$ñü/MÀxx›ñßP’P§#>(ïÿØüÃ83 PÖÿóû±ù‡pf@W Êû?6ÿ0ÎŒÃè#KAýØüÈüÔõ_·îÀWŽ„6¨°º PÈŸ^È0Èì°WR€nJ83² Ð!„ÿp™-"À{fÊLaòÿž·~-À{Ôtž˜lQ¼Œƒa$ðÿ=)UÎî¾:3¥ZÙË»ûêÌ–ò?}äý¥uyþceë2 Û—÷—Öåýe‡ûkë2 Û—÷—Öe£e‡ûkë2 Û—ýõK6¾NÈ¿õ_]½¼8>NýN6¨_²1;¤€ 89?;ÁD €ÐÛRïJs(Ù x_À_ùÿŒÑ#›Øº_­ÿ-ôÃH§Ü¿€xsãÎwž?7‡w À`è/° ãA¾–Ð꼎@wn-€Õ{-°qo5f~øXSþö-±C4Û7)üïT=©ýnŠý£ب†ÂÿÐ 7õx÷]±4Õ ô`ÿ¹Áé#XÀ§P!ì?!è?'Ïÿn €">5 €ý'ýçÆßIq  ?B„Й¿ú7À bBÿû7P}m:‹ý¸¾MxˆØû·éøH€¿¡¸r|4À•ã£!¸ÌC´ÿûû8µ†hÿ!ö?ªh„øª¬ýQþG]†4€Áÿ5O€ê?üAþŠòQ€qÿàÏ»ä/¢­<ýg€¿^¸xó§+@úÏþ?²¦ÍΤG˜¿lÿsÀó—ížÀªzýcn,À¿mccëMbpuÿø|y`²u¿ÞÖøO×ÅLŽMXñS›qhNdúMXñS›%Ø"®ESþüÔf ¶HâëלÿÏ?;¼¼îÀº.€ÈþµçOF8Ïÿ‡?¥ý¾¢ý†À Ô@Ο(€Ýk¯Ç6W"YXÊ¥!çOÀæ±×c`»\zÀzÚsÃéü³ =• (ø/Ä×uªÊàïþË‹â0Xüëú÷ à:ÿŽøëúsÖùˆ?׿™ÿ3Ôù«öO°?Yÿ4ùùõ0% ¢ù‚þ]Þçø‹ðg,>0 £ænþcü•q6 ½~©ßñ÷UBþÃXóÇüßú©ßñ÷šÛŒô_â#ð—ú©ßñW?–CR€õ{©ßçóÕ+ŸOëÿÉDXÿ©ßûKý>ŸÄIÈŸSÿ+`ýÏcø¥Ã¥ÏçÕ•ÏgÔL@ÞêoPðW\@ôËçí³ª^½–ñçÚ;œž»ßìsóÓõÓöaZ¿ês©‡z›7åÏv>%ò7p …ƒ`ãÀ[ÝÚúöûðÑúþ*ymûe¢¾¶ø­ë¿¸XþÈÙ¬=ÿýýß?0XýûßÔ/ )÷« €KÄ[+ `¬ÿ¸sE ²€9Þ|ÿËèò× 5Ôz‚“» ±ºZÿAIͪȶ.-Ø¿ùþöç·o4¹ÿæûOGÛ:#ÀŸÜþmö,€ñ ð7Nÿ±j$õ_™ççï\­ãÁêŸÔ,/ÇsZǃÕ?©ÿ"X^ާÒ–¶È8z¨òж¼¡MûOÀDø W×-úõà_™ŽXWx‰B§ÑÿE)ö,ý?ŠúðçX<n'ú¿YûK`. @ü‚z`ñAzýÇ ÒüU®$`/×€ lü‚~`†Þ‰QqÀUàŸ›™P€! ‡¢ÀíüäƒÜUƒv{ÀäP €ûúÁFîªAø˜VÀäP  À~Cþ ˜U°²B (ØŸÚüã /€eòÙüã /€ˆ ö§6ÿ¸Ä $@™üG6ÿ¸Ä $€ð¬Bÿ›Í?®9T/O_ˆÔ·^üóŸ¬dଇì_àÿ<(öÖ£øÿ~Àòo«ü›gßkº¢¼gøþùÿ@ øÃÿ¨ßbÊZ ë7P…ÿµW ©¬*¥5»‚(ü¯½jHeU)­Ùå&€®ÿ¦ý# ±âÿGçuÏÎrm_»f$@ü¿svZ÷w?÷×öµi@bÄÿÛû{¥ÿ‰ï?.ÿÔ@B" x^ýO|ÿqù§~Îú&DðT/$ƒý™}àòOý˜çQ„Ž, :ýdÿ§H>À—°õ{@õŸöY%à¼eÄú@õ·û¬pÚ²bý®Ñ?òÑŸ *ÿç‰üçhˆCþͪÛ¿s½¨åhˆCh±ž8©ö x€6‘ŠüŠ€v¹eÒ ÿE¸üŠé‘ˉ ŒAâôšÊÄì¼{„Ùzp¸IÀá;w6üüæÁs\j¾K‡ €o±™—@ÿ¢cãpW…½AÐí²ÈcW€¹ó¦"€nOëÿŸ­©_üoMýâÿÉBýž»fó,{Àcýoߪ<rÔQ‚Šÿ=©·çž£.›AZÿÛ·zï=úÇçöäÇ;0 úÏÞN,—ø»606Sþ`ÒûÏ ]¨$>ÖìÏfõŸöŸ³ý[u¿,+ú·¡|EÿVÝ3ËпMÇÇ @pÅøX!ð0+ÆÇ ˆ¼Àh|lÑÿ£¨ÿƒXt~þOƒüsEûûߣþ›'@ÏÒOì¿™ZF€Ï툯?H?±ÿ 쮌_XŽ(€åà;ûÏø‰ôŒäÿ;ÜB úÏaòL9äÔꉷöï˜Eÿ9`þ¥ý§.²¯tÈ"´çr¶¦æÍ•.¸í¶…ÒM9§ÆÁkRÚÛðÖ,¾-/-àø¨¥y¶dù‡uUÀ&@Gþm³\°…û-@GþM`ýùÿü“!h÷3ÔEˆ•²<½yµþü¯/=ÿŸ†öûÊö mÐH:ÿIÀæa©A¤8'¿ðŸöë?>Ô¸¾,ÀßcOK@€êôÊ÷©ð>v¨Ýÿ—ðŸsÑi@Mþÿ7Ǩíínðï›u¡ÜÿËì׊ø“ua¤H@³~§ç>Ñ÷¢OðËÇ=àä’@×Óþ‘€Xñ?îÿ5þ^^füUcb2@MñÿÎåI¿''‰ê?Ù4 ±âÿí“ããûÏüß„}NüµþkõÏøß\þe«Áäø£˜PWÿ•ÿÓåŸúáNx¢aOŽ9Î%Á÷ß'ÑúMýgBñ?@=Ÿ¶cþ©ßœ:‚ÿ!< €Äü›бԓHÙ .k&>/™¯÷ùûò÷µyüªy>Ýãéø’ézW Xþ¾N¬šæO €%Ï”X^Ø€5…¦\Óÿ<|¸¾ÿa$]Ûÿ0’þ?­ÿõÅúó¿8[þg¿ Œÿ>ý ÿ7À¹¤Ks"Bç†)Ê6)ú_=Œ hûMe¬Í>3 ãiÍF‡IiyWÿOQa.1óüï^ÿ] GúÝVáÿ 7Àî®@p(áÿ-!í%ÿt#îκ´%ÚÿJþékÙthK´ÿ•üÓ¸;è Ж%ÑÿY m¸$úÈPaÓèÿrüï!uÜh}„Ôûƒ-¬´¡jdÿ?˜Fÿ—ã ¸@€i´ÿ'”ãäõ³á¾®ÿäÏ›wŠ á?ÄÿÊõ(¿u€ú¿@aZ®ë‰`Ÿ¹yõ¢Dp2ùDàïý§ÿD!4ôWè V –]óþèà<œø#"èˆnôYþËæÏ̸^]qÔèÿ²ü·CŠ$ €Gþ/ËÙĘ׫+ŽJ[—å¿lþ ÿzu¥÷¿bÿ¨Cñà+½t³ïpŸ*Ëò_"€„áO°ö?£Ž'[ßO~"€|•‡xÃ÷’OÕ<ÁK¿ÊŸ*ÿßÊõõö½Á±:~O¾9Þzöý³øßléQðõ³ÞùÓrù4c¯\E¬ûœÂ8‰‹ü]7 c~þ£©¶Dþ®ÞWûÏ8ìþ æ‡LºÉØ£—à}µÿŒÀîb¾µcÒMŽØÀvÏÁû§èþÀˆ™Ä48ŽØÀ6O/®¨ß~ǤÖ'õÓÿXÿÉË3sÿy=LúgýxP?WÀúÎ÷Íý§áɤÖ?á©àõ\€<;§_¾LÌÿ9ÎþÉÐ,ÿôQøò³ó’üÃÞ_B€@ÿ`;ååC¿ýCÙýþODýxtë”ç§yý—îI*`€l"bòw¶¬S€ß8¡±úÇ )]7þ ú°­![Ã2•`¤"ÇúV઀ö|ƒýê pãççj¾IˆÖœ Ÿ(ºB™{( )ŽÔRE[@À°]1"Ä •Èü …É€¢5hý'ø?†Öùeý'øÀ€€åý'ø?G@ܨÿœïßj˜^Ý¿Uùêþ­Ò´ËøÈEù¿BHè€93>roV!¼Õsf|ä …À[0ûø8Žþ/Çÿ× 0ÚßqÌu¥¬ô}?Ñþ Š(þõϺÿÚ¿}[àOoôù È^å©€ê?õ(8g€äúKTÿ©G@ˆÐ=<:6ÊÿRÕê°³3<;Û^$¦œ),ëuÊ™õ¿H 2A>ð?Qÿ[[ï×)Î M-ÿãεµu§ah*`À¤\C&7¼ÁrðhÒ¬ÿD$À ØCšõŸ€$ÈR^éЬÿx '@–x´Ð€õçàxÀÿÊAnßäL°kÎÿÚ@$¾‡ôèþ÷í—}rŒÎŸ¯jºÿ’»âðÿ?Ÿ7‚Ýÿ»&ª$G€~þSü¿C1¢bæoþþÁÿÎ6§t@…Á TQ „ÑíÈðË4 ®³>#À_îÿã¤(6‹žãA¨Û™€ ]ð¾ÚÆ`÷G?ïá#ÄôÀÿ x$ÞWûÏ8ìþÜ»[;–qĺvÅû—èþÀCÂÿ i¡?˦ÿQí¿’§±~<¨Ÿñ×ú…ÚÔo{jX?žÔÏ úóóïµIÿ¬²eýŒ¿Ö¿u ÞGûûKYÂȘÿñ>ÚÜ_¸ÄÃÈT²Ü7â}™DH„Úfø” È.÷|œ`ì ð¶yûjU¯A% óü¹éøÂt}Å´}ö}éî–Oó;Ó¸´ói"€Ë{¦ÖY­-|"°¦ÿ]Ûÿìî®ï`„ÿŸÖÿòåúó?7`MÿsúûÐ64 þ{F€r è|ø÷ý·ôÍÿCff¦ù“TÖ¥ãüL:³§5*¨®!–!«8ßÞû7u€­F´–¿ÿØþ_csò4ÛIbÊÁ6Ú•ø+»^D›û¿$&è¿rTü¿þ75ô'þ¿ƒƒôh¦ ý‰ÿïàß ,~Ý5@Câÿ;ø7‹_w Xû?Yû?,ÈßBÿ›‘ð0]CQ‡Ì“ÿÚFÌÚÖj ±ÿCà?! J °[üGÿÅäµ%(-Àç¬ 0-`òP J ðÁ*€êWéÿŸòÝ– ´î£H0€i“p²­û¿¾ÿC*ÀXþË Ñbà>7W_€Xþÿ— Ð_ÛÂþÜ\}bù7þ¿&=ýçuæÄ =s&/`LþßÕœ¸B¢`N@þ*úÿî^͉+ zæ䯢ÿÉòÌ_¡Ñ0'`òÆä€˜¿B¢`N@þ*úŸÄÁü]À\€¸ÿó¢é¿Hšg-Sü¼ '~Ȉ”?•³íVìÿâE2"úg:Upÿ“”ã@Þv´OðóÛrË"L7pñÃgUÌßBfÕÿ‹°Ö–-ÏãŸU1…ÄFÿ¯6°lqH‡åþþÇü/i‡ùŸ=Tt½Ñá_¹?…ÿ1ÿ{1ÿ³·[®7:ü+÷§ð?æï/æö6ËõFÉ?"ˆü§ÿø€7ú½~åþˆüǨ-ð7oôÿzýèþ›ø&FøoøüH‰>~ibèý“ Ps?/øaùw£t—Á§`ÿ2÷ã €›nT2]ÚØÿ^AèoDœºí#73þè¯/ÆàŸ?`'}1À(ÿ„ü|'¦%ñR©Žp`bå_ëdÍ(+kÏÿ±üiç/åÿ¸k*ÂÄgk®=>~¾!îþYÞ´ç»Çû〩í¼kÔìWó±SÛyê‚΀gd5õ˜ÚΫd¨¿èÁ6?WÿYȃm~®þ{fô ¶ùiý5’€ÿ¿õWoX€fÛ›æ+ÿßõ—#ô0• Î¿ðÿ¦¿z3Àäø{ïµþ±4Ž'@[¦ýçä¹äS`_¦ýçÆßu¸Ç’ðÿ¶ÐÎöom´^Ù¿µò•ý[ûÇ£þö%äYÿØ^ãñQÈoƒ }dmŒÇG!û˜1UQ òùÿdßÃù[èÿ¬ÀWŒsÿ‘H]ÿ?Œëÿ‡Yßæ5ëÏn‹øEúCÿPý§`NFþPÎÑê?}&Øf-ÒúO €ôŸ‚¹Gf €!ãv×Ûa~ €!`Eô,%øç+À°ÊæÖmX¬ÿ~®íºM’Xÿß pÿ;¹w8XNËÁÿד &V>y#Ÿ§{ž.'Ç ý¯_¼­e=•d7¡ÿÍ  ¹Le¡ZÝœ¢š—ýiÀ_׿õ“½ Ò_-9TÙ‚¬ÝùóïFçOãýŽöËùÃ$`öü·ùåË(ÐâFç/úç—ó‡Hõöÿ!@¹Äv^Šÿeÿw:Ý­ÎA`Šÿ»ÿwŠb(»ukÆà?kÿGP´;]æìÿäÐã½<·‚ÁgíÿæˆÃ¿r ÿcþwüÅüÏ*ÚëuøWîOáÌÿŽ¿˜ÿÙۭ۪ÿr ÿcþwüÅüÏÞfÉ÷ez•ÄÇÇÿ¡æÑV¿r`{Æ_¿Ax@Z÷úQú3ñã¯ðß ¼ŽlõÿD€‘ÿ1ÿ‹ü¯ðP Õ•?‘ÿ1ÿ‹üÑzdo¨ßPgh€ðçy>àÊo9êÏAÿ%Z]ëÞ7…ü³ŠŸ›Ž/®/™¶Ï¼?¨•Óü°ØùŒ€¥…-8  Œ¦'×µ_ñ׺þGüµ®ýò4ýÖõ_¬;çŸëÎßùçºóg~øû˜Zþ„ɯóÉø̦¼z¨~ÆÁ·,Ô,þNUãÔ¨§ÓfñÏÈZòyu *û—߯û&ËN;ÀÈ>µ!)÷âЀ(ªÆèŸWZ8€ÞV ó7Ø_ŽÿƒàÍ–øO¸žD2ç‰póeKü'è?M"ÓD$-@Kü'èßK"½D$-ÀX,¤‰‰Ìô7KDgt‹¿˜ß¹N$"Xëxæ‰ P1F] `*XÖþ‚û•¨u·øGøË—(!À?²£Í_µ?>ÂÿèdÏ¡O‹•jU‰gÝ|µaÙÃC›¿jfœl ÿ£=nqG êsGÅý•°ÇàviÀ üGùû›¬€†-˜0÷WçÿQþƒãIV@¼ð`ºÏmŠ Veöc* ØŸW§ä%øGà?ØPÁþ¼ž[ö—À&°¡‚ýyÝß“pæóQûC °QÁþ×oJÐ6tT’€RÁþ¼:j–ó2cm+¾NTŸêÔè¯ ¸Ä€u„ ?®þÌŸ¼xøêšýɆûèžÉá7/¾y†è ·AL ,ú·„Pkm±ó•Ðϳ®ׂ†ù«Ú– aSÿ5ÌŸIÛŸZ@ÿ÷u Ú÷—`E¸¿¶¯GRÞ_Ô5h_f<ãþ @ûÚ‘ ðþ¢®Aû2à>÷F€ÈÚ—T9Šÿ©Ÿ/‹ó¿øŸþÇúk“S¬ú9YœÿÅÿô<Ö_›¤Ð®úéupþW«ŸYˆõKL’øïKÛý1¸ÿÓ?è €à—étþÇèÊÔíÏèôÛaóvúÿ1úï±A§°u›þ/Ðl^ÿDÄ÷? Ö \bì7ßR› biñAË|&¬$€yˬ‘ùU<*+@¤W ½*•Ið|Dô°]O,<ß…ÿ‡ç»ôRø–Ý!ñMzê‚áàÿDI©×—)P ›,èwú2%FzyýQ@^^ìt–Ô?%¾-À ׳¼_ó .` 0 b . Àšúâs‚ãq/ø;,žÕßÿ>Q@€ñbÿ&óã70ÿóíf—ííÙþÍŽŽeeÿfGDz²³£cõoÓñ‘,†Y<øøc2<˜ãà©ÞÛÛûxãÞÇóãc¼X`zîîmÜ­ÑòôÿÏÞß»Vv&kÃxóXѤsÞ׃é×ð 0Á(RÒÑ«D<<ö>³ßD™¡9àøÔQCÛáÿt3¸™ ™Àv¦D¡ƒy’Ž~×uUÝßµ¤V«·Üm­Õ­½>jßµîU{­{UÕ]uUšñ§ÍOG´qûô5þéø q¶NL A `Pÿ› €püÁÿyüô94~" 6]?=@Ÿˆ2dÑ¿4~z€x–Šòl%µ<# 8²Í¯é|d?€9²Í¯éÿÁp:Á*?:lz ûû¢÷ R¥+›žÊSÞÕû¥r´1sãûÅ“ÿ-ýÜòÿÀv<ùßÒÏ-ÿ?•ÔŽ'ÿ3ýÜ&Í 0mŸ_ÐñßF”x¥cJôEü/è?Ï‚€´`þïpì)bœõ??O²ÿŧˆqzÔÿÜ^ö?=Tê?=ø¯¼¡úcC€ë'´O¯ø?Þ1w€—ùS€U}÷Ý„é˜ÿ^ýÎ},£Gk™ßÈçüšRä‹eôhíkòí-Bx°¤^Y0C`ü+:»°‘ùWrÈÓ¥˜•ñÓó—OYLe äž›[À1 ÄTtgo!¾,(Ì1ÝÙ§^fóbØðñSö´Øø)‘„‹ŸÁøÆÔ¦‹Æ7¦6]4¾1µ)oéýˆ0¾aÿÿÿXÄåýˆ0¾aÿÿü|p^|”÷#Âø~„ýÿÁÝà€—G»kžßŠª ï3 €ûÀ5$9õßCÿ åðÏÑ@?eÿkT“¥ï‘Ÿæñ3ÙÿtØø)57Ÿ²ÿ5ê±àÞ~ã(U¸b€¦ýS%@a¶¦J€Â|u{éçgwÚ÷ ¢¥}aw`[Uï¡:jawè Ig9ì_VÀ>ì3‡ýkà 8½6sØ¿6d:û‡mÂ@úßòçô- àNËì¿qNü™µ0> mÿÇç+]…õlŸøùÁéŸÜöG_®MýÛbúg6÷Y0Gÿ«è‰•Ì5À*îO„»sz~O}ö¿äï&?îr@ŽÂþ—üýÝ „;ê܇›.]L Ø r ²p!'¬ prÌ÷oýƒ½OûY¸cÖ@¼èì}Î# ¯Þ5k F€,þêPhÃøóý‹7Ó |Ò@ÞÓ‹(ñçûó"øà«Žê-x¹¸aüyå0i²¢€ ÿ²úaS°&> &üËêOüyÿ°<æf(&üËêOüyçþ’^ïõõ9½ý²v™Þªãƒº>£¶D/SãgÕüâŸâ˜!š`–HÀ§ãóÛÚ_ãøÓÚ_ãó[Û_›æÿ쇱ÿ­}7ö¿µïÆþ×öÝkï`þ¿åÙ¤¿9´¡?¾ãÜxW•s6Üä€ã¨>ñè¥ا é“ö¿y™™Pr4éŸ"ª ·ÿ3 ‹Ãä UTQâ?o»Œ½bã±;ïö?£þÍ ƒo½Åü«øß€– ýÿæš`ÿŠÝ„áO@Ëоö¯Š0ü‰hÚ§=1Æ¥r€æAôŸ•Èk«àU 'üå °”s°B(üƒÌR]d‚´ €^ññþ ü_Á€áïf·¦ÿÝPÿŠUUMûÿ–; 0û!ÿ²ý§ÿá Å¿ý/ÈP4?ßAÀÿ³õsúNZü(¿c•eÿÿß Oû»;€|ۺƿOûÓ`–??‘ ŒŸöמ,ÕDJ€Œ{ûǹ˜7«ŸÔàÿ8ùo_š+€¸$ð(í~ÿƹˆ @‡)2îíæ `~¿^ÛÿGËhÊÁ@SKà½8Ú:|ÖßëHK£®Š·¿á H›œõ7c¶þ Ý-t:Ì*‡· mÒ`^8yœÕ·H0¦8h§§Õ¯Ù~nÞG2€má ±§­/cŸ›ï# 9x¿è3`øe°'ËÏ_dà=€ÿX{²üñëð÷}$À0üG@GìÉòÇóe¸€T@žý Âê?PXþðpyŽþ€°ú÷T–ÿüÜG^?a qîHø€å)4NÔ#@&:Feÿ[9@ ¬€~ò(Fÿt0÷+ €ãhžŸ˜€û‡hÀñáÝ­]M÷õ™ôP…ˆ ¨;H¨R±ÀP¦ÿ#ÃòÄT>¡þñRé   @ýˆ ¨_P¨¼T•÷c(> ðB€‹îï2Ý_æJÜRèV™î¯ óTtmçíT€šmÞ~…üÑÇðô.¸ îyã½p@x ÿ×ÿ%¶?û½?¿í“füô©óšM?7=¾õïGDÿÿ÷ÿ¡ñ/Àø~D°Ã£ÿV,ÜŒïGDÿï>B Å]ºîÂAî¥ÿ´V@J 0‡áþ콆?‚þ¯`Xª?^†–òoóþL p‡€Æ·ÿŸEõs ¾ÉPß~ŸèÀAÔpG¤M:ö÷å¹É0xÀbóÓÜg€©Ê€#Åæ§¹Ï Ã'@€Þ:Þ/ÝÝ3¼_ºÛOq^<‹O3õYpNæ¿6˜P¯P|„Hënþkƒ õ  ¡%S\çhþkƒ õŠÀ1úÚeàßé•ÿ®ýÀ_Ýn¾ô¿RÐÿ¦}ÕéŸòøŒ“ÍþsÚ_A¨VÑ/yÒŽÅ 1þ¿rÐþg0€7öÉ_–¿\Èò—f(÷ å±Òú§²áò—½Ÿå/€^üôÓ0üÇ2Ø“å— ß¿È@à?–Àž,Ø|ÿ®ä8€ÿX{²üñÒ1\@¾W',û‡÷­ÊÀòg]Jî#/@éiÇ@D.ÚžÊàö¤yÏ}ä襄ÉÂq…÷/¢¶áà>2¶!ŸÕÉÏäÜ?fûYà÷'øóþ\óþ<<>ýŒsÿ K¬q‚?ïÏŠåv} qpZŒÀýi%ðâtÀ‚ú?ä”ü›á÷™ÿœ&ÐíWíùýNÔõPmÏßË €3j~‚ÁçqÇtÏŸ…`§ l`«/ Á®ì¯®}kmš?Þ_Ýùû®?û®kßÚw×v̸÷ç3†qY^© z,9Ôpu¢¨0ìٻˠW´q€j ‰Nv7ÌA«}¶<^©„,öìÝÝðGzÒ…üQDáBþˆôíù×Â8ÿ‹„Ã" Ña3¨óõr“ý¿ö»<W¡M  &~ys $“<°§£˜/â¢m)´"ÔØÓQUNVíd蕜òSìé(Uü1}!¸ý/æ¿7ð¯/˜EF.‹Œ\DÕVOßlÿͰ˜_.sÀÎꤋݾ/P÷ Õ~»`ùÍ%Ëò·Ÿ¾9eÓu£7‡šî½9Ôõ¿g¯¬ˆjaˆÑ<ÿßp¸ØÊ'8Ùuß‹žÆWC{£Þ_Á%ovüy52¾ˆK–û¥Q¿jé£~ÕÒ³~µé+ÈòoO4¾[úø~léþ~$ræ QS.Zî4Äìr yÓ²{ü7ýünöùÚôøü*$¼ðxy \ÛÀ¼ªéìäÿ§ó³‰X¤ÚR2aA5Ó ¼ZëSbÐÁ¹;ÞV(ƒf&ÕÝ8Æ¡ s;À†Å.RV‡ajþH.åifùýÈÓÌòG|OÓð‡…ka°ŒµþÓTö©ÄIüë}ô)W™.þõþÆûOÝŒr„S!aòg^ßO¨P-"›Ò(Çl­ËŸ†ßOpqb nVåpj›üiøðý„Y8lÕüqþ›å¯2Š˜žãÏY=fûÖüky“³Ow@%oòoöiÂUò&ÿfãý—ñ¨‰èƒ ²“ĸ+»’œX†Ã8ÊÕä‹]«ˆ„9Ä‹MBÀ öÌO@!ƒÄdHiù{§™å慄寓 ²²ð¯å%þ•<٘ʚ<ÂÂëÙo÷Ñm‹½¦Å–/ªìoºÿ4ÐÍ(G7M¾è³ì†Œ+`TF9ºy`òeUjê7„6à¯eF9¤ëOÑIIý†©-•…8æøã*:ÇŸ¿0½ 5ÿZÞäßìÓÐÈ»•?Ýü·ÚßcãýÏz÷Jdz £ç°ÙdéwôÁ°!þŽöÎxšÝ„üÎÐ(fHq!97Xîú6wx(X@Ëo2¿úñ3ɟÃ0è…®¡¢Ó?yÈ&Q¡[j§Õ?yÈ“Lå6Núg’ÿÀ¿Ó¯þ~ÕóOúU’?é=Ç|3Ÿêþà‡t*z§?ø!…¡Ýô‡ôþøwïÇ÷~øûûñð0m€ôa²Œ—Ø"pH£5¤ÉÆI««a#ƒ§Dì<ÚôóµùûÓús­ÿ¼úçkÓï¯o~úæ§ ZiÁ »<ö 6~óð›é›‡?á?ù·±‹cß<œ¾ùæÞþ½}T˜ùÿqèá7û\awÂñ{€žý yñþ5þàÍÅàkìý<ÔvÇžÇ>|xp€?=+ÎþsÄHMúü1þOQèê[®°;áøçÓŸþDlÔéóûßâ?}þ­VØŒðùû÷ß¿?áO+-Xa—ÇÞÇfâÏs" ‚¥´¾Uÿ;þ<ô_ÿù_ÿñÿõŸÿSôŽ:D¨V£ÿk;ÎÎŽa²±šÇz‚ýOÔ Œ¤0<YELº5ʽ²Èóû“ÖáP3d ‘€|¯Ã‰‘6°,`ÿ3”X±4S Ï6üqp[ÌñÇyÀ µ9føã<8;Tóç¤9p@ñ»ÂPÿ²oý‡ Šˆ öËø—}ë?_ ÀKEüËþ ôßìsZú pùã7`ö•ÌiÙÿ´ô±›äkµ2#0§eÿÓne@’?÷ Ž«á/ëŸ'›á/ëŸ'›á/ëŸ'køyÿ²oý/ò6þeßú_ämüËþ ôßLb·ó!?y7`fòþ%A&´`‚a‚&ùòÝÌ|AhYãemæ3ìOX—ØT¾/jï!‹¹â¯óû ‡HÉ3üuž ÜþE^Æ¿ºÕ<Ì%¥­,þeßúÏãäL¥Ã"Òþ ôßìZú ðûa=˜Ó²ÿié3dÔå‹‹ðàYùhhøRš 0×oáb”ùËúçÉføËúçÉfùãDŠ3¨ùyÿê÷Pÿ‹¼õ{À ñÒå/ïBµÝM÷?ú’/˲^IAu¿‘n~ ­”åð€÷òÙÍŸ þäMÝãýÏ%óGé°²H·mùy©,¸¿{þ†Òý‰¿©¯²é¡{ÖÚ«i´E!=ºÛj§¦±â L$ïþi[Ú¹{£ü“@xÐÿäžô?9x5QÿÓûeŽz¿Ìò÷çsŽÿ(ÿMë'›~ÿnúý²éñGò§Êí‡ë¨©ÆzŒ},ú'v¨Ý¤ê£ÚÁ¨™õOìH±\Ó·Ž×´Y’þ)ùÇü‹~ó/úUÌ_ú•äÆ?†HŽ`ÐñÎáù³þÀÎfw€æ ئèü²yöU…S;€K þ ùÇüËû1æÏ”{?Æüé,߃Ÿ†H7ã“%Ï5”‹éòGú¨©a4;"v§»›~¾6~ÿ×úù&ôç ë'›~Á§þðáþC™ãXíÃø–}HÂ7߀²{÷¦o°Æjï὇үIxø„{R1j=mßÃ?¾ÿI€ áŸ/÷,ÀÀ—‹N¸ ÀŸì±Cwlÿ{÷ÀQ;°÷3{îà0+Ù|p wОìaâ>=&<êýéOZO÷?Ç?à$0ajTÊûÌ®hóã‰R °f Œñ÷°Ðòçê½÷ñnø÷H0þ2þñÇÓ ´!w`Âþ2þ§ÿü/`™þë¿þôŠ¿üä¯E;Îþ×w`¾QçÈVAíf²p c&s?¡0Íâvò>Àü¦Ó­Šˆ²…ÕÌÜOüÊÀ·„5x¸ËL• Ê¡Wƒ§IÏjþœÒÆT·f¶#þ`‡Fø›áŸuw®þ“,è E¥¿íã—öþO'(¨AØøÛ¾†dõB+鉿íßHÿ§†ú›I¯‹É_î9]ÁP3É‘3gò—;@\"CýÍ$Çõ˜üå—Zñ?áNr7ü°ûßÝ $ÙÁþwwCÅßäçoû¥ÿ&oðuþ¶_úoò_çoû7ÒYÈ4œ¹Bd–¥h›Épæ{;ÉWÎyUtØÃøÑ‹›¾”Í`¶úVÃ_ìx›™`à/ "ržãO qrîøûýk Öàoû…ÿ£Z [ãoû¥ÿ¨ÇD?'×Åßöo¤ÿÔšø¤¥‹®Ûý+w€8ÄP3É·“|åàëa¨¿™ä07)nMü»`«áA înøC}„ýï?ä ûßÝ üqZ²4yƒ¯ó·ýÒ“7>œ¿í—þ›¼å¿Û/ü“|6ÐÿÚà…ž‰y:8"hÌJä°`FFcÅKæ tdŸ©tTÓø,¦Ð/vÄ5Ô´Q…EÉâÈ“6ª°rðôø4Þ8ÿÊàÒö¿rø5´ý¯~ mÿÓû¥H©åŸÞ/E@>‹€nV>ø}7­Ÿlúý»é÷˦ÇOÉBà&ô ‘Ÿ€R“îƒ@PL(%ý ÓýÐg&Õ‘‚Yí5¨Yÿät?æ¨ôúÀûC¸$¤ò•dŽÒ¯NðOú• þŽ}*;'ÿñ.²Ÿƒï&ž=éBhï|Ùÿz÷OY°B¼qåR¥#€ïf ÙûeŽz?ZLâÈ?½Nðçû 3üùioÆGíp†ÿB:y4hÆOíL»›~¾6~ÿoZ®õŸ ¼ß7ýþ¢Ñ;|3ïÓO°ùqããøà اQC|ïÞÃýé'Øü¸KñÀþ=çbkÆ> ÿ{{Ó7øÄϬ_ÓÄ·¹œ3ýp"ÐÑÀx_®øÉù~wÐäÆÎûrЀO™ûš|—/€Sÿ°üaø“€O8¸£OzÄB`| "àD€ýÕôí”ùOÿù?iüOnÿÿçÒ ð?§ÌßB ät0û_çžÈÿÚzWêåÂn¸!¶ a,þ)^²‚7CÏ3@ðˆIæ(K¿o€²ôûæ(K¿å½xMÉ+ržsç(ËsÈQ¢)yEÎ#Àåï3ôJД<§Êa™£©äï3ôJ(ü³øaåFü³ø™LACÇ?__o|afþfðëBäVp@î¿üº¹Üù»Ã…"·‚;ºþþsòIüç䓸×ýï~©‹î_‰ö¢_¿ÞÖ¿LÆe÷¯9ÊÒï› ,ýþ‹ßÎWþ¦¦ä9ÕOCÚåë3ôJД<§2`™'ùú ½R,ðŸ‘óŒùOªR²ä (üsר~ÑÁÐñÏtMxC‰ëøgzŠ0ÈüÝá ‘[Á™¿;\x!r+¸ ów‡‹2hö» ë¿en‹°ÿ”¹-Âþ[†„Ü æ !èíÿÚàv8²ý_{|¢ŸÙþ¯=‰?²ý_{”8’ ño¨&Å´×è®+³ù©ø{û-·ú•Òµ·\÷›áï:8ômþ­üKÊø‘Õ ËK‹€ijÕÁ†Yz¿T[¿Ìò÷çs†þgøçÌ ÿü+ ü7÷û^y¼ºjƒúýžÞ|]µ{—~¿Ÿ70þðüúGeõõ Ãþ™1z RÌèƒú'Ô0ÃþtCÉX˜|>ƒ(Œ½Ð¶0aš }´‡k”ÜÀxË”|NÜ1 YHˆå‚C…¢2ÿ„HÀÑzþk€sо Оÿ!ð¿tjèùŒòªø§8{ÏOQµ3E¤þ§ÿÓý销Ö)" õ?ÍøïB—ä¹ÿãm‚3•|FúáaÝÿˆnýWª…¥åÓúÏò§S€ ç--WŽ€$:¸ð¥ãiùÔβü½7Ýáο?ØŽü+ñƒíÈ¿?ýÛîþöTÍø³¿v-æÈýϺsäþgƒ?]‹G`ðmšy’±óûO!9ÿ°ÿ ×sþUÿ€/Qj¿E~H¦7èò”òz-_4„Íb3êø’’èi‡zQ$¾ãaÔÀ$Ã/DHLî–ûW;þhH V6¬E ¶ü9E¯û%˜ù»Á‰r—Ô;(49´rÿÝàDÑ[3 ¥92ÿ2ã ¾Œe0@éÿxÿòÖ+òémÿ#ºõŸâiù¼¾,Æó"a!ZZ¾+²|éPܘ‰]Ñ iÓ¶ì‡(ü+ñs²dàÏóp±t‘%~ž­æŸ þt-‘úŸ þt-‘úŸ þt-Ñô_5ôLVqÿÕ}É*ì¿ùF$«ªÿoºÀRýóý…)[<{ß#é3=ƒZ1Ñ^sûŠx-ô÷|Ócw;þåD†Ðó/ŒbþÝb2T.ÃÏXÑ¥æï)ºÉðèÈ`rÿ=úºG»p\ôüqêgåý2òÇ]ñ¨¼_Fþjy>GþϪLØÿêö¿z@ûþëå¨ä¼ô1þ¾œ)…íåãïÛÓM>¦ŸŒüÇ÷{Û~|¿÷ôþý¾É÷רÿq|nû7ŽÏ-=½_Êø¹™ñ‡Ê tÆ'¸c@Ë3õ¹Ò?™õÏ¢n ò§F„$˜ä,¥Õ”ú' t€WpÖ_SÿØD|!ƒò©_]ÄŸúÕEü©_]Äßì}èzïjŸQéðÐjMø›žÃþ*/€þm¾Syþá3 ¤\ÄŸïÇ‹øóýxÿ­- ‚i”ˆÑÖä`ÚÓ1àˆnC'È]û#Nÿcñç‹öÅ Â<\?ç/;êÿÀçrý¿t ÿŸËõsøz’þ_éWÃpýG’ô+ü ®ÿxF§_Ñ5núgaH?Ù°þ¹éç«y¿&?ã÷‹çÒᵿ_2ÊCŸ-Cÿ'FÝc–³ü0Õ-;ÿ'„ô37ÀRô‘€ïíᢦGØ>çðïÁªÇ¼¼Rþ‘€üìo+]±þÈÉX1—-ÀÓÿ•{ÀèžC¦þ°#` +ŸYÿØà¬??áà'÷E€yy¥ü#ìÓô²ËõÏìÿLjÑÿ“EXÊ?òÿ àÙùß"Fÿs‹À—˜pÿ>Ó àQúï!Rü™õÿ˜yß3ûˆ `¸N„S£)³þå0€ÅLòÿä0€ÅX«H0…[Éf3›‹ ᇉ`!L‡Èô²`ÚÂAŒ´˜2åGëægXá`Mè³ÄµÚ;Û:;Û>;ÙZÁÀøc˜dY2ÔÞÜfíÀO&Ï<0åÉ6ü“‘«tg@êr O8Ì€ÔÿäÐH^'@î;:r%®*ùt½‰’|"ºÉ‡Óýf)·ò÷Ãhègüý0{â~çVþÉ]øWâ—¾`gÍü§Jü¤Ûi+þ•ø%óv‹‘ü2þÅ5;Œ‘GÈ‘!®Ù`Œ\þrdˆkväŽZbJâõ>‹Ì?ê?þÿÒœŒ ´=íþõ—ø‚ð3½gëû›QÌLÐË[æ'ß܇•Ê-ÍQ²’¹óoî_› høË³Eè:šhzQuüñrâë‰ÇùV¯ù§W1² õ?…ü»v‘©ÿ)äßÍèìÈýî_¼lKÿ:^¶E>ÝächHÒˆù¦pIÆiiéä›fKpaK+?Œ'þÝýëgÍüaò+Ò@ Xì¬Øpö´ÿ“øI·ÃÆßåïÆyÞ'EŒ\þnœçýÌßåïÆ9çç-#ñ—|à³0\\ùàD…Øÿdü[„Š÷ß¶U€‹¡ ¨B›&  pþm@àüÛBVx€óïr€ªùþÊ€]O~4C5Ó³"»ï™¯–ÁZèɰŸbì[þå‹1ÿLŸá_ÑíÙÐæ4q¤[Âð ’¡­¯2W €Lð·8~ÏÀåD.Џ@ïf<ƒÌ¿{¿ ü»÷ËÀ¿{>SæoÕÿêö¿zÁ„ý¯оÿ[ëßÎÀ~ßžnò7ýdä?¾ß»öÃû½§÷ï÷M¾¿‚þãsgàãsG÷÷K?73þHþ„¡ZŸ—ÿs¦ "‰ÿÄ™FÍÑ<ãÏMÕPc!”5šúx·çÎÜ*(@ª_’¹€¿¦].à/–ð„ }îð”ú/B´aFéi¿DÐ?àiÉøgú`ŽÁÛ–!j¾œÿþzx@AÄ_,Å)æ¿ žÃŽ™ó¨('b‡£¡\iü±a‡ÑV,ïîâ"—@&7÷1ø`z¬ä(ÏteÕwý@ÿ‡jîú9<:þ/¿Šôóʾ¨ô«ìb¡7èWþ¢‘‹ß²:{ýÊãX”†‘ïÿ¤ŸoæùÝôóÕ¼_ Øcü~qƒÆ Þ/üõ '¿_ˆôG+ÿáþ>ìzàùíMsAø ü=Øõ{4ô‘ À¬cȾ!$-Oë{ømpÛ÷€ ã߯fü= @YÿŒÿ׬¿ÿq–@J`‚Ìú–—{- =øéO†à~¶æ>2Î%xô½­=+@ 2Îì¯Eë÷-+Ûï¿oüñqÞ_¸ <øÄ_ÿHÈ3þÜ„WG¿y ü‹Áÿ™/àú†€TrFuc…õ \6á·Áš6XO[„6!VFVæ6Ó†kB<áD'íÚ„DVï¾# €ézïìlk ÿá 8 øî±~9þcnn²ç¿E“PÃ[þÉ€‹€‘ÈS&@êr P~½ÏKrL€Ôÿdpâ"˜‘œ (` zÿ“èËzµ_Ëg¤6ýè&ŸŠÒÈlÑʤ·ò镸ƒÆøÅŠøCz%þþæ¦`8î'Ü’œ¨Ç;†~‹è“o¥ö•û›€zI‘ùø²WD³Ñ Ȩ€Â¬|ÿ2;±çO P@{ÀŸ}d€åÖüýþµ‰vÃ#XRÿÍ%¶€ez@ÄÀ/É"JÿÇ‚A‘ÏH—0²|"ºÉ§¢4ò îÿF¾Ýü.æ)¨ùúW/ºùÍù&¡Í†('*âNþæ¦`¼ù€ÆÀ/umà§™ª]·ð-2ÿ ˜@·ewß(¦w[….¦ Ìð/'jø;Ð@rTxÉM`)¹î 8a6P/¥”Qå6@…g`ý—“¤y¿$<ƒÂ¿}¿ŒüÛñ/%'þGÕ ¦à%Tý¯^0aÿ«´à1ùwÃïÛÍð¿oO·ß×ôþ,-ÿñýÞÍðï÷ž>¼ß÷êu–`ó¶ÿãøÜ9(ä,Nï/ö¢¥§÷ËuûwY{ ²ž¼ŒÿÊ5 $`û­ùG•Mt3@¹-Œ#Bä[WYꕊ”&(õ"þlv æþ<§,d‰×ý'&Ñ„øÊN>Ûºÿæ…Ÿ<ÍMÿÍOÿÅüyÚ‹ø“~ñ6¬Èöç>Í ™<ì|`Ýÿ@žF9|ÔѰ£TÚÿw9ü˜ <_´/€üôs8|FûÈßI?‡=èÿÀþrýöH²/*ý*9Bˆ±éWEÿQ`á ¿ýG…ƒ~rÙ­üZÒ«ñÙ6mÉx6ÍûÅÞ|ÈÂ÷KÉÈx9Ž`È„ðgÖ? vmÀ ù¿ËÃ=B! èD¾†ýÛˆ  ¶¶ð'€þù"•`ÿýø`8`gS™2þëñÁÓOŽ Ì?ü'ìgüižË7-ð øÏå3Cþ,VüOãßyï½Ï÷EÆ=>4¢ùÙŒ7¾¯õ‹óÿôIDAT ¶>¬~›ñïúo€éUbpŽ•oB~Hˆ„(A¬u ak(Ôx5“)Á8Nâ>+\Á°R™®hA p8¼Îwó…›7@-f~±æ/@âí KRæµüy˜ø¸t‚32®—?¯A".<6¬ÐÊŸ‡ÙÇÄŸYüªmÚò_×âW:pË5Uâ^xáïtVX>8©RrÿÝáÂòŒ6Á÷˜ûï+ ,e¬ú?Ê!šUÿGúáaÝÿˆîýϤËîßKè0Úõº·w~ˆ0ÿZ'xk+¡}î¶QD ç6ß¹yTCÁ‹†‚¡S»Räf'_ äÔð­ìñ^¾ „XD‹Pãÿ> „ÿ> „ÿ1 …˜Î’¯¯J0Joàg@Bþk1Š`÷b €VA囑g0Pu°ÂpÍ+E¬ lÉOáe«ÄÍÀËF9úýûÅÏ‘Yõï'dVýó鄪«Õ ¦Ò$K_«L¥I–¾Vh9X~ß> ÿ}û;‡qâïÓÓ Å~½Î0¼ßûÿþ7Ÿ¡ëEñïß_}ûþýÕÒóû7w£s ãsŸpqÿ3UåØÿqüéù÷ãÏ‚`ãòN1Å4M6ùì(hÄq |´ÿïÖ(èˆ @Ø*7lcLµÉg7@ñ”³Ü“ú½iþBûϹd2• ï¿»“Í¥¿5ö(“ý„ʱAþfàËœ/å=‘•oôÍ‹|fàëéâ`7Ý}+/ï™Ka]e-_ã#Y–2žôÛ@æÍ˜õÛ@–^ëúm¥?gýDÊŽë‘~"e'é~"Ý3éY?©Æçp³z•„›Íû%ØÙü/GLù~|@Š€àÿ'¬9¹ß?_€  >ò?Œ€ࣵùå1\0óûþÃÁ@,ü§©ß÷ŸÇä@[™úÝø&×À+À8›X{19(È?¢Ó¶ŽŸÂ†#2ë ÌÚf·­€ãǺYº…ÓŒù§ÛÓÖDV]ÃÆJüáhÀêŒóÿÀ`ÐWÃ0QÖœÿ§¦€Ìƒ†? ÖðÊÁà´!«ùUü3Àé¹!x€ÔÿŒpŒ43"x€ÔÿŒ¥ <=÷¼M`€VýéȬúÑ­ÿΗµ=ÊŸïÀ^€™Ìe”?Þ™¸!¸ÿÕ(¼ŠßøƒY?tVüÁ¬ˆº‡€+þ`VÄ~ x0ñ÷âçÈ…¿‡üÇ8}î(ü]ÞÄ1$NŸPUÿGùí+! É' ÃÅPúÑ­ÿ*Õ#´yÎÿ3EÀÖªÕ&Fc)âúû;±´ppO2îO!Ú¶NÐ¥ZmÀš?S `êÐò³Äu;¯æÑ­H5†@YPX¹ÍÝŠOº_Ñ_4CŸýþMýϨó ;`hbB¡wþ€ÓBªwà(ôÎ?(i —þòÍ6ršÿh¿£J f¬aAôòeP¥]ŽÙ÷½|ð.O¿ø €þ¸¯m¼3lÃøë'Éàw­änæo©ó°ÿeï­Ÿé È=‰Ÿ€`Tï÷‘ÿøþêSú÷WG÷÷¯½GFþãø<àÕû…í[zz¿Øøôúƒzüù§ñ“úP8›\ z"Ï È }Úñ W¨è¨U‚–VƉÆhe€*¦Çb6Í_%OÂþ[ €›dAÿ-@e„Âþ[ À†ù zDþeöµ>j?oF¿û¯ÐOvõáôôüšཷ(}ЛÀ‚ü|A×u}?!ŽEú?퉄8éÿÔ—âXÒÿkýŠúˆé?±~E}*!:Eú•4GtJ÷¥?3³ÕôÛXf+Óocý&Œë·•þ\é'¬ofú\n‘~’õ‡X?aà¦é•~Ò¼_0^îVï›òþJÃñÑ£»9M`ŸqýƆ}áì©&Ÿ’¸VÀ¾!ø¾JõýÈ­™Æïˆ¾¯dýo8Ë5Â"@ÚOÚñÁø€Ó 2áø`1@€ù@8˜þ4=Fº?çþ¹þöqFð}¦ì«üŸ­‘Æïˆ¾oIŒàš¹ŽöÀéÿ ÿ ¨Xÿ¸ÿ øÿ°ÿЏv Àét†tf óˆ"tV:¨=f9dø=ô_Y…0þ¡VÇ ÍŠt|>NhÏŒÕñ➎ï;<à‡,AdàE¡©–?†jðC– 2@'®Kà ÁO(jœ]ePÅ?cÀ_!Dw¤þg ¼k„hà€ÔÿœsÎä2òN9è©ÿYoËû«Z>ý°îD·þ+Ôù[¹>•ûcÀAþV®O¡p,8ÈßÊõ9UÈâGÅA¨ùó@?*â@Í_ˆÿYü¨8ˆ…v2•Î#/ èýÏ•4À•¤²€ÞÿìPI\I* ˜ú?ÊÆ{Õÿ‘~¸_÷?¢Û©ðO&?jU<¿ÞÜ<. ‡§@¾]n“$ŸˆnòQ¹?莣|­\ŸJ*±à _+×'G‚åMàCÑ)@åúœ¿ÿËðAÖ ‹þ§@â!놿UHâ·xƒÂ?;é‹o¥²€©$”þá1¦¹, ÷?;}0•LýåáWò‰ä[÷?¢Û©ôb,ŒHt=É!rp6.‘A¬€½ª‚@Ú_=Š·Ô”G»˜Ë¶ª i|d~‹%lº_b“nB#nàçÙ/Z}j26ïéªúÎ{þMEãË! R9è…ÿ àŽ@¯ù[þQ)HÖS¹<2—1¸–ûïI¥  ¢uKÿ‚÷KÃ?x¿4üƒç3èzÁÐðŽúŸ^0sýO(.§í?Å`4ò0Êï‹öNbúÉÈ|¿÷zÿ~ øêý>òß_} Aÿþjééýkï— ÿÃø<èÝøÜ¥ø{ÍÆÏ‘ÿ8þô)ýøÓßÇO%û¯1?¶S ŒBGajL)Ùÿp q÷_Ñ‹]}àîø!, €à%DÛc~ì½Úe:^ìø¦ùãåùý§7Ú{QÿÍõJ1Ãô_QOœÞ(%)°ht¤ñmÎÆ ø|ˆýôóýÿ0éç3úÿ~ÒÏ‹þßèWYÿ™Ñ¯²þ3£_eý§èWµþÌd!Ólcý†ª¡êÏD÷ÚY®õGxâP?ÉúÜ~b¤P/‹~âÉe6c\6¿ôÌøŒq™9o4ôÃ÷ Æe–ų-Ït|ÃÄ­"€Rÿu‰H÷G¨¿ÖLÞîB÷í8’ˆ€;k&ï« ÔO;®š£çËÀ•ì/z¾T€{÷>ˆž¯„øíô'bÀrçú±# —ùS›kØòr03ÀŽ+@Ùÿ\'D¡è¸’ýïGýgÊÁçŒož`±þÁø`™×vÐXÆDªýïcêÿÔ^´ü£•ˆ™y¤ãÀä§¶µ/œ5¨Û¢Çqú8™ŽcÑNÛ˜&8¤‚«]ªØ„ût;ù8ý±0þQsÊŽ;$æó<ÐÒ?¦fŽÁ]û™?óyœówüÀ®ýÄ?ü ¢;ÿd𳼌 Üø'ƒ_è2LÌw@îÿ¨@¯öëþôÃýºÿÝúOg"+ÕFòç 7‰°ÿ#ùk†›ÎDØÿ‘ü5Ãmüù/‹_¡òkÝøóŸÊ¢ýª8x '@âÏs(Cýcˆ_÷åpþÉ€ñ‘±u€ø'ÆGÆÔêr`|dlAäÓKÐü©ÿ|ëþGtë?L4{Oó+{ T ¶î_Ü0ÑhÅFò•±ë‡èôàƒ'b[8mš®Wè2Ä_³îº)@ÁçÙqço³î´—xq€õ}*þ‚ñÙÂö‘¡Øy¤ó»8 ÿh(:„.õ?Î •ŸÝwºÜÿQ~„Ü­åÓ·KÕÿ±½ìtð§³›ªa4~p†žÎnØÿ‘|5ÃMgw.ÿGX_âÇÉ‹¢9Óí_¿*bDÑ ½ñç?.?Üò´ë%›øÛ9\üü©„טù'ÞßôÝ×âŸ"`ÿ3¶ ŽPÿ“ïoÆÔI>½é5)ýä[÷?¢[ÿ¥…ž+ò«^°lîd ŸcthÌwìŸgÑE{–d+ìCQJ€ãCȶªxÈ}Œµ‰?ÊZûp&£7äJÈ ¿¯GŽv0TØ!¼YŽ–ìHmæh¬Uµ»_JÜÃÚp Ÿ²‚‡@3’Î`Ç wüzÍß½ÅÀ‹ªúï——"ì¢t}Ì“§Å¦þï—Šø~©ø‡Ïg%ï¿¿ßµõß_0bõßÇG1ö‹*òï1šßòíføÛß7 ›ü“þ3bôï÷Þ@ïßï=½}¿ÝûkHhÞïƒÃß¿éýÕóÇçÞ@ïÇç! ŸþÃø3¤Tã'oÿÎÁàã§è¸!.t0þÿ_Á$;v[ãc«èÁ°9þf ü@ÐÿÆô¿qlŒ?Ÿ¯äøË]~ÀÓÈ€4~&ÛåÇ!ÆŸäàþ[:X@/ ØèÿY?ŸÑÿ³~>£ÿgý¼èÿ~•õŸP¿Âë=é?3úUÖŠ~UëÏ,©-ývFfÉné·3ú3ÔÓo+ý¹ÖOX²XúÃŒ~Â’ÈÒæô“¤?TúI5ÛxŸÀ_¢ñ™?]Êm‹Æg¦|¤—¯aÑ#݉ÿZË€ ¢è8áþîÄ­å@†?QtœpH÷Gâ¿ÖÉ@O€àþoÁóÕ8‚ç˘ùgö?Áú±Nšæ:NXùœÕç:9Ò¾ }¤û3ëŸë èûÙô¿qýoAÿ_‘À4Ãç (9šw!3GÙrcM[ü(ØI8ZTüÉ)ÎÞÛûXnϹå2úÖÖ龜÷Ë›‹€€\ “¿ ê!Àª/"©•¿Š"ÀÐf9GÓÊŸ^F8ˆœoøùP¸)~ì³€ÄßñóAÿèÈÎ÷€Äßñó¡pLÇ!w@Ÿø—Áô€÷¿D0‡$ETý7‡‹] ïÛ/ýñTpPò BÔQ¡ð×ÍÙ.˜=[üvµRär´÷ï%÷7>DÕOa&¿ pþþŸ»¿K‹ÂÆo.¦i,Ý7_wÿÒ ÎWÇõꕯЇbÆ¡.ü-VH)E†Ÿï÷/u `Mü?çï䌶z5y zŠŸîKHüK€ÕèóýÌ?§XíÂâðþ—]Fq¤þ?ºe5¸|2~tùÇá"Ÿ±=0k"ûŸ $ôØ‚²\ðÊÀîÂþGÀD/€-Ǩâtfvö¿’˜²yÎÀŸó?ì‚”Ðê·… ÞÇæ Øÿ œô³|»˜Ë<äÏØ V¤l´0°"P3óõ½éV ZšÄLƒënuØcèu)µï÷làßÕûåîÝîý¢óX =ŸO¬Ú÷ˈa°k/˜ÙþßµL}mZ©õ±òû¾™öþåýÙ§Ôï_Ò{@ÿþê#ê÷×È|'öúðFä{¯|ÉÉ6~FüûñgH1èÆŸ>ÀÆ_þ¿#ÛÓ Ðú‘Ö7R.ÛÓ Pük»ôÿ÷d{šŠ¥¥/ügä#Q+ ¤`| ‡4Q*àƒœ‚aÑý€Aþå ©¨.À¯ ÑŸmg^6et^Núm¥?7ú‰íÌë'R†.ÐOLjô“æeì4/“`ç—ǰçÃãüJþj(ëÿµ#ÎåŽõçÏñž§ý/«ˆï,$Ç ÚœêŸbÖK©e¼Éˆ$8¢Aª•±ÔÔ5ñÇöd‚$¸Cãu@÷ö>¤ÂéÙó…ÿ)T”52€Œž²ç @Üí2hë#œ×²çU Ôøçœê²ð9¦*©ÿ9ç:=Æü?B7í§þ眘 ˜›õéi?÷¼ 6Qú?ÒUl°ÈgøóÓØ3Ä%$¤7ò—®L@(»?üeàš!îê[ùËÀ5þV>ú6Ä+ƒ»[P±÷>bV6Ôkw$þV>¶Ï‡ ü`?ÍàüK€i5¹, ó/¦Õ䲀οD¸VS.ŸA~–C™ú?Êß.Ÿ±½;ÜuB òúiÿKÝQFóÏ-=Àþu÷·¾ÌIsM¥BŸ±ºw ‹vãJ)ߪI œ4¬(À*û?ñ§ùËÙëië]ο“±ÒjFQ“÷4½~™¡eÔâŸBþ-ì’ª8ÿòÏ m¾?”.óÏ9ÿ¼ζ[€Ì?p ²¿Èg”oÓÿà÷ŸüÍ—ty‘õø!× qÉ— jùJÁtCÜ*èµtýÆßÊçÙý‹µ<¦À½W‰ºô®ÖLpÚø›í‰«€øzî.ç_"Œiå°LXOH^…\Ðû_"\+N©ÿüšþGò5€õ>¢7”hV"´/çÌ«ǰ÷+úâÀ ö~E?Á(Ó8aïWôcÄ4€Øû'p T€=e œt¨ÎñI ÕÏ-[ ’” Pè HÿüE¯Cßó/Œ”<0ð¯è6knü™©d\ÇȨ©ÿˆÌ,±ºwï2ù6¥Ñ«ÿˆÌÔTžƒ–,ÍÔ¾]žuïÃ|ô~yÔ½_êþóù<êžÏ±ÿÏô‚©³L¿÷ÿ‘^0u–©Ëßû¤Tä1•ü €æ÷í"ù÷t;ƒë?ø]½{¿z÷~ïéÍû}à?¾¿†‚úýŽöÝß¿þþøãso ×ïÞ–îïŸÇþãÏbÐ?]€\¨˜àj<5|ìl~|M úÆ`Ì€«pmAÿ•Êø& ôŠ#2ˆÿW Ø{•1flš?B±öãþ# ›Á\œQûoª†Þäaÿ©Jv£ü9þ$~ä„ @’¯@Ã`€— äøé˜ÿ5€åùJú¿ëç³ú¿ë玮èÿ¦ŸWú§_™þ“щýÊÓ9gõ+Ó*ýªÑŸÓ¬ÙœþlÊú¼þœfÍ*ý¹ÑOҬĜ~’ô‡9ý$ÍJTúIó~!¢Œú e¦Ÿ¹uÁø ‚Ç¥ñ™ýLýG8¾~âܾW@ð ?€˜Û74Èd$ÿCæ÷ˆð uCÐq|™lÃñÜ™€3„Ï“T#à ~¾˜0ýéÛÏ'$ÿõŸHØOh:ÎB¨ð-3ú‰P¡è¸ÕéÃwTù @ÇßG Àãoãþ#9èÿ‰€¸ÿ† &áø t€k;N½n‡ýÏYX¦Ó¥NióTÈ÷*ý…º0ÃÁyår•6¯ÁjjŸæï%þL͇m¾þæ–=ßðWj>lóÑ`Ùu-¦æÂãw8¯eÏWüsÎ?}ô×(èýÏ9ÿ`À\ÐûŸsþa á¼HÜ#ï @C`E>½éD·þËB—MÞ|‡ò·™+n/ùcî±’¿Í¥Ë`óÿõù›Éîü—Ï/Lûß³;jþŒËÇrð;Úÿ|ë¸K ñg\>–ýiÿ“wr ˆ®`~†äÈýÏUÌϹÿn°ZŸ€¢€ÒÿQ~ô@ùŒt`Tò‰èv*~0‰²»ùf¶$z‹½šhD/ß&2Ä*ïs·þ|hæ’ÇO˜ßû¶lÊžoø[6ôöï`Ùó KÈÇð' }'óO)Ê- 5m€Ì?¥¨ômåHýO!ÿ4mnï€Üÿàþe~~–O@g~~–OD7ùÈB7'KwÿšÉ. ]1ÍýÏ’=2ÙeáÒáBºd¤Å·x+›õoæ#ÅO¦|Ã6ü—E\g—@æ/:Å¿¥Ÿ8»ä¿H‰©öKÿs÷3”ßÃúïò¶¡•ü=ƒ›îRè%è÷“Ë'”%ŸPþ:•¤Àâ§£þøñÏ] à\ObŒÿH :RÈy°Zñ?ªrеK8”[U1ˆq<R0ò hevHÀ/¨–R‹áÈ)Ÿmy¯o¦deà§™AåèsfK•Ų|r€TENQPp†f4ÿ¢Û¼ñ‡m¾ƒ2€Þío3ðïº/4®»J¾­ûºÌšÊÃÀ M;Hüõ~)~ú7þz¿ñ~Ëï÷†¿žÏjÖIÐ\ÈÇ´ï•<ôò»=‰=î?~ÓÑ÷ŸÝ 0(®üûvîðûötë¿é'#Ö‚mßï½^ë'lßÓë÷ûÈ|õ)ýû«¨ß_Aÿ‡ñ¹7Ðûñ¹3ÐýýUÆŸVþãøÓ§Ôãó(Ÿ<~žs¼Áüž=…n€º“;°öéÏœãþtKøÙt@‡(ÆÌÿÃ@’ÐÉÀJ€„Ü,ª¢qÿY ã3ذÿîà0ößæ¯*(ò·#ò_ÊÀ·€Úàe5~FVñ狵6Mÿ—~~þ/ýüý_úy¥ÿ÷ú•ô¿9#ýJúÏú•ôŸJ¿êôgW:•½éÏþÐÎêÏ®ßVús«Ÿ¸R2«ŸøC5«Ÿ¸þPô“æý’Çóã³öóã³”ñY†¾j–Gì?Êzöÿ>±( Óþ•úÏØÿ=l[öÿíísßkjêÛ @p2óÃñÁª ê/|¾Üp3?|¾àÀŸ”öÏ?3à±²ÿu û°úeù³ £ü*ÉÀD`:@A 6 \ ŸÇý‡gàs€:À8¾‡Ç·Wã89×Ì -PØ ¶`ß ><­ëÓo*æˆ P Š×ÄÓzÈt|9â|²’g 5žVòçlù9€ÿ<óáɱgÿ«(ù£ «5ÆËõ‡Ô-»aΟ¨xæ‘Æ;~„À²ëT Ôø'€‚sÀ?E$þÉþû䟉28…ÃYEäþg½-o°NpéÿH‡§¡êD·þ;%–¿çå_ØÆòOûáx¨9G˜—¯Ì´sS0Ê®û7œÚ۰ü”A={3Iß^¼!Už PSp¶ñ xÆ?]V8Ç,\«ìyG°':@4×Ëæ]ÍJ‹±¬u¾°ˆ @—MÜ·sö¿Ž¿Ù”ýMv¡ÏþFü•ýæiæo§ø+ûÍ ÒÒÿñ®aíÌ? A¯û?¶çp!oƒ-Ý¿óò-Ï zÍÿ7ò¿úýÿî%Ï0‚åÍMÁ0ãùÿˆøÊÕζÙ)¹ÎÂ_98/‡º'éF°0çâpï% ñÇ\'ë²@µµ+þ–ÆS ñÇÌß‹Àü©®„UhBƒ¥ºV …¯XºyþIKÀ}dFVüóe€ü £˜E¯ù#å–ìX}‹V|š^Éü‘R˾¤ÈÛÊ™û¿û]Ãx©„¤¹Të?Ï¿_ŒÿüûÅøÏ?ŸY>ÞtÿÃÔwœËßûsâ£: µï?ºÿa†ÚÈ¿ÇèåßÍðòïé&ÓO$"ó<ûÇø~ï ôþýÞÓ›÷ûÈ¿uøƒÞGôÃLKOT{¿ŒýÇçÞ@ïÇçÞÐŒÏCÿ_UŠ ̤êó½àø˜„R f~p€!ªì”ªÏ÷ÌcŒÙ4½aÃþ3žÐ=¬aÿÓ†—`Øz7ÌŸir0ûB‹'¤ç79ò£‹% øó›™Î&äç«èÿÒÏe?Çú¿ôó ôéç•þßëWÒ.ЯJö¬_•ìÿþþ¿D3xMÉi¶u=8Çãs=<—÷£¿_ªB¦ñe¦ý#ÙŸ³úÈøÇ ~Îþ×ñ‡¢žH'À>2þ' À1 ìÿ‡<~ïÞ7üèØúß6–ýϽŸ/ÆLÓ½{p!„Ï—~ðª„Ï×½{p|þXV?šì§ÁoÙÿŸËÀ´Býi®Ÿ¶¾£ð½tÀê—s?£ð˜{À!ì?x΀0óÃþ‹ÂÐEŒãÛ«Ô«C…ÿö÷+(:À©b!æ? ÿá©, æW1´Bõ“v€ h`ÿÕ0Oˆ ÅÐ<—Y —Ñc õÍ5@Žp±ü!ä å¯wàò'ð áì·0ñ²¶)aa dÖîãbâE¯rapÌoQÝ/íY„˜9Š0 äWcîû…¿R.X$Õ˜›¦â/Š“‹:•§`dþÞ·æn $÷Ÿ\ûÚAæ?èZø202úIì¿ÆŒïî”qñýM1 ÿ6¾,|Ï´0ÞÁËîï—³@ß\TeŽ/ºvt¡|­æ±ÿ,CÙÈÁ[:ÊXéç®ï_ÖÞåT³" ËÀ£›ø™èÄE8&„ÑÍ€( ó·ª àªSa\û…¿U]`X®˜{JFáoU ü„í'þQ¹ZÞj‰båmF0WÓΜ"é½L Ô´9“c¨ÞÿT&š:#X ÀPÈ…çŒßïÆþýbüçŸÏ,ö¿~À¢þÛfïï¨ÿuû¦ÿþûö€^þCŽ÷ûöt“é'Qg ÷ï÷Þ@ïßÞ者ÔóoÞ_kÒû‚êý¥_¯£+VSï/saz?>z7>·ôô~)ãO+ŸqüéS ÊøiãOa`±Z²¾QüÝyÙÅ~éF2]ãôp²‹ À®G!Y±?s)e”107§#sÓüËößz&ÿgØ 6tÿjÐóœn˜?Ÿ"sàlÐô~ÌÀîìïÉà°€iü1€ x¶õ€ò|Qÿ?‘ ýü4Òÿײ¤ŸGúÿ¡ìéçZ»þo ÿ|oj-ýGë^¿R`Óö"ýJñƒ¦ÿàÆL÷ÖŸY¬;é·ÚêôgëNúm¤?³XwÒo+ý9ë',ë“ô‡H?a1ä¤?Dú ‹!'ý¡ÒOêœþ^z]ν_,(@9iáûÅ#²T Àß/9áÿ!1®/0dõ#Íߪp½?Ýðæï‡5Êÿ¡hàC(á¾€5¬¡ƒ>DM ‚@ø| €9þãçËÊ"€êð|Y„ÀcdúË0€Ïµf<€­ÿ„š˜¢ÿ–™þ ¸¯5éXcþÿsîq— ¦û‰À (&€ÿ:ðmÜ <ö€­­`|û/Àx@Øå,\ß „é%'%˜o$§AÇ„•\^”àC(|<Ž8w%ä¨ýaA æ‰Ç§o ?zÅÑ„ä?-Ã.ñOt™Ž·MÍ?eÿ:´‹5ÿœ€<#òÍûÎ?§ •|ó¾÷?§Ð0#¢ç çþ'¿Z™bDŽlÕŸÎÊÚ.¢¦i-ŸŠ¤MäNH>6Œhá<´¿Õñâ3 ~ÂaÃŒ•ü«*p P¿bmÝ>«ªÀ)`(}4ðiÛ$D/‹Öü­²„+ñ²(`Í_®Ëúçƒ þ2d•TÖH͹ÿr »'°ýsYÀªÿ ôŽì9ÀûŸdbraí—þË{Ñ-HÁÈü“€ê¯ýAò±„1Q«dÎSC³° 2K½B©W¡ G¯”ï¿¥Þ3(™Ðï¸4­ Pñ÷3”€™j5ÿ-ëûGú‡…™j<¯ñÏ)Tš}ëN !×ì[ÿs ¯¤ÙOýOÙù º–OSŽE>ãóA2ûofl/_*NB™²™l»ÿ+ùÂ)`(}RKDå’«¨0 ²ë¿¦æ«û—Ekþ¦Bñ³(`ÍßG¸,þž¿åü³Š/,v zûo €¨âƒŸ"—¬úŸ@ÿ0ÐÂá€Í"¼ÿI@õýËù€$y/ºErsùÌ€Š1ÐßL€©,yÎÙj㙢"MÆLã<眃]—1 DxÀÝTГè-‡¾ðÏs(3üó„Ê ÿ\g°åo)óGÉ@ÌÏRÝÝÀ«4Tï¿qÓTa`ê^–ûÛãQy¿@ =AGåýŽ´€†¿n®Ýò~ÇôkÃ?Á$äÌØÿöûß> CÿwwW êÏ£üY] Œò?܃ðóG’¿é'|¿ Õ&ŒïwŽª&ªñýÞÓËûÝÞ_CŠA~¿ÛûkH1èÞ_½ß¾¿úþãsÛ¿q|nééýâ~Æ¡ÿãøÓ§ôãOŸb`ã3âL!áCw6@õLz Tº•Càö?Ðä<™Ho€b€jÞì¦ùËŒû ªæ°WS2 ÕÃp@ÐÃØ0Ã`Q?v·ÿÞîzÇÀéBÎÙ=LuÒøcEÿ(ÂõÜÝG(´’’þ™v€éý°å{ýŸ©L“Þ„æ^ÿgª‡æ¸Pôÿ”ð¯°×ÊÚõ7³ë-˜Íô’A¿J¸A®W¥û?éÏÔm³~«¢Ú­þLÝ6ë·*ªÝêϨéº~«¢Úöü&ý„ºCÖ4´ú u‡¬?¨hq«Ÿ à“ëVYÏW6éeÖóà üèý¢—Œ^+ñûE/½Vòøì ÿÈþ‡5¿eþÖך°~JøGö?Bõ±¶Ìÿ{øý¸F@JøWØ?fþó÷Ñš €0ãÃçË0Ü<_†p@ Vèâ’T„þïO“ÚÐ|ýyNøW¼?Ãñ…Pè(Ùÿ‚Ð~BÀ×áAˆû €*Ð?©®Íø`:§‡;"±Ølêÿ«Áð„FfW³v;ÁóŠä|%äla VD­þüÏÏ+’óõBä@\Í3Q>FTŒ–ðó¿±üÛÿþ·±úk¬Zþ½áO:–ßùÛWü‹Á¯Æg¤ù Zÿ‹Á¯&ï§þƒ_‹+ð2v¬ÿƒýƒç·–OÑ£³B @‘OD·þû ú$ïb^ p¿ÍУ VEþ^·eú4C* \åÅëö±ûš¡Å›PLŒÿ(Þ„hüÇö °ŠFj  C€‰ÁÞ ùÇ?øR€ò|=Â@)ì5âR€‰& ÁU\PªËl^5æ·„1¾hëû—¶z¡xB>_ä5`z(P[¥è§çCP2–-þ[þÁýíH5ÆÿŸ±ü¯þ_aõÖXÕüÐ:Ì`s¨äþ;è\‚äd´a8 €ƒÎY‡©v$L€ÜÿâùJ[æpù÷wBÚQÿ#ºÉÇ<àÈ—å*/¸ßfèà)خƟÜîV`M@î7þãý›Pÿ(þ„hüGñ'À*@¾Ldw‡ŒýÖ¥¤‚î1uÄúŸ ~mºCF¿Æ\€ º(ÀÕFH„r™T? NOÀÄYÆÒL¼B<[ù°»^ÈŠ^>¥hJ̗̈!ž ·™/Œ—–·VÄÿ@!#¸=AÏü-­±-gRdASÙ#wI‘Í—i6Ìk ΛáÏk0@Â@@Õsixd®a °ôŸ×`€„€ó´O)‚åùÂ^Ë©G´÷ûÀ¬-¸×ò°–ÿø€µýÛ7ü7÷ûÞÄû=ŠhÞ_ëÀ€ùãüþ #ê÷W Ÿ\s|Nﯹ€qüéýøÓGØø3!Ñ;Žøn€îì쬆~Žô}蕬3EÕ† Púyx7BQƒà8Mï-™¹ŠGxŸaèP[á Ø4£aÿ¡£g¥Ãþ+@N8'qÿùæd ÚFùs|À°áEœÀÕ§€4~fº90VSÂðñSEiĘ…¢ ŽÀ_Éô*‚\›~.•º±/0¡x.á9@?§ÉÑÚæX—*…Ÿ&GÒÿMãLy¨ÿè{þÆ™óP-*€FËú©,ÚuýÖìÿ¤ß¦ºÚE¿5û?é·ª¢Už_(µfÿ'ýVUìùuýÇìÿ¤?¤ºÅE0ûß ÑúoõD Ro`5*Óƒ²þSÒþ[€ðý’ÝÛ3ï—ê-šÆÿ “úHþÇ„>æíõOÃk9à@ò¿þ1¡ô@ýÓð'×ð ùß,8ÌßîÀŠƒáóF@´€`|#8èÿž/‚[uãÃCÀ À,@ú›dXÀoÍò§¹m8€˜Ò/§µÏì¤ÿ»ë ˆDÿûqÿqæo³ è¿à[KbÀÆ7uëúE+€“¡øü›Y0ë 8züqÄŠ>¿ü”¦éïX±®tµÀRoé4Ý«SkþwFßÍcÌÉèªÇÝ­hcb–¿K͸[ÉË^ò×ø¢w+b8Ýœå¯ñEFñÄ_ó7ñWÞ†TüMüÕÏÇù…Š.û§œ‚&Àûït`¬L¹ÿ)€ÆXilî?â †….Ø$Ä ò©²| §²] 6X@½H†Q¼€iöþ6úFpý ÏG$ÀÚ*ÃÚþòM”#(MÿÃJºCYnàª÷ùÜ÷Ýí×8§ËÓø!h\Íp»Û#‹&ùêý§nw{CæüÏÔ7üÙûÏf¸õj îßš$þš$þš¿;`ÔahÆu€÷ß#”S°1Jÿéðã]^E°ÿµk5ÉQó.Ä ‹æœ¿WoiouSÞx€é,ÑÝeÓY"ºQ,Û<¢åfø»æ5=3Àji<«Ûj1‹Ë€ 0+ï—r¬fVÞïåhÍ¿<Ÿ}Ž~ô‚©å½`jùGèÍÈÿUcs|øþµ÷WŸbп¿ú‚þýÕcï¯ \LÚþãÏàèÆŸÀÆsrv.‡ ï¬OÛgZ³wü‚BÐ﮺g^Þ„4Ã÷<‰í3OíáÉG£§Ø`üÿÎ.0äÏÇÏDW ÆÝ݃äHã§9°ÇéÉ÷î¢èPÍ~µ~.…“ú­ÍÏ ú¹Nê·fÿú¹)´É`Ïo­ÿdýÁæ?ýGõ³ÿýÇ_èî °ç«y™;£g¼=Ò¼_‚ 9ËWñü–€q|ØôU\Ö§_2¾Z\X5¾]ÛÀ*8ÊÒÇ­=íËÓ‡{ðâZX–>|t˜ø§SJ8´b!{| 1ÊÒ‡nÚ–u‡äÞZ˜k¦#üZÿ'„,ü1C#Ttl®dWøÓù+%^ £z“ù§€t-¾Ÿù§€t-¾Ÿù§€t-¾_úoòA=“ÕŒ|0sf²â*Ò&«J>VÍÞ«/dù§–Ö"¼‰HHòOF,$–MËù'£Ê"ˆù ~vþYü¯‰_LçŸÅ¯ŸÇÄoÁ’Æß~)  ð7y«6Š>Ó~âŸ1t)U@ꔂQ÷?JÁ¨úïŽø2É»Ëú3¦,2ŒÆrÀ´–ÙâÏý“ÑÔ•|-1€ í“qèp2Ê@UQ@•¸ƒ_ÒøG¬ùS9‘@ Ïj³ó‰¿é/ŒÀBëߜՉšñO×âiî¿Ïø§3æºô‰¿Ïøûù5¤¥ÿʲc½#“ÕŒ| »‚^>…‘U¹3ù¦8¸TMÚ&„‹|“?Mý4! 3Ê&LU}ø¨î_/(þ‘ø͈¹{1ŠÄoÐ^%ËËþy b‰Hý·¿”„Pø§²v)U€óW€J»Ø œóXt»‚+÷zöH·þ—ãofSec&ΧœÇ¼ÎAœñˆx›\·\ÇôÈÀGØûv(¯o”*XÕk.A›Œpì­¹þ§2€3ý/ï÷” jB0I ¿_bù”ç³—Oô‚ñ\Sñ^0µü£ñÑ~‡MË¿Ö6ö~S ú÷WŸBп¿º~ÿÖï¯ÏÚ‰qüéS úñ§K1ðñ“!~ 2Ðw JrîéûÂL#m7@aZŽ ÌðcV¹Á@€ì{xU3@ð…›æÜí ôßr ¥B„ý·½â«ßÒê aÞ(A(³È¬C„_Lø¯F¹â6ìˆÎÄzSS @?SqšŽV Í|~7ý|múþ¯õó¬ß* z~]?Ïú­bªç7½½MUW$€?N®?ø[8éæÜ/ï÷gª¹öë÷{Ò’þ X{¿ozüd–¿Ƥmbü=fïU!Ùÿˆ@™@ÛV”fÿ‘5À*€B@ ÊÚ6WÔ…ÀLÿ  <_JàY‰Œ*È <_ȸ‡LÿŒ€ßæJQßG¡0 mój(ûßP¶yH5@E¢ƒPú ¤ ÑŸ)AÿÿS:E8>¼š€\–æxQ¸Ã¼}Ö¹Ke9aŽÀˆoÇÍŒ|/Ë s¼( Ž:sܽì'Sf`„jÁÓƒa±áÀúÑ©ÈâHqó·üaIQ‰×¢ šV‰r¤£ÉúŸéZ’ õ? éZ’ ê?ÝxYFW|«f%L¹ äCäe0qåòQœ<3þ :ŸÉ) ÌpÞ¿0•k@r xŠ3þiÊfLr ðýHþÊXjÅïãˆßÏ,Ç¡ñ[ršsQ†ÆG+9°kü€.…y漸(dÝ`ùi–;ƒó—þÔ/rk°éíürF0ÏHD7‚ÐÙ=˜½8ìZ1a>›ãµ@ogdp™™ãµÀ ý6ü-ÒêrþŠ`JI[Xgd&<ùç¿–äHýO€t-žù'@º–äHü]>4ðM0±|²¬\d½|²¬\dì¿ füãX‘or äI˜âµ 9,ôíñªãPr$§€G`†÷¯YrV¹NüN1þøýÌÆ%aèR(`Å?aPÕ£Yîìÿ„ KI)¢˜g$ ñ-ýì\]™Ëg|>„X?†xlEò÷Íõ"^Bdçl Ê@_eÝŸ\*ƒPé@šM@Þ²³)ækRREc«qó=ö¶‘*s­ÆdàûFªh¬É-$Î+ÅQq¶q£ü“@މ ÿÉ ¼»¦ÿÉ0Óÿò~‰ù—÷{Ì¿<Ÿƒ|‚LÓÿàÓô?oFþµþ³©÷û&Þ_æôoß_›Ÿ¯;þþGÇmÁp3ÿ„ãˆûg¨ ìÐÀ2€0óW à+n€~À€Ô¼Äd $‹DÿÃé-Í>»ªï!@³›æ/}.ì?§â·÷ßZÃþ›`Ãü•y¤€ žõÖÀ(Ø¿4~¦aç Šø÷«(áÈÇ øÇÜ?ÿë‡`=RÃØôóUëo›¸ÿký<ë·yÒ®ÕÏ©•K¿Í“v­~žõÛ_† 3?Ü@3?|¾P~€eÿ$€´b*Àû€–8\´ó}ÅT$ý; ’|;­X fþçñøððÓ¤@ÿ°ÿ– ó…ý5€5­5ÞÐÄéW9C½ ä‚tH³2àô$Ó‚Œ0#,gµ…@œ~ÁQ’ ‡Ì€ßÏü­n5H®À¯åÍ.dꀎ¿,~K÷Q5¨íš öÉú_EèZ’ õ¿Š0D3@›þC>œ!Hü#ù0ÀøÇòɲªäÓŸdù7GóN‘L/òèZR‰¿ûÆ þŽ>ˆ¿¥¿¹)œ5ñ,2"Éòþe€ìAyç qúóýMëJ©}4F,K_eca†*wŒîWŒc4€œÿ @j5ÿbß[¶L§†¿æ¡}ê@Åß Ð|-ÅeýOÑÀ02ÿ„®ÅuÿÍ]‘bùð,¬®ù8â3Ïsÿ›û(ËwæþÏò¥SâÆÐ.—Ü¿”D1Uu í¢þÖâoÉop F¾l¾Ê@ììÈ 8ˆm]d‘M}sóÌOQäÁŒKç¨ HÚ•€™¯!‚Ø#Wø{ö¼¬IFhÃÌçÊÔ7ã‚¶%ó¹2õÍx`@ €t/BJýäó¯1¢þ›¦nQÿk Ï~¨û_Þï±|Êû%æ_Æ?uA¢Jü‡L×ÿáÓõx@ƒþoBþµþ³ñ÷ûÌkû:‡ë÷ׯÇçëtt®-ý׌!—õ™ P®1÷OÁá&–¼{· 4DI‘ksPw©!W(ÍPÎc¤Ú4囇ý— av\سð”oö_^WMBl?Ÿß\ôÏRTÀ | ’)! E`ڨŠp Hÿž *)p÷¯7þþßÄ3UñÜôû‹pÿBøV{Úæ¡}ì1??¡ #„ÀÕìv`æÏP Ò3 m®¶a·Ë€bñýÏ`äø\0~¾ å‰þÄÏÊÜøF€¹ïÛ\Ývgß1ë/ÖHÛ<Ä=|î_(¬¶yˆ{Âd p|†ãƒ(†Ž¢\; 5@S @xW›ÊBÐ…-y: áþØíT"ðzõ=Íï¯X‹!æmŠ3¿ÆáPf}½Žÿæ P›Yî†eFñ2KòGÍ\²• EyQ-ÀÌò¤ª(PÕQ7Ï+‹BF)ƒþRèÐ1þ½ø{þ‚cÏâßÞîù÷âoø{Ù?ž =Gñû=rÿ=çŸ]FÏáùQ@é¿çü³Ëè9ÿÌ ªûù°KÆÛ|( ãÊÇÂ$®Z>õ=˜R^âþ&~–§„ÏG/ÀþrºY^ K“ª˜E]ß\T(NZðƒçû×J;Y‰\+8…¸ŸJ¾VÙÑê_¥™{­DÈ•CÕ)ñïÅßóoÅ¿<ý–/þ†¿£þódÔ: ôßAÉ=g 0¥ÿžóÏ.k„³ý¦ÿM/H\¡|,|Fâ åcÓ —à©Ä¿š¡#É Ÿ[_7ÇñFù'@uÒ¦ÿÉPì0 0ƨÞ/å«êýRŽV¬ªç³Ç¿þã§ÈœúŒ2§þu¦å?3Ò¿ÂÃùý¾ù÷×+ìua•ÇçŒ?vŸK9ètìÀÀ¯‹s)èÝ»ÿÚÐ…rÐéxï­÷cá?'ø2÷%¤*•OúœþGü0)&À0T²¹ï© ÀºÊFnÓ1Ýôó»ÙçëÍ?ob|ØØÍãŒ77þ\Ûp|ªœ©® túül:Y3ÙÓA¬Êi¹íšýg0`ÅdwLÚ°*§å¶kö_³x¦;d¹Îé°ð߇ñ_bœ÷þ{0þ‹:º7ð§ýŸf@¡Ž×üS€â½Ž§³´ŸúŸ"P–8¤n€îï§þ§¢u2§!í7ýWî¿ñG¬l$äþÄÊFòAî¿ñ?,ò!ü?þÂ(£/Lþ‚!e¤þ)«¨È_Pú*ס¯ûo¹ÿâOË;Oæ¯è‰Q>ª9HþŠ0ùþÿ 7ËWPú*Œ § ÿ)ë­È—08°ŸYV7øçYo’?„$(}ÆÍü;ñü+:ïÿ'þ†vx1ßÏýÏ/æãû¹ÿÙàÅ||¿é¿ä“ŠÅò¡ü¬XP,˜ü^,¨È§ ¼)G”€ìs¨X"J€`ÅU- äþ¨È‘#Šã¡ðǸ˜#J€ÂŸq,) ”@š*ÒwsÖ¼ÒVÀ³°º›³æst=&Á=D«ßä¬ù]Ip*O7Ê?9æúŸž´?ô?E(9`ìy¿¨´gø2XÂäSÞ/ Ðó/ÏgÄ¿{Á ü»ÌÀ¿{@oHþµþ³ù÷ûfß_›Ÿ_ýø• jäÖfž+”›ÌÞ‡›üÄ@ÌIe€Ò@tLC¸3óÿV Ë€è€úk”Ü09SÃþ[ÏôÆ ûo96ÏÏú¾ÿ!°aþÌœ§o˜U}¡#iüÌt”!ë¤ñÁ2þ£¢/t„ã禟¯ZÛÈýßèç¯þùmõŸWÿ|múý…iøŸ0Eo8ªÙ‡0Ch> {ÈäO¹ÿ¬¢î ™ÊÿO¹ÿû¬ðð’ îm ÀZÆÏ—ΘÊ㺂dÐs<_ЏÿùãoòÿOÂZñúHøüñŸÀHPþ¿á°¡8uÿ}`hóÿ @•ù è€÷x@EˆŒo@xœ«ýÿ/Àä*AÿuÆk;˜Ó‰`~ÏmO(ލl§J©0›ÝrÛ·ä õ}ˆò, ÿWeŽ’Û^H*ÛÉÊÙ¿ÕéLËÈ¿!ïü3صšv¬a8O>Ídsëv :<ìäÓ‚ `ýÏ€}˜ðf”ôºÿ‡ñÇ s(x=ÄŸè4±|Œ?²Ãˆ¨,MÓ䄲hq¨à’rW<­Z!‹fùÓ!€Ùpå49KŒ¨ÊHq¨àˆ\3™+þ‘ ÆåÖÈ¿”[—økþ© º¬ñÒkæþ' tYþ Û/ýOè²ü¶ßõßDbã1&|pŽåãüÁ9õßnºœÛî¼ €I%%µ§û›ùù†`JÂH(óó  æßÜ¿#âî•eä߆¥×üS €âa9§ýÔÿ”s®¤üì(ýO tŠGÌ€¡ÿŠ`vbù8†ÐGòIüààýç49qúU§8TÙúehÏ ù–áý2ðéÀl8޲´j½ Nr¨ 0Ø4‰{ÿŽü!þúøwâ¯ù' «U„Nëþ-ýwù“¥¬sÛ/ýOè²ü¶ßõßDbþ:Lù$þàÊ'ñç$ŸÊ€á.f`xKÇ+`Hà`†·t¼r –#žkÙÿ¡à`Ú† €Ê'±¥r \V0àÏ”ÞFOçµh€ÿ¥úÆÿŸ æ,Z‘ꩾ±Çÿ›¬V|ü/Õ7ÎéíÞz£üSiÞCßô?Uð4‡¡ÿœŠc@5ûÞô?¿_føç÷‹`äŸÆ?;A'Ÿö3ö¿}ÁŒüÛt䟲:RiëQ>)ÁcN>)Á£’O«ÿlúý¾é÷צÇçW?þLHô?á{ƒA6@9÷û) |$ú¯r†V2@ù´B? ü¢ às<0”{óðpl˜¿Ìø°ÿ@ïód§¸ÿ ÄÊ€ ÿ=‰|sü9>R´ä°#iü)†æ*ýBô4>SÿŠ€ã柯VÛÀýßèç¯þùmõŸWÿ|múýÅÊ,ö'àüÑj þx€•ÿXìÏrÿï!â"÷yÀõkÏýgÀ RÀ¶| ñóe2ãñUÝÍøL¤ ÑÿǨ€ˆ³Ü=÷_%Q¶¼ÀTù¯MúG­8 *ÿ)Ð_µ™ @7íÀ„DÿÏãþ € ô÷ç»í?Ðû2€¬Ç7z®ï8f^'",·ÝTW$ dú6´ç¶'z X&»côSþ¿á$žJà Ó^ÿ2ñCþ5=ä_죆vÀ<Ç }v¤þgÌsÌÐg@êv ã˜¡Ï€¾ÿ˜ÿ9ùÀß þ³òqþ•|—’ó“ü­ÂNƒ_ÀáD1µÆü sÀX…èâ .è¼üñl†Ú*ŒÀÊÅ/Tñ¯Äò¯4´eŸ¶ü}Æß ÿT,µê*û7åb©räþûŒ?ºl©îèûŸùÏÉ'ñŸ•ó¯äãùÿ†ÀüFÈÀÕ¯[rÛ%_¸ÊgF²ÂHª \ @Žç_ø!ÿêþ޸בJ5ÿìPÀBr”þg€ÀîR@évì.Eýwþ³òqþsò10=¡$$ù°~°Ð€Ý¿VV.'O îVY¾ª€+—– ÁÝÚ_r¨ëâ—)ü«û7ä_;"þ•ø[þ>ã.«çî€)ý÷þüç€ÜÿTöOE|½˜/ wýÏüç䓸[… Q>‰¿Uÿ4&0¹†1Ê\Æš,ô4&ØA[¤s;!ݱI'Ýub‘2ÃäÔ"—[çpL3Ñårëùë -Úô»™ì&_ îŸIM͑ٲÍG¨¦üÏ—lÙúþò¯0ò™n½­0r÷eÔzÿ+ €t=MÿÓû¥0Of¸±Kï—ÂÜÍðÄߟÏ*o á_½`ÂþW/˜¸ÿeü ûoÚl[к–yK] áâß·Õ6ý~÷÷ãß_©züþºîøìãÛ+&$ú¯ñ0 k2@Í€ô} 6k`+Ë±ì¯  æ`l3ȳgt2@åâºqþ˜þRÌߨ)Æ) è¿â™ØŠûOBn›äχɆsÀà©Ád¥InÀ:€qµÀàþKã #|ò6ý|õúÛ+¿ÿýüÕ?¿­þó꟯M¿¿¾j?sû…€ ‹À‘}ðV¿G@Êý‡ù"N{$P¿–¡ï¹ÿ0ÿ`€wBü|ýx9<_ß÷> Î @3><<,wúHú§Õ?D˜@@Cßp4·Ÿ:@9„€E¸/€D Üûs~›Aÿ Pþ=bÿåÐøöj@]§ò•Ò¤ÛCõÞ–@©–Î,JCoŸÁ¥f¿â*ÄE,"ÚŒÀmØÌrHöV;Œ À§•UU‘,ÁŒ22óäœÿG ‚´î$ÁŒ22`6yÅßÅkµMFþIë6Ó€ºM:þ õŸý&×äHýO¨ÿôfkr¤þ— Úÿ) è¿óŸí¿óŸí¿,ó$ù4·Óe÷ï%tbÑ àîª÷ïu¿ÿcpF6³Ìô|ÿ —‘ø´²·rdù —‘ø´²·r$?€6ï¾›¼âïr¶Úƒ#ÿô3ÌîÈ?Ñ­ö`á_"0È9Eþ%ƒœS@á_"0È9Eý—æmZBØYþ^&8ê¿,ó2xÿ³îH$§¾ º×qÀ‘ãÁ@w¤çàPæ¶\æï ðѶ4øðѶdƒ2?'4¶j°ófa°lA[º¹Åð2€³PÇ¡tÔ¸Hòû¥5¿3»ü~ 1ì›Æ¿ÀXúÏ3Ãÿî]ÿUgøã ¶Ìò~áëþ¾×y/mß¾ßíý¸±÷×¥½¹úšñóÕ?Ö!jçµ*#´ZxÛðÖÚß3TFh½h4 `¨ŒÐjYøÏɧøU»Ù ×#–œño¥²@®5aÐ܇d¥²àW°éçwÃÏצßWP^¦Å«x~5†ÌŒ/Ó§«´¹¬ÿN¿d|côk?¾];à ¬Ìi×ôÌHíc ¡pü áSÇ GN;æ|0ó¬hzP ÇQo&Ìi÷ nœÁ3æÀy[ñ?OÓ;Ñ Gþ0‚q&ð„#ÿ5x¢Ø ܺ~ÂÌ?E$þBwúŸ"¡ÛOýÏ!ÿÎßö¹·ùþ›Í,€þZþò¤Ù³˜ÿ¯ä/$±4ƒ.{–Å`&¹üå H3èÎ_¹ÀÈŸ,h` øWq.ü‹Àø§”`ÈeÿÿRP ¹ì_âŸR<‚a“ý§9íB䎠{-Ê]ˆŒÅÆ1M?Öòµm,ÌL§ýI7Ÿf mbU5ïTÝ*ñ××ɬhø«Ü é„#ä¿”'¬ù§û7ñO÷oê¿Ï@gþ „.õ?åü'þ „îúo³ý°g1å_ÉWsÄ)@ö8æÿ+ùjŽ8Í ËžMR7ùÓ £CŸv¶`ƒ€¿O;[°AÈ_V­Ôü« +æ“Ë*‚!—ý“UË[)—Tƒc.è2ßE. ¸ñþ'k2ÜóÚ-t·Ø¬Üf½¸…îvxéÏ“ÀîHü«É_Ûìø'C?¯;þ#ÝŽ¨V5sæµØ¦'îû‘4mì‰óžñîQö˜ÿJÓÆ6uÌO"¤ìåÏ‚ÜtøuØUýO·™ ŸÓªþ³úqÿë÷KYÅ¿~¿Düëçó—‘Ï~ßMë'Õû}#ïßM¿_6>~ÂñhµjH߇&‰HŒrôdÔ"˜i •†‰4?+ÔR„›ºiþHô7 €¡ÿ¦T<(ì¿EPIˆûoe7ÌŸ#ŒWP†ÚÆø‡ø[€¨*Èù~Ua¨C7ý|müþ/úùFžßM?_›~ 9ÿžÀb€ š€„@ü?rþ™ðÍ>>™À¬ È }˜,ÌùÇ­þð!õ_&ðk²p 2ýÃçKÉb?_^‘þñó… €{ÓŸ†Ïœ¦àƒAŸ—ßgí?Ìâ3 Û˜ÞwgðÒ8c¯ª ˆ/!Ñß0†ñH@¢?S‚ñí?­ ™„ãÛ«‰@>»rÚašËªãˆ%€Ž¯˜û¯œöC EÙßæÐñ}ÖµWN; B Xø1ÄFÇ÷+þŒœ§ÀN8ðWä<v‘?ØÉ@·VüÁïDƒ½ñg=+Û÷þãZX@Yüym¶ïýÇ«â§p+ö;ïß@ÿ5ÛïÓÿüåáaeE9ýßÈŸÕÚ|ö ý’ü!EvÐ>×Ù¿â¯]/bjœ[þŠì í¯³Ù"þEÞÆ¿ì[ÿ‹¼Ù·þyÿ²ýÇ[ZÖ¾Ìny¬z³ygY,íýmÇÍ·yJ~ +ÎUpeuFéÜ øBžŸpào§aÒ¶*þåþµ,†¼ïý'Ä¡ò ?ݶïýgŸTwÀø+Bû7Ð÷—dšñC¿+{ËéÿF¾i8ÞØ|ö RŠaþã–Õ^Ë_æ^d7õ¤áOºÙ5Îο¾Í‘‘Çõ¿ÈÛø—}ë‘·ñ/û7Ðÿ7ÝÐØÂf++Ý?™û•-¬ÉZù^FO$)µ¶Ø;k¼Û]Ö,¶ö¦ù'À\ÿ“Àmþ¡ÿÉö¿{¿Î„•lùîýâî"Ÿîùü%ä³ùoZ?ÙôûwÓï—ŸÄU¶*•ê–„™¿bm!Ð'ÔÔåè8)(¶2@-@è›æ/(§°ÿÔŠ5–ïÅýwß5aÿͰaþ-r„Œþ,ÕÀ‘4>`Ø!=Ë_&?øø èV'ÍògÌ€ŽàçÚôóµùûÓúófõ“M¿¿dèÓÔæŠh´Çy@«}æþ+ç¶6#ÿé°:¾ÇÜ…ü3 @É÷ ørëÞöÿ—Eeæ‡Ï—aÈÌÇwÐÌŸ¯‡€`¸¿Bþ=õ_Y:`ÇýG?ÅákŤmÙÊ }!ØŠIÚ²ÀŒûÿðÓ¤@ÿ°ÿ– “†ý5€S ¢´Ì ˜Ú,(4çª |Zæ˜wo'a+üýhèsl4 )UñW©àiÍj»t ü1^€?DOä øc$ňÎÄ.¹øx­2ÌIò¯÷Ù"é2–b¦fŸýÇef:ù×û›ï'µ‹v[ù_¡á†¿ZÉ_gê÷+ù‹ÞïWò½ßßh÷“=nöaµÆ‚ -s´ —bQ,µÝóü=­ø3„‘L1!ÌwÿÀŸÜX7€F<·þè vÂÄ¿½_‘À_ÉOÓ ^ï³®°G«}öŸóîfZËúoö7ßÿ+ü¸—Ýÿ—ѯpª+}õ²û·’·øöû•üEï÷¯Ô™«~99ÆvFñ™û€­Q\èÝ(›æß¤³{~8  Á¾O÷Dök¬þGîn@š7ËòÀ#FÌõŸêÕsý§ƒ€qÿÛßh”OûüÔ^EÛþ—Ï~ßMë'W}¯úýM¿_®ÚŸ+‰þkÜòVÞf ísÿth*HθÊeE@RXøˆSAŠ;¯ PU`ÅTšl–¿\ùaÿm&A®ç°ÿæ”–+?ì¿)æÏaÀÌýfq€“fî7‹;RŠÍý–n€»w7ý|½ñ÷ÿ•˜«5Øôûë'æôÃògÖ?p€îï ¿ÁøÓOËŸYÿ{{°Õï1€®€‡8pïã!Ý€Û¶:PìÀ½;wø Ñÿaü|±°rüéJŸ/y%&$ú?_(p ýÉ'ðúða¸Éé÷ì€%N\x›<’,"àÛßácŽ€øÜ1Âþ Ð0ÂñA”k§l:G¤MÕn^Œ.. }‘ÏEXî¹?.%œn}i¾ì ­ŒºÚKmùö"E‹^DËøó"Rúå¾sÙïãH[Y7›C×ÊèÍ¡Mó¿®¾´_$°H`‘À/%;9ys%“’)‚–&XU$º[ÅBrŽ¢ä¥Òÿ›jÖ…sÚE‘Qÿž»ïK"lMÏú"Ÿ’›ó]yë,÷Çkó|P¯ŠÇ‡jü|üÏQ*¶•¦œ¥ÞTONON… r‚Úggç§\awÂq€…œ­×ÇÂ"4INQ4šÛ' E.R}Vˆ%&Èá1­Qù’A£ á8ò}o„ˆ£Óã3^ÒAq¤œrÁñcÔˆzãé,†M©ðú ¾Óó3»>UÉÆõ-ôÛ-Ÿ_ùý_yü©ÆËÆŸO<™¾ð=þOßcyÂv'€Í¯|õ`zðÕüÇ!}›Û<öà«éÁƒÝ/v¿˜¾Ú}€ÿ8ôÕƒ/¸Âî„ã»8>’äÏSèùìøóÐ[¾½ãÏC_ùõ—øÿ…èÎÿ3,?º•Žáã£O>údúì#lØ×>ÑApü#l¾ûÑ»M½û þã¾ÍmûèÝé#|Óó”üìŸñ¿Îßñס?|öÉ'ŸýáÑ;þ:ôî'ïò¿èοù}ðÆÿJaý~¨¬}¹– Ë¿:XYû§œ1R¥:ØðOï§ê`Ãï'â&ÏòÇ—‰;[óÿ¥÷弋 ,¸®îx†#í-Xìµuni”ž!ȬC$*”°ÊTXÙ3(™uˆÔÉ’L™ +)SH±—)«0Ef2øÿú"Ÿåþx½Ÿ Â2ŽyÈ0óŸòt0»XãGÖµÌü·d›JÅ2(S‚€ç ÐQ¬Y€ôH €AA™„ZOÈÝÁšHר@Jn$”)A5@‚Ö̬À—TfŽt‡Q4þñGÁé©v\z:ÖX½Å½é­·°ù`×øËøxàpÀLøÂ_Æ?Ý äJ¿ÂÐ+þ2þ§/¿&ý‹/¦¯¿þtñO&ýGÑœÿŒ«`àãÆ»¬t>z -®hóãó]Xþü>ŽÀ(wæ>ÖXmsF0 Æ_ÆÿôÙé"€à¤ â/ãúÃg<Í'p8|öÐ+þ2þ§w?ùçwßÅÿé“Oèÿê÷¡ùosNÕû!èfþóÒ¸²­oæ¿%ñT&zÅ¿~?åÚÿL&m\šÿ–Uñ¿®¾´_$°H`‘À/%;Õ4>R›ŒÍší®©‡C(°±|@¤¦ÌɼÞ}ļD_šöÚE±Ðù,÷‡$ðú>Í ¶}½$@R¿AO.}íQÎ7óôÖ€BB]c>U#­<%‘$a«Ã°f¨ÐF™ïy ›Ÿ@\h€ À Ú¨@Aaó#Ïpócoïô䘨”§çð%Lˆ€ö1VÓ)à+ßxú1¯ïìÆÿñ´Â„ÿé qX¥ë[è·[>¿òûßÇqüññã²ñç{ÌçÃÎÿâ+Úé°ùa^ãØêð| ù]9¾úbz‚Oè,ÜÙÅ <}8,þélþ·Þšð€\o½%þ è@äœt0`Êü9Ý㟮²æöW fþÓ—_ÐøŸTÀ¸‚/¿Äjúô·Þ¢…OËþ£Ï8ÑË_V=ŽÁV§à3ÌçË@>a~sGŸô¸€Fÿô l~X·øƒ@.ƒímñ§#3ÿŠ£aSæ?ýáNþÃÂÇòîô‡?`5a7ñ'3Îü“gZ‘ þù÷1óï‡Ö1HÌü7'tåÈ$fþÓoÒ¸23ÿËûÉ ™¿™ÿô›6.€ÌßÌÐ[À/¥¸/ç]$°H`‘Àu%pg0黃IߨkGÛ»‚™[0Z/ôE>Ëý1#×åùpÿ„Lz:ºA¢V¿¡h¹ @_òÜÿbþc«v(tà ‚þÏ‘0€T€“Sfœ èÐé´o:Aÿg+&?p¦ÿùŠ^€r} ývËçM¿¿/ë?žãbÞ•ñG÷ë0þ èßR ö¯Œ€¯è@/Ì%¿¡øzðç ‚þaòƒŽ°f|-/þnh¡µä€œjðG:N ÿ?ÐÄÇÌ>8èÐ,¿Ùüœùwx¤ú}Šù­Úà¹ÿÅüÇVížfÿùfb,jåðß?º?DrþÅü盪r8ÿbþc«v\W_Ú/X$°Hà—’Àœê_’y9þbMe”«~C'æ'¢ü¸øçbBšÈ<ÚE4€§O‰H(3ŠuìÑB_ä³Ü¯÷ó1!±’j•=æ|î©ºÙø€EýFLþéϰ®“ tAÿ%óõP59Å€yy¥ü#UÓô¨Hrº>aÚ2’õ§õÉr„€êkض¨Hr|¨tÎᢖ( {2åaÿ0Q‘dý YˆõGÕOX@‚¹þ§h…óaÒŸá,?Åù7ŸNŸ¹þ§žø¯¼UѶë[è·[>¿æûÏóüøƒñã²ñG ˆÈGÔ=¦é¿€]ŽÉxı¯0f_r`»#Ö9ó8‡¿ «^f;,xè=Èÿ áò{2ûŸñ»bE”,O”åO(ÅJ¹8èqQ„à ”[ÀfýË€9sðók†|…ÏÆGh¾xV€MØ+"€“÷ ø ÁŸ`ÒßÒ£ÏÐ!hŽþ£O¶  YzÄúsþ)ˆþÇ9>Á¿t*îà¨Á €•ˆñ7üaüãDŒI°ƒ öòÈðÏ8úÏ<µ~ŸdþóæG¼R*€ ÿ’ù‚u~Ø…êX\ùÏÊt¬X@Jÿdþ÷ï'sèý¤Ù><&LMqˆ2ÿYD÷`mŠ à—RÜ—ó.X$°Hຸ“ ù¼‘Rÿ-º7òfØ'KŸuX-ØóþÍBи«ÏŒ`eF‡N/¿ô2¤ ½wæË(¾iù¼ýöÛ~h=ùEÎ_ á×vþ"çVí__®°¤šªW9?`ÞŒù÷Ì ¿M*õ —%a< àQmþ#&_Â$À™!ÀÀg)Ràù±@( zÖÆÖ VD€ÏR¤ÐÐX iíLÝÇÖ+"°Ü2òÿYAÑ€Y¾”ŠÜéXf`}žgüÏ™p ÛFó›N7ãSÜgåúÎàHÑQ\ßB¿ÝòyÓïïKú°‹lÞãÏÉeãÏ÷n…õŰëç÷Lwe Ÿ¾CH1OZ#ìŸiàcÆ^³÷÷ÏÈ&,€¾+þ4õ¿ÂVšñÿÞÒ˜õïÆ?¾ÿ ÏèsSxèøÓøÇÇ—…ŽÍ¯ut× ö×¢5ÂþyÐ ü À'ßm°T€>V6!ϸFþ3 YíØšúÌ1ðå0¥ý/‡ÀGœë§àeÆ›ŸÁ%ð {c³ÿ<¯fü¹Àµù/Ph8¢jót9¨•&@5ûÏJ•r¸*,€ÚüîTÉ-æ?^r0 ¹jóŸxé Û ¹®«€/í ,X$ðKI€”ßÛäöf<½ÎdìÛ–/Àb—Íô¯–Œ€†Ìò/ß5&;] XZ¸åRE¯ ( ˆÅôìŠ9þ<¾»ûÌ_£ò/p|þž» ˜ëßÎ{;~W?ÿSÁ°¥åêí1gû÷¿_ØæÿÛ~l€ˆ?§íÿ¼|²¢öþídÿgÚ‹Å~ýK~ÿúï§ßÿþSþ}:ÛLó÷Pçpþ‹î&¸ÈúUå ©ù«õªíÕ’z~ƒ_¹=æàçUÎ_=ÀéYç` * GYýþ™‹ÚÊ.€4ûOx¥C9´•\Ž0­¢;Àæ‡ÁN@:À´¿òß>û8„BÐ&Úýð@ê45:ööñkñ7“ql€÷ q0y¸ú5Ñw|áõÝ\ßB7 ÜVùT#Pxÿ_J¯ÆŸèùìÿ^òùºôüÁó{ÝñÇ ùþÌú‡i®m@8Óïá à?!@Yú>WŸ‘ÿË—„$$ ¬þ'Xdü×ã9À‚< –»¸;ïêþ4SÀGháþ¬n¯ ÷Xº#ÀùÿøƒÝ e€›€ÈüÇ!8 ´mØ€Ÿdä?Àò%! ´?èûOLÐÀIÓþ2þëþùÏ“Èø¯ûOLÒòìÿ\äÐVvà2•ûÿ9´•])÷_ÓUrh+G$÷Ðï'Íþ3lêXmÕQÊý·W/ÚJ.€_Jq_λH`‘À"ëJ`óxMÁyPÏ'¹0õO­¼åF?Ü'â{ÄÑ‹zp @ß^ôc·ÿgèµ lŸOð×¢l£óoå9ÞÕVÜ?¼Ýßsý3ìß?þÁ)OëBpþÆ^ÿêìääÀlðˆþ÷Æ0^?¦ÿñÿãÙö­ –`tþÖ´§ýn®ÿR|ž~÷OVÿ_FïÆŸáù¡õïù®ú|]v~<¿†=bœÌÿµø”ÿaüAŠp±Ð €K3ÛŸü4Ó_ñº£ýo¶??øé® —Kº`æ÷ã' ¬0Mü§ýß÷QÀÄ"ÀØ3ÿ1+!äÿ´0)´ÛòZpÝõ.Ì( úÑLTa ¼äýt(äÿ´  ÞÅ‹zOÈÿiA:@½»7]W_Ú/X$°Hà—’À«»bc.ñWv«}”PÕ ¤5ís£ Yð›àìÀwϧç|-À~`ˆ;O›˜ÚCxï#=¿™d6Ìг ¤`zñg³°ãö÷ß¿oçé4ÞŽW#yhÿGt¾Ýéœæÿé?þ¡ù“Þ8¢þ¯Îè°²Iýï\ð% cþŸDKˆÚ«¨¸®~F~ȸ>ö€¨ýŸ¹üö·Šé°½ik.¹ß_ó!Æÿ;ŸÂ ðìÿ =æaXËŽ.(^#ÙÿÙ^ÿéO6ý?Û?ï\Hp=oÀÜó'¾àþŽù˄漹¢ç¯Þš%­òW8ÿ3LôÓE§´J[¨ˆªŠÇ3ÎÀ]°(Àò‚æé9ÒýqWi}ŠZvŽàûLÙ?A);ýc4÷„àûk– À| ‚þùxgD€´Þ°2ªÿ8tN@@"¼Ùô3šÿý¯1(¼¾…~»åc÷w°4÷ÿetóàåñ‡CXÓžU9õfÄRzz"(c¾mÙùÕÞƒÓWíü×XœOåù´~‚]Gð}¥ì?a¾=×LãwDß'DËÿ1_1 pD€´¦´ãƒë ^D*3 ç·  Ôó Z€tQXи8ŒÐòòùoØüÀ÷½ Š¦X~!ø¾Êh6žk„$D€´™~˜ÿQÿ-´ãƒþ[ €ÍôGý7JcÏ;ÞlcÞó6šö{åš÷óÿ/XÀ/e¹,ç]$°HàÚPÀ* €èú³*ÞFã ëk¢ÿ)þ×­J úŸ€X-+@Z àwùî/|ƒË9úRq[‡äàç«çÏŸW€†žÞû‡šäÛ£ª—Gp# ë5õ³ÏÓ‡ôçzüXþ‰ ýšæ/4‚cþ[Ò´Ö[3ýÛ¹|ÌÐOVOþñ؇êaп§G)¼aæúÎzÀ\ûÚþø¿-ûß=¡|àpûF¾SÎCÛû?hÏ.c´×äÿ—_~ù1ýÓOÞà£#FŒí9am?­üÃý÷ø¾¥ ø—ºÅ’#êqæþ˜ž‚ð#0ƒ¸ŽúÚÿZŸùý„6„¤Ä߆´Ùÿö‘àÅÚ?:²'´ê ¬uqÁ^gAŠ:Òý!­Ï€(vIH÷Ç´ŒÖŠA!îPì8’î­á~"ÿ츒ý×ÓN“àÄ¡ SˆÇH5xM莨RzùÂýc¬ÿj¼¾„(Vi¡ßnùØýø£z¡“¸¹ÿh–ޱ¡sЩÇ8á:íØýÜÁÿxþšç ÷µ¦[pþ¶³ííkÞþ:ƒÚŸæ?BýµNˆBÐq$€>Ö°å…@;ޤ˜ÿHüךÉûü.ÿ츒ý¿Âüùpý6è±þwiþ£;cw `á‘)Öÿ=Lü¿E’> àtËÃwƒžh†Ë'GRS䤟#(3@Ç‘C‰ÿZÖwˆ~ÛGÀgdÊЀ Õ`úƒ0ÿƒþ3ÈŸIŸ0å?è?ò€ ð¦/×ÖÀ‹ ,ø…$ 3ómÉÉÿ~ÐŒÿâwÍÉÿ~ÐŒÿâ†ÍÉÿ~ÖVòþÝsÄ`y¤²v¬“`¤û«ªÜ~:€Â{ ?[ü“çGµÞð#bö¢þµaÿ¶˜"°5׿p;üFÐþäoOV§ÿ€‰I > # xú:9(¡€Þ8FúÛÿ7i#–¿¢Ïç®Ç³ nÿ/XæÚ·€ ½&ÿS@@7Àâ˜0Ü_­ª1Òå˜k Û{€âþOŸÂòÿö?×Ñù9E¨;ÍŽÍô¯èßCÿhý#É]j8"®|}P@¿Æ¢b¼¸|ãI€4x_Ô žÞ5æÐáúÙViƒ3ë°âËǤ|O©,ȶä´ýfþ‘îÈ­å@†?Qtœp°- :­å@€Qtœ3ÿH÷Gâ¿ÖrÀê' €Žï¹¿{ÔNãô€7—ž ü&2uïhp¼îtÞM„ôeû_\Ë˶ORúõ´w@ã íj â)ãlµžì<º@… à´¥3þæ:€¦½Av~œð¢ñguÙøCéþHü×Zdø@Ç ÷G08¸N¢è8‚ÿ³µÊþ÷ão¹ ¸þÆ  t\Ôœ€¡ÿ¡€=²ÿU©˜ (Ø>¢À‚'˜?XgH@ß×Ì¿àÿl-€²ÿýø¶;‚þ7€ ÿ è¿9ö¦G?þÀ8Óm•6&íNéÛÅNÿ#R¤†þ ïM::moMwxDý“d©¡¶1é(A/¼?À_A§ûǶJô1ã5 þÛ¸ïYÀVi¯ìN[¿Þ¾œv‘À"E×–À`4eÞž?W€*˜_¡8à#.w¾ö}? ×™ÆžµvôçŸ<vöù³çDìù·ÁùÑjëäd+¸Fÿßç¿´ßÿÛ“¿ýmõ·iÏC{¦d@@‡ÕdæèÛÿÁ¨ôâ@GÀùÇÓÇHe@|}§rÓÓÊ}=%DíS €Eü5ùŸ":ŽÞA3fúç étdû?j€S”Vú£B"£ß³ÿpLOY9(–Ï ɧvt¿lªàœìæÄvÀ_Ñ4Sœ¿ÂøóKqÿBù¤'”„±÷˜Êãn‰1¸>º8¸ÏI}<à0Á• 5ŠŸ\l‹“öÀT*gÜàj9eÀwêõBúáaò`+ W„ýKè!¶'ÉÜùÅÅçøÓÛ‘–CÀÝõ‰†¤l t;’ èžþô¨ò!ÌðÏßé!­ ìŽ?v+Ò°ýézÏþËÀ®o^Ÿ¹þïíýù·þ¦½"€èKšç¯ûuîü¿ßCÿ>íß“'ÉÃEýNHwp„×?#_|·Ã Ÿ¶& ýmÿjüéŸÛý}Íûç8šé7R9WXrû ÍãF˜_~üá¤þÅ×9‡R¦F”òËÅbÎÿ=ÕÐGq!^ã«ë¿U°Ô~÷·-LKñQ³*–ÚïñþÕ> t&LÊNñ“KµŸªÌ½ŸÄ_÷oî’¯–öÅ_A1öfNctŽÕ[×6A‹ üR¸ƒ:ÞLþß5¢Ô¨8Â\† €ÂjØöÊ øM*X äô>ë„W€¶­ € bdúáþóç«õsÇéÁ}?Ó^Ʊfÿ- çOÂ?ýS è4õ@™QCû> àopcsýCÂ}zh†ý£àIíhä3  ƒŽ×‡pi§Ã Ë€¦=ÐÀõžß@{8€¡üXW¼v´ýƒô :ýÓÄ€ èŠÀ¯-ÿ.`”ÿ;ï¼óñÿÅÐ÷Ï:’Æëƒ Ùÿbpý§?  E çúôtñ‡§Oç~_ÀK@z2Ë×;ÑUçZ8T|àí5?"ˉ7#°ÍW8?P:< çßæÖx~1Åýƒ?ÍPöŸ=£΀üí=}ÊPö÷öÎNO&$ÿ[ó„秘Û74?a2’ÿÁyÍ”öSTiÊÙÿ8NÌ8Ž9çO€ãœ#† ã‡ˆ8?­Ï·é8‚¤07Š'†ôI€ „4¢ý€€¡=é¬Bâ~H¯!=Ÿc†@§¬Øÿ½­U²þV[0@Áõïè0ÿ ƒÄ È‘>9é½ö„ü÷ „t®ý½ÙÀíÏÏq§€†ü3iÜF€`|r@pý„t®=íÿ=±stÜÌO~üñÉ ½!å¿g ¤³ò' ɬ|HHæÿ|ÿ~ÚëþæÒbà@uÿ—q§Újèšþ/ãó*z¶ÿ=ïÊÓš.ð&$Gª+œŸ_·ö}ÿÎj0?þœŸ\6þ ŸÙþ,È'€'˜Û74·:}˜z@•@¦ì?ay?CÐñ¯˜ €äZ©Dxðæÿ @Ç™ðýÃÿﯟܙÀ ýg:¾É„@ À—_aøù`—8€ï© ýõ‡pü<ÿoh–ýïÉÌúW5?ÄåçìK@°?0çO€O>Âü¿¡è8¿üÇÏâþ£ Büÿ¼ÿ¸ÿ¨(@fDýG%À¦ƒæ&óaðëS/¯²Ï‚{Ó.æúáЧN`ûÛÛP¦îb®}ÊPö·¶Àÿ‚ûCüQ`ðþú´@—²/þۘ럶ôiãoÙßZ¿”岜w‘À"kK)²çUÔ«‚ûSþ?(ûŸÙü– à¹ªÌ °^nå7¾j^l%ÿûðo_~á Õ¹§G!Ѩ°#}zòü¤„˜t4«ª ü§w?æbI¸"´àEÑ»€ñüˆü>ÛÚè¶BÀƒþ9L·9zãè©<A{:8Ãl€¡½Œý— §àÙ³£¿1N€¡| 0ûûÁþGl©ÇšÆí+@Ä_€3H0<ÿþO<Ï?êª(ðå±ïgûB úï)†Ð[ÀØ¿Õ>@"Ö[„¸Œå› ¸åº‡™ÿÐZúóïØó€Ö|rÛç«wÄòËúuÕ>¡tTN•GÐ"4㯥Ú„YcŸÓŒ?,ñ­­&àôLiÿüCаmÙÿ¨e˜‘ì¯ÔÆþãóìÿ}ƒÑ®´¥þ3ö~Ïþßã1¤œŸT€ïžo?Ï8Dw@!u¿¡gã›6¾è#ýØìÿºÎÓ·™‚4Ûž9ýÛÛöÙœÿX€ì€ý/–?xfžAHÝÐѧBš Ô¾}ïèé°ÿ „4æ¿·Ç¡¥2PÛö´ÿ iÔÿ½ B_Yコ`è_! ÛÃö¦€ ¤1ÝÜòB†ô„4’ BÑ'¡ÎÊGöÿOšþŸ“ïÞ:Ð ö†N…A‚ýêþ= ?),§¡ƒX?æÈ÷?9ÿO   Ó1ÿm¥€“Ò™ž‡z£m?~EôÓ³‹ÆŸ5œb?2ôU ¶¸Õo%ÿXÙOu*Lx‹úW-@VD:@A`a@ìÓ)ÀÔ¯èÙÿÛ<¶=ÁÌÿ,î?+Âþ 2ýÃþ³ AèöŸ9rT3þzõ•}s”ÝÕ¾9J€èÕ¾9æßOæP,š>í9)ûæàÜÿ–>µTû‹àÚÈÂ`‘À"_LŽ€”^³ÚC1_{8(s¾ÆO‚0vwÕ`˜¯V_©’ýŸ Y!Ëÿù µ ¦Ãn}zK˜ÓÒG@M÷Ýãr&@ÔþÙ_Éù¯òŒôõ},+}®ÃöOŸžoáMqn9àQÿNwŽw09×w(J8úóç±Ç7*ºÚ‡ô“ó‹ÆŸ<9)˜ödûñüœý¯ã_}õä ZýpÀÔ‡m¿ûÕžýÿ•¼LûGò¿9Þ2€Pp  @¬@xýŒ# 9 3_Åÿz€( ÃÌWñ¿Þ ¦øiõs-ô?Ìó{ö?±þ…@«ŸÇ`îã?gÿë¸æç‘üo€í)£ðþaÿtà3üaÿÁ› €ô;„ý€9lÆIþþêá–EÔHê7ú.·âÑg"¢÷SpìoæiŸ[PG îËÎ8€°8~1Ëe9ñ"E×–ÀÍ`˜÷Þn•p×"ÄŒ WƲ‚)Åîè_~ñäyšÆÚS)É!ò#³ÿk@Çúò¯ßÿWëãÈÿþûXîÛgØÿ­#á¿?=Úš¹¾iI8X#s×ÿìoÏð^>ÓT<Áõ€þúäÞñ€^>€þcÍFDLȄ緀†ÿ1ptx}戟ÎÐõ*ø?žÑÄÛ[U˜ùýÛ€–ÿø{ü8;:'ZT‡!âϸ îß-O(Ýõqžle!ÿÁP·§YHóß'"úþuæ¨Û{g/…7'¿èùLO(=®ƒUÜ`!¸‘‚eò*àù„›Üh"`|µX BÑݰT@Ð~›¦½؈è ƒ$;ºóoo'Ò˜ðçͳ…øcÚÿ2[þˆÈ ¤!}* ¤q{Dd@Ä¿! Ï@ã@hûgØ£\¸ñGc!¹>Úÿkù@âþã°ÆôÁÐÉÏ&ÿ«€ž^Fׯ[߸1^ßdUH*@ÿûyÀg3×ðQ:ö´îø'Vƒ$xÜz@û•2þЉ×5g €ìÿ\ °øÊÉ€+,Þ>nqÁøc¿øøã!ôó×o)6\Óëñùz-„>Ó¹÷ÞÄwí¯^öû½|ÿÀµuø…Á"E‹^JwêœÆüÛ41§þµ™2¬* ¢|ËQêÔ Pª€£K6ð+û?Ï@Öt!‡9LZ2.í=@€>.GQ ¡Ôû gÅÿÝ7À¿ÕÍù«åÈÿ}Rß·ÏðüG[œûG 8ÃÐãþД§ˆ¾Æd]rCÇíáÐDRÜžUÍLâL{Î?À ¨ÝÏŽŽÞ·€¸ÿ§Ç;;žñwÀüïóg8`¶P±gßT`V¾È±¿?F"HÊï€/u@sT!Qÿ5¿íêq@Ç8D˜Œ;Ûÿríz(ë“Ãï3ûOõ~ÿ`–áž—ÿð|¥˜¾ºVº(ž]äxvi€'ü#t˜‰ÿW?>Æά3Ô`Œ/2ý1‰}¸ÖÞ™ÖðÒäÀÍh ÿþ?Ôšl½FMÀD"BX3 @He`ï2ûˆ—™@!èÛž á:Íàí·K’?¹Ê0¶/ ¤aû. m¿c}!Í0¡Òõ‘^@HSyK¯@H=‡½¥3 y,G¿¥W ¤Q{‚`oÀcû©!øãÂBš àþü°ÿ‰A2{ý „t¦}BÊÇ&ÿ«€þüi(¿b`‡×ßT!‰®Ÿ ¤{!?€Ò°Çu×ÞÛƒ»Õý_Æj«¥#Šó¡°É¯Utº6mQ ¦äçkkË Ûêsÿ^v~oß~Íø_pZcÄÈ”ðÿÕ%þ#Ÿ`ÈêÿÁ˜¢·„„|¥õˆ Àåÿ`jŸžðùz&þ3KÀÖ_!8€Eˆ ^?Ï<ákˆ/ØÚRz íþô‡èÐv@½G•´ûÓÿ»Àø ¬–ï0[#Ÿh*ÿ—˜€$ 0Åà[å„„0ñŸY¶þÁÌ`±¿°ÿÈø#Cü‘öÿ3À ÀŠýýWËÅðRzûÒh‘À"E×–€aиOÉÔ7T€:ëßñ ÀQê¬Çà›ý¡ j ÉT3¬¶ÿ“b^S vŠð¬ ¤Šž³fè8Lûß=nà4üÝ0bäóX׿‹èÀ~£q¿-ø¢ó{ô|ÿ™ÝšXÃù1¿#0À¿9æù‹Ò8*þšxS·"þÊÁu€ˆ8šþ+×acù°ß)#¤§3tLÿ'ÿHÔ~@¿0w~"FaÜ¿bÿtF¬·Ö[À¦0t~ ²e†?õnÿëåF$Œ ògêÀþ ‰òp¬³àEîïô€b6?¥Iâì„§r €ùøpÎþmæþ?eþÖ×aÑúCt?²ÿµ¶ÌÿCøÉ¸Fn€þX(€\[æZ#à„â ©ÍàÓaˆ|¦× ¤}›àÇk Úo—*$1ö?AHçÚ?úÞxÿ(lßE”þÃi²ãƒÈ÷nË?%€Ñ3iÃ^èSÁ ©rÔ ]î(9ú…^FíkÒ€>5 ¤:B:{}ŽA2K·€ùöÂ@¦½‡øwò"zùN„4–ovp¼>E$’Pþ!П¿¤ µü Ë¥Á Á~uÿc¯~,º¥3}¦¿ý‰_EßßçÀ¨Á1m =_hR9 éhŸ?鵫™öùKFÀüø³z2ýQåv<×–ù[^kÂúUÙÿê¶öiÙsÍŠ‚æW´Ö–ùŸÖÈxB €ðú à+fÈ»íïÉ€8Ø •éwå«…ñ_ràyïÂÈ ÿŠ÷' €`Ùk­²€9û_ÚO¨ð0Ó_v¿Ö–ùŸÖÈ!ì?\QÌñÇ÷$`Ô8jÀ%àÚÚüÂ`‘À"EWÀ’öß" À±ÄRàY‹€º З æ–éÿ¿!…¹È°ÊÌÀ.ñÿÅ€âIoö‚òŸf¨[z~ûçÌ«Ðßý÷'¤MeÀõç¿ÿ­¢¾`s¦9zò¥úïg à:íÃëg nãÿñÛ~üRüU^æíuú×8®òûÐ/‚? ‘xåòétÔ«ò?¨ q³ ÷Ø>t´×€Ô¾ýl@z>ä°€5«¼øó•P1°ó?¢ˆàIáõ0<áúHÿÔ? ¬‘‡q~¢‚‚§°òéY#ýŸF> ¬×\Àädú3®úéÿÔ áÀúk;!Ñ*\’bÀsš²¢R7À;ú6AHÍF7@Ggô¿R8Ò·éLûGÏŒ÷³ähùN‡³D>"¿ Bª Í#V‚×—è P RLïCû¿@Ä€=!Î_ƒô„4ì¿ÄèûŸ1Hf茨Ãõ™$!ÿ1 —/ž ¥ Íœß+îí¡ŒÀx}t”*$Ñõ{ @Æèûß;÷¿-5 v«û—Äfá×[º9hþ§wXE¯#<€rÿâ–«;k!uü»¶9Õ¾|ÍÚ_ÀŒKßÃÊÿ‚Ùÿ˜·Ô? ¬å€?ÉÿÊôg.¿Ö4ü9iŸa-áÙÿ0û¹)€­³ÂÂëÿðÈh¯t¯±À\dôèµ€8Œ€xo.€ékÅ(Íßìþýg™ÿ P™þÌåךbÿeXÀOé®0Ô¹v€­á8øÄýÿ#ý ýßÍ€¦ÿŸq†B¢q4ý'ìÀpe}ùê"E‹^¥nÀÍž®ƒ”£¼Ðå ùeåƒ\æ€ý®å÷yµ÷çAÒÂ)b8IFù¶€«Ê¿Ú' R³áøïº‡Ž€‚Ä•žÞ79’ý/½ZD/ ¤fÀ÷ôíí/З#Ýnà÷ôB:ÃÿÙ_Éú¯ôç"*þæ)²B:ä€{„€ƒºÚ·O€•À=}o¯xºsñ§ î{È»èsÐE¯@Hz Bñg1H’ ë_…A2wý{ ™iÃ!¥àǰÿv¾R`”Î{d‰þQÿÍ Ò€Î$ƒ(c`¿_©òïƒE]cÄv¾àáMÅP}ÈÈGD?•P-œà.Hx Ûçk8Yw ´¾ù`\vý–Z‘"î¬ö[ M ç€÷€wÚD¼L|צo®ÿK À«Tç^‹ ,xq Üaž¿eýóo×A@ÎÀD='#Ñïií­FÀo¼N ‚”*@Ty6ìßA2@D¼Ðù,÷ǘpÕç£Ú§/À/öü±N';¸W•€O@/!.PÀ/¯À*€,UŽ`XØ6W'Aøÿ « 1(hÛ\­0û V b€¯hÛ\qöŸªƒî¾¬ xÈ«é „4ÍÐ÷tV==EÌ´/ ¤!0´7ÒaÐÒë*$a :f!¥… Rïè0Ñ1ÿ¿f€…˜wô)ÎÐq8{¢ör`I€žÿžtBœ¿!ø÷€¡ÿ)i/⯮5€¡„4”Ïž×HU†ö8"² §W$:J’ðúû2€ýïŸAHëßW÷¿–ƒûÕýOêPî?µ/ãWµ7ŽÁÀOÃ(í«r8 éÌ÷oé_¯" í»/ˆŽñã‚ñçr VÄòä{ƤmBn?gïYP(ˆ@™@ÛæŠóÈ`@¡0 mó÷˜)@æ]Æ@(ׯ`ôÏW•À9¸+ð÷ô`Â#íÝPs€à鵜ßÃç¢ ß?B ®–m}ʆÊ¡íO{À#@®2²þQ€Úæjì2"J$Ô`€¸Âœ#òþ5ë/Áú6W{r;uÐáˆlìÐuqÒ±„ÔBüGº£@О(¤sí¡M[¢Îœ?ûúû$¾oŸU{$¢ÀÓ­=Nîãoë© ØªN|rHþÉ€ìéÂ`¥õî~Оþ€ÖuæóùÑê„mqÌÑÍvM€–¿UÿK ¤aÿé\ÿÉ=^t}{{À ™é*0×>ÎÐ+Òà÷a€/ÈÁ˜ùýr@Lw½9¿î˜ÿ U÷ïÔŽ>¥[ÓÙ³ÞPÑKôœv¶œ¶Ï—Š”÷?ìáï…hž¯&#Ǿ):ÑC/Ö—?„û ÀXíi›‡¾À0†o(¨À³ù±Ú…ƒÀæ2 @0€¾Í•‚Ç|‘€þúL€â üŸsçŽÈµQð 3ÿ.-hÎ; ×F!ÌŸPP€Úæ  ÿœó'Ü¿ì|ÖHÛ<Ä=ú0ë/Áú6W ('BÜ–ðþ°ÿ˜û‡@§ûòÀ˜ „±§Xô»jÃ÷÷¶=OÔ&–D׆ïooY}`N ‘‹6|kïâûüíÞ%^Œa_êÀäûàoc²%iˆ® ßߺšº½|{‘À"E¯n@ÖBo€ÌÕ)—ÊBë¸/òùuÞ½ ¿ÿ;õ¸>Â*æ­3cßž?@Ÿ¯yþÎÙšIÅr Aã¾þ™pÜø*îOü„åM .˜é0Îa«›®Å}? ýïF¥äøàw‹"— Ì(ÿ3ôd¡Çí­ ‰a{!§—€¹þÍö¶X¸jÉUÜþéÖ Ï0GíE„`†¿'¼¹ö<ÇØ¾!ù'Žs9þNwx<ÿeíuuÙ·7 GýþßžƒÎ`øÏ^]…dà ÿÂs¿oúBG§W®ºj­ŽD€áÉL€ñ‘U€êÿ¹½ÕapÐÑøã>½¿Êƒ¯ö3 .0À¼ãÏÅ×ïî`ÕbÅÿTP>€÷Þ{kHª¼Š<¯úÝË~¿ëôÿÑ?þ€ìS|ü`¾îOv”ýÜý»ðñÌÞgÜ÷£¤ß¥ûà.»ÌÀ}9,^íâûöþ1B˸„Ò2Z¸?íñSí¸¶á¶Þ#„!îO[::M¯*¿ôd‘À"EW“À%ÿ?ÛÅJP°-|zš?Vw­$€§ÿ{¥À"Òo`óù2Àµ6ÁÄÇ:$ç(/ôE>Ëýq·›ƒ³{‚9úéùèt¶žn¤0û úsÚÓ4Pù®Â³²âFe+§$ Wø‡)ÄtÜ'X|¥X¸éøñ 9÷ñøÌë=?Ãl4Á €œóóÜÿcÖ 8Ysêï`È@Î?°þ=÷Å:ëC$î -1QˆÉK¯ h† ×uÊßxz1ÿ“ZÕ©Çõ¿îô„T!ð€7@Cÿý^÷þ_»åwÃ+¼þÐà«îÿ0 ¦‹Aç¨ètÈþw¶Yx€é÷#ôH値=?ðïzÙ·ï/Âèæt|éñçÁäÿ3æŸ8Š×GÀƒï¿G> @ùÿ9÷ŸuàØôÕ.Á€üÿ’ûx}äì"™@„ÉZBrÁõóœ(H¬ÿ­-XüVМŒ@W!ŽÄ€áoÍ À€¯@þ”ç/8€O‘¯Ê}(  Ï”ÿo8ˆ×€¢Þå„ ÿ¿ÊýW®Ž1wQh‰‰þ¸ÿHø#Cü‘öÿ3À ýqÿÕÒ|e*¦B|•€¢SäiZ§ã૊÷”m¾ðýÑ>¾¬á!öƨÂ_ì)ðÚ⸚½±|{‘À"×HL°,·êSü²õÍœG$¿[õ€=M€›Šü'øŸ!Øâ£tJù ž°ÐùÜúû£‹Ð3Q?‘à*ô\†«r¼Xû䂨G@ã¨2TþûgÎú§z஘'EŠ—‡©ÿÃ}¿Îtœ•ÿ ¿{îÿ Ç(HCB`ªü‡`~Ïý?DÀ qäP`ªüWrÿ÷‘ oÑÐŽièr `w AÈê:åo0Phãõäϯo¡ßnùàþŸq#BÏÇŒ Ð#ÕóžÙü“AN_¹}]GÞ‚Úçï²þYûÁA@þ>μìøÃÊæ÷Üÿ¯ @Žà!ÿÊþo“þ¿@!@üÌÃÿ3vñõû”À´€ ‰þpÿ±ÿ•–×— |Â’ŽÅª˜€ € "ßitâÛÉ@@À0ÊßÁýRÒ?Ìÿ7Eù7IÿtÀ?þŸq°‹´é•À´ó&„ý: sü™éö耬Ê6ý:à?g眀°ñƒÍB9ÚsüàÞœûO?ž }î>BAvt€Ëî¾›Pcв¶ôþ|œõOQ<îxtù¥+‹ ,¸’îXþ2é+ À¬˰ÏØ<ËŸ” ¬lûG,â±<…¸3@Â,ïÃB—,ù@ÿAžæ¨=DýVÝevœ3ÃóÑi¿W¦{.ÎÃ…òçï(P~`)Xžd:½CD„ÍÌ™"5à p¼FÎ?",÷æ?"ˆ8­H@Fñ!})÷æ?"ˆŸ`Ì(`þ¿áÀÀ""‰“ö&$ ¯¡ –:äʼnë”ÿô¨{Mô û¼j¯/Å‚Tuâ›ö Ýben‹|pÿÇv¹ÿ£çsBFêèù¹¬½§ÈqgŽ€8^üùºŒ¿ß¿í׌ ƒÁŸ¨ÂÀ„¿EàÈ$Ðü–¡ï¹ÿ_ 9@-ˆùÿ†@½4ý±…o±’gøƒñç{À ½vÀ¼,ư’@q0Ý‚àøš±Ÿ˜¡Ÿsÿ-À h†¾áÀ`_–oŸ°óió €ÐôÇl3ÄࣸÿDt üO`æ'@Óœ$ú3ÀMÿåg0CH‡,ãßäÜ.N0À½èýÑ¤ËøRÀp%scùò"E¯“n ¸{’¼» Ý‹|nëýÑk MŽ?žËè½ Ý·Nœ ¸få9òt ¹™Àçá2{׳9ý_Íÿc¾¥UÀmú?Ïÿd¬ .ÅöÅ« àÅŸ/ 0~•Í£Py²GíGú5ÇŸïÑÏœO`1@PM@B0Áÿ ¢úAád<x€5¤ÏÚ€Ìù'Å’@@$¸@<þ¨@ ˜(‡žÀªh,H‰þ† €ü–A €ÝIœØg†?rö Àm­†Ïœÿ”ÀœPM@BXο• ´˜€r@_ú£a ã'šc†‰þ†0ôÿ˜â÷*aÿß<€cþ—Üÿ €aŽù?P4Ù0ý?a\þ~oz tÒÊ„ ÒU”í廋 ,x$p§±åÍÖWB€ap'Ûò…™/À„ÇùÃNNHéÿ*ÉÂïòL€B~DÀÖá1€œ-ôE>Ëýq4ÎðwÏÇà蟟ހ¿àù¢â$™×Ïß|{:øíT ”sÓ~À 7uùÿ  ³ìòÿ éÈ÷WÎ?LFþÓ`t|ÅÜåüÃôgä?v@Ç÷×È÷WÎ?³ ùO€°T8€+HÒvü1@®cþ Ó£Ó_¡Çò®ö ¯9Ò2£úm–ª3Ž~uÿ_—®€âp €¾ q­]¢ç³þ†Ó9ˆ\cü‘¡;žDþÓ`´úâòý•óÏ4ø4ê¹eÇ¿’gÀ&£ùïÅËá ÆãÏ÷€€€f¾L~•lÄ@¢ÿî$“_e+À×ÈOp€ãȸ—å¯â}X™¡/$[ÑÌ×–­h9ÿùïÅË ‰þŸÅý Ràaø$î?üÄx €aÿ-@K›ÿŸ`Ê+©ÍÿO0…ŽÒíü¿E¤å²û£ËÿO0¹=nþ?Ǩ¼NÊüÒ—E‹ \E,‹#ÿ±„J:Øø^ÍêGQíl $Ø¿þ‡-@æãøêàȈÏ(öàBwm‘pænÃýøÕï}ˆ0“½È/2ð_Œž~‚ì‘%$ "%uˆæ­¾HÚ)rúiù3ë8@÷‡½.WÀ Û†<-fýÓ̘ñM¹Ö8pˆÒMHó‡åϬàð[‡æ @)'Á²z.?¦ûhê”§òd¿ =êÞ‹ö×W±ø|8úí–îÿÐÀÇýø¿WBCÈ+þ—=ˆ®ÞÆ(þÑÐâßþAô|ŽtŽs ÇËÆŸ'Èé§åϬàÝßA¾z€ð$Ë_¦=@0Wþ‘…¿‹4Ãþ{ 8É ,í#ÑŸßTþ•G`ùøƒòpÈ• iÿì`Ç(ø„™ŸËÿÉ`Faº?í}eý Ý_Ü@ |wÀÞÆ·ø§ú§iþ†ý‡ màlj_®„°ÿ(@ `ùÅýùÂþ£<À»¼3g?þvš€ŸYR¦©ø™…óô›æe{ùî"E‹^' Ü™=Â"E‹®).¬˜Ü‚C×<ÉÒ|‘À"E.^'eléË"E‹ ,¸) Ü99^/snOÎs1nÕáÆq$ãž­×ÇʹER_*Æ­:Ü8ŽxÝ“ÃÕáJ9·‡Ç¹·êpã8âu1Ÿ‡½Óã3¾›‘NˆŒU¦bÁñcÄî½ñt€ÇàútMçHÇ==?³ëÃq]ßB¿Ýòù•ßÿõøÁüߟ P•®¤JFè×.€M?>¨àÑ<ï?$À‡6"éØB_ä³Ü¯Áó!}!ÖO®;þÜ”¢µœg‘À"E‹ ¼N¸ä-†ÜL+ã^Ä—¸V$y‹!·ðΟ÷רÀ¥€\€¼Å[‚ø zWµ·÷ð]àB@.§Lâ5ãí:@8w¦ .ƒ3ì½étø9ÌøGáíãÕÊ®\<§ ývËçM¿¿/î?„ù÷3ÓÿéÈãGv˜ùÏôÿưéñå Æ6@ Œ„Xè‹|–ûã5>軳Y¥ ÕúÉuÇŸ×I[ú²H`‘À"E‹nJw´mð[¬¿Šq£&7§ó™– L.ƒßbýmØü̪å 3üJ¸&—Áoq•Šq£&·ª|Á pz‚2ÕÀë9‡/aBäP½`c5ÂJ8<|ãéǼ¾³SÿÇÓ þÈ8…R‚¿¾…~»åó+¿ÿ}üHæ?”twøøá€dþƒÞº6=þpP£/ÿúÇдÐù,÷Çëý|ÀA¡óðINúÉuÇŸ›R´–ó,X$°H`‘À"×I7‚€ ÿs$ àÀÀÜ¡€U¶¼étýŸ­ŽW6áÓÿœ¸\(•®o¡ßnù¼é÷÷eýÇ}n³ÿ4ÿ±å.ÝþrÔæ?ñ½ª(€ôŒll-û~v!HÞB_ä3'åþx=žÁ„Ö^€n¼xéñçuRÆ–¾,X$°H`‘À"›’ÀÌË+å©Êð±‘ûtòÚÌþ?ŸÖ'gÈ Ëoö"÷ñ¡Ò8‡ˆÀZæbÊ?Âþa‘{hn–âtÂ1/άÿsæúŸ¢·I†°<Säß|: |æúŸzâ¿òþU~Ë®o¡ßnùüšï<ÏÅüGNÐéÏðî%ÆÆüßÇôÿ!°¾+À¦ÇŸ9Æ‹ ÜŒ,†ÿG/ÀuÇŸ›R´–ó,X$°H`‘À"×IwÎ >ß®Àó££ÝJqȇ½n,¯ »že¶Q€ËJq#€ŽwC˜öQs ÿ°6 /–ïb™®Ó3°"ÌÀú<ψŸ3 àïnÍo:ÝŒLqŸ•ë;ƒ#EGq} ývËçM¿¿/é?¢rÓìs†ä €GœT³ÿÌ ’ÀJ}À¦Ç 4,ëLìb¬ÔÇú"Ÿåþx%χUØDÍ™çkŸ974æ¯òü¥§Ö3uj/A:¯;þ¼NÊØÒ—E‹ ,X$pS¸ãÓ !ú@°C‚l~ì„$ #Lû+ ÿíÃA€ZÜ,ÅM@:ÀD»>€éµ¸­7{û &0X6ŽsØ?ñ`ùë¥ÓpÑõ-ôÛ-Ÿ—¸ÿ©¦»!Kþùìÿ˜Vг‚>C¯§ó¢öSRð«öÙüÿ™‹ÚÊ.ƒþ$&9´•\› #HB=h.Ï!/i¡¿6òyûí·?üвÂ^ò÷ ë5Úç×ÓKžÿ×ݾŒ?Ñïcà ‹ÝÇ¿ísÀð¢òÍÎI¶õÄ3¹_rü¹)Ek9Ï"E‹ ,x$püGÊÿ°Põ¶âyo8sáõÁ¼Õõ-ôÛ-ŸWtcÆÜôowôÏ­wÈÐÓmrÎô]¨èW}þÐjš¬½žåÔþTÈÿiÁñzÀfßK¿ë«èÍòq”x%GÎ ––ïÜB¬Žî _¸U·iÚó;ï…tŽj6ÜÝ})jÔ éår¯NÏÝÇ¥ÌñßyÏ~¼—9ÿÓ£úǸzÿ¦éÙßÿžYDíaþ¿ýáÇîäƒaÖþÏ÷¿àÊíÿüÛÉþÏ´ÿKº^æú~?ýþ÷ŸòïÓYù>yòÒòWC>\/ùûÕ¿ÞKüþÝø3Ègg÷n^ÐËŸùœUÐê òMÎBvrI^ñ¼æøó:)cK_ ,X$°H`‘ÀMIà"|‘îÈn/xœRd¤ìŸ ”‚þ±Fš{Bðý5áxirp‚„ö m\Î H€7›~Ä¿™ëƒ¸ˆ°Ðo³|^Íým4çÍSô£öÉ@û?¢Ãö—@AÁùaþŸþãJ é‘ ¹þÕ¼·ãëûû³rcçÇü?é–ɇªª.yüÓ¢öæòÛß–€ƒƒªÿ°½éøÖ\ 3¿ïô#–˜NãÿOáxöÐþ Íÿi¢ aÚÿ½ ‘ïééO6ý?Û?ï\@?Ô|ÁO__~z;þŒíc@é숞¯æú0>„€êj®µù:)cK_ ,X$°H`‘ÀMIàÕcVAfPÞêDdø@Ç ÷Û³‹ZËý˜(:Ι¤û#ñ_k9`õ@Ç÷Þxÿ2ƯÉÀ/9¸Pª^ÊQÅ!¿TûJ™û•´w@ã íj›DȆÜüëf÷ãÑÖ§-¡û×q4ííG2Nˆ˜e?Û*m0²^Ä`A™ðO9¦ÇZÂöH8>úìŸ1 ÏSøÙᘸ_:ÓgUB,‚£».è_;þŒíá@ë ð#^üü}öúÉuÇŸ›R´–ó,X$°H`‘À"×IwN­7ÿ0iýÛ–ýZöX1ÉþJýgìÿ>¶-ûŸÇœ¥´¥þ3öz¾gÿïñRN“RJõ"åàRŠ>A—ÞÑæàŽô¬œ$ìð®½è97l_åàÆüKn@orpkºO{79¸ Ã3@q«Öõ&7 79¸½wôüaÿ—Ü ýÔLÁýkrp£öunD§ü‹ 9\ÿTçàŽíÛÜþyn¤·9¸#½ÍÁ ø79¸áõW9¸qÿJnMw\5<+Eî/˜ö¾˜›û”}Ïnþ ( ¢óÿÄðP:òó…ù8Ð&)èæhž¿ê—ÎöÙÚŸžqò–¡ÏøãkÕþz•#4ã¿Å¥‰Øôø#þ‘üÁƒm AJ!Æ…~¸ÿœ-ÀªnÐN¾Ï´‡9UjüÑìàŸþ)…ŒçŸiêš¾ö/ˆ@~w}P5àè>=ŠÇŠèta䀦p  €>Ãó{ho0ê=È_sýÇx9z®MÜž9³¿Ÿa È'¾?lèé0šó¿óÎ;Oÿ_;úßG'§#iìÙþ®ÿô'ATíïÿôéèÝOŸÎü¾Ì`|NíhúW?CÿÚñgì_ì(ügRºû72Ãù»Š!¢C?¹îøó:)cK_ ,X$°H`‘ÀMIàÎÉ9çíè8FÆÿ4€c¼Ü™ýÂã˜IDÈ ¦UNá`âñ>–ýf*\ÇHäÝ“€ÿ@pTÃq´@R25_R.vi€.Z›ƒ;ÒËÁ¡×€Ž?›”ܰ}•ƒ;ÒÛ¸L_­2ʃktVºÏô&7 79¸½ÉÁ è(àPrpzgÿýkrp#þÔ¿SnHoýõ# cpùïW˧ Á økò?ÍÀô6w¤·9¸#½ÍÁ®¯ÎÁ~Ë9¸™žïo¥àf<¸ÿz@{ÿÂø§ý/€EÎWtAž€£žÖtÿëÁó‘ž±þùòêÞ ÙøŸœ§€ŸÏ×FÀÚ#NÖUsÀ•è{{›È¿v|ù…uÒ ŒuE? "*¶¦OOžcpô%hÏqIãO XŸÿݹX@Ðþ‘cä=«ÕùÀºˆü>ÛÚBÕÑ»úüô@2`+>ÿ8šö©<Aÿé R{í¨ÚËø×ÿÊPè}ž=;úûG©М_¿É‚óÃþgŠ»y:Ž€–¿g`Ø>Šèú7=Iµƒó§È¥ÚPµ‡ Ùÿô‹Û }Íßã €æ÷]ÿT8oîþÇûÚ–ðú»ñgèÆ¦ÿk)UÊùg@»ç305ÜRF %+2õ“ëŽ?7¥h-çY$°H`‘À"E¯“n X)·µ%¸×æàŽt?â9¸½ÉÁÛ—܈^çàŽôv.ä_åàôœƒ;smMnð&7 79¸½wt_ispgä—spczÉÁé%w¤€þ+Í \À¿ÉÁ½f mnðµ&w¤·9¸ñiŠÐ{@ûÏÓüßÞ¦Ý5g €ìÿ\ °€JAgÀo·ðÿÈ`ò:®Ð‰—þjq.•S¡ÞnAÛï¾ûî¿q9“ jÿì¯lðWùFú¥OŸžã¾Ø:ŸÉÓÓãS»y¢ó» €øõ×Zy‚ötp™Ãx¦…~€èütüýÙàÅ0Èútgg='ÿãýã5Ü?ïìÔ=8~¤‰<3¿/\|U€ñ^H@Q{sœå€¦ýãûÙþÇ/¿Î@ èc@×?˜€oËÊLDü@ݾ†ö`8Èøÿ‘ÿ50ÜR—¬O­ñçuRÆ–¾,X$°H`‘À"›’ÀOø?Fè0ÿ®~|Œ5”¹3Ô`Œ¯þW1Óš~w¬Qþ&æc,áÁÿ‡Z³€­×¨ À"˜(tEB+ÏÁ¥‚E“:  ÎÁémn@orp:5€îüÓƒ:wl?DôíѤäà²=±ªëÏ9¸I¯êè)×`¸ÇöMn@orpGz›ƒ;ÒÛÜ€?•Ü^åàÆíKîHospƒöÍ \@orpãó×7bÿû´9¸Aû&7ú}êÜèüµߟmÿšçck *8ÿèP©Àêþc €-Jà€ü|mmA=¯tìôÏ_s·o¿bü/Œ8­1b€ŽllüûbŒ

ÓT<üF@}Â9:jRÊõÃÿ–£ áïCFãèø»`ö÷E@ëèÚÓùãgg4ñ£ûc²:u€ö÷CtPÓŸX~ÿãÇU @E‡€¿íýû˜ÛŽÏ”¬ùoy@áQÓWûQ[#gîþ¯ïáú»ñg Ó{°°GþFùÍ`4÷ÕÄŸ£´1CDb¡ëˆô“kŽ?7¥h-çY$°H`‘À"E¯“îx¿Í² ¶2ÿaËk°hKøGöÿ¡Ö–ù¸²5òôGdr¢rm™ÿi<€SxÊ‹ûÁƒ)—`¡0¦\:½ÍÁ•ÓÐá;¨rpz“ƒµ¯spú£ï …]9¸#}ˆHýK9þl“sp±m9ú§ åà&i tŸKŠNOorpþMîHospGz›ƒõ¿ÎÁèunܾ„à†ô*7 ÷ƒüêÜøü&z7âºömnоÉÁ èÍ \EO÷£€÷—ÕÈKKpÿaÞŸ“ÿúëïÏý}Îj†0m =_hR)蜦“ {¾ÊcÚó¯ÛçoY{`è_°ºÜ`€#Έoâ•ýŸ ”š®Ò>Ϙ Š®èôéÇI jUûwÿÝÿ–#ÂÖ¶/ÂøßË}û ϴʤ€Óû—b:2ªWØ/º¾¿Ð„Ÿ»~siÊŽ×@•PÑ÷ÿìèè} ˆûz¼³ã9ÑõE€F¾†ÀAf~?œ¹šáïŸ0+ß'm@Û>t”þÁp¢E…ÃþU!] 6Ñ÷iAû<ÒÛág¤·ãÏ@糿‹€uqäë£àVá²Ü ýÐËmò \оÉÁémnоÉÁ è½ ]_¾ÿk|¸¿@{ÿKWü¿gTÏGà¡p”ö[[,ôµ&éúç+ݘIþaûò%ká ÜúR €M?çÑÌPÛÿ9Ǻ¢ã+J¢ð›Ïr° =gÌÐyU¡Ä œªý4¹ ÁhÏ_ ×sÀ ý}ß·Ï’#^èÀ~ã¿-ŒDÑù„q¾ÿ‚Í_ýF@¢‹‘!s\ ’@%¦ !ö?·"þ!u€ˆN€Ö¹çÑBê0€±|Øò;…`„ô €$¢cðIþ‘¨}ˆP~?8|©"šûäìûWìÿ°ÿ%VÐC@uþvüίñÅ"Ö†A¾>:ð€á_íè¯/?‰?LJ¹é'×nJÑZγH`‘À"E‹^' Ü @~­×ö>˜6šÜÊUnHo«ô_irp£öÏþJûßrpÇåR €&7d¡Ü™žãpƒ~«ótßiBpƒöMî@ïrpã^–Ü‘ÞæàÆíKnH¯rpg¥ÔíßÊ3pAû&w¤·9¸ÑùÛ*€Ã7zÀð…Zˆ}@÷•<¿7BŽ "ò1“ÎO¥T SªÝõÉ!WXJûèÁ˜x­0Jü?."Eðzªíåß/¶þnºþ°=í÷„ôwÿýß?ûd®Ž{+Ù™þå/ô­Â›3íó½suþ…==×ißÉÜx½ýv!ùøí?~õü»w¾ÿ•àj¿?ý"ø³‰«Ë§Šx©ö—Þ?Àà„ hšJ€æú@CoÇŸáú †ÀÇ0Ð €×Iï[ú²H`‘À"E·\wX%KY¸ˆ@§msE<7䨱  P€2¶ÍÕ ³ÿÀ`@¡ “ ¶Ígÿ‰ë C›hæà¼@^E¯sp©)x¾¢×9¸Çš2€]û&7l_åàŽô67Ó)0S”š\ìŸéü…ŽÉ1æàfEm ×9¸aû*7 ÷€ñüUîоËÁÏß8þunܾq íëܰ½ÕPnÌ¿‰èù7!¸cû67â_çàô&7ÓËýÛ(àÃýDt÷oÑÀíú«çÃ8?  ´¯0  SCg@ÿ|å;sàoí#:Æ R.ÇØôøƒº1’®¡„ /ôY‡BØoH>~èØÿ~X…ˆßÐùû›;‡¨ÿZÎêë­õÞÚU•‹ê÷KÈ×ߌ?Ãó£´"0¸¨Naðö3—ß_˜ã·t„~rÝñç–ëËå/X$°H`‘À-•Àø) ÷Ó_¶ÍórYgç0£¬aÎ"WÄ`@8€`ß¶ÍqXfFÂhíPú:äU® œ–Þäàtªp­ mßäàδ¯ÕÀîümnÝÞѯ›\£ÓQ0X†°_èunÜ€\Ínä_çàδç•rpGz›ƒ¶¯rp#z篿ÊÁíŸçà†ô*7n_rpzïèú׿àÆ×Ï$û¼ ×WçàÖííþoð«ßî®r|Ûöq @y~î 0)è¼wè蟿ÖªèlßÓù1~\ `Óㆳ‹>Y莑Р~© Ý"Ÿ_Åýq`Õµ PBN¸Âý9ÊóCËŸÿ5ÐìŒüçÊ^z!Ë€é`¿ä…@?¹îøsKõ¾å² ,X$°Hà–Kàòõ 8ÜŒÐ6Wx·r&zƒ¡ #´Íæ‘÷¯Y¡з¹Ú“ƒ€Ø ¯³ÿë:åI5)9¸8ÒÕ)ospG:y”܈^çàÆí#§;›ƒ›Û#ÝòfÛ\£×uîj¤W9¸síSnH¯rpçÏŸÝùÛܨ}ƒÑë܈^çàÎ÷ÏBpCz•ƒÑëÜ€Þct×ßæàÎô¯Î¿*7·÷ûß˓먀w÷_°L[Ãý?8ªû³BÄ“«å´~~viÁ× :Ôôèù›»ÿÑ~¸}­=Ñû¸èÓ.¾¿F@-Ûú”€¸1Ùþ´·éñÊEÜj¡/ò¹ âWsسi ¼ú>ƒ_®¯FºHt ƒ¥}•À£ìxù2}¦†Ñ,xÙi¤¹ÞøsËõ¿åò ,X$°Hà–Jà&1šÜÑž0£¯ÖSf¾3¸ÊÁ ¿Tåà^™÷¥ ¶Ê7ªÍK›½Ä„Âõª—.÷U³q~ÙðâMì›MîUOS›ƒ{õö·Hàrú–•U-"ÀÀ° ¨ÉŠPý?ׇ; «Î­"Ýš¤ÛÙ‰,úù+Pûòúg–8ÀP¹p:àçz;êƒÂMç |…æ à¾ù–Îá¯úrõîöB–ö^ԲȿÈ"’Ék!ŸÈÐý~õø3ƒ Œ1¯€Ã’£V®7þÜR½o¹ìE‹ ,¸å¸s|BÅ=çþ#^ÿx:Cõ`b ™ÈùG1?Ïý?f€“5§þ €Läüëßsÿ2ŒIÿCØñ‡û@KLÆJ~U§<üÂOGú¿€óç®ÿµ¢w9¸ÔÛ_«þ·Èß?ÜàéþˆÃýß9*:²ÿÝ€m–Ìü·¶˜š«ø\/ÔM½:ôöíûïÝŒ~æw„÷€É l”%ßôøs|IûB¿8Ç}‘Ï-‘O\ rýƒ™žËŒjˆÉ™>ƒpùý• ö‘P9 XVðšãÏ-×ÿ–Ë_$°H`‘À"[*;¬üýÝsÿ×x­£ ¨ò"–=÷ÿ +Ä‘C¨ò_ÉýßG2¼D@;¦ pQªƒ>/\‡|ÆAðz´'Ô_´ uê»/-tûý~íò{‘û?v¼ðý žÙƳS!¦/€€Ü[]:z¡_ö|Yûî[ÖÞpæFüÌY_Òñdèó1õ¸ïWšŽozüÿ s¸ú"Ÿ RPjþ–È'v¼øõç2£ ´ŸÁxaùìsÊNýf„<½æøsKõ¾å² ,X$°Hà–KàÎñ9ÿÔq”ûóDœ‡«Õ!})÷æ?"ˆŸ`ŒèevžáÀÀ"NØÂ½ ‰Âˆg_¼ù†Ûo]‹ÿqŽumÙŒuîz-Û"Ÿ¹ÿû òímD`¼øóá)rÜ™#à€Ò~kk¯UÐåxqþÞ¾»Õ>@1<#˜¡?àúŒ°éñçøb±ÕB¿q‘Ïm¹º”ÃÿÂχ—U!€PîŸ €Ëùç*P'äТþñß5ÇŸ[®ÿ-—¿H`‘À"E·T7…8µ9ñËÒ·"¥±v~ÙþMKÿ† 5Fßô߇óóíÒ^ß%t:N5ñ…Xö?mó²lA>`±°ç :Ót›ç'àW)À¥!—öÝpNÿWóÿ¬–Ð8lú?ÏÿcºÑ±oðÕ}-r¬ûð‰ yéß#ÿkÿýºÑgÈñ¿Œ\«P9jc=rÔôKåë  ÷ïšãÏ-Õû–Ë^$°H`‘À"[.;g@êbÎ?ÓÎÉ?!«OXð áûLjÿGÎ?ÓNVødb°& ®W–ó/¼Né11 À—¬z8ÃYÕ!ÿeé± ®“>ß?$ÊÏ\_]‡>j¿Ðüÿk—ß‹Ýÿ‘_ß—Ð-@¦¸>  <_ÄhtMÒUÏß>òu,›G©|Ãö#]Óüc,|vEÑãÏ’6=þœá:NNÙ&úÄ,ôE>Ëý¡ç£Œ1噩ŸËèª2"@Ü^ÅISÈ%=“WyþR}¤ç×™—n¹þ·\þ"E‹ ÜR ÜA¾¿rþñeä?v@ÇWÌýWÎ?LFþÓ`t||åü3š‘ÿtØK€¸‚•nQiUñѾÁäC?ž½>¸2³æ®o¡ßùlþþW @q8à7tÿLBñ/ ºêÔÏW)#X¶jzj_ÏéTÇ»üÿ-î.ÿ?Á˜&¿éñ眃OYçÕ±z;}c¡™-ò¹5÷Oþ™¹ÿ/£'œþ7wÿ\sü¹¥zßrÙ‹ ,X$pË%pç”9ްü™õ êÂ^+à€íCž–?³þifL‡ø¦\k8<\í#Í–?³þÀoš+à¥{€ƒÐ®ê˜¿ÁtT\_Í^ ü…~»ås#÷2_=_¹üŸfèìcªè´ìøï›üÛ?¨é©ýHçø1·pü² ª/“¶ññçÕf,Ü ÜZ „ÙA¿°4®;þÜrýo¹üE‹ ,¸¥¸) €_XMXN¿H`‘À/!Ƶgý=[ιH`‘À¯]—?·Tï[.{‘À"E‹n¹/œ9ÿ'¨·Ë|l®°;á8ÀÎÖÇëcåü#©ˆ§(jÏíÀw#W™x«C ñàð‡ÖǨ"ÈmÄ€‚égzBÎý€¬ÚüHÒ±…¾Èg¹?^ƒçƒVÂÌøPÌÇý™)¹ÕøQ)àJúg†PíØôøs2=âr¤Õ‘­´Á-Œ| }‘Ïr¼æÏ‡’…BýäºãÏ-×ÿ–Ë_$°H`‘À"[*;@þcÈ?Àüú‡5S".°€üÇxôk¦¬QP  ù!ÿCöÀ¡Rð%DBÎÌ*h?9°Ð%ôE>Ëýñú>tÐiªpòø!Ì¿Ÿ™þϧ:Ù`æ?sñÀ¦ÇŸ³iw—ÖþÑWÜÖ.³ °šp] }‘Ïr¼ÞÏ=v›n©Þ·\ö"E‹ Ür   €¡ý­OŽQ[µ©VþàÀt>a€ hðÈõ=…ÍϬ~®0ï„`üW°ùÞ‡?8„ H(?÷Npø(ðB_ä³Ü¯ûóß„ÂtÌ P>~$ódwøø‘‹ šùzëØôøs6ÉØ×bv½3­ú"ŸåþxÝŸØyôêÇŸ[®ÿ-—¿H`‘À"E·T›ÇHÅ{â5Aò.Zú"Ÿåþ˜—ÀM=‚ ­½]î°ÍþÓüÇ–»Jšý§ùO|Á* `ó9Èw/Xxö…>/E>Ëýñ:<î¿“ 1^zü¹¥zßrÙ‹ ,X$pË%p¸ÿJù?9æ*œ®O°ÍòìÓúä ¹B@õ¿5òÿQàøP逘¸Î€LùGØ?òÿQ`…ÒÈ À„°ÃÍ+øË ,ب,†ÿG/Æ2ûœ ÓŸQõ#¹0~  ˜ÿû˜þ?D­Ê°éñ‡Ý{t´{·—Ï£]S÷ú"Ÿåþh%ð:=Ó#:!,‚Ç@<ØWÓO®;þÜrýo¹üE‹ ,¸¥¸,"ÀÀ§vª1 CÔÎn_6'€awÄÓÒ®;þÜR½o¹ìE‹ ,¸å¸ãÓêÈ€ðG²þÉ„$ #Lû+ ÿíÃA°Cˆ  `¢Ýp„<4ôo Zöoµ¤cë…þɧ(à/ûû¤ˆ—mŸ]D~Ï,÷GýüBÏž¤H¾fÿïî@½é´ÿÍÀ‹Ê7;ôË´^x&óÿg.rh+»Rî?ÝP‡rh+¹6>þ ‹˜8,ßU&¡O2½ó…[²9z5zÁsÓWþóÌÑwwŸáÇÉîÿd_‰^[Íö罿Œ ¯/<ÿS3¹^ºý4=ûûß/lóÿí?6@Ô¿S:£ù^>YQû?ÿv²ÿ3í¿Å2á­õ²¿Ïï§ßÿþSþ}:{ÿ¼ª]„ÀóI#æó1£î ùMHbŠè¥7rôíE?NŽÎ˜^;Âöù$Aûc,8ƒ>ƒóoå1vµ÷ogãÏŽ¹¢þýã ù².ôf ¯o…ì³Á#úßÀxý˜þÇÿgÛ·€XþI€Ñù[@Оö?K×ÎôŸÇ¿|òäË:,ÿß¿óé§Ÿ¾óé;3÷Ç“'GG>ý£ý_9‚þåÑgöþûqöúá´‡±L>ófîßùû¯†öƒ ë7> í/à?5°;TÍݽæøsKõ¾å² ,X$°Hà–KàΙªëBïMUv"@*À>"ÝÿZŸfDß_³\À1ÿ¹FABðýs` 4WÀuìàà¼Ð[|¤· xL/3p1½s4ç/ü¹uÑùcz«€Gík<¢× x@oð°•Ñk<¢× xD½üaœø\Ô~pôí+|NþI趯ðˆ^ÏÀ…í+|¦Yïé}î•ï/™Ðœ7WôüxîìРýZ»;#=r¼Àýñ!ñJ=(ŽK¨€ åÿ_° …`³ãû_Ûß=Ÿž³ÿ°îðè'‰ŽÜ„6!½é€€‘žÇ¹-fèÙÒ^õ³YØqûûïß·óŒtJùxµfu˜¨Aû4Ñþè~ä hóÿôÿ€sc†ÞŒ?QÿWgtîKDÿû³2ÆtÌÿ“nIQûS:?tõ3ò«ÆŸ¨ýŸ¹üö·Šé°½9þ|k.¹ßÿG,1Æÿ;ŸbzöÐþ Gà@ÀÈ_öv„×ú“MÿÏöÏ;ÒQ¸‡·žbþÄÜß1ÿnüÚ³ÜÇþÁžûFþÝø4´Ÿç†JŠŒ ÀõÆŸ[®ÿ-—¿H`‘À"E·TwN§3+D¯õ¹#ÀŽ#)éþLæçZ& qÿ€`Ç‘€t$h óOˆü³ã€lIwh]è­>Ò³ò(|†žð^)àqû¢€ôf. 7 x@oð€Þ(à=rTòƒQV)àÑõÕ x@oð¨}­€ÏÉ?ýJ½VÀGz«€ÏýþIé­>Ò[<àßÌÀ…×_)àqÿŠÞÓûܸý6“à@‡áOCÚìÿì(¿ì(ôØÐÜ?Å<+çÇø:êï^g{Óãû_ƒü}÷—ïþ’ ("›f:ÆŸç«çÏŸW€†ž®òP“ü2`Z:gà5þp# ãèÎÎÏ>OÒŸ?þéñcù'‚ökŽ?iÇü·p™­™þíÜ¿>fè'«'ÿø“DfèOª<®¨ÿge;L|ýõðÉçmÙÿîåƒÈíÿùN9)l_ìÿ =ã¸XŒ}Ð^¾Ç/¿üò?bú§Ÿ½ƒ1è£#FŒíSÚ:¬Yú†ûçñ}‹€²%ê¿ù?š£?áÇ­­‰ë¨="\hÿ#io†ÿ4•ñg87þ ôm:VûûæÏ9êçgž?”’¦“°XpÍå–ê}Ëe/X$°H`‘À-—Àšç¬BΠàÕ‰Èð' €ŽîéþÔZL@Ç9ót$þk-ˆ ã{çŒ-¨Â“îΪÐ[|¤§7½)à3ôÞPñg«¢€‡í+|¤·3pQûZèÐ< 7 xtþZèÐ<”O¥€ÏÉ?ýJ!½RÀGz«€í|¤· øHoð‘ÞÎÀEý¯ðè÷©ðÞ…àÆòåþ¥õ[n€PèP°¿Æ¢NY„MÝ~L¨é"Úãéˆ ÆŠóóSØe?Û*m;»Ó ° Lø'¨Vi?<ö6=þ°ÿà9\XÑÃøVèÖÉ0Ò]@ãöÓLó}„üÙêàŸ< 8ÿ4}ÿ#?~óoÇŸ°[LØšë߸¿‡¿~#hò·'«ÓÀĤÐá€,€€g’9(¡€ÞŒ?#ým‡ÿ›´Ë?A`ÌÑ‹ nÿ/Xìwéíø´—ï19 º @Gˆ` ÀpµØH—`z¬%lïñGŸÍôÿéSXþ?Âþç::?3pïåˆûWÆŸÞ?]€0лñé üá“ –a@]åZãÏ-×ÿ–Ë_$°H`‘À"[*ÇøÎðÚ)`Û­>Ò[< 73pqû¢€GôZéí \È¿RÀz£€ôFèÐ< ©}·UÀgä—AÎb:SIl‰éEé åÕ(àÿFŸ½fû×ÎÀí|¤· øHoCpãþu€º¯°ýé`° þ.ÄøQÞÿ—ÇH€Ú‚©=5)kéJ °}!æÂýoÛ'ÛbЩ7°4æÃó犨+Hð€‘>= €›ÍoGí"ÍmÔ =ZÕ€‚Kàý{ðüÙ}ØçÏž?ù·ãOÌëädk¶Œ@ºÏ~%h¿ÿ·'ûÛêoÓž9†þ1){:¼Æµ oÿwŽ?ÊBb&ÀØ çOŸ[@|}§’œ“?Ž—ñ'nŸ"þ)É"‚öšüO Gï €3ý/7ûØžãO¶ÿ£öˆ?:>úìŸ1 ú}0ûÀôë™ó µãùÕ€î÷ëÆŸáü=@ÿTŸ†öð'bA[¨²©ëq­ñç–ê}Ëe/X$°H`‘À-—À³Ó“ À–:AF,²b9'†§Àê„ÉHþ‡j¿&Àé1æö @Ç™3 åÿ˜sþD8^Á814?$ÿÚ™\÷Æ“Boð‘Þ*ཙ èñ¯ð‘FTý§^Uð€£€ôFèÐ|¤· øHoðX~EéÄ‚X›‚·/ øHoð }£€ôFÏ_ð‘ÞÎÀí<ú}j<ú}ëÜ+÷Ou6¡%c¢ “m£|¡`ãêz €rÆ)Ýý{|ú2ta|8;ÅÜéñ„X|š ìŸŸÐÀ„ í=}ÊPö÷önbü©Ì‡¶ …T&„úŸŒ÷Ÿ3À1FúDðFßÏ´—q¬Ù‹èùkøù§Ðiê,s>Òû€€? Ñ.èâŸîÓ@û0ìOj@#ŸI)Häp¼>¼ðJ€È"úþaüA}†tOímà†òÃë'aŒ„ôjü‰Û3iö÷3 à|Æ÷‡Mþ—€Qþï¼óÎÄÿ@+¿üpÑ‘4öãO²ÿSéʶýéO‚HÃùŸ>ý½ûáéÓ¹ßðøi d"–OîâHïÆŸ¡}ä¨ûßOCû ø·I<¹÷ÒO®;þÜrýo¹üE‹ ,¸¥¸sj…¸ù‡I;LpaÛ²ÿW<¶:Æ>’ý•úÏØÿ}l[öÿ>!¯PiÿJýgì?ô|Ïþßã±=ñ/)YwhUè­>Ò[< ×Xã9l¹9¥€í|¤¡î®/+àQÿk<¢× x@oð€Þ(à#½UÀGz«€Gýƒr܃ü5׌›ã¡î\âöEé•ÐÇ€NþµŸß\*à#½ Ú7 xôûÔ x@oBp£þG‹K(?ÿ0žÍüPÀÐ>v”ß'vô÷o¶þb¿èNÏ8ùÃÐgüÁ Ú_¯r€fü·¸471þÔ€/¿pPeþØÿœa|@EÈ€éÓ“ç'9Ç<¢£YU`à?½û1KÚ?rŒ¼gr çï"Æþ!òûlk …ÑôŸHÈ@ è  ÿ¥òí9þp†ÙC{ÿú/@OGÒ³gG?bœ#‚ókü±á%¤×ãOܾrDü5þs.æßF„ý›ž¤Z‰ÁùS@?#ýñýlÿCˆA{@2 €€Þ:Æþ­ö‘£¶Þ"Äe,¿züøwãÏ@ËVÏWïèûwÿ6‰'÷^úÉuÇŸ[ª÷-—½H`‘À"E·\wNÎ9oG'À12b‘ ײÿOxå¼YAŒN€2þ' ¬<ûe…hð#‘wONdüO@pTÃñ}ò¯Iwc]Ñ< 7 x@ofà¢öµÐ|¤‡uÿ<:­€GôÀPóŸj›3{€Úæ# @.3—~Ž'Àá¶ÿŸÏÝ6ÀÚ#NÖUFsÀ•è{{71þÀƒ4ü˜¥þ§cŒ?Ï×(€–ŽpЗMžÞ;Zú»ïþ—3y‚óOÏþJΕ`¤¯ïcYé‚Ú?}z¾˹å€×‡ÇwçxçTöH÷ñG¿sؾ€:Ç.ÅÐ^ÿ3-†"þþþì?ðâä{º³ã7Ypþfü û?ýyg'EDòÁøó#ÇàüÇíÑqÇùœ¡«2ÝŒülü9;;Ë€æúàào{ÿ¾jæFü«"$ñï_G×·OÆ++óñuÿºñgh9êöÝø4´¿€ÿˆ`Oô«n¹þ·\þ"E‹ ÜR Ü0@QÀ+§@r4 x@oð^)à½QÀ£öµ>Ò/Åhð°•ÑkCÏ x@oð‘ÞÎÀEük< 7Òwë܈ÿà¨Û3xžæÿö6è`ww'ÿ¥î©ËÖÝ¿À`ò:ü7ºÊÃT½@iÛó•Wp  ÀýË/ž´ïðøü ãï©hqûÎе¯ðø÷) øÌïßGÔ×ß(àcûv.â_+àÑï_+འÁé¿«Ìü¶¶ "ó€œP®ÏëpÓ€¿Qþ3Íó™Ï^ÎÏñÁ˜!"¨ÐuDãÃ…§5@ì0À‘?諆¡fÿ ]È…îæ°熮èôeª¥køI™AûwÿÝÿ–#†öEÀcû÷I|ß>SwÓ¿£-Îý#œ³ÐÁùq4%ÄtT¯|‚x¦=<^L#âÒ1X &1>?€J @ÝÄý?;:zßâö§Ç;;žžßó¿ÏŸ1þ8Àlÿ0Å?Ûÿ0{}OÚ€ö÷ ã/9 ¿?*dÔÅ×È=Ê8™&«0ÞßÕÓÒY¢Tã <Çö>þ¸`–žÆ§àüsü«4uÑZ¿Šñç–ëËå/X$°H`‘À-•ÀOøGràš‰ÿžù[^vȰ„dÿjm™ÿ‡Ð¹Fn€þˆLN@®-ó?­÷ψ/൞  š^+à½QÀÃö âß(à3í³4ÒÛ¸ }£€Çü‹Ñk|¦Yèµ>{}®€ôVÛW xxþJÛW ø¼üMé•·/ x@åþhgàâëW!n-½VÀ#z‚;Ò­Hž-pçä¿þz©Ã #¨8òõÑp+ž*ú©2ÀmoËt¦ Ñ9>¤¸wh|À| Àêr€ŽllüAÿ­äl÷2ÿŸB ÙÿLÇWò´6 XˆrMÏÙ3t¦ýý4ùT0þýœÿ2:°ßhúáo ~€èüŽÁ0ßâÀøiâöô/<IH7À<Q*@sý¬B‚ØÿÜŠø€‹NÑkdDG%Ì]ß4}§Û$¤§3tx“$j?b4×_?óýË.€°ÅþÎp–õÖz ؼ£¡9;þ„ü1îÀö×ß@/ãÏî.ÆŸ 蟮À ö—­ù°¾‚ñç–ê}Ëe/X$°H`‘À-—"”ð >¤ÿÁ›†?¸VA¯SXù4IP?k9°F1áÓ5k{OÇÈôgRò!Òÿ TÖ‡\³²Ï99š QÀÝÀXWt|¥(à#½UÀãöe.¢× xܾ¨#½é­óOó3%ǽ¹þJŸë_RÀCz¥€Ï_Ÿ)à#½UÀ£öµÑUÞgà"z­€Ï÷Ïð^)à½VÀzˆPäßÎÀÍô/+à!½RÀ#z‚;ÒC@õ|ÈøWü?í¼¡½×áæ Û÷Á@§þÕ€îùïŽs).ŒX_аéñü§#³jûß õ?Óyñå?¦gÍ´¿˜þî¿ÿûgŸ8Šû+ç›"-ØœéŸM's¼þº>z^êú[®•ÿÛo§:¤¿ýáÇ/Å¿^¾•àjò¡_"ñòç¿þïý¾ÎJ²´‚þ€þú~Âáú|üaÇŸ9zŸBùÄü›4I‡Ê«n¹þ·\þ"E‹ ÜR Ü$@£€»S@ïój;+à3ô¬B†ôj.¤W øKñ¯ر}«€ÏðÏ øuÎOü:í;™¯Nåü+Ù…çÏôÊàÇ꾤¯ýkð«÷¿»zûöƒöMîHÍõçø‚â¨é)Çv€˜âøG)/(ß7ÀÍtTå /ôn‚•–ìMËçÃÝûÿCàÜôù»ñé×vþƒuupÒŽ×׎?W¾þ €ãÏоŸ®Â?y𚟨„\ ƒä–ê}Ëe/X$°H`‘À-—ÀVéS.bBnÛ\a:…9°¬(Ä L msµÂ40XP(ˆ¾msŨ`œ¥pãÈTrS&°5ðúÍɧSÀ}ùæÎÿ«¿?ÚÜQ¾s)ùù(€ä4«Ÿ*ØÄÙ@"àíg0.þ0ÇoÞ„ãÆ ðË16?þp6rÆÀµþ/ôE>m„yr€Üªû#p\åúkÀH~Ýø$À‹ñgÀá–èŒ?·\ÿ[.‘À"E‹n©îÀÀOY¸'˜~·m®˜—Ë:;‡`úN†ÀqXŽG Ø·msE\¤€]3ÙÌàx`¡;FBm§îE>¿Žû£Á}‰ß7r”燖?ÿj».˜ž¯¹2€—>ÈòGg§ƒý7+ÆŒ×ÂØüøãáÈJù‘ç­ÿ®¼Ðn‘Ï-»?úˆþù¸Œ~ÙóÓOÃý5Ï €U8ˆ}OÍ_ÅøsKõ¾å² ,X$°Hà–Kàòõ 8ÜŒÐ6WЙ#‹yKC@Fh›+”BÞ¿fý… @ßæjO‚}X(øÿÿö®^5²$Y Î#D; —eG^Ö¥(§¬cǹk´90\š5·YP»Í:íÌ;Œ¡f™fCŒÑå•Sæ’3¢­û}ùŸ‘¥.UKÛꊔTuêDežÌ8'S_ÆÏÒéΟ¡‰ÿ|þÅ<­ nòø$~\*ч¿¿dzab  ¯oÁ_Z@äæ ¯ ¶ÎòA^V«¹¼Êä |^!  ”y•!H”Cý<Íîý‰ ~ Hê9ö4ú+ z’§;êùhÖŸîùoô~~T€fÞ(çW³>íÐ>-ÐÈ\4³ç'X\þóá;œÎçÀrà!cT"Ä=øX{ûœ¿xRÊGÆøï>?Ðô¿ÈòÕûø«€-Ðc?i t%Y­¬>Ü À/7Šðó4ç+„ +T,€ŸÃY ˆ¶Ð* mz§kžvy†N«MWçßhñ¢Äó÷¿þÜh@² ‘sè?®ïtç?ÍôíæG£ wô°þ@çT9¿šõi‡ö!†”!Õ€ÍS>Ùwý9pùχïp8œÊ#fþƒü|ÿWë×HHË^  ™ÿ`Ì|ÿpX" Î,$€dþ˾ÿgpÀh¨G·´¿ÕÇßéΟ-.Hõ| ü±€ÊÃ-›l) `âß ÀGów~†\ŸÙWîÖ‡(€3?âîú‡ÏGEŸÃÃÖÿâ,Œ3žˆõG´KAï9~§;þù°€r~X@IOë@:§Lº®O}Ü~œ¡%)Õ)Ÿì»þ¨ÜçÃv8œÎçÀÑzŸêXâûõŒˆÿ®<±\.ˆDߨÿ°`@(ø @‹^Úæià´`À G81[o2¶túÖ wΟCy~š ò#à£çGÎÃ-yºúƒ··Ÿ²`: Ý*°>¨ÞÌç Š~gpr÷¿þlÔœ½Häúë;ÝùãÏG³þtóÃ2ÑïæÏ|-ìù%tYŸvhb¿]!Zý¬?.ÿùðÎç€sà@9à1‹x#€¹ÿ#óñ¿íþq‡:—Þ‡ÿ6:¢lk°»çÃvŠ‘áRû pû¿Øÿ‡@ èöÚÿÇvc @¡à7 H¸xœ^)hÎáÀ!<õò2›U>úжo£·Y4ÚúS³>íÒ¾Þ3¢ÌÕ÷\Tîóa;œÎçÀsà葺èóO7€ë5^á+'˜ðúj³YÃþ>ÿtØ,ñJÇž`N@$\-ÕçŸnx9ƒï?¾O,׈Á¶Ù, ð×1Ö¹Ó?þ|Èü(ÔÿôL”óã6ºD±.Ϲ²>2{ˆMKœ“»Ì?­‰&ˆ™ÅùK=žF‘ ÝõüÉ0€ €î}ýÁú&Ú‚¥€`}ãõîü9ôçÃTð‹ùqݪù%Á%@)sî#ÛyŸ=;—’0Ê'û®?.ÿùðÎç€sà@9pñù‡¬NËzBÎ/éû/>ÿPýiùO@OÈù³üýÅç²<-ÿ è uXL77¬L!#å9§;üùù…ìjÎóã6z°GõÓü”ó6þÿ1 @º^ãÿÃ(’p¿ëÛýìœAÞj„ç°¾9ÝùãÏÇy¿ÃßÌhçO›`ËübŒáy1ÿ¶µ<€ü6üþµÐ(ƒ'(ŸÈ³Çús rŸÛ9àp8œGWô±†æO¯Ä¢ 68±Ÿš?½þÏÎ,ðMV8±X,Ïf¢ùÓëqø­…B &îir‡?„Á¯_Ã9ðer ŸÑð¸~Œ ×öyD'í¾×¶ß*xIAÿœîüñçcóÃTÐËùÓLráéômíàëTÀõeßõçÀå?¾sÀ9àp($Àg¤¯xWœÎä@Ù@.Üœº‘BcÆØÀ;A n–rŽF,r0_ág³["|’³ÓZŠœ-ñ³†S’~’³h(¶‡]·ïtç>þ|(ëü7°Z?n[Tîóa;œÎçÀsàhsµ¹Ÿäþ¹¾¾An]_O8`׫õj->ÿ«+œÚ\­ù†ÎÃ_`³X. >ÿ‹5N­ÖÈ"ÈcØ€½Ítþšå\ÞàÁ'ŸxÀ#\ÙéÎ>>óù!Š´¹>”ëýq?Ðï¿X?ÊÀ†’3„FAÕÉhüTúb‘€BýŸ™I¨é«Ò¿â€½‰¨ÿÏqHM_•þ%߈,y êÿg8dKl8@Xán®"¾ í;ÝùãÏÇcŸX?$般?ÅúqÛúsàòŸß9àp8”GˆüG“óCÐ?¼Ó`ƒ €âÀX_L HŸ˜ô3 ]VÈ( òMþ¢QñNW| áÂ5¢iì¾ñX>Ò•ñ|„ÌéÎ>>ïùAÄN¶Ý»õ!­*~Óý_Eð°~$\bþI, Pý›š8ö¡Õ@œæÚ³QýŸš>>ª€ 82_©þOMfj N£œICKl ÒÈàæ†%¨Å¶ïtç?|~’W®?iý¸mý9P¹Ï‡íp8œÎdÐh«Í©ÃDöÆþŸBVfXÄÔð𥽂ÎÏhÿ|ÿ8ü#& †ÿãt~xüâ€ÄœÍ®§ºG”ÿ\äôtºó'>þ||®ó#ì¼ áj}ëG¿A@X?‚ÕÐkÖ0õW•!H¸ïà`]DSUùç0(‚þàæÓ’¦þªòŸ-ù!œ±}¨ÿW&X.Äå†L´9Àjçtç?y~ ïýú£âò¶õçÀå?¾sÀ9àp( @ŽÝÓQŸpú˜Î>>‡ù!À„ª(ÐÝ}£ú£ÈwD/Õà‚%8Š?·âå@Åvµ R¶ü¹Õ/š¿fL €¸È–?·úEó—")Iè@ÃÚ`ÏKº5Ñãé¡Ãpr ['ÂNwþøóñxç¶sÀ9àp8ް/&.ÿ›õÛ †WÃûÿ›o׳%²ÿ­àÿŒë…¸ pm\L H—˜ýÃÿ–H ¯ØÚN0XÐùVrþ6åõ39'q¼œîüñç£æÀç4?¦×!Ô‚GƒxˆÇ°¬2£ø Ÿ «Ю#z¥þŸaûq€ ˆ«€ñ%Ë'ù¸¤Á€ºýó%Ë'ù8§¥‘ºýó%Ë'ùK%` Pp×XÔ¸çþ^áæNWXåx!§;üùx¼ó£PÿÛõëÇmëÏË>|ç€sÀ9à8P! #@Ág*@l¸1 zæÇÆ6Ú$|¦<£¢ozà°¼1Àt†œøÁ»úbú@¦ DûHÃe(¸оÓ?#þçe¶<Ì·OÎß6w{ÿNù¾àïy¸?þþ" ¿¬ €Z0ˆ§º\ê?†%Ã+€M±ûOu\†ˆÂhÁzOã@ô|ÆýS @ãiˆžÏ¸ èq<-HÍ›Õä`YßÐ ` ,@ã;ÝùãÏÇ£ ~4ÖŸé¶õç@å>¶sÀ9àp8ŽB¸Ò"òBøC߬doŒñ·€hH׈üCÛÕNÁ€!0D˜¨÷@œÂ÷pÐhŸQ²À…‚ÉЉ”!‰ÎQÑ#•Âýˆ¾ ÚÁˆþìÙ»g£ëíGxt}“žº?MÃþŸþñ4\fëøÌöߪÊuçúÓôî·ß¶Ö‡úÿäÛï°úÃiýó'1ÁªÿÓŸ&ýÔÿ' ˜'mìΟiú~úþûçü{>¬q±…xäqý­ÏƒÜ ù³íþÀ†=Lª»Œ/èÂöõ- |~ƒîíŸG»\ÿ&Oà0n…dñà" ÆÿX£hè?ÞV ! G ¨§Ý}|â=å? <– ƒzµ/†~Êh|NW*ÊÉe=ÿ·Ò3üfÎÁÞþv—ùuëõ€YÝ¿=ן—ÿ|øÎç€sÀ9p x€J€ËI ì!&P@é‹3F"„œ,zæ´õ…¾–ÝA³}U2`ÖO1Ú×tã!éxO?N{¼Ëc»=ÿäO³ÿ¿ÿN“‹aÿ+Àÿ&ÙsÕÁ-úoÐÛÿøýnX¿lþGZׯ£>õh”ãû7M//.^èÐü¿úüùó§ÏŸž‹‹óóý£þ_Fÿ’ú?|þÞÇ¿h&ìô™Ùþ|›ãöyØ —=ð®ÿÐôÿôY& ÿü×8€’Í=½’Èÿ±àö• Ì%ò,ïʘ­ˆÈ¿a"zyðq$ï<Ór €$-÷å±À‘¼K¨9—œ“b7€#yç œÖ ~&˜¦AS8ÿ%Ñ£ztÜn|N/8ÀG©¹ÿ_8Ò¶pÐŽÿ6z³þtü‹†8Ñg×ùuÛõ1ùÿ›¦|5¶¿çús rŸÛ9àp8œG×’ÝzwÌò#„Ït™Ý\!俼¯áF"„ÏÈÃw »…w˜Ĉá3Ú¯ô‡/§Kþÿ†þð5ƒsg:lƒaZ÷‚9€žž$1Ð`Òç0oø ¶]ÿÅ›/ô:=ÊÛz‰`bL`Õõ‹N “€0Æõ¡þ_ýþ»Ø/›ô °ú¿¼&@õÒßoï²”eÔÇþ?éê`µEµJF?àßô``Õÿ‰åO €žÝ›ú÷?Ýÿ÷(6ÊÿÓç@žBÿ7ê_Pý'…‹.úÌñ_ýG·ÿ‡ý 3épG磕·xËóm·/z3÷ÍÅz¾¯ÏhWgóYÀzúé)·È˳Ó]®LM‚’Ŷ–d¡ôƒö ª¼„ëÖ0! Œò50 n Ü4ðŸ$Ð8€Xƒ40 Ì*`µ¤ÿ$€ÆD  ‹%zøó âÿÀ_œºa@À/…^©¯ºÆTãszÍCãO^ùÓQõ|ÜFWØ.­?\ªúÌ ,ÿñ‡ÛÑ1ÿJ²›·]_êkÀàøU½þžëÏË>|ç€sÀ9à8P]M×p÷‡j"ïØs“ˆŒ çáw˜íÊ»ì3î¢èy8ÀÝòõO"ðOÏ£ý*Èßÿúñ_IbdÁDp¹¼¼¼,€Šÿï/d“_¨š.[$òÀ ãìé釰OoÒ/ßüçÍÁ'Œú+ÙU”WhVýcjÓêxпÓ/àe@ß,/~ÿ]Â’Ùý{Íã»fP¶99ØôRÿ·úÿDôÿ€˜üôÿ§ägmÖÏú¿QŸ,jcoÔ—Íÿ—/_þͦ?~þ ÀÓósZôõ£Û:´YâÝóóæ…º h±ú¯Ñß‚ðþøxâ»U.Ôÿá43hšNPׇâOíYõÿ”Ïÿ hÁ ô×·s~u×ǢЅédXÊâòÄïSÄT˜‰ÿ‘éC@žCnùSÝ—ˆÿHrò„rËŸê¾DüGRJFÀ3=gÿÕtª) ry†-Ä5\>zH±ðéúwzËøœ¾ýþaüýQYWãW"—Ÿ¸Õt.:åú4®ªOý3Uñÿÿ«ù…û€Ä e\¿îã°¾~-ÔßgñAÝ•û|ØÎç€sÀ9pà8Âο„Þf®%n!„ã¿8Ãfñ<Ãýá;Ð}yôŒ ç¹íw8þË»ˆÀ(r~†ökà6(¯©€¡ýL`€žþÓ£GvýiÕ|./fû¬5ÿC00®?M?¿§ÀûŸíök ³Çt8õï­ÿ§ü†QóëÅòêw¨˜Ôà :,2`ÐW ‡ zôô'!üß$6ÿc¶=výÿAÑûØÓkÀ¨/›ÿÑÀ +p;ºtÏW-)öt¦7RÌúÁà‡Aÿß¾…æÿú?ß­ës‹ ¼ìŽ ú—åï®Ôþ¡â‹ €Ž.@¶èèÀÿ"/Œðñü&eêAÀµ{ìÀ…>è[<àÎ:€²%‚ÒáŸñ@å- &7ûõ—þO0@,n¨ÿ# ´ý¡Î1—½± Ô…Cnöë#þŸÉÞ¿X ž«rËy£€ìßÅÅ6þc²lë?h!ÀaŽÄ_ü{­cÔì Ÿ* €úÔý‹õGøP”3Dûgà *ðº©HñÁÙ¡¤úmlYlY–·®?*÷ù°Îç€sàÀ9pt}µ™V³xäï{ò8q…ÿ¬xÛÐÎÿíWŒpµÆÞ¾FóôÙÇà5÷ü`½„r¢Ñäü‚íêëW'š@T´Ÿé‹³KZ„=}bðZßê‹r,»ÿ ¨Ú'áˆ&Fû¯eë†LsÞÓ[ €¶ÿRWCä›õé€ð‚õC£ýi"pQuÿ%@ rØñfŒŽ-,U}ÀåÕ¼~pí âZüÇð’¿Iç6l`€]Ÿ>cþh ¾¨ÇßXôüúôéìÿ3ÐÞÿpo$õýõ0ÑèÿÕ$@´è®ÿöí¿ÑÅ¿};º¿/[£A&lþ„Ztɳ )">6ûûúPŽšM1v¹~íÄ“z/ëÃ5¶ú°×?Í—|U ¾Ù CÐÉL^ÈŸg3Uô5ý‰ 6Ir¨Š¾¦ÿ æ€ú0§®ŸÒÿ…4@ €¸ Íýq.Oœ# l0c½ Bjѳ>'ÐÕ'YH‚‚oÒ À¤ »ÒgÇÌy.ey ´­Oõ_c¨ÙÓ§„tD/³ý™!ÕŸ}L n{}®;9©Ù~ Bj÷ŸhXŸ`Œ?!Õ§þ?ƒ;¢ãa¾xÿþb@/‚ÚüŸiÒ!ÿ…dÈ¢ú?îß{»>çlƒ'Šç?¯;ÅQE—íÿ¼þÐQ© 'ý?¸àåUI—°)HœØåúüºÖoû/¡-ëÛÖŸ—ÿ|øÎç€sÀ9p 8ºº·qý§=ïÇêýO—ÜÕ’ö³pö×ÚþŸáX½ÿÏx~Íâö/®ÿ´ý‡œ¼ÿg<7cû%ðòïA”4«eA_  XˆÛÓ§‹ËMò1·è¨VdèÚŸ¾úŽEŒú¯CŒ¼wt×o,úþÁòûúøø[Àƒþ‡0T 㫃þ¯0ê|ê6ÿDù—_ÚöàÝ»óßÎi'@ ãúDß ¯ñpD[S»~Xí €˜s6j ³ÓEÌ•h\?fœèê¿y‘ô0Ѩ\4€A¯€¾Ë3‰X3Ä¥ÍߨÀ™tßPUý‡Ÿnw}3 `1¿ZÀæ_’¯Ëök'žÔ;Y®®unvüA->¯ ” Ùñ?f©,Dé§ €\Yq¾H­©ö¯â|¾*›ÿ4öG‘]Jy—“Š †Âøñòä2'3½ BüŠž”sêø ôôµêÿº!ÓOè‚4¬Ïè#''úÚ_–èÿA-û'ú¿!M@EŸbÒ¬ Öõ{ ¦Cÿ× ¤vû³—–JA-ëSÿÏAHhÚOAHíñ±i,ÐÔOAHÍúн 0©Ý¾àýø ?Ÿ®O¯Dÿ7é]Ƭ_ Kêñ¿“BÀjŸÀoïþ†od å?pбúý% öýùéô4ZXüþžâüî¯Hà[î¿d¦Ð¸¾¾N@5>¼·/^`Sɾ~‘Ðê_4ü-•éíw@YÊ?õÁhÐòÏÊúèþ/Ò÷¿ÿú:£¹>lè„+n£p«`°¹vÚÃÊ  Ä`upÑûxà ¶šŽO¢ ƒ}½¦’èeRQ°zr Ž?¢—€QŸAH“‚ßÓ5izid\Å1ãg+èÿ¢`ÖõÄ ¤6kB:¨ ¤IG´ÚŸ¥ ¤öõ ýßè=ôþÓÉlƒÚí+àvüðIHÌúE “®›ÿ‚Bšô2©Å‰=ÊÖø5 I¡àwýW€¿D ¥¿AHg|oø'|­bàsQ_è-PÓ›õ§®/!®¨û|*Ûgò¾h¯ßÎþ‚.õm:fðxýQ X˜ëÏË>|ç€sÀ9à8På ¤v}X$Àj¿Bj^@ ÔýÓØ£,<°ÚGe5ŒúÿJ0»ÿ8­AHmz4üÓÍÿ ¥AH­ñãëÚ7ôã›4 I´÷/8ü0‚˜É{Ó~l*Ç )ŸŽpÜõWòúC¯©NÑÿS€:€º$— J¨oÕ€€*½ú°Îç€sàÎ8 ÿkÚtü‡Wìzw(“×ͱE¦ÿK’w:èâZ:ÿåà \þaü¿w:àêû 9°}â àú0aFû]"‡‰ÔM¤+ºX0@߀ŽÓÈœäÕ„¹ªÿÕ_øs²¨é•xÑ×ÿ†ôoôÕìßù1÷þáÎ]hãú8Ë€* !›UŸYÍb˜Dûú È.% v¿;?ÿF ìþ_­OOƒ€y}Æ÷ç'!À°±‡÷7¦ò>¶ã磪û ”dÐ>… €ÕÙßâ±AÇ8TM:ãûŸA£>Dpu¢G½þþP|/³´Ï SûÇßàù4¯Ÿ'p"kïd}ØjpUÆ0wà ø3Ö?õ}ÆþÇ¡äÄ‘b1xù?cþI:11–¤Ü—4Ãæ¹7«IDAT€ ûϘ’‡’ G,`5v¯¦ÓåAHEÁ~& CA/ƒZô“W¨¸Š;ø]ý“œ…ÄlŸw®úú9©Y¿±¨ë‡, Bšàr|¤Óú!H°Eö<~Ò‹ ¤ÁD½¦Ó "j¢_Ó‹ ¤V}!e€Ùìuý© BjµIÒ¨·×‡þÏ$Ãñƒ AHõ‹ ¤&tó¿°h¯_!5ù—lsüUkü B:“ ¤öýCðQ3¾7õuâ–1Hð±èž÷ÅQM?>ÆóË?¼K®Ò‚NhS‹¸°Ð =ÇÇ‚Orñ‰¿Õó{ÛõCýúkÒ>~·U ·¸³˜èÎç€sàKãÀQpøWäžú·xöB——w äâðïÿ…¼«çÿ¢5ßá€@ŒLÎ(€|WÏÿø?””cÐÝóþ4±Fû™Ž¯ÈBV yýDOÞ:NSÿ€š8×í Çhè¥|aÕßNGì7*÷ø;`×êá€Î8 ¥kôû; Ðl_€1„RUû²ñ&<²ÚÜÀ¢ €áõÅ7„ó÷GyLLzL0 cû?â#Vý>@5þÂ`t}F(Ô…vÿ²þoÐa±:^#6fŠÑP]_3mi´O¹;üuü‘4€ØôžAÐ^¿l?ÓÒôF/ÚGÀ¹€ÊÉ*íoÀoTÍgø¦ý»ÁaL (QiQ 5Ÿáÿ™öoƒÃ˜PHÔ ÿÏ´"hR@IÀ;§î0©îàSëB¦—AH-ú ƒ¬Wj`Ô?‘ÅGŠM§þÏ ¤£ú¯Ö¶~mÖo,êþÇ4€"?ìp—ãz Bš|ØÓøI/‚FõŠ.1|ô+z„Ôª_!5èS„ÔjŸƒÇb éê0®/1àiŸ}üËñu-§„Ôæo°ŸXÄ($&ÿ„m$ €öúÙ©k_fnƒŸ‹úøT.?j:SÓé¾Õ_ÿ¤½‚~vÆ…QÇx 1"ÿP¥ ‰Ôó¯Y|ôã ~ú®Ð1¹øÒ¤RsÀ9àpÜ;` ·d¼U§è8ªãêð }¸ÿSɇâÏ|gnï V§Œú€€ïà}ÁwfBûÓ¹ê¥þ¯ ÛÏtþgÏQþmzúï?¨¿þÕ_ÿúÃÿ†(ýã,Åàpпd=y§þ‡+ا>›éê3·¶ÿÝ“o¿»Sû’¾´èïïGܿح>qü©‰Ä'çO#£îÚþ¼HÄÍ4Ü}}hÇ €Ø®¾(øsªÿÏVÌbÐ>ßÎ8“>_šÀù+¯Éb]¶îÀÑ"{»®ZÈ®¿äÀzóʲÄmÙõ—tßc^@¦ Ùõ—tßc^@*2pô_MÏNC !É <·) zBð†~ ¤Á@€†Nëqˆ@[?!BCýN€šÞ[dú)xX~3©ˆ‚ÙÐÅ@llz´õÿ•«}³„Ôº~„Ô ×AHÍþ ÀývÿS ’ÐŽOÄ 1Ûï-Úú˜â‚4¸~È8›!@?>9 ‰5þàb´÷·rÿtæ–1H¨`Wt¨ë‹òOõ?þ+ê—Á@®G® OW4Bª¯ß¬?uÿŠúù{Rß-î]Fô 8œÎçÀȉ€ê_üyáƒîôfƒ•šìCó)¸€þ0\~ýFüÒ®ÂØë(’ôã«€Ç_Ä`²Á®~Œ€€Ü&} ÿ#‚W}%›ì僶ýs”-ÿ` NLaÛJ¿¦h°ý¶ý¡ôk:@z( µ< .Qÿ—ü¢=!U ¥Ÿœ¼”}q¿§ (ø-=!´ÿî6ý qãú@ѾBŠ8BÚù€ ú³! j[?´›n|ÈCýŒXtppŸÁïˬ_!5èuRûú‚F éƒdÔÿ™Ä ÔÇi!%ðÞì¿^/ghù'íž«£¿Õ$©APd!1ÇŸ³ší·@3£¹ÉŸcÄz꾜úÒòjEeûñx€¢Ðu@JqAZmõüê.ÖœÈõÛo2t €/P0õ!9œÎçÀýràˆY‘Ïû ñÈŽù†í\úÐ3  D€ Òê1ß–ØÆD f”(°@|3=æwÿíc7r à¢}§;üùàü0€]æGR²e}1»¥ôÍÍ7ƒnZŸY» ,ø”Ò·à·Ç»#Mÿ'¦H’P$9 dÔô’ûO2ê$U?òN ˆÉabb¼zY*ð° †‰rAAHã}K— ¤… @Kƒú9i°0èêkÒä"PÓË,$ê‚PЩà#)5L! ;Ø  £#mý)!;Ø]ýYBd‡º¡ €€–> Bª;àUý:©Õ¾ Ðõ?º ͬö¥kÐõ/!5úG+7ͳtõñX$ ¥1HŒö ä,$æøÛ4€íýOAH»û/“»ŠA‚ÏEÿH­ ¿_ÓCÏlPÒ@|Õ¹E D ëç׺úÍ·„N/¡-YHIy€û•!½uç€sÀ9àx„8‚‚-^ÿP÷a^©Ç|ãæùZ¤(+Hv€oŒ À<€BfÛÑc¾1.\¸[Ì‘[ƒѾÓ?þ||‚ùÑd€†XÏ/jþüÜSlêôüCÀnKõ0·íÀÝ€j>–¨úªÿK£ ˜DõÇI¨úªÿóLTo¡úÂd¥ö?ØÿG ´ƒÍôµXdýÿäYÅn@ÔœHG„?!Ü ‹÷À«˜õ ƒžƒÚíGpbpý2 IÛ?Ù¡gRÚóX윇=Ä6¯!;ØF} Lb7h» ”7qt}Až2Pö¡GsR»ÿ„tØ¿ŒÆ¯AHÇã“ÿQ Bj÷_£dÿž¿ BZ5ÿ{ •…d0~É8ìÚ£ïÆÏqÕ1HDÁO×(à5=›è׋ú¶ @9¿Ôï_H&¨çÇm×ÿÚÊ ×Ç’±—Ò#”Ù¼ËÎç€sÀ9àØ›GðÖ(È@ ÃñÝœH>Ä€<´c¾ó‡ß¿ìúK Žù6€ùmW2p§Àé&@âü9°ç#‡wçûߦlçWáÀ=¸Ú§nÆ<%Õƒ¸®‰=dÛO}~5*¿òr>¯°'åD^E‡]?Ỏv¿{‘ˆð5€BÿºÌ3N: ƒª‰OÑ2`ÔgÒQý““„Ôn¿Ôÿ­ëÃ/|£¯-ÀÛã7÷ñwü¶ÍLøAD‰ dÑ¡K VjïAÁoé¢yJÒ.Ï|húxFtÕ]#P·¯ÙÿbR*ÀÝõcÒQÿb ’=!Ý6¾Ù 1Hý)FõcÒ½BjÜZ„ süh7zØô ¢÷ׇúßÄ Á¥ þF›bªéìY õ³õ@4æY^ÕóK’dx@u}k ¨æWå‘£ßVúöõ Ìöõgo Êp8œÎçÀ#äÀƒÄh³ˆó¿w¹©èô~Øù“yrÏG ›î5þhë+ ÃwšªîãK¥xf¤€/ a*Dxˆ¡+…§–𛉸H¦øŸC‡% @²ÿ§þu¥Q¤,)Êÿ€ž\Lºf!Á¤kÒ1=c£þ®^{-š®( v;ºžÓcó@íKåϺ¾ÐÃ{M¯ƒÚíÇ#ÿ@ pýÛêË`×W&XýCü¿YB:ˆ!hŽŸ€>èã ùîoüFCçÄ)†µgêÕ'åÒ)Ÿ¡ŒÔgùI,$ÿ_ÐÇ›šü/¬=NëùÑ·XŸ‘úƒ/í·þ,`—ñç4[’d[xZÖOt1èé õã >+œ¤y®Q§mòîúÇ|àA0Š>‡‡­ÿÅYg°ÍO}_²B'P<€€>à,×!êû’[¤ŠÀœå6?õ}‰ü«`Åà¡I8 o4¥ÎCþåÑE.ò°·ãwú!ñg¤çcdºÕ@ñ|ÑÕLr8ï‰(ž?.?š@êùw[ÿPMGÊ¢í‡uæ®ëÏ#”Ù¼ËÎç€sÀ9àØ›Gë|þa ¾ÿPÿaÀ€î5&÷‚@ôý‡ú F„‚Ï`´è¥m°Æ@ FœpDkP´oû¸‹ñÝéÎ#H¤Ø˜ÒóQo‘ë3±ËøCš­à Ð×ÏtɰCûXøíùEðhuôOpKP‚*ú@4`ø¿ÿŸ›þÄ„€X†p…î_rLÄ„€@,!„ûÇE°é¯ CB@ ¸2…Wrò¬€ØyÊÿ+ô¾{Užôúk–Qö@vú Oý—È[ÁÎÏ¿5?Ëçç¶úÁ@6Øøøùu[ûáùoiÏõgo Êp8œÎçÀ#äÀÃÄ€¶P[HÎf•»Ó?ÍâÏGá#æòjU‰[þMÔk4w‚@mea¨ÏñÓP2YpnÿûÿØ ’ytû?íÿ‹æ®üÕÞžÏÔöE÷W€h$`Ièü¢õKÖ?¢êÀ„<šCç­_²þ P/&àQ[óˆ‡ñ3 BQþÛt ?Ƀƒ·'äjL=üøþEõµŽPäaO_°Çïõ`>“?¦‚_>í¿çv»ý:€+ÙøÇ´ýŸºy.·=¿“ðEX*e?×ïè{®?Pfó.;œÎç€s`o]#R}þép O~zåË æ¼†ùìöÿðù§Àf‰WZós"qà ûnôù§^ÎàûïÄËÛ§¶`hßéÎ>öŸ&PÌ/äÝ’(ÜPÒ›M8Ñð=ä|öLíÈÀõz¾&ëk‹lΉÀdè0PRØïC !Îý-Dß—í~^ƒú!Zˆ¾/ÛýDx äŽÂŒ Š[@ĹÌSþ_¦÷—¿Kÿ²v*Ýøœ^pàøcïðççC#?VEdÂÄ^æÏmtu(P^5ÀÇÏ/L\¸Š7¡¸ (4hÔïé{®?{KPÞ€sÀ9àp8!Žàï/>ÿø×MËzBÎ/éû/>ÿPýiùO@OÈù³üýÅçŸÆ¶°ü' 'Ô`Áö_?;ïœÃ<€îüñç£ÈvœÐÔ/Æà3WοÖ·¤# ¿ ¿-´à ñÔgiüÿc€ÔfãÿÃ(]÷û©ñóCùIÏé~?5~~(?é9ÝBñ)ª ^%D€œ‡ý¿L7.¿[ÿ*Õ>º”yêû/Tã÷ú¾$þôú=¶Ø‹ç_º¸d Äøøù¥éAêbÍÏò¾çúóe6ï²sÀ9àp8öæÀÑ|ú©ùÓëÒ7vô` PÀ'ÛŠ<5zýóßü´À7 XáÄb±<›‰æO¯Äà· ,˜8ìŒí\´ïtç?d‡ùa*ðEý}èø:•p}àüÒ;kÞâËÛhÃFw%°‹@G4¹úRå)ÿoÓûîíÔ?C?-Ççt)òÌéü1übüûÒÍIY´Ûü›S³ŸógŽCþÁ¹á;hFTÌ_ƒ~ËzpÛú³·å 8œÎç€sàr14 7þ"·¸à"—~’³!9±¨ .‚qé'ÉÜÿÓ,r .¸p ÐOrÖ‹sÀ9ð¸9°u}(Öeµ~4fŤ·–ƾþ<î§Ã{ï¸gl“Oö[¡Ìæ]v8œÎçÀÞ@•~¸øßàOpiB.æf¶-Qú‡ ¦}!—&äb`nfÛ¥q¸ÖøÓ\š‹¹o®¯o®n6Ö  àBNwþøóñYÏÕëëCZ?Äéÿýþ‹õ£ÐöÅéŸB%pïëÏtþšå\ÞÁ@>ñ€Gì©Ó?þ||ÞóãþÖŸ½%(oÀ9àp8œGªÿK ®h N£ÀÇWôIÁ-$7N£ ·èÿ’‚+Z€Ó(ÈÆ} /:/ 9àtç?Ÿùü €6÷u±(Ö‡´~ˆúO÷Îê´~$@ÕúòWÀ½¯?0ÿר…|ã±|¤ã†ÉéÎ>>ïùA€F‹>õúóe6ï²sÀ9àp8öæÀÑ´¡©¿ŠôÀ}ÿ€<ß4õW•ɸ¸ïàæÓ’¦þªò#÷ý ,$À—Ø4/øËéÎ>>óù‰/f*‚Ô냮ºû䀈˔ÔKÕÐkàÞן)†.å?ù éœÓ?õÃàÏÇç1?‚ÁÎk.?|²çú³·å 8œÎç€sàrÿ¡r«_4)TÌi .²ÿÏ­~Ñü¥0ú6-Ä@öÿ¹Õ/š¿I @wè©QaÜo§;üù°9ð¹Ì Z¡q}àúQªÿX ëGÈéÕÆ÷*¬î}ý™rìÂþˆ žÓÇpþøóñ9ÌeÔPEA€,Ÿì¹þ9  ~@dñBýG~«ˆÚ!TÿñŽíÿb}ÀC¬?¯ÏŸ}ݲçõ39'ñNîüñç£æÀç4?¦×!Ô‚Gc¨;€˜î¹þì-AyÎç€sÀ9àx„@À°õX$ä¹ÕDŸ&»š…;¥à¹Cnî›·HÈ2rknî››JÌã­RFyÎéÎ>>ÉüÐ wHp7˜_4ÐátßiþE½@–‰ žy÷{ÿ Ð Æ(Õ,hª/pïëtü ÌTŽ(ý²¾9ý³áÏ“'O¾ýVo“ߟOû|ÎËl˜¨Ÿœ¿…÷}kºöSN`‰Úáú˜ œ¬ ¨%ƒx¦éî´þÍ©x3ÜC¼6éâ #xŸM·çg„Z£Ä3ŠßX£DãÂ\ ä(A÷¾üˆs¶ø±P0õ•ŽÞ…£Ò* ªÏï¹°éKAJ“[µÏÏž½ÃÍÓ33¶^_ëé©ûʨ§< —ؽý·Yå2¯_ßH«ýw¿ý–¾dÑ¡þ?ùö;E,:Âëïøú‰ VýŸþ4éï þ?Qâs°;¦éûéûïŸóïùðù¹¸ØÂøááú[ŸÙ¼Óó¾\V‹íÏ÷ˆ¿yýéë[@ùü+6ɾîtý<#À¸’Åcïõgo Êp8œÎçÀ#ä³Ül˜Jwƒ@^ˆÈ¥ï’[wÃØ^ þ¿b`‰í#y—PˆìCÿ_â.ÿø€#yç œæ!RøJÔ°X‚.çôR^ à=½`hXÐÕ/èlÖ¤günõó5Œþg"ÄP»ý,€ï~ýZß½þ4•¸U¿À-z)€®¿ŽL°è¥nÑKü.ã+ðAý$€ß¥}Œ- àw¬Ÿž‘ëcÇ<Øâˆµ@WÿôYvÖ¥@ûüŸÉ¤Õ©ËˆíüÌŸ ÈÌæ$¶ %\IäÿX°D”¡¬ÌÅú'(ÏåGh˰þÀt8—“¬@ØCü:®?J_œ-W›õjß%Q [zæÏ\“¾Ž@§M/€qûvÿdQÕ¥ÕìÿqZc—ÇvÿNO±þœ*`õï÷ß¹Òë8 zµ™ã[^#R¬êàý· èÇíü~7¬_6ÿã]²®_F}êÿ@´Fýçù—/thþß?}þüùÓçOÏÇÅÅùyXŒþQÿ/£iõ>ï‡ã_¬¦3‰à³˜ð»õù6Ç׬?]ÿ; é³>m›_Íõo¦j@²yà›{®?Pfó.;œÎç€s`o!ð¿þ“Dû‡" ”iÂ?FþÓ8€t ˆmþ…@sÿiÀ º¿Dh@´_AD² & À{z-€Ûô¼gÓ º~nŸGÛ®oÓkܪ_ à½À z%€›ý+p‹^ à½À-z´ü[@9 {pVýhëøˆÿQ7è•nÖ/p‹^îÀ™õ |п$€wôÆwççKôfõ|ÿ|žžRÉý‡¼<;íé°Ëó?ŸG@&JrÒ¸ £"þÿ[ çÿ½¯?¥þðãåtÉþC€ €®?˜/`Ó°\Ì ôô´>È&ÿ€ž“>ǪúA5l»þ‹7/^èuz:Y¼^®QPE5êLjú¿EÇò#€ F}¨ÿW¿ÿ.þ[&½Z¬þ/¯ P½´Ç÷Û»¼Æõ±ÿOº:Xí_üÑøW¬?VýŸXþô'±èéн¹þüS!ÑýbÓ©ü?}ŽEè)ô£þWÀ  o_ôÿ˜ã¿únÿû:gÒ—f1oñ–çÛn¿YºúŒöy6Ÿ o¿YŸv¸>nH… $‹‡Xì³þì-AyÎç€sÀ9àx„8â–?Õ}‰øt€¢˜0#àR¹åOu_"þ#`ÈÈrÈ-ªûñéC@žC¦“†B‰¸6.Ñ|£ÀY)€÷ô$<Š> 'ܤ¸]? à½Ú3è•nÐ+Ü W¸APÊ Ü_)€ôJ·ê—øˆÿñ.YôRïéµ>ºÿQïéµÞÓkÜh¿Ú3Ç_àvÿ²ÞÑEm :’]ÿE¿ÓÑ¡øS‘Vý?åý·€’nZ”ó¯èŸyý¨¿}÷O±þ”æÜ?þëÇ%*ðGéNp¹¼¼¼,€ŠǸM~Q`jº˜>‘ÈƒŽ³§§ÂJhÒ/ßüçÍÁ'Œú+±ª’W¿Ôþ!b PX¤ùû(ò¼k`ÐÎÏáý+-Š ƒ7Óêææ zÙ}‹@öð‘QþàóϾ‹ß>€Ë=WŒÙC¬?p åu°àø `€ž8³ &î]ýiÕ|./fû¬?ÿC00®?M?¿'ùþg»õúcöï˜.ÇÒQƒ~ŠÖÿˆ¿S~ào~½X^ý“¼A™ƒ¾Šë9dЫõ§§? áÿ&9°ùŸceîOlúÿ è}ìéõúcÔì1] sØÐ >*-µ§ 0½‘bÖöG? úÿö-4ÿ÷Ðÿùn]ŸK€ØýËëOGoÖŸŽ.@¶èèÍú´–q† ”ê,û®?{KPÞ€sÀ9àp8!0Ž&ÿcè0qìÅGqࡤûÓäáuÀ)¤äáuàNeô7ÿ½ ¸*(rÉlp¹LxO¯pƒ^íÀÙõ³nÑK¼§×;pfû…nÐ+Ü W¸A¯pƒ^ àÝJþ×ø€)È™M‡n“MÏxO·€²*{WÕó3Uøðùö¯Þ3êWxO¯ðž^›àÚýk€büÐý à‡¯AÁ/è…í?`åݵo+¥«_‡ñLAaÀ#›²j˜.ŽúY".'d”d 'úÊ¢Gà÷¿þTû‡——b ‘ïÃó“€ ‚@OŸ^1€›îo[õcº"F}œ-€öúÓ«Ëw/ Ÿ¿»|e֯׻ýãÍæxØ?Z ½à ¿bÔ?ûõâ×_—¿N3ºþÑ)!}µ ´õãú#^Hôèép¸ùnúîFMìñ]1äˆÿ8Ÿ×»~t°ÚHj`Ô—Íÿh`Ðápþ&ôô?O±¾>ן¤ÿ[õat5ýå‡ÿû6ÖýÁî?€é-Þ××¼>ãþ•@sÿšõ§»~ ½ÿÍúdß“?èsk µÅkqÏõçÊlÞeç€sÀ9àpìÍ#UôCNݨõ " €*úTÿÅ@µ~AôP}‚b Z?ýBXZˆ2KÀ£‚‘é0Á-ðž^ à½Ú3è•nµ_ à=ݲ¬¤_Àö+Ü W¸A¯pƒ^ à=½À{z-€Ûü˸I§ÈJo´]? à=½Àú•nÐ+ܾ~0{z½gÔ¯pëþ”¸uKÜûÇíZ`£ ›m=!`ctM €âùÝü ,êúצñfö {ýÓ|ÉWŠÏ`¯ ¿¼ ?Ïf±þêëW'…4* . @†=}bð5 ê‹r,»ÿ%Û—åçÑÀhÿµlýÀÁÍ{zk  ZÕ>B¢méìŸ^ ~h´?M. h_\Rààô¶ßé@/6}ÿ±þ ©¼šôàÚÄ´øá¥#&½Xìú4AÞ?€8ŸöóQVûOŸ>½€ý4÷G.N ©¯õ'êÿ`¢ÑþÕ$@´èîÿÛ·ÿ<úï·oG÷á%pk4Ȅ͟ðp[ôfýéê€4þf}Úáúi†¶½“ Š=ן½%(oÀ9àp8œG” %ª·üw^Þ$€-/ÕþU°T€ïÀWUûW _q¾H"!c & àª`ૉ¾8+ðž^ ཌ5¤²}v; àFýJïé–@Ó~!€[ý/p‹^ à½À z%€÷ôZïéµnõ¯À-úúl…:}RìúY7é…nÐ €šÿ¥n__EH à=½Þ3êW¸uJÜ W&¸VÿG‹Åä”(Ϫþ#P@Wß þ˜@÷ü&»k¿Iä™éj0—)Õçd ;þÇ,•ÀC¬?%ðòïÚIÍC®ãôbˆ€(°=}º¸ÜdsƒŽjE€®ýé«ïXÔ Àhÿuˆ‘÷N€®ýÆ ¿>,¿¯¯±<è?Hè`Œï_`ôŸëÿ{(ÐÕå_~hép@z÷îü·sÚ ÐÀä/}†÷žgyý±ë€Õ¾¬?×à yýÚÀ¾ÿ1W¢qý˜P€®þ›IÿúÁIcôèû·<ƒÚê˜!.mþ–ëO×~³þtt+ `9¿ZÀæ_XBªþåÚPET w]¡Ìæ]v8œÎçÀÞ8JÿSïñ ¢^œ‹A%€ôJ7èÕœU¿À z%€÷tà ð,|·À­ë—¸Eý©Àú•ÞÓk¼£7¸Õ?‚nÐ!£À®ßÍøtNp£~oÐÖ‡np£~%€÷ôzΨ_ à½Àíñg\‹Þåø üSÿ Z”tØtÿ—³”t èù—V²Ðé „Ï³O}{ÂŽÿ‡›ðh À*XÐÈ?Y ú˜pÿ vÜwÉÀ«¸üTFŸ\Á)¡c©þK З¨þ¸júW_ý™åZ€Ò¨9¿û…~ §¯^ ,åŒ6ê¿}{s ŒåF}À‹Ô‡éøêt}z%ú¿IëÜg³~±t®?,¨ÇÿN —!«}®?¿½û¾‘€Ž¿W§§û Õúcöúéô4ZXüÁúóžëâüÛõqåçs@—Ìtƒþéús}}€ê»xo_¼´Üj¿HBbßÿÒÀŸ ôÌ;º¿Pö¯YºþY@Y¿YŸ†ü5øWs£í}´@ºÛú³·å 8œÎç€sàrð¢“l܇•qD HˆW¦êB’èxˆ#úHÈëµøÞ3B5~Ã!Žè@Y£ ˜𼃘‚ȸAGæ,€›ôbΠW¸U¿À{úÈ õ¿ÀÍþ¸E/p³~!€ôJ7è•ÞÑÜæoÀ{:â>®qÀ®Ÿp“^àƒû›ð= à½À{z½gµ_ à½d‡*Á,Mp­öm €PŸÆóTÿON¨D~ á·§-š4A/û§UY”vàÔäÿnøC¬?bnÌòJR¸g(ÜŸH_bý @V€úË¿_\F)ï€"DYlß´HtÕÿK izùËÏ?ÿ¢}ìÛñ Ê }µèÓñ¹Ä{~lÖçZÎùYÍõßýú¿cþLiŒ¿Úñ!çùypH;À?AÊùcüìWTí×ë} é£¼}ÍDf} Cú7ûþß €tÿ/4Àß›7µ@¤cý‘„˜jg]ÿªÈBbЃRcᑟOøg­–j`¶o[„úyý±ë-Býf}Ìk~F‡ˆD ½Wùû¬?Pfó.;œÎç€s`o dyHÐ÷û‡’ G*‹àæÿtø—t8”\€8ba@†ý§Ã¿¤À¡äÄ Ó F!€‹!i€2½À-z)€[tˆFÀÔ~%€›õ ¼§×;pFýJ7Û/p‹^ àöø2`Ð{ á/Ò)'¼«ßàöõ i?"¨Ùõ ©_ àöýÉøàþ×uû•Þׯwà¬öKܺÿ¥nÐ+ÜAÿ“ÛÑ!‚ó@p(ÇòpÀ_ÏÿaÀ-€¶|x6šN‹vOèÛp |þM €‡X¢‚^,?ªþ%ž‘ C˜4ƒ.Ö З¨¶>–Ÿè)aÔÿê¯ ü9Ytõ3ƒûúßø¾&HÖÏÐÿócîýÜ»Ðæø@lújyÅ%{Ëø€„dVûkqnÐ0‰öõA,ªñÃîÿÝùù7j`׿ZŸž$óú @ŽûÿÖŸ`Ø?lñû#ÇwQ[Ô÷·*:ÖŸP’@û|¤Õ±¯xÐä p` ÿ¼­÷gü|3E©¬?áÙߟ°þ`HëÓ˜ÿÝ󌰕ÔO±þì-AyÎç€sÀ9àx„8R5Ÿ±¸)ÓSØI%  D÷ÖðÿLû·ÁaL (Q%jÀ™„ÿgÚ¿5cR@‰H!™s—xTpJº„¸A¯p³¾íWø ~’À{z½gÔ¯p»ý,€[ôRô/ à½À‡ã xO¯p³~!€›×/p³~!€ù¯¸I/p»~À º äç£Þ³Ç/‰¸¥XôR·è¥ nO×$yZ¬öÑ:7ÿåÏ ç<ÜP‚2ÆGàûe|‰sR¾:Hg?¾ô…P`?à!ÖŸ3¬\~’‚Âñ§œb\çVµ’éÉ{ R0«úÔÿœ’  ð?_?-?ƒþm£#öU?ü°®b0ŒûáÇ{l×'¾ðVb‘˜tÆí ¥2˜…6Ðÿydµ$¹€E/H‹$qoš~ “S è@#>bÕïcT÷¿XÆýK€Ù¿¬ÿ×Gp–Õñêx1 DÒׯ׳}¬;Ðý寣çõçÙ3¬?[è²>ùßÍ¿r‚† €Ú²i±ÿúóe6ï²sÀ9àp8öæ@°] È-Ú@Ì È(»b »þ’`â{Ì È4€b »þ’‘˜r^@¦Ì;ü•. Óø”…ÞÓkÜ®Ÿwà,z)€Ûõ³€ÝÓ븞^ àvûq&GɯÆ_à£þEܤøx|*€÷ôZ·ê—¸E—4ða΢—ø¸*€›ôB·è¥nÐûÕóWïÀ ú—p“^à½4ÁíéPõO”±ÿ§ž×Õy¸¹Ã¶ÂsÐÑ Ð`–/QéïæŸùü ËàSYÜïús®IóýT€ÂøƒÏQþÅD]×§‚ž¤&Ì;Ò¿úë_øßÅý.õóí &ÜåõñPÄ‚ÃAÿt{x<þ€;[ÿŸ<‰yH¿{òíwwj¿\îÞ¿ØíþÁŸšHÜýúûßëþÎCpVÒà¥eôÏÚñà ÞÂn|aý¡ן=®O;ðgÙOÀ×d±,Þ×io Êp8œÎçÀ#äÀQØö‡Ò¯ ¹¬+ ö?”~ÍHoÅôcØö‡Ò¯9é  X@øHûÍP àq”¤@¯ð=‰&½Ø3é…~§ö ¶¯_ àƒö“¾Ïõ)€ïSŸÃèê7ø'o¿àyýD/bDõó±íþWøîý¯wàv¯_Ш_™àötÛ ?Ùd äOô±=E@lñuí\>‚¿ÁGÀäúûY<Äúc)ðçÁ€ãwº$Uypþ|ûm@ ÿ‹x~ÄEåS=Ÿ!Þc€´=ëõggþ1¸þtõ›õi‡ömO¬ì!ì¹þut €ÒúÌÓÙ= j@³ÿú³·å 8œÎç€sàràHìèD”WýŸ–uY(G~ouj…ª¯ú?ÏdP…Äc†¢ùË¡jÿ"fzjPU€ÄŽÏéΟ/ÿùhLpïðü@1¨ùó—ybÀr~ ²|Äü“ :ÍaÜ“g0‚…p©Äï{Eá~ˆõGÌ›(åçŒ+øãtçÏÁ?­ÞÎÛè·Í¯f}êæß¸}!Gú’VÿëÏ#”Ù¼ËÎç€sÀ9àØ›G­b~Ÿ‡@¸˜Ó‰ó§Øn6¤ÇÄŸUјà–ϼ#›ðÖÓC·E¢«_˜Øèë[ÀGòoºÁg³>ŽCN Hàf ‰ôä ~F)'ò*½ÌP?O³ûXoÚ6UÁ¯’2°¸Ó?ÿ|4ëO7?šIÕÏŸ ¨÷ËüjÖ§]ÚWd.EõýÖŸ½%(oÀ9àp8œ6ˆsÅÂaŒ¦Ç”ù‘¾f'F€:•öõX)<µÔØÌHÀÈ(Çk¡h¢Þ¡‚/í;Ýù3@éù°€füE–/S%]l1€ªÛÓ-àãùÛëééú«7HÄ=ÇËÊâü<ÍùŠåYȈW¦dáçp–Àý¯?¢-´ uŠ0~§;þùh€v~´@Ko,DgïçWZŸ:ú¸ýç²B 5‰€Ê'{­?Pfó.;œÎç€s`oMù‡Í;*<Ãp€|Ÿò?š4 _¡ÿ3- BþáG3 "€&ä+ô¦\nÉ3Îö¾ÅÂùs0χ4ó£JzÈÃ0€ x~L€]ž¯³j N]P_•þÆ€¾Bá|0ÐâE‰çbýã Qd¿Ó?ÿ|4ëO7?½£‡õ'à!@1¿šõi‡öã -{ ÕE>ÙsýÙ[‚òœÎç€sÀ9ð9pDú>zìÅ °„ €|ÀYnóSß—Èÿ0P<€€>à,·ù©ïKä$T<€€>à,óŽw¸Ù¾Ó?£‡ô|XÀ.ãOy¸e“-d(æ—™`‡ù7?›a»>"Œ8ó#~à^\(-Àáaëq}Ô@ÌŒî{ýmÁR@îü9øçÃÊùa%=­?„,º¾ÈüjÖ'ÍPÐÇí3O¿]" ˆ|¢ä]ןG(³y—Îç€sÀ9°7` áþåOÔ†øƒÿ¯ŒÂýK€I†„€@°ÓÂýK€I†„€@ áoòϬ[\x}§o±pþ|1ÏG³A®;ì;Üßœ‡[òtõM €Ú?# €”Ô¾mM4J(\þ»±þˆ½p£€„<ä²¾8ÝùãÏGm ÓÍËD?¬OyþÌgÑÀž_B—õi‡ö±HñÛ©.¼þžëÏÞ”7àp8œÎGÈ#±£ƒÎ/0¥qõ`BáUìýå‹Ú¾èþŠÀÈGsèü¢õKÖ?¢êÀ4<:Cû[bH §vÀÉçÏa<Ü¡Î%øð÷ÿ6:¢lk°5F@Qߌ°Ëó±ÿRûqîC¹ÿý¸ ™=_·ÿÓþ¿ ‡jðëO£ d$ðÇéh4笿‡ð|ÔËËl¦>úº>ðø6z›E¡­?5ëSG7cÈõC*RñöoÏõçÊlÞeç€sÀ9àpìͱ}_àôl  h€Zˆ¾/ÛýDx ¢€èû²ÝO™žúA^!âo6 I X”xŽQîüñçƒqöcÉs¢œ·Ñ%  v}Nnâ6ý¶ù)õ5khš³"€k²Ð¶HÄP±˜ €““@ºïõ'îð[ H¹ƒéô @êvh?_4L¿˜·ÑM š_ PšÊ],‚γgçR¸þTû¬?{KPÞ€sÀ9àp8!@õÿ ØHŸôœêÿÔøù¡ü¤çt¿_u}ˆûÅ'Ýá»áÖ_¬쇋sNwþøó!ó#éÿåœ(Žo£G»šs÷=¿8£ÿÿ ! ÿ  ô{^&ì`>;gÀZá9M\âtçÏÁ?‚ßÌÛè°e~1F€ÌÉrþµ™S&ù6üþµP²€‘{­?Pfó.;œÎç€s`oðâp8î‡TF-o£}ÊÞ´@R@ÂEœ^$Ο  Ðóa*øÅøo£·óUæTÉ?KÁÿHzÐ÷¿N%œø˜5â¶õgo Êp8œÎçÀ#äÀÿ<Ê.$;D…ÊIEND®B`‚angband-v3.3.2/lib/xtra/sound/0000755000175000017500000000000011651552410015463 5ustar chriscchriscangband-v3.3.2/lib/xtra/sound/Makefile0000644000175000017500000000047711651552410017133 0ustar chriscchriscMKPATH=../../../mk/ include $(MKPATH)buildsys.mk LIBDATA = sound.cfg breath.wav clunk.wav death.wav destroy.wav drop.wav eat.wav \ flee.wav hallu.wav hit.wav hit1.wav kill.wav kill1.wav level.wav \ miss.wav miss1.wav money.wav opendoor.wav shutdoor.wav thump.wav \ vomit.wav PACKAGE = xtra/sound angband-v3.3.2/lib/xtra/sound/sound.cfg0000644000175000017500000001501311651552410017274 0ustar chriscchrisc# sound.cfg # # Configuration file for the Angband sound events # # The format is: # = # # Example: # hit = hit.wav hit1.wav # [Sound] # # Ambient sounds # # Town during the day. ambient_day = # Town during the night. ambient_nite = # Dungeon levels 1-20 (50'-1000') ambient_dng1 = # Dungeon levels 21-40 (1050'-2000') ambient_dng2 = # Dungeon levels 41-60 (2050'-3000') ambient_dng3 = # Dungeon levels 61-80 (3050'-4000') ambient_dng4 = # Dungeon levels 81 and beyond (4050'-) ambient_dng5 = # # Store sounds # # The shopkeep bought a worthless item. store1 = money.wav # The shopkeep paid too much for an item. store2 = money.wav # The shopkeep got away with a good bargain. store3 = money.wav # The shopkeep got away with a great bargain. store4 = money.wav # You make a normal transaction (buying or selling). store5 = money.wav # You enter a store. store_enter = # You enter your home. store_home = # You leave a store. store_leave = # # Player sounds - combat # # You succeed in a melee attack against a monster. hit = hit.wav drop.wav hit1.wav # It was a good hit! hit_good = # It was a great hit! hit_great = # It was a superb hit! hit_superb = # It was a *GREAT* hit! hit_hi_great = # It was a *SUPERB* hit! hit_hi_superb = # You miss a melee attack against a monster. miss = miss.wav miss1.wav # You fire a missile. shoot = # You hit something with a missile. shoot_hit = # You receive a hitpoint warning. hitpoint_warn = # You die. death = death.wav # # Player sounds - status changes # # You become blind. blind = # You become confused. confused = # You become poisoned. poisoned = # You become afraid. afraid = # You become paralyzed. paralyzed = # You feel drugged (chaos effects). drugged = # You become slower. slow = # You become stunned. stun = # You suffer a cut. cut = # A stat is drained drain_stat = # You recover from a condition (blind, confused, etc.) recover = # You become faster. speed = # You attain a mystic shield. shield = # You become blessed. blessed = # You feel heroic. hero = # You become berserk. berserk = # You become bold. bold = # You feel protected from evil. prot_evil = # You feel invulnerable. (does any item/spell do this anymore?) invuln = # You can see invisible things. see_invis = # You can see the infrared spectrum infrared = # You become resistant to acid. res_acid = # You become resistant to electricity. res_elec = # You become resistant to fire. res_fire = # You become resistant to cold. res_cold = # You become resistant to poison. res_pois = # You become hungry. hungry = # # Player sounds - misc. # # You pick up money worth less than 200 au. money1 = # You pick up money worth between 200 and 600 au. money2 = # You pick up money worth 600 au or more. money3 = # You (or a monster) drop something on the ground. drop = clunk.wav # You gain (or regain) a level. level = level.wav # You successfully study a spell or prayer. study = # You teleport or phase door. teleport = # You quaff a potion. quaff = # You zap a rod. zap_rod = # You take a step. (unimplemented) walk = # You teleport someone else away. tpother = # You bump into a wall or door. hitwall = # You eat something. eat = eat.wav # You successfully dig through something. dig = thump.wav # You open a door. opendoor = opendoor.wav # You shut a door. shutdoor = shutdoor.wav # You teleport from a level (including via recall). tplevel = teleport.wav # Default "bell" sound for system messages. bell = # You try to open something that's not a door. nothing_to_open = # You fail to pick a lock. lockpick_fail = # You pick a lock. lockpick = # You disarm a trap. disarm = # You go up stairs. stairs_up = # You go down stairs. stairs_down = # You activate an artifact. act_artifact = # You use a staff. use_staff = # An object is destroyed. destroy = # You wield or take off something. wield = # You wield a cursed item. cursed = # You notice something (generic notice) notice = # You notice something about your equipment or inventory. pseudo_id = # You successfully cast a spell. cast_spell = # You successfully pray a prayer. pray_prayer = # # Monster Sounds - combat # # A monster flees in terror. flee = flee.wav # A monster is killed. kill = kill.wav destroy.wav kill1.wav # A unique is killed. kill_unique = # Morgoth, Lord of Darkness is killed. kill_king = # Attack - hit mon_hit = # Attack - touch mon_touch = # Attack - punch mon_punch = # Attack - kick mon_kick = # Attack - claw mon_claw = # Attack - bite mon_bite = # Attack - sting mon_sting = # Attack - butt mon_butt = # Attack - crush mon_crush = # Attack - engulf mon_engulf = # Attack - crawl mon_crawl = # Attack - drool mon_drool = # Attack - spit mon_spit = # Attack - gaze mon_gaze = # Attack - wail mon_wail = # Attack - release spores mon_spore = # Attack - beg for money mon_beg = # Attack - insult mon_insult = # Attack - moan mon_moan = # Attack - shriek mon_shriek = # Spell - create traps mon_create_trap = # Spell - cause fear mon_cast_fear = # Multiply (breed explosively) multiply = # # Summons # # Summon one or more monsters. summon_monster = # Summon angels. summon_angel = # Summon undead. summon_undead = # Summon animals. summon_animal = # Summon spiders. summon_spider = # Summon hounds. summon_hound = # Summon hydras. summon_hydra = # Summon demons. summon_demon = # Summon dragon. summon_dragon = # Summon greater undead. summon_gr_undead = # Summon greater dragons. summon_gr_dragon = # Summon greater demons. summon_gr_demon = # Summon Ringwraiths. summon_ringwraith = # Summon uniques. summon_unique = # # Breath weapons # # Breathe frost. breathe_frost = # Breathe electricity. breathe_elec = # Breathe acid. breathe_acid = # Breathe gas. breathe_gas = # Breathe fire. breathe_fire = # Breathe confusion. breathe_confusion = # Breathe disenchantment. breathe_disenchant = # Breathe chaos. breathe_chaos = # Breathe shards. breathe_shards = # Breathe sound. breathe_sound = # Breathe light. breathe_light = # Breathe darkness. breathe_dark = # Breathe nether. breathe_nether = # Breathe nexus. breathe_nexus = # Breathe time. breathe_time = # Breathe inertia. breathe_inertia = # Breathe gravity. breathe_gravity = # Breathe plasma. breathe_plasma = # Breathe force. breathe_force = # Breathe the elements (power dragon scale mail). breathe_elements = # # Identifying Items # # Identify a bad item (including bad ego items and artifacts). identify_bad = # Identify a good ego item. identify_ego = # Identify a good artifact. identify_art = angband-v3.3.2/lib/info/0000755000175000017500000000000011651552410014310 5ustar chriscchriscangband-v3.3.2/lib/info/Makefile0000644000175000017500000000012311651552410015744 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk LIBDATA = readme.txt PACKAGE = info angband-v3.3.2/lib/info/readme.txt0000644000175000017500000000056111651552410016310 0ustar chriscchrisclib/info ======== This directory is empty by default. It is for 'spoiler' files, which contain detailed information about the game. You can download these files from the internet, and place them in this directory to access them directly from the in-game help system. Be warned that if you are a new player, using spoilers may detract from your enjoyment of the game. angband-v3.3.2/lib/help/0000755000175000017500000000000011651552410014305 5ustar chriscchriscangband-v3.3.2/lib/help/help.hlp0000644000175000017500000000233611651552410015746 0ustar chriscchriscPlease choose one of the following online help files: (l) README for Angband 3.3 (330.txt) (a) General information (general.txt) (b) Creating a character (birth.txt) (c) Exploring the dungeon (dungeon.txt) (d) Attacking monsters (attack.txt) (e) Playing the game (playing.txt) (f) Command descriptions (command.txt) (g) Option descriptions (option.txt) (h) Customising the game (customize.txt) (i) Historic information (version.txt) (j) Spoiler menu (if any) (spoiler.hlp) (k) User menu (if any) (user.hlp) Browser/help commands: # go to line % go to file ? go to last file/main menu SPACE advance 1 page - back up 1 page / search for text RET advance 1 line = back up 1 line & show (highlight) some text + advance 1/2 page _ back up 1/2 page ! toggle case sentitivity ***** [a] general.txt ***** [b] birth.txt ***** [c] dungeon.txt ***** [d] attack.txt ***** [e] playing.txt ***** [f] command.txt ***** [g] option.txt ***** [h] customize.txt ***** [i] version.txt ***** [j] spoiler.hlp ***** [k] user.hlp ***** [l] 330.txt angband-v3.3.2/lib/help/general.txt0000644000175000017500000004350111651552410016466 0ustar chriscchrisc=== Using the Online Help === You can press Escape (ESC) at any time to leave the online help. You can press Space to advance one page, Plus (+) to advance one half page, or Return to advance one line. If you reach the end, you will jump back to the start. You can press Minus (-) to back up one half page, Underscore (_) to back up one page, or Equal (=) to back up one line. If you reach the start, you will stay there. Advancing by one page is the most efficient method. You can press Hash (#) [or Percent (%)] to go to a specific line [or file]. You can press Slash (/) [or Ampersand (&)] to search for [or highlight] a string. This is case-insensitive by default, but Pling (!) toggles it to case-sensitive. Use "#", "0", Return, "/", Return to restart a search from the top of the file. Please press Space to view the rest of this file... === General Information === Angband is basically a complex single player dungeon simulation. A player creates a character, choosing from a variety of races and classes, and then plays that character over a period of days, weeks, even months. The player will begin his adventure on the town level where he may acquire supplies, weapons, armor, and magical devices by buying from various shop owners. Then the player can descend into the Pits of Angband, where he will explore the many levels of the dungeon, gaining experience by killing fierce creatures, collecting powerful objects and valuable treasure, and returning to town occasionally to buy and sell supplies. Eventually, as the player grows more experienced, he may attempt to win the game by defeating Morgoth, the Lord of Darkness, who resides far below the surface. Note that Angband is a very complex game, and it may be difficult to grasp everything at first, especially if you have never played a "roguelike" game before. You should probably browse through all of the "online help files", especially this one, before beginning any serious adventuring... === About the game === Angband has been maintained by a succession of volunteers since it was written in the early 1990s. The current maintainer is Andi Sidwell. Angband will run on a wide variety of systems (including Unix, Macintosh, Windows). It is written in C, and the source code is freely available. Creating a version for a new platform involves writing as few as 100 lines of code and recompiling. See the Official Angband Home Page at http://rephial.org/ for up to date information about the latest version of Angband, including a complete list of recent modifications and a wiki about the game which includes a full user guide. You can post compliments, complaints, suggestions, bug reports, and patches at http://angband.oook.cz, or to the newsgroup 'rec.games.roguelike.angband'. You can also post interesting experiences and ask for help. This version of Angband is under the GNU General Public Licence (GPL) version 2. A copy of this licence is included with the game, in the file copying.txt. If you're interested in the development of the game, the public bug tracker and development road map are at http://trac.rephial.org. The basic help files supplied with this game are more or less up to date, but when in doubt, you should ask the newsgroup or the forum for confirmation. Note that spoiler files are not distributed with the source since they may spoil the game for new players (hence their name). If you want to use them, you can obtain them from various places as with the source and executables. Spoiler files may be placed into the "lib/info" directory, or into a user specified external directory, to allow access via the "online help" system. Remember to tell all your friends about how much you like Angband... === A quick demonstration === Angband is, as mentioned above, a very complex game, so you may want to try the following quick demonstration. The following instructions are for demonstration purposes only, and so they are intentionally boring. For this demo, we will assume that you have never played Angband before, that you have not requested any special "sub-windows", that you have not requested any special "graphics" modes, that you have a "numeric keypad" on your computer, and that you are using the default options, including, in particular, the "original" command set. If any of these assumptions are incorrect, you will need to keep in mind that this demo may not work. There are many ways to view this file while playing, in particular, you should be able to view it using the "online help" built into the game. Any time you see the "-more-" prompt, read the message and press space. This takes precedence over any other instructions. At any other prompt, for example, if you accidentally hit a key, you can normally "cancel" the action in progress by pressing escape. When the game starts up, depending on what platform you are using, you may be taken directly to the character creation screen, or you may have to ask to create a new character by using the File menu. In either case, you will be shown the character information screen, and you will be given a series of choices. For this demo, press "a" four times to select a "female human warrior" character with the point-based stat allocation system. You will now be presented with a description of your character. Look over the description briefly, there is a lot of information here, and most of it will not make any sense. Press enter three times and your character will be placed into the "town". You should now be looking at the basic dungeon interaction screen. To the left is some information about your character. To the right is an overhead view of the town. Nothing happens in Angband while the game is waiting for you to specify a command, so take a good look at the town. You will see a variety of symbols on the screen. Each symbol normally represents a terrain feature, an object, or a monster. The "@" symbol is special, it represents your character. You can use the "/" command to find out what a given symbol represents. Press "/" then "@" now to verify the meaning of the "@" symbol. The solid blocks (which may be "#" symbols on some systems) around the edge of the town represent the walls that surround the the town. You cannot leave the town above ground, although some games derived from Angband (called "variants") have an overground element. The large rectangles represent stores. The "numeric" symbols represent an "entrance" to a store. The "." symbols represent the "floor". It is currently daytime, so most of the town should consist of stores and illuminated floor grids. Any "alphabetic" symbols always represent monsters, where the word "monsters" specifies a wide variety of entities, including people, animals, plants, etc. Only a few "races" of monsters normally appear in town, and most of them are harmless (avoid any mercenaries or veterans if you see them). The most common "monsters" in town are small animals (cats and dogs) and townspeople (merchants, mercenaries, miscreants, etc). Now use the "l" command to "look" around. This will cause the cursor to be moved onto each "interesting" square, one at a time, giving you a description of that square. The cursor always starts on the square containing your character. In this case, you will see a message telling you that your character is standing on a staircase. Keep pressing space until the prompt goes away. Now press "i", to display your character's "inventory". New characters start out with some objects to help them survive (though there is an option to start with more money instead). Your character will have some food, a potion, some torches, and a scroll. Press "e" to see what you are wearing. You will find you are wearing armour on your body, wielding a broad sword and lighting the way with a torch. You have many other equipment slots but they are all currently empty. Press "t" to take something off. Note that the equipment listing is reduced to those objects which can actually be taken off. Press "g" to take off the armour, and then press "e" again. Note that the armour is no longer shown in the equipment. Press escape. Press "w" to wield something and observe that the inventory listing is reduced to those objects which can actually be wielded or worn, press "e" to put the armour back on. Monsters can only move after you use a command which takes "energy" from your character. So far, you have used the "w" and "t" commands, which take energy, and the "e", "i", "l", and "/" commands, which are "free" commands, and so do not take any energy. In general, the only commands which take energy are the ones which require your character to perform some action in the world of the game, such as moving around, attacking monsters, and interacting with objects. If there were any monsters near your character while you were experimenting with the "w" and "t" commands, you may have seen them "move" or even "attack" your character. Although unlikely, it is even possible that your character has already been killed. This is the only way to lose the game. So if you have already lost, simply exit the game and restart this demo. One of the most important things that your character can do is move around. Use the numeric keys on the keypad to make your character move around. The "4", "6", "8", and "2" keys move your character west, east, north, and south, and the "7", "9", "1" and "3" keys move your character diagonally. When your character first moves, observe the ">" symbol that is left behind. This is the "staircase" that she was standing on earlier in the demo - it is the entrance to the dungeon. Attempting to stay away from monsters, try and move your character towards the entrance to the "general store", which is represented as a "1" on the screen. As your character moves around, use the "l" command to look around. You can press escape at any time to cancel the looking. If you die, start over. One of the hardest things for people to get used to, when playing games of this nature for the first time, is that the character is not the same as the player. The player presses keys, and looks at a computer screen, while the character performs complex actions, and interacts with a virtual world. The player decides what the character should do, and tells her to do it, and the character then performs the actions. These actions may induce some changes in the virtual world. Some of these changes may be apparent to the character, and information about the changes is then made available to the player by a variety of methods, including messages, character state changes, or visual changes to the screen. Some changes may only be apparent to the player. There are also a whole set of things that the player can do that can not even be described in the virtual world inhabited by the character, such as resize windows, read online help files, modify colormaps, or change options. Some of these things may even affect the character in abstract ways, for example, the player can request that from now on all monsters know exactly where the character is at all times. Likewise, there are some things that the character does on a regular basis that the player may not even consider, such as digesting food, or searching for traps while walking down a hallway. To make matters worse, as you get used to the difference between the player and the character, it becomes so "obvious" that you start to ignore it. At that point, you find yourself merging the player and the character in your mind, and you find yourself saying things like "So yesterday, I was at my friend's house, and I stayed up late playing Angband, and I was attacked by some wild dogs, and I got killed by a demon, but I made it to the high score list", in which the pronoun changes back and forth from the real world to the virtual one several times in the same sentence. So, from this point on you may have to separate the player and the character for yourself. So anyway, keep walking towards the entrance to the general store until you actually walk into it. At this point, the screen should change to the store interaction screen. You will see the name of the shop-keeper, and the name of the shop, and a list of objects which are available. If there are more than twelve different objects, you can use the space or arrow keys to scroll the list of objects. The general store is the only store with a fixed inventory, although the amount of various items may vary. One of the items sold here are flasks of oil. Press "down" to highlight the line with flasks of oil and press the "p" key to purchase some. If you are asked how many you want, just hit enter. Any time you are asked a question and there is already something under the cursor, pressing return will accept that choice. Hit enter to accept the price. Many commands work inside the store, for example, use the "i" command to see your inventory, with the new flask of oil. Note that your inventory is always kept sorted in a semi-logical order, so the indexes of some of the objects may change as your inventory changes. Purchase a few more flasks of oil, if possible: this time, when asked how many you want, press "3" then return to buy three flasks at once. Flasks of oil are very important for low level characters, because not only can they be used to fuel a lantern (when you find one), but also they can be ignited and thrown at monsters from a distance. So it is often a good idea to have a few extra flasks of oil. Press escape to leave the store. If you want, take time to visit the rest of the stores. One of the buildings, marked with an "8", is your "home", and is not a real store. You can drop things off at home and they will stay there until you return to pick them up. The interface is exactly the same as a store, but there is no payment. Now move to the staircase, represented by the ">" symbol, and press ">", to go down the stairs. At this point, you are in the dungeon. Use the "l" command to look around. Note that you are standing on a staircase leading back to town. Use the "<" command to take the stairs back to town. You may find that any townspeople that were here before have disappeared and new ones have appeared instead. Now use the ">" command to go back down the stairs into the dungeon. You are now in a different part of the dungeon than you were in before. The dungeon is so huge, once you leave one part of the dungeon, you will never find it again. Now look the screen. Your character may be in a lit room, represented as a large rectangle of illuminated floor grids ("."), surrounded by walls. If you are not in a lit room, keep going back up to the town and back down into the dungeon until you are. Now look around. You may see some closed doors ("+") or some open doors ("'") or some open exits (".") in the walls which surround the room. If you do not, keep playing the stairway game until you are in such a room. This will keep the demo simple. Now look around using the "l" command. You may see some monsters and/or some objects in the room with you. You may see some stairs up ("<") or some stairs down (">"). If you see any monsters, move up next to the monster, using the movement keys, and then try and move into the monster. This will cause you to attack the monster. Keep moving into the monster until you kill the monster, or it runs away, or you die. If you die, start a new game. If the monster runs away, ignore it, or chase it, but do not leave the room. Once all the monsters in the room are dead or gone, walk on top of any objects in the room. Press "g" to get the object, and it will be added to your inventory. If there are any closed doors ("+") in the room walk up next to them and press "o" and then the direction key which would move you into the door, which should attempt to "open" the door. Now use the movement keys to explore the dungeon. As you leave the room, you will probably notice that your character cannot see nearly as far as she could in the room. Also, you will notice that as she moves around, the screen keeps displaying some of the grids that your character has seen. Think of this as a kind of "map" superimposed on the world itself, the player can see the entire map, but the character can only see those parts of the world which are actually nearby. If the character gets near the edge of the "map" portion of the screen the entire map will scroll to show a new portion of the world. Only about ten percent of the dungeon level can be seen by the player at one time, but you can use the "L" command to look at other pieces of the map. Use the "." key, then a direction, to "run" through the dungeon. Use the "R" key, then return, to force your character to "rest" until she has recovered from any damage she incurs while attacking monsters. Use the "M" key to see the entire dungeon level at once, and hit escape when done. If your food rations are still at index "a" in your inventory, press "E", "a" to eat some food. If your oil is still at index "b" in your inventory, and there is a monster nearby, press "v", "b", "'" to throw a flask of oil at the nearest monster. To drop an item from your inventory, press "d" plus the index of that item. You can use the "^X" key to quit and save the game. You now know enough to play a quick game of Angband. There is a lot more for you to learn, including how to interpret information about your character, how to create different kinds of characters, how to determine which equipment to wield/wear, how to use various kinds of objects, and how to use the more than fifty different commands available to your character. The best resource for learning these things is the online help, which include, among other things, a complete list of all commands available to you, and a list of all the symbols which you may encounter in the dungeon, and information about creating new characters. angband-v3.3.2/lib/help/command.txt0000644000175000017500000011261711651552410016474 0ustar chriscchrisc=== Command Descriptions === The following command descriptions are listed as the command name plus the default key to use it. For those who prefer the original "roguelike" keyset, the name and key of the roguelike command is also shown if it is different. Then comes a brief description of the command, including information about alternative methods of specifying the command in each keyset, when needed. Some commands use the "repeat count" to automatically repeat the command several times, while others use the "repeat count" to specify a "quantity" for the command, and still others use it as an "argument" of some kind. Most commands take no "energy" to perform, while other commands only take energy when they cause the world to change in some way. For example, attempting to read a scroll while blind does not use any energy. --- Inventory Commands --- Inventory list (i) Displays a list of objects being carried but not equipped. You can carry up to 23 different items, not counting those in your equipment. Often, many identical objects can be "stacked" into a "pile" which will count as a single item. This is always true of things like potions, scrolls, and food, but you may have to set options to allow wands, staves, and other such objects to stack. Each object has a weight, and if you carry more objects than your strength permits, you will begin to slow down. The amount of weight you can still carry without being overencumbered, or the amount of extra weight you are currently carrying is displayed at the top of the screen. Equipment list (e) Use this command to display a list of the objects currently being used by your character. Your character has 12 slots for equipment and 10 slots for ammunition (the quiver). Each equipment slot corresponds to a different location on the body, and each of which may contain only a single object at a time, and each of which may only contain objects of the proper "type", and which include WIELD (weapon), BOW (missile launcher), LEFT (ring), RIGHT (ring), NECK (amulet), LIGHT (light source), BODY (armor), OUTER (cloak), ARM (shield), HEAD (helmet), HANDS (gloves), FEET (boots). You must be wielding/wearing certain objects to take advantage of their special powers. Drop an item (d) This drops an item from your inventory or equipment onto the dungeon floor. If the floor spot you are standing on already has an object in it, Angband will attempt to drop the item onto an adjacent space. Be warned that if the floor is full and you attempt to drop something, it may disappear and be destroyed. Doors and traps are considered objects for the purpose of determining if the space is occupied. This command may take a quantity, and takes some energy. Destroy an item (k) or Destroy an item (^D) This destroys an item in your inventory or on the dungeon floor. If the selected pile contains multiple objects, you may specify a quantity. You must always (currently) verify this command. This command may take a quantity, and takes some energy. Wear/Wield equipment (w) To wear or wield an object in your inventory, use this command. Since only one object can be in each slot at a time, if you wear or wield an item into a slot which is already occupied, the old item will be first be taken off, and may in fact be dropped if there is no room for it in your inventory. Wielding ammunition will add it to an empty slot in your quiver and prompt you to replace a type of ammunition if your quiver is already full. This command takes some energy. Take off equipment (t) or Take off equipment (T) Use this command to take off a piece of equipment and return it to your inventory. Occasionally, you will run into a cursed item which cannot be removed. These items normally penalize you in some way and cannot be taken off until the curse is removed. If there is no room in your inventory for the item, your pack will overflow and you will drop the item after taking it off. You may also remove ammunition from your quiver with this command. This command takes some energy. --- Movement Commands --- Moving (arrow keys, number keys) or (arrow keys, number keys and 'yuhjklbn') This causes you to move one step in a given direction. If the square you wish to move into is occupied by a monster, you will attack it. If the square is occupied by a door or a trap you may attempt to open or disarm it if the appropriate option is set. Preceeding this command with CTRL will cause you to attack in the appropriate direction, but will not move your character if no monster is there. These commands take some energy. Walk (with pickup) (;) Moves one step in the given direction. The square you are moving into must not be blocked by walls or doors. You will pick up any items in the destination grid if the "always_pickup" option is set. You may also use the "original" direction keys (both keysets) or the "roguelike" direction keys (roguelike keyset) to walk in a direction. This command may take a count, requires a direction, and takes some energy. Walk (W) The walk command lets you willingly walk into a trap or a closed door, without trying to open or disarm it. This command may take a count, requires a direction, and takes some energy. Run (.) or Run (,) This command will move in the given direction, following any bends in the corridor, until you either have to make a "choice" between two directions or you are disturbed. You can configure what will disturb you by setting the disturbance options. You may also use shift plus the "roguelike" direction keys (roguelike keyset), or shift plus the "original" direction keys on the keypad (both keysets, some machines) to run in a direction. This command may take an argument, requires a direction, and takes some energy. Go up staircase (<) Climbs up an up staircase you are standing on. There is always at least one staircase going up on every level except for the town level (this doesn't mean it's easy to find). Going up a staircase will take you to a new dungeon level unless you are at 50 feet (dungeon level 1), in which case you will return to the town level. Note that whenever you leave a level (not the town), you will never find it again. This means that for all intents and purposes, any objects on that level are destroyed. This includes artifacts unless the "Create characters in preserve mode" option was set when your character was created, in which case the artifacts may show up again later. This command takes some energy. Go down staircase (>) Descends a down staircase you are standing on. There are always at least two staircases going down on each level, except for the town which has only one, and "quest" levels, which have none until the quest monster is killed. Going down a staircase will take you to a new dungeon level. See "Go Up Staircase" for more info. This command takes some energy. --- Resting Commands --- Stay still (with pickup) (,) or Stay still (with pickup) (.) Stays in the same square for one move. If you normally pick up objects you encounter, you will pick up whatever you are standing on. You may also use the "5" key (both keysets). This command may take a count, and takes some energy. Get objects (g) Pick up objects and gold on the floor beneath you. Picking up gold takes no time, and objects take 1/10th of a normal turn each (maximum time cost is a full turn). You may pick up objects until the floor is empty or your backpack is full. Rest (R) Resting is better for you than repeatedly staying still, and can be told to automatically stop after a certain amount of time, or when various conditions are met. In any case, you always wake up when anything disturbing happens, or when you press any key. To rest, enter the Rest command, followed by the number of turns you want to rest, or "*" to rest until your hitpoints and mana are restored, or "&" to rest until you are fully "healed". This command may take an argument (used for the number of turns to rest), and takes some energy. --- Searching Commands --- Search (s) This command can be used to locate hidden traps and secret doors in the spaces adjacent to the player. More than a single turn of searching will be required in most cases, so it is affected by the 'always repeat' option. You should always search a chest before trying to open it, since they are generally trapped. This command can take a count, which is useful if you are fairly sure of finding something eventually, since the command stops as soon as anything is found. This command takes some energy. Toggle search mode (S) or Toggle search mode (#) This command will take you into and out of search mode. When first pressed, the message "Searching" will appear at the bottom of the screen. You are now taking two turns for each command, one for the command and one turn to search. This means that you are taking twice the time to move around the dungeon, and therefore twice the food. Search mode will automatically turn off if you are disturbed. You may also turn off search mode by entering the Search Mode command again. --- Alter Commands --- Tunnel (T) or Tunnel (^T) Tunnelling or mining is a very useful art. There are many kinds of rock, with varying hardness, including permanent rock (permanent), granite (very hard), quartz veins (hard), magma veins (soft), and rubble (very soft). Quartz and Magma veins may be displayed in a special way, and may sometimes contain treasure, in which case they will be displayed in a different way. Rubble sometimes covers an object. It is hard to tunnel unless you are wielding a heavy weapon or a shovel or a pick. Tunnelling ability increases with strength and weapon weight. This command may take a count, requires a direction, and takes some energy. Open a door or chest (o) To open an object such as a door or chest, you must use this command. If the object is locked, you will attempt to pick the lock based on your disarming ability. If you open a trapped chest without disarming the traps first, the trap will be set off. Some doors will be jammed shut and may have to be forced open. Opening will automatically attempt to pick any lock doors. You may need several tries to open a door or chest. This command may take a count, requires a direction, and takes some energy. Close a door (c) Non-intelligent and some other creatures cannot open doors, so shutting doors can be quite valuable. Furthermore, monsters cannot see you behind closed doors, so closing doors may allow you to buy some time without being attacked. Broken doors cannot be closed. Bashing a door open may break it. This command may take a count, requires a direction, and takes some energy. Jam a door (j) or Spike a door (S) Many monsters can simply open closed doors, and can eventually get through a locked door. You may therefore occasionally want to jam a door shut with iron spikes. Each spike used on the door will make it harder for a monster to bash down the door, and will make it take longer time, up to a certain limit. A door that was locked before it was jammed or spiked will be harder to bash down. Smaller monsters are less able to bash down doors. In order to use this command, you must be carrying iron spikes. This command requires a direction, and takes some energy. Bash a door (B) or Force a door (f) This command allows you to bash down jammed doors. Your bashing ability increases with strength. Bashing open a door can (briefly) throw you off balance. Doors that are stuck, or which have been jammed closed with spikes can only be opened by bashing, and all closed doors can be bashed open if desired. Bashing a door open may permanently break it so that it can never be closed. This command may take a count, requires a direction, and takes some energy. Disarm a trap or chest, or lock a door (D) You can attempt to disarm traps on the floor or on chests. If you fail, there is a chance that you will blunder and set it off. You can only disarm a trap after you have found it (usually with the Search command). The command can also be used to lock a closed door. This will create a hindrance for monsters. Even if many monsters will be able to pick the lock or bash the door down, it will often take them some time. This command may take a count, requires a direction, and takes some energy. Alter (+) This special command allows the use of a single keypress to select any of the "obvious" commands above (attack, tunnel, bash, open, disarm, close), and, by using keymaps, to combine this keypress with directions. In general, this allows the use of the "control" key plus the appropriate "direction" key (including the roguelike direction keys in roguelike mode) as a kind of generic "alter the terrain feature of an adjacent grid" command. This command may take a count, requires a direction, and takes some energy. --- Spell and Prayer Commands --- Browse a book (b) or Peruse a book (P) Only mages, rogues, and rangers can read magic books, and only priests and paladins can read prayer books. Warriors cannot read any books. When this command is used, all of the spells or prayers contained in the selected book are displayed, along with information such as their level, the amount of mana required to cast them, and whether or not you know the spell or prayer. Gain new spells or prayers (G) Use this command to actually learn new spells or prayers. When you are able to learn new spells or prayers, the word "Study" will appear on the status line at the bottom of the screen. If you have a book in your possession, containing spells or prayers which you may learn, then you may choose to study that book. If you are a mage, rogue, or ranger, you may actually choose which spell to study. If you are a priest or paladin, your gods will choose a prayer for you. There are nine books of each type, five of which are normally found only in the dungeon. This command takes some energy. Cast a spell (m) To cast a spell, you must have previously learned the spell and must have in your inventory a book from which the spell can be read. Each spell has a chance of failure which starts out fairly large but decreases as you gain levels. If you don't have enough mana to cast a spell, you will be prompted for confirmation. If you decide to go ahead, the chance of failure is greatly increased, and you may wind up paralyzed for several turns. Since you must read the spell from a book, you cannot be blind or confused while casting, and there must be some light present. This command takes some energy: the higher your level, the less it takes, but the higher the spell level, the more it takes. Pray a prayer (p) To pray effectively, you must have previously learned the prayer and must have in your inventory a book from which the prayer can be read. Each prayer has a chance of being ignored which starts out fairly large but decreases as you gain levels. If you don't have enough mana to cast a spell, you will be prompted for confirmation. If you decide to go ahead, the chance of failure is greatly increased, and you may lose a point of constitution. Since you must read the prayer from a book, you cannot be blind or confused while praying, and there must be some light present. This command takes some energy - as with spells, higher caster level means less energy used, but higher spell level means more. --- Object Manipulation Commands --- Eat some food (E) You must eat regularly to prevent starvation. As you grow hungry, a message will appear at the bottom of the screen saying "Hungry". If you go hungry long enough, you will become weak, then start fainting, and eventually, you may will die of starvation. You may use this command to eat food in your inventory. Note that you can sometimes find food in the dungeon, but it is not always wise to eat strange food. This command takes some energy. Fuel your lantern/torch (F) If you are using a torch and have more torches in your pack, or you are using a lantern and have flasks of oil in your pack, then your can "refuel" them with this command. Torches and Lanterns are limited in their maximal fuel. In general, two flasks will fully fuel a lantern and two torches will fully fuel a torch. This command takes some energy. Quaff a potion (q) Use this command to drink a potion. Potions affect the player in various ways, but the effects are not always immediately obvious. This command takes some energy. Read a scroll (r) Use this command to read a scroll. Scroll spells usually have an area effect, except for a few cases where they act on other objects. Reading a scroll causes the parchment to disintegrate as the scroll takes effect. Most scrolls which prompt for more information can be aborted (by pressing escape), which will stop reading the scroll before it disintegrates. This command takes some energy. Inscribe an object ({) This command inscribes a string on an object. The inscription is displayed inside curly braces after the object description. The inscription is limited to the particular object (or pile) and is not automatically transferred to all similar objects. Under certain circumstances, Angband will display "fake" inscriptions on certain objects ("cursed", "broken", "tried", "empty", "NN% off") when appropriate. These "fake" inscriptions remain all the time, even if the player chooses to add a "real" inscription on top of it later. In addition, Angband will occasionally place a "real" inscription on an object for you, normally as the result of your character getting a "feeling" about the item. All characters will get "feelings" about weapons and armor after carrying them for a while. Warriors (who understand weapons and armor best) get the most detailed feelings, and get them faster than other classes. Rogues (used to handling all sorts of stolen goods) are also very good, as are paladins (basically warriors who are religious.) Rangers are not so well-versed in melee weapons, being normally people of the outdoors and the wilderness who prefer archery and camouflage to heavy metal armor and weaponry, while priests and mages simply are not experienced enough in matters concerning melee to be able to tell much about an item - though a priest will realise the extent of his knowledge fairly quickly, as they are often called upon to fight for their faith and have learned a little from these experiences and divine insight. Mages, frankly, haven't a clue. But then, they don't need it when they can learn the spell of Identify very early on in the game. An item labeled as "{empty}" was found to be out of charges, and an item labeled as "{tried}" is a "flavored" item which the character has used, but whose effects are unknown. Certain inscriptions have a meaning to the game, see "@#", "@x#", "!*", and "!x", in the section on inventory object selection. Uninscribe an object (}) This command removes the inscription on an object. This command will have no effect on "fake" inscriptions added by the game itself. --- Magical Object Commands --- Activate an artifact (A) You have heard rumors of special weapons and armor deep in the Pits, items that can let you breathe fire like a dragon or light rooms with just a thought. Should you ever be lucky enough to find such an item, this command will let you activate its special ability. Special abilities can only be used if you are wearing or wielding the item. This command takes some energy. Aim a wand (a) or Zap a wand (z) Wands must be aimed in a direction to be used. Wands are magical devices, and therefore there is a chance you will not be able to figure out how to use them if you aren't good with magical devices. They will fire a shot that affects the first object or creature encountered or fire a beam that affects anything in a given direction, depending on the wand. An obstruction such as a door or wall will generally stop the effects from traveling any farther. This command requires a direction and can use a target. This command takes some energy. Use a staff (u) or Zap a staff (Z) This command will use a staff. A staff is normally very similar to a scroll, in that they normally either have an area effect or affect a specific object. Staves are magical devices, and there is a chance you will not be able to figure out how to use them. This command takes some energy. Zap a rod (z) or Activate a rod (a) Rods are extremely powerful magical items, which cannot be burnt or shattered, and which can have either staff-like or wand-like effects, but unlike staves and wands, they don't have charges. Instead, they draw on the ambient magical energy to recharge themselves, and therefore can only be activated once every few turns. The recharging time varies depending on the type of rod. This command may require a direction (depending on the type of rod, and whether you are aware of its type) and can use a target. This command takes some energy. --- Throwing and Missile Weapons --- Fire an item (f) or Fire an item (t) This command will fire a will allow you to fire a missile from either your quiver or your inventory provided it is the appropriate ammunition for the current missile weapon you have equipped. You may not fire an item without a missile weapon equipped. Fired ammunition has a chance of breaking. This command takes some energy. Fire default ammo at nearest (h) or (TAB) If you have a missile weapon equipped and the appropriate ammunition in your quiver, you can use this command to fire at the nearest visible enemy. This command will cancel itself if you lack a launcher, ammunition or a visible target that is in range. The first ammunition of the correct type found in the quiver is used. This command takes some energy. Throw an item (v) You may throw any object carried by your character. Depending on the weight, it may travel across the room or drop down beside you. Only one object from a pile will be thrown at a time. Note that throwing an object will often cause it to break, so be careful! If you throw something at a creature, your chances of hitting it are determined by your plusses to hit, your ability at throwing, and the object's plusses to hit. Once the creature is hit, the object may or may not do any damage to it. You've heard rumors that some objects found in the dungeon can do huge amounts of damage when thrown, but you're not sure which objects those are.... Note that flasks of oil will do a fairly large chunk of fire damage to a monster on impact. If you are wielding a missile launcher compatible with the object you are throwing, then you automatically use the launcher to fire the missile with much higher range, accuracy, and damage, than you would get by just throwing the missile. Throw, like fire, requires a direction. Targeting mode (see the next command) can be invoked with "*" at the "Direction?" prompt. This command takes some energy. Targeting Mode (*) This will allow you to aim your ranged attacks at a specific monster or grid, so that you can point directly towards that monster or grid (even if this is not a "compass" direction) when you are asked for a direction. You can set a target using this command, or you can set a new target at the "Direction?" prompt when appropriate. At the targeting prompt, you have many options. First of all, targetting mode starts targetting nearby monsters which can be reached by "projectable" spells and thrown objects. In this mode, you can press "t" (or "5" or ".") to select the current monster, space to advance to the next monster, "-" to back up to the previous monster, direction keys to advance to a monster more or less in that direction, "r" to "recall" the current monster, "q" to exit targetting mode, and "p" (or "o") to stop targetting monsters and enter the mode for targetting a location on the floor or in a wall. Note that if there are no nearby monsters, you will automatically enter this mode. Note that hitting "o" is just like "p", except that the location cursor starts on the last examined monster instead of on the player. In this mode, you use the "direction" keys to move around, and the "q" key to quit, and the "t" (or "5" or ".") key to target the cursor location. Note that targetting a location is slightly "dangerous", as the target is maintained even if you are far away. To cancel an old target, simply hit "*" and then ESCAPE (or "q"). Note that when you cast a spell or throw an object at the target location, the path chosen is the "optimal" path towards that location, which may or may not be the path you want. Sometimes, by clever choice of a location on the floor for your target, you may be able to convince a thrown object or cast spell to squeeze through a hole or corridor that is blocking direct access to a different grid. Launching a ball spell or breath weapon at a location in the middle of a group of monsters can often improve the effects of that attack, since ball attacks are not stopped by interposed monsters if the ball is launched at a target. --- Looking Commands --- Full screen map (M) This command will show a map of the entire dungeon, reduced by a factor of nine, on the screen. Only the major dungeon features will be visible because of the scale, so even some important objects may not show up on the map. This is particularly useful in locating where the stairs are relative to your current position, or for identifying unexplored areas of the dungeon. Locate player on map (L) or Where is the player (W) This command lets you scroll your map around, looking at all sectors of the current dungeon level, until you press escape, at which point the map will be re-centered on the player if necessary. To scroll the map around, simply press any of the "direction" keys. The top line will display the sector location, and the offset from your current sector. Look around (l) or Examine things (x) This command is used to look around at nearby monsters (to determine their type and health) and objects (to determine their type). It is also used to find out what objects (if any) are under monsters, and if a monster is currently inside a wall, and what is under the player. When you are looking at something, you may hit space for more details, or to advance to the next interesting monster or object, or minus ("-") to go back to the previous monster or object, or a direction key to advance to the nearest interesting monster or object (if any) in that general direction, or "r" to recall information about the current monster race, or "q" or escape to stop looking around. You always start out looking at "yourself". Inspect an item (I) This command lets you inspect an item. This will tell you things about the special powers of the object, as well as attack information for weapons. It will also tell you what resistances or abilities you have noticed for the item and if you have not yet completely identified all properties. List visible monsters ([) This command lists all monsters that are visible to you, telling you how many there are of each kind. It also tells you whether they are asleep, and where they are (relative to you). List visible items (]) This command lists all items that are visible to you, telling you how of each there are and where they are on the level relative to your current location. --- Message Commands --- Repeat level feeling (^F) Repeats the feeling about the dungeon level that you got when you first entered the level. View previous messages (^P) This command shows you all the recent messages. You can scroll through them, or exit with ESCAPE. Take notes (:) This command allows you to take notes, which will then appear in your message list and your character history (prefixed with "Note:"). --- Game Status Commands --- Character Description (C) Brings up a full description of your character, including your skill levels, your current and potential stats, and various other information. From this screen, you can change your name or use the file character description command to save your character status to a file. That command saves additional information, including your background, your inventory, and the contents of your house. Check knowledge (~) This command allows you to ask about the knowledge possessed by your character. Currently, this includes being able to list all known "artifacts", "uniques", and "objects". Normally, once an artifact is "generated", and "lost", it can never again be found, and will become "known" to the player. With "preserve" mode, an artifact can never be "lost" until it is "known" to the player. In either case, any "known" artifacts not in the possession of the player will never again be "generated". The "uniques" are special "unique" monsters which can only be killed once per game. Certain "objects" come in "flavors", and you must determine the effect of each "flavor" once for each such type of object, and this command will allow you to display all "known" flavors. Inscribing items in this list will cause you to similarly inscribe all similar items you find from this point on. Interact with the system (!) Allow the user to interact with the underlying visual system. This command is currently unused. --- Saving and Exiting Commands --- Save and Quit (Ctrl-X) To save your game so that you can return to it later, use this command. Save files will also be generated (hopefully) if the game crashes due to a system error. After you die, you can use your savefile to play again with the same options and such. Save (Ctrl-S) This command saves the game but doesn't exit Angband. Use this frequently if you are paranoid about having your computer crash (or your power go out) while you are playing. Quit (commit suicide) (Q) Kills your character and exits Angband. You will be prompted to make sure you really want to do this, and then asked to verify that choice. Note that dead characters are dead forever. --- User pref file commands --- Interact with options (=) Allow you to interact with options. Note that using the "cheat" options may mark your savefile as unsuitable for the high score list. The "window" options allow you to specify what should be drawn in any of the special sub-windows (not available on all platforms). See the help files "customize.txt" and "options.txt" for more info. You can also interact with keymaps under this menu. Interact with keymaps - option submenu Allow you to interact with keymaps. You may load or save keymaps from user pref files, or define keymaps. You must define a "current action", shown at the bottom of the screen, before you attempt to use any of the "create macro" commands, which use that "current action" as their action. This is a horrible interface, and will be fixed eventually. Interact with visuals - option submenu Allow you to interact with visuals. You may load or save visuals from user pref files, or modify the attr/char mappings for the monsters, objects, and terrain features. You must use the "redraw" command (^R) to redraw the map after changing attr/char mappings. NOTE: It is generally easier to modify visuals via the "knowledge" menus. Interact with colors - option submenu Allow the user to interact with colors. This command only works on some systems. NOTE: It is commonly used to brighten the 'Light Dark' color (eg. Cave Spiders) on displays with bad alpha settings. --- Help --- Help (?) Brings up the Angband on-line help system. Note that the help files are just text files in a particular format, and that other help files may be available on the Net. In particular, there are a variety of spoiler files which do not come with the standard distribution. Check the place you got Angband from or ask on the newsgroup rec.games.roguelike.angband about them. Identify Symbol (/) Use this command to find out what a character stands for. For instance, by pressing "/.", you can find out that the "." symbol stands for a floor spot. When used with a symbol that represents creatures, the this command will tell you only what class of creature the symbol stands for, not give you specific information about a creature you can see. To get that, use the Look command. There are three special symbols you can use with the Identify Symbol command to access specific parts of your monster memory. Typing Ctrl-A when asked for a symbol will recall details about all monsters, typing Ctrl-U will recall details about all unique monsters, and typing Ctrl-N will recall details about all non-unique monsters. If the character stands for a creature, you are asked if you want to recall details. If you answer yes, information about the creatures you have encountered with that symbol is shown in the Recall window if available, or on the screen if not. You can also answer "k" to see the list sorted by number of kills, or "p" to see the list sorted by dungeon level the monster is normally found on. Pressing ESCAPE at any point will exit this command. Game Version (V) This command will tell you what version of Angband you are using. For more information, see the "version.txt" help file. Command lists (Enter) This brings up a little window in the middle of the screen, in which you can select what command you would like to use by browsing. Useful for beginners. --- Extra Commands --- Toggle Choice Window (^E) Toggles the display in any sub-windows (if available) which are displaying your inventory or equipment. Redraw Screen (^R) This command adapts to various changes in global options, and redraws all of the windows. It is normally only necessary in abnormal situations, such as after changing the visual attr/char mappings, or enabling "graphics" mode. Load screen dump (left-paren) This command loads a "snap-shot" of the current screen from the file "dump.txt", and displays it on the screen. Save screen dump (right-paren) This command dumps a "snap-shot" of the current screen to the file "dump.txt", including encoded color information. The command has three variants: - text, a simple ascii dump of the screen concatenated with a dump of the color attributes. It may be viewed in color with the '(' command. - html, suitable for viewing in a web browser. - forum embedded html for vBulletin, suitable for pasting in web forums like http://angband.oook.cz/forums. angband-v3.3.2/lib/help/Makefile0000644000175000017500000000030011651552410015736 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk LIBDATA = 330.txt attack.txt birth.txt command.txt debug.txt dungeon.txt general.txt help.hlp option.txt playing.txt version.txt PACKAGE = help angband-v3.3.2/lib/help/dungeon.txt0000644000175000017500000006075511651552410016522 0ustar chriscchrisc=== The Dungeon === After you have created your character, you will begin your Angband adventure. Symbols appearing on your screen will represent the dungeon's walls, floor, objects, features, and creatures lurking about. In order to direct your character through his adventure, you will enter single character commands (see "commands.txt"). === Symbols On Your Map === Symbols on your map can be broken down into three categories: features of the dungeon such as walls, floor, doors, and traps; objects which can be picked up such as treasure, weapons, magical devices, etc; and creatures which may or may not move about the dungeon, but are mostly harmful to your character's well being. Some symbols are used to represent more than one type of entity, and some symbols are used to represent entities in more than one category. The "@" symbol (by default) is used to represent the character. It will not be necessary to remember all of the symbols and their meanings. The "slash" command ("/") will identify any character appearing on your map (see "commands.txt"). Note that you can use a "user pref file" to change any of these symbols to something you are more comfortable with. Features that do not block line of sight . A floor space 1 Entrance to General Store . A trap (hidden) 2 Entrance to Armoury ^ A trap (known) 3 Entrance to Weapon Smith ; A glyph of warding 4 Entrance to Temple ' An open door 5 Entrance to Alchemy Shop ' A broken door 6 Entrance to Magic Shop < A staircase up 7 Entrance to the Black Market > A staircase down 8 Entrance to your Home Features that block line of sight # A secret door # A wall + A closed door % A mineral vein + A locked door * A mineral vein with treasure + A jammed door : A pile of rubble Objects ! A potion (or flask) / A pole-arm ? A scroll (or book) | An edged weapon , A mushroom (or food) \ A hafted weapon - A wand or rod } A sling, bow, or x-bow _ A staff { A shot, arrow, or bolt = A ring ( Soft armour " An amulet [ Hard armour $ Gold or gems ] Misc. armour ~ Lights, Tools, Chests, etc ) A shield ~ Junk, Sticks, Skeletons, etc & A pile of items Monsters $ Creeping Coins , Mushroom Patch a Giant Ant A Angelic being b Giant Bat B Bird c Giant Centipede C Canine (Dog) d Dragon D Ancient Dragon e Floating Eye E Elemental f Feline (Cat) F Dragon Fly g Golem G Ghost h Humanoids H Hybrid i Icky-Thing I Insect j Jelly J Snake k Kobold K Killer Beetle l Giant Louse L Lich m Mold M Multi-Headed Hydra n Naga N (unused) o Orc O Ogre p Human "person" P Giant "person" q Quadruped Q Quylthulg (Pulsing Flesh Mound) r Rodent R Reptile/Amphibian s Skeleton S Spider/Scorpion/Tick t Townsperson T Troll u Minor Demon U Major Demon v Vortex V Vampire w Worm or Worm Mass W Wight/Wraith x (unused) X Xorn/Xaren y Yeek Y Yeti z Zombie/Mummy Z Zephyr Hound === The Town Level === The town level is where you will begin your adventure. The town consists of eight buildings (each with an entrance), some townspeople, and a wall which surrounds the town. The first time you are in town it will be daytime, but note that the sun rises and falls (rather instantly) as time passes. === Townspeople === The town contains many different kinds of people. There are the street urchins, young children who will mob an adventurer for money, and seem to come out of the woodwork when excited. Blubbering idiots are a constant annoyance, but not harmful. Public drunks wander about the town singing, and are of no threat to anyone. Sneaky rogues hang about watching for a likely victim to mug. And finally, no town would be complete without a swarm of half drunk warriors, who take offense or become annoyed just for the fun of it. (There are assumed to be other people in the town, but they are not represented on the screen as they do not interact with the player in any way.) Most of the townspeople should be avoided by the largest possible distance when you wander from store to store. Fights will break out, though, so be prepared. Since your character grew up in this world of intrigue, no experience is awarded for killing the town inhabitants, though you may acquire treasure. === Town Buildings === Your character will begin his adventure with some basic supplies, and some extra gold with which to purchase more supplies at the town stores. You may enter any open store to buy or sell items of the appropriate type. The price that the shopkeeper requests is dependent on the price of the item and the player's charisma. Stores also have a maximum value, they will not pay more than that for any item, regardless of how much it is actually worth. Once inside a store, you will see the name and race of the store owner, the name of the store, the maximum amount of cash that the store owner will pay for any one item, and the store inventory, listed along with the prices. You will also see an (incomplete) list of available commands. Note that many of the commands which work in the dungeon work in the stores as well, but some do not, especially those which involve "using" objects. Stores do not always have everything in stock. As the game progresses, they may get new items so check from time to time. Stores restock after 10000 game turns have passed, but the inventory will never change while you are in town, even if you save the game and return. You must be in the dungeon for the store to restock. Also, if you sell them an item, it may get sold to a customer while you are adventuring, so don't always expect to be able to get back everything you have sold. If you have a lot of spare gold, you can purchase every item in a store, which will induce the store owner to bring out new stock, and perhaps even retire. Store owners will not buy known harmful or useless items. If an object is unidentified, they will pay you some base price for it. Once they have bought it they will immediately identify the object. If it is a good object, they will add it to their inventory. If it was a bad bargain, they simply throw the item away. You can use this feature to learn item flavors. The General Store ("1") The General Store sells foods, some clothing, torches, scrolls of phase door, scrolls of word of recall, oil, shovels, picks, and spikes. All of these items and some others can be sold back to the General store for money. The general store restocks like every store, but the inventory types never change. The Armoury ("2") The Armoury is where the town's armour is fashioned. All sorts of protective gear may be bought and sold here. The deeper into the dungeon you progress the more exotic the equipment you will find stocked in the armoury. However, some armour types will never appear here unless you sell them. The Weaponsmith's Shop ("3") The Weaponsmith's Shop is where the town's weapons are fashioned. Hand and missile weapons may be purchased and sold here, along with arrows, bolts, and shots. As with the armoury, not all weapon types will be stocked here, unless they are sold to the shop by the player first. The Temple ("4") The Temple deals in healing potions, as well as bless scrolls, remove curse scrolls, and some approved priestly weapons, as well as prayer books. The Alchemy shop ("5") The Alchemy Shop deals in all types of potions and scrolls, including stat restoring potions. The Magic User's Shop ("6") The Magic User's Shop deals in all sorts of rings, wands, amulets, and staves, as well as magic user books. The Black Market ("7") The Black Market will sell and buy anything at extortionate prices. However it occasionally has VERY good items in it. With the exception of artifacts, every item found in the dungeon may appear in the black market. Your Home ("8") This is your house where you can store objects that you cannot carry on your travels, or will need at a later date. === Within The Dungeon === Once your character is adequately supplied with food, light, armor, and weapons, he is ready to enter the dungeon. Move on top of the `>' symbol and use the "Down" command (">"). Your character will enter a maze of interconnecting staircases and finally arrive somewhere on the first level of the dungeon. Each level of the dungeon is fifty feet high (thus dungeon level "Lev 1" is often called "50 ft"), and is divided into (large) rectangular regions (several times larger than the screen) by permanent rock. Once you leave a level by a staircase, you will never again find your way back to that region of that level, but there are an infinite number of other regions at that same "depth" that you can explore later. Monsters, of course, can use the stairs, and you may eventually encounter them again, but they will not chase you up or down stairs. In the dungeon, there are many things to find, but your character must survive many horrible and challenging encounters to find the treasure lying about and take it safely back to the town to sell. There are two sources for light once inside the dungeon. Permanent light which has been magically placed within rooms, and a light source carried by the player. If neither is present, the character will be unable to see. This will affect searching, picking locks, disarming traps, reading scrolls, casting spells, browsing books, etc. So be very careful not to run out of light! A character must wield a torch or lamp in order to supply his own light. A torch or lamp burns fuel as it is used, and once it is out of fuel, it stops supplying light. You will be warned as the light approaches this point. You may use the "Fuel" command ("F") to refuel your lantern (with flasks of oil) or your torch (with other torches), so it is a good idea to carry extra torches or flasks of oil, as appropriate. There are rumours of objects of exceptional power which glow with their own never-ending light. === Objects Found In The Dungeon === The mines are full of objects just waiting to be picked up and used. How did they get there? Well, the main source for useful items are all the foolish adventurers that proceeded into the dungeon before you. They get killed, and the helpful creatures scatter the various treasure throughout the dungeon. There are a few cursed items present in the dungeon - either left behind as the result of a failed attempt to create a magic items, or deliberately placed by evil sorcerers. Some will inconvenience you but a very few are deadly. Only one object may occupy a given floor location, which may or may not also contain one creature. Doors, rubble, traps, and staircases are considered "objects" for this purpose. As below, any item may actually be a "pile" of up to 99 identical items. With the right choice of "options", you may be able to "stack" several items in the same grid. You pick up objects by moving on top of them. You can carry up to 23 different items in your backpack while wearing and wielding up to 12 others. Although you are limited to 23 different items, each item may actually be a "pile" of up to 99 similar items. If you "t"ake off an item, it will go into your backpack if there is room: if there is no room in your backpack, it will drop onto the floor, so be careful when swapping one wielded weapon or worn piece of armor for another when your pack is full. You are, however, limited in the total amount of weight that you can carry. If you exceed this value, you become slower, making it easier for monsters to chase you. Note that there is no upper bound on how much you can carry, if you do not mind being slow. Your weight "limit" is determined by your strength. Many objects found within the dungeon have special commands for their use. Wands must be Aimed, staves must be Used, scrolls must be Read, and potions must be Quaffed. You may, in general, not only use items in your pack, but also items on the ground, if you are standing on top of them. At the beginning of the game all items are assigned a random 'flavor'. For example potions of 'cure light wounds' could be 'red potions'. If you have never used, sold, or bought one of these potions, you will only see the flavor. You can learn what type of item it is by selling it to a store, using it and noticing an effect (for example, quaffing a healing potion when injured), or casting the spell identify. Lastly, items in stores that you have not yet identified the flavor of will be labeled {unknown}. Chests are complex objects, containing traps, locks, and possibly treasure or other objects inside them once they are opened. Many of the commands that apply to traps or doors also apply to chests and, like traps and doors, these commands do not work if you are carrying the chest. One item in particular will be discussed here. The scroll of "Word of Recall" can be found within the dungeon, or bought at the temple in town. All classes start with one of these scrolls in their inventory. It acts in two manners, depending upon your current location. If read within the dungeon, it will teleport you back to town. If read in town, it will teleport you back down to the deepest level of the dungeon which your character has previously been on. This makes the scroll very useful for getting back to the deeper levels of Angband. Once the scroll has been read it takes a while for the spell to act, so don't expect it to save you in a crisis. During this time the word 'recall' will appear on the bottom of the screen below the dungeon. Reading a second scroll before the first takes effect will cancel the action. You may "inscribe" any object with a textual inscription of your choice. These inscriptions are not limited in length, though you may not be able to see the whole inscription on the item. The game applies special meaning to inscriptions containing any text of the form "@#" or "@x#" or "!x" or "!*", see "command.txt". The game provides some "fake" inscriptions to help you keep track of your possessions. Wands and staves which are known to be empty will be inscribed with {empty}. Objects which have been tried at least once but haven't been identified yet will be inscribed with "tried". Cursed objects are inscribed with {cursed}. In addition while carrying or wielding weapons or armor you may learn qualities of these items. {average} means that the item has no magical bonuses. {magical} means that it has magical bonuses although these bonuses may be negative. An item with negative bonuses is not necessarily cursed. An {ego} item has special abilities. If the abilities are not obvious to the wielder the item will get an {excellent} tag. If the item has obvious abilities, such as an increase to a statistic it will be labeled {splendid}. Lastly, if at any point you pick up an Artifact you will learn its name immediately and it will be labeled {special}. However, you may not be aware of all its powers. Note that these inscriptions are fake, and cannot be removed. Only weapons and armor will receive these pseudo-identifications. Wands, staves, rods, scrolls, potions and mushrooms can only get the {tried} label. However, if using or consuming the item creates an obvious effect, you will learn the flavor. For example, if you are injured and drink an unknown potion of Cure Serious Wounds, you will learn it. It is rumored that rings of power and extra rare spell books may be found deeper in the dungeon... And lastly, a final warning: not all objects are what they seem. The line between tasty food and a poisonous mushroom is a fine one, and sometimes a chest full of treasure will grow teeth in its lid and bite your hand off... === Cursed Objects === Some objects, mainly armor and weapons, have had curses laid upon them. These horrible objects will look like any other normal item, but will detract from your character's stats or abilities if worn. They will also be impossible to remove until a remove curse is performed. In fact some are so badly cursed that even this will not work, and more potent methods are needed. If you wear or wield a cursed item, you will immediately feel deathly cold, and the item will be marked with the fake inscription "cursed". Shopkeepers will refuse to buy any item which is known to be cursed, either by having been identified or by being marked with the fake inscription. Weapons and armor can be uncursed either by spells of remove curse or by attempting to enchant them with spells or scrolls. === Mining === Some treasure within the dungeon can be found only by mining it out of the walls. Many rich strikes exist within each level, but must be found and mined. Quartz veins are the richest, yielding the most metals and gems, but magma veins will have some hoards hidden within. Mining is rather difficult without a pick or shovel. Picks and shovels have an additional magical ability expressed as `(+#)'. The higher the number, the better the magical digging ability of the tool. A pick or shovel also has plusses to hit and damage, and can be used as a weapon, because, in fact, it is one. When a vein of quartz or magma is located, the character may wield his pick or shovel and begin digging out a section. When that section is removed, he can locate another section of the vein and begin the process again. Since granite rock is much harder to dig through, it is much faster to follow the vein exactly and dig around the granite. Eventually, it becomes easier to simply kill monsters and discover items in the dungeon to sell, than to walk around digging for treasure. But, early on, mineral veins can be a wonderful source of easy treasure. If the character has a scroll, staff, or spell of treasure location, he can immediately locate all strikes of treasure within a vein shown on the screen. This makes mining much easier and more profitable. Note that a character with high strength and/or a heavy weapon does not need a shovel/pick to dig, but even the strongest character will benefit from a pick if trying to dig through a granite wall. It is sometimes possible to get a character trapped within the dungeon by using various magical spells and items. So it can be a good idea to always carry some kind of digging tool, even when you are not planning on tunneling for treasure. There are rumors of certain incredibly profitable rooms buried deep in the dungeon and completely surrounded by permanent rock and granite walls, requiring a digging implement or magical means to enter. The same rumors imply that these rooms are guarded by incredibly powerful monsters, so beware! === Traps === There are many traps located in the dungeon of varying danger. These traps are hidden from sight and are triggered only when your character walks over them. If you have found a trap you can attempt to "D"isarm it, but failure may mean activating it. There are some magical means to detecting all traps within a certain radius. If you cast one of these spells, there will be a 'Dtrap' green label on the bottom of the screen, below the dungeon map. At some point in the dungeon you may see a line of green squares on the floor. This line represents the extent of your detection. Beyond the green line you are no longer in the safe region. Some monsters have the ability to create new traps on the level that may be hidden, even if the player is in a detected zone. The detection only finds the traps that exist at the time of detection, it does not inform you of new ones that have since been created. === Staircases, Secret Doors, Passages, and Rooms === Staircases are the manner in which you get deeper or climb out of the dungeon. The symbols for the up and down staircases are the same as the commands to use them. A "<" represents an up staircase and a ">" represents a down staircase. You must move your character over the staircase before you can use it. Each level has at least one up staircase and at least two down staircases. There are no exceptions to this rule. You may have trouble finding some well hidden secret doors, or you may have to dig through obstructions to get to them, but you can always find the stairs if you look hard enough. Stairs, like permanent rock, and shop entrances, cannot be destroyed by any means. Many secret doors are used within the dungeon to confuse and demoralize adventurers foolish enough to enter. But with some luck, and lots of concentration, you can find these secret doors. Secret doors will sometimes hide rooms or corridors, or even entire sections of that level of the dungeon. Sometimes they simply hide small empty closets or even dead ends. Secret doors always look like granite walls, just like traps always look like normal floors. Creatures in the dungeon will generally know and use these secret doors, and can often be counted on to leave them open behind them when they pass through. For historical reasons, secret doors are never locked. === Winning The Game === If your character has killed Sauron (a difficult task), who lives on level 99 (4950') in the dungeon, a magical staircase will appear that will allow you to finally reach level 100. Morgoth lurks on this level of his dungeon, and you will not be able to go below his level until you have killed him. Try to avoid wandering around on level 100 unless you are ready for him, since he has a habit of coming at you across the dungeon, the Mighty Hammer 'Grond' in hand, to slay you for your impudence. If you should actually survive the attempt of killing Morgoth, you will receive the status of WINNER. You may continue to explore, and may even save the game and play more later, but since you have defeated the toughest creature alive, there is really not much point. Unless you wish to listen to the rumors of a powerful ring buried somewhere in the dungeon, or a suit of dragon scale mail that resists everything... When you are ready to retire, simply "commit suicide" (using the "Q" key) to have your character entered into the high score list as a winner. Note that until you retire, you can still be killed, so you may want to retire before wandering into yet another horde of greater demons. === Upon Death and Dying === If your character falls below 0 hit points, he has died and cannot be restored. A tombstone showing information about your character will be displayed. You are also permitted to get a record of your character, and all your equipment (identified) either on the screen or in a file. Your character will leave behind a reduced save file, which contains only the monster memory and your option choices. It may be restored, in which case a new character is generated exactly as if the file was not there, but the new player will find his monster memory containing all the experience of past incarnations. There are a variety of ways to "cheat" death (including using a special "cheating option") when it would otherwise occur. This will fully heal your character, returning him to the town, and marking him in various ways as a character which has cheated death. Cheating death, like using any of the "cheating options", will prevent your character from appearing on the high score list. angband-v3.3.2/lib/help/customize.txt0000644000175000017500000003555011651552410017100 0ustar chriscchrisc=== Customization === Angband supports multiple customizations. These can vary from alternative methods for selecting objects, keymaps for different commands, changing the visuals (using graphical tiles), creating subwindows, and saving customizations for use on future characters. === Special Keys === Certain special keys may be intercepted by the operating system or the host machine, causing unexpected results. In general, these special keys are control keys, and often, you can disable their special effects. If you are playing on a UNIX or similar system, then Ctrl-C will interrupt Angband. The second and third interrupt will induce a warning bell, and the fourth will induce both a warning bell and a special message, since the fifth will quit the game, after killing your character. Also, Ctrl-Z will suspend the game, and return you to the original command shell, until you resume the game with the "fg" command. There is now a compilation option to force the game to prevent the "double ctrl-z escape death trick". The Ctrl-\ and Ctrl-D and Ctrl-S keys should not be intercepted. It is often possible to specify "control-keys" without actually pressing the control key, by typing a caret ("^") followed by the key. This is useful for specifying control-key commands which might be caught by the operating system as explained above. Pressing backslash ("\") before a command will bypass all keymaps, and the next keypress will be interpreted as an "underlying command" key, unless it is a caret ("^"), in which case the keypress after that will be turned into a control-key and interpreted as a command in the underlying angband keyset. For example, the sequence "\" + "." + "6" will always mean "run east", even if the "." key has been mapped to a different underlying command. The "0" and "^" and "\" keys all have special meaning when entered at the command prompt, and there is no "useful" way to specify any of them as an "underlying command", which is okay, since they would have no effect. For many input requests or queries, the special character ESCAPE will abort the command. The "[y/n]" prompts may be answered with "y" or "n", or ESCAPE. The "-more-" message prompts may be cleared (after reading the displayed message) by pressing ESCAPE, SPACE, RETURN, LINEFEED, or by any keypress, if the "quick_messages" option is turned on. === Command Counts === Some commands can be executed a fixed number of times by preceding them with a count. Counted commands will execute until the count expires, until you type any character, or until something significant happens, such as being attacked. Thus, a counted command doesn't work to attack another creature. While the command is being repeated, the number of times left to be repeated will flash by on the line at the bottom of the screen. To give a count to a command, type 0, the repeat count, and then the command. If you want to give a movement command and you are using the original command set (where the movement commands are digits), press space after the count and you will be prompted for the command. Counted commands are very useful for time consuming commands, as they automatically terminate on success, or if you are attacked. You may also terminate any counted command (or resting or running), by typing any character. This character is ignored, but it is safest to use a SPACE or ESCAPE which are always ignored as commands in case you type the command just after the count expires. === Squelch settings === Angband allows you to ignore specific items that you don't want to see anymore. These items are 'squelched' and any similar items are hidden from view. There are several ways to squelch an item. The easiest way is to choose the 's' option when destroying an object. Whenever you destroy an object you are forced to confirm the destruction. One of the options is 's'. If you use this option, the object is dropped and then hidden from view. Weapons and armor have quality squelch options. These allow you to specify what types of weapons and armor you are no longer interested in seeing. There is a quality setting for each weapon and armor type. Squelching weapons and armor by destroying the object will prompt you with a question about whether you wish to squelch all of that type of armor with a certain quality setting. These quality settings are described below: bad: the weapon/armor has negative AC, to-hit or to-dam. It may or may not be cursed average: The weapon/armor has no pluses no minuses. It is non-magical. good: The weapon/armor has positive AC, to-hit or to-dam. However it does not have any special abilities, brands, slays, stat-boosts, resistances excellent, with no high resists: Weapons will have some slays. Armor will have resistances, but these are limited to rfire, rcold, racid and relec. excellent but not splendid: Weapons and armor may have high resists but they do not have any stat boosts or brands. Splendid: Squelching all splendid items only leaves artifacts unsquelched. === Using Inscriptions === You can inscribe items to change the selection process. Normally when you select an item from your inventory you must enter a letter that corresponds to the item. Since the order of your inventory changes as items get added and removed, you may want to inscribe alternate methods of item selection. Instead of entering letters, you can enter numbers, and automatically assign certain items to specific numbers. The way to do this is by using the inscribe "{" command, which will add an inscription to the item. You can add an inscription directly to an item or by using the "~" memory list you can add an auto-inscription. Then every similar item you find from then on will have that inscription placed on this item. If you enter a number between 0 and 9, the first item engraved with "@#" where "#" is the number you entered will be selected. For example, if you have a shovel engraved with "@0" and you type "w" (for wield) and then 0, you will wield the shovel. This is very useful for keymaps (see below), since you can use this to select an object regardless of its location in your pack. For example, Angband automatically defines a keymap for the key "X" to do "w0". If you then engrave both your digging instrument and your primary weapon with @0, pressing X will wield whichever one is not being currently wielded (letting you quickly switch between them). Multiple numbers can be engraved on the same object; for example, if a sword is engraved with @1@0, then either "w1" or "w0" will wield it. Since you may want different items defined with @0 you can also make an inscription "@x#" will act like "@#" but only when the current "Angband command" is "x". Thus you can put "@z4" on a rod and "@u4" on a staff, and then use both "z4" and "u4" as desired. Perhaps the most commonly inscribed items are spellbooks. Casting spells often takes at least 3 commands. The cast commmand (m or p) the book selection and the spell selection. Then you may need to select a target. For example, if you are a make and the beginner's spellbook is the first in your inventory, casting maa will cast magic missile. However, if you lose your spellbook, casting maa will cast the first spell in whatever new book is in the top of your inventory. This can be a waste in the best case scenario and exceedingly dangerous in the worst. To avoid this, it's very useful to inscribe your spellbooks with "@m1, @m2, @m3" etc. Then if you lose your first spellbook and attempt to cast magic missile by using "m1a", you will not accidentally select the wrong spellbook, if the first spellbook is not in your inventory. You can also use inscriptions to force the game to prompt you on whether or not you want to use that object. Any object containing "!x" in its inscription, where "x" is the current "angband command" (or containing "!*" for all commands) will induce "verification" whenever that object is "selected". Thus, inscribing, say, "!v!k!d" on an object will greatly reduce the odds of you "losing" it by accident, and inscribing "!*" on an object will allow you to be very paranoid about using the object. Note that "selling" and "dropping" both use the "d" command. === User Pref Files === Angband allows you to change various aspects of the game to suit your tastes. You may define keymaps (changing the way Angband maps your keypresses to underlying commands), modify the visuals (allowing you to change the appearance of monsters, objects, or terrain features), change the colors (allowing you to make a given color brighter, darker, or even completely different), or set options (turning them off or on). Angband stores your preferences in files called "user pref files", which contain comments and "user pref commands", which are simple strings describing one aspect of the system about which the user has a preference. There are many ways to load a user pref file, and in fact, some of these files are automatically loaded for you by the game. All of the files are kept in the "lib/user/" directory, though you may have to use one of the command line arguments to redirect this directory, especially on multiuser systems. You may also enter single user pref commands directly, using the special "Enter a user pref command" command, activated by "double quote". You may have to use the "redraw" command (^R) after changing certain of the aspects of the game, to allow Angband to adapt to your changes. When the game starts up, after you have loaded an old character, or created a new character, some user pref files are loaded automatically. First, the "pref.prf" file is loaded. This file contains some user pref commands which will work on all platforms. Then one of "font-xxx.prf" (for normal usage) or "graf-xxx.prf" (for bitmap usage) is loaded. These files contain attr/char changes to allow the monsters, objects, and/or terrain features to look "better" on your system. Then the "pref-xxx.prf" file is loaded. This file contains pre-defined system specific stuff (keymaps, color definitions, etc). Then, the "user-xxx.prf" file is loaded. This file contains user-defined system specific stuff. The "user-xxx.prf" file is used as the "default" user pref file in many places. The "xxx" is the "system suffix" for your system, taken from the "main-xxx.c" file which was used to generate your executable. Finally, the "Race.prf", "Class.prf", and "Name.prf" files are loaded, where "Race", "Class", and "Name" are replaced by the actual race, class, and name of the current character. Several options menu items allow you to load existing user pref files, create new user pref files, append information to existing user pref files, and/or interact with various of the user preferences. === Subwindows === In addition to the main window, you can create additional window displays that have other secondary information on them. You can access the subwindow menu by using "=" then "w". You can select what windows to display. You may then need to make the window visible using the "window" pull down menu from the menu bar. There are a variety of subwindow choices and you should experiment to see which ones are the most useful for you. === User Pref Files (Keymaps) === The "Interact with keymaps" menu allows you to define "keymaps", which maps a single keypress to a series of keypresses. Keymaps are not recursive; i.e. keypresses in the action field do not get expanded again. Angband uses keymaps to map the original and the roguelike keysets to the underlying command set, and allows the user to modify or add keymaps of their own. Note that all keymap actions must be specified using underlying commands, not keypresses from the original or roguelike keysets. The original keyset is almost identical to the underlying keyset, except that "numbers" are mapped to ";" plus a direction, "5" is mapped to ",", and a few control-keys are mapped to various things. See "command.txt" for the full set of underlying commands. Some uses for keymaps include the ability to "disable" a command by mapping it to "\x00". Keymaps can be specified in user pref files as lines of the form "A:" and "C::", where is the keyset (0/1 for original/roguelike), is the encoded keypress, and is the encoded keymap action. Note that any keys that are not required for access to the underlying command set may be used by the user to extend the "keyset" which is being used, by defining new "keymaps". To avoid the use of any "keymaps", press backslash ("\") plus the "underlying command" key. You may enter "control-keys" as a caret ("^") plus the key (so "^" + "p" yields "^P"). === User Pref Files (Visuals) === You can use the "Interact with visuals" menu to change various visual information, currently including the choice of what attr/char values are used to represent various monsters, objects, or terrain features. Note that in combination appropriate support in "main-xxx.c", and with the use of the "use_graphics" flag, you may be able to specify that "graphic bitmaps" should be used instead of normal "colored characters" for various things. When interactively modifying the attr/char values for monsters, objects, or terrain features, pressing "n" or "N" will change which entry you are changing, pressing "a" or "A" will rotate through the available attr values, and pressing "c" or "C" will rotate though the available char values. Note that attr/char values with the "high bit" set may induce the display of special "graphic" pictures if the "use_graphics" flag is set, and your system supports the "use_graphics" flag. Note that this menu can be abused in various ways, and if you must do so, remember that you are only cheating yourself. Keymaps can be specified in user pref files as lines of the form "R::/" or "K::/" or "F::/" or "U::/". === User Pref Files (Colors) === The "Interact with colors" menu allows you to change the actual internal values used to display various colors. This command may or may not have any effect on your machine. Advanced machines may allow you to change the actual RGB values used to represent each of the 16 colors used by Angband, and perhaps even allow you to define new colors which are not currently used by Angband. Colors can be specified in user pref files as lines of the form "V:::::". === User Pref Files (Options) === The "Interact with options" command allows you to turn options on or off. You may turn options off or on using the user pref commands of the form "X:/" or "K::/" or "F::/" or "U::/". --- User Pref Files (Colors) --- The "Interact with colors" menu allows you to change the actual internal values used to display various colors. This command may or may not have any effect on your machine. Advanced machines may allow you to change the actual RGB values used to represent each of the 16 colors used by Angband, and perhaps even allow you to define new colors which are not currently used by Angband. Colors can be specified in user pref files as lines of the form "V:::::". --- User Pref Files (Options) --- The "Interact with options" menu allows you to turn options on or off. You may also turn options off or on using user pref file lines of the form "X:

"); text_out(" and "); text_out_c(TERM_L_GREEN, ""); text_out(" look around. '"); text_out_c(TERM_L_GREEN, "g"); text_out(" moves to the selection. '"); text_out_c(TERM_L_GREEN, "p"); text_out("' selects the player. '"); text_out_c(TERM_L_GREEN, "q"); text_out("' exits. '"); text_out_c(TERM_L_GREEN, "r"); text_out("' displays details. '"); if (free) { text_out_c(TERM_L_GREEN, "m"); text_out("' restricts to interesting places. "); } else { text_out_c(TERM_L_GREEN, "+"); text_out("' and '"); text_out_c(TERM_L_GREEN, "-"); text_out("' cycle through interesting places. '"); text_out_c(TERM_L_GREEN, "o"); text_out("' allows free selection. "); } if (monster || free) { text_out("'"); text_out_c(TERM_L_GREEN, "t"); text_out("' targets the current selection."); } /* Reset */ text_out_indent = 0; } /* * Examine a grid, return a keypress. * * The "mode" argument contains the "TARGET_LOOK" bit flag, which * indicates that the "space" key should scan through the contents * of the grid, instead of simply returning immediately. This lets * the "look" command get complete information, without making the * "target" command annoying. * * The "info" argument contains the "commands" which should be shown * inside the "[xxx]" text. This string must never be empty, or grids * containing monsters will be displayed with an extra comma. * * Note that if a monster is in the grid, we update both the monster * recall info and the health bar info to track that monster. * * This function correctly handles multiple objects per grid, and objects * and terrain features in the same grid, though the latter never happens. * * This function must handle blindness/hallucination. */ static struct keypress target_set_interactive_aux(int y, int x, int mode) { s16b this_o_idx = 0, next_o_idx = 0; const char *s1, *s2, *s3; bool boring; int feat; int floor_list[MAX_FLOOR_STACK]; int floor_num; struct keypress query; char out_val[256]; char coords[20]; /* Describe the square location */ coords_desc(coords, sizeof(coords), y, x); /* Repeat forever */ while (1) { /* Paranoia */ query.code = ' '; /* Assume boring */ boring = TRUE; /* Default */ s1 = "You see "; s2 = ""; s3 = ""; /* The player */ if (cave->m_idx[y][x] < 0) { /* Description */ s1 = "You are "; /* Preposition */ s2 = "on "; } /* Hallucination messes things up */ if (p_ptr->timed[TMD_IMAGE]) { const char *name = "something strange"; /* Display a message */ if (p_ptr->wizard) strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s (%d:%d).", s1, s2, s3, name, coords, y, x); else strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s.", s1, s2, s3, name, coords); prt(out_val, 0, 0); move_cursor_relative(y, x); query = inkey(); /* Stop on everything but "return" */ if (query.code == '\n' || query.code == '\r') continue; return query; } /* Actual monsters */ if (cave->m_idx[y][x] > 0) { monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Visible */ if (m_ptr->ml && !m_ptr->unaware) { bool recall = FALSE; char m_name[80]; /* Not boring */ boring = FALSE; /* Get the monster name ("a kobold") */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_IND2); /* Hack -- track this monster race */ monster_race_track(m_ptr->r_idx); /* Hack -- health bar for this monster */ health_track(p_ptr, cave->m_idx[y][x]); /* Hack -- handle stuff */ handle_stuff(p_ptr); /* Interact */ while (1) { /* Recall */ if (recall) { /* Save screen */ screen_save(); /* Recall on screen */ screen_roff(m_ptr->r_idx); /* Command */ query = inkey(); /* Load screen */ screen_load(); } /* Normal */ else { char buf[80]; /* Describe the monster */ look_mon_desc(buf, sizeof(buf), cave->m_idx[y][x]); /* Describe, and prompt for recall */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%s%s (%s), %s (%d:%d).", s1, s2, s3, m_name, buf, coords, y, x); } else { strnfmt(out_val, sizeof(out_val), "%s%s%s%s (%s), %s.", s1, s2, s3, m_name, buf, coords); } prt(out_val, 0, 0); /* Place cursor */ move_cursor_relative(y, x); /* Command */ query = inkey(); } /* Normal commands */ if (query.code == 'r') recall = !recall; else break; } /* Stop on everything but "return"/"space" */ if (query.code != '\n' && query.code != '\r' && query.code != ' ') break; /* Sometimes stop at "space" key */ if ((query.code == ' ') && !(mode & (TARGET_LOOK))) break; /* Take account of gender */ if (rf_has(r_ptr->flags, RF_FEMALE)) s1 = "She is "; else if (rf_has(r_ptr->flags, RF_MALE)) s1 = "He is "; else s1 = "It is "; /* Use a verb */ s2 = "carrying "; /* Scan all objects being carried */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { char o_name[80]; object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Obtain an object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Describe the object */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s (%d:%d).", s1, s2, s3, o_name, coords, y, x); } /* Disabled since monsters now carry their drops else { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s.", s1, s2, s3, o_name, coords); } */ prt(out_val, 0, 0); move_cursor_relative(y, x); query = inkey(); /* Stop on everything but "return"/"space" */ if ((query.code != '\n') && (query.code != '\r') && (query.code != ' ')) break; /* Sometimes stop at "space" key */ if ((query.code == ' ') && !(mode & (TARGET_LOOK))) break; /* Change the intro */ s2 = "also carrying "; } /* Double break */ if (this_o_idx) break; /* Use a preposition */ s2 = "on "; } } /* Assume not floored */ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), y, x, 0x02); /* Scan all marked objects in the grid */ if ((floor_num > 0) && (!(p_ptr->timed[TMD_BLIND]) || (y == p_ptr->py && x == p_ptr->px))) { /* Not boring */ boring = FALSE; track_object(-floor_list[0]); handle_stuff(p_ptr); /* If there is more than one item... */ if (floor_num > 1) while (1) { /* Describe the pile */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%sa pile of %d objects, %s (%d:%d).", s1, s2, s3, floor_num, coords, y, x); } else { strnfmt(out_val, sizeof(out_val), "%s%s%sa pile of %d objects, %s.", s1, s2, s3, floor_num, coords); } prt(out_val, 0, 0); move_cursor_relative(y, x); query = inkey(); /* Display objects */ if (query.code == 'r') { int rdone = 0; int pos; while (!rdone) { /* Save screen */ screen_save(); /* Display */ show_floor(floor_list, floor_num, (OLIST_WEIGHT | OLIST_GOLD)); /* Describe the pile */ prt(out_val, 0, 0); query = inkey(); /* Load screen */ screen_load(); pos = query.code - 'a'; if (0 <= pos && pos < floor_num) { track_object(-floor_list[pos]); handle_stuff(p_ptr); continue; } rdone = 1; } /* Now that the user's done with the display loop, let's */ /* the outer loop over again */ continue; } /* Done */ break; } /* Only one object to display */ else { char o_name[80]; /* Get the single object in the list */ object_type *o_ptr = object_byid(floor_list[0]); /* Not boring */ boring = FALSE; /* Obtain an object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Describe the object */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s (%d:%d).", s1, s2, s3, o_name, coords, y, x); } else { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s.", s1, s2, s3, o_name, coords); } prt(out_val, 0, 0); move_cursor_relative(y, x); query = inkey(); /* Stop on everything but "return"/"space" */ if ((query.code != '\n') && (query.code != '\r') && (query.code != ' ')) break; /* Sometimes stop at "space" key */ if ((query.code == ' ') && !(mode & (TARGET_LOOK))) break; /* Change the intro */ s1 = "It is "; /* Plurals */ if (o_ptr->number != 1) s1 = "They are "; /* Preposition */ s2 = "on "; } } /* Double break */ if (this_o_idx) break; /* Feature (apply "mimic") */ feat = f_info[cave->feat[y][x]].mimic; /* Require knowledge about grid, or ability to see grid */ if (!(cave->info[y][x] & (CAVE_MARK)) && !player_can_see_bold(y,x)) { /* Forget feature */ feat = FEAT_NONE; } /* Terrain feature if needed */ if (boring || (feat > FEAT_INVIS)) { const char *name = f_info[feat].name; /* Hack -- handle unknown grids */ if (feat == FEAT_NONE) name = "unknown grid"; /* Pick a prefix */ if (*s2 && (feat >= FEAT_DOOR_HEAD)) s2 = "in "; /* Pick proper indefinite article */ s3 = (is_a_vowel(name[0])) ? "an " : "a "; /* Hack -- special introduction for store doors */ if ((feat >= FEAT_SHOP_HEAD) && (feat <= FEAT_SHOP_TAIL)) { s3 = "the entrance to the "; } /* Display a message */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s (%d:%d).", s1, s2, s3, name, coords, y, x); } else { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s.", s1, s2, s3, name, coords); } prt(out_val, 0, 0); move_cursor_relative(y, x); query = inkey(); /* Stop on everything but "return"/"space" */ if ((query.code != '\n') && (query.code != '\r') && (query.code != ' ')) break; } /* Stop on everything but "return" */ if ((query.code != '\n') && (query.code != '\r')) break; } /* Keep going */ return (query); } bool target_set_closest(int mode) { int y, x, m_idx; monster_type *m_ptr; char m_name[80]; bool visibility; struct point_set *targets; /* Cancel old target */ target_set_monster(0); /* Get ready to do targetting */ targets = target_set_interactive_prepare(mode); /* If nothing was prepared, then return */ if (point_set_size(targets) < 1) { msg("No Available Target."); point_set_dispose(targets); return FALSE; } /* Find the first monster in the queue */ y = targets->pts[0].y; x = targets->pts[0].x; m_idx = cave->m_idx[y][x]; /* Target the monster, if possible */ if ((m_idx <= 0) || !target_able(m_idx)) { msg("No Available Target."); point_set_dispose(targets); return FALSE; } /* Target the monster */ m_ptr = cave_monster(cave, m_idx); monster_desc(m_name, sizeof(m_name), m_ptr, 0x00); if (!(mode & TARGET_QUIET)) msg("%^s is targeted.", m_name); Term_fresh(); /* Set up target information */ monster_race_track(m_ptr->r_idx); health_track(p_ptr, cave->m_idx[y][x]); target_set_monster(m_idx); /* Visual cue */ Term_get_cursor(&visibility); (void)Term_set_cursor(TRUE); move_cursor_relative(y, x); Term_redraw_section(x, y, x, y); /* TODO: what's an appropriate amount of time to spend highlighting */ Term_xtra(TERM_XTRA_DELAY, 150); (void)Term_set_cursor(visibility); point_set_dispose(targets); return TRUE; } /** * Draw a visible path over the squares between (x1,y1) and (x2,y2). * * The path consists of "*", which are white except where there is a * monster, object or feature in the grid. * * This routine has (at least) three weaknesses: * - remembered objects/walls which are no longer present are not shown, * - squares which (e.g.) the player has walked through in the dark are * treated as unknown space. * - walls which appear strange due to hallucination aren't treated correctly. * * The first two result from information being lost from the dungeon arrays, * which requires changes elsewhere */ static int draw_path(u16b path_n, u16b *path_g, char *c, byte *a, int y1, int x1) { int i; bool on_screen; /* No path, so do nothing. */ if (path_n < 1) return 0; /* The starting square is never drawn, but notice if it is being * displayed. In theory, it could be the last such square. */ on_screen = panel_contains(y1, x1); /* Draw the path. */ for (i = 0; i < path_n; i++) { byte colour; /* Find the co-ordinates on the level. */ int y = GRID_Y(path_g[i]); int x = GRID_X(path_g[i]); /* * As path[] is a straight line and the screen is oblong, * there is only section of path[] on-screen. * If the square being drawn is visible, this is part of it. * If none of it has been drawn, continue until some of it * is found or the last square is reached. * If some of it has been drawn, finish now as there are no * more visible squares to draw. */ if (panel_contains(y,x)) on_screen = TRUE; else if (on_screen) break; else continue; /* Find the position on-screen */ move_cursor_relative(y,x); /* This square is being overwritten, so save the original. */ Term_what(Term->scr->cx, Term->scr->cy, a+i, c+i); /* Choose a colour. */ if (cave->m_idx[y][x] && cave_monster(cave, cave->m_idx[y][x])->ml) { /* Visible monsters are red. */ monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /*mimics act as objects*/ if (rf_has(r_ptr->flags, RF_UNAWARE)) colour = TERM_YELLOW; else colour = TERM_L_RED; } else if (cave->o_idx[y][x] && object_byid(cave->o_idx[y][x])->marked) /* Known objects are yellow. */ colour = TERM_YELLOW; else if (!cave_floor_bold(y,x) && ((cave->info[y][x] & (CAVE_MARK)) || player_can_see_bold(y,x))) /* Known walls are blue. */ colour = TERM_BLUE; else if (!(cave->info[y][x] & (CAVE_MARK)) && !player_can_see_bold(y,x)) /* Unknown squares are grey. */ colour = TERM_L_DARK; else /* Unoccupied squares are white. */ colour = TERM_WHITE; /* Draw the path segment */ (void)Term_addch(colour, '*'); } return i; } /** * Load the attr/char at each point along "path" which is on screen from * "a" and "c". This was saved in draw_path(). */ static void load_path(u16b path_n, u16b *path_g, char *c, byte *a) { int i; for (i = 0; i < path_n; i++) { int y = GRID_Y(path_g[i]); int x = GRID_X(path_g[i]); if (!panel_contains(y, x)) continue; move_cursor_relative(y, x); Term_addch(a[i], c[i]); } Term_fresh(); } /* * Handle "target" and "look". * * Note that this code can be called from "get_aim_dir()". * * Currently, when "flag" is true, that is, when * "interesting" grids are being used, and a directional key is used, we * only scroll by a single panel, in the direction requested, and check * for any interesting grids on that panel. The "correct" solution would * actually involve scanning a larger set of grids, including ones in * panels which are adjacent to the one currently scanned, but this is * overkill for this function. XXX XXX * * Hack -- targetting/observing an "outer border grid" may induce * problems, so this is not currently allowed. * * The player can use the direction keys to move among "interesting" * grids in a heuristic manner, or the "space", "+", and "-" keys to * move through the "interesting" grids in a sequential manner, or * can enter "location" mode, and use the direction keys to move one * grid at a time in any direction. The "t" (set target) command will * only target a monster (as opposed to a location) if the monster is * target_able and the "interesting" mode is being used. * * The current grid is described using the "look" method above, and * a new command may be entered at any time, but note that if the * "TARGET_LOOK" bit flag is set (or if we are in "location" mode, * where "space" has no obvious meaning) then "space" will scan * through the description of the current grid until done, instead * of immediately jumping to the next "interesting" grid. This * allows the "target" command to retain its old semantics. * * The "*", "+", and "-" keys may always be used to jump immediately * to the next (or previous) interesting grid, in the proper mode. * * The "return" key may always be used to scan through a complete * grid description (forever). * * This command will cancel any old target, even if used from * inside the "look" command. * * * 'mode' is one of TARGET_LOOK or TARGET_KILL. * 'x' and 'y' are the initial position of the target to be highlighted, * or -1 if no location is specified. * Returns TRUE if a target has been successfully set, FALSE otherwise. */ bool target_set_interactive(int mode, int x, int y) { int py = p_ptr->py; int px = p_ptr->px; int path_n; u16b path_g[256]; int i, d, m, t, bd; int wid, hgt, help_prompt_loc; bool done = FALSE; bool flag = TRUE; bool help = FALSE; struct keypress query; /* These are used for displaying the path to the target */ char path_char[MAX_RANGE]; byte path_attr[MAX_RANGE]; struct point_set *targets; /* If we haven't been given an initial location, start on the player. */ if (x == -1 || y == -1) { x = p_ptr->px; y = p_ptr->py; } /* If we /have/ been given an initial location, make sure we honour it by going into "free targetting" mode. */ else { flag = FALSE; } /* Cancel target */ target_set_monster(0); /* Cancel tracking */ /* health_track(0); */ /* Calculate the window location for the help prompt */ Term_get_size(&wid, &hgt); help_prompt_loc = hgt - 1; /* Display the help prompt */ prt("Press '?' for help.", help_prompt_loc, 0); /* Prepare the target set */ targets = target_set_interactive_prepare(mode); /* Start near the player */ m = 0; /* Interact */ while (!done) { bool path_drawn = FALSE; /* Interesting grids */ if (flag && point_set_size(targets)) { y = targets->pts[m].y; x = targets->pts[m].x; /* Adjust panel if needed */ if (adjust_panel_help(y, x, help)) handle_stuff(p_ptr); /* Update help */ if (help) { bool good_target = (cave->m_idx[y][x] > 0) && target_able(cave->m_idx[y][x]); target_display_help(good_target, !(flag && point_set_size(targets))); } /* Find the path. */ path_n = project_path(path_g, MAX_RANGE, py, px, y, x, PROJECT_THRU); /* Draw the path in "target" mode. If there is one */ if (mode & (TARGET_KILL)) path_drawn = draw_path(path_n, path_g, path_char, path_attr, py, px); /* Describe and Prompt */ query = target_set_interactive_aux(y, x, mode); /* Remove the path */ if (path_drawn) load_path(path_n, path_g, path_char, path_attr); /* Cancel tracking */ /* health_track(0); */ /* Assume no "direction" */ d = 0; /* Analyze */ switch (query.code) { case ESCAPE: case 'q': { done = TRUE; break; } case ' ': case '*': case '+': { if (++m == point_set_size(targets)) m = 0; break; } case '-': { if (m-- == 0) m = point_set_size(targets) - 1; break; } case 'p': { /* Recenter around player */ verify_panel(); /* Handle stuff */ handle_stuff(p_ptr); y = p_ptr->py; x = p_ptr->px; } case 'o': { flag = FALSE; break; } case 'm': { break; } case 't': case '5': case '0': case '.': { int m_idx = cave->m_idx[y][x]; if ((m_idx > 0) && target_able(m_idx)) { health_track(p_ptr, m_idx); target_set_monster(m_idx); done = TRUE; } else { bell("Illegal target!"); } break; } case 'g': { cmd_insert(CMD_PATHFIND); cmd_set_arg_point(cmd_get_top(), 0, y, x); done = TRUE; break; } case '?': { help = !help; /* Redraw main window */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); Term_clear(); handle_stuff(p_ptr); if (!help) prt("Press '?' for help.", help_prompt_loc, 0); break; } default: { /* Extract direction */ d = target_dir(query); /* Oops */ if (!d) bell("Illegal command for target mode!"); break; } } /* Hack -- move around */ if (d) { int old_y = targets->pts[m].y; int old_x = targets->pts[m].x; /* Find a new monster */ i = target_pick(old_y, old_x, ddy[d], ddx[d], targets); /* Scroll to find interesting grid */ if (i < 0) { int old_wy = Term->offset_y; int old_wx = Term->offset_x; /* Change if legal */ if (change_panel(d)) { /* Recalculate interesting grids */ point_set_dispose(targets); targets = target_set_interactive_prepare(mode); /* Find a new monster */ i = target_pick(old_y, old_x, ddy[d], ddx[d], targets); /* Restore panel if needed */ if ((i < 0) && modify_panel(Term, old_wy, old_wx)) { /* Recalculate interesting grids */ point_set_dispose(targets); targets = target_set_interactive_prepare(mode); } /* Handle stuff */ handle_stuff(p_ptr); } } /* Use interesting grid if found */ if (i >= 0) m = i; } } /* Arbitrary grids */ else { /* Update help */ if (help) { bool good_target = ((cave->m_idx[y][x] > 0) && target_able(cave->m_idx[y][x])); target_display_help(good_target, !(flag && point_set_size(targets))); } /* Find the path. */ path_n = project_path(path_g, MAX_RANGE, py, px, y, x, PROJECT_THRU); /* Draw the path in "target" mode. If there is one */ if (mode & (TARGET_KILL)) path_drawn = draw_path (path_n, path_g, path_char, path_attr, py, px); /* Describe and Prompt (enable "TARGET_LOOK") */ query = target_set_interactive_aux(y, x, mode | TARGET_LOOK); /* Remove the path */ if (path_drawn) load_path(path_n, path_g, path_char, path_attr); /* Cancel tracking */ /* health_track(0); */ /* Assume no direction */ d = 0; /* Analyze the keypress */ switch (query.code) { case ESCAPE: case 'q': { done = TRUE; break; } case ' ': case '*': case '+': case '-': { break; } case 'p': { /* Recenter around player */ verify_panel(); /* Handle stuff */ handle_stuff(p_ptr); y = p_ptr->py; x = p_ptr->px; } case 'o': { break; } case 'm': { flag = TRUE; m = 0; bd = 999; /* Pick a nearby monster */ for (i = 0; i < point_set_size(targets); i++) { t = distance(y, x, targets->pts[i].y, targets->pts[i].x); /* Pick closest */ if (t < bd) { m = i; bd = t; } } /* Nothing interesting */ if (bd == 999) flag = FALSE; break; } case 't': case '5': case '0': case '.': { target_set_location(y, x); done = TRUE; break; } case 'g': { cmd_insert(CMD_PATHFIND); cmd_set_arg_point(cmd_get_top(), 0, y, x); done = TRUE; break; } case '?': { help = !help; /* Redraw main window */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); Term_clear(); handle_stuff(p_ptr); if (!help) prt("Press '?' for help.", help_prompt_loc, 0); break; } default: { /* Extract a direction */ d = target_dir(query); /* Oops */ if (!d) bell("Illegal command for target mode!"); break; } } /* Handle "direction" */ if (d) { int dungeon_hgt = (p_ptr->depth == 0) ? TOWN_HGT : DUNGEON_HGT; int dungeon_wid = (p_ptr->depth == 0) ? TOWN_WID : DUNGEON_WID; /* Move */ x += ddx[d]; y += ddy[d]; /* Slide into legality */ if (x >= dungeon_wid - 1) x--; else if (x <= 0) x++; /* Slide into legality */ if (y >= dungeon_hgt - 1) y--; else if (y <= 0) y++; /* Adjust panel if needed */ if (adjust_panel_help(y, x, help)) { /* Handle stuff */ handle_stuff(p_ptr); /* Recalculate interesting grids */ point_set_dispose(targets); targets = target_set_interactive_prepare(mode); } } } } /* Forget */ point_set_dispose(targets); /* Redraw as necessary */ if (help) { p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); Term_clear(); } else { prt("", 0, 0); prt("", help_prompt_loc, 0); p_ptr->redraw |= (PR_DEPTH | PR_STATUS); } /* Recenter around player */ verify_panel(); /* Handle stuff */ handle_stuff(p_ptr); /* Failure to set target */ if (!target_set) return (FALSE); /* Success */ return (TRUE); } /** * Obtains the location the player currently targets. * * Both `col` and `row` must point somewhere, and on function termination, * contain the X and Y locations respectively. */ void target_get(s16b *col, s16b *row) { assert(col); assert(row); *col = target_x; *row = target_y; } /** * Returns the currently targeted monster index. */ s16b target_get_monster(void) { return target_who; } angband-v3.3.2/src/wiz-spoil.c0000644000175000017500000003777011651552410015515 0ustar chriscchrisc/* * File: wiz-spoil.c * Purpose: Spoiler generation * * Copyright (c) 1997 Ben Harrison, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cmds.h" #include "monster/mon-lore.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "ui-menu.h" #include "wizard.h" #include "z-file.h" #ifdef ALLOW_SPOILERS /* * The spoiler file being created */ static ang_file *fh = NULL; /* * Write out `n' of the character `c' to the spoiler file */ static void spoiler_out_n_chars(int n, char c) { while (--n >= 0) file_writec(fh, c); } /* * Write out `n' blank lines to the spoiler file */ static void spoiler_blanklines(int n) { spoiler_out_n_chars(n, '\n'); } /* * Write a line to the spoiler file and then "underline" it with hypens */ static void spoiler_underline(const char *str, char c) { text_out("%s", str); text_out("\n"); spoiler_out_n_chars(strlen(str), c); text_out("\n"); } /* * Item Spoilers by Ben Harrison (benh@phial.com) */ /* * The basic items categorized by type */ static const grouper group_item[] = { { TV_SHOT, "Ammo" }, { TV_ARROW, NULL }, { TV_BOLT, NULL }, { TV_BOW, "Bows" }, { TV_SWORD, "Weapons" }, { TV_POLEARM, NULL }, { TV_HAFTED, NULL }, { TV_DIGGING, NULL }, { TV_SOFT_ARMOR, "Armour (Body)" }, { TV_HARD_ARMOR, NULL }, { TV_DRAG_ARMOR, NULL }, { TV_CLOAK, "Armour (Misc)" }, { TV_SHIELD, NULL }, { TV_HELM, NULL }, { TV_CROWN, NULL }, { TV_GLOVES, NULL }, { TV_BOOTS, NULL }, { TV_AMULET, "Amulets" }, { TV_RING, "Rings" }, { TV_SCROLL, "Scrolls" }, { TV_POTION, "Potions" }, { TV_FOOD, "Food" }, { TV_ROD, "Rods" }, { TV_WAND, "Wands" }, { TV_STAFF, "Staffs" }, { TV_MAGIC_BOOK, "Books (Mage)" }, { TV_PRAYER_BOOK, "Books (Priest)" }, { TV_CHEST, "Chests" }, { TV_SPIKE, "Various" }, { TV_LIGHT, NULL }, { TV_FLASK, NULL }, { TV_JUNK, NULL }, { TV_BOTTLE, NULL }, { TV_SKELETON, NULL }, { 0, "" } }; /* * Describe the kind */ static void kind_info(char *buf, size_t buf_len, char *dam, size_t dam_len, char *wgt, size_t wgt_len, int *lev, s32b *val, int k) { object_kind *k_ptr; object_type *i_ptr; object_type object_type_body; int i; /* Get local object */ i_ptr = &object_type_body; /* Prepare a fake item */ object_prep(i_ptr, &k_info[k], 0, MAXIMISE); /* Obtain the "kind" info */ k_ptr = i_ptr->kind; /* Cancel bonuses */ for (i = 0; i < MAX_PVALS; i++) i_ptr->pval[i] = 0; i_ptr->to_a = 0; i_ptr->to_h = 0; i_ptr->to_d = 0; /* Level */ (*lev) = k_ptr->level; /* Make known */ object_notice_everything(i_ptr); /* Value */ (*val) = object_value(i_ptr, 1, FALSE); /* Description (too brief) */ if (buf) object_desc(buf, buf_len, i_ptr, ODESC_BASE | ODESC_SPOIL); /* Weight */ if (wgt) strnfmt(wgt, wgt_len, "%3d.%d", i_ptr->weight / 10, i_ptr->weight % 10); /* Hack */ if (!dam) return; /* Misc info */ dam[0] = '\0'; /* Damage */ switch (i_ptr->tval) { /* Bows */ case TV_BOW: { break; } /* Ammo */ case TV_SHOT: case TV_BOLT: case TV_ARROW: { strnfmt(dam, dam_len, "%dd%d", i_ptr->dd, i_ptr->ds); break; } /* Weapons */ case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { strnfmt(dam, dam_len, "%dd%d", i_ptr->dd, i_ptr->ds); break; } /* Armour */ case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { strnfmt(dam, dam_len, "%d", i_ptr->ac); break; } } } /* * Create a spoiler file for items */ static void spoil_obj_desc(const char *fname) { int i, k, s, t, n = 0; u16b who[200]; char buf[1024]; char wgt[80]; char dam[80]; const char *format = "%-51s %7s%6s%4s%9s\n"; /* We use either ascii or system-specific encoding */ int encoding = (OPT(xchars_to_file)) ? SYSTEM_SPECIFIC : ASCII; /* Open the file */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Header */ file_putf(fh, "Spoiler File -- Basic Items (%s)\n\n\n", buildid); /* More Header */ file_putf(fh, format, "Description", "Dam/AC", "Wgt", "Lev", "Cost"); file_putf(fh, format, "----------------------------------------", "------", "---", "---", "----"); /* List the groups */ for (i = 0; TRUE; i++) { /* Write out the group title */ if (group_item[i].name) { /* Hack -- bubble-sort by cost and then level */ for (s = 0; s < n - 1; s++) { for (t = 0; t < n - 1; t++) { int i1 = t; int i2 = t + 1; int e1; int e2; s32b t1; s32b t2; kind_info(NULL, 0, NULL, 0, NULL, 0, &e1, &t1, who[i1]); kind_info(NULL, 0, NULL, 0, NULL, 0, &e2, &t2, who[i2]); if ((t1 > t2) || ((t1 == t2) && (e1 > e2))) { int tmp = who[i1]; who[i1] = who[i2]; who[i2] = tmp; } } } /* Spoil each item */ for (s = 0; s < n; s++) { int e; s32b v; /* Describe the kind */ kind_info(buf, sizeof(buf), dam, sizeof(dam), wgt, sizeof(wgt), &e, &v, who[s]); /* Dump it */ x_file_putf(fh, encoding, " %-51s%7s%6s%4d%9ld\n", buf, dam, wgt, e, (long)(v)); } /* Start a new set */ n = 0; /* Notice the end */ if (!group_item[i].tval) break; /* Start a new set */ x_file_putf(fh, encoding, "\n\n%s\n\n", group_item[i].name); } /* Get legal item types */ for (k = 1; k < z_info->k_max; k++) { object_kind *k_ptr = &k_info[k]; /* Skip wrong tval's */ if (k_ptr->tval != group_item[i].tval) continue; /* Hack -- Skip instant-artifacts */ if (of_has(k_ptr->flags, OF_INSTA_ART)) continue; /* Save the index */ who[n++] = k; } } /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Message */ msg("Successfully created a spoiler file."); } /* * Artifact Spoilers by: randy@PICARD.tamu.edu (Randy Hutson) * * (Mostly) rewritten in 2002 by Andrew Sidwell and Robert Ruehlmann. */ /* * The artifacts categorized by type */ static const grouper group_artifact[] = { { TV_SWORD, "Edged Weapons" }, { TV_POLEARM, "Polearms" }, { TV_HAFTED, "Hafted Weapons" }, { TV_BOW, "Bows" }, { TV_DIGGING, "Diggers" }, { TV_SOFT_ARMOR, "Body Armor" }, { TV_HARD_ARMOR, NULL }, { TV_DRAG_ARMOR, NULL }, { TV_CLOAK, "Cloaks" }, { TV_SHIELD, "Shields" }, { TV_HELM, "Helms/Crowns" }, { TV_CROWN, NULL }, { TV_GLOVES, "Gloves" }, { TV_BOOTS, "Boots" }, { TV_LIGHT, "Light Sources" }, { TV_AMULET, "Amulets" }, { TV_RING, "Rings" }, { 0, NULL } }; /* * Hack -- Create a "forged" artifact */ bool make_fake_artifact(object_type *o_ptr, struct artifact *artifact) { object_kind *kind; /* Don't bother with empty artifacts */ if (!artifact->tval) return FALSE; /* Get the "kind" index */ kind = lookup_kind(artifact->tval, artifact->sval); if (!kind) return FALSE; /* Create the artifact */ object_prep(o_ptr, kind, 0, MAXIMISE); /* Save the name */ o_ptr->artifact = artifact; /* Extract the fields */ copy_artifact_data(o_ptr, artifact); /* Success */ o_ptr->ident |= IDENT_FAKE; return (TRUE); } /* * Create a spoiler file for artifacts */ static void spoil_artifact(const char *fname) { int i, j; object_type *i_ptr; object_type object_type_body; char buf[1024]; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump to the spoiler file */ text_out_hook = text_out_to_file; text_out_file = fh; /* Dump the header */ spoiler_underline(format("Artifact Spoilers for %s", buildid), '='); /* List the artifacts by tval */ for (i = 0; group_artifact[i].tval; i++) { /* Write out the group title */ if (group_artifact[i].name) { spoiler_blanklines(2); spoiler_underline(group_artifact[i].name, '='); spoiler_blanklines(1); } /* Now search through all of the artifacts */ for (j = 1; j < z_info->a_max; ++j) { artifact_type *a_ptr = &a_info[j]; char buf[80]; /* We only want objects in the current group */ if (a_ptr->tval != group_artifact[i].tval) continue; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Attempt to "forge" the artifact */ if (!make_fake_artifact(i_ptr, a_ptr)) continue; /* Grab artifact name */ object_desc(buf, sizeof(buf), i_ptr, ODESC_PREFIX | ODESC_COMBAT | ODESC_EXTRA | ODESC_SPOIL); /* Print name and underline */ spoiler_underline(buf, '-'); /* Write out the artifact description to the spoiler file */ object_info_spoil(fh, i_ptr, 80); /* * Determine the minimum and maximum depths an * artifact can appear, its rarity, its weight, and * its power rating. */ text_out("\nMin Level %u, Max Level %u, Generation chance %u, Power %d, %d.%d lbs\n", a_ptr->alloc_min, a_ptr->alloc_max, a_ptr->alloc_prob, object_power(i_ptr, FALSE, NULL, TRUE), (a_ptr->weight / 10), (a_ptr->weight % 10)); if (OPT(birth_randarts)) text_out("%s.\n", a_ptr->text); /* Terminate the entry */ spoiler_blanklines(2); } } /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Message */ msg("Successfully created a spoiler file."); } /* * Create a spoiler file for monsters */ static void spoil_mon_desc(const char *fname) { int i, n = 0; char buf[1024]; char nam[80]; char lev[80]; char rar[80]; char spd[80]; char ac[80]; char hp[80]; char exp[80]; u16b *who; /* We use either ascii or system-specific encoding */ int encoding = (OPT(xchars_to_file)) ? SYSTEM_SPECIFIC : ASCII; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump the header */ x_file_putf(fh, encoding, "Monster Spoilers for %s\n", buildid); x_file_putf(fh, encoding, "------------------------------------------\n\n"); /* Dump the header */ x_file_putf(fh, encoding, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info"); x_file_putf(fh, encoding, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", "----", "---", "---", "---", "--", "--", "-----------"); /* Allocate the "who" array */ who = C_ZNEW(z_info->r_max, u16b); /* Scan the monsters (except the ghost) */ for (i = 1; i < z_info->r_max - 1; i++) { monster_race *r_ptr = &r_info[i]; /* Use that monster */ if (r_ptr->name) who[n++] = (u16b)i; } /* Sort the array by dungeon depth of monsters */ sort(who, n, sizeof(*who), cmp_monsters); /* Scan again */ for (i = 0; i < n; i++) { monster_race *r_ptr = &r_info[who[i]]; const char *name = r_ptr->name; /* Get the "name" */ if (rf_has(r_ptr->flags, RF_QUESTOR)) { strnfmt(nam, sizeof(nam), "[Q] %s", name); } else if (rf_has(r_ptr->flags, RF_UNIQUE)) { strnfmt(nam, sizeof(nam), "[U] %s", name); } else { strnfmt(nam, sizeof(nam), "The %s", name); } /* Level */ strnfmt(lev, sizeof(lev), "%d", r_ptr->level); /* Rarity */ strnfmt(rar, sizeof(rar), "%d", r_ptr->rarity); /* Speed */ if (r_ptr->speed >= 110) strnfmt(spd, sizeof(spd), "+%d", (r_ptr->speed - 110)); else strnfmt(spd, sizeof(spd), "-%d", (110 - r_ptr->speed)); /* Armor Class */ strnfmt(ac, sizeof(ac), "%d", r_ptr->ac); /* Hitpoints */ strnfmt(hp, sizeof(hp), "%d", r_ptr->avg_hp); /* Experience */ strnfmt(exp, sizeof(exp), "%ld", (long)(r_ptr->mexp)); /* Hack -- use visual instead */ strnfmt(exp, sizeof(exp), "%s '%c'", attr_to_text(r_ptr->d_attr), r_ptr->d_char); /* Dump the info */ x_file_putf(fh, encoding, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", nam, lev, rar, spd, hp, ac, exp); } /* End it */ file_putf(fh, "\n"); /* Free the "who" array */ FREE(who); /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Worked */ msg("Successfully created a spoiler file."); } /* * Monster spoilers originally by: smchorse@ringer.cs.utsa.edu (Shawn McHorse) */ /* * Create a spoiler file for monsters (-SHAWN-) */ static void spoil_mon_info(const char *fname) { char buf[1024]; int i, n; u16b *who; int count = 0; /* Open the file */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump to the spoiler file */ text_out_hook = text_out_to_file; text_out_file = fh; /* Dump the header */ text_out("Monster Spoilers for %s\n", buildid); text_out("------------------------------------------\n\n"); /* Allocate the "who" array */ who = C_ZNEW(z_info->r_max, u16b); /* Scan the monsters */ for (i = 1; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; /* Use that monster */ if (r_ptr->name) who[count++] = (u16b)i; } sort(who, count, sizeof(*who), cmp_monsters); /* * List all monsters in order (except the ghost). */ for (n = 0; n < count; n++) { int r_idx = who[n]; monster_race *r_ptr = &r_info[r_idx]; /* Prefix */ if (rf_has(r_ptr->flags, RF_QUESTOR)) { text_out("[Q] "); } else if (rf_has(r_ptr->flags, RF_UNIQUE)) { text_out("[U] "); } else { text_out("The "); } /* Name */ text_out("%s (", r_ptr->name); /* ---)--- */ /* Color */ text_out(attr_to_text(r_ptr->d_attr)); /* Symbol --(-- */ text_out(" '%c')\n", r_ptr->d_char); /* Indent */ text_out("=== "); /* Number */ text_out("Num:%d ", r_idx); /* Level */ text_out("Lev:%d ", r_ptr->level); /* Rarity */ text_out("Rar:%d ", r_ptr->rarity); /* Speed */ if (r_ptr->speed >= 110) { text_out("Spd:+%d ", (r_ptr->speed - 110)); } else { text_out("Spd:-%d ", (110 - r_ptr->speed)); } /* Hitpoints */ text_out("Hp:%d ", r_ptr->avg_hp); /* Armor Class */ text_out("Ac:%d ", r_ptr->ac); /* Experience */ text_out("Exp:%ld\n", (long)(r_ptr->mexp)); /* Describe */ describe_monster(r_idx, TRUE); /* Terminate the entry */ text_out("\n"); } /* Free the "who" array */ FREE(who); /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } msg("Successfully created a spoiler file."); } static void spoiler_menu_act(const char *title, int row) { if (row == 0) spoil_obj_desc("obj-desc.spo"); else if (row == 1) spoil_artifact("artifact.spo"); else if (row == 2) spoil_mon_desc("mon-desc.spo"); else if (row == 3) spoil_mon_info("mon-info.spo"); message_flush(); } static menu_type *spoil_menu; static menu_action spoil_actions[] = { { 0, 0, "Brief Object Info (obj-desc.spo)", spoiler_menu_act }, { 0, 0, "Brief Artifact Info (artifact.spo)", spoiler_menu_act }, { 0, 0, "Brief Monster Info (mon-desc.spo)", spoiler_menu_act }, { 0, 0, "Full Monster Info (mon-info.spo)", spoiler_menu_act }, }; /* * Create Spoiler files */ void do_cmd_spoilers(void) { if (!spoil_menu) { spoil_menu = menu_new_action(spoil_actions, N_ELEMENTS(spoil_actions)); spoil_menu->selections = lower_case; spoil_menu->title = "Create spoilers"; } screen_save(); clear_from(0); menu_layout(spoil_menu, &SCREEN_REGION); menu_select(spoil_menu, 0, FALSE); screen_load(); } #endif angband-v3.3.2/src/z-virt.c0000644000175000017500000000461411651552410015002 0ustar chriscchrisc/* * File: z-virt.c * Purpose: Memory management routines * * Copyright (c) 1997 Ben Harrison. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "z-virt.h" #include "z-util.h" unsigned int mem_flags = 0; #define SZ(uptr) *((size_t *)((char *)(uptr) - sizeof(size_t))) /* * Allocate `len` bytes of memory. * * Returns: * - NULL if `len` == 0; or * - a pointer to a block of memory of at least `len` bytes * * Doesn't return on out of memory. */ void *mem_alloc(size_t len) { char *mem; /* Allow allocation of "zero bytes" */ if (len == 0) return (NULL); mem = malloc(len + sizeof(size_t)); if (!mem) quit("Out of Memory!"); mem += sizeof(size_t); if (mem_flags & MEM_POISON_ALLOC) memset(mem, 0xCC, len); SZ(mem) = len; return mem; } void *mem_zalloc(size_t len) { void *mem = mem_alloc(len); memset(mem, 0, len); return mem; } void mem_free(void *p) { if (!p) return; if (mem_flags & MEM_POISON_FREE) memset(p, 0xCD, SZ(p)); free((char *)p - sizeof(size_t)); } void *mem_realloc(void *p, size_t len) { char *m = p; /* Fail gracefully */ if (len == 0) return (NULL); m = realloc(m ? m - sizeof(size_t) : NULL, len + sizeof(size_t)); m += sizeof(size_t); /* Handle OOM */ if (!m) quit("Out of Memory!"); SZ(m) = len; return m; } /* * Duplicates an existing string `str`, allocating as much memory as necessary. */ char *string_make(const char *str) { char *res; size_t siz; /* Error-checking */ if (!str) return NULL; /* Allocate space for the string (including terminator) */ siz = strlen(str) + 1; res = mem_alloc(siz); /* Copy the string (with terminator) */ my_strcpy(res, str, siz); return res; } void string_free(char *str) { mem_free(str); } char *string_append(char *s1, const char *s2) { u32b len; if (!s1 && !s2) { return NULL; } else if (s1 && !s2) { return s1; } else if (!s1 && s2) { return string_make(s2); } len = strlen(s1); s1 = mem_realloc(s1, len + strlen(s2) + 1); strcpy(s1 + len, s2); return s1; } angband-v3.3.2/src/z-rand.h0000644000175000017500000000641311651552410014746 0ustar chriscchrisc#ifndef INCLUDED_Z_RAND_H #define INCLUDED_Z_RAND_H #include "h-basic.h" #include "defines.h" /** * A struct representing a strategy for making a dice roll. * * The result will be base + XdY + BONUS, where m_bonus is used in a * tricky way to determine BONUS. */ typedef struct random { int base; int dice; int sides; int m_bonus; } random_value; /** * The number of 32-bit integers worth of seed state. */ #define RAND_DEG 32 /* Random aspects used by damcalc, m_bonus_calc, and ranvals */ typedef enum { MINIMISE, AVERAGE, MAXIMISE, EXTREMIFY, RANDOMISE } aspect; /** * Generates a random signed long integer X where "0 <= X < M" holds. * * The integer X falls along a uniform distribution. */ #define randint0(M) ((s32b) Rand_div(M)) /** * Generates a random signed long integer X where "1 <= X <= M" holds. * * The integer X falls along a uniform distribution. */ #define randint1(M) ((s32b) Rand_div(M) + 1) /** * Generate a random signed long integer X where "A - D <= X <= A + D" holds. * Note that "rand_spread(A, D)" == "rand_range(A - D, A + D)" * * The integer X falls along a uniform distribution. */ #define rand_spread(A, D) ((A) + (randint0(1 + (D) + (D))) - (D)) /** * Return TRUE one time in `x`. */ #define one_in_(x) (!randint0(x)) /** * Whether we are currently using the "quick" method or not. */ extern bool Rand_quick; /** * The state used by the "quick" RNG. */ extern u32b Rand_value; /** * The state used by the "complex" RNG. */ extern u32b state_i; extern u32b STATE[RAND_DEG]; extern u32b z0; extern u32b z1; extern u32b z2; /** * Initialise the RNG state with the given seed. */ void Rand_state_init(u32b seed); /** * Generates a random unsigned long integer X where "0 <= X < M" holds. * * The integer X falls along a uniform distribution. */ u32b Rand_div(u32b m); /** * Generate a signed random integer within `stand` standard deviations of * `mean`, following a normal distribution. */ s16b Rand_normal(int mean, int stand); /** * Generate a semi-random number from 0 to m-1, in a way that doesn't affect * gameplay. This is intended for use by external program parts like the * main-*.c files. */ u32b Rand_simple(u32b m); /** * Emulate a number `num` of dice rolls of dice with `sides` sides. */ int damroll(int num, int sides); /** * Calculation helper function for damroll */ int damcalc(int num, int sides, aspect dam_aspect); /** * Generates a random signed long integer X where "A <= X <= B" * Note that "rand_range(0, N-1)" == "randint0(N)". * * The integer X falls along a uniform distribution. */ int rand_range(int A, int B); /** * Function used to determine enchantment bonuses, see function header for * a more complete description. */ s16b m_bonus(int max, int level); /** * Calculation helper function for m_bonus. */ s16b m_bonus_calc(int max, int level, aspect bonus_aspect); /** * Calculation helper function for random_value structs. */ int randcalc(random_value v, int level, aspect rand_aspect); /** * Test to see if a value is within a random_value's range. */ bool randcalc_valid(random_value v, int test); /** * Test to see if a random_value actually varies. */ bool randcalc_varies(random_value v); #ifdef TEST extern void rand_fix(u32b val); #endif #endif /* INCLUDED_Z_RAND_H */ angband-v3.3.2/src/stats/0000755000175000017500000000000011651552410014534 5ustar chriscchriscangband-v3.3.2/src/stats/Makefile0000644000175000017500000000010011651552410016163 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)extra.mk $(MKPATH)buildsys.mk angband-v3.3.2/src/stats/structs.h0000644000175000017500000000211411651552410016412 0ustar chriscchrisc/* * File: stats/structs.h * Purpose: data structures for lists not exported in headers elsewhere * * Copyright (c) 2011 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, * research, * and not for profit purposes provided that this copyright and * statement * are included in all such copies. Other copyrights may also apply. */ #ifndef STATS_STRUCTS_H #define STATS_STRUCTS_H #include "effects.h" #include "monster/monster.h" #include "monster/mon-spell.h" #include "object/slays.h" /* * Entries for spell/activation descriptions */ typedef struct { u16b index; /* Effect index */ bool aim; /* Whether the effect requires aiming */ u16b power; /* Power rating for obj-power.c */ const char *desc; /* Effect description */ } info_entry; #endif /* STATS_STRUCTS_H */ angband-v3.3.2/src/stats/db.h0000644000175000017500000000270311651552410015274 0ustar chriscchrisc/* * File: stats/db.h * Purpose: interface to SQLite3 database manipulation * * Copyright (c) 2011 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, * research, * and not for profit purposes provided that this copyright and * statement * are included in all such copies. Other copyrights may also apply. */ #ifndef STATS_DB_H #define STATS_DB_H #include /* Utility macro for executing and resetting a statement; assumes existence * of an integer err variable */ #define STATS_DB_STEP_RESET(s) \ err = sqlite3_step(s);\ if (err && err != SQLITE_DONE) return err;\ err = sqlite3_reset(s);\ if (err) return err; /* Utility macro for finalizing a statement; assumes existence * of an integer err variable */ #define STATS_DB_FINALIZE(s) \ err = sqlite3_finalize(s);\ if (err) return err; extern bool stats_db_open(void); extern bool stats_db_close(void); extern int stats_db_exec(char *sql_str); extern int stats_db_stmt_prep(sqlite3_stmt **sql_stmt, char *sql_str); extern int stats_db_bind_ints(sqlite3_stmt *sql_stmt, int num_cols, int offset, ...); extern int stats_db_bind_rv(sqlite3_stmt *sql_stmt, int col, random_value rv); #endif /* STATS_DB_H */ angband-v3.3.2/src/stats/db.c0000644000175000017500000001402011651552410015262 0ustar chriscchrisc/* * File: stats/db.c * Purpose: SQLite3 database storage functions * * Copyright (c) 2011 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, * research, * and not for profit purposes provided that this copyright and * statement * are included in all such copies. Other copyrights may also apply. */ #include #include #include #include "angband.h" /* Module state variables */ static sqlite3 *db; static char *ANGBAND_DIR_STATS; static char *db_filename; /* Utility functions */ static bool stats_make_output_dir(void) { size_t size = strlen(ANGBAND_DIR_USER) + strlen(PATH_SEP) + 6; ANGBAND_DIR_STATS = mem_alloc(size * sizeof(char)); path_build(ANGBAND_DIR_STATS, size, ANGBAND_DIR_USER, "stats"); if (dir_create(ANGBAND_DIR_STATS)) { return true; } else { return false; } } /* Interface functions */ /** * Call stats_db_open first to create the database file and set up a * database connection. Returns true on success, false on failure. */ bool stats_db_open(void) { size_t size; char filename_buf[20]; int result; time_t now_time = time(NULL); struct tm *now = localtime(&now_time); if (!stats_make_output_dir()) { return false; } size = strlen(ANGBAND_DIR_STATS) + strlen(PATH_SEP) + 20; db_filename = mem_alloc(size * sizeof(char)); strnfmt(filename_buf, 20, "%4d-%02d-%02dT%02d:%02d.db", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min); path_build(db_filename, size, ANGBAND_DIR_STATS, filename_buf); if (file_exists(db_filename)) { return false; } result = sqlite3_open(db_filename, &db); if (result) { sqlite3_close(db); return false; } return true; } /** * Call stats_close_db to close the database connection and free * module variables. */ bool stats_db_close(void) { sqlite3_close(db); mem_free(ANGBAND_DIR_STATS); mem_free(db_filename); return true; } /** * Evaluate a sqlite3 SQL statement on the previously opened database. * The argument sql_str should contain the SQL statement, encoded as UTF-8. * The return value is zero on success or a sqlite3 error code on failure. * This function is a wrapper around sqlite3_exec and is for statements * that don't expect output. Use stats_db_stmt_prep(), sqlite3_bind_*(), and * sqlite3_step() for more complex statements. */ int stats_db_exec(char *sql_str) { assert(strlen(sql_str) > 0); return sqlite3_exec(db, sql_str, NULL, NULL, NULL); } /** * Prepare a sqlite3 SQL statement for evaluation. sql_stmt should be a * non-NULL, unallocated pointer. The sqlite3 library will allocate memory * appropriately. The caller should later delete this statement with * sqlite3_finalize(). sql_str should contain the SQL statement, encoded * as UTF-8. The function returns 0 on success or a sqlite3 error code on * failure. */ int stats_db_stmt_prep(sqlite3_stmt **sql_stmt, char *sql_str) { assert(strlen(sql_str) > 0); assert(sql_stmt != NULL); return sqlite3_prepare_v2(db, sql_str, strlen(sql_str), sql_stmt, NULL); } /** * Utility function for binding many ints at once. The offset argument * should be the number of columns to skip before starting to bind. * Arguments after num_cols should be a series of ints to be bound to * parameters in sql_stmt, in order. */ int stats_db_bind_ints(sqlite3_stmt *sql_stmt, int num_cols, int offset, ...) { va_list vp; int err = SQLITE_OK; int col; va_start(vp, offset); for (col = offset + 1; col <= offset + num_cols; col++) { u32b value = va_arg(vp, u32b); err = sqlite3_bind_int(sql_stmt, col, value); if (err) return err; } va_end(vp); return err; } /** * Utility function for binding a random_value to a parameter as TEXT. * Note optimization for storing values without randomness. */ int stats_db_bind_rv(sqlite3_stmt *sql_stmt, int col, random_value rv) { char sql_buf[256]; if (rv.dice || rv.sides || rv.m_bonus) { strnfmt(sql_buf, 256, "%d+%dd%dM%d", rv.base, rv.dice, rv.sides, rv.m_bonus); } else { strnfmt(sql_buf, 256, "%d", rv.base); } return sqlite3_bind_text(sql_stmt, col, sql_buf, strlen(sql_buf), SQLITE_STATIC); } /** * I have chosen not to wrap the other sqlite3 core interfaces, since * they do not require access to the database connection object db. * The key functions are * * int sqlite3_bind_(sqlite3_stmt *, int, ...) * Given a previously prepared statement, bind a parameter to a value * of a given type: blob, double, int, int64, null, text, text16, * value, zeroblob. The second argument is the index of the parameter. * * int sqlite3_step(sqlite3_stmt *) * Evaluate the given statement. Returns SQLITE_DONE on successful * execution completion. For statements that return data, returns * SQLITE_ROW if a new row of data is ready for processing. Call the * function multiple times to retrieve all the rows. It may also return * other sqlite3 error codes. * * sqlite3_column_(sqlite3_stmt *, int) * Retrieve information about a column of the current result row of a * query. The second argument is the index of the column. Available * types are blob, double, int, int64, text, text16, and value. * Routines attempt unit conversion where appropriate. Use * sqlite3_column_type() to determine the datatype code of a column, * and sqlite3_column_bytes() or sqlite3_column_bytes16() to determikne * the number of bytes in a blob or string. * * int sqlite3_reset(sqlite3_stmt *) * Reset the given statement to its initial state, so that it may be * re-executed. Does not alter bindings. * * int sqlite3_clear_bindings(sqlite3_stmt *) * Reset all parameters for the given statement to NULL. * * int sqlite3_finalize(sqlite3_stmt *) * Delete the given prepared statement. */ angband-v3.3.2/src/guid.c0000644000175000017500000000120111651552410014464 0ustar chriscchrisc/* * File: guid.c * Purpose: Entity guids. * * Copyright (c) 2011 elly+angband@leptoquark.net * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "guid.h" int guid_eq(guid a, guid b) { return a == b; } angband-v3.3.2/src/snd-sdl.c0000644000175000017500000001546411651552410015120 0ustar chriscchrisc/* * File: snd-sdl.c * Purpose: SDL sound support * * Copyright (c) 2004 Brendon Oliver * Copyright (c) 2007 Andi Sidwell * A large chunk of this file was taken and modified from main-ros. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #ifdef SOUND_SDL #include "SDL.h" #include "SDL_mixer.h" /* Don't cache audio */ static bool no_cache_audio = FALSE; /* Arbitary limit on number of samples per event */ #define MAX_SAMPLES 8 /* Struct representing all data about an event sample */ typedef struct { int num; /* Number of samples for this event */ Mix_Chunk *wavs[MAX_SAMPLES]; /* Sample array */ char *paths[MAX_SAMPLES]; /* Relative pathnames for samples */ } sample_list; /* * Just need an array of SampInfos */ static sample_list samples[MSG_MAX]; /* * Shut down the sound system and free resources. */ static void close_audio(void) { size_t i; int j; /* Free all the sample data*/ for (i = 0; i < MSG_MAX; i++) { sample_list *smp = &samples[i]; /* Nuke all samples */ for (j = 0; j < smp->num; j++) { Mix_FreeChunk(smp->wavs[j]); string_free(smp->paths[j]); } } /* Close the audio */ Mix_CloseAudio(); /* XXX This may conflict with the SDL port */ SDL_Quit(); } /* * Initialise SDL and open the mixer */ static bool open_audio(void) { int audio_rate; Uint16 audio_format; int audio_channels; /* Initialize variables */ audio_rate = 22050; audio_format = AUDIO_S16; audio_channels = 2; /* Initialize the SDL library */ if (SDL_Init(SDL_INIT_AUDIO) < 0) { plog_fmt("Couldn't initialize SDL: %s", SDL_GetError()); return FALSE; } /* Try to open the audio */ if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, 4096) < 0) { plog_fmt("Couldn't open mixer: %s", SDL_GetError()); return FALSE; } /* Success */ return TRUE; } /* * Read sound.cfg and map events to sounds; then load all the sounds into * memory to avoid I/O latency later. */ static bool sound_sdl_init(bool no_cache) { char path[2048]; char buffer[2048]; ang_file *fff; /* Initialise the mixer */ if (!open_audio()) return FALSE; /* Build the "sound" path */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "sound"); if (ANGBAND_DIR_XTRA_SOUND) mem_free(ANGBAND_DIR_XTRA_SOUND); ANGBAND_DIR_XTRA_SOUND = string_make(path); /* Find and open the config file */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); fff = file_open(path, MODE_READ, -1); /* Handle errors */ if (!fff) { plog_fmt("Failed to open sound config (%s):\n %s", path, strerror(errno)); return FALSE; } /* Parse the file */ /* Lines are always of the form "name = sample [sample ...]" */ while (file_getl(fff, buffer, sizeof(buffer))) { char *msg_name; char *sample_list; char *search; char *cur_token; char *next_token; int event; /* Skip anything not beginning with an alphabetic character */ if (!buffer[0] || !isalpha((unsigned char)buffer[0])) continue; /* Split the line into two: message name, and the rest */ search = strchr(buffer, ' '); sample_list = strchr(search + 1, ' '); if (!search) continue; if (!sample_list) continue; /* Set the message name, and terminate at first space */ msg_name = buffer; search[0] = '\0'; /* Make sure this is a valid event name */ for (event = MSG_MAX - 1; event >= 0; event--) { if (strcmp(msg_name, angband_sound_name[event]) == 0) break; } if (event < 0) continue; /* Advance the sample list pointer so it's at the beginning of text */ sample_list++; if (!sample_list[0]) continue; /* Terminate the current token */ cur_token = sample_list; search = strchr(cur_token, ' '); if (search) { search[0] = '\0'; next_token = search + 1; } else { next_token = NULL; } /* * Now we find all the sample names and add them one by one */ while (cur_token) { int num = samples[event].num; /* Don't allow too many samples */ if (num >= MAX_SAMPLES) break; /* Build the path to the sample */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, cur_token); if (!file_exists(path)) goto next_token; /* Don't load now if we're not caching */ if (no_cache) { /* Just save the path for later */ samples[event].paths[num] = string_make(path); } else { /* Load the file now */ samples[event].wavs[num] = Mix_LoadWAV(path); if (!samples[event].wavs[num]) { plog_fmt("%s: %s", SDL_GetError(), strerror(errno)); goto next_token; } } /* Imcrement the sample count */ samples[event].num++; next_token: /* Figure out next token */ cur_token = next_token; if (next_token) { /* Try to find a space */ search = strchr(cur_token, ' '); /* If we can find one, terminate, and set new "next" */ if (search) { search[0] = '\0'; next_token = search + 1; } else { /* Otherwise prevent infinite looping */ next_token = NULL; } } } } /* Close the file */ file_close(fff); /* Success */ return TRUE; } /* * Play a sound of type "event". */ static void play_sound(int event) { Mix_Chunk *wave = NULL; int s; /* Paranoia */ if (event < 0 || event >= MSG_MAX) return; /* Check there are samples for this event */ if (!samples[event].num) return; /* Choose a random event */ s = randint0(samples[event].num); wave = samples[event].wavs[s]; /* Try loading it, if it's not cached */ if (!wave) { /* Verify it exists */ const char *filename = samples[event].paths[s]; if (!file_exists(filename)) return; /* Load */ wave = Mix_LoadWAV(filename); } /* Check to see if we have a wave again */ if (!wave) { plog("SDL sound load failed."); return; } /* Actually play the thing */ Mix_PlayChannel(-1, wave, 0); } /* * Init the SDL sound "module". */ errr init_sound_sdl(int argc, char **argv) { int i; /* Parse args */ for (i = 1; i < argc; i++) { if (prefix(argv[i], "-c")) { no_cache_audio = TRUE; plog("Audio cache disabled."); continue; } } /* Load sound preferences if requested */ if (!sound_sdl_init(no_cache_audio)) { plog("Failed to load sound config"); /* Failure */ return (1); } /* Enable sound */ sound_hook = play_sound; atexit(close_audio); /* Success */ return (0); } #endif /* SOUND_SDL */ angband-v3.3.2/src/guid.h0000644000175000017500000000020311651552410014472 0ustar chriscchrisc/* guid.h */ #ifndef GUID_H #define GUID_H typedef unsigned int guid; extern int guid_eq(guid a, guid b); #endif /* !GUID_H */ angband-v3.3.2/src/Makefile.nmake0000644000175000017500000000157511651552410016140 0ustar chriscchrisc# Windows Angband makefile for NMAKE and MS Visual C # # Debug build: NMAKE /F Makefile.nmake # Release build: NMAKE /F Makefile.nmake RELEASE=1 EXE = Angband.exe default: ..\$(EXE) exe: $(EXE) # tools and config CC = cl LINK = link RC = rc CFLAGS = /DWINDOWS /W3 /GF /GA /nologo LFLAGS = /nologo RCFLAGS = LIBS = Gdi32.lib User32.lib Comdlg32.lib Shell32.lib Winmm.lib !if defined(RELEASE) CFLAGS = $(CFLAGS) /O2 /Os /Gs /I. /I.. !else CFLAGS = $(CFLAGS) /Od /Zi /I. /I.. LFLAGS = $(LFLAGS) /debug !endif # files include Makefile.src OBJS = $(ANGFILES) $(ZFILES) main-win.o win\readdib.o RES = win\angband.res # rules .c.o: $(CC) /c /Fo$@ $(CFLAGS) $? $(RES) : win\angband.rc $(RC) $(RCFLAGS) $** $(EXE) : $(OBJS) $(RES) $(LINK) /out:$@ $(LFLAGS) $** $(LIBS) ..\$(EXE) : $(EXE) copy $** $@ clean: del $(OBJS) $(RES) $(EXE) angband-v3.3.2/src/variable.c0000644000175000017500000003535511651552410015342 0ustar chriscchrisc/* * File: variable.c * Purpose: Various global variables * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" /* * Hack -- Link a copyright message into the executable */ const char *copyright = "Copyright (c) 1987-2011 Angband contributors.\n" "\n" "This work is free software; you can redistribute it and/or modify it\n" "under the terms of either:\n" "\n" "a) the GNU General Public License as published by the Free Software\n" " Foundation, version 2, or\n" "\n" "b) the Angband licence:\n" " This software may be copied and distributed for educational, research,\n" " and not for profit purposes provided that this copyright and statement\n" " are included in all such copies. Other copyrights may also apply.\n"; /* * Run-time arguments */ bool arg_wizard; /* Command arg -- Request wizard mode */ bool arg_rebalance; /* Command arg -- Rebalance monsters */ int arg_graphics; /* Command arg -- Request graphics mode */ bool arg_graphics_nice; /* Command arg -- Request nice graphics mode */ #ifdef ALLOW_BORG bool screensaver = FALSE; #endif /* ALLOW_BORG */ /* * Various things */ bool character_generated; /* The character exists */ bool character_dungeon; /* The character has a dungeon */ bool character_saved; /* The character was just saved to a savefile */ s16b character_icky; /* Depth of the game in special mode */ s16b character_xtra; /* Depth of the game in startup mode */ u32b seed_randart; /* Hack -- consistent random artifacts */ u32b seed_flavor; /* Hack -- consistent object colors */ u32b seed_town; /* Hack -- consistent town layout */ s16b num_repro; /* Current reproducer count */ s32b turn; /* Current game turn */ int use_graphics; /* The "graphics" mode is enabled */ bool use_graphics_nice; /* The 'nice' "graphics" mode is enabled */ s16b signal_count; /* Hack -- Count interrupts */ bool msg_flag; /* Player has pending message */ bool inkey_xtra; /* See the "inkey()" function */ u32b inkey_scan; /* See the "inkey()" function */ bool inkey_flag; /* See the "inkey()" function */ s16b o_max = 1; /* Number of allocated objects */ s16b o_cnt = 0; /* Number of live objects */ /* * Buffer to hold the current savefile name */ char savefile[1024]; /* * The array[ANGBAND_TERM_MAX] of window pointers */ term *angband_term[ANGBAND_TERM_MAX]; /* * The array[ANGBAND_TERM_MAX] of window names (modifiable?) * * ToDo: Make the names independent of ANGBAND_TERM_MAX. */ char angband_term_name[ANGBAND_TERM_MAX][16] = { VERSION_NAME, "Term-1", "Term-2", "Term-3", "Term-4", "Term-5", "Term-6", "Term-7" }; /* * Global table of color definitions (mostly zeros) */ byte angband_color_table[MAX_COLORS][4] = { {0x00, 0x00, 0x00, 0x00}, /* 0 TERM_DARK */ {0x00, 0xff, 0xff, 0xff}, /* 1 TERM_WHITE */ {0x00, 0x80, 0x80, 0x80}, /* 2 TERM_SLATE */ {0x00, 0xff, 0x80, 0x00}, /* 3 TERM_ORANGE */ {0x00, 0xc0, 0x00, 0x00}, /* 4 TERM_RED */ {0x00, 0x00, 0x80, 0x40}, /* 5 TERM_GREEN */ {0x00, 0x00, 0x40, 0xff}, /* 6 TERM_BLUE */ {0x00, 0x80, 0x40, 0x00}, /* 7 TERM_UMBER */ {0x00, 0x60, 0x60, 0x60}, /* 8 TERM_L_DARK */ {0x00, 0xc0, 0xc0, 0xc0}, /* 9 TERM_L_WHITE */ {0x00, 0xff, 0x00, 0xff}, /* 10 TERM_L_PURPLE */ {0x00, 0xff, 0xff, 0x00}, /* 11 TERM_YELLOW */ {0x00, 0xff, 0x40, 0x40}, /* 12 TERM_L_RED */ {0x00, 0x00, 0xff, 0x00}, /* 13 TERM_L_GREEN */ {0x00, 0x00, 0xff, 0xff}, /* 14 TERM_L_BLUE */ {0x00, 0xc0, 0x80, 0x40}, /* 15 TERM_L_UMBER */ {0x00, 0x90, 0x00, 0x90}, /* 16 TERM_PURPLE */ {0x00, 0x90, 0x20, 0xff}, /* 17 TERM_VIOLET */ {0x00, 0x00, 0xa0, 0xa0}, /* 18 TERM_TEAL */ {0x00, 0x6c, 0x6c, 0x30}, /* 19 TERM_MUD */ {0x00, 0xff, 0xff, 0x90}, /* 20 TERM_L_YELLOW */ {0x00, 0xff, 0x00, 0xa0}, /* 21 TERM_MAGENTA */ {0x00, 0x20, 0xff, 0xdc}, /* 22 TERM_L_TEAL */ {0x00, 0xb8, 0xa8, 0xff}, /* 23 TERM_L_VIOLET */ {0x00, 0xff, 0x80, 0x80}, /* 24 TERM_L_PINK */ {0x00, 0xb4, 0xb4, 0x00}, /* 25 TERM_MUSTARD */ {0x00, 0xa0, 0xc0, 0xd0}, /* 26 TERM_BLUE_SLATE */ {0x00, 0x00, 0xb0, 0xff}, /* 27 TERM_DEEP_L_BLUE */ }; /* * Global array of color names and translations. */ color_type color_table[MAX_COLORS] = { /* full mono vga blind lighter darker highlight metallic misc */ {'d', "Dark", {0, 0, 0, TERM_DARK, TERM_L_DARK, TERM_DARK, TERM_L_DARK, TERM_L_DARK, TERM_DARK}}, {'w', "White", {1, 1, 1, TERM_WHITE, TERM_YELLOW, TERM_SLATE, TERM_L_BLUE, TERM_YELLOW, TERM_WHITE}}, {'s', "Slate", {2, 1, 2, TERM_SLATE, TERM_L_WHITE, TERM_L_DARK, TERM_L_WHITE, TERM_L_WHITE, TERM_SLATE}}, {'o', "Orange", {3, 1, 3, TERM_L_WHITE, TERM_YELLOW, TERM_SLATE, TERM_YELLOW, TERM_YELLOW, TERM_ORANGE}}, {'r', "Red", {4, 1, 4, TERM_SLATE, TERM_L_RED, TERM_SLATE, TERM_L_RED, TERM_L_RED, TERM_RED}}, {'g', "Green", {5, 1, 5, TERM_SLATE, TERM_L_GREEN, TERM_SLATE, TERM_L_GREEN, TERM_L_GREEN, TERM_GREEN}}, {'b', "Blue", {6, 1, 6, TERM_SLATE, TERM_L_BLUE, TERM_SLATE, TERM_L_BLUE, TERM_L_BLUE, TERM_BLUE}}, {'u', "Umber", {7, 1, 7, TERM_L_DARK, TERM_L_UMBER, TERM_L_DARK, TERM_L_UMBER, TERM_L_UMBER, TERM_UMBER}}, {'D', "Light Dark", {8, 1, 8, TERM_L_DARK, TERM_SLATE, TERM_L_DARK, TERM_SLATE, TERM_SLATE, TERM_L_DARK}}, {'W', "Light Slate", {9, 1, 9, TERM_L_WHITE, TERM_WHITE, TERM_SLATE, TERM_WHITE, TERM_WHITE, TERM_SLATE}}, {'P', "Light Purple", {10, 1, 10, TERM_SLATE, TERM_YELLOW, TERM_SLATE, TERM_YELLOW, TERM_YELLOW, TERM_L_PURPLE}}, {'y', "Yellow", {11, 1, 11, TERM_L_WHITE, TERM_L_YELLOW, TERM_L_WHITE, TERM_WHITE, TERM_WHITE, TERM_YELLOW}}, {'R', "Light Red", {12, 1, 12, TERM_L_WHITE, TERM_YELLOW, TERM_RED, TERM_YELLOW, TERM_YELLOW, TERM_L_RED}}, {'G', "Light Green", {13, 1, 13, TERM_L_WHITE, TERM_YELLOW, TERM_GREEN, TERM_YELLOW, TERM_YELLOW, TERM_L_GREEN}}, {'B', "Light Blue", {14, 1, 14, TERM_L_WHITE, TERM_YELLOW, TERM_BLUE, TERM_YELLOW, TERM_YELLOW, TERM_L_BLUE}}, {'U', "Light Umber", {15, 1, 15, TERM_L_WHITE, TERM_YELLOW, TERM_UMBER, TERM_YELLOW, TERM_YELLOW, TERM_L_UMBER}}, /* "new" colors */ {'p', "Purple", {16, 1, 10,TERM_SLATE, TERM_L_PURPLE, TERM_SLATE, TERM_L_PURPLE, TERM_L_PURPLE, TERM_L_PURPLE}}, {'v', "Violet", {17, 1, 10,TERM_SLATE, TERM_L_PURPLE, TERM_SLATE, TERM_L_PURPLE, TERM_L_PURPLE, TERM_L_PURPLE}}, {'t', "Teal", {18, 1, 6, TERM_SLATE, TERM_L_TEAL, TERM_SLATE, TERM_L_TEAL, TERM_L_TEAL, TERM_L_BLUE}}, {'m', "Mud", {19, 1, 5, TERM_SLATE, TERM_MUSTARD, TERM_SLATE, TERM_MUSTARD, TERM_MUSTARD, TERM_UMBER}}, {'Y', "Light Yellow", {20, 1, 11, TERM_WHITE, TERM_WHITE, TERM_YELLOW, TERM_WHITE, TERM_WHITE, TERM_L_YELLOW}}, {'i', "Magenta-Pink", {21, 1, 12, TERM_SLATE, TERM_L_PINK, TERM_RED, TERM_L_PINK, TERM_L_PINK, TERM_L_PURPLE}}, {'T', "Light Teal", {22, 1, 14, TERM_L_WHITE, TERM_YELLOW, TERM_TEAL, TERM_YELLOW, TERM_YELLOW, TERM_L_BLUE}}, {'V', "Light Violet", {23, 1, 10, TERM_L_WHITE, TERM_YELLOW, TERM_VIOLET, TERM_YELLOW, TERM_YELLOW, TERM_L_PURPLE}}, {'I', "Light Pink", {24, 1, 12, TERM_L_WHITE, TERM_YELLOW, TERM_MAGENTA, TERM_YELLOW, TERM_YELLOW, TERM_L_PURPLE}}, {'M', "Mustard", {25, 1, 11, TERM_SLATE, TERM_YELLOW, TERM_SLATE, TERM_YELLOW, TERM_YELLOW, TERM_YELLOW}}, {'z', "Blue Slate", {26, 1, 9, TERM_SLATE, TERM_DEEP_L_BLUE, TERM_SLATE, TERM_DEEP_L_BLUE, TERM_DEEP_L_BLUE, TERM_L_WHITE}}, {'Z', "Deep Light Blue", {27, 1, 14, TERM_L_WHITE, TERM_L_BLUE, TERM_BLUE_SLATE, TERM_L_BLUE, TERM_L_BLUE, TERM_L_BLUE}}, /* Rest to be filled in when the game loads */ }; /* * Standard sound (and message) names */ const const char *angband_sound_name[MSG_MAX] = { "", "hit", "miss", "flee", "drop", "kill", "level", "death", "study", "teleport", "shoot", "quaff", "zap_rod", "walk", "tpother", "hitwall", "eat", "store1", "store2", "store3", "store4", "dig", "opendoor", "shutdoor", "tplevel", "bell", "nothing_to_open", "lockpick_fail", "stairs_down", "hitpoint_warn", "act_artifact", "use_staff", "destroy", "mon_hit", "mon_touch", "mon_punch", "mon_kick", "mon_claw", "mon_bite", "mon_sting", "mon_butt", "mon_crush", "mon_engulf", "mon_crawl", "mon_drool", "mon_spit", "mon_gaze", "mon_wail", "mon_spore", "mon_beg", "mon_insult", "mon_moan", "recover", "blind", "confused", "poisoned", "afraid", "paralyzed", "drugged", "speed", "slow", "shield", "blessed", "hero", "berserk", "bold", "prot_evil", "invuln", "see_invis", "infrared", "res_acid", "res_elec", "res_fire", "res_cold", "res_pois", "stun", "cut", "stairs_up", "store_enter", "store_leave", "store_home", "money1", "money2", "money3", "shoot_hit", "store5", "lockpick", "disarm", "identify_bad", "identify_ego", "identify_art", "breathe_elements", "breathe_frost", "breathe_elec", "breathe_acid", "breathe_gas", "breathe_fire", "breathe_confusion", "breathe_disenchant", "breathe_chaos", "breathe_shards", "breathe_sound", "breathe_light", "breathe_dark", "breathe_nether", "breathe_nexus", "breathe_time", "breathe_inertia", "breathe_gravity", "breathe_plasma", "breathe_force", "summon_monster", "summon_angel", "summon_undead", "summon_animal", "summon_spider", "summon_hound", "summon_hydra", "summon_demon", "summon_dragon", "summon_gr_undead", "summon_gr_dragon", "summon_gr_demon", "summon_ringwraith", "summon_unique", "wield", "cursed", "pseudo_id", "hungry", "notice", "ambient_day", "ambient_nite", "ambient_dng1", "ambient_dng2", "ambient_dng3", "ambient_dng4", "ambient_dng5", "mon_create_trap", "mon_shriek", "mon_cast_fear", "hit_good", "hit_great", "hit_superb", "hit_hi_great", "hit_hi_superb", "cast_spell", "pray_prayer", "kill_unique", "kill_king", "drain_stat", "multiply" }; /* * Arrays[TEMP_MAX] used for various things */ u16b *temp_g; /* * Array[z_info->r_max] of monster lore */ monster_lore *l_list; /* * Hack -- Array[MAX_Q_IDX] of quests */ quest *q_list; /* * Array[MAX_STORES] of stores */ struct store *stores; /* * Flag to override which store is selected if in a knowledge menu */ int store_knowledge = STORE_NONE; /* * Array[RANDNAME_NUM_TYPES][num_names] of random names */ const char *** name_sections; /* * The size of the "alloc_ego_table" */ s16b alloc_ego_size; /* * The array[alloc_ego_size] of entries in the "ego allocator table" */ alloc_entry *alloc_ego_table; /* * The size of "alloc_race_table" (at most z_info->r_max) */ s16b alloc_race_size; /* * The array[alloc_race_size] of entries in the "race allocator table" */ alloc_entry *alloc_race_table; /* * Specify attr/char pairs for visual special effects for project() */ byte gf_to_attr[GF_MAX][BOLT_MAX]; char gf_to_char[GF_MAX][BOLT_MAX]; /* * Specify color for inventory item text display (by tval) * Be sure to use "index & 0x7F" to avoid illegal access */ byte tval_to_attr[128]; /*** Player information ***/ /* * The player other record (static) */ static player_other player_other_body; /* * Pointer to the player other record */ player_other *op_ptr = &player_other_body; /* * The player info record (static) */ static player_type player_type_body; /* * Pointer to the player info record */ player_type *p_ptr = &player_type_body; /* * Structure (not array) of size limits */ maxima *z_info; /* * The vault generation arrays */ feature_type *f_info; object_kind *k_info; object_base *kb_info; /* * The artifact arrays */ artifact_type *a_info; /* * The ego-item arrays */ ego_item_type *e_info; /* * The monster race arrays */ monster_race *r_info; monster_base *rb_info; monster_pain *pain_messages; struct player_race *races; struct player_class *classes; struct vault *vaults; struct object_kind *objkinds; struct flavor *flavors; /* * The spell arrays */ spell_type *s_info; /* * The hints array */ struct hint *hints; /* * Array of pit types */ struct pit_profile *pit_info; /* * Hack -- The special Angband "System Suffix" * This variable is used to choose an appropriate "pref-xxx" file */ const char *ANGBAND_SYS = "xxx"; /* * Hack -- The special Angband "Graphics Suffix" * This variable is used to choose an appropriate "graf-xxx" file */ const char *ANGBAND_GRAF = "old"; /* * Various directories. These are no longer necessarily all subdirs of "lib" */ char *ANGBAND_DIR_APEX; char *ANGBAND_DIR_EDIT; char *ANGBAND_DIR_FILE; char *ANGBAND_DIR_HELP; char *ANGBAND_DIR_INFO; char *ANGBAND_DIR_SAVE; char *ANGBAND_DIR_PREF; char *ANGBAND_DIR_USER; char *ANGBAND_DIR_XTRA; /* * Various xtra/ subdirectories. */ char *ANGBAND_DIR_XTRA_FONT; char *ANGBAND_DIR_XTRA_GRAF; char *ANGBAND_DIR_XTRA_SOUND; char *ANGBAND_DIR_XTRA_ICON; /* * Total Hack -- allow all items to be listed (even empty ones) * This is only used by "do_cmd_inven_e()" and is cleared there. */ bool item_tester_full; /* * Here is a "pseudo-hook" used during calls to "get_item()" and * "show_inven()" and "show_equip()", and the choice window routines. */ byte item_tester_tval; /* * Here is a "hook" used during calls to "get_item()" and * "show_inven()" and "show_equip()", and the choice window routines. */ bool (*item_tester_hook)(const object_type*); /* * Hack -- function hook to restrict "get_mon_num_prep()" function */ bool (*get_mon_num_hook)(int r_idx); /* * Hack - the destination file for text_out_to_file. */ ang_file *text_out_file = NULL; /* * Hack -- function hook to output (colored) text to the * screen or to a file. */ void (*text_out_hook)(byte a, const char *str); /* * Hack -- Where to wrap the text when using text_out(). Use the default * value (for example the screen width) when 'text_out_wrap' is 0. */ int text_out_wrap = 0; /* * Hack -- Indentation for the text when using text_out(). */ int text_out_indent = 0; /* * Hack -- Padding after wrapping */ int text_out_pad = 0; /* * Use transparent tiles */ bool use_transparency = FALSE; /* * Sound hook (for playing FX). */ void (*sound_hook)(int sound); /* Delay in centiseconds before moving to allow another keypress */ /* Zero means normal instant movement. */ u16b lazymove_delay = 0; /* Number of days passed on the current dungeon trip - - used for determining store updates on return to town */ u16b daycount = 0; angband-v3.3.2/src/main-x11.c0000644000175000017500000015517411651552410015112 0ustar chriscchrisc/* * File: main-x11.c * Purpose: Provide support for the X Windowing System * * Copyright (c) 1997 Ben Harrison, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" /* * This file helps Angband work with UNIX/X11 computers. * * To use this file, compile with "USE_X11" defined, and link against all * the various "X11" libraries which may be needed. * * Part of this file provides a user interface package composed of several * pseudo-objects, including "metadpy" (a display), "infowin" (a window), * "infoclr" (a color), and "infofnt" (a font). Actually, the package was * originally much more interesting, but it was bastardized to keep this * file simple. * * The rest of this file is an implementation of "main-xxx.c" for X11. * * Most of this file is by Ben Harrison (benh@phial.com). */ /* * The following shell script can be used to launch Angband, assuming that * it was extracted into "~/Angband", and compiled using "USE_X11", on a * Linux machine, with a 1280x1024 screen, using 6 windows (with the given * characteristics), with gamma correction of 1.8 -> (1 / 1.8) * 256 = 142, * and without graphics (add "-g" for graphics). Just copy this comment * into a file, remove the leading " * " characters (and the head/tail of * this comment), and make the file executable. * * * #!/bin/csh * * # Describe attempt * echo "Launching angband..." * sleep 2 * * # Main window * setenv ANGBAND_X11_FONT_0 10x20 * setenv ANGBAND_X11_AT_X_0 5 * setenv ANGBAND_X11_AT_Y_0 510 * * # Message window * setenv ANGBAND_X11_FONT_1 8x13 * setenv ANGBAND_X11_AT_X_1 5 * setenv ANGBAND_X11_AT_Y_1 22 * setenv ANGBAND_X11_ROWS_1 35 * * # Inventory window * setenv ANGBAND_X11_FONT_2 8x13 * setenv ANGBAND_X11_AT_X_2 635 * setenv ANGBAND_X11_AT_Y_2 182 * setenv ANGBAND_X11_ROWS_2 23 * * # Equipment window * setenv ANGBAND_X11_FONT_3 8x13 * setenv ANGBAND_X11_AT_X_3 635 * setenv ANGBAND_X11_AT_Y_3 22 * setenv ANGBAND_X11_ROWS_3 12 * * # Monster recall window * setenv ANGBAND_X11_FONT_4 6x13 * setenv ANGBAND_X11_AT_X_4 817 * setenv ANGBAND_X11_AT_Y_4 847 * setenv ANGBAND_X11_COLS_4 76 * setenv ANGBAND_X11_ROWS_4 11 * * # Object recall window * setenv ANGBAND_X11_FONT_5 6x13 * setenv ANGBAND_X11_AT_X_5 817 * setenv ANGBAND_X11_AT_Y_5 520 * setenv ANGBAND_X11_COLS_5 76 * setenv ANGBAND_X11_ROWS_5 24 * * # The build directory * cd ~/Angband * * # Gamma correction * setenv ANGBAND_X11_GAMMA 142 * * # Launch Angband * ./src/angband -mx11 -- -n6 & * */ #ifdef USE_X11 #include #include #include #include #include "main.h" #ifndef IsModifierKey /* * Keysym macros, used on Keysyms to test for classes of symbols * These were stolen from one of the X11 header files */ #define IsKeypadKey(keysym) \ (((unsigned)(keysym) >= XK_KP_Space) && ((unsigned)(keysym) <= XK_KP_Equal)) #define IsCursorKey(keysym) \ (((unsigned)(keysym) >= XK_Home) && ((unsigned)(keysym) < XK_Select)) #define IsPFKey(keysym) \ (((unsigned)(keysym) >= XK_KP_F1) && ((unsigned)(keysym) <= XK_KP_F4)) #define IsFunctionKey(keysym) \ (((unsigned)(keysym) >= XK_F1) && ((unsigned)(keysym) <= XK_F35)) #define IsMiscFunctionKey(keysym) \ (((unsigned)(keysym) >= XK_Select) && ((unsigned)(keysym) < XK_KP_Space)) #define IsModifierKey(keysym) \ (((unsigned)(keysym) >= XK_Shift_L) && ((unsigned)(keysym) <= XK_Hyper_R)) #endif /* IsModifierKey */ /* * Checks if the keysym is a special key or a normal key * Assume that XK_MISCELLANY keysyms are special */ #define IsSpecialKey(keysym) \ ((unsigned)(keysym) >= 0xFF00) /* * Hack -- avoid some compiler warnings */ #define IGNORE_UNUSED_FUNCTIONS /* * Notes on Colors: * * 1) On a monochrome (or "fake-monochrome") display, all colors * will be "cast" to "fg," except for the bg color, which is, * obviously, cast to "bg". Thus, one can ignore this setting. * * 2) Because of the inner functioning of the color allocation * routines, colors may be specified as (a) a typical color name, * (b) a hexidecimal color specification (preceded by a pound sign), * or (c) by strings such as "fg", "bg", "zg". * * 3) Due to the workings of the init routines, many colors * may also be dealt with by their actual pixel values. Note that * the pixel with all bits set is "zg = (1<depth)-1", which * is not necessarily either black or white. */ /**** Generic Types ****/ /* * An X11 pixell specifier */ typedef unsigned long Pixell; /* * The structures defined below */ typedef struct metadpy metadpy; typedef struct infowin infowin; typedef struct infoclr infoclr; typedef struct infofnt infofnt; /* * A structure summarizing a given Display. * * - The Display itself * - The default Screen for the display * - The virtual root (usually just the root) * - The default colormap (from a macro) * * - The "name" of the display * * - The socket to listen to for events * * - The width of the display screen (from a macro) * - The height of the display screen (from a macro) * - The bit depth of the display screen (from a macro) * * - The black Pixell (from a macro) * - The white Pixell (from a macro) * * - The background Pixell (default: black) * - The foreground Pixell (default: white) * - The maximal Pixell (Equals: ((2 ^ depth)-1), is usually ugly) * * - Bit Flag: Force all colors to black and white (default: !color) * - Bit Flag: Allow the use of color (default: depth > 1) * - Bit Flag: We created 'dpy', and so should nuke it when done. */ struct metadpy { Display *dpy; Screen *screen; Window root; Colormap cmap; char *name; int fd; unsigned int width; unsigned int height; unsigned int depth; Pixell black; Pixell white; Pixell bg; Pixell fg; Pixell zg; unsigned int mono:1; unsigned int color:1; unsigned int nuke:1; }; /* * A Structure summarizing Window Information. * * I assume that a window is at most 30000 pixels on a side. * I assume that the root windw is also at most 30000 square. * * - The Window * - The current Input Event Mask * * - The location of the window * - The saved (startup) location of the window * - The width, height of the window * - The border width of this window * * - Byte: 1st Extra byte * * - Bit Flag: This window is currently Mapped * - Bit Flag: This window needs to be redrawn * - Bit Flag: This window has been resized * * - Bit Flag: We should nuke 'win' when done with it * * - Bit Flag: 1st extra flag * - Bit Flag: 2nd extra flag * - Bit Flag: 3rd extra flag * - Bit Flag: 4th extra flag */ struct infowin { Window win; long mask; s16b ox, oy; s16b x, y; s16b x_save, y_save; s16b w, h; u16b b; byte byte1; unsigned int mapped:1; unsigned int redraw:1; unsigned int resize:1; unsigned int nuke:1; unsigned int flag1:1; unsigned int flag2:1; unsigned int flag3:1; unsigned int flag4:1; }; /* * A Structure summarizing Operation+Color Information * * - The actual GC corresponding to this info * * - The Foreground Pixell Value * - The Background Pixell Value * * - Num (0-15): The operation code (As in Clear, Xor, etc) * - Bit Flag: The GC is in stipple mode * - Bit Flag: Destroy 'gc' at Nuke time. */ struct infoclr { GC gc; Pixell fg; Pixell bg; unsigned int code:4; unsigned int stip:1; unsigned int nuke:1; }; /* * A Structure to Hold Font Information * * - The 'XFontStruct*' (yields the 'Font') * * - The font name * * - The default character width * - The default character height * - The default character ascent * * - Byte: Pixel offset used during fake mono * * - Flag: Force monospacing via 'wid' * - Flag: Nuke info when done */ struct infofnt { XFontStruct *info; const char *name; s16b wid; s16b twid; s16b hgt; s16b asc; byte off; unsigned int mono:1; unsigned int nuke:1; }; /* * Forward declare */ typedef struct term_data term_data; /* * A structure for each "term" */ struct term_data { term t; infofnt *fnt; infowin *win; int tile_wid; int tile_wid2; /* Tile-width with bigscreen */ int tile_hgt; /* Pointers to allocated data, needed to clear up memory */ XClassHint *classh; XSizeHints *sizeh; }; /**** Generic Macros ****/ /* Set current metadpy (Metadpy) to 'M' */ #define Metadpy_set(M) \ Metadpy = M /* Initialize 'M' using Display 'D' */ #define Metadpy_init_dpy(D) \ Metadpy_init_2(D,cNULL) /* Initialize 'M' using a Display named 'N' */ #define Metadpy_init_name(N) \ Metadpy_init_2((Display*)(NULL),N) /* Initialize 'M' using the standard Display */ #define Metadpy_init() \ Metadpy_init_name("") /* Init an infowin by giving father as an (info_win*) (or NULL), and data */ #define Infowin_init_dad(D,X,Y,W,H,B,FG,BG) \ Infowin_init_data(((D) ? ((D)->win) : (Window)(None)), \ X,Y,W,H,B,FG,BG) /* Init a top level infowin by pos,size,bord,Colors */ #define Infowin_init_top(X,Y,W,H,B,FG,BG) \ Infowin_init_data(None,X,Y,W,H,B,FG,BG) /* Request a new standard window by giving Dad infowin and X,Y,W,H */ #define Infowin_init_std(D,X,Y,W,H,B) \ Infowin_init_dad(D,X,Y,W,H,B,Metadpy->fg,Metadpy->bg) /* Set the current Infowin */ #define Infowin_set(I) \ (Infowin = (I)) /* Set the current Infoclr */ #define Infoclr_set(C) \ (Infoclr = (C)) #define Infoclr_init_ppo(F,B,O,M) \ Infoclr_init_data(F,B,O,M) #define Infoclr_init_cco(F,B,O,M) \ Infoclr_init_ppo(Infoclr_Pixell(F),Infoclr_Pixell(B),O,M) #define Infoclr_init_ppn(F,B,O,M) \ Infoclr_init_ppo(F,B,Infoclr_Opcode(O),M) #define Infoclr_init_ccn(F,B,O,M) \ Infoclr_init_cco(F,B,Infoclr_Opcode(O),M) /* Set the current infofnt */ #define Infofnt_set(I) \ (Infofnt = (I)) /* Errr: Expose Infowin */ #define Infowin_expose() \ (!(Infowin->redraw = 1)) /* Errr: Unxpose Infowin */ #define Infowin_unexpose() \ (Infowin->redraw = 0) /**** Generic Globals ****/ /* * The "default" values */ static metadpy metadpy_default; /* * The "current" variables */ static metadpy *Metadpy = &metadpy_default; static infowin *Infowin = (infowin*)(NULL); static infoclr *Infoclr = (infoclr*)(NULL); static infofnt *Infofnt = (infofnt*)(NULL); /* * Actual color table */ static infoclr *clr[MAX_COLORS]; /**** Code imported from the old maid-x11.c ****/ #ifdef SUPPORT_GAMMA static bool gamma_table_ready = FALSE; static int gamma_val = 0; #endif /* SUPPORT_GAMMA */ /* * Hack -- Convert an RGB value to an X11 Pixel, or die. */ static u32b create_pixel(Display *dpy, byte red, byte green, byte blue) { Colormap cmap = DefaultColormapOfScreen(DefaultScreenOfDisplay(dpy)); XColor xcolour; #ifdef SUPPORT_GAMMA if (!gamma_table_ready) { const char *str = getenv("ANGBAND_X11_GAMMA"); if (str != NULL) gamma_val = atoi(str); gamma_table_ready = TRUE; /* Only need to build the table if gamma exists */ if (gamma_val) build_gamma_table(gamma_val); } /* Hack -- Gamma Correction */ if (gamma_val > 0) { red = gamma_table[red]; green = gamma_table[green]; blue = gamma_table[blue]; } #endif /* SUPPORT_GAMMA */ /* Build the color */ xcolour.red = red * 257; xcolour.green = green * 257; xcolour.blue = blue * 257; xcolour.flags = DoRed | DoGreen | DoBlue; /* Attempt to Allocate the Parsed color */ if (!(XAllocColor(dpy, cmap, &xcolour))) { quit_fmt("Couldn't allocate bitmap color #%04x%04x%04x\n", xcolour.red, xcolour.green, xcolour.blue); } return (xcolour.pixel); } /* * Get the name of the default font to use for the term. */ static const char *get_default_font(int term_num) { const char *font; char buf[80]; /* Window specific font name */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_FONT_%d", term_num); /* Check environment for that font */ font = getenv(buf); if (font) return font; /* Check environment for "base" font */ font = getenv("ANGBAND_X11_FONT"); if (font) return font; switch (term_num) { case 0: return DEFAULT_X11_FONT_0; case 1: return DEFAULT_X11_FONT_1; case 2: return DEFAULT_X11_FONT_2; case 3: return DEFAULT_X11_FONT_3; case 4: return DEFAULT_X11_FONT_4; case 5: return DEFAULT_X11_FONT_5; case 6: return DEFAULT_X11_FONT_6; case 7: return DEFAULT_X11_FONT_7; } return DEFAULT_X11_FONT; } /**** Generic code ****/ /* * Init the current metadpy, with various initialization stuff. * * Inputs: * dpy: The Display* to use (if NULL, create it) * name: The name of the Display (if NULL, the current) * * Notes: * If 'name' is NULL, but 'dpy' is set, extract name from dpy * If 'dpy' is NULL, then Create the named Display * If 'name' is NULL, and so is 'dpy', use current Display * * Return -1 if no Display given, and none can be opened. */ static errr Metadpy_init_2(Display *dpy, const char *name) { metadpy *m = Metadpy; /*** Open the display if needed ***/ /* If no Display given, attempt to Create one */ if (!dpy) { /* Attempt to open the display */ dpy = XOpenDisplay(name); /* Failure */ if (!dpy) return (-1); /* We will have to nuke it when done */ m->nuke = 1; } /* Since the Display was given, use it */ else { /* We will not have to nuke it when done */ m->nuke = 0; } /*** Save some information ***/ /* Save the Display itself */ m->dpy = dpy; /* Get the Screen and Virtual Root Window */ m->screen = DefaultScreenOfDisplay(dpy); m->root = RootWindowOfScreen(m->screen); /* Get the default colormap */ m->cmap = DefaultColormapOfScreen(m->screen); /* Extract the true name of the display */ m->name = DisplayString(dpy); /* Extract the fd */ m->fd = ConnectionNumber(Metadpy->dpy); /* Save the Size and Depth of the screen */ m->width = WidthOfScreen(m->screen); m->height = HeightOfScreen(m->screen); m->depth = DefaultDepthOfScreen(m->screen); /* Save the Standard Colors */ m->black = BlackPixelOfScreen(m->screen); m->white = WhitePixelOfScreen(m->screen); /*** Make some clever Guesses ***/ /* Guess at the desired 'fg' and 'bg' Pixell's */ m->bg = m->black; m->fg = m->white; /* Calculate the Maximum allowed Pixel value. */ m->zg = ((Pixell)1 << m->depth) - 1; /* Save various default Flag Settings */ m->color = ((m->depth > 1) ? 1 : 0); m->mono = ((m->color) ? 0 : 1); /* Return "success" */ return (0); } /* * Nuke the current metadpy */ static errr Metadpy_nuke(void) { metadpy *m = Metadpy; /* If required, Free the Display */ if (m->nuke) { /* Close the Display */ XCloseDisplay(m->dpy); /* Forget the Display */ m->dpy = (Display*)(NULL); /* Do not nuke it again */ m->nuke = 0; } /* Return Success */ return (0); } /* * General Flush/ Sync/ Discard routine */ static errr Metadpy_update(int flush, int sync, int discard) { /* Flush if desired */ if (flush) XFlush(Metadpy->dpy); /* Sync if desired, using 'discard' */ if (sync) XSync(Metadpy->dpy, discard); /* Success */ return (0); } /* * Make a simple beep */ static errr Metadpy_do_beep(void) { /* Make a simple beep */ XBell(Metadpy->dpy, 100); return (0); } /* * Set the name (in the title bar) of Infowin */ static errr Infowin_set_name(const char *name) { Status st; XTextProperty tp; char buf[128]; char *bp = buf; my_strcpy(buf, name, sizeof(buf)); st = XStringListToTextProperty(&bp, 1, &tp); if (st) XSetWMName(Metadpy->dpy, Infowin->win, &tp); return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Set the icon name of Infowin */ static errr Infowin_set_icon_name(const char *name) { Status st; XTextProperty tp; char buf[128]; char *bp = buf; my_strcpy(buf, name, sizeof(buf)); st = XStringListToTextProperty(&bp, 1, &tp); if (st) XSetWMIconName(Metadpy->dpy, Infowin->win, &tp); return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Nuke Infowin */ static errr Infowin_nuke(void) { infowin *iwin = Infowin; /* Nuke if requested */ if (iwin->nuke) { /* Destory the old window */ XDestroyWindow(Metadpy->dpy, iwin->win); } /* Success */ return (0); } /* * Prepare a new 'infowin'. */ static errr Infowin_prepare(Window xid) { infowin *iwin = Infowin; Window tmp_win; XWindowAttributes xwa; int x, y; unsigned int w, h, b, d; /* Assign stuff */ iwin->win = xid; /* Check For Error XXX Extract some ACTUAL data from 'xid' */ XGetGeometry(Metadpy->dpy, xid, &tmp_win, &x, &y, &w, &h, &b, &d); /* Apply the above info */ iwin->x = x; iwin->y = y; iwin->x_save = x; iwin->y_save = y; iwin->w = w; iwin->h = h; iwin->b = b; /* Check Error XXX Extract some more ACTUAL data */ XGetWindowAttributes(Metadpy->dpy, xid, &xwa); /* Apply the above info */ iwin->mask = xwa.your_event_mask; iwin->mapped = ((xwa.map_state == IsUnmapped) ? 0 : 1); /* And assume that we are exposed */ iwin->redraw = 1; /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Initialize a new 'infowin'. */ static errr Infowin_init_real(Window xid) { /* Wipe it clean */ (void)WIPE(Infowin, infowin); /* Start out non-nukable */ Infowin->nuke = 0; /* Attempt to Prepare ourself */ return (Infowin_prepare(xid)); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Init an infowin by giving some data. * * Inputs: * dad: The Window that should own this Window (if any) * x,y: The position of this Window * w,h: The size of this Window * b,d: The border width and pixel depth * * Notes: * If 'dad == None' assume 'dad == root' */ static errr Infowin_init_data(Window dad, int x, int y, int w, int h, int b, Pixell fg, Pixell bg) { Window xid; /* Wipe it clean */ (void)WIPE(Infowin, infowin); /*** Error Check XXX ***/ /*** Create the Window 'xid' from data ***/ /* What happened here? XXX XXX XXX */ /* If no parent given, depend on root */ if (dad == None) dad = Metadpy->root; /* Create the Window XXX Error Check */ xid = XCreateSimpleWindow(Metadpy->dpy, dad, x, y, w, h, b, fg, bg); /* Start out selecting No events */ XSelectInput(Metadpy->dpy, xid, 0L); /*** Prepare the new infowin ***/ /* Mark it as nukable */ Infowin->nuke = 1; /* Attempt to Initialize the infowin */ return (Infowin_prepare(xid)); } /* * Modify the event mask of an Infowin */ static errr Infowin_set_mask(long mask) { /* Save the new setting */ Infowin->mask = mask; /* Execute the Mapping */ XSelectInput(Metadpy->dpy, Infowin->win, Infowin->mask); /* Success */ return (0); } /* * Request that Infowin be mapped */ static errr Infowin_map(void) { /* Execute the Mapping */ XMapWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Request that Infowin be unmapped */ static errr Infowin_unmap(void) { /* Execute the Un-Mapping */ XUnmapWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Request that Infowin be raised */ static errr Infowin_raise(void) { /* Raise towards visibility */ XRaiseWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Request that Infowin be lowered */ static errr Infowin_lower(void) { /* Lower towards invisibility */ XLowerWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Request that Infowin be moved to a new location */ static errr Infowin_impell(int x, int y) { /* Execute the request */ XMoveWindow(Metadpy->dpy, Infowin->win, x, y); /* Success */ return (0); } /* * Resize an infowin */ static errr Infowin_resize(int w, int h) { /* Execute the request */ XResizeWindow(Metadpy->dpy, Infowin->win, w, h); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Move and Resize an infowin */ static errr Infowin_locate(int x, int y, int w, int h) { /* Execute the request */ XMoveResizeWindow(Metadpy->dpy, Infowin->win, x, y, w, h); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Visually clear Infowin */ static errr Infowin_wipe(void) { /* Execute the request */ XClearWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Visually Paint Infowin with the current color */ static errr Infowin_fill(void) { /* Execute the request */ XFillRectangle(Metadpy->dpy, Infowin->win, Infoclr->gc, 0, 0, Infowin->w, Infowin->h); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * A NULL terminated pair list of legal "operation names" * * Pairs of values, first is texttual name, second is the string * holding the decimal value that the operation corresponds to. */ static const char *opcode_pairs[] = { "cpy", "3", "xor", "6", "and", "1", "ior", "7", "nor", "8", "inv", "10", "clr", "0", "set", "15", "src", "3", "dst", "5", "+andReverse", "2", "+andInverted", "4", "+noop", "5", "+equiv", "9", "+orReverse", "11", "+copyInverted", "12", "+orInverted", "13", "+nand", "14", NULL }; /* * Parse a word into an operation "code" * * Inputs: * str: A string, hopefully representing an Operation * * Output: * 0-15: if 'str' is a valid Operation * -1: if 'str' could not be parsed */ static int Infoclr_Opcode(const char *str) { register int i; /* Scan through all legal operation names */ for (i = 0; opcode_pairs[i*2]; ++i) { /* Is this the right oprname? */ if (streq(opcode_pairs[i*2], str)) { /* Convert the second element in the pair into a Code */ return (atoi(opcode_pairs[i*2+1])); } } /* The code was not found, return -1 */ return (-1); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Request a Pixell by name. Note: uses 'Metadpy'. * * Inputs: * name: The name of the color to try to load (see below) * * Output: * The Pixell value that metched the given name * 'Metadpy->fg' if the name was unparseable * * Valid forms for 'name': * 'fg', 'bg', 'zg', '' and '#' */ static Pixell Infoclr_Pixell(const char *name) { XColor scrn; /* Attempt to Parse the name */ if (name && name[0]) { /* The 'bg' color is available */ if (streq(name, "bg")) return (Metadpy->bg); /* The 'fg' color is available */ if (streq(name, "fg")) return (Metadpy->fg); /* The 'zg' color is available */ if (streq(name, "zg")) return (Metadpy->zg); /* The 'white' color is available */ if (streq(name, "white")) return (Metadpy->white); /* The 'black' color is available */ if (streq(name, "black")) return (Metadpy->black); /* Attempt to parse 'name' into 'scrn' */ if (!(XParseColor(Metadpy->dpy, Metadpy->cmap, name, &scrn))) { plog_fmt("Warning: Couldn't parse color '%s'\n", name); } /* Attempt to Allocate the Parsed color */ if (!(XAllocColor(Metadpy->dpy, Metadpy->cmap, &scrn))) { plog_fmt("Warning: Couldn't allocate color '%s'\n", name); } /* The Pixel was Allocated correctly */ else return (scrn.pixel); } /* Warn about the Default being Used */ plog_fmt("Warning: Using 'fg' for unknown color '%s'\n", name); /* Default to the 'Foreground' color */ return (Metadpy->fg); } /* * Initialize a new 'infoclr' with a real GC. */ static errr Infoclr_init_1(GC gc) { infoclr *iclr = Infoclr; /* Wipe the iclr clean */ (void)WIPE(iclr, infoclr); /* Assign the GC */ iclr->gc = gc; /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Nuke an old 'infoclr'. */ static errr Infoclr_nuke(void) { infoclr *iclr = Infoclr; /* Deal with 'GC' */ if (iclr->nuke) { /* Free the GC */ XFreeGC(Metadpy->dpy, iclr->gc); } /* Forget the current */ Infoclr = (infoclr*)(NULL); /* Success */ return (0); } /* * Initialize an infoclr with some data * * Inputs: * fg: The Pixell for the requested Foreground (see above) * bg: The Pixell for the requested Background (see above) * op: The Opcode for the requested Operation (see above) * stip: The stipple mode */ static errr Infoclr_init_data(Pixell fg, Pixell bg, int op, int stip) { infoclr *iclr = Infoclr; GC gc; XGCValues gcv; unsigned long gc_mask; /*** Simple error checking of opr and clr ***/ /* Check the 'Pixells' for realism */ if (bg > Metadpy->zg) return (-1); if (fg > Metadpy->zg) return (-1); /* Check the data for trueness */ if ((op < 0) || (op > 15)) return (-1); /*** Create the requested 'GC' ***/ /* Assign the proper GC function */ gcv.function = op; /* Assign the proper GC background */ gcv.background = bg; /* Assign the proper GC foreground */ gcv.foreground = fg; /* Hack -- Handle XOR (xor is code 6) by hacking bg and fg */ if (op == 6) gcv.background = 0; if (op == 6) gcv.foreground = (bg ^ fg); /* Assign the proper GC Fill Style */ gcv.fill_style = (stip ? FillStippled : FillSolid); /* Turn off 'Give exposure events for pixmap copying' */ gcv.graphics_exposures = False; /* Set up the GC mask */ gc_mask = (GCFunction | GCBackground | GCForeground | GCFillStyle | GCGraphicsExposures); /* Create the GC detailed above */ gc = XCreateGC(Metadpy->dpy, Metadpy->root, gc_mask, &gcv); /*** Initialize ***/ /* Wipe the iclr clean */ (void)WIPE(iclr, infoclr); /* Assign the GC */ iclr->gc = gc; /* Nuke it when done */ iclr->nuke = 1; /* Assign the parms */ iclr->fg = fg; iclr->bg = bg; iclr->code = op; iclr->stip = stip ? 1 : 0; /* Success */ return (0); } /* * Change the 'fg' for an infoclr * * Inputs: * fg: The Pixell for the requested Foreground (see above) */ static errr Infoclr_change_fg(Pixell fg) { infoclr *iclr = Infoclr; /*** Simple error checking of opr and clr ***/ /* Check the 'Pixells' for realism */ if (fg > Metadpy->zg) return (-1); /*** Change ***/ /* Change */ XSetForeground(Metadpy->dpy, iclr->gc, fg); /* Success */ return (0); } /* * Nuke an old 'infofnt'. */ static errr Infofnt_nuke(void) { infofnt *ifnt = Infofnt; /* Deal with 'name' */ if (ifnt->name) { /* Free the name */ string_free((void *) ifnt->name); } /* Nuke info if needed */ if (ifnt->nuke) { /* Free the font */ XFreeFont(Metadpy->dpy, ifnt->info); } /* Success */ return (0); } /* * Prepare a new 'infofnt' */ static errr Infofnt_prepare(XFontStruct *info) { infofnt *ifnt = Infofnt; XCharStruct *cs; /* Assign the struct */ ifnt->info = info; /* Jump into the max bouonds thing */ cs = &(info->max_bounds); /* Extract default sizing info */ ifnt->asc = info->ascent; ifnt->hgt = info->ascent + info->descent; ifnt->wid = cs->width; ifnt->twid = cs->width; /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Initialize a new 'infofnt'. */ static errr Infofnt_init_real(XFontStruct *info) { /* Wipe the thing */ (void)WIPE(Infofnt, infofnt); /* No nuking */ Infofnt->nuke = 0; /* Attempt to prepare it */ return (Infofnt_prepare(info)); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Init an infofnt by its Name * * Inputs: * name: The name of the requested Font */ static errr Infofnt_init_data(const char *name) { XFontStruct *info; /*** Load the info Fresh, using the name ***/ /* If the name is not given, report an error */ if (!name) return (-1); /* Attempt to load the font */ info = XLoadQueryFont(Metadpy->dpy, name); /* The load failed, try to recover */ if (!info) return (-1); /*** Init the font ***/ /* Wipe the thing */ (void)WIPE(Infofnt, infofnt); /* Attempt to prepare it */ if (Infofnt_prepare(info)) { /* Free the font */ XFreeFont(Metadpy->dpy, info); /* Fail */ return (-1); } /* Save a copy of the font name */ Infofnt->name = string_make(name); /* Mark it as nukable */ Infofnt->nuke = 1; /* HACK - force all fonts to be printed character by character */ Infofnt->mono = 1; /* Success */ return (0); } /* * Standard Text */ static errr Infofnt_text_std(int x, int y, const char *str, int len) { int i; int w, h; term_data *td = (term_data*)(Term->data); /*** Do a brief info analysis ***/ /* Do nothing if the string is null */ if (!str || !*str) return (-1); /* Get the length of the string */ if (len < 0) len = strlen(str); /*** Decide where to place the string, vertically ***/ /* Ignore Vertical Justifications */ y = (y * td->tile_hgt) + Infowin->oy; /*** Decide where to place the string, horizontally ***/ /* Line up with x at left edge of column 'x' */ x = (x * td->tile_wid) + Infowin->ox; /*** Erase the background ***/ /* The total width will be 'len' chars * standard width */ w = len * td->tile_wid; /* Simply do 'td->tile_hgt' (a single row) high */ h = td->tile_hgt; /* Fill the background */ XFillRectangle(Metadpy->dpy, Infowin->win, clr[TERM_DARK]->gc, x, y, w, h); /*** Actually draw 'str' onto the infowin ***/ /* Be sure the correct font is ready */ XSetFont(Metadpy->dpy, Infoclr->gc, Infofnt->info->fid); y += Infofnt->asc; /*** Handle the fake mono we can enforce on fonts ***/ /* Monotize the font */ if (Infofnt->mono) { /* Do each character */ for (i = 0; i < len; ++i) { /* Note that the Infoclr is set up to contain the Infofnt */ XDrawImageString(Metadpy->dpy, Infowin->win, Infoclr->gc, x + i * td->tile_wid + Infofnt->off, y, str + i, 1); } } /* Assume monospaced font */ else { /* Note that the Infoclr is set up to contain the Infofnt */ XDrawImageString(Metadpy->dpy, Infowin->win, Infoclr->gc, x, y, str, len); } /* Success */ return (0); } /* * Painting where text would be */ static errr Infofnt_text_non(int x, int y, const char *str, int len) { int w, h; term_data *td = (term_data*)(Term->data); /*** Find the width ***/ /* Negative length is a flag to count the characters in str */ if (len < 0) len = strlen(str); /* The total width will be 'len' chars * standard width */ w = len * td->tile_wid; /*** Find the X dimensions ***/ /* Line up with x at left edge of column 'x' */ x = x * td->tile_wid + Infowin->ox; /*** Find other dimensions ***/ /* Simply do 'td->tile_hgt' (a single row) high */ h = td->tile_hgt; /* Simply do "at top" in row 'y' */ y = y * h + Infowin->oy; /*** Actually 'paint' the area ***/ /* Just do a Fill Rectangle */ XFillRectangle(Metadpy->dpy, Infowin->win, Infoclr->gc, x, y, w, h); /* Success */ return (0); } /*************************************************************************/ /* * Angband specific code follows... (ANGBAND) */ /* * Hack -- cursor color */ static infoclr *xor; /* * Color info (unused, red, green, blue). */ static byte color_table_x11[MAX_COLORS][4]; /* * The number of term data structures */ #define MAX_TERM_DATA 8 /* * The array of term data structures */ static term_data data[MAX_TERM_DATA]; /* * Path to the X11 settings file */ static const char *x11_prefs = "x11-settings.prf"; char settings[1024]; /* * Remember the number of terminal windows open */ static int term_windows_open; /* * Process a keypress event */ static void react_keypress(XKeyEvent *ev) { int n, ch = 0; KeySym ks; char buf[128]; /* Extract four "modifier flags" */ int mc = (ev->state & ControlMask) ? TRUE : FALSE; int ms = (ev->state & ShiftMask) ? TRUE : FALSE; int mo = (ev->state & Mod1Mask) ? TRUE : FALSE; int mx = (ev->state & Mod2Mask) ? TRUE : FALSE; int kp = FALSE; byte mods = (mo ? KC_MOD_ALT : 0) | (mx ? KC_MOD_META : 0); /* Check for "normal" keypresses */ n = XLookupString(ev, buf, 125, &ks, NULL); buf[n] = '\0'; /* Ignore modifier keys by themselves */ if (IsModifierKey(ks)) return; switch (ks) { case XK_BackSpace: ch = KC_BACKSPACE; break; case XK_Tab: ch = KC_TAB; break; case XK_Return: ch = KC_ENTER; break; case XK_Escape: ch = ESCAPE; break; case XK_Delete: ch = KC_DELETE; break; case XK_Home: ch = KC_HOME; break; case XK_Left: ch = ARROW_LEFT; break; case XK_Up: ch = ARROW_UP; break; case XK_Right: ch = ARROW_RIGHT; break; case XK_Down: ch = ARROW_DOWN; break; case XK_Page_Up: ch = KC_PGUP; break; case XK_Page_Down: ch = KC_PGDOWN; break; case XK_End: ch = KC_END; break; case XK_Insert: ch = KC_INSERT; break; case XK_Pause: ch = KC_PAUSE; break; case XK_Break: ch = KC_BREAK; break; /* keypad */ case XK_KP_0: ch = '0'; kp = TRUE; break; case XK_KP_1: ch = '1'; kp = TRUE; break; case XK_KP_2: ch = '2'; kp = TRUE; break; case XK_KP_3: ch = '3'; kp = TRUE; break; case XK_KP_4: ch = '4'; kp = TRUE; break; case XK_KP_5: ch = '5'; kp = TRUE; break; case XK_KP_6: ch = '6'; kp = TRUE; break; case XK_KP_7: ch = '7'; kp = TRUE; break; case XK_KP_8: ch = '8'; kp = TRUE; break; case XK_KP_9: ch = '9'; kp = TRUE; break; case XK_KP_Decimal: ch = '.'; kp = TRUE; break; case XK_KP_Divide: ch = '/'; kp = TRUE; break; case XK_KP_Multiply: ch = '*'; kp = TRUE; break; case XK_KP_Subtract: ch = '-'; kp = TRUE; break; case XK_KP_Add: ch = '+'; kp = TRUE; break; case XK_KP_Enter: ch = '\n'; kp = TRUE; break; case XK_KP_Equal: ch = '='; kp = TRUE; break; case XK_KP_Delete: ch = KC_DELETE; kp = TRUE; break; case XK_KP_Home: ch = KC_HOME; kp = TRUE; break; case XK_KP_Left: ch = ARROW_LEFT; kp = TRUE; break; case XK_KP_Up: ch = ARROW_UP; kp = TRUE; break; case XK_KP_Right: ch = ARROW_RIGHT; kp = TRUE; break; case XK_KP_Down: ch = ARROW_DOWN; kp = TRUE; break; case XK_KP_Page_Up: ch = KC_PGUP; kp = TRUE; break; case XK_KP_Page_Down: ch = KC_PGDOWN; kp = TRUE; break; case XK_KP_End: ch = KC_END; kp = TRUE; break; case XK_KP_Insert: ch = KC_INSERT; kp = TRUE; break; case XK_KP_Begin: ch = KC_BEGIN; kp = TRUE; break; case XK_F1: ch = KC_F1; break; case XK_F2: ch = KC_F2; break; case XK_F3: ch = KC_F3; break; case XK_F4: ch = KC_F4; break; case XK_F5: ch = KC_F5; break; case XK_F6: ch = KC_F6; break; case XK_F7: ch = KC_F7; break; case XK_F8: ch = KC_F8; break; case XK_F9: ch = KC_F9; break; case XK_F10: ch = KC_F10; break; case XK_F11: ch = KC_F11; break; case XK_F12: ch = KC_F12; break; case XK_F13: ch = KC_F13; break; case XK_F14: ch = KC_F14; break; case XK_F15: ch = KC_F15; break; } if (kp) mods |= KC_MOD_KEYPAD; if (ch) { if (mc) mods |= KC_MOD_CONTROL; if (ms) mods |= KC_MOD_SHIFT; Term_keypress(ch, mods); return; } else if (n && !IsSpecialKey(ks)) { keycode_t code = buf[0]; if (mc && MODS_INCLUDE_CONTROL(code)) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(code)) mods |= KC_MOD_SHIFT; Term_keypress(code, mods); } } /* * Find the square a particular pixel is part of. */ static void pixel_to_square(int * const x, int * const y, const int ox, const int oy) { term_data *td = (term_data*)(Term->data); (*x) = (ox - Infowin->ox) / td->tile_wid; (*y) = (oy - Infowin->oy) / td->tile_hgt; } /* * Process events */ static errr CheckEvent(bool wait) { term_data *old_td = (term_data*)(Term->data); XEvent xev_body, *xev = &xev_body; term_data *td = NULL; infowin *iwin = NULL; int i; int window = 0; /* Do not wait unless requested */ if (!wait && !XPending(Metadpy->dpy)) return (1); /* Wait in 0.02s increments while updating animations every 0.2s */ i = 0; while (!XPending(Metadpy->dpy)) { if (i == 0) idle_update(); usleep(20000); i = (i + 1) % 10; } /* Load the Event */ XNextEvent(Metadpy->dpy, xev); /* Notice new keymaps */ if (xev->type == MappingNotify) { XRefreshKeyboardMapping(&xev->xmapping); return 0; } /* Scan the windows */ for (i = 0; i < MAX_TERM_DATA; i++) { if (xev->xany.window == data[i].win->win) { td = &data[i]; iwin = td->win; window = i; break; } } /* Unknown window */ if (!td || !iwin) return (0); /* Hack -- activate the Term */ Term_activate(&td->t); /* Hack -- activate the window */ Infowin_set(iwin); /* Switch on the Type */ switch (xev->type) { case ButtonPress: { bool press = (xev->type == ButtonPress); int z = 0; /* Where is the mouse */ int x = xev->xbutton.x; int y = xev->xbutton.y; /* Which button is involved */ if (xev->xbutton.button == Button1) z = 1; else if (xev->xbutton.button == Button2) z = 2; else if (xev->xbutton.button == Button3) z = 3; else if (xev->xbutton.button == Button4) z = 4; else if (xev->xbutton.button == Button5) z = 5; else z = 0; /* The co-ordinates are only used in Angband format. */ pixel_to_square(&x, &y, x, y); if (press) Term_mousepress(x, y, z); break; } case KeyPress: { /* Hack -- use "old" term */ Term_activate(&old_td->t); /* Process the key */ react_keypress(&(xev->xkey)); break; } case Expose: { int x1, x2, y1, y2; x1 = (xev->xexpose.x - Infowin->ox) / td->tile_wid; x2 = (xev->xexpose.x + xev->xexpose.width - Infowin->ox) / td->tile_wid; y1 = (xev->xexpose.y - Infowin->oy) / td->tile_hgt; y2 = (xev->xexpose.y + xev->xexpose.height - Infowin->oy) / td->tile_hgt; Term_redraw_section(x1, y1, x2, y2); break; } case MapNotify: { Infowin->mapped = 1; Term->mapped_flag = TRUE; break; } case UnmapNotify: { Infowin->mapped = 0; Term->mapped_flag = FALSE; break; } /* Move and/or Resize */ case ConfigureNotify: { int cols, rows, wid, hgt, force_resize; int ox = Infowin->ox; int oy = Infowin->oy; /* Save the new Window Parms */ Infowin->x = xev->xconfigure.x; Infowin->y = xev->xconfigure.y; Infowin->w = xev->xconfigure.width; Infowin->h = xev->xconfigure.height; /* Determine "proper" number of rows/cols */ cols = ((Infowin->w - (ox + ox)) / td->tile_wid); rows = ((Infowin->h - (oy + oy)) / td->tile_hgt); /* Hack -- minimal size */ if (cols < 1) cols = 1; if (rows < 1) rows = 1; if (window == 0) { /* Hack the main window must be at least 80x24 */ force_resize = FALSE; if (cols < 80) { cols = 80; force_resize = TRUE; } if (rows < 24) { rows = 24; force_resize = TRUE; } /* Resize the windows if any "change" is needed */ if (force_resize) { /* Desired size of window */ wid = cols * td->tile_wid + (ox + ox); hgt = rows * td->tile_hgt + (oy + oy); /* Resize window */ Infowin_set(td->win); Infowin_resize(wid, hgt); } } /* Resize the Term (if needed) */ (void)Term_resize(cols, rows); break; } } /* Hack -- Activate the old term */ Term_activate(&old_td->t); /* Hack -- Activate the proper window */ Infowin_set(old_td->win); /* Success */ return (0); } /* * Handle "activation" of a term */ static errr Term_xtra_x11_level(int v) { term_data *td = (term_data*)(Term->data); /* Handle "activate" */ if (v) { /* Activate the window */ Infowin_set(td->win); /* Activate the font */ Infofnt_set(td->fnt); } /* Success */ return (0); } /* * React to changes */ static errr Term_xtra_x11_react(void) { int i; if (Metadpy->color) { /* Check the colors */ for (i = 0; i < MAX_COLORS; i++) { if ((color_table_x11[i][0] != angband_color_table[i][0]) || (color_table_x11[i][1] != angband_color_table[i][1]) || (color_table_x11[i][2] != angband_color_table[i][2]) || (color_table_x11[i][3] != angband_color_table[i][3])) { Pixell pixel; /* Save new values */ color_table_x11[i][0] = angband_color_table[i][0]; color_table_x11[i][1] = angband_color_table[i][1]; color_table_x11[i][2] = angband_color_table[i][2]; color_table_x11[i][3] = angband_color_table[i][3]; /* Create pixel */ pixel = create_pixel(Metadpy->dpy, color_table_x11[i][1], color_table_x11[i][2], color_table_x11[i][3]); /* Change the foreground */ Infoclr_set(clr[i]); Infoclr_change_fg(pixel); } } } /* Success */ return (0); } /* * Handle a "special request" */ static errr Term_xtra_x11(int n, int v) { /* Handle a subset of the legal requests */ switch (n) { /* Make a noise */ case TERM_XTRA_NOISE: Metadpy_do_beep(); return (0); /* Flush the output XXX XXX */ case TERM_XTRA_FRESH: Metadpy_update(1, 0, 0); return (0); /* Process random events XXX */ case TERM_XTRA_BORED: return (CheckEvent(0)); /* Process Events XXX */ case TERM_XTRA_EVENT: return (CheckEvent(v)); /* Flush the events XXX */ case TERM_XTRA_FLUSH: while (!CheckEvent(FALSE)); return (0); /* Handle change in the "level" */ case TERM_XTRA_LEVEL: return (Term_xtra_x11_level(v)); /* Clear the screen */ case TERM_XTRA_CLEAR: Infowin_wipe(); return (0); /* Delay for some milliseconds */ case TERM_XTRA_DELAY: if (v > 0) usleep(1000 * v); return (0); /* React to changes */ case TERM_XTRA_REACT: return (Term_xtra_x11_react()); } /* Unknown */ return (1); } /* * Draw the cursor as a rectangular outline */ static errr Term_curs_x11(int x, int y) { term_data *td = (term_data*)(Term->data); XDrawRectangle(Metadpy->dpy, Infowin->win, xor->gc, x * td->tile_wid + Infowin->ox, y * td->tile_hgt + Infowin->oy, td->tile_wid - 1, td->tile_hgt - 1); /* Success */ return (0); } /* * Draw the double width cursor as a rectangular outline */ static errr Term_bigcurs_x11(int x, int y) { term_data *td = (term_data*)(Term->data); XDrawRectangle(Metadpy->dpy, Infowin->win, xor->gc, x * td->tile_wid + Infowin->ox, y * td->tile_hgt + Infowin->oy, td->tile_wid2 - 1, td->tile_hgt - 1); /* Success */ return (0); } /* * Erase some characters. */ static errr Term_wipe_x11(int x, int y, int n) { /* Erase (use black) */ Infoclr_set(clr[TERM_DARK]); /* Mega-Hack -- Erase some space */ Infofnt_text_non(x, y, "", n); /* Success */ return (0); } /* * Draw some textual characters. */ static errr Term_text_x11(int x, int y, int n, byte a, const char *s) { /* Draw the text */ Infoclr_set(clr[a]); /* Draw the text */ Infofnt_text_std(x, y, s, n); /* Success */ return (0); } static void save_prefs(void) { ang_file *fff; int i; /* Open the settings file */ fff = file_open(settings, MODE_WRITE, FTYPE_TEXT); if (!fff) return; /* Header */ file_putf(fff, "# %s X11 settings\n\n", VERSION_NAME); /* Number of term windows to open */ file_putf(fff, "TERM_WINS=%d\n\n", term_windows_open); /* Save window prefs */ for (i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; if (!td->t.mapped_flag) continue; /* Header */ file_putf(fff, "# Term %d\n", i); /* * This doesn't seem to work under various WMs * since the decoration messes the position up * * Hack -- Use saved window positions. * This means that we won't remember ingame repositioned * windows, but also means that WMs won't screw predefined * positions up. -CJN- */ /* Window specific location (x) */ file_putf(fff, "AT_X_%d=%d\n", i, td->win->x_save); /* Window specific location (y) */ file_putf(fff, "AT_Y_%d=%d\n", i, td->win->y_save); /* Window specific cols */ file_putf(fff, "COLS_%d=%d\n", i, td->t.wid); /* Window specific rows */ file_putf(fff, "ROWS_%d=%d\n", i, td->t.hgt); /* Window specific inner border offset (ox) */ file_putf(fff, "IBOX_%d=%d\n", i, td->win->ox); /* Window specific inner border offset (oy) */ file_putf(fff, "IBOY_%d=%d\n", i, td->win->oy); /* Window specific font name */ file_putf(fff, "FONT_%d=%s\n", i, td->fnt->name); /* Window specific tile width */ file_putf(fff, "TILE_WIDTH_%d=%d\n", i, td->tile_wid); /* Window specific tile height */ file_putf(fff, "TILE_HEIGHT_%d=%d\n", i, td->tile_hgt); /* Footer */ file_putf(fff, "\n"); } /* Close */ file_close(fff); } /* * Initialize a term_data */ static errr term_data_init(term_data *td, int i) { term *t = &td->t; const char *name = angband_term_name[i]; const char *font; int x = 0; int y = 0; int cols = 80; int rows = 24; int ox = 1; int oy = 1; int wid, hgt, num; const char *str; int val; XClassHint *ch; char res_name[20]; char res_class[20]; XSizeHints *sh; ang_file *fff; char buf[1024]; char cmd[40]; char font_name[256]; int line = 0; /* Get default font for this term */ font = get_default_font(i); /* Open the file */ fff = file_open(settings, MODE_READ, -1); /* File exists */ if (fff) { /* Process the file */ while (file_getl(fff, buf, sizeof(buf))) { /* Count lines */ line++; /* Skip "empty" lines */ if (!buf[0]) continue; /* Skip "blank" lines */ if (isspace((unsigned char)buf[0])) continue; /* Skip comments */ if (buf[0] == '#') continue; /* Window specific location (x) */ strnfmt(cmd, sizeof(cmd), "AT_X_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); x = (str != NULL) ? atoi(str + 1) : -1; continue; } /* Window specific location (y) */ strnfmt(cmd, sizeof(cmd), "AT_Y_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); y = (str != NULL) ? atoi(str + 1) : -1; continue; } /* Window specific cols */ strnfmt(cmd, sizeof(cmd), "COLS_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) cols = val; continue; } /* Window specific rows */ strnfmt(cmd, sizeof(cmd), "ROWS_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) rows = val; continue; } /* Window specific inner border offset (ox) */ strnfmt(cmd, sizeof(cmd), "IBOX_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) ox = val; continue; } /* Window specific inner border offset (oy) */ strnfmt(cmd, sizeof(cmd), "IBOY_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) oy = val; continue; } /* Window specific font name */ strnfmt(cmd, sizeof(cmd), "FONT_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); if (str != NULL) { my_strcpy(font_name, str + 1, sizeof(font_name)); font = font_name; } continue; } /* Window specific tile width */ strnfmt(cmd, sizeof(cmd), "TILE_WIDTH_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) td->tile_wid = val; continue; } /* Window specific tile height */ strnfmt(cmd, sizeof(cmd), "TILE_HEIGHT_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) td->tile_hgt = val; continue; } } /* Close */ file_close(fff); } /* * Env-vars overwrite the settings in the settings file */ /* Window specific location (x) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_AT_X_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) x = val; /* Window specific location (y) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_AT_Y_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) y = val; /* Window specific cols */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_COLS_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) cols = val; /* Window specific rows */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_ROWS_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) rows = val; /* Window specific inner border offset (ox) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_IBOX_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) ox = val; /* Window specific inner border offset (oy) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_IBOY_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) oy = val; /* Window specific font name */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_FONT_%d", i); str = getenv(buf); if (str) font = str; /* Hack the main window must be at least 80x24 */ if (!i) { if (cols < 80) cols = 80; if (rows < 24) rows = 24; } /* Prepare the standard font */ td->fnt = ZNEW(infofnt); Infofnt_set(td->fnt); if (Infofnt_init_data(font)) quit_fmt("Couldn't load the requested font. (%s)", font); /* Use proper tile size */ if (td->tile_wid <= 0) td->tile_wid = td->fnt->twid; if (td->tile_hgt <= 0) td->tile_hgt = td->fnt->hgt; /* Don't allow bigtile mode - one day maybe NRM */ td->tile_wid2 = td->tile_wid; /* Hack -- key buffer size */ num = ((i == 0) ? 1024 : 16); /* Assume full size windows */ wid = cols * td->tile_wid + (ox + ox); hgt = rows * td->tile_hgt + (oy + oy); /* Create a top-window */ td->win = ZNEW(infowin); Infowin_set(td->win); Infowin_init_top(x, y, wid, hgt, 0, Metadpy->fg, Metadpy->bg); /* Ask for certain events */ Infowin_set_mask(ExposureMask | StructureNotifyMask | KeyPressMask | ButtonPressMask); /* Set the window name */ Infowin_set_name(name); /* Save the inner border */ Infowin->ox = ox; Infowin->oy = oy; /* Make Class Hints */ ch = XAllocClassHint(); if (ch == NULL) quit("XAllocClassHint failed"); my_strcpy(res_name, name, sizeof(res_name)); res_name[0] = tolower((unsigned char)res_name[0]); ch->res_name = res_name; my_strcpy(res_class, "Angband", sizeof(res_class)); ch->res_class = res_class; XSetClassHint(Metadpy->dpy, Infowin->win, ch); /* Make Size Hints */ sh = XAllocSizeHints(); /* Oops */ if (sh == NULL) quit("XAllocSizeHints failed"); if (x || y) sh->flags = USPosition; else sh->flags = 0; /* Main window has a differing minimum size */ if (i == 0) { /* Main window min size is 80x24 */ sh->flags |= (PMinSize | PMaxSize); sh->min_width = 80 * td->tile_wid + (ox + ox); sh->min_height = 24 * td->tile_hgt + (oy + oy); sh->max_width = 255 * td->tile_wid + (ox + ox); sh->max_height = 255 * td->tile_hgt + (oy + oy); } /* Other windows can be shrunk to 1x1 */ else { /* Other windows */ sh->flags |= (PMinSize | PMaxSize); sh->min_width = td->tile_wid + (ox + ox); sh->min_height = td->tile_hgt + (oy + oy); sh->max_width = 255 * td->tile_wid + (ox + ox); sh->max_height = 255 * td->tile_hgt + (oy + oy); } /* Resize increment */ sh->flags |= PResizeInc; sh->width_inc = td->tile_wid; sh->height_inc = td->tile_hgt; /* Base window size */ sh->flags |= PBaseSize; sh->base_width = (ox + ox); sh->base_height = (oy + oy); /* Use the size hints */ XSetWMNormalHints(Metadpy->dpy, Infowin->win, sh); /* Map the window */ Infowin_map(); /* Set pointers to allocated data */ td->sizeh = sh; td->classh = ch; /* Move the window to requested location */ if ((x >= 0) && (y >= 0)) Infowin_impell(x, y); /* Initialize the term */ term_init(t, cols, rows, num); /* Use a "soft" cursor */ t->soft_cursor = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; /* Hooks */ t->xtra_hook = Term_xtra_x11; t->curs_hook = Term_curs_x11; t->bigcurs_hook = Term_bigcurs_x11; t->wipe_hook = Term_wipe_x11; t->text_hook = Term_text_x11; /* Save the data */ t->data = td; /* Activate (important) */ Term_activate(t); /* Success */ return (0); } const char help_x11[] = "Basic X11, subopts -d -n -x"; static void hook_quit(const char *str) { int i; /* Unused */ (void)str; save_prefs(); /* Free allocated data */ for (i = 0; i < term_windows_open; i++) { term_data *td = &data[i]; term *t = &td->t; /* Free size hints */ XFree(td->sizeh); /* Free class hints */ XFree(td->classh); /* Free fonts */ Infofnt_set(td->fnt); (void)Infofnt_nuke(); FREE(td->fnt); /* Free window */ Infowin_set(td->win); (void)Infowin_nuke(); FREE(td->win); /* Free term */ (void)term_nuke(t); } /* Free colors */ Infoclr_set(xor); (void)Infoclr_nuke(); FREE(xor); for (i = 0; i < MAX_COLORS; ++i) { Infoclr_set(clr[i]); (void)Infoclr_nuke(); FREE(clr[i]); } /* Close link to display */ (void)Metadpy_nuke(); } /* * Initialization function for an "X11" module to Angband */ errr init_x11(int argc, char **argv) { int i; const char *dpy_name = ""; int num_term = -1; ang_file *fff; char buf[1024]; const char *str; int val; int line = 0; /* Parse args */ for (i = 1; i < argc; i++) { if (prefix(argv[i], "-d")) { dpy_name = &argv[i][2]; continue; } if (prefix(argv[i], "-n")) { num_term = atoi(&argv[i][2]); if (num_term > MAX_TERM_DATA) num_term = MAX_TERM_DATA; else if (num_term < 1) num_term = 1; continue; } if (prefix(argv[i], "-x")) { x11_prefs = argv[i] + 2; continue; } plog_fmt("Ignoring option: %s", argv[i]); } if (num_term == -1) { num_term = 1; /* Build the filename */ (void)path_build(settings, sizeof(settings), ANGBAND_DIR_USER, "x11-settings.prf"); /* Open the file */ fff = file_open(settings, MODE_READ, -1); /* File exists */ if (fff) { /* Process the file */ while (file_getl(fff, buf, sizeof(buf))) { /* Count lines */ line++; /* Skip "empty" lines */ if (!buf[0]) continue; /* Skip "blank" lines */ if (isspace((unsigned char)buf[0])) continue; /* Skip comments */ if (buf[0] == '#') continue; /* Number of terminal windows */ if (prefix(buf, "TERM_WINS")) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) num_term = val; continue; } } /* Close */ (void)file_close(fff); } } /* Init the Metadpy if possible */ if (Metadpy_init_name(dpy_name)) return (-1); /* Remember the number of terminal windows */ term_windows_open = num_term; /* Prepare cursor color */ xor = ZNEW(infoclr); Infoclr_set(xor); Infoclr_init_ppn(Metadpy->fg, Metadpy->bg, "xor", 0); /* Prepare normal colors */ for (i = 0; i < 256; ++i) { Pixell pixel; clr[i] = ZNEW(infoclr); Infoclr_set(clr[i]); /* Acquire Angband colors */ color_table_x11[i][0] = angband_color_table[i][0]; color_table_x11[i][1] = angband_color_table[i][1]; color_table_x11[i][2] = angband_color_table[i][2]; color_table_x11[i][3] = angband_color_table[i][3]; /* Default to monochrome */ pixel = ((i == 0) ? Metadpy->bg : Metadpy->fg); /* Handle color */ if (Metadpy->color) { /* Create pixel */ pixel = create_pixel(Metadpy->dpy, color_table_x11[i][1], color_table_x11[i][2], color_table_x11[i][3]); } /* Initialize the color */ Infoclr_init_ppn(pixel, Metadpy->bg, "cpy", 0); } /* Initialize the windows */ for (i = 0; i < num_term; i++) { term_data *td = &data[i]; /* Initialize the term_data */ term_data_init(td, i); /* Save global entry */ angband_term[i] = Term; } /* Raise the "Angband" window */ Infowin_set(data[0].win); Infowin_raise(); /* Activate the "Angband" window screen */ Term_activate(&data[0].t); /* Activate hook */ quit_aux = hook_quit; /* Success */ return (0); } #endif /* USE_X11 */ angband-v3.3.2/src/prefs.c0000644000175000017500000005640111651552410014667 0ustar chriscchrisc/* * File: prefs.c * Purpose: Pref file handling code * * Copyright (c) 2003 Takeshi Mogami, Robert Ruehlmann * Copyright (c) 2007 Pete Mack * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "keymap.h" #include "prefs.h" #include "squelch.h" #include "spells.h" /*** Pref file saving code ***/ /* * Header and footer marker string for pref file dumps */ static const char *dump_separator = "#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#"; /* * Remove old lines from pref files * * If you are using setgid, make sure privileges were raised prior * to calling this. */ static void remove_old_dump(const char *cur_fname, const char *mark) { bool between_marks = FALSE; bool changed = FALSE; char buf[1024]; char start_line[1024]; char end_line[1024]; char new_fname[1024]; ang_file *new_file; ang_file *cur_file; /* Format up some filenames */ strnfmt(new_fname, sizeof(new_fname), "%s.new", cur_fname); /* Work out what we expect to find */ strnfmt(start_line, sizeof(start_line), "%s begin %s", dump_separator, mark); strnfmt(end_line, sizeof(end_line), "%s end %s", dump_separator, mark); /* Open current file */ cur_file = file_open(cur_fname, MODE_READ, -1); if (!cur_file) return; /* Open new file */ new_file = file_open(new_fname, MODE_WRITE, FTYPE_TEXT); if (!new_file) { msg("Failed to create file %s", new_fname); return; } /* Loop for every line */ while (file_getl(cur_file, buf, sizeof(buf))) { /* If we find the start line, turn on */ if (!strcmp(buf, start_line)) { between_marks = TRUE; } /* If we find the finish line, turn off */ else if (!strcmp(buf, end_line)) { between_marks = FALSE; changed = TRUE; } if (!between_marks) { /* Copy orginal line */ file_putf(new_file, "%s\n", buf); } } /* Close files */ file_close(cur_file); file_close(new_file); /* If there are changes, move things around */ if (changed) { char old_fname[1024]; strnfmt(old_fname, sizeof(old_fname), "%s.old", cur_fname); if (file_move(cur_fname, old_fname)) { file_move(new_fname, cur_fname); file_delete(old_fname); } } /* Otherwise just destroy the new file */ else { file_delete(new_fname); } } /* * Output the header of a pref-file dump */ static void pref_header(ang_file *fff, const char *mark) { /* Start of dump */ file_putf(fff, "%s begin %s\n", dump_separator, mark); file_putf(fff, "# *Warning!* The lines below are an automatic dump.\n"); file_putf(fff, "# Don't edit them; changes will be deleted and replaced automatically.\n"); } /* * Output the footer of a pref-file dump */ static void pref_footer(ang_file *fff, const char *mark) { file_putf(fff, "# *Warning!* The lines above are an automatic dump.\n"); file_putf(fff, "# Don't edit them; changes will be deleted and replaced automatically.\n"); /* End of dump */ file_putf(fff, "%s end %s\n", dump_separator, mark); } /* * Write all current options to a user preference file. */ void option_dump(ang_file *fff) { int i, j; /* Dump options (skip cheat, adult, score) */ for (i = 0; i < OPT_CHEAT; i++) { const char *name = option_name(i); if (!name) continue; /* Comment */ file_putf(fff, "# Option '%s'\n", option_desc(i)); /* Dump the option */ if (op_ptr->opt[i]) file_putf(fff, "Y:%s\n", name); else file_putf(fff, "X:%s\n", name); /* Skip a line */ file_putf(fff, "\n"); } /* Dump window flags */ for (i = 1; i < ANGBAND_TERM_MAX; i++) { /* Require a real window */ if (!angband_term[i]) continue; /* Check each flag */ for (j = 0; j < (int)N_ELEMENTS(window_flag_desc); j++) { /* Require a real flag */ if (!window_flag_desc[j]) continue; /* Comment */ file_putf(fff, "# Window '%s', Flag '%s'\n", angband_term_name[i], window_flag_desc[j]); /* Dump the flag */ if (op_ptr->window_flag[i] & (1L << j)) file_putf(fff, "W:%d:%d:1\n", i, j); else file_putf(fff, "W:%d:%d:0\n", i, j); /* Skip a line */ file_putf(fff, "\n"); } } keymap_dump(fff); } /* Dump monsters */ void dump_monsters(ang_file *fff) { int i; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; byte attr = r_ptr->x_attr; byte chr = r_ptr->x_char; /* Skip non-entries */ if (!r_ptr->name) continue; file_putf(fff, "# Monster: %s\n", r_ptr->name); file_putf(fff, "R:%d:%d:%d\n", i, attr, chr); } } /* Dump objects */ void dump_objects(ang_file *fff) { int i; file_putf(fff, "# Objects\n"); for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; const char *name = k_ptr->name; if (!name) continue; if (name[0] == '&' && name[1] == ' ') name += 2; file_putf(fff, "K:%s:%s:%d:%d\n", tval_find_name(k_ptr->tval), name, k_ptr->x_attr, k_ptr->x_char); } } /* Dump features */ void dump_features(ang_file *fff) { int i; for (i = 0; i < z_info->f_max; i++) { feature_type *f_ptr = &f_info[i]; size_t j; /* Skip non-entries */ if (!f_ptr->name) continue; /* Skip mimic entries -- except invisible trap */ if ((f_ptr->mimic != i) && (i != FEAT_INVIS)) continue; file_putf(fff, "# Terrain: %s\n", f_ptr->name); for (j = 0; j < FEAT_LIGHTING_MAX; j++) { byte attr = f_ptr->x_attr[j]; byte chr = f_ptr->x_char[j]; const char *light = NULL; if (j == FEAT_LIGHTING_BRIGHT) light = "bright"; else if (j == FEAT_LIGHTING_LIT) light = "lit"; else if (j == FEAT_LIGHTING_DARK) light = "dark"; assert(light); file_putf(fff, "F:%d:%s:%d:%d\n", i, light, attr, chr); } } } /* Dump flavors */ void dump_flavors(ang_file *fff) { struct flavor *f; for (f = flavors; f; f = f->next) { byte attr = f->x_attr; byte chr = f->x_char; file_putf(fff, "# Item flavor: %s\n", f->text); file_putf(fff, "L:%d:%d:%d\n\n", f->fidx, attr, chr); } } /* Dump colors */ void dump_colors(ang_file *fff) { int i; for (i = 0; i < MAX_COLORS; i++) { int kv = angband_color_table[i][0]; int rv = angband_color_table[i][1]; int gv = angband_color_table[i][2]; int bv = angband_color_table[i][3]; const char *name = "unknown"; /* Skip non-entries */ if (!kv && !rv && !gv && !bv) continue; /* Extract the color name */ if (i < BASIC_COLORS) name = color_table[i].name; file_putf(fff, "# Color: %s\n", name); file_putf(fff, "V:%d:%d:%d:%d:%d\n\n", i, kv, rv, gv, bv); } } /** * Save a set of preferences to file, overwriting any old preferences with the * same title. * * \param path is the filename to dump to * \param dump is a pointer to the function that does the writing to file * \param title is the name of this set of preferences * * \returns TRUE on success, FALSE otherwise. */ bool prefs_save(const char *path, void (*dump)(ang_file *), const char *title) { ang_file *fff; safe_setuid_grab(); /* Remove old keymaps */ remove_old_dump(path, title); fff = file_open(path, MODE_APPEND, FTYPE_TEXT); if (!fff) { safe_setuid_drop(); return FALSE; } /* Append the header */ pref_header(fff, title); file_putf(fff, "\n\n"); file_putf(fff, "# %s definitions\n\n", strstr(title, " ")); dump(fff); file_putf(fff, "\n\n\n"); pref_footer(fff, title); file_close(fff); safe_setuid_drop(); return TRUE; } /*** Pref file parser ***/ /** * Private data for pref file parsing. */ struct prefs_data { bool bypass; struct keypress keymap_buffer[KEYMAP_ACTION_MAX]; bool user; bool loaded_window_flag[ANGBAND_TERM_MAX]; u32b window_flags[ANGBAND_TERM_MAX]; }; /** * Load another file. */ static enum parser_error parse_prefs_load(struct parser *p) { struct prefs_data *d = parser_priv(p); const char *file; assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; file = parser_getstr(p, "file"); (void)process_pref_file(file, TRUE, d->user); return PARSE_ERROR_NONE; } /* * Helper function for "process_pref_file()" * * Input: * v: output buffer array * f: final character * * Output: * result */ static const char *process_pref_file_expr(char **sp, char *fp) { const char *v; char *b; char *s; char f = ' '; /* Initial */ s = (*sp); /* Skip spaces */ while (isspace((unsigned char)*s)) s++; /* Save start */ b = s; /* Default */ v = "?o?o?"; /* Analyze */ if (*s == '[') { const char *p; const char *t; /* Skip [ */ s++; /* First */ t = process_pref_file_expr(&s, &f); /* Oops */ if (!*t) { /* Nothing */ } /* Function: IOR */ else if (streq(t, "IOR")) { v = "0"; while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); if (*t && !streq(t, "0")) v = "1"; } } /* Function: AND */ else if (streq(t, "AND")) { v = "1"; while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); if (*t && streq(t, "0")) v = "0"; } } /* Function: NOT */ else if (streq(t, "NOT")) { v = "1"; while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); if (*t && !streq(t, "0")) v = "0"; } } /* Function: EQU */ else if (streq(t, "EQU")) { v = "1"; if (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } while (*s && (f != ']')) { p = t; t = process_pref_file_expr(&s, &f); if (*t && !streq(p, t)) v = "0"; } } /* Function: LEQ */ else if (streq(t, "LEQ")) { v = "1"; if (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } while (*s && (f != ']')) { p = t; t = process_pref_file_expr(&s, &f); if (*t && (strcmp(p, t) >= 0)) v = "0"; } } /* Function: GEQ */ else if (streq(t, "GEQ")) { v = "1"; if (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } while (*s && (f != ']')) { p = t; t = process_pref_file_expr(&s, &f); if (*t && (strcmp(p, t) <= 0)) v = "0"; } } /* Oops */ else { while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } } /* Verify ending */ if (f != ']') v = "?x?x?"; /* Extract final and Terminate */ if ((f = *s) != '\0') *s++ = '\0'; } /* Other */ else { /* Accept all printables except spaces and brackets */ while (isprint((unsigned char)*s) && !strchr(" []", *s)) ++s; /* Extract final and Terminate */ if ((f = *s) != '\0') *s++ = '\0'; /* Variable */ if (*b == '$') { if (streq(b+1, "SYS")) v = ANGBAND_SYS; else if (streq(b+1, "GRAF")) v = ANGBAND_GRAF; else if (streq(b+1, "RACE")) v = p_ptr->race->name; else if (streq(b+1, "CLASS")) v = p_ptr->class->name; else if (streq(b+1, "PLAYER")) v = op_ptr->base_name; } /* Constant */ else { v = b; } } /* Save */ (*fp) = f; (*sp) = s; return v; } static enum parser_error parse_prefs_expr(struct parser *p) { struct prefs_data *d = parser_priv(p); const char *v; char *str; char *expr; char f; assert(d != NULL); /* XXX this can be avoided with a rewrite of process_pref_file_expr */ str = expr = string_make(parser_getstr(p, "expr")); /* Parse the expr */ v = process_pref_file_expr(&expr, &f); /* Set flag */ d->bypass = streq(v, "0"); string_free(str); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_k(struct parser *p) { int tvi, svi; object_kind *kind; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; tvi = tval_find_idx(parser_getsym(p, "tval")); if (tvi < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; svi = lookup_sval(tvi, parser_getsym(p, "sval")); if (svi < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; kind = lookup_kind(tvi, svi); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; kind->x_attr = (byte)parser_getint(p, "attr"); kind->x_char = (char)parser_getint(p, "char"); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_r(struct parser *p) { int idx; monster_race *monster; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); if (idx >= z_info->r_max) return PARSE_ERROR_OUT_OF_BOUNDS; monster = &r_info[idx]; monster->x_attr = (byte)parser_getint(p, "attr"); monster->x_char = (char)parser_getint(p, "char"); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_f(struct parser *p) { int idx; feature_type *feature; const char *lighting; int light_idx; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); if (idx >= z_info->f_max) return PARSE_ERROR_OUT_OF_BOUNDS; lighting = parser_getsym(p, "lighting"); if (streq(lighting, "bright")) light_idx = FEAT_LIGHTING_BRIGHT; else if (streq(lighting, "lit")) light_idx = FEAT_LIGHTING_LIT; else if (streq(lighting, "dark")) light_idx = FEAT_LIGHTING_DARK; else if (streq(lighting, "all")) light_idx = FEAT_LIGHTING_MAX; else return PARSE_ERROR_GENERIC; /* xxx fixme */ if (light_idx < FEAT_LIGHTING_MAX) { feature = &f_info[idx]; feature->x_attr[light_idx] = (byte)parser_getint(p, "attr"); feature->x_char[light_idx] = (char)parser_getint(p, "char"); } else { for (light_idx = 0; light_idx < FEAT_LIGHTING_MAX; light_idx++) { feature = &f_info[idx]; feature->x_attr[light_idx] = (byte)parser_getint(p, "attr"); feature->x_char[light_idx] = (char)parser_getint(p, "char"); } } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_gf(struct parser *p) { bool types[GF_MAX] = { 0 }; const char *direction; int motion; char *s, *t; size_t i; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; /* Parse the type, which is a | seperated list of GF_ constants */ s = string_make(parser_getsym(p, "type")); t = strtok(s, "| "); while (t) { if (streq(t, "*")) { memset(types, TRUE, sizeof types); } else { int idx = gf_name_to_idx(t); if (idx == -1) return PARSE_ERROR_INVALID_VALUE; types[idx] = TRUE; } t = strtok(NULL, "| "); } string_free(s); direction = parser_getsym(p, "direction"); if (streq(direction, "static")) motion = BOLT_NO_MOTION; else if (streq(direction, "0")) motion = BOLT_0; else if (streq(direction, "45")) motion = BOLT_45; else if (streq(direction, "90")) motion = BOLT_90; else if (streq(direction, "135")) motion = BOLT_135; else return PARSE_ERROR_INVALID_VALUE; for (i = 0; i < GF_MAX; i++) { if (!types[i]) continue; gf_to_attr[i][motion] = (byte)parser_getuint(p, "attr"); gf_to_char[i][motion] = (char)parser_getuint(p, "char"); } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_l(struct parser *p) { unsigned int idx; struct flavor *flavor; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); for (flavor = flavors; flavor; flavor = flavor->next) if (flavor->fidx == idx) break; if (flavor) { flavor->x_attr = (byte)parser_getint(p, "attr"); flavor->x_char = (char)parser_getint(p, "char"); } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_e(struct parser *p) { int tvi, a; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; tvi = tval_find_idx(parser_getsym(p, "tval")); if (tvi < 0 || tvi >= (long)N_ELEMENTS(tval_to_attr)) return PARSE_ERROR_UNRECOGNISED_TVAL; a = parser_getint(p, "attr"); if (a) tval_to_attr[tvi] = (byte) a; return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_q(struct parser *p) { struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; if (parser_hasval(p, "sval") && parser_hasval(p, "flag")) { object_kind *kind; int tvi, svi; tvi = tval_find_idx(parser_getsym(p, "n")); if (tvi < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; svi = lookup_sval(tvi, parser_getsym(p, "sval")); if (svi < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; kind = lookup_kind(tvi, svi); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; kind->squelch = parser_getint(p, "flag"); } else { int idx = parser_getint(p, "idx"); int level = parser_getint(p, "n"); squelch_level[idx] = level; } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_b(struct parser *p) { int idx; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); if (idx > z_info->k_max) return PARSE_ERROR_OUT_OF_BOUNDS; add_autoinscription(idx, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_a(struct parser *p) { const char *act; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; act = parser_getstr(p, "act"); keypress_from_text(d->keymap_buffer, N_ELEMENTS(d->keymap_buffer), act); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_c(struct parser *p) { int mode; struct keypress tmp[2]; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; mode = parser_getint(p, "mode"); if (mode < 0 || mode >= KEYMAP_MODE_MAX) return PARSE_ERROR_OUT_OF_BOUNDS; keypress_from_text(tmp, N_ELEMENTS(tmp), parser_getstr(p, "key")); if (tmp[0].type != EVT_KBRD || tmp[1].type != EVT_NONE) return PARSE_ERROR_FIELD_TOO_LONG; keymap_add(mode, tmp[0], d->keymap_buffer, d->user); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_m(struct parser *p) { int a, type; const char *attr; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; type = parser_getint(p, "type"); attr = parser_getsym(p, "attr"); if (strlen(attr) > 1) a = color_text_to_attr(attr); else a = color_char_to_attr(attr[0]); if (a < 0) return PARSE_ERROR_INVALID_COLOR; message_color_define((u16b)type, (byte)a); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_v(struct parser *p) { int idx; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); if (idx > MAX_COLORS) return PARSE_ERROR_OUT_OF_BOUNDS; angband_color_table[idx][0] = parser_getint(p, "k"); angband_color_table[idx][1] = parser_getint(p, "r"); angband_color_table[idx][2] = parser_getint(p, "g"); angband_color_table[idx][3] = parser_getint(p, "b"); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_w(struct parser *p) { int window; size_t flag; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; window = parser_getint(p, "window"); if (window <= 0 || window >= ANGBAND_TERM_MAX) return PARSE_ERROR_OUT_OF_BOUNDS; flag = parser_getuint(p, "flag"); if (flag >= N_ELEMENTS(window_flag_desc)) return PARSE_ERROR_OUT_OF_BOUNDS; if (window_flag_desc[flag]) { int value = parser_getuint(p, "value"); if (value) d->window_flags[window] |= (1L << flag); else d->window_flags[window] &= ~(1L << flag); } d->loaded_window_flag[window] = TRUE; return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_x(struct parser *p) { struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; /* XXX check for valid option */ option_set(parser_getstr(p, "option"), FALSE); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_y(struct parser *p) { struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; option_set(parser_getstr(p, "option"), TRUE); return PARSE_ERROR_NONE; } static struct parser *init_parse_prefs(bool user) { struct parser *p = parser_new(); struct prefs_data *pd = mem_zalloc(sizeof *pd); int i; parser_setpriv(p, pd); pd->user = user; for (i = 0; i < ANGBAND_TERM_MAX; i++) { pd->loaded_window_flag[i] = FALSE; } parser_reg(p, "% str file", parse_prefs_load); parser_reg(p, "? str expr", parse_prefs_expr); parser_reg(p, "K sym tval sym sval int attr int char", parse_prefs_k); parser_reg(p, "R uint idx int attr int char", parse_prefs_r); parser_reg(p, "F uint idx sym lighting int attr int char", parse_prefs_f); parser_reg(p, "GF sym type sym direction uint attr uint char", parse_prefs_gf); parser_reg(p, "L uint idx int attr int char", parse_prefs_l); parser_reg(p, "E sym tval int attr", parse_prefs_e); parser_reg(p, "Q sym idx sym n ?sym sval ?sym flag", parse_prefs_q); /* XXX should be split into two kinds of line */ parser_reg(p, "B uint idx str text", parse_prefs_b); /* XXX idx should be {tval,sval} pair! */ parser_reg(p, "A str act", parse_prefs_a); parser_reg(p, "C int mode str key", parse_prefs_c); parser_reg(p, "M int type sym attr", parse_prefs_m); parser_reg(p, "V uint idx int k int r int g int b", parse_prefs_v); parser_reg(p, "W int window uint flag uint value", parse_prefs_w); parser_reg(p, "X str option", parse_prefs_x); parser_reg(p, "Y str option", parse_prefs_y); return p; } errr finish_parse_prefs(struct parser *p) { struct prefs_data *d = parser_priv(p); int i; /* Update sub-windows based on the newly read-in prefs. * * The op_ptr->window_flag[] array cannot be updated directly during * parsing since the changes between the existing flags and the new * are used to set/unset the event handlers that update the windows. * * Build a complete set to pass to subwindows_set_flags() by loading * any that weren't read in by the parser from the existing set. */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { if (!d->loaded_window_flag[i]) d->window_flags[i] = op_ptr->window_flag[i]; } subwindows_set_flags(d->window_flags, ANGBAND_TERM_MAX); return PARSE_ERROR_NONE; } errr process_pref_file_command(const char *s) { struct parser *p = init_parse_prefs(TRUE); errr e = parser_parse(p, s); mem_free(parser_priv(p)); parser_destroy(p); return e; } static void print_error(const char *name, struct parser *p) { struct parser_state s; parser_getstate(p, &s); msg("Parse error in %s line %d column %d: %s: %s", name, s.line, s.col, s.msg, parser_error_str[s.error]); message_flush(); } /* * Process the user pref file with the given name. * "quiet" means "don't complain about not finding the file. * * 'user' should be TRUE if the pref file loaded is user-specific and not * a game default. * * Returns TRUE if everything worked OK, false otherwise */ bool process_pref_file(const char *name, bool quiet, bool user) { char buf[1024]; ang_file *f; struct parser *p; errr e = 0; int line_no = 0; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, name); if (!file_exists(buf)) path_build(buf, sizeof(buf), ANGBAND_DIR_USER, name); f = file_open(buf, MODE_READ, -1); if (!f) { if (!quiet) msg("Cannot open '%s'.", buf); } else { char line[1024]; p = init_parse_prefs(user); while (file_getl(f, line, sizeof line)) { line_no++; e = parser_parse(p, line); if (e != PARSE_ERROR_NONE) { print_error(buf, p); break; } } finish_parse_prefs(p); file_close(f); mem_free(parser_priv(p)); parser_destroy(p); } /* Result */ return e == PARSE_ERROR_NONE; } angband-v3.3.2/src/list-player-flags.h0000644000175000017500000000167711651552410017121 0ustar chriscchrisc/* list-player-flags.h - player race and class flags * * Adjusting these flags does not break savefiles. Flags below start from 1 * on line 11, so a flag's sequence number is its line number minus 10. * * */ /* symbol descr */ PF(NONE, "") PF(EXTRA_SHOT, "receive extra shots with tension bows at levels 20 and 40") PF(BRAVERY_30, "become immune to fear at level 30") PF(BLESS_WEAPON, "may only wield blessed or hafted weapons") PF(CUMBER_GLOVE, "have difficulty using magic with covered hands") PF(ZERO_FAIL, "may obtain a perfect success rate with magic") PF(BEAM, "frequently turn bolt spells into beams") PF(CHOOSE_SPELLS, "may choose their own spells to study") PF(PSEUDO_ID_IMPROV, "get better at psudo id with experience") PF(KNOW_MUSHROOM, "easily recognize mushrooms") PF(KNOW_ZAPPER, "easily recognize magic devices") PF(SEE_ORE, "can sense ore in the walls") angband-v3.3.2/src/textui.h0000644000175000017500000000051311651552410015070 0ustar chriscchrisc #include "game-cmd.h" /* From xtra3.c */ /* Ask the textui core for a game command. */ extern errr textui_get_cmd(cmd_context context, bool wait); /* Set up game event handlers for the textui. */ void init_display(void); /* From cmd0.c */ /* Get a command through the text UI */ void textui_process_command(bool no_request); angband-v3.3.2/src/x-char.h0000644000175000017500000000451211651552410014733 0ustar chriscchrisc#ifndef INCLUDED_X_CHAR_H #define INCLUDED_X_CHAR_H /* Column titles for character information table */ #define COLUMN_TO_UPPER 0 #define COLUMN_TO_LOWER 1 #define COLUMN_CHAR_TYPE 2 #define CHAR_TABLE_SLOTS 3 /* Bit flags for COLUMN_CHAR_TYPE */ #define CHAR_BLANK 0x01 #define CHAR_UPPER 0x02 #define CHAR_LOWER 0x04 #define CHAR_PUNCT 0x08 #define CHAR_SYMBOL 0x10 #define CHAR_DIGIT 0x20 #define CHAR_VOWEL 0x40 #define CHAR_XXXX3 0x80 /* * Modes of operation for the "xstr_trans()" function. */ #define LATIN1 0 #define SYSTEM_SPECIFIC 1 #define ASCII 2 /* * Set of customized macros for use with 256 character set */ #define my_isupper(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_UPPER)) #define my_islower(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_LOWER)) #define my_isalpha(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_UPPER | CHAR_LOWER)) #define my_isspace(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_BLANK)) #define my_is_vowel(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_VOWEL)) #define my_ispunct(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_PUNCT)) #define my_isdigit(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_DIGIT)) #define my_isalnum(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_UPPER | CHAR_LOWER | CHAR_DIGIT)) #define my_isprint(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_BLANK | CHAR_UPPER | CHAR_LOWER | \ CHAR_PUNCT | CHAR_DIGIT)) /* Note: the regular is_graph does not have the CHAR_SYMBOL check) */ #define my_isgraph(Y) \ (char_tables[(byte)(Y)][COLUMN_CHAR_TYPE] & (CHAR_UPPER | CHAR_LOWER | \ CHAR_PUNCT | CHAR_DIGIT | CHAR_SYMBOL)) #define my_toupper(Y) \ (char_tables[(byte)(Y)][COLUMN_TO_UPPER]) #define my_tolower(Y) \ (char_tables[(byte)(Y)][COLUMN_TO_LOWER]) /* * An extended character translation. Using a tag, * get a 8-bit character. Or, using an 8-bit character, * get a tag. */ typedef struct xchar_type xchar_type; struct xchar_type { const char *tag; byte c; }; /* * x-char.c function declarations are located in externs.h. * x-char-c tables are loctaed in tables.c */ #endif /* INCLUDED_X_CHAR_H */ angband-v3.3.2/src/main-nds.c0000644000175000017500000013456211651552410015263 0ustar chriscchrisc/* * File: main-nds.c * Purpose: Main file for playing on the Nintendo DS * * Copyright (c) 2010 Nick McConnell * * Many of the routines are based on (or lifted directly from) brettk's * excellent NethackDS: http://frodo.dyn.gno.org/~brettk/NetHackDS * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include #include "angband.h" #include "buildid.h" #include "main.h" /* DS includes */ #include "nds/ds_errfont.h" #include "nds/ds_main.h" u16* subfont_rgb_bin = (u16*)(0x06018400); u16* subfont_bgr_bin = (u16*)(0x0601C400); u16* top_font_bin; u16* btm_font_bin; u16* tiles_bin;// = (u16*)0x06020400; #define NDS_BUTTON_FILE "buttons.dat" #define NDS_MAPPABLE_MASK (KEY_A | KEY_B | KEY_X | KEY_Y | KEY_START | KEY_SELECT) #define NDS_MODIFIER_MASK (KEY_L | KEY_R) #define NDS_BUTTON_MASK (NDS_MAPPABLE_MASK | NDS_MODIFIER_MASK) #define NDS_NUM_MAPPABLE 6 // A, B, X, Y, Select, Start #define NDS_NUM_MODIFIER 2 // R, L #define NDS_CMD_LENGTH 16 // max. 15 keys/button + null terminator //[mappable]*2^[mods] things to map commands to, [cmd_length] chars per command byte nds_btn_cmds[NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER][NDS_CMD_LENGTH]; /* make sure there's something there to start with - NRM */ byte btn_defaults[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'z'}; const s16 mappables[] = { KEY_A, KEY_B, KEY_X, KEY_Y, KEY_SELECT, KEY_START }; const s16 modifiers[] = { KEY_L, KEY_R }; s16 nds_buttons_to_btnid(u16 kd, u16 kh) { if (!(kd & NDS_MAPPABLE_MASK)) return -1; u16 i, mods = 0; for (i=0;i>3),(a[i+1]>>3),(a[i+2]>>3))) #define c2(a,i) (RGB15((a[i+2]>>3),(a[i+1]>>3),(a[i]>>3))) #define TILE_BUFFER_SIZE (TILE_WIDTH*TILE_HEIGHT*(total_tiles_used+1)*2) const nds_kbd_key row0[] = { {16,(u16)'`'}, {16,(u16)'1'}, {16,(u16)'2'}, {16,(u16)'3'}, {16,(u16)'4'}, {16,(u16)'5'}, {16,(u16)'6'}, {16,(u16)'7'}, {16,(u16)'8'}, {16,(u16)'9'}, {16,(u16)'0'}, {16,(u16)'-'}, {16,(u16)'='}, {32,(u16)'\b'}, {0,0}}; const nds_kbd_key row1[] = { {24,(u16)'\t'}, {16,(u16)'q'}, {16,(u16)'w'}, {16,(u16)'e'}, {16,(u16)'r'}, {16,(u16)'t'}, {16,(u16)'y'}, {16,(u16)'u'}, {16,(u16)'i'}, {16,(u16)'o'}, {16,(u16)'p'}, {16,(u16)'['}, {16,(u16)']'}, {24,(u16)'\\'}, {0,0}}; const nds_kbd_key row2[] = { {32,K_CAPS}, {16,(u16)'a'}, {16,(u16)'s'}, {16,(u16)'d'}, {16,(u16)'f'}, {16,(u16)'g'}, {16,(u16)'h'}, {16,(u16)'j'}, {16,(u16)'k'}, {16,(u16)'l'}, {16,(u16)';'}, {16,(u16)'\''}, {32,(u16)'\n'}, {0,0}}; const nds_kbd_key row3[] = { {40,K_SHIFT}, {16,(u16)'z'}, {16,(u16)'x'}, {16,(u16)'c'}, {16,(u16)'v'}, {16,(u16)'b'}, {16,(u16)'n'}, {16,(u16)'m'}, {16,(u16)','}, {16,(u16)'.'}, {16,(u16)'/'}, {40,K_SHIFT}, {0,0}}; const nds_kbd_key row4[] = { {32,K_CTRL}, {24,K_ALT}, {128,(u16)' '}, {24,K_ALT}, {32,K_CTRL}, {0,0}}; char shifts[] = "`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}\\|;:\'\",<.>/?"; const nds_kbd_key *kbdrows[] = {row0, row1, row2, row3, row4}; /* * Extra data to associate with each "window" * * Each "window" is represented by a "term_data" structure, which * contains a "term" structure, which contains a pointer (t->data) * back to the term_data structure. */ typedef struct term_data term_data; struct term_data { term t; byte rows; byte cols; int tile_height; int tile_width; }; /* * Number of "term_data" structures to support XXX XXX XXX * * You MUST support at least one "term_data" structure, and the * game will currently use up to eight "term_data" structures if * they are available. * * If only one "term_data" structure is supported, then a lot of * the things that would normally go into a "term_data" structure * could be made into global variables instead. */ #define MAX_TERM_DATA 1 /* * An array of "term_data" structures, one for each "sub-window" */ static term_data data[MAX_TERM_DATA]; /* * Colour data */ u16b color_data[] = { RGB15( 0, 0, 0), /* TERM_DARK */ RGB15( 31, 31, 31), /* TERM_WHITE */ RGB15( 15, 15, 15), /* TERM_SLATE */ RGB15( 31, 15, 0), /* TERM_ORANGE */ RGB15( 23, 0, 0), /* TERM_RED */ RGB15( 0, 15, 9), /* TERM_GREEN */ RGB15( 0, 0, 31), /* TERM_BLUE */ RGB15( 15, 9, 0), /* TERM_UMBER */ RGB15( 9, 9, 9), /* TERM_L_DARK */ RGB15( 23, 23, 23), /* TERM_L_WHITE */ RGB15( 31, 0, 31), /* TERM_VIOLET */ RGB15( 31, 31, 0), /* TERM_YELLOW */ RGB15( 31, 0, 0), /* TERM_L_RED */ RGB15( 0, 31, 0), /* TERM_L_GREEN */ RGB15( 0, 31, 31), /* TERM_L_BLUE */ RGB15( 23, 15, 9) /* TERM_L_UMBER */ }; /*** Function hooks needed by "Term" ***/ /* * Init a new "term" * * This function should do whatever is necessary to prepare a new "term" * for use by the "term.c" package. This may include clearing the window, * preparing the cursor, setting the font/colors, etc. Usually, this * function does nothing, and the "init_xxx()" function does it all. */ static void Term_init_nds(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Nuke an old "term" * * This function is called when an old "term" is no longer needed. It should * do whatever is needed to clean up before the program exits, such as wiping * the screen, restoring the cursor, fixing the font, etc. Often this function * does nothing and lets the operating system clean up when the program quits. */ static void Term_nuke_nds(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Find the square a particular pixel is part of. */ static void pixel_to_square(int * const x, int * const y, const int ox, const int oy) { (*x) = ox / TILE_WIDTH; (*y) = oy / TILE_HEIGHT; } /* * Handle a touch on the touch screen. */ static void handle_touch(int x, int y, int button, bool press) { /* The co-ordinates are only used in Angband format. */ pixel_to_square(&x, &y, x, y); if (press) Term_mousepress(x, y, button); } /* * Touchscreen keyboard handling */ static bool shift = false, ctrl = false, alt = false, caps = false; u16b kbd_mod_code(u16 ret) { if (ret & K_MODIFIER) return ret; if (caps && !shift) { if (ret >= 'a' && ret <= 'z') ret -= 0x20; } if (shift) { char* temp; if (!caps && ret >= 'a' && ret <= 'z') ret -= 0x20; if ((temp = strchr(shifts,ret)) != NULL) ret = *(temp + 1); } if (alt) { ret |= 0x80; } if (ctrl/* && ret >= 'a' && ret < 'a'+32*/) { ret = ret & 0x1f; } return ret; } void kbd_set_color_from_pos(u16b r, u16b k, byte color) { u16b ii, xx = 0, jj; u16b *map[] = { (u16b*)(BG_MAP_RAM_SUB(8)+3*32*2), (u16b*)(BG_MAP_RAM_SUB(9)+3*32*2), (u16b*)(BG_MAP_RAM_SUB(10)+3*32*2), (u16b*)(BG_MAP_RAM_SUB(11)+3*32*2) }; for (ii = 0; ii < k; ii++) { xx += kbdrows[r][ii].width >> 3; } for (ii = 0; ii < (kbdrows[r][k].width>>3); ii++) { for (jj = 0; jj < 4; jj++) { map[jj][(10 + r * 2) * 32 + ii + xx + 1] = (map[jj][(10+r*2)*32+ii+xx+1] & 0x0FFF) | (color << 12); map[jj][(10 + r * 2 + 1) * 32 + ii + xx + 1] = (map[jj][(10+r*2+1)*32+ii+xx+1] & 0x0FFF) | (color << 12); } } } void kbd_set_color_from_code(u16b code, byte color) { u16b r,k; for (r = 0; r < 5; r++) { for (k = 0; kbdrows[r][k].width != 0; k++) { if (kbd_mod_code(kbdrows[r][k].code) == code) { kbd_set_color_from_pos(r,k,color); } // do not break!! there may be >1 key with this code (modifier keys) } } } void kbd_set_map() { SUB_BG0_CR = BG_TILE_BASE(0) | BG_MAP_BASE(8 + (caps | (shift<<1))) | BG_PRIORITY(0) | BG_16_COLOR; } u16b kbd_xy2key(byte x, byte y) { if (x >= 104 && x < 152 && y >=24 && y < 72) { // on arrow-pad byte kx = (x-104)/16, ky = (y-24)/16; return (kx + (2 - ky) * 3 + 1 + '0')/* | (shift ? K_SHIFTED_MOVE : 0)*/; } if (y >=80 && y < 96) { if (x >= 8 && x < 24) return '\033'; if (x >= 40 && x < 248) { // F-key x -= 40; y = x/72; // which section x -= y*72; // offset in section if (x < 64) { return K_F(y*4+(x>>4)+1); // section*4 + offset/16 + 1 } else { return 0; } } } s16b ox = x - 8, oy = y-104; if (ox < 0 || ox >= 240) return 0; if (oy < 0 || oy >= 80) return 0; u16b row = oy / 16; int i; for (i = 0; ox > 0; ox -= kbdrows[row][i++].width); u16b ret = kbdrows[row][i-1].code; return kbd_mod_code(ret); } void kbd_dotoggle(bool *flag, int how) { switch (how) { case 0: *flag = false; return; case 1: *flag = true; return; default: case -1: *flag = !*flag; return; } } // which: K_SHIFT, K_CTRL, K_ALT, K_MODIFIER=all keys // how: -1 = toggle, 0 = off, 1 = on void kbd_togglemod(int which, int how) { //boolean old_shift = shift, old_ctrl = ctrl, old_alt = alt, old_caps = caps; switch (which) { case K_CTRL: kbd_dotoggle(&ctrl,how); break; case K_SHIFT: kbd_dotoggle(&shift,how); break; case K_ALT: kbd_dotoggle(&alt,how); break; case K_CAPS: kbd_dotoggle(&caps,how); break; case K_MODIFIER: kbd_dotoggle(&ctrl,how); kbd_dotoggle(&shift,how); kbd_dotoggle(&alt,how); // NOT caps!! This is called to un-set shift, ctrl, and alt after // a key is pressed. Unsetting caps here would cause it to be the // same as shift. break; } /* if (old_shift != shift) */ kbd_set_color_from_code(K_SHIFT,shift); /* if (old_ctrl != ctrl) */ kbd_set_color_from_code(K_CTRL,ctrl); /* if (old_alt != alt) */ kbd_set_color_from_code(K_ALT,alt); /* if (old_caps != caps) */ kbd_set_color_from_code(K_CAPS,caps); kbd_set_map(); } // clear this to prevent alt-b, f5, and f6 from having their special effects // it's cleared during getlin, yn_function, etc byte process_special_keystrokes = 1; // run this every frame // returns a key code if one has been typed, else returns 0 // assumes scankeys() was already called this frame (in real vblank handler) byte kbd_vblank() { // frames the stylus has been held down for static u16b touched = 0; // coordinates from each frame, the median is used to get the keycode static s16b xarr[3],yarr[3]; // the keycode of the last key pressed, so it can be un-highlighted static u16b last_code; // the keycode of the currently pressed key, is usu. returned u16b keycode; // if screen is being touched... if (keysHeld() & KEY_TOUCH) { if (touched < 3) { // if counter < 3... touched++; // add to counter xarr[touched-1] = IPC->touchXpx; // add this to the array for yarr[touched-1] = IPC->touchYpx; // finding the median } } else { // not being touched touched = 0; // so reset the counter for next time } // if the stylus was released if (keysUp() & KEY_TOUCH) { // if last_code is set and it wasn't a modifier if (last_code && !(last_code & K_MODIFIER)) { // clear the hiliting on this key kbd_set_color_from_code(last_code,0); // and also clear all modifiers (except caps) kbd_togglemod(K_MODIFIER, 0); } last_code = 0; } // if the screen has been touched for 3 frames... if (touched == 3) { touched++; // do not return the keycode again // also, not setting to zero prevents the keysHeld() thing // from starting the process over and getting 3 more samples u16b i, tmp, the_x=0, the_y=0; // x/yarr now contains 3 values from each of the 3 frames // take the median of each array and put into the_x/y // sort the array // bubble sort, ugh for (i = 1; i < 3; i++) { if (xarr[i] < xarr[i-1]) { tmp = xarr[i]; xarr[i] = xarr[i-1]; xarr[i-1] = tmp; } if (yarr[i] < yarr[i-1]) { tmp = yarr[i]; yarr[i] = yarr[i-1]; yarr[i-1] = tmp; } } // get the middle value (median) // if it's -1, take the top value if (xarr[1] == -1) the_x = xarr[2]; else the_x = xarr[1]; if (yarr[1] == -1) the_y = yarr[2]; else the_y = yarr[1]; // get the keycode that corresponds to this key u16b keycode = kbd_xy2key(the_x, the_y); // if it's not a modifier, highlight it if (keycode && !(keycode & K_MODIFIER)) kbd_set_color_from_code(keycode,1); // set last_code so it can be un-highlighted later last_code = keycode; /*// check for special keystrokes: alt-b, f5, f6 if (process_special_keystrokes) { // alt-b: assign button macro if (keycode == ('b' | 0x80)) { // clear hiliting kbd_set_color_from_code(keycode,0); kbd_togglemod(K_MODIFIER,0); nds_assign_button(); keycode = last_code = 0; // don't let nethack process it } if (keycode & K_F(0)) { // its an f-key if (keycode == K_F(5)) { // F5: toggle to text mode nds_ascii_graphics = ~nds_ascii_graphics; iflags.use_color = nds_ascii_graphics; //doredraw(); keycode = 'R' & 0x1F; // send a redraw command to nethack last_code = 0; } else if (keycode == K_F(6)) { // F6: toggle top font swap_font(false); nds_updated = 0xFF; if (access("/NetHack/swapfont",04)!= -1) { unlink("/NetHack/swapfont"); } else { FILE* f = fopen("/NetHack/swapfont","w"); fwrite(&f,4,1,f); // otherwise FileExists doesnt work fclose(f); } keycode = last_code = 0; } kbd_togglemod(K_MODIFIER,0); } }*/ // if it's a modifier, toggle it if (keycode & K_MODIFIER) kbd_togglemod(keycode,-1); else if ((keycode & 0x7F) != 0) { // it's an actual keystroke, return it return (keycode & 0xFF); } } return 0; } void nds_check_buttons(u16b kd, u16b kh) { s16b btn = nds_buttons_to_btnid(kd,kh); if (btn == -1) return; byte *cmd = &nds_btn_cmds[btn][0]; while (*cmd != 0) { put_key_event(*(cmd++)); } } /* * All event handling */ u16b *ebuf = (u16b*)(&BG_GFX[256*192]); // store the queue just past mainscreen display data u16b ebuf_read = 0, ebuf_write = 0; byte nds_updated = 0; // windows that have been updated and should be redrawn bool has_event() { return ((ebuf[ebuf_read] & EVENT_SET) || (ebuf_read < ebuf_write)); // read < write should never happen without EVENT_SET, but // just in case... } u16b get_event() { if (!has_event()) return 0; u16b r = ebuf[ebuf_read]; ebuf[ebuf_read] = 0; ebuf_read++; if (ebuf_read > ebuf_write) { ebuf_write++; if (ebuf_write >= MAX_EBUF) ebuf_write = 0; } if (ebuf_read >= MAX_EBUF) ebuf_read = 0; return r; } void put_key_event(byte c) { ebuf[ebuf_write++] = EVENT_SET | (u16)c; if (ebuf_write >= MAX_EBUF) ebuf_write = 0; } void put_mouse_event(byte x, byte y) { ebuf[ebuf_write++] = EVENT_SET | MEVENT_FLAG | (u16b)x | (((u16b)y) << 7); if (ebuf_write >= MAX_EBUF) ebuf_write = 0; } void do_vblank() { swiWaitForVBlank(); // --------------------------- // Handle the arrow buttons scanKeys(); u32b kd = keysDown(); u32b kh = keysHeld(); // order of keys: Right, Left, Up, Down // map keys to dirs, depends on order of keys in nds/input.h // and order of directions in ndir & sdir in decl.c //const s8 k2d[] = { // indexes into ndir/sdir, 10 = end of string = '\0' // 10, 4, 0, 10, 2, 3, 1, 10, 6, 5, 7 // no working combinations >= 11 //}; const byte k2d[] = {'6','4','8','2','3','7','9','1' }; // only do stuff if a key was pressed last frame if (kd & (KEY_RIGHT | KEY_LEFT | KEY_UP | KEY_DOWN)) { u16b dirs_down = 0; int i; if (kh & KEY_LEFT) dirs_down++; if (kh & KEY_RIGHT) dirs_down++; if (kh & KEY_UP) dirs_down++; if (kh & KEY_DOWN) dirs_down++; if (dirs_down == 1 && !(kh & (KEY_R | KEY_L))) { /*if (iflags.num_pad) put_key_event(ndir[k2d[(kh >> 4) & 0xF]]); else put_key_event(sdir[k2d[(kh >> 4) & 0xF]]);*/ //NRM put_key_event(k2d[(kh >> 4) & 0xF]); for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) //Term_keypress(k2d[i]); put_key_event(k2d[i]); } else if (dirs_down == 2 && (kh & (KEY_R | KEY_L))) { /*if (iflags.num_pad) put_key_event(ndir[k2d[(kh >> 4) & 0xF]]); else put_key_event(sdir[k2d[(kh >> 4) & 0xF]]);*/ //NRM put_key_event(k2d[(kh >> 4) & 0xF]); for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) //Term_keypress(k2d[i + 4]); put_key_event(k2d[i + 4]); } } // --------------------------- // Check for button macros nds_check_buttons(kd, kh); // --------------------------- // Check for typing on the touchscreen kbd byte keycode = kbd_vblank(); if ((keycode & 0x7F) != 0) { // it's an actual keystroke, return it put_key_event(keycode & 0xFF); //Term_keypress(keycode & 0xFF); } // --------------------------- // Print free RAM //NRM freeprint(); // --------------------------- // If the screen needs to be redrawn, do so now //NRM if (nds_updated) { //NRM render_all_windows(); //NRM nds_updated = 0; } //END JUST MOVED /* * An event handler XXX XXX XXX * * You may need an event handler, which can be used by both * by the "TERM_XTRA_BORED" and "TERM_XTRA_EVENT" entries in * the "Term_xtra_xxx()" function, and also to wait for the * user to perform whatever user-interface operation is needed * to request the start of a new game or the loading of an old * game, both of which should launch the "play_game()" function. */ static errr CheckEvents(bool wait) { u16b e = 0; do_vblank(); if (!wait && !has_event()) return (1); while (!e) { e = get_event(); do_vblank(); } /* Mouse */ if (IS_MEVENT(e)) handle_touch(EVENT_X(e) + 1, EVENT_Y(e), 1, TRUE); /* Undefined */ else if ((EVENT_C(e) & 0x7F) == 0) return (1); /* Key */ else Term_keypress(EVENT_C(e)); #if 0 u32b kd, kh; const byte k2d[] = {'6','4','8','2','3','7','9','1' }; /* Check the event queue */ swiWaitForVBlank(); scanKeys(); kd = keysDown(); kh = keysHeld(); if (!wait && !kd) return (1); /* Wait for an event */ while (!kd && !kh) { swiWaitForVBlank(); scanKeys(); kd = keysDown(); kh = keysHeld(); // only do stuff if a key was pressed last frame /* Arrow keys */ if (kd & (KEY_RIGHT | KEY_LEFT | KEY_UP | KEY_DOWN)) { u16b dirs_down = 0; int i; if (kh & KEY_LEFT) dirs_down++; if (kh & KEY_RIGHT) dirs_down++; if (kh & KEY_UP) dirs_down++; if (kh & KEY_DOWN) dirs_down++; if (dirs_down == 1 && !(kh & (KEY_R | KEY_L))) { for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) Term_keypress(k2d[i]); } else if (dirs_down == 2 && (kh & (KEY_R | KEY_L))) { for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) Term_keypress(k2d[i + 4]); } } // --------------------------- // Check for button macros nds_check_buttons(kd, kh); // --------------------------- // Check for typing on the touchscreen kbd u8 keycode = kbd_vblank(); if ((keycode & 0x7F) != 0) { // it's an actual keystroke, return it //put_key_event(keycode & 0xFF); Term_keypress(keycode & 0xFF); } } #endif return (0); } /* * Do a "special thing" to the current "term" * * This function must react to a large number of possible arguments, each * corresponding to a different "action request" by the "z-term.c" package, * or by the application itself. * * The "action type" is specified by the first argument, which must be a * constant of the form "TERM_XTRA_*" as given in "term.h", and the second * argument specifies the "information" for that argument, if any, and will * vary according to the first argument. * * In general, this function should return zero if the action is successfully * handled, and non-zero if the action is unknown or incorrectly handled. */ static errr Term_xtra_nds(int n, int v) { term_data *td = (term_data*)(Term->data); /* Analyze */ switch (n) { case TERM_XTRA_EVENT: { /* * Process some pending events */ return (CheckEvents(v)); } case TERM_XTRA_FLUSH: { /* * Flush all pending events */ while (!CheckEvents(FALSE)); return (0); } case TERM_XTRA_CLEAR: { /* * Clear the entire window */ int x, y; u32b vram_offset; u16b *fb = BG_GFX; for (y = 0; y < 24; y++) { for (x = 0; x < 80; x++) { vram_offset = (y & 0x1F)*8*256+x*3; //if (y&32) // { // fb = &BG_GFX_SUB[16*1024]; // chardata = btm_font_bin; // } byte xx,yy; for (yy=0;yy<8;yy++) for (xx=0;xx<3;xx++) fb[yy*256+xx+vram_offset] = 0; } } return (0); } case TERM_XTRA_SHAPE: { /* * Set the cursor visibility XXX XXX XXX * * This action should change the visibility of the cursor, * if possible, to the requested value (0=off, 1=on) * * This action is optional, but can improve both the * efficiency (and attractiveness) of the program. */ return (0); } case TERM_XTRA_FROSH: { return (0); } case TERM_XTRA_FRESH: { return (0); } case TERM_XTRA_NOISE: { /* * Make a noise XXX XXX XXX * * This action should produce a "beep" noise. * * This action is optional, but convenient. */ return (0); } case TERM_XTRA_SOUND: { /* * Make a sound XXX XXX XXX * * This action should produce sound number "v", where the * "name" of that sound is "sound_names[v]". This method * is still under construction. * * This action is optional, and not very important. */ return (0); } case TERM_XTRA_BORED: { /* * Handle random events when bored */ return (CheckEvents(0)); } case TERM_XTRA_REACT: { /* * React to global changes XXX XXX XXX * * For example, this action can be used to react to * changes in the global "color_table[256][4]" array. * * This action is optional, but can be very useful for * handling "color changes" and the "arg_sound" and/or * "arg_graphics" options. */ return (0); } case TERM_XTRA_ALIVE: { /* * Change the "hard" level XXX XXX XXX * * This action is used if the program changes "aliveness" * by being either "suspended" (v=0) or "resumed" (v=1) * This action is optional, unless the computer uses the * same "physical screen" for multiple programs, in which * case this action should clean up to let other programs * use the screen, or resume from such a cleaned up state. * * This action is currently only used by "main-gcu.c", * on UNIX machines, to allow proper "suspending". */ return (0); } case TERM_XTRA_LEVEL: { /* * Change the "soft" level XXX XXX XXX * * This action is used when the term window changes "activation" * either by becoming "inactive" (v=0) or "active" (v=1) * * This action can be used to do things like activate the proper * font / drawing mode for the newly active term window. This * action should NOT change which window has the "focus", which * window is "raised", or anything like that. * * This action is optional if all the other things which depend * on what term is active handle activation themself, or if only * one "term_data" structure is supported by this file. */ return (0); } case TERM_XTRA_DELAY: { /* * Delay for some milliseconds */ int i; for (i = 0; i < v; i++) swiWaitForVBlank(); return (0); } } /* Unknown or Unhandled action */ return (1); } /* * Display the cursor */ static errr Term_curs_nds(int x, int y) { //term_data *td = (term_data*)(Term->data); u32b vram_offset = (y - 1) * TILE_HEIGHT * 256 + x * TILE_WIDTH + 8 * 256; byte xx, yy; for (xx = 0; xx < TILE_WIDTH; xx++) { BG_GFX[xx + vram_offset] = RGB15(31, 31, 0)| BIT(15); BG_GFX[256 * (TILE_HEIGHT-1) + xx + vram_offset] = RGB15(31, 31, 0)| BIT(15); } for (yy = 0; yy < TILE_HEIGHT; yy++) { BG_GFX[yy * 256 + vram_offset] = RGB15(31, 31, 0)| BIT(15); BG_GFX[yy * 256 + TILE_WIDTH - 1 + vram_offset] = RGB15(31, 31, 0)| BIT(15); } /* Success */ return (0); } void draw_char(byte x, byte y, char c) { u32b vram_offset = (y & 0x1F) * 8 * 256 + x * 3, tile_offset = c * 24; u16b* fb = BG_GFX; const u16b* chardata = top_font_bin; if (y & 32) { fb = &BG_GFX_SUB[16 * 1024]; chardata = btm_font_bin; } byte xx, yy; for (yy = 0; yy < 8; yy++) for (xx = 0; xx < 3; xx++) fb[yy * 256 + xx + vram_offset] = chardata[yy * 3 + xx + tile_offset] | BIT(15); } void draw_color_char(byte x, byte y, char c, byte clr) { u32b vram_offset = (y & 0x1F) * 8 * 256 + x * 3, tile_offset = c * 24; u16b* fb = BG_GFX; const u16b* chardata = top_font_bin; if (y & 32) { fb = &BG_GFX_SUB[16*1024]; chardata = btm_font_bin; } byte xx, yy; u16b val; u16b fgc = color_data[clr & 0xF];//, bgc = color_data[(clr & 0xFF) >> 4]; for (yy = 0; yy < 8; yy++) { for (xx = 0;xx < 3; xx++) { val = (chardata[yy * 3 + xx + tile_offset]); fb[yy * 256 + xx + vram_offset] = (val & fgc) | BIT(15);//(~val&bgc) | 0x8000; } } } /* * Erase some characters * * This function should erase "n" characters starting at (x,y). * * You may assume "valid" input if the window is properly sized. */ static errr Term_wipe_nds(int x, int y, int n) { term_data *td = (term_data*)(Term->data); int i; /* Draw a blank */ for (i = 0; i < n; i++) draw_color_char(x + i, y, 0, 0); /* Success */ return (0); } /* * Draw some text on the screen * * This function should actually display an array of characters * starting at the given location, using the given "attribute", * and using the given string of characters, which contains * exactly "n" characters and which is NOT null-terminated. * * You may assume "valid" input if the window is properly sized. * * You must be sure that the string, when written, erases anything * (including any visual cursor) that used to be where the text is * drawn. On many machines this happens automatically, on others, * you must first call "Term_wipe_xxx()" to clear the area. * * In color environments, you should activate the color contained * in "color_data[a & 0x0F]", if needed, before drawing anything. * * You may ignore the "attribute" if you are only supporting a * monochrome environment, since this routine is normally never * called to display "black" (invisible) text, including the * default "spaces", and all other colors should be drawn in * the "normal" color in a monochrome environment. * * Note that if you have changed the "attr_blank" to something * which is not black, then this function must be able to draw * the resulting "blank" correctly. * * Note that this function must correctly handle "black" text if * the "always_text" flag is set, if this flag is not set, all the * "black" text will be handled by the "Term_wipe_xxx()" hook. */ static errr Term_text_nds(int x, int y, int n, byte a, const char *cp) { //term_data *td = (term_data*)(Term->data); int i; /* Do nothing if the string is null */ if (!cp || !*cp) return (-1); /* Get the length of the string */ if ((n > strlen(cp)) || (n < 0)) n = strlen(cp); /* Put the characters directly */ for (i = 0; i < n, *cp; i++) { /* Check it's the right attr */ if ((x + i < Term->wid) && (Term->scr->a[y][x + i] == a)) /* Put the char */ draw_color_char(x + i, y, (*(cp++)), a); else break; } /* Success */ return (0); } void draw_tile(byte x, byte y, u16b tile) { u32b vram_offset = (y & 0x7F) * TILE_HEIGHT * 256 + x * TILE_WIDTH + 8 * 256, tile_offset = (tile & 0x7FFF) * TILE_WIDTH * TILE_HEIGHT; u16b* fb = BG_GFX; byte xx, yy; for (yy = 0; yy < TILE_HEIGHT; yy++) for (xx = 0; xx < TILE_WIDTH; xx++) fb[yy * 256 + xx + vram_offset] = tiles_bin[yy * TILE_WIDTH + xx + tile_offset] | BIT(15); } /* * Draw some attr/char pairs on the screen * * This routine should display the given "n" attr/char pairs at * the given location (x,y). This function is only used if one * of the flags "always_pict" or "higher_pict" is defined. * * You must be sure that the attr/char pairs, when displayed, will * erase anything (including any visual cursor) that used to be at * the given location. On many machines this is automatic, but on * others, you must first call "Term_wipe_xxx(x, y, 1)". * * With the "higher_pict" flag, this function can be used to allow * the display of "pseudo-graphic" pictures, for example, by using * the attr/char pair as an encoded index into a pixmap of special * "pictures". * * With the "always_pict" flag, this function can be used to force * every attr/char pair to be drawn by this function, which can be * very useful if this file can optimize its own display calls. * * This function is often associated with the "arg_graphics" flag. * * This function is only used if one of the "higher_pict" and/or * "always_pict" flags are set. */ static errr Term_pict_nds(int x, int y, int n, const byte *ap, const char *cp) { term_data *td = (term_data*)(Term->data); u16b tile_number = DEF_TILES_PER_ROW * (*ap - 0x80) + (*cp - 0x80); /* XXX XXX XXX */ int i; /* Put the characters directly */ for (i = 0; i < n, *cp; i++) { if ((x + i < Term->wid) && (*cp != '\0')) draw_tile(x + i, y, tile_number); else break; } /* Success */ return (0); } /*** Internal Functions ***/ /* * Instantiate a "term_data" structure * * This is one way to prepare the "term_data" structures and to * "link" the various informational pieces together. * * This function assumes that every window should be 80x24 in size * (the standard size) and should be able to queue 256 characters. * Technically, only the "main screen window" needs to queue any * characters, but this method is simple. One way to allow some * variation is to add fields to the "term_data" structure listing * parameters for that window, initialize them in the "init_xxx()" * function, and then use them in the code below. * * Note that "activation" calls the "Term_init_xxx()" hook for * the "term" structure, if needed. */ static void term_data_link(int i) { term_data *td = &data[i]; term *t = &td->t; /* Initialize the term */ term_init(t, 85, 24, 256); /* Choose "soft" or "hard" cursor XXX XXX XXX */ /* A "soft" cursor must be explicitly "drawn" by the program */ /* while a "hard" cursor has some "physical" existance and is */ /* moved whenever text is drawn on the screen. See "term.c". */ t->soft_cursor = TRUE; /* Use "Term_pict()" for all attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ /* td->t->always_pict = TRUE; */ /* Use "Term_pict()" for some attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ t->higher_pict = TRUE; /* Use "Term_text()" even for "black" text XXX XXX XXX */ /* See the "Term_text_xxx()" function above. */ /* t->always_text = TRUE; */ /* Ignore the "TERM_XTRA_BORED" action XXX XXX XXX */ /* This may make things slightly more efficient. */ t->never_bored = TRUE; /* Ignore the "TERM_XTRA_FROSH" action XXX XXX XXX */ /* This may make things slightly more efficient. */ /* td->t->never_frosh = TRUE; */ /* Prepare the init/nuke hooks */ t->init_hook = Term_init_nds; t->nuke_hook = Term_nuke_nds; /* Prepare the template hooks */ t->xtra_hook = Term_xtra_nds; t->curs_hook = Term_curs_nds; t->wipe_hook = Term_wipe_nds; t->text_hook = Term_text_nds; t->pict_hook = Term_pict_nds; /* Remember where we came from */ t->data = (vptr)(td); /* Activate it */ Term_activate(t); /* Global pointer - maybe need for some configurations */ //ang_term[i] = t; } /* * Initialization function */ errr init_nds(void) { /* Initialize globals */ /* Initialize "term_data" structures */ int i; bool none = TRUE; term_data *td; /* Main window */ td = &data[0]; WIPE(td, term_data); td->rows = 24; td->cols = 37;//80; td->tile_height = 8; td->tile_width = 3; /* Create windows (backwards!) */ for (i = MAX_TERM_DATA - 1; i >= 0; i--) { /* Link */ term_data_link(i); none = FALSE; /* Set global pointer */ angband_term[0] = Term; } if (none) return (1); /* Success */ return (0); } /* * Init some stuff * * This function is used to keep the "path" variable off the stack. */ static void init_stuff(void) { char path[1024]; /* Prepare the path */ strcpy(path, "/angband/lib/"); /* Prepare the filepaths */ init_file_paths(path, path, path); /* Hack */ strcpy(savefile, "/angband/lib/save/PLAYER"); //small_screen = TRUE; } void nds_init_fonts() { // the font is now compiled in as ds_subfont for error reporting purposes // ds_subfont contains the bgr version //subfont_bgr_bin = &ds_subfont[0]; u16b i; u16b t,t2; for (i=0;i<8*3*256;i++) { t = ds_subfont[i]; t2 = t & 0x8000; t2 |= (t & 0x001f)<<10; t2 |= (t & 0x03e0); t2 |= (t & 0x7c00)>>10; subfont_bgr_bin[i] = t; subfont_rgb_bin[i] = t2; } top_font_bin = subfont_rgb_bin; btm_font_bin = subfont_bgr_bin; } // if you are calling this function, not much should be happening after // since it clobbers the font pointers void nds_fatal_err(const char* msg) { static byte x = 2, y = 1; byte i = 0; //top_font_bin = btm_font_bin = &ds_subfont[0]; // x = 2; // y = 1; for (i = 0; msg[i] != '\0'; i++) { draw_char( x, y, msg[i]); x++; if (msg[i] == '\n' || x > 80) { x = 2; y++; } } } //NRM should be replaced with open and read from z-file.c bool nds_load_file(const char* name, u16b* dest, u32b len) { FILE* f = fopen(name,"r"); if (f == NULL) return false; u16b readbuf[1024]; u32b i,l,wi=0; if (len == 0) len = 0xffffffff; // max possible len for (i=0;i<1024;i++) readbuf[i] = 0; while ((l=fread(readbuf,2,1024,f)) > 0 && wi*2 < len) { for (i = 0; i < (l) && wi * 2 < len; i++) { // 0 to l/2 dest[wi++] = readbuf[i]; } for (i = 0; i < 1024; i++) readbuf[i] = 0; } fclose(f); return true; } bool nds_load_kbd() { #define NUM_FILES 3 const char *files[] = { // "subfont_rgb.bin","subfont_bgr.bin", "kbd.bin","kbd.pal","kbd.map", }; const u16b* dests[] = { // subfont_rgb_bin, subfont_bgr_bin, (u16b*)BG_TILE_RAM_SUB(0), BG_PALETTE_SUB, (u16*)BG_MAP_RAM_SUB(8), }; char buf[64] = "\0"; u16b i; for (i = 0; i < NUM_FILES; i++) { if (!nds_load_file(files[i], dests[i], 0)) { sprintf(buf,"Error opening %s (errno=%d)\n",files[i],errno); nds_fatal_err(buf); return FALSE; } } #undef NUM_FILES return TRUE; } void kbd_init() { u16b i; for (i = 0; i < 16; i++) { BG_PALETTE_SUB[i+16] = BG_PALETTE_SUB[i] ^ 0x7FFF; } } void nds_init_buttons() { u16b i, j; for (i = 0; i < (NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER); i++) { for (j = 0; j < NDS_CMD_LENGTH; j++) { nds_btn_cmds[i][j] = 0; } } if (access(NDS_BUTTON_FILE,0444) == -1) { /* Set defaults */ for (i = 0; i < (NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER); i++) nds_btn_cmds[i][0] = btn_defaults[i]; return; } FILE* f = fopen(NDS_BUTTON_FILE, "r"); fread(&nds_btn_cmds[0], NDS_CMD_LENGTH, (NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER), f); fclose(f); } void swap_font(bool bottom) { if (!bottom) { if (top_font_bin == subfont_rgb_bin) top_font_bin = subfont_bgr_bin; else top_font_bin = subfont_rgb_bin; } else { if (btm_font_bin == subfont_rgb_bin) btm_font_bin = subfont_bgr_bin; else btm_font_bin = subfont_rgb_bin; } } void on_irq(); // on_irq, do nothing void on_irq() { REG_IME = 0; if(REG_IF & IRQ_VBLANK) { // Tell the DS we handled the VBLANK interrupt VBLANK_INTR_WAIT_FLAGS |= IRQ_VBLANK; REG_IF |= IRQ_VBLANK; } else { // Ignore all other interrupts REG_IF = REG_IF; } REG_IME=1; } void nds_raw_print(const char* str) { static u16b x=0,y=32; while (*str) { draw_char(x,y,(u8)(*(str++))); x++; if (x > 78) { x = 0; y++; if (y > 34) y = 32; } } draw_char(x,y,219); fflush(0); } bool nds_load_tile_bmp(const char *name, u16b *dest, u32b len) { //NRM#define h iflags.wc_tile_height //NRM#define w iflags.wc_tile_width #define h TILE_HEIGHT #define w TILE_WIDTH // bmpxy2off works ONLY inside nds_load_tile_bmp! #define bmpxy2off(x,y) (((y-(y%h))*iw+(y%h))*w + x*h) FILE* f = fopen(name,"r"); u32b writeidx = 0; u32b i,j,l; s16b y; u32b off; s32b iw2, ih2; u16b iw = 0, ih = 0; //s32 ty; u16b depth; char buf[10]; //if (f) nds_raw_print("File OK"); //else nds_raw_print("No file opened"); fseek(f, 10, SEEK_SET); fread(&off,4,1,f); fseek(f, 4, SEEK_CUR); fread(&iw2,4,1,f); fread(&ih2,4,1,f); fseek(f, 2, SEEK_CUR); fread(&depth,2,1,f); strnfmt(buf, 10, "depth = %d", depth); //nds_raw_print(buf); if (depth != 24) //NRM if (depth != 8) { fclose(f); nds_raw_print(" depth problem"); return false; } y = ih2 - 1; // some crazy person decided to store the lines in a .bmp backwards ih = ih2 / h; iw = iw2 / w; if (len == 0) len = 0xffffffff; fseek(f,off,SEEK_SET); //NRM u8 temp[3]; byte temp[1]; while (y >= 0) { for (i = 0; i < iw; i++) { writeidx = bmpxy2off(i*w, y); for (j = 0; j < w; j++) { //NRM fread(temp,1,3,f); fread(temp, 1, 1, f); if (writeidx * 2 < len) dest[writeidx++] = c2(temp, 0); } } // x&3 == x%4 //NRM if (((iw*w*3) & 3) != 0) fseek(f,4-((iw*w*3)&3),SEEK_CUR); fseek(f, 2 - (iw * w), SEEK_CUR); y--; } //*/ fclose(f); return true; #undef bmpxy2off #undef h #undef w } bool nds_load_tile_file(char* name, u16b* dest, u32b len) { char ext[4]; u16b slen = strlen(name); strcpy(ext, name + slen - 3); nds_raw_print(name + len - 3); if (strcmpi(ext, "bmp") == 0) { // nds_raw_print("=isbmp "); return nds_load_tile_bmp(name, dest, len); } else { // assume .bin maybe w/ funny ext return nds_load_file(name, dest, len); } } bool nds_load_tiles() { //char temp[30]; //sprintf(temp,"%d,%s ",TILE_FILE == NULL, // TILE_FILE==NULL ? DEF_TILE_FILE : TILE_FILE); //nds_raw_print(temp); char buf[64]; int died1 = -1, died2 = -1;; if (TILE_FILE != NULL) { if (TILE_WIDTH == 0) TILE_WIDTH = DEF_TILE_WIDTH; if (TILE_HEIGHT == 0) TILE_HEIGHT = DEF_TILE_HEIGHT; tiles_bin = (u16b*)malloc(TILE_BUFFER_SIZE); if (!nds_load_tile_file(TILE_FILE, tiles_bin, TILE_BUFFER_SIZE) ) { died1 = errno; free(tiles_bin); } else { goto finish; } } TILE_WIDTH = DEF_TILE_WIDTH; TILE_HEIGHT = DEF_TILE_HEIGHT; tiles_bin = (u16b*)malloc(TILE_BUFFER_SIZE); if (!nds_load_tile_file(DEF_TILE_FILE, tiles_bin, TILE_BUFFER_SIZE) ) { died2 = errno; free(tiles_bin); } if (died1 != -1) { sprintf(buf, "Error loading tileset %s (errno=%d)\n", TILE_FILE, died1); if (died2 == -1) { nds_raw_print(buf); } else { nds_fatal_err(buf); } } if (died2 != -1) { sprintf(buf, "Error loading default tileset %s %s\n", DEF_TILE_FILE, strerror(died2)); nds_fatal_err(buf); return FALSE; } finish: NDS_SCREEN_ROWS = 168 / TILE_HEIGHT; NDS_SCREEN_COLS = 256 / TILE_WIDTH; return TRUE; // nds_raw_print("r/c set"); } /* * Display warning message (see "z-util.c") */ static void hook_plog(const char *str) { /* Warning */ if (str) { nds_raw_print(str); } } /* * Display error message and quit (see "z-util.c") */ static void hook_quit(const char *str) { int i, j; /* Give a warning */ if (str) { nds_fatal_err(str); } /* Bail */ nds_exit(0); } void nds_exit(int code) { u16b i; for (i = 0; i < 60; i++) { nds_updated = 0xFF; do_vblank(); // wait 1 sec. } IPC->mailData = 0xDEADC0DE; // tell arm7 to shut down the DS } /* * Main function * * This function must do a lot of stuff. */ int main(int argc, char *argv[]) { bool new_game = FALSE; int i; /* Initialize the machine itself */ //START NETHACK STUFF powerON(POWER_ALL_2D | POWER_SWAP_LCDS); videoSetMode(MODE_5_2D | DISPLAY_BG2_ACTIVE); videoSetModeSub(MODE_5_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG2_ACTIVE); vramSetBankA(VRAM_A_MAIN_BG_0x06000000); // BG2, event buf, fonts vramSetBankB(VRAM_B_MAIN_BG_0x06020000); // for storage (tileset) vramSetBankC(VRAM_C_SUB_BG_0x06200000); vramSetBankD(VRAM_D_MAIN_BG_0x06040000); // for storage (tileset) vramSetBankE(VRAM_E_LCD); // for storage (WIN_TEXT) vramSetBankF(VRAM_F_LCD); // for storage (WIN_TEXT) BG2_CR = BG_BMP16_256x256; BG2_XDX = 1<<8; BG2_XDY = 0; BG2_YDX = 0; BG2_YDY = 1<<8; BG2_CY = 0; BG2_CX = 0; SUB_BG0_CR = BG_TILE_BASE(0) | BG_MAP_BASE(8) | BG_PRIORITY(0) | BG_16_COLOR; SUB_BG2_CR = BG_BMP16_256x256 | BG_BMP_BASE(2); SUB_BG2_XDX = 1<<8; SUB_BG2_XDY = 0; SUB_BG2_YDX = 0; SUB_BG2_YDY = 1<<8; SUB_BG2_CY = 0; SUB_BG2_CX = 0; // Enable the V-blank interrupt REG_IME = 0; IRQ_HANDLER = on_irq; REG_IE = IRQ_VBLANK; REG_IF = ~0; REG_DISPSTAT = DISP_VBLANK_IRQ; REG_IME = 1; register int fd; nds_init_fonts(); //nds_raw_print("testing raw_print...\n"); //draw_char(10,10,(byte)'N'); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); if (!fatInitDefault()) { nds_fatal_err("\nError initializing FAT drivers.\n"); nds_fatal_err("Make sure the game is patched with the correct DLDI.\n"); nds_fatal_err(" (see http://chishm.drunkencoders.com/DLDI/ for more info).\n"); nds_fatal_err("\n\nUnable to access filesystem.\nCannot continue.\n"); return 1; } //nds_raw_print("filesystem loaded\n"); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); chdir("/angband"); if (!nds_load_kbd()) { nds_fatal_err("\nError loading keyboard graphics.\nCannot continue.\n"); return 1; // die } kbd_init(); nds_init_buttons(); IPC->mailData = 0x00424242; // to arm7: everything has init'ed while ((IPC->mailData & 0xFFFFFF00) != 0x42424200); //wait for arm7's reply if (IPC->mailData & 0x00000001) { // it's a DS lite swap_font(false); } else if (access("/angband/swapfont",04) != -1) { swap_font(false); } use_graphics = TRUE; //ANGBAND_GRAF = "old"; //NRM initoptions(); if (!nds_load_tiles()) { nds_fatal_err("\n\nNo tileset could be loaded.\nCannot continue.\n"); return 1; } if (!use_graphics) { TILE_HEIGHT = 8; TILE_WIDTH = 3; } //NRM u.uhp = 1; /* prevent RIP on early quits */ //NRM u.ux = 0; /* prevent flush_screen() */ //NRM init_nhwindows(0,0); //NRM display_gamewindows(); // need this for askname() #if 0 nds_curs(WIN_MAP,0,30); // put cursor offscreen nds_clear_nhwindow(WIN_MAP); // somehow there is garbage in these nds_clear_nhwindow(WIN_MESSAGE);// windows even after create_nhwindow nds_clear_nhwindow(WIN_STATUS); // calls clear_nhwindow //process_options(argc, argv); if (!*plname) askname(); if (!stricmp(plname,"wizard")) wizard = 1; plnamesuffix(); set_savefile_name(); Strcpy(lock,plname); Strcat(lock,"-99"); regularize(lock); fd = create_levelfile(0, (char *)0); if (fd < 0) { raw_print("Cannot create lock file"); } else { hackpid = 1; write(fd, (genericonst char *_t) &hackpid, sizeof(hackpid)); close(fd); } x_maze_max = COLNO-1; if (x_maze_max % 2) x_maze_max--; y_maze_max = ROWNO-1; if (y_maze_max % 2) y_maze_max--; vision_init(); dlb_init(); if ((fd = restore_saved_game()) >= 0) { pline("Restoring save file..."); //mark_synch(); /* flush output */ if(!dorecover(fd)) goto not_recovered; check_special_room(FALSE); if (discover) You("are in non-scoring discovery mode."); if (discover || wizard) { if(yn("Do you want to keep the save file?") == 'n'){ (void) delete_savefile(); } } flags.move = 0; } else { not_recovered: // TODO: add code to load a game player_selection(); newgame(); if (discover) You("are in non-scoring discovery mode."); flags.move = 0; set_wear(); (void) pickup(1); read_engr_at(u.ux,u.uy); } // it's safe to turn on the vblank intr now REG_IME = 1; moveloop(); goto top; return 0; //FINISH NETHACK STUFF #endif /* 0 */ /* Activate hooks */ plog_aux = hook_plog; quit_aux = hook_quit; /* Initialize the windows */ if (init_nds()) quit("Oops!"); /* XXX XXX XXX */ ANGBAND_SYS = "nds"; /* Initialize some stuff */ init_stuff(); draw_tile(2, 2, 5); draw_tile(4, 2, 15); draw_tile(6, 2, 25); draw_tile(8, 2, 35); /* About to start */ game_start = TRUE; while (game_start) { /* Initialize */ init_angband(); for (i = 0; i < 50; i++) draw_tile(i % 10, i/10, i+600); /* Wait for response */ pause_line(Term); /* Play the game */ play_game(new_game); /* Free resources */ cleanup_angband(); } /* Quit */ quit(NULL); /* Exit */ return (0); } angband-v3.3.2/src/attack.c0000644000175000017500000004612311651552410015017 0ustar chriscchrisc/* * File: attack.c * Purpose: Attacking (both throwing and melee) code * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "monster/mon-make.h" #include "monster/mon-msg.h" #include "monster/mon-util.h" #include "monster/mon-timed.h" #include "monster/monster.h" #include "object/slays.h" #include "object/tvalsval.h" #include "spells.h" #include "target.h" /** * Returns percent chance of an object breaking after throwing or shooting. * * Artifacts will never break. * * Beyond that, each item kind has a percent chance to break (0-100). When the * object hits its target this chance is used. * * When an object misses it also has a chance to break. This is determined by * squaring the normaly breakage probability. So an item that breaks 100% of * the time on hit will also break 100% of the time on a miss, whereas a 50% * hit-breakage chance gives a 25% miss-breakage chance, and a 10% hit breakage * chance gives a 1% miss-breakage chance. */ int breakage_chance(const object_type *o_ptr, bool hit_target) { int perc = o_ptr->kind->base->break_perc; if (o_ptr->artifact) return 0; if (!hit_target) return (perc * perc) / 100; return perc; } /** * Determine if the player "hits" a monster. */ bool test_hit(int chance, int ac, int vis) { int k = randint0(100); /* There is an automatic 12% chance to hit, * and 5% chance to miss. */ if (k < 17) return k < 12; /* Penalize invisible targets */ if (!vis) chance /= 2; /* Starting a bit higher up on the scale */ if (chance < 9) chance = 9; /* Power competes against armor */ return randint0(chance) >= (ac * 2 / 3); } /** * Determine damage for critical hits from shooting. * * Factor in item weight, total plusses, and player level. */ static int critical_shot(int weight, int plus, int dam, u32b *msg_type) { int chance = weight + (p_ptr->state.to_h + plus) * 4 + p_ptr->lev * 2; int power = weight + randint1(500); if (randint1(5000) > chance) { *msg_type = MSG_SHOOT_HIT; return dam; } else if (power < 500) { *msg_type = MSG_HIT_GOOD; return 2 * dam + 5; } else if (power < 1000) { *msg_type = MSG_HIT_GREAT; return 2 * dam + 10; } else { *msg_type = MSG_HIT_SUPERB; return 3 * dam + 15; } } /** * Determine damage for critical hits from melee. * * Factor in weapon weight, total plusses, player level. */ static int critical_norm(int weight, int plus, int dam, u32b *msg_type) { int chance = weight + (p_ptr->state.to_h + plus) * 5 + p_ptr->lev * 3; int power = weight + randint1(650); if (randint1(5000) > chance) { *msg_type = MSG_HIT; return dam; } else if (power < 400) { *msg_type = MSG_HIT_GOOD; return 2 * dam + 5; } else if (power < 700) { *msg_type = MSG_HIT_GREAT; return 2 * dam + 10; } else if (power < 900) { *msg_type = MSG_HIT_SUPERB; return 3 * dam + 15; } else if (power < 1300) { *msg_type = MSG_HIT_HI_GREAT; return 3 * dam + 20; } else { *msg_type = MSG_HIT_HI_SUPERB; return 4 * dam + 20; } } /** * Attack the monster at the given location with a single blow. */ static bool py_attack_real(int y, int x, bool *fear) { /* Information about the target of the attack */ monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; char m_name[80]; bool stop = FALSE; /* The weapon used */ object_type *o_ptr = &p_ptr->inventory[INVEN_WIELD]; /* Information about the attack */ int bonus = p_ptr->state.to_h + o_ptr->to_h; int chance = p_ptr->state.skills[SKILL_TO_HIT_MELEE] + bonus * BTH_PLUS_ADJ; bool do_quake = FALSE; bool success = FALSE; /* Default to punching for one damage */ const char *hit_verb = "punch"; int dmg = 1; u32b msg_type = MSG_HIT; /* Extract monster name (or "it") */ monster_desc(m_name, sizeof(m_name), m_ptr, 0); /* Auto-Recall if possible and visible */ if (m_ptr->ml) monster_race_track(m_ptr->r_idx); /* Track a new monster */ if (m_ptr->ml) health_track(p_ptr, cave->m_idx[y][x]); /* Handle player fear (only for invisible monsters) */ if (check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) { msgt(MSG_AFRAID, "You are too afraid to attack %s!", m_name); return FALSE; } /* Disturb the monster */ mon_clear_timed(cave->m_idx[y][x], MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); /* See if the player hit */ success = test_hit(chance, r_ptr->ac, m_ptr->ml); /* If a miss, skip this hit */ if (!success) { msgt(MSG_MISS, "You miss %s.", m_name); return FALSE; } /* Handle normal weapon */ if (o_ptr->kind) { int i; const struct slay *best_s_ptr = NULL; hit_verb = "hit"; /* Get the best attack from all slays or * brands on all non-launcher equipment */ for (i = INVEN_LEFT; i < INVEN_TOTAL; i++) { struct object *obj = &p_ptr->inventory[i]; if (obj->kind) improve_attack_modifier(obj, m_ptr, &best_s_ptr, TRUE, FALSE); } improve_attack_modifier(o_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); if (best_s_ptr != NULL) hit_verb = best_s_ptr->melee_verb; dmg = damroll(o_ptr->dd, o_ptr->ds); dmg *= (best_s_ptr == NULL) ? 1 : best_s_ptr->mult; dmg += o_ptr->to_d; dmg = critical_norm(o_ptr->weight, o_ptr->to_h, dmg, &msg_type); /* Learn by use for the weapon */ object_notice_attack_plusses(o_ptr); if (check_state(p_ptr, OF_IMPACT, p_ptr->state.flags) && dmg > 50) { do_quake = TRUE; wieldeds_notice_flag(p_ptr, OF_IMPACT); } } /* Learn by use for other equipped items */ wieldeds_notice_on_attack(); /* Apply the player damage bonuses */ dmg += p_ptr->state.to_d; /* No negative damage */ if (dmg <= 0) dmg = 0; /* Tell the player what happened */ if (dmg <= 0) msgt(MSG_MISS, "You fail to harm %s.", m_name); else if (msg_type == MSG_HIT) msgt(MSG_HIT, "You %s %s.", hit_verb, m_name); else if (msg_type == MSG_HIT_GOOD) msgt(MSG_HIT_GOOD, "You %s %s. %s", hit_verb, m_name, "It was a good hit!"); else if (msg_type == MSG_HIT_GREAT) msgt(MSG_HIT_GREAT, "You %s %s. %s", hit_verb, m_name, "It was a great hit!"); else if (msg_type == MSG_HIT_SUPERB) msgt(MSG_HIT_SUPERB, "You %s %s. %s", hit_verb, m_name, "It was a superb hit!"); else if (msg_type == MSG_HIT_HI_GREAT) msgt(MSG_HIT_HI_GREAT, "You %s %s. %s", hit_verb, m_name, "It was a *GREAT* hit!"); else if (msg_type == MSG_HIT_HI_SUPERB) msgt(MSG_HIT_HI_SUPERB, "You %s %s. %s", hit_verb, m_name, "It was a *SUPERB* hit!"); /* Complex message */ if (p_ptr->wizard) msg("You do %d (out of %d) damage.", dmg, m_ptr->hp); /* Confusion attack */ if (p_ptr->confusing) { p_ptr->confusing = FALSE; msg("Your hands stop glowing."); mon_inc_timed(cave->m_idx[y][x], MON_TMD_CONF, (10 + randint0(p_ptr->lev) / 10), MON_TMD_FLG_NOTIFY, FALSE); } /* Damage, check for fear and death */ stop = mon_take_hit(cave->m_idx[y][x], dmg, fear, NULL); if (stop) (*fear) = FALSE; /* Apply earthquake brand */ if (do_quake) { earthquake(p_ptr->py, p_ptr->px, 10); if (cave->m_idx[y][x] == 0) stop = TRUE; } return stop; } /** * Attack the monster at the given location * * We get blows until energy drops below that required for another blow, or * until the target monster dies. Each blow is handled by py_attack_real(). * We don't allow @ to spend more than 100 energy in one go, to avoid slower * monsters getting double moves. */ void py_attack(int y, int x) { int blow_energy = 10000 / p_ptr->state.num_blows; int blows = 0; bool fear = FALSE; monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); /* disturb the player */ disturb(p_ptr, 0,0); /* Initialize the energy used */ p_ptr->energy_use = 0; /* Attack until energy runs out or enemy dies. We limit energy use to 100 * to avoid giving monsters a possible double move. */ while (p_ptr->energy >= blow_energy * (blows + 1)) { bool stop = py_attack_real(y, x, &fear); p_ptr->energy_use += blow_energy; if (stop || p_ptr->energy_use + blow_energy > 100) break; blows++; } /* Hack - delay fear messages */ if (fear && m_ptr->ml) { char m_name[80]; monster_desc(m_name, sizeof(m_name), m_ptr, 0); add_monster_message(m_name, cave->m_idx[y][x], MON_MSG_FLEE_IN_TERROR, TRUE); } } /** * This is a helper function used by do_cmd_throw and do_cmd_fire. * * It abstracts out the projectile path, display code, identify and clean up * logic, while using the 'attack' parameter to do work particular to each * kind of attack. */ static void ranged_helper(int item, int dir, int range, int shots, ranged_attack attack) { /* Get the ammo */ object_type *o_ptr = object_from_item_idx(item); int i, j; byte missile_attr = object_attr(o_ptr); char missile_char = object_char(o_ptr); object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[80]; int path_n; u16b path_g[256]; int msec = op_ptr->delay_factor; /* Start at the player */ int x = p_ptr->px; int y = p_ptr->py; /* Predict the "target" location */ s16b ty = y + 99 * ddy[dir]; s16b tx = x + 99 * ddx[dir]; bool hit_target = FALSE; /* Check for target validity */ if ((dir == 5) && target_okay()) { int taim; char msg[80]; target_get(&tx, &ty); taim = distance(y, x, ty, tx); if (taim > range) { sprintf (msg, "Target out of range by %d squares. Fire anyway? ", taim - range); if (!get_check(msg)) return; } } /* Sound */ sound(MSG_SHOOT); object_notice_on_firing(o_ptr); /* Describe the object */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL | ODESC_SINGULAR); /* Actually "fire" the object -- Take a partial turn */ p_ptr->energy_use = (100 / shots); /* Calculate the path */ path_n = project_path(path_g, range, y, x, ty, tx, 0); /* Hack -- Handle stuff */ handle_stuff(p_ptr); /* Start at the player */ x = p_ptr->px; y = p_ptr->py; /* Project along the path */ for (i = 0; i < path_n; ++i) { int ny = GRID_Y(path_g[i]); int nx = GRID_X(path_g[i]); /* Hack -- Stop before hitting walls */ if (!cave_floor_bold(ny, nx)) break; /* Advance */ x = nx; y = ny; /* Only do visuals if the player can "see" the missile */ if (player_can_see_bold(y, x)) { print_rel(missile_char, missile_attr, y, x); move_cursor_relative(y, x); Term_fresh(); if (p_ptr->redraw) redraw_stuff(p_ptr); Term_xtra(TERM_XTRA_DELAY, msec); cave_light_spot(cave, y, x); Term_fresh(); if (p_ptr->redraw) redraw_stuff(p_ptr); } else { /* Delay anyway for consistency */ Term_xtra(TERM_XTRA_DELAY, msec); } /* Handle monster */ if (cave->m_idx[y][x] > 0) break; } /* Try the attack on the monster at (x, y) if any */ if (cave->m_idx[y][x] > 0) { monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; int visible = m_ptr->ml; bool fear = FALSE; char m_name[80]; const char *note_dies = monster_is_unusual(r_ptr) ? " is destroyed." : " dies."; struct attack_result result = attack(o_ptr, y, x); int dmg = result.dmg; u32b msg_type = result.msg_type; const char *hit_verb = result.hit_verb; if (result.success) { hit_target = TRUE; /* Get "the monster" or "it" */ monster_desc(m_name, sizeof(m_name), m_ptr, 0); object_notice_attack_plusses(o_ptr); /* No negative damage; change verb if no damage done */ if (dmg <= 0) { dmg = 0; hit_verb = "fail to harm"; } if (!visible) { /* Invisible monster */ msgt(MSG_SHOOT_HIT, "The %s finds a mark.", o_name); } else { /* Visible monster */ if (msg_type == MSG_SHOOT_HIT) msgt(MSG_SHOOT_HIT, "The %s %s %s.", o_name, hit_verb, m_name); else if (msg_type == MSG_HIT_GOOD) { msgt(MSG_HIT_GOOD, "The %s %s %s. %s", o_name, hit_verb, m_name, "It was a good hit!"); } else if (msg_type == MSG_HIT_GREAT) { msgt(MSG_HIT_GREAT, "The %s %s %s. %s", o_name, hit_verb, m_name, "It was a great hit!"); } else if (msg_type == MSG_HIT_SUPERB) { msgt(MSG_HIT_SUPERB, "The %s %s %s. %s", o_name, hit_verb, m_name, "It was a superb hit!"); } /* Track this monster */ if (m_ptr->ml) monster_race_track(m_ptr->r_idx); if (m_ptr->ml) health_track(p_ptr, cave->m_idx[y][x]); } /* Complex message */ if (p_ptr->wizard) msg("You do %d (out of %d) damage.", dmg, m_ptr->hp); /* Hit the monster, check for death */ if (!mon_take_hit(cave->m_idx[y][x], dmg, &fear, note_dies)) { message_pain(cave->m_idx[y][x], dmg); if (fear && m_ptr->ml) add_monster_message(m_name, cave->m_idx[y][x], MON_MSG_FLEE_IN_TERROR, TRUE); } } } /* Obtain a local object */ object_copy(i_ptr, o_ptr); object_split(i_ptr, o_ptr, 1); /* See if the ammunition broke or not */ j = breakage_chance(i_ptr, hit_target); /* Drop (or break) near that location */ drop_near(cave, i_ptr, j, y, x, TRUE); if (item >= 0) { /* The ammo is from the inventory */ inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } else { /* The ammo is from the floor */ floor_item_increase(0 - item, -1); floor_item_optimize(0 - item); } } /** * Helper function used with ranged_helper by do_cmd_fire. */ static struct attack_result make_ranged_shot(object_type *o_ptr, int y, int x) { struct attack_result result = {FALSE, 0, 0, "hit"}; object_type *j_ptr = &p_ptr->inventory[INVEN_BOW]; monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; int bonus = p_ptr->state.to_h + o_ptr->to_h + j_ptr->to_h; int chance = p_ptr->state.skills[SKILL_TO_HIT_BOW] + bonus * BTH_PLUS_ADJ; int chance2 = chance - distance(p_ptr->py, p_ptr->px, y, x); int multiplier = p_ptr->state.ammo_mult; const struct slay *best_s_ptr = NULL; /* Did we hit it (penalize distance travelled) */ if (!test_hit(chance2, r_ptr->ac, m_ptr->ml)) return result; result.success = TRUE; improve_attack_modifier(o_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); improve_attack_modifier(j_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); /* If we have a slay, modify the multiplier appropriately */ if (best_s_ptr != NULL) { result.hit_verb = best_s_ptr->range_verb; multiplier += best_s_ptr->mult; } /* Apply damage: multiplier, slays, criticals, bonuses */ result.dmg = damroll(o_ptr->dd, o_ptr->ds); result.dmg += o_ptr->to_d + j_ptr->to_d; result.dmg *= multiplier; result.dmg = critical_shot(o_ptr->weight, o_ptr->to_h, result.dmg, &result.msg_type); object_notice_attack_plusses(&p_ptr->inventory[INVEN_BOW]); return result; } /** * Helper function used with ranged_helper by do_cmd_throw. */ static struct attack_result make_ranged_throw(object_type *o_ptr, int y, int x) { struct attack_result result = {FALSE, 0, 0, "hit"}; monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; int bonus = p_ptr->state.to_h + o_ptr->to_h; int chance = p_ptr->state.skills[SKILL_TO_HIT_THROW] + bonus * BTH_PLUS_ADJ; int chance2 = chance - distance(p_ptr->py, p_ptr->px, y, x); int multiplier = 1; const struct slay *best_s_ptr = NULL; /* If we missed then we're done */ if (!test_hit(chance2, r_ptr->ac, m_ptr->ml)) return result; result.success = TRUE; improve_attack_modifier(o_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); /* If we have a slay, modify the multiplier appropriately */ if (best_s_ptr != NULL) { result.hit_verb = best_s_ptr->range_verb; multiplier += best_s_ptr->mult; } /* Apply damage: multiplier, slays, criticals, bonuses */ result.dmg = damroll(o_ptr->dd, o_ptr->ds); result.dmg += o_ptr->to_d; result.dmg *= multiplier; result.dmg = critical_norm(o_ptr->weight, o_ptr->to_h, result.dmg, &result.msg_type); return result; } /** * Fire an object from the quiver, pack or floor at a target. */ void do_cmd_fire(cmd_code code, cmd_arg args[]) { int item = args[0].item; int dir = args[1].direction; int range = 6 + 2 * p_ptr->state.ammo_mult; int shots = p_ptr->state.num_shots; ranged_attack attack = make_ranged_shot; object_type *j_ptr = &p_ptr->inventory[INVEN_BOW]; object_type *o_ptr = object_from_item_idx(item); /* Require a usable launcher */ if (!j_ptr->tval || !p_ptr->state.ammo_tval) { msg("You have nothing to fire with."); return; } /* Check the item being fired is usable by the player. */ if (!item_is_available(item, NULL, USE_EQUIP | USE_INVEN | USE_FLOOR)) { msg("That item is not within your reach."); return; } /* Check the ammo can be used with the launcher */ if (o_ptr->tval != p_ptr->state.ammo_tval) { msg("That ammo cannot be fired by your current weapon."); return; } ranged_helper(item, dir, range, shots, attack); } /** * Throw an object from the quiver, pack or floor. */ void do_cmd_throw(cmd_code code, cmd_arg args[]) { int item = args[0].item; int dir = args[1].direction; int shots = 1; object_type *o_ptr = object_from_item_idx(item); int weight = MAX(o_ptr->weight, 10); int str = adj_str_blow[p_ptr->state.stat_ind[A_STR]]; int range = MIN(((str + 20) * 10) / weight, 10); ranged_attack attack = make_ranged_throw; /* Make sure the player isn't throwing wielded items */ if (item >= INVEN_WIELD && item < QUIVER_START) { msg("You have cannot throw wielded items."); return; } /* Check the item being thrown is usable by the player. */ if (!item_is_available(item, NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR))) { msg("That item is not within your reach."); return; } ranged_helper(item, dir, range, shots, attack); } /** * Front-end 'throw' command. */ void textui_cmd_throw(void) { int item, dir; const char *q, *s; /* Get an item */ q = "Throw which item? "; s = "You have nothing to throw."; if (!get_item(&item, q, s, CMD_THROW, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; if (item >= INVEN_WIELD && item < QUIVER_START) { msg("You cannot throw wielded items."); return; } /* Get a direction (or cancel) */ if (!get_aim_dir(&dir)) return; cmd_insert(CMD_THROW); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_target(cmd_get_top(), 1, dir); } /** * Front-end command which fires at the nearest target with default ammo. */ void textui_cmd_fire_at_nearest(void) { /* the direction '5' means 'use the target' */ int i, dir = 5, item = -1; /* Require a usable launcher */ if (!p_ptr->inventory[INVEN_BOW].tval || !p_ptr->state.ammo_tval) { msg("You have nothing to fire with."); return; } /* Find first eligible ammo in the quiver */ for (i = QUIVER_START; i < QUIVER_END; i++) { if (p_ptr->inventory[i].tval != p_ptr->state.ammo_tval) continue; item = i; break; } /* Require usable ammo */ if (item < 0) { msg("You have no ammunition in the quiver to fire"); return; } /* Require foe */ if (!target_set_closest(TARGET_KILL | TARGET_QUIET)) return; /* Fire! */ cmd_insert(CMD_FIRE); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_target(cmd_get_top(), 1, dir); } angband-v3.3.2/src/z-type.h0000644000175000017500000000224611651552410015003 0ustar chriscchrisc#ifndef INCLUDED_ZTYPE_H #define INCLUDED_ZTYPE_H #include "h-basic.h" typedef struct data_panel data_panel; typedef struct type_union type_union; typedef enum type_val { T_END = 0, T_INT, T_FLOAT, T_CHAR, T_STRING } type_val; struct type_union { type_val t; union { float f; int i; char c; const char *s; } u; }; extern type_union i2u(int i); extern type_union f2u(float f); extern type_union c2u(char c); extern type_union s2u(const char *s); static const type_union END = { T_END, { 0 } }; /* * Helper classes for the display of typed data */ #define MAX_FMT 2 struct data_panel { byte color; const char *label; const char *fmt; /* printf format argument */ type_union value[MAX_FMT]; /* (short) arugment list */ }; struct loc { int x; int y; }; struct loc loc(int x, int y); /* * A set of points that can be constructed to apply a set of changes to */ struct point_set { int n; int allocated; struct loc *pts; }; struct point_set *point_set_new(int initial_size); void point_set_dispose(struct point_set *ps); void add_to_point_set(struct point_set *ps, int y, int x); int point_set_size(struct point_set *ps); #endif /* !INCLUDED_ZTYPE_H */ angband-v3.3.2/src/Makefile0000644000175000017500000000250511651552410015040 0ustar chriscchriscMKPATH=../mk/ include $(MKPATH)buildsys.mk # import source list include Makefile.src INCLUDE = $(HDRS) $(INCS) OBJECTS = $(ANGFILES) $(ZFILES) SRCS = ${OBJECTS:.o=.c} ${MAINFILES:.o=.c} SUBDIRS = gtk monster object player PROG = angband VERSION := $(shell ../scripts/version.sh) CFLAGS += -DBUILD_ID=${VERSION} -I. -std=c99 -Wdeclaration-after-statement -O0 # gcov intermediate data GCOBJS = $(OBJECTS:.o=.gcno) $(OBJECTS:.o=.gcda) GCOVS = $(OBJECTS:.o=.c.gcov) export CFLAGS LDFLAGS angband: angband.o $(MAINFILES) $(CC) -o angband angband.o $(MAINFILES) $(LDFLAGS) $(LDADD) @printf "%10s %-20s\n" LINK $@ angband.o: $(OBJECTS) $(LD) -r -o $@ $(OBJECTS) @printf "%10s %-20s\n" LINK $@ clean:: test-clean -rm -f angband.o -rm -f angband.exe -rm -f win/angband.res clean-extra: -rm -f autoconf.h tests: angband.o $(MAKE) -C tests all test-clean: $(MAKE) -C tests clean splint: splint -f .splintrc ${OBJECTS:.o=.c} main.c main-gcu.c clean-coverage: rm -f tests/ran-already rm -f $(GCOVS) $(GCOBJS) coverage: CFLAGS+=-fprofile-arcs -ftest-coverage coverage: LDFLAGS+=-lgcov coverage: clean-coverage clean gen-covs tests/ran-already : tests touch $@ gen-covs: tests/ran-already $(GCOVS) ./gen-coverage $(GCOVS) %.gcov: % (gcov -o $(dir $^) -p $^ >/dev/null) .PHONY : tests coverage clean-coverage tests/ran-already angband-v3.3.2/src/init2.c0000644000175000017500000022504311651552410014575 0ustar chriscchrisc/* * File: init2.c * Purpose: Various game initialistion routines * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "button.h" #include "cave.h" #include "cmds.h" #include "game-event.h" #include "game-cmd.h" #include "generate.h" #include "history.h" #include "keymap.h" #include "init.h" #include "monster/init.h" #include "monster/mon-msg.h" #include "monster/mon-util.h" #include "object/object.h" #include "object/slays.h" #include "object/tvalsval.h" #include "option.h" #include "parser.h" #include "prefs.h" #include "randname.h" #include "squelch.h" static struct history_chart *histories; /* * This file is used to initialize various variables and arrays for the * Angband game. Note the use of "fd_read()" and "fd_write()" to bypass * the common limitation of "read()" and "write()" to only 32767 bytes * at a time. * * Several of the arrays for Angband are built from "template" files in * the "lib/edit" directory. * * Warning -- the "ascii" file parsers use a minor hack to collect the * name and text information in a single pass. Thus, the game will not * be able to load any template file with more than 20K of names or 60K * of text, even though technically, up to 64K should be legal. */ static const char *k_info_flags[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) #a, #include "object/list-object-flags.h" #undef OF NULL }; static const char *effect_list[] = { #define EFFECT(x, y, r, z) #x, #include "list-effects.h" #undef EFFECT }; static u32b grab_one_effect(const char *what) { size_t i; /* Scan activations */ for (i = 0; i < N_ELEMENTS(effect_list); i++) { if (streq(what, effect_list[i])) return i; } /* Oops */ msg("Unknown effect '%s'.", what); /* Error */ return 0; } static struct history_chart *findchart(struct history_chart *hs, unsigned int idx) { for (; hs; hs = hs->next) if (hs->idx == idx) break; return hs; } /* * Find the default paths to all of our important sub-directories. * * All of the sub-directories should, by default, be located inside * the main directory, whose location is very system dependant and is * set by the ANGBAND_PATH environment variable, if it exists. (On multi- * user systems such as Linux this is not the default - see config.h for * more info.) * * This function takes a writable buffers, initially containing the * "path" to the "config", "lib" and "data" directories, for example, * "/etc/angband/", "/usr/share/angband" and "/var/games/angband" - * or a system dependant string, for example, ":lib:". The buffer * must be large enough to contain at least 32 more characters. * * Various command line options may allow some of the important * directories to be changed to user-specified directories, most * importantly, the "apex" and "user" and "save" directories, * but this is done after this function, see "main.c". * * In general, the initial path should end in the appropriate "PATH_SEP" * string. All of the "sub-directory" paths (created below or supplied * by the user) will NOT end in the "PATH_SEP" string, see the special * "path_build()" function in "util.c" for more information. * * Hack -- first we free all the strings, since this is known * to succeed even if the strings have not been allocated yet, * as long as the variables start out as "NULL". This allows * this function to be called multiple times, for example, to * try several base "path" values until a good one is found. */ void init_file_paths(const char *configpath, const char *libpath, const char *datapath) { #ifdef PRIVATE_USER_PATH char buf[1024]; #endif /* PRIVATE_USER_PATH */ /*** Free everything ***/ /* Free the sub-paths */ string_free(ANGBAND_DIR_APEX); string_free(ANGBAND_DIR_EDIT); string_free(ANGBAND_DIR_FILE); string_free(ANGBAND_DIR_HELP); string_free(ANGBAND_DIR_INFO); string_free(ANGBAND_DIR_SAVE); string_free(ANGBAND_DIR_PREF); string_free(ANGBAND_DIR_USER); string_free(ANGBAND_DIR_XTRA); string_free(ANGBAND_DIR_XTRA_FONT); string_free(ANGBAND_DIR_XTRA_GRAF); string_free(ANGBAND_DIR_XTRA_SOUND); string_free(ANGBAND_DIR_XTRA_ICON); /*** Prepare the paths ***/ /* Build path names */ ANGBAND_DIR_EDIT = string_make(format("%sedit", configpath)); ANGBAND_DIR_FILE = string_make(format("%sfile", libpath)); ANGBAND_DIR_HELP = string_make(format("%shelp", libpath)); ANGBAND_DIR_INFO = string_make(format("%sinfo", libpath)); ANGBAND_DIR_PREF = string_make(format("%spref", configpath)); ANGBAND_DIR_XTRA = string_make(format("%sxtra", libpath)); /* Build xtra/ paths */ ANGBAND_DIR_XTRA_FONT = string_make(format("%s" PATH_SEP "font", ANGBAND_DIR_XTRA)); ANGBAND_DIR_XTRA_GRAF = string_make(format("%s" PATH_SEP "graf", ANGBAND_DIR_XTRA)); ANGBAND_DIR_XTRA_SOUND = string_make(format("%s" PATH_SEP "sound", ANGBAND_DIR_XTRA)); ANGBAND_DIR_XTRA_ICON = string_make(format("%s" PATH_SEP "icon", ANGBAND_DIR_XTRA)); #ifdef PRIVATE_USER_PATH /* Build the path to the user specific directory */ if (strncmp(ANGBAND_SYS, "test", 4) == 0) path_build(buf, sizeof(buf), PRIVATE_USER_PATH, "Test"); else path_build(buf, sizeof(buf), PRIVATE_USER_PATH, VERSION_NAME); ANGBAND_DIR_USER = string_make(buf); path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "scores"); ANGBAND_DIR_APEX = string_make(buf); path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "save"); ANGBAND_DIR_SAVE = string_make(buf); #else /* !PRIVATE_USER_PATH */ /* Build pathnames */ ANGBAND_DIR_USER = string_make(format("%suser", datapath)); ANGBAND_DIR_APEX = string_make(format("%sapex", datapath)); ANGBAND_DIR_SAVE = string_make(format("%ssave", datapath)); #endif /* PRIVATE_USER_PATH */ } /* * Create any missing directories. We create only those dirs which may be * empty (user/, save/, apex/, info/, help/). The others are assumed * to contain required files and therefore must exist at startup * (edit/, pref/, file/, xtra/). * * ToDo: Only create the directories when actually writing files. */ void create_needed_dirs(void) { char dirpath[512]; path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_USER, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_SAVE, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_APEX, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_INFO, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_HELP, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); } /* Parsing functions for limits.txt */ static enum parser_error parse_z(struct parser *p) { maxima *z; const char *label; int value; z = parser_priv(p); label = parser_getsym(p, "label"); value = parser_getint(p, "value"); if (value < 0) return PARSE_ERROR_INVALID_VALUE; if (streq(label, "F")) z->f_max = value; else if (streq(label, "K")) z->k_max = value; else if (streq(label, "A")) z->a_max = value; else if (streq(label, "E")) z->e_max = value; else if (streq(label, "R")) z->r_max = value; else if (streq(label, "P")) z->mp_max = value; else if (streq(label, "S")) z->s_max = value; else if (streq(label, "O")) z->o_max = value; else if (streq(label, "M")) z->m_max = value; else if (streq(label, "I")) z->pit_max = value; else return PARSE_ERROR_UNDEFINED_DIRECTIVE; return 0; } struct parser *init_parse_z(void) { struct maxima *z = mem_zalloc(sizeof *z); struct parser *p = parser_new(); parser_setpriv(p, z); parser_reg(p, "V sym version", ignored); parser_reg(p, "M sym label int value", parse_z); return p; } static errr run_parse_z(struct parser *p) { return parse_file(p, "limits"); } static errr finish_parse_z(struct parser *p) { z_info = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_z(void) { mem_free(z_info); } static struct file_parser z_parser = { "limits", init_parse_z, run_parse_z, finish_parse_z, cleanup_z }; /* Parsing functions for object_base.txt */ struct kb_parsedata { object_base defaults; object_base *kb; }; static enum parser_error parse_kb_d(struct parser *p) { const char *label; int value; struct kb_parsedata *d = parser_priv(p); assert(d); label = parser_getsym(p, "label"); value = parser_getint(p, "value"); if (streq(label, "B")) d->defaults.break_perc = value; else return PARSE_ERROR_UNDEFINED_DIRECTIVE; return PARSE_ERROR_NONE; } static enum parser_error parse_kb_n(struct parser *p) { struct object_base *kb; struct kb_parsedata *d = parser_priv(p); assert(d); kb = mem_alloc(sizeof *kb); memcpy(kb, &d->defaults, sizeof(*kb)); kb->next = d->kb; d->kb = kb; kb->tval = tval_find_idx(parser_getsym(p, "tval")); if (kb->tval == -1) return PARSE_ERROR_UNRECOGNISED_TVAL; kb->name = string_make(parser_getstr(p, "name")); return PARSE_ERROR_NONE; } static enum parser_error parse_kb_b(struct parser *p) { struct object_base *kb; struct kb_parsedata *d = parser_priv(p); assert(d); kb = d->kb; assert(kb); kb->break_perc = parser_getint(p, "breakage"); return PARSE_ERROR_NONE; } static enum parser_error parse_kb_f(struct parser *p) { struct object_base *kb; char *s, *t; struct kb_parsedata *d = parser_priv(p); assert(d); kb = d->kb; assert(kb); s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(kb->flags, OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } struct parser *init_parse_kb(void) { struct parser *p = parser_new(); struct kb_parsedata *d = mem_zalloc(sizeof(*d)); parser_setpriv(p, d); parser_reg(p, "V sym version", ignored); parser_reg(p, "D sym label int value", parse_kb_d); parser_reg(p, "N sym tval str name", parse_kb_n); parser_reg(p, "B int breakage", parse_kb_b); parser_reg(p, "F str flags", parse_kb_f); return p; } static errr run_parse_kb(struct parser *p) { return parse_file(p, "object_base"); } static errr finish_parse_kb(struct parser *p) { struct object_base *kb; struct object_base *next = NULL; struct kb_parsedata *d = parser_priv(p); assert(d); kb_info = mem_zalloc(TV_MAX * sizeof(*kb_info)); for (kb = d->kb; kb; kb = next) { if (kb->tval >= TV_MAX) continue; memcpy(&kb_info[kb->tval], kb, sizeof(*kb)); next = kb->next; mem_free(kb); } mem_free(d); parser_destroy(p); return 0; } static void cleanup_kb(void) { int idx; for (idx = 0; idx < TV_MAX; idx++) { string_free(kb_info[idx].name); } mem_free(kb_info); } struct file_parser kb_parser = { "object_base", init_parse_kb, run_parse_kb, finish_parse_kb, cleanup_kb }; /* Parsing functions for object.txt */ static enum parser_error parse_k_n(struct parser *p) { int idx = parser_getint(p, "index"); const char *name = parser_getstr(p, "name"); struct object_kind *h = parser_priv(p); struct object_kind *k = mem_zalloc(sizeof *k); k->next = h; parser_setpriv(p, k); k->kidx = idx; k->name = string_make(name); return PARSE_ERROR_NONE; } static enum parser_error parse_k_g(struct parser *p) { const char *sym = parser_getsym(p, "char"); const char *color = parser_getsym(p, "color"); struct object_kind *k = parser_priv(p); assert(k); k->d_char = sym[0]; if (strlen(color) > 1) k->d_attr = color_text_to_attr(color); else k->d_attr = color_char_to_attr(color[0]); return PARSE_ERROR_NONE; } static enum parser_error parse_k_i(struct parser *p) { struct object_kind *k = parser_priv(p); int tval; assert(k); tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; k->tval = tval; k->sval = parser_getint(p, "sval"); k->base = &kb_info[k->tval]; return PARSE_ERROR_NONE; } static enum parser_error parse_k_w(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->level = parser_getint(p, "level"); k->weight = parser_getint(p, "weight"); k->cost = parser_getint(p, "cost"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_a(struct parser *p) { struct object_kind *k = parser_priv(p); const char *tmp = parser_getstr(p, "minmax"); int amin, amax; assert(k); k->alloc_prob = parser_getint(p, "common"); if (sscanf(tmp, "%d to %d", &amin, &amax) != 2) return PARSE_ERROR_GENERIC; k->alloc_min = amin; k->alloc_max = amax; return PARSE_ERROR_NONE; } static enum parser_error parse_k_p(struct parser *p) { struct object_kind *k = parser_priv(p); struct random hd = parser_getrand(p, "hd"); assert(k); k->ac = parser_getint(p, "ac"); k->dd = hd.dice; k->ds = hd.sides; k->to_h = parser_getrand(p, "to-h"); k->to_d = parser_getrand(p, "to-d"); k->to_a = parser_getrand(p, "to-a"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_c(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->charge = parser_getrand(p, "charges"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_m(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->gen_mult_prob = parser_getint(p, "prob"); k->stack_size = parser_getrand(p, "stack"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_f(struct parser *p) { struct object_kind *k = parser_priv(p); char *s = string_make(parser_getstr(p, "flags")); char *t; assert(k); t = strtok(s, " |"); while (t) { if (grab_flag(k->flags, OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_k_e(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->effect = grab_one_effect(parser_getsym(p, "name")); if (parser_hasval(p, "time")) k->time = parser_getrand(p, "time"); if (!k->effect) return PARSE_ERROR_GENERIC; return PARSE_ERROR_NONE; } static enum parser_error parse_k_d(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->text = string_append(k->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } static enum parser_error parse_k_l(struct parser *p) { struct object_kind *k = parser_priv(p); char *s; char *t; assert(k); k->pval[k->num_pvals] = parser_getrand(p, "pval"); if (!parser_hasval(p, "flags")) { k->num_pvals++; return PARSE_ERROR_NONE; } s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(k->flags, OF_SIZE, k_info_flags, t) || grab_flag(k->pval_flags[k->num_pvals], OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } k->num_pvals++; if (k->num_pvals > MAX_PVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } struct parser *init_parse_k(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N int index str name", parse_k_n); parser_reg(p, "G sym char sym color", parse_k_g); parser_reg(p, "I sym tval int sval", parse_k_i); parser_reg(p, "W int level int extra int weight int cost", parse_k_w); parser_reg(p, "A int common str minmax", parse_k_a); parser_reg(p, "P int ac rand hd rand to-h rand to-d rand to-a", parse_k_p); parser_reg(p, "C rand charges", parse_k_c); parser_reg(p, "M int prob rand stack", parse_k_m); parser_reg(p, "F str flags", parse_k_f); parser_reg(p, "E sym name ?rand time", parse_k_e); parser_reg(p, "L rand pval ?str flags", parse_k_l); parser_reg(p, "D str text", parse_k_d); return p; } static errr run_parse_k(struct parser *p) { return parse_file(p, "object"); } static errr finish_parse_k(struct parser *p) { struct object_kind *k, *next = NULL; k_info = mem_zalloc(z_info->k_max * sizeof(*k)); for (k = parser_priv(p); k; k = next) { if (k->kidx >= z_info->k_max) continue; memcpy(&k_info[k->kidx], k, sizeof(*k)); next = k->next; mem_free(k); } objkinds = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_k(void) { int idx; for (idx = 0; idx < z_info->k_max; idx++) { string_free(k_info[idx].name); mem_free(k_info[idx].text); } mem_free(k_info); } struct file_parser k_parser = { "object", init_parse_k, run_parse_k, finish_parse_k, cleanup_k }; /* Parsing functions for artifact.txt */ static enum parser_error parse_a_n(struct parser *p) { bitflag f[OF_SIZE]; int idx = parser_getint(p, "index"); const char *name = parser_getstr(p, "name"); struct artifact *h = parser_priv(p); struct artifact *a = mem_zalloc(sizeof *a); a->next = h; parser_setpriv(p, a); a->aidx = idx; a->name = string_make(name); /* Ignore all elements */ create_mask(f, FALSE, OFT_IGNORE, OFT_MAX); of_union(a->flags, f); return PARSE_ERROR_NONE; } static enum parser_error parse_a_i(struct parser *p) { struct artifact *a = parser_priv(p); int tval, sval; assert(a); tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; a->tval = tval; sval = lookup_sval(a->tval, parser_getsym(p, "sval")); if (sval < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; a->sval = sval; return PARSE_ERROR_NONE; } static enum parser_error parse_a_w(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->level = parser_getint(p, "level"); a->rarity = parser_getint(p, "rarity"); a->weight = parser_getint(p, "weight"); a->cost = parser_getint(p, "cost"); return PARSE_ERROR_NONE; } static enum parser_error parse_a_a(struct parser *p) { struct artifact *a = parser_priv(p); const char *tmp = parser_getstr(p, "minmax"); int amin, amax; assert(a); a->alloc_prob = parser_getint(p, "common"); if (sscanf(tmp, "%d to %d", &amin, &amax) != 2) return PARSE_ERROR_GENERIC; if (amin > 255 || amax > 255 || amin < 0 || amax < 0) return PARSE_ERROR_OUT_OF_BOUNDS; a->alloc_min = amin; a->alloc_max = amax; return PARSE_ERROR_NONE; } static enum parser_error parse_a_p(struct parser *p) { struct artifact *a = parser_priv(p); struct random hd = parser_getrand(p, "hd"); assert(a); a->ac = parser_getint(p, "ac"); a->dd = hd.dice; a->ds = hd.sides; a->to_h = parser_getint(p, "to-h"); a->to_d = parser_getint(p, "to-d"); a->to_a = parser_getint(p, "to-a"); return PARSE_ERROR_NONE; } static enum parser_error parse_a_f(struct parser *p) { struct artifact *a = parser_priv(p); char *s; char *t; assert(a); if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(a->flags, OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_a_e(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->effect = grab_one_effect(parser_getsym(p, "name")); a->time = parser_getrand(p, "time"); if (!a->effect) return PARSE_ERROR_GENERIC; return PARSE_ERROR_NONE; } static enum parser_error parse_a_m(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->effect_msg = string_append(a->effect_msg, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } static enum parser_error parse_a_l(struct parser *p) { struct artifact *a = parser_priv(p); char *s; char *t; assert(a); a->pval[a->num_pvals] = parser_getint(p, "pval"); if (!parser_hasval(p, "flags")) return PARSE_ERROR_MISSING_FIELD; s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(a->flags, OF_SIZE, k_info_flags, t) || grab_flag(a->pval_flags[a->num_pvals], OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } a->num_pvals++; if (a->num_pvals > MAX_PVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_a_d(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->text = string_append(a->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_a(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N int index str name", parse_a_n); parser_reg(p, "I sym tval sym sval", parse_a_i); parser_reg(p, "W int level int rarity int weight int cost", parse_a_w); parser_reg(p, "A int common str minmax", parse_a_a); parser_reg(p, "P int ac rand hd int to-h int to-d int to-a", parse_a_p); parser_reg(p, "F ?str flags", parse_a_f); parser_reg(p, "E sym name rand time", parse_a_e); parser_reg(p, "M str text", parse_a_m); parser_reg(p, "L int pval str flags", parse_a_l); parser_reg(p, "D str text", parse_a_d); return p; } static errr run_parse_a(struct parser *p) { return parse_file(p, "artifact"); } static errr finish_parse_a(struct parser *p) { struct artifact *a, *n; a_info = mem_zalloc(z_info->a_max * sizeof(*a)); for (a = parser_priv(p); a; a = a->next) { if (a->aidx >= z_info->a_max) continue; memcpy(&a_info[a->aidx], a, sizeof(*a)); } a = parser_priv(p); while (a) { n = a->next; mem_free(a); a = n; } parser_destroy(p); return 0; } static void cleanup_a(void) { int idx; for (idx = 0; idx < z_info->a_max; idx++) { string_free(a_info[idx].name); mem_free(a_info[idx].effect_msg); mem_free(a_info[idx].text); } mem_free(a_info); } struct file_parser a_parser = { "artifact", init_parse_a, run_parse_a, finish_parse_a, cleanup_a }; /* Parsing functions for names.txt (random name fragments) */ struct name { struct name *next; char *str; }; struct names_parse { unsigned int section; unsigned int nnames[RANDNAME_NUM_TYPES]; struct name *names[RANDNAME_NUM_TYPES]; }; static enum parser_error parse_names_n(struct parser *p) { unsigned int section = parser_getint(p, "section"); struct names_parse *s = parser_priv(p); if (s->section >= RANDNAME_NUM_TYPES) return PARSE_ERROR_GENERIC; s->section = section; return PARSE_ERROR_NONE; } static enum parser_error parse_names_d(struct parser *p) { const char *name = parser_getstr(p, "name"); struct names_parse *s = parser_priv(p); struct name *ns = mem_zalloc(sizeof *ns); s->nnames[s->section]++; ns->next = s->names[s->section]; ns->str = string_make(name); s->names[s->section] = ns; return PARSE_ERROR_NONE; } struct parser *init_parse_names(void) { struct parser *p = parser_new(); struct names_parse *n = mem_zalloc(sizeof *n); n->section = 0; parser_setpriv(p, n); parser_reg(p, "N int section", parse_names_n); parser_reg(p, "D str name", parse_names_d); return p; } static errr run_parse_names(struct parser *p) { return parse_file(p, "names"); } static errr finish_parse_names(struct parser *p) { int i; unsigned int j; struct names_parse *n = parser_priv(p); struct name *nm; name_sections = mem_zalloc(sizeof(char**) * RANDNAME_NUM_TYPES); for (i = 0; i < RANDNAME_NUM_TYPES; i++) { name_sections[i] = mem_alloc(sizeof(char*) * (n->nnames[i] + 1)); for (nm = n->names[i], j = 0; nm && j < n->nnames[i]; nm = nm->next, j++) { name_sections[i][j] = nm->str; } name_sections[i][n->nnames[i]] = NULL; while (n->names[i]) { nm = n->names[i]->next; mem_free(n->names[i]); n->names[i] = nm; } } mem_free(n); parser_destroy(p); return 0; } static void cleanup_names(void) { int i, j; for (i = 0; i < RANDNAME_NUM_TYPES; i++) { for (j = 0; name_sections[i][j]; j++) { string_free((char *)name_sections[i][j]); } mem_free(name_sections[i]); } mem_free(name_sections); } struct file_parser names_parser = { "names", init_parse_names, run_parse_names, finish_parse_names, cleanup_names }; /* Parsing functions for terrain.txt */ static enum parser_error parse_f_n(struct parser *p) { int idx = parser_getuint(p, "index"); const char *name = parser_getstr(p, "name"); struct feature *h = parser_priv(p); struct feature *f = mem_zalloc(sizeof *f); f->next = h; f->fidx = idx; f->mimic = idx; f->name = string_make(name); parser_setpriv(p, f); return PARSE_ERROR_NONE; } static enum parser_error parse_f_g(struct parser *p) { char glyph = parser_getchar(p, "glyph"); const char *color = parser_getsym(p, "color"); int attr = 0; struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->d_char = glyph; if (strlen(color) > 1) attr = color_text_to_attr(color); else attr = color_char_to_attr(color[0]); if (attr < 0) return PARSE_ERROR_INVALID_COLOR; f->d_attr = attr; return PARSE_ERROR_NONE; } static enum parser_error parse_f_m(struct parser *p) { unsigned int idx = parser_getuint(p, "index"); struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->mimic = idx; return PARSE_ERROR_NONE; } static enum parser_error parse_f_p(struct parser *p) { unsigned int priority = parser_getuint(p, "priority"); struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->priority = priority; return PARSE_ERROR_NONE; } static const char *f_info_flags[] = { "PWALK", "PPASS", "MWALK", "MPASS", "LOOK", "DIG", "DOOR", "EXIT_UP", "EXIT_DOWN", "PERM", "TRAP", "SHOP", "HIDDEN", "BORING", NULL }; static errr grab_one_flag(u32b *flags, const char *names[], const char *what) { int i; /* Check flags */ for (i = 0; i < 32 && names[i]; i++) { if (streq(what, names[i])) { *flags |= (1L << i); return (0); } } return (-1); } static enum parser_error parse_f_f(struct parser *p) { char *flags; struct feature *f = parser_priv(p); char *s; if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_one_flag(&f->flags, f_info_flags, s)) { mem_free(s); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_f_x(struct parser *p) { struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->locked = parser_getint(p, "locked"); f->jammed = parser_getint(p, "jammed"); f->shopnum = parser_getint(p, "shopnum"); f->dig = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_f_e(struct parser *p) { struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->effect = grab_one_effect(parser_getstr(p, "effect")); if (!f->effect) return PARSE_ERROR_INVALID_EFFECT; return PARSE_ERROR_NONE; } struct parser *init_parse_f(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index str name", parse_f_n); parser_reg(p, "G char glyph sym color", parse_f_g); parser_reg(p, "M uint index", parse_f_m); parser_reg(p, "P uint priority", parse_f_p); parser_reg(p, "F ?str flags", parse_f_f); parser_reg(p, "X int locked int jammed int shopnum int dig", parse_f_x); parser_reg(p, "E str effect", parse_f_e); return p; } static errr run_parse_f(struct parser *p) { return parse_file(p, "terrain"); } static errr finish_parse_f(struct parser *p) { struct feature *f, *n; f_info = mem_zalloc(z_info->f_max * sizeof(*f)); for (f = parser_priv(p); f; f = f->next) { if (f->fidx >= z_info->f_max) continue; memcpy(&f_info[f->fidx], f, sizeof(*f)); } f = parser_priv(p); while (f) { n = f->next; mem_free(f); f = n; } parser_destroy(p); return 0; } static void cleanup_f(void) { int idx; for (idx = 0; idx < z_info->f_max; idx++) { string_free(f_info[idx].name); } mem_free(f_info); } struct file_parser f_parser = { "terrain", init_parse_f, run_parse_f, finish_parse_f, cleanup_f }; /* Parsing functions for ego-item.txt */ static enum parser_error parse_e_n(struct parser *p) { int idx = parser_getint(p, "index"); const char *name = parser_getstr(p, "name"); struct ego_item *h = parser_priv(p); struct ego_item *e = mem_zalloc(sizeof *e); e->next = h; parser_setpriv(p, e); e->eidx = idx; e->name = string_make(name); return PARSE_ERROR_NONE; } static enum parser_error parse_e_w(struct parser *p) { int level = parser_getint(p, "level"); int rarity = parser_getint(p, "rarity"); int cost = parser_getint(p, "cost"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->level = level; e->rarity = rarity; e->cost = cost; return PARSE_ERROR_NONE; } static enum parser_error parse_e_x(struct parser *p) { int rating = parser_getint(p, "rating"); int xtra = parser_getint(p, "xtra"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->rating = rating; e->xtra = xtra; return PARSE_ERROR_NONE; } static enum parser_error parse_e_a(struct parser *p) { struct ego_item *e = parser_priv(p); const char *tmp = parser_getstr(p, "minmax"); int amin, amax; e->alloc_prob = parser_getint(p, "common"); if (sscanf(tmp, "%d to %d", &amin, &amax) != 2) return PARSE_ERROR_GENERIC; if (amin > 255 || amax > 255 || amin < 0 || amax < 0) return PARSE_ERROR_OUT_OF_BOUNDS; e->alloc_min = amin; e->alloc_max = amax; return PARSE_ERROR_NONE; } static enum parser_error parse_e_t(struct parser *p) { int i; int tval; int min_sval, max_sval; struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; min_sval = parser_getint(p, "min-sval"); max_sval = parser_getint(p, "max-sval"); for (i = 0; i < EGO_TVALS_MAX; i++) { if (!e->tval[i]) { e->tval[i] = tval; e->min_sval[i] = min_sval; e->max_sval[i] = max_sval; break; } } if (i == EGO_TVALS_MAX) return PARSE_ERROR_GENERIC; return PARSE_ERROR_NONE; } static enum parser_error parse_e_c(struct parser *p) { struct random th = parser_getrand(p, "th"); struct random td = parser_getrand(p, "td"); struct random ta = parser_getrand(p, "ta"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->to_h = th; e->to_d = td; e->to_a = ta; return PARSE_ERROR_NONE; } static enum parser_error parse_e_m(struct parser *p) { int th = parser_getint(p, "th"); int td = parser_getint(p, "td"); int ta = parser_getint(p, "ta"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->min_to_h = th; e->min_to_d = td; e->min_to_a = ta; return PARSE_ERROR_NONE; } static enum parser_error parse_e_f(struct parser *p) { struct ego_item *e = parser_priv(p); char *s; char *t; if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(e->flags, OF_SIZE, k_info_flags,t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_e_l(struct parser *p) { struct ego_item *e = parser_priv(p); char *s; char *t; if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_MISSING_FIELD; e->pval[e->num_pvals] = parser_getrand(p, "pval"); e->min_pval[e->num_pvals] = parser_getint(p, "min"); s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(e->flags, OF_SIZE, k_info_flags, t) || grab_flag(e->pval_flags[e->num_pvals], OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } e->num_pvals++; if (e->num_pvals > MAX_PVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_e_d(struct parser *p) { struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->text = string_append(e->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_e(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N int index str name", parse_e_n); parser_reg(p, "W int level int rarity int pad int cost", parse_e_w); parser_reg(p, "X int rating int xtra", parse_e_x); parser_reg(p, "A int common str minmax", parse_e_a); parser_reg(p, "T sym tval int min-sval int max-sval", parse_e_t); parser_reg(p, "C rand th rand td rand ta", parse_e_c); parser_reg(p, "M int th int td int ta", parse_e_m); parser_reg(p, "F ?str flags", parse_e_f); parser_reg(p, "L rand pval int min str flags", parse_e_l); parser_reg(p, "D str text", parse_e_d); return p; } static errr run_parse_e(struct parser *p) { return parse_file(p, "ego_item"); } static errr finish_parse_e(struct parser *p) { struct ego_item *e, *n; e_info = mem_zalloc(z_info->e_max * sizeof(*e)); for (e = parser_priv(p); e; e = e->next) { if (e->eidx >= z_info->e_max) continue; memcpy(&e_info[e->eidx], e, sizeof(*e)); } create_slay_cache(e_info); e = parser_priv(p); while (e) { n = e->next; mem_free(e); e = n; } parser_destroy(p); return 0; } static void cleanup_e(void) { int idx; for (idx = 0; idx < z_info->e_max; idx++) { string_free(e_info[idx].name); mem_free(e_info[idx].text); } mem_free(e_info); free_slay_cache(); } struct file_parser e_parser = { "ego_item", init_parse_e, run_parse_e, finish_parse_e, cleanup_e }; /* Parsing functions for prace.txt */ static enum parser_error parse_p_n(struct parser *p) { struct player_race *h = parser_priv(p); struct player_race *r = mem_zalloc(sizeof *r); r->next = h; r->ridx = parser_getuint(p, "index"); r->name = string_make(parser_getstr(p, "name")); parser_setpriv(p, r); return PARSE_ERROR_NONE; } static enum parser_error parse_p_s(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->r_adj[A_STR] = parser_getint(p, "str"); r->r_adj[A_DEX] = parser_getint(p, "dex"); r->r_adj[A_CON] = parser_getint(p, "con"); r->r_adj[A_INT] = parser_getint(p, "int"); r->r_adj[A_WIS] = parser_getint(p, "wis"); r->r_adj[A_CHR] = parser_getint(p, "chr"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_r(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->r_skills[SKILL_DISARM] = parser_getint(p, "dis"); r->r_skills[SKILL_DEVICE] = parser_getint(p, "dev"); r->r_skills[SKILL_SAVE] = parser_getint(p, "sav"); r->r_skills[SKILL_STEALTH] = parser_getint(p, "stl"); r->r_skills[SKILL_SEARCH] = parser_getint(p, "srh"); r->r_skills[SKILL_SEARCH_FREQUENCY] = parser_getint(p, "fos"); r->r_skills[SKILL_TO_HIT_MELEE] = parser_getint(p, "thm"); r->r_skills[SKILL_TO_HIT_BOW] = parser_getint(p, "thb"); r->r_skills[SKILL_TO_HIT_THROW] = parser_getint(p, "throw"); r->r_skills[SKILL_DIGGING] = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_x(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->r_mhp = parser_getint(p, "mhp"); r->r_exp = parser_getint(p, "exp"); r->infra = parser_getint(p, "infra"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_i(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->history = findchart(histories, parser_getuint(p, "hist")); r->b_age = parser_getint(p, "b-age"); r->m_age = parser_getint(p, "m-age"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_h(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->m_b_ht = parser_getint(p, "mbht"); r->m_m_ht = parser_getint(p, "mmht"); r->f_b_ht = parser_getint(p, "fbht"); r->f_m_ht = parser_getint(p, "fmht"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_w(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->m_b_wt = parser_getint(p, "mbwt"); r->m_m_wt = parser_getint(p, "mmwt"); r->f_b_wt = parser_getint(p, "fbwt"); r->f_m_wt = parser_getint(p, "fmwt"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_f(struct parser *p) { struct player_race *r = parser_priv(p); char *flags; char *s; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(r->flags, OF_SIZE, k_info_flags, s)) break; s = strtok(NULL, " |"); } mem_free(flags); return s ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static const char *player_info_flags[] = { #define PF(a, b) #a, #include "list-player-flags.h" #undef PF NULL }; static enum parser_error parse_p_y(struct parser *p) { struct player_race *r = parser_priv(p); char *flags; char *s; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(r->pflags, PF_SIZE, player_info_flags, s)) break; s = strtok(NULL, " |"); } mem_free(flags); return s ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_p_c(struct parser *p) { struct player_race *r = parser_priv(p); char *classes; char *s; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "classes")) return PARSE_ERROR_NONE; classes = string_make(parser_getstr(p, "classes")); s = strtok(classes, " |"); while (s) { r->choice |= 1 << atoi(s); s = strtok(NULL, " |"); } mem_free(classes); return PARSE_ERROR_NONE; } struct parser *init_parse_p(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index str name", parse_p_n); parser_reg(p, "S int str int int int wis int dex int con int chr", parse_p_s); parser_reg(p, "R int dis int dev int sav int stl int srh int fos int thm int thb int throw int dig", parse_p_r); parser_reg(p, "X int mhp int exp int infra", parse_p_x); parser_reg(p, "I uint hist int b-age int m-age", parse_p_i); parser_reg(p, "H int mbht int mmht int fbht int fmht", parse_p_h); parser_reg(p, "W int mbwt int mmwt int fbwt int fmwt", parse_p_w); parser_reg(p, "F ?str flags", parse_p_f); parser_reg(p, "Y ?str flags", parse_p_y); parser_reg(p, "C ?str classes", parse_p_c); return p; } static errr run_parse_p(struct parser *p) { return parse_file(p, "p_race"); } static errr finish_parse_p(struct parser *p) { races = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_p(void) { struct player_race *p = races; struct player_race *next; while (p) { next = p->next; string_free((char *)p->name); mem_free(p); p = next; } } struct file_parser p_parser = { "p_race", init_parse_p, run_parse_p, finish_parse_p, cleanup_p }; /* Parsing functions for pclass.txt */ static enum parser_error parse_c_n(struct parser *p) { struct player_class *h = parser_priv(p); struct player_class *c = mem_zalloc(sizeof *c); c->cidx = parser_getuint(p, "index"); c->name = string_make(parser_getstr(p, "name")); c->next = h; parser_setpriv(p, c); return PARSE_ERROR_NONE; } static enum parser_error parse_c_s(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->c_adj[A_STR] = parser_getint(p, "str"); c->c_adj[A_INT] = parser_getint(p, "int"); c->c_adj[A_WIS] = parser_getint(p, "wis"); c->c_adj[A_DEX] = parser_getint(p, "dex"); c->c_adj[A_CON] = parser_getint(p, "con"); c->c_adj[A_CHR] = parser_getint(p, "chr"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_c(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->c_skills[SKILL_DISARM] = parser_getint(p, "dis"); c->c_skills[SKILL_DEVICE] = parser_getint(p, "dev"); c->c_skills[SKILL_SAVE] = parser_getint(p, "sav"); c->c_skills[SKILL_STEALTH] = parser_getint(p, "stl"); c->c_skills[SKILL_SEARCH] = parser_getint(p, "srh"); c->c_skills[SKILL_SEARCH_FREQUENCY] = parser_getint(p, "fos"); c->c_skills[SKILL_TO_HIT_MELEE] = parser_getint(p, "thm"); c->c_skills[SKILL_TO_HIT_BOW] = parser_getint(p, "thb"); c->c_skills[SKILL_TO_HIT_THROW] = parser_getint(p, "throw"); c->c_skills[SKILL_DIGGING] = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_x(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->x_skills[SKILL_DISARM] = parser_getint(p, "dis"); c->x_skills[SKILL_DEVICE] = parser_getint(p, "dev"); c->x_skills[SKILL_SAVE] = parser_getint(p, "sav"); c->x_skills[SKILL_STEALTH] = parser_getint(p, "stl"); c->x_skills[SKILL_SEARCH] = parser_getint(p, "srh"); c->x_skills[SKILL_SEARCH_FREQUENCY] = parser_getint(p, "fos"); c->x_skills[SKILL_TO_HIT_MELEE] = parser_getint(p, "thm"); c->x_skills[SKILL_TO_HIT_BOW] = parser_getint(p, "thb"); c->x_skills[SKILL_TO_HIT_THROW] = parser_getint(p, "throw"); c->x_skills[SKILL_DIGGING] = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_i(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->c_mhp = parser_getint(p, "mhp"); c->c_exp = parser_getint(p, "exp"); c->sense_base = parser_getint(p, "sense-base"); c->sense_div = parser_getint(p, "sense-div"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_a(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->max_attacks = parser_getint(p, "max-attacks"); c->min_weight = parser_getint(p, "min-weight"); c->att_multiply = parser_getint(p, "att-multiply"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_m(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->spell_book = parser_getuint(p, "book"); c->spell_stat = parser_getuint(p, "stat"); c->spell_first = parser_getuint(p, "first"); c->spell_weight = parser_getuint(p, "weight"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_b(struct parser *p) { struct player_class *c = parser_priv(p); unsigned int spell; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; spell = parser_getuint(p, "spell"); if (spell >= PY_MAX_SPELLS) return PARSE_ERROR_OUT_OF_BOUNDS; c->spells.info[spell].slevel = parser_getint(p, "level"); c->spells.info[spell].smana = parser_getint(p, "mana"); c->spells.info[spell].sfail = parser_getint(p, "fail"); c->spells.info[spell].sexp = parser_getint(p, "exp"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_t(struct parser *p) { struct player_class *c = parser_priv(p); int i; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; for (i = 0; i < PY_MAX_LEVEL / 5; i++) { if (!c->title[i]) { c->title[i] = string_make(parser_getstr(p, "title")); break; } } if (i >= PY_MAX_LEVEL / 5) return PARSE_ERROR_TOO_MANY_ENTRIES; return PARSE_ERROR_NONE; } static enum parser_error parse_c_e(struct parser *p) { struct player_class *c = parser_priv(p); struct start_item *si; int tval, sval; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; sval = lookup_sval(tval, parser_getsym(p, "sval")); if (sval < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; si = mem_zalloc(sizeof *si); si->kind = objkind_get(tval, sval); si->min = parser_getuint(p, "min"); si->max = parser_getuint(p, "max"); if (si->min > 99 || si->max > 99) { mem_free(si->kind); return PARSE_ERROR_INVALID_ITEM_NUMBER; } si->next = c->start_items; c->start_items = si; return PARSE_ERROR_NONE; } static enum parser_error parse_c_f(struct parser *p) { struct player_class *c = parser_priv(p); char *flags; char *s; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(c->pflags, PF_SIZE, player_info_flags, s)) break; s = strtok(NULL, " |"); } mem_free(flags); return s ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } struct parser *init_parse_c(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index str name", parse_c_n); parser_reg(p, "S int str int int int wis int dex int con int chr", parse_c_s); parser_reg(p, "C int dis int dev int sav int stl int srh int fos int thm int thb int throw int dig", parse_c_c); parser_reg(p, "X int dis int dev int sav int stl int srh int fos int thm int thb int throw int dig", parse_c_x); parser_reg(p, "I int mhp int exp int sense-base int sense-div", parse_c_i); parser_reg(p, "A int max-attacks int min-weight int att-multiply", parse_c_a); parser_reg(p, "M uint book uint stat uint first uint weight", parse_c_m); parser_reg(p, "B uint spell int level int mana int fail int exp", parse_c_b); parser_reg(p, "T str title", parse_c_t); parser_reg(p, "E sym tval sym sval uint min uint max", parse_c_e); parser_reg(p, "F ?str flags", parse_c_f); return p; } static errr run_parse_c(struct parser *p) { return parse_file(p, "p_class"); } static errr finish_parse_c(struct parser *p) { classes = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_c(void) { struct player_class *c = classes; struct player_class *next; struct start_item *item, *item_next; int i; while (c) { next = c->next; item = c->start_items; while(item) { item_next = item->next; mem_free(item); item = item_next; } for (i = 0; i < PY_MAX_LEVEL / 5; i++) { string_free((char *)c->title[i]); } mem_free((char *)c->name); mem_free(c); c = next; } } struct file_parser c_parser = { "p_class", init_parse_c, run_parse_c, finish_parse_c, cleanup_c }; /* Parsing functions for vault.txt */ static enum parser_error parse_v_n(struct parser *p) { struct vault *h = parser_priv(p); struct vault *v = mem_zalloc(sizeof *v); v->vidx = parser_getuint(p, "index"); v->name = string_make(parser_getstr(p, "name")); v->next = h; parser_setpriv(p, v); return PARSE_ERROR_NONE; } static enum parser_error parse_v_x(struct parser *p) { struct vault *v = parser_priv(p); if (!v) return PARSE_ERROR_MISSING_RECORD_HEADER; v->typ = parser_getuint(p, "type"); v->rat = parser_getint(p, "rating"); v->hgt = parser_getuint(p, "height"); v->wid = parser_getuint(p, "width"); /* XXX: huh? These checks were in the original code and I have no idea * why. */ if (v->typ == 6 && (v->wid > 33 || v->hgt > 22)) return PARSE_ERROR_VAULT_TOO_BIG; if (v->typ == 7 && (v->wid > 66 || v->hgt > 44)) return PARSE_ERROR_VAULT_TOO_BIG; return PARSE_ERROR_NONE; } static enum parser_error parse_v_d(struct parser *p) { struct vault *v = parser_priv(p); if (!v) return PARSE_ERROR_MISSING_RECORD_HEADER; v->text = string_append(v->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_v(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index str name", parse_v_n); parser_reg(p, "X uint type int rating uint height uint width", parse_v_x); parser_reg(p, "D str text", parse_v_d); return p; } static errr run_parse_v(struct parser *p) { return parse_file(p, "vault"); } static errr finish_parse_v(struct parser *p) { vaults = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_v(void) { struct vault *v, *next; for (v = vaults; v; v = next) { next = v->next; mem_free(v->name); mem_free(v->text); mem_free(v); } } struct file_parser v_parser = { "vault", init_parse_v, run_parse_v, finish_parse_v, cleanup_v }; /* Parsing functions for p_hist.txt */ static enum parser_error parse_h_n(struct parser *p) { struct history_chart *oc = parser_priv(p); struct history_chart *c; struct history_entry *e = mem_zalloc(sizeof *e); unsigned int idx = parser_getuint(p, "chart"); if (!(c = findchart(oc, idx))) { c = mem_zalloc(sizeof *c); c->next = oc; c->idx = idx; parser_setpriv(p, c); } e->isucc = parser_getint(p, "next"); e->roll = parser_getint(p, "roll"); e->bonus = parser_getint(p, "bonus"); e->next = c->entries; c->entries = e; return PARSE_ERROR_NONE; } static enum parser_error parse_h_d(struct parser *p) { struct history_chart *h = parser_priv(p); if (!h) return PARSE_ERROR_MISSING_RECORD_HEADER; assert(h->entries); h->entries->text = string_append(h->entries->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_h(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint chart int next int roll int bonus", parse_h_n); parser_reg(p, "D str text", parse_h_d); return p; } static errr run_parse_h(struct parser *p) { return parse_file(p, "p_hist"); } static errr finish_parse_h(struct parser *p) { struct history_chart *c; struct history_entry *e, *prev, *next; histories = parser_priv(p); /* Go fix up the entry successor pointers. We can't compute them at * load-time since we may not have seen the successor history yet. Also, * we need to put the entries in the right order; the parser actually * stores them backwards, which is not desirable. */ for (c = histories; c; c = c->next) { e = c->entries; prev = NULL; while (e) { next = e->next; e->next = prev; prev = e; e = next; } c->entries = prev; for (e = c->entries; e; e = e->next) { if (!e->isucc) continue; e->succ = findchart(histories, e->isucc); if (!e->succ) { return -1; } } } parser_destroy(p); return 0; } static void cleanup_h(void) { struct history_chart *c, *next_c; struct history_entry *e, *next_e; c = histories; while (c) { next_c = c->next; e = c->entries; while (e) { next_e = e->next; mem_free(e->text); mem_free(e); e = next_e; } mem_free(c); c = next_c; } } struct file_parser h_parser = { "p_hist", init_parse_h, run_parse_h, finish_parse_h, cleanup_h }; /* Parsing functions for flavor.txt */ static enum parser_error parse_flavor_n(struct parser *p) { struct flavor *h = parser_priv(p); struct flavor *f = mem_zalloc(sizeof *f); f->next = h; f->fidx = parser_getuint(p, "index"); f->tval = tval_find_idx(parser_getsym(p, "tval")); /* assert(f->tval); */ if (parser_hasval(p, "sval")) f->sval = lookup_sval(f->tval, parser_getsym(p, "sval")); else f->sval = SV_UNKNOWN; parser_setpriv(p, f); return PARSE_ERROR_NONE; } static enum parser_error parse_flavor_g(struct parser *p) { struct flavor *f = parser_priv(p); int d_attr; const char *attr; if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->d_char = parser_getchar(p, "glyph"); attr = parser_getsym(p, "attr"); if (strlen(attr) == 1) { d_attr = color_char_to_attr(attr[0]); } else { d_attr = color_text_to_attr(attr); } if (d_attr < 0) return PARSE_ERROR_GENERIC; f->d_attr = d_attr; return PARSE_ERROR_NONE; } static enum parser_error parse_flavor_d(struct parser *p) { struct flavor *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->text = string_append(f->text, parser_getstr(p, "desc")); return PARSE_ERROR_NONE; } struct parser *init_parse_flavor(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index sym tval ?sym sval", parse_flavor_n); parser_reg(p, "G char glyph sym attr", parse_flavor_g); parser_reg(p, "D str desc", parse_flavor_d); return p; } static errr run_parse_flavor(struct parser *p) { return parse_file(p, "flavor"); } static errr finish_parse_flavor(struct parser *p) { flavors = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_flavor(void) { struct flavor *f, *next; f = flavors; while(f) { next = f->next; /* Hack - scrolls get randomly-generated names */ if (f->tval != TV_SCROLL) mem_free(f->text); mem_free(f); f = next; } } struct file_parser flavor_parser = { "flavor", init_parse_flavor, run_parse_flavor, finish_parse_flavor, cleanup_flavor }; /* Parsing functions for spell.txt */ static enum parser_error parse_s_n(struct parser *p) { struct spell *s = mem_zalloc(sizeof *s); s->next = parser_priv(p); s->sidx = parser_getuint(p, "index"); s->name = string_make(parser_getstr(p, "name")); parser_setpriv(p, s); return PARSE_ERROR_NONE; } static enum parser_error parse_s_i(struct parser *p) { struct spell *s = parser_priv(p); if (!s) return PARSE_ERROR_MISSING_RECORD_HEADER; s->tval = parser_getuint(p, "tval"); s->sval = parser_getuint(p, "sval"); s->snum = parser_getuint(p, "snum"); /* XXX elly: postprocess instead? */ s->realm = s->tval - TV_MAGIC_BOOK; s->spell_index = s->sidx - (s->realm * PY_MAX_SPELLS); return PARSE_ERROR_NONE; } static enum parser_error parse_s_d(struct parser *p) { struct spell *s = parser_priv(p); if (!s) return PARSE_ERROR_MISSING_RECORD_HEADER; s->text = string_append(s->text, parser_getstr(p, "desc")); return PARSE_ERROR_NONE; } struct parser *init_parse_s(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index str name", parse_s_n); parser_reg(p, "I uint tval uint sval uint snum", parse_s_i); parser_reg(p, "D str desc", parse_s_d); return p; } static errr run_parse_s(struct parser *p) { return parse_file(p, "spell"); } static errr finish_parse_s(struct parser *p) { struct spell *s, *n, *ss; struct object_kind *k; s_info = mem_zalloc(z_info->s_max * sizeof(*s_info)); for (s = parser_priv(p); s; s = n) { n = s->next; if (s->sidx >= z_info->s_max) continue; ss = &s_info[s->sidx]; memcpy(ss, s, sizeof(*s)); k = objkind_get(s->tval, s->sval); if (k) { ss->next = k->spells; k->spells = ss; } mem_free(s); } parser_destroy(p); return 0; } static void cleanup_s(void) { int idx; for (idx = 0; idx < z_info->s_max; idx++) { string_free(s_info[idx].name); mem_free(s_info[idx].text); } mem_free(s_info); } static struct file_parser s_parser = { "spell", init_parse_s, run_parse_s, finish_parse_s, cleanup_s }; /* Initialise hints */ static enum parser_error parse_hint(struct parser *p) { struct hint *h = parser_priv(p); struct hint *new = mem_zalloc(sizeof *new); new->hint = string_make(parser_getstr(p, "text")); new->next = h; parser_setpriv(p, new); return PARSE_ERROR_NONE; } struct parser *init_parse_hints(void) { struct parser *p = parser_new(); parser_reg(p, "H str text", parse_hint); return p; } static errr run_parse_hints(struct parser *p) { return parse_file(p, "hints"); } static errr finish_parse_hints(struct parser *p) { hints = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_hints(void) { struct hint *h, *next; h = hints; while(h) { next = h->next; string_free(h->hint); mem_free(h); h = next; } } static struct file_parser hints_parser = { "hints", init_parse_hints, run_parse_hints, finish_parse_hints, cleanup_hints }; /* Initialise monster pain messages */ static enum parser_error parse_mp_n(struct parser *p) { struct monster_pain *h = parser_priv(p); struct monster_pain *mp = mem_zalloc(sizeof *mp); mp->next = h; mp->pain_idx = parser_getuint(p, "index"); parser_setpriv(p, mp); return PARSE_ERROR_NONE; } static enum parser_error parse_mp_m(struct parser *p) { struct monster_pain *mp = parser_priv(p); int i; if (!mp) return PARSE_ERROR_MISSING_RECORD_HEADER; for (i = 0; i < 7; i++) if (!mp->messages[i]) break; if (i == 7) return PARSE_ERROR_TOO_MANY_ENTRIES; mp->messages[i] = string_make(parser_getstr(p, "message")); return PARSE_ERROR_NONE; } struct parser *init_parse_mp(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index", parse_mp_n); parser_reg(p, "M str message", parse_mp_m); return p; } static errr run_parse_mp(struct parser *p) { return parse_file(p, "pain"); } static errr finish_parse_mp(struct parser *p) { struct monster_pain *mp, *n; pain_messages = mem_zalloc(sizeof(*mp) * z_info->mp_max); for (mp = parser_priv(p); mp; mp = mp->next) { if (mp->pain_idx >= z_info->mp_max) continue; memcpy(&pain_messages[mp->pain_idx], mp, sizeof(*mp)); } mp = parser_priv(p); while (mp) { n = mp->next; mem_free(mp); mp = n; } parser_destroy(p); return 0; } static void cleanup_mp(void) { int idx, i; for (idx = 0; idx < z_info->mp_max; idx++) { for (i = 0; i < 7; i++) { string_free((char *)pain_messages[idx].messages[i]); } } mem_free(pain_messages); } struct file_parser mp_parser = { "pain messages", init_parse_mp, run_parse_mp, finish_parse_mp, cleanup_mp }; /* * Initialize monster pits */ static enum parser_error parse_pit_n(struct parser *p) { struct pit_profile *h = parser_priv(p); struct pit_profile *pit = mem_zalloc(sizeof *pit); pit->next = h; pit->pit_idx = parser_getuint(p, "index"); pit->name = string_make(parser_getstr(p, "name")); parser_setpriv(p, pit); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_r(struct parser *p) { struct pit_profile *pit = parser_priv(p); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; pit->room_type = parser_getuint(p, "type"); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_a(struct parser *p) { struct pit_profile *pit = parser_priv(p); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; pit->rarity = parser_getuint(p, "rarity"); pit->ave = parser_getuint(p, "level"); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_o(struct parser *p) { struct pit_profile *pit = parser_priv(p); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; pit->obj_rarity = parser_getuint(p, "obj_rarity"); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_t(struct parser *p) { struct pit_profile *pit = parser_priv(p); monster_base *base = lookup_monster_base(parser_getsym(p, "base")); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; else if (pit->n_bases == MAX_RVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; else if (!base) return PARSE_ERROR_UNRECOGNISED_TVAL; else { pit->base[pit->n_bases++] = base; return PARSE_ERROR_NONE; } } static enum parser_error parse_pit_f(struct parser *p) { struct pit_profile *pit = parser_priv(p); char *flags; char *s; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(pit->flags, RF_SIZE, r_info_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_s(struct parser *p) { struct pit_profile *pit = parser_priv(p); char *flags; char *s; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "spells")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "spells")); s = strtok(flags, " |"); while (s) { if (grab_flag(pit->spell_flags, RSF_SIZE, r_info_spell_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_s2(struct parser *p) { struct pit_profile *pit = parser_priv(p); char *flags; char *s; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "spells")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "spells")); s = strtok(flags, " |"); while (s) { if (grab_flag(pit->forbidden_spell_flags, RSF_SIZE, r_info_spell_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } struct parser *init_parse_pit(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index str name", parse_pit_n); parser_reg(p, "R uint type", parse_pit_r); parser_reg(p, "A uint rarity uint level", parse_pit_a); parser_reg(p, "O uint obj_rarity", parse_pit_o); parser_reg(p, "T sym base", parse_pit_t); parser_reg(p, "F ?str flags", parse_pit_f); parser_reg(p, "S ?str spells", parse_pit_s); parser_reg(p, "s ?str spells", parse_pit_s2); return p; } static errr run_parse_pit(struct parser *p) { return parse_file(p, "pit"); } static errr finish_parse_pit(struct parser *p) { struct pit_profile *pit, *n; pit_info = mem_zalloc(sizeof(*pit) * z_info->pit_max); for (pit = parser_priv(p); pit; pit = pit->next) { if (pit->pit_idx >= z_info->pit_max) continue; memcpy(&pit_info[pit->pit_idx], pit, sizeof(*pit)); } pit = parser_priv(p); while (pit) { n = pit->next; mem_free(pit); pit = n; } parser_destroy(p); return 0; } static void cleanup_pits(void) { int idx; for (idx = 0; idx < z_info->pit_max; idx++) { string_free((char *)pit_info[idx].name); } mem_free(pit_info); } struct file_parser pit_parser = { "pits", init_parse_pit, run_parse_pit, finish_parse_pit, cleanup_pits }; /* * Initialize some other arrays */ static errr init_other(void) { int i; /*** Prepare the various "bizarre" arrays ***/ /* Initialize the "quark" package */ (void)quarks_init(); /* Initialize squelch things */ squelch_init(); textui_knowledge_init(); /* Initialize the "message" package */ (void)messages_init(); /*** Prepare grid arrays ***/ /* Array of grids */ temp_g = C_ZNEW(TEMP_MAX, u16b); cave = cave_new(); /* Array of stacked monster messages */ mon_msg = C_ZNEW(MAX_STORED_MON_MSG, monster_race_message); mon_message_hist = C_ZNEW(MAX_STORED_MON_CODES, monster_message_history); /*** Prepare "vinfo" array ***/ /* Used by "update_view()" */ (void)vinfo_init(); /*** Prepare entity arrays ***/ /* Objects */ objects_init(); /*** Prepare lore array ***/ /* Lore */ l_list = C_ZNEW(z_info->r_max, monster_lore); /*** Prepare mouse buttons ***/ button_init(button_add_text, button_kill_text); /*** Prepare quest array ***/ /* Quests */ q_list = C_ZNEW(MAX_Q_IDX, quest); /*** Prepare the inventory ***/ /* Allocate it */ p_ptr->inventory = C_ZNEW(ALL_INVEN_TOTAL, object_type); /*** Prepare the options ***/ option_set_defaults(); /* Initialize the window flags */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { /* Assume no flags */ op_ptr->window_flag[i] = 0L; } /*** Pre-allocate space for the "format()" buffer ***/ /* Hack -- Just call the "format()" function */ (void)format("I wish you could swim, like dolphins can swim..."); /* Success */ return (0); } /* * Initialize some other arrays */ static errr init_alloc(void) { int i; monster_race *r_ptr; ego_item_type *e_ptr; alloc_entry *table; s16b num[MAX_DEPTH]; s16b aux[MAX_DEPTH]; /*** Initialize object allocation info ***/ init_obj_alloc(); /*** Analyze monster allocation info ***/ /* Clear the "aux" array */ (void)C_WIPE(aux, MAX_DEPTH, s16b); /* Clear the "num" array */ (void)C_WIPE(num, MAX_DEPTH, s16b); /* Size of "alloc_race_table" */ alloc_race_size = 0; /* Scan the monsters (not the ghost) */ for (i = 1; i < z_info->r_max - 1; i++) { /* Get the i'th race */ r_ptr = &r_info[i]; /* Legal monsters */ if (r_ptr->rarity) { /* Count the entries */ alloc_race_size++; /* Group by level */ num[r_ptr->level]++; } } /* Collect the level indexes */ for (i = 1; i < MAX_DEPTH; i++) { /* Group by level */ num[i] += num[i-1]; } /* Paranoia */ if (!num[0]) quit("No town monsters!"); /*** Initialize monster allocation info ***/ /* Allocate the alloc_race_table */ alloc_race_table = C_ZNEW(alloc_race_size, alloc_entry); /* Get the table entry */ table = alloc_race_table; /* Scan the monsters (not the ghost) */ for (i = 1; i < z_info->r_max - 1; i++) { /* Get the i'th race */ r_ptr = &r_info[i]; /* Count valid pairs */ if (r_ptr->rarity) { int p, x, y, z; /* Extract the base level */ x = r_ptr->level; /* Extract the base probability */ p = (100 / r_ptr->rarity); /* Skip entries preceding our locale */ y = (x > 0) ? num[x-1] : 0; /* Skip previous entries at this locale */ z = y + aux[x]; /* Load the entry */ table[z].index = i; table[z].level = x; table[z].prob1 = p; table[z].prob2 = p; table[z].prob3 = p; /* Another entry complete for this locale */ aux[x]++; } } /*** Analyze ego_item allocation info ***/ /* Clear the "aux" array */ (void)C_WIPE(aux, MAX_DEPTH, s16b); /* Clear the "num" array */ (void)C_WIPE(num, MAX_DEPTH, s16b); /* Size of "alloc_ego_table" */ alloc_ego_size = 0; /* Scan the ego items */ for (i = 1; i < z_info->e_max; i++) { /* Get the i'th ego item */ e_ptr = &e_info[i]; /* Legal items */ if (e_ptr->rarity) { /* Count the entries */ alloc_ego_size++; /* Group by level */ num[e_ptr->level]++; } } /* Collect the level indexes */ for (i = 1; i < MAX_DEPTH; i++) { /* Group by level */ num[i] += num[i-1]; } /*** Initialize ego-item allocation info ***/ /* Allocate the alloc_ego_table */ alloc_ego_table = C_ZNEW(alloc_ego_size, alloc_entry); /* Get the table entry */ table = alloc_ego_table; /* Scan the ego-items */ for (i = 1; i < z_info->e_max; i++) { /* Get the i'th ego item */ e_ptr = &e_info[i]; /* Count valid pairs */ if (e_ptr->rarity) { int p, x, y, z; /* Extract the base level */ x = e_ptr->level; /* Extract the base probability */ p = (100 / e_ptr->rarity); /* Skip entries preceding our locale */ y = (x > 0) ? num[x-1] : 0; /* Skip previous entries at this locale */ z = y + aux[x]; /* Load the entry */ table[z].index = i; table[z].level = x; table[z].prob1 = p; table[z].prob2 = p; table[z].prob3 = p; /* Another entry complete for this locale */ aux[x]++; } } /* Success */ return (0); } /* * Initialise just the internal arrays. * This should be callable by the test suite, without relying on input, or * anything to do with a user or savefiles. * * Assumption: Paths are set up correctly before calling this function. */ void init_arrays(void) { /* Initialize size info */ event_signal_string(EVENT_INITSTATUS, "Initializing array sizes..."); if (run_parser(&z_parser)) quit("Cannot initialize sizes"); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (features)"); if (run_parser(&f_parser)) quit("Cannot initialize features"); /* Initialize object base info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (object bases)"); if (run_parser(&kb_parser)) quit("Cannot initialize object bases"); /* Initialize object info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (objects)"); if (run_parser(&k_parser)) quit("Cannot initialize objects"); /* Initialize ego-item info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (ego-items)"); if (run_parser(&e_parser)) quit("Cannot initialize ego-items"); /* Initialize artifact info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (artifacts)"); if (run_parser(&a_parser)) quit("Cannot initialize artifacts"); /* Initialize monster pain messages */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (pain messages)"); if (run_parser(&mp_parser)) quit("Cannot initialize monster pain messages"); /* Initialize monster-base info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monster bases)"); if (run_parser(&rb_parser)) quit("Cannot initialize monster bases"); /* Initialize monster info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monsters)"); if (run_parser(&r_parser)) quit("Cannot initialize monsters"); /* Initialize monster pits */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monster pits)"); if (run_parser(&pit_parser)) quit("Cannot initialize monster pits"); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (vaults)"); if (run_parser(&v_parser)) quit("Cannot initialize vaults"); /* Initialize history info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (histories)"); if (run_parser(&h_parser)) quit("Cannot initialize histories"); /* Initialize race info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (races)"); if (run_parser(&p_parser)) quit("Cannot initialize races"); /* Initialize class info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (classes)"); if (run_parser(&c_parser)) quit("Cannot initialize classes"); /* Initialize flavor info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (flavors)"); if (run_parser(&flavor_parser)) quit("Cannot initialize flavors"); /* Initialize spell info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spells)"); if (run_parser(&s_parser)) quit("Cannot initialize spells"); /* Initialize hint text */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (hints)"); if (run_parser(&hints_parser)) quit("Cannot initialize hints"); /* Initialise store stocking data */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (store stocks)"); store_init(); /* Initialise random name data */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (random names)"); if (run_parser(&names_parser)) quit("Can't parse names"); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (other)"); if (init_other()) quit("Cannot initialize other stuff"); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (alloc)"); if (init_alloc()) quit("Cannot initialize alloc stuff"); } /* * Hack -- main Angband initialization entry point * * Verify some files, display the "news.txt" file, create * the high score file, initialize all internal arrays, and * load the basic "user pref files". * * Be very careful to keep track of the order in which things * are initialized, in particular, the only thing *known* to * be available when this function is called is the "z-term.c" * package, and that may not be fully initialized until the * end of this function, when the default "user pref files" * are loaded and "Term_xtra(TERM_XTRA_REACT,0)" is called. * * Note that this function attempts to verify the "news" file, * and the game aborts (cleanly) on failure, since without the * "news" file, it is likely that the "lib" folder has not been * correctly located. Otherwise, the news file is displayed for * the user. * * Note that this function attempts to verify (or create) the * "high score" file, and the game aborts (cleanly) on failure, * since one of the most common "extraction" failures involves * failing to extract all sub-directories (even empty ones), such * as by failing to use the "-d" option of "pkunzip", or failing * to use the "save empty directories" option with "Compact Pro". * This error will often be caught by the "high score" creation * code below, since the "lib/apex" directory, being empty in the * standard distributions, is most likely to be "lost", making it * impossible to create the high score file. * * Note that various things are initialized by this function, * including everything that was once done by "init_some_arrays". * * This initialization involves the parsing of special files * in the "lib/edit" directories. * * Note that the "template" files are initialized first, since they * often contain errors. This means that macros and message recall * and things like that are not available until after they are done. * * We load the default "user pref files" here in case any "color" * changes are needed before character creation. * * Note that the "graf-xxx.prf" file must be loaded separately, * if needed, in the first (?) pass through "TERM_XTRA_REACT". */ bool init_angband(void) { event_signal(EVENT_ENTER_INIT); /*** Initialize some arrays ***/ init_arrays(); /*** Load default user pref files ***/ /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Loading basic user pref file..."); /* Process that file */ (void)process_pref_file("pref.prf", FALSE, FALSE); /* Done */ event_signal_string(EVENT_INITSTATUS, "Initialization complete"); /* Sneakily init command list */ cmd_init(); #ifdef ALLOW_BORG /* apw */ /* Allow the screensaver to do its work */ if (screensaver) { event_signal(EVENT_LEAVE_INIT); return !file_exists(savefile); } #endif /* ALLOW_BORG */ /* Ask for a "command" until we get one we like. */ while (1) { game_command *command_req; int failed = cmd_get(CMD_INIT, &command_req, TRUE); if (failed) continue; else if (command_req->command == CMD_QUIT) quit(NULL); else if (command_req->command == CMD_NEWGAME) { event_signal(EVENT_LEAVE_INIT); return TRUE; } else if (command_req->command == CMD_LOADFILE) { event_signal(EVENT_LEAVE_INIT); return FALSE; } } } void cleanup_angband(void) { /* Free the macros */ keymap_free(); /* Free the allocation tables */ free_obj_alloc(); FREE(alloc_ego_table); FREE(alloc_race_table); event_remove_all_handlers(); /* Free the stores */ if (stores) free_stores(); /* Free the quest list */ FREE(q_list); button_free(); FREE(p_ptr->inventory); /* Free the lore, monster, and object lists */ FREE(l_list); objects_destroy(); /* Free the temp array */ FREE(temp_g); cave_free(cave); /* Free the stacked monster messages */ FREE(mon_msg); FREE(mon_message_hist); /* Free the messages */ messages_free(); /* Free the history */ history_clear(); /* Free the "quarks" */ quarks_free(); cleanup_parser(&k_parser); cleanup_parser(&kb_parser); cleanup_parser(&a_parser); cleanup_parser(&names_parser); cleanup_parser(&r_parser); cleanup_parser(&rb_parser); cleanup_parser(&f_parser); cleanup_parser(&e_parser); cleanup_parser(&p_parser); cleanup_parser(&c_parser); cleanup_parser(&v_parser); cleanup_parser(&h_parser); cleanup_parser(&flavor_parser); cleanup_parser(&s_parser); cleanup_parser(&hints_parser); cleanup_parser(&mp_parser); cleanup_parser(&pit_parser); cleanup_parser(&z_parser); /* Free the format() buffer */ vformat_kill(); /* Free the directories */ string_free(ANGBAND_DIR_APEX); string_free(ANGBAND_DIR_EDIT); string_free(ANGBAND_DIR_FILE); string_free(ANGBAND_DIR_HELP); string_free(ANGBAND_DIR_INFO); string_free(ANGBAND_DIR_SAVE); string_free(ANGBAND_DIR_PREF); string_free(ANGBAND_DIR_USER); string_free(ANGBAND_DIR_XTRA); string_free(ANGBAND_DIR_XTRA_FONT); string_free(ANGBAND_DIR_XTRA_GRAF); string_free(ANGBAND_DIR_XTRA_SOUND); string_free(ANGBAND_DIR_XTRA_ICON); } angband-v3.3.2/src/game-cmd.h0000644000175000017500000001114511651552410015223 0ustar chriscchrisc#ifndef INCLUDED_GAME_CMD_H #define INCLUDED_GAME_CMD_H /* * All valid game commands. Not all implemented yet. */ typedef enum cmd_code { CMD_NULL = 0, /* A "do nothing" command so that there's something UIs can use as a "no command yet" sentinel. */ /* * Splash screen commands */ CMD_LOADFILE, CMD_NEWGAME, /* * Birth commands */ CMD_BIRTH_RESET, CMD_CHOOSE_SEX, CMD_CHOOSE_RACE, CMD_CHOOSE_CLASS, CMD_FINALIZE_OPTIONS, CMD_BUY_STAT, CMD_SELL_STAT, CMD_RESET_STATS, CMD_ROLL_STATS, CMD_PREV_STATS, CMD_NAME_CHOICE, CMD_ACCEPT_CHARACTER, /* * The main game commands */ CMD_GO_UP, CMD_GO_DOWN, CMD_SEARCH, CMD_TOGGLE_SEARCH, CMD_WALK, CMD_JUMP, CMD_PATHFIND, CMD_INSCRIBE, CMD_UNINSCRIBE, CMD_TAKEOFF, CMD_WIELD, CMD_DROP, CMD_BROWSE_SPELL, CMD_STUDY_SPELL, CMD_STUDY_BOOK, CMD_CAST, /* Casting a spell /or/ praying. */ CMD_USE_STAFF, CMD_USE_WAND, CMD_USE_ROD, CMD_ACTIVATE, CMD_EAT, CMD_QUAFF, CMD_READ_SCROLL, CMD_REFILL, CMD_FIRE, CMD_THROW, CMD_PICKUP, CMD_AUTOPICKUP, CMD_DESTROY, /* CMD_SQUELCH_TYPE, -- might be a command, might have another interface */ CMD_DISARM, CMD_REST, /* CMD_TARGET, -- possibly should be a UI-level thing */ CMD_TUNNEL, CMD_OPEN, CMD_CLOSE, CMD_JAM, CMD_BASH, CMD_RUN, CMD_HOLD, CMD_ENTER_STORE, CMD_ALTER, /* Store commands */ CMD_SELL, CMD_BUY, CMD_STASH, CMD_RETRIEVE, /* Hors categorie Commands */ CMD_SUICIDE, CMD_SAVE, /* CMD_OPTIONS, -- probably won't be a command in this sense*/ CMD_QUIT, CMD_HELP, CMD_REPEAT } cmd_code; typedef enum cmd_context { CMD_INIT, CMD_BIRTH, CMD_GAME, CMD_STORE, CMD_DEATH } cmd_context; enum { DIR_UNKNOWN = 0, DIR_NW = 1, DIR_N = 2, DIR_NE = 3, DIR_W = 4, DIR_TARGET = 5, DIR_NONE = 5, DIR_E = 6, DIR_SW = 7, DIR_S = 8, DIR_SE = 9, }; typedef union { const char *string; int choice; int item; int number; int direction; struct { int x, y; } point; } cmd_arg; /* Maximum number of arguments a command needs to take. */ #define CMD_MAX_ARGS 2 enum cmd_arg_type { arg_NONE = 0, arg_STRING = 0x01, arg_CHOICE = 0x02, arg_NUMBER = 0x04, arg_ITEM = 0x08, arg_DIRECTION = 0x10, arg_TARGET = 0x20, arg_POINT = 0x40 }; /* * The game_command type is used to return details of the command the * game should carry out. * * 'command' should always have a valid cmd_code value, the other entries * may or may not be significant depending on the command being returned. * * NOTE: This is prone to change quite a bit while things are shaken out. */ typedef struct game_command { /* A valid command code. */ cmd_code command; /* Number of times to attempt to repeat command. */ int nrepeats; /* Arguments to the command */ cmd_arg arg[CMD_MAX_ARGS]; /* Whether an argument was passed or not */ bool arg_present[CMD_MAX_ARGS]; /* Types of the arguments passed */ enum cmd_arg_type arg_type[CMD_MAX_ARGS]; } game_command; /** * Returns the top command on the queue. */ game_command *cmd_get_top(void); /* * A function called by the game to get a command from the UI. */ extern errr (*cmd_get_hook)(cmd_context c, bool wait); /* Inserts a command in the queue to be carried out. */ errr cmd_insert_s(game_command *cmd); /* * Convenience functions. * Insert a command with params in the queue to be carried out. */ errr cmd_insert_repeated(cmd_code c, int nrepeats); errr cmd_insert(cmd_code c); /** * Set the args of a command. */ void cmd_set_arg_choice(game_command *cmd, int n, int choice); void cmd_set_arg_string(game_command *cmd, int n, const char *str); void cmd_set_arg_direction(game_command *cmd, int n, int dir); void cmd_set_arg_target(game_command *cmd, int n, int target); void cmd_set_arg_point(game_command *cmd, int n, int x, int y); void cmd_set_arg_item(game_command *cmd, int n, int item); void cmd_set_arg_number(game_command *cmd, int n, int num); /* * Gets the next command from the queue, optionally waiting to allow * the UI time to process user input, etc. if wait is TRUE */ errr cmd_get(cmd_context c, game_command **cmd, bool wait); /* Called by the game engine to get the player's next action. */ void process_command(cmd_context c, bool no_request); /* Remove any pending repeats from the current command. */ void cmd_cancel_repeat(void); /* Update the number of repeats pending for the current command. */ void cmd_set_repeat(int nrepeats); /* * Call to disallow the current command from being repeated with the * "Repeat last command" command. */ void cmd_disable_repeat(void); /* * Returns the number of repeats left for the current command. * i.e. zero if not repeating. */ int cmd_get_nrepeats(void); #endif angband-v3.3.2/src/z-queue.h0000644000175000017500000000105511651552410015143 0ustar chriscchrisc#ifndef INCLUDED_Z_QUEUE_H #define INCLUDED_Z_QUEUE_H #include struct queue { uintptr_t *data; size_t size; int head; int tail; }; struct queue *q_new(size_t size); int q_len(struct queue *q); void q_push(struct queue *q, uintptr_t item); uintptr_t q_pop(struct queue *q); void q_free(struct queue *q); #define q_push_ptr(q, ptr) q_push((q), (uintptr_t)(ptr)) #define q_pop_ptr(q) (void *)q_pop((q)) #define q_push_int(q, i) q_push((q), (uintptr_t)(i)) #define q_pop_int(q) (int)q_pop((q)) #endif /* INCLUDED_Z_QUEUE_H */ angband-v3.3.2/src/Makefile.nds0000644000175000017500000001410011651552410015615 0ustar chriscchrisc#------------------------------------------------------------------------------ .SUFFIXES: #------------------------------------------------------------------------------ ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM) endif include $(DEVKITARM)/ds_rules include Makefile.src #------------------------------------------------------------------------------ # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files #------------------------------------------------------------------------------ TARGET := $(NAME) #NRM BUILD := build #NRM SOURCES := gfx source data #NRM INCLUDES := include build #------------------------------------------------------------------------------ # options for code generation #------------------------------------------------------------------------------ #NRM ARCH := -mthumb -mthumb-interwork # note: arm9tdmi isn't the correct CPU arch, but anything newer and LD # *insists* it has a FPU or VFP, and it won't take no for an answer! CFLAGS := -g -Wall -O2\ -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\ -ffast-math \ $(ARCH) CFLAGS += $(INCLUDE) -DARM9 #NRM CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions ASFLAGS := -g $(ARCH) #NRM LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -mno-fpu -Wl,-Map,$(notdir $*.map) LDFLAGS = -g $(ARCH) #------------------------------------------------------------------------------ # any extra libraries we wish to link with the project #------------------------------------------------------------------------------ #NRM LIBS := -lnds9 LIBS := #------------------------------------------------------------------------------ # list of directories containing libraries, this must be the top level # containing include and lib #------------------------------------------------------------------------------ LIBDIRS := $(LIBNDS) #------------------------------------------------------------------------------ # no real need to edit anything past this point unless you need to add # additional rules for different file extensions #------------------------------------------------------------------------------ #NRM ifneq ($(BUILD),$(notdir $(CURDIR))) #------------------------------------------------------------------------------ #NRM export OUTPUT := $(CURDIR)/$(TARGET) #NRM export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/.deps #NRM CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) #NRM CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) #NRM SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) #NRM BINFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.bin))) #------------------------------------------------------------------------------ # use CXX for linking C++ projects, CC for standard C #------------------------------------------------------------------------------ #NRM ifeq ($(strip $(CPPFILES)),) #------------------------------------------------------------------------------ #NRM export LD := $(CC) #------------------------------------------------------------------------------ #NRM else #------------------------------------------------------------------------------ #NRM export LD := $(CXX) #------------------------------------------------------------------------------ #NRM endif #------------------------------------------------------------------------------ # include Makefile.inc #NRM export OFILES := $(BINFILES:.bin=.o) $(CPPFILES:.cpp=.o) \ #NRM $(CFILES:.c=.o) $(SFILES:.s=.o) #NRM export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ #NRM $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ #NRM $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ #NRM -I$(CURDIR)/$(BUILD) #NRM export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) #NRM .PHONY: $(BUILD) clean #------------------------------------------------------------------------------ #NRM $(BUILD): #NRM @[ -d $@ ] || mkdir -p $@ #NRM @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile #------------------------------------------------------------------------------ #NRM else DEPENDS := $(BASEOBJS:.o=$(CURDIR)/.d) #------------------------------------------------------------------------------ # main targets #------------------------------------------------------------------------------ #NRM $(TARGET).nds : $(TARGET).arm9 #NRM $(TARGET).arm9 : $(TARGET).elf #NRM $(TARGET).elf : $(BASEOBJS) #------------------------------------------------------------------------------ $(TARGET).nds : $(TARGET).arm7 $(TARGET).arm9 ndstool -c $(TARGET).nds -7 $(TARGET).arm7 -9 $(TARGET).arm9 #------------------------------------------------------------------------------ $(TARGET).arm7 : $(TARGET).arm7.elf @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) $(TARGET).arm9 : $(TARGET).arm9.elf @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) #------------------------------------------------------------------------------ $(TARGET).arm7.elf: @[ -d build ] || mkdir build $(MAKE) -f nds/Makefile.arm7 all #------------------------------------------------------------------------------ $(TARGET).arm9.elf: @[ -d build ] || mkdir build # sh -c "unset CC; [ -f src/tile.c ] || make -C util ../src/tile.c" @echo hello $(MAKE) -f nds/Makefile.arm9 all #-------------------------------------------------------------------------------#NRM %.o : %.bin #------------------------------------------------------------------------------ #NRM @echo $(notdir $<) #NRM $(bin2o) -include $(DEPENDS) #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ clean: @echo clean ... @rm -fr *.o $(TARGET).* #------------------------------------------------------------------------------ #NRM endif #------------------------------------------------------------------------------ angband-v3.3.2/src/squelch.h0000644000175000017500000000406111651552410015214 0ustar chriscchrisc#ifndef SQUELCH_H #define SQUELCH_H /* * Used for mapping the values below to names. */ typedef struct { int enum_val; const char *name; } quality_name_struct; /* * List of kinds of item, for pseudo-id squelch. */ typedef enum { TYPE_WEAPON_POINTY, TYPE_WEAPON_BLUNT, TYPE_SHOOTER, TYPE_MISSILE_SLING, TYPE_MISSILE_BOW, TYPE_MISSILE_XBOW, TYPE_ARMOR_ROBE, TYPE_ARMOR_BODY, TYPE_ARMOR_CLOAK, TYPE_ARMOR_ELVEN_CLOAK, TYPE_ARMOR_SHIELD, TYPE_ARMOR_HEAD, TYPE_ARMOR_HANDS, TYPE_ARMOR_FEET, TYPE_DIGGER, TYPE_RING, TYPE_AMULET, TYPE_LIGHT, TYPE_MAX } squelch_type_t; /* * The different kinds of quality squelch */ enum { SQUELCH_NONE, SQUELCH_BAD, SQUELCH_AVERAGE, SQUELCH_GOOD, SQUELCH_EXCELLENT_NO_HI, SQUELCH_EXCELLENT_NO_SPL, SQUELCH_ALL, SQUELCH_MAX }; /* * Squelch flags */ #define SQUELCH_IF_AWARE 0x01 #define SQUELCH_IF_UNAWARE 0x02 extern quality_name_struct quality_values[SQUELCH_MAX]; extern quality_name_struct quality_choices[TYPE_MAX]; /* squelch.c */ void squelch_init(void); void squelch_birth_init(void); const char *get_autoinscription(object_kind *kind); int apply_autoinscription(object_type *o_ptr); int remove_autoinscription(s16b kind); int add_autoinscription(s16b kind, const char *inscription); void autoinscribe_ground(void); void autoinscribe_pack(void); bool squelch_tval(int tval); void kind_squelch_clear(object_kind *k_ptr); bool kind_is_squelched_aware(const object_kind *k_ptr); bool kind_is_squelched_unaware(const object_kind *k_ptr); void kind_squelch_when_aware(object_kind *k_ptr); void kind_squelch_when_unaware(object_kind *k_ptr); bool squelch_item_ok(const object_type *o_ptr); bool squelch_hide_item(object_type *o_ptr); void squelch_drop(void); void do_cmd_options_item(const char *title, int row); bool squelch_interactive(const object_type *o_ptr); byte squelch_level_of(const object_type *o_ptr); squelch_type_t squelch_type_of(const object_type *o_ptr); void object_squelch_flavor_of(const object_type *o_ptr); extern byte squelch_level[]; extern const size_t squelch_size; #endif /* !SQUELCH_H */ angband-v3.3.2/src/wizard.c0000644000175000017500000012435211651552410015051 0ustar chriscchrisc/* * File: wizard2.c * Purpose: Debug mode commands * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "files.h" #include "monster/mon-lore.h" #include "monster/mon-make.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "ui-event.h" #include "ui-menu.h" #include "spells.h" #include "target.h" #include "wizard.h" #include "z-term.h" #ifdef ALLOW_DEBUG static void gf_display(menu_type *m, int type, bool cursor, int row, int col, int wid) { size_t i; byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; const char *gf_name = gf_idx_to_name(type); if (type % 2) c_prt(attr, ".........................", row, col); c_put_str(attr, gf_name, row, col); col += 25; if (tile_height == 1) { for (i = 0; i < BOLT_MAX; i++) { col += big_pad(col, row, gf_to_attr[type][i], gf_to_char[type][i]); } } else { prt("Change tile_height to 1 to see graphics.", row, col); } } static const menu_iter gf_iter = { NULL, /* get_tag */ NULL, /* validity */ gf_display, NULL, /* action */ NULL /* resize */ }; static void wiz_gf_demo(void) { menu_type *m = menu_new(MN_SKIN_SCROLL, &gf_iter); region loc = { 0, 0, 0, 0 }; menu_setpriv(m, GF_MAX, NULL); m->title = "GF_ types display"; menu_layout(m, &loc); screen_save(); clear_from(0); menu_select(m, 0, FALSE); screen_load(); } /* * This is a nice utility function; it determines if a (NULL-terminated) * string consists of only digits (starting with a non-zero digit). */ s16b get_idx_from_name(char *s) { char *endptr = NULL; long l = strtol(s, &endptr, 10); return *endptr == '\0' ? (s16b)l : 0; } /* * Hack -- quick debugging hook */ static void do_cmd_wiz_hack_ben(void) { int py = p_ptr->py; int px = p_ptr->px; int i, y, x; struct keypress kp; for (i = 0; i < MONSTER_FLOW_DEPTH; ++i) { /* Update map */ for (y = Term->offset_y; y < Term->offset_y + SCREEN_HGT; y++) { for (x = Term->offset_x; x < Term->offset_x + SCREEN_WID; x++) { byte a = TERM_RED; if (!in_bounds_fully(y, x)) continue; /* Display proper cost */ if (cave->cost[y][x] != i) continue; /* Reliability in yellow */ if (cave->when[y][x] == cave->when[py][px]) a = TERM_YELLOW; /* Display player/floors/walls */ if ((y == py) && (x == px)) print_rel('@', a, y, x); else if (cave_floor_bold(y, x)) print_rel('*', a, y, x); else print_rel('#', a, y, x); } } /* Prompt */ prt(format("Depth %d: ", i), 0, 0); /* Get key */ kp = inkey(); if (kp.code == ESCAPE) break; /* Redraw map */ prt_map(); } /* Done */ prt("", 0, 0); /* Redraw map */ prt_map(); } /* * Output part of a bitflag set in binary format. */ static void prt_binary(const bitflag *flags, int offset, int row, int col, char ch, int num) { int flag; /* Scan the flags */ for (flag = FLAG_START + offset; flag < FLAG_START + offset + num; flag++) { if (of_has(flags, flag)) Term_putch(col++, row, TERM_BLUE, ch); else Term_putch(col++, row, TERM_WHITE, '-'); } } /** * This ugly piece of code exists to figure out what keycodes the user has * been generating. */ static void do_cmd_keylog(void) { int i; char buf[50]; char buf2[12]; screen_save(); prt("Previous keypresses (top most recent):", 0, 0); for (i = 0; i < KEYLOG_SIZE; i++) { if (i < log_size) { /* find the keypress from our log */ int j = (log_i + i) % KEYLOG_SIZE; struct keypress k = keylog[j]; /* ugh. it would be nice if there was a verion of keypress_to_text * which took only one keypress. */ struct keypress keys[2] = {k, {EVT_NONE, 0}}; keypress_to_text(buf2, sizeof(buf2), keys, TRUE); /* format this line of output */ strnfmt(buf, sizeof(buf), " %-12s (code=%u mods=%u)", buf2, k.code, k.mods); } else { /* create a blank line of output */ strnfmt(buf, sizeof(buf), "%40s", ""); } prt(buf, i + 1, 0); } prt("Press any key to continue.", KEYLOG_SIZE + 1, 0); inkey(); screen_load(); } /* * Hack -- Teleport to the target */ static void do_cmd_wiz_bamf(void) { s16b x, y; /* Must have a target */ if (!target_okay()) return; /* Teleport to the target */ target_get(&x, &y); teleport_player_to(y, x); } /* * Aux function for "do_cmd_wiz_change()" */ static void do_cmd_wiz_change_aux(void) { int i; int tmp_int; long tmp_long; char tmp_val[160]; char ppp[80]; /* Query the stats */ for (i = 0; i < A_MAX; i++) { /* Prompt */ strnfmt(ppp, sizeof(ppp), "%s (3-118): ", stat_names[i]); /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", p_ptr->stat_max[i]); /* Query */ if (!get_string(ppp, tmp_val, 4)) return; /* Extract */ tmp_int = atoi(tmp_val); /* Verify */ if (tmp_int > 18+100) tmp_int = 18+100; else if (tmp_int < 3) tmp_int = 3; /* Save it */ p_ptr->stat_cur[i] = p_ptr->stat_max[i] = tmp_int; } /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%ld", (long)(p_ptr->au)); /* Query */ if (!get_string("Gold: ", tmp_val, 10)) return; /* Extract */ tmp_long = atol(tmp_val); /* Verify */ if (tmp_long < 0) tmp_long = 0L; /* Save */ p_ptr->au = tmp_long; /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%ld", (long)(p_ptr->exp)); /* Query */ if (!get_string("Experience: ", tmp_val, 10)) return; /* Extract */ tmp_long = atol(tmp_val); /* Verify */ if (tmp_long < 0) tmp_long = 0L; if (tmp_long > p_ptr->exp) player_exp_gain(p_ptr, tmp_long - p_ptr->exp); else player_exp_lose(p_ptr, p_ptr->exp - tmp_long, FALSE); } /* * Change various "permanent" player variables. */ static void do_cmd_wiz_change(void) { /* Interact */ do_cmd_wiz_change_aux(); /* Redraw everything */ do_cmd_redraw(); } /* * Wizard routines for creating objects and modifying them * * This has been rewritten to make the whole procedure * of debugging objects much easier and more comfortable. * * Here are the low-level functions * * - wiz_display_item() * display an item's debug-info * - wiz_create_itemtype() * specify tval and sval (type and subtype of object) * - wiz_tweak_item() * specify pval, +AC, +tohit, +todam * Note that the wizard can leave this function anytime, * thus accepting the default-values for the remaining values. * pval comes first now, since it is most important. * - wiz_reroll_item() * apply some magic to the item or turn it into an artifact. * - wiz_roll_item() * Get some statistics about the rarity of an item: * We create a lot of fake items and see if they are of the * same type (tval and sval), then we compare pval and +AC. * If the fake-item is better or equal it is counted. * Note that cursed items that are better or equal (absolute values) * are counted, too. * HINT: This is *very* useful for balancing the game! * - wiz_quantity_item() * change the quantity of an item, but be sane about it. * * And now the high-level functions * - do_cmd_wiz_play() * play with an existing object * - wiz_create_item() * create a new object * * Note -- You do not have to specify "pval" and other item-properties * directly. Just apply magic until you are satisfied with the item. * * Note -- For some items (such as wands, staffs, some rings, etc), you * must apply magic, or you will get "broken" or "uncharged" objects. * * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy * the artifact. Be careful. * * Hack -- this function will allow you to create multiple artifacts. * This "feature" may induce crashes or other nasty effects. */ /* * Display an item's properties */ static void wiz_display_item(const object_type *o_ptr, bool all) { int j = 0; bitflag f[OF_SIZE]; char buf[256]; /* Extract the flags */ if (all) object_flags(o_ptr, f); else object_flags_known(o_ptr, f); /* Clear screen */ Term_clear(); /* Describe fully */ object_desc(buf, sizeof(buf), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL); prt(buf, 2, j); prt(format("combat = (%dd%d) (%+d,%+d) [%d,%+d]", o_ptr->dd, o_ptr->ds, o_ptr->to_h, o_ptr->to_d, o_ptr->ac, o_ptr->to_a), 4, j); prt(format("kind = %-5d tval = %-5d sval = %-5d wgt = %-3d timeout = %-d", o_ptr->kind->kidx, o_ptr->tval, o_ptr->sval, o_ptr->weight, o_ptr->timeout), 5, j); /* CC: multiple pvals not shown, pending #1290 */ prt(format("number = %-3d pval = %-5d name1 = %-4d egoidx = %-4d cost = %ld", o_ptr->number, o_ptr->pval[DEFAULT_PVAL], o_ptr->artifact ? o_ptr->artifact->aidx : 0, o_ptr->ego ? o_ptr->ego->eidx : 0, (long)object_value(o_ptr, 1, FALSE)), 6, j); prt("+------------FLAGS0------------+", 8, j); prt("AFFECT..........SLAY.......BRAND", 9, j); prt(" ae xxxpaefc", 10, j); prt("siwdcc ssidsasmnvudotgddduoclio", 11, j); prt("tnieoh trnipthgiinmrrnrrmniierl", 12, j); prt("rtsxna..lcfgdkttmldncltggndsdced", 13, j); prt_binary(f, 0, 14, j, '*', 32); prt_binary(o_ptr->known_flags, 0, 15, j, '+', 32); prt("+------------FLAGS1------------+", 16, j); prt("SUST........IMM.RESIST.........", 17, j); prt(" afecaefcpfldbc s n ", 18, j); prt("siwdcc cilocliooeialoshnecd", 19, j); prt("tnieoh irelierliatrnnnrethi", 20, j); prt("rtsxna......decddcedsrekdfddxhss", 21, j); prt_binary(f, 32, 22, j, '*', 32); prt_binary(o_ptr->known_flags, 32, 23, j, '+', 32); prt("+------------FLAGS2------------+", 8, j+34); prt("s ts hn tadiiii aiehs hp", 9, j+34); prt("lf eefoo egrgggg bcnaih vr", 10, j+34); prt("we lerlf ilgannnn ltssdo ym", 11, j+34); prt("da reiedu merirrrr eityew ccc", 12, j+34); prt("itlepnele ppanaefc svaktm uuu", 13, j+34); prt("ghigavail aoveclio saanyo rrr", 14, j+34); prt("seteticf craxierl etropd sss", 15, j+34); prt("trenhste tttpdced detwes eee", 16, j+34); prt_binary(f, 64, 17, j + 34, '*', 32); prt_binary(o_ptr->known_flags, 64, 18, j + 34, '+', 32); prt("o_ptr->ident:", 20, j+34); prt(format("sense %c worn %c empty %c known %c", (o_ptr->ident & IDENT_SENSE) ? '+' : ' ', (o_ptr->ident & IDENT_WORN) ? '+' : ' ', (o_ptr->ident & IDENT_EMPTY) ? '+' : ' ', (o_ptr->ident & IDENT_KNOWN) ? '+' : ' '), 21, j+34); prt(format("store %c attack %c defence %c effect %c", (o_ptr->ident & IDENT_STORE) ? '+' : ' ', (o_ptr->ident & IDENT_ATTACK) ? '+' : ' ', (o_ptr->ident & IDENT_DEFENCE) ? '+' : ' ', (o_ptr->ident & IDENT_EFFECT) ? '+' : ' '), 22, j+34); prt(format("indest %c ego %c", (o_ptr->ident & IDENT_INDESTRUCT) ? '+' : ' ', (o_ptr->ident & IDENT_NAME) ? '+' : ' '), 23, j+34); } static const region wiz_create_item_area = { 0, 0, 0, 0 }; /** Object kind selection */ void wiz_create_item_subdisplay(menu_type *m, int oid, bool cursor, int row, int col, int width) { object_kind **choices = menu_priv(m); char buf[80]; object_kind_name(buf, sizeof buf, choices[oid], TRUE); c_prt(curs_attrs[CURS_KNOWN][0 != cursor], buf, row, col); } bool wiz_create_item_subaction(menu_type *m, const ui_event *e, int oid) { object_kind **choices = menu_priv(m); object_kind *kind = choices[oid]; object_type *i_ptr; object_type object_type_body; if (e->type != EVT_SELECT) return TRUE; /* Get local object */ i_ptr = &object_type_body; /* Create the item */ object_prep(i_ptr, kind, p_ptr->depth, RANDOMISE); /* Apply magic (no messages, no artifacts) */ apply_magic(i_ptr, p_ptr->depth, FALSE, FALSE, FALSE); /* Mark as cheat, and where created */ i_ptr->origin = ORIGIN_CHEAT; i_ptr->origin_depth = p_ptr->depth; if (kind->tval == TV_GOLD) make_gold(i_ptr, p_ptr->depth, kind->sval); /* Drop the object from heaven */ drop_near(cave, i_ptr, 0, p_ptr->py, p_ptr->px, TRUE); return FALSE; } menu_iter wiz_create_item_submenu = { NULL, NULL, wiz_create_item_subdisplay, wiz_create_item_subaction, NULL }; /** Object base kind selection **/ static void wiz_create_item_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { char buf[80]; object_base_name(buf, sizeof buf, oid, TRUE); c_prt(curs_attrs[CURS_KNOWN][0 != cursor], buf, row, col); } static bool wiz_create_item_action(menu_type *m, const ui_event *e, int oid) { ui_event ret; menu_type *menu; char buf[80]; object_kind *choice[60]; int n_choices; int i; if (e->type != EVT_SELECT) return TRUE; for (n_choices = 0, i = 1; (n_choices < 60) && (i < z_info->k_max); i++) { object_kind *kind = &k_info[i]; if (kind->tval != oid || of_has(kind->flags, OF_INSTA_ART)) continue; choice[n_choices++] = kind; } screen_save(); clear_from(0); menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_submenu); menu->selections = all_letters; object_base_name(buf, sizeof buf, oid, TRUE); menu->title = string_make(format("What kind of %s?", buf)); menu_setpriv(menu, n_choices, choice); menu_layout(menu, &wiz_create_item_area); ret = menu_select(menu, 0, FALSE); screen_load(); string_free((char *)menu->title); return (ret.type == EVT_ESCAPE); } static const menu_iter wiz_create_item_menu = { NULL, NULL, wiz_create_item_display, wiz_create_item_action, NULL }; /* * Choose and create an instance of an object kind */ static void wiz_create_item(void) { int tvals[TV_MAX]; size_t i, n; menu_type *menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_menu); menu->selections = all_letters; menu->title = "What kind of object?"; /* Make a list of all tvals for the filter */ for (i = 0, n = 0; i < TV_MAX; i++) { if (!kb_info[i].name) continue; tvals[n++] = i; } screen_save(); clear_from(0); menu_setpriv(menu, TV_MAX, kb_info); menu_set_filter(menu, tvals, n); menu_layout(menu, &wiz_create_item_area); menu_select(menu, 0, FALSE); screen_load(); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_ITEMLIST); handle_stuff(p_ptr); } /* * Tweak an item */ static void wiz_tweak_item(object_type *o_ptr) { const char *p; char tmp_val[80]; int i, val; /* Hack -- leave artifacts alone */ if (o_ptr->artifact) return; #define WIZ_TWEAK(attribute) do {\ p = "Enter new '" #attribute "' setting: ";\ strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->attribute);\ if (!get_string(p, tmp_val, 6)) return;\ o_ptr->attribute = atoi(tmp_val);\ wiz_display_item(o_ptr, TRUE);\ } while (0) for (i = 0; i < MAX_PVALS; i++) { WIZ_TWEAK(pval[i]); if (o_ptr->pval[i]) o_ptr->num_pvals = (i + 1); } WIZ_TWEAK(to_a); WIZ_TWEAK(to_h); WIZ_TWEAK(to_d); p = "Enter new ego item index: "; strnfmt(tmp_val, sizeof(tmp_val), "0"); if (o_ptr->ego) strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->ego->eidx); if (!get_string(p, tmp_val, 6)) return; val = atoi(tmp_val); if (val) { o_ptr->ego = &e_info[val]; ego_apply_magic(o_ptr, p_ptr->depth); } else o_ptr->ego = 0; wiz_display_item(o_ptr, TRUE); p = "Enter new artifact index: "; strnfmt(tmp_val, sizeof(tmp_val), "0"); if (o_ptr->artifact) strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->artifact->aidx); if (!get_string(p, tmp_val, 6)) return; val = atoi(tmp_val); if (val) { o_ptr->artifact = &a_info[val]; copy_artifact_data(o_ptr, o_ptr->artifact); } else o_ptr->artifact = 0; wiz_display_item(o_ptr, TRUE); } /* * Apply magic to an item or turn it into an artifact. -Bernd- */ static void wiz_reroll_item(object_type *o_ptr) { object_type *i_ptr; object_type object_type_body; struct keypress ch; bool changed = FALSE; /* Hack -- leave artifacts alone */ if (o_ptr->artifact) return; /* Get local object */ i_ptr = &object_type_body; /* Copy the object */ object_copy(i_ptr, o_ptr); /* Main loop. Ask for magification and artifactification */ while (TRUE) { /* Display full item debug information */ wiz_display_item(i_ptr, TRUE); /* Ask wizard what to do. */ if (!get_com("[a]ccept, [n]ormal, [g]ood, [e]xcellent? ", &ch)) break; /* Create/change it! */ if (ch.code == 'A' || ch.code == 'a') { changed = TRUE; break; } /* Apply normal magic, but first clear object */ else if (ch.code == 'n' || ch.code == 'N') { object_prep(i_ptr, o_ptr->kind, p_ptr->depth, RANDOMISE); apply_magic(i_ptr, p_ptr->depth, FALSE, FALSE, FALSE); } /* Apply good magic, but first clear object */ else if (ch.code == 'g' || ch.code == 'G') { object_prep(i_ptr, o_ptr->kind, p_ptr->depth, RANDOMISE); apply_magic(i_ptr, p_ptr->depth, FALSE, TRUE, FALSE); } /* Apply great magic, but first clear object */ else if (ch.code == 'e' || ch.code == 'E') { object_prep(i_ptr, o_ptr->kind, p_ptr->depth, RANDOMISE); apply_magic(i_ptr, p_ptr->depth, FALSE, TRUE, TRUE); } } /* Notice change */ if (changed) { /* Mark as cheat */ i_ptr->origin = ORIGIN_CHEAT; /* Restore the position information */ i_ptr->iy = o_ptr->iy; i_ptr->ix = o_ptr->ix; i_ptr->next_o_idx = o_ptr->next_o_idx; i_ptr->marked = o_ptr->marked; /* Apply changes */ object_copy(o_ptr, i_ptr); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP ); } } /* * Maximum number of rolls */ #define TEST_ROLL 100000 /* * Try to create an item again. Output some statistics. -Bernd- * * The statistics are correct now. We acquire a clean grid, and then * repeatedly place an object in this grid, copying it into an item * holder, and then deleting the object. We fiddle with the artifact * counter flags to prevent weirdness. We use the items to collect * statistics on item creation relative to the initial item. */ static void wiz_statistics(object_type *o_ptr, int level) { long i, matches, better, worse, other; int j; struct keypress ch; const char *quality; bool good, great, ismatch, isbetter, isworse; object_type *i_ptr; object_type object_type_body; const char *q = "Rolls: %ld, Matches: %ld, Better: %ld, Worse: %ld, Other: %ld"; /* Allow multiple artifacts, because breaking the game is fine here */ if (o_ptr->artifact) o_ptr->artifact->created = FALSE; /* Interact */ while (TRUE) { const char *pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? "; /* Display item */ wiz_display_item(o_ptr, TRUE); /* Get choices */ if (!get_com(pmt, &ch)) break; if (ch.code == 'n' || ch.code == 'N') { good = FALSE; great = FALSE; quality = "normal"; } else if (ch.code == 'g' || ch.code == 'G') { good = TRUE; great = FALSE; quality = "good"; } else if (ch.code == 'e' || ch.code == 'E') { good = TRUE; great = TRUE; quality = "excellent"; } else { #if 0 /* unused */ good = FALSE; great = FALSE; #endif /* unused */ break; } /* Let us know what we are doing */ msg("Creating a lot of %s items. Base level = %d.", quality, p_ptr->depth); message_flush(); /* Set counters to zero */ matches = better = worse = other = 0; /* Let's rock and roll */ for (i = 0; i <= TEST_ROLL; i++) { /* Output every few rolls */ if ((i < 100) || (i % 100 == 0)) { struct keypress kp; /* Do not wait */ inkey_scan = SCAN_INSTANT; /* Allow interupt */ kp = inkey(); if (kp.type != EVT_NONE) { flush(); break; } /* Dump the stats */ prt(format(q, i, matches, better, worse, other), 0, 0); Term_fresh(); } /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Create an object */ make_object(cave, i_ptr, level, good, great, NULL); /* Allow multiple artifacts, because breaking the game is fine here */ if (o_ptr->artifact) o_ptr->artifact->created = FALSE; /* Test for the same tval and sval. */ if ((o_ptr->tval) != (i_ptr->tval)) continue; if ((o_ptr->sval) != (i_ptr->sval)) continue; /* Check pvals */ ismatch = TRUE; for (j = 0; j < MAX_PVALS; j++) if (i_ptr->pval[j] != o_ptr->pval[j]) ismatch = FALSE; isbetter = TRUE; for (j = 0; j < MAX_PVALS; j++) if (i_ptr->pval[j] < o_ptr->pval[j]) isbetter = FALSE; isworse = TRUE; for (j = 0; j < MAX_PVALS; j++) if (i_ptr->pval[j] > o_ptr->pval[j]) isworse = FALSE; /* Check for match */ if (ismatch && (i_ptr->to_a == o_ptr->to_a) && (i_ptr->to_h == o_ptr->to_h) && (i_ptr->to_d == o_ptr->to_d) && (i_ptr->num_pvals == o_ptr->num_pvals)) { matches++; } /* Check for better */ else if (isbetter && (i_ptr->to_a >= o_ptr->to_a) && (i_ptr->to_h >= o_ptr->to_h) && (i_ptr->to_d >= o_ptr->to_d)) { better++; } /* Check for worse */ else if (isworse && (i_ptr->to_a <= o_ptr->to_a) && (i_ptr->to_h <= o_ptr->to_h) && (i_ptr->to_d <= o_ptr->to_d)) { worse++; } /* Assume different */ else { other++; } } /* Final dump */ msg(q, i, matches, better, worse, other); message_flush(); } /* Hack -- Normally only make a single artifact */ if (o_ptr->artifact) o_ptr->artifact->created = TRUE; } /* * Change the quantity of an item */ static void wiz_quantity_item(object_type *o_ptr, bool carried) { int tmp_int; char tmp_val[3]; /* Never duplicate artifacts */ if (o_ptr->artifact) return; /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->number); /* Query */ if (get_string("Quantity: ", tmp_val, 3)) { /* Extract */ tmp_int = atoi(tmp_val); /* Paranoia */ if (tmp_int < 1) tmp_int = 1; if (tmp_int > 99) tmp_int = 99; /* Adjust total weight being carried */ if (carried) { /* Remove the weight of the old number of objects */ p_ptr->total_weight -= (o_ptr->number * o_ptr->weight); /* Add the weight of the new number of objects */ p_ptr->total_weight += (tmp_int * o_ptr->weight); } /* Adjust charges/timeouts for devices */ reduce_charges(o_ptr, (o_ptr->number - tmp_int)); /* Accept modifications */ o_ptr->number = tmp_int; } } /** * Tweak the cursed status of an object. * * \param o_ptr is the object to curse or decurse */ static void wiz_tweak_curse(object_type *o_ptr) { if (cursed_p(o_ptr->flags)) { bitflag f[OF_SIZE]; msg("Resetting existing curses."); create_mask(f, FALSE, OFT_CURSE, OFT_MAX); of_diff(o_ptr->flags, f); } if (get_check("Set light curse? ")) flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, FLAG_END); else if (get_check("Set heavy curse? ")) flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, FLAG_END); else if (get_check("Set permanent curse? ")) flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, OF_PERMA_CURSE, FLAG_END); } /* * Play with an item. Options include: * - Output statistics (via wiz_roll_item) * - Reroll item (via wiz_reroll_item) * - Change properties (via wiz_tweak_item) * - Change the number of items (via wiz_quantity_item) */ static void do_cmd_wiz_play(void) { int item; object_type *i_ptr; object_type object_type_body; object_type *o_ptr; struct keypress ch; const char *q, *s; bool changed = FALSE; bool all = TRUE; /* Get an item */ q = "Play with which object? "; s = "You have nothing to play with."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; o_ptr = object_from_item_idx(item); /* Save screen */ screen_save(); /* Get local object */ i_ptr = &object_type_body; /* Copy object */ object_copy(i_ptr, o_ptr); /* The main loop */ while (TRUE) { /* Display the item */ wiz_display_item(i_ptr, all); /* Get choice */ if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [c]urse [q]uantity [k]nown? ", &ch)) break; if (ch.code == 'A' || ch.code == 'a') { changed = TRUE; break; } else if (ch.code == 'c' || ch.code == 'C') wiz_tweak_curse(i_ptr); else if (ch.code == 's' || ch.code == 'S') wiz_statistics(i_ptr, p_ptr->depth); else if (ch.code == 'r' || ch.code == 'R') wiz_reroll_item(i_ptr); else if (ch.code == 't' || ch.code == 'T') wiz_tweak_item(i_ptr); else if (ch.code == 'k' || ch.code == 'K') all = !all; else if (ch.code == 'q' || ch.code == 'Q') { bool carried = (item >= 0) ? TRUE : FALSE; wiz_quantity_item(i_ptr, carried); } } /* Load screen */ screen_load(); /* Accept change */ if (changed) { /* Message */ msg("Changes accepted."); /* Change */ object_copy(o_ptr, i_ptr); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP ); } /* Ignore change */ else { msg("Changes ignored."); } } /* * Create the artifact with the specified number */ static void wiz_create_artifact(int a_idx) { object_type *i_ptr; object_type object_type_body; object_kind *kind; artifact_type *a_ptr = &a_info[a_idx]; /* Ignore "empty" artifacts */ if (!a_ptr->name) return; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Acquire the "kind" index */ kind = lookup_kind(a_ptr->tval, a_ptr->sval); if (!kind) return; /* Create the artifact */ object_prep(i_ptr, kind, a_ptr->alloc_min, RANDOMISE); /* Save the name */ i_ptr->artifact = a_ptr; /* Extract the fields */ copy_artifact_data(i_ptr, a_ptr); /* Mark that the artifact has been created. */ a_ptr->created = TRUE; /* Mark as cheat */ i_ptr->origin = ORIGIN_CHEAT; /* Drop the artifact from heaven */ drop_near(cave, i_ptr, 0, p_ptr->py, p_ptr->px, TRUE); /* All done */ msg("Allocated."); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_ITEMLIST); handle_stuff(p_ptr); } /* * Cure everything instantly */ static void do_cmd_wiz_cure_all(void) { /* Remove curses */ (void)remove_all_curse(); /* Restore stats */ (void)res_stat(A_STR); (void)res_stat(A_INT); (void)res_stat(A_WIS); (void)res_stat(A_CON); (void)res_stat(A_DEX); (void)res_stat(A_CHR); /* Restore the level */ (void)restore_level(); /* Heal the player */ p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; /* Restore mana */ p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; /* Cure stuff */ (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_clear_timed(p_ptr, TMD_PARALYZED, TRUE); (void)player_clear_timed(p_ptr, TMD_IMAGE, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_SLOW, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); /* No longer hungry */ player_set_food(p_ptr, PY_FOOD_MAX - 1); /* Redraw everything */ do_cmd_redraw(); /* Give the player some feedback */ msg("You feel *much* better!"); } /* * Go to any level */ static void do_cmd_wiz_jump(void) { /* Ask for level */ if (p_ptr->command_arg <= 0) { char ppp[80]; char tmp_val[160]; /* Prompt */ strnfmt(ppp, sizeof(ppp), "Jump to level (0-%d): ", MAX_DEPTH-1); /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", p_ptr->depth); /* Ask for a level */ if (!get_string(ppp, tmp_val, 11)) return; /* Extract request */ p_ptr->command_arg = atoi(tmp_val); } /* Paranoia */ if (p_ptr->command_arg < 0) p_ptr->command_arg = 0; /* Paranoia */ if (p_ptr->command_arg > MAX_DEPTH - 1) p_ptr->command_arg = MAX_DEPTH - 1; /* Accept request */ msg("You jump to dungeon level %d.", p_ptr->command_arg); /* New depth */ p_ptr->depth = p_ptr->command_arg; /* Leaving */ p_ptr->leaving = TRUE; } /* * Become aware of a lot of objects */ static void do_cmd_wiz_learn(void) { int i; object_type *i_ptr; object_type object_type_body; /* Scan every object */ for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; if (!k_ptr || !k_ptr->name) continue; /* Induce awareness */ if (k_ptr->level <= p_ptr->command_arg) { /* Get local object */ i_ptr = &object_type_body; /* Prepare object */ object_prep(i_ptr, k_ptr, 0, MAXIMISE); /* Awareness */ object_flavor_aware(i_ptr); } } msg("You now know about many items!"); } /* * Hack -- Rerate Hitpoints */ static void do_cmd_rerate(void) { int min_value, max_value, i, percent; min_value = (PY_MAX_LEVEL * 3 * (p_ptr->hitdie - 1)) / 8; min_value += PY_MAX_LEVEL; max_value = (PY_MAX_LEVEL * 5 * (p_ptr->hitdie - 1)) / 8; max_value += PY_MAX_LEVEL; p_ptr->player_hp[0] = p_ptr->hitdie; /* Rerate */ while (1) { /* Collect values */ for (i = 1; i < PY_MAX_LEVEL; i++) { p_ptr->player_hp[i] = randint1(p_ptr->hitdie); p_ptr->player_hp[i] += p_ptr->player_hp[i - 1]; } /* Legal values */ if ((p_ptr->player_hp[PY_MAX_LEVEL - 1] >= min_value) && (p_ptr->player_hp[PY_MAX_LEVEL - 1] <= max_value)) break; } percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (p_ptr->hitdie + ((PY_MAX_LEVEL - 1) * p_ptr->hitdie))); /* Update and redraw hitpoints */ p_ptr->update |= (PU_HP); p_ptr->redraw |= (PR_HP); /* Handle stuff */ handle_stuff(p_ptr); /* Message */ msg("Current Life Rating is %d/100.", percent); } /* * Summon some creatures */ static void do_cmd_wiz_summon(int num) { int py = p_ptr->py; int px = p_ptr->px; int i; for (i = 0; i < num; i++) { (void)summon_specific(py, px, p_ptr->depth, 0, 1); } } /* * Summon a creature of the specified type * * This function is rather dangerous XXX XXX XXX */ static void do_cmd_wiz_named(int r_idx, bool slp) { int py = p_ptr->py; int px = p_ptr->px; int i, x, y; /* Paranoia */ if (!r_idx) return; if (r_idx >= z_info->r_max-1) return; /* Try 10 times */ for (i = 0; i < 10; i++) { int d = 1; /* Pick a location */ scatter(&y, &x, py, px, d, 0); /* Require empty grids */ if (!cave_empty_bold(y, x)) continue; /* Place it (allow groups) */ if (place_new_monster(cave, y, x, r_idx, slp, TRUE, ORIGIN_DROP_WIZARD)) break; } } /* * Hack -- Delete all nearby monsters */ static void do_cmd_wiz_zap(int d) { int i; /* Banish everyone nearby */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Skip distant monsters */ if (m_ptr->cdis > d) continue; /* Delete the monster */ delete_monster_idx(i); } /* Update monster list window */ p_ptr->redraw |= PR_MONLIST; } /* * Un-hide all monsters */ static void do_cmd_wiz_unhide(int d) { int i; /* Process monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Skip distant monsters */ if (m_ptr->cdis > d) continue; /* Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(i, FALSE); } } /* * Query the dungeon */ static void do_cmd_wiz_query(void) { int py = p_ptr->py; int px = p_ptr->px; int y, x; struct keypress cmd; u16b mask = 0x00; /* Get a "debug command" */ if (!get_com("Debug Command Query: ", &cmd)) return; /* Extract a flag */ switch (cmd.code) { case '0': mask = (1 << 0); break; case '1': mask = (1 << 1); break; case '2': mask = (1 << 2); break; case '3': mask = (1 << 3); break; case '4': mask = (1 << 4); break; case '5': mask = (1 << 5); break; case '6': mask = (1 << 6); break; case '7': mask = (1 << 7); break; case 'm': mask |= (CAVE_MARK); break; case 'g': mask |= (CAVE_GLOW); break; case 'r': mask |= (CAVE_ROOM); break; case 'i': mask |= (CAVE_ICKY); break; case 's': mask |= (CAVE_SEEN); break; case 'v': mask |= (CAVE_VIEW); break; case 't': mask |= (CAVE_TEMP); break; case 'w': mask |= (CAVE_WALL); break; } /* Scan map */ for (y = Term->offset_y; y < Term->offset_y + SCREEN_HGT; y++) { for (x = Term->offset_x; x < Term->offset_x + SCREEN_WID; x++) { byte a = TERM_RED; if (!in_bounds_fully(y, x)) continue; /* Given mask, show only those grids */ if (mask && !(cave->info[y][x] & mask)) continue; /* Given no mask, show unknown grids */ if (!mask && (cave->info[y][x] & (CAVE_MARK))) continue; /* Color */ if (cave_floor_bold(y, x)) a = TERM_YELLOW; /* Display player/floors/walls */ if ((y == py) && (x == px)) print_rel('@', a, y, x); else if (cave_floor_bold(y, x)) print_rel('*', a, y, x); else print_rel('#', a, y, x); } } /* Get keypress */ msg("Press any key."); message_flush(); /* Redraw map */ prt_map(); } /* * Create lots of items. */ static void wiz_test_kind(int tval) { int py = p_ptr->py; int px = p_ptr->px; int sval; object_type object_type_body; object_type *i_ptr = &object_type_body; for (sval = 0; sval < 255; sval++) { object_kind *kind = lookup_kind(tval, sval); if (!kind) continue; /* Create the item */ object_prep(i_ptr, kind, p_ptr->depth, RANDOMISE); /* Apply magic (no messages, no artifacts) */ apply_magic(i_ptr, p_ptr->depth, FALSE, FALSE, FALSE); /* Mark as cheat, and where created */ i_ptr->origin = ORIGIN_CHEAT; i_ptr->origin_depth = p_ptr->depth; if (tval == TV_GOLD) make_gold(i_ptr, p_ptr->depth, sval); /* Drop the object from heaven */ drop_near(cave, i_ptr, 0, py, px, TRUE); } msg("Done."); } /* * Display the debug commands help file. */ static void do_cmd_wiz_help(void) { char buf[80]; strnfmt(buf, sizeof(buf), "debug.txt"); screen_save(); show_file(buf, NULL, 0, 0); screen_load(); } /* * Advance the player to level 50 with max stats and other bonuses. */ static void do_cmd_wiz_advance(void) { int i; /* Max stats */ for (i = 0; i < A_MAX; i++) p_ptr->stat_cur[i] = p_ptr->stat_max[i] = 118; /* Lots of money */ p_ptr->au = 1000000L; /* Level 50 */ player_exp_gain(p_ptr, PY_MAX_EXP); /* Heal the player */ p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; /* Restore mana */ p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; /* Get some awesome equipment */ /* Artifacts: 3, 5, 12, ...*/ /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Redraw everything */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_INVEN | PR_EQUIP | PR_MESSAGE | PR_MONSTER | PR_OBJECT | PR_MONLIST | PR_ITEMLIST); /* Hack -- update */ handle_stuff(p_ptr); } /* * Ask for and parse a "debug command" * * The "p_ptr->command_arg" may have been set. */ void do_cmd_debug(void) { int py = p_ptr->py; int px = p_ptr->px; struct keypress cmd; /* Get a "debug command" */ if (!get_com("Debug Command: ", &cmd)) return; /* Analyze the command */ switch (cmd.code) { /* Ignore */ case ESCAPE: case ' ': case '\n': case '\r': { break; } #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': { do_cmd_spoilers(); break; } #endif /* Hack -- Help */ case '?': { do_cmd_wiz_help(); break; } /* Cure all maladies */ case 'a': { do_cmd_wiz_cure_all(); break; } /* Make the player powerful */ case 'A': { do_cmd_wiz_advance(); break; } /* Teleport to target */ case 'b': { do_cmd_wiz_bamf(); break; } /* Create any object */ case 'c': { wiz_create_item(); break; } /* Create an artifact */ case 'C': { if (p_ptr->command_arg > 0) { wiz_create_artifact(p_ptr->command_arg); } else { char name[80] = ""; int a_idx = -1; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Create which artifact? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if an a_idx was entered */ a_idx = get_idx_from_name(name); /* If not, find the artifact with that name */ if (a_idx < 1) a_idx = lookup_artifact_name(name); /* Did we find a valid artifact? */ if (a_idx != -1) wiz_create_artifact(a_idx); else msg("No artifact found."); } /* Reload the screen */ screen_load(); } break; } /* Detect everything */ case 'd': { detect_all(TRUE); break; } /* Test for disconnected dungeon */ case 'D': { disconnect_stats(); break; } /* Edit character */ case 'e': { do_cmd_wiz_change(); break; } case 'f': { stats_collect(); break; } /* Good Objects */ case 'g': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->depth, p_ptr->command_arg, FALSE); break; } /* GF demo */ case 'G': { wiz_gf_demo(); break; } /* Hitpoint rerating */ case 'h': { do_cmd_rerate(); break; } /* Identify */ case 'i': { (void)ident_spell(); break; } /* Go up or down in the dungeon */ case 'j': { do_cmd_wiz_jump(); break; } /* Learn about objects */ case 'l': { do_cmd_wiz_learn(); break; } case 'L': do_cmd_keylog(); break; /* Magic Mapping */ case 'm': { map_area(); break; } /* Summon Named Monster */ case 'n': { s16b r_idx = 0; if (p_ptr->command_arg > 0) { r_idx = p_ptr->command_arg; } else { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Summon which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); /* If not, find the monster with that name */ if (r_idx < 1) r_idx = lookup_monster(name); p_ptr->redraw |= (PR_MAP | PR_MONLIST); /* Reload the screen */ screen_load(); } } if (r_idx > 0) do_cmd_wiz_named(r_idx, TRUE); else msg("No monster found."); break; } /* Object playing routines */ case 'o': { do_cmd_wiz_play(); break; } /* Phase Door */ case 'p': { teleport_player(10); break; } /* Monster pit stats */ case 'P': { pit_stats(); break; } /* Query the dungeon */ case 'q': { do_cmd_wiz_query(); break; } /* Get full recall for a monster */ case 'r': { s16b r_idx = 0; if (p_ptr->command_arg > 0) { r_idx = p_ptr->command_arg; } else { struct keypress sym; const char *prompt = "Full recall for [a]ll monsters or [s]pecific monster? "; if (!get_com(prompt, &sym)) return; if (sym.code == 'a' || sym.code == 'A') { int i; for (i = 0; i < z_info->r_max; i++) cheat_monster_lore(i, &l_list[i]); break; } else if (sym.code == 's' || sym.code == 'S') { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); /* If not, find the monster with that name */ if (r_idx < 1) r_idx = lookup_monster(name); } /* Reload the screen */ screen_load(); } else { /* Assume user aborts */ break; } } /* Did we find a valid monster? */ if (r_idx > 0) cheat_monster_lore(r_idx, &l_list[r_idx]); else msg("No monster found."); break; } /* Summon Random Monster(s) */ case 's': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; do_cmd_wiz_summon(p_ptr->command_arg); break; } /* Collect stats (S) */ case 'S': { stats_collect(); break; } /* Teleport */ case 't': { teleport_player(100); break; } /* Create a trap */ case 'T': { if (cave->feat[p_ptr->py][p_ptr->px] != FEAT_FLOOR) msg("You can't place a trap there!"); else if (p_ptr->depth == 0) msg("You can't place a trap in the town!"); else cave_set_feat(cave, p_ptr->py, p_ptr->px, FEAT_INVIS); break; } /* Un-hide all monsters */ case 'u': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 255; do_cmd_wiz_unhide(p_ptr->command_arg); break; } /* Very Good Objects */ case 'v': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = 1; acquirement(py, px, p_ptr->depth, p_ptr->command_arg, TRUE); break; } case 'V': { wiz_test_kind(p_ptr->command_arg); break; } /* Wizard Light the Level */ case 'w': { wiz_light(); break; } /* Wipe recall for a monster */ case 'W': { s16b r_idx = 0; if (p_ptr->command_arg > 0) { r_idx = p_ptr->command_arg; } else { struct keypress sym; const char *prompt = "Wipe recall for [a]ll monsters or [s]pecific monster? "; if (!get_com(prompt, &sym)) return; if (sym.code == 'a' || sym.code == 'A') { int i; for (i = 0; i < z_info->r_max; i++) wipe_monster_lore(i, &l_list[i]); break; } else if (sym.code == 's' || sym.code == 'S') { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); /* If not, find the monster with that name */ if (r_idx < 1) r_idx = lookup_monster(name); } /* Reload the screen */ screen_load(); } else { /* Assume user aborts */ break; } } /* Did we find a valid monster? */ if (r_idx > 0) wipe_monster_lore(r_idx, &l_list[r_idx]); else msg("No monster found."); break; } /* Increase Experience */ case 'x': { if (p_ptr->command_arg) { player_exp_gain(p_ptr, p_ptr->command_arg); } else { player_exp_gain(p_ptr, p_ptr->exp + 1); } break; } /* Zap Monsters (Banishment) */ case 'z': { if (p_ptr->command_arg <= 0) p_ptr->command_arg = MAX_SIGHT; do_cmd_wiz_zap(p_ptr->command_arg); break; } /* Hack */ case '_': { do_cmd_wiz_hack_ben(); break; } /* Oops */ default: { msg("That is not a valid debug command."); break; } } } #endif angband-v3.3.2/src/Makefile.src0000644000175000017500000000457011651552410015632 0ustar chriscchrisc# # File: Makefile.src # # A makefile which includes the current object files, hopefully includable # across a range of different makefiles, to cut down on maintenance. # VERSION = 3.3.2 COPYRIGHT = (c) 1995-2011 Angband contributors HEADERS = \ angband.h \ birth.h \ cmds.h \ config.h \ defines.h \ effects.h \ externs.h \ game-cmd.h \ game-event.h \ guid.h \ $(GTKHEADERS) \ h-basic.h \ init.h \ main.h \ option.h \ parser.h \ types.h \ ui-event.h \ ui.h \ ui-menu.h \ wizard.h \ x-char.h \ z-bitflag.h \ z-file.h \ z-form.h \ z-msg.h \ z-quark.h \ z-queue.h \ z-rand.h \ z-term.h \ z-type.h \ z-util.h \ z-virt.h GTKHEADERS = \ gtk/cairo-utils.h \ gtk/main-gtk.h \ ZFILES = z-bitflag.o z-file.o z-form.o z-msg.o z-quark.o z-queue.o z-rand.o \ z-term.o z-type.o z-util.o z-virt.o z-textblock.o MAINFILES = main.o main-crb.o main-gcu.o $(GTKMAINFILES) \ main-sdl.o main-win.o main-x11.o snd-sdl.o main-test.o GTKMAINFILES = \ gtk/main-gtk.o \ gtk/cairo-utils.o ANGFILES = \ attack.o \ birth.o \ button.o \ cave.o \ cmd0.o \ cmd1.o \ cmd2.o \ cmd3.o \ cmd4.o \ cmd-misc.o \ cmd-obj.o \ death.o \ debug.o \ dungeon.o \ effects.o \ files.o \ game-cmd.o \ game-event.o \ generate.o \ guid.o \ history.o \ init2.o \ keymap.o \ load.o \ monster/init.o \ monster/melee1.o \ monster/melee2.o \ monster/mon-lore.o \ monster/mon-make.o \ monster/mon-msg.o \ monster/mon-power.o \ monster/mon-spell.o \ monster/mon-timed.o \ monster/mon-util.o \ object/identify.o \ object/obj-desc.o \ object/obj-flag.o \ object/obj-info.o \ object/obj-make.o \ object/obj-power.o \ object/obj-ui.o \ object/obj-util.o \ object/pval.o \ object/randart.o \ object/slays.o \ option.o \ parser.o \ randname.o \ pathfind.o \ prefs.o \ player/calcs.o \ player/class.o \ player/player.o \ player/race.o \ player/spell.o \ player/timed.o \ player/util.o \ score.o \ signals.o \ save.o \ savefile.o \ spells1.o \ spells2.o \ squelch.o \ store.o \ tables.o \ target.o \ trap.o \ ui.o \ ui-birth.o \ ui-event.o \ ui-knowledge.o \ ui-menu.o \ ui-options.o \ ui-spell.o \ util.o \ variable.o \ wiz-spoil.o \ wiz-stats.o \ wizard.o \ x-char.o \ x-spell.o \ xtra2.o \ xtra3.o STATSFILES = stats/db.o ifeq ($(USE_STATS),1) ANGFILES += $(STATSFILES) MAINFILES += main-stats.o endif buildid.o: $(ANGFILES) ANGFILES += buildid.o angband-v3.3.2/src/option.c0000644000175000017500000002241511651552410015056 0ustar chriscchrisc/* * File: options.c * Purpose: Options table and definitions. * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "option.h" /* * Option screen interface */ const int option_page[OPT_PAGE_MAX][OPT_PAGE_PER] = { /* Interface */ { OPT_rogue_like_commands, OPT_use_old_target, OPT_pickup_always, OPT_pickup_inven, OPT_easy_open, OPT_center_player, OPT_view_yellow_light, OPT_hp_changes_color, OPT_animate_flicker, OPT_purple_uniques, OPT_show_flavors, OPT_mouse_movement, OPT_mouse_buttons, OPT_use_sound, OPT_xchars_to_file, OPT_NONE, }, /* Warning */ { OPT_disturb_move, OPT_disturb_near, OPT_disturb_detect, OPT_disturb_state, OPT_auto_more, OPT_notify_recharge, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, }, /* Birth/Difficulty */ { OPT_birth_maximize, OPT_birth_randarts, OPT_birth_keep_randarts, OPT_birth_ai_smell, OPT_birth_ai_packs, OPT_birth_ai_learn, OPT_birth_ai_cheat, OPT_birth_ai_smart, OPT_birth_ironman, OPT_birth_no_stores, OPT_birth_no_artifacts, OPT_birth_no_stacking, OPT_birth_no_preserve, OPT_birth_no_stairs, OPT_birth_no_feelings, OPT_birth_no_selling, }, /* Cheat */ { OPT_cheat_hear, OPT_cheat_room, OPT_cheat_xtra, OPT_cheat_know, OPT_cheat_live, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, } }; struct option { const char *name; const char *description; bool normal; }; static const struct option options[OPT_MAX] = { { "rogue_like_commands", "Use the roguelike command keyset", FALSE }, /* 0 */ { "use_sound", "Use sound", FALSE }, /* 1 */ { NULL, NULL, FALSE }, /* 2 */ { "use_old_target", "Use old target by default", FALSE }, /* 3 */ { "pickup_always", "Always pickup items", FALSE }, /* 4 */ { "pickup_inven", "Always pickup items matching inventory", TRUE }, /* 5 */ { "show_flavors", "Show flavors in object descriptions", FALSE }, /* 6 */ { "disturb_move", "Disturb whenever any monster moves", FALSE }, /* 7 */ { "disturb_near", "Disturb whenever viewable monster moves", TRUE }, /* 8 */ { "disturb_detect", "Disturb whenever leaving trap detected area", TRUE }, /* 9 */ { "disturb_state", "Disturb whenever player state changes", TRUE }, /* 10 */ { NULL, NULL, FALSE }, /* 11 */ { NULL, NULL, FALSE }, /* 12 */ { "view_yellow_light", "Color: Illuminate torchlight in yellow", FALSE }, /* 13 */ { "easy_open", "Open/disarm/close without direction", TRUE }, /* 14 */ { "animate_flicker", "Color: Shimmer multi-colored things", FALSE }, /* 15 */ { "center_player", "Center map continuously", FALSE }, /* 16 */ { "purple_uniques", "Color: Show unique monsters in purple", FALSE }, /* 17 */ { "xchars_to_file", "Allow accents in output files", FALSE }, /* 18 */ { "auto_more", "Automatically clear '-more-' prompts", FALSE }, /* 19 */ { "hp_changes_color", "Color: Player color indicates % hit points", FALSE }, /* 20 */ { "mouse_movement", "Allow mouse clicks to move the player", FALSE }, /* 21 */ { "mouse_buttons", "Show mouse status line buttons", FALSE }, /* 22 */ { "notify_recharge", "Notify on object recharge", FALSE }, /* 23 */ { NULL, NULL, FALSE }, /* 24 */ { NULL, NULL, FALSE }, /* 25 */ { NULL, NULL, FALSE }, /* 26 */ { NULL, NULL, FALSE }, /* 27 */ { NULL, NULL, FALSE }, /* 28 */ { NULL, NULL, FALSE }, /* 29 */ { NULL, NULL, FALSE }, /* 30 */ { "cheat_hear", "Cheat: Peek into monster creation", FALSE }, /* 31 */ { "cheat_room", "Cheat: Peek into dungeon creation", FALSE }, /* 32 */ { "cheat_xtra", "Cheat: Peek into something else", FALSE }, /* 33 */ { "cheat_know", "Cheat: Know complete monster info", FALSE }, /* 34 */ { "cheat_live", "Cheat: Allow player to avoid death", FALSE }, /* 35 */ { NULL, NULL, FALSE }, /* 36 */ { NULL, NULL, FALSE }, /* 37 */ { NULL, NULL, FALSE }, /* 38 */ { NULL, NULL, FALSE }, /* 39 */ { NULL, NULL, FALSE }, /* 40 */ { "score_hear", "Score: Peek into monster creation", FALSE }, /* 41 */ { "score_room", "Score: Peek into dungeon creation", FALSE }, /* 42 */ { "score_xtra", "Score: Peek into something else", FALSE }, /* 43 */ { "score_know", "Score: Know complete monster info", FALSE }, /* 44 */ { "score_live", "Score: Allow player to avoid death", FALSE }, /* 45 */ { NULL, NULL, FALSE }, /* 46 */ { NULL, NULL, FALSE }, /* 47 */ { NULL, NULL, FALSE }, /* 48 */ { NULL, NULL, FALSE }, /* 49 */ { "birth_maximize", "Maximise effect of race/class bonuses", TRUE }, /* 50 */ { "birth_randarts", "Randomise the artifacts (except a very few)", FALSE }, /* 51 */ { "birth_ironman", "Restrict the use of stairs/recall", FALSE }, /* 52 */ { "birth_no_stores", "Restrict the use of stores/home", FALSE }, /* 53 */ { "birth_no_artifacts", "Restrict creation of artifacts", FALSE }, /* 54 */ { "birth_no_stacking", "Don't stack objects on the floor", FALSE }, /* 55 */ { "birth_no_preserve", "Lose artifacts when leaving level", FALSE }, /* 56 */ { "birth_no_stairs", "Don't generate connected stairs", FALSE }, /* 57 */ { "birth_no_feelings", "Don't show level feelings", FALSE }, /* 58 */ { "birth_no_selling", "Items always sell for 0 gold", FALSE }, /* 59 */ { "birth_keep_randarts", "Use previous set of randarts", TRUE }, /* 60 */ { "birth_ai_smell", "Monsters chase recent locations", TRUE }, /* 61 */ { "birth_ai_packs", "Monsters act smarter in groups", TRUE }, /* 62 */ { "birth_ai_learn", "Monsters learn from their mistakes", FALSE }, /* 63 */ { "birth_ai_cheat", "Monsters exploit player's weaknesses", FALSE }, /* 64 */ { "birth_ai_smart", "Monsters behave more intelligently (broken)", FALSE }, /* 65 */ { NULL, NULL, FALSE }, /* 66 */ { NULL, NULL, FALSE }, /* 67 */ { NULL, NULL, FALSE }, /* 68 */ { NULL, NULL, FALSE }, /* 69 */ }; /* Accessor functions */ const char *option_name(int opt) { if (opt >= OPT_MAX) return NULL; return options[opt].name; } const char *option_desc(int opt) { if (opt >= OPT_MAX) return NULL; return options[opt].description; } #if 0 /* unused so far but may be useful in future */ static bool option_is_birth(int opt) { return opt >= OPT_BIRTH && opt < (OPT_BIRTH + N_OPTS_BIRTH); } static bool option_is_score(int opt) { return opt >= OPT_SCORE && opt < (OPT_SCORE + N_OPTS_CHEAT); } #endif static bool option_is_cheat(int opt) { return opt >= OPT_CHEAT && opt < (OPT_CHEAT + N_OPTS_CHEAT); } /* Setup functions */ bool option_set(const char *name, bool on) { size_t opt; for (opt = 0; opt < OPT_MAX; opt++) { if (!options[opt].name || !streq(options[opt].name, name)) continue; op_ptr->opt[opt] = on; if (on && option_is_cheat(opt)) { op_ptr->opt[opt + (OPT_SCORE - OPT_CHEAT)] = TRUE; } return TRUE; } return FALSE; } void option_set_defaults(void) { size_t opt; for (opt = 0; opt < OPT_MAX; opt++) op_ptr->opt[opt] = options[opt].normal; } angband-v3.3.2/src/ui-birth.c0000644000175000017500000006706011651552410015276 0ustar chriscchrisc/* * File: ui-birth.c * Purpose: Text-based user interface for character creation * * Copyright (c) 1987 - 2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "button.h" #include "cmds.h" #include "files.h" #include "game-cmd.h" #include "game-event.h" #include "object/tvalsval.h" #include "ui-birth.h" #include "ui-menu.h" /* * Overview * ======== * This file implements the user interface side of the birth process * for the classic terminal-based UI of Angband. * * It models birth as a series of steps which must be carried out in * a specified order, with the option of stepping backwards to revisit * past choices. * * It starts when we receive the EVENT_ENTER_BIRTH event from the game, * and ends when we receive the EVENT_LEAVE_BIRTH event. In between, * we will repeatedly be asked to supply a game command, which change * the state of the character being rolled. Once the player is happy * with their character, we send the CMD_ACCEPT_CHARACTER command. */ /* A local-to-this-file global to hold the most important bit of state between calls to the game proper. Probably not strictly necessary, but reduces complexity a bit. */ enum birth_stage { BIRTH_BACK = -1, BIRTH_RESET = 0, BIRTH_QUICKSTART, BIRTH_SEX_CHOICE, BIRTH_RACE_CHOICE, BIRTH_CLASS_CHOICE, BIRTH_ROLLER_CHOICE, BIRTH_POINTBASED, BIRTH_ROLLER, BIRTH_NAME_CHOICE, BIRTH_FINAL_CONFIRM, BIRTH_COMPLETE }; enum birth_questions { BQ_METHOD = 0, BQ_SEX, BQ_RACE, BQ_CLASS, BQ_ROLLER, MAX_BIRTH_QUESTIONS }; enum birth_rollers { BR_POINTBASED = 0, BR_NORMAL, MAX_BIRTH_ROLLERS }; static void point_based_start(void); static bool quickstart_allowed = FALSE; /* ------------------------------------------------------------------------ * Quickstart? screen. * ------------------------------------------------------------------------ */ static enum birth_stage get_quickstart_command(void) { const char *prompt = "['Y' to use this character, 'N' to start afresh, 'C' to change name]"; enum birth_stage next = BIRTH_QUICKSTART; /* Prompt for it */ prt("New character based on previous one:", 0, 0); prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[Y]", 'y'); button_add("[N]", 'n'); button_add("[C]", 'c'); redraw_stuff(p_ptr); do { /* Get a key */ struct keypress ke = inkey(); if (ke.code == 'N' || ke.code == 'n') { cmd_insert(CMD_BIRTH_RESET); next = BIRTH_SEX_CHOICE; } else if (ke.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.code == 'C' || ke.code == 'c') { next = BIRTH_NAME_CHOICE; } else if (ke.code == 'Y' || ke.code == 'y') { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } } while (next == BIRTH_QUICKSTART); /* Buttons */ button_kill_all(); redraw_stuff(p_ptr); /* Clear prompt */ clear_from(23); return next; } /* ------------------------------------------------------------------------ * The various "menu" bits of the birth process - namely choice of sex, * race, class, and roller type. * ------------------------------------------------------------------------ */ /* The various menus */ static menu_type sex_menu, race_menu, class_menu, roller_menu; /* Locations of the menus, etc. on the screen */ #define HEADER_ROW 1 #define QUESTION_ROW 7 #define TABLE_ROW 9 #define QUESTION_COL 2 #define SEX_COL 2 #define RACE_COL 14 #define RACE_AUX_COL 29 #define CLASS_COL 29 #define CLASS_AUX_COL 43 #define ROLLER_COL 43 #define MENU_ROWS TABLE_ROW + 14 /* upper left column and row, width, and lower column */ static region gender_region = {SEX_COL, TABLE_ROW, 14, MENU_ROWS}; static region race_region = {RACE_COL, TABLE_ROW, 14, MENU_ROWS}; static region class_region = {CLASS_COL, TABLE_ROW, 14, MENU_ROWS}; static region roller_region = {ROLLER_COL, TABLE_ROW, 28, MENU_ROWS}; /* We use different menu "browse functions" to display the help text sometimes supplied with the menu items - currently just the list of bonuses, etc, corresponding to each race and class. */ typedef void (*browse_f) (int oid, void *db, const region *l); /* We have one of these structures for each menu we display - it holds the useful information for the menu - text of the menu items, "help" text, current (or default) selection, and whether random selection is allowed. */ struct birthmenu_data { const char **items; const char *hint; bool allow_random; }; /* A custom "display" function for our menus that simply displays the text from our stored data in a different colour if it's currently selected. */ static void birthmenu_display(menu_type *menu, int oid, bool cursor, int row, int col, int width) { struct birthmenu_data *data = menu->menu_data; byte attr = curs_attrs[CURS_KNOWN][0 != cursor]; c_put_str(attr, data->items[oid], row, col); } /* Our custom menu iterator, only really needed to allow us to override the default handling of "commands" in the standard iterators (hence only defining the display and handler parts). */ static const menu_iter birth_iter = { NULL, NULL, birthmenu_display, NULL, NULL }; static void skill_help(s16b skills[], int mhp, int exp, int infra) { text_out_e("Hit/Shoot/Throw: %+d/%+d/%+d\n", skills[SKILL_TO_HIT_MELEE], skills[SKILL_TO_HIT_BOW], skills[SKILL_TO_HIT_THROW]); text_out_e("Hit die: %2d XP mod: %d%%\n", mhp, exp); text_out_e("Disarm: %+3d Devices: %+3d\n", skills[SKILL_DISARM], skills[SKILL_DEVICE]); text_out_e("Save: %+3d Stealth: %+3d\n", skills[SKILL_SAVE], skills[SKILL_STEALTH]); if (infra >= 0) text_out_e("Infravision: %d ft\n", infra * 10); text_out_e("Digging: %+d\n", skills[SKILL_DIGGING]); text_out_e("Search: %+d/%d", skills[SKILL_SEARCH], skills[SKILL_SEARCH_FREQUENCY]); if (infra < 0) text_out_e("\n"); } static const char *get_flag_desc(bitflag flag) { switch (flag) { case OF_SUST_STR: return "Sustains strength"; case OF_SUST_DEX: return "Sustains dexterity"; case OF_SUST_CON: return "Sustains constitution"; case OF_RES_POIS: return "Resists poison"; case OF_RES_LIGHT: return "Resists light damage"; case OF_RES_DARK: return "Resists darkness damage"; case OF_RES_BLIND: return "Resists blindness"; case OF_HOLD_LIFE: return "Sustains experience"; case OF_FREE_ACT: return "Resists paralysis"; case OF_REGEN: return "Regenerates quickly"; case OF_SEE_INVIS: return "Sees invisible creatures"; default: return "Undocumented flag"; } } static const char *get_pflag_desc(bitflag flag) { switch (flag) { case PF_EXTRA_SHOT: return "Gains extra shots with bow"; case PF_BRAVERY_30: return "Gains immunity to fear"; case PF_BLESS_WEAPON: return "Prefers blunt/blessed weapons"; case PF_CUMBER_GLOVE: return NULL; case PF_ZERO_FAIL: return "Advanced spellcasting"; case PF_BEAM: return NULL; case PF_CHOOSE_SPELLS: return NULL; case PF_PSEUDO_ID_IMPROV: return NULL; case PF_KNOW_MUSHROOM: return "Identifies mushrooms"; case PF_KNOW_ZAPPER: return "Identifies magic devices"; case PF_SEE_ORE: return "Senses ore/minerals"; default: return "Undocumented pflag"; } } static void race_help(int i, void *db, const region *l) { int j; size_t k; struct player_race *r = player_id2race(i); int len = (A_MAX + 1) / 2; int n_flags = 0; int flag_space = 3; if (!r) return; /* Output to the screen */ text_out_hook = text_out_to_screen; /* Indent output */ text_out_indent = RACE_AUX_COL; Term_gotoxy(RACE_AUX_COL, TABLE_ROW); for (j = 0; j < len; j++) { const char *name1 = stat_names_reduced[j]; const char *name2 = stat_names_reduced[j + len]; int adj1 = r->r_adj[j]; int adj2 = r->r_adj[j + len]; text_out_e("%s%+3d %s%+3d\n", name1, adj1, name2, adj2); } text_out_e("\n"); skill_help(r->r_skills, r->r_mhp, r->r_exp, r->infra); text_out_e("\n"); for (k = 0; k < OF_MAX; k++) { if (n_flags >= flag_space) break; if (!of_has(r->flags, k)) continue; text_out_e("\n%s", get_flag_desc(k)); n_flags++; } for (k = 0; k < PF_MAX; k++) { if (n_flags >= flag_space) break; if (!pf_has(r->pflags, k)) continue; text_out_e("\n%s", get_pflag_desc(k)); n_flags++; } while(n_flags < flag_space) { text_out_e("\n"); n_flags++; } /* Reset text_out() indentation */ text_out_indent = 0; } static void class_help(int i, void *db, const region *l) { int j; size_t k; struct player_class *c = player_id2class(i); int len = (A_MAX + 1) / 2; int n_flags = 0; int flag_space = 5; if (!c) return; /* Output to the screen */ text_out_hook = text_out_to_screen; /* Indent output */ text_out_indent = CLASS_AUX_COL; Term_gotoxy(CLASS_AUX_COL, TABLE_ROW); for (j = 0; j < len; j++) { const char *name1 = stat_names_reduced[j]; const char *name2 = stat_names_reduced[j + len]; int adj1 = c->c_adj[j] + p_ptr->race->r_adj[j]; int adj2 = c->c_adj[j + len] + p_ptr->race->r_adj[j + len]; text_out_e("%s%+3d %s%+3d\n", name1, adj1, name2, adj2); } text_out_e("\n"); skill_help(c->c_skills, c->c_mhp, c->c_exp, -1); if (c->spell_book == TV_MAGIC_BOOK) { text_out_e("\nLearns arcane magic"); } else if (c->spell_book == TV_PRAYER_BOOK) { text_out_e("\nLearns divine magic"); } for (k = 0; k < PF_MAX; k++) { const char *s; if (n_flags >= flag_space) break; if (!pf_has(c->pflags, k)) continue; s = get_pflag_desc(k); if (!s) continue; text_out_e("\n%s", s); n_flags++; } while(n_flags < flag_space) { text_out_e("\n"); n_flags++; } /* Reset text_out() indentation */ text_out_indent = 0; } /* Set up one of our menus ready to display choices for a birth question. This is slightly involved. */ static void init_birth_menu(menu_type *menu, int n_choices, int initial_choice, const region *reg, bool allow_random, browse_f aux) { struct birthmenu_data *menu_data; /* Initialise a basic menu */ menu_init(menu, MN_SKIN_SCROLL, &birth_iter); /* A couple of behavioural flags - we want selections letters in lower case and a double tap to act as a selection. */ menu->selections = lower_case; menu->flags = MN_DBL_TAP; /* Copy across the game's suggested initial selection, etc. */ menu->cursor = initial_choice; /* Allocate sufficient space for our own bits of menu information. */ menu_data = mem_alloc(sizeof *menu_data); /* Allocate space for an array of menu item texts and help texts (where applicable) */ menu_data->items = mem_alloc(n_choices * sizeof *menu_data->items); menu_data->allow_random = allow_random; /* Set private data */ menu_setpriv(menu, n_choices, menu_data); /* Set up the "browse" hook to display help text (where applicable). */ menu->browse_hook = aux; /* Lay out the menu appropriately */ menu_layout(menu, reg); } static void setup_menus(void) { int i, n; struct player_class *c; struct player_race *r; const char *roller_choices[MAX_BIRTH_ROLLERS] = { "Point-based", "Standard roller" }; struct birthmenu_data *mdata; /* Sex menu fairly straightforward */ init_birth_menu(&sex_menu, MAX_SEXES, p_ptr->psex, &gender_region, TRUE, NULL); mdata = sex_menu.menu_data; for (i = 0; i < MAX_SEXES; i++) mdata->items[i] = sex_info[i].title; mdata->hint = "Your 'sex' does not have any significant gameplay effects."; n = 0; for (r = races; r; r = r->next) n++; /* Race menu more complicated. */ init_birth_menu(&race_menu, n, p_ptr->race ? p_ptr->race->ridx : 0, &race_region, TRUE, race_help); mdata = race_menu.menu_data; for (i = 0, r = races; r; r = r->next, i++) mdata->items[r->ridx] = r->name; mdata->hint = "Your 'race' determines various intrinsic factors and bonuses."; n = 0; for (c = classes; c; c = c->next) n++; /* Class menu similar to race. */ init_birth_menu(&class_menu, n, p_ptr->class ? p_ptr->class->cidx : 0, &class_region, TRUE, class_help); mdata = class_menu.menu_data; for (i = 0, c = classes; c; c = c->next, i++) mdata->items[c->cidx] = c->name; mdata->hint = "Your 'class' determines various intrinsic abilities and bonuses"; /* Roller menu straightforward again */ init_birth_menu(&roller_menu, MAX_BIRTH_ROLLERS, 0, &roller_region, FALSE, NULL); mdata = roller_menu.menu_data; for (i = 0; i < MAX_BIRTH_ROLLERS; i++) mdata->items[i] = roller_choices[i]; mdata->hint = "Your choice of character generation. Point-based is recommended."; } /* Cleans up our stored menu info when we've finished with it. */ static void free_birth_menu(menu_type *menu) { struct birthmenu_data *data = menu->menu_data; if (data) { mem_free(data->items); mem_free(data); } } static void free_birth_menus(void) { /* We don't need these any more. */ free_birth_menu(&sex_menu); free_birth_menu(&race_menu); free_birth_menu(&class_menu); free_birth_menu(&roller_menu); } /* * Clear the previous question */ static void clear_question(void) { int i; for (i = QUESTION_ROW; i < TABLE_ROW; i++) { /* Clear line, position cursor */ Term_erase(0, i, 255); } } #define BIRTH_MENU_HELPTEXT \ "{lightblue}Please select your character from the menu below:{/}\n\n" \ "Use the {lightgreen}movement keys{/} to scroll the menu, " \ "{lightgreen}Enter{/} to select the current menu item, '{lightgreen}*{/}' " \ "for a random menu item, '{lightgreen}ESC{/}' to step back through the " \ "birth process, '{lightgreen}={/}' for the birth options, '{lightgreen}?{/} " \ "for help, or '{lightgreen}Ctrl-X{/}' to quit." /* Show the birth instructions on an otherwise blank screen */ static void print_menu_instructions(void) { /* Clear screen */ Term_clear(); /* Output to the screen */ text_out_hook = text_out_to_screen; /* Indent output */ text_out_indent = QUESTION_COL; Term_gotoxy(QUESTION_COL, HEADER_ROW); /* Display some helpful information */ text_out_e(BIRTH_MENU_HELPTEXT); /* Reset text_out() indentation */ text_out_indent = 0; } /* Allow the user to select from the current menu, and return the corresponding command to the game. Some actions are handled entirely by the UI (displaying help text, for instance). */ static enum birth_stage menu_question(enum birth_stage current, menu_type *current_menu, cmd_code choice_command) { struct birthmenu_data *menu_data = menu_priv(current_menu); ui_event cx; enum birth_stage next = BIRTH_RESET; /* Print the question currently being asked. */ clear_question(); Term_putstr(QUESTION_COL, QUESTION_ROW, -1, TERM_YELLOW, menu_data->hint); current_menu->cmd_keys = "?=*\x18"; /* ?, =, *, */ while (next == BIRTH_RESET) { /* Display the menu, wait for a selection of some sort to be made. */ cx = menu_select(current_menu, EVT_KBRD, FALSE); /* As all the menus are displayed in "hierarchical" style, we allow use of "back" (left arrow key or equivalent) to step back in the proces as well as "escape". */ if (cx.type == EVT_ESCAPE) { next = BIRTH_BACK; } else if (cx.type == EVT_SELECT) { if (current == BIRTH_ROLLER_CHOICE) { cmd_insert(CMD_FINALIZE_OPTIONS); if (current_menu->cursor) { /* Do a first roll of the stats */ cmd_insert(CMD_ROLL_STATS); next = current + 2; } else { /* * Make sure we've got a point-based char to play with. * We call point_based_start here to make sure we get * an update on the points totals before trying to * display the screen. The call to CMD_RESET_STATS * forces a rebuying of the stats to give us up-to-date * totals. This is, it should go without saying, a hack. */ point_based_start(); cmd_insert(CMD_RESET_STATS); cmd_set_arg_choice(cmd_get_top(), 0, TRUE); next = current + 1; } } else { cmd_insert(choice_command); cmd_set_arg_choice(cmd_get_top(), 0, current_menu->cursor); next = current + 1; } } else if (cx.type == EVT_KBRD) { /* '*' chooses an option at random from those the game's provided. */ if (cx.key.code == '*' && menu_data->allow_random) { current_menu->cursor = randint0(current_menu->count); cmd_insert(choice_command); cmd_set_arg_choice(cmd_get_top(), 0, current_menu->cursor); menu_refresh(current_menu, FALSE); next = current + 1; } else if (cx.key.code == '=') { do_cmd_options_birth(); next = current; } else if (cx.key.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (cx.key.code == '?') { do_cmd_help(); } } } return next; } /* ------------------------------------------------------------------------ * The rolling bit of the roller. * ------------------------------------------------------------------------ */ #define ROLLERCOL 42 static enum birth_stage roller_command(bool first_call) { char prompt[80] = ""; size_t promptlen = 0; struct keypress ch; enum birth_stage next = BIRTH_ROLLER; /* Used to keep track of whether we've rolled a character before or not. */ static bool prev_roll = FALSE; /* Display the player - a bit cheaty, but never mind. */ display_player(0); if (first_call) prev_roll = FALSE; /* Add buttons */ button_add("[ESC]", ESCAPE); button_add("[Enter]", '\r'); button_add("[r]", 'r'); if (prev_roll) button_add("[p]", 'p'); clear_from(Term->hgt - 2); redraw_stuff(p_ptr); /* Prepare a prompt (must squeeze everything in) */ strnfcat(prompt, sizeof (prompt), &promptlen, "['r' to reroll"); if (prev_roll) strnfcat(prompt, sizeof(prompt), &promptlen, ", 'p' for prev"); strnfcat(prompt, sizeof (prompt), &promptlen, " or 'Enter' to accept]"); /* Prompt for it */ prt(prompt, Term->hgt - 1, Term->wid / 2 - promptlen / 2); /* Prompt and get a command */ ch = inkey(); if (ch.code == ESCAPE) { button_kill('r'); button_kill('p'); next = BIRTH_BACK; } /* 'Enter' accepts the roll */ if ((ch.code == '\r') || (ch.code == '\n')) { next = BIRTH_NAME_CHOICE; } /* Reroll this character */ else if ((ch.code == ' ') || (ch.code == 'r')) { cmd_insert(CMD_ROLL_STATS); prev_roll = TRUE; } /* Previous character */ else if (prev_roll && (ch.code == 'p')) { cmd_insert(CMD_PREV_STATS); } /* Quit */ else if (ch.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } /* Help XXX */ else if (ch.code == '?') { do_cmd_help(); } /* Nothing handled directly here */ else { bell("Illegal roller command!"); } /* Kill buttons */ button_kill(ESCAPE); button_kill('\r'); button_kill('r'); button_kill('p'); redraw_stuff(p_ptr); return next; } /* ------------------------------------------------------------------------ * Point-based stat allocation. * ------------------------------------------------------------------------ */ /* The locations of the "costs" area on the birth screen. */ #define COSTS_ROW 2 #define COSTS_COL (42 + 32) #define TOTAL_COL (42 + 19) /* This is called whenever a stat changes. We take the easy road, and just redisplay them all using the standard function. */ static void point_based_stats(game_event_type type, game_event_data *data, void *user) { display_player_stat_info(); } /* This is called whenever any of the other miscellaneous stat-dependent things changed. We are hooked into changes in the amount of gold in this case, but redisplay everything because it's easier. */ static void point_based_misc(game_event_type type, game_event_data *data, void *user) { display_player_xtra_info(); } /* This is called whenever the points totals are changed (in birth.c), so that we can update our display of how many points have been spent and are available. */ static void point_based_points(game_event_type type, game_event_data *data, void *user) { int i; int sum = 0; int *stats = data->birthstats.stats; /* Display the costs header */ put_str("Cost", COSTS_ROW - 1, COSTS_COL); /* Display the costs */ for (i = 0; i < A_MAX; i++) { /* Display cost */ put_str(format("%4d", stats[i]), COSTS_ROW + i, COSTS_COL); sum += stats[i]; } put_str(format("Total Cost: %2d/%2d", sum, data->birthstats.remaining + sum), COSTS_ROW + A_MAX, TOTAL_COL); } static void point_based_start(void) { const char *prompt = "[up/down to move, left/right to modify, 'r' to reset, 'Enter' to accept]"; /* Clear */ Term_clear(); /* Display the player */ display_player_xtra_info(); display_player_stat_info(); prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Register handlers for various events - cheat a bit because we redraw the lot at once rather than each bit at a time. */ event_add_handler(EVENT_BIRTHPOINTS, point_based_points, NULL); event_add_handler(EVENT_STATS, point_based_stats, NULL); event_add_handler(EVENT_GOLD, point_based_misc, NULL); } static void point_based_stop(void) { event_remove_handler(EVENT_BIRTHPOINTS, point_based_points, NULL); event_remove_handler(EVENT_STATS, point_based_stats, NULL); event_remove_handler(EVENT_GOLD, point_based_misc, NULL); } static enum birth_stage point_based_command(void) { static int stat = 0; struct keypress ch; enum birth_stage next = BIRTH_POINTBASED; /* point_based_display();*/ /* Place cursor just after cost of current stat */ Term_gotoxy(COSTS_COL + 4, COSTS_ROW + stat); /* Get key */ ch = inkey(); if (ch.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } /* Go back a step, or back to the start of this step */ else if (ch.code == ESCAPE) { next = BIRTH_BACK; } else if (ch.code == 'r' || ch.code == 'R') { cmd_insert(CMD_RESET_STATS); cmd_set_arg_choice(cmd_get_top(), 0, FALSE); } /* Done */ else if ((ch.code == '\r') || (ch.code == '\n')) { next = BIRTH_NAME_CHOICE; } else { int dir = target_dir(ch); /* Prev stat, looping round to the bottom when going off the top */ if (dir == 8) stat = (stat + A_MAX - 1) % A_MAX; /* Next stat, looping round to the top when going off the bottom */ if (dir == 2) stat = (stat + 1) % A_MAX; /* Decrease stat (if possible) */ if (dir == 4) { cmd_insert(CMD_SELL_STAT); cmd_set_arg_choice(cmd_get_top(), 0, stat); } /* Increase stat (if possible) */ if (dir == 6) { cmd_insert(CMD_BUY_STAT); cmd_set_arg_choice(cmd_get_top(), 0, stat); } } return next; } /* ------------------------------------------------------------------------ * Asking for the player's chosen name. * ------------------------------------------------------------------------ */ static enum birth_stage get_name_command(void) { enum birth_stage next; char name[32]; if (get_name(name, sizeof(name))) { cmd_insert(CMD_NAME_CHOICE); cmd_set_arg_string(cmd_get_top(), 0, name); next = BIRTH_FINAL_CONFIRM; } else { next = BIRTH_BACK; } return next; } /* ------------------------------------------------------------------------ * Final confirmation of character. * ------------------------------------------------------------------------ */ static enum birth_stage get_confirm_command(void) { const char *prompt = "['ESC' to step back, 'S' to start over, or any other key to continue]"; struct keypress ke; enum birth_stage next; /* Prompt for it */ prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[Continue]", 'q'); button_add("[ESC]", ESCAPE); button_add("[S]", 'S'); redraw_stuff(p_ptr); /* Get a key */ ke = inkey(); /* Start over */ if (ke.code == 'S' || ke.code == 's') { next = BIRTH_RESET; } else if (ke.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.code == ESCAPE) { next = BIRTH_BACK; } else { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } /* Buttons */ button_kill_all(); redraw_stuff(p_ptr); /* Clear prompt */ clear_from(23); return next; } /* ------------------------------------------------------------------------ * Things that relate to the world outside this file: receiving game events * and being asked for game commands. * ------------------------------------------------------------------------ */ /* * This is called when we receive a request for a command in the birth * process. * The birth process continues until we send a final character confirmation * command (or quit), so this is effectively called in a loop by the main * game. * * We're imposing a step-based system onto the main game here, so we need * to keep track of where we're up to, where each step moves on to, etc. */ errr get_birth_command(bool wait) { static enum birth_stage current_stage = BIRTH_RESET; static enum birth_stage prev; static enum birth_stage roller = BIRTH_RESET; enum birth_stage next = current_stage; switch (current_stage) { case BIRTH_RESET: { cmd_insert(CMD_BIRTH_RESET); roller = BIRTH_RESET; if (quickstart_allowed) next = BIRTH_QUICKSTART; else next = BIRTH_SEX_CHOICE; break; } case BIRTH_QUICKSTART: { display_player(0); next = get_quickstart_command(); break; } case BIRTH_SEX_CHOICE: case BIRTH_CLASS_CHOICE: case BIRTH_RACE_CHOICE: case BIRTH_ROLLER_CHOICE: { menu_type *menu = &sex_menu; cmd_code command = CMD_CHOOSE_SEX; Term_clear(); print_menu_instructions(); if (current_stage > BIRTH_SEX_CHOICE) { menu_refresh(&sex_menu, FALSE); menu = &race_menu; command = CMD_CHOOSE_RACE; } if (current_stage > BIRTH_RACE_CHOICE) { menu_refresh(&race_menu, FALSE); menu = &class_menu; command = CMD_CHOOSE_CLASS; } if (current_stage > BIRTH_CLASS_CHOICE) { menu_refresh(&class_menu, FALSE); menu = &roller_menu; command = CMD_NULL; } next = menu_question(current_stage, menu, command); if (next == BIRTH_BACK) next = current_stage - 1; /* Make sure that the character gets reset before quickstarting */ if (next == BIRTH_QUICKSTART) next = BIRTH_RESET; break; } case BIRTH_POINTBASED: { roller = BIRTH_POINTBASED; if (prev > BIRTH_POINTBASED) point_based_start(); next = point_based_command(); if (next == BIRTH_BACK) next = BIRTH_ROLLER_CHOICE; if (next != BIRTH_POINTBASED) point_based_stop(); break; } case BIRTH_ROLLER: { roller = BIRTH_ROLLER; next = roller_command(prev < BIRTH_ROLLER); if (next == BIRTH_BACK) next = BIRTH_ROLLER_CHOICE; break; } case BIRTH_NAME_CHOICE: { if (prev < BIRTH_NAME_CHOICE) display_player(0); next = get_name_command(); if (next == BIRTH_BACK) next = roller; break; } case BIRTH_FINAL_CONFIRM: { if (prev < BIRTH_FINAL_CONFIRM) display_player(0); next = get_confirm_command(); if (next == BIRTH_BACK) next = BIRTH_NAME_CHOICE; break; } default: { /* Remove dodgy compiler warning, */ } } prev = current_stage; current_stage = next; return 0; } /* * Called when we enter the birth mode - so we set up handlers, command hooks, * etc, here. */ static void ui_enter_birthscreen(game_event_type type, game_event_data *data, void *user) { /* Set the ugly static global that tells us if quickstart's available. */ quickstart_allowed = data->flag; setup_menus(); } static void ui_leave_birthscreen(game_event_type type, game_event_data *data, void *user) { free_birth_menus(); } void ui_init_birthstate_handlers(void) { event_add_handler(EVENT_ENTER_BIRTH, ui_enter_birthscreen, NULL); event_add_handler(EVENT_LEAVE_BIRTH, ui_leave_birthscreen, NULL); } angband-v3.3.2/src/button.h0000644000175000017500000000103711651552410015063 0ustar chriscchrisc/* button.h - button interface */ #ifndef BUTTON_H #define BUTTON_H int button_add_text(const char *label, unsigned char keypress); int button_add(const char *label, unsigned char keypress); void button_backup_all(void); void button_restore(void); int button_kill_text(unsigned char keypress); int button_kill(unsigned char keypress); void button_kill_all(void); void button_init(button_add_f add, button_kill_f kill); void button_free(void); char button_get_key(int x, int y); size_t button_print(int row, int col); #endif /* !BUTTON_H */ angband-v3.3.2/src/nds/0000755000175000017500000000000011651552410014162 5ustar chriscchriscangband-v3.3.2/src/nds/ds_win.h0000644000175000017500000000506411651552410015623 0ustar chriscchrisc #ifndef DS_WIN_H #define DS_WIN_H //#include "hack.h" extern struct window_procs nds_procs; extern bool nds_draw_text; extern u8 nds_updated; /* typedef struct NDS_MENU_ITEM_STRUCT{ struct NDS_MENU_ITEM_STRUCT* n; u8 acc, gacc; char title[80]; menu_item mi; } nds_nhmenuitem; typedef struct { nds_nhmenuitem* f; nds_nhmenuitem* l; //char prompt[BUFSZ]; u8 width; } nds_nhmenu; typedef struct { u16 type; u16 cx, cy; // in chars/tiles u16 x, y; // in chars/tiles #define wrote_this_turn x // WIN_MESSAGE only #define center_x x // WIN_MAP only #define center_y y // WIN_MAP only // for compatibility with old ds_gfx.c: //#define center_pos x // WIN_MAP only nds_nhmenu m; u16* data; // what to draw on the screen u16* text; // text buffer for later display (NHW_MENU, NHW_TEXT) u16 cols, rows; boolean vis; } nds_nhwindow; #define MAX_WINDOWS 8 // if you change this, you must also change the size // of nds_updated in this file and ds_winhelp.c extern nds_nhwindow wins[MAX_WINDOWS]; // only need WIN_TEXT for windows 3-7 = 0x014000 bytes // WIN_TEXT(0) = 0x06874000 - 0x06878000, WIN_TEXT(3) = 0x06880000 - 0x06884000, // WIN_TEXT(7) = 0x06890000 - 0x06894000 // memory used is vram banks E & F #define WIN_TEXT(w) ((u16*)(0x06874000 + (0x4000 * (w)))) */ #define MAX_EBUF 512 // max of 512 events in queue = 1024 bytes #define MEVENT_FLAG (1<<15) #define EVENT_SET (1<<14) #define EVENT_X(e) ((u8)((e) & 0x7F)) #define EVENT_Y(e) ((u8)(((e) & 0xF8) >> 7)) #define EVENT_C(e) ((u8)((e) & 0xFF)) #define IS_MEVENT(e) ((e) & MEVENT_FLAG) #define MORE_MSG "--More--" #define MORE_LEN 8 #define LINE_LEN 85 #define LINE_LIMIT ((LINE_LEN)-(MORE_LEN)) extern short glyph2tile[]; bool has_event(); u16 get_event(); void put_key_event(u8 c); void put_mouse_event(u8 x, u8 y); //winid find_unused_window(int dir); void more_print(const char*); //void nds_win_updated(winid); void do_more(); void nds_raw_print(const char *); void nds_raw_print_bold(const char *); //void nds_putstr(winid, int, const char *); //void nds_clear_nhwindow(winid); int nds_nhgetch(void); //void nds_curs(winid, int, int); void nds_getlin2(const char*, char*, int); //winid nds_create_nhwindow(int); //void nds_destroy_nhwindow(winid); //void nds_display_nhwindow(winid, BOOLEAN_P); //void nds_start_menu(winid); //void nds_add_menu(winid, int, const ANY_P *, CHAR_P, CHAR_P, int, const char *, BOOLEAN_P); //void nds_end_menu(winid, const char*); //int nds_select_menu(winid, int, menu_item**); //void nds_free_menu(winid); void nds_exit_nhwindows(const char *); #endif angband-v3.3.2/src/nds/Makefile.arm70000644000175000017500000001245511651552410016476 0ustar chriscchrisc#------------------------------------------------------------------------------ .SUFFIXES: #------------------------------------------------------------------------------ ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") endif include $(DEVKITARM)/ds_rules #------------------------------------------------------------------------------ # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files # DATA is a list of directories containing binary files # all directories are relative to this makefile # IN THIS MODIFIED VERSION, YOU MAY ONLY HAVE ONE SOURCE DIRECTORY!! #------------------------------------------------------------------------------ TARGET := $(NAME) BUILD := $(CURDIR) SOURCES := $(CURDIR)/nds #INCLUDES := sys/nds/arm7/include INCLUDES := DATA := #------------------------------------------------------------------------------ # any extra libraries we wish to link with the project #------------------------------------------------------------------------------ LIBS := -lnds7 #------------------------------------------------------------------------------ # list of directories containing libraries, this must be the top level # containing include and lib #------------------------------------------------------------------------------ LIBDIRS := $(LIBNDS) #------------------------------------------------------------------------------ # no real need to edit anything past this point unless you need to add # additional rules for different file extensions #------------------------------------------------------------------------------ export ARM7BIN := $(BUILD)/$(TARGET).arm7 export ARM7ELF := $(BUILD)/$(TARGET).arm7.elf export DEPSDIR := $(BUILD) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ $(foreach dir,$(DATA),$(CURDIR)/$(dir)) CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) #------------------------------------------------------------------------------ # use CXX for linking C++ projects, CC for standard C #------------------------------------------------------------------------------ ifeq ($(strip $(CPPFILES)),) #------------------------------------------------------------------------------ export LD := $(CC) #------------------------------------------------------------------------------ else #------------------------------------------------------------------------------ export LD := $(CXX) #------------------------------------------------------------------------------ endif #------------------------------------------------------------------------------ export OFILES := $(addsuffix .o,$(BINFILES)) \ $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ -I$(CURDIR)/$(BUILD) export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) #------------------------------------------------------------------------------ # options for code generation #------------------------------------------------------------------------------ ARCH := -mthumb -mthumb-interwork # note: arm9tdmi isn't the correct CPU arch, but anything newer and LD # *insists* it has a FPU or VFP, and it won't take no for an answer! CFLAGS := -g -Wall -O2\ -mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer\ -ffast-math \ $(ARCH) CFLAGS += $(INCLUDE) -DARM7 CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions ASFLAGS := -g $(ARCH) LDFLAGS = -specs=ds_arm7.specs -g $(ARCH) -mno-fpu -Wl,-Map,$(BUILD)/$(TARGET).arm7.map .PHONY: all clean #------------------------------------------------------------------------------ clean: @echo clean ... @rm -fr $(BUILD)/$(TARGET).arm7 $(BUILD)/$(TARGET).arm7.elf #------------------------------------------------------------------------------ DEPENDS := $(OFILES:.o=.d) #------------------------------------------------------------------------------ # main targets #------------------------------------------------------------------------------ all : $(ARM7BIN) $(ARM7BIN) : $(ARM7ELF) @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) $(ARM7ELF) : $(foreach ofile,$(OFILES),$(BUILD)/$(ofile)) @echo linking $(notdir $@) @$(LD) $(LDFLAGS) $(foreach ofile,$(OFILES),$(BUILD)/$(ofile)) \ $(LIBPATHS) $(LIBS) -o $@ $(BUILD)/%.o : $(SOURCES)/%.c @echo $(notdir $<) $(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@ #------------------------------------------------------------------------------ # you need a rule like this for each extension you use as binary data #------------------------------------------------------------------------------ %.bin.o : %.bin #------------------------------------------------------------------------------ @echo $(notdir $<) @$(bin2o) -include $(DEPENDS) #------------------------------------------------------------------------------angband-v3.3.2/src/nds/ds_main.h0000644000175000017500000000035411651552410015747 0ustar chriscchrisc #ifndef DS_MAIN_H #define DS_MAIN_H #include #include "ds_gfx.h" #include "ds_win.h" #include "ds_io.h" #include "ds_kbd.h" #include "ds_btn.h" extern u8 nds_ascii_graphics; void do_vblank(); void nds_debug_print(); #endif angband-v3.3.2/src/nds/Makefile.arm90000644000175000017500000001406311651552410016475 0ustar chriscchrisc#------------------------------------------------------------------------------ .SUFFIXES: #------------------------------------------------------------------------------ ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") endif include $(DEVKITARM)/ds_rules #------------------------------------------------------------------------------ # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files # DATA is a list of directories containing binary files # all directories are relative to this makefile # IN THIS MODIFIED VERSION, YOU MAY ONLY HAVE ONE SOURCE DIRECTORY!! # OTHERSRC is sources that must be linked against but not compiled here #------------------------------------------------------------------------------ TARGET := $(NAME) BUILD := $(CURDIR) SOURCES := $(CURDIR) #NRM OTHERSRC := $(CURDIR) #NRM INCLUDES := sys/nds/arm9/include include DATA := #------------------------------------------------------------------------------ # any extra libraries we wish to link with the project #------------------------------------------------------------------------------ LIBS := -lfat -lnds9 #------------------------------------------------------------------------------ # list of directories containing libraries, this must be the top level # containing include and lib #------------------------------------------------------------------------------ LIBDIRS := $(LIBNDS) $(DEVKITPRO)/libfat-nds #------------------------------------------------------------------------------ # no real need to edit anything past this point unless you need to add # additional rules for different file extensions #------------------------------------------------------------------------------ export ARM9BIN := $(BUILD)/$(TARGET).arm9 export ARM9ELF := $(BUILD)/$(TARGET).arm9.elf #NRM export DEPSDIR := $(BUILD) export DEPSDIR := export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ $(foreach dir,$(DATA),$(CURDIR)/$(dir)) #NRM CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) #NRM CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) #NRM SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) #NRM BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) #NRM OTHERC := $(foreach dir,$(OTHERSRC),$(notdir $(wildcard $(dir)/*.c))) #------------------------------------------------------------------------------ # use CXX for linking C++ projects, CC for standard C #------------------------------------------------------------------------------ ifeq ($(strip $(CPPFILES)),) #------------------------------------------------------------------------------ export LD := $(CC) #------------------------------------------------------------------------------ else #------------------------------------------------------------------------------ export LD := $(CXX) #------------------------------------------------------------------------------ endif #------------------------------------------------------------------------------ BASEOBJS := $(ANGFILES) ZOBJS := $(ZFILES) # Note dependencies $(BASEOBJS): $(HEADERS) $(ZOBJS): $(HDRS) BASEOBJS += $(ZOBJS) main-nds.o z-form.o: z-form.h z-util.h z-virt.h z-rand.o: z-rand.h z-term.o: z-term.h z-virt.h z-util.o: z-util.h z-virt.o: z-virt.h z-util.h z-file.o: z-file.h OFILES := $(BASEOBJS) export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ -I$(CURDIR)/$(BUILD) export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) #------------------------------------------------------------------------------ # options for code generation #------------------------------------------------------------------------------ ARCH := -mthumb -mthumb-interwork # note: arm9tdmi isn't the correct CPU arch, but anything newer and LD # *insists* it has a FPU or VFP, and it won't take no for an answer! CFLAGS := -g -Wall -O2\ -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\ -ffast-math \ $(ARCH) CFLAGS += $(INCLUDE) -DARM9 -DNDS #NRM CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions ASFLAGS := -g $(ARCH) LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -mno-fpu -Wl,-Map,$(BUILD)/$(TARGET).arm9.map .PHONY: all clean #------------------------------------------------------------------------------ clean: @echo clean ... @rm -fr $(BUILD)/$(TARGET).arm9 $(BUILD)/$(TARGET).arm9.elf #------------------------------------------------------------------------------ DEPENDS := $(OFILES:.o=.d) #------------------------------------------------------------------------------ # main targets #------------------------------------------------------------------------------ all : $(ARM9BIN) $(ARM9BIN) : $(ARM9ELF) #NRM @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) $(ARM9ELF) : $(foreach ofile,$(OFILES),$(BUILD)/$(ofile)) $(foreach ofile,$(OTHEROBJ),$(BUILD)/$(ofile)) @echo linking $(notdir $@) @$(LD) $(LDFLAGS) $(foreach ofile,$(OFILES),$(BUILD)/$(ofile)) \ $(foreach ofile,$(OTHEROBJ),$(BUILD)/$(ofile)) \ $(LIBPATHS) $(LIBS) -o $@ $(BUILD)/%.o : $(SOURCES)/%.c @echo hello @echo $(notdir $<) @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@ #NRM $(BUILD)/%.o : $(SOURCES)/%.s #NRM @echo $(notdir $<) #NRM @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d -x assembler-with-cpp \ #NRM $(ASFLAGS) -c $< -o $@ #------------------------------------------------------------------------------ # you need a rule like this for each extension you use as binary data #------------------------------------------------------------------------------ %.bin.o : %.bin #------------------------------------------------------------------------------ @echo $(notdir $<) @$(bin2o) -include $(DEPENDS) #------------------------------------------------------------------------------angband-v3.3.2/src/nds/ds_errfont.h0000644000175000017500000014072111651552410016505 0ustar chriscchrisc#ifndef DS_ERRFONT_H #define DS_ERRFONT_H const u16 ds_subfont[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffe0, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0x001f, 0xffff, 0xffe0, 0x001f, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0x001f, 0xffff, 0xffe0, 0x001f, 0x7c1f, 0x7c00, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffe0, 0x7c00, 0x0000, 0xffff, 0xffff, 0x0000, 0xffe0, 0x7c1f, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x001f, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x7c00, 0x0000, 0xffff, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x7c00, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c00, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x001f, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x7c00, 0xffe0, 0x0000, 0xffff, 0x0000, 0x001f, 0x0000, 0x7c00, 0x001f, 0x0000, 0x7c00, 0x0000, 0xffff, 0x0000, 0xffe0, 0x001f, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0x001f, 0xffff, 0xffe0, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x001f, 0x7c00, 0xffff, 0xffff, 0xffe0, 0x0000, 0x001f, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x001f, 0x7c00, 0x0000, 0xffff, 0xffff, 0xffe0, 0x001f, 0x7c00, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c1f, 0x7c00, 0xffff, 0x0000, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffe0, 0x001f, 0x7c1f, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c1f, 0x7c00, 0x001f, 0x7c1f, 0x7c00, 0xffff, 0xffff, 0xffe0, 0x001f, 0x7c1f, 0x7c00, 0xffff, 0xffff, 0xffe0, 0x001f, 0x7c1f, 0x7c00, 0x001f, 0x7c1f, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffe0, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffe0, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c00, 0xffe0, 0xffe0, 0x7c1f, 0x7c00, 0xffff, 0xffff, 0x0000, 0x0000, 0xffe0, 0xffe0, 0x001f, 0x7c1f, 0xffe0, 0xffff, 0x001f, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0x7c1f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0x7c00, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x001f, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffe0, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c00, 0xffe0, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x7c00, 0x001f, 0x7c00, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c1f, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0xffe0, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c1f, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c1f, 0xffff, 0xffff, 0x7c1f, 0xffff, 0xffff, 0x7c1f, 0xffff, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c1f, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x001f, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c1f, 0xffff, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffe0, 0xffff, 0x7c1f, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffe0, 0xffe0, 0xffff, 0x0000, 0xffe0, 0xffff, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c1f, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffe0, 0xffff, 0x0000, 0xffe0, 0xffff, 0xffe0, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffff, 0xffe0, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x001f, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffff, 0x001f, 0xffe0, 0x0000, 0xffff, 0xffff, 0xffe0, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffe0, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffff, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0xffff, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffe0, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0xffff, 0xffe0, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x001f, 0x7c1f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffff, 0x0000, 0xffff, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0xffe0, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x0000, 0xffff, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffe0, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffe0, 0xffe0, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0xffff, 0x7c1f, 0x7c00, 0xffff, 0x7c1f, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c1f, 0x7c00, 0xffff, 0x7c1f, 0x7c00, 0xffff, 0x7c1f, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffff, 0x0000, 0xffff, 0xffe0, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffe0, 0xffe0, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0x7c1f, 0x7c00, 0x001f, 0x7c00, 0x0000, 0xffff, 0xffe0, 0x0000, 0x001f, 0x7c00, 0x0000, 0xffff, 0xffe0, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x001f, 0x7c00, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x7c00, 0xffff, 0x001f, 0x7c00, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0x7c00, 0x0000, 0x0000, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x001f, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c00, 0xffe0, 0xffe0, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0x7c00, 0xffe0, 0xffe0, 0xffff, 0x0000, 0xffff, 0x7c00, 0xffe0, 0xffff, 0xffe0, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x001f, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffe0, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0x7c00, 0xffe0, 0x001f, 0x7c00, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x001f, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffff, 0xffe0, 0x001f, 0x0000, 0xffe0, 0xffe0, 0x001f, 0x7c00, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x001f, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0x7c1f, 0x7c00, 0x001f, 0xffff, 0x7c00, 0xffe0, 0xffff, 0xffe0, 0x0000, 0x001f, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffe0, 0xffff, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7c00, 0xffe0, 0xffe0, 0x001f, 0x0000, 0x0000, 0x7c00, 0xffe0, 0xffe0, 0x001f, 0x0000, 0x0000, 0x7c00, 0xffe0, 0xffe0, 0x001f, 0x0000, 0x0000, 0x7c00, 0xffe0, 0xffe0, 0x001f, 0x0000, 0x001f, 0xffe0, 0x7c1f, 0xffe0, 0x7c1f, 0xffe0, 0x001f, 0xffe0, 0x7c1f, 0xffe0, 0x7c1f, 0xffe0, 0x001f, 0xffe0, 0x7c1f, 0xffe0, 0x7c1f, 0xffe0, 0x001f, 0xffe0, 0x7c1f, 0xffe0, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffff, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffff, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffe0, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffff, 0xffe0, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0x7c00, 0xffff, 0xffff, 0xffe0, 0x001f, 0xffe0, 0xffe0, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0x7c00, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffe0, 0x001f, 0x7c00, 0x0000, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c1f, 0x7c00, 0x001f, 0x7c1f, 0x7c00, 0x001f, 0x7c1f, 0x7c00, 0x001f, 0x001f, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x001f, 0xffe0, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0xffff, 0x7c1f, 0x7c00, 0xffff, 0x7c1f, 0x7c00, 0x001f, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffe0, 0x0000, 0x001f, 0xffff, 0x7c00, 0xffff, 0xffe0, 0xffe0, 0xffff, 0xffe0, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffe0, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0x7c1f, 0x7c00, 0xffff, 0x7c1f, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x0000, 0xffe0, 0xffff, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c1f, 0xffe0, 0xffe0, 0xffe0, 0xffff, 0xffe0, 0xffe0, 0xffff, 0xffff, 0x7c1f, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x001f, 0xffff, 0x7c00, 0xffe0, 0xffff, 0xffe0, 0xffff, 0xffe0, 0xffe0, 0x001f, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0xffff, 0x7c00, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x001f, 0xffff, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x001f, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffe0, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0xffff, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x001f, 0xffe0, 0xffe0, 0xffff, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x7c00, 0x001f, 0x7c00, 0xffe0, 0x0000, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0x0000, 0x001f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0xffff, 0x7c1f, 0xffe0, 0x001f, 0xffff, 0xffe0, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x001f, 0x7c1f, 0x7c00, 0x001f, 0x7c1f, 0x7c00, 0x001f, 0x7c1f, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x7c00, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffff, 0x7c00, 0x001f, 0xffff, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; #endif angband-v3.3.2/src/nds/ds_kbd.h0000644000175000017500000000113111651552410015555 0ustar chriscchrisc #ifndef DS_KBD_H #define DS_KBD_H /*#include "kbd_bin.h" #include "kbd_s_bin.h"*/ typedef struct { u16 width; u16 code; } nds_kbd_key; void redraw_kbd(int); void kbd_init(); u16 kbd_xy2key(u8 x, u8 y); void kbd_togglemod(int which, int how); void kbd_set_color_from_pos(u16 r, u16 k,u8 color); void kbd_set_color_from_code(u16 code,u8 color); #define K_MODIFIER 0x100 // if set: it's shift or ctrl or alt #define K_CAPS 0x101 #define K_SHIFT 0x102 #define K_CTRL 0x103 #define K_ALT 0x104 #define K_F(n) (0x200 + n) #define K_SHIFTED_MOVE 0x0200 #endif angband-v3.3.2/src/nds/ds_io.h0000644000175000017500000000535011651552410015433 0ustar chriscchrisc #ifndef DS_FILEIO_H #define DS_FILEIO_H // guarantee that this file will be included before the #defs #include //#include "nds.h" /*#define BG_GFX_SUB ((unsigned short*)0x6200000) #define RGB15(r,g,b) ((r)|((g)<<5)|((b)<<10)) extern int vram_pos; #define D(s) BG_GFX_SUB[vram_pos++] = RGB15(0,31,31) | (1<<15); #define F(x,y) BG_GFX_SUB[y*256*2+x*2] = RGB15(31,0,0) | (1<<15); #define G(x,y,r,g,b) BG_GFX_SUB[y*256*2+x*2] = RGB15(r,g,b) | (1<<15);*/ # define NDECL(f) f() # define FDECL(f,p) f() # define VDECL(f,p) f() /* #define fopen ds_fopen #define fclose ds_fclose #define fseek ds_fseek #define rewind ds_rewind #define fgetc ds_fgetc #define fgets ds_fgets #define fread ds_fread */ #define open ds_open #define close ds_close #define creat ds_creat #define lseek ds_lseek #define read ds_read #define sopen ds_sopen #define write ds_write // I wish I knew a better way to do this... /* #define ftell ds_ftell #define fputc ds_fputc #define fputs ds_fputs #define fwrite ds_fwrite #define fscanf ds_fscanf #define fprintf ds_fprintf #define vfprintf ds_vfprintf #define access ds_access #define unlink ds_unlink #define getuid ds_getuid #define getgid ds_getgid #define getpid ds_getpid #define time ds_time #define getenv ds_getenv #define freopen(a,b,c) ds_open(a,b) */ //#define EOF -1 #define E extern E void VDECL(error, (const char *,...)); //PRINTF_F(1,2); E void FDECL(regularize, (char *)); E char* FDECL(get_username, (int *)); E FILE* FDECL(ds_fopen, (const char *, const char *)); E int FDECL(ds_fclose, (FILE *)); E long FDECL(ds_ftell, (FILE *)); E int FDECL(ds_fseek, (FILE *, long, int)); E void FDECL(ds_rewind, (FILE *)); E int FDECL(ds_fgetc, (FILE *)); E int FDECL(ds_fputc, (int, FILE *)); E char* FDECL(ds_fgets, (char *, int, FILE *)); E int FDECL(ds_fputs, (const char *, FILE *)); E int FDECL(ds_fread, (void *, size_t, size_t, FILE *)); E int FDECL(ds_fwrite, (const void *, size_t, size_t, FILE *)); E int VDECL(ds_fscanf, (FILE *, const char *, ...)); E int VDECL(ds_fprintf, (FILE *, const char *, ...)); //PRINTF_F(2,3); E int FDECL(ds_vfprintf, (FILE *, const char *, va_list)); E int FDECL(ds_access, (const char *, int)); E int FDECL(ds_close, (int)); E int FDECL(ds_creat, (const char *, int)); E off_t FDECL(ds_lseek, (int, off_t, int)); E int FDECL(ds_open, (const char *, int, int)); E int FDECL(ds_read, (int, void *, unsigned int)); E int FDECL(ds_sopen, (const char *, int, int, int)); E int FDECL(ds_unlink, (const char *)); E int FDECL(ds_write, (int, const void *, unsigned int)); E int NDECL(ds_getuid); E int NDECL(ds_getgid); E int NDECL(ds_getpid); E time_t FDECL(ds_time, (time_t *)); E struct tm* FDECL(ds_localtime, (time_t *)); E char* FDECL(ds_getenv, (const char*)); #endif angband-v3.3.2/src/nds/arm7_main.c0000644000175000017500000001367011651552410016207 0ustar chriscchrisc/*--------------------------------------------------------------------------------- $Id: template.c,v 1.2 2005/09/07 20:06:06 wntrmute Exp $ Simple ARM7 stub (sends RTC, TSC, and X/Y data to the ARM 9) $Log: template.c,v $ Revision 1.2 2005/09/07 20:06:06 wntrmute updated for latest libnds changes Revision 1.8 2005/08/03 05:13:16 wntrmute corrected sound code ---------------------------------------------------------------------------------*/ #include #include #include #include s32 xscale, yscale, xoffset, yoffset; #define abs(n) (n<0?-n:n) //--------------------------------------------------------------------------------- s32 myReadTouchValue(int measure, int retry , int range) { //--------------------------------------------------------------------------------- int i; s32 this_value=0, this_range; s32 last_value = touchRead(measure | 1); for ( i=0; i < retry; i++) { touchRead(measure | 1); this_value = touchRead(measure); this_range = abs(last_value - this_value); if (this_range <= range) break; } if ( i == range) this_value = 0; return this_value; } //*/ //--------------------------------------------------------------------------------- void VblankHandler(void) { //--------------------------------------------------------------------------------- u32 temp=0; if (IPC->mailData == 0xDEADC0DE) { SerialWaitBusy(); REG_SPICNT = SPI_ENABLE | SPI_DEVICE_POWER | SPI_BAUD_1MHz | SPI_CONTINUOUS; REG_SPIDATA = 0x80; SerialWaitBusy(); REG_SPICNT = SPI_ENABLE | SPI_DEVICE_POWER | SPI_BAUD_1MHz; REG_SPIDATA = 0; SerialWaitBusy(); temp = REG_SPIDATA & 0xFF; REG_SPICNT = SPI_ENABLE | SPI_DEVICE_POWER | SPI_BAUD_1MHz | SPI_CONTINUOUS; REG_SPIDATA = 0; SerialWaitBusy(); REG_SPICNT = SPI_ENABLE | SPI_DEVICE_POWER | SPI_BAUD_1MHz; REG_SPIDATA = temp | PM_SYSTEM_PWR; } static int heartbeat = 0; u16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0, batt=0, aux=0; s32 t1=0, t2=0; u8 ct[sizeof(IPC->time.curtime)]; u32 i; // Update the heartbeat heartbeat++; // Read the touch screen but = REG_KEYXY; #define REPEATS 9 if (!(but & (1<<6))) { /* s16 xarr[REPEATS], yarr[REPEATS]; u16 xtop=0, ytop=0, xbtm=0, ybtm=0, i,j; for (i=0;i xarr[xtop]) xtop = i; } if (yarr[i] != -1) { if (yarr[i] < yarr[ybtm]) ybtm = i; if (yarr[i] > yarr[ytop]) ytop = i; } } xarr[xtop]=xarr[xbtm]=yarr[ytop]=yarr[ybtm]=-1; xtop=ytop=xbtm=ybtm=0; while (xarr[xtop] == -1) xtop++; while (xarr[ytop] == -1) ytop++; xbtm = xtop; ybtm = ytop; } for (i=0;i>1) ) >>19; ypx = ( y * yscale - yoffset + (yscale>>1) ) >>19; if ( xpx < 0) xpx = 0; if ( ypx < 0) ypx = 0; if ( xpx > (SCREEN_WIDTH -1)) xpx = SCREEN_WIDTH -1; if ( ypx > (SCREEN_HEIGHT -1)) ypx = SCREEN_HEIGHT -1;//*/ /* touchPosition tempPos = touchReadXY(); x = tempPos.x; y = tempPos.y; xpx = tempPos.px; ypx = tempPos.py;//*/ } #undef REPEATS z1 = touchRead(TSC_MEASURE_Z1); z2 = touchRead(TSC_MEASURE_Z2); batt = touchRead(TSC_MEASURE_BATTERY); aux = touchRead(TSC_MEASURE_AUX); // Read the time rtcGetTime((uint8 *)ct); BCDToInteger((uint8 *)&(ct[1]), 7); // Read the temperature temp = touchReadTemperature(&t1, &t2); // Update the IPC struct // IPC->heartbeat = heartbeat; IPC->buttons = but; IPC->touchX = x; IPC->touchY = y; IPC->touchXpx = xpx; IPC->touchYpx = ypx; IPC->touchZ1 = z1; IPC->touchZ2 = z2; IPC->battery = batt; IPC->aux = aux; for(i=0; itime.curtime[i] = ct[i]; } IPC->temperature = temp; IPC->tdiode1 = t1; IPC->tdiode2 = t2; //sound code :) /*TransferSound *snd = IPC->soundData; IPC->soundData = 0; if (0 != snd) { for (i=0; icount; i++) { s32 chan = getFreeSoundChannel(); if (chan >= 0) { startSound(snd->data[i].rate, snd->data[i].data, snd->data[i].len, chan, snd->data[i].vol, snd->data[i].pan, snd->data[i].format); } } }*/ } //--------------------------------------------------------------------------------- int main(int argc, char ** argv) { //--------------------------------------------------------------------------------- // Reset the clock if needed rtcReset(); xscale = ((PersonalData->calX2px - PersonalData->calX1px) << 19) / ((PersonalData->calX2) - (PersonalData->calX1)); yscale = ((PersonalData->calY2px - PersonalData->calY1px) << 19) / ((PersonalData->calY2) - (PersonalData->calY1)); xoffset = ((PersonalData->calX1 + PersonalData->calX2) * xscale - ((PersonalData->calX1px + PersonalData->calX2px) << 19) ) /2; yoffset = ((PersonalData->calY1 + PersonalData->calY2) * yscale - ((PersonalData->calY1px + PersonalData->calY2px) << 19) ) /2; //*/ //enable sound // powerON(POWER_SOUND); // SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F); // IPC->soundData = 0; while (IPC->mailData != 0x00424242); // wait for arm9 init // check if it is running on DS Lite or not SerialWaitBusy(); REG_SPICNT = SPI_ENABLE | SPI_DEVICE_POWER | SPI_BAUD_1MHz | SPI_CONTINUOUS; REG_SPIDATA = 0x80; SerialWaitBusy(); REG_SPICNT = SPI_ENABLE | SPI_DEVICE_POWER | SPI_BAUD_1MHz; REG_SPIDATA = 0; SerialWaitBusy(); // bit 6 set means it's a DS lite if((REG_SPIDATA & BIT(6))) { IPC->mailData = 0x42424201; } else { IPC->mailData = 0x42424200; } irqInit(); irqSet(IRQ_VBLANK, VblankHandler); irqEnable(IRQ_VBLANK); // Keep the ARM7 out of main RAM while (1) swiWaitForVBlank(); } angband-v3.3.2/src/nds/ds_gfx.h0000644000175000017500000000175511651552410015615 0ustar chriscchrisc #ifndef DS_GFX_H #define DS_GFX_H //NRM #include "hack.h" /*#include "tiles_bin.h" #include "subfont_rgb_bin.h" #include "subfont_bgr_bin.h"*/ #define C_RED 0x1 #define C_GREEN 0x2 #define C_BLUE 0x4 #define C_BRIGHT 0x8 extern u16b* tiles_bin; // rambank A + BG2(96k) + event queue(1k) // tiles_bin extends thru most of rambank B // the subscreen uses up all of rambank C extern u16b* subfont_rgb_bin; // rambank D extern u16b* subfont_bgr_bin; // rambank D + font_rgb(16k) extern int total_tiles_used; // y + 32 = draw on subscreen void draw_tile(byte x, byte y, u16b tile); void draw_char(byte x, byte y, char c); void draw_color_char(byte x, byte y, char c, byte clr); void draw_curs(byte x, byte y); //NRM void draw_win_string(winid win, const char* s); //NRM void render_window(winid win); void render_all_windows(); void nds_init_fonts(); bool nds_load_kbd(); // now this is just kbd gfx bool nds_load_tiles(); void swap_font(bool bottom); void nds_fatal_err(const char* msg); #endif angband-v3.3.2/src/nds/ds_btn.h0000644000175000017500000000032311651552410015602 0ustar chriscchrisc #ifndef DS_BTN_H #define DS_BTN_H s16 nds_buttons_to_btnid(u16 kd, u16 kh); void nds_btn_vblank(); void nds_assign_button(); void nds_check_buttons(u16 kd, u16 kh); void nds_init_buttons(); #endif angband-v3.3.2/src/ui.c0000644000175000017500000001245711651552410014170 0ustar chriscchrisc/* * File: ui.c * Purpose: Generic ui functions * * Copyright (c) 2007 Pete Mack and others. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "z-textblock.h" /* =================== GEOMETRY ================= */ region region_calculate(region loc) { int w, h; Term_get_size(&w, &h); if (loc.col < 0) loc.col += w; if (loc.row < 0) loc.row += h; if (loc.width <= 0) loc.width += w - loc.col; if (loc.page_rows <= 0) loc.page_rows += h - loc.row; return loc; } void region_erase_bordered(const region *loc) { region calc = region_calculate(*loc); int i = 0; calc.col = MAX(calc.col - 1, 0); calc.row = MAX(calc.row - 1, 0); calc.width += 2; calc.page_rows += 2; for (i = 0; i < calc.page_rows; i++) Term_erase(calc.col, calc.row + i, calc.width); } void region_erase(const region *loc) { region calc = region_calculate(*loc); int i = 0; for (i = 0; i < calc.page_rows; i++) Term_erase(calc.col, calc.row + i, calc.width); } bool region_inside(const region *loc, const ui_event *key) { if ((loc->col > key->mouse.x) || (loc->col + loc->width <= key->mouse.x)) return FALSE; if ((loc->row > key->mouse.y) || (loc->row + loc->page_rows <= key->mouse.y)) return FALSE; return TRUE; } /*** Text display ***/ static void display_area(const char *text, const byte *attrs, size_t *line_starts, size_t *line_lengths, size_t n_lines, region area, size_t line_from) { size_t i, j; n_lines = MIN(n_lines, (size_t) area.page_rows); for (i = 0; i < n_lines; i++) { Term_erase(area.col, area.row + i, area.width); for (j = 0; j < line_lengths[line_from + i]; j++) { Term_putch(area.col + j, area.row + i, attrs[line_starts[line_from + i] + j], text[line_starts[line_from + i] + j]); } } } void textui_textblock_place(textblock *tb, region orig_area, const char *header) { const char *text = textblock_text(tb); const byte *attrs = textblock_attrs(tb); /* xxx on resize this should be recalculated */ region area = region_calculate(orig_area); size_t *line_starts = NULL, *line_lengths = NULL; size_t n_lines; n_lines = textblock_calculate_lines(tb, &line_starts, &line_lengths, area.width); area.page_rows--; if (n_lines > (size_t) area.page_rows) n_lines = area.page_rows; c_prt(TERM_L_BLUE, header, area.row, area.col); area.row++; display_area(text, attrs, line_starts, line_lengths, n_lines, area, 0); mem_free(line_starts); mem_free(line_lengths); } void textui_textblock_show(textblock *tb, region orig_area, const char *header) { const char *text = textblock_text(tb); const byte *attrs = textblock_attrs(tb); /* xxx on resize this should be recalculated */ region area = region_calculate(orig_area); size_t *line_starts = NULL, *line_lengths = NULL; size_t n_lines; n_lines = textblock_calculate_lines(tb, &line_starts, &line_lengths, area.width); screen_save(); /* make room for the header & footer */ area.page_rows -= 3; c_prt(TERM_L_BLUE, header, area.row, area.col); area.row++; if (n_lines > (size_t) area.page_rows) { int start_line = 0; c_prt(TERM_WHITE, "", area.row + area.page_rows, area.col); c_prt(TERM_L_BLUE, "(Up/down or ESCAPE to exit.)", area.row + area.page_rows + 1, area.col); /* Pager mode */ while (1) { struct keypress ch; display_area(text, attrs, line_starts, line_lengths, n_lines, area, start_line); ch = inkey(); if (ch.code == ARROW_UP) start_line--; else if (ch.code== ESCAPE || ch.code == 'q') break; else if (ch.code == ARROW_DOWN) start_line++; else if (ch.code == ' ') start_line += area.page_rows; if (start_line < 0) start_line = 0; if (start_line + (size_t) area.page_rows > n_lines) start_line = n_lines - area.page_rows; } } else { display_area(text, attrs, line_starts, line_lengths, n_lines, area, 0); c_prt(TERM_WHITE, "", area.row + n_lines, area.col); c_prt(TERM_L_BLUE, "(Press any key to continue.)", area.row + n_lines + 1, area.col); inkey(); } mem_free(line_starts); mem_free(line_lengths); screen_load(); return; } /*** Miscellaneous things ***/ /* * A Hengband-like 'window' function, that draws a surround box in ASCII art. */ void window_make(int origin_x, int origin_y, int end_x, int end_y) { int n; region to_clear; to_clear.col = origin_x; to_clear.row = origin_y; to_clear.width = end_x - origin_x; to_clear.page_rows = end_y - origin_y; region_erase(&to_clear); Term_putch(origin_x, origin_y, TERM_WHITE, '+'); Term_putch(end_x, origin_y, TERM_WHITE, '+'); Term_putch(origin_x, end_y, TERM_WHITE, '+'); Term_putch(end_x, end_y, TERM_WHITE, '+'); for (n = 1; n < (end_x - origin_x); n++) { Term_putch(origin_x + n, origin_y, TERM_WHITE, '-'); Term_putch(origin_x + n, end_y, TERM_WHITE, '-'); } for (n = 1; n < (end_y - origin_y); n++) { Term_putch(origin_x, origin_y + n, TERM_WHITE, '|'); Term_putch(end_x, origin_y + n, TERM_WHITE, '|'); } } angband-v3.3.2/src/store.h0000644000175000017500000000334511651552410014710 0ustar chriscchrisc#ifndef INCLUDED_STORE_H #define INCLUDED_STORE_H #include "object/obj-flag.h" #include "object/object.h" #include "parser.h" #define STORE_INVEN_MAX 24 /* Max number of discrete objs in inven */ #define STORE_TURNS 1000 /* Number of turns between turnovers */ #define STORE_SHUFFLE 25 /* 1/Chance (per day) of an owner changing */ #define STORE_MIN_KEEP 6 /* Min slots to "always" keep full (>0) */ #define STORE_MAX_KEEP 18 /* Max slots to "always" keep full ( 15 */ static double vgbow_total[MAX_LVL], vgbow_mon[MAX_LVL], vgbow_vault[MAX_LVL]; /* xtra might (longbow, crossbows) */ static double xmbow_total[MAX_LVL], xmbow_mon[MAX_LVL], xmbow_vault[MAX_LVL]; /* xtra shots (longbow crossbows) */ static double xsbow_total[MAX_LVL], xsbow_mon[MAX_LVL], xsbow_vault[MAX_LVL]; /* buckland */ static double bubow_total[MAX_LVL], bubow_mon[MAX_LVL], bubow_vault[MAX_LVL]; /* telep */ static double tebow_total[MAX_LVL], tebow_mon[MAX_LVL], tebow_vault[MAX_LVL]; /* cursed */ static double cubow_total[MAX_LVL], cubow_mon[MAX_LVL], cubow_vault[MAX_LVL]; /**** ARMOR *****/ static double arm_total[MAX_LVL], arm_mon[MAX_LVL], arm_vault[MAX_LVL]; /* bad average good */ static double bdarm_total[MAX_LVL], bdarm_mon[MAX_LVL], bdarm_vault[MAX_LVL]; static double avarm_total[MAX_LVL], avarm_mon[MAX_LVL], avarm_vault[MAX_LVL]; static double gdarm_total[MAX_LVL], gdarm_mon[MAX_LVL], gdarm_vault[MAX_LVL]; /* has str */ static double strarm_total[MAX_LVL], strarm_mon[MAX_LVL], strarm_vault[MAX_LVL]; /* has int */ static double intarm_total[MAX_LVL], intarm_mon[MAX_LVL], intarm_vault[MAX_LVL]; /* has wis */ static double wisarm_total[MAX_LVL], wisarm_mon[MAX_LVL], wisarm_vault[MAX_LVL]; /* has dex */ static double dexarm_total[MAX_LVL], dexarm_mon[MAX_LVL], dexarm_vault[MAX_LVL]; /* has con */ static double conarm_total[MAX_LVL], conarm_mon[MAX_LVL], conarm_vault[MAX_LVL]; /* has curse */ static double cuarm_total[MAX_LVL], cuarm_mon[MAX_LVL], cuarm_vault[MAX_LVL]; /* basic artifact info */ static double art_total[MAX_LVL], art_spec[MAX_LVL], art_norm[MAX_LVL]; /* artifact level info */ static double art_shal[MAX_LVL], art_ave[MAX_LVL], art_ood[MAX_LVL]; /* where normal artifacts come from */ static double art_mon[MAX_LVL], art_uniq[MAX_LVL], art_floor[MAX_LVL], art_vault[MAX_LVL], art_mon_vault[MAX_LVL]; /* consumables info */ /*POTIONS*/ static double pot_total[MAX_LVL], pot_mon[MAX_LVL], pot_vault[MAX_LVL]; /* stat gain */ static double gain_total[MAX_LVL], gain_mon[MAX_LVL], gain_vault[MAX_LVL]; /* healing */ static double bigheal_total[MAX_LVL], bigheal_mon[MAX_LVL], bigheal_vault[MAX_LVL]; /* restore mana */ static double rmana_total[MAX_LVL], rmana_mon[MAX_LVL], rmana_vault[MAX_LVL]; /*SCROLLS*/ /* scroll total */ static double scroll_total[MAX_LVL], scroll_mon[MAX_LVL], scroll_vault[MAX_LVL]; /* endgame scrolls, dest, ban, mass_ban, rune */ static double escroll_total[MAX_LVL], escroll_mon[MAX_LVL], escroll_vault[MAX_LVL]; /* acquirement scrolls */ static double acq_total[MAX_LVL], acq_mon[MAX_LVL], acq_vault[MAX_LVL]; /*RODS*/ /* rod total */ static double rod_total[MAX_LVL], rod_mon[MAX_LVL], rod_vault[MAX_LVL]; /*utility, dtrap, dstairs, dobj, light, illum*/ static double urod_total[MAX_LVL], urod_mon[MAX_LVL], urod_vault[MAX_LVL]; /*tele other*/ static double torod_total[MAX_LVL], torod_mon[MAX_LVL], torod_vault[MAX_LVL]; /*detect all */ static double drod_total[MAX_LVL], drod_mon[MAX_LVL], drod_vault[MAX_LVL]; /*endgame: speed, healing*/ static double erod_total[MAX_LVL], erod_mon[MAX_LVL], erod_vault[MAX_LVL]; /*STAVES*/ /*total*/ static double staff_total[MAX_LVL], staff_mon[MAX_LVL], staff_vault[MAX_LVL]; /* speed */ static double sstaff_total[MAX_LVL], sstaff_mon[MAX_LVL], sstaff_vault[MAX_LVL]; /* destruction */ static double dstaff_total[MAX_LVL], dstaff_mon[MAX_LVL], dstaff_vault[MAX_LVL]; /*dispelling, dispel evil, holiness, power */ static double kstaff_total[MAX_LVL], kstaff_mon[MAX_LVL], kstaff_vault[MAX_LVL]; /*powerful: healing, magi, banishment*/ static double pstaff_total[MAX_LVL], pstaff_mon[MAX_LVL], pstaff_vault[MAX_LVL]; /* WANDS */ /* total */ static double wand_total[MAX_LVL], wand_mon[MAX_LVL], wand_vault[MAX_LVL]; /* tele-other */ static double towand_total[MAX_LVL], towand_mon[MAX_LVL], towand_vault[MAX_LVL]; /* RINGS */ static double ring_total[MAX_LVL], ring_mon[MAX_LVL], ring_vault[MAX_LVL]; /* curse ring */ static double curing_total[MAX_LVL], curing_mon[MAX_LVL], curing_vault[MAX_LVL]; /* speed ring */ static double spring_total[MAX_LVL], spring_mon[MAX_LVL], spring_vault[MAX_LVL]; /* stat rings */ static double string_total[MAX_LVL], string_mon[MAX_LVL], string_vault[MAX_LVL]; /* r pois */ static double poring_total[MAX_LVL], poring_mon[MAX_LVL], poring_vault[MAX_LVL]; /* free action */ static double faring_total[MAX_LVL], faring_mon[MAX_LVL], faring_vault[MAX_LVL]; /* see inv */ static double siring_total[MAX_LVL], siring_mon[MAX_LVL], siring_vault[MAX_LVL]; /* branding rings */ static double brring_total[MAX_LVL], brring_mon[MAX_LVL], brring_vault[MAX_LVL]; /* elven rings */ static double elring_total[MAX_LVL], elring_mon[MAX_LVL], elring_vault[MAX_LVL]; /* the one ring */ static double onering_total[MAX_LVL], onering_mon[MAX_LVL], onering_vault[MAX_LVL]; /* amulets */ static double amu_total[MAX_LVL], amu_mon[MAX_LVL], amu_vault[MAX_LVL]; /* wisdom */ static double wisamu_total[MAX_LVL], wisamu_mon[MAX_LVL], wisamu_vault[MAX_LVL]; /* trickery, weaponmastery, or magi */ static double endamu_total[MAX_LVL], endamu_mon[MAX_LVL], endamu_vault[MAX_LVL]; /* telepathy */ static double teamu_total[MAX_LVL], teamu_mon[MAX_LVL], teamu_vault[MAX_LVL]; /* cursed */ static double cuamu_total[MAX_LVL], cuamu_mon[MAX_LVL], cuamu_vault[MAX_LVL]; /* AMMO */ static double ammo_total[MAX_LVL], ammo_mon[MAX_LVL], ammo_vault[MAX_LVL]; /* bad average good */ static double bdammo_total[MAX_LVL], bdammo_mon[MAX_LVL], bdammo_vault[MAX_LVL]; static double avammo_total[MAX_LVL], avammo_mon[MAX_LVL], avammo_vault[MAX_LVL]; static double gdammo_total[MAX_LVL], gdammo_mon[MAX_LVL], gdammo_vault[MAX_LVL]; /* ego ammo */ static double egammo_total[MAX_LVL], egammo_mon[MAX_LVL], egammo_vault[MAX_LVL]; /* very good ammo, seeker/mithril */ static double vgammo_total[MAX_LVL], vgammo_mon[MAX_LVL], vgammo_vault[MAX_LVL]; /* awesome ammo, seeker/mithril + brand */ static double awammo_total[MAX_LVL], awammo_mon[MAX_LVL], awammo_vault[MAX_LVL]; /* endgame ammo, seeker/mithril + slay evil */ static double evammo_total[MAX_LVL], evammo_mon[MAX_LVL], evammo_vault[MAX_LVL]; /* holy might ammo, seeker/mithril + slay evil */ static double hmammo_total[MAX_LVL], hmammo_mon[MAX_LVL], hmammo_vault[MAX_LVL]; /*** Prayer/spell BOOKS ***/ static double b1_total[MAX_LVL],b1_mon[MAX_LVL],b1_vault[MAX_LVL]; static double b2_total[MAX_LVL],b2_mon[MAX_LVL],b2_vault[MAX_LVL]; static double b3_total[MAX_LVL],b3_mon[MAX_LVL],b3_vault[MAX_LVL]; static double b4_total[MAX_LVL],b4_mon[MAX_LVL],b4_vault[MAX_LVL]; static double b5_total[MAX_LVL],b5_mon[MAX_LVL],b5_vault[MAX_LVL]; static double b6_total[MAX_LVL],b6_mon[MAX_LVL],b6_vault[MAX_LVL]; static double b7_total[MAX_LVL],b7_mon[MAX_LVL],b7_vault[MAX_LVL]; static double b8_total[MAX_LVL],b8_mon[MAX_LVL],b8_vault[MAX_LVL]; static double b9_total[MAX_LVL],b9_mon[MAX_LVL],b9_vault[MAX_LVL]; /* monster info */ static double mon_total[MAX_LVL], mon_ood[MAX_LVL], mon_deadly[MAX_LVL]; /* unique info */ static double uniq_total[MAX_LVL], uniq_ood[MAX_LVL], uniq_deadly[MAX_LVL]; static void init_iter_vals(int k) { art_it[k]=0; fa_it[k]=0, si_it[k]=0, po_it[k]=0, nx_it[k]=0; cf_it[k]=0, bl_it[k]=0, te_it[k]=0; mb1_it[k]=0, mb2_it[k]=0, mb3_it[k]=0; mb4_it[k]=0, mb5_it[k]=0, mb6_it[k]=0; mb7_it[k]=0, mb8_it[k]=0, mb9_it[k]=0; } /* set everything to 0.0 to begin */ static void init_stat_vals(int lvl) { gold_total[lvl] = 0.0; gold_floor[lvl] = 0.0; gold_mon[lvl] = 0.0; gold_wall[lvl] = 0.0; faeq_total[lvl] = 0.0; faeq_mon[lvl] = 0.0; faeq_vault[lvl] = 0.0; reeq_total[lvl] = 0.0; reeq_mon[lvl] = 0.0; reeq_vault[lvl] = 0.0; rbeq_total[lvl] = 0.0; rbeq_mon[lvl] = 0.0; rbeq_vault[lvl] = 0.0; poeq_total[lvl] = 0.0; poeq_mon[lvl] = 0.0; poeq_vault[lvl] = 0.0; nxeq_total[lvl] = 0.0; nxeq_mon[lvl] = 0.0; nxeq_vault[lvl] = 0.0; speq_total[lvl] = 0.0; speq_mon[lvl] = 0.0; speq_vault[lvl] = 0.0; teeq_total[lvl] = 0.0; teeq_mon[lvl] = 0.0; teeq_vault[lvl] = 0.0; bleq_total[lvl] = 0.0; bleq_mon[lvl] = 0.0; bleq_vault[lvl] = 0.0; cfeq_total[lvl] = 0.0; cfeq_mon[lvl] = 0.0; cfeq_vault[lvl] = 0.0; weap_total[lvl] = 0.0; weap_mon[lvl] = 0.0; weap_vault[lvl] = 0.0; bdweap_total[lvl] = 0.0; bdweap_mon[lvl] = 0.0; bdweap_vault[lvl] = 0.0; avweap_total[lvl] = 0.0; avweap_mon[lvl] = 0.0; avweap_vault[lvl] = 0.0; gdweap_total[lvl] = 0.0; gdweap_mon[lvl] = 0.0; gdweap_vault[lvl] = 0.0; slweap_total[lvl] = 0.0; slweap_mon[lvl] = 0.0; slweap_vault[lvl] = 0.0; evweap_total[lvl] = 0.0; evweap_mon[lvl] = 0.0; evweap_vault[lvl] = 0.0; klweap_total[lvl] = 0.0; klweap_mon[lvl] = 0.0; klweap_vault[lvl] = 0.0; brweap_total[lvl] = 0.0; brweap_mon[lvl] = 0.0; brweap_vault[lvl] = 0.0; weweap_total[lvl] = 0.0; weweap_mon[lvl] = 0.0; weweap_vault[lvl] = 0.0; deweap_total[lvl] = 0.0; deweap_mon[lvl] = 0.0; deweap_vault[lvl] = 0.0; goweap_total[lvl] = 0.0; goweap_mon[lvl] = 0.0; goweap_vault[lvl] = 0.0; haweap_total[lvl] = 0.0; haweap_mon[lvl] = 0.0; haweap_vault[lvl] = 0.0; xbweap_total[lvl] = 0.0; xbweap_mon[lvl] = 0.0; xbweap_vault[lvl] = 0.0; teweap_total[lvl] = 0.0; teweap_mon[lvl] = 0.0; teweap_vault[lvl] = 0.0; huweap_total[lvl] = 0.0; huweap_mon[lvl] = 0.0; huweap_vault[lvl] = 0.0; ubweap_total[lvl] = 0.0; ubweap_mon[lvl] = 0.0; ubweap_vault[lvl] = 0.0; moweap_total[lvl] = 0.0; moweap_mon[lvl] = 0.0; moweap_vault[lvl] = 0.0; /*bows*/ bow_total[lvl] = 0.0; bow_mon[lvl] = 0.0; bow_vault[lvl] = 0.0; bdbow_total[lvl] = 0.0; bdbow_mon[lvl] = 0.0; bdbow_vault[lvl] = 0.0; avbow_total[lvl] = 0.0; avbow_mon[lvl] = 0.0; avbow_vault[lvl] = 0.0; gdbow_total[lvl] = 0.0; gdbow_mon[lvl] = 0.0; gdbow_vault[lvl] = 0.0; vgbow_total[lvl] = 0.0; vgbow_mon[lvl] = 0.0; vgbow_vault[lvl] = 0.0; xmbow_total[lvl] = 0.0; xmbow_mon[lvl] = 0.0; xmbow_vault[lvl] = 0.0; xsbow_total[lvl] = 0.0; xsbow_mon[lvl] = 0.0; xsbow_vault[lvl] = 0.0; bubow_total[lvl] = 0.0; bubow_mon[lvl] = 0.0; bubow_vault[lvl] = 0.0; tebow_total[lvl] = 0.0; tebow_mon[lvl] = 0.0; tebow_vault[lvl] = 0.0; cubow_total[lvl] = 0.0; cubow_mon[lvl] = 0.0; cubow_vault[lvl] = 0.0; /* ammo */ ammo_total[lvl] = 0.0; ammo_mon[lvl] = 0.0; ammo_vault[lvl] = 0.0; bdammo_total[lvl] = 0.0; bdammo_mon[lvl] = 0.0; bdammo_vault[lvl] = 0.0; avammo_total[lvl] = 0.0; avammo_mon[lvl] = 0.0; avammo_vault[lvl] = 0.0; gdammo_total[lvl] = 0.0; gdammo_mon[lvl] = 0.0; gdammo_vault[lvl] = 0.0; egammo_total[lvl] = 0.0; egammo_mon[lvl] = 0.0; egammo_vault[lvl] = 0.0; vgammo_total[lvl] = 0.0; vgammo_mon[lvl] = 0.0; vgammo_vault[lvl] = 0.0; awammo_total[lvl] = 0.0; awammo_mon[lvl] = 0.0; awammo_vault[lvl] = 0.0; evammo_total[lvl] = 0.0; evammo_mon[lvl] = 0.0; evammo_vault[lvl] = 0.0; hmammo_total[lvl] = 0.0; hmammo_mon[lvl] = 0.0; hmammo_vault[lvl] = 0.0; /* armor */ arm_total[lvl] = 0.0; arm_mon[lvl] = 0.0; arm_vault[lvl] = 0.0; bdarm_total[lvl] = 0.0; bdarm_mon[lvl] = 0.0; bdarm_vault[lvl] = 0.0; avarm_total[lvl] = 0.0; avarm_mon[lvl] = 0.0; avarm_vault[lvl] = 0.0; gdarm_total[lvl] = 0.0; gdarm_mon[lvl] = 0.0; gdarm_vault[lvl] = 0.0; strarm_total[lvl] = 0.0; strarm_mon[lvl] = 0.0; strarm_vault[lvl] = 0.0; intarm_total[lvl] = 0.0; intarm_mon[lvl] = 0.0; intarm_vault[lvl] = 0.0; wisarm_total[lvl] = 0.0; wisarm_mon[lvl] = 0.0; wisarm_vault[lvl] = 0.0; dexarm_total[lvl] = 0.0; dexarm_mon[lvl] = 0.0; dexarm_vault[lvl] = 0.0; conarm_total[lvl] = 0.0; conarm_mon[lvl] = 0.0; conarm_vault[lvl] = 0.0; cuarm_total[lvl] = 0.0; cuarm_mon[lvl] = 0.0; cuarm_vault[lvl] = 0.0; art_total[lvl] = 0.0; art_spec[lvl] = 0.0; art_norm[lvl] = 0.0; art_shal[lvl] = 0.0; art_ave [lvl] = 0.0; art_ood [lvl] = 0.0; art_mon[lvl] = 0.0; art_uniq[lvl] = 0.0; art_floor[lvl] = 0.0; art_vault[lvl] = 0.0; art_mon_vault[lvl] = 0.0; /* potion */ pot_total[lvl] =0.0; pot_mon[lvl] =0.0; pot_vault[lvl] =0.0; gain_total[lvl] =0.0; gain_mon[lvl] =0.0; gain_vault[lvl] =0.0; rmana_total[lvl] =0.0; rmana_mon[lvl] =0.0; rmana_vault[lvl] =0.0; bigheal_total[lvl] =0.0; bigheal_mon[lvl] =0.0; bigheal_vault[lvl] =0.0; /*scrolls*/ scroll_total[lvl] = 0.0; scroll_mon[lvl] = 0.0; scroll_vault[lvl] = 0.0; escroll_total[lvl] = 0.0; escroll_mon[lvl] = 0.0; escroll_vault[lvl] = 0.0; acq_total[lvl] = 0.0; acq_mon[lvl] = 0.0; acq_vault[lvl] = 0.0; /* rods */ rod_total[lvl] = 0.0; rod_mon[lvl] = 0.0; rod_vault[lvl] = 0.0; urod_total[lvl] = 0.0; urod_mon[lvl] = 0.0; urod_vault[lvl] = 0.0; torod_total[lvl] = 0.0; torod_mon[lvl] = 0.0; torod_vault[lvl] = 0.0; drod_total[lvl] = 0.0; drod_mon[lvl] = 0.0; drod_vault[lvl] = 0.0; erod_total[lvl] = 0.0; erod_mon[lvl] = 0.0; erod_vault[lvl] = 0.0; /* staves */ staff_total[lvl] = 0.0; staff_mon[lvl] = 0.0; staff_vault[lvl] = 0.0; sstaff_total[lvl] = 0.0; sstaff_mon[lvl] = 0.0; sstaff_vault[lvl] = 0.0; dstaff_total[lvl] = 0.0; dstaff_mon[lvl] = 0.0; dstaff_vault[lvl] = 0.0; kstaff_total[lvl] = 0.0; kstaff_mon[lvl] = 0.0; kstaff_vault[lvl] = 0.0; pstaff_total[lvl] = 0.0; pstaff_mon[lvl] = 0.0; pstaff_vault[lvl] = 0.0; /* wands */ wand_total[lvl] = 0.0; wand_mon[lvl] = 0.0; wand_vault[lvl] = 0.0; towand_total[lvl] = 0.0; towand_mon[lvl] = 0.0; towand_vault[lvl] = 0.0; /* rings */ ring_total[lvl] = 0.0; ring_mon[lvl] = 0.0; ring_vault[lvl] = 0.0; curing_total[lvl] = 0.0; curing_mon[lvl] = 0.0; curing_vault[lvl] = 0.0; spring_total[lvl] = 0.0; spring_mon[lvl] = 0.0; spring_vault[lvl] = 0.0; string_total[lvl] = 0.0; string_mon[lvl] = 0.0; string_vault[lvl] = 0.0; faring_total[lvl] = 0.0; faring_mon[lvl] = 0.0; faring_vault[lvl] = 0.0; siring_total[lvl] = 0.0; siring_mon[lvl] = 0.0; siring_vault[lvl] = 0.0; poring_total[lvl] = 0.0; poring_mon[lvl] = 0.0; poring_vault[lvl] = 0.0; brring_total[lvl] = 0.0; brring_mon[lvl] = 0.0; brring_vault[lvl] = 0.0; elring_total[lvl] = 0.0; elring_mon[lvl] = 0.0; elring_vault[lvl] = 0.0; onering_total[lvl] = 0.0; onering_mon[lvl] = 0.0; onering_vault[lvl] = 0.0; /* amulets */ amu_total[lvl] = 0.0; amu_mon[lvl] = 0.0; amu_vault[lvl] = 0.0; wisamu_total[lvl] = 0.0; wisamu_mon[lvl] = 0.0; wisamu_vault[lvl] = 0.0; endamu_total[lvl] = 0.0; endamu_mon[lvl] = 0.0; endamu_vault[lvl] = 0.0; teamu_total[lvl] = 0.0; teamu_mon[lvl] = 0.0; teamu_vault[lvl] = 0.0; cuamu_total[lvl] = 0.0; cuamu_mon[lvl] = 0.0; cuamu_vault[lvl] = 0.0; mon_total[lvl] = 0.0; mon_ood[lvl] = 0.0; mon_deadly[lvl] = 0.0; uniq_total[lvl] = 0.0; uniq_ood[lvl] = 0.0; uniq_deadly[lvl] = 0.0; /* books */ b1_total[lvl] =0.0; b1_mon[lvl] =0.0; b1_vault[lvl] =0.0; b2_total[lvl] =0.0; b2_mon[lvl] =0.0; b2_vault[lvl] =0.0; b3_total[lvl] =0.0; b3_mon[lvl] =0.0; b3_vault[lvl] =0.0; b4_total[lvl] =0.0; b4_mon[lvl] =0.0; b4_vault[lvl] =0.0; b5_total[lvl] =0.0; b5_mon[lvl] =0.0; b5_vault[lvl] =0.0; b6_total[lvl] =0.0; b6_mon[lvl] =0.0; b6_vault[lvl] =0.0; b7_total[lvl] =0.0; b7_mon[lvl] =0.0; b7_vault[lvl] =0.0; b8_total[lvl] =0.0; b8_mon[lvl] =0.0; b8_vault[lvl] =0.0; b9_total[lvl] =0.0; b9_mon[lvl] =0.0; b9_vault[lvl] =0.0; } void drop_on_square(object_type *j_ptr, int y, int x, bool verbose) { //int i, k, n, d, s; int by, bx; //int dy, dx; //int ty, tx; // object_type *o_ptr; char o_name[80]; //bool flag = FALSE; bool plural = FALSE; assert(j_ptr->kind); /* Default */ by = y; bx = x; /* Set floor to empty */ cave_set_feat(cave,y,x,FEAT_FLOOR); /* Give it to the floor */ if (!floor_carry(cave, by, bx, j_ptr)) { /* Message */ msg("The %s disappear%s.", o_name, PLURAL(plural)); /* Debug */ if (p_ptr->wizard) msg("Breakage (too many objects)."); if (j_ptr->artifact) j_ptr->artifact->created = FALSE; /* Failure */ return; } } /* * A rewrite of monster death that gets rid of some features * That we don't want to deal with. Namely, no notifying the * player and no generation of Morgoth artifacts * * It also replaces drop near with a new function that drops all * the items on the exact square that the monster was on. */ static void monster_death_stats(int m_idx) { int j, y, x, level; //removed i int dump_item = 0; int dump_gold = 0; int number = 0; object_type *i_ptr; object_type object_type_body; //s16b this_o_idx, next_o_idx = 0; monster_type *m_ptr = cave_monster(cave, m_idx); monster_race *r_ptr = &r_info[m_ptr->r_idx]; //bool visible = (m_ptr->ml || rf_has(r_ptr->flags, RF_UNIQUE)); bool great = (rf_has(r_ptr->flags, RF_DROP_GREAT)) ? TRUE : FALSE; bool good = (rf_has(r_ptr->flags, RF_DROP_GOOD) ? TRUE : FALSE) || great; bool gold_ok = (!rf_has(r_ptr->flags, RF_ONLY_ITEM)); bool item_ok = (!rf_has(r_ptr->flags, RF_ONLY_GOLD)); /* This is the get_coin_type function moved inline */ const char *name = r_ptr->name; int force_coin=SV_GOLD_ANY; /* Look for textual clues */ if (my_stristr(name, "copper ")) force_coin=SV_COPPER; if (my_stristr(name, "silver ")) force_coin=SV_SILVER; if (my_stristr(name, "gold ")) force_coin=SV_GOLD; if (my_stristr(name, "mithril ")) force_coin=SV_MITHRIL; if (my_stristr(name, "adamantite ")) force_coin=SV_ADAMANTITE; /* Get the location */ y = m_ptr->fy; x = m_ptr->fx; /* Delete any traps the monsters was standing on */ cave_set_feat(cave,y,x,FEAT_FLOOR); /* Forget objects */ m_ptr->hold_o_idx = 0; /* Determine how much we can drop */ if (rf_has(r_ptr->flags, RF_DROP_20) && randint0(100) < 20) number++; if (rf_has(r_ptr->flags, RF_DROP_40) && randint0(100) < 40) number++; if (rf_has(r_ptr->flags, RF_DROP_60) && randint0(100) < 60) number++; if (rf_has(r_ptr->flags, RF_DROP_4)) number += rand_range(2, 6); if (rf_has(r_ptr->flags, RF_DROP_3)) number += rand_range(2, 4); if (rf_has(r_ptr->flags, RF_DROP_2)) number += rand_range(1, 3); if (rf_has(r_ptr->flags, RF_DROP_1)) number++; /* Take the best of average of monster level and current depth, and monster level - to reward fighting OOD monsters */ level = MAX((r_ptr->level + p_ptr->depth) / 2, r_ptr->level); /* Drop some objects */ for (j = 0; j < number; j++) { /* Get local object */ i_ptr = &object_type_body; assert(i_ptr->kind); /* Wipe the object */ object_wipe(i_ptr); /* Make Gold */ if (gold_ok && (!item_ok || (randint0(100) < 50))) { /* Make some gold */ make_gold(i_ptr, level, force_coin); dump_gold++; } /* Make Object */ else { /* Make an object */ if (!make_object(cave, i_ptr, level, good, great, NULL)) continue; dump_item++; } /* Drop it in the dungeon */ drop_near(cave, i_ptr, 0,y, x, TRUE); } } /* This will collect stats on a monster avoiding all * unique monsters. Afterwards it will kill the * monsters. */ static bool stats_monster(monster_type *m_ptr, int i, bool uniq) { static int lvl; /* Get monster race */ monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* get player depth */ lvl=p_ptr->depth; /* Get out if we're looking at a unique and don't want to yet*/ if ((!uniq) && (rf_has(r_ptr->flags, RF_UNIQUE))) return FALSE; /* Increment monster count */ mon_total[lvl] += addval; /* Increment unique count if appropriate */ if ((uniq) && (rf_has(r_ptr->flags, RF_UNIQUE))) { /* add to total */ uniq_total[lvl] += addval; /* kill the unique if we're in clearing mode */ if (clearing) r_ptr->max_num = 0; //debugging print that we killed it //msg_format("Killed %s",r_ptr->name); } /* Is it mostly dangerous (10 levels ood or less?)*/ if ((r_ptr->level > p_ptr->depth) && (r_ptr->level <= p_ptr->depth+10)) { mon_ood[lvl] += addval; /* Is it a unique */ if (rf_has(r_ptr->flags, RF_UNIQUE)) uniq_ood[lvl] += addval; } /* Is it deadly? */ if (r_ptr->level > p_ptr->depth + 10) { mon_deadly[lvl] += addval; /* Is it a unique? */ if (rf_has(r_ptr->flags, RF_UNIQUE)) uniq_deadly[lvl] += addval; } /* Generate treasure */ monster_death_stats(i); /* remove the monster */ delete_monster_idx(i); /* success */ return TRUE; } /* * Delete a single dungeon object * * This piece of code is identical to delete_object_idx * except that it does not include light_spot to save * time */ static void delete_object_stat(int o_idx) { object_type *j_ptr; /* Excise */ excise_object_idx(o_idx); /* Object */ j_ptr = object_byid(o_idx); /* Wipe the object */ object_wipe(j_ptr); /* Count objects */ o_cnt--; } /* * Record the first level we find something */ static bool first_find(int fl[TRIES_SIZE]) { /* make sure we're not on an iteration above our array limit */ if (iter >= TRIES_SIZE) return FALSE; /* make sure we haven't found it earlier on this iteration */ if (fl[iter] > 0) return FALSE; /* assign the depth to this value */ fl[iter] = p_ptr->depth; /* success */ return TRUE; } /* * Add values to each category of statistics based */ static void add_stats(double total[MAX_LVL], double mondrop[MAX_LVL], double invault[MAX_LVL], bool vault, bool mon, int number) { int lvl; /* get player level */ lvl=p_ptr->depth; /* be careful about bounds */ if ((lvl > 100) || (lvl < 0)) return; /* increase values */ //total += lvl; mondrop +=lvl; invault+=lvl; /* add to the total */ total[lvl] += addval*number; /* add to the total from vaults */ if ((!mon) && (vault)) invault[lvl] += addval * number; /* add to the total from monsters */ if (mon) mondrop[lvl] += addval * number; } /* * This will get data on an object * It gets a lot of stuff, pretty much everything that I * thought was reasonable to get. However, you might have * a much different opinion. Luckily, I tried to make it * trivial to add new items to log. */ static void get_obj_data(const object_type *o_ptr, int y, int x, bool mon, bool uniq) { bool vault = (cave->info[y][x] & (CAVE_ICKY)); bitflag f[OF_SIZE]; int effect; int number = o_ptr->number; static int lvl; artifact_type *a_ptr; double gold_temp=0; assert(o_ptr->kind); /* get player depth */ lvl=p_ptr->depth; /* extract flags */ object_flags(o_ptr,f); /* check for some stuff that we will use regardless of type */ /* originally this was armor, but I decided to generalize it */ /* has free action (hack: don't include Inertia)*/ if (of_has(f,OF_FREE_ACT) && !((o_ptr->tval == TV_AMULET) && (o_ptr->sval==SV_AMULET_INERTIA))) { /* add the stats */ add_stats( faeq_total, faeq_mon, faeq_vault,vault,mon,number); /* record first level */ first_find(fa_it); } /* has see invis */ if (of_has(f,OF_SEE_INVIS)) { add_stats( sieq_total, sieq_mon, sieq_vault,vault,mon,number); first_find(si_it); } /* has at least one basic resist */ if ((of_has(f,OF_RES_ACID)) || (of_has(f,OF_RES_ELEC)) || (of_has(f,OF_RES_COLD)) || (of_has(f,OF_RES_FIRE))) { add_stats( reeq_total, reeq_mon, reeq_vault,vault,mon,number); } /* has rbase */ if ((of_has(f,OF_RES_ACID)) && (of_has(f,OF_RES_ELEC)) && (of_has(f,OF_RES_COLD)) && (of_has(f,OF_RES_FIRE))) add_stats( rbeq_total, rbeq_mon, rbeq_vault,vault,mon,number); /* has resist poison */ if (of_has(f,OF_RES_POIS)) { add_stats( poeq_total, poeq_mon, poeq_vault,vault,mon,number); first_find(po_it); } /* has resist nexus */ if (of_has(f,OF_RES_NEXUS)) { add_stats( nxeq_total, nxeq_mon, nxeq_vault,vault,mon,number); first_find(nx_it); } /* has resist blind */ if (of_has(f,OF_RES_BLIND)) { add_stats( bleq_total, bleq_mon, bleq_vault,vault,mon,number); first_find(bl_it); } /* has resist conf */ if (of_has(f,OF_RES_CONFU)) { add_stats( cfeq_total, cfeq_mon, cfeq_vault,vault,mon,number); first_find(cf_it); } /* has speed */ if (of_has(f,OF_SPEED)) add_stats( speq_total, speq_mon, speq_vault,vault,mon,number); /* has telepathy */ if (of_has(f,OF_TELEPATHY)) { add_stats( teeq_total, teeq_mon, teeq_vault,vault,mon,number); first_find(te_it); } switch(o_ptr->tval) { /* armor */ case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* do not include artifacts */ if (o_ptr->artifact) break; /* add to armor total */ add_stats( arm_total, arm_mon, arm_vault,vault,mon,number); /* check if bad, good, or average */ if (o_ptr->to_a < 0) add_stats( bdarm_total, bdarm_mon, bdarm_vault, vault, mon,number); if (o_ptr->to_h == 0) add_stats( avarm_total, avarm_mon, avarm_vault, vault, mon,number); if (o_ptr->to_h > 0) add_stats( gdarm_total, gdarm_mon, gdarm_vault, vault, mon,number); /* has str boost */ if (of_has(f,OF_STR)) add_stats( strarm_total, strarm_mon, strarm_vault,vault,mon,number); /* has dex boost */ if (of_has(f,OF_DEX)) add_stats( dexarm_total, dexarm_mon, dexarm_vault,vault,mon,number); /* has int boost */ if (of_has(f,OF_INT)) add_stats( intarm_total, intarm_mon, intarm_vault,vault,mon,number); if (of_has(f,OF_WIS)) add_stats( wisarm_total, wisarm_mon, wisarm_vault,vault,mon,number); if (of_has(f,OF_CON)) add_stats( conarm_total, conarm_mon, conarm_vault,vault,mon,number); if (of_has(f,OF_LIGHT_CURSE)) add_stats( cuarm_total, cuarm_mon, cuarm_vault,vault,mon,number); break; } /* weapons */ case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: { /* do not include artifacts */ if (o_ptr->artifact) break; /* add to weapon total */ add_stats( weap_total, weap_mon, weap_vault, vault, mon,number); /* extract flags */ object_flags(o_ptr,f); /* check if bad, good, or average */ if ((o_ptr->to_h < 0) && (o_ptr->to_d < 0)) add_stats( bdweap_total, bdweap_mon, bdweap_vault, vault, mon,number); if ((o_ptr->to_h == 0) && (o_ptr->to_d == 0)) add_stats( avweap_total, avweap_mon, avweap_vault, vault, mon,number); if ((o_ptr->to_h > 0) && (o_ptr->to_d > 0)) add_stats( gdweap_total, gdweap_mon, gdweap_vault, vault, mon,number); /* slay weapons */ if ((of_has(f,OF_SLAY_DRAGON)) || (of_has(f,OF_SLAY_DEMON)) || (of_has(f,OF_SLAY_TROLL)) || (of_has(f,OF_SLAY_GIANT)) || (of_has(f,OF_SLAY_UNDEAD)) || (of_has(f,OF_SLAY_ANIMAL)) || (of_has(f,OF_SLAY_ORC))) add_stats( slweap_total, slweap_mon, slweap_vault, vault, mon,number); /* slay evil */ if (of_has(f,OF_SLAY_EVIL)) add_stats( slweap_total, slweap_mon, slweap_vault, vault, mon,number); /* kill flag */ if ((of_has(f,OF_KILL_DRAGON)) || (of_has(f,OF_KILL_DEMON)) || (of_has(f,OF_KILL_UNDEAD))) add_stats( klweap_total, klweap_mon, klweap_vault, vault, mon,number); /* branded weapons */ if ((of_has(f,OF_BRAND_ACID)) || (of_has(f,OF_BRAND_ELEC)) || (of_has(f,OF_BRAND_FIRE)) || (of_has(f,OF_BRAND_COLD)) || (of_has(f,OF_BRAND_POIS))) add_stats( brweap_total, brweap_mon, brweap_vault, vault, mon,number); /* determine westernesse by flags */ if ((of_has(f,OF_STR)) && (of_has(f,OF_DEX)) && (of_has(f,OF_CON)) && (of_has(f,OF_FREE_ACT)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_SLAY_TROLL)) && (of_has(f,OF_SLAY_GIANT)) && (of_has(f,OF_SLAY_ORC))) add_stats( weweap_total, weweap_mon, weweap_vault, vault, mon,number); /* determine defender by flags */ if ((of_has(f,OF_RES_ACID)) && (of_has(f,OF_RES_ELEC)) && (of_has(f,OF_RES_FIRE)) && (of_has(f,OF_RES_COLD)) && (of_has(f,OF_FREE_ACT)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_FEATHER)) && (of_has(f,OF_STEALTH)) && (of_has(f,OF_REGEN))) add_stats( deweap_total, deweap_mon, deweap_vault, vault, mon,number); /* determine gondolin by flags */ if ((of_has(f,OF_SLAY_DEMON)) && (of_has(f,OF_SLAY_ORC)) && (of_has(f,OF_SLAY_TROLL)) && (of_has(f,OF_SLAY_DRAGON)) && (of_has(f,OF_FREE_ACT)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_LIGHT)) && (of_has(f,OF_RES_DARK))) add_stats( goweap_total, goweap_mon, goweap_vault, vault, mon,number); /* determine holy avenger by flags */ if ((of_has(f,OF_SLAY_EVIL)) && (of_has(f,OF_SLAY_UNDEAD)) && (of_has(f,OF_SLAY_DEMON)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_BLESSED)) && (of_has(f,OF_RES_FEAR))) add_stats( haweap_total, haweap_mon, haweap_vault, vault, mon,number); /* extra blows */ if (of_has(f,OF_BLOWS)) add_stats( xbweap_total, xbweap_mon, xbweap_vault, vault, mon,number); /* telepathy */ if (of_has(f,OF_TELEPATHY)) add_stats( teweap_total, teweap_mon, teweap_vault, vault, mon,number); /* is a top of the line weapon */ if (((o_ptr->tval == TV_HAFTED) && (o_ptr->sval == SV_MACE_OF_DISRUPTION)) || ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SCYTHE_OF_SLICING)) || ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_BLADE_OF_CHAOS))) { add_stats( huweap_total, huweap_mon, huweap_vault, vault, mon,number); /* is uber */ if ((of_has(f,OF_SLAY_EVIL)) || (of_has(f,OF_BLOWS))) add_stats( ubweap_total, ubweap_mon, ubweap_vault, vault, mon,number); } /* is morgul */ if (of_has(f,OF_HEAVY_CURSE)) add_stats( moweap_total, moweap_mon, moweap_vault, vault, mon,number); break; } /* launchers */ case TV_BOW: { /* do not include artifacts */ if (o_ptr->artifact) break; /* add to launcher total */ add_stats( bow_total, bow_mon, bow_vault, vault, mon,number); /* extract flags */ object_flags(o_ptr,f); /* check if bad, average, good, or very good */ if ((o_ptr->to_h < 0) && (o_ptr->to_d < 0)) add_stats( bdbow_total, bdbow_mon, bdbow_vault, vault, mon,number); if ((o_ptr->to_h == 0) && (o_ptr->to_d == 0)) add_stats( avbow_total, avbow_mon, avbow_vault, vault, mon,number); if ((o_ptr->to_h > 0) && (o_ptr->to_d > 0)) add_stats( gdbow_total, gdbow_mon, gdbow_vault, vault, mon,number); if ((o_ptr->to_h > 15) || (o_ptr->to_d > 15)) add_stats( vgbow_total, vgbow_mon, vgbow_vault, vault, mon,number); /* check long bows and xbows for xtra might and/or shots */ if ((o_ptr->sval == SV_LONG_BOW) || (o_ptr->sval == SV_LIGHT_XBOW) || (o_ptr->sval == SV_HEAVY_XBOW)) { if (of_has(f,OF_SHOTS)) add_stats( xsbow_total, xsbow_mon, xsbow_vault, vault, mon,number); if (of_has(f,OF_MIGHT)) add_stats( xmbow_total, xmbow_mon, xmbow_vault, vault, mon,number); } /* check for buckland */ if ((o_ptr->sval == SV_SLING) && (of_has(f,OF_MIGHT)) && (of_has(f,OF_SHOTS))) add_stats( bubow_total, bubow_mon, bubow_vault, vault, mon,number); /* has telep */ if (of_has(f,OF_TELEPATHY)) add_stats( tebow_total, tebow_mon, tebow_vault, vault, mon,number); /* is cursed */ if (of_has(f,OF_LIGHT_CURSE)) add_stats( cubow_total, cubow_mon, cubow_vault, vault, mon,number); break; } /* potion */ case TV_POTION: { /* add total amounts */ add_stats( pot_total, pot_mon, pot_vault,vault,mon,number); /* get effects */ effect=object_effect(o_ptr); /*stat gain*/ switch(effect) { /* skip CHR */ case EF_GAIN_STR: case EF_GAIN_INT: case EF_GAIN_WIS: case EF_GAIN_DEX: case EF_GAIN_CON: { add_stats( gain_total, gain_mon, gain_vault,vault,mon,number); break; } /* Aug */ case EF_GAIN_ALL: { int k; /*Augmentation counts as 5 stat gain pots */ for (k=1;k<=5;k++) add_stats( gain_total, gain_mon, gain_vault,vault,mon,number); break; } case EF_ENLIGHTENMENT2: { /* *Enlight* counts as 2 stat pots */ int k; for (k=1;k<=2;k++) add_stats( gain_total, gain_mon, gain_vault,vault,mon,number); break; } case EF_RESTORE_MANA: { add_stats( rmana_total, rmana_mon, rmana_vault,vault,mon,number); break; } case EF_CURE_NONORLYBIG: case EF_CURE_FULL2: { add_stats( bigheal_total, bigheal_mon, bigheal_vault,vault,mon,number); break; } } break; } /* scrolls */ case TV_SCROLL: { /* add total amounts */ add_stats( scroll_total, scroll_mon, scroll_vault,vault,mon,number); /* get effects */ effect=object_effect(o_ptr); /* scroll effects */ switch(effect) { case EF_BANISHMENT: case EF_LOSKILL: case EF_RUNE: case EF_DESTRUCTION2: { /* add to total */ add_stats( escroll_total, escroll_mon, escroll_vault,vault,mon,number); break; } case EF_ACQUIRE: { /* add to total */ add_stats( acq_total, acq_mon, acq_vault,vault,mon,number); break; } case EF_ACQUIRE2: { /* do the effect of 2 acquires */ add_stats( acq_total, acq_mon, acq_vault,vault,mon,number); add_stats( acq_total, acq_mon, acq_vault,vault,mon,number); break; } } break; } /* rods */ case TV_ROD: { /* add to total */ add_stats( rod_total, rod_mon, rod_vault,vault,mon,number); effect=object_effect(o_ptr); switch(effect) { /* utility */ case EF_DETECT_TRAP: case EF_DETECT_TREASURE: case EF_DETECT_DOORSTAIR: case EF_LIGHT_LINE: case EF_ILLUMINATION: { add_stats( urod_total, urod_mon, urod_vault,vault,mon,number); break; } /* teleport other */ case EF_TELE_OTHER: { add_stats( torod_total, torod_mon, torod_vault,vault,mon,number); break; } /* detect all */ case EF_DETECT_ALL: { add_stats( drod_total, drod_mon, drod_vault,vault,mon,number); break; } /* endgame, speed and healing */ case EF_HASTE: case EF_HEAL3: { add_stats( erod_total, erod_mon, erod_vault,vault,mon,number); break; } } break; } /* staves */ case TV_STAFF: { add_stats( staff_total, staff_mon, staff_vault,vault,mon,number); effect=object_effect(o_ptr); switch(effect) { case EF_HASTE: { add_stats( sstaff_total, sstaff_mon, sstaff_vault,vault,mon,number); break; } case EF_DESTRUCTION2: { add_stats( dstaff_total, dstaff_mon, dstaff_vault,vault,mon,number); break; } case EF_DISPEL_EVIL60: case EF_DISPEL_ALL: case EF_STAFF_HOLY: { add_stats( kstaff_total, kstaff_mon, kstaff_vault,vault,mon,number); break; } case EF_CURE_FULL: case EF_BANISHMENT: case EF_STAFF_MAGI: { add_stats( pstaff_total, pstaff_mon, pstaff_vault,vault,mon,number); break; } } break; } case TV_WAND: { add_stats( wand_total, wand_mon, wand_vault,vault,mon,number); effect=object_effect(o_ptr); switch(effect) { case EF_TELE_OTHER: { add_stats( towand_total, towand_mon, towand_vault,vault,mon,number); break; } } break; } case TV_RING: { add_stats( ring_total, ring_mon, ring_vault,vault,mon,number); /* is it cursed */ if (of_has(o_ptr->flags,OF_LIGHT_CURSE)) add_stats( curing_total, curing_mon, curing_vault,vault,mon,number); switch(o_ptr->sval) { case SV_RING_SPEED: { add_stats( spring_total, spring_mon, spring_vault,vault,mon,number); break; } case SV_RING_STRENGTH: case SV_RING_INTELLIGENCE: case SV_RING_DEXTERITY: case SV_RING_CONSTITUTION: { add_stats( string_total, string_mon, string_vault,vault,mon,number); break; } case SV_RING_RESIST_POISON: { add_stats( poring_total, poring_mon, poring_vault,vault,mon,number); break; } case SV_RING_FREE_ACTION: { add_stats( faring_total, faring_mon, faring_vault,vault,mon,number); break; } case SV_RING_SEE_INVISIBLE: { add_stats( siring_total, siring_mon, siring_vault,vault,mon,number); break; } case SV_RING_FLAMES: case SV_RING_ACID: case SV_RING_ICE: case SV_RING_LIGHTNING: { add_stats( brring_total, brring_mon, brring_vault,vault,mon,number); break; } case SV_RING_NARYA: case SV_RING_NENYA: case SV_RING_VILYA: { add_stats( elring_total, elring_mon, elring_vault,vault,mon,number); break; } case SV_RING_POWER: { add_stats( onering_total, onering_mon, onering_vault,vault,mon,number); break; } } break; } case TV_AMULET: { add_stats( amu_total, amu_mon, amu_vault,vault,mon,number); /* extract flags */ object_flags(o_ptr,f); switch(o_ptr->sval) { /* wisdom */ case SV_AMULET_WISDOM: { add_stats( wisamu_total, wisamu_mon, wisamu_vault,vault,mon,number); break; } case SV_AMULET_THE_MAGI: case SV_AMULET_TRICKERY: case SV_AMULET_WEAPONMASTERY: { add_stats( endamu_total, endamu_mon, endamu_vault,vault,mon,number); break; } case SV_AMULET_ESP: { add_stats( teamu_total, teamu_mon, teamu_vault,vault,mon,number); break; } } /* is cursed */ if (of_has(f,OF_LIGHT_CURSE)) add_stats( cuamu_total, cuamu_mon, cuamu_vault, vault, mon,number); break; } case TV_SHOT: case TV_ARROW: case TV_BOLT: { add_stats( ammo_total, ammo_mon, ammo_vault,vault,mon,number); /* extract flags */ object_flags(o_ptr,f); /* check if bad, average, good */ if ((o_ptr->to_h < 0) && (o_ptr->to_d < 0)) add_stats( bdammo_total, bdammo_mon, bdammo_vault, vault, mon,number); if ((o_ptr->to_h == 0) && (o_ptr->to_d == 0)) add_stats( avammo_total, avammo_mon, avammo_vault, vault, mon,number); if ((o_ptr->to_h > 0) && (o_ptr->to_d > 0)) add_stats( gdammo_total, gdammo_mon, gdammo_vault, vault, mon,number); if (o_ptr->ego) add_stats( egammo_total, egammo_mon, egammo_vault, vault, mon,number); if ((o_ptr->sval == SV_AMMO_HEAVY) || (o_ptr->sval == SV_AMMO_SILVER)) { /* Mithril and seeker ammo */ add_stats( vgammo_total, vgammo_mon, vgammo_vault, vault, mon,number); /* Ego mithril and seeker ammo */ if (o_ptr->ego) add_stats( awammo_total, awammo_mon, awammo_vault, vault, mon,number); if (of_has(f,OF_SLAY_EVIL)) add_stats( evammo_total, evammo_mon, evammo_vault, vault, mon,number); if ((of_has(f,OF_SLAY_EVIL)) && (of_has(f,OF_SLAY_DEMON))) add_stats( hmammo_total, hmammo_mon, hmammo_vault, vault, mon,number); } break; } /* prayer books and magic books have the same probability only track one of them */ case TV_MAGIC_BOOK: { switch(o_ptr->sval) { /* svals begin at 0 and end at 8 */ case 0: { add_stats( b1_total, b1_mon, b1_vault, vault, mon,number); first_find(mb1_it); break; } case 1: { add_stats( b2_total, b2_mon, b2_vault, vault, mon,number); first_find(mb2_it); break; } case 2: { add_stats( b3_total, b3_mon, b3_vault, vault, mon,number); first_find(mb3_it); break; } case 3: { add_stats( b4_total, b4_mon, b4_vault, vault, mon,number); first_find(mb4_it); break; } case 4: { add_stats( b5_total, b5_mon, b5_vault, vault, mon,number); first_find(mb5_it); break; } case 5: { add_stats( b6_total, b6_mon, b6_vault, vault, mon,number); first_find(mb6_it); break; } case 6: { add_stats( b7_total, b7_mon, b7_vault, vault, mon,number); first_find(mb7_it); break; } case 7: { add_stats( b8_total, b8_mon, b8_vault, vault, mon,number); first_find(mb8_it); break; } case 8: { add_stats( b9_total, b9_mon, b9_vault, vault, mon,number); first_find(mb9_it); break; } } break; } } /* check to see if we have an artifact */ if (o_ptr->artifact) { /* add to artifact level total */ art_total[lvl] += addval; /* add to the artifact iteration total */ if (iter < TRIES_SIZE) art_it[iter]++; /* Obtain the artifact info */ a_ptr = o_ptr->artifact; //debugging, print out that we found the artifact //msg_format("Found artifact %s",a_ptr->name); /* artifact is shallow */ if (a_ptr->alloc_min < (p_ptr->depth - 20)) art_shal[lvl] += addval; /* artifact is close to the player depth */ if ((a_ptr->alloc_min >= p_ptr->depth - 20) && (a_ptr->alloc_min <= p_ptr->depth )) art_ave[lvl] += addval; /* artifact is out of depth */ if (a_ptr->alloc_min > (p_ptr->depth)) art_ood[lvl] += addval; /* check to see if it's a special artifact */ if ((o_ptr->tval == TV_LIGHT) || (o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_RING)) { /* increment special artifact counter */ art_spec[lvl] += addval; } else { /* increment normal artifacts */ art_norm[lvl] += addval; /* did it come from a monster? */ if (mon) art_mon[lvl] += addval; /* did it come from a unique? */ if (uniq) art_uniq[lvl] += addval; /* was it in a vault? */ if (vault) { /* did a monster drop it ?*/ if ((mon) || (uniq)) art_mon_vault[lvl] += addval; else art_vault[lvl] += addval; } else { /* was it just lyin' on the floor? */ if ((!uniq) && (!mon)) art_floor[lvl] += addval; } } /* preserve the artifact */ if (!(clearing)) a_ptr->created = FALSE; } /* Get info on gold. */ if (o_ptr->tval == TV_GOLD) { int temp = o_ptr->pval[DEFAULT_PVAL]; gold_temp = temp; gold_total[lvl] += (gold_temp / tries); /*From a monster? */ if ((mon) || (uniq)) gold_mon[lvl] += (gold_temp / tries); else gold_floor[lvl] += (gold_temp / tries); } /* remove the object */ delete_object_stat(cave->o_idx[y][x]); } /* Print heading infor for the file */ static void print_heading(void) { /* PRINT INFO STUFF */ file_putf(stats_log," This is a Monte Carlo simulation, results are arranged by level \n"); file_putf(stats_log," Monsters: OOD means between 1 and 10 levels deep, deadly is more than \n"); file_putf(stats_log," 10 levels deep \n"); file_putf(stats_log," Artifacts: info on artifact location (vault, floor, etc) \n"); file_putf(stats_log," do not include special artifacts, only weapons and armor \n"); file_putf(stats_log," Weapons : Big dice weapons are either BoC, SoS, or Mod. Uber \n"); file_putf(stats_log," weapons, are one of the above with xblows or slay evil\n"); file_putf(stats_log," Launchers: xtra shots and xtra might are only logged for x3 or\n"); file_putf(stats_log," better. Very good has +to hit or + to dam > 15\n"); file_putf(stats_log," Amulets: Endgame amulets are trickery, weaponmaster and magi\n"); file_putf(stats_log," Armor: Low resist armor may have more than one basic resist (acid, \n"); file_putf(stats_log," elec, fire, cold) but not all. \n"); file_putf(stats_log," Books: Prayer and Magic books have the same probability. \n"); file_putf(stats_log," Potions: Stat gain potions do not include CHR. Aug counts \n"); file_putf(stats_log," as 5 potions, *enlight* as 2. Healing potions are \n"); file_putf(stats_log," only *Healing* and Life\n"); file_putf(stats_log," Scrolls: Endgame scrolls include *Dest*, Rune, MBan and Ban \n"); file_putf(stats_log," *Acq* counts as two Acq scrolls"); file_putf(stats_log," Rods: Utility rods: d-obj, d-stairs, d-traps, light, illum \n"); file_putf(stats_log," Endgame rods: Speed, Healing \n"); file_putf(stats_log," Staves: Kill staves: dispel evil, power, holiness. \n"); file_putf(stats_log," Power staves: healing, magi, banishment \n"); } /* Print all the stats for each level */ static void print_stats(int lvl) { /* check bounds on lvl */ if ((lvl < 0) || (lvl > 100)) return; /* print level heading */ file_putf(stats_log,"\n"); file_putf(stats_log,"******** LEVEL %d , %d tries********* \n",lvl, tries); file_putf(stats_log,"\n"); /* print monster heading */ file_putf(stats_log," MONSTER INFO \n"); file_putf(stats_log," Total monsters: %f OOD: %f Deadly: %f \n", mon_total[lvl], mon_ood[lvl], mon_deadly[lvl]); file_putf(stats_log," Unique monsters: %f OOD: %f Deadly: %f \n", uniq_total[lvl], uniq_ood[lvl], uniq_deadly[lvl]); /* print artifact heading */ file_putf(stats_log,"\n ARTIFACT INFO \n"); /* basic artifact info */ file_putf(stats_log,"Total artifacts: %f Special artifacts: %f Weapons/armor: %f \n", art_total[lvl], art_spec[lvl], art_norm[lvl]); /* artifact depth info */ file_putf(stats_log,"Shallow: %f Average: %f Ood: %f \n", art_shal[lvl],art_ave[lvl],art_ood[lvl]); /* more advanced info */ file_putf(stats_log,"From vaults: %f From floor (no vault): %f \n", art_vault[lvl],art_floor[lvl]); file_putf(stats_log,"Uniques: %f Monsters: %f Vault denizens: %f \n", art_uniq[lvl], art_mon[lvl], art_mon_vault[lvl]); /* print general equipment stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," Equipment info \n"); file_putf(stats_log," FA total: %f From Monsters: %f In Vaults: %f \n", faeq_total[lvl], faeq_mon[lvl], faeq_vault[lvl]); file_putf(stats_log," SI total: %f From Monsters: %f In Vaults: %f \n", sieq_total[lvl], sieq_mon[lvl], sieq_vault[lvl]); file_putf(stats_log," lo res total: %f From Monsters: %f In Vaults: %f \n", reeq_total[lvl], reeq_mon[lvl], reeq_vault[lvl]); file_putf(stats_log," rbase total: %f From Monsters: %f In Vaults: %f \n", rbeq_total[lvl], rbeq_mon[lvl], rbeq_vault[lvl]); file_putf(stats_log," rpois total: %f From Monsters: %f In Vaults: %f \n", poeq_total[lvl], poeq_mon[lvl], poeq_vault[lvl]); file_putf(stats_log," rnexus total: %f From Monsters: %f In Vaults: %f \n", nxeq_total[lvl], nxeq_mon[lvl], nxeq_vault[lvl]); file_putf(stats_log," rblind total: %f From Monsters: %f In Vaults: %f \n", bleq_total[lvl], bleq_mon[lvl], bleq_vault[lvl]); file_putf(stats_log," rconf total: %f From Monsters: %f In Vaults: %f \n", cfeq_total[lvl], cfeq_mon[lvl], cfeq_vault[lvl]); file_putf(stats_log," speed total: %f From Monsters: %f In Vaults: %f \n", speq_total[lvl], speq_mon[lvl], speq_vault[lvl]); file_putf(stats_log," telep total: %f From Monsters: %f In Vaults: %f \n", teeq_total[lvl], teeq_mon[lvl], teeq_vault[lvl]); /* print weapon stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," WEAPON INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", weap_total[lvl],weap_mon[lvl],weap_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdweap_total[lvl], bdweap_mon[lvl], bdweap_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avweap_total[lvl], avweap_mon[lvl], avweap_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdweap_total[lvl], gdweap_mon[lvl], gdweap_vault[lvl]); file_putf(stats_log," Slay(no evil):%f From Monsters: %f In Vaults: %f \n", slweap_total[lvl], slweap_mon[lvl], slweap_vault[lvl]); file_putf(stats_log," Slay evil: %f From Monsters: %f In Vaults: %f \n", evweap_total[lvl], evweap_mon[lvl], evweap_vault[lvl]); file_putf(stats_log," *Slay*: %f From Monsters: %f In Vaults: %f \n", klweap_total[lvl], klweap_mon[lvl], klweap_vault[lvl]); file_putf(stats_log," Branded: %f From Monsters: %f In Vaults: %f \n", brweap_total[lvl], brweap_mon[lvl], brweap_vault[lvl]); file_putf(stats_log," West.: %f From Monsters: %f In Vaults: %f \n", weweap_total[lvl], weweap_mon[lvl], weweap_vault[lvl]); file_putf(stats_log," Defender: %f From Monsters: %f In Vaults: %f \n", deweap_total[lvl], deweap_mon[lvl], deweap_vault[lvl]); file_putf(stats_log," Gondolin: %f From Monsters: %f In Vaults: %f \n", goweap_total[lvl], goweap_mon[lvl], goweap_vault[lvl]); file_putf(stats_log," HA: %f From Monsters: %f In Vaults: %f \n", haweap_total[lvl], haweap_mon[lvl], haweap_vault[lvl]); file_putf(stats_log," Xtra blows: %f From Monsters: %f In Vaults: %f \n", xbweap_total[lvl], xbweap_mon[lvl], xbweap_vault[lvl]); file_putf(stats_log," Telep: %f From Monsters: %f In Vaults: %f \n", teweap_total[lvl], teweap_mon[lvl], teweap_vault[lvl]); file_putf(stats_log," Big dice: %f From Monsters: %f In Vaults: %f \n", huweap_total[lvl], huweap_mon[lvl], huweap_vault[lvl]); file_putf(stats_log," Uber: %f From Monsters: %f In Vaults: %f \n", ubweap_total[lvl], ubweap_mon[lvl], ubweap_vault[lvl]); file_putf(stats_log," Morgul: %f From Monsters: %f In Vaults: %f \n", moweap_total[lvl], moweap_mon[lvl], moweap_vault[lvl]); /* launcher info */ file_putf(stats_log,"\n"); file_putf(stats_log," LAUNCHER INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", bow_total[lvl],bow_mon[lvl],bow_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdbow_total[lvl], bdbow_mon[lvl], bdbow_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avbow_total[lvl], avbow_mon[lvl], avbow_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdbow_total[lvl], gdbow_mon[lvl], gdbow_vault[lvl]); file_putf(stats_log," Very good: %f From Monsters: %f In Vaults: %f \n", vgbow_total[lvl], vgbow_mon[lvl], vgbow_vault[lvl]); file_putf(stats_log," Xtra might: %f From Monsters: %f In Vaults: %f \n", xmbow_total[lvl], xmbow_mon[lvl], xmbow_vault[lvl]); file_putf(stats_log," Xtra shots: %f From Monsters: %f In Vaults: %f \n", xsbow_total[lvl], xsbow_mon[lvl], xsbow_vault[lvl]); file_putf(stats_log," Buckland: %f From Monsters: %f In Vaults: %f \n", bubow_total[lvl], bubow_mon[lvl], bubow_vault[lvl]); file_putf(stats_log," Telep: %f From Monsters: %f In Vaults: %f \n", tebow_total[lvl], tebow_mon[lvl], tebow_vault[lvl]); file_putf(stats_log," Cursed: %f From Monsters: %f In Vaults: %f \n", cubow_total[lvl], cubow_mon[lvl], cubow_vault[lvl]); /* print armor heading */ file_putf(stats_log,"\n"); file_putf(stats_log," ARMOR INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", arm_total[lvl],arm_mon[lvl],arm_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdarm_total[lvl], bdarm_mon[lvl], bdarm_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avarm_total[lvl], avarm_mon[lvl], avarm_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdarm_total[lvl], gdarm_mon[lvl], gdarm_vault[lvl]); file_putf(stats_log," STR total: %f From Monsters: %f In Vaults: %f \n", strarm_total[lvl], strarm_mon[lvl], strarm_vault[lvl]); file_putf(stats_log," INT total: %f From Monsters: %f In Vaults: %f \n", intarm_total[lvl], intarm_mon[lvl], intarm_vault[lvl]); file_putf(stats_log," WIS total: %f From Monsters: %f In Vaults: %f \n", wisarm_total[lvl], wisarm_mon[lvl], wisarm_vault[lvl]); file_putf(stats_log," DEX total: %f From Monsters: %f In Vaults: %f \n", dexarm_total[lvl], dexarm_mon[lvl], dexarm_vault[lvl]); file_putf(stats_log," CON total: %f From Monsters: %f In Vaults: %f \n", conarm_total[lvl], conarm_mon[lvl], conarm_vault[lvl]); file_putf(stats_log," cursed total: %f From Monsters: %f In Vaults: %f \n", cuarm_total[lvl], cuarm_mon[lvl], cuarm_vault[lvl]); /* ring stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," RING INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", ring_total[lvl], ring_mon[lvl], ring_vault[lvl]); file_putf(stats_log," cursed total: %f From Monsters: %f In Vaults: %f \n", curing_total[lvl], curing_mon[lvl], curing_vault[lvl]); file_putf(stats_log," Speed total: %f From Monsters: %f In Vaults: %f \n", spring_total[lvl], spring_mon[lvl], spring_vault[lvl]); file_putf(stats_log," Stat total: %f From Monsters: %f In Vaults: %f \n", string_total[lvl], string_mon[lvl], string_vault[lvl]); file_putf(stats_log," FA total: %f From Monsters: %f In Vaults: %f \n", faring_total[lvl], faring_mon[lvl], faring_vault[lvl]); file_putf(stats_log," SI total: %f From Monsters: %f In Vaults: %f \n", siring_total[lvl], siring_mon[lvl], siring_vault[lvl]); file_putf(stats_log," rpois total: %f From Monsters: %f In Vaults: %f \n", poring_total[lvl], poring_mon[lvl], poring_vault[lvl]); file_putf(stats_log," brand total: %f From Monsters: %f In Vaults: %f \n", brring_total[lvl], brring_mon[lvl], brring_vault[lvl]); file_putf(stats_log," Elven total: %f From Monsters: %f In Vaults: %f \n", elring_total[lvl], elring_mon[lvl], elring_vault[lvl]); file_putf(stats_log," One total: %f From Monsters: %f In Vaults: %f \n", onering_total[lvl], onering_mon[lvl], onering_vault[lvl]); /* amulet stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," AMULET INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", amu_total[lvl], amu_mon[lvl], amu_vault[lvl]); file_putf(stats_log," Wisdom: %f From Monsters: %f In Vaults: %f \n", wisamu_total[lvl], wisamu_mon[lvl], wisamu_vault[lvl]); file_putf(stats_log," Endgame: %f From Monsters: %f In Vaults: %f \n", endamu_total[lvl], endamu_mon[lvl], endamu_vault[lvl]); file_putf(stats_log," Telep: %f From Monsters: %f In Vaults: %f \n", teamu_total[lvl], teamu_mon[lvl], teamu_vault[lvl]); file_putf(stats_log," Cursed: %f From Monsters: %f In Vaults: %f \n", cuamu_total[lvl], cuamu_mon[lvl], cuamu_vault[lvl]); /* print ammo stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," AMMO INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", ammo_total[lvl],ammo_mon[lvl],ammo_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdammo_total[lvl], bdammo_mon[lvl], bdammo_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avammo_total[lvl], avammo_mon[lvl], avammo_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdammo_total[lvl], gdammo_mon[lvl], gdammo_vault[lvl]); file_putf(stats_log," Ego: %f From Monsters: %f In Vaults: %f \n", egammo_total[lvl], egammo_mon[lvl], egammo_vault[lvl]); file_putf(stats_log," Mith/Seek: %f From Monsters: %f In Vaults: %f \n", vgammo_total[lvl], vgammo_mon[lvl], vgammo_vault[lvl]); file_putf(stats_log," M/S ego: %f From Monsters: %f In Vaults: %f \n", awammo_total[lvl], awammo_mon[lvl], awammo_vault[lvl]); file_putf(stats_log," M/S slay evil:%f From Monsters: %f In Vaults: %f \n", evammo_total[lvl], evammo_mon[lvl], evammo_vault[lvl]); file_putf(stats_log," M/S Holy: %f From Monsters: %f In Vaults: %f \n", hmammo_total[lvl], hmammo_mon[lvl], hmammo_vault[lvl]); /*print potion stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," POTION INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", pot_total[lvl], pot_mon[lvl], pot_vault[lvl]); file_putf(stats_log," Stat total: %f From Monsters: %f In Vaults: %f \n", gain_total[lvl], gain_mon[lvl], gain_vault[lvl]); file_putf(stats_log," Rmana total: %f From Monsters: %f In Vaults: %f \n", rmana_total[lvl], rmana_mon[lvl], rmana_vault[lvl]); file_putf(stats_log," *Heal* total: %f From Monsters: %f In Vaults: %f \n", bigheal_total[lvl], bigheal_mon[lvl], bigheal_vault[lvl]); /*print scroll stuff*/ file_putf(stats_log,"\n"); file_putf(stats_log," SCROLL INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", scroll_total[lvl], scroll_mon[lvl], scroll_vault[lvl]); file_putf(stats_log," Endgame: %f From Monsters: %f In Vaults: %f \n", escroll_total[lvl], escroll_mon[lvl], escroll_vault[lvl]); file_putf(stats_log," Acq total: %f From Monsters: %f In Vaults: %f \n", acq_total[lvl], acq_mon[lvl], acq_vault[lvl]); /* print rod stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," ROD INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", rod_total[lvl], rod_mon[lvl], rod_vault[lvl]); file_putf(stats_log," Util total: %f From Monsters: %f In Vaults: %f \n", urod_total[lvl], urod_mon[lvl], urod_vault[lvl]); file_putf(stats_log," TO total: %f From Monsters: %f In Vaults: %f \n", torod_total[lvl], torod_mon[lvl], torod_vault[lvl]); file_putf(stats_log," DAll total: %f From Monsters: %f In Vaults: %f \n", drod_total[lvl], drod_mon[lvl], drod_vault[lvl]); file_putf(stats_log," Endgame: %f From Monsters: %f In Vaults: %f \n", erod_total[lvl], erod_mon[lvl], erod_vault[lvl]); /* print staff stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," STAFF INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", staff_total[lvl], staff_mon[lvl], staff_vault[lvl]); file_putf(stats_log," Speed total: %f From Monsters: %f In Vaults: %f \n", sstaff_total[lvl], sstaff_mon[lvl], sstaff_vault[lvl]); file_putf(stats_log," *Dest* total: %f From Monsters: %f In Vaults: %f \n", dstaff_total[lvl], dstaff_mon[lvl], dstaff_vault[lvl]); file_putf(stats_log," Kill total: %f From Monsters: %f In Vaults: %f \n", kstaff_total[lvl], kstaff_mon[lvl], kstaff_vault[lvl]); file_putf(stats_log," Powerful: %f From Monsters: %f In Vaults: %f \n", pstaff_total[lvl], pstaff_mon[lvl], pstaff_vault[lvl]); /* print wand stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," WAND INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", wand_total[lvl], wand_mon[lvl], wand_vault[lvl]); file_putf(stats_log," TO total: %f From Monsters: %f In Vaults: %f \n", towand_total[lvl], towand_mon[lvl], towand_vault[lvl]); /* print book stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," MAGIC/PRAYER BOOK INFO \n"); file_putf(stats_log," MB1: %f From Monsters: %f In Vaults: %f \n", b1_total[lvl], b1_mon[lvl], b1_vault[lvl]); file_putf(stats_log," MB2: %f From Monsters: %f In Vaults: %f \n", b2_total[lvl], b2_mon[lvl], b2_vault[lvl]); file_putf(stats_log," MB3: %f From Monsters: %f In Vaults: %f \n", b3_total[lvl], b3_mon[lvl], b3_vault[lvl]); file_putf(stats_log," MB4: %f From Monsters: %f In Vaults: %f \n", b4_total[lvl], b4_mon[lvl], b4_vault[lvl]); file_putf(stats_log," MB5: %f From Monsters: %f In Vaults: %f \n", b5_total[lvl], b5_mon[lvl], b5_vault[lvl]); file_putf(stats_log," MB6: %f From Monsters: %f In Vaults: %f \n", b6_total[lvl], b6_mon[lvl], b6_vault[lvl]); file_putf(stats_log," MB7: %f From Monsters: %f In Vaults: %f \n", b7_total[lvl], b7_mon[lvl], b7_vault[lvl]); file_putf(stats_log," MB8: %f From Monsters: %f In Vaults: %f \n", b8_total[lvl], b8_mon[lvl], b8_vault[lvl]); file_putf(stats_log," MB9: %f From Monsters: %f In Vaults: %f \n", b9_total[lvl], b9_mon[lvl], b9_vault[lvl]); /* print gold heading */ file_putf(stats_log,"\n"); file_putf(stats_log," MONEY INFO \n"); file_putf(stats_log,"total gold: %f From Monsters %f\n", gold_total[lvl],gold_mon[lvl]); } /* * Compute and print the mean and standard deviation for an array of known size* */ static void mean_and_stdv(int array[TRIES_SIZE]) { int k, maxiter; double tot=0, mean, stdev, temp=0; /* get the maximum iteration value */ if (tries > TRIES_SIZE) maxiter = TRIES_SIZE; else maxiter = tries; /* sum the array */ for (k = 0; k < maxiter; k++) tot += array[k]; /* compute the mean */ mean = tot / tries; /* sum up the squares */ for (k = 0; k < maxiter; k++) temp += (array[k] - mean) * (array[k] - mean); /* compute standard dev */ stdev = sqrt(temp / tries); /* print to file */ file_putf(stats_log," mean: %f std-dev: %f \n",mean,stdev); } /* calculated the probability of finding an item by * a specific level, and print it to the output file */ static void prob_of_find(double stat[MAX_LVL]) { static int lvl,tmpcount; double find = 0.0, tmpfind = 0.0; /* skip town level */ for (lvl = 1; lvl < MAX_LVL ; lvl++) { /* calculate the probability of not finding the stat */ tmpfind=(1 - stat[lvl]); /* maximum probability is 98% */ if (tmpfind < 0.02) tmpfind = 0.02; /* multiply probabilities of not finding */ if (find <= 0) find = tmpfind; else find *= tmpfind; /* increase count to 5 */ tmpcount++; /* print output every 5 levels */ if (tmpcount == 5) { /* print it */ file_putf(stats_log,"%f \t",1-find); /* reset temp counter */ tmpcount=0; } } /* put a new line in prep of next entry */ file_putf(stats_log,"\n"); } /* Left this function unlinked for now */ #if 0 static double total(double stat[MAX_LVL]) { int k; double out=0; for (k = 0; k < MAX_LVL; k++) { out += stat[k]; } return out; } #endif /* post process select items */ static void post_process_stats(void) { double arttot; int k; /* output a title */ file_putf(stats_log,"\n"); file_putf(stats_log,"***** POST PROCESSING *****\n"); file_putf(stats_log,"\n"); file_putf(stats_log,"Item \t5\t\t\t10\t\t\t15\t\t\t20\t\t\t25\t\t\t"); file_putf(stats_log,"30\t\t\t35\t\t\t40\t\t\t45\t\t\t50\t\t\t"); file_putf(stats_log,"55\t\t\t60\t\t\t65\t\t\t70\t\t\t75\t\t\t"); file_putf(stats_log,"80\t\t\t85\t\t\t90\t\t\t95\t\t\t100\n"); file_putf(stats_log,"FA \t"); prob_of_find(faeq_total); mean_and_stdv(fa_it); file_putf(stats_log,"SinV \t"); prob_of_find(sieq_total); mean_and_stdv(si_it); file_putf(stats_log,"RBl \t"); prob_of_find(bleq_total); mean_and_stdv(bl_it); file_putf(stats_log,"RCf \t"); prob_of_find(cfeq_total); mean_and_stdv(cf_it); file_putf(stats_log,"Nexus \t"); prob_of_find(nxeq_total); mean_and_stdv(nx_it); file_putf(stats_log,"Pois \t"); prob_of_find(poeq_total); mean_and_stdv(po_it); file_putf(stats_log,"Tel \t"); prob_of_find(teeq_total); mean_and_stdv(te_it); file_putf(stats_log,"\n"); file_putf(stats_log,"mb1 \t"); prob_of_find(b1_total); mean_and_stdv(mb1_it); file_putf(stats_log,"mb2 \t"); prob_of_find(b2_total); mean_and_stdv(mb2_it); file_putf(stats_log,"mb3 \t"); prob_of_find(b3_total); mean_and_stdv(mb3_it); file_putf(stats_log,"mb4 \t"); prob_of_find(b4_total); mean_and_stdv(mb4_it); file_putf(stats_log,"mb5 \t"); prob_of_find(b5_total); mean_and_stdv(mb5_it); file_putf(stats_log,"mb6 \t"); prob_of_find(b6_total); mean_and_stdv(mb6_it); file_putf(stats_log,"mb7 \t"); prob_of_find(b7_total); mean_and_stdv(mb7_it); file_putf(stats_log,"mb8 \t"); prob_of_find(b8_total); mean_and_stdv(mb8_it); file_putf(stats_log,"mb9 \t"); prob_of_find(b9_total); mean_and_stdv(mb9_it); /* print artifact total */ arttot=0; for (k=0; k < MAX_LVL; k++) arttot += art_total[k]; file_putf(stats_log,"\n"); file_putf(stats_log,"Total number of artifacts found %f \n",arttot); mean_and_stdv(art_it); /* temporary stuff goes here */ /* Dungeon book totals for Eddie file_putf(stats_log,"mb5: %f\n",total(b5_total)); file_putf(stats_log,"mb6: %f\n",total(b6_total)); file_putf(stats_log,"mb7: %f\n",total(b7_total)); file_putf(stats_log,"mb8: %f\n",total(b8_total)); file_putf(stats_log,"mb9: %f\n",total(b9_total)); */ } /* * Scans the dungeon for objects */ static void scan_for_objects(bool mon, bool uniq) { int y, x; for (y = 1; y < DUNGEON_HGT - 1; y++) { for (x = 1; x < DUNGEON_WID - 1; x++) { const object_type *o_ptr; /* Do not be fooled! * * Despite its harmless-seeming name, get_obj_data() does a host * of crazy things, including deleting the object from the square. * * This is why we repeatedly get the first object. */ while ((o_ptr = get_first_object(y, x))) { get_obj_data(o_ptr,y,x,mon,uniq); } } } } /* * This will scan the dungeon for monsters and then kill each * and every last one. */ static void scan_for_monsters(bool uniq) { int i; /* Go through the monster list */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->r_idx) continue; stats_monster(m_ptr,i, uniq); } } /* * This is the entry point for generation statistics. */ static void stats_collect_level(void) { /* Make a dungeon */ cave_generate(cave,p_ptr); /* Scan for objects, these are floor objects */ scan_for_objects(FALSE,FALSE); /* Get stats (and kill) all non-unique monsters */ scan_for_monsters(FALSE); /* Do second scan for objects, monster objects */ scan_for_objects(TRUE,FALSE); /* Get stats (and kill) all unique monster */ scan_for_monsters(TRUE); /* Do third scan for objects, unique objects */ scan_for_objects(TRUE,TRUE); } /* * this code will go through the artifact list and * make each artifact uncreated so that our sim player * can find them again! */ static void uncreate_artifacts(void) { int i; /* Loop through artifacts */ for (i = 0; z_info && i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; /* uncreate */ a_ptr->created = FALSE; } } /* * This will revive all the uniques so the sim player * can kill them again. */ static void revive_uniques(void) { int i; for (i = 1; i < z_info->r_max - 1; i++) { /* get the monster info */ monster_race *r_ptr = &r_info[i]; /* revive the unique monster */ if (rf_has(r_ptr->flags, RF_UNIQUE)) r_ptr->max_num = 1; } } /* * This function loops through the level and does N iterations of * the stat calling function. */ static void diving_stats(void) { int depth; /* iterate through levels */ for (depth = 0; depth < MAX_LVL; depth += 5) { p_ptr->depth = depth; if (p_ptr->depth == 0) p_ptr->depth = 1; /* do many iterations of each level */ for (iter = 0; iter < tries; iter++) { /* get level output */ stats_collect_level(); } /* print the output to the file */ print_stats(depth); /* show the level to check on status */ do_cmd_redraw(); } } static void clearing_stats(void) { int depth; /* do many iterations of the game */ for (iter=0; iter < tries; iter++) { /* move all artifacts to uncreated */ uncreate_artifacts(); /* move all uniques to alive */ revive_uniques(); /* do randart regen */ if ((regen) && (iterdepth = depth; /* get stats */ stats_collect_level(); //debug //msg_format("Finished level %d,depth"); } msg("Iteration %d complete",iter); } /* print to file */ for (depth=0 ; depth < MAX_LVL; depth++) print_stats(depth); /* post processing */ post_process_stats(); /* display the current level */ do_cmd_redraw(); } /* * Prompt the user for params for the stats. * Sim type and number of sims */ static int stats_prompt(void) { static int temp,simtype=1; static char tmp_val[100], yn; static char prompt[50]; /* This is the prompt for no. of tries*/ strnfmt(prompt, sizeof(prompt), "Num of simulations: "); /* This is the default value (50) */ strnfmt(tmp_val, sizeof(tmp_val), "%d", tries); /* Ask for the input */ if (!get_string(prompt,tmp_val,7)) return 0; /* get the new value */ temp = atoi(tmp_val); /* convert */ if (temp < 1) temp = 1; /* save */ tries=temp; /* set 'value to add' for arrays */ addval = 1.0/tries; /* Get info on what type of run to do */ strnfmt(prompt, sizeof(prompt), "Type of Sim: Diving (1) or Clearing (2) "); /* set default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", simtype); /* get the input */ if (!get_string(prompt,tmp_val,4)) return 0; temp=atoi(tmp_val); /* make sure that the type is good */ if ((temp == 1) || (temp == 2)) simtype = temp; else return 0; /* for clearing sim, check for randart regen */ if (temp == 2) { /* Prompt */ strnfmt(prompt, sizeof(prompt), "Regen randarts? (warning SLOW)"); yn = get_char(prompt, "yn", 3, 'n'); if (( yn == 'y') || (yn == 'Y')) regen=TRUE; else regen = FALSE; } return simtype; } /* *This is the call from wiz_stats. The top level function * in this code */ void stats_collect(void) { static int simtype; static bool auto_flag; char buf[1024]; int i; /* prompt the user for sim params */ simtype=stats_prompt(); /* make sure the results are good! */ if (!((simtype == 1) || (simtype == 2))) return; /* are we in diving or clearing mode */ if (simtype == 2) clearing = TRUE; else clearing = FALSE; /*Open log file*/ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "stats.log"); stats_log = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Logging didn't work */ if (!stats_log) { msg("Error - can't open stats.log for writing."); exit(1); } /* turn on auto-more. This will clear prompts for items * that drop under the player, or that can't fit on the * floor due to too many items. This is a very small amount * of items, even on deeper levels, so it's not worth worrying * too much about. */ auto_flag = FALSE; if (!OPT(auto_more)) { /* remember that we turned off auto_more */ auto_flag = TRUE; /* Turn on auto-more */ option_set(option_name(OPT_auto_more),TRUE); } /* print heading for the file */ print_heading(); /* make sure all stats are 0 */ for (i = 0; i < MAX_LVL; i++) init_stat_vals(i); /* make sure all iter vals are 0 */ for (i = 0; i < TRIES_SIZE; i++) init_iter_vals(i); /* select diving option */ if (!clearing) diving_stats(); /* select clearing option */ if (clearing) clearing_stats(); /* Turn auto-more back off */ if (auto_flag) option_set(option_name(OPT_auto_more),FALSE); /*Close log file */ if (!file_close(stats_log)) { msg("Error - can't close randart.log file."); exit(1); } } #define DIST_MAX 10000 int cave_dist[DUNGEON_HGT][DUNGEON_WID]; void clear_cave_dist(void) { int x,y; for (y = 1; y < DUNGEON_HGT - 1; y++) { for (x = 1; x < DUNGEON_WID - 1; x++) { cave_dist[y][x] = -1; } } } void calc_cave_distances(void) { int dist, i; int oy, ox, ty, tx, d; /* Squares with distance from player of n-1 */ int d_x_old[DIST_MAX]; int d_y_old[DIST_MAX]; int d_old_max; /* Squares with distance from player of n */ int d_x_new[DIST_MAX]; int d_y_new[DIST_MAX]; int d_new_max; /* Set all cave spots to inaccessible */ clear_cave_dist(); /* Get player location */ oy = d_y_old[0] = p_ptr->py; ox = d_x_old[0] = p_ptr->px; d_old_max = 1; /* distance from player starts at 0*/ dist=0; /* Assign the distance value to the first square (player)*/ cave_dist[oy][ox] = dist; do{ d_new_max = 0; dist++; /* Loop over all visited squares of the previous iteration*/ for(i=0 ;i < d_old_max; i++) { /* Get the square we want to look at */ oy = d_y_old[i]; ox = d_x_old[i]; //debug //msg("x: %d y: %d dist: %d %d ",ox,oy,dist-1,i); /* Get all adjacent squares */ for (d = 0; d < 8; d++) { /* Adjacent square location */ ty = oy + ddy_ddd[d]; tx = ox + ddx_ddd[d]; if (!(in_bounds_fully(ty,tx))) continue; /* Have we been here before? */ if (cave_dist[ty][tx] >= 0) continue; /* Is it a wall? */ if (cave->feat[ty][tx] > FEAT_RUBBLE) continue; /* Add the new location */ d_y_new[d_new_max] = ty; d_x_new[d_new_max] = tx; /* Assign the distance to that spot */ cave_dist[ty][tx] = dist; d_new_max++; //debug //msg("x: %d y: %d dist: %d ",tx,ty,dist); } } /* copy the new distance list to the old one */ for (i=0 ;i 0) || dist == DIST_MAX); } void pit_stats(void) { int tries = 1000; int depth = p_ptr->command_arg; int hist[z_info->pit_max]; int j, p; int type = 1; char tmp_val[100]; /* Initialize hist */ for (p = 0; p < z_info->pit_max; p++) hist[p] = 0; /* Format default value */ strnfmt(tmp_val, sizeof(tmp_val), "%d", tries); /* Ask for the input - take the first 7 characters*/ if (!get_string("Num of simulations: ", tmp_val, 7)) return; /* get the new value */ tries = atoi(tmp_val); if (tries < 1) tries = 1; /* Format second default value */ strnfmt(tmp_val, sizeof(tmp_val), "%d", type); /* Ask for the input - take the first 7 characters*/ if (!get_string("Pit type: ", tmp_val, 7)) return; /* get the new value */ type = atoi(tmp_val); if (type < 1) type = 1; if (depth <= 0) { /* Format second default value */ strnfmt(tmp_val, sizeof(tmp_val), "%d", p_ptr->depth); /* Ask for the input - take the first 7 characters*/ if (!get_string("Depth: ", tmp_val, 7)) return; /* get the new value */ depth = atoi(tmp_val); if (depth < 1) depth = 1; } for (j = 0; j < tries; j++) { int i; int pit_idx = 0; int pit_dist = 999; for (i = 0; i < z_info->pit_max; i++) { int offset, dist; pit_profile *pit = &pit_info[i]; if (!pit->name || pit->room_type != type) continue; offset = Rand_normal(pit->ave, 10); dist = ABS(offset - depth); if (dist < pit_dist && one_in_(pit->rarity)) { pit_idx = i; pit_dist = dist; } } hist[pit_idx]++; } for (p = 0; p < z_info->pit_max; p++) { pit_profile *pit = &pit_info[p]; if (pit->name) msg("Type: %s, Number: %d.", pit->name, hist[p]); } return; } /* Gather whether the dungeon has disconnects in it * and whether the player is disconnected from the stairs */ void disconnect_stats(void) { int i,y,x; bool has_dsc, has_dsc_from_stairs; static int temp; static char tmp_val[100]; static char prompt[50]; long dsc_area=0, dsc_from_stairs=0; /* This is the prompt for no. of tries*/ strnfmt(prompt, sizeof(prompt), "Num of simulations: "); /* This is the default value (50) */ strnfmt(tmp_val, sizeof(tmp_val), "%d", tries); /* Ask for the input */ if (!get_string(prompt,tmp_val,7)) return; /* get the new value */ temp = atoi(tmp_val); /* convert */ if (temp < 1) temp = 1; /* save */ tries=temp; for (i = 1; i <= tries; i++) { /* assume no disconnected areas */ has_dsc = FALSE; /* assume you can't get to stairs */ has_dsc_from_stairs = TRUE; /* Make a new cave */ cave_generate(cave,p_ptr); /* Fill the distance array */ calc_cave_distances(); /*Cycle through the dungeon */ for (y = 1; y < DUNGEON_HGT - 1; y++) { for (x = 1; x < DUNGEON_WID - 1; x++) { /* don't care about walls */ if (cave->feat[y][x] > FEAT_RUBBLE) continue; /* Can we get there? */ if (cave_dist[y][x] >= 0) { /* Is it a down stairs? */ if ((cave->feat[y][x] == FEAT_MORE))// || //(cave->feat[y][x] == FEAT_LESS)) { has_dsc_from_stairs = FALSE; //debug //msg("dist to stairs: %d",cave_dist[y][x]); } continue; } /* Ignore vaults as they are often disconnected */ if (cave->info[y][x] & (CAVE_ICKY)) continue; /* We have a disconnected area */ has_dsc = TRUE; } } if (has_dsc_from_stairs) dsc_from_stairs++; if (has_dsc) dsc_area++; msg("Iteration: %d",i); } msg("Total levels with disconnected areas: %ld",dsc_area); msg("Total levels isolated from stairs: %ld",dsc_from_stairs); /* redraw the level */ do_cmd_redraw(); } #else /* USE_STATS */ void stats_collect(void) { msg("Statistics generation not turned on in this build."); } void disconnect_stats(void) { msg("Statistics generation not turned on in this build."); } void pit_stats(void) { msg("Statistics generation not turned on in this build."); } #endif /* USE_STATS */ angband-v3.3.2/src/h-basic.h0000644000175000017500000001237011651552410015060 0ustar chriscchrisc#ifndef INCLUDED_H_BASIC_H #define INCLUDED_H_BASIC_H /* * Include autoconf autodetections, otherwise try to autodetect ourselves */ #ifdef HAVE_CONFIG_H # include "autoconf.h" #else /* * Extract the "WINDOWS" flag from the compiler */ # if defined(_Windows) || defined(__WINDOWS__) || \ defined(__WIN32__) || defined(WIN32) || \ defined(__WINNT__) || defined(__NT__) # ifndef WINDOWS # define WINDOWS # endif # endif /* Necessary? */ #ifdef NDS # include # include # include # include # include #endif /* * Using C99, assume we have stdint and stdbool */ # if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L # define HAVE_STDINT_H # define HAVE_STDBOOL_H # endif /* * Everyone except RISC OS has fcntl.h and sys/stat.h */ #define HAVE_FCNTL_H #define HAVE_STAT #endif /* HAVE_CONFIG_H */ /* * OPTION: set "SET_UID" if the machine is a "multi-user" wmachine. * * This option is used to verify the use of "uids" and "gids" for * various "Unix" calls, and of "pids" for getting a random seed, * and of the "umask()" call for various reasons, and to guess if * the "kill()" function is available, and for permission to use * functions to extract user names and expand "tildes" in filenames. * It is also used for "locking" and "unlocking" the score file. * Basically, SET_UID should *only* be set for "Unix" machines. */ #if !defined(MACH_O_CARBON) && !defined(WINDOWS) && \ !defined(GAMEBOY) && !defined(NDS) # define SET_UID /* Without autoconf, turn on some things */ # ifndef HAVE_CONFIG_H # define HAVE_DIRENT_H # define HAVE_SETEGID # if defined(linux) # define HAVE_SETRESGID # endif # endif #endif /* * Every system seems to use its own symbol as a path separator. * * Default to the standard Unix slash, but attempt to change this * for various other systems. Note that any system that uses the * "period" as a separator (i.e. RISCOS) will have to pretend that * it uses the slash, and do its own mapping of period <-> slash. * * It is most definitely wrong to have such things here. Platform-specific * code should handle shifting Angband filenames to platform ones. XXX */ #undef PATH_SEP #define PATH_SEP "/" #define PATH_SEPC '/' #ifdef WINDOWS # undef PATH_SEP # undef PATH_SEPC # define PATH_SEP "\\" # define PATH_SEPC '\\' #endif /*** Include the library header files ***/ /* Use various POSIX functions if available */ #undef _GNU_SOURCE #define _GNU_SOURCE /** ANSI C headers **/ #include #include #include #include #include #include #include #include #include #include /** POSIX headers **/ #if defined(SET_UID) || defined(MACH_O_CARBON) # include # include # include #endif /*** Define the basic game types ***/ /* * errr is an error code * * A "byte" is an unsigned byte of memory. * s16b/u16b are exactly 2 bytes (where possible) * s32b/u32b are exactly 4 bytes (where possible) */ /* C++ defines its own bool type, so we hack around it */ #undef bool #define bool bool_hack typedef int errr; /* * Use a real bool type where possible */ #ifdef HAVE_STDBOOL_H #include #define TRUE true #define FALSE false #else /* Use a char otherwise */ typedef char bool; #undef TRUE #undef FALSE #define TRUE 1 #define FALSE 0 #endif /* * Use guaranteed-size ints where possible */ #ifdef HAVE_STDINT_H /* Use guaranteed-size types */ #include typedef uint8_t byte; typedef uint16_t u16b; typedef int16_t s16b; typedef uint32_t u32b; typedef int32_t s32b; typedef uint64_t u64b; typedef int64_t s64b; #define MAX_UCHAR UINT8_MAX #define MAX_SHORT INT16_MAX #else /* HAVE_STDINT_H */ /* Try hacks instead (not guaranteed to work) */ typedef unsigned char byte; typedef signed short s16b; typedef unsigned short u16b; #define MAX_UCHAR UCHAR_MAX #define MAX_SHORT 32767 /* Detect >32-bit longs */ #if (UINT_MAX == 0xFFFFFFFFUL) && (ULONG_MAX > 0xFFFFFFFFUL) typedef signed int s32b; typedef unsigned int u32b; #else typedef signed long s32b; typedef unsigned long u32b; #endif #endif /* HAVE_STDINT_H */ /** Debugging macros ***/ #define DSTRINGIFY(x) #x #define DSTRING(x) DSTRINGIFY(x) #define DHERE __FILE__ ":" DSTRING(__LINE__) ": " /*** Basic math macros ***/ #undef MIN #undef MAX #undef ABS #undef SGN #undef CMP #define MIN(a,b) (((a) > (b)) ? (b) : (a)) #define MAX(a,b) (((a) < (b)) ? (b) : (a)) #define ABS(a) (((a) < 0) ? (-(a)) : (a)) #define SGN(a) (((a) < 0) ? (-1) : ((a) != 0)) #define CMP(a,b) ((a) < (b) ? -1 : ((b) < (a) ? 1 : 0)) /*** Useful fairly generic macros ***/ /* * Given an array, determine how many elements are in it. */ #define N_ELEMENTS(a) (sizeof(a) / sizeof((a)[0])) /* * Return "s" (or not) depending on whether n is singular. */ #define PLURAL(n) ((n) == 1 ? "" : "s") /*** Some hackish character manipulation ***/ /* * Note that all "index" values must be "lowercase letters", while * all "digits" must be "digits". */ #define A2I(X) ((X) - 'a') #define I2A(X) ((X) + 'a') #define D2I(X) ((X) - '0') #define I2D(X) ((X) + '0') #endif /* INCLUDED_H_BASIC_H */ angband-v3.3.2/src/target.h0000644000175000017500000000063011651552410015034 0ustar chriscchrisc/* target.h - target interface */ #ifndef TARGET_H #define TARGET_H bool target_able(int m_idx); bool target_okay(void); bool target_set_closest(int mode); void target_set_monster(int m_idx); void target_set_location(int y, int x); bool target_set_interactive(int mode, int x, int y); bool get_aim_dir(int *dp); void target_get(s16b *col, s16b *row); s16b target_get_monster(void); #endif /* !TARGET_H */ angband-v3.3.2/src/keymap.c0000644000175000017500000000762711651552410015044 0ustar chriscchrisc/* * File: keymap.c * Purpose: Keymap handling * * Copyright (c) 2011 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "keymap.h" /** * Keymap implementation. * * Keymaps are defined in pref files and map onto the internal game keyset, * which is roughly what you get if you have roguelike keys turned off. * * We store keymaps by pairing triggers with actions; the trigger is a single * keypress and the action is stored as a string of keypresses, terminated * with a keypress with type == EVT_NONE. * * XXX We should note when we read in keymaps that are "official game" keymaps * and ones which are user-defined. Then we can avoid writing out official * game ones and messing up everyone's pref files with a load of junk. */ /** * Struct for a keymap. */ struct keymap { struct keypress key; struct keypress *actions; bool user; /* User-defined keymap */ struct keymap *next; }; /** * List of keymaps. */ static struct keymap *keymaps[KEYMAP_MODE_MAX]; /** * Find a keymap, given a keypress. */ const struct keypress *keymap_find(int keymap, struct keypress kc) { struct keymap *k; assert(keymap >= 0 && keymap < KEYMAP_MODE_MAX); for (k = keymaps[keymap]; k; k = k->next) { if (k->key.code == kc.code && k->key.mods == kc.mods) return k->actions; } return NULL; } /** * Duplicate a given keypress string and return the duplicate. */ static struct keypress *keymap_make(const struct keypress *actions) { struct keypress *new; size_t n = 0; while (actions[n].type) { n++; } /* Make room for the terminator */ n += 1; new = mem_zalloc(sizeof *new * n); memcpy(new, actions, sizeof *new * n); new[n - 1].type = EVT_NONE; return new; } /** * Add a keymap to the mappings table. */ void keymap_add(int keymap, struct keypress trigger, struct keypress *actions, bool user) { struct keymap *k = mem_zalloc(sizeof *k); assert(keymap >= 0 && keymap < KEYMAP_MODE_MAX); keymap_remove(keymap, trigger); k->key = trigger; k->actions = keymap_make(actions); k->user = user; k->next = keymaps[keymap]; keymaps[keymap] = k; return; } /** * Remove a keymap. Return TRUE if one was removed. */ bool keymap_remove(int keymap, struct keypress trigger) { struct keymap *k; struct keymap *prev = NULL; assert(keymap >= 0 && keymap < KEYMAP_MODE_MAX); for (k = keymaps[keymap]; k; k = k->next) { if (k->key.code == trigger.code && k->key.mods == trigger.mods) { mem_free(k->actions); if (prev) prev->next = k->next; else keymaps[keymap] = k->next; mem_free(k); return TRUE; } prev = k; } return FALSE; } /** * Forget and free all keymaps. */ void keymap_free(void) { size_t i; struct keymap *k; for (i = 0; i < N_ELEMENTS(keymaps); i++) { k = keymaps[i]; while (k) { struct keymap *next = k->next; mem_free(k->actions); mem_free(k); k = next; } } } /* * Append active keymaps to a given file. */ void keymap_dump(ang_file *fff) { int mode; struct keymap *k; if (OPT(rogue_like_commands)) mode = KEYMAP_MODE_ROGUE; else mode = KEYMAP_MODE_ORIG; for (k = keymaps[mode]; k; k = k->next) { char buf[1024]; struct keypress key[2] = { { 0 }, { 0 } }; if (!k->user) continue; /* Encode the action */ keypress_to_text(buf, sizeof(buf), k->actions, FALSE); file_putf(fff, "A:%s\n", buf); /* Convert the key into a string */ key[0] = k->key; keypress_to_text(buf, sizeof(buf), key, TRUE); file_putf(fff, "C:%d:%s\n", mode, buf); file_putf(fff, "\n"); } } angband-v3.3.2/src/z-bitflag.c0000644000175000017500000003305011651552410015422 0ustar chriscchrisc/* * File: z-bitflag.c * Purpose: Low-level bit vector manipulation * * Copyright (c) 2010 William L Moore * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "z-bitflag.h" /** * Tests if a flag is "on" in a bitflag set. * * TRUE is returned when `flag` is on in `flags`, and FALSE otherwise. * The flagset size is supplied in `size`. */ bool flag_has(const bitflag *flags, const size_t size, const int flag) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); if (flag == FLAG_END) return FALSE; assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return TRUE; return FALSE; } bool flag_has_dbg(const bitflag *flags, const size_t size, const int flag, const char *fi, const char *fl) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); if (flag == FLAG_END) return FALSE; if (flag_offset >= size) { quit_fmt("Error in flag_has(%s, %s): FlagID[%d] Size[%u] FlagOff[%u] FlagBV[%d]\n", fi, fl, flag, (unsigned int) size, (unsigned int) flag_offset, flag_binary); } assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return TRUE; return FALSE; } /** * Interates over the flags which are "on" in a bitflag set. * * Returns the next on flag in `flags`, starting from (and including) * `flag`. FLAG_END will be returned when the end of the flag set is reached. * Iteration will start at the beginning of the flag set when `flag` is * FLAG_END. The bitfield size is supplied in `size`. */ int flag_next(const bitflag *flags, const size_t size, const int flag) { const int max_flags = FLAG_MAX(size); int f, flag_offset, flag_binary; for (f = flag; f < max_flags; f++) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); if (flags[flag_offset] & flag_binary) return f; } return FLAG_END; } /** * Tests a bitfield for emptiness. * * TRUE is returned when no flags are set in `flags`, and FALSE otherwise. * The bitfield size is supplied in `size`. */ bool flag_is_empty(const bitflag *flags, const size_t size) { size_t i; for (i = 0; i < size; i++) if (flags[i] > 0) return FALSE; return TRUE; } /** * Tests a bitfield for fullness. * * TRUE is returned when all flags are set in `flags`, and FALSE otherwise. * The bitfield size is supplied in `size`. */ bool flag_is_full(const bitflag *flags, const size_t size) { size_t i; for (i = 0; i < size; i++) if (flags[i] != (bitflag) -1) return FALSE; return TRUE; } /** * Tests two bitfields for intersection. * * TRUE is returned when any flag is set in both `flags1` and `flags2`, and * FALSE otherwise. The size of the bitfields is supplied in `size`. */ bool flag_is_inter(const bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; for (i = 0; i < size; i++) if (flags1[i] & flags2[i]) return TRUE; return FALSE; } /** * Test if one bitfield is a subset of another. * * TRUE is returned when every set flag in `flags2` is also set in `flags1`, * and FALSE otherwise. The size of the bitfields is supplied in `size`. */ bool flag_is_subset(const bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; for (i = 0; i < size; i++) if (~flags1[i] & flags2[i]) return FALSE; return TRUE; } /** * Tests two bitfields for equality. * * TRUE is returned when the flags set in `flags1` and `flags2` are identical, * and FALSE otherwise. the size of the bitfields is supplied in `size`. */ bool flag_is_equal(const bitflag *flags1, const bitflag *flags2, const size_t size) { return (!memcmp(flags1, flags2, size * sizeof(bitflag))); } /** * Sets one bitflag in a bitfield. * * The bitflag identified by `flag` is set in `flags`. The bitfield size is * supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. */ bool flag_on(bitflag *flags, const size_t size, const int flag) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return FALSE; flags[flag_offset] |= flag_binary; return TRUE; } bool flag_on_dbg(bitflag *flags, const size_t size, const int flag, const char *fi, const char *fl) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); if (flag_offset >= size) { quit_fmt("Error in flag_on(%s, %s): FlagID[%d] Size[%u] FlagOff[%u] FlagBV[%d]\n", fi, fl, flag, (unsigned int) size, (unsigned int) flag_offset, flag_binary); } assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return FALSE; flags[flag_offset] |= flag_binary; return TRUE; } /** * Clears one flag in a bitfield. * * The bitflag identified by `flag` is cleared in `flags`. The bitfield size * is supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. */ bool flag_off(bitflag *flags, const size_t size, const int flag) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); assert(flag_offset < size); if (!(flags[flag_offset] & flag_binary)) return FALSE; flags[flag_offset] &= ~flag_binary; return TRUE; } /** * Clears all flags in a bitfield. * * All flags in `flags` are cleared. The bitfield size is supplied in `size`. */ void flag_wipe(bitflag *flags, const size_t size) { memset(flags, 0, size * sizeof(bitflag)); } /** * Sets all flags in a bitfield. * * All flags in `flags` are set. The bitfield size is supplied in `size`. */ void flag_setall(bitflag *flags, const size_t size) { memset(flags, 255, size * sizeof(bitflag)); } /** * Negates all flags in a bitfield. * * All flags in `flags` are toggled. The bitfield size is supplied in `size`. */ void flag_negate(bitflag *flags, const size_t size) { size_t i; for (i = 0; i < size; i++) flags[i] = ~flags[i]; } /** * Copies one bitfield into another. * * All flags in `flags2` are copied into `flags1`. The size of the bitfields is * supplied in `size`. */ void flag_copy(bitflag *flags1, const bitflag *flags2, const size_t size) { memcpy(flags1, flags2, size * sizeof(bitflag)); } /** * Computes the union of two bitfields. * * For every set flag in `flags2`, the corresponding flag is set in `flags1`. * The size of the bitfields is supplied in `size`. TRUE is returned when * changes were made, and FALSE otherwise. */ bool flag_union(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* !flag_is_subset() */ if (~flags1[i] & flags2[i]) delta = TRUE; flags1[i] |= flags2[i]; } return delta; } /** * Computes the union of one bitfield and the complement of another. * * For every unset flag in `flags2`, the corresponding flag is set in `flags1`. * The size of the bitfields is supplied in `size`. TRUE is returned when * changes were made, and FALSE otherwise. */ bool flag_comp_union(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* no equivalent fn */ if (!(~flags1[i] & ~flags2[i])) delta = TRUE; flags1[i] |= ~flags2[i]; } return delta; } /** * Computes the intersection of two bitfields. * * For every unset flag in `flags2`, the corresponding flag is cleared in * `flags1`. The size of the bitfields is supplied in `size`. TRUE is returned * when changes were made, and FALSE otherwise. */ bool flag_inter(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* !flag_is_equal() */ if (!(flags1[i] == flags2[i])) delta = TRUE; flags1[i] &= flags2[i]; } return delta; } /** * Computes the difference of two bitfields. * * For every set flag in `flags2`, the corresponding flag is cleared in * `flags1`. The size of the bitfields is supplied in `size`. TRUE is returned * when changes were made, and FALSE otherwise. */ bool flag_diff(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* flag_is_inter() */ if (flags1[i] & flags2[i]) delta = TRUE; flags1[i] &= ~flags2[i]; } return delta; } /** * Tests if any of multiple bitflags are set in a bitfield. * * TRUE is returned if any of the flags specified in `...` are set in `flags`, * FALSE otherwise. The bitfield size is supplied in `size`. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_test(const bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = FALSE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* flag_has() */ if (flags[flag_offset] & flag_binary) { delta = TRUE; break; } } va_end(args); return delta; } /** * Tests if all of the multiple bitflags are set in a bitfield. * * TRUE is returned if all of the flags specified in `...` are set in `flags`, * FALSE otherwise. The bitfield size is supplied in `size`. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_test_all(const bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = TRUE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* !flag_has() */ if (!(flags[flag_offset] & flag_binary)) { delta = FALSE; break; } } va_end(args); return delta; } /** * Clears multiple bitflags in a bitfield. * * The flags specified in `...` are cleared in `flags`. The bitfield size is * supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_clear(bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = FALSE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* flag_has() */ if (flags[flag_offset] & flag_binary) delta = TRUE; /* flag_off() */ flags[flag_offset] &= ~flag_binary; } va_end(args); return delta; } /** * Sets multiple bitflags in a bitfield. * * The flags specified in `...` are set in `flags`. The bitfield size is * supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_set(bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = FALSE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* !flag_has() */ if (!(flags[flag_offset] & flag_binary)) delta = TRUE; /* flag_on() */ flags[flag_offset] |= flag_binary; } va_end(args); return delta; } /** * Wipes a bitfield, and then sets multiple bitflags. * * The flags specified in `...` are set in `flags`, while all other flags are * cleared. The bitfield size is supplied in `size`. * * WARNING: FLAG_END must be the final argument in the `...` list. */ void flags_init(bitflag *flags, const size_t size, ...) { int f; va_list args; flag_wipe(flags, size); va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) flag_on(flags, size, f); va_end(args); } /** * Computes the intersection of a bitfield and multiple bitflags. * * The flags not specified in `...` are cleared in `flags`. The bitfeild size * is supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_mask(bitflag *flags, const size_t size, ...) { int f; va_list args; bool delta = FALSE; bitflag *mask; /* Build the mask */ mask = C_ZNEW(size, bitflag); va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) flag_on(mask, size, f); va_end(args); delta = flag_inter(flags, mask, size); /* Free the mask */ FREE(mask); return delta; } angband-v3.3.2/src/game-event.h0000644000175000017500000000606611651552410015607 0ustar chriscchrisc #ifndef INCLUDED_GAME_EVENT_H #define INCLUDED_GAME_EVENT_H /* The various events we can send signals about. */ typedef enum game_event_type { EVENT_MAP = 0, /* Some part of the map has changed. */ EVENT_STATS, /* One or more of the stats. */ EVENT_HP, /* HP or MaxHP. */ EVENT_MANA, /* Mana or MaxMana. */ EVENT_AC, /* Armour Class. */ EVENT_EXPERIENCE, /* Experience or MaxExperience. */ EVENT_PLAYERLEVEL, /* Player's level has changed */ EVENT_PLAYERTITLE, /* Player's title has changed */ EVENT_GOLD, /* Player's gold amount. */ EVENT_MONSTERHEALTH, /* Observed monster's health level. */ EVENT_DUNGEONLEVEL, /* Dungeon depth */ EVENT_PLAYERSPEED, /* Player's speed */ EVENT_RACE_CLASS, /* Race or Class */ EVENT_STUDYSTATUS, /* "Study" availability */ EVENT_STATUS, /* Status */ EVENT_DETECTIONSTATUS, /* Trap detection status */ EVENT_STATE, /* The three 'R's: Resting, Repeating and Searching */ EVENT_MOUSEBUTTONS, /* Displayed mouse buttons need changing */ EVENT_PLAYERMOVED, EVENT_SEEFLOOR, /* When the player would "see" floor objects */ EVENT_INVENTORY, EVENT_EQUIPMENT, EVENT_ITEMLIST, EVENT_MONSTERLIST, EVENT_MONSTERTARGET, EVENT_OBJECTTARGET, EVENT_MESSAGE, EVENT_INITSTATUS, /* New status message for initialisation */ EVENT_BIRTHPOINTS, /* Change in the birth points */ /* Changing of the game state/context. */ EVENT_ENTER_INIT, EVENT_LEAVE_INIT, EVENT_ENTER_BIRTH, EVENT_LEAVE_BIRTH, EVENT_ENTER_GAME, EVENT_LEAVE_GAME, EVENT_ENTER_STORE, EVENT_LEAVE_STORE, EVENT_ENTER_DEATH, EVENT_LEAVE_DEATH, EVENT_END /* Can be sent at the end of a series of events */ } game_event_type; #define N_GAME_EVENTS EVENT_END + 1 typedef union { struct { int x; int y; } point; const char *string; bool flag; struct { bool reset; const char *hint; int n_choices; int initial_choice; const char **choices; const char **helptexts; void *xtra; } birthstage; struct { int *stats; int remaining; } birthstats; } game_event_data; /* * A function called when a game event occurs - these are registered to be * called by event_add_handler or event_add_handler_set, and deregistered * when they should no longer be called through event_remove_handler or * event_remove_handler_set. */ typedef void game_event_handler(game_event_type type, game_event_data *data, void *user); void event_add_handler(game_event_type type, game_event_handler *fn, void *user); void event_remove_handler(game_event_type type, game_event_handler *fn, void *user); void event_remove_all_handlers(void); void event_add_handler_set(game_event_type *type, size_t n_types, game_event_handler *fn, void *user); void event_remove_handler_set(game_event_type *type, size_t n_types, game_event_handler *fn, void *user); void event_signal_birthpoints(int stats[6], int remaining); void event_signal_point(game_event_type, int x, int y); void event_signal_string(game_event_type, const char *s); void event_signal_flag(game_event_type type, bool flag); void event_signal(game_event_type); #endif /* INCLUDED_GAME_EVENT_H */ angband-v3.3.2/src/ui-event.c0000644000175000017500000001440011651552410015275 0ustar chriscchrisc/* * File: ui-event.c * Purpose: Utility functions relating to UI events * * Copyright (c) 2011 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "ui-event.h" /** * Map keycodes to their textual equivalent. */ static const struct { keycode_t code; const char *desc; } mappings[] = { { ESCAPE, "Escape" }, { KC_RETURN, "Return" }, { KC_ENTER, "Enter" }, { KC_TAB, "Tab" }, { KC_DELETE, "Delete" }, { KC_BACKSPACE, "Backspace" }, { ARROW_DOWN, "Down" }, { ARROW_LEFT, "Left" }, { ARROW_RIGHT, "Right" }, { ARROW_UP, "Up" }, { KC_F1, "F1" }, { KC_F2, "F2" }, { KC_F3, "F3" }, { KC_F4, "F4" }, { KC_F5, "F5" }, { KC_F6, "F6" }, { KC_F7, "F7" }, { KC_F8, "F8" }, { KC_F9, "F9" }, { KC_F10, "F10" }, { KC_F11, "F11" }, { KC_F12, "F12" }, { KC_F13, "F13" }, { KC_F14, "F14" }, { KC_F15, "F15" }, { KC_HELP, "Help" }, { KC_HOME, "Home" }, { KC_PGUP, "PageUp" }, { KC_END, "End" }, { KC_PGDOWN, "PageDown" }, { KC_INSERT, "Insert" }, { KC_PAUSE, "Pause" }, { KC_BREAK, "Break" }, { KC_BEGIN, "Begin" }, }; /** * Given a string, try and find it in "mappings". */ keycode_t keycode_find_code(const char *str, size_t len) { size_t i; for (i = 0; i < N_ELEMENTS(mappings); i++) { if (strncmp(str, mappings[i].desc, len) == 0) return mappings[i].code; } return 0; } /** * Given a keycode, return its textual mapping. */ const char *keycode_find_desc(keycode_t kc) { size_t i; for (i = 0; i < N_ELEMENTS(mappings); i++) { if (mappings[i].code == kc) return mappings[i].desc; } return NULL; } /* * Convert a hexidecimal-digit into a decimal */ static int dehex(char c) { if (isdigit((unsigned char)c)) return (D2I(c)); if (isalpha((unsigned char)c)) return (A2I(tolower((unsigned char)c)) + 10); return (0); } /** * Convert an encoding of a set of keypresses into actual keypresses. */ void keypress_from_text(struct keypress *buf, size_t len, const char *str) { size_t cur = 0; byte mods = 0; memset(buf, 0, len * sizeof *buf); #define STORE(buffer, pos, mod, cod) \ { \ int p = (pos); \ keycode_t c = (cod); \ byte m = (mod); \ \ if ((m & KC_MOD_CONTROL) && ENCODE_KTRL(c)) { \ m &= ~KC_MOD_CONTROL; \ c = KTRL(c); \ } \ \ buffer[p].mods = m; \ buffer[p].code = c; \ } /* Analyze the "ascii" string */ while (*str && cur < len) { buf[cur].type = EVT_KBRD; if (*str == '\\') { str++; if (*str == '\0') break; switch (*str) { /* Hex-mode */ case 'x': { if (isxdigit((unsigned char)(*(str + 1))) && isxdigit((unsigned char)(*(str + 2)))) { int v1 = dehex(*++str) * 16; int v2 = dehex(*++str); /* store a nice hex digit */ STORE(buf, cur++, mods, v1 + v2); } else { /* invalids get ignored */ STORE(buf, cur++, mods, '?'); } break; } case 'a': STORE(buf, cur++, mods, '\a'); break; case '\\': STORE(buf, cur++, mods, '\\'); break; case '^': STORE(buf, cur++, mods, '^'); break; case '[': STORE(buf, cur++, mods, '['); break; default: STORE(buf, cur++, mods, *str); break; } mods = 0; /* Skip the final char */ str++; } else if (*str == '[') { /* parse non-ascii keycodes */ char *end; keycode_t kc; if (*str++ == 0) return; end = strchr(str, (unsigned char) ']'); if (!end) return; kc = keycode_find_code(str, (size_t) (end - str)); if (!kc) return; STORE(buf, cur++, mods, kc); mods = 0; str = end + 1; } else if (*str == '{') { /* Specify modifier for next character */ str++; if (*str == '\0' || !strchr(str, (unsigned char) '}')) return; /* analyze modifier chars */ while (*str != '}') { switch (*str) { case '^': mods |= KC_MOD_CONTROL; break; case 'S': mods |= KC_MOD_SHIFT; break; case 'A': mods |= KC_MOD_ALT; break; case 'M': mods |= KC_MOD_META; break; case 'K': mods |= KC_MOD_KEYPAD; break; default: return; } str++; } /* skip ending bracket */ str++; } else if (*str == '^') { mods |= KC_MOD_CONTROL; str++; } else { /* everything else */ STORE(buf, cur++, mods, *str++); mods = 0; } } /* Terminate */ cur = MIN(cur, len); buf[cur].type = EVT_NONE; } /* * Convert a string of keypresses into their textual equivalent. */ void keypress_to_text(char *buf, size_t len, const struct keypress *src, bool expand_backslash) { size_t cur = 0; size_t end = 0; while (src[cur].type == EVT_KBRD) { keycode_t i = src[cur].code; int mods = src[cur].mods; const char *desc = keycode_find_desc(i); /* un-ktrl control characters if they don't have a description */ /* this is so that Tab (^I) doesn't get turned into ^I but gets * displayed as [Tab] */ if (i < 0x20 && !desc) { mods |= KC_MOD_CONTROL; i = UN_KTRL(i); } if (mods) { if (mods & KC_MOD_CONTROL && !(mods & ~KC_MOD_CONTROL)) { strnfcat(buf, len, &end, "^"); } else { strnfcat(buf, len, &end, "{"); if (mods & KC_MOD_CONTROL) strnfcat(buf, len, &end, "^"); if (mods & KC_MOD_SHIFT) strnfcat(buf, len, &end, "S"); if (mods & KC_MOD_ALT) strnfcat(buf, len, &end, "A"); if (mods & KC_MOD_META) strnfcat(buf, len, &end, "M"); if (mods & KC_MOD_KEYPAD) strnfcat(buf, len, &end, "K"); strnfcat(buf, len, &end, "}"); } } if (desc) { strnfcat(buf, len, &end, "[%s]", desc); } else { switch (i) { case '\a': strnfcat(buf, len, &end, "\a"); break; case '\\': { if (expand_backslash) strnfcat(buf, len, &end, "\\\\"); else strnfcat(buf, len, &end, "\\"); break; } case '^': strnfcat(buf, len, &end, "\\^"); break; case '[': strnfcat(buf, len, &end, "\\["); break; default: { if (i < 127) strnfcat(buf, len, &end, "%c", i); else strnfcat(buf, len, &end, "\\x%02x", (int)i); break; } } } cur++; } /* Terminate */ buf[end] = '\0'; } angband-v3.3.2/src/generate.h0000644000175000017500000000606111651552410015344 0ustar chriscchrisc/* generate.h - dungeon generation interface */ #ifndef GENERATE_H #define GENERATE_H void ensure_connectedness(struct cave *c); void place_object(struct cave *c, int y, int x, int level, bool good, bool great, byte origin); void place_gold(struct cave *c, int y, int x, int level, byte origin); void place_secret_door(struct cave *c, int y, int x); void place_closed_door(struct cave *c, int y, int x); void place_random_door(struct cave *c, int y, int x); extern struct vault *random_vault(int typ); struct tunnel_profile { const char *name; int rnd; /* % chance of choosing random direction */ int chg; /* % chance of changing direction */ int con; /* % chance of extra tunneling */ int pen; /* % chance of placing doors at room entrances */ int jct; /* % chance of doors at tunnel junctions */ }; struct streamer_profile { const char *name; int den; /* Density of streamers */ int rng; /* Width of streamers */ int mag; /* Number of magma streamers */ int mc; /* 1/chance of treasure per magma */ int qua; /* Number of quartz streamers */ int qc; /* 1/chance of treasure per quartz */ }; /* * cave_builder is a function pointer which builds a level. */ typedef bool (*cave_builder) (struct cave *c, struct player *p); struct cave_profile { const char *name; cave_builder builder; /* Function used to build the level */ int dun_rooms; /* Number of rooms to attempt */ int dun_unusual; /* Level/chance of unusual room */ int max_rarity; /* Max number of rarity levels used in room generation */ int n_room_profiles; /* Number of room profiles */ struct tunnel_profile tun; /* Used to build tunnels */ struct streamer_profile str; /* Used to build mineral streamers*/ const struct room_profile *room_profiles; /* Used to build rooms */ int cutoff; /* Used to see if we should try this dungeon */ }; /** * room_builder is a function pointer which builds rooms in the cave given * anchor coordinates. */ typedef bool (*room_builder) (struct cave *c, int y0, int x0); /** * This tracks information needed to generate the room, including the room's * name and the function used to build it. */ struct room_profile { const char *name; room_builder builder; /* Function used to build the room */ int height, width; /* Space required in blocks */ int level; /* Minimum dungeon level */ bool crowded; /* Whether this room is crowded or not */ int rarity; /* How unusual this room is */ int cutoff; /* Upper limit of 1-100 random roll for room generation */ }; typedef struct pit_profile { struct pit_profile *next; int pit_idx; /* Index in pit_info */ const char* name; int room_type; /* Is this a pit or a nest? */ int ave; /* Level where this pit is most common */ int rarity; /* How unusual this pit is */ int obj_rarity; /* How rare objects are in this pit */ bitflag flags[RF_SIZE]; /* Required flags */ bitflag spell_flags[RSF_SIZE]; /* Required spell flags */ bitflag forbidden_spell_flags[RSF_SIZE]; int n_bases; struct monster_base *base[MAX_RVALS]; } pit_profile; #endif /* !GENERATE_H */ angband-v3.3.2/src/tables.c0000644000175000017500000006436411651552410015031 0ustar chriscchrisc/* * File: tables.c * Purpose: Finely-tuned constants for the game Angband * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/tvalsval.h" /* * Global array for looping through the "keypad directions". */ const s16b ddd[9] = { 2, 8, 6, 4, 3, 1, 9, 7, 5 }; /* * Global arrays for converting "keypad direction" into "offsets". */ const s16b ddx[10] = { 0, -1, 0, 1, -1, 0, 1, -1, 0, 1 }; const s16b ddy[10] = { 0, 1, 1, 1, 0, 0, 0, -1, -1, -1 }; /* * Global arrays for optimizing "ddx[ddd[i]]" and "ddy[ddd[i]]". */ const s16b ddx_ddd[9] = { 0, 0, 1, -1, 1, -1, 1, -1, 0 }; const s16b ddy_ddd[9] = { 1, -1, 0, 0, 1, 1, -1, -1, 0 }; /* * This table allows quick conversion from "speed" to "energy" * The basic function WAS ((S>=110) ? (S-110) : (100 / (120-S))) * Note that table access is *much* quicker than computation. * * Note that the table has been changed at high speeds. From * "Slow (-40)" to "Fast (+30)" is pretty much unchanged, but * at speeds above "Fast (+30)", one approaches an asymptotic * effective limit of 50 energy per turn. This means that it * is relatively easy to reach "Fast (+30)" and get about 40 * energy per turn, but then speed becomes very "expensive", * and you must get all the way to "Fast (+50)" to reach the * point of getting 45 energy per turn. After that point, * furthur increases in speed are more or less pointless, * except to balance out heavy inventory. * * Note that currently the fastest monster is "Fast (+30)". * * It should be possible to lower the energy threshhold from * 100 units to 50 units, though this may interact badly with * the (compiled out) small random energy boost code. It may * also tend to cause more "clumping" at high speeds. */ const byte extract_energy[200] = { /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* S-50 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* S-40 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* S-30 */ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, /* S-20 */ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, /* S-10 */ 5, 5, 5, 5, 6, 6, 7, 7, 8, 9, /* Norm */ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* F+10 */ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, /* F+20 */ 30, 31, 32, 33, 34, 35, 36, 36, 37, 37, /* F+30 */ 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, /* F+40 */ 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, /* F+50 */ 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, /* F+60 */ 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, /* F+70 */ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, /* Fast */ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, }; /* * Base experience levels, may be adjusted up for race and/or class */ const s32b player_exp[PY_MAX_LEVEL] = { 10, 25, 45, 70, 100, 140, 200, 280, 380, 500, 650, 850, 1100, 1400, 1800, 2300, 2900, 3600, 4400, 5400, 6800, 8400, 10200, 12500, 17500, 25000, 35000L, 50000L, 75000L, 100000L, 150000L, 200000L, 275000L, 350000L, 450000L, 550000L, 700000L, 850000L, 1000000L, 1250000L, 1500000L, 1800000L, 2100000L, 2400000L, 2700000L, 3000000L, 3500000L, 4000000L, 4500000L, 5000000L }; /* * Player Sexes * * Title, * Winner */ const player_sex sex_info[MAX_SEXES] = { { "Female", "Queen" }, { "Male", "King" }, { "Neuter", "Regent" } }; /* * Each chest has a certain set of traps, determined by pval * Each chest has a "pval" from 1 to the chest level (max 55) * If the "pval" is negative then the trap has been disarmed * The "pval" of a chest determines the quality of its treasure * Note that disarming a trap on a chest also removes the lock. */ const byte chest_traps[64] = { 0, /* 0 == empty */ (CHEST_POISON), (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_LOSE_STR), (CHEST_LOSE_CON), /* 5 == best small wooden */ 0, (CHEST_POISON), (CHEST_POISON), (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_POISON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_SUMMON), /* 15 == best large wooden */ 0, (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_PARALYZE), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_SUMMON), (CHEST_PARALYZE), (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_EXPLODE), /* 25 == best small iron */ 0, (CHEST_POISON | CHEST_LOSE_STR), (CHEST_POISON | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_PARALYZE), (CHEST_POISON | CHEST_SUMMON), (CHEST_SUMMON), (CHEST_EXPLODE), (CHEST_EXPLODE | CHEST_SUMMON), /* 35 == best large iron */ 0, (CHEST_SUMMON), (CHEST_EXPLODE), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_POISON | CHEST_PARALYZE), (CHEST_EXPLODE), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_POISON | CHEST_PARALYZE), /* 45 == best small steel */ 0, (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_PARALYZE | CHEST_LOSE_STR), (CHEST_POISON | CHEST_PARALYZE | CHEST_LOSE_CON), (CHEST_POISON | CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_PARALYZE | CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_PARALYZE), (CHEST_POISON | CHEST_PARALYZE), /* 55 == best large steel */ (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), }; /* * Abbreviations of healthy stats */ const char *stat_names[A_MAX] = { "STR: ", "INT: ", "WIS: ", "DEX: ", "CON: ", "CHR: " }; /* * Abbreviations of damaged stats */ const char *stat_names_reduced[A_MAX] = { "Str: ", "Int: ", "Wis: ", "Dex: ", "Con: ", "Chr: " }; /* * Certain "screens" always use the main screen, including News, Birth, * Dungeon, Tomb-stone, High-scores, Macros, Colors, Visuals, Options. * * Later, special flags may allow sub-windows to "steal" stuff from the * main window, including File dump (help), File dump (artifacts, uniques), * Character screen, Small scale map, Previous Messages, Store screen, etc. */ const char *window_flag_desc[32] = { "Display inven/equip", "Display equip/inven", "Display player (basic)", "Display player (extra)", "Display player (compact)", "Display map view", "Display messages", "Display overhead view", "Display monster recall", "Display object recall", "Display monster list", "Display status", "Display item list", NULL, "Display borg messages", "Display borg status", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; const char *inscrip_text[] = { NULL, "strange", "average", "magical", "splendid", "excellent", "special", "unknown" }; /* * Character translations and definitions. -JG- * * Upper case and lower case equivalents of a given ISO Latin-1 character. * A character's general "type"; types may be combined. * * Note that this table assumes use of the standard Angband extended fonts. * * Notice the accented characters in positions 191+. If they don't appear * correct to you, then you are viewing this table in a non-Latin-1 font. * Individual ports are responsible for translations from the game's * internal Latin-1 to their system's character encoding(s) (unless ASCII). */ const byte char_tables[256][CHAR_TABLE_SLOTS] = { /* TO_UPPER, TO_LOWER, CHAR TYPE */ { 0, 0, 0L }, /* Empty */ { 1, 1, CHAR_SYMBOL }, /* Solid */ { 2, 2, CHAR_SYMBOL }, /* Mostly solid */ { 3, 3, CHAR_SYMBOL }, /* Wall pattern */ { 4, 4, CHAR_SYMBOL }, /* Many dots */ { 5, 5, CHAR_SYMBOL }, /* Medium dots */ { 6, 6, CHAR_SYMBOL }, /* Few dots */ { 7, 7, CHAR_SYMBOL }, /* Tiny dot */ { 8, 8, CHAR_SYMBOL }, /* Small dot */ { 9, 9, CHAR_SYMBOL }, /* Medium dot */ { 10, 10, CHAR_SYMBOL }, /* Large dot */ { 11, 11, CHAR_SYMBOL }, /* Rubble */ { 12, 12, CHAR_SYMBOL }, /* Treasure */ { 13, 13, CHAR_SYMBOL }, /* Closed door */ { 14, 14, CHAR_SYMBOL }, /* Open Door */ { 15, 15, CHAR_SYMBOL }, /* Broken door */ { 16, 16, CHAR_SYMBOL }, /* Pillar */ { 17, 17, CHAR_SYMBOL }, /* Water */ { 18, 18, CHAR_SYMBOL }, /* Tree */ { 19, 19, CHAR_SYMBOL }, /* Fire/lava */ { 20, 20, CHAR_SYMBOL }, /* Pit/portal */ { 22, 22, 0L }, /* Unused */ { 22, 22, 0L }, /* Unused */ { 23, 23, 0L }, /* Unused */ { 24, 24, 0L }, /* Unused */ { 25, 25, 0L }, /* Unused */ { 26, 26, 0L }, /* Unused */ { 27, 27, 0L }, /* Unused */ { 28, 28, 0L }, /* Unused */ { 29, 29, 0L }, /* Unused */ { 30, 30, 0L }, /* Unused */ { 31, 31, 0L }, /* Unused */ { 32, 32, CHAR_BLANK }, /* Space */ { 33, 33, CHAR_PUNCT }, /* ! */ { 34, 34, CHAR_PUNCT }, /* " */ { 35, 35, CHAR_PUNCT }, /* # */ { 36, 36, CHAR_PUNCT }, /* $ */ { 37, 37, CHAR_PUNCT }, /* % */ { 38, 38, CHAR_PUNCT }, /* & */ { 39, 39, CHAR_PUNCT }, /* ' */ { 40, 40, CHAR_PUNCT }, /* ( */ { 41, 41, CHAR_PUNCT }, /* ) */ { 42, 42, CHAR_PUNCT }, /* * */ { 43, 43, CHAR_PUNCT }, /* + */ { 44, 44, CHAR_PUNCT }, /* , */ { 45, 45, CHAR_PUNCT }, /* - */ { 46, 46, CHAR_PUNCT }, /* . */ { 47, 47, CHAR_PUNCT }, /* / */ { 48, 48, CHAR_DIGIT }, /* 0 */ { 49, 49, CHAR_DIGIT }, /* 1 */ { 50, 50, CHAR_DIGIT }, /* 2 */ { 51, 51, CHAR_DIGIT }, /* 3 */ { 52, 52, CHAR_DIGIT }, /* 4 */ { 53, 53, CHAR_DIGIT }, /* 5 */ { 54, 54, CHAR_DIGIT }, /* 6 */ { 55, 55, CHAR_DIGIT }, /* 7 */ { 56, 56, CHAR_DIGIT }, /* 8 */ { 57, 57, CHAR_DIGIT }, /* 9 */ { 58, 58, CHAR_DIGIT }, /* : */ { 59, 59, CHAR_DIGIT }, /* ; */ { 60, 60, CHAR_PUNCT }, /* < */ { 61, 61, CHAR_PUNCT }, /* = */ { 62, 62, CHAR_PUNCT }, /* > */ { 63, 63, CHAR_PUNCT }, /* ? */ { 64, 64, CHAR_PUNCT }, /* @ */ { 65, 97, CHAR_UPPER | CHAR_VOWEL }, /* A */ { 66, 98, CHAR_UPPER }, /* B */ { 67, 99, CHAR_UPPER }, /* C */ { 68, 100, CHAR_UPPER }, /* D */ { 69, 101, CHAR_UPPER | CHAR_VOWEL }, /* E */ { 70, 102, CHAR_UPPER }, /* F */ { 71, 103, CHAR_UPPER }, /* G */ { 72, 104, CHAR_UPPER }, /* H */ { 73, 105, CHAR_UPPER | CHAR_VOWEL }, /* I */ { 74, 106, CHAR_UPPER }, /* J */ { 75, 107, CHAR_UPPER }, /* K */ { 76, 108, CHAR_UPPER }, /* L */ { 77, 109, CHAR_UPPER }, /* M */ { 78, 110, CHAR_UPPER }, /* N */ { 79, 111, CHAR_UPPER | CHAR_VOWEL }, /* O */ { 80, 112, CHAR_UPPER }, /* P */ { 81, 113, CHAR_UPPER }, /* Q */ { 82, 114, CHAR_UPPER }, /* R */ { 83, 115, CHAR_UPPER }, /* S */ { 84, 116, CHAR_UPPER }, /* T */ { 85, 117, CHAR_UPPER | CHAR_VOWEL }, /* U */ { 86, 118, CHAR_UPPER }, /* V */ { 87, 119, CHAR_UPPER }, /* W */ { 88, 120, CHAR_UPPER }, /* X */ { 89, 121, CHAR_UPPER }, /* Y */ { 90, 122, CHAR_UPPER }, /* Z */ { 91, 91, CHAR_PUNCT }, /* [ */ { 92, 92, CHAR_PUNCT }, /* \ */ { 93, 93, CHAR_PUNCT }, /* ] */ { 94, 94, CHAR_PUNCT }, /* ^ */ { 95, 95, CHAR_PUNCT }, /* _ */ { 96, 96, CHAR_PUNCT }, /* ` */ { 65, 97, CHAR_LOWER | CHAR_VOWEL }, /* a */ { 66, 98, CHAR_LOWER }, /* b */ { 67, 99, CHAR_LOWER }, /* c */ { 68, 100, CHAR_LOWER }, /* d */ { 69, 101, CHAR_LOWER | CHAR_VOWEL }, /* e */ { 70, 102, CHAR_LOWER }, /* f */ { 71, 103, CHAR_LOWER }, /* g */ { 72, 104, CHAR_LOWER }, /* h */ { 73, 105, CHAR_LOWER | CHAR_VOWEL }, /* i */ { 74, 106, CHAR_LOWER }, /* j */ { 75, 107, CHAR_LOWER }, /* k */ { 76, 108, CHAR_LOWER }, /* l */ { 77, 109, CHAR_LOWER }, /* m */ { 78, 110, CHAR_LOWER }, /* n */ { 79, 111, CHAR_LOWER | CHAR_VOWEL }, /* o */ { 80, 112, CHAR_LOWER }, /* p */ { 81, 113, CHAR_LOWER }, /* q */ { 82, 114, CHAR_LOWER }, /* r */ { 83, 115, CHAR_LOWER }, /* s */ { 84, 116, CHAR_LOWER }, /* t */ { 85, 117, CHAR_LOWER | CHAR_VOWEL }, /* u */ { 86, 118, CHAR_LOWER }, /* v */ { 87, 119, CHAR_LOWER }, /* w */ { 88, 120, CHAR_LOWER }, /* x */ { 89, 121, CHAR_LOWER }, /* y */ { 90, 122, CHAR_LOWER }, /* z */ { 123, 123, CHAR_PUNCT }, /* { */ { 124, 124, CHAR_PUNCT }, /* | */ { 125, 125, CHAR_PUNCT }, /* } */ { 126, 126, CHAR_PUNCT }, /* ~ */ { 127, 127, CHAR_SYMBOL }, /* Wall pattern */ { 128, 128, 0L }, /* Unused */ { 129, 129, 0L }, /* Unused */ { 130, 130, 0L }, /* Unused */ { 131, 131, 0L }, /* Unused */ { 132, 132, 0L }, /* Unused */ { 133, 133, 0L }, /* Unused */ { 134, 134, 0L }, /* Unused */ { 135, 135, 0L }, /* Unused */ { 136, 136, 0L }, /* Unused */ { 137, 137, 0L }, /* Unused */ { 138, 138, 0L }, /* Unused */ { 139, 139, 0L }, /* Unused */ { 140, 140, 0L }, /* Unused */ { 141, 141, 0L }, /* Unused */ { 142, 142, 0L }, /* Unused */ { 143, 143, 0L }, /* Unused */ { 144, 144, 0L }, /* Unused */ { 145, 145, 0L }, /* Unused */ { 146, 146, 0L }, /* Unused */ { 147, 147, 0L }, /* Unused */ { 148, 148, 0L }, /* Unused */ { 149, 149, 0L }, /* Unused */ { 150, 150, 0L }, /* Unused */ { 151, 151, 0L }, /* Unused */ { 152, 152, 0L }, /* Unused */ { 153, 153, 0L }, /* Unused */ { 154, 154, 0L }, /* Unused */ { 155, 155, 0L }, /* Unused */ { 156, 156, 0L }, /* Unused */ { 157, 157, 0L }, /* Unused */ { 158, 158, 0L }, /* Unused */ { 159, 159, 0L }, /* Unused */ { 160, 160, 0L }, /* Unused */ { 161, 161, CHAR_PUNCT }, /* iexcl ¡ */ { 162, 162, CHAR_PUNCT }, /* euro ¢ */ { 163, 163, CHAR_PUNCT }, /* pound £ */ { 164, 164, CHAR_PUNCT }, /* curren ¤ */ { 165, 165, CHAR_PUNCT }, /* yen ¥ */ { 166, 166, CHAR_PUNCT }, /* brvbar ¦ */ { 167, 167, CHAR_PUNCT }, /* sect § */ { 168, 168, CHAR_SYMBOL }, /* Bolt - vert */ { 169, 169, CHAR_SYMBOL }, /* Bolt - horz */ { 170, 170, CHAR_SYMBOL }, /* Bolt -rdiag */ { 171, 171, CHAR_SYMBOL }, /* Bolt -ldiag */ { 172, 172, CHAR_SYMBOL }, /* Spell-cloud */ { 173, 173, CHAR_SYMBOL }, /* Spell-elec */ { 174, 174, CHAR_SYMBOL }, /* Spell-explo */ { 175, 175, 0L }, /* Unused */ { 176, 176, 0L }, /* Unused */ { 177, 177, 0L }, /* Unused */ { 178, 178, 0L }, /* Unused */ { 179, 179, 0L }, /* Unused */ { 180, 180, 0L }, /* Unused */ { 181, 181, 0L }, /* Unused */ { 182, 182, 0L }, /* Unused */ { 183, 183, 0L }, /* Unused */ { 184, 184, 0L }, /* Unused */ { 185, 185, 0L }, /* Unused */ { 186, 186, 0L }, /* Unused */ { 187, 187, 0L }, /* Unused */ { 188, 188, 0L }, /* Unused */ { 189, 189, 0L }, /* Unused */ { 190, 190, 0L }, /* Unused */ { 191, 191, CHAR_PUNCT }, /* iquest ¿ */ { 192, 224, CHAR_UPPER | CHAR_VOWEL }, /* Agrave À */ { 193, 225, CHAR_UPPER | CHAR_VOWEL }, /* Aacute à */ { 194, 226, CHAR_UPPER | CHAR_VOWEL }, /* Acirc  */ { 195, 227, CHAR_UPPER | CHAR_VOWEL }, /* Atilde à */ { 196, 228, CHAR_UPPER | CHAR_VOWEL }, /* Auml Ä */ { 197, 229, CHAR_UPPER | CHAR_VOWEL }, /* Aring Å */ { 198, 230, CHAR_UPPER | CHAR_VOWEL }, /* Aelig Æ */ { 199, 231, CHAR_UPPER }, /* Ccedil Ç */ { 200, 232, CHAR_UPPER | CHAR_VOWEL }, /* Egrave È */ { 201, 233, CHAR_UPPER | CHAR_VOWEL }, /* Eacute É */ { 202, 234, CHAR_UPPER | CHAR_VOWEL }, /* Ecirc Ê */ { 203, 235, CHAR_UPPER | CHAR_VOWEL }, /* Euml Ë */ { 204, 236, CHAR_UPPER | CHAR_VOWEL }, /* Igrave Ì */ { 205, 237, CHAR_UPPER | CHAR_VOWEL }, /* Iacute à */ { 206, 238, CHAR_UPPER | CHAR_VOWEL }, /* Icirc Î */ { 207, 239, CHAR_UPPER | CHAR_VOWEL }, /* Iuml à */ { 208, 240, CHAR_UPPER }, /* ETH à */ { 209, 241, CHAR_UPPER }, /* Ntilde Ñ */ { 210, 242, CHAR_UPPER | CHAR_VOWEL }, /* Ograve Ò */ { 211, 243, CHAR_UPPER | CHAR_VOWEL }, /* Oacute Ó */ { 212, 244, CHAR_UPPER | CHAR_VOWEL }, /* Ocirc Ô */ { 213, 245, CHAR_UPPER | CHAR_VOWEL }, /* Otilde Õ */ { 214, 246, CHAR_UPPER | CHAR_VOWEL }, /* Ouml Ö */ { 215, 215, 0L }, /* Unused */ { 216, 248, CHAR_UPPER | CHAR_VOWEL }, /* Oslash Ø */ { 217, 249, CHAR_UPPER | CHAR_VOWEL }, /* Ugrave Ù */ { 218, 250, CHAR_UPPER | CHAR_VOWEL }, /* Uacute Ú */ { 219, 251, CHAR_UPPER | CHAR_VOWEL }, /* Ucirc Û */ { 220, 252, CHAR_UPPER | CHAR_VOWEL }, /* Uuml Ü */ { 221, 253, CHAR_UPPER }, /* Yacute à */ { 222, 254, CHAR_UPPER }, /* THORN Þ */ { 223, 223, CHAR_LOWER }, /* szlig ß */ { 192, 224, CHAR_LOWER | CHAR_VOWEL }, /* agrave à */ { 193, 225, CHAR_LOWER | CHAR_VOWEL }, /* aacute á */ { 194, 226, CHAR_LOWER | CHAR_VOWEL }, /* acirc â */ { 195, 227, CHAR_LOWER | CHAR_VOWEL }, /* atilde ã */ { 196, 228, CHAR_LOWER | CHAR_VOWEL }, /* auml ä */ { 197, 229, CHAR_LOWER | CHAR_VOWEL }, /* aring å */ { 198, 230, CHAR_LOWER | CHAR_VOWEL }, /* aelig æ */ { 199, 231, CHAR_LOWER }, /* ccedil ç */ { 200, 232, CHAR_LOWER | CHAR_VOWEL }, /* egrave è */ { 201, 233, CHAR_LOWER | CHAR_VOWEL }, /* eacute é */ { 202, 234, CHAR_LOWER | CHAR_VOWEL }, /* ecirc ê */ { 203, 235, CHAR_LOWER | CHAR_VOWEL }, /* euml ë */ { 204, 236, CHAR_LOWER | CHAR_VOWEL }, /* igrave ì */ { 205, 237, CHAR_LOWER | CHAR_VOWEL }, /* iacute í */ { 206, 238, CHAR_LOWER | CHAR_VOWEL }, /* icirc î */ { 207, 239, CHAR_LOWER | CHAR_VOWEL }, /* iuml ï */ { 208, 240, CHAR_LOWER }, /* eth ð */ { 209, 241, CHAR_LOWER }, /* ntilde ñ */ { 210, 242, CHAR_LOWER | CHAR_VOWEL }, /* ograve ò */ { 211, 243, CHAR_LOWER | CHAR_VOWEL }, /* oacute ó */ { 212, 244, CHAR_LOWER | CHAR_VOWEL }, /* ocirc ô */ { 213, 245, CHAR_LOWER | CHAR_VOWEL }, /* otilde õ */ { 214, 246, CHAR_LOWER | CHAR_VOWEL }, /* ouml ö */ { 247, 247, 0L }, /* Unused */ { 216, 248, CHAR_LOWER | CHAR_VOWEL }, /* oslash ø */ { 217, 249, CHAR_LOWER | CHAR_VOWEL }, /* ugrave ù */ { 218, 250, CHAR_LOWER | CHAR_VOWEL }, /* uacute ú */ { 219, 251, CHAR_LOWER | CHAR_VOWEL }, /* ucirc û */ { 220, 252, CHAR_LOWER | CHAR_VOWEL }, /* uuml ü */ { 221, 253, CHAR_LOWER }, /* yacute ý */ { 222, 254, CHAR_LOWER }, /* thorn þ */ { 121, 255, CHAR_LOWER }, /* yuml ÿ */ }; angband-v3.3.2/src/cmd3.c0000644000175000017500000003457511651552410014406 0ustar chriscchrisc/* * File: cmd3.c * Purpose: Miscellaneous queries * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "button.h" #include "cave.h" #include "cmds.h" #include "monster/mon-lore.h" #include "monster/monster.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "object/object.h" #include "squelch.h" #include "ui-menu.h" #include "target.h" /* * Display inventory */ void do_cmd_inven(void) { ui_event e; int diff = weight_remaining(); /* Hack -- Start in "inventory" mode */ p_ptr->command_wrk = (USE_INVEN); /* Save screen */ screen_save(); /* Hack -- show empty slots */ item_tester_full = TRUE; /* Display the inventory */ show_inven(OLIST_WEIGHT | OLIST_QUIVER); /* Hack -- hide empty slots */ item_tester_full = FALSE; /* Prompt for a command */ prt(format("(Inventory) Burden %d.%d lb (%d.%d lb %s). Command: ", p_ptr->total_weight / 10, p_ptr->total_weight % 10, abs(diff) / 10, abs(diff) % 10, (diff < 0 ? "overweight" : "remaining")), 0, 0); /* Get a new command */ e = inkey_ex(); if (!(e.type == EVT_KBRD && e.key.code == ESCAPE)) Term_event_push(&e); /* Load screen */ screen_load(); } /* * Display equipment */ void do_cmd_equip(void) { ui_event e; /* Hack -- Start in "equipment" mode */ p_ptr->command_wrk = (USE_EQUIP); /* Save screen */ screen_save(); /* Hack -- show empty slots */ item_tester_full = TRUE; /* Display the equipment */ show_equip(OLIST_WEIGHT); /* Hack -- undo the hack above */ item_tester_full = FALSE; /* Prompt for a command */ prt("(Equipment) Command: ", 0, 0); /* Get a new command */ e = inkey_ex(); if (!(e.type == EVT_KBRD && e.key.code == ESCAPE)) Term_event_push(&e); /* Load screen */ screen_load(); } enum { IGNORE_THIS_ITEM, UNIGNORE_THIS_ITEM, IGNORE_THIS_FLAVOR, UNIGNORE_THIS_FLAVOR, IGNORE_THIS_QUALITY }; void textui_cmd_destroy(void) { int item; object_type *o_ptr; char out_val[160]; menu_type *m; region r; int selected; /* Get an item */ const char *q = "Ignore which item? "; const char *s = "You have nothing to ignore."; if (!get_item(&item, q, s, CMD_DESTROY, USE_INVEN | USE_EQUIP | USE_FLOOR)) return; o_ptr = object_from_item_idx(item); m = menu_dynamic_new(); m->selections = lower_case; /* Basic ignore option */ if (!o_ptr->ignore) { menu_dynamic_add(m, "This item only", IGNORE_THIS_ITEM); } else { menu_dynamic_add(m, "Unignore this item", UNIGNORE_THIS_ITEM); } /* Flavour-aware squelch */ if (squelch_tval(o_ptr->tval) && (!o_ptr->artifact || !object_flavor_is_aware(o_ptr))) { bool squelched = kind_is_squelched_aware(o_ptr->kind) || kind_is_squelched_unaware(o_ptr->kind); char tmp[70]; object_desc(tmp, sizeof(tmp), o_ptr, ODESC_BASE | ODESC_PLURAL); if (!squelched) { strnfmt(out_val, sizeof out_val, "All %s", tmp); menu_dynamic_add(m, out_val, IGNORE_THIS_FLAVOR); } else { strnfmt(out_val, sizeof out_val, "Unignore all %s", tmp); menu_dynamic_add(m, out_val, UNIGNORE_THIS_FLAVOR); } } /* Quality squelching */ if (object_was_sensed(o_ptr) || object_was_worn(o_ptr) || object_is_known_not_artifact(o_ptr)) { byte value = squelch_level_of(o_ptr); int type = squelch_type_of(o_ptr); if (object_is_jewelry(o_ptr) && squelch_level_of(o_ptr) != SQUELCH_BAD) value = SQUELCH_MAX; if (value != SQUELCH_MAX && type != TYPE_MAX) { strnfmt(out_val, sizeof out_val, "All %s %s", quality_values[value].name, quality_choices[type].name); menu_dynamic_add(m, out_val, IGNORE_THIS_QUALITY); } } /* work out display region */ r.width = menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */ r.col = 80 - r.width; r.row = 1; r.page_rows = m->count; screen_save(); menu_layout(m, &r); region_erase_bordered(&r); prt("(Enter to select, ESC) Ignore:", 0, 0); selected = menu_dynamic_select(m); screen_load(); if (selected == IGNORE_THIS_ITEM) { cmd_insert(CMD_DESTROY); cmd_set_arg_item(cmd_get_top(), 0, item); } else if (selected == UNIGNORE_THIS_ITEM) { o_ptr->ignore = FALSE; } else if (selected == IGNORE_THIS_FLAVOR) { object_squelch_flavor_of(o_ptr); } else if (selected == UNIGNORE_THIS_FLAVOR) { kind_squelch_clear(o_ptr->kind); } else if (selected == IGNORE_THIS_QUALITY) { byte value = squelch_level_of(o_ptr); int type = squelch_type_of(o_ptr); squelch_level[type] = value; } p_ptr->notice |= PN_SQUELCH; menu_dynamic_free(m); } void textui_cmd_toggle_ignore(void) { p_ptr->unignoring = !p_ptr->unignoring; p_ptr->notice |= PN_SQUELCH; do_cmd_redraw(); } /* Examine an object */ void textui_obj_examine(void) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; object_type *o_ptr; int item; /* Select item */ if (!get_item(&item, "Examine which item?", "You have nothing to examine.", CMD_NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR | IS_HARMLESS))) return; /* Track object for object recall */ track_object(item); /* Display info */ o_ptr = object_from_item_idx(item); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); } /* * Target command */ void do_cmd_target(void) { if (target_set_interactive(TARGET_KILL, -1, -1)) msg("Target Selected."); else msg("Target Aborted."); } void do_cmd_target_closest(void) { target_set_closest(TARGET_KILL); } /* * Look command */ void do_cmd_look(void) { /* Look around */ if (target_set_interactive(TARGET_LOOK, -1, -1)) { msg("Target Selected."); } } /* * Allow the player to examine other sectors on the map */ void do_cmd_locate(void) { int dir, y1, x1, y2, x2; char tmp_val[80]; char out_val[160]; /* Start at current panel */ y1 = Term->offset_y; x1 = Term->offset_x; /* Show panels until done */ while (1) { /* Get the current panel */ y2 = Term->offset_y; x2 = Term->offset_x; /* Describe the location */ if ((y2 == y1) && (x2 == x1)) { tmp_val[0] = '\0'; } else { strnfmt(tmp_val, sizeof(tmp_val), "%s%s of", ((y2 < y1) ? " north" : (y2 > y1) ? " south" : ""), ((x2 < x1) ? " west" : (x2 > x1) ? " east" : "")); } /* Prepare to ask which way to look */ strnfmt(out_val, sizeof(out_val), "Map sector [%d,%d], which is%s your sector. Direction?", (y2 / PANEL_HGT), (x2 / PANEL_WID), tmp_val); /* More detail */ if (OPT(center_player)) { strnfmt(out_val, sizeof(out_val), "Map sector [%d(%02d),%d(%02d)], which is%s your sector. Direction?", (y2 / PANEL_HGT), (y2 % PANEL_HGT), (x2 / PANEL_WID), (x2 % PANEL_WID), tmp_val); } /* Assume no direction */ dir = 0; /* Get a direction */ while (!dir) { struct keypress command; /* Get a command (or Cancel) */ if (!get_com(out_val, &command)) break; /* Extract direction */ dir = target_dir(command); /* Error */ if (!dir) bell("Illegal direction for locate!"); } /* No direction */ if (!dir) break; /* Apply the motion */ change_panel(dir); /* Handle stuff */ handle_stuff(p_ptr); } /* Verify panel */ verify_panel(); } static int cmp_mexp(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (r_info[ia].mexp < r_info[ib].mexp) return -1; if (r_info[ia].mexp > r_info[ib].mexp) return 1; return (a < b ? -1 : (a > b ? 1 : 0)); } static int cmp_level(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (r_info[ia].level < r_info[ib].level) return -1; if (r_info[ia].level > r_info[ib].level) return 1; return cmp_mexp(a, b); } static int cmp_tkill(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (l_list[ia].tkills < l_list[ib].tkills) return -1; if (l_list[ia].tkills > l_list[ib].tkills) return 1; return cmp_level(a, b); } static int cmp_pkill(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (l_list[ia].pkills < l_list[ib].pkills) return -1; if (l_list[ia].pkills > l_list[ib].pkills) return 1; return cmp_tkill(a, b); } int cmp_monsters(const void *a, const void *b) { return cmp_level(a, b); } /* * Search the monster, item, and feature types to find the * meaning for the given symbol. * * Note: We currently search items first, then features, then * monsters, and we return the first hit for a symbol. * This is to prevent mimics and lurkers from matching * a symbol instead of the item or feature it is mimicking. * * Todo: concatenate all matches into buf. This will be much * easier once we can loop through item tvals instead of items * (see note below.) * * Todo: Should this take the user's pref files into account? */ static void lookup_symbol(struct keypress sym, char *buf, size_t max) { int i; monster_base *race; /* Look through items */ /* Note: We currently look through all items, and grab the tval when we find a match. It would make more sense to loop through tvals, but then we need to associate a display character with each tval. */ for (i = 1; i < z_info->k_max; i++) { if (k_info[i].d_char == (char)sym.code) { strnfmt(buf, max, "%c - %s.", (char)sym.code, tval_find_name(k_info[i].tval)); return; } } /* Look through features */ /* Note: We need a better way of doing this. Currently '#' matches secret door, and '^' matches trap door (instead of the more generic "trap"). */ for (i = 1; i < z_info->f_max; i++) { if (f_info[i].d_char == (char)sym.code) { strnfmt(buf, max, "%c - %s.", (char)sym.code, f_info[i].name); return; } } /* Look through monster templates */ for (race = rb_info; race; race = race->next){ if ((char)sym.code == race->d_char) { strnfmt(buf, max, "%c - %s.", (char)sym.code, race->text); return; } } /* No matches */ strnfmt(buf, max, "%c - %s.", (char)sym.code, "Unknown Symbol"); return; } /* * Identify a character, allow recall of monsters * * Several "special" responses recall "multiple" monsters: * ^A (all monsters) * ^U (all unique monsters) * ^N (all non-unique monsters) * * The responses may be sorted in several ways, see below. * * Note that the player ghosts are ignored, since they do not exist. */ void do_cmd_query_symbol(void) { int i, n, r_idx; char buf[128]; struct keypress sym; struct keypress query; bool all = FALSE; bool uniq = FALSE; bool norm = FALSE; bool recall = FALSE; u16b *who; /* Get a character, or abort */ if (!get_com("Enter character to be identified, or control+[ANU]: ", &sym)) return; /* Describe */ if (sym.code == KTRL('A')) { all = TRUE; my_strcpy(buf, "Full monster list.", sizeof(buf)); } else if (sym.code == KTRL('U')) { all = uniq = TRUE; my_strcpy(buf, "Unique monster list.", sizeof(buf)); } else if (sym.code == KTRL('N')) { all = norm = TRUE; my_strcpy(buf, "Non-unique monster list.", sizeof(buf)); } else { lookup_symbol(sym, buf, sizeof(buf)); } /* Display the result */ prt(buf, 0, 0); /* Allocate the "who" array */ who = C_ZNEW(z_info->r_max, u16b); /* Collect matching monsters */ for (n = 0, i = 1; i < z_info->r_max - 1; i++) { monster_race *r_ptr = &r_info[i]; monster_lore *l_ptr = &l_list[i]; /* Nothing to recall */ if (!OPT(cheat_know) && !l_ptr->sights) continue; /* Require non-unique monsters if needed */ if (norm && rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Require unique monsters if needed */ if (uniq && !rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Collect "appropriate" monsters */ if (all || (r_ptr->d_char == (char)sym.code)) who[n++] = i; } /* Nothing to recall */ if (!n) { /* XXX XXX Free the "who" array */ FREE(who); return; } /* Buttons */ button_add("[y]", 'y'); button_add("[k]", 'k'); /* Don't collide with the repeat button */ button_add("[n]", 'q'); redraw_stuff(p_ptr); /* Prompt */ put_str("Recall details? (y/k/n): ", 0, 40); /* Query */ query = inkey(); /* Restore */ prt(buf, 0, 0); /* Buttons */ button_kill('y'); button_kill('k'); button_kill('q'); redraw_stuff(p_ptr); /* Interpret the response */ if (query.code == 'k') { /* Sort by kills (and level) */ sort(who, n, sizeof(*who), cmp_pkill); } else if (query.code == 'y' || query.code == 'p') { /* Sort by level; accept 'p' as legacy */ sort(who, n, sizeof(*who), cmp_level); } else { /* Any unsupported response is "nope, no history please" */ /* XXX XXX Free the "who" array */ FREE(who); return; } /* Start at the end */ i = n - 1; /* Button */ button_add("[r]", 'r'); button_add("[-]", '-'); button_add("[+]", '+'); redraw_stuff(p_ptr); /* Scan the monster memory */ while (1) { /* Extract a race */ r_idx = who[i]; /* Hack -- Auto-recall */ monster_race_track(r_idx); /* Hack -- Handle stuff */ handle_stuff(p_ptr); /* Hack -- Begin the prompt */ roff_top(r_idx); /* Hack -- Complete the prompt */ Term_addstr(-1, TERM_WHITE, " [(r)ecall, ESC]"); /* Interact */ while (1) { /* Recall */ if (recall) { /* Save screen */ screen_save(); /* Recall on screen */ screen_roff(who[i]); /* Hack -- Complete the prompt (again) */ Term_addstr(-1, TERM_WHITE, " [(r)ecall, ESC]"); } /* Command */ query = inkey(); /* Unrecall */ if (recall) { /* Load screen */ screen_load(); } /* Normal commands */ if (query.code != 'r') break; /* Toggle recall */ recall = !recall; } /* Stop scanning */ if (query.code == ESCAPE) break; /* Move to "prev" monster */ if (query.code == '-') { if (++i == n) i = 0; } /* Move to "next" monster */ else { if (i-- == 0) i = n - 1; } } /* Button */ button_kill('r'); button_kill('-'); button_kill('+'); redraw_stuff(p_ptr); /* Re-display the identity */ prt(buf, 0, 0); /* Free the "who" array */ FREE(who); } /* Centers the map on the player */ void do_cmd_center_map(void) { center_panel(); } angband-v3.3.2/src/z-quark.c0000644000175000017500000000266311651552410015143 0ustar chriscchrisc/* * File: z-quark.c * Purpose: Save memory by storing strings in a global array, ensuring * that each is only allocated once. * * Copyright (c) 1997 Ben Harrison * Copyright (c) 2007 "Elly" * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "z-virt.h" #include "z-quark.h" static char **quarks; static size_t nr_quarks = 1; static size_t alloc_quarks = 0; #define QUARKS_INIT 16 quark_t quark_add(const char *str) { quark_t q; for (q = 1; q < nr_quarks; q++) { if (!strcmp(quarks[q], str)) return q; } if (nr_quarks == alloc_quarks) { alloc_quarks *= 2; quarks = mem_realloc(quarks, alloc_quarks * sizeof(char *)); } q = nr_quarks++; quarks[q] = string_make(str); return q; } const char *quark_str(quark_t q) { return (q >= nr_quarks ? NULL : quarks[q]); } errr quarks_init(void) { alloc_quarks = QUARKS_INIT; quarks = C_ZNEW(alloc_quarks, char *); return 0; } errr quarks_free(void) { size_t i; for (i = 0; i < nr_quarks; i++) string_free(quarks[i]); FREE(quarks); return 0; } angband-v3.3.2/src/save.c0000644000175000017500000003641311651552410014507 0ustar chriscchrisc/* * File: save.c * Purpose: Old-style savefile saving * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "history.h" #include "monster/mon-make.h" #include "monster/monster.h" #include "option.h" #include "savefile.h" #include "squelch.h" /* * Write an "item" record */ static void wr_item(const object_type *o_ptr) { size_t i, j; wr_u16b(0xffff); wr_byte(ITEM_VERSION); wr_s16b(0); /* Location */ wr_byte(o_ptr->iy); wr_byte(o_ptr->ix); wr_byte(o_ptr->tval); wr_byte(o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { wr_s16b(o_ptr->pval[i]); } wr_byte(o_ptr->num_pvals); wr_byte(0); wr_byte(o_ptr->number); wr_s16b(o_ptr->weight); if (o_ptr->artifact) wr_byte(o_ptr->artifact->aidx); else wr_byte(0); if (o_ptr->ego) wr_byte(o_ptr->ego->eidx); else wr_byte(0); wr_s16b(o_ptr->timeout); wr_s16b(o_ptr->to_h); wr_s16b(o_ptr->to_d); wr_s16b(o_ptr->to_a); wr_s16b(o_ptr->ac); wr_byte(o_ptr->dd); wr_byte(o_ptr->ds); wr_u16b(o_ptr->ident); wr_byte(o_ptr->marked); wr_byte(o_ptr->origin); wr_byte(o_ptr->origin_depth); wr_u16b(o_ptr->origin_xtra); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) wr_byte(o_ptr->flags[i]); if (i < OF_BYTES) pad_bytes(OF_BYTES - i); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) wr_byte(o_ptr->known_flags[i]); if (i < OF_BYTES) pad_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) wr_byte(o_ptr->pval_flags[j][i]); if (i < OF_BYTES) pad_bytes(OF_BYTES - i); } /* Held by monster index */ wr_s16b(o_ptr->held_m_idx); wr_s16b(o_ptr->mimicking_m_idx); /* Save the inscription (if any) */ if (o_ptr->note) { wr_string(quark_str(o_ptr->note)); } else { wr_string(""); } } /* * Write RNG state * * There were originally 64 bytes of randomizer saved. Now we only need * 32 + 5 bytes saved, so we'll write an extra 27 bytes at the end which won't * be used. */ void wr_randomizer(void) { int i; /* current value for the simple RNG */ wr_u32b(Rand_value); /* state index */ wr_u32b(state_i); /* RNG variables */ wr_u32b(z0); wr_u32b(z1); wr_u32b(z2); /* RNG state */ for (i = 0; i < RAND_DEG; i++) wr_u32b(STATE[i]); /* NULL padding */ for (i = 0; i < 59 - RAND_DEG; i++) wr_u32b(0); } /* * Write the "options" */ void wr_options(void) { int i, k; u32b window_flag[ANGBAND_TERM_MAX]; u32b window_mask[ANGBAND_TERM_MAX]; /* Special Options */ wr_byte(op_ptr->delay_factor); wr_byte(op_ptr->hitpoint_warn); wr_u16b(lazymove_delay); /* Normal options */ for (i = 0; i < OPT_MAX; i++) { const char *name = option_name(i); if (!name) continue; wr_string(name); wr_byte(op_ptr->opt[i]); } /* Sentinel */ wr_byte(0); /*** Window options ***/ /* Reset */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { /* Flags */ window_flag[i] = op_ptr->window_flag[i]; /* Mask */ window_mask[i] = 0L; /* Build the mask */ for (k = 0; k < 32; k++) { /* Set mask */ if (window_flag_desc[k]) { window_mask[i] |= (1L << k); } } } /* Dump the flags */ for (i = 0; i < ANGBAND_TERM_MAX; i++) wr_u32b(window_flag[i]); /* Dump the masks */ for (i = 0; i < ANGBAND_TERM_MAX; i++) wr_u32b(window_mask[i]); } void wr_messages(void) { s16b i; u16b num; num = messages_num(); if (num > 80) num = 80; wr_u16b(num); /* Dump the messages (oldest first!) */ for (i = num - 1; i >= 0; i--) { wr_string(message_str(i)); wr_u16b(message_type(i)); } } void wr_monster_memory(void) { size_t i; int r_idx; wr_u16b(z_info->r_max); for (r_idx = 0; r_idx < z_info->r_max; r_idx++) { monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Count sights/deaths/kills */ wr_s16b(l_ptr->sights); wr_s16b(l_ptr->deaths); wr_s16b(l_ptr->pkills); wr_s16b(l_ptr->tkills); /* Count wakes and ignores */ wr_byte(l_ptr->wake); wr_byte(l_ptr->ignore); /* Count drops */ wr_byte(l_ptr->drop_gold); wr_byte(l_ptr->drop_item); /* Count spells */ wr_byte(l_ptr->cast_innate); wr_byte(l_ptr->cast_spell); /* Count blows of each type */ for (i = 0; i < MONSTER_BLOW_MAX; i++) wr_byte(l_ptr->blows[i]); /* Memorize flags */ for (i = 0; i < RF_BYTES && i < RF_SIZE; i++) wr_byte(l_ptr->flags[i]); if (i < RF_BYTES) pad_bytes(RF_BYTES - i); for (i = 0; i < RF_BYTES && i < RSF_SIZE; i++) wr_byte(l_ptr->spell_flags[i]); if (i < RF_BYTES) pad_bytes(RF_BYTES - i); /* Monster limit per level */ wr_byte(r_ptr->max_num); /* XXX */ wr_byte(0); wr_byte(0); wr_byte(0); } } void wr_object_memory(void) { int k_idx; wr_u16b(z_info->k_max); for (k_idx = 0; k_idx < z_info->k_max; k_idx++) { byte tmp8u = 0; object_kind *k_ptr = &k_info[k_idx]; if (k_ptr->aware) tmp8u |= 0x01; if (k_ptr->tried) tmp8u |= 0x02; if (kind_is_squelched_aware(k_ptr)) tmp8u |= 0x04; if (k_ptr->everseen) tmp8u |= 0x08; if (kind_is_squelched_unaware(k_ptr)) tmp8u |= 0x10; wr_byte(tmp8u); } } void wr_quests(void) { int i; u16b tmp16u; /* Hack -- Dump the quests */ tmp16u = MAX_Q_IDX; wr_u16b(tmp16u); for (i = 0; i < tmp16u; i++) { wr_byte(q_list[i].level); wr_byte(0); wr_byte(0); wr_byte(0); } } void wr_artifacts(void) { int i; u16b tmp16u; /* Hack -- Dump the artifacts */ tmp16u = z_info->a_max; wr_u16b(tmp16u); for (i = 0; i < tmp16u; i++) { artifact_type *a_ptr = &a_info[i]; wr_byte(a_ptr->created); wr_byte(a_ptr->seen); wr_byte(a_ptr->everseen); wr_byte(0); } } void wr_player(void) { int i; wr_string(op_ptr->full_name); wr_string(p_ptr->died_from); wr_string(p_ptr->history); /* Race/Class/Gender/Spells */ wr_byte(p_ptr->race->ridx); wr_byte(p_ptr->class->cidx); wr_byte(p_ptr->psex); wr_byte(op_ptr->name_suffix); wr_byte(p_ptr->hitdie); wr_byte(p_ptr->expfact); wr_s16b(p_ptr->age); wr_s16b(p_ptr->ht); wr_s16b(p_ptr->wt); /* Dump the stats (maximum and current and birth) */ for (i = 0; i < A_MAX; ++i) wr_s16b(p_ptr->stat_max[i]); for (i = 0; i < A_MAX; ++i) wr_s16b(p_ptr->stat_cur[i]); for (i = 0; i < A_MAX; ++i) wr_s16b(p_ptr->stat_birth[i]); wr_s16b(p_ptr->ht_birth); wr_s16b(p_ptr->wt_birth); wr_s16b(p_ptr->sc_birth); wr_u32b(p_ptr->au_birth); /* Padding */ wr_u32b(0); wr_u32b(p_ptr->au); wr_u32b(p_ptr->max_exp); wr_u32b(p_ptr->exp); wr_u16b(p_ptr->exp_frac); wr_s16b(p_ptr->lev); wr_s16b(p_ptr->mhp); wr_s16b(p_ptr->chp); wr_u16b(p_ptr->chp_frac); wr_s16b(p_ptr->msp); wr_s16b(p_ptr->csp); wr_u16b(p_ptr->csp_frac); /* Max Player and Dungeon Levels */ wr_s16b(p_ptr->max_lev); wr_s16b(p_ptr->max_depth); /* More info */ wr_s16b(0); /* oops */ wr_s16b(0); /* oops */ wr_s16b(0); /* oops */ wr_s16b(0); /* oops */ wr_s16b(p_ptr->sc); wr_s16b(0); /* oops */ wr_s16b(p_ptr->food); wr_s16b(p_ptr->energy); wr_s16b(p_ptr->word_recall); wr_s16b(p_ptr->state.see_infra); wr_byte(p_ptr->confusing); wr_byte(p_ptr->searching); /* Find the number of timed effects */ wr_byte(TMD_MAX); /* Read all the effects, in a loop */ for (i = 0; i < TMD_MAX; i++) wr_s16b(p_ptr->timed[i]); /* Total energy used so far */ wr_u32b(p_ptr->total_energy); /* # of turns spent resting */ wr_u32b(p_ptr->resting_turn); /* Future use */ for (i = 0; i < 8; i++) wr_u32b(0L); } void wr_squelch(void) { size_t i, n; /* Write number of squelch bytes */ wr_byte(squelch_size); for (i = 0; i < squelch_size; i++) wr_byte(squelch_level[i]); /* Write ego-item squelch bits */ wr_u16b(z_info->e_max); for (i = 0; i < z_info->e_max; i++) { byte flags = 0; /* Figure out and write the everseen flag */ if (e_info[i].everseen) flags |= 0x02; wr_byte(flags); } n = 0; for (i = 0; i < z_info->k_max; i++) if (k_info[i].note) n++; /* Write the current number of auto-inscriptions */ wr_u16b(n); /* Write the autoinscriptions array */ for (i = 0; i < z_info->k_max; i++) { if (!k_info[i].note) continue; wr_s16b(i); wr_string(quark_str(k_info[i].note)); } return; } void wr_misc(void) { /* XXX Old random artifact version, remove after 3.3 */ wr_u32b(63); /* Random artifact seed */ wr_u32b(seed_randart); /* XXX Ignore some flags */ wr_u32b(0L); wr_u32b(0L); wr_u32b(0L); /* Write the "object seeds" */ wr_u32b(seed_flavor); wr_u32b(seed_town); /* Special stuff */ wr_u16b(p_ptr->panic_save); wr_u16b(p_ptr->total_winner); wr_u16b(p_ptr->noscore); /* Write death */ wr_byte(p_ptr->is_dead); /* Write feeling */ wr_byte(cave->feeling); wr_u16b(cave->feeling_squares); wr_s32b(cave->created_at); /* Current turn */ wr_s32b(turn); } void wr_player_hp(void) { int i; wr_u16b(PY_MAX_LEVEL); for (i = 0; i < PY_MAX_LEVEL; i++) wr_s16b(p_ptr->player_hp[i]); } void wr_player_spells(void) { int i; wr_u16b(PY_MAX_SPELLS); for (i = 0; i < PY_MAX_SPELLS; i++) wr_byte(p_ptr->spell_flags[i]); for (i = 0; i < PY_MAX_SPELLS; i++) wr_byte(p_ptr->spell_order[i]); } /* * Dump the random artifacts */ void wr_randarts(void) { size_t i, j, k; if (!OPT(birth_randarts)) return; wr_u16b(z_info->a_max); for (i = 0; i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; wr_byte(a_ptr->tval); wr_byte(a_ptr->sval); for (j = 0; j < MAX_PVALS; j++) wr_s16b(a_ptr->pval[j]); wr_byte(a_ptr->num_pvals); wr_s16b(a_ptr->to_h); wr_s16b(a_ptr->to_d); wr_s16b(a_ptr->to_a); wr_s16b(a_ptr->ac); wr_byte(a_ptr->dd); wr_byte(a_ptr->ds); wr_s16b(a_ptr->weight); wr_s32b(a_ptr->cost); for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) wr_byte(a_ptr->flags[j]); if (j < OF_BYTES) pad_bytes(OF_BYTES - j); for (k = 0; k < MAX_PVALS; k++) { for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) wr_byte(a_ptr->pval_flags[k][j]); if (j < OF_BYTES) pad_bytes(OF_BYTES - j); } wr_byte(a_ptr->level); wr_byte(a_ptr->rarity); wr_byte(a_ptr->alloc_prob); wr_byte(a_ptr->alloc_min); wr_byte(a_ptr->alloc_max); wr_u16b(a_ptr->effect); wr_u16b(a_ptr->time.base); wr_u16b(a_ptr->time.dice); wr_u16b(a_ptr->time.sides); } } void wr_inventory(void) { int i; /* Write the inventory */ for (i = 0; i < ALL_INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Dump index */ wr_u16b((u16b)i); /* Dump object */ wr_item(o_ptr); } /* Add a sentinel */ wr_u16b(0xFFFF); } void wr_stores(void) { int i; wr_u16b(MAX_STORES); for (i = 0; i < MAX_STORES; i++) { const struct store *st_ptr = &stores[i]; int j; /* XXX Old values */ wr_u32b(0L); wr_s16b(0); /* Save the current owner */ wr_byte(st_ptr->owner->oidx); /* Save the stock size */ wr_byte(st_ptr->stock_num); /* XXX Old values */ wr_s16b(0); wr_s16b(0); /* Save the stock */ for (j = 0; j < st_ptr->stock_num; j++) wr_item(&st_ptr->stock[j]); } } /* * The cave grid flags that get saved in the savefile */ #define IMPORTANT_FLAGS (CAVE_MARK | CAVE_GLOW | CAVE_ICKY | CAVE_ROOM) /* * Write the current dungeon */ void wr_dungeon(void) { int y, x; byte tmp8u; byte count; byte prev_char; if (p_ptr->is_dead) return; /*** Basic info ***/ /* Dungeon specific info follows */ wr_u16b(p_ptr->depth); wr_u16b(daycount); wr_u16b(p_ptr->py); wr_u16b(p_ptr->px); wr_u16b(cave->height); wr_u16b(cave->width); wr_u16b(0); wr_u16b(0); /*** Simple "Run-Length-Encoding" of cave ***/ /* Note that this will induce two wasted bytes */ count = 0; prev_char = 0; /* Dump the cave */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { /* Extract the important cave->info flags */ tmp8u = (cave->info[y][x] & (IMPORTANT_FLAGS)); /* If the run is broken, or too full, flush it */ if ((tmp8u != prev_char) || (count == MAX_UCHAR)) { wr_byte((byte)count); wr_byte((byte)prev_char); prev_char = tmp8u; count = 1; } /* Continue the run */ else { count++; } } } /* Flush the data (if any) */ if (count) { wr_byte((byte)count); wr_byte((byte)prev_char); } /** Now dump the cave->info2[][] stuff **/ /* Note that this will induce two wasted bytes */ count = 0; prev_char = 0; /* Dump the cave */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { /* Keep all the information from info2 */ tmp8u = cave->info2[y][x]; /* If the run is broken, or too full, flush it */ if ((tmp8u != prev_char) || (count == MAX_UCHAR)) { wr_byte((byte)count); wr_byte((byte)prev_char); prev_char = tmp8u; count = 1; } /* Continue the run */ else { count++; } } } /* Flush the data (if any) */ if (count) { wr_byte((byte)count); wr_byte((byte)prev_char); } /*** Simple "Run-Length-Encoding" of cave ***/ /* Note that this will induce two wasted bytes */ count = 0; prev_char = 0; /* Dump the cave */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { /* Extract a byte */ tmp8u = cave->feat[y][x]; /* If the run is broken, or too full, flush it */ if ((tmp8u != prev_char) || (count == MAX_UCHAR)) { wr_byte((byte)count); wr_byte((byte)prev_char); prev_char = tmp8u; count = 1; } /* Continue the run */ else { count++; } } } /* Flush the data (if any) */ if (count) { wr_byte((byte)count); wr_byte((byte)prev_char); } /*** Compact ***/ /* Compact the objects */ compact_objects(0); /* Compact the monsters */ compact_monsters(0); } void wr_objects(void) { int i; if (p_ptr->is_dead) return; /* Total objects */ wr_u16b(o_max); /* Dump the objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Dump it */ wr_item(o_ptr); } } void wr_monsters(void) { int i; size_t j; if (p_ptr->is_dead) return; /* Total monsters */ wr_u16b(cave_monster_max(cave)); /* Dump the monsters */ for (i = 1; i < cave_monster_max(cave); i++) { byte unaware = 0; const monster_type *m_ptr = cave_monster(cave, i); wr_s16b(m_ptr->r_idx); wr_byte(m_ptr->fy); wr_byte(m_ptr->fx); wr_s16b(m_ptr->hp); wr_s16b(m_ptr->maxhp); wr_byte(m_ptr->mspeed); wr_byte(m_ptr->energy); wr_byte(MON_TMD_MAX); for (j = 0; j < MON_TMD_MAX; j++) wr_s16b(m_ptr->m_timed[j]); if (m_ptr->unaware) unaware |= 0x01; wr_byte(unaware); for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) wr_byte(m_ptr->known_pflags[j]); if (j < OF_BYTES) pad_bytes(OF_BYTES - j); wr_byte(0); } } void wr_ghost(void) { int i; if (p_ptr->is_dead) return; /* XXX */ /* Name */ wr_string("Broken Ghost"); /* Hack -- stupid data */ for (i = 0; i < 60; i++) wr_byte(0); } void wr_history(void) { size_t i; u32b tmp32u = history_get_num(); wr_u32b(tmp32u); for (i = 0; i < tmp32u; i++) { wr_u16b(history_list[i].type); wr_s32b(history_list[i].turn); wr_s16b(history_list[i].dlev); wr_s16b(history_list[i].clev); wr_byte(history_list[i].a_idx); wr_string(history_list[i].event); } } angband-v3.3.2/src/cmd-obj.c0000644000175000017500000005652111651552410015066 0ustar chriscchrisc/* * File: cmd-obj.c * Purpose: Handle objects in various ways * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2007-9 Andrew Sidwell, Chris Carr, Ed Graham, Erik Osheim * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "effects.h" #include "game-cmd.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "spells.h" #include "target.h" /*** Utility bits and bobs ***/ /* * Check to see if the player can use a rod/wand/staff/activatable object. */ static int check_devices(object_type *o_ptr) { int fail; const char *action; const char *what = NULL; /* Get the right string */ switch (o_ptr->tval) { case TV_ROD: action = "zap the rod"; break; case TV_WAND: action = "use the wand"; what = "wand"; break; case TV_STAFF: action = "use the staff"; what = "staff"; break; default: action = "activate it"; break; } /* Figure out how hard the item is to use */ fail = get_use_device_chance(o_ptr); /* Roll for usage */ if (randint1(1000) < fail) { flush(); msg("You failed to %s properly.", action); return FALSE; } /* Notice empty staffs */ if (what && o_ptr->pval[DEFAULT_PVAL] <= 0) { flush(); msg("The %s has no charges left.", what); o_ptr->ident |= (IDENT_EMPTY); return FALSE; } return TRUE; } /* * Return the chance of an effect beaming, given a tval. */ static int beam_chance(int tval) { switch (tval) { case TV_WAND: return 20; case TV_ROD: return 10; } return 0; } typedef enum { ART_TAG_NONE, ART_TAG_NAME, ART_TAG_KIND, ART_TAG_VERB, ART_TAG_VERB_IS } art_tag_t; static art_tag_t art_tag_lookup(const char *tag) { if (strncmp(tag, "name", 4) == 0) return ART_TAG_NAME; else if (strncmp(tag, "kind", 4) == 0) return ART_TAG_KIND; else if (strncmp(tag, "s", 1) == 0) return ART_TAG_VERB; else if (strncmp(tag, "is", 2) == 0) return ART_TAG_VERB_IS; else return ART_TAG_NONE; } /* * Print an artifact activation message. * * In order to support randarts, with scrambled names, we re-write * the message to replace instances of {name} with the artifact name * and instances of {kind} with the type of object. * * This code deals with plural and singular forms of verbs correctly * when encountering {s}, though in fact both names and kinds are * always singular in the current code (gloves are "Set of" and boots * are "Pair of") */ static void activation_message(object_type *o_ptr, const char *message) { char buf[1024] = "\0"; const char *next; const char *s; const char *tag; const char *in_cursor; size_t end = 0; in_cursor = message; next = strchr(in_cursor, '{'); while (next) { /* Copy the text leading up to this { */ strnfcat(buf, 1024, &end, "%.*s", next - in_cursor, in_cursor); s = next + 1; while (*s && isalpha((unsigned char) *s)) s++; if (*s == '}') /* Valid tag */ { tag = next + 1; /* Start the tag after the { */ in_cursor = s + 1; switch(art_tag_lookup(tag)) { case ART_TAG_NAME: end += object_desc(buf, 1024, o_ptr, ODESC_PREFIX | ODESC_BASE); break; case ART_TAG_KIND: object_kind_name(&buf[end], 1024-end, o_ptr->kind, TRUE); end += strlen(&buf[end]); break; case ART_TAG_VERB: strnfcat(buf, 1024, &end, "s"); break; case ART_TAG_VERB_IS: if((end > 2) && (buf[end-2] == 's')) strnfcat(buf, 1024, &end, "are"); else strnfcat(buf, 1024, &end, "is"); default: break; } } else /* An invalid tag, skip it */ { in_cursor = next + 1; } next = strchr(in_cursor, '{'); } strnfcat(buf, 1024, &end, in_cursor); msg("%s", buf); } /*** Inscriptions ***/ /* Remove inscription */ void do_cmd_uninscribe(cmd_code code, cmd_arg args[]) { object_type *o_ptr = object_from_item_idx(args[0].item); if (obj_has_inscrip(o_ptr)) msg("Inscription removed."); o_ptr->note = 0; p_ptr->notice |= (PN_COMBINE | PN_SQUELCH | PN_SORT_QUIVER); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Add inscription */ void do_cmd_inscribe(cmd_code code, cmd_arg args[]) { object_type *o_ptr = object_from_item_idx(args[0].item); o_ptr->note = quark_add(args[1].string); p_ptr->notice |= (PN_COMBINE | PN_SQUELCH | PN_SORT_QUIVER); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /*** Taking off/putting on ***/ /* Take off an item */ void do_cmd_takeoff(cmd_code code, cmd_arg args[]) { int item = args[0].item; if (!item_is_available(item, NULL, USE_EQUIP)) { msg("You are not wielding that item."); return; } if (!obj_can_takeoff(object_from_item_idx(item))) { msg("You cannot take off that item."); return; } (void)inven_takeoff(item, 255); pack_overflow(); p_ptr->energy_use = 50; } /* * Wield or wear a single item from the pack or floor */ void wield_item(object_type *o_ptr, int item, int slot) { object_type object_type_body; object_type *i_ptr = &object_type_body; const char *fmt; char o_name[80]; bool combined_ammo = FALSE; bool track_wielded_item = FALSE; int num = 1; /* If we are stacking ammo in the quiver */ if (obj_is_ammo(o_ptr)) { num = o_ptr->number; combined_ammo = object_similar(o_ptr, &p_ptr->inventory[slot], OSTACK_QUIVER); } /* Take a turn */ p_ptr->energy_use = 100; /* Obtain local object */ object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = num; /* Update object_idx if necessary, once object is in slot */ if (tracked_object_is(item)) { track_wielded_item = TRUE; } /* Decrease the item (from the pack) */ if (item >= 0) { inven_item_increase(item, -num); inven_item_optimize(item); } /* Decrease the item (from the floor) */ else { floor_item_increase(0 - item, -num); floor_item_optimize(0 - item); } /* Get the wield slot */ o_ptr = &p_ptr->inventory[slot]; if (combined_ammo) { /* Add the new ammo to the already-quiver-ed ammo */ object_absorb(o_ptr, i_ptr); } else { /* Take off existing item */ if (o_ptr->kind) (void)inven_takeoff(slot, 255); /* If we are wielding ammo we may need to "open" the slot by shifting * later ammo up the quiver; this is because we already called the * inven_item_optimize() function. */ if (slot >= QUIVER_START) open_quiver_slot(slot); /* Wear the new stuff */ object_copy(o_ptr, i_ptr); /* Increment the equip counter by hand */ p_ptr->equip_cnt++; } /* Increase the weight */ p_ptr->total_weight += i_ptr->weight * num; /* Track object if necessary */ if (track_wielded_item) { track_object(slot); } /* Do any ID-on-wield */ object_notice_on_wield(o_ptr); /* Where is the item now */ if (slot == INVEN_WIELD) fmt = "You are wielding %s (%c)."; else if (slot == INVEN_BOW) fmt = "You are shooting with %s (%c)."; else if (slot == INVEN_LIGHT) fmt = "Your light source is %s (%c)."; else if (combined_ammo) fmt = "You combine %s in your quiver (%c)."; else if (slot >= QUIVER_START && slot < QUIVER_END) fmt = "You add %s to your quiver (%c)."; else fmt = "You are wearing %s (%c)."; /* Describe the result */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msgt(MSG_WIELD, fmt, o_name, index_to_label(slot)); /* Cursed! */ if (cursed_p(o_ptr->flags)) { /* Warn the player */ msgt(MSG_CURSED, "Oops! It feels deathly cold!"); /* Sense the object */ object_notice_curses(o_ptr); } /* Save quiver size */ save_quiver_size(p_ptr); /* See if we have to overflow the pack */ pack_overflow(); /* Recalculate bonuses, torch, mana */ p_ptr->notice |= PN_SORT_QUIVER; p_ptr->update |= (PU_BONUS | PU_TORCH | PU_MANA); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Wield or wear an item */ void do_cmd_wield(cmd_code code, cmd_arg args[]) { object_type *equip_o_ptr; char o_name[80]; unsigned n; int item = args[0].item; int slot = args[1].number; object_type *o_ptr = object_from_item_idx(item); if (!item_is_available(item, NULL, USE_INVEN | USE_FLOOR)) { msg("You do not have that item to wield."); return; } /* Check the slot */ if (!slot_can_wield_item(slot, o_ptr)) { msg("You cannot wield that item there."); return; } equip_o_ptr = &p_ptr->inventory[slot]; /* If the slot is open, wield and be done */ if (!equip_o_ptr->kind) { wield_item(o_ptr, item, slot); return; } /* If the slot is in the quiver and objects can be combined */ if (obj_is_ammo(equip_o_ptr) && object_similar(equip_o_ptr, o_ptr, OSTACK_QUIVER)) { wield_item(o_ptr, item, slot); return; } /* Prevent wielding into a cursed slot */ if (cursed_p(equip_o_ptr->flags)) { object_desc(o_name, sizeof(o_name), equip_o_ptr, ODESC_BASE); msg("The %s you are %s appears to be cursed.", o_name, describe_use(slot)); return; } /* "!t" checks for taking off */ n = check_for_inscrip(equip_o_ptr, "!t"); while (n--) { /* Prompt */ object_desc(o_name, sizeof(o_name), equip_o_ptr, ODESC_PREFIX | ODESC_FULL); /* Forget it */ if (!get_check(format("Really take off %s? ", o_name))) return; } wield_item(o_ptr, item, slot); } /* Drop an item */ void do_cmd_drop(cmd_code code, cmd_arg args[]) { int item = args[0].item; object_type *o_ptr = object_from_item_idx(item); int amt = args[1].number; if (!item_is_available(item, NULL, USE_INVEN | USE_EQUIP)) { msg("You do not have that item to drop it."); return; } /* Hack -- Cannot remove cursed items */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("Hmmm, it seems to be cursed."); return; } inven_drop(item, amt); p_ptr->energy_use = 50; } /* Destroy an item */ void do_cmd_destroy(cmd_code code, cmd_arg args[]) { object_type *o_ptr; int item = args[0].item; if (!item_is_available(item, NULL, USE_INVEN | USE_EQUIP | USE_FLOOR)) { msg("You do not have that item to ignore it."); return; } o_ptr = object_from_item_idx(item); if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("You cannot ignore cursed items."); } else { char o_name[80]; object_desc(o_name, sizeof o_name, o_ptr, ODESC_PREFIX | ODESC_FULL); msgt(MSG_DESTROY, "Ignoring %s.", o_name); o_ptr->ignore = TRUE; p_ptr->notice |= PN_SQUELCH; } } /*** Using items the traditional way ***/ /* * Use an object the right way. * * There may be a BIG problem with any "effect" that can cause "changes" * to the inventory. For example, a "scroll of recharging" can cause * a wand/staff to "disappear", moving the inventory up. Luckily, the * scrolls all appear BEFORE the staffs/wands, so this is not a problem. * But, for example, a "staff of recharging" could cause MAJOR problems. * In such a case, it will be best to either (1) "postpone" the effect * until the end of the function, or (2) "change" the effect, say, into * giving a staff "negative" charges, or "turning a staff into a stick". * It seems as though a "rod of recharging" might in fact cause problems. * The basic problem is that the act of recharging (and destroying) an * item causes the inducer of that action to "move", causing "o_ptr" to * no longer point at the correct item, with horrifying results. */ void do_cmd_use(cmd_code code, cmd_arg args[]) { int item = args[0].item; object_type *o_ptr = object_from_item_idx(item); int effect; bool ident = FALSE, used = FALSE; bool was_aware = object_flavor_is_aware(o_ptr); int dir = 5; int px = p_ptr->px, py = p_ptr->py; int snd, boost, level; use_type use; int items_allowed = 0; /* Determine how this item is used. */ if (obj_is_rod(o_ptr)) { if (!obj_can_zap(o_ptr)) { msg("That rod is still charging."); return; } use = USE_TIMEOUT; snd = MSG_ZAP_ROD; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_wand(o_ptr)) { if (!obj_has_charges(o_ptr)) { msg("That wand has no charges."); return; } use = USE_CHARGE; snd = MSG_ZAP_ROD; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_staff(o_ptr)) { if (!obj_has_charges(o_ptr)) { msg("That staff has no charges."); return; } use = USE_CHARGE; snd = MSG_USE_STAFF; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_food(o_ptr)) { use = USE_SINGLE; snd = MSG_EAT; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_potion(o_ptr)) { use = USE_SINGLE; snd = MSG_QUAFF; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_scroll(o_ptr)) { /* Check player can use scroll */ if (!player_can_read()) return; use = USE_SINGLE; snd = MSG_GENERIC; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_activatable(o_ptr)) { if (!obj_can_activate(o_ptr)) { msg("That item is still charging."); return; } use = USE_TIMEOUT; snd = MSG_ACT_ARTIFACT; items_allowed = USE_EQUIP; } else { msg("The item cannot be used at the moment"); } /* Check if item is within player's reach. */ if (items_allowed == 0 || !item_is_available(item, NULL, items_allowed)) { msg("You cannot use that item from its current location."); return; } /* track the object used */ track_object(item); /* Figure out effect to use */ effect = object_effect(o_ptr); /* If the item requires a direction, get one (allow cancelling) */ if (obj_needs_aim(o_ptr)) dir = args[1].direction; /* Check for use if necessary, and execute the effect */ if ((use != USE_CHARGE && use != USE_TIMEOUT) || check_devices(o_ptr)) { int beam = beam_chance(o_ptr->tval); /* Special message for artifacts */ if (o_ptr->artifact) { msgt(snd, "You activate it."); if (o_ptr->artifact->effect_msg) activation_message(o_ptr, o_ptr->artifact->effect_msg); level = o_ptr->artifact->level; } else { /* Make a noise! */ sound(snd); level = o_ptr->kind->level; } /* A bit of a hack to make ID work better. -- Check for "obvious" effects beforehand. */ if (effect_obvious(effect)) object_flavor_aware(o_ptr); /* Boost damage effects if skill > difficulty */ boost = MAX(p_ptr->state.skills[SKILL_DEVICE] - level, 0); /* Do effect */ used = effect_do(effect, &ident, was_aware, dir, beam, boost); /* Quit if the item wasn't used and no knowledge was gained */ if (!used && (was_aware || !ident)) return; } /* If the item is a null pointer or has been wiped, be done now */ if (!o_ptr || !o_ptr->kind) return; if (ident) object_notice_effect(o_ptr); /* Food feeds the player */ if (o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION) player_set_food(p_ptr, p_ptr->food + o_ptr->pval[DEFAULT_PVAL]); /* Use the turn */ p_ptr->energy_use = 100; /* Mark as tried and redisplay */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); p_ptr->redraw |= (PR_INVEN | PR_EQUIP | PR_OBJECT); /* * If the player becomes aware of the item's function, then mark it as * aware and reward the player with some experience. Otherwise, mark * it as "tried". */ if (ident && !was_aware) { /* Object level */ int lev = o_ptr->kind->level; object_flavor_aware(o_ptr); if (o_ptr->tval == TV_ROD) object_notice_everything(o_ptr); player_exp_gain(p_ptr, (lev + (p_ptr->lev / 2)) / p_ptr->lev); p_ptr->notice |= PN_SQUELCH; } else if (used) { object_flavor_tried(o_ptr); } /* If there are no more of the item left, then we're done. */ if (!o_ptr->number) return; /* Chargeables act differently to single-used items when not used up */ if (used && use == USE_CHARGE) { /* Use a single charge */ o_ptr->pval[DEFAULT_PVAL]--; /* Describe charges */ if (item >= 0) inven_item_charges(item); else floor_item_charges(0 - item); } else if (used && use == USE_TIMEOUT) { /* Artifacts use their own special field */ if (o_ptr->artifact) o_ptr->timeout = randcalc(o_ptr->artifact->time, 0, RANDOMISE); else o_ptr->timeout += randcalc(o_ptr->kind->time, 0, RANDOMISE); } else if (used && use == USE_SINGLE) { /* Destroy a potion in the pack */ if (item >= 0) { inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } /* Destroy a potion on the floor */ else { floor_item_increase(0 - item, -1); floor_item_describe(0 - item); floor_item_optimize(0 - item); } } /* Hack to make Glyph of Warding work properly */ if (cave->feat[py][px] == FEAT_GLYPH) { /* Push objects off the grid */ if (cave->o_idx[py][px]) push_object(py, px); } } /*** Refuelling ***/ static void refill_lamp(object_type *j_ptr, object_type *o_ptr, int item) { /* Refuel */ j_ptr->timeout += o_ptr->timeout ? o_ptr->timeout : o_ptr->pval[DEFAULT_PVAL]; /* Message */ msg("You fuel your lamp."); /* Comment */ if (j_ptr->timeout >= FUEL_LAMP) { j_ptr->timeout = FUEL_LAMP; msg("Your lamp is full."); } /* Refilled from a lantern */ if (o_ptr->sval == SV_LIGHT_LANTERN) { /* Unstack if necessary */ if (o_ptr->number > 1) { object_type *i_ptr; object_type object_type_body; /* Get local object */ i_ptr = &object_type_body; /* Obtain a local object */ object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = 1; /* Remove fuel */ i_ptr->timeout = 0; /* Unstack the used item */ o_ptr->number--; p_ptr->total_weight -= i_ptr->weight; /* Carry or drop */ if (item >= 0) item = inven_carry(p_ptr, i_ptr); else drop_near(cave, i_ptr, 0, p_ptr->py, p_ptr->px, FALSE); } /* Empty a single lantern */ else { /* No more fuel */ o_ptr->timeout = 0; } /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); } /* Refilled from a flask */ else { /* Decrease the item (from the pack) */ if (item >= 0) { inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } /* Decrease the item (from the floor) */ else { floor_item_increase(0 - item, -1); floor_item_describe(0 - item); floor_item_optimize(0 - item); } } /* Recalculate torch */ p_ptr->update |= (PU_TORCH); /* Redraw stuff */ p_ptr->redraw |= (PR_EQUIP); } static void refuel_torch(object_type *j_ptr, object_type *o_ptr, int item) { bitflag f[OF_SIZE]; bitflag g[OF_SIZE]; /* Refuel */ j_ptr->timeout += o_ptr->timeout + 5; /* Message */ msg("You combine the torches."); /* Transfer the LIGHT flag if refuelling from a torch with it to one without it */ object_flags(o_ptr, f); object_flags(j_ptr, g); if (of_has(f, OF_LIGHT) && !of_has(g, OF_LIGHT)) { of_on(j_ptr->flags, OF_LIGHT); if (!j_ptr->ego && o_ptr->ego) j_ptr->ego = o_ptr->ego; msg("Your torch shines further!"); } /* Over-fuel message */ if (j_ptr->timeout >= FUEL_TORCH) { j_ptr->timeout = FUEL_TORCH; msg("Your torch is fully fueled."); } /* Refuel message */ else { msg("Your torch glows more brightly."); } /* Decrease the item (from the pack) */ if (item >= 0) { inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } /* Decrease the item (from the floor) */ else { floor_item_increase(0 - item, -1); floor_item_describe(0 - item); floor_item_optimize(0 - item); } /* Recalculate torch */ p_ptr->update |= (PU_TORCH); /* Redraw stuff */ p_ptr->redraw |= (PR_EQUIP); } void do_cmd_refill(cmd_code code, cmd_arg args[]) { object_type *j_ptr = &p_ptr->inventory[INVEN_LIGHT]; bitflag f[OF_SIZE]; int item = args[0].item; object_type *o_ptr = object_from_item_idx(item); if (!item_is_available(item, NULL, USE_INVEN | USE_FLOOR)) { msg("You do not have that item to refill with it."); return; } /* Check what we're wielding. */ object_flags(j_ptr, f); if (j_ptr->tval != TV_LIGHT) { msg("You are not wielding a light."); return; } else if (of_has(f, OF_NO_FUEL)) { msg("Your light cannot be refilled."); return; } /* It's a lamp */ if (j_ptr->sval == SV_LIGHT_LANTERN) refill_lamp(j_ptr, o_ptr, item); /* It's a torch */ else if (j_ptr->sval == SV_LIGHT_TORCH) refuel_torch(j_ptr, o_ptr, item); p_ptr->energy_use = 50; } /*** Spell casting ***/ /* Gain a specific spell, specified by spell number (for mages). */ void do_cmd_study_spell(cmd_code code, cmd_arg args[]) { int spell = args[0].choice; int item_list[INVEN_TOTAL + MAX_FLOOR_STACK]; int item_num; int i; /* Check the player can study at all atm */ if (!player_can_study()) return; /* Check that the player can actually learn the nominated spell. */ item_tester_hook = obj_can_browse; item_num = scan_items(item_list, N_ELEMENTS(item_list), (USE_INVEN | USE_FLOOR)); /* Check through all available books */ for (i = 0; i < item_num; i++) { if (spell_in_book(spell, item_list[i])) { if (spell_okay_to_study(spell)) { /* Spell is in an available book, and player is capable. */ spell_learn(spell); p_ptr->energy_use = 100; } else { /* Spell is present, but player incapable. */ msg("You cannot learn that spell."); } return; } } } /* Cast a spell from a book */ void do_cmd_cast(cmd_code code, cmd_arg args[]) { int spell = args[0].choice; int dir = args[1].direction; int item_list[INVEN_TOTAL + MAX_FLOOR_STACK]; int item_num; int i; const char *verb = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "cast" : "recite"); const char *noun = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Check the player can cast spells at all */ if (!player_can_cast()) return; /* Check spell is in a book they can access */ item_tester_hook = obj_can_browse; item_num = scan_items(item_list, N_ELEMENTS(item_list), (USE_INVEN | USE_FLOOR)); /* Check through all available books */ for (i = 0; i < item_num; i++) { if (spell_in_book(spell, item_list[i])) { if (spell_okay_to_cast(spell)) { /* Get the spell */ const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; /* Verify "dangerous" spells */ if (s_ptr->smana > p_ptr->csp) { /* Warning */ msg("You do not have enough mana to %s this %s.", verb, noun); /* Flush input */ flush(); /* Verify */ if (!get_check("Attempt it anyway? ")) return; } /* Cast a spell */ if (spell_cast(spell, dir)) p_ptr->energy_use = 100; } else { /* Spell is present, but player incapable. */ msg("You cannot %s that %s.", verb, noun); } return; } } } /* Gain a random spell from the given book (for priests) */ void do_cmd_study_book(cmd_code code, cmd_arg args[]) { int book = args[0].item; object_type *o_ptr = object_from_item_idx(book); int spell = -1; struct spell *sp; int k = 0; const char *p = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Check the player can study at all atm */ if (!player_can_study()) return; /* Check that the player has access to the nominated spell book. */ if (!item_is_available(book, obj_can_browse, (USE_INVEN | USE_FLOOR))) { msg("That item is not within your reach."); return; } /* Extract spells */ for (sp = o_ptr->kind->spells; sp; sp = sp->next) { if (!spell_okay_to_study(sp->spell_index)) continue; if ((++k > 1) && (randint0(k) != 0)) continue; spell = sp->spell_index; } if (spell < 0) { msg("You cannot learn any %ss in that book.", p); } else { spell_learn(spell); p_ptr->energy_use = 100; } } angband-v3.3.2/src/list-effects.h0000644000175000017500000004736611651552410016157 0ustar chriscchrisc/* * File: list-effects.h * Purpose: List of effect types */ /* * "rating" is the power rating for an item activation, as a damage-per-blow * equivalent (x2). These ratings are used in the calculation of the power (and * therefore cost) of an item which has the effect as an activation, but NOT * for other items (e.g. potions, scrolls). Hence the use of INIHIBIT_POWER. */ /* name aim? rating short description */ EFFECT(XXX, FALSE, 0, NULL) EFFECT(POISON, FALSE, 0, "poisons you for 2d7+10 turns") EFFECT(BLIND, FALSE, 0, "blinds you for 4d25+75 turns") EFFECT(SCARE, FALSE, 0, "induces fear in you for 1d10+10 turns") EFFECT(CONFUSE, FALSE, 0, "confuses you for 4d5+10 turns") EFFECT(HALLUC, FALSE, 0, "causes you to hallucinate") EFFECT(PARALYZE, FALSE, 0, "induces paralysis for 1d5+5 turns") EFFECT(SLOW, FALSE, 0, "slows you for 1d25+15 turns") EFFECT(CURE_POISON, FALSE, 1, "neutralizes poison") EFFECT(CURE_BLINDNESS, FALSE, 4, "cures blindness") EFFECT(CURE_PARANOIA, FALSE, 2, "removes your fear") EFFECT(CURE_CONFUSION, FALSE, 4, "cures confusion") EFFECT(CURE_MIND, FALSE, 8, "cures confusion and hallucination, removes fear and grants you temporary resistance to confusion") EFFECT(CURE_BODY, FALSE, 7, "heals cut damage, and cures stunning, poison and blindness") EFFECT(CURE_LIGHT, FALSE, 3, "heals 20 hitpoints, some cut damage, makes you a little less confused, and cures blindness") EFFECT(CURE_SERIOUS, FALSE, 6, "heals 40 hitpoints, cut damage, and cures blindness and confusion") EFFECT(CURE_CRITICAL, FALSE, 9, "heals 60 hitpoints, cut damage, and cures stunning, poisoning, blindness, and confusion") EFFECT(CURE_FULL, FALSE, 12, "heals you a really large amount (35% of max HP, minimum 300HP), heals cut damage, and cures stunning, poisoning, blindness, and confusion") EFFECT(CURE_FULL2, FALSE, 18, "restores 1200 hit points, heals cut damage, and cures stunning, poisoning, blindness, and confusion") EFFECT(CURE_NONORLYBIG,FALSE, 21, "restores 5000 hit points, restores experience and stats, heals cut damage, and cures stunning, poison, blindness, and confusion") EFFECT(CURE_TEMP, FALSE, 9, "heals cut damage, and cures all stunning, poison, blindness and confusion") EFFECT(HEAL1, FALSE, 13, "heals 500 hit points") EFFECT(HEAL2, FALSE, 16, "heals 1000 hit points") EFFECT(HEAL3, FALSE, 14, "heals 500 hit points, heals cut damage, and cures stunning") EFFECT(GAIN_EXP, FALSE, INHIBIT_POWER, "grants 100,000 experience points") EFFECT(LOSE_EXP, FALSE, 0, "drains a quarter of your experience") EFFECT(RESTORE_EXP, FALSE, 8, "restores your experience") EFFECT(RESTORE_MANA, FALSE, 20, "restores your mana points to maximum") EFFECT(GAIN_STR, FALSE, INHIBIT_POWER, "restores and increases your strength") EFFECT(GAIN_INT, FALSE, INHIBIT_POWER, "restores and increases your intelligence") EFFECT(GAIN_WIS, FALSE, INHIBIT_POWER, "restores and increases your wisdom") EFFECT(GAIN_DEX, FALSE, INHIBIT_POWER, "restores and increases your dexterity") EFFECT(GAIN_CON, FALSE, INHIBIT_POWER, "restores and increases your constitution") EFFECT(GAIN_CHR, FALSE, INHIBIT_POWER, "restores and increases your charisma") EFFECT(GAIN_ALL, FALSE, INHIBIT_POWER, "restores and increases all your stats") EFFECT(BRAWN, FALSE, 30, "raises your strength at the expense of a random attribute") EFFECT(INTELLECT, FALSE, 25, "raises your intelligence at the expense of a random attribute") EFFECT(CONTEMPLATION, FALSE, 25, "raises your wisdom at the expense of a random attribute") EFFECT(TOUGHNESS, FALSE, 30, "raises your constitution at the expense of a random attribute") EFFECT(NIMBLENESS, FALSE, 25, "raises your dexterity at the expense of a random attribute") EFFECT(PLEASING, FALSE, 5, "raises your charisma at the expense of a random attribute") EFFECT(LOSE_STR, FALSE, 0, "reduces your strength with damage 5d5") EFFECT(LOSE_INT, FALSE, 0, "reduces your intelligence with damage 5d5") EFFECT(LOSE_WIS, FALSE, 0, "reduces your wisdom with damage 5d5") EFFECT(LOSE_DEX, FALSE, 0, "reduces your dexterity with damage 5d5") EFFECT(LOSE_CON, FALSE, 0, "reduces your constitution with damage 5d5") EFFECT(LOSE_CHR, FALSE, 0, "reduces your intelligence with damage 5d5") EFFECT(LOSE_CON2, FALSE, 0, "reduces your constitution with damage 10d10") EFFECT(RESTORE_STR, FALSE, 10, "restores your strength") EFFECT(RESTORE_INT, FALSE, 8, "restores your intelligence") EFFECT(RESTORE_WIS, FALSE, 8, "restores your wisdom") EFFECT(RESTORE_DEX, FALSE, 9, "restores your dexterity") EFFECT(RESTORE_CON, FALSE, 10, "restores your constitution") EFFECT(RESTORE_CHR, FALSE, 4, "restores your charisma") EFFECT(RESTORE_ALL, FALSE, 15, "restores all your stats") EFFECT(RESTORE_ST_LEV, FALSE, 17, "restores all your stats and your experience points") EFFECT(TMD_INFRA, FALSE, 5, "extends your infravision by 50 feet for 4d25+100 turns") EFFECT(TMD_SINVIS, FALSE, 7, "cures blindness and allows you to see invisible things for 2d6+12 turns") EFFECT(TMD_ESP, FALSE, 10, "cures blindness and gives you telepathy for 6d6+12 turns") EFFECT(ENLIGHTENMENT, FALSE, 22, "completely lights up and magically maps the level") EFFECT(ENLIGHTENMENT2, FALSE, INHIBIT_POWER, "increases your intelligence and wisdom, detects and maps everything in the surrounding area, and identifies all items in your pack") EFFECT(HERO, FALSE, 7, "restores 10 hit points, removes fear and grants you resistance to fear and +12 to-hit for 1d25+25 turns") EFFECT(SHERO, FALSE, 9, "restores 30 hit points, removes fear and grants you resistance to fear, +24 to-hit, and -10AC for 1d25+25 turns") EFFECT(RESIST_ACID, FALSE, 4, "grants temporary resistance to acid for 1d10+10 turns") EFFECT(RESIST_ELEC, FALSE, 4, "grants temporary resistance to electricity for 1d10+10 turns") EFFECT(RESIST_FIRE, FALSE, 4, "grants temporary resistance to fire for 1d10+10 turns") EFFECT(RESIST_COLD, FALSE, 4, "grants temporary resistance to cold for 1d10+10 turns") EFFECT(RESIST_POIS, FALSE, 4, "grants temporary resistance to poison for 1d10+10 turns") EFFECT(RESIST_ALL, FALSE, 10, "grants temporary resistance to acid, electricity, fire, cold and poison for 1d20+20 turns") EFFECT(DETECT_TREASURE, FALSE, 6, "detects gold and objects nearby") EFFECT(DETECT_TRAP, FALSE, 6, "detects traps nearby") EFFECT(DETECT_DOORSTAIR, FALSE, 6, "detects doors and stairs nearby") EFFECT(DETECT_INVIS, FALSE, 6, "detects invisible creatures nearby") EFFECT(DETECT_EVIL, FALSE, 6, "detects evil creatures nearby") EFFECT(DETECT_ALL, FALSE, 10, "detects treasure, traps, doors, stairs, and all creatures nearby") EFFECT(ENCHANT_TOHIT, FALSE, 15, "attempts to magically enhance a weapon's to-hit bonus") EFFECT(ENCHANT_TODAM, FALSE, 20, "attempts to magically enhance a weapon's to-dam bonus") EFFECT(ENCHANT_WEAPON, FALSE, 22, "attempts to magically enhance a weapon both to-hit and to-dam") EFFECT(ENCHANT_ARMOR, FALSE, 12, "attempts to magically enhance a piece of armour") EFFECT(ENCHANT_ARMOR2, FALSE, 15, "attempts to magically enhance a piece of armour with high chance of success") EFFECT(RESTORE_ITEM, FALSE, 10, "restores an item after disenchantment or damage") EFFECT(IDENTIFY, FALSE, 9, "reveals to you the extent of an item's magical powers") EFFECT(REMOVE_CURSE, FALSE, 8, "removes all ordinary curses from all equipped items") EFFECT(REMOVE_CURSE2, FALSE, 20, "removes all curses from all equipped items") EFFECT(LIGHT, FALSE, 4, "lights up an area and inflicts 2d8 damage on light-sensitive creatures") EFFECT(SUMMON_MON, FALSE, 0, "summons monsters at the current dungeon level") EFFECT(SUMMON_UNDEAD, FALSE, 0, "summons undead monsters at the current dungeon level") EFFECT(TELE_PHASE, FALSE, 5, "teleports you randomly up to 10 squares away") EFFECT(TELE_LONG, FALSE, 6, "teleports you randomly up to 100 squares away") EFFECT(TELE_LEVEL, FALSE, 15, "teleports you one level up or down") EFFECT(CONFUSING, FALSE, 8, "causes your next attack upon a monster to confuse it") EFFECT(MAPPING, FALSE, 10, "maps the area around you") EFFECT(RUNE, FALSE, 20, "inscribes a glyph of warding beneath you, which monsters cannot move onto") EFFECT(ACQUIRE, FALSE, INHIBIT_POWER, "creates a good object nearby") EFFECT(ACQUIRE2, FALSE, INHIBIT_POWER, "creates a few good items nearby") EFFECT(ANNOY_MON, FALSE, 0, "awakens all nearby sleeping monsters and hastens all monsters within line of sight") EFFECT(CREATE_TRAP, FALSE, 0, "creates traps surrounding you") EFFECT(DESTROY_TDOORS, FALSE, 6, "destroys all traps and doors surrounding you") EFFECT(RECHARGE, FALSE, 11, "tries to recharge a wand or staff, destroying the wand or staff on failure") EFFECT(BANISHMENT, FALSE, 20, "removes all non-unique monsters represented by a chosen symbol from the level, dealing you damage in the process") EFFECT(DARKNESS, FALSE, 0, "darkens the nearby area and blinds you for 1d5+3 turns") EFFECT(PROTEVIL, FALSE, 6, "grants you protection from evil for 1d25 plus 3 times your character level turns") EFFECT(SATISFY, FALSE, 7, "magically renders you well-fed, curing any gastrointestinal problems") EFFECT(CURSE_WEAPON, FALSE, 0, "curses your currently wielded melee weapon") EFFECT(CURSE_ARMOR, FALSE, 0, "curses your currently worn body armor") EFFECT(BLESSING, FALSE, 6, "increases your AC and to-hit bonus for 1d12+6 turns") EFFECT(BLESSING2, FALSE, 7, "increases your AC and to-hit bonus for 1d24+12 turns") EFFECT(BLESSING3, FALSE, 8, "increases your AC and to-hit bonus for 1d48+24 turns") EFFECT(RECALL, FALSE, 15, "returns you from the dungeon or takes you to the dungeon after a short delay") EFFECT(DEEP_DESCENT, FALSE, 19, "teleports you two levels down") EFFECT(EARTHQUAKES, FALSE, 5, "causes an earthquake around you") EFFECT(DESTRUCTION2, FALSE, 12, "destroys an area around you in the shape of a circle radius 15, and blinds you for 1d10+10 turns") EFFECT(LOSHASTE, FALSE, 0, "hastes all monsters within line of sight") EFFECT(LOSSLOW, FALSE, 7, "slows all non-unique monsters within line of sight") EFFECT(LOSSLEEP, FALSE, 8, "sleeps all non-unique creatures within line of sight") EFFECT(LOSCONF, FALSE, 10, "confuses all non-unique creatures within line of sight") EFFECT(LOSKILL, FALSE, 25, "removes all non-unique monsters within 20 squares, dealing you damage in the process") EFFECT(ILLUMINATION, FALSE, 4, "lights up the surrounding area, hurting light-sensitive creatures") EFFECT(CLAIRVOYANCE, FALSE, 23, "maps the entire level and detects nearby objects, traps, doors, and stairs") EFFECT(PROBING, FALSE, 8, "gives you information on the health and abilities of monsters you can see") EFFECT(HASTE, FALSE, 10, "hastens you for 2d10+20 turns") EFFECT(HASTE1, FALSE, 10, "hastens you for d20+20 turns") EFFECT(HASTE2, FALSE, 13, "hastens you for d75+75 turns") EFFECT(DISPEL_EVIL, FALSE, 12, "deals five times your level's damage to all evil creatures that you can see") EFFECT(DISPEL_EVIL60, FALSE, 9, "deals 60 damage to all evil creatures that you can see") EFFECT(DISPEL_UNDEAD, FALSE, 9, "deals 60 damage to all undead creatures that you can see") EFFECT(DISPEL_ALL, FALSE, 11, "deals 120 damage to all creatures that you can see") EFFECT(SLEEPII, FALSE, 8, "puts to sleep the monsters around you") EFFECT(STAR_BALL, FALSE, 18, "fires a ball of electricity in all directions, each one causing 150 damage") EFFECT(RAGE_BLESS_RESIST, FALSE, 21, "bestows upon you berserk rage, bless, and resistance") EFFECT(RESTORE_LIFE, FALSE, 8, "restores your experience to full") EFFECT(REM_FEAR_POIS, FALSE, 3, "cures you of fear and poison") EFFECT(FIREBRAND, FALSE, 25, "brands bolts with fire, in an unbalanced fashion") EFFECT(FIRE_BOLT, TRUE, 5, "creates a fire bolt with damage 9d8") EFFECT(FIRE_BOLT2, TRUE, 7, "creates a fire bolt with damage 12d8") EFFECT(FIRE_BOLT3, TRUE, 9, "creates a fire bolt with damage 16d8") EFFECT(FIRE_BOLT72, TRUE, 9, "creates a fire ball with damage 72") EFFECT(FIRE_BALL, TRUE, 11, "creates a fire ball with damage 144") EFFECT(FIRE_BALL2, TRUE, 11, "creates a large fire ball with damage 120") EFFECT(FIRE_BALL200, TRUE, 13, "creates a large fire ball with damage 200") EFFECT(COLD_BOLT, TRUE, 4, "creates a frost bolt with damage 6d8") EFFECT(COLD_BOLT2, TRUE, 7, "creates a frost bolt with damage 12d8") EFFECT(COLD_BALL2, TRUE, 13, "creates a large frost ball with damage 200") EFFECT(COLD_BALL50, TRUE, 8, "creates a frost ball with damage 50") EFFECT(COLD_BALL100, TRUE, 10, "creates a frost ball with damage 100") EFFECT(COLD_BALL160, TRUE, 12, "creates a frost ball with damage 160") EFFECT(ACID_BOLT, TRUE, 4, "creates an acid bolt with damage 5d8") EFFECT(ACID_BOLT2, TRUE, 6, "creates an acid bolt with damage 10d8") EFFECT(ACID_BOLT3, TRUE, 7, "creates an acid bolt with damage 12d8") EFFECT(ACID_BALL, TRUE, 11, "creates an acid ball with damage 125") EFFECT(ELEC_BOLT, TRUE, 5, "creates a lightning bolt (that always beams) with damage 6d6") EFFECT(ELEC_BALL, TRUE, 9, "creates a lightning ball with damage 64") EFFECT(ELEC_BALL2, TRUE, 14, "creates a large lightning ball with damage 250") EFFECT(DRAIN_LIFE1, TRUE, 9, "drains up to 90 hit points of life from a target creature") EFFECT(DRAIN_LIFE2, TRUE, 10, "drains up to 120 hit points of life from a target creature") EFFECT(DRAIN_LIFE3, TRUE, 11, "drains up to 150 hit points of life from a target creature") EFFECT(DRAIN_LIFE4, TRUE, 12, "drains up to 250 hit points of life from a target creature") EFFECT(MISSILE, TRUE, 3, "fires a magic missile with damage 3d4") EFFECT(MANA_BOLT, TRUE, 7, "fires a mana bolt with damage 12d8") EFFECT(BIZARRE, TRUE, 20, "does bizarre things") EFFECT(ARROW, TRUE, 11, "fires a magical arrow with damage 150") EFFECT(STINKING_CLOUD, TRUE, 3, "fires a stinking cloud with damage 12") EFFECT(STONE_TO_MUD, TRUE, 6, "turns rock into mud") EFFECT(TELE_OTHER, TRUE, 11, "teleports a target monster away") EFFECT(CONFUSE2, TRUE, 3, "confuses a target monster") EFFECT(MON_HEAL, TRUE, 0, "heals a single monster 4d6 hit points") EFFECT(MON_HASTE, TRUE, 0, "hastes a single monster") EFFECT(MON_SLOW, TRUE, 3, "attempts to magically slow a single monster") EFFECT(MON_CONFUSE, TRUE, 3, "attempts to magically confuse a single monster") EFFECT(MON_SLEEP, TRUE, 3, "attempts to induce magical sleep in a single monster") EFFECT(MON_CLONE, TRUE, 0, "hastes, heals, and magically duplicates a single monster") EFFECT(MON_SCARE, TRUE, 3, "attempts to induce magical fear in a single monster") EFFECT(LIGHT_LINE, TRUE, 6, "lights up part of the dungeon in a straight line") EFFECT(DISARMING, TRUE, 7, "destroys traps, unlocks doors and reveals all secret doors in a given direction") EFFECT(TDOOR_DEST, TRUE, 5, "destroys traps and doors") EFFECT(POLYMORPH, TRUE, 7, "polymorphs a monster into another kind of creature") EFFECT(STARLIGHT, FALSE, 5, "fires a line of light in all directions, each one causing light-sensitive creatures 6d8 damage") EFFECT(STARLIGHT2, FALSE, 7, "fires a line of light in all directions, each one causing 10d8 damage") EFFECT(BERSERKER, FALSE, 10, "puts you in a berserker rage for d50+50 turns") EFFECT(WONDER, TRUE, 9, "creates random and unpredictable effects") EFFECT(WAND_BREATH, TRUE, 12, "shoots a large ball of one of the base elements for 120-200 damage") EFFECT(STAFF_MAGI, FALSE, 20, "restores both intelligence and manapoints to maximum") EFFECT(STAFF_HOLY, FALSE, 12, "inflicts damage on evil creatures you can see, cures 50 hit points, heals all temporary effects and grants you protection from evil") EFFECT(DRINK_GOOD, FALSE, 0, NULL) EFFECT(DRINK_BREATH, TRUE, 8, "causes you to breathe either cold or flames for 80 damage") EFFECT(DRINK_SALT, FALSE, 0, "induces vomiting and paralysis for 4 turns, resulting in severe hunger but also curing poison") EFFECT(DRINK_DEATH, FALSE, 0, "inflicts 5000 points of damage") EFFECT(DRINK_RUIN, FALSE, 0, "inflicts 10d10 points of damage and decreases all your stats") EFFECT(DRINK_DETONATE, FALSE, 0, "inflicts 50d20 points of damage, severe cuts, and stunning") EFFECT(FOOD_GOOD, FALSE, 0, NULL) EFFECT(FOOD_WAYBREAD, FALSE, 4, "restores 4d8 hit points and neutralizes poison") EFFECT(SHROOM_EMERGENCY, FALSE, 7, "grants temporary resistance to fire and cold, cures 200HP, but also makes you hallucinate wildly") EFFECT(SHROOM_TERROR, FALSE, 5, "speeds up you temporarily but also makes you mortally afraid") EFFECT(SHROOM_STONE, FALSE, 5, "turns your skin to stone briefly, which grants an extra 40AC but slows you down") EFFECT(SHROOM_DEBILITY, FALSE, 5, "restores some mana but also drains either your strength or constitution") EFFECT(SHROOM_SPRINTING, FALSE, 5, "hastes you for a while, but then makes you slower for a while afterward") EFFECT(SHROOM_PURGING, FALSE, 5, "makes you very hungry but restores constitution and strength") EFFECT(RING_ACID, TRUE, 11, "grants acid resistance for d20+20 turns and creates an acid ball of damage 70") EFFECT(RING_FLAMES, TRUE, 11, "grants fire resistance for d20+20 turns and creates a fire ball of damage 80") EFFECT(RING_ICE, TRUE, 11, "grants cold resistance for d20+20 turns and creates a cold ball of damage 75") EFFECT(RING_LIGHTNING, TRUE, 11, "grants electricity resistance for d20+20 turns and creates a lightning ball of damage 85") EFFECT(DRAGON_BLUE, TRUE, 18, "allows you to breathe lightning for 100 damage") EFFECT(DRAGON_GREEN, TRUE, 19, "allows you to breathe poison gas for 150 damage") EFFECT(DRAGON_RED, TRUE, 20, "allows you to breathe fire for 200 damage") EFFECT(DRAGON_MULTIHUED, TRUE, 20, "allows you to breathe the elements for 250 damage") EFFECT(DRAGON_BRONZE, TRUE, INHIBIT_POWER, "allows you to breathe confusion for 120 damage") EFFECT(DRAGON_GOLD, TRUE, 19, "allows you to breathe sound for 130 damage") EFFECT(DRAGON_CHAOS, TRUE, 23, "allows you to breathe chaos or disenchantment for 220 damage") EFFECT(DRAGON_LAW, TRUE, 23, "allows you to breathe sound/shards for 230 damage") EFFECT(DRAGON_BALANCE, TRUE, 24, "allows you to breathe balance for 250 damage") EFFECT(DRAGON_SHINING, TRUE, 21, "allows you to breathe light or darkness for 200 damage") EFFECT(DRAGON_POWER, TRUE, 25, "allows you to breathe for 300 damage") EFFECT(TRAP_DOOR, FALSE, 0, "a trap door which drops you down a level") EFFECT(TRAP_PIT, FALSE, 0, "a pit trap - the fall might hurt") EFFECT(TRAP_PIT_SPIKES, FALSE, 0, "a pit trap, with nasty spikes") EFFECT(TRAP_PIT_POISON, FALSE, 0, "a pit trap, with poisoned spikes") EFFECT(TRAP_RUNE_SUMMON, FALSE, 0, "a rune which summons monsters") EFFECT(TRAP_RUNE_TELEPORT, FALSE, 0, "a rune which teleports") EFFECT(TRAP_SPOT_FIRE, FALSE, 0, "a magical fire trap") EFFECT(TRAP_SPOT_ACID, FALSE, 0, "a magical acid trap") EFFECT(TRAP_DART_SLOW, FALSE, 0, "a dart which slows movements") EFFECT(TRAP_DART_LOSE_STR, FALSE, 0, "a dart which drains strength") EFFECT(TRAP_DART_LOSE_DEX, FALSE, 0, "a dart which drains dexterity") EFFECT(TRAP_DART_LOSE_CON, FALSE, 0, "a dart which drains constitution") EFFECT(TRAP_GAS_BLIND, FALSE, 0, "blinding gas") EFFECT(TRAP_GAS_CONFUSE, FALSE, 0, "confusing gas") EFFECT(TRAP_GAS_POISON, FALSE, 0, "poison gas") EFFECT(TRAP_GAS_SLEEP, FALSE, 0, "soporific gas") angband-v3.3.2/src/z-textblock.c0000644000175000017500000001171011651552410016010 0ustar chriscchrisc/* * File: z-textblock.c * Purpose: Text output bugger code * * Copyright (c) 2010 Andi Sidwell * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. */ #include "z-term.h" #include "z-textblock.h" #include "z-virt.h" #include "z-form.h" #define TEXTBLOCK_LEN_INITIAL 128 #define TEXTBLOCK_LEN_INCR(x) (x + 128) struct textblock { char *text; byte *attrs; size_t strlen; size_t size; }; /** * Create a new textblock object and return it. */ textblock *textblock_new(void) { textblock *tb = mem_zalloc(sizeof *tb); tb->size = TEXTBLOCK_LEN_INITIAL; tb->text = mem_zalloc(tb->size); tb->attrs = mem_zalloc(tb->size * sizeof *tb->attrs); return tb; } /** * Free a textblock object. */ void textblock_free(textblock *tb) { mem_free(tb->text); mem_free(tb->attrs); mem_free(tb); } static void textblock_vappend_c(textblock *tb, byte attr, const char *fmt, va_list vp) { while (1) { va_list args; size_t len; size_t remaining = tb->size - tb->strlen; char *fmt_start = tb->text + tb->strlen; VA_COPY(args, vp); len = vstrnfmt(fmt_start, remaining, fmt, args); va_end(args); if (len < remaining - 1) { byte *attr_start = tb->attrs + (tb->strlen * sizeof *tb->attrs); memset(attr_start, attr, len * sizeof *tb->attrs); tb->strlen += len; break; } tb->size = TEXTBLOCK_LEN_INCR(tb->size); tb->text = mem_realloc(tb->text, tb->size); tb->attrs = mem_realloc(tb->attrs, tb->size * sizeof *tb->attrs); } } /** * Add text to a text block, formatted. */ void textblock_append(textblock *tb, const char *fmt, ...) { va_list vp; va_start(vp, fmt); textblock_vappend_c(tb, TERM_WHITE, fmt, vp); va_end(vp); } /** * Add coloured text to a text block, formatted. */ void textblock_append_c(textblock *tb, byte attr, const char *fmt, ...) { va_list vp; va_start(vp, fmt); textblock_vappend_c(tb, attr, fmt, vp); va_end(vp); } /** * Return a pointer to the text inputted thus far. */ const char *textblock_text(textblock *tb) { return tb->text; } /** * Return a pointer to the text attrs. */ const byte *textblock_attrs(textblock *tb) { return tb->attrs; } static void new_line(size_t **line_starts, size_t **line_lengths, size_t *n_lines, size_t *cur_line, size_t start, size_t len) { if (*cur_line == *n_lines) { /* this number is not arbitrary: it's the height of a "standard" term */ (*n_lines) += 24; *line_starts = mem_realloc(*line_starts, *n_lines * sizeof **line_starts); *line_lengths = mem_realloc(*line_lengths, *n_lines * sizeof **line_lengths); } (*line_starts)[*cur_line] = start; (*line_lengths)[*cur_line] = len; (*cur_line)++; } /** * Given a certain width, split a textblock into wrapped lines of text. * * \returns Number of lines in output. */ size_t textblock_calculate_lines(textblock *tb, size_t **line_starts, size_t **line_lengths, size_t width) { const char *text = tb->text; size_t cur_line = 0, n_lines = 0; size_t len = strlen(text); size_t text_offset; size_t line_start = 0, line_length = 0; size_t word_start = 0, word_length = 0; assert(width > 0); for (text_offset = 0; text_offset < len; text_offset++) { if (text[text_offset] == '\n') { new_line(line_starts, line_lengths, &n_lines, &cur_line, line_start, line_length); line_start = text_offset + 1; line_length = 0; } else if (text[text_offset] == ' ') { line_length++; word_start = line_length; word_length = 0; } else { line_length++; word_length++; } /* special case: if we have a very long word, just slice it */ if (word_length == width) { new_line(line_starts, line_lengths, &n_lines, &cur_line, line_start, line_length); line_start += line_length; line_length = 0; } /* normal wrapping: wrap text at last word */ if (line_length == width) { size_t last_word_offset = word_start; while (text[line_start + last_word_offset] != ' ') last_word_offset--; new_line(line_starts, line_lengths, &n_lines, &cur_line, line_start, last_word_offset); line_start += word_start; line_length = word_length; } } return cur_line; } /** * Output a textblock to file. */ void textblock_to_file(textblock *tb, ang_file *f, int indent, int wrap_at) { size_t *line_starts = NULL; size_t *line_lengths = NULL; size_t n_lines, i; int width = wrap_at - indent; assert(width > 0); n_lines = textblock_calculate_lines(tb, &line_starts, &line_lengths, width); for (i = 0; i < n_lines; i++) { file_putf(f, "%*c%.*s\n", indent, ' ', line_lengths[i], tb->text + line_starts[i]); } } angband-v3.3.2/src/z-msg.c0000644000175000017500000000666411651552410014613 0ustar chriscchrisc/* * File: z-msg.c * Purpose: Message handling * * Copyright (c) 2007 Elly, Andrew Sidwell * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. */ #include "z-virt.h" #include "z-term.h" #include "z-msg.h" typedef struct _message_t { char *str; struct _message_t *newer; struct _message_t *older; u16b type; u16b count; } message_t; typedef struct _msgcolor_t { u16b type; byte color; struct _msgcolor_t *next; } msgcolor_t; typedef struct _msgqueue_t { message_t *head; message_t *tail; msgcolor_t *colors; u32b count; u32b max; } msgqueue_t; static msgqueue_t *messages = NULL; /* Functions operating on the entire list */ errr messages_init(void) { messages = ZNEW(msgqueue_t); messages->max = 2048; return 0; } void messages_free(void) { msgcolor_t *c = messages->colors; msgcolor_t *nextc; message_t *m = messages->head; message_t *nextm; while (m) { nextm = m->older; FREE(m->str); FREE(m); m = nextm; } while (c) { nextc = c->next; FREE(c); c = nextc; } FREE(messages); } u16b messages_num(void) { return messages->count; } /* Functions for individual messages */ void message_add(const char *str, u16b type) { message_t *m; if (messages->head && messages->head->type == type && !strcmp(messages->head->str, str)) { messages->head->count++; return; } m = ZNEW(message_t); m->str = string_make(str); m->type = type; m->count = 1; m->older = messages->head; if (messages->head) messages->head->newer = m; messages->head = m; messages->count++; if (!messages->tail) messages->tail = m; if (messages->count > messages->max) { message_t *old_tail = messages->tail; messages->tail = old_tail->newer; messages->tail->older = NULL; FREE(old_tail->str); FREE(old_tail); messages->count--; } } static message_t *message_get(u16b age) { message_t *m = messages->head; while (m && age--) m = m->older; return m; } const char *message_str(u16b age) { message_t *m = message_get(age); return (m ? m->str : ""); } u16b message_count(u16b age) { message_t *m = message_get(age); return (m ? m->count : 0); } u16b message_type(u16b age) { message_t *m = message_get(age); return (m ? m->type : 0); } byte message_color(u16b age) { message_t *m = message_get(age); return (m ? message_type_color(m->type) : TERM_WHITE); } /* Message-color functions */ void message_color_define(u16b type, byte color) { msgcolor_t *mc; if (!messages->colors) { messages->colors = ZNEW(msgcolor_t); messages->colors->type = type; messages->colors->color = color; } mc = messages->colors; while (mc->next) { if (mc->type == type) { mc->color = color; } mc = mc->next; } mc->next = ZNEW(msgcolor_t); mc->next->type = type; mc->next->color = color; } byte message_type_color(u16b type) { msgcolor_t *mc; byte color = TERM_WHITE; if (messages) { mc = messages->colors; while (mc && mc->type != type) mc = mc->next; if (mc && (mc->color != TERM_DARK)) color = mc->color; } return color; } angband-v3.3.2/src/angband.man0000644000175000017500000000676311651552410015501 0ustar chriscchrisc.\" Hey, Emacs! This is an -*- nroff -*- source file. .\" Copyright (c) 1997 Manoj Srivastava .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, write to the Free .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, .\" USA. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, write to the Free .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, .\" USA. .\" .\" arch-tag: 393fc0e6-b0d3-42a9-a5d7-265743f99582 .\" $Id: angband.man,v 1.5 2002/01/17 05:30:43 srivasta Exp $ .TH ANGBAND 6 "February 16 1998" "Debian" "Debian GNU/Linux manual" .SH NAME angband \- is a graphical dungeon adventure game in the vein of rogue .SH SYNOPSIS .B angband .I [options] .I [\-\- suboptions] .SH DESCRIPTION This manual page explains the Debian package .B "angband". .B Angband is a single-player, .I graphical dungeon adventure game using textual characters to represent the walls and floors of a dungeon and the inhabitants therein, in the vein of .I rogue, .I hack, .I nethack, and .I moria. .B Angband 3.3.2 is an official stable release which fixes some bugs in 3.3.1. .PP This version of .B Angband has been compiled with .I ncurses and the .I X Windowing system, SDL and GTK front-ends, and hence can be played on a virtual console as well as under .I X. In the latter cases, the game can use multiple windows. .SH OPTIONS .PD 0 .TP 10 .B \-h Print out a usage message. .TP .BR \-n Start a new character .TP .BR \-w Request wizard mode (no high score entry) .TP .BR \-g Request graphics mode .TP .BR \-r Rebalance monsters .TP .BR \-s Show high scores .TP .BR \-u Use your savefile .TP .BR \-m Use core code (e.g. gcu for console mode, x11 or sdl for graphics) .TP .BR \-d= Define a \'lib\' dir sub-path. Valid values of lib are help info user bone save data apex xtra edit file .PD .SH "GETTING STARTED" To start with, you can just say angband \-uTest, and that creates a save file with the file name .I ~/.angband/Angband/save/.Test. The best place to get help is the program itself; help is reached by the command .B ? and presents a menu of choices. .PP Program options can be set using the = command. To see what the various options mean, access the List of Options help menu with the ? command. .SH "SEE ALSO" .BR nethack (6). .SH AUTHOR This manual page was written Manoj Srivastava , for the Debian GNU/Linux system. angband-v3.3.2/src/Makefile.win0000644000175000017500000000475511651552410015645 0ustar chriscchrisc# # Makefile for Windows systems using gmake # # # Try "make" to do a default build, using cygwin. # # Try "make CONSOLE=yes" to use PDCurses, as long as you set # PDCURSES_INCLUDE_DIR and PDCURSES_LIB. # # Other options: # OBJ_DIR=x will place .o files into directory 'x' # MINGW=yes will use the mingw compiler # # Executable name and default target EXE = angband.exe all: ../$(EXE) ifneq (,$(findstring \system32,$(PATH))) CP = copy RM = del else CP = -cp RM = -rm endif ifndef MINGW CYGWIN=yes endif # Include list of object files and add system-specific ones include Makefile.inc ifdef CONSOLE CFLAGS = -DUSE_GCU -DWIN32_CONSOLE_MODE -I$(PDCURSES_INC) LIBS = -s $(PDCURSES_LIB) IOBJS = $(BASEOBJS) main-gcu.o main.o #PDCURSES_INC = ../../pdcurses/include #PDCURSES_LIB = ../../pdcurses/lib/pdcurses.a else CFLAGS = -DWINDOWS -static CFLAGS += -Iwin/include -Lwin/lib LDFLAGS += -Lwin/lib IOBJS = $(BASEOBJS) win/angband.res main-win.o win/readdib.o win/readpng.o LIBS = -s -mwindows -lwinmm -lzlib -llibpng endif CC = $(CROSS)gcc WRES = $(CROSS)windres WARNINGS = -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers CFLAGS += $(WARNINGS) -std=c99 -Wdeclaration-after-statement -O2 -I. ifdef BUILD_ID CFLAGS += -DBUILD_ID="$(BUILD_ID)" endif ifdef CYGWIN LIBS += -mno-cygwin -e _mainCRTStartup CFLAGS += -mno-cygwin # Note the additional -DNEAR= flag to cope with the 'NEAR' # keyword used in readdib.c win/readdib.o: win/readdib.c win/readdib.h $(CC) $(CFLAGS) -DNEAR= $(INCDIRS) -c -o $@ $< win/readpng.o: win/readpng.c win/readdib.h $(CC) $(CFLAGS) -DNEAR= $(INCDIRS) -c -o $@ $< endif # Handle cross compiles ifdef CROSS CFLAGS += -DCROSS_COMPILE ifdef MINGW # This is an issue on mingw32 on linux CFLAGS += -D_stdcall= endif endif # Handle object output in a different directory ifdef OBJDIR OBJS = $(patsubst %.o, $(OBJDIR)%.o, $(IOBJS)) mkdirs:; -mkdir -p $(OBJDIR) $(OBJDIR)win $(EXE): mkdirs else OBJS = $(IOBJS) endif # # Targets # ../$(EXE): $(EXE) $(CP) $(EXE) .. $(CP) win/dll/libpng12.dll .. $(CP) win/dll/zlib1.dll .. $(EXE): $(OBJS) $(CC) $(CFLAGS) -o $(EXE) $(OBJS) $(LIBS) clean: $(RM) -f $(EXE) $(OBJS) $(RM) -f libpng12.dll $(RM) -f zlib1.dll # # Rules # win/angband.res: win/angband.rc $(WRES) $< -O coff -o $@ $(OBJDIR)%.o: %.c $(INCS) $(CC) $(CFLAGS) -c -o $@ $< angband-v3.3.2/src/autoconf.h.in0000644000175000017500000000731111651552413015777 0ustar chriscchrisc/* src/autoconf.h.in. Generated from configure.ac by autoheader. */ /* Path to the game's configuration data */ #undef DEFAULT_CONFIG_PATH /* Path to the game's variable data */ #undef DEFAULT_DATA_PATH /* Path to the game's lib directory */ #undef DEFAULT_LIB_PATH /* Define to 1 if you have the `can_change_color' function. */ #undef HAVE_CAN_CHANGE_COLOR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID /* Define to 1 if you have the `setresgid' function. */ #undef HAVE_SETRESGID /* Define to 1 if you have the `stat' function. */ #undef HAVE_STAT /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `use_default_colors' function. */ #undef HAVE_USE_DEFAULT_COLORS /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to 1 if using SDL_mixer sound support and it's found. */ #undef SOUND_SDL /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if Curses or PDCurses is found, but NCurses is not. */ #undef USE_CURSES /* Define to 1 if using the Curses frontend. */ #undef USE_GCU /* Define to 1 if using the GTK+ 2.x interface and GTK+ 2.x is found. */ #undef USE_GTK /* Define to 1 if NCurses is found. */ #undef USE_NCURSES /* Define to use private save and score paths. */ #undef USE_PRIVATE_PATHS /* Define to 1 if using the SDL interface and SDL is found. */ #undef USE_SDL /* Define to 0 to omit the stats frontend */ #undef USE_STATS /* Define to 1 to build the test frontend */ #undef USE_TEST /* Define to 1 if using the X11 frontend and X11 libraries are found. */ #undef USE_X11 /* Version number of package */ #undef VERSION /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to empty if `const' does not conform to ANSI C. */ #undef const angband-v3.3.2/src/main-gcu.c0000644000175000017500000005302311651552410015245 0ustar chriscchrisc/* * File: main-gcu.c * Purpose: Support for "curses" systems * * Copyright (c) 1997 Ben Harrison, and others * Copyright (c) 2009-2011 Erik Osheim * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cmds.h" #ifdef USE_GCU #include "main.h" #include "files.h" /* locale junk */ #include "locale.h" #include "langinfo.h" /* Avoid 'struct term' name conflict with (via ) on AIX */ #define term System_term /* * Include the proper "header" file */ #ifdef USE_NCURSES # ifdef HAVE_STDBOOL_H # define NCURSES_ENABLE_STDBOOL_H 0 # endif # include #else # include #endif #include #undef term /* * Use POSIX terminal I/O */ #define USE_TPOSIX /* * Hack -- Windows Console mode uses PDCURSES and cannot do any terminal stuff * Hack -- Windows needs Sleep(), and I really don't want to pull in all * the Win32 headers for this one function */ #if defined(WIN32_CONSOLE_MODE) # undef USE_TPOSIX _stdcall void Sleep(int); #define usleep(v) Sleep(v / 1000) #endif /* * POSIX stuff */ #ifdef USE_TPOSIX # include #endif /* * If you have errors relating to curs_set(), comment out the following line */ #define USE_CURS_SET /* * If you have errors with any of the functions mentioned below, try * uncommenting the line it's mentioned on. */ /* #define cbreak() crmode() */ /* #define nonl() */ /* #define nl() */ /* * Save the "normal" and "angband" terminal settings */ #ifdef USE_TPOSIX static struct termios norm_termios; static struct termios game_termios; #endif /* * The TERM environment variable; used for terminal capabilities. */ static char *termtype; static bool loaded_terminfo; /* * Information about a term */ typedef struct term_data { term t; /* All term info */ WINDOW *win; /* Pointer to the curses window */ } term_data; /* Max number of windows on screen */ #define MAX_TERM_DATA 4 /* Information about our windows */ static term_data data[MAX_TERM_DATA]; /* Number of initialized "term" structures */ static int active = 0; #define CTRL_ORE 1 #define CTRL_WALL 2 #define CTRL_ROCK 3 static char ctrl_char[32] = { '\0', '*', '#', '%', '?', '?', '?', '\'', '+', '?', '?', '+', '+', '+', '+', '+', '~', '-', '-', '-', '_', '+', '+', '+', '+', '|', '?', '?', '?', '?', '?', '.' }; static int ctrl_attr[32] = { 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 }; #ifdef A_COLOR /* * Hack -- define "A_BRIGHT" to be "A_BOLD", because on many * machines, "A_BRIGHT" produces ugly "inverse" video. */ #ifndef A_BRIGHT # define A_BRIGHT A_BOLD #endif /* * Software flag -- we are allowed to use color */ static int can_use_color = FALSE; /* * Simple Angband to Curses color conversion table */ static int colortable[BASIC_COLORS]; /* Screen info: use one big Term 0, or other subwindows? */ static bool use_big_screen = FALSE; static bool bold_extended = FALSE; /* * Background color we should draw with; either BLACK or DEFAULT */ static int bg_color = COLOR_BLACK; #define PAIR_WHITE 0 #define PAIR_RED 1 #define PAIR_GREEN 2 #define PAIR_YELLOW 3 #define PAIR_BLUE 4 #define PAIR_MAGENTA 5 #define PAIR_CYAN 6 #define PAIR_BLACK 7 #endif /* * Place the "keymap" into its "normal" state */ static void keymap_norm(void) { #ifdef USE_TPOSIX (void)tcsetattr(0, TCSAFLUSH, &norm_termios); #endif } /* * Place the "keymap" into the "game" state */ static void keymap_game(void) { #ifdef USE_TPOSIX /* Set the game's termios settings */ (void)tcsetattr(0, TCSAFLUSH, &game_termios); #endif } /* * Save the normal keymap */ static void keymap_norm_prepare(void) { #ifdef USE_TPOSIX /* Restore the normal termios settings */ tcgetattr(0, &norm_termios); #endif } /* * Save the keymaps (normal and game) */ static void keymap_game_prepare(void) { #ifdef USE_TPOSIX /* Save the current termios settings */ tcgetattr(0, &game_termios); /* Force "Ctrl-C" to interupt */ game_termios.c_cc[VINTR] = (char)3; /* Force "Ctrl-Z" to suspend */ game_termios.c_cc[VSUSP] = (char)26; #ifdef VDSUSP /* Hack -- disable "Ctrl-Y" on *BSD */ game_termios.c_cc[VDSUSP] = (char)-1; #endif /* Disable the standard control characters */ game_termios.c_cc[VQUIT] = (char)-1; game_termios.c_cc[VERASE] = (char)-1; game_termios.c_cc[VKILL] = (char)-1; game_termios.c_cc[VEOF] = (char)-1; game_termios.c_cc[VEOL] = (char)-1; /* Normally, block until a character is read */ game_termios.c_cc[VMIN] = 1; game_termios.c_cc[VTIME] = 0; /* Turn off flow control (enable ^S) */ game_termios.c_iflag &= ~IXON; #endif } /* * Suspend/Resume */ static errr Term_xtra_gcu_alive(int v) { if (!v) { /* Suspend */ int x, y; /* Go to normal keymap mode */ keymap_norm(); /* Restore modes */ nocbreak(); echo(); nl(); /* Hack -- make sure the cursor is visible */ Term_xtra(TERM_XTRA_SHAPE, 1); /* Flush the curses buffer */ refresh(); /* Get current cursor position */ getyx(stdscr, y, x); /* Move the cursor to bottom right corner */ mvcur(y, x, LINES - 1, 0); /* Exit curses */ endwin(); /* Flush the output */ fflush(stdout); } else { /* Resume */ /* Restore the settings */ cbreak(); noecho(); nonl(); /* Go to angband keymap mode */ keymap_game(); } /* Success */ return 0; } const char help_gcu[] = "Text mode, subopts -b(ig screen) -a(scii) -B(old)"; /* * Init the "curses" system */ static void Term_init_gcu(term *t) { term_data *td = (term_data *)(t->data); /* * This is necessary to keep the first call to getch() * from clearing the screen */ wrefresh(stdscr); /* Count init's, handle first */ if (active++ != 0) return; /* Erase the window */ wclear(td->win); /* Reset the cursor */ wmove(td->win, 0, 0); /* Flush changes */ wrefresh(td->win); /* Game keymap */ keymap_game(); } /* * Nuke the "curses" system */ static void Term_nuke_gcu(term *t) { int x, y; term_data *td = (term_data *)(t->data); /* Delete this window */ delwin(td->win); /* Count nuke's, handle last */ if (--active != 0) return; /* Hack -- make sure the cursor is visible */ Term_xtra(TERM_XTRA_SHAPE, 1); #ifdef A_COLOR /* Reset colors to defaults */ start_color(); #endif /* Get current cursor position */ getyx(stdscr, y, x); /* Move the cursor to bottom right corner */ mvcur(y, x, LINES - 1, 0); /* Flush the curses buffer */ refresh(); /* Exit curses */ endwin(); /* Flush the output */ fflush(stdout); /* Normal keymap */ keymap_norm(); } /* * For a given term number (i) set the upper left corner (x, y) and the * correct dimensions. Terminal layout: 0|2 * 1|3 */ void get_gcu_term_size(int i, int *rows, int *cols, int *y, int *x) { if (use_big_screen && i == 0) { *rows = LINES; *cols = COLS; *y = *x = 0; } else if (use_big_screen) { *rows = *cols = *y = *x = 0; } else if (i == 0) { *rows = 24; *cols = 80; *y = *x = 0; } else if (i == 1) { *rows = LINES - 25; *cols = 80; *y = 25; *x = 0; } else if (i == 2) { *rows = 24; *cols = COLS - 81; *y = 0; *x = 81; } else if (i == 3) { *rows = LINES - 25; *cols = COLS - 81; *y = 25; *x = 81; } else { *rows = *cols = *y = *x = 0; } } /* * Query ncurses for new screen size and try to resize the GCU terms. */ void do_gcu_resize(void) { int i, rows, cols, y, x; term *old_t = Term; for (i = 0; i < MAX_TERM_DATA; i++) { /* If we're using a big screen, we only care about Term-0 */ if (use_big_screen && i > 0) break; /* Activate the current Term */ Term_activate(&data[i].t); /* If we can resize the curses window, then resize the Term */ get_gcu_term_size(i, &rows, &cols, &y, &x); if (wresize(data[i].win, rows, cols) == OK) Term_resize(cols, rows); /* Activate the old term */ Term_activate(old_t); } do_cmd_redraw(); } /* * Process events, with optional wait */ static errr Term_xtra_gcu_event(int v) { int i, j, k; if (v) { /* Wait for a keypress; use halfdelay(1) so if the user takes more */ /* than 0.2 seconds we get a chance to do updates. */ halfdelay(2); i = getch(); while (i == ERR) { i = getch(); idle_update(); } cbreak(); } else { /* Do not wait for it */ nodelay(stdscr, TRUE); /* Check for keypresses */ i = getch(); /* Wait for it next time */ nodelay(stdscr, FALSE); /* None ready */ if (i == ERR) return (1); if (i == EOF) return (1); } /* Not sure if this is portable to non-ncurses platforms */ #ifdef USE_NCURSES if (i == KEY_RESIZE) { /* wait until we go one second (10 deci-seconds) before actually * doing the resizing. users often end up triggering multiple * KEY_RESIZE events while changing window size. */ halfdelay(10); do { i = getch(); } while (i == KEY_RESIZE); cbreak(); do_gcu_resize(); if (i == ERR) return (1); } #endif /* uncomment to debug keycode issues */ #if 0 printw("key %d", i); wrefresh(stdscr); #endif /* This might be a bad idea, but... * * Here we try to second-guess ncurses. In some cases, keypad() mode will * fail to translate multi-byte escape sequences into things like number- * pad actions, function keys, etc. So we can hardcode a small list of some * of the most common sequences here, just in case. * * Notice that we turn nodelay() on. This means, that we won't accidentally * interpret sequences as valid unless all the bytes are immediately * available; this seems like an acceptable risk to fix problems associated * with various terminal emulators (I'm looking at you PuTTY). */ if (i == 27) { /* ESC */ nodelay(stdscr, TRUE); j = getch(); switch (j) { case 'O': { k = getch(); switch (k) { /* PuTTY number pad */ case 'q': i = '1'; break; case 'r': i = '2'; break; case 's': i = '3'; break; case 't': i = '4'; break; case 'u': i = '5'; break; case 'v': i = '6'; break; case 'w': i = '7'; break; case 'x': i = '8'; break; case 'y': i = '9'; break; /* no match */ case ERR: break; default: ungetch(k); ungetch(j); } break; } /* no match */ case ERR: break; default: ungetch(j); } nodelay(stdscr, FALSE); } #ifdef KEY_DOWN /* Handle arrow keys */ switch (i) { case KEY_DOWN: i = ARROW_DOWN; break; case KEY_UP: i = ARROW_UP; break; case KEY_LEFT: i = ARROW_LEFT; break; case KEY_RIGHT: i = ARROW_RIGHT; break; /* keypad keys */ case 0xFC: i = '0'; break; case 0xFD: i = '.'; break; case 0xC0: i = '\b'; break; case 0xDF: i = '1'; break; case 0xF5: i = '3'; break; case 0xE9: i = '5'; break; case 0xC1: i = '7'; break; case 0xF4: i = '9'; break; /* try to compensate for inadequate terminfo */ case 263: i = '\b'; break; default: { if (i < KEY_MIN) break; /* Mega-Hack -- Fold, spindle, and mutilate * the keys to fit in 7 bits. */ if (i >= 252) i = KEY_F(63) - (i - 252); if (i >= ARROW_DOWN) i += 4; i = 128 + (i & 127); break; } } #endif /* Enqueue the keypress */ Term_keypress(i, 0); /* Success */ return (0); } int scale_color(int i, int j, int scale) { return (angband_color_table[i][j] * (scale - 1) + 127) / 255; } int create_color(int i, int scale) { int r = scale_color(i, 1, scale); int g = scale_color(i, 2, scale); int b = scale_color(i, 3, scale); int rgb = 16 + scale * scale * r + scale * g + b; /* In the case of white and black we need to use the ANSI colors */ if (r == g && g == b) { if (b == 0) rgb = 0; if (b == scale) rgb = 15; } return rgb; } /* * React to changes */ static errr Term_xtra_gcu_react(void) { #ifdef A_COLOR if (COLORS == 256 || COLORS == 88) { /* If we have more than 16 colors, find the best matches. These numbers * correspond to xterm/rxvt's builtin color numbers--they do not * correspond to curses' constants OR with curses' color pairs. * * XTerm has 216 (6*6*6) RGB colors, with each RGB setting 0-5. * RXVT has 64 (4*4*4) RGB colors, with each RGB setting 0-3. * * Both also have the basic 16 ANSI colors, plus some extra grayscale * colors which we do not use. */ int i; int scale = COLORS == 256 ? 6 : 4; for (i = 0; i < BASIC_COLORS; i++) { int fg = create_color(i, scale); init_pair(i + 1, fg, bg_color); if (bold_extended) colortable[i] = COLOR_PAIR(i + 1) | A_BRIGHT; else colortable[i] = COLOR_PAIR(i + 1); } } #endif return 0; } /* * Handle a "special request" */ static errr Term_xtra_gcu(int n, int v) { term_data *td = (term_data *)(Term->data); /* Analyze the request */ switch (n) { /* Clear screen */ case TERM_XTRA_CLEAR: touchwin(td->win); wclear(td->win); return 0; /* Make a noise */ case TERM_XTRA_NOISE: write(1, "\007", 1); return 0; /* Flush the Curses buffer */ case TERM_XTRA_FRESH: wrefresh(td->win); return 0; #ifdef USE_CURS_SET /* Change the cursor visibility */ case TERM_XTRA_SHAPE: curs_set(v); return 0; #endif /* Suspend/Resume curses */ case TERM_XTRA_ALIVE: return Term_xtra_gcu_alive(v); /* Process events */ case TERM_XTRA_EVENT: return Term_xtra_gcu_event(v); /* Flush events */ case TERM_XTRA_FLUSH: while (!Term_xtra_gcu_event(FALSE)); return 0; /* Delay */ case TERM_XTRA_DELAY: if (v > 0) usleep(1000 * v); return 0; /* React to events */ case TERM_XTRA_REACT: Term_xtra_gcu_react(); return 0; } /* Unknown event */ return 1; } /* * Actually MOVE the hardware cursor */ static errr Term_curs_gcu(int x, int y) { term_data *td = (term_data *)(Term->data); wmove(td->win, y, x); return 0; } /* * Erase a grid of space * Hack -- try to be "semi-efficient". */ static errr Term_wipe_gcu(int x, int y, int n) { term_data *td = (term_data *)(Term->data); wmove(td->win, y, x); if (x + n >= td->t.wid) /* Clear to end of line */ wclrtoeol(td->win); else /* Clear some characters */ whline(td->win, ' ', n); return 0; } /* * Since GCU currently only supports Latin-1 extended chracters, we only * install this hook if we're not using UTF-8. * Given a position in the ISO Latin-1 character set, return the correct * character on this system. Currently */ static byte Term_xchar_gcu(byte c) { return c; } /* Hack - replace non-ASCII characters to * avoid display glitches in selectors. * * Note that we do this after the ACS mapping, * because the display glitches we are avoiding * are in curses itself. */ char filter_char(char c) { if (c < ' ' || c >= 127) return '?'; else return c; } /* * Place some text on the screen using an attribute */ static errr Term_text_gcu(int x, int y, int n, byte a, const char *s) { term_data *td = (term_data *)(Term->data); #ifdef A_COLOR /* Set the color */ if (can_use_color) (void)wattrset(td->win, colortable[a & 255]); #endif /* Move the cursor */ wmove(td->win, y, x); /* Write to screen */ while (n--) { unsigned char c = *(s++); if (c < 32) { wattron(td->win, ctrl_attr[c]); waddch(td->win, filter_char(ctrl_char[c])); wattroff(td->win, ctrl_attr[c]); } else { waddch(td->win, filter_char(c)); } } #if defined(A_COLOR) /* Unset the color */ if (can_use_color) wattrset(td->win, A_NORMAL); #endif /* Success */ return (0); } /* * Create a window for the given "term_data" argument. * * Assumes legal arguments. */ static errr term_data_init_gcu(term_data *td, int rows, int cols, int y, int x) { term *t = &td->t; /* Create new window */ td->win = newwin(rows, cols, y, x); /* Check for failure */ if (!td->win) quit("Failed to setup curses window."); /* Initialize the term */ term_init(t, cols, rows, 256); /* Avoid bottom right corner */ t->icky_corner = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; /* Set some hooks */ t->init_hook = Term_init_gcu; t->nuke_hook = Term_nuke_gcu; /* Set some more hooks */ t->text_hook = Term_text_gcu; t->wipe_hook = Term_wipe_gcu; t->curs_hook = Term_curs_gcu; t->xtra_hook = Term_xtra_gcu; /* only if the locale supports Latin-1 will we enable xchar_hook */ if (setlocale(LC_CTYPE, "")) { /* the Latin-1 codeset is ISO-8859-1 */ if (strcmp(nl_langinfo(CODESET), "ISO-8859-1") == 0) t->xchar_hook = Term_xchar_gcu; } /* Save the data */ t->data = td; /* Activate it */ Term_activate(t); /* Success */ return (0); } static void hook_quit(const char *str) { endwin(); } /* * Prepare "curses" for use by the file "z-term.c" * * Installs the "hook" functions defined above, and then activates * the main screen "term", which clears the screen and such things. * * Someone should really check the semantics of "initscr()" */ errr init_gcu(int argc, char **argv) { int i; int rows, cols, y, x; int next_win = 0; bool graphics = TRUE; /* Initialize info about terminal capabilities */ termtype = getenv("TERM"); loaded_terminfo = termtype && tgetent(0, termtype) == 1; /* Parse args */ for (i = 1; i < argc; i++) { if (prefix(argv[i], "-b")) use_big_screen = TRUE; else if (prefix(argv[i], "-B")) bold_extended = TRUE; else if (prefix(argv[i], "-a")) graphics = FALSE; else plog_fmt("Ignoring option: %s", argv[i]); } if (graphics) { ctrl_char[CTRL_WALL] = ' '; ctrl_attr[CTRL_ORE] = A_REVERSE; ctrl_attr[CTRL_WALL] = A_REVERSE; ctrl_attr[CTRL_ROCK] = A_REVERSE; } /* Extract the normal keymap */ keymap_norm_prepare(); /* We do it like this to prevent a link error with curseses that * lack ESCDELAY. */ if (!getenv("ESCDELAY")) putenv("ESCDELAY=20"); /* Initialize */ if (initscr() == NULL) return (-1); /* Activate hooks */ quit_aux = hook_quit; /* Require standard size screen */ if (LINES < 24 || COLS < 80) quit("Angband needs at least an 80x24 'curses' screen"); #ifdef A_COLOR /* Do we have color, and enough color, available? */ can_use_color = ((start_color() != ERR) && has_colors() && (COLORS >= 8) && (COLOR_PAIRS >= 8)); #ifdef HAVE_USE_DEFAULT_COLORS /* Should we use curses' "default color" */ if (use_default_colors() == OK) bg_color = -1; #endif /* Attempt to use colors */ if (can_use_color) { /* Prepare the color pairs */ /* PAIR_WHITE (pair 0) is *always* WHITE on BLACK */ init_pair(PAIR_RED, COLOR_RED, bg_color); init_pair(PAIR_GREEN, COLOR_GREEN, bg_color); init_pair(PAIR_YELLOW, COLOR_YELLOW, bg_color); init_pair(PAIR_BLUE, COLOR_BLUE, bg_color); init_pair(PAIR_MAGENTA, COLOR_MAGENTA, bg_color); init_pair(PAIR_CYAN, COLOR_CYAN, bg_color); init_pair(PAIR_BLACK, COLOR_BLACK, bg_color); /* Prepare the colors */ colortable[TERM_DARK] = (COLOR_PAIR(PAIR_BLACK)); colortable[TERM_WHITE] = (COLOR_PAIR(PAIR_WHITE) | A_BRIGHT); colortable[TERM_SLATE] = (COLOR_PAIR(PAIR_WHITE)); colortable[TERM_ORANGE] = (COLOR_PAIR(PAIR_YELLOW) | A_BRIGHT); colortable[TERM_RED] = (COLOR_PAIR(PAIR_RED)); colortable[TERM_GREEN] = (COLOR_PAIR(PAIR_GREEN)); colortable[TERM_BLUE] = (COLOR_PAIR(PAIR_BLUE)); colortable[TERM_UMBER] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_L_DARK] = (COLOR_PAIR(PAIR_BLACK) | A_BRIGHT); colortable[TERM_L_WHITE] = (COLOR_PAIR(PAIR_WHITE)); colortable[TERM_L_PURPLE] = (COLOR_PAIR(PAIR_MAGENTA)); colortable[TERM_YELLOW] = (COLOR_PAIR(PAIR_YELLOW) | A_BRIGHT); colortable[TERM_L_RED] = (COLOR_PAIR(PAIR_MAGENTA) | A_BRIGHT); colortable[TERM_L_GREEN] = (COLOR_PAIR(PAIR_GREEN) | A_BRIGHT); colortable[TERM_L_BLUE] = (COLOR_PAIR(PAIR_BLUE) | A_BRIGHT); colortable[TERM_L_UMBER] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_PURPLE] = (COLOR_PAIR(PAIR_MAGENTA)); colortable[TERM_VIOLET] = (COLOR_PAIR(PAIR_MAGENTA)); colortable[TERM_TEAL] = (COLOR_PAIR(PAIR_CYAN)); colortable[TERM_MUD] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_L_YELLOW] = (COLOR_PAIR(PAIR_YELLOW | A_BRIGHT)); colortable[TERM_MAGENTA] = (COLOR_PAIR(PAIR_MAGENTA | A_BRIGHT)); colortable[TERM_L_TEAL] = (COLOR_PAIR(PAIR_CYAN | A_BRIGHT)); colortable[TERM_L_VIOLET] = (COLOR_PAIR(PAIR_MAGENTA | A_BRIGHT)); colortable[TERM_L_PINK] = (COLOR_PAIR(PAIR_MAGENTA | A_BRIGHT)); colortable[TERM_MUSTARD] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_BLUE_SLATE] = (COLOR_PAIR(PAIR_BLUE)); colortable[TERM_DEEP_L_BLUE] = (COLOR_PAIR(PAIR_BLUE)); } #endif /* Paranoia -- Assume no waiting */ nodelay(stdscr, FALSE); /* Prepare */ cbreak(); noecho(); nonl(); /* Tell curses to rewrite escape sequences to KEY_UP and friends */ keypad(stdscr, TRUE); /* Extract the game keymap */ keymap_game_prepare(); /*** Now prepare the term(s) ***/ for (i = 0; i < MAX_TERM_DATA; i++) { if (use_big_screen && i > 0) break; /* Get the terminal dimensions; if the user asked for a big screen * then we'll put the whole screen in term 0; otherwise we'll divide * it amongst the available terms */ get_gcu_term_size(i, &rows, &cols, &y, &x); /* Skip non-existant windows */ if (rows <= 0 || cols <= 0) continue; /* Create a term */ term_data_init_gcu(&data[next_win], rows, cols, y, x); /* Remember the term */ angband_term[next_win] = &data[next_win].t; /* One more window */ next_win++; } /* Activate the "Angband" window screen */ Term_activate(&data[0].t); /* Remember the active screen */ term_screen = &data[0].t; /* Success */ return (0); } #endif /* USE_GCU */ angband-v3.3.2/src/effects.c0000644000175000017500000013136611651552410015173 0ustar chriscchrisc/* * File: effects.c * Purpose: Big switch statement for every effect in the game * * Copyright (c) 2007 Andrew Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "effects.h" #include "monster/mon-spell.h" #include "monster/mon-util.h" #include "trap.h" #include "spells.h" /* * Entries for spell/activation descriptions */ typedef struct { u16b index; /* Effect index */ bool aim; /* Whether the effect requires aiming */ u16b power; /* Power rating for obj-power.c */ const char *desc; /* Effect description */ } info_entry; /* * Useful things about effects. */ static const info_entry effects[] = { #define EFFECT(x, y, r, z) { EF_##x, y, r, z }, #include "list-effects.h" #undef EFFECT }; /* * Utility functions */ bool effect_aim(effect_type effect) { if (effect < 1 || effect > EF_MAX) return FALSE; return effects[effect].aim; } int effect_power(effect_type effect) { if (effect < 1 || effect > EF_MAX) return FALSE; return effects[effect].power; } const char *effect_desc(effect_type effect) { if (effect < 1 || effect > EF_MAX) return FALSE; return effects[effect].desc; } bool effect_obvious(effect_type effect) { if (effect == EF_IDENTIFY) return TRUE; return FALSE; } /* * The "wonder" effect. * * Returns TRUE if the effect is evident. */ bool effect_wonder(int dir, int die, int beam) { /* This spell should become more useful (more controlled) as the player gains experience levels. Thus, add 1/5 of the player's level to the die roll. This eliminates the worst effects later on, while keeping the results quite random. It also allows some potent effects only at high level. */ bool visible = FALSE; int py = p_ptr->py; int px = p_ptr->px; int plev = p_ptr->lev; if (die > 100) { /* above 100 the effect is always visible */ msg("You feel a surge of power!"); visible = TRUE; } if (die < 8) visible = clone_monster(dir); else if (die < 14) visible = speed_monster(dir); else if (die < 26) visible = heal_monster(dir); else if (die < 31) visible = poly_monster(dir); else if (die < 36) visible = fire_bolt_or_beam(beam - 10, GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5), 4)); else if (die < 41) visible = confuse_monster(dir, plev, FALSE); else if (die < 46) visible = fire_ball(GF_POIS, dir, 20 + (plev / 2), 3); else if (die < 51) visible = light_line(dir); else if (die < 56) visible = fire_beam(GF_ELEC, dir, damroll(3+((plev-5)/6), 6)); else if (die < 61) visible = fire_bolt_or_beam(beam-10, GF_COLD, dir, damroll(5+((plev-5)/4), 8)); else if (die < 66) visible = fire_bolt_or_beam(beam, GF_ACID, dir, damroll(6+((plev-5)/4), 8)); else if (die < 71) visible = fire_bolt_or_beam(beam, GF_FIRE, dir, damroll(8+((plev-5)/4), 8)); else if (die < 76) visible = drain_life(dir, 75); else if (die < 81) visible = fire_ball(GF_ELEC, dir, 30 + plev / 2, 2); else if (die < 86) visible = fire_ball(GF_ACID, dir, 40 + plev, 2); else if (die < 91) visible = fire_ball(GF_ICE, dir, 70 + plev, 3); else if (die < 96) visible = fire_ball(GF_FIRE, dir, 80 + plev, 3); /* above 100 'visible' is already true */ else if (die < 101) drain_life(dir, 100 + plev); else if (die < 104) earthquake(py, px, 12); else if (die < 106) destroy_area(py, px, 15, TRUE); else if (die < 108) banishment(); else if (die < 110) dispel_monsters(120); else /* RARE */ { dispel_monsters(150); slow_monsters(); sleep_monsters(TRUE); hp_player(300); } return visible; } /* * Do an effect, given an object. * Boost is the extent to which skill surpasses difficulty, used as % boost. It * ranges from 0 to 138. */ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam, int boost) { int py = p_ptr->py; int px = p_ptr->px; int dam, chance, dur; if (effect < 1 || effect > EF_MAX) { msg("Bad effect passed to do_effect(). Please report this bug."); return FALSE; } switch (effect) { case EF_POISON: { player_inc_timed(p_ptr, TMD_POISONED, damroll(2, 7) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_BLIND: { player_inc_timed(p_ptr, TMD_BLIND, damroll(4, 25) + 75, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_SCARE: { player_inc_timed(p_ptr, TMD_AFRAID, randint0(10) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_CONFUSE: { player_inc_timed(p_ptr, TMD_CONFUSED, damroll(4, 5) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_HALLUC: { player_inc_timed(p_ptr, TMD_IMAGE, randint0(250) + 250, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_PARALYZE: { player_inc_timed(p_ptr, TMD_PARALYZED, randint0(5) + 5, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_SLOW: { if (player_inc_timed(p_ptr, TMD_SLOW, randint1(25) + 15, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_POISON: { if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_BLINDNESS: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_PARANOIA: { if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_CONFUSION: { if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_MIND: { if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_IMAGE, TRUE)) *ident = TRUE; if (!of_has(p_ptr->state.flags, OF_RES_CONFU) && player_inc_timed(p_ptr, TMD_OPP_CONF, damroll(4, 10), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_BODY: { if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_LIGHT: { if (hp_player(20)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_dec_timed(p_ptr, TMD_CUT, 20, TRUE)) *ident = TRUE; if (player_dec_timed(p_ptr, TMD_CONFUSED, 20, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_SERIOUS: { if (hp_player(40)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_CRITICAL: { if (hp_player(60)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_FULL: { int amt = (p_ptr->mhp * 35) / 100; if (amt < 300) amt = 300; if (hp_player(amt)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_FULL2: { if (hp_player(1200)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_TEMP: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL1: { if (hp_player(500)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL2: { if (hp_player(1000)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL3: { if (hp_player(500)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_GAIN_EXP: { if (p_ptr->exp < PY_MAX_EXP) { msg("You feel more experienced."); player_exp_gain(p_ptr, 100000L); *ident = TRUE; } return TRUE; } case EF_LOSE_EXP: { if (!check_state(p_ptr, OF_HOLD_LIFE, p_ptr->state.flags) && (p_ptr->exp > 0)) { msg("You feel your memories fade."); player_exp_lose(p_ptr, p_ptr->exp / 4, FALSE); *ident = TRUE; } *ident = TRUE; wieldeds_notice_flag(p_ptr, OF_HOLD_LIFE); return TRUE; } case EF_RESTORE_EXP: { if (restore_level()) *ident = TRUE; return TRUE; } case EF_RESTORE_MANA: { if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; msg("Your feel your head clear."); p_ptr->redraw |= (PR_MANA); *ident = TRUE; } return TRUE; } case EF_GAIN_STR: case EF_GAIN_INT: case EF_GAIN_WIS: case EF_GAIN_DEX: case EF_GAIN_CON: case EF_GAIN_CHR: { int stat = effect - EF_GAIN_STR; if (do_inc_stat(stat)) *ident = TRUE; return TRUE; } case EF_GAIN_ALL: { if (do_inc_stat(A_STR)) *ident = TRUE; if (do_inc_stat(A_INT)) *ident = TRUE; if (do_inc_stat(A_WIS)) *ident = TRUE; if (do_inc_stat(A_DEX)) *ident = TRUE; if (do_inc_stat(A_CON)) *ident = TRUE; if (do_inc_stat(A_CHR)) *ident = TRUE; return TRUE; } case EF_BRAWN: { /* Pick a random stat to decrease other than strength */ int stat = randint0(A_MAX-1) + 1; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_STR); *ident = TRUE; } return TRUE; } case EF_INTELLECT: { /* Pick a random stat to decrease other than intelligence */ int stat = randint0(A_MAX-1); if (stat >= A_INT) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_INT); *ident = TRUE; } return TRUE; } case EF_CONTEMPLATION: { /* Pick a random stat to decrease other than wisdom */ int stat = randint0(A_MAX-1); if (stat >= A_WIS) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_WIS); *ident = TRUE; } return TRUE; } case EF_TOUGHNESS: { /* Pick a random stat to decrease other than constitution */ int stat = randint0(A_MAX-1); if (stat >= A_CON) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_CON); *ident = TRUE; } return TRUE; } case EF_NIMBLENESS: { /* Pick a random stat to decrease other than dexterity */ int stat = randint0(A_MAX-1); if (stat >= A_DEX) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_DEX); *ident = TRUE; } return TRUE; } case EF_PLEASING: { /* Pick a random stat to decrease other than charisma */ int stat = randint0(A_MAX-1); if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_CHR); *ident = TRUE; } return TRUE; } case EF_LOSE_STR: case EF_LOSE_INT: case EF_LOSE_WIS: case EF_LOSE_DEX: case EF_LOSE_CON: case EF_LOSE_CHR: { int stat = effect - EF_LOSE_STR; take_hit(p_ptr, damroll(5, 5), "stat drain"); (void)do_dec_stat(stat, FALSE); *ident = TRUE; return TRUE; } case EF_LOSE_CON2: { take_hit(p_ptr, damroll(10, 10), "poisonous food"); (void)do_dec_stat(A_CON, FALSE); *ident = TRUE; return TRUE; } case EF_RESTORE_STR: case EF_RESTORE_INT: case EF_RESTORE_WIS: case EF_RESTORE_DEX: case EF_RESTORE_CON: case EF_RESTORE_CHR: { int stat = effect - EF_RESTORE_STR; if (do_res_stat(stat)) *ident = TRUE; return TRUE; } case EF_CURE_NONORLYBIG: { msg("You feel life flow through your body!"); restore_level(); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_IMAGE, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; /* Recalculate max. hitpoints */ update_stuff(p_ptr); hp_player(5000); *ident = TRUE; return TRUE; } case EF_RESTORE_ALL: { /* Life, above, also gives these effects */ if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; return TRUE; } case EF_RESTORE_ST_LEV: { if (restore_level()) *ident = TRUE; if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (do_res_stat(A_CHR)) *ident = TRUE; return TRUE; } case EF_TMD_INFRA: { if (player_inc_timed(p_ptr, TMD_SINFRA, 100 + damroll(4, 25), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_TMD_SINVIS: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_SINVIS, 12 + damroll(2, 6), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_TMD_ESP: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_TELEPATHY, 12 + damroll(6, 6), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_ENLIGHTENMENT: { msg("An image of your surroundings forms in your mind..."); wiz_light(); *ident = TRUE; return TRUE; } case EF_ENLIGHTENMENT2: { msg("You begin to feel more enlightened..."); message_flush(); wiz_light(); (void)do_inc_stat(A_INT); (void)do_inc_stat(A_WIS); (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); (void)detect_treasure(TRUE); identify_pack(); *ident = TRUE; return TRUE; } case EF_HERO: { dur = randint1(25) + 25; if (hp_player(10)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_HERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SHERO: { dur = randint1(25) + 25; if (hp_player(30)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_SHERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ACID: { if (player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ELEC: { if (player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_FIRE: { if (player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_COLD: { if (player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_POIS: { if (player_inc_timed(p_ptr, TMD_OPP_POIS, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ALL: { if (player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_POIS, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_DETECT_TREASURE: { if (detect_treasure(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_TRAP: { if (detect_traps(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_DOORSTAIR: { if (detect_doorstairs(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_INVIS: { if (detect_monsters_invis(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_EVIL: { if (detect_monsters_evil(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_ALL: { if (detect_all(aware)) *ident = TRUE; return TRUE; } case EF_ENCHANT_TOHIT: { *ident = TRUE; return enchant_spell(1, 0, 0); } case EF_ENCHANT_TODAM: { *ident = TRUE; return enchant_spell(0, 1, 0); } case EF_ENCHANT_WEAPON: { *ident = TRUE; return enchant_spell(randint1(3), randint1(3), 0); } case EF_ENCHANT_ARMOR: { *ident = TRUE; return enchant_spell(0, 0, 1); } case EF_ENCHANT_ARMOR2: { *ident = TRUE; return enchant_spell(0, 0, randint1(3) + 2); } case EF_RESTORE_ITEM: { *ident = TRUE; return restore_item(); } case EF_IDENTIFY: { *ident = TRUE; if (!ident_spell()) return FALSE; return TRUE; } case EF_REMOVE_CURSE: { if (remove_curse()) { if (!p_ptr->timed[TMD_BLIND]) msg("The air around your body glows blue for a moment..."); else msg("You feel as if someone is watching over you."); *ident = TRUE; } return TRUE; } case EF_REMOVE_CURSE2: { remove_all_curse(); *ident = TRUE; return TRUE; } case EF_LIGHT: { if (light_area(damroll(2, 8), 2)) *ident = TRUE; return TRUE; } case EF_SUMMON_MON: { int i; sound(MSG_SUM_MONSTER); for (i = 0; i < randint1(3); i++) { if (summon_specific(py, px, p_ptr->depth, 0, 1)) *ident = TRUE; } return TRUE; } case EF_SUMMON_UNDEAD: { int i; sound(MSG_SUM_UNDEAD); for (i = 0; i < randint1(3); i++) { if (summon_specific(py, px, p_ptr->depth, S_UNDEAD, 1)) *ident = TRUE; } return TRUE; } case EF_TELE_PHASE: { teleport_player(10); *ident = TRUE; return TRUE; } case EF_TELE_LONG: { teleport_player(100); *ident = TRUE; return TRUE; } case EF_TELE_LEVEL: { (void)teleport_player_level(); *ident = TRUE; return TRUE; } case EF_CONFUSING: { if (p_ptr->confusing == 0) { msg("Your hands begin to glow."); p_ptr->confusing = TRUE; *ident = TRUE; } return TRUE; } case EF_MAPPING: { map_area(); *ident = TRUE; return TRUE; } case EF_RUNE: { warding_glyph(); *ident = TRUE; return TRUE; } case EF_ACQUIRE: { acquirement(py, px, p_ptr->depth, 1, TRUE); *ident = TRUE; return TRUE; } case EF_ACQUIRE2: { acquirement(py, px, p_ptr->depth, randint1(2) + 1, TRUE); *ident = TRUE; return TRUE; } case EF_ANNOY_MON: { msg("There is a high pitched humming noise."); aggravate_monsters(0); *ident = TRUE; return TRUE; } case EF_CREATE_TRAP: { /* Hack -- no traps in the town */ if (p_ptr->depth == 0) return TRUE; trap_creation(); msg("You hear a low-pitched whistling sound."); *ident = TRUE; return TRUE; } case EF_DESTROY_TDOORS: { if (destroy_doors_touch()) *ident = TRUE; return TRUE; } case EF_RECHARGE: { *ident = TRUE; if (!recharge(60)) return FALSE; return TRUE; } case EF_BANISHMENT: { *ident = TRUE; if (!banishment()) return FALSE; return TRUE; } case EF_DARKNESS: { if (!check_state(p_ptr, OF_RES_DARK, p_ptr->state.flags)) (void)player_inc_timed(p_ptr, TMD_BLIND, 3 + randint1(5), TRUE, TRUE); unlight_area(10, 3); wieldeds_notice_flag(p_ptr, OF_RES_DARK); *ident = TRUE; return TRUE; } case EF_PROTEVIL: { if (player_inc_timed(p_ptr, TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SATISFY: { if (player_set_food(p_ptr, PY_FOOD_MAX - 1)) *ident = TRUE; return TRUE; } case EF_CURSE_WEAPON: { if (curse_weapon()) *ident = TRUE; return TRUE; } case EF_CURSE_ARMOR: { if (curse_armor()) *ident = TRUE; return TRUE; } case EF_BLESSING: { if (player_inc_timed(p_ptr, TMD_BLESSED, randint1(12) + 6, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_BLESSING2: { if (player_inc_timed(p_ptr, TMD_BLESSED, randint1(24) + 12, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_BLESSING3: { if (player_inc_timed(p_ptr, TMD_BLESSED, randint1(48) + 24, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RECALL: { set_recall(); *ident = TRUE; return TRUE; } case EF_DEEP_DESCENT: { int i, target_depth = p_ptr->depth; /* Calculate target depth */ for (i = 2; i > 0; i--) { if (is_quest(target_depth)) break; if (target_depth >= MAX_DEPTH - 1) break; target_depth++; } if (target_depth > p_ptr->depth) { msgt(MSG_TPLEVEL, "You sink through the floor..."); dungeon_change_level(target_depth); *ident = TRUE; return TRUE; } else { msgt(MSG_TPLEVEL, "You sense a malevolent presence blocking passage to the levels below."); *ident = TRUE; return FALSE; } } case EF_LOSHASTE: { if (speed_monsters()) *ident = TRUE; return TRUE; } case EF_LOSSLEEP: { if (sleep_monsters(aware)) *ident = TRUE; return TRUE; } case EF_LOSSLOW: { if (slow_monsters()) *ident = TRUE; return TRUE; } case EF_LOSCONF: { if (confuse_monsters(aware)) *ident = TRUE; return TRUE; } case EF_LOSKILL: { (void)mass_banishment(); *ident = TRUE; return TRUE; } case EF_EARTHQUAKES: { earthquake(py, px, 10); *ident = TRUE; return TRUE; } case EF_DESTRUCTION2: { destroy_area(py, px, 15, TRUE); *ident = TRUE; return TRUE; } case EF_ILLUMINATION: { if (light_area(damroll(2, 15), 3)) *ident = TRUE; return TRUE; } case EF_CLAIRVOYANCE: { *ident = TRUE; wiz_light(); (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); return TRUE; } case EF_PROBING: { *ident = probing(); return TRUE; } case EF_STONE_TO_MUD: { if (wall_to_mud(dir)) *ident = TRUE; return TRUE; } case EF_CONFUSE2: { *ident = TRUE; confuse_monster(dir, 20, aware); return TRUE; } case EF_BIZARRE: { *ident = TRUE; ring_of_power(dir); return TRUE; } case EF_STAR_BALL: { int i; *ident = TRUE; for (i = 0; i < 8; i++) fire_ball(GF_ELEC, ddd[i], (150 * (100 + boost) / 100), 3); return TRUE; } case EF_RAGE_BLESS_RESIST: { dur = randint1(50) + 50; *ident = TRUE; (void)hp_player(30); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_SHERO, dur, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_BLESSED, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_POIS, randint1(50) + 50, TRUE, TRUE); return TRUE; } case EF_SLEEPII: { *ident = TRUE; sleep_monsters_touch(aware); return TRUE; } case EF_RESTORE_LIFE: { *ident = TRUE; restore_level(); return TRUE; } case EF_MISSILE: { *ident = TRUE; dam = damroll(3, 4) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_MISSILE, dir, dam); return TRUE; } case EF_DISPEL_EVIL: { *ident = TRUE; dam = p_ptr->lev * 5 * (100 + boost) / 100; dispel_evil(dam); return TRUE; } case EF_DISPEL_EVIL60: { dam = 60 * (100 + boost) / 100; if (dispel_evil(dam)) *ident = TRUE; return TRUE; } case EF_DISPEL_UNDEAD: { dam = 60 * (100 + boost) / 100; if (dispel_undead(dam)) *ident = TRUE; return TRUE; } case EF_DISPEL_ALL: { dam = 120 * (100 + boost) / 100; if (dispel_monsters(dam)) *ident = TRUE; return TRUE; } case EF_HASTE: { if (!p_ptr->timed[TMD_FAST]) { if (player_set_timed(p_ptr, TMD_FAST, damroll(2, 10) + 20, TRUE)) *ident = TRUE; } else { (void)player_inc_timed(p_ptr, TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_HASTE1: { if (!p_ptr->timed[TMD_FAST]) { if (player_set_timed(p_ptr, TMD_FAST, randint1(20) + 20, TRUE)) *ident = TRUE; } else { (void)player_inc_timed(p_ptr, TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_HASTE2: { if (!p_ptr->timed[TMD_FAST]) { if (player_set_timed(p_ptr, TMD_FAST, randint1(75) + 75, TRUE)) *ident = TRUE; } else { (void)player_inc_timed(p_ptr, TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_FIRE_BOLT: { *ident = TRUE; dam = damroll(9, 8) * (100 + boost) / 100; fire_bolt(GF_FIRE, dir, dam); return TRUE; } case EF_FIRE_BOLT2: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_FIRE, dir, dam); *ident = TRUE; return TRUE; } case EF_FIRE_BOLT3: { dam = damroll(16, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_FIRE, dir, dam); *ident = TRUE; return TRUE; } case EF_FIRE_BOLT72: { dam = 72 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 2); return TRUE; } case EF_FIRE_BALL: { dam = 144 * (100 + boost) / 100; fire_ball(GF_FIRE, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_FIRE_BALL2: { dam = 120 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 3); return TRUE; } case EF_FIRE_BALL200: { dam = 200 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 3); return TRUE; } case EF_COLD_BOLT: { dam = damroll(6, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt_or_beam(beam, GF_COLD, dir, dam); return TRUE; } case EF_COLD_BOLT2: { dam = damroll(12, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_COLD, dir, dam); return TRUE; } case EF_COLD_BALL2: { dam = 200 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 3); return TRUE; } case EF_COLD_BALL50: { dam = 50 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); return TRUE; } case EF_COLD_BALL100: { dam = 100 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); return TRUE; } case EF_COLD_BALL160: { dam = 160 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 3); return TRUE; } case EF_ACID_BOLT: { dam = damroll(5, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_ACID, dir, dam); return TRUE; } case EF_ACID_BOLT2: { dam = damroll(10, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_ACID, dir, dam); *ident = TRUE; return TRUE; } case EF_ACID_BOLT3: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_ACID, dir, dam); *ident = TRUE; return TRUE; } case EF_ACID_BALL: { dam = 120 * (100 + boost) / 100; fire_ball(GF_ACID, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_ELEC_BOLT: { dam = damroll(6, 6) * (100 + boost) / 100; *ident = TRUE; fire_beam(GF_ELEC, dir, dam); return TRUE; } case EF_ELEC_BALL: { dam = 64 * (100 + boost) / 100; fire_ball(GF_ELEC, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_ELEC_BALL2: { dam = 250 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ELEC, dir, dam, 3); return TRUE; } case EF_ARROW: { dam = 150 * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_ARROW, dir, dam); return TRUE; } case EF_REM_FEAR_POIS: { *ident = TRUE; (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); return TRUE; } case EF_STINKING_CLOUD: { dam = 12 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_POIS, dir, dam, 3); return TRUE; } case EF_DRAIN_LIFE1: { dam = 90 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE2: { dam = 120 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE3: { dam = 150 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE4: { dam = 250 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_FIREBRAND: { *ident = TRUE; if (!brand_bolts()) return FALSE; return TRUE; } case EF_MANA_BOLT: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt(GF_MANA, dir, dam); *ident = TRUE; return TRUE; } case EF_MON_HEAL: { if (heal_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_HASTE: { if (speed_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_SLOW: { if (slow_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_CONFUSE: { if (confuse_monster(dir, 10, aware)) *ident = TRUE; return TRUE; } case EF_MON_SLEEP: { if (sleep_monster(dir, aware)) *ident = TRUE; return TRUE; } case EF_MON_CLONE: { if (clone_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_SCARE: { if (fear_monster(dir, 10, aware)) *ident = TRUE; return TRUE; } case EF_LIGHT_LINE: { msg("A line of shimmering blue light appears."); light_line(dir); *ident = TRUE; return TRUE; } case EF_TELE_OTHER: { if (teleport_monster(dir)) *ident = TRUE; return TRUE; } case EF_DISARMING: { if (disarm_trap(dir)) *ident = TRUE; return TRUE; } case EF_TDOOR_DEST: { if (destroy_door(dir)) *ident = TRUE; return TRUE; } case EF_POLYMORPH: { if (poly_monster(dir)) *ident = TRUE; return TRUE; } case EF_STARLIGHT: { int i; if (!p_ptr->timed[TMD_BLIND]) msg("Light shoots in all directions!"); for (i = 0; i < 8; i++) light_line(ddd[i]); *ident = TRUE; return TRUE; } case EF_STARLIGHT2: { int k; for (k = 0; k < 8; k++) strong_light_line(ddd[k]); *ident = TRUE; return TRUE; } case EF_BERSERKER: { dur = randint1(50) + 50; if (player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_SHERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_WONDER: { if (effect_wonder(dir, randint1(100) + p_ptr->lev / 5, beam)) *ident = TRUE; return TRUE; } case EF_WAND_BREATH: { /* table of random ball effects and their damages */ const int breath_types[] = { GF_ACID, 200, GF_ELEC, 160, GF_FIRE, 200, GF_COLD, 160, GF_POIS, 120 }; /* pick a random (type, damage) tuple in the table */ int which = 2 * randint0(sizeof(breath_types) / (2 * sizeof(int))); fire_ball(breath_types[which], dir, breath_types[which + 1], 3); *ident = TRUE; return TRUE; } case EF_STAFF_MAGI: { if (do_res_stat(A_INT)) *ident = TRUE; if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; *ident = TRUE; msg("Your feel your head clear."); p_ptr->redraw |= (PR_MANA); } return TRUE; } case EF_STAFF_HOLY: { dam = 120 * (100 + boost) / 100; if (dispel_evil(dam)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (hp_player(50)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_DRINK_BREATH: { const int breath_types[] = { GF_FIRE, 80, GF_COLD, 80, }; int which = 2 * randint0(N_ELEMENTS(breath_types) / 2); fire_ball(breath_types[which], dir, breath_types[which + 1], 2); *ident = TRUE; return TRUE; } case EF_DRINK_GOOD: { msg("You feel less thirsty."); *ident = TRUE; return TRUE; } case EF_DRINK_DEATH: { msg("A feeling of Death flows through your body."); take_hit(p_ptr, 5000, "a potion of Death"); *ident = TRUE; return TRUE; } case EF_DRINK_RUIN: { msg("Your nerves and muscles feel weak and lifeless!"); take_hit(p_ptr, damroll(10, 10), "a potion of Ruination"); player_stat_dec(p_ptr, A_DEX, TRUE); player_stat_dec(p_ptr, A_WIS, TRUE); player_stat_dec(p_ptr, A_CON, TRUE); player_stat_dec(p_ptr, A_STR, TRUE); player_stat_dec(p_ptr, A_CHR, TRUE); player_stat_dec(p_ptr, A_INT, TRUE); *ident = TRUE; return TRUE; } case EF_DRINK_DETONATE: { msg("Massive explosions rupture your body!"); take_hit(p_ptr, damroll(50, 20), "a potion of Detonation"); (void)player_inc_timed(p_ptr, TMD_STUN, 75, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_CUT, 5000, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_DRINK_SALT: { msg("The potion makes you vomit!"); player_set_food(p_ptr, PY_FOOD_STARVE - 1); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_inc_timed(p_ptr, TMD_PARALYZED, 4, TRUE, FALSE); *ident = TRUE; return TRUE; } case EF_FOOD_GOOD: { msg("That tastes good."); *ident = TRUE; return TRUE; } case EF_FOOD_WAYBREAD: { msg("That tastes good."); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)hp_player(damroll(4, 8)); *ident = TRUE; return TRUE; } case EF_SHROOM_EMERGENCY: { (void)player_set_timed(p_ptr, TMD_IMAGE, rand_spread(250, 50), TRUE); (void)player_set_timed(p_ptr, TMD_OPP_FIRE, rand_spread(30, 10), TRUE); (void)player_set_timed(p_ptr, TMD_OPP_COLD, rand_spread(30, 10), TRUE); (void)hp_player(200); *ident = TRUE; return TRUE; } case EF_SHROOM_TERROR: { if (player_set_timed(p_ptr, TMD_TERROR, rand_spread(100, 20), TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_STONE: { if (player_set_timed(p_ptr, TMD_STONESKIN, rand_spread(80, 20), TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_DEBILITY: { int stat = one_in_(2) ? A_STR : A_CON; if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; msg("Your feel your head clear."); p_ptr->redraw |= (PR_MANA); *ident = TRUE; } (void)do_dec_stat(stat, FALSE); *ident = TRUE; return TRUE; } case EF_SHROOM_SPRINTING: { if (player_inc_timed(p_ptr, TMD_SPRINT, 100, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_PURGING: { player_set_food(p_ptr, PY_FOOD_FAINT - 1); if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; return TRUE; } case EF_RING_ACID: { dam = 70 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ACID, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_FLAMES: { dam = 80 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_ICE: { dam = 75 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_LIGHTNING: { dam = 85 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ELEC, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_DRAGON_BLUE: { dam = 100 * (100 + boost) / 100; msgt(MSG_BR_ELEC, "You breathe lightning."); fire_ball(GF_ELEC, dir, dam, 2); return TRUE; } case EF_DRAGON_GREEN: { dam = 150 * (100 + boost) / 100; msgt(MSG_BR_GAS, "You breathe poison gas."); fire_ball(GF_POIS, dir, dam, 2); return TRUE; } case EF_DRAGON_RED: { dam = 200 * (100 + boost) / 100; msgt(MSG_BR_FIRE, "You breathe fire."); fire_ball(GF_FIRE, dir, dam, 2); return TRUE; } case EF_DRAGON_MULTIHUED: { static const struct { int msg_sound; const char *msg; int typ; } mh[] = { { MSG_BR_ELEC, "lightning", GF_ELEC }, { MSG_BR_FROST, "frost", GF_COLD }, { MSG_BR_ACID, "acid", GF_ACID }, { MSG_BR_GAS, "poison gas", GF_POIS }, { MSG_BR_FIRE, "fire", GF_FIRE } }; int chance = randint0(5); dam = 250 * (100 + boost) / 100; msgt(mh[chance].msg_sound, "You breathe %s.", mh[chance].msg); fire_ball(mh[chance].typ, dir, dam, 2); return TRUE; } case EF_DRAGON_BRONZE: { dam = 120 * (100 + boost) / 100; msgt(MSG_BR_CONF, "You breathe confusion."); fire_ball(GF_CONFU, dir, dam, 2); return TRUE; } case EF_DRAGON_GOLD: { dam = 130 * (100 + boost) / 100; msgt(MSG_BR_SOUND, "You breathe sound."); fire_ball(GF_SOUND, dir, dam, 2); return TRUE; } case EF_DRAGON_CHAOS: { dam = 220 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 1 ? MSG_BR_CHAOS : MSG_BR_DISEN), "You breathe %s.", ((chance == 1 ? "chaos" : "disenchantment"))); fire_ball((chance == 1 ? GF_CHAOS : GF_DISEN), dir, dam, 2); return TRUE; } case EF_DRAGON_LAW: { dam = 230 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 1 ? MSG_BR_SOUND : MSG_BR_SHARDS), "You breathe %s.", ((chance == 1 ? "sound" : "shards"))); fire_ball((chance == 1 ? GF_SOUND : GF_SHARD), dir, dam, 2); return TRUE; } case EF_DRAGON_BALANCE: { dam = 250 * (100 + boost) / 100; chance = randint0(4); msg("You breathe %s.", ((chance == 1) ? "chaos" : ((chance == 2) ? "disenchantment" : ((chance == 3) ? "sound" : "shards")))); fire_ball(((chance == 1) ? GF_CHAOS : ((chance == 2) ? GF_DISEN : ((chance == 3) ? GF_SOUND : GF_SHARD))), dir, dam, 2); return TRUE; } case EF_DRAGON_SHINING: { dam = 200 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 0 ? MSG_BR_LIGHT : MSG_BR_DARK), "You breathe %s.", ((chance == 0 ? "light" : "darkness"))); fire_ball((chance == 0 ? GF_LIGHT : GF_DARK), dir, dam, 2); return TRUE; } case EF_DRAGON_POWER: { dam = 300 * (100 + boost) / 100; msgt(MSG_BR_ELEMENTS, "You breathe the elements."); fire_ball(GF_MISSILE, dir, dam, 2); return TRUE; } case EF_TRAP_DOOR: { msg("You fall through a trap door!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently down to the next level."); } else { take_hit(p_ptr, damroll(2, 8), "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); dungeon_change_level(p_ptr->depth + 1); return TRUE; } case EF_TRAP_PIT: { msg("You fall into a pit!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the bottom of the pit."); } else { take_hit(p_ptr, damroll(2, 6), "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); return TRUE; } case EF_TRAP_PIT_SPIKES: { msg("You fall into a spiked pit!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the floor of the pit."); msg("You carefully avoid touching the spikes."); } else { int dam = damroll(2, 6); /* Extra spike damage */ if (one_in_(2)) { msg("You are impaled!"); dam *= 2; (void)player_inc_timed(p_ptr, TMD_CUT, randint1(dam), TRUE, TRUE); } take_hit(p_ptr, dam, "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); return TRUE; } case EF_TRAP_PIT_POISON: { msg("You fall into a spiked pit!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the floor of the pit."); msg("You carefully avoid touching the spikes."); } else { int dam = damroll(2, 6); /* Extra spike damage */ if (one_in_(2)) { msg("You are impaled on poisonous spikes!"); (void)player_inc_timed(p_ptr, TMD_CUT, randint1(dam * 2), TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_POISONED, randint1(dam * 4), TRUE, TRUE); } take_hit(p_ptr, dam, "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); return TRUE; } case EF_TRAP_RUNE_SUMMON: { int i; int num = 2 + randint1(3); msgt(MSG_SUM_MONSTER, "You are enveloped in a cloud of smoke!"); /* Remove trap */ cave->info[py][px] &= ~(CAVE_MARK); cave_set_feat(cave, py, px, FEAT_FLOOR); for (i = 0; i < num; i++) (void)summon_specific(py, px, p_ptr->depth, 0, 1); return TRUE; } case EF_TRAP_RUNE_TELEPORT: { msg("You hit a teleport trap!"); teleport_player(100); return TRUE; } case EF_TRAP_SPOT_FIRE: { int dam; msg("You are enveloped in flames!"); dam = damroll(4, 6); dam = adjust_dam(p_ptr, GF_FIRE, dam, RANDOMISE, check_for_resist(p_ptr, GF_FIRE, p_ptr->state.flags, TRUE)); if (dam) { take_hit(p_ptr, dam, "a fire trap"); inven_damage(p_ptr, GF_FIRE, MIN(dam * 5, 300)); } return TRUE; } case EF_TRAP_SPOT_ACID: { int dam; msg("You are splashed with acid!"); dam = damroll(4, 6); dam = adjust_dam(p_ptr, GF_ACID, dam, RANDOMISE, check_for_resist(p_ptr, GF_ACID, p_ptr->state.flags, TRUE)); if (dam) { take_hit(p_ptr, dam, "an acid trap"); inven_damage(p_ptr, GF_ACID, MIN(dam * 5, 300)); } return TRUE; } case EF_TRAP_DART_SLOW: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)player_inc_timed(p_ptr, TMD_SLOW, randint0(20) + 20, TRUE, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_STR: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)do_dec_stat(A_STR, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_DEX: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)do_dec_stat(A_DEX, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_CON: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)do_dec_stat(A_CON, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_GAS_BLIND: { msg("You are surrounded by a black gas!"); (void)player_inc_timed(p_ptr, TMD_BLIND, randint0(50) + 25, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_CONFUSE: { msg("You are surrounded by a gas of scintillating colors!"); (void)player_inc_timed(p_ptr, TMD_CONFUSED, randint0(20) + 10, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_POISON: { msg("You are surrounded by a pungent green gas!"); (void)player_inc_timed(p_ptr, TMD_POISONED, randint0(20) + 10, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_SLEEP: { msg("You are surrounded by a strange white mist!"); (void)player_inc_timed(p_ptr, TMD_PARALYZED, randint0(10) + 5, TRUE, TRUE); return TRUE; } case EF_XXX: case EF_MAX: break; } /* Not used */ msg("Effect not handled."); return FALSE; } angband-v3.3.2/src/parser.c0000644000175000017500000003525411651552410015047 0ustar chriscchrisc/* * File: parser.c * Purpose: Info file parser. * * Copyright (c) 2011 Elly * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ /** * A parser has a list of hooks (which are run across new lines given to * parser_parse()) and a list of the set of named values for the current line. * Each hook has a list of specs, which are essentially named formal parameters; * when we run a particular hook across a line, each spec in the hook is * assigned a value. */ #include "externs.h" #include "parser.h" #include "z-file.h" #include "z-form.h" #include "z-util.h" #include "z-virt.h" const char *parser_error_str[PARSE_ERROR_MAX] = { "(none)", "generic error", "invalid flag", "invalid item number", "invalid spell frequency", "invalid value", "invalid colour", "invalid effect", "invalid option", "missing field", "missing record header", "field too long", "non-sequential records", "not a number", "not random", "obsolete file", "out of bounds", "out of memory", "too few entries", "too many entries", "undefined directive", "unrecognized blow", "unrecognized tval", "unrecognized sval", "vault too big", "internal error", }; enum { PARSE_T_NONE = 0, PARSE_T_INT = 2, PARSE_T_SYM = 4, PARSE_T_STR = 6, PARSE_T_RAND = 8, PARSE_T_UINT = 10, PARSE_T_CHAR = 12, PARSE_T_OPT = 0x00000001 }; struct parser_spec { struct parser_spec *next; int type; const char *name; }; struct parser_value { struct parser_spec spec; union { char cval; int ival; unsigned int uval; char *sval; random_value rval; } u; }; struct parser_hook { struct parser_hook *next; enum parser_error (*func)(struct parser *p); char *dir; struct parser_spec *fhead; struct parser_spec *ftail; }; struct parser { enum parser_error error; unsigned int lineno; unsigned int colno; char errmsg[1024]; struct parser_hook *hooks; struct parser_value *fhead; struct parser_value *ftail; void *priv; }; struct parser *parser_new(void) { struct parser *p = mem_zalloc(sizeof *p); return p; } static struct parser_hook *findhook(struct parser *p, const char *dir) { struct parser_hook *h = p->hooks; while (h) { if (!strcmp(h->dir, dir)) break; h = h->next; } return h; } static void parser_freeold(struct parser *p) { struct parser_value *v; while (p->fhead) { int t = p->fhead->spec.type & ~PARSE_T_OPT; v = (struct parser_value *)p->fhead->spec.next; if (t == PARSE_T_SYM || t == PARSE_T_STR) mem_free(p->fhead->u.sval); mem_free(p->fhead); p->fhead = v; } } static bool parse_random(const char *str, random_value *bonus) { bool negative = FALSE; char buffer[50]; int i = 0, b, dn, ds, mb; const char end_chr = '|'; char eov; /* Entire value may be negated */ if (str[0] == '-') { negative = TRUE; i++; } /* Make a working copy of the string */ my_strcpy(buffer, &str[i], N_ELEMENTS(buffer) - 2); /* Check for invalid negative numbers */ if (NULL != strstr(buffer, "-")) return FALSE; /* * Add a sentinal value at the end of the string. * Used by scanf to make sure there's no text after the final conversion. */ buffer[strlen(buffer) + 1] = '\0'; buffer[strlen(buffer)] = end_chr; /* Scan the value, apply defaults for unspecified components */ if (5 == sscanf(buffer, "%d+%dd%dM%d%c", &b, &dn, &ds, &mb, &eov) && eov == end_chr) { /* No defaults */ } else if (4 == sscanf(buffer, "%d+d%dM%d%c", &b, &ds, &mb, &eov) && eov == end_chr) { dn = 1; } else if (3 == sscanf(buffer, "%d+M%d%c", &b, &mb, &eov) && eov == end_chr) { dn = 0; ds = 0; } else if (4 == sscanf(buffer, "%d+%dd%d%c", &b, &dn, &ds, &eov) && eov == end_chr) { mb = 0; } else if (3 == sscanf(buffer, "%d+d%d%c", &b, &ds, &eov) && eov == end_chr) { dn = 1; mb = 0; } else if (4 == sscanf(buffer, "%dd%dM%d%c", &dn, &ds, &mb, &eov) && eov == end_chr) { b = 0; } else if (3 == sscanf(buffer, "d%dM%d%c", &ds, &mb, &eov) && eov == end_chr) { b = 0; dn = 1; } else if (2 == sscanf(buffer, "M%d%c", &mb, &eov) && eov == end_chr) { b = 0; dn = 0; ds = 0; } else if (3 == sscanf(buffer, "%dd%d%c", &dn, &ds, &eov) && eov == end_chr) { b = 0; mb = 0; } else if (2 == sscanf(buffer, "d%d%c", &ds, &eov) && eov == end_chr) { b = 0; dn = 1; mb = 0; } else if (2 == sscanf(buffer, "%d%c", &b, &eov) && eov == end_chr) { dn = 0; ds = 0; mb = 0; } else { return FALSE; } /* Assign the values */ bonus->base = b; bonus->dice = dn; bonus->sides = ds; bonus->m_bonus = mb; /* * Handle negation (the random components are always positive, so the base * must be adjusted as necessary). */ if (negative) { bonus->base *= -1; bonus->base -= bonus->m_bonus; bonus->base -= bonus->dice * (bonus->sides + 1); } return TRUE; } /* This is a bit long and should probably be refactored a bit. */ enum parser_error parser_parse(struct parser *p, const char *line) { char *cline; char *tok; struct parser_hook *h; struct parser_spec *s; struct parser_value *v; char *sp = NULL; assert(p); assert(line); parser_freeold(p); p->lineno++; p->colno = 1; p->fhead = NULL; p->ftail = NULL; /* Ignore empty lines and comments. */ while (*line && (isspace(*line))) line++; if (!*line || *line == '#') return PARSE_ERROR_NONE; cline = string_make(line); tok = strtok(cline, ":"); if (!tok) { mem_free(cline); p->error = PARSE_ERROR_MISSING_FIELD; return PARSE_ERROR_MISSING_FIELD; } h = findhook(p, tok); if (!h) { my_strcpy(p->errmsg, tok, sizeof(p->errmsg)); p->error = PARSE_ERROR_UNDEFINED_DIRECTIVE; mem_free(cline); return PARSE_ERROR_UNDEFINED_DIRECTIVE; } /* There's a little bit of trickiness here to account for optional * types. The optional flag has a bit assigned to it in the spec's type * tag; we compute a temporary type for the spec with that flag removed * and use that instead. */ for (s = h->fhead; s; s = s->next) { int t = s->type & ~PARSE_T_OPT; p->colno++; /* These types are tokenized on ':'; strings are not tokenized * at all (i.e., they consume the remainder of the line) */ if (t == PARSE_T_INT || t == PARSE_T_SYM || t == PARSE_T_RAND || t == PARSE_T_UINT) { tok = strtok(sp, ":"); sp = NULL; } else if (t == PARSE_T_CHAR) { tok = strtok(sp, ""); if (tok) sp = tok + 2; } else { tok = strtok(sp, ""); sp = NULL; } if (!tok) { if (!(s->type & PARSE_T_OPT)) { my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_MISSING_FIELD; mem_free(cline); return PARSE_ERROR_MISSING_FIELD; } break; } /* Allocate a value node, parse out its value, and link it into * the value list. */ v = mem_alloc(sizeof *v); v->spec.next = NULL; v->spec.type = s->type; v->spec.name = s->name; if (t == PARSE_T_INT) { char *z = NULL; v->u.ival = strtol(tok, &z, 0); if (z == tok) { mem_free(v); mem_free(cline); my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_NOT_NUMBER; return PARSE_ERROR_NOT_NUMBER; } } else if (t == PARSE_T_UINT) { char *z = NULL; v->u.uval = strtoul(tok, &z, 0); if (z == tok || *tok == '-') { mem_free(v); mem_free(cline); my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_NOT_NUMBER; return PARSE_ERROR_NOT_NUMBER; } } else if (t == PARSE_T_CHAR) { v->u.cval = *tok; } else if (t == PARSE_T_SYM || t == PARSE_T_STR) { v->u.sval = string_make(tok); } else if (t == PARSE_T_RAND) { if (!parse_random(tok, &v->u.rval)) { mem_free(v); mem_free(cline); my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_NOT_RANDOM; return PARSE_ERROR_NOT_RANDOM; } } if (!p->fhead) p->fhead = v; else p->ftail->spec.next = &v->spec; p->ftail = v; } mem_free(cline); p->error = h->func(p); return p->error; } void *parser_priv(struct parser *p) { return p->priv; } void parser_setpriv(struct parser *p, void *v) { p->priv = v; } static int parse_type(const char *s) { int rv = 0; if (s[0] == '?') { rv |= PARSE_T_OPT; s++; } if (!strcmp(s, "int")) return PARSE_T_INT | rv; if (!strcmp(s, "sym")) return PARSE_T_SYM | rv; if (!strcmp(s, "str")) return PARSE_T_STR | rv; if (!strcmp(s, "rand")) return PARSE_T_RAND | rv; if (!strcmp(s, "uint")) return PARSE_T_UINT | rv; if (!strcmp(s, "char")) return PARSE_T_CHAR | rv; return PARSE_T_NONE; } static void clean_specs(struct parser_hook *h) { struct parser_spec *s; mem_free(h->dir); while (h->fhead) { s = h->fhead; h->fhead = h->fhead->next; mem_free((void*)s->name); mem_free(s); } } void parser_destroy(struct parser *p) { struct parser_hook *h; parser_freeold(p); while (p->hooks) { h = p->hooks->next; clean_specs(p->hooks); mem_free(p->hooks); p->hooks = h; } mem_free(p); } static errr parse_specs(struct parser_hook *h, char *fmt) { char *name ; char *stype = NULL; int type; struct parser_spec *s; assert(h); assert(fmt); name = strtok(fmt, " "); if (!name) return -EINVAL; h->dir = string_make(name); h->fhead = NULL; h->ftail = NULL; while (name) { /* Lack of a type is legal; that means we're at the end of the * line. */ stype = strtok(NULL, " "); if (!stype) break; /* Lack of a name, on the other hand... */ name = strtok(NULL, " "); if (!name) { clean_specs(h); return -EINVAL; } /* Grab a type, check to see if we have a mandatory type * following an optional type. */ type = parse_type(stype); if (type == PARSE_T_NONE) { clean_specs(h); return -EINVAL; } if (!(type & PARSE_T_OPT) && h->ftail && (h->ftail->type & PARSE_T_OPT)) { clean_specs(h); return -EINVAL; } if (h->ftail && ((h->ftail->type & ~PARSE_T_OPT) == PARSE_T_STR)) { clean_specs(h); return -EINVAL; } /* Save this spec. */ s = mem_alloc(sizeof *s); s->type = type; s->name = string_make(name); s->next = NULL; if (h->fhead) h->ftail->next = s; else h->fhead = s; h->ftail = s; } return 0; } errr parser_reg(struct parser *p, const char *fmt, enum parser_error (*func)(struct parser *p)) { errr r; char *cfmt; struct parser_hook *h; assert(p); assert(fmt); assert(func); h = mem_alloc(sizeof *h); cfmt = string_make(fmt); h->next = p->hooks; h->func = func; r = parse_specs(h, cfmt); if (r) { mem_free(h); mem_free(cfmt); return r; } p->hooks = h; mem_free(cfmt); return 0; } enum parser_error ignored(struct parser *p) { return PARSE_ERROR_NONE; } bool parser_hasval(struct parser *p, const char *name) { struct parser_value *v; for (v = p->fhead; v; v = (struct parser_value *)v->spec.next) { if (!strcmp(v->spec.name, name)) return TRUE; } return FALSE; } static struct parser_value *parser_getval(struct parser *p, const char *name) { struct parser_value *v; for (v = p->fhead; v; v = (struct parser_value *)v->spec.next) { if (!strcmp(v->spec.name, name)) { return v; } } assert(0); } const char *parser_getsym(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_SYM); return v->u.sval; } int parser_getint(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_INT); return v->u.ival; } unsigned int parser_getuint(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_UINT); return v->u.uval; } const char *parser_getstr(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_STR); return v->u.sval; } struct random parser_getrand(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_RAND); return v->u.rval; } char parser_getchar(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_CHAR); return v->u.cval; } int parser_getstate(struct parser *p, struct parser_state *s) { s->error = p->error; s->line = p->lineno; s->col = p->colno; s->msg = p->errmsg; return s->error != PARSE_ERROR_NONE; } void parser_setstate(struct parser *p, unsigned int col, const char *msg) { p->colno = col; my_strcpy(p->errmsg, msg, sizeof(p->errmsg)); } /* More angband-specific bits of the parser * These require hooks into other parts of the code, and are a candidate for * moving elsewhere. */ static void print_error(struct file_parser *fp, struct parser *p) { struct parser_state s; parser_getstate(p, &s); msg("Parse error in %s line %d column %d: %s: %s", fp->name, s.line, s.col, s.msg, parser_error_str[s.error]); message_flush(); quit_fmt("Parse error in %s line %d column %d.", fp->name, s.line, s.col); } errr run_parser(struct file_parser *fp) { struct parser *p = fp->init(); errr r; if (!p) { return PARSE_ERROR_GENERIC; } r = fp->run(p); if (r) { print_error(fp, p); return r; } r = fp->finish(p); if (r) print_error(fp, p); return r; } /* The basic file parsing function */ errr parse_file(struct parser *p, const char *filename) { char path[1024]; char buf[1024]; ang_file *fh; errr r = 0; path_build(path, sizeof(path), ANGBAND_DIR_EDIT, format("%s.txt", filename)); fh = file_open(path, MODE_READ, -1); if (!fh) quit(format("Cannot open '%s.txt'", filename)); while (file_getl(fh, buf, sizeof(buf))) { r = parser_parse(p, buf); if (r) break; } file_close(fh); return r; } void cleanup_parser(struct file_parser *fp) { fp->cleanup(); } int lookup_flag(const char **flag_table, const char *flag_name) { int i = FLAG_START; while (flag_table[i] && !streq(flag_table[i], flag_name)) i++; /* End of table reached without match */ if (!flag_table[i]) i = FLAG_END; return i; } errr grab_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name) { int flag = lookup_flag(flag_table, flag_name); if (flag == FLAG_END) return PARSE_ERROR_INVALID_FLAG; flag_on(flags, size, flag); return 0; } errr remove_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name) { int flag = lookup_flag(flag_table, flag_name); if (flag == FLAG_END) return PARSE_ERROR_INVALID_FLAG; flag_off(flags, size, flag); return 0; } angband-v3.3.2/src/pathfind.c0000644000175000017500000005300511651552410015342 0ustar chriscchrisc/* * File: pathfind.c * Purpose: Pathfinding and running code. * * Copyright (c) 1988 Christopher J Stuart (running code) * Copyright (c) 2004-2007 Christophe Cavalaria, Leon Marrick (pathfinding) * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "squelch.h" /****** Pathfinding code ******/ /* Maximum size around the player to consider in the pathfinder */ #define MAX_PF_RADIUS 50 /* Maximum distance to consider in the pathfinder */ #define MAX_PF_LENGTH 250 static int terrain[MAX_PF_RADIUS][MAX_PF_RADIUS]; static char pf_result[MAX_PF_LENGTH]; static int pf_result_index; static int ox, oy, ex, ey; static bool is_valid_pf(int y, int x) { /* Unvisited means allowed */ if (!(cave->info[y][x] & (CAVE_MARK))) return (TRUE); /* Require open space */ return (cave_floor_bold(y, x)); } static void fill_terrain_info(void) { int i, j; ox = MAX(p_ptr->px - MAX_PF_RADIUS / 2, 0); oy = MAX(p_ptr->py - MAX_PF_RADIUS / 2, 0); ex = MIN(p_ptr->px + MAX_PF_RADIUS / 2 - 1, DUNGEON_WID); ey = MIN(p_ptr->py + MAX_PF_RADIUS / 2 - 1, DUNGEON_HGT); for (i = 0; i < MAX_PF_RADIUS * MAX_PF_RADIUS; i++) terrain[0][i] = -1; for (j = oy; j < ey; j++) for (i = ox; i < ex; i++) if (is_valid_pf(j, i)) terrain[j - oy][i - ox] = MAX_PF_LENGTH; terrain[p_ptr->py - oy][p_ptr->px - ox] = 1; } #define MARK_DISTANCE(c,d) if ((c <= MAX_PF_LENGTH) && (c > d)) { c = d; try_again = (TRUE); } bool findpath(int y, int x) { int i, j, dir; bool try_again; int cur_distance; fill_terrain_info(); terrain[p_ptr->py - oy][p_ptr->px - ox] = 1; if ((x >= ox) && (x < ex) && (y >= oy) && (y < ey)) { if ((cave->m_idx[y][x] > 0) && (cave_monster(cave, cave->m_idx[y][x])->ml)) { terrain[y - oy][x - ox] = MAX_PF_LENGTH; } #if 0 else if (terrain[y-oy][x-ox] != MAX_PF_LENGTH) { bell("Target blocked"); return (FALSE); } #endif terrain[y - oy][x - ox] = MAX_PF_LENGTH; } else { bell("Target out of range."); return (FALSE); } /* * And now starts the very naive and very * inefficient pathfinding algorithm */ do { try_again = FALSE; for (j = oy + 1; j < ey - 1; j++) { for (i = ox + 1; i < ex - 1; i++) { cur_distance = terrain[j - oy][i - ox] + 1; if ((cur_distance > 0) && (cur_distance < MAX_PF_LENGTH)) { for (dir = 1; dir < 10; dir++) { if (dir == 5) dir++; MARK_DISTANCE(terrain[j - oy + ddy[dir]][i - ox + ddx[dir]], cur_distance); } } } } if (terrain[y - oy][x - ox] < MAX_PF_LENGTH) try_again = (FALSE); } while (try_again); /* Failure */ if (terrain[y - oy][x - ox] == MAX_PF_LENGTH) { bell("Target space unreachable."); return (FALSE); } /* Success */ i = x; j = y; pf_result_index = 0; while ((i != p_ptr->px) || (j != p_ptr->py)) { cur_distance = terrain[j - oy][i - ox] - 1; for (dir = 1; dir < 10; dir++) { if (terrain[j - oy + ddy[dir]][i - ox + ddx[dir]] == cur_distance) break; } /* Should never happend */ if (dir == 10) { bell("Wtf ?"); return (FALSE); } else if (dir == 5) { bell("Heyyy !"); return (FALSE); } pf_result[pf_result_index++] = '0' + (char)(10 - dir); i += ddx[dir]; j += ddy[dir]; } pf_result_index--; return (TRUE); } /* Compute the direction (in the angband 123456789 sense) from a point to a * point. We decide to use diagonals if dx and dy are within a factor of two of * each other; otherwise we choose a cardinal direction. */ int pathfind_direction_to(struct loc from, struct loc to) { int adx = ABS(to.x - from.x); int ady = ABS(to.y - from.y); int dx = to.x - from.x; int dy = to.y - from.y; if (dx == 0 && dy == 0) return DIR_NONE; if (dx >= 0 && dy >= 0) { if (adx < ady * 2 && ady < adx * 2) return DIR_NE; else if (adx > ady) return DIR_E; else return DIR_N; } else if (dx > 0 && dy < 0) { if (adx < ady * 2 && ady < adx * 2) return DIR_SE; else if (adx > ady) return DIR_E; else return DIR_S; } else if (dx < 0 && dy > 0) { if (adx < ady * 2 && ady < adx * 2) return DIR_NW; else if (adx > ady) return DIR_W; else return DIR_N; } else if (dx <= 0 && dy <= 0) { if (adx < ady * 2 && ady < adx * 2) return DIR_SW; else if (adx > ady) return DIR_W; else return DIR_S; } assert(0); return DIR_UNKNOWN; } /****** Running code ******/ /* * Basically, once you start running, you keep moving until something * interesting happens. In an enclosed space, you run straight, but * you follow corners as needed (i.e. hallways). In an open space, * you run straight, but you stop before entering an enclosed space * (i.e. a room with a doorway). In a semi-open space (with walls on * one side only), you run straight, but you stop before entering an * enclosed space or an open space (i.e. running along side a wall). * * All discussions below refer to what the player can see, that is, * an unknown wall is just like a normal floor. This means that we * must be careful when dealing with "illegal" grids. * * No assumptions are made about the layout of the dungeon, so this * algorithm works in hallways, rooms, town, destroyed areas, etc. * * In the diagrams below, the player has just arrived in the grid * marked as '@', and he has just come from a grid marked as 'o', * and he is about to enter the grid marked as 'x'. * * Running while confused is not allowed, and so running into a wall * is only possible when the wall is not seen by the player. This * will take a turn and stop the running. * * Several conditions are tracked by the running variables. * * p_ptr->run_open_area (in the open on at least one side) * p_ptr->run_break_left (wall on the left, stop if it opens) * p_ptr->run_break_right (wall on the right, stop if it opens) * * When running begins, these conditions are initialized by examining * the grids adjacent to the requested destination grid (marked 'x'), * two on each side (marked 'L' and 'R'). If either one of the two * grids on a given side is a wall, then that side is considered to * be "closed". Both sides enclosed yields a hallway. * * LL @L * @x (normal) RxL (diagonal) * RR (east) R (south-east) * * In the diagram below, in which the player is running east along a * hallway, he will stop as indicated before attempting to enter the * intersection (marked 'x'). Starting a new run in any direction * will begin a new hallway run. * * #.# * ##.## * o@x.. * ##.## * #.# * * Note that a minor hack is inserted to make the angled corridor * entry (with one side blocked near and the other side blocked * further away from the runner) work correctly. The runner moves * diagonally, but then saves the previous direction as being * straight into the gap. Otherwise, the tail end of the other * entry would be perceived as an alternative on the next move. * * In the diagram below, the player is running east down a hallway, * and will stop in the grid (marked '1') before the intersection. * Continuing the run to the south-east would result in a long run * stopping at the end of the hallway (marked '2'). * * ################## * o@x 1 * ########### ###### * #2 # * ############# * * After each step, the surroundings are examined to determine if * the running should stop, and to determine if the running should * change direction. We examine the new current player location * (at which the runner has just arrived) and the direction from * which the runner is considered to have come. * * Moving one grid in some direction places you adjacent to three * or five new grids (for straight and diagonal moves respectively) * to which you were not previously adjacent (marked as '!'). * * ...! ... * .o@! (normal) .o.! (diagonal) * ...! (east) ..@! (south east) * !!! * * If any of the newly adjacent grids are "interesting" (monsters, * objects, some terrain features) then running stops. * * If any of the newly adjacent grids seem to be open, and you are * looking for a break on that side, then running stops. * * If any of the newly adjacent grids do not seem to be open, and * you are in an open area, and the non-open side was previously * entirely open, then running stops. * * If you are in a hallway, then the algorithm must determine if * the running should continue, turn, or stop. If only one of the * newly adjacent grids appears to be open, then running continues * in that direction, turning if necessary. If there are more than * two possible choices, then running stops. If there are exactly * two possible choices, separated by a grid which does not seem * to be open, then running stops. Otherwise, as shown below, the * player has probably reached a "corner". * * ### o## * o@x (normal) #@! (diagonal) * ##! (east) ##x (south east) * * In this situation, there will be two newly adjacent open grids, * one touching the player on a diagonal, and one directly adjacent. * We must consider the two "option" grids further out (marked '?'). * We assign "option" to the straight-on grid, and "option2" to the * diagonal grid. * * ###s * o@x? (may be incorrect diagram!) * ##!? * * If both "option" grids are closed, then there is no reason to enter * the corner, and so we can cut the corner, by moving into the other * grid (diagonally). If we choose not to cut the corner, then we may * go straight, but we pretend that we got there by moving diagonally. * Below, we avoid the obvious grid (marked 'x') and cut the corner * instead (marked 'n'). * * ###: o## * o@x# (normal) #@n (maybe?) * ##n# (east) ##x# * #### * * If one of the "option" grids is open, then we may have a choice, so * we check to see whether it is a potential corner or an intersection * (or room entrance). If the grid two spaces straight ahead, and the * space marked with 's' are both open, then it is a potential corner * and we enter it if requested. Otherwise, we stop, because it is * not a corner, and is instead an intersection or a room entrance. * * ### * o@x * ##!# * * I do not think this documentation is correct. */ /* * Hack -- allow quick "cycling" through the legal directions */ static const byte cycle[] = { 1, 2, 3, 6, 9, 8, 7, 4, 1, 2, 3, 6, 9, 8, 7, 4, 1 }; /* * Hack -- map each direction into the "middle" of the "cycle[]" array */ static const byte chome[] = { 0, 8, 9, 10, 7, 0, 11, 6, 5, 4 }; /* * Hack -- Check for a "known wall" (see below) */ static int see_wall(int dir, int y, int x) { /* Get the new location */ y += ddy[dir]; x += ddx[dir]; /* Illegal grids are not known walls XXX XXX XXX */ if (!in_bounds(y, x)) return (FALSE); /* Non-wall grids are not known walls */ if (cave->feat[y][x] < FEAT_SECRET) return (FALSE); /* Unknown walls are not known walls */ if (!(cave->info[y][x] & (CAVE_MARK))) return (FALSE); /* Default */ return (TRUE); } /* * Initialize the running algorithm for a new direction. * * Diagonal Corridor -- allow diaginal entry into corridors. * * Blunt Corridor -- If there is a wall two spaces ahead and * we seem to be in a corridor, then force a turn into the side * corridor, must be moving straight into a corridor here. (?) * * Diagonal Corridor Blunt Corridor (?) * # # # * #x# @x# * @p. p */ static void run_init(int dir) { int py = p_ptr->py; int px = p_ptr->px; int i, row, col; bool deepleft, deepright; bool shortleft, shortright; /* Mark that we're starting a run */ p_ptr->running_firststep = TRUE; /* Save the direction */ p_ptr->run_cur_dir = dir; /* Assume running straight */ p_ptr->run_old_dir = dir; /* Assume looking for open area */ p_ptr->run_open_area = TRUE; /* Assume not looking for breaks */ p_ptr->run_break_right = FALSE; p_ptr->run_break_left = FALSE; /* Assume no nearby walls */ deepleft = deepright = FALSE; shortright = shortleft = FALSE; /* Find the destination grid */ row = py + ddy[dir]; col = px + ddx[dir]; /* Extract cycle index */ i = chome[dir]; /* Check for nearby wall */ if (see_wall(cycle[i+1], py, px)) { p_ptr->run_break_left = TRUE; shortleft = TRUE; } /* Check for distant wall */ else if (see_wall(cycle[i+1], row, col)) { p_ptr->run_break_left = TRUE; deepleft = TRUE; } /* Check for nearby wall */ if (see_wall(cycle[i-1], py, px)) { p_ptr->run_break_right = TRUE; shortright = TRUE; } /* Check for distant wall */ else if (see_wall(cycle[i-1], row, col)) { p_ptr->run_break_right = TRUE; deepright = TRUE; } /* Looking for a break */ if (p_ptr->run_break_left && p_ptr->run_break_right) { /* Not looking for open area */ p_ptr->run_open_area = FALSE; /* Hack -- allow angled corridor entry */ if (dir & 0x01) { if (deepleft && !deepright) { p_ptr->run_old_dir = cycle[i - 1]; } else if (deepright && !deepleft) { p_ptr->run_old_dir = cycle[i + 1]; } } /* Hack -- allow blunt corridor entry */ else if (see_wall(cycle[i], row, col)) { if (shortleft && !shortright) { p_ptr->run_old_dir = cycle[i - 2]; } else if (shortright && !shortleft) { p_ptr->run_old_dir = cycle[i + 2]; } } } } /* * Update the current "run" path * * Return TRUE if the running should be stopped */ static bool run_test(void) { int py = p_ptr->py; int px = p_ptr->px; int prev_dir; int new_dir; int row, col; int i, max, inv; int option, option2; /* No options yet */ option = 0; option2 = 0; /* Where we came from */ prev_dir = p_ptr->run_old_dir; /* Range of newly adjacent grids */ max = (prev_dir & 0x01) + 1; /* Look at every newly adjacent square. */ for (i = -max; i <= max; i++) { object_type *o_ptr; /* New direction */ new_dir = cycle[chome[prev_dir] + i]; /* New location */ row = py + ddy[new_dir]; col = px + ddx[new_dir]; /* Visible monsters abort running */ if (cave->m_idx[row][col] > 0) { monster_type *m_ptr = cave_monster(cave, cave->m_idx[row][col]); /* Visible monster */ if (m_ptr->ml) return (TRUE); } /* Visible objects abort running */ for (o_ptr = get_first_object(row, col); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Visible object */ if (o_ptr->marked && !squelch_item_ok(o_ptr)) return (TRUE); } /* Assume unknown */ inv = TRUE; /* Check memorized grids */ if (cave->info[row][col] & (CAVE_MARK)) { bool notice = TRUE; /* Examine the terrain */ switch (cave->feat[row][col]) { /* Floors */ case FEAT_FLOOR: /* Invis traps */ case FEAT_INVIS: /* Secret doors */ case FEAT_SECRET: /* Normal veins */ case FEAT_MAGMA: case FEAT_QUARTZ: /* Hidden treasure */ case FEAT_MAGMA_H: case FEAT_QUARTZ_H: /* Walls */ case FEAT_WALL_EXTRA: case FEAT_WALL_INNER: case FEAT_WALL_OUTER: case FEAT_WALL_SOLID: case FEAT_PERM_EXTRA: case FEAT_PERM_INNER: case FEAT_PERM_OUTER: case FEAT_PERM_SOLID: { /* Ignore */ notice = FALSE; /* Done */ break; } } /* Interesting feature */ if (notice) return (TRUE); /* The grid is "visible" */ inv = FALSE; } /* Analyze unknown grids and floors */ if (inv || cave_floor_bold(row, col)) { /* Looking for open area */ if (p_ptr->run_open_area) { /* Nothing */ } /* The first new direction. */ else if (!option) { option = new_dir; } /* Three new directions. Stop running. */ else if (option2) { return (TRUE); } /* Two non-adjacent new directions. Stop running. */ else if (option != cycle[chome[prev_dir] + i - 1]) { return (TRUE); } /* Two new (adjacent) directions (case 1) */ else if (new_dir & 0x01) { option2 = new_dir; } /* Two new (adjacent) directions (case 2) */ else { option2 = option; option = new_dir; } } /* Obstacle, while looking for open area */ else { if (p_ptr->run_open_area) { if (i < 0) { /* Break to the right */ p_ptr->run_break_right = TRUE; } else if (i > 0) { /* Break to the left */ p_ptr->run_break_left = TRUE; } } } } /* Look at every soon to be newly adjacent square. */ for (i = -max; i <= max; i++) { /* New direction */ new_dir = cycle[chome[prev_dir] + i]; /* New location */ row = py + ddy[prev_dir] + ddy[new_dir]; col = px + ddx[prev_dir] + ddx[new_dir]; /* HACK: Ugh. Sometimes we come up with illegal bounds. This will * treat the symptom but not the disease. */ if (row >= DUNGEON_HGT || col >= DUNGEON_WID) continue; if (row < 0 || col < 0) continue; /* Visible monsters abort running */ if (cave->m_idx[row][col] > 0) { monster_type *m_ptr = cave_monster(cave, cave->m_idx[row][col]); /* Visible monster */ if (m_ptr->ml) return (TRUE); } } /* Looking for open area */ if (p_ptr->run_open_area) { /* Hack -- look again */ for (i = -max; i < 0; i++) { new_dir = cycle[chome[prev_dir] + i]; row = py + ddy[new_dir]; col = px + ddx[new_dir]; /* Unknown grid or non-wall */ /* Was: cave_floor_bold(row, col) */ if (!(cave->info[row][col] & (CAVE_MARK)) || (cave->feat[row][col] < FEAT_SECRET)) { /* Looking to break right */ if (p_ptr->run_break_right) { return (TRUE); } } /* Obstacle */ else { /* Looking to break left */ if (p_ptr->run_break_left) { return (TRUE); } } } /* Hack -- look again */ for (i = max; i > 0; i--) { new_dir = cycle[chome[prev_dir] + i]; row = py + ddy[new_dir]; col = px + ddx[new_dir]; /* Unknown grid or non-wall */ /* Was: cave_floor_bold(row, col) */ if (!(cave->info[row][col] & (CAVE_MARK)) || (cave->feat[row][col] < FEAT_SECRET)) { /* Looking to break left */ if (p_ptr->run_break_left) { return (TRUE); } } /* Obstacle */ else { /* Looking to break right */ if (p_ptr->run_break_right) { return (TRUE); } } } } /* Not looking for open area */ else { /* No options */ if (!option) { return (TRUE); } /* One option */ else if (!option2) { /* Primary option */ p_ptr->run_cur_dir = option; /* No other options */ p_ptr->run_old_dir = option; } /* Two options, examining corners */ else { /* Primary option */ p_ptr->run_cur_dir = option; /* Hack -- allow curving */ p_ptr->run_old_dir = option2; } } /* About to hit a known wall, stop */ if (see_wall(p_ptr->run_cur_dir, py, px)) { return (TRUE); } /* Failure */ return (FALSE); } /* * Take one step along the current "run" path * * Called with a real direction to begin a new run, and with zero * to continue a run in progress. */ void run_step(int dir) { int x, y; /* Start run */ if (dir) { /* Initialize */ run_init(dir); /* Hack -- Set the run counter */ p_ptr->running = (p_ptr->command_arg ? p_ptr->command_arg : 1000); /* Calculate torch radius */ p_ptr->update |= (PU_TORCH); } /* Continue run */ else { if (!p_ptr->running_withpathfind) { /* Update run */ if (run_test()) { /* Disturb */ disturb(p_ptr, 0, 0); /* Done */ return; } } else { /* Abort if we have finished */ if (pf_result_index < 0) { disturb(p_ptr, 0, 0); p_ptr->running_withpathfind = FALSE; return; } /* Abort if we would hit a wall */ else if (pf_result_index == 0) { /* Get next step */ y = p_ptr->py + ddy[pf_result[pf_result_index] - '0']; x = p_ptr->px + ddx[pf_result[pf_result_index] - '0']; /* Known wall */ if ((cave->info[y][x] & (CAVE_MARK)) && !cave_floor_bold(y, x)) { disturb(p_ptr, 0,0); p_ptr->running_withpathfind = FALSE; return; } } /* * Hack -- walking stick lookahead. * * If the player has computed a path that is going to end up in a wall, * we notice this and convert to a normal run. This allows us to click * on unknown areas to explore the map. * * We have to look ahead two, otherwise we don't know which is the last * direction moved and don't initialise the run properly. */ else if (pf_result_index > 0) { /* Get next step */ y = p_ptr->py + ddy[pf_result[pf_result_index] - '0']; x = p_ptr->px + ddx[pf_result[pf_result_index] - '0']; /* Known wall */ if ((cave->info[y][x] & (CAVE_MARK)) && !cave_floor_bold(y, x)) { disturb(p_ptr, 0,0); p_ptr->running_withpathfind = FALSE; return; } /* Get step after */ y = y + ddy[pf_result[pf_result_index-1] - '0']; x = x + ddx[pf_result[pf_result_index-1] - '0']; /* Known wall */ if ((cave->info[y][x] & (CAVE_MARK)) && !cave_floor_bold(y, x)) { p_ptr->running_withpathfind = FALSE; run_init(pf_result[pf_result_index] - '0'); } } p_ptr->run_cur_dir = pf_result[pf_result_index--] - '0'; } } /* Decrease counter */ p_ptr->running--; /* Take time */ p_ptr->energy_use = 100; /* Move the player */ move_player(p_ptr->run_cur_dir, TRUE); } angband-v3.3.2/src/buildid.h0000644000175000017500000000044011651552410015161 0ustar chriscchrisc#ifndef BUILDID #define BUILDID #define VERSION_NAME "Angband" #ifdef BUILD_ID # define STR(x) #x # define XSTR(x) STR(x) # define VERSION_STRING XSTR(BUILD_ID) #else # define VERSION_STRING "3.3.2" #endif extern const char *buildid; extern const char *buildver; #endif /* BUILDID */ angband-v3.3.2/src/z-debug.h0000644000175000017500000000024711651552410015107 0ustar chriscchrisc/* z-debug.h - debugging support */ #ifndef Z_DEBUG_H #define Z_DEBUG_H #define notreached assert(0) #define testonly /* annotation only */ #endif /* !Z_DEBUG_H */ angband-v3.3.2/src/xtra3.c0000644000175000017500000011702511651552410014611 0ustar chriscchrisc/* * File: xtra3.c * Purpose: Handles the setting up updating, and cleaning up of the various * things that are displayed by the game. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2007 Antony Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "button.h" #include "cave.h" #include "files.h" #include "game-event.h" #include "game-cmd.h" #include "monster/mon-lore.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "textui.h" #include "ui-birth.h" /* * There are a few functions installed to be triggered by several * of the basic player events. For convenience, these have been grouped * in this list. */ game_event_type player_events[] = { EVENT_RACE_CLASS, EVENT_PLAYERTITLE, EVENT_EXPERIENCE, EVENT_PLAYERLEVEL, EVENT_GOLD, EVENT_EQUIPMENT, /* For equippy chars */ EVENT_STATS, EVENT_HP, EVENT_MANA, EVENT_AC, EVENT_MONSTERHEALTH, EVENT_PLAYERSPEED, EVENT_DUNGEONLEVEL, }; game_event_type statusline_events[] = { EVENT_STUDYSTATUS, EVENT_STATUS, EVENT_DETECTIONSTATUS, EVENT_STATE, EVENT_MOUSEBUTTONS }; /* * Converts stat num into a six-char (right justified) string */ void cnv_stat(int val, char *out_val, size_t out_len) { /* Above 18 */ if (val > 18) { int bonus = (val - 18); if (bonus >= 220) strnfmt(out_val, out_len, "18/***"); else if (bonus >= 100) strnfmt(out_val, out_len, "18/%03d", bonus); else strnfmt(out_val, out_len, " 18/%02d", bonus); } /* From 3 to 18 */ else { strnfmt(out_val, out_len, " %2d", val); } } /* ------------------------------------------------------------------------ * Sidebar display functions * ------------------------------------------------------------------------ */ /* * Print character info at given row, column in a 13 char field */ static void prt_field(const char *info, int row, int col) { /* Dump 13 spaces to clear */ c_put_str(TERM_WHITE, " ", row, col); /* Dump the info itself */ c_put_str(TERM_L_BLUE, info, row, col); } /* * Print character stat in given row, column */ static void prt_stat(int stat, int row, int col) { char tmp[32]; /* Display "injured" stat */ if (p_ptr->stat_cur[stat] < p_ptr->stat_max[stat]) { put_str(stat_names_reduced[stat], row, col); cnv_stat(p_ptr->state.stat_use[stat], tmp, sizeof(tmp)); c_put_str(TERM_YELLOW, tmp, row, col + 6); } /* Display "healthy" stat */ else { put_str(stat_names[stat], row, col); cnv_stat(p_ptr->state.stat_use[stat], tmp, sizeof(tmp)); c_put_str(TERM_L_GREEN, tmp, row, col + 6); } /* Indicate natural maximum */ if (p_ptr->stat_max[stat] == 18+100) { put_str("!", row, col + 3); } } /* * Prints "title", including "wizard" or "winner" as needed. */ static void prt_title(int row, int col) { const char *p; /* Wizard */ if (p_ptr->wizard) { p = "[=-WIZARD-=]"; } /* Winner */ else if (p_ptr->total_winner || (p_ptr->lev > PY_MAX_LEVEL)) { p = "***WINNER***"; } /* Normal */ else { p = p_ptr->class->title[(p_ptr->lev - 1) / 5]; } prt_field(p, row, col); } /* * Prints level */ static void prt_level(int row, int col) { char tmp[32]; strnfmt(tmp, sizeof(tmp), "%6d", p_ptr->lev); if (p_ptr->lev >= p_ptr->max_lev) { put_str("LEVEL ", row, col); c_put_str(TERM_L_GREEN, tmp, row, col + 6); } else { put_str("Level ", row, col); c_put_str(TERM_YELLOW, tmp, row, col + 6); } } /* * Display the experience */ static void prt_exp(int row, int col) { char out_val[32]; bool lev50 = (p_ptr->lev == 50); long xp = (long)p_ptr->exp; /* Calculate XP for next level */ if (!lev50) xp = (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp; /* Format XP */ strnfmt(out_val, sizeof(out_val), "%8ld", (long)xp); if (p_ptr->exp >= p_ptr->max_exp) { put_str((lev50 ? "EXP" : "NXT"), row, col); c_put_str(TERM_L_GREEN, out_val, row, col + 4); } else { put_str((lev50 ? "Exp" : "Nxt"), row, col); c_put_str(TERM_YELLOW, out_val, row, col + 4); } } /* * Prints current gold */ static void prt_gold(int row, int col) { char tmp[32]; put_str("AU ", row, col); strnfmt(tmp, sizeof(tmp), "%9ld", (long)p_ptr->au); c_put_str(TERM_L_GREEN, tmp, row, col + 3); } /* * Equippy chars */ static void prt_equippy(int row, int col) { int i; byte a; char c; object_type *o_ptr; /* No equippy chars in bigtile mode */ if (tile_width > 1 || tile_height > 1) return; /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { /* Object */ o_ptr = &p_ptr->inventory[i]; if (o_ptr->kind) { c = object_char(o_ptr); a = object_attr(o_ptr); } else { c = ' '; a = TERM_WHITE; } /* Dump */ Term_putch(col + i - INVEN_WIELD, row, a, c); } } /* * Prints current AC */ static void prt_ac(int row, int col) { char tmp[32]; put_str("Cur AC ", row, col); strnfmt(tmp, sizeof(tmp), "%5d", p_ptr->state.dis_ac + p_ptr->state.dis_to_a); c_put_str(TERM_L_GREEN, tmp, row, col + 7); } /* * Prints Cur hit points */ static void prt_hp(int row, int col) { char cur_hp[32], max_hp[32]; byte color = player_hp_attr(p_ptr); put_str("HP ", row, col); strnfmt(max_hp, sizeof(max_hp), "%4d", p_ptr->mhp); strnfmt(cur_hp, sizeof(cur_hp), "%4d", p_ptr->chp); c_put_str(color, cur_hp, row, col + 3); c_put_str(TERM_WHITE, "/", row, col + 7); c_put_str(TERM_L_GREEN, max_hp, row, col + 8); } /* * Prints players max/cur spell points */ static void prt_sp(int row, int col) { char cur_sp[32], max_sp[32]; byte color = player_sp_attr(p_ptr); /* Do not show mana unless we have some */ if (!p_ptr->msp) return; put_str("SP ", row, col); strnfmt(max_sp, sizeof(max_sp), "%4d", p_ptr->msp); strnfmt(cur_sp, sizeof(cur_sp), "%4d", p_ptr->csp); /* Show mana */ c_put_str(color, cur_sp, row, col + 3); c_put_str(TERM_WHITE, "/", row, col + 7); c_put_str(TERM_L_GREEN, max_sp, row, col + 8); } /* * Calculate the monster bar color separately, for ports. */ byte monster_health_attr(void) { byte attr = TERM_WHITE; /* Not tracking */ if (!p_ptr->health_who) attr = TERM_DARK; /* Tracking an unseen, hallucinatory, or dead monster */ else if ((!cave_monster(cave, p_ptr->health_who)->ml) || (p_ptr->timed[TMD_IMAGE]) || (cave_monster(cave, p_ptr->health_who)->hp < 0)) { /* The monster health is "unknown" */ attr = TERM_WHITE; } else { struct monster *mon = cave_monster(cave, p_ptr->health_who); int pct; /* Default to almost dead */ attr = TERM_RED; /* Extract the "percent" of health */ pct = 100L * mon->hp / mon->maxhp; /* Badly wounded */ if (pct >= 10) attr = TERM_L_RED; /* Wounded */ if (pct >= 25) attr = TERM_ORANGE; /* Somewhat Wounded */ if (pct >= 60) attr = TERM_YELLOW; /* Healthy */ if (pct >= 100) attr = TERM_L_GREEN; /* Afraid */ if (mon->m_timed[MON_TMD_FEAR]) attr = TERM_VIOLET; /* Confused */ if (mon->m_timed[MON_TMD_CONF]) attr = TERM_UMBER; /* Stunned */ if (mon->m_timed[MON_TMD_STUN]) attr = TERM_L_BLUE; /* Asleep */ if (mon->m_timed[MON_TMD_SLEEP]) attr = TERM_BLUE; } return attr; } /* * Redraw the "monster health bar" * * The "monster health bar" provides visual feedback on the "health" * of the monster currently being "tracked". There are several ways * to "track" a monster, including targetting it, attacking it, and * affecting it (and nobody else) with a ranged attack. When nothing * is being tracked, we clear the health bar. If the monster being * tracked is not currently visible, a special health bar is shown. */ static void prt_health(int row, int col) { byte attr = monster_health_attr(); struct monster *mon; /* Not tracking */ if (!p_ptr->health_who) { /* Erase the health bar */ Term_erase(col, row, 12); return; } mon = cave_monster(cave, p_ptr->health_who); /* Tracking an unseen, hallucinatory, or dead monster */ if ((!mon->ml) || /* Unseen */ (p_ptr->timed[TMD_IMAGE]) || /* Hallucination */ (mon->hp < 0)) /* Dead (?) */ { /* The monster health is "unknown" */ Term_putstr(col, row, 12, attr, "[----------]"); } /* Tracking a visible monster */ else { int pct, len; monster_type *m_ptr = cave_monster(cave, p_ptr->health_who); /* Extract the "percent" of health */ pct = 100L * m_ptr->hp / m_ptr->maxhp; /* Convert percent into "health" */ len = (pct < 10) ? 1 : (pct < 90) ? (pct / 10 + 1) : 10; /* Default to "unknown" */ Term_putstr(col, row, 12, TERM_WHITE, "[----------]"); /* Dump the current "health" (use '*' symbols) */ Term_putstr(col + 1, row, len, attr, "**********"); } } /* * Prints the speed of a character. */ static void prt_speed(int row, int col) { int i = p_ptr->state.speed; byte attr = TERM_WHITE; const char *type = NULL; char buf[32] = ""; /* Hack -- Visually "undo" the Search Mode Slowdown */ if (p_ptr->searching) i += 10; /* Fast */ if (i > 110) { attr = TERM_L_GREEN; type = "Fast"; } /* Slow */ else if (i < 110) { attr = TERM_L_UMBER; type = "Slow"; } if (type) strnfmt(buf, sizeof(buf), "%s (%+d)", type, (i - 110)); /* Display the speed */ c_put_str(attr, format("%-10s", buf), row, col); } /* * Prints depth in stat area */ static void prt_depth(int row, int col) { char depths[32]; if (!p_ptr->depth) { my_strcpy(depths, "Town", sizeof(depths)); } else { strnfmt(depths, sizeof(depths), "%d' (L%d)", p_ptr->depth * 50, p_ptr->depth); } /* Right-Adjust the "depth", and clear old values */ put_str(format("%-13s", depths), row, col); } /* Some simple wrapper functions */ static void prt_str(int row, int col) { prt_stat(A_STR, row, col); } static void prt_dex(int row, int col) { prt_stat(A_DEX, row, col); } static void prt_wis(int row, int col) { prt_stat(A_WIS, row, col); } static void prt_int(int row, int col) { prt_stat(A_INT, row, col); } static void prt_con(int row, int col) { prt_stat(A_CON, row, col); } static void prt_chr(int row, int col) { prt_stat(A_CHR, row, col); } static void prt_race(int row, int col) { prt_field(p_ptr->race->name, row, col); } static void prt_class(int row, int col) { prt_field(p_ptr->class->name, row, col); } /* * Struct of sidebar handlers. */ static const struct side_handler_t { void (*hook)(int, int); /* int row, int col */ int priority; /* 1 is most important (always displayed) */ game_event_type type; /* PR_* flag this corresponds to */ } side_handlers[] = { { prt_race, 19, EVENT_RACE_CLASS }, { prt_title, 18, EVENT_PLAYERTITLE }, { prt_class, 22, EVENT_RACE_CLASS }, { prt_level, 10, EVENT_PLAYERLEVEL }, { prt_exp, 16, EVENT_EXPERIENCE }, { prt_gold, 11, EVENT_GOLD }, { prt_equippy, 17, EVENT_EQUIPMENT }, { prt_str, 6, EVENT_STATS }, { prt_int, 5, EVENT_STATS }, { prt_wis, 4, EVENT_STATS }, { prt_dex, 3, EVENT_STATS }, { prt_con, 2, EVENT_STATS }, { prt_chr, 1, EVENT_STATS }, { NULL, 15, 0 }, { prt_ac, 7, EVENT_AC }, { prt_hp, 8, EVENT_HP }, { prt_sp, 9, EVENT_MANA }, { NULL, 21, 0 }, { prt_health, 12, EVENT_MONSTERHEALTH }, { NULL, 20, 0 }, { NULL, 22, 0 }, { prt_speed, 13, EVENT_PLAYERSPEED }, /* Slow (-NN) / Fast (+NN) */ { prt_depth, 14, EVENT_DUNGEONLEVEL }, /* Lev NNN / NNNN ft */ }; /* * This prints the sidebar, using a clever method which means that it will only * print as much as can be displayed on <24-line screens. * * Each row is given a priority; the least important higher numbers and the most * important lower numbers. As the screen gets smaller, the rows start to * disappear in the order of lowest to highest importance. */ static void update_sidebar(game_event_type type, game_event_data *data, void *user) { int x, y, row; int max_priority; size_t i; Term_get_size(&x, &y); /* Keep the top and bottom lines clear. */ max_priority = y - 2; /* Display list entries */ for (i = 0, row = 1; i < N_ELEMENTS(side_handlers); i++) { const struct side_handler_t *hnd = &side_handlers[i]; int priority = hnd->priority; bool from_bottom = FALSE; /* Negative means print from bottom */ if (priority < 0) { priority = -priority; from_bottom = TRUE; } /* If this is high enough priority, display it */ if (priority <= max_priority) { if (hnd->type == type && hnd->hook) { if (from_bottom) hnd->hook(Term->hgt - (N_ELEMENTS(side_handlers) - i), 0); else hnd->hook(row, 0); } /* Increment for next time */ row++; } } } static void hp_colour_change(game_event_type type, game_event_data *data, void *user) { /* * hack: redraw player, since the player's color * now indicates approximate health. Note that * using this command when graphics mode is on * causes the character to be a black square. */ if ((OPT(hp_changes_color)) && (arg_graphics == GRAPHICS_NONE)) { cave_light_spot(cave, p_ptr->py, p_ptr->px); } } /* ------------------------------------------------------------------------ * Status line display functions * ------------------------------------------------------------------------ */ /* Simple macro to initialise structs */ #define S(s) s, sizeof(s) /* * Struct to describe different timed effects */ struct state_info { int value; const char *str; size_t len; byte attr; }; /* TMD_CUT descriptions */ static const struct state_info cut_data[] = { { 1000, S("Mortal wound"), TERM_L_RED }, { 200, S("Deep gash"), TERM_RED }, { 100, S("Severe cut"), TERM_RED }, { 50, S("Nasty cut"), TERM_ORANGE }, { 25, S("Bad cut"), TERM_ORANGE }, { 10, S("Light cut"), TERM_YELLOW }, { 0, S("Graze"), TERM_YELLOW }, }; /* TMD_STUN descriptions */ static const struct state_info stun_data[] = { { 100, S("Knocked out"), TERM_RED }, { 50, S("Heavy stun"), TERM_ORANGE }, { 0, S("Stun"), TERM_ORANGE }, }; /* p_ptr->hunger descriptions */ static const struct state_info hunger_data[] = { { PY_FOOD_FAINT, S("Faint"), TERM_RED }, { PY_FOOD_WEAK, S("Weak"), TERM_ORANGE }, { PY_FOOD_ALERT, S("Hungry"), TERM_YELLOW }, { PY_FOOD_FULL, S(""), TERM_L_GREEN }, { PY_FOOD_MAX, S("Full"), TERM_L_GREEN }, { PY_FOOD_UPPER, S("Gorged"), TERM_GREEN }, }; /* For the various TMD_* effects */ static const struct state_info effects[] = { { TMD_BLIND, S("Blind"), TERM_ORANGE }, { TMD_PARALYZED, S("Paralyzed!"), TERM_RED }, { TMD_CONFUSED, S("Confused"), TERM_ORANGE }, { TMD_AFRAID, S("Afraid"), TERM_ORANGE }, { TMD_TERROR, S("Terror"), TERM_RED }, { TMD_IMAGE, S("Halluc"), TERM_ORANGE }, { TMD_POISONED, S("Poisoned"), TERM_ORANGE }, { TMD_PROTEVIL, S("ProtEvil"), TERM_L_GREEN }, { TMD_SPRINT, S("Sprint"), TERM_L_GREEN }, { TMD_TELEPATHY, S("ESP"), TERM_L_BLUE }, { TMD_INVULN, S("Invuln"), TERM_L_GREEN }, { TMD_HERO, S("Hero"), TERM_L_GREEN }, { TMD_SHERO, S("Berserk"), TERM_L_GREEN }, { TMD_BOLD, S("Bold"), TERM_L_GREEN }, { TMD_STONESKIN, S("Stone"), TERM_L_GREEN }, { TMD_SHIELD, S("Shield"), TERM_L_GREEN }, { TMD_BLESSED, S("Blssd"), TERM_L_GREEN }, { TMD_SINVIS, S("SInvis"), TERM_L_GREEN }, { TMD_SINFRA, S("Infra"), TERM_L_GREEN }, { TMD_OPP_ACID, S("RAcid"), TERM_SLATE }, { TMD_OPP_ELEC, S("RElec"), TERM_BLUE }, { TMD_OPP_FIRE, S("RFire"), TERM_RED }, { TMD_OPP_COLD, S("RCold"), TERM_WHITE }, { TMD_OPP_POIS, S("RPois"), TERM_GREEN }, { TMD_OPP_CONF, S("RConf"), TERM_VIOLET }, { TMD_AMNESIA, S("Amnesiac"), TERM_ORANGE }, }; #define PRINT_STATE(sym, data, index, row, col) \ { \ size_t i; \ \ for (i = 0; i < N_ELEMENTS(data); i++) \ { \ if (index sym data[i].value) \ { \ if (data[i].str[0]) \ { \ c_put_str(data[i].attr, data[i].str, row, col); \ return data[i].len; \ } \ else \ { \ return 0; \ } \ } \ } \ } /* * Print recall status. */ static size_t prt_recall(int row, int col) { if (p_ptr->word_recall) { c_put_str(TERM_WHITE, "Recall", row, col); return sizeof "Recall"; } return 0; } /* * Print cut indicator. */ static size_t prt_cut(int row, int col) { PRINT_STATE(>, cut_data, p_ptr->timed[TMD_CUT], row, col); return 0; } /* * Print stun indicator. */ static size_t prt_stun(int row, int col) { PRINT_STATE(>, stun_data, p_ptr->timed[TMD_STUN], row, col); return 0; } /* * Prints status of hunger */ static size_t prt_hunger(int row, int col) { PRINT_STATE(<, hunger_data, p_ptr->food, row, col); return 0; } /* * Prints Searching, Resting, or 'count' status * Display is always exactly 10 characters wide (see below) * * This function was a major bottleneck when resting, so a lot of * the text formatting code was optimized in place below. */ static size_t prt_state(int row, int col) { byte attr = TERM_WHITE; char text[16] = ""; /* Resting */ if (p_ptr->resting) { int i; int n = p_ptr->resting; /* Start with "Rest" */ my_strcpy(text, "Rest ", sizeof(text)); /* Extensive (timed) rest */ if (n >= 1000) { i = n / 100; text[9] = '0'; text[8] = '0'; text[7] = I2D(i % 10); if (i >= 10) { i = i / 10; text[6] = I2D(i % 10); if (i >= 10) { text[5] = I2D(i / 10); } } } /* Long (timed) rest */ else if (n >= 100) { i = n; text[9] = I2D(i % 10); i = i / 10; text[8] = I2D(i % 10); text[7] = I2D(i / 10); } /* Medium (timed) rest */ else if (n >= 10) { i = n; text[9] = I2D(i % 10); text[8] = I2D(i / 10); } /* Short (timed) rest */ else if (n > 0) { i = n; text[9] = I2D(i); } /* Rest until healed */ else if (n == -1) { text[5] = text[6] = text[7] = text[8] = text[9] = '*'; } /* Rest until done */ else if (n == -2) { text[5] = text[6] = text[7] = text[8] = text[9] = '&'; } /* Rest until HP or SP filled */ else if (n == -3) { text[5] = text[6] = text[7] = text[8] = text[9] = '!'; } } /* Repeating */ else if (cmd_get_nrepeats()) { int nrepeats = cmd_get_nrepeats(); if (nrepeats > 999) strnfmt(text, sizeof(text), "Rep. %3d00", nrepeats / 100); else strnfmt(text, sizeof(text), "Repeat %3d", nrepeats); } /* Searching */ else if (p_ptr->searching) { my_strcpy(text, "Searching ", sizeof(text)); } /* Display the info (or blanks) */ c_put_str(attr, text, row, col); return strlen(text); } /* * Prints trap detection status */ static size_t prt_dtrap(int row, int col) { byte info = cave->info2[p_ptr->py][p_ptr->px]; /* The player is in a trap-detected grid */ if (info & (CAVE2_DTRAP)) { /* The player is on the border */ if (dtrap_edge(p_ptr->py, p_ptr->px)) c_put_str(TERM_YELLOW, "DTrap", row, col); else c_put_str(TERM_L_GREEN, "DTrap", row, col); return 5; } return 0; } /* * Print whether a character is studying or not. */ static size_t prt_study(int row, int col) { if (p_ptr->new_spells) { char *text = format("Study (%d)", p_ptr->new_spells); put_str(text, row, col); return strlen(text) + 1; } return 0; } /* * Print all timed effects. */ static size_t prt_tmd(int row, int col) { size_t i, len = 0; for (i = 0; i < N_ELEMENTS(effects); i++) { if (p_ptr->timed[effects[i].value]) { c_put_str(effects[i].attr, effects[i].str, row, col + len); len += effects[i].len; } } return len; } /** * Print "unignoring" status */ static size_t prt_unignore(int row, int col) { if (p_ptr->unignoring) { const char *str = "Unignoring"; put_str(str, row, col); return strlen(str); } return 0; } /* * Print mouse buttons */ static size_t prt_buttons(int row, int col) { if (OPT(mouse_buttons)) return button_print(row, col); return 0; } /* Useful typedef */ typedef size_t status_f(int row, int col); status_f *status_handlers[] = { prt_buttons, prt_unignore, prt_recall, prt_state, prt_cut, prt_stun, prt_hunger, prt_study, prt_tmd, prt_dtrap }; /* * Print the status line. */ static void update_statusline(game_event_type type, game_event_data *data, void *user) { int row = Term->hgt - 1; int col = 13; size_t i; /* Clear the remainder of the line */ prt("", row, col); /* Display those which need redrawing */ for (i = 0; i < N_ELEMENTS(status_handlers); i++) col += status_handlers[i](row, col); } /* ------------------------------------------------------------------------ * Map redraw. * ------------------------------------------------------------------------ */ #if 0 static void trace_map_updates(game_event_type type, game_event_data *data, void *user) { if (data->point.x == -1 && data->point.y == -1) { printf("Redraw whole map\n"); } else { printf("Redraw (%i, %i)\n", data->point.x, data->point.y); } } #endif static void update_maps(game_event_type type, game_event_data *data, void *user) { term *t = user; /* This signals a whole-map redraw. */ if (data->point.x == -1 && data->point.y == -1) { prt_map(); } /* Single point to be redrawn */ else { grid_data g; byte a, ta; char c, tc; int ky, kx; int vy, vx; /* Location relative to panel */ ky = data->point.y - t->offset_y; kx = data->point.x - t->offset_x; if (t == angband_term[0]) { /* Verify location */ if ((ky < 0) || (ky >= SCREEN_HGT)) return; /* Verify location */ if ((kx < 0) || (kx >= SCREEN_WID)) return; /* Location in window */ vy = ky + ROW_MAP; vx = kx + COL_MAP; if (tile_width > 1) { vx += (tile_width - 1) * kx; } if (tile_height > 1) { vy += (tile_height - 1) * ky; } } else { if (tile_width > 1) { kx += (tile_width - 1) * kx; } if (tile_height > 1) { ky += (tile_height - 1) * ky; } /* Verify location */ if ((ky < 0) || (ky >= t->hgt)) return; if ((kx < 0) || (kx >= t->wid)) return; /* Location in window */ vy = ky; vx = kx; } /* Redraw the grid spot */ map_info(data->point.y, data->point.x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); Term_queue_char(t, vx, vy, a, c, ta, tc); #if 0 /* Plot 'spot' updates in light green to make them visible */ Term_queue_char(t, vx, vy, TERM_L_GREEN, c, ta, tc); #endif if ((tile_width > 1) || (tile_height > 1)) { Term_big_queue_char(t, vx, vy, a, c, TERM_WHITE, ' '); } } } /* ------------------------------------------------------------------------ * Subwindow displays * ------------------------------------------------------------------------ */ /* * TRUE when we're supposed to display the equipment in the inventory * window, or vice-versa. */ static bool flip_inven; static void update_inven_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); if (!flip_inven) show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); else show_equip(OLIST_WINDOW | OLIST_WEIGHT); Term_fresh(); /* Restore */ Term_activate(old); } static void update_equip_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); if (!flip_inven) show_equip(OLIST_WINDOW | OLIST_WEIGHT); else show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); Term_fresh(); /* Restore */ Term_activate(old); } /* * Flip "inven" and "equip" in any sub-windows */ void toggle_inven_equip(void) { term *old = Term; int i; /* Change the actual setting */ flip_inven = !flip_inven; /* Redraw any subwindows showing the inventory/equipment lists */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { Term_activate(angband_term[i]); if (op_ptr->window_flag[i] & PW_INVEN) { if (!flip_inven) show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); else show_equip(OLIST_WINDOW | OLIST_WEIGHT); Term_fresh(); } else if (op_ptr->window_flag[i] & PW_EQUIP) { if (!flip_inven) show_equip(OLIST_WINDOW | OLIST_WEIGHT); else show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); Term_fresh(); } } Term_activate(old); } static void update_itemlist_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); display_itemlist(); Term_fresh(); /* Restore */ Term_activate(old); } static void update_monlist_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); display_monlist(); Term_fresh(); /* Restore */ Term_activate(old); } static void update_monster_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Display monster race info */ if (p_ptr->monster_race_idx) display_roff(p_ptr->monster_race_idx); Term_fresh(); /* Restore */ Term_activate(old); } static void update_object_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); if (p_ptr->object_idx != NO_OBJECT) display_object_idx_recall(p_ptr->object_idx); else if(p_ptr->object_kind_idx != NO_OBJECT) display_object_kind_recall(p_ptr->object_kind_idx); Term_fresh(); /* Restore */ Term_activate(old); } static void update_messages_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; int i; int w, h; int x, y; const char *msg; /* Activate */ Term_activate(inv_term); /* Get size */ Term_get_size(&w, &h); /* Dump messages */ for (i = 0; i < h; i++) { byte color = message_color(i); u16b count = message_count(i); const char *str = message_str(i); if (count == 1) msg = str; else msg = format("%s <%dx>", str, count); Term_putstr(0, (h - 1) - i, -1, color, msg); /* Cursor */ Term_locate(&x, &y); /* Clear to end of line */ Term_erase(x, y, 255); } Term_fresh(); /* Restore */ Term_activate(old); } static struct minimap_flags { int win_idx; bool needs_redraw; } minimap_data[ANGBAND_TERM_MAX]; static void update_minimap_subwindow(game_event_type type, game_event_data *data, void *user) { struct minimap_flags *flags = user; if (type == EVENT_END) { term *old = Term; term *t = angband_term[flags->win_idx]; /* Activate */ Term_activate(t); /* If whole-map redraw, clear window first. */ if (flags->needs_redraw) Term_clear(); /* Redraw map */ display_map(NULL, NULL); Term_fresh(); /* Restore */ Term_activate(old); flags->needs_redraw = FALSE; } } /* * Hack -- display player in sub-windows (mode 0) */ static void update_player0_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Display flags */ display_player(0); Term_fresh(); /* Restore */ Term_activate(old); } /* * Hack -- display player in sub-windows (mode 1) */ static void update_player1_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Display flags */ display_player(1); Term_fresh(); /* Restore */ Term_activate(old); } /* * Display the left-hand-side of the main term, in more compact fashion. */ static void update_player_compact_subwindow(game_event_type type, game_event_data *data, void *user) { int row = 0; int col = 0; int i; term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Race and Class */ prt_field(p_ptr->race->name, row++, col); prt_field(p_ptr->class->name, row++, col); /* Title */ prt_title(row++, col); /* Level/Experience */ prt_level(row++, col); prt_exp(row++, col); /* Gold */ prt_gold(row++, col); /* Equippy chars */ prt_equippy(row++, col); /* All Stats */ for (i = 0; i < A_MAX; i++) prt_stat(i, row++, col); /* Empty row */ row++; /* Armor */ prt_ac(row++, col); /* Hitpoints */ prt_hp(row++, col); /* Spellpoints */ prt_sp(row++, col); /* Monster health */ prt_health(row++, col); Term_fresh(); /* Restore */ Term_activate(old); } static void flush_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *t = user; /* Activate */ Term_activate(t); Term_fresh(); /* Restore */ Term_activate(old); } static void subwindow_flag_changed(int win_idx, u32b flag, bool new_state) { void (*register_or_deregister)(game_event_type type, game_event_handler *fn, void *user); void (*set_register_or_deregister)(game_event_type *type, size_t n_events, game_event_handler *fn, void *user); /* Decide whether to register or deregister an evenrt handler */ if (new_state == FALSE) { register_or_deregister = event_remove_handler; set_register_or_deregister = event_remove_handler_set; } else { register_or_deregister = event_add_handler; set_register_or_deregister = event_add_handler_set; } switch (flag) { case PW_INVEN: { register_or_deregister(EVENT_INVENTORY, update_inven_subwindow, angband_term[win_idx]); break; } case PW_EQUIP: { register_or_deregister(EVENT_EQUIPMENT, update_equip_subwindow, angband_term[win_idx]); break; } case PW_PLAYER_0: { set_register_or_deregister(player_events, N_ELEMENTS(player_events), update_player0_subwindow, angband_term[win_idx]); break; } case PW_PLAYER_1: { set_register_or_deregister(player_events, N_ELEMENTS(player_events), update_player1_subwindow, angband_term[win_idx]); break; } case PW_PLAYER_2: { set_register_or_deregister(player_events, N_ELEMENTS(player_events), update_player_compact_subwindow, angband_term[win_idx]); break; } case PW_MAP: { register_or_deregister(EVENT_MAP, update_maps, angband_term[win_idx]); register_or_deregister(EVENT_END, flush_subwindow, angband_term[win_idx]); break; } case PW_MESSAGE: { register_or_deregister(EVENT_MESSAGE, update_messages_subwindow, angband_term[win_idx]); break; } case PW_OVERHEAD: { minimap_data[win_idx].win_idx = win_idx; register_or_deregister(EVENT_MAP, update_minimap_subwindow, &minimap_data[win_idx]); register_or_deregister(EVENT_END, update_minimap_subwindow, &minimap_data[win_idx]); break; } case PW_MONSTER: { register_or_deregister(EVENT_MONSTERTARGET, update_monster_subwindow, angband_term[win_idx]); break; } case PW_OBJECT: { register_or_deregister(EVENT_OBJECTTARGET, update_object_subwindow, angband_term[win_idx]); break; } case PW_MONLIST: { register_or_deregister(EVENT_MONSTERLIST, update_monlist_subwindow, angband_term[win_idx]); break; } case PW_ITEMLIST: { register_or_deregister(EVENT_ITEMLIST, update_itemlist_subwindow, angband_term[win_idx]); break; } } } /* * Set the flags for one Term, calling "subwindow_flag_changed" with each flag that * has changed setting so that it can do any housekeeping to do with * siaplying hte new thing or no longer displaying the old one. */ static void subwindow_set_flags(int win_idx, u32b new_flags) { term *old = Term; int i; /* Deal with the changed flags by seeing what's changed */ for (i = 0; i < 32; i++) { /* Only process valid flags */ if (window_flag_desc[i]) { if ((new_flags & (1L << i)) != (op_ptr->window_flag[win_idx] & (1L << i))) { subwindow_flag_changed(win_idx, (1L << i), (new_flags & (1L << i)) != 0); } } } /* Store the new flags */ op_ptr->window_flag[win_idx] = new_flags; /* Activate */ Term_activate(angband_term[win_idx]); /* Erase */ Term_clear(); /* Refresh */ Term_fresh(); /* Restore */ Term_activate(old); } /* * Called with an array of the new flags for all the subwindows, in order * to set them to the new values, with a chance to perform housekeeping. */ void subwindows_set_flags(u32b *new_flags, size_t n_subwindows) { size_t j; for (j = 0; j < n_subwindows; j++) { /* Dead window */ if (!angband_term[j]) continue; /* Ignore non-changes */ if (op_ptr->window_flag[j] != new_flags[j]) { subwindow_set_flags(j, new_flags[j]); } } } /* ------------------------------------------------------------------------ * Showing and updating the splash screen. * ------------------------------------------------------------------------ */ /* * Hack -- Explain a broken "lib" folder and quit (see below). */ static void init_angband_aux(const char *why) { quit_fmt("%s\n\n%s", why, "The 'lib' directory is probably missing or broken.\n" "Perhaps the archive was not extracted correctly.\n" "See the 'readme.txt' file for more information."); } /* * Hack -- take notes on line 23 */ static void splashscreen_note(game_event_type type, game_event_data *data, void *user) { Term_erase(0, 23, 255); Term_putstr(20, 23, -1, TERM_WHITE, format("[%s]", data->string)); Term_fresh(); } static void show_splashscreen(game_event_type type, game_event_data *data, void *user) { ang_file *fp; char buf[1024]; /*** Verify the "news" file ***/ path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news.txt"); if (!file_exists(buf)) { char why[1024]; /* Crash and burn */ strnfmt(why, sizeof(why), "Cannot access the '%s' file!", buf); init_angband_aux(why); } /*** Display the "news" file ***/ Term_clear(); /* Open the News file */ path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news.txt"); fp = file_open(buf, MODE_READ, -1); text_out_hook = text_out_to_screen; /* Dump */ if (fp) { /* Dump the file to the screen */ while (file_getl(fp, buf, sizeof(buf))) { char *version_marker = strstr(buf, "$VERSION"); if (version_marker) { ptrdiff_t pos = version_marker - buf; strnfmt(version_marker, sizeof(buf) - pos, "%-8s", buildver); } text_out_e("%s", buf); text_out("\n"); } file_close(fp); } /* Flush it */ Term_fresh(); } /* ------------------------------------------------------------------------ * Temporary (hopefully) hackish solutions. * ------------------------------------------------------------------------ */ static void check_panel(game_event_type type, game_event_data *data, void *user) { verify_panel(); } static void see_floor_items(game_event_type type, game_event_data *data, void *user) { int py = p_ptr->py; int px = p_ptr->px; size_t floor_num = 0; int floor_list[MAX_FLOOR_STACK + 1]; bool blind = ((p_ptr->timed[TMD_BLIND]) || (no_light())); const char *p = "see"; int can_pickup = 0; size_t i; /* Scan all marked objects in the grid */ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), py, px, 0x03); if (floor_num == 0) return; for (i = 0; i < floor_num; i++) can_pickup += inven_carry_okay(object_byid(floor_list[i])); /* One object */ if (floor_num == 1) { /* Get the object */ object_type *o_ptr = object_byid(floor_list[0]); char o_name[80]; if (!can_pickup) p = "have no room for"; else if (blind) p = "feel"; /* Describe the object. Less detail if blind. */ if (blind) object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_BASE); else object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ message_flush(); msg("You %s %s.", p, o_name); } else { ui_event e; if (!can_pickup) p = "have no room for the following objects"; else if (blind) p = "feel something on the floor"; /* Display objects on the floor */ screen_save(); show_floor(floor_list, floor_num, (OLIST_WEIGHT)); prt(format("You %s: ", p), 0, 0); /* Wait for it. Use key as next command. */ e = inkey_ex(); Term_event_push(&e); /* Restore screen */ screen_load(); } } extern game_event_handler ui_enter_birthscreen; /* ------------------------------------------------------------------------ * Initialising * ------------------------------------------------------------------------ */ static void ui_enter_init(game_event_type type, game_event_data *data, void *user) { show_splashscreen(type, data, user); /* Set up our splashscreen handlers */ event_add_handler(EVENT_INITSTATUS, splashscreen_note, NULL); } static void ui_leave_init(game_event_type type, game_event_data *data, void *user) { /* Remove our splashscreen handlers */ event_remove_handler(EVENT_INITSTATUS, splashscreen_note, NULL); } static void ui_enter_game(game_event_type type, game_event_data *data, void *user) { /* Because of the "flexible" sidebar, all these things trigger the same function. */ event_add_handler_set(player_events, N_ELEMENTS(player_events), update_sidebar, NULL); /* The flexible statusbar has similar requirements, so is also trigger by a large set of events. */ event_add_handler_set(statusline_events, N_ELEMENTS(statusline_events), update_statusline, NULL); /* Player HP can optionally change the colour of the '@' now. */ event_add_handler(EVENT_HP, hp_colour_change, NULL); /* Simplest way to keep the map up to date - will do for now */ event_add_handler(EVENT_MAP, update_maps, angband_term[0]); #if 0 event_add_handler(EVENT_MAP, trace_map_updates, angband_term[0]); #endif /* Check if the panel should shift when the player's moved */ event_add_handler(EVENT_PLAYERMOVED, check_panel, NULL); event_add_handler(EVENT_SEEFLOOR, see_floor_items, NULL); } static void ui_leave_game(game_event_type type, game_event_data *data, void *user) { /* Because of the "flexible" sidebar, all these things trigger the same function. */ event_remove_handler_set(player_events, N_ELEMENTS(player_events), update_sidebar, NULL); /* The flexible statusbar has similar requirements, so is also trigger by a large set of events. */ event_remove_handler_set(statusline_events, N_ELEMENTS(statusline_events), update_statusline, NULL); /* Player HP can optionally change the colour of the '@' now. */ event_remove_handler(EVENT_HP, hp_colour_change, NULL); /* Simplest way to keep the map up to date - will do for now */ event_remove_handler(EVENT_MAP, update_maps, angband_term[0]); #if 0 event_remove_handler(EVENT_MAP, trace_map_updates, angband_term[0]); #endif /* Check if the panel should shift when the player's moved */ event_remove_handler(EVENT_PLAYERMOVED, check_panel, NULL); event_remove_handler(EVENT_SEEFLOOR, see_floor_items, NULL); } errr textui_get_cmd(cmd_context context, bool wait) { if (context == CMD_BIRTH) return get_birth_command(wait); else if (context == CMD_GAME) textui_process_command(!wait); /* If we've reached here, we haven't got a command. */ return 1; } void init_display(void) { event_add_handler(EVENT_ENTER_INIT, ui_enter_init, NULL); event_add_handler(EVENT_LEAVE_INIT, ui_leave_init, NULL); event_add_handler(EVENT_ENTER_GAME, ui_enter_game, NULL); event_add_handler(EVENT_LEAVE_GAME, ui_leave_game, NULL); ui_init_birthstate_handlers(); } /* Return a random hint from the global hints list */ char* random_hint(void) { struct hint *v, *r = NULL; int n; for (v = hints, n = 1; v; v = v->next, n++) if (one_in_(n)) r = v; return r->hint; } angband-v3.3.2/src/main-test.c0000644000175000017500000001500011651552410015437 0ustar chriscchrisc/* * File: main-test.c * Purpose: Pseudo-UI for end-to-end testing. * * Copyright (c) 2011 Elly * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "birth.h" #include "buildid.h" #ifdef USE_TEST static int prompt = 0; static int verbose = 0; static int nextkey = 0; static void c_key(char *rest) { if (!strcmp(rest, "left")) { nextkey = ARROW_LEFT; } else if (!strcmp(rest, "right")) { nextkey = ARROW_RIGHT; } else if (!strcmp(rest, "up")) { nextkey = ARROW_UP; } else if (!strcmp(rest, "down")) { nextkey = ARROW_DOWN; } else if (!strcmp(rest, "space")) { nextkey = ' '; } else if (!strcmp(rest, "enter")) { nextkey = '\n'; } else if (rest[0] == 'C' && rest[1] == '-') { nextkey = KTRL(rest[2]); } else { nextkey = rest[0]; } } static void c_noop(char *rest) { } static void c_quit(char *rest) { quit(NULL); } static void c_verbose(char *rest) { if (rest && !strcmp(rest, "0")) { printf("cmd-verbose: off\n"); verbose = 0; } else { printf("cmd-verbose: on\n"); verbose = 1; } } static void c_version(char *rest) { printf("cmd-version: %s %s\n", VERSION_NAME, VERSION_STRING); } /* Player commands */ static void c_player_birth(char *rest) { char *sex = strtok(rest, " "); char *race = strtok(NULL, " "); char *class = strtok(NULL, " "); int i; struct player_class *c; struct player_race *r; if (!sex) sex = "Female"; if (!race) race = "Human"; if (!class) class = "Warrior"; for (i = 0; i < MAX_SEXES; i++) { if (!strcmp(sex, sex_info[i].title)) { p_ptr->psex = i; break; } } if (i == MAX_SEXES) { printf("player-birth: bad sex '%s'\n", sex); return; } for (r = races; r; r = r->next) if (!strcmp(race, r->name)) break; if (!r) { printf("player-birth: bad race '%s'\n", race); return; } for (c = classes; c; c = c->next) if (!strcmp(class, c->name)) break; if (!c) { printf("player-birth: bad class '%s'\n", class); return; } player_generate(p_ptr, NULL, r, c); } static void c_player_class(char *rest) { printf("player-class: %s\n", p_ptr->class->name); } static void c_player_race(char *rest) { printf("player-race: %s\n", p_ptr->race->name); } static void c_player_sex(char *rest) { printf("player-sex: %s\n", p_ptr->sex->title); } typedef struct { const char *name; void (*func)(char *args); } test_cmd; static test_cmd cmds[] = { { "#", c_noop }, { "key", c_key }, { "noop", c_noop }, { "quit", c_quit }, { "verbose", c_verbose }, { "version?", c_version }, { "player-birth", c_player_birth }, { "player-class?", c_player_class }, { "player-race?", c_player_race }, { "player-sex?", c_player_sex }, { NULL, NULL } }; static errr test_docmd(void) { char buf[1024]; char *cmd; char *rest; int i; memset(buf, 0, sizeof(buf)); if (prompt) { printf("test> "); fflush(stdout); } if (!fgets(buf, sizeof(buf), stdin)) { return -1; } if (strchr(buf, '\n')) { *strchr(buf, '\n') = '\0'; } if (verbose) printf("test-docmd: %s\n", buf); cmd = strtok(buf, " "); if (!cmd) return 0; rest = strtok(NULL, ""); for (i = 0; cmds[i].name; i++) { if (!strcmp(cmds[i].name, cmd)) { cmds[i].func(rest); return 0; } } return 0; } typedef struct term_data term_data; struct term_data { term t; }; static term_data td; typedef struct { int key; errr (*func)(int v); } term_xtra_func; static void term_init_test(term *t) { if (verbose) printf("term-init %s %s\n", VERSION_NAME, VERSION_STRING); } static void term_nuke_test(term *t) { if (verbose) printf("term-end\n"); } static errr term_xtra_clear(int v) { if (verbose) printf("term-xtra-clear %d\n", v); return 0; } static errr term_xtra_noise(int v) { if (verbose) printf("term-xtra-noise %d\n", v); return 0; } static errr term_xtra_fresh(int v) { if (verbose) printf("term-xtra-fresh %d\n", v); return 0; } static errr term_xtra_shape(int v) { if (verbose) printf("term-xtra-shape %d\n", v); return 0; } static errr term_xtra_alive(int v) { if (verbose) printf("term-xtra-alive %d\n", v); return 0; } static errr term_xtra_event(int v) { if (verbose) printf("term-xtra-event %d\n", v); if (nextkey) { Term_keypress(nextkey, 0); nextkey = 0; } return test_docmd(); } static errr term_xtra_flush(int v) { if (verbose) printf("term-xtra-flush %d\n", v); return 0; } static errr term_xtra_delay(int v) { if (verbose) printf("term-xtra-delay %d\n", v); return 0; } static errr term_xtra_react(int v) { if (verbose) printf("term-xtra-react\n"); return 0; } static term_xtra_func xtras[] = { { TERM_XTRA_CLEAR, term_xtra_clear }, { TERM_XTRA_NOISE, term_xtra_noise }, { TERM_XTRA_FRESH, term_xtra_fresh }, { TERM_XTRA_SHAPE, term_xtra_shape }, { TERM_XTRA_ALIVE, term_xtra_alive }, { TERM_XTRA_EVENT, term_xtra_event }, { TERM_XTRA_FLUSH, term_xtra_flush }, { TERM_XTRA_DELAY, term_xtra_delay }, { TERM_XTRA_REACT, term_xtra_react }, { 0, NULL }, }; static errr term_xtra_test(int n, int v) { int i; for (i = 0; xtras[i].func; i++) { if (xtras[i].key == n) { return xtras[i].func(v); } } if (verbose) printf("term-xtra-unknown %d %d\n", n, v); return 0; } static errr term_curs_test(int x, int y) { if (verbose) printf("term-curs %d %d\n", x, y); return 0; } static errr term_wipe_test(int x, int y, int n) { if (verbose) printf("term-wipe %d %d %d\n", x, y, n); return 0; } static errr term_text_test(int x, int y, int n, byte a, const char *s) { if (verbose) printf("term-text %d %d %d %02x %s\n", x, y, n, a, s); return 0; } static void term_data_link(int i) { term *t = &td.t; term_init(t, 80, 24, 256); t->init_hook = term_init_test; t->nuke_hook = term_nuke_test; t->xtra_hook = term_xtra_test; t->curs_hook = term_curs_test; t->wipe_hook = term_wipe_test; t->text_hook = term_text_test; t->data = &td; Term_activate(t); angband_term[i] = t; } const char help_test[] = "Test mode, subopts -p(rompt)"; errr init_test(int argc, char *argv[]) { int i; /* Skip over argv[0] */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-p")) { prompt = 1; continue; } printf("init-test: bad argument '%s'\n", argv[i]); } term_data_link(0); return 0; } #endif angband-v3.3.2/src/parser.h0000644000175000017500000001117511651552410015050 0ustar chriscchrisc/** Init file parser library * * The basic structure of the parser is as follows: there is a table of hooks * which are run when a directive matching their format is encountered. When the * hook is called, all the arguments it declares in its format have been parsed * out and can be accessed with parser_get*(). See the unit tests for examples. */ #ifndef PARSER_H #define PARSER_H #include "h-basic.h" #include "z-bitflag.h" #include "z-rand.h" struct parser; enum parser_error { PARSE_ERROR_NONE = 0, PARSE_ERROR_GENERIC, PARSE_ERROR_INVALID_FLAG, PARSE_ERROR_INVALID_ITEM_NUMBER, PARSE_ERROR_INVALID_SPELL_FREQ, PARSE_ERROR_INVALID_VALUE, PARSE_ERROR_INVALID_COLOR, PARSE_ERROR_INVALID_EFFECT, PARSE_ERROR_INVALID_OPTION, PARSE_ERROR_MISSING_FIELD, PARSE_ERROR_MISSING_RECORD_HEADER, PARSE_ERROR_FIELD_TOO_LONG, PARSE_ERROR_NON_SEQUENTIAL_RECORDS, PARSE_ERROR_NOT_NUMBER, PARSE_ERROR_NOT_RANDOM, PARSE_ERROR_OBSOLETE_FILE, PARSE_ERROR_OUT_OF_BOUNDS, PARSE_ERROR_OUT_OF_MEMORY, PARSE_ERROR_TOO_FEW_ENTRIES, PARSE_ERROR_TOO_MANY_ENTRIES, PARSE_ERROR_UNDEFINED_DIRECTIVE, PARSE_ERROR_UNRECOGNISED_BLOW, PARSE_ERROR_UNRECOGNISED_TVAL, PARSE_ERROR_UNRECOGNISED_SVAL, PARSE_ERROR_VAULT_TOO_BIG, PARSE_ERROR_INTERNAL, PARSE_ERROR_MAX }; struct parser_state { enum parser_error error; unsigned int line; unsigned int col; char *msg; }; struct file_parser { const char *name; struct parser *(*init)(void); errr (*run)(struct parser *p); errr (*finish)(struct parser *p); void (*cleanup)(void); }; extern const char *parser_error_str[PARSE_ERROR_MAX]; /** Allocates a new parser. */ extern struct parser *parser_new(void); /** Parses the provided line. * * This runs the first parser hook registered with `p` that matches `line`. */ extern enum parser_error parser_parse(struct parser *p, const char *line); /** Destroys a parser. */ extern void parser_destroy(struct parser *p); /** Gets parser's private data. */ extern void *parser_priv(struct parser *p); /** Sets parser's private data. * * This is commonly used to store context for stateful parsing. */ extern void parser_setpriv(struct parser *p, void *v); /** Registers a parser hook. * * Hooks have the following format: * ::= [ ]* [? ]* * ::= int | str | sym | rand | char * The first is called the directive for this hook. Any other hooks with * the same directive are superseded by this hook. It is an error for a * mandatory field to follow an optional field. It is an error for any field to * follow a field of type `str`, since `str` fields are not delimited and will * consume the entire rest of the line. */ extern errr parser_reg(struct parser *p, const char *fmt, enum parser_error (*func)(struct parser *p)); /** A placeholder parse hook indicating a value is ignored */ extern enum parser_error ignored(struct parser *p); /** Returns whether the parser has a value named `name`. * * Used to test for presence of optional values. */ extern bool parser_hasval(struct parser *p, const char *name); /** Returns the symbol named `name`. This symbol must exist. */ extern const char *parser_getsym(struct parser *p, const char *name); /** Returns the string named `name`. This symbol must exist. */ extern const char *parser_getstr(struct parser *p, const char *name); /** Returns the integer named `name`. This symbol must exist. */ extern int parser_getint(struct parser *p, const char *name); /** Returns the unsigned integer named `name`. This symbol must exist. */ extern unsigned int parser_getuint(struct parser *p, const char *name); /** Returns the random value named `name`. This symbol must exist. */ extern struct random parser_getrand(struct parser *p, const char *name); /** Returns the character named `name`. This symbol must exist. */ extern char parser_getchar(struct parser *p, const char *name); /** Fills the provided struct with the parser's state, if any. Returns true if * the parser is in an error state, and false otherwise. */ extern int parser_getstate(struct parser *p, struct parser_state *s); /** Sets the parser's detailed error description and field number. */ extern void parser_setstate(struct parser *p, unsigned int col, const char *msg); errr run_parser(struct file_parser *fp); errr parse_file(struct parser *p, const char *filename); void cleanup_parser(struct file_parser *fp); int lookup_flag(const char **flag_table, const char *flag_name); errr grab_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name); errr remove_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name); #endif /* !PARSER_H */ angband-v3.3.2/src/z-type.c0000644000175000017500000000342711651552410015000 0ustar chriscchrisc/* * File: z-type.c * Purpose: Support various data types. * * Copyright (c) 2007 Angband Developers * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "h-basic.h" #include "z-form.h" #include "z-term.h" #include "ui.h" #include "z-type.h" #include "z-virt.h" #define TYPE_FUN(v2u, tv, T, v) \ type_union v2u(T v) { \ type_union r; \ r.u.v = v; \ r.t = tv; \ return r; \ } TYPE_FUN(i2u, T_INT, int, i) TYPE_FUN(c2u, T_CHAR, char, c) TYPE_FUN(f2u, T_FLOAT, float, f) TYPE_FUN(s2u, T_STRING, const char *, s) struct loc loc(int x, int y) { struct loc p; p.x = x; p.y = y; return p; } /* * Utility functions to work with point_sets */ struct point_set *point_set_new(int initial_size) { struct point_set *ps = mem_alloc(sizeof(struct point_set)); ps->n = 0; ps->allocated = initial_size; ps->pts = mem_zalloc(sizeof(*(ps->pts)) * ps->allocated); return ps; } void point_set_dispose(struct point_set *ps) { mem_free(ps->pts); mem_free(ps); } /* Add the point to the given point set, making more space if there is * no more space left. */ void add_to_point_set(struct point_set *ps, int y, int x) { ps->pts[ps->n].x = x; ps->pts[ps->n].y = y; ps->n++; if (ps->n >= ps->allocated) { ps->allocated *= 2; ps->pts = mem_realloc(ps->pts, sizeof(*(ps->pts)) * ps->allocated); } } int point_set_size(struct point_set *ps) { return ps->n; } angband-v3.3.2/src/prefs.h0000644000175000017500000000105411651552410014666 0ustar chriscchrisc/* prefs.h - prefs interface */ #ifndef PREFS_H #define PREFS_H void autoinsc_dump(ang_file *fff); void squelch_dump(ang_file *fff); void option_dump(ang_file *fff); void dump_monsters(ang_file *fff); void dump_objects(ang_file *fff); void dump_features(ang_file *fff); void dump_flavors(ang_file *fff); void dump_colors(ang_file *fff); bool prefs_save(const char *path, void (*dump)(ang_file *), const char *title); errr process_pref_file_command(const char *buf); bool process_pref_file(const char *name, bool quiet, bool user); #endif /* !PREFS_H */ angband-v3.3.2/src/game-cmd.c0000644000175000017500000004610511651552410015222 0ustar chriscchrisc/* * File: game-cmd.c * Purpose: Handles the queueing of game commands. * * Copyright (c) 2008-9 Antony Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "game-cmd.h" #include "object/object.h" #include "object/tvalsval.h" #include "spells.h" #include "target.h" errr (*cmd_get_hook)(cmd_context c, bool wait); #define CMD_QUEUE_SIZE 20 #define prev_cmd_idx(idx) ((idx + CMD_QUEUE_SIZE - 1) % CMD_QUEUE_SIZE) static int cmd_head = 0; static int cmd_tail = 0; static game_command cmd_queue[CMD_QUEUE_SIZE]; static bool repeat_prev_allowed = FALSE; static bool repeating = FALSE; /* A simple list of commands and their handling functions. */ static struct { cmd_code cmd; enum cmd_arg_type arg_type[CMD_MAX_ARGS]; cmd_handler_fn fn; bool repeat_allowed; int auto_repeat_n; } game_cmds[] = { { CMD_LOADFILE, { arg_NONE }, NULL, FALSE, 0 }, { CMD_NEWGAME, { arg_NONE }, NULL, FALSE, 0 }, { CMD_BIRTH_RESET, { arg_NONE }, NULL, FALSE, 0 }, { CMD_CHOOSE_SEX, { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_CHOOSE_RACE, { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_CHOOSE_CLASS, { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_FINALIZE_OPTIONS, { arg_CHOICE }, NULL, FALSE }, { CMD_BUY_STAT, { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_SELL_STAT, { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_RESET_STATS, { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_ROLL_STATS, { arg_NONE }, NULL, FALSE, 0 }, { CMD_PREV_STATS, { arg_NONE }, NULL, FALSE, 0 }, { CMD_NAME_CHOICE, { arg_STRING }, NULL, FALSE, 0 }, { CMD_ACCEPT_CHARACTER, { arg_NONE }, NULL, FALSE, 0 }, { CMD_GO_UP, { arg_NONE }, do_cmd_go_up, FALSE, 0 }, { CMD_GO_DOWN, { arg_NONE }, do_cmd_go_down, FALSE, 0 }, { CMD_SEARCH, { arg_NONE }, do_cmd_search, TRUE, 10 }, { CMD_TOGGLE_SEARCH, { arg_NONE }, do_cmd_toggle_search, FALSE, 0 }, { CMD_WALK, { arg_DIRECTION }, do_cmd_walk, TRUE, 0 }, { CMD_RUN, { arg_DIRECTION }, do_cmd_run, FALSE, 0 }, { CMD_JUMP, { arg_DIRECTION }, do_cmd_jump, FALSE, 0 }, { CMD_OPEN, { arg_DIRECTION }, do_cmd_open, TRUE, 99 }, { CMD_CLOSE, { arg_DIRECTION }, do_cmd_close, TRUE, 99 }, { CMD_TUNNEL, { arg_DIRECTION }, do_cmd_tunnel, TRUE, 99 }, { CMD_HOLD, { arg_NONE }, do_cmd_hold, TRUE, 0 }, { CMD_DISARM, { arg_DIRECTION }, do_cmd_disarm, TRUE, 99 }, { CMD_BASH, { arg_DIRECTION }, do_cmd_bash, TRUE, 99 }, { CMD_ALTER, { arg_DIRECTION }, do_cmd_alter, TRUE, 99 }, { CMD_JAM, { arg_DIRECTION }, do_cmd_spike, FALSE, 0 }, { CMD_REST, { arg_CHOICE }, do_cmd_rest, FALSE, 0 }, { CMD_PATHFIND, { arg_POINT }, do_cmd_pathfind, FALSE, 0 }, { CMD_PICKUP, { arg_ITEM }, do_cmd_pickup, FALSE, 0 }, { CMD_AUTOPICKUP, { arg_NONE }, do_cmd_autopickup, FALSE, 0 }, { CMD_WIELD, { arg_ITEM, arg_NUMBER }, do_cmd_wield, FALSE, 0 }, { CMD_TAKEOFF, { arg_ITEM }, do_cmd_takeoff, FALSE, 0 }, { CMD_DROP, { arg_ITEM, arg_NUMBER }, do_cmd_drop, FALSE, 0 }, { CMD_UNINSCRIBE, { arg_ITEM }, do_cmd_uninscribe, FALSE, 0 }, { CMD_EAT, { arg_ITEM }, do_cmd_use, FALSE, 0 }, { CMD_QUAFF, { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_USE_ROD, { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_USE_STAFF, { arg_ITEM }, do_cmd_use, FALSE, 0 }, { CMD_USE_WAND, { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_READ_SCROLL, { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_ACTIVATE, { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_REFILL, { arg_ITEM }, do_cmd_refill, FALSE, 0 }, { CMD_FIRE, { arg_ITEM, arg_TARGET }, do_cmd_fire, FALSE, 0 }, { CMD_THROW, { arg_ITEM, arg_TARGET }, do_cmd_throw, FALSE, 0 }, { CMD_DESTROY, { arg_ITEM }, do_cmd_destroy, FALSE, 0 }, { CMD_ENTER_STORE, { arg_NONE }, do_cmd_store, FALSE, 0 }, { CMD_INSCRIBE, { arg_ITEM, arg_STRING }, do_cmd_inscribe, FALSE, 0 }, { CMD_STUDY_SPELL, { arg_CHOICE }, do_cmd_study_spell, FALSE, 0 }, { CMD_STUDY_BOOK, { arg_ITEM }, do_cmd_study_book, FALSE, 0 }, { CMD_CAST, { arg_CHOICE, arg_TARGET }, do_cmd_cast, FALSE, 0 }, { CMD_SELL, { arg_ITEM, arg_NUMBER }, do_cmd_sell, FALSE, 0 }, { CMD_STASH, { arg_ITEM, arg_NUMBER }, do_cmd_stash, FALSE, 0 }, { CMD_BUY, { arg_CHOICE, arg_NUMBER }, do_cmd_buy, FALSE, 0 }, { CMD_RETRIEVE, { arg_CHOICE, arg_NUMBER }, do_cmd_retrieve, FALSE, 0 }, { CMD_SUICIDE, { arg_NONE }, do_cmd_suicide, FALSE, 0 }, { CMD_SAVE, { arg_NONE }, do_cmd_save_game, FALSE, 0 }, { CMD_QUIT, { arg_NONE }, do_cmd_quit, FALSE, 0 }, { CMD_HELP, { arg_NONE }, NULL, FALSE, 0 }, { CMD_REPEAT, { arg_NONE }, NULL, FALSE, 0 }, }; /* Item selector type (everything required for get_item()) */ struct item_selector { cmd_code command; const char *prompt; const char *noop; bool (*filter)(const object_type *o_ptr); int mode; }; /** List of requirements for various commands' objects */ struct item_selector item_selector[] = { { CMD_INSCRIBE, "Inscribe which item? ", "You have nothing to inscribe.", NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR | IS_HARMLESS) }, { CMD_UNINSCRIBE, "Un-inscribe which item? ", "You have nothing to un-inscribe.", obj_has_inscrip, (USE_EQUIP | USE_INVEN | USE_FLOOR) }, { CMD_WIELD, "Wear/wield which item? ", "You have nothing you can wear or wield.", obj_can_wear, (USE_INVEN | USE_FLOOR) }, { CMD_TAKEOFF, "Take off which item? ", "You are not wearing anything you can take off.", obj_can_takeoff, USE_EQUIP }, { CMD_DROP, "Drop which item? ", "You have nothing to drop.", NULL, (USE_EQUIP | USE_INVEN) }, { CMD_FIRE, "Fire which item? ", "You have nothing to fire.", obj_can_fire, (USE_INVEN | USE_EQUIP | USE_FLOOR | QUIVER_TAGS) }, { CMD_USE_STAFF, "Use which staff? ", "You have no staff to use.", obj_is_staff, (USE_INVEN | USE_FLOOR | SHOW_FAIL) }, { CMD_USE_WAND, "Aim which wand? ", "You have no wand to aim.", obj_is_wand, (USE_INVEN | USE_FLOOR | SHOW_FAIL) }, { CMD_USE_ROD, "Zap which rod? ", "You have no charged rods to zap.", obj_is_rod, (USE_INVEN | USE_FLOOR | SHOW_FAIL) }, { CMD_ACTIVATE, "Activate which item? ", "You have nothing to activate.", obj_is_activatable, (USE_EQUIP | SHOW_FAIL) }, { CMD_EAT, "Eat which item? ", "You have nothing to eat.", obj_is_food, (USE_INVEN | USE_FLOOR) }, { CMD_QUAFF, "Quaff which potion? ", "You have no potions to quaff.", obj_is_potion, (USE_INVEN | USE_FLOOR) }, { CMD_READ_SCROLL, "Read which scroll? ", "You have no scrolls to read.", obj_is_scroll, (USE_INVEN | USE_FLOOR) }, { CMD_REFILL, "Refuel with what fuel source? ", "You have nothing to refuel with.", obj_can_refill, (USE_INVEN | USE_FLOOR) }, }; game_command *cmd_get_top(void) { return &cmd_queue[prev_cmd_idx(cmd_head)]; } /* * Insert the given command into the command queue. */ errr cmd_insert_s(game_command *cmd) { /* If queue full, return error */ if (cmd_head + 1 == cmd_tail) return 1; if (cmd_head + 1 == CMD_QUEUE_SIZE && cmd_tail == 0) return 1; /* Insert command into queue. */ if (cmd->command != CMD_REPEAT) { cmd_queue[cmd_head] = *cmd; } else { int cmd_prev = cmd_head - 1; if (!repeat_prev_allowed) return 1; /* If we're repeating a command, we duplicate the previous command in the next command "slot". */ if (cmd_prev < 0) cmd_prev = CMD_QUEUE_SIZE - 1; if (cmd_queue[cmd_prev].command != CMD_NULL) cmd_queue[cmd_head] = cmd_queue[cmd_prev]; } /* Advance point in queue, wrapping around at the end */ cmd_head++; if (cmd_head == CMD_QUEUE_SIZE) cmd_head = 0; return 0; } /* * Get the next game command, with 'wait' indicating whether we * are prepared to wait for a command or require a quick return with * no command. */ errr cmd_get(cmd_context c, game_command **cmd, bool wait) { /* If we're repeating, just pull the last command again. */ if (repeating) { *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; return 0; } /* If there are no commands queued, ask the UI for one. */ if (cmd_head == cmd_tail) cmd_get_hook(c, wait); /* If we have a command ready, set it and return success. */ if (cmd_head != cmd_tail) { *cmd = &cmd_queue[cmd_tail++]; if (cmd_tail == CMD_QUEUE_SIZE) cmd_tail = 0; return 0; } /* Failure to get a command. */ return 1; } /* Return the index of the given command in the command array. */ static int cmd_idx(cmd_code code) { size_t i; for (i = 0; i < N_ELEMENTS(game_cmds); i++) { if (game_cmds[i].cmd == code) return i; } return -1; } void cmd_set_arg_choice(game_command *cmd, int n, int choice) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_CHOICE); cmd->arg[n].choice = choice; cmd->arg_type[n] = arg_CHOICE; cmd->arg_present[n] = TRUE; } void cmd_set_arg_string(game_command *cmd, int n, const char *str) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_STRING); cmd->arg[n].string = string_make(str); cmd->arg_type[n] = arg_STRING; cmd->arg_present[n] = TRUE; } void cmd_set_arg_direction(game_command *cmd, int n, int dir) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_DIRECTION); cmd->arg[n].direction = dir; cmd->arg_type[n] = arg_DIRECTION; cmd->arg_present[n] = TRUE; } void cmd_set_arg_target(game_command *cmd, int n, int target) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_TARGET); cmd->arg[n].direction = target; cmd->arg_type[n] = arg_TARGET; cmd->arg_present[n] = TRUE; } void cmd_set_arg_point(game_command *cmd, int n, int x, int y) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_POINT); cmd->arg[n].point.x = x; cmd->arg[n].point.y = y; cmd->arg_type[n] = arg_POINT; cmd->arg_present[n] = TRUE; } void cmd_set_arg_item(game_command *cmd, int n, int item) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_ITEM); cmd->arg[n].item = item; cmd->arg_type[n] = arg_ITEM; cmd->arg_present[n] = TRUE; } void cmd_set_arg_number(game_command *cmd, int n, int num) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_NUMBER); cmd->arg[n].number = num; cmd->arg_type[n] = arg_NUMBER; cmd->arg_present[n] = TRUE; } /* * Inserts a command in the queue to be carried out, with the given * number of repeats. */ errr cmd_insert_repeated(cmd_code c, int nrepeats) { game_command cmd = { 0 }; if (cmd_idx(c) == -1) return 1; cmd.command = c; cmd.nrepeats = nrepeats; return cmd_insert_s(&cmd); } /* * Inserts a command in the queue to be carried out. */ errr cmd_insert(cmd_code c) { return cmd_insert_repeated(c, 0); } /* * Request a game command from the uI and carry out whatever actions * go along with it. */ void process_command(cmd_context ctx, bool no_request) { game_command *cmd; /* Reset so that when selecting items, we look in the default location */ p_ptr->command_wrk = 0; /* If we've got a command to process, do it. */ if (cmd_get(ctx, &cmd, !no_request) == 0) { int oldrepeats = cmd->nrepeats; int idx = cmd_idx(cmd->command); size_t i; if (idx == -1) return; for (i = 0; i < N_ELEMENTS(item_selector); i++) { struct item_selector *is = &item_selector[i]; if (is->command != cmd->command) continue; if (!cmd->arg_present[0]) { int item; item_tester_hook = is->filter; if (!get_item(&item, is->prompt, is->noop, cmd->command, is->mode)) return; cmd_set_arg_item(cmd, 0, item); } } /* XXX avoid dead objects from being re-used on repeat. * this needs to be expanded into a general safety-check * on args */ if ((game_cmds[idx].arg_type[0] == arg_ITEM) && cmd->arg_present[0]) { object_type *o_ptr = object_from_item_idx(cmd->arg[0].item); if (!o_ptr->kind) return; } /* Do some sanity checking on those arguments that might have been declared as "unknown", such as directions and targets. */ switch (cmd->command) { case CMD_INSCRIBE: { char o_name[80]; char tmp[80] = ""; object_type *o_ptr = object_from_item_idx(cmd->arg[0].item); object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); msg("Inscribing %s.", o_name); message_flush(); /* Use old inscription */ if (o_ptr->note) strnfmt(tmp, sizeof(tmp), "%s", quark_str(o_ptr->note)); /* Get a new inscription (possibly empty) */ if (!get_string("Inscription: ", tmp, sizeof(tmp))) return; cmd_set_arg_string(cmd, 1, tmp); break; } case CMD_OPEN: { if (OPT(easy_open) && (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN)) { int y, x; int n_closed_doors, n_locked_chests; n_closed_doors = count_feats(&y, &x, cave_iscloseddoor, FALSE); n_locked_chests = count_chests(&y, &x, FALSE); if (n_closed_doors + n_locked_chests == 1) cmd_set_arg_direction(cmd, 0, coords_to_dir(y, x)); } goto get_dir; } case CMD_CLOSE: { if (OPT(easy_open) && (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN)) { int y, x; /* Count open doors */ if (count_feats(&y, &x, cave_isopendoor, FALSE) == 1) cmd_set_arg_direction(cmd, 0, coords_to_dir(y, x)); } goto get_dir; } case CMD_DISARM: { if (OPT(easy_open) && (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN)) { int y, x; int n_visible_traps, n_trapped_chests; n_visible_traps = count_feats(&y, &x, cave_isknowntrap, TRUE); n_trapped_chests = count_chests(&y, &x, TRUE); if (n_visible_traps + n_trapped_chests == 1) cmd_set_arg_direction(cmd, 0, coords_to_dir(y, x)); } goto get_dir; } case CMD_TUNNEL: case CMD_WALK: case CMD_RUN: case CMD_JUMP: case CMD_BASH: case CMD_ALTER: case CMD_JAM: { get_dir: /* Direction hasn't been specified, so we ask for one. */ if (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN) { int dir; if (!get_rep_dir(&dir)) return; cmd_set_arg_direction(cmd, 0, dir); } break; } case CMD_DROP: { if (!cmd->arg_present[1]) { object_type *o_ptr = object_from_item_idx(cmd->arg[0].item); int amt = get_quantity(NULL, o_ptr->number); if (amt <= 0) return; cmd_set_arg_number(cmd, 1, amt); } break; } /* * These take an item number and a "target" as arguments, * though a target isn't always actually needed, so we'll * only prompt for it via callback if the item being used needs it. */ case CMD_USE_WAND: case CMD_USE_ROD: case CMD_QUAFF: case CMD_ACTIVATE: case CMD_READ_SCROLL: case CMD_FIRE: case CMD_THROW: { bool get_target = FALSE; object_type *o_ptr = object_from_item_idx(cmd->arg[0].choice); /* If we couldn't resolve the item, then abort this */ if (!o_ptr->kind) break; /* Thrown objects always need an aim, others might, depending * on the object */ if (obj_needs_aim(o_ptr) || cmd->command == CMD_THROW) { if (!cmd->arg_present[1]) get_target = TRUE; if (cmd->arg[1].direction == DIR_UNKNOWN) get_target = TRUE; if (cmd->arg[1].direction == DIR_TARGET && !target_okay()) get_target = TRUE; } if (get_target && !get_aim_dir(&cmd->arg[1].direction)) return; player_confuse_dir(p_ptr, &cmd->arg[1].direction, FALSE); cmd->arg_present[1] = TRUE; break; } /* This takes a choice and a direction. */ case CMD_CAST: { bool get_target = FALSE; if (spell_needs_aim(p_ptr->class->spell_book, cmd->arg[0].choice)) { if (!cmd->arg_present[1]) get_target = TRUE; if (cmd->arg[1].direction == DIR_UNKNOWN) get_target = TRUE; if (cmd->arg[1].direction == DIR_TARGET && !target_okay()) get_target = TRUE; } if (get_target && !get_aim_dir(&cmd->arg[1].direction)) return; player_confuse_dir(p_ptr, &cmd->arg[1].direction, FALSE); cmd->arg_present[1] = TRUE; break; } case CMD_WIELD: { object_type *o_ptr = object_from_item_idx(cmd->arg[0].choice); int slot = wield_slot(o_ptr); /* Usually if the slot is taken we'll just replace the item in the slot, * but in some cases we need to ask the user which slot they actually * want to replace */ if (p_ptr->inventory[slot].kind) { if (o_ptr->tval == TV_RING) { const char *q = "Replace which ring? "; const char *s = "Error in obj_wield, please report"; item_tester_hook = obj_is_ring; if (!get_item(&slot, q, s, CMD_WIELD, USE_EQUIP)) return; } if (obj_is_ammo(o_ptr) && !object_similar(&p_ptr->inventory[slot], o_ptr, OSTACK_QUIVER)) { const char *q = "Replace which ammunition? "; const char *s = "Error in obj_wield, please report"; item_tester_hook = obj_is_ammo; if (!get_item(&slot, q, s, CMD_WIELD, USE_EQUIP)) return; } } /* Set relevant slot */ cmd_set_arg_number(cmd, 1, slot); break; } default: { /* I can see the point of the compiler warning, but still... */ break; } } /* Command repetition */ if (game_cmds[idx].repeat_allowed) { /* Auto-repeat only if there isn't already a repeat length. */ if (game_cmds[idx].auto_repeat_n > 0 && cmd->nrepeats == 0) cmd_set_repeat(game_cmds[idx].auto_repeat_n); } else { cmd->nrepeats = 0; repeating = FALSE; } /* * The command gets to unset this if it isn't appropriate for * the user to repeat it. */ repeat_prev_allowed = TRUE; if (game_cmds[idx].fn) game_cmds[idx].fn(cmd->command, cmd->arg); /* If the command hasn't changed nrepeats, count this execution. */ if (cmd->nrepeats > 0 && oldrepeats == cmd_get_nrepeats()) cmd_set_repeat(oldrepeats - 1); } } /* * Remove any pending repeats from the current command. */ void cmd_cancel_repeat(void) { game_command *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; if (cmd->nrepeats || repeating) { /* Cancel */ cmd->nrepeats = 0; repeating = FALSE; /* Redraw the state (later) */ p_ptr->redraw |= (PR_STATE); } } /* * Update the number of repeats pending for the current command. */ void cmd_set_repeat(int nrepeats) { game_command *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; cmd->nrepeats = nrepeats; if (nrepeats) repeating = TRUE; else repeating = FALSE; /* Redraw the state (later) */ p_ptr->redraw |= (PR_STATE); } /* * Return the number of repeats pending for the current command. */ int cmd_get_nrepeats(void) { game_command *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; return cmd->nrepeats; } /* * Do not allow the current command to be repeated by the user using the * "repeat last command" command. */ void cmd_disable_repeat(void) { repeat_prev_allowed = FALSE; } angband-v3.3.2/src/files.c0000644000175000017500000012150511651552410014650 0ustar chriscchrisc/* * File: files.c * Purpose: Various file-related activities, poorly organised * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cave.h" #include "cmds.h" #include "files.h" #include "game-cmd.h" #include "history.h" #include "object/tvalsval.h" #include "object/pval.h" #include "option.h" #include "savefile.h" #include "ui-menu.h" #define MAX_PANEL 12 /* * Returns a "rating" of x depending on y, and sets "attr" to the * corresponding "attribute". */ static const char *likert(int x, int y, byte *attr) { /* Paranoia */ if (y <= 0) y = 1; /* Negative value */ if (x < 0) { *attr = TERM_RED; return ("Very Bad"); } /* Analyze the value */ switch ((x / y)) { case 0: case 1: { *attr = TERM_RED; return ("Bad"); } case 2: { *attr = TERM_RED; return ("Poor"); } case 3: case 4: { *attr = TERM_YELLOW; return ("Fair"); } case 5: { *attr = TERM_YELLOW; return ("Good"); } case 6: { *attr = TERM_YELLOW; return ("Very Good"); } case 7: case 8: { *attr = TERM_L_GREEN; return ("Excellent"); } case 9: case 10: case 11: case 12: case 13: { *attr = TERM_L_GREEN; return ("Superb"); } case 14: case 15: case 16: case 17: { *attr = TERM_L_GREEN; return ("Heroic"); } default: { *attr = TERM_L_GREEN; return ("Legendary"); } } } /* * Obtain the "flags" for the player as if he was an item */ void player_flags(bitflag f[OF_SIZE]) { /* Add racial flags */ memcpy(f, p_ptr->race->flags, sizeof(p_ptr->race->flags)); /* Some classes become immune to fear at a certain plevel */ if (player_has(PF_BRAVERY_30) && p_ptr->lev >= 30) of_on(f, OF_RES_FEAR); } /* * Equippy chars */ static void display_player_equippy(int y, int x) { int i; byte a; char c; object_type *o_ptr; /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; ++i) { /* Object */ o_ptr = &p_ptr->inventory[i]; /* Skip empty objects */ if (!o_ptr->kind) continue; /* Get attr/char for display */ a = object_attr(o_ptr); c = object_char(o_ptr); /* Dump */ if ((tile_width == 1) && (tile_height == 1)) { Term_putch(x+i-INVEN_WIELD, y, a, c); } } } /* * List of resistances and abilities to display */ #define RES_ROWS 9 struct player_flag_record { const char name[7]; /* Name of resistance/ability */ int res_flag; /* resistance flag bit */ int im_flag; /* corresponding immunity bit, if any */ int vuln_flag; /* corresponding vulnerability flag, if any */ }; static const struct player_flag_record player_flag_table[RES_ROWS*4] = { { "rAcid", OF_RES_ACID, OF_IM_ACID, OF_VULN_ACID }, { "rElec", OF_RES_ELEC, OF_IM_ELEC, OF_VULN_ELEC }, { "rFire", OF_RES_FIRE, OF_IM_FIRE, OF_VULN_FIRE }, { "rCold", OF_RES_COLD, OF_IM_COLD, OF_VULN_COLD }, { "rPois", OF_RES_POIS, FLAG_END, FLAG_END }, { "rLite", OF_RES_LIGHT, FLAG_END, FLAG_END }, { "rDark", OF_RES_DARK, FLAG_END, FLAG_END }, { "Sound", OF_RES_SOUND, FLAG_END, FLAG_END }, { "Shard", OF_RES_SHARD, FLAG_END, FLAG_END }, { "Nexus", OF_RES_NEXUS, FLAG_END, FLAG_END }, { "Nethr", OF_RES_NETHR, FLAG_END, FLAG_END }, { "Chaos", OF_RES_CHAOS, FLAG_END, FLAG_END }, { "Disen", OF_RES_DISEN, FLAG_END, FLAG_END }, { "Feath", OF_FEATHER, FLAG_END, FLAG_END }, { "pFear", OF_RES_FEAR, FLAG_END, FLAG_END }, { "pBlnd", OF_RES_BLIND, FLAG_END, FLAG_END }, { "pConf", OF_RES_CONFU, FLAG_END, FLAG_END }, { "pStun", OF_RES_STUN, FLAG_END, FLAG_END }, { "Light", OF_LIGHT, FLAG_END, FLAG_END }, { "Regen", OF_REGEN, FLAG_END, FLAG_END }, { " ESP", OF_TELEPATHY, FLAG_END, FLAG_END }, { "Invis", OF_SEE_INVIS, FLAG_END, FLAG_END }, { "FrAct", OF_FREE_ACT, FLAG_END, FLAG_END }, { "HLife", OF_HOLD_LIFE, FLAG_END, FLAG_END }, { "Stea.", OF_STEALTH, FLAG_END, FLAG_END }, { "Sear.", OF_SEARCH, FLAG_END, FLAG_END }, { "Infra", OF_INFRA, FLAG_END, FLAG_END }, { "Tunn.", OF_TUNNEL, FLAG_END, FLAG_END }, { "Speed", OF_SPEED, FLAG_END, FLAG_END }, { "Blows", OF_BLOWS, FLAG_END, FLAG_END }, { "Shots", OF_SHOTS, FLAG_END, FLAG_END }, { "Might", OF_MIGHT, FLAG_END, FLAG_END }, { "S.Dig", OF_SLOW_DIGEST, FLAG_END, FLAG_END }, { "ImpHP", OF_IMPAIR_HP, FLAG_END, FLAG_END }, { " Fear", OF_AFRAID, FLAG_END, FLAG_END }, { "Aggrv", OF_AGGRAVATE, FLAG_END, FLAG_END }, }; #define RES_COLS (5 + 2 + INVEN_TOTAL - INVEN_WIELD) static const region resist_region[] = { { 0*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, { 1*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, { 2*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, { 3*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, }; static void display_resistance_panel(const struct player_flag_record *resists, size_t size, const region *bounds) { size_t i, j; int col = bounds->col; int row = bounds->row; Term_putstr(col, row++, RES_COLS, TERM_WHITE, " abcdefghijkl@"); for (i = 0; i < size-3; i++, row++) { byte name_attr = TERM_WHITE; Term_gotoxy(col+6, row); /* repeated extraction of flags is inefficient but more natural */ for (j = INVEN_WIELD; j <= INVEN_TOTAL; j++) { object_type *o_ptr = &p_ptr->inventory[j]; bitflag f[OF_SIZE]; byte attr = TERM_WHITE | (j % 2) * 8; /* alternating columns */ char sym = '.'; bool res, imm, vuln; /* Wipe flagset */ of_wipe(f); if (j < INVEN_TOTAL && o_ptr->kind) { object_flags_known(o_ptr, f); } else if (j == INVEN_TOTAL) { player_flags(f); /* If the race has innate infravision/digging, force the corresponding flag here. If we set it in player_flags(), then all callers of that function will think the infravision is caused by equipment. */ if (p_ptr->race->infra > 0) of_on(f, OF_INFRA); if (p_ptr->race->r_skills[SKILL_DIGGING] > 0) of_on(f, OF_TUNNEL); } res = of_has(f, resists[i].res_flag); imm = of_has(f, resists[i].im_flag); vuln = of_has(f, resists[i].vuln_flag); if (imm) name_attr = TERM_GREEN; else if (res && name_attr == TERM_WHITE) name_attr = TERM_L_BLUE; if (vuln) sym = '-'; else if (imm) sym = '*'; else if (res) sym = '+'; else if ((j < INVEN_TOTAL) && o_ptr->kind && !object_flag_is_known(o_ptr, resists[i].res_flag)) sym = '?'; Term_addch(attr, sym); } Term_putstr(col, row, 6, name_attr, format("%5s:", resists[i].name)); } Term_putstr(col, row++, RES_COLS, TERM_WHITE, " abcdefghijkl@"); /* Equippy */ display_player_equippy(row++, col+6); } static void display_player_flag_info(void) { int i; for (i = 0; i < 4; i++) { display_resistance_panel(player_flag_table+(i*RES_ROWS), RES_ROWS+3, &resist_region[i]); } } /* * Special display, part 2b */ void display_player_stat_info(void) { int i, row, col; char buf[80]; /* Row */ row = 2; /* Column */ col = 42; /* Print out the labels for the columns */ c_put_str(TERM_WHITE, " Self", row-1, col+5); c_put_str(TERM_WHITE, " RB", row-1, col+12); c_put_str(TERM_WHITE, " CB", row-1, col+16); c_put_str(TERM_WHITE, " EB", row-1, col+20); c_put_str(TERM_WHITE, " Best", row-1, col+24); /* Display the stats */ for (i = 0; i < A_MAX; i++) { /* Reduced */ if (p_ptr->stat_cur[i] < p_ptr->stat_max[i]) { /* Use lowercase stat name */ put_str(stat_names_reduced[i], row+i, col); } /* Normal */ else { /* Assume uppercase stat name */ put_str(stat_names[i], row+i, col); } /* Indicate natural maximum */ if (p_ptr->stat_max[i] == 18+100) { put_str("!", row+i, col+3); } /* Internal "natural" maximum value */ cnv_stat(p_ptr->stat_max[i], buf, sizeof(buf)); c_put_str(TERM_L_GREEN, buf, row+i, col+5); /* Race Bonus */ strnfmt(buf, sizeof(buf), "%+3d", p_ptr->race->r_adj[i]); c_put_str(TERM_L_BLUE, buf, row+i, col+12); /* Class Bonus */ strnfmt(buf, sizeof(buf), "%+3d", p_ptr->class->c_adj[i]); c_put_str(TERM_L_BLUE, buf, row+i, col+16); /* Equipment Bonus */ strnfmt(buf, sizeof(buf), "%+3d", p_ptr->state.stat_add[i]); c_put_str(TERM_L_BLUE, buf, row+i, col+20); /* Resulting "modified" maximum value */ cnv_stat(p_ptr->state.stat_top[i], buf, sizeof(buf)); c_put_str(TERM_L_GREEN, buf, row+i, col+24); /* Only display stat_use if there has been draining */ if (p_ptr->stat_cur[i] < p_ptr->stat_max[i]) { cnv_stat(p_ptr->state.stat_use[i], buf, sizeof(buf)); c_put_str(TERM_YELLOW, buf, row+i, col+31); } } } /* * Special display, part 2c * * How to print out the modifications and sustains. * Positive mods with no sustain will be light green. * Positive mods with a sustain will be dark green. * Sustains (with no modification) will be a dark green 's'. * Negative mods (from a curse) will be red. * Huge mods (>9), like from MICoMorgoth, will be a '*' * No mod, no sustain, will be a slate '.' */ static void display_player_sust_info(void) { int i, j, row, col, stat; object_type *o_ptr; bitflag f[OF_SIZE]; int stat_flags[A_MAX]; int sustain_flags[A_MAX]; byte a; char c; /* Row */ row = 2; /* Column */ col = 26; /* Build the stat flags tables */ stat_flags[A_STR] = OF_STR; stat_flags[A_INT] = OF_INT; stat_flags[A_WIS] = OF_WIS; stat_flags[A_DEX] = OF_DEX; stat_flags[A_CON] = OF_CON; stat_flags[A_CHR] = OF_CHR; sustain_flags[A_STR] = OF_SUST_STR; sustain_flags[A_INT] = OF_SUST_INT; sustain_flags[A_WIS] = OF_SUST_WIS; sustain_flags[A_DEX] = OF_SUST_DEX; sustain_flags[A_CON] = OF_SUST_CON; sustain_flags[A_CHR] = OF_SUST_CHR; /* Header */ c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col); /* Process equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; ++i) { /* Get the object */ o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) { col++; continue; } /* Get the "known" flags */ object_flags_known(o_ptr, f); /* Initialize color based of sign of pval. */ for (stat = 0; stat < A_MAX; stat++) { /* Default */ a = TERM_SLATE; c = '.'; /* Boost */ if (of_has(f, stat_flags[stat])) { /* Default */ c = '*'; /* Work out which pval we're talking about */ j = which_pval(o_ptr, stat_flags[stat]); /* Good */ if (o_ptr->pval[j] > 0) { /* Good */ a = TERM_L_GREEN; /* Label boost */ if (o_ptr->pval[j] < 10) c = I2D(o_ptr->pval[j]); } /* Bad */ if (o_ptr->pval[j] < 0) { /* Bad */ a = TERM_RED; /* Label boost */ if (o_ptr->pval[j] > -10) c = I2D(-(o_ptr->pval[j])); } } /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green */ a = TERM_GREEN; /* Convert '.' to 's' */ if (c == '.') c = 's'; } if ((c == '.') && o_ptr->kind && !object_flag_is_known(o_ptr, sustain_flags[stat])) c = '?'; /* Dump proper character */ Term_putch(col, row+stat, a, c); } /* Advance */ col++; } /* Player flags */ player_flags(f); /* Check stats */ for (stat = 0; stat < A_MAX; ++stat) { /* Default */ a = TERM_SLATE; c = '.'; /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green "s" */ a = TERM_GREEN; c = 's'; } /* Dump */ Term_putch(col, row+stat, a, c); } /* Column */ col = 26; /* Footer */ c_put_str(TERM_WHITE, "abcdefghijkl@", row+6, col); /* Equippy */ display_player_equippy(row+7, col); } static void display_panel(const data_panel *panel, int count, bool left_adj, const region *bounds) { int i; char buffer[50]; int col = bounds->col; int row = bounds->row; int w = bounds->width; int offset = 0; region_erase(bounds); if (left_adj) { for (i = 0; i < count; i++) { int len = panel[i].label ? strlen(panel[i].label) : 0; if (offset < len) offset = len; } offset += 2; } for (i = 0; i < count; i++, row++) { int len; if (!panel[i].label) continue; Term_putstr(col, row, strlen(panel[i].label), TERM_WHITE, panel[i].label); strnfmt(buffer, sizeof(buffer), panel[i].fmt, panel[i].value[0], panel[i].value[1]); len = strlen(buffer); len = len < w - offset ? len : w - offset - 1; if (left_adj) Term_putstr(col+offset, row, len, panel[i].color, buffer); else Term_putstr(col+w-len, row, len, panel[i].color, buffer); } } static const region boundaries [] = { /* x y width, rows */ { 0, 0, 0, 0 }, { 1, 1, 40, 8 }, /* Name, Class, ... */ { 1, 9, 22, 9 }, /* Cur Exp, Max Exp, ... */ { 26, 9, 17, 9 }, /* AC, melee, ... */ { 48, 9, 24, 8 }, /* skills */ { 21, 2, 18, 5 }, /* Age, ht, wt, ... */ }; static const char *show_title(void) { if (p_ptr->wizard) return "[=-WIZARD-=]"; else if (p_ptr->total_winner || p_ptr->lev > PY_MAX_LEVEL) return "***WINNER***"; else return p_ptr->class->title[(p_ptr->lev - 1) / 5]; } static const char *show_adv_exp(void) { if (p_ptr->lev < PY_MAX_LEVEL) { static char buffer[30]; s32b advance = (player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L); strnfmt(buffer, sizeof(buffer), "%d", advance); return buffer; } else { return "********"; } } static const char *show_depth(void) { static char buffer[13]; if (p_ptr->max_depth == 0) return "Town"; strnfmt(buffer, sizeof(buffer), "%d' (L%d)", p_ptr->max_depth * 50, p_ptr->max_depth); return buffer; } static const char *show_speed(void) { static char buffer[10]; int tmp = p_ptr->state.speed; if (p_ptr->timed[TMD_FAST]) tmp -= 10; if (p_ptr->timed[TMD_SLOW]) tmp += 10; if (p_ptr->searching) tmp += 10; if (tmp == 110) return "Normal"; strnfmt(buffer, sizeof(buffer), "%d", tmp - 110); return buffer; } static const char *show_melee_weapon(const object_type *o_ptr) { static char buffer[12]; int hit = p_ptr->state.dis_to_h; int dam = p_ptr->state.dis_to_d; if (object_attack_plusses_are_visible(o_ptr)) { hit += o_ptr->to_h; dam += o_ptr->to_d; } strnfmt(buffer, sizeof(buffer), "(%+d,%+d)", hit, dam); return buffer; } static const char *show_missile_weapon(const object_type *o_ptr) { static char buffer[12]; int hit = p_ptr->state.dis_to_h; int dam = 0; if (object_attack_plusses_are_visible(o_ptr)) { hit += o_ptr->to_h; dam += o_ptr->to_d; } strnfmt(buffer, sizeof(buffer), "(%+d,%+d)", hit, dam); return buffer; } static byte max_color(int val, int max) { return val < max ? TERM_YELLOW : TERM_L_GREEN; } static const char *show_status(void) { int sc = p_ptr->sc; sc /= 10; switch (sc) { case 0: case 1: return "Pariah"; case 2: return "Outcast"; case 3: case 4: return "Unknown"; case 5: return "Known"; case 6: /* Maximum status by birth 75 = 7 */ case 7: return "Liked"; case 8: return "Well-liked"; case 9: case 10: return "Respected"; case 11: case 12: return "Role model"; case 13: return "Feared"; case 14: case 15: return "Lordly"; } return format("%d", sc); } /* data_panel array element initializer, for ansi compliance */ #define P_I(col, lab, format, val1, val2) \ { panel[i].color = col; panel[i].label = lab; panel[i].fmt = format; \ panel[i].value[0] = val1; panel[i].value[1] = val2; \ i++; } /* colours for table items */ static const byte colour_table[] = { TERM_RED, TERM_RED, TERM_RED, TERM_L_RED, TERM_ORANGE, TERM_YELLOW, TERM_YELLOW, TERM_GREEN, TERM_GREEN, TERM_L_GREEN, TERM_L_BLUE }; static int get_panel(int oid, data_panel *panel, size_t size) { int ret = (s32b) size; switch(oid) { case 1: { int i = 0; assert( size >= (u32b) boundaries[1].page_rows); ret = boundaries[1].page_rows; P_I(TERM_L_BLUE, "Name", "%y", s2u(op_ptr->full_name), END ); P_I(TERM_L_BLUE, "Sex", "%y", s2u(p_ptr->sex->title), END ); P_I(TERM_L_BLUE, "Race", "%y", s2u(p_ptr->race->name), END ); P_I(TERM_L_BLUE, "Class", "%y", s2u(p_ptr->class->name), END ); P_I(TERM_L_BLUE, "Title", "%y", s2u(show_title()), END ); P_I(TERM_L_BLUE, "HP", "%y/%y", i2u(p_ptr->chp), i2u(p_ptr->mhp) ); P_I(TERM_L_BLUE, "SP", "%y/%y", i2u(p_ptr->csp), i2u(p_ptr->msp) ); P_I(TERM_L_BLUE, "Level", "%y", i2u(p_ptr->lev), END ); assert(i == boundaries[1].page_rows); return ret; } case 2: { int i = 0; assert( ret >= boundaries[2].page_rows); ret = boundaries[2].page_rows; P_I(max_color(p_ptr->lev, p_ptr->max_lev), "Level", "%y", i2u(p_ptr->lev), END ); P_I(max_color(p_ptr->exp, p_ptr->max_exp), "Cur Exp", "%y", i2u(p_ptr->exp), END ); P_I(TERM_L_GREEN, "Max Exp", "%y", i2u(p_ptr->max_exp), END ); P_I(TERM_L_GREEN, "Adv Exp", "%y", s2u(show_adv_exp()), END ); P_I(TERM_L_GREEN, "MaxDepth", "%y", s2u(show_depth()), END ); P_I(TERM_L_GREEN, "Game Turns", "%y", i2u(turn), END ); P_I(TERM_L_GREEN, "Standard Turns","%y", i2u(p_ptr->total_energy / 100), END ); P_I(TERM_L_GREEN, "Resting Turns","%y", i2u(p_ptr->resting_turn), END ); P_I(TERM_L_GREEN, "Gold", "%y", i2u(p_ptr->au), END ); assert(i == boundaries[2].page_rows); return ret; } case 3: { int i = 0; assert(ret >= boundaries[3].page_rows); ret = boundaries[3].page_rows; P_I(TERM_L_BLUE, "Armor", "[%y,%+y]", i2u(p_ptr->state.dis_ac), i2u(p_ptr->state.dis_to_a) ); P_I(TERM_L_BLUE, "Fight", "(%+y,%+y)", i2u(p_ptr->state.dis_to_h), i2u(p_ptr->state.dis_to_d) ); P_I(TERM_L_BLUE, "Melee", "%y", s2u(show_melee_weapon(&p_ptr->inventory[INVEN_WIELD])), END ); P_I(TERM_L_BLUE, "Shoot", "%y", s2u(show_missile_weapon(&p_ptr->inventory[INVEN_BOW])), END ); P_I(TERM_L_BLUE, "Blows", "%y.%y/turn", i2u(p_ptr->state.num_blows / 100), i2u((p_ptr->state.num_blows / 10) % 10) ); P_I(TERM_L_BLUE, "Shots", "%y/turn", i2u(p_ptr->state.num_shots), END ); P_I(TERM_L_BLUE, "Infra", "%y ft", i2u(p_ptr->state.see_infra * 10), END ); P_I(TERM_L_BLUE, "Speed", "%y", s2u(show_speed()), END ); P_I(TERM_L_BLUE, "Burden","%.1y lbs", f2u(p_ptr->total_weight/10.0), END ); assert(i == boundaries[3].page_rows); return ret; } case 4: { static struct { const char *name; int skill; int div; } skills[] = { { "Saving Throw", SKILL_SAVE, 6 }, { "Stealth", SKILL_STEALTH, 1 }, { "Fighting", SKILL_TO_HIT_MELEE, 12 }, { "Shooting", SKILL_TO_HIT_BOW, 12 }, { "Disarming", SKILL_DISARM, 8 }, { "Magic Device", SKILL_DEVICE, 6 }, { "Perception", SKILL_SEARCH_FREQUENCY, 6 }, { "Searching", SKILL_SEARCH, 6 } }; int i; assert(N_ELEMENTS(skills) == boundaries[4].page_rows); ret = N_ELEMENTS(skills); if ((u32b) ret > size) ret = size; for (i = 0; i < ret; i++) { s16b skill = p_ptr->state.skills[skills[i].skill]; panel[i].color = TERM_L_BLUE; panel[i].label = skills[i].name; if (skills[i].skill == SKILL_SAVE || skills[i].skill == SKILL_SEARCH) { if (skill < 0) skill = 0; if (skill > 100) skill = 100; panel[i].fmt = "%y%%"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[skill / 10]; } else if (skills[i].skill == SKILL_DEVICE) { panel[i].fmt = "%y"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[skill / 13]; } else if (skills[i].skill == SKILL_SEARCH_FREQUENCY) { if (skill <= 0) skill = 1; if (skill >= 50) { panel[i].fmt = "1 in 1"; panel[i].color = colour_table[10]; } else { /* convert to % chance of searching */ skill = 50 - skill; panel[i].fmt = "1 in %y"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[(100 - skill*2) / 10]; } } else if (skills[i].skill == SKILL_DISARM) { /* assume disarming a dungeon trap */ skill -= 5; if (skill > 100) skill = 100; if (skill < 2) skill = 2; panel[i].fmt = "%y%%"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[skill / 10]; } else { panel[i].fmt = "%y"; panel[i].value[0] = s2u(likert(skill, skills[i].div, &panel[i].color)); } } return ret; } case 5: { int i = 0; assert(ret >= boundaries[5].page_rows); ret = boundaries[5].page_rows; P_I(TERM_L_BLUE, "Age", "%y", i2u(p_ptr->age), END ); P_I(TERM_L_BLUE, "Height", "%y", i2u(p_ptr->ht), END ); P_I(TERM_L_BLUE, "Weight", "%y", i2u(p_ptr->wt), END ); P_I(TERM_L_BLUE, "Social", "%y", s2u(show_status()), END ); P_I(TERM_L_BLUE, "Maximize", "%y", c2u(OPT(birth_maximize) ? 'Y' : 'N'), END); #if 0 /* Preserve mode deleted */ P_I(TERM_L_BLUE, "Preserve", "%y", c2u(birth_preserve ? 'Y' : 'N'), END); #endif assert(i == boundaries[5].page_rows); return ret; } } /* hopefully not reached */ return 0; } void display_player_xtra_info(void) { int i; int panels [] = { 1, 2, 3, 4, 5}; bool left_adj [] = { 1, 0, 0, 0, 0 }; data_panel data[MAX_PANEL]; for (i = 0; i < (int)N_ELEMENTS(panels); i++) { int oid = panels[i]; int rows = get_panel(oid, data, N_ELEMENTS(data)); /* Hack: Don't show 'Level' in the name, class ... panel */ if (oid == 1) rows -= 1; display_panel(data, rows, left_adj[i], &boundaries[oid]); } /* Indent output by 1 character, and wrap at column 72 */ text_out_wrap = 72; text_out_indent = 1; /* History */ Term_gotoxy(text_out_indent, 19); text_out_to_screen(TERM_WHITE, p_ptr->history); /* Reset text_out() vars */ text_out_wrap = 0; text_out_indent = 0; return; } /* * Display the character on the screen (two different modes) * * The top two lines, and the bottom line (or two) are left blank. * * Mode 0 = standard display with skills/history * Mode 1 = special display with equipment flags */ void display_player(int mode) { /* Erase screen */ clear_from(0); /* When not playing, do not display in subwindows */ if (Term != angband_term[0] && !p_ptr->playing) return; /* Stat info */ display_player_stat_info(); if (mode) { data_panel data[MAX_PANEL]; int rows = get_panel(1, data, N_ELEMENTS(data)); display_panel(data, rows, 1, &boundaries[1]); /* Stat/Sustain flags */ display_player_sust_info(); /* Other flags */ display_player_flag_info(); } /* Standard */ else { /* Extra info */ display_player_xtra_info(); } } /* * Hack -- Dump a character description file * * XXX XXX XXX Allow the "full" flag to dump additional info, * and trigger its usage from various places in the code. */ errr file_character(const char *path, bool full) { int i, x, y; byte a; char c; ang_file *fp; struct store *st_ptr = &stores[STORE_HOME]; char o_name[80]; byte (*old_xchar_hook)(byte c) = Term->xchar_hook; char buf[1024]; /* We use either ascii or system-specific encoding */ int encoding = OPT(xchars_to_file) ? SYSTEM_SPECIFIC : ASCII; /* Unused parameter */ (void)full; /* Open the file for writing */ fp = file_open(path, MODE_WRITE, FTYPE_TEXT); if (!fp) return (-1); /* Display the requested encoding -- ASCII or system-specific */ if (!OPT(xchars_to_file)) Term->xchar_hook = NULL; /* Begin dump */ file_putf(fp, " [%s Character Dump]\n\n", buildid); /* Display player */ display_player(0); /* Dump part of the screen */ for (y = 1; y < 23; y++) { /* Dump each row */ for (x = 0; x < 79; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = c; } /* Back up over spaces */ while ((x > 0) && (buf[x-1] == ' ')) --x; /* Terminate */ buf[x] = '\0'; /* End the row */ x_file_putf(fp, encoding, "%s\n", buf); } /* Skip a line */ file_putf(fp, "\n"); /* Display player */ display_player(1); /* Dump part of the screen */ for (y = 11; y < 20; y++) { /* Dump each row */ for (x = 0; x < 39; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = c; } /* Back up over spaces */ while ((x > 0) && (buf[x-1] == ' ')) --x; /* Terminate */ buf[x] = '\0'; /* End the row */ x_file_putf(fp, encoding, "%s\n", buf); } /* Skip a line */ file_putf(fp, "\n"); /* Dump part of the screen */ for (y = 11; y < 20; y++) { /* Dump each row */ for (x = 0; x < 39; x++) { /* Get the attr/char */ (void)(Term_what(x + 40, y, &a, &c)); /* Dump it */ buf[x] = c; } /* Back up over spaces */ while ((x > 0) && (buf[x-1] == ' ')) --x; /* Terminate */ buf[x] = '\0'; /* End the row */ x_file_putf(fp, encoding, "%s\n", buf); } /* Skip some lines */ file_putf(fp, "\n\n"); /* If dead, dump last messages -- Prfnoff */ if (p_ptr->is_dead) { i = messages_num(); if (i > 15) i = 15; file_putf(fp, " [Last Messages]\n\n"); while (i-- > 0) { x_file_putf(fp, encoding, "> %s\n", message_str((s16b)i)); } x_file_putf(fp, encoding, "\nKilled by %s.\n\n", p_ptr->died_from); } /* Dump the equipment */ file_putf(fp, " [Character Equipment]\n\n"); for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { if (i == INVEN_TOTAL) { file_putf(fp, "\n\n [Character Quiver]\n\n"); continue; } object_desc(o_name, sizeof(o_name), &p_ptr->inventory[i], ODESC_PREFIX | ODESC_FULL); x_file_putf(fp, encoding, "%c) %s\n", index_to_label(i), o_name); if (p_ptr->inventory[i].kind) object_info_chardump(fp, &p_ptr->inventory[i], 5, 72); } /* Dump the inventory */ file_putf(fp, "\n\n [Character Inventory]\n\n"); for (i = 0; i < INVEN_PACK; i++) { if (!p_ptr->inventory[i].kind) break; object_desc(o_name, sizeof(o_name), &p_ptr->inventory[i], ODESC_PREFIX | ODESC_FULL); x_file_putf(fp, encoding, "%c) %s\n", index_to_label(i), o_name); object_info_chardump(fp, &p_ptr->inventory[i], 5, 72); } file_putf(fp, "\n\n"); /* Dump the Home -- if anything there */ if (st_ptr->stock_num) { /* Header */ file_putf(fp, " [Home Inventory]\n\n"); /* Dump all available items */ for (i = 0; i < st_ptr->stock_num; i++) { object_desc(o_name, sizeof(o_name), &st_ptr->stock[i], ODESC_PREFIX | ODESC_FULL); x_file_putf(fp, encoding, "%c) %s\n", I2A(i), o_name); object_info_chardump(fp, &st_ptr->stock[i], 5, 72); } /* Add an empty line */ file_putf(fp, "\n\n"); } /* Dump character history */ dump_history(fp); file_putf(fp, "\n\n"); /* Dump options */ file_putf(fp, " [Options]\n\n"); /* Dump options */ for (i = OPT_BIRTH; i < OPT_BIRTH + N_OPTS_BIRTH; i++) { if (option_name(i)) { file_putf(fp, "%-45s: %s (%s)\n", option_desc(i), op_ptr->opt[i] ? "yes" : "no ", option_name(i)); } } /* Skip some lines */ file_putf(fp, "\n\n"); /* Return to standard display */ Term->xchar_hook = old_xchar_hook; file_close(fp); /* Success */ return (0); } /* * Make a string lower case. */ static void string_lower(char *buf) { char *s; /* Lowercase the string */ for (s = buf; *s != 0; s++) *s = tolower((unsigned char)*s); } /* * Recursive file perusal. * * Return FALSE on "?", otherwise TRUE. * * This function could be made much more efficient with the use of "seek" * functionality, especially when moving backwards through a file, or * forwards through a file by less than a page at a time. XXX XXX XXX */ bool show_file(const char *name, const char *what, int line, int mode) { int i, k, n; struct keypress ch; /* Number of "real" lines passed by */ int next = 0; /* Number of "real" lines in the file */ int size; /* Backup value for "line" */ int back = 0; /* This screen has sub-screens */ bool menu = FALSE; /* Case sensitive search */ bool case_sensitive = FALSE; /* Current help file */ ang_file *fff = NULL; /* Find this string (if any) */ char *find = NULL; /* Jump to this tag */ const char *tag = NULL; /* Hold a string to find */ char finder[80] = ""; /* Hold a string to show */ char shower[80] = ""; /* Filename */ char filename[1024]; /* Describe this thing */ char caption[128] = ""; /* Path buffer */ char path[1024]; /* General buffer */ char buf[1024]; /* Lower case version of the buffer, for searching */ char lc_buf[1024]; /* Sub-menu information */ char hook[26][32]; int wid, hgt; /* Wipe the hooks */ for (i = 0; i < 26; i++) hook[i][0] = '\0'; /* Get size */ Term_get_size(&wid, &hgt); /* Copy the filename */ my_strcpy(filename, name, sizeof(filename)); n = strlen(filename); /* Extract the tag from the filename */ for (i = 0; i < n; i++) { if (filename[i] == '#') { filename[i] = '\0'; tag = filename + i + 1; break; } } /* Redirect the name */ name = filename; /* Hack XXX XXX XXX */ if (what) { my_strcpy(caption, what, sizeof(caption)); my_strcpy(path, name, sizeof(path)); fff = file_open(path, MODE_READ, -1); } /* Look in "help" */ if (!fff) { strnfmt(caption, sizeof(caption), "Help file '%s'", name); path_build(path, sizeof(path), ANGBAND_DIR_HELP, name); fff = file_open(path, MODE_READ, -1); } /* Look in "info" */ if (!fff) { strnfmt(caption, sizeof(caption), "Info file '%s'", name); path_build(path, sizeof(path), ANGBAND_DIR_INFO, name); fff = file_open(path, MODE_READ, -1); } /* Oops */ if (!fff) { /* Message */ msg("Cannot open '%s'.", name); message_flush(); /* Oops */ return (TRUE); } /* Pre-Parse the file */ while (TRUE) { /* Read a line or stop */ if (!file_getl(fff, buf, sizeof(buf))) break; /* XXX Parse "menu" items */ if (prefix(buf, "***** ")) { char b1 = '[', b2 = ']'; /* Notice "menu" requests */ if ((buf[6] == b1) && isalpha((unsigned char)buf[7]) && (buf[8] == b2) && (buf[9] == ' ')) { /* This is a menu file */ menu = TRUE; /* Extract the menu item */ k = A2I(buf[7]); /* Store the menu item (if valid) */ if ((k >= 0) && (k < 26)) my_strcpy(hook[k], buf + 10, sizeof(hook[0])); } /* Notice "tag" requests */ else if (buf[6] == '<') { if (tag) { /* Remove the closing '>' of the tag */ buf[strlen(buf) - 1] = '\0'; /* Compare with the requested tag */ if (streq(buf + 7, tag)) { /* Remember the tagged line */ line = next; } } } /* Skip this */ continue; } /* Count the "real" lines */ next++; } /* Save the number of "real" lines */ size = next; /* Display the file */ while (TRUE) { /* Clear screen */ Term_clear(); /* Restrict the visible range */ if (line > (size - (hgt - 4))) line = size - (hgt - 4); if (line < 0) line = 0; /* Re-open the file if needed */ if (next > line) { /* Close it */ file_close(fff); /* Hack -- Re-Open the file */ fff = file_open(path, MODE_READ, -1); if (!fff) return (TRUE); /* File has been restarted */ next = 0; } /* Goto the selected line */ while (next < line) { /* Get a line */ if (!file_getl(fff, buf, sizeof(buf))) break; /* Skip tags/links */ if (prefix(buf, "***** ")) continue; /* Count the lines */ next++; } /* Dump the next lines of the file */ for (i = 0; i < hgt - 4; ) { /* Hack -- track the "first" line */ if (!i) line = next; /* Get a line of the file or stop */ if (!file_getl(fff, buf, sizeof(buf))) break; /* Hack -- skip "special" lines */ if (prefix(buf, "***** ")) continue; /* Count the "real" lines */ next++; /* Make a copy of the current line for searching */ my_strcpy(lc_buf, buf, sizeof(lc_buf)); /* Make the line lower case */ if (!case_sensitive) string_lower(lc_buf); /* Hack -- keep searching */ if (find && !i && !strstr(lc_buf, find)) continue; /* Hack -- stop searching */ find = NULL; /* Dump the line */ Term_putstr(0, i+2, -1, TERM_WHITE, buf); /* Highlight "shower" */ if (shower[0]) { const char *str = lc_buf; /* Display matches */ while ((str = strstr(str, shower)) != NULL) { int len = strlen(shower); /* Display the match */ Term_putstr(str-lc_buf, i+2, len, TERM_YELLOW, &buf[str-lc_buf]); /* Advance */ str += len; } } /* Count the printed lines */ i++; } /* Hack -- failed search */ if (find) { bell("Search string not found!"); line = back; find = NULL; continue; } /* Show a general "title" */ prt(format("[%s, %s, Line %d-%d/%d]", buildid, caption, line, line + hgt - 4, size), 0, 0); /* Prompt -- menu screen */ if (menu) { /* Wait for it */ prt("[Press a Number, or ESC to exit.]", hgt - 1, 0); } /* Prompt -- small files */ else if (size <= hgt - 4) { /* Wait for it */ prt("[Press ESC to exit.]", hgt - 1, 0); } /* Prompt -- large files */ else { /* Wait for it */ prt("[Press Space to advance, or ESC to exit.]", hgt - 1, 0); } /* Get a keypress */ ch = inkey(); /* Exit the help */ if (ch.code == '?') break; /* Toggle case sensitive on/off */ if (ch.code == '!') { case_sensitive = !case_sensitive; } /* Try showing */ if (ch.code == '&') { /* Get "shower" */ prt("Show: ", hgt - 1, 0); (void)askfor_aux(shower, sizeof(shower), NULL); /* Make the "shower" lowercase */ if (!case_sensitive) string_lower(shower); } /* Try finding */ if (ch.code == '/') { /* Get "finder" */ prt("Find: ", hgt - 1, 0); if (askfor_aux(finder, sizeof(finder), NULL)) { /* Find it */ find = finder; back = line; line = line + 1; /* Make the "finder" lowercase */ if (!case_sensitive) string_lower(finder); /* Show it */ my_strcpy(shower, finder, sizeof(shower)); } } /* Go to a specific line */ if (ch.code == '#') { char tmp[80] = "0"; prt("Goto Line: ", hgt - 1, 0); if (askfor_aux(tmp, sizeof(tmp), NULL)) line = atoi(tmp); } /* Go to a specific file */ if (ch.code == '%') { char ftmp[80] = "help.hlp"; prt("Goto File: ", hgt - 1, 0); if (askfor_aux(ftmp, sizeof(ftmp), NULL)) { if (!show_file(ftmp, NULL, 0, mode)) ch.code = ESCAPE; } } switch (ch.code) { /* up a line */ case ARROW_UP: case '8': line--; break; /* up a page */ case KC_PGUP: case '9': case '-': line -= (hgt - 4); break; /* home */ case KC_HOME: case '7': line = 0; break; /* down a line */ case ARROW_DOWN: case '2': case '\n': case '\r': line++; break; /* down a page */ case KC_PGDOWN: case '3': case ' ': line += hgt - 4; break; /* end */ case KC_END: case '1': line = size; break; } /* Recurse on letters */ if (menu && isalpha((unsigned char)ch.code)) { /* Extract the requested menu item */ k = A2I(ch.code); /* Verify the menu item */ if ((k >= 0) && (k <= 25) && hook[k][0]) { /* Recurse on that file */ if (!show_file(hook[k], NULL, 0, mode)) ch.code = ESCAPE; } } /* Exit on escape */ if (ch.code == ESCAPE) break; } /* Close the file */ file_close(fff); /* Done */ return (ch.code != '?'); } /* * Peruse the On-Line-Help */ void do_cmd_help(void) { /* Save screen */ screen_save(); /* Peruse the main help file */ (void)show_file("help.hlp", NULL, 0, 0); /* Load screen */ screen_load(); } /* * Process the player name and extract a clean "base name". * * If "sf" is TRUE, then we initialize "savefile" based on player name. * * Some platforms (Windows, Macintosh, Amiga) leave the "savefile" empty * when a new character is created, and then when the character is done * being created, they call this function to choose a new savefile name. * * This also now handles the turning on and off of the automatic * sequential numbering of character names with Roman numerals. */ void process_player_name(bool sf) { int i; /* Process the player name */ for (i = 0; op_ptr->full_name[i]; i++) { char c = op_ptr->full_name[i]; /* No control characters */ if (iscntrl((unsigned char)c)) { /* Illegal characters */ quit_fmt("Illegal control char (0x%02X) in player name", c); } /* Convert all non-alphanumeric symbols */ if (!isalpha((unsigned char)c) && !isdigit((unsigned char)c)) c = '_'; /* Build "base_name" */ op_ptr->base_name[i] = c; } #if defined(WINDOWS) /* Max length */ if (i > 8) i = 8; #endif /* Terminate */ op_ptr->base_name[i] = '\0'; /* Require a "base" name */ if (!op_ptr->base_name[0]) { my_strcpy(op_ptr->base_name, "PLAYER", sizeof(op_ptr->base_name)); } /* Pick savefile name if needed */ if (sf) { char temp[128]; #if defined(SET_UID) /* Rename the savefile, using the player_uid and base_name */ strnfmt(temp, sizeof(temp), "%d.%s", player_uid, op_ptr->base_name); #else /* Rename the savefile, using the base name */ strnfmt(temp, sizeof(temp), "%s", op_ptr->base_name); #endif /* Build the filename */ path_build(savefile, sizeof(savefile), ANGBAND_DIR_SAVE, temp); } } /* * Save the game */ void save_game(void) { /* Disturb the player */ disturb(p_ptr, 1, 0); /* Clear messages */ message_flush(); /* Handle stuff */ handle_stuff(p_ptr); /* Message */ prt("Saving game...", 0, 0); /* Refresh */ Term_fresh(); /* The player is not dead */ my_strcpy(p_ptr->died_from, "(saved)", sizeof(p_ptr->died_from)); /* Forbid suspend */ signals_ignore_tstp(); /* Save the player */ if (savefile_save(savefile)) prt("Saving game... done.", 0, 0); else prt("Saving game... failed!", 0, 0); /* Allow suspend again */ signals_handle_tstp(); /* Refresh */ Term_fresh(); /* Note that the player is not dead */ my_strcpy(p_ptr->died_from, "(alive and well)", sizeof(p_ptr->died_from)); } /* * Close up the current game (player may or may not be dead) * * Note that the savefile is not saved until the tombstone is * actually displayed and the player has a chance to examine * the inventory and such. This allows cheating if the game * is equipped with a "quit without save" method. XXX XXX XXX */ void close_game(void) { /* Handle stuff */ handle_stuff(p_ptr); /* Flush the messages */ message_flush(); /* Flush the input */ flush(); /* No suspending now */ signals_ignore_tstp(); /* Hack -- Increase "icky" depth */ character_icky++; /* Handle death */ if (p_ptr->is_dead) { death_screen(); } /* Still alive */ else { /* Save the game */ save_game(); if (Term->mapped_flag) { struct keypress ch; prt("Press Return (or Escape).", 0, 40); ch = inkey(); if (ch.code != ESCAPE) predict_score(); } } /* Hack -- Decrease "icky" depth */ character_icky--; /* Allow suspending now */ signals_handle_tstp(); } static void write_html_escape_char(ang_file *fp, char c) { switch (c) { case '<': file_putf(fp, "<"); break; case '>': file_putf(fp, ">"); break; case '&': file_putf(fp, "&"); break; default: file_putf(fp, "%c", c); break; } } /* Take an html screenshot */ void html_screenshot(const char *name, int mode) { int y, x; int wid, hgt; byte a = TERM_WHITE; byte oa = TERM_WHITE; char c = ' '; const char *new_color_fmt = (mode == 0) ? "" : "[COLOR=\"#%02X%02X%02X\"]"; const char *change_color_fmt = (mode == 0) ? "" : "[/COLOR][COLOR=\"#%02X%02X%02X\"]"; const char *close_color_fmt = mode == 0 ? "" : "[/COLOR]"; ang_file *fp; char buf[1024]; path_build(buf, sizeof(buf), ANGBAND_DIR_USER, name); fp = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fp) { plog_fmt("Cannot write the '%s' file!", buf); return; } /* Retrieve current screen size */ Term_get_size(&wid, &hgt); if (mode == 0) { file_putf(fp, "\n"); file_putf(fp, " \n", buildid); file_putf(fp, " %s\n", name); file_putf(fp, "\n\n"); file_putf(fp, "\n"); file_putf(fp, "
\n");
	}
	else 
	{
		file_putf(fp, "[CODE][TT][BC=black][COLOR=white]\n");
	}

	/* Dump the screen */
	for (y = 0; y < hgt; y++)
	{
		for (x = 0; x < wid; x++)
		{
			/* Get the attr/char */
			(void)(Term_what(x, y, &a, &c));

			/* Color change */
			if (oa != a && c != ' ')
			{
				/* From the default white to another color */
				if (oa == TERM_WHITE)
				{
					file_putf(fp, new_color_fmt,
					        angband_color_table[a][1],
					        angband_color_table[a][2],
					        angband_color_table[a][3]);
				}

				/* From another color to the default white */
				else if (a == TERM_WHITE)
				{
					file_putf(fp, close_color_fmt);
				}

				/* Change colors */
				else
				{
					file_putf(fp, change_color_fmt,
					        angband_color_table[a][1],
					        angband_color_table[a][2],
					        angband_color_table[a][3]);
				}

				/* Remember the last color */
				oa = a;
			}

			/* Write the character and escape special HTML characters */
			if (mode == 0) write_html_escape_char(fp, c);
			else file_putf(fp, "%c", c);
		}

		/* End the row */
		file_putf(fp, "\n");
	}

	/* Close the last font-color tag if necessary */
	if (oa != TERM_WHITE) file_putf(fp, close_color_fmt);

	if (mode == 0)
	{
		file_putf(fp, "
\n"); file_putf(fp, "\n"); file_putf(fp, "\n"); } else { file_putf(fp, "[/COLOR][/BC][/TT][/CODE]\n"); } /* Close it */ file_close(fp); } angband-v3.3.2/src/osx/0000755000175000017500000000000011651552410014207 5ustar chriscchriscangband-v3.3.2/src/osx/Makefile0000644000175000017500000000014211651552410015644 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)rules.mk include $(MKPATH)objective.mk SUBDIRS = English.lproj angband-v3.3.2/src/osx/Data.icns0000644000175000017500000043673011651552410015753 0ustar chriscchriscicns=Øis32–…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕ…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕ…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕs8mk€€€€€€‚€ÿÿÿÿÿùþ¤€ÿÿÿÿÿÿÿÿ°€ÿÿÿÿÿÿÿÿÿ¶€ÿÿÿÿÿÿÿÿÿÿŒ€ÿÿÿÿÿÿÿÿÿÿùòå€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ùùùùùùil32 &Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿûÞItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32v¶ˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ9  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿs   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç2   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŒ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÏ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08pª jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ o½ÿ“ÏÁ¦øñÁ&*1Sȉ ÜÊR8¡Át¢Ž´µ‰ s‰?Xµ!áÍQ Fp ¬Å­òx.9ZÔwP Ð×ÛÃTÁ‚~ŒÛɺAÝn·Nç…)îõˆeÌ5¹!—KïjÈš QcI8…°Wv“¬†ÖAÿlÛ³³*‹ÊÝÚjÑVBhÁ6ÎëæX+#dPa©®ÿF=ÊÁ->™%¶‡87 ÀõØ^Ã1I(ì4° ’#vôì7Ù ŒÇxá‹!'-fòÊÂógŸ"BŽñŽcãU\!‰ÏÛëÅpМc™^G¢}ܺS y/0¸LÄûF­ØÚxHM òzo”8sàïǧè…<õUzÇ&­¾|œ]h{-›K ?\Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒ_ÁyÁ,Æ#šHˆCA&ô§) º˜¼¾pÄ"c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½C‰ê‚pO–‰€%“‚ÁÏ'Çx¶¸)õò†rÇ4ohXû¨˜ÿA”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqq#9Öb«U6ÖˆÈÜ×n@ÒŽ-2xAÆñ‹ ÏÏ«™ùõ9ŸU`ฮw¿Ò’ –3è'=ÿ[L„M7Í»]9dë)8S™´3Šq¶š ´{PI¨ÍåK^*Øh-Ehtoö$÷²T¨¢¹Ä!¿)áדÞí”fÙKÇWMÿ0qKï—…Ô5ï_qÉho~NÆs´´ëõxBú1âuMŽƒèÆ]`UPÔ¼àÔñ'zæ­4\&›~ÖõbÍAÿýÛÎ`ŒÁƱ 4[7;nŒTìµDcS–3ð;sÜ‘ýûF†&fOé5Æ'Ù©‘ë¦w…m±p#ðìC"x†™²`Æx̪ùw[ 5,É_ñ+˜íìŒ+!¿ÄÚæ—?§$`ãëêÞbt دי—o†J:uS N$µ-\†þîõVò9«Áº„c{ál#!d8åjÛÇxäÙ28°Õ–5÷ °… Ümþ#ðØ£ð¿ÓõPóe¢@Èü–â†c…Áº#Âä¼5ß ž)‡gÀ¡Ü/D•V.òs!Ys L½T})8¸?ÓÂ7–!ZNkÛtÐHi%°¡65¼Z™ žÖðݘ´_Û•ò (qYgX–¹võ¸¦òu½ÐÀ¡Ž:KóºL2öïåÍ-ó(I9ªÀ߇ß=B«0ªbÎ?&·ì•UÌis’ó1uõ©Ð<“e®ˆ€cþx릷۷ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÒFv1+‘¼¹¦©ÿ ·¶6‚Zà—ìï ~3m!®^{9=XÑ‚VËDÿdwôDDèâx–z&Óhé´ý“ªƒ‹VNo S¼†+zœ/T´ÿ2-Ÿu `@³÷Ô'6âKˆhoFÁœ¤YyäÔ!ÅhPQ“üù’kaÇDŸ×Ê.<@µíNýöíª»EÖâ:åÏÑuÃ7Ð#“I߈J-·¯pösA%Ú4ü$¬£*Þ w½ž²Ú<Êéô3aßåØ ´˜'H‰B~ê‘WIó„§9šH*¦ Ê” ÞÊT²1"¢R¢tÛ`Dø€,yy¬4âYµ¹fÀºˆ0Ö—2}•õ˜ü.ëmÐUW÷Û¹—Ñg@Gw‹9@ݦ#Èl™ö‚èlr;[b€;èjl7ÉC€¶uEÂå…^@<µÓÿ_ ær¾&04òäµO´}ÉÙ—v”A4=ê•ô#†q«>}%h oØ·Ÿ £÷I™ÂЛ“ÑH€ÝôR¯öf^iˆØ¶u«ÈjÁ"OU%œ- ½@‰µòÿ¸¦!Ø{V·Œûݸ&Ì!<;?ûÅXË4| eJ â7ÇjUAè #ï¹Çˆ´ˆ¿®˜wg¨±¤jè‘‹í sO´Å@3h7ÏS2x0ýq˯LÎR4Õ›H¿†ªbÓŸ¦ma€‚·ž©Ý椔´PŒd+«ŽÄnˆñ=—à‰B»Yï+bñ›Ïõµ¬ -rÅ þ1ž ÊΗ|•E>ó„tÐÐýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõµ…1‰îCédé,;ùË“x„ñ\±£$¦NbÙ“˜îûk_W°¤*£wܘž#›zŒÁâß)Žz1ªTékŒŠÄ€Ð ºžBÉ*ÃÕL¯£FÀÏKºß¥´¡ëVîûíȹ;¥î^ÐÄÛ&qô…Õ3`v~bŠé!Y3W4Œeé’”æœ!¸ÜígÔéò‰á–¢òµš+|eìq'‚b-2¯Ã…ºÔ‚Ã<ÅpÐÕGcv-åíûŸ§æžã˜Ä*Û) lçàñö-)ZÕ¾†ºf°ð°¤Mrç–zᤶ 7J¡Æ¡ˆï«]=”г¼,DÏZ½+ ›°ŽÒÏ¡Û7­Tj¦Æ…úÚ?óbÑÜ\»ÉXT_ŠÌ‚õÆ‘MqÝíážøŸ Ÿ_ kÑ. íw¬GÔGèãcž¯¡fÒ<ð®N§T¯T±µ 1¾ÛüBÑËââv0ß©Øc ž…›!èöÂÓ ·„Õ÷ëš‹aˆsm¥´Ã‘ù5Ð’¬ì†—«Ëû÷u‘õGNèîÁ DŸ"«•O:  ¾Ïî¶/V˜”9RÂãŸÚÿ#]W¹¼ö¬N/izBŽd;þ ¾@гå $TvÌbQV·mº¸S 6DlÿeÙ ²j_¯Æá웼؈×|ú¸~VU^ó á¥C¾?=Ùªð>AíI(˨– ~7I§)¡-”g—ðþEw[ëvlŒ@€€Çá^Oδ‡áE€%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éM2ÄÀ6„í hÔ²§Pj•9å7ú# ´¶^`г.u¶·ºw—ùЋïEY¸’L'b»lÃgƒ®IbÛÄlqÑ]b jõÌËŒÙÚ³,Bìuz6µ€nb ˆ±EûÿIGñ¤;áyTÛ’•¤‰´Ú:¼Zg¹aÈ3û½$?žß¹õix»k 2CZ„ ñeeéâÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R/(×[ÏCŸ¹áÛXTžƒèoaOŸ@öœüX]áp±ûK´®£ä†’zóEðœ’Gܘ‚-Ýn”ýÐ?(Y?þëÓHt‰ÈWææ.¸-ÎŽëªFá§ÃÙó®Àpø©© É×å +=ßlÎ$ĨT‡6ÍÑöк6!•£ ÙÆSß5áxíË À"æï.=lü`»¬³ÊÙ¨óCå*¬·uK¨Ç)¨¹S-©÷ÂÐPòo€BìÄÉ#4±a…ß,ŒÝÂY#é'W]M gî˜Qªô÷»Áh¾ä¢³«©1ȣУ8fî§òyU“'K–J±g4{CÛzª‹hŠ¡½<\€Ð¦µ$MfôðN©˜Px÷¼šAOÚ°¸ªYd]í´®øÆÇ¹„Û&Ÿ¯-ÓÎg]žJXUÙ\«G»²èQÚ,Ö¬NÊ(0ðê¤×ï¼…â]ÈÅP] ›ïbèã–·˜Èؿˤ=ÄÃÇíµàà§ãР߇ÒQ Ñü+f×z·v K\ Å˃Íû¶rä9â$]oÌÁÅdêØ ÊÆÜ1˜Å{µ íŒ4­µb/÷PÿNX.\ y4X¼‹bãq|dý28€À&é`‚¶uYGbX8ÌÐ1îóZ=¯G£×¢uoLǯ¯&äoî >˜³èœÈ†W¿¾ô.&ðÐo`ö¬®§€}ŸS±‡ÉÕ'0ÍØ¤—Ö!Lmàr ‹ìݶąvDûµgNÙûð‘T^s¾4¸¶KÒRhdñÀ™’ î—s?»ö5²×]¦Ñ7ÂLóXo/]÷}Wþ¦g¬I“PYšûþošº]]Ý0ö±öÝ\Ú]¸B}À-â#L*Áì$V7D~]…¢ÅIˆ,¾z¼ pýé =a Ç~I‚tµS7ïœ=Çf§I`ØÛ§iÐݵ }Xyhyf^1Ø–?3­—aþ‚¦ „W°`.íȼ޽’éÞ#‡pQÚ ¼æÖöl¼2vR+$T—u‘] r«|ýŒÚ©³‰S´ÁÓÚ˜©†q8dt<˜Çg;PÄûI©U­»{¬YÅÀ £µìÍÆH²¼jQôÜåÁàNh˜µhŽ ¦œ›¯[5Ã’ü²ª¨ºò{óŒö’‚6XIèd8–*Î ïóÞÊ^œú*žwñ®17ŒÅ-+Óµ) ÎÚ·–½¥*ÇW è$¬Yãï‰óDnÂCxÊ£ÂÀ÷\À-5B®¶ó†Æ „Vê÷Ô‘¶«È<ŒÍeØüiøÇÛÝüOê\äˆ(í‚ÜeÒs¯ÐÙ(›–õcüµTV¾—Á³¤Aï³T«Â%Ò(@Ž’ÑûyþˆÒÑ!@>=fÐåò‘ÃØy–ùøïpÎ^Å TyðÀû„¬@ý§jouq HšPØ´… ïb–_å¯ Õàÿ:#r÷UùÔqìjÜebUlxOÑ¡fRŒ$šÍE2ª{™àÁ‚ö:E«VO—¶ßó¼r¼b6?5¹IW7åÒ9-HÉ’$úhnÂ)¸ÿzg„ ›|BùÁ*…0X‹[¼pð•ë–'ÒÓ“u¿ð~ô¼’Øé×ð&ÊŠRÚe'VÜ3ƒtÐþ“•*W=Üêvø¾_¥Ieë´wÚɘ+ žY-YøÂÒÈ¡ÌúüHÅ.˜MÿzX:áÀ•ºHxÈÈ¡~D¿ æ.­×9L#gœnm™¼ó‹Z½õ„«·Ç(Ÿµçé0'¾ý7 @ňz8mCSyö…&º{Œ˜Dx±»2Á( ›tË^£b(ZDתì°tªWÛîHLš±ßMÊÃâ1s*›yXçïÕ¢ÏyÃÚïZ–?ñ eŸÑ¡;ûæ§akÂ/—´a¶MŸXhá›YÄJR&aÍý𢢴W´E÷¨ü%u–$mãù0ìrT¦”Â-%[tÍ'ãá73ÿYMÀ®Z{q  óÿ?°ï·ëë?(áÿ!â?ž% if˜_*7Z± —®‹²´/aæçXKA yc¥&ø“²\B>Ô3ÙcÛ#çt[›s0q¯ZÉ›4;HKV„¼G.´¢·±Ð>C@â&J܇ÅKß@øüf×ù/Pxhêg¡ú+°…eÍpó²­›¤Ì$Lõgˆ¤ñã²EP„äØÔ,cèó<ÆÔ¶ô§={lµÏ†:#èv>~ °’ÝAnÀúžÈG‹lWÉFe ÝDl2xÿo’Òø*Cô=2ï×ea OŽÝ´ãÀý£e¬œ›#*&rô ¶¸š„æ3Âò-ͨ^ˆªh¬ZÛy( _'»ûN‚º£·*„ígDP› ¯H±úg Öëuû‘^©V,ç«Ø|-"7š· Ÿ0A½^v­É@bÉ ¥à}’y–m¬ýR`2!1ª9ÈÊô’`‚L&^¾þ«¾!Ûž´ˆ”V)G:öM„C+"Â8¡'†tpŽ(æ`î˜Ô‘¾°0Ù/hŸÁòOCE,àa/“LèF0ÙÑgß .Àʰ+†öîêlÿ.Z¿ +IXÊÿÕŽUW,«už§·z*Y½ßTú) „chfø¿žàeꈌîdžR÷®Š‹FkCÕ‰M©uuj‡ÒŠóôd˜x1Äåxúelæ*!ãLûŽVâ¿/a¤ÒõH~¡¥p0â«÷]\¨ÓÈ=—T®‰'JŒä Ú—Ûàê(´'t^ÒHƘ‘É"nJV‚æÒâÁø¬ôÏ Ý2É!Të× POi}6‘'‘$HªFlÝn£ðóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ™gmöZ†¥V¤Š?/Wrœ'h{Úˆ€¦ÓLæ.œ«(þÛ'Æ$kVŽ+3çú–ŽNPv¶Q¤)oÏ®²·kä¨C´u—›ë͘‡Î¨÷ø­irçÁNgÃÜÖy‡: /?òkp˜æ(õ?W®ñSa±·5Æ{~e×/2¤ñEÙ<°Ò#Hç/1_‰o —™gT-ü.Þ_´…=½d‹M˜Ø"—Ä‚ß"ðB»Î¥pÁN‹¨ä†s¯ð_‚iMòÎ5¦àÅ’CÎ5D?é8ËÕ#oÚ #¤«Šn픫h8FRÛ?åâ)1f¦bëü“ÍÇÛQ¸f·ã(9- ìPKä·t|‰™œÇÏÔa†û‹ËÐÓ?œ±x1ÎÛ|d¹ó ‰.N3PxãÍM९ÇH`CB#ƒ£Y(/¦ÑaPj>Ú^U¤‘*?ÊvTP/ÎpŒ|änÕÈ |ñÉS oÿ`ªoÌ™^ËÙ`ÏR>¼+ÏT‘-6PI›Ò´¿µk4OÆ‘³ÍîF3H~y;…8ÎHº¹} B\ëkÉáAq|Å:ô‡f,LEdúuš¾Vè^Æ3çã–fH.9çÓCê zi&|ß]rk‘ÇRÌ-ÞÜh‹ÍŒ¨ŒwÞê|^)· ™Y,o6¯DñéÝ« \uÂDµ¶µüDnçŽöBˆ:¼žöÜúóþ g­¬Úì£Mh …‚©+i9€ÛˆJ †Ž°ˆÎÓQ˜oÒ€íâüzý᮲±Ö²ŸÛ„¿3Áöš‰°ÔñáûÈ ²o.XO-½þ¦·yG¹8t D¬)V•“ï›t³ÑûΔNh™àÕM>¬ø±”4b¾‚±;}©È(Ò* ƒ:uµêå vû °>]G Ám©ÞåEaÒ$•?Ûë«ôdƒ¨ì¡Øp¨\£„xÂÏUå¡ÚZd2‚Ûee£Ó 3Á¬üÓ\ÿéXü#°ã N5~ä ßÓGÜVÊ©> ÈX5¢ïŽN>,\J"Ö[õ·9_¶pˆESG am›ólMËf½„ JCêó]á$ØuÙ„ˆG¯¬ärÁÿÿ=þw^½ãYœ™âÂt.˜_-1áë€we±ô\RÉPžðcÇžÇù,äÂVˆ…p¥á€-;E,C78è9Ñn×£}Ö¬AÅè)c¤ª$„ÓA[é Z˜Z¶?å\]=ûS“ÊM` D9Á ;vÙã­f¦—œ}0§1)¡ÍF‰@AG‰»Ùb2;{>°PCÏKú!Hi ÝÕ¢9G -£´ÕSd—Ò(Êzö™\-?§,ëkĵ–oê ,:6 ,,yD¬#›@«598á½d!¶Ä"KÝApšB° –H¹ AE‡µ®eÛ# xaÊݽ-aÙYæe`h‡ƒöóuÅÙú Ø‹!¡,&QÍ0/_åæC3÷¦ü¿/ÄÈ»h•í ?‹L:ÔÔ-õiŸ¹>ÛwEN9¿Þ ÖÍÏÿ Ñ,¨›ðëy핊#‡#ÀÕÌUIžÒ¯V÷3(^Ù'# I»„vTVÇÿ÷Èú¼†Èbá q'FQÅBP) pW_£ûr!÷:Àû·’ö÷Äêâ¾¥Ú¯ôÀ Ÿ›«(ï̾“Np&<½L…²}{ý¦éZÇ+qªŸXÕ|Ü]æÉ5N ¡ñ¹eÈ}âw {sæX 1MFb @ÞÉ…¤=tb ›åL™òd‡\´$£ýÒÆ¥]ªï– Æôeîß‚ï^Ò…!^9 îÏ*ûjf™Ú-pÖRÖÖ!Ic½K7H4ŒÊÚ¶6:ßì,ÓäÉ7:a®^ô&:³Pøs¼@C!ˆËÊP>Û‚Ì~·Fþqö•ÀSJ?eÝ”÷71IÛ$wk²Æ¢I þŽÆQ`7's<«ÖåqîÊÔa8‰ ‘ÄÇ?ˆµ!ülóÐÀ6&é”ô7DŒó«jû>œRtŠÁh`¾R»|¥Ÿ ‘pØÿ"ðøÁyqÚYF¶€Á¥¥`»ÚF;çZ5éÓ…ò˜›U”e”MïóU¸šòVÁqœ¤Eâ|7¹{ý™ˆiöÐ:wßåã9ܱs&}>Ø,{„÷Í !K]t|0uº‡E©·N9âhÆõeYÌÜÍÚêØ‘ÿ;©©ï˜ŠÎi€k$?=8F†|W˜­’Y›3$y‡±BÛߊ®{Yæ [ærÉÄ?èÞWcÄ-™º¸ïS>)g9¡Æ°¦ôþãÐ¼Ñ iñÑø>:çqߨ ë.}mvµ3;Ü +uš1è¸E-Â{‘´Lq…Ô3å” RRÆ•ýÔÔüü@Ø­ûZÂ6Å„›t­è"šh] T^tCùU,1íÎd½€[…Øj¬hIµ b<ÏTp‚¨ÙºUGº›¼Mz·Äܲæ¤Õ³Ä*&¡t𒥨,›Ý—˜ Ã9é«* „¼Ä÷Öí«©jY:ä;Rm¢ðN?ëGáó´â«È¨øµ ¼ßÒþDgˆ&ˆék6‚l¨où‹î«ÞòR”JZi<Üä¯nOqÉ©¶Ö'ÀgHó”À£DÙ8u)(åbRŽ‚Ú|µ] øºEa3Ôó|°Åñou ËŽ­õz´" <@áxî÷¥BbžÐÑQ¦ OïÚòî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖE÷H –ÂFùÀÏíÿç±E„KÒo‰¯“ÊmUbþå¥ÝŸ@ïW¢8¬2œÚߢý/U…  í÷{6}I:Ò0}–ˆò‚‚g8u(ÅÊOŽè7ˆDF€µ·7B~«9]¸þzÆï {S^GZÍÒ}Z<3Œ0Îðä"H£ÒÓÖRó=Kßoi¾Öqõ ëq÷´õž¢FZôù†%ð­àÇ+1ÑÇŽ}Õ¥BД²_¯—ÁQœ’'Óòi¼a½G¢¦X\ú}U¦±óKB!=èK»”© ÿ€F‹y* Ùï+'ÓsaH·óèŸm›®jG"’^TÏ€²5G¨(Lx+û›z$³m<ùžyñôàº6;„Õš4ž™ØŒO}Òò‰ê 7§kàÑÇ<‚=ûûT£u•\îV=p¥üï6døŒÕ@HQîµévC?Ÿ-8£œúHš°f¬ l4*Ûý³ô¯:ïõ_Ô|@ac0޲õik…AI=ƒ«ˆðÖç~{¼˨Žwf˜¦ŠÒÀÈD×çãØŒCÚþŠ)³œ‘ó»>ŠÓ¾—;!ÇQ(\X¤¡Ii^k&4 ûÜÛx¯½ùC7ðv·¾ÅE/.›kü01¬Ï%øQWæ¾#öËY•îºÿRfˆ1¾-ˆÖ]»?®·E++¹W>cSï‡G½ë#˜|ÒˆôyKe­cô…$ªtþcquÚòÇþ›Úoõï£(”¯œá¶Ø~J·ýÎé.âà¼&Œ+’Ï4í’ѯ‚Ž7>ºf<ѰŒ ÅfDÓ•Á$ÈHOE7ý¬G¦´û„¡¼ËG—C:A‡–Ø·ØœþÓE-ú„xƒwjΉiãž(t#A!úÚ…‚åQv3 Ý9I)y–wq{fù4Wcp\ãoéõS_Ë9bþ2ÖyEö°?Æ9ÒìÎ2^„@H—tö›ï·æ\™ Š6‚žàæ ”#_õVµt½ŸkÕIXúw¬iŒ‘T´¼x(ƪ>L$„´6êôÚä9¶/qÂ#,6¹)ô…O³…ryüZªø)@÷#²áâž5ß“—·ºwÃ5ÿ.Ö°_ƒd`2”‡ÅH+oò5ˆõÔ(ꟜX£±Z²‘8ÌÚŸo ó%öÎB—ÓþŽã'$IEd5j‰^ñYø«žœ7¢_’yþ€¡‹,0äUòœÈK}öÓÃÚ¦_~=r¥}|”Wƒîâ4hû¤ót’øÈúD‹7s|P¼˜`V r‘ܤ•i˜u!¹è‡Ù}J°W¢ J3Ë™Ó68$û7ì-Ô‘cƒI-ôÀ2ð“Å~ÌÌ Ô’Ê›šNÝΜ³PÓ]U†Îª6Îw™Ø`£<Ž•9ùŸy)z]Ó6ºÊ4[/Ô¶œ%ÿa¡÷°Vå¾ošga•yÅ„à‘ûö#XŠ”‘”\‘Êûaøi]œ¹JC†S„˜> ÞÏ~?¨^3ýÈÙY‘ô+UÔæTÑàîzWŸ†Àh/§îZˆ"•b¼ÜræQøØÅz¯-fiå8Ý¿‡âžvËÙÓšøx€ø8n?CW<€Â`¬¬5Lñ);JjÌ¿ŸÚëž7†~r¯èIê$ÀŸ¥7æ?7Á饬T¿qIðî3Xö+Mà ŽêÉ8®Þy¹Þ*ÿh4xjÛvØ |þvÿýƒ‰¸ð-‹x#…¼P·|¦Qå†íD÷ŽY¹ñ%Ü!î†A"7f4žqRàEñ_A„ä—j¶›y½jÉŽ#“˜oô ’ÀzaJU¡Z`ÓaUBhÚ„«òxô‡ÛйâÏF6CŒ¡Ã Ü›øÝÌ™åÎ5,¯§³+éÉš,/ùý©j')Z©×cR¯ ÀÛð °§*ÞG¦U8Ãê­:$p óË4uß;Ríâ{}5¦hù}ÁÐ8 õl0ƒ³àLO8¯}zóµ&F‡Záö˜§Øþ˜ŸïŸ{—T¹¹ªàÏj}xô甫…`Áã (ÓN¶¡g"Ä%»¿`÷YFß:>þÉgó*ƒ‚x©j<Ê‹€€Çá±QøjÌ~°õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wó¡E]Q ­Céà “]d½úò•@BÏòlU¥!j‰áêGWAkuû}¯=¬ñvCTìòòÓ]@ãÖÏuñx¡$§ª©¸œ•œ`(0áojT(%€¾:mvéÙpY´cG|!Æ/\6iD=ADÒXIK¿"‰3ˆR~Û‡•³x^.c³ôŸÛ®D}Wº©µÙ#xØÿCçùäJà8ÇcñÂpóAI”ýNeÞ ¿¤97ÀiSW/G!„ •ÔÉì© +4¨Ÿ†[XjÆ¥E.9<¯ækàBÀ€~¹›P¦Ãwú’¥¤ÑzZÂþ·kú§ÉTü‰l“”«2hUSñsYcñsY²o(•—‰Ö=`œî²F^¿ïs…Öu|qïJb÷YŠ:xçÚÓ–’ŠÝS'&@ª°ö5SL>»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘Â7ç¾^`[GH»œQH>Œ• ÓW{ü!opù6õPáçëïgbŒ4UcfÉ©9/ƒeázÍóâ€Nž²«›.O?žHlܽ¡ÜÞ¢XÜH³"qZ~­nt+\ÝuÝJÑÿ5仯êM£zSü:‰* ›ýÿÓ‹ý}¥wè[N¸Ìp«©Á+ÿ*åƒÞ*'› IWß}è?›Pt¬e¿S0GÕ³w:'VµªÒŒÑN/>®²Þªœ¨¿€xžÜ•˜LЗ…«³2{ÖÊP¨ªârâž(Œ²×UdËx'Aœutß¼|'wÿIäg¢fDÇÞÍþàì›m¶Øþ£€/€—©[)”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ" b˜x˜GY.”âîÉÚ±<âÄáù%@C:a­îiÊ_yAçé?;š‰E35WuæÝÝôC${™¸LR€À\±mÇÞñŸXSÐîa9`h ã€9JLx§*nÉé"ÿTëÁaSîŠ1ƒñXˆ˜1‘¨}ÿIÀGàèHU&=__qjÔs þ™l™\RZåöú¾_o©ýöú?ÿ±¾_o¨½öúz_o ðöRÄú½/·Ò*}]Ïÿ­0á#5¾Û®Ík1,©6Vt””X¶òaÝ®m–‚\Ú\Í¿™Eä'ß࣭¿`³ï¾ŸH‰f€L[Ì:LJZÖOË2å¾zž°«y€YmvT>+¸&Ê#Jµ4²zJÕ¶Ó/,§ûϧ'Y]téÛ´ûX(ÏzýO“[FW´¿ÓäàËcrµ´GVrã>pÛž¬K­ÙtÓ:åeíïSÈ©¨~ÌWÖdæÜmÇ%×Ö)»v þ#‹0ðG’"–}!`,ïL% KÌÇIX{fþ¿7c!Јà[óo+Žw"ånœ“Õ©¸ÈŽ›`ÖÚ„Õ{Ù \XÅàŽ$LIaYˆI aÐôÎ šªÈP?èÖ@“5:|IÌÔ³pœeðïê4£ˆþt½Að b<ÿtTáÇϸU«–nDõŠ–ç}Æ£hè˜ ˜Ë*4(}%3†¢ç®3ðËn˜h3sŠ7â;þta‡qaȘ×_%¤TÁ÷3•wÕÏ”§$ ùv²[_ [”§“£þ74„Ówƒ¡åÐ`:nE¾ÕuØ@,—CÅ„í¿_zßè>Bëð%IŒ~õÞ+É"¶\#II‡ O¤ÚOº÷Çநω…ÈMRS0E•oEõ+èGZtŠÚ.ƒï^¡Ò5Ó *¸’† ÇÉ{¿ ¸´FÎ`´°8ª@A$à•Ècw›ð©ŸQ¬T[ó^R>;ºÖ»è-ÕŠjŠ\(2m1a-R9aí­,‡ëÊÜP•õO{t*®HÚÀ3å—W¥~3]8ìfX1òq< ›/(&’žYf0·µ7› ùhç ‘ÜWµáÕªB*êCXàñÄŒj¦-\Ç68®¼óK7:¾‚ã´kd)L÷ƒI O‡sþÿ7ã!A™J+Éו9}ÖrBfIhë3w°³ªÛ¼RÆ,¥!Ž>½n«üG‰ co7-h$ZÒ­SCS´-WÈÿwE…p@û«È øØƒÇ°~Þ˜ý„Æ›üòn÷»˜˜hÅI/žÆìT–ýýË×õæRMP#0~ZbŠûìÖJ†?ÃOX}t„¿©¤0l08Ìfgî×b7À3U±Š ê ’ÓÚÕ9¦F¥reGšI‡Â`«P%ø«øF|âPì_0–¹µ4ÂOÅ@è—ÓÑL•°>.»µª¹%î¤/*ÛÝUX AW–Еž)WüÔñÊú6€zl¯l=^‡õr å<á^NFZšS1ñõJ” ™mNŽž3F€i~•JÍ:ˆgã=]Á©> lå>EºÊåz_“A™@­p‹óUýÒx‰¾‘îÑ×D×õ<ø—WrÔ2Q9$õ{RGÎþþéORe® jÏÃÝuGÊ‚>i48·uܺèWõ•z·t#:{ ¡PO¨v²€3·ô~ù^sŽSŸ3jŒ"—u·Æ6M± ßýØríoÀy…óGìuê—úê¥ÒØ¥•9ƒ‘6Ð.ÏJ vƒg¸VGѺé+âÀÚz¸Ëf¹°žÀíñ;.úõÆ?k0ÿL°¬  G“ÃǾhO¤âq äG”˜hwkw:8»¶C®ûͲîA~[AR Ǽ„mô³Ou M?*h-¢ÝDI©Pǃ0·çrRäåw;,߸áj z…j†}[îâÇô¬2¾_dÆ¡ÿJ`vBͱÍUí†".Rpu²ÝÐbþD–WO°Ué©£x2\_ÕCç`Þ“\wØj¶' èŒ]KߢßÙ³ÿpã+–BAÜâ›Cíu/±éOÀhü#9*™[¹é¡ç3¤‰Ïåz\ÙJb¹Ì¶R£"6ÑvõÇnü¢œ1àw ÈT æ…AW0Zµ mëé󚣦+½¶È$HGk~|ùp)w(û¬“ÂM&wh`S­ûðÔ^î+sñ9‡Óà FÁŽÂûV•éQ(w´†«2÷Æ šŒ²…Þ×²Þ hZØÑD4ê¶®Iå0]ÔD´½ö¥T“+'OªÓò9|V h9½oŒ‹Mùû(¦óªol¢ñ(¦ãyÒ½û²…A1Å¥ü ü»gvËÔI÷’ùCYxrù‘Õ ÊÂIñß mÅ™&(ï²ôÆtgÍÓ!À⤀‰5mAú¸Vü ±¨æƒú å¨Gu;Ù²P—tæÙã«ÍŒÏ"µôÊæ ä½/Æ´Ý0«R+«XÍfè-q¥žûΙÛZ¼zü”ÑÏ5uJ ÃÄV1àB6”×4éy|†>¥†ÄŽtÞÖK0Ÿ_ŒzKƒ™íNô^®=— s`xDèÚ+µþН2š^ÕépÙZ5˜˜ÁÆçh(ü[å2\L„³“xD^8 ꟹi%æ‡äÓWòm¯Þ1”t¾¤œîÞ9÷zÂaÄ©]jH¿õ-uf™¦Æ|e 'Ò½© ß¡ €íŽúÿ‡ v”1éAÂGþ‡ßŠþbµ»Ñ»Ëù5—fk*oιÿ|ižïm'lšJõRÍÑ’'°ûWÏ$Ô+Ew‚5'—ùoÓ´—ƒpiþ°<$P:Ð JYØ¥Fýãhþ‚O¬×ôÙ%6#öÙ[ìµUX—$ÉÄ’xm“"÷dÓ"­kD³¼.üB%mÑ *­[F‚ÊfÀÖßYöâg\cóBÇG`Aü6z}=ùi/ƯóÛNÙ/UphL6#àIðY3.X) 9Íî;G>a±¦(/xj²2‚йw GBí¥¶Æ* ´Ûb‹QÕÎ|ÝÆ”Oy«W^á¿aíLyhwP&M´O­L‘À‘ð7žê¥@ «¹þK;‡ÂYm”Ø0G·vòa±£WÇ»®_´¥ºe§€jà âx–ÄœÌĵŽô ¦R,5 „¬Oa¦{Úv?·²íOZ¢ ÑDäí¦èÆb•&gM §^Æ\¤”Óþ®ÿSùbœEç‘^ZOì³ÿq…DŸˆ-ÄŸ+ŸûmsFE»¨²oMK“úÈL2Q9j [”ºÂv[‡gÊ«îÉ¢YÞúð3ðDè͸†Š¶B;tè©\ðwÌ|î \êW‚¼=¸t¼¯Æ2Lì÷Ã×puw›{›·*¤÷õ½£ FÙœ+ˆ¶E8 R×AÕºáloÕ™`ØØ(Ö­²‡ð™ õH«TE<âz§ PS0àO9°PØ8ª–×§#ý’^eŒ½}Kp'¥ô]ƹxåsíûØòA^ékk¯¯Ù-Îæ½Êñ¤6â®<2Vå¢ úóvü[ê}ÆÉîw ¨´‹åBÚhx¯‡Ö# ??À¸JúHz'4¦.•S<ùõJ©'·"˜ö¤Öú!í1ØÚö&:×Á*¯ /7ýÊÞ´êÿxŽ&ÜÑ;§9âáC/\²îäËÇŠYÖ“IbEe,ï¤OVÒ\ò‘¬ áùÉP™ ë‘A÷/ù®Ñö˜áˆmGQÚ‘<3>:«Ž–ëð£+tñv›/ÊË`1ÞËdqžPÀº¥üŒ¼פ'<Ñ·Â Žkp9á)G¿‚’\!¡Ú‚uáù3{ð¤æ¯+ËYĬs#O™ð ~©T1ÉÄc€ÐÄxø¢ªz³WKWŸOTêòqTï@6å(GÎ킲"£E“!É }°•Ìb\ç"4¦ˆ.ƒŸÔªÞÑp¸+:¨Ý›eä5n•G˜ŒrÉ@²û´EÁ­ Êv)w„(çŸ`u±gq†ôËÔ®lÁ©$:}«ã,\—­;æiÊ?ýôæò¶?X’jw³6,¯JÇÞï(Ùò­`ë–Ú½yG¨?ž…[ü ¥ AÈŸU§zuJguüícÞ+ T y“‰.’*NÜ2!¹Kj††ÕÁô¢É¯#^tÝI"´”v¥[½,~Ù`?+†^Oº¢TkiÖ?1©Æ}Cø£*ûÍL³VØÎp²õmÙ/æuïX'ûÀÏ“¢å>í±’%ë@£ÚÌþd53¡ï¸™H{ʯ˜°£Ÿ÷ä M©LÌvŸÜŽ\ ÂÜÓ‡W{Î!ögè+<ã›]—}Ù*ɨ®B\®ÇrüàØôJW\„s Ww—©Y¸»Ýlt{bŠJ˜dˆ”Ý…“ùÆaç¶Û=pÁ¹rSa>ú?»¢%ÍmˆÌù;fÞà Y|u*_zߺMx±lö¿'ñ´P̽ Þ¥Ü €Ó”š»žý±6Bþô5GéXÈÈÆ_¾®iîPJ©d¿Žè_›‘iÔÓϦiÆã@ÞÅ¿r¸Г/üD=gö×>2qG–’¦}ç¿@ìŒ4Ó%UèPÎGQãñÙÕ=ö©nê‹âíwc¿ÀÞgÏIðí;,Š“x<&Ï%IaÍ:˜Œœº m’h(T(ˆpD¨ᇙTK¸×ù;¥³;2äs !ÔDÂ-††ÿ]tôMþÌåi†@x$ËýžB•ŒÔu]—ÐuÒ»æ–Q[³3µIŸÿa™ì퀛4(>ØÐ ª¹w§»Iß eš À.¡Ž7`ý‡é-çKyÖ䘳A„ƒ¸ŸCIÜîW}öyä3©ašuÃ:ÒË(öiya£HO5>¸zÄ*Ó2Î(‰öíÒù[bÝMÜ f.ßÈMyÛM!ÅÏqµA¾¬aœ‰³¹mÈ¿ €ÍÂ8EB:Y?x«=Á>i>¹ã3:K´S¿™ôUÚÉâd‚¨Ž¾6ƒvÿPx—§$´Â}ƒ¿)d¸|Êš] { ÌŒyÊÅ þØ1+ø£”õ?؉(0œÖªÐo6x~/¼Wv|ã‘ZË1‘¾˜„º)÷é˜BK¡Ôsäÿe¡øÚ^ýÚ‡<û zq/AÝ9yC"Nû]H~uÎ4ï#°?ž"›lk3WuÁ Çâbxɼýþ-Ìß6yQ|„À§A^=ëJŠŒNšT…w&é¯`úµ³æpTu(;ðP‚W±Ç(‹öÉ3ˆyÄés’3÷RºG-¢ñ«}¼ ¦¾çwšb‘mlPof¿¦i|®k «QE:ºüè6(ÿ<ô‡k?\ñ‰ä¤’I$’I$’I#÷­iÇ 3Ïø…êÁý9êpÚº2úV´Æ¼U]óP]è“bÞL^%Wc·t27/€Ð;2zKsÛÙ¸ÅÐ=GÅ‘;šO°Õˆ³ÅU:싟èqªšš+Š*Eð‚¡Œyk‰EÙçƒE!cœ2€èŒ@ªû¿š.X=#÷­>ýÇtà“v“ÓxÙ"´èc|·êÝþËÒI ³¢,} P4å¥ xB„*¢ç£¤J lË¥kF>¯d*OãÝ—;r”a¯» cÄëÎLÑÞH<ûÏNy«òŠ\3*_`Ù´îãÌ®ñ1-ìn³éå>ŒLxö†1UÂænMï\8Ûâ dêšÕnÆ)²l! Š~éÉ Êì4W´œ=1; +Xjt†J!’@—„E²,’9µ@ßÀx2ºÂÙ§ã,GŠmws³i SXnêz.‡TS 2Ökº÷±üIQø'Q×FÆçÒjêr\|ÜŽh8^f!¶7d;Ú·l6ºï¸ÁƼݞ»÷»šì„9/¶áè„úF,ç¦N½Ìs 4ƒKv­*àŽE4— Fî\X>×_ÎÄÌtÄ™T%Ò݃â´ïG b~’ £ëUj Çä™v‚‘eGË¿^S³)>lxÿ"¢·GwùòÁ(5[<‰¹Þ¤f†:íØ'6ž"˜÷ÿjÙ¹¾¥ã¯ÀnÌe 0UÖ­ kg‘ÜÄÏ@'ÚÈþ…Çbÿu*žõåhox ÕöøªÌD’–¦Ññ¹*Ø: /˜ª“½:hóq0ŽêGE²mhÑàm£öãM@] Ùê儃dÜ‹¡÷ ö[!ø‡–¦†î)cm»Ù:yÌnÄ=Jˆ8£‘PñTPxØfk,Ôçö”5þÆKä ˜¨ÿ>/Q†i}7Ç÷Ò©)MT¤BæÑ>â§"ü+ì)š¦éäƒ4ë›DàßA¾Iµ:°¬ÜHÁoý׬Âîâ‡")/f„ë½wäi;Ó: ø€ôË÷ñò´PjvÊæèÁ)©Ü“9t’iºÚ)ѽmØ®Uš¦ñšzšq×´ÓÛ¯Ÿ¤D(uãÉeýÿK˜‡Ò.ø w9Ì×[ö€ *z™ÃEêœac-ÛH²ù«4t| °É€áØÜêº;QûG„[°—üéÛÐqàVÛát ,›]] ôøUe+åÝ·k¯z#€€ðvìCä0ªêBZ‚QTƒ2Q"4ÏÊÚßø¾dËŽ`¤í€D r • ÑàNÄÜj–4J¥ÌDíÛ%AòõôΣÓ=_‰êåÛ'dGqïäßP)só ®þXCïUñ7]1éÔÀp0T ÈÊ—é¶ö·‘©šñüa!,$ÍÎÂô³ù;¢2ÔuC|†ÆÓülxJŸW:Üj´‹EK™£åøúÀ;›í€ÿ&ÃÉŠ´N7jÌ ŽÊ]X‡í©÷Ñ¡ýdùÝ8´`©<ÿZ³˜ÓÖËëw øHʇkŸMþ¥Ô~õíùKEä3]³Mš´øÔ°swÂî6À]‘4$ÕOܹì§r\‰lî,¡qÁ˜{fœ"d*C`Ö¦¤Sᣠ.<)‡ì¼oO±Åæ,íÀf¯xÜÍ–ÒωAŽšÐ÷bu]‚q¾Î%‚õ?´H¿™±þíù"´˜1vKÇ„;ƒ G ƒ¢p| ïŠ õ4%ôqní«ÿ’¨Xrƒc•û!ðw]Ì]õ´GÇìˆ:Ôw- yÁ §¥˜ª?é{³kÔæZ-ºdÜ™U/Ÿ»W˜Œ¼„™À£(m¨Øƒå;zý©ùÓ£•î~HFGÔôCc,ôz{ؼWµ$r@W©›‰¥ùSB]BŽ6–8µâ%h°YOV”©ŸÙ—¤b¬ÑQÍY  cžìæ¡â’¼ˆ›³“/ñÐ ÐIüÉ*ŒáÍšm_«ôlÇLN5dÅ¡¶1ãÈ¿õf4lf«ðø«oúJÛ÷| ·‚€&%Vô…vâVhóG>]yö쪚£:ò@ÍÀñ/ûçÿ1L¿`Ma‹ÔRõŒ$_ý©p9£l„rí¶Ï)gU}è×èfP R½–m¹A{ìI0ø½\¦;#ÒÔ7 ñâÕÙYÅU)ÛRaèÐeÆô’ù4û²}ÃsÙe³iµÚxó3ÂûD¨Çæ •_îùnã9óYçÌ)ÿ5=àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=žŒÔº<ÆU4­¸zÕßÔø;M\í0ý,7"€áêNjbÏïõLßj±èìaøeiÒ2ÿYGs³ºau-Ù3 †Óv†WÄ’žÁ©‚1Iž*RWZ‡dQ:17åBSB CÓS·òfŸùNýÅDt± ´r8šÏŒØaàìðt·F’ ˜„®8ϦZ–¯âáY™¬4ó yJ£²)=@€•CûÈz¨¦²|…´×Õ+ÏŽcÄ̽~)×ëä"qð´–Ô”me·Ÿì£©&fèôžŽ¢QIk-4`‹œŒ\øBÚsa ? ‰w¢DšLÍòv¼KT©<¾áLûÏ1ïútL“ÿ,v°=X Ô^;®ƒ1uƒ /EÔTf&VT?•ŒÔ¿Èä«:OJŸC»“ÐG­%ÂÚ±[s©ÂÜ· ®òñèÖŠ6á@A6ŸOêGçœóƒÀŽñ>Je1œ‡[#V²Òqrâуñþ*v’ìúK½?h¹tÆ~FŽ.º”U<ýøeóñÚèàƒZM7ÕÁÖõ¹ÞÎìÏøššÛyëÿ7?z j ò­±£.8sß"J󠻯{Þ¦?‡&¬SùМ‘ˆV©š s 7ãb„D¶Ä@1Tmá ÃPó²ìå#†š{`|GÂ>Êæ»•OaA8±êˆ>ù‘–ò;p´kÉ¢ŒçI”¥õLEÆ›×´Q\~rž/*nG¾¢¶J1L·ø‹)󇧆ÓKï*|¿½˜ÎÍV'e'6ÿGî*N˜±èÇ…üzñŒb½SÐÔý§&y© “%}qŒÝ!€ZEýYc”Š´äɘ-Ç3´6ḄxËÞ2ÏmžI 11Bºÿzƒ¢ÆÄ  —ò¨>­ÕÃý¶%ìÕ¶ÇzDtaò²*¡øférsnq Ž}XÒŸ&4ÝÅ;ÌeóMäh?löÿGí³¼ð'ŸÍË+³×h®нÙºNç¼ -§fĦeÉÉ¿{B?Àn;õ ù³jsüYg‰ö–¹L ¢mÍòa¬QEÞ9AÔ]Ü^‹š&ÙŸbãÛ3k¾ÒÔÑœ,Ñ`Nâ œñÍ÷¸$/cÌrŽ>56ª0/g'æ¸ÃLÙ¾DÚ\3X\ÚP*€T€<1ÂÜAŒ®÷ÜÜάc=¼ž]?)£³ÈdÃ'8RËD(Ž<ÖqÝG#5j bÏïqR\軾ýGNøÙ(FODY@˯IÚÇ(éhR/È äp:®?´¾ß”±hÚ3!o“åPîÒÈ54ØOä…„6¤¥£(¾m£~s¤æ{ˆ)C¦RÖºEð­–Èxé=‘»[¾§.ø(m¿¢éN3>—‘Z’sÜÃTçB)¦ç”ÛìÕÐÙþÌ¡¶_ÛWÀ9pÝžŸÁg.æWZÄ1Xªî³áÝ"W<(þåw9 ܲû6[@1»Ò{%^ŸñPUïÿ-­‚1·„>Ø:jû%}¸—& :X­ýâ_ö«ŽŠT–ÆsŽÞˆûSÝÆ‚Ü€©©²Þ¸bõE2p«b‹Ü‘'æp;,ˆi#Þ¿JÚ°aÇq´^ÓèМ(ˆ“¤xð‰§R†%Û"¶Ù‘€Ú÷àï»cú’ïÀ¸iÏþRw Z·dàÏ>8˜N·W:{Z¢kX³ïìèÅt$§D7XÖž` Sù¡ÓæX6 îóïúü);ćcƒ)îÓêõ.&û’Óý}:½U DÓ—’…|üˆ¥,í8+’w)ßt9å )©B¶ïK¡u% ƒ\l”££NÒ›ƒH`?“AAL+V4E.V :èNø,dÏ´Œ«—ß¿™wœR%[®^ÖgrÊÒHÄs£cL¹]ÿKÿŒDùíY<:8×h»'jD‚±špÓ·UÃθîÂ@¤Â]½ø©’Ué1u2þB,Á{‡“·»³4F8Pk}K6”Zð\QâÂp¥É")Å›Âpo¦hÜ×™A”y¿ ñm’ø/¨ê£5sl<¢ÜJË(óÇP0é}‘ûŽ›W|O /Ü–¡°ÏƒIƒ€Ò]Dq²â^{%6ÚÃåú¹Û+ºú*»Œrcßž#‡¨A¼5BٴͺËr,WÏ:¹ßk¿ÚΣõ¨¬h±›#ÁCÛÑ­Æ? 3É]aŒC‡óî!J"¤¶/×W±Þ+÷©,þx©¥Vó+ÒqYÌì‹|Œ$Ž­_>!á¯î!Ú…‰z‚¤êq«O…b.¿ ÐñÞSj¡tOn²öí<ã5¶¦uTßQ_ÈÝV–#—#$ 1½=lزUúÌ·Yž¥7çj, 6H2ïâŽBl¯#,d¥(y Ü”¬¹Þätirãòbãc·LÞï ëEvΨ˩(é‡xÁþB^×}ÎE"¸˜OUB3æÛ1„·rùÕk†éKäñ{£vÆ£ ™ÉþkÔ$V„KzþÕýäV@Ù=e•A™ó{!â³·°<˜/û©í¡Cß ‡‘o`™9r )ö45´X­¹»ÞV¸‰ExòÖ4eœàÌ€<ÁHóZß·=+yÏø¨ŠL!‡ 'ÏXúÙ=$»,oË££€À;š¸#ý‡­ØÝ¼hO½ˆ3Bfõ?“Hçj^ÑCâGÏ?ƒn+×É[±)E!½XBy¢Gä(…»\cºzµyÛÁwh›‘hÊñ5$=þ}Іwq©÷¾:Ô|™9™V–Ùï‹@Î! v¶ì‰û–ð`ýjØÓÇL¯ ÂÒs*9WS>ß´ lò‡üË>úÁ0hYwìÝÇ"{sðö7’/M ~ñœ©mãmÉhŠlI3MF!uÆ^Ä•­R·+ñk.}Ðúl„"ø03áËÑDÆ`•Å/gGü›õ$£œ’ê–É9ìI® Üò?_ÆY%Ûæ‰Ê½g£ÞÚëۣ®êT 83ÓÊ!o’kÏtêW/H¥`ßÖ”Èx½ø}Æ;ÎôuGk¦Ÿx*Óöš4¯QàÅV¦MGKÑÀS¯%á¶d…ê®'|*›g&ðצQ__ ­qhcße[)xØäÖvWjÆ‚CÖeVÚ $Ï¢G+„­JÚV´óS÷XÚQóCÎ.zœ ‰õгȩ2½t.±Z¤Ò_$œ¡¥tXóÓæwÈRÃdͱЎ̵èì|iùͶeçF§L%ì‘Ú˜”dgy_kÁrs8iSuÚm2õÏÖaÚ(úŒÝB”æÊK‡Þý/‡þƒlÄ’€=b„“»ìÓhjWãNÐÖ‹°DÔºNºnÁÄÈ+Ñέžöó$ˆo Ö5J°VgFóÀ^â4¤Z ~þNóï4±£|Ábµé¥·:ÕUý²¾­îÇÑŠ$Ÿë òïH÷Ëe,:ÀŸÏʈ‘˜ò å Epݤî~Z½µ•ƒAÛEM$2/Ÿ@M–9‹q°ý©ÔC¤›hͽ{cЏÆ@ÀžMO .ö”v<>·ªd2UêØgc`fOºÚ}R=e s/®‚‘œÊò›^òHÃm2ÏHªÆhÅ÷åxG– $`Vä]Þ('…Và5.f|UØ-óÉ:@u>9tˉ8·ÛÄë •\ŒýIéxyõÈ[§wz/_lÄÁ¹ˆiÑ>°ÚlOiËb“‰¦HãDùÔ‚”¶Ð»*0ÔÑP.nR?ålt™äiÍXªà†L{©«{Ãø0˜[_`ÕúAV_¡ØW ƒÉ õòÞ÷wñ‚7C ùþ² ‹•mábX±2‚4¼Rÿ  Ð:ÍR?„zí½1ʯQsÜaY4šÖáûdϵ]ýReÞãsÌo艫iÊ?ãüKLJTø=NPjm¹ý"4òžìœ!ÏIKýZáÁ¼è®þ(‰öóîÔà;ìÆ²/ÀðÚ®Õ”Ì!G<ÃeèQyVø õþ[ƒå25™ÆåôñpJÖ®Ö(+: $ È¿|¡9•ÐJ8eÖwJlRàV÷07Úâˆ\ùÊpAg›ZÅ#ì  Q:´]{…ä‘vèÎ0àÕK“å˜Cæç<ïðÄjå4$ø””fïsY>¡9T{(M#™UÊŽÀñ®’ɈÚáÙbÎñýr´ßý¾˜•Â7p]| /$Ô"ÎC㉆‚7”µ—dÉ(}¬òÝÁ#л~ñ/(ºZ·\é·­öÆ%ßT ÌÔó%¥ƒ7Û{pC,nþö±¹äÙ9ß—øOàù a‹^›ûášP%W=´<–¸ªÑìŸPfˆh¤ójן ¹,›r IŸÐCÞ:¦y‹×ŒsOJÞ-=r[¦½¤@ëKK²ŠQ 3ôùr¥ÃÕÁ€ñëØWàP „,˜4È3B–eu»¦T½nnƒjËÅÑÁÿ0¼ÿyä§ú7¢„šý¦K›7#wbBßžC„½þ%ºð¨YÖvóí…WtÐlEj~!Ë'¤›VÕa~:¯§ó§Ä´Ä\T„6FUœ+·T¿û>Üãy04#r©™@€$Ò4’—õF ™²¡U¡! PÞ70àÁ¦OÊ@úBZVÙ:ËH¶$ –Ñ\òíò¡Ž[^{ JRTå`VNÒPÓóŽLSHB:”š—&.ˆÌŽscB¬‚fin-¬³¶(8‰0×<úz¹+¬ ªw¢Þ^En½ž}qcAb±ååìÔœØô>uøÉmb“H„dO`Q$‡'ã^ ÚÆ‘§äOîfø÷qÚY™Áâ¾ô$5iWƒNFKBkŒ†)éoñ¹ø~®5X:iÞ§ÿ11çÆä°¯¹©Êµö29%ˆà fc›ÕG›—Ta¾jâî‰'½Ý‡çzv%¹‚»(Gjò %«ÑÒ)ÂŽ¾¢¬´âˆOÐÿ$´oñ³æHÛ}6éé¢c,)ØKÓqå‘1üÔ~&Ìœ,›áú±c«’Y1v¯/ÙýfÏÁ þ€N-¿H­“Ê7ÆÏyëW樟5_XÑø*'LTº" Övnw¼ašêkÁk˜þh‡5‚>™ÈíÇð{°!Åo«N÷³xë1ÒzÊLès¿ú%CY‘âc!zÅo*D—ün~¢‹;qýœ=CˆpšÒŒoàAfgÞd“ x££k±ìH”Qön¯Í9SÜå¢b ·„þ'Ý“ôgà/·ˆ;InšÁH±NÝÈ[ý³]’s%öäž\è2G °ä+EEÒwÚ¬RP½"Òñ©êâ&ß?›uO ›bD]ŽJÌqñy+–“ôlÊau”éÁܲKäþÇ”§ïéµ&kÀ[Ýí^£t•ßb ÌtÆÙž>^ªªYŸK¤Yª°k õoö)+è4RèýþJ4•_(ô¬iW+ÎMñ.¾êã˱1ÐSõ f±üh>4µ®“ð”µæx çRsïM®¯°¹¾n2f« +cË X•¹TlŒ/©Ù#À…¨¶®¦}]÷ß =½×¨QQäìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#\/}ý~ æÖL²s¹R{™5cpxΑHîE«]t›«KÔjšc´Ž^µ÷$‡ìå_Üÿ'X‹97”|”ݳh'¹¢_á¿X° "'GÁô ôÓ]ùzÑ¥—sÞ¿u§XH…+VÜÓS›yð<5û{[”ÿAƒ Ól¦‹ëüitÔ´U)+[zÞ9CjÁ‹Ö8Ñg1š{hO“a P/c£á‚®hOà’`v|ã«3ämÙªÌçGr‹®ê~ˆƒ,á¢k½óœ33n"´7FôY>q;ßseÕª>¡Jßã–3¬ –®\_eþõÇ­vEu㥑4™F¨Ð•µHv6ÚU"nϳ 4d"R?u¡Ù™\ò±o¦ Ý9€BÁ3¶Dpw—ƇÈŽ#‘ÝS" éÁyß§¥W!ɳ†7ûpŽ }Z*¬ÐI3_®¾e¦ä7)-;«Á•:?g½œêW,Ìå3¨O\ð÷ù·†tUjÆìÅÔ,\5~´N øKéÌt÷—¤‘/÷‡Vgý fYÔü]Fü.>m|2öå)Ïß$œšëàu,ÆÉú¨6™ê½¿QrW¸‰ðêÓ—ïô_o‰ûH])¶Þy˜ØÓNS¾wª+œ:wó ñZIkwýéñi)Ð ø›Lm šÁ]ê±CJWÛ:þgeï;XVG_‘8ø#ëcV[¹’ó—ôõ¶†Ù7º‹,Có•5wü­¥{R1' nŸCS¿‘X•fÝJñ¾ïûÅag–B”nWá0yÌíažåºCº8“ý—½ý·qmõ l«te[½ÉLod¹Ú¢Mƒ&6ô¯—¸èÞ7ÛåÔOLª1JT=©91×=7Ýöþ=“ˆ °®šr^|~®>E—ݦêå(™ _ú,¯ÚVA(v2úéÂ$mAž¼¥Þ ,°²ÛH¯Üç7üd‹ˆÛÞ‡zdÀRÒ[»©PÆgj¨\0 s‘n¢²SÄOHþhê<ÚÚÏÑNGpáÍ›!µ„,Xv–~®³¿×?Ñ §Í3/ ¹Ñ¶B­_>UE“ÝV.@H¦œ«ÍÑ¡Zý61Ž‘Zª)«ÐMüÏîƒiGÏÙ†˜”U -àY«†/8S¹É“NV`ƒiWX}«÷(s7un9ÌEþð^>"`×é”´èaô´ÜªáS¡hÅÍøl™]íPÚ^†‘KÈ=Hø¨·Žlļy»Ó®+ÙUgE.âóÃ?‚5nÔÔ€ë“×ì«ÊÝúb0þQ¹Œ0ô}³õàçMt@è 3Ú‹ @¿Ì2~ [@;mšÃPcï¼f¾ˆÙ4"Œ\¢{¡Ø|¢N¯,FÍãV͉æFÜïW6xD‚0–a±ìºÄš ™ž†‰úBWhaÛŠYä×Q‹Ô¯ âdr·Yâ>S#²8¼­u<¿P_x_ B·>ýdÞü¥ˆŽ=“wÒß‚›Ç ­Z‚2ʾžËyÑrs!)î0Øœ?Çñ(5œ®Xéô¹çpn7£?NLKs¯É}ÞªŽ@ì¿àr•q{aQ÷ÁF¹ÌjO¤·¦Úv(ì®1{[(JÇ‚›vt›q“±Óù«jòdM™¢s°§"&‹¥ŽiÀ;Í„Ty<öt n¦MÖšgF\ðg†uâÂ)®lR{ïêm+9Ç 4 3D@¼©?„*€€ãö¬~ÛSö§~ÝÇíLý¶õ'þÝ'Â|çÿ6¯Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ ä*°bҘϩýA¤@Ðÿ ƒÂ™l~–õÔòà<›ý&®=L¢Ä¼ ñÞ–´‡OÞ!4þ~Òìü›8/l%¯w~Œü«9 2ù8èÌÞü-Æ6QÕ6 «_G^W“t Ÿ‡ Pk¶š(vÍ]0¥…ÚøE@ØKâ1Ë;åi¼2¸»hÑq—~¦á•=½æËúœ§¸d—]Š‘=¼CbM}oŸà€…¥Õ÷x#K,?Iõ×ËÎç9HȾ“€Ë¥êݨ÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüá7ñÌÓ2±‰±.t»ï„`.æÎŸY#Yƒørna fenÎZg†ü+k›•P¨60©yoÕ`N ©Ö¨Ên4æ!$æÒÜ4|¿U‰.ÇX­F#.z.©)Œ-0Õ Í[ɬ¥½çþ¶¸±«}ïà¿2{_š5 ~cøIŠÊ|XVõ…fùø?Œ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥`†¦%a,EšçžQñNH¬Žx¾Ï½¦#a«Ê‰°2ÿ+zð`˜ôÄhÎÏÚÆüÆó0ðéůš®¤yÒÅ“ÙïgñF‘UÚq’Å’únÄV'™´GfX+‘·{{ê y}ÿ O:zXÌòí%΂‡Þu#ôÂzKNrwUFÞ5±ŽÆ88[ê÷>Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09 jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ £ÿ“ÏÂö^ßj(©OX¯[tÕ»e2«D„€)Y´]M™|X/GÑ+ ÷qlOûr@'J!Ñgz?³pȯ6Ó"ã•#¹KyB§Ô#Ød\VЮ¥K§ÉRZµT ¾}á×Ô” ‰àºÉí’&µ‚y¢S'Å>#üñœ“tãÖFh úÁ<­=;F;£>ûYºßù¤ø ¯Gœ[³Ç©ÁCÕ¨ŠQ~6™ÉI@µÐѨ$¿Ë¯¢„*²ÝfÅKér•ã1XÔ£<úÝÔ’ jS:"Awõ:d‹•µ±n>²•˜"@Ä gH$åe*Ë€€ÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…*àÄf† Àµ”©cFt1Æ=/sŒiÙ÷¼!À¡4£Me÷U&•úá u¤lŒÏÎÎÂÎÎÒ©7[K”é4 O…y9ñt¾Âõ™¤Š¢p7Ƨf¸¼ÕC?ݸ; bp±Â 0FÉËIÿƒLÇž Þ¢ƒ$ŒÛýqor7\h›cÛ\õ_/m+•«Z)a%)(q"±ó_B‹+¯ÆI‚ä…šú°£û„Lñ ä9„ê"SÎåñeSÏ~:lü‚êôP¼*Ç;z¾U̬¬Ø[眡%âl—pg*™_·¿–ÁN°Ù*æ¤îƒ~¨2Ö ƒÒP„AvaW…šTTî="c³nBèúz:Ûi2Œ”Öüøi—ÌÿrY«Ê{^“Æ|&ð°s+ãùŸJ¯“¼“(ÒPXÆE\„•’ D_?HY™ Ÿ | ’0X($ ¨ôÑó°÷I¸§³ ØýÛ¼‡ÒnÚŒdƒ?ËÁtZg5ªÛ~ÃÜ–›×òß¼Äû¦!{^›¾Xï—'­ÐB‡ sý—½fj5z²üE¿ìsʯ9|5u}ÎMÜCØjÍ{lñ¯Pê…RݘgÆÚ ÿ‚›|—rÆ øRSEQ©Ìö%ÝNMÀ¿IÀGa*†*‰±TO@é_W†Ùe8 4±Pj æE%eÐ&#¬p°/%x#˜`³ÕGÔµ5iŠw'@â}åM©Æ™È&t,÷­ÈíðÆ\ïòêÃòÚ V[cOˆd>9Âÿ>˜š÷nÀÅÑ1k‰Ë 7¤¾S'v/ó\fd-œäµW›’ŸïŒŸ\Ž~‚sHL_ÞXè­½$b͆õí2ù­J‘ýð–?ÖÚî_qÿC+­q/ã,æZ¨­éC€€ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4v6Åro^$¬W;*YNŸÃ:èå£^pÏreè(nkb"¹gÏ`ºƒZ< "c³nq!'ó J®Sý÷É!y¹„Šw8tŸ€¡‡£{|émy’-I¤·…ËÛo£pþè…0«2·7GàŒr˜>ýÀy¿/ <Ç*ηºÉ$A”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœï,ñRžZû-Rmë^R¡Pí³Á²ñ0)•wÆå®bwáØ2Š:v¾ÏϬ ùõIŸWฮwm¬i";`n†UPlvæ™ä¨ËGN¹Ö·PéÚ'úJLK}ã:n¯q´ x¨³¢3ó)ij2WÎÅPró“Úm»³J–»íËt³3ž¢ÌpBžÆ|;PmsÓ~@c3^+òüÝ¢lX’žÚ!½–ï¼\tŽƒ]`É’ —âäS‰qIû¬í42Î4™>$’"5Ðö§¬$Âprz7#O‹½(ÛA›Ü¦9:×(µšÁR”Êß/&‰’m¢!ðWã~µCÿL2m˶E9Ãýªvy¹­B‹"i·‰|{O9sû,pÆÒwaµlz¬m{ŒœFØ&f!¯ÍÄx)t‡‰w¾%r±û€³-ñW³n¤œHvC8ž‰‰­êüÊ"ä\e­µ6@K  ý†ò€ÔõnY^ÉÈ…ðôZÌrm2Š[™…ìOµ}òº'Q õäšbjDÞK|†Ïq„š@êˆÄÑ öãe»”ö+=!\ÁÏ‘°²áp&™€ÝbGRY/ÜbžÞµl‘qÞ7áuä¥@?ÏK ¨"lÊ@Nc’»A"¿Kþ(eq§RkûÑÞ/CÙW9§ ™Q£·{Ï&¼àülù)˜®5EÂy›:äU‰3…2¢¿ ­¸á\>ªàMš¯Îï•äB!]<ÔŠ´}KÁª‰DÊ1œZæw›k©4ž\% ä_¥|1Ü©5 @¦e¹ŸZŽÏà×ЪDy¤CKø2tß¿t=u^6cB™¶ï}söð=|3˜%û/Xô—9 ûtI¬‡æEAy;{%OSþr1w«Nòýɾ· $úP˜ƒLZÊ}FçB<õàÏ?'%ÎÌÀ6.œîï;r…¾ˆ,¸âøÖ”ÖB¢‡ÛÙÔumœa’Ê…ÑkÎÒp›§óÖ¿ÖýZÄtXÛ·ˆùo9UíDÐøÄ$U˜# u’©È †3dͰSä­Ûí®ÈÛkOﵪj+d-3¼ž|± 2öb œîjÖÇ?¢˜88$jÖµe4ŽÇ««Ô©! #ª 6îl•kYÛD~ íã J«‰ Ìš5–`&a4þ ®Øˆ ³?ù‘ôÑ+kã`ކ‰îÙõ¡Ãà ñlª];nøáñ0¬‹RÕüL=‰CÖôÒy7*m ‰wI ]xcŒ—&qÝElç½À×­îI{ž9<ŒÅ‘4ù–0c`Õ€FøÓúÇ΃ۘùú ¬ÿBÛOºŠd8i g„ôo]~’qÝ]Å#(Ä !EþB¸Ã=Êy`Yøð{NmJîŠÊFjœ×¹GâõeéÄÊ©“¯Zí 3@ÑâC`í}w¡Ÿ†};%D{ì ¥Äˆ+X M`J3ýJ¼WA4ÌÄVZ}í¿Ðª ê«²¥^IÖ¿ÕL.ðX±_äàC,Å5ï‰ÒÓªGBg•–Çfæë«Ø³¨öh%"ð~¾CºÖ/¦ÌÊï¼no`)u‘dZå2Äœù;©tOÒ¬yñúEO;v“@W1ËwìkW9M@kÄe;ÓšV™sÉáz•¶ßÞ«ï«M'HŠ(× ÐÓðÖW³‡O°‘ê:øx‰tÄÔ›`1AÇæŽªÁܰÃÕÂ2“(S iB°õ›8°Ûk|Ð,Yš² |šš0P¦>.1h€°šUý¦ãôì7)fÇbûŸSë!ß(3!±Z®}jJ¹Itæ}0tÓù^PŸ¿IÇO¦&¯?´$Ót•ki’ĆêÇGïâ€ÉAt ” Ȧ·­Ð&2m¦G_üKEÞ¡ìå†5meÞ5Ç-^± íïæHL¯;eÓRØÓTß½‘A2}³Žz‘H'ÁR(ƒƒ7eåFž 7¨•vwD…/à t׫,(qÿ0øÿgUdŸm÷_a/Ï,K3Føݯ»ïÅ«Ñèʇô8޳0 w1ñ Ù£Gö·Fž‡U”³LÒŒý.Œ®­ªÜ¥9Ú@ ´| wõ)JxK5 ”|jt#YÊs˜ÐÀã5D¢JÒ–ðÀÀãÝRkdÍJÞwñ×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨ÝcÂÈÌ àcc[Ûø®ûoÿ2°‘÷ËrdHW Ž˜Η÷Ee®9­e%¦iŸæ‚dó›És75÷‡èy¥"m*Áu¬Ç'*àvÑ^º9 âÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞ“ÑY•†äªûŒ\¬‡ôF e,ïª$AGi~Öœ‰ Ôë¨&HûŽ‘Ðº3©BâNìø¾o´òÌŽPI$ádw`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/mäRG:wA{§šü/WhÍõÚo aîE6ê!K–â‚—!¢þ úëâƒN8îŸîHÙŒßsoãp¯Óú6d[öýÑI ŽªOë0X<¶a( R‘îLÐDDÏÏèΟŸÐíŸÐôóI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿnÉ`:_B³wÏ”£bn¢âC9_íµIÂ¥?¢\â©•i½)Ÿç% ð&¯ä\:{$¼û—S8UVþg¬p³Cí2.YÕk„¾­cX;ÊDAdE«m;\8t©Œ6wø’j߈#brH™êŸ7_åfˆäj=[GÚ鉮>®Ø 3=U¨éÔ¤<Ó7»WÕ3,·8´¿[ɹ´¬úŒk¥Ä D¨UÊ[Ì®ÔfíÉ¡F$z\ŽQÞ®´‚8«q°€æŸ ¾Š™4¨:Ë®¦Z}Ê'¶mŠôÝख=2åÚ´ƒå]Qné{²§Ö pm#·Òuô —A Ç3ò»EV\”Cûæ‚€‹qcW[{|±âÎK(¸–†çJk ¶œ9-,µà Ž.3…É/zUKufçÃ>Bìd¸ [Kdï¾ïC3yå’s¦ÅN”Ò(¦\9´óÉ´)&z‰1î]&‰|ëÁ0>FÞ`šyËK<¸U߇PZ“BÒqÞ¦äÛûÃØvùÒxnA%w´çtž_„ìÕ¿ j@f¹‰Š 66’eÉí,Ê,Ð?@ÌXÆ‹éާ!ðìPéù¾˜pk«ºÖg`K5Pì]F¹²a¦oà…%cl¼ÁöÜ\Š Çr¿Ÿ–Ï'¢x›?*;Q*3+•Bªªíß‹|Ú2ÖÚv¦ˆnùÐÚuàþ×Î4ìV=‡Âu7è pÆû»Ú‰|Ì€ÑRÿp•Fk¯>+Ûè1n»ï@¢slL5$ðFóHDÑÄ]?¨“ûü{—ÐHÌF,zƒiZä:§àHë¬ãÿ{ïUsGv]ü(‚.©‘Þ"$>•¤£ßþQ¨m¥£ýûâ_ؤhÓ}‘ž“Ä·hë$ýçp3y×›vâ<²$l¡glòÓ>óŸÚ ô…FaÜ(Ügçdê%pŸk ;-Úªnü'ÇŽ…n(·4*-‘`0Ž sYéëüHjQ‰ %mÕn§a,˜U–üdï"¬-Æ->Ø’¿ÕÑÉÚ©HåµÇçÊOHéÓ ™Y]¯‹¾Kg‡jó†=Ÿ|É7¯%u‚ܤ§ÒêF_àëŽÍx2KZõP0¾ëÿ--7ÿ+¢RØí÷ør^¥Mš]¤êÛúÿ…¼ á?´GÿjÇtŠ‹û–lÅ–äEÒ—ó#¡ÑlA™¸kÕª‹ËD$”úÌé|ØðŸ o»(ƛޔ4Sòk›È\z5*ýI® ·à°¼X‘ÉHž\/—;î½v),” 0¤³ˆ¹i7ž\ŒÑXLc¼és&¡«6fMXb›ö@ßR±ÈT‡¸ú¿o(˜·{ŒòѶ‡»ðŸbt„µëÐiW’W¨‚[|îYrŸø«0–”Xq­˜”í¦˜Ê®gä7²p@${ääA%Ž ;&¨ÞZv»QYvo4¨wèŸþ›z;ט!@êTa¡N•Q€…™•÷÷X—ÐÑtnöé*›#î<|ÛÁWŸŸÉgk&Ò©±?pÇn´§Wc5¸bxkÖÞ×ëS;ÝêlG€n£ú²å¢/¸ÞaDþOÂW?BãY÷!‹í­ìHc]ží,cÃÆåš kã2ñ0ѯƒhÐUR¦WŠÊ³nÁ+Å]êçg"ëݬ‡/G~ðz0ðrŸ5#j“à;j=40&ý¿åèšUû0ù $Vll ™É@ùsv%KllÁh¼}ü”Ë?Q¸U^é•ì züf«‹ÿ†çøÑG;ÏQmñ5l¸þöhÌÃ-bƒû$+2÷uäPNém"–ù>­o1°{/°Çâ¾$/¶­ §ò³•ilãYÄ B°¹ÄE¾LÓì÷m@Ó‹·¼ ·–ÌÂKŒüe²„u7?²dëÖ«È«ÕÛÚɬiJÐÀàâ7›²åšk=JÉ7ä‹„½GYÕ(šû 0bwMM\ŸW²·¾"Ç=r°PzXcv#ηµð‰'j7åˆë 3 Sç”Të’  &´»–ΰÃõö€'‡ü7'ÍR‰«CÕëˆ+ˆUP“߬¹¨ip!tcb yà„¯Šx ˜Ý»¥âW!RB±?¶Ð²a= Ð`ù¦ÛG½ ^Nj‰m%ÓJi”Ä«§Îãݧ°‡Iyƒš‹¤Ë˜˜Q ƒ~<ÿNi|Ôü‹¾¯[ªƒ b:ŠÉÓ°Í1CGÛAOîxñ½ÇñÒ©œ8•îÎTu†´’MyC55S:û ›ˆ¶hj–dzzœÎ&†¹±#4 ª^¾§Ûql~å<Ú&6U¤$•%rµʾ§$•¤»`݆ºEEñV)»J~9ƒåÇò;IÄK¾œ?{·²Iá=›µúkHÌ+­á¶ÏÏ-¡*+D;€$æ^}Í5×@2x¬ÄèÐÕÓC¬;§IWA)ñWà¯ý4d¶{çfe“óðù’FøÍ¬ëüˆŠÏÕz$ÁóÄÖ\ê Æ±eî> ZVÁ9^/9÷"1TÔÙùãOÊ' •ˆz OûžPS–|ÈÐnX(Ì?cÎÅÝXxíÊÖé¸`‹³¹îò“H?8 üi~×-Üb•¯æ–÷5ËÂÞ}²T^¹üf?â =§Œb:$ˆ+ ¾þ;z‰°êä¢J(‹Üîirÿ%‚Üü`ùÿ}¸Æ`Zù*K¤:ÑTèê{Âö'ª€Ò!˜J+M÷„wåÃÛ¬$æûÞf³Tñq§á°6%•Ýî=É TÊ¡ZæåJ‘àcDÖ$X'‹ášz¹·„(TpmáëØ-L’O9¸±†2×ïÁ¼þ ˜µ%¤w}±EVîÉŠ0fºŸÏo=ÍÌn¸5å§QO Cá¦ø©ˆ¾ÕS©M  iš•–ÿ4þÊX.DÙ„¿¾âôo‚xfŒË×åäÛm{Š¡Ë†„ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡vRn²°aRQU÷ŽE™è‹È¨ÒIS•3ïæŠ–ÿ‡r’TÂ+ÿuõB´Ãzú¥¤]šq^M<ŽÍÖu ÷ίa Ìê½mZx•µ£‡låJN;±wØÌÏe3oíJÕg13aÜ5ƒCµÞx:R¿Eƒ,Ÿ" ˜­Jèx²ú ö@xìú‘Õ.õ‘Ëçâv;¾¿Ñkô„,O§×;2ƒ„°î§a§­^69C‘®îQ`‹U|í9¹¾ùÀÙ7rqáï_=_—«:ë ½Rô'›Äu.æÑM{BˆZ’µýsRž‡^:Ñ³É¬Ñæ1¢àéþ·Ô-O­[~– ¸kæQh8L 3Sºª®¾.ü»sþB™n„1!ºzE´G®ý àXæÑU”ÈŸ\W\ó'+ì÷\<ÒÝ+©-n« ™ŠxPÂ3&²žI™¡í/#•ÍãœæUwr Vl –¤e…|öìÄ\oœ=A, Â#Ž ð" Ò{¹¦y»ä/ÖG…£–`.ñXÔ0­ꇅhmÒä¦L›‹ÇN_Q±»SÌ2ÖÔ]”f7«.ªREöéÔÔT˜÷®TÁÒ¨ÈWåLé±ÖÛ×i{múX˜‡Ç…±.»„õ`nå†pž}»£bsái±é~§6è#M¤òp— Ц}-ß`¡îzš“^ýkB‘$ŠË»Ý~t}‡ÁÈj´ÕÊ9Tt^‘Y­«(È éh­¥Wo;¢ëN„ ¾ó@X …ê?b-§Kòôi#e¡ƒÅØâFu¯³h9²¦{G\°ÍÜ…¿'\z ‘¹tç±³°Ní‰5MC†IUY:©ßmˆQ‡ÚbãGûëCz"3x$÷¶–p-)æþ#Aô|"ÏÏÝç/µQd¥‘¼Âuâ G¦8èø3í] çÈP¨}0·jü˜Uç€l„‘K˜MÇ4䆴§SmÎplÉ–œaG€8uÃPXÊ9äÛ»)´<¾AðÆ ('‚…›žïF¦/grz E}%Ž9Ž£^æ³ä©–ÇiÏ3ù5ÖC¼‚i¯ÝínSγ~F…+d­óÑý(Ôà^^ïIôW«º6Cÿt‡¿iNmÆ$=sôòŽS°!s |´C¯Ð+Š"•HÞcC[²°¼Ø©Œ…‘@#4Pʤ8šh·|B$ìgGû!S:–0€#@“ÈéÀWëzA¡«¾K–ÿ$59wÉ1½S@•þW-©†盄±c×éX0À­u¦ÿCü¤H_@VcŠ¥ñƒŒ½Þ’Ô±>;¤¹ß4 “ÏÃSâªAzL²ià†>¬4¬Äù”Ãón]˜¡Uì£s•¨¶‚|i¨´Å#+—s@‘EÉñåÐ ‡þêA–#¨RZ΢ˆß¥Cªßo|Ò1ÔŸcÝÒY$c.ÞUYí_R)¡méÌñýÃÚ¤ÀJÜ­´¿Þ™È‡L)3ƈ ÎG´•«¥«SjV,O ³€ØfðÇ_1¬x3ÖÙDÍÌS_Ã+çSÓ°Äç40ÞÍÿn0fGrxèx¼€5>W5¥PŽylòD¤Ï,ïÒCRîeÀÑlŽ@~xÁ`DM!¨YabŸµ (­Å®Îå˜VzŠI”Hm“apÅ3×=F“nZ_M ‡›Å[ÐÚ…Ëã\k‚¹0˜¥ÆÛ®x¼…•Æ3dºC®Ë¨‚‚ÄÆ !†óÁάŸ¯÷®yoƒ Ê]ÍÁ'ÑðÅÐŽ¨:ÕL\wwÒg}EõììÍÓóGÖ6õG{˜ç2/PËx¢§‹yv&SøbœY='@n†KÜD¤~€Hº­Ê!Ã×ìŽñ/RC#{¾"ˆ·y˜ßù‹½ÈX¿#/»8EÞ ëXpe.)^èÞðf\¸…ÏyyÒrvbäÌÕÒ Œ½?q/Mÿ6)à ² m-‘±WÅÀzÝaVœÖ¨4˜~5’¿D’'œñ/¦‡.ED˜bñ‰0‘ùÿ«›œJXRgŠÇå}YO¡âDÐÍe¡äœh¤c Óc]žª†PÕïm¸Ÿæa)°–@†¯)= ¨_kù rÃzÿƒ»!ðÄ Ÿ:Ÿ¼2ë&R«Äék'Á{ʃÚB3…â«ý"–Þjï'šâäµফÝÝyq ˜ ðqGÐÝÅd¦ar³Ztïêùüµ1LêêÔeuüê‚1vñ µ0)Ùª­½ƒKªÙ—nF%ŽeøÇØ#ÑnÉ|6 þyðÚÌtxÅq(t¶mBZžwCå„–„­O^âFd«ZÖ¶xÈC‰³ö~’€ë–j4­Ògá¨)˜¦¼Ld~Z=X\ô"ü´+ЋªÝXD)“)Ýlk‚lOÀß·!ŒHÀ°¾ât Æ-[òµ˜ì}t{êpóž1Þ“?.åeZ%Z¸·õ¿®“”Í„‰‰ã›³ìµâc7$f*×Ï…jØÈ«dÌãÌ­‡ŸÞ¨ŠhÔI^)Jk°³«ºÜ€õ'âïçÉ¿hã¬-?*-ß{ø®ì•{d£Ù?‡*µÆ fmª% Ûò_A⛊ð@9(K–n#;#{¥©|Ë΂xþ-ÐSõÕ”6‰Ž¶=—š5c?cµãª—6€G]´*ÅÝX±’á÷;€žYu#xßòL¼6MÄ—8ÏÉCð»ÉpTQÐÈ¥ÆÂÍEu~ÇbÃémºó¿å OTiçzÞztÉ¡=Å©²Ë·Þ«DŸ ÙÐA«é|NÈ£ÝsmÁã©îNCú­Û>¶G¾²º5•i)%}ëóq®ý©gï"&`pkq½óçm€ÄNØø;1ïé‡ =ÍéÍlån²AÑ ¦ÊyìTpRdVwR!LÊ;dˆB—o„,·Þ95囀#·rœ.ŠîýfôÑ*é°·R”ÚàN;βÞSÖºóTânn>¬ñµ.>÷"45‡/R%×A€s/—'r¼Üå`÷qñÊÛœ"$×úLíî²8›Ôʈ¬l€!à÷¥¬ 3ÁPZ^èÐúd˜Sûé§ìMI!Fþ²hBó‡!d\iÝ'j°Béc’ê<›`íÇìSu~‰g.§Í¢nhÂK›ðîõ/=®P€ÁLÇWg§ÀŠ‹ycIq»ÍVõË·&Ü´$r¹çÈ ]0Þž# }näŠñm­(X4`îgAGHÀ2Ù · ]GahI ‚ßS)ƒ3cµQpðY,ÇÀéKÃUJê´óD“L²)e‹Ð.íHI©^(mº“lÊéÆ=H@Φ'JÃTdƒýׂµ!ö|›ñ7*3’CsfsàAÝrÀ_ð$ÈôPaït»¦ö³7'wÕùÆùsïrF¼ õÅTK«_þÅ%€Yü;µ|Eú¦E±•~£ŸýUlˆ'}áËH?kè=äv*/‡idü£\e’5rÛ[ú G|HŸ*ò¥+¨ òïÉ)¥„‘<6ù y`Yä7Øò9ƒnåÅ4¡,Û}_†Ãä•Iy0©ÿ¨‡“sÒ5µãZºÄ"ÏR~œ¼Æ/‘l…i£JC¡ÊzQƒ“ì»Úk¹¶™©pب9ò#„4ŒÄµ,Þ׌j›<Ä´C£ÍiZ!¼ôÃ8®'ƒ\‘3GjU3ù¸~K¹ÿJŽPlò!ØÃ,<誜iÜäÆU¯Ÿ½Õ ËeàËÍ2îäÌÁ°]ö·¾.¿`8qÌà†8 "Jà†±ôÊRÆ]4í°ýš%ùÆ>‰XÃö¨Pžïÿ Æ-&k“šíåÓ£0^Ø_£òå3¤×~Ìâð £ùÎÀPpØPÌsF5.¤‘R¶áÛ‹_gÃ^B#Cl᪈;RÀhÆÌÈâÙÒÍÄrJòú%•'á–BøÞ¦%íQ!(à_×L¡y ¯Kƒ}öUÜCf­ç<’°ä·Ž«cä< Hý8F¹ô‘ŒTõ -<›Ò’ 8c~wšma™kËõ(ºƒŒ äÃÓüåïlw$ƒVœ+8*j [Õk¶Îù;÷1µXÁã±ÀZ§ƒý[ÿOŒÒù†÷)æ¢qǦʥë¶éIhØi/JøšÝÓ²+÷ÊΕÛôÈEIô ã?Ϻç€`-âh©·Jôg, 㡇ñö5“ÊS'¤)ud¶÷0õ^ˆ¿]š¬íÙyWVX¦-€¼ÍùœïT޹\(iû‹,‰o-°ZC_\Y¦E2‰®´—m@z_Dw¶†l ÙÅ,qeâ“k=ŽË±Yx Õ fŠØ¤³µ¬s¡ÙýOÇf 9ÆÃ˜¦µ`C‘(´æ£p^¬2|¨=6rùŠêÇYE'8OÓÛ›ŒìÒÀÑC£Ò0h’èK§cxJUÞèìáMJèI²=›Áõ4ÜÀ+¤þr$èCÊMñv;FbÏph§©-¯ÛÿƒÉO—Ê1WÌ~p».Ú š7m&X`ù¦ è™Gù\vã|;Ê42½$ά4©¼‚Ǧ|ÐÀ•aÙAÂ6– 4 5‚a£,6Ü»‡y "™®â “^‡r€€Çá±±øk4? Üõ²k {˜©Ô£åÜÞ<”=ÃŽC;Ä6J°~©ÿaU¹Ñ?™º”…ÔÎù>ÚôÜ—ÒÌ[ÏäúÁ·_=Í}’c’%O¢ ÷ŒZ Y¶ár\‹³Ó'ðÑõb ^sM¦ïgP-é€Ò|ÈÏAkuû¥q…²Ò4[cèýð.µØ÷¡¿ö÷£üº3 Ÿ}LàlÀø4À8w€¨À+·›æýˆÁ¡Ù5?ýBªóW —c[(.¶Am æ¥úW¢©2“¶AÔärCõ¡™ÔU¼ ;öÝP•¢æZ8jJ´R/û½2[Ò8Ð? ôùß=¥%ûÓÄè¿¥+ ²)Cöµý!õH3kÅÇýÓgŒÆw”%]¢t(°ÖÞôˆz¬è–Ç82^Õ™›\ŠóR¬¹ÅF•@?þ‰ÓÎâñ–âY ˆA=þSVÐuDëŠ"æe»ö¢"RŽ·Ì!vX#®ËWðzì€rÞý·’ [w)+„›w´Úb¤›˜¼yòpÇ}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•l®Ÿ\½•ÔoOÌÎ ôp½ª¸ËÞT ¿÷cÒ4”EqÊÙY¨­v—KX\@̑ՎT9Í3FyO¤žÎ<2d@ôX¨MI â‰w¾ª 6J€LÝmÌõ>Ý£ˆ 3xyÄkº#Ÿ}ºjsk(}0‚°…'Ïtù kgoÿgA®dò¶Å<‹K±ð¥”9Éê••hÒPãE{’<< ÝÃa—>ãõl;îæ.–I ÙU‚4˜;%2hï©5Ïóž`ÇÓ„µrˆjÅ…R©àMßâ? VùÃyª£x‚˜VöØ]­e/_·XæØ1æ.ÒÄnVìç=øs“™Øi\#-äçŽë}“u=8g°Åmôp(YwøåëBuiAÖªÆ(ÖÙ‡äÅÙEm ï‚ÍlOwZ—ïêÞWÑI™œêh3I6³¥5Ë€n”÷“oT$[6à ·;ù6)¬k‚"nL†cî7Õ¸"Å®ÓÝh73/²¾Baž±V‘1F™h±—\UÎâÏKeå­Ký†™ ø¿ë .¥îìDhÒ¦÷rÑñœà*E‰êeßF-–‚Nƾˆõ¨²BÍ:²iàý`4H`¾S£ñ¨ÈˆyôTeÏÆàhÖôÀ¹¨ÌÛèÇÎú=}RȹÎèV´ W^’¾š$õÉKéPŸÎEgƒ»Ã3Ij±;¯Ç­XyñÓ̽A=ƒ]‹_ÁñxAƒ²TÛãz”ûàÓº™ÆÆÎbüãIN~ZßKøq`§ûs–×{F\¬¨1`à XtÖÝœÇÌ-I6ðCàI¦Æ:†Ö=Ü'‰G//i„é½ú`Úç[kß2+ýaâD›JD\KŽÃw×Wº5½}©Á“-²WÞ»r›j\¶Êëë~lk×_ •/66ÞºòFªwÁn÷/o'(ù<“]Låôx‘á(ÕVñ¸;yIÉïºI­ê‚Ð'˜s57wE<¬?¤gžZ²Mj‡1ų$§ôÛÔ«Yp/Ëwm’ª·ô|‹|Lsb–ª R‹þwv{â­uîëzüŠ™uNæà`ƒn³×åŒPŠe> …žž-gÔ-LÜM:ÌÙ*?> Ù&Ø4í²dUG³ì#¬ ÍÊ3¬/Hl¼¶¹júR)æ÷šæ: ÝPNsÕŸNÚÝh"?¯qßz\ îô/U 5‹ìú˜è}´&%<¨í“â*íƒR–8!´ü ý…¼:ÅP À ÆÛ3öÚ¶EÁ¸°˜ÚÈl3N_ò¤håÇE¬‚ƒe´ÐwÙ.¨ÿ3Ï™VÉçqâ‘?m6›Úqk˜m´ÕX^ƒ!IñwÅdÎÅPZÇÇhe›/gé¥ ¤SZl:p6#i*ëí½¼ 2ß)}¨:ë s­kØîeáã_—ÿ‰ßÄžI—h>zç@Ö‚ ûw8q0–£m®Åº½–yPç¶°ÐÈpú£iYQìk‰¤ÜIgÖN .Yÿ ˜Kà˜°™BŒÃ›‚ÇnØŸÐe X ƒr½m™½Âu§$H°´­æ¿Øk¦t¹f?[F…¸Ãµl<4¿AiOÈD’Ê¿õ@ˆ©Óª˜+¨V«ÅJqÓà 4’^„¢®at®uR'Îò šJÛܹØ3™PG%ÓgóCšæ'.Ä[¥¼¹´X‘f $p{3˜Ó|8õìÙΣ[ÞÈ–üV Æø’syüA`ŠÚ){ë/]˜f‰Ùú(*€¤Ü<R>ôxÍ©mÿ½>Ù‰67òYaEg÷­¯zòÈ„âÇúí©¿p}#:á˜î£—¸…J´|ÿe[Ñ$ª?›*e¥ƒ.(—–Žì2šlƒˆ ªHHäÉ]2î|Y€:Öý¸Ü< 6ü¹ï¡uÝþ°à1¿¯‹«5éÒí™DÍS¿Ç駈`™_Å6¯«õà‚Q2¾v kÛRÂ'ÑŸLÜá•]´)¡û‘¯;àCÀ+-^3¬ÀPüÌwUÚ ¸ÙŒÚr3£ õ¶þà‰‡Äž½Rènïz ¡‚$†êBðzºðé5¶²îç¦ç¹€ ˜NwÈà[ŽÃGæàŒtþ¸ï{Ð0‚êÉKôMº³¯þÓ9£k4–¦Û Uñ¨ì^&¯¹tÆRôÑKÔêݪùÀ/¬”S ûm~”ç´vw„‘?ý°™Ì7îƒô€ÑDYðt%.ÿz0n c„û<ÚõJÌG7 '=*HÞÜå!4Ç+,x>¦ *eBÊC:Wà+©ëM;¹ u ¤M§¿7í°å¥Ÿá,ÿFF5D|Vd&2¯¢˜¥^x*ýX‘ÁÅêÒ^dI"ù¡°`¹-¤ˆŸÇãö3”ɘ²‘%T!Î2R"¥ËbGKÀ<Òêˆú¾8©Þ¨¦ añü‹ÝŠæ@ar:gË® ›ÂL8©©Ø[D¿,5>é˜ Í Ä¢C3-¡Ïßµ|ÛzÞ~‚¬®ø‘‹ô8ÁV×â;QÎ ‡Ö›©á fC˜Š­Ô4¬lã†×JÆÍÚ›÷1çÆÎÚW ½óÃä_Šƒ¨ŸÄXÎÜ\{ØM¢4s ò~áÊ\„q9Eê1N>ø¹úÏ™^¦Šƒ\!íÿh\g·È$B?K†yKßv§!rrSÒÀze*òz]üg"G|3È׈V¹u–x£×¦@Kûí;rÅ›jZÁ.åç¯xÏxgoaK VT2x5 Ü?J¯)Lƒ@vÕ Îts Ù[1™¬å¬ÔÔ2°86TXW×7vÜ®55œo³®/ÏèŸßÑjÎCô<`]꽌µ¶ åœD©Ý¦ÓÐ>ì“ 1¥fãЇrÁ¬ö;¤äíB¬ùŒR‘†4<Œ²Ò–Ì´½^mÛj;éÙøÉ³÷¨ÜDa½ÒÍhi•0Dl¦ŒQŽÕèÕt àô² Û;'ô1ÃuK††ÖÖ¾øÂ%0bŠó5ũHxž{»ä=î—n°ätD¡ÑMù¢w/æšÕ›Tð`»t*u4O3°LuL£î$¿¨• í;eê°äZèLkmJ0!¨Æa‘ APTé² ÎÌ9±?D‹l$º{qî|ð*¯Ùß:Ç­ãRYÜ34ýýE«‹e³sÏ­E¥feük¨-!mJÛ«ü·¤w0· ¢ÚŸká)Ù˜ÁךÊ$ÔË‚£ÿP§MRÊnìÀ¨T4ö‘óŽz²Ü‡?Ûìùq¡.5Þq wëûSÛÓ)ÿ 's î\8%of\.Ñ{JV ؽö¢ÚÐîvºJ6š2Fz‰ºã¿C@)*ÿ7R3Vi:ZµóÄe+ýÏ©ù§HÆëóqþ-ëÌk» ™\ %ò¼m‘Cs^ì“FIIN7ò³z«x˜*‘`Õ‰ÿuÅnœÀþ,Ëgbå°ˆ,5Ê}HÇ,'ï'ÛYÙ8V>ÇTi{ÑeiÅr•Þ"å¯ÍM“4ç4âR¶¢5ÕÞMþ6nß*¡Ùû)ÞG¶»²ß÷}ˆš¢Ë­‘)õ!ѳOÉËôûç¿å1P1•Œ2 J*åyÏÏÙ¯þçþψ›I b‚è]F’ÎiÄݵ´ç·ÿ;˜W £ð&‚pW³ÜSoVƒ?)cksÍ« ’Zõ•9Þð,'E]"ŽQ8"áDO¬/ô'”×$ݦ¸i¿¾t÷>Å%s^œÑÕ.Ü¢¦oÑ—ŠJK°BÄ|Ïå¥_óaKe‰Šólr¿àE;lQU”˜wÍ Q¥Få(}çTž`㽪|Sø,È%7DÇäéz®A¢ÚP…²&UvÄÁ=·@§.-£ Ç_š#5Ö ª ÷7T: ¤]õq^ÜËD¯Õe”˜IÌÿ4¤Vo?Ç>µsÐ4Qæå¯wá­&ðÝcŠMv„H¿÷#§µûO£™Ê‰#Ëì¶fýƒîêÒ}…‡gi¡µt¸µÖ>©àYàñ±¿RŒá6“~#À8ƶµ‘ñ2à°¼ z¦´÷õºÔ&î.‰moÐ ÜèßÔ}¯¸üâˆÚóÓÏ…½È» íQ«C ¶ºîòŒñ£šA2$<™>GCÊV¥æ Öm7 ¼kn­‹=Sz˜À+Y%ý) 3ò/ÛØ‡a-ø«ÍıÕ4CuSKX]J°Ä5ÂÛÚ:d‚ìŽäú;BÖ¡×;µòÿ?ðD擎èÑOÏ”­ê‚7MŽf´¢¥Ne9—OÚ<=é ™žàBn*o¢•uÙôƒºÏ¶Œ\…ûíP>ÇXùöG4—º~2¦SQ±a9£I7ÓqQ×€Ë:+)€Ý*OS4ÝÇÕV'ûK®è°L•}I®((èC¶ž¤Ñ6ä´Óf#ã]Äzòȳ ž¶1¼Bv óhgÙÏðRâM‹s»Ev‘ BŸ«Ù]Rp²Zeù àgxº‘Ìù0/5¯8kR;‘×pvcž3ûòM´ì[f@ âÞkÔ59ÚðƒøuzE±W)¡m«Õ Ï—ñ1Ùðü³_ÐÃûsZßžà P­2HÅ“5b@Èk<$pÿa4ó¡lŽ Âè[ýÖ)Ø\õt’EWŸ¦ãüd[ ÏºŠ¸ýþ>ü«Í.J¾…ì4xiv”D‰æ¦5ÝrnQcczµPÍsÑ‹;ñkª gy4­«Æ’ø~ߠǬ“óþ“©ÿ~ª‡Á1î¨îP×#ÑU±9^;1N)¡y W¸P9Šð½àH[Ô§ÁMÜʺ°¢49nï>~p†C"È•æ>¤ûÃ…HhÀÏŸÑ5‹ñ'¦\|®WKŸaèw‡„»ªƒ+ÌwM§¯a­–§jÞ,ÃHÖºàœ™¨¿›{±f²ˆmhŒ®…rá_pÁ*´=†öݬAáè©tK‡RM*ÛÉ,žz%˰ÿN¨aÈÔÁ¦[],ÜM½_‚ °¬èîÃ3p»ÂeååÐ&&ÜûýŒ‰lw­Ìw[¥õæD­†Ã¶Øs¡ŽÌ&`’?Ô¶>ÄŸK×Ë$-måVå;ĦgsÈÍĺ‡Éì@AZ¨Û÷rI‹œíÙ?>Y‡™ÅçR·¬-UE,Íé‰|Ú oŸ?¸Î ÔÍÀ¯¸·L-i—U —Öª#ìxïØ`®O/ïVL?Õê¤Yò\¸4Œ‘ř̂+ÖJ]ÆXN6<Ø%¡oŽvŸwGé$\H‚eÆ¡Õ/E~ŸèžÃoìZŠ>¹@ÖPÂeØ «SÖÑÞ’÷ia\èã.qD ÐYoÙ„Ã4m†+jL­‡Ä~ÀÊ“DœÏ&ì”Ï$XÛ^RÚ1¯2û°J¥†w¿Šã¡Ø –^‘k8ƒáÏÞÆàjÄ0”@áCÓûM¿¯â;’,º‰ щ{ª™ŒŒcÇgðž­706EâP£ÌЦD{^ˆâ3ë0æÑ.ÆÇ~&Ô¬F5XT)*¯ÇDj5Aæ0r\ÇKªʦ*¼÷Ò‘…úHÞš†ù‹]bTTµþ"zùˆ5¸µGõêÇ-ü>(Šoö5ÝvàBl¤ý×­]Ÿm$ºŸ(ˆmþ+N*â¤!´3%ûc#mµÉ¿´±‡ÁXŠãgd‡vofwPúYg"K9°oFEОa¸¤ƒ$<¡³Y.Ú+ºT‘=v¡‰‹yæã™€poöêë p…Ë4~ÎîÊDãFZ˜¹kß HÏœ>J÷µ„L++kÞ±þ¹4\˜^&ŒƒªÝe¢ùׯãR÷'ñ‡g¥¹”¿dE»²z¶éS7S~úLŠC¢-݇³nÙé|'ò$½Å( Fü¹ÿO!,”àidˆkÑl#þé–ŽJõ_Ž¿ÃadÈG§‡Œ‰@`ì×Û„+m;ß{ÅÈTæS™ÿp'@v©ÅÝR×oôôÙâéUMô[“àëúYÈ‹‡«š?N{¦ËœËX°;_U/Žª$üX£ðÏÓuѹqUö­‰ìyƒ|8”» ÜI¨hÈÕ¢ñQÛ¿…œ@YCÿ` ô†B(6¡aƒM‰ÝöŒš2¬Oj&­x)fž;*n¿N‹DŸ»û‰ºê³IˆSÒ>ïÛ}äÊÑVTOŸ&@2§p²@⃅øØxn ÌI bµ=údiÞ^ňQ£:Ps­q-ªâsKOäÁÂQ7‘”ájÙ²JÂM“79zíwál}®ÆnŒlªK竹ñkð,¥h»ÊbŽ2”A3JxBXV9‘bGØ9æÉ­kÍrd|´ðTaæˆ,Ú•ºúpŽÄÄâÉT-¡? Ø<³Ê»T%²(¶ä³r6l“‡üè—BÆã8%µqŠ¡ç¤¥Â½v4>]£;Lt.¨>è7%{&®ºÜÞrš?bÓ F*ž`õ\iìõð©œ/ˆY#J|LT©!Fž*ÖÎÄï6Ú²æ]ü[Ä2±næVáo}W&B“æ¿§\Lõ›´…X’Yß*Y}<¢`(ŸLr†b,~_H]?¤¡0Cí®õeTjÇGÕ{9Ö#†§£^ej%¦3/ܞĘü‡+ãƒ?$å<ÅÑæ<ÍUÚª+øÁ¦p‰(S¾cPåÜ#ý¶£Æ9ɰ¼ýW &Ì~§_ÌEö¦ã؇¢–t À}XkK7Ÿ[‚2i¦ŒÐ•!R‡’o1ú–|”¬ñRxx°~ëƒëÌþ ‘æOÖ ÀÙäÏ jh $Ÿð²Ì¢çæÀ>/•‚eêî²Ò¼?îm:´2—Xü 6гHïw–*˜"? ½éN + ¸_’B…}Eå¸0ÏI%æüt±:öºª‘Sð¤ @UfùUÉÕrTVv1&ƒ?ò Ü£9–a´èûEz™¼Ð÷Ó6‚í-/`xY8}öN]á=€ðVÕW–ò~Yú,ø«V^õÚá*øÑÅŒ'Êpjk $Â@²'Ï 9žF:}çúv—æÃð˨@γîa,êjÛÜÔß$•ò,%†ì‰Z#ý_8ry‘·@…:X3‚\k·±>SÏzùhðdïóp ¨AÅð-@®½¶\*.³0ÛY/}ù#€tO?Øn1D‡0_Í»h„òÉ Þ<µŠï¡’”R㜣ÿ\Ñr¥Hpÿ c²•dZ˜‡]µ“™¢Ë=Øê÷È|®¥¾Ü;‚Рƒ,|ÚïÈÍ9áK>ÏÊ òf…(k\‡MBôrÝ­(ÿA¯9ï]þâÕ%·yÓÒÌ>êjžsßwc¿þ¶2b“%'îö8“ #O†ö_z ç®á6J{x×qÎôMnÞ"©w1§±nE;Éï5ƒÜWZ¬±{Úebz$$Š£FÜãê#uVí(œ»s¿ ©¸eè|%K]¸KѦzbµ¿©À[ÿP":Xüq¦ŽÁ¸\xÚppUÓøòp¤šäÒC-zB²bŸŽÓ<½úFð€N‘;¨vnDß©”‚ØÔ"ïXi­­Ý:Å[ÂX‰Žuã ó_¼”ÌÔxBõ7už_•ö#N{T¦‰ëóôUŠ,êÓv¶ØØ’œ«w Êg»ïÂ?§Þ i  ?¿s… ,_Z(…äöÖºóú,¼™¡°ô• Ð×ê£Ô=+< Ç!Fé4é6u-JÛÚ¥£KõÚ'3-‹·™^ý\’û[aܦ„ø¾sâz¨=fÞÞ‰ûS´* ù ¯Täÿÿª rä±:ŸsU›ÿXE cÖU¸ÉÊ?ç·Ø«¯®¨-;}1*›Œp¸¬„Ø{Åïùÿ…³@pÑœÞx'pŸÌ0ðQ9è,œW‹Ž„Y-ƒbÆ÷A‰~ X"€ùV„j2h÷ʳÓ¦9TYý¬:qwñ(õVš®ÔTs`O¢@iŸÀ`4Ú&ºjÏÕqåZþÞ‘Z*'ÐjTJ¤,"õ6ÉÕ*(,L 5áœõZÜI \³ßg#¹èÝÙ‚D¨ÅÞú@é¨ó)? Í—n+]óñ5¸ÄJ$uH¼¤Øê®œåw}ÒžŒü•Ý…úwúN ¿i—³ÊG†\ö±ýš¦r-b µË²J /R“»<òÉ>Î`>í¢õIÆd|à‘Xç¡Å ¢;¦ýìm!U7qÛ‹@âAÓ w>Ç„¾Vè7yðÒÃX-®·¥ g§÷2©=ƒöË”¶ÏtqÏð5Ý)BÔÒs`–¹fÀ˜ß×Þ§f‰æ’ýéÃ\O±9ªD1ÏãSÄ—ÿQ(9oE! ΗZ½Qkú?0Ž2 ªKnq|¬ÄnUºŠrõbòK—ÛM¥ ¨…; -ð]™‘f”ßVdQ™Pæ£Ç‡¾ìWd™noJ¹ÞÌí*âÓºŒå L5ìýO:fœ×»%”žp”©¤G%çÞÑx*l/ž:'<“£÷´Î¤ëö“¤¯Ë˜ÝŸ™.ë:ÛàÓƒBÞ–‡sãcçû‚ÁÍü€E0´tT¡ó¸ÚÅ‚7”Cq‹kÒ̩Ư/^UoNãÃíî»L›G1šgAüHæ¸á.½%†oÿM½ï•ýÇ ïS-ÏK¸7 ºòÝÁ[ ›'Äù -6 “‰£ûF¨9ˆíLƒtgú`Y)¯Q“Dß>3ÌmsÙÓéìiù0 I]Œ6B¥±ÔÚR ˆRv+®X9ú²áÙZ«¬qT b‹…¢•‰tÕwýéðúÊÏä—4`lhén ‹[·»¦«Ò²OuÞIºqñeªÀ½B‚Ô¢¦›Þ¤¹è¶ .gíiNý`ùë¯Á¾f ô®j.³Kƒ–íPBmýAœb…>o‚— qÜ{<®;dÁœJqèÈà 7IQwrŠÿ ¼sÕv%i½|–‹xwËØ5, h ŽûíѼy^@ÕçN7¸› _›[§|VÅ\«¤Õåþ]ƒù] Dú [Œ¢ÿd"ñÝ:R=Uý5¶iÜÅò‚½ÆyrYb!uWM÷”o¡f Èötê&Ë­Î/Náià3¾a ó«,»,ïCmìך‹jÝà@€}iEbF×ĸA³ïÓîw´Ê`³P(ÌqG^UKÌ–<ðyòZ6RÛ=}Ñ\}¸|V5Ьû·Ð kaLÔ)†§bðäUÑZl«3*• àßëéúqÿG™: ñD˜DI“M82üGÜû“p\—B2.ó€’£(š£8°6N—€+fåáJk°}¨€ãbJ{Qù\bÆê‘NVÝÏÿIŠ|íTËì»Üͨô¼‡‘6š¯h·$±“d›¡ {”þRÌÝ'ø RüöÐöЖү¢žÈT!àÏÈÏîîMåy Yæ†þ–mQÑë#ráfjRàèK.ew' ýÛÜz9dº#ãçÙÞ¹kc¢CÇßè ëÎ1}šÂ„ DÂFAcÕ,Ìc—× E±eœ [ÃFjÎÍ^Ó­SúÈ; «RWËNú,æ®.8€?Bu”“$¿öf¬í¼}â ®øYÆCi&˜ðj2•ÁÞÏ—Ð5=+­F)¬«NEäÙÚI ;²³%ÿ\×᥼^A:2¯ˆÔ¯;¨i¯2 OfNoQÖë¨iWví,S[«×š@ë°Ëðöžý:*C«D_5U7ñï¶Æf'ß»;ЬÝ•‰%íê¤)Øßxç oÉ@©õšøÉ|p/Íß?–„îUû—–ÃêG|‰I] ö™(å—AZ1÷C@ªž;ªZg‘ˆ¥ òÍxƒ>’·åÕ3óüö¦uà†ÇsÝ>Ö3j¼óô·5ÀJÀ ?Ý2—8h¦Ø¶SðK¬jG-dcËûr”<™>Ê=•χÍϨ’Iûñ þRÞ¾“Lá-»áñOÂ>o|ö£@ÏtQL¡Hðã"!*noOAL ªaÓ:œÖ¸½ßÖ;H ™Ns³%/æ‰oäݽ¡˜ÿ}ö7"°È_õBĺü²øp>oá’ó€‡SHòêÔR4¤‚Í~éä:bÉ|Â-¤tI>.Ú.\Q¸••Kp°GœÏÞ_FŽé“³c-hÓðëæ¢•þÓóÈ0‰Ù”ÓxÑ)SÚ{x]{4ßÿKê²1|/›hó z­·\ZÆmYÀ؇¯sºÏþë%ø,\¶~ÌÕi19QËa¯I æ)²ŽÉÜoÕ„8™ÓæýÛW‚[åøfŠ`ï5ìo(²H̃N^޹oCîy†\Þ!XˆË:xRìô3½Aå©ÕåîÌGê¶)Ó €Ò0“úuü»=ƒDº‚ëOlæü)ÎÖÛ“E[•cŠé×{®S§¾¢AO M†),†[TãB—EcI*,ß0‰Ì×bp¥Ña’+öC+H±ðg®ÈZ^æTÙÿjNÃÖ=ï§<‰dtL³–“°ŠOzo"Ý=¨Îo÷5ÕSlÈ[Û¸œˆcŸÀu}F)³/ñ8Î}nm´{ã;-> ë”ù/\Áhh¦¯ˆÌÒ$?Œ$%„Š3mܤÎyõ‚³W%Ÿ[œF]å|¿ý¾ÐµÅ»Ý`áq ì‘›aý¬²½›I$q35(D7=&{í¤eÙ2>È(>qˆ {çàÖwžíÓÃÿS'â 8V®—Ô•ä¡ju!c¿/Š]MÅtߨÇ3j¤.³ê fΔY]í”Ô4žéÓ[­mþÞ‚ûÉf}èÍté¬Wû÷ÃØˆòž7í/^/ÆzÚa ­S6ß#Xj”£V¹àØén¦B‚ÖéÏa­1ŠÔ6GV¯H¤K©dÙ€nXÑDîÀ$òÓ8&ÏÒ¿ô~>Æ›NdO…6mŒ_ú‹Á¬czOÞ "ºN'úû*ºÿ Ø·QMìòUg7»¡·)¶C‹2%sà@Šø¬…#„ËÔfY ]òztÞÒ°mfN«7;/`žøÄ¤ÒËÔZ„%‘²H°}Q€Uœ:ê›ò_¨±EMÈ ½t]2)€"â¨â÷§uù&° EœÓLúnC|¯í `}O)ða ¸ê³aª­þ5S±l'ÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qm´JïÓhÕ¥=FÃ1 ö=#ç°á©þÂL6>ºÑyµEº7neXÕqSÓ¯a6š¶úœäˆ‰¦(¼÷Úíÿm^/•g-—bçpÈxÜhDÚж¿ Âþ"ÓJæ3ÑŠíð`„ñˆÀâ,§ñäUtíù†µY£Y×î‹©æQ"ŠcTÏì«Öï[;ý–£Ìñâ–Óµ'sƒñ [v[YÄטýz-;ƒ>&·FsÁŸFÄz0±NÖ¸õy@£ý‘ãâ/Ë)BkôÇó1&=^$Ø@.Œø¥³áˆö ÓO—U²meøü€Û\\!s££#-y)¥{ËæÄÕÞYäókÁÙ?.üo7c ŸSIÇjEÝI˜ç  ­H“/Ü68å|J–Å*L—j;ðYù' |„!IÙM”}vKºr„›ÖÙõ8>ªó¡OÑu|F>hñۜ˅-ëQ¹ärù&ûL«=±G^‰„gË—é³Ô\«iš) ñ?KØþ‘@LY!´¬è´ žÚSÊ ­¥[#Ê—R«ôü 墬‹çÁŒ6U ÂÌcsµ¾Iw™™U(ź!RŠò±ÈF;&%Ê9ŨÑLѵsÁk„ EΩ5F gL”aüãK¼™-£o`i_?Mo|°ÐV ¬}GdåÖI2¥D55x`B„׃O>$Ñ '¯um @^1^nŸŽ¸3æì›U³jª·dñTŽ 9OIŒ´=ñC}¾#އ¢øu8çu‡ ìßÛø÷4á]éÀ¶2šþ¬%×4|è—“{ÌûTûyÔËWý÷)–ôô* j ëì ¼ˆëÉÀ "ì ‡:…)Ê¡‰£:7ýkõe¤º§[¬ÁÞædtˆØ·ÑɹБ—GðûÅ}~1éûiQd„+X&ÂV׺.h³½ë.§)~·’Í$­Mž#Mû8ÛlXÓ‡œÍ¥i,[†/ ¹/éW7AR´óÑñdDØEë,àdŒ,¥Â½ø‰¶L¿Ã¡+ŠA…;tÂdî²?$Ä5ƨC\zž=ÿ>šp·©xØLÀ÷û7ÆÜ"z »©XрέÂó¹{æñó}Á6[ÀíÞ›4~ü':ì£|ɨý8ý‹; ¼ÇF~Cœ´s£®%÷L›µ&{a©½EàèÊËzŸÈZý Y€) a. tRKÚŠÐ|ò_Î&T]MN6áûWø‘òx2{PîÕTv†^x;š¯ÞpîªØÛuNÐ,,Aѧ¥ñ4²„_ÿR¨ËÙyáqÕ9{©µ¨÷é~hVUCÆF+°ùP“_¥”3Îo쟽ÍmœÎ‚ ׋œAÆ1בƒt‚ª_#S)ƒP&ƒ!}_èù¥ÒC'Šdýœ$©mwÔ­/Ö'|Qx|j(_¨K°ÝP²%w¬7‹ W4rQk¨ûîdqèôŠß!wO›Ú¬PµŒ»’ vG+xÀòióŠbozAwTÆ1á•î‡þ¨Yvà øML2¿{.ÉÅÛ˜Qà|–ìVãf2Ê#ô% ÌûÜ iö‚ðÕþâò,‡Y>Nwã`ž9õ\GŒ)íU§išžÇký`Í:Qü=£öåþÉ|Ç&;4&Œr›Dƒ ã ú~Š»àXÀÛšÿ_qæK?Ú‹0¡`Sšá$jÌ S÷)úL0×5l‹™r {Ÿ„.Ì\&ƒ‰ôä $DÂÍexãè%Vßp‘Ïž¸_ø8ÙNŸmD}šLÔéåSLú+;}òn&¡6j¬£õÊ€þ¤ ¶ ˜çóQ++±\’G·PÊ¡¹'Ò™¦Û¢ÊhñÆ9Fæ)²;W:SE A`;R4;i j›Ð,³Š)žÂS¾Ý X§ÕØŒ±¬šC}NÑË…}÷Ám•9PíÓ'[ªKOhME@=ê…2,?ÓÇØ_ÛTq,9ÏÑÓ¸žú^Ñ4H™—ÈsCÛ÷F ºE šãpmŠá!^Ô Ìn ÍÙ¬Ô`¤ˆßè{˜<ñ­ *xLJL9Ë2Ž_ai/›=·_º˜cLwIPV^ÆŠ 5ïÿuºbHRÌïæ–vüç†Çf‰ëWLL¨|}Öý’??¸Ïáþ×»Ÿô¢P×`$ ªG(+œÃJÌ;µÃ„Ü]¦7o~%´\=¦®©þ*õØx0 İ¡ª%nÎÀÕðÑ ¤­I"ME —Ѥsë¢îVtGëîï§2Kìç±&½ð?? O»±-µ›ÆšÏNð϶5™f(2~o¥Ÿ¥ü¶¦ÂSÆÞ†òø3áG@Yª’Ý:„jU @±É=\‰x]ã´ŠxZhš` ‹Ð¯•åÔ'3F~¹¼«ƒ”Gl=³´º™UË•oM*G\0´¨®uV Lqá{¿¦èõbIÙ ô„ÉwñÙGŒ<«6ó=¦™œhg'æmsìaRÁ¡ g¤NJË¢OuÀ™}ÐzŠäMuQ8®ôGì6C& •ûo$¨"zs^}DÉÚ¦z£5ãµÉ.ƒkªœˆä!Já¢#@ÜŸxª¾tÎO÷h0•ŒUXû¯ÉñJç€ÖáBVSscÍ›‘~Ëo ãƒF7Õ‰nIxhô‹îxs•'ª8iµ—îwi3Ättžžôš{Žƒœ$^ÁgÊnÄ i•mÌ ÎôŒ_Ò’³SÝ?7 bàê oçÕ[¿.÷:u¥ak’¯Ð–Ê›è<J Ü óî‰ï¢"z¬HŽÐÅ'æM' ûØvtr¢3Ž—ˆ‰<ì¬yTs˜¿±Â Ú  Ú=,Uï„ØmÖ¾#mÿ$¥ÛÙÇ­œá¤™…†ø‹ð/ÓË2b¥ÞÂ’’¾4%PÏÂåÍK:cøc†¡ošoÍ;’¦[S6RÂyˆ&ü6Íà ±6îQóIÕ0 ®LÒu»öZŒëv}hn–ä¡ÊÍ›µ„&Šª¬ƒ±mUÇ&Fó³rê:q´õBÂ'ZßœŸ•“iû±"]!ò)½¥õÿ~ ù´ c1Àòö¥E:¹lY!lc¿ñ<;æÓJråÃNaØ)[•ñF]¿Yäû†]„zQÈ¿bìé8&ÄÒ{Wð’ãªìK9Í3¯+Ó=,X-–LøÒ—é†qò/ô»×ÀVdefèÝÚñ ò„™ÊÅ„'ç cñ+¢¤í"Å)²:‰Å2Œßëü‹Ï ònµñóáÈž°žä_é^ŒÉdPG_ÑZë» dT]„Âô%…8¦¹·ƒÁþ~¯ºNê(gI™¶b]îœù¥…Œ%¸Ý 6§Jíë2ç\- 8ëÔ{…^ vƲ¶ ÛŽ´Æ|Á’awéQŠ {— †sàÝœ(Īãü=½Æ^†Ê}aó‚o.Ìy ±”„¼rY€{qgwÝò`+ˆE¦#5Óšq´Ùçß7­¥Ö¿"•…eŒ¢0P튽‘ü¼d’œ þ¸9›Â$àp¶{.†z#²f=‚+åXBPÙÞ÷¢ŠßóÒªæ[‘œT¢½sõêZ¤j­×RŠÛv®'x•<¡r¦ ûþÍ:Ö²â]¿Ú¹6ŠnŽ‚ojè¿G\óÙü+-Â9[¤>GZqú«JM’ÜDþÐBõºÌ³63g—PÓ¿çn˜þ›o‚ÖÇ­e»uø<ÖL1¨æŒ7m˜ùýnà(›BâÃkò6’R%¹;B8C¢R$åCðÏͲOYêL^»áÚÖ¥Ò!¾ªá^‹Z\ÑVmÃézáΤW†2¨Cãÿ~¿R¤€ó}¥âÙñ¯êÙ&±ç®+çä¨îD~OMÑU:‹<Átqx|½øõ”k9 zÅì彃˜„H{]ÈÇ çƒ5BG€ƒô_¾ô‰²×ê+HÛ4¥Ár'Y=üøK_»ò>2Ö:)“y¢Ï`þàêû÷¥üREÝøFÖ—ÜeaÑ/£„Æ”™ï €ðt§­,H•ÙEŽ¥åCC€b1¸Ê·ŠP`¶2÷ºön£ùZmvëÏZ!öß 'w¡SdZÑcTWeæŒVJÝ‹ŽXL¢Yš³Fd÷gëoüÛVim^“€Á¾Xf ?VX±á&WãsW®ï Š=÷ÿpÌm~³Þ–Cæn¹Ê-¨ó\ ]p[)ˆ÷ð]pÂ\,Ž±í™‘?Åáç0JùZÚŠ„¬QÐxêÝÐjoüæÎÏ}¶` )6dûا.düª±iL)‘ 6Òç€AœªœtžòDM‰mOcs”JîÙú"ÆG–fŸkt”/"“ 5ÌÅØ˜}å>M+ Ÿã0рǓ<üƒxÊõä5oûþ÷¿k©3\e¤Î4SOT/ÑG^jòJ„R$Q(FA%wKÙÖqê#l ‡ÎØY¡ea6,à¹ÙŽþÖ üSãñÅYÕzÛÕÙ8ÿdK¸IAÂ(ªïîuÓèy²8ôù´ÃFˆ»T+}M#Ï0%Õ僴 Lü„z¸Ð.ÂUq˜èòBä¤Ö¡â±÷ç(SÛ¢»4Ü $R0hPˆ·’f[ÐG°å£cbÀ: Üù°åçºú¯çª¶‡ïF%³ø‘Be¬)‚ª…r¯þZYâQ„¨»«4Ë& á¯E5OËݯ&Œ}H9…ÛÍ4<ð¬’ê9\1 ¹ò¯œJš•ÝS[û«4Ésû–nˆh1üY×’cÎÕ>=é'÷mÌH+„+ç%¸ÒÌpAI^oôªÓms)¯9àþ>À»·÷öü4>¾)d!êD<>)LA¹Ñjt÷ U„ZõÜ›?$j5¤/óoó¿îø1"½ºsô°¿!½ ²5ÓÂr,¬>¶iZº½Vdœ£s<ÿBãU}‰&àœÿ#xpƒ²kú¦Ão=ŠF“ÙÚå7SÄ<Â6Ü/*鸿ªÌ>¹Ñ¹Ð€aš¤gm}EM6ðA8D sæZ’¼àLø½:ÊuR]‡ÊγûšÓi,åš]z@튄A]£MyÙ£س“€^“] >°¹›çëùĤöSã?Æ}—¦—2 Fª.¸ =D»ÒdÞuωM¾f UýýI•åÆ"b5œÎk³Z~—Hm rvé}×®ù<ë:áäL—Ûl¨ÐX°úþ;¹¶‚às™j‚ùPIºi÷š í0ƨ²5CÖ›ýR["ä™èÇ/ò%7Àèa—Q"k‹=VunI= n…¢VdïqÐYÎPš’>Z`âîh˜2;d–^;¸Ï“f퉃,#Ûß¼[ºØ„:”b?˜'µ5LCxÃÌßNIx ‹…ÊBò´Š`œj´úLõóÿrÛƒ_td}J™Ü½Ôæ9ð´éÔ¥ ÍG¼Ÿ‡òû‹­Ò<‚é± ¹ÎÛ´"2óLp ID_ëWŸ©‚î‘Ó‚c­ˆ5òŸ‡|©3M €‘„ú§7®Tb­*Þ÷xçÙ:*Qpû€aÊÙh JCÐ:z,«)÷ŧõ°—’aŸ/‡”²|ßÐNTN´ ÐÆbËçÅ“57&©›¢|šã^-=û7e]Ó¶*2M ¬uÔâçg€oy¥ƒ}àwÈ(&Ø4èÈô‰Í/³Ù nÍŸ{ÿ^yˆ‹6G.(üÅ4ºþ5¼Uµu†;Âv†[¯ÞwjÌ=Øo‘~%£±ƒ4òÈ;Nm?<•Ùç}?ŠaÊ…ÑаtØÍ,&gò ŒíÌH1œÀ|ƒK•¶Ï{_t$B}Æfžƒ3¡%Õ®×`ÉÆëw²U&ð(~t?—ÑÕâlDBIð­JÝIøí¤Ö½oèŸjÿ+zsÈô<¹ŒþjÉ“Y/ôG´3'Kñ™Œ7F‰Œq9ʤY±± ·˜Úx„G*™ê&ªùþ³Â3±íÞW4œ;gË5;Ùë;÷¡ –GA›GãšÛx~mí…G')ÒVsZdÐ4 ¢;Ú.+#„‘xvPcµ>’¨¶ÑJp?ö¼Cg*²>¶ySÎÆ$½ï¤Ýû›+xÆ]ñw*T}DO`¦) @ÛøÍô¢ÆN?–«SzYíiÞ¦–£4~Ö)„ÿsfYh³ˆ'Kí¼J«L‰ ìÜk„¾ŽËÁ ”F@¤´¯Và—\“œÞ83MëaGHÖn»¶^½²¥Šo­µFSÏ+ÑÚ]n§ Ú)ˆ^ÔtžPõôÃ~ƒSM —çí¿ ml€þ—OH» „ûÃ(¬¿¨ƒËN”ãYª“ÿ5Ü?: .x¯"¿jÀ»Ý)ÿsÑEIí,:×g±ˆ¨OÅÁ({“ûâ;\ãO®lt3§È¡¤*Ê@‰¿Ë ÏÅM¹µå#ƒðÒ’ðØËLomÀymSBã“Ï/6ªÐÐÎ7ÿ#d°Æ–oEö@À¼©leXeÊfæ´ºÿ€3w“ ú)0ià‘‡²Jéînõ{± ¦NZ/8ÄC}YîÍ”ú–à ¤rU¨°>­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ:±oPEž¥h=²GQp?ÂaƒÚ*Å2og¢$š»øê·± O /kp‘‘jç‚z/½–J`%$†ïXÈ'Yß’è gÖß°ï ÏB¨œT.Y&*ýòË 5£|ðÒƒ8+>£å¯î2K_oh™2ÎË—HùrD7£s“§ºÙäÇõ‡ºSS³cd½!à•’Eç¤Ó¸°¤{}/mKµZ‘ч2nmñ¢Îy¹ŠÐ‡Ž 4ÁIáU­ã>gÞЋŲ0½˜6&jb²å ˜V)èŠz_ÛpÇ2¤&ø4P”}\¿9á~Ñ‹‡ÿdLW¥Ø¹ÑèU<sg=N#dHs bm¢9x"ÿv«u+C[MPOÔÈ÷ã‹ÔNBì¸.d£¦çw`ÀæoWŠNºˆç`í78ý‰.8Ȁ؛ÍÁì·eåÇ ^ ¯ò\?Q”®Vé+g‹H&þ .õÈ LR&ðs%.ÁÄŸú`á­9ƒMÀ=<ía*ÿk[Á“,„’q0uj÷èwXñ`®Í€É)~"–[Ü*Ç E§ÚKxmldr yA+²Ày¤]Z_vÔ¦3á¡®¹Þ ýíœGñÏ9- ‹Ù½ŽFêÇÝ2RüñQZP 6ªôéÕžá g%@'ö_í¦vNUXã°³ÿ*y³4çø/]™÷³Z¦RÈy:UgÆ<Š¥TÆ#¨(®²]É…÷ó%>GW:4;wè&Ÿ G’å²²~±˜yët°§×mBu@§8!£çAÖ •w)¸$\vc¼í"(‘|”ÖÝÆá³’UÕAz áIÍVh@Mœ/GÀç#»`ß2¸<—‘·ö'¾[η¬gïO¾ÌðéÜ\B$”TX‘7}P³:žÑÁ’dtT¥A£Î®›.¥*1÷ EBÝz~ã`hD»ÇjL)Ç»C$@|03@,½"ÂOWÈ‹W®ž'U AIMôNÁ·Xžà7x²öÄKmzã=•ìmyÆe½ÙóÅ*-@å¶Aæ¶53`wN!EOÒM'õÃØ¡Bžìn 'ÿsô›«r`àÁ™Ôªù¨î\¶@´Zš1'UÅPí«Ã´qÙdò/S»6ˆ7ígi¼ÑPSè}ì˜ < “,¥}Ú`^G9œì9µêhlE¬jÇ‘k[X° ó•Lצðæ©é5œ—j¿ËM¼Œ´2Œï‘TÙ:BƹëŒ1G¨ù»"/nìðj0fòîI§ÁGÙ’•?›É>þðCk4t ¯Íí¡÷Œ©}Jž¢Çß;°ÅåO¹ƒÌÌÖ¢ ë>Ýt¾˜žZö•i-íI¹”9§"ï;[ASºÛ y0©i”yBu¯5åg·š…Íç¼A!}€uY摸IudžN!”œÜÓ~bw²7þ¹w™‰'aÄÎó/Ý Üè)ÖÏF¶EÑcÀA¹±yü âÞÓ:U¿Ì.ª¸ççòïõçÛ‹(¸—·zÒ¸ÆEþ++…ØX‚éE`-0t‰ Dk¯?±^ÇÍHÄ¡EË$ݦÓÁc‹\ýåîc¢4¶0‹Gã ld">uín¶«ƒø¿-ò¤3½`ùðÒÈÐ&Å×T({FªuW4zÃæHS`ÐÑY†«Ê‰ñ+™q³×¹¯ïï_|7,oópÒ-iþÆL€¤H¦òzž×îþÀR§ÌÇÓô†-ºQê–Òsé¯2Šf\ÅÒ®Ù¿înÕíµÓ ¡Eðr·ž´À¹Æ@ÏŽ´_ÊååÑæ˜Ó{¤Lºà>f>I¶Æhq’Lä×3GlÞ÷:ó úƒÿPOpaÕHÙneäàc]À$“¨'—~•йyZdŠMZÄQnˆí€€âûQï¶î¾Ôá¥øþ ÂξÔïá¥ØŸQöÙsê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ ˆ¿ 3ÈNF/ÿ`³Å t–*{[£+#±X­w\Ý·±ëÁ¡]Ó9P:Y¿w™ ·¾• §¦ä(ÛxÀ}êÔW?< K}‘`‚¤­ðPy”>Ih¡§„añU®2ÒÀ_¬²,¥)aæsÖ·¸hN¯Œ(häã’" ¿äÓ¶úÇëÌGÃK6ñ.0;Š…DvÌé!våÀWq·uójây[3Ä<ª­¢3{¦íÛA&¾­et*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dí–DçÙe6¬ˆaúê·ž$%Tj`ð\¢§"†¤çúadüi×Nb¸Ž‡…ñêÃfv×äÆ6í6ZÀÊ..Õê½OPÑ#Ç|µ5L\M›ÑÝL {ÉïX4Ÿ:Î(²“ "?Úu÷¯õdŸISs+ihgº26,‰úêÌFiÑ>ÐÎû¿Ù~šµ%‹jC.Œ©ÂæŽï!B"8T¡ƒõÙ_úoOÜÎÀ,§#u„âí›h÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄòý·'íïç~ßFKê¡¿nˆ~ßSïÛêµûz ï·K/·Ñþ‰ŸÃ©¯á`ßo\Ûé}ü:ËåûkßÛÞNý¾ƒÕPßU«}^–÷Õê}[[¯ªë¾¯A^û}¿‡Oß¶¡ý½VPëíë_…ú¨¯ÕÛoû{õý´çê©?W¡ÕõzLþݢߪÊý]Ø·Ð?öôúžÿ+¥?Ûè™ûz{Ÿk\ }`ˆ’"…LO}E~ƒ)2ŽÔ8KÉ8ìO."h¢ñ iʱæx‹M¸‡Â€Š%IۘɛÄBôñH1 g3u\å_Fq¿Üá’º¡Ý<ÙFæôgJ)`*8´¯‚ÿz{ú¨`…[kÂýÁ\p&ò¼nÌ.†šµpmXH^ß›{5 ÀŠL?l±¼óCÉÓy£Û4wvíÅ,øÖWRÓ«Vñ§ÆÆµºÃµ‘|š@ ‚^hýÏò\¢`Èþ¶LzA@é¶q,¯A¬]‡¨(Ù—Ä^ëÇ@O;–Úcî\'Á‰¬žÉ„,\" »W(Zß5Z@(Kv`MÚo‡DÊdê¢Tý 5˜ªƒ.ßÕ¦²J·¾bÅø?2¹ŒÏÀØK‹ÑÉྡྷ ìeTi¸wL’ëŒÿ®†ô÷/Š7…ô6vŒ õ‡Š†Ý) _D©aŒql/ŰÛm¡el4:Éß•7gŸê|£F[^)q÷QOÅ&& ·¨ýý4=”ÜbY÷ ;þrüÆs1iI `áSEä<1ó³ùD7s¸fÞÀÙðñ»fà ц͹‘ÎVäMWñBåÂjŠfû(ã‘í)Ö¹v‡aĘéSýÓrYè´¶jhàà }4Gr‘pz3!ô?·¸qLÚ ÊWªsº.x”«äýãG{ˆz$ ¿F”éN \ì –,oë˜}àòŸÃå„¥óËˆÝ ßgúÉŒÛ÷s¨š2c«”@xŠ#Ôl\¼çž 9—×Aßò8QÚ¢Òûê­àq÷œÃýï©É $òã¢v+˜þjô•Ī6Mã8ÆùÍ:Ïnšø…C,ÆKC ˆÛˆ3)TäUC¯'œ/Öj¤Ú öå黑eXŸD'–Á¤0¾G­v<“’¢#ìyñRj‡l0$9 Žú‘1¾–gz ЬHÜHºFÁ5VD {"hïêªÍywõmÃM™ØÖŸ‡Ç›œR„â¶JgâËÊœŒYz¼ñŒ'A±é÷ÎL\ø†àНl#“ÎÏsvMléN¦¦ßÜ÷è;¬æÏU;%ŽÙpV¹ ’ˆŠäqˆy1€\Š÷‚>ßdnÉïHAšCû|‰¹TNç8Ö¶ù%ÉDëŠ8P:rjcª‘˜Ãní¿¦ºˆéHM|Ä3dwº£WüA/ÀR–ÖwÅý€Ò’»ãóX¥‘¦Rò rY@ˆJ!¯Å<ú™u‘ åżé¤b‡©[‚¸8mÇ;(ow"㦘c¸¤hô1a§Põ)ô«t$wVÆ¥ Râ6[{¥ëK­ªeÛ«`D_˺.!µmÓGÖµ…ä Y2t' a¤EñücšÈ­÷BEâšãþ®à0‹ˆGEÃÐÖMß¡AªáÞj”(,ƒë_í^+aXòXvŸQ“Þñ(¥"f?Ú‹îÈàÉžü­rrÍÌ’$£ŽMãI&!d'B¸Ç>ÁÂÑ¥)Š…àÉ'êlÖF8kOW IT¾Ã.oá5œ—‹ZÅé›h¢O{ÊÏq}$/ˆ»ÐzÃù¼\íhø¤†Y›iŠ”&¡r¸„؆ÕLÍó§¢”ªÁûS¡¶ˆÆ]$”šÃSbN)ú—ëé€e7  >X›|³*3Ô:Â.(Á˜z¹#vZß»ãC×ÅüÃÐÆ"Ãs73‡…ÊIä,Ôì‹Ôåð­ë¿Œ1Ó¬ Ô{ǰ—‚9&~Ζ$>±wŠíU´†þ³Ä”Ð<àfú7x&°$ŠävK ´õ}ñž6:œ4ÐøåöNÑ2­µ”7 _·ŽCŸÞ‚·œr07ÆÒ¼ÀÛ°«€f8G¬h}û+8¹=7ÉUsô„íŒÅkJ‹7MLúnzÀ[(ö=+ØR*Ñ AÙy$: Úê47.;#Xñ]Ö¶¼ô°ÍYG0 qžR6SÌY×,{*ÝT¥†ƒÞì¦"ºü u¢:¥—€ùøxœ;`†¢—&]àMªR TßÜIþB™QíÒ;i-Y@- ì-Íî¼ÿDØ7¼…®!\C3)>S|žèû#–ŽJ{aïñžâ¢$Ö8$ðÑ\–FϦÜg =9s>Ìö0öðòÎß^î«'ä‡]¯ý´B»3µnçóŽKúO2Æwªv.”\éâô~úàXdüQ<^*G]Ö:þÔ¢|˜¾ §AUf…sasmöd#DÏ1G6pó© làsÚß'ùmKùìULh€ßÑDF©H:Õ1õä¼jyš]Òð“…¦‘vV ØŽì#Ó%°æê¿‘ª²"x_É–¿acŒ/ðwxf¸g)-¤Ð=¶@=]¾ÿ-þÖÙ]tþÿ¸»vãȰúWŸ —9‚†ZŽ"4ø(¥ÇÌû~7 Yƒ ssZ¶"u³t)}Ô šh ΄&¬\ ¯ÆØaíò#²«5lôÉÙÄTè©…@ïhD£Y@ù`§£ïÜmµú”›"@BÝ·;7w¾ ¹¹„qµ¯Ÿ‘†Q7>uâË;šúÐÀ2Ä 4ƒ„®J¶ÛÃÑ,Á;« 8Ûw¨ôýóoS²Û†yTúè°À¯¬ ösÆ¢_«zUªÅ¯nxnê=;‡´Ï‚€YzaÂ8XÓ+N,é៣J(Õ†#dö³à'û´¢ºuü¨hÖ€¢”«(y-ƒ:YiO<œ»vÇzìõ¯(3†Â–´ã‡"ÃÞó% þpAÈ/ÄÛþΞŸ¡žÇè;é¦d>xIÔzªñ •O\w± jn~Øþä‚ Ù85ϳlYÖ« „ õI÷>‹±±’ŒŸr]~ÊãPE¼7.ÀhÇ4‘2ìwì)KÒ!?“+æT‰Û(×j_ÔdtR Cò?Š‹´,ZZ¼Ë/¸mÀþœÑóáa @ð|„å3x‚*dQÈ ÕÎÀt&lQ»+°±Vü,' f^¥¸š¾Þ,‡HáÃFA_WtôšÉX£ÓÝ)ó«õ6ñ“L5D”Lê¿Oä<° "XÛ”„W¨_PO÷ôÃÉÑ”}4C\f®¼Z| 扭~àí²î_á Uü}¦Se¼&ûñÈøXXO}Ï{÷þ´;K9nÒpxö–=u&¿Å"À/^Ý\¾§i´¨>ÊŽÛæŸ/¥(¿u6Ÿ[ðÇý“þ7&-±rüs&ûºÕéw.È|Ïÿ p„µÓJÜàJPEHOf@|̵R»×çÐ1j/qô½`¸ˆ Ÿ%M?HTÚ¼kw’©±OÐh¨×ÌN7“ Y»ìäÀW_6ÿ#³¨¼]‹F·3–ã ÔÊ]GÿEÀ™øÉs2û­Îu{ÝJ{dB ¨~/Âh¼Åï…`¸:a+ÁÓ€Ð]¼ø%•5ó.–œ¼F æZ†/>˜s“ \c?Á“šAf€O¥RKôgeÍËsþpº´X‹–ýL¥VCO£ÐÍ—íÕ×eÆE‹çÏYíZxÌÊ7jiÿh_¶%LS Þ.‡Fi¾A¥&#¨@(WhØOd>’bS‡·™…–í*švM¼³ áŽTQ:œ«65ï> ‚?]ÑµŠ¨g ÒROéz+ˆ'ݤ 7!c _®ž£\—ûƒM#•ÛnæÁdìVÅRzÔ §È£>þÔ¢ŸTCªHú °å\ÆžQJ?þoÚÌþESq`aæ×BúsÌÂeúm¶øëûaê Q ‡½ ”ãœ=¸‡õ󆩕œÊ¢ïY./£iù°¢&˜ƒ²ûéÌÔÉjd[.žZ¬mìÙØ É ‚VäÚHç ¥(Ë×r|ëƒä]íN7îÆÀ©²‹‘ ?µ;K„~Fº^å-0Ì¥‰ÿœoäO,8ÇHeÜ(¤Qﳜv·—ß»˜í{_^œæ. Tð oåaÆœIôˆ¿e#”ÉšHÂÞ9™héÜ+3*!“äùzq= lû²& †³k*Ža¼wn,˜± de¨5ì<¶‹“iKÎ3llÜkÈuD|Á1™LPç".0y#Ãs¹¬¬Ãz EPKr öqMb€f ×¹xBÕ¤ …Dý†„ýæ:â®! *IüÅ<²à0ágýY¥œ«æðsÇ׫f–76¨9ljF;YX#ѦoP¹o(+Ñ5†g—ò–+ô°¸þ]ìR7ÐôÅí6h°ßº¡M­—›_`ˆ£„ôHÁÐQ[Êð!ýAÊÅ«Œ¬–&`œN£Öj‹¥\ÙÅ]Z¾µæÙ솮@—½¢,†õÓ Ú¢€à&±F¹HË›Ñp†g2 P ê÷Lt’}úë¥T¹`­ë©GÒ'œúÄs'c"søã®—±Þ xèT+"?”„Œ"PñV-£øÄËÇÈf¬Ú±SOf—[“Õ»òlÛ‚Ü.±àñ5[A6Üš{àUÐÍäICì÷Ìæ©} ¸/º iŽÝ¯ÌÖý$ÖæÖÞ²b¥êîô¤UË žhu‘‡_5ñ]9€Km`t¹û›.øN*>"’쯱kœ¤µ¼®ÓaÇO¯$%ƒÄtõ®õmG$0ÖÅ`§þW$º”†^ô…MVIÀÁ iª$ŒR¹Tì“–ÌÙ¹‡Ü\ºÝÖGB"„/0¿hõMìÔ§±uý.·klž{•Š£5”Øeúš¨„´ÚƒNüyQýµÊ:i{a‰U³“gø¿Ó–7[ÂDưΙ×.Î'=GÍÄOY(¤Hs§•mlÀ’¾’>^Ìvº„õ[{à „4/?v'gaˆEmå&ܹ-zC+¨â½ÿFðSŸ®@‚ª@S ¦Yçñyµ±÷ëèÎcr¹ÚŽòK×=]È]”ö*ÒxŽÍ@ž);)ó!qW[u:s«|8õe‘ðXEÌØ­¡Ã>¼kyô›Þ,@Ex14Œ™ø&iT}ÉðjØš¦€^Z‹ö›ƒÓm³†îÈ5²•⻥»&yJ„ÙM†N1dÀcм1|Oƒ•Î\âc‰ÕMÎfÃtÍrù2“^ 7ãÈ^KØÒôö½ ¯Ê]ø¢˜Ètˆ’À{ɹ·1¥¥J)ŠÏ¿™©ÏZÃ!ŒÏÏ4ƒï:)õaºœ‹‹““_·\1T/°zÃoªƒJ·½ …¾šjúóQâ,“ý=d4ÖªBAöæ Õñš™À¬AÂ~R QÄÃH/ÙÔ~©Eè1ÃV²9Ÿ^Vák5Gñ˜"E¨øúÙÙ(a½÷Ó<·Ó£ŽHõ?‹FtU­‰^X(A¯@•Çeˆ.tX©M(¤Ö"×ø\µu=[EO½€ÀP«ÜÃ=Èø"O8 *˜Š¤+dF_ä€Ý/;O2Á¨wr…n‹‚‡ú(c(P´ é€çW÷ÇÄumúÀ„£‘Ç'!ÇŠRÌ/¢Ž“g’=Çå9©\§è H:Ãû½É&áÑN ü•mz\§:’j¯O‘[V2(»Ç"ä,9Ýæ hÖÃ8äýA‰`õ<þa ;S¡ë‰j,Ö!‹à a£'uñ<ê*B} <žkj f ˜òòT{$…– ]¨!Lœ9u;Zžmÿ5)¡±•ë“çàììï’RÚç%H½ «ØÈ¾c;è÷eü=:‰ÌR—¬_Bn«Îtz{,•¬÷W©ô+)§÷Óy´6cé+B‚¼ð¼þU§âð‚Ú è ®`ÞH,~}P…—¯‹w~à 9£P+M$K|-ÑÞyõa¡Z/îŠ8\*Ü0 ÃÎ 0m­_¨)ÊêºóùÞŠ ‹*-=Ø k÷'ϱÙá­?š¸ï—LÆmw–Ñäs8{V‘±Ë §Ö‚@•UÀlõ\¢ñvý²Ê-òIÇÊRD5ÄÊþdµ»þjpˆon¹šâ4ÑO¬&¹Q½;ŽÃ¡ÃK9QêžKß´¬*f´w¹ŸBµì$A6…$'I±’g:ˆd^ÜÆHÃÌå$ Ô†4OÊ”ú•¶J‰ÖúnrŒ½®ª™wS„DÄ;ÝÍ:Ê(+Ÿâ¼òí²ŸtÒ|œhôÿ'íÑ,]ÕÒö?Øjô´Aèáæi9FÚ¤FÞ±RÅ… bÎJ]Ý%;hY‰Y´‹†çdüðÒÚÅÉ|QÁ€œ …Îy'ñÐ,x&ÄÑ(,4%êXžœ$¦á ™çx ÛUVšº²ø“‚ËÀYïÔ£¶é=¥N…úîW ,0 `}|Ë3ñéµT°á¹Û¼°¯¨®œÀ=Â2(=:íÔðUŒB3ça³µP)Ž™vàˆ¢ˆqÚéG‡zC,1ËgN"pèšZwY9¢ÍÇíÙªx<çOE$™% a^!YÙ¨  ™èÏþ`dz°A'@˜ÎkâŒ5ñ#[uÔ^¯ƒðZåø•¼ÔÿîS(Ã?(išO:è³­†9 o‚£bJy .^°˜ŒL‰ OeÑ‚P *seA`Q—g= ¦‡¾Nzd+»wå?aNyê°µ"ˆÍ]ÙÑ2FUhc5_å>íþ“£‡dmEÌö úT÷ƒ„¶yÛç6?¹u€ÃÐw ¡üÀ¢èÒ…Jö¬ê ÷ì`r ®+YÒ- ??/‰»Ÿ‚f#BôZ¢.n:Ϥ³ ßjÅm¿!BmšG¾˜”fKëÏðbL-íì ut¡êŸâ•|š¦Ù†(4ÄMÓE„TêÁ‡Ñ 1h?§<4† Tëw¯i÷›' ß!šU‘»¬#ã‹x®k»Þ8¢Ý9¯A™/óæ ø–Ìp²jqÉë|+ƒ'bQª‰±Ùe—G­ôú¨‡š×<¦aH¡[ä™5 ˆ(L +NLú˜mØËÂl€w¨9@’{CX(ÆÑ=mkSú’©±O>ðSá0B{2«Ùoê@¡O‘‡ìEùÛ}.aUOšÞîuGó+üúpfYpô ·52ÛL€;¡s“¦üyç>åܼ= pMº[¼YEö؉ ¶Qr…‘ÞxlÜåS!µWk-¾DÉjÂU¿xÅÛãMVä“ùMw~%¬iõØMþÏ’’åká=ÜC¡»K/é… Çr‚Jço•Ð;-ãåÏNì¢.Ë i¬:lÓ·e˰øgÌ9ˆ)Àë}ûë[¼Åºú°aöÄ”‡sOû‡Wè>Qó'É%®ÎPè:'Õl¬dP˜ét†|ïvZ“…ÀoáR4S¹9qžAS<™&6&^ß,ƒ]‡!×c~ânM›{ë|ù*ÚªX(ûî` “ÀAa½ömŒÓ²Ÿ"$ô—‹xé¼¹U¤0rŒêQjÇ~nÛz|€zXUÕZÈ……ˆ±ë ·;q°’ÒæÆ(í_ò¥IÓ Ó^?¬"xÉ1)4gÝwÝÉ/2ÜR4Påéök(’?8 ”„³BÌ=ÓhÊÃtlœÛ¯X›ÅsÙÿ[iKéuçÊ8yÁ¸Ó8¸„+VÎ(ËrhÕ¿:ƒÛ%p¸Q‹Oc/v,ÁpX£B—Ã'  ^£‚:àµj¤`„ì}äó ¾PxB…ÜЋNÝY}¯„ ‰RÑ,O3™-—«[’ú¥ŸÖs“ÜêO„&`Í$[™dÙTWàK¬HU“.‰ðÅøƒÇeÁO§j'ØÐŠÑŒSü{ßs¯/¼­ë .ˆ­ó ìwŒXZ„X þEŒ_å¶¿Oìk§®äWziÇBöçŽ`Â<$¡ÖUà¤ÃùF +Šxf°dîãl!¸’L ,Åmo#Šÿ9þ\@+Žóaî®î»Ã£K¨°«MÖÖT¿£Ïš¦< ­q럛‚PžèÈ™^-YèÆ?LßÄ„ÁÍ&ãCGcĘqZŒ7M6!W¬éÅrH¸Ùh¬€æÐ hû­w§35E>ø‘î×áùqùzTªÚõs˵éöG~çYm0ˆê³YŠÈMOÊiÃ>ÿV ôš†Òmr<Œ?=d’%¨të0KÜH¿S¸l®­»R"­ºÝ¥“1»)œï5"ÿ6ʾkìI”-Lä|T¼²™w%çó6’>!x;F(Ê!оÒ1¸Lw56½?ë¶ôµ0¬[“éÝâUUÆ‚ˆ´7+‘÷ú:ÁV®é Ïþ/‘·_Ù·3¶òÈìD Ç5E 5äþt<õ-þ¤N©Ï:Û£#;¤5aÒw%¥°ÌÈ»÷VS%6­«9XL)¥‡Éu †ŸÓÇ$ÜŸúúq«¬ªLH@}åxÙ%»«²óI’çøŠÿCX8Ê ßPó‚H#v‚è‘·?ØêÌpgæ|ë©Us£’ŠÂ¦(uþ;â|¬· S7\ñ¦Ð˜çópL1oJõ|~»tÁ®¨Ò7”ìÉ[ l':Æ „÷–9¡N¼"ÌŽ¨Ð?¶T·œ®€ò6ÿx£Ø­¬BS/™VD=›Áuª`Ñ’ÿ}“u¢xñØá-Ų¢Îœ‚|9‰NþGÕÅÔ0a“ûz´T¸ÉãfÇ95€üIXâ‰ñè0œ”j–.ë{·»H.oq!ž‡¸J%ðìƒlo1ÖîŸSÉuº¦Å½äܶ<Øc°[´ dMXVü·»ªKŸa°~¥@dß%ˆ¸mŒ»$¨ðD‹ðBqÁTaÍÛ j©äÜÿiI“öšù v¬µÊÞ±3%ª×­ øÏàAKme»ß\ÏÇ': KöÌkª~H„KiM–pñO<<›uÄçÆ|‹óÖ¦ôß÷L_mÛ¡ ¦Nàß ÷µt(¥ÅPâÐ |é©”Á" ‡Š‚°rOå᱃ƒ|ý©7¯þ°§x†ù(­ß V–$щùõ>†[ÀìIh¨êâD˜§J{Ô/漸k®sâÖH ECª{1íåÎ2-‘þéί ȵËèsq€Û<~iä&¹€B¥)¬ÓþŠ …éSYœ‰OûÕ¥Ó¥Â<Ž ˆôa³!B‚ÝÓ¡­ÕvcÑÆ‘…À—óT”Ý{Ñ»ñ¼E-&³ª»[ޱ¬Kå1ñr^=w‘ˆN»ìÝHÖ‘„kÔ«!0 Îgt(3 §·ñêYă©Ì9•Ôqë ~cõ,9r²z& {?o‚Á¯-{ /#ù ³ÒD(¸ËßM0ä\`—uÀŠN`jbùÓ×CŒý¿Œ~Ç5`·•ÕB\…n 2¹a¥h²ÞA·¥7·±'$pßP¢OJ.2N[¤WÒ8€»C™Áç I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†ù¥Ä/~ÁàJGk)¢4ƒFEÜàÞÞ®bᣘøÊh]‘L, IŽ{SʋܸÏi[ÈÆç9àÔê„gÄF{Ãhtz_K-¬âE÷9dã ™®Ìp…DÝã´žDµ+‚‘Ê7¼57u¼æ”.O£ ]y§Ïwæ~ Ic+Øv÷ÎÒÉE¾Ëî(ÿ,S$ø±æ 4«Â·©næÁ ÓÎD|±¬Bè””‰|ä…2%¬£ÜÖdl~îV"m½zÙ& ÂչСŒÙ×XÄE¼«Ä g{`ݶ´â Kl4Z t.̱ 2Ñ7: …°Š?á$^$‰ÃÁby=¡‹À•e ‹¶Næ ë½äŠ[ðˆ’ÀÁLÝy²î²±Š®ÜÊ(¡‡†w]Š€\±rælnél çT”yÄëià½Xß…¦4+6\|KlY³›ÄkÊ9ã>r’Hب¿0_:ÛQÝåD~žY]±VË›k‡t>Aï@ÈX’%·¢«x=vQO€¿¸¾ØkuoZãvü›þ©ŸÛÏÍgIÓÙœ±Õš<¬ @ððL”yŒ¿PW‡4£-W¨Ï=æŽÄßÏ´Ö,=FÛäÒ* .ÿ^N°V³"3ÚBCïcáE¥717œex‡wJnÑNsIéeTn&dü-ÜJA¡ÓIîÕpúÀÓ±x ~—^—[ñÆK‡÷Š*â§bh3”iˆQ!Éð®È…aÌVAr¡®"™ï,—å÷?U°ÈÐØõ¤®±¯ÿ_ù(ò;çÐ 9n–"öN)÷ rï ´RqÇÈÁAGÔŒÔü]‹Gj¨sË héÃÉÆïÎãhuŒÐÚÙ8ÇÏÖ w±îß—â^€©CIP•Cj¦ª/R•‘ûѾp|]Š™±Ÿ ¦‰(Hî‚ê°.#ùýû"5éÏ+‚q²¶7… Ðh0pOQæiü¶;ìîÁÝg@e ˜mˆxÄ,åCõÿŽ*¥xßÿƒšæCpñ‰!Ê€ùöôµÉ “ªœÄ„Ô•¹Žsº‹rA…˜øK¤ÏÀ UãKž\öïá1‡ìƒÁd¯DU œ¡&;ºåçß=d ÷?…aÝ¡Öj ôîû<8¦¹,«ùò‰¿cÈ•âÜâ§;ÐhÅœE2–Ó;}GÜ…Œ9.é󤫸è;^]JG¬Í9“rxhíàqš•7knå}·“f¸žXØèšP’@E~ƒ”ùñu¾|­ ’òòX›+2e „Œ"&š÷D mÖ˜ô/Ÿ¿Bì¤Ã5ÍøÈ¥ø’F¶cä ƃ/¿0#‡›üš…æya0AUÁÇR» %)¶ÆZ¹çSûÞãj¯wU*7Û4Ø(­ÃÆk˜w¡4åU9Z ÊC _?F‚vôˆ,õN¦ÜRÇÏÍ/žKT@KºâÄ«P[—œHŸg̈XP®pqƒùý®ß?ã=S›r eOÏ"ð¡Òñø³0yw9-^$wÊ”èpÃ^HR ÄÏ…tZX™“î‘Ð,RÊ]áXFœÁô‹Œ‡×-pSÄ"ùŽj°]oïC³EâB„Éý:ñÑÞ×=åÄв O`ËÌ®èÕá0›cr‰ÑÇNC)(¦ :Wˆyà%-4ñâˆÐ Éí„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*BRq.€8ë<†È(FNö;›£U:P¬s¢¤mšmíVmC'jØ—S&ƒ”^¨Æ²Eâ)wÖÐÁû¼¡óU·³‚)ø8rÏô©ý‡ûS-½‰î¤qž])¶ŸW+bšž§èÄ}êÑy”1ýÜ& u „Ô ™À?e‰ÍµÖåÝÌÇeê̈lt\uÌ'?¯ÔÜý-•!ýâ³ÜeU±D]P·«tÞ˜%¸lÏyþoì%¤Õ Ñ~ÿlË£„2SÄŠ· @Ø4§PÆxyÌÏ‚åÀ>9Ï#øG‡8í oºS߃$‚\Û]Uêüµå,z½pdœ®/±r^[|CŽ]sβ7²ëEPD<ÒzŸb W·Kóï—ª)0)BÞ x§Ø#qҹѾôèã.·wE”8Èp‚ùÁZ×6ò£›ÁZ©émµ]{4Fõ§Ð’ï)Éø©z¿ù…>´jÀç<ž»ƒý¬»»#Ð ûWé7ϸut F…S´7'K™™P ypA°ù‘"‚ñò;½ÅCoðñ?ÄPð+œˆl‰XóJ*%ÆE•ÅÞ^¬"~…ª)'¹r¦«¾Š{oä¾(‡*8•’»èHt@ÅšB³òÝ¡k,aY¹cæ™ìÛ<ïÒ âg×s} / >6[?6©Ý!ÎA–ÿxÌÒâ­íTèЉ´ ØýçÎÅŽùy°•Ñpˆq±’JÊ&#›ë¡œ9¸Xw1‰ W‰­t©#bÕ‰äU§ð :8I'w‡Hn.š¢ïoáð™}.€]ŠxË$W¬Dˆý¤™ÍrÃns{ GÝЬ í\hÌò¼Ñ AÕt8° µÜ\ø±ÏO.Þé) }yS|záxÎ/{ÆAýþx¸ÓKSPb“¬„ósgÍñ[Å¿œ™&ÁÑGº€¨3™Œ¨f‹€ ?JÀ|, Ù›1 ÈÿI3æ>­!•:1÷œâÆ.é£i짰푞ü’å?ù wÄ£,ïWŸ–Á¥jB%騑¾ÔY}öËM‰ü`HîûîC©ôÀç'Mfúœi+ dŒDžñüT#¡×{g¸X±!æŠH‰=Î!¢~/ YÃÞ²? «ÊU<Ög;1º~‹„]ìü+¹1°¢–d ¤6=‡† ëZ(€Øð+× I;‰f熴¹qÄñÕ4ñÓÈe-n>ž§H1PÎð}!æQëu6u¨ÞÊ+Ô·K­\îæ<îxVWfÞáÞ²­aa”Q†æí€Û·8µV¶Q.äÁ=[Ýý‡ÊWçJ­k¼8°„‰dùÙõkLBÆT†S}¡MKª´û¿ëôpº¦~,ú×úÓq`Û/g° L(Ò&K2KCž›u@4±Çì¾…s+|äI¹h+v::žpÚº§Z8|£ŒtW~†"˜Ñ>ÿWy=bûnå_ã6Q=†ë2ÚQIhš0›ÀÏlŒËVSàŽ•«4ä?[á<„À@Dk_óPLw©ÈRrRµç²QÇ*ßć¸7Á’ѪrªÃòE|ožÁö‰¿w›QíƒíÒ)P]ûzX»xÃåŶS5ëõ‡wWöbÆ3½i)¨åwè@ Ýý6/†¢3Œ¿ ïFw$Ê ©©åLb5ËÈ› jÍÔU!Ê2 +ÇÙ…¿3ÐÄNÐÓËÇV^2ü5wcEÓ¢J'þÓ¾Û–.e·‚Ê”Zº¨ùO´éLüZ}ÑÈÅr<•HŠ&.\5EUj .¿„Bs—.¬¾+™ûŸÄu:gGL«ëS‡ë è|Ô×=Û{0LÞI‹u϶ñÀž£À(úÞ~©W^t Á[AË_ÒƒÙ‰;|£á½Zøñ­ì&˜¾øj/ÑG¸ãseé[Á—´#a·¨ËXtVêE˜­@"ÇÔl¿¾úP “0{“€ã̤12´ÃèŸ1Šñ´Ì;%ò æ?ð¦Ó_3î™/ž}ì甞ýÉüFuöåèžödV êÖÁ+Qo ’š–,±L+ŠÉïˆÆyú#©ŸÀæÇYJžÕ.T^‚w|Xøªɼ°@–ï­þ=×òýp2’ÍôºñìŸ4U¸ ‡ÎšÈa¤¶qÿ+œì‚™"_¹¼½‘í­O›ÆB†wcÄ +,&¯hÅ™ì”s:Qò_Zê\ESZ¢¡jd7²âÀžðT¥ñÝéþƒ§^””ä°‘ÞÄçrÙÜžKC}ÎãC#£”KS8È´¿8)‡ªÚ~®HÃ=¢Ñ Æ“ç§GËˤwÖ-Æê‹ÖA'HŠ= +»#í•MÐ._¼QJdš¶;£•Ýué…SÄúoûÀ¥˜’°zUŽFpÎó!Å$OçùÂe‘°™&4=úV@É•¤x0†å|l9_7À^@M!õ¶£äÉ⌣Öç,³É›º,|Ï~u¹S”î†ãè‰ÐuTàþxÝ×:‘4)¦ÇûFªŽŠlŒ¸®¦³ ¼ ‡’º‚ÛSv'/fÍ•5™M4‡‡‹ÈŠTH…f­0¯FF¼¡‚?TëÏe–ÔÚÌÑ®×N.Ó€ó¦o¾pù„4e”Xö{d®âæ1qœˆ{$4¶uœ£j™S°ÃÂþjôj~O#KWõ¦g,~kQnw¥¤ ˜p£Ç Ð-Ö¤ÖÑ…oŠæ ’Vµ0ÉU’¼ð´Øß«=3‰cOãuÙÆä }¶™¦ß/éBòÇÎÓ0PiÛTtÿ@BMM±EêÜG-F†>춤–á(½UR)EÖ“B ÒÚ0O뀞¾­Sé¦Ûÿ)ðF­BA”–èò°ˆ×uVóóÔWŒOa¨Ï«ïRúp]¦ƒÍ…ôÌ )¤ï¯+(q±RÞ "n*¹s ¨ý“ˆÁïçù8ëtÁ w‹Ïl¼VîØ#,å$çócÌUò;­Ü¤(>ç‡Í–^ ôÝn'Þc"MÔ;akBNtù€þX›ÂæfŶÎÍt±àÂÓT}ˆ¼â‹' 3EY|¤¡!0/f°?‘&¾ÄU ¼É£YÞ4.roãvä”r®ÞµdÒÚ%;È ˆÍöáþ!/Uj# `Œn-ôZIÂ×XŽaѳßšZ–Ñ"8ê¯õq¦ôÊȦ7‚Œ.Ri‚œA›ÄDcþÀ”²2:n~7ÎÈHP{ø¾|øNÂÉßæÁyQ°ý‘VèÊ‹òº¨z®>“ۨ„p˜g€Ämy¬…#À–F=~j9›È ¹ÏåçÕºÀåœØPNYb9°ú›ƒ+°{prF,ž§k™Ppà0&³©z‡é—¬— .¨E;6D÷ÔÐ #Уv€Äˆ"î ÆDM¡%q+‰Êrmk7eBßÖË,¥–ð’TG#SSÐâ“}”H{s‰•Û)Œ‘ŸéYJ¦Û·Z}UûÏÍ2Ý,Ýu¨ÆM¬ìF„Ù!d¡³ƒ‚"(‘Ÿ JCøX¬àðâ„— M@p x¿8fø3UäOêl<òß/à·Ä€ýÁ”ÔºøbýD# MMÙª3¥‘jWD±RÒLÀ“O-Œh§}`>mà^ ÒKxÇÚNÏå‹ðV´,ó銋5†²ö ÌÊlßÇÏF3ÌÄ2,1P*6Ϩ?Ê‘‘PJt«©v2Õ}ÿtÄ™«†ÚwpGMTóòÑi"nm L jÝ-vfñVEÍL«×:IlS£p¡?lë5>¢´èúå°VG£×S!Œ<}GÑlü”ÌŽU )‘£a#ó‡&_èQTvÀ³`TÉ Œµ˜ÿsÁ$®_ƒ~rLîÓe€m"@ †rÐ?Dˆ³|é½ÐçAn.Nñk’¤ z].…ìk ܆³êrÄžØP‰vªÔœÇ:>þü¾:gaÄÍ3šæž\//(%Ûjf)AkW'_ˆÍ(1`Z/+°Mˬõ¾Î5½ˆ+ àä‘[msëX3î3×åŸrÝ Í\{ûÑ z‡‡Sxlƒ³ÞÑø!½ù:È BL¡\ùeïv£ ¬biøÎ_ïÃÁÐâ´lM€Q£aÉ)n†Oݪª×r"Ùd­SOt€,ëkñ‘ùqÖB߃^NüšÖlô~XÀMnIp»ÂM‰:¯(„~Ks=°ìÃdFní)wk ËTæ–•ïØÔsm^@ñsV$;1&%!ôж=X6Ë0ç™Á±Û|W*$sY·7߆¼¤ÅîÞ)1W áfÎjwÏHg›¡þ4khÚ±ec-hþNÀOasª‰¡æûWØs~”ªÔ4±d5³«Ê%Ðal¸–y .“ôÅìØ1ë¿â…#Íê“q8¡}Ƶ㛲Ûh—†¹ù1>N½jªÿK/QÛQ×­¢:œ£ùÛMeGÃ0PÓª±õõz” ç§×ðë*´ÔÔ¿}Y¦z0Šè,óm¡$༲™’ó\¶Á±‹ð‡m ý3Î=Vé>;jMÊ×Þðk–Û7GÈ´».Û׃j„ƒ*Æ`òÀ‘…öÛ@eì>ðNعZô¶- ²+ûë/‚xXðž+.Bˉ8'M÷®‡3o¿ ¨¤âžJÝmæ9x\höý"4¤û"è{RÆåþW²Û —çºa-;A÷ÙÈ#ò7iVÉ4ƒGÍåAmp$Á³Ú9š‰ÇHÒ<˜’j½ Z›…¬fœÇ<²&ümà«( /u¬èZæZvaùªœ„ÜšÁ¥›¶ÑºD™ZK}lˆkÜBÝäu/Ø2#IOkæg@YÊ›ÌúÔÇ/¶ÛØä[èhkr'iЩçÅò‚ žÊO#Hémù-¾É“ ¬d®m"7LÃÖš{Œ¤¸´6¿@Òöj‘̲àÄjHéMŸ<ÕsWOä%¥T…ìRªžeU)†\Žü`ÜH~BØ<„{â†Z¨wîUµ¾pôqÜÐíèa§nÓÚ²¸äY¢qV) ¼ZoÏ_„š5v˜½ËÄŸ™­¬!ñ’É<:@¸e›€“í• ¾²y›#ý,ψ;)êQ=5›nABÚ›¥…‚7EEIUr‘[sŒ§/P8¢wÛ*ÁÎ%³ríW«r„®udœw«ÂÊÖ·ÿ4ŽžsUcã/úh£!ÌKLrþŸÅÅÛßšHøåc¸<°fú¼úÑ ¬y<„ºO¢ßÒפý…œ& pþ[ç|ØÐ¹ªÕ¸æP*¼›5 1Õéï| ºÑ—+‡J?¦U‘Þ³f¹@¡8Â\¾ ׌€$éó)žÒ–Ÿlã—,ò­ä¯Œn'ºÙ;2÷[eÅòîÅn€ªäu†+ˆL€sÍŽ©¤ËŸN-hVl,4˜g ³ÅÙQýŠÏi•ÔŽÔñ ¾t¾{›­­©ï˜¯ûÊó2Ýùì›ZožÐ߈sqL _­ÏÄ>tÀæo"k qâðó½ü@íæš¢ik­c†‹9sêÒÿ©ú%Ÿyawr›xQpá8a—De·=%&Mñ”>Ñ/|‹ý¹ñKà®õqÚcùÀjΟÓÛœ<¹Š7T¤°IÆž 2@€£ÐÊ®OƒüM›œÑ Šè`$nŽgÌÔXmðBEòÔ3°–×G0Oµ‹Âð@(`,m¯‹þ‹¹sÁ¨À ´]´ïGY$«+œÈŸ¡Œû+|ÚÕ2e)Ô']ÑþÓ|—–+ÞÇÏàÖ±,î‘F>˜@+yH6¿,N£çÞX­[A;bL7÷Þ€þâ§$Æ’¬Ô¾gsŠOþŽ‹µÆ»)ýïác"ÿY•3ÆÕoZIïeG}¯Œ¤a±Ì nýϬÞ¯ÑçheU,¤”›œÈ\¨©8©¶G·s.{ù“ ÛŠ-/8Â^†š…{ñÜ`yð&Ï~³KPÖ"œ¿zÎ ¼3¶q´F€°ûÚ‘¹ùŽ^[YmkbO¢È3g«¬¿Àuœ¹7˜AäŒÌ’=ô®em§_};SLÅâÄÚ±Î(0÷߂Լ3’îø¤O´º¸¸»›)æ%È ·´ðîCôÄkT?Ù™+¬¹eP£ò®ìwid5Åy‰¿P(Ç•€ÈäH·4 ‹Œàúd0 1ÌAú2Žf}Âe2öhb9˜=Ó+:’#Ùsi½³íñaýÙn¼ž>pðíçªóÅÊ ,¯Æ\”ržöÉN–Íø‰îÆæ'¦7c²â÷wJ;¹&Ä.t#£ä­gP@Y ö^H~§cñZä¹ {;#KµòTx.µö¾uÓê»ç9‹ ’u97[Ÿ‡Ù7jø²3Mþ¦ˆÝß¡¾Ÿ†;.™Y¨{7Z ”O¥mYí*G¨¹Nt(r' fìK ç¦Ï;|•ª ƒÕØ#¹;Ê$4Vð†Hx6"%Oñ¿ÞúR_• +š§ÁþŸ¥Ô<ÂW7V§eg—UŠeˆ€•RðEæ+3_ ü, N[„x‹¸1î§¿’„ ;B«y6êj>KïuH’Üg">uÌŽ_ÓÈ€’“°œø·¬<Ö˜aANC¤i(šžœ¨’H¾Þ6aÈŠgÅó_ÑÛ‚C+ÂP®Îlp¢›9P"o8Õ¶¡Ý!‘uËÍÜ2WÏ”öùñç!¦o"e¬R+ž X͸v1ÖZ¯×¦ēԼ,s͞޶E¬l“Vò3vFrnÀt‚'¢ñßµåԥ̃ZE Äb³–åïPͽöIu= ¿•9缌<Å(›Ø©\©öFV‚ä?¼véš©½ÈýdÝ~õZý)û…:ð©e‰Ï &sæ°Ün%¸«ä"ãBø²ãýCC}º1Ò—-¸¹3KÅdOF‰Eß¿µžüž3¨G_uRQçÍ*"Œ\ÞŒÞl= ñ@üÎi…¦˜ä)ç›AQJ|*^õ´;ê.„“,îo ë½IOZ¥…x£+hQg ö[[EBþ{Ãpyþ?wù‡KÔ‰CÃŽÊPâ†fY§#ÇAå7÷©¦L±ìÂ)²‚@OÇ¿’¹Z^ˆ]cëZJ›¬9/ûó!Dà{v–׬Âÿ-á¶”…ô¬‹F±–k× õnßµ^›âm“ Ò¥KÌBF>Ú,cW2óôF¿Ã)\,€ó|f4`&l+’ƒÕ¢D Ð*& ö4¦©¢)„¯ÁÔÊ€²É¨ªUtÅ0_Ìë`³|-ÊPÃU~‘zW×iØäïˆtúáœgÜîÔ~¸OбÓy¹€„ªfÖ¿?b‹Dk¯G’“âo½ìÇ[}&ä8XVÖ±ÔP)f†Š;XõW$àÚ†/·ÜTö'ÙlÍ£¦à®´+«ÒRŒ¿œ("Ñc¸LÕ}óõCj]¾;¡òE údÙû#´+lꤑf¿¡C¡ÕZï¨ßòKÓ†¹F„hi±_¹£ÉÄ•)hª LkÒU:®'cKeh;Š5äÂáW_"2£ü§°é]­X9.½‹è…ˆ+R{¤hi6Ȥd1ØuâjîëÐLÐñûyV`±+ jVaÃmNÞñ'jã[X  ô‡4%p(Ëz1ÓÖÐNÏŸUÄwر\58ƒ–¥Ȭ'iÍ0RÛ{Ñ~ÊÄÝÊü§îø¦Èªy> Œg~‘YÅZÄÐc6Ír/îv+¥øzéG½wöh ŸÞeÚï'sQ6C%GDKe†´ ´Ñ9³M©l6@KôxÒuôh 뮵§¶bwÊõ:’AÂêÎK} ©'\Ë/˜TcÔW7<’U†ä023ÎûjÞÉuOIúð/Ó0O¯;%oût®ŸÝ"8ò\õHñe¯GW<»€ùK#U›ÕBºåjÍjF $HëÎëyöþІ¸cr€¹¥Ó” ?PEü^/iõ¿8í™8œ±ˆ`Æ*Sê…sö´Ã"—A{Öˆ"û·G‰\ÂGÑ_X[8·JÆ€^P?ºJCù*6c¢2ƒCRÊ B4@²ôCpá¼²ÔHj]ÂOÕ#¼u(uε³OEÉs.`É‘ïŸju‚¤?г˜ç<™Zc—ÖÜ”êà8nÊü‘2ëc¯eî£?xŽ"~6)xÄX/îï›uši#,ròm¾„ìÏÛ±SŸ»FeÈeÒ=ÙŒ£èðm| åLwê?`S1š©~×@M§’1žºïOUÕSÏG”›Gu§l«Ë7û$Îk´$ כܞö^–U÷ýb§P¹çY;À³u†vkpJY•JÔå± €×–ìfVÔì(ÐG¸HÏË"œd²E\òÞ#†qw]ØX´‰íDáLD’Vÿ°j¦B¢·h °÷Tíd$—%i\¬ŠHû‰}÷o0œ®6 cB#Ø¿wSþ;eBÒoäûÍoÅ÷ÃÕmìBh|AgOx±ßòF¯1ñÅ-‹ªÁ Ÿ™ykK²~ÄMÃG†ÄÙLwJÚL ãÿ‡Hì_îróbÀ™”^hõx'™¤K¶?ë/¡Ü7|¸D”bIˆuQÈ^'ü¥i+²ƒ\‚Œ–J£øÉzZ÷Ƌݮ]ÝÕ†³Ké¹m,•º ¢T+oMé¤\ôÉ4®p»ùáÓ׿¶/ï>ºZVÛæÆrÇð¤ùŸÆŽf6Æ¥)±LqÞ–ü¹3<ºmK#÷>9,aRç‚ X ² %Ì{Æ/f¶¨(Þ9ƒ†’u‰ôq—…=Ò+¶-äã¿‘ª]„œ;l‚fO •3·tP€.0îp–Fê|Nð±¡P,úù9þ£Ùñ„ Ut.mMð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡MõQð©¶8Oj£úG¹‚K&Žx;ù§(ÈP'©NyàþB$šf¶Sr}}K–&ì²þZü)û¦Hâw³Å‹6Îd®—ʲÚã“j¾/ýé‡Ë,lã¼þz¼ÑÀ0”y®²NÙPÊS¦w_c$"­WEàŽ0ŽÊ±æÉûAä“·,öìIŒ&'5·4eWáÇ9‚|E%¡„ ô±÷ ô ª:/‚E=½ÅO";à$eÕ£0åa·ôl5­n¯áÉ$º¢øDtÌ©’¾K ˜¤UŽž¹$Y@qá¨&쩪•ÌWùm‡Eø‰]§ 3é‘3¢Yí:¡#=žÿ xw®Í‡#S·Ñzäˆ(ˆJ–ˤä9ѨC‡î£'ç–Ø_cd5ÒæìÆ«”-BRb!?I¥b©ÎõB”ÈÊb|ˆìÅN[ÙeÙ¼»w7{ÅÔ ykHן€_Ë©6Àvf~eÖµèòˆL^êÿ? ýNǧI³íÔ×›Ð>šþ")tèÙïÔâ[-—>üÈ 3ÍôY&9IxMâhÅÖHŽ6CöJ}¦×`*µwìZ|ô9¼¾ƒª?·9,ˆ Ä÷l*¯ 0ãó,ª¢6?Yâž¿…]’m?`„ Ј!—‘Žÿ~¯*±Ò2í*¹`ÑOÞÜôƒ¼¡õ(w6÷!?4½ÜjDpe36O#¾Ê\´hb3¥.5•OF@ܾB0ØfÉe¿óª“bÌÄÆÓ%Õ8¡Q K#lo2Ö˜3RÓß«p HQý¢EåÇï’²ï"§|…Ð |û¬hèa e¦›¦_4P>ïjÁ9³e¨ä ÿZ_Î8ý €¡ø3%‘ï—\+™9 ÂóÖK—b¤ÑÇRêj«ßf%nn #Ä·ËÜÑúâ âWÜSd m‡9_æ§G`ˆs[¶bÌæ™@š”õŸ¦_'Ì™ù†õ2LõY.ø)jATF(ª0o>Ew“@ãÇEÊæB³ÊÇý¼w6˜Þ‚ašzÅ}ãþ7>¸ƒÉâÓƒ9ì Âð¹»!{¿ßz:ïµ—­ÒCœpuCî{èÚÏ/o™tþëôö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯¡^ób„‰ø3'¦úð:ïžP˜SuN¦¬3ÏÎø÷ˆè¢Wk'Eå¥á—Qþqle ®”;_¡Md“û8;«ÔÄ‘_Ï€ª¼ð*5~‚w ¯YåÅÆH™fåšt€ñ³i Z_%Ž4^…_s-Ö¸ÁÍCÈðd2lÞ;n¡,·®-_”}ªNTtÌN­ ‹_¿”ýw>‘.‹¥o§½Bâ?7ËfÆÅ …#Z'J᎞i„lilF2’¨Øã°{„O¡'Bm´[‡ãÞýÍJµl•ûNƒ3 f `Cã.cåÚ‡K6q:Q½°†M¦ýf À?D¿Þ-Ó€·HäŽÚ )6¢†pŠ8{ÿ‹ ÿKDý#¤:ܨ·¹Š€“wÙâA”ßgºÍp/<>æJÖšÞoIª%Wí-Ák˜ÅPWÒ×kq0ê\̼Ê/DiÀ¿ë¯ôá9çkŒXà[w&pM*ø}»òÍÜé,´˜Ûf$ã”×}vI¢¸î]*0ŠÒ-;3/ÕÃ:W¸Y¡õ\¦ì²#EÂêãâªEä{ÖÅ.ŠptHéÊV=¿%Q\ÄhëèDæ¹dÛs|³†æf(ÍXÒÍó‘O*çbJÁ÷Sr…¬ép’`‘f¼B:ÞÞvÙñc¤ƒŽÀ™ÉÙ&¦Úþ&ù$»Ú”1sf%F H Å(Áy°óËgFíN;%æ¨]Þ‹âq…¥¡Í5#ë]è›Ì“ üŸIcƒÒ鮽…•Ò„|JjIq¹±Ú²ˆM‚¦ëWýêñ²DhkY$H©豈Y)ñªÄ,iA1=(<×þ÷Žû‹u÷œ¨¿yɤJìð?z@9‡ÐÁoxa¡ ÈPõ%zn ²ÊVaO¾c”‡¦Âc#2`&F{M!£×WÝöV])\¬ïÇ d"I\4%»MfxD èc¹£_üóøÉd>E” øCD@ !× "ÔWÉK~²`áêÛ×oÑy‹&¹ÒïêWG±xßqÃ8Œ²‰ÂÀÁ ÃrZ¹‚#¬”.æ”8…,[F4lím*QõšðŠ×&[ç1º ™áÈ(µ8T›^¢è»$LaN|ËP —ˆT’G[îƒ:ÏÒù;žǧ‚p°ð5™Î!T‹ÞPH)\Œ(‚œÛ…¸¡k"Û#Špr|º ‹ç¿ì¥þ—™”D`ÊdéÔêÐz~¡Õ©hFÀšÂÝÐ._ÏÍWE”6#ßÜQ¶ÂGŒ½Ã.[rG}"â*¬g%j‘ÇFθÓ‰ÇnŸ°°ñÝVÊòß.¶Y‡õAÐ’øÂ$¼wž/⸑=ú…„ßð:ÃiË´v¿Á>âLÄ'D‰/Èílð¨ËÚNýV´/zBƒnI$’FÇÓ#Ïg¶¼Þº,Ö#rŠýšÜ¨ n8¡¬ïmj§7æ^sí `ÿ`õ°3÷¬R»êÌ­§ˆÀâò‘û/»’%ûÝ šÃÕÞíÎ]^äH¤?®¹YœŸ‘)>ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcËŽU—Ï›»”૪DɼÑN¬®ïÊ´ ¼ll_ý1žu …[üdy“HSÎ%º,ì¥eMßÅó‘;zT–\û§’ŒÏÝF ªO È ³‰cè*U²ç³[ÝñÁ¥ñ'9l()Ïc-´ÏšÄ(Ù'-áÜv‹ý¼èùÖâÁá€tC´n±’×û#„¤ë`<¸àœ“G›j€}õÍ‹;gÿeaÃôòyð›v·Kn®!5ôÅ`ôEXµû=3/¨Û;S²òÕÞâ^°ºBÃFfå{ñÁK^L-MYú濫9ƒÅ!ƒêe†®~ÞB¿¼oRâ`å¶•ä­¿…š7iá‘ßð{}¿QõvRQ€æS9pØCrœaè-ÓFào“QK9<‡Íÿ è`â{ݽ7*¶´+‹û 2‰–q…̈v !yAG|‰Åüj¢‹uÌÊ™2±‰„7¯#y@ä¬ên…®µ7»vÛ¹›^.EìÍ” úÿln‚m‰›´º 耓Rˆ |ù&|~ûFgtŸ&õ¯Ûã~‹ïí˜-)ëÂJ0·‘þz;yû>$ÔÏ`¶ XúÊ‘ÑÜG„¹TÅ<Àw}jè-UlÇR¶N]mt€èwâàp3„ ÊŽ²¿Å µ9þ|sÿ);6‚úÕ¹°Îõ¨ŠÉá<ë:2>=,l*SP£k‹…N±l¨ƒ¥ÉT¼0ÒÈðÉÇJºM@»35Åj™þó‰–‰øXÏ,ÇÑAl²±Û8ÿ;›®ª1ójÿ(zÄ/·ž²˜M!Çäõ䨕@á“Ñ΋":çë˜g?¢V¾ÛeLú×k÷ê!ŸÑ=vecÇ)‰xLÄ7J†ýw±±†æ}Dóé’.lIvUï)5T-â â—Ý ®A=.´«7pÜ^Ë‚ w`»íOñ=M¸Íó‚ÿH?¨HÏe^©‡ÊŠô†ˆ)ñ Ñ eMн¼ø-ÁÐúû¹ÀÌOr/0‘Hµr<=&úöôË÷*ð:ûí;icº w£'ð³R+R¬e'ûvÅYÿ,~Vêâ6õXiÁm„-ì÷@Fåõ¤JM!Û‹ ;¼Cn»ñDó¼f2,€/…X+•R:‚•pôn¬¿!bá¯?›à£éYB‹8³^m_ ûB]¨Aý¥-s+¥gÂ9µÃâ _ÚïÒ¬ T·:ø®¬NfÝxüÄþciͬ›wÃsȾüNû°"÷cïN–¬O]Hÿ3ž"’Sq[æ;£ª7Eñ³D×½¨¢!=ÆP UÄs©§Ô»ï™uƒIBn±¶ÇL·o0æÓضæõH@=†™„E –i3§0· ¥¿ãŒM覕R½èÉ@n%ïG¤{ÀÑoî&ét×ÿIê©C.ÉöÆÔž½ûwb)ZÓäñMȤfZ1߇Dõrq„‘¤Íb6‰“Tߌ,¡R†‘ªèØqë2vSWyS¨À¥'(……¥P'bŸý“)$ˆ(¼Ø¹ÅîüœªZÚú¨½¥ÊƒŽgI %Ø=_ZZŽ™°’­‡ö¸7 ¹±Þ¿5*ƒûàà” h±MšqëÎ?ÓYŸÅ"ϵ=JIQW}ÆÔ䱚X³d‹|CÉÅ”{õ7 ƒdë[ÊŠÐ p›¸£YKÉÇå½.}Ò¢òÑì;aÿ%… ’o“Q,8©XŽ+ˆ¿Ü2×Àåæª¹ÐRö„±:¿v÷“DÂQ#íÍa®,%ê—®:éÑ&ÜWŸ…°ßûD,Œ£ ?“g~â ü°•vüõØ{àfðmŠ€=(½º¥LpJù³ðÀ]߯¡™ ¯ëïô …±^2uh­ÅÃïƒfÈâÑèÃÞOn#kÈO*¬¡V>ñNo9{µ…Ïtr-‚ %Ÿ'W~QÜuÞ€œ …z¼˜Ì¨¡(ÜGy?¥Ÿ tÓ \‰q}nã‹^¢ÍN¤ýñUyQŒ7Ï»ù§©ùHÀÎfý$Y0 ¾Jí _×{ •)“¹£¿L·0Qˆ“™fÓàÖjˆƒiž2þĸ«•ë¿–Ú£j¶î²_±Ñ]h‡úz:µ¹‹u fƒ¥Þ)­D“#Ù¼ãuJ;™½ˆÝ­%fþá/ÃBi‰ÈMí6zéë ¸†„Ó •MÓ|Ò"c [ÏÃSJ’^¸7g‰M1"À…Är¸–Õ×È5½q/WçV6I™LÛ^Ž c©æú ük•öµ·{Î0S{œÖ| ìÞ°8¦Ï$°#½f½wz=gµž&B¬d­”àaËÐñƒíá¢ÚK5àó-ð Ýj¼}¥«lóbN³³g±ñÔù´jO©³¿©ƒc¥Òp䥑ªËé"}¡Óu ÷U©&4Âmâq‚¹>½‚p£½ÄL’Gõn«§]±dC²&{6Æ4+C– ¤Ô>Å5›Fu†"-Q`G @§è«°î±Á„#6ƒ|&›ÔrÆXÏ'> 9ÒrÐDÚÙLÊVº7=Œ’;ÁâùÏÈžˆëD>jr¦X©\}V‘%·(,úx~hì˜òª,U~Esª ¥^>ÆÈ2;êŽuÇ hµm[;]‚¯¬‰Õ’K0,²ÃRC1wx׿?IÖmE 0ÖrjÚ¯MÜñ V¯@|ðiìþrC$ÿºï“Ú8¿äS(ïêÕÇÔ»WÌíâž÷Ô CNoÑ5ʘÍ0÷rËñ2Ǽ„‹&Yæk4„ 3„÷}ì0fçïÒ`èÉ]*ÇQ ±!~—Ü‹Óï-:ÌŸÄÔ'« bûðþ|9ÜVÒd€‡BÒ2ʵa7˜ZÑý;Šk’¿·$~d7‹¯ˆh‘\§¤_ß’Å)_ÜMõ¹ºÐ«1G~}m+Tî’M×Õ OÔwk¨`ÅùOkê}`”ð&ËÖì…"ƒé¡^Ûç!R+Î,±ªÁVêôî1–r‹>E G†P¤EÊ/¡3ér›$©"Oþ;üGËbÙŰCôÃ:´Ÿ¤hUè¥1ò‿ä|¸{êöÚ§KSB nŒyG™€¥%5{‰Üz‘¹ÉëOÕ*¬ÝÜtÍÊ׳²}/õ†¤–Ô>‰‹gº© ‚rÛjkVðÈGÿC™ñ]£æém‡ðLmí Ò‘D¹ªÝ,…4Çãb¾ÖðN¶ ÕÇëÂÕô ôŒ5…õ4!h÷¡¬·clÖR¶µ:Hsými8²sZSßHù†pšç • 0•}rþnì°#Q§èü~¸¬{Äÿ-3H—<Ê mp­º€j/-¾qÀ÷͹=¡fŸeÇbš¦æ/ê.áS-rU 4 lÚyIJy¤ÔÊGŠÖÉÓLú8Î{„£¾îøÅ!Ë©¢f­…}Ð…f!m¶¿? §oAÊ’ƒå×0'‹Èk §³l"µþà• \Ì”ÆõØÝ¥}Æe®í-±÷Û–#m=…ÙIjûèØú†Ó·\xô“Š£·mÈ„ú%™ á§„Çë'ÀBßûÝœðD!èo;17sú©4`‚Æ}ÂxöE¨à–›®ùú¸ràj·ÕH/åe‚ CÌ{°3ÜIÊ\¡s9ù!”‡=ü¥iø“kJ€µ+¿\›Àæm2d˜«æ£´Ýec|~û7ÛYÏý©òv³"ÙC5þ°JÞ&Woxýîÿ׃¥IHÞ¤ª´Ã£ós¬ëº0˜ÙJJ T(Ç Cn{ÁUô=x~U©DãrtŠœÆü¡„90qcÞº$ ¸„¨c+UòÚ7ÜhžIû¶Bªñ5m5ýÛ·ÌŠŒ®Ý™ÑnjóH¿’PMçÝû78?EØ{Pjœ™¶'ÖØ*Úò^ÜXõ÷ÿ Zß©N¾vV„ýå™ó4ªÃ^ÕÖv@,[(àùµô(}´Z^¥RI¤ŽØNàßÇcxª=ÀJCê¿×·”µÁ~˜ºw®` Vµ5÷7YÿY×Gžý³íóEe»dî×@—‚6" ¶ç¦‘ÉVd¼”D|:¬ðdÛ¾Å^¢‰¡óxµOuy»LuÐýœÕÇå¥7 tϘ<Éó)Zbä¡£¤äU"/È“Bóòÿ*Ð?ù7Ç]$to¥³xJc|v_Ê]ÌQhÇÔÑnQŒÅNH"ÇÁKÄs`MÏÛ(ŸÒõˆ¤Sõ¾i¼7óÌßR•“ªe‰n›µ cåÄ_zƒÑÒoI!¼5u î4Ùð åŠæ]ö÷§sO4º»ÔNé§»]àMÂôk&ËWr´ÆûÌ Û¸^m­ÜšÂãï.Ì]h1ê;*ݰ¾ÿ$®™ÅÁìïÜÒh8Òàkúâ± )CKÜA³’u`"x9GGÚßfÊGу³ô0Ä!v0še­þúW×}{O !0tü>ÿ"ª‡-`¢ÝEuv#“D¢$ϳr™`“^÷¼þàæ}e©íȤúñ-5ÿU¢ºZÍZE‰Àiº½Ç%ÀçüXˆXЦmµ³ç|Z–µQ Üi§WÑ$(Äës¿%1Ê6#;ÔÇ 8µÆö‰åÑÿGØ©]íÜ").ÚD½Ü§\ßJ¨ÿ#örnmƒKï5E丱HÎãmjÏ9_3-—žo,¼¯ :¦ûØž†ˆ»v&ŽæÍáC23ç;Y`øñƒÂ+¿d¾h§ù3VåèÄç5¹cÐTNRøµ/ƒõŸ»¢`ºï‚áM ‡~B<0Nj9jŠ¢ûÏ(#­=ºR³Óýê7JžñwBŠ.(çT‚òbS+/ÎyçäB€FòœÏBÄmßä.ÎKA‘©öK[]! è´áÕ® R©Øš¨5y@´h(F»™½ ïÛy¤‚–Ýv§_ƒÓãœM9#>º#YØÈú˜Ð(–3Žr𶮢;¤qåE-AQ;YzýæQnNŒ×7>8ƒŒEÕ”Äw zdì–Ͻ‡µ·ÍéR»Þ±bÃ|9ö$Ä4äòÓšr‚~IÄ ”›¥øcÞÐ?§ç¥­ãáû~qüŠÅQqjS “¸BÙöõ_ÆP. vIŸ§L­µÚTR 5±¾È)¥g&ÏÏøÝñe`40­éûåm´@)sè3~ç¹ÞF r—ÉQ/™ 7äèóJ®Kï"0(m=eý÷@&ú ¢²Þv7Rœm©ò°¥!„w‹=á1^jžt‹˜¿r=—œc};ç<1mð# ñ0ëêù•š}Œ>+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É&s13]Æçqp$-ÈÍÌ49yfÆø&šìÐM•ƒ‰u Uã3*æ8UxZ™ßþÍòî’ñk†ô1„Ÿz. ÷6)W‘z7ÛùþÎåOím¢b0„¿þ8ô>ï`Ü…’&Ó,³_?%å^²ø½¢˜Ça¶ï8ØÞ·ü°Õ$Î*aSýìDà³(@ ¶Eú>×2¼äž(à a&”Ú=RæÂmD¯q&\™2 w% ¿¤œÜ`Ã0ôM›AIOœräì̤zwÚ~çÃèÚàr®\˜¨¡Ð„ìd]þ²?Ôp:nÂúsF#bþ+BCzáΖM%Ì@w]§“Ødtjö—íÞ¾ãzÌ•Z¬®ü@:y+øp,rfº´ •!ÄÒ»ûTñåÔÓyŸÒ)QUcTŸíõ‹×m›ƒè`d²™"È›°˜ü™š–‰ÇúÅÐì縭 #1q_®Ód·ExÐô šŒJ‹]8ƒP[wƒY3C1ÞRòjŽš" TN}îÎc‹èþHÔkÁ+™“cÇWêRΣ /ó‰µãQuƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨ÌÛ„RW¼Á¨Á¡(Ž–ŽS ­tvñÆqðZãÔŠÆuð‰àPÉ(p*=J  ówcÖDˆŠ¹‡ñiwˆõâm»ô0(‚ ÊòkID"QD#°h1€d´\8OÉJE.­dÈú)ÆdÍMð¡þô&>ŸUŸréE[²´\,³kyŽ7„!`§€÷€âÃBž³ƒ©dº&‡¬ì ‰‡Ñó£³!¿…W86óÞH#‘±M`«Ýœ¶îºÈOÁïÅKY”ëîï6ë‰Ä^´zÒä¿ÆmÀB‹~﹓«^hn…ŸV’ÐpBøhñVnŸÌ«Œg0ʆa¡XëÁPl—é²4©Â>¬)JÑf¾­ío±<à7¬‡x ÉþŸVxŃ]üÆr |d(:R‚SÌE>ñITv¯|E?“„ÜS’ä_—U‡„v+*0pKÊ½Ñø „i“Ø‘²Oé'\t"º?‡ȹQ'ó#ÄÞLÇIN²Ú@K°U§ACt¯Pï—¤Æçv¡æ¸GYneL³®<“)š‰R•6$‰Äáñ“ô,zèà¼8pÀÈþ¾Ô°ÞoÎ qP¶gtŸ-BB¾ ƒUˆTpOf¡ôc×ÂÜõåó¿wôro´é7›m4ß]¼Tª«˜=ØÆ¼./4CÇ­Švࢶ@p [CËo3@ÐŽãĬbôò­ñ<éºom•U{Mp®á”§¹>ô†Ò¾ópfEêÁíÀ'ÂÜí?¢G?ÁXhËþ-¾x4 ÔA»`2iVƒÓù–צ©·Žd¸7» eÇdâÀÎG÷4±œ¡ Ù0±nÓ:éZPˆw.èõwÂWQ¶²BÙ=9äº3Õ׬Ò~¿ƒÀº sr‹+BW­ ·FÚF‰™«~ËÔ퇷Ì\²äóW±¥ø8ȇt £§}7VÎwÐÙPŒÁ}¨p÷ÊGñ¯ÇLTv¶ñšøTúZ°0Ìé)SÅLí°0Š’#F Í3ªxçxî›yóyçâ°€îûl39cqôK²®r ^N‹pÊHœ çÍÛf ±Lù¹…{_k »v0ñtÂâEEQsj€ÍBÀ(Ît:Üð%áÔ£% nïÍÅÑxð£%sì(P1šÊ™w’XýŽU8¿Y ø0jc¡³Óˆc Öz6 ST:™ØÕЂF•èqÇQï" {ÀçÇÀùj9Û©À,ð«E^Ÿj×÷`i'Û^2@2ˆÝ®lRxuGŒÀÅí\B«.Umv¤Ä—YAH€È2ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­x€€ñý¬+»ê³ï©ºú†ÛPoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßS˜¾¤Ùk½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5Ä_RT¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸK›–yÌMBÀ¦Eå’ˆÞÃ$©»ó31Ø_ Ø! ]•h5&’P9†¬r-%^b—½-öæÝ&=ôίüiÆ5B½Yì—G¯Š:);𠍼i¦Ä¡ç4[Fƒ¬;½CŠÌóãɆø€·7Ͳ››¢’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù\zéý( ð€ŠÄç¾ ݧjp`·0*]¾ÿek.¸T1)+§{4Æ?~$(Ô)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp2{€8GÎyXI<îs‚¬~}LR†‰Ñ«+>Vã|›\Z xÓ˜KcBy±åDÙqzw½š¡fd„Ätô›Ýy§þaØm€Ü3–¤jñ{É\Ô$Å Â+fR|VØóŸsæß<¯‡Þ™Ær‹ø£}E’ÜrÍ›¹):ŸµØíÔgeõ¨Y,š‚ÀÎáó'šï]è¹Êèñƒcg®êÏŒ´<éè{+óþ)‡rÜ‚÷Ú~£Höñ¦\ìVõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ðáÞ´,oX<ÀTë«3Vºš3 þ|ãëñHzLãɇ!|·›×Û-øsä¤Y5–à(a8â éä4Fõò{Žû|`øEù+ÉèŒä—Myö‚V,7°WñŒhvÓp¥Ciyyx!Sx×Î/ÄÒvŸä ;ÃYo…Ÿ§§pÁ©ƒ.•K]goËLÇ´˜¯{ Ž—D¹hlLñbT¶·Ñ8ØaÅ+^²¡ÝoéÇè4uD/öÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒóëÛ¶¸¸·¹¸µÓéâÖ͘‹óåÊ·¾Â´Å·¾ÃãÛÕº¼ÁŠñ³²±³µ®·°´±¯´©˜¶÷À‰ð³Å»¾Á¶Ä¸¿À´Á®¥´ÿ÷Àˆõ˺·»¾´À¶¼¶ÈŬ·ÿÿøÀ‡øóݳ·º²½´¶ÑõñîÞ¸ˆux—†ùîêÝÝܸȹÞèìèåÛÅ®Ÿ~‰‚T…úñò€ô»¶Á÷õ¸´´«£¢›¤ }…ûÝÚÛÛڹ͹ÜܶͽÅÀ·Ä¶È¿ž†ø¸Âº¼À·Äº¾À¶ÀÇÅÃÿ³ÁÀ¢†úºÄ½¾Â·Äº¿À±Úùöö÷ð¸ÃÁ¥†ú¾Î½àÞßÝÜÚÙÆ1ÀóóôñàÜ鮆ý»¾Ëþúûùø^xž€õøøÿ½2‚þÁÒÃêæçæçæòñÝ{÷o€‡„‰‹Ô VÅ‚ÿ¾Æ½À»Ľ½Ýóó£zyñÿÿÙmcÿHƒ ÿÀËÃÆÉÀÌÃÄÞ€õN݃ÿ®G„ÿÂÏÆÊÍÃÐÆÉÞ÷÷Dz…ÿk„ÿ¿Å¿ÁýƿÃËøøeE­ÎÎ×Å£lDƒÿÅÖÌÐÓÈØÌÐÖúw jÕέ“¤¹ä&H‚ÿÁÇÁÞÇÀÁä® cûûíA„¡{,&‚ÿÄÑÈÌÏÅÒÈÊè=&ãýÌ57Œ15>‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒóëÛ¶¸¸·¹¸µÓéâÖ͘‹óåÊ·¾Â´Å·¾ÃãÛÕº¼ÁŠñ³²±³µ®·°´±¯´©˜¶÷À‰ð³Å»¾Á¶Ä¸¿À´Á®¥´ÿ÷Àˆõ˺·»¾´À¶¼¶ÈŬ·ÿÿøÀ‡øóݳ·º²½´¶ÑõñîÞ¸ˆux—†ùîêÝÝܸȹÞèìèåÛÅ®Ÿ~‰‚T…úñò€ô»¶Á÷õ¸´´«£¢›¤ }…ûÝÚÛÛڹ͹ÜܶͽÅÀ·Ä¶È¿ž†ø¸Âº¼À·Äº¾À¶ÀÇÅÃÿ³ÁÀ¢†úºÄ½¾Â·Äº¿À±Úùöö÷ð¸ÃÁ¥†ú¾Î½àÞßÝÜÚÙÆ1ÀóóôñàÜ鮆ý»¾Ëþúûùø^xž€õøøÿ½2‚þÁÒÃêæçæçæòñÝ{÷o€‡„‰‹Ô VÅ‚ÿ¾Æ½À»Ľ½Ýóó£zyñÿÿÙmcÿHƒ ÿÀËÃÆÉÀÌÃÄÞ€õN݃ÿ®G„ÿÂÏÆÊÍÃÐÆÉÞ÷÷Dz…ÿk„ÿ¿Å¿ÁýƿÃËøøeE­ÎÎ×Å£lDƒÿÅÖÌÐÓÈØÌÐÖúw jÕέ“¤¹ä&H‚ÿÁÇÁÞÇÀÁä® cûûíA„¡{,&‚ÿÄÑÈÌÏÅÒÈÊè=&ãýÌ57Œ15>‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿûÞItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32jGˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿv   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿí8   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ•   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08Zý jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ Zÿ“ÏÁƒ2G÷Ë­ãbß²¾x¤0¾È±²èÅÂ/¹\c··U –*žt+¯ ¯ö¢…„¡$({w¥ Ö¢Ÿ ý«=ùq¼ÿ9f΀€ÏÁ } ºEì&ßÞË´gÎO$~¼XôÖ}Ó{ÀÜžÒ þJZcOLú{’‡šÐüy÷A/0ˆêÍìZøv$à¸K&Ýd ¡ÇàÔ~g€€Ë» ƒ’p•@<‡­pH?Kã )W6bÑù0ëÀØ.Yì¼ðÙR%m;H÷÷P‡B“ØUz–äð†O<š3F:¬`AÓuv=mC¬•ß#ôx'ûé`g4Lê@“Î]ÞaqÆŠ^…í0n'Ý> §Æ,Xa§ÇðvµEþ8ƒñþ†È³S8æT¼J ¾ꎚ.ÚûB¡à&–¢\±†OŒµãÊF»lrHû᱊ ƒ€€ÇàS<~d@€ËÉ@í;&å5ÅðÜÝÕ ©Æ©È­¢¸‰á)Fá| –¦W(– )Ô…R;<ä»Í÷þ(R:θ3I"tÿq‘‡ö·Ïþp¹3 7 †;<‚GBn2,XýÌL–gs6[6wœ›òÐBÎîsîû|ÿDRZŠÏÎÕÂÎÎÌ©7[K”é4 P,J}è2³2 H“ÖÉÕÍ(p7ˆó˦y =…wfVñïqRÖ3.( žcŒg"áâ<êÅQÆ7@ñæì!S»ˆÿQ§ßú¾¶ÿµ°ÞÙÕŒéàüplrm×h2øWøÖfƒQs{>h’ éUÑñþjºÕ¸¹‚¢ðõœÑ±àË!Å®(´ÜMÆ…ömX0÷]oàÉÊNumi ï¨|'y]x"c0£Ò3¤%/xúó3ÃÊÊÚy+¯tsfŒ2YtJ©Œ]Êf"c³nY‡œ´ç,Äd5,%%òÃ?ÚPü씕J²¶ -SÒ6ZÉd³R6‡;¤_­ÿUôÌ!ñ¶ÁÜÀ¶Ö¹²±‚Dº(ËìÄ€¢\-õolx¡ø/à;ÿk¼ç¾ “´díöÆãóëå QDD*¬žÈwY=±RàJÓ(|`µ> “¶$ŸâªfÔ}èEN¼0$,œU éß â1°mpÓ«¹ð¥[rñI|Ž(ÙwXI­1ÅÚ˜Ó)—KïjÈš QcI8…°Wv“®_Ô­ïÄ›2©KŸ¿Hì¥dƒyиS›]š¢t NÀñc̆ÐpG®«àš*ènîm ‹j1ãÛ)E"×Å÷åhT²%ÒW 3¶ê@}Õhx!ª{¡#†Ôe‘Y:‚nÝlD™û,°ˆ½Ö‘iH¸×?“†f•Pgn³m»|Æ èög“ʸv6+‰õ÷«W#§ë¯¹‹äc<Ô TòvSêSi£­©Eâsª˜2W€=R€€ÏÍ~?~ `­>Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒš3ž³Ži# ! œŽÔ§é–Ååó†""c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½8I1!dsäðTÛÏ„œÞy8€|4Ѱµò†rÇ4p•\E÷ÿFBÑA”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqp±ÑKöæ“J”ú tàâ±¼5R :¹Ø…Únî#ŒÏϧ¹ùõŸIฮw¿Ò’ –3éâÜ׋xÉ#‚kBùµ_Ùv.C’Z§Âdx!š^Ž)Aíüc‘éÇýÍºŠ ªÿqòMVœ}’åp¸¦T3*«ò8miC@ƒf|€ù¤µ„ÝÑ•I)€LBþ”«Ëô†ólÏ$YÅà1›¾éuÌÄßdC]‡lg+ïõ}?4@¹¿i„‹T ËM¹‚Sf’IMó%ú4Œ× gEãA™'¶ìu¡Vz“ÖKCZb늈/Q 93…€ç?õ¼–¡ð&ÒÏ ÇUE¬Ä'°˜§Ôð΅npJ|ƒNä `|¨¹¥®®MôÉw7>(zXöuÓ¢E–>÷Á”ØEí±½xÐÃ&zuûƒ¢Èý\ËËêtx‹F„QsünˆêNZ(I]á½¼ T£ø¿Z5ÊægÿAuÿo«"EäóK)ZFÿbÓò®2h.öp Zÿ j¬$ äx –‰©eâÆúKyëÉh4pãàð[˜$üÒ,K†_³JüGKcq<M²ï——äè$iÙ÷‹&ËÅ,úÛZbî*"I½<«˜Ÿï aí¯ÀǦ&Îå] aF\æns·•1‘wZykEsÖE²›±íá’_l]ë£3Ö¿– +êX€2À2$±d¨¶‹,0BjZm#À?R‘‡—R¸î0PçXäÎTÄrO…$œ‚—çJ}…²¿}+;ã'wÀ|¡¿ÃF¨¬IG”þGßbS¥:Ð7ÞØ®™p%êµIT;ð'ÛçÚB\ÖÅ™ Z3¼i|"¦î™ÂïTéì0y{Û·ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÒF!:…¡†oæ}ËH—/®ì4AR³¾Sø;Tbˆª•>pÈ$½B±ì%Zî­XP÷Ér¤}2fƒ+ù[–2D8pÐá[ôHë™é`/(ˆ v[ï\›Â z–ÁÛK Ô‚ÄØ מ8îm!6uUaîÿE 3† ïÀ/$ áûŸÛðøŽà¨nn_hQRŽ¦Ã´ýÞtJ.ÉÕ<`K÷ˆ|ÓGv‘’ Ûúâï]Ó±i$¤Ä<ÂpÌ+o@¾žq•ß9ý_šU2?¯µzó²òh¾‡ ˜©¯Æß˜6(„t^ˆ=~‰Ç¶]àÑŸÚeA@ŒŽ6c`“¥+dµbsJлÿ<äUú»ÊXš·iĨéW¸bbYšVe*šQÔVûþWT2¬…h³G8ݶ›HvÑUß&#¢åI†¹êTlç©Ú˜ùiVbýä¶ž8Ü C'Ýü»¸øÑ—À=Ç4mXŒ¼,9éU…¿”A¶Q ‚ Ê:*f|(Ñ[ÆÿQìáï Gškc°‹6íFJòê¢JýQ)UOó©ZÑœÍJTÑ$ñ-Jé j¡¡ñ¾Ñƒ ºÿi—Õ‡N—Š.Aœ05:WþÔhN&4ˆE/k¬>/Qü‘Qœ IÞJçÊå›Ê@¡leu>P·¾ „qÃEzãß Ÿ|sdÅÒHúB|7‘6RÑM°­nÜŠŒàf¡ K®!¶tølŸ•èçHÿ…ѸÄ÷µk‡U ^KÅ'峅κTu2†Ðýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõ´õþ§ ÷¦öªç¹¬Ëf0—‡BQóÎüa; Ø ‰ Üò‚4YŒóÏûé“!¬ñVQª)%Á¿ïç î.?¢{dyp㸹I²Ý%F CâL½:DA¬äòQ$:MÏB÷ÿ>KW°YXsæÐëÊ}–`ò£<øñq##¨Ðý‹óœb›‹ü2i¶Ð’N^vRü ¿›Éûˆ=È\[[êÌ(’Òž3îv/Ï(~Ï=…Í>•Ê üá0ßè<Õļ莯ëÍX\÷†Š™pM.Î]ÎÚÜT%H?¢´]çìMö¨½SÞ$òV9ܼeÂ(öcX,·PzȬ›Zh‰M×(ÿUƒÿ”ó^Ÿ~å=C[²>…‰}죟 x|mÙïý!J´\—à0¼(,çšE®™ ]ïmÔ ±u¤61„ÆyÒ›„°–yVØEzÚðxXX°™mŽï§.TGèŒÿ pnˆæ®·­Høïœ@r7¼fƒºv©pqÿ–ázÑN”ÿ(‘«Âr$Ú­ßîì ŒÍݲÉTžCûê­¾V[ëïïJ/ˆ”`ø¨šÔ"ý©GOP©Ôªèƒ /¬5IƒFx?Ëešên‹H0ÌšÓÜë ²“áöË™5ÌwM6ÜNÿ†à$ÑÉ7½¨ø¸º[ÆëlÇ”øïÈÿ6€€Çá^Oδ‡áE€%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éNÁáËÌ?lN"çâé²6‡›1¬tÖB³Z¨%oyPÖÇpÉTpô<ö=$q©5c‘턱+¢dµWþÕ",“Y\ðD4Î×ÑÄTó!»€ ¾*,#0Å’ ?–8‹_¿ù(þ4‡`,ĺWÓXaÏ`äN³7 î@5[¥ðïGüŸV—‹·ö°£$7ÿ7ÆÊ¹ºw-âÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R 0ÍpõÖóÁБЀ©O#¡ l¡·¾ù' {N~-?Kêþ{®òÿz€ù±"ØjÀŸN"ÁÞW’Hû £#æ2ö1®Ûë§Ui Ësþ?/á0/dOˆÿu¨‹Qú'í@Ši"MÕ]‡ýÜ—å• Ü É$ý¶Èi w`´oægM‚‰^7Âß绩RÏ’ÝÞŒeõGr|’Ã-|§À¿ìƘú,ä¤YÕ ªÊÖT"ªðôX£8æcbÓ.[>²¦ÒìG,1“zd,ÉÊQŽš§C}ñkí@‘ à a¹Öó¢/„ROÅÕo¨ªëÒÙ(>ì,[’ ’®Üð;z+ÏÏÛ†~~Ùsóõêô¶ñkˆ¦€Â_yG»%nÑ‘Gÿ_lßc©‡@)+P'èÿ|(9¢oÓK­;„ŸÈ°ÖdÇß«‘¨hœ2©üp £‡ø@žðÐÓ~f†aß•UmrB86Ôe/kr6MÔ S8´WF6І „÷ü Á9æ©‚·Úê iƒ×?;†ë9¹ÿ|U#5[Z½ýokªXq"ÓH-Xùêo_§ç^Îp¨˜ÏGMDoÙ¿¬{Ÿí¼bA/a!/o‰_=¤~„µy©9”/Ÿ†…½ÅÏß±˜& {#|ý0á1;|z 6‰8¸Vˆ6ýš•Áû\’Æ­$óºù8+_»…@ºÌÄy¦…] £Ÿw¤qáó/YùòÎ[ i{E·A{mƵ®/ÆK9’üøY²Ä©Ù¹¬ñéõ LÒ„¯»Â˜‚RcÓr#ÃwW@â0NöiÅz`“PŠ‚d\úù¤!•Tþ òÜ5ØÎo«¿õ8|Ò?ŠƒŽkûžyÊjX¡$„€´Üý¹ç3c‘ÉsUA¢¬EvãÃÍ4FAþäMÔAN½b×´lSÂÞêѹN*[è:ho÷5ŒÕ}DaÓ Ú&!/ëÍwYÀzOe©B9Ö!2ˆæxòܪ^ÚŒ?òÊN­˜GQÁd -ñ¬üõú´KÅêNLBQfãulO§b›\1?­W‹ <¸H2”ºwy½q†¬˜X—×kË(;¥Æ¿êÜ}sÄ„dá-<ý²ú¢%)ýöwc!ÛÃh¤3ýØo,ùò(Ä|Õ’‹:íºa(ôÜk¸LbZ@HXð×ÉOês¬ŠÎÓP_ mÈs[´‹ÒTà>¯vï%O»7•ùâ%¿bl O9F¸vLnI™y”8#æÉÒ†ÒûwÿT‘ ;Ýg¶Tî 醔C|VPlo.¡±ždæÐI©ðTe¾JAµ"ok;³¶á N {¥k \†dÍÒ®? F%íŽ@9çˆ]ì7äfî Ê$‹×ê–U’‚ž™Ûôã9)ÖX déÜg;Û¹D6Áä5;6ݧò6ᩤ``÷ç@èË‘#Ò®8ëŸÂs"3›Óýb’‘=\NOà ìü>$]CijY¤†~:¯ÂájǼÒzÑÈàpB»/˜¬ º ½š»Mb³Åö•ÿ8üãmÚ÷‹fÌ5·fèîZ5¥‹#€"`²D%Ç \Ÿ‹ç@±¬~¨8{¯5zîDÆ´Îi¦û}ã9—¡F\]£%œri7¯°î ‡n;œHê“/Ö°ˆ½<ÊÃyŒ®D^Ë pú$ºt4Õ³ÜteÀyQý§Î±«—}ktMK‚½hê‡ðmhÌÈühÂZßOÞ–å¢qHVÚTÒ›VEˆ0¬„'MK<ù”Hw€zr"$Ù¶é¦Ï¢šÆÅTö¹~3ÆÿJøî·áÖ ²83X6¾&öhœ×˜¨X릕#\›Ó ßzìõ¸ ˆµ ã“aCCÜ>= XÕ µDuqêð4-ÚoêOî9ót./ÅgùC™(·ŠîÁfŽ# oÆPapÙJ|:ú1±Ù =„x”s=í²- kÚȾò—?7I¬#Û„ÍÔeÛ9Ûa Úퟡ™ŒE«Ê'ÒçÚ%>eG^€(Ü»02cmËLî^³PÉ !œ÷Ü–½&z$MuÊ&#DûºÆÂH[©AÛÃÝú_RVr¢´e k#×lÆ”¶ŠGާ ÊÙ¸q<§Á­ð GÄ+3ì Ñæ»}Y©!ï˜DK—94-ÁïàÐh ‚^%gu¿ùó£õf- I¹‚Ø! ùoÐÅ«©øBÞ… Aâ¬yh]TÈ(b(^uÒ7lÆÚ½J¤¢j±#D±ˆfhs«oƒ£’ „8“zz+íUQ–"*™¹½8;Û-µVsÁ<õòXe«©‰V/~ `;"Dí3d9wU¨LY‰ ~ ïÑ{Þn X)b‘”µáÔB„ñ¡Šë°/Œã:/Äq·ÝrôÌ" áC Î{ÇÍWgILèC‚ ͆6_ÿ;¦ÉÞBè(µñÆM¦äBÂ~…Ãõkk“ÐŒQÁÔó¹¨Ý76Fì¨TÍM\—]äŸóbP:¶èãB@»:0!Æ×çt?  ¦#Êé/÷¬q‚®…1¾þ«‘–ê€÷d£ÂªVçRY‡hÅéÄÒö#Žüâ !Ï%d^’F4ÆúÙ=ðõÐ,ëµéÆ‘jÿW ò‹.Ç®ݳ1j$ž1R”ƒˆÍ›®©$'æäóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ™gmöZ†¥V¤Š?/Wrœ'h{Úˆ€¦ÓLæ.œ«(þÛ'Æ$kVŽ+3çú–ŽNPv¶Q¤)oÏ®²ÈEQœÁ2º‹Ækn^:ÌnŽÅ•1›#;nfzX{_†š‚ËÀdh¢qìü3ò?ðùج0Áó`°¿BV@SªÂ0Zq‰ó…|=$4?A§ÿx§ 6xc¹»?8Ž„Y ÄßÞXÂ2av ç)” ¯îœ—ˆ²AÚ-¥)>i|'UL=\J7¨;ÕЍR±¥Áyª­ÖqDu:¸„ ]©û‹ÏŸ8R•3C¼ÀÓ+H„Ǧ_·eÕÖ"jðl˜v-£l†g˜ ]k6eý“}Ý¿"Ç·#ä¬ÿ@Ð(ð|G9 ½’s‚m¿Ý*&äÉöïr ™0ƒ©É®^YeϼqØÃ!£*áWæ¼¹îU´€ þ2S#ª©Â˜Bðݦe¬·²UËÃ8z²Uߨs`D .‹Ç<—PÄŸ´Äã'(Å0àBs4ÐgY§î&Ô#&Ž#&ªñªhþÑ©,pÉýË)ª"N`8y‹™QW·U›-y¢®ñßó;‹qîÊLc¥Rô/NV*6…v¨ -·©«¹'½­ÁÞaiä[YéôSÒæwd•¤éVáôÇꢺŒ iP¾9‘ÈŸ»ÞÂ^cûË.z‘väÂ2Èg—@›4¤°È‰®>ê¬Ó[9+ØÑ8˜A\Vû)á}Aû¹ñ„xY 0q™Ê0Ð]»#R|Ò’Á"dú­UÕÐ_@ðM…X2¾ò¬YÞceNìÎÃТ  ªíçÌZu¿ä¨ÏãÌ;œ¼p/’ŽÐ¶§«vcžÔŦCéþ­ƒ±ZtjÌ[Œç«g̮խM±£æŒ©…sÓ—t 'ÂþLé<ö‘š!ÙzbŠ0ÉÛŠhÐè5û}ÒèEcð-jðGwYŒÔ®9K»ï ÔÔn«M‘ë3mÃBl‡6t½¿œÕâ­`úZ¼šfè%]å>ˆ’#y‘ôËgðøýYÓÀ†Øy¯xß3(ÆßºãrRéìÕ»ÞoòßíR%»¨j•:IºÛôÏnhº€æå^@9qRoçŒK%[µ*‹¥TÍŒJØ Ð7ò”»çÁš~OË( ¡ÁR¡ß Üù[ˆ~òà`ÉÂðÓs6ÀÚ"GЩ¸®tñA¼šM·LB­B˜Þ¼ VQ”è’Åá8 aVº{`bý'ˆÞ]XŠØÀÇåË¿ÕÓñ hÓcEˆ3§µzWÜd•›)p&?U”Í©s‘lTj¯Sn‘SÆÕ¹ÜO7´Eø÷–ñš‚î.ÖùÂÑ ÈÀîn™SŽs¦_Ï{N{© 3eIˆf¥¾Ë­ådBZÁÈxÛG…v3ñퟸ¸`Àõk?þ:'µßµ, Æ0΃½#X¼]w.› šóz´ðhµ·0¶&Žñ¤˜,‘ÒÂ0¼T¢‰õY§ê@ÃUS¶Ÿ—0eT”½óC¿¡ëÆ.uÌ/"¢þë®Ó>í°Ç­”h kËÚic[ýÛçvÏUiuâÄD溭 {\³Ñšý¹n5Í#z÷×¹ak…싱ƒ’…_ä‰ÒdÞå!YI'ºX¤H¢žZMùiJÉH7{§¢LØØ½ý1ó5c"Dˆ†Ùáj–·¾¯sdR€yŒ¨Ð2%^öÃu¤a”kè[O—;¸â!nü…¶À ™ÉdvçPÈü¸êßWQ¾x©(ì “:ïY0gi¸iàϺAÜ"¶A(gæÉa_òî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖ}PHP‘Ù’ÇÆ.ö¹ý9h°Ç¹Éa%UÅýûKÔ\'?óG&õp ÙçJBÒ:$Ó­€°,ÿ68 BÇ4KC¥`_m•*ª[MžjVÏ pÉ}j@ãIÁà óöŽŒ\e; ½ÞìõºØÝн$: -ýÎé.âÜ#¥vMsŸ¸BøP+Í@ÞEX`‹6g\SøÇ,ïÁ­ºzΉ^]PbßæýEN]ª¶myw÷¯ç} H?¥f"sþ©K1Ëâ„bËwÕÝõ“ÏÝ-½)„ ‹­©c`‚½m¾ßà^ß^kuï>v*‰‡ŠH«gØšÆûÚ+C­ ½êëVp‡ùŸ³ÊS5KAs¬“©+OVíTô||«Ñ®Î=[µ» äåï X‚ò×ÇW½FἚÏUGîp lþñ˜Â%cI( R=¥u“DõÒCÜãÕÇLnÛ]HÒ™¶j±ºËd>¤B6óxëLPL-vœÓˆ]`ð:é+§ˆÔÓS×;{¾º¨!Ûñãî…IŠwÀV­·µHR°[B°nŠ·J"ˆëýmàŒD“§œŒì’ÌÄ¢£P5ë˜é¢/XñBw ÖÁ¹>ÁV³î8ãv÷²ìClî—zá¢i´{Üßé aQ÷%±¥v^ü÷—Rj±3jù‰ÜóBÅÉÂòœƒÁ§Á-~'ÚÇîÁ=j¨y^í·bq©rÎD!ÕWÄdå¸éCS;¼3QSòƶž¬rç]ô¾‡­ªµ¡ân¡;ªIÍÕg좮ÒÇØpOÏÏM—{‡´½Œm a‰ž;+Døµ€æ´¿9BÅDážÎì«§€n°óåÖ¥Ÿ‰ó¦z‚C¡j|.ä´¯yauºµÏ?â™ Dés8Å"¤-8´¿5 ïŽüÎÑÜoNÄ`]z–¤£í¨ô¼Í¿"H”Ðwjbn:ÿc­¦Í'8(î¬ý+aËŠíáÏÀ~%å"7ý, œf9&‰XA˜¦Ô^uºÚ˜£°ÖfiSê x‹5ÅÌüÇLÿ g™D®„J¦;ðä—À½GºS£=ùÂÛ‰Tó¼ÌÖ YHÐ/h€ûž8ghTÅâㇳh„±à¤O™žeSÒÖ×í,Ç©¬.–åq:ØOã_¶Xx,û”KÀo³Ó,‰mÉ“€Sw_»8ÊŸõ:ëE†ÍÇy‡M1UÞÙ2„0ÅjÖHú¹¡S.EÑœ/MŠ] =!šÄ SŠäÒÿierÛ(F°€€Çá±qøj¼~¸õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wòÓ{S½ Ô>ž0¹5×ðVLMÝ| PüCuÙV®Xž¢Y [¯Ø‹íyíg‹²§`îÕÔ‹#öäÏÈøŒ°óAߌAóZ³E"MURçÌ3IŠbÉÙ–:Ç¿åøÛ$I_š´¢ž ¢ýÿð JrC ýWܨß]»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘[].ð­¢Sk@D¢}*¦®öøBÞ .i_ ð Ðúô^¼tÖ·c"¿ôÙ¤fŠ'í:z€Nž7@FØ\(ž<Ùµ·L$Þ’2]™;]û~køÜn¶M”­ö¼–£ýŽÁ¢rD¡LIPßïù]›L"-ÀºHÕ% t¸ ãœý5ˆ¯ÿs$ÅEÃ2v|QðÔ•}÷×þ“ó„w6Mirþ$AõÊtN­kU¥¥ñ¢ƒ’=tâG“}¦ßló;fð,«Øi!ùó~þu8*ç!Û–º«&[Á: ¬b“liyÐLòy虑1÷…3¸;&Ûm¶?¨à À %êÐ …”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ"š)ÑŒGY.”ã+ñœ%R°¦{íYÿÒÌáh‡OZ£ÕYÓtŸùçYoQ+ƒ¥§âRŸáÐ{E¸ÍÄ7ÔZúðú6ãˆï?ÿ)aZÎ'ÿkîŽZ¨ÆÑŽÖôd†ž}E• ªÙ»„x9.j`á ó Üdjï»ïW|3ÝG¶šŸ¯»ž·µZ¥ã §B\rTäú»T¾Þ¸¯·¾?áë——ÛÚ-ööc}½¾ÿ¯ö#çô‘}½:ÇÏêãøz°uqÒÆA%°Ey ijßXÓ„(ÐA©Â¯d)SfYœ-[|»ª¸;ì2º.s!”‘ £%eËfùëq2‹ý¥/_Ÿ$Ü7èRpïÉW3çà;Ÿà¡|ãmµ˜^=ðêØÛæ÷ÿ3[ú²w…®µùçuS^Û–¥úf”:i^•Û?:u)7\Êldìo{LFLs7Â3Œ×¹»4§ÔÄÓdnÕ¦º‡Ó2¶X̼€\㉮ü^¸1T¨¾ó·h=›PÍðZŸL†n˜>Ÿ1C›£míWˆ±tJî›üÕ«cq5§ŽŒYhÚâÍÊÙ¤äÎ)„#Ç¥Êd¼)ø¦×~€QèÔ{L>­ˆp½ËÄî:ðá¬ÑõÀ.ÍÙZ@Í’Qò…kÖýyZ‡ÙÖ×_+ ¹¸çF¤'¹7ç›×G¼Ùn©ÓËJâŠUX¼".ÉÌ;.4eÑx=žÆ0íã6{çкÃ28ÓäQì~ãØ@Fè­ÙåZ…Æ|åÂÿ`B÷ÃÆ¾p/4²ü“ö(rÎIODÏT {éÔ*À@[tÝ,£MQ´ß­•3"øq@“‹"݈ºÑgxŸÍÊØƒÕ‹²9n4¹^Mf¼>Eë3fjý 8Jl'rDÔB®™šyYc¡ÇFÒómží¡‚Eg«‰ˆvʦK»Wžt ªš°5ï&¬®ª da6ȵ !‰5µY1ï:÷«ˆÜгo¯~~v…ÂQ—ÇYFt‚~p[N mm3Šó„®1ÝÕ›³Es>ôu~Õ ÆýÍ@ƒ‰÷¦9׈˜·+€ÃÒß>|hcQ1M°Ö]§¾Xk*ÁúRÌ_­¨Ô13„èé`Š{°(KËÜ[yÅï{üÂ)3áóBðœrŽÜ0n´$õÚrþé/xžòØÖPu8Úµa£¢"ËÝ}©11Úˆí´yi•k‰ÀW£åm`Ñõëoð³ƒ?‰PtÛ"¿_+Ý„UOþìCaB~¾JÀõ2F4‡ l,R¯Ëî>Ÿè :e=Њ|‡;•X+?[>ÛÍ[è‰a^zy§8Ã8°ÈŸö»À¯ýê<"ÈU ÂJš^£T]Ëçû!U¹ÒÑÜ{„¸×*\;ññ«2ÿgõ}rîìÒ`lýÙ·B0rÖáýv:æùÏ6kª‘ ´®ëbfíd0§«¬0MgÙÉPØ$Ú@«(ÙB냕I×ç)‰mT`@»:›Ù ë&÷Š‚HÓÎ)³œ¢ï6²/xù½S/“Ì5"òù¢WÁPš+ýøÉvJ®~ûÕ?Eèw¥þ¢£µ\÷¦š8¦ê1oÝ5²Æ“ܼ€ÐK Y›}lGbÆü6c±Dþçâ¶ÂLõIRÀ»éèŽ%ßÀ$ަ·`ìè=-/¨ò„Ô]•ÛÜZŽ’"Gs¥p²1 BƒZ7è»5‰L^2ÔÞ³|HiC9wODÀ´´0‚;”6áYu…#lÖ7÷_qøÇ)–¯{à ­|ZÆáž1ˆ!Éa§´‡=Ž6Rj´[Ò“„—u°r‘Ž’«.ÔJrå¬IºÜ,Ùnw¿Šš„ÈùŒ™UȦån$åN1Tiéü-x Îw–Ù¿¤Z–}Õ ø½ŒžJÞ@†‡¶µ¥5‹É·•ôÉ.ÞUIs‰i*K™÷IÑ€1'aoHßÖÃß8HƒG´úQL·Â|ÄìÃZH€¨üPÛfÜ6~¹`ΔŒe>ÜúŽ>Íu`ˆäMxWoVŠ—Çp-æ’àö&@fӠذ{ð,ëç/ë@2»]‰B1hK³>|ëˆÀç¬V‘‚’w…>UÝ•âA(AfsW>Ê©ÔÇ^ÑQÂüý„;+ ÷ D¼j¹~TÛºB-}â¹±’îâ'€xÔŽfà½/¶Õ9`àµþ•Jf‘]ï\M€WÁä—Æí§ÈSRä×Sôà2pyÏ\ÝsåOR„Åi·éš"Z¡Å^¥ë¢ú}½‘TV ¿@Â>e>5ì“xÞø3ÈX^pÒ»Ø}*¼»†í™¾ÚK¯|³ûþ¾þð„ÿ h€¯ 3<ìâ7jÃóþùrÙ¨=ÙfãG2ÒÆ)Ø÷ß6Œ½šοé ?­å#T²ܬÙÃ_7ˆw2…š+%!ûâŠ_˜?Þ°{éy` ¦¹1”HÇc*ˆ?^½“?ßµ´œÜ†œb“e ÉN[„Žˆ‹Ì€.µas-[âLD «ÈžBV£þbWdÐó%WSZÅÊÍŒyëë9ªikê)±ÖÇNgkTð·;ä0…'%r.‘ åÀ5‰£ñVлmŸ*ox²T]*Ž ¦r.í4I"{ÒìoÐÝ%†>`šè»1€ñYH­£E”¦·ÒÈ{uv¡WLO…÷‹øXyÊsù…ÞCuò“ÿXÚf‰1–wã¢ð}3Êä+KöYlbŽ$ q‚ŠæHÓõãöâbŸ~=’ èÓ‚¹9¡€9w­×x!ň5jÞŸ3Ìüdyo¦ü d1´ˆï­™ßÙfRW%ƒìM#ässƒ.[ß°†IË)ßI_WEÇ ËhôL¯½…|jXp7ë€ÈÂ{¬–·?òv+"wôñ”@·$íùIJTZŽç^=N’hë^vÇ,ù*ȼàx’³3èÉ´ZâÑ!œ„è^ˆïÍæ„Æ3éCm2;mœ\Ý_O[^²4'Hždi…¤`%¶YP€íAñ‰O¿T—áƒ\ 4lñüTKŶ¦§&uˆ¸2´±-³]PZôBåÝú~TwŽº`Æ=8ùóçÑm ÊCfÐZKÁý4Ûf”h¿XêpŽq<ÄŽ½U‹^2;–Ð0‘„”Ý– iàÅ+?n_éÑr.%r¥ù„Ó ‹Á»Š€iSCç¤MmAù¢{&Ð1¬=9@ž‰ª2U:,Y‹ÆÜ+=­÷#²Dh€Yů‘æ“Ê8Ý<†ðøV:2°1ac LrÈâ÷<ã%—o¶Y¶qöPO¬×Õµxò¶¸ÌˆZ9Ò3΂žk‡²v[JT£B( ŸÄˆÒ =†t|‹Ý S*¹áò’ú1@ô‚.BsìXôi ,MBÍêâåè4Em-®õMI¦P§àËr3ïo?üJô`€ÿ1¾i¦‘y>ꉂšM<Ä.é>ëRÖš™f­±œáeêÛ²_ÌëÞ°O÷Ÿ'EÊ}Ûc$KÖF/¶kèQòޱŽáþ4¤=åTŸ¥ßÖb؇d¤‚¾bRt9«ã2òË4vXö:³±GJü<‘—¢Á•F SþÎi»[çÈhVvÜB :wÇmo¾‘–ÇãÔ€«úXl© ïûn'sX\¾UwtIÉH`IT#_P]u¥ b}w3OVŠ2“èº|ø˜ŒPñ¼Í6}°ìyù¼²ûÖ¸8ÐÅÂci?NÁyËQD€8T¯Î…k]YÝ‘•5ßhv+±U¡èîÕÖ1ÓPë¼@uð@ÅT§gA†`œf{am³× —!Å6ï¡“ûº!²\ÖØŒÏ‘³¶mì0¥—ÇR¥ðñg­û¤×‹ÏkòE ËаɛBÈ H ò# ¾A±6BþôŽôÖTXšÖ_¾®iîPJ©d¿Žß³Þj5xŽ{·ZÃèWÊ®®þóß vFi’ªô(g#¨ñú[‡wc¿þ­ž`»~ÎP':(ÝXVØÏ"Ç©‹…`Q€2ìž‘P.‚;úPç~*Ýøù1¯fsûãÀTxÙÊ›ÇfE ¶…’ËW©1s<+½R ¸zï‰È #Ÿ{DEÝ¡ûŸgK‰µ‡\1×ò¯ðo/âïW¿T)N§òW%U>+äæAPHÕ-y¬¶bOûJ‘Ì_t“EmÓY‚†1åAfxF1¿)ë÷cV^û&“hKHø>& ÑCÕñq[ýÂ{%*ò6cy…1SPßnp÷;šÜÈ4„]ôÚy¤ŠðùZ~ò1+ç]?Ö,<7II¥¯‰›ßŽ÷Q®¢`K+tU:ü½UÒמžÿ‰V£r–¿(³×™‡çÊvýh, Œ ‰hêV;…³2p%O­–A‘ÞÐÈ«P\Sœ3n©üÉm_s“gB˾ºá6Òéä™:Ï1ÆÃÔVm /SÃf^0åOºRÍãSò,‡púŒ¯ÿj¸a³~ä‘âÌp÷«Î` jÆZ¥†ß/Òb KÞ êÐpÒEÆîF2¬|À˜Ýœ©Ë9D7:¤Z#«Œ Ë6¹“kXà\û·= dì­ˆ4 xB„€Ó€î k¼±FÙ¥†’ß»>^ÎÀº}ÿV^8®_½~Z÷Òth¨o¦H¢‘p“yC½)ü(»]X˜O˜ìKBßP Õ}=÷Ë«4+Tž‹”)ÞœwqJ‘¿ã‘ÅÓ”MÄL‚b”Ô½nùßâwÁZ¨ÚìÓG@6³p<UH@‚ÃmAÛ1."§tB£èïȸ^^Ä]ÞÙ6¡©àÄ~f¾ÍÂ5šbÿG/{9a­Ž_ÀKò7¡ŽÇIÕ…zb³£’Kl 0<©’ýZ¦µtP_Ç…_r‹°ü~Ëœkd^öà8Î'J…÷Xñjƒ£4ÛB® P%mùÃm÷dÿ{™ ë?^wÀu”ÍúÐö×ëÓ¡ÈèŠA•ì*x•ÛSÉÆ{K#/Úè=ÿ$xŸü [é7µˆ œ©å9¿HL1• !O”ÝAÚM´Emô¡G‘Q4D¹Øè/Eï¾¶MªmÔ¹ A»¸J_™RO/44¼‡KÏN£CžhA.]gL½°ag¬Ù`â³²³‘zUqêæŽ˜o›âˆþÆÓOFPÚ£6åÕÖôT&‡Ë:YªõcºŽb“„qvùúz+üø®Ó±(5îB€1 FVÝ2^®Æ¢ËÏ(õܹîyåµq‡7Åòp: Ã¥fµ~bc†]¯ó‰^ÂÜä„ ˆÿ=‘Ñ+-Ì\^±›D%R\ Znük» &byì1£Ÿý”R×gmb(”˜,Fõ´TàbÒ𹿱Ý™éö%p™&™³h ûJÓ"ÿMID†*ãõ’X%÷'ÐÀom3d‚"›7ùO,0”—þ)XãÄf•n892Ô=R€Cô´SÞo`¨%èúOƒ´r¸lAþà X‰HuLà]/‰[Ž•¹[o*bÙd<ÎG"®üÃrÝŒ+δ4•,D*¿¬\ðH‰ÁÆ#S¦•û¦úv¦²ìUÇEo=íƽ Ôz§ÃŽ Ò¨\”·¢1\àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=ž!ib†Îã,ªÔ¾£¬Žö.ý¼““V0›ÄÓÏVÃ+É—ÐE d…l\ËPÜÿc*ª)fg²ÒrÁ-u#Þ½6¨ °ySùÀ]ȹ5–šRZ†$È©æóVçCVv"¦1„ç/Ûó”[ô¸‹ýãûbÓÒwÿ>iàåòœ1ìÙwbBºwqÍ_µasôi‡>èG™*¶‹oÓÖNduÖ鼋D¦aVÜ›—NÏeÂ*)¸È8±ºî)S„II¹Ô{uG±ã ‹hm)§sÛå#¢BcÍ‚¾—àú‘CÁÖþEïíîåæ_ ¼Nò™bÀ5hÿ'ÒDÈád h+)ôŽD0É·˜êæ0IŒ«ÎUZ}Áå58<$Õg°ˆÞ©&¸Šk­@ýUç5 ‚‰{àˆŸ¯š”aîPò5_½¥âÂg{h WŒvâëGJÌg"óÊrJèež"aq¾> Ã5çåº ¡ÞÂlQxXî_o‹¬z(y“oEyCÍ;PbÿÉVtž•>‡v9' Z1øâXRG\2¼/•‘̆ýâ‡pó'÷ßi(î÷ÄX"nmOHËz€ÖC€+bO©h,ÀG‹Ô#ª˜UvÝ'©ƒ/‘k†œsÇê‡ðÖšûI9ýoôKe¾úa“5…67Ð ¿;ƒNÐeæ÷PĈ#îÑ{FÜ„î‚.{¹3p”!$ÞÑÆ Ç v@#ƒ‹·f¥R%*o#àÿ2%÷14 ÃUꤒìå#†š{`|GÂ>Êæ»•AꎶõÅ'ß22ÞGÕ¡“E,È~©ˆ¸pÓzöŠ+ÎSÅåMѨãWÔVÉF)–ÿ‘°ÖÎø}w§5jvãÃ2+†ûWŽk]\½VüO¹;O?µeFÕÖªÉt]r×ýÐoýÏ׺T3V¦“¢Ñ` ‰Eç?œ Q—¯غôcÅÎ ÷7tÊt;çeÛ}ø2ßbÀ;E»3ßdo$Ú‘;Ï׽מµL‰›¯¹˜Å<óŒ Úë´|ï1”cÍ7‘ ý³Ûþ?mç<ø&h†Y]ž»Ep¸”UìnÂùIýˆàe‚vküÍÔ¤_½¡Þu0^ƒæÌi©ÌÃE™§ŽG)k”ÂÅÅx4QEÞ9AÔ]Ü^‹š&ÙŸbãÛ3k¾Ò³Ó¢.±=,,­j²Þÿ+ÛTÛÖA1»†ï³¡ÏDþjFàvAÀPïMî~dõ~)tÞm‰ºJ({‰ 2ü„Á{#¾5ñ”31r‡J%xnÊ«’¾~x_Æ¢dW¦’Ô‘.‡Ô°Ê>•`q¥bûÀìþžøé•ƒ¿–íoQ+ì:áú±“£Tq]2À~"‰ó%,ƒSMˆÑ”þHXApsjA:Z9Ò‹æÚ7ç:AŽg¸‚”:e €}k¤Qß Ùl‡€ž)âÜmÂï©Ë¾ r4¾|2Ô^…fîiƒàà^ˆ+o£‹×¼DžÍ\É`ðé§§Ý(¥ìµXÿ €ÁfÙfÃgÕ1XRmó¶Å%³œYÀÙ†Ç.S"9',¾Í–Ð z´¸87áÖ¾²–’ÕàðÉwÅ|pi~`7$ªY¾©¡ŽÔ1™ˆíÏ>&~„Ã>øóçNWÚJ†/^¥lªbô`Ú7»/èç¬û—5„l{à!_Žhø”RŽ´ßø¦,¦r|x<&g’ 0õ% ¬"Òm¹0ð+r¯µš 6µ‹>ð~ÎŒWBJtCua)æ`Õ?šý>eƒ`Îï>ÿWáIÞ$;OvŸW©q7Ü–ŸëéÐ0¢Q"iËÉB€¾~DR–v›èÓlÌM‚ó´ákQÖérÜO ·‘T¼#_´TiÚSpi=ô˜ê aZ±¢)r°YÐÇBx>"œ½¤`Õ\¾ø•ü˼â‘*Ýrö³;–V’F#ƒeÊïü¿òˆŸ=«'‡GídíHV0ÖdCÒv_ÿ{ ŠrW}Ëñn¯7 7›i”¦(\|/49³é0BúV#þ¨ôÑ×uµd(e;¶XþÞÂ%nýÁZŠ2ÕðpHžÿGïç”à÷Ì(ÆA¤’‹# ç¢ …ª™Y\BãŠÔ‘|Ç+¢ZA;‡û"¸B3#2|Ù‚îƒD§PFÝÂF z'œø"ªCŠÚÄz{V’ùØpE‚û™ÑHï½,œÛµW7lSC\_!¹fFÄG¦¨lQºO&Û7È6›¨êñD]E–ᄤµåq$ ö˾]ÙûÂ7 ¬?~vöQjô¾oŒ"K£ü'Ħ=¹!{ò¿®¾>Xòq´­™ Bí,Böh6Š`d09¶±·¼FµsälFDZu4‰Ö„6YD“,ð¼ø!X’/®:e:Û;H ŒŒPtŸ8U»$i’õ4—û«ÓÀL»ÿz{ŸÜ©ûw$ÃÏpOû©•ÓÓ\¬š¦µNB‰§Ò²K‚ÿAÙˆG ‹.k‘nÕ´ZaèÐM݈Ñ]Ä ÞkÇ¡¤±¿5þqíõkCYz©ÿ)HȇÛÎŒiÔ7£h3ÔH@«$f5ãÊðD²ÿjUÍõÃìÃ’zn Œd–m„zjù¹÷Ë“³€Õª.²þ%=9~jOÂ'k³qP5˜^ÊS¨’ðIBªÙ‚ŽPUúfƒ$߆UK¢úÕŒ¥ sá~8FZ>î;¥-Ìd®ðÀ½¤Æïš9·¼Ÿíz/™ãJÊÆVO­Y†¿¹!yŒõÊ4?6î½t.±Z¤Ò_& /ð©ø†:‘°ÙЀ¹ø˜b‚<"H½E[ì_’bûÚ1l·]šÈ=Í皯¢>‰š"M‘X˜+Æ®:Fö©˜ÛÜ-›U>͉B—0Á žfü‘úÐoM{žQ Ê@,­û oPá¬É…~¬ÄæÔÃ'æC4Ïò«55 šr¹ÒÀø Ž0éý±6:­;¤Z牟IØ©vNÆ›y§9ô2À{˱^Íãÿ")÷ ËCŸƒÍŸfqžE „W‘pþѫߥF„>+k£vÎÁ׊ Ž ·Ú×¾PiÆ;ÞØ)` (ȪòÊ4p»Ú¸C^ܨJÁJÅ ¡áð€Ô»O·lTu刿V½…ÆRÞ2Q~,]Òw»T£Î* ŸpáÆ_¼]ìUj†÷…K ÑçS®öD¾8ÌѵB‰ea0vÀ”€Ýß<±qŠöæGȃ$ %UqƉ^ˆÚç”@yíLoS¦bªŽr>‹WOŽ/ê Ó­pu•uÈHbèr˜Šn]:XÍúê³à¿×§à…L 0jôæšl¨ À%l„Ÿq Wè²}0Vq‹H¿{ð“?à˜°f–`rÅRaÙÿ+­åæú@k€R(q"ak#zᔆd¼<}ž ã<þ^v›–3µéÖ*)ºÜßúUW³DOÁˆÆg¡äkwTJ,OŒ¾Ð«øm°;™°qÎ M¹{úð–^ ö18¯t Žo>Š…š“ôùµ@}Ï]1øO6e»/Úƒ[ô¾H›hS5;å•„¼%Oiý–{¬ÒŸ'¾l3šPç({Þ8 wKdmޔר[7ò{6R>xÿ)ÆŸG³;ž*dª óo’ÊþßPçmÚ2ò@Ž×ŠèDÃòQ;oÊ¿ñÊåØ%T`Ö¶z®*•Czìæ‘N\Ž ”Ùð kP‰rôÔl{µ»ñD4º){Ÿ rAPáI/øº/Í!Mab±Ý$™{šõÚU¸ô§¦ºÔ—D CnIêÈf¿4Ð_ê‘bK„m‡*Í«É)+{wÔô#×X‰”†-&bÝLö¥“³9P“šJÉ"jÓ˜ö¶&sî!ñ­›.¯AMØ-_;z„ê¾%w™Is…ç²ÿM@EOµÖAœåwVêO7œtŸð£Q¾œþ^èŸSïĹdœ –ñ+Wyª}ÞÅoc©æ¬àÙ\?õÙCˆ¡¦¿¤}°Ú4 xÖñº ÔÜóRv*±Qyt·Aê ¥–[KZ¦`~`Aæþصì$ Q-Ä7ÈU÷…­Ø£“¤Wu Ý¡¾Ÿ””Äð»Â´$ù® Q™?k»yy:=ôËòÿXv^ÈŠ›²‚¢-3€¾Ôã´WF{ƒûÙ_Ý&–EZi›%TR£Ô{u¶üòy q°8‡†htö²÷u¬sA]ãÞ:…Žw c±å·3,±ágóCJðæÌD##&)»™´ªÜñZAÈxò¨5sÀ,݃ùć§Ì #ü‚mó‚^<˜jÃL~knû[×§ù­¹ï m¸(ámW‹)Ät”…óëø‰I‚EÕ¥®dèp°djá²qà®”û ^¬ Ô¦èÛn‚‹"¯,5äã×9ð»!¯Çü»[rÊ´lLóx©þ±rýßÏWV5~º¢ê‰ í IW†u¾œ®ë3éHCõRŽ„ø`z€gL8+Ì7J —$5ìE"y“ŠÊßäìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#\®Æ?EÏV”×R3’ÅFÄ¥t–´g¢[µ’E¤;=Ìà…v¬AXæËºT{úlþìZpúTiÎåÜú´·rïnF­Ö_Õ`biâŽzÖÏà | XïxÒ`½ŒgDJûû*†v‚ӿ˘xõi'¥í—²”æGe¶5÷.mÚ|¦'ÿAÇÜåq ÞÎOUGÒT…ˆ¨skÚûÜŒóN*‚o–ÁhPm®¼›f˜¤:ÿ4g ]ïœá˜ù›q¡º7°QñG±í÷6]Z£ê$+]ˆèf?è»Z/é·ø Ò_- CKàL6éÅVJW’Ÿòp½68«yeFàJoØò,½ÖRСoÅRfYÀYˆQï£F¬ÿ{ Èçsü`qGîøUŒm°QÉNגɉ \h«>ÆŒ¡@±è¶ƒè]Y$T䋨G(wbsM’§U‚œpEz®Ñ ã¶,(¾† RÆòÔÆöEt®ãZ…§ÿ5H¬*v”ØeäØB8¹v>ƒ,QµðËØ;”§?|’dkoÔ³'ë  hÚgªöýDJ~­Ç_Pp ¦ô‘¸*%6Â{SûàgЭÙ-iÉs÷X¯#e5][~*²t¢KG¨¤qjû"‘ã· b,ûÄþ»Ð¯Ó/¤F ZY´9ͳá&ºµ6G •w­´•ˆá˜<¦^×AÙW×NsLmŸŒÈ-YþaÕðûÝ9ewÜ·%«¢Ó4>~^N×=ÒYTŠw-ƺÈî'ÆxÄ? >xªžwªéì‰<°‘Y䃽wÓ]ºvåãqÒ®_úR:ç~Ôî9{ò6ZÙö¶j–Ì!Å=óe‡>­ÊŒ\߆æºj¸=àºGw rM7…ªÆî÷¸nôëŠöT)Èpì^xgðF­ÚšŠ!ø\ôw~˜Œ?”_îc ýlÄ}x9Ó]µ`ÁIN6=0ÿ³ kèºÊŽF²V:˜_€ï-½ñ¨ž1¼ØÏÙ¦ÑÉvS³>ì°†^lI*¶g~¼ÝÀ’fHÓz¦³=Ü‘ºúã­7ʿ՞†à 'âwðÌ[ê¿õTJnI«{ùÄy¥|qx'JžihAŽ­ðy{:­°ðo&ˆ?,ÍEáAÍ>ðs‚±Z§Á¸ÞŒý91-ο%õÿ=UÙÀå*âö£û™ž úKzm§bŽÊã÷šPB*m1Ðï˜|6÷òEEÚeÁèœì©È‰…"éc‚ +Ú „óå¿r PÒ>÷¤Èæçƒ<3¯Mp b“ßSiXÎ8I¡¨¹š"åIûèR΀€ãö¬~ÛOö§~ÝÇíLýµÝõ'þÝ'Â|çÿ6¬Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ¬M ® 7›§£E®Å§Ì ¥ÝÓç—í„íÄ®ƒh˜\¸ctŽ{ÞïeºDHí>¦Og‰›(Û¡ØN¤A§°qldªœÅ4eòïQPÉTƒ—.[Ñ€{|–o†ßñ˜]ûó 7º&ôu †WL!Ðt}5uQú+j{"¦ÊÀ?C•ï)¿‚ÿEo’¼¿\Ê­1}fP¸ÄÛEºÅ{ÍŽÑJÑYèušK"‚¡ K«îðÿ#ü«Ä¾#¶ <¼ï<+Ò%«Ü°®‘«‰ÚQ÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüálÁÎ++ônæ”ÒÚ!VˆlÐýœwÊrêÉTĤÃúƒÈF \PèƒOÎÓß&³•ö·ÁJ$¢#)…wd*Â*dv¡L;tdœq€±tüàUªåOû[´’¥M‘¦÷á*è|›¨(ª?4O†uP#]j×›FãÛÂ=ñÌ\LᡎÌÈ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥a5B°˜aåþ­+YTÀÇÅ9"²ÈQü1UÊÔìO N_êßD-f­?ø“"“×驘Œ"$O³¥i-œ~“I$»ÂPNbOªÌiËÏ]RºóEeiÕÀ¬Â(gìÅM  ÏW¢ÿYüm~…ݺ*“9ŹlðWˆƒŒ¹REK<Ú³Èxr½d¾t?÷>Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09½ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ¼2ÿ“ÏÃ@@^ßjÆ_ŒüdAŠ{uÏØà¹½#­VìÂÃ/eɶüfKÖ!Â~5-h<^Œ³AwrÛõo·aà û‹t’®{F®#8´NÙj¯7„Æ•£*±¯>“p1R·Ù»‹Ï/T¤À–´;6Îâ]¡ºeYoç/leª}wUO¨Q÷‰¯L#0²ÌBÖ?.ñG°„ ¬OÒž<|ŠØDÙ¬þ8›±cÐáüH=½gfÕ#XÛ¿ëý~ò—™qeºÄ•q¸FìÖ 13ßÌ'l4 ´oÖÿ[M¢öHH¸4»*4™—^ˆäf¶þNìÇlÏ w®wY€€ÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…bŽè.Í Aj)R"ÆŒècŒz^çÓ³ì Äà¡6J—q) b'+õÃ@ëHÙÏÎÙÂÏÎÌ©7[K”é4 P,J}è2³2 H“ÖÉÕÍ(p7ˆó˦y =„›M3¹Ö~d;ÇŠ±™q@T÷‹eÂð‡Â]3Ü>~‚mÿ°ÿ6üý>ÿjúæóò-Úìã Ž#jð”Îüú,"¿Ý 2h"Ä]YøÁãâp~\#4’Yï„ëö¸Zàõ3¬8ôR°0‘Nô1Ê¿•}’ÏEcŸú€©¸³pÂÎË%/u SdœíFìü9V”AcÔŸÙt{ïqÁL”Ú¿’ãõ*ˆ‹e:rÇÚ"c³nBèZâKñé†)JXqÝjK<¦hŸtDöÐ`Y˜±=]žŸ^ÿÌÁyuY?ÿ9ûâJö‰egwzJ³dp„“­}öÅ2©Â¤EW"¾2Uúr»‚æFAj¦,Á–ı“ Ø¹½+A¼ñôtõw<„%ƒ•lòŽëÅz„k·i2Á Â_ιN ÂÆrmW=âu¼ã€ƒ÷£C&ô}Î<Ó·gç%¥‚Šw%7ýt[@P í|ƨcTúßïùænBèhx—KïjÈš QcI8…°Wvˆªè­ÉÛñÀR 9æòÝ´¾Ú$´eˆðˆ!»+¤Àˈˆ‹!±3™’x¶°ó´BõÁô“áº8#M‹) »Þ‹Q ÖXû¥ï€ ³¿–š„¯á㔲/ÓÿeNŠz¦Éß«¡™½V¯/Kí'Œ·ÀkJ»5¨C¼=3ä—Z׿•?&‘|0ê>•Àa='±æäkÖEqæž|øà0žõßÑdyÌà9RN/,²2?ª‘ï]Ø®;Ž™™NT\µÀ6€€ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4¥êÕɽx’±\íšYݺ×D‡-¸ž¦ã»:"`\ÖÄE]-eÌþ•ï±"c³nq!'ó J®Sý÷É!y¹„Šw%I ´:z8GšùP{Ä‚ϯ¿ð¦^¢'Ó†y1ìËH'þÓ4<·E“Ò­´œ¯?Gä†QA”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœà!*H5–Áãßíâþ±P’°òu6µ’¡eľô»ÚR±ƒÅÐ+ͼëÈÏϨ ùõŸJ ฮwm¬i";`n†]CJ¶8…fÊ—jæFz»bÒè¾ù䄎Sb•ì;ÀvCð“5_æ€L–y½gò ¡( Š7 ›y"DŽJ~$“%äfM0Rá¶à¹Ý :ës|oŸŒÒ¢"Út­ó¡d?]'šr?¶=í,l6w5E¾þôdšüµÏÙ"Êõ¾’}M7¤6o¾‰ ÚĦ·Ø˜ÔW„pƆt Ó)ž ,m¡ÒÙá6YB¥[ÚçÊò€¡Í| …*ßëÍJõIa¤<Ö†—pÄmç¿ë³«ÐV¥öÓÊg.5 ÃóÿWúµR­ŒôA!Ø£Ó!ßœª„@c ù8†S2VbnŒ‘A˜ÃÅ¿Pâ馿6nט“€Ê8«:y·Nö¡ê«r¾SÍK€njÔt³6ã:Hˆ)Ì”ÈFšàíƒT³y_Æÿ í’…|8Ï\Y„Ìk‚dT™ÂøÎ}ÒÄ\L/X¯Q.{ó&Z–VdÄ,f^Nß2ÂoáRß!-šHˆ%§®]®Mš_* û#Bçl;,&ãÑ}6è}üôÜRÇH‚T<+¥­Î}è§S¢?j n£ÙB£›’R(c¯œZÌìÓÅ”âá˜xcícÛË´Bÿr¹„¿¼Á/Π=´ZÊʇÁ}™¯áÂ{ÿ.~Úï.-…X¡AkˆáÅöõ“èÍšѽŒ.—ÙL«BßZS~¢ïë0Òô~Éú‘AéµÌEaýg·‘²9@-ÍÏØLçQƒyâ7ktJûbäÿlØŽ/Ý]Æß y-mq çp­Yºç„sÓzÀî›Ñ_Ô‰Û·ˆùo9UíDÐøÄ$U˜# u’©È †3dͰSä­Ûí®ÈÛkOﵪj+d-3¼ž|‹äåèÌ€e,1ଉ hsúÃ2È ™È)@Û›Òƒ?tdJ~×LÕ6óŸŸy—–{ènÿù®_†4Ó Eb5{$u Ió<>‰żr^{öá¤ÒÐÆêŽ@À׫0X‘}áüÆ‹Þýåqlö f²ºš¿==k 4ÑÌ °Œþ6Äü³ô~óAë•§"¡ù‹9jϋԖ^’¢1³” ~sQïÉÕ7¦ÂC;rONk ÎŒ °7sø,y–¢·Ê¤p@îèƒ\¨ø÷TÁOJÙÄñ}V0‰¯‰ºC„¹†šoóñfLÄTE‚4³ý‚ôÎþ[ ‹?‹ åï%=ÁœT…œ˜²±²`×z¥9”¥VAÂDe2kñG](*Ç.øP6—‚û TØ óTËØ7𥈥GÃp8ÔÍdO:ùÐkéŸ9.ù(Ü|‡AtI‘õó8eJàAFàúß<¬”áb&J: ûys2 ÉL{ö* ™®™¼ÒÜA²Vx•Y™Ë%Ü^¥ÈíRWßF: œä`†òÀªðàËq°6O™oƒTX––­y»gžåJHE`„Ö{¶ÅÌh³\‡‚ØœzêÀAÄ´Žô_ˆƒ£ÞÔ-ñb²ö£p±Ù†ÈÉÇ)†—"n†DzÅJÏ_Þ—wÛšÖïæ{hú.ÆU$;nJôT-X©ÕÐüö9,wUoå1¯èü`ÃGó›{¸Àk Iœ¾žFø®øº{Êc§"û¸KS‚«¶%%䜪’œJ;dí¢/Ÿ&Ë4Ð /çWH(S¤â©Ù%g=>¸¼äËl¨(“S$ ¶C¦†@Uî_“˜tðçGÔ³Ï+``Ÿ´íRö i3§N'“€g|n®ÐQÁåÑH[‘WkÊ¿gú»s–î‡ù ú¡£õ" †a投X:xZ# ô{Zð"óÞõtî†G5XÉ:€@Èr\€8±ÙGCšÎ 6‡1ðq‹;S ¦çû¹—3*ͦÔÝêP”ež=`Õ;j å¹Ò#£(¨çú߯swÊXˆ7lÁ/Dn‰ªî:Ý¢…!*8CXoÉúŒ>z–r^²—¢Þ%àš¹ò(ºúrÿ`_ºÆá;…è»9\©ï1¢y±áCßþ‚œn™(+l›ûQ{õï giã(?=Ð2 á…ŸºÃ'ÞyD[´°‹ÅÖ™\¹­M¹)G~ܧ-<–Õâ,$]ÒCĺzMZJ¦²s°ÈŽ-ÆöYÈVÐîŶ:PËÍÀ"Š˜í4«ÃX,øá"")$ÅŠÉÜCNÔ…Áë°Ù?‰¶1Y¾c”|jt"'¦ÊTqÆjˆð–í²¥4ªª/(ðÂçfÔkÒ5S)Q¿N«uKÇÕËxJŠ0éa z¨ÀŸ?Á¾…྄3åóUi78Ó`îÕŽ=X7xΠ•‚àiÏu­h§ÜbIP—Ô8$Ëë°x§ï{|EnªÚW€€ÇáYOη‡áD€%h|Âs>×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨Ý<6_ƒGŸáÐxÖöþ+„þÛÿl¬#äEýó\™™E Ⱥ_Ý–¸æ´A”–˜E¦š“Îo%ÌÝü×Þ:&HŒðyéRT„Õ`;h¯ ÝáâÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞé$2žMÉ#øÛæ®ÖCú#?²–wÕFŸ´u³¸5f€¦KEØ4L§lÄ"¯¤êI.æ³_&×Qzé¯ ¿u$“…’5Xw`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/¹î}tî‚÷O4 ø4^®Ð›^ 7…°÷"›u¥ËqA Ò]ʧŸÂ…>ºø À¥ƒdŠ5¨¹ë¨W»0/QZú’«—êÆä&¤Ú2òûïê-r«¯’½ƒ 2ÏÏÜ~~áQùû €óI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿ}SUù­éûïEhU–.ùâÿ@Å.f§ÅÅ¡l¹Z<„‡ûßБÌ(2Qs§C±sÈÕbO*Ñ;)¡´æÒÜ'âv.ÅÛ·}e· Ám$"Q@„ÑÒ•–D3J¤ž0ÙÜoâI«~ kÜ…ƒ-` *£ÙW»«q¿L'Ý<•òªTÒdž<¡©?zE”‰8¶â ©äIùîÒvÞrâ’Í2âú˜Ú‰!¸P"˜»%@A:™mµ£ÈÍ!0våD+¢þÓQ5ë/^‚Qªº.µ‡ÙØ´ýÕ£W¾ ™ðl]Q&íL2þS¶ß½S¨*’ë1Ý#QñJSy¿OP]¨^Ÿ)4Žr‚IÜ‘/Ïò#|—¢µE å/7à£#©l+v©eø¯×iõCIcu PÜè"ñ]ÄøŽÑ©z¿¡¤“Õ.8NÊdºåSÌ4¢ÏDÊW{òDKEÓš~N©à…ÉáØ£qøz÷ uŒpþF"T =I‚An2/9ú×XìšA¿¶@çµ)yõ1y ðìž¼¦®aÓyZ¬›& Ö4’Á‘a‚Úî½¾Óoâ®ÌEU{Ñ IIDšÔ›Ò¡*£GÖ°s‰ûRÝ‰Ö E–‹B¨Øü ôbg!”él¸ 1G;ÀuË+N¶ë…n”x8¤V›%½}è°Úi¸\̓꼣÷2]<†U\56PLžíz+5™ýL.˜Pª¸Š“ßbaÎ1•·?‹¢rÁm¥a!&° $¯­ `Ép7æmæf%·`[ñ1CÝZC»¯·³Ê’ãwœòõ︬WîùÆ2qL\އ°A…š±& AQ:pÖ#ßÌQví–£ÃH{¦æÏk0cáiI8"IG$^~kðýÖâΟ"[g¼øâÀ¶†×\ÚX¬¥4·õ9Z–½Óà,<¢¾ßÞ“>½&„ØPäFèЭëkœ^N⟠aK.å9­+ –*ÉœìK€°b½¾é6·œX*­©jû.<(ºlÙ^øymRß!‚ÔÈëɼäåð+æÂàÂi+u9?3ÐÕUG<Úu P<°WÂ#Œwâ䈥( £õ¥—‘jËÙ,Ò\ÏÚi§‡£¥·ÏVzL;±ŒÎõq¢  àÏ—Q-™Ï Is}^>jœ`¥mnDÏ= ø_¿Lô°\ çoøê†‡†R%]˜½Mw9':"+± ôú»<æ]VÍ©¨IþÔíê¦#i¨öÍås¿È‘•Î.]TÅ–‘‡Åê™~1À\Ö S¤f£ûŸ•2¸ŒaR;ê<°ç£çAÿƒÞûwZ°anlwœ'šøãNÝú®dí?W[úëVmŸþ¾"·zü9S}ÔMPV‘k)êIÁ¨ìr:8)êüñ[ízIØÊ/ð>ÅÓtйʾ€®æÏã<Ɉ¹”`˜P×ÜëŠál^*µ vüÊGÏS —ãœLsD^åQ¶jDó±§ Ç A›{æ²cÃ{®"VÏAÏgî)Íü¢žd”?’¾B~O5†pŒr*…Üsj$iáÇÄøxºƒ´e¹ð®qt;­Ò8UÔÑÂ|sÝ?z¦Ç7¼½mÌѹ—Â$Ê$ðt˜‹°ÂeNÍ{è­òÐühõÛ¾œ17„’í;úõˆ¬ Ç%b»s‘À§·K<õ~k 9B5Ñ.ÒŒè“vd 6³ ªQñP5^÷ÏàU-S™¸ø4Óx&ÕŸyG7(‚Èv7Jšú©â/ç7–0vÊœ2[EbÕà YÁÄ€²*Ø.]º¿—•Ø“p Rý¶sŽkÊ_æc‹y˜LÂw>àÑL„êÏ^k.W¡Ä{šñ§ea ¾ëºÜɶR#—rÿ>"|m I[ÎñóìàXÞ¥yÁOé’{ۻ͡ÓyȆ¬ž&«|é É`\þ‰ OZÂ…uÆ* †fÃ}׊”ÏTsÍé´ÃÎ¥·±¿PšCcÍI6ƒ”Z÷ÎlwMÑ×µdÑž0ë`Ûè­yQõbÆ„Äñ@Ø‘kOóšmfɈpÞæÚµ-Ó€9¾6'afÅ—¦Ü`ÖQüwÃaª¬ÜÂb‹¸Ý{®»^¥ÏrјÕ`ÅQGŸ¾æ§Úªu%?öÛ aÀM’ò ÷3LÿsÅl€ð9ùÈHý¶×´’øS‡ V;½ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡uSÃx—‹2Î1Ì\g¤ògO6fÉÂØaáAI"ñýæC¾º¢ rÝž …Œ¡hsð_?•Nd5¼¸ìÜ\à§ @î„r”0æÏG$¾•T¦» ¶!ÌöS9Ô F…ŸW::oÉ¡”À5øú:ŽÂ0[Pùý(矕q?zCc)qQîà %d—_–5Ôܾ®aô%\üi9¹„×è5$$«åÀPÉ~*›ØdEÍéj#¢r j;ýœh¸xÇðSy"pšˆ™|4ðIc'ñÔyd™[ƒ?+ÓêlPþ‚Qûgy~Æð»\l%hÐrJŒ^r•Q¼x ¤E wKd7"YHØÅ‡h C½bD®!"¶A)Gýì~eæjÑ.1ÖUÝ)Ý*DO1_ôÁž„ý<‘4¯ú­áŒà »æ{E‹€#“ÊÚQLÜÚ™”¹etaÀÛSÒGŸxz] ³XîʦO¿&:^Ì¢ë!HE¦"îDOiµ¶"}¿•[3)ÀÚ/}¸»ö©Í8nSd&ü ûË×Mï½zSÇ̱—˜Q-#+±Ñýȧ{2?¼{üìˆ$¦iHåÅ/™h5Ç…®PÞWÞšCì¸ÓŸI‰k`¾8Ñw=%³ã6sCK—µ^´Ž ]ЈXf2ñ4j€5tD…Œ{ù ¸Ûw¢ó¥mÏ#àñ}DH2§Î/;Z¹¥&&Ø8¯0³àL“²ÀEÌù£· aøì5ÏS*Í„`¯.“ϾÔo^ò³k3\ ¯ ˜/N ¶ßn4Ò2ÅHªãDdˆ:¼Ž•ÍשYÁLtHg(Êj¹ëZ…e¤qƒ—MßIŒåÃx—šo CâH­Ù# 9ÜRk ÷y5âF3e>À2†Ük” ±1£gÿ:6­Zn¨uø<Á‚-Í;;nåE—¹õye Ó1Še0FRª¨¿Æ”õg&#Eä)Œ‹"Õ~ÅF‚žF~×3åÇéZ\ŸÍ, 夋 ~Òüc®2çÁ9pu ‹ù 4_K4w&÷Ãꃣœ‘ÙJ„–#*<„ev–gqôê¥3yjŒI¦Q£KiX,"ïå"Üd>lmOcLÌf»(Ñ­cƒ€ß’K"Z4ÿTP@óž/ÁÉOR±-³8µÒø¿xi»!íf¼Ö³þ"¦{5U´ZXÕp6‹¯v’ÖöD^h+¦×–R›ȧ›­)f%W– :¬rý-’N&4!¶ 97ñÖת_w— ͤaÏè·:à5a\Ö>s‡Ó°¨E>®r9öBÖ9éóž Ÿ­ä³;äíhíDU3eÑèÔïÒÍ›«7ùñ¬’÷{‰™O»1øö¿E~Ò&Á?ÂÆ8wæ¯["á,î¶D©°ò½˜$ð·PT”Àð ¥$OÔ÷‹jG^°"ß–"Óšü”K熧“zü#?šâEê±ÌB¿Š…•,d39]Ä.~ô_ÿXÜrmú¬ö·€eqžPùÅe`v[•:€DºëR¡‚SWiÌT⮥¥”,ýuç¹ÓÉ1ê!ËW©!ö Ògébš·HTÕÒñùÙaÎ6€¦§LõniÏ/h y«f‚€J β‰þX7™ßèQ Wì³@ä‚#;͆X9=´ÄU¥ôç±U½Œ@ÓÙâ ÀI>>%|‡Cä·ÝÀÄ%lôKâ·~ŒéÓjÜÉ­ÌS…;N›iŠâª-÷vß„¦é{¡^C‘2é1Î)ÿ} œÙVw†éL¼+§Óš 4âCæ«à©JŠW²úšg=[`&7Ókß^šH&¶oK«Iƒ» äLhQˆ€%ÏöôîÍã^1¸þ$*Gg“ÑÞ Šª½©2‚AÝš©‡ÇèAí¿`amÞ°[%·ƒK)Û (jdaÈYsr·_ ÷ŸÓ›•ªÂ¿K®ñbÀK³UÀvý®˜ËÃu*êU»Q’_§qÉ@z¥XÅ(í+ʲ‚@®¶³ÐeÕ¡»B€mLÑ{ô­AÇ,–cÝKè¿§D±`Px £\¨ò Pª¾Ñ¨øb"¸‘4íFÜ£šP ê…¨Jµæˆ÷;¼ëÔës³{Ÿ¹9¢£óÿ4¾Æs•‰¨êM­oá<ºëŽ 1€—U±æðBj\Úï“Ívõ†O“”O¸Ÿñ³Ø+Ñ…j¸–vîk“©…öjR@º&n{\T Vü”3HÑ]r Þ¯3}3üMD4«ïíÙ•ò 7 ¹ ì”Ó)ÿ,Ž:r° >´a[HèH±5iG'%ù8)B®Í$;<à×ÿjTŽwú¿bfÅPHºÀó%;H'HÓÒ ¨L†‚M(†²Ê'àŠ(1¥JÂßÃUÙTCÕ®C©€›ÈNE¿F îܭÉv—Úà)›®û¡JçAé;æ™àSÞ©Ôšp}B&À·ÑÅéÌ€x6›p…–Šì±„Iºô¨5úøI[0õ‡ì8ÚñU2VšÎºW*²£Î{'qóyb§zÇ{gyxð{1ÒŠ\‚ÕÂÀÂ:§Ây'<g­Äþ=õ/f“zëá¸1EæðS|)G©ÉSÛy³§qÀåÚ­‚ü¼ÅŽr`}T«C¶·-”Pcçä¬'Ãû4á£ùô©æAµkŸ)N×Ôs¡[7(5kLS%…íl3ÊišnU'èa%}I<‘¤\eK@'TÇÞìK5o2SE›óauÛDG£»Uæ;ú‹Àúµ,Û𙃛ÊÊ©¸ì°bFkÆ'u¹‘¬a*CÛMM踤ËhÂ'«s„æ‚zfÙ.²7‚”û3x“P€€Çá±Ñøk][ß¶áÒT"«nà¥%p“nö›ClT˜&Aõâj}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•feÎm.Éê7§ægz8^Õ\or!6‹ µöýœÚÇb65-v—KX\@Î& xs4šfŒòŸI< —¼ 1Æ4˜€Ã>µsa•Fn2—¿Î×’ S7[rÿs?[ý˜Œ†õ5»Râ5Øaû¿:J½…h‡Cfm+Ô¾¯í÷ÿs ç±]Ñ ”2/.Ç–HÜä­­^§•·’9–³Á9[ø)~óÑs%©YueºÆÿAC¨ƒ"tì†ÀÍ »[ØpáåÏB¶“$/âs< ínŠ‚‰€‹Šm·5"åú“O¹›ƒ²m¶Ûl|ß!¬ÙO%ÔkÇán¢”A}Žõžƒe¶ðqæ}0MC46²‰#§Äd—±ŸGÍd!vÍF¹pé#±×à è“2tŸPpù\¢ÇÇòØ]à„­8{ÁšÅàÛ˜éˆýývo{¡Ö’ý.B.-ÿªÙczUÛ}Í% ·÷Y+ `¤F渚ôcoäeŸN›Q,èwབྷPÈúÉÜ6Wl<ÏHÔ·%ååÃìMçMP£. —ôömø^XQd²ñ¿ž7üi×rãë.°BØéÀ}>+†$ýîvnðF+©Â鯺·\„Ç{å/ÅSfÿ°yÔÅ¿a6Áx÷4`EæÊönr}Ÿ¦Ui™so+¯*×8UVæ—ä•;š(^cçDJ§ÐŽ]ÊÕ‰»ôâÖâäXý'/t—XšüÁYä]%*Á•:"J‘rHZùãµ»†Árfè¶h`šxDÌö;>ZDu;vIàêžûÓ¢¢¨üŒyy¹þ.Ø 6ò{QTA8îB­Üa;Ë?!’W@ðw¶í h÷Ù,ïëO×w3-ÝböÌUdù^ŒàÅþ‚ÃÛʼn'†FÛÖ^Ô×ÿ?«ãý#Ñ'^2ñ»d$¸_;nð·ý+¥döÕÝ$À‹\ð5xu0>c?gk1×Q(߸°õ²$€Y¯£r ÷÷¡‰î?Œô{½£ð5•>4G=‰ùŠ»b³VÛu8ÃÝ$ø1+±XúãPDºcU§„bLFÛ«ØZ½Ö§Û#xÚŽJèP!â?G¹3é”Ï U´¡’’dguÏD˹¤1²«Ý—~"·‘d¥Š^ÿGìÉ+z DnøºÜg g”OI…ÈúD„±§Óò!djoœ¢ØMüèÇ?¥NVþ6Krm¼Në”í ¨t4ÝJFD °>†ë’i:A9‰¥XÂk¶¾í-A)ż•ì÷å÷IÎä;º÷¦"½ñ°Â¥æ‡2[Ä1u¦ =@ú}¾m¹Hŧ†øÿtun]‡ épÛm ›e.¼ËVŸš#¾´Ts/Œf¹Ÿvmšf;@ôt ÎÖÛóæ’QtnÐG%ýy^Úo5ÒZzM€ñêrwsb”2›æÆÊÎÇò­²·7oµ ð j&n¯ü#!q«[B@öQ9ÕFŽßšd” Y’ˆ Iùh.dM¾ç 9Um~Ó‡×ôT$-Ânus‹Ù%~—)o³›ùȼ²•‰÷‚$Á?\'‰?ÑÉé‚×lÝV¥¾›Ý‡¾Ðs2Õ=— bÊuŸ¬‘ÎV7k ½IX£frG¦·«I^Ø9¦)Ô1÷å.1 b÷¸îƒYûnœÈK\tˆxƒq%O#iȹ&U)§½Ç.üÌÐŒ®hK œ£8‰!IL íÀµ£ð ~¼È#€êr쉽­¾½¾8øpK¡ÍÖa‡Zº/*èZJ·xúÍÙËmvK–Cm~–ÇuvdæÚ™E ™™^/úÁýÀÖɯ–Úß·N¤kô§‘M„²7çý”ÃZÒéÂA$Έ;Òvn#©ÅKçA'P­YKšx<rجÖ!”í4HÞ0»"óG‡÷>Å%s^íùû„ÂèX•Ë;“¾Ï»gµø!bbœÎÐ^ô Â@4†¿®šÊG×Ûˆ+ Á)¢@§?iJIq ‡Õ«:RE„V%+KgyÒôÇX5„Úɱ‹Ð>°JTýNeÖŠ ëèëOZ]Ó….Y^À‡¼€GkAá(cpw&L‡Yè·±£ó‘Aþ^>ŒñØA¸Þðög»Óù¬i©è•ò.Þ¢ÕeR9̆o‡ÉLÓßjË)âp¶*×)@yÒ‚jÑA4´áÁ³ãkÝÂÏ:m/Æ¡ÖΪM—uÌÇÜç\JMd], †ˆ,¡‰l½=¸½iíakÛ He'¨$ö³7 g¢¬êXûQ¦åzñuIl0—ž+¹‡ãÿAçVrÕÊÏl^áèNÀÌŸ}IºúU'ãÔx÷N›-QLY„hhurm Ò]ÔÌ …žEBªb’)ƒ5 lV6œÓ+í’M† d¬š{϶þ7ko;Œ#Ë»Nž;íäyñ_3H+/D¹{K`jiæ`1Û££WÔ†17bpq¸tmÍÏö狽ܬõ} “[£ý~oÑeê¯ÀÝ¥‡4.²45<“„—ˆ ô}¥\vY-5žþ :MØã@©E>ô{5•óST™µÍ9³–{˜'Œký¼TåÎã\gÒ0[¡âa‡y‹8ºY‚¿¥F*àk É8±T ¸ –Ñœ:«Ï¹Y§/pPÏjàÜn19™¯-y2PÄ7JPÖ<Âqê¢óéBï\Ï5£ ë&K#·oèHîé ZJб6[®%…û‹Âš–ð Ý…G‘l[íÎ\]>*J"E†ëa0c½¨ ]-1\ ä=î^ˆòܶ²Îb#O0¤!q¡º¶¥#–íI&96-ERo*:»ÝƒAÝÚ¼!¯f[µ„ ¥5%Åk¥Ž1ˆ6ôœøyTi<Ù’Ôã• 0¸3ÏRÿ}ɦ’~8çIî%'ï,:Wc®Q™»2ÏhÔ«tþL次ª¶o‘<ž0' u¯’ è’ª¥Ø×%4 ¹t¥qÄPö¹Ÿ>~Ú1W¡Á‰×û,¿Æ£TË/Bk#Ã[4ÿ=¬VŒMÊÁKί$®Íû‘…°f*œ‡óKŽeNöªhD³h•²à6²&±ÜÛ´ï·3.ï¾›¡{h±JP4HŽP×XúúMHÌtOAÔÀ5­‚#Y|PPä—%Ó”ÖbÍAYê¨QeûŠH2CÊ5’í¢·ñ{¥I×j˜±"b¸æ`ýººÃ\!rÍ&Wod×óœ#Äs9=Eó4çØ ZK³4õTxúÿtoògÅdˆ¢9WMßtçtßoѤšÛn‘KЦ÷Ò„à–RvâBS‚A XEÁ`ê@ÖÊ1-‘9¿ïΛ¦$»:=§¨ÊˆA^úÏ:>LpÖ1»×ÂöˆøH,Û!]îÚÅ I“˜š?ÿ:µN.ê–»§§V›È Ï,‹¹>êØ‹‡«š|éWugèû3á)9 ܱ;u¿`J™Kø×ˆ*?R‘’åº*öâ±Ê43ÞŒ´TÙ«].{bè± I lÅX Â@”Å- }’:<0þ€E;¢^½¶§eoDÝ#f½~(,_X¢8 —^ßɯ÷³™yãìŸß„l põ¦^V…é6%Wš:’à Š/‘u>ë¼Av`²Ÿ ´ZC}ïÈ5ƒ„¢o#)ÂÕ³d•„›&nrõÚï Øû]ŒÜ!!ÙT—ÏWsâ×òt ßÈÊQKSª®ø¸3™ûüÇÑSˆ †ÞXÅè‚Í©[¯§øì9ð7üö%€Ò‰Ì'±`D•¦Ð+HfZo±£Æå4¸Qµ+\áN0Eø£\þL÷‹1©™r–aT7u %«Sg°sœÕ§š[ªQ‹vAe)ž9¤‚æ¶»]‘Ú+DËj‚êrÕ‹Ð-7{ØðÃ8dn%¯¹·ë°I¬ù¯é×ýfÇ-!V$–wÇJ–_O#h˜Ê'Ó¡˜€ —ÒOé(Lûnm‡_I«Jog#ÚÄpÕó•„7ž/ ˆ“ãúaÛøÞÿbmÁ?êð|¦õ¸YaJ–ÌÖüñ±P‹j0Œcœ›ê½&±Ùˆ®Î[l™Š“‘+ﯺtÜàs !+ ÕeJ'Œåhøùs4ó'ªä²eõ0³ÏÞâLviš—݃…thÛ…÷)Ÿž¬†/þ“È UP¸<¤HqÚ +E¸Ö§ÈòÑQ;ò;`ßÄ mrž¨YñAÏïËãÔðQ¯«°ò9$(Z„fwüšL÷Û¥‰×µÕTŠŸ… `ê«7Ê®H«’¢³±‰0¼ã``>ÜÏkýn¸¶SÒþQÿEù¸x²·÷ ==4 br*TFZ]NÓ ˜ãV/›²ˆ°¹þU¹@ï ÞL5ÜwϬ‡ø$TL~0fàÚˆ̦Mý‹Ò¢lË”#y>ΠéÎÔŒ?¾[¥à¬è ¤eÆá_‚Þ*䕛øÏè/ç8gZ;Z\Ð&4ÀI± xô)È•(€þNñÏ™é]{{´v=’=Ûaqˆ±õæ§³-bWs…=Ñ%ëˆ Ž v†1,ßQ‹ " Ž·%ô¶ïóp ¨AÅð-@®½¶\*.³0ÛY/}ù#€tO?ØFx~±xǧ§¿w.*[¡.ú)E.9Ê?ûš.T©£sü«¢Ò´:í§ÂñÙg£—@¤iôÃÒ0t…ycÛ´3ÌAí›n#0Ê›k¾„¢îm/G-ÚÒø5ç=ë¿ÜZ¤¶ï:zYõwc¿þ¶?îŒZlbü•U Ñi ¨oùFÕìÜPßÑò“ 6A´i‡ó\nWHVUÖŠzuaÐë„Tbtú 0–oêQúëâçŒAƒãÁMÆìÌ5øSÿR6bobÀ½>g·35<—I1§Ä-†YzNv?½µjˆÑÈ“LcgñwfûjçYþ»…rÉÓ´ÒÞªýê+ )„«Ju??N—Îú™„Ã:ÊŠÐòbØÂi)S'Þ0…ÑQˆàΘJ¦6°€ žBQ&ð ¼eo6Ì9 §?%?›Z“µ?ݪSÂ8\uEÂIÿjÚçô"|‹É€Á_GÃ/Àó =(¢5h|·a%ð`›×[”ªVÚ¤‘]ÜBW/ñ[ä-29·=ïp4åù9QÓæ 3Méº{QµèJ÷]Å÷i0ã×KÃg¯Ï·žÕ—'™\mþ§„{M¢gðÝj™Ç"WZ··pä:0g5y†¶\Œ[wÆ“‰VÙ7NW÷±A~•;Tˆ¯ŸëM-R20‚€#‚•,ûïzÕù,«20Ž‘½l\íK khï•>Pš:!ì Ðú\‰«ø7g¹(œðªZH*!@»ÃÚ‚NÜiÓcLýu’¸Ûì‘¥“æ[Ø îh3ÀêÁåÕ±>a¤m\!òèsÛj,¼ÅSOð?Üè:Èe³ˆµ@xŸéoÜ2K¹Û,ß#À?Ÿ¥rÿ 3ÙÐJý‚Åp1Üà/A¯E•I2j³¼èCúo–½±÷x‹Fµ3Ù»Qåó6–Çí]Þû»Œ#üfœ¸<{E¥ê"™óÙ>2TB“Ùm9úW†åÓæ'ýÞ¥0(˜£‰ÎCºè\Ó‘ñ!â`ÍâU“ŽË=Ð9û1¢¥âÊœq_©¢† Jn¹a¤`ócw4oPÁäc½Lq«8¸`.À2Sð”ržoõ‰T2dO1õõ¹G;ódönâ6­N„õ‡ C0×ZgÃu$‹9OB“ué2šœ0ôïŠjý°j‘µŒ›ÅŠxFÔ?”Z—yTw d¼p ù´ÃkÖÏ4ÌÏ–ÝA¢’ L«'æŠÿ}w0©U(¬'€ñÅÛúBƒtxt¡ ^q¼Ÿ¾åテgL­UÄ;]¡€¯ºÄ–€²ß3çì{)ÿ[ö¯=‹’´ç^Ô“Ý$vfî™Û½hY^ö•Ù4Q{ôÚ󆉮 mþ€ãLG™}Ú4”‰ýƘÚv¹Ë³Ì˜¬Å–[£‚DLoz^G»‰í Ûvx„凞5 Ñ54¬ØÏ<ì@$Gg¼`¯ëpEù±ž€Ó±G ô’ÖÈáµµyž9A åNMùɺúü¢ªÜµ+B™‹ëQÅ­´‡ì(òà)WÐ_SÁ~vÒŠƒ÷¾iÉ fVËל“ÐTH8ê™Ó‚a@š Û#áKqf@Ç)~ßO€#!F}ýz9g‡Ö“ždBݧ^ûŸ›:†K̳CÎâÒ-ù}çhÊ27„&Î=,A¿Ž\ìI5žÔÃdѲNØ>¸ÄèúéÒ1óÜzïsõ¥ötÀ¤Fª;‘üÿRµEÎA'KSB¥ó}&ü[ˆ}•eáÍra}½‡Ùž—MÛ)9±cµš‰ðtá,<àÿ@¿‡Ï¬<è] ÜÛÈS¨ð0ÌÑ× ówŒ2¢ñ^ ˆìNGýÛ?ò½Ý¿ÅÁA3&4Çf¿Õ5D]Ùœû@ü±%‘>ò„é©“(®.]þ"a]ƒH1bkHgKò?.µ°Ã‹$tȨi©Gnä­Îëù×_!Ý›¼!‹õÁùk.ä„tÁrSàC±†`Þ5è9AuT—a;²(– 6O+•”×Ç(©ã”]TªÞjéü,­9]ùj ùŸOÖ1ñ¿—d?7ó9œí;bŽh%å÷C@¤nÉg˜\L3ÄJ^v©â¯Q]¦î¤[Õ…K¤˜é5c‚KŸIÖç@Ä+¥Èêû« ×ÈI‰aM€¿ˆ„æÉnLÊ=O¤²óD³P)”‰vÍ!¾$Òíôés½›Ì|éÝÿ}¨dùzF}5@¯>ATžŒ#ÿýþÐöÈrds™šÓ¨[LA¿#¬CìùÍMßAáe:ÑÝËäà:Ó² n‰ŸŽòS´lÏ$;[ôM·:h|€§â S`-ò¥?Äv>Ö‘?6ÍNuM›uáëÔgFüww¯v,nEw\0;E+@0D™ÍÀ5£À¥"€¸<Á?Ï;å™RC#ù+i‡Ç´ÏB•¥‡hí!?C&PkîCê=X§iúÝà¼ýÒÌ…hÛÌ!Ä_‹z8—˜R<Ñ¿Ïõåjq–]šj5™õ/Îw¢˜“Ïoä%o´7[FViÊvGQ„«êôÚ¬„[#ŸÍ¸jhՂο¶ðݕ۫s¨»òäá)e1ÁÜs°"T,lS;nêŽí"&’ 9ØžÎfÔyòH“†.&骣b:% µV Ø÷’>Ê, W–ìdàâŠ>+M¿dZȶýuŒÁ½‘µqO.äã4ìƒÉuƉ, E@o>@Ô£ùÙRû§ç\òô1J·P ú`ÔðaÑÈvÏY/grÆW5òàó¬°ŠBÞEÜ÷—è±)‰õD1­Mí‚UœëŒ3%AjŠàxÚÞ>Ò_dÒÉðË—V+8gÎN芥’´ß(.àoŒs/BoâbdW.ú}vØXZÆ©§ %¬@Ysçhr˜F¡Ua:]ñ{÷Ø–MÂ1:°Îµâ”¯]1Ôf»Î8êÐÈ$ÀáÈ&6Š€Eìu~O‚Ö“¯A)öœ³47_xnÖÅîín›ÈŽlµ[Õ$DzÛÝçT1ŸÔ.)8¡œÉ…/¶]ê…Ð2Îf æH¯;yÏ/NÿWÝÇ7XÛlXErï7¥ä㕲nz$æiºJ²ÖºÑðÌŠ\4] ÇxGBàH¼$ /ÊDz^Þ¦ÂÁ³CsÅ,æÂw×£k­áT}ðwaš ‰~ƒå…vQ½ªÆ ’ÌŽ¥o¢ÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qr÷´b [øÑ®w-¹¾нŸÈ¬)Ä,p¦"]ˆH6@¦ÄåÑ¢Ö::Y±ÝwÝ.f¦ÃšŽOh\4{t× frxì1zT³-4 ɲ¾ÅýŒ?‚´ë³BXFÇ ÒA'¥b¦?ýJª,<‹Só§–/yÑê ®!!]}^§2ÎÇ}¢âÓ¼-°ëÒýj³\aÅÙ5uœA½l£Ö(0gÄÖãÈÎx3à(ØF"»D÷n"B£þž¥áØHSP·ë·NPØ>ÀXŒ”\~ × êíj¯ —ìtXE… ,¢n¨‚ÕKµá˜¦h¨Ø÷)s#³oïýQtB³Ï:"N¯KËå½BãB6ßXK´›aK¹í×˼¸'/¡P(%hAªN‚L ÐhrÓ-ò˜-ñiÍ?EÖAñù£ÇlRs, ·®uGÙ_ç­o‹B¬ ËLÕŸ„gË—é³Ô\«iš) ñå·Ø¾˜9|Õ‹o%PïÍÕ[ÿ.æ°¤‘‘ä§©nPÂ.îN.Ìy8µ"9OÀq>kXv¯œ˜dûp/}†aKJóꎜ  üÏ´±¥¸s-  ¢iÔ ÃFýÚº1c0T!™÷uô©àÅä® 8@ùæ?Ð{h¦¹E{ðîÉù)àèJúh3>'(ÿa”Ûl¹ˆáO¢É4^e ‡‚qÈG^KÂy'8ú|µz^ÕY΃Ûà‚ò(Ž:‹áÔãÕ¨Æ3\Wà‹óë9[¥-QÍ K|(µ^äe&0k‚Æ!ÉË3.¾—ö ª²Ñ=%vP^DuŠÅ3˜ÏÖÙG*]‚$ºéBWX¬*uÌÏ™&ƒô>!é÷HíÈꮲ¸ÓÏEˆ‰º^nR¦¿ïW&7” *NºsÚ¾úž.ºX¨¸•·%÷Ê• «¿G˜M•ýÓp —Z± ¶ žüfLÝÞ”†é’\²3dtµdd”÷¯³.€G¿&8I®eþTr”Ÿ´S·L&Nàû!£òLC\j€d5Ç©ãß÷ÓNõ/Û ŸóTkŠcn=Ý‹¶l1Ј3WÐM?Z1ìÊË!‚l·Û½68|bwÒâéÝ…ÏÎãl7˜èÃoÈs–ŽtuÄ¢þé“v¤Ïl5"—±¨¼@ùoSýüøgÙ¯{nš~“*¹úMÇ0V¯kæOt)Éc›2æ‹æ=pž€œü*úšoC,”!Áïk"bã ]w4«´˜)£îÜÿ -— ¢rSÇ)V™-’¾ #Àx"á†_"o]¹¬³™ÒYïOWé”u› ´²ž…’çoØ å0jÐb/«ýw4ºHdñL³„•-®ú¡F˳ßÔ^ŠêW¯^(5‘ÚYz+š ë»Ê–J$˜­òtù°]ÁÀ:–‰;#•¼`y4÷áÞgû;L,Z0ÒP‰¤/Nºll‡pŠF_½—dâíÌ(Šp>Kv+q³eùùêJ5,ûžaéʉð1šËC#GôZMó¹ ^ZC>ÓMu±'R—BJVÎ4/§£ÒAtçæAKCjŒ¹hֆ܊‰>gæ7ÝZ½&£×dªÁ×ëôÚ\ß!òH8JÎÏÝ)‹ƒ$Ð0c±"àþœ„ˆ˜Y¬¯}ªÛî9à“× ÿ=”éöÔGÙ¤ÍNžU4Ï¢³·ß&âjfªÊE«ˆ?€ài(-‚f9üÔ@JÁŠæ:Þj}iYjoÝ)šmº,¢Çÿq†ÎQ¹ŠlŽÕΔÅQBÐXÁÿ%Ú¦ô ,â…Êg°”Äï·h”(D±¬šc-;g@ÐÙWƒz Žõ“•îÝ2uº¤´ñv€TÔTÞ¨S"Ãýtj.%CÔöÖ¤rµ’#&JÝXˆ3è#v2 m–ÿ‹ùmõ¢RÈ ¿cr܆kÇ1_òžFæ 5îèUwH¾Ûb6r~ ËÀFd«–*Ò{o‹&›.JÏBMÀKE:Ô÷RäWC¡®Ù’ƒ ªº$hiŽ^ÉFr(«[Úmqâ©Iø‘Ã(õ€.;H‰Q„()Á¤Šœºï‡æüS?,DËyu8s—¿Îr{åoj"3ïþôÌ“ý'xDgéIô}B—à)¯Šô²¦U¯iùÚÔ…£Rмœž§êú×ý%ÎAA¶½ÚÎe2ŽHžRËAÓaçKmy:6\é$õP÷^ÆÀpÆ›·^ÒwÕ¶“Rõß|ªNB5)tHU×§I»P]¬$¨íŠ×&He Q}‘ÌÊïŽèwF‚á‡SÊ8«5yË#ù ,ªÚ¼GÛ´ÚDˆv¦Ô–’ë'iþçKÎù ˆãΊ¢z§dö<É÷ÁfÓÛ5_65Ö«­– ÖqÂ>ÂìáüíÉ«‡¹Ñe×f­&mcS5‡}Æ8P‘û(ôÆ”5ªX&+× *e¤÷<˜åîÍõʼn›ÐFêçC}õž–Ro1û$Á®]ôÎ4Þ™íVs0átu¥È mò=ß%0YÇ`ÃÐPÂ#\½sõêZ¤j­×RŠÛv®*-w‹FªëŽÞÎ\œ-ˆ[±v˜3¼Šeyõµö1<áß±¬!m´îY: LôÎ@O·ZxâÎÁÑùÄ÷¤ñä’ý=Їœ$k® zˆÆcCžþá#¤B|¯£'›ÛÐD´2Ã1ï(ÜØJDü‘ÞN½DIðNWÿNªÈ²ÑàÈą̀¼¡S¨˜‰ ¨Í_îÎd‡©F«'—Xz¦àŽ£êÎBÓŒ­°SJK'CLîßµkV¯Ža›v¦­Oðþ¦Á >­oœ—µ²žÿfÔ+5AËèè C®m«ÒâêÆtûçÝIHÝGe–åçÆYv–¶•u4V­r|Ip㺯§©–¬^6« Êß‹,œF[¹ƒT•¦!>­Ãõk`X;š?(@õF}ã~ÝÒ²Q®z ã]€ÀƒL|—јʒ Oµð|áÖ˜ïS,vù¿xó›eQƒ°îâd÷*HjGÓÛ ØfA/ŒPL1ïöõ©$óx‹zÃ…¢R=´Î’׈2e~pÃ7Œ„o€fBÇø^L‡üÚ$ЭÍÃË(ì ußG[6@mg­¨¼-«y³¦}L˜UsR¸ßE.a)IãoGhÙ‘]åÕ’ƒvvׇJmnÛé+˜(œ6`õï—¼»2¤Eƒ“mîf«D@YŒyÇñt ‹{À{‚¶$ašÒsn‹K¦*Ay0ÀÐotA«‡AèÙRüFëŠ6¤ƒZýŒ} ­‡x‚IH—¼È*2¨[?ž¨@Ofw§[}$=‰jœ57ÂóMÔfPÖéÂûûywøÐÐÎ7ÿ#d°Æ–oEö@À¼©leXeÊfæ´ºÿ€3w“ ú)0ià‘‡²Jéînõ{± ¦NZ/8ÄC}YîÍ”ú–à ¤rU¨°>­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ:±oPEž¥h=²GQp?ÂaƒÚ*Å2og¢$š»øê·± O /kp‘‘jç‚z/½–J`%$†ïXÈ'Yß’è gÖß°ï ÏB¨œT.Y&*ýòË 5£|ðÒƒ8+>£å¯î2K_oh™2ÎË—HùrD7£s“§ºÙäÇõ‡ºSS³cd½!à•’Eç¤Ó¸°¤{}/mKµZ‘ч2nmñ¢Îy¹ŠÐ‡Ž 4ÁIáU­ã>gÞЋÎÚþ丹š‰óí„9_ðý³¦ þŸºÊµ;ðå2%›[Áv§¼Q7ìs«„*6kÀZÆQ…,fàpÔ„£%vgX¸œ_›ÙEmé»’ßö5C0 5a’Ž­ˆÙ‹N™NdfšjÜ& ¯dü(63;“ŒRýmXHÃÜ}¦»Œ`eSh-1ƒ.K¾æ‹s–|¯VKáý-TYtf9ö„Ù¶O¡pKð3ÃÜO-ç “‰ƒ«T|¿CºÇ‹ˆ( ’—â)e±]¬p¡óV=”’^o93s:½õ]Ì"9°×Õ·¡—!Õ%Èn´W¥Mcq‰ä„m3ìØ,?<”œ cܳäâ3È®“#o¤³àˇ€ ûÖeÐÐ$D¬w3E'¥ËÊ™ûs{ýÛ÷ÀZ#ìÑá3( ôšˆñZ!_öZg\?î¨$<¬¸H?loîq–5›Ú‹Eµí:Á 2®å7‹‚îÌw¤E/‚’ž £"xÜ6rJº¨/T)9£*Í!ŸKñð9ÈîãÁiª9¦Ýìߨžù ¸“%žUAvêP¯le>v#V¤MÂT-bžè›|ÃŒèÅ£{£F@~³soeßïóYš}ÄÖ¹}•óÅœ.BIÂNXeÃÏCSe T± ôáÛÁM¥¾ßþg&÷ëƒß Æ’̱ Åÿß7/bH¿?wäæõH“‘z(+Z{0 a*Ï΂ëùèJª< tB®h0MtÓq(¹Ïa˜þnŠ ZHSÔN÷.[ Z-M#cvÿ*Á¬C´qÙ^?;“¤‘ðéæÖû+'+Ÿ/þªD/ˆ²vŠÓ°&¹¥ãÀ8««aͯSEf Y¡+¥k[X° ó•Lצðæ©é5œ—j¾Y£—rHØ»Sù˜×´~~è‹Û*xÚÅ?Æ…¸[ÝáÞë¸ë-Y6áUÞ°Dr=gož+NŽÀTÙOÖªïô7Of‘ûó¾vñø¹Ú|è«E¦ÐI $‡F\{Xé7o|¨ ÏÆ7E·ˆ2o(N¢u漬öóP¹¼÷ˆ$/°« ¼Ò7 .¸ðÉÄ2“›šbÌNô¦÷×.ó 1$ì8™Þcç«ZìÜÊ£|áͲÔPRyü {q7£¾ à?ÿ5e5°ô-]}¹ö”£keGcª/Xq\.ÂÄJ+iƒ ¤HJ#]yý‹5tø8Ôqc¤k÷k-Á\-©Q !Žö;|ºßd Wx~G¾(ÉÑMÁZ~ux‰è-o™´ã+aØ´È€0Æ´Y@{Òíº³4Î<óý/û2=Ï+»šìºÄ“Äü¥;Hoû3 ‘"›Éê{_»ûIþŸ3NwÐb¶éGª[IϦ¼ÈB)e¡‡ô'Ôjh[æq&š1k¦&ñHÜ­ç­0.q$3ã‡fHøC ȆҦœ‡}Ò&]p?ö±šd“95ÌÑÛ7½Î¼ÅòBý÷Q–æ^Næ5ÜRI:‚ywé] —•¦H¤Õ¬Eûeb€€âûQï¶ê¾Ôá¥øþ ÂϾÔïá¥ØŸQöØÓê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ $LÌyð,Â7ÿw€3ÀÓi|ØoþtwU€´í®kÜ+õ¿ˆ‚èöñ]u“â5ízLoÁ :ûú]WÌ’§ŒÃŸ ü;?9l éÌ ¡òK@)åÄüŒ;n„˜&¥T±ÒqüOa³î£,¿¯âüë#«Öµ 3 ¸‘ËÖ¼\Œ°1Gs+X,Ì@éªöå3L¬=žzt–ÓÄ9Vµ/e.3å$m H«jµ–y°úê•}_ï£/ã ¸¨TGa~„ AŸ‹š,T@­ºÕŤˑtÜaÈñ"ö€W¶ªæ¨ut*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dî/HÚ]-¬<~ÄßÔ$pJ¨Ø › 2îÜ-¦h½HÙ\;Î6>«zÖú­ŽÓAPx«Þ»G¸ Í‘›‡ñdl*<ä‡XïÛ€Ö@½_„vU,¸N5F:èâVË4s-ŽL¹òVÒýw»O¸çlŸN`2xÚ“V<ÜQ–jK晲™Û­‚7á/k„Ç%ÎgŽfÚ4‘_#íUgIô× ¡*þQ=^ô6X剿Ó…„Šþñ÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄòý¯WÕ¶ºúºÏ¾§ÛK_V¢ßVÂþÝdï¶ÈŸWRßðïOøu5ügÕªwÛèýü:ËåûX?nîïÛÖ¿í§¯©¦ú¶>ú·†úµ _U/}]NwÛß÷ðéûöªþÝbþš·ÛÖ¿ õþ­Mÿ7¨¯ÛE_=+õ^Õ«¿·B5óÜVìÿ[Ý'íéõ~«ƒöú ~ÞžÀŸk`6øµÕ9ÎÑ<çú»¬)IHEtØUõ 4ŽwùŸM¢ð:¿t ák30àÊ'\ z÷ûŒ)=³tÝ}–7f<6h{µ©2æ{çÑèÏÛéñB T·×a±~¨±)ùh¤¼qø3B2F¨£Å¢Mƒ³eW`ç–p(ÄM%ò&[}yÁm¾TX-8$A}i Bè…;‹¶õË¢ìȈÎÀ{XöÃ1D‹×ÂH.uºFf'?–¤B*wâ^H õU×…)¯Z…¨ÇÏì@NeмüJB-s Ëx‘d{ÞÂÓh›4+½ßW0j !‹å@$\qŒ™fò-ÔÇ©]X×;n/ÆFYÂRæÙ"¾dB³)rçý;Õ=¹kŒ!¤W©B#B÷žâÌàjÍþíϯƒ.‹ ФŸÉ˜òª†ül¥Ð¯yäx(®Óy®A=øÓâ7Åßžå¤Öºëv4GÀ¿º´³d”†·7 óËòºZbâO]àäA‡1 ˆ¢FèD“†B×ÐÜóü·LÎo˺nÌM#¨°Í#C•Ç!ÜDmLÕDÈ%~šþ‡à(ª<ÎøÑ|ÙAÁ5xÕ"üÆÛëCÃ<›upV8Œ—V«¿/'$ÄhCˆ^GËý?­Pc°à _jîøÄl÷KJæFoûŸÄ8×åÅ©‚½ŸÀ¹Þ‹b†!Œ@f\tgìq‚ö;–˜½ž«4ól³àAM7ŸÍ ¾@Ô-ù¡Uî’YÅ3ztKhWcÈ,±¾äè0 .·0T>õdç]ÁÝi±.>ÄÖì,ï÷‡_%?¥y½ÛT†–ë'”€ Œç¦×ÝšÕœ¢²‘·Öûbº·†6å‰ù¢ï\^YÞµ0Ìh-4qVíWèºn÷d7ÃýwF?~Ë>+%Û,. 9·çõÛñÑF,\óF†ýŽK8WY£9]œcQ- ¶FcLo¦Ä›ÙÓ!†A<¾ÛpЧ*'1a=Ž à¹ nZQ¬[t ЏâÀܹT‚GRŠ‹5¸Þ(¿ âYüÙ+‹~Ù³ÝÒ$—#>»m´/Ž}è 6¤U¿™<žÿ='õ «Uk^YpE¼ñ/Ü"^Ziówt$åO½x~¨ñ$£‡ÜžpK…n¼ëÕ@iÀaϯ#¯|¹†>:ï¥ù½øt~ǰƒG•¯ý#ˆñ`zŸ%éD,’óÁ_¹š™çù&ö[E9d•O‡À² ’íC’ÝnØ©!ïbC”BJèz÷ m “¯Ž:™h L1ÿp«33÷ۋӧ湚A&Ö—Çs±(M:†ïþþ¤ãϺgŒŽãtîŠL:”M]6Î…¡Ï«AóÜ’/`##£A¨´ƒC`q£œ~…é$;¤íc¤“#vSýíqA:ÚsíªM³ŒœU€iµcØóöR¦ Ê!zI8ð+ HÞqõrI‘RF¡Ic ðD¡y´|+鯮ٜ5þ­ ¦¸sßb¿¿Þ; . á—çZt{£îL”…ày»1…0ù8!KÃ׫ømÎÖQKKþF—Ä™Â"„ѬcåpeÌm“ÀÛ(\õ‡?¦Ll.úíc¡ù &I&iâ~>žþãŸTå‘ïö^õ{ü\ó/Ü ¶ÿ\À„Xµ¦Ð ¡o1ëb¿SP„OÑ[*ød v:–} q'ü3Öüd~¹oÀ..g$¯Ô‹Lš¾æDSú‘|Vƒg%V|\ð´Ì<-1Ì&½D¥×èñ «bS\ÒÂVK„'4iʯÆtm!-+"eŸ#é8nžqq¥nr4ôån&’©±Oÿ|ô©-= jå½v*Á_´aTÀgßb +P¼y‹P»%ÇÄÚa n'pX˜¾ŸîªY "¦ÑûœÒkpå úüïpTT–§Y™g8ø°áŒÞ_2‡~4CX]¦’E¼VÏ ~PˆO” ú­>v¢ùýŒÕ y{ˆûNÝñJ5?cm½ ýˆׯ¿‡Rq«ݧŽsº¿ü þåaħ|0V9iÉ ¹MÍ›ÝásqËU}Xñ”椟騘äÖuåGX\ÇE!¢.”N°Ü,&lD¼˜$næLœ´^Œ3¦ª¢ü8 í®>‘ºÆÍûS—fb×¢óö™ØßŸxÿf¬]+}ùòxbÃÁx!*Ùù $,b3L«Xƒ[RëÇdBŸM‰Ë­(H´<½!œ$¢–‰ø³Bb$îX4n+ÕòŠ þEÃMó#8G°÷»›9ÖCfüüoùÎ{4DórHâ‚èÙB€4zãæ‹ÿ|F’‰eöÚ_ùL"æ¹|܆)²AÆc 1ZØ‚þär°%E…¦4?ÎO;SÒ&.ˆ\F½ƒNÁ| hÛg’»&úˆ÷$8Ç_lƒ5Sp=Ç¡Ð:Û•m #™®¿vÏvG¥/gLÜrûq±¶² ½¢¡MÉJ®úcRnÃ}wÏ7ËÈ>ë$…—2V…MMpâŸÏÈ;c‡OªPC˜YB²~ ÈšƒN?áôYQ^\…ÒâÖu‹(¯½*{eeýUDL@µKS¯^ÂMYŸòc7pÁ oÓ:“]p?WÑ[w {©²4$!ˆX7;ˆwØÜîáÎS‹Ã˜­K_d”kdź}Ž ÈŸ…v–¤0/ÀæHÑ ¢ŽãWÿ.ø 1é*½²LÖW€<$‡ðô@•„PÍýf­4*΢&–IvôÂÞc=Üxí&(ÅÓÏ¥þpBXÉØêlŒÊ»ñ\­ìµ”ŠŽü\ {ž'™÷‡ …¤DH-"Ò“,\}Ÿ¶ð(¿óBéÀÌ3q«”¢D¥.— ½óÛZgCîZ‰Ñ5}¶o‡Žü;á­k|¶D™Ÿ±­}¾cOç!¯‹-}&‹¸uw‚+cˆ|ìƒlo1ÖîŸSÉuÏ »gÃÒq'n7†½¸ ˜‹¤ S’ïV¡-!*+§Üo«FË%H')„GM6vóøõ»í @©†ÿ€p<»Â³þy&_ó'‹3 GQúsOª/š¯X8“D6ÚA àV¬Ì á&WjT®§Fåã§9aUz»›Ò<‰]=Ø"æ¨k|h¬tÎñç—Y Pz\Nßì´Veã´ñYR-uõæþït$1©¢[`›)Ë:úk бN‘¶s6iŸÎ¿3xžs.šF+Š= /ÏyŽ1j;D{2Ïš‹¢Œœ”å@rMpñЮ²»öùɶéK¢ëù›Þ¯ 0Å\°üµ±1õH·2ô#.Šl½Pö.Ëå?ažz•±ƒº° 2² îÇP>ÞÙtÐ…ýÄìÅëé¸Âñ •­"gªPéW…’‹–þ±&17I<{tp(ÈLÿñâîù®éÐÈÍ àÕ ¡[†h“*Ó. DB»¡çc ÇÀ³]W¬ãýÛpüšÑº¿`<»åi-à®Ü®×ÔVõ£¼Ü”^ZITt†•ðBíS Ú§üüIVb)Žp¬, ç„XP•4ø$ÃÖïGð‹—u;(;‰Ó†în¿†‡¡é÷¦}°ªÜa¡4þŸÀ­èU4†x½_’gv{ʱ†cLù©íü ³WÜk´)@ƒó3ÕŽ} ·Ø’ÐQÕĉ01N”÷¨_Íyp4×\çŬЇTöþbÛËœd[#ýÓ^‘k—Ðæã¶xüÒå?¤åi5¤ú 3\E> #á|¦ŒD­ì%Íæ° ‘n8g°¾5v*ÁÅ}› ºk&Ð-ËǕۇ·´Žb q$W€kJ÷=vŠKŽå-J´Šbs;û¡A=¿RÌh$H&ąv£XKóG¨‰aË” “Ñ0KÙûx$ xkØIyÈmž’!EÀà®\îúhá‡"㌻®RpãRûâºð´zå•nŒÉ#e—o”%~Ë–‹^Å&‹Hä¼rŽT ÁÊ[ˆk*N‰™Ú¦½ˆö·8ëÞ É--](mtzb÷^zmƈt&+(êÄÏ ãOäÊ=öÚBÀ1 RœíKó95µÛ¾í&4ó¹ƒh%¡LQ*Æ‚'NgÔFÌæfk$âdæmíô0"¾¡’:t£ŸØ£\´ÞÀù‘§aer Rw“l3-›“omù!Òz‰åäE/“vÚÒÓ¸>–(ãžé7Z(¹‘­ÔÃ’ßÚ‡ø}õôL˜Ö&»;Ô¨0íN>I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†ùaûü›ö”N3¬€('#dQR;mù™ßþeÀð–]—ƒØŸJ[7€ü*Ú7š[ = ØÇÕ+©çÝ¢vB™n…În?@t1zªICáõ›1|ò>¢ì¦«¨µ’”Ǧ2M¹u¤’>àÕc"£à]ãú. ·âüËP1vmï2BrO!Àtol+6Áž[UŒÿ$Ì©ØðYõB|-|mâ´ £ôs…®Ðšt7Ö÷@"gº\y¬lâá0Š1×^<Ö?Ú—T• Œ§ŠÎü ¸«•L§#9¤®oH®ü©†¸aRTÛ-˜T7;1ÄøUCÄzÇŒÚu^?+ÝâUmëõ ¸˜Þ{‰Ú'Ã]û¶QV‰«› 3Zï!I”äÖ£f…Çè„øÉ&H©0w˯ñ‡y>Á÷7uCž>JužZèi³ SkÅXêÉNí_Òë­ð¥"´xw£.BÌ‹âêv˜¦w8¾šÓÞ©“ù©I‘œKí¹ëÑB Û±.åæÉ!娂Wv„Âj¼CÞÂ'šsÝ=qXXÞí–œ˜¬Û›£Bþoñ?åç`Jñɧæ`Ø_®Ÿ3¸°–'KúD}6ì6ùÀe ˜mˆxÄ,å¯ GJ¥xßÿƒšæCpñ‰0Ü»êÈŸ×Jì{Ý6â°«`ÊËU2Ls„æw®ÿ €úsâíã1K–¥cST'aÚ§Œ ù‹;`•~ÓÚµHNè©Pzï¥ù*4øøÕ¼ïÛŽëJ÷W2ZIͧÔÉÍÌÒDWx'q¥ï ïl¾‚y×µKmB:BuÑ]G6¦î=ÀÌPXós¥ !˜Wè9O?[çÊÍ—º×­*2Oåü×U›äÁæTËû?0CÚž3ê{¡jf³CU^ˆŒGRǧX/”_­Ìù׌EçÉ™¦d ¨TdWs±T¤§Ó9ØfXÐàÅ#ÁDŠ{kî­¦ÕOl ©´Â4#bw˜–²JnÐt­­|yÔÝ|é‹z}T!‰¡.§éÔ€ äô ·Õçöã~ýrUV9xãºx_mU©¹(æý¨ŠïƒÇÔ†Ø4Ð#’Qy„tEJQw% åm Ø‚Boñ[ah¨%ä‡O=.ÉNâóÉ}DÌÚ#ëÉ[á)`-ÉÈ9r^ÎÙ‘ ;$ä¸f¬Û¹[ÍeF‚:¶D9ÀqÄÿéèR¶YP…„>56Ù»Býcø²cœóÆôn§±~»`'b>Ê‹yE¦¯Ášˆ‚z~½ƒá-c™XÐ…µB3Ó/ð̦ '‚°á²IL¤¿êa´!ÊxJ…äY–rò?+Ô˜k ¿Í ÈÏëÏÜ¿ç ­‰½„\ÿbÓÍ÷X—ízÓÑWÃô`d3–4¿¬lS7­t,‘¦4Wž/þX«¶%HùqõÌþWÁ¯Xß9ÇìïfÝaPE[]UnûA²äIúKM¤„>DHš‰+Ö¼2wÇÂm3­ï®Š„òØÏmU !5(i /ÒN{¹ªë3±´ó\ ¯ ë‘‰ÊŸžEáC¥8å5®ç%«ÄŽùRóIòïñ ¹“É(5?ª%l¸¥ŠYK¼+Ó‚xÀˆx®.6ZᧈEðûV舻•îå˜ãß7·ëÔ°º.Œá^í`hçÉ Ø«…{qNtœ»cr‰ÁŸNP÷$¤êï JZ)ã`9§ií„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*BRqD—u2¨¸:rÅ!ESY©àHA,DÆgŒ$ €ÑSÎ÷I%[H«FÜûùù9OÈİ6‰}ÌÊp4W‹Á³ÑCšº†€˜¬xd¹~|ƒ/Üœ>u?Y¯U°Ù\xÕ Ñ~ÿjŒŠñ!C‰Úǧf¡C¯ç`FÏ4Ãt ¥¨Èhöð7¶lÒøÜYR?Uàœc_P‘UuÊÐ9‘æžKÂôà²ÂË1ð©%kHKÿrX#í k-ú»DH&šþž=†Zi¬››òþ‘©œqØu@["Q›uEÿA¼3lX´ýüµ;¬ ŽHF¼I†‹˜"°ùý0ß&™ZgºÐ¥¿Ò¡73Eå^¶³¯w¬Z©«î:Þ`0ìþAØÊE›”•ßNv„z$XИœSl¹{ÄÄ;]fþ‡AÓ–ò«mEg$ÍZk¿}¸Úiá ²ë]+½%è$ÇÀ`Y¾L§¶ºxëÃ,”lŪ‰æ H,¬ÙG£¼úKVº·ÜŸÒ“¶DF¬WÍb䉭.èaò”‘Šà,mÓëò“oMSÀWácê`7]Çúl–Míþ7¸« ® ¼*»Òц‹ï~ ÀÂ×$Xq©w;uU,;gZFç¢ÇŸ¥ÈB3öi8yj[\ÕN›F…$©üPy¥‰fw*{’»’Û,e.ü3G÷xÜì˜à¼wuuÀÓèîóNÕ‚Ÿ×jL^@?¯ɘµ„ºÔãÒ‡Ô\¶X™.; žy“†Y x‚ðƒ*’âYb€$úц¢ÔŽsÍî\ú:Frß™–¾ døoîRǨº[3FLðÆýcàu‚.Ýl™ªF¢YL`Û!0+Ex–€6.Í4¡öG€ºM8Ï A\j¿0@É W¢²XpO'P"Ƈ-"É4æ•»ÞþËlWF;É ÷êw VÅWÇ!tA3-J%3$ˆÆð¦ÛÀ¢ÓMxÐ\ü8.À;ªÉ¿ 0„ˆK_º 7G =킌·Úäîe°œEt»wÏ«_êѤ,Kþ y?SÙ0¿nõÏãò³³çDδö,U?´âÒ¦%¨}w¤„±Dßç`¾?‹·4^=”ÕåhïÐAüÀd÷¤CYÉ5 Ì»(ÆŽkAg‹ÝÛ.»uEs~‰T“·¬$î@pPÚOãHÒWHAÍ´½ ~ßR]ÅÅE8®Ûð4âÆ¹yaYºŠ¤9FŠÑ†9ü}òs¯ðÕ› `ô$8»EVcÞbnqà­ÜÛü͵µÝñZ¨¿ã'¼×4¼Ú{Ѭ„ã_¬ÉT®äÓ¹Š_nÊy¥øÈÉgâBÄ\ tÝ'¬’|ÞéUD±•¬/1’s!kdþs,(zix{×½"[àuu)dU'Èî{A,V¶w˜·¦Ê7—§‘n,(ë+ºV({ó»>ˆÕ$[\9Ø{D0™€ŸÞ==ß”Š"Ñ{<*ÖH%)Ñ=‘–ØÂ×.÷> ݵeUò¿Åµçµ0*€™á°½Z•μ’ 5w%C_ðZĘO4P 2Z s¸ãœMµÌƒ¤ÆÐ<ËZf,<ÞÇRýlP.ž]LŸª&fGJVÀÖ>º•Fm(§Jæ€+n‹6ÊɈ¦Å|Iýxîw0¶Ð3Ò/aÇOEqEzjÁç|¥&MKmí+4iŠÿ öÓ5'Ó¹¨àgèa©h/ÿ=¬˜Þ·Ô]ûQ×/*%T¡\AØó0ÑoòVá’çoñaˆ «MIiY×ç?§sÿ-ºñ¿É2‘}zé3ÎMTFQžpˆ· È2+Z›ëZma8ªš³„Ég\[èĩВk»Iá ruIHåYDyA©>•š;Dò 7§m‚¨ý’ö!žý™Ó|’ˆ(ýon|Á"T¾{‡¢ÆÔP2se\ê)´^˨«¥f(©è} ólºSHZtBÄ5ÐtsÍ–3l=•žÖ©­Fq{øâúÙ†ÄUPÄ»æoR!éX¬mVê< Q÷˜´Î;5@Ÿhîè;•Š á5/-î·ÇÐ5"ýóîîÜ‘¤­‡|9ÞÙ`jY›ºwéøF ˆD衽2NÔó°÷tOªPùÅÓý¥·Œ0ðu–˜¢Æyš‘`·fÊOð“v„²¶¢:Bå…žJ ùƵbJ«¬…‚4X¬ú—óŠ,aD A•Íðà!XÕ¡fŸŽà‚"D»IÊ5Íñ@Ú|J‹Ï` Föžx·Džiòç€É\ë¨2ì0$NÍBR?ÿOoù5i_¢‚¼#‚¼mú2aµ)õÁîþM4š``‚[Ý‚-dÜjN;3zÑä2*AS²ã¿ ®aÒ… ˆ~oO“u*Éæ1´€þY)Ó«é^áK8H!ð,º‡Z|õÞÈé&M€ËÜÍc b@sATFBÿ`.Ç„„ÑËè Vû”~Ñ7VÊÝ[˜éÊ¡yR8ôÑÿ ÂÇÜCñübmMp2ä©à›úníY°˜Kýoð¢OâSïÜJ•Cs1Ë ??3{Wù—Lýt»$NÚŠš¤š7ÁÓwלœ…ír7ÀÀ1·;dorîã$[y;˜í3>OÉ5vsy‚ÒÉŠZÿ^èÎ#¨ШzõonL)’f1-@ô4ÿ 5‡QèAØ‰ÛæfµJ=L¸Žo1^úÝ9y fQ‰’-VæžòÂЩK*ÕÃX>êdýWŠ¥×¾V¦‚;iS+“kca²Œ£Y¹Ê¿í_ºi¤ o-ºvÂãûsNé†m\Œ©«=}+“UCùŠ—­þÑôè2¶`1ê?‡èˆ#t\®àökkëít¦7,%,•`oD=a!¦´F‚-%¿pT¨f ¾õá­Â&}c8µr~›5>‘⃯l¥Eå䪊0 CZ+‰€ÍŸf–‡ÞZ¼RݽY-ij˜Q>‹AÐBÕ¬ûP2›¸Ñ´ J ¶ùJ@ÿæÁLåR$Ÿ¾r ‘p4O=ûi,xez—´Áa/)´˜Ð@†NOÕÀãÏæêì9R¸Ìî!Ù†äÚhm>Õ npœ?²ŒÍ´0ˆ—ÆÁ¿êe1øD‘ Ì›eÀ˜$2‰‹ CÊ|ååF8¿Ù°Hìµgj•1n§ä9E‡š¤æœ*&d‚Y¾¢ç©h¼™Ñ©ÓßÉü‰Mäzð#÷{ä:“´óÿi.ågªY^žˆITÓL˜Û«ÁŒm²x¢=.þß%ÜkwãVðí]“†gäC„t‡(êL`ä‘4Ÿ“°çZļ¢áŠ-!I‹0™|Y1GýûA§KË—áht nÓ]+I†1üe•2Ø?ñBª¬Ö……Øp†¿ûd&­yTyÃêó–çk‚ªµšè›xäKƒdÄÑ9r¬G×Rþ8{âålãâùêã„”±¾6 ¥W+Ã6ŲїÂbÌZ`†Çì½²êÚ3oøpm“UR€c©ƒ2¿ßûLXÿI|'çF)ýÙu2pR¦üƒ‹Þ‡hó‘ô#ó¯À£¡ôŒ!̇ØXõådöÆæfC¡-_׆{É?RµN!gr1â"\Dàø#¨|è}ˆUê, ›¹w"üÙDe\ÎAnˆdqƤåשXî—ÄuÈ cX±ŒIÂ[S»0GªuNwJSî½é5]^Ø›§– F–8ÆïîI£gPØúô¼Üå‘íiu;CÖ VÐûtÏš:=&dèæÂë„~» èóq;Oiœ¢Ö„ª™7‰§¸Ñ¥¤ìLk°ŇÕïtéäÍÖÍò"O‹Ìß~~¶<´'*¿^L?áïm$doÊ@)Z>5äÂáW_"2£ü§°é]­X9.¿.fý–C.âÕèb‚TšÎU@2½êp@¹˜ð21'}ó|ªâ™ÈχÝRð™ªH£ò'ýÊä Q ©9nëIySÝÐûi9jœZs2©¨PE’È/“»E#p˜x¼& ÞJƒ¿H¬Çâ­bh1›f¹ˆw;Òü=?ô£Þ»þ~€¹Žä—ÁÆòô¥‘%Ÿ«0Õ4z!òžðlydH>OßÈ¥$Añ}+u¯€e¡ÓMéÿplyÛ}ÊíUß1ƒZ¾Iõ™æ‚ØóÂ]o¢ÙoNR8@f²Bu@þNá— .>¼¥™zóä=é,lÊù,–Ĭò; b)8‹&yÝo>ßÑP× n@"´ºr”ê¢ÿEá2öŸ[óŽÙ“‰Ëh† `â¥A… écÏî FÍä u@“"m5\jü~À-Ý®q;°!¡¦*/É Ð Ü¬ˆxÒϵkÞ è'6Å·ö-¸j}á:Þ5a„vüa³‹'&íà2×»x>’Ó|üÀ:ñ•,:ƒÝD£Sîå’À”tV5":Z@Ñ«l#d×KÜØwQÖy‰Ûv Ÿ8ýPl€]#ݘÊ>×ÀÐ>TÇ~£ö3ª—á=tÚy#ë®ôõ°¹êÊ‡ÏøIÒj.ùQ46Œ¯í,‹> lâ ‰«‘³±»ªÖ¦]Kr[ítRV¨'†ZrtñK9î=p·7ó$ÍázãB`˜fÍ{uxSWk<''ʘ³#BKðo#+ƒ5€±I`ñ/¾íæ•ÆÀa,`¨R{îêÇl¨OúQ­üŸoù­ø¾øz­¯à]ˆM€È,éï;þHÕæ>8¥±uX!³ó/-qévO؉¸häHGË ÚVÒ`}ºY¨?wÒtäí/S”ÝfTQ”g_)x/Už†ltºoí„­]èùfÕmfà>á>°uÑ–ä6u“¼ÉAÿK’ÉâB(I9,aRç‚ X ² %Ì{Æ/f¶¨(Þ9ƒ†’u‰ôq—…=Ò+¶-äã¿‘ª]„œ;l‚fO •3·tP€.0îoöqŠÇSâp7…ˆµ gŒ!_ÿ}ô—ÿV’Õ-Ò+ð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡MõQð©¶8b@KW~†ðbûÂ>êÌ—ãÖ ‚‘d"‘àjLµ¨‡0‚Aæ¿âZŸæEÙô_#ùP¤Z@éü'—b R6§Vô ª:-ßâ´¤~2´<ÓÏ׺ݒžná}¿Ä,ÑŸ™#ë£ÖLG¡`Yˆ»8¾¨NšÔ$-2‡3…‚*Å4š+e>ñăRr,@bTmÀƒõùœ&J§×:'¡¬Ðçé…j¹ jPИ`Í5¿«ôDdzÎÛ7ïX»Ôž@rnó†Ë& P!ѶÕš177™p¿A¥iÕÞW)ˆ'kûeËRëk›·³=úàØAB?†uÕN‚•n8>%DÏ«.L°êd§b—÷ù9Y<ŽÈ2(uíqÔ‹Ú®'Ü(˜Ç¶«›bâCéµIŸý¤’å…À}­ø€2K&gÕwi zŒ&c¿Hr „¯{šݺ%…ÄìÒðÐÊo4¾·-¢çaÍa_µP¬S"Óö lÇãS—ºj]Y –ßW{9§¡ùL#%`áÅê…Ͼ2T ‰”â%å1Sñ(üRuôö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯ÐX¨@ü‰+a—À])};@&Ê$†’þ&ëóÁMTFã®FÎ¥=ñß#JÝŸ›¢åð;Ï2e–ü{eD©[€ÇPKÂRÙJIpåšOž{înºØ!ÞèÖ¯æeì}Œ$ºS÷$1IµGžì¼rá½P0©¯”¶qô¦ùhŸ¤t‡[•̤€5&ï´ c;ÜKÉ]ò“~ônåC Íö–àµÌb¨+ékµ¸˜u.f^eŸÛÉáÛ±˜ñAÉõø?_YÖŠN„ÃôÌ«glêûWþ'Ì÷øß‰/#t[êiEÁY!néR—|v„{=G!ºy¦îw9çd³¿ ©—‚ÿv‹dÀXóz~ñ)ºá»Öü*0Œàò‚ðÇEBØ—ªêx>føÌÀQRËj#ÝA§lyu5R¿>,øÀ±ÒC0ÎNÉ50–×ð17É&^í·]3Ó’ç…0f’ó˜ow#HÄê^µy*%bz¬Srª¯v›]^›I[ ]y’d“îκÇZÑr'Õw5…UZ+±mi‹Ø‹¾¢ó<šp Ákä•öp¬é~Äø4`ýjimÿ@"öœhEá£1s¨ír‘©nÝ„ØéÌŒAi*¥+°y]q9Ù{K¨‹)¬ä§èòµó\Ÿ=‚@X=zÆpÈFDïtZð³çð~ŸE@”È—ŒÚi( D×î¬ßê±½ ìC+ÊóÌVNoDBêrøCD@RÀz^"ÓÒ%ú—p¯vÝ5HäÖ:]ñ}Jèö/î8g–Q8X!‚ØnKW"BDuƒR…ÜÒ‡¥‹`¨Æ£­¥J3Ã8ßfý×{þ ©Ï'âø —Þ ®'Zj ºŒ¶¬ÖÝÞ>0ZÕΘdÈ&Úo]6S4ˆàoßçæl…9±ò€¢5ÌÏqH´œN¢“B§ºyÔÔé[¼èïKDÂ"rqò¯ˆÑµ™ïR¤ñ.Ûm­\òäiĤú,¡±þâ³ü~ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcË8 NKUèÁ9„ÞšIP|ú,…@>=«?ã OØÕ‰§…ÝÀÅ"ÓSRÖ䉂ø†Þ$æ9;çɬë}NjmìŒ:ÏMT¨a·f$Øzœ;-Né—eΣA„ØÇJ¡¶Oño¯ò¾iß9+ ïÝ}â Ù.|‚àŽ¸s(¿ÙMÞ¨D~Mm}Ã! i"¿zɲ}YÝÍ8®ò°ý¿Âîvrܲ뜦o½ŒïéBé§”ÝÅ…*9ƒ‘aMÒÁ³¤aºaéé9:K:úo–gl=#’[TÆvNùü¢‚"H²síø2xXy\~Ó4ÕR¡´—9¨Ó'Knþþ»•}G~’÷—m‘×0ÔõÜ_+âΑ:Ï‹ óå'z0¿6µÊg*Žà(”e­é‚ãôÇöËœ“ÿR@ícPî ŽZqÏuÝMó‚ÿH?¥4tŠK]v'9P)P%PìuS¥7×UÑÌø² hTбæ-cÞU!‰r¹õ*UØXL›âYÂɵŸc\UóÈQŒ#i¥DãsŸ¡÷–®,€¿CÂ* ÖÃ9Ÿàƒ¹y)ïPßÊÂ<]Œ¹?=GéDÕ­1ï1ù„~§¼Y‘»C µð?EôãwÎI Ör@š*¸ÝJnO5ddWSÒaBÙßÙ }å£(`±c;у(–®HöQ“ÑCÎB°û»M*«°´X&–P*¥±Ïô_7‘Ý,0_úˆ©´‘03¢§Rã­ !1TW/¤,˜mE¾¬w¾~u…Õmxaevè9úN„ÀÂ9Š'QF9"Ç'¨qµE".¡Sœºì/‹ôÁ¦6, šq•,ÇöÁ8¬çöa8T‘²ÆûH1™D⯥/çúŠ‘Æ½S€Ô'³Ì9Šº¸‹>ü¿+=¯Ñ¼Dõ­† ¤è}HåWÏ Ü‚'Åæ™§Jo[ÁÀ‚‹W€s€†G=Žzoð¹iRVÍøàï6Ïv¼Ù$Œ>x’²[¤«ÇKfÚd;ætI,D Q%ûD_@£PFïgó{·i)¢ ùmeº ‹îä{ÏÃÛbœV&©Ö{ü3#·ºüp²§s_ïù­“¶¡1ͼ1ð·NùÜÁ®Z>¢Çw7tT”±\&Ê9«3®ìIL 1Åñd°îž‰ìÃdªëC»6ç{é·ý ˆ]rú•ExKËÓúÞ)øÆ¥J§Ó5ç~Ps$8·×ïë ‚” ÿ"ô›áª§@§ê@^ÿbí£PÆö3l_%Þ²šŠî‹¤Ú)‰» W3=m>‰Q¨^ðïwi‰Tà±ëÕu¶¸>8,ÿçû½ ÎIÿ5Ú â!)9VOO"âˆý>$ÂE ÍeçJ«ÕKr潩ºÜúP 2i»Óíý’@Dòr'É&–ëºúÐúÅðÑWLpÿ%ù£N¢ÚJ?RúgØÕBJß>÷\IÎÍ ÑT}ø$én˜¸å¥Vq¯Ù‡ZÆ>;£•l¥’I~œIó&]Ÿá¨Jݲ–°b=M9+£Ø‰Ž¢>ýC©¯ÎŸwÜ'6åÁ Yúÿ~ã¤:5รmy>Öëcá lI@y"¥úø1æ“<æþÒ…‘ºÿs (pÇ.öΛÎLíµ×Ñ%=ͯqLº –ÿ+gó3q«Þ@%ÞÒ¾¤ˆ#2+(O„EÚz+ ]ô¸Ð^ÝŒQvá ÍIÚ»›]Úã²y2póz·®#mÊ|QÊÑO@oHOàÇŠd¬÷æÃÿ KŠð\öpØÖglÊml-¸ Ë_ak£8‹Re¶ àë3}6¼„ãÈPzu àyÞͯ–~0×YÓ¥ÈÃeuaj°.e¤Ú£ŸQÓ,€‘­àLê_- èwˆæáLYUÀz~rzâ,ƒvÂÖh…Ç«âÁÂgBgàGéâ–|§X¾°³Ù§4ñ§Å„7k:L ,ÓË,¸‹¿N¦u@³«Y|®8ÀNÙ» u‡üÔö­‰T\>ï‹ÑetŠZIYÜ¥'Ô8™²@>ÁœŽ/bLx׿?IÚÒÒl½+d%jÒN_’å—¹”a´…X u¦m/ä€ÌàgûƒI-q eüF\¤°ð¸wÔ¯gÖÃ(“Ï[ñ–:–Ý »Âgã–üÿ†î_å×"Þ³õ’샞¾¾W¦EÙå1ï,Ü©ö3zE6Ú#©-2<¤éž}XR»Óí Æ÷RžÌm©EÁ$Ûäñ¥œ² 1å½·Q?/„NÎ1fú\l¸‡Hí{0 XûîY™Q`ý5wuÔTR­aÞ e×»b7-.·¡Öþi·ûÏ]: {¯é#i4p[<•;oÃIV« !æ€÷£´±šÓ”›ÆJlïEô Ýÿ1MÊ£Üdæ³C%„ž/+xÎC$Ì.Çò~×&sÏߊ0ýÇð¬U·ü¼dh_›0ll]^àZOmkŒ™Ðò?váüCç®+ÉkÓwÏ^ï¨Ï_i“ ¡låoÊ]Æ·˜‘"Ùô°ì”'¼µs+¯*«‰t’‹ÚVŠÜœ²jÒ‚=¬Â1h™hÆ£fXsÜ–\·^ÑU—`ÎVè:®XÙ.mz{¡’µ¢UŒêvõÖì 1È)ÍêfFõ§Hs/Û{/ñenô(uáÒÞ¶®aÁþŒ¨èßÕ3¼eNžzŸ @¶;Ý)¦÷r–°*äÈ¿ÁË+ˆ–t_:¯-Øá1  Ïù¬ã¡°´†âfN»v¶ ú‰.îtjxž ù}gÙà Azv{ZÕ©V2ceÖ^ϳä„ksc6ž‡±Å©”J„%Ž´p6¬5 ’ÜÇ'›™EofômýËÖz(£µþ5»*Æ\ïåjr…ÂZ]†T·>ë˴.Vý«ÁÆPé+¼*ë9~V’,foyvçþP—Ué`ÝÓe&¾0ºÂ|Ü‹-¯$–ï²(ž7²3Ås 0½#ßþ}Qi ¯†ò}£ækÁl%^&Ì‹Œ¹”G h\ïëL¾Âÿ!›W(˜%'‹@«»pæVD³„‡rõð|,AïÁì¨{´ …OŸoËݼ@æv.˜Ü’>>¾‘íl!Xî½Å†WþÕp–Ôžhત†zBÿ5)2å™ó4ªÃ^ÕÖv@,[(àùµô(}´Z^¥RI¤ŽØNàßÇcxª=ÀJCê¿×·”µÁ~˜ºw®` Vµ5÷7YÿY×Gžý³íóEe»dî×@—‚6" ¶ç¦‘ÉVd¼”D|:¬ðdÛ¾Å^¢©ÚoækA¶ŽŸMÆóúÊgYc¤ƒº@¾ÿ€TGtg*ƒ¬›C9Š2•y]•Ĥv.~ÇÖ}ŠZèe*}á#Uì!ÝxRÇíȳ™Cc‚gVÊ‹ßcLüM&‹¨Ï·ÍÓÕ&%z³þ?¡ÅU”É©ïÓDcXhG#·­PûµÊþHý[u‰¾i;•oá}ÄNé§»]àMÂôk&ËWr´Ç¥¶ó}-6È%P!·®ÓPÌz èr¿”1Tõ¡iØ»…ç×gØv¿ÃÚË—››®J€œ †©°ÍbL¸•1ÑÐ…•$Ä“ <½‹²«¹«ËÐÛ›¿ÏÂ$ul¿¹åæyÿ øm €i†]*,H_õïïФ >·"o 7W¸ä¸ÿEˆ… fÛ[>wÅ ñ)` U Áfšu}BŒN·;ãvqõW•­.ÙºÉÜoúß`“³Œ{W̺c˜õ?áf~ÓÌcû–ÎÍÂ'²öši”ùÎÐ+^ÁUaÌb€²¥ÂµòD:2¶¥U<Q2ç.ʺ¤ÀÍn,H…9z19ÍnXô”þ-KàýcgÆ.è˜.»à¸SBáä šŽZ¢†è¾àsÊëOn”¬ôÿ=@féSÞ.èQEÅíûÀ*¦€B—ç4Ü:±Š*ú„åZžùø–ùžÓ>)Âï‹/!‹µº–Ŷî5à‰ø)’ÛᤓS¿BóÉ$¼%þq„²@„‘€ô‚,›O<ú1»¤qõÞ?ßñ,=;® n|q‹«)ˆîôÉÙ-Ÿ{ko›Ò¥vxC#„ã4Q\6X‹½ !Ìݳ \xÝê,]Î3cÉ ÁЉ’gݦð=&{Û£+Áò5bD?GH¬®ksÜÑe‚½™¨ÿ€2 ¬itšmשּׂ6õå æˆ”}%&úÉÉ(äœCÖ¶Ke²Ú«x1XêœCó˜¤!gaAÿ4ëp¸¾áŒ ­^üñE š?×R•÷ª$²—-O©¥g†¸"b×|YX +zC¾ù[m \ú ß¹îwŒ¹WéQ/™ 7äèóJ®Kï"0(m=eý÷@&ú ¢²Þv7Rœm©ò°¥!„w‹=á1^jžt‹˜¿r=—œc};ç<1mð# ñ0ëêù•š}Œ>+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É5Mgs_¡•Q!’€^ýãæƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨Íªð÷ ƒº–œ ®j V«)7ƒÉ,¬yükh™Lª[næ¥NË_Ï^Œ¿æßM ¬±Ÿ”2¢fUM¦o†Á&íI—^-’aX|=g°Ou‰ÇŸþÑ UÏ`ÏnÌyƒhÌ6$r÷ÿlýt =¹žNŸ$õÏAD>Þ1šcC´X^Åoe¬h!`¥Íæk zÌJ¥ÛÜÕáõ¼ âLÅÁÿ„RoMkÕ!E«áƒwÊ7älH¡9óhµ]Œ ’ûê÷u<>Ý8®j?€šË²Ëbö*E_‘Uä:ª°0‚ŠqTÊ«n˜Ëj›kßNdÑ÷2æÌD~¦%ìWao¤–/•w舦{”E’Ió!æó׿¤ñ“^ýƒª3’üuãÔ°ö9)» XjW2µâ²ÅÞ>ïQôë~]›2 úfÜ4öS¡»˜Zì Z¹Ñ ©ì¡ú™ eêÛ$[ ã#¾N®‹Ç…+ž´N1šºˆ215ÌîSñÐn p™èlôìØà—Á£CTÕ$6Øg³*ëŽ:ycÝïfÊÑ%²òšU{²ð%÷_Jâ“ ÆHQµÍŠO¨ñ˜½«ˆUeÊ­®Ô‚Ø’ë(=ÑÕ©fS£ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­x€€ñý¬+»ê³ï©®ú†ÛOoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßSp¾¤Ék½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5¸_RL¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸKáÎÙ&‘ä,i»÷™‚-Ü;+¥åʃÒ/ÿ('qðq¤œ+¤™–å†ÇŸQ#˜ŒYYÉl!ˆ¯M+ÛšÞ[‡LAQêÅìkž‘¤¼YæãGÉØÆ…Ÿsø‘ÔxŒcÃÙ¯DÐ’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù[(Ožú ó@¹þ¢\ëH¬ ÄQÑßðRÇ'ÓS­£•Ó¾Ó9Â1$Pßç[ ~·_7Íó|ßÍùXd­f5¤šl·s)­n8øp"ÿMÁ¿Š ´ €u"ÕÙ HWé$+‡ê5Eçq˜l=ÒLÉ– JãMù+n§zšÐôÂ(X ›ñô(P½³ÿv›ÕôLs’©±OÿÉgÂBJN JÙÅÝaƒí±ÀzG.ã{'šß6ïfƒËájÝ’ˬXKÄ4‘ÃV¹W(Ÿ€eÌIºD_œÿxnÒß,pÊ¡¦×¤"ŠXF9¡CÀ)£“×YG|·,ʬ¿0O;¯ŽG¿ÓB/eÿÀqTIu«Â)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp5K˜4é$æZ…N'›È¸Oadz§5†Ÿ”ÊWq3 p6 îáCÙõ­I„„Jû;ðØm®hXWZ`_ >VkÇF£Š”R2޲y^¯g_l ¤n†f—Դ]2Æ}E’ÜïÖJrhb‡h µSóP߇¥§u =®a²OÜúþU·g<ÉQ߉¶ûOKïfŸ¢¼ò¤Ïø8tvM‰f›pª…ŠÀž[wõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ð‚µVD˜êÅ.~…#D°CoÛé˜4™Æ‹‰ã¼e Qn¨Ž¥QWa:XJÎi¹Cð¼+‘>#·ð»¥òßù²‡'âíý­…>?ËZðæµ:0i’§æ-Yÿg8-EhÍxòx׿@J²ÆÁ|¼HÃ}s%z1»¸Å¨=à§­2µŠmÅm F ÃB+Ël÷[x êö pËã RRŽšÁrͦÛþñ_žiöÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘‚þþáØÜóööôóÁuþö;5ïþœ€'5‚ÿÿùõõôõ€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿíåáçì€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÝÌÚýÿ°ÿ—†ï3ë+JƒÿÿÕÅÐñý€ÿß!-ùÿA..f&"EƒÿÿãÜÚÛäþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ìì×ÓÏÌÓìëæÌ‚ŒìÛÀ·ÁÙ‚ÛÚÕÎØ‹íܸ§Å„ÜÙÓ¼ÁŠîÞ¼®¾ÇЂÞÝÚͶ÷À‰îß¿µ¹Ç̃ßÜдÿ÷Àˆïá¿·©©°¹ÌÓÕÕÓÏİÿÿøÀ‡ðâÀ±³¸·¶¶µ¶³¯¿Ä¯ˆux—†ñäàßàá€äâä€âÛÆ¨›––”`…òæÖÏÎÇáƒæåá×Ê€ÄÀ¦…óèÐÅÔ†èæãàÞÝÝÜá†ôêÀ²Ê‡êéé€èçò† õìÈ¸ÉØÚÙØêìæß…ìö†öîÊÁÂÚèäåîîØ1¼€îíö†÷ðË»¾ÀÏè€çæZx•ƒðø2‚øñÜ×ÕÑÓ××ÚØØÅ{÷o€‡„‰‹Ô VÅ‚ùóâÞÓÞÜñ‚ó £zyñÿÿÙmcÿHƒúõØÐè†õN݃ÿ®G„û÷˼Õõ„÷Dz…ÿk„ ûøÏÀÑäæãäð€ø eE­ÎÎ×Å£lDƒüúÓÄÑÞèíïøúúw jÕέ“¤¹ä&H‚ýû×ÊÂÅÒáÙÞõ¬ cûûíA„¡{,&‚þýϾÃʾÀÀ¾É=&ãýÌ57Œ15>‚þþßÖÜóööôóÂuþö;5ïþœ€'5‚ÿÿùõôôõ€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿìäßåì€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÜÊÚýÿ°ÿ—†ï3ë+JƒÿÿÓÄÏòÿß!-ùÿA..f&"EƒÿÿâÜÚÛäþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ìì×ÕÐÌÒìëæÌ‚ŒìÛ¹ƒÛÚÕÎØ‹íܸ©Æ„ÜÙÓ¼ÁŠîÞ¼°¾ÉÒ‚ÞÝÚͶ÷À‰îßÁ¶¹Ç̃ßÜдÿ÷Àˆ ïáÁ¸«­°¹ÌÕÏÆ°ÿÿøÀ‡ðâµµ¼¸¸·¶¸µ°Áưˆux—† ñäàßàáâääâä€âÛÆ¨›––”`…òæÖÏÏÉáƒæåá×Ê€ÄÀ¦…óèÏÆÕ†èæãàÞÝÝÜá†ôêÁ´Ë‡êéé€èçò† õìȹÉÙÚÙÙììæß…ìö†öîÌÂÄÚéäåîîØ1¼€îíö†÷ð˼ÀÁÍèèççæZx•ƒðø2‚øñÜ×ÕÓÓ××Ú××Å{÷o€‡„‰‹Ô VÅ‚ùóãßÕÜÞñ‚ó £zyñÿÿÙmcÿHƒúõØÑé†õN݃ÿ®G„û÷;Öõ„÷Dz…ÿk„ ûøÏÀÓæèãäñ€ø eE­ÎÎ×Å£lDƒüúÔÈÓàèïïùúúw jÕέ“¤¹ä&H‚ýû×ÊÅÅÔãÚàõ¬ cûûíA„¡{,&‚þýϾÅÍÂÂÃÀÊ=&ãýÌ57Œ15>‚þþßÖÞôööôôÂuþö;5ïþœ€'5‚ÿÿù÷ôô÷€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿíçáåí€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÜÍÜýÿ°ÿ—†ï3ë+JƒÿÿÕÅÐòÿß!-ùÿA..f&"EƒÿÿãÜÚÛçþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿÿîItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32[ш‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç„æåæååææ‚åç„åæååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæ çìèêëçéììéëìâêìëéæååããâàÞÜÚ×ÓÏÊľ°à¶¸%è‚çèá¬ÀÁÄÅÊ¿ºÉ¯ÀŹÀ¹º¼¿ÑéŽçææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è‚çèâÐÒÄÒÖËËÅ»ËËáÍ³Ê´ÍÆÂëæçææ€äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%èƒçèëëíëêëíéçíìèêèíèíèçææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çèæéèæççæçæççæçæ’çææ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è„ç âåÕéÝÞéæèèæèè—çææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çèä¶·¨§Ìº­«¨§³²ãè–çææåääâáÞÛÙÔÏÉÀµ§ÝçÚÍÕ£²%éƒèæçâåâëìÍÝÍ×ßÈæé—èççååäãáÞÛ×ÑÌù§ÕñâÚÍÕ ±%é‚èéâÀͽÂǾƽåëéëé™èççååäâàÝÙÔÎż©ËøêäÚÍÔŸ°%éƒè çѹÊĪÐÖÏìíèç›èçæåäãáÝÚÖÐǽ«ÃüñëãÚÍÕž ¯%ê‚é èëÚËÓÙÌ×ÐÐÍÌäê›éèèææäâàÜØÒÊ¿®¼ý÷òëãÙÌÕ ®%ê‚é êæÀ¾¿¶¶¹°°±´ãêœéèèæåãáÝÙÓËÁ±¸ýû÷òëâÙÌÖ ­%êƒé èåèåëêçèèçéêéèèçåäâÞÙÔ̲µûþû÷òëâÙÍÕ ¬%ê‚éëÞÅ¿´°±µ³´²Ûìèéé€è˜éèçæäâÞÚÔÍô³úÿýû÷òëâÙÍÖ «%êƒéèãàäÖÒããàáèííêì€íêè–éèçæäãßÚÕÎĵ³ùÿþýû÷òëâÚÍÖ ª%ë‚êëçÄɵ¾Æ¾¹Æ®ÌȪÕʾ³®ÇÛíé”êéèçåäàÛÖÏÅ·´ùÿÿþýû÷òëãÚÍ× ©%ë‚êëçÌÎÑÕËÕÈÈËØÔÂÆÃÑÌÊÖáì•ê ééèæäáÜÖÐǹµù€ÿ þýû÷òëãÚÎØ ¨%ëƒêèÜà×ÓÚÙéàÕÙæòèì€ïíë–ê ééèæäáÜ×ÐȺ¸ùÿ€þ ýüú÷òêãÛÎØž §%ì‚ëìç¹¾·¼À´Ç²¸Ïîìëêëéëì–ë êêéçåâÝØÑɼ»û„ÿ ü÷ðèáÙÎÙž ¦%ìƒëéêëééèçÜãêèçäåëëæïìæ–ë êêéèåâÞØÑʾ»íñíììïñöûþÿýöêÝÌמ ¥%ì‚ëíä¶¿±±½±º¶´°º¯§º¶°·«·èëéêê‘ë!êêéèæãÞÙÒÊÁ¶ªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì„ëããçéêáâçãßáßÝèÞåàÍçðïòððìë"êêéèåãßÚÓ̹­žŽ‚|zxuspkhhly’³Ìæ¥ £%ì‚ëìçÉÏÑÒÕÔÒÍÙÑØ¿ÒÎÒÙÏÒÆÒÕÃÐÐç‚ëêŠë#êêéèæãßÚÕÍÅ»°¢’…~}}{zyywtomvÏ¡¢&í‚ì=íçÇÊÅÉÒÀ˼·È¨½Ê¤³¿¯ÁÇʳ¼¦ØííîïîñïïîîíîïðîïíïîíîìëéæãÞØÒÈ¿µ¨˜†„‚€€€€{pj£‰£&íƒìCëââáÔâëñçÕ¼ÕßáâèÜâìíææîæßéÝìÚÓåÐááâäèÞËÚâßéÓÛèÝãáÝâÖÂÔÉËú¯£™“’‘‘Œ€‹ ŠŠˆ‡†kc¡&î‚íCïæºµ½½³¯ª¶¯°¡¬¸¾¹¼©Ë®˜Ä¡±Ê«³¬­®·±¯±µ¨°²É³¸¬µš¦¸¨­¾¥ª ¬ÎÈÀ¸¯¨¢ Ÿž›€™ ˜——–”‘‰yŒ5 &îƒíSïçèòæêáÔßñãÑèÝòåéßÙà׿×ïèà÷ÞÝóñõòõàÑááüÙ×ôââîÙàìëÞÞåäÒÏÓÌÆÀ¹´¯®«ª©¨§¦¦¥¥¤¢¡ž›—’Œ Ÿ&î‚íCïæ¿¼½ªÌº»¿Á¹ÎºÁ»²¹Á¾¶×ȵÆÁ·µÎ¿Ã·³»·¥½¼½´¥¼Åºµ­ºàîëëèçãàÛÖÐËÆÁ½¹·¶µ´³² ±±¯­«©¦¢š¢HŸ&îƒí@ìÓÙÌÃÒÈݶÇäàÑÙÙÜØÛѾÛßÍÆÓÜ×ß»ÇÉØÓÐäÕÅßÌÖ»ÐÖÆÕ׿ìëêèçåáÝÙÕÐÌÈÅ¿¿¾‚½ ¼¼»º¹·µ³°«¯~Ÿ&ï„îòòïðï€ò€ðóòòñòòñõð€òñðñï€óñïðòôóððôðñòîíììêèçäáÝÙÖÒÏÍÊÉÈ€ÇÆ€Ç ÆÅÅÄÂÀ¾¼¸¼œ &ï„îíí€îííîííîˆíîí€îíîî€íîîíîííîííììêèçäâÞÛÙÖÔÒÐ„Ï ÐÐÏÎÍÌÊÈÇÃɧ &ï³îííììéèçåãàÝÜÚÙØ×ÖÖ„× ÖÖÔÓÑÏÍÕ° &ð„ï îïîîðîíïðíð‚îœïîîííìêéèçåãáàßÞ€ÝÜÝ‚Ü ÝÜÛÚÙØÖÞ· &ðƒïðóðóôëòöñç÷íôôöôôï îîííìëééèçæä€ãƒâá€àßÝÛã½ &ð‚ïñè¯ÅÃÉÌ¿³À®À°¿¿¸ÀËìðœïîî€íìê€éèè€çæ€çæ ååääãâàé &ð‚ïðëÞÜÏÝê»ËÛÙÕß¼ÔÈÄÅëðï€î€íìëë€êˆé€èççåîÅ &ñƒðñôóõóððõôôöóòõöññ ð€ïî„í„ìëêêçñÇ &ñ„ðññòññôï€ðïðïïñ£ðïŒîƒíëõÊ &ò„ñ èìÞçìßòîðñò©ñŽð‚ïîìöË &ò‚ñòíÁ¿·¯¼¯³²¯²Ìõð«ñðîøÍ &òƒñ ïóìîðõéØîÚÕÝôð¾ñîøÍ &ò‚ñ óêÃÏ¿ÃÉÁ¿Êöòóð¿ñïùΠ&óƒò ñÝÄ×϶ÚÜåù÷øö¿òðúÏ &ó‚òñôÞÊØàÍÖÔÐÎÍËÚôñ½òðúÏ 'ô‚óôðÍÂÁÅÃÍɼ¾º·Ô÷ò½óñûÏ 'ôƒó òîóïòòîïñðôùö¿óñûÏ 'ô‚óõèÌÄ»¶¸½¹º¹åõòòóóòóóôóòò²óñûР'ô„ó îìïâÞîïìíñòõöó€ö óðõöôõ÷ööôñ¯óñûР'õ‚ôõðÇ͸ÃʼɱÏ˵ªæË½ÃÅÕͬÏÙ¾±ÉÝøó­ôòüР'õ‚ôõñÚÝáäÙãØÖÛãëÜÒÕ×ÜÙèçÞÔÒÑÝÞ×Ýèöó­ôòüР'öƒõóáæÛ×ßÞðçØÞìûûóøúú÷öùûööúùúùö¯õóþÑ 'ö‚õöñÄÉÄÉËÀÎÍÀÃÚ÷õøõôôõõôôõõô°õóþÑ '÷‚ö÷óóõñöñòçåðìðøííô€öõ¸öôÿÑ '÷‚öøî¿ÃºµÉ;ºÇ­¾½±²ì÷ôõ÷¸öôÿÑ '÷„ö ðéðóæð÷óéðüÞÛ÷€üûô÷·öôÿÒ '÷‚ö÷ñÍÔÖÙËÇÌÎÆÙÏ¿ÙÍÊÇØÌÔö„õö€õö‹õööõõ™öôÿÒ '÷‚ö4÷ñÖØÑØá¯ÍÜÚÑÌÞáËÖѳ¯Ùîú÷øøúûûùúúùøúúùúúùùúüùúúùùøøúûù˜öôÿÒ 'øƒ÷öéêëößÙ÷ïðëèíêíÙ÷êäóèÑ€îéçÜÅæçíïçìåÄÜäÜêÕîçêîè×êÑÐÛù—÷õÿÓ 'ø‚÷ùð¹À½Öü€·*Ü®¯Æº»ª¶Ý˼±×ÇŸÂÂÄ·½ÅÊÆ·²°³Ë»Ä¸²¹®¹½Ôþ»Çñø–÷õÿÓ 'ùƒøùõ€÷/üøøùøúùâöúû÷ÞôùúõÞúíãýüüûúê÷ü÷æûúøúü÷åüðéëüöûýú÷—øöÿÓ 'ù‡ø÷ö÷÷öøø÷úùö÷øûø÷÷øýøúü€÷øøúø÷øûø ÷øûøùúú÷ùø÷÷˜øöÿÓ 'ùƒøùýû€üÿþþøøüÿõýüûýÿþýø÷øø÷†ø÷ƒø÷€ø÷øöÿÔ 'ù‚øùóÄÕÙÞÒÏÖÓÂÄÊÛÅÉÛÕÜÏÖÜœøö÷–øöÿÔ 'ú‚ùûòÓÙÈÛÞÈÍÎÀ¯ÉÎßÄÙÌËÓÏÍú›ùþø÷•ù÷ÿÔ 'úƒùúþüþýýÿþÿúôÿþüÿüýþþÿþ›ùûÛôüö”ù÷ÿמ(û„ú øùúùøù÷øøúøøùøùøùšú÷ÿOAóÿõù‘úùôÿÄŸ(û…úøñùþøÿýþþ¤ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(û‚ú û÷Éȼ»ÈËżįõû—ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(ûƒú øóíñêîìáëèàøû—úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú ûôÙçØÞåÚÜÜþýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú ûøÖÁÌdzÅÑßÿýþþ”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýòÝïîÙïíææççéú“û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(üƒûøÍ¾¼Æ³ÈÆ€·µÅ”ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü û÷úùüû÷ùùúùúú”ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ý‚üþñ×ÒÆÇÈÈÆÇÅíÿúûüûüü€ûüüûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚ü ýúîéïÞÙíëéëû€ÿüþ€ÿýýþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúÝâÏÖÝÖÕàÊÞ×ÉÂòÞÑ×ÔÜãÎÃÛàêÓÚÊÒÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üýøÑÔÓÛÑÙËÍËßçÑÂÜÓÒÑâèÑÅÊÒÇÔÚ×ÄÒþƒü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüûõùôíòõüõñòùÿÿôü€ÿ ýþþÿÿýõþÿÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýþøÃɾÃʾ×ϺÂßÿûþüûüüýüýþüüûü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒýûûúúüøúèñûöøüýýÿþ’ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#ýíêðÜôïáäóáðÝÿÿþýÿþÿÿýþÿüÿÿýüÿÿýÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(„ÿ#øÉÀº¹¿»ÏÑÊÀ²×ÿþþÿþÿþþÿþþÿþýÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿüþôóó€ÿþÿõù—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(†ÿþÿþÿÿþ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ¡ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþþÿÿ‚þÿ…þ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿýâëòòêáÛöðÝðèÞðõíñçÝ”ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(„ÿöÂÒÂÕ־ĵ¯ÄÃÖѾºÄ¾ÀÜÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþýþÿÿùïëø€ÿýîþþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿýþÿþýÿþþÿþýþþÿÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýü„ÿýûÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿýØÜÌÈáÍÏÛÛØÛÆîÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ üääåÖÙíàÉËÕÏÜú¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ ûð÷æñüöíåíù¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ úÌÉÀ»¹³ÃÂÈåÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ üûüðëáüûøùûü§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿþÒ¼¾ÉÆÌĸ»»´Ûÿýþþÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûü÷ÓàÞÒàáÕÙÓÅØÓÒÕÕÛöÿüü–û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþüþ÷üü÷üþðúðò÷þýúòóðü•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd`FL@FPFBOÔÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú üòÙåÕàâÛÚÛÿýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú û÷Ó½ÍŬÇÑßÿüþý”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýðÛðëÛïìæçææê”û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü‚û üøÊº¼Å·Èʹ´²Æ”ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü ûöúùüû÷ùúúùùúý“ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýüûÿð×ÏÂÂÉÅÆÅÂïÿûúüûü‡ûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚ü ýùíéîØÚíéèëû€ÿüÿýýþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ý‚ü ýøÛàÑ×ÜÒÙàÏÝÔɾñÜÏÑÓáâËÃÚÞêÒÛÇÓÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚ü ý÷ÐÑÔÚÎØÍËÎÝãѾÙÑÐÌâëÏÃÊÒÄÒÖ×ÃÓÿû‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüúôøóîòôûöïòúÿÿóýÿÿþýþþÿÿüõ€ÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýÿö¿É½ÈɽÕкÂÝÿûþûûüüýüýþüüûü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒý ûûúúýøûèóûö÷€ýÿ“ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#ýíêïÝóîßæôáîßÿþþýÿýÿÿýÿÿýÿÿýýÿÿýÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(„ÿ#÷ÅÁ·º¿¹ÎÍÉÀ®Ùÿþþÿþÿþþÿþþÿþýÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿýþóòó€ÿþÿóù—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(†ÿþÿ„þ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ„ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþþÿÿ‹þ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿüàëñòèàÛöñÖðéÞðóíñæßÿþ’ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(„ÿôÁн×ѻĴ±À¾ØÌ½µÄ½ÀÞÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþý€ÿøðéø€ÿüíþþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿýþÿþþÿþÿÿþýþþÿÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýü„ÿýüÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿüÔÛÍÄàÌÍÛØØÚÅñÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ ûââæÓÙïÜÆÈÕÏÛû¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ úñ÷ßðûöìæîù¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ øÇÆ¿»±³ÂÂÆæÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ üúüðêáüûøùûü§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿþη¾ÄÄÊÁ¹¹º±Ýÿýþžÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûü÷ÑßÜÒÜÚÖÖÑÄ×ÕÔ××ßøÿýü–û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþûüùüýõýþñùïòôþüøóðïü•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd_DIAGOCEP@PMBB_FEK=O_d”cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埅†€‚–=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç„æåææåææ‚åç„åæååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæçëçëêæéììéëëâêììíììêæååããâàÞÜÚ×ÓÏÊľ°à¶¸%è‚çêܪÂÁÅÆÉ¿¼Ç´Äż¿¹·¼½ÑêæçææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è‚çèáÒÑÃÕÖËÍļÍÎâ̳ȲÎÁÃìæçææ€äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%èƒçèëëíêéëíèèíëèééíéíèèçææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çèæéèæççæçæççæçæ’çææ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è„ç áå×éÛßêæèçåè˜çææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çèᳺ©°É·­±©­·ºæ—çææåääâáÞÛÙÔÏÉÀµ§ÝçÚÍÕ£²%éƒè çæãåãìêËÞÍÚßÊç˜èççååäãáÞÛ×ÑÌù§ÕñâÚÍÕ ±%é‚è êßÀ˸ÄĽÄÀèêéëšèççååäâàÝÙÔÎż©ËøêäÚÍÔŸ°%é‚è éå͸ÌèÔÒÒíìèç›èçæåäãáÝÚÖÐǽ«ÃüñëãÚÍÕž ¯%ê‚é èëÞÊÔ×ÌÖÑÑÊÍæê›éèèææäâàÜØÒÊ¿®¼ý÷òëãÙÌÕ ®%ê‚é êä½¾´¶·°±°¶åêœéèèæåãáÝÙÓËÁ±¸ýû÷òëâÙÌÖ ­%êƒé èåéäìêçèèçéêéèèçåäâÞÙÔ̲µûþû÷òëâÙÍÕ ¬%êéèìÚĺ²ª²²¶¶¯Þêèèé€è˜éèçæäâÞÚÔÍô³úÿýû÷òëâÙÍÖ «%êƒéèáàæÑÒäãàâèííêìííîêè–éèçæäãßÚÕÎĵ³ùÿþýû÷òëâÚÍÖ ª%ë‚êëãÃÈ·¿Æ¾½Å´ÊÆ©ÖɲµÈàìé”êéèçåäàÛÖÏÅ·´ùÿÿþýû÷òëãÚÍ× ©%ë‚êëæÍÐÔÕËÕÉÈÍÕÓÄÅÇÔÌÈÔäë•ê ééèæäáÜÖÐǹµù€ÿ þýû÷òëãÚÎØ ¨%ë‚êëçÛà×ÖÜÙéßÓÚçñèì€ïí—ê ééèæäáÜ×ÐȺ¸ùÿ€þ ýüú÷òêãÛÎØž §%ì‚ëíã¸Á¸Ã¿¹ÈÀ²·Òïì€ëéëì–ë êêéçåâÝØÑɼ»û„ÿ ü÷ðèáÙÎÙž ¦%ìƒëéêêèêççÜåêçæâåìêçïëç–ë êêéèåâÞØÑʾ»íñíììïñöûþÿýöêÝÌמ ¥%ì‚ëí⹿´²¿³»·¯¯¿­¬¿¯²»¥¶êêéêê‘ë!êêéèæãÞÙÒÊÁ¶ªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì„ëãäéçéáâçãàãààèÝçÞÎéðïñðð‘ë"êêéèåãßÚÓ̹­žŽ‚|zxuspkhhly’³Ìæ¥ £%ì‚ëìåËÎÎÕÖÕÏÏÚÍØ¾ÒÏÕÙÐÍÈÒÔÀÑÐéêëêŠë#êêéèæãßÚÕÍÅ»°¢’…~}}{zyywtomvÏ¡¢&í‚ì%îäÅÊÂÐÓÀʹ¹À§Âç¶Ã®½Èdzǵ¨Ýîíîïîòïïîîí‚ïíïîíîììéæãÞØÒÈ¿µ¨˜†„‚€€€€{pj£‰£&íƒìCëââáÔãëñåÓÀ×ßâáèÜäííåçîåàèÜìÚÙâÎâáâãêÛÏÝáàéÏÜèÝäàÝãÓÃÔÉÌú¯£™“’‘‘Œ€‹ ŠŠˆ‡†kc¡&îíDìðⷶ»¶¨­µ¬±£®Á½¹º±Ì­ Ãž»É¨³©®³º¬´³´¨´¸ÏÀ¡³½®±˜­¶¬²¾¤¬¡®ÎÈÀ¸¯¨¢ Ÿž›€™ ˜——–”‘‰yŒ5 &îƒíSïæéóæëÞÕßòàÔçÞóäéÞÛàØåØñæá÷ÚàóòõòôÞÔàåûØÝôåãì×ãëëÝÞåäÑÐÓÌÆÀ¹´¯®«ª©¨§¦¦¥¥¤¢¡ž›—’Œ Ÿ&îíDìïã¼¾·¬Í¹½Á·λö¶¾Á½¼Ýɴǽ¸Ð»Áº¶¼»­Å¾´®¹Å»²±½ãíëëéæãàÛÖÐËÆÁ½¹·¶µ´³² ±±¯­«©¦¢š¢HŸ&î‚íAîëÑÝÃÆÑÈÜ·ËäÞÐÛ×ÝØÛÎÂàßÍÈÕàÙÞ·ÇÍÛÒÒç×ÏÜÌ×µÓÔÃÙØçìëêèçåáÝÙÕÐÌÈÅ¿¿¾‚½ ¼¼»º¹·µ³°«¯~Ÿ&ï„î>óòðñïòòññðñóñòñòòññððôïòðòððñðòóóðîðòôòððôðñòîíììêèçäáÝÙÖÒÏÍÊÉÈ€ÇÆ€Ç ÆÅÅÄÂÀ¾¼¸¼œ &ï„îíí€îíí€î…í îîííîíîííîíîíîî€íîííîííîííììêèçäâÞÛÙÖÔÒÐ„Ï ÐÐÏÎÍÌÊÈÇÃɧ &ï³îííììéèçåãàÝÜÚÙØ×ÖÖ„× ÖÖÔÓÑÏÍÕ° &ð‡ïîðîîïðîð‚îœïîîííìêéèçåãáàßÞ€ÝÜÝ‚Ü ÝÜÛÚÙØÖÞ· &ðƒïðòïôóëôöïëöîôôöôôï îîííìëééèçæä€ãƒâá€àßÝÛã½ &ð‚ïòã®ÆÂËÆ»·Å¶Ä±ÁÀ¸ÁÉíïîî€íìê€éèè€çæ€çæ ååääãâàé &ð‚ïðêßÜÎáæ´ÑÝÙØÝ½×ÄÆÃížï€î€íìëë€êˆé€èççåîÅ &ñƒðñóóõóññõôôõóòõöðò ð€ïî„í„ìëêêçñÇ &ñ„ðòðòññóï‚ðïï¤ðïŒîƒíëõÊ &òƒñ ðçíÛéëâòîððò©ñŽð‚ïîìöË &ò‚ñòê½¾·°¿­¹´­µÎõð«ñðîøÍ &òƒñ ðòêðð÷äÚíÛØßôð¾ñîøÍ &ò‚ñ óçÃκÅÅÃÂÐ÷òòð¿ñïùΠ&óƒò ðÙÃÚδàÜçùö÷õ¿òðúÏ &ó‚òñôâËÚÝÌÕÒÒÐÎÍÞôñ½òðúÏ 'ô‚óôîÎÀÃÂÂÌÉ»Á¾·Ø÷ò½óñûÏ 'ôƒó ñïòíòòíïñïôøõ¿óñûÏ 'ôóòöãËÀ¹¯¸¹½¼¶èõò€óòóóôóò€óô¯óñûР'ô„ó ììñÝÞïïìíñòõöó€ö óðööõõöõöôñ¯óñûР'õ‚ôöíÇÌ»ÅÊÂÁÉ¸ËÆ³°çɾÂÂÙѯÕÔÁ¶¯Ïä÷ó­ôòüР'õ‚ôõðÛßäãÙäØ×ÝàéÛÔÓØÜÙçèàÔÐÒßÜÖâìõ®ôòüР'ö‚õöñßåÛÛáÝðåÖßîûúóùúú÷öùûö÷€úøö¯õóþÑ 'ö‚õ÷íÃÌÄÏÊÄÎË¿ÂÝ÷ö÷ôõôôõõô°õóþÑ '÷‚ö÷óôóòõðóæçðíð÷ëíõ¼öôÿÑ '÷‚öøíººËÍ»ÁÉ®¾Â¯·ðöôõ÷¸öôÿÑ '÷„öñéðòæðöóëðüÞâ÷üûýúó÷·öôÿÒ '÷‚öøîÎÔÔÛÉÉÌÑÉÚÎÃÛÍÊÎÕÆÓøõ€ö€õöõõöö‹õöö€õ˜öôÿÒ '÷‚ö4øïÔÙÏßݯÏàÜÓÍåßÌÖÑ®®Úòú÷ùùúúûùúúøøúùùúúùúúüøúùøùøøúúù˜öôÿÒ 'øƒ÷5õêêíöÝÜøîïçæìëëßöéçõâÐðíîèçÚÃéåðïçëåÍãàÜêÙïèëðäÚäÌÍßúö–÷õÿÓ 'ø÷7öùì¿»ÀÁÕÄ¿¸¸¶Ö§µÉ¾¿¯¹àĶ±Û¿œÈÁ¹ºÃÆÆ·¯¹¹Ì´Ç»´¼­»»ÖÁ¹»Íôø–÷õÿÓ 'ùƒøùõ€÷/üøøùøû÷àøúûõàöøûñÞüêæýüûûùçøüõæûùøúüõçüíèìü÷ûüú÷—øöÿÓ 'ùƒø÷÷ø÷÷ö€÷€øúù÷÷øû€÷ùýøúû€÷øøúø÷øûø÷øû÷€ú÷ø€÷˜øöÿÓ 'ùƒøùýû€üÿþþøøûþöþüûýþþü÷÷øø÷‚ø÷€ø÷ƒø÷øø÷÷øöÿÔ 'ù‚øúïÂÖÙßÐÍ×ÔÆÀÈØËÑ×ÚØÐ×ßú›øö÷–øöÿÔ 'ú‚ùûðÕÙÆáßÇÎÎòÉÎáÈ×ÏÆÔÍÒüøšùþø÷•ù÷ÿÔ 'úƒùú€ýüýÿþÿùõÿþýÿýýÿþÿý›ùûÛôüö”ù÷ÿמ(û„úùùúøøù÷÷ùúøøùøùøøùøùšú÷ÿOAóÿõù‘úùôÿÄŸ(û„ú ùùîúýùÿýýþ¤ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(û‚ú ûóÅǹ¹ÍÈɾÇÈøû—ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(ûƒú øòìòéïèäíèáù˜úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú üñÙçÓàâÛÛÝÿýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú ûõÒ¿ÎÆ®ÉÒáÿüþý”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýóÜðëÜðíççæèê”û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü‚ûüöÑ»½Ç¹Ìɹº¸¶Èü“ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü ûöúùýû÷úúûùùûý“ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýüûÿíØÎÃÂÉÄÉÉÁðÿûúüûüü†ûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚üýøìèñ×Ùíìéëüþÿÿü€ÿþýþþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ý‚ü ý÷ÝâÑ×ÞÖÙàÐÚÓÇÆóÜÒÕÑàçÌÂÝßêÔÜÇÔÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚ü ýõÒÖ×ÛÑÚÌÎÐÜäÏÇÚÑÒÐàéÓÉÈÓÅÕØÖÆÓÿû‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüúô÷óïóôúõïòûÿÿôýÿÿþÿÿüõ€ÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýÿôÁÌÀËÊÂ×̹Ââÿûþûûüüýüýþü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒýûûúúý÷üèôûö÷ýüýÿ“ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#üíìîÚöíÞéóãëÞÿþþýÿþÿÿýÿþüÿÿýýÿþþÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(‚ÿ%þÿõÅÆ¸¶¿¼ÏÍÌÅ´Ùÿþþÿþÿþþÿþþÿþþÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿýÿ€óÿÿþþÿõû—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(ˆÿ„þ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ¡ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûàëóòéäãöñØðçÞðôíòäßÿþ’ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(‚ÿþÿòÃÓÀÜտý¶Ä½ØÎ»¹Å¿Âßÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþý€ÿ÷ñëù€ÿüíÿþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿý€þýþþÿÿþýþ€ÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýý„ÿüüÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿúÕÚÏÎßÌÑÝÜÙÙÆóÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ ûãáäØÛîÞÈÐÔÏÝü¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ úðøãóûöëæîú¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ öÉÉÁ¿·´ÁÄÊêÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ ýùüïêáüûùùûý§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿü׸¿ÂÂËù»¾¶ßÿýþžÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûüõÓàÜÓÞÛÒÖÑÇÙÔÖÚØÞùÿý—û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþûýùýþ÷ýþòôîòóþýøôóõý•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd^FKAGOFEOAOL@C_FFKBT`d”cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埅„‚—=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿs   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç2   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŒ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÏ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08‡ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ †°ÿ“ÏÁ§nË•>/P"ƒ5o®¦µZÅíIÚ²JüÆÃÀ;U{`³Tþ™qåÈ«Óâ)™¨¥f œm1qLÍJ†ßÐA"p;H´ºžÀ|'€Ãh©`¾PæK±ïþÀ|'§9…16Ê[UÏÁ } ºEì&ßÞË´gÎO$~¼XôÖ}Ó{ÀÜžÒ þJZcOLú{’‡šÐüy÷A/0ˆêÍìZøv$à¸K&Ýd ¡ÇàyÌ~g`€Ë» ƒ’p•@Â*@3×Wçç(÷§˜?ƒó¶¥°¶1oÌÌθ\©GxÐ.…cñu ‘êFç!¤‰_Ýy)¥å™8w†Ô‡Á‹IB¿“”°°pÌ゚ćZamoÌsÙl²Ô:&WÉkG¦C‚Xa§ÇðvµEþ8ÛJ–™¿º)'DÇ2,¿#Oc*鎪uEÜÝ<®X>éÔáäv<¡Å¦ö!+IÀ2饀و›øu]šÃ7Ì#Òw™ Ÿ,Ýï ä$%¹ñ\M ö­À.ép§{²°çùÇšlz""–Rü‹©“‚gÉpŒ ý¯^ƒú,ÇàS<~d`€ËÉ@í;&å5ÅðÜÝÕ ©Æ©È­¢¸‰á)Fá| –¦W(– )Ô…R;<ä»Í÷þ(R:θ3I"tÿq‘‡ö·Ïþp¹3 7 †;<‚GBn2,XýÌL–gs6`4wàYÞÓXm86yq¨’÷ÿZpÔqRÏιµί©7[K”é4 P,J}è2³2%裓ž -‚ZÃu6=¯$•=`HeLŒb¨­Õ.¦Hƒ}´‡NÛ¿¡÷CÎ¥üïXrW¹z0#Ÿ*¸h45Ö˹!-G¹Å(Ž»ÌMMwŒ–玙ŽÇH'4ãL5Â]Ïé” Y)’‰FÖ“ç*²¥¥jc™|‹×}¤r…¿ê Qq“ìýLò(ªänB¢Ý‹oŽ·ŸnNéÏü°"c³nBèúzõ¹H)4íVøŠäV«9&ß‹ [¢¤:wŒ×1²%WoI«Ä~Šóè³¹“=4'”(žñEM9N¸‚ñÔ¹Ìé´"[¼Ý•FmÒ{ƒn`1é>Ê¿s)d«b1½Ò„yh¨; ÕÊWÝbì !`Ã<·@DÁ;¢æ~>Eßpà XÜCi«ÛÒxAB‹UNª_Æ~q£Ô—«RéÂ소Èl¸¦å¡—KïjÈš QcI8…°Wv“®_Ô­ïÄ›2¯¶W,„-’]&YgË4Q„qú—Ì$¾©]2I}MåPUŬ+}A0›ÝÃ%C»¹ –›Læ{%ì$ILH”2]„]ד†Ó†%ó~øKkžœgbkù»:ÔGýRR}ÇæI s é\Ä!Sµ„^£€vé1 A/AþÎÞð° Qýk|W¥@޻䳖¥1Ànð»|4À$r§³5ÌÊΗÿ2÷3_¤^I!'GÚÖè2ƒúM•“ak*"þ¯À 7W®·[ i@‡BÒ'$'µ0–ÜW;•n†eŒÇÆq·“CqŸÌñTë®ËE«ÉîÀrëðÃH ÇðWì–LýqªŸKi¾+^|²6|\†¶À´3~Zxÿ~ ´[öšm³Í×€!ìø2SÏ[d)K{iRé¾X· lYŠxÔ<gJšÂ³*8ï£ñ…×/;z¸ÏÍ~?~ `­>Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒ_ÁyÁ,Æ#šHˆCA'¿£þ™l^_8b"c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½8I1!dsäðTÛÏ„œÞy8€|4Ѱµò†rÇ4p•\Fz8A”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqq#9Öb«U6Ö–žoW…Ei^ ,øG{x¾g‹ÁÏÏ¢ùô‰ŸAàฮw¿Ò’ –3è'=ÿ[L„M7Í»]9dë)8S™´3Šq¶š ´{PI¨ÍåK^*î1œ]5×Í•‰öÛïÃRÞÂJ©_¯¸Õ8ëLð€Ø^ÆŸ|• Ä!gø¬ ög®¦bQü¹š²©~¥@úaž›<-ÕÜs{$4:aMqÕ†é,›vöW<º¥º±ˆÍš´Ÿa(3Ô¶UÂ+c5Ì5CV4)Qý⦠´HV’3Ö˜#nôúßÌ™ÖQpÝd™²‹õÎþ…=Öä®CÈœ)h _–fw¸oö¶ ÐÓøn]³Ê<ô¦ØÏ˜2é¯Ì^i„Øã›í®OLðßJPé&ñ(‡¿©¹ £*!7EŽBnyY—$N'! lÆ)xW™úeçÄ"øTå¸j[`FÀ‡9vÂf‚͉vmoÝ—W‰h #±8iV¡­·¬7ÿr9„f2ÐDM®Y9=äáÎô¶,BX¸=ˆ®vè_lL[%—D€Xr0¢‘qjÆ›«SÎ4}—Àb±` PAåU…n—;¾ïzDÛ>XíÐô BKi}4¹ Ÿ¤ÃÿGì%à/Zæšè?ñ<=Ú ’þ›/…²´¤‘e™òÁJMbbÂoÅ´z0› %˜ü§8¦ÍðÛM}Z%ÇócD Ž¢¸¹lZ ­CËÑLQ‚/-ôK+Û·ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÏÇ» ³•%²kÇxè.Hëªôãdü ™žH µ×Ü»nʆ÷cÀ  D¨÷RŽZ.†mwMh°­û)6nd[ ·»£[ŔƻŒ¦€~B4Ãc’ŧDóB¯Q(õ ÂIzå.ç“:õÊ kêzî¦qÎYžÝ×Ywb8´Æ[%º9™Ï–)`è@¡yz:ÍÉ—Œ›‘•ßü÷ýŸœ°2²¨é{)ì¸.vjs}$³,¦™‚ ò¤­0ÑÕÓ|õUô=.Ò!GŽ–ñ-×þ’N†Äƒ„õXè‰{@•tŠÒ.5ÓÐ\ô\^EÁ¬lÔXVô}­ÜVuî耮m<\Ü|9mRàëj#F=Œ ‡2yïê=*!2#²n†Fû¤ø}Ö¦R´ÂâìG‘Ђuörµ+ô[1h;´>^ÑÒÖ¡œÐíµ9Qú<ͺ#8>ufœ¿î÷F|3ŠnI#+YÇŠ²Ûð3ÌàHm¤X_P«¸@CŠ5à?`UúT·)k¸ú¼òQn圦ÎX æ øÐœ]ÇÈ`ϺPD³¨E/q¨•a½n?v«‰Ó„xZHýð×¾ ­ædC”G?ú3K§P„ˆ‹À•ê£ì5»‰Mf;ÃQ9Q7¾%ÚÖ›@а§a71`÷Gq‡#h/måÃÀ3ç¿%×Aɧ(Œ±¡Ù?øŒjò]¥Øº,½!©NøÐýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõ¸ÿ6,mðsû'Íõ‘o2—ášAg¡‘ÑyQè‹À¸é÷gve_a)UTŒûdYÉD«Äy'…ðÝB;êh1¾í²ÊÍeH=qëû`½¯D2oƒ³ßwD…¨4<˜ÉÕ÷ž I±ŠÍ ?ŒG—BÏ¿¼¢BÍÛ);ÏÑÊ\w²ôJ øÿ~¢›ìt¼xM´Žéíø¤Œ×W½ÖmÙ+ŽiY RÜíPåœË™ºj)„ÆB ebz~™jÌI²3©ûñ[©›¯Ýde¡ÑŽ!~òk§†Z]ƒº<Ô`íÍ̯ÿ釂”#w³aKˀެ1ý”‹íUáÍš¥ @³žõôƒæ¯£š·?OÍGDØBïÄïŽÅ/´9JÌ9×öüÛvgaZ ’–wE¦z±n]ö\‘Ѝ4¤ ((ýÊÚuVysÞê-T;òs%|“ ¡ëeoÕŠ(¤íŽUE’— :–ÍÞ'Å®|ç«;ª¾Þ<¶>úûøJêþÕÍ­°)Y-§¢ÖŸlu‘ƒä‰gSp6v†'Ó0庚~ßIbÂ/’±¨´ ɃÔ%‘pSª€‘Ù&EégÀ iú¶'Ëu¨‘|¥ ÍÁÀ|–xòÀ>M—xÖÕ¥êál²Æ¶VH­UýäÎÔŒ­µi+Z‰ñZ§ÝY @dsw}“ÄŽ/¨‰ Nô_[is˜íŽõŒ5èÛdf®“X°X‡FÞt«`ój41àÖgš®<â¿E”­=ù„€b…t¸B~~a=`bRÍÏäiÊÅö×uÒ¸È »XGÐÊ  apÝ;'pèž9À>®ä²@>M ˜x5ÚižŽ<š‹Sé`±­Š½ÿVÀ¦P¼›9ŠŽtÚ&SÝŠ¡òp¯ð@ïö]¤H–:gWÏ@’.{âêYWï+ÅAÔ\…Ë÷ð^#¨ñSÏžÓR_e‹5Ö|aH• ·g×¾ \‹åõžÈ[“òi>AºçÑÐÝ©H2Îr¦A¹³(^§2Lù::“ò ñÄÙ4äÄ+†à~¹s>.Óñmê…f0ÒÖ)éuü8²/£Ç¨¾›xÛô¥ÀzCy¸u‡øRÅsü·e=4ÀöX$/\’7´É|Y¡ÉÂ¥òÔF™ðÝ¢l½óvMn:;<7Aœ×ýÁ¬Õl¶b¹Úw æH•ÎÔ(ÌFù†kãÄÖ[ÐÖšM?úèBɲä“pG*.ƂDZ…=ò0DÉÁ¿Gl"Q/2îŽL³@¤ú0/ c}z%Çá]Ïε‡áE%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éNÁáËÌ?lN"çâé²UïÊ ¾±ÓY Íj  •¾5åC[mÃ$Q¤M© OŽ5&¬r=°–%q:)«•}Æ-·üFÇÒØj8Šžd#÷pwÅE„br,h­/oíaFHoþÞ³‹0,°:âÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R 0ÍpõÖóÁБЀ©O#¡ l¡·¾ù' {N~-?Kêþ{®òÿz€ù±"ØjÀŸN"ÁÞW’Hû £#æ2ö1®Ûë§Ui Ëj眷âÀt´‘=#ÿV¢-G蟵)§)öm_]ÛÌm£@õä’~Ûd4„w`´oægM‚‰^7Âß绩RÏ’ÝÞŒeõGr|’Ã-|§À¿ìƘú,ä¤YÕ ªÊÖT"ªðôX£8æcbÓ.G† n»ZŸvN£–˜É¼üð}¾³… »áÚ}*e à a¹-ÂÙˆÈÓ‘ÞÙë!jÿsÞÂ;%y6íΓÏÏØB~~ÉóõÆô¶ñkˆ¦€Â_yG»%nÑ‘Gÿ_lÜî5` ‰…gÅuѦùÙ™ô«Õƒê”šO|©§ñ‰8ÜN©ïé_å§0êÆ+òQ¹Uj榄Î%3%m”û?U4a˜Ë G-&7ÜÀ }꺃ú*-ÊM5’d‡Ô%¾o!$ÍÏø$þ«}U¨4ü¶ýÚý2wþ¤¢_PØÖ®–Ð-;®L]sóá’LL,áxóÏòµéÃQi§ÊÄj ¥`<²-š0ªjë6¯‚éÞG&Ø™)œç’&úF¤yÓ ÕÃuä N.¢ ‡Gÿ3R¼¤¶PéU(˲XƉŒO¾ï@Ẇ~B}ô׫FQßÒ&Y+#ß`“•h |ï{¾øiGKòúõc€](4ÑÉäßß3^ŒH]M Îõ|‹˜NšÇ“3 £p?D®øÑ›hGÊÝ÷_+§“ïñ§•Jgûæû‰°OÙuZ¡iwyÑ…êQ™óé #^¢](Aö§šíÚ%ßu¥úÆ0·«Žý Ò©UrqA÷Ô¯cl@P*Rž «ÌÛ8jÖå…“ K‚ÕÔ5 Ãå]=©nE?á+Ñß‹q)`ߟ§‹t$$à*1Œ\~‹ÛT#Ýc ÍôÌØ[̎Ǹr3E mFb¼(æËK ÓôÊw œáe ÛÄ1h 8¯#^s©™DÊØŒƒÖ¤ ¼lô‰á²²­B&éi„&Q“’zîá¸õDpU;CÄ[Ó”ÓªÒ¢¡JF#QòlÖÁó;î9æ¨úî·²ôº~½œdÊiHÑÙ¼0ÙY+P¯â²Ý«´x‘"(½ß[D¢„®1,ºJôŰ3ÿ*2ÀNÛ¤¬e6YæiÌUmê˜ešx©*Æ÷“)J&(…*½ê±üÙä*>@³ áb1—Ï8›êàa$¾L®§Z]'aî‚ é<ô¼ž]â*5ï£:¯ ö,„÷"v0Í(á"LÒ•Å¥cîOÃDðáøué ¨´rEQ×à‰Ž`F,Í.Çöó$A¶¬+6kв²Uªîç‡`y Bu—t¼æ_?áÄ@Rª]÷Ä5˜ùÂ,%‡ª>“ mtÌ9› íZBB÷¸ïc¹SÀÒТý€äY¾N·ûÑŽÛ• |M‰ý Êu`³@APØ\™ˆ’\¸ç²_D~ h¼¶™ËHntþú7j¸‹UÞãr…þôP PX6?>Ÿ/ÓÃ2®½¯¸‰ë‡ûö]hû"`ã­!gST;ÍUÿ ¯ë}H9Fž$ïT'óP£å‚ç‰lD}[ÚâM3°*ÈcLô5¸­:*Qhv'œA[d ¡1ŽªR½#ǻȳ¿y„fâcìfú϶œ¬c[TbDûÑ'rsä1ê¤-X•~h¨÷:.¤²]7kÚ«öˆÝdVF|9I`ñs —Ĉóσ ýÍ rò9œrКñ“×ÎÈs¿?ǬÇEÌúÏ%bð¾;Ï|ÇYسÙêgÜjL2% ]wh°·®õ‚S²hGþ[š¨ß¸Ô™õWwˆ]í®ÄMºÒÝF<~Ê( Ë“³AÄlqš¤¬>v®«?q[§T‹ìÆÈµ>t;ààNZ·ä4W%W1†‡ß—pJ¼qxöñ¶cÖ‡H,°}øç¾_Ïß±ã/š=õ=«Ù5˜Ló,`]R%¢é±³¨{­Áû=“ÜâWÉIŽ1¾\á¿Ï&މ°UשéåB ÄQîíf˜†šIäHè¸:2ðâ½Ü½¹]|#jKëy²ÆóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ”ÄAöߟæ¿`P‰Í–~>°ÓÐ,ƒàg¦ôûã›.F¹vµ›ý]·¾ÝäòŠ.ÜÇ$¨Ó·£‚É|¦ã;[+7×35§gRÂ×_’¯Q¾í¶[S3ôNàåpQ€ùàŠ'ø¢Å†KÊ”¾Q;²¶ävÌ‹•™îauO å’tpÌØâ‚ð8MªÄÒŽÁzÑÁ_½ö—ÀM’äÿfa’:_¡Y°“àì=#QüpQ¼‚×ONz0êzÓAÄDê^ÅTáæ£¹‚Â~Y£e[7…y¤Ï¸N·¡¿›Ê9fé÷g7¹SÔn,g¼Ú˜ê^Á ï -|ɰ¾JIÓF¤V}1–i^ž“u¤¶¡óͯ—OFÉq‘Bźï5ˆú÷Hç`Á#7´Ì˜². ×Añ[ Û+ÚNz{cB¦ýÒoã„[òúúê7­D:~¯êröagÍØnøLÜ6Nnlã~yë0ÞÎ3ÏÙˆHëÕ0U0& ç„5ùgzèiÜ s“vÿ6ŒÂ½&×…òUži±éhJ;‰¨Îä¸2‘BOž‡ü›4Ë/bA…k"È@ç=œútIæçjªýi«Rsƒn˜ Ûµ»‰zû2ŸÄ°do–)'U0Ú]•[‰þ8íN) )’· ZÀ߀ÿ26{Š÷W#¢¸?ûj3V0yà^*jЕzkR tÔr&5²)3ŠØ+ak¶k‡Pu”pUý¥a¼NµFž»/­Sÿ'ݸ2A÷ðïnîB韘Ì9·eÀV½`‹SMVbDqXÜiXט-µ¹ ÄÊØS~a€^$B×K%@‚“¬„89Öˆá·ð`û?K—U‹6ó*ŒÂ¤þ]æ:£yϰ=·M¿dc^?÷Õ)¹ K¾öY@+¦ÑÑéèF]ÿjÀœˆÑµJ‰@=j=ÌiÅ]bñŒü™Ÿ ÐEõ Ú—€úŒt­<ô"ÒˆU¶ŽàÿééokèÓ~bÌRcÉ[œ2:N¹Ló¡Sç7òǵM#AÍÀúfƒ hu:Ï…Šuÿ+]]¨(Úˆ/b›*¾¹“m©bØe1pClTí0Äñ^4þ®ÓZG†Íòy¯n©âÇêÈZÄ÷Cãôgl°´š=>ó.'à=I b¡ü¶í&úkt]’â/¨×Úm¿LìÕÖ žYíRgŽ¡kVï(­öQ5i®¹º÷Z2\c¡‚ô†Í„;ÿ$úÛwÕLfè
ý… a£UŸñ'²˜£ñoc”•9A¥åa°Xã-¦¨wšÿr:ÍÒãê'n.iÃÄËC<ºóFå㹿ۤ!¨ÞÍýAs6ŠBTÃsEÿ08QaJwnê1Q¾ÜèÜ R|ľÛÂ÷qTÙÚ&­²ö‘wã°É·i¹ª¿ØGÖÍ‹jòa`ðþóÇèuªpWgVQ—_Õ+ öÁYª¬ÅÜf·?#.ä3Nyî°Åì±Ó“XUÂ!΢¥ËâdPÁý„;œ Cvu#¦Ý̂ͪHê^IS  ¾Q«üºKArÐÉ—_ ÄÙ:ùÉ?@O²:pü¡Y½ðW`VnAq{X~™±£- ,êQâáÒYÃCå^ÏûS:§Jy1iÂ.”þ—¨ãg#¹ô#?uÍ£ø³ÞöMY—ºŸ¬k/+×N‰^~TH&ÂkT÷€^hÄÜÔ{ÛJh=‰ƒó€ëãáé4¥zíÿB«vRzP+¤­æ>ñ·TšF<çðên ÊÌ×"ê%âÚðZóóîO—1rÓE55ëõöv6ö‘ZÛ}/¾¿—)9²%ÓÚâ÷Ô¸€]½5/zÏ‘ŸÀg3×É&+|´•ÇÅï T ˜UDAéß5F¡k½Ïç[ªw%‰®œÑwetõ2Z®vf†÷Ó÷ƒÆ‹µ”†‡æOW:X)žpŽÂ¼ö¤Î»Àö•"s^Â#VUnœ±¢çéæ§‘^Æñ“©Dòî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖ}PHP‘Ù’ÇÆ.ö¹ý9h°Ç¹Éa%UÅýûKÔ\'?óG&õp ÙçJBÒ:$Ó­€°,ÿ68 BÇ4KC¥`_m•*ª[MžjVÏ›J€˜2ÃË·_“hY•ˆô RŸËÐíEäVëOM[Ùâà’›3­ ÞæysµÞ>½ã_»ƒâPö †„ò0d™³g›Yܬ›\BõuÃªŠˆï«*Üï‚5T×|Zìžð6É"æýrz·÷àF#çø’WÈn{‘±Ñ,è:­žÙ’ëu8Ýlb±kÅ“6ÐËM5ß‹ëA:X¢ß!CéÎ÷wësXùÃ;8XqjöÒíàN#ÒAS*DKñm` ª(Læ§­+D°[!"õ=s±¹°Ð vÂBs<Äâ4U%ˆv  xJ#þÚKÇWê㢧ŒýÇhqÓ¢ «hŠãž*ž©HuÓn;ÍõyÕmÖµ¨Rb–l\h*LhY>F³ ?·FY±gïß½ˆct>WÛ€*œc†^á0š]Gb°Ÿd3˜H+”£Ö?<«A|œf^„Èõ:•º>{€¥Wep(ÿ"ŠÂ8,Zû™‘#º¬ÒÇlã_ÍÒÐ%œC]¡âóáêÙÛçηÙg|Cš%øwGÝ#R¡|¸=—OˆoX=±/ý÷­¼ƒÅUÓè¸í3zØÑ~z,.’l-=°Ðì­æ÷ë÷y »#uõM¾§3²Yº ^šû¾ y$›w†ã“Z¿X»iWèÍÈôɬt×JVQT²~ˆ ªŽ; >a (f¿:?/êW[;_òÆM ž¢ÿO"áþÍÆa¦TÝ'¢ ´DÞÖsoq“•hå*jiðð‚¢>íÂD2‚k‰´-,›>¡ Õ^ ˆwé¼Ûd[š)‡ÅÞ%õ£@3ÿlZ‘e~>j _‚JÊ2xtú¨ØÎSqæc„öÕÏ*×S&”«WŠsʘ-HMß¿ êì1å¥(Дgeö¬c*ÌIüÇn‡Ësp=9 7… ˆ†EìwiÒ)þó¢!¢…E×£­•–¬DnEdêˆrÔÊLn"7å¾oƒ€¯- 3gf€îK7Œ1@E快˃n¬£„LUøIn›-—Ö֞θoŸó†uéภΡéwkí§õ@f-=›¤XÇœaÀ2Ö:BuN˜*é($†Tô4¿×äaèötb[](#è0 i>>ú—Qeåù å{«þçuPh³T­[k)©4ä9í·„^ÂpÙ\Lâúx”O!½\ÛÕR2¨á»¡dXf«æèjŠVßP+È!`Ûq‹´°˜—aޝ'-`úTk£á7®Ð§Ÿ%ö™4*ô,÷»ž”’Ùå#“q\ô±¯à&vXƒLèê WCÚª B° òÔª,奙^M]5ã‘l·Fοo:JG”g 2 E±2µÈe@ñx'ƒÏFÏ^XFê"K ÿW±!è­B’wr“àbjЧÏÑïˆ'þgo~Ï oÎ'uÜ<–a–2ì¬<›]Bfæ$;¸*\êïæèJ¸ §JÂö-çeu›É"£-†ø½ÇlÚÇÑ~Ûä»òjêû~-ó‘#WÌ9 [ìhæ°'R4bþq´zŠd÷àQ«Úu8ø”©µuOÿ?–¾Û 5>ÎYf‚S ¬·´ ¦Ç‰~U"¥×Ç+¼¦Tÿ ϾvaåÝ\J§‹ríØ €«ª2¼$µ®^ ? ’Ýî#‚™Œ€íòMT0éMÇy±ì¼ñDâòZ¯å h)Ü-÷k¬âY}^¦·2»)ç¿â1–2ö8·#®‹-˜’I•&•Êœ›v¸åÀñöh,7ÒTD“>y¯®z“·¸ž!ª†ïIÞø5ä´ >E #MVï#ÓÔ«!ù´+ù;ð”N5èÐýKÛÝãÓ"0CVùÍæÛ¦Sx¨Þ ïæë|{iñMä,¶£¨¬N‘™)T§Oß=ª‘ù0f¼°ágÇ®vÑk´qÑ·FG¨l;f‘A~aÏ à‰1,‚ÀlE¨ÆðÀÏÊ3&Í¥@w¯B‘„t2ŠÁ%˜´¬fœû(ŒÕŠGaæÃ^P€ø¦XDCTà ö;¥ÝtÊ\y¤#D1QpÎI`œÝ, ÊNd,F m,I*r^Jšéí >ÎîÂÀg~àó7ÕäèQ; äª;þ{?j÷‰‡1#4y-ºq~%¼jÚÀâ3áç’Š *ØC.2¥ÊœÌ²µv¡”}†Œ-ósNaìS%L‡ ³PÂK³Æì ÙÚzJg‚íÅOi £Ÿ±¨”c÷تÞHÈÎ !$묭•@ ñoT÷4]oc<¤©$Ô…fnØ¿õ<þ±vJ ܹ 5ðAïJpyWþ ›‰,CD¼×V ­®¬§}ÐÔ³BFú¶OT?C¿TM\Jñ ¾Ù$Dw3rüúÆØ:Öyt’(&!l£`†}E÷äW¼£<¢z×@Âp4ÀßOøJ²›Í‹+@É—A¾Aõºþþbãˆû‹° ¾Z£;Få%<3ð‚­Æj®²úЇèK~›6 •ôYÓj÷°¦Åßó®)»V!œmD«aÐ>`=ÇŒ€Ëµ±p“ ,'DEqªÏ ÑN7,| Ï<ÍQWd”ƒÙ§[«œ—½Pê'þ«ùÓSLÆ2J¬D§¾”§…~îfÂîãñ¢XÀr6¾"£‘cB,…1EC=­-I EÖ~ ˆ‡a×ÈŠ…4'íøeè+ôµÝ³á ÷•Ÿ³ÇÊØ¢´ _aL©Ž9 {[>i\S†ns¼eŸP‘BPBw‘> ¨OWØ"%iÿ'G>`·çÔœì_Z·j¼E¡X8Ÿ ±†âÆø‡xÀ¶êÍSB?Ê Î6ã)W¬Ö¾-s®N:Jëåûê§Ñ¸¨éL(u¡®cªž;¼ac·f‘M7_n¢ò'UµÙ4Únµ¦£F)IJמmVþ¬]Ïï"YÞK¦ ‹É¾r…õÞh!‘«}Q)Œ:w#¢áV#ãr´*îdŽxã„ -ššoîh÷ÖóÆã\VB6W-­EÕk3¤ß•Ù¯G˜¶Ä“üõœ‘úÎ`´N!:ø¯­‘‘A`BilÌìñsÔ‚Ø­ • ΈéöW%™Œ=PnÜ?Y’Âoj¬äŸÈåcû³…kËúµ‚ƒå­_×±üŠ?<…°‚Y“¶<%óëì-ç(Ù^_.äõ_ÍÇÆØÄ .ýüïšU†«/ÿ5¸©?õp„Eõ®êDcž£]Í„¢˜Œpq@NQ‘ÛH´/(+† Æ‹‚6JóP¸“^9{:ÇD—Üà&¯«Š.I±w퇊 `ÏÄP'¦˜:í~a +%ÁðšQ5ÖR}0otP· úa ­3•å@`ý²•ä—¶š:åsS ( ¡ïu瞈2v^—¶>=~æ´{ÿˆØ2ÙÊ,|ä©Ldƒ«oQ]šQuÇ)¡j(lœµ|ç‹‰ZwÊÝíÿP;Ö–Ö&#Øo|×åqm“âÄ4Œ N§n‰ ¢p!þDO=<û̓}‘gIÓQ Œ,¹Û½ÌÞ ÚaWr*Ê´âAýܤ°é­Æì¢CV¶‰V¸j¢H„Ï!(¾oKÌßjÙIÛÞ‹XÆ¥ìö—çq_ˆÛm ø5%•cãÌS8hîhµ qéÁ ÚŇò À€:ÄÀ%Bþ4ëY‡,$þH$6:ÍíÝ.DÅì ¾i2ÿ÷ZÖ&¤Å2G”Z(Ës‰ë`d¬l±ƒ-Ý{Ö“ÄHw¦-} T|ð³B°DˆÑ W"(ÖgŽßfqa#%•ö™•‘ûp[ö:-ŠÁO¶Jþ¶i¶Ízj7Wë :™ÅöÈŽ‹^ð‚3›Õ楦#ú»zçiö4ÞVŠãÛw)·yÕ’°ÂZ:ˆ/ëÜí|6é¦þç%ÿ&°‹I?+z˜yPYT“65އþÉ´ÞäVŸ»ÕÎ S«||.ËÍ`’?)á'˜Pù$Dêð|3ÙÊžÔD~§†¿–³øñŒÇá±qøjÔ~ õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wó¡E]Q ­Céà “]d½úò•@BÏòlU¥!j‰áêGWAkuû}¯=¬ñvCTìòòÓ]@ãÖÏuñx¡$§ª©¸œ•œ`(0áojT(%€¾:mvéÙpY´cG|!Æ/\6iD=ADÒXIK¿"‰3ˆR~Û‡•³x^.c³ôŸÛ®D}Wº©µÙ#xØÿCçùäJà8ÇcñÂpóAI•²(ï_ƒÒ›à4©«—£ÂÊêdŒöT…•šTOÃ-¬5 ãR¢‚Wó5ð!`@?\ͨSa‹‚;ýIRÒh½-a[­CÊ|•OÈ–É9J³&…U?5–?5›&òiYxcÖ Îë Deëþ÷8]gWÇô¦/u˜£§Ž}­9l’ŠÝS'&@ª°ö5SL>»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘[].ð­¢Sk@D¢}*¦®öøBÞ .i_ ð ÐúôO‰Hù.Ÿ~g²hš.‡»¡T#ݳŒø §€Íж 'ŸÏ$6n ¾Pîo Q,n$Y‘8­?V·:®nºî¥hˆÿZòZƒ¦Ñ½)þ@Ä•ÐMþÿJéƒ Åþ¾Ø‰;‹ª§2OlI…Ò _ûUQá™Oî§­›¹Ñ:µ­V”fŽÉ[Ò@œ_¬ÓölÑÕ D¯K¢ªOåöÁÍv8(( rï™GC·-uVL·‚tX¬Gýãá;¿üžFz&dL}áLßîɶÛmê8ð z@!)”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ"œ÷¬ÂÄByK 9tßÃfG)?gcíÏ(Ô€X²iÊ_yAçé@èꥺJ=à¢WÐ+Æ}Àܽ†ø¡ÝX6àpÛŽ#¼þ)n™ï´AÒÄOù Dcù´³YZö~À}_áÁÎo#xq“3}+¸9ÑLC¾: ²½Düu §“îíƒ3&%9m¤9®á"åö÷Ó}½_o¢'ðöËíô¾Ýñ¾ßCßáìa‹íî¶ûw:û{ðþ²ÀðÂÔ)O–Ô#3E¢4â.Í«ö¬ §uƒQ’Ÿ é±kÔÓÚ@qVK!s"@ëãú®ž³1 kReêíGhÜØÚø¨ Ÿ ãJ;M‰Ó·J7—§:b*;Íó°¿žççÛì¸_e9CÅHžrŸ•M©Í³! ocþoÚK¶AÒ)H‹€ÿOÊœL½‘£*Nî}´ÓZ=ÈüÔ~µÏ°ŠY j|׌e÷ò 8MýÐàiˆxŸð©âÛ×ø2±ô°‰fëu7i¿áÅKÁ ‚ŠnRü7;³IL¼ ]=/«ÆÇTlhI ‚vÃKýÍç0úÒzê.Üû9nrŒk ëV{x±6œ˜‘ü ;Ê8ž–û³õ¹+‘J!Í6LUQGò$¡b°&‡ð ôó Éö}®ìÆ•Z÷ê[þþÍ‘î§÷ôîµö“˜‚ã bÈ RãðÉB ¯µE4uk˜Ïs¡›ýöÔêæ8Ø ´ÔQàcqgö0T+®Ž·9eŽÖÏ™žMÒ»Ð4[b" û#ÂÀHzÉ1,?¿À¾[É=®ÁXËl!P¬°wx)Šž ®ù·ÍU”(Æ…(|T\‡pMQ`¦7¹q˜åÞo.K»ÑÞã¯ÅÁ›öRÇx\÷Œ]ƶÙ׽ðff í¦oîGôѺP}>6Çæ½Û0ò¹¤n»vΙll¾V˜w·Àï|Û=|š•™!ZaÝΚ8ŸX¨qÙ1IÅ®¶`Ó7„+øƒŠwÉB43> ÐKÅÔ?ëàHg_óµUšo“Þ+_ˆ|ÍóQË ²©¤BæÍ3)U¦NÒ¯Z“Ÿ^âjY¿%}åW@˜I!FL0¸LA…ýE'¨M@Ñ"=š{©n´òj ŒFXÀÅõQéý¨É¡ªßE8¨&WYj­äYZÁ¾‚pѶŒé qã-ïå ùÐk¾ C;¤Æ4Æ6uß«%BâuhEXsûŒfŒ=~¼nHwÅaSž¼¨ïx”'˲h:uÞL­ÅFím3F’f몊'iy\G½ãÄp?-Dk£2<^–ü}¾x‡ q£èCÊ.¡:é<ÙÔøIì^öÚ¢©ÉŠ)w,IÐ@oô}=éÑ] â£cø/„?”àunî¿Ìó¸½öÜ–ê¯;íŠÀf£mg¢ãàï^ƒä·+¤|ÈPÍÂR\±Ö°{öÙ£@­¹øÈV¬ÁÂ8¶‘ÇãKRiP[à Ü®À#!âÍqfk¦¸:S»ˆlæ±’F‡Í2„{±Å7pºv÷Ãàòk³‘wœÜ:a7 wñÞfRTa]²]cWÚ(mÂ_zí;,œlÍ¥ÄMÕµÈNÄúB¥m&øL·ZšÂuêýºÆ&mÊ%!]ƒ0ùD,;ª™ÌX¥½Þè¸ëô@‡Æ‘¯Ò,” MÞEˆ«³h3üc‹Aknù"„èuØðͪ¥N]ºm£©e D‡—æq½òMAœn3©Öô¸àè¡UUåØ Ü\?ÂC¹>ã ùh…Œ«ñ™×!ñ:ŸÞ³YŠGígµÛYå½# ù4O›`ßrXÿ8…2Þ?5âÓµ‘o“ö8wðD7uK^¼oz¨%Uñ€ÇÅ[¥§—Ž÷•¾R?+Ú¯() ~¼þ´‡übô¨Øs &€’¸ñVíÊMÏ@ÅF{ ,MBÍêâ‡Ôi b¡?þ°CŠÒÎÔt˜¤»¢wÄÏà—XX9€zó 7c<†>a?â©„ïÞüt'Ñwˆ%hÏSh’AwÈ{Q]é½UpëÊ ÖÅu^?è‘ø[´µ¿¡þ18¢X p¬á@£%ÎìÊ0›÷pøG1Š"W»:´v­ð’•C«ÛkÁ¾eÅ0>­á6«È(=õf¥üý9L'Š”¢H€t"1„XÙ `n‰"í¡h0‰>qЙ5 t^S FFïB¨øœaºœ5”Ýaj7VçÑ/9ªÆ^p¸PÄxø¢ªz³WK.Ôög„u¾€mÊP:ÒdµªY”<ÛYé ÆÃºfJœäF›¨î¹&Nȧ©PÜ—\TnͲò¶ÚŠüQ‚ =S•¹y`¿è‘Ý «¥Ýc®ÃÚƒè)¡ýÀ#Øz8¯z‡‚Ï ¥Ä‘”ŒOÂ}¨X²¢Ü:Kñ=™¹o{?™Òêa'Oi½ß¸ˆ|æ7/3æ(®&ôk%Z— Ó0x?«7(¸ãÿ'=«Ì oe˜ Áìæú0âë¹²÷tÁÌã^„:…9q¼Øj »u ?Øß ´ÓH¼ŸuDÁM&b?Ç—tŸuŽ)kML³VØÎp²õmÙ/æuïX'ûÀÏ“¢å>í±’%ë@£Û5ô(ùGXÇpÿ )yU'éwõ˜¶!Ù) ¯˜”AêøÌ…|²Í–=£À¬ìQÒ¿$eè°eQ hÿYÍ7k|ù êÂ.ÛˆP!gN´ÓhK¶´Á  ²£ÙPëcm:löa„ÔþŽó©Ë[†é»}¡ƒ²Lf³œ?¿ŸŒI„c4F©ã†J½{>ôâÿp`<\"4£·S\SÉç~­âòw@Ê…—ûYAx"÷wbÍÈ1d‡ÙöLF´™+]«vÛœ;w ‡þfg8@‚›ýçiVwìU9Ñ.]-Ó.¦µè¶Ã‹pÀMò,Sa>ú?»¢%ÍmˆÌù;fÞà Y|u*_zߺMx±lö¿'ñ´P̽ ™´,€”Š"1`Ëäd/ïHïM`uE‰­eûêæžåª–@ øíû=æ£Wˆç»u¬>€e|ªêïàcŪ† ‘#ÔlNyñ“Œ >´­3ï=úda¦™(¯B†r:¡ã–wc¿ü¡»Íކ’—¬éÒF bì§€.gøgÑYyÁ{X7n (ÓI³\tXÎmNeðP:žBË&‘Ë·¨uãÔç+|´æ:è}¦BÛƒ‰þÄÑXøÔî,äˆG¥-Ä;Û‹ÿdŸŒS–6bT}ý5>uR`!áêe¯¯sú oÌÆÕú>Ÿßy®B>…þÉáLü¨¥Ä†îÈE<3a™A«®ÇxÅ{WtÝC«z"Ø-SsµQÅ0÷xììСQ†Bø‚`7|Ö:¬ªí.xF€ß·äΓ/8”õYV‚Ŧw’“(zó!ëÿƒ«ï¤¦&ë\SÒ"«ÓÆ´›¾hæý…Y¿‘‘I…\c'ÑrÝeDät8€E¤EÆHVK«áÂjd”¿%ŽÊÛâŠuÎ|R¸®ì†Z%.@²õ¥ ýÑšÂp½y*¼4ð¡hf´\}–ßcÒ6)àR?Bû ZúÁëÏ]D-ñ=Z'Ç€æ’9ŸÈh²ƒjÄ“tíã‹×ì;`˜›DÍøí€~|0]jTåéÿL_5$>·/§ »i`ÿ4êž@*bC žÀgÓÅÃGÁ‹óËÓÝ>0Š‹F˲7íæþqþùßnyó|.€ýñýû¿%4².zÄx6ê.É`TyR‚ô³¸^}‹8Xl¢,8Héu¾õ¶}hž-Ï9—‡b^× p<ÝË–ïašzÔÚÿ)ÑC Â\iæ”Vhwº#S“.yiJrØk?~^ yýK^[hö?ÿxo[_¬Щ¦´e¬( ­œÒ)üêu§pK Ë öº EFXéÐÿ‡X$c©a’d®Þt%:¸ž‰Nýì OžB*cBpês ß¹A ·ÿãÛ±HÿTÀµÒš‚»D@Ï”J\…ë§<`ž‚ô«´Œ×¨–6ß)'Eò!Îü–V1¦¿7I€öá¾^”Ïêl÷Û5*¨Ûk9°¹Ï&¡¯A†@pI¹ûî¿¿Õ„~¿Ï öòÉåÇȼ­h¥ºåFAÙÒyü S‘¢ÑKrîgƲ°´Ò^Q$É–Vø‚N¯3!U†DR€ÄõŒžöW^±¹Z´ @àº$Ö»Ó¶ ºúí¾Æ1ŒcÆ1Œ`‡5lÞÉRÓXùMÛ7ÅÆk·Ys}Õ3ß)•e¨ëéBÏ“Ÿ-•†ÿMë5ù‡’µ¶g á`?3à L©µ ipä Z\âeϼcþe,Aš3K({䥓&¸ŸW§êiË/ €È¥³'m\×—£´Ê÷–KzúËÛ Þzp½ òµ,Á {ø4¥œ´-•Òy¥âàãóC.Ò’Â’˜c4ÓÖù6ŠiW§XFfz7kš£dŠÝ‡Û.šp{2)ÆC¬}°ŒRrÌ ‹R‰¡¬iÛ€ÁgÕk‘=4 Pó’T¹»!‰RŽe»¨L˜¶.g6÷ôk÷óЧ;š¡ž{éâô!Þˆ1M¹óö’¬|&ˆóŽ× tÃ4±ì0ò²†Hƒy´]€-ÌÝN€Tlš–íðD?"i‹ZM8¸íƒ5Í=}[צu¸¸Ü©ŽêOÒL¡‹•à@ &å•ÞÇÙ\ÜW”YÐ[¯šûXâM'z*«Ÿ:Êæ&èŽeTà¶ ÅÆ5–V»Vœ+ð[Ù—kÄZp¸ rCëÔÆ´Iel°Žºt'~’tñQ~î‘ïᯭ–{O³(Ù¾Òßóö{·»]÷õäÕ-æãR´í™\.Þ°)ùâIçhÄèõW°«‘;×öÞ”ù³W]ŵþ ³ç}mü]Û{¹dÂãÆgó uü Ã,©ZUQ4v ¨»¨Uˆy˜|—/Hh!:êbš@Dµ3Ï4çòU;ÈÅ£øylNÓºÓr;»X”Bâ°]ŽèGÜùõsøÍÆdš%!€¡gtL¼©²Úÿh½A¡-w%/U’A’f‡M8dÈ©_jåT ~1™…éÉ/¡Ò¬£ ý˜–Õ»>ó!Иzöp91Š‘?œJ†&:ÁðßÓy´[Æ ­¬œluiTà.ŠbÛŸ!ýÆbŒCãpë­ÍëxcôŠp¤™[ïã³aP˜’À ©üÐŽ:©‹4u ¿BCµ•é®Ï?¥…°†fo¨e–²`0EݯŽÿqõÛ1_Èú‰æ¡o;3̯K º…nÞÕñ§Æ9ê§WAJf”ta²Ñ®Ë‹ê|Ðh“#¯ ‚&^«2—ƒôðÛU¼_ae»¤Uì”cñ(w³„m;Œˆ²V“½àPÐH5힯B’Ügßd
%s%s%s, ESC", pvs, pedit, xtra), hgt - 1, 0); } if (do_swap) { do_swap = FALSE; swap(active_menu, inactive_menu); swap(active_cursor, inactive_cursor); panel = 1 - panel; } if (g_funcs.summary && !visual_list) { g_funcs.summary(g_cur, obj_list, g_o_count, g_offset[g_cur], object_menu.active.row + object_menu.active.page_rows, object_region.col); } menu_refresh(inactive_menu, FALSE); menu_refresh(active_menu, FALSE); handle_stuff(p_ptr); if (visual_list) { bigcurs = TRUE; display_visual_list(g_name_len + 3, 7, browser_rows-1, wid - (g_name_len + 3), attr_top, char_left); place_visual_list_cursor(g_name_len + 3, 7, *o_funcs.xattr(oid), *o_funcs.xchar(oid), attr_top, char_left); } if (delay) { /* Force screen update */ Term_fresh(); /* Delay */ Term_xtra(TERM_XTRA_DELAY, delay); delay = 0; } ke = inkey_ex(); if (!visual_list) { ui_event ke0 = EVENT_EMPTY; if (ke.type == EVT_MOUSE) menu_handle_mouse(active_menu, &ke, &ke0); else if (ke.type == EVT_KBRD) menu_handle_keypress(active_menu, &ke, &ke0); if (ke0.type != EVT_NONE) ke = ke0; } /* XXX Do visual mode command if needed */ if (o_funcs.xattr && o_funcs.xchar) { if (visual_mode_command(ke, &visual_list, browser_rows - 1, wid - (g_name_len + 3), &attr_top, &char_left, o_funcs.xattr(oid), (byte *)o_funcs.xchar(oid), g_name_len + 3, 7, &delay)) continue; } switch (ke.type) { case EVT_KBRD: { if (ke.key.code == 'r' || ke.key.code == 'R') recall = TRUE; else if (o_funcs.xtra_act) o_funcs.xtra_act(ke.key, oid); break; } case EVT_MOUSE: { /* Change active panels */ if (region_inside(&inactive_menu->boundary, &ke)) { swap(active_menu, inactive_menu); swap(active_cursor, inactive_cursor); panel = 1-panel; } continue; } case EVT_ESCAPE: { if (panel == 1) do_swap = TRUE; else flag = TRUE; break; } case EVT_SELECT: { if (panel == 0) do_swap = TRUE; else if (panel == 1 && oid >= 0 && o_cur == active_menu->cursor) recall = TRUE; break; } case EVT_MOVE: { *active_cursor = active_menu->cursor; break; } default: { break; } } /* Recall on screen */ if (recall) { if (oid >= 0) o_funcs.lore(oid); redraw = TRUE; } } /* Restore roguelike option */ OPT(rogue_like_commands) = omode; /* Prompt */ if (!grp_cnt) prt(format("No %s known.", title), 15, 0); FREE(g_names); FREE(g_offset); FREE(g_list); screen_load(); } /* * Display visuals. */ static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left) { int i, j; /* Clear the display lines */ for (i = 0; i < height; i++) Term_erase(col, row + i, width); width = logical_width(width); height = logical_height(height); /* Display lines until done */ for (i = 0; i < height; i++) { /* Display columns until done */ for (j = 0; j < width; j++) { byte a; unsigned char c; int x = col + actual_width(j); int y = row + actual_height(i); int ia, ic; ia = attr_top + i; ic = char_left + j; a = (byte)ia; c = (unsigned char)ic; /* Display symbol */ big_pad(x, y, a, c); } } } /* * Place the cursor at the collect position for visual mode */ static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left) { int i = a - attr_top; int j = c - char_left; int x = col + actual_width(j); int y = row + actual_height(i); /* Place the cursor */ Term_gotoxy(x, y); } /* * Remove the visual list and clear the screen */ static void remove_visual_list(int col, int row, bool *visual_list_ptr, int width, int height) { int i; /* No more big cursor */ bigcurs = FALSE; /* Cancel visual list */ *visual_list_ptr = FALSE; /* Clear the display lines */ for (i = 0; i < height; i++) Term_erase(col, row + i, width); } /* * Do visual mode command -- Change symbols */ static bool visual_mode_command(ui_event ke, bool *visual_list_ptr, int height, int width, byte *attr_top_ptr, byte *char_left_ptr, byte *cur_attr_ptr, byte *cur_char_ptr, int col, int row, int *delay) { static byte attr_old = 0; static char char_old = 0; /* These are the distance we want to maintain between the * cursor and borders. */ int frame_left = logical_width(10); int frame_right = logical_width(10); int frame_top = logical_height(4); int frame_bottom = logical_height(4); /* Get mouse movement */ if (ke.type == EVT_MOUSE) { int eff_width = actual_width(width); int eff_height = actual_height(height); byte a = *cur_attr_ptr; byte c = *cur_char_ptr; int my = logical_height(ke.mouse.y - row); int mx = logical_width(ke.mouse.x - col); if ((my >= 0) && (my < eff_height) && (mx >= 0) && (mx < eff_width) && ((ke.mouse.button) || (a != *attr_top_ptr + my) || (c != *char_left_ptr + mx))) { /* Set the visual */ *cur_attr_ptr = a = *attr_top_ptr + my; *cur_char_ptr = c = *char_left_ptr + mx; /* Move the frame */ if (*char_left_ptr > MAX(0, (int)c - frame_left)) (*char_left_ptr)--; if (*char_left_ptr + eff_width <= MIN(255, (int)c + frame_right)) (*char_left_ptr)++; if (*attr_top_ptr > MAX(0, (int)a - frame_top)) (*attr_top_ptr)--; if (*attr_top_ptr + eff_height <= MIN(255, (int)a + frame_bottom)) (*attr_top_ptr)++; /* Delay */ *delay = 100; /* Accept change */ if (ke.mouse.button) remove_visual_list(col, row, visual_list_ptr, width, height); return TRUE; } /* Cancel change */ else if (ke.mouse.button) { *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_visual_list(col, row, visual_list_ptr, width, height); return TRUE; } else { return FALSE; } } if (ke.type != EVT_KBRD) return FALSE; switch (ke.key.code) { case ESCAPE: { if (*visual_list_ptr) { /* Cancel change */ *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_visual_list(col, row, visual_list_ptr, width, height); return TRUE; } break; } case '\n': case '\r': { if (*visual_list_ptr) { /* Accept change */ remove_visual_list(col, row, visual_list_ptr, width, height); return TRUE; } break; } case 'V': case 'v': { if (!*visual_list_ptr) { *visual_list_ptr = TRUE; bigcurs = TRUE; *attr_top_ptr = (byte)MAX(0, (int)*cur_attr_ptr - frame_top); *char_left_ptr = (char)MAX(0, (int)*cur_char_ptr - frame_left); attr_old = *cur_attr_ptr; char_old = *cur_char_ptr; } else { /* Cancel change */ *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_visual_list(col, row, visual_list_ptr, width, height); } return TRUE; } case 'C': case 'c': { /* Set the visual */ attr_idx = *cur_attr_ptr; char_idx = *cur_char_ptr; return TRUE; } case 'P': case 'p': { if (attr_idx) { /* Set the char */ *cur_attr_ptr = attr_idx; *attr_top_ptr = (byte)MAX(0, (int)*cur_attr_ptr - frame_top); } if (char_idx) { /* Set the char */ *cur_char_ptr = char_idx; *char_left_ptr = (char)MAX(0, (int)*cur_char_ptr - frame_left); } return TRUE; } default: { int d = target_dir(ke.key); byte a = *cur_attr_ptr; byte c = *cur_char_ptr; if (!*visual_list_ptr) break; bigcurs = TRUE; /* Restrict direction */ if ((a == 0) && (ddy[d] < 0)) d = 0; if ((c == 0) && (ddx[d] < 0)) d = 0; if ((a == 255) && (ddy[d] > 0)) d = 0; if ((c == 255) && (ddx[d] > 0)) d = 0; a += ddy[d]; c += ddx[d]; /* Set the visual */ *cur_attr_ptr = a; *cur_char_ptr = c; /* Move the frame */ if (ddx[d] < 0 && *char_left_ptr > MAX(0, (int)c - frame_left)) (*char_left_ptr)--; if ((ddx[d] > 0) && *char_left_ptr + (width / tile_width) <= MIN(255, (int)c + frame_right)) (*char_left_ptr)++; if (ddy[d] < 0 && *attr_top_ptr > MAX(0, (int)a - frame_top)) (*attr_top_ptr)--; if (ddy[d] > 0 && *attr_top_ptr + (height / tile_height) <= MIN(255, (int)a + frame_bottom)) (*attr_top_ptr)++; /* We need to always eat the input even if it is clipped, * otherwise it will be interpreted as a change object * selection command with messy results. */ return TRUE; } } /* Visual mode command is not used */ return FALSE; } /* The following sections implement "subclasses" of the * abstract classes represented by member_funcs and group_funcs */ /* =================== MONSTERS ==================================== */ /* Many-to-many grouping - use default auxiliary join */ /* * Display a monster */ static void display_monster(int col, int row, bool cursor, int oid) { /* HACK Get the race index. (Should be a wrapper function) */ int r_idx = default_join[oid].oid; /* Access the race */ monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Choose colors */ byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; byte a = r_ptr->x_attr; byte c = r_ptr->x_char; if ((tile_height != 1) && (a & 0x80)) { a = r_ptr->d_attr; c = r_ptr->d_char; /* If uniques are purple, make it so */ if (OPT(purple_uniques) && rf_has(r_ptr->flags, RF_UNIQUE)) a = TERM_VIOLET; } /* If uniques are purple, make it so */ else if (OPT(purple_uniques) && !(a & 0x80) && rf_has(r_ptr->flags, RF_UNIQUE)) a = TERM_VIOLET; /* Display the name */ c_prt(attr, r_ptr->name, row, col); /* Display symbol */ big_pad(66, row, a, c); /* Display kills */ if (rf_has(r_ptr->flags, RF_UNIQUE)) put_str(format("%s", (r_ptr->max_num == 0)? " dead" : "alive"), row, 70); else put_str(format("%5d", l_ptr->pkills), row, 70); } static int m_cmp_race(const void *a, const void *b) { const monster_race *r_a = &r_info[default_join[*(const int *)a].oid]; const monster_race *r_b = &r_info[default_join[*(const int *)b].oid]; int gid = default_join[*(const int *)a].gid; /* Group by */ int c = gid - default_join[*(const int *)b].gid; if (c) return c; /* Order results */ c = r_a->d_char - r_b->d_char; if (c && gid != 0) { /* UNIQUE group is ordered by level & name only */ /* Others by order they appear in the group symbols */ return strchr(monster_group[gid].chars, r_a->d_char) - strchr(monster_group[gid].chars, r_b->d_char); } c = r_a->level - r_b->level; if (c) return c; return strcmp(r_a->name, r_b->name); } static char *m_xchar(int oid) { return &r_info[default_join[oid].oid].x_char; } static byte *m_xattr(int oid) { return &r_info[default_join[oid].oid].x_attr; } static const char *race_name(int gid) { return monster_group[gid].name; } static void mon_lore(int oid) { /* Update the monster recall window */ monster_race_track(default_join[oid].oid); handle_stuff(p_ptr); /* Save the screen */ screen_save(); /* Describe */ text_out_hook = text_out_to_screen; /* Recall monster */ roff_top(default_join[oid].oid); Term_gotoxy(0, 2); describe_monster(default_join[oid].oid, FALSE); text_out_c(TERM_L_BLUE, "\n[Press any key to continue]\n"); (void)anykey(); /* Load the screen */ screen_load(); } static void mon_summary(int gid, const int *object_list, int n, int top, int row, int col) { int i; int kills = 0; /* Access the race */ for (i = 0; i < n; i++) { int oid = default_join[object_list[i+top]].oid; kills += l_list[oid].pkills; } /* Different display for the first item if we've got uniques to show */ if (gid == 0 && rf_has((&r_info[default_join[object_list[0]].oid])->flags, RF_UNIQUE)) { c_prt(TERM_L_BLUE, format("%d known uniques, %d slain.", n, kills), row, col); } else { int tkills = 0; for (i = 0; i < z_info->r_max; i++) tkills += l_list[i].pkills; c_prt(TERM_L_BLUE, format("Creatures slain: %d/%d (in group/in total)", kills, tkills), row, col); } } static int count_known_monsters(void) { int m_count = 0; int i; size_t j; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (!OPT(cheat_know) && !l_list[i].sights) continue; if (!r_ptr->name) continue; if (rf_has(r_ptr->flags, RF_UNIQUE)) m_count++; for (j = 1; j < N_ELEMENTS(monster_group) - 1; j++) { const char *pat = monster_group[j].chars; if (strchr(pat, r_ptr->d_char)) m_count++; } } return m_count; } /* * Display known monsters. */ static void do_cmd_knowledge_monsters(const char *name, int row) { group_funcs r_funcs = {N_ELEMENTS(monster_group), FALSE, race_name, m_cmp_race, default_group, mon_summary}; member_funcs m_funcs = {display_monster, mon_lore, m_xchar, m_xattr, recall_prompt, 0, 0}; int *monsters; int m_count = 0; int i; size_t j; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (!OPT(cheat_know) && !l_list[i].sights) continue; if (!r_ptr->name) continue; if (rf_has(r_ptr->flags, RF_UNIQUE)) m_count++; for (j = 1; j < N_ELEMENTS(monster_group) - 1; j++) { const char *pat = monster_group[j].chars; if (strchr(pat, r_ptr->d_char)) m_count++; } } default_join = C_ZNEW(m_count, join_t); monsters = C_ZNEW(m_count, int); m_count = 0; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (!OPT(cheat_know) && !l_list[i].sights) continue; if (!r_ptr->name) continue; for (j = 0; j < N_ELEMENTS(monster_group)-1; j++) { const char *pat = monster_group[j].chars; if (j == 0 && !rf_has(r_ptr->flags, RF_UNIQUE)) continue; else if (j > 0 && !strchr(pat, r_ptr->d_char)) continue; monsters[m_count] = m_count; default_join[m_count].oid = i; default_join[m_count++].gid = j; } } display_knowledge("monsters", monsters, m_count, r_funcs, m_funcs, " Sym Kills"); FREE(default_join); FREE(monsters); } /* =================== ARTIFACTS ==================================== */ /* Many-to-one grouping */ static void get_artifact_display_name(char *o_name, size_t namelen, int a_idx) { object_type object_type_body = { 0 }; object_type *o_ptr = &object_type_body; make_fake_artifact(o_ptr, &a_info[a_idx]); object_desc(o_name, namelen, o_ptr, ODESC_PREFIX | ODESC_BASE | ODESC_SPOIL); } /* * Display an artifact label */ static void display_artifact(int col, int row, bool cursor, int oid) { byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; char o_name[80]; get_artifact_display_name(o_name, sizeof o_name, oid); c_prt(attr, o_name, row, col); } static object_type *find_artifact(struct artifact *artifact) { int i, j; /* Look for the artifact, either in inventory, store or the object list */ for (i = 0; i < z_info->o_max; i++) { if (object_byid(i)->artifact == artifact) return object_byid(i); } for (i = 0; i < INVEN_TOTAL; i++) { if (p_ptr->inventory[i].artifact == artifact) return &p_ptr->inventory[i]; } for (j = 1; j < (FEAT_SHOP_TAIL - FEAT_SHOP_HEAD + 1); j++) { for (i = 0; i < stores[j].stock_size; i++) { if (stores[j].stock[i].artifact == artifact) return &stores[j].stock[i]; } } return NULL; } /* * Show artifact lore */ static void desc_art_fake(int a_idx) { object_type *o_ptr; object_type object_type_body = { 0 }; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; o_ptr = find_artifact(&a_info[a_idx]); /* If it's been lost, make a fake artifact for it */ if (!o_ptr) { o_ptr = &object_type_body; make_fake_artifact(o_ptr, &a_info[a_idx]); o_ptr->ident |= IDENT_NAME; /* Check the history entry, to see if it was fully known before it * was lost */ if (history_is_artifact_known(o_ptr->artifact)) object_notice_everything(o_ptr); } /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); #if 0 /* XXX This should be in object_info */ if (lost) text_out("\nThis artifact has been lost."); #endif } static int a_cmp_tval(const void *a, const void *b) { const artifact_type *a_a = &a_info[*(const int *)a]; const artifact_type *a_b = &a_info[*(const int *)b]; /* group by */ int ta = obj_group_order[a_a->tval]; int tb = obj_group_order[a_b->tval]; int c = ta - tb; if (c) return c; /* order by */ c = a_a->sval - a_b->sval; if (c) return c; return strcmp(a_a->name, a_b->name); } static const char *kind_name(int gid) { return object_text_order[gid].name; } static int art2gid(int oid) { return obj_group_order[a_info[oid].tval]; } /* Check if the given artifact idx is something we should "Know" about */ static bool artifact_is_known(int a_idx) { object_type *o_ptr; if (!a_info[a_idx].name) return FALSE; if (p_ptr->wizard) return TRUE; if (!a_info[a_idx].created) return FALSE; /* Check all objects to see if it exists but hasn't been IDed */ o_ptr = find_artifact(&a_info[a_idx]); if (o_ptr && !object_is_known_artifact(o_ptr)) return FALSE; return TRUE; } /* If 'artifacts' is NULL, it counts the number of known artifacts, otherwise it collects the list of known artifacts into 'artifacts' as well. */ static int collect_known_artifacts(int *artifacts, size_t artifacts_len) { int a_count = 0; int j; if (artifacts) assert(artifacts_len >= z_info->a_max); for (j = 0; j < z_info->a_max; j++) { /* Artifact doesn't exist */ if (!a_info[j].name) continue; if (OPT(cheat_xtra) || artifact_is_known(j)) { if (artifacts) artifacts[a_count++] = j; else a_count++; } } return a_count; } /* * Display known artifacts */ static void do_cmd_knowledge_artifacts(const char *name, int row) { /* HACK -- should be TV_MAX */ group_funcs obj_f = {TV_GOLD, FALSE, kind_name, a_cmp_tval, art2gid, 0}; member_funcs art_f = {display_artifact, desc_art_fake, 0, 0, recall_prompt, 0, 0}; int *artifacts; int a_count = 0; artifacts = C_ZNEW(z_info->a_max, int); /* Collect valid artifacts */ a_count = collect_known_artifacts(artifacts, z_info->a_max); display_knowledge("artifacts", artifacts, a_count, obj_f, art_f, NULL); FREE(artifacts); } /* =================== EGO ITEMS ==================================== */ /* Many-to-many grouping (uses default join) */ /* static u16b *e_note(int oid) {return &e_info[default_join[oid].oid].note;} */ static const char *ego_grp_name(int gid) { return object_text_order[gid].name; } static void display_ego_item(int col, int row, bool cursor, int oid) { /* HACK: Access the object */ ego_item_type *e_ptr = &e_info[default_join[oid].oid]; /* Choose a color */ byte attr = curs_attrs[0 != (int)e_ptr->everseen][0 != (int)cursor]; /* Display the name */ c_prt(attr, e_ptr->name, row, col); } /* * Describe fake ego item "lore" */ static void desc_ego_fake(int oid) { int e_idx = default_join[oid].oid; struct ego_item *ego = &e_info[e_idx]; textblock *tb; region area = { 0, 0, 0, 0 }; /* List ego flags */ tb = object_info_ego(ego); textui_textblock_show(tb, area, format("%s %s", ego_grp_name(default_group(oid)), ego->name)); textblock_free(tb); } /* TODO? Currently ego items will order by e_idx */ static int e_cmp_tval(const void *a, const void *b) { const ego_item_type *ea = &e_info[default_join[*(const int *)a].oid]; const ego_item_type *eb = &e_info[default_join[*(const int *)b].oid]; /* Group by */ int c = default_join[*(const int *)a].gid - default_join[*(const int *)b].gid; if (c) return c; /* Order by */ return strcmp(ea->name, eb->name); } /* * Display known ego_items */ static void do_cmd_knowledge_ego_items(const char *name, int row) { group_funcs obj_f = {TV_GOLD, FALSE, ego_grp_name, e_cmp_tval, default_group, 0}; member_funcs ego_f = {display_ego_item, desc_ego_fake, 0, 0, recall_prompt, 0, 0}; int *egoitems; int e_count = 0; int i, j; /* HACK: currently no more than 3 tvals for one ego type */ egoitems = C_ZNEW(z_info->e_max * EGO_TVALS_MAX, int); default_join = C_ZNEW(z_info->e_max * EGO_TVALS_MAX, join_t); for (i = 0; i < z_info->e_max; i++) { if (e_info[i].everseen || OPT(cheat_xtra)) { for (j = 0; j < EGO_TVALS_MAX && e_info[i].tval[j]; j++) { int gid = obj_group_order[e_info[i].tval[j]]; /* Ignore duplicate gids */ if (j > 0 && gid == default_join[e_count - 1].gid) continue; egoitems[e_count] = e_count; default_join[e_count].oid = i; default_join[e_count++].gid = gid; } } } display_knowledge("ego items", egoitems, e_count, obj_f, ego_f, NULL); FREE(default_join); FREE(egoitems); } /* =================== ORDINARY OBJECTS ==================================== */ /* Many-to-one grouping */ /* * Looks up an artifact idx given an object_kind *that's already known * to be an artifact*. Behaviour is distinctly unfriendly if passed * flavours which don't correspond to an artifact. */ static int get_artifact_from_kind(object_kind *kind) { int i; assert(of_has(kind->flags, OF_INSTA_ART)); /* Look for the corresponding artifact */ for (i = 0; i < z_info->a_max; i++) { if (kind->tval == a_info[i].tval && kind->sval == a_info[i].sval) { break; } } assert(i < z_info->a_max); return i; } /* * Display the objects in a group. */ static void display_object(int col, int row, bool cursor, int oid) { object_kind *kind = &k_info[oid]; const char *inscrip = get_autoinscription(kind); char o_name[80]; /* Choose a color */ bool aware = (!kind->flavor || kind->aware); byte attr = curs_attrs[(int)aware][(int)cursor]; /* Find graphics bits -- versions of the object_char and object_attr defines */ bool use_flavour = (kind->flavor) && !(aware && kind->tval == TV_SCROLL); byte a = use_flavour ? kind->flavor->x_attr : kind->x_attr; byte c = use_flavour ? kind->flavor->x_char : kind->x_char; /* Display known artifacts differently */ if (of_has(kind->flags, OF_INSTA_ART) && artifact_is_known(get_artifact_from_kind(kind))) get_artifact_display_name(o_name, sizeof(o_name), get_artifact_from_kind(kind)); else object_kind_name(o_name, sizeof(o_name), kind, OPT(cheat_know)); /* If the type is "tried", display that */ if (kind->tried && !aware) my_strcat(o_name, " {tried}", sizeof(o_name)); /* Display the name */ c_prt(attr, o_name, row, col); /* Show squelch status */ if ((aware && kind_is_squelched_aware(kind)) || (!aware && kind_is_squelched_unaware(kind))) c_put_str(attr, "Yes", row, 46); /* Show autoinscription if around */ if (aware && inscrip) c_put_str(TERM_YELLOW, inscrip, row, 55); if (tile_height == 1) { big_pad(76, row, a, c); } } /* * Describe fake object */ static void desc_obj_fake(int k_idx) { object_kind *kind = &k_info[k_idx]; object_type object_type_body; object_type *o_ptr = &object_type_body; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; /* Check for known artifacts, display them as artifacts */ if (of_has(kind->flags, OF_INSTA_ART) && artifact_is_known(get_artifact_from_kind(kind))) { desc_art_fake(get_artifact_from_kind(kind)); return; } /* Update the object recall window */ track_object_kind(k_idx); handle_stuff(p_ptr); /* Wipe the object */ object_wipe(o_ptr); /* Create the artifact */ object_prep(o_ptr, kind, 0, EXTREMIFY); /* Hack -- its in the store */ if (kind->aware) o_ptr->ident |= (IDENT_STORE); /* It's fully know */ if (!kind->flavor) object_notice_everything(o_ptr); /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); } static int o_cmp_tval(const void *a, const void *b) { const object_kind *k_a = &k_info[*(const int *)a]; const object_kind *k_b = &k_info[*(const int *)b]; /* Group by */ int ta = obj_group_order[k_a->tval]; int tb = obj_group_order[k_b->tval]; int c = ta - tb; if (c) return c; /* Order by */ c = k_a->aware - k_b->aware; if (c) return -c; /* aware has low sort weight */ switch (k_a->tval) { case TV_LIGHT: case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: case TV_DRAG_ARMOR: /* leave sorted by sval */ break; default: if (k_a->aware) return strcmp(k_a->name, k_b->name); /* Then in tried order */ c = k_a->tried - k_b->tried; if (c) return -c; return strcmp(k_a->flavor->text, k_b->flavor->text); } return k_a->sval - k_b->sval; } static int obj2gid(int oid) { return obj_group_order[k_info[oid].tval]; } static char *o_xchar(int oid) { object_kind *kind = objkind_byid(oid); if (!kind->flavor || kind->aware) return &kind->x_char; else return &kind->flavor->x_char; } static byte *o_xattr(int oid) { object_kind *kind = objkind_byid(oid); if (!kind->flavor || kind->aware) return &kind->x_attr; else return &kind->flavor->x_attr; } /* * Display special prompt for object inscription. */ static const char *o_xtra_prompt(int oid) { object_kind *k = objkind_byid(oid); const char *no_insc = ", 's' to toggle squelch, 'r'ecall, '{'"; const char *with_insc = ", 's' to toggle squelch, 'r'ecall, '{', '}'"; /* Forget it if we've never seen the thing */ if (k->flavor && !k->aware) return ""; return k->note ? with_insc : no_insc; } /* * Special key actions for object inscription. */ static void o_xtra_act(struct keypress ch, int oid) { object_kind *k = objkind_byid(oid); /* Toggle squelch */ if (squelch_tval(k->tval) && (ch.code == 's' || ch.code == 'S')) { if (k->aware) { if (kind_is_squelched_aware(k)) kind_squelch_clear(k); else kind_squelch_when_aware(k); } else { if (kind_is_squelched_unaware(k)) kind_squelch_clear(k); else kind_squelch_when_unaware(k); } return; } /* Forget it if we've never seen the thing */ if (k->flavor && !k->aware) return; /* Uninscribe */ if (ch.code == '}') { if (k->note) remove_autoinscription(oid); } else if (ch.code == '{') { /* Inscribe */ char note_text[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Inscribe with: ", 0, 0); /* Default note */ if (k->note) strnfmt(note_text, sizeof(note_text), "%s", get_autoinscription(k)); /* Get an inscription */ if (askfor_aux(note_text, sizeof(note_text), NULL)) { /* Remove old inscription if existent */ if (k->note) remove_autoinscription(oid); /* Add the autoinscription */ add_autoinscription(oid, note_text); /* Notice stuff (later) */ p_ptr->notice |= (PN_AUTOINSCRIBE); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Reload the screen */ screen_load(); } } /* * Display known objects */ void textui_browse_object_knowledge(const char *name, int row) { group_funcs kind_f = {TV_GOLD, FALSE, kind_name, o_cmp_tval, obj2gid, 0}; member_funcs obj_f = {display_object, desc_obj_fake, o_xchar, o_xattr, o_xtra_prompt, o_xtra_act, 0}; int *objects; int o_count = 0; int i; object_kind *kind; objects = C_ZNEW(z_info->k_max, int); for (i = 0; i < z_info->k_max; i++) { kind = &k_info[i]; /* It's in the list if we've ever seen it, or it has a flavour, * and either it's not one of the special artifacts, or if it is, * we're not aware of it yet. This way the flavour appears in the list * until it is found. */ if ((kind->everseen || kind->flavor || OPT(cheat_xtra)) && (!of_has(kind->flags, OF_INSTA_ART) || !artifact_is_known(get_artifact_from_kind(kind)))) { int c = obj_group_order[k_info[i].tval]; if (c >= 0) objects[o_count++] = i; } } display_knowledge("known objects", objects, o_count, kind_f, obj_f, "Squelch Inscribed Sym"); FREE(objects); } /* =================== TERRAIN FEATURES ==================================== */ /* Many-to-one grouping */ /* * Display the features in a group. */ static void display_feature(int col, int row, bool cursor, int oid ) { feature_type *f_ptr = &f_info[oid]; byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; c_prt(attr, f_ptr->name, row, col); if (tile_height == 1) { /* Display symbols */ col = 66; col += big_pad(col, row, f_ptr->x_attr[FEAT_LIGHTING_DARK], f_ptr->x_char[FEAT_LIGHTING_DARK]); col += big_pad(col, row, f_ptr->x_attr[FEAT_LIGHTING_LIT], f_ptr->x_char[FEAT_LIGHTING_LIT]); col += big_pad(col, row, f_ptr->x_attr[FEAT_LIGHTING_BRIGHT], f_ptr->x_char[FEAT_LIGHTING_BRIGHT]); } } static int f_cmp_fkind(const void *a, const void *b) { const feature_type *fa = &f_info[*(const int *)a]; const feature_type *fb = &f_info[*(const int *)b]; /* group by */ int c = feat_order(*(const int *)a) - feat_order(*(const int *)b); if (c) return c; /* order by feature name */ return strcmp(fa->name, fb->name); } static const char *fkind_name(int gid) { return feature_group_text[gid]; } /* Disgusting hack to allow 3 in 1 editting of terrain visuals */ static enum grid_light_level f_uik_lighting = FEAT_LIGHTING_LIT; /* XXX needs *better* retooling for multi-light terrain */ static byte *f_xattr(int oid) { return &f_info[oid].x_attr[f_uik_lighting]; } static char *f_xchar(int oid) { return &f_info[oid].x_char[f_uik_lighting]; } static void feat_lore(int oid) { (void)oid; /* noop */ } static const char *feat_prompt(int oid) { (void)oid; return ", 'l' to cycle lighting"; } /* * Special key actions for cycling lighting */ static void f_xtra_act(struct keypress ch, int oid) { /* XXX must be a better way to cycle this */ if (ch.code == 'l') { switch (f_uik_lighting) { case FEAT_LIGHTING_LIT: f_uik_lighting = FEAT_LIGHTING_BRIGHT; break; case FEAT_LIGHTING_BRIGHT: f_uik_lighting = FEAT_LIGHTING_DARK; break; default: f_uik_lighting = FEAT_LIGHTING_LIT; break; } } else if (ch.code == 'L') { switch (f_uik_lighting) { case FEAT_LIGHTING_DARK: f_uik_lighting = FEAT_LIGHTING_BRIGHT; break; case FEAT_LIGHTING_LIT: f_uik_lighting = FEAT_LIGHTING_DARK; break; default: f_uik_lighting = FEAT_LIGHTING_LIT; break; } } } /* * Interact with feature visuals. */ static void do_cmd_knowledge_features(const char *name, int row) { group_funcs fkind_f = {N_ELEMENTS(feature_group_text), FALSE, fkind_name, f_cmp_fkind, feat_order, 0}; member_funcs feat_f = {display_feature, feat_lore, f_xchar, f_xattr, feat_prompt, f_xtra_act, 0}; int *features; int f_count = 0; int i; features = C_ZNEW(z_info->f_max, int); for (i = 0; i < z_info->f_max; i++) { /* Ignore non-features and mimics */ if (f_info[i].name == 0 || f_info[i].mimic != i) continue; features[f_count++] = i; /* Currently no filter for features */ } display_knowledge("features", features, f_count, fkind_f, feat_f, " Sym"); FREE(features); } /* =================== END JOIN DEFINITIONS ================================ */ static void do_cmd_knowledge_store(const char *name, int row) { store_knowledge = row - 5; do_cmd_store_knowledge(); store_knowledge = STORE_NONE; } static void do_cmd_knowledge_scores(const char *name, int row) { show_scores(); } static void do_cmd_knowledge_history(const char *name, int row) { history_display(); } /* * Definition of the "player knowledge" menu. */ static menu_action knowledge_actions[] = { { 0, 0, "Display object knowledge", textui_browse_object_knowledge }, { 0, 0, "Display artifact knowledge", do_cmd_knowledge_artifacts }, { 0, 0, "Display ego item knowledge", do_cmd_knowledge_ego_items }, { 0, 0, "Display monster knowledge", do_cmd_knowledge_monsters }, { 0, 0, "Display feature knowledge", do_cmd_knowledge_features }, { 0, 0, "Display contents of general store", do_cmd_knowledge_store }, { 0, 0, "Display contents of armourer", do_cmd_knowledge_store }, { 0, 0, "Display contents of weaponsmith", do_cmd_knowledge_store }, { 0, 0, "Display contents of temple", do_cmd_knowledge_store }, { 0, 0, "Display contents of alchemist", do_cmd_knowledge_store }, { 0, 0, "Display contents of magic shop", do_cmd_knowledge_store }, { 0, 0, "Display contents of black market", do_cmd_knowledge_store }, { 0, 0, "Display contents of home", do_cmd_knowledge_store }, { 0, 0, "Display hall of fame", do_cmd_knowledge_scores }, { 0, 0, "Display character history", do_cmd_knowledge_history }, }; static menu_type knowledge_menu; /* Keep macro counts happy. */ static void cleanup_cmds(void) { mem_free(obj_group_order); } void textui_knowledge_init(void) { /* Initialize the menus */ menu_type *menu = &knowledge_menu; menu_init(menu, MN_SKIN_SCROLL, menu_find_iter(MN_ITER_ACTIONS)); menu_setpriv(menu, N_ELEMENTS(knowledge_actions), knowledge_actions); menu->title = "Display current knowledge"; menu->selections = lower_case; /* initialize other static variables */ if (!obj_group_order) { int i; int gid = -1; obj_group_order = C_ZNEW(TV_GOLD + 1, int); atexit(cleanup_cmds); /* Allow for missing values */ for (i = 0; i <= TV_GOLD; i++) obj_group_order[i] = -1; for (i = 0; 0 != object_text_order[i].tval; i++) { if (object_text_order[i].name) gid = i; obj_group_order[object_text_order[i].tval] = gid; } } } /* * Display the "player knowledge" menu. */ void textui_browse_knowledge(void) { int i; region knowledge_region = { 0, 0, -1, 18 }; /* Grey out menu items that won't display anything */ if (collect_known_artifacts(NULL, 0) > 0) knowledge_actions[1].flags = 0; else knowledge_actions[1].flags = MN_ACT_GRAYED; knowledge_actions[2].flags = MN_ACT_GRAYED; for (i = 0; i < z_info->e_max; i++) { if (e_info[i].everseen || OPT(cheat_xtra)) { knowledge_actions[2].flags = 0; break; } } if (count_known_monsters() > 0) knowledge_actions[3].flags = 0; else knowledge_actions[3].flags = MN_ACT_GRAYED; screen_save(); menu_layout(&knowledge_menu, &knowledge_region); clear_from(0); menu_select(&knowledge_menu, 0, FALSE); screen_load(); } angband-v3.3.2/src/ui-event.h0000644000175000017500000001127511651552410015311 0ustar chriscchrisc#ifndef INCLUDED_UI_EVENT_H #define INCLUDED_UI_EVENT_H /** * The various UI events that can occur. */ typedef enum { EVT_NONE = 0x0000, /* Basic events */ EVT_KBRD = 0x0001, /* Keypress */ EVT_MOUSE = 0x0002, /* Mousepress */ EVT_RESIZE = 0x0004, /* Display resize */ EVT_BUTTON = 0x0008, /* Button press */ /* 'Abstract' events */ EVT_ESCAPE = 0x0010, /* Get out of this menu */ EVT_MOVE = 0x0020, /* Menu movement */ EVT_SELECT = 0x0040 /* Menu selection */ } ui_event_type; /** * Key modifiers. */ #define KC_MOD_CONTROL 0x01 #define KC_MOD_SHIFT 0x02 #define KC_MOD_ALT 0x04 #define KC_MOD_META 0x08 #define KC_MOD_KEYPAD 0x10 /** * The game assumes that in certain cases, the effect of a modifer key will * be encoded in the keycode itself (e.g. 'A' is shift-'a'). In these cases * (specified below), a keypress' 'mods' value should not encode them also. * * If the character has come from the keypad: * Include all mods * Else if the character is in the range 0x01-0x1F, and the keypress was * from a key that without modifiers would be in the range 0x40-0x5F: * CONTROL is encoded in the keycode, and should not be in mods * Else if the character is in the range 0x21-0x2F, 0x3A-0x60 or 0x7B-0x7E: * SHIFT is often used to produce these should not be encoded in mods * * (All ranges are inclusive.) * * You can use these macros for part of the above conditions. */ #define MODS_INCLUDE_CONTROL(v) \ (((v) >= 0x01 && (v) <= 0x1F) ? FALSE : TRUE) #define MODS_INCLUDE_SHIFT(v) \ ((((v) >= 0x21 && (v) <= 0x2F) || \ ((v) >= 0x3A && (v) <= 0x60) || \ ((v) >= 0x7B && (v) <= 0x7E)) ? FALSE : TRUE) /** * If keycode you're trying to apply control to is between 0x40-0x5F * inclusive, then you should take 0x40 from the keycode and leave * KC_MOD_CONTROL unset. Otherwise, leave the keycode alone and set * KC_MOD_CONTROL in mods. * * This macro returns TRUE in the former case and FALSE in the latter. */ #define ENCODE_KTRL(v) \ (((v) >= 0x40 && (v) <= 0x5F) ? TRUE : FALSE) /** * Given a character X, turn it into a control character. */ #define KTRL(X) \ ((X) & 0x1F) /** * Given a control character X, turn it into its uppercase ASCII equivalent. */ #define UN_KTRL(X) \ ((X) + 64) /** * Keyset mappings for various keys. */ #define ESCAPE 0x1B #define KC_RETURN 0x0A /* ASCII \n */ #define KC_ENTER 0x0D /* ASCII \r */ #define KC_TAB 0x09 /* ASCII \t */ #define KC_DELETE 0x7F #define KC_BACKSPACE 0x08 /* ASCII \h */ #define ARROW_DOWN 0x80 #define ARROW_LEFT 0x81 #define ARROW_RIGHT 0x82 #define ARROW_UP 0x83 #define KC_F1 0x84 #define KC_F2 0x85 #define KC_F3 0x86 #define KC_F4 0x87 #define KC_F5 0x88 #define KC_F6 0x89 #define KC_F7 0x8A #define KC_F8 0x8B #define KC_F9 0x8C #define KC_F10 0x8D #define KC_F11 0x8E #define KC_F12 0x8F #define KC_F13 0x90 #define KC_F14 0x91 #define KC_F15 0x92 #define KC_HELP 0x93 #define KC_HOME 0x94 #define KC_PGUP 0x95 #define KC_END 0x96 #define KC_PGDOWN 0x97 #define KC_INSERT 0x98 #define KC_PAUSE 0x99 #define KC_BREAK 0x9a #define KC_BEGIN 0x9b /* we have up until 0x9F before we start edging into displayable Unicode */ /* then we could move into private use area 1, 0xE000 onwards */ /* Analogous to isdigit() etc in ctypes */ #define isarrow(c) ((c >= ARROW_DOWN) && (c <= ARROW_UP)) /** * Type capable of holding any input key we might want to use. */ typedef u32b keycode_t; /** * Struct holding all relevant info for keypresses. */ struct keypress { ui_event_type type; keycode_t code; byte mods; }; /** * Struct holding all relevant info for mouse clicks. */ struct mouseclick { ui_event_type type; byte x; byte y; byte button; }; /** * Union type to hold information about any given event. */ typedef union { ui_event_type type; struct mouseclick mouse; struct keypress key; } ui_event; /** Easy way to initialise a ui_event without seeing the gory bits. */ #define EVENT_EMPTY { 0 } /*** Functions ***/ /** Given a string (and that string's length), return the corresponding keycode */ keycode_t keycode_find_code(const char *str, size_t len); /** Given a keycode, return its description */ const char *keycode_find_desc(keycode_t kc); /** Convert a string of keypresses into their textual representation */ void keypress_to_text(char *buf, size_t len, const struct keypress *src, bool expand_backslash); /** Covert a textual representation of keypresses into actual keypresses */ void keypress_from_text(struct keypress *buf, size_t len, const char *str); #endif /* INCLUDED_UI_EVENT_H */ angband-v3.3.2/src/main.c0000644000175000017500000002333111651552410014470 0ustar chriscchrisc/* * File: main.c * Purpose: Core game initialisation for UNIX (and other) machines * * Copyright (c) 1997 Ben Harrison, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "files.h" #include "init.h" /* * Some machines have a "main()" function in their "main-xxx.c" file, * all the others use this file for their "main()" function. */ #if defined(WIN32_CONSOLE_MODE) || !defined(WINDOWS) || defined(USE_SDL) #include "main.h" #include "textui.h" #include "init.h" /* * List of the available modules in the order they are tried. */ static const struct module modules[] = { #ifdef USE_GTK { "gtk", help_gtk, init_gtk }, #endif /* USE_GTK */ #ifdef USE_X11 { "x11", help_x11, init_x11 }, #endif /* USE_X11 */ #ifdef USE_SDL { "sdl", help_sdl, init_sdl }, #endif /* USE_SDL */ #ifdef USE_GCU { "gcu", help_gcu, init_gcu }, #endif /* USE_GCU */ #ifdef USE_TEST { "test", help_test, init_test }, #endif /* !USE_TEST */ #ifdef USE_STATS { "stats", help_stats, init_stats }, #endif /* USE_STATS */ }; static int init_sound_dummy(int argc, char *argv[]) { return 0; } /* * List of sound modules in the order they should be tried. */ static const struct module sound_modules[] = { #ifdef SOUND_SDL { "sdl", "SDL_mixer sound module", init_sound_sdl }, #endif /* SOUND_SDL */ { "none", "No sound", init_sound_dummy }, }; /* * A hook for "quit()". * * Close down, then fall back into "quit()". */ static void quit_hook(const char *s) { int j; /* Unused parameter */ (void)s; /* Scan windows */ for (j = ANGBAND_TERM_MAX - 1; j >= 0; j--) { /* Unused */ if (!angband_term[j]) continue; /* Nuke it */ term_nuke(angband_term[j]); } } /* * SDL needs a look-in */ #ifdef USE_SDL # include "SDL.h" #endif /* * Initialize and verify the file paths, and the score file. * * Use the ANGBAND_PATH environment var if possible, else use * DEFAULT_PATH, and in either case, branch off appropriately. * * First, we'll look for the ANGBAND_PATH environment variable, * and then look for the files in there. If that doesn't work, * we'll try the DEFAULT_PATH constants. So be sure that one of * these two things works... * * We must ensure that the path ends with "PATH_SEP" if needed, * since the "init_file_paths()" function will simply append the * relevant "sub-directory names" to the given path. * * Make sure that the path doesn't overflow the buffer. We have * to leave enough space for the path separator, directory, and * filenames. */ static void init_stuff(void) { char configpath[512]; char libpath[512]; char datapath[512]; /* Use the angband_path, or a default */ my_strcpy(configpath, DEFAULT_CONFIG_PATH, sizeof(configpath)); my_strcpy(libpath, DEFAULT_LIB_PATH, sizeof(libpath)); my_strcpy(datapath, DEFAULT_DATA_PATH, sizeof(datapath)); /* Make sure they're terminated */ configpath[511] = '\0'; libpath[511] = '\0'; datapath[511] = '\0'; /* Hack -- Add a path separator (only if needed) */ if (!suffix(configpath, PATH_SEP)) my_strcat(configpath, PATH_SEP, sizeof(configpath)); if (!suffix(libpath, PATH_SEP)) my_strcat(libpath, PATH_SEP, sizeof(libpath)); if (!suffix(datapath, PATH_SEP)) my_strcat(datapath, PATH_SEP, sizeof(datapath)); /* Initialize */ init_file_paths(configpath, libpath, datapath); } /* * Handle a "-d=" option * * The "" can be any string starting with the same letter as the * name of a subdirectory of the "lib" folder (i.e. "i" or "info"). * * The "" can be any legal path for the given system, and should * not end in any special path separator (i.e. "/tmp" or "~/.ang-info"). */ static void change_path(const char *info) { if (!info || !info[0]) quit_fmt("Try '-d'.", info); string_free(ANGBAND_DIR_USER); ANGBAND_DIR_USER = string_make(info); } #ifdef SET_UID /* * Find a default user name from the system. */ static void user_name(char *buf, size_t len, int id) { struct passwd *pw = getpwuid(id); /* Default to PLAYER */ if (!pw) { my_strcpy(buf, "PLAYER", len); return; } /* Capitalise and copy */ strnfmt(buf, len, "%^s", pw->pw_name); } #endif /* SET_UID */ static bool new_game; /* * Pass the appropriate "Initialisation screen" command to the game, * getting user input if needed. */ static errr get_init_cmd(void) { /* Wait for response */ pause_line(Term); if (new_game) cmd_insert(CMD_NEWGAME); else /* This might be modified to supply the filename in future. */ cmd_insert(CMD_LOADFILE); /* Everything's OK. */ return 0; } /* Command dispatcher for curses, etc builds */ static errr default_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_init_cmd(); else return textui_get_cmd(context, wait); } static void debug_opt(const char *arg) { if (streq(arg, "mem-poison-alloc")) mem_flags |= MEM_POISON_ALLOC; else if (streq(arg, "mem-poison-free")) mem_flags |= MEM_POISON_FREE; else { puts("Debug flags:"); puts(" mem-poison-alloc: Poison all memory allocations"); puts(" mem-poison-free: Poison all freed memory"); exit(0); } } /* * Simple "main" function for multiple platforms. * * Note the special "--" option which terminates the processing of * standard options. All non-standard options (if any) are passed * directly to the "init_xxx()" function. */ int main(int argc, char *argv[]) { int i; bool done = FALSE; const char *mstr = NULL; const char *soundstr = NULL; bool args = TRUE; /* Save the "program name" XXX XXX XXX */ argv0 = argv[0]; #ifdef SET_UID /* Default permissions on files */ (void)umask(022); #endif /* SET_UID */ #ifdef SET_UID /* Get the user id */ player_uid = getuid(); /* Save the effective GID for later recall */ player_egid = getegid(); #endif /* SET_UID */ /* Drop permissions */ safe_setuid_drop(); /* Process the command line arguments */ for (i = 1; args && (i < argc); i++) { const char *arg = argv[i]; /* Require proper options */ if (*arg++ != '-') goto usage; /* Analyze option */ switch (*arg++) { case 'n': new_game = TRUE; break; case 'w': arg_wizard = TRUE; break; case 'r': arg_rebalance = TRUE; break; case 'g': /* Default graphics tile */ arg_graphics = GRAPHICS_ADAM_BOLT; break; case 'u': if (!*arg) goto usage; /* Get the savefile name */ my_strcpy(op_ptr->full_name, arg, sizeof(op_ptr->full_name)); continue; case 'm': if (!*arg) goto usage; mstr = arg; continue; case 's': if (!*arg) goto usage; soundstr = arg; continue; case 'd': change_path(arg); continue; case 'x': debug_opt(arg); continue; case '-': argv[i] = argv[0]; argc = argc - i; argv = argv + i; args = FALSE; break; default: usage: puts("Usage: angband [options] [-- subopts]"); puts(" -n Start a new character (WARNING: overwrites default savefile without -u)"); puts(" -w Resurrect dead character (marks savefile)"); puts(" -r Rebalance monsters"); puts(" -g Request graphics mode"); puts(" -x Debug options; see -xhelp"); puts(" -u Use your savefile"); puts(" -d Store pref files and screendumps in "); puts(" -s Use sound module :"); for (i = 0; i < (int)N_ELEMENTS(sound_modules); i++) printf(" %s %s\n", sound_modules[i].name, sound_modules[i].help); puts(" -m Use module , where can be:"); /* Print the name and help for each available module */ for (i = 0; i < (int)N_ELEMENTS(modules); i++) printf(" %s %s\n", modules[i].name, modules[i].help); /* Actually abort the process */ quit(NULL); } if (*arg) goto usage; } /* Hack -- Forget standard args */ if (args) { argc = 1; argv[1] = NULL; } /* Install "quit" hook */ quit_aux = quit_hook; /* If we were told which mode to use, then use it */ if (mstr) ANGBAND_SYS = mstr; /* Get the file paths */ init_stuff(); /* Try the modules in the order specified by modules[] */ for (i = 0; i < (int)N_ELEMENTS(modules); i++) { /* User requested a specific module? */ if (!mstr || (streq(mstr, modules[i].name))) { ANGBAND_SYS = modules[i].name; if (0 == modules[i].init(argc, argv)) { done = TRUE; break; } } } /* Make sure we have a display! */ if (!done) quit("Unable to prepare any 'display module'!"); #ifdef SET_UID /* Get the "user name" as a default player name, unless set with -u switch */ if (!op_ptr->full_name[0]) { user_name(op_ptr->full_name, sizeof(op_ptr->full_name), player_uid); } /* Create any missing directories */ create_needed_dirs(); #endif /* SET_UID */ /* Process the player name */ process_player_name(TRUE); /* Try the modules in the order specified by sound_modules[] */ for (i = 0; i < (int)N_ELEMENTS(sound_modules); i++) if (!soundstr || streq(soundstr, sound_modules[i].name)) if (0 == sound_modules[i].init(argc, argv)) break; /* Catch nasty signals */ signals_init(); /* Set up the command hook */ cmd_get_hook = default_get_cmd; /* Set up the display handlers and things. */ init_display(); /* Play the game */ play_game(); /* Free resources */ cleanup_angband(); /* Quit */ quit(NULL); /* Exit */ return (0); } #endif angband-v3.3.2/src/ui-spell.c0000644000175000017500000001671411651552410015305 0ustar chriscchrisc/* * File: ui-spell.c * Purpose: Spell UI handing * * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "object/tvalsval.h" #include "game-cmd.h" #include "spells.h" #include "ui.h" #include "ui-menu.h" /** * Spell menu data struct */ struct spell_menu_data { int spells[PY_MAX_SPELLS]; int n_spells; bool browse; bool (*is_valid)(int spell); int selected_spell; }; /** * Is item oid valid? */ static int spell_menu_valid(menu_type *m, int oid) { struct spell_menu_data *d = menu_priv(m); int *spells = d->spells; return d->is_valid(spells[oid]); } /** * Display a row of the spell menu */ static void spell_menu_display(menu_type *m, int oid, bool cursor, int row, int col, int wid) { struct spell_menu_data *d = menu_priv(m); int spell = d->spells[oid]; const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; char help[30]; char out[80]; int attr; const char *illegible = NULL; const char *comment = NULL; if (s_ptr->slevel >= 99) { illegible = "(illegible)"; attr = TERM_L_DARK; } else if (p_ptr->spell_flags[spell] & PY_SPELL_FORGOTTEN) { comment = " forgotten"; attr = TERM_YELLOW; } else if (p_ptr->spell_flags[spell] & PY_SPELL_LEARNED) { if (p_ptr->spell_flags[spell] & PY_SPELL_WORKED) { /* Get extra info */ get_spell_info(p_ptr->class->spell_book, spell, help, sizeof(help)); comment = help; attr = TERM_WHITE; } else { comment = " untried"; attr = TERM_L_GREEN; } } else if (s_ptr->slevel <= p_ptr->lev) { comment = " unknown"; attr = TERM_L_BLUE; } else { comment = " difficult"; attr = TERM_RED; } /* Dump the spell --(-- */ strnfmt(out, sizeof(out), "%-30s%2d %4d %3d%%%s", get_spell_name(p_ptr->class->spell_book, spell), s_ptr->slevel, s_ptr->smana, spell_chance(spell), comment); c_prt(attr, illegible ? illegible : out, row, col); } /** * Handle an event on a menu row. */ static bool spell_menu_handler(menu_type *m, const ui_event *e, int oid) { struct spell_menu_data *d = menu_priv(m); if (e->type == EVT_SELECT) { d->selected_spell = d->spells[oid]; return d->browse ? TRUE : FALSE; } return TRUE; } /** * Show spell long description when browsing */ static void spell_menu_browser(int oid, void *data, const region *loc) { struct spell_menu_data *d = data; int spell = d->spells[oid]; /* Redirect output to the screen */ text_out_hook = text_out_to_screen; text_out_wrap = 0; text_out_indent = loc->col - 1; text_out_pad = 1; Term_gotoxy(loc->col, loc->row + loc->page_rows); text_out("\n%s\n", s_info[(p_ptr->class->spell_book == TV_MAGIC_BOOK) ? spell : spell + PY_MAX_SPELLS].text); /* XXX */ text_out_pad = 0; text_out_indent = 0; } static const menu_iter spell_menu_iter = { NULL, /* get_tag = NULL, just use lowercase selections */ spell_menu_valid, spell_menu_display, spell_menu_handler, NULL /* no resize hook */ }; /** Create and initialise a spell menu, given an object and a validity hook */ static menu_type *spell_menu_new(const object_type *o_ptr, bool (*is_valid)(int spell)) { menu_type *m = menu_new(MN_SKIN_SCROLL, &spell_menu_iter); struct spell_menu_data *d = mem_alloc(sizeof *d); region loc = { -60, 1, 60, -99 }; /* collect spells from object */ d->n_spells = spell_collect_from_book(o_ptr, d->spells); if (d->n_spells == 0 || !spell_okay_list(is_valid, d->spells, d->n_spells)) { mem_free(m); mem_free(d); return NULL; } /* copy across private data */ d->is_valid = is_valid; d->selected_spell = -1; d->browse = FALSE; menu_setpriv(m, d->n_spells, d); /* set flags */ m->header = "Name Lv Mana Fail Info"; m->flags = MN_CASELESS_TAGS; m->selections = lower_case; m->browse_hook = spell_menu_browser; /* set size */ loc.page_rows = d->n_spells + 1; menu_layout(m, &loc); return m; } /** Clean up a spell menu instance */ static void spell_menu_destroy(menu_type *m) { struct spell_menu_data *d = menu_priv(m); mem_free(d); mem_free(m); } /** * Run the spell menu to select a spell. */ static int spell_menu_select(menu_type *m, const char *noun, const char *verb) { struct spell_menu_data *d = menu_priv(m); screen_save(); region_erase_bordered(&m->active); prt(format("%^s which %s? ", verb, noun), 0, 0); menu_select(m, 0, TRUE); screen_load(); return d->selected_spell; } /** * Run the spell menu, without selections. */ static void spell_menu_browse(menu_type *m, const char *noun) { struct spell_menu_data *d = menu_priv(m); screen_save(); region_erase_bordered(&m->active); prt(format("Browsing %ss. Press Escape to exit.", noun), 0, 0); d->browse = TRUE; menu_select(m, 0, TRUE); screen_load(); } /** * Interactively select a spell. * * Returns the spell selected, or -1. */ static int get_spell(const object_type *o_ptr, const char *verb, bool (*spell_test)(int spell)) { menu_type *m; const char *noun = (p_ptr->class->spell_book == TV_MAGIC_BOOK ? "spell" : "prayer"); m = spell_menu_new(o_ptr, spell_test); if (m) { int spell = spell_menu_select(m, noun, verb); spell_menu_destroy(m); return spell; } return -1; } /** * Browse a given book. */ void textui_book_browse(const object_type *o_ptr) { menu_type *m; const char *noun = (p_ptr->class->spell_book == TV_MAGIC_BOOK ? "spell" : "prayer"); m = spell_menu_new(o_ptr, spell_okay_to_browse); if (m) { spell_menu_browse(m, noun); spell_menu_destroy(m); } else { msg("You cannot browse that."); } } /** * Browse the given book. */ void textui_spell_browse(void) { int item; item_tester_hook = obj_can_browse; if (!get_item(&item, "Browse which book? ", "You have no books that you can read.", CMD_BROWSE_SPELL, (USE_INVEN | USE_FLOOR | IS_HARMLESS))) return; /* Track the object kind */ track_object(item); handle_stuff(p_ptr); textui_book_browse(object_from_item_idx(item)); } /** * Study a book to gain a new spell */ void textui_obj_study(void) { int item; item_tester_hook = obj_can_study; if (!get_item(&item, "Study which book? ", "You have no books that you can read.", CMD_STUDY_BOOK, (USE_INVEN | USE_FLOOR))) return; track_object(item); handle_stuff(p_ptr); if (player_has(PF_CHOOSE_SPELLS)) { int spell = get_spell(object_from_item_idx(item), "study", spell_okay_to_study); if (spell >= 0) { cmd_insert(CMD_STUDY_SPELL); cmd_set_arg_choice(cmd_get_top(), 0, spell); } } else { cmd_insert(CMD_STUDY_BOOK); cmd_set_arg_item(cmd_get_top(), 0, item); } } /** * Cast a spell from a book. */ void textui_obj_cast(void) { int item; int spell; const char *verb = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "cast" : "recite"); item_tester_hook = obj_can_cast_from; if (!get_item(&item, "Cast from which book? ", "You have no books that you can read.", CMD_CAST, (USE_INVEN | USE_FLOOR))) return; /* Track the object kind */ track_object(item); /* Ask for a spell */ spell = get_spell(object_from_item_idx(item), verb, spell_okay_to_cast); if (spell >= 0) { cmd_insert(CMD_CAST); cmd_set_arg_choice(cmd_get_top(), 0, spell); } } angband-v3.3.2/src/cmd4.c0000644000175000017500000004054311651552410014377 0ustar chriscchrisc/* * File: cmd4.c * Purpose: Various kinds of browsing functions. * * Copyright (c) 1997-2007 Robert A. Koeneke, James E. Wilson, Ben Harrison, * Eytan Zweig, Andrew Doull, Pete Mack. * Copyright (c) 2004 DarkGod (HTML dump code) * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cave.h" #include "cmds.h" #include "externs.h" #include "files.h" #include "history.h" #include "object/tvalsval.h" #include "option.h" #include "prefs.h" #include "squelch.h" #include "ui.h" #include "ui-menu.h" #define INFO_SCREENS 2 /* Number of screens in character info mode */ /* * Hack -- redraw the screen * * This command performs various low level updates, clears all the "extra" * windows, does a total redraw of the main window, and requests all of the * interesting updates and redraws that I can think of. * * This command is also used to "instantiate" the results of the user * selecting various things, such as graphics mode, so it must call * the "TERM_XTRA_REACT" hook before redrawing the windows. * */ void do_cmd_redraw(void) { int j; term *old = Term; /* Low level flush */ Term_flush(); /* Reset "inkey()" */ flush(); if (character_dungeon) verify_panel(); /* Hack -- React to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Combine and Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Update torch */ p_ptr->update |= (PU_TORCH); /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw everything */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_INVEN | PR_EQUIP | PR_MESSAGE | PR_MONSTER | PR_OBJECT | PR_MONLIST | PR_ITEMLIST); /* Clear screen */ Term_clear(); /* Hack -- update */ handle_stuff(p_ptr); /* Place the cursor on the player */ if (0 != character_dungeon) move_cursor_relative(p_ptr->px, p_ptr->py); /* Redraw every window */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { if (!angband_term[j]) continue; Term_activate(angband_term[j]); Term_redraw(); Term_fresh(); Term_activate(old); } } /* * Hack -- change name */ void do_cmd_change_name(void) { ui_event ke; int mode = 0; const char *p; bool more = TRUE; /* Prompt */ p = "['c' to change name, 'f' to file, 'h' to change mode, or ESC]"; /* Save screen */ screen_save(); /* Forever */ while (more) { /* Display the player */ display_player(mode); /* Prompt */ Term_putstr(2, 23, -1, TERM_WHITE, p); /* Query */ ke = inkey_ex(); if (ke.type == EVT_KBRD) { switch (ke.key.code) { case ESCAPE: more = FALSE; break; case 'c': { char namebuf[32] = ""; if (get_name(namebuf, sizeof namebuf)) { /* Set player name */ my_strcpy(op_ptr->full_name, namebuf, sizeof(op_ptr->full_name)); /* Don't change savefile name. */ process_player_name(FALSE); } break; } case 'f': { char buf[1024]; char fname[80]; strnfmt(fname, sizeof fname, "%s.txt", op_ptr->base_name); if (get_file(fname, buf, sizeof buf)) { if (file_character(buf, FALSE) != 0) msg("Character dump failed!"); else msg("Character dump successful."); } break; } case 'h': case ARROW_LEFT: case ' ': mode = (mode + 1) % INFO_SCREENS; break; case 'l': case ARROW_RIGHT: mode = (mode - 1) % INFO_SCREENS; break; } } else if (ke.type == EVT_MOUSE) { /* Just flip through the screens */ mode = (mode + 1) % INFO_SCREENS; } /* Flush messages */ message_flush(); } /* Load screen */ screen_load(); } /* * Recall the most recent message */ void do_cmd_message_one(void) { /* Recall one message XXX XXX XXX */ c_prt(message_color(0), format( "> %s", message_str(0)), 0, 0); } /* * Show previous messages to the user * * The screen format uses line 0 and 23 for headers and prompts, * skips line 1 and 22, and uses line 2 thru 21 for old messages. * * This command shows you which commands you are viewing, and allows * you to "search" for strings in the recall. * * Note that messages may be longer than 80 characters, but they are * displayed using "infinite" length, with a special sub-command to * "slide" the virtual display to the left or right. * * Attempt to only highlight the matching portions of the string. */ void do_cmd_messages(void) { ui_event ke; bool more = TRUE; int i, j, n, q; int wid, hgt; char shower[80] = ""; /* Total messages */ n = messages_num(); /* Start on first message */ i = 0; /* Start at leftmost edge */ q = 0; /* Get size */ Term_get_size(&wid, &hgt); /* Save screen */ screen_save(); /* Process requests until done */ while (more) { /* Clear screen */ Term_clear(); /* Dump messages */ for (j = 0; (j < hgt - 4) && (i + j < n); j++) { const char *msg; const char *str = message_str(i + j); byte attr = message_color(i + j); u16b count = message_count(i + j); if (count == 1) msg = str; else msg = format("%s <%dx>", str, count); /* Apply horizontal scroll */ msg = ((int)strlen(msg) >= q) ? (msg + q) : ""; /* Dump the messages, bottom to top */ Term_putstr(0, hgt - 3 - j, -1, attr, msg); /* Highlight "shower" */ if (shower[0]) { str = msg; /* Display matches */ while ((str = my_stristr(str, shower)) != NULL) { int len = strlen(shower); /* Display the match */ Term_putstr(str-msg, hgt - 3 - j, len, TERM_YELLOW, str); /* Advance */ str += len; } } } /* Display header */ prt(format("Message recall (%d-%d of %d), offset %d", i, i + j - 1, n, q), 0, 0); /* Display prompt (not very informative) */ if (shower[0]) prt("[Movement keys to navigate, '-' for next, '=' to find]", hgt - 1, 0); else prt("[Movement keys to navigate, '=' to find, or ESCAPE to exit]", hgt - 1, 0); /* Get a command */ ke = inkey_ex(); /* Scroll forwards or backwards using mouse clicks */ if (ke.type == EVT_MOUSE) { if (ke.mouse.y <= hgt / 2) { /* Go older if legal */ if (i + 20 < n) i += 20; } else { /* Go newer */ i = (i >= 20) ? (i - 20) : 0; } } else if (ke.type == EVT_KBRD) { switch (ke.key.code) { case ESCAPE: { more = FALSE; break; } case '=': { /* Get the string to find */ prt("Find: ", hgt - 1, 0); if (!askfor_aux(shower, sizeof shower, NULL)) continue; /* Set to find */ ke.key.code = '-'; break; } case ARROW_LEFT: case '4': q = (q >= wid / 2) ? (q - wid / 2) : 0; break; case ARROW_RIGHT: case '6': q = q + wid / 2; break; case ARROW_UP: case '8': if (i + 1 < n) i += 1; break; case ARROW_DOWN: case '2': case '\r': case '\n': i = (i >= 1) ? (i - 1) : 0; break; case KC_PGUP: case 'p': case ' ': if (i + 20 < n) i += 20; break; case KC_PGDOWN: case 'n': i = (i >= 20) ? (i - 20) : 0; break; } } /* Find the next item */ if (ke.key.code == '-' && shower[0]) { s16b z; /* Scan messages */ for (z = i + 1; z < n; z++) { /* Search for it */ if (my_stristr(message_str(z), shower)) { /* New location */ i = z; /* Done */ break; } } } } /* Load screen */ screen_load(); } /*** Non-knowledge/option stuff ***/ /** * Record the player's thoughts as a note. * * This both displays the note back to the player and adds it to the game log. * Two fancy note types are supported: notes beginning with "/say" will be * written as 'Frodo says: "____"', and notes beginning with "/me" will * be written as 'Frodo ____'. */ void do_cmd_note(void) { /* Allocate/Initialize strings to get and format user input. */ char tmp[200]; char note[220]; my_strcpy(tmp, "", sizeof(tmp)); my_strcpy(note, "", sizeof(note)); /* Read a line of input from the user */ if (!get_string("Note: ", tmp, sizeof(tmp))) return; /* Ignore empty notes */ if (!tmp[0] || (tmp[0] == ' ')) return; /* Format the note correctly, supporting some cute /me commands */ if (strncmp(tmp, "/say ", 5) == 0) strnfmt(note, sizeof(note), "-- %s says: \"%s\"", op_ptr->full_name, &tmp[5]); else if (strncmp(tmp, "/me", 3) == 0) strnfmt(note, sizeof(note), "-- %s%s", op_ptr->full_name, &tmp[3]); else strnfmt(note, sizeof(note), "-- Note: %s", tmp); /* Display the note (omitting the "-- " prefix) */ msg(¬e[3]); /* Add a history entry */ history_add(note, HISTORY_USER_INPUT, 0); } /* * Mention the current version */ void do_cmd_version(void) { /* Silly message */ msg("You are playing %s. Type '?' for more info.", buildver); } /* * Ask for a "user pref line" and process it */ void do_cmd_pref(void) { char tmp[80]; /* Default */ my_strcpy(tmp, "", sizeof(tmp)); /* Ask for a "user pref command" */ if (!get_string("Pref: ", tmp, 80)) return; /* Process that pref command */ (void)process_pref_file_command(tmp); } /* * Array of feeling strings for object feelings. * Keep strings at 36 or less characters to keep the * combined feeling on one row. */ static const char *obj_feeling_text[] = { "Looks like any other level.", "you sense an item of wondrous power!", "there are superb treasures here.", "there are excellent treasures here.", "there are very good treasures here.", "there are good treasures here.", "there may be something worthwhile here.", "there may not be much interesting here.", "there aren't many treasures here.", "there are only scraps of junk here.", "there are naught but cobwebs here." }; /* * Array of feeling strings for monster feelings. * Keep strings at 36 or less characters to keep the * combined feeling on one row. */ static const char *mon_feeling_text[] = { /* first string is just a place holder to * maintain symmetry with obj_feeling. */ "You are still uncertain about this place", "Omens of death haunt this place", "This place seems murderous", "This place seems terribly dangerous", "You feel anxious about this place", "You feel nervous about this place", "This place does not seem too risky", "This place seems reasonably safe", "This seems a tame, sheltered place", "This seems a quiet, peaceful place" }; /* * Display the feeling. Players always get a monster feeling. * Object feelings are delayed until the player has explored some * of the level. */ void display_feeling(bool obj_only) { u16b obj_feeling = cave->feeling / 10; u16b mon_feeling = cave->feeling - (10 * obj_feeling); const char *join; /* Don't show feelings for cold-hearted characters */ if (OPT(birth_no_feelings)) return; /* No useful feeling in town */ if (!p_ptr->depth) { msg("Looks like a typical town."); return; } /* Display only the object feeling when it's first discovered. */ if (obj_only){ msg("You feel that %s", obj_feeling_text[obj_feeling]); return; } /* Players automatically get a monster feeling. */ if (cave->feeling_squares < FEELING1){ msg("%s.", mon_feeling_text[mon_feeling]); return; } /* Verify the feelings */ if (obj_feeling >= N_ELEMENTS(obj_feeling_text)) obj_feeling = N_ELEMENTS(obj_feeling_text) - 1; if (mon_feeling >= N_ELEMENTS(mon_feeling_text)) mon_feeling = N_ELEMENTS(mon_feeling_text) - 1; /* Decide the conjunction */ if ((mon_feeling <= 5 && obj_feeling > 6) || (mon_feeling > 5 && obj_feeling <= 6)) join = ", yet"; else join = ", and"; /* Display the feeling */ msg("%s%s %s", mon_feeling_text[mon_feeling], join, obj_feeling_text[obj_feeling]); } void do_cmd_feeling(void) { display_feeling(FALSE); } /*** Screenshot loading/saving code ***/ /* * Encode the screen colors */ static const char hack[BASIC_COLORS+1] = "dwsorgbuDWvyRGBU"; /* * Hack -- load a screen dump from a file * * ToDo: Add support for loading/saving screen-dumps with graphics * and pseudo-graphics. Allow the player to specify the filename * of the dump. */ void do_cmd_load_screen(void) { int i, y, x; byte a = 0; char c = ' '; bool okay = TRUE; ang_file *fp; char buf[1024]; /* Build the filename */ path_build(buf, 1024, ANGBAND_DIR_USER, "dump.txt"); fp = file_open(buf, MODE_READ, -1); if (!fp) return; /* Save screen */ screen_save(); /* Clear the screen */ Term_clear(); /* Load the screen */ for (y = 0; okay && (y < 24); y++) { /* Get a line of data */ if (!file_getl(fp, buf, sizeof(buf))) okay = FALSE; /* Show each row */ for (x = 0; x < 79; x++) { /* Put the attr/char */ Term_draw(x, y, TERM_WHITE, buf[x]); } } /* Get the blank line */ if (!file_getl(fp, buf, sizeof(buf))) okay = FALSE; /* Dump the screen */ for (y = 0; okay && (y < 24); y++) { /* Get a line of data */ if (!file_getl(fp, buf, sizeof(buf))) okay = FALSE; /* Dump each row */ for (x = 0; x < 79; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Look up the attr */ for (i = 0; i < BASIC_COLORS; i++) { /* Use attr matches */ if (hack[i] == buf[x]) a = i; } /* Put the attr/char */ Term_draw(x, y, a, c); } } /* Close it */ file_close(fp); /* Message */ msg("Screen dump loaded."); message_flush(); /* Load screen */ screen_load(); } /* * Save a simple text screendump. */ static void do_cmd_save_screen_text(void) { int y, x; byte a = 0; char c = ' '; ang_file *fff; char buf[1024]; /* Build the filename */ path_build(buf, 1024, ANGBAND_DIR_USER, "dump.txt"); fff = file_open(buf, MODE_WRITE, FTYPE_TEXT); if (!fff) return; /* Save screen */ screen_save(); /* Dump the screen */ for (y = 0; y < 24; y++) { /* Dump each row */ for (x = 0; x < 79; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = c; } /* Terminate */ buf[x] = '\0'; /* End the row */ file_putf(fff, "%s\n", buf); } /* Skip a line */ file_putf(fff, "\n"); /* Dump the screen */ for (y = 0; y < 24; y++) { /* Dump each row */ for (x = 0; x < 79; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = hack[a & 0x0F]; } /* Terminate */ buf[x] = '\0'; /* End the row */ file_putf(fff, "%s\n", buf); } /* Skip a line */ file_putf(fff, "\n"); /* Close it */ file_close(fff); /* Message */ msg("Screen dump saved."); message_flush(); /* Load screen */ screen_load(); } /* * Hack -- save a screen dump to a file in html format */ static void do_cmd_save_screen_html(int mode) { size_t i; ang_file *fff; char file_name[1024]; char tmp_val[256]; typedef void (*dump_func)(ang_file *); dump_func dump_visuals [] = { dump_monsters, dump_features, dump_objects, dump_flavors, dump_colors }; if (mode == 0) my_strcpy(tmp_val, "dump.html", sizeof(tmp_val)); else my_strcpy(tmp_val, "dump.txt", sizeof(tmp_val)); /* Ask for a file */ if (!get_string("File: ", tmp_val, sizeof(tmp_val))) return; /* Save current preferences */ path_build(file_name, 1024, ANGBAND_DIR_USER, "dump.prf"); fff = file_open(file_name, MODE_WRITE, (mode == 0 ? FTYPE_HTML : FTYPE_TEXT)); /* Check for failure */ if (!fff) { msg("Screen dump failed."); message_flush(); return; } /* Dump all the visuals */ for (i = 0; i < N_ELEMENTS(dump_visuals); i++) dump_visuals[i](fff); file_close(fff); /* Dump the screen with raw character attributes */ reset_visuals(FALSE); do_cmd_redraw(); html_screenshot(tmp_val, mode); /* Recover current graphics settings */ reset_visuals(TRUE); process_pref_file(file_name, TRUE, FALSE); file_delete(file_name); do_cmd_redraw(); msg("HTML screen dump saved."); message_flush(); } /* * Hack -- save a screen dump to a file */ void do_cmd_save_screen(void) { char ch; ch = get_char("Dump as (T)ext, (H)TML, or (F)orum text? ", "thf", 3, ' '); switch (ch) { case 't': do_cmd_save_screen_text(); break; case 'h': do_cmd_save_screen_html(0); break; case 'f': do_cmd_save_screen_html(1); break; } } angband-v3.3.2/src/z-term.c0000644000175000017500000016437511651552410015000 0ustar chriscchrisc/* * File: z-term.c * Purpose: a generic, efficient, terminal window package * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "z-term.h" /* * This file provides a generic, efficient, terminal window package, * which can be used not only on standard terminal environments such * as dumb terminals connected to a Unix box, but also in more modern * "graphic" environments, such as the Macintosh or Unix/X11. * * Each "window" works like a standard "dumb terminal", that is, it * can display a two dimensional array of grids containing colored * textual symbols, plus an optional cursor, and it can be used to * get keypress events from the user. * * In fact, this package can simply be used, if desired, to support * programs which will look the same on a dumb terminal as they do * on a graphic platform such as the Macintosh. * * This package was designed to help port the game "Angband" to a wide * variety of different platforms. Angband, like many other games in * the "rogue-like" heirarchy, requires, at the minimum, the ability * to display "colored textual symbols" in a standard 80x24 "window", * such as that provided by most dumb terminals, and many old personal * computers, and to check for "keypresses" from the user. The major * concerns were thus portability and efficiency, so Angband could be * easily ported to many different systems, with minimal effort, and * yet would run quickly on each of these systems, no matter what kind * of underlying hardware/software support was being used. * * It is important to understand the differences between the older * "dumb terminals" and the newer "graphic interface" machines, since * this package was designed to work with both types of systems. * * New machines: * waiting for a keypress is complex * checking for a keypress is often cheap * changing "colors" may be expensive * the "color" of a "blank" is rarely important * moving the "cursor" is relatively cheap * use a "software" cursor (only moves when requested) * drawing characters normally will not erase old ones * drawing a character on the cursor often erases it * may have fast routines for "clear a region" * the bottom right corner is usually not special * * Old machines: * waiting for a keypress is simple * checking for a keypress is often expensive * changing "colors" is usually cheap * the "color" of a "blank" may be important * moving the "cursor" may be expensive * use a "hardware" cursor (moves during screen updates) * drawing new symbols automatically erases old ones * characters may only be drawn at the cursor location * drawing a character on the cursor will move the cursor * may have fast routines for "clear entire window" * may have fast routines for "clear to end of line" * the bottom right corner is often dangerous * * * This package provides support for multiple windows, each of an * arbitrary size (up to 255x255), each with its own set of flags, * and its own hooks to handle several low-level procedures which * differ from platform to platform. Then the main program simply * creates one or more "term" structures, setting the various flags * and hooks in a manner appropriate for the current platform, and * then it can use the various "term" structures without worrying * about the underlying platform. * * * This package allows each "grid" in each window to hold an attr/char * pair, with each ranging from 0 to 255, and makes very few assumptions * about the meaning of any attr/char values. Normally, we assume that * "attr 0" is "black", with the semantics that "black" text should be * sent to "Term_wipe()" instead of "Term_text()", but this sematics is * modified if either the "always_pict" or the "always_text" flags are * set. We assume that "char 0" is "dangerous", since placing such a * "char" in the middle of a string "terminates" the string, and usually * we prevent its use. * * Finally, we use a special attr/char pair, defaulting to "attr 0" and * "char 32", also known as "black space", when we "erase" or "clear" * any window, but this pair can be redefined to any pair, including * the standard "white space", or the bizarre "emptiness" ("attr 0" * and "char 0"), as long as various obscure restrictions are met. * * * This package provides several functions which allow a program to * interact with the "term" structures. Most of the functions allow * the program to "request" certain changes to the current "term", * such as moving the cursor, drawing an attr/char pair, erasing a * region of grids, hiding the cursor, etc. Then there is a special * function which causes all of the "pending" requests to be performed * in an efficient manner. There is another set of functions which * allow the program to query the "requested state" of the current * "term", such as asking for the cursor location, or what attr/char * is at a given location, etc. There is another set of functions * dealing with "keypress" events, which allows the program to ask if * the user has pressed any keys, or to forget any keys the user pressed. * There is a pair of functions to allow this package to memorize the * contents of the current "term", and to restore these contents at * a later time. There is a special function which allows the program * to specify which "term" structure should be the "current" one. At * the lowest level, there is a set of functions which allow a new * "term" to be initialized or destroyed, and which allow this package, * or a program, to access the special "hooks" defined for the current * "term", and a set of functions which those "hooks" can use to inform * this package of the results of certain occurances, for example, one * such function allows this package to learn about user keypresses, * detected by one of the special "hooks". * * We provide, among other things, the functions "Term_keypress()" * to "react" to keypress events, and "Term_redraw()" to redraw the * entire window, plus "Term_resize()" to note a new size. * * * Note that the current "term" contains two "window images". One of * these images represents the "requested" contents of the "term", and * the other represents the "actual" contents of the "term", at the time * of the last performance of pending requests. This package uses these * two images to determine the "minimal" amount of work needed to make * the "actual" contents of the "term" match the "requested" contents of * the "term". This method is not perfect, but it often reduces the * amount of work needed to perform the pending requests, which thus * increases the speed of the program itself. This package promises * that the requested changes will appear to occur either "all at once" * or in a "top to bottom" order. In addition, a "cursor" is maintained, * and this cursor is updated along with the actual window contents. * * Currently, the "Term_fresh()" routine attempts to perform the "minimum" * number of physical updates, in terms of total "work" done by the hooks * Term_wipe(), Term_text(), and Term_pict(), making use of the fact that * adjacent characters of the same color can both be drawn together using * the "Term_text()" hook, and that "black" text can often be sent to the * "Term_wipe()" hook instead of the "Term_text()" hook, and if something * is already displayed in a window, then it is not necessary to display * it again. Unfortunately, this may induce slightly non-optimal results * in some cases, in particular, those in which, say, a string of ten * characters needs to be written, but the fifth character has already * been displayed. Currently, this will cause the "Term_text()" routine * to be called once for each half of the string, instead of once for the * whole string, which, on some machines, may be non-optimal behavior. * * The new formalism includes a "displayed" screen image (old) which * is actually seen by the user, a "requested" screen image (scr) * which is being prepared for display, a "memorized" screen image * (mem) which is used to save and restore screen images, and a * "temporary" screen image (tmp) which is currently unused. * * * Several "flags" are available in each "term" to allow the underlying * visual system (which initializes the "term" structure) to "optimize" * the performance of this package for the given system, or to request * certain behavior which is helpful/required for the given system. * * The "soft_cursor" flag indicates the use of a "soft" cursor, which * only moves when explicitly requested,and which is "erased" when * any characters are drawn on top of it. This flag is used for all * "graphic" systems which handle the cursor by "drawing" it. * * The "icky_corner" flag indicates that the bottom right "corner" * of the windows are "icky", and "printing" anything there may * induce "messy" behavior, such as "scrolling". This flag is used * for most old "dumb terminal" systems. * * * The "term" structure contains the following function "hooks": * * Term->init_hook = Init the term * Term->nuke_hook = Nuke the term * Term->xtra_hook = Perform extra actions * Term->curs_hook = Draw (or Move) the cursor * Term->bigcurs_hook = Draw (or Move) the big cursor (bigtile mode) * Term->wipe_hook = Draw some blank spaces * Term->text_hook = Draw some text in the window * Term->pict_hook = Draw some attr/chars in the window * * The "Term->xtra_hook" hook provides a variety of different functions, * based on the first parameter (which should be taken from the various * TERM_XTRA_* defines) and the second parameter (which may make sense * only for some first parameters). It is available to the program via * the "Term_xtra()" function, though some first parameters are only * "legal" when called from inside this package. * * The "Term->curs_hook" hook provides this package with a simple way * to "move" or "draw" the cursor to the grid "x,y", depending on the * setting of the "soft_cursor" flag. Note that the cursor is never * redrawn if "nothing" has happened to the screen (even temporarily). * This hook is required. * * The "Term->wipe_hook" hook provides this package with a simple way * to "erase", starting at "x,y", the next "n" grids. This hook assumes * that the input is valid. This hook is required, unless the setting * of the "always_pict" or "always_text" flags makes it optional. * * The "Term->text_hook" hook provides this package with a simple way * to "draw", starting at "x,y", the "n" chars contained in "cp", using * the attr "a". This hook assumes that the input is valid, and that * "n" is between 1 and 256 inclusive, but it should NOT assume that * the contents of "cp" are null-terminated. This hook is required, * unless the setting of the "always_pict" flag makes it optional. * * The "Term->pict_hook" hook provides this package with a simple way * to "draw", starting at "x,y", the "n" attr/char pairs contained in * the arrays "ap" and "cp". This hook assumes that the input is valid, * and that "n" is between 1 and 256 inclusive, but it should NOT assume * that the contents of "cp" are null-terminated. This hook is optional, * unless the setting of the "always_pict" or "higher_pict" flags make * it required. Note that recently, this hook was changed from taking * a byte "a" and a char "c" to taking a length "n", an array of bytes * "ap" and an array of chars "cp". Old implementations of this hook * should now iterate over all "n" attr/char pairs. * The two new arrays "tap" and "tcp" can contain the attr/char pairs * of the terrain below the values in "ap" and "cp". These values can * be used to implement transparency when using graphics by drawing * the terrain values as a background and the "ap", "cp" values in * the foreground. * * The game "Angband" uses a set of files called "main-xxx.c", for * various "xxx" suffixes. Most of these contain a function called * "init_xxx()", that will prepare the underlying visual system for * use with Angband, and then create one or more "term" structures, * using flags and hooks appropriate to the given platform, so that * the "main()" function can call one (or more) of the "init_xxx()" * functions, as appropriate, to prepare the required "term" structs * (one for each desired sub-window), and these "init_xxx()" functions * are called from a centralized "main()" function in "main.c". Other * "main-xxx.c" systems contain their own "main()" function which, in * addition to doing everything needed to initialize the actual program, * also does everything that the normal "init_xxx()" functions would do. * * The game "Angband" defines, in addition to "attr 0", all of the * attr codes from 1 to 15, using definitions in "defines.h", and * thus the "main-xxx.c" files used by Angband must handle these * attr values correctly. Also, they must handle all other attr * values, though they may do so in any way they wish, for example, * by always taking every attr code mod 16. Many of the "main-xxx.c" * files use "white space" ("attr 1" / "char 32") to "erase" or "clear" * any window, for efficiency. * * See "main-xxx.c" for a simple skeleton file which can be used to * create a "visual system" for a new platform when porting Angband. */ /* * The current "term" */ term *Term = NULL; /* grumbles */ int log_i = 0; int log_size = 0; /*** Local routines ***/ /* * Nuke a term_win (see below) */ static errr term_win_nuke(term_win *s) { /* Free the window access arrays */ FREE(s->a); FREE(s->c); /* Free the window content arrays */ FREE(s->va); FREE(s->vc); /* Free the terrain access arrays */ FREE(s->ta); FREE(s->tc); /* Free the terrain content arrays */ FREE(s->vta); FREE(s->vtc); /* Success */ return (0); } /* * Initialize a "term_win" (using the given window size) */ static errr term_win_init(term_win *s, int w, int h) { int y; /* Make the window access arrays */ s->a = C_ZNEW(h, byte *); s->c = C_ZNEW(h, char *); /* Make the window content arrays */ s->va = C_ZNEW(h * w, byte); s->vc = C_ZNEW(h * w, char); /* Make the terrain access arrays */ s->ta = C_ZNEW(h, byte *); s->tc = C_ZNEW(h, char *); /* Make the terrain content arrays */ s->vta = C_ZNEW(h * w, byte); s->vtc = C_ZNEW(h * w, char); /* Prepare the window access arrays */ for (y = 0; y < h; y++) { s->a[y] = s->va + w * y; s->c[y] = s->vc + w * y; s->ta[y] = s->vta + w * y; s->tc[y] = s->vtc + w * y; } /* Success */ return (0); } /* * Copy a "term_win" from another */ static errr term_win_copy(term_win *s, term_win *f, int w, int h) { int x, y; /* Copy contents */ for (y = 0; y < h; y++) { byte *f_aa = f->a[y]; char *f_cc = f->c[y]; byte *s_aa = s->a[y]; char *s_cc = s->c[y]; byte *f_taa = f->ta[y]; char *f_tcc = f->tc[y]; byte *s_taa = s->ta[y]; char *s_tcc = s->tc[y]; for (x = 0; x < w; x++) { *s_aa++ = *f_aa++; *s_cc++ = *f_cc++; *s_taa++ = *f_taa++; *s_tcc++ = *f_tcc++; } } /* Copy cursor */ s->cx = f->cx; s->cy = f->cy; s->cu = f->cu; s->cv = f->cv; /* Success */ return (0); } /*** External hooks ***/ /* * Execute the "Term->xtra_hook" hook, if available (see above). */ errr Term_xtra(int n, int v) { /* Verify the hook */ if (!Term->xtra_hook) return (-1); /* Call the hook */ return ((*Term->xtra_hook)(n, v)); } /*** Fake hooks ***/ /* * Hack -- fake hook for "Term_curs()" (see above) */ static errr Term_curs_hack(int x, int y) { /* Compiler silliness */ if (x || y) return (-2); /* Oops */ return (-1); } /* * Hack -- fake hook for "Term_wipe()" (see above) */ static errr Term_wipe_hack(int x, int y, int n) { /* Compiler silliness */ if (x || y || n) return (-2); /* Oops */ return (-1); } /* * Hack -- fake hook for "Term_text()" (see above) */ static errr Term_text_hack(int x, int y, int n, byte a, const char *cp) { /* Compiler silliness */ if (x || y || n || a || cp) return (-2); /* Oops */ return (-1); } /* * Hack -- fake hook for "Term_pict()" (see above) */ static errr Term_pict_hack(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) { /* Compiler silliness */ if (x || y || n || ap || cp || tap || tcp) return (-2); /* Oops */ return (-1); } /*** Efficient routines ***/ /* * Mentally draw an attr/char at a given location * * Assumes given location and values are valid. */ void Term_queue_char(term *t, int x, int y, byte a, char c, byte ta, char tc) { byte *scr_aa = t->scr->a[y]; char *scr_cc = t->scr->c[y]; byte oa = scr_aa[x]; char oc = scr_cc[x]; byte *scr_taa = t->scr->ta[y]; char *scr_tcc = t->scr->tc[y]; byte ota = scr_taa[x]; char otc = scr_tcc[x]; /* Don't change is the terrain value is 0 */ if (!ta) ta = ota; if (!tc) tc = otc; /* Hack -- Ignore non-changes */ if ((oa == a) && (oc == c) && (ota == ta) && (otc == tc)) return; /* Save the "literal" information */ scr_aa[x] = a; scr_cc[x] = c; scr_taa[x] = ta; scr_tcc[x] = tc; /* Check for new min/max row info */ if (y < t->y1) t->y1 = y; if (y > t->y2) t->y2 = y; /* Check for new min/max col info for this row */ if (x < t->x1[y]) t->x1[y] = x; if (x > t->x2[y]) t->x2[y] = x; } /* Queue a large-sized tile */ void Term_big_queue_char(term *t, int x, int y, byte a, char c, byte a1, char c1) { int hor, vert; /* Avoid warning */ (void)c; /* No tall skinny tiles */ if (tile_width > 1) { /* Horizontal first */ for (hor = 0; hor <= tile_width; hor++) { /* Queue dummy character */ if (hor != 0) { if (a & 0x80) Term_queue_char(t, x + hor, y, 255, -1, 0, 0); else Term_queue_char(t, x + hor, y, TERM_WHITE, ' ', a1, c1); } /* Now vertical */ for (vert = 1; vert <= tile_height; vert++) { /* Queue dummy character */ if (a & 0x80) Term_queue_char(t, x + hor, y + vert, 255, -1, 0, 0); else Term_queue_char(t, x + hor, y + vert, TERM_WHITE, ' ', a1, c1); } } } else { /* Only vertical */ for (vert = 1; vert <= tile_height; vert++) { /* Queue dummy character */ if (a & 0x80) Term_queue_char(t, x, y + vert, 255, -1, 0, 0); else Term_queue_char(t, x, y + vert, TERM_WHITE, ' ', a1, c1); } } } /* * Mentally draw some attr/chars at a given location * * Assumes that (x,y) is a valid location, that the first "n" characters * of the string "s" are all valid (non-zero), and that (x+n-1,y) is also * a valid location, so the first "n" characters of "s" can all be added * starting at (x,y) without causing any illegal operations. */ void Term_queue_chars(int x, int y, int n, byte a, const char *s) { int x1 = -1, x2 = -1; byte *scr_aa = Term->scr->a[y]; char *scr_cc = Term->scr->c[y]; byte *scr_taa = Term->scr->ta[y]; char *scr_tcc = Term->scr->tc[y]; /* Queue the attr/chars */ for ( ; n; x++, s++, n--) { byte oa = scr_aa[x]; char oc = scr_cc[x]; byte ota = scr_taa[x]; char otc = scr_tcc[x]; /* Hack -- Ignore non-changes */ if ((oa == a) && (oc == *s) && (ota == 0) && (otc == 0)) continue; /* Save the "literal" information */ scr_aa[x] = a; scr_cc[x] = xchar_trans(*s); scr_taa[x] = 0; scr_tcc[x] = 0; /* Note the "range" of window updates */ if (x1 < 0) x1 = x; x2 = x; } /* Expand the "change area" as needed */ if (x1 >= 0) { /* Check for new min/max row info */ if (y < Term->y1) Term->y1 = y; if (y > Term->y2) Term->y2 = y; /* Check for new min/max col info in this row */ if (x1 < Term->x1[y]) Term->x1[y] = x1; if (x2 > Term->x2[y]) Term->x2[y] = x2; } } /*** Refresh routines ***/ /* * Flush a row of the current window (see "Term_fresh") * * Display text using "Term_pict()" */ static void Term_fresh_row_pict(int y, int x1, int x2) { int x; byte *old_aa = Term->old->a[y]; char *old_cc = Term->old->c[y]; byte *scr_aa = Term->scr->a[y]; char *scr_cc = Term->scr->c[y]; byte *old_taa = Term->old->ta[y]; char *old_tcc = Term->old->tc[y]; byte *scr_taa = Term->scr->ta[y]; char *scr_tcc = Term->scr->tc[y]; byte ota; char otc; byte nta; char ntc; /* Pending length */ int fn = 0; /* Pending start */ int fx = 0; byte oa; char oc; byte na; char nc; /* Scan "modified" columns */ for (x = x1; x <= x2; x++) { /* See what is currently here */ oa = old_aa[x]; oc = old_cc[x]; /* See what is desired there */ na = scr_aa[x]; nc = scr_cc[x]; ota = old_taa[x]; otc = old_tcc[x]; nta = scr_taa[x]; ntc = scr_tcc[x]; /* Handle unchanged grids */ if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc)) { /* Flush */ if (fn) { /* Draw pending attr/char pairs */ (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx])); /* Forget */ fn = 0; } /* Skip */ continue; } /* Save new contents */ old_aa[x] = na; old_cc[x] = nc; old_taa[x] = nta; old_tcc[x] = ntc; /* Restart and Advance */ if (fn++ == 0) fx = x; } /* Flush */ if (fn) { /* Draw pending attr/char pairs */ (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx])); } } /* * Flush a row of the current window (see "Term_fresh") * * Display text using "Term_text()" and "Term_wipe()", * but use "Term_pict()" for high-bit attr/char pairs */ static void Term_fresh_row_both(int y, int x1, int x2) { int x; byte *old_aa = Term->old->a[y]; char *old_cc = Term->old->c[y]; byte *scr_aa = Term->scr->a[y]; char *scr_cc = Term->scr->c[y]; byte *old_taa = Term->old->ta[y]; char *old_tcc = Term->old->tc[y]; byte *scr_taa = Term->scr->ta[y]; char *scr_tcc = Term->scr->tc[y]; byte ota; char otc; byte nta; char ntc; /* The "always_text" flag */ int always_text = Term->always_text; /* Pending length */ int fn = 0; /* Pending start */ int fx = 0; /* Pending attr */ byte fa = Term->attr_blank; byte oa; char oc; byte na; char nc; /* Scan "modified" columns */ for (x = x1; x <= x2; x++) { /* See what is currently here */ oa = old_aa[x]; oc = old_cc[x]; /* See what is desired there */ na = scr_aa[x]; nc = scr_cc[x]; ota = old_taa[x]; otc = old_tcc[x]; nta = scr_taa[x]; ntc = scr_tcc[x]; /* Handle unchanged grids */ if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc)) { /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Skip */ continue; } /* Save new contents */ old_aa[x] = na; old_cc[x] = nc; old_taa[x] = nta; old_tcc[x] = ntc; /* Handle high-bit attr/chars */ if ((na & 0x80) && (nc & 0x80)) { /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* 2nd byte of bigtile */ if ((na == 255) && (nc == (char) -1)) continue; /* Hack -- Draw the special attr/char pair */ (void)((*Term->pict_hook)(x, y, 1, &na, &nc, &nta, &ntc)); /* Skip */ continue; } /* Notice new color */ if (fa != na) { /* Flush */ if (fn) { /* Draw the pending chars */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Hack -- Erase "leading" spaces */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Save the new color */ fa = na; } /* Restart and Advance */ if (fn++ == 0) fx = x; } /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } } } /* * Flush a row of the current window (see "Term_fresh") * * Display text using "Term_text()" and "Term_wipe()" */ static void Term_fresh_row_text(int y, int x1, int x2) { int x; byte *old_aa = Term->old->a[y]; char *old_cc = Term->old->c[y]; byte *scr_aa = Term->scr->a[y]; char *scr_cc = Term->scr->c[y]; /* The "always_text" flag */ int always_text = Term->always_text; /* Pending length */ int fn = 0; /* Pending start */ int fx = 0; /* Pending attr */ byte fa = Term->attr_blank; byte oa; char oc; byte na; char nc; /* Scan "modified" columns */ for (x = x1; x <= x2; x++) { /* See what is currently here */ oa = old_aa[x]; oc = old_cc[x]; /* See what is desired there */ na = scr_aa[x]; nc = scr_cc[x]; /* Handle unchanged grids */ if ((na == oa) && (nc == oc)) { /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Skip */ continue; } /* Save new contents */ old_aa[x] = na; old_cc[x] = nc; /* Notice new color */ if (fa != na) { /* Flush */ if (fn) { /* Draw the pending chars */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Hack -- Erase "leading" spaces */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Save the new color */ fa = na; } /* Restart and Advance */ if (fn++ == 0) fx = x; } /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } } } byte tile_width = 1; /* Tile width in units of font width */ byte tile_height = 1; /* Tile height in units of font height */ /* Helper variables for large cursor */ bool bigcurs = FALSE; bool smlcurs = TRUE; /* * Actually perform all requested changes to the window * * If absolutely nothing has changed, not even temporarily, or if the * current "Term" is not mapped, then this function will return 1 and * do absolutely nothing. * * Note that when "soft_cursor" is true, we erase the cursor (if needed) * whenever anything has changed, and redraw it (if needed) after all of * the screen updates are complete. This will induce a small amount of * "cursor flicker" but only when the screen has been updated. If the * screen is updated and then restored, you may still get this flicker. * * When "soft_cursor" is not true, we make the cursor invisible before * doing anything else if it is supposed to be invisible by the time we * are done, and we make it visible after moving it to its final location * after all of the screen updates are complete. * * Note that "Term_xtra(TERM_XTRA_CLEAR,0)" must erase the entire screen, * including the cursor, if needed, and may place the cursor anywhere. * * Note that "Term_xtra(TERM_XTRA_FROSH,y)" will be always be called * after any row "y" has been "flushed", unless the "Term->never_frosh" * flag is set, and "Term_xtra(TERM_XTRA_FRESH,0)" will be called after * all of the rows have been "flushed". * * Note the use of three different functions to handle the actual flush, * based on the settings of the "Term->always_pict" and "Term->higher_pict" * flags (see below). * * The three helper functions (above) work by collecting similar adjacent * grids into stripes, and then sending each stripe to "Term->pict_hook", * "Term->text_hook", or "Term->wipe_hook", based on the settings of the * "Term->always_pict" and "Term->higher_pict" flags, which select which * of the helper functions to call to flush each row. * * The helper functions currently "skip" any grids which already contain * the desired contents. This may or may not be the best method, especially * when the desired content fits nicely into the current stripe. For example, * it might be better to go ahead and queue them while allowed, but keep a * count of the "trailing skipables", then, when time to flush, or when a * "non skippable" is found, force a flush if there are too many skippables. * * Perhaps an "initialization" stage, where the "text" (and "attr") * buffers are "filled" with information, converting "blanks" into * a convenient representation, and marking "skips" with "zero chars", * and then some "processing" is done to determine which chars to skip. * * Currently, the helper functions are optimal for systems which prefer * to "print a char + move a char + print a char" to "print three chars", * and for applications that do a lot of "detailed" color printing. * * In the two "queue" functions, total "non-changes" are "pre-skipped". * The helper functions must also handle situations in which the contents * of a grid are changed, but then changed back to the original value, * and situations in which two grids in the same row are changed, but * the grids between them are unchanged. * * If the "Term->always_pict" flag is set, then "Term_fresh_row_pict()" * will be used instead of "Term_fresh_row_text()". This allows all the * modified grids to be collected into stripes of attr/char pairs, which * are then sent to the "Term->pict_hook" hook, which can draw these pairs * in whatever way it would like. * * If the "Term->higher_pict" flag is set, then "Term_fresh_row_both()" * will be used instead of "Term_fresh_row_text()". This allows all the * "special" attr/char pairs (in which both the attr and char have the * high-bit set) to be sent (one pair at a time) to the "Term->pict_hook" * hook, which can draw these pairs in whatever way it would like. * * Normally, the "Term_wipe()" function is used only to display "blanks" * that were induced by "Term_clear()" or "Term_erase()", and then only * if the "attr_blank" and "char_blank" fields have not been redefined * to use "white space" instead of the default "black space". Actually, * the "Term_wipe()" function is used to display all "black" text, such * as the default "spaces" created by "Term_clear()" and "Term_erase()". * * Note that the "Term->always_text" flag will disable the use of the * "Term_wipe()" function hook entirely, and force all text, even text * drawn in the color "black", to be explicitly drawn. This is useful * for machines which implement "Term_wipe()" by just drawing spaces. * * Note that the "Term->always_pict" flag will disable the use of the * "Term_wipe()" function entirely, and force everything, even text * drawn in the attr "black", to be explicitly drawn. * * Note that if no "black" text is ever drawn, and if "attr_blank" is * not "zero", then the "Term_wipe" hook will never be used, even if * the "Term->always_text" flag is not set. * * This function does nothing unless the "Term" is "mapped", which allows * certain systems to optimize the handling of "closed" windows. * * On systems with a "soft" cursor, we must explicitly erase the cursor * before flushing the output, if needed, to prevent a "jumpy" refresh. * The actual method for this is horrible, but there is very little that * we can do to simplify it efficiently. XXX XXX XXX * * On systems with a "hard" cursor, we will "hide" the cursor before * flushing the output, if needed, to avoid a "flickery" refresh. It * would be nice to *always* hide the cursor during the refresh, but * this might be expensive (and/or ugly) on some machines. * * The "Term->icky_corner" flag is used to avoid calling "Term_wipe()" * or "Term_pict()" or "Term_text()" on the bottom right corner of the * window, which might induce "scrolling" or other nasty stuff on old * dumb terminals. This flag is handled very efficiently. We assume * that the "Term_curs()" call will prevent placing the cursor in the * corner, if needed, though I doubt such placement is ever a problem. * Currently, the use of "Term->icky_corner" and "Term->soft_cursor" * together may result in undefined behavior. */ errr Term_fresh(void) { int x, y; int w = Term->wid; int h = Term->hgt; int y1 = Term->y1; int y2 = Term->y2; term_win *old = Term->old; term_win *scr = Term->scr; /* Do nothing unless "mapped" */ if (!Term->mapped_flag) return (1); /* Trivial Refresh */ if ((y1 > y2) && (scr->cu == old->cu) && (scr->cv == old->cv) && (scr->cx == old->cx) && (scr->cy == old->cy) && !(Term->total_erase)) { /* Nothing */ return (1); } /* Paranoia -- use "fake" hooks to prevent core dumps */ if (!Term->curs_hook) Term->curs_hook = Term_curs_hack; if (!Term->bigcurs_hook) Term->bigcurs_hook = Term->curs_hook; if (!Term->wipe_hook) Term->wipe_hook = Term_wipe_hack; if (!Term->text_hook) Term->text_hook = Term_text_hack; if (!Term->pict_hook) Term->pict_hook = Term_pict_hack; /* Handle "total erase" */ if (Term->total_erase) { byte na = Term->attr_blank; char nc = Term->char_blank; /* Physically erase the entire window */ Term_xtra(TERM_XTRA_CLEAR, 0); /* Hack -- clear all "cursor" data */ old->cv = old->cu = FALSE; old->cx = old->cy = 0; /* Wipe each row */ for (y = 0; y < h; y++) { byte *aa = old->a[y]; char *cc = old->c[y]; byte *taa = old->ta[y]; char *tcc = old->tc[y]; /* Wipe each column */ for (x = 0; x < w; x++) { /* Wipe each grid */ *aa++ = na; *cc++ = nc; *taa++ = na; *tcc++ = nc; } } /* Redraw every row */ Term->y1 = y1 = 0; Term->y2 = y2 = h - 1; /* Redraw every column */ for (y = 0; y < h; y++) { Term->x1[y] = 0; Term->x2[y] = w - 1; } /* Forget "total erase" */ Term->total_erase = FALSE; } /* Cursor update -- Erase old Cursor */ if (Term->soft_cursor) { /* Cursor was visible */ if (!old->cu && old->cv) { int tx = old->cx; int ty = old->cy; byte *old_aa = old->a[ty]; char *old_cc = old->c[ty]; byte oa = old_aa[tx]; char oc = old_cc[tx]; byte *old_taa = old->ta[ty]; char *old_tcc = old->tc[ty]; byte ota = old_taa[tx]; char otc = old_tcc[tx]; /* Hack -- use "Term_pict()" always */ if (Term->always_pict) { (void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc, &ota, &otc)); } /* Hack -- use "Term_pict()" sometimes */ else if (Term->higher_pict && (oa & 0x80) && (oc & 0x80)) { (void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc, &ota, &otc)); } /* Hack -- restore the actual character */ else if (oa || Term->always_text) { (void)((*Term->text_hook)(tx, ty, 1, oa, &oc)); } /* Hack -- erase the grid */ else { (void)((*Term->wipe_hook)(tx, ty, 1)); } } } /* Cursor Update -- Erase old Cursor */ else { /* Cursor will be invisible */ if (scr->cu || !scr->cv) { /* Make the cursor invisible */ Term_xtra(TERM_XTRA_SHAPE, 0); } } /* Something to update */ if (y1 <= y2) { /* Handle "icky corner" */ if (Term->icky_corner) { /* Avoid the corner */ if (y2 >= h - 1) { /* Avoid the corner */ if (Term->x2[h - 1] > w - 2) { /* Avoid the corner */ Term->x2[h - 1] = w - 2; } } } /* Scan the "modified" rows */ for (y = y1; y <= y2; ++y) { int x1 = Term->x1[y]; int x2 = Term->x2[y]; /* Flush each "modified" row */ if (x1 <= x2) { /* Always use "Term_pict()" */ if (Term->always_pict) { /* Flush the row */ Term_fresh_row_pict(y, x1, x2); } /* Sometimes use "Term_pict()" */ else if (Term->higher_pict) { /* Flush the row */ Term_fresh_row_both(y, x1, x2); } /* Never use "Term_pict()" */ else { /* Flush the row */ Term_fresh_row_text(y, x1, x2); } /* This row is all done */ Term->x1[y] = w; Term->x2[y] = 0; /* Hack -- Flush that row (if allowed) */ if (!Term->never_frosh) Term_xtra(TERM_XTRA_FROSH, y); } } /* No rows are invalid */ Term->y1 = h; Term->y2 = 0; } /* Cursor update -- Show new Cursor */ if (Term->soft_cursor) { /* Draw the cursor */ if (!scr->cu && scr->cv) { if ((((tile_width > 1)||(tile_height > 1)) && (!smlcurs) && (Term->saved == 0) && (scr->cy > 0)) || bigcurs) { /* Double width cursor for the Bigtile mode */ (void)((*Term->bigcurs_hook)(scr->cx, scr->cy)); } else { /* Call the cursor display routine */ (void)((*Term->curs_hook)(scr->cx, scr->cy)); } } } /* Cursor Update -- Show new Cursor */ else { /* The cursor is useless, hide it */ if (scr->cu) { /* Paranoia -- Put the cursor NEAR where it belongs */ (void)((*Term->curs_hook)(w - 1, scr->cy)); /* Make the cursor invisible */ /* Term_xtra(TERM_XTRA_SHAPE, 0); */ } /* The cursor is invisible, hide it */ else if (!scr->cv) { /* Paranoia -- Put the cursor where it belongs */ (void)((*Term->curs_hook)(scr->cx, scr->cy)); /* Make the cursor invisible */ /* Term_xtra(TERM_XTRA_SHAPE, 0); */ } /* The cursor is visible, display it correctly */ else { /* Put the cursor where it belongs */ (void)((*Term->curs_hook)(scr->cx, scr->cy)); /* Make the cursor visible */ Term_xtra(TERM_XTRA_SHAPE, 1); } } /* Save the "cursor state" */ old->cu = scr->cu; old->cv = scr->cv; old->cx = scr->cx; old->cy = scr->cy; /* Actually flush the output */ Term_xtra(TERM_XTRA_FRESH, 0); /* Success */ return (0); } /*** Output routines ***/ /* * Set the cursor visibility */ errr Term_set_cursor(bool v) { /* Already done */ if (Term->scr->cv == v) return (1); /* Change */ Term->scr->cv = v; /* Success */ return (0); } /* * Place the cursor at a given location * * Note -- "illegal" requests do not move the cursor. */ errr Term_gotoxy(int x, int y) { int w = Term->wid; int h = Term->hgt; /* Verify */ if ((x < 0) || (x >= w)) return (-1); if ((y < 0) || (y >= h)) return (-1); /* Remember the cursor */ Term->scr->cx = x; Term->scr->cy = y; /* The cursor is not useless */ Term->scr->cu = 0; /* Success */ return (0); } /* * At a given location, place an attr/char * Do not change the cursor position * No visual changes until "Term_fresh()". */ errr Term_draw(int x, int y, byte a, char c) { int w = Term->wid; int h = Term->hgt; /* Verify location */ if ((x < 0) || (x >= w)) return (-1); if ((y < 0) || (y >= h)) return (-1); /* Paranoia -- illegal char */ if (!c) return (-2); /* Queue it for later */ Term_queue_char(Term, x, y, a, c, 0, 0); /* Success */ return (0); } /* * Using the given attr, add the given char at the cursor. * * We return "-2" if the character is "illegal". XXX XXX * * We return "-1" if the cursor is currently unusable. * * We queue the given attr/char for display at the current * cursor location, and advance the cursor to the right, * marking it as unuable and returning "1" if it leaves * the screen, and otherwise returning "0". * * So when this function, or the following one, return a * positive value, future calls to either function will * return negative ones. */ errr Term_addch(byte a, char c) { int w = Term->wid; /* Handle "unusable" cursor */ if (Term->scr->cu) return (-1); /* Paranoia -- no illegal chars */ if (!c) return (-2); /* Queue the given character for display */ Term_queue_char(Term, Term->scr->cx, Term->scr->cy, a, c, 0, 0); /* Advance the cursor */ Term->scr->cx++; /* Success */ if (Term->scr->cx < w) return (0); /* Note "Useless" cursor */ Term->scr->cu = 1; /* Note "Useless" cursor */ return (1); } /* * At the current location, using an attr, add a string * * We also take a length "n", using negative values to imply * the largest possible value, and then we use the minimum of * this length and the "actual" length of the string as the * actual number of characters to attempt to display, never * displaying more characters than will actually fit, since * we do NOT attempt to "wrap" the cursor at the screen edge. * * We return "-1" if the cursor is currently unusable. * We return "N" if we were "only" able to write "N" chars, * even if all of the given characters fit on the screen, * and mark the cursor as unusable for future attempts. * * So when this function, or the preceding one, return a * positive value, future calls to either function will * return negative ones. */ errr Term_addstr(int n, byte a, const char *buf) { int k; int w = Term->wid; errr res = 0; char s[1024]; /* Copy to a rewriteable string */ my_strcpy(s, buf, 1024); /* Translate it to 7-bit ASCII or system-specific format */ xstr_trans(s, LATIN1); /* Handle "unusable" cursor */ if (Term->scr->cu) return (-1); /* Obtain maximal length */ k = (n < 0) ? (w + 1) : n; /* Obtain the usable string length */ for (n = 0; (n < k) && s[n]; n++) /* loop */; /* React to reaching the edge of the screen */ if (Term->scr->cx + n >= w) res = n = w - Term->scr->cx; /* Queue the first "n" characters for display */ Term_queue_chars(Term->scr->cx, Term->scr->cy, n, a, s); /* Advance the cursor */ Term->scr->cx += n; /* Hack -- Notice "Useless" cursor */ if (res) Term->scr->cu = 1; /* Success (usually) */ return (res); } /* * Move to a location and, using an attr, add a char */ errr Term_putch(int x, int y, byte a, char c) { errr res; /* Move first */ if ((res = Term_gotoxy(x, y)) != 0) return (res); /* Then add the char */ if ((res = Term_addch(a, c)) != 0) return (res); /* Success */ return (0); } /* * Move to a location and, using an attr, add a big tile */ void Term_big_putch(int x, int y, byte a, char c) { int hor, vert; /* Avoid warning */ (void)c; /* No tall skinny tiles */ if (tile_width > 1) { /* Horizontal first */ for (hor = 0; hor <= tile_width; hor++) { /* Queue dummy character */ if (hor != 0) { if (a & 0x80) Term_putch(x + hor, y, 255, -1); else Term_putch(x + hor, y, TERM_WHITE, ' '); } /* Now vertical */ for (vert = 1; vert <= tile_height; vert++) { /* Queue dummy character */ if (a & 0x80) Term_putch(x + hor, y + vert, 255, -1); else Term_putch(x + hor, y + vert, TERM_WHITE, ' '); } } } else { /* Only vertical */ for (vert = 1; vert <= tile_height; vert++) { /* Queue dummy character */ if (a & 0x80) Term_putch(x, y + vert, 255, -1); else Term_putch(x, y + vert, TERM_WHITE, ' '); } } } /* * Move to a location and, using an attr, add a string */ errr Term_putstr(int x, int y, int n, byte a, const char *s) { errr res; if (!Term) return 0; /* Move first */ if ((res = Term_gotoxy(x, y)) != 0) return (res); /* Then add the string */ if ((res = Term_addstr(n, a, s)) != 0) return (res); /* Success */ return (0); } /* * Place cursor at (x,y), and clear the next "n" chars */ errr Term_erase(int x, int y, int n) { int i; int w = Term->wid; /* int h = Term->hgt; */ int x1 = -1; int x2 = -1; byte na = Term->attr_blank; char nc = Term->char_blank; byte *scr_aa; char *scr_cc; byte *scr_taa; char *scr_tcc; /* Place cursor */ if (Term_gotoxy(x, y)) return (-1); /* Force legal size */ if (x + n > w) n = w - x; /* Fast access */ scr_aa = Term->scr->a[y]; scr_cc = Term->scr->c[y]; scr_taa = Term->scr->ta[y]; scr_tcc = Term->scr->tc[y]; if ((n > 0) && (scr_cc[x] == (char) -1) && (scr_aa[x] == 255)) { x--; n++; } /* Scan every column */ for (i = 0; i < n; i++, x++) { byte oa = scr_aa[x]; char oc = scr_cc[x]; /* Hack -- Ignore "non-changes" */ if ((oa == na) && (oc == nc)) continue; /* Save the "literal" information */ scr_aa[x] = na; scr_cc[x] = nc; scr_taa[x] = 0; scr_tcc[x] = 0; /* Track minimum changed column */ if (x1 < 0) x1 = x; /* Track maximum changed column */ x2 = x; } /* Expand the "change area" as needed */ if (x1 >= 0) { /* Check for new min/max row info */ if (y < Term->y1) Term->y1 = y; if (y > Term->y2) Term->y2 = y; /* Check for new min/max col info in this row */ if (x1 < Term->x1[y]) Term->x1[y] = x1; if (x2 > Term->x2[y]) Term->x2[y] = x2; } /* Success */ return (0); } /* * Clear the entire window, and move to the top left corner * * Note the use of the special "total_erase" code */ errr Term_clear(void) { int x, y; int w = Term->wid; int h = Term->hgt; byte na = Term->attr_blank; char nc = Term->char_blank; /* Cursor usable */ Term->scr->cu = 0; /* Cursor to the top left */ Term->scr->cx = Term->scr->cy = 0; /* Wipe each row */ for (y = 0; y < h; y++) { byte *scr_aa = Term->scr->a[y]; char *scr_cc = Term->scr->c[y]; byte *scr_taa = Term->scr->ta[y]; char *scr_tcc = Term->scr->tc[y]; /* Wipe each column */ for (x = 0; x < w; x++) { scr_aa[x] = na; scr_cc[x] = nc; scr_taa[x] = 0; scr_tcc[x] = 0; } /* This row has changed */ Term->x1[y] = 0; Term->x2[y] = w - 1; } /* Every row has changed */ Term->y1 = 0; Term->y2 = h - 1; /* Force "total erase" */ Term->total_erase = TRUE; /* Success */ return (0); } /* * Redraw (and refresh) the whole window. */ errr Term_redraw(void) { /* Force "total erase" */ Term->total_erase = TRUE; /* Hack -- Refresh */ Term_fresh(); /* Success */ return (0); } /* * Redraw part of a window. */ errr Term_redraw_section(int x1, int y1, int x2, int y2) { int i, j; char *c_ptr; /* Bounds checking */ if (y2 >= Term->hgt) y2 = Term->hgt - 1; if (x2 >= Term->wid) x2 = Term->wid - 1; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Set y limits */ Term->y1 = y1; Term->y2 = y2; /* Set the x limits */ for (i = Term->y1; i <= Term->y2; i++) { if ((x1 > 0) && (Term->old->a[i][x1] == 255)) x1--; Term->x1[i] = x1; Term->x2[i] = x2; c_ptr = Term->old->c[i]; /* Clear the section so it is redrawn */ for (j = x1; j <= x2; j++) { /* Hack - set the old character to "none" */ c_ptr[j] = 0; } } /* Hack -- Refresh */ Term_fresh(); /* Success */ return (0); } /*** Access routines ***/ /* * Extract the cursor visibility */ errr Term_get_cursor(bool *v) { /* Extract visibility */ (*v) = Term->scr->cv; /* Success */ return (0); } /* * Extract the current window size */ errr Term_get_size(int *w, int *h) { *w = Term ? Term->wid : 80; *h = Term ? Term->hgt : 24; return 0; } /* * Extract the current cursor location */ errr Term_locate(int *x, int *y) { /* Access the cursor */ (*x) = Term->scr->cx; (*y) = Term->scr->cy; /* Warn about "useless" cursor */ if (Term->scr->cu) return (1); /* Success */ return (0); } /* * At a given location, determine the "current" attr and char * Note that this refers to what will be on the window after the * next call to "Term_fresh()". It may or may not already be there. */ errr Term_what(int x, int y, byte *a, char *c) { int w = Term->wid; int h = Term->hgt; /* Verify location */ if ((x < 0) || (x >= w)) return (-1); if ((y < 0) || (y >= h)) return (-1); /* Direct access */ (*a) = Term->scr->a[y][x]; (*c) = Term->scr->c[y][x]; /* Success */ return (0); } /*** Input routines ***/ /* * Flush and forget the input */ errr Term_flush(void) { if (!Term) return 0; /* Hack -- Flush all events */ Term_xtra(TERM_XTRA_FLUSH, 0); /* Forget all keypresses */ Term->key_head = Term->key_tail = 0; /* Success */ return (0); } /* sketchy keylogging pt. 2 */ static void log_keypress(ui_event e) { if (e.type != EVT_KBRD) return; if (!e.key.code) return; keylog[log_i] = e.key; if (log_size < KEYLOG_SIZE) log_size++; log_i = (log_i + 1) % KEYLOG_SIZE; } /* * Add a keypress to the "queue" */ errr Term_keypress(keycode_t k, byte mods) { /* Hack -- Refuse to enqueue non-keys */ if (!k) return (-1); /* Store the char, advance the queue */ Term->key_queue[Term->key_head].type = EVT_KBRD; Term->key_queue[Term->key_head].key.code = k; Term->key_queue[Term->key_head].key.mods = mods; Term->key_head++; /* Circular queue, handle wrap */ if (Term->key_head == Term->key_size) Term->key_head = 0; /* Success (unless overflow) */ if (Term->key_head != Term->key_tail) return (0); /* Problem */ return (1); } /* * Add a mouse event to the "queue" */ errr Term_mousepress(int x, int y, char button) { /* Store the char, advance the queue */ Term->key_queue[Term->key_head].type = EVT_MOUSE; Term->key_queue[Term->key_head].mouse.x = x; Term->key_queue[Term->key_head].mouse.y = y; Term->key_queue[Term->key_head].mouse.button = button; Term->key_head++; /* Circular queue, handle wrap */ if (Term->key_head == Term->key_size) Term->key_head = 0; /* Success (unless overflow) */ if (Term->key_head != Term->key_tail) return (0); #if 0 /* Hack -- Forget the oldest key */ if (++Term->key_tail == Term->key_size) Term->key_tail = 0; #endif /* Problem */ return (1); } /* * Add a keypress to the FRONT of the "queue" */ errr Term_key_push(int k) { ui_event ke; if (!k) return (-1); ke.type = EVT_KBRD; ke.key.code = k; ke.key.mods = 0; return Term_event_push(&ke); } errr Term_event_push(const ui_event *ke) { /* Hack -- Refuse to enqueue non-keys */ if (!ke) return (-1); /* Hack -- Overflow may induce circular queue */ if (Term->key_tail == 0) Term->key_tail = Term->key_size; /* Back up, Store the char */ /* Store the char, advance the queue */ Term->key_queue[--Term->key_tail] = *ke; /* Success (unless overflow) */ if (Term->key_head != Term->key_tail) return (0); #if 0 /* Hack -- Forget the oldest key */ if (++Term->key_tail == Term->key_size) Term->key_tail = 0; #endif /* Problem */ return (1); } /* * Check for a pending keypress on the key queue. * * Store the keypress, if any, in "ch", and return "0". * Otherwise store "zero" in "ch", and return "1". * * Wait for a keypress if "wait" is true. * * Remove the keypress if "take" is true. */ errr Term_inkey(ui_event *ch, bool wait, bool take) { /* Assume no key */ memset(ch, 0, sizeof *ch); /* Hack -- get bored */ if (!Term->never_bored) { /* Process random events */ Term_xtra(TERM_XTRA_BORED, 0); } /* Wait */ if (wait) { /* Process pending events while necessary */ while (Term->key_head == Term->key_tail) { /* Process events (wait for one) */ Term_xtra(TERM_XTRA_EVENT, TRUE); } } /* Do not Wait */ else { /* Process pending events if necessary */ if (Term->key_head == Term->key_tail) { /* Process events (do not wait) */ Term_xtra(TERM_XTRA_EVENT, FALSE); } } /* No keys are ready */ if (Term->key_head == Term->key_tail) return (1); /* Extract the next keypress */ (*ch) = Term->key_queue[Term->key_tail]; /* sketchy key loggin */ log_keypress(*ch); /* If requested, advance the queue, wrap around if necessary */ if (take && (++Term->key_tail == Term->key_size)) Term->key_tail = 0; /* Success */ return (0); } /*** Extra routines ***/ /* * Save the "requested" screen into the "memorized" screen * * Every "Term_save()" should match exactly one "Term_load()" */ errr Term_save(void) { int w = Term->wid; int h = Term->hgt; term_win *mem; /* Allocate window */ mem = ZNEW(term_win); /* Initialize window */ term_win_init(mem, w, h); /* Grab */ term_win_copy(mem, Term->scr, w, h); /* Front of the queue */ mem->next = Term->mem; Term->mem = mem; /* One more saved */ Term->saved++; /* Success */ return (0); } /* * Restore the "requested" contents (see above). * * Every "Term_save()" should match exactly one "Term_load()" */ errr Term_load(void) { int y; int w = Term->wid; int h = Term->hgt; term_win *tmp; /* Pop off window from the list */ if (Term->mem) { /* Save pointer to old mem */ tmp = Term->mem; /* Forget it */ Term->mem = Term->mem->next; /* Load */ term_win_copy(Term->scr, tmp, w, h); /* Free the old window */ (void)term_win_nuke(tmp); /* Kill it */ FREE(tmp); } /* Assume change */ for (y = 0; y < h; y++) { /* Assume change */ Term->x1[y] = 0; Term->x2[y] = w - 1; } /* Assume change */ Term->y1 = 0; Term->y2 = h - 1; /* One less saved */ Term->saved--; /* Success */ return (0); } /* * React to a new physical window size. */ errr Term_resize(int w, int h) { int i; int wid, hgt; byte *hold_x1; byte *hold_x2; term_win *hold_old; term_win *hold_scr; term_win *hold_mem; term_win *hold_tmp; ui_event evt = EVENT_EMPTY; evt.type = EVT_RESIZE; /* Resizing is forbidden */ if (Term->fixed_shape) return (-1); /* Ignore illegal changes */ if ((w < 1) || (h < 1)) return (-1); /* Ignore non-changes */ if ((Term->wid == w) && (Term->hgt == h)) return (1); /* Minimum dimensions */ wid = MIN(Term->wid, w); hgt = MIN(Term->hgt, h); /* Save scanners */ hold_x1 = Term->x1; hold_x2 = Term->x2; /* Save old window */ hold_old = Term->old; /* Save old window */ hold_scr = Term->scr; /* Save old window */ hold_mem = Term->mem; /* Save old window */ hold_tmp = Term->tmp; /* Create new scanners */ Term->x1 = C_ZNEW(h, byte); Term->x2 = C_ZNEW(h, byte); /* Create new window */ Term->old = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->old, w, h); /* Save the contents */ term_win_copy(Term->old, hold_old, wid, hgt); /* Create new window */ Term->scr = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->scr, w, h); /* Save the contents */ term_win_copy(Term->scr, hold_scr, wid, hgt); /* If needed */ if (hold_mem) { /* Create new window */ Term->mem = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->mem, w, h); /* Save the contents */ term_win_copy(Term->mem, hold_mem, wid, hgt); } /* If needed */ if (hold_tmp) { /* Create new window */ Term->tmp = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->tmp, w, h); /* Save the contents */ term_win_copy(Term->tmp, hold_tmp, wid, hgt); } /* Free some arrays */ FREE(hold_x1); FREE(hold_x2); /* Nuke */ term_win_nuke(hold_old); /* Kill */ FREE(hold_old); /* Illegal cursor */ if (Term->old->cx >= w) Term->old->cu = 1; if (Term->old->cy >= h) Term->old->cu = 1; /* Nuke */ term_win_nuke(hold_scr); /* Kill */ FREE(hold_scr); /* Illegal cursor */ if (Term->scr->cx >= w) Term->scr->cu = 1; if (Term->scr->cy >= h) Term->scr->cu = 1; /* If needed */ if (hold_mem) { /* Nuke */ term_win_nuke(hold_mem); /* Kill */ FREE(hold_mem); /* Illegal cursor */ if (Term->mem->cx >= w) Term->mem->cu = 1; if (Term->mem->cy >= h) Term->mem->cu = 1; } /* If needed */ if (hold_tmp) { /* Nuke */ term_win_nuke(hold_tmp); /* Kill */ FREE(hold_tmp); /* Illegal cursor */ if (Term->tmp->cx >= w) Term->tmp->cu = 1; if (Term->tmp->cy >= h) Term->tmp->cu = 1; } /* Save new size */ Term->wid = w; Term->hgt = h; /* Force "total erase" */ Term->total_erase = TRUE; /* Assume change */ for (i = 0; i < h; i++) { /* Assume change */ Term->x1[i] = 0; Term->x2[i] = w - 1; } /* Assume change */ Term->y1 = 0; Term->y2 = h - 1; /* Push a resize event onto the stack */ Term_event_push(&evt); /* Success */ return (0); } /* * Activate a new Term (and deactivate the current Term) * * This function is extremely important, and also somewhat bizarre. * It is the only function that should "modify" the value of "Term". * * To "create" a valid "term", one should do "term_init(t)", then * set the various flags and hooks, and then do "Term_activate(t)". */ errr Term_activate(term *t) { /* Hack -- already done */ if (Term == t) return (1); /* Deactivate the old Term */ if (Term) Term_xtra(TERM_XTRA_LEVEL, 0); /* Hack -- Call the special "init" hook */ if (t && !t->active_flag) { /* Call the "init" hook */ if (t->init_hook) (*t->init_hook)(t); /* Remember */ t->active_flag = TRUE; /* Assume mapped */ t->mapped_flag = TRUE; } /* Remember the Term */ Term = t; /* Activate the new Term */ if (Term) Term_xtra(TERM_XTRA_LEVEL, 1); /* Success */ return (0); } /* * Nuke a term */ errr term_nuke(term *t) { /* Hack -- Call the special "nuke" hook */ if (t->active_flag) { /* Call the "nuke" hook */ if (t->nuke_hook) (*t->nuke_hook)(t); /* Remember */ t->active_flag = FALSE; /* Assume not mapped */ t->mapped_flag = FALSE; } /* Nuke "displayed" */ term_win_nuke(t->old); /* Kill "displayed" */ FREE(t->old); /* Nuke "requested" */ term_win_nuke(t->scr); /* Kill "requested" */ FREE(t->scr); /* If needed */ if (t->mem) { /* Nuke "memorized" */ term_win_nuke(t->mem); /* Kill "memorized" */ FREE(t->mem); } /* If needed */ if (t->tmp) { /* Nuke "temporary" */ term_win_nuke(t->tmp); /* Kill "temporary" */ FREE(t->tmp); } /* Free some arrays */ FREE(t->x1); FREE(t->x2); /* Free the input queue */ FREE(t->key_queue); /* Success */ return (0); } /* * Initialize a term, using a window of the given size. * Also prepare the "input queue" for "k" keypresses * By default, the cursor starts out "invisible" * By default, we "erase" using "black spaces" */ errr term_init(term *t, int w, int h, int k) { int y; /* Wipe it */ (void)WIPE(t, term); /* Prepare the input queue */ t->key_head = t->key_tail = 0; /* Determine the input queue size */ t->key_size = k; /* Allocate the input queue */ t->key_queue = C_ZNEW(t->key_size, ui_event); /* Save the size */ t->wid = w; t->hgt = h; /* Allocate change arrays */ t->x1 = C_ZNEW(h, byte); t->x2 = C_ZNEW(h, byte); /* Allocate "displayed" */ t->old = ZNEW(term_win); /* Initialize "displayed" */ term_win_init(t->old, w, h); /* Allocate "requested" */ t->scr = ZNEW(term_win); /* Initialize "requested" */ term_win_init(t->scr, w, h); /* Assume change */ for (y = 0; y < h; y++) { /* Assume change */ t->x1[y] = 0; t->x2[y] = w - 1; } /* Assume change */ t->y1 = 0; t->y2 = h - 1; /* Force "total erase" */ t->total_erase = TRUE; /* Default "blank" */ t->attr_blank = 0; t->char_blank = ' '; /* No saves yet */ t->saved = 0; /* Success */ return (0); } bool panel_contains(unsigned int y, unsigned int x) { unsigned int hgt; unsigned int wid; if (!Term) return TRUE; hgt = SCREEN_HGT; wid = SCREEN_WID; return (y - Term->offset_y) < hgt && (x - Term->offset_x) < wid; } angband-v3.3.2/src/main-win.c0000644000175000017500000031765211651552410015277 0ustar chriscchrisc/* * File: main-win.c * Purpose: Pseudo-UI for end-to-end testing. * * Copyright (c) 1997 Ben Harrison, Skirmantas Kligys, Robert Ruehlmann, * and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ /* * This file helps Angband work with Windows computers. * * To use this file, use an appropriate "Makefile" or "Project File", * make sure that "WINDOWS" and/or "WIN32" are defined somewhere, and * make sure to obtain various extra files as described below. * * The Windows version has been tested to compile with Visual C++ 5.0 * and 6.0, Cygwin 1.0, Borland C++ 5.5 command line tools, and lcc-win32. * * * See also "main-dos.c" and "main-ibm.c". * * * The "lib/pref/pref-win.prf" file contains keymaps, macro definitions, * and/or color redefinitions. * * The "lib/pref/font-win.prf" contains attr/char mappings for use with the * normal "*.fon" font files in the "lib/xtra/font/" directory. * * The "lib/pref/graf-win.prf" contains attr/char mappings for use with the * special "*.bmp" bitmap files in the "lib/xtra/graf/" directory, which * are activated by a menu item. * * * Compiling this file, and using the resulting executable, requires * several extra files not distributed with the standard Angband code. * If "USE_GRAPHICS" is defined, then "readdib.h" and "readdib.c" must * be placed into "src/", and the "8x8.bmp" bitmap file must be placed * into "lib/xtra/graf". In any case, some "*.fon" files (including * "8X13.FON" if nothing else) must be placed into "lib/xtra/font/". * If "USE_SOUND" is defined, then some special library (for example, * "winmm.lib") may need to be linked in, and desired "*.WAV" sound * files must be placed into "lib/xtra/sound/". All of these extra * files can be found in the "ext-win" archive. * * * The "Term_xtra_win_clear()" function should probably do a low-level * clear of the current window, and redraw the borders and other things, * if only for efficiency. XXX XXX XXX * * A simpler method is needed for selecting the "tile size" for windows. * XXX XXX XXX * * Special "Windows Help Files" can be placed into "lib/xtra/help/" for * use with the "winhelp.exe" program. These files *may* be available * at the ftp site somewhere, but I have not seen them. XXX XXX XXX * * ToDo: The screensaver mode should implement ScreenSaverConfigureDialog, * DefScreenSaverProc, and ScreenSaverProc. * * Initial framework (and most code) by Ben Harrison (benh@phial.com). * * Original code by Skirmantas Kligys (kligys@scf.usc.edu). * * Additional code by Ross E Becker (beckerr@cis.ohio-state.edu), * and Chris R. Martin (crm7479@tam2000.tamu.edu). * * Additional code by Robert Ruehlmann . */ #include "angband.h" #include "buildid.h" #include "cmds.h" #include "cave.h" #include "init.h" #include "files.h" #define uint unsigned int #if (defined(WINDOWS) && !defined(USE_SDL)) #define HAS_CLEANUP /* * Use HTML-Help. */ /* #define HTML_HELP */ #ifdef HTML_HELP # define HELP_GENERAL "angband.chm" # define HELP_SPOILERS "angband.chm" #else /* HTML_HELP */ # define HELP_GENERAL "angband.hlp" # define HELP_SPOILERS "spoilers.hlp" #endif /* HTML_HELP */ #ifdef ALLOW_BORG /* * Hack -- allow use of "screen saver" mode */ #define USE_SAVER #endif /* ALLOW_BORG */ /* * Menu constants -- see "ANGBAND.RC" */ #define IDM_FILE_NEW 100 #define IDM_FILE_OPEN 101 #define IDM_FILE_SAVE 110 #define IDM_FILE_EXIT 130 #define IDM_WINDOW_VIS_0 200 #define IDM_WINDOW_VIS_1 201 #define IDM_WINDOW_VIS_2 202 #define IDM_WINDOW_VIS_3 203 #define IDM_WINDOW_VIS_4 204 #define IDM_WINDOW_VIS_5 205 #define IDM_WINDOW_VIS_6 206 #define IDM_WINDOW_VIS_7 207 #define IDM_WINDOW_FONT_0 210 #define IDM_WINDOW_FONT_1 211 #define IDM_WINDOW_FONT_2 212 #define IDM_WINDOW_FONT_3 213 #define IDM_WINDOW_FONT_4 214 #define IDM_WINDOW_FONT_5 215 #define IDM_WINDOW_FONT_6 216 #define IDM_WINDOW_FONT_7 217 #define IDM_WINDOW_BIZ_0 230 #define IDM_WINDOW_BIZ_1 231 #define IDM_WINDOW_BIZ_2 232 #define IDM_WINDOW_BIZ_3 233 #define IDM_WINDOW_BIZ_4 234 #define IDM_WINDOW_BIZ_5 235 #define IDM_WINDOW_BIZ_6 236 #define IDM_WINDOW_BIZ_7 237 #define IDM_WINDOW_I_WID_0 240 #define IDM_WINDOW_I_WID_1 241 #define IDM_WINDOW_I_WID_2 242 #define IDM_WINDOW_I_WID_3 243 #define IDM_WINDOW_I_WID_4 244 #define IDM_WINDOW_I_WID_5 245 #define IDM_WINDOW_I_WID_6 246 #define IDM_WINDOW_I_WID_7 247 #define IDM_WINDOW_D_WID_0 250 #define IDM_WINDOW_D_WID_1 251 #define IDM_WINDOW_D_WID_2 252 #define IDM_WINDOW_D_WID_3 253 #define IDM_WINDOW_D_WID_4 254 #define IDM_WINDOW_D_WID_5 255 #define IDM_WINDOW_D_WID_6 256 #define IDM_WINDOW_D_WID_7 257 #define IDM_WINDOW_I_HGT_0 260 #define IDM_WINDOW_I_HGT_1 261 #define IDM_WINDOW_I_HGT_2 262 #define IDM_WINDOW_I_HGT_3 263 #define IDM_WINDOW_I_HGT_4 264 #define IDM_WINDOW_I_HGT_5 265 #define IDM_WINDOW_I_HGT_6 266 #define IDM_WINDOW_I_HGT_7 267 #define IDM_WINDOW_D_HGT_0 270 #define IDM_WINDOW_D_HGT_1 271 #define IDM_WINDOW_D_HGT_2 272 #define IDM_WINDOW_D_HGT_3 273 #define IDM_WINDOW_D_HGT_4 274 #define IDM_WINDOW_D_HGT_5 275 #define IDM_WINDOW_D_HGT_6 276 #define IDM_WINDOW_D_HGT_7 277 #define IDM_OPTIONS_GRAPHICS_NONE 400 #define IDM_OPTIONS_GRAPHICS_OLD 401 #define IDM_OPTIONS_GRAPHICS_ADAM 402 #define IDM_OPTIONS_GRAPHICS_DAVID 403 #define IDM_OPTIONS_GRAPHICS_NOMAD 404 #define IDM_OPTIONS_GRAPHICS_NICE 405 #define IDM_OPTIONS_TRPTILE 407 #define IDM_OPTIONS_DBLTILE 408 #define IDM_OPTIONS_BIGTILE 409 #define IDM_OPTIONS_LOW_PRIORITY 420 #define IDM_OPTIONS_SAVER 430 #define IDM_OPTIONS_MAP 440 #define IDM_HELP_GENERAL 901 #define IDM_HELP_SPOILERS 902 /* * This may need to be removed for some compilers XXX XXX XXX */ #define STRICT /* * Exclude parts of WINDOWS.H that are not needed */ #define NOCOMM /* Comm driver APIs and definitions */ #define NOLOGERROR /* LogError() and related definitions */ #define NOPROFILER /* Profiler APIs */ #define NOLFILEIO /* _l* file I/O routines */ #define NOOPENFILE /* OpenFile and related definitions */ #define NORESOURCE /* Resource management */ #define NOATOM /* Atom management */ #define NOLANGUAGE /* Character test routines */ #define NOLSTRING /* lstr* string management routines */ #define NODBCS /* Double-byte character set routines */ #define NOKEYBOARDINFO /* Keyboard driver routines */ #define NOCOLOR /* COLOR_* color values */ #define NODRAWTEXT /* DrawText() and related definitions */ #define NOSCALABLEFONT /* Truetype scalable font support */ #define NOMETAFILE /* Metafile support */ #define NOSYSTEMPARAMSINFO /* SystemParametersInfo() and SPI_* definitions */ #define NODEFERWINDOWPOS /* DeferWindowPos and related definitions */ #define NOKEYSTATES /* MK_* message key state flags */ #define NOWH /* SetWindowsHook and related WH_* definitions */ #define NOCLIPBOARD /* Clipboard APIs and definitions */ #define NOICONS /* IDI_* icon IDs */ #define NOMDI /* MDI support */ #define NOHELP /* Help support */ /* Not defined since it breaks Borland C++ 5.5 */ /* #define NOCTLMGR */ /* Control management and controls */ /* * Exclude parts of WINDOWS.H that are not needed (Win32) */ #define WIN32_LEAN_AND_MEAN #define NONLS /* All NLS defines and routines */ #define NOSERVICE /* All Service Controller routines, SERVICE_ equates, etc. */ #define NOKANJI /* Kanji support stuff. */ #define NOMCX /* Modem Configuration Extensions */ /* * Include the "windows" support file */ #include #include #ifdef USE_SOUND /* * Exclude parts of MMSYSTEM.H that are not needed */ #define MMNODRV /* Installable driver support */ #define MMNOWAVE /* Waveform support */ #define MMNOMIDI /* MIDI support */ #define MMNOAUX /* Auxiliary audio support */ #define MMNOTIMER /* Timer support */ #define MMNOJOY /* Joystick support */ #define MMNOMCI /* MCI support */ #define MMNOMMIO /* Multimedia file I/O support */ #define MMNOMMSYSTEM /* General MMSYSTEM functions */ #include #endif /* USE_SOUND */ #include #include /* * Include the support for loading bitmaps */ #ifdef USE_GRAPHICS //# include "win/readdib.h" # include "win/readdib.h" #endif /* USE_GRAPHICS */ /* * Hack -- Fake declarations from "dos.h" XXX XXX XXX */ #define INVALID_FILE_NAME (DWORD)0xFFFFFFFF /* * Silliness in WIN32 drawing routine */ #define MoveTo(H,X,Y) MoveToEx(H, X, Y, NULL) /* * Silliness for Windows 95 */ #ifndef WS_EX_TOOLWINDOW # define WS_EX_TOOLWINDOW 0 #endif /* WS_EX_TOOLWINDOW */ /* * Foreground color bits (hard-coded by DOS) */ #define VID_BLACK 0x00 #define VID_BLUE 0x01 #define VID_GREEN 0x02 #define VID_CYAN 0x03 #define VID_RED 0x04 #define VID_MAGENTA 0x05 #define VID_YELLOW 0x06 #define VID_WHITE 0x07 /* * Bright text (hard-coded by DOS) */ #define VID_BRIGHT 0x08 /* * Background color bits (hard-coded by DOS) */ #define VUD_BLACK 0x00 #define VUD_BLUE 0x10 #define VUD_GREEN 0x20 #define VUD_CYAN 0x30 #define VUD_RED 0x40 #define VUD_MAGENTA 0x50 #define VUD_YELLOW 0x60 #define VUD_WHITE 0x70 /* * Blinking text (hard-coded by DOS) */ #define VUD_BRIGHT 0x80 /* * Font settings */ #define DEFAULT_FONT "8X12x.FON" /* * Forward declare */ typedef struct _term_data term_data; /* * Extra "term" data * * Note the use of "font_want" for the names of the font file requested by * the user, and the use of "font_file" for the currently active font file. * * The "font_file" is uppercased, and takes the form "8X13.FON", while * "font_want" can be in almost any form as long as it could be construed * as attempting to represent the name of a font. */ struct _term_data { term t; const char *s; HWND w; DWORD dwStyle; DWORD dwExStyle; uint keys; byte rows; byte cols; uint pos_x; uint pos_y; uint size_wid; uint size_hgt; uint size_ow1; uint size_oh1; uint size_ow2; uint size_oh2; bool size_hack; bool xtra_hack; bool visible; bool maximized; bool bizarre; char *font_want; char *font_file; HFONT font_id; uint font_wid; uint font_hgt; uint tile_wid; uint tile_hgt; uint map_tile_wid; uint map_tile_hgt; bool map_active; }; /* * Maximum number of windows XXX XXX XXX */ #define MAX_TERM_DATA 8 /* * An array of term_data's */ static term_data data[MAX_TERM_DATA]; /* * Hack -- global "window creation" pointer */ static term_data *my_td; /* * game in progress */ bool game_in_progress = FALSE; /* * note when "open"/"new" become valid */ bool initialized = FALSE; /* * screen paletted, i.e. 256 colors */ bool paletted = FALSE; /* * 16 colors screen, don't use RGB() */ bool colors16 = FALSE; static bool low_priority = FALSE; /* * Saved instance handle */ static HINSTANCE hInstance; /* * Yellow brush for the cursor */ static HBRUSH hbrYellow; /* * An icon */ static HICON hIcon; /* * A palette */ static HPALETTE hPal; #ifdef USE_SAVER /* * The screen saver window */ static HWND hwndSaver; static bool screensaver_active = FALSE; static HANDLE screensaverSemaphore; static char saverfilename[1024]; static HMENU main_menu; #define MOUSE_SENS 10 #endif /* USE_SAVER */ #ifdef USE_GRAPHICS /* * Flag set once "graphics" has been initialized */ static bool can_use_graphics = FALSE; /** * Flag set when switching tilesizes */ static bool change_tilesize = FALSE; /* * The global bitmap */ static DIBINIT infGraph; /* * The global bitmap mask */ static DIBINIT infMask; #endif /* USE_GRAPHICS */ #ifdef USE_SOUND /* * Flag set once "sound" has been initialized */ static bool can_use_sound = FALSE; #define SAMPLE_MAX 16 /* * An array of sound file names */ static char *sound_file[MSG_MAX][SAMPLE_MAX]; #endif /* USE_SOUND */ /* * Full path to ANGBAND.INI */ static char *ini_file = NULL; /* * Name of application */ static const char *AppName = VERSION_NAME; /* * Name of sub-window type */ static const char *AngList = "AngList"; /* * The "complex" color values */ static COLORREF win_clr[MAX_COLORS]; /* * The "simple" color values * * See "main-ibm.c" for original table information * * The entries below are taken from the "color bits" defined above. * * Note that many of the choices below suck, but so do crappy monitors. */ static byte win_pal[MAX_COLORS] = { VID_BLACK, /* Dark */ VID_WHITE, /* White */ VID_CYAN, /* Slate XXX */ VID_RED | VID_BRIGHT, /* Orange XXX */ VID_RED, /* Red */ VID_GREEN, /* Green */ VID_BLUE, /* Blue */ VID_YELLOW, /* Umber XXX */ VID_BLACK | VID_BRIGHT, /* Light Dark */ VID_CYAN | VID_BRIGHT, /* Light Slate XXX */ VID_MAGENTA, /* Violet XXX */ VID_YELLOW | VID_BRIGHT, /* Yellow */ VID_MAGENTA | VID_BRIGHT, /* Light Red XXX */ VID_GREEN | VID_BRIGHT, /* Light Green */ VID_BLUE | VID_BRIGHT, /* Light Blue */ VID_YELLOW /* Light Umber XXX */ }; #ifdef SUPPORT_GAMMA static int gamma_correction; #endif /* SUPPORT_GAMMA */ #include "cmds.h" #include "textui.h" static game_command cmd = { CMD_NULL, 0, {{NULL}} }; #if 0 /* * Hack -- given a pathname, point at the filename */ static const char *extract_file_name(const char *s) { const char *p; /* Start at the end */ p = s + strlen(s) - 1; /* Back up to divider */ while ((p >= s) && (*p != ':') && (*p != '\\')) p--; /* Return file name */ return (p+1); } #endif /* 0 */ static void show_win_error(void) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); MessageBox(NULL, lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION); LocalFree(lpMsgBuf); } /* * Hack -- given a simple filename, extract the "font size" info * * Return a pointer to a static buffer holding the capitalized base name. */ static char *analyze_font(char *path, int *wp, int *hp) { int wid, hgt; char *s, *p; /* Start at the end */ p = path + strlen(path) - 1; /* Back up to divider */ while ((p >= path) && (*p != ':') && (*p != '\\')) --p; /* Advance to file name */ ++p; /* Capitalize */ for (s = p; *s; ++s) { /* Capitalize (be paranoid) */ if (islower((unsigned char)*s)) *s = toupper((unsigned char)*s); } /* Find first 'X' */ s = strchr(p, 'X'); /* Extract font width */ wid = atoi(p); /* Extract height */ hgt = s ? atoi(s+1) : 0; /* Save results */ (*wp) = wid; (*hp) = hgt; /* Result */ return (p); } /* * Check for existance of a directory */ static bool check_dir(const char *s) { int i; char path[1024]; DWORD attrib; /* Copy it */ my_strcpy(path, s, sizeof(path)); /* Check length */ i = strlen(path); /* Remove trailing backslash */ if (i && (path[i-1] == '\\')) path[--i] = '\0'; /* Examine */ attrib = GetFileAttributes(path); /* Require valid filename */ if (attrib == INVALID_FILE_NAME) return (FALSE); /* Require directory */ if (!(attrib & FILE_ATTRIBUTE_DIRECTORY)) return (FALSE); /* Success */ return (TRUE); } /* * Validate a file */ static void validate_file(const char *s) { /* Verify or fail */ if (!file_exists(s)) quit_fmt("Cannot find required file:\n%s", s); } /* * Validate a directory */ static void validate_dir(const char *s) { /* Verify or fail */ if (!check_dir(s)) { quit_fmt("Cannot find required directory:\n%s", s); } } /* * Get the "size" for a window */ static void term_getsize(term_data *td) { RECT rc; int wid, hgt; /* Paranoia */ if (td->cols < 1) td->cols = 1; if (td->rows < 1) td->rows = 1; if (use_graphics_nice) { switch (use_graphics) { case GRAPHICS_DAVID_GERVAIS: { /* Reset the tile info */ td->tile_wid = 32; td->tile_hgt = 32; break; } case GRAPHICS_ADAM_BOLT: { /* Reset the tile info */ td->tile_wid = 16; td->tile_hgt = 16; break; } case GRAPHICS_NOMAD: { /* Reset the tile info */ td->tile_wid = 8; td->tile_hgt = 16; break; } case GRAPHICS_ORIGINAL: { /* Reset the tile info */ td->tile_wid = 8; td->tile_hgt = 8; break; } case GRAPHICS_NONE: { /* Reset the tile info */ td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; break; } } tile_width = 1; tile_height = 1; if ((td->tile_hgt >= td->font_hgt * 3) && (td->tile_wid >= td->font_wid * 3)) { tile_width = 3; tile_height = 3; td->tile_wid /= 3; td->tile_hgt /= 3; } else if ((td->tile_hgt >= td->font_hgt * 2) && (td->tile_wid >= td->font_wid * 2)) { tile_width = 2; tile_height = 2; td->tile_wid /= 2; td->tile_hgt /= 2; } if (td->tile_wid >= td->font_wid * 2) { tile_width *= 2; td->tile_wid /= 2; } if (td->tile_wid < td->font_wid) td->tile_wid = td->font_wid; if (td->tile_hgt < td->font_hgt) td->tile_hgt = td->font_hgt; } /* Window sizes */ wid = td->cols * td->tile_wid + td->size_ow1 + td->size_ow2; hgt = td->rows * td->tile_hgt + td->size_oh1 + td->size_oh2; /* Client window size */ rc.left = 0; rc.right = rc.left + wid; rc.top = 0; rc.bottom = rc.top + hgt; /* Get total window size (without menu for sub-windows) */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Total size */ td->size_wid = rc.right - rc.left; td->size_hgt = rc.bottom - rc.top; /* See CreateWindowEx */ if (!td->w) return; /* Extract actual location */ GetWindowRect(td->w, &rc); /* Save the location */ td->pos_x = rc.left; td->pos_y = rc.top; } /* * Write the "prefs" for a single term */ static void save_prefs_aux(term_data *td, const char *sec_name) { char buf[1024]; RECT rc; WINDOWPLACEMENT lpwndpl; /* Paranoia */ if (!td->w) return; /* Visible */ strcpy(buf, td->visible ? "1" : "0"); WritePrivateProfileString(sec_name, "Visible", buf, ini_file); /* Font */ strcpy(buf, td->font_file ? td->font_file : DEFAULT_FONT); WritePrivateProfileString(sec_name, "Font", buf, ini_file); /* Bizarre */ strcpy(buf, td->bizarre ? "1" : "0"); WritePrivateProfileString(sec_name, "Bizarre", buf, ini_file); /* Tile size (x) */ wsprintf(buf, "%d", td->tile_wid); WritePrivateProfileString(sec_name, "TileWid", buf, ini_file); /* Tile size (y) */ wsprintf(buf, "%d", td->tile_hgt); WritePrivateProfileString(sec_name, "TileHgt", buf, ini_file); /* Window size (x) */ wsprintf(buf, "%d", td->cols); WritePrivateProfileString(sec_name, "NumCols", buf, ini_file); /* Window size (y) */ wsprintf(buf, "%d", td->rows); WritePrivateProfileString(sec_name, "NumRows", buf, ini_file); /* Get window placement and dimensions */ lpwndpl.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(td->w, &lpwndpl); /* Acquire position in *normal* mode (not minimized) */ rc = lpwndpl.rcNormalPosition; /* Get information about the placement of the window */ if (lpwndpl.flags & SW_SHOWMAXIMIZED) td->maximized = TRUE; else td->maximized = FALSE; /* Window position (x) */ wsprintf(buf, "%d", rc.left); WritePrivateProfileString(sec_name, "PositionX", buf, ini_file); /* Window position (y) */ wsprintf(buf, "%d", rc.top); WritePrivateProfileString(sec_name, "PositionY", buf, ini_file); /* Maximized */ strcpy(buf, td->maximized ? "1" : "0"); WritePrivateProfileString(sec_name, "Maximized", buf, ini_file); } /* * Write the "prefs" * * We assume that the windows have all been initialized */ static void save_prefs(void) { int i; char buf[128]; /* Save the "arg_graphics" flag */ sprintf(buf, "%d", arg_graphics); WritePrivateProfileString("Angband", "Graphics", buf, ini_file); /* Save the "use_graphics_nice" flag */ strcpy(buf, arg_graphics_nice ? "1" : "0"); WritePrivateProfileString("Angband", "Graphics_Nice", buf, ini_file); /* Save the tile width */ wsprintf(buf, "%d", tile_width); WritePrivateProfileString("Angband", "TileWidth", buf, ini_file); /* Save the tile height */ wsprintf(buf, "%d", tile_height); WritePrivateProfileString("Angband", "TileHeight", buf, ini_file); /* Save window prefs */ for (i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; sprintf(buf, "Term-%d", i); save_prefs_aux(td, buf); } } /* * Load the "prefs" for a single term */ static void load_prefs_aux(term_data *td, const char *sec_name) { char tmp[1024]; int wid, hgt; /* Visible */ td->visible = (GetPrivateProfileInt(sec_name, "Visible", td->visible, ini_file) != 0); /* Maximized */ td->maximized = (GetPrivateProfileInt(sec_name, "Maximized", td->maximized, ini_file) != 0); /* Desired font, with default */ GetPrivateProfileString(sec_name, "Font", DEFAULT_FONT, tmp, 127, ini_file); /* Bizarre */ td->bizarre = (GetPrivateProfileInt(sec_name, "Bizarre", TRUE, ini_file) != 0); /* Analyze font, save desired font name */ td->font_want = string_make(analyze_font(tmp, &wid, &hgt)); /* Tile size */ td->tile_wid = GetPrivateProfileInt(sec_name, "TileWid", wid, ini_file); td->tile_hgt = GetPrivateProfileInt(sec_name, "TileHgt", hgt, ini_file); /* Window size */ td->cols = GetPrivateProfileInt(sec_name, "NumCols", td->cols, ini_file); td->rows = GetPrivateProfileInt(sec_name, "NumRows", td->rows, ini_file); /* Window position */ td->pos_x = GetPrivateProfileInt(sec_name, "PositionX", td->pos_x, ini_file); td->pos_y = GetPrivateProfileInt(sec_name, "PositionY", td->pos_y, ini_file); } /* * Load the "prefs" */ static void load_prefs(void) { int i; char buf[1024]; /* Extract the "arg_graphics" flag */ arg_graphics = GetPrivateProfileInt("Angband", "Graphics", GRAPHICS_NONE, ini_file); /* Extract the "arg_graphics_nice" flag */ arg_graphics_nice = GetPrivateProfileInt("Angband", "Graphics_Nice", TRUE, ini_file); /* Extract the tile width */ tile_width = GetPrivateProfileInt("Angband", "TileWidth", FALSE, ini_file); /* Extract the tile height */ tile_height = GetPrivateProfileInt("Angband", "TileHeight", FALSE, ini_file); /* Extract the "arg_wizard" flag */ arg_wizard = (GetPrivateProfileInt("Angband", "Wizard", 0, ini_file) != 0); /* Extract the "arg_rebalance" flag */ arg_rebalance = (GetPrivateProfileInt("Angband", "Rebalance", FALSE, ini_file) != 0); #ifdef SUPPORT_GAMMA /* Extract the gamma correction */ gamma_correction = GetPrivateProfileInt("Angband", "Gamma", 0, ini_file); #endif /* SUPPORT_GAMMA */ /* Load window prefs */ for (i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; sprintf(buf, "Term-%d", i); load_prefs_aux(td, buf); } /* Paranoia */ if (data[0].cols < 80) data[0].cols = 80; if (data[0].rows < 24) data[0].rows = 24; } #ifdef USE_SOUND /* * XXX XXX XXX - Taken from files.c. * * Extract "tokens" from a buffer * * This function uses "whitespace" as delimiters, and treats any amount of * whitespace as a single delimiter. We will never return any empty tokens. * When given an empty buffer, or a buffer containing only "whitespace", we * will return no tokens. We will never extract more than "num" tokens. * * By running a token through the "text_to_ascii()" function, you can allow * that token to include (encoded) whitespace, using "\s" to encode spaces. * * We save pointers to the tokens in "tokens", and return the number found. */ static s16b tokenize_whitespace(char *buf, s16b num, char **tokens) { int k = 0; char *s = buf; /* Process */ while (k < num) { char *t; /* Skip leading whitespace */ for ( ; *s && isspace((unsigned char)*s); ++s) /* loop */; /* All done */ if (!*s) break; /* Find next whitespace, if any */ for (t = s; *t && !isspace((unsigned char)*t); ++t) /* loop */; /* Nuke and advance (if necessary) */ if (*t) *t++ = '\0'; /* Save the token */ tokens[k++] = s; /* Advance */ s = t; } /* Count */ return (k); } static void load_sound_prefs(void) { int i, j, num; char tmp[1024]; char ini_path[1024]; char wav_path[1024]; char *zz[SAMPLE_MAX]; /* Access the sound.cfg */ path_build(ini_path, sizeof(ini_path), ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); for (i = 0; i < MSG_MAX; i++) { /* Ignore empty sound strings */ if (!angband_sound_name[i][0]) continue; GetPrivateProfileString("Sound", angband_sound_name[i], "", tmp, sizeof(tmp), ini_path); num = tokenize_whitespace(tmp, SAMPLE_MAX, zz); for (j = 0; j < num; j++) { /* Access the sound */ path_build(wav_path, sizeof(wav_path), ANGBAND_DIR_XTRA_SOUND, zz[j]); /* Save the sound filename, if it exists */ if (file_exists(wav_path)) sound_file[i][j] = string_make(zz[j]); } } } #endif /* USE_SOUND */ /* * Create the new global palette based on the bitmap palette * (if any), and the standard 16 entry palette derived from * "win_clr[]" which is used for the basic 16 Angband colors. * * This function is never called before all windows are ready. * * This function returns FALSE if the new palette could not be * prepared, which should normally be a fatal error. XXX XXX * * Note that only some machines actually use a "palette". */ static int new_palette(void) { #ifdef USE_GRAPHICS HPALETTE hBmPal; #endif /* USE_GRAPHICS */ HPALETTE hNewPal; HDC hdc; int i, nEntries; int pLogPalSize; LPLOGPALETTE pLogPal; LPPALETTEENTRY lppe; term_data *td; /* This makes no sense */ if (!paletted) return (TRUE); /* No bitmap */ lppe = NULL; nEntries = 0; #ifdef USE_GRAPHICS /* Check the bitmap palette */ hBmPal = infGraph.hPalette; /* Use the bitmap */ if (hBmPal) { lppe = mem_alloc(256 * sizeof(PALETTEENTRY)); nEntries = GetPaletteEntries(hBmPal, 0, 255, lppe); if ((nEntries == 0) || (nEntries > 220)) { /* Warn the user */ plog("Please switch to high- or true-color mode."); /* Cleanup */ mem_free(lppe); /* Fail */ return (FALSE); } } #endif /* USE_GRAPHICS */ /* Size of palette */ pLogPalSize = sizeof(LOGPALETTE) + (nEntries + 16) * sizeof(PALETTEENTRY); /* Allocate palette */ pLogPal = (LPLOGPALETTE)mem_alloc(pLogPalSize); /* Version */ pLogPal->palVersion = 0x300; /* Make room for bitmap and normal data */ pLogPal->palNumEntries = nEntries + 16; /* Save the bitmap data */ for (i = 0; i < nEntries; i++) { pLogPal->palPalEntry[i] = lppe[i]; } /* Save the normal data */ for (i = 0; i < BASIC_COLORS; i++) { LPPALETTEENTRY p; /* Access the entry */ p = &(pLogPal->palPalEntry[i+nEntries]); /* Save the colors */ p->peRed = GetRValue(win_clr[i]); p->peGreen = GetGValue(win_clr[i]); p->peBlue = GetBValue(win_clr[i]); #ifdef SUPPORT_GAMMA if (gamma_correction > 0) { p->peRed = gamma_table[p->peRed]; p->peGreen = gamma_table[p->peGreen]; p->peBlue = gamma_table[p->peBlue]; } #endif /* SUPPORT_GAMMA */ /* Save the flags */ p->peFlags = PC_NOCOLLAPSE; } /* Free something */ if (lppe) mem_free(lppe); /* Create a new palette, or fail */ hNewPal = CreatePalette(pLogPal); if (!hNewPal) quit("Cannot create palette!"); /* Free the palette */ mem_free(pLogPal); /* Main window */ td = &data[0]; /* Realize the palette */ hdc = GetDC(td->w); SelectPalette(hdc, hNewPal, 0); i = RealizePalette(hdc); ReleaseDC(td->w, hdc); if (i == 0) quit("Cannot realize palette!"); /* Sub-windows */ for (i = 1; i < MAX_TERM_DATA; i++) { td = &data[i]; hdc = GetDC(td->w); SelectPalette(hdc, hNewPal, 0); ReleaseDC(td->w, hdc); } /* Delete old palette */ if (hPal) DeleteObject(hPal); /* Save new palette */ hPal = hNewPal; /* Success */ return (TRUE); } #ifdef USE_GRAPHICS /* * Initialize graphics */ static bool init_graphics(void) { /* Initialize once */ /* if (can_use_graphics != arg_graphics) */ { char buf[1024]; int wid, hgt; const char *name; if (arg_graphics == GRAPHICS_DAVID_GERVAIS) { wid = 32; hgt = 32; name = "32x32.png"; ANGBAND_GRAF = "david"; use_transparency = FALSE; } else if (arg_graphics == GRAPHICS_ADAM_BOLT){ wid = 16; hgt = 16; name = "16x16.png"; ANGBAND_GRAF = "new"; use_transparency = TRUE; } else if (arg_graphics == GRAPHICS_NOMAD) { wid = 16; hgt = 16; name = "8x16.png"; ANGBAND_GRAF = "nomad"; use_transparency = TRUE; } else { wid = 8; hgt = 8; name = "8x8.png"; ANGBAND_GRAF = "old"; } /* Access the bitmap file */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, name); /* Load the image or quit */ if (!ReadDIB2_PNG(data[0].w, buf, &infGraph, &infMask)) { plog_fmt("Cannot read file '%s'", name); return FALSE; } /* Save the new sizes */ infGraph.CellWidth = wid; infGraph.CellHeight = hgt; /* Activate a palette */ if (!new_palette()) { /* Free bitmap XXX XXX XXX */ /* Oops */ plog("Cannot activate palette!"); return (FALSE); } /* Graphics available */ can_use_graphics = arg_graphics; } /* Result */ return (can_use_graphics); } #endif /* USE_GRAPHICS */ #ifdef USE_SOUND /* * Initialize sound */ static bool init_sound(void) { /* Initialize once */ if (!can_use_sound) { /* Load the prefs */ load_sound_prefs(); /* Sound available */ can_use_sound = TRUE; } /* Result */ return (can_use_sound); } #endif /* USE_SOUND */ /* * Resize a window */ static void term_window_resize(const term_data *td) { /* Require window */ if (!td->w) return; /* Resize the window */ SetWindowPos(td->w, 0, 0, 0, td->size_wid, td->size_hgt, SWP_NOMOVE | SWP_NOZORDER); /* Redraw later */ InvalidateRect(td->w, NULL, TRUE); } /* * Remove a font, given its filename. */ static void term_remove_font(const char *name) { char buf[1024]; /* Build path to the file */ my_strcpy(buf, ANGBAND_DIR_XTRA_FONT, sizeof(buf)); my_strcat(buf, "\\", sizeof(buf)); my_strcat(buf, name, sizeof(buf)); /* Remove it */ RemoveFontResource(buf); return; } /* * Force the use of a new "font file" for a term_data * * This function may be called before the "window" is ready * * This function returns zero only if everything succeeds. * * Note that the "font name" must be capitalized!!! */ static errr term_force_font(term_data *td, const char *path) { int i; int wid, hgt; char *base; char buf[1024]; /* Check we have a path */ if (!path) return (1); /* Forget the old font (if needed) */ if (td->font_id) DeleteObject(td->font_id); /* Forget old font */ if (td->font_file) { bool used = FALSE; /* Scan windows */ for (i = 0; i < MAX_TERM_DATA; i++) { /* Check "screen" */ if ((td != &data[i]) && (data[i].font_file) && (streq(data[i].font_file, td->font_file))) { used = TRUE; } } /* Remove unused font resources */ if (!used) term_remove_font(td->font_file); /* Free the old name */ string_free(td->font_file); /* Forget it */ td->font_file = NULL; } /* Local copy */ my_strcpy(buf, path, sizeof(buf)); /* Analyze font path */ base = analyze_font(buf, &wid, &hgt); /* Verify suffix */ if (!suffix(base, ".FON")) return (1); /* Verify file */ if (!file_exists(buf)) return (1); /* Load the new font */ if (!AddFontResource(buf)) return (1); /* Notify other applications that a new font is available XXX */ PostMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); /* Save new font name */ td->font_file = string_make(base); /* Remove the "suffix" */ base[strlen(base)-4] = '\0'; /* Create the font (using the 'base' of the font file name!) */ td->font_id = CreateFont(hgt, wid, 0, 0, FW_DONTCARE, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_DONTCARE, base); /* Hack -- Unknown size */ if (!wid || !hgt) { HDC hdcDesktop; HFONT hfOld; TEXTMETRIC tm; /* all this trouble to get the cell size */ hdcDesktop = GetDC(HWND_DESKTOP); hfOld = SelectObject(hdcDesktop, td->font_id); GetTextMetrics(hdcDesktop, &tm); SelectObject(hdcDesktop, hfOld); ReleaseDC(HWND_DESKTOP, hdcDesktop); /* Font size info */ wid = tm.tmAveCharWidth; hgt = tm.tmHeight; } /* Save the size info */ td->font_wid = wid; td->font_hgt = hgt; /* Success */ return (0); } /* * Allow the user to change the font for this window. */ static void term_change_font(term_data *td) { OPENFILENAME ofn; char tmp[1024] = ""; /* Extract a default if possible */ if (td->font_file) strcpy(tmp, td->font_file); /* Ask for a choice */ memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = data[0].w; ofn.lpstrFilter = "Angband Font Files (*.fon)\0*.fon\0"; ofn.nFilterIndex = 1; ofn.lpstrFile = tmp; ofn.nMaxFile = 128; ofn.lpstrInitialDir = ANGBAND_DIR_XTRA_FONT; ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; ofn.lpstrDefExt = "fon"; /* Force choice if legal */ if (GetOpenFileName(&ofn)) { /* Force the font */ if (term_force_font(td, tmp)) { /* Access the standard font file */ path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT); /* Force the use of that font */ (void)term_force_font(td, tmp); } /* HACK - Assume bizarre */ td->bizarre = TRUE; /* Reset the tile info */ td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } } static void windows_map_aux(void); /* * Hack -- redraw a term_data */ static void term_data_redraw(term_data *td) { if (td->map_active) { /* Redraw the map */ windows_map_aux(); } else { /* Activate the term */ Term_activate(&td->t); /* Redraw the contents */ Term_redraw(); /* Restore the term */ Term_activate(term_screen); } } /* * Hack -- redraw a term_data */ static void term_data_redraw_section(term_data *td, int x1, int y1, int x2, int y2) { /* Activate the term */ Term_activate(&td->t); /* Redraw the area */ Term_redraw_section(x1, y1, x2, y2); /* Restore the term */ Term_activate(term_screen); } /*** Function hooks needed by "Term" ***/ #if 0 /* * Initialize a new Term */ static void Term_init_win(term *t) { /* XXX Unused */ } /* * Nuke an old Term */ static void Term_nuke_win(term *t) { /* XXX Unused */ } #endif /* 0 */ /* * React to global changes */ static errr Term_xtra_win_react(void) { int i; /* Get the main window */ term_data *td = &data[0]; /* Simple color */ if (colors16) { /* Save the default colors */ for (i = 0; i < MAX_COLORS; i++) { /* Simply accept the desired colors */ win_pal[i] = angband_color_table[i][0]; } } /* Complex color */ else { COLORREF code; byte rv, gv, bv; bool change = FALSE; /* Save the default colors */ for (i = 0; i < MAX_COLORS; i++) { /* Extract desired values */ rv = angband_color_table[i][1]; gv = angband_color_table[i][2]; bv = angband_color_table[i][3]; #ifdef SUPPORT_GAMMA if (gamma_correction > 0) { rv = gamma_table[rv]; gv = gamma_table[gv]; bv = gamma_table[bv]; } #endif /* SUPPORT_GAMMA */ /* Extract a full color code */ code = PALETTERGB(rv, gv, bv); /* Activate changes */ if (win_clr[i] != code) { /* Note the change */ change = TRUE; /* Apply the desired color */ win_clr[i] = code; } } /* Activate the palette if needed */ if (change) (void)new_palette(); } #ifdef USE_SOUND /* Initialize sound (if needed) */ if (OPT(use_sound) && !init_sound()) { /* Warning */ plog("Cannot initialize sound!"); /* Cannot enable */ OPT(use_sound) = FALSE; } #endif /* USE_SOUND */ #ifdef USE_GRAPHICS /* Handle "arg_graphics_nice" */ if (use_graphics_nice != arg_graphics_nice) { /* Change setting */ use_graphics_nice = arg_graphics_nice; /* HACK - Assume bizarre */ td->bizarre = TRUE; /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } /* Handle "arg_graphics" */ if (use_graphics != arg_graphics) { /* Switch off transparency */ use_transparency = FALSE; /* Free the bitmap stuff */ FreeDIB(&infGraph); FreeDIB(&infMask); /* Initialize (if needed) */ if (arg_graphics && !init_graphics()) { /* Warning */ plog("Cannot initialize graphics!"); /* Cannot enable */ arg_graphics = GRAPHICS_NONE; } /* Change setting */ use_graphics = arg_graphics; if (use_graphics_nice) { /* HACK - Assume bizarre */ td->bizarre = TRUE; /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } /* Reset visuals */ reset_visuals(TRUE); } /* Handle "change_tilesize" */ if (change_tilesize) { /* Reset visuals */ reset_visuals(TRUE); /* Reset the panel */ verify_panel(); /* Reset the flag */ change_tilesize = FALSE; } #endif /* USE_GRAPHICS */ /* Clean up windows */ for (i = 0; i < MAX_TERM_DATA; i++) { term *old = Term; term_data *td = &data[i]; /* Update resized windows */ if ((td->cols != td->t.wid) || (td->rows != td->t.hgt)) { /* Activate */ Term_activate(&td->t); /* Hack -- Resize the term */ Term_resize(td->cols, td->rows); /* Redraw the contents */ Term_redraw(); /* Restore */ Term_activate(old); } } /* Success */ return (0); } /* * Process at least one event */ static errr Term_xtra_win_event(int v) { MSG msg; /* Wait for an event */ if (v) { int i = 0; while (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { /* Do animation updates (once every ten iterations), then * sleep 0.02s and try again */ if (i == 0) idle_update(); Sleep(20); i = (i + 1) % 10; } TranslateMessage(&msg); DispatchMessage(&msg); } /* Check for an event */ else if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* Success */ return 0; } /* * Process all pending events */ static errr Term_xtra_win_flush(void) { MSG msg; /* Process all pending events */ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* Success */ return (0); } /* * Hack -- clear the screen * * Make this more efficient XXX XXX XXX */ static errr Term_xtra_win_clear(void) { term_data *td = (term_data*)(Term->data); HDC hdc; RECT rc; /* Rectangle to erase */ rc.left = td->size_ow1; rc.right = rc.left + td->cols * td->tile_wid; rc.top = td->size_oh1; rc.bottom = rc.top + td->rows * td->tile_hgt; /* Erase it */ hdc = GetDC(td->w); SetBkColor(hdc, RGB(0, 0, 0)); SelectObject(hdc, td->font_id); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Hack -- make a noise */ static errr Term_xtra_win_noise(void) { MessageBeep(MB_ICONASTERISK); return (0); } /* * Hack -- make a sound */ static void Term_xtra_win_sound(int v) { #ifdef USE_SOUND int i; char buf[1024]; #endif /* USE_SOUND */ /* Illegal sound */ if ((v < 0) || (v >= MSG_MAX)) return; #ifdef USE_SOUND /* Count the samples */ for (i = 0; i < SAMPLE_MAX; i++) { if (!sound_file[v][i]) break; } /* No sample */ if (i == 0) return; /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_SOUND, sound_file[v][0]); /* Play the sound, catch errors */ PlaySound(buf, 0, SND_FILENAME | SND_ASYNC); #else /* USE_SOUND */ /* Oops */ return; #endif /* USE_SOUND */ } /* * Delay for "x" milliseconds */ static int Term_xtra_win_delay(int v) { /* Sleep */ if (v > 0) Sleep(v); /* Success */ return (0); } /* * Do a "special thing" */ static errr Term_xtra_win(int n, int v) { /* Handle a subset of the legal requests */ switch (n) { /* Make a bell sound */ case TERM_XTRA_NOISE: { return (Term_xtra_win_noise()); } /* Process random events */ case TERM_XTRA_BORED: { return (Term_xtra_win_event(0)); } /* Process an event */ case TERM_XTRA_EVENT: { return (Term_xtra_win_event(v)); } /* Flush all events */ case TERM_XTRA_FLUSH: { return (Term_xtra_win_flush()); } /* Clear the screen */ case TERM_XTRA_CLEAR: { return (Term_xtra_win_clear()); } /* React to global changes */ case TERM_XTRA_REACT: { return (Term_xtra_win_react()); } /* Delay for some milliseconds */ case TERM_XTRA_DELAY: { return (Term_xtra_win_delay(v)); } } /* Oops */ return 1; } /* * Low level graphics (Assumes valid input). * * Draw a "cursor" at (x,y), using a "yellow box". */ static errr Term_curs_win(int x, int y) { term_data *td = (term_data*)(Term->data); RECT rc; HDC hdc; int tile_wid, tile_hgt; if (td->map_active) { tile_wid = td->map_tile_wid; tile_hgt = td->map_tile_hgt; } else { tile_wid = td->tile_wid; tile_hgt = td->tile_hgt; } /* Frame the grid */ rc.left = x * tile_wid + td->size_ow1; rc.right = rc.left + tile_wid; rc.top = y * tile_hgt + td->size_oh1; rc.bottom = rc.top + tile_hgt; /* Cursor is done as a yellow "box" */ hdc = GetDC(td->w); FrameRect(hdc, &rc, hbrYellow); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Low level graphics (Assumes valid input). * * Draw a "cursor" at (x,y), using a "yellow box". */ static errr Term_bigcurs_win(int x, int y) { term_data *td = (term_data*)(Term->data); RECT rc; HDC hdc; int tile_wid, tile_hgt; if (td->map_active) { /* Normal cursor in map window */ Term_curs_win(x, y); return 0; } else { tile_wid = td->tile_wid; tile_hgt = td->tile_hgt; } /* Frame the grid */ rc.left = x * tile_wid + td->size_ow1; rc.right = rc.left + tile_width * tile_wid; rc.top = y * tile_hgt + td->size_oh1; rc.bottom = rc.top + tile_height * tile_hgt; /* Cursor is done as a yellow "box" */ hdc = GetDC(td->w); FrameRect(hdc, &rc, hbrYellow); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Low level graphics (Assumes valid input). * * Erase a "block" of "n" characters starting at (x,y). */ static errr Term_wipe_win(int x, int y, int n) { term_data *td = (term_data*)(Term->data); HDC hdc; RECT rc; /* Rectangle to erase in client coords */ rc.left = x * td->tile_wid + td->size_ow1; rc.right = rc.left + n * td->tile_wid; rc.top = y * td->tile_hgt + td->size_oh1; rc.bottom = rc.top + td->tile_hgt; hdc = GetDC(td->w); SetBkColor(hdc, RGB(0, 0, 0)); SelectObject(hdc, td->font_id); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Given a position in the ISO Latin-1 character set, return * the correct character on this system. */ static byte Term_xchar_win(byte c) { /* The Windows port uses the Latin-1 standard */ return (c); } /* * Low level graphics. Assumes valid input. * * Draw several ("n") chars, with an attr, at a given location. * * All "graphic" data is handled by "Term_pict_win()", below. * * One would think there is a more efficient method for telling a window * what color it should be using to draw with, but perhaps simply changing * it every time is not too inefficient. XXX XXX XXX */ static errr Term_text_win(int x, int y, int n, byte a, const char *s) { term_data *td = (term_data*)(Term->data); RECT rc; HDC hdc; /* Total rectangle */ rc.left = x * td->tile_wid + td->size_ow1; rc.right = rc.left + n * td->tile_wid; rc.top = y * td->tile_hgt + td->size_oh1; rc.bottom = rc.top + td->tile_hgt; /* Acquire DC */ hdc = GetDC(td->w); /* Background color */ SetBkColor(hdc, RGB(0, 0, 0)); /* Foreground color */ if (colors16) { SetTextColor(hdc, PALETTEINDEX(win_pal[a])); } else if (paletted) { SetTextColor(hdc, win_clr[a & (BASIC_COLORS-1)]); } else { SetTextColor(hdc, win_clr[a]); } /* Use the font */ SelectObject(hdc, td->font_id); /* Bizarre size */ if (td->bizarre || (td->tile_hgt != td->font_hgt) || (td->tile_wid != td->font_wid)) { int i; /* Erase complete rectangle */ ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL); /* New rectangle */ rc.left += ((td->tile_wid - td->font_wid) / 2); rc.right = rc.left + td->font_wid; rc.top += ((td->tile_hgt - td->font_hgt) / 2); rc.bottom = rc.top + td->font_hgt; /* Dump each character */ for (i = 0; i < n; i++) { /* Dump the text */ ExtTextOut(hdc, rc.left, rc.top, 0, &rc, s+i, 1, NULL); /* Advance */ rc.left += td->tile_wid; rc.right += td->tile_wid; } } /* Normal size */ else { /* Dump the text */ ExtTextOut(hdc, rc.left, rc.top, ETO_OPAQUE | ETO_CLIPPED, &rc, s, n, NULL); } /* Release DC */ ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Low level graphics. Assumes valid input. * * Draw an array of "special" attr/char pairs at the given location. * * We use the "Term_pict_win()" function for "graphic" data, which are * encoded by setting the "high-bits" of both the "attr" and the "char" * data. We use the "attr" to represent the "row" of the main bitmap, * and the "char" to represent the "col" of the main bitmap. The use * of this function is induced by the "higher_pict" flag. * * If "graphics" is not available, we simply "wipe" the given grids. */ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) { term_data *td = (term_data*)(Term->data); #ifdef USE_GRAPHICS int i; int x1, y1, w1, h1; int x2, y2, w2, h2, tw2, th2; int x3, y3; HDC hdcMask; HDC hdc; HDC hdcSrc; HBITMAP hbmSrcOld; /* Erase the grids */ Term_wipe_win(x, y, n); /* Size of bitmap cell */ w1 = infGraph.CellWidth; h1 = infGraph.CellHeight; /* Size of window cell */ if (td->map_active) { w2 = td->map_tile_wid; h2 = td->map_tile_hgt; tw2 = w2; th2 = h2; } else { w2 = td->tile_wid; h2 = td->tile_hgt; /* Large tile mode */ th2 = tile_height * h2; tw2 = tile_width * w2; } /* Location of window cell */ x2 = x * w2 + td->size_ow1; y2 = y * h2 + td->size_oh1; /* Info */ hdc = GetDC(td->w); /* More info */ hdcSrc = CreateCompatibleDC(hdc); hbmSrcOld = SelectObject(hdcSrc, infGraph.hBitmap); if ((arg_graphics == GRAPHICS_ADAM_BOLT) || (arg_graphics == GRAPHICS_NOMAD) || (arg_graphics == GRAPHICS_DAVID_GERVAIS)) { hdcMask = CreateCompatibleDC(hdc); SelectObject(hdcMask, infMask.hBitmap); } else { hdcMask = NULL; } /* Draw attr/char pairs */ for (i = n-1; i >= 0; i--, x2 -= w2) { byte a = ap[i]; char c = cp[i]; /* Extract picture */ int row = (a & 0x7F); int col = (c & 0x7F); /* Location of bitmap cell */ x1 = col * w1; y1 = row * h1; if ((arg_graphics == GRAPHICS_ADAM_BOLT) || (arg_graphics == GRAPHICS_NOMAD) || (arg_graphics == GRAPHICS_DAVID_GERVAIS)) { x3 = (tcp[i] & 0x7F) * w1; y3 = (tap[i] & 0x7F) * h1; /* Perfect size */ if ((w1 == tw2) && (h1 == th2)) { /* Copy the terrain picture from the bitmap to the window */ BitBlt(hdc, x2, y2, tw2, th2, hdcSrc, x3, y3, SRCCOPY); /* Only draw if terrain and overlay are different */ if ((x1 != x3) || (y1 != y3)) { /* Mask out the tile */ BitBlt(hdc, x2, y2, tw2, th2, hdcMask, x1, y1, SRCAND); /* Draw the tile */ BitBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, SRCPAINT); } } /* Need to stretch */ else { /* Set the correct mode for stretching the tiles */ SetStretchBltMode(hdc, COLORONCOLOR); /* Copy the terrain picture from the bitmap to the window */ StretchBlt(hdc, x2, y2, tw2, th2, hdcSrc, x3, y3, w1, h1, SRCCOPY); /* Only draw if terrain and overlay are different */ if ((x1 != x3) || (y1 != y3)) { /* Mask out the tile */ StretchBlt(hdc, x2, y2, tw2, th2, hdcMask, x1, y1, w1, h1, SRCAND); /* Draw the tile */ StretchBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, w1, h1, SRCPAINT); } } } else { /* Perfect size */ if ((w1 == tw2) && (h1 == th2)) { /* Copy the picture from the bitmap to the window */ BitBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, SRCCOPY); } /* Need to stretch */ else { /* Set the correct mode for stretching the tiles */ SetStretchBltMode(hdc, COLORONCOLOR); /* Copy the picture from the bitmap to the window */ StretchBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, w1, h1, SRCCOPY); } } } /* Release */ SelectObject(hdcSrc, hbmSrcOld); DeleteDC(hdcSrc); if ((arg_graphics == GRAPHICS_ADAM_BOLT) || (arg_graphics == GRAPHICS_NOMAD) || (arg_graphics == GRAPHICS_DAVID_GERVAIS)) { /* Release */ SelectObject(hdcMask, hbmSrcOld); DeleteDC(hdcMask); } /* Release */ ReleaseDC(td->w, hdc); #else /* USE_GRAPHICS */ /* Just erase this grid */ return (Term_wipe_win(x, y, n)); #endif /* USE_GRAPHICS */ /* Success */ return 0; } static void windows_map_aux(void) { term_data *td = &data[0]; byte a; char c; int x, min_x, max_x; int y, min_y, max_y; byte ta; char tc; td->map_tile_wid = (td->tile_wid * td->cols) / DUNGEON_WID; td->map_tile_hgt = (td->tile_hgt * td->rows) / DUNGEON_HGT; min_x = 0; min_y = 0; max_x = DUNGEON_WID; max_y = DUNGEON_HGT; /* Draw the map */ for (x = min_x; x < max_x; x++) { for (y = min_y; y < max_y; y++) { grid_data g; map_info(y, x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); /* Ignore non-graphics */ if ((a & 0x80) && (c & 0x80)) { Term_pict_win(x - min_x, y - min_y, 1, &a, &c, &ta, &tc); } } } /* Highlight the player */ Term_curs_win(p_ptr->px - min_x, p_ptr->py - min_y); } /* * MEGA_HACK - Display a graphical map of the dungeon. */ static void windows_map(void) { term_data *td = &data[0]; ui_event ch; /* Only in graphics mode since the fonts can't be scaled */ if (!use_graphics) return; /* Prevent various menu-actions from working */ initialized = FALSE; /* Clear screen */ Term_xtra_win_clear(); td->map_active = TRUE; /* Draw the map */ windows_map_aux(); /* Wait for a keypress, flush key buffer */ Term_inkey(&ch, TRUE, TRUE); Term_flush(); /* Switch off the map display */ td->map_active = FALSE; /* Restore screen */ Term_xtra_win_clear(); Term_redraw(); /* We are ready again */ initialized = TRUE; } /*** Other routines ***/ /* * Create and initialize a "term_data" given a title */ static void term_data_link(term_data *td) { term *t = &td->t; /* Initialize the term */ term_init(t, td->cols, td->rows, td->keys); /* Use a "software" cursor */ t->soft_cursor = TRUE; /* Use "Term_pict" for "graphic" data */ t->higher_pict = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; #if 0 /* Prepare the init/nuke hooks */ t->init_hook = Term_init_win; t->nuke_hook = Term_nuke_win; #endif /* 0 */ /* Prepare the template hooks */ t->xtra_hook = Term_xtra_win; t->curs_hook = Term_curs_win; t->bigcurs_hook = Term_bigcurs_win; t->wipe_hook = Term_wipe_win; t->text_hook = Term_text_win; t->pict_hook = Term_pict_win; t->xchar_hook = Term_xchar_win; /* Remember where we came from */ t->data = td; } /* * Create the windows * * First, instantiate the "default" values, then read the "ini_file" * to over-ride selected values, then create the windows, and fonts. * * Must use SW_SHOW not SW_SHOWNA, since on 256 color display * must make active to realize the palette. XXX XXX XXX */ static void init_windows(void) { int i; term_data *td; char buf[1024]; /* Main window */ td = &data[0]; WIPE(td, term_data); td->s = angband_term_name[0]; td->keys = 1024; td->rows = 24; td->cols = 80; td->visible = TRUE; td->size_ow1 = 2; td->size_ow2 = 2; td->size_oh1 = 2; td->size_oh2 = 2; td->pos_x = 30; td->pos_y = 20; /* Sub windows */ for (i = 1; i < MAX_TERM_DATA; i++) { td = &data[i]; WIPE(td, term_data); td->s = angband_term_name[i]; td->keys = 16; td->rows = 24; td->cols = 80; td->visible = FALSE; td->size_ow1 = 1; td->size_ow2 = 1; td->size_oh1 = 1; td->size_oh2 = 1; td->pos_x = (7 - i) * 30; td->pos_y = (7 - i) * 20; } /* Load prefs */ load_prefs(); /* Main window (need these before term_getsize gets called) */ td = &data[0]; td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION | WS_VISIBLE); if (td->maximized) td->dwStyle |= WS_MAXIMIZE; td->dwExStyle = 0; td->visible = TRUE; /* Sub windows (need these before term_getsize gets called) */ for (i = 1; i < MAX_TERM_DATA; i++) { td = &data[i]; td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU | WS_CAPTION); td->dwExStyle = (WS_EX_TOOLWINDOW); } /* All windows */ for (i = 0; i < MAX_TERM_DATA; i++) { td = &data[i]; /* Access the standard font file */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, td->font_want); /* Activate the chosen font */ if (term_force_font(td, buf)) { /* Access the standard font file */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT); /* Force the use of that font */ (void)term_force_font(td, buf); /* Oops */ td->tile_wid = 8; td->tile_hgt = 13; /* HACK - Assume bizarre */ td->bizarre = TRUE; } /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } /* Sub windows (reverse order) */ for (i = MAX_TERM_DATA - 1; i >= 1; --i) { td = &data[i]; my_td = td; td->w = CreateWindowEx(td->dwExStyle, AngList, td->s, td->dwStyle, td->pos_x, td->pos_y, td->size_wid, td->size_hgt, HWND_DESKTOP, NULL, hInstance, NULL); my_td = NULL; if (!td->w) quit("Failed to create sub-window"); if (td->visible) { td->size_hack = TRUE; ShowWindow(td->w, SW_SHOW); td->size_hack = FALSE; } term_data_link(td); angband_term[i] = &td->t; if (td->visible) { /* Activate the window */ SetActiveWindow(td->w); /* Bring window to top */ SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } } /* Main window */ td = &data[0]; /* Main window */ my_td = td; td->w = CreateWindowEx(td->dwExStyle, AppName, td->s, td->dwStyle, td->pos_x, td->pos_y, td->size_wid, td->size_hgt, HWND_DESKTOP, NULL, hInstance, NULL); my_td = NULL; if (!td->w) quit_fmt("Failed to create %s window", VERSION_NAME); term_data_link(td); term_screen = &td->t; /* Activate the main window */ SetActiveWindow(td->w); /* Bring main window back to top */ SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); #ifdef SUPPORT_GAMMA if (gamma_correction > 0) build_gamma_table(gamma_correction); #endif /* SUPPORT_GAMMA */ /* New palette XXX XXX XXX */ (void)new_palette(); /* Create a "brush" for drawing the "cursor" */ hbrYellow = CreateSolidBrush(win_clr[TERM_YELLOW]); /* Process pending messages */ (void)Term_xtra_win_flush(); } #ifdef USE_SAVER /* * Stop the screensaver */ static void stop_screensaver(void) { if (screensaver) SendMessage(data[0].w, WM_CLOSE, 0, 0); else SendMessage(data[0].w, WM_COMMAND, IDM_OPTIONS_SAVER, 0); } #endif /* USE_SAVER */ /* * Prepare the menus */ static void setup_menus(void) { int i; HMENU hm = GetMenu(data[0].w); #ifdef USE_SAVER main_menu = hm; #endif /* USE_SAVER */ /* Menu "File", Disable all */ EnableMenuItem(hm, IDM_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_FILE_OPEN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_FILE_SAVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_FILE_EXIT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); /* No character available */ if (!character_generated) { /* Menu "File", Item "New" */ EnableMenuItem(hm, IDM_FILE_NEW, MF_BYCOMMAND | MF_ENABLED); /* Menu "File", Item "Open" */ EnableMenuItem(hm, IDM_FILE_OPEN, MF_BYCOMMAND | MF_ENABLED); } /* A character available */ if (game_in_progress && character_generated && inkey_flag) { /* Menu "File", Item "Save" */ EnableMenuItem(hm, IDM_FILE_SAVE, MF_BYCOMMAND | MF_ENABLED); } if (!game_in_progress || !character_generated || inkey_flag) { /* Menu "File", Item "Exit" */ EnableMenuItem(hm, IDM_FILE_EXIT, MF_BYCOMMAND | MF_ENABLED); } /* Menu "Window::Visibility" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); CheckMenuItem(hm, IDM_WINDOW_VIS_0 + i, (data[i].visible ? MF_CHECKED : MF_UNCHECKED)); EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i, MF_BYCOMMAND | MF_ENABLED); } /* Menu "Window::Font" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Bizarre Display" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); CheckMenuItem(hm, IDM_WINDOW_BIZ_0 + i, (data[i].bizarre ? MF_CHECKED : MF_UNCHECKED)); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Increase Tile Width" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Decrease Tile Width" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Increase Tile Height" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Decrease Tile Height" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Options", disable all */ EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NONE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_OLD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_ADAM, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NOMAD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_DAVID, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NICE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_TRPTILE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_DBLTILE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_BIGTILE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_SAVER, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); /* Menu "Options", Item "Map" */ if (inkey_flag && initialized && (use_graphics != GRAPHICS_NONE)) EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP, MF_BYCOMMAND | MF_ENABLED); else EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); /* Menu "Options", update all */ CheckMenuItem(hm, IDM_OPTIONS_GRAPHICS_NONE, (arg_graphics == GRAPHICS_NONE ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_GRAPHICS_OLD, (arg_graphics == GRAPHICS_ORIGINAL ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_GRAPHICS_ADAM, (arg_graphics == GRAPHICS_ADAM_BOLT ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_GRAPHICS_NOMAD, (arg_graphics == GRAPHICS_NOMAD ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_GRAPHICS_DAVID, (arg_graphics == GRAPHICS_DAVID_GERVAIS ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_GRAPHICS_NICE, (arg_graphics_nice ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_TRPTILE, (tile_height == 3 ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_DBLTILE, (tile_height == 2 ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(hm, IDM_OPTIONS_BIGTILE, (tile_width == (2 * tile_height) ? MF_CHECKED : MF_UNCHECKED)); #ifdef USE_SAVER CheckMenuItem(hm, IDM_OPTIONS_SAVER, (hwndSaver ? MF_CHECKED : MF_UNCHECKED)); #endif /* USE_SAVER */ CheckMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY, (low_priority ? MF_CHECKED : MF_UNCHECKED)); #ifdef USE_GRAPHICS if (inkey_flag && initialized) { /* Menu "Options", Item "Graphics" */ EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NONE, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_OLD, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_ADAM, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NOMAD, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_DAVID, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NICE, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_TRPTILE, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_DBLTILE, MF_ENABLED); EnableMenuItem(hm, IDM_OPTIONS_BIGTILE, MF_ENABLED); } #endif /* USE_GRAPHICS */ #ifdef USE_SAVER /* Menu "Options", Item "ScreenSaver" */ EnableMenuItem(hm, IDM_OPTIONS_SAVER, MF_BYCOMMAND | MF_ENABLED); #endif /* USE_SAVER */ EnableMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY, MF_BYCOMMAND | MF_ENABLED); } /* * Check for double clicked (or dragged) savefile * * Apparently, Windows copies the entire filename into the first * piece of the "command line string". Perhaps we should extract * the "basename" of that filename and append it to the "save" dir. */ static void check_for_save_file(LPSTR cmd_line) { char *s, *p; /* First arg */ s = cmd_line; /* No args */ if (!s || !*s) return; /* Next arg */ p = strchr(s, ' '); /* Tokenize */ if (p) *p = '\0'; /* Extract filename */ my_strcpy(savefile, s, sizeof(savefile)); /* Validate the file */ validate_file(savefile); /* Set the command now so that we skip the "Open File" prompt. */ cmd.command = CMD_LOADFILE; } #ifdef USE_SAVER #ifdef ALLOW_BORG /* * Hook into the inkey() function so that flushing keypresses * doesn't affect us. * * ToDo: Try to implement recording and playing back of games * by saving/reading the keypresses to/from a file. Note that * interrupting certain actions (resting, running, and other * repeated actions) would mess that up, so this would have to * be switched off when recording. */ extern char (*inkey_hack)(int flush_first); static char screensaver_inkey_hack_buffer[1024]; static char screensaver_inkey_hack(int flush_first) { static int screensaver_inkey_hack_index = 0; if (screensaver_inkey_hack_index < sizeof(screensaver_inkey_hack_buffer)) return (screensaver_inkey_hack_buffer[screensaver_inkey_hack_index++]); else return ESCAPE; } #endif /* ALLOW_BORG */ /* * Start the screensaver */ static void start_screensaver(void) { bool file_exist; #ifdef ALLOW_BORG int i, j; #endif /* ALLOW_BORG */ /* Set the name for process_player_name() */ my_strcpy(op_ptr->full_name, saverfilename, sizeof(op_ptr->full_name)); /* Set 'savefile' to a valid name */ process_player_name(TRUE); /* Does the savefile already exist? */ file_exist = file_exists(savefile); /* Don't try to load a non-existant savefile */ if (!file_exist) savefile[0] = '\0'; /* Game in progress */ game_in_progress = TRUE; Term_fresh(); /* Screensaver mode on */ SendMessage(data[0].w, WM_COMMAND, IDM_OPTIONS_SAVER, 0); /* Low priority */ SendMessage(data[0].w, WM_COMMAND, IDM_OPTIONS_LOW_PRIORITY, 0); #ifdef ALLOW_BORG /* * MegaHack - Try to start the Borg. * * The simulated keypresses will be processed when play_game() * is called. */ inkey_hack = screensaver_inkey_hack; j = 0; /* * If no savefile is present or then go through the steps necessary * to create a random character. If a savefile already is present * then the simulated keypresses will either clean away any [-more-] * prompts (if the character is alive), or create a new random * character. * * Luckily it's possible to send the same keypresses no matter if * the character is alive, dead, or not even yet created. */ screensaver_inkey_hack_buffer[j++] = ESCAPE; /* Gender */ screensaver_inkey_hack_buffer[j++] = ESCAPE; /* Race */ screensaver_inkey_hack_buffer[j++] = ESCAPE; /* Class */ screensaver_inkey_hack_buffer[j++] = 'n'; /* Modify options */ screensaver_inkey_hack_buffer[j++] = '\r'; /* Reroll */ if (!file_exists) { /* Savefile name */ int n = strlen(saverfilename); for (i = 0; i < n; i++) screensaver_inkey_hack_buffer[j++] = saverfilename[i]; } screensaver_inkey_hack_buffer[j++] = '\r'; /* Return */ screensaver_inkey_hack_buffer[j++] = ESCAPE; /* Character info */ /* * Make sure the "verify_special" options is off, so that we can * get into Borg mode without confirmation. * * Try just marking the savefile correctly. */ p_ptr->noscore |= (NOSCORE_BORG); /* * Make sure the "OPT(cheat_live)" option is set, so that the Borg can * automatically restart. */ screensaver_inkey_hack_buffer[j++] = '5'; /* Cheat options */ /* Cursor down to "cheat live" */ for (i = 0; i < OPT_OPT(cheat_live) - OPT_CHEAT; i++) screensaver_inkey_hack_buffer[j++] = '2'; screensaver_inkey_hack_buffer[j++] = 'y'; /* Switch on "OPT(cheat_live)" */ screensaver_inkey_hack_buffer[j++] = ESCAPE; /* Leave cheat options */ screensaver_inkey_hack_buffer[j++] = ESCAPE; /* Leave options */ /* * Now start the Borg! */ screensaver_inkey_hack_buffer[j++] = KTRL('Z'); /* Enter borgmode */ screensaver_inkey_hack_buffer[j++] = 'z'; /* Run Borg */ #endif /* ALLOW_BORG */ /* Play game */ play_game((bool)!file_exist); } #endif /* USE_SAVER */ /* * Display a help file */ static void display_help(const char *filename) { plog("Use the online help files instead."); } /* * Process a menu command */ static void process_menus(WORD wCmd) { int i; term_data *td; OPENFILENAME ofn; /* Analyze */ switch (wCmd) { /* New game */ case IDM_FILE_NEW: { if (!initialized) { plog("You cannot do that yet..."); } else if (game_in_progress) { plog("You can't start a new game while you're still playing!"); } else { /* We'll return NEWGAME to the game. */ cmd.command = CMD_NEWGAME; } break; } /* Open game */ case IDM_FILE_OPEN: { if (!initialized) { plog("You cannot do that yet..."); } else if (game_in_progress) { plog("You can't open a new game while you're still playing!"); } else { memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = data[0].w; ofn.lpstrFilter = "Save Files (*.)\0*\0"; ofn.nFilterIndex = 1; ofn.lpstrFile = savefile; ofn.nMaxFile = 1024; ofn.lpstrInitialDir = ANGBAND_DIR_SAVE; ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; if (GetOpenFileName(&ofn)) { /* Load 'savefile' */ validate_file(savefile); /* We'll return NEWGAME to the game. */ cmd.command = CMD_LOADFILE; } } break; } /* Save game */ case IDM_FILE_SAVE: { if (game_in_progress && character_generated && inkey_flag) { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } else { /* Paranoia */ plog("You may not do that right now."); } break; } /* Exit */ case IDM_FILE_EXIT: { if (game_in_progress && character_generated) { /* Paranoia */ if (!inkey_flag) { plog("You may not do that right now."); break; } /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } quit(NULL); break; } case IDM_WINDOW_VIS_0: { plog("You are not allowed to do that!"); break; } /* Window visibility */ case IDM_WINDOW_VIS_1: case IDM_WINDOW_VIS_2: case IDM_WINDOW_VIS_3: case IDM_WINDOW_VIS_4: case IDM_WINDOW_VIS_5: case IDM_WINDOW_VIS_6: case IDM_WINDOW_VIS_7: { i = wCmd - IDM_WINDOW_VIS_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; if (!td->visible) { td->visible = TRUE; ShowWindow(td->w, SW_SHOW); term_data_redraw(td); } else { td->visible = FALSE; ShowWindow(td->w, SW_HIDE); } break; } /* Window fonts */ case IDM_WINDOW_FONT_0: case IDM_WINDOW_FONT_1: case IDM_WINDOW_FONT_2: case IDM_WINDOW_FONT_3: case IDM_WINDOW_FONT_4: case IDM_WINDOW_FONT_5: case IDM_WINDOW_FONT_6: case IDM_WINDOW_FONT_7: { if ((use_graphics_nice) && (!inkey_flag || !initialized)) { plog("You may not do that right now."); break; } i = wCmd - IDM_WINDOW_FONT_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; term_change_font(td); if (use_graphics_nice) { /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } /* Bizarre Display */ case IDM_WINDOW_BIZ_0: case IDM_WINDOW_BIZ_1: case IDM_WINDOW_BIZ_2: case IDM_WINDOW_BIZ_3: case IDM_WINDOW_BIZ_4: case IDM_WINDOW_BIZ_5: case IDM_WINDOW_BIZ_6: case IDM_WINDOW_BIZ_7: { i = wCmd - IDM_WINDOW_BIZ_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->bizarre = !td->bizarre; term_getsize(td); term_window_resize(td); break; } /* Increase Tile Width */ case IDM_WINDOW_I_WID_0: case IDM_WINDOW_I_WID_1: case IDM_WINDOW_I_WID_2: case IDM_WINDOW_I_WID_3: case IDM_WINDOW_I_WID_4: case IDM_WINDOW_I_WID_5: case IDM_WINDOW_I_WID_6: case IDM_WINDOW_I_WID_7: { i = wCmd - IDM_WINDOW_I_WID_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_wid += 1; term_getsize(td); term_window_resize(td); break; } /* Decrease Tile Height */ case IDM_WINDOW_D_WID_0: case IDM_WINDOW_D_WID_1: case IDM_WINDOW_D_WID_2: case IDM_WINDOW_D_WID_3: case IDM_WINDOW_D_WID_4: case IDM_WINDOW_D_WID_5: case IDM_WINDOW_D_WID_6: case IDM_WINDOW_D_WID_7: { i = wCmd - IDM_WINDOW_D_WID_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_wid -= 1; term_getsize(td); term_window_resize(td); break; } /* Increase Tile Height */ case IDM_WINDOW_I_HGT_0: case IDM_WINDOW_I_HGT_1: case IDM_WINDOW_I_HGT_2: case IDM_WINDOW_I_HGT_3: case IDM_WINDOW_I_HGT_4: case IDM_WINDOW_I_HGT_5: case IDM_WINDOW_I_HGT_6: case IDM_WINDOW_I_HGT_7: { i = wCmd - IDM_WINDOW_I_HGT_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_hgt += 1; term_getsize(td); term_window_resize(td); break; } /* Decrease Tile Height */ case IDM_WINDOW_D_HGT_0: case IDM_WINDOW_D_HGT_1: case IDM_WINDOW_D_HGT_2: case IDM_WINDOW_D_HGT_3: case IDM_WINDOW_D_HGT_4: case IDM_WINDOW_D_HGT_5: case IDM_WINDOW_D_HGT_6: case IDM_WINDOW_D_HGT_7: { i = wCmd - IDM_WINDOW_D_HGT_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_hgt -= 1; term_getsize(td); term_window_resize(td); break; } case IDM_OPTIONS_GRAPHICS_NONE: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Toggle "arg_graphics" */ if (arg_graphics != GRAPHICS_NONE) { arg_graphics = GRAPHICS_NONE; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } case IDM_OPTIONS_GRAPHICS_OLD: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Toggle "arg_graphics" */ if (arg_graphics != GRAPHICS_ORIGINAL) { arg_graphics = GRAPHICS_ORIGINAL; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } case IDM_OPTIONS_GRAPHICS_ADAM: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Toggle "arg_graphics" */ if (arg_graphics != GRAPHICS_ADAM_BOLT) { arg_graphics = GRAPHICS_ADAM_BOLT; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } case IDM_OPTIONS_GRAPHICS_NOMAD: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Toggle "arg_graphics" */ if (arg_graphics != GRAPHICS_NOMAD) { arg_graphics = GRAPHICS_NOMAD; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } case IDM_OPTIONS_GRAPHICS_DAVID: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Toggle "arg_graphics" */ if (arg_graphics != GRAPHICS_DAVID_GERVAIS) { arg_graphics = GRAPHICS_DAVID_GERVAIS; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } case IDM_OPTIONS_GRAPHICS_NICE: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Toggle "arg_graphics_nice" */ arg_graphics_nice = !arg_graphics_nice; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); break; } case IDM_OPTIONS_TRPTILE: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Reduce... */ if (tile_height == 3) { tile_width /= 3; tile_height /= 3; } /* ...or increase */ else { tile_width /= tile_height; tile_width *= 3; tile_height = 3; } /* Set flag */ change_tilesize = TRUE; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); break; } case IDM_OPTIONS_DBLTILE: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Reduce... */ if (tile_height == 2) { tile_width /= 2; tile_height /= 2; } /* ...or increase */ else { tile_width /= tile_height; tile_height = 2; tile_width *= tile_height; } /* Set flag */ change_tilesize = TRUE; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); break; } case IDM_OPTIONS_BIGTILE: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Reduce... */ if (tile_height != tile_width) { tile_width = tile_height; } /* ...or increase */ else { tile_width *= 2; } /* Set flag */ change_tilesize = TRUE; /* React to changes */ Term_xtra_win_react(); /* Mega-Hack : Redraw screen */ Term_key_push(KTRL('R')); break; } #ifdef USE_SAVER case IDM_OPTIONS_SAVER: { if (hwndSaver) { DestroyWindow(hwndSaver); hwndSaver = NULL; screensaver_active = FALSE; /* Switch main menu back on */ SetMenu(data[0].w, main_menu); for (i = MAX_TERM_DATA - 1; i >= 0; --i) { td = &data[i]; if (td->visible) { /* Turn the Windows back to normal */ SetWindowLong(td->w, GWL_STYLE, td->dwStyle); /* Push the window to the top */ SetWindowPos(td->w, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE); } } ShowCursor(TRUE); } else { /* Create a screen saver window */ hwndSaver = CreateWindowEx(WS_EX_TOPMOST, "WindowsScreenSaverClass", "Angband Screensaver", WS_POPUP | WS_MAXIMIZE | WS_VISIBLE, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL); if (hwndSaver) { for (i = MAX_TERM_DATA - 1; i >= 0; --i) { td = &data[i]; if (td->visible) { /* Switch off border and titlebar */ SetWindowLong(td->w, GWL_STYLE, WS_VISIBLE); /* Switch off menu */ SetMenu(td->w, NULL); /* Push the window to the top */ SetWindowPos(td->w, HWND_TOPMOST, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE); } } ShowCursor(FALSE); screensaver_active = TRUE; } else { plog("Failed to create saver window"); } } break; } #endif /* USE_SAVER */ case IDM_OPTIONS_LOW_PRIORITY: { /* Lower or reset the priority of the current process */ if (low_priority) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); else SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); /* Toggle priority */ low_priority = !low_priority; break; } case IDM_OPTIONS_MAP: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } windows_map(); break; } case IDM_HELP_GENERAL: { display_help(HELP_GENERAL); break; } case IDM_HELP_SPOILERS: { display_help(HELP_SPOILERS); break; } } } /* * Redraw a section of a window */ static void handle_wm_paint(HWND hWnd) { int x1, y1, x2, y2; PAINTSTRUCT ps; term_data *td; /* Acquire proper "term_data" info */ td = (term_data *)GetWindowLongPtr(hWnd, GWLP_USERDATA); BeginPaint(hWnd, &ps); if (td->map_active) { /* Redraw the map */ /* ToDo: Only redraw the necessary parts */ windows_map_aux(); } else { /* Get the area that should be updated (rounding up/down) */ /* ToDo: Take the window borders into account */ x1 = (ps.rcPaint.left / td->tile_wid) - 1; x2 = (ps.rcPaint.right / td->tile_wid) + 1; y1 = (ps.rcPaint.top / td->tile_hgt) - 1; y2 = (ps.rcPaint.bottom / td->tile_hgt) + 1; /* Redraw */ if (td) term_data_redraw_section(td, x1, y1, x2, y2); } EndPaint(hWnd, &ps); } /* * We ignore the modifier keys (shift, control, alt, num lock, scroll lock), * and the normal keys (escape, tab, return, letters, numbers, etc), but we * catch the keypad keys (with and without numlock set, including keypad 5), * the function keys (including the "menu" key which maps to F10), and the * "pause" key (between scroll lock and numlock). We also catch a few odd * keys which I do not recognize, but which are listed among keys which we * do catch, so they should be harmless to catch. */ static void handle_keydown(WPARAM wParam, LPARAM lParam) { keycode_t ch = 0; bool mc = FALSE; bool ms = FALSE; bool ma = FALSE; bool kp = FALSE; #ifdef USE_SAVER if (screensaver_active) { stop_screensaver(); return 0; } #endif /* USE_SAVER */ /* Extract the modifiers */ if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE; if (GetKeyState(VK_SHIFT) & 0x8000) ms = TRUE; if (GetKeyState(VK_MENU) & 0x8000) ma = TRUE; /* for VK_ http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx */ switch (wParam) { case VK_F1: ch = KC_F1; break; case VK_F2: ch = KC_F2; break; case VK_F3: ch = KC_F3; break; case VK_F4: ch = KC_F4; break; case VK_F5: ch = KC_F5; break; case VK_F6: ch = KC_F6; break; case VK_F7: ch = KC_F7; break; case VK_F8: ch = KC_F8; break; case VK_F9: ch = KC_F9; break; case VK_F10: ch = KC_F10; break; case VK_F11: ch = KC_F11; break; case VK_F12: ch = KC_F12; break; case VK_F13: ch = KC_F13; break; case VK_F14: ch = KC_F14; break; case VK_F15: ch = KC_F15; break; case VK_INSERT: ch = KC_INSERT; break; case VK_DELETE: ch = KC_DELETE; break; /* Backspace is calling both backspace and delete Removed the backspace call, so it only calls delete */ case VK_BACK: break; case VK_TAB: ch = KC_TAB; break; case VK_PRIOR: ch = KC_PGUP; break; case VK_NEXT: ch = KC_PGDOWN; break; case VK_END: ch = KC_END; break; case VK_HOME: ch = KC_HOME; break; case VK_LEFT: ch = ARROW_LEFT; break; case VK_RIGHT: ch = ARROW_RIGHT; break; case VK_UP: ch = ARROW_UP; break; case VK_DOWN: ch = ARROW_DOWN; break; case VK_CLEAR: ch = '5'; kp=TRUE; break; case VK_PAUSE: ch = KC_PAUSE; break; /* have have these to get consistent ctrl-shift behaviour */ case '0': if (mc || ma) ch = '0'; break; case '1': if (mc || ma) ch = '1'; break; case '2': if (mc || ma) ch = '2'; break; case '3': if (mc || ma) ch = '3'; break; case '4': if (mc || ma) ch = '4'; break; case '5': if (mc || ma) ch = '5'; break; case '6': if (mc || ma) ch = '6'; break; case '7': if (mc || ma) ch = '7'; break; case '8': if (mc || ma) ch = '8'; break; case '9': if (mc || ma) ch = '9'; break; } /* we could fall back on using the scancode */ /* obtained using LOBYTE(HIWORD(lParam)) */ /* see http://source.winehq.org/source/include/dinput.h#L468 */ if (ch) { int mods = (mc && (kp || MODS_INCLUDE_CONTROL(ch)) ? KC_MOD_CONTROL : 0) | (ms && (kp || MODS_INCLUDE_SHIFT(ch)) ? KC_MOD_SHIFT : 0) | (ma ? KC_MOD_ALT : 0) | (kp ? KC_MOD_KEYPAD : 0); printf("ch=%d mods=%d\n", ch, mods); Term_keypress(ch, mods); } } static LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; term_data *td; int i; int xPos, yPos, button; #ifdef USE_SAVER static int iMouse = 0; static WORD xMouse = 0; static WORD yMouse = 0; int dx, dy; #endif /* USE_SAVER */ /* Acquire proper "term_data" info */ td = (term_data *)GetWindowLongPtr(hWnd, GWLP_USERDATA); /* Handle message */ switch (uMsg) { /* XXX XXX XXX */ case WM_NCCREATE: { #ifdef _WIN64 SetWindowLongPtr(hWnd, GWLP_USERDATA, my_td); #else SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)(my_td)); #endif break; } /* XXX XXX XXX */ case WM_CREATE: { return 0; } case WM_GETMINMAXINFO: { MINMAXINFO FAR *lpmmi; RECT rc; lpmmi = (MINMAXINFO FAR *)lParam; /* this message was sent before WM_NCCREATE */ if (!td) return 1; /* Minimum window size is 80x24 */ rc.left = rc.top = 0; rc.right = rc.left + 80 * td->tile_wid + td->size_ow1 + td->size_ow2; rc.bottom = rc.top + 24 * td->tile_hgt + td->size_oh1 + td->size_oh2 + 1; /* Adjust */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Save minimum size */ lpmmi->ptMinTrackSize.x = rc.right - rc.left; lpmmi->ptMinTrackSize.y = rc.bottom - rc.top; return 0; } case WM_PAINT: { handle_wm_paint(hWnd); return 0; } case WM_SYSKEYDOWN: case WM_KEYDOWN: { handle_keydown(wParam, lParam); break; } case WM_CHAR: { // really vicious hack; [Control]Return -> 10 (Return -> 13) if (wParam == 10) { Term_keypress(13, KC_MOD_CONTROL); } else { Term_keypress(wParam, 0); } return 0; } case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: { #ifdef USE_SAVER if (screensaver_active) { stop_screensaver(); return 0; } break; #else /* Get the text grid */ xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam); xPos /= td->tile_wid; yPos /= td->tile_hgt; if (uMsg == WM_LBUTTONDOWN) button = 1; else if (uMsg == WM_RBUTTONDOWN) button = 2; else button = 3; Term_mousepress(xPos,yPos,button); break; #endif /* USE_SAVER */ } #ifdef USE_SAVER case WM_MOUSEMOVE: { if (!screensaver_active) break; if (iMouse) { dx = LOWORD(lParam) - xMouse; dy = HIWORD(lParam) - yMouse; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; if ((dx > MOUSE_SENS) || (dy > MOUSE_SENS)) { stop_screensaver(); } } /* Save last location */ iMouse = 1; xMouse = LOWORD(lParam); yMouse = HIWORD(lParam); return 0; } #endif /* USE_SAVER */ case WM_INITMENU: { setup_menus(); return 0; } case WM_CLOSE: { if (game_in_progress && character_generated) { if (!inkey_flag) { plog("You may not do that right now."); return 0; } /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } quit(NULL); return 0; } case WM_QUIT: { quit(NULL); return 0; } case WM_COMMAND: { process_menus(LOWORD(wParam)); return 0; } case WM_SIZE: { /* this message was sent before WM_NCCREATE */ if (!td) return 1; /* it was sent from inside CreateWindowEx */ if (!td->w) return 1; /* was sent from WM_SIZE */ if (td->size_hack) return 1; switch (wParam) { case SIZE_MINIMIZED: { /* Hide sub-windows */ for (i = 1; i < MAX_TERM_DATA; i++) { if (data[i].visible) ShowWindow(data[i].w, SW_HIDE); } return 0; } case SIZE_MAXIMIZED: { /* fall through XXX XXX XXX */ } case SIZE_RESTORED: { int cols = (LOWORD(lParam) - td->size_ow1) / td->tile_wid; int rows = (HIWORD(lParam) - td->size_oh1) / td->tile_hgt; /* New size */ if ((td->cols != cols) || (td->rows != rows)) { /* Save the new size */ td->cols = cols; td->rows = rows; /* Activate */ Term_activate(&td->t); /* Resize the term */ Term_resize(td->cols, td->rows); /* Redraw later */ InvalidateRect(td->w, NULL, TRUE); } td->size_hack = TRUE; /* Show sub-windows */ for (i = 1; i < MAX_TERM_DATA; i++) { if (data[i].visible) ShowWindow(data[i].w, SW_SHOW); } td->size_hack = FALSE; return 0; } } break; } case WM_PALETTECHANGED: { /* Ignore if palette change caused by itself */ if ((HWND)wParam == hWnd) return 0; /* Fall through... */ } case WM_QUERYNEWPALETTE: { if (!paletted) return 0; hdc = GetDC(hWnd); SelectPalette(hdc, hPal, FALSE); i = RealizePalette(hdc); /* if any palette entries changed, repaint the window. */ if (i) InvalidateRect(hWnd, NULL, TRUE); ReleaseDC(hWnd, hdc); return 0; } case WM_ACTIVATE: { if (wParam && !HIWORD(lParam)) { /* Do something to sub-windows */ for (i = MAX_TERM_DATA - 1; i >= 0; i--) { SetWindowPos(data[i].w, hWnd, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); } /* Focus on main window */ SetFocus(hWnd); return 0; } break; } } return DefWindowProc(hWnd, uMsg, wParam, lParam); } static LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { term_data *td; HDC hdc; int i; #ifdef USE_SAVER static int iMouse = 0; static WORD xMouse = 0; static WORD yMouse = 0; int dx, dy; #endif /* USE_SAVER */ /* Acquire proper "term_data" info */ td = (term_data *)GetWindowLongPtr(hWnd, GWLP_USERDATA); /* Process message */ switch (uMsg) { /* XXX XXX XXX */ case WM_NCCREATE: { #ifdef _WIN64 SetWindowLongPtr(hWnd, GWLP_USERDATA, my_td); #else SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)(my_td)); #endif break; } /* XXX XXX XXX */ case WM_CREATE: { return 0; } case WM_GETMINMAXINFO: { #if 0 MINMAXINFO FAR *lpmmi; RECT rc; /* this message was sent before WM_NCCREATE */ if (!td) return 1; lpmmi = (MINMAXINFO FAR *)lParam; /* Minimum size */ rc.left = rc.top = 0; rc.right = rc.left + 8 * td->tile_wid + td->size_ow1 + td->size_ow2; rc.bottom = rc.top + 2 * td->tile_hgt + td->size_oh1 + td->size_oh2; /* Adjust */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Save the minimum size */ lpmmi->ptMinTrackSize.x = rc.right - rc.left; lpmmi->ptMinTrackSize.y = rc.bottom - rc.top; /* Maximum window size */ rc.left = rc.top = 0; rc.right = rc.left + 80 * td->tile_wid + td->size_ow1 + td->size_ow2; rc.bottom = rc.top + 24 * td->tile_hgt + td->size_oh1 + td->size_oh2; /* Paranoia */ rc.right += (td->tile_wid - 1); rc.bottom += (td->tile_hgt - 1); /* Adjust */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Save maximum size */ lpmmi->ptMaxSize.x = rc.right - rc.left; lpmmi->ptMaxSize.y = rc.bottom - rc.top; /* Save the maximum size */ lpmmi->ptMaxTrackSize.x = rc.right - rc.left; lpmmi->ptMaxTrackSize.y = rc.bottom - rc.top; #endif /* 0 */ return 0; } case WM_SIZE: { int cols; int rows; /* this message was sent before WM_NCCREATE */ if (!td) return 1; /* it was sent from inside CreateWindowEx */ if (!td->w) return 1; /* was sent from inside WM_SIZE */ if (td->size_hack) return 1; td->size_hack = TRUE; cols = (LOWORD(lParam) - td->size_ow1) / td->tile_wid; rows = (HIWORD(lParam) - td->size_oh1) / td->tile_hgt; /* New size */ if ((td->cols != cols) || (td->rows != rows)) { /* Save old term */ term *old_term = Term; /* Save the new size */ td->cols = cols; td->rows = rows; /* Activate */ Term_activate(&td->t); /* Resize the term */ Term_resize(td->cols, td->rows); /* Activate */ Term_activate(old_term); /* Redraw later */ InvalidateRect(td->w, NULL, TRUE); /* HACK - Redraw all windows */ if (character_dungeon) do_cmd_redraw(); } td->size_hack = FALSE; return 0; } case WM_PAINT: { handle_wm_paint(hWnd); return 0; } case WM_SYSKEYDOWN: case WM_KEYDOWN: { handle_keydown(wParam, lParam); break; } case WM_CHAR: { Term_keypress(wParam, 0); return 0; } #ifdef USE_SAVER case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: { if (screensaver_active) { stop_screensaver(); return 0; } break; } case WM_MOUSEMOVE: { if (!screensaver_active) break; if (iMouse) { dx = LOWORD(lParam) - xMouse; dy = HIWORD(lParam) - yMouse; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; if ((dx > MOUSE_SENS) || (dy > MOUSE_SENS)) { stop_screensaver(); } } /* Save last location */ iMouse = 1; xMouse = LOWORD(lParam); yMouse = HIWORD(lParam); return 0; } #endif /* USE_SAVER */ case WM_PALETTECHANGED: { /* ignore if palette change caused by itself */ if ((HWND)wParam == hWnd) return FALSE; /* otherwise, fall through!!! */ } case WM_QUERYNEWPALETTE: { if (!paletted) return 0; hdc = GetDC(hWnd); SelectPalette(hdc, hPal, FALSE); i = RealizePalette(hdc); /* if any palette entries changed, repaint the window. */ if (i) InvalidateRect(hWnd, NULL, TRUE); ReleaseDC(hWnd, hdc); return 0; } case WM_NCLBUTTONDOWN: { #ifdef HTCLOSE if (wParam == HTCLOSE) wParam = HTSYSMENU; #endif /* HTCLOSE */ if (wParam == HTSYSMENU) { if (td->visible) { td->visible = FALSE; ShowWindow(td->w, SW_HIDE); } return 0; } break; } } return DefWindowProc(hWnd, uMsg, wParam, lParam); } #ifdef USE_SAVER LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int iMouse = 0; static WORD xMouse = 0; static WORD yMouse = 0; int dx, dy; /* Process */ switch (uMsg) { /* XXX XXX XXX */ case WM_NCCREATE: { break; } case WM_SETCURSOR: { SetCursor(NULL); return 0; } #if 0 case WM_ACTIVATE: { if (LOWORD(wParam) == WA_INACTIVE) break; /* else fall through */ } #endif /* 0 */ case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: { stop_screensaver(); return 0; } case WM_MOUSEMOVE: { if (iMouse) { dx = LOWORD(lParam) - xMouse; dy = HIWORD(lParam) - yMouse; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; if ((dx > MOUSE_SENS) || (dy > MOUSE_SENS)) { stop_screensaver(); } } /* Save last location */ iMouse = 1; xMouse = LOWORD(lParam); yMouse = HIWORD(lParam); return 0; } case WM_CLOSE: { DestroyWindow(hwndSaver); if (screensaver) SendMessage(data[0].w, WM_CLOSE, 0, 0); hwndSaver = NULL; return 0; } } /* Oops */ return DefWindowProc(hWnd, uMsg, wParam, lParam); } #endif /* USE_SAVER */ /*** Temporary Hooks ***/ /* * Display warning message (see "z-util.c") */ static void hack_plog(const char *str) { /* Give a warning */ if (str) { MessageBox(NULL, str, "Warning", MB_ICONEXCLAMATION | MB_OK); } } /* * Display error message and quit (see "z-util.c") */ static void hack_quit(const char *str) { /* Give a warning */ if (str) { MessageBox(NULL, str, "Error", MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP); } /* Unregister the classes */ UnregisterClass(AppName, hInstance); /* Destroy the icon */ if (hIcon) DestroyIcon(hIcon); #ifdef USE_SAVER if (screensaverSemaphore) CloseHandle(screensaverSemaphore); #endif /* USE_SAVER */ /* Exit */ exit(0); } /*** Various hooks ***/ /* * Display warning message (see "z-util.c") */ static void hook_plog(const char *str) { #ifdef USE_SAVER if (screensaver_active) return; #endif /* USE_SAVER */ /* Warning */ if (str) { MessageBox(data[0].w, str, "Warning", MB_ICONEXCLAMATION | MB_OK); } } /* * Display error message and quit (see "z-util.c") */ static void hook_quit(const char *str) { int i; #ifdef USE_SOUND int j; #endif /* USE_SOUND */ #ifdef USE_SAVER if (!screensaver_active) #endif /* USE_SAVER */ { /* Give a warning */ if (str) { MessageBox(data[0].w, str, "Error", MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP); } /* Save the preferences */ save_prefs(); } /*** Could use 'Term_nuke_win()' XXX XXX XXX */ /* Destroy all windows */ for (i = MAX_TERM_DATA - 1; i >= 0; --i) { /* Remove all fonts from the system, free resources */ if (data[i].font_file) term_remove_font(data[i].font_file); if (data[i].font_id) DeleteObject(data[i].font_id); if (data[i].font_want) string_free(data[i].font_want); /* Kill the window */ if (data[i].w) DestroyWindow(data[i].w); data[i].w = 0; term_nuke(&data[i].t); } #ifdef USE_GRAPHICS /* Free the bitmap stuff */ FreeDIB(&infGraph); FreeDIB(&infMask); #endif /* USE_GRAPHICS */ #ifdef USE_SOUND /* Free the sound names */ for (i = 0; i < MSG_MAX; i++) { for (j = 0; j < SAMPLE_MAX; j++) { if (!sound_file[i][j]) break; string_free(sound_file[i][j]); } } #endif /* USE_SOUND */ /*** Free some other stuff ***/ DeleteObject(hbrYellow); if (hPal) DeleteObject(hPal); UnregisterClass(AppName, hInstance); if (hIcon) DestroyIcon(hIcon); /* Free strings */ string_free(ini_file); string_free(argv0); #ifdef HAS_CLEANUP cleanup_angband(); #endif /* HAS_CLEANUP */ exit(0); } static errr get_init_cmd() { MSG msg; /* Prompt the user */ prt("[Choose 'New' or 'Open' from the 'File' menu]", 23, 17); Term_fresh(); /* Process messages forever */ while (cmd.command == CMD_NULL && GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* Bit of a hack, we'll do this when we leave the INIT context in future. */ game_in_progress = TRUE; /* Push command into the queue. */ cmd_insert_s(&cmd); /* Everything's OK. */ return 0; } /* Command dispatcher for windows build */ static errr win_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_init_cmd(); else return textui_get_cmd(context, wait); } /*** Initialize ***/ /* * Init some stuff */ static void init_stuff(void) { int i; char path[1024]; #ifdef USE_SAVER char tmp[1024]; #endif /* USE_SAVER */ /* Get program name with full path */ if (GetModuleFileName(hInstance, path, sizeof(path)) == 0) show_win_error(); /* Paranoia */ path[sizeof(path) - 1] = '\0'; /* Save the "program name" */ argv0 = string_make(path); /* Get the name of the "*.ini" file */ strcpy(path + strlen(path) - 4, ".INI"); #ifdef USE_SAVER /* Try to get the path to the Angband folder */ if (screensaver) { /* Extract the filename of the savefile for the screensaver */ GetPrivateProfileString("Angband", "SaverFile", "", saverfilename, sizeof(saverfilename), path); GetPrivateProfileString("Angband", "AngbandPath", "", tmp, sizeof(tmp), path); sprintf(path, "%sangband.ini", tmp); } #endif /* USE_SAVER */ /* Save the the name of the ini-file */ ini_file = string_make(path); /* Analyze the path */ i = strlen(path); /* Get the path */ for (; i > 0; i--) { if (path[i] == '\\') { /* End of path */ break; } } /* Add "lib" to the path */ strcpy(path + i + 1, "lib\\"); /* Validate the path */ validate_dir(path); /* Init the file paths */ init_file_paths(path, path, path); /* Hack -- Validate the paths */ validate_dir(ANGBAND_DIR_APEX); validate_dir(ANGBAND_DIR_EDIT); validate_dir(ANGBAND_DIR_FILE); validate_dir(ANGBAND_DIR_HELP); validate_dir(ANGBAND_DIR_PREF); validate_dir(ANGBAND_DIR_SAVE); validate_dir(ANGBAND_DIR_USER); validate_dir(ANGBAND_DIR_XTRA); /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news.txt"); /* Hack -- Validate the "news.txt" file */ validate_file(path); /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT); /* Hack -- Validate the basic font */ validate_file(path); #ifdef USE_GRAPHICS /* Validate the "graf" directory */ validate_dir(ANGBAND_DIR_XTRA_GRAF); #endif /* USE_GRAPHICS */ #ifdef USE_SOUND /* Validate the "sound" directory */ validate_dir(ANGBAND_DIR_XTRA_SOUND); #endif /* USE_SOUND */ } int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { int i; WNDCLASS wc; HDC hdc; /* Unused parameter */ (void)nCmdShow; #ifdef USE_SAVER if (lpCmdLine && ((*lpCmdLine == '-') || (*lpCmdLine == '/'))) { lpCmdLine++; switch (*lpCmdLine) { case 's': case 'S': { screensaver = TRUE; /* Only run one screensaver at the time */ screensaverSemaphore = CreateSemaphore(NULL, 0, 1, "AngbandSaverSemaphore"); if (!screensaverSemaphore) exit(0); if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(screensaverSemaphore); exit(0); } break; } case 'P': case 'p': case 'C': case 'c': case 'A': case 'a': { /* * ToDo: implement preview, configuration, and changing * the password (as well as checking it). */ exit(0); } } } #endif /* USE_SAVER */ /* Initialize */ if (hPrevInst == NULL) { wc.style = CS_CLASSDC; wc.lpfnWndProc = AngbandWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 4; /* one long pointer to term_data */ wc.hInstance = hInst; wc.hIcon = hIcon = LoadIcon(hInst, "ANGBAND"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(BLACK_BRUSH); wc.lpszMenuName = "ANGBAND"; wc.lpszClassName = AppName; if (!RegisterClass(&wc)) exit(1); wc.lpfnWndProc = AngbandListProc; wc.lpszMenuName = NULL; wc.lpszClassName = AngList; if (!RegisterClass(&wc)) exit(2); #ifdef USE_SAVER wc.style = CS_VREDRAW | CS_HREDRAW | CS_SAVEBITS | CS_DBLCLKS; wc.lpfnWndProc = AngbandSaverProc; wc.hCursor = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "WindowsScreenSaverClass"; if (!RegisterClass(&wc)) exit(3); #endif /* USE_SAVER */ } /* Save globally */ hInstance = hInst; /* Temporary hooks */ plog_aux = hack_plog; quit_aux = hack_quit; /* Prepare the filepaths */ init_stuff(); /* Determine if display is 16/256/true color */ hdc = GetDC(NULL); colors16 = (GetDeviceCaps(hdc, BITSPIXEL) == 4); paletted = ((GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) ? TRUE : FALSE); ReleaseDC(NULL, hdc); /* Initialize the colors */ for (i = 0; i < MAX_COLORS; i++) { byte rv, gv, bv; /* Extract desired values */ rv = angband_color_table[i][1]; gv = angband_color_table[i][2]; bv = angband_color_table[i][3]; /* Extract the "complex" code */ win_clr[i] = PALETTERGB(rv, gv, bv); /* Save the "simple" code */ angband_color_table[i][0] = win_pal[i]; } /* Prepare the windows */ init_windows(); /* Activate hooks */ plog_aux = hook_plog; quit_aux = hook_quit; /* Set the system suffix */ ANGBAND_SYS = "win"; #ifdef USE_SAVER if (screensaver) { /* Start the screensaver */ start_screensaver(); /* Paranoia */ quit(NULL); } #endif /* USE_SAVER */ #ifdef USE_SOUND /* Set the sound hook */ sound_hook = Term_xtra_win_sound; #endif /* USE_SOUND */ /* Did the user double click on a save file? */ check_for_save_file(lpCmdLine); /* Set command hook */ cmd_get_hook = win_get_cmd; /* Set up the display handlers and things. */ init_display(); initialized = TRUE; /* Play the game */ play_game(); /* Paranoia */ quit(NULL); /* Paranoia */ return (0); } #endif /* WINDOWS */ angband-v3.3.2/src/HEADER0000644000175000017500000000104611651552410014252 0ustar chriscchrisc/* * File: xxx.c * Purpose: xxx * * Copyright (c) [yyyy] [author list] * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ angband-v3.3.2/src/spells2.c0000644000175000017500000020332511651552410015133 0ustar chriscchrisc/* * File: spells2.c * Purpose: Various assorted spell effects * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "generate.h" #include "history.h" #include "monster/mon-lore.h" #include "monster/mon-make.h" #include "monster/mon-timed.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/slays.h" #include "object/tvalsval.h" #include "spells.h" #include "squelch.h" #include "target.h" #include "trap.h" /* * Increase players hit points, notice effects */ bool hp_player(int num) { /* Healing needed */ if (p_ptr->chp < p_ptr->mhp) { /* Gain hitpoints */ p_ptr->chp += num; /* Enforce maximum */ if (p_ptr->chp >= p_ptr->mhp) { p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; } /* Redraw */ p_ptr->redraw |= (PR_HP); /* Print a nice message */ if (num < 5) msg("You feel a little better."); else if (num < 15) msg("You feel better."); else if (num < 35) msg("You feel much better."); else msg("You feel very good."); /* Notice */ return (TRUE); } /* Ignore */ return (FALSE); } /* * Heal the player by a given percentage of his wounds, or a minimum * amount, whichever is larger. * * Copied wholesale from EyAngband. */ bool heal_player(int perc, int min) { int i; /* Paranoia */ if ((perc <= 0) && (min <= 0)) return (FALSE); /* No healing needed */ if (p_ptr->chp >= p_ptr->mhp) return (FALSE); /* Figure healing level */ i = ((p_ptr->mhp - p_ptr->chp) * perc) / 100; /* Enforce minimums */ if (i < min) i = min; /* Actual healing */ return hp_player(i); } /* * Leave a "glyph of warding" which prevents monster movement */ bool warding_glyph(void) { int py = p_ptr->py; int px = p_ptr->px; if (cave->feat[py][px] != FEAT_FLOOR) { msg("There is no clear floor on which to cast the spell."); return FALSE; } /* Create a glyph */ cave_set_feat(cave, py, px, FEAT_GLYPH); return TRUE; } /** * Create a "glyph of warding" via a spell. * * We need to do this because the book-keeping is slightly different for * spells vs. scrolls. */ void warding_glyph_spell(void) { int py = p_ptr->py; int px = p_ptr->px; /* See if the effect works */ if (!warding_glyph()) return; /* Push objects off the grid */ if (cave->o_idx[py][px]) push_object(py, px); } /* * Array of stat "descriptions" */ static const char *desc_stat_pos[] = { "strong", "smart", "wise", "dextrous", "healthy", "cute" }; /* * Array of stat "descriptions" */ static const char *desc_stat_neg[] = { "weak", "stupid", "naive", "clumsy", "sickly", "ugly" }; /* * Lose a "point" */ bool do_dec_stat(int stat, bool perma) { bool sust = FALSE; /* Get the "sustain" */ switch (stat) { case A_STR: if (check_state(p_ptr, OF_SUST_STR, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_STR); break; case A_INT: if (check_state(p_ptr, OF_SUST_INT, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_INT); break; case A_WIS: if (check_state(p_ptr, OF_SUST_WIS, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_WIS); break; case A_DEX: if (check_state(p_ptr, OF_SUST_DEX, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_DEX); break; case A_CON: if (check_state(p_ptr, OF_SUST_CON, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_CON); break; case A_CHR: if (check_state(p_ptr, OF_SUST_CHR, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_CHR); break; } /* Sustain */ if (sust && !perma) { /* Message */ msg("You feel very %s for a moment, but the feeling passes.", desc_stat_neg[stat]); /* Notice effect */ return (TRUE); } /* Attempt to reduce the stat */ if (player_stat_dec(p_ptr, stat, perma)) { /* Message */ msgt(MSG_DRAIN_STAT, "You feel very %s.", desc_stat_neg[stat]); /* Notice effect */ return (TRUE); } /* Nothing obvious */ return (FALSE); } /* * Restore lost "points" in a stat */ bool do_res_stat(int stat) { /* Attempt to increase */ if (res_stat(stat)) { /* Message */ msg("You feel less %s.", desc_stat_neg[stat]); /* Notice */ return (TRUE); } /* Nothing obvious */ return (FALSE); } /* * Gain a "point" in a stat */ bool do_inc_stat(int stat) { bool res; /* Restore strength */ res = res_stat(stat); /* Attempt to increase */ if (player_stat_inc(p_ptr, stat)) { /* Message */ msg("You feel very %s!", desc_stat_pos[stat]); /* Notice */ return (TRUE); } /* Restoration worked */ if (res) { /* Message */ msg("You feel less %s.", desc_stat_neg[stat]); /* Notice */ return (TRUE); } /* Nothing obvious */ return (FALSE); } /* * Identify everything being carried. * Done by a potion of "self knowledge". */ void identify_pack(void) { int i; /* Simply identify and know every item */ for (i = 0; i < ALL_INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Aware and Known */ if (object_is_known(o_ptr)) continue; /* Identify it */ do_ident_item(i, o_ptr); /* repeat with same slot */ i--; } } /* * Hack -- Removes curse from an object. */ static void uncurse_object(object_type *o_ptr) { bitflag f[OF_SIZE]; create_mask(f, FALSE, OFT_CURSE, OFT_MAX); of_diff(o_ptr->flags, f); } /* * Removes curses from items in inventory. * * \param heavy removes heavy curses if true * * \returns number of items uncursed */ static int remove_curse_aux(bool heavy) { int i, cnt = 0; /* Attempt to uncurse items being worn */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) continue; if (!cursed_p(o_ptr->flags)) continue; /* Heavily cursed items need a special spell */ if (of_has(o_ptr->flags, OF_HEAVY_CURSE) && !heavy) continue; /* Perma-cursed items can never be removed */ if (of_has(o_ptr->flags, OF_PERMA_CURSE)) continue; /* Uncurse, and update things */ uncurse_object(o_ptr); p_ptr->update |= (PU_BONUS); p_ptr->redraw |= (PR_EQUIP); /* Count the uncursings */ cnt++; } /* Return "something uncursed" */ return (cnt); } /* * Remove most curses */ bool remove_curse(void) { return (remove_curse_aux(FALSE)); } /* * Remove all curses */ bool remove_all_curse(void) { return (remove_curse_aux(TRUE)); } /* * Restores any drained experience */ bool restore_level(void) { /* Restore experience */ if (p_ptr->exp < p_ptr->max_exp) { /* Message */ msg("You feel your life energies returning."); player_exp_gain(p_ptr, p_ptr->max_exp - p_ptr->exp); /* Did something */ return (TRUE); } /* No effect */ return (FALSE); } /* * Set word of recall as appropriate */ void set_recall(void) { /* Ironman */ if (OPT(birth_ironman) && !p_ptr->total_winner) { msg("Nothing happens."); return; } /* Activate recall */ if (!p_ptr->word_recall) { /* Reset recall depth */ if ((p_ptr->depth > 0) && (p_ptr->depth != p_ptr->max_depth)) { /* * ToDo: Add a new player_type field "recall_depth" * ToDo: Poll: Always reset recall depth? */ if (get_check("Reset recall depth? ")) p_ptr->max_depth = p_ptr->depth; } p_ptr->word_recall = randint0(20) + 15; msg("The air about you becomes charged..."); } /* Deactivate recall */ else { p_ptr->word_recall = 0; msg("A tension leaves the air around you..."); } /* Redraw status line */ p_ptr->redraw = PR_STATUS; handle_stuff(p_ptr); } /*** Detection spells ***/ /* * Useful constants for the area around the player to detect. * This is instead of using circular detection spells. */ #define DETECT_DIST_X 40 /* Detect 42 grids to the left & right */ #define DETECT_DIST_Y 22 /* Detect 22 grids to the top & bottom */ /* * Map an area around the player. * * We must never attempt to map the outer dungeon walls, or we * might induce illegal cave grid references. */ void map_area(void) { int i, x, y; int x1, x2, y1, y2; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; /* Drag the co-ordinates into the dungeon */ if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; if (y2 > DUNGEON_HGT - 1) y2 = DUNGEON_HGT - 1; if (x2 > DUNGEON_WID - 1) x2 = DUNGEON_WID - 1; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { /* All non-walls are "checked" */ if (cave->feat[y][x] < FEAT_SECRET) { if (!in_bounds_fully(y, x)) continue; /* Memorize normal features */ if (cave->feat[y][x] > FEAT_INVIS) { /* Memorize the object */ cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } /* Memorize known walls */ for (i = 0; i < 8; i++) { int yy = y + ddy_ddd[i]; int xx = x + ddx_ddd[i]; /* Memorize walls (etc) */ if (cave->feat[yy][xx] >= FEAT_SECRET) { /* Memorize the walls */ cave->info[yy][xx] |= (CAVE_MARK); cave_light_spot(cave, yy, xx); } } } } } } /* * Detect traps around the player. */ bool detect_traps(bool aware) { int y, x; int x1, x2, y1, y2; bool detect = FALSE; (void)aware; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!in_bounds_fully(y, x)) continue; /* Detect invisible traps */ if (cave->feat[y][x] == FEAT_INVIS) { /* Pick a trap */ pick_trap(y, x); } /* Detect traps */ if (cave_isknowntrap(cave, y, x)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* We found something to detect */ detect = TRUE; } /* Mark as trap-detected */ cave->info2[y][x] |= CAVE2_DTRAP; } } /* Rescan the map for the new dtrap edge */ for (y = y1 - 1; y < y2 + 1; y++) { for (x = x1 - 1; x < x2 + 1; x++) { if (!in_bounds_fully(y, x)) continue; /* Redraw */ cave_light_spot(cave, y, x); } } /* Describe */ if (detect) msg("You sense the presence of traps!"); /* Trap detection always makes you aware, even if no traps are present */ else msg("You sense no traps."); /* Mark the redraw flag */ p_ptr->redraw |= (PR_DTRAP); /* Result */ return (TRUE); } /* * Detect doors and stairs around the player. */ bool detect_doorstairs(bool aware) { int y, x; int x1, x2, y1, y2; bool doors = FALSE, stairs = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!in_bounds_fully(y, x)) continue; /* Detect secret doors */ if (cave->feat[y][x] == FEAT_SECRET) place_closed_door(cave, y, x); /* Detect doors */ if (((cave->feat[y][x] >= FEAT_DOOR_HEAD) && (cave->feat[y][x] <= FEAT_DOOR_TAIL)) || ((cave->feat[y][x] == FEAT_OPEN) || (cave->feat[y][x] == FEAT_BROKEN))) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Obvious */ doors = TRUE; } /* Detect stairs */ if ((cave->feat[y][x] == FEAT_LESS) || (cave->feat[y][x] == FEAT_MORE)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Obvious */ stairs = TRUE; } } } /* Describe */ if (doors && !stairs) msg("You sense the presence of doors!"); else if (!doors && stairs) msg("You sense the presence of stairs!"); else if (doors && stairs) msg("You sense the presence of doors and stairs!"); else if (aware && !doors && !stairs) msg("You sense no doors or stairs."); /* Result */ return (doors || stairs); } /* * Detect all treasure around the player. */ bool detect_treasure(bool aware) { int i; int y, x; int x1, x2, y1, y2; bool gold_buried = FALSE; bool objects = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!in_bounds_fully(y, x)) continue; /* Notice embedded gold */ if ((cave->feat[y][x] == FEAT_MAGMA_H) || (cave->feat[y][x] == FEAT_QUARTZ_H)) { /* Expose the gold */ cave->feat[y][x] += 0x02; } /* Magma/Quartz + Known Gold */ if ((cave->feat[y][x] == FEAT_MAGMA_K) || (cave->feat[y][x] == FEAT_QUARTZ_K)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Detect */ gold_buried = TRUE; } } } /* Scan objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Location */ y = o_ptr->iy; x = o_ptr->ix; /* Only detect nearby objects */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Hack -- memorize it */ o_ptr->marked = TRUE; /* Redraw */ cave_light_spot(cave, y, x); /* Detect */ if (!squelch_item_ok(o_ptr)) objects = TRUE; } if (gold_buried) msg("You sense the presence of buried treasure!"); if (objects) msg("You sense the presence of objects!"); if (aware && !gold_buried && !objects) msg("You sense no treasure or objects."); return gold_buried || objects; } /* * Quietly detect all buried treasure near the player. */ bool detect_close_buried_treasure(void) { int y, x; int x1, x2, y1, y2; bool gold_buried = FALSE; /* Pick a small area to map */ y1 = p_ptr->py - 3; y2 = p_ptr->py + 3; x1 = p_ptr->px - 3; x2 = p_ptr->px + 3; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!in_bounds_fully(y, x)) continue; /* Notice embedded gold */ if ((cave->feat[y][x] == FEAT_MAGMA_H) || (cave->feat[y][x] == FEAT_QUARTZ_H)) { /* Expose the gold */ cave->feat[y][x] += 0x02; } /* Magma/Quartz + Known Gold */ if ((cave->feat[y][x] == FEAT_MAGMA_K) || (cave->feat[y][x] == FEAT_QUARTZ_K)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Detect */ gold_buried = TRUE; } } } return (gold_buried); } /* * Detect "magic" objects around the player. * * This will light up all spaces with "magic" items, including artifacts, * ego-items, potions, scrolls, books, rods, wands, staves, amulets, rings, * and "enchanted" items of the "good" variety. * * It can probably be argued that this function is now too powerful. */ bool detect_objects_magic(bool aware) { int i, y, x, tv; int x1, x2, y1, y2; bool detect = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan all objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Location */ y = o_ptr->iy; x = o_ptr->ix; /* Only detect nearby objects */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Examine the tval */ tv = o_ptr->tval; /* Artifacts, misc magic items, or enchanted wearables */ if (o_ptr->artifact || o_ptr->ego || (tv == TV_AMULET) || (tv == TV_RING) || (tv == TV_STAFF) || (tv == TV_WAND) || (tv == TV_ROD) || (tv == TV_SCROLL) || (tv == TV_POTION) || (tv == TV_MAGIC_BOOK) || (tv == TV_PRAYER_BOOK) || ((o_ptr->to_a > 0) || (o_ptr->to_h + o_ptr->to_d > 0))) { /* Memorize the item */ o_ptr->marked = TRUE; /* Redraw */ cave_light_spot(cave, y, x); /* Detect */ if (!squelch_item_ok(o_ptr)) detect = TRUE; } } if (detect) msg("You sense the presence of magic objects!"); else if (aware && !detect) msg("You sense no magic objects."); return detect; } /* * Detect "normal" monsters around the player. */ bool detect_monsters_normal(bool aware) { int i, y, x; int x1, x2, y1, y2; bool flag = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Only detect nearby monsters */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Detect all non-invisible, obvious monsters */ if (!rf_has(r_ptr->flags, RF_INVISIBLE) && !m_ptr->unaware) { /* Hack -- Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(i, FALSE); /* Detect */ flag = TRUE; } } if (flag) msg("You sense the presence of monsters!"); else if (aware && !flag) msg("You sense no monsters."); /* Result */ return flag; } /* * Detect "invisible" monsters around the player. */ bool detect_monsters_invis(bool aware) { int i, y, x; int x1, x2, y1, y2; bool flag = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; monster_lore *l_ptr = &l_list[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Only detect nearby objects */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Detect invisible monsters */ if (rf_has(r_ptr->flags, RF_INVISIBLE)) { /* Take note that they are invisible */ rf_on(l_ptr->flags, RF_INVISIBLE); /* Update monster recall window */ if (p_ptr->monster_race_idx == m_ptr->r_idx) { /* Redraw stuff */ p_ptr->redraw |= (PR_MONSTER); } /* Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(i, FALSE); /* Detect */ flag = TRUE; } } if (flag) msg("You sense the presence of invisible creatures!"); else if (aware && !flag) msg("You sense no invisible creatures."); return (flag); } /* * Detect "evil" monsters around the player. */ bool detect_monsters_evil(bool aware) { int i, y, x; int x1, x2, y1, y2; bool flag = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; monster_lore *l_ptr = &l_list[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Only detect nearby objects */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Detect evil monsters */ if (rf_has(r_ptr->flags, RF_EVIL)) { /* Take note that they are evil */ rf_on(l_ptr->flags, RF_EVIL); /* Update monster recall window */ if (p_ptr->monster_race_idx == m_ptr->r_idx) { /* Redraw stuff */ p_ptr->redraw |= (PR_MONSTER); } /* Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(i, FALSE); /* Detect */ flag = TRUE; } } if (flag) msg("You sense the presence of evil creatures!"); else if (aware && !flag) msg("You sense no evil creatures."); return flag; } /* * Detect everything */ bool detect_all(bool aware) { bool detect = FALSE; /* Detect everything */ if (detect_traps(aware)) detect = TRUE; if (detect_doorstairs(aware)) detect = TRUE; if (detect_treasure(aware)) detect = TRUE; if (detect_monsters_invis(aware)) detect = TRUE; if (detect_monsters_normal(aware)) detect = TRUE; /* Result */ return (detect); } /* * Create stairs at the player location */ void stair_creation(void) { int py = p_ptr->py; int px = p_ptr->px; /* Only allow stairs to be created on empty floor */ if (cave->feat[py][px] != FEAT_FLOOR) { msg("There is no empty floor here."); return; } /* Push objects off the grid */ if (cave->o_idx[py][px]) push_object(py, px); /* Create a staircase */ if (!p_ptr->depth) { cave_set_feat(cave, py, px, FEAT_MORE); } else if (is_quest(p_ptr->depth) || (p_ptr->depth >= MAX_DEPTH-1)) { cave_set_feat(cave, py, px, FEAT_LESS); } else if (randint0(100) < 50) { cave_set_feat(cave, py, px, FEAT_MORE); } else { cave_set_feat(cave, py, px, FEAT_LESS); } } /* * Hook to specify "weapon" */ static bool item_tester_hook_weapon(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_SWORD: case TV_HAFTED: case TV_POLEARM: case TV_DIGGING: case TV_BOW: case TV_BOLT: case TV_ARROW: case TV_SHOT: { return (TRUE); } } return (FALSE); } /* * Hook to specify "armour" */ static bool item_tester_hook_armour(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_SHIELD: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_BOOTS: case TV_GLOVES: { return (TRUE); } } return (FALSE); } /* * Now that object flags are changing so much, it is likely that there * will be buggy objects that are marked with IDENT_KNOWN but do not * have all flags correctly marked. This function needs to allow for * reidentifying buggy objects. */ static bool item_tester_unknown(const object_type *o_ptr) { /* A hack for a hack - Disable this for the 3.1.2 release */ if (FALSE && object_is_not_known_consistently(o_ptr)) { /* * This next hack is pretty terrible, but people playing * the nightlies will really appreciate not having to reidentify * every time a new IDENT_ flag is added. It should be * removed when the codebase is stable. */ object_type *i_ptr = (object_type *) o_ptr; if (!object_check_for_ident(i_ptr)) return TRUE; else return FALSE; } return object_is_known(o_ptr) ? FALSE : TRUE; } /* * Used by the "enchant" function (chance of failure) */ static const int enchant_table[16] = { 0, 10, 20, 40, 80, 160, 280, 400, 550, 700, 800, 900, 950, 970, 990, 1000 }; /** * Tries to increase an items bonus score, if possible. * * \returns true if the bonus was increased */ static bool enchant_score(s16b *score, bool is_artifact) { int chance; /* Artifacts resist enchantment half the time */ if (is_artifact && randint0(100) < 50) return FALSE; /* Figure out the chance to enchant */ if (*score < 0) chance = 0; else if (*score > 15) chance = 1000; else chance = enchant_table[*score]; /* If we roll less-than-or-equal to chance, it fails */ if (randint1(1000) <= chance) return FALSE; /* Increment the score */ ++*score; return TRUE; } /** * Tries to uncurse a cursed item, if possible * * \returns true if a curse was broken */ static bool enchant_curse(object_type *o_ptr, bool is_artifact) { bitflag f[OF_SIZE]; /* Extract the flags */ object_flags(o_ptr, f); /* If the item isn't cursed (or is perma-cursed) this doesn't work */ if (!cursed_p(o_ptr->flags) || of_has(f, OF_PERMA_CURSE)) return FALSE; /* Artifacts resist enchanting curses away half the time */ if (is_artifact && randint0(100) < 50) return FALSE; /* Normal items are uncursed 25% of the tiem */ if (randint0(100) >= 25) return FALSE; /* Uncurse the item */ msg("The curse is broken!"); uncurse_object(o_ptr); return TRUE; } /** * Helper function for enchant() which tries to do the two things that * enchanting an item does, namely increasing its bonuses and breaking curses * * \returns true if a bonus was increased or a curse was broken */ static bool enchant2(object_type *o_ptr, s16b *score) { bool result = FALSE; bool is_artifact = o_ptr->artifact ? TRUE : FALSE; if (enchant_score(score, is_artifact)) result = TRUE; if (enchant_curse(o_ptr, is_artifact)) result = TRUE; return result; } /** * Enchant an item * * Revamped! Now takes item pointer, number of times to try enchanting, and a * flag of what to try enchanting. Artifacts resist enchantment some of the * time. Also, any enchantment attempt (even unsuccessful) kicks off a parallel * attempt to uncurse a cursed item. * * Note that an item can technically be enchanted all the way to +15 if you * wait a very, very, long time. Going from +9 to +10 only works about 5% of * the time, and from +10 to +11 only about 1% of the time. * * Note that this function can now be used on "piles" of items, and the larger * the pile, the lower the chance of success. * * \returns true if the item was changed in some way */ bool enchant(object_type *o_ptr, int n, int eflag) { int i, prob; bool res = FALSE; /* Large piles resist enchantment */ prob = o_ptr->number * 100; /* Missiles are easy to enchant */ if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) prob = prob / 20; /* Try "n" times */ for (i = 0; i < n; i++) { /* Roll for pile resistance */ if (prob > 100 && randint0(prob) >= 100) continue; /* Try the three kinds of enchantment we can do */ if ((eflag & ENCH_TOHIT) && enchant2(o_ptr, &o_ptr->to_h)) res = TRUE; if ((eflag & ENCH_TODAM) && enchant2(o_ptr, &o_ptr->to_d)) res = TRUE; if ((eflag & ENCH_TOAC) && enchant2(o_ptr, &o_ptr->to_a)) res = TRUE; } /* Failure */ if (!res) return (FALSE); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP ); /* Success */ return (TRUE); } /* * Enchant an item (in the inventory or on the floor) * Note that "num_ac" requires armour, else weapon * Returns TRUE if attempted, FALSE if cancelled */ bool enchant_spell(int num_hit, int num_dam, int num_ac) { int item; bool okay = FALSE; object_type *o_ptr; char o_name[80]; const char *q, *s; /* Assume enchant weapon */ item_tester_hook = item_tester_hook_weapon; /* Enchant armor if requested */ if (num_ac) item_tester_hook = item_tester_hook_armour; /* Get an item */ q = "Enchant which item? "; s = "You have nothing to enchant."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Describe */ msg("%s %s glow%s brightly!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); /* Enchant */ if (enchant(o_ptr, num_hit, ENCH_TOHIT)) okay = TRUE; if (enchant(o_ptr, num_dam, ENCH_TODAM)) okay = TRUE; if (enchant(o_ptr, num_ac, ENCH_TOAC)) okay = TRUE; /* Failure */ if (!okay) { flush(); /* Message */ msg("The enchantment failed."); } /* Something happened */ return (TRUE); } static bool item_tester_restore(const struct object *o) { if (o->to_d < 0 || o->to_h < 0 || o->to_a < 0) return TRUE; if (o->artifact) { if (o->to_d < o->artifact->to_d || o->to_h < o->artifact->to_h || o->to_a < o->artifact->to_a) return TRUE; } return FALSE; } /** * Restore an item to its original state, or something close. */ bool restore_item(void) { char o_name[80]; int item; object_type *o; item_tester_hook = item_tester_restore; if (!get_item(&item, "Restore which item?", "You have nothing to restore.", 0, USE_EQUIP | USE_INVEN | USE_FLOOR)) return FALSE; o = object_from_item_idx(item); /*** Restore the item (ish) ***/ /* Artifacts get replenished */ if (o->artifact) { o->to_d = o->artifact->to_d; o->to_h = o->artifact->to_h; o->to_a = o->artifact->to_a; } else { o->to_d = MAX(o->to_d, 0); o->to_h = MAX(o->to_h, 0); o->to_a = MAX(o->to_a, 0); } object_desc(o_name, sizeof(o_name), o, ODESC_BASE); msg("%s %s is mended.", ((item >= 0) ? "Your" : "The"), o_name, ((o->number > 1) ? "" : "s")); return TRUE; } /* * Identify an object in the inventory (or on the floor) * This routine does *not* automatically combine objects. * Returns TRUE if something was identified, else FALSE. */ bool ident_spell(void) { int item; object_type *o_ptr; const char *q, *s; /* Only un-id'ed items */ item_tester_hook = item_tester_unknown; /* Get an item */ q = "Identify which item? "; s = "You have nothing to identify."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Identify the object */ do_ident_item(item, o_ptr); /* Something happened */ return (TRUE); } /* * Hook for "get_item()". Determine if something is rechargable. */ static bool item_tester_hook_recharge(const object_type *o_ptr) { /* Recharge staves */ if (o_ptr->tval == TV_STAFF) return (TRUE); /* Recharge wands */ if (o_ptr->tval == TV_WAND) return (TRUE); /* Nope */ return (FALSE); } /* * Recharge a wand or staff from the pack or on the floor. * * It is harder to recharge high level, and highly charged wands. * * XXX XXX XXX Beware of "sliding index errors". * * Should probably not "destroy" over-charged items, unless we * "replace" them by, say, a broken stick or some such. The only * reason this is okay is because "scrolls of recharging" appear * BEFORE all staves/wands in the inventory. Note that the * new "auto_sort_pack" option would correctly handle replacing * the "broken" wand with any other item (i.e. a broken stick). */ bool recharge(int spell_strength) { int i, t, item, lev; object_type *o_ptr; const char *q, *s; /* Only accept legal items */ item_tester_hook = item_tester_hook_recharge; /* Get an item */ q = "Recharge which item? "; s = "You have nothing to recharge."; if (!get_item(&item, q, s, 0, (USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Extract the object "level" */ lev = o_ptr->kind->level; /* * Chance of failure = 1 time in * [Spell_strength + 100 - item_level - 10 * charge_per_item]/15 */ i = (spell_strength + 100 - lev - (10 * (o_ptr->pval[DEFAULT_PVAL] / o_ptr->number))) / 15; /* Back-fire */ if ((i <= 1) || one_in_(i)) { msg("The recharge backfires!"); msg("There is a bright flash of light."); /* Reduce the charges of rods/wands/staves */ reduce_charges(o_ptr, 1); /* Reduce and describe inventory */ if (item >= 0) { inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } /* Reduce and describe floor item */ else { floor_item_increase(0 - item, -1); floor_item_describe(0 - item); floor_item_optimize(0 - item); } } /* Recharge */ else { /* Extract a "power" */ t = (spell_strength / (lev + 2)) + 1; /* Recharge based on the power */ if (t > 0) o_ptr->pval[DEFAULT_PVAL] += 2 + randint1(t); /* We no longer think the item is empty */ o_ptr->ident &= ~(IDENT_EMPTY); } /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); /* Something was done */ return (TRUE); } /* * Apply a "project()" directly to all viewable monsters * * Note that affected monsters are NOT auto-tracked by this usage. */ bool project_los(int typ, int dam, bool obvious) { int i, x, y; int flg = PROJECT_JUMP | PROJECT_KILL | PROJECT_HIDE; if (obvious) flg |= PROJECT_AWARE; /* Affect all (nearby) monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Require line of sight */ if (!player_has_los_bold(y, x)) continue; /* Jump directly to the target monster */ if (project(-1, 0, y, x, dam, typ, flg)) obvious = TRUE; } /* Result */ return (obvious); } /* * Speed monsters */ bool speed_monsters(void) { return (project_los(GF_OLD_SPEED, 50, FALSE)); } /* * Slow monsters */ bool slow_monsters(void) { return (project_los(GF_OLD_SLOW, 20, FALSE)); } /* * Sleep monsters */ bool sleep_monsters(bool aware) { return (project_los(GF_OLD_SLEEP, p_ptr->lev, aware)); } /* * Confuse monsters */ bool confuse_monsters(bool aware) { return (project_los(GF_OLD_CONF, p_ptr->lev, aware)); } /* * Banish evil monsters */ bool banish_evil(int dist) { return (project_los(GF_AWAY_EVIL, dist, FALSE)); } /* * Turn undead */ bool turn_undead(bool aware) { return (project_los(GF_TURN_UNDEAD, p_ptr->lev, aware)); } /* * Dispel undead monsters */ bool dispel_undead(int dam) { return (project_los(GF_DISP_UNDEAD, dam, FALSE)); } /* * Dispel evil monsters */ bool dispel_evil(int dam) { return (project_los(GF_DISP_EVIL, dam, FALSE)); } /* * Dispel all monsters */ bool dispel_monsters(int dam) { return (project_los(GF_DISP_ALL, dam, FALSE)); } /* * Wake up all monsters, and speed up "los" monsters. */ void aggravate_monsters(int who) { int i; bool sleep = FALSE; bool speed = FALSE; /* Aggravate everyone nearby */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Skip aggravating monster (or player) */ if (i == who) continue; /* Wake up nearby sleeping monsters */ if (m_ptr->cdis < MAX_SIGHT * 2) { /* Wake up */ if (m_ptr->m_timed[MON_TMD_SLEEP]) { /* Wake up */ mon_clear_timed(i, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); sleep = TRUE; } } /* Speed up monsters in line of sight */ if (player_has_los_bold(m_ptr->fy, m_ptr->fx)) mon_inc_timed(i, MON_TMD_FAST, 25, MON_TMD_FLG_NOTIFY, FALSE); } /* Messages */ if (speed) msg("You feel a sudden stirring nearby!"); else if (sleep) msg("You hear a sudden stirring in the distance!"); } /* * Delete all non-unique monsters of a given "type" from the level */ bool banishment(void) { int i; unsigned dam = 0; struct keypress typ; if (!get_com("Choose a monster race (by symbol) to banish: ", &typ)) return FALSE; /* Delete the monsters of that "type" */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Hack -- Skip Unique Monsters */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Skip "wrong" monsters */ if (r_ptr->d_char != (char)typ.code) continue; /* Delete the monster */ delete_monster_idx(i); /* Take some damage */ dam += randint1(4); } /* Hurt the player */ take_hit(p_ptr, dam, "the strain of casting Banishment"); /* Update monster list window */ p_ptr->redraw |= PR_MONLIST; /* Success */ return TRUE; } /* * Delete all nearby (non-unique) monsters */ bool mass_banishment(void) { int i; unsigned dam = 0; bool result = FALSE; /* Delete the (nearby) monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Hack -- Skip unique monsters */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Skip distant monsters */ if (m_ptr->cdis > MAX_SIGHT) continue; /* Delete the monster */ delete_monster_idx(i); /* Take some damage */ dam += randint1(3); } /* Hurt the player */ take_hit(p_ptr, dam, "the strain of casting Mass Banishment"); /* Calculate result */ result = (dam > 0) ? TRUE : FALSE; /* Update monster list window */ if (result) p_ptr->redraw |= PR_MONLIST; return (result); } /* * Probe nearby monsters */ bool probing(void) { int i; bool probe = FALSE; /* Probe all (nearby) monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Require line of sight */ if (!player_has_los_bold(m_ptr->fy, m_ptr->fx)) continue; /* Probe visible monsters */ if (m_ptr->ml) { char m_name[80]; /* Start the message */ if (!probe) msg("Probing..."); /* Get "the monster" or "something" */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_IND1); /* Describe the monster */ msg("%^s has %d hit points.", m_name, m_ptr->hp); /* Learn all of the non-spell, non-treasure flags */ lore_do_probe(i); /* Probe worked */ probe = TRUE; } } /* Done */ if (probe) { msg("That's all."); } /* Result */ return (probe); } /* * The spell of destruction * * This spell "deletes" monsters (instead of "killing" them). * * Later we may use one function for both "destruction" and * "earthquake" by using the "full" to select "destruction". */ void destroy_area(int y1, int x1, int r, bool full) { int y, x, k, t; bool flag = FALSE; /* Unused parameter */ (void)full; /* No effect in town */ if (!p_ptr->depth) { msg("The ground shakes for a moment."); return; } /* Big area of affect */ for (y = (y1 - r); y <= (y1 + r); y++) { for (x = (x1 - r); x <= (x1 + r); x++) { /* Skip illegal grids */ if (!in_bounds_fully(y, x)) continue; /* Extract the distance */ k = distance(y1, x1, y, x); /* Stay in the circle of death */ if (k > r) continue; /* Lose room and vault */ cave->info[y][x] &= ~(CAVE_ROOM | CAVE_ICKY); /* Lose light and knowledge */ cave->info[y][x] &= ~(CAVE_GLOW | CAVE_MARK); cave_light_spot(cave, y, x); /* Hack -- Notice player affect */ if (cave->m_idx[y][x] < 0) { /* Hurt the player later */ flag = TRUE; /* Do not hurt this grid */ continue; } /* Hack -- Skip the epicenter */ if ((y == y1) && (x == x1)) continue; /* Delete the monster (if any) */ delete_monster(y, x); /* Destroy any grid that isn't a permament wall */ if (!cave_isperm(cave, y, x)) { int feat = FEAT_FLOOR; /* Delete objects */ delete_object(y, x); /* Wall (or floor) type */ t = randint0(200); /* Granite */ if (t < 20) { /* Create granite wall */ feat = FEAT_WALL_EXTRA; } /* Quartz */ else if (t < 70) { /* Create quartz vein */ feat = FEAT_QUARTZ; } /* Magma */ else if (t < 100) { /* Create magma vein */ feat = FEAT_MAGMA; } /* Change the feature */ cave_set_feat(cave, y, x, feat); } } } /* Hack -- Affect player */ if (flag) { /* Message */ msg("There is a searing blast of light!"); /* Blind the player */ wieldeds_notice_flag(p_ptr, OF_RES_LIGHT); if (!check_state(p_ptr, OF_RES_LIGHT, p_ptr->state.flags)) { /* Become blind */ (void)player_inc_timed(p_ptr, TMD_BLIND, 10 + randint1(10), TRUE, TRUE); } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Redraw monster list */ p_ptr->redraw |= (PR_MONLIST | PR_ITEMLIST); } /* * Induce an "earthquake" of the given radius at the given location. * * This will turn some walls into floors and some floors into walls. * * The player will take damage and "jump" into a safe grid if possible, * otherwise, he will "tunnel" through the rubble instantaneously. * * Monsters will take damage, and "jump" into a safe grid if possible, * otherwise they will be "buried" in the rubble, disappearing from * the level in the same way that they do when banished. * * Note that players and monsters (except eaters of walls and passers * through walls) will never occupy the same grid as a wall (or door). */ void earthquake(int cy, int cx, int r) { int py = p_ptr->py; int px = p_ptr->px; int i, t, y, x, yy, xx, dy, dx; int damage = 0; int sn = 0, sy = 0, sx = 0; bool hurt = FALSE; bool map[32][32]; /* No effect in town */ if (!p_ptr->depth) { msg("The ground shakes for a moment."); return; } /* Paranoia -- Enforce maximum range */ if (r > 12) r = 12; /* Clear the "maximal blast" area */ for (y = 0; y < 32; y++) { for (x = 0; x < 32; x++) { map[y][x] = FALSE; } } /* Check around the epicenter */ for (dy = -r; dy <= r; dy++) { for (dx = -r; dx <= r; dx++) { /* Extract the location */ yy = cy + dy; xx = cx + dx; /* Skip illegal grids */ if (!in_bounds_fully(yy, xx)) continue; /* Skip distant grids */ if (distance(cy, cx, yy, xx) > r) continue; /* Lose room and vault */ cave->info[yy][xx] &= ~(CAVE_ROOM | CAVE_ICKY); /* Lose light and knowledge */ cave->info[yy][xx] &= ~(CAVE_GLOW | CAVE_MARK); /* Skip the epicenter */ if (!dx && !dy) continue; /* Skip most grids */ if (randint0(100) < 85) continue; /* Damage this grid */ map[16+yy-cy][16+xx-cx] = TRUE; /* Hack -- Take note of player damage */ if ((yy == py) && (xx == px)) hurt = TRUE; } } /* First, affect the player (if necessary) */ if (hurt) { /* Check around the player */ for (i = 0; i < 8; i++) { /* Get the location */ y = py + ddy_ddd[i]; x = px + ddx_ddd[i]; /* Skip non-empty grids */ if (!cave_empty_bold(y, x)) continue; /* Important -- Skip "quake" grids */ if (map[16+y-cy][16+x-cx]) continue; /* Count "safe" grids, apply the randomizer */ if ((++sn > 1) && (randint0(sn) != 0)) continue; /* Save the safe location */ sy = y; sx = x; } /* Random message */ switch (randint1(3)) { case 1: { msg("The cave ceiling collapses!"); break; } case 2: { msg("The cave floor twists in an unnatural way!"); break; } default: { msg("The cave quakes!"); msg("You are pummeled with debris!"); break; } } /* Hurt the player a lot */ if (!sn) { /* Message and damage */ msg("You are severely crushed!"); damage = 300; } /* Destroy the grid, and push the player to safety */ else { /* Calculate results */ switch (randint1(3)) { case 1: { msg("You nimbly dodge the blast!"); damage = 0; break; } case 2: { msg("You are bashed by rubble!"); damage = damroll(10, 4); (void)player_inc_timed(p_ptr, TMD_STUN, randint1(50), TRUE, TRUE); break; } case 3: { msg("You are crushed between the floor and ceiling!"); damage = damroll(10, 4); (void)player_inc_timed(p_ptr, TMD_STUN, randint1(50), TRUE, TRUE); break; } } /* Move player */ monster_swap(py, px, sy, sx); } /* Take some damage */ if (damage) take_hit(p_ptr, damage, "an earthquake"); } /* Examine the quaked region */ for (dy = -r; dy <= r; dy++) { for (dx = -r; dx <= r; dx++) { /* Extract the location */ yy = cy + dy; xx = cx + dx; /* Skip unaffected grids */ if (!map[16+yy-cy][16+xx-cx]) continue; /* Process monsters */ if (cave->m_idx[yy][xx] > 0) { monster_type *m_ptr = cave_monster(cave, cave->m_idx[yy][xx]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Most monsters cannot co-exist with rock */ if (!flags_test(r_ptr->flags, RF_SIZE, RF_KILL_WALL, RF_PASS_WALL, FLAG_END)) { char m_name[80]; /* Assume not safe */ sn = 0; /* Monster can move to escape the wall */ if (!rf_has(r_ptr->flags, RF_NEVER_MOVE)) { /* Look for safety */ for (i = 0; i < 8; i++) { /* Get the grid */ y = yy + ddy_ddd[i]; x = xx + ddx_ddd[i]; /* Skip non-empty grids */ if (!cave_empty_bold(y, x)) continue; /* Hack -- no safety on glyph of warding */ if (cave->feat[y][x] == FEAT_GLYPH) continue; /* Important -- Skip "quake" grids */ if (map[16+y-cy][16+x-cx]) continue; /* Count "safe" grids, apply the randomizer */ if ((++sn > 1) && (randint0(sn) != 0)) continue; /* Save the safe grid */ sy = y; sx = x; } } /* Describe the monster */ monster_desc(m_name, sizeof(m_name), m_ptr, 0); /* Scream in pain */ msg("%^s wails out in pain!", m_name); /* Take damage from the quake */ damage = (sn ? damroll(4, 8) : (m_ptr->hp + 1)); /* Monster is certainly awake */ mon_clear_timed(cave->m_idx[yy][xx], MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); /* If the quake finished the monster off, show message */ if (m_ptr->hp < damage && m_ptr->hp >= 0) msg("%^s is embedded in the rock!", m_name); /* Apply damage directly */ m_ptr->hp -= damage; /* Delete (not kill) "dead" monsters */ if (m_ptr->hp < 0) { /* Delete the monster */ delete_monster(yy, xx); /* No longer safe */ sn = 0; } /* Hack -- Escape from the rock */ if (sn) { /* Move the monster */ monster_swap(yy, xx, sy, sx); } } } } } /* XXX XXX XXX */ /* New location */ py = p_ptr->py; px = p_ptr->px; /* Important -- no wall on player */ map[16+py-cy][16+px-cx] = FALSE; /* Examine the quaked region */ for (dy = -r; dy <= r; dy++) { for (dx = -r; dx <= r; dx++) { /* Extract the location */ yy = cy + dy; xx = cx + dx; /* ignore invalid grids */ if (!in_bounds_fully(yy, xx)) continue; /* Note unaffected grids for light changes, etc. */ if (!map[16+yy-cy][16+xx-cx]) { cave_light_spot(cave, yy, xx); } /* Destroy location (if valid) */ else if (cave_valid_bold(yy, xx)) { int feat = FEAT_FLOOR; bool floor = cave_floor_bold(yy, xx); /* Delete objects */ delete_object(yy, xx); /* Wall (or floor) type */ t = (floor ? randint0(100) : 200); /* Granite */ if (t < 20) { /* Create granite wall */ feat = FEAT_WALL_EXTRA; } /* Quartz */ else if (t < 70) { /* Create quartz vein */ feat = FEAT_QUARTZ; } /* Magma */ else if (t < 100) { /* Create magma vein */ feat = FEAT_MAGMA; } /* Change the feature */ cave_set_feat(cave, yy, xx, feat); } } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Update the health bar */ p_ptr->redraw |= (PR_HEALTH); /* Window stuff */ p_ptr->redraw |= (PR_MONLIST | PR_ITEMLIST); } /* * This routine will Perma-Light all grids in the set passed in. * * This routine is used (only) by "light_room(..., LIGHT)" * * Dark grids are illuminated. * * Also, process all affected monsters. * * SMART monsters always wake up when illuminated * NORMAL monsters wake up 1/4 the time when illuminated * STUPID monsters wake up 1/10 the time when illuminated */ static void cave_light(struct point_set *ps) { int i; /* Apply flag changes */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* No longer in the array */ cave->info[y][x] &= ~(CAVE_TEMP); /* Perma-Light */ cave->info[y][x] |= (CAVE_GLOW); } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Update stuff */ update_stuff(p_ptr); /* Process the grids */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* Redraw the grid */ cave_light_spot(cave, y, x); /* Process affected monsters */ if (cave->m_idx[y][x] > 0) { int chance = 25; monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Stupid monsters rarely wake up */ if (rf_has(r_ptr->flags, RF_STUPID)) chance = 10; /* Smart monsters always wake up */ if (rf_has(r_ptr->flags, RF_SMART)) chance = 100; /* Sometimes monsters wake up */ if (m_ptr->m_timed[MON_TMD_SLEEP] && (randint0(100) < chance)) { /* Wake up! */ mon_clear_timed(cave->m_idx[y][x], MON_TMD_SLEEP, MON_TMD_FLG_NOTIFY, FALSE); } } } } /* * This routine will "darken" all grids in the set passed in. * * In addition, some of these grids will be "unmarked". * * This routine is used (only) by "light_room(..., UNLIGHT)" */ static void cave_unlight(struct point_set *ps) { int i; /* Apply flag changes */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* No longer in the array */ cave->info[y][x] &= ~(CAVE_TEMP); /* Darken the grid */ cave->info[y][x] &= ~(CAVE_GLOW); /* Hack -- Forget "boring" grids */ if (cave->feat[y][x] <= FEAT_INVIS) { /* Forget the grid */ cave->info[y][x] &= ~(CAVE_MARK); } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Update stuff */ update_stuff(p_ptr); /* Process the grids */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* Redraw the grid */ cave_light_spot(cave, y, x); } } /* * Aux function -- see below */ static void cave_room_aux(struct point_set *seen, int y, int x) { /* Avoid infinite recursion */ if (cave->info[y][x] & (CAVE_TEMP)) return; /* Do not "leave" the current room */ if (!(cave->info[y][x] & (CAVE_ROOM))) return; /* Mark the grid as "seen" */ cave->info[y][x] |= (CAVE_TEMP); /* Add it to the "seen" set */ add_to_point_set(seen, y, x); } #define LIGHT TRUE #define UNLIGHT FALSE /* * Illuminate or darken any room containing the given location. */ static void light_room(int y1, int x1, bool light) { int i, x, y; struct point_set *ps; ps = point_set_new(200); /* Add the initial grid */ cave_room_aux(ps, y1, x1); /* While grids are in the queue, add their neighbors */ for (i = 0; i < ps->n; i++) { x = ps->pts[i].x, y = ps->pts[i].y; /* Walls get lit, but stop light */ if (!cave_floor_bold(y, x)) continue; /* Spread adjacent */ cave_room_aux(ps, y + 1, x); cave_room_aux(ps, y - 1, x); cave_room_aux(ps, y, x + 1); cave_room_aux(ps, y, x - 1); /* Spread diagonal */ cave_room_aux(ps, y + 1, x + 1); cave_room_aux(ps, y - 1, x - 1); cave_room_aux(ps, y - 1, x + 1); cave_room_aux(ps, y + 1, x - 1); } /* Now, lighten or darken them all at once */ if (light) { cave_light(ps); } else { cave_unlight(ps); } point_set_dispose(ps); } /* * Hack -- call light around the player * Affect all monsters in the projection radius */ bool light_area(int dam, int rad) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_KILL; /* Hack -- Message */ if (!p_ptr->timed[TMD_BLIND]) msg("You are surrounded by a white light."); /* Hook into the "project()" function */ (void)project(-1, rad, py, px, dam, GF_LIGHT_WEAK, flg); /* Light up the room */ light_room(py, px, LIGHT); /* Assume seen */ return (TRUE); } /* * Hack -- call darkness around the player * Affect all monsters in the projection radius */ bool unlight_area(int dam, int rad) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_KILL; /* Hack -- Message */ if (!p_ptr->timed[TMD_BLIND]) { msg("Darkness surrounds you."); } /* Hook into the "project()" function */ (void)project(-1, rad, py, px, dam, GF_DARK_WEAK, flg); /* Darken the room */ light_room(py, px, UNLIGHT); /* Assume seen */ return (TRUE); } /* * Cast a ball spell * Stop if we hit a monster, act as a "ball" * Allow "target" mode to pass over monsters * Affect grids, objects, and monsters */ bool fire_ball(int typ, int dir, int dam, int rad) { int py = p_ptr->py; int px = p_ptr->px; s16b ty, tx; int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; /* Use the given direction */ ty = py + 99 * ddy[dir]; tx = px + 99 * ddx[dir]; /* Hack -- Use an actual "target" */ if ((dir == 5) && target_okay()) { flg &= ~(PROJECT_STOP); target_get(&tx, &ty); } /* Analyze the "dir" and the "target". Hurt items on floor. */ return (project(-1, rad, ty, tx, dam, typ, flg)); } /* * Cast multiple non-jumping ball spells at the same target. * * Targets absolute coordinates instead of a specific monster, so that * the death of the monster doesn't change the target's location. */ bool fire_swarm(int num, int typ, int dir, int dam, int rad) { bool noticed = FALSE; int py = p_ptr->py; int px = p_ptr->px; s16b ty, tx; int flg = PROJECT_THRU | PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; /* Use the given direction */ ty = py + 99 * ddy[dir]; tx = px + 99 * ddx[dir]; /* Hack -- Use an actual "target" (early detonation) */ if ((dir == 5) && target_okay()) target_get(&tx, &ty); while (num--) { /* Analyze the "dir" and the "target". Hurt items on floor. */ if (project(-1, rad, ty, tx, dam, typ, flg)) noticed = TRUE; } return noticed; } /* * Hack -- apply a "projection()" in a direction (or at the target) */ static bool project_hook(int typ, int dir, int dam, int flg) { int py = p_ptr->py; int px = p_ptr->px; s16b ty, tx; /* Pass through the target if needed */ flg |= (PROJECT_THRU); /* Use the given direction */ ty = py + ddy[dir]; tx = px + ddx[dir]; /* Hack -- Use an actual "target" */ if ((dir == 5) && target_okay()) target_get(&tx, &ty); /* Analyze the "dir" and the "target", do NOT explode */ return (project(-1, 0, ty, tx, dam, typ, flg)); } /* * Cast a bolt spell * Stop if we hit a monster, as a "bolt" * Affect monsters (not grids or objects) */ bool fire_bolt(int typ, int dir, int dam) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(typ, dir, dam, flg)); } /* * Cast a beam spell * Pass through monsters, as a "beam" * Affect monsters (not grids or objects) */ bool fire_beam(int typ, int dir, int dam) { int flg = PROJECT_BEAM | PROJECT_KILL; return (project_hook(typ, dir, dam, flg)); } /* * Cast a bolt spell, or rarely, a beam spell */ bool fire_bolt_or_beam(int prob, int typ, int dir, int dam) { if (randint0(100) < prob) { return (fire_beam(typ, dir, dam)); } else { return (fire_bolt(typ, dir, dam)); } } /* * Some of the old functions */ bool light_line(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL; return (project_hook(GF_LIGHT_WEAK, dir, damroll(6, 8), flg)); } bool strong_light_line(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL; return (project_hook(GF_LIGHT, dir, damroll(10, 8), flg)); } bool drain_life(int dir, int dam) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_DRAIN, dir, dam, flg)); } bool wall_to_mud(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; return (project_hook(GF_KILL_WALL, dir, 20 + randint1(30), flg)); } bool destroy_door(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; return (project_hook(GF_KILL_DOOR, dir, 0, flg)); } bool disarm_trap(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; return (project_hook(GF_KILL_TRAP, dir, 0, flg)); } bool heal_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_HEAL, dir, damroll(4, 6), flg)); } bool speed_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_SPEED, dir, 100, flg)); } bool slow_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_SLOW, dir, 20, flg)); } bool sleep_monster(int dir, bool aware) { int flg = PROJECT_STOP | PROJECT_KILL; if (aware) flg |= PROJECT_AWARE; return (project_hook(GF_OLD_SLEEP, dir, p_ptr->lev, flg)); } bool confuse_monster(int dir, int plev, bool aware) { int flg = PROJECT_STOP | PROJECT_KILL; if (aware) flg |= PROJECT_AWARE; return (project_hook(GF_OLD_CONF, dir, plev, flg)); } bool poly_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_POLY, dir, p_ptr->lev, flg)); } bool clone_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_CLONE, dir, 0, flg)); } bool fear_monster(int dir, int plev, bool aware) { int flg = PROJECT_STOP | PROJECT_KILL; if (aware) flg |= PROJECT_AWARE; return (project_hook(GF_TURN_ALL, dir, plev, flg)); } bool teleport_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_AWAY_ALL, dir, MAX_SIGHT * 5, flg)); } /* * Hooks -- affect adjacent grids (radius 1 ball attack) */ bool door_creation(void) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(-1, 1, py, px, 0, GF_MAKE_DOOR, flg)); } bool trap_creation(void) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(-1, 1, py, px, 0, GF_MAKE_TRAP, flg)); } bool destroy_doors_touch(void) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(-1, 1, py, px, 0, GF_KILL_DOOR, flg)); } bool sleep_monsters_touch(bool aware) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_KILL | PROJECT_HIDE; if (aware) flg |= PROJECT_AWARE; return (project(-1, 1, py, px, p_ptr->lev, GF_OLD_SLEEP, flg)); } /* * Curse the players armor */ bool curse_armor(void) { object_type *o_ptr; char o_name[80]; /* Curse the body armor */ o_ptr = &p_ptr->inventory[INVEN_BODY]; /* Nothing to curse */ if (!o_ptr->kind) return (FALSE); /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL); /* Attempt a saving throw for artifacts */ if (o_ptr->artifact && (randint0(100) < 50)) { /* Cool */ msg("A %s tries to %s, but your %s resists the effects!", "terrible black aura", "surround your armor", o_name); } /* not artifact or failed save... */ else { /* Oops */ msg("A terrible black aura blasts your %s!", o_name); /* Take down bonus a wee bit */ o_ptr->to_a -= randint1(3); /* Curse it */ flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, FLAG_END); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana */ p_ptr->update |= (PU_MANA); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } return (TRUE); } /* * Curse the players weapon */ bool curse_weapon(void) { object_type *o_ptr; char o_name[80]; /* Curse the weapon */ o_ptr = &p_ptr->inventory[INVEN_WIELD]; /* Nothing to curse */ if (!o_ptr->kind) return (FALSE); /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL); /* Attempt a saving throw */ if (o_ptr->artifact && (randint0(100) < 50)) { /* Cool */ msg("A %s tries to %s, but your %s resists the effects!", "terrible black aura", "surround your weapon", o_name); } /* not artifact or failed save... */ else { /* Oops */ msg("A terrible black aura blasts your %s!", o_name); /* Hurt it a bit */ o_ptr->to_h = 0 - randint1(3); o_ptr->to_d = 0 - randint1(3); /* Curse it */ flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, FLAG_END); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana */ p_ptr->update |= (PU_MANA); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Notice */ return (TRUE); } /* * Brand weapons (or ammo) * * Turns the (non-magical) object into an ego-item of 'brand_type'. */ void brand_object(object_type *o_ptr, int brand_type) { int i, j; ego_item_type *e_ptr; bool ok = FALSE; /* you can never modify artifacts / ego-items */ /* you can never modify cursed / worthless items */ if (o_ptr->kind && !cursed_p(o_ptr->flags) && o_ptr->kind->cost && !o_ptr->artifact && !o_ptr->ego) { char o_name[80]; bitflag f[OF_SIZE]; const char *brand[SL_MAX]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); of_wipe(f); of_on(f, brand_type); i = list_slays(f, f, NULL, brand, NULL, FALSE); /* Describe */ msg("The %s %s surrounded with an aura of %s.", o_name, (o_ptr->number > 1) ? "are" : "is", brand[0]); /* Get the right ego type for the object - the first one * with the correct flag for this type of object - we assume * that anyone adding new ego types adds them after the * existing ones */ for (i = 0; i < z_info->e_max; i++) { e_ptr = &e_info[i]; if (of_has(e_ptr->flags, brand_type)) { for (j = 0; j < EGO_TVALS_MAX; j++) if ((o_ptr->tval == e_ptr->tval[j]) && (o_ptr->sval >= e_ptr->min_sval[j]) && (o_ptr->sval <= e_ptr->max_sval[j])) ok = TRUE; } if (ok) break; } o_ptr->ego = &e_info[i]; ego_apply_magic(o_ptr, 0); object_notice_ego(o_ptr); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Enchant */ enchant(o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); } else { flush(); msg("The branding failed."); } } /* * Brand the current weapon */ void brand_weapon(void) { object_type *o_ptr; bitflag f[OF_SIZE]; const struct slay *s_ptr; o_ptr = &p_ptr->inventory[INVEN_WIELD]; /* Select a brand */ flags_init(f, OF_SIZE, OF_BRAND_FIRE, OF_BRAND_COLD, FLAG_END); s_ptr = random_slay(f); /* Brand the weapon */ brand_object(o_ptr, s_ptr->object_flag); } /* * Hook to specify "ammo" */ static bool item_tester_hook_ammo(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_BOLT: case TV_ARROW: case TV_SHOT: { return (TRUE); } } return (FALSE); } /* * Brand some (non-magical) ammo */ bool brand_ammo(void) { int item; object_type *o_ptr; const char *q, *s; const struct slay *s_ptr; bitflag f[OF_SIZE]; /* Only accept ammo */ item_tester_hook = item_tester_hook_ammo; /* Get an item */ q = "Brand which kind of ammunition? "; s = "You have nothing to brand."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Select the brand */ flags_init(f, OF_SIZE, OF_BRAND_FIRE, OF_BRAND_COLD, OF_BRAND_POIS, FLAG_END); s_ptr = random_slay(f); /* Brand the ammo */ brand_object(o_ptr, s_ptr->object_flag); /* Done */ return (TRUE); } /* * Enchant some (non-magical) bolts */ bool brand_bolts(void) { int item; object_type *o_ptr; const char *q, *s; /* Restrict choices to bolts */ item_tester_tval = TV_BOLT; /* Get an item */ q = "Brand which bolts? "; s = "You have no bolts to brand."; if (!get_item(&item, q, s, 0, (USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Brand the bolts */ brand_object(o_ptr, OF_BRAND_FIRE); /* Done */ return (TRUE); } /* * Hack -- activate the ring of power */ void ring_of_power(int dir) { /* Pick a random effect */ switch (randint1(10)) { case 1: case 2: { /* Message */ msg("You are surrounded by a malignant aura."); /* Decrease all stats (permanently) */ player_stat_dec(p_ptr, A_STR, TRUE); player_stat_dec(p_ptr, A_INT, TRUE); player_stat_dec(p_ptr, A_WIS, TRUE); player_stat_dec(p_ptr, A_DEX, TRUE); player_stat_dec(p_ptr, A_CON, TRUE); player_stat_dec(p_ptr, A_CHR, TRUE); /* Lose some experience (permanently) */ player_exp_lose(p_ptr, p_ptr->exp / 4, TRUE); break; } case 3: { /* Message */ msg("You are surrounded by a powerful aura."); /* Dispel monsters */ dispel_monsters(1000); break; } case 4: case 5: case 6: { /* Mana Ball */ fire_ball(GF_MANA, dir, 300, 3); break; } case 7: case 8: case 9: case 10: { /* Mana Bolt */ fire_bolt(GF_MANA, dir, 250); break; } } } /* * Identify an item. * * `item` is used to print the slot occupied by an object in equip/inven. * Any negative value assigned to "item" can be used for specifying an object * on the floor. */ void do_ident_item(int item, object_type *o_ptr) { char o_name[80]; u32b msg_type = 0; int i; bool bad = TRUE; /* Identify it */ object_flavor_aware(o_ptr); object_notice_everything(o_ptr); /* Apply an autoinscription, if necessary */ apply_autoinscription(o_ptr); /* Set squelch flag */ p_ptr->notice |= PN_SQUELCH; /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Determine the message type. */ /* CC: we need to think more carefully about how we define "bad" with * multiple pvals - currently using "all nonzero pvals < 0" */ for (i = 0; i < o_ptr->num_pvals; i++) if (o_ptr->pval[i] > 0) bad = FALSE; if (bad) msg_type = MSG_IDENT_BAD; else if (o_ptr->artifact) msg_type = MSG_IDENT_ART; else if (o_ptr->ego) msg_type = MSG_IDENT_EGO; else msg_type = MSG_GENERIC; /* Log artifacts to the history list. */ if (o_ptr->artifact) history_add_artifact(o_ptr->artifact, TRUE, TRUE); /* Describe */ if (item >= INVEN_WIELD) { msgt(msg_type, "%^s: %s (%c).", describe_use(item), o_name, index_to_label(item)); } else if (item >= 0) { msgt(msg_type, "In your pack: %s (%c).", o_name, index_to_label(item)); } else { msgt(msg_type, "On the ground: %s.", o_name); } } angband-v3.3.2/src/z-quark.h0000644000175000017500000000067411651552410015150 0ustar chriscchrisc#ifndef INCLUDED_Z_QUARK_H #define INCLUDED_Z_QUARK_H #include "h-basic.h" /* Quark type */ typedef size_t quark_t; /* Return a quark for the string 'str' */ quark_t quark_add(const char *str); /* Return the string corresponding to the quark */ const char *quark_str(quark_t q); /* Initialise the quarks package */ errr quarks_init(void); /* De-initialise the quarks package */ errr quarks_free(void); #endif /* !INCLUDED_Z_QUARK_H */ angband-v3.3.2/src/spells1.c0000644000175000017500000022321111651552410015126 0ustar chriscchrisc/* * File: spells1.c * Purpose: Some spell effects, and the project() function * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "generate.h" #include "object/tvalsval.h" #include "object/object.h" #include "monster/mon-make.h" #include "monster/mon-msg.h" #include "monster/mon-spell.h" #include "monster/mon-timed.h" #include "monster/mon-util.h" #include "squelch.h" #include "trap.h" #include "spells.h" /** * Details of the different projectable attack types in the game. * See src/spells.h for structure */ const struct gf_type gf_table[] = { #define GF(a, b, c, d, e, f, g, h, i, j, k, l, m) \ { GF_##a, b, c, d, e, f, g, h, i, j, k, l, m }, #define RV(b, x, y, m) {b, x, y, m} #include "list-gf-types.h" #undef GF #undef RV }; /** * Check for resistance to a GF_ attack type. Return codes: * -1 = vulnerability * 0 = no resistance (or resistance plus vulnerability) * 1 = single resistance or opposition (or double resist plus vulnerability) * 2 = double resistance (including opposition) * 3 = total immunity * * \param type is the attack type we are trying to resist * \param flags is the set of flags we're checking * \param real is whether this is a real attack */ int check_for_resist(struct player *p, int type, bitflag *flags, bool real) { const struct gf_type *gf_ptr = &gf_table[type]; int result = 0; if (gf_ptr->vuln && of_has(flags, gf_ptr->vuln)) result--; /* If it's not a real attack, we don't check timed status explicitly */ if (real && gf_ptr->opp && p->timed[gf_ptr->opp]) result++; if (gf_ptr->resist && of_has(flags, gf_ptr->resist)) result++; if (gf_ptr->immunity && of_has(flags, gf_ptr->immunity)) result = 3; /* Notice flags, if it's a real attack */ if (real && gf_ptr->immunity) wieldeds_notice_flag(p, gf_ptr->immunity); if (real && gf_ptr->resist) wieldeds_notice_flag(p, gf_ptr->resist); if (real && gf_ptr->vuln) wieldeds_notice_flag(p, gf_ptr->vuln); return result; } /** * Check whether the player is immune to side effects of a GF_ type. * * \param type is the GF_ type we are checking. */ bool check_side_immune(int type) { const struct gf_type *gf_ptr = &gf_table[type]; if (gf_ptr->immunity) { if (gf_ptr->side_immune && check_state(p_ptr, gf_ptr->immunity, p_ptr->state.flags)) return TRUE; } else if ((gf_ptr->resist && of_has(p_ptr->state.flags, gf_ptr->resist)) || (gf_ptr->opp && p_ptr->timed[gf_ptr->opp])) return TRUE; return FALSE; } /** * Update monster knowledge of player resists. * * \param m_idx is the monster who is learning * \param type is the GF_ type to which it's learning about the player's * resistance (or lack of) */ void monster_learn_resists(struct monster *m, struct player *p, int type) { const struct gf_type *gf_ptr = &gf_table[type]; update_smart_learn(m, p, gf_ptr->resist); update_smart_learn(m, p, gf_ptr->immunity); update_smart_learn(m, p, gf_ptr->vuln); return; } /* * Helper function -- return a "nearby" race for polymorphing * * Note that this function is one of the more "dangerous" ones... */ s16b poly_r_idx(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; int i, r, lev1, lev2; /* Paranoia -- Uniques never polymorph */ if (rf_has(r_ptr->flags, RF_UNIQUE)) return (r_idx); /* Allowable range of "levels" for resulting monster */ lev1 = r_ptr->level - ((randint1(20)/randint1(9))+1); lev2 = r_ptr->level + ((randint1(20)/randint1(9))+1); /* Pick a (possibly new) non-unique race */ for (i = 0; i < 1000; i++) { /* Pick a new race, using a level calculation */ r = get_mon_num((p_ptr->depth + r_ptr->level) / 2 + 5); /* Handle failure */ if (!r) break; /* Obtain race */ r_ptr = &r_info[r]; /* Ignore unique monsters */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Ignore monsters with incompatible levels */ if ((r_ptr->level < lev1) || (r_ptr->level > lev2)) continue; /* Use that index */ r_idx = r; /* Done */ break; } /* Result */ return (r_idx); } /* * Teleport a monster, normally up to "dis" grids away. * * Attempt to move the monster at least "dis/2" grids away. * * But allow variation to prevent infinite loops. */ void teleport_away(struct monster *m_ptr, int dis) { int ny = 0, nx = 0, oy, ox, d, i, min; bool look = TRUE; /* Paranoia */ if (!m_ptr->r_idx) return; /* Save the old location */ oy = m_ptr->fy; ox = m_ptr->fx; /* Minimum distance */ min = dis / 2; /* Look until done */ while (look) { /* Verify max distance */ if (dis > 200) dis = 200; /* Try several locations */ for (i = 0; i < 500; i++) { /* Pick a (possibly illegal) location */ while (1) { ny = rand_spread(oy, dis); nx = rand_spread(ox, dis); d = distance(oy, ox, ny, nx); if ((d >= min) && (d <= dis)) break; } /* Ignore illegal locations */ if (!in_bounds_fully(ny, nx)) continue; /* Require "empty" floor space */ if (!cave_empty_bold(ny, nx)) continue; /* Hack -- no teleport onto glyph of warding */ if (cave->feat[ny][nx] == FEAT_GLYPH) continue; /* No teleporting into vaults and such */ /* if (cave->info[ny][nx] & (CAVE_ICKY)) continue; */ /* This grid looks good */ look = FALSE; /* Stop looking */ break; } /* Increase the maximum distance */ dis = dis * 2; /* Decrease the minimum distance */ min = min / 2; } /* Sound */ sound(MSG_TPOTHER); /* Swap the monsters */ monster_swap(oy, ox, ny, nx); } /* * Teleport the player to a location up to "dis" grids away. * * If no such spaces are readily available, the distance may increase. * Try very hard to move the player at least a quarter that distance. */ void teleport_player(int dis) { int py = p_ptr->py; int px = p_ptr->px; int d, i, min, y, x; bool look = TRUE; /* Initialize */ y = py; x = px; /* Minimum distance */ min = dis / 2; /* Look until done */ while (look) { /* Verify max distance */ if (dis > 200) dis = 200; /* Try several locations */ for (i = 0; i < 500; i++) { /* Pick a (possibly illegal) location */ while (1) { y = rand_spread(py, dis); x = rand_spread(px, dis); d = distance(py, px, y, x); if ((d >= min) && (d <= dis)) break; } /* Ignore illegal locations */ if (!in_bounds_fully(y, x)) continue; /* Require "naked" floor space */ if (!cave_naked_bold(y, x)) continue; /* No teleporting into vaults and such */ if (cave->info[y][x] & (CAVE_ICKY)) continue; /* This grid looks good */ look = FALSE; /* Stop looking */ break; } /* Increase the maximum distance */ dis = dis * 2; /* Decrease the minimum distance */ min = min / 2; } /* Sound */ sound(MSG_TELEPORT); /* Move player */ monster_swap(py, px, y, x); /* Handle stuff XXX XXX XXX */ handle_stuff(p_ptr); } /* * Teleport player to a grid near the given location * * This function is slightly obsessive about correctness. * This function allows teleporting into vaults (!) */ void teleport_player_to(int ny, int nx) { int py = p_ptr->py; int px = p_ptr->px; int y, x; int dis = 0, ctr = 0; /* Initialize */ y = py; x = px; /* Find a usable location */ while (1) { /* Pick a nearby legal location */ while (1) { y = rand_spread(ny, dis); x = rand_spread(nx, dis); if (in_bounds_fully(y, x)) break; } /* Accept "naked" floor grids */ if (cave_naked_bold(y, x)) break; /* Occasionally advance the distance */ if (++ctr > (4 * dis * dis + 4 * dis + 1)) { ctr = 0; dis++; } } /* Sound */ sound(MSG_TELEPORT); /* Move player */ monster_swap(py, px, y, x); /* Handle stuff XXX XXX XXX */ handle_stuff(p_ptr); } /* * Teleport the player one level up or down (random when legal) */ void teleport_player_level(void) { if (is_quest(p_ptr->depth) || (p_ptr->depth >= MAX_DEPTH-1)) { if (OPT(birth_ironman)) { msg("Nothing happens."); return; } msgt(MSG_TPLEVEL, "You rise up through the ceiling."); /* New depth */ p_ptr->depth--; /* Leaving */ p_ptr->leaving = TRUE; } else if ((!p_ptr->depth) || (OPT(birth_ironman))) { msgt(MSG_TPLEVEL, "You sink through the floor."); /* New depth */ p_ptr->depth++; /* Leaving */ p_ptr->leaving = TRUE; } else if (randint0(100) < 50) { msgt(MSG_TPLEVEL, "You rise up through the ceiling."); /* New depth */ p_ptr->depth--; /* Leaving */ p_ptr->leaving = TRUE; } else { msgt(MSG_TPLEVEL, "You sink through the floor."); /* New depth */ p_ptr->depth++; /* Leaving */ p_ptr->leaving = TRUE; } } static const char *gf_name_list[] = { #define GF(a, b, c, d, e, f, g, h, i, j, k, l, m) #a, #include "list-gf-types.h" #undef GF NULL }; int gf_name_to_idx(const char *name) { int i; for (i = 0; gf_name_list[i]; i++) { if (!my_stricmp(name, gf_name_list[i])) return i; } return -1; } const char *gf_idx_to_name(int type) { assert(type >= 0); assert(type < GF_MAX); return gf_name_list[type]; } /* * Return a color to use for the bolt/ball spells */ static byte spell_color(int type) { /* Analyze */ switch (type) { case GF_MISSILE: return (TERM_VIOLET); case GF_ACID: return (TERM_SLATE); case GF_ELEC: return (TERM_BLUE); case GF_FIRE: return (TERM_RED); case GF_COLD: return (TERM_WHITE); case GF_POIS: return (TERM_GREEN); case GF_HOLY_ORB: return (TERM_L_DARK); case GF_MANA: return (TERM_L_DARK); case GF_ARROW: return (TERM_WHITE); case GF_WATER: return (TERM_SLATE); case GF_NETHER: return (TERM_L_GREEN); case GF_CHAOS: return (TERM_VIOLET); case GF_DISEN: return (TERM_VIOLET); case GF_NEXUS: return (TERM_L_RED); case GF_CONFU: return (TERM_L_UMBER); case GF_SOUND: return (TERM_YELLOW); case GF_SHARD: return (TERM_UMBER); case GF_FORCE: return (TERM_UMBER); case GF_INERTIA: return (TERM_L_WHITE); case GF_GRAVITY: return (TERM_L_WHITE); case GF_TIME: return (TERM_L_BLUE); case GF_LIGHT_WEAK: return (TERM_ORANGE); case GF_LIGHT: return (TERM_ORANGE); case GF_DARK_WEAK: return (TERM_L_DARK); case GF_DARK: return (TERM_L_DARK); case GF_PLASMA: return (TERM_RED); case GF_METEOR: return (TERM_RED); case GF_ICE: return (TERM_WHITE); } /* Standard "color" */ return (TERM_WHITE); } /* * Find the attr/char pair to use for a spell effect * * It is moving (or has moved) from (x,y) to (nx,ny). * * If the distance is not "one", we (may) return "*". */ static void bolt_pict(int y, int x, int ny, int nx, int typ, byte *a, char *c) { int motion; /* Convert co-ordinates into motion */ if ((ny == y) && (nx == x)) motion = BOLT_NO_MOTION; else if (nx == x) motion = BOLT_0; else if ((ny-y) == (x-nx)) motion = BOLT_45; else if (ny == y) motion = BOLT_90; else if ((ny-y) == (nx-x)) motion = BOLT_135; else motion = BOLT_NO_MOTION; /* Decide on output char */ if (use_graphics == GRAPHICS_NONE || use_graphics == GRAPHICS_PSEUDO) { /* ASCII is simple */ char chars[] = "*|/-\\"; *c = chars[motion]; *a = spell_color(typ); } else { *a = gf_to_attr[typ][motion]; *c = gf_to_char[typ][motion]; } } /* * Decreases players hit points and sets death flag if necessary * * Invulnerability needs to be changed into a "shield" XXX XXX XXX * * Hack -- this function allows the user to save (or quit) the game * when he dies, since the "You die." message is shown before setting * the player to "dead". */ void take_hit(struct player *p, int dam, const char *kb_str) { int old_chp = p->chp; int warning = (p->mhp * op_ptr->hitpoint_warn / 10); /* Paranoia */ if (p->is_dead) return; /* Disturb */ disturb(p, 1, 0); /* Mega-Hack -- Apply "invulnerability" */ if (p->timed[TMD_INVULN] && (dam < 9000)) return; /* Hurt the player */ p->chp -= dam; /* Display the hitpoints */ p->redraw |= (PR_HP); /* Dead player */ if (p->chp < 0) { /* Hack -- Note death */ msgt(MSG_DEATH, "You die."); message_flush(); /* Note cause of death */ my_strcpy(p->died_from, kb_str, sizeof(p->died_from)); /* No longer a winner */ p->total_winner = FALSE; /* Note death */ p->is_dead = TRUE; /* Leaving */ p->leaving = TRUE; /* Dead */ return; } /* Hitpoint warning */ if (p->chp < warning) { /* Hack -- bell on first notice */ if (old_chp > warning) { bell("Low hitpoint warning!"); } /* Message */ msgt(MSG_HITPOINT_WARN, "*** LOW HITPOINT WARNING! ***"); message_flush(); } } /* * Destroys a type of item on a given percent chance. * The chance 'cperc' is in hundredths of a percent (1-in-10000) * Note that missiles are no longer necessarily all destroyed * * Returns number of items destroyed. */ int inven_damage(struct player *p, int type, int cperc) { const struct gf_type *gf_ptr = &gf_table[type]; int i, j, k, amt; object_type *o_ptr; char o_name[80]; bool damage; bitflag f[OF_SIZE]; /* Count the casualties */ k = 0; /* Scan through the slots backwards */ for (i = 0; i < QUIVER_END; i++) { if (i >= INVEN_PACK && i < QUIVER_START) continue; o_ptr = &p->inventory[i]; of_wipe(f); object_flags(o_ptr, f); /* Skip non-objects */ if (!o_ptr->kind) continue; /* Hack -- for now, skip artifacts */ if (o_ptr->artifact) continue; /* Give this item slot a shot at death if it is vulnerable */ if (of_has(f, gf_ptr->obj_hates) && !of_has(f, gf_ptr->obj_imm)) { /* Chance to destroy this item */ int chance = cperc; /* Track if it is damaged instead of destroyed */ damage = FALSE; /** * Analyze the type to see if we just damage it * - we also check for rods to reduce chance */ switch (o_ptr->tval) { /* Weapons */ case TV_BOW: case TV_SWORD: case TV_HAFTED: case TV_POLEARM: case TV_DIGGING: { /* Chance to damage it */ if (randint0(10000) < cperc) { /* Damage the item */ o_ptr->to_h--; o_ptr->to_d--; /* Damaged! */ damage = TRUE; } else continue; break; } /* Wearable items */ case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* Chance to damage it */ if (randint0(10000) < cperc) { /* Damage the item */ o_ptr->to_a--; /* Damaged! */ damage = TRUE; } else continue; break; } /* Rods are tough */ case TV_ROD: { chance = (chance / 4); break; } } /* Damage instead of destroy */ if (damage) { p->update |= (PU_BONUS); p->redraw |= (PR_EQUIP); /* Casualty count */ amt = o_ptr->number; } /* ... or count the casualties */ else for (amt = j = 0; j < o_ptr->number; ++j) { if (randint0(10000) < chance) amt++; } /* Some casualities */ if (amt) { /* Get a description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Message */ msgt(MSG_DESTROY, "%sour %s (%c) %s %s!", ((o_ptr->number > 1) ? ((amt == o_ptr->number) ? "All of y" : (amt > 1 ? "Some of y" : "One of y")) : "Y"), o_name, index_to_label(i), ((amt > 1) ? "were" : "was"), (damage ? "damaged" : "destroyed")); /* Damage already done? */ if (damage) continue; /* Reduce charges if some devices are destroyed */ reduce_charges(o_ptr, amt); /* Destroy "amt" items */ inven_item_increase(i, -amt); inven_item_optimize(i); /* Count the casualties */ k += amt; } } } /* Return the casualty count */ return (k); } /* * Acid has hit the player, attempt to affect some armor. * * Note that the "base armor" of an object never changes. * * If any armor is damaged (or resists), the player takes less damage. */ static int minus_ac(struct player *p) { object_type *o_ptr = NULL; bitflag f[OF_SIZE]; char o_name[80]; /* Avoid crash during monster power calculations */ if (!p->inventory) return FALSE; /* Pick a (possibly empty) inventory slot */ switch (randint1(6)) { case 1: o_ptr = &p->inventory[INVEN_BODY]; break; case 2: o_ptr = &p->inventory[INVEN_ARM]; break; case 3: o_ptr = &p->inventory[INVEN_OUTER]; break; case 4: o_ptr = &p->inventory[INVEN_HANDS]; break; case 5: o_ptr = &p->inventory[INVEN_HEAD]; break; case 6: o_ptr = &p->inventory[INVEN_FEET]; break; default: assert(0); } /* Nothing to damage */ if (!o_ptr->kind) return (FALSE); /* No damage left to be done */ if (o_ptr->ac + o_ptr->to_a <= 0) return (FALSE); /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Extract the flags */ object_flags(o_ptr, f); /* Object resists */ if (of_has(f, OF_IGNORE_ACID)) { msg("Your %s is unaffected!", o_name); return (TRUE); } /* Message */ msg("Your %s is damaged!", o_name); /* Damage the item */ o_ptr->to_a--; p->update |= PU_BONUS; p->redraw |= (PR_EQUIP); /* Item was damaged */ return (TRUE); } /** * Adjust damage according to resistance or vulnerability. * * \param type is the attack type we are checking. * \param dam is the unadjusted damage. * \param dam_aspect is the calc we want (min, avg, max, random). * \param resist is the degree of resistance (-1 = vuln, 3 = immune). */ int adjust_dam(struct player *p, int type, int dam, aspect dam_aspect, int resist) { const struct gf_type *gf_ptr = &gf_table[type]; int i, denom; if (resist == 3) /* immune */ return 0; /* Hack - acid damage is halved by armour, holy orb is halved */ if ((type == GF_ACID && minus_ac(p)) || type == GF_HOLY_ORB) dam = (dam + 1) / 2; if (resist == -1) /* vulnerable */ return (dam * 4 / 3); /* Variable resists vary the denominator, so we need to invert the logic * of dam_aspect. (m_bonus is unused) */ switch (dam_aspect) { case MINIMISE: denom = randcalc(gf_ptr->denom, 0, MAXIMISE); break; case MAXIMISE: denom = randcalc(gf_ptr->denom, 0, MINIMISE); break; default: denom = randcalc(gf_ptr->denom, 0, dam_aspect); } for (i = resist; i > 0; i--) if (denom) dam = dam * gf_ptr->num / denom; return dam; } /* * Restore a stat. Return TRUE only if this actually makes a difference. */ bool res_stat(int stat) { /* Restore if needed */ if (p_ptr->stat_cur[stat] != p_ptr->stat_max[stat]) { /* Restore */ p_ptr->stat_cur[stat] = p_ptr->stat_max[stat]; /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Success */ return (TRUE); } /* Nothing to restore */ return (FALSE); } /* * Apply disenchantment to the player's stuff * * This function is also called from the "melee" code. * * The "mode" is currently unused. * * Return "TRUE" if the player notices anything. */ bool apply_disenchant(int mode) { int t = 0; object_type *o_ptr; char o_name[80]; /* Unused parameter */ (void)mode; /* Pick a random slot */ switch (randint1(8)) { case 1: t = INVEN_WIELD; break; case 2: t = INVEN_BOW; break; case 3: t = INVEN_BODY; break; case 4: t = INVEN_OUTER; break; case 5: t = INVEN_ARM; break; case 6: t = INVEN_HEAD; break; case 7: t = INVEN_HANDS; break; case 8: t = INVEN_FEET; break; } /* Get the item */ o_ptr = &p_ptr->inventory[t]; /* No item, nothing happens */ if (!o_ptr->kind) return (FALSE); /* Nothing to disenchant */ if ((o_ptr->to_h <= 0) && (o_ptr->to_d <= 0) && (o_ptr->to_a <= 0)) { /* Nothing to notice */ return (FALSE); } /* Describe the object */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Artifacts have 60% chance to resist */ if (o_ptr->artifact && (randint0(100) < 60)) { /* Message */ msg("Your %s (%c) resist%s disenchantment!", o_name, index_to_label(t), ((o_ptr->number != 1) ? "" : "s")); /* Notice */ return (TRUE); } /* Disenchant tohit */ if (o_ptr->to_h > 0) o_ptr->to_h--; if ((o_ptr->to_h > 5) && (randint0(100) < 20)) o_ptr->to_h--; /* Disenchant todam */ if (o_ptr->to_d > 0) o_ptr->to_d--; if ((o_ptr->to_d > 5) && (randint0(100) < 20)) o_ptr->to_d--; /* Disenchant toac */ if (o_ptr->to_a > 0) o_ptr->to_a--; if ((o_ptr->to_a > 5) && (randint0(100) < 20)) o_ptr->to_a--; /* Message */ msg("Your %s (%c) %s disenchanted!", o_name, index_to_label(t), ((o_ptr->number != 1) ? "were" : "was")); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Window stuff */ p_ptr->redraw |= (PR_EQUIP); /* Notice */ return (TRUE); } /* * Mega-Hack -- track "affected" monsters (see "project()" comments) */ static int project_m_n; static int project_m_x; static int project_m_y; /* * We are called from "project()" to "damage" terrain features * * We are called both for "beam" effects and "ball" effects. * * The "r" parameter is the "distance from ground zero". * * Note that we determine if the player can "see" anything that happens * by taking into account: blindness, line-of-sight, and illumination. * * We return "TRUE" if the effect of the projection is "obvious". * * Hack -- We also "see" grids which are "memorized". * * Perhaps we should affect doors and/or walls. */ static bool project_f(int who, int r, int y, int x, int dam, int typ, bool obvious) { /* Unused parameters */ (void)who; (void)r; (void)dam; #if 0 /* unused */ /* Reduce damage by distance */ dam = (dam + r) / (r + 1); #endif /* 0 */ /* Analyze the type */ switch (typ) { /* Ignore most effects */ case GF_ACID: case GF_ELEC: case GF_FIRE: case GF_COLD: case GF_PLASMA: case GF_METEOR: case GF_ICE: case GF_SHARD: case GF_FORCE: case GF_SOUND: case GF_MANA: case GF_HOLY_ORB: { break; } /* Destroy Traps (and Locks) */ case GF_KILL_TRAP: { /* Reveal secret doors */ if (cave_issecretdoor(cave, y, x)) { place_closed_door(cave, y, x); /* Check line of sight */ if (player_has_los_bold(y, x)) { obvious = TRUE; } } /* Destroy traps */ if (cave_istrap(cave, y, x)) { /* Check line of sight */ if (player_has_los_bold(y, x)) { msg("There is a bright flash of light!"); obvious = TRUE; } /* Forget the trap */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy the trap */ cave_set_feat(cave, y, x, FEAT_FLOOR); } /* Locked doors are unlocked */ else if ((cave->feat[y][x] >= FEAT_DOOR_HEAD + 0x01) && (cave->feat[y][x] <= FEAT_DOOR_HEAD + 0x07)) { /* Unlock the door */ cave_set_feat(cave, y, x, FEAT_DOOR_HEAD + 0x00); /* Check line of sound */ if (player_has_los_bold(y, x)) { msg("Click!"); obvious = TRUE; } } break; } /* Destroy Doors (and traps) */ case GF_KILL_DOOR: { /* Destroy all doors and traps */ if (cave_istrap(cave, y, x) || cave_isopendoor(cave, y, x) || cave->feat[y][x] == FEAT_BROKEN || cave_isdoor(cave, y, x)) { /* Check line of sight */ if (player_has_los_bold(y, x)) { /* Message */ msg("There is a bright flash of light!"); obvious = TRUE; /* Visibility change */ if ((cave->feat[y][x] >= FEAT_DOOR_HEAD) && (cave->feat[y][x] <= FEAT_DOOR_TAIL)) { /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); } } /* Forget the door */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy the feature */ cave_set_feat(cave, y, x, FEAT_FLOOR); } break; } /* Destroy walls (and doors) */ case GF_KILL_WALL: { /* Non-walls (etc) */ if (cave_floor_bold(y, x)) break; /* Permanent walls */ if (cave->feat[y][x] >= FEAT_PERM_EXTRA) break; /* Granite */ if (cave->feat[y][x] >= FEAT_WALL_EXTRA) { /* Message */ if (cave->info[y][x] & (CAVE_MARK)) { msg("The wall turns into mud!"); obvious = TRUE; } /* Forget the wall */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy the wall */ cave_set_feat(cave, y, x, FEAT_FLOOR); } /* Quartz / Magma with treasure */ else if (cave->feat[y][x] >= FEAT_MAGMA_H) { /* Message */ if (cave->info[y][x] & (CAVE_MARK)) { msg("The vein turns into mud!"); msg("You have found something!"); obvious = TRUE; } /* Forget the wall */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy the wall */ cave_set_feat(cave, y, x, FEAT_FLOOR); /* Place some gold */ place_gold(cave, y, x, p_ptr->depth, ORIGIN_FLOOR); } /* Quartz / Magma */ else if (cave->feat[y][x] >= FEAT_MAGMA) { /* Message */ if (cave->info[y][x] & (CAVE_MARK)) { msg("The vein turns into mud!"); obvious = TRUE; } /* Forget the wall */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy the wall */ cave_set_feat(cave, y, x, FEAT_FLOOR); } /* Rubble */ else if (cave->feat[y][x] == FEAT_RUBBLE) { /* Message */ if (cave->info[y][x] & (CAVE_MARK)) { msg("The rubble turns into mud!"); obvious = TRUE; } /* Forget the wall */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy the rubble */ cave_set_feat(cave, y, x, FEAT_FLOOR); /* Hack -- place an object */ if (randint0(100) < 10){ if (player_can_see_bold(y, x)) { msg("There was something buried in the rubble!"); obvious = TRUE; } place_object(cave, y, x, p_ptr->depth, FALSE, FALSE, ORIGIN_RUBBLE); } } /* Destroy doors (and secret doors) */ else /* if (cave->feat[y][x] >= FEAT_DOOR_HEAD) */ { /* Hack -- special message */ if (cave->info[y][x] & (CAVE_MARK)) { msg("The door turns into mud!"); obvious = TRUE; } /* Forget the wall */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy the feature */ cave_set_feat(cave, y, x, FEAT_FLOOR); } /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); break; } /* Make doors */ case GF_MAKE_DOOR: { /* Require a grid without monsters */ if (cave->m_idx[y][x]) break; /* Require a floor grid */ if (!(cave->feat[y][x] == FEAT_FLOOR)) break; /* Push objects off the grid */ if (cave->o_idx[y][x]) push_object(y,x); /* Create closed door */ cave_set_feat(cave, y, x, FEAT_DOOR_HEAD + 0x00); /* Observe */ if (cave->info[y][x] & (CAVE_MARK)) obvious = TRUE; /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); break; } /* Make traps */ case GF_MAKE_TRAP: { /* Require a "naked" floor grid */ if (!cave_naked_bold(y, x)) break; /* Place a trap */ place_trap(cave, y, x); break; } /* Light up the grid */ case GF_LIGHT_WEAK: case GF_LIGHT: { /* Turn on the light */ cave->info[y][x] |= (CAVE_GLOW); /* Grid is in line of sight */ if (player_has_los_bold(y, x)) { if (!p_ptr->timed[TMD_BLIND]) { /* Observe */ obvious = TRUE; } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); } break; } /* Darken the grid */ case GF_DARK_WEAK: case GF_DARK: { if (p_ptr->depth != 0 || !is_daytime()) { /* Turn off the light */ cave->info[y][x] &= ~(CAVE_GLOW); /* Hack -- Forget "boring" grids */ if (cave->feat[y][x] <= FEAT_INVIS) cave->info[y][x] &= ~(CAVE_MARK); } /* Grid is in line of sight */ if (player_has_los_bold(y, x)) { /* Observe */ obvious = TRUE; /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); } /* All done */ break; } } /* Return "Anything seen?" */ return (obvious); } /* * We are called from "project()" to "damage" objects * * We are called both for "beam" effects and "ball" effects. * * Perhaps we should only SOMETIMES damage things on the ground. * * The "r" parameter is the "distance from ground zero". * * Note that we determine if the player can "see" anything that happens * by taking into account: blindness, line-of-sight, and illumination. * * Hack -- We also "see" objects which are "memorized". * * We return "TRUE" if the effect of the projection is "obvious". */ static bool project_o(int who, int r, int y, int x, int dam, int typ, bool obvious) { s16b this_o_idx, next_o_idx = 0; bitflag f[OF_SIZE]; char o_name[80]; /* Unused parameters */ (void)who; (void)r; (void)dam; #if 0 /* unused */ /* Reduce damage by distance */ dam = (dam + r) / (r + 1); #endif /* 0 */ /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; bool is_art = FALSE; bool ignore = FALSE; bool plural = FALSE; bool do_kill = FALSE; const char *note_kill = NULL; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Extract the flags */ object_flags(o_ptr, f); /* Get the "plural"-ness */ if (o_ptr->number > 1) plural = TRUE; /* Check for artifact */ if (o_ptr->artifact) is_art = TRUE; /* Analyze the type */ switch (typ) { /* Acid -- Lots of things */ case GF_ACID: { if (of_has(f, OF_HATES_ACID)) { do_kill = TRUE; note_kill = (plural ? " melt!" : " melts!"); if (of_has(f, OF_IGNORE_ACID)) ignore = TRUE; } break; } /* Elec -- Rings and Wands */ case GF_ELEC: { if (of_has(f, OF_HATES_ELEC)) { do_kill = TRUE; note_kill = (plural ? " are destroyed!" : " is destroyed!"); if (of_has(f, OF_IGNORE_ELEC)) ignore = TRUE; } break; } /* Fire -- Flammable objects */ case GF_FIRE: { if (of_has(f, OF_HATES_FIRE)) { do_kill = TRUE; note_kill = (plural ? " burn up!" : " burns up!"); if (of_has(f, OF_IGNORE_FIRE)) ignore = TRUE; } break; } /* Cold -- potions and flasks */ case GF_COLD: { if (of_has(f, OF_HATES_COLD)) { note_kill = (plural ? " shatter!" : " shatters!"); do_kill = TRUE; if (of_has(f, OF_IGNORE_COLD)) ignore = TRUE; } break; } /* Fire + Elec */ case GF_PLASMA: { if (of_has(f, OF_HATES_FIRE)) { do_kill = TRUE; note_kill = (plural ? " burn up!" : " burns up!"); if (of_has(f, OF_IGNORE_FIRE)) ignore = TRUE; } if (of_has(f, OF_HATES_ELEC)) { ignore = FALSE; do_kill = TRUE; note_kill = (plural ? " are destroyed!" : " is destroyed!"); if (of_has(f, OF_IGNORE_ELEC)) ignore = TRUE; } break; } /* Fire + Cold */ case GF_METEOR: { if (of_has(f, OF_HATES_FIRE)) { do_kill = TRUE; note_kill = (plural ? " burn up!" : " burns up!"); if (of_has(f, OF_IGNORE_FIRE)) ignore = TRUE; } if (of_has(f, OF_HATES_COLD)) { ignore = FALSE; do_kill = TRUE; note_kill = (plural ? " shatter!" : " shatters!"); if (of_has(f, OF_IGNORE_COLD)) ignore = TRUE; } break; } /* Hack -- break potions and such */ case GF_ICE: case GF_SHARD: case GF_FORCE: case GF_SOUND: { if (of_has(f, OF_HATES_COLD)) { note_kill = (plural ? " shatter!" : " shatters!"); do_kill = TRUE; } break; } /* Mana -- destroys everything */ case GF_MANA: { do_kill = TRUE; note_kill = (plural ? " are destroyed!" : " is destroyed!"); break; } /* Holy Orb -- destroys cursed non-artifacts */ case GF_HOLY_ORB: { if (cursed_p(o_ptr->flags)) { do_kill = TRUE; note_kill = (plural ? " are destroyed!" : " is destroyed!"); } break; } /* Unlock chests */ case GF_KILL_TRAP: case GF_KILL_DOOR: { /* Chests are noticed only if trapped or locked */ if (o_ptr->tval == TV_CHEST) { /* Disarm/Unlock traps */ if (o_ptr->pval[DEFAULT_PVAL] > 0) { /* Disarm or Unlock */ o_ptr->pval[DEFAULT_PVAL] = (0 - o_ptr->pval[DEFAULT_PVAL]); /* Identify */ object_notice_everything(o_ptr); /* Notice */ if (o_ptr->marked && !squelch_item_ok(o_ptr)) { msg("Click!"); obvious = TRUE; } } } break; } } /* Attempt to destroy the object */ if (do_kill) { /* Effect "observed" */ if (o_ptr->marked && !squelch_item_ok(o_ptr)) { obvious = TRUE; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); } /* Artifacts, and other objects, get to resist */ if (is_art || ignore) { /* Observe the resist */ if (o_ptr->marked && !squelch_item_ok(o_ptr)) { msg("The %s %s unaffected!", o_name, (plural ? "are" : "is")); } } /* Kill it */ else { /* Describe if needed */ if (o_ptr->marked && note_kill && !squelch_item_ok(o_ptr)) { msgt(MSG_DESTROY, "The %s%s", o_name, note_kill); } /* Delete the object */ delete_object_idx(this_o_idx); /* Redraw */ cave_light_spot(cave, y, x); } } } /* Return "Anything seen?" */ return (obvious); } /* * Helper function for "project()" below. * * Handle a beam/bolt/ball causing damage to a monster. * * This routine takes a "source monster" (by index) which is mostly used to * determine if the player is causing the damage, and a "radius" (see below), * which is used to decrease the power of explosions with distance, and a * location, via integers which are modified by certain types of attacks * (polymorph and teleport being the obvious ones), a default damage, which * is modified as needed based on various properties, and finally a "damage * type" (see below). * * Note that this routine can handle "no damage" attacks (like teleport) by * taking a "zero" damage, and can even take "parameters" to attacks (like * confuse) by accepting a "damage", using it to calculate the effect, and * then setting the damage to zero. Note that the "damage" parameter is * divided by the radius, so monsters not at the "epicenter" will not take * as much damage (or whatever)... * * Note that "polymorph" is dangerous, since a failure in "place_monster()"' * may result in a dereference of an invalid pointer. XXX XXX XXX * * Various messages are produced, and damage is applied. * * Just "casting" a substance (i.e. plasma) does not make you immune, you must * actually be "made" of that substance, or "breathe" big balls of it. * * We assume that "Plasma" monsters, and "Plasma" breathers, are immune * to plasma. * * We assume "Nether" is an evil, necromantic force, so it doesn't hurt undead, * and hurts evil less. If can breath nether, then it resists it as well. * * Damage reductions use the following formulas: * Note that "dam = dam * 6 / (randint1(6) + 6);" * gives avg damage of .655, ranging from .858 to .500 * Note that "dam = dam * 5 / (randint1(6) + 6);" * gives avg damage of .544, ranging from .714 to .417 * Note that "dam = dam * 4 / (randint1(6) + 6);" * gives avg damage of .444, ranging from .556 to .333 * Note that "dam = dam * 3 / (randint1(6) + 6);" * gives avg damage of .327, ranging from .427 to .250 * Note that "dam = dam * 2 / (randint1(6) + 6);" * gives something simple. * * In this function, "result" messages are postponed until the end, where * the "note" string is appended to the monster name, if not NULL. So, * to make a spell have "no effect" just set "note" to NULL. You should * also set "notice" to FALSE, or the player will learn what the spell does. * * We attempt to return "TRUE" if the player saw anything "obvious" happen. */ static bool project_m(int who, int r, int y, int x, int dam, int typ, bool obvious) { int tmp; monster_type *m_ptr; monster_race *r_ptr; monster_lore *l_ptr; u16b flag = 0; /* Is the monster "seen"? */ bool seen = FALSE; /* Were the effects "irrelevant"? */ bool skipped = FALSE; /* Did the monster die? */ bool mon_died = FALSE; /* Polymorph setting (true or false) */ int do_poly = 0; /* Teleport setting (max distance) */ int do_dist = 0; /* Confusion setting (amount to confuse) */ int do_conf = 0; /* Stunning setting (amount to stun) */ int do_stun = 0; /* Slow setting (amount to haste) */ int do_slow = 0; /* Haste setting (amount to haste) */ int do_haste = 0; /* Sleep amount (amount to sleep) */ bool do_sleep = FALSE; /* Fear amount (amount to fear) */ int do_fear = 0; /* Are we trying to id the source of this effect? */ bool id = who < 0 ? !obvious : FALSE; /* Hold the monster name */ char m_name[80]; char m_poss[80]; int m_idx = cave->m_idx[y][x]; /* Assume no note */ int m_note = MON_MSG_NONE; /* Assume a default death */ byte note_dies = MON_MSG_DIE; /* Walls protect monsters */ if (!cave_floor_bold(y,x)) return (FALSE); /* No monster here */ if (!(m_idx > 0)) return (FALSE); /* Never affect projector */ if (m_idx == who) return (FALSE); /* Obtain monster info */ m_ptr = cave_monster(cave, m_idx); r_ptr = &r_info[m_ptr->r_idx]; l_ptr = &l_list[m_ptr->r_idx]; if (m_ptr->ml) seen = TRUE; /* Reduce damage by distance */ dam = (dam + r) / (r + 1); /* Get the monster name (BEFORE polymorphing) */ monster_desc(m_name, sizeof(m_name), m_ptr, 0); /* Get the monster possessive ("his"/"her"/"its") */ monster_desc(m_poss, sizeof(m_poss), m_ptr, MDESC_PRO2 | MDESC_POSS); /* Some monsters get "destroyed" */ if (monster_is_unusual(r_ptr)) { /* Special note at death */ note_dies = MON_MSG_DESTROYED; } /* Analyze the damage type */ switch (typ) { /* Magic Missile -- pure damage */ case GF_MISSILE: { if (seen) obvious = TRUE; break; } /* Acid */ case GF_ACID: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_IM_ACID); if (rf_has(r_ptr->flags, RF_IM_ACID)) { m_note = MON_MSG_RESIST_A_LOT; dam /= 9; } break; } /* Electricity */ case GF_ELEC: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_IM_ELEC); if (rf_has(r_ptr->flags, RF_IM_ELEC)) { m_note = MON_MSG_RESIST_A_LOT; dam /= 9; } break; } /* Fire damage */ case GF_FIRE: { if (seen) obvious = TRUE; if (seen) { rf_on(l_ptr->flags, RF_IM_FIRE); rf_on(l_ptr->flags, RF_HURT_FIRE); } if (rf_has(r_ptr->flags, RF_IM_FIRE)) { m_note = MON_MSG_RESIST_A_LOT; dam /= 9; } else if (rf_has(r_ptr->flags, RF_HURT_FIRE)) { m_note = MON_MSG_CATCH_FIRE; note_dies = MON_MSG_DISENTEGRATES; dam *= 2; } break; } /* Cold */ case GF_COLD: /* Ice -- Cold + Stun */ case GF_ICE: { if (seen) { obvious = TRUE; rf_on(l_ptr->flags, RF_IM_COLD); rf_on(l_ptr->flags, RF_HURT_COLD); } if (typ == GF_ICE) { if (who > 0) { do_stun = (randint1(15) + r) / (r + 1); flag |= MON_TMD_MON_SOURCE; } else do_stun = (randint1(15) + r + p_ptr->lev / 5) / (r + 1); } if (rf_has(r_ptr->flags, RF_IM_COLD)) { m_note = MON_MSG_RESIST_A_LOT; dam /= 9; } else if (rf_has(r_ptr->flags, RF_HURT_COLD)) { m_note = MON_MSG_BADLY_FROZEN; note_dies = MON_MSG_FREEZE_SHATTER; dam *= 2; } break; } /* Poison */ case GF_POIS: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_IM_POIS); if (rf_has(r_ptr->flags, RF_IM_POIS)) { m_note = MON_MSG_RESIST_A_LOT; dam /= 9; } break; } /* Holy Orb -- hurts Evil */ case GF_HOLY_ORB: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_EVIL); if (rf_has(r_ptr->flags, RF_EVIL)) { dam *= 2; m_note = MON_MSG_HIT_HARD; } break; } /* Arrow -- no defense XXX */ case GF_ARROW: { if (seen) obvious = TRUE; break; } /* Plasma */ case GF_PLASMA: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_RES_PLAS); if (rf_has(r_ptr->flags, RF_RES_PLAS)) { m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } break; } /* Nether -- see above */ case GF_NETHER: { if (seen) obvious = TRUE; /* Update the lore */ if (seen) { /* Acquire knowledge of undead type and nether resistance */ rf_on(l_ptr->flags, RF_UNDEAD); rf_on(l_ptr->flags, RF_RES_NETH); /* If it isn't undead, acquire extra knowledge */ if (!rf_has(r_ptr->flags, RF_UNDEAD)) { /* Learn this creature breathes nether if true */ if (rsf_has(r_ptr->spell_flags, RSF_BR_NETH)) { rsf_on(l_ptr->spell_flags, RSF_BR_NETH); } /* Otherwise learn about evil type */ else { rf_on(l_ptr->flags, RF_EVIL); } } } if (rf_has(r_ptr->flags, RF_UNDEAD)) { m_note = MON_MSG_IMMUNE; dam = 0; } else if (rf_has(r_ptr->flags, RF_RES_NETH) || rsf_has(r_ptr->spell_flags, RSF_BR_NETH)) { m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } else if (rf_has(r_ptr->flags, RF_EVIL)) { dam /= 2; m_note = MON_MSG_RESIST_SOMEWHAT; } break; } /* Water damage */ case GF_WATER: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_IM_WATER); if (rf_has(r_ptr->flags, RF_IM_WATER)) { m_note = MON_MSG_IMMUNE; dam = 0; } break; } /* Chaos -- Chaos breathers resist */ case GF_CHAOS: { if (seen) obvious = TRUE; do_poly = TRUE; if (who > 0) { do_conf = (5 + randint1(11) + r) / (r + 1); flag |= MON_TMD_MON_SOURCE; } else do_conf = (5 + randint1(11) + r + p_ptr->lev / 5) / (r + 1); if (rsf_has(r_ptr->spell_flags, RSF_BR_CHAO)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_CHAO); dam *= 3; dam /= (randint1(6)+6); do_poly = FALSE; } break; } /* Shards -- Shard breathers resist */ case GF_SHARD: { if (seen) obvious = TRUE; if (rsf_has(r_ptr->spell_flags, RSF_BR_SHAR)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_SHAR); m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } break; } /* Sound -- Sound breathers resist */ case GF_SOUND: { if (seen) obvious = TRUE; if (who > 0) { do_stun = (10 + randint1(15) + r) / (r + 1); flag |= MON_TMD_MON_SOURCE; } else do_stun = (10 + randint1(15) + r + p_ptr->lev / 5) / (r + 1); if (rsf_has(r_ptr->spell_flags, RSF_BR_SOUN)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_SOUN); m_note = MON_MSG_RESIST; dam *= 2; dam /= (randint1(6)+6); } break; } /* Disenchantment */ case GF_DISEN: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_RES_DISE); if (rf_has(r_ptr->flags, RF_RES_DISE)) { m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } break; } /* Nexus */ case GF_NEXUS: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_RES_NEXUS); if (rf_has(r_ptr->flags, RF_RES_NEXUS)) { m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } break; } /* Force */ case GF_FORCE: { if (seen) obvious = TRUE; if (who > 0) { do_stun = (randint1(15) + r) / (r + 1); flag |= MON_TMD_MON_SOURCE; } else do_stun = (randint1(15) + r + p_ptr->lev / 5) / (r + 1); if (rsf_has(r_ptr->spell_flags, RSF_BR_WALL)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_WALL); m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } break; } /* Inertia -- breathers resist */ case GF_INERTIA: { if (seen) obvious = TRUE; if (rsf_has(r_ptr->spell_flags, RSF_BR_INER)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_INER); m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } break; } /* Time -- breathers resist */ case GF_TIME: { if (seen) obvious = TRUE; if (rsf_has(r_ptr->spell_flags, RSF_BR_TIME)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_TIME); m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); } break; } /* Gravity -- breathers resist */ case GF_GRAVITY: { if (seen) obvious = TRUE; /* Higher level monsters can resist the teleportation better */ if (randint1(127) > r_ptr->level) do_dist = 10; if (rsf_has(r_ptr->spell_flags, RSF_BR_GRAV)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_GRAV); m_note = MON_MSG_RESIST; dam *= 3; dam /= (randint1(6)+6); do_dist = 0; } break; } /* Pure damage */ case GF_MANA: { if (seen) obvious = TRUE; break; } /* Meteor -- powerful magic missile */ case GF_METEOR: { if (seen) obvious = TRUE; break; } /* Drain Life */ case GF_OLD_DRAIN: { if (seen) obvious = TRUE; if (seen) { rf_on(l_ptr->flags, RF_UNDEAD); rf_on(l_ptr->flags, RF_DEMON); } if (monster_is_nonliving(r_ptr)) { m_note = MON_MSG_UNAFFECTED; obvious = FALSE; dam = 0; } break; } /* Polymorph monster (Use "dam" as "power") */ case GF_OLD_POLY: { /* Polymorph later */ do_poly = dam; /* No "real" damage */ dam = 0; break; } /* Clone monsters (Ignore "dam") */ case GF_OLD_CLONE: { if (seen) obvious = TRUE; /* Heal fully */ m_ptr->hp = m_ptr->maxhp; /* Speed up */ mon_inc_timed(m_idx, MON_TMD_FAST, 50, MON_TMD_FLG_NOTIFY, id); /* Attempt to clone. */ if (multiply_monster(m_idx)) { m_note = MON_MSG_SPAWN; } /* No "real" damage */ dam = 0; break; } /* Heal Monster (use "dam" as amount of healing) */ case GF_OLD_HEAL: { if (seen) obvious = TRUE; /* Wake up */ mon_clear_timed(m_idx, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, id); /* Heal */ m_ptr->hp += dam; /* No overflow */ if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; /* Redraw (later) if needed */ if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); /* Message */ else m_note = MON_MSG_HEALTHIER; /* No "real" damage */ dam = 0; break; } /* Speed Monster (Ignore "dam") */ case GF_OLD_SPEED: { if (seen) obvious = TRUE; /* Speed up */ do_haste = dam; /* No "real" damage */ dam = 0; break; } /* Slow Monster (Use "dam" as "power") */ case GF_OLD_SLOW: { if (seen) obvious = TRUE; do_slow = dam; /* No "real" damage */ dam = 0; break; } /* Sleep (Use "dam" as "power") */ case GF_OLD_SLEEP: { /* Go to sleep later */ do_sleep = dam; /* No "real" damage */ dam = 0; break; } /* Confusion (Use "dam" as "power") */ case GF_OLD_CONF: { /* Get confused later */ do_conf = dam; /* No "real" damage */ dam = 0; break; } /* Light, but only hurts susceptible creatures */ case GF_LIGHT_WEAK: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_HURT_LIGHT); /* Hurt by light */ if (rf_has(r_ptr->flags, RF_HURT_LIGHT)) { /* Special effect */ m_note = MON_MSG_CRINGE_LIGHT; note_dies = MON_MSG_SHRIVEL_LIGHT; } /* Normally no damage */ else { /* No damage */ dam = 0; } break; } /* Light -- opposite of Dark */ case GF_LIGHT: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_HURT_LIGHT); if (rsf_has(r_ptr->spell_flags, RSF_BR_LIGHT)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_LIGHT); m_note = MON_MSG_RESIST; dam *= 2; dam /= (randint1(6)+6); } else if (rf_has(r_ptr->flags, RF_HURT_LIGHT)) { m_note = MON_MSG_CRINGE_LIGHT; note_dies = MON_MSG_SHRIVEL_LIGHT; dam *= 2; } break; } /* Dark -- opposite of Light */ case GF_DARK: { if (seen) obvious = TRUE; if (rsf_has(r_ptr->spell_flags, RSF_BR_DARK)) { /* Learn about breathers through resistance */ if (seen) rsf_on(l_ptr->spell_flags, RSF_BR_DARK); m_note = MON_MSG_RESIST; dam *= 2; dam /= (randint1(6)+6); } break; } /* Stone to Mud */ case GF_KILL_WALL: { if (seen) obvious = TRUE; if (seen) rf_on(l_ptr->flags, RF_HURT_ROCK); /* Hurt by rock remover */ if (rf_has(r_ptr->flags, RF_HURT_ROCK)) { /* Cute little message */ m_note = MON_MSG_LOSE_SKIN; note_dies = MON_MSG_DISSOLVE; } /* Usually, ignore the effects */ else { /* No damage */ dam = 0; } break; } /* Teleport undead (Use "dam" as "power") */ case GF_AWAY_UNDEAD: { if (seen) rf_on(l_ptr->flags, RF_UNDEAD); /* Only affect undead */ if (rf_has(r_ptr->flags, RF_UNDEAD)) { if (seen) obvious = TRUE; do_dist = dam; } /* Others ignore */ else { /* Irrelevant */ skipped = TRUE; } /* No "real" damage */ dam = 0; break; } /* Teleport evil (Use "dam" as "power") */ case GF_AWAY_EVIL: { if (seen) rf_on(l_ptr->flags, RF_EVIL); /* Only affect evil */ if (rf_has(r_ptr->flags, RF_EVIL)) { if (seen) obvious = TRUE; do_dist = dam; } /* Others ignore */ else { /* Irrelevant */ skipped = TRUE; } /* No "real" damage */ dam = 0; break; } /* Teleport monster (Use "dam" as "power") */ case GF_AWAY_ALL: { /* Obvious */ if (seen) obvious = TRUE; /* Prepare to teleport */ do_dist = dam; /* No "real" damage */ dam = 0; break; } /* Turn undead (Use "dam" as "power") */ case GF_TURN_UNDEAD: { /* Only affect undead */ if (rf_has(r_ptr->flags, RF_UNDEAD)) { /* Obvious */ if (seen) obvious = TRUE; /* Apply some fear */ do_fear = dam; } else { skipped = TRUE; } /* No "real" damage */ dam = 0; break; } /* Turn evil (Use "dam" as "power") */ case GF_TURN_EVIL: { /* Only affect evil */ if (rf_has(r_ptr->flags, RF_EVIL)) { /* Obvious */ if (seen) obvious = TRUE; /* Apply some fear */ do_fear = dam; } else { skipped = TRUE; } /* No "real" damage */ dam = 0; break; } /* Turn monster (Use "dam" as "power") */ case GF_TURN_ALL: { /* Get frightened later */ do_fear = dam; /* No "real" damage */ dam = 0; break; } /* Dispel undead */ case GF_DISP_UNDEAD: { if (seen) rf_on(l_ptr->flags, RF_UNDEAD); /* Only affect undead */ if (rf_has(r_ptr->flags, RF_UNDEAD)) { /* Obvious */ if (seen) obvious = TRUE; /* Message */ m_note = MON_MSG_SHUDDER; note_dies = MON_MSG_DISSOLVE; } /* Others ignore */ else { /* Irrelevant */ skipped = TRUE; /* No damage */ dam = 0; } break; } /* Dispel evil */ case GF_DISP_EVIL: { if (seen) rf_on(l_ptr->flags, RF_EVIL); /* Only affect evil */ if (rf_has(r_ptr->flags, RF_EVIL)) { /* Obvious */ if (seen) obvious = TRUE; /* Message */ m_note = MON_MSG_SHUDDER; note_dies = MON_MSG_DISSOLVE; } /* Others ignore */ else { /* Irrelevant */ skipped = TRUE; /* No damage */ dam = 0; } break; } /* Dispel monster */ case GF_DISP_ALL: { /* Obvious */ if (seen) obvious = TRUE; /* Message */ m_note = MON_MSG_SHUDDER; note_dies = MON_MSG_DISSOLVE; break; } /* Default */ default: { /* Irrelevant */ skipped = TRUE; /* No damage */ dam = 0; break; } } /* Absolutely no effect */ if (skipped) return (FALSE); /* "Unique" monsters can only be "killed" by the player */ if (rf_has(r_ptr->flags, RF_UNIQUE)) { /* Uniques may only be killed by the player */ if ((who > 0) && (dam > m_ptr->hp)) dam = m_ptr->hp; } /* Check for death */ if (dam > m_ptr->hp) { /* Extract method of death */ m_note = note_dies; } /* Handle polymorph */ else if (do_poly) { /* Default -- assume no polymorph */ m_note = MON_MSG_UNAFFECTED; /* Uniques cannot be polymorphed */ if (!rf_has(r_ptr->flags, RF_UNIQUE)) { if (seen) obvious = TRUE; /* Saving throws are allowed */ if (r_ptr->level > randint1(90) || (typ == GF_OLD_POLY && r_ptr->level > randint1(MAX(1, do_poly - 10)) + 10)) { if (typ == GF_OLD_POLY) m_note = MON_MSG_MAINTAIN_SHAPE; } else { /* Pick a "new" monster race */ tmp = poly_r_idx(m_ptr->r_idx); /* Handle polymorph */ if (tmp != m_ptr->r_idx) { /* Monster polymorphs */ m_note = MON_MSG_CHANGE; /* Add the message now before changing the monster race */ add_monster_message(m_name, m_idx, m_note, FALSE); /* No more messages */ m_note = MON_MSG_NONE; /* Turn off the damage */ dam = 0; /* "Kill" the "old" monster */ delete_monster_idx(m_idx); /* Create a new monster (no groups) */ (void)place_new_monster(cave, y, x, tmp, FALSE, FALSE, ORIGIN_DROP_POLY); /* Hack -- Assume success XXX XXX XXX */ /* Hack -- Get new monster */ m_ptr = cave_monster(cave, m_idx); /* Hack -- Get new race */ r_ptr = &r_info[m_ptr->r_idx]; } } } } /* Handle "teleport" */ else if (do_dist) { /* Obvious */ if (seen) obvious = TRUE; /* Message */ m_note = MON_MSG_DISAPPEAR; /* Teleport */ teleport_away(m_ptr, do_dist); /* Hack -- get new location */ y = m_ptr->fy; x = m_ptr->fx; } /* Handle stunning, confusion, slowing, hasting and fear */ else if (do_stun) { if (m_ptr->m_timed[MON_TMD_STUN]) do_stun /= 2; obvious = mon_inc_timed(m_idx, MON_TMD_STUN, do_stun, flag | MON_TMD_FLG_NOTIFY, id); } else if (do_conf) { int tmp = damroll(3, (do_conf / 2)) + 1; obvious = mon_inc_timed(m_idx, MON_TMD_CONF, tmp, flag | MON_TMD_FLG_NOTIFY, id); } else if (do_slow) obvious = mon_inc_timed(m_idx, MON_TMD_SLOW, do_slow, flag | MON_TMD_FLG_NOTIFY, id); else if (do_haste) obvious = mon_inc_timed(m_idx, MON_TMD_FAST, do_haste, flag | MON_TMD_FLG_NOTIFY, id); if (do_fear) obvious = mon_inc_timed(m_idx, MON_TMD_FEAR, do_fear, flag | MON_TMD_FLG_NOTIFY, id); /* If another monster did the damage, hurt the monster by hand */ if (who > 0) { /* Redraw (later) if needed */ if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); /* Wake the monster up */ mon_clear_timed(m_idx, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); /* Hurt the monster */ m_ptr->hp -= dam; /* Dead monster */ if (m_ptr->hp < 0) { /* Give detailed messages if destroyed */ if (!seen) note_dies = MON_MSG_MORIA_DEATH; /* dump the note*/ add_monster_message(m_name, m_idx, note_dies, FALSE); /* Generate treasure, etc */ monster_death(m_idx, FALSE); /* Delete the monster */ delete_monster_idx(m_idx); mon_died = TRUE; } /* Damaged monster */ else { /* Give detailed messages if visible or destroyed */ if ((m_note != MON_MSG_NONE) && seen) { add_monster_message(m_name, m_idx, m_note, FALSE); } /* Hack -- Pain message */ else if (dam > 0) message_pain(m_idx, dam); } } /* If the player did it, give them experience, check fear */ else { bool fear = FALSE; /* The monster is going to be killed */ if (dam > m_ptr->hp) { /* Adjust message for unseen monsters */ if (!seen) note_dies = MON_MSG_MORIA_DEATH; /* Save the death notification for later */ add_monster_message(m_name, m_idx, note_dies, FALSE); } if (do_sleep) obvious = mon_inc_timed(m_idx, MON_TMD_SLEEP, 500 + p_ptr->lev * 10, flag | MON_TMD_FLG_NOTIFY, id); else if (mon_take_hit(m_idx, dam, &fear, "")) mon_died = TRUE; else { /* Give detailed messages if visible or destroyed */ if ((m_note != MON_MSG_NONE) && seen) { add_monster_message(m_name, m_idx, m_note, FALSE); } /* Hack -- Pain message */ else if (dam > 0) message_pain(m_idx, dam); if (fear && m_ptr->ml) add_monster_message(m_name, m_idx, MON_MSG_FLEE_IN_TERROR, TRUE); } } /* Verify this code XXX XXX XXX */ /* Update the monster */ if (!mon_died) update_mon(m_idx, FALSE); /* Redraw the monster grid */ cave_light_spot(cave, y, x); /* Update monster recall window */ if (p_ptr->monster_race_idx == m_ptr->r_idx) { /* Window stuff */ p_ptr->redraw |= (PR_MONSTER); } /* Track it */ project_m_n++; project_m_x = x; project_m_y = y; /* Return "Anything seen?" */ return (obvious); } /* * Helper function for "project()" below. * * Handle a beam/bolt/ball causing damage to the player. * * This routine takes a "source monster" (by index), a "distance", a default * "damage", and a "damage type". See "project_m()" above. * * If "rad" is non-zero, then the blast was centered elsewhere, and the damage * is reduced (see "project_m()" above). This can happen if a monster breathes * at the player and hits a wall instead. * * We return "TRUE" if any "obvious" effects were observed. * * Actually, for historical reasons, we just assume that the effects were * obvious. XXX XXX XXX */ static bool project_p(int who, int r, int y, int x, int dam, int typ, bool obvious) { bool blind, seen; /* Get the damage type details */ const struct gf_type *gf_ptr = &gf_table[typ]; /* Source monster */ monster_type *m_ptr; /* Monster name (for attacks) */ char m_name[80]; /* Monster name (for damage) */ char killer[80]; /* No player here */ if (!(cave->m_idx[y][x] < 0)) return (FALSE); /* Never affect projector */ if (cave->m_idx[y][x] == who) return (FALSE); /* Source monster */ m_ptr = cave_monster(cave, who); /* Player blind-ness */ blind = (p_ptr->timed[TMD_BLIND] ? TRUE : FALSE); /* Extract the "see-able-ness" */ seen = (!blind && m_ptr->ml); /* Reduce damage by distance */ dam = (dam + r) / (r + 1); /* Get the monster name */ monster_desc(m_name, sizeof(m_name), m_ptr, 0); /* Get the monster's real name */ monster_desc(killer, sizeof(killer), m_ptr, MDESC_SHOW | MDESC_IND2); /* Let player know what is going on */ if (!seen) msg("You are hit by %s!", gf_ptr->desc); if (typ == GF_GRAVITY) msg("Gravity warps around you."); /* Adjust damage for resistance, immunity or vulnerability, and apply it */ dam = adjust_dam(p_ptr, typ, dam, RANDOMISE, check_for_resist(p_ptr, typ, p_ptr->state.flags, TRUE)); if (dam) take_hit(p_ptr, dam, killer); /* Disturb */ disturb(p_ptr, 1, 0); /* Return "Anything seen?" */ return (obvious); } /* * Generic "beam"/"bolt"/"ball" projection routine. * * Input: * who: Index of "source" monster (negative for "player") * rad: Radius of explosion (0 = beam/bolt, 1 to 9 = ball) * y,x: Target location (or location to travel "towards") * dam: Base damage roll to apply to affected monsters (or player) * typ: Type of damage to apply to monsters (and objects) * flg: Extra bit flags (see PROJECT_xxxx in "defines.h") * * Return: * TRUE if any "effects" of the projection were observed, else FALSE * * Allows a monster (or player) to project a beam/bolt/ball of a given kind * towards a given location (optionally passing over the heads of interposing * monsters), and have it do a given amount of damage to the monsters (and * optionally objects) within the given radius of the final location. * * A "bolt" travels from source to target and affects only the target grid. * A "beam" travels from source to target, affecting all grids passed through. * A "ball" travels from source to the target, exploding at the target, and * affecting everything within the given radius of the target location. * * Traditionally, a "bolt" does not affect anything on the ground, and does * not pass over the heads of interposing monsters, much like a traditional * missile, and will "stop" abruptly at the "target" even if no monster is * positioned there, while a "ball", on the other hand, passes over the heads * of monsters between the source and target, and affects everything except * the source monster which lies within the final radius, while a "beam" * affects every monster between the source and target, except for the casting * monster (or player), and rarely affects things on the ground. * * Two special flags allow us to use this function in special ways, the * "PROJECT_HIDE" flag allows us to perform "invisible" projections, while * the "PROJECT_JUMP" flag allows us to affect a specific grid, without * actually projecting from the source monster (or player). * * The player will only get "experience" for monsters killed by himself * Unique monsters can only be destroyed by attacks from the player * * Only 256 grids can be affected per projection, limiting the effective * "radius" of standard ball attacks to nine units (diameter nineteen). * * One can project in a given "direction" by combining PROJECT_THRU with small * offsets to the initial location (see "line_spell()"), or by calculating * "virtual targets" far away from the player. * * One can also use PROJECT_THRU to send a beam/bolt along an angled path, * continuing until it actually hits somethings (useful for "stone to mud"). * * Bolts and Beams explode INSIDE walls, so that they can destroy doors. * * Balls must explode BEFORE hitting walls, or they would affect monsters * on both sides of a wall. Some bug reports indicate that this is still * happening in 2.7.8 for Windows, though it appears to be impossible. * * We "pre-calculate" the blast area only in part for efficiency. * More importantly, this lets us do "explosions" from the "inside" out. * This results in a more logical distribution of "blast" treasure. * It also produces a better (in my opinion) animation of the explosion. * It could be (but is not) used to have the treasure dropped by monsters * in the middle of the explosion fall "outwards", and then be damaged by * the blast as it spreads outwards towards the treasure drop location. * * Walls and doors are included in the blast area, so that they can be * "burned" or "melted" in later versions. * * This algorithm is intended to maximize simplicity, not necessarily * efficiency, since this function is not a bottleneck in the code. * * We apply the blast effect from ground zero outwards, in several passes, * first affecting features, then objects, then monsters, then the player. * This allows walls to be removed before checking the object or monster * in the wall, and protects objects which are dropped by monsters killed * in the blast, and allows the player to see all affects before he is * killed or teleported away. The semantics of this method are open to * various interpretations, but they seem to work well in practice. * * We process the blast area from ground-zero outwards to allow for better * distribution of treasure dropped by monsters, and because it provides a * pleasing visual effect at low cost. * * Note that the damage done by "ball" explosions decreases with distance. * This decrease is rapid, grids at radius "dist" take "1/dist" damage. * * Notice the "napalm" effect of "beam" weapons. First they "project" to * the target, and then the damage "flows" along this beam of destruction. * The damage at every grid is the same as at the "center" of a "ball" * explosion, since the "beam" grids are treated as if they ARE at the * center of a "ball" explosion. * * Currently, specifying "beam" plus "ball" means that locations which are * covered by the initial "beam", and also covered by the final "ball", except * for the final grid (the epicenter of the ball), will be "hit twice", once * by the initial beam, and once by the exploding ball. For the grid right * next to the epicenter, this results in 150% damage being done. The center * does not have this problem, for the same reason the final grid in a "beam" * plus "bolt" does not -- it is explicitly removed. Simply removing "beam" * grids which are covered by the "ball" will NOT work, as then they will * receive LESS damage than they should. Do not combine "beam" with "ball". * * The array "gy[],gx[]" with current size "grids" is used to hold the * collected locations of all grids in the "blast area" plus "beam path". * * Note the rather complex usage of the "gm[]" array. First, gm[0] is always * zero. Second, for N>1, gm[N] is always the index (in gy[],gx[]) of the * first blast grid (see above) with radius "N" from the blast center. Note * that only the first gm[1] grids in the blast area thus take full damage. * Also, note that gm[rad+1] is always equal to "grids", which is the total * number of blast grids. * * Note that once the projection is complete, (y2,x2) holds the final location * of bolts/beams, and the "epicenter" of balls. * * Note also that "rad" specifies the "inclusive" radius of projection blast, * so that a "rad" of "one" actually covers 5 or 9 grids, depending on the * implementation of the "distance" function. Also, a bolt can be properly * viewed as a "ball" with a "rad" of "zero". * * Note that if no "target" is reached before the beam/bolt/ball travels the * maximum distance allowed (MAX_RANGE), no "blast" will be induced. This * may be relevant even for bolts, since they have a "1x1" mini-blast. * * Note that for consistency, we "pretend" that the bolt actually takes "time" * to move from point A to point B, even if the player cannot see part of the * projection path. Note that in general, the player will *always* see part * of the path, since it either starts at the player or ends on the player. * * Hack -- we assume that every "projection" is "self-illuminating". * * Hack -- when only a single monster is affected, we automatically track * (and recall) that monster, unless "PROJECT_JUMP" is used. * * Note that all projections now "explode" at their final destination, even * if they were being projected at a more distant destination. This means * that "ball" spells will *always* explode. * * Note that we must call "handle_stuff(p_ptr)" after affecting terrain features * in the blast radius, in case the "illumination" of the grid was changed, * and "update_view()" and "update_monsters()" need to be called. */ bool project(int who, int rad, int y, int x, int dam, int typ, int flg) { int py = p_ptr->py; int px = p_ptr->px; int i, t, dist; int y1, x1; int y2, x2; int msec = op_ptr->delay_factor; /* Assume the player sees nothing */ bool notice = FALSE; /* Assume the player has seen nothing */ bool visual = FALSE; /* Assume the player has seen no blast grids */ bool drawn = FALSE; /* Is the player blind? */ bool blind = (p_ptr->timed[TMD_BLIND] ? TRUE : FALSE); /* Number of grids in the "path" */ int path_n = 0; /* Actual grids in the "path" */ u16b path_g[512]; /* Number of grids in the "blast area" (including the "beam" path) */ int grids = 0; /* Coordinates of the affected grids */ byte gx[256], gy[256]; /* Encoded "radius" info (see above) */ byte gm[16]; /* Hack -- Jump to target */ if (flg & (PROJECT_JUMP)) { x1 = x; y1 = y; /* Clear the flag */ flg &= ~(PROJECT_JUMP); } /* Start at player */ else if (who < 0) { x1 = px; y1 = py; } /* Start at monster */ else if (who > 0) { x1 = cave_monster(cave, who)->fx; y1 = cave_monster(cave, who)->fy; } /* Oops */ else { x1 = x; y1 = y; } /* Default "destination" */ y2 = y; x2 = x; /* Hack -- verify stuff */ if (flg & (PROJECT_THRU)) { if ((x1 == x2) && (y1 == y2)) { flg &= ~(PROJECT_THRU); } } /* Hack -- Assume there will be no blast (max radius 16) */ for (dist = 0; dist < 16; dist++) gm[dist] = 0; /* Initial grid */ y = y1; x = x1; /* Collect beam grids */ if (flg & (PROJECT_BEAM)) { gy[grids] = y; gx[grids] = x; grids++; } /* Calculate the projection path */ path_n = project_path(path_g, MAX_RANGE, y1, x1, y2, x2, flg); /* Hack -- Handle stuff */ handle_stuff(p_ptr); /* Project along the path */ for (i = 0; i < path_n; ++i) { int oy = y; int ox = x; int ny = GRID_Y(path_g[i]); int nx = GRID_X(path_g[i]); /* Hack -- Balls explode before reaching walls */ if (!cave_floor_bold(ny, nx) && (rad > 0)) break; /* Advance */ y = ny; x = nx; /* Collect beam grids */ if (flg & (PROJECT_BEAM)) { gy[grids] = y; gx[grids] = x; grids++; } /* Only do visuals if requested */ if (!blind && !(flg & (PROJECT_HIDE))) { /* Only do visuals if the player can "see" the bolt */ if (player_has_los_bold(y, x)) { byte a; char c; /* Obtain the bolt pict */ bolt_pict(oy, ox, y, x, typ, &a, &c); /* Visual effects */ print_rel(c, a, y, x); move_cursor_relative(y, x); Term_fresh(); if (p_ptr->redraw) redraw_stuff(p_ptr); Term_xtra(TERM_XTRA_DELAY, msec); cave_light_spot(cave, y, x); Term_fresh(); if (p_ptr->redraw) redraw_stuff(p_ptr); /* Display "beam" grids */ if (flg & (PROJECT_BEAM)) { /* Obtain the explosion pict */ bolt_pict(y, x, y, x, typ, &a, &c); /* Visual effects */ print_rel(c, a, y, x); } /* Hack -- Activate delay */ visual = TRUE; } /* Hack -- delay anyway for consistency */ else if (visual) { /* Delay for consistency */ Term_xtra(TERM_XTRA_DELAY, msec); } } } /* Save the "blast epicenter" */ y2 = y; x2 = x; /* Start the "explosion" */ gm[0] = 0; /* Hack -- make sure beams get to "explode" */ gm[1] = grids; /* Explode */ /* Hack -- remove final beam grid */ if (flg & (PROJECT_BEAM)) { grids--; } /* Determine the blast area, work from the inside out */ for (dist = 0; dist <= rad; dist++) { /* Scan the maximal blast area of radius "dist" */ for (y = y2 - dist; y <= y2 + dist; y++) { for (x = x2 - dist; x <= x2 + dist; x++) { /* Ignore "illegal" locations */ if (!in_bounds(y, x)) continue; /* Enforce a "circular" explosion */ if (distance(y2, x2, y, x) != dist) continue; /* Ball explosions are stopped by walls */ if (!los(y2, x2, y, x)) continue; /* Save this grid */ gy[grids] = y; gx[grids] = x; grids++; } } /* Encode some more "radius" info */ gm[dist+1] = grids; } /* Speed -- ignore "non-explosions" */ if (!grids) return (FALSE); /* Display the "blast area" if requested */ if (!blind && !(flg & (PROJECT_HIDE))) { /* Then do the "blast", from inside out */ for (t = 0; t <= rad; t++) { /* Dump everything with this radius */ for (i = gm[t]; i < gm[t+1]; i++) { /* Extract the location */ y = gy[i]; x = gx[i]; /* Only do visuals if the player can "see" the blast */ if (player_has_los_bold(y, x)) { byte a; char c; drawn = TRUE; /* Obtain the explosion pict */ bolt_pict(y, x, y, x, typ, &a, &c); /* Visual effects -- Display */ print_rel(c, a, y, x); } } /* Hack -- center the cursor */ move_cursor_relative(y2, x2); /* Flush each "radius" separately */ Term_fresh(); /* Flush */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Delay (efficiently) */ if (visual || drawn) { Term_xtra(TERM_XTRA_DELAY, msec); } } /* Flush the erasing */ if (drawn) { /* Erase the explosion drawn above */ for (i = 0; i < grids; i++) { /* Extract the location */ y = gy[i]; x = gx[i]; /* Hack -- Erase if needed */ if (player_has_los_bold(y, x)) { cave_light_spot(cave, y, x); } } /* Hack -- center the cursor */ move_cursor_relative(y2, x2); /* Flush the explosion */ Term_fresh(); /* Flush */ if (p_ptr->redraw) redraw_stuff(p_ptr); } } /* Check features */ if (flg & (PROJECT_GRID)) { /* Start with "dist" of zero */ dist = 0; /* Scan for features */ for (i = 0; i < grids; i++) { /* Hack -- Notice new "dist" values */ if (gm[dist+1] == i) dist++; /* Get the grid location */ y = gy[i]; x = gx[i]; /* Affect the feature in that grid */ if (project_f(who, dist, y, x, dam, typ, FALSE)) notice = TRUE; } } /* Update stuff if needed */ if (p_ptr->update) update_stuff(p_ptr); /* Check objects */ if (flg & (PROJECT_ITEM)) { /* Start with "dist" of zero */ dist = 0; /* Scan for objects */ for (i = 0; i < grids; i++) { /* Hack -- Notice new "dist" values */ if (gm[dist+1] == i) dist++; /* Get the grid location */ y = gy[i]; x = gx[i]; /* Affect the object in the grid */ if (project_o(who, dist, y, x, dam, typ, FALSE)) notice = TRUE; } } /* Check monsters */ if (flg & (PROJECT_KILL)) { /* Mega-Hack */ project_m_n = 0; project_m_x = 0; project_m_y = 0; /* Start with "dist" of zero */ dist = 0; /* Scan for monsters */ for (i = 0; i < grids; i++) { /* Hack -- Notice new "dist" values */ if (gm[dist+1] == i) dist++; /* Get the grid location */ y = gy[i]; x = gx[i]; /* Affect the monster in the grid */ if (project_m(who, dist, y, x, dam, typ, (flg & PROJECT_AWARE ? TRUE : FALSE))) notice = TRUE; } /* Player affected one monster (without "jumping") */ if ((who < 0) && (project_m_n == 1) && !(flg & (PROJECT_JUMP))) { /* Location */ x = project_m_x; y = project_m_y; /* Track if possible */ if (cave->m_idx[y][x] > 0) { monster_type *m_ptr = cave_monster(cave, cave->m_idx[y][x]); /* Hack -- auto-recall */ if (m_ptr->ml) monster_race_track(m_ptr->r_idx); /* Hack - auto-track */ if (m_ptr->ml) health_track(p_ptr, cave->m_idx[y][x]); } } } /* Check player */ if (flg & (PROJECT_KILL)) { /* Start with "dist" of zero */ dist = 0; /* Scan for player */ for (i = 0; i < grids; i++) { /* Hack -- Notice new "dist" values */ if (gm[dist+1] == i) dist++; /* Get the grid location */ y = gy[i]; x = gx[i]; /* Affect the player (assume obvious) */ if (project_p(who, dist, y, x, dam, typ, TRUE)) { notice = TRUE; /* Only affect the player once */ break; } } } /* Return "something was noticed" */ return (notice); } angband-v3.3.2/src/cmds.h0000644000175000017500000001053111651552410014475 0ustar chriscchrisc#ifndef INCLUDED_CMDS_H #define INCLUDED_CMDS_H #include "game-cmd.h" /* * Command handlers will take a pointer to the command structure * so that they can access any arguments supplied. */ typedef void (*cmd_handler_fn)(cmd_code code, cmd_arg args[]); /* cmd0.c */ extern void cmd_init(void); unsigned char cmd_lookup_key(cmd_code cmd); cmd_code cmd_lookup(unsigned char key); /* cmd-obj.c */ void do_cmd_uninscribe(cmd_code code, cmd_arg args[]); void do_cmd_inscribe(cmd_code code, cmd_arg args[]); void do_cmd_takeoff(cmd_code code, cmd_arg args[]); void wield_item(object_type *o_ptr, int item, int slot); void do_cmd_wield(cmd_code code, cmd_arg args[]); void do_cmd_drop(cmd_code code, cmd_arg args[]); void do_cmd_destroy(cmd_code code, cmd_arg args[]); void do_cmd_use(cmd_code code, cmd_arg args[]); void do_cmd_refill(cmd_code code, cmd_arg args[]); void do_cmd_study_spell(cmd_code code, cmd_arg args[]); void do_cmd_cast(cmd_code code, cmd_arg args[]); void do_cmd_study_book(cmd_code code, cmd_arg args[]); /* cmd1.c */ int do_autopickup(void); /* cmd2.c */ void do_cmd_go_up(cmd_code code, cmd_arg args[]); void do_cmd_go_down(cmd_code code, cmd_arg args[]); void do_cmd_search(cmd_code code, cmd_arg args[]); void do_cmd_toggle_search(cmd_code code, cmd_arg args[]); void do_cmd_open(cmd_code code, cmd_arg args[]); void do_cmd_close(cmd_code code, cmd_arg args[]); void do_cmd_tunnel(cmd_code code, cmd_arg args[]); void do_cmd_disarm(cmd_code code, cmd_arg args[]); void do_cmd_bash(cmd_code code, cmd_arg args[]); void do_cmd_alter(cmd_code code, cmd_arg args[]); void do_cmd_spike(cmd_code code, cmd_arg args[]); void do_cmd_walk(cmd_code code, cmd_arg args[]); void do_cmd_jump(cmd_code code, cmd_arg args[]); void do_cmd_run(cmd_code code, cmd_arg args[]); void do_cmd_pathfind(cmd_code code, cmd_arg args[]); void do_cmd_hold(cmd_code code, cmd_arg args[]); void do_cmd_pickup(cmd_code code, cmd_arg args[]); void do_cmd_autopickup(cmd_code code, cmd_arg args[]); void do_cmd_rest(cmd_code code, cmd_arg args[]); void do_cmd_suicide(cmd_code code, cmd_arg args[]); void do_cmd_save_game(cmd_code code, cmd_arg args[]); void do_cmd_alter_aux(int dir); void textui_cmd_rest(void); void textui_cmd_suicide(void); /* cmd3.c */ void do_cmd_inven(void); void do_cmd_equip(void); void textui_cmd_destroy(void); void textui_cmd_toggle_ignore(void); void textui_obj_examine(void); void do_cmd_target(void); void do_cmd_target_closest(void); void do_cmd_look(void); void do_cmd_locate(void); void do_cmd_query_symbol(void); void do_cmd_center_map(void); /* cmd4.c */ extern void do_cmd_redraw(void); extern void do_cmd_resize(void); extern void do_cmd_change_name(void); extern void do_cmd_message_one(void); extern void do_cmd_messages(void); extern void do_cmd_options(void); extern void do_cmd_options_birth(void); extern void do_cmd_pref(void); extern void do_cmd_note(void); extern void do_cmd_version(void); extern void display_feeling(bool obj_only); extern void do_cmd_feeling(void); extern void do_cmd_load_screen(void); extern void do_cmd_save_screen(void); /* cmd-misc.c */ void do_cmd_wizard(void); void do_cmd_try_debug(void); void do_cmd_try_borg(void); void do_cmd_quit(cmd_code code, cmd_arg args[]); void do_cmd_xxx_options(void); void do_cmd_monlist(void); void do_cmd_itemlist(void); void do_cmd_unknown(void); /* attack.c */ extern void do_cmd_fire(cmd_code code, cmd_arg args[]); extern void textui_cmd_fire_at_nearest(void); extern void do_cmd_throw(cmd_code code, cmd_arg args[]); extern void textui_cmd_throw(void); /* store.c */ extern void do_cmd_store(cmd_code code, cmd_arg args[]); extern void do_cmd_sell(cmd_code code, cmd_arg args[]); extern void do_cmd_stash(cmd_code code, cmd_arg args[]); extern void do_cmd_buy(cmd_code code, cmd_arg args[]); extern void do_cmd_retrieve(cmd_code code, cmd_arg args[]); /* Types of item use */ typedef enum { USE_TIMEOUT, USE_CHARGE, USE_SINGLE } use_type; /* XXX */ extern int cmp_monsters(const void *a, const void *b); /* ui-spell.c -- just for now */ void textui_book_browse(const object_type *o_ptr); void textui_spell_browse(void); void textui_obj_study(void); void textui_obj_cast(void); /* ui-knowledge.c */ extern int big_pad(int col, int row, byte a, byte c); extern void textui_browse_object_knowledge(const char *name, int row); extern void textui_knowledge_init(void); extern void textui_browse_knowledge(void); #endif angband-v3.3.2/src/attack.h0000644000175000017500000000127411651552410015022 0ustar chriscchrisc/* attack.h - attack interface */ #ifndef ATTACK_H #define ATTACK_H extern int breakage_chance(const object_type *o_ptr, bool hit_target); extern bool test_hit(int chance, int ac, int vis); extern void py_attack(int y, int x); /** * */ struct attack_result { bool success; int dmg; u32b msg_type; const char *hit_verb; }; /** * ranged_attack is a function pointer, used to execute a kind of attack. * * This allows us to abstract details of throwing, shooting, etc. out while * keeping the core projectile tracking, monster cleanup, and display code * in common. */ typedef struct attack_result (*ranged_attack) (object_type *o_ptr, int y, int x); #endif /* !ATTACK_H */ angband-v3.3.2/src/gen-coverage0000755000175000017500000000142511651552410015670 0ustar chriscchrisc#!/usr/bin/perl use warnings qw(all); use strict; my $tot = 0; my $cov = 0; my @fs = (); foreach my $fn (@ARGV) { my $fh; $fn =~ s!/!#!g; open($fh, '<', $fn) or (warn "cannot open $fn: $!" and next); my $fcov = 0; my $ftot = 0; # print "$fn: "; while (my $line = <$fh>) { my @lp = split(/:/, $line, 3); my $n = $lp[0]; my $ln = $lp[1]; $n =~ s/^ *//; $ftot++ if $n ne '-'; $fcov++ if $n ne '#####' and $n ne '-'; } $tot += $ftot; $cov += $fcov; # printf("$fcov/$ftot (%.2f%%)\n", ($fcov / $ftot) * 100); push @fs, [ $fn, $fcov, $ftot ]; } @fs = sort { ($a->[1] / $a->[2]) <=> ($b->[1] / $b->[2]) } @fs; foreach my $f (@fs) { printf("%s: %d/%d (%.2f%%)\n", $f->[0], $f->[1], $f->[2], 100 * $f->[1] / $f->[2]); } printf("$cov/$tot (%.2f%%)\n", ($cov / $tot) * 100); angband-v3.3.2/src/button.c0000644000175000017500000001324311651552410015060 0ustar chriscchrisc/* * File: mouse.c * Purpose: Mousebutton handling code * * Copyright (c) 2007 Nick McConnell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "button.h" /*** Constants ***/ /** * Maximum number of mouse buttons */ #define MAX_MOUSE_BUTTONS 20 /** * Maximum length of a mouse button label */ #define MAX_MOUSE_LABEL 10 /*** Types ***/ /** * Mouse button structure */ typedef struct { char label[MAX_MOUSE_LABEL]; /*!< Label on the button */ int left; /*!< Column containing the left edge of the button */ int right; /*!< Column containing the right edge of the button */ unsigned char key; /*!< Keypress corresponding to the button */ } button_mouse; /*** Variables ***/ static button_mouse *button_mse; static button_mouse *button_backup; static int button_start; static int button_length; static int button_num; /* * Hooks for making and unmaking buttons */ button_add_f button_add_hook; button_kill_f button_kill_hook; /*** Code ***/ /* * The mousebutton code. Buttons should be created when neccessary and * destroyed when no longer necessary. By default, buttons occupy the section * of the bottom line between the status display and the location display * in normal screen mode, and the bottom line after any prompt in alternate * screen mode. * * Individual ports may (and preferably will) handle this differently using * button_add_gui and button_kill_gui. */ /* * Add a button */ int button_add_text(const char *label, unsigned char keypress) { int i; int length = strlen(label); /* Check the label length */ if (length > MAX_MOUSE_LABEL) { bell("Label too long - button abandoned!"); return 0; } /* Check we haven't already got a button for this keypress */ for (i = 0; i < button_num; i++) if (button_mse[i].key == keypress) return 0; /* Make the button */ button_length += length; my_strcpy(button_mse[button_num].label, label, MAX_MOUSE_LABEL); button_mse[button_num].left = button_length - length + 1; button_mse[button_num].right = button_length; button_mse[button_num++].key = keypress; /* Redraw */ p_ptr->redraw |= (PR_BUTTONS); /* Return the size of the button */ return (length); } /* * Add a button */ int button_add(const char *label, unsigned char keypress) { if (!button_add_hook) return 0; else return (*button_add_hook) (label, keypress); } /* * Make a backup of the current buttons */ void button_backup_all(void) { /* Check we haven't already done this */ if (button_backup[0].key) return; /* Straight memory copy */ (void)C_COPY(button_backup, button_mse, MAX_MOUSE_BUTTONS, button_mouse); } /* * Restore the buttons from backup */ void button_restore(void) { int i = 0; /* Remove the current lot */ button_kill_all(); /* Get all the previous buttons, copy them back */ while (button_backup[i].key) { /* Add them all back, forget the backups */ button_add(button_backup[i].label, button_backup[i].key); button_backup[i].key = '\0'; i++; } } /* * Remove a button */ int button_kill_text(unsigned char keypress) { int i, j, length; /* Find the button */ for (i = 0; i < button_num; i++) if (button_mse[i].key == keypress) break; /* No such button */ if (i == button_num) { return 0; } /* Find the length */ length = button_mse[i].right - button_mse[i].left + 1; button_length -= length; /* Move each button up one */ for (j = i; j < button_num - 1; j++) { button_mse[j] = button_mse[j + 1]; /* Adjust length */ button_mse[j].left -= length; button_mse[j].right -= length; } /* Wipe the data */ button_mse[button_num].label[0] = '\0'; button_mse[button_num].left = 0; button_mse[button_num].right = 0; button_mse[button_num--].key = 0; /* Redraw */ p_ptr->redraw |= (PR_BUTTONS); redraw_stuff(p_ptr); /* Return the size of the button */ return (length); } /* * Kill a button */ int button_kill(unsigned char keypress) { if (!button_kill_hook) return 0; else return (*button_kill_hook) (keypress); } /* * Kill all buttons */ void button_kill_all(void) { int i; /* Paranoia */ if (!button_kill_hook) return; /* One by one */ for (i = button_num - 1; i >= 0; i--) (void)(*button_kill_hook) (button_mse[i].key); } /* * Initialise buttons. */ void button_init(button_add_f add, button_kill_f kill) { /* Prepare mouse button arrays */ button_mse = C_ZNEW(MAX_MOUSE_BUTTONS, button_mouse); button_backup = C_ZNEW(MAX_MOUSE_BUTTONS, button_mouse); /* Initialise the hooks */ button_add_hook = add; button_kill_hook = kill; } /* * Dispose of the button memory */ void button_free(void) { FREE(button_mse); FREE(button_backup); } /** * Return the character represented by a button at screen position (x, y), * or 0. */ char button_get_key(int x, int y) { int i; for (i = 0; i < button_num; i++) { if ((y == Term->hgt - 1) && (x >= button_start + button_mse[i].left) && (x <= button_start + button_mse[i].right)) { return button_mse[i].key; } } return 0; } /** * Print the current button list at the specified `row` and `col`umn. */ size_t button_print(int row, int col) { int j; button_start = col; for (j = 0; j < button_num; j++) c_put_str(TERM_SLATE, button_mse[j].label, row, col + button_mse[j].left); return button_length; } angband-v3.3.2/src/files.h0000644000175000017500000000124111651552410014647 0ustar chriscchrisc/* files.h - game file interface */ #ifndef FILES_H #define FILES_H extern void html_screenshot(const char *name, int mode); extern void player_flags(bitflag f[OF_SIZE]); extern void display_player(int mode); extern void display_player_stat_info(void); extern void display_player_xtra_info(void); extern errr file_character(const char *name, bool full); extern bool show_file(const char *name, const char *what, int line, int mode); extern void do_cmd_help(void); extern void process_player_name(bool sf); extern bool get_name(char *buf, size_t buflen); extern void save_game(void); extern void close_game(void); extern void exit_game_panic(void); #endif /* !FILES_H */ angband-v3.3.2/src/ui.h0000644000175000017500000000317211651552410014167 0ustar chriscchrisc/* * Copyright (c) 2007 Pete Mack and others * This code released under the Gnu Public License. See www.fsf.org * for current GPL license details. Addition permission granted to * incorporate modifications in all Angband variants as defined in the * Angband variants FAQ. See rec.games.roguelike.angband for FAQ. */ #ifndef INCLUDED_UI_H #define INCLUDED_UI_H /* ================== GEOMETRY ====================== */ /* Defines a rectangle on the screen that is bound to a Panel or subpanel */ typedef struct region region; struct region { int col; /* x-coordinate of upper right corner */ int row; /* y-coord of upper right coordinate */ int width; /* width of display area. 1 - use system default. */ /* non-positive - rel to right of screen */ int page_rows; /* non-positive value is relative to the bottom of the screen */ }; /* Region that defines the full screen */ static const region SCREEN_REGION = {0, 0, 0, 0}; /* Erase the contents of a region */ void region_erase(const region *loc); /* Erase the contents of a region + 1 char each way */ void region_erase_bordered(const region *loc); /* Given a region with relative values, make them absolute */ region region_calculate(region loc); /* Check whether a (mouse) event is inside a region */ bool region_inside(const region *loc, const ui_event *key); /*** Text ***/ #include "z-textblock.h" void textui_textblock_show(textblock *tb, region orig_area, const char *header); void textui_textblock_place(textblock *tb, region orig_area, const char *header); /*** Misc ***/ void window_make(int origin_x, int origin_y, int end_x, int end_y); #endif /* INCLUDED_UI_H */ angband-v3.3.2/src/cmd2.c0000644000175000017500000012041311651552410014370 0ustar chriscchrisc/* * File: cmd2.c * Purpose: Chest and door opening/closing, disarming, running, resting, &c. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "files.h" #include "game-cmd.h" #include "game-event.h" #include "generate.h" #include "monster/mon-timed.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "spells.h" #include "squelch.h" #include "trap.h" /* * Go up one level */ void do_cmd_go_up(cmd_code code, cmd_arg args[]) { /* Verify stairs */ if (cave->feat[p_ptr->py][p_ptr->px] != FEAT_LESS) { msg("I see no up staircase here."); return; } /* Ironman */ if (OPT(birth_ironman)) { msg("Nothing happens!"); return; } /* Hack -- take a turn */ p_ptr->energy_use = 100; /* Success */ msgt(MSG_STAIRS_UP, "You enter a maze of up staircases."); /* Create a way back */ p_ptr->create_up_stair = FALSE; p_ptr->create_down_stair = TRUE; /* Change level */ dungeon_change_level(p_ptr->depth - 1); } /* * Go down one level */ void do_cmd_go_down(cmd_code code, cmd_arg args[]) { /* Verify stairs */ if (cave->feat[p_ptr->py][p_ptr->px] != FEAT_MORE) { msg("I see no down staircase here."); return; } /* Hack -- take a turn */ p_ptr->energy_use = 100; /* Success */ msgt(MSG_STAIRS_DOWN, "You enter a maze of down staircases."); /* Create a way back */ p_ptr->create_up_stair = TRUE; p_ptr->create_down_stair = FALSE; /* Change level */ dungeon_change_level(p_ptr->depth + 1); } /* * Simple command to "search" for one turn */ void do_cmd_search(cmd_code code, cmd_arg args[]) { /* Only take a turn if attempted */ if (search(TRUE)) p_ptr->energy_use = 100; } /* * Hack -- toggle search mode */ void do_cmd_toggle_search(cmd_code code, cmd_arg args[]) { /* Stop searching */ if (p_ptr->searching) { /* Clear the searching flag */ p_ptr->searching = FALSE; /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Redraw the state */ p_ptr->redraw |= (PR_STATE); } /* Start searching */ else { /* Set the searching flag */ p_ptr->searching = TRUE; /* Update stuff */ p_ptr->update |= (PU_BONUS); /* Redraw stuff */ p_ptr->redraw |= (PR_STATE | PR_SPEED); } } /* * Determine if a grid contains a chest */ static s16b chest_check(int y, int x) { s16b this_o_idx, next_o_idx = 0; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Skip unknown chests XXX XXX */ /* if (!o_ptr->marked) continue; */ /* Check for chest */ if (o_ptr->tval == TV_CHEST) return (this_o_idx); } /* No chest */ return (0); } /* * Allocate objects upon opening a chest * * Disperse treasures from the given chest, centered at (x,y). * * Small chests often contain "gold", while Large chests always contain * items. Wooden chests contain 2 items, Iron chests contain 4 items, * and Steel chests contain 6 items. The "value" of the items in a * chest is based on the level on which the chest is generated. */ static void chest_death(int y, int x, s16b o_idx) { int number, value; bool tiny; object_type *o_ptr; object_type *i_ptr; object_type object_type_body; /* Get the chest */ o_ptr = object_byid(o_idx); /* Small chests often hold "gold" */ tiny = (o_ptr->sval < SV_CHEST_MIN_LARGE); /* Determine how much to drop (see above) */ number = (o_ptr->sval % SV_CHEST_MIN_LARGE) * 2; /* Zero pval means empty chest */ if (!o_ptr->pval[DEFAULT_PVAL]) number = 0; /* Determine the "value" of the items */ value = o_ptr->origin_depth - 10 + 2 * o_ptr->sval; if (value < 1) value = 1; /* Drop some objects (non-chests) */ for (; number > 0; --number) { /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Small chests often drop gold */ if (tiny && (randint0(100) < 75)) make_gold(i_ptr, value, SV_GOLD_ANY); /* Otherwise drop an item, as long as it isn't a chest */ else { if (!make_object(cave, i_ptr, value, FALSE, FALSE, NULL)) continue; if (i_ptr->tval == TV_CHEST) continue; } /* Record origin */ i_ptr->origin = ORIGIN_CHEST; i_ptr->origin_depth = o_ptr->origin_depth; /* Drop it in the dungeon */ drop_near(cave, i_ptr, 0, y, x, TRUE); } /* Empty */ o_ptr->pval[DEFAULT_PVAL] = 0; /* Known */ object_notice_everything(o_ptr); } /* * Chests have traps too. * * Exploding chest destroys contents (and traps). * Note that the chest itself is never destroyed. */ static void chest_trap(int y, int x, s16b o_idx) { int i, trap; object_type *o_ptr = object_byid(o_idx); /* Ignore disarmed chests */ if (o_ptr->pval[DEFAULT_PVAL] <= 0) return; /* Obtain the traps */ trap = chest_traps[o_ptr->pval[DEFAULT_PVAL]]; /* Lose strength */ if (trap & (CHEST_LOSE_STR)) { msg("A small needle has pricked you!"); take_hit(p_ptr, damroll(1, 4), "a poison needle"); (void)do_dec_stat(A_STR, FALSE); } /* Lose constitution */ if (trap & (CHEST_LOSE_CON)) { msg("A small needle has pricked you!"); take_hit(p_ptr, damroll(1, 4), "a poison needle"); (void)do_dec_stat(A_CON, FALSE); } /* Poison */ if (trap & (CHEST_POISON)) { msg("A puff of green gas surrounds you!"); (void)player_inc_timed(p_ptr, TMD_POISONED, 10 + randint1(20), TRUE, TRUE); } /* Paralyze */ if (trap & (CHEST_PARALYZE)) { msg("A puff of yellow gas surrounds you!"); (void)player_inc_timed(p_ptr, TMD_PARALYZED, 10 + randint1(20), TRUE, TRUE); } /* Summon monsters */ if (trap & (CHEST_SUMMON)) { int num = 2 + randint1(3); msg("You are enveloped in a cloud of smoke!"); sound(MSG_SUM_MONSTER); for (i = 0; i < num; i++) { (void)summon_specific(y, x, p_ptr->depth, 0, 1); } } /* Explode */ if (trap & (CHEST_EXPLODE)) { msg("There is a sudden explosion!"); msg("Everything inside the chest is destroyed!"); o_ptr->pval[DEFAULT_PVAL] = 0; take_hit(p_ptr, damroll(5, 8), "an exploding chest"); } } /* * Attempt to open the given chest at the given location * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_open_chest(int y, int x, s16b o_idx) { int i, j; bool flag = TRUE; bool more = FALSE; object_type *o_ptr = object_byid(o_idx); /* Attempt to unlock it */ if (o_ptr->pval[DEFAULT_PVAL] > 0) { /* Assume locked, and thus not open */ flag = FALSE; /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Extract the difficulty */ j = i - o_ptr->pval[DEFAULT_PVAL]; /* Always have a small chance of success */ if (j < 2) j = 2; /* Success -- May still have traps */ if (randint0(100) < j) { msgt(MSG_LOCKPICK, "You have picked the lock."); player_exp_gain(p_ptr, 1); flag = TRUE; } /* Failure -- Keep trying */ else { /* We may continue repeating */ more = TRUE; flush(); msgt(MSG_LOCKPICK_FAIL, "You failed to pick the lock."); } } /* Allowed to open */ if (flag) { /* Apply chest traps, if any */ chest_trap(y, x, o_idx); /* Let the Chest drop items */ chest_death(y, x, o_idx); /* Squelch chest if autosquelch calls for it */ p_ptr->notice |= PN_SQUELCH; /* Redraw chest, to be on the safe side (it may have been squelched) */ cave_light_spot(cave, y, x); } /* Result */ return (more); } /* * Attempt to disarm the chest at the given location * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_disarm_chest(int y, int x, s16b o_idx) { int i, j; bool more = FALSE; object_type *o_ptr = object_byid(o_idx); /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Extract the difficulty */ j = i - o_ptr->pval[DEFAULT_PVAL]; /* Always have a small chance of success */ if (j < 2) j = 2; /* Must find the trap first. */ if (!object_is_known(o_ptr)) { msg("I don't see any traps."); } /* Already disarmed/unlocked */ else if (o_ptr->pval[DEFAULT_PVAL] <= 0) { msg("The chest is not trapped."); } /* No traps to find. */ else if (!chest_traps[o_ptr->pval[DEFAULT_PVAL]]) { msg("The chest is not trapped."); } /* Success (get a lot of experience) */ else if (randint0(100) < j) { msgt(MSG_DISARM, "You have disarmed the chest."); player_exp_gain(p_ptr, o_ptr->pval[DEFAULT_PVAL]); o_ptr->pval[DEFAULT_PVAL] = (0 - o_ptr->pval[DEFAULT_PVAL]); } /* Failure -- Keep trying */ else if ((i > 5) && (randint1(i) > 5)) { /* We may keep trying */ more = TRUE; flush(); msg("You failed to disarm the chest."); } /* Failure -- Set off the trap */ else { msg("You set off a trap!"); chest_trap(y, x, o_idx); } /* Result */ return (more); } /* * Return the number of doors/traps around (or under) the character. */ int count_feats(int *y, int *x, bool (*test)(struct cave *cave, int y, int x), bool under) { int d; int xx, yy; int count = 0; /* Count how many matches */ /* Check around (and under) the character */ for (d = 0; d < 9; d++) { /* if not searching under player continue */ if ((d == 8) && !under) continue; /* Extract adjacent (legal) location */ yy = p_ptr->py + ddy_ddd[d]; xx = p_ptr->px + ddx_ddd[d]; /* Paranoia */ if (!in_bounds_fully(yy, xx)) continue; /* Must have knowledge */ if (!(cave->info[yy][xx] & (CAVE_MARK))) continue; /* Not looking for this feature */ if (!((*test)(cave, yy, xx))) continue; /* Count it */ ++count; /* Remember the location of the last door found */ *y = yy; *x = xx; } /* All done */ return count; } /* * Return the number of chests around (or under) the character. * If requested, count only trapped chests. */ int count_chests(int *y, int *x, bool trapped) { int d, count, o_idx; object_type *o_ptr; /* Count how many matches */ count = 0; /* Check around (and under) the character */ for (d = 0; d < 9; d++) { /* Extract adjacent (legal) location */ int yy = p_ptr->py + ddy_ddd[d]; int xx = p_ptr->px + ddx_ddd[d]; /* No (visible) chest is there */ if ((o_idx = chest_check(yy, xx)) == 0) continue; /* Grab the object */ o_ptr = object_byid(o_idx); /* Already open */ if (o_ptr->pval[DEFAULT_PVAL] == 0) continue; /* No (known) traps here */ if (trapped && (!object_is_known(o_ptr) || (o_ptr->pval[DEFAULT_PVAL] < 0) || !chest_traps[o_ptr->pval[DEFAULT_PVAL]])) { continue; } /* Count it */ ++count; /* Remember the location of the last chest found */ *y = yy; *x = xx; } /* All done */ return count; } /* * Extract a "direction" which will move one step from the player location * towards the given "target" location (or "5" if no motion necessary). */ int coords_to_dir(int y, int x) { return (motion_dir(p_ptr->py, p_ptr->px, y, x)); } /* * Determine if a given grid may be "opened" */ static bool do_cmd_open_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { msg("You see nothing there."); return FALSE; } if (!cave_iscloseddoor(cave, y, x)) { msgt(MSG_NOTHING_TO_OPEN, "You see nothing there to open."); return FALSE; } /* Okay */ return (TRUE); } /* * Perform the basic "open" command on doors * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_open_aux(int y, int x) { int i, j; bool more = FALSE; /* Verify legality */ if (!do_cmd_open_test(y, x)) return (FALSE); /* Jammed door */ if (cave_isjammeddoor(cave, y, x)) { msg("The door appears to be stuck."); } /* Locked door */ else if (cave_islockeddoor(cave, y, x)) { /* Disarm factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Extract the lock power */ j = cave->feat[y][x] - FEAT_DOOR_HEAD; /* Extract the difficulty XXX XXX XXX */ j = i - (j * 4); /* Always have a small chance of success */ if (j < 2) j = 2; /* Success */ if (randint0(100) < j) { /* Message */ msgt(MSG_LOCKPICK, "You have picked the lock."); /* Open the door */ cave_set_feat(cave, y, x, FEAT_OPEN); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Experience */ /* Removed to avoid exploit by repeatedly locking and unlocking door */ /* player_exp_gain(p_ptr, 1); */ } /* Failure */ else { flush(); /* Message */ msgt(MSG_LOCKPICK_FAIL, "You failed to pick the lock."); /* We may keep trying */ more = TRUE; } } /* Closed door */ else { /* Open the door */ cave_set_feat(cave, y, x, FEAT_OPEN); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Sound */ sound(MSG_OPENDOOR); } /* Result */ return (more); } /* * Open a closed/locked/jammed door or a closed/locked chest. * * Unlocking a locked door/chest is worth one experience point. */ void do_cmd_open(cmd_code code, cmd_arg args[]) { int y, x, dir; s16b o_idx; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chests */ o_idx = chest_check(y, x); /* Verify legality */ if (!o_idx && !do_cmd_open_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chest */ o_idx = chest_check(y, x); } /* Monster */ if (cave->m_idx[y][x] > 0) { int m_idx = cave->m_idx[y][x]; /* Mimics surprise the player */ if (is_mimicking(m_idx)) { become_aware(m_idx); /* Mimic wakes up */ mon_clear_timed(m_idx, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); } else { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } } /* Chest */ else if (o_idx) { /* Open the chest */ more = do_cmd_open_chest(y, x, o_idx); } /* Door */ else { /* Open the door */ more = do_cmd_open_aux(y, x); } /* Cancel repeat unless we may continue */ if (!more) disturb(p_ptr, 0, 0); } /* * Determine if a given grid may be "closed" */ static bool do_cmd_close_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { /* Message */ msg("You see nothing there."); /* Nope */ return (FALSE); } /* Require open/broken door */ if ((cave->feat[y][x] != FEAT_OPEN) && (cave->feat[y][x] != FEAT_BROKEN)) { /* Message */ msg("You see nothing there to close."); /* Nope */ return (FALSE); } /* Okay */ return (TRUE); } /* * Perform the basic "close" command * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_close_aux(int y, int x) { bool more = FALSE; /* Verify legality */ if (!do_cmd_close_test(y, x)) return (FALSE); /* Broken door */ if (cave->feat[y][x] == FEAT_BROKEN) { /* Message */ msg("The door appears to be broken."); } /* Open door */ else { /* Close the door */ cave_set_feat(cave, y, x, FEAT_DOOR_HEAD); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Sound */ sound(MSG_SHUTDOOR); } /* Result */ return (more); } /* * Close an open door. */ void do_cmd_close(cmd_code code, cmd_arg args[]) { int y, x, dir; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Verify legality */ if (!do_cmd_close_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave->m_idx[y][x] > 0) { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Door */ else { /* Close door */ more = do_cmd_close_aux(y, x); } /* Cancel repeat unless told not to */ if (!more) disturb(p_ptr, 0, 0); } /* * Determine if a given grid may be "tunneled" */ static bool do_cmd_tunnel_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { /* Message */ msg("You see nothing there."); /* Nope */ return (FALSE); } /* Must be a wall/door/etc */ if (cave_floor_bold(y, x)) { /* Message */ msg("You see nothing there to tunnel."); /* Nope */ return (FALSE); } /* Okay */ return (TRUE); } /* * Tunnel through wall. Assumes valid location. * * Note that it is impossible to "extend" rooms past their * outer walls (which are actually part of the room). * * Attempting to do so will produce floor grids which are not part * of the room, and whose "illumination" status do not change with * the rest of the room. */ static bool twall(int y, int x) { /* Paranoia -- Require a wall or door or some such */ if (cave_floor_bold(y, x)) return (FALSE); /* Sound */ sound(MSG_DIG); /* Forget the wall */ cave->info[y][x] &= ~(CAVE_MARK); /* Remove the feature */ cave_set_feat(cave, y, x, FEAT_FLOOR); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Result */ return (TRUE); } /* * Perform the basic "tunnel" command * * Assumes that no monster is blocking the destination * * Uses "twall" (above) to do all "terrain feature changing". * * Returns TRUE if repeated commands may continue */ static bool do_cmd_tunnel_aux(int y, int x) { bool more = FALSE; /* Verify legality */ if (!do_cmd_tunnel_test(y, x)) return (FALSE); /* Sound XXX XXX XXX */ /* sound(MSG_DIG); */ /* Titanium */ if (cave->feat[y][x] >= FEAT_PERM_EXTRA) { msg("This seems to be permanent rock."); } /* Granite */ else if (cave->feat[y][x] >= FEAT_WALL_EXTRA) { /* Tunnel */ if ((p_ptr->state.skills[SKILL_DIGGING] > 40 + randint0(1600)) && twall(y, x)) { msg("You have finished the tunnel."); } /* Keep trying */ else { /* We may continue tunelling */ msg("You tunnel into the granite wall."); more = TRUE; } } /* Quartz / Magma */ else if (cave->feat[y][x] >= FEAT_MAGMA) { bool okay = FALSE; bool gold = FALSE; bool hard = FALSE; /* Found gold */ if (cave->feat[y][x] >= FEAT_MAGMA_H) { gold = TRUE; } /* Extract "quartz" flag XXX XXX XXX */ if ((cave->feat[y][x] - FEAT_MAGMA) & 0x01) { hard = TRUE; } /* Quartz */ if (hard) { okay = (p_ptr->state.skills[SKILL_DIGGING] > 20 + randint0(800)); } /* Magma */ else { okay = (p_ptr->state.skills[SKILL_DIGGING] > 10 + randint0(400)); } /* Success */ if (okay && twall(y, x)) { /* Found treasure */ if (gold) { /* Place some gold */ place_gold(cave, y, x, p_ptr->depth, ORIGIN_FLOOR); /* Message */ msg("You have found something!"); } /* Found nothing */ else { /* Message */ msg("You have finished the tunnel."); } } /* Failure (quartz) */ else if (hard) { /* Message, continue digging */ msg("You tunnel into the quartz vein."); more = TRUE; } /* Failure (magma) */ else { /* Message, continue digging */ msg("You tunnel into the magma vein."); more = TRUE; } } /* Rubble */ else if (cave->feat[y][x] == FEAT_RUBBLE) { /* Remove the rubble */ if ((p_ptr->state.skills[SKILL_DIGGING] > randint0(200)) && twall(y, x)) { /* Message */ msg("You have removed the rubble."); /* Hack -- place an object */ if (randint0(100) < 10) { /* Create a simple object */ place_object(cave, y, x, p_ptr->depth, FALSE, FALSE, ORIGIN_RUBBLE); /* Observe the new object */ if (!squelch_item_ok(object_byid(cave->o_idx[y][x])) && player_can_see_bold(y, x)) msg("You have found something!"); } } else { /* Message, keep digging */ msg("You dig in the rubble."); more = TRUE; } } /* Secret doors */ else if (cave->feat[y][x] >= FEAT_SECRET) { /* Tunnel */ if ((p_ptr->state.skills[SKILL_DIGGING] > 30 + randint0(1200)) && twall(y, x)) { msg("You have finished the tunnel."); } /* Keep trying */ else { /* We may continue tunelling */ msg("You tunnel into the granite wall."); more = TRUE; /* Occasional Search XXX XXX */ if (randint0(100) < 25) search(FALSE); } } /* Doors */ else { /* Tunnel */ if ((p_ptr->state.skills[SKILL_DIGGING] > 30 + randint0(1200)) && twall(y, x)) { msg("You have finished the tunnel."); } /* Keep trying */ else { /* We may continue tunelling */ msg("You tunnel into the door."); more = TRUE; } } /* Result */ return (more); } /* * Tunnel through "walls" (including rubble and secret doors) * * Digging is very difficult without a "digger" weapon, but can be * accomplished by strong players using heavy weapons. */ void do_cmd_tunnel(cmd_code code, cmd_arg args[]) { int y, x, dir; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Oops */ if (!do_cmd_tunnel_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave->m_idx[y][x] > 0) { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Walls */ else { /* Tunnel through walls */ more = do_cmd_tunnel_aux(y, x); } /* Cancel repetition unless we can continue */ if (!more) disturb(p_ptr, 0, 0); } /* * Determine if a given grid may be "disarmed" */ static bool do_cmd_disarm_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { msg("You see nothing there."); return FALSE; } /* Look for a closed, unlocked door to lock */ if (cave->feat[y][x] == FEAT_DOOR_HEAD) return TRUE; /* Look for a trap */ if (!cave_isknowntrap(cave, y, x)) { msg("You see nothing there to disarm."); return FALSE; } /* Okay */ return TRUE; } /* * Perform the command "lock door" * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_lock_door(int y, int x) { int i, j, power; bool more = FALSE; /* Verify legality */ if (!do_cmd_disarm_test(y, x)) return FALSE; /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Calculate lock "power" */ power = m_bonus(7, p_ptr->depth); /* Extract the difficulty */ j = i - power; /* Always have a small chance of success */ if (j < 2) j = 2; /* Success */ if (randint0(100) < j) { msg("You lock the door."); cave_set_feat(cave, y, x, FEAT_DOOR_HEAD + power); } /* Failure -- Keep trying */ else if ((i > 5) && (randint1(i) > 5)) { flush(); msg("You failed to lock the door."); /* We may keep trying */ more = TRUE; } /* Failure */ else msg("You failed to lock the door."); /* Result */ return more; } /* * Perform the basic "disarm" command * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_disarm_aux(int y, int x) { int i, j, power; const char *name; bool more = FALSE; /* Verify legality */ if (!do_cmd_disarm_test(y, x)) return (FALSE); /* Get the trap name */ name = f_info[cave->feat[y][x]].name; /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* XXX XXX XXX Variable power? */ /* Extract trap "power" */ power = 5; /* Extract the difficulty */ j = i - power; /* Always have a small chance of success */ if (j < 2) j = 2; /* Success */ if (randint0(100) < j) { /* Message */ msgt(MSG_DISARM, "You have disarmed the %s.", name); /* Reward */ player_exp_gain(p_ptr, power); /* Forget the trap */ cave->info[y][x] &= ~(CAVE_MARK); /* Remove the trap */ cave_set_feat(cave, y, x, FEAT_FLOOR); } /* Failure -- Keep trying */ else if ((i > 5) && (randint1(i) > 5)) { flush(); /* Message */ msg("You failed to disarm the %s.", name); /* We may keep trying */ more = TRUE; } /* Failure -- Set off the trap */ else { /* Message */ msg("You set off the %s!", name); /* Hit the trap */ hit_trap(y, x); } /* Result */ return (more); } /* * Disarms a trap, or a chest */ void do_cmd_disarm(cmd_code code, cmd_arg args[]) { int y, x, dir; s16b o_idx; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chests */ o_idx = chest_check(y, x); /* Verify legality */ if (!o_idx && !do_cmd_disarm_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chests */ o_idx = chest_check(y, x); } /* Monster */ if (cave->m_idx[y][x] > 0) { msg("There is a monster in the way!"); py_attack(y, x); } /* Chest */ else if (o_idx) more = do_cmd_disarm_chest(y, x, o_idx); /* Door to lock */ else if (cave->feat[y][x] == FEAT_DOOR_HEAD) more = do_cmd_lock_door(y, x); /* Disarm trap */ else more = do_cmd_disarm_aux(y, x); /* Cancel repeat unless told not to */ if (!more) disturb(p_ptr, 0, 0); } /* * Determine if a given grid may be "bashed" */ static bool do_cmd_bash_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { msg("You see nothing there."); return (FALSE); } if (!cave_iscloseddoor(cave, y, x)) { msg("You see nothing there to bash."); return FALSE; } /* Okay */ return (TRUE); } /* * Perform the basic "bash" command * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_bash_aux(int y, int x) { int bash, temp; bool more = FALSE; /* Verify legality */ if (!do_cmd_bash_test(y, x)) return (FALSE); /* Message */ msg("You smash into the door!"); /* Hack -- Bash power based on strength */ /* (Ranges from 3 to 20 to 100 to 200) */ bash = adj_str_blow[p_ptr->state.stat_ind[A_STR]]; /* Extract door power */ temp = ((cave->feat[y][x] - FEAT_DOOR_HEAD) & 0x07); /* Compare bash power to door power */ temp = (bash - (temp * 10)); /* Hack -- always have a chance */ if (temp < 1) temp = 1; /* Hack -- attempt to bash down the door */ if (randint0(100) < temp) { /* Break down the door */ if (randint0(100) < 50) { cave_set_feat(cave, y, x, FEAT_BROKEN); } /* Open the door */ else { cave_set_feat(cave, y, x, FEAT_OPEN); } msgt(MSG_OPENDOOR, "The door crashes open!"); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); } /* Saving throw against stun */ else if (randint0(100) < adj_dex_safe[p_ptr->state.stat_ind[A_DEX]] + p_ptr->lev) { msg("The door holds firm."); /* Allow repeated bashing */ more = TRUE; } /* Low dexterity has bad consequences */ else { msg("You are off-balance."); /* Lose balance ala stun */ (void)player_inc_timed(p_ptr, TMD_STUN, 2 + randint0(2), TRUE, FALSE); } /* Result */ return more; } /* * Bash open a door, success based on character strength * * For a closed door, pval is positive if locked; negative if stuck. * * For an open door, pval is positive for a broken door. * * A closed door can be opened - harder if locked. Any door might be * bashed open (and thereby broken). Bashing a door is (potentially) * faster! You move into the door way. To open a stuck door, it must * be bashed. A closed door can be jammed (see do_cmd_spike()). * * Creatures can also open or bash doors, see elsewhere. */ void do_cmd_bash(cmd_code code, cmd_arg args[]) { int y, x, dir; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Verify legality */ if (!do_cmd_bash_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave->m_idx[y][x] > 0) { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Door */ else { /* Bash the door */ more = do_cmd_bash_aux(y, x); } /* Cancel repeat unless we may continue */ if (!more) disturb(p_ptr, 0, 0); } /* * Manipulate an adjacent grid in some way * * Attack monsters, tunnel through walls, disarm traps, open doors. * * This command must always take energy, to prevent free detection * of invisible monsters. * * The "semantics" of this command must be chosen before the player * is confused, and it must be verified against the new grid. */ void do_cmd_alter_aux(int dir) { int y, x; bool more = FALSE; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Attack monsters */ if (cave->m_idx[y][x] > 0) py_attack(y, x); /* Tunnel through walls and rubble */ else if (cave_isdiggable(cave, y, x)) more = do_cmd_tunnel_aux(y, x); /* Open closed doors */ else if (cave_iscloseddoor(cave, y, x)) more = do_cmd_open_aux(y, x); /* Disarm traps */ else if (cave_isknowntrap(cave, y, x)) more = do_cmd_disarm_aux(y, x); /* Oops */ else msg("You spin around."); /* Cancel repetition unless we can continue */ if (!more) disturb(p_ptr, 0, 0); } void do_cmd_alter(cmd_code code, cmd_arg args[]) { do_cmd_alter_aux(args[0].direction); } /* * Find the index of some "spikes", if possible. * * XXX XXX XXX Let user choose a pile of spikes, perhaps? */ static bool get_spike(int *ip) { int i; /* Check every item in the pack */ for (i = 0; i < INVEN_PACK; i++) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Check the "tval" code */ if (o_ptr->tval == TV_SPIKE) { /* Save the spike index */ (*ip) = i; /* Success */ return (TRUE); } } /* Oops */ return (FALSE); } /* * Determine if a given grid may be "spiked" */ static bool do_cmd_spike_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { msg("You see nothing there."); return FALSE; } /* Check if door is closed */ if (!cave_iscloseddoor(cave, y, x)) { msg("You see nothing there to spike."); return FALSE; } /* Check that the door is not fully spiked */ if (!(cave->feat[y][x] < FEAT_DOOR_TAIL)) { msg("You can't use more spikes on this door."); return FALSE; } /* Okay */ return TRUE; } /* * Jam a closed door with a spike * * This command may NOT be repeated */ void do_cmd_spike(cmd_code code, cmd_arg args[]) { int y, x, dir, item = 0; dir = args[0].direction; /* Get a spike */ if (!get_spike(&item)) { /* Message */ msg("You have no spikes!"); /* Done */ return; } /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Verify legality */ if (!do_cmd_spike_test(y, x)) return; /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave->m_idx[y][x] > 0) { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Go for it */ else { /* Verify legality */ if (!do_cmd_spike_test(y, x)) return; /* Successful jamming */ msg("You jam the door with a spike."); /* Convert "locked" to "stuck" XXX XXX XXX */ if (cave->feat[y][x] < FEAT_DOOR_HEAD + 0x08) cave->feat[y][x] += 0x08; /* Add one spike to the door */ if (cave->feat[y][x] < FEAT_DOOR_TAIL) cave->feat[y][x] += 0x01; /* Use up, and describe, a single spike, from the bottom */ inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } } /* * Determine if a given grid may be "walked" */ static bool do_cmd_walk_test(int y, int x) { int m_idx = cave->m_idx[y][x]; /* Allow attack on visible monsters if unafraid */ if ((m_idx > 0) && (cave_monster(cave, m_idx)->ml) && !is_mimicking(m_idx)) { /* Handle player fear */ if(check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) { /* Extract monster name (or "it") */ char m_name[80]; const monster_type *m_ptr; m_ptr = cave_monster(cave, m_idx); monster_desc(m_name, sizeof(m_name), m_ptr, 0); /* Message */ msgt(MSG_AFRAID, "You are too afraid to attack %s!", m_name); /* Nope */ return (FALSE); } return (TRUE); } /* If we don't know the grid, allow attempts to walk into it */ if (!(cave->info[y][x] & CAVE_MARK)) return TRUE; /* Require open space */ if (!cave_floor_bold(y, x)) { /* Rubble */ if (cave->feat[y][x] == FEAT_RUBBLE) msgt(MSG_HITWALL, "There is a pile of rubble in the way!"); /* Door */ else if (cave->feat[y][x] < FEAT_SECRET) return TRUE; /* Wall */ else msgt(MSG_HITWALL, "There is a wall in the way!"); /* Cancel repeat */ disturb(p_ptr, 0, 0); /* Nope */ return (FALSE); } /* Okay */ return (TRUE); } /* * Walk in the given direction. */ void do_cmd_walk(cmd_code code, cmd_arg args[]) { int x, y; int dir = args[0].direction; /* Apply confusion if necessary */ player_confuse_dir(p_ptr, &dir, FALSE); /* Confused movements use energy no matter what */ if (dir != args[0].direction) p_ptr->energy_use = 100; /* Verify walkability */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; if (!do_cmd_walk_test(y, x)) return; p_ptr->energy_use = 100; move_player(dir, TRUE); } /* * Walk into a trap. */ void do_cmd_jump(cmd_code code, cmd_arg args[]) { int x, y; int dir = args[0].direction; /* Apply confusion if necessary */ player_confuse_dir(p_ptr, &dir, FALSE); /* Verify walkability */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; if (!do_cmd_walk_test(y, x)) return; p_ptr->energy_use = 100; move_player(dir, FALSE); } /* * Start running. * * Note that running while confused is not allowed. */ void do_cmd_run(cmd_code code, cmd_arg args[]) { int x, y; int dir = args[0].direction; if (player_confuse_dir(p_ptr, &dir, TRUE)) { return; } /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; if (!do_cmd_walk_test(y, x)) return; /* Start run */ run_step(dir); } /* * Start running with pathfinder. * * Note that running while confused is not allowed. */ void do_cmd_pathfind(cmd_code code, cmd_arg args[]) { /* Hack XXX XXX XXX */ int dir = 5; if (player_confuse_dir(p_ptr, &dir, TRUE)) { return; } if (findpath(args[0].point.x, args[0].point.y)) { p_ptr->running = 1000; /* Calculate torch radius */ p_ptr->update |= (PU_TORCH); p_ptr->running_withpathfind = TRUE; run_step(0); } } /* * Stay still. Search. Enter stores. * Pick up treasure if "pickup" is true. */ void do_cmd_hold(cmd_code code, cmd_arg args[]) { /* Take a turn */ p_ptr->energy_use = 100; /* Spontaneous Searching */ if ((p_ptr->state.skills[SKILL_SEARCH_FREQUENCY] >= 50) || one_in_(50 - p_ptr->state.skills[SKILL_SEARCH_FREQUENCY])) { search(FALSE); } /* Continuous Searching */ if (p_ptr->searching) { search(FALSE); } /* Pick things up, not using extra energy */ do_autopickup(); /* Hack -- enter a store if we are on one */ if ((cave->feat[p_ptr->py][p_ptr->px] >= FEAT_SHOP_HEAD) && (cave->feat[p_ptr->py][p_ptr->px] <= FEAT_SHOP_TAIL)) { /* Disturb */ disturb(p_ptr, 0, 0); cmd_insert(CMD_ENTER_STORE); /* Free turn XXX XXX XXX */ p_ptr->energy_use = 0; } else { event_signal(EVENT_SEEFLOOR); } } /* * Pick up objects on the floor beneath you. -LM- */ void do_cmd_pickup(cmd_code code, cmd_arg args[]) { int energy_cost; /* Pick up floor objects, forcing a menu for multiple objects. */ energy_cost = py_pickup(1) * 10; /* Charge this amount of energy. */ p_ptr->energy_use = energy_cost; } /* * Pick up objects on the floor beneath you. -LM- */ void do_cmd_autopickup(cmd_code code, cmd_arg args[]) { p_ptr->energy_use = do_autopickup() * 10; } /* * Rest (restores hit points and mana and such) */ void do_cmd_rest(cmd_code code, cmd_arg args[]) { /* * A little sanity checking on the input - only the specified negative * values are valid. */ if ((args[0].choice < 0) && ((args[0].choice != REST_COMPLETE) && (args[0].choice != REST_ALL_POINTS) && (args[0].choice != REST_SOME_POINTS))) { return; } /* Save the rest code */ p_ptr->resting = args[0].choice; /* Truncate overlarge values */ if (p_ptr->resting > 9999) p_ptr->resting = 9999; /* Take a turn XXX XXX XXX (?) */ p_ptr->energy_use = 100; /* Cancel searching */ p_ptr->searching = FALSE; /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Redraw the state */ p_ptr->redraw |= (PR_STATE); /* Handle stuff */ handle_stuff(p_ptr); /* Refresh XXX XXX XXX */ Term_fresh(); } void textui_cmd_rest(void) { /* Prompt for time if needed */ if (p_ptr->command_arg <= 0) { const char *p = "Rest (0-9999, '!' for HP or SP, '*' for HP and SP, '&' as needed): "; char out_val[5] = "& "; /* Ask for duration */ if (!get_string(p, out_val, sizeof(out_val))) return; /* Rest until done */ if (out_val[0] == '&') { cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, REST_COMPLETE); } /* Rest a lot */ else if (out_val[0] == '*') { cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, REST_ALL_POINTS); } /* Rest until HP or SP filled */ else if (out_val[0] == '!') { cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, REST_SOME_POINTS); } /* Rest some */ else { int turns = atoi(out_val); if (turns <= 0) return; if (turns > 9999) turns = 9999; cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, turns); } } } /* * Hack -- commit suicide */ void do_cmd_suicide(cmd_code code, cmd_arg args[]) { /* Commit suicide */ p_ptr->is_dead = TRUE; /* Stop playing */ p_ptr->playing = FALSE; /* Leaving */ p_ptr->leaving = TRUE; /* Cause of death */ my_strcpy(p_ptr->died_from, "Quitting", sizeof(p_ptr->died_from)); } void textui_cmd_suicide(void) { /* Flush input */ flush(); /* Verify Retirement */ if (p_ptr->total_winner) { /* Verify */ if (!get_check("Do you want to retire? ")) return; } /* Verify Suicide */ else { struct keypress ch; /* Verify */ if (!get_check("Do you really want to commit suicide? ")) return; /* Special Verification for suicide */ prt("Please verify SUICIDE by typing the '@' sign: ", 0, 0); flush(); ch = inkey(); prt("", 0, 0); if (ch.code != '@') return; } cmd_insert(CMD_SUICIDE); } void do_cmd_save_game(cmd_code code, cmd_arg args[]) { save_game(); } angband-v3.3.2/src/pathfind.h0000644000175000017500000000025211651552410015343 0ustar chriscchrisc/* pathfind.h */ #ifndef PATHFIND_H #define PATHFIND_H #include "z-type.h" extern int pathfind_direction_to(struct loc from, struct loc to); #endif /* !PATHFIND_H */ angband-v3.3.2/src/cmd-misc.c0000644000175000017500000000655411651552410015250 0ustar chriscchrisc/* * File: cmd-misc.c * Purpose: Deal with miscellaneous commands. * * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "game-cmd.h" #include "monster/mon-util.h" #include "wizard.h" /* * Toggle wizard mode */ void do_cmd_wizard(void) { /* Verify first time */ if (!(p_ptr->noscore & NOSCORE_WIZARD)) { /* Mention effects */ msg("You are about to enter 'wizard' mode for the very first time!"); msg("This is a form of cheating, and your game will not be scored!"); message_flush(); /* Verify request */ if (!get_check("Are you sure you want to enter wizard mode? ")) return; /* Mark savefile */ p_ptr->noscore |= NOSCORE_WIZARD; } /* Toggle mode */ if (p_ptr->wizard) { p_ptr->wizard = FALSE; msg("Wizard mode off."); } else { p_ptr->wizard = TRUE; msg("Wizard mode on."); } /* Update monsters */ p_ptr->update |= (PU_MONSTERS); /* Redraw "title" */ p_ptr->redraw |= (PR_TITLE); } #ifdef ALLOW_DEBUG /* * Verify use of "debug" mode */ void do_cmd_try_debug(void) { /* Ask first time */ if (!(p_ptr->noscore & NOSCORE_DEBUG)) { /* Mention effects */ msg("You are about to use the dangerous, unsupported, debug commands!"); msg("Your machine may crash, and your savefile may become corrupted!"); message_flush(); /* Verify request */ if (!get_check("Are you sure you want to use the debug commands? ")) return; /* Mark savefile */ p_ptr->noscore |= NOSCORE_DEBUG; } /* Okay */ do_cmd_debug(); } #endif /* ALLOW_DEBUG */ #ifdef ALLOW_BORG /* * Verify use of "borg" mode */ void do_cmd_try_borg(void) { /* Ask first time */ if (!(p_ptr->noscore & NOSCORE_BORG)) { /* Mention effects */ msg("You are about to use the dangerous, unsupported, borg commands!"); msg("Your machine may crash, and your savefile may become corrupted!"); message_flush(); /* Verify request */ if (!get_check("Are you sure you want to use the borg commands? ")) return; /* Mark savefile */ p_ptr->noscore |= NOSCORE_BORG; } /* Okay */ do_cmd_borg(); } #endif /* ALLOW_BORG */ /* * Quit the game. */ void do_cmd_quit(cmd_code code, cmd_arg args[]) { /* Stop playing */ p_ptr->playing = FALSE; /* Leaving */ p_ptr->leaving = TRUE; } /* * Display the options and redraw afterward. */ void do_cmd_xxx_options(void) { do_cmd_options(); do_cmd_redraw(); } /* * Display the main-screen monster list. */ void do_cmd_monlist(void) { /* Save the screen and display the list */ screen_save(); display_monlist(); /* Wait */ anykey(); /* Return */ screen_load(); } /* * Display the main-screen item list. */ void do_cmd_itemlist(void) { /* Save the screen and display the list */ screen_save(); display_itemlist(); /* Wait */ anykey(); /* Return */ screen_load(); } /* * Invoked when the command isn't recognised. */ void do_cmd_unknown(void) { prt("Type '?' for help.", 0, 0); } angband-v3.3.2/src/savefile.h0000644000175000017500000000433611651552410015353 0ustar chriscchrisc#ifndef INCLUDED_SAVEFILE_H #define INCLUDED_SAVEFILE_H #define ITEM_VERSION 5 /*** Savefile API ***/ /** * Load the savefile given. Returns TRUE on succcess, FALSE otherwise. */ bool savefile_load(const char *path); /** * Save to the given location. Returns TRUE on success, FALSE otherwise. */ bool savefile_save(const char *path); /*** Ignore these ***/ /* Utility */ void note(const char *msg); /* Writing bits */ void wr_byte(byte v); void wr_u16b(u16b v); void wr_s16b(s16b v); void wr_u32b(u32b v); void wr_s32b(s32b v); void wr_string(const char *str); void pad_bytes(int n); /* Reading bits */ void rd_byte(byte *ip); void rd_u16b(u16b *ip); void rd_s16b(s16b *ip); void rd_u32b(u32b *ip); void rd_s32b(s32b *ip); void rd_string(char *str, int max); void strip_bytes(int n); /* load.c */ int rd_randomizer(void); int rd_options_1(void); int rd_options_2(void); int rd_messages(void); int rd_monster_memory_1(void); int rd_monster_memory_2(void); int rd_object_memory(void); int rd_quests(void); int rd_artifacts(void); int rd_player(void); int rd_squelch(void); int rd_misc(void); int rd_misc_2(void); int rd_player_hp(void); int rd_player_spells(void); int rd_randarts_1(void); int rd_randarts_2(void); int rd_inventory_1(void); int rd_inventory_2(void); int rd_inventory_3(void); int rd_inventory_4(void); int rd_stores_1(void); int rd_stores_2(void); int rd_stores_3(void); int rd_stores_4(void); int rd_dungeon(void); int rd_objects_1(void); int rd_objects_2(void); int rd_objects_3(void); int rd_objects_4(void); int rd_monsters_1(void); int rd_monsters_2(void); int rd_monsters_3(void); int rd_monsters_4(void); int rd_monsters_5(void); int rd_monsters_6(void); int rd_ghost(void); int rd_history(void); /* save.c */ void wr_randomizer(void); void wr_options(void); void wr_messages(void); void wr_monster_memory(void); void wr_object_memory(void); void wr_quests(void); void wr_artifacts(void); void wr_player(void); void wr_squelch(void); void wr_misc(void); void wr_player_hp(void); void wr_player_spells(void); void wr_randarts(void); void wr_inventory(void); void wr_stores(void); void wr_dungeon(void); void wr_objects(void); void wr_monsters(void); void wr_ghost(void); void wr_history(void); #endif /* INCLUDED_SAVEFILE_H */ angband-v3.3.2/src/history.c0000644000175000017500000002652211651552410015252 0ustar chriscchrisc/* * File: history.c * Purpose: Character auto-history creation, management, and display * * Copyright (c) 2007 J.D. White * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "history.h" /* * Number of slots available at birth in the player history list. Defaults to * 10 and will expand automatically as new history entries are added, up the * the maximum defined value. */ #define HISTORY_BIRTH_SIZE 10 #define HISTORY_MAX 5000 /* The historical list for the character */ history_info *history_list; /* Index of first writable entry */ static size_t history_ctr; /* Current size of history list */ static size_t history_size; #define LIMITLOW(a, b) if (a < b) a = b; #define LIMITHI(a, b) if (a > b) a = b; /* * Initialise an empty history list. */ static void history_init(size_t entries) { history_ctr = 0; history_size = entries; history_list = C_ZNEW(history_size, history_info); } /* * Clear any existing history. */ void history_clear(void) { if (!history_list) return; FREE(history_list); history_ctr = 0; history_size = 0; } /* * Set the number of history items. */ static bool history_set_num(size_t num) { history_info *new_list; if (num > HISTORY_MAX) num = HISTORY_MAX; if (num < history_size) return FALSE; if (num == history_size) return FALSE; /* Allocate new memory, copy across */ /* XXX Should use mem_realloc() */ new_list = C_ZNEW(num, history_info); C_COPY(new_list, history_list, history_ctr, history_info); FREE(history_list); history_list = new_list; history_size = num; return TRUE; } /* * Return the number of history entries. */ size_t history_get_num(void) { return history_ctr; } /* * Mark artifact number `id` as known. */ static bool history_know_artifact(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { if (history_list[i].a_idx == artifact->aidx) { history_list[i].type = HISTORY_ARTIFACT_KNOWN; return TRUE; } } return FALSE; } /* * Mark artifact number `id` as lost forever, either due to leaving it on a * level, or due to a store purging its inventory after the player sold it. */ bool history_lose_artifact(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { if (history_list[i].a_idx == artifact->aidx) { history_list[i].type |= HISTORY_ARTIFACT_LOST; return TRUE; } } /* If we lost an artifact that didn't previously have a history, then we missed it */ history_add_artifact(artifact, FALSE, FALSE); return FALSE; } /* * Add an entry with text `event` to the history list, with type `type` * ("HISTORY_xxx" in defines.h), and artifact number `id` (0 for everything * else). * * Return TRUE on success. */ bool history_add_full(u16b type, struct artifact *artifact, s16b dlev, s16b clev, s32b turn, const char *text) { /* Allocate the history list if needed */ if (!history_list) history_init(HISTORY_BIRTH_SIZE); /* Expand the history list if appropriate */ else if ((history_ctr == history_size) && !history_set_num(history_size + 10)) return FALSE; /* History list exists and is not full. Add an entry at the current counter location. */ history_list[history_ctr].type = type; history_list[history_ctr].dlev = dlev; history_list[history_ctr].clev = clev; history_list[history_ctr].a_idx = artifact ? artifact->aidx : 0; history_list[history_ctr].turn = turn; my_strcpy(history_list[history_ctr].event, text, sizeof(history_list[history_ctr].event)); history_ctr++; return TRUE; } /* * Add an entry with text `event` to the history list, with type `type` * ("HISTORY_xxx" in defines.h), and artifact number `id` (0 for everything * else). * * Returne TRUE on success. */ bool history_add(const char *event, u16b type, struct artifact *artifact) { return history_add_full(type, artifact, p_ptr->depth, p_ptr->lev, turn, event); } /* * Returns TRUE if the artifact denoted by a_idx is KNOWN in the history log. */ bool history_is_artifact_known(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { if (history_list[i].type & HISTORY_ARTIFACT_KNOWN && history_list[i].a_idx == artifact->aidx) return TRUE; } return FALSE; } /* * Returns TRUE if the artifact denoted by a_idx is an active entry in * the history log (i.e. is not marked HISTORY_ARTIFACT_LOST). This permits * proper handling of the case where the player loses an artifact but (in * preserve mode) finds it again later. */ static bool history_is_artifact_logged(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { /* Don't count ARTIFACT_LOST entries; then we can handle * re-finding previously lost artifacts in preserve mode */ if (history_list[i].type & HISTORY_ARTIFACT_LOST) continue; if (history_list[i].a_idx == artifact->aidx) return TRUE; } return FALSE; } /* * Adding artifacts to the history list is trickier than other operations. * This is a wrapper function that gets some of the logic out of places * where it really doesn't belong. Call this to add an artifact to the history * list or make the history entry visible--history_add_artifact will make that * determination depending on what object_is_known returns for the artifact. */ bool history_add_artifact(struct artifact *artifact, bool known, bool found) { object_type object_type_body; object_type *o_ptr = &object_type_body; char o_name[80]; char buf[80]; u16b type; assert(artifact); /* Make fake artifact for description purposes */ object_wipe(o_ptr); make_fake_artifact(o_ptr, artifact); object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_BASE | ODESC_SPOIL); strnfmt(buf, sizeof(buf), (found)?"Found %s":"Missed %s", o_name); /* Known objects gets different treatment */ if (known) { /* Try revealing any existing artifact, otherwise log it */ if (history_is_artifact_logged(artifact)) history_know_artifact(artifact); else history_add(buf, HISTORY_ARTIFACT_KNOWN, artifact); } else { if (!history_is_artifact_logged(artifact)) { type = HISTORY_ARTIFACT_UNKNOWN | (found ? 0 : HISTORY_ARTIFACT_LOST); history_add(buf, type, artifact); } else { return FALSE; } } return TRUE; } /* * Convert all ARTIFACT_UNKNOWN history items to HISTORY_ARTIFACT_KNOWN. * Use only after player retirement/death for the final character dump. */ void history_unmask_unknown(void) { size_t i = history_ctr; while (i--) { if (history_list[i].type & HISTORY_ARTIFACT_UNKNOWN) { history_list[i].type &= ~(HISTORY_ARTIFACT_UNKNOWN); history_list[i].type |= HISTORY_ARTIFACT_KNOWN; } } } /* * Used to determine whether the history entry is visible in the listing or not. * Returns TRUE if the item is masked -- that is, if it is invisible * * All artifacts are now sensed on pickup, so nothing is now invisible. The * KNOWN / UNKNOWN distinction is if we had fully identified it or not */ static bool history_masked(size_t i) { return FALSE; } /* * Finds the index of the last printable (non-masked) item in the history list. */ static size_t last_printable_item(void) { size_t i = history_ctr; while (i--) { if (!history_masked(i)) break; } return i; } static void print_history_header(void) { char buf[80]; /* Print the header (character name and title) */ strnfmt(buf, sizeof(buf), "%s the %s %s", op_ptr->full_name, p_ptr->race->name, p_ptr->class->name); c_put_str(TERM_WHITE, buf, 0, 0); c_put_str(TERM_WHITE, "============================================================", 1, 0); c_put_str(TERM_WHITE, " CHAR. ", 2, 0); c_put_str(TERM_WHITE, "| TURN | DEPTH |LEVEL| EVENT", 3, 0); c_put_str(TERM_WHITE, "============================================================", 4, 0); } /* Handles all of the display functionality for the history list. */ void history_display(void) { int row, wid, hgt, page_size; char buf[90]; static size_t first_item = 0; size_t max_item = last_printable_item(); size_t i; Term_get_size(&wid, &hgt); /* Six lines provide space for the header and footer */ page_size = hgt - 6; screen_save(); while (1) { struct keypress ch; Term_clear(); /* Print everything to screen */ print_history_header(); row = 0; for (i = first_item; row <= page_size && i < history_ctr; i++) { /* Skip messages about artifacts not yet IDed. */ if (history_masked(i)) continue; strnfmt(buf, sizeof(buf), "%10d%7d\'%5d %s", history_list[i].turn, history_list[i].dlev * 50, history_list[i].clev, history_list[i].event); if (history_list[i].type & HISTORY_ARTIFACT_LOST) my_strcat(buf, " (LOST)", sizeof(buf)); /* Size of header = 5 lines */ prt(buf, row + 5, 0); row++; } prt("[Arrow keys scroll, p for previous page, n for next page, ESC to exit.]", hgt - 1, 0); ch = inkey(); /* XXXmacro we should have a generic "key -> scroll" function */ if (ch.code == 'n') { size_t scroll_to = first_item + page_size; while (history_masked(scroll_to) && scroll_to < history_ctr - 1) scroll_to++; first_item = (scroll_to < max_item ? scroll_to : max_item); } else if (ch.code == 'p') { int scroll_to = first_item - page_size; while (history_masked(scroll_to) && scroll_to > 0) scroll_to--; first_item = (scroll_to >= 0 ? scroll_to : 0); } else if (ch.code == ARROW_DOWN) { size_t scroll_to = first_item + 1; while (history_masked(scroll_to) && scroll_to < history_ctr - 1) scroll_to++; first_item = (scroll_to < max_item ? scroll_to : max_item); } else if (ch.code == ARROW_UP) { int scroll_to = first_item - 1; while (history_masked(scroll_to) && scroll_to > 0) scroll_to--; first_item = (scroll_to >= 0 ? scroll_to : 0); } else if (ch.code == ESCAPE) break; } screen_load(); return; } /* Dump character history to a file, which we assume is already open. */ void dump_history(ang_file *file) { size_t i; char buf[90]; /* We use either ascii or system-specific encoding */ int encoding = OPT(xchars_to_file) ? SYSTEM_SPECIFIC : ASCII; file_putf(file, "============================================================\n"); file_putf(file, " CHAR.\n"); file_putf(file, "| TURN | DEPTH |LEVEL| EVENT\n"); file_putf(file, "============================================================\n"); for (i = 0; i < (last_printable_item() + 1); i++) { /* Skip not-yet-IDd artifacts */ if (history_masked(i)) continue; strnfmt(buf, sizeof(buf), "%10d%7d\'%5d %s", history_list[i].turn, history_list[i].dlev * 50, history_list[i].clev, history_list[i].event); if (history_list[i].type & HISTORY_ARTIFACT_LOST) my_strcat(buf, " (LOST)", sizeof(buf)); x_file_putf(file, encoding, "%s", buf); file_put(file, "\n"); } return; } angband-v3.3.2/src/wizard.h0000644000175000017500000000042411651552410015047 0ustar chriscchrisc#ifndef INCLUDED_WIZARD_H #define INCLUDED_WIZARD_H /* wizard.c */ extern void do_cmd_debug(void); /* wiz-stats.c */ void stats_collect(void); void disconnect_stats(void); void pit_stats(void); /* wiz-spoil.c */ void do_cmd_spoilers(void); #endif /* !INCLUDED_WIZARD_H */ angband-v3.3.2/src/history.h0000644000175000017500000000121611651552410015250 0ustar chriscchrisc/* history.h - player history tracking */ #ifndef HISTORY_H #define HISTORY_H void history_clear(void); size_t history_get_num(void); bool history_add_full(u16b type, struct artifact *artifact, s16b dlev, s16b clev, s32b turn, const char *text); bool history_add(const char *event, u16b type, struct artifact *art); bool history_add_artifact(struct artifact *art, bool known, bool found); void history_unmask_unknown(void); bool history_lose_artifact(struct artifact *art); void history_display(void); void dump_history(ang_file *file); bool history_is_artifact_known(struct artifact *art); extern history_info *history_list; #endif /* !HISTORY_H */ angband-v3.3.2/src/Makefile.std0000644000175000017500000001104011651552410015623 0ustar chriscchrisc# File: Makefile.std # Standard makefile for Angband. # # This makefile probably requires GNU make. # # This makefile is intended for use with Unix machines running X11, gtk or # (n)curses. You can choose which you want to compile for below. # # You can also place your alterations to a file in the src/ directory called # "config", in which case that file will override what is specified here. # #### Things you should, or could, change #### # What systems to try. # # By default, this tries to compile both the X11 and "curses" terminal mode # ports in the same executable. # Recent, known-to-work ports # Support X11 (main-x11.c) # You may have to add various X11 include/library directories to the # "CFLAGS", if your machine places files in a weird location, for example # " -I/usr/X11R6/include", or "-L/usr/X11R6/lib" to LIBS. SYS_x11 = -DUSE_X11 -lX11 # Support curses console mode (main-gcu.c) # If this fails, try the alternate below SYS_gcu = -DUSE_GCU -DUSE_NCURSES -lncurses #SYS_gcu = -DUSE_GCU -lcurses -ltermcap # Support the GTK2 graphical tookit (main-gtk.c) #SYS_gtk = -rdynamic -export-dynamic -DUSE_GTK $(shell pkg-config libglade-2.0 gtk+-2.0 --libs --cflags) # Support SDL frontend SYS_sdl = -DUSE_SDL $(shell sdl-config --cflags) $(shell sdl-config --libs) -lSDL_ttf -lSDL_image # Stats pseudo-frontend # SYS_stats = -DUSE_STATS ## Support SDL_mixer for sound #SOUND_sdl = -DSOUND_SDL $(shell sdl-config --cflags) $(shell sdl-config --libs) -lSDL_mixer # Basic compiler stuff CC = gcc WARNINGS = -W -Wall -Wextra -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wredundant-decls -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-security -Winit-self -Wmissing-include-dirs -Wundef -Wmissing-format-attribute -Wnested-externs -Wunreachable-code -Wno-unused-parameter -Wno-missing-field-initializers CFLAGS = -O0 -g $(WARNINGS) # Add additional search directives here # Example: -I/usr/X11R6/include -I/usr/include/ncurses INCLUDES = -I. # Example: -L/usr/X11R6/lib LIBS = -lm # Version info EXE = angband #### Things you probably shouldn't change, unless there is a problem #### # Import user prefs # If you don't want to edit this file, put your module redefinitions # and build flags in "./config" -include config # Extract CFLAGS and LIBS from the system definitions MODULES = $(SYS_x11) $(SYS_gcu) $(SYS_gtk) $(SYS_sdl) $(SOUND_sdl) $(SYS_stats) CFLAGS += $(patsubst -l%,,$(MODULES)) $(INCLUDES) LIBS += $(patsubst -D%,,$(patsubst -I%,, $(MODULES))) # Object definitions GTKOBJS = gtk/main-gtk.o gtk/cairo-utils.o OBJS = $(BASEOBJS) main.o main-stats.o main-gcu.o main-x11.o main-sdl.o snd-sdl.o $(GTKOBJS) #### Targets and objects ##### # By default, copy the executable to ../ so that you don't find # yourself debugging a stale copy. default: install # Makefile.inc contains an up-to-date set of object files to compile, so # we include it include Makefile.inc # # Targets # # Build the "Angband" program $(EXE): $(OBJS) @printf "%10s %-20s\n" LINK $@ @$(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(OBJS) $(LIBS) # Install the game. install: ../$(EXE) docs: doc/index.html ../$(EXE): $(EXE) cp $(EXE) .. # Clean up old junk clean: -rm -f $(OBJS) $(EXE) -rm -f ../lib/data/*.raw # make a distribution DIRS = lib/apex lib/bone lib/data lib/edit lib/file lib/help lib/info \ lib/pref lib/save lib/user lib/xtra/sound lib/xtra/graf lib/xtra/font TMPDIR = ./$(EXE)-$(VERSION) dist: @-rm -rf $(TMPDIR) @echo making directories... @for i in $(DIRS) ; do mkdir -p $(TMPDIR)/$$i ; done @echo copying files... @cp ../lib/edit/*.txt $(TMPDIR)/lib/edit @cp ../lib/file/*.txt $(TMPDIR)/lib/file @cp ../lib/help/*.txt ../lib/help/*.hlp $(TMPDIR)/lib/help @cp ../lib/pref/*.prf $(TMPDIR)/lib/pref @cp ../lib/xtra/font/*.txt $(TMPDIR)/lib/xtra/font @echo attempting to install sound and graphics @-cp ../lib/xtra/sound/*.wav $(TMPDIR)/lib/xtra/sound @-cp ../lib/xtra/graf/*.bmp $(TMPDIR)/lib/xtra/graf @cp ../changes.txt ../readme.txt $(TMPDIR) @cp $(EXE) $(TMPDIR) tar czf ../$(EXE)-$(VERSION).tar.gz $(TMPDIR) rm -rf $(TMPDIR) # Verify module arguments args: @echo CFLAGS = $(CFLAGS) @echo LDFLAGS = $(LDFLAGS) @echo LIBS = $(LIBS) # Generate dependencies automatically depend: makedepend -D__MAKEDEPEND__ $(SRCS) # Some file dependencies %.o: %.c @printf "%10s %-20s\n" CC $< @$(CC) $(CFLAGS) -o $@ -c $< # X11 dependencies main-x11.o: $(HEADERS) main.h # Basic dependencies for main-xxx.c, main.c $(MAINOBJS) : main.h $(HEADERS) # fake Dependency doc/index.html: $(HEADERS) doxygen doc/doxygen.conf angband-v3.3.2/src/debug.h0000644000175000017500000000100711651552410014633 0ustar chriscchrisc#ifndef INCLUDED_DEBUG_H #define INCLUDED_DEBUG_H /** * Send the formatted string to whatever debug console or output is set up. * * The output will be treated logically as a single line, so do not include * newline characters in the format string. * * It is recommended you call debug() with "DHERE" at the beginning of your * format string, like so: * debug(DHERE "important info"); * * This gives you file and line number information. */ void debug(const char *fmt, ...); #endif /* INCLUDED_DEBUG_H */ angband-v3.3.2/src/object/0000755000175000017500000000000011651552410014644 5ustar chriscchriscangband-v3.3.2/src/object/obj-desc.c0000644000175000017500000004241011651552410016477 0ustar chriscchrisc/* * File: obj-desc.c * Purpose: Create object name descriptions * * Copyright (c) 1997 - 2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "squelch.h" #include "object/tvalsval.h" #include "object/pval.h" static size_t obj_desc_name_format(char *buf, size_t max, size_t end, const char *fmt, const char *modstr, bool pluralise); /** * Puts the object base kind's name into buf. */ void object_base_name(char *buf, size_t max, int tval, bool plural) { object_base *kb = &kb_info[tval]; size_t end = 0; end = obj_desc_name_format(buf, max, end, kb->name, NULL, plural); } /* * Puts a very stripped-down version of an object's name into buf. * If easy_know is TRUE, then the IDed names are used, otherwise * flavours, scroll names, etc will be used. * * Just truncates if the buffer isn't big enough. */ void object_kind_name(char *buf, size_t max, const object_kind *kind, bool easy_know) { /* If not aware, use flavor */ if (!easy_know && !kind->aware && kind->flavor) { if (kind->tval == TV_FOOD && kind->sval > SV_FOOD_MIN_SHROOM) { strnfmt(buf, max, "%s Mushroom", kind->flavor->text); } else { /* Plain flavour (e.g. Copper) will do. */ my_strcpy(buf, kind->flavor->text, max); } } /* Use proper name (Healing, or whatever) */ else { char *t; if (kind->tval == TV_FOOD && kind->sval > SV_FOOD_MIN_SHROOM) { my_strcpy(buf, "Mushroom of ", max); max -= strlen(buf); t = buf + strlen(buf); } else { t = buf; } /* Format remainder of the string */ obj_desc_name_format(t, max, 0, kind->name, NULL, FALSE); } } static const char *obj_desc_get_modstr(const object_kind *kind) { switch (kind->tval) { case TV_AMULET: case TV_RING: case TV_STAFF: case TV_WAND: case TV_ROD: case TV_POTION: case TV_FOOD: case TV_SCROLL: return kind->flavor ? kind->flavor->text : ""; case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: return kind->name; } return ""; } static const char *obj_desc_get_basename(const object_type *o_ptr, bool aware) { bool show_flavor = o_ptr->kind->flavor ? TRUE : FALSE; if (o_ptr->ident & IDENT_STORE) show_flavor = FALSE; if (aware && !OPT(show_flavors)) show_flavor = FALSE; /* Known artifacts get special treatment */ if (o_ptr->artifact && aware) return o_ptr->kind->name; /* Analyze the object */ switch (o_ptr->tval) { case TV_SKELETON: case TV_BOTTLE: case TV_JUNK: case TV_SPIKE: case TV_FLASK: case TV_CHEST: case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_BOW: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_LIGHT: return o_ptr->kind->name; case TV_AMULET: return (show_flavor ? "& # Amulet~" : "& Amulet~"); case TV_RING: return (show_flavor ? "& # Ring~" : "& Ring~"); case TV_STAFF: return (show_flavor ? "& # Sta|ff|ves|" : "& Sta|ff|ves|"); case TV_WAND: return (show_flavor ? "& # Wand~" : "& Wand~"); case TV_ROD: return (show_flavor ? "& # Rod~" : "& Rod~"); case TV_POTION: return (show_flavor ? "& # Potion~" : "& Potion~"); case TV_SCROLL: return (show_flavor ? "& Scroll~ titled #" : "& Scroll~"); case TV_MAGIC_BOOK: return "& Book~ of Magic Spells #"; case TV_PRAYER_BOOK: return "& Holy Book~ of Prayers #"; case TV_FOOD: if (o_ptr->sval > SV_FOOD_MIN_SHROOM) return (show_flavor ? "& # Mushroom~" : "& Mushroom~"); else return o_ptr->kind->name; } return "(nothing)"; } static size_t obj_desc_name_prefix(char *buf, size_t max, size_t end, const object_type *o_ptr, bool known, const char *basename, const char *modstr) { if (o_ptr->number <= 0) strnfcat(buf, max, &end, "no more "); else if (o_ptr->number > 1) strnfcat(buf, max, &end, "%d ", o_ptr->number); else if ((object_name_is_visible(o_ptr) || known) && o_ptr->artifact) strnfcat(buf, max, &end, "the "); else if (*basename == '&') { bool an = FALSE; const char *lookahead = basename + 1; while (*lookahead == ' ') lookahead++; if (*lookahead == '#') { if (modstr && is_a_vowel(*modstr)) an = TRUE; } else if (is_a_vowel(*lookahead)) { an = TRUE; } if (an) strnfcat(buf, max, &end, "an "); else strnfcat(buf, max, &end, "a "); } return end; } /** * Formats 'fmt' into 'buf', with the following formatting characters: * * '~' at the end of a word (e.g. "fridge~") will pluralise * * '|x|y|' will be output as 'x' if singular or 'y' if plural * (e.g. "kni|fe|ves|") * * '#' will be replaced with 'modstr' (which may contain the pluralising * formats given above). */ static size_t obj_desc_name_format(char *buf, size_t max, size_t end, const char *fmt, const char *modstr, bool pluralise) { /* Copy the string */ while (*fmt) { if (*fmt == '&') { while (*fmt == ' ' || *fmt == '&') fmt++; continue; } /* Pluralizer (regular English plurals) */ else if (*fmt == '~') { char prev = *(fmt - 1); if (!pluralise) { fmt++; continue; } /* e.g. cutlass-e-s, torch-e-s, box-e-s */ if (prev == 's' || prev == 'h' || prev == 'x') strnfcat(buf, max, &end, "es"); else strnfcat(buf, max, &end, "s"); } /* Special plurals */ else if (*fmt == '|') { /* e.g. kni|fe|ves| * ^ ^ ^ */ const char *singular = fmt + 1; const char *plural = strchr(singular, '|'); const char *endmark = NULL; if (plural) { plural++; endmark = strchr(plural, '|'); } if (!singular || !plural || !endmark) return end; if (!pluralise) strnfcat(buf, max, &end, "%.*s", plural - singular - 1, singular); else strnfcat(buf, max, &end, "%.*s", endmark - plural, plural); fmt = endmark; } /* Add modstr, with pluralisation if relevant */ else if (*fmt == '#') { end = obj_desc_name_format(buf, max, end, modstr, NULL, pluralise); } else buf[end++] = *fmt; fmt++; } buf[end] = 0; return end; } /* * Format object o_ptr's name into 'buf'. */ static size_t obj_desc_name(char *buf, size_t max, size_t end, const object_type *o_ptr, bool prefix, odesc_detail_t mode, bool spoil) { bool known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; bool aware = object_flavor_is_aware(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; const char *basename = obj_desc_get_basename(o_ptr, aware); const char *modstr = obj_desc_get_modstr(o_ptr->kind); if (aware && !o_ptr->kind->everseen && !spoil) o_ptr->kind->everseen = TRUE; if (prefix) end = obj_desc_name_prefix(buf, max, end, o_ptr, known, basename, modstr); /* Pluralize if (not forced singular) and * (not a known/visible artifact) and * (not one in stack or forced plural) */ end = obj_desc_name_format(buf, max, end, basename, modstr, !(mode & ODESC_SINGULAR) && !(o_ptr->artifact && (object_name_is_visible(o_ptr) || known)) && (o_ptr->number != 1 || (mode & ODESC_PLURAL))); /** Append extra names of various kinds **/ if ((object_name_is_visible(o_ptr) || known) && o_ptr->artifact) strnfcat(buf, max, &end, " %s", o_ptr->artifact->name); else if ((spoil && o_ptr->ego) || object_ego_is_visible(o_ptr)) strnfcat(buf, max, &end, " %s", o_ptr->ego->name); else if (aware && !o_ptr->artifact && (o_ptr->kind->flavor || o_ptr->kind->tval == TV_SCROLL)) strnfcat(buf, max, &end, " of %s", o_ptr->kind->name); return end; } /* * Is o_ptr armor? */ static bool obj_desc_show_armor(const object_type *o_ptr) { if (o_ptr->ac) return TRUE; switch (o_ptr->tval) { case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { return TRUE; break; } } return FALSE; } static size_t obj_desc_chest(const object_type *o_ptr, char *buf, size_t max, size_t end) { bool known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE); if (o_ptr->tval != TV_CHEST) return end; if (!known) return end; /* May be "empty" */ if (!o_ptr->pval[DEFAULT_PVAL]) strnfcat(buf, max, &end, " (empty)"); /* May be "disarmed" */ else if (o_ptr->pval[DEFAULT_PVAL] < 0) { if (chest_traps[0 - o_ptr->pval[DEFAULT_PVAL]]) strnfcat(buf, max, &end, " (disarmed)"); else strnfcat(buf, max, &end, " (unlocked)"); } /* Describe the traps, if any */ else { /* Describe the traps */ switch (chest_traps[o_ptr->pval[DEFAULT_PVAL]]) { case 0: strnfcat(buf, max, &end, " (Locked)"); break; case CHEST_LOSE_STR: strnfcat(buf, max, &end, " (Poison Needle)"); break; case CHEST_LOSE_CON: strnfcat(buf, max, &end, " (Poison Needle)"); break; case CHEST_POISON: strnfcat(buf, max, &end, " (Gas Trap)"); break; case CHEST_PARALYZE: strnfcat(buf, max, &end, " (Gas Trap)"); break; case CHEST_EXPLODE: strnfcat(buf, max, &end, " (Explosion Device)"); break; case CHEST_SUMMON: strnfcat(buf, max, &end, " (Summoning Runes)"); break; default: strnfcat(buf, max, &end, " (Multiple Traps)"); break; } } return end; } static size_t obj_desc_combat(const object_type *o_ptr, char *buf, size_t max, size_t end, bool spoil) { bitflag flags[OF_SIZE]; bitflag flags_known[OF_SIZE]; object_flags(o_ptr, flags); object_flags_known(o_ptr, flags_known); if (of_has(flags, OF_SHOW_DICE)) { /* Only display the real damage dice if the combat stats are known */ if (spoil || object_attack_plusses_are_visible(o_ptr)) strnfcat(buf, max, &end, " (%dd%d)", o_ptr->dd, o_ptr->ds); else strnfcat(buf, max, &end, " (%dd%d)", o_ptr->kind->dd, o_ptr->kind->ds); } if (of_has(flags, OF_SHOW_MULT)) { /* Display shooting power as part of the multiplier */ if (of_has(flags, OF_MIGHT) && (spoil || object_flag_is_known(o_ptr, OF_MIGHT))) strnfcat(buf, max, &end, " (x%d)", (o_ptr->sval % 10) + o_ptr->pval[which_pval(o_ptr, OF_MIGHT)]); else strnfcat(buf, max, &end, " (x%d)", o_ptr->sval % 10); } /* Show weapon bonuses */ if (spoil || object_attack_plusses_are_visible(o_ptr)) { if (of_has(flags, OF_SHOW_MODS) || o_ptr->to_d || o_ptr->to_h) { /* Make an exception for body armor with only a to-hit penalty */ if (o_ptr->to_h < 0 && o_ptr->to_d == 0 && (o_ptr->tval == TV_SOFT_ARMOR || o_ptr->tval == TV_HARD_ARMOR || o_ptr->tval == TV_DRAG_ARMOR)) strnfcat(buf, max, &end, " (%+d)", o_ptr->to_h); /* Otherwise, always use the full tuple */ else strnfcat(buf, max, &end, " (%+d,%+d)", o_ptr->to_h, o_ptr->to_d); } } /* Show armor bonuses */ if (spoil || object_defence_plusses_are_visible(o_ptr)) { if (obj_desc_show_armor(o_ptr)) strnfcat(buf, max, &end, " [%d,%+d]", o_ptr->ac, o_ptr->to_a); else if (o_ptr->to_a) strnfcat(buf, max, &end, " [%+d]", o_ptr->to_a); } else if (obj_desc_show_armor(o_ptr)) { strnfcat(buf, max, &end, " [%d]", object_was_sensed(o_ptr) ? o_ptr->ac : o_ptr->kind->ac); } return end; } static size_t obj_desc_light(const object_type *o_ptr, char *buf, size_t max, size_t end) { bitflag f[OF_SIZE]; object_flags(o_ptr, f); /* Fuelled light sources get number of remaining turns appended */ if ((o_ptr->tval == TV_LIGHT) && !of_has(f, OF_NO_FUEL)) strnfcat(buf, max, &end, " (%d turns)", o_ptr->timeout); return end; } static size_t obj_desc_pval(const object_type *o_ptr, char *buf, size_t max, size_t end, bool spoil) { bitflag f[OF_SIZE], f2[OF_SIZE]; int i; object_flags(o_ptr, f); create_mask(f2, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); if (!of_is_inter(f, f2)) return end; strnfcat(buf, max, &end, " <"); for (i = 0; i < o_ptr->num_pvals; i++) { if (spoil || object_this_pval_is_visible(o_ptr, i)) { if (i > 0) strnfcat(buf, max, &end, ", "); strnfcat(buf, max, &end, "%+d", o_ptr->pval[i]); } } strnfcat(buf, max, &end, ">"); return end; } static size_t obj_desc_charges(const object_type *o_ptr, char *buf, size_t max, size_t end) { bool aware = object_flavor_is_aware(o_ptr) || (o_ptr->ident & IDENT_STORE); /* Wands and Staffs have charges */ if (aware && (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)) strnfcat(buf, max, &end, " (%d charge%s)", o_ptr->pval[DEFAULT_PVAL], PLURAL(o_ptr->pval[DEFAULT_PVAL])); /* Charging things */ else if (o_ptr->timeout > 0) { if (o_ptr->tval == TV_ROD && o_ptr->number > 1) { int power; int time_base = randcalc(o_ptr->kind->time, 0, MINIMISE); if (!time_base) time_base = 1; /* * Find out how many rods are charging, by dividing * current timeout by each rod's maximum timeout. * Ensure that any remainder is rounded up. Display * very discharged stacks as merely fully discharged. */ power = (o_ptr->timeout + (time_base - 1)) / time_base; if (power > o_ptr->number) power = o_ptr->number; /* Display prettily */ strnfcat(buf, max, &end, " (%d charging)", power); } /* Artifacts, single rods */ else if (!(o_ptr->tval == TV_LIGHT && !o_ptr->artifact)) { strnfcat(buf, max, &end, " (charging)"); } } return end; } static size_t obj_desc_inscrip(const object_type *o_ptr, char *buf, size_t max, size_t end) { const char *u[4] = { 0, 0, 0, 0 }; int n = 0; int feel = object_pseudo(o_ptr); bitflag flags_known[OF_SIZE], f2[OF_SIZE]; object_flags_known(o_ptr, flags_known); /* Get inscription */ if (o_ptr->note) u[n++] = quark_str(o_ptr->note); /* Use special inscription, if any */ if (!object_is_known(o_ptr) && feel) { /* cannot tell excellent vs strange vs splendid until wield */ if (!object_was_worn(o_ptr) && o_ptr->ego) u[n++] = "ego"; else u[n++] = inscrip_text[feel]; } else if ((o_ptr->ident & IDENT_EMPTY) && !object_is_known(o_ptr)) u[n++] = "empty"; else if (!object_is_known(o_ptr) && object_was_worn(o_ptr)) { if (wield_slot(o_ptr) == INVEN_WIELD || wield_slot(o_ptr) == INVEN_BOW) u[n++] = "wielded"; else u[n++] = "worn"; } else if (!object_is_known(o_ptr) && object_was_fired(o_ptr)) u[n++] = "fired"; else if (!object_flavor_is_aware(o_ptr) && object_flavor_was_tried(o_ptr)) u[n++] = "tried"; /* Note curses */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); if (of_is_inter(flags_known, f2)) u[n++] = "cursed"; /* Note squelch */ if (squelch_item_ok(o_ptr)) u[n++] = "squelch"; if (n) { int i; for (i = 0; i < n; i++) { if (i == 0) strnfcat(buf, max, &end, " {"); strnfcat(buf, max, &end, "%s", u[i]); if (i < n-1) strnfcat(buf, max, &end, ", "); } strnfcat(buf, max, &end, "}"); } return end; } /* Add "unseen" to the end of unaware items in stores */ static size_t obj_desc_aware(const object_type *o_ptr, char *buf, size_t max, size_t end) { if (!object_flavor_is_aware(o_ptr)) strnfcat(buf, max, &end, " {unseen}"); return end; } /** * Describes item `o_ptr` into buffer `buf` of size `max`. * * ODESC_PREFIX prepends a 'the', 'a' or number * ODESC_BASE results in a base description. * ODESC_COMBAT will add to-hit, to-dam and AC info. * ODESC_EXTRA will add pval/charge/inscription/squelch info. * ODESC_PLURAL will pluralise regardless of the number in the stack. * ODESC_STORE turns off squelch markers, for in-store display. * ODESC_SPOIL treats the object as fully identified. * * Setting 'prefix' to TRUE prepends a 'the', 'a' or the number in the stack, * respectively. * * \returns The number of bytes used of the buffer. */ size_t object_desc(char *buf, size_t max, const object_type *o_ptr, odesc_detail_t mode) { bool prefix = mode & ODESC_PREFIX; bool spoil = (mode & ODESC_SPOIL); bool known; size_t end = 0, i = 0; /* Simple description for null item */ if (!o_ptr->tval) return strnfmt(buf, max, "(nothing)"); known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; /* We've seen it at least once now we're aware of it */ if (known && o_ptr->ego && !spoil) o_ptr->ego->everseen = TRUE; /*** Some things get really simple descriptions ***/ if (o_ptr->tval == TV_GOLD) return strnfmt(buf, max, "%d gold pieces worth of %s%s", o_ptr->pval[DEFAULT_PVAL], o_ptr->kind->name, squelch_item_ok(o_ptr) ? " {squelch}" : ""); /** Construct the name **/ /* Copy the base name to the buffer */ end = obj_desc_name(buf, max, end, o_ptr, prefix, mode, spoil); if (mode & ODESC_COMBAT) { if (o_ptr->tval == TV_CHEST) end = obj_desc_chest(o_ptr, buf, max, end); else if (o_ptr->tval == TV_LIGHT) end = obj_desc_light(o_ptr, buf, max, end); end = obj_desc_combat(o_ptr, buf, max, end, spoil); } if (mode & ODESC_EXTRA) { for (i = 0; i < o_ptr->num_pvals; i++) if (spoil || object_this_pval_is_visible(o_ptr, i)) { end = obj_desc_pval(o_ptr, buf, max, end, spoil); break; } end = obj_desc_charges(o_ptr, buf, max, end); if (mode & ODESC_STORE) { end = obj_desc_aware(o_ptr, buf, max, end); } else end = obj_desc_inscrip(o_ptr, buf, max, end); } return end; } angband-v3.3.2/src/object/Makefile0000644000175000017500000000010111651552410016274 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)extra.mk $(MKPATH)buildsys.mk angband-v3.3.2/src/object/obj-flag.c0000644000175000017500000001211611651552410016472 0ustar chriscchrisc/* * File: src/object/obj-flag.c * Purpose: functions to deal with object flags * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" /** * Details of the different object flags in the game. * See src/object/obj-flag.h for structure */ const struct object_flag object_flag_table[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) \ { OF_##a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s }, #include "list-object-flags.h" #undef OF }; /** * Object flag names */ static const char *flag_names[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) #a, #include "list-object-flags.h" #undef OF "" }; /** * Create a "mask" of flags of a specific type or ID threshold. * * \param f is the flag array we're filling * \param id is whether we're masking by ID level * \param ... is the list of flags or ID types we're looking for * * N.B. OFT_MAX must be the last item in the ... list */ void create_mask(bitflag *f, bool id, ...) { const struct object_flag *of_ptr; int i; va_list args; of_wipe(f); va_start(args, id); /* Process each type in the va_args */ for (i = va_arg(args, int); i != OFT_MAX; i = va_arg(args, int)) { for (of_ptr = object_flag_table; of_ptr->index < OF_MAX; of_ptr++) if ((id && of_ptr->id == i) || (!id && of_ptr->type == i)) of_on(f, of_ptr->index); } va_end(args); return; } /** * Print a message when an object flag is identified by use. * * \param flag is the flag being noticed * \param name is the object name */ void flag_message(int flag, char *name) { const struct object_flag *of_ptr = &object_flag_table[flag]; if (!streq(of_ptr->message, "")) msg(of_ptr->message, name); return; } /** * Determine whether a flagset includes any curse flags. */ bool cursed_p(bitflag *f) { bitflag f2[OF_SIZE]; of_wipe(f2); create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); return of_is_inter(f, f2); } /** * Determine whether an object flag or its timed equivalent are set in the * passed-in flags (which probably come from a state structure). This assumes * that there are no p_ptr->timed effects which can be active yet unknown to * the player. * * \param p player to act upon * \param flag is the object flag for which we are checking. * \param f is the set of flags we're checking */ bool check_state(struct player *p, int flag, bitflag *f) { const struct object_flag *of_ptr = &object_flag_table[flag]; /* Sanity check */ if (!flag) return FALSE; if (of_has(f, flag) || (of_ptr->timed && p->timed[of_ptr->timed])) return TRUE; return FALSE; } /** * Log the names of a flagset to a file. * * \param f is the set of flags we are logging. * \param log_file is the file to which we are logging the names. */ void log_flags(bitflag *f, ang_file *log_file) { int i; file_putf(log_file, "Object flags are:\n"); for (i = 0; i < OF_MAX; i++) if (of_has(f, i)) file_putf(log_file, "%s\n", flag_names[i]); } /** * Log the name of a flag to a file. * * \param flag is the flag to log. * \param log_file is ... oh come on how obvious does it need to be? */ const char *flag_name(int flag) { return flag_names[flag]; } /** * Get the slot multiplier for a flag's power rating * * \param flag is the flag in question. * \param slot is the wield_slot it's in. */ s16b slot_mult(int flag, int slot) { const struct object_flag *of_ptr = &object_flag_table[flag]; switch (slot) { case INVEN_WIELD: return of_ptr->weapon; case INVEN_BOW: return of_ptr->bow; case INVEN_LEFT: case INVEN_RIGHT: return of_ptr->ring; case INVEN_NECK: return of_ptr->amulet; case INVEN_LIGHT: return of_ptr->light; case INVEN_BODY: return of_ptr->body; case INVEN_OUTER: return of_ptr->cloak; case INVEN_ARM: return of_ptr->shield; case INVEN_HEAD: return of_ptr->hat; case INVEN_HANDS: return of_ptr->gloves; case INVEN_FEET: return of_ptr->boots; default: return 1; } } /** * Return the base power rating for a flag. */ s32b flag_power(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->power; } /** * Ascertain whether a flag is granular (pval-based) or binary. */ bool flag_uses_pval(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->pval; } /** * Return the OFT_ type of a flag. */ int obj_flag_type(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->type; } /** * Return the pval weighting of a flag. (Some pvals are more important than * others.) */ int pval_mult(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->pval_mult; } angband-v3.3.2/src/object/list-object-flags.h0000644000175000017500000003405711651552410020337 0ustar chriscchrisc/* * File: src/object/list-object-flags.h * Purpose: object flags for all objects * * Changing flag order will break savefiles. There is a hard-coded limit of * 256 flags, due to 32 bytes of storage for item flags in the savefile. Flags * below start from 0 on line 21, so a flag's sequence number is its line * number minus 21. * * index: the flag number * pval: is it a quantitative flag? FALSE means it's just on/off * timed: what is the corresponding TMD_ flag * id: when the flag is IDd * type: what type of flag is it? * power: base power rating for the flag (0 means it is unused or derived) * pval_mult: weight of this flag relative to other pval flags * wpn/bow/ring/amu/light/body/cloak/shield/hat/gloves/boots: power multiplier for this slot * message: what is printed when the flag is IDd (but see also identify.c and list-slays.h) */ /* index pval timed id type power p_m wpn bow ring amu light body cloak shield hat gloves boots message */ OF(NONE, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(STR, TRUE, 0, OFID_WIELD, OFT_STAT, 9, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(INT, TRUE, 0, OFID_WIELD, OFT_STAT, 5, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(WIS, TRUE, 0, OFID_WIELD, OFT_STAT, 5, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(DEX, TRUE, 0, OFID_WIELD, OFT_STAT, 8, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, "") OF(CON, TRUE, 0, OFID_WIELD, OFT_STAT, 12, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(CHR, TRUE, 0, OFID_WIELD, OFT_STAT, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(XXX1, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX2, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(STEALTH, TRUE, 0, OFID_WIELD, OFT_PVAL, 8, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SEARCH, TRUE, 0, OFID_WIELD, OFT_PVAL, 2, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(INFRA, TRUE, TMD_SINFRA, OFID_WIELD, OFT_PVAL, 4, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(TUNNEL, TRUE, 0, OFID_WIELD, OFT_PVAL, 3, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(SPEED, TRUE, TMD_FAST, OFID_WIELD, OFT_PVAL, 20, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(BLOWS, TRUE, 0, OFID_WIELD, OFT_PVAL, 0, 50, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SHOTS, TRUE, 0, OFID_WIELD, OFT_PVAL, 0, 50, 0, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, "") OF(MIGHT, TRUE, 0, OFID_WIELD, OFT_PVAL, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SLAY_ANIMAL, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_EVIL, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_UNDEAD, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_DEMON, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_ORC, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_TROLL, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_GIANT, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_DRAGON, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(KILL_DRAGON, FALSE, 0, OFID_NORMAL,OFT_KILL, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(KILL_DEMON, FALSE, 0, OFID_NORMAL,OFT_KILL, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(KILL_UNDEAD, FALSE, 0, OFID_NORMAL,OFT_KILL, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_POIS, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_ACID, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_ELEC, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_FIRE, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_COLD, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SUST_STR, FALSE, 0, OFID_NORMAL,OFT_SUST, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_INT, FALSE, 0, OFID_NORMAL,OFT_SUST, 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_WIS, FALSE, 0, OFID_NORMAL,OFT_SUST, 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_DEX, FALSE, 0, OFID_NORMAL,OFT_SUST, 7, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_CON, FALSE, 0, OFID_NORMAL,OFT_SUST, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_CHR, FALSE, 0, OFID_NORMAL,OFT_SUST, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(VULN_ACID, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(VULN_ELEC, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(VULN_FIRE, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(VULN_COLD, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(XXX3, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Your %s glows.") OF(XXX4, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Your %s glows.") OF(IM_ACID, FALSE, 0, OFID_NORMAL,OFT_IMM, 38, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(IM_ELEC, FALSE, 0, OFID_NORMAL,OFT_IMM, 35, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(IM_FIRE, FALSE, 0, OFID_NORMAL,OFT_IMM, 40, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(IM_COLD, FALSE, 0, OFID_NORMAL,OFT_IMM, 37, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_ACID, FALSE, TMD_OPP_ACID, OFID_NORMAL,OFT_LRES, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_ELEC, FALSE, TMD_OPP_ELEC, OFID_NORMAL,OFT_LRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_FIRE, FALSE, TMD_OPP_FIRE, OFID_NORMAL,OFT_LRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_COLD, FALSE, TMD_OPP_COLD, OFID_NORMAL,OFT_LRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_POIS, FALSE, TMD_OPP_POIS, OFID_NORMAL,OFT_HRES, 28, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_FEAR, FALSE, TMD_BOLD, OFID_NORMAL,OFT_PROT, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_LIGHT, FALSE, 0, OFID_NORMAL,OFT_HRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_DARK, FALSE, 0, OFID_NORMAL,OFT_HRES, 16, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_BLIND, FALSE, 0, OFID_NORMAL,OFT_PROT, 16, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_CONFU, FALSE, TMD_OPP_CONF, OFID_NORMAL,OFT_PROT, 24, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_SOUND, FALSE, 0, OFID_NORMAL,OFT_HRES, 14, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_SHARD, FALSE, 0, OFID_NORMAL,OFT_HRES, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_NEXUS, FALSE, 0, OFID_NORMAL,OFT_HRES, 15, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_NETHR, FALSE, 0, OFID_NORMAL,OFT_HRES, 20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_CHAOS, FALSE, 0, OFID_NORMAL,OFT_HRES, 20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_DISEN, FALSE, 0, OFID_NORMAL,OFT_HRES, 20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SLOW_DIGEST, FALSE, 0, OFID_TIMED, OFT_MISC, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s slow your metabolism.") OF(FEATHER, FALSE, 0, OFID_NORMAL,OFT_MISC, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s slows your fall.") OF(LIGHT, FALSE, 0, OFID_WIELD, OFT_MISC, 3, 0, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, "") OF(REGEN, FALSE, 0, OFID_TIMED, OFT_MISC, 5, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "You feel your %s speed up your recovery.") OF(TELEPATHY, FALSE, TMD_TELEPATHY, OFID_WIELD, OFT_MISC, 35, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "") OF(SEE_INVIS, FALSE, TMD_SINVIS, OFID_WIELD, OFT_MISC, 6, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "") OF(FREE_ACT, FALSE, 0, OFID_NORMAL,OFT_MISC, 8, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 5, 2, "Your %s glows.") OF(HOLD_LIFE, FALSE, 0, OFID_NORMAL,OFT_MISC, 5, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "Your %s glows.") OF(NO_FUEL, FALSE, 0, OFID_WIELD, OFT_LIGHT, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "") OF(IMPAIR_HP, FALSE, 0, OFID_TIMED, OFT_BAD, -9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s slow your recovery.") OF(IMPAIR_MANA, FALSE, 0, OFID_TIMED, OFT_BAD, -9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s slow your mana recovery.") OF(AFRAID, FALSE, TMD_AFRAID, OFID_WIELD, OFT_BAD, -20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IMPACT, FALSE, 0, OFID_NORMAL,OFT_MELEE, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Your %s causes an earthquake!") OF(TELEPORT, FALSE, 0, OFID_NORMAL,OFT_BAD, -20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s teleports you.") OF(AGGRAVATE, FALSE, 0, OFID_TIMED, OFT_BAD, -20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s aggravate things around you.") OF(DRAIN_EXP, FALSE, 0, OFID_TIMED, OFT_BAD, -5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s drain your life.") OF(IGNORE_ACID, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IGNORE_ELEC, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IGNORE_FIRE, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IGNORE_COLD, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(RES_STUN, FALSE, 0, OFID_NORMAL,OFT_PROT, 12, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(XXX5, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(BLESSED, FALSE, 0, OFID_WIELD, OFT_MELEE, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX6, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(INSTA_ART, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(EASY_KNOW, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(HIDE_TYPE, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SHOW_MODS, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX7, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(LIGHT_CURSE, FALSE, 0, OFID_WIELD, OFT_CURSE, -5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(HEAVY_CURSE, FALSE, 0, OFID_WIELD, OFT_CURSE, -15, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(PERMA_CURSE, FALSE, 0, OFID_WIELD, OFT_CURSE, -25, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(HATES_ACID, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(HATES_ELEC, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(HATES_FIRE, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(HATES_COLD, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SPELLS_OK, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SHOW_DICE, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SHOW_MULT, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(BRAND_ICKY, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_FIZZ, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_BUZZ, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_WARM, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_COOL, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(MAX, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") angband-v3.3.2/src/object/obj-power.c0000644000175000017500000003550111651552410016720 0ustar chriscchrisc/* * File: obj-power.c * Purpose: calculation of object power * * Copyright (c) 2001 Chris Carr, Chris Robertson * Revised in 2009-11 by Chris Carr, Peter Denison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/slays.h" #include "object/tvalsval.h" #include "object/pval.h" #include "init.h" #include "effects.h" #include "monster/mon-power.h" /** * Constants for the power algorithm: * - fudge factor for extra damage from rings etc. (used if extra blows) * - assumed damage for off-weapon brands * - base power for jewelry * - base power for armour items (for halving acid damage) * - power per point of damage * - power per point of +to_hit * - power per point of base AC * - power per point of +to_ac * (these four are all halved in the algorithm) * - assumed max blows * - inhibiting values for +blows/might/shots/immunities (max is one less) */ #define NONWEAP_DAMAGE 15 /* fudge to boost extra blows */ #define WEAP_DAMAGE 12 /* and for off-weapon combat flags */ #define BASE_JEWELRY_POWER 4 #define BASE_ARMOUR_POWER 1 #define BASE_LIGHT_POWER 6 /* for rad-2; doubled for rad-3 */ #define DAMAGE_POWER 5 /* i.e. 2.5 */ #define TO_HIT_POWER 3 /* i.e. 1.5 */ #define BASE_AC_POWER 2 /* i.e. 1 */ #define TO_AC_POWER 2 /* i.e. 1 */ #define MAX_BLOWS 5 #define INHIBIT_IMMUNITIES 4 /** * Define a set of constants for dealing with launchers and ammo: * - the assumed average damage of ammo (for rating launchers) * (the current values assume normal (non-seeker) ammo enchanted to +9) * - the assumed bonus on launchers (for rating ego ammo) * - twice the assumed multiplier (for rating any ammo) * N.B. Ammo tvals are assumed to be consecutive! We access this array using * (o_ptr->tval - TV_SHOT) for ammo, and * (o_ptr->sval / 10) for launchers */ static struct archery { int ammo_tval; int ammo_dam; int launch_dam; int launch_mult; } archery[] = { {TV_SHOT, 10, 9, 4}, {TV_ARROW, 12, 9, 5}, {TV_BOLT, 14, 9, 7} }; /** * Set the weightings of flag types: * - factor for power increment for multiple flags * - additional power bonus for a "full set" of these flags * - number of these flags which constitute a "full set" * - whether value is damage-dependent */ static struct set { int type; int factor; int bonus; int size; bool dam_dep; int count; const char *desc; } sets[] = { { OFT_SUST, 1, 10, 5, FALSE, 0, "sustains" }, { OFT_SLAY, 1, 10, 8, TRUE, 0, "normal slays" }, { OFT_BRAND, 2, 20, 5, TRUE, 0, "brands" }, { OFT_KILL, 3, 20, 3, TRUE, 0, "x5 slays" }, { OFT_IMM, 6, INHIBIT_POWER, 4, FALSE, 0, "immunities" }, { OFT_LRES, 1, 10, 4, FALSE, 0, "low resists" }, { OFT_HRES, 2, 10, 9, FALSE, 0, "high resists" }, { OFT_PROT, 3, 15, 4, FALSE, 0, "protections" }, { OFT_MISC, 1, 25, 8, FALSE, 0, "misc abilities" } }; /** * Boost ratings for combinations of ability bonuses * We go up to +24 here - anything higher is inhibited * N.B. Not all stats count equally towards this total */ static s16b ability_power[25] = {0, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 12, 16, 20, 24, 30, 36, 42, 48, 56, 64, 74, 84, 96, 110}; /** * Calculate the rating for a given slay combination */ static s32b slay_power(const object_type *o_ptr, int verbose, ang_file* log_file, bool known) { bitflag s_index[OF_SIZE], f[OF_SIZE], f2[OF_SIZE]; u32b sv = 0; int i, j; int mult; const struct slay *best_s_ptr = NULL; monster_race *r_ptr; monster_type *m_ptr; monster_type monster_type_body; const char *desc[SL_MAX] = { 0 }, *brand[SL_MAX] = { 0 }; int s_mult[SL_MAX] = { 0 }; if (known) object_flags(o_ptr, f); else object_flags_known(o_ptr, f); /* Combine the slay bytes into an index value, return if there are none */ of_copy(s_index, f); create_mask(f2, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); if (!of_is_inter(s_index, f2)) return tot_mon_power; else of_inter(s_index, f2); /* Look in the cache to see if we know this one yet */ sv = check_slay_cache(s_index); /* If it's cached (or there are no slays), return the value */ if (sv) { file_putf(log_file, "Slay cache hit\n"); return sv; } /* * Otherwise we need to calculate the expected average multiplier * for this combination (multiplied by the total number of * monsters, which we'll divide out later). */ for (i = 0; i < z_info->r_max; i++) { best_s_ptr = NULL; mult = 1; r_ptr = &r_info[i]; m_ptr = &monster_type_body; m_ptr->r_idx = i; /* Find the best multiplier against this monster */ improve_attack_modifier((object_type *)o_ptr, m_ptr, &best_s_ptr, FALSE, !known); if (best_s_ptr) mult = best_s_ptr->mult; /* Add the multiple to sv */ sv += mult * r_ptr->scaled_power; } /* * To get the expected damage for this weapon, multiply the * average damage from base dice by sv, and divide by the * total number of monsters. */ if (verbose) { /* Write info about the slay combination and multiplier */ file_putf(log_file, "Slay multiplier for: "); j = list_slays(s_index, s_index, desc, brand, s_mult, FALSE); for (i = 0; i < j; i++) { if (brand[i]) { file_putf(log_file, brand[i]); } else { file_putf(log_file, desc[i]); } file_putf(log_file, "x%d ", s_mult[i]); } file_putf(log_file, "\nsv is: %d\n", sv); file_putf(log_file, " and t_m_p is: %d \n", tot_mon_power); file_putf(log_file, "times 1000 is: %d\n", (1000 * sv) / tot_mon_power); } /* Add to the cache */ if (fill_slay_cache(s_index, sv)) file_putf(log_file, "Added to slay cache\n"); return sv; } /* * Calculate the multiplier we'll get with a given bow type. * Note that this relies on the multiplier being the 2nd digit of the bow's * sval. We assume that sval has already been checked for legitimacy before * we get here. */ static int bow_multiplier(int sval) { int mult = 0; mult = sval - 10 * (sval / 10); return mult; } /* * Evaluate the object's overall power level. */ s32b object_power(const object_type* o_ptr, int verbose, ang_file *log_file, bool known) { s32b p = 0, q = 0, slay_pwr = 0, dice_pwr = 0; unsigned int i, j; int extra_stat_bonus = 0, mult = 1, num_slays = 0, k = 1; bitflag flags[OF_SIZE], mask[OF_SIZE]; /* Zero the flag counts */ for (i = 0; i < N_ELEMENTS(sets); i++) sets[i].count = 0; /* Extract the flags */ if (known) { file_putf(log_file, "Object is deemed known\n"); object_flags(o_ptr, flags); } else { file_putf(log_file, "Object may not be fully known\n"); object_flags_known(o_ptr, flags); } /* Log the flags in human-readable form */ if (verbose) log_flags(flags, log_file); /* Get the slay power and number of slay/brand types */ create_mask(mask, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); num_slays = list_slays(flags, mask, NULL, NULL, NULL, TRUE); if (num_slays) slay_pwr = slay_power(o_ptr, verbose, log_file, known); /* Start with any damage boost from the item itself */ p += (o_ptr->to_d * DAMAGE_POWER / 2); file_putf(log_file, "Adding power from to_dam, total is %d\n", p); /* Add damage from dice for any wieldable weapon or ammo */ if (wield_slot(o_ptr) == INVEN_WIELD || obj_is_ammo(o_ptr)) { dice_pwr = (o_ptr->dd * (o_ptr->ds + 1) * DAMAGE_POWER / 4); file_putf(log_file, "Adding %d power for dam dice\n", dice_pwr); /* Add 2nd lot of damage power for nonweapons */ } else if (wield_slot(o_ptr) != INVEN_BOW) { p += (o_ptr->to_d * DAMAGE_POWER); file_putf(log_file, "Adding power from nonweap to_dam, total is %d\n", p); /* Add power boost for nonweapons with combat flags */ if (num_slays || of_has(flags, OF_BLOWS) || of_has(flags, OF_SHOTS) || of_has(flags, OF_MIGHT)) { dice_pwr = (WEAP_DAMAGE * DAMAGE_POWER); file_putf(log_file, "Adding %d power for nonweap combat flags\n", dice_pwr); } } p += dice_pwr; /* Add ammo damage for launchers, get multiplier and rescale */ if (wield_slot(o_ptr) == INVEN_BOW) { p += (archery[o_ptr->sval / 10].ammo_dam * DAMAGE_POWER / 2); file_putf(log_file, "Adding power from ammo, total is %d\n", p); mult = bow_multiplier(o_ptr->sval); file_putf(log_file, "Base mult for this weapon is %d\n", mult); } /* Add launcher bonus for ego ammo, multiply for launcher and rescale */ if (obj_is_ammo(o_ptr)) { if (o_ptr->ego) p += (archery[o_ptr->tval - TV_SHOT].launch_dam * DAMAGE_POWER / 2); p = p * archery[o_ptr->tval - TV_SHOT].launch_mult / (2 * MAX_BLOWS); file_putf(log_file, "After multiplying ammo and rescaling, power is %d\n", p); } /* Add power for extra blows */ if (of_has(flags, OF_BLOWS)) { j = which_pval(o_ptr, OF_BLOWS); if (known || object_this_pval_is_visible(o_ptr, j)) { if (o_ptr->pval[j] >= INHIBIT_BLOWS) { p += INHIBIT_POWER; file_putf(log_file, "INHIBITING - too many extra blows - quitting\n"); return p; } else { p = p * (MAX_BLOWS + o_ptr->pval[j]) / MAX_BLOWS; /* Add boost for assumed off-weapon damage */ p += (NONWEAP_DAMAGE * o_ptr->pval[j] * DAMAGE_POWER / 2); file_putf(log_file, "Adding power for extra blows, total is %d\n", p); } } } /* Add power for extra shots - note that we cannot handle negative shots */ if (of_has(flags, OF_SHOTS)) { j = which_pval(o_ptr, OF_SHOTS); if (known || object_this_pval_is_visible(o_ptr, j)) { if (o_ptr->pval[j] >= INHIBIT_SHOTS) { p += INHIBIT_POWER; file_putf(log_file, "INHIBITING - too many extra shots - quitting\n"); return p; } else if (o_ptr->pval[j] > 0) { p = (p * (1 + o_ptr->pval[j])); file_putf(log_file, "Extra shots: multiplying power by 1 + %d, total is %d\n", o_ptr->pval[j], p); } } } /* Add power for extra might */ if (of_has(flags, OF_MIGHT)) { j = which_pval(o_ptr, OF_MIGHT); if (known || object_this_pval_is_visible(o_ptr, j)) { if (o_ptr->pval[j] >= INHIBIT_MIGHT) { p += INHIBIT_POWER; mult = 1; /* don't overflow */ file_putf(log_file, "INHIBITING - too much extra might - quitting\n"); return p; } else mult += o_ptr->pval[j]; file_putf(log_file, "Mult after extra might is %d\n", mult); } } p *= mult; file_putf(log_file, "After multiplying power for might, total is %d\n", p); /* Apply the correct slay multiplier */ if (slay_pwr) { p += (dice_pwr * (slay_pwr / 100)) / (tot_mon_power / 100); file_putf(log_file, "Adjusted for slay power, total is %d\n", p); } /* Melee weapons assume MAX_BLOWS per turn, so we must divide by MAX_BLOWS * to get equal ratings for launchers. */ if (wield_slot(o_ptr) == INVEN_BOW) { p /= MAX_BLOWS; file_putf(log_file, "Rescaling bow power, total is %d\n", p); } /* Add power for +to_hit */ p += (o_ptr->to_h * TO_HIT_POWER / 2); file_putf(log_file, "Adding power for to hit, total is %d\n", p); /* Add power for base AC and adjust for weight */ if (o_ptr->ac) { p += BASE_ARMOUR_POWER; q += (o_ptr->ac * BASE_AC_POWER / 2); file_putf(log_file, "Adding %d power for base AC value\n", q); /* Add power for AC per unit weight */ if (o_ptr->weight > 0) { i = 750 * (o_ptr->ac + o_ptr->to_a) / o_ptr->weight; /* Avoid overpricing Elven Cloaks */ if (i > 450) i = 450; q *= i; q /= 100; /* Weightless (ethereal) armour items get fixed boost */ } else q *= 5; p += q; file_putf(log_file, "Adding power for AC per unit weight, now %d\n", p); } /* Add power for +to_ac */ p += (o_ptr->to_a * TO_AC_POWER / 2); file_putf(log_file, "Adding power for to_ac of %d, total is %d\n", o_ptr->to_a, p); if (o_ptr->to_a > HIGH_TO_AC) { p += ((o_ptr->to_a - (HIGH_TO_AC - 1)) * TO_AC_POWER); file_putf(log_file, "Adding power for high to_ac value, total is %d\n", p); } if (o_ptr->to_a > VERYHIGH_TO_AC) { p += ((o_ptr->to_a - (VERYHIGH_TO_AC -1)) * TO_AC_POWER * 2); file_putf(log_file, "Adding power for very high to_ac value, total is %d\n", p); } if (o_ptr->to_a >= INHIBIT_AC) { p += INHIBIT_POWER; file_putf(log_file, "INHIBITING: AC bonus too high\n"); } /* Add power for light sources by radius XXX Hack - rewrite calc_torch! */ if (wield_slot(o_ptr) == INVEN_LIGHT) { p += BASE_LIGHT_POWER; /* Artifact lights have larger radius so add more */ if (o_ptr->artifact) p += BASE_LIGHT_POWER; file_putf(log_file, "Adding power for light radius, total is %d\n", p); } /* Add base power for jewelry */ if (object_is_jewelry(o_ptr)) { p += BASE_JEWELRY_POWER; file_putf(log_file, "Adding power for jewelry, total is %d\n", p); } /* Add power for non-derived flags (derived flags have flag_power 0) */ for (i = of_next(flags, FLAG_START); i != FLAG_END; i = of_next(flags, i + 1)) { if (flag_uses_pval(i)) { j = which_pval(o_ptr, i); if (known || object_this_pval_is_visible(o_ptr, j)) { k = o_ptr->pval[j]; extra_stat_bonus += (k * pval_mult(i)); } } else k = 1; if (flag_power(i)) { p += (k * flag_power(i) * slot_mult(i, wield_slot(o_ptr))); file_putf(log_file, "Adding power for %s, total is %d\n", flag_name(i), p); } /* Track combinations of flag types - note we ignore SUST_CHR */ for (j = 0; j < N_ELEMENTS(sets); j++) if ((sets[j].type == obj_flag_type(i)) && (i != OF_SUST_CHR)) sets[j].count++; } /* Add extra power term if there are a lot of ability bonuses */ if (extra_stat_bonus > 249) { file_putf(log_file, "Inhibiting! (Total ability bonus of %d is too high)\n", extra_stat_bonus); p += INHIBIT_POWER; } else { p += ability_power[extra_stat_bonus / 10]; file_putf(log_file, "Adding power for pval total of %d, total is %d\n", extra_stat_bonus, p); } /* Add extra power for multiple flags of the same type */ for (i = 0; i < N_ELEMENTS(sets); i++) { if (sets[i].count > 1) { q = (sets[i].factor * sets[i].count * sets[i].count); /* Scale damage-dependent set bonuses by damage dice power */ if (sets[i].dam_dep) q = q * dice_pwr / (DAMAGE_POWER * 5); p += q; file_putf(log_file, "Adding power for multiple %s, total is %d\n", sets[i].desc, p); } /* Add bonus if item has a full set of these flags */ if (sets[i].count == sets[i].size) { p += sets[i].bonus; file_putf(log_file, "Adding power for full set of %s, total is %d\n", sets[i].desc, p); } } /* add power for effect */ if (known || object_effect_is_known(o_ptr)) { if (o_ptr->artifact && o_ptr->artifact->effect) { p += effect_power(o_ptr->artifact->effect); file_putf(log_file, "Adding power for artifact activation, total is %d\n", p); } else { p += effect_power(o_ptr->kind->effect); file_putf(log_file, "Adding power for item activation, total is %d\n", p); } } file_putf(log_file, "FINAL POWER IS %d\n", p); return p; } angband-v3.3.2/src/object/list-slays.h0000644000175000017500000000653311651552410017130 0ustar chriscchrisc/* * File: list-slays.h * Purpose: List of slay/brand types */ /* * Entries in this table should be in ascending order of multiplier, to * ensure that the highest one takes precedence. Structure is name, * object flag, vulnerable flag, monster resist flag, multiplier, ranged verb, * melee verb, verb describing what the thing does when it is active, * description of affected creatures, brand */ SLAY(XXX, FLAG_END, FLAG_END, FLAG_END, 0, NULL, NULL, NULL, NULL, NULL) SLAY(ANIMAL2, OF_SLAY_ANIMAL, RF_ANIMAL, FLAG_END, 2, "pierces", "smite", "glows", "animals", NULL) SLAY(EVIL2, OF_SLAY_EVIL, RF_EVIL, FLAG_END, 2, "pierces", "smite", "glows", "evil creatures", NULL) SLAY(ACID2, OF_BRAND_FIZZ, FLAG_END, RF_IM_ACID, 2, "corrodes", "corrode", "fizzes", "creatures not resistant to acid", "weak acid") SLAY(ELEC2, OF_BRAND_BUZZ, FLAG_END, RF_IM_ELEC, 2, "zaps", "zap", "buzzes", "creatures not resistant to electricity", "weak lightning") SLAY(FIRE2, OF_BRAND_WARM, FLAG_END, RF_IM_FIRE, 2, "singes", "singe", "grows warm", "creatures not resistant to fire", "weak flames") SLAY(COLD2, OF_BRAND_COOL, FLAG_END, RF_IM_COLD, 2, "chills" , "chill", "grows cool", "creatures not resistant to cold", "weak frost") SLAY(POISON2, OF_BRAND_ICKY, FLAG_END, RF_IM_POIS, 2, "sickens", "sicken", "glows green", "creatures not resistant to poison", "weak venom") SLAY(UNDEAD3, OF_SLAY_UNDEAD, RF_UNDEAD, FLAG_END, 3, "pierces", "smite", "glows", "undead", NULL) SLAY(DEMON3, OF_SLAY_DEMON, RF_DEMON, FLAG_END, 3, "pierces", "smite", "glows", "demons", NULL) SLAY(ORC3, OF_SLAY_ORC, RF_ORC, FLAG_END, 3, "pierces", "smite", "glows", "orcs", NULL) SLAY(TROLL3, OF_SLAY_TROLL, RF_TROLL, FLAG_END, 3, "pierces", "smite", "glows", "trolls", NULL) SLAY(GIANT3, OF_SLAY_GIANT, RF_GIANT, FLAG_END, 3, "pierces", "smite", "glows", "giants", NULL) SLAY(DRAGON3, OF_SLAY_DRAGON, RF_DRAGON, FLAG_END, 3, "pierces", "smite", "glows", "dragons", NULL) SLAY(ACID3, OF_BRAND_ACID, FLAG_END, RF_IM_ACID, 3, "dissolves", "dissolve", "spits", "creatures not resistant to acid", "acid") SLAY(ELEC3, OF_BRAND_ELEC, FLAG_END, RF_IM_ELEC, 3, "shocks", "shock", "crackles", "creatures not resistant to electricity", "lightning") SLAY(FIRE3, OF_BRAND_FIRE, FLAG_END, RF_IM_FIRE, 3, "burns", "burn", "flares", "creatures not resistant to fire", "flames") SLAY(COLD3, OF_BRAND_COLD, FLAG_END, RF_IM_COLD, 3, "freezes" , "freeze", "grows cold", "creatures not resistant to cold", "frost") SLAY(POISON3, OF_BRAND_POIS, FLAG_END, RF_IM_POIS, 3, "poisons", "poison", "seethes", "creatures not resistant to poison", "venom") SLAY(DRAGON5, OF_KILL_DRAGON, RF_DRAGON, FLAG_END, 5, "deeply pierces", "fiercely smite", "glows brightly", "dragons", NULL) SLAY(DEMON5, OF_KILL_DEMON, RF_DEMON, FLAG_END, 5, "deeply pierces", "fiercely smite", "glows brightly", "demons", NULL) SLAY(UNDEAD5, OF_KILL_UNDEAD, RF_UNDEAD, FLAG_END, 5, "deeply pierces", "fiercely smite", "glows brightly", "undead", NULL) angband-v3.3.2/src/object/obj-util.c0000644000175000017500000027015011651552410016542 0ustar chriscchrisc/* * File: object2.c * Purpose: Object list maintenance and other object utilities * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "effects.h" #include "game-cmd.h" #include "generate.h" #include "history.h" #include "monster/mon-make.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "prefs.h" #include "randname.h" #include "spells.h" #include "squelch.h" #include "z-queue.h" struct object *o_list; /* * Hold the titles of scrolls, 6 to 14 characters each, plus quotes. */ char scroll_adj[MAX_TITLES][18]; static void flavor_assign_fixed(void) { int i; struct flavor *f; for (f = flavors; f; f = f->next) { if (f->sval == SV_UNKNOWN) continue; for (i = 0; i < z_info->k_max; i++) { struct object_kind *k = &k_info[i]; if (k->tval == f->tval && k->sval == f->sval) k->flavor = f; } } } static void flavor_assign_random(byte tval) { int i; int flavor_count = 0; int choice; struct flavor *f; /* Count the random flavors for the given tval */ for (f = flavors; f; f = f->next) if (f->tval == tval && f->sval == SV_UNKNOWN) flavor_count++; for (i = 0; i < z_info->k_max; i++) { if (k_info[i].tval != tval || k_info[i].flavor) continue; /* HACK - Ordinary food is "boring" */ if ((tval == TV_FOOD) && (k_info[i].sval < SV_FOOD_MIN_SHROOM)) continue; if (!flavor_count) quit_fmt("Not enough flavors for tval %d.", tval); choice = randint0(flavor_count); for (f = flavors; f; f = f->next) { if (f->tval != tval || f->sval != SV_UNKNOWN) continue; if (choice == 0) { k_info[i].flavor = f; f->sval = k_info[i].sval; if (tval == TV_SCROLL) f->text = scroll_adj[k_info[i].sval]; flavor_count--; break; } choice--; } } } /* * Prepare the "variable" part of the "k_info" array. * * The "color"/"metal"/"type" of an item is its "flavor". * For the most part, flavors are assigned randomly each game. * * Initialize descriptions for the "colored" objects, including: * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls. * * The first 4 entries for potions are fixed (Water, Apple Juice, * Slime Mold Juice, Unused Potion). * * Scroll titles are always between 6 and 14 letters long. This is * ensured because every title is composed of whole words, where every * word is from 2 to 8 letters long, and that no scroll is finished * until it attempts to grow beyond 15 letters. The first time this * can happen is when the current title has 6 letters and the new word * has 8 letters, which would result in a 6 letter scroll title. * * Hack -- make sure everything stays the same for each saved game * This is accomplished by the use of a saved "random seed", as in * "town_gen()". Since no other functions are called while the special * seed is in effect, so this function is pretty "safe". */ void flavor_init(void) { int i, j; /* Hack -- Use the "simple" RNG */ Rand_quick = TRUE; /* Hack -- Induce consistant flavors */ Rand_value = seed_flavor; flavor_assign_fixed(); flavor_assign_random(TV_RING); flavor_assign_random(TV_AMULET); flavor_assign_random(TV_STAFF); flavor_assign_random(TV_WAND); flavor_assign_random(TV_ROD); flavor_assign_random(TV_FOOD); flavor_assign_random(TV_POTION); /* Scrolls (random titles, always white) */ for (i = 0; i < MAX_TITLES; i++) { char buf[26]; char *end = buf + 1; int titlelen = 0; int wordlen; bool okay = TRUE; strcpy(buf, "\""); wordlen = randname_make(RANDNAME_SCROLL, 2, 8, end, 24, name_sections); while (titlelen + wordlen < (int)(sizeof(scroll_adj[0]) - 3)) { end[wordlen] = ' '; titlelen += wordlen + 1; end += wordlen + 1; wordlen = randname_make(RANDNAME_SCROLL, 2, 8, end, 24 - titlelen, name_sections); } buf[titlelen] = '"'; buf[titlelen+1] = '\0'; /* Check the scroll name hasn't already been generated */ for (j = 0; j < i; j++) { if (streq(buf, scroll_adj[j])) { okay = FALSE; break; } } if (okay) { my_strcpy(scroll_adj[i], buf, sizeof(scroll_adj[0])); } else { /* Have another go at making a name */ i--; } } flavor_assign_random(TV_SCROLL); /* Hack -- Use the "complex" RNG */ Rand_quick = FALSE; /* Analyze every object */ for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip "empty" objects */ if (!k_ptr->name) continue; /* No flavor yields aware */ if (!k_ptr->flavor) k_ptr->aware = TRUE; } } #ifdef ALLOW_BORG_GRAPHICS extern void init_translate_visuals(void); #endif /* ALLOW_BORG_GRAPHICS */ /* * Reset the "visual" lists * * This involves resetting various things to their "default" state. * * If the "prefs" flag is TRUE, then we will also load the appropriate * "user pref file" based on the current setting of the "use_graphics" * flag. This is useful for switching "graphics" on/off. */ /* XXX this does not belong here */ void reset_visuals(bool load_prefs) { int i; struct flavor *f; /* Extract default attr/char code for features */ for (i = 0; i < z_info->f_max; i++) { int j; feature_type *f_ptr = &f_info[i]; /* Assume we will use the underlying values */ for (j = 0; j < FEAT_LIGHTING_MAX; j++) { f_ptr->x_attr[j] = f_ptr->d_attr; f_ptr->x_char[j] = f_ptr->d_char; } } /* Extract default attr/char code for objects */ for (i = 0; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Default attr/char */ k_ptr->x_attr = k_ptr->d_attr; k_ptr->x_char = k_ptr->d_char; } /* Extract default attr/char code for monsters */ for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; /* Default attr/char */ r_ptr->x_attr = r_ptr->d_attr; r_ptr->x_char = r_ptr->d_char; } /* Extract default attr/char code for flavors */ for (f = flavors; f; f = f->next) { f->x_attr = f->d_attr; f->x_char = f->d_char; } /* Extract attr/chars for inventory objects (by tval) */ for (i = 0; i < (int)N_ELEMENTS(tval_to_attr); i++) { /* Default to white */ tval_to_attr[i] = TERM_WHITE; } if (!load_prefs) return; /* Graphic symbols */ if (use_graphics) process_pref_file("graf.prf", FALSE, FALSE); /* Normal symbols */ else process_pref_file("font.prf", FALSE, FALSE); #ifdef ALLOW_BORG_GRAPHICS /* Initialize the translation table for the borg */ init_translate_visuals(); #endif /* ALLOW_BORG_GRAPHICS */ } /* * Obtain the flags for an item */ void object_flags(const object_type *o_ptr, bitflag flags[OF_SIZE]) { of_wipe(flags); if (!o_ptr->kind) return; of_copy(flags, o_ptr->flags); } /* * Obtain the flags for an item which are known to the player */ void object_flags_known(const object_type *o_ptr, bitflag flags[OF_SIZE]) { object_flags(o_ptr, flags); of_inter(flags, o_ptr->known_flags); if (object_flavor_is_aware(o_ptr)) of_union(flags, o_ptr->kind->flags); if (o_ptr->ego && easy_know(o_ptr)) of_union(flags, o_ptr->ego->flags); } /* * Convert an inventory index into a one character label. * * Note that the label does NOT distinguish inven/equip. */ char index_to_label(int i) { /* Indexes for "inven" are easy */ if (i < INVEN_WIELD) return (I2A(i)); /* Indexes for "equip" are offset */ return (I2A(i - INVEN_WIELD)); } /* * Convert a label into the index of an item in the "inven". * * Return "-1" if the label does not indicate a real item. */ s16b label_to_inven(int c) { int i; /* Convert */ i = (islower((unsigned char)c) ? A2I(c) : -1); /* Verify the index */ if ((i < 0) || (i > INVEN_PACK)) return (-1); /* Empty slots can never be chosen */ if (!p_ptr->inventory[i].kind) return (-1); /* Return the index */ return (i); } /* * Convert a label into the index of a item in the "equip". * * Return "-1" if the label does not indicate a real item. */ s16b label_to_equip(int c) { int i; /* Convert */ i = (islower((unsigned char)c) ? A2I(c) : -1) + INVEN_WIELD; /* Verify the index */ if ((i < INVEN_WIELD) || (i >= ALL_INVEN_TOTAL)) return (-1); if (i == INVEN_TOTAL) return (-1); /* Empty slots can never be chosen */ if (!p_ptr->inventory[i].kind) return (-1); /* Return the index */ return (i); } /* * Hack -- determine if an item is "wearable" (or a missile) */ bool wearable_p(const object_type *o_ptr) { /* Valid "tval" codes */ switch (o_ptr->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_LIGHT: case TV_AMULET: case TV_RING: return (TRUE); } /* Nope */ return (FALSE); } int get_inscribed_ammo_slot(const object_type *o_ptr) { char *s; if (!o_ptr->note) return 0; s = strchr(quark_str(o_ptr->note), 'f'); if (!s || s[1] < '0' || s[1] > '9') return 0; return QUIVER_START + (s[1] - '0'); } /** * Used by wield_slot() to find an appopriate slot for ammo. See wield_slot() * for information on what this returns. */ s16b wield_slot_ammo(const object_type *o_ptr) { s16b i, open = 0; /* If the ammo is inscribed with a slot number, we'll try to put it in */ /* that slot, if possible. */ i = get_inscribed_ammo_slot(o_ptr); if (i && !p_ptr->inventory[i].kind) return i; for (i = QUIVER_START; i < QUIVER_END; i++) { if (!p_ptr->inventory[i].kind) { /* Save the open slot if we haven't found one already */ if (!open) open = i; continue; } /* If ammo is cursed we can't stack it */ if (cursed_p(p_ptr->inventory[i].flags)) continue; /* If they are stackable, we'll use this slot for sure */ if (object_similar(&p_ptr->inventory[i], o_ptr, OSTACK_QUIVER)) return i; } /* If not absorbed, return an open slot (or QUIVER_START if no room) */ return open ? open : QUIVER_START; } /** * Determine which equipment slot (if any) an item likes. The slot might (or * might not) be open, but it is a slot which the object could be equipped in. * * For items where multiple slots could work (e.g. ammo or rings), the function * will try to a return a stackable slot first (only for ammo), then an open * slot if possible, and finally a used (but valid) slot if necessary. */ s16b wield_slot(const object_type *o_ptr) { /* Slot for equipment */ switch (o_ptr->tval) { case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: return (INVEN_WIELD); case TV_BOW: return (INVEN_BOW); case TV_RING: return p_ptr->inventory[INVEN_RIGHT].kind ? INVEN_LEFT : INVEN_RIGHT; case TV_AMULET: return (INVEN_NECK); case TV_LIGHT: return (INVEN_LIGHT); case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: return (INVEN_BODY); case TV_CLOAK: return (INVEN_OUTER); case TV_SHIELD: return (INVEN_ARM); case TV_CROWN: case TV_HELM: return (INVEN_HEAD); case TV_GLOVES: return (INVEN_HANDS); case TV_BOOTS: return (INVEN_FEET); case TV_BOLT: case TV_ARROW: case TV_SHOT: return wield_slot_ammo(o_ptr); } /* No slot available */ return (-1); } /* * \returns whether item o_ptr will fit in slot 'slot' */ bool slot_can_wield_item(int slot, const object_type *o_ptr) { if (o_ptr->tval == TV_RING) return (slot == INVEN_LEFT || slot == INVEN_RIGHT) ? TRUE : FALSE; else if (obj_is_ammo(o_ptr)) return (slot >= QUIVER_START && slot < QUIVER_END) ? TRUE : FALSE; else return (wield_slot(o_ptr) == slot) ? TRUE : FALSE; } /* * Return a string mentioning how a given item is carried */ const char *mention_use(int slot) { switch (slot) { case INVEN_WIELD: { if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < p_ptr->inventory[slot].weight / 10) return "Just lifting"; else return "Wielding"; } case INVEN_BOW: { if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < p_ptr->inventory[slot].weight / 10) return "Just holding"; else return "Shooting"; } case INVEN_LEFT: return "On left hand"; case INVEN_RIGHT: return "On right hand"; case INVEN_NECK: return "Around neck"; case INVEN_LIGHT: return "Light source"; case INVEN_BODY: return "On body"; case INVEN_OUTER: return "About body"; case INVEN_ARM: return "On arm"; case INVEN_HEAD: return "On head"; case INVEN_HANDS: return "On hands"; case INVEN_FEET: return "On feet"; case QUIVER_START + 0: return "In quiver [f0]"; case QUIVER_START + 1: return "In quiver [f1]"; case QUIVER_START + 2: return "In quiver [f2]"; case QUIVER_START + 3: return "In quiver [f3]"; case QUIVER_START + 4: return "In quiver [f4]"; case QUIVER_START + 5: return "In quiver [f5]"; case QUIVER_START + 6: return "In quiver [f6]"; case QUIVER_START + 7: return "In quiver [f7]"; case QUIVER_START + 8: return "In quiver [f8]"; case QUIVER_START + 9: return "In quiver [f9]"; } /*if (slot >= QUIVER_START && slot < QUIVER_END) return "In quiver";*/ return "In pack"; } /* * Return a string describing how a given item is being worn. * Currently, only used for items in the equipment, not inventory. */ const char *describe_use(int i) { const char *p; switch (i) { case INVEN_WIELD: p = "attacking monsters with"; break; case INVEN_BOW: p = "shooting missiles with"; break; case INVEN_LEFT: p = "wearing on your left hand"; break; case INVEN_RIGHT: p = "wearing on your right hand"; break; case INVEN_NECK: p = "wearing around your neck"; break; case INVEN_LIGHT: p = "using to light the way"; break; case INVEN_BODY: p = "wearing on your body"; break; case INVEN_OUTER: p = "wearing on your back"; break; case INVEN_ARM: p = "wearing on your arm"; break; case INVEN_HEAD: p = "wearing on your head"; break; case INVEN_HANDS: p = "wearing on your hands"; break; case INVEN_FEET: p = "wearing on your feet"; break; default: p = "carrying in your pack"; break; } /* Hack -- Heavy weapon */ if (i == INVEN_WIELD) { object_type *o_ptr; o_ptr = &p_ptr->inventory[i]; if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < o_ptr->weight / 10) { p = "just lifting"; } } /* Hack -- Heavy bow */ if (i == INVEN_BOW) { object_type *o_ptr; o_ptr = &p_ptr->inventory[i]; if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < o_ptr->weight / 10) { p = "just holding"; } } /* Return the result */ return p; } /* * Check an item against the item tester info */ bool item_tester_okay(const object_type *o_ptr) { /* Hack -- allow listing empty slots */ if (item_tester_full) return (TRUE); /* Require an item */ if (!o_ptr->kind) return (FALSE); /* Hack -- ignore "gold" */ if (o_ptr->tval == TV_GOLD) return (FALSE); /* Check the tval */ if (item_tester_tval) { if (item_tester_tval != o_ptr->tval) return (FALSE); } /* Check the hook */ if (item_tester_hook) { if (!(*item_tester_hook)(o_ptr)) return (FALSE); } /* Assume okay */ return (TRUE); } /* * Get the indexes of objects at a given floor location. -TNB- * * Return the number of object indexes acquired. * * Valid flags are any combination of the bits: * 0x01 -- Verify item tester * 0x02 -- Marked/visible items only * 0x04 -- Only the top item */ int scan_floor(int *items, int max_size, int y, int x, int mode) { int this_o_idx, next_o_idx; int num = 0; /* Sanity */ if (!in_bounds(y, x)) return 0; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* XXX Hack -- Enforce limit */ if (num >= max_size) break; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Item tester */ if ((mode & 0x01) && !item_tester_okay(o_ptr)) continue; /* Marked */ if ((mode & 0x02) && (!o_ptr->marked || squelch_item_ok(o_ptr))) continue; /* Accept this item */ items[num++] = this_o_idx; /* Only one */ if (mode & 0x04) break; } return num; } /* * Excise a dungeon object from any stacks */ void excise_object_idx(int o_idx) { object_type *j_ptr; s16b this_o_idx, next_o_idx = 0; s16b prev_o_idx = 0; /* Object */ j_ptr = object_byid(o_idx); /* Monster */ if (j_ptr->held_m_idx) { monster_type *m_ptr; /* Monster */ m_ptr = cave_monster(cave, j_ptr->held_m_idx); /* Scan all objects in the grid */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Done */ if (this_o_idx == o_idx) { /* No previous */ if (prev_o_idx == 0) { /* Remove from list */ m_ptr->hold_o_idx = next_o_idx; } /* Real previous */ else { object_type *i_ptr; /* Previous object */ i_ptr = object_byid(prev_o_idx); /* Remove from list */ i_ptr->next_o_idx = next_o_idx; } /* Forget next pointer */ o_ptr->next_o_idx = 0; /* Done */ break; } /* Save prev_o_idx */ prev_o_idx = this_o_idx; } } /* Dungeon */ else { int y = j_ptr->iy; int x = j_ptr->ix; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Done */ if (this_o_idx == o_idx) { /* No previous */ if (prev_o_idx == 0) { /* Remove from list */ cave->o_idx[y][x] = next_o_idx; } /* Real previous */ else { object_type *i_ptr; /* Previous object */ i_ptr = object_byid(prev_o_idx); /* Remove from list */ i_ptr->next_o_idx = next_o_idx; } /* Forget next pointer */ o_ptr->next_o_idx = 0; /* Done */ break; } /* Save prev_o_idx */ prev_o_idx = this_o_idx; } } } /* * Delete a dungeon object * * Handle "stacks" of objects correctly. */ void delete_object_idx(int o_idx) { object_type *j_ptr; /* Excise */ excise_object_idx(o_idx); /* Object */ j_ptr = object_byid(o_idx); /* Dungeon floor */ if (!(j_ptr->held_m_idx)) { int y, x; /* Location */ y = j_ptr->iy; x = j_ptr->ix; cave_light_spot(cave, y, x); } /* Delete the mimicking monster if necessary */ if (j_ptr->mimicking_m_idx) { monster_type *m_ptr; m_ptr = cave_monster(cave, j_ptr->mimicking_m_idx); /* Clear the mimicry */ m_ptr->mimicked_o_idx = 0; delete_monster_idx(j_ptr->mimicking_m_idx); } /* Wipe the object */ object_wipe(j_ptr); /* Count objects */ o_cnt--; /* Stop tracking deleted objects if necessary */ if (tracked_object_is(0 - o_idx)) { track_object(NO_OBJECT); } } /* * Deletes all objects at given location */ void delete_object(int y, int x) { s16b this_o_idx, next_o_idx = 0; /* Paranoia */ if (!in_bounds(y, x)) return; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Preserve unseen artifacts */ if (o_ptr->artifact && !object_was_sensed(o_ptr)) o_ptr->artifact->created = FALSE; /* Delete the mimicking monster if necessary */ if (o_ptr->mimicking_m_idx) { monster_type *m_ptr; m_ptr = cave_monster(cave, o_ptr->mimicking_m_idx); /* Clear the mimicry */ m_ptr->mimicked_o_idx = 0; delete_monster_idx(o_ptr->mimicking_m_idx); } /* Wipe the object */ object_wipe(o_ptr); /* Count objects */ o_cnt--; } /* Objects are gone */ cave->o_idx[y][x] = 0; /* Visual update */ cave_light_spot(cave, y, x); } /* * Move an object from index i1 to index i2 in the object list */ static void compact_objects_aux(int i1, int i2) { int i; object_type *o_ptr; /* Do nothing */ if (i1 == i2) return; /* Repair objects */ for (i = 1; i < o_max; i++) { /* Get the object */ o_ptr = object_byid(i); /* Skip "dead" objects */ if (!o_ptr->kind) continue; /* Repair "next" pointers */ if (o_ptr->next_o_idx == i1) { /* Repair */ o_ptr->next_o_idx = i2; } } /* Get the object */ o_ptr = object_byid(i1); /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Repair monster */ if (m_ptr->hold_o_idx == i1) { /* Repair */ m_ptr->hold_o_idx = i2; } } /* Dungeon */ else { int y, x; /* Get location */ y = o_ptr->iy; x = o_ptr->ix; /* Repair grid */ if (cave->o_idx[y][x] == i1) { /* Repair */ cave->o_idx[y][x] = i2; } /* Mimic */ if (o_ptr->mimicking_m_idx) { monster_type *m_ptr; /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->mimicking_m_idx); /* Repair monster */ if (m_ptr->mimicked_o_idx == i1) { /* Repair */ m_ptr->mimicked_o_idx = i2; } } } /* Hack -- move object */ COPY(object_byid(i2), object_byid(i1), object_type); /* Hack -- wipe hole */ object_wipe(o_ptr); } /* * Compact and reorder the object list * * This function can be very dangerous, use with caution! * * When compacting objects, we first destroy gold, on the basis that by the * time item compaction becomes an issue, the player really won't care. * We also nuke items marked as squelch. * * When compacting other objects, we base the saving throw on a combination of * object level, distance from player, and current "desperation". * * After compacting, we "reorder" the objects into a more compact order, and we * reset the allocation info, and the "live" array. */ void compact_objects(int size) { int py = p_ptr->py; int px = p_ptr->px; int i, y, x, cnt; int cur_lev, cur_dis, chance; /* Reorder objects when not passed a size */ if (!size) { /* Excise dead objects (backwards!) */ for (i = o_max - 1; i >= 1; i--) { object_type *o_ptr = object_byid(i); if (o_ptr->kind) continue; /* Move last object into open hole */ compact_objects_aux(o_max - 1, i); /* Compress "o_max" */ o_max--; } return; } /* Message */ msg("Compacting objects..."); /*** Try destroying objects ***/ /* First do gold */ for (i = 1; (i < o_max) && (size); i++) { object_type *o_ptr = object_byid(i); /* Nuke gold or squelched items */ if (o_ptr->tval == TV_GOLD || squelch_item_ok(o_ptr)) { delete_object_idx(i); size--; } } /* Compact at least 'size' objects */ for (cnt = 1; size; cnt++) { /* Get more vicious each iteration */ cur_lev = 5 * cnt; /* Get closer each iteration */ cur_dis = 5 * (20 - cnt); /* Examine the objects */ for (i = 1; (i < o_max) && (size); i++) { object_type *o_ptr = object_byid(i); if (!o_ptr->kind) continue; /* Hack -- High level objects start out "immune" */ if (o_ptr->kind->level > cur_lev && !o_ptr->kind->squelch) continue; /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Get the location */ y = m_ptr->fy; x = m_ptr->fx; /* Monsters protect their objects */ if ((randint0(100) < 90) && !o_ptr->kind->squelch) continue; } /* Mimicked items */ else if (o_ptr->mimicking_m_idx) { /* Get the location */ y = o_ptr->iy; x = o_ptr->ix; /* Mimicked items try hard not to be compacted */ if (randint0(100) < 90) continue; } /* Dungeon */ else { /* Get the location */ y = o_ptr->iy; x = o_ptr->ix; } /* Nearby objects start out "immune" */ if ((cur_dis > 0) && (distance(py, px, y, x) < cur_dis) && !o_ptr->kind->squelch) continue; /* Saving throw */ chance = 90; /* Hack -- only compact artifacts in emergencies */ if (o_ptr->artifact && (cnt < 1000)) chance = 100; /* Apply the saving throw */ if (randint0(100) < chance) continue; /* Delete the object */ delete_object_idx(i); size--; } } /* Reorder objects */ compact_objects(0); } /* * Delete all the items when player leaves the level * * Note -- we do NOT visually reflect these (irrelevant) changes * * Hack -- we clear the "cave->o_idx[y][x]" field for every grid, * and the "m_ptr->next_o_idx" field for every monster, since * we know we are clearing every object. Technically, we only * clear those fields for grids/monsters containing objects, * and we clear it once for every such object. */ void wipe_o_list(struct cave *c) { int i; /* Delete the existing objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); if (!o_ptr->kind) continue; /* Preserve artifacts or mark them as lost in the history */ if (o_ptr->artifact) { /* Preserve if dungeon creation failed, or preserve mode, or items * carried by monsters, and only artifacts not seen */ if ((!character_dungeon || !OPT(birth_no_preserve) || o_ptr->held_m_idx) && !object_was_sensed(o_ptr)) o_ptr->artifact->created = FALSE; else history_lose_artifact(o_ptr->artifact); } /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Hack -- see above */ m_ptr->hold_o_idx = 0; } /* Dungeon */ else { /* Get the location */ int y = o_ptr->iy; int x = o_ptr->ix; /* Hack -- see above */ c->o_idx[y][x] = 0; } /* Wipe the object */ (void)WIPE(o_ptr, object_type); } /* Reset "o_max" */ o_max = 1; /* Reset "o_cnt" */ o_cnt = 0; } /* * Get and return the index of a "free" object. * * This routine should almost never fail, but in case it does, * we must be sure to handle "failure" of this routine. */ s16b o_pop(void) { int i; /* Initial allocation */ if (o_max < z_info->o_max) { /* Get next space */ i = o_max; /* Expand object array */ o_max++; /* Count objects */ o_cnt++; /* Use this object */ return (i); } /* Recycle dead objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); if (o_ptr->kind) continue; /* Count objects */ o_cnt++; /* Use this object */ return (i); } /* Warn the player (except during dungeon creation) */ if (character_dungeon) msg("Too many objects!"); /* Oops */ return (0); } /* * Get the first object at a dungeon location * or NULL if there isn't one. */ object_type *get_first_object(int y, int x) { s16b o_idx = cave->o_idx[y][x]; if (o_idx) return object_byid(o_idx); /* No object */ return (NULL); } /* * Get the next object in a stack or NULL if there isn't one. */ object_type *get_next_object(const object_type *o_ptr) { if (o_ptr->next_o_idx) return object_byid(o_ptr->next_o_idx); /* No more objects */ return NULL; } /* * Determine if a weapon is 'blessed' */ bool is_blessed(const object_type *o_ptr) { bitflag f[OF_SIZE]; /* Get the flags */ object_flags(o_ptr, f); /* Is the object blessed? */ return (of_has(f, OF_BLESSED) ? TRUE : FALSE); } /* * Return the "value" of an "unknown" item * Make a guess at the value of non-aware items */ static s32b object_value_base(const object_type *o_ptr) { /* Use template cost for aware objects */ if (object_flavor_is_aware(o_ptr) || o_ptr->ident & IDENT_STORE) return o_ptr->kind->cost; /* Analyze the type */ switch (o_ptr->tval) { case TV_FOOD: return 5; case TV_POTION: case TV_SCROLL: return 20; case TV_RING: case TV_AMULET: return 45; case TV_WAND: return 50; case TV_STAFF: return 70; case TV_ROD: return 90; } return 0; } /* * Return the "real" price of a "known" item, not including discounts. * * Wand and staffs get cost for each charge. * * Wearable items (weapons, launchers, jewelry, lights, armour) and ammo * are priced according to their power rating. All ammo, and normal (non-ego) * torches are scaled down by AMMO_RESCALER to reflect their impermanence. */ s32b object_value_real(const object_type *o_ptr, int qty, int verbose, bool known) { s32b value, total_value; s32b power; int a = 1; int b = 1; static file_mode pricing_mode = MODE_WRITE; if (wearable_p(o_ptr)) { char buf[1024]; ang_file *log_file = NULL; if (verbose) { path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "pricing.log"); log_file = file_open(buf, pricing_mode, FTYPE_TEXT); if (!log_file) { msg("Error - can't open pricing.log for writing."); exit(1); } pricing_mode = MODE_APPEND; } file_putf(log_file, "object is %s\n", o_ptr->kind->name); power = object_power(o_ptr, verbose, log_file, known); value = sign(power) * ((a * power * power) + (b * power)); if ( (o_ptr->tval == TV_SHOT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_BOLT) || ((o_ptr->tval == TV_LIGHT) && (o_ptr->sval == SV_LIGHT_TORCH) && !o_ptr->ego) ) { value = value / AMMO_RESCALER; if (value < 1) value = 1; } file_putf(log_file, "a is %d and b is %d\n", a, b); file_putf(log_file, "value is %d\n", value); total_value = value * qty; if (verbose) { if (!file_close(log_file)) { msg("Error - can't close pricing.log file."); exit(1); } } if (total_value < 0) total_value = 0; return (total_value); } /* Hack -- "worthless" items */ if (!o_ptr->kind->cost) return (0L); /* Base cost */ value = o_ptr->kind->cost; /* Analyze the item type and quantity*/ switch (o_ptr->tval) { /* Wands/Staffs */ case TV_WAND: case TV_STAFF: { int charges; total_value = value * qty; /* Calculate number of charges, rounded up */ charges = o_ptr->pval[DEFAULT_PVAL] * qty / o_ptr->number; if ((o_ptr->pval[DEFAULT_PVAL] * qty) % o_ptr->number != 0) charges++; /* Pay extra for charges, depending on standard number of charges */ total_value += value * charges / 20; /* Done */ break; } default: { total_value = value * qty; break; } } /* No negative value */ if (total_value < 0) total_value = 0; /* Return the value */ return (total_value); } /* * Return the price of an item including plusses (and charges). * * This function returns the "value" of the given item (qty one). * * Never notice "unknown" bonuses or properties, including "curses", * since that would give the player information he did not have. * * Note that discounted items stay discounted forever. */ s32b object_value(const object_type *o_ptr, int qty, int verbose) { s32b value; if (object_is_known(o_ptr)) { if (cursed_p((bitflag *)o_ptr->flags)) return (0L); value = object_value_real(o_ptr, qty, verbose, TRUE); } else if (wearable_p(o_ptr)) { object_type object_type_body; object_type *j_ptr = &object_type_body; /* Hack -- Felt cursed items */ if (object_was_sensed(o_ptr) && cursed_p((bitflag *)o_ptr->flags)) return (0L); memcpy(j_ptr, o_ptr, sizeof(object_type)); /* give j_ptr only the flags known to be in o_ptr */ object_flags_known(o_ptr, j_ptr->flags); if (!object_attack_plusses_are_visible(o_ptr)) j_ptr->to_h = j_ptr->to_d = 0; if (!object_defence_plusses_are_visible(o_ptr)) j_ptr->to_a = 0; value = object_value_real(j_ptr, qty, verbose, FALSE); } else value = object_value_base(o_ptr) * qty; /* Return the final value */ return (value); } /* * Determine if an item can "absorb" a second item * * See "object_absorb()" for the actual "absorption" code. * * If permitted, we allow weapons/armor to stack, if "known". * * Missiles will combine if both stacks have the same "known" status. * This is done to make unidentified stacks of missiles useful. * * Food, potions, scrolls, and "easy know" items always stack. * * Chests, and activatable items, except rods, never stack (for various * reasons). */ bool object_similar(const object_type *o_ptr, const object_type *j_ptr, object_stack_t mode) { int i; int total = o_ptr->number + j_ptr->number; /* Check against stacking limit - except in stores which absorb anyway */ if (!(mode & OSTACK_STORE) && (total >= MAX_STACK_SIZE)) return FALSE; /* Hack -- identical items cannot be stacked */ if (o_ptr == j_ptr) return FALSE; /* Require identical object kinds */ if (o_ptr->kind != j_ptr->kind) return FALSE; /* Different flags don't stack */ if (!of_is_equal(o_ptr->flags, j_ptr->flags)) return FALSE; /* Artifacts never stack */ if (o_ptr->artifact || j_ptr->artifact) return FALSE; /* Analyze the items */ switch (o_ptr->tval) { /* Chests never stack */ case TV_CHEST: { /* Never okay */ return FALSE; } /* Food, potions, scrolls and rods all stack nicely */ case TV_FOOD: case TV_POTION: case TV_SCROLL: case TV_ROD: { /* Since the kinds are identical, either both will be aware or both will be unaware */ break; } /* Gold, staves and wands stack most of the time */ case TV_STAFF: case TV_WAND: case TV_GOLD: { /* Too much gold or too many charges */ if (o_ptr->pval[DEFAULT_PVAL] + j_ptr->pval[DEFAULT_PVAL] > MAX_PVAL) return FALSE; /* ... otherwise ok */ else break; } /* Weapons, ammo, armour, jewelry, lights */ case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_RING: case TV_AMULET: case TV_LIGHT: case TV_BOLT: case TV_ARROW: case TV_SHOT: { /* Require identical values */ if (o_ptr->ac != j_ptr->ac) return FALSE; if (o_ptr->dd != j_ptr->dd) return FALSE; if (o_ptr->ds != j_ptr->ds) return FALSE; /* Require identical bonuses */ if (o_ptr->to_h != j_ptr->to_h) return FALSE; if (o_ptr->to_d != j_ptr->to_d) return FALSE; if (o_ptr->to_a != j_ptr->to_a) return FALSE; /* Require all identical pvals */ for (i = 0; i < MAX_PVALS; i++) if (o_ptr->pval[i] != j_ptr->pval[i]) return (FALSE); /* Require identical ego-item types */ if (o_ptr->ego != j_ptr->ego) return (FALSE); /* Hack - Never stack recharging wearables ... */ if ((o_ptr->timeout || j_ptr->timeout) && o_ptr->tval != TV_LIGHT) return FALSE; /* ... and lights must have same amount of fuel */ else if ((o_ptr->timeout != j_ptr->timeout) && o_ptr->tval == TV_LIGHT) return FALSE; /* Prevent unIDd items stacking in the object list */ if (mode & OSTACK_LIST && !(o_ptr->ident & j_ptr->ident & IDENT_KNOWN)) return FALSE; /* Probably okay */ break; } /* Anything else */ default: { /* Probably okay */ break; } } /* Require compatible inscriptions */ if (o_ptr->note && j_ptr->note && (o_ptr->note != j_ptr->note)) return FALSE; /* They must be similar enough */ return (TRUE); } /* * Allow one item to "absorb" another, assuming they are similar. * * The blending of the "note" field assumes that either (1) one has an * inscription and the other does not, or (2) neither has an inscription. * In both these cases, we can simply use the existing note, unless the * blending object has a note, in which case we use that note. * * The blending of the "discount" field assumes that either (1) one is a * special inscription and one is nothing, or (2) one is a discount and * one is a smaller discount, or (3) one is a discount and one is nothing, * or (4) both are nothing. In all of these cases, we can simply use the * "maximum" of the two "discount" fields. * * These assumptions are enforced by the "object_similar()" code. */ void object_absorb(object_type *o_ptr, const object_type *j_ptr) { int total = o_ptr->number + j_ptr->number; /* Add together the item counts */ o_ptr->number = ((total < MAX_STACK_SIZE) ? total : (MAX_STACK_SIZE - 1)); /* Blend all knowledge */ o_ptr->ident |= (j_ptr->ident & ~IDENT_EMPTY); of_union(o_ptr->known_flags, j_ptr->known_flags); /* Merge inscriptions */ if (j_ptr->note) o_ptr->note = j_ptr->note; /* Combine timeouts for rod stacking */ if (o_ptr->tval == TV_ROD) o_ptr->timeout += j_ptr->timeout; /* Combine pvals for wands and staves */ if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF || o_ptr->tval == TV_GOLD) { int total = o_ptr->pval[DEFAULT_PVAL] + j_ptr->pval[DEFAULT_PVAL]; o_ptr->pval[DEFAULT_PVAL] = total >= MAX_PVAL ? MAX_PVAL : total; } /* Combine origin data as best we can */ if (o_ptr->origin != j_ptr->origin || o_ptr->origin_depth != j_ptr->origin_depth || o_ptr->origin_xtra != j_ptr->origin_xtra) { int act = 2; if (o_ptr->origin_xtra && j_ptr->origin_xtra) { monster_race *r_ptr = &r_info[o_ptr->origin_xtra]; monster_race *s_ptr = &r_info[j_ptr->origin_xtra]; bool r_uniq = rf_has(r_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; bool s_uniq = rf_has(s_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; if (r_uniq && !s_uniq) act = 0; else if (s_uniq && !r_uniq) act = 1; else act = 2; } switch (act) { /* Overwrite with j_ptr */ case 1: { o_ptr->origin = j_ptr->origin; o_ptr->origin_depth = j_ptr->origin_depth; o_ptr->origin_xtra = j_ptr->origin_xtra; } /* Set as "mixed" */ case 2: { o_ptr->origin = ORIGIN_MIXED; } } } } /* * Wipe an object clean. */ void object_wipe(object_type *o_ptr) { /* Wipe the structure */ (void)WIPE(o_ptr, object_type); } /* * Prepare an object based on an existing object */ void object_copy(object_type *o_ptr, const object_type *j_ptr) { /* Copy the structure */ COPY(o_ptr, j_ptr, object_type); } /* * Prepare an object `dst` representing `amt` objects, based on an existing * object `src` representing at least `amt` objects. * * Takes care of the charge redistribution concerns of stacked items. */ void object_copy_amt(object_type *dst, object_type *src, int amt) { int charge_time = randcalc(src->kind->time, 0, AVERAGE), max_time; /* Get a copy of the object */ object_copy(dst, src); /* Modify quantity */ dst->number = amt; dst->note = src->note; /* * If the item has charges/timeouts, set them to the correct level * too. We split off the same amount as distribute_charges. */ if (src->tval == TV_WAND || src->tval == TV_STAFF) { dst->pval[DEFAULT_PVAL] = src->pval[DEFAULT_PVAL] * amt / src->number; } if (src->tval == TV_ROD) { max_time = charge_time * amt; if (src->timeout > max_time) dst->timeout = max_time; else dst->timeout = src->timeout; } } /** * Split off 'at' items from 'src' into 'dest'. */ void object_split(struct object *dest, struct object *src, int amt) { /* Distribute charges of wands, staves, or rods */ distribute_charges(src, dest, amt); /* Modify quantity */ dest->number = amt; if (src->note) dest->note = src->note; } /** * Find and return the index to the oldest object on the given grid marked as * "squelch". */ static s16b floor_get_idx_oldest_squelched(int y, int x) { s16b squelch_idx = 0; s16b this_o_idx; object_type *o_ptr = NULL; for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = o_ptr->next_o_idx) { o_ptr = object_byid(this_o_idx); if (squelch_item_ok(o_ptr)) squelch_idx = this_o_idx; } return squelch_idx; } /* * Let the floor carry an object, deleting old squelched items if necessary */ s16b floor_carry(struct cave *c, int y, int x, object_type *j_ptr) { int n = 0; s16b o_idx; s16b this_o_idx, next_o_idx = 0; /* Scan objects in that grid for combination */ for (this_o_idx = c->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Check for combination */ if (object_similar(o_ptr, j_ptr, OSTACK_FLOOR)) { /* Combine the items */ object_absorb(o_ptr, j_ptr); /* Result */ return (this_o_idx); } /* Count objects */ n++; } /* Option -- disallow stacking */ if (OPT(birth_no_stacking) && n) return (0); /* The stack is already too large */ if (n >= MAX_FLOOR_STACK) { /* Squelch the oldest squelched object */ s16b squelch_idx = floor_get_idx_oldest_squelched(y, x); if (squelch_idx) delete_object_idx(squelch_idx); else return 0; } /* Make an object */ o_idx = o_pop(); /* Success */ if (o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(o_idx); /* Structure Copy */ object_copy(o_ptr, j_ptr); /* Location */ o_ptr->iy = y; o_ptr->ix = x; /* Forget monster */ o_ptr->held_m_idx = 0; /* Link the object to the pile */ o_ptr->next_o_idx = c->o_idx[y][x]; /* Link the floor to the object */ c->o_idx[y][x] = o_idx; cave_note_spot(c, y, x); cave_light_spot(c, y, x); } /* Result */ return (o_idx); } /* * Let an object fall to the ground at or near a location. * * The initial location is assumed to be "in_bounds_fully()". * * This function takes a parameter "chance". This is the percentage * chance that the item will "disappear" instead of drop. If the object * has been thrown, then this is the chance of disappearance on contact. * * This function will produce a description of a drop event under the player * when "verbose" is true. * * We check several locations to see if we can find a location at which * the object can combine, stack, or be placed. Artifacts will try very * hard to be placed, including "teleporting" to a useful grid if needed. */ void drop_near(struct cave *c, object_type *j_ptr, int chance, int y, int x, bool verbose) { int i, k, n, d, s; int bs, bn; int by, bx; int dy, dx; int ty, tx; object_type *o_ptr; char o_name[80]; bool flag = FALSE; bool plural = FALSE; /* Extract plural */ if (j_ptr->number != 1) plural = TRUE; /* Describe object */ object_desc(o_name, sizeof(o_name), j_ptr, ODESC_BASE); /* Handle normal "breakage" */ if (!j_ptr->artifact && (randint0(100) < chance)) { /* Message */ msg("The %s break%s.", o_name, PLURAL(plural)); /* Failure */ return; } /* Score */ bs = -1; /* Picker */ bn = 0; /* Default */ by = y; bx = x; /* Scan local grids */ for (dy = -3; dy <= 3; dy++) { /* Scan local grids */ for (dx = -3; dx <= 3; dx++) { bool comb = FALSE; /* Calculate actual distance */ d = (dy * dy) + (dx * dx); /* Ignore distant grids */ if (d > 10) continue; /* Location */ ty = y + dy; tx = x + dx; /* Skip illegal grids */ if (!in_bounds_fully(ty, tx)) continue; /* Require line of sight */ if (!los(y, x, ty, tx)) continue; /* Require floor space */ if (cave->feat[ty][tx] != FEAT_FLOOR) continue; /* No objects */ k = 0; n = 0; /* Scan objects in that grid */ for (o_ptr = get_first_object(ty, tx); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Check for possible combination */ if (object_similar(o_ptr, j_ptr, OSTACK_FLOOR)) comb = TRUE; /* Count objects */ if (!squelch_item_ok(o_ptr)) k++; else n++; } /* Add new object */ if (!comb) k++; /* Option -- disallow stacking */ if (OPT(birth_no_stacking) && (k > 1)) continue; /* Paranoia? */ if ((k + n) > MAX_FLOOR_STACK && !floor_get_idx_oldest_squelched(ty, tx)) continue; /* Calculate score */ s = 1000 - (d + k * 5); /* Skip bad values */ if (s < bs) continue; /* New best value */ if (s > bs) bn = 0; /* Apply the randomizer to equivalent values */ if ((++bn >= 2) && (randint0(bn) != 0)) continue; /* Keep score */ bs = s; /* Track it */ by = ty; bx = tx; /* Okay */ flag = TRUE; } } /* Handle lack of space */ if (!flag && !j_ptr->artifact) { /* Message */ msg("The %s disappear%s.", o_name, PLURAL(plural)); /* Debug */ if (p_ptr->wizard) msg("Breakage (no floor space)."); /* Failure */ return; } /* Find a grid */ for (i = 0; !flag; i++) { /* Bounce around */ if (i < 1000) { ty = rand_spread(by, 1); tx = rand_spread(bx, 1); } /* Random locations */ else { ty = randint0(c->height); tx = randint0(c->width); } /* Require floor space */ if (cave->feat[ty][tx] != FEAT_FLOOR) continue; /* Bounce to that location */ by = ty; bx = tx; /* Require floor space */ if (!cave_clean_bold(by, bx)) continue; /* Okay */ flag = TRUE; } /* Give it to the floor */ if (!floor_carry(c, by, bx, j_ptr)) { /* Message */ msg("The %s disappear%s.", o_name, PLURAL(plural)); /* Debug */ if (p_ptr->wizard) msg("Breakage (too many objects)."); if (j_ptr->artifact) j_ptr->artifact->created = FALSE; /* Failure */ return; } /* Sound */ sound(MSG_DROP); /* Message when an object falls under the player */ if (verbose && (cave->m_idx[by][bx] < 0) && !squelch_item_ok(j_ptr)) { msg("You feel something roll beneath your feet."); } } /** * This will push objects off a square. * * The methodology is to load all objects on the square into a queue. Replace * the previous square with a type that does not allow for objects. Drop the * objects. Last, put the square back to its original type. */ void push_object(int y, int x) { /* Save the original terrain feature */ int feat_old = cave->feat[y][x]; object_type *o_ptr; struct queue *queue = q_new(MAX_FLOOR_STACK); /* Push all objects on the square into the queue */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) q_push_ptr(queue, o_ptr); /* Set feature to an open door */ cave_set_feat(cave, y, x, FEAT_OPEN); /* Drop objects back onto the floor */ while (q_len(queue) > 0) { /* Take object from the queue */ o_ptr = q_pop_ptr(queue); /* Drop the object */ drop_near(cave, o_ptr, 0, y, x, FALSE); } /* Delete original objects */ delete_object(y, x); /* Reset cave feature */ cave_set_feat(cave, y, x, feat_old); q_free(queue); } /* * Scatter some "great" objects near the player */ void acquirement(int y1, int x1, int level, int num, bool great) { object_type *i_ptr; object_type object_type_body; /* Acquirement */ while (num--) { /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Make a good (or great) object (if possible) */ if (!make_object(cave, i_ptr, level, TRUE, great, NULL)) continue; i_ptr->origin = ORIGIN_ACQUIRE; i_ptr->origin_depth = p_ptr->depth; /* Drop the object */ drop_near(cave, i_ptr, 0, y1, x1, TRUE); } } /* * Describe the charges on an item in the inventory. */ void inven_item_charges(int item) { object_type *o_ptr = &p_ptr->inventory[item]; /* Require staff/wand */ if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return; /* Require known item */ if (!object_is_known(o_ptr)) return; /* Print a message */ msg("You have %d charge%s remaining.", o_ptr->pval[DEFAULT_PVAL], (o_ptr->pval[DEFAULT_PVAL] != 1) ? "s" : ""); } /* * Describe an item in the inventory. Note: only called when an item is * dropped, used, or otherwise deleted from the inventory */ void inven_item_describe(int item) { object_type *o_ptr = &p_ptr->inventory[item]; char o_name[80]; if (o_ptr->artifact && (object_is_known(o_ptr) || object_name_is_visible(o_ptr))) { /* Get a description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL | ODESC_SINGULAR); /* Print a message */ msg("You no longer have the %s (%c).", o_name, index_to_label(item)); } else { /* Get a description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Print a message */ msg("You have %s (%c).", o_name, index_to_label(item)); } } /* * Increase the "number" of an item in the inventory */ void inven_item_increase(int item, int num) { object_type *o_ptr = &p_ptr->inventory[item]; /* Apply */ num += o_ptr->number; /* Bounds check */ if (num > 255) num = 255; else if (num < 0) num = 0; /* Un-apply */ num -= o_ptr->number; /* Change the number and weight */ if (num) { /* Add the number */ o_ptr->number += num; /* Add the weight */ p_ptr->total_weight += (num * o_ptr->weight); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana XXX */ p_ptr->update |= (PU_MANA); /* Combine the pack */ p_ptr->notice |= (PN_COMBINE); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } } /** * Save the size of the quiver. */ void save_quiver_size(struct player *p) { int i, count = 0; for (i = QUIVER_START; i < QUIVER_END; i++) if (p->inventory[i].kind) count += p->inventory[i].number; p->quiver_size = count; p->quiver_slots = (count + 98) / 99; p->quiver_remainder = count % 99; } /** * Compare ammunition from slots (0-9); used for sorting. * * \returns -1 if slot1 should come first, 1 if slot2 should come first, or 0. */ int compare_ammo(int slot1, int slot2) { /* Right now there is no sorting criteria */ return 0; } /** * Swap ammunition between quiver slots (0-9). */ void swap_quiver_slots(int slot1, int slot2) { int i = slot1 + QUIVER_START; int j = slot2 + QUIVER_START; object_type o; object_copy(&o, &p_ptr->inventory[i]); object_copy(&p_ptr->inventory[i], &p_ptr->inventory[j]); object_copy(&p_ptr->inventory[j], &o); /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(j); } if (tracked_object_is(j)) { track_object(i); } } /** * Sorts the quiver--ammunition inscribed with @fN prefers to end up in quiver * slot N. */ void sort_quiver(void) { /* Ammo slots go from 0-9; these indices correspond to the range of * (QUIVER_START) - (QUIVER_END-1) in inventory[]. */ bool locked[QUIVER_SIZE] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}; int desired[QUIVER_SIZE] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; int i, j, k; object_type *o_ptr; /* Here we figure out which slots have inscribed ammo, and whether that * ammo is already in the slot it "wants" to be in or not. */ for (i=0; i < QUIVER_SIZE; i++) { j = QUIVER_START + i; o_ptr = &p_ptr->inventory[j]; /* Skip this slot if it doesn't have ammo */ if (!o_ptr->kind) continue; /* Figure out which slot this ammo prefers, if any */ k = get_inscribed_ammo_slot(o_ptr); if (!k) continue; k -= QUIVER_START; if (k == i) locked[i] = TRUE; if (desired[k] < 0) desired[k] = i; } /* For items which had a preference that was not fulfilled, we will swap * them into the slot as long as it isn't already locked. */ for (i=0; i < QUIVER_SIZE; i++) { if (locked[i] || desired[i] < 0) continue; /* item in slot 'desired[i]' desires to be in slot 'i' */ swap_quiver_slots(desired[i], i); locked[i] = TRUE; } /* Now we need to compact ammo which isn't in a preferrred slot towards the * "front" of the quiver */ for (i=0; i < QUIVER_SIZE; i++) { /* If the slot isn't empty, skip it */ if (p_ptr->inventory[QUIVER_START + i].kind) continue; /* Start from the end and find an unlocked item to put here. */ for (j=QUIVER_SIZE - 1; j > i; j--) { if (!p_ptr->inventory[QUIVER_START + j].kind || locked[j]) continue; swap_quiver_slots(i, j); break; } } /* Now we will sort all other ammo using a simple insertion sort */ for (i=0; i < QUIVER_SIZE; i++) { k = i; if (!locked[k]) for (j = i + 1; j < QUIVER_SIZE; j++) if (!locked[j] && compare_ammo(k, j) > 0) swap_quiver_slots(j, k); } } /* * Shifts ammo at or above the item slot towards the end of the quiver, making * room for a new piece of ammo. */ void open_quiver_slot(int slot) { int i, pref; int dest = QUIVER_END - 1; /* This should only be used on ammunition */ if (slot < QUIVER_START) return; /* Quiver is full */ if (p_ptr->inventory[QUIVER_END - 1].kind) return; /* Find the first open quiver slot */ while (p_ptr->inventory[dest].kind) dest++; /* Swap things with the space one higher (essentially moving the open space * towards our goal slot. */ for (i = dest - 1; i >= slot; i--) { /* If we have an item with an inscribed location (and it's in */ /* that location) then we won't move it. */ pref = get_inscribed_ammo_slot(&p_ptr->inventory[i]); if (i != slot && pref && pref == i) continue; /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(dest); } /* Copy the item up and wipe the old slot */ COPY(&p_ptr->inventory[dest], &p_ptr->inventory[i], object_type); dest = i; object_wipe(&p_ptr->inventory[dest]); } } /* * Erase an inventory slot if it has no more items */ void inven_item_optimize(int item) { object_type *o_ptr = &p_ptr->inventory[item]; int i, j, slot, limit; /* Save a possibly new quiver size */ if (item >= QUIVER_START) save_quiver_size(p_ptr); /* Only optimize real items which are empty */ if (!o_ptr->kind || o_ptr->number) return; /* Stop tracking erased item if necessary */ if (tracked_object_is(item)) { track_object(NO_OBJECT); } /* Items in the pack are treated differently from other items */ if (item < INVEN_WIELD) { p_ptr->inven_cnt--; p_ptr->redraw |= PR_INVEN; limit = INVEN_MAX_PACK; } /* Items in the quiver and equipped items are (mostly) treated similarly */ else { p_ptr->equip_cnt--; p_ptr->redraw |= PR_EQUIP; limit = item >= QUIVER_START ? QUIVER_END : 0; } /* If the item is equipped (but not in the quiver), there is no need to */ /* slide other items. Bonuses and such will need to be recalculated */ if (!limit) { /* Erase the empty slot */ object_wipe(&p_ptr->inventory[item]); /* Recalculate stuff */ p_ptr->update |= (PU_BONUS); p_ptr->update |= (PU_TORCH); p_ptr->update |= (PU_MANA); return; } /* Slide everything down */ for (j = item, i = item + 1; i < limit; i++) { if (limit == QUIVER_END && p_ptr->inventory[i].kind) { /* If we have an item with an inscribed location (and it's in */ /* that location) then we won't move it. */ slot = get_inscribed_ammo_slot(&p_ptr->inventory[i]); if (slot && slot == i) continue; } COPY(&p_ptr->inventory[j], &p_ptr->inventory[i], object_type); /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(j); } j = i; } /* Reorder the quiver if necessary */ if (item >= QUIVER_START) sort_quiver(); /* Wipe the left-over object on the end */ object_wipe(&p_ptr->inventory[j]); /* Inventory has changed, so disable repeat command */ cmd_disable_repeat(); } /* * Describe the charges on an item on the floor. */ void floor_item_charges(int item) { object_type *o_ptr = object_byid(item); /* Require staff/wand */ if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return; /* Require known item */ if (!object_is_known(o_ptr)) return; /* Print a message */ msg("There %s %d charge%s remaining.", (o_ptr->pval[DEFAULT_PVAL] != 1) ? "are" : "is", o_ptr->pval[DEFAULT_PVAL], (o_ptr->pval[DEFAULT_PVAL] != 1) ? "s" : ""); } /* * Describe an item in the inventory. */ void floor_item_describe(int item) { object_type *o_ptr = object_byid(item); char o_name[80]; /* Get a description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Print a message */ msg("You see %s.", o_name); } /* * Increase the "number" of an item on the floor */ void floor_item_increase(int item, int num) { object_type *o_ptr = object_byid(item); /* Apply */ num += o_ptr->number; /* Bounds check */ if (num > 255) num = 255; else if (num < 0) num = 0; /* Un-apply */ num -= o_ptr->number; /* Change the number */ o_ptr->number += num; } /* * Optimize an item on the floor (destroy "empty" items) */ void floor_item_optimize(int item) { object_type *o_ptr = object_byid(item); /* Paranoia -- be sure it exists */ if (!o_ptr->kind) return; /* Only optimize empty items */ if (o_ptr->number) return; /* Delete the object */ delete_object_idx(item); } /* * Check if we have space for an item in the pack without overflow */ bool inven_carry_okay(const object_type *o_ptr) { /* Empty slot? */ if (p_ptr->inven_cnt < INVEN_MAX_PACK) return TRUE; /* Check if it can stack */ if (inven_stack_okay(o_ptr)) return TRUE; /* Nope */ return FALSE; } /* * Check to see if an item is stackable in the inventory */ bool inven_stack_okay(const object_type *o_ptr) { /* Similar slot? */ int j; /* If our pack is full and we're adding too many missiles, there won't be * enough room in the quiver, so don't check it. */ int limit; if (!pack_is_full()) /* The pack has more room */ limit = ALL_INVEN_TOTAL; else if (p_ptr->quiver_remainder == 0) /* Quiver already maxed out */ limit = INVEN_PACK; else if (p_ptr->quiver_remainder + o_ptr->number > 99) /* Too much new ammo */ limit = INVEN_PACK; else limit = ALL_INVEN_TOTAL; for (j = 0; j < limit; j++) { object_type *j_ptr = &p_ptr->inventory[j]; /* Skip equipped items and non-objects */ if (j >= INVEN_PACK && j < QUIVER_START) continue; if (!j_ptr->kind) continue; /* Check if the two items can be combined */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) return (TRUE); } return (FALSE); } /* * Add an item to the players inventory, and return the slot used. * * If the new item can combine with an existing item in the inventory, * it will do so, using "object_similar()" and "object_absorb()", else, * the item will be placed into the "proper" location in the inventory. * * This function can be used to "over-fill" the player's pack, but only * once, and such an action must trigger the "overflow" code immediately. * Note that when the pack is being "over-filled", the new item must be * placed into the "overflow" slot, and the "overflow" must take place * before the pack is reordered, but (optionally) after the pack is * combined. This may be tricky. See "dungeon.c" for info. * * Note that this code must remove any location/stack information * from the object once it is placed into the inventory. */ extern s16b inven_carry(struct player *p, struct object *o) { int i, j, k; int n = -1; object_type *j_ptr; /* Apply an autoinscription */ apply_autoinscription(o); /* Check for combining */ for (j = 0; j < INVEN_PACK; j++) { j_ptr = &p->inventory[j]; if (!j_ptr->kind) continue; /* Hack -- track last item */ n = j; /* Check if the two items can be combined */ if (object_similar(j_ptr, o, OSTACK_PACK)) { /* Combine the items */ object_absorb(j_ptr, o); /* Increase the weight */ p->total_weight += (o->number * o->weight); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw stuff */ p->redraw |= (PR_INVEN); /* Save quiver size */ save_quiver_size(p); /* Success */ return (j); } } /* Paranoia */ if (p->inven_cnt > INVEN_MAX_PACK) return (-1); /* Find an empty slot */ for (j = 0; j <= INVEN_MAX_PACK; j++) { j_ptr = &p->inventory[j]; if (!j_ptr->kind) break; } /* Use that slot */ i = j; /* Reorder the pack */ if (i < INVEN_MAX_PACK) { s32b o_value, j_value; /* Get the "value" of the item */ o_value = o->kind->cost; /* Scan every occupied slot */ for (j = 0; j < INVEN_MAX_PACK; j++) { j_ptr = &p->inventory[j]; if (!j_ptr->kind) break; /* Hack -- readable books always come first */ if ((o->tval == p_ptr->class->spell_book) && (j_ptr->tval != p_ptr->class->spell_book)) break; if ((j_ptr->tval == p_ptr->class->spell_book) && (o->tval != p_ptr->class->spell_book)) continue; /* Objects sort by decreasing type */ if (o->tval > j_ptr->tval) break; if (o->tval < j_ptr->tval) continue; /* Non-aware (flavored) items always come last */ if (!object_flavor_is_aware(o)) continue; if (!object_flavor_is_aware(j_ptr)) break; /* Objects sort by increasing sval */ if (o->sval < j_ptr->sval) break; if (o->sval > j_ptr->sval) continue; /* Unidentified objects always come last */ if (!object_is_known(o)) continue; if (!object_is_known(j_ptr)) break; /* Lights sort by decreasing fuel */ if (o->tval == TV_LIGHT) { if (o->pval[DEFAULT_PVAL] > j_ptr->pval[DEFAULT_PVAL]) break; if (o->pval[DEFAULT_PVAL] < j_ptr->pval[DEFAULT_PVAL]) continue; } /* Determine the "value" of the pack item */ j_value = j_ptr->kind->cost; /* Objects sort by decreasing value */ if (o_value > j_value) break; if (o_value < j_value) continue; } /* Use that slot */ i = j; /* Slide objects */ for (k = n; k >= i; k--) { /* Hack -- Slide the item */ object_copy(&p->inventory[k+1], &p->inventory[k]); /* Update object_idx if necessary */ if (tracked_object_is(k)) { track_object(k+1); } } /* Wipe the empty slot */ object_wipe(&p->inventory[i]); } object_copy(&p->inventory[i], o); j_ptr = &p->inventory[i]; j_ptr->next_o_idx = 0; j_ptr->held_m_idx = 0; j_ptr->iy = j_ptr->ix = 0; j_ptr->marked = FALSE; p->total_weight += (j_ptr->number * j_ptr->weight); p->inven_cnt++; p->update |= (PU_BONUS); p->notice |= (PN_COMBINE | PN_REORDER); p->redraw |= (PR_INVEN); /* Hobbits ID mushrooms on pickup, gnomes ID wands and staffs on pickup */ if (!object_is_known(j_ptr)) { if (player_has(PF_KNOW_MUSHROOM) && j_ptr->tval == TV_FOOD) { do_ident_item(i, j_ptr); msg("Mushrooms for breakfast!"); } if (player_has(PF_KNOW_ZAPPER) && (j_ptr->tval == TV_WAND || j_ptr->tval == TV_STAFF)) { do_ident_item(i, j_ptr); } } /* Save quiver size */ save_quiver_size(p); /* Return the slot */ return (i); } /* * Take off (some of) a non-cursed equipment item * * Note that only one item at a time can be wielded per slot. * * Note that taking off an item when "full" may cause that item * to fall to the ground. * * Return the inventory slot into which the item is placed. */ s16b inven_takeoff(int item, int amt) { int slot; object_type *o_ptr; object_type *i_ptr; object_type object_type_body; const char *act; char o_name[80]; bool track_removed_item = FALSE; /* Get the item to take off */ o_ptr = &p_ptr->inventory[item]; /* Paranoia */ if (amt <= 0) return (-1); /* Verify */ if (amt > o_ptr->number) amt = o_ptr->number; /* Get local object */ i_ptr = &object_type_body; /* Obtain a local object */ object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = amt; /* Describe the object */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Took off weapon */ if (item == INVEN_WIELD) { act = "You were wielding"; } /* Took off bow */ else if (item == INVEN_BOW) { act = "You were holding"; } /* Took off light */ else if (item == INVEN_LIGHT) { act = "You were holding"; } /* Took off something */ else { act = "You were wearing"; } /* Update object_idx if necessary, after optimization */ if (tracked_object_is(item)) { track_removed_item = TRUE; } /* Modify, Optimize */ inven_item_increase(item, -amt); inven_item_optimize(item); /* Carry the object */ slot = inven_carry(p_ptr, i_ptr); /* Track removed item if necessary */ if (track_removed_item) { track_object(slot); } /* Message */ msgt(MSG_WIELD, "%s %s (%c).", act, o_name, index_to_label(slot)); p_ptr->notice |= PN_SQUELCH; /* Return slot */ return (slot); } /* * Drop (some of) a non-cursed inventory/equipment item * * The object will be dropped "near" the current location */ void inven_drop(int item, int amt) { int py = p_ptr->py; int px = p_ptr->px; object_type *o_ptr; object_type *i_ptr; object_type object_type_body; char o_name[80]; /* Get the original object */ o_ptr = &p_ptr->inventory[item]; /* Error check */ if (amt <= 0) return; /* Not too many */ if (amt > o_ptr->number) amt = o_ptr->number; /* Take off equipment */ if (item >= INVEN_WIELD) { /* Take off first */ item = inven_takeoff(item, amt); /* Get the original object */ o_ptr = &p_ptr->inventory[item]; } /* Stop tracking items no longer in the inventory */ if (tracked_object_is(item) && amt == o_ptr->number) { track_object(NO_OBJECT); } i_ptr = &object_type_body; object_copy(i_ptr, o_ptr); object_split(i_ptr, o_ptr, amt); /* Describe local object */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You drop %s (%c).", o_name, index_to_label(item)); /* Drop it near the player */ drop_near(cave, i_ptr, 0, py, px, FALSE); /* Modify, Describe, Optimize */ inven_item_increase(item, -amt); inven_item_describe(item); inven_item_optimize(item); } /* * Combine items in the pack * Also "pick up" any gold in the inventory by accident * * Note special handling of the "overflow" slot */ void combine_pack(void) { int i, j, k; object_type *o_ptr; object_type *j_ptr; bool flag = FALSE; /* Combine the pack (backwards) */ for (i = INVEN_PACK; i > 0; i--) { bool slide = FALSE; /* Get the item */ o_ptr = &p_ptr->inventory[i]; /* Skip empty items */ if (!o_ptr->kind) continue; /* Absorb gold */ if (o_ptr->tval == TV_GOLD) { /* Count the gold */ slide = TRUE; p_ptr->au += o_ptr->pval[DEFAULT_PVAL]; } /* Scan the items above that item */ else for (j = 0; j < i; j++) { /* Get the item */ j_ptr = &p_ptr->inventory[j]; /* Skip empty items */ if (!j_ptr->kind) continue; /* Can we drop "o_ptr" onto "j_ptr"? */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) { /* Take note */ flag = slide = TRUE; /* Add together the item counts */ object_absorb(j_ptr, o_ptr); break; } } /* Compact the inventory */ if (slide) { /* One object is gone */ p_ptr->inven_cnt--; /* Slide everything down */ for (k = i; k < INVEN_PACK; k++) { /* Hack -- slide object */ COPY(&p_ptr->inventory[k], &p_ptr->inventory[k+1], object_type); /* Update object_idx if necessary */ if (tracked_object_is(k+1)) { track_object(k); } } /* Hack -- wipe hole */ object_wipe(&p_ptr->inventory[k]); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); } } /* Message */ if (flag) { msg("You combine some items in your pack."); /* Stop "repeat last command" from working. */ cmd_disable_repeat(); } } /* * Reorder items in the pack * * Note special handling of the "overflow" slot */ void reorder_pack(void) { int i, j, k; s32b o_value; s32b j_value; object_type *o_ptr; object_type *j_ptr; object_type *i_ptr; object_type object_type_body; bool flag = FALSE; /* Re-order the pack (forwards) */ for (i = 0; i < INVEN_PACK; i++) { /* Get the item */ o_ptr = &p_ptr->inventory[i]; /* Skip empty slots */ if (!o_ptr->kind) continue; /* Get the "value" of the item */ o_value = o_ptr->kind->cost; /* Scan every occupied slot */ for (j = 0; j < INVEN_PACK; j++) { /* Get the item already there */ j_ptr = &p_ptr->inventory[j]; /* Use empty slots */ if (!j_ptr->kind) break; /* Hack -- readable books always come first */ if ((o_ptr->tval == p_ptr->class->spell_book) && (j_ptr->tval != p_ptr->class->spell_book)) break; if ((j_ptr->tval == p_ptr->class->spell_book) && (o_ptr->tval != p_ptr->class->spell_book)) continue; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; if (o_ptr->tval < j_ptr->tval) continue; /* Non-aware (flavored) items always come last */ if (!object_flavor_is_aware(o_ptr)) continue; if (!object_flavor_is_aware(j_ptr)) break; /* Objects sort by increasing sval */ if (o_ptr->sval < j_ptr->sval) break; if (o_ptr->sval > j_ptr->sval) continue; /* Unidentified objects always come last */ if (!object_is_known(o_ptr)) continue; if (!object_is_known(j_ptr)) break; /* Lights sort by decreasing fuel */ if (o_ptr->tval == TV_LIGHT) { if (o_ptr->pval[DEFAULT_PVAL] > j_ptr->pval[DEFAULT_PVAL]) break; if (o_ptr->pval[DEFAULT_PVAL] < j_ptr->pval[DEFAULT_PVAL]) continue; } /* Determine the "value" of the pack item */ j_value = j_ptr->kind->cost; /* Objects sort by decreasing value */ if (o_value > j_value) break; if (o_value < j_value) continue; } /* Never move down */ if (j >= i) continue; /* Take note */ flag = TRUE; /* Get local object */ i_ptr = &object_type_body; /* Save a copy of the moving item */ object_copy(i_ptr, &p_ptr->inventory[i]); /* Slide the objects */ for (k = i; k > j; k--) { /* Slide the item */ object_copy(&p_ptr->inventory[k], &p_ptr->inventory[k-1]); /* Update object_idx if necessary */ if (tracked_object_is(k-1)) { track_object(k); } } /* Insert the moving item */ object_copy(&p_ptr->inventory[j], i_ptr); /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(j); } /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); } if (flag) { msg("You reorder some items in your pack."); /* Stop "repeat last command" from working. */ cmd_disable_repeat(); } } /* *Returns the number of times in 1000 that @ will FAIL * - thanks to Ed Graham for the formula */ int get_use_device_chance(const object_type *o_ptr) { int lev, fail, numerator, denominator; int skill = p_ptr->state.skills[SKILL_DEVICE]; int skill_min = 10; int skill_max = 141; int diff_min = 1; int diff_max = 100; /* Extract the item level, which is the difficulty rating */ if (o_ptr->artifact) lev = o_ptr->artifact->level; else lev = o_ptr->kind->level; /* TODO: maybe use something a little less convoluted? */ numerator = (skill - lev) - (skill_max - diff_min); denominator = (lev - skill) - (diff_max - skill_min); /* Make sure that we don't divide by zero */ if (denominator == 0) denominator = numerator > 0 ? 1 : -1; fail = (100 * numerator) / denominator; /* Ensure failure rate is between 1% and 75% */ if (fail > 750) fail = 750; if (fail < 10) fail = 10; return fail; } /* * Distribute charges of rods, staves, or wands. * * o_ptr = source item * q_ptr = target item, must be of the same type as o_ptr * amt = number of items that are transfered */ void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt) { int charge_time = randcalc(o_ptr->kind->time, 0, AVERAGE), max_time; /* * Hack -- If rods, staves, or wands are dropped, the total maximum * timeout or charges need to be allocated between the two stacks. * If all the items are being dropped, it makes for a neater message * to leave the original stack's pval alone. -LM- */ if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) { q_ptr->pval[DEFAULT_PVAL] = o_ptr->pval[DEFAULT_PVAL] * amt / o_ptr->number; if (amt < o_ptr->number) o_ptr->pval[DEFAULT_PVAL] -= q_ptr->pval[DEFAULT_PVAL]; } /* * Hack -- Rods also need to have their timeouts distributed. * * The dropped stack will accept all time remaining to charge up to * its maximum. */ if (o_ptr->tval == TV_ROD) { max_time = charge_time * amt; if (o_ptr->timeout > max_time) q_ptr->timeout = max_time; else q_ptr->timeout = o_ptr->timeout; if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout; } } void reduce_charges(object_type *o_ptr, int amt) { /* * Hack -- If rods or wand are destroyed, the total maximum timeout or * charges of the stack needs to be reduced, unless all the items are * being destroyed. -LM- */ if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) && (amt < o_ptr->number)) { o_ptr->pval[DEFAULT_PVAL] -= o_ptr->pval[DEFAULT_PVAL] * amt / o_ptr->number; } if ((o_ptr->tval == TV_ROD) && (amt < o_ptr->number)) { o_ptr->timeout -= o_ptr->timeout * amt / o_ptr->number; } } int number_charging(const object_type *o_ptr) { int charge_time, num_charging; random_value timeout; /* Artifacts have a special timeout */ if (o_ptr->artifact) timeout = o_ptr->artifact->time; else timeout = o_ptr->kind->time; charge_time = randcalc(timeout, 0, AVERAGE); /* Item has no timeout */ if (charge_time <= 0) return 0; /* No items are charging */ if (o_ptr->timeout <= 0) return 0; /* Calculate number charging based on timeout */ num_charging = (o_ptr->timeout + charge_time - 1) / charge_time; /* Number charging cannot exceed stack size */ if (num_charging > o_ptr->number) num_charging = o_ptr->number; return num_charging; } bool recharge_timeout(object_type *o_ptr) { int charging_before, charging_after; /* Find the number of charging items */ charging_before = number_charging(o_ptr); /* Nothing to charge */ if (charging_before == 0) return FALSE; /* Decrease the timeout */ o_ptr->timeout -= MIN(charging_before, o_ptr->timeout); /* Find the new number of charging items */ charging_after = number_charging(o_ptr); /* Return true if at least 1 item obtained a charge */ if (charging_after < charging_before) return TRUE; else return FALSE; } /* * Looks if "inscrip" is present on the given object. */ unsigned check_for_inscrip(const object_type *o_ptr, const char *inscrip) { unsigned i = 0; const char *s; if (!o_ptr->note) return 0; s = quark_str(o_ptr->note); do { s = strstr(s, inscrip); if (!s) break; i++; s++; } while (s); return i; } /*** Object kind lookup functions ***/ /** * Return the object kind with the given `tval` and `sval`, or NULL. */ object_kind *lookup_kind(int tval, int sval) { int k; /* Look for it */ for (k = 0; k < z_info->k_max; k++) { object_kind *kind = &k_info[k]; if (kind->tval == tval && kind->sval == sval) return kind; } /* Failure */ msg("No object: %d:%d (%s)", tval, sval, tval_find_name(tval)); return NULL; } struct object_kind *objkind_get(int tval, int sval) { return lookup_kind(tval, sval); } struct object_kind *objkind_byid(int kidx) { if (kidx < 1 || kidx > z_info->k_max) return NULL; return &k_info[kidx]; } /*** Textual<->numeric conversion ***/ /** * List of { tval, name } pairs. */ static const grouper tval_names[] = { { TV_SKELETON, "skeleton" }, { TV_BOTTLE, "bottle" }, { TV_JUNK, "junk" }, { TV_SPIKE, "spike" }, { TV_CHEST, "chest" }, { TV_SHOT, "shot" }, { TV_ARROW, "arrow" }, { TV_BOLT, "bolt" }, { TV_BOW, "bow" }, { TV_DIGGING, "digger" }, { TV_HAFTED, "hafted" }, { TV_POLEARM, "polearm" }, { TV_SWORD, "sword" }, { TV_BOOTS, "boots" }, { TV_GLOVES, "gloves" }, { TV_HELM, "helm" }, { TV_CROWN, "crown" }, { TV_SHIELD, "shield" }, { TV_CLOAK, "cloak" }, { TV_SOFT_ARMOR, "soft armor" }, { TV_SOFT_ARMOR, "soft armour" }, { TV_HARD_ARMOR, "hard armor" }, { TV_HARD_ARMOR, "hard armour" }, { TV_DRAG_ARMOR, "dragon armor" }, { TV_DRAG_ARMOR, "dragon armour" }, { TV_LIGHT, "light" }, { TV_AMULET, "amulet" }, { TV_RING, "ring" }, { TV_STAFF, "staff" }, { TV_WAND, "wand" }, { TV_ROD, "rod" }, { TV_SCROLL, "scroll" }, { TV_POTION, "potion" }, { TV_FLASK, "flask" }, { TV_FOOD, "food" }, { TV_MAGIC_BOOK, "magic book" }, { TV_PRAYER_BOOK, "prayer book" }, { TV_GOLD, "gold" }, }; /** * Return the k_idx of the object kind with the given `tval` and name `name`. */ int lookup_name(int tval, const char *name) { int k; /* Look for it */ for (k = 1; k < z_info->k_max; k++) { object_kind *k_ptr = &k_info[k]; const char *nm = k_ptr->name; if (!nm) continue; if (*nm == '&' && *(nm+1)) nm += 2; /* Found a match */ if (k_ptr->tval == tval && !strcmp(name, nm)) return k; } msg("No object (\"%s\",\"%s\")", tval_find_name(tval), name); return -1; } /** * Return the a_idx of the artifact with the given name */ int lookup_artifact_name(const char *name) { int i; int a_idx = -1; /* Look for it */ for (i = 1; i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; /* Test for equality */ if (a_ptr->name && streq(name, a_ptr->name)) return i; /* Test for close matches */ if (a_ptr->name && my_stristr(a_ptr->name, name) && a_idx == -1) a_idx = i; } /* Return our best match */ return a_idx; } /** * Return the numeric sval of the object kind with the given `tval` and name `name`. */ int lookup_sval(int tval, const char *name) { int k; unsigned int r; if (sscanf(name, "%u", &r) == 1) return r; /* Look for it */ for (k = 1; k < z_info->k_max; k++) { object_kind *k_ptr = &k_info[k]; const char *nm = k_ptr->name; if (!nm) continue; if (*nm == '&' && *(nm+1)) nm += 2; /* Found a match */ if (k_ptr->tval == tval && !strcmp(name, nm)) return k_ptr->sval; } return -1; } /** * Returns the numeric equivalent tval of the textual tval `name`. */ int tval_find_idx(const char *name) { size_t i = 0; unsigned int r; if (sscanf(name, "%u", &r) == 1) return r; for (i = 0; i < N_ELEMENTS(tval_names); i++) { if (!my_stricmp(name, tval_names[i].name)) return tval_names[i].tval; } return -1; } /** * Returns the textual equivalent tval of the numeric tval `name`. */ const char *tval_find_name(int tval) { size_t i = 0; for (i = 0; i < N_ELEMENTS(tval_names); i++) { if (tval == tval_names[i].tval) return tval_names[i].name; } return "unknown"; } /** * Sort comparator for objects using only tval and sval. * -1 if o1 should be first * 1 if o2 should be first * 0 if it doesn't matter */ static int compare_types(const object_type *o1, const object_type *o2) { if (o1->tval == o2->tval) return CMP(o1->sval, o2->sval); else return CMP(o1->tval, o2->tval); } /** * Sort comparator for objects * -1 if o1 should be first * 1 if o2 should be first * 0 if it doesn't matter * * The sort order is designed with the "list items" command in mind. */ static int compare_items(const object_type *o1, const object_type *o2) { /* known artifacts will sort first */ if (object_is_known_artifact(o1) && object_is_known_artifact(o2)) return compare_types(o1, o2); if (object_is_known_artifact(o1)) return -1; if (object_is_known_artifact(o2)) return 1; /* unknown objects will sort next */ if (!object_flavor_is_aware(o1) && !object_flavor_is_aware(o2)) return compare_types(o1, o2); if (!object_flavor_is_aware(o1)) return -1; if (!object_flavor_is_aware(o2)) return 1; /* if only one of them is worthless, the other comes first */ if (o1->kind->cost == 0 && o2->kind->cost != 0) return 1; if (o1->kind->cost != 0 && o2->kind->cost == 0) return -1; /* otherwise, just compare tvals and svals */ /* NOTE: arguably there could be a better order than this */ return compare_types(o1, o2); } /** * Helper to draw the Object Recall subwindow; this actually does the work. */ void display_object_recall(object_type *o_ptr) { char header[120]; textblock *tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); clear_from(0); textui_textblock_place(tb, SCREEN_REGION, header); textblock_free(tb); } /** * This draws the Object Recall subwindow when displaying a particular object * (e.g. a helmet in the backpack, or a scroll on the ground) */ void display_object_idx_recall(s16b item) { object_type *o_ptr = object_from_item_idx(item); display_object_recall(o_ptr); } /** * This draws the Object Recall subwindow when displaying a recalled item kind * (e.g. a generic ring of acid or a generic blade of chaos) */ void display_object_kind_recall(s16b k_idx) { object_type object = { 0 }; object_prep(&object, &k_info[k_idx], 0, EXTREMIFY); if (k_info[k_idx].aware) object.ident |= IDENT_STORE; display_object_recall(&object); } /* * Display visible items, similar to display_monlist */ void display_itemlist(void) { int max; int mx, my; unsigned num; int line = 1, x = 0; int cur_x; unsigned i; unsigned disp_count = 0; byte a; char c; object_type *types[MAX_ITEMLIST]; int counts[MAX_ITEMLIST]; int dx[MAX_ITEMLIST], dy[MAX_ITEMLIST]; unsigned counter = 0; int dungeon_hgt = p_ptr->depth == 0 ? TOWN_HGT : DUNGEON_HGT; int dungeon_wid = p_ptr->depth == 0 ? TOWN_WID : DUNGEON_WID; byte attr; char buf[80]; int floor_list[MAX_FLOOR_STACK]; /* Clear the term if in a subwindow, set x otherwise */ if (Term != angband_term[0]) { clear_from(0); max = Term->hgt - 1; } else { x = 13; max = Term->hgt - 2; } /* Look at each square of the dungeon for items */ for (my = 0; my < dungeon_hgt; my++) { for (mx = 0; mx < dungeon_wid; mx++) { num = scan_floor(floor_list, MAX_FLOOR_STACK, my, mx, 0x02); /* Iterate over all the items found on this square */ for (i = 0; i < num; i++) { object_type *o_ptr = object_byid(floor_list[i]); unsigned j; /* Skip gold/squelched */ if (o_ptr->tval == TV_GOLD || squelch_item_ok(o_ptr)) continue; /* See if we've already seen a similar item; if so, just add */ /* to its count */ for (j = 0; j < counter; j++) { if (object_similar(o_ptr, types[j], OSTACK_LIST)) { counts[j] += o_ptr->number; if ((my - p_ptr->py) * (my - p_ptr->py) + (mx - p_ptr->px) * (mx - p_ptr->px) < dy[j] * dy[j] + dx[j] * dx[j]) { dy[j] = my - p_ptr->py; dx[j] = mx - p_ptr->px; } break; } } /* We saw a new item. So insert it at the end of the list and */ /* then sort it forward using compare_items(). The types list */ /* is always kept sorted. */ if (j == counter) { types[counter] = o_ptr; counts[counter] = o_ptr->number; dy[counter] = my - p_ptr->py; dx[counter] = mx - p_ptr->px; while (j > 0 && compare_items(types[j - 1], types[j]) > 0) { object_type *tmp_o = types[j - 1]; int tmpcount; int tmpdx = dx[j-1]; int tmpdy = dy[j-1]; types[j - 1] = types[j]; types[j] = tmp_o; dx[j-1] = dx[j]; dx[j] = tmpdx; dy[j-1] = dy[j]; dy[j] = tmpdy; tmpcount = counts[j - 1]; counts[j - 1] = counts[j]; counts[j] = tmpcount; j--; } counter++; } } } } /* Note no visible items */ if (!counter) { /* Clear display and print note */ c_prt(TERM_SLATE, "You see no items.", 0, 0); if (Term == angband_term[0]) Term_addstr(-1, TERM_WHITE, " (Press any key to continue.)"); /* Done */ return; } else { /* Reprint Message */ prt(format("You can see %d item%s:", counter, (counter > 1 ? "s" : "")), 0, 0); } for (i = 0; i < counter; i++) { /* o_name will hold the object_desc() name for the object. */ /* o_desc will also need to put a (x4) behind it. */ /* can there be more than 999 stackable items on a level? */ char o_name[80]; char o_desc[86]; object_type *o_ptr = types[i]; /* We shouldn't list coins or squelched items */ if (o_ptr->tval == TV_GOLD || squelch_item_ok(o_ptr)) continue; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL); if (counts[i] > 1) strnfmt(o_desc, sizeof(o_desc), "%s (x%d) %d %c, %d %c", o_name, counts[i], (dy[i] > 0) ? dy[i] : -dy[i], (dy[i] > 0) ? 'S' : 'N', (dx[i] > 0) ? dx[i] : -dx[i], (dx[i] > 0) ? 'E' : 'W'); else strnfmt(o_desc, sizeof(o_desc), "%s %d %c %d %c", o_name, (dy[i] > 0) ? dy[i] : -dy[i], (dy[i] > 0) ? 'S' : 'N', (dx[i] > 0) ? dx[i] : -dx[i], (dx[i] > 0) ? 'E' : 'W'); /* Reset position */ cur_x = x; /* See if we need to scroll or not */ if (Term == angband_term[0] && (line == max) && disp_count != counter) { prt("-- more --", line, x); anykey(); /* Clear the screen */ for (line = 1; line <= max; line++) prt("", line, x); /* Reprint Message */ prt(format("You can see %d item%s:", counter, (counter > 1 ? "s" : "")), 0, 0); /* Reset */ line = 1; } else if (line == max) { continue; } /* Note that the number of items actually displayed */ disp_count++; if (o_ptr->artifact && object_is_known(o_ptr)) /* known artifact */ attr = TERM_VIOLET; else if (!object_flavor_is_aware(o_ptr)) /* unaware of kind */ attr = TERM_RED; else if (o_ptr->kind->cost == 0) /* worthless */ attr = TERM_SLATE; else /* default */ attr = TERM_WHITE; a = object_kind_attr(o_ptr->kind); c = object_kind_char(o_ptr->kind); /* Display the pict */ if ((tile_width == 1) && (tile_height == 1)) { Term_putch(cur_x++, line, a, c); Term_putch(cur_x++, line, TERM_WHITE, ' '); } /* Print and bump line counter */ c_prt(attr, o_desc, line, cur_x); line++; } if (disp_count != counter) { /* Print "and others" message if we've run out of space */ strnfmt(buf, sizeof buf, " ...and %d others.", counter - disp_count); c_prt(TERM_WHITE, buf, line, x); } else { /* Otherwise clear a line at the end, for main-term display */ prt("", line, x); } if (Term == angband_term[0]) Term_addstr(-1, TERM_WHITE, " (Press any key to continue.)"); } /* Basic tval testers */ bool obj_is_staff(const object_type *o_ptr) { return o_ptr->tval == TV_STAFF; } bool obj_is_wand(const object_type *o_ptr) { return o_ptr->tval == TV_WAND; } bool obj_is_rod(const object_type *o_ptr) { return o_ptr->tval == TV_ROD; } bool obj_is_potion(const object_type *o_ptr) { return o_ptr->tval == TV_POTION; } bool obj_is_scroll(const object_type *o_ptr) { return o_ptr->tval == TV_SCROLL; } bool obj_is_food(const object_type *o_ptr) { return o_ptr->tval == TV_FOOD; } bool obj_is_light(const object_type *o_ptr) { return o_ptr->tval == TV_LIGHT; } bool obj_is_ring(const object_type *o_ptr) { return o_ptr->tval == TV_RING; } /** * Determine whether an object is ammo * * \param o_ptr is the object to check */ bool obj_is_ammo(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: return TRUE; default: return FALSE; } } /* Determine if an object has charges */ bool obj_has_charges(const object_type *o_ptr) { if (o_ptr->tval != TV_WAND && o_ptr->tval != TV_STAFF) return FALSE; if (o_ptr->pval[DEFAULT_PVAL] <= 0) return FALSE; return TRUE; } /* Determine if an object is zappable */ bool obj_can_zap(const object_type *o_ptr) { /* Any rods not charging? */ if (o_ptr->tval == TV_ROD && number_charging(o_ptr) < o_ptr->number) return TRUE; return FALSE; } /* Determine if an object is activatable */ bool obj_is_activatable(const object_type *o_ptr) { return object_effect(o_ptr) ? TRUE : FALSE; } /* Determine if an object can be activated now */ bool obj_can_activate(const object_type *o_ptr) { if (obj_is_activatable(o_ptr)) { /* Check the recharge */ if (!o_ptr->timeout) return TRUE; } return FALSE; } bool obj_can_refill(const object_type *o_ptr) { bitflag f[OF_SIZE]; const object_type *j_ptr = &p_ptr->inventory[INVEN_LIGHT]; /* Get flags */ object_flags(o_ptr, f); if (j_ptr->sval == SV_LIGHT_LANTERN) { /* Flasks of oil are okay */ if (o_ptr->tval == TV_FLASK) return (TRUE); } /* Non-empty, non-everburning sources are okay */ if ((o_ptr->tval == TV_LIGHT) && (o_ptr->sval == j_ptr->sval) && (o_ptr->timeout > 0) && !of_has(f, OF_NO_FUEL)) { return (TRUE); } /* Assume not okay */ return (FALSE); } bool obj_can_browse(const object_type *o_ptr) { return o_ptr->tval == p_ptr->class->spell_book; } bool obj_can_cast_from(const object_type *o_ptr) { return obj_can_browse(o_ptr) && spell_book_count_spells(o_ptr, spell_okay_to_cast) > 0; } bool obj_can_study(const object_type *o_ptr) { return obj_can_browse(o_ptr) && spell_book_count_spells(o_ptr, spell_okay_to_study) > 0; } /* Can only take off non-cursed items */ bool obj_can_takeoff(const object_type *o_ptr) { return !cursed_p((bitflag *)o_ptr->flags); } /* Can only put on wieldable items */ bool obj_can_wear(const object_type *o_ptr) { return (wield_slot(o_ptr) >= INVEN_WIELD); } /* Can only fire an item with the right tval */ bool obj_can_fire(const object_type *o_ptr) { return o_ptr->tval == p_ptr->state.ammo_tval; } /* Can has inscrip pls */ bool obj_has_inscrip(const object_type *o_ptr) { return (o_ptr->note ? TRUE : FALSE); } /*** Generic utility functions ***/ /* * Return an object's effect. */ u16b object_effect(const object_type *o_ptr) { if (o_ptr->artifact) return o_ptr->artifact->effect; else return o_ptr->kind->effect; } /* Get an o_ptr from an item number */ object_type *object_from_item_idx(int item) { if (item >= 0) return &p_ptr->inventory[item]; else return object_byid(0 - item); } /* * Does the given object need to be aimed? */ bool obj_needs_aim(object_type *o_ptr) { int effect = object_effect(o_ptr); /* If the effect needs aiming, or if the object type needs aiming, this object needs aiming. */ return effect_aim(effect) || o_ptr->tval == TV_BOLT || o_ptr->tval == TV_SHOT || o_ptr->tval == TV_ARROW || o_ptr->tval == TV_WAND || (o_ptr->tval == TV_ROD && !object_flavor_is_aware(o_ptr)); } /* * Verify the "okayness" of a given item. * * The item can be negative to mean "item on floor". */ bool get_item_okay(int item) { /* Verify the item */ return (item_tester_okay(object_from_item_idx(item))); } /* * Get a list of "valid" item indexes. * * Fills item_list[] with items that are "okay" as defined by the * current item_tester_hook, etc. mode determines what combination of * inventory, equipment and player's floor location should be used * when drawing up the list. * * Returns the number of items placed into the list. * * Maximum space that can be used is [INVEN_TOTAL + MAX_FLOOR_STACK], * though practically speaking much smaller numbers are likely. */ int scan_items(int *item_list, size_t item_list_max, int mode) { bool use_inven = ((mode & USE_INVEN) ? TRUE : FALSE); bool use_equip = ((mode & USE_EQUIP) ? TRUE : FALSE); bool use_floor = ((mode & USE_FLOOR) ? TRUE : FALSE); int floor_list[MAX_FLOOR_STACK]; int floor_num; int i; size_t item_list_num = 0; if (use_inven) { for (i = 0; i < INVEN_PACK && item_list_num < item_list_max; i++) { if (get_item_okay(i)) item_list[item_list_num++] = i; } } if (use_equip) { for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL && item_list_num < item_list_max; i++) { if (get_item_okay(i)) item_list[item_list_num++] = i; } } /* Scan all non-gold objects in the grid */ if (use_floor) { floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), p_ptr->py, p_ptr->px, 0x03); for (i = 0; i < floor_num && item_list_num < item_list_max; i++) { if (get_item_okay(-floor_list[i])) item_list[item_list_num++] = -floor_list[i]; } } /* Forget the item_tester_tval and item_tester_hook restrictions */ item_tester_tval = 0; item_tester_hook = NULL; return item_list_num; } /* * Check if the given item is available for the player to use. * * 'mode' defines which areas we should look at, a la scan_items(). */ bool item_is_available(int item, bool (*tester)(const object_type *), int mode) { int item_list[ALL_INVEN_TOTAL + MAX_FLOOR_STACK]; int item_num; int i; item_tester_hook = tester; item_tester_tval = 0; item_num = scan_items(item_list, N_ELEMENTS(item_list), mode); for (i = 0; i < item_num; i++) { if (item_list[i] == item) return TRUE; } return FALSE; } /* * Returns whether the pack is holding the maximum number of items. The max * size is INVEN_MAX_PACK, which is a macro since quiver size affects slots * available. */ bool pack_is_full(void) { return p_ptr->inventory[INVEN_MAX_PACK - 1].kind ? TRUE : FALSE; } /* * Returns whether the pack is holding the more than the maximum number of * items. The max size is INVEN_MAX_PACK, which is a macro since quiver size * affects slots available. If this is true, calling pack_overflow() will * trigger a pack overflow. */ bool pack_is_overfull(void) { return p_ptr->inventory[INVEN_MAX_PACK].kind ? TRUE : FALSE; } /* * Overflow an item from the pack, if it is overfull. */ void pack_overflow(void) { int item = INVEN_MAX_PACK; char o_name[80]; object_type *o_ptr; if (!pack_is_overfull()) return; /* Get the slot to be dropped */ o_ptr = &p_ptr->inventory[item]; /* Disturbing */ disturb(p_ptr, 0, 0); /* Warning */ msg("Your pack overflows!"); /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You drop %s (%c).", o_name, index_to_label(item)); /* Drop it (carefully) near the player */ drop_near(cave, o_ptr, 0, p_ptr->py, p_ptr->px, FALSE); /* Modify, Describe, Optimize */ inven_item_increase(item, -255); inven_item_describe(item); inven_item_optimize(item); /* Notice stuff (if needed) */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff (if needed) */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff (if needed) */ if (p_ptr->redraw) redraw_stuff(p_ptr); } struct object *object_byid(s16b oidx) { assert(oidx >= 0); assert(oidx <= z_info->o_max); return &o_list[oidx]; } void objects_init(void) { o_list = C_ZNEW(z_info->o_max, struct object); } void objects_destroy(void) { mem_free(o_list); } angband-v3.3.2/src/object/obj-flag.h0000644000175000017500000001154211651552410016501 0ustar chriscchrisc/* * File: src/object/obj-flag.h * Purpose: definitions and functions for object flags * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_OBJFLAG_H #define INCLUDED_OBJFLAG_H #include "z-rand.h" #include "z-file.h" #include "z-textblock.h" #include "z-quark.h" #include "z-bitflag.h" #include "game-cmd.h" #include "cave.h" /*** Constants ***/ /* The object flags */ enum { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) OF_##a, #include "list-object-flags.h" #undef OF }; /* The object flag types */ enum object_flag_type { OFT_PVAL = 1, /* pval-related but not to a stat */ OFT_STAT, /* affects a stat */ OFT_SUST, /* sustains a stat */ OFT_SLAY, /* a "normal" creature-type slay */ OFT_BRAND, /* a brand against monsters lacking the resist */ OFT_KILL, /* a powerful creature-type slay */ OFT_VULN, /* lowers resistance to an element */ OFT_IMM, /* offers immunity to an element */ OFT_LRES, /* a "base" elemental resistance */ OFT_HRES, /* a "high" elemental resistance */ OFT_IGNORE, /* object ignores an element */ OFT_HATES, /* object can be destroyed by element */ OFT_PROT, /* protection from an effect */ OFT_MISC, /* a good property, suitable for ego items */ OFT_LIGHT, /* applicable only to light sources */ OFT_MELEE, /* applicable only to melee weapons */ OFT_CURSE, /* a "sticky" curse */ OFT_BAD, /* an undesirable flag that isn't a curse */ OFT_INT, /* an internal flag, not shown in the game */ OFT_MAX }; /* How object flags are IDd */ enum object_flag_id { OFID_NONE = 0, /* never shown */ OFID_NORMAL, /* normal ID on use */ OFID_TIMED, /* obvious after time */ OFID_WIELD /* obvious on wield */ }; #define OF_SIZE FLAG_SIZE(OF_MAX) #define OF_BYTES 32 /* savefile bytes, i.e. 256 flags */ #define of_has(f, flag) flag_has_dbg(f, OF_SIZE, flag, #f, #flag) #define of_next(f, flag) flag_next(f, OF_SIZE, flag) #define of_is_empty(f) flag_is_empty(f, OF_SIZE) #define of_is_full(f) flag_is_full(f, OF_SIZE) #define of_is_inter(f1, f2) flag_is_inter(f1, f2, OF_SIZE) #define of_is_subset(f1, f2) flag_is_subset(f1, f2, OF_SIZE) #define of_is_equal(f1, f2) flag_is_equal(f1, f2, OF_SIZE) #define of_on(f, flag) flag_on_dbg(f, OF_SIZE, flag, #f, #flag) #define of_off(f, flag) flag_off(f, OF_SIZE, flag) #define of_wipe(f) flag_wipe(f, OF_SIZE) #define of_setall(f) flag_setall(f, OF_SIZE) #define of_negate(f) flag_negate(f, OF_SIZE) #define of_copy(f1, f2) flag_copy(f1, f2, OF_SIZE) #define of_union(f1, f2) flag_union(f1, f2, OF_SIZE) #define of_comp_union(f1, f2) flag_comp_union(f1, f2, OF_SIZE) #define of_inter(f1, f2) flag_inter(f1, f2, OF_SIZE) #define of_diff(f1, f2) flag_diff(f1, f2, OF_SIZE) /* Hack -- special "xtra" object flag info (type) */ /* Can get rid of these now we have OFT_ flags */ /* No - because "POWER" uses two types of OFTs, so cannot get rid of these * until ego_item.txt has an X: line with a variable number of OFTs - that's * basically waiting for a rewrite of ego generation * -- or we could change OFTs to a bitflag */ #define OBJECT_XTRA_TYPE_NONE 0 #define OBJECT_XTRA_TYPE_SUSTAIN 1 #define OBJECT_XTRA_TYPE_RESIST 2 #define OBJECT_XTRA_TYPE_POWER 3 /*** Structures ***/ /** * The object flag structure */ struct object_flag { u16b index; /* the OF_ index */ bool pval; /* is it granular (TRUE) or binary (FALSE) */ u16b timed; /* the corresponding TMD_ flag */ u16b id; /* how is it identified */ u16b type; /* OFT_ category */ s16b power; /* base power rating */ s16b pval_mult; /* pval weight rating */ s16b weapon; /* power mult for melee weapon */ s16b bow; /* power mult for launcher */ s16b ring; /* etc. ... */ s16b amulet; s16b light; s16b body; s16b cloak; s16b shield; s16b hat; s16b gloves; s16b boots; const char *message; /* id message */ }; /*** Functions ***/ bool cursed_p(bitflag *f); void create_mask(bitflag *f, bool id, ...); void flag_message(int flag, char *name); s32b flag_power(int flag); void log_flags(bitflag *f, ang_file *log_file); const char *flag_name(int flag); s16b slot_mult(int flag, int slot); bool flag_uses_pval(int flag); int obj_flag_type(int flag); int pval_mult(int flag); bool check_state(struct player *p, int flag, bitflag *f); #endif /* !INCLUDED_OBJFLAG_H */ angband-v3.3.2/src/object/randart.c0000644000175000017500000025713311651552410016456 0ustar chriscchrisc/* * File: randart.c * Purpose: Random artifact generation * * Copyright (c) 1998 Greg Wooledge, Ben Harrison, Robert Ruhlmann * Copyright (c) 2001 Chris Carr, Chris Robertson * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/slays.h" #include "object/tvalsval.h" #include "object/pval.h" #include "init.h" #include "effects.h" #include "randname.h" /* * Original random artifact generator (randart) by Greg Wooledge. * Updated by Chris Carr / Chris Robertson 2001-2010. */ #define MAX_TRIES 200 #define BUFLEN 1024 #define MIN_NAME_LEN 5 #define MAX_NAME_LEN 9 #define S_WORD 26 #define E_WORD S_WORD /* * Inhibiting factors for large bonus values * "HIGH" values use INHIBIT_WEAK * "VERYHIGH" values use INHIBIT_STRONG */ #define INHIBIT_STRONG (one_in_(6)) #define INHIBIT_WEAK (one_in_(2)) /* * Power rating below which uncursed randarts cannot aggravate * (so that aggravate is found only on endgame-quality items or * cursed items) */ #define AGGR_POWER 300 /* * Numerical index values for the different learned probabilities * These are to make the code more readable. * ToDo: turn these into an enum */ #define ART_IDX_BOW_SHOTS 0 #define ART_IDX_BOW_MIGHT 1 #define ART_IDX_BOW_BRAND 80 #define ART_IDX_BOW_SLAY 81 #define ART_IDX_WEAPON_HIT 2 #define ART_IDX_WEAPON_DAM 3 #define ART_IDX_NONWEAPON_HIT 4 #define ART_IDX_NONWEAPON_DAM 5 #define ART_IDX_NONWEAPON_HIT_DAM 6 #define ART_IDX_NONWEAPON_BRAND 78 #define ART_IDX_NONWEAPON_SLAY 79 #define ART_IDX_NONWEAPON_BLOWS 83 #define ART_IDX_NONWEAPON_SHOTS 84 #define ART_IDX_MELEE_BLESS 7 #define ART_IDX_MELEE_BRAND 8 #define ART_IDX_MELEE_SLAY 76 #define ART_IDX_MELEE_SINV 9 #define ART_IDX_MELEE_BLOWS 10 #define ART_IDX_MELEE_AC 11 #define ART_IDX_MELEE_DICE 12 #define ART_IDX_MELEE_WEIGHT 13 #define ART_IDX_MELEE_TUNN 14 #define ART_IDX_ALLARMOR_WEIGHT 15 #define ART_IDX_BOOT_AC 16 #define ART_IDX_BOOT_FEATHER 17 #define ART_IDX_BOOT_STEALTH 18 #define ART_IDX_BOOT_SPEED 19 #define ART_IDX_GLOVE_AC 20 #define ART_IDX_GLOVE_FA 21 #define ART_IDX_GLOVE_DEX 22 #define ART_IDX_HELM_AC 23 #define ART_IDX_HELM_RBLIND 24 #define ART_IDX_HELM_ESP 25 #define ART_IDX_HELM_SINV 26 #define ART_IDX_HELM_WIS 27 #define ART_IDX_HELM_INT 28 #define ART_IDX_SHIELD_AC 29 #define ART_IDX_SHIELD_LRES 30 #define ART_IDX_CLOAK_AC 31 #define ART_IDX_CLOAK_STEALTH 32 #define ART_IDX_ARMOR_AC 33 #define ART_IDX_ARMOR_STEALTH 34 #define ART_IDX_ARMOR_HLIFE 35 #define ART_IDX_ARMOR_CON 36 #define ART_IDX_ARMOR_LRES 37 #define ART_IDX_ARMOR_ALLRES 38 #define ART_IDX_ARMOR_HRES 39 #define ART_IDX_GEN_STAT 40 #define ART_IDX_GEN_SUST 41 #define ART_IDX_GEN_STEALTH 42 #define ART_IDX_GEN_SEARCH 43 #define ART_IDX_GEN_INFRA 44 #define ART_IDX_GEN_SPEED 45 #define ART_IDX_GEN_IMMUNE 46 #define ART_IDX_GEN_FA 47 #define ART_IDX_GEN_HLIFE 48 #define ART_IDX_GEN_FEATHER 49 #define ART_IDX_GEN_LIGHT 50 #define ART_IDX_GEN_SINV 51 #define ART_IDX_GEN_ESP 52 #define ART_IDX_GEN_SDIG 53 #define ART_IDX_GEN_REGEN 54 #define ART_IDX_GEN_LRES 55 #define ART_IDX_GEN_RPOIS 56 #define ART_IDX_GEN_RFEAR 57 #define ART_IDX_GEN_RLIGHT 58 #define ART_IDX_GEN_RDARK 59 #define ART_IDX_GEN_RBLIND 60 #define ART_IDX_GEN_RCONF 61 #define ART_IDX_GEN_RSOUND 62 #define ART_IDX_GEN_RSHARD 63 #define ART_IDX_GEN_RNEXUS 64 #define ART_IDX_GEN_RNETHER 65 #define ART_IDX_GEN_RCHAOS 66 #define ART_IDX_GEN_RDISEN 67 #define ART_IDX_GEN_AC 68 #define ART_IDX_GEN_TUNN 69 #define ART_IDX_GEN_ACTIV 82 #define ART_IDX_GEN_PSTUN 86 /* Supercharged abilities - treated differently in algorithm */ #define ART_IDX_MELEE_DICE_SUPER 70 #define ART_IDX_BOW_SHOTS_SUPER 71 #define ART_IDX_BOW_MIGHT_SUPER 72 #define ART_IDX_GEN_SPEED_SUPER 73 #define ART_IDX_MELEE_BLOWS_SUPER 77 #define ART_IDX_GEN_AC_SUPER 85 /* Aggravation - weapon and nonweapon */ #define ART_IDX_WEAPON_AGGR 74 #define ART_IDX_NONWEAPON_AGGR 75 /* Total of abilities */ #define ART_IDX_TOTAL 87 /* Tallies of different ability types */ /* ToDo: use N_ELEMENTS for these */ #define ART_IDX_BOW_COUNT 4 #define ART_IDX_WEAPON_COUNT 3 #define ART_IDX_NONWEAPON_COUNT 8 #define ART_IDX_MELEE_COUNT 9 #define ART_IDX_ALLARMOR_COUNT 1 #define ART_IDX_BOOT_COUNT 4 #define ART_IDX_GLOVE_COUNT 3 #define ART_IDX_HELM_COUNT 6 #define ART_IDX_SHIELD_COUNT 2 #define ART_IDX_CLOAK_COUNT 2 #define ART_IDX_ARMOR_COUNT 7 #define ART_IDX_GEN_COUNT 31 #define ART_IDX_HIGH_RESIST_COUNT 13 /* Arrays of indices by item type, used in frequency generation */ static s16b art_idx_bow[] = {ART_IDX_BOW_SHOTS, ART_IDX_BOW_MIGHT, ART_IDX_BOW_BRAND, ART_IDX_BOW_SLAY}; static s16b art_idx_weapon[] = {ART_IDX_WEAPON_HIT, ART_IDX_WEAPON_DAM, ART_IDX_WEAPON_AGGR}; static s16b art_idx_nonweapon[] = {ART_IDX_NONWEAPON_HIT, ART_IDX_NONWEAPON_DAM, ART_IDX_NONWEAPON_HIT_DAM, ART_IDX_NONWEAPON_AGGR, ART_IDX_NONWEAPON_BRAND, ART_IDX_NONWEAPON_SLAY, ART_IDX_NONWEAPON_BLOWS, ART_IDX_NONWEAPON_SHOTS}; static s16b art_idx_melee[] = {ART_IDX_MELEE_BLESS, ART_IDX_MELEE_SINV, ART_IDX_MELEE_BRAND, ART_IDX_MELEE_SLAY, ART_IDX_MELEE_BLOWS, ART_IDX_MELEE_AC, ART_IDX_MELEE_DICE, ART_IDX_MELEE_WEIGHT, ART_IDX_MELEE_TUNN}; static s16b art_idx_allarmor[] = {ART_IDX_ALLARMOR_WEIGHT}; static s16b art_idx_boot[] = {ART_IDX_BOOT_AC, ART_IDX_BOOT_FEATHER, ART_IDX_BOOT_STEALTH, ART_IDX_BOOT_SPEED}; static s16b art_idx_glove[] = {ART_IDX_GLOVE_AC, ART_IDX_GLOVE_FA, ART_IDX_GLOVE_DEX}; static s16b art_idx_headgear[] = {ART_IDX_HELM_AC, ART_IDX_HELM_RBLIND, ART_IDX_HELM_ESP, ART_IDX_HELM_SINV, ART_IDX_HELM_WIS, ART_IDX_HELM_INT}; static s16b art_idx_shield[] = {ART_IDX_SHIELD_AC, ART_IDX_SHIELD_LRES}; static s16b art_idx_cloak[] = {ART_IDX_CLOAK_AC, ART_IDX_CLOAK_STEALTH}; static s16b art_idx_armor[] = {ART_IDX_ARMOR_AC, ART_IDX_ARMOR_STEALTH, ART_IDX_ARMOR_HLIFE, ART_IDX_ARMOR_CON, ART_IDX_ARMOR_LRES, ART_IDX_ARMOR_ALLRES, ART_IDX_ARMOR_HRES}; static s16b art_idx_gen[] = {ART_IDX_GEN_STAT, ART_IDX_GEN_SUST, ART_IDX_GEN_STEALTH, ART_IDX_GEN_SEARCH, ART_IDX_GEN_INFRA, ART_IDX_GEN_SPEED, ART_IDX_GEN_IMMUNE, ART_IDX_GEN_FA, ART_IDX_GEN_HLIFE, ART_IDX_GEN_FEATHER, ART_IDX_GEN_LIGHT, ART_IDX_GEN_SINV, ART_IDX_GEN_ESP, ART_IDX_GEN_SDIG, ART_IDX_GEN_REGEN, ART_IDX_GEN_LRES, ART_IDX_GEN_RPOIS, ART_IDX_GEN_RFEAR, ART_IDX_GEN_RLIGHT, ART_IDX_GEN_RDARK, ART_IDX_GEN_RBLIND, ART_IDX_GEN_RCONF, ART_IDX_GEN_RSOUND, ART_IDX_GEN_RSHARD, ART_IDX_GEN_RNEXUS, ART_IDX_GEN_RNETHER, ART_IDX_GEN_RCHAOS, ART_IDX_GEN_RDISEN, ART_IDX_GEN_AC, ART_IDX_GEN_TUNN, ART_IDX_GEN_ACTIV, ART_IDX_GEN_PSTUN}; static s16b art_idx_high_resist[] = {ART_IDX_GEN_RPOIS, ART_IDX_GEN_RFEAR, ART_IDX_GEN_RLIGHT, ART_IDX_GEN_RDARK, ART_IDX_GEN_RBLIND, ART_IDX_GEN_RCONF, ART_IDX_GEN_RSOUND, ART_IDX_GEN_RSHARD, ART_IDX_GEN_RNEXUS, ART_IDX_GEN_RNETHER, ART_IDX_GEN_RCHAOS, ART_IDX_GEN_RDISEN, ART_IDX_GEN_PSTUN}; /* Initialize the data structures for learned probabilities */ static s16b artprobs[ART_IDX_TOTAL]; s16b *baseprobs; static s16b art_bow_total = 0; static s16b art_melee_total = 0; static s16b art_boot_total = 0; static s16b art_glove_total = 0; static s16b art_headgear_total = 0; static s16b art_shield_total = 0; static s16b art_cloak_total = 0; static s16b art_armor_total = 0; static s16b art_other_total = 0; static s16b art_total = 0; /* * Working arrays for holding frequency values - global to avoid repeated * allocation of memory */ static s16b art_freq[ART_IDX_TOTAL]; /* artifact attributes */ s16b *base_freq; /* base items */ /* * Mean start and increment values for to_hit, to_dam and AC. Update these * if the algorithm changes. They are used in frequency generation. */ static s16b mean_hit_increment = 4; static s16b mean_dam_increment = 4; static s16b mean_hit_startval = 10; static s16b mean_dam_startval = 10; static s16b mean_ac_startval = 15; static s16b mean_ac_increment = 5; /* * Pointer for logging file */ static ang_file *log_file = NULL; /* * Store the original artifact power ratings */ static s32b *base_power; static s16b max_power; static s16b min_power; static s16b avg_power; static s16b var_power; /* * Store the original base item levels */ static byte *base_item_level; /* * Store the original base item rarities */ static byte *base_item_prob; /* * Store the original artifact rarities */ static byte *base_art_alloc; /* Global just for convenience. */ static int verbose = 1; char *artifact_gen_name(struct artifact *a, const char ***words) { char buf[BUFLEN]; char word[MAX_NAME_LEN + 1]; randname_make(RANDNAME_TOLKIEN, MIN_NAME_LEN, MAX_NAME_LEN, word, sizeof(word), words); word[0] = toupper((unsigned char)word[0]); if (one_in_(3)) strnfmt(buf, sizeof(buf), "'%s'", word); else strnfmt(buf, sizeof(buf), "of %s", word); if (a->aidx == ART_POWER) strnfmt(buf, sizeof(buf), "of Power (The One Ring)"); if (a->aidx == ART_GROND) strnfmt(buf, sizeof(buf), "'Grond'"); if (a->aidx == ART_MORGOTH) strnfmt(buf, sizeof(buf), "of Morgoth"); return string_make(buf); } /* * Use W. Sheldon Simms' random name generator. */ static errr init_names(void) { int i; struct artifact *a; for (i = 0; i < z_info->a_max; i++) { char desc[128] = "Based on "; a = &a_info[i]; if (!a->tval || !a->sval || !a->name) continue; if (prefix(a->name, "of Power")) { my_strcat(desc, a->name + 10, strlen(a->name) - 1); } else if (prefix(a->name, "of ")) { my_strcat(desc, a->name + 3, strlen(a->name) + 7); } else { my_strcat(desc, a->name + 1, strlen(a->name) + 8); } a->text = string_make(desc); a->name = artifact_gen_name(a, name_sections); } return 0; } /* * Return the artifact power, by generating a "fake" object based on the * artifact, and calling the common object_power function */ static s32b artifact_power(int a_idx) { object_type obj; char buf[256]; file_putf(log_file, "********** ENTERING EVAL POWER ********\n"); file_putf(log_file, "Artifact index is %d\n", a_idx); if (!make_fake_artifact(&obj, &a_info[a_idx])) return 0; object_desc(buf, 256*sizeof(char), &obj, ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL); file_putf(log_file, "%s\n", buf); return object_power(&obj, verbose, log_file, TRUE); } /* * Store the original artifact power ratings as a baseline */ static void store_base_power (void) { int i, j; artifact_type *a_ptr; object_kind *k_ptr; int *fake_power; max_power = 0; min_power = 32767; var_power = 0; fake_power = C_ZNEW(z_info->a_max, int); j = 0; for(i = 0; i < z_info->a_max; i++, j++) { base_power[i] = artifact_power(i); /* capture power stats, ignoring cursed and uber arts */ if (base_power[i] > max_power && base_power[i] < INHIBIT_POWER) max_power = base_power[i]; if (base_power[i] < min_power && base_power[i] > 0) min_power = base_power[i]; if (base_power[i] > 0 && base_power[i] < INHIBIT_POWER) fake_power[j] = (int)base_power[i]; else j--; if (!base_power[i]) continue; a_ptr = &a_info[i]; k_ptr = lookup_kind(a_ptr->tval, a_ptr->sval); base_item_level[i] = k_ptr->level; base_item_prob[i] = k_ptr->alloc_prob; base_art_alloc[i] = a_ptr->alloc_prob; } avg_power = mean(fake_power, j); var_power = variance(fake_power, j); file_putf(log_file, "Max power is %d, min is %d\n", max_power, min_power); file_putf(log_file, "Mean is %d, variance is %d\n", avg_power, var_power); /* Store the number of different types, for use later */ /* ToDo: replace this with full combination tracking */ for (i = 0; i < z_info->a_max; i++) { switch (a_info[i].tval) { case TV_SWORD: case TV_POLEARM: case TV_HAFTED: art_melee_total++; break; case TV_BOW: art_bow_total++; break; case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: art_armor_total++; break; case TV_SHIELD: art_shield_total++; break; case TV_CLOAK: art_cloak_total++; break; case TV_HELM: case TV_CROWN: art_headgear_total++; break; case TV_GLOVES: art_glove_total++; break; case TV_BOOTS: art_boot_total++; break; case TV_NULL: break; default: art_other_total++; } } art_total = art_melee_total + art_bow_total + art_armor_total + art_shield_total + art_cloak_total + art_headgear_total + art_glove_total + art_boot_total + art_other_total; } /* * Randomly select a base item type (tval,sval). Assign the various fields * corresponding to that choice. * * The return value gives the index of the new item type. The method is * passed a pointer to a rarity value in order to return the rarity of the * new item. */ static object_kind *choose_item(int a_idx) { artifact_type *a_ptr = &a_info[a_idx]; int tval = 0, sval = 0, i = 0; object_kind *k_ptr; s16b r; bitflag f[OF_SIZE]; /* * Pick a base item from the cumulative frequency table. * * Although this looks hideous, it provides for easy addition of * future artifact types, simply by removing the tvals from this * loop. * * N.B. Could easily generate lights, rings and amulets this way if * the whole special/flavour issue was sorted out (see ticket #1014) * Note that Carlammas and Barahir have the same sval as Grond/Morgoth */ while (tval == 0 || tval == TV_SKELETON || tval == TV_BOTTLE || tval == TV_JUNK || tval == TV_SPIKE || tval == TV_CHEST || tval == TV_SHOT || tval == TV_ARROW || tval == TV_BOLT || tval == TV_STAFF || tval == TV_WAND || tval == TV_ROD || tval == TV_SCROLL || tval == TV_POTION || tval == TV_FLASK || tval == TV_FOOD || tval == TV_MAGIC_BOOK || tval == TV_PRAYER_BOOK || tval == TV_GOLD || tval == TV_LIGHT || tval == TV_AMULET || tval == TV_RING || sval == SV_GROND || sval == SV_MORGOTH || k_info[i].alloc_prob == 0) { r = randint1(base_freq[z_info->k_max - 1]); i = 0; while (r > base_freq[i]) { i++; } tval = k_info[i].tval; sval = k_info[i].sval; } file_putf(log_file, "Creating tval %d sval %d\n", tval, sval); k_ptr = lookup_kind(tval, sval); a_ptr->tval = k_ptr->tval; a_ptr->sval = k_ptr->sval; a_ptr->pval[DEFAULT_PVAL] = randcalc(k_ptr->pval[DEFAULT_PVAL], 0, MINIMISE); a_ptr->to_h = randcalc(k_ptr->to_h, 0, MINIMISE); a_ptr->to_d = randcalc(k_ptr->to_d, 0, MINIMISE); a_ptr->to_a = randcalc(k_ptr->to_a, 0, MINIMISE); a_ptr->ac = k_ptr->ac; a_ptr->dd = k_ptr->dd; a_ptr->ds = k_ptr->ds; a_ptr->weight = k_ptr->weight; of_copy(a_ptr->flags, k_ptr->flags); for (i = 0; i < MAX_PVALS; i++) of_copy(a_ptr->pval_flags[i], k_ptr->pval_flags[i]); a_ptr->num_pvals = k_ptr->num_pvals; a_ptr->effect = 0; /* Artifacts ignore everything */ create_mask(f, FALSE, OFT_IGNORE, OFT_MAX); of_union(a_ptr->flags, f); /* Assign basic stats to the artifact based on its artifact level. */ /* * CR, 2001-09-03: changed to a simpler version to match the hit-dam * parsing algorithm. We use random ranges averaging mean_hit_startval * and mean_dam_startval, but permitting variation of 50% to 150%. * Level-dependent term has been removed for the moment. */ switch (a_ptr->tval) { case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_SWORD: case TV_POLEARM: a_ptr->to_h += (s16b)(mean_hit_startval / 2 + randint0(mean_hit_startval) ); a_ptr->to_d += (s16b)(mean_dam_startval / 2 + randint0(mean_dam_startval) ); file_putf(log_file, "Assigned basic stats, to_hit: %d, to_dam: %d\n", a_ptr->to_h, a_ptr->to_d); break; case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: /* CR: adjusted this to work with parsing logic */ a_ptr->to_a += (s16b)(mean_ac_startval / 2 + randint0(mean_ac_startval) ); file_putf(log_file, "Assigned basic stats, AC bonus: %d\n", a_ptr->to_a); break; } /* Done - return the index of the new object kind. */ return k_ptr; } /* * We've just added an ability which uses the pval bonus. Make sure it's * not zero. If it's currently negative, leave it negative (heh heh). */ static void do_pval(artifact_type *a_ptr) { int factor = 1; /* Track whether we have blows, might or shots on this item */ if (of_has(a_ptr->flags, OF_BLOWS)) factor++; if (of_has(a_ptr->flags, OF_MIGHT)) factor++; if (of_has(a_ptr->flags, OF_SHOTS)) factor++; if (a_ptr->pval[DEFAULT_PVAL] == 0) { /* Blows, might, shots handled separately */ if (factor > 1) { a_ptr->pval[DEFAULT_PVAL] = (s16b)randint1(2); /* Give it a shot at +3 */ if (INHIBIT_STRONG) a_ptr->pval[DEFAULT_PVAL] = 3; } else a_ptr->pval[DEFAULT_PVAL] = (s16b)randint1(4); file_putf(log_file, "Assigned initial pval, value is: %d\n", a_ptr->pval[DEFAULT_PVAL]); } else if (a_ptr->pval[DEFAULT_PVAL] < 0) { if (one_in_(2)) { a_ptr->pval[DEFAULT_PVAL]--; file_putf(log_file, "Decreasing pval by 1, new value is: %d\n", a_ptr->pval[DEFAULT_PVAL]); } } else if (one_in_(a_ptr->pval[DEFAULT_PVAL] * factor)) { /* * CR: made this a bit rarer and diminishing with higher pval - * also rarer if item has blows/might/shots already */ a_ptr->pval[DEFAULT_PVAL]++; file_putf(log_file, "Increasing pval by 1, new value is: %d\n", a_ptr->pval[DEFAULT_PVAL]); } } static void remove_contradictory(artifact_type *a_ptr) { if (of_has(a_ptr->flags, OF_AGGRAVATE)) of_off(a_ptr->flags, OF_STEALTH); if (of_has(a_ptr->flags, OF_IM_ACID)) of_off(a_ptr->flags, OF_RES_ACID); if (of_has(a_ptr->flags, OF_IM_ELEC)) of_off(a_ptr->flags, OF_RES_ELEC); if (of_has(a_ptr->flags, OF_IM_FIRE)) of_off(a_ptr->flags, OF_RES_FIRE); if (of_has(a_ptr->flags, OF_IM_COLD)) of_off(a_ptr->flags, OF_RES_COLD); if (a_ptr->pval[DEFAULT_PVAL] < 0) { if (of_has(a_ptr->flags, OF_STR)) of_off(a_ptr->flags, OF_SUST_STR); if (of_has(a_ptr->flags, OF_INT)) of_off(a_ptr->flags, OF_SUST_INT); if (of_has(a_ptr->flags, OF_WIS)) of_off(a_ptr->flags, OF_SUST_WIS); if (of_has(a_ptr->flags, OF_DEX)) of_off(a_ptr->flags, OF_SUST_DEX); if (of_has(a_ptr->flags, OF_CON)) of_off(a_ptr->flags, OF_SUST_CON); if (of_has(a_ptr->flags, OF_CHR)) of_off(a_ptr->flags, OF_SUST_CHR); of_off(a_ptr->flags, OF_BLOWS); } if (of_has(a_ptr->flags, OF_LIGHT_CURSE)) of_off(a_ptr->flags, OF_BLESSED); if (of_has(a_ptr->flags, OF_KILL_DRAGON)) of_off(a_ptr->flags, OF_SLAY_DRAGON); if (of_has(a_ptr->flags, OF_KILL_DEMON)) of_off(a_ptr->flags, OF_SLAY_DEMON); if (of_has(a_ptr->flags, OF_KILL_UNDEAD)) of_off(a_ptr->flags, OF_SLAY_UNDEAD); if (of_has(a_ptr->flags, OF_DRAIN_EXP)) of_off(a_ptr->flags, OF_HOLD_LIFE); } /* * Adjust the parsed frequencies for any peculiarities of the * algorithm. For example, if stat bonuses and sustains are * being added in a correlated fashion, it will tend to push * the frequencies up for both of them. In this method we * compensate for cases like this by applying corrective * scaling. */ static void adjust_freqs(void) { /* * Enforce minimum values for any frequencies that might potentially * be missing in the standard set, especially supercharged ones. * Numbers here represent the average number of times this ability * would appear if the entire randart set was eligible to receive * it (so in the case of a bow ability: if the set was all bows). * * Note that low numbers here for very specialized abilities could * mean that there's a good chance this ability will not appear in * a given randart set. If this is a problem, raise the number. */ if (artprobs[ART_IDX_GEN_RFEAR] < 5) artprobs[ART_IDX_GEN_RFEAR] = 5; if (artprobs[ART_IDX_MELEE_DICE_SUPER] < 5) artprobs[ART_IDX_MELEE_DICE_SUPER] = 5; if (artprobs[ART_IDX_BOW_SHOTS_SUPER] < 5) artprobs[ART_IDX_BOW_SHOTS_SUPER] = 5; if (artprobs[ART_IDX_BOW_MIGHT_SUPER] < 5) artprobs[ART_IDX_BOW_MIGHT_SUPER] = 5; if (artprobs[ART_IDX_MELEE_BLOWS_SUPER] < 5) artprobs[ART_IDX_MELEE_BLOWS_SUPER] = 5; if (artprobs[ART_IDX_GEN_SPEED_SUPER] < 5) artprobs[ART_IDX_GEN_SPEED_SUPER] = 5; if (artprobs[ART_IDX_GEN_AC] < 5) artprobs[ART_IDX_GEN_AC] = 5; if (artprobs[ART_IDX_GEN_TUNN] < 5) artprobs[ART_IDX_GEN_TUNN] = 5; if (artprobs[ART_IDX_NONWEAPON_BRAND] < 2) artprobs[ART_IDX_NONWEAPON_BRAND] = 2; if (artprobs[ART_IDX_NONWEAPON_SLAY] < 2) artprobs[ART_IDX_NONWEAPON_SLAY] = 2; if (artprobs[ART_IDX_BOW_BRAND] < 2) artprobs[ART_IDX_BOW_BRAND] = 2; if (artprobs[ART_IDX_BOW_SLAY] < 2) artprobs[ART_IDX_BOW_SLAY] = 2; if (artprobs[ART_IDX_NONWEAPON_BLOWS] < 2) artprobs[ART_IDX_NONWEAPON_BLOWS] = 2; if (artprobs[ART_IDX_NONWEAPON_SHOTS] < 2) artprobs[ART_IDX_NONWEAPON_SHOTS] = 2; if (artprobs[ART_IDX_GEN_AC_SUPER] < 5) artprobs[ART_IDX_GEN_AC_SUPER] = 5; if (artprobs[ART_IDX_MELEE_AC] < 5) artprobs[ART_IDX_MELEE_AC] = 5; if (artprobs[ART_IDX_GEN_PSTUN] < 3) artprobs[ART_IDX_GEN_PSTUN] = 3; /* Cut aggravation frequencies in half since they're used twice */ artprobs[ART_IDX_NONWEAPON_AGGR] /= 2; artprobs[ART_IDX_WEAPON_AGGR] /= 2; } /* * Parse the list of artifacts and count up the frequencies of the various * abilities. This is used to give dynamic generation probabilities. */ static void parse_frequencies(void) { int i, j; const artifact_type *a_ptr; object_kind *k_ptr; s32b m, temp, temp2; bitflag mask[OF_SIZE]; file_putf(log_file, "\n****** BEGINNING GENERATION OF FREQUENCIES\n\n"); /* Zero the frequencies for artifact attributes */ for (i = 0; i < ART_IDX_TOTAL; i++) { artprobs[i] = 0; } /* * Initialise the frequencies for base items so that each item could * be chosen - we check for illegal items during choose_item() */ for (i = 0; i < z_info->k_max; i++) { baseprobs[i] = 1; } /* Go through the list of all artifacts */ for (i = 0; i < z_info->a_max; i++) { file_putf(log_file, "Current artifact index is %d\n", i); a_ptr = &a_info[i]; /* Special cases -- don't parse these! */ if ((i == ART_POWER) || (i == ART_GROND) || (i == ART_MORGOTH)) continue; /* Also don't parse cursed or null items */ if (base_power[i] < 0 || a_ptr->tval == 0) continue; /* Get a pointer to the base item for this artifact */ k_ptr = lookup_kind(a_ptr->tval, a_ptr->sval); /* Add the base item to the baseprobs array */ baseprobs[k_ptr->kidx]++; file_putf(log_file, "Base item is %d\n", k_ptr->kidx); /* Count up the abilities for this artifact */ if (a_ptr->tval == TV_BOW) { if(of_has(a_ptr->flags, OF_SHOTS)) { /* Do we have 3 or more extra shots? (Unlikely) */ if(a_ptr->pval[DEFAULT_PVAL] > 2) { file_putf(log_file, "Adding 1 for supercharged shots (3 or more!)\n"); (artprobs[ART_IDX_BOW_SHOTS_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra shots\n"); (artprobs[ART_IDX_BOW_SHOTS])++; } } if(of_has(a_ptr->flags, OF_MIGHT)) { /* Do we have 3 or more extra might? (Unlikely) */ if(a_ptr->pval[DEFAULT_PVAL] > 2) { file_putf(log_file, "Adding 1 for supercharged might (3 or more!)\n"); (artprobs[ART_IDX_BOW_MIGHT_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra might\n"); (artprobs[ART_IDX_BOW_MIGHT])++; } } /* Brands or slays - count all together */ create_mask(mask, FALSE, OFT_SLAY, OFT_BRAND, OFT_KILL, OFT_MAX); if (of_is_inter(a_ptr->flags, mask)) { /* We have some brands or slays - count them */ temp = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); temp2 = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); file_putf(log_file, "Adding %d for slays\n", temp - temp2); file_putf(log_file, "Adding %d for brands\n", temp2); /* Add these to the frequency count */ artprobs[ART_IDX_BOW_SLAY] += (temp - temp2); artprobs[ART_IDX_BOW_BRAND] += temp2; } } /* Handle hit / dam ratings - are they higher than normal? */ /* Also handle other weapon/nonweapon abilities */ if (a_ptr->tval == TV_BOW || a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { m = randcalc(k_ptr->to_h, 0, MINIMISE); temp = (a_ptr->to_h - m - mean_hit_startval) / mean_hit_increment; if (temp > 0) file_putf(log_file, "Adding %d instances of extra to-hit bonus for weapon\n", temp); else if (temp < 0) file_putf(log_file, "Subtracting %d instances of extra to-hit bonus for weapon\n", temp); artprobs[ART_IDX_WEAPON_HIT] += temp; m = randcalc(k_ptr->to_d, 0, MINIMISE); temp = (a_ptr->to_d - m - mean_dam_startval) / mean_dam_increment; if (temp > 0) file_putf(log_file, "Adding %d instances of extra to-dam bonus for weapon\n", temp); else file_putf(log_file, "Subtracting %d instances of extra to-dam bonus for weapon\n", temp); artprobs[ART_IDX_WEAPON_DAM] += temp; /* Aggravation */ if (of_has(a_ptr->flags, OF_AGGRAVATE)) { file_putf(log_file, "Adding 1 for aggravation - weapon\n"); artprobs[ART_IDX_WEAPON_AGGR]++; } /* End weapon stuff */ } else { if ( (a_ptr->to_h - randcalc(k_ptr->to_h, 0, MINIMISE) > 0) && (a_ptr->to_h - randcalc(k_ptr->to_h, 0, MINIMISE) == a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) ) { /* Special case: both hit and dam bonuses present and equal */ temp = (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) / mean_dam_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra to-hit and to-dam bonus for non-weapon\n", temp); (artprobs[ART_IDX_NONWEAPON_HIT_DAM]) += temp; } } else { /* Uneven bonuses - handle separately */ if (a_ptr->to_h - randcalc(k_ptr->to_h, 0, MINIMISE) > 0) { temp = (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) / mean_dam_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra to-hit bonus for non-weapon\n", temp); (artprobs[ART_IDX_NONWEAPON_HIT]) += temp; } } if (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE) > 0) { temp = (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) / mean_dam_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra to-dam bonus for non-weapon\n", temp); (artprobs[ART_IDX_NONWEAPON_DAM]) += temp; } } } /* Aggravation */ if (of_has(a_ptr->flags, OF_AGGRAVATE)) { file_putf(log_file, "Adding 1 for aggravation - nonweapon\n"); (artprobs[ART_IDX_NONWEAPON_AGGR])++; } /* Brands or slays - count all together */ create_mask(mask, FALSE, OFT_SLAY, OFT_BRAND, OFT_KILL, OFT_MAX); if (of_is_inter(a_ptr->flags, mask)) { /* We have some brands or slays - count them */ temp = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); temp2 = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); file_putf(log_file, "Adding %d for slays\n", temp - temp2); file_putf(log_file, "Adding %d for brands\n", temp2); /* Add these to the frequency count */ artprobs[ART_IDX_NONWEAPON_SLAY] += (temp - temp2); artprobs[ART_IDX_NONWEAPON_BRAND] += temp2; } if (of_has(a_ptr->flags, OF_BLOWS)) { file_putf(log_file, "Adding 1 for extra blows on nonweapon\n"); (artprobs[ART_IDX_NONWEAPON_BLOWS])++; } if (of_has(a_ptr->flags, OF_SHOTS)) { file_putf(log_file, "Adding 1 for extra shots on nonweapon\n"); (artprobs[ART_IDX_NONWEAPON_SHOTS])++; } } if (a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { /* Blessed weapon? */ if (of_has(a_ptr->flags, OF_BLESSED)) { file_putf(log_file, "Adding 1 for blessed weapon\n"); (artprobs[ART_IDX_MELEE_BLESS])++; } /* See invisible? */ if (of_has(a_ptr->flags, OF_SEE_INVIS)) { file_putf(log_file, "Adding 1 for see invisible (weapon case)\n"); (artprobs[ART_IDX_MELEE_SINV])++; } /* Does this weapon have extra blows? */ if (of_has(a_ptr->flags, OF_BLOWS)) { /* Do we have 3 or more extra blows? (Unlikely) */ if(a_ptr->pval[DEFAULT_PVAL] > 2) { file_putf(log_file, "Adding 1 for supercharged blows (3 or more!)\n"); (artprobs[ART_IDX_MELEE_BLOWS_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra blows\n"); (artprobs[ART_IDX_MELEE_BLOWS])++; } } /* Does this weapon have an unusual bonus to AC? */ if ( (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MAXIMISE)) > 0) { temp = (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MAXIMISE)) / mean_ac_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra AC bonus for weapon\n", temp); (artprobs[ART_IDX_MELEE_AC]) += temp; } } /* Check damage dice - are they more than normal? */ if (a_ptr->dd > k_ptr->dd) { /* Difference of 3 or more? */ if ( (a_ptr->dd - k_ptr->dd) > 2) { file_putf(log_file, "Adding 1 for super-charged damage dice!\n"); (artprobs[ART_IDX_MELEE_DICE_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra damage dice.\n"); (artprobs[ART_IDX_MELEE_DICE])++; } } /* Check weight - is it different from normal? */ if (a_ptr->weight != k_ptr->weight) { file_putf(log_file, "Adding 1 for unusual weight.\n"); (artprobs[ART_IDX_MELEE_WEIGHT])++; } /* Check for tunnelling ability */ if (of_has(a_ptr->flags, OF_TUNNEL)) { file_putf(log_file, "Adding 1 for tunnelling bonus.\n"); (artprobs[ART_IDX_MELEE_TUNN])++; } /* Brands or slays - count all together */ create_mask(mask, FALSE, OFT_SLAY, OFT_BRAND, OFT_KILL, OFT_MAX); if (of_is_inter(a_ptr->flags, mask)) { /* We have some brands or slays - count them */ temp = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); temp2 = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); file_putf(log_file, "Adding %d for slays\n", temp - temp2); file_putf(log_file, "Adding %d for brands\n", temp2); /* Add these to the frequency count */ artprobs[ART_IDX_MELEE_SLAY] += (temp - temp2); artprobs[ART_IDX_MELEE_BRAND] += temp2; } /* End of weapon-specific stuff */ } else { /* Check for tunnelling ability */ if (of_has(a_ptr->flags, OF_TUNNEL)) { file_putf(log_file, "Adding 1 for tunnelling bonus - general.\n"); (artprobs[ART_IDX_GEN_TUNN])++; } } /* * Count up extra AC bonus values. * Could also add logic to subtract for lower values here, but it's * probably not worth the trouble since it's so rare. */ if ( (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MINIMISE) - mean_ac_startval) > 0) { temp = (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MINIMISE) - mean_ac_startval) / mean_ac_increment; if (temp > 0) { if (a_ptr->to_a > 20) { file_putf(log_file, "Adding %d for supercharged AC\n", temp); (artprobs[ART_IDX_GEN_AC_SUPER])++; } else if (a_ptr->tval == TV_BOOTS) { file_putf(log_file, "Adding %d for AC bonus - boots\n", temp); (artprobs[ART_IDX_BOOT_AC]) += temp; } else if (a_ptr->tval == TV_GLOVES) { file_putf(log_file, "Adding %d for AC bonus - gloves\n", temp); (artprobs[ART_IDX_GLOVE_AC]) += temp; } else if (a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding %d for AC bonus - headgear\n", temp); (artprobs[ART_IDX_HELM_AC]) += temp; } else if (a_ptr->tval == TV_SHIELD) { file_putf(log_file, "Adding %d for AC bonus - shield\n", temp); (artprobs[ART_IDX_SHIELD_AC]) += temp; } else if (a_ptr->tval == TV_CLOAK) { file_putf(log_file, "Adding %d for AC bonus - cloak\n", temp); (artprobs[ART_IDX_CLOAK_AC]) += temp; } else if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { file_putf(log_file, "Adding %d for AC bonus - body armor\n", temp); (artprobs[ART_IDX_ARMOR_AC]) += temp; } else { file_putf(log_file, "Adding %d for AC bonus - general\n", temp); (artprobs[ART_IDX_GEN_AC]) += temp; } } } /* Generic armor abilities */ if (a_ptr->tval == TV_BOOTS || a_ptr->tval == TV_GLOVES || a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN || a_ptr->tval == TV_SHIELD || a_ptr->tval == TV_CLOAK || a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { /* Check weight - is it different from normal? */ /* ToDo: count higher and lower separately */ if (a_ptr->weight != k_ptr->weight) { file_putf(log_file, "Adding 1 for unusual weight.\n"); (artprobs[ART_IDX_ALLARMOR_WEIGHT])++; } /* Done with generic armor abilities */ } /* * General abilities. This section requires a bit more work * than the others, because we have to consider cases where * a certain ability might be found in a particular item type. * For example, ESP is commonly found on headgear, so when * we count ESP we must add it to either the headgear or * general tally, depending on the base item. This permits * us to have general abilities appear more commonly on a * certain item type. */ if (flags_test(a_ptr->flags, OF_SIZE, OF_STR, OF_INT, OF_WIS, OF_DEX, OF_CON, OF_CHR, FLAG_END)) { /* Stat bonus case. Add up the number of individual bonuses */ temp = 0; if (of_has(a_ptr->flags, OF_STR)) temp++; if (of_has(a_ptr->flags, OF_INT)) temp++; if (of_has(a_ptr->flags, OF_WIS)) temp++; if (of_has(a_ptr->flags, OF_DEX)) temp++; if (of_has(a_ptr->flags, OF_CON)) temp++; if (of_has(a_ptr->flags, OF_CHR)) temp++; /* Handle a few special cases separately. */ if((a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) && (of_has(a_ptr->flags, OF_WIS) || of_has(a_ptr->flags, OF_INT))) { /* Handle WIS and INT on helms and crowns */ if(of_has(a_ptr->flags, OF_WIS)) { file_putf(log_file, "Adding 1 for WIS bonus on headgear.\n"); (artprobs[ART_IDX_HELM_WIS])++; /* Counted this one separately so subtract it here */ temp--; } if(of_has(a_ptr->flags, OF_INT)) { file_putf(log_file, "Adding 1 for INT bonus on headgear.\n"); (artprobs[ART_IDX_HELM_INT])++; /* Counted this one separately so subtract it here */ temp--; } } else if ((a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) && of_has(a_ptr->flags, OF_CON)) { /* Handle CON bonus on armor */ file_putf(log_file, "Adding 1 for CON bonus on body armor.\n"); (artprobs[ART_IDX_ARMOR_CON])++; /* Counted this one separately so subtract it here */ temp--; } else if (a_ptr->tval == TV_GLOVES && of_has(a_ptr->flags, OF_DEX)) { /* Handle DEX bonus on gloves */ file_putf(log_file, "Adding 1 for DEX bonus on gloves.\n"); (artprobs[ART_IDX_GLOVE_DEX])++; /* Counted this one separately so subtract it here */ temp--; } /* Now the general case */ if (temp > 0) { /* There are some bonuses that weren't handled above */ file_putf(log_file, "Adding %d for stat bonuses - general.\n", temp); (artprobs[ART_IDX_GEN_STAT]) += temp; /* Done with stat bonuses */ } } if (flags_test(a_ptr->flags, OF_SIZE, OF_SUST_STR, OF_SUST_INT, OF_SUST_WIS, OF_SUST_DEX, OF_SUST_CON, OF_SUST_CHR, FLAG_END)) { /* Now do sustains, in a similar manner */ temp = 0; if (of_has(a_ptr->flags, OF_SUST_STR)) temp++; if (of_has(a_ptr->flags, OF_SUST_INT)) temp++; if (of_has(a_ptr->flags, OF_SUST_WIS)) temp++; if (of_has(a_ptr->flags, OF_SUST_DEX)) temp++; if (of_has(a_ptr->flags, OF_SUST_CON)) temp++; if (of_has(a_ptr->flags, OF_SUST_CHR)) temp++; file_putf(log_file, "Adding %d for stat sustains.\n", temp); (artprobs[ART_IDX_GEN_SUST]) += temp; } if (of_has(a_ptr->flags, OF_STEALTH)) { /* Handle stealth, including a couple of special cases */ if(a_ptr->tval == TV_BOOTS) { file_putf(log_file, "Adding 1 for stealth bonus on boots.\n"); (artprobs[ART_IDX_BOOT_STEALTH])++; } else if (a_ptr->tval == TV_CLOAK) { file_putf(log_file, "Adding 1 for stealth bonus on cloak.\n"); (artprobs[ART_IDX_CLOAK_STEALTH])++; } else if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { file_putf(log_file, "Adding 1 for stealth bonus on armor.\n"); (artprobs[ART_IDX_ARMOR_STEALTH])++; } else { /* General case */ file_putf(log_file, "Adding 1 for stealth bonus - general.\n"); (artprobs[ART_IDX_GEN_STEALTH])++; } /* Done with stealth */ } if (of_has(a_ptr->flags, OF_SEARCH)) { /* Handle searching bonus - fully generic this time */ file_putf(log_file, "Adding 1 for search bonus - general.\n"); (artprobs[ART_IDX_GEN_SEARCH])++; } if (of_has(a_ptr->flags, OF_INFRA)) { /* Handle infravision bonus - fully generic */ file_putf(log_file, "Adding 1 for infravision bonus - general.\n"); (artprobs[ART_IDX_GEN_INFRA])++; } if (of_has(a_ptr->flags, OF_SPEED)) { /* * Speed - boots handled separately. * This is something of a special case in that we use the same * frequency for the supercharged value and the normal value. * We get away with this by using a somewhat lower average value * for the supercharged ability than in the basic set (around * +7 or +8 - c.f. Ringil and the others at +10 and upwards). * This then allows us to add an equal number of * small bonuses around +3 or so without unbalancing things. */ if (a_ptr->pval[DEFAULT_PVAL] > 7) { /* Supercharge case */ file_putf(log_file, "Adding 1 for supercharged speed bonus!\n"); (artprobs[ART_IDX_GEN_SPEED_SUPER])++; } else if(a_ptr->tval == TV_BOOTS) { /* Handle boots separately */ file_putf(log_file, "Adding 1 for normal speed bonus on boots.\n"); (artprobs[ART_IDX_BOOT_SPEED])++; } else { file_putf(log_file, "Adding 1 for normal speed bonus - general.\n"); (artprobs[ART_IDX_GEN_SPEED])++; } /* Done with speed */ } if (flags_test(a_ptr->flags, OF_SIZE, OF_IM_ACID, OF_IM_ELEC, OF_IM_FIRE, OF_IM_COLD, FLAG_END)) { /* Count up immunities for this item, if any */ temp = 0; if (of_has(a_ptr->flags, OF_IM_ACID)) temp++; if (of_has(a_ptr->flags, OF_IM_ELEC)) temp++; if (of_has(a_ptr->flags, OF_IM_FIRE)) temp++; if (of_has(a_ptr->flags, OF_IM_COLD)) temp++; file_putf(log_file, "Adding %d for immunities.\n", temp); (artprobs[ART_IDX_GEN_IMMUNE]) += temp; } if (of_has(a_ptr->flags, OF_FREE_ACT)) { /* Free action - handle gloves separately */ if(a_ptr->tval == TV_GLOVES) { file_putf(log_file, "Adding 1 for free action on gloves.\n"); (artprobs[ART_IDX_GLOVE_FA])++; } else { file_putf(log_file, "Adding 1 for free action - general.\n"); (artprobs[ART_IDX_GEN_FA])++; } } if (of_has(a_ptr->flags, OF_HOLD_LIFE)) { /* Hold life - do body armor separately */ if( (a_ptr->tval == TV_SOFT_ARMOR) || (a_ptr->tval == TV_HARD_ARMOR) || (a_ptr->tval == TV_DRAG_ARMOR)) { file_putf(log_file, "Adding 1 for hold life on armor.\n"); (artprobs[ART_IDX_ARMOR_HLIFE])++; } else { file_putf(log_file, "Adding 1 for hold life - general.\n"); (artprobs[ART_IDX_GEN_HLIFE])++; } } if (of_has(a_ptr->flags, OF_FEATHER)) { /* Feather fall - handle boots separately */ if(a_ptr->tval == TV_BOOTS) { file_putf(log_file, "Adding 1 for feather fall on boots.\n"); (artprobs[ART_IDX_BOOT_FEATHER])++; } else { file_putf(log_file, "Adding 1 for feather fall - general.\n"); (artprobs[ART_IDX_GEN_FEATHER])++; } } if (of_has(a_ptr->flags, OF_LIGHT)) { /* Handle permanent light */ file_putf(log_file, "Adding 1 for permanent light - general.\n"); (artprobs[ART_IDX_GEN_LIGHT])++; } if (of_has(a_ptr->flags, OF_SEE_INVIS)) { /* * Handle see invisible - do helms / crowns separately * (Weapons were done already so exclude them) */ if( !(a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD)) { if (a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding 1 for see invisible - headgear.\n"); (artprobs[ART_IDX_HELM_SINV])++; } else { file_putf(log_file, "Adding 1 for see invisible - general.\n"); (artprobs[ART_IDX_GEN_SINV])++; } } } if (of_has(a_ptr->flags, OF_TELEPATHY)) { /* ESP case. Handle helms/crowns separately. */ if(a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding 1 for ESP on headgear.\n"); (artprobs[ART_IDX_HELM_ESP])++; } else { file_putf(log_file, "Adding 1 for ESP - general.\n"); (artprobs[ART_IDX_GEN_ESP])++; } } if (of_has(a_ptr->flags, OF_SLOW_DIGEST)) { /* Slow digestion case - generic. */ file_putf(log_file, "Adding 1 for slow digestion - general.\n"); (artprobs[ART_IDX_GEN_SDIG])++; } if (of_has(a_ptr->flags, OF_REGEN)) { /* Regeneration case - generic. */ file_putf(log_file, "Adding 1 for regeneration - general.\n"); (artprobs[ART_IDX_GEN_REGEN])++; } if (flags_test(a_ptr->flags, OF_SIZE, OF_RES_ACID, OF_RES_ELEC, OF_RES_FIRE, OF_RES_COLD, FLAG_END)) { /* Count up low resists (not the type, just the number) */ temp = 0; if (of_has(a_ptr->flags, OF_RES_ACID)) temp++; if (of_has(a_ptr->flags, OF_RES_ELEC)) temp++; if (of_has(a_ptr->flags, OF_RES_FIRE)) temp++; if (of_has(a_ptr->flags, OF_RES_COLD)) temp++; /* Shields treated separately */ if (a_ptr->tval == TV_SHIELD) { file_putf(log_file, "Adding %d for low resists on shield.\n", temp); (artprobs[ART_IDX_SHIELD_LRES]) += temp; } else if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { /* Armor also treated separately */ if (temp == 4) { /* Special case: armor has all four low resists */ file_putf(log_file, "Adding 1 for ALL LOW RESISTS on body armor.\n"); (artprobs[ART_IDX_ARMOR_ALLRES])++; } else { /* Just tally up the resists as usual */ file_putf(log_file, "Adding %d for low resists on body armor.\n", temp); (artprobs[ART_IDX_ARMOR_LRES]) += temp; } } else { /* General case */ file_putf(log_file, "Adding %d for low resists - general.\n", temp); (artprobs[ART_IDX_GEN_LRES]) += temp; } /* Done with low resists */ } /* * If the item is body armor then count up all the high resists before * going through them individually. High resists are an important * component of body armor so we track probability for them separately. * The proportions of the high resists will be determined by the * generic frequencies - this number just tracks the total. */ if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { temp = 0; if (of_has(a_ptr->flags, OF_RES_POIS)) temp++; if (of_has(a_ptr->flags, OF_RES_FEAR)) temp++; if (of_has(a_ptr->flags, OF_RES_LIGHT)) temp++; if (of_has(a_ptr->flags, OF_RES_DARK)) temp++; if (of_has(a_ptr->flags, OF_RES_BLIND)) temp++; if (of_has(a_ptr->flags, OF_RES_CONFU)) temp++; if (of_has(a_ptr->flags, OF_RES_SOUND)) temp++; if (of_has(a_ptr->flags, OF_RES_SHARD)) temp++; if (of_has(a_ptr->flags, OF_RES_NEXUS)) temp++; if (of_has(a_ptr->flags, OF_RES_NETHR)) temp++; if (of_has(a_ptr->flags, OF_RES_CHAOS)) temp++; if (of_has(a_ptr->flags, OF_RES_DISEN)) temp++; if (of_has(a_ptr->flags, OF_RES_STUN)) temp++; file_putf(log_file, "Adding %d for high resists on body armor.\n", temp); (artprobs[ART_IDX_ARMOR_HRES]) += temp; } /* Now do the high resists individually */ if (of_has(a_ptr->flags, OF_RES_POIS)) { /* Resist poison ability */ file_putf(log_file, "Adding 1 for resist poison - general.\n"); (artprobs[ART_IDX_GEN_RPOIS])++; } if (of_has(a_ptr->flags, OF_RES_FEAR)) { /* Resist fear ability */ file_putf(log_file, "Adding 1 for resist fear - general.\n"); (artprobs[ART_IDX_GEN_RFEAR])++; } if (of_has(a_ptr->flags, OF_RES_LIGHT)) { /* Resist light ability */ file_putf(log_file, "Adding 1 for resist light - general.\n"); (artprobs[ART_IDX_GEN_RLIGHT])++; } if (of_has(a_ptr->flags, OF_RES_DARK)) { /* Resist dark ability */ file_putf(log_file, "Adding 1 for resist dark - general.\n"); (artprobs[ART_IDX_GEN_RDARK])++; } if (of_has(a_ptr->flags, OF_RES_BLIND)) { /* Resist blind ability - helms/crowns are separate */ if(a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding 1 for resist blindness - headgear.\n"); (artprobs[ART_IDX_HELM_RBLIND])++; } else { /* General case */ file_putf(log_file, "Adding 1 for resist blindness - general.\n"); (artprobs[ART_IDX_GEN_RBLIND])++; } } if (of_has(a_ptr->flags, OF_RES_CONFU)) { /* Resist confusion ability */ file_putf(log_file, "Adding 1 for resist confusion - general.\n"); (artprobs[ART_IDX_GEN_RCONF])++; } if (of_has(a_ptr->flags, OF_RES_SOUND)) { /* Resist sound ability */ file_putf(log_file, "Adding 1 for resist sound - general.\n"); (artprobs[ART_IDX_GEN_RSOUND])++; } if (of_has(a_ptr->flags, OF_RES_SHARD)) { /* Resist shards ability */ file_putf(log_file, "Adding 1 for resist shards - general.\n"); (artprobs[ART_IDX_GEN_RSHARD])++; } if (of_has(a_ptr->flags, OF_RES_NEXUS)) { /* Resist nexus ability */ file_putf(log_file, "Adding 1 for resist nexus - general.\n"); (artprobs[ART_IDX_GEN_RNEXUS])++; } if (of_has(a_ptr->flags, OF_RES_NETHR)) { /* Resist nether ability */ file_putf(log_file, "Adding 1 for resist nether - general.\n"); (artprobs[ART_IDX_GEN_RNETHER])++; } if (of_has(a_ptr->flags, OF_RES_CHAOS)) { /* Resist chaos ability */ file_putf(log_file, "Adding 1 for resist chaos - general.\n"); (artprobs[ART_IDX_GEN_RCHAOS])++; } if (of_has(a_ptr->flags, OF_RES_DISEN)) { /* Resist disenchantment ability */ file_putf(log_file, "Adding 1 for resist disenchantment - general.\n"); (artprobs[ART_IDX_GEN_RDISEN])++; } if (of_has(a_ptr->flags, OF_RES_STUN)) { /* Resist stunning ability */ file_putf(log_file, "Adding 1 for res_stun - general.\n"); (artprobs[ART_IDX_GEN_PSTUN])++; } if (a_ptr->effect) { /* Activation */ file_putf(log_file, "Adding 1 for activation.\n"); (artprobs[ART_IDX_GEN_ACTIV])++; } /* Done with parsing of frequencies for this item */ } /* End for loop */ if (verbose) { /* Print out some of the abilities, to make sure that everything's fine */ for (i = 0; i < ART_IDX_TOTAL; i++) { file_putf(log_file, "Frequency of ability %d: %d\n", i, artprobs[i]); } for (i = 0; i < z_info->k_max; i++) { file_putf(log_file, "Frequency of item %d: %d\n", i, baseprobs[i]); } } /* * Rescale the abilities so that dependent / independent abilities are * comparable. We do this by rescaling the frequencies for item-dependent * abilities as though the entire set was made up of that item type. For * example, if one bow out of three has extra might, and there are 120 * artifacts in the full set, we rescale the frequency for extra might to * 40 (if we had 120 randart bows, about 40 would have extra might). * * This will allow us to compare the frequencies of all ability types, * no matter what the dependency. We assume that generic abilities (like * resist fear in the current version) don't need rescaling. This * introduces some inaccuracy in cases where specific instances of an * ability (like INT bonus on helms) have been counted separately - * ideally we should adjust for this in the general case. However, as * long as this doesn't occur too often, it shouldn't be a big issue. * * The following loops look complicated, but they are simply equivalent * to going through each of the relevant ability types one by one. */ /* Bow-only abilities */ for (i = 0; i < ART_IDX_BOW_COUNT; i++) { artprobs[art_idx_bow[i]] = (artprobs[art_idx_bow[i]] * art_total) / art_bow_total; } /* All weapon abilities */ for (i = 0; i < ART_IDX_WEAPON_COUNT; i++) { artprobs[art_idx_weapon[i]] = (artprobs[art_idx_weapon[i]] * art_total) / (art_bow_total + art_melee_total); } /* Corresponding non-weapon abilities */ temp = art_total - art_melee_total - art_bow_total; for (i = 0; i < ART_IDX_NONWEAPON_COUNT; i++) { artprobs[art_idx_nonweapon[i]] = (artprobs[art_idx_nonweapon[i]] * art_total) / temp; } /* All melee weapon abilities */ for (i = 0; i < ART_IDX_MELEE_COUNT; i++) { artprobs[art_idx_melee[i]] = (artprobs[art_idx_melee[i]] * art_total) / art_melee_total; } /* All general armor abilities */ temp = art_armor_total + art_boot_total + art_shield_total + art_headgear_total + art_cloak_total + art_glove_total; for (i = 0; i < ART_IDX_ALLARMOR_COUNT; i++) { artprobs[art_idx_allarmor[i]] = (artprobs[art_idx_allarmor[i]] * art_total) / temp; } /* Boots */ for (i = 0; i < ART_IDX_BOOT_COUNT; i++) { artprobs[art_idx_boot[i]] = (artprobs[art_idx_boot[i]] * art_total) / art_boot_total; } /* Gloves */ for (i = 0; i < ART_IDX_GLOVE_COUNT; i++) { artprobs[art_idx_glove[i]] = (artprobs[art_idx_glove[i]] * art_total) / art_glove_total; } /* Headgear */ for (i = 0; i < ART_IDX_HELM_COUNT; i++) { artprobs[art_idx_headgear[i]] = (artprobs[art_idx_headgear[i]] * art_total) / art_headgear_total; } /* Shields */ for (i = 0; i < ART_IDX_SHIELD_COUNT; i++) { artprobs[art_idx_shield[i]] = (artprobs[art_idx_shield[i]] * art_total) / art_shield_total; } /* Cloaks */ for (i = 0; i < ART_IDX_CLOAK_COUNT; i++) { artprobs[art_idx_cloak[i]] = (artprobs[art_idx_cloak[i]] * art_total) / art_cloak_total; } /* Body armor */ for (i = 0; i < ART_IDX_ARMOR_COUNT; i++) { artprobs[art_idx_armor[i]] = (artprobs[art_idx_armor[i]] * art_total) / art_armor_total; } /* * All others are general case and don't need to be rescaled, * unless the algorithm is getting too clever about separating * out individual cases (in which case some logic should be * added for them in the following method call). */ /* Perform any additional rescaling and adjustment, if required. */ adjust_freqs(); /* Log the final frequencies to check that everything's correct */ for(i = 0; i < ART_IDX_TOTAL; i++) { file_putf(log_file, "Rescaled frequency of ability %d: %d\n", i, artprobs[i]); } /* Build a cumulative frequency table for the base items */ for (i = 0; i < z_info->k_max; i++) { for (j = i; j < z_info->k_max; j++) { base_freq[j] += baseprobs[i]; } } /* Print out the frequency table, for verification */ for (i = 0; i < z_info->k_max; i++) { file_putf(log_file, "Cumulative frequency of item %d is: %d\n", i, base_freq[i]); } } /* * Adds a flag to an artifact. Returns true when canges were made. */ static bool add_flag(artifact_type *a_ptr, int flag) { if (of_has(a_ptr->flags, flag)) return FALSE; of_on(a_ptr->flags, flag); file_putf(log_file, "Adding ability: %s\n", flag_name(flag)); return TRUE; } /* * Adds a flag and pval to an artifact. Always attempts * to increase the pval. */ static void add_pval_flag(artifact_type *a_ptr, int flag) { of_on(a_ptr->flags, flag); of_on(a_ptr->pval_flags[DEFAULT_PVAL], flag); do_pval(a_ptr); file_putf(log_file, "Adding ability: %s (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); } /* * Adds a flag and a pval to an artifact, but won't increase * the pval if the flag is present. Returns true when changes were made. */ static bool add_fixed_pval_flag(artifact_type *a_ptr, int flag) { if (of_has(a_ptr->flags, flag)) return FALSE; of_on(a_ptr->flags, flag); of_on(a_ptr->pval_flags[DEFAULT_PVAL], flag); do_pval(a_ptr); file_putf(log_file, "Adding ability: %s (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); return TRUE; } /* * Adds a flag and an initial pval to an artifact. Returns true * when the flag was not present. */ static bool add_first_pval_flag(artifact_type *a_ptr, int flag) { of_on(a_ptr->flags, flag); of_on(a_ptr->pval_flags[DEFAULT_PVAL], flag); if (a_ptr->pval[DEFAULT_PVAL] == 0) { a_ptr->pval[DEFAULT_PVAL] = (s16b)randint1(4); file_putf(log_file, "Adding ability: %s (first time) (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); return TRUE; } do_pval(a_ptr); file_putf(log_file, "Adding ability: %s (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); return FALSE; } /* Count pvals and set num_pvals accordingly*/ static void recalc_num_pvals(artifact_type *a_ptr) { int i; a_ptr->num_pvals = 0; for (i = 0; i < MAX_PVALS; i++) if (a_ptr->pval[i] != 0) a_ptr->num_pvals++; file_putf(log_file, "a_ptr->num_pvals is now %d.\n", a_ptr->num_pvals); } static void add_stat(artifact_type *a_ptr) { int r; bool success = FALSE; /* Hack: break out if all stats are raised to avoid an infinite loop */ if (flags_test_all(a_ptr->flags, OF_SIZE, OF_STR, OF_INT, OF_WIS, OF_DEX, OF_CON, OF_CHR, FLAG_END)) return; /* Make sure we add one that hasn't been added yet */ while (!success) { r = randint0(6); if (r == 0) success = add_fixed_pval_flag(a_ptr, OF_STR); else if (r == 1) success = add_fixed_pval_flag(a_ptr, OF_INT); else if (r == 2) success = add_fixed_pval_flag(a_ptr, OF_WIS); else if (r == 3) success = add_fixed_pval_flag(a_ptr, OF_DEX); else if (r == 4) success = add_fixed_pval_flag(a_ptr, OF_CON); else if (r == 5) success = add_fixed_pval_flag(a_ptr, OF_CHR); } } static void add_sustain(artifact_type *a_ptr) { int r; bool success = FALSE; /* Hack: break out if all stats are sustained to avoid an infinite loop */ if (flags_test_all(a_ptr->flags, OF_SIZE, OF_SUST_STR, OF_SUST_INT, OF_SUST_WIS, OF_SUST_DEX, OF_SUST_CON, OF_SUST_CHR, FLAG_END)) return; while (!success) { r = randint0(6); if (r == 0) success = add_flag(a_ptr, OF_SUST_STR); else if (r == 1) success = add_flag(a_ptr, OF_SUST_INT); else if (r == 2) success = add_flag(a_ptr, OF_SUST_WIS); else if (r == 3) success = add_flag(a_ptr, OF_SUST_DEX); else if (r == 4) success = add_flag(a_ptr, OF_SUST_CON); else if (r == 5) success = add_flag(a_ptr, OF_SUST_CHR); } } static void add_low_resist(artifact_type *a_ptr) { int r; bool success = FALSE; /* Hack - if all low resists added already, exit to avoid infinite loop */ if(flags_test_all(a_ptr->flags, OF_SIZE, OF_RES_ACID, OF_RES_ELEC, OF_RES_FIRE, OF_RES_COLD, FLAG_END)) return; while (!success) { r = randint0(4); if (r == 0) success = add_flag(a_ptr, OF_RES_ACID); else if (r == 1) success = add_flag(a_ptr, OF_RES_ELEC); else if (r == 2) success = add_flag(a_ptr, OF_RES_FIRE); else if (r == 3) success = add_flag(a_ptr, OF_RES_COLD); } } static void add_high_resist(artifact_type *a_ptr) { /* Add a high resist, according to the generated frequency distribution. */ int r, i, temp; int count = 0; bool success = FALSE; temp = 0; for (i = 0; i < ART_IDX_HIGH_RESIST_COUNT; i++) { temp += artprobs[art_idx_high_resist[i]]; } /* The following will fail (cleanly) if all high resists already added */ while ( (!success) && (count < MAX_TRIES) ) { /* Randomize from 1 to this total amount */ r = randint1(temp); /* Determine which (weighted) resist this number corresponds to */ temp = artprobs[art_idx_high_resist[0]]; i = 0; while (r > temp && i < ART_IDX_HIGH_RESIST_COUNT) { temp += artprobs[art_idx_high_resist[i]]; i++; } /* Now i should give us the index of the correct high resist */ if (i == 0) success = add_flag(a_ptr, OF_RES_POIS); else if (i == 1) success = add_flag(a_ptr, OF_RES_FEAR); else if (i == 2) success = add_flag(a_ptr, OF_RES_LIGHT); else if (i == 3) success = add_flag(a_ptr, OF_RES_DARK); else if (i == 4) success = add_flag(a_ptr, OF_RES_BLIND); else if (i == 5) success = add_flag(a_ptr, OF_RES_CONFU); else if (i == 6) success = add_flag(a_ptr, OF_RES_SOUND); else if (i == 7) success = add_flag(a_ptr, OF_RES_SHARD); else if (i == 8) success = add_flag(a_ptr, OF_RES_NEXUS); else if (i == 9) success = add_flag(a_ptr, OF_RES_NETHR); else if (i == 10) success = add_flag(a_ptr, OF_RES_CHAOS); else if (i == 11) success = add_flag(a_ptr, OF_RES_DISEN); else if (i == 12) success = add_flag(a_ptr, OF_RES_STUN); count++; } } static void add_slay(artifact_type *a_ptr, bool brand) { int count = 0; const struct slay *s_ptr; bitflag mask[OF_SIZE]; if (brand) create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); else create_mask(mask, FALSE, OFT_SLAY, OFT_KILL, OFT_MAX); for(count = 0; count < MAX_TRIES; count++) { s_ptr = random_slay(mask); if (!of_has(a_ptr->flags, s_ptr->object_flag)) { of_on(a_ptr->flags, s_ptr->object_flag); file_putf(log_file, "Adding %s: %s\n", s_ptr->brand ? "brand" : "slay", s_ptr->brand ? s_ptr->brand : s_ptr->desc); return; } } } static void add_damage_dice(artifact_type *a_ptr) { /* CR 2001-09-02: changed this to increments 1 or 2 only */ a_ptr->dd += (byte)randint1(2); /* if (a_ptr->dd > 9) a_ptr->dd = 9; */ file_putf(log_file, "Adding ability: extra damage dice (now %d dice)\n", a_ptr->dd); } static void add_to_hit(artifact_type *a_ptr, int fixed, int random) { /* Inhibit above certain threshholds */ if (a_ptr->to_h > VERYHIGH_TO_HIT) { if (!INHIBIT_STRONG) { file_putf(log_file, "Failed to add to-hit, value of %d is too high\n", a_ptr->to_h); return; } } else if (a_ptr->to_h > HIGH_TO_HIT) { if (!INHIBIT_WEAK) { file_putf(log_file, "Failed to add to-hit, value of %d is too high\n", a_ptr->to_h); return; } } a_ptr->to_h += (s16b)(fixed + randint0(random)); if (a_ptr->to_h > 0) of_on(a_ptr->flags, OF_SHOW_MODS); file_putf(log_file, "Adding ability: extra to_h (now %+d)\n", a_ptr->to_h); } static void add_to_dam(artifact_type *a_ptr, int fixed, int random) { /* Inhibit above certain threshholds */ if (a_ptr->to_d > VERYHIGH_TO_DAM) { if (!INHIBIT_STRONG) { file_putf(log_file, "Failed to add to-dam, value of %d is too high\n", a_ptr->to_d); return; } } else if (a_ptr->to_h > HIGH_TO_DAM) { if (!INHIBIT_WEAK) { file_putf(log_file, "Failed to add to-dam, value of %d is too high\n", a_ptr->to_d); return; } } a_ptr->to_d += (s16b)(fixed + randint0(random)); if (a_ptr->to_d > 0) of_on(a_ptr->flags, OF_SHOW_MODS); file_putf(log_file, "Adding ability: extra to_dam (now %+d)\n", a_ptr->to_d); } static void add_to_AC(artifact_type *a_ptr, int fixed, int random) { /* Inhibit above certain threshholds */ if (a_ptr->to_a > VERYHIGH_TO_AC) { if (!INHIBIT_STRONG) { file_putf(log_file, "Failed to add to-AC, value of %d is too high\n", a_ptr->to_a); return; } } else if (a_ptr->to_h > HIGH_TO_AC) { if (!INHIBIT_WEAK) { file_putf(log_file, "Failed to add to-AC, value of %d is too high\n", a_ptr->to_a); return; } } a_ptr->to_a += (s16b)(fixed + randint0(random)); file_putf(log_file, "Adding ability: AC bonus (new bonus is %+d)\n", a_ptr->to_a); } static void add_weight_mod(artifact_type *a_ptr) { a_ptr->weight = (a_ptr->weight * 9) / 10; file_putf(log_file, "Adding ability: lower weight (new weight is %d)\n", a_ptr->weight); } /* * Add a random immunity to this artifact * ASSUMPTION: All immunities are equally likely. * ToDo: replace with lookup once immunities are abstracted */ static void add_immunity(artifact_type *a_ptr) { int imm_type = randint0(4); switch(imm_type) { case 0: { of_on(a_ptr->flags, OF_IM_ACID); file_putf(log_file, "Adding ability: immunity to acid\n"); break; } case 1: { of_on(a_ptr->flags, OF_IM_ELEC); file_putf(log_file, "Adding ability: immunity to lightning\n"); break; } case 2: { of_on(a_ptr->flags, OF_IM_FIRE); file_putf(log_file, "Adding ability: immunity to fire\n"); break; } case 3: { of_on(a_ptr->flags, OF_IM_COLD); file_putf(log_file, "Adding ability: immunity to cold\n"); break; } } } /* Add an activation (called only if artifact does not yet have one) */ static void add_activation(artifact_type *a_ptr, s32b target_power) { int i, x, p, max_effect = 0; int count = 0; /* Work out the maximum allowed effect power */ for (i = 0; i < EF_MAX; i++) { if (effect_power(i) > max_effect && effect_power(i) < INHIBIT_POWER) max_effect = effect_power(i); } /* Select an effect at random */ while (count < MAX_TRIES) { x = randint0(EF_MAX); p = effect_power(x); /* * Check that activation is useful but not exploitable, * and roughly proportionate to the overall power */ if (p < INHIBIT_POWER && 100 * p / max_effect > 50 * target_power / max_power && 100 * p / max_effect < 200 * target_power / max_power) { file_putf(log_file, "Adding activation effect %d\n", x); a_ptr->effect = x; a_ptr->time.base = (p * 8); a_ptr->time.dice = (p > 5 ? p / 5 : 1); a_ptr->time.sides = p; return; } count++; } } /* * Build a suitable frequency table for this item, based on the generated * frequencies. The frequencies for any abilities that don't apply for * this item type will be set to zero. First parameter is the artifact * for which to generate the frequency table. * * The second input parameter is a pointer to an array that the function * will use to store the frequency table. The array must have size * ART_IDX_TOTAL. * * The resulting frequency table is cumulative for ease of use in the * weighted randomization algorithm. */ static void build_freq_table(artifact_type *a_ptr, s16b *freq) { int i,j; s16b f_temp[ART_IDX_TOTAL]; /* First, set everything to zero */ for (i = 0; i < ART_IDX_TOTAL; i++) { f_temp[i] = 0; freq[i] = 0; } /* Now copy over appropriate frequencies for applicable abilities */ /* Bow abilities */ if (a_ptr->tval == TV_BOW) { for (j = 0; j < ART_IDX_BOW_COUNT; j++) { f_temp[art_idx_bow[j]] = artprobs[art_idx_bow[j]]; } } /* General weapon abilities */ if (a_ptr->tval == TV_BOW || a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { for (j = 0; j < ART_IDX_WEAPON_COUNT; j++) { f_temp[art_idx_weapon[j]] = artprobs[art_idx_weapon[j]]; } } /* General non-weapon abilities */ else { for (j = 0; j < ART_IDX_NONWEAPON_COUNT; j++) { f_temp[art_idx_nonweapon[j]] = artprobs[art_idx_nonweapon[j]]; } } /* General melee abilities */ if (a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { for (j = 0; j < ART_IDX_MELEE_COUNT; j++) { f_temp[art_idx_melee[j]] = artprobs[art_idx_melee[j]]; } } /* General armor abilities */ if ( a_ptr->tval == TV_BOOTS || a_ptr->tval == TV_GLOVES || a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN || a_ptr->tval == TV_SHIELD || a_ptr->tval == TV_CLOAK || a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { for (j = 0; j < ART_IDX_ALLARMOR_COUNT; j++) { f_temp[art_idx_allarmor[j]] = artprobs[art_idx_allarmor[j]]; } } /* Boot abilities */ if (a_ptr->tval == TV_BOOTS) { for (j = 0; j < ART_IDX_BOOT_COUNT; j++) { f_temp[art_idx_boot[j]] = artprobs[art_idx_boot[j]]; } } /* Glove abilities */ if (a_ptr->tval == TV_GLOVES) { for (j = 0; j < ART_IDX_GLOVE_COUNT; j++) { f_temp[art_idx_glove[j]] = artprobs[art_idx_glove[j]]; } } /* Headgear abilities */ if (a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { for (j = 0; j < ART_IDX_HELM_COUNT; j++) { f_temp[art_idx_headgear[j]] = artprobs[art_idx_headgear[j]]; } } /* Shield abilities */ if (a_ptr->tval == TV_SHIELD) { for (j = 0; j < ART_IDX_SHIELD_COUNT; j++) { f_temp[art_idx_shield[j]] = artprobs[art_idx_shield[j]]; } } /* Cloak abilities */ if (a_ptr->tval == TV_CLOAK) { for (j = 0; j < ART_IDX_CLOAK_COUNT; j++) { f_temp[art_idx_cloak[j]] = artprobs[art_idx_cloak[j]]; } } /* Armor abilities */ if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { for (j = 0; j < ART_IDX_ARMOR_COUNT; j++) { f_temp[art_idx_armor[j]] = artprobs[art_idx_armor[j]]; } } /* General abilities - no constraint */ for (j = 0; j < ART_IDX_GEN_COUNT; j++) { f_temp[art_idx_gen[j]] = artprobs[art_idx_gen[j]]; } /* * Now we have the correct individual frequencies, we build a cumulative * frequency table for them. */ for (i = 0; i < ART_IDX_TOTAL; i++) { for (j = i; j < ART_IDX_TOTAL; j++) { freq[j] += f_temp[i]; } } /* Done - the freq array holds the desired frequencies. */ /* Print out the frequency table, for verification */ for (i = 0; i < ART_IDX_TOTAL; i++) file_putf(log_file, "Cumulative frequency of ability %d is: %d\n", i, freq[i]); } /* * Choose a random ability using weights based on the given cumulative * frequency table. A pointer to the frequency array (which must be of size * ART_IDX_TOTAL) is passed as a parameter. The function returns a number * representing the index of the ability chosen. */ static int choose_ability (s16b *freq_table) { int r, ability; /* Generate a random number between 1 and the last value in the table */ r = randint1(freq_table[ART_IDX_TOTAL-1]); /* Find the entry in the table that this number represents. */ ability = 0; while (r > freq_table[ability]) ability++; file_putf(log_file, "Ability chosen was number: %d\n", ability); /* * The ability variable is now the index of the first value in the table * greater than or equal to r, which is what we want. */ return ability; } /* * Add an ability given by the index r. This is mostly just a long case * statement. * * Note that this method is totally general and imposes no restrictions on * appropriate item type for a given ability. This is assumed to have * been done already. */ static void add_ability_aux(artifact_type *a_ptr, int r, s32b target_power) { switch(r) { case ART_IDX_BOW_SHOTS: case ART_IDX_NONWEAPON_SHOTS: add_pval_flag(a_ptr, OF_SHOTS); break; case ART_IDX_BOW_MIGHT: add_pval_flag(a_ptr, OF_MIGHT); break; case ART_IDX_WEAPON_HIT: case ART_IDX_NONWEAPON_HIT: add_to_hit(a_ptr, 1, 2 * mean_hit_increment); break; case ART_IDX_WEAPON_DAM: case ART_IDX_NONWEAPON_DAM: add_to_dam(a_ptr, 1, 2 * mean_dam_increment); break; case ART_IDX_NONWEAPON_HIT_DAM: add_to_hit(a_ptr, 1, 2 * mean_hit_increment); add_to_dam(a_ptr, 1, 2 * mean_dam_increment); break; case ART_IDX_WEAPON_AGGR: case ART_IDX_NONWEAPON_AGGR: if (target_power > AGGR_POWER) { add_flag(a_ptr, OF_AGGRAVATE); } break; case ART_IDX_MELEE_BLESS: add_flag(a_ptr, OF_BLESSED); break; case ART_IDX_BOW_BRAND: case ART_IDX_MELEE_BRAND: case ART_IDX_NONWEAPON_BRAND: add_slay(a_ptr, TRUE); break; case ART_IDX_BOW_SLAY: case ART_IDX_MELEE_SLAY: case ART_IDX_NONWEAPON_SLAY: add_slay(a_ptr, FALSE); break; case ART_IDX_MELEE_SINV: case ART_IDX_HELM_SINV: case ART_IDX_GEN_SINV: add_flag(a_ptr, OF_SEE_INVIS); break; case ART_IDX_MELEE_BLOWS: case ART_IDX_NONWEAPON_BLOWS: add_pval_flag(a_ptr, OF_BLOWS); break; case ART_IDX_MELEE_AC: case ART_IDX_BOOT_AC: case ART_IDX_GLOVE_AC: case ART_IDX_HELM_AC: case ART_IDX_SHIELD_AC: case ART_IDX_CLOAK_AC: case ART_IDX_ARMOR_AC: case ART_IDX_GEN_AC: add_to_AC(a_ptr, 1, 2 * mean_ac_increment); break; case ART_IDX_MELEE_DICE: add_damage_dice(a_ptr); break; case ART_IDX_MELEE_WEIGHT: case ART_IDX_ALLARMOR_WEIGHT: add_weight_mod(a_ptr); break; case ART_IDX_MELEE_TUNN: case ART_IDX_GEN_TUNN: add_pval_flag(a_ptr, OF_TUNNEL); break; case ART_IDX_BOOT_FEATHER: case ART_IDX_GEN_FEATHER: add_flag(a_ptr, OF_FEATHER); break; case ART_IDX_BOOT_STEALTH: case ART_IDX_CLOAK_STEALTH: case ART_IDX_ARMOR_STEALTH: case ART_IDX_GEN_STEALTH: add_pval_flag(a_ptr, OF_STEALTH); break; case ART_IDX_BOOT_SPEED: case ART_IDX_GEN_SPEED: add_first_pval_flag(a_ptr, OF_SPEED); break; case ART_IDX_GLOVE_FA: case ART_IDX_GEN_FA: add_flag(a_ptr, OF_FREE_ACT); break; case ART_IDX_GLOVE_DEX: add_fixed_pval_flag(a_ptr, OF_DEX); break; case ART_IDX_HELM_RBLIND: case ART_IDX_GEN_RBLIND: add_flag(a_ptr, OF_RES_BLIND); break; case ART_IDX_HELM_ESP: case ART_IDX_GEN_ESP: add_flag(a_ptr, OF_TELEPATHY); break; case ART_IDX_HELM_WIS: add_fixed_pval_flag(a_ptr, OF_WIS); break; case ART_IDX_HELM_INT: add_fixed_pval_flag(a_ptr, OF_INT); break; case ART_IDX_SHIELD_LRES: case ART_IDX_ARMOR_LRES: case ART_IDX_GEN_LRES: add_low_resist(a_ptr); break; case ART_IDX_ARMOR_HLIFE: case ART_IDX_GEN_HLIFE: add_flag(a_ptr, OF_HOLD_LIFE); break; case ART_IDX_ARMOR_CON: add_fixed_pval_flag(a_ptr, OF_CON); break; case ART_IDX_ARMOR_ALLRES: add_flag(a_ptr, OF_RES_ACID); add_flag(a_ptr, OF_RES_ELEC); add_flag(a_ptr, OF_RES_FIRE); add_flag(a_ptr, OF_RES_COLD); break; case ART_IDX_ARMOR_HRES: add_high_resist(a_ptr); break; case ART_IDX_GEN_STAT: add_stat(a_ptr); break; case ART_IDX_GEN_SUST: add_sustain(a_ptr); break; case ART_IDX_GEN_SEARCH: add_pval_flag(a_ptr, OF_SEARCH); break; case ART_IDX_GEN_INFRA: add_pval_flag(a_ptr, OF_INFRA); break; case ART_IDX_GEN_IMMUNE: add_immunity(a_ptr); break; case ART_IDX_GEN_LIGHT: add_flag(a_ptr, OF_LIGHT); break; case ART_IDX_GEN_SDIG: add_flag(a_ptr, OF_SLOW_DIGEST); break; case ART_IDX_GEN_REGEN: add_flag(a_ptr, OF_REGEN); break; case ART_IDX_GEN_RPOIS: add_flag(a_ptr, OF_RES_POIS); break; case ART_IDX_GEN_RFEAR: add_flag(a_ptr, OF_RES_FEAR); break; case ART_IDX_GEN_RLIGHT: add_flag(a_ptr, OF_RES_LIGHT); break; case ART_IDX_GEN_RDARK: add_flag(a_ptr, OF_RES_DARK); break; case ART_IDX_GEN_RCONF: add_flag(a_ptr, OF_RES_CONFU); break; case ART_IDX_GEN_RSOUND: add_flag(a_ptr, OF_RES_SOUND); break; case ART_IDX_GEN_RSHARD: add_flag(a_ptr, OF_RES_SHARD); break; case ART_IDX_GEN_RNEXUS: add_flag(a_ptr, OF_RES_NEXUS); break; case ART_IDX_GEN_RNETHER: add_flag(a_ptr, OF_RES_NETHR); break; case ART_IDX_GEN_RCHAOS: add_flag(a_ptr, OF_RES_CHAOS); break; case ART_IDX_GEN_RDISEN: add_flag(a_ptr, OF_RES_DISEN); break; case ART_IDX_GEN_ACTIV: if (!a_ptr->effect) add_activation(a_ptr, target_power); break; } recalc_num_pvals(a_ptr); } /* * Randomly select an extra ability to be added to the artifact in question. */ static void add_ability(artifact_type *a_ptr, s32b target_power) { int r; /* Choose a random ability using the frequency table previously defined*/ r = choose_ability(art_freq); /* Add the appropriate ability */ add_ability_aux(a_ptr, r, target_power); /* Now remove contradictory or redundant powers. */ remove_contradictory(a_ptr); /* Adding WIS to sharp weapons always blesses them */ if (of_has(a_ptr->flags, OF_WIS) && (a_ptr->tval == TV_SWORD || a_ptr->tval == TV_POLEARM)) { add_flag(a_ptr, OF_BLESSED); } } /* * Try to supercharge this item by running through the list of the supercharge * abilities and attempting to add each in turn. An artifact only gets one * chance at each of these up front (if applicable). */ static void try_supercharge(artifact_type *a_ptr, s32b target_power) { /* Huge damage dice or max blows - melee weapon only */ if (a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { if (randint0(z_info->a_max) < artprobs[ART_IDX_MELEE_DICE_SUPER]) { a_ptr->dd += 3 + randint0(4); /* if (a_ptr->dd > 9) a_ptr->dd = 9; */ file_putf(log_file, "Supercharging damage dice! (Now %d dice)\n", a_ptr->dd); } else if (randint0(z_info->a_max) < artprobs[ART_IDX_MELEE_BLOWS_SUPER]) { of_on(a_ptr->flags, OF_BLOWS); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_BLOWS); a_ptr->pval[DEFAULT_PVAL] = INHIBIT_BLOWS - 1; file_putf(log_file, "Supercharging melee blows! (+2 blows)\n"); } } /* Bows - max might or shots */ if (a_ptr->tval == TV_BOW) { if (randint0(z_info->a_max) < artprobs[ART_IDX_BOW_SHOTS_SUPER]) { of_on(a_ptr->flags, OF_SHOTS); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_SHOTS); a_ptr->pval[DEFAULT_PVAL] = INHIBIT_SHOTS - 1; file_putf(log_file, "Supercharging shots for bow! (2 extra shots)\n"); } else if (randint0(z_info->a_max) < artprobs[ART_IDX_BOW_MIGHT_SUPER]) { of_on(a_ptr->flags, OF_MIGHT); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_MIGHT); a_ptr->pval[DEFAULT_PVAL] = INHIBIT_MIGHT - 1; file_putf(log_file, "Supercharging might for bow! (3 extra might)\n"); } } /* Big speed bonus - any item (potentially) but more likely on boots */ if (randint0(z_info->a_max) < artprobs[ART_IDX_GEN_SPEED_SUPER] || (a_ptr->tval == TV_BOOTS && randint0(z_info->a_max) < artprobs[ART_IDX_BOOT_SPEED])) { of_on(a_ptr->flags, OF_SPEED); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_SPEED); a_ptr->pval[DEFAULT_PVAL] = 5 + randint0(6); if (INHIBIT_WEAK) a_ptr->pval[DEFAULT_PVAL] += randint1(3); if (INHIBIT_STRONG) a_ptr->pval[DEFAULT_PVAL] += 1 + randint1(6); file_putf(log_file, "Supercharging speed for this item! (New speed bonus is %d)\n", a_ptr->pval[DEFAULT_PVAL]); } /* Big AC bonus */ if (randint0(z_info->a_max) < artprobs[ART_IDX_GEN_AC_SUPER]) { a_ptr->to_a += 19 + randint1(11); if (INHIBIT_WEAK) a_ptr->to_a += randint1(10); if (INHIBIT_STRONG) a_ptr->to_a += randint1(20); file_putf(log_file, "Supercharging AC! New AC bonus is %d\n", a_ptr->to_a); } /* Aggravation */ if (a_ptr->tval == TV_BOW || a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { if ((randint0(z_info->a_max) < artprobs[ART_IDX_WEAPON_AGGR]) && (target_power > AGGR_POWER)) { of_on(a_ptr->flags, OF_AGGRAVATE); file_putf(log_file, "Adding aggravation\n"); } } else { if ((randint0(z_info->a_max) < artprobs[ART_IDX_NONWEAPON_AGGR]) && (target_power > AGGR_POWER)) { of_on(a_ptr->flags, OF_AGGRAVATE); file_putf(log_file, "Adding aggravation\n"); } } recalc_num_pvals(a_ptr); } /* * Make it bad, or if it's already bad, make it worse! */ static void do_curse(artifact_type *a_ptr) { if (one_in_(7)) of_on(a_ptr->flags, OF_AGGRAVATE); if (one_in_(4)) of_on(a_ptr->flags, OF_DRAIN_EXP); if (one_in_(7)) of_on(a_ptr->flags, OF_TELEPORT); if ((a_ptr->pval[DEFAULT_PVAL] > 0) && one_in_(2)) a_ptr->pval[DEFAULT_PVAL] = -a_ptr->pval[DEFAULT_PVAL]; if ((a_ptr->to_a > 0) && one_in_(2)) a_ptr->to_a = -a_ptr->to_a; if ((a_ptr->to_h > 0) && one_in_(2)) a_ptr->to_h = -a_ptr->to_h; if ((a_ptr->to_d > 0) && one_in_(4)) a_ptr->to_d = -a_ptr->to_d; if (of_has(a_ptr->flags, OF_LIGHT_CURSE)) { if (one_in_(2)) of_on(a_ptr->flags, OF_HEAVY_CURSE); return; } of_on(a_ptr->flags, OF_LIGHT_CURSE); if (one_in_(4)) of_on(a_ptr->flags, OF_HEAVY_CURSE); } /* * Note the three special cases (One Ring, Grond, Morgoth). */ static void scramble_artifact(int a_idx) { artifact_type *a_ptr = &a_info[a_idx]; artifact_type a_old; object_kind *k_ptr; s32b power; int tries = 0; byte alloc_old, base_alloc_old, alloc_new; s32b ap = 0; bool curse_me = FALSE; bool success = FALSE; int i; bitflag f[OF_SIZE]; /* Special cases -- don't randomize these! */ if ((a_idx == ART_POWER) || (a_idx == ART_GROND) || (a_idx == ART_MORGOTH)) return; /* Skip unused artifacts, too! */ if (a_ptr->tval == 0) return; /* Evaluate the original artifact to determine the power level. */ power = base_power[a_idx]; /* If it has a restricted ability then don't randomize it. */ if (power > INHIBIT_POWER) { file_putf(log_file, "Skipping artifact number %d - too powerful to randomize!", a_idx); return; } if (power < 0) curse_me = TRUE; file_putf(log_file, "+++++++++++++++++ CREATING NEW ARTIFACT ++++++++++++++++++\n"); file_putf(log_file, "Artifact %d: power = %d\n", a_idx, power); /* * Flip the sign on power if it's negative, since it's only used for base * item choice */ if (power < 0) power = -power; if (a_idx >= ART_MIN_NORMAL) { /* * Normal artifact - choose a random base item type. Not too * powerful, so we'll have to add something to it. Not too * weak, for the opposite reason. * * CR 7/15/2001 - lowered the upper limit so that we get at * least a few powers (from 8/10 to 6/10) but permit anything * more than 20 below the target power */ int count = 0; s32b ap2; /* Capture the rarity of the original base item and artifact */ alloc_old = base_art_alloc[a_idx]; base_alloc_old = base_item_prob[a_idx]; do { /* Get the new item kind */ k_ptr = choose_item(a_idx); /* * Hack: if power is positive but very low, and if we're not having * any luck finding a base item, curse it once. This helps ensure * that we get a base item for borderline cases like Wormtongue. */ if (power > 0 && power < 10 && count > MAX_TRIES / 2) { file_putf(log_file, "Cursing base item to help get a match.\n"); do_curse(a_ptr); } ap2 = artifact_power(a_idx); count++; /* * Calculate the proper rarity based on the new type. We attempt * to preserve the 'effective rarity' which is equal to the * artifact rarity multiplied by the base item rarity. */ alloc_new = alloc_old * base_alloc_old / k_ptr->alloc_prob; if (alloc_new > 99) alloc_new = 99; if (alloc_new < 1) alloc_new = 1; file_putf(log_file, "Old allocs are base %d, art %d\n", base_alloc_old, alloc_old); file_putf(log_file, "New allocs are base %d, art %d\n", k_ptr->alloc_prob, alloc_new); } while ( (count < MAX_TRIES) && (((ap2 > (power * 6) / 10 + 1) && (power-ap2 < 20)) || (ap2 < (power / 10))) ); /* Got an item - set the new rarity */ a_ptr->alloc_prob = alloc_new; if (count >= MAX_TRIES) file_putf(log_file, "Warning! Couldn't get appropriate power level on base item.\n"); } else { /* Special artifact (light source, ring, or amulet) */ /* Keep the item kind */ k_ptr = lookup_kind(a_ptr->tval, a_ptr->sval); /* Clear the following fields; leave the rest alone */ a_ptr->to_h = a_ptr->to_d = a_ptr->to_a = 0; a_ptr->num_pvals = 0; of_wipe(a_ptr->flags); for (i = 0; i < MAX_PVALS; i++) { a_ptr->pval[i] = 0; of_wipe(a_ptr->pval_flags[i]); } /* Clear the activations for rings and amulets but not lights */ if (a_ptr->tval != TV_LIGHT) a_ptr->effect = 0; /* Artifacts ignore everything */ create_mask(f, FALSE, OFT_IGNORE, OFT_MAX); of_union(a_ptr->flags, f); file_putf(log_file, "Alloc prob is %d\n", a_ptr->alloc_prob); } /* Got a base item. */ /* Generate the cumulative frequency table for this item type */ build_freq_table(a_ptr, art_freq); /* Copy artifact info temporarily. */ a_old = *a_ptr; /* Give this artifact a shot at being supercharged */ try_supercharge(a_ptr, power); ap = artifact_power(a_idx); if (ap > (power * 23) / 20 + 1) { /* too powerful -- put it back */ *a_ptr = a_old; file_putf(log_file, "--- Supercharge is too powerful! Rolling back.\n"); } /* First draft: add two abilities, then curse it three times. */ if (curse_me) { /* Copy artifact info temporarily. */ a_old = *a_ptr; do { add_ability(a_ptr, power); add_ability(a_ptr, power); do_curse(a_ptr); do_curse(a_ptr); do_curse(a_ptr); remove_contradictory(a_ptr); ap = artifact_power(a_idx); /* Accept if it doesn't have any inhibited abilities */ if (ap < INHIBIT_POWER) success = TRUE; /* Otherwise go back and try again */ else { file_putf(log_file, "Inhibited ability added - rolling back.\n"); *a_ptr = a_old; } } while (!success); /* Cursed items never have any resale value */ a_ptr->cost = 0; } else { /* * Select a random set of abilities which roughly matches the * original's in terms of overall power/usefulness. */ for (tries = 0; tries < MAX_TRIES; tries++) { /* Copy artifact info temporarily. */ a_old = *a_ptr; add_ability(a_ptr, power); ap = artifact_power(a_idx); /* CR 11/14/01 - pushed both limits up by about 5% */ if (ap > (power * 23) / 20 + 1) { /* too powerful -- put it back */ *a_ptr = a_old; file_putf(log_file, "--- Too powerful! Rolling back.\n"); continue; } else if (ap >= (power * 19) / 20) /* just right */ { /* CC 11/02/09 - add rescue for crappy weapons */ if ((a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD || a_ptr->tval == TV_BOW) && (a_ptr->to_d < 10)) { a_ptr->to_d += randint0(10); file_putf(log_file, "Redeeming crappy weapon: +dam now %d\n", a_ptr->to_d); } break; } /* Stop if we're going negative, so we don't overload the artifact with great powers to compensate. */ /* Removed CR 11/10/01 */ /* else if ((ap < 0) && (ap < (-(power * 1)) / 10)) { break; } */ } /* end of power selection */ if (verbose && tries >= MAX_TRIES) /* * We couldn't generate an artifact within the number of permitted * iterations. Show a warning message. */ file_putf(log_file, "Warning! Couldn't get appropriate power level on artifact.\n"); } /* Set depth and rarity info according to power */ /* This is currently very tricky for special artifacts */ file_putf(log_file, "Old depths are min %d, max %d\n", a_ptr->alloc_min, a_ptr->alloc_max); file_putf(log_file, "Alloc prob is %d\n", a_ptr->alloc_prob); /* flip cursed items to avoid overflows */ if (ap < 0) ap = -ap; if (a_idx < ART_MIN_NORMAL) { a_ptr->alloc_max = 127; if (ap > avg_power) { a_ptr->alloc_prob = 1; a_ptr->alloc_min = MAX(50, ((ap + 150) * 100 / max_power)); } else if (ap > 30) { a_ptr->alloc_prob = MAX(2, (avg_power - ap) / 20); a_ptr->alloc_min = MAX(25, ((ap + 200) * 100 / max_power)); } else /* Just the Phial */ { a_ptr->alloc_prob = 50 - ap; a_ptr->alloc_min = 5; } } else { file_putf(log_file, "k_ptr->alloc_prob is %d\n", k_ptr->alloc_prob); a_ptr->alloc_max = MIN(127, (ap * 4) / 5); a_ptr->alloc_min = MIN(100, ((ap + 100) * 100 / max_power)); /* Leave alloc_prob consistent with base art total rarity */ } /* sanity check */ if (a_ptr->alloc_prob > 99) a_ptr->alloc_prob = 99; if (a_ptr->alloc_prob < 1) a_ptr->alloc_prob = 1; file_putf(log_file, "New depths are min %d, max %d\n", a_ptr->alloc_min, a_ptr->alloc_max); file_putf(log_file, "Power-based alloc_prob is %d\n", a_ptr->alloc_prob); /* Restore some flags */ if (a_ptr->tval == TV_LIGHT) of_on(a_ptr->flags, OF_NO_FUEL); if (a_idx < ART_MIN_NORMAL) of_on(a_ptr->flags, OF_INSTA_ART); /* * Add OF_HIDE_TYPE to all artifacts with nonzero pval because we're * too lazy to find out which ones need it and which ones don't. */ if (a_ptr->pval[DEFAULT_PVAL]) of_on(a_ptr->flags, OF_HIDE_TYPE); /* Success */ file_putf(log_file, ">>>>>>>>>>>>>>>>>>>>>>>>>> ARTIFACT COMPLETED <<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); file_putf(log_file, "Number of tries for artifact %d was: %d\n", a_idx, tries); } /* * Return TRUE if the whole set of random artifacts meets certain * criteria. Return FALSE if we fail to meet those criteria (which will * restart the whole process). */ static bool artifacts_acceptable(void) { int swords = 5, polearms = 5, blunts = 5, bows = 4; int bodies = 5, shields = 4, cloaks = 4, hats = 4; int gloves = 4, boots = 4; int i; for (i = ART_MIN_NORMAL; i < z_info->a_max; i++) { switch (a_info[i].tval) { case TV_SWORD: swords--; break; case TV_POLEARM: polearms--; break; case TV_HAFTED: blunts--; break; case TV_BOW: bows--; break; case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: bodies--; break; case TV_SHIELD: shields--; break; case TV_CLOAK: cloaks--; break; case TV_HELM: case TV_CROWN: hats--; break; case TV_GLOVES: gloves--; break; case TV_BOOTS: boots--; break; } } file_putf(log_file, "Deficit amount for swords is %d\n", swords); file_putf(log_file, "Deficit amount for polearms is %d\n", polearms); file_putf(log_file, "Deficit amount for blunts is %d\n", blunts); file_putf(log_file, "Deficit amount for bows is %d\n", bows); file_putf(log_file, "Deficit amount for bodies is %d\n", bodies); file_putf(log_file, "Deficit amount for shields is %d\n", shields); file_putf(log_file, "Deficit amount for cloaks is %d\n", cloaks); file_putf(log_file, "Deficit amount for hats is %d\n", hats); file_putf(log_file, "Deficit amount for gloves is %d\n", gloves); file_putf(log_file, "Deficit amount for boots is %d\n", boots); if (swords > 0 || polearms > 0 || blunts > 0 || bows > 0 || bodies > 0 || shields > 0 || cloaks > 0 || hats > 0 || gloves > 0 || boots > 0) { if (verbose) { char types[256]; strnfmt(types, sizeof(types), "%s%s%s%s%s%s%s%s%s%s", swords > 0 ? " swords" : "", polearms > 0 ? " polearms" : "", blunts > 0 ? " blunts" : "", bows > 0 ? " bows" : "", bodies > 0 ? " body-armors" : "", shields > 0 ? " shields" : "", cloaks > 0 ? " cloaks" : "", hats > 0 ? " hats" : "", gloves > 0 ? " gloves" : "", boots > 0 ? " boots" : ""); file_putf(log_file, "Restarting generation process: not enough%s", types); } return FALSE; } else { return TRUE; } } static errr scramble(void) { /* If our artifact set fails to meet certain criteria, we start over. */ do { int a_idx; /* Generate all the artifacts. */ for (a_idx = 1; a_idx < z_info->a_max; a_idx++) { scramble_artifact(a_idx); } } while (!artifacts_acceptable()); /* end of all artifacts */ /* Success */ return (0); } static errr do_randart_aux(bool full) { errr result; /* Generate random names */ if ((result = init_names()) != 0) return (result); if (full) { /* Randomize the artifacts */ if ((result = scramble()) != 0) return (result); } /* Success */ return (0); } /* * Randomize the artifacts * * The full flag toggles between just randomizing the names and * complete randomization of the artifacts. */ errr do_randart(u32b randart_seed, bool full) { errr err; /* Prepare to use the Angband "simple" RNG. */ Rand_value = randart_seed; Rand_quick = TRUE; /* Only do all the following if full randomization requested */ if (full) { /* Allocate the various "original powers" arrays */ base_power = C_ZNEW(z_info->a_max, s32b); base_item_level = C_ZNEW(z_info->a_max, byte); base_item_prob = C_ZNEW(z_info->a_max, byte); base_art_alloc = C_ZNEW(z_info->a_max, byte); baseprobs = C_ZNEW(z_info->k_max, s16b); base_freq = C_ZNEW(z_info->k_max, s16b); /* Open the log file for writing */ if (verbose) { char buf[1024]; path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "randart.log"); log_file = file_open(buf, MODE_WRITE, FTYPE_TEXT); if (!log_file) { msg("Error - can't open randart.log for writing."); exit(1); } } /* Store the original power ratings */ store_base_power(); /* Determine the generation probabilities */ parse_frequencies(); } /* Generate the random artifact (names) */ err = do_randart_aux(full); /* Only do all the following if full randomization requested */ if (full) { /* Just for fun, look at the frequencies on the finished items */ /* Remove this prior to release */ store_base_power(); parse_frequencies(); /* Close the log file */ if (verbose) { if (!file_close(log_file)) { msg("Error - can't close randart.log file."); exit(1); } } /* Free the "original powers" arrays */ FREE(base_power); FREE(base_item_level); FREE(base_item_prob); FREE(base_art_alloc); FREE(baseprobs); FREE(base_freq); } /* When done, resume use of the Angband "complex" RNG. */ Rand_quick = FALSE; return (err); } angband-v3.3.2/src/object/pval.h0000644000175000017500000000207211651552410015760 0ustar chriscchrisc/* * File: pval.h * Purpose: Structures and functions for dealing with object pvals * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_PVAL_H #define INCLUDED_PVAL_H #include "angband.h" /** Functions **/ bool object_add_pval(object_type *o_ptr, int pval, int flag); bool object_this_pval_is_visible(const object_type *o_ptr, int pval); int which_pval(const object_type *o_ptr, const int flag); void object_pval_flags(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]); void object_pval_flags_known(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]); #endif /* !INCLUDED_PVAL_H */ angband-v3.3.2/src/object/pval.c0000644000175000017500000001527211651552410015761 0ustar chriscchrisc/* * File: pval.c * Purpose: Functions for handling object pvals. * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/pval.h" #include "object/tvalsval.h" /** * Return the pval_flags for an item */ void object_pval_flags(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]) { int i; if (!o_ptr->kind) return; for (i = 0; i < MAX_PVALS; i++) { of_wipe(flags[i]); of_copy(flags[i], o_ptr->pval_flags[i]); } } /** * Return the pval which governs a particular flag. * We assume that we are only called if this pval and flag exist. **/ int which_pval(const object_type *o_ptr, const int flag) { int i; bitflag f[MAX_PVALS][OF_SIZE]; object_pval_flags(o_ptr, f); for (i = 0; i < MAX_PVALS; i++) { if (of_has(f[i], flag)) return i; } msg("flag is %d.", flag); msg("kidx is %d.", o_ptr->kind->kidx); pause_line(Term); assert(0); } /** * Obtain the pval_flags for an item which are known to the player */ void object_pval_flags_known(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]) { int i, flag; object_pval_flags(o_ptr, flags); for (i = 0; i < MAX_PVALS; i++) of_inter(flags[i], o_ptr->known_flags); /* Kind and ego pval_flags may have shifted pvals so we iterate */ if (object_flavor_is_aware(o_ptr)) for (i = 0; i < MAX_PVALS; i++) for (flag = of_next(o_ptr->kind->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(o_ptr->kind->pval_flags[i], flag + 1)) of_on(flags[which_pval(o_ptr, flag)], flag); if (o_ptr->ego && easy_know(o_ptr)) for (i = 0; i < MAX_PVALS; i++) for (flag = of_next(o_ptr->ego->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(o_ptr->ego->pval_flags[i], flag + 1)) of_on(flags[which_pval(o_ptr, flag)], flag); } /** * \returns whether a specific pval is known to the player */ bool object_this_pval_is_visible(const object_type *o_ptr, int pval) { bitflag f[MAX_PVALS][OF_SIZE], f2[OF_SIZE]; assert(o_ptr->kind); if (o_ptr->ident & IDENT_STORE) return TRUE; /* Aware jewelry with non-variable pval */ if (object_is_jewelry(o_ptr) && object_flavor_is_aware(o_ptr)) { if (!randcalc_varies(o_ptr->kind->pval[pval])) return TRUE; } if (object_was_worn(o_ptr)) { object_pval_flags_known(o_ptr, f); /* Create the mask for pval-related flags */ create_mask(f2, FALSE, OFT_STAT, OFT_PVAL, OFT_MAX); if (of_is_inter(f[pval], f2)) return TRUE; } return FALSE; } /** * Combine two pvals of the same value on an object. Returns TRUE if changes * were made, i.e. o_ptr->num_pvals has decreased by one. */ static bool object_dedup_pvals(object_type *o_ptr) { int i, j, k; /* Abort if there can be no duplicates */ if (o_ptr->num_pvals < 2) return FALSE; /* Find the first pair of pvals which have the same value */ for (i = 0; i < o_ptr->num_pvals; i++) { for (j = i + 1; j < o_ptr->num_pvals; j++) { if (o_ptr->pval[i] == o_ptr->pval[j]) { /* Nuke the j pval and its flags, combining them with i's */ of_union(o_ptr->pval_flags[i], o_ptr->pval_flags[j]); of_wipe(o_ptr->pval_flags[j]); o_ptr->pval[j] = 0; /* Move any remaining pvals down one to fill the void */ for (k = j + 1; k < o_ptr->num_pvals; k++) { of_copy(o_ptr->pval_flags[k - 1], o_ptr->pval_flags[k]); of_wipe(o_ptr->pval_flags[k]); o_ptr->pval[k - 1] = o_ptr->pval[k]; o_ptr->pval[k] = 0; } /* We now have one fewer pval */ o_ptr->num_pvals--; return TRUE; } } } /* No two pvals are identical */ return FALSE; } /** * Return the pval of an object which is closest to value. Returns -1 if * o_ptr has no pvals. */ static int object_closest_pval(object_type *o_ptr, int value) { int i, best_diff, best_pval = 0; if (!o_ptr->num_pvals) return -1; /* Or should we stop wimping around and just assert(0) ? */ best_diff = value; for (i = 0; i < o_ptr->num_pvals; i++) if (abs(o_ptr->pval[i] - value) < best_diff) { best_diff = abs(o_ptr->pval[i] - value); best_pval = i; } return best_pval; } /** * Add a pval to an object, rearranging flags as necessary. Returns TRUE * if the number of pvals is now different, FALSE if it is the same. * * \param o_ptr is the object we're adjusting * \param pval is the pval we are adding * \param flag is the flag to which we are adding the pval */ bool object_add_pval(object_type *o_ptr, int pval, int flag) { bitflag f[OF_SIZE]; int a = -1, best_pval; /* Sanity check (we may be called with 0 - see ticket #1451) */ if (!pval) return FALSE; create_mask(f, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); if (of_has(o_ptr->flags, flag)) { /* See if any other flags are associated with this pval */ a = which_pval(o_ptr, flag); of_off(f, flag); of_inter(f, o_ptr->pval_flags[a]); if (of_is_empty(f)) { /* Safe to increment and finish */ o_ptr->pval[a] += pval; if (o_ptr->pval[a] == 0) { /* Remove the flag */ of_off(o_ptr->flags, flag); of_off(o_ptr->pval_flags[a], flag); } return (object_dedup_pvals(o_ptr)); } } /* So it doesn't have the flag, or it does but that pval also has others */ /* Create a new pval if we can */ if (o_ptr->num_pvals < MAX_PVALS) { o_ptr->pval[o_ptr->num_pvals] = pval; of_on(o_ptr->pval_flags[o_ptr->num_pvals], flag); if (a != -1) { /* then we need to move the flag to the new pval */ o_ptr->pval[o_ptr->num_pvals] += o_ptr->pval[a]; of_off(o_ptr->pval_flags[a], flag); } else /* We need to add it to object_flags */ of_on(o_ptr->flags, flag); o_ptr->num_pvals++; /* We do this last because pvals start from zero */ /* We invert the logic because we've already added a pval */ return (!object_dedup_pvals(o_ptr)); } else { /* we use the closest existing pval */ best_pval = object_closest_pval(o_ptr, (pval + (a == -1 ? 0 : o_ptr->pval[a]))); if (best_pval != a) { /* turn on the flag on the new pval */ of_on(o_ptr->pval_flags[best_pval], flag); if (a != -1) /* turn it off on its old pval */ of_off(o_ptr->pval_flags[a], flag); else /* add it to object_flags */ of_on(o_ptr->flags, flag); } return FALSE; /* We haven't changed any pvals, so no need to de-dup */ } } angband-v3.3.2/src/object/identify.c0000644000175000017500000007046411651552410016636 0ustar chriscchrisc/* * File: identify.c * Purpose: Object identification and knowledge routines * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2009 Brian Bull * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "game-event.h" #include "history.h" #include "object/slays.h" #include "object/tvalsval.h" #include "object/pval.h" #include "spells.h" #include "squelch.h" /** Time last item was wielded */ s32b object_last_wield; /*** Knowledge accessor functions ***/ /** * \returns whether an object counts as "known" due to EASY_KNOW status */ bool easy_know(const object_type *o_ptr) { if (o_ptr->kind->aware && of_has(o_ptr->kind->flags, OF_EASY_KNOW)) return TRUE; else return FALSE; } /** * \returns whether an object should be treated as fully known (e.g. ID'd) */ bool object_is_known(const object_type *o_ptr) { return (o_ptr->ident & IDENT_KNOWN) || easy_know(o_ptr) || (o_ptr->ident & IDENT_STORE); } /** * \returns whether the object is known to be an artifact */ bool object_is_known_artifact(const object_type *o_ptr) { return (o_ptr->ident & IDENT_INDESTRUCT) || (o_ptr->artifact && object_was_sensed(o_ptr)); } /** * \returns whether the object is known to be cursed */ bool object_is_known_cursed(const object_type *o_ptr) { bitflag f[OF_SIZE], f2[OF_SIZE]; object_flags_known(o_ptr, f); /* Gather whatever curse flags there are to know */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); return of_is_inter(f, f2); } /** * \returns whether the object is known to be blessed */ bool object_is_known_blessed(const object_type *o_ptr) { bitflag f[OF_SIZE]; object_flags_known(o_ptr, f); return (of_has(f, OF_BLESSED)) ? TRUE : FALSE; } /** * \returns whether the object is known to not be an artifact */ bool object_is_known_not_artifact(const object_type *o_ptr) { if (o_ptr->ident & IDENT_NOTART) return TRUE; return FALSE; } /** * \returns whether the object has been worn/wielded */ bool object_was_worn(const object_type *o_ptr) { return o_ptr->ident & IDENT_WORN ? TRUE : FALSE; } /** * \returns whether the object has been fired/thrown */ bool object_was_fired(const object_type *o_ptr) { return o_ptr->ident & IDENT_FIRED ? TRUE : FALSE; } /** * \returns whether the object has been sensed with pseudo-ID */ bool object_was_sensed(const object_type *o_ptr) { return o_ptr->ident & IDENT_SENSE ? TRUE : FALSE; } /** * \returns whether the player is aware of the object's flavour */ bool object_flavor_is_aware(const object_type *o_ptr) { assert(o_ptr->kind); return o_ptr->kind->aware; } /** * \returns whether the player has tried to use other objects of the same kind */ bool object_flavor_was_tried(const object_type *o_ptr) { assert(o_ptr->kind); return o_ptr->kind->tried; } /** * \returns whether the player is aware of the object's effect when used */ bool object_effect_is_known(const object_type *o_ptr) { assert(o_ptr->kind); return (easy_know(o_ptr) || (o_ptr->ident & IDENT_EFFECT) || (object_flavor_is_aware(o_ptr) && o_ptr->kind->effect) || (o_ptr->ident & IDENT_STORE)) ? TRUE : FALSE; } /** * \returns whether any ego or artifact name is available to the player */ bool object_name_is_visible(const object_type *o_ptr) { return o_ptr->ident & IDENT_NAME ? TRUE : FALSE; } /** * \returns whether both the object is both an ego and the player knows it is */ bool object_ego_is_visible(const object_type *o_ptr) { if (!o_ptr->ego) return FALSE; if (o_ptr->tval == TV_LIGHT) return TRUE; if ((o_ptr->ident & IDENT_NAME) || (o_ptr->ident & IDENT_STORE)) return TRUE; else return FALSE; } /** * \returns whether the object's attack plusses are known */ bool object_attack_plusses_are_visible(const object_type *o_ptr) { /* Bonuses have been revealed or for sale */ if ((o_ptr->ident & IDENT_ATTACK) || (o_ptr->ident & IDENT_STORE)) return TRUE; /* Aware jewelry with non-variable bonuses */ if (object_is_jewelry(o_ptr) && object_flavor_is_aware(o_ptr)) { if (!randcalc_varies(o_ptr->kind->to_h) && !randcalc_varies(o_ptr->kind->to_d)) return TRUE; } return FALSE; } /** * \returns whether the object's defence bonuses are known */ bool object_defence_plusses_are_visible(const object_type *o_ptr) { /* Bonuses have been revealed or for sale */ if ((o_ptr->ident & IDENT_DEFENCE) || (o_ptr->ident & IDENT_STORE)) return TRUE; /* Aware jewelry with non-variable bonuses */ if (object_is_jewelry(o_ptr) && object_flavor_is_aware(o_ptr)) { if (!randcalc_varies(o_ptr->kind->to_a)) return TRUE; } return FALSE; } /* * \returns whether the player knows whether an object has a given flag */ bool object_flag_is_known(const object_type *o_ptr, int flag) { if (easy_know(o_ptr) || (o_ptr->ident & IDENT_STORE) || of_has(o_ptr->known_flags, flag)) return TRUE; return FALSE; } /* * \returns whether it is possible an object has a high resist given the * player's current knowledge */ bool object_high_resist_is_possible(const object_type *o_ptr) { bitflag flags[OF_SIZE], f2[OF_SIZE]; /* Actual object flags */ object_flags(o_ptr, flags); /* Add player's uncertainty */ of_comp_union(flags, o_ptr->known_flags); /* Check for possible high resist */ create_mask(f2, FALSE, OFT_HRES, OFT_MAX); if (of_is_inter(flags, f2)) return TRUE; else return FALSE; } /* * Sets a some IDENT_ flags on an object. * * \param o_ptr is the object to check * \param flags are the ident flags to be added * * \returns whether o_ptr->ident changed */ static bool object_add_ident_flags(object_type *o_ptr, u32b flags) { if ((o_ptr->ident & flags) != flags) { o_ptr->ident |= flags; return TRUE; } return FALSE; } /* * Checks for additional knowledge implied by what the player already knows. * * \param o_ptr is the object to check * * returns whether it calls object_notice_everyting */ bool object_check_for_ident(object_type *o_ptr) { bitflag flags[OF_SIZE], known_flags[OF_SIZE], f2[OF_SIZE]; object_flags(o_ptr, flags); object_flags_known(o_ptr, known_flags); /* Some flags are irrelevant or never learned or too hard to learn */ create_mask(f2, FALSE, OFT_INT, OFT_IGNORE, OFT_HATES, OFT_MAX); of_diff(flags, f2); of_diff(known_flags, f2); if (!of_is_equal(flags, known_flags)) return FALSE; /* If we know attack bonuses, and defence bonuses, and effect, then * we effectively know everything, so mark as such */ if ((object_attack_plusses_are_visible(o_ptr) || (object_was_sensed(o_ptr) && o_ptr->to_h == 0 && o_ptr->to_d == 0)) && (object_defence_plusses_are_visible(o_ptr) || (object_was_sensed(o_ptr) && o_ptr->to_a == 0)) && (object_effect_is_known(o_ptr) || !object_effect(o_ptr))) { /* In addition to knowing the pval flags, it is necessary to know the pvals to know everything */ int i; for (i = 0; i < o_ptr->num_pvals; i++) if (!object_this_pval_is_visible(o_ptr, i)) break; if (i == o_ptr->num_pvals) { object_notice_everything(o_ptr); return TRUE; } } /* We still know all the flags, so we still know if it's an ego */ if (o_ptr->ego) { /* require worn status so you don't learn launcher of accuracy or gloves of slaying before wield */ if (object_was_worn(o_ptr)) object_notice_ego(o_ptr); } return FALSE; } /** * Mark an object's flavour as as one the player is aware of. * * \param o_ptr is the object whose flavour should be marked as aware */ void object_flavor_aware(object_type *o_ptr) { int i; if (o_ptr->kind->aware) return; o_ptr->kind->aware = TRUE; /* Fix squelch/autoinscribe */ p_ptr->notice |= PN_SQUELCH; apply_autoinscription(o_ptr); for (i = 1; i < o_max; i++) { const object_type *floor_o_ptr = object_byid(i); /* Some objects change tile on awareness */ /* So update display for all floor objects of this kind */ if (!floor_o_ptr->held_m_idx && floor_o_ptr->kind == o_ptr->kind) cave_light_spot(cave, floor_o_ptr->iy, floor_o_ptr->ix); } } /** * Mark an object's flavour as tried. * * \param o_ptr is the object whose flavour should be marked */ void object_flavor_tried(object_type *o_ptr) { assert(o_ptr); assert(o_ptr->kind); o_ptr->kind->tried = TRUE; } /** * Make the player aware of all of an object's flags. * * \param o_ptr is the object to mark */ void object_know_all_flags(object_type *o_ptr) { of_setall(o_ptr->known_flags); } #define IDENTS_SET_BY_IDENTIFY ( IDENT_KNOWN | IDENT_ATTACK | IDENT_DEFENCE | IDENT_SENSE | IDENT_EFFECT | IDENT_WORN | IDENT_FIRED | IDENT_NAME ) /** * Check whether an object has IDENT_KNOWN but should not */ bool object_is_not_known_consistently(const object_type *o_ptr) { if (easy_know(o_ptr)) return FALSE; if (!(o_ptr->ident & IDENT_KNOWN)) return TRUE; if ((o_ptr->ident & IDENTS_SET_BY_IDENTIFY) != IDENTS_SET_BY_IDENTIFY) return TRUE; if (o_ptr->ident & IDENT_EMPTY) return TRUE; else if (o_ptr->artifact && !(o_ptr->artifact->seen || o_ptr->artifact->everseen)) return TRUE; if (!of_is_full(o_ptr->known_flags)) return TRUE; return FALSE; } /** * Mark as object as fully known, a.k.a identified. * * \param o_ptr is the object to mark as identified */ void object_notice_everything(object_type *o_ptr) { /* The object is "empty" */ o_ptr->ident &= ~(IDENT_EMPTY); /* Mark as known */ object_flavor_aware(o_ptr); object_add_ident_flags(o_ptr, IDENTS_SET_BY_IDENTIFY); /* Artifact has now been seen */ if (o_ptr->artifact && !(o_ptr->ident & IDENT_FAKE)) { o_ptr->artifact->seen = o_ptr->artifact->everseen = TRUE; history_add_artifact(o_ptr->artifact, TRUE, TRUE); } /* Know all flags there are to be known */ object_know_all_flags(o_ptr); } /** * Notice that an object is indestructible. */ void object_notice_indestructible(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_INDESTRUCT)) object_check_for_ident(o_ptr); } /* * Notice the ego on an ego item. */ void object_notice_ego(object_type *o_ptr) { bitflag learned_flags[OF_SIZE]; bitflag xtra_flags[OF_SIZE]; if (!o_ptr->ego) return; /* XXX Eddie print a message on notice ego if not already noticed? */ /* XXX Eddie should we do something about everseen of egos here? */ /* Learn ego flags */ of_union(o_ptr->known_flags, o_ptr->ego->flags); /* Learn all flags except random abilities */ of_setall(learned_flags); switch (o_ptr->ego->xtra) { case OBJECT_XTRA_TYPE_NONE: break; case OBJECT_XTRA_TYPE_SUSTAIN: create_mask(xtra_flags, FALSE, OFT_SUST, OFT_MAX); of_diff(learned_flags, xtra_flags); break; case OBJECT_XTRA_TYPE_RESIST: create_mask(xtra_flags, FALSE, OFT_HRES, OFT_MAX); of_diff(learned_flags, xtra_flags); break; case OBJECT_XTRA_TYPE_POWER: create_mask(xtra_flags, FALSE, OFT_MISC, OFT_PROT, OFT_MAX); of_diff(learned_flags, xtra_flags); break; default: assert(0); } of_union(o_ptr->known_flags, learned_flags); if (object_add_ident_flags(o_ptr, IDENT_NAME)) { /* if you know the ego, you know which it is of excellent or splendid */ object_notice_sensing(o_ptr); object_check_for_ident(o_ptr); } } /* * Mark an object as sensed. */ void object_notice_sensing(object_type *o_ptr) { if (object_was_sensed(o_ptr)) return; if (o_ptr->artifact) { o_ptr->artifact->seen = o_ptr->artifact->everseen = TRUE; o_ptr->ident |= IDENT_NAME; } object_notice_curses(o_ptr); if (object_add_ident_flags(o_ptr, IDENT_SENSE)) object_check_for_ident(o_ptr); } /* * Sense artifacts */ void object_sense_artifact(object_type *o_ptr) { if (o_ptr->artifact) object_notice_sensing(o_ptr); else o_ptr->ident |= IDENT_NOTART; } /** * Notice the "effect" from activating an object. * * \param o_ptr is the object to become aware of */ void object_notice_effect(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_EFFECT)) object_check_for_ident(o_ptr); /* noticing an effect gains awareness */ if (!object_flavor_is_aware(o_ptr)) object_flavor_aware(o_ptr); } static void object_notice_defence_plusses(struct player *p, object_type *o_ptr) { assert(o_ptr && o_ptr->kind); if (object_defence_plusses_are_visible(o_ptr)) return; if (object_add_ident_flags(o_ptr, IDENT_DEFENCE)) object_check_for_ident(o_ptr); if (o_ptr->ac || o_ptr->to_a) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msgt(MSG_PSEUDOID, "You know more about the %s you are wearing.", o_name); } p->update |= (PU_BONUS); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } void object_notice_attack_plusses(object_type *o_ptr) { assert(o_ptr && o_ptr->kind); if (object_attack_plusses_are_visible(o_ptr)) return; if (object_add_ident_flags(o_ptr, IDENT_ATTACK)) object_check_for_ident(o_ptr); if (wield_slot(o_ptr) == INVEN_WIELD) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msgt(MSG_PSEUDOID, "You know more about the %s you are using.", o_name); } else if ((o_ptr->to_d || o_ptr->to_h) && !((o_ptr->tval == TV_HARD_ARMOR || o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->to_h < 0))) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msgt(MSG_PSEUDOID, "Your %s glows.", o_name); } p_ptr->update |= (PU_BONUS); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Notice a single flag - returns TRUE if anything new was learned */ bool object_notice_flag(object_type *o_ptr, int flag) { if (!of_has(o_ptr->known_flags, flag)) { of_on(o_ptr->known_flags, flag); /* XXX Eddie don't want infinite recursion if object_check_for_ident sets more flags, * but maybe this will interfere with savefile repair */ object_check_for_ident(o_ptr); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); return TRUE; } return FALSE; } /* * Notice a set of flags - returns TRUE if anything new was learned */ bool object_notice_flags(object_type *o_ptr, bitflag flags[OF_SIZE]) { if (!of_is_subset(o_ptr->known_flags, flags)) { of_union(o_ptr->known_flags, flags); /* XXX Eddie don't want infinite recursion if object_check_for_ident sets more flags, * but maybe this will interfere with savefile repair */ object_check_for_ident(o_ptr); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); return TRUE; } return FALSE; } /** * Notice curses on an object. * * \param o_ptr is the object to notice curses on */ bool object_notice_curses(object_type *o_ptr) { bitflag f[OF_SIZE], f2[OF_SIZE]; object_flags(o_ptr, f); /* Gather whatever curse flags there are to know */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); /* Remove everything except the curse flags */ of_inter(f, f2); /* give knowledge of which curses are present */ object_notice_flags(o_ptr, f); object_check_for_ident(o_ptr); p_ptr->notice |= PN_SQUELCH; return !of_is_empty(f); } /** * Notice things which happen on defending. */ void object_notice_on_defend(struct player *p) { int i; for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) if (p->inventory[i].kind) object_notice_defence_plusses(p, &p->inventory[i]); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Notice stuff when firing or throwing objects. * */ /* XXX Eddie perhaps some stuff from do_cmd_fire and do_cmd_throw should be moved here */ void object_notice_on_firing(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_FIRED)) object_check_for_ident(o_ptr); } /* * Determine whether a weapon or missile weapon is obviously {excellent} when * worn. * * XXX Eddie should messages be adhoc all over the place? perhaps the main * loop should check for change in inventory/wieldeds and all messages be * printed from one place */ void object_notice_on_wield(object_type *o_ptr) { bitflag f[OF_SIZE], f2[OF_SIZE], obvious_mask[OF_SIZE]; bool obvious = FALSE; create_mask(obvious_mask, TRUE, OFID_WIELD, OFT_MAX); /* Save time of wield for later */ object_last_wield = turn; /* Only deal with un-ID'd items */ if (object_is_known(o_ptr)) return; /* Wear it */ object_flavor_tried(o_ptr); if (object_add_ident_flags(o_ptr, IDENT_WORN)) object_check_for_ident(o_ptr); /* CC: may wish to be more subtle about this once we have ego lights * with multiple pvals */ if (obj_is_light(o_ptr) && o_ptr->ego) object_notice_ego(o_ptr); if (object_flavor_is_aware(o_ptr) && easy_know(o_ptr)) { object_notice_everything(o_ptr); return; } /* Automatically sense artifacts upon wield */ object_sense_artifact(o_ptr); /* Note artifacts when found */ if (o_ptr->artifact) history_add_artifact(o_ptr->artifact, object_is_known(o_ptr), TRUE); /* special case FA, needed at least for mages wielding gloves */ if (object_FA_would_be_obvious(o_ptr)) of_on(obvious_mask, OF_FREE_ACT); /* Extract the flags */ object_flags(o_ptr, f); /* Find obvious things (disregarding curses) - why do we remove the curses?? */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); of_diff(obvious_mask, f2); if (of_is_inter(f, obvious_mask)) obvious = TRUE; create_mask(obvious_mask, TRUE, OFID_WIELD, OFT_MAX); /* Notice any obvious brands or slays */ object_notice_slays(o_ptr, obvious_mask); /* Learn about obvious flags */ of_union(o_ptr->known_flags, obvious_mask); /* XXX Eddie should these next NOT call object_check_for_ident due to worries about repairing? */ /* XXX Eddie this is a small hack, but jewelry with anything noticeable really is obvious */ /* XXX Eddie learn =soulkeeping vs =bodykeeping when notice sustain_str */ if (object_is_jewelry(o_ptr)) { /* Learn the flavor of jewelry with obvious flags */ if (EASY_LEARN && obvious) object_flavor_aware(o_ptr); /* Learn all flags on any aware non-artifact jewelry */ if (object_flavor_is_aware(o_ptr) && !o_ptr->artifact) object_know_all_flags(o_ptr); } object_check_for_ident(o_ptr); if (!obvious) return; /* XXX Eddie need to add stealth here, also need to assert/double-check everything is covered */ /* CC: also need to add FA! */ if (of_has(f, OF_STR)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_STR)] > 0 ? "stronger" : "weaker"); if (of_has(f, OF_INT)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_INT)] > 0 ? "smarter" : "more stupid"); if (of_has(f, OF_WIS)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_WIS)] > 0 ? "wiser" : "more naive"); if (of_has(f, OF_DEX)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_DEX)] > 0 ? "more dextrous" : "clumsier"); if (of_has(f, OF_CON)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_CON)] > 0 ? "healthier" : "sicklier"); if (of_has(f, OF_CHR)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_CHR)] > 0 ? "cuter" : "uglier"); if (of_has(f, OF_SPEED)) msg("You feel strangely %s.", o_ptr->pval[which_pval(o_ptr, OF_SPEED)] > 0 ? "quick" : "sluggish"); if (of_has(f, OF_BLOWS)) msg("Your weapon %s in your hands.", o_ptr->pval[which_pval(o_ptr, OF_BLOWS)] > 0 ? "tingles" : "aches"); if (of_has(f, OF_SHOTS)) msg("Your bow %s in your hands.", o_ptr->pval[which_pval(o_ptr, OF_SHOTS)] > 0 ? "tingles" : "aches"); if (of_has(f, OF_INFRA)) msg("Your eyes tingle."); if (of_has(f, OF_LIGHT)) msg("It glows!"); if (of_has(f, OF_TELEPATHY)) msg("Your mind feels strangely sharper!"); /* WARNING -- masking f by obvious mask -- this should be at the end of this function */ /* CC: I think this can safely go, but just in case ... */ /* flags_mask(f, OF_SIZE, OF_OBVIOUS_MASK, FLAG_END); */ /* Remember the flags */ object_notice_sensing(o_ptr); /* XXX Eddie should we check_for_ident here? */ } /** * Notice things about an object that would be noticed in time. */ static void object_notice_after_time(void) { int i; int flag; object_type *o_ptr; char o_name[80]; bitflag f[OF_SIZE], timed_mask[OF_SIZE]; create_mask(timed_mask, TRUE, OFID_TIMED, OFT_MAX); /* Check every item the player is wearing */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind || object_is_known(o_ptr)) continue; /* Check for timed notice flags */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); object_flags(o_ptr, f); of_inter(f, timed_mask); for (flag = of_next(f, FLAG_START); flag != FLAG_END; flag = of_next(f, flag + 1)) { if (!of_has(o_ptr->known_flags, flag)) { /* Message */ flag_message(flag, o_name); /* Notice the flag */ object_notice_flag(o_ptr, flag); if (object_is_jewelry(o_ptr) && (!object_effect(o_ptr) || object_effect_is_known(o_ptr))) { /* XXX this is a small hack, but jewelry with anything noticeable really is obvious */ /* XXX except, wait until learn activation if that is only clue */ object_flavor_aware(o_ptr); object_check_for_ident(o_ptr); } } else { /* Notice the flag is absent */ object_notice_flag(o_ptr, flag); } } /* XXX Is this necessary? */ object_check_for_ident(o_ptr); } } /** * Notice a given special flag on wielded items. * * \param flag is the flag to notice */ void wieldeds_notice_flag(struct player *p, int flag) { int i; /* Sanity check */ if (!flag) return; /* XXX Eddie need different naming conventions for starting wieldeds at INVEN_WIELD vs INVEN_WIELD+2 */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { object_type *o_ptr = &p->inventory[i]; bitflag f[OF_SIZE]; if (!o_ptr->kind) continue; object_flags(o_ptr, f); if (of_has(f, flag) && !of_has(o_ptr->known_flags, flag)) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Notice the flag */ object_notice_flag(o_ptr, flag); /* XXX Eddie should this go before noticing the flag to avoid learning twice? */ if (EASY_LEARN && object_is_jewelry(o_ptr)) { /* XXX Eddie EASY_LEARN Possible concern: gets =teleportation just from +2 speed */ object_flavor_aware(o_ptr); object_check_for_ident(o_ptr); } /* Message */ flag_message(flag, o_name); } else { /* Notice that flag is absent */ object_notice_flag(o_ptr, flag); } /* XXX Eddie should not need this, should be done in noticing, but will remove later */ object_check_for_ident(o_ptr); } return; } /** * Notice things which happen on attacking. */ void wieldeds_notice_on_attack(void) /* Does not apply to weapon or bow which should be done separately */ { int i; for (i = INVEN_WIELD + 2; i < INVEN_TOTAL; i++) if (p_ptr->inventory[i].kind) object_notice_attack_plusses(&p_ptr->inventory[i]); /* XXX Eddie print message? */ /* XXX Eddie do we need to do more about ammo? */ return; } bool object_FA_would_be_obvious(const object_type *o_ptr) { if (player_has(PF_CUMBER_GLOVE) && wield_slot(o_ptr) == INVEN_HANDS) { bitflag flags[OF_SIZE]; object_flags(o_ptr, flags); if (!of_has(flags, OF_DEX) && !of_has(flags, OF_SPELLS_OK)) return TRUE; } return FALSE; } /* * Given an object, return a short identifier which gives some idea of what * the item is. */ obj_pseudo_t object_pseudo(const object_type *o_ptr) { bitflag flags[OF_SIZE], f2[OF_SIZE]; /* Get the known and obvious flags on the object, * not including curses or properties of the kind. */ object_flags_known(o_ptr, flags); create_mask(f2, TRUE, OFID_WIELD, OFT_MAX); /* FA on gloves is obvious to mage casters */ if (object_FA_would_be_obvious(o_ptr)) of_on(f2, OF_FREE_ACT); /* Now we remove the non-obvious known flags */ of_inter(flags, f2); /* Now we remove the cursed flags and the kind flags */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); of_diff(flags, f2); of_diff(flags, o_ptr->kind->flags); if (o_ptr->ident & IDENT_INDESTRUCT) return INSCRIP_SPECIAL; if ((object_was_sensed(o_ptr) || object_was_worn(o_ptr)) && o_ptr->artifact) return INSCRIP_SPECIAL; /* jewelry does not pseudo */ if (object_is_jewelry(o_ptr)) return INSCRIP_NULL; /* XXX Eddie should also check for flags with pvals where the pval exceeds * the base pval for things like picks of digging, though for now acid brand gets those */ if (!of_is_empty(flags)) return INSCRIP_SPLENDID; if (!object_is_known(o_ptr) && !object_was_sensed(o_ptr)) return INSCRIP_NULL; if (o_ptr->ego) { /* uncursed bad egos are not excellent */ if (of_is_inter(o_ptr->ego->flags, f2)) return INSCRIP_STRANGE; /* XXX Eddie need something worse */ else return INSCRIP_EXCELLENT; } if (o_ptr->to_a == randcalc(o_ptr->kind->to_a, 0, MINIMISE) && o_ptr->to_h == randcalc(o_ptr->kind->to_h, 0, MINIMISE) && o_ptr->to_d == randcalc(o_ptr->kind->to_d, 0, MINIMISE)) return INSCRIP_AVERAGE; if (o_ptr->to_a >= randcalc(o_ptr->kind->to_a, 0, MINIMISE) && o_ptr->to_h >= randcalc(o_ptr->kind->to_h, 0, MINIMISE) && o_ptr->to_d >= randcalc(o_ptr->kind->to_d, 0, MINIMISE)) return INSCRIP_MAGICAL; if (o_ptr->to_a <= randcalc(o_ptr->kind->to_a, 0, MINIMISE) && o_ptr->to_h <= randcalc(o_ptr->kind->to_h, 0, MINIMISE) && o_ptr->to_d <= randcalc(o_ptr->kind->to_d, 0, MINIMISE)) return INSCRIP_MAGICAL; return INSCRIP_STRANGE; } /* * Sense the inventory */ void sense_inventory(void) { int i; char o_name[80]; unsigned int rate; /* No ID when confused in a bad state */ if (p_ptr->timed[TMD_CONFUSED]) return; /* Notice some things after a while */ if (turn >= (object_last_wield + 3000)) { object_notice_after_time(); object_last_wield = 0; } /* Get improvement rate */ if (player_has(PF_PSEUDO_ID_IMPROV)) rate = p_ptr->class->sense_base / (p_ptr->lev * p_ptr->lev + p_ptr->class->sense_div); else rate = p_ptr->class->sense_base / (p_ptr->lev + p_ptr->class->sense_div); if (!one_in_(rate)) return; /* Check everything */ for (i = 0; i < ALL_INVEN_TOTAL; i++) { const char *text = NULL; object_type *o_ptr = &p_ptr->inventory[i]; obj_pseudo_t feel; bool cursed; bool okay = FALSE; /* Skip empty slots */ if (!o_ptr->kind) continue; /* Valid "tval" codes */ switch (o_ptr->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { okay = TRUE; break; } } /* Skip non-sense machines */ if (!okay) continue; /* It is known, no information needed */ if (object_is_known(o_ptr)) continue; /* It has already been sensed, do not sense it again */ if (object_was_sensed(o_ptr)) { /* Small chance of wielded, sensed items getting complete ID */ if (!o_ptr->artifact && (i >= INVEN_WIELD) && one_in_(1000)) do_ident_item(i, o_ptr); continue; } /* Occasional failure on inventory items */ if ((i < INVEN_WIELD) && one_in_(5)) continue; /* Sense the object */ object_notice_sensing(o_ptr); cursed = object_notice_curses(o_ptr); /* Get the feeling */ feel = object_pseudo(o_ptr); /* Stop everything */ disturb(p_ptr, 0, 0); if (cursed) text = "cursed"; else text = inscrip_text[feel]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Average pseudo-ID means full ID */ if (feel == INSCRIP_AVERAGE) { object_notice_everything(o_ptr); msgt(MSG_PSEUDOID, "You feel the %s (%c) %s %s average...", o_name, index_to_label(i),((i >= INVEN_WIELD) ? "you are using" : "in your pack"), ((o_ptr->number == 1) ? "is" : "are")); } else { if (i >= INVEN_WIELD) { msgt(MSG_PSEUDOID, "You feel the %s (%c) you are %s %s %s...", o_name, index_to_label(i), describe_use(i), ((o_ptr->number == 1) ? "is" : "are"), text); } else { msgt(MSG_PSEUDOID, "You feel the %s (%c) in your pack %s %s...", o_name, index_to_label(i), ((o_ptr->number == 1) ? "is" : "are"), text); } } /* Set squelch flag as appropriate */ if (i < INVEN_WIELD) p_ptr->notice |= PN_SQUELCH; /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } } angband-v3.3.2/src/object/slays.c0000644000175000017500000002302611651552410016146 0ustar chriscchrisc/* * File: slays.c * Purpose: encapsulation of slay_table and accessor functions for slays/brands * * Copyright (c) 2010 Chris Carr and Peter Denison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/slays.h" /** * Info about slays (see src/slays.h for structure) */ const struct slay slay_table[] = { #define SLAY(a, b, c, d, e, f, g, h, i, j) \ { SL_##a, b, c, d, e, f, g, h, i, j}, #include "list-slays.h" #undef SLAY }; /** * Cache of slay values (for object_power) */ static struct flag_cache *slay_cache; /** * Remove slays which are duplicates, i.e. they have exactly the same "monster * flag" and the same "resist flag". The one with highest multiplier is kept. * * \param flags is the flagset from which to remove duplicates. * count is the number of dups removed. */ int dedup_slays(bitflag *flags) { int i, j; int count = 0; for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(flags, s_ptr->object_flag)) { for (j = i + 1; j < SL_MAX; j++) { const struct slay *t_ptr = &slay_table[j]; if (of_has(flags, t_ptr->object_flag) && (t_ptr->monster_flag == s_ptr->monster_flag) && (t_ptr->resist_flag == s_ptr->resist_flag) && (t_ptr->mult != s_ptr->mult)) { count++; if (t_ptr->mult > s_ptr->mult) of_off(flags, s_ptr->object_flag); else of_off(flags, t_ptr->object_flag); } } } } return count; } /** * Get a random slay (or brand). * We use randint1 because the first entry in slay_table is null. * * \param mask is the set of slays from which we are choosing. */ const struct slay *random_slay(const bitflag mask[OF_SIZE]) { const struct slay *s_ptr; do { s_ptr = &slay_table[randint1(SL_MAX - 1)]; } while (!of_has(mask, s_ptr->object_flag)); return s_ptr; } /** * Match slays in flags against a chosen flag mask * * count is the number of matches * \param flags is the flagset to analyse for matches * \param mask is the flagset against which to test * \param desc[] is the array of descriptions of matching slays - can be null * \param brand[] is the array of descriptions of brands - can be null * \param mult[] is the array of multipliers of those slays - can be null * \param dedup is whether or not to remove duplicates * * desc[], brand[] and mult[] must be >= SL_MAX in size */ int list_slays(const bitflag flags[OF_SIZE], const bitflag mask[OF_SIZE], const char *desc[], const char *brand[], int mult[], bool dedup) { int i, count = 0; bitflag f[OF_SIZE]; /* We are only interested in the flags specified in mask */ of_copy(f, flags); of_inter(f, mask); /* Remove "duplicate" flags if desired */ if (dedup) dedup_slays(f); /* Collect slays */ for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(f, s_ptr->object_flag)) { if (mult) mult[count] = s_ptr->mult; if (brand) brand[count] = s_ptr->brand; if (desc) desc[count] = s_ptr->desc; count++; } } return count; } /** * Notice any slays on a particular object which are in mask. * * \param o_ptr is the object on which we are noticing slays * \param mask is the flagset within which we are noticing them */ void object_notice_slays(object_type *o_ptr, const bitflag mask[OF_SIZE]) { bool learned; bitflag f[OF_SIZE]; char o_name[40]; int i; /* We are only interested in the flags specified in mask */ object_flags(o_ptr, f); of_inter(f, mask); /* if you learn a slay, learn the ego and print a message */ for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(f, s_ptr->object_flag)) { learned = object_notice_flag(o_ptr, s_ptr->object_flag); if (EASY_LEARN && learned) { object_notice_ego(o_ptr); object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msg("Your %s %s!", o_name, s_ptr->active_verb); } } } object_check_for_ident(o_ptr); } /** * Extract the multiplier from a given object hitting a given monster. * * \param o_ptr is the object being used to attack * \param m_ptr is the monster being attacked * \param best_s_ptr is the best applicable slay_table entry, or NULL if no * slay already known * \param real is whether this is a real attack (where we update lore) or a * simulation (where we don't) * \param known_only is whether we are using all the object flags, or only * the ones we *already* know about */ void improve_attack_modifier(object_type *o_ptr, const monster_type *m_ptr, const struct slay **best_s_ptr, bool real, bool known_only) { monster_race *r_ptr = &r_info[m_ptr->r_idx]; monster_lore *l_ptr = &l_list[m_ptr->r_idx]; bitflag f[OF_SIZE], known_f[OF_SIZE], note_f[OF_SIZE]; int i; object_flags(o_ptr, f); object_flags_known(o_ptr, known_f); for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if ((known_only && !of_has(known_f, s_ptr->object_flag)) || (!known_only && !of_has(f, s_ptr->object_flag))) continue; /* In a real attack, learn about monster resistance or slay match if: * EITHER the slay flag on the object is known, * OR the monster is vulnerable to the slay/brand */ if (real && (of_has(known_f, s_ptr->object_flag) || (s_ptr->monster_flag && rf_has(r_ptr->flags, s_ptr->monster_flag)) || (s_ptr->resist_flag && !rf_has(r_ptr->flags, s_ptr->resist_flag)))) { /* notice any brand or slay that would affect monster */ of_wipe(note_f); of_on(note_f, s_ptr->object_flag); object_notice_slays(o_ptr, note_f); if (m_ptr->ml && s_ptr->monster_flag) rf_on(l_ptr->flags, s_ptr->monster_flag); if (m_ptr->ml && s_ptr->resist_flag) rf_on(l_ptr->flags, s_ptr->resist_flag); } /* If the monster doesn't resist or the slay flag matches */ if ((s_ptr->brand && !rf_has(r_ptr->flags, s_ptr->resist_flag)) || (s_ptr->monster_flag && rf_has(r_ptr->flags, s_ptr->monster_flag))) { /* compare multipliers to determine best attack */ if ((*best_s_ptr == NULL) || ((*best_s_ptr)->mult < s_ptr->mult)) *best_s_ptr = s_ptr; } } } /** * React to slays which hurt a monster * * \param obj_flags is the set of flags we're testing for slays * \param mon_flags is the set of flags we're adjusting as a result */ void react_to_slay(bitflag *obj_flags, bitflag *mon_flags) { int i; for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(obj_flags, s_ptr->object_flag) && s_ptr->monster_flag) rf_on(mon_flags, s_ptr->monster_flag); } } /** * Check the slay cache for a combination of slays and return a slay value * * \param index is the set of slay flags to look for */ s32b check_slay_cache(bitflag *index) { int i; for (i = 0; !of_is_empty(slay_cache[i].flags); i++) if (of_is_equal(index, slay_cache[i].flags)) break; return slay_cache[i].value; } /** * Fill in a value in the slay cache. Return TRUE if a change is made. * * \param index is the set of slay flags whose value we are adding * \param value is the value of the slay flags in index */ bool fill_slay_cache(bitflag *index, s32b value) { int i; for (i = 0; !of_is_empty(slay_cache[i].flags); i++) { if (of_is_equal(index, slay_cache[i].flags)) { slay_cache[i].value = value; return TRUE; } } return FALSE; } /** * Create a cache of slay combinations found on ego items, and the values of * these combinations. This is to speed up slay_power(), which will be called * many times for ego items during the game. * * \param items is the set of ego types from which we are extracting slay * combinations */ errr create_slay_cache(struct ego_item *items) { int i; int j; int count = 0; bitflag cacheme[OF_SIZE]; bitflag slay_mask[OF_SIZE]; bitflag **dupcheck; ego_item_type *e_ptr; /* Build the slay mask */ create_mask(slay_mask, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); /* Calculate necessary size of slay_cache */ dupcheck = C_ZNEW(z_info->e_max, bitflag *); for (i = 0; i < z_info->e_max; i++) { dupcheck[i] = C_ZNEW(OF_SIZE, bitflag); e_ptr = items + i; /* Find the slay flags on this ego */ of_copy(cacheme, e_ptr->flags); of_inter(cacheme, slay_mask); /* Only consider non-empty combinations of slay flags */ if (!of_is_empty(cacheme)) { /* Skip previously scanned combinations */ for (j = 0; j < i; j++) if (of_is_equal(cacheme, dupcheck[j])) continue; /* msg("Found a new slay combo on an ego item"); */ count++; of_copy(dupcheck[i], cacheme); } } /* Allocate slay_cache with an extra empty element for an iteration stop */ slay_cache = C_ZNEW((count + 1), struct flag_cache); count = 0; /* Populate the slay_cache */ for (i = 0; i < z_info->e_max; i++) { if (!of_is_empty(dupcheck[i])) { of_copy(slay_cache[count].flags, dupcheck[i]); slay_cache[count].value = 0; count++; /*msg("Cached a slay combination");*/ } } for (i = 0; i < z_info->e_max; i++) FREE(dupcheck[i]); FREE(dupcheck); /* Success */ return 0; } void free_slay_cache(void) { mem_free(slay_cache); } angband-v3.3.2/src/object/slays.h0000644000175000017500000000457111651552410016157 0ustar chriscchrisc/* * File: slays.h * Purpose: Structures and functions for dealing with slays and brands * * Copyright (c) 2010 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_SLAYS_H #define INCLUDED_SLAYS_H /* Types of slay (including brands) */ typedef enum { #define SLAY(a, b, c, d, e, f, g, h, i, j) SL_##a, #include "list-slays.h" #undef SLAY SL_MAX } slay_type; /* * Slay type. Used for the table of brands/slays and their effects. */ struct slay { u16b index; /* Numerical index */ int object_flag; /* Object flag for the slay */ int monster_flag; /* Which monster flag(s) make it vulnerable */ int resist_flag; /* Which monster flag(s) make it resist */ int mult; /* Slay multiplier */ const char *range_verb; /* attack verb for ranged hits */ const char *melee_verb; /* attack verb for melee hits */ const char *active_verb; /* verb for when the object is active */ const char *desc; /* description of vulnerable creatures */ const char *brand; /* name of brand */ }; /* * Slay cache. Used for looking up slay values in obj-power.c */ struct flag_cache { bitflag flags[OF_SIZE]; /* Combination of slays and brands */ s32b value; /* Value of this combination */ }; /*** Functions ***/ int dedup_slays(bitflag *flags); const struct slay *random_slay(const bitflag mask[OF_SIZE]); int list_slays(const bitflag flags[OF_SIZE], const bitflag mask[OF_SIZE], const char *desc[], const char *brand[], int mult[], bool dedup); void object_notice_slays(object_type *o_ptr, const bitflag mask[OF_SIZE]); void improve_attack_modifier(object_type *o_ptr, const monster_type *m_ptr, const struct slay **best_s_ptr, bool lore, bool known_only); void react_to_slay(bitflag *obj_flags, bitflag *mon_flags); errr create_slay_cache(struct ego_item *items); s32b check_slay_cache(bitflag *index); bool fill_slay_cache(bitflag *index, s32b value); void free_slay_cache(void); #endif /* INCLUDED_SLAYS_H */ angband-v3.3.2/src/object/inventory.h0000644000175000017500000000026011651552410017050 0ustar chriscchrisc/* object/inventory.h */ #ifndef OBJECT_INVENTORY_H #define OBJECT_INVENTORY_H extern s16b inven_carry(struct player *p, struct object *o); #endif /* !OBJECT_INVENTORY_H */ angband-v3.3.2/src/object/obj-ui.c0000644000175000017500000006527611651552410016215 0ustar chriscchrisc/* * File: obj-ui.c * Purpose: Mainly object descriptions and generic UI functions * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "button.h" #include "tvalsval.h" #include "cmds.h" /* * Display a list of objects. Each object may be prefixed with a label. * Used by show_inven(), show_equip(), and show_floor(). Mode flags are * documented in object.h */ static void show_obj_list(int num_obj, int num_head, char labels[50][80], object_type *objects[50], olist_detail_t mode) { int i, row = 0, col = 0; int attr; size_t max_len = 0; int ex_width = 0, ex_offset, ex_offset_ctr; object_type *o_ptr; char o_name[50][80]; char tmp_val[80]; bool in_term; in_term = (mode & OLIST_WINDOW) ? TRUE : FALSE; if (in_term) max_len = 40; /* Calculate name offset and max name length */ for (i = 0; i < num_obj; i++) { o_ptr = objects[i]; /* Null objects are used to skip lines, or display only a label */ if (!o_ptr || !o_ptr->kind) { if (i < num_head) strnfmt(o_name[i], sizeof(o_name[i]), ""); else strnfmt(o_name[i], sizeof(o_name[i]), "(nothing)"); } else object_desc(o_name[i], sizeof(o_name[i]), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Max length of label + object name */ max_len = MAX(max_len, strlen(labels[i]) + strlen(o_name[i])); } /* Take the quiver message into consideration */ if (mode & OLIST_QUIVER && p_ptr->quiver_slots > 0) max_len = MAX(max_len, 24); /* Width of extra fields */ if (mode & OLIST_WEIGHT) ex_width += 9; if (mode & OLIST_PRICE) ex_width += 9; if (mode & OLIST_FAIL) ex_width += 10; /* Determine beginning row and column */ if (in_term) { /* Term window */ row = 0; col = 0; } else { /* Main window */ row = 1; col = Term->wid - 1 - max_len - ex_width; if (col < 3) col = 0; } /* Column offset of the first extra field */ ex_offset = MIN(max_len, (size_t)(Term->wid - 1 - ex_width - col)); /* Output the list */ for (i = 0; i < num_obj; i++) { o_ptr = objects[i]; /* Clear the line */ prt("", row + i, MAX(col - 2, 0)); /* If we have no label then we won't display anything */ if (!strlen(labels[i])) continue; /* Print the label */ put_str(labels[i], row + i, col); /* Limit object name */ if (strlen(labels[i]) + strlen(o_name[i]) > (size_t)ex_offset) { int truncate = ex_offset - strlen(labels[i]); if (truncate < 0) truncate = 0; if ((size_t)truncate > sizeof(o_name[i]) - 1) truncate = sizeof(o_name[i]) - 1; o_name[i][truncate] = '\0'; } /* Item kind determines the color of the output */ if (o_ptr && o_ptr->kind) attr = tval_to_attr[o_ptr->tval % N_ELEMENTS(tval_to_attr)]; else attr = TERM_SLATE; /* Object name */ c_put_str(attr, o_name[i], row + i, col + strlen(labels[i])); /* If we don't have an object, we can skip the rest of the output */ if (!(o_ptr && o_ptr->kind)) continue; /* Extra fields */ ex_offset_ctr = ex_offset; if (mode & OLIST_PRICE) { int price = price_item(o_ptr, TRUE, o_ptr->number); strnfmt(tmp_val, sizeof(tmp_val), "%6d au", price); put_str(tmp_val, row + i, col + ex_offset_ctr); ex_offset_ctr += 9; } if (mode & OLIST_FAIL) { int fail = (9 + get_use_device_chance(o_ptr)) / 10; if (object_effect_is_known(o_ptr)) strnfmt(tmp_val, sizeof(tmp_val), "%4d%% fail", fail); else my_strcpy(tmp_val, " ? fail", sizeof(tmp_val)); put_str(tmp_val, row + i, col + ex_offset_ctr); ex_offset_ctr += 10; } if (mode & OLIST_WEIGHT) { int weight = o_ptr->weight * o_ptr->number; strnfmt(tmp_val, sizeof(tmp_val), "%4d.%1d lb", weight / 10, weight % 10); put_str(tmp_val, row + i, col + ex_offset_ctr); ex_offset_ctr += 9; } } /* For the inventory: print the quiver count */ if (mode & OLIST_QUIVER) { int count, j; /* Quiver may take multiple lines */ for(j = 0; j < p_ptr->quiver_slots; j++, i++) { const char *fmt = "in Quiver: %d missile%s"; char letter = index_to_label(in_term ? i - 1 : i); /* Number of missiles in this "slot" */ if (j == p_ptr->quiver_slots - 1 && p_ptr->quiver_remainder > 0) count = p_ptr->quiver_remainder; else count = 99; /* Clear the line */ prt("", row + i, MAX(col - 2, 0)); /* Print the (disabled) label */ strnfmt(tmp_val, sizeof(tmp_val), "%c) ", letter); c_put_str(TERM_SLATE, tmp_val, row + i, col); /* Print the count */ strnfmt(tmp_val, sizeof(tmp_val), fmt, count, count == 1 ? "" : "s"); c_put_str(TERM_L_UMBER, tmp_val, row + i, col + 3); } } /* Clear term windows */ if (in_term) { for (; i < Term->hgt; i++) { prt("", row + i, MAX(col - 2, 0)); } } /* Print a drop shadow for the main window if necessary */ else if (i > 0 && row + i < 24) { prt("", row + i, MAX(col - 2, 0)); } } /* * Display the inventory. Builds a list of objects and passes them * off to show_obj_list() for display. Mode flags documented in * object.h */ void show_inven(olist_detail_t mode) { int i, last_slot = -1; int diff = weight_remaining(); object_type *o_ptr; int num_obj = 0; char labels[50][80]; object_type *objects[50]; bool in_term = (mode & OLIST_WINDOW) ? TRUE : FALSE; /* Include burden for term windows */ if (in_term) { strnfmt(labels[num_obj], sizeof(labels[num_obj]), "Burden %d.%d lb (%d.%d lb %s) ", p_ptr->total_weight / 10, p_ptr->total_weight % 10, abs(diff) / 10, abs(diff) % 10, (diff < 0 ? "overweight" : "remaining")); objects[num_obj] = NULL; num_obj++; } /* Find the last occupied inventory slot */ for (i = 0; i < INVEN_PACK; i++) { o_ptr = &p_ptr->inventory[i]; if (o_ptr->kind) last_slot = i; } /* Build the object list */ for (i = 0; i <= last_slot; i++) { o_ptr = &p_ptr->inventory[i]; /* Acceptable items get a label */ if (item_tester_okay(o_ptr)) strnfmt(labels[num_obj], sizeof(labels[num_obj]), "%c) ", index_to_label(i)); /* Unacceptable items are still displayed in term windows */ else if (in_term) my_strcpy(labels[num_obj], " ", sizeof(labels[num_obj])); /* Unacceptable items are skipped in the main window */ else continue; /* Save the object */ objects[num_obj] = o_ptr; num_obj++; } /* Display the object list */ if (in_term) /* Term window starts with a burden header */ show_obj_list(num_obj, 1, labels, objects, mode); else show_obj_list(num_obj, 0, labels, objects, mode); } /* * Display the equipment. Builds a list of objects and passes them * off to show_obj_list() for display. Mode flags documented in * object.h */ void show_equip(olist_detail_t mode) { int i, last_slot = 0; object_type *o_ptr; int num_obj = 0; char labels[50][80]; object_type *objects[50]; char tmp_val[80]; bool in_term = (mode & OLIST_WINDOW) ? TRUE : FALSE; /* Find the last equipment slot to display */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { o_ptr = &p_ptr->inventory[i]; if (i < INVEN_TOTAL || o_ptr->kind) last_slot = i; } /* Build the object list */ for (i = INVEN_WIELD; i <= last_slot; i++) { o_ptr = &p_ptr->inventory[i]; /* May need a blank line to separate the quiver */ if (i == INVEN_TOTAL) { int j; bool need_spacer = FALSE; /* Scan the rest of the items for acceptable entries */ for (j = i; j < last_slot; j++) { o_ptr = &p_ptr->inventory[j]; if (item_tester_okay(o_ptr)) need_spacer = TRUE; } /* Add a spacer between equipment and quiver */ if (num_obj > 0 && need_spacer) { my_strcpy(labels[num_obj], "", sizeof(labels[num_obj])); objects[num_obj] = NULL; num_obj++; } continue; } /* Acceptable items get a label */ if (item_tester_okay(o_ptr)) strnfmt(labels[num_obj], sizeof(labels[num_obj]), "%c) ", index_to_label(i)); /* Unacceptable items are still displayed in term windows */ else if (in_term) my_strcpy(labels[num_obj], " ", sizeof(labels[num_obj])); /* Unacceptable items are skipped in the main window */ else continue; /* Show full slot labels */ strnfmt(tmp_val, sizeof(tmp_val), "%-14s: ", mention_use(i)); my_strcat(labels[num_obj], tmp_val, sizeof(labels[num_obj])); /* Save the object */ objects[num_obj] = o_ptr; num_obj++; } /* Display the object list */ show_obj_list(num_obj, 0, labels, objects, mode); } /* * Display the floor. Builds a list of objects and passes them * off to show_obj_list() for display. Mode flags documented in * object.h */ void show_floor(const int *floor_list, int floor_num, olist_detail_t mode) { int i; object_type *o_ptr; int num_obj = 0; char labels[50][80]; object_type *objects[50]; if (floor_num > MAX_FLOOR_STACK) floor_num = MAX_FLOOR_STACK; /* Build the object list */ for (i = 0; i < floor_num; i++) { o_ptr = object_byid(floor_list[i]); /* Tester always skips gold. When gold should be displayed, * only test items that are not gold. */ if ((o_ptr->tval != TV_GOLD || !(mode & OLIST_GOLD)) && !item_tester_okay(o_ptr)) continue; strnfmt(labels[num_obj], sizeof(labels[num_obj]), "%c) ", index_to_label(i)); /* Save the object */ objects[num_obj] = o_ptr; num_obj++; } /* Display the object list */ show_obj_list(num_obj, 0, labels, objects, mode); } /* * Verify the choice of an item. * * The item can be negative to mean "item on floor". */ bool verify_item(const char *prompt, int item) { char o_name[80]; char out_val[160]; object_type *o_ptr; /* Inventory */ if (item >= 0) { o_ptr = &p_ptr->inventory[item]; } /* Floor */ else { o_ptr = object_byid(0 - item); } /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Prompt */ strnfmt(out_val, sizeof(out_val), "%s %s? ", prompt, o_name); /* Query */ return (get_check(out_val)); } /* * Hack -- allow user to "prevent" certain choices. * * The item can be negative to mean "item on floor". */ static bool get_item_allow(int item, unsigned char ch, bool is_harmless) { object_type *o_ptr; char verify_inscrip[] = "!*"; unsigned n; /* Inventory or floor */ if (item >= 0) o_ptr = &p_ptr->inventory[item]; else o_ptr = object_byid(0 - item); /* Check for a "prevention" inscription */ verify_inscrip[1] = ch; /* Find both sets of inscriptions, add together, and prompt that number of times */ n = check_for_inscrip(o_ptr, verify_inscrip); if (!is_harmless) n += check_for_inscrip(o_ptr, "!*"); while (n--) { if (!verify_item("Really try", item)) return (FALSE); } /* Allow it */ return (TRUE); } /* * Find the "first" inventory object with the given "tag". * * A "tag" is a char "n" appearing as "@n" anywhere in the * inscription of an object. * * Also, the tag "@xn" will work as well, where "n" is a tag-char, * and "x" is the action that tag will work for. */ static int get_tag(int *cp, char tag, cmd_code cmd, bool quiver_tags) { int i; const char *s; /* (f)ire is handled differently from all others, due to the quiver */ if (quiver_tags) { i = QUIVER_START + tag - '0'; if (p_ptr->inventory[i].kind) { *cp = i; return (TRUE); } return (FALSE); } /* Check every object */ for (i = 0; i < ALL_INVEN_TOTAL; ++i) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Skip empty inscriptions */ if (!o_ptr->note) continue; /* Find a '@' */ s = strchr(quark_str(o_ptr->note), '@'); /* Process all tags */ while (s) { /* Check the normal tags */ if (s[1] == tag) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } /* Check the special tags */ if ((cmd_lookup(s[1]) == cmd) && (s[2] == tag)) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } /* Find another '@' */ s = strchr(s + 1, '@'); } } /* No such tag */ return (FALSE); } /* * Let the user select an item, save its "index" * * Return TRUE only if an acceptable item was chosen by the user. * * The selected item must satisfy the "item_tester_hook()" function, * if that hook is set, and the "item_tester_tval", if that value is set. * * All "item_tester" restrictions are cleared before this function returns. * * The user is allowed to choose acceptable items from the equipment, * inventory, or floor, respectively, if the proper flag was given, * and there are any acceptable items in that location. * * The equipment or inventory are displayed (even if no acceptable * items are in that location) if the proper flag was given. * * If there are no acceptable items available anywhere, and "str" is * not NULL, then it will be used as the text of a warning message * before the function returns. * * Note that the user must press "-" to specify the item on the floor, * and there is no way to "examine" the item on the floor, while the * use of "capital" letters will "examine" an inventory/equipment item, * and prompt for its use. * * If a legal item is selected from the inventory, we save it in "cp" * directly (0 to 35), and return TRUE. * * If a legal item is selected from the floor, we save it in "cp" as * a negative (-1 to -511), and return TRUE. * * If no item is available, we do nothing to "cp", and we display a * warning message, using "str" if available, and return FALSE. * * If no item is selected, we do nothing to "cp", and return FALSE. * * Global "p_ptr->command_wrk" is used to choose between equip/inven/floor * listings. It is equal to USE_INVEN or USE_EQUIP or USE_FLOOR, except * when this function is first called, when it is equal to zero, which will * cause it to be set to USE_INVEN. * * We always erase the prompt when we are done, leaving a blank line, * or a warning message, if appropriate, if no items are available. * * Note that only "acceptable" floor objects get indexes, so between two * commands, the indexes of floor objects may change. XXX XXX XXX */ bool get_item(int *cp, const char *pmt, const char *str, cmd_code cmd, int mode) { int py = p_ptr->py; int px = p_ptr->px; unsigned char cmdkey = cmd_lookup_key(cmd); struct keypress which; int j, k; int i1, i2; int e1, e2; int f1, f2; bool done, item; bool oops = FALSE; bool use_inven = ((mode & USE_INVEN) ? TRUE : FALSE); bool use_equip = ((mode & USE_EQUIP) ? TRUE : FALSE); bool use_floor = ((mode & USE_FLOOR) ? TRUE : FALSE); bool use_quiver = ((mode & QUIVER_TAGS) ? TRUE : FALSE); bool is_harmless = ((mode & IS_HARMLESS) ? TRUE : FALSE); bool quiver_tags = ((mode & QUIVER_TAGS) ? TRUE : FALSE); olist_detail_t olist_mode = 0; bool allow_inven = FALSE; bool allow_equip = FALSE; bool allow_floor = FALSE; bool toggle = FALSE; char tmp_val[160]; char out_val[160]; int floor_list[MAX_FLOOR_STACK]; int floor_num; bool show_list = TRUE; /* Object list display modes */ if (mode & SHOW_FAIL) olist_mode |= (OLIST_FAIL); else olist_mode |= (OLIST_WEIGHT); if (mode & SHOW_PRICES) olist_mode |= (OLIST_PRICE); /* Paranoia XXX XXX XXX */ message_flush(); /* Not done */ done = FALSE; /* No item selected */ item = FALSE; /* Full inventory */ i1 = 0; i2 = INVEN_PACK - 1; /* Forbid inventory */ if (!use_inven) i2 = -1; /* Restrict inventory indexes */ while ((i1 <= i2) && (!get_item_okay(i1))) i1++; while ((i1 <= i2) && (!get_item_okay(i2))) i2--; /* Accept inventory */ if (i1 <= i2) allow_inven = TRUE; /* Full equipment */ e1 = INVEN_WIELD; e2 = ALL_INVEN_TOTAL - 1; /* Forbid equipment */ if (!use_equip) e2 = -1; /* Restrict equipment indexes */ while ((e1 <= e2) && (!get_item_okay(e1))) e1++; while ((e1 <= e2) && (!get_item_okay(e2))) e2--; /* Accept equipment */ if (e1 <= e2) allow_equip = TRUE; /* Scan all non-gold objects in the grid */ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), py, px, 0x03); /* Full floor */ f1 = 0; f2 = floor_num - 1; /* Forbid floor */ if (!use_floor) f2 = -1; /* Restrict floor indexes */ while ((f1 <= f2) && (!get_item_okay(0 - floor_list[f1]))) f1++; while ((f1 <= f2) && (!get_item_okay(0 - floor_list[f2]))) f2--; /* Accept floor */ if (f1 <= f2) allow_floor = TRUE; /* Require at least one legal choice */ if (!allow_inven && !allow_equip && !allow_floor) { /* Oops */ oops = TRUE; done = TRUE; } /* Analyze choices */ else { /* Hack -- Start on equipment if requested */ if ((p_ptr->command_wrk == USE_EQUIP) && use_equip) p_ptr->command_wrk = USE_EQUIP; /* If we are using the quiver then start on equipment */ else if (use_quiver) p_ptr->command_wrk = USE_EQUIP; /* Use inventory if allowed */ else if (use_inven) p_ptr->command_wrk = USE_INVEN; /* Use equipment if allowed */ else if (use_equip) p_ptr->command_wrk = USE_EQUIP; /* Use floor if allowed */ else if (use_floor) p_ptr->command_wrk = USE_FLOOR; /* Hack -- Use (empty) inventory */ else p_ptr->command_wrk = USE_INVEN; } /* Start out in "display" mode */ if (show_list) { /* Save screen */ screen_save(); } /* Repeat until done */ while (!done) { int ni = 0; int ne = 0; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { /* Unused */ if (!angband_term[j]) continue; /* Count windows displaying inven */ if (op_ptr->window_flag[j] & (PW_INVEN)) ni++; /* Count windows displaying equip */ if (op_ptr->window_flag[j] & (PW_EQUIP)) ne++; } /* Toggle if needed */ if (((p_ptr->command_wrk == USE_EQUIP) && ni && !ne) || ((p_ptr->command_wrk == USE_INVEN) && !ni && ne)) { /* Toggle */ toggle_inven_equip(); /* Track toggles */ toggle = !toggle; } /* Redraw */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Redraw windows */ redraw_stuff(p_ptr); /* Viewing inventory */ if (p_ptr->command_wrk == USE_INVEN) { /* Redraw if needed */ if (show_list) show_inven(olist_mode); /* Begin the prompt */ strnfmt(out_val, sizeof(out_val), "Inven:"); /* List choices */ if (i1 <= i2) { /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), " %c-%c,", index_to_label(i1), index_to_label(i2)); /* Append */ my_strcat(out_val, tmp_val, sizeof(out_val)); } /* Indicate ability to "view" */ if (!show_list) { my_strcat(out_val, " * to see,", sizeof(out_val)); button_add("[*]", '*'); } /* Indicate legality of "toggle" */ if (use_equip) { my_strcat(out_val, " / for Equip,", sizeof(out_val)); button_add("[/]", '/'); } /* Indicate legality of the "floor" */ if (allow_floor) { my_strcat(out_val, " - for floor,", sizeof(out_val)); button_add("[-]", '-'); } } /* Viewing equipment */ else if (p_ptr->command_wrk == USE_EQUIP) { /* Redraw if needed */ if (show_list) show_equip(olist_mode); /* Begin the prompt */ strnfmt(out_val, sizeof(out_val), "Equip:"); /* List choices */ if (e1 <= e2) { /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), " %c-%c,", index_to_label(e1), index_to_label(e2)); /* Append */ my_strcat(out_val, tmp_val, sizeof(out_val)); } /* Indicate ability to "view" */ if (!show_list) { my_strcat(out_val, " * to see,", sizeof(out_val)); button_add("[*]", '*'); } /* Indicate legality of "toggle" */ if (use_inven) { my_strcat(out_val, " / for Inven,", sizeof(out_val)); button_add("[/]", '/'); } /* Indicate legality of the "floor" */ if (allow_floor) { my_strcat(out_val, " - for floor,", sizeof(out_val)); button_add("[!]", '!'); } } /* Viewing floor */ else { /* Redraw if needed */ if (show_list) show_floor(floor_list, floor_num, olist_mode); /* Begin the prompt */ strnfmt(out_val, sizeof(out_val), "Floor:"); /* List choices */ if (f1 <= f2) { /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), " %c-%c,", I2A(f1), I2A(f2)); /* Append */ my_strcat(out_val, tmp_val, sizeof(out_val)); } /* Indicate ability to "view" */ if (!show_list) { my_strcat(out_val, " * to see,", sizeof(out_val)); button_add("[*]", '*'); } /* Append */ if (use_inven) { my_strcat(out_val, " / for Inven,", sizeof(out_val)); button_add("[/]", '/'); } /* Append */ else if (use_equip) { my_strcat(out_val, " / for Equip,", sizeof(out_val)); button_add("[/]", '/'); } } redraw_stuff(p_ptr); /* Finish the prompt */ my_strcat(out_val, " ESC", sizeof(out_val)); /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), "(%s) %s", out_val, pmt); /* Show the prompt */ prt(tmp_val, 0, 0); /* Get a key */ which = inkey(); /* Parse it */ switch (which.code) { case ESCAPE: { done = TRUE; break; } case '/': { /* Toggle to inventory */ if (use_inven && (p_ptr->command_wrk != USE_INVEN)) { p_ptr->command_wrk = USE_INVEN; } /* Toggle to equipment */ else if (use_equip && (p_ptr->command_wrk != USE_EQUIP)) { p_ptr->command_wrk = USE_EQUIP; } /* No toggle allowed */ else { bell("Cannot switch item selector!"); break; } /* Hack -- Fix screen */ if (show_list) { /* Load screen */ screen_load(); /* Save screen */ screen_save(); } /* Need to redraw */ break; } case '-': { /* Paranoia */ if (!allow_floor) { bell("Cannot select floor!"); break; } /* There is only one item */ if (floor_num == 1) { /* Auto-select */ if (p_ptr->command_wrk == (USE_FLOOR)) { /* Special index */ k = 0 - floor_list[0]; /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } } /* Hack -- Fix screen */ if (show_list) { /* Load screen */ screen_load(); /* Save screen */ screen_save(); } p_ptr->command_wrk = (USE_FLOOR); #if 0 /* Check each legal object */ for (i = 0; i < floor_num; ++i) { /* Special index */ k = 0 - floor_list[i]; /* Skip non-okay objects */ if (!get_item_okay(k)) continue; /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, is_harmless)) continue; /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } #endif break; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { /* Look up the tag */ if (!get_tag(&k, which.code, cmd, quiver_tags)) { bell("Illegal object choice (tag)!"); break; } /* Hack -- Validate the item */ if ((k < INVEN_WIELD) ? !allow_inven : !allow_equip) { bell("Illegal object choice (tag)!"); break; } /* Validate the item */ if (!get_item_okay(k)) { bell("Illegal object choice (tag)!"); break; } /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } case '\n': case '\r': { /* Choose "default" inventory item */ if (p_ptr->command_wrk == USE_INVEN) { if (i1 != i2) { bell("Illegal object choice (default)!"); break; } k = i1; } /* Choose the "default" slot (0) of the quiver */ else if (quiver_tags) k = e1; /* Choose "default" equipment item */ else if (p_ptr->command_wrk == USE_EQUIP) { if (e1 != e2) { bell("Illegal object choice (default)!"); break; } k = e1; } /* Choose "default" floor item */ else { if (f1 != f2) { bell("Illegal object choice (default)!"); break; } k = 0 - floor_list[f1]; } /* Validate the item */ if (!get_item_okay(k)) { bell("Illegal object choice (default)!"); break; } /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } default: { bool verify; /* Note verify */ verify = (isupper((unsigned char)which.code) ? TRUE : FALSE); /* Lowercase */ which.code = tolower((unsigned char)which.code); /* Convert letter to inventory index */ if (p_ptr->command_wrk == USE_INVEN) { k = label_to_inven(which.code); if (k < 0) { bell("Illegal object choice (inven)!"); break; } } /* Convert letter to equipment index */ else if (p_ptr->command_wrk == USE_EQUIP) { k = label_to_equip(which.code); if (k < 0) { bell("Illegal object choice (equip)!"); break; } } /* Convert letter to floor index */ else { k = (islower((unsigned char)which.code) ? A2I((unsigned char)which.code) : -1); if (k < 0 || k >= floor_num) { bell("Illegal object choice (floor)!"); break; } /* Special index */ k = 0 - floor_list[k]; } /* Validate the item */ if (!get_item_okay(k)) { bell("Illegal object choice (normal)!"); break; } /* Verify the item */ if (verify && !verify_item("Try", k)) { done = TRUE; break; } /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } } } /* Fix the screen if necessary */ if (show_list) { /* Load screen */ screen_load(); /* Hack -- Cancel "display" */ show_list = FALSE; } /* Kill buttons */ button_kill('*'); button_kill('/'); button_kill('-'); button_kill('!'); redraw_stuff(p_ptr); /* Forget the item_tester_tval restriction */ item_tester_tval = 0; /* Forget the item_tester_hook restriction */ item_tester_hook = NULL; /* Toggle again if needed */ if (toggle) toggle_inven_equip(); /* Update */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); redraw_stuff(p_ptr); /* Clear the prompt line */ prt("", 0, 0); /* Warning if needed */ if (oops && str) msg("%s", str); /* Result */ return (item); } angband-v3.3.2/src/object/obj-info.c0000644000175000017500000010347611651552410016526 0ustar chriscchrisc/** * File: obj-info.c * Purpose: Object description code. * * Copyright (c) 2010 Andi Sidwell * Copyright (c) 2004 Robert Ruehlmann * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "effects.h" #include "cmds.h" #include "object/tvalsval.h" #include "z-textblock.h" #include "object/slays.h" #include "object/pval.h" /* * Describes a flag-name pair. */ typedef struct { int flag; const char *name; } flag_type; /*** Utility code ***/ /* * Given an array of strings, as so: * { "intelligence", "fish", "lens", "prime", "number" }, * * ... output a list like "intelligence, fish, lens, prime, number.\n". */ static void info_out_list(textblock *tb, const char *list[], size_t count) { size_t i; for (i = 0; i < count; i++) { textblock_append(tb, list[i]); if (i != (count - 1)) textblock_append(tb, ", "); } textblock_append(tb, ".\n"); } /* * */ static size_t info_collect(textblock *tb, const flag_type list[], size_t max, const bitflag flags[OF_SIZE], const char *recepticle[]) { size_t i, count = 0; for (i = 0; i < max; i++) { if (of_has(flags, list[i].flag)) recepticle[count++] = list[i].name; } return count; } /*** Big fat data tables ***/ static const flag_type pval_flags[] = { { OF_STR, "strength" }, { OF_INT, "intelligence" }, { OF_WIS, "wisdom" }, { OF_DEX, "dexterity" }, { OF_CON, "constitution" }, { OF_CHR, "charisma" }, { OF_STEALTH, "stealth" }, { OF_INFRA, "infravision" }, { OF_TUNNEL, "tunneling" }, { OF_SPEED, "speed" }, { OF_BLOWS, "attack speed" }, { OF_SHOTS, "shooting speed" }, { OF_MIGHT, "shooting power" }, }; static const flag_type immunity_flags[] = { { OF_IM_ACID, "acid" }, { OF_IM_ELEC, "lightning" }, { OF_IM_FIRE, "fire" }, { OF_IM_COLD, "cold" }, }; static const flag_type vuln_flags[] = { { OF_VULN_ACID, "acid" }, { OF_VULN_ELEC, "electricity" }, { OF_VULN_FIRE, "fire" }, { OF_VULN_COLD, "cold" }, }; static const flag_type resist_flags[] = { { OF_RES_ACID, "acid" }, { OF_RES_ELEC, "lightning" }, { OF_RES_FIRE, "fire" }, { OF_RES_COLD, "cold" }, { OF_RES_POIS, "poison" }, { OF_RES_LIGHT, "light" }, { OF_RES_DARK, "dark" }, { OF_RES_SOUND, "sound" }, { OF_RES_SHARD, "shards" }, { OF_RES_NEXUS, "nexus" }, { OF_RES_NETHR, "nether" }, { OF_RES_CHAOS, "chaos" }, { OF_RES_DISEN, "disenchantment" }, }; static const flag_type protect_flags[] = { { OF_RES_FEAR, "fear" }, { OF_RES_BLIND, "blindness" }, { OF_RES_CONFU, "confusion" }, { OF_RES_STUN, "stunning" }, }; static const flag_type ignore_flags[] = { { OF_IGNORE_ACID, "acid" }, { OF_IGNORE_ELEC, "electricity" }, { OF_IGNORE_FIRE, "fire" }, { OF_IGNORE_COLD, "cold" }, }; static const flag_type sustain_flags[] = { { OF_SUST_STR, "strength" }, { OF_SUST_INT, "intelligence" }, { OF_SUST_WIS, "wisdom" }, { OF_SUST_DEX, "dexterity" }, { OF_SUST_CON, "constitution" }, { OF_SUST_CHR, "charisma" }, }; static const flag_type misc_flags[] = { { OF_BLESSED, "Blessed by the gods" }, { OF_SLOW_DIGEST, "Slows your metabolism" }, { OF_IMPAIR_HP, "Impairs hitpoint recovery" }, { OF_IMPAIR_MANA, "Impairs mana recovery" }, { OF_AFRAID, "Makes you afraid of melee, and worse at shooting and casting spells" }, { OF_FEATHER, "Feather Falling" }, { OF_REGEN, "Speeds regeneration" }, { OF_FREE_ACT, "Prevents paralysis" }, { OF_HOLD_LIFE, "Sustains your life force" }, { OF_TELEPATHY, "Grants telepathy" }, { OF_SEE_INVIS, "Grants the ability to see invisible things" }, { OF_AGGRAVATE, "Aggravates creatures nearby" }, { OF_DRAIN_EXP, "Drains experience" }, { OF_TELEPORT, "Induces random teleportation" }, }; /*** Code that makes use of the data tables ***/ /* * Describe an item's curses. */ static bool describe_curses(textblock *tb, const object_type *o_ptr, const bitflag flags[OF_SIZE]) { if (of_has(flags, OF_PERMA_CURSE)) textblock_append_c(tb, TERM_L_RED, "Permanently cursed.\n"); else if (of_has(flags, OF_HEAVY_CURSE)) textblock_append_c(tb, TERM_L_RED, "Heavily cursed.\n"); else if (of_has(flags, OF_LIGHT_CURSE)) textblock_append_c(tb, TERM_L_RED, "Cursed.\n"); else return FALSE; return TRUE; } /* * Describe stat modifications. */ static bool describe_stats(textblock *tb, const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE], oinfo_detail_t mode) { const char *descs[N_ELEMENTS(pval_flags)]; size_t count, i; bool full = mode & OINFO_FULL; bool dummy = mode & OINFO_DUMMY; bool search = FALSE; if (!o_ptr->num_pvals && !dummy) return FALSE; for (i = 0; i < o_ptr->num_pvals; i++) { count = info_collect(tb, pval_flags, N_ELEMENTS(pval_flags), flags[i], descs); if (count) { if ((object_this_pval_is_visible(o_ptr, i) || full) && !dummy) textblock_append_c(tb, (o_ptr->pval[i] > 0) ? TERM_L_GREEN : TERM_RED, "%+i ", o_ptr->pval[i]); else textblock_append(tb, "Affects your "); info_out_list(tb, descs, count); } if (of_has(flags[i], OF_SEARCH)) search = TRUE; } if (search) { if ((object_this_pval_is_visible(o_ptr, which_pval(o_ptr, OF_SEARCH)) || full) && !dummy) { textblock_append_c(tb, (o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] > 0) ? TERM_L_GREEN : TERM_RED, "%+i%% ", o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] * 5); textblock_append(tb, "to searching.\n"); } else if (count) textblock_append(tb, "Also affects your searching skill.\n"); else textblock_append(tb, "Affects your searching skill.\n"); } return TRUE; } /* * Describe immunities granted by an object. */ static bool describe_immune(textblock *tb, const bitflag flags[OF_SIZE]) { const char *i_descs[N_ELEMENTS(immunity_flags)]; const char *r_descs[N_ELEMENTS(resist_flags)]; const char *p_descs[N_ELEMENTS(protect_flags)]; const char *v_descs[N_ELEMENTS(vuln_flags)]; size_t count; bool prev = FALSE; /* Immunities */ count = info_collect(tb, immunity_flags, N_ELEMENTS(immunity_flags), flags, i_descs); if (count) { textblock_append(tb, "Provides immunity to "); info_out_list(tb, i_descs, count); prev = TRUE; } /* Resistances */ count = info_collect(tb, resist_flags, N_ELEMENTS(resist_flags), flags, r_descs); if (count) { textblock_append(tb, "Provides resistance to "); info_out_list(tb, r_descs, count); prev = TRUE; } /* Protections */ count = info_collect(tb, protect_flags, N_ELEMENTS(protect_flags), flags, p_descs); if (count) { textblock_append(tb, "Provides protection from "); info_out_list(tb, p_descs, count); prev = TRUE; } /* Vulnerabilities */ count = info_collect(tb, vuln_flags, N_ELEMENTS(vuln_flags), flags, v_descs); if (count) { textblock_append(tb, "Makes you vulnerable to "); info_out_list(tb, v_descs, count); prev = TRUE; } return prev; } /* * Describe 'ignores' of an object. */ static bool describe_ignores(textblock *tb, const bitflag flags[OF_SIZE]) { const char *descs[N_ELEMENTS(ignore_flags)]; size_t count = info_collect(tb, ignore_flags, N_ELEMENTS(ignore_flags), flags, descs); if (!count) return FALSE; textblock_append(tb, "Cannot be harmed by "); info_out_list(tb, descs, count); return TRUE; } /* * Describe stat sustains. */ static bool describe_sustains(textblock *tb, const bitflag flags[OF_SIZE]) { const char *descs[N_ELEMENTS(sustain_flags)]; size_t count = info_collect(tb, sustain_flags, N_ELEMENTS(sustain_flags), flags, descs); if (!count) return FALSE; textblock_append(tb, "Sustains "); info_out_list(tb, descs, count); return TRUE; } /* * Describe miscellaneous powers. */ static bool describe_misc_magic(textblock *tb, const bitflag flags[OF_SIZE]) { size_t i; bool printed = FALSE; for (i = 0; i < N_ELEMENTS(misc_flags); i++) { if (of_has(flags, misc_flags[i].flag)) { textblock_append(tb, "%s. ", misc_flags[i].name); printed = TRUE; } } if (printed) textblock_append(tb, "\n"); return printed; } /* * Describe slays and brands on weapons */ static bool describe_slays(textblock *tb, const bitflag flags[OF_SIZE], int tval) { bool printed = FALSE; const char *slay_descs[SL_MAX] = { 0 }; bitflag slay_mask[OF_SIZE], kill_mask[OF_SIZE], brand_mask[OF_SIZE]; size_t count; bool fulldesc; create_mask(slay_mask, FALSE, OFT_SLAY, OFT_MAX); create_mask(kill_mask, FALSE, OFT_KILL, OFT_MAX); create_mask(brand_mask, FALSE, OFT_BRAND, OFT_MAX); if (tval == TV_SWORD || tval == TV_HAFTED || tval == TV_POLEARM || tval == TV_DIGGING || tval == TV_BOW || tval == TV_SHOT || tval == TV_ARROW || tval == TV_BOLT || tval == TV_FLASK) fulldesc = FALSE; else fulldesc = TRUE; /* Slays */ count = list_slays(flags, slay_mask, slay_descs, NULL, NULL, TRUE); if (count) { if (fulldesc) textblock_append(tb, "It causes your melee attacks to slay "); else textblock_append(tb, "Slays "); info_out_list(tb, slay_descs, count); printed = TRUE; } /* Kills */ count = list_slays(flags, kill_mask, slay_descs, NULL, NULL, TRUE); if (count) { if (fulldesc) textblock_append(tb, "It causes your melee attacks to *slay* "); else textblock_append(tb, "*Slays* "); info_out_list(tb, slay_descs, count); printed = TRUE; } /* Brands */ count = list_slays(flags, brand_mask, NULL, slay_descs, NULL, TRUE); if (count) { if (fulldesc) textblock_append(tb, "It brands your melee attacks with "); else textblock_append(tb, "Branded with "); info_out_list(tb, slay_descs, count); printed = TRUE; } return printed; } /* * Account for criticals in the calculation of melee prowess * * Note -- This relies on the criticals being an affine function * of previous damage, since we are used to transform the mean * of a roll. * * Also note -- rounding error makes this not completely accurate * (but for the big crit weapons like Grond an odd point of damage * won't be missed) * * This code written according to the KISS principle. 650 adds * are cheaper than a FOV call and get the job done fine. */ static void calculate_melee_crits(player_state *state, int weight, int plus, int *mult, int *add, int *div) { int k, to_crit = weight + 5*(state->to_h + plus) + 3*p_ptr->lev; to_crit = MIN(5000, MAX(0, to_crit)); *mult = *add = 0; for (k = weight; k < weight + 650; k++) { if (k < 400) { *mult += 4; *add += 10; continue; } if (k < 700) { *mult += 4; *add += 20; continue; } if (k < 900) { *mult += 6; *add += 30; continue; } if (k < 1300) { *mult += 6; *add += 40; continue; } *mult += 7; *add += 50; } /* * Scale the output down to a more reasonable size, to prevent * integer overflow downstream. */ *mult = 100 + to_crit*(*mult - 1300)/(50*1300); *add = *add * to_crit / (500*50); *div = 100; } /* * Missile crits follow the same approach as melee crits. */ static void calculate_missile_crits(player_state *state, int weight, int plus, int *mult, int *add, int *div) { int k, to_crit = weight + 4*(state->to_h + plus) + 2*p_ptr->lev; to_crit = MIN(5000, MAX(0, to_crit)); *mult = *add = 0; for (k = weight; k < weight + 500; k++) { if (k < 500) { *mult += 2; *add += 5; continue; } if (k < 1000) { *mult += 2; *add += 10; continue; } *mult += 3; *add += 15; } *mult = 100 + to_crit*(*mult - 500)/(500*50); *add = *add * to_crit / (500*50); *div = 100; } /* * Describe combat advantages. */ static bool describe_combat(textblock *tb, const object_type *o_ptr, oinfo_detail_t mode) { bool full = mode & OINFO_FULL; const char *desc[SL_MAX] = { 0 }; int i; int mult[SL_MAX]; int cnt, dam, total_dam, plus = 0; int xtra_postcrit = 0, xtra_precrit = 0; int crit_mult, crit_div, crit_add; int str_plus, dex_plus, old_blows = 0, new_blows, extra_blows; int str_faster = -1, str_done = -1; object_type *bow = &p_ptr->inventory[INVEN_BOW]; bitflag f[OF_SIZE], tmp_f[OF_SIZE], mask[OF_SIZE]; bool weapon = (wield_slot(o_ptr) == INVEN_WIELD); bool ammo = (p_ptr->state.ammo_tval == o_ptr->tval) && (bow->kind); int multiplier = 1; /* Create the "all slays" mask */ create_mask(mask, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); /* Abort if we've nothing to say */ if (mode & OINFO_DUMMY) return FALSE; if (!weapon && !ammo) { /* Potions can have special text */ if (o_ptr->tval != TV_POTION || o_ptr->dd == 0 || o_ptr->ds == 0 || !object_flavor_is_aware(o_ptr)) return FALSE; textblock_append(tb, "It can be thrown at creatures with damaging effect.\n"); return TRUE; } if (full) { object_flags(o_ptr, f); } else { object_flags_known(o_ptr, f); } textblock_append_c(tb, TERM_L_WHITE, "Combat info:\n"); if (weapon) { /* * Get the player's hypothetical state, were they to be * wielding this item. */ player_state state; int dex_plus_bound; int str_plus_bound; object_type inven[INVEN_TOTAL]; memcpy(inven, p_ptr->inventory, INVEN_TOTAL * sizeof(object_type)); inven[INVEN_WIELD] = *o_ptr; if (full) object_know_all_flags(&inven[INVEN_WIELD]); calc_bonuses(inven, &state, TRUE); dex_plus_bound = STAT_RANGE - state.stat_ind[A_DEX]; str_plus_bound = STAT_RANGE - state.stat_ind[A_STR]; dam = ((o_ptr->ds + 1) * o_ptr->dd * 5); xtra_postcrit = state.dis_to_d * 10; if (object_attack_plusses_are_visible(o_ptr)) { xtra_precrit += o_ptr->to_d * 10; plus += o_ptr->to_h; } calculate_melee_crits(&state, o_ptr->weight, plus, &crit_mult, &crit_add, &crit_div); /* Warn about heavy weapons */ if (adj_str_hold[state.stat_ind[A_STR]] < o_ptr->weight / 10) textblock_append_c(tb, TERM_L_RED, "You are too weak to use this weapon.\n"); textblock_append_c(tb, TERM_L_GREEN, "%d.%d ", state.num_blows / 100, (state.num_blows / 10) % 10); textblock_append(tb, "blow%s/round.\n", (state.num_blows > 100) ? "s" : ""); /* Check to see if extra STR or DEX would yield extra blows */ old_blows = state.num_blows; extra_blows = 0; /* First we need to look for extra blows on other items, as * state does not track these */ for (i = INVEN_BOW; i < INVEN_TOTAL; i++) { if (!p_ptr->inventory[i].kind) continue; object_flags_known(&p_ptr->inventory[i], tmp_f); if (of_has(tmp_f, OF_BLOWS)) extra_blows += p_ptr->inventory[i].pval[which_pval(&p_ptr->inventory[i], OF_BLOWS)]; } /* Then we add blows from the weapon being examined */ if (of_has(f, OF_BLOWS)) extra_blows += o_ptr->pval[which_pval(o_ptr, OF_BLOWS)]; /* Then we check for extra "real" blows */ for (dex_plus = 0; dex_plus < dex_plus_bound; dex_plus++) { for (str_plus = 0; str_plus < str_plus_bound; str_plus++) { state.stat_ind[A_STR] += str_plus; state.stat_ind[A_DEX] += dex_plus; new_blows = calc_blows(o_ptr, &state, extra_blows); /* Test to make sure that this extra blow is a * new str/dex combination, not a repeat */ if ((new_blows - new_blows % 10) > (old_blows - old_blows % 10) && (str_plus < str_done || str_done == -1)) { textblock_append(tb, "With +%d STR and +%d DEX you would get %d.%d blows\n", str_plus, dex_plus, (new_blows / 100), (new_blows / 10) % 10); state.stat_ind[A_STR] -= str_plus; state.stat_ind[A_DEX] -= dex_plus; str_done = str_plus; break; } /* If the combination doesn't increment * the displayed blows number, it might still * take a little less energy */ if (new_blows > old_blows && (str_plus < str_faster || str_faster == -1) && (str_plus < str_done || str_done == -1)) { textblock_append(tb, "With +%d STR and +%d DEX you would attack a bit faster\n", str_plus, dex_plus); state.stat_ind[A_STR] -= str_plus; state.stat_ind[A_DEX] -= dex_plus; str_faster = str_plus; continue; } state.stat_ind[A_STR] -= str_plus; state.stat_ind[A_DEX] -= dex_plus; } } } else { int tdis = 6 + 2 * p_ptr->state.ammo_mult; if (object_attack_plusses_are_visible(o_ptr)) plus += o_ptr->to_h; calculate_missile_crits(&p_ptr->state, o_ptr->weight, plus, &crit_mult, &crit_add, &crit_div); /* Calculate damage */ dam = ((o_ptr->ds + 1) * o_ptr->dd * 5); if (object_attack_plusses_are_visible(o_ptr)) dam += (o_ptr->to_d * 10); if (object_attack_plusses_are_visible(bow)) dam += (bow->to_d * 10); /* Apply brands/slays from the shooter to the ammo, but only if known * Note that this is not dependent on mode, so that viewing shop-held * ammo (fully known) does not leak information about launcher */ object_flags_known(bow, tmp_f); of_union(f, tmp_f); textblock_append(tb, "Hits targets up to "); textblock_append_c(tb, TERM_L_GREEN, format("%d", tdis * 10)); textblock_append(tb, " feet away.\n"); } /* Collect slays */ /* Melee weapons get slays and brands from other items now */ if (weapon) { bool nonweap = FALSE; for (i = INVEN_LEFT; i < INVEN_TOTAL; i++) { if (!p_ptr->inventory[i].kind) continue; object_flags_known(&p_ptr->inventory[i], tmp_f); of_inter(tmp_f, mask); /* strip out non-slays */ if (of_union(f, tmp_f)) nonweap = TRUE; } if (nonweap) textblock_append(tb, "This weapon may benefit from one or more off-weapon brands or slays.\n"); } textblock_append(tb, "Average damage/round: "); if (ammo) multiplier = p_ptr->state.ammo_mult; cnt = list_slays(f, mask, desc, NULL, mult, TRUE); for (i = 0; i < cnt; i++) { int melee_adj_mult = ammo ? 0 : 1; /* ammo mult adds fully, melee mult is times 1, so adds 1 less */ /* Include bonus damage and slay in stated average */ total_dam = dam * (multiplier + mult[i] - melee_adj_mult) + xtra_precrit; total_dam = (total_dam * crit_mult + crit_add) / crit_div; total_dam += xtra_postcrit; if (weapon) total_dam = (total_dam * old_blows) / 100; else total_dam *= p_ptr->state.num_shots; if (total_dam <= 0) textblock_append_c(tb, TERM_L_RED, "%d", 0); else if (total_dam % 10) textblock_append_c(tb, TERM_L_GREEN, "%d.%d", total_dam / 10, total_dam % 10); else textblock_append_c(tb, TERM_L_GREEN, "%d", total_dam / 10); textblock_append(tb, " vs. %s, ", desc[i]); } if (cnt) textblock_append(tb, "and "); /* Include bonus damage in stated average */ total_dam = dam * multiplier + xtra_precrit; total_dam = (total_dam * crit_mult + crit_add) / crit_div; total_dam += xtra_postcrit; if (weapon) total_dam = (total_dam * old_blows) / 100; else total_dam *= p_ptr->state.num_shots; if (total_dam <= 0) textblock_append_c(tb, TERM_L_RED, "%d", 0); else if (total_dam % 10) textblock_append_c(tb, TERM_L_GREEN, "%d.%d", total_dam / 10, total_dam % 10); else textblock_append_c(tb, TERM_L_GREEN, "%d", total_dam / 10); if (cnt) textblock_append(tb, " vs. others"); textblock_append(tb, ".\n"); /* Note the impact flag */ if (of_has(f, OF_IMPACT)) textblock_append(tb, "Sometimes creates earthquakes on impact.\n"); /* Add breakage chance */ if (ammo) { int chance = breakage_chance(o_ptr, TRUE); textblock_append_c(tb, TERM_L_GREEN, "%d%%", chance); textblock_append(tb, " chance of breaking upon contact.\n"); } /* You always have something to say... */ return TRUE; } /* * Describe objects that can be used for digging. */ static bool describe_digger(textblock *tb, const object_type *o_ptr, oinfo_detail_t mode) { bool full = mode & OINFO_FULL; player_state st; object_type inven[INVEN_TOTAL]; int sl = wield_slot(o_ptr); int i; bitflag f[OF_SIZE]; int chances[4]; /* These are out of 1600 */ static const char *names[4] = { "rubble", "magma veins", "quartz veins", "granite" }; /* abort if we are a dummy object */ if (mode & OINFO_DUMMY) return FALSE; if (full) object_flags(o_ptr, f); else object_flags_known(o_ptr, f); if (sl < 0 || (sl != INVEN_WIELD && !of_has(f, OF_TUNNEL))) return FALSE; memcpy(inven, p_ptr->inventory, INVEN_TOTAL * sizeof(object_type)); /* * Hack -- if we examine a ring that is worn on the right finger, * we shouldn't put a copy of it on the left finger before calculating * digging skills. */ if (o_ptr != &p_ptr->inventory[INVEN_RIGHT]) inven[sl] = *o_ptr; calc_bonuses(inven, &st, TRUE); chances[0] = st.skills[SKILL_DIGGING] * 8; chances[1] = (st.skills[SKILL_DIGGING] - 10) * 4; chances[2] = (st.skills[SKILL_DIGGING] - 20) * 2; chances[3] = (st.skills[SKILL_DIGGING] - 40) * 1; for (i = 0; i < 4; i++) { int chance = MAX(0, MIN(1600, chances[i])); int decis = chance ? (16000 / chance) : 0; if (i == 0 && chance > 0) { if (sl == INVEN_WIELD) textblock_append(tb, "Clears "); else textblock_append(tb, "With this item, your current weapon clears "); } if (i == 3 || (i != 0 && chance == 0)) textblock_append(tb, "and "); if (chance == 0) { textblock_append_c(tb, TERM_L_RED, "doesn't affect "); textblock_append(tb, "%s.\n", names[i]); break; } textblock_append(tb, "%s in ", names[i]); if (chance == 1600) { textblock_append_c(tb, TERM_L_GREEN, "1 "); } else if (decis < 100) { textblock_append_c(tb, TERM_GREEN, "%d.%d ", decis/10, decis%10); } else { textblock_append_c(tb, (decis < 1000) ? TERM_YELLOW : TERM_RED, "%d ", (decis+5)/10); } textblock_append(tb, "turn%s%s", decis == 10 ? "" : "s", (i == 3) ? ".\n" : ", "); } return TRUE; } static bool describe_food(textblock *tb, const object_type *o_ptr, bool subjective, bool full) { /* Describe boring bits */ if ((o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION) && o_ptr->pval[DEFAULT_PVAL]) { /* Sometimes adjust for player speed */ int multiplier = extract_energy[p_ptr->state.speed]; if (!subjective) multiplier = 10; if (object_is_known(o_ptr) || full) { textblock_append(tb, "Nourishes for around "); textblock_append_c(tb, TERM_L_GREEN, "%d", (o_ptr->pval[DEFAULT_PVAL] / 2) * multiplier / 10); textblock_append(tb, " turns.\n"); } else { textblock_append(tb, "Provides some nourishment.\n"); } return TRUE; } return FALSE; } /* * Describe things that look like lights. */ static bool describe_light(textblock *tb, const object_type *o_ptr, const bitflag flags[OF_SIZE], bool terse) { int rad = 0; bool artifact = o_ptr->artifact ? TRUE : FALSE; bool no_fuel = of_has(flags, OF_NO_FUEL) ? TRUE : FALSE; bool is_light = (o_ptr->tval == TV_LIGHT) ? TRUE : FALSE; if (o_ptr->tval != TV_LIGHT && !of_has(flags, OF_LIGHT)) return FALSE; /* Work out radius */ if (artifact && is_light) rad = 3; else if (is_light) rad = 2; if (of_has(flags, OF_LIGHT)) rad++; /* Describe here */ textblock_append(tb, "Radius "); textblock_append_c(tb, TERM_L_GREEN, format("%d", rad)); if (no_fuel && !artifact) textblock_append(tb, " light. No fuel required."); else if (is_light && o_ptr->sval == SV_LIGHT_TORCH) textblock_append(tb, " light, reduced when running out of fuel."); else textblock_append(tb, " light."); if (!terse && is_light && !no_fuel) { const char *name = (o_ptr->sval == SV_LIGHT_TORCH) ? "torches" : "lanterns"; int turns = (o_ptr->sval == SV_LIGHT_TORCH) ? FUEL_TORCH : FUEL_LAMP; textblock_append(tb, " Refills other %s up to %d turns of fuel.", name, turns); } textblock_append(tb, "\n"); return TRUE; } /* * Describe an object's effect, if any. */ static bool describe_effect(textblock *tb, const object_type *o_ptr, bool full, bool only_artifacts, bool subjective) { const char *desc; random_value timeout = {0, 0, 0, 0}; int effect = 0, fail; if (o_ptr->artifact) { if (object_effect_is_known(o_ptr) || full) { effect = o_ptr->artifact->effect; timeout = o_ptr->artifact->time; } else if (object_effect(o_ptr)) { textblock_append(tb, "It can be activated.\n"); return TRUE; } } else { /* Sometimes only print artifact activation info */ if (only_artifacts == TRUE) return FALSE; if (object_effect_is_known(o_ptr) || full) { effect = o_ptr->kind->effect; timeout = o_ptr->kind->time; } else if (object_effect(o_ptr) != 0) { if (effect_aim(o_ptr->kind->effect)) textblock_append(tb, "It can be aimed.\n"); else if (o_ptr->tval == TV_FOOD) textblock_append(tb, "It can be eaten.\n"); else if (o_ptr->tval == TV_POTION) textblock_append(tb, "It can be drunk.\n"); else if (o_ptr->tval == TV_SCROLL) textblock_append(tb, "It can be read.\n"); else textblock_append(tb, "It can be activated.\n"); return TRUE; } } /* Forget it without an effect */ if (!effect) return FALSE; /* Obtain the description */ desc = effect_desc(effect); if (!desc) return FALSE; if (effect_aim(effect)) textblock_append(tb, "When aimed, it "); else if (o_ptr->tval == TV_FOOD) textblock_append(tb, "When eaten, it "); else if (o_ptr->tval == TV_POTION) textblock_append(tb, "When drunk, it "); else if (o_ptr->tval == TV_SCROLL) textblock_append(tb, "When read, it "); else textblock_append(tb, "When activated, it "); /* Print a colourised description */ do { if (isdigit((unsigned char) *desc)) textblock_append_c(tb, TERM_L_GREEN, "%c", *desc); else textblock_append(tb, "%c", *desc); } while (*desc++); textblock_append(tb, ".\n"); if (randcalc(timeout, 0, MAXIMISE) > 0) { int min_time, max_time; /* Sometimes adjust for player speed */ int multiplier = extract_energy[p_ptr->state.speed]; if (!subjective) multiplier = 10; textblock_append(tb, "Takes "); /* Correct for player speed */ min_time = randcalc(timeout, 0, MINIMISE) * multiplier / 10; max_time = randcalc(timeout, 0, MAXIMISE) * multiplier / 10; textblock_append_c(tb, TERM_L_GREEN, "%d", min_time); if (min_time != max_time) { textblock_append(tb, " to "); textblock_append_c(tb, TERM_L_GREEN, "%d", max_time); } textblock_append(tb, " turns to recharge"); if (subjective && p_ptr->state.speed != 110) textblock_append(tb, " at your current speed"); textblock_append(tb, ".\n"); } if (!subjective || o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION || o_ptr->tval == TV_SCROLL) { return TRUE; } else { fail = get_use_device_chance(o_ptr); textblock_append(tb, "Your chance of success is %d.%d%%\n", (1000 - fail) / 10, (1000 - fail) % 10); } return TRUE; } static bool describe_origin(textblock *tb, const object_type *o_ptr) { char origin_text[80]; if (o_ptr->origin_depth) strnfmt(origin_text, sizeof(origin_text), "%d feet (level %d)", o_ptr->origin_depth * 50, o_ptr->origin_depth); else my_strcpy(origin_text, "town", sizeof(origin_text)); switch (o_ptr->origin) { case ORIGIN_NONE: case ORIGIN_MIXED: case ORIGIN_STOLEN: return FALSE; case ORIGIN_BIRTH: textblock_append(tb, "An inheritance from your family.\n"); break; case ORIGIN_STORE: textblock_append(tb, "Bought from a store.\n"); break; case ORIGIN_FLOOR: textblock_append(tb, "Found lying on the floor %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; case ORIGIN_PIT: textblock_append(tb, "Found lying on the floor in a pit at %s.\n", origin_text); break; case ORIGIN_VAULT: textblock_append(tb, "Found lying on the floor in a vault at %s.\n", origin_text); break; case ORIGIN_SPECIAL: textblock_append(tb, "Found lying on the floor of a special room at %s.\n", origin_text); break; case ORIGIN_LABYRINTH: textblock_append(tb, "Found lying on the floor of a labyrinth at %s.\n", origin_text); break; case ORIGIN_CAVERN: textblock_append(tb, "Found lying on the floor of a cavern at %s.\n", origin_text); break; case ORIGIN_RUBBLE: textblock_append(tb, "Found under some rubble at %s.\n", origin_text); break; case ORIGIN_DROP: case ORIGIN_DROP_SPECIAL: case ORIGIN_DROP_PIT: case ORIGIN_DROP_VAULT: case ORIGIN_DROP_SUMMON: case ORIGIN_DROP_BREED: case ORIGIN_DROP_POLY: case ORIGIN_DROP_WIZARD: { const char *name; if (r_info[o_ptr->origin_xtra].ridx) name = r_info[o_ptr->origin_xtra].name; else name = "monster lost to history"; textblock_append(tb, "Dropped by "); if (rf_has(r_info[o_ptr->origin_xtra].flags, RF_UNIQUE)) textblock_append(tb, "%s", name); else textblock_append(tb, "%s%s", is_a_vowel(name[0]) ? "an " : "a ", name); textblock_append(tb, " %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; } case ORIGIN_DROP_UNKNOWN: textblock_append(tb, "Dropped by an unknown monster %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; case ORIGIN_ACQUIRE: textblock_append(tb, "Conjured forth by magic %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; case ORIGIN_CHEAT: textblock_append(tb, "Created by debug option.\n"); break; case ORIGIN_CHEST: textblock_append(tb, "Found in a chest from %s.\n", origin_text); break; } textblock_append(tb, "\n"); return TRUE; } /* * Print an item's flavour text. * * \param tb is the textblock to which we are adding. * \param o_ptr is the object we are describing. * \param ego is whether we're describing an ego template (as opposed to a * real object) */ static void describe_flavor_text(textblock *tb, const object_type *o_ptr, bool ego) { /* Display the known artifact description */ if (!OPT(birth_randarts) && o_ptr->artifact && object_is_known(o_ptr) && o_ptr->artifact->text) textblock_append(tb, "%s\n\n", o_ptr->artifact->text); /* Display the known object description */ else if (object_flavor_is_aware(o_ptr) || object_is_known(o_ptr) || ego) { bool did_desc = FALSE; if (!ego && o_ptr->kind->text) { textblock_append(tb, "%s", o_ptr->kind->text); did_desc = TRUE; } /* Display an additional ego-item description */ if ((ego || object_ego_is_visible(o_ptr)) && o_ptr->ego->text) { if (did_desc) textblock_append(tb, " "); textblock_append(tb, "%s\n\n", o_ptr->ego->text); } else if (did_desc) { textblock_append(tb, "\n\n"); } } } static bool describe_ego(textblock *tb, const struct ego_item *ego) { if (ego && ego->xtra) { const char *xtra[] = { "sustain", "higher resistance", "ability" }; textblock_append(tb, "It provides one random %s. ", xtra[ego->xtra - 1]); return TRUE; } return FALSE; } /* * Output object information */ static textblock *object_info_out(const object_type *o_ptr, oinfo_detail_t mode) { bitflag flags[OF_SIZE]; bitflag pval_flags[MAX_PVALS][OF_SIZE]; bool something = FALSE; bool known = object_is_known(o_ptr); bool full = mode & OINFO_FULL; bool terse = mode & OINFO_TERSE; bool subjective = mode & OINFO_SUBJ; bool ego = mode & OINFO_EGO; textblock *tb = textblock_new(); /* Grab the object flags */ if (full) { object_flags(o_ptr, flags); object_pval_flags(o_ptr, pval_flags); } else { object_flags_known(o_ptr, flags); object_pval_flags_known(o_ptr, pval_flags); } if (subjective) describe_origin(tb, o_ptr); if (!terse) describe_flavor_text(tb, o_ptr, ego); if (!full && !known) { textblock_append(tb, "You do not know the full extent of this item's powers.\n"); something = TRUE; } if (describe_curses(tb, o_ptr, flags)) something = TRUE; if (describe_stats(tb, o_ptr, pval_flags, mode)) something = TRUE; if (describe_slays(tb, flags, o_ptr->tval)) something = TRUE; if (describe_immune(tb, flags)) something = TRUE; if (describe_ignores(tb, flags)) something = TRUE; if (describe_sustains(tb, flags)) something = TRUE; if (describe_misc_magic(tb, flags)) something = TRUE; if (ego && describe_ego(tb, o_ptr->ego)) something = TRUE; if (something) textblock_append(tb, "\n"); if (!ego && describe_effect(tb, o_ptr, full, terse, subjective)) { something = TRUE; textblock_append(tb, "\n"); } if (subjective && describe_combat(tb, o_ptr, mode)) { something = TRUE; textblock_append(tb, "\n"); } if (!terse && describe_food(tb, o_ptr, subjective, full)) something = TRUE; if (describe_light(tb, o_ptr, flags, terse)) something = TRUE; if (!terse && subjective && describe_digger(tb, o_ptr, mode)) something = TRUE; if (!something) textblock_append(tb, "\n\nThis item does not seem to possess any special abilities."); return tb; } /** * Provide information on an item, including how it would affect the current * player's state. * * mode OINFO_FULL should be set if actual player knowledge should be ignored * in favour of full knowledge. * * returns TRUE if anything is printed. */ textblock *object_info(const object_type *o_ptr, oinfo_detail_t mode) { mode |= OINFO_SUBJ; return object_info_out(o_ptr, mode); } /** * Provide information on an ego-item type */ textblock *object_info_ego(struct ego_item *ego) { object_kind *kind = NULL; object_type obj = { 0 }; int i; for (i = 0; i < z_info->k_max; i++) { kind = &k_info[i]; if (!kind->name) continue; if (kind->tval == ego->tval[0]) break; } obj.kind = kind; obj.tval = kind->tval; obj.sval = kind->sval; obj.ego = ego; ego_apply_magic(&obj, 0); return object_info_out(&obj, OINFO_FULL | OINFO_EGO | OINFO_DUMMY); } /** * Provide information on an item suitable for writing to the character dump - keep it brief. */ void object_info_chardump(ang_file *f, const object_type *o_ptr, int indent, int wrap) { textblock *tb = object_info_out(o_ptr, OINFO_TERSE | OINFO_SUBJ); textblock_to_file(tb, f, indent, wrap); textblock_free(tb); } /** * Provide spoiler information on an item. * * Practically, this means that we should not print anything which relies upon * the player's current state, since that is not suitable for spoiler material. */ void object_info_spoil(ang_file *f, const object_type *o_ptr, int wrap) { textblock *tb = object_info_out(o_ptr, OINFO_FULL); textblock_to_file(tb, f, 0, wrap); textblock_free(tb); } angband-v3.3.2/src/object/tvalsval.h0000644000175000017500000002066711651552410016664 0ustar chriscchrisc#ifndef INCLUDED_OBJECT_TVALSVAL_H #define INCLUDED_OBJECT_TVALSVAL_H /*** Object "tval" and "sval" codes ***/ /* * PS: to regenerate the inside of an sval enum, do this: * $ grep --context 2 I: object.txt | grep ^[NI] | * perl -pe 'y/[a-z]\- /[A-Z]__/' | perl -pe 's/(&_|~|')//g' | cut -d: -f3 | * perl -00 -pe 's/([^\n]*)\n([^\n]*)\n/\tSV_\1\ =\ \2,\n/g' */ /* * The values for the "tval" field of various objects. * * This value is the primary means by which items are sorted in the * player inventory, followed by "sval" and "cost". * * Note that a "BOW" with tval = 19 and sval S = 10*N+P takes a missile * weapon with tval = 16+N, and does (xP) damage when so combined. This * fact is not actually used in the source, but it kind of interesting. * * Note that as of 2.7.8, the "item flags" apply to all items, though * only armor and weapons and a few other items use any of these flags. */ #define TV_NULL 0 #define TV_SKELETON 1 /* Skeletons ('s') */ #define TV_BOTTLE 2 /* Empty bottles ('!') */ #define TV_JUNK 3 /* Sticks, Pottery, etc ('~') */ #define TV_SPIKE 5 /* Spikes ('~') */ #define TV_CHEST 7 /* Chests ('~') */ #define TV_SHOT 16 /* Ammo for slings */ #define TV_ARROW 17 /* Ammo for bows */ #define TV_BOLT 18 /* Ammo for x-bows */ #define TV_BOW 19 /* Slings/Bows/Xbows */ #define TV_DIGGING 20 /* Shovels/Picks */ #define TV_HAFTED 21 /* Priest Weapons */ #define TV_POLEARM 22 /* Axes and Pikes */ #define TV_SWORD 23 /* Edged Weapons */ #define TV_BOOTS 30 /* Boots */ #define TV_GLOVES 31 /* Gloves */ #define TV_HELM 32 /* Helms */ #define TV_CROWN 33 /* Crowns */ #define TV_SHIELD 34 /* Shields */ #define TV_CLOAK 35 /* Cloaks */ #define TV_SOFT_ARMOR 36 /* Soft Armor */ #define TV_HARD_ARMOR 37 /* Hard Armor */ #define TV_DRAG_ARMOR 38 /* Dragon Scale Mail */ #define TV_LIGHT 39 /* Lights (including Specials) */ #define TV_AMULET 40 /* Amulets (including Specials) */ #define TV_RING 45 /* Rings (including Specials) */ #define TV_STAFF 55 #define TV_WAND 65 #define TV_ROD 66 #define TV_SCROLL 70 #define TV_POTION 75 #define TV_FLASK 77 #define TV_FOOD 80 #define TV_MAGIC_BOOK 90 #define TV_PRAYER_BOOK 91 #define TV_GOLD 100 /* Gold can only be picked up by players */ #define TV_MAX 101 /* The "sval" codes for TV_SHOT/TV_ARROW/TV_BOLT */ #define SV_AMMO_LIGHT 0 /* pebbles */ #define SV_AMMO_NORMAL 1 /* shots, arrows, bolts */ #define SV_AMMO_HEAVY 2 /* seeker arrows and bolts */ #define SV_AMMO_SILVER 3 /* silver arrows and bolts */ /* The "sval" codes for TV_BOW (note information in "sval") */ #define SV_SLING 2 /* (x2) */ #define SV_SHORT_BOW 12 /* (x2) */ #define SV_LONG_BOW 13 /* (x3) */ #define SV_LIGHT_XBOW 23 /* (x3) */ #define SV_HEAVY_XBOW 24 /* (x4) */ /* The sval codes for TV_LIGHT */ #define SV_LIGHT_TORCH 0 #define SV_LIGHT_LANTERN 1 #define SV_LIGHT_GALADRIEL 4 #define SV_LIGHT_ELENDIL 5 #define SV_LIGHT_THRAIN 6 #define SV_LIGHT_PALANTIR 7 /* Hacky defines */ #define SV_SCROLL_PHASE_DOOR 1 #define SV_SCROLL_WORD_OF_RECALL 29 #define SV_SCROLL_RUNE_OF_PROTECTION 38 enum sval_digging /* tval 20 */ { SV_SHOVEL = 1, SV_PICK = 2, SV_MATTOCK = 3 }; enum sval_hafted /* tval 21 */ { SV_WHIP = 1, SV_BALL_AND_CHAIN = 2, SV_MORNING_STAR = 3, SV_FLAIL = 4, SV_TWO_HANDED_GREAT_FLAIL = 5, SV_MACE = 10, SV_LEAD_FILLED_MACE = 11, SV_QUARTERSTAFF = 12, SV_WAR_HAMMER = 13, SV_MAUL = 14, SV_GREAT_HAMMER = 15, SV_MACE_OF_DISRUPTION = 20, SV_GROND = 50 }; enum sval_polearm /* tval 22 */ { SV_SPEAR = 1, SV_AWL_PIKE = 2, SV_TRIDENT = 3, SV_HALBERD = 4, SV_PIKE = 5, SV_BEAKED_AXE = 10, SV_BROAD_AXE = 11, SV_BATTLE_AXE = 12, SV_LOCHABER_AXE = 13, SV_GREAT_AXE = 14, SV_SCYTHE = 20, SV_GLAIVE = 21, SV_LANCE = 22, SV_SCYTHE_OF_SLICING = 23, SV_LUCERNE_HAMMER = 24 }; enum sval_sword /* tval 23 */ { SV_DAGGER = 1, SV_MAIN_GAUCHE = 2, SV_RAPIER = 3, SV_SHORT_SWORD = 4, SV_CUTLASS = 5, SV_TULWAR = 6, SV_SCIMITAR = 7, SV_LONG_SWORD = 8, SV_BROAD_SWORD = 9, SV_BASTARD_SWORD = 10, SV_KATANA = 11, SV_ZWEIHANDER = 12, SV_EXECUTIONERS_SWORD = 13, SV_BLADE_OF_CHAOS = 14 }; enum sval_boots /* tval 30 */ { SV_PAIR_OF_LEATHER_SANDALS = 1, SV_PAIR_OF_LEATHER_BOOTS = 2, SV_PAIR_OF_IRON_SHOD_BOOTS = 3, SV_PAIR_OF_STEEL_SHOD_BOOTS = 4, SV_PAIR_OF_MITHRIL_SHOD_BOOTS = 5, SV_PAIR_OF_ETHEREAL_SLIPPERS = 6 }; enum sval_gloves /* tval 31 */ { SV_SET_OF_LEATHER_GLOVES = 1, SV_SET_OF_GAUNTLETS = 2, SV_SET_OF_MITHRIL_GAUNTLETS = 3, SV_SET_OF_CAESTUS = 4, SV_SET_OF_ALCHEMISTS_GLOVES = 5 }; enum sval_helm /* tval 32 */ { SV_HARD_LEATHER_CAP = 2, SV_METAL_CAP = 3, SV_IRON_HELM = 5, SV_STEEL_HELM = 6 }; enum sval_crown /* tval 33 */ { SV_IRON_CROWN = 10, SV_GOLDEN_CROWN = 11, SV_JEWEL_ENCRUSTED_CROWN = 12, SV_MORGOTH = 50 }; enum sval_shield /* tval 34 */ { /* SV_BUCKLER = 1, */ SV_WICKER_SHIELD = 2, SV_SMALL_METAL_SHIELD = 3, SV_LEATHER_SHIELD = 4, SV_LARGE_METAL_SHIELD = 5, SV_MITHRIL_SHIELD = 10 }; enum sval_cloak /* tval 35 */ { SV_CLOAK = 1, SV_FUR_CLOAK = 2, SV_ELVEN_CLOAK = 3, SV_ETHEREAL_CLOAK = 4 }; enum sval_soft_armour /* tval 36 */ { SV_ROBE = 2, SV_SOFT_LEATHER_ARMOUR = 4, SV_STUDDED_LEATHER_ARMOUR = 7, SV_HARD_LEATHER_ARMOUR = 6, SV_LEATHER_SCALE_MAIL = 11 }; enum sval_hard_armour /* tval 37 */ { SV_METAL_SCALE_MAIL = 1, SV_CHAIN_MAIL = 2, SV_AUGMENTED_CHAIN_MAIL = 3, SV_BAR_CHAIN_MAIL = 4, SV_METAL_BRIGANDINE_ARMOUR = 5, SV_PARTIAL_PLATE_ARMOUR = 6, SV_METAL_LAMELLAR_ARMOUR = 7, SV_FULL_PLATE_ARMOUR = 8, SV_RIBBED_PLATE_ARMOUR = 9, SV_MITHRIL_CHAIN_MAIL = 10, SV_MITHRIL_PLATE_MAIL = 11, SV_ADAMANTITE_PLATE_MAIL = 12 }; enum sval_dragon_armour /* tval 38 */ { SV_DRAGON_BLACK = 1, SV_DRAGON_BLUE = 2, SV_DRAGON_WHITE = 3, SV_DRAGON_RED = 4, SV_DRAGON_GREEN = 5, SV_DRAGON_MULTIHUED = 6, SV_DRAGON_SHINING = 10, SV_DRAGON_LAW = 12, SV_DRAGON_BRONZE = 14, SV_DRAGON_GOLD = 16, SV_DRAGON_CHAOS = 18, SV_DRAGON_BALANCE = 20, SV_DRAGON_POWER = 30 }; enum sval_amulet /* tval 40 */ { SV_AMULET_WISDOM = 1, SV_AMULET_CHARISMA = 2, SV_AMULET_RESIST_LIGHTNING = 3, SV_AMULET_RESIST_ACID = 4, SV_AMULET_RESISTANCE = 5, SV_AMULET_SUSTENANCE = 6, SV_AMULET_THE_MAGI = 7, SV_AMULET_ESP = 8, SV_AMULET_DEVOTION = 9, SV_AMULET_WEAPONMASTERY = 10, SV_AMULET_TRICKERY = 11, SV_AMULET_REGENERATION = 15, SV_AMULET_INFRAVISION = 16, SV_AMULET_SEARCHING = 17, SV_AMULET_TELEPORTATION = 18, SV_AMULET_SLOW_DIGESTION = 19, SV_AMULET_ADORNMENT = 20, SV_AMULET_INERTIA = 21, SV_AMULET_CARLAMMAS = 50, SV_AMULET_INGWE = 51, SV_AMULET_DWARVES = 52, SV_AMULET_ELESSAR = 53, SV_AMULET_EVENSTAR = 54 }; enum sval_ring /* tval 45 */ { SV_RING_STRENGTH = 1, SV_RING_INTELLIGENCE = 2, SV_RING_DEXTERITY = 3, SV_RING_CONSTITUTION = 4, SV_RING_SPEED = 5, SV_RING_SEARCHING = 6, SV_RING_BODYKEEPING = 9, SV_RING_SOULKEEPING = 10, SV_RING_SUSTAIN_CHARISMA = 11, SV_RING_RESIST_POISON = 12, SV_RING_RESIST_FIRE = 13, SV_RING_RESIST_COLD = 14, SV_RING_LIGHT = 16, SV_RING_DARK = 17, SV_RING_FLAMES = 18, SV_RING_ACID = 19, SV_RING_ICE = 20, SV_RING_LIGHTNING = 21, SV_RING_DAMAGE = 23, SV_RING_ACCURACY = 24, SV_RING_SLAYING = 25, SV_RING_PROTECTION = 26, SV_RING_TELEPORTATION = 27, SV_RING_RECKLESS_ATTACKS = 28, SV_RING_OPEN_WOUNDS = 29, SV_RING_OF_ESCAPING = 30, SV_RING_OF_THE_MOUSE = 31, SV_RING_OF_THE_DOG = 32, SV_RING_SLOW_DIGESTION = 34, SV_RING_FEATHER_FALLING = 35, SV_RING_FREE_ACTION = 36, SV_RING_SEE_INVISIBLE = 37, SV_RING_DELVING = 38, /* Artifact rings */ SV_RING_BARAHIR = 50, SV_RING_TULKAS = 51, SV_RING_NARYA = 52, SV_RING_NENYA = 53, SV_RING_VILYA = 54, SV_RING_POWER = 55 }; enum sval_food /* tval 80 */ { SV_FOOD_RATION = 1, SV_FOOD_SLIME_MOLD = 2, SV_FOOD_WAYBREAD = 3 }; enum sval_gold /* tval 100 */ { SV_GOLD_ANY = -1, SV_COPPER = 0, SV_SILVER = 1, SV_GARNETS = 2, SV_GOLD = 3, SV_OPALS = 4, SV_SAPPHIRES = 5, SV_RUBIES = 6, SV_DIAMONDS = 7, SV_EMERALDS = 8, SV_MITHRIL = 9, SV_ADAMANTITE = 10, SV_GOLD_MAX }; /* * Special "sval" limit -- first "normal" food */ #define SV_FOOD_MIN_SHROOM 5 /* * Special "sval" limit -- first "large" chest */ #define SV_CHEST_MIN_LARGE 4 /* * Special "sval" limit -- first "good" magic/prayer book */ #define SV_BOOK_MIN_GOOD 4 /* * Special "sval" value -- unknown "sval" */ #define SV_UNKNOWN 255 #endif /* INCLUDED_OBJECT_TVALSVAL_H */ angband-v3.3.2/src/object/object.h0000644000175000017500000005771711651552410016304 0ustar chriscchrisc#ifndef INCLUDED_OBJECT_H #define INCLUDED_OBJECT_H #include "z-rand.h" #include "z-file.h" #include "z-textblock.h" #include "z-quark.h" #include "z-bitflag.h" #include "game-cmd.h" #include "cave.h" struct player; /*** Constants ***/ /* Object origin kinds */ enum { ORIGIN_NONE = 0, ORIGIN_FLOOR, /* found on the dungeon floor */ ORIGIN_DROP, /* normal monster drops */ ORIGIN_CHEST, ORIGIN_DROP_SPECIAL, /* from monsters in special rooms */ ORIGIN_DROP_PIT, /* from monsters in pits/nests */ ORIGIN_DROP_VAULT, /* from monsters in vaults */ ORIGIN_SPECIAL, /* on the floor of a special room */ ORIGIN_PIT, /* on the floor of a pit/nest */ ORIGIN_VAULT, /* on the floor of a vault */ ORIGIN_LABYRINTH, /* on the floor of a labyrinth */ ORIGIN_CAVERN, /* on the floor of a cavern */ ORIGIN_RUBBLE, /* found under rubble */ ORIGIN_MIXED, /* stack with mixed origins */ ORIGIN_STATS, /* ^ only the above are considered by main-stats */ ORIGIN_ACQUIRE, /* called forth by scroll */ ORIGIN_DROP_BREED, /* from breeders */ ORIGIN_DROP_SUMMON, /* from combat summons */ ORIGIN_STORE, /* something you bought */ ORIGIN_STOLEN, /* stolen by monster (used only for gold) */ ORIGIN_BIRTH, /* objects created at character birth */ ORIGIN_DROP_UNKNOWN, /* drops from unseen foes */ ORIGIN_CHEAT, /* created by wizard mode */ ORIGIN_DROP_POLY, /* from polymorphees */ ORIGIN_DROP_WIZARD, /* from wizard mode summons */ ORIGIN_MAX }; #define ORIGIN_SIZE FLAG_SIZE(ORIGIN_MAX) #define ORIGIN_BYTES 4 /* savefile bytes - room for 32 origin types */ /** * Maximum number of pvals on objects * * Note: all pvals other than DEFAULT_PVAL are assumed to be associated with * flags, and any non-flag uses of pval (e.g. chest quality, gold quantity) * are assumed to use DEFAULT_PVAL. */ #define MAX_PVALS 3 #define DEFAULT_PVAL 0 /* ID flags */ #define IDENT_SENSE 0x0001 /* Has been "sensed" */ #define IDENT_WORN 0x0002 /* Has been tried on */ #define IDENT_EMPTY 0x0004 /* Is known to be empty */ #define IDENT_KNOWN 0x0008 /* Fully known */ #define IDENT_STORE 0x0010 /* Item is in the inventory of a store */ #define IDENT_ATTACK 0x0020 /* Know combat dice/ac/bonuses */ #define IDENT_DEFENCE 0x0040 /* Know AC/etc bonuses */ #define IDENT_EFFECT 0x0080 /* Know item activation/effect */ /* xxx */ #define IDENT_INDESTRUCT 0x0200 /* Tried to destroy it and failed */ #define IDENT_NAME 0x0400 /* Know the name of ego or artifact if there is one */ #define IDENT_FIRED 0x0800 /* Has been used as a missile */ #define IDENT_NOTART 0x1000 /* Item is known not to be an artifact */ #define IDENT_FAKE 0x2000 /* Item is a fake, for displaying knowledge */ /* Whether to learn egos and flavors with less than complete information */ #define EASY_LEARN 1 /* Maximum number of scroll titles generated */ #define MAX_TITLES 50 /** * Modes for object_desc(). */ typedef enum { ODESC_BASE = 0x00, /*!< Only describe the base name */ ODESC_COMBAT = 0x01, /*!< Also show combat bonuses */ ODESC_EXTRA = 0x02, /*!< Show charges/inscriptions/pvals */ ODESC_FULL = ODESC_COMBAT | ODESC_EXTRA, /*!< Show entire description */ ODESC_STORE = 0x04, /*!< This is an in-store description */ ODESC_PLURAL = 0x08, /*!< Always pluralise */ ODESC_SINGULAR = 0x10, /*!< Always singular */ ODESC_SPOIL = 0x20, /*!< Display regardless of player knowledge */ ODESC_PREFIX = 0x40 /* */ } odesc_detail_t; /** * Modes for item lists in "show_inven()" "show_equip()" and "show_floor()" */ typedef enum { OLIST_NONE = 0x00, /* No options */ OLIST_WINDOW = 0x01, /* Display list in a sub-term (left-align) */ OLIST_QUIVER = 0x02, /* Display quiver lines */ OLIST_GOLD = 0x04, /* Include gold in the list */ OLIST_WEIGHT = 0x08, /* Show item weight */ OLIST_PRICE = 0x10, /* Show item price */ OLIST_FAIL = 0x20 /* Show device failure */ } olist_detail_t; /** * Modes for object_info() */ typedef enum { OINFO_NONE = 0x00, /* No options */ OINFO_TERSE = 0x01, /* Keep descriptions brief, e.g. for dumps */ OINFO_SUBJ = 0x02, /* Describe object from the character's POV */ OINFO_FULL = 0x04, /* Treat object as if fully IDd */ OINFO_DUMMY = 0x08, /* Object does not exist (e.g. knowledge menu) */ OINFO_EGO = 0x10, /* Describe ego random powers */ } oinfo_detail_t; /** * Modes for stacking by object_similar() */ typedef enum { OSTACK_NONE = 0x00, /* No options (this does NOT mean no stacking) */ OSTACK_STORE = 0x01, /* Store stacking */ OSTACK_PACK = 0x02, /* Inventory and home */ OSTACK_LIST = 0x04, /* Object list */ OSTACK_MONSTER = 0x08, /* Monster carrying objects */ OSTACK_FLOOR = 0x10, /* Floor stacking */ OSTACK_QUIVER = 0x20 /* Quiver */ } object_stack_t; /** * Pseudo-ID markers. */ typedef enum { INSCRIP_NULL = 0, /*!< No pseudo-ID status */ INSCRIP_STRANGE = 1, /*!< Item that has mixed combat bonuses */ INSCRIP_AVERAGE = 2, /*!< Item with no interesting features */ INSCRIP_MAGICAL = 3, /*!< Item with combat bonuses */ INSCRIP_SPLENDID = 4, /*!< Obviously good item */ INSCRIP_EXCELLENT = 5, /*!< Ego-item */ INSCRIP_SPECIAL = 6, /*!< Artifact */ INSCRIP_UNKNOWN = 7, INSCRIP_MAX /*!< Maximum number of pseudo-ID markers */ } obj_pseudo_t; /* * Some constants used in randart generation and power calculation * - thresholds for limiting to_hit, to_dam and to_ac * - fudge factor for rescaling ammo cost * (a stack of this many equals a weapon of the same damage output) */ #define INHIBIT_POWER 20000 #define INHIBIT_BLOWS 3 #define INHIBIT_MIGHT 4 #define INHIBIT_SHOTS 3 #define HIGH_TO_AC 26 #define VERYHIGH_TO_AC 36 #define INHIBIT_AC 56 #define HIGH_TO_HIT 16 #define VERYHIGH_TO_HIT 26 #define HIGH_TO_DAM 16 #define VERYHIGH_TO_DAM 26 #define AMMO_RESCALER 20 /* this value is also used for torches */ #define sign(x) ((x) > 0 ? 1 : ((x) < 0 ? -1 : 0)) /*** Macros ***/ /* * Determine if the attr and char should consider the item's flavor * * Identified scrolls should use their own tile. */ #define use_flavor_glyph(kind) \ ((kind)->flavor && \ !((kind)->tval == TV_SCROLL && (kind)->aware)) /* * Return the "attr" for a given item kind. * Use "flavor" if available. * Default to user definitions. */ #define object_kind_attr(kind) \ (use_flavor_glyph((kind)) ? \ ((kind)->flavor->x_attr) : \ ((kind)->x_attr)) /* * Return the "char" for a given item kind. * Use "flavor" if available. * Default to user definitions. */ #define object_kind_char(kind) \ (use_flavor_glyph(kind) ? \ ((kind)->flavor->x_char) : \ ((kind)->x_char)) /* * Return the "attr" for a given item. * Use "flavor" if available. * Default to user definitions. */ #define object_attr(T) \ (object_kind_attr((T)->kind)) /* * Return the "char" for a given item. * Use "flavor" if available. * Default to user definitions. */ #define object_char(T) \ (object_kind_char((T)->kind)) /* * Rings and Amulets */ #define object_is_jewelry(T) \ (((T)->tval == TV_RING) || ((T)->tval == TV_AMULET)) /*** Structures ***/ /** * Information about object types, like rods, wands, etc. */ typedef struct object_base { char *name; int tval; struct object_base *next; bitflag flags[OF_SIZE]; int break_perc; } object_base; /** * Information about object kinds, including player knowledge. * * TODO: split out the user-changeable bits into a separate struct so this * one can be read-only. */ typedef struct object_kind { char *name; char *text; object_base *base; struct object_kind *next; u32b kidx; byte tval; /**< General object type (see TV_ macros) */ byte sval; /**< Object sub-type (see SV_ macros) */ random_value pval[MAX_PVALS]; /**< Power for any flags which need it */ byte num_pvals; /**< Number of pvals in use on this item */ random_value to_h; /**< Bonus to hit */ random_value to_d; /**< Bonus to damage */ random_value to_a; /**< Bonus to armor */ s16b ac; /**< Base armor */ byte dd; /**< Damage dice */ byte ds; /**< Damage sides */ s16b weight; /**< Weight, in 1/10lbs */ s32b cost; /**< Object base cost */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ byte d_attr; /**< Default object attribute */ char d_char; /**< Default object character */ byte alloc_prob; /**< Allocation: commonness */ byte alloc_min; /**< Highest normal dungeon level */ byte alloc_max; /**< Lowest normal dungeon level */ byte level; /**< Level (difficulty of activation) */ u16b effect; /**< Effect this item produces (effects.c) */ random_value time; /**< Recharge time (rods/activation) */ random_value charge; /**< Number of charges (staves/wands) */ byte gen_mult_prob; /**< Probability of generating more than one */ random_value stack_size; /**< Number to generate */ struct flavor *flavor; /**< Special object flavor (or zero) */ /** Game-dependent **/ byte x_attr; /**< Desired object attribute (set by user/pref file) */ char x_char; /**< Desired object character (set by user/pref file) */ /** Also saved in savefile **/ quark_t note; /**< Autoinscription quark number */ bool aware; /**< Set if player is aware of the kind's effects */ bool tried; /**< Set if kind has been tried */ byte squelch; /**< Squelch settings */ bool everseen; /**< Set if kind has ever been seen (to despoilify squelch menus) */ struct spell *spells; } object_kind; /** * Information about artifacts. * * Note that ::cur_num is written to the savefile. * * TODO: Fix this max_num/cur_num crap and just have a big boolean array of * which artifacts have been created and haven't, so this can become read-only. */ typedef struct artifact { char *name; char *text; u32b aidx; struct artifact *next; byte tval; /**< General artifact type (see TV_ macros) */ byte sval; /**< Artifact sub-type (see SV_ macros) */ s16b pval[MAX_PVALS]; /**< Power for any flags which need it */ byte num_pvals;/**< Number of pvals in use on this item */ s16b to_h; /**< Bonus to hit */ s16b to_d; /**< Bonus to damage */ s16b to_a; /**< Bonus to armor */ s16b ac; /**< Base armor */ byte dd; /**< Base damage dice */ byte ds; /**< Base damage sides */ s16b weight; /**< Weight in 1/10lbs */ s32b cost; /**< Artifact (pseudo-)worth */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ byte level; /** Difficulty level for activation */ byte rarity; /** Unused */ byte alloc_prob; /** Chance of being generated (i.e. rarity) */ byte alloc_min; /** Minimum depth (can appear earlier) */ byte alloc_max; /** Maximum depth (will NEVER appear deeper) */ bool created; /**< Whether this artifact has been created */ bool seen; /**< Whether this artifact has been seen this game */ bool everseen; /**< Whether this artifact has ever been seen */ u16b effect; /**< Artifact activation (see effects.c) */ char *effect_msg; random_value time; /**< Recharge time (if appropriate) */ } artifact_type; /* * Information about "ego-items". */ typedef struct ego_item { struct ego_item *next; char *name; char *text; u32b eidx; s32b cost; /* Ego-item "cost" */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ byte level; /* Minimum level */ byte rarity; /* Object rarity */ byte rating; /* Level rating boost */ byte alloc_prob; /** Chance of being generated (i.e. rarity) */ byte alloc_min; /** Minimum depth (can appear earlier) */ byte alloc_max; /** Maximum depth (will NEVER appear deeper) */ byte tval[EGO_TVALS_MAX]; /* Legal tval */ byte min_sval[EGO_TVALS_MAX]; /* Minimum legal sval */ byte max_sval[EGO_TVALS_MAX]; /* Maximum legal sval */ random_value to_h; /* Extra to-hit bonus */ random_value to_d; /* Extra to-dam bonus */ random_value to_a; /* Extra to-ac bonus */ random_value pval[MAX_PVALS]; /* Extra pval bonus */ byte num_pvals; /* Number of pvals used */ byte min_to_h; /* Minimum to-hit value */ byte min_to_d; /* Minimum to-dam value */ byte min_to_a; /* Minimum to-ac value */ byte min_pval[MAX_PVALS]; /* Minimum pval */ byte xtra; /* Extra sustain/resist/power */ bool everseen; /* Do not spoil squelch menus */ } ego_item_type; /* * Object information, for a specific object. * * Note that a "discount" on an item is permanent and never goes away. * * Note that inscriptions are now handled via the "quark_str()" function * applied to the "note" field, which will return NULL if "note" is zero. * * Note that "object" records are "copied" on a fairly regular basis, * and care must be taken when handling such objects. * * Note that "object flags" must now be derived from the object kind, * the artifact and ego-item indexes, and the two "xtra" fields. * * Each cave grid points to one (or zero) objects via the "o_idx" * field (above). Each object then points to one (or zero) objects * via the "next_o_idx" field, forming a singly linked list, which * in game terms, represents a "stack" of objects in the same grid. * * Each monster points to one (or zero) objects via the "hold_o_idx" * field (below). Each object then points to one (or zero) objects * via the "next_o_idx" field, forming a singly linked list, which * in game terms, represents a pile of objects held by the monster. * * The "held_m_idx" field is used to indicate which monster, if any, * is holding the object. Objects being held have "ix=0" and "iy=0". */ typedef struct object { struct object_kind *kind; struct ego_item *ego; struct artifact *artifact; byte iy; /* Y-position on map, or zero */ byte ix; /* X-position on map, or zero */ byte tval; /* Item type (from kind) */ byte sval; /* Item sub-type (from kind) */ s16b pval[MAX_PVALS]; /* Item extra-parameter */ byte num_pvals; /* Number of pvals in use */ s16b weight; /* Item weight */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag known_flags[OF_SIZE]; /**< Player-known flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ u16b ident; /* Special flags */ s16b ac; /* Normal AC */ s16b to_a; /* Plusses to AC */ s16b to_h; /* Plusses to hit */ s16b to_d; /* Plusses to damage */ byte dd, ds; /* Damage dice/sides */ s16b timeout; /* Timeout Counter */ byte number; /* Number of items */ byte marked; /* Object is marked */ bool ignore; /* Object is ignored */ s16b next_o_idx; /* Next object in stack (if any) */ s16b held_m_idx; /* Monster holding us (if any) */ s16b mimicking_m_idx; /* Monster mimicking us (if any) */ byte origin; /* How this item was found */ byte origin_depth; /* What depth the item was found at */ u16b origin_xtra; /* Extra information about origin */ quark_t note; /* Inscription index */ } object_type; typedef struct flavor { char *text; struct flavor *next; unsigned int fidx; byte tval; /* Associated object type */ byte sval; /* Associated object sub-type */ byte d_attr; /* Default flavor attribute */ char d_char; /* Default flavor character */ byte x_attr; /* Desired flavor attribute */ char x_char; /* Desired flavor character */ } flavor_type; /*** Functions ***/ /* identify.c */ extern s32b object_last_wield; bool object_is_known(const object_type *o_ptr); bool object_is_known_artifact(const object_type *o_ptr); bool object_is_known_cursed(const object_type *o_ptr); bool object_is_known_blessed(const object_type *o_ptr); bool object_is_known_not_artifact(const object_type *o_ptr); bool object_is_not_known_consistently(const object_type *o_ptr); bool object_was_worn(const object_type *o_ptr); bool object_was_fired(const object_type *o_ptr); bool object_was_sensed(const object_type *o_ptr); bool object_flavor_is_aware(const object_type *o_ptr); bool object_flavor_was_tried(const object_type *o_ptr); bool object_effect_is_known(const object_type *o_ptr); bool object_ego_is_visible(const object_type *o_ptr); bool object_attack_plusses_are_visible(const object_type *o_ptr); bool object_defence_plusses_are_visible(const object_type *o_ptr); bool object_flag_is_known(const object_type *o_ptr, int flag); bool object_high_resist_is_possible(const object_type *o_ptr); void object_flavor_aware(object_type *o_ptr); void object_flavor_tried(object_type *o_ptr); void object_notice_everything(object_type *o_ptr); void object_notice_indestructible(object_type *o_ptr); void object_notice_ego(object_type *o_ptr); void object_notice_sensing(object_type *o_ptr); void object_sense_artifact(object_type *o_ptr); void object_notice_effect(object_type *o_ptr); void object_notice_attack_plusses(object_type *o_ptr); bool object_notice_flag(object_type *o_ptr, int flag); bool object_notice_flags(object_type *o_ptr, bitflag flags[OF_SIZE]); bool object_notice_curses(object_type *o_ptr); void object_notice_on_defend(struct player *p); void object_notice_on_wield(object_type *o_ptr); void object_notice_on_firing(object_type *o_ptr); void wieldeds_notice_flag(struct player *p, int flag); void wieldeds_notice_on_attack(void); void object_repair_knowledge(object_type *o_ptr); bool object_FA_would_be_obvious(const object_type *o_ptr); obj_pseudo_t object_pseudo(const object_type *o_ptr); void sense_inventory(void); bool easy_know(const object_type *o_ptr); bool object_check_for_ident(object_type *o_ptr); bool object_name_is_visible(const object_type *o_ptr); void object_know_all_flags(object_type *o_ptr); /* obj-desc.c */ void object_base_name(char *buf, size_t max, int tval, bool plural); void object_kind_name(char *buf, size_t max, const object_kind *kind, bool easy_know); size_t object_desc(char *buf, size_t max, const object_type *o_ptr, odesc_detail_t mode); /* obj-info.c */ textblock *object_info(const object_type *o_ptr, oinfo_detail_t mode); textblock *object_info_ego(struct ego_item *ego); void object_info_spoil(ang_file *f, const object_type *o_ptr, int wrap); void object_info_chardump(ang_file *f, const object_type *o_ptr, int indent, int wrap); /* obj-make.c */ void free_obj_alloc(void); bool init_obj_alloc(void); object_kind *get_obj_num(int level, bool good); void object_prep(object_type *o_ptr, struct object_kind *kind, int lev, aspect rand_aspect); s16b apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great); bool make_object(struct cave *c, object_type *j_ptr, int lev, bool good, bool great, s32b *value); void make_gold(object_type *j_ptr, int lev, int coin_type); void copy_artifact_data(object_type *o_ptr, const artifact_type *a_ptr); void ego_apply_magic(object_type *o_ptr, int level); void ego_min_pvals(object_type *o_ptr); /* obj-ui.c */ void show_inven(olist_detail_t mode); void show_equip(olist_detail_t mode); void show_floor(const int *floor_list, int floor_num, olist_detail_t mode); bool verify_item(const char *prompt, int item); bool get_item(int *cp, const char *pmt, const char *str, cmd_code cmd, int mode); /* obj-util.c */ struct object_kind *objkind_get(int tval, int sval); struct object_kind *objkind_byid(int kidx); void flavor_init(void); void reset_visuals(bool load_prefs); void object_flags(const object_type *o_ptr, bitflag flags[OF_SIZE]); void object_flags_known(const object_type *o_ptr, bitflag flags[OF_SIZE]); char index_to_label(int i); s16b label_to_inven(int c); s16b label_to_equip(int c); bool wearable_p(const object_type *o_ptr); s16b wield_slot(const object_type *o_ptr); bool slot_can_wield_item(int slot, const object_type *o_ptr); const char *mention_use(int slot); const char *describe_use(int i); bool item_tester_okay(const object_type *o_ptr); int scan_floor(int *items, int max_size, int y, int x, int mode); void excise_object_idx(int o_idx); void delete_object_idx(int o_idx); void delete_object(int y, int x); void compact_objects(int size); void wipe_o_list(struct cave *c); s16b o_pop(void); object_type *get_first_object(int y, int x); object_type *get_next_object(const object_type *o_ptr); bool is_blessed(const object_type *o_ptr); s32b object_value(const object_type *o_ptr, int qty, int verbose); s32b object_value_real(const object_type *o_ptr, int qty, int verbose, bool known); bool object_similar(const object_type *o_ptr, const object_type *j_ptr, object_stack_t mode); void object_absorb(object_type *o_ptr, const object_type *j_ptr); void object_wipe(object_type *o_ptr); void object_copy(object_type *o_ptr, const object_type *j_ptr); void object_copy_amt(object_type *dst, object_type *src, int amt); void object_split(struct object *dest, struct object *src, int amt); s16b floor_carry(struct cave *c, int y, int x, object_type *j_ptr); void drop_near(struct cave *c, object_type *j_ptr, int chance, int y, int x, bool verbose); void push_object(int y, int x); void acquirement(int y1, int x1, int level, int num, bool great); void inven_item_charges(int item); void inven_item_describe(int item); void inven_item_increase(int item, int num); void save_quiver_size(struct player *p); void inven_item_optimize(int item); void floor_item_charges(int item); void floor_item_describe(int item); void floor_item_increase(int item, int num); void floor_item_optimize(int item); bool inven_carry_okay(const object_type *o_ptr); bool inven_stack_okay(const object_type *o_ptr); s16b inven_takeoff(int item, int amt); void inven_drop(int item, int amt); void combine_pack(void); void reorder_pack(void); void open_quiver_slot(int slot); void sort_quiver(void); int get_use_device_chance(const object_type *o_ptr); void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt); void reduce_charges(object_type *o_ptr, int amt); int number_charging(const object_type *o_ptr); bool recharge_timeout(object_type *o_ptr); unsigned check_for_inscrip(const object_type *o_ptr, const char *inscrip); object_kind *lookup_kind(int tval, int sval); int lookup_name(int tval, const char *name); int lookup_artifact_name(const char *name); int lookup_sval(int tval, const char *name); int tval_find_idx(const char *name); const char *tval_find_name(int tval); bool obj_is_staff(const object_type *o_ptr); bool obj_is_wand(const object_type *o_ptr); bool obj_is_rod(const object_type *o_ptr); bool obj_is_potion(const object_type *o_ptr); bool obj_is_scroll(const object_type *o_ptr); bool obj_is_food(const object_type *o_ptr); bool obj_is_light(const object_type *o_ptr); bool obj_is_ring(const object_type *o_ptr); bool obj_is_ammo(const object_type *o_ptr); bool obj_has_charges(const object_type *o_ptr); bool obj_can_zap(const object_type *o_ptr); bool obj_is_activatable(const object_type *o_ptr); bool obj_can_activate(const object_type *o_ptr); bool obj_can_refill(const object_type *o_ptr); bool obj_can_browse(const object_type *o_ptr); bool obj_can_cast_from(const object_type *o_ptr); bool obj_can_study(const object_type *o_ptr); bool obj_can_takeoff(const object_type *o_ptr); bool obj_can_wear(const object_type *o_ptr); bool obj_can_fire(const object_type *o_ptr); bool obj_has_inscrip(const object_type *o_ptr); u16b object_effect(const object_type *o_ptr); object_type *object_from_item_idx(int item); bool obj_needs_aim(object_type *o_ptr); bool get_item_okay(int item); int scan_items(int *item_list, size_t item_list_max, int mode); bool item_is_available(int item, bool (*tester)(const object_type *), int mode); extern void display_itemlist(void); extern void display_object_idx_recall(s16b o_idx); extern void display_object_kind_recall(s16b k_idx); bool pack_is_full(void); bool pack_is_overfull(void); void pack_overflow(void); extern struct object *object_byid(s16b oidx); extern void objects_init(void); extern void objects_destroy(void); /* obj-power.c and randart.c */ s32b object_power(const object_type *o_ptr, int verbose, ang_file *log_file, bool known); char *artifact_gen_name(struct artifact *a, const char ***wordlist); #endif /* !INCLUDED_OBJECT_H */ angband-v3.3.2/src/object/obj-make.c0000644000175000017500000005472011651552410016505 0ustar chriscchrisc/* * File: obj-make.c * Purpose: Object generation functions. * * Copyright (c) 1987-2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "object/tvalsval.h" #include "object/pval.h" /* * The chance of inflating the requested object level (1/x). * Lower values yield better objects more often. */ #define GREAT_OBJ 20 /* * There is a 1/20 (5%) chance that ego-items with an inflated base-level are * generated when an object is turned into an ego-item (see make_ego_item() * in object2.c). As above, lower values yield better ego-items more often. */ #define GREAT_EGO 20 /* Define a value for minima which will be ignored. */ #define NO_MINIMUM 255 /*** Make an ego item ***/ /** * This is a safe way to choose a random new flag to add to an object. * It takes the existing flags and an array of new flags, * and returns an entry from newf, or 0 if there are no * new flags available. */ static int get_new_attr(bitflag flags[OF_SIZE], bitflag newf[OF_SIZE]) { size_t i; int options = 0, flag = 0; for (i = of_next(newf, FLAG_START); i != FLAG_END; i = of_next(newf, i + 1)) { /* skip this one if the flag is already present */ if (of_has(flags, i)) continue; /* each time we find a new possible option, we have a 1-in-N chance of * choosing it and an (N-1)-in-N chance of keeping a previous one */ if (one_in_(++options)) flag = i; } return flag; } /** * Select an ego-item that fits the object's tval and sval. */ static struct ego_item *ego_find_random(object_type *o_ptr, int level) { int i, j; long total = 0L; /* XXX alloc_ego_table &c should be static to this file */ alloc_entry *table = alloc_ego_table; ego_item_type *ego; /* Go through all possible ego items and find oens which fit this item */ for (i = 0; i < alloc_ego_size; i++) { /* Reset any previous probability of this type being picked */ table[i].prob3 = 0; if (level < table[i].level) continue; /* Access the ego item */ ego = &e_info[table[i].index]; /* XXX Ignore cursed items for now */ if (cursed_p(ego->flags)) continue; /* Test if this is a legal ego-item type for this object */ for (j = 0; j < EGO_TVALS_MAX; j++) { /* Require identical base type */ if (o_ptr->tval == ego->tval[j] && o_ptr->sval >= ego->min_sval[j] && o_ptr->sval <= ego->max_sval[j]) { table[i].prob3 = table[i].prob2; break; } } /* Total */ total += table[i].prob3; } if (total) { long value = randint0(total); for (i = 0; i < alloc_ego_size; i++) { /* Found the entry */ if (value < table[i].prob3) break; /* Decrement */ value = value - table[i].prob3; } return &e_info[table[i].index]; } return NULL; } /** * Apply generation magic to an ego-item. */ void ego_apply_magic(object_type *o_ptr, int level) { int i, flag, x; bitflag flags[OF_SIZE], newf[OF_SIZE]; object_flags(o_ptr, flags); /* Extra powers */ if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_SUSTAIN) create_mask(newf, FALSE, OFT_SUST, OFT_MAX); else if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_RESIST) create_mask(newf, FALSE, OFT_HRES, OFT_MAX); else if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_POWER) create_mask(newf, FALSE, OFT_PROT, OFT_MISC, OFT_MAX); if (o_ptr->ego->xtra) of_on(o_ptr->flags, get_new_attr(flags, newf)); /* Apply extra o_ptr->ego bonuses */ o_ptr->to_h += randcalc(o_ptr->ego->to_h, level, RANDOMISE); o_ptr->to_d += randcalc(o_ptr->ego->to_d, level, RANDOMISE); o_ptr->to_a += randcalc(o_ptr->ego->to_a, level, RANDOMISE); /* Apply pvals */ for (i = 0; i < o_ptr->ego->num_pvals; i++) { of_copy(flags, o_ptr->ego->pval_flags[i]); x = randcalc(o_ptr->ego->pval[i], level, RANDOMISE); for (flag = of_next(flags, FLAG_START); flag != FLAG_END; flag = of_next(flags, flag + 1)) object_add_pval(o_ptr, x, flag); } /* Apply flags */ of_union(o_ptr->flags, o_ptr->ego->flags); return; } /** * Apply minimum pvals to an ego item. Note that 0 is treated as meaning * "do not apply a minimum to this pval", so it leaves negative pvals alone. */ void ego_min_pvals(object_type *o_ptr) { int i, j, flag; if (!o_ptr->ego) return; for (i = 0; i < o_ptr->num_pvals; i++) for (j = 0; j < o_ptr->ego->num_pvals; j++) for (flag = of_next(o_ptr->ego->pval_flags[j], FLAG_START); flag != FLAG_END; flag = of_next(o_ptr->ego->pval_flags[j], flag + 1)) if (!of_has(o_ptr->flags, flag) || (o_ptr->ego->min_pval[j] != NO_MINIMUM && of_has(o_ptr->pval_flags[i], flag) && o_ptr->pval[i] < o_ptr->ego->min_pval[j])) object_add_pval(o_ptr, o_ptr->ego->min_pval[j] - o_ptr->pval[i], flag); } /** * Apply minimum standards for ego-items. */ static void ego_apply_minima(object_type *o_ptr) { if (!o_ptr->ego) return; if (o_ptr->ego->min_to_h != NO_MINIMUM && o_ptr->to_h < o_ptr->ego->min_to_h) o_ptr->to_h = o_ptr->ego->min_to_h; if (o_ptr->ego->min_to_d != NO_MINIMUM && o_ptr->to_d < o_ptr->ego->min_to_d) o_ptr->to_d = o_ptr->ego->min_to_d; if (o_ptr->ego->min_to_a != NO_MINIMUM && o_ptr->to_a < o_ptr->ego->min_to_a) o_ptr->to_a = o_ptr->ego->min_to_a; ego_min_pvals(o_ptr); } /** * Try to find an ego-item for an object, setting o_ptr->ego if successful and * applying various bonuses. */ static void make_ego_item(object_type *o_ptr, int level) { /* Cannot further improve artifacts or ego items */ if (o_ptr->artifact || o_ptr->ego) return; /* Occasionally boost the generation level of an item */ if (level > 0 && one_in_(GREAT_EGO)) level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH)); /* Try to get a legal ego type for this item */ o_ptr->ego = ego_find_random(o_ptr, level); /* Actually apply the ego template to the item */ if (o_ptr->ego) ego_apply_magic(o_ptr, level); return; } /*** Make an artifact ***/ /** * Copy artifact data to a normal object, and set various slightly hacky * globals. */ void copy_artifact_data(object_type *o_ptr, const artifact_type *a_ptr) { int i; /* Extract the data */ for (i = 0; i < a_ptr->num_pvals; i++) if (a_ptr->pval[i]) { o_ptr->pval[i] = a_ptr->pval[i]; of_copy(o_ptr->pval_flags[i], a_ptr->pval_flags[i]); } o_ptr->num_pvals = a_ptr->num_pvals; o_ptr->ac = a_ptr->ac; o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; o_ptr->to_a = a_ptr->to_a; o_ptr->to_h = a_ptr->to_h; o_ptr->to_d = a_ptr->to_d; o_ptr->weight = a_ptr->weight; of_union(o_ptr->flags, a_ptr->flags); } /* * Mega-Hack -- Attempt to create one of the "Special Objects". * * We are only called from "make_object()" * * Note -- see "make_artifact()" and "apply_magic()". * * We *prefer* to create the special artifacts in order, but this is * normally outweighed by the "rarity" rolls for those artifacts. */ static bool make_artifact_special(object_type *o_ptr, int level) { int i; object_kind *kind; /* No artifacts, do nothing */ if (OPT(birth_no_artifacts)) return FALSE; /* No artifacts in the town */ if (!p_ptr->depth) return FALSE; /* Check the special artifacts */ for (i = 0; i < ART_MIN_NORMAL; ++i) { artifact_type *a_ptr = &a_info[i]; /* Skip "empty" artifacts */ if (!a_ptr->name) continue; /* Cannot make an artifact twice */ if (a_ptr->created) continue; /* Enforce minimum "depth" (loosely) */ if (a_ptr->alloc_min > p_ptr->depth) { /* Get the "out-of-depth factor" */ int d = (a_ptr->alloc_min - p_ptr->depth) * 2; /* Roll for out-of-depth creation */ if (randint0(d) != 0) continue; } /* Enforce maximum depth (strictly) */ if (a_ptr->alloc_max < p_ptr->depth) continue; /* Artifact "rarity roll" */ if (randint1(100) > a_ptr->alloc_prob) continue; /* Find the base object */ kind = lookup_kind(a_ptr->tval, a_ptr->sval); /* Make sure the kind was found */ if (!kind) continue; /* Enforce minimum "object" level (loosely) */ if (kind->level > level) { /* Get the "out-of-depth factor" */ int d = (kind->level - level) * 5; /* Roll for out-of-depth creation */ if (randint0(d) != 0) continue; } /* Assign the template */ object_prep(o_ptr, kind, a_ptr->alloc_min, RANDOMISE); /* Mark the item as an artifact */ o_ptr->artifact = a_ptr; /* Copy across all the data from the artifact struct */ copy_artifact_data(o_ptr, a_ptr); /* Mark the artifact as "created" */ a_ptr->created = 1; /* Success */ return TRUE; } /* Failure */ return FALSE; } /* * Attempt to change an object into an artifact. If the object is already * set to be an artifact, use that, or otherwise use a suitable randomly- * selected artifact. * * This routine should only be called by "apply_magic()" * * Note -- see "make_artifact_special()" and "apply_magic()" */ static bool make_artifact(object_type *o_ptr) { artifact_type *a_ptr; int i; bool art_ok = TRUE; /* Make sure birth no artifacts isn't set */ if (OPT(birth_no_artifacts)) art_ok = FALSE; /* Special handling of Grond/Morgoth */ if (o_ptr->artifact) { switch (o_ptr->artifact->aidx) { case ART_GROND: case ART_MORGOTH: art_ok = TRUE; } } if (!art_ok) return (FALSE); /* No artifacts in the town */ if (!p_ptr->depth) return (FALSE); /* Paranoia -- no "plural" artifacts */ if (o_ptr->number != 1) return (FALSE); /* Check the artifact list (skip the "specials") */ for (i = ART_MIN_NORMAL; !o_ptr->artifact && i < z_info->a_max; i++) { a_ptr = &a_info[i]; /* Skip "empty" items */ if (!a_ptr->name) continue; /* Cannot make an artifact twice */ if (a_ptr->created) continue; /* Must have the correct fields */ if (a_ptr->tval != o_ptr->tval) continue; if (a_ptr->sval != o_ptr->sval) continue; /* XXX XXX Enforce minimum "depth" (loosely) */ if (a_ptr->alloc_min > p_ptr->depth) { /* Get the "out-of-depth factor" */ int d = (a_ptr->alloc_min - p_ptr->depth) * 2; /* Roll for out-of-depth creation */ if (randint0(d) != 0) continue; } /* Enforce maximum depth (strictly) */ if (a_ptr->alloc_max < p_ptr->depth) continue; /* We must make the "rarity roll" */ if (randint1(100) > a_ptr->alloc_prob) continue; /* Mark the item as an artifact */ o_ptr->artifact = a_ptr; } if (o_ptr->artifact) { copy_artifact_data(o_ptr, o_ptr->artifact); o_ptr->artifact->created = 1; return TRUE; } return FALSE; } /*** Apply magic to an item ***/ /* * Apply magic to a weapon. */ static void apply_magic_weapon(object_type *o_ptr, int level, int power) { if (power <= 0) return; o_ptr->to_h += randint1(5) + m_bonus(5, level); o_ptr->to_d += randint1(5) + m_bonus(5, level); if (power > 1) { o_ptr->to_h += m_bonus(10, level); o_ptr->to_d += m_bonus(10, level); if (wield_slot(o_ptr) == INVEN_WIELD || obj_is_ammo(o_ptr)) { /* Super-charge the damage dice */ while ((o_ptr->dd * o_ptr->ds > 0) && one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++; /* But not too high */ if (o_ptr->dd > 9) o_ptr->dd = 9; } } } /* * Apply magic to armour */ static void apply_magic_armour(object_type *o_ptr, int level, int power) { if (power <= 0) return; o_ptr->to_a += randint1(5) + m_bonus(5, level); if (power > 1) o_ptr->to_a += m_bonus(10, level); } /** * Wipe an object clean and make it a standard object of the specified kind. */ void object_prep(object_type *o_ptr, struct object_kind *k, int lev, aspect rand_aspect) { int i, flag, x; bitflag flags[OF_SIZE]; /* Clean slate */ WIPE(o_ptr, object_type); /* Assign the kind and copy across data */ o_ptr->kind = k; o_ptr->tval = k->tval; o_ptr->sval = k->sval; o_ptr->ac = k->ac; o_ptr->dd = k->dd; o_ptr->ds = k->ds; o_ptr->weight = k->weight; /* Default number */ o_ptr->number = 1; /* Apply pvals and then copy flags */ for (i = 0; i < k->num_pvals; i++) { of_copy(flags, k->pval_flags[i]); x = randcalc(k->pval[i], lev, rand_aspect); for (flag = of_next(flags, FLAG_START); flag != FLAG_END; flag = of_next(flags, flag + 1)) object_add_pval(o_ptr, x, flag); } of_copy(o_ptr->flags, k->base->flags); of_union(o_ptr->flags, k->flags); /* Assign charges (wands/staves only) */ if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF) o_ptr->pval[DEFAULT_PVAL] = randcalc(k->charge, lev, rand_aspect); /* Assign flagless pval for food or oil */ if (o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION || o_ptr->tval == TV_FLASK) o_ptr->pval[DEFAULT_PVAL] = randcalc(k->pval[DEFAULT_PVAL], lev, rand_aspect); /* Default fuel for lamps */ if (o_ptr->tval == TV_LIGHT) { if (o_ptr->sval == SV_LIGHT_TORCH) o_ptr->timeout = DEFAULT_TORCH; else if (o_ptr->sval == SV_LIGHT_LANTERN) o_ptr->timeout = DEFAULT_LAMP; } /* Default magic */ o_ptr->to_h = randcalc(k->to_h, lev, rand_aspect); o_ptr->to_d = randcalc(k->to_d, lev, rand_aspect); o_ptr->to_a = randcalc(k->to_a, lev, rand_aspect); } /** * Applying magic to an object, which includes creating ego-items, and applying * random bonuses, * * The `good` argument forces the item to be at least `good`, and the `great` * argument does likewise. Setting `allow_artifacts` to TRUE allows artifacts * to be created here. * * If `good` or `great` are not set, then the `lev` argument controls the * quality of item. * * Returns 0 if a normal object, 1 if a good object, 2 if an ego item, 3 if an * artifact. */ s16b apply_magic(object_type *o_ptr, int lev, bool allow_artifacts, bool good, bool great) { int i; s16b power = 0; /* Chance of being `good` and `great` */ int good_chance = (lev + 2) * 3; int great_chance = MIN(lev / 4 + lev, 50); /* Roll for "good" */ if (good || (randint0(100) < good_chance)) { power = 1; /* Roll for "great" */ if (great || (randint0(100) < great_chance)) power = 2; } /* Roll for artifact creation */ if (allow_artifacts) { int rolls = 0; /* Get one roll if excellent */ if (power >= 2) rolls = 1; /* Get four rolls if forced great */ if (great) rolls = 4; /* Roll for artifacts if allowed */ for (i = 0; i < rolls; i++) if (make_artifact(o_ptr)) return 3; } /* Try to make an ego item */ if (power == 2) make_ego_item(o_ptr, lev); /* Apply magic */ switch (o_ptr->tval) { case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOW: case TV_SHOT: case TV_ARROW: case TV_BOLT: apply_magic_weapon(o_ptr, lev, power); break; case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_SHIELD: case TV_HELM: case TV_CROWN: case TV_CLOAK: case TV_GLOVES: case TV_BOOTS: apply_magic_armour(o_ptr, lev, power); break; case TV_RING: if (o_ptr->sval == SV_RING_SPEED) { /* Super-charge the ring */ while (one_in_(2)) o_ptr->pval[which_pval(o_ptr, OF_SPEED)]++; } break; case TV_CHEST: /* Hack -- skip ruined chests */ if (o_ptr->kind->level <= 0) break; /* Hack -- pick a "difficulty" */ o_ptr->pval[DEFAULT_PVAL] = randint1(o_ptr->kind->level); /* Never exceed "difficulty" of 55 to 59 */ if (o_ptr->pval[DEFAULT_PVAL] > 55) o_ptr->pval[DEFAULT_PVAL] = (s16b)(55 + randint0(5)); break; } /* Apply minima from ego items if necessary */ ego_apply_minima(o_ptr); return power; } /*** Generate a random object ***/ /* * Hack -- determine if a template is "good". * * Note that this test only applies to the object *kind*, so it is * possible to choose a kind which is "good", and then later cause * the actual object to be cursed. We do explicitly forbid objects * which are known to be boring or which start out somewhat damaged. */ static bool kind_is_good(const object_kind *kind) { /* Analyze the item type */ switch (kind->tval) { /* Armor -- Good unless damaged */ case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_DRAG_ARMOR: case TV_SHIELD: case TV_CLOAK: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: { if (randcalc(kind->to_a, 0, MINIMISE) < 0) return (FALSE); return (TRUE); } /* Weapons -- Good unless damaged */ case TV_BOW: case TV_SWORD: case TV_HAFTED: case TV_POLEARM: case TV_DIGGING: { if (randcalc(kind->to_h, 0, MINIMISE) < 0) return (FALSE); if (randcalc(kind->to_d, 0, MINIMISE) < 0) return (FALSE); return (TRUE); } /* Ammo -- Arrows/Bolts are good */ case TV_BOLT: case TV_ARROW: { return (TRUE); } /* Books -- High level books are good */ case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: { if (kind->sval >= SV_BOOK_MIN_GOOD) return (TRUE); return (FALSE); } /* Rings -- Rings of Speed are good */ case TV_RING: { if (kind->sval == SV_RING_SPEED) return (TRUE); return (FALSE); } /* Amulets -- Amulets of the Magi are good */ case TV_AMULET: { if (kind->sval == SV_AMULET_THE_MAGI) return (TRUE); if (kind->sval == SV_AMULET_DEVOTION) return (TRUE); if (kind->sval == SV_AMULET_WEAPONMASTERY) return (TRUE); if (kind->sval == SV_AMULET_TRICKERY) return (TRUE); return (FALSE); } } /* Assume not good */ return (FALSE); } /** Arrays holding an index of objects to generate for a given level */ static u32b obj_total[MAX_DEPTH]; static byte *obj_alloc; static u32b obj_total_great[MAX_DEPTH]; static byte *obj_alloc_great; /* Don't worry about probabilities for anything past dlev100 */ #define MAX_O_DEPTH 100 /* * Using k_info[], init rarity data for the entire dungeon. */ bool init_obj_alloc(void) { int k_max = z_info->k_max; int item, lev; /* Free obj_allocs if allocated */ FREE(obj_alloc); /* Allocate and wipe */ obj_alloc = C_ZNEW((MAX_O_DEPTH + 1) * k_max, byte); obj_alloc_great = C_ZNEW((MAX_O_DEPTH + 1) * k_max, byte); /* Wipe the totals */ C_WIPE(obj_total, MAX_O_DEPTH + 1, u32b); C_WIPE(obj_total_great, MAX_O_DEPTH + 1, u32b); /* Init allocation data */ for (item = 1; item < k_max; item++) { const object_kind *kind = &k_info[item]; int min = kind->alloc_min; int max = kind->alloc_max; /* If an item doesn't have a rarity, move on */ if (!kind->alloc_prob) continue; /* Go through all the dungeon levels */ for (lev = 0; lev <= MAX_O_DEPTH; lev++) { int rarity = kind->alloc_prob; /* Save the probability in the standard table */ if ((lev < min) || (lev > max)) rarity = 0; obj_total[lev] += rarity; obj_alloc[(lev * k_max) + item] = rarity; /* Save the probability in the "great" table if relevant */ if (!kind_is_good(kind)) rarity = 0; obj_total_great[lev] += rarity; obj_alloc_great[(lev * k_max) + item] = rarity; } } return TRUE; } /* * Free object allocation info. */ void free_obj_alloc(void) { FREE(obj_alloc); FREE(obj_alloc_great); } /* * Choose an object kind given a dungeon level to choose it for. */ object_kind *get_obj_num(int level, bool good) { /* This is the base index into obj_alloc for this dlev */ size_t ind, item; u32b value; /* Occasional level boost */ if ((level > 0) && one_in_(GREAT_OBJ)) { /* What a bizarre calculation */ level = 1 + (level * MAX_O_DEPTH / randint1(MAX_O_DEPTH)); } /* Paranoia */ level = MIN(level, MAX_O_DEPTH); level = MAX(level, 0); /* Pick an object */ ind = level * z_info->k_max; if (!good) { value = randint0(obj_total[level]); for (item = 1; item < z_info->k_max; item++) { /* Found it */ if (value < obj_alloc[ind + item]) break; /* Decrement */ value -= obj_alloc[ind + item]; } } else { value = randint0(obj_total_great[level]); for (item = 1; item < z_info->k_max; item++) { /* Found it */ if (value < obj_alloc_great[ind + item]) break; /* Decrement */ value -= obj_alloc_great[ind + item]; } } /* Return the item index */ return objkind_byid(item); } /* * Attempt to make an object (normal or good/great) * * This routine plays nasty games to generate the "special artifacts". * We assume that the given object has been "wiped". You can optionally * receive the object's value in value if you pass a non-null pointer. * * Returns the whether or not creation worked. */ bool make_object(struct cave *c, object_type *j_ptr, int lev, bool good, bool great, s32b *value) { int base; object_kind *kind; /* Try to make a special artifact */ if (one_in_(good ? 10 : 1000)) { if (make_artifact_special(j_ptr, lev)) { if (value) *value = object_value_real(j_ptr, 1, FALSE, TRUE); return TRUE; } /* If we failed to make an artifact, the player gets a great item */ good = great = TRUE; } /* Base level for the object */ base = (good ? (lev + 10) : lev); /* Get the object, prep it and apply magic */ kind = get_obj_num(base, good || great); if (!kind) return FALSE; object_prep(j_ptr, kind, lev, RANDOMISE); apply_magic(j_ptr, lev, TRUE, good, great); /* Generate multiple items */ if (kind->gen_mult_prob >= randint1(100)) j_ptr->number = randcalc(kind->stack_size, lev, RANDOMISE); if(value) *value = object_value_real(j_ptr, j_ptr->number, FALSE, TRUE); /* Return value, increased for uncursed out-of-depth objects */ if (!cursed_p(j_ptr->flags) && (kind->alloc_min > c->depth)) { if (value) *value = (kind->alloc_min - c->depth) * (*value / 5); } return TRUE; } /*** Make a gold item ***/ /* The largest possible average gold drop at max depth with biggest spread */ #define MAX_GOLD_DROP (3 * MAX_DEPTH + 30) /* * Make a money object */ void make_gold(object_type *j_ptr, int lev, int coin_type) { int sval; /* This average is 20 at dlev0, 105 at dlev40, 220 at dlev100. */ /* Follows the formula: y=2x+20 */ s32b avg = 2*lev + 20; s32b spread = lev + 10; s32b value = rand_spread(avg, spread); /* Increase the range to infinite, moving the average to 110% */ while (one_in_(100) && value * 10 <= MAX_SHORT) value *= 10; /* Pick a treasure variety scaled by level, or force a type */ if (coin_type != SV_GOLD_ANY) sval = coin_type; else sval = (((value * 100) / MAX_GOLD_DROP) * SV_GOLD_MAX) / 100; /* Do not create illegal treasure types */ if (sval >= SV_GOLD_MAX) sval = SV_GOLD_MAX - 1; /* Prepare a gold object */ object_prep(j_ptr, lookup_kind(TV_GOLD, sval), lev, RANDOMISE); /* If we're playing with no_selling, increase the value */ if (OPT(birth_no_selling) && p_ptr->depth) value = value * MIN(5, p_ptr->depth); /* Cap gold at max short (or alternatively make pvals s32b) */ if (value > MAX_SHORT) value = MAX_SHORT; j_ptr->pval[DEFAULT_PVAL] = value; } angband-v3.3.2/src/ui-menu.c0000644000175000017500000005056211651552410015131 0ustar chriscchrisc/* * File: ui-menu.c * Purpose: Generic menu interaction functions * * Copyright (c) 2007 Pete Mack * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "ui-event.h" #include "ui-menu.h" /* Cursor colours */ const byte curs_attrs[2][2] = { { TERM_SLATE, TERM_BLUE }, /* Greyed row */ { TERM_WHITE, TERM_L_BLUE } /* Valid row */ }; /* Some useful constants */ const char lower_case[] = "abcdefghijklmnopqrstuvwxyz"; const char upper_case[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char all_letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* forward declarations */ static void display_menu_row(menu_type *menu, int pos, int top, bool cursor, int row, int col, int width); static bool menu_calc_size(menu_type *menu); static bool is_valid_row(menu_type *menu, int cursor); /* Display an event, with possible preference overrides */ static void display_action_aux(menu_action *act, byte color, int row, int col, int wid) { /* TODO: add preference support */ /* TODO: wizard mode should show more data */ Term_erase(col, row, wid); if (act->name) Term_putstr(col, row, wid, color, act->name); } /* ------------------------------------------------------------------------ * MN_ACTIONS HELPER FUNCTIONS * * MN_ACTIONS is the type of menu iterator that displays a simple list of * menu_actions. * ------------------------------------------------------------------------ */ static char menu_action_tag(menu_type *m, int oid) { menu_action *acts = menu_priv(m); return acts[oid].tag; } static int menu_action_valid(menu_type *m, int oid) { menu_action *acts = menu_priv(m); if (acts[oid].flags & MN_ACT_HIDDEN) return 2; return acts[oid].name ? TRUE : FALSE; } static void menu_action_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { menu_action *acts = menu_priv(m); byte color = curs_attrs[!(acts[oid].flags & (MN_ACT_GRAYED))][0 != cursor]; display_action_aux(&acts[oid], color, row, col, width); } static bool menu_action_handle(menu_type *m, const ui_event *event, int oid) { menu_action *acts = menu_priv(m); if (event->type == EVT_SELECT) { if (!(acts->flags & MN_ACT_GRAYED) && acts[oid].action) { acts[oid].action(acts[oid].name, m->cursor); return TRUE; } } return FALSE; } /* Virtual function table for action_events */ static const menu_iter menu_iter_actions = { menu_action_tag, menu_action_valid, menu_action_display, menu_action_handle, NULL }; /* ------------------------------------------------------------------------ * MN_STRINGS HELPER FUNCTIONS * * MN_STRINGS is the type of menu iterator that displays a simple list of * strings - no action is associated, as selection will just return the index. * ------------------------------------------------------------------------ */ static void display_string(menu_type *m, int oid, bool cursor, int row, int col, int width) { const char **items = menu_priv(m); byte color = curs_attrs[CURS_KNOWN][0 != cursor]; Term_putstr(col, row, width, color, items[oid]); } /* Virtual function table for displaying arrays of strings */ const menu_iter menu_iter_strings = { NULL, /* get_tag() */ NULL, /* valid_row() */ display_string, /* display_row() */ NULL, /* row_handler() */ NULL }; /* ================== SKINS ============== */ /* Scrolling menu */ /* Find the position of a cursor given a screen address */ static int scrolling_get_cursor(int row, int col, int n, int top, region *loc) { int cursor = row - loc->row + top; if (cursor >= n) cursor = n - 1; return cursor; } /* Display current view of a skin */ static void display_scrolling(menu_type *menu, int cursor, int *top, region *loc) { int col = loc->col; int row = loc->row; int rows_per_page = loc->page_rows; int n = menu->filter_list ? menu->filter_count : menu->count; int i; /* Keep a certain distance from the top when possible */ if ((cursor <= *top) && (*top > 0)) *top = cursor - 1; /* Keep a certain distance from the bottom when possible */ if (cursor >= *top + (rows_per_page - 1)) *top = cursor - (rows_per_page - 1) + 1; /* Limit the top to legal places */ *top = MIN(*top, n - rows_per_page); *top = MAX(*top, 0); for (i = 0; i < rows_per_page; i++) { /* Blank all lines */ Term_erase(col, row + i, loc->width); if (i < n) { /* Redraw the line if it's within the number of menu items */ bool is_curs = (i == cursor - *top); display_menu_row(menu, i + *top, *top, is_curs, row + i, col, loc->width); } } if (menu->cursor >= 0) Term_gotoxy(col, row + cursor - *top); } static char scroll_get_tag(menu_type *menu, int pos) { if (menu->selections) return menu->selections[pos - menu->top]; return 0; } static ui_event scroll_process_direction(menu_type *m, int dir) { ui_event out = EVENT_EMPTY; /* Reject diagonals */ if (ddx[dir] && ddy[dir]) ; /* Forward/back */ else if (ddx[dir]) out.type = ddx[dir] < 0 ? EVT_ESCAPE : EVT_SELECT; /* Move up or down to the next valid & visible row */ else if (ddy[dir]) { m->cursor += ddy[dir]; out.type = EVT_MOVE; } return out; } /* Virtual function table for scrollable menu skin */ static const menu_skin menu_skin_scroll = { scrolling_get_cursor, display_scrolling, scroll_get_tag, scroll_process_direction }; /*** Multi-column menus ***/ /* Find the position of a cursor given a screen address */ static int columns_get_cursor(int row, int col, int n, int top, region *loc) { int rows_per_page = loc->page_rows; int colw = loc->width / (n + rows_per_page - 1) / rows_per_page; int cursor = row + rows_per_page * (col - loc->col) / colw; if (cursor < 0) cursor = 0; /* assert: This should never happen */ if (cursor >= n) cursor = n - 1; return cursor; } static void display_columns(menu_type *menu, int cursor, int *top, region *loc) { int c, r; int w, h; int n = menu->filter_list ? menu->filter_count : menu->count; int col = loc->col; int row = loc->row; int rows_per_page = loc->page_rows; int cols = (n + rows_per_page - 1) / rows_per_page; int colw = 23; Term_get_size(&w, &h); if ((colw * cols) > (w - col)) colw = (w - col) / cols; for (c = 0; c < cols; c++) { for (r = 0; r < rows_per_page; r++) { int pos = c * rows_per_page + r; bool is_cursor = (pos == cursor); if (pos < n) display_menu_row(menu, pos, 0, is_cursor, row + r, col + c * colw, colw); } } if (menu->cursor >= 0) Term_gotoxy(col + (cursor / rows_per_page) * colw, row + (cursor % rows_per_page) - *top); } static char column_get_tag(menu_type *menu, int pos) { if (menu->selections) return menu->selections[pos]; return 0; } static ui_event column_process_direction(menu_type *m, int dir) { ui_event out = EVENT_EMPTY; int n = m->filter_list ? m->filter_count : m->count; region *loc = &m->active; int rows_per_page = loc->page_rows; int cols = (n + rows_per_page - 1) / rows_per_page; if (ddx[dir]) m->cursor += ddx[dir] * rows_per_page; if (ddy[dir]) m->cursor += ddy[dir]; /* Adjust to the correct locations (roughly) */ if (m->cursor > n) m->cursor = m->cursor % rows_per_page; else if (m->cursor < 0) m->cursor = (rows_per_page * cols) + m->cursor; out.type = EVT_MOVE; return out; } /* Virtual function table for multi-column menu skin */ static const menu_skin menu_skin_column = { columns_get_cursor, display_columns, column_get_tag, column_process_direction }; /* ================== GENERIC HELPER FUNCTIONS ============== */ static bool is_valid_row(menu_type *menu, int cursor) { int oid; int count = menu->filter_list ? menu->filter_count : menu->count; if (cursor < 0 || cursor >= count) return FALSE; oid = menu->filter_list ? menu->filter_list[cursor] : cursor; if (menu->row_funcs->valid_row) return menu->row_funcs->valid_row(menu, oid); return TRUE; } /* * Return a new position in the menu based on the key * pressed and the flags and various handler functions. */ static int get_cursor_key(menu_type *menu, int top, struct keypress key) { int i; int n = menu->filter_list ? menu->filter_count : menu->count; if (menu->flags & MN_CASELESS_TAGS) key.code = toupper((unsigned char) key.code); if (menu->flags & MN_NO_TAGS) { return -1; } else if (menu->flags & MN_REL_TAGS) { for (i = 0; i < n; i++) { char c = menu->skin->get_tag(menu, i); if ((menu->flags & MN_CASELESS_TAGS) && c) c = toupper((unsigned char) c); if (c && c == (char)key.code) return i + menu->top; } } else if (!(menu->flags & MN_PVT_TAGS) && menu->selections) { for (i = 0; menu->selections[i]; i++) { char c = menu->selections[i]; if (menu->flags & MN_CASELESS_TAGS) c = toupper((unsigned char) c); if (c == (char)key.code) return i; } } else if (menu->row_funcs->get_tag) { for (i = 0; i < n; i++) { int oid = menu->filter_list ? menu->filter_list[i] : i; char c = menu->row_funcs->get_tag(menu, oid); if ((menu->flags & MN_CASELESS_TAGS) && c) c = toupper((unsigned char) c); if (c && c == (char)key.code) return i; } } return -1; } /* Modal display of menu */ static void display_menu_row(menu_type *menu, int pos, int top, bool cursor, int row, int col, int width) { int flags = menu->flags; char sel = 0; int oid = pos; if (menu->filter_list) oid = menu->filter_list[oid]; if (menu->row_funcs->valid_row && menu->row_funcs->valid_row(menu, oid) == 2) return; if (!(flags & MN_NO_TAGS)) { if (flags & MN_REL_TAGS) sel = menu->skin->get_tag(menu, pos); else if (menu->selections && !(flags & MN_PVT_TAGS)) sel = menu->selections[pos]; else if (menu->row_funcs->get_tag) sel = menu->row_funcs->get_tag(menu, oid); } if (sel) { /* TODO: CHECK FOR VALID */ byte color = curs_attrs[CURS_KNOWN][0 != (cursor)]; Term_putstr(col, row, 3, color, format("%c) ", sel)); col += 3; width -= 3; } menu->row_funcs->display_row(menu, oid, cursor, row, col, width); } void menu_refresh(menu_type *menu, bool reset_screen) { int oid = menu->cursor; region *loc = &menu->active; if (reset_screen) { screen_load(); screen_save(); } if (menu->filter_list && menu->cursor >= 0) oid = menu->filter_list[oid]; if (menu->title) Term_putstr(menu->boundary.col, menu->boundary.row, loc->width, TERM_WHITE, menu->title); if (menu->header) Term_putstr(loc->col, loc->row - 1, loc->width, TERM_WHITE, menu->header); if (menu->prompt) Term_putstr(menu->boundary.col, loc->row + loc->page_rows, loc->width, TERM_WHITE, menu->prompt); if (menu->browse_hook && oid >= 0) menu->browse_hook(oid, menu->menu_data, loc); menu->skin->display_list(menu, menu->cursor, &menu->top, loc); } /*** MENU RUNNING AND INPUT HANDLING CODE ***/ /* * Handle mouse input in a menu. * * Mouse output is either moving, selecting, escaping, or nothing. Returns * TRUE if something changes as a result of the click. */ bool menu_handle_mouse(menu_type *menu, const ui_event *in, ui_event *out) { int new_cursor; if (!region_inside(&menu->active, in)) { /* A click to the left of the active region is 'back' */ if (!region_inside(&menu->active, in) && in->mouse.x < menu->active.col) out->type = EVT_ESCAPE; } else { int count = menu->filter_list ? menu->filter_count : menu->count; new_cursor = menu->skin->get_cursor(in->mouse.y, in->mouse.x, count, menu->top, &menu->active); if (is_valid_row(menu, new_cursor)) { if (new_cursor == menu->cursor || !(menu->flags & MN_DBL_TAP)) out->type = EVT_SELECT; else out->type = EVT_MOVE; menu->cursor = new_cursor; } } return out->type != EVT_NONE; } /** * Handle any menu command keys / SELECT events. * * Returns TRUE if the key was handled at all (including if it's not handled * and just ignored). */ static bool menu_handle_action(menu_type *m, const ui_event *in) { if (m->row_funcs->row_handler) { int oid = m->cursor; if (m->filter_list) oid = m->filter_list[m->cursor]; return m->row_funcs->row_handler(m, in, oid); } return FALSE; } /** * Handle navigation keypresses. * * Returns TRUE if they key was intelligible as navigation, regardless of * whether any action was taken. */ bool menu_handle_keypress(menu_type *menu, const ui_event *in, ui_event *out) { bool eat = FALSE; int count = menu->filter_list ? menu->filter_count : menu->count; /* Get the new cursor position from the menu item tags */ int new_cursor = get_cursor_key(menu, menu->top, in->key); if (new_cursor >= 0 && is_valid_row(menu, new_cursor)) { if (!(menu->flags & MN_DBL_TAP) || new_cursor == menu->cursor) out->type = EVT_SELECT; else out->type = EVT_MOVE; menu->cursor = new_cursor; } /* Escape stops us here */ else if (in->key.code == ESCAPE) out->type = EVT_ESCAPE; /* Menus with no rows can't be navigated or used, so eat all keypresses */ else if (count <= 0) eat = TRUE; /* Try existing, known keys */ else if (in->key.code == ' ') { int rows = menu->active.page_rows; int total = count; if (rows < total) { /* Go to start of next page */ menu->cursor += menu->active.page_rows; if (menu->cursor >= total - 1) menu->cursor = 0; menu->top = menu->cursor; out->type = EVT_MOVE; } else { eat = TRUE; } } else if (in->key.code == '\n' || in->key.code == '\r') out->type = EVT_SELECT; /* Try directional movement */ else { int dir = target_dir(in->key); if (dir) { *out = menu->skin->process_dir(menu, dir); if (out->type == EVT_MOVE) { while (!is_valid_row(menu, menu->cursor)) { /* Loop around */ if (menu->cursor > count - 1) menu->cursor = 0; else if (menu->cursor < 0) menu->cursor = count - 1; else menu->cursor += ddy[dir]; } assert(menu->cursor >= 0); assert(menu->cursor < count); } } } return eat; } /* * Run a menu. * * If popup is true, the screen is saved before the menu is drawn, and * restored afterwards. Each time a popup menu is redrawn, it resets the * screen before redrawing. */ ui_event menu_select(menu_type *menu, int notify, bool popup) { ui_event in = EVENT_EMPTY; bool no_act = (menu->flags & MN_NO_ACTION) ? TRUE : FALSE; assert(menu->active.width != 0 && menu->active.page_rows != 0); notify |= (EVT_SELECT | EVT_ESCAPE); if (popup) screen_save(); /* Stop on first unhandled event */ while (!(in.type & notify)) { ui_event out = EVENT_EMPTY; menu_refresh(menu, popup); in = inkey_ex(); /* Handle mouse & keyboard commands */ if (in.type == EVT_MOUSE) { menu_handle_mouse(menu, &in, &out); } else if (in.type == EVT_KBRD) { if (!no_act && menu->cmd_keys && strchr(menu->cmd_keys, (char)in.key.code) && menu_handle_action(menu, &in)) continue; menu_handle_keypress(menu, &in, &out); } else if (in.type == EVT_RESIZE) { menu_calc_size(menu); if (menu->row_funcs->resize) menu->row_funcs->resize(menu); } /* XXX should redraw menu here if cursor has moved */ /* If we've selected an item, then send that event out */ if (out.type == EVT_SELECT && !no_act && menu_handle_action(menu, &out)) continue; /* Notify about the outgoing type */ if (notify & out.type) { if (popup) screen_load(); return out; } } if (popup) screen_load(); return in; } /* ================== MENU ACCESSORS ================ */ /** * Return the menu iter struct for a given iter ID. */ const menu_iter *menu_find_iter(menu_iter_id id) { switch (id) { case MN_ITER_ACTIONS: return &menu_iter_actions; case MN_ITER_STRINGS: return &menu_iter_strings; } return NULL; } /* * Return the skin behaviour struct for a given skin ID. */ static const menu_skin *menu_find_skin(skin_id id) { switch (id) { case MN_SKIN_SCROLL: return &menu_skin_scroll; case MN_SKIN_COLUMNS: return &menu_skin_column; } return NULL; } void menu_set_filter(menu_type *menu, const int filter_list[], int n) { menu->filter_list = filter_list; menu->filter_count = n; menu_ensure_cursor_valid(menu); } void menu_release_filter(menu_type *menu) { menu->filter_list = NULL; menu->filter_count = 0; menu_ensure_cursor_valid(menu); } void menu_ensure_cursor_valid(menu_type *m) { int row; int count = m->filter_list ? m->filter_count : m->count; for (row = m->cursor; row < count; row++) { if (is_valid_row(m, row)) { m->cursor = row; return; } } /* If we've run off the end, without finding a valid row, put cursor * on the last row */ m->cursor = count - 1; } /* ======================== MENU INITIALIZATION ==================== */ static bool menu_calc_size(menu_type *menu) { /* Calculate term-relative positions */ menu->active = region_calculate(menu->boundary); if (menu->title) { menu->active.row += 2; menu->active.page_rows -= 2; menu->active.col += 4; } if (menu->header) { menu->active.row++; menu->active.page_rows--; } if (menu->prompt) { if (menu->active.page_rows > 1) { menu->active.page_rows--; } else { int offset = strlen(menu->prompt) + 2; menu->active.col += offset; menu->active.width -= offset; } } return (menu->active.width > 0 && menu->active.page_rows > 0); } bool menu_layout(menu_type *m, const region *loc) { m->boundary = *loc; return menu_calc_size(m); } void menu_setpriv(menu_type *menu, int count, void *data) { menu->count = count; menu->menu_data = data; menu_ensure_cursor_valid(menu); } void *menu_priv(menu_type *menu) { return menu->menu_data; } void menu_init(menu_type *menu, skin_id skin_id, const menu_iter *iter) { const menu_skin *skin = menu_find_skin(skin_id); assert(skin && "menu skin not found!"); assert(iter && "menu iter not found!"); /* Wipe the struct */ memset(menu, 0, sizeof *menu); /* Menu-specific initialisation */ menu->row_funcs = iter; menu->skin = skin; menu->cursor = 0; } menu_type *menu_new(skin_id skin_id, const menu_iter *iter) { menu_type *m = mem_alloc(sizeof *m); menu_init(m, skin_id, iter); return m; } menu_type *menu_new_action(menu_action *acts, size_t n) { menu_type *m = menu_new(MN_SKIN_SCROLL, menu_find_iter(MN_ITER_ACTIONS)); menu_setpriv(m, n, acts); return m; } /*** Dynamic menu handling ***/ struct menu_entry { char *text; int value; struct menu_entry *next; }; static void dynamic_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { struct menu_entry *entry; byte color = curs_attrs[CURS_KNOWN][0 != cursor]; for (entry = menu_priv(m); oid; oid--) { entry = entry->next; assert(entry); } Term_putstr(col, row, width, color, entry->text); } static const menu_iter dynamic_iter = { NULL, /* tag */ NULL, /* valid */ dynamic_display, NULL, /* handler */ NULL /* resize */ }; menu_type *menu_dynamic_new(void) { menu_type *m = menu_new(MN_SKIN_SCROLL, &dynamic_iter); menu_setpriv(m, 0, NULL); return m; } void menu_dynamic_add(menu_type *m, const char *text, int value) { struct menu_entry *head = menu_priv(m); struct menu_entry *new = mem_zalloc(sizeof *new); assert(m->row_funcs == &dynamic_iter); new->text = string_make(text); new->value = value; if (head) { struct menu_entry *tail = head; while (1) { if (tail->next) tail = tail->next; else break; } tail->next = new; menu_setpriv(m, m->count + 1, head); } else { menu_setpriv(m, m->count + 1, new); } } size_t menu_dynamic_longest_entry(menu_type *m) { size_t biggest = 0; size_t current; struct menu_entry *entry; for (entry = menu_priv(m); entry; entry = entry->next) { current = strlen(entry->text); if (current > biggest) biggest = current; } return biggest; } int menu_dynamic_select(menu_type *m) { ui_event e = menu_select(m, 0, TRUE); struct menu_entry *entry; int cursor = m->cursor; if (e.type == EVT_ESCAPE) return -1; for (entry = menu_priv(m); cursor; cursor--) { entry = entry->next; assert(entry); } return entry->value; } void menu_dynamic_free(menu_type *m) { struct menu_entry *entry = menu_priv(m); if (entry) { struct menu_entry *next = entry->next; string_free(entry->text); mem_free(entry); entry = next; } mem_free(m); } angband-v3.3.2/src/init.h0000644000175000017500000000237711651552410014523 0ustar chriscchrisc/* File: init.h */ /* * Copyright (c) 2000 Robert Ruehlmann * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. */ #ifndef INCLUDED_INIT_H #define INCLUDED_INIT_H #include "h-basic.h" #include "z-bitflag.h" #include "z-file.h" #include "z-rand.h" #include "parser.h" #ifdef TEST extern struct parser *init_parse_a(void); extern struct parser *init_parse_c(void); extern struct parser *init_parse_e(void); extern struct parser *init_parse_f(void); extern struct parser *init_parse_h(void); extern struct parser *init_parse_k(void); extern struct parser *init_parse_p(void); extern struct parser *init_parse_r(void); extern struct parser *init_parse_s(void); extern struct parser *init_parse_v(void); extern struct parser *init_parse_z(void); extern struct parser *init_parse_flavor(void); extern struct parser *init_parse_names(void); extern struct parser *init_parse_hints(void); #endif extern void init_file_paths(const char *config, const char *lib, const char *data); extern void init_arrays(void); extern void create_needed_dirs(void); extern bool init_angband(void); extern void cleanup_angband(void); #endif /* INCLUDED_INIT_H */ angband-v3.3.2/src/birth.h0000644000175000017500000000057311651552410014664 0ustar chriscchrisc/* birth.h */ #ifndef BIRTH_H #define BIRTH_H #include "player/types.h" extern void player_init(struct player *p); extern void player_generate(struct player *p, const player_sex *s, struct player_race *r, player_class *c); extern char *get_history(struct history_chart *h, s16b *sc); extern void wield_all(struct player *p); #endif /* !BIRTH_H */ angband-v3.3.2/src/ui-options.c0000644000175000017500000010044511651552410015654 0ustar chriscchrisc/* * File: ui-options.c * Purpose: Text UI options handling code (everything accessible from '=') * * Copyright (c) 1997-2000 Robert A. Koeneke, James E. Wilson, Ben Harrison * Copyright (c) 2007 Pete Mack * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "keymap.h" #include "squelch.h" #include "prefs.h" #include "object/tvalsval.h" #include "ui-menu.h" #include "files.h" static void dump_pref_file(void (*dump)(ang_file *), const char *title, int row) { char ftmp[80]; char buf[1024]; screen_save(); /* Prompt */ prt(format("%s to a pref file", title), row, 0); /* Prompt */ prt("File: ", row + 2, 0); /* Default filename */ strnfmt(ftmp, sizeof ftmp, "%s.prf", op_ptr->base_name); /* Get a filename */ if (askfor_aux(ftmp, sizeof ftmp, NULL)) { /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, ftmp); prt("", 0, 0); if (prefs_save(buf, dump, title)) msg("Dumped %s", strstr(title, " ") + 1); else msg("Failed"); } screen_load(); return; } static void do_cmd_pref_file_hack(long row); /*** Options display and setting ***/ /*** Boolean option menu code ***/ /** * Displays an option entry. */ static void option_toggle_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { byte attr = curs_attrs[CURS_KNOWN][cursor != 0]; bool *options = menu_priv(m); c_prt(attr, format("%-45s: %s (%s)", option_desc(oid), options[oid] ? "yes" : "no ", option_name(oid)), row, col); } /** * Handle keypresses for an option entry. */ static bool option_toggle_handle(menu_type *m, const ui_event *event, int oid) { bool next = FALSE; if (event->type == EVT_SELECT) { /* Hack -- birth options can not be toggled after birth */ /* At birth, m->flags == MN_DBL_TAP. After birth, m->flags == MN_NO_TAGS */ if (!(OPT_BIRTH <= oid && oid <= OPT_BIRTH + N_OPTS_BIRTH - 1 && m->flags == MN_NO_TAGS)) { option_set(option_name(oid), !op_ptr->opt[oid]); } } else if (event->type == EVT_KBRD) { if (event->key.code == 'y' || event->key.code == 'Y') { option_set(option_name(oid), TRUE); next = TRUE; } else if (event->key.code == 'n' || event->key.code == 'N') { option_set(option_name(oid), FALSE); next = TRUE; } else if (event->key.code == '?') { screen_save(); show_file(format("option.txt#%s", option_name(oid)), NULL, 0, 0); screen_load(); } else { return FALSE; } } else { return FALSE; } if (next) { m->cursor++; m->cursor = (m->cursor + m->filter_count) % m->filter_count; } return TRUE; } /** Toggle option menu display and handling functions */ static const menu_iter option_toggle_iter = { NULL, NULL, option_toggle_display, option_toggle_handle, NULL }; /** * Interact with some options */ static void option_toggle_menu(const char *name, int page) { int i; menu_type *m = menu_new(MN_SKIN_SCROLL, &option_toggle_iter); /* for all menus */ m->prompt = "Set option (y/n/t), '?' for information"; m->cmd_keys = "?YyNnTt"; m->selections = "abcdefghijklmopqrsuvwxz"; m->flags = MN_DBL_TAP; /* We add 10 onto the page amount to indicate we're at birth */ if (page == OPT_PAGE_BIRTH) { m->prompt = "You can only modify these options at character birth. '?' for information"; m->cmd_keys = "?"; m->flags = MN_NO_TAGS; } else if (page == OPT_PAGE_BIRTH + 10) { page -= 10; } /* for this particular menu */ m->title = name; /* Find the number of valid entries */ for (i = 0; i < OPT_PAGE_PER; i++) { if (option_page[page][i] == OPT_NONE) break; } /* Set the data to the player's options */ menu_setpriv(m, OPT_MAX, &op_ptr->opt); menu_set_filter(m, option_page[page], i); menu_layout(m, &SCREEN_REGION); /* Run the menu */ screen_save(); clear_from(0); menu_select(m, 0, FALSE); screen_load(); mem_free(m); } /** * Edit birth options. */ void do_cmd_options_birth(void) { option_toggle_menu("Birth options", OPT_PAGE_BIRTH + 10); } /* * Modify the "window" options */ static void do_cmd_options_win(const char *name, int row) { int i, j, d; int y = 0; int x = 0; ui_event ke; u32b new_flags[ANGBAND_TERM_MAX]; /* Set new flags to the old values */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { new_flags[j] = op_ptr->window_flag[j]; } /* Clear screen */ screen_save(); clear_from(0); /* Interact */ while (1) { /* Prompt */ prt("Window flags ( to move, 't'/Enter to toggle, or ESC)", 0, 0); /* Display the windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { byte a = TERM_WHITE; const char *s = angband_term_name[j]; /* Use color */ if (j == x) a = TERM_L_BLUE; /* Window name, staggered, centered */ Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s); } /* Display the options */ for (i = 0; i < PW_MAX_FLAGS; i++) { byte a = TERM_WHITE; const char *str = window_flag_desc[i]; /* Use color */ if (i == y) a = TERM_L_BLUE; /* Unused option */ if (!str) str = "(Unused option)"; /* Flag name */ Term_putstr(0, i + 5, -1, a, str); /* Display the windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { char c = '.'; a = TERM_WHITE; /* Use color */ if ((i == y) && (j == x)) a = TERM_L_BLUE; /* Active flag */ if (new_flags[j] & (1L << i)) c = 'X'; /* Flag value */ Term_putch(35 + j * 5, i + 5, a, c); } } /* Place Cursor */ Term_gotoxy(35 + x * 5, y + 5); /* Get key */ ke = inkey_ex(); /* Mouse interaction */ if (ke.type == EVT_MOUSE) { int choicey = ke.mouse.y - 5; int choicex = (ke.mouse.x - 35)/5; if ((choicey >= 0) && (choicey < PW_MAX_FLAGS) && (choicex > 0) && (choicex < ANGBAND_TERM_MAX) && !(ke.mouse.x % 5)) { y = choicey; x = (ke.mouse.x - 35)/5; } } /* Allow escape */ else if (ke.type == EVT_KBRD) { if (ke.key.code == ESCAPE || ke.key.code == 'q') break; /* Toggle */ else if (ke.key.code == '5' || ke.key.code == 't' || ke.key.code == '\n' || ke.key.code == '\r') { /* Hack -- ignore the main window */ if (x == 0) bell("Cannot set main window flags!"); /* Toggle flag (off) */ else if (new_flags[x] & (1L << y)) new_flags[x] &= ~(1L << y); /* Toggle flag (on) */ else new_flags[x] |= (1L << y); /* Continue */ continue; } /* Extract direction */ d = target_dir(ke.key); /* Move */ if (d != 0) { x = (x + ddx[d] + 8) % ANGBAND_TERM_MAX; y = (y + ddy[d] + 16) % PW_MAX_FLAGS; } } } /* Notice changes */ subwindows_set_flags(new_flags, ANGBAND_TERM_MAX); screen_load(); } /*** Interact with keymaps ***/ /* * Current (or recent) keymap action */ static struct keypress keymap_buffer[KEYMAP_ACTION_MAX]; /* * Ask for, and display, a keymap trigger. * * Returns the trigger input. * * Note that both "flush()" calls are extremely important. This may * no longer be true, since "util.c" is much simpler now. XXX XXX XXX */ static struct keypress keymap_get_trigger(void) { char tmp[80]; struct keypress buf[2] = { { 0 }, { 0 } }; /* Flush */ flush(); /* Get a key */ buf[0] = inkey(); /* Convert to ascii */ keypress_to_text(tmp, sizeof(tmp), buf, FALSE); /* Hack -- display the trigger */ Term_addstr(-1, TERM_WHITE, tmp); /* Flush */ flush(); /* Return trigger */ return buf[0]; } /* * Macro menu action functions */ static void ui_keymap_pref_load(const char *title, int row) { do_cmd_pref_file_hack(16); } static void ui_keymap_pref_append(const char *title, int row) { (void)dump_pref_file(keymap_dump, "Dump keymaps", 13); } static void ui_keymap_query(const char *title, int row) { char tmp[1024]; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; struct keypress c; const struct keypress *act; prt(title, 13, 0); prt("Key: ", 14, 0); /* Get a keymap trigger & mapping */ c = keymap_get_trigger(); act = keymap_find(mode, c); /* Nothing found */ if (!act) { /* Prompt */ prt("No keymap with that trigger. Press any key to continue.", 16, 0); inkey(); } /* Found one */ else { /* Analyze the current action */ keypress_to_text(tmp, sizeof(tmp), act, FALSE); /* Display the current action */ prt("Found: ", 15, 0); Term_addstr(-1, TERM_WHITE, tmp); prt("Press any key to continue.", 17, 0); inkey(); } } static void ui_keymap_create(const char *title, int row) { bool done = FALSE; size_t n = 0; struct keypress c; char tmp[1024]; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; prt(title, 13, 0); prt("Key: ", 14, 0); c = keymap_get_trigger(); if (c.code == '$') { c_prt(TERM_L_RED, "The '$' key is reserved.", 16, 2); prt("Press any key to continue.", 18, 0); inkey(); return; } /* Get an encoded action, with a default response */ while (!done) { struct keypress kp = {EVT_NONE, 0, 0}; int color = TERM_WHITE; if (n == 0) color = TERM_YELLOW; if (n == KEYMAP_ACTION_MAX) color = TERM_L_RED; keypress_to_text(tmp, sizeof(tmp), keymap_buffer, FALSE); c_prt(color, format("Action: %s", tmp), 15, 0); c_prt(TERM_L_BLUE, " Press '$' when finished.", 17, 0); c_prt(TERM_L_BLUE, " Use 'CTRL-U' to reset.", 18, 0); c_prt(TERM_L_BLUE, format("(Maximum keymap length is %d keys.)", KEYMAP_ACTION_MAX), 19, 0); kp = inkey(); if (kp.code == '$') { done = TRUE; continue; } switch (kp.code) { case KC_DELETE: case KC_BACKSPACE: { if (n > 0) { n -= 1; keymap_buffer[n].type = 0; keymap_buffer[n].code = 0; keymap_buffer[n].mods = 0; } break; } case KTRL('U'): { memset(keymap_buffer, 0, sizeof keymap_buffer); n = 0; break; } default: { if (n == KEYMAP_ACTION_MAX) continue; if (n == 0) { memset(keymap_buffer, 0, sizeof keymap_buffer); } keymap_buffer[n++] = kp; break; } } } if (c.code && get_check("Save this keymap? ")) { keymap_add(mode, c, keymap_buffer, TRUE); prt("Keymap added. Press any key to continue.", 17, 0); inkey(); } } static void ui_keymap_remove(const char *title, int row) { struct keypress c; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; prt(title, 13, 0); prt("Key: ", 14, 0); c = keymap_get_trigger(); if (keymap_remove(mode, c)) prt("Removed.", 16, 0); else prt("No keymap to remove!", 16, 0); /* Prompt */ prt("Press any key to continue.", 17, 0); inkey(); } static void keymap_browse_hook(int oid, void *db, const region *loc) { char tmp[1024]; message_flush(); clear_from(13); /* Show current action */ prt("Current action (if any) shown below:", 13, 0); keypress_to_text(tmp, sizeof(tmp), keymap_buffer, FALSE); prt(tmp, 14, 0); } static menu_type *keymap_menu; static menu_action keymap_actions[] = { { 0, 0, "Load a user pref file", ui_keymap_pref_load }, { 0, 0, "Append keymaps to a file", ui_keymap_pref_append }, { 0, 0, "Query a keymap", ui_keymap_query }, { 0, 0, "Create a keymap", ui_keymap_create }, { 0, 0, "Remove a keymap", ui_keymap_remove }, }; static void do_cmd_keymaps(const char *title, int row) { region loc = {0, 0, 0, 12}; screen_save(); clear_from(0); if (!keymap_menu) { keymap_menu = menu_new_action(keymap_actions, N_ELEMENTS(keymap_actions)); keymap_menu->title = title; keymap_menu->selections = lower_case; keymap_menu->browse_hook = keymap_browse_hook; } menu_layout(keymap_menu, &loc); menu_select(keymap_menu, 0, FALSE); screen_load(); } /*** Interact with visuals ***/ static void visuals_pref_load(const char *title, int row) { do_cmd_pref_file_hack(15); } #ifdef ALLOW_VISUALS static void visuals_dump_monsters(const char *title, int row) { dump_pref_file(dump_monsters, title, 15); } static void visuals_dump_objects(const char *title, int row) { dump_pref_file(dump_objects, title, 15); } static void visuals_dump_features(const char *title, int row) { dump_pref_file(dump_features, title, 15); } static void visuals_dump_flavors(const char *title, int row) { dump_pref_file(dump_flavors, title, 15); } #endif /* ALLOW_VISUALS */ static void visuals_reset(const char *title, int row) { /* Reset */ reset_visuals(TRUE); /* Message */ prt("", 0, 0); msg("Visual attr/char tables reset."); message_flush(); } static menu_type *visual_menu; static menu_action visual_menu_items [] = { { 0, 0, "Load a user pref file", visuals_pref_load }, #ifdef ALLOW_VISUALS { 0, 0, "Dump monster attr/chars", visuals_dump_monsters }, { 0, 0, "Dump object attr/chars", visuals_dump_objects }, { 0, 0, "Dump feature attr/chars", visuals_dump_features }, { 0, 0, "Dump flavor attr/chars", visuals_dump_flavors }, #endif /* ALLOW_VISUALS */ { 0, 0, "Reset visuals", visuals_reset }, }; static void visuals_browse_hook(int oid, void *db, const region *loc) { message_flush(); clear_from(1); } /* * Interact with "visuals" */ static void do_cmd_visuals(const char *title, int row) { screen_save(); clear_from(0); if (!visual_menu) { visual_menu = menu_new_action(visual_menu_items, N_ELEMENTS(visual_menu_items)); visual_menu->title = title; visual_menu->selections = lower_case; visual_menu->browse_hook = visuals_browse_hook; visual_menu->header = "To edit visuals, use the knowledge menu"; } menu_layout(visual_menu, &SCREEN_REGION); menu_select(visual_menu, 0, FALSE); screen_load(); } /*** Interact with colours ***/ #ifdef ALLOW_COLORS static void colors_pref_load(const char *title, int row) { /* Ask for and load a user pref file */ do_cmd_pref_file_hack(8); /* XXX should probably be a cleaner way to tell UI about * colour changes - how about doing this in the pref file * loading code too? */ Term_xtra(TERM_XTRA_REACT, 0); Term_redraw(); } static void colors_pref_dump(const char *title, int row) { dump_pref_file(dump_colors, title, 15); } static void colors_modify(const char *title, int row) { int i; static byte a = 0; /* Prompt */ prt("Command: Modify colors", 8, 0); /* Hack -- query until done */ while (1) { const char *name; char index; struct keypress cx; /* Clear */ clear_from(10); /* Exhibit the normal colors */ for (i = 0; i < BASIC_COLORS; i++) { /* Exhibit this color */ Term_putstr(i*3, 20, -1, a, "##"); /* Exhibit character letter */ Term_putstr(i*3, 21, -1, (byte)i, format(" %c", color_table[i].index_char)); /* Exhibit all colors */ Term_putstr(i*3, 22, -1, (byte)i, format("%2d", i)); } /* Describe the color */ name = ((a < BASIC_COLORS) ? color_table[a].name : "undefined"); index = ((a < BASIC_COLORS) ? color_table[a].index_char : '?'); /* Describe the color */ Term_putstr(5, 10, -1, TERM_WHITE, format("Color = %d, Name = %s, Index = %c", a, name, index)); /* Label the Current values */ Term_putstr(5, 12, -1, TERM_WHITE, format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x", angband_color_table[a][0], angband_color_table[a][1], angband_color_table[a][2], angband_color_table[a][3])); /* Prompt */ Term_putstr(0, 14, -1, TERM_WHITE, "Command (n/N/k/K/r/R/g/G/b/B): "); /* Get a command */ cx = inkey(); /* All done */ if (cx.code == ESCAPE) break; /* Analyze */ if (cx.code == 'n') a = (byte)(a + 1); if (cx.code == 'N') a = (byte)(a - 1); if (cx.code == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1); if (cx.code == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1); if (cx.code == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1); if (cx.code == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1); if (cx.code == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1); if (cx.code == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1); if (cx.code == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1); if (cx.code == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1); /* Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Hack -- redraw */ Term_redraw(); } } static void colors_browse_hook(int oid, void *db, const region *loc) { message_flush(); clear_from(1); } static menu_type *color_menu; static menu_action color_events [] = { { 0, 0, "Load a user pref file", colors_pref_load }, { 0, 0, "Dump colors", colors_pref_dump }, { 0, 0, "Modify colors", colors_modify } }; /* * Interact with "colors" */ static void do_cmd_colors(const char *title, int row) { screen_save(); clear_from(0); if (!color_menu) { color_menu = menu_new_action(color_events, N_ELEMENTS(color_events)); color_menu->title = title; color_menu->selections = lower_case; color_menu->browse_hook = colors_browse_hook; } menu_layout(color_menu, &SCREEN_REGION); menu_select(color_menu, 0, FALSE); screen_load(); } #endif /*** Non-complex menu actions ***/ static bool askfor_aux_numbers(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime) { switch (keypress.code) { case ESCAPE: case '\n': case '\r': case ARROW_LEFT: case ARROW_RIGHT: case 0x7F: case '\010': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return askfor_aux_keypress(buf, buflen, curs, len, keypress, firsttime); } return FALSE; } /* * Set base delay factor */ static void do_cmd_delay(const char *name, int row) { char tmp[4] = ""; int msec = op_ptr->delay_factor; strnfmt(tmp, sizeof(tmp), "%i", op_ptr->delay_factor); screen_save(); /* Prompt */ prt("Command: Base Delay Factor", 20, 0); prt(format("Current base delay factor: %d msec", op_ptr->delay_factor, msec), 22, 0); prt("New base delay factor (0-255): ", 21, 0); /* Ask for a numeric value */ if (askfor_aux(tmp, sizeof(tmp), askfor_aux_numbers)) { u16b val = (u16b) strtoul(tmp, NULL, 0); op_ptr->delay_factor = MIN(val, 255); } screen_load(); } /* * Set hitpoint warning level */ static void do_cmd_hp_warn(const char *name, int row) { bool res; char tmp[4] = ""; u16b warn; strnfmt(tmp, sizeof(tmp), "%i", op_ptr->hitpoint_warn); screen_save(); /* Prompt */ prt("Command: Hitpoint Warning", 20, 0); prt(format("Current hitpoint warning: %d (%d%%)", op_ptr->hitpoint_warn, op_ptr->hitpoint_warn * 10), 22, 0); prt("New hitpoint warning (0-9): ", 21, 0); /* Ask the user for a string */ res = askfor_aux(tmp, sizeof(tmp), askfor_aux_numbers); /* Process input */ if (res) { warn = (u16b) strtoul(tmp, NULL, 0); /* Reset nonsensical warnings */ if (warn > 9) warn = 0; op_ptr->hitpoint_warn = warn; } screen_load(); } /* * Set "lazy-movement" delay */ static void do_cmd_lazymove_delay(const char *name, int row) { bool res; char tmp[4] = ""; strnfmt(tmp, sizeof(tmp), "%i", lazymove_delay); screen_save(); /* Prompt */ prt("Command: Movement Delay Factor", 20, 0); prt(format("Current movement delay: %d (%d msec)", lazymove_delay, lazymove_delay * 10), 22, 0); prt("New movement delay: ", 21, 0); /* Ask the user for a string */ res = askfor_aux(tmp, sizeof(tmp), askfor_aux_numbers); /* Process input */ if (res) { lazymove_delay = (u16b) strtoul(tmp, NULL, 0); } screen_load(); } /* * Ask for a "user pref file" and process it. * * This function should only be used by standard interaction commands, * in which a standard "Command:" prompt is present on the given row. * * Allow absolute file names? XXX XXX XXX */ static void do_cmd_pref_file_hack(long row) { char ftmp[80]; screen_save(); /* Prompt */ prt("Command: Load a user pref file", row, 0); /* Prompt */ prt("File: ", row + 2, 0); /* Default filename */ strnfmt(ftmp, sizeof ftmp, "%s.prf", op_ptr->base_name); /* Ask for a file (or cancel) */ if (askfor_aux(ftmp, sizeof ftmp, NULL)) { /* Process the given filename */ if (process_pref_file(ftmp, FALSE, TRUE) == FALSE) { /* Mention failure */ prt("", 0, 0); msg("Failed to load '%s'!", ftmp); } else { /* Mention success */ prt("", 0, 0); msg("Loaded '%s'.", ftmp); } } screen_load(); } /* * Write options to a file. */ static void do_dump_options(const char *title, int row) { dump_pref_file(option_dump, "Dump options", 20); } /* * Load a pref file. */ static void options_load_pref_file(const char *n, int row) { do_cmd_pref_file_hack(20); } /*** Quality-squelch menu ***/ /* Structure to describe tval/description pairings. */ typedef struct { int tval; const char *desc; } tval_desc; /* Categories for sval-dependent squelch. */ static tval_desc sval_dependent[] = { { TV_STAFF, "Staffs" }, { TV_WAND, "Wands" }, { TV_ROD, "Rods" }, { TV_SCROLL, "Scrolls" }, { TV_POTION, "Potions" }, { TV_RING, "Rings" }, { TV_AMULET, "Amulets" }, { TV_FOOD, "Food" }, { TV_MAGIC_BOOK, "Magic books" }, { TV_PRAYER_BOOK, "Prayer books" }, { TV_SPIKE, "Spikes" }, { TV_LIGHT, "Lights" }, { TV_FLASK, "Flasks of oil" }, /* { TV_DRAG_ARMOR, "Dragon Mail Armor" }, */ { TV_GOLD, "Money" }, }; /* * menu struct for differentiating aware from unaware squelch */ typedef struct { object_kind *kind; bool aware; } squelch_choice; /* * Ordering function for squelch choices. * Aware comes before unaware, and then sort alphabetically. */ static int cmp_squelch(const void *a, const void *b) { char bufa[80]; char bufb[80]; const squelch_choice *x = a; const squelch_choice *y = b; if (!x->aware && y->aware) return 1; if (x->aware && !y->aware) return -1; object_kind_name(bufa, sizeof(bufa), x->kind, x->aware); object_kind_name(bufb, sizeof(bufb), y->kind, y->aware); return strcmp(bufa, bufb); } /* * Display an entry in the menu. */ static void quality_display(menu_type *menu, int oid, bool cursor, int row, int col, int width) { const char *name = quality_choices[oid].name; byte level = squelch_level[oid]; const char *level_name = quality_values[level].name; byte attr = (cursor ? TERM_L_BLUE : TERM_WHITE); c_put_str(attr, format("%-20s : %s", name, level_name), row, col); } /* * Display the quality squelch subtypes. */ static void quality_subdisplay(menu_type *menu, int oid, bool cursor, int row, int col, int width) { const char *name = quality_values[oid].name; byte attr = (cursor ? TERM_L_BLUE : TERM_WHITE); c_put_str(attr, name, row, col); } /* * Handle keypresses. */ static bool quality_action(menu_type *m, const ui_event *event, int oid) { menu_type menu; menu_iter menu_f = { NULL, NULL, quality_subdisplay, NULL, NULL }; region area = { 27, 2, 29, SQUELCH_MAX }; ui_event evt; int count; /* Display at the right point */ area.row += oid; /* Save */ screen_save(); /* Work out how many options we have */ count = SQUELCH_MAX; if ((oid == TYPE_RING) || (oid == TYPE_AMULET)) count = area.page_rows = SQUELCH_BAD + 1; /* Run menu */ menu_init(&menu, MN_SKIN_SCROLL, &menu_f); menu_setpriv(&menu, count, quality_values); /* Stop menus from going off the bottom of the screen */ if (area.row + menu.count > Term->hgt - 1) area.row += Term->hgt - 1 - area.row - menu.count; menu_layout(&menu, &area); window_make(area.col - 2, area.row - 1, area.col + area.width + 2, area.row + area.page_rows); evt = menu_select(&menu, 0, TRUE); /* Set the new value appropriately */ if (evt.type == EVT_SELECT) squelch_level[oid] = menu.cursor; /* Load and finish */ screen_load(); return TRUE; } /* * Display quality squelch menu. */ static void quality_menu(void *unused, const char *also_unused) { menu_type menu; menu_iter menu_f = { NULL, NULL, quality_display, quality_action, NULL }; region area = { 0, 0, 0, 0 }; /* Save screen */ screen_save(); clear_from(0); /* Set up the menu */ menu_init(&menu, MN_SKIN_SCROLL, &menu_f); menu.title = "Quality squelch menu"; menu_setpriv(&menu, TYPE_MAX, quality_values); menu_layout(&menu, &area); /* Select an entry */ menu_select(&menu, 0, FALSE); /* Load screen */ screen_load(); return; } /*** Sval-dependent menu ***/ /* * Display an entry on the sval menu */ static void squelch_sval_menu_display(menu_type *menu, int oid, bool cursor, int row, int col, int width) { char buf[80]; const squelch_choice *choice = menu_priv(menu); object_kind *kind = choice[oid].kind; bool aware = choice[oid].aware; byte attr = curs_attrs[(int)aware][0 != cursor]; /* Acquire the "name" of object "i" */ object_kind_name(buf, sizeof(buf), kind, aware); /* Print it */ c_put_str(attr, format("[ ] %s", buf), row, col); if ((aware && (kind->squelch & SQUELCH_IF_AWARE)) || (!aware && (kind->squelch & SQUELCH_IF_UNAWARE))) c_put_str(TERM_L_RED, "*", row, col + 1); } /* * Deal with events on the sval menu */ static bool squelch_sval_menu_action(menu_type *m, const ui_event *event, int oid) { const squelch_choice *choice = menu_priv(m); if (event->type == EVT_SELECT) { object_kind *kind = choice[oid].kind; /* Toggle the appropriate flag */ if (choice[oid].aware) kind->squelch ^= SQUELCH_IF_AWARE; else kind->squelch ^= SQUELCH_IF_UNAWARE; p_ptr->notice |= PN_SQUELCH; return TRUE; } return FALSE; } static const menu_iter squelch_sval_menu = { NULL, NULL, squelch_sval_menu_display, squelch_sval_menu_action, NULL, }; /** * Collect all tvals in the big squelch_choice array */ static int squelch_collect_kind(int tval, squelch_choice **ch) { squelch_choice *choice; int num = 0; int i; /* Create the array, with entries both for aware and unaware squelch */ choice = mem_alloc(2 * z_info->k_max * sizeof *choice); for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip empty objects, unseen objects, and incorrect tvals */ if (!k_ptr->name || k_ptr->tval != tval) continue; if (!k_ptr->aware) { /* can unaware squelch anything */ choice[num].kind = k_ptr; choice[num++].aware = FALSE; } if ((k_ptr->everseen && !of_has(k_ptr->flags, OF_INSTA_ART)) || k_ptr->tval == TV_GOLD) { /* Do not display the artifact base kinds in this list */ /* aware squelch requires everseen */ /* do not require awareness for aware squelch, so people can set at game start */ choice[num].kind = k_ptr; choice[num++].aware = TRUE; } } if (num == 0) mem_free(choice); else *ch = choice; return num; } /* * Display list of svals to be squelched. */ static bool sval_menu(int tval, const char *desc) { menu_type *menu; region area = { 1, 2, -1, -1 }; squelch_choice *choices; int n_choices = squelch_collect_kind(tval, &choices); if (!n_choices) return FALSE; /* sort by name in squelch menus except for categories of items that are aware from the start */ switch (tval) { case TV_LIGHT: case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: case TV_DRAG_ARMOR: case TV_GOLD: /* leave sorted by sval */ break; default: /* sort by name */ sort(choices, n_choices, sizeof(*choices), cmp_squelch); } /* Save the screen and clear it */ screen_save(); clear_from(0); /* Help text */ prt(format("Squelch the following %s:", desc), 0, 0); /* Run menu */ menu = menu_new(MN_SKIN_COLUMNS, &squelch_sval_menu); menu_setpriv(menu, n_choices, choices); menu_layout(menu, &area); menu_select(menu, 0, FALSE); /* Free memory */ FREE(choices); /* Load screen */ screen_load(); return TRUE; } /* Returns TRUE if there's anything to display a menu of */ static bool seen_tval(int tval) { int i; for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip empty objects, unseen objects, and incorrect tvals */ if (!k_ptr->name) continue; if (!k_ptr->everseen) continue; if (k_ptr->tval != tval) continue; return TRUE; } return FALSE; } /* Extra options on the "item options" menu */ struct { char tag; const char *name; void (*action)(); /* this is a nasty hack */ } extra_item_options[] = { { 'Q', "Quality squelching options", quality_menu }, { '{', "Autoinscription setup", textui_browse_object_knowledge }, }; static char tag_options_item(menu_type *menu, int oid) { size_t line = (size_t) oid; if (line < N_ELEMENTS(sval_dependent)) return I2A(oid); /* Separator - blank line. */ if (line == N_ELEMENTS(sval_dependent)) return 0; line = line - N_ELEMENTS(sval_dependent) - 1; if (line < N_ELEMENTS(extra_item_options)) return extra_item_options[line].tag; return 0; } static int valid_options_item(menu_type *menu, int oid) { size_t line = (size_t) oid; if (line < N_ELEMENTS(sval_dependent)) return 1; /* Separator - blank line. */ if (line == N_ELEMENTS(sval_dependent)) return 0; line = line - N_ELEMENTS(sval_dependent) - 1; if (line < N_ELEMENTS(extra_item_options)) return 1; return 0; } static void display_options_item(menu_type *menu, int oid, bool cursor, int row, int col, int width) { size_t line = (size_t) oid; /* First section of menu - the svals */ if (line < N_ELEMENTS(sval_dependent)) { bool known = seen_tval(sval_dependent[line].tval); byte attr = curs_attrs[known ? CURS_KNOWN: CURS_UNKNOWN][(int)cursor]; c_prt(attr, sval_dependent[line].desc, row, col); } /* Second section - the "extra options" */ else { byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; line = line - N_ELEMENTS(sval_dependent) - 1; if (line < N_ELEMENTS(extra_item_options)) c_prt(attr, extra_item_options[line].name, row, col); } } static bool handle_options_item(menu_type *menu, const ui_event *event, int oid) { if (event->type == EVT_SELECT) { if ((size_t) oid < N_ELEMENTS(sval_dependent)) { sval_menu(sval_dependent[oid].tval, sval_dependent[oid].desc); } else { oid = oid - (int)N_ELEMENTS(sval_dependent) - 1; assert((size_t) oid < N_ELEMENTS(extra_item_options)); extra_item_options[oid].action(); } return TRUE; } return FALSE; } static const menu_iter options_item_iter = { tag_options_item, valid_options_item, display_options_item, handle_options_item, NULL }; /* * Display and handle the main squelching menu. */ void do_cmd_options_item(const char *title, int row) { menu_type menu; menu_init(&menu, MN_SKIN_SCROLL, &options_item_iter); menu_setpriv(&menu, N_ELEMENTS(sval_dependent) + N_ELEMENTS(extra_item_options) + 1, NULL); menu.title = title; menu_layout(&menu, &SCREEN_REGION); screen_save(); clear_from(0); menu_select(&menu, 0, FALSE); screen_load(); p_ptr->notice |= PN_SQUELCH; return; } /*** Main menu definitions and display ***/ static menu_type *option_menu; static menu_action option_actions[] = { { 0, 'a', "Interface and display options", option_toggle_menu }, { 0, 'e', "Warning and disturbance options", option_toggle_menu }, { 0, 'f', "Birth (difficulty) options", option_toggle_menu }, { 0, 'g', "Cheat options", option_toggle_menu }, {0, 0, 0, 0}, /* Load and append */ { 0, 'w', "Subwindow display settings", do_cmd_options_win }, { 0, 's', "Item squelch settings", do_cmd_options_item }, { 0, 'd', "Set base delay factor", do_cmd_delay }, { 0, 'h', "Set hitpoint warning", do_cmd_hp_warn }, { 0, 'i', "Set movement delay", do_cmd_lazymove_delay }, { 0, 'l', "Load a user pref file", options_load_pref_file }, { 0, 'o', "Save options", do_dump_options }, {0, 0, 0, 0}, /* Interact with */ { 0, 'm', "Interact with keymaps (advanced)", do_cmd_keymaps }, { 0, 'v', "Interact with visuals (advanced)", do_cmd_visuals }, #ifdef ALLOW_COLORS { 0, 'c', "Interact with colours (advanced)", do_cmd_colors }, #endif /* ALLOW_COLORS */ }; /* * Display the options main menu. */ void do_cmd_options(void) { if (!option_menu) { /* Main option menu */ option_menu = menu_new_action(option_actions, N_ELEMENTS(option_actions)); option_menu->title = "Options Menu"; option_menu->flags = MN_CASELESS_TAGS; } screen_save(); clear_from(0); menu_layout(option_menu, &SCREEN_REGION); menu_select(option_menu, 0, FALSE); screen_load(); } /* * Determines whether a tval is eligible for sval-squelch. */ bool squelch_tval(int tval) { size_t i; /* Only squelch if the tval's allowed */ for (i = 0; i < N_ELEMENTS(sval_dependent); i++) { if (tval == sval_dependent[i].tval) return TRUE; } return FALSE; } angband-v3.3.2/src/z-bitflag.h0000644000175000017500000000675011651552410015436 0ustar chriscchrisc/* * File: z-bitflag.h * Purpose: Low-level bit vector manipulation * * Copyright (c) 2009 William L Moore * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_Z_BITFLAG_H #define INCLUDED_Z_BITFLAG_H #include "h-basic.h" #include "z-form.h" #include "z-virt.h" #include "defines.h" /* The basic datatype of bitflags */ typedef byte bitflag; #define FLAG_WIDTH (sizeof(bitflag)*8) /* Enum flag value of the first valid flag in a set * Enums must be manually padded with the number of dummy elements */ #define FLAG_START 1 /* Sentinel value indicates no more flags present for va-arg functions */ #define FLAG_END (FLAG_START - 1) /* The array size necessary to hold "n" flags */ #define FLAG_SIZE(n) (((n) + FLAG_WIDTH - 1) / FLAG_WIDTH) /* The highest flag value plus one in an array of size "n" */ #define FLAG_MAX(n) (int)((n) * FLAG_WIDTH + FLAG_START) /* Convert a sequential flag enum value to its array index */ #define FLAG_OFFSET(id) (((id) - FLAG_START) / FLAG_WIDTH) /* Convert a sequential flag enum value to its binary flag value. */ #define FLAG_BINARY(id) (1 << ((id) - FLAG_START) % FLAG_WIDTH) bool flag_has (const bitflag *flags, const size_t size, const int flag); bool flag_has_dbg (const bitflag *flags, const size_t size, const int flag, const char *fi, const char *fl); int flag_next (const bitflag *flags, const size_t size, const int flag); bool flag_is_empty (const bitflag *flags, const size_t size); bool flag_is_full (const bitflag *flags, const size_t size); bool flag_is_inter (const bitflag *flags1, const bitflag *flags2, const size_t size); bool flag_is_subset (const bitflag *flags1, const bitflag *flags2, const size_t size); bool flag_is_equal (const bitflag *flags1, const bitflag *flags2, const size_t size); bool flag_on (bitflag *flags, const size_t size, const int flag); bool flag_on_dbg (bitflag *flags, const size_t size, const int flag, const char *fi, const char *fl); bool flag_off (bitflag *flags, const size_t size, const int flag); void flag_wipe (bitflag *flags, const size_t size); void flag_setall (bitflag *flags, const size_t size); void flag_negate (bitflag *flags, const size_t size); void flag_copy (bitflag *flags1, const bitflag *flags2, const size_t size); bool flag_union (bitflag *flags1, const bitflag *flags2, const size_t size); bool flag_comp_union(bitflag *flags1, const bitflag *flags2, const size_t size); bool flag_inter (bitflag *flags1, const bitflag *flags2, const size_t size); bool flag_diff (bitflag *flags1, const bitflag *flags2, const size_t size); bool flags_test (const bitflag *flags, const size_t size, ...); bool flags_test_all (const bitflag *flags, const size_t size, ...); bool flags_clear (bitflag *flags, const size_t size, ...); bool flags_set (bitflag *flags, const size_t size, ...); void flags_init (bitflag *flags, const size_t size, ...); bool flags_mask (bitflag *flags, const size_t size, ...); #endif angband-v3.3.2/src/keymap.h0000644000175000017500000000145611651552410015043 0ustar chriscchrisc#ifndef KEYMAP_H #define KEYMAP_H /** Maximum number of keypresses a trigger can map to. **/ #define KEYMAP_ACTION_MAX 20 /** Keymap modes. */ enum { KEYMAP_MODE_ORIG = 0, KEYMAP_MODE_ROGUE, KEYMAP_MODE_MAX }; /** Given a keymap mode and a keypress, return any attached action. */ const struct keypress *keymap_find(int keymap, struct keypress kc); /** Given a keymap mode, a trigger, and an action, store it in the keymap list. */ void keymap_add(int keymap, struct keypress trigger, struct keypress *actions, bool user); /** Given a keypress, remove any keymap that would trigger on that key. */ bool keymap_remove(int keymap, struct keypress trigger); /** Free all keymaps. */ void keymap_free(void); /** Save keymaps to the specified file. */ void keymap_dump(ang_file *fff); #endif /* KEYMAP_H */ angband-v3.3.2/src/x-spell.c0000644000175000017500000006730511651552410015141 0ustar chriscchrisc/* * File: x-spell.c * Purpose: Spell effect definitions and information about them * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "effects.h" #include "object/tvalsval.h" #include "spells.h" /* * The defines below must match the spell numbers in spell.txt * if they don't, "interesting" things will probably happen. * * It would be nice if we could get rid of this dependency. */ #define SPELL_MAGIC_MISSILE 0 #define SPELL_DETECT_MONSTERS 1 #define SPELL_PHASE_DOOR 2 #define SPELL_LIGHT_AREA 3 #define SPELL_FIND_TRAPS_DOORS 4 #define SPELL_CURE_LIGHT_WOUNDS 5 #define SPELL_TREASURE_DETECTION 6 /* #define SPELL_OBJECT_DETECTION 7 */ #define SPELL_IDENTIFY 8 #define SPELL_DETECT_INVISIBLE 9 #define SPELL_DETECT_ENCHANTMENT 10 #define SPELL_STINKING_CLOUD 11 #define SPELL_LIGHTNING_BOLT 12 #define SPELL_CONFUSE_MONSTER 13 #define SPELL_SLEEP_MONSTER 14 #define SPELL_WONDER 15 #define SPELL_FROST_BOLT 16 #define SPELL_ACID_BOLT 17 #define SPELL_FIRE_BOLT 18 #define SPELL_TRAP_DOOR_DESTRUCTION 19 #define SPELL_SPEAR_OF_LIGHT 20 #define SPELL_TURN_STONE_TO_MUD 21 #define SPELL_DOOR_CREATION 22 #define SPELL_EARTHQUAKE 23 #define SPELL_STAIR_CREATION 24 #define SPELL_CURE_POISON 25 #define SPELL_SATISFY_HUNGER 26 #define SPELL_HEROISM 27 #define SPELL_BERSERKER 28 #define SPELL_HASTE_SELF 29 #define SPELL_TELEPORT_SELF 30 #define SPELL_SLOW_MONSTER 31 #define SPELL_TELEPORT_OTHER 32 #define SPELL_TELEPORT_LEVEL 33 #define SPELL_WORD_OF_RECALL 34 #define SPELL_POLYMORPH_OTHER 35 #define SPELL_SHOCK_WAVE 36 #define SPELL_EXPLOSION 37 #define SPELL_CLOUD_KILL 38 #define SPELL_MASS_SLEEP 39 #define SPELL_BEDLAM 40 #define SPELL_REND_SOUL 41 #define SPELL_WORD_OF_DESTRUCTION 42 #define SPELL_CHAOS_STRIKE 43 #define SPELL_RESIST_COLD 44 #define SPELL_RESIST_FIRE 45 #define SPELL_RESIST_POISON 46 #define SPELL_RESISTANCE 47 #define SPELL_SHIELD 48 #define SPELL_RUNE_OF_PROTECTION 49 #define SPELL_RECHARGE_ITEM_I 50 #define SPELL_ENCHANT_ARMOR 51 #define SPELL_ENCHANT_WEAPON 52 #define SPELL_RECHARGE_ITEM_II 53 #define SPELL_ELEMENTAL_BRAND 54 #define SPELL_FROST_BALL 55 #define SPELL_ACID_BALL 56 #define SPELL_FIRE_BALL 57 #define SPELL_ICE_STORM 58 #define SPELL_BANISHMENT 59 #define SPELL_METEOR_SWARM 60 #define SPELL_MASS_BANISHMENT 61 #define SPELL_RIFT 62 #define SPELL_MANA_STORM 63 /* Beginners Handbook */ #define PRAYER_DETECT_EVIL 0 #define PRAYER_CURE_LIGHT_WOUNDS 1 #define PRAYER_BLESS 2 #define PRAYER_REMOVE_FEAR 3 #define PRAYER_CALL_LIGHT 4 #define PRAYER_FIND_TRAPS_DOORS 5 #define PRAYER_SLOW_POISON 7 /* Words of Wisdom */ #define PRAYER_SCARE_MONSTER 8 #define PRAYER_PORTAL 9 #define PRAYER_CURE_SERIOUS_WOUNDS 10 #define PRAYER_CHANT 11 #define PRAYER_SANCTUARY 12 #define PRAYER_SATISFY_HUNGER 13 #define PRAYER_REMOVE_CURSE 14 #define PRAYER_RESIST_HEAT_COLD 15 /* Chants and Blessings */ #define PRAYER_NEUTRALIZE_POISON 16 #define PRAYER_ORB_OF_DRAINING 17 #define PRAYER_CURE_CRITICAL_WOUNDS 18 #define PRAYER_SENSE_INVISIBLE 19 #define PRAYER_PROTECTION_FROM_EVIL 20 #define PRAYER_EARTHQUAKE 21 #define PRAYER_SENSE_SURROUNDINGS 22 #define PRAYER_CURE_MORTAL_WOUNDS 23 #define PRAYER_TURN_UNDEAD 24 /* Exorcism and Dispelling */ #define PRAYER_PRAYER 25 #define PRAYER_DISPEL_UNDEAD 26 #define PRAYER_HEAL 27 #define PRAYER_DISPEL_EVIL 28 #define PRAYER_GLYPH_OF_WARDING 29 #define PRAYER_HOLY_WORD 30 /* Godly Insights */ #define PRAYER_DETECT_MONSTERS 31 #define PRAYER_DETECTION 32 #define PRAYER_PERCEPTION 33 #define PRAYER_PROBING 34 #define PRAYER_CLAIRVOYANCE 35 /* Purifications and Healing */ #define PRAYER_CURE_SERIOUS_WOUNDS2 36 #define PRAYER_CURE_MORTAL_WOUNDS2 37 #define PRAYER_HEALING 38 #define PRAYER_RESTORATION 39 #define PRAYER_REMEMBRANCE 40 /* Wrath of God */ #define PRAYER_DISPEL_UNDEAD2 41 #define PRAYER_DISPEL_EVIL2 42 #define PRAYER_BANISH_EVIL 43 #define PRAYER_WORD_OF_DESTRUCTION 44 #define PRAYER_ANNIHILATION 45 /* Holy Infusions */ #define PRAYER_UNBARRING_WAYS 46 #define PRAYER_RECHARGING 47 #define PRAYER_DISPEL_CURSE 48 #define PRAYER_ENCHANT_WEAPON 49 #define PRAYER_ENCHANT_ARMOUR 50 #define PRAYER_ELEMENTAL_BRAND 51 /* Ethereal openings */ #define PRAYER_BLINK 52 #define PRAYER_TELEPORT_SELF 53 #define PRAYER_TELEPORT_OTHER 54 #define PRAYER_TELEPORT_LEVEL 55 #define PRAYER_WORD_OF_RECALL 56 #define PRAYER_ALTER_REALITY 57 int get_spell_index(const struct object *object, int index) { struct spell *sp; for (sp = object->kind->spells; sp; sp = sp->next) if (sp->snum == index) return sp->spell_index; return -1; } const char *get_spell_name(int tval, int spell) { if (tval == TV_MAGIC_BOOK) return s_info[spell].name; else return s_info[spell + PY_MAX_SPELLS].name; } void get_spell_info(int tval, int spell, char *p, size_t len) { /* Blank 'p' first */ p[0] = '\0'; /* Mage spells */ if (tval == TV_MAGIC_BOOK) { int plev = p_ptr->lev; /* Analyze the spell */ switch (spell) { case SPELL_MAGIC_MISSILE: strnfmt(p, len, " dam %dd4", 3 + ((plev - 1) / 5)); break; case SPELL_PHASE_DOOR: strnfmt(p, len, " range 10"); break; case SPELL_LIGHT_AREA: strnfmt(p, len, " dam 2d%d", (plev / 2)); break; case SPELL_CURE_LIGHT_WOUNDS: strnfmt(p, len, " heal 15%%"); break; case SPELL_STINKING_CLOUD: strnfmt(p, len, " dam %d", 10 + (plev / 2)); break; case SPELL_LIGHTNING_BOLT: strnfmt(p, len, " dam %dd6", (3 + ((plev - 5) / 6))); break; case SPELL_FROST_BOLT: strnfmt(p, len, " dam %dd8", (5 + ((plev - 5) / 4))); break; case SPELL_ACID_BOLT: strnfmt(p, len, " dam %dd8", (8 + ((plev - 5) / 4))); break; case SPELL_FIRE_BOLT: strnfmt(p, len, " dam %dd8", (6 + ((plev - 5) / 4))); break; case SPELL_SPEAR_OF_LIGHT: strnfmt(p, len, " dam 6d8"); break; case SPELL_HEROISM: strnfmt(p, len, " dur 25+d25"); break; case SPELL_BERSERKER: strnfmt(p, len, " dur 25+d25"); break; case SPELL_HASTE_SELF: strnfmt(p, len, " dur %d+d20", plev); break; case SPELL_TELEPORT_SELF: strnfmt(p, len, " range %d", plev * 5); break; case SPELL_SHOCK_WAVE: strnfmt(p, len, " dam %d", 10 + plev); break; case SPELL_EXPLOSION: strnfmt(p, len, " dam %d", 20 + plev * 2); break; case SPELL_CLOUD_KILL: strnfmt(p, len, " dam %d", 40 + (plev / 2)); break; case SPELL_REND_SOUL: strnfmt(p, len, " dam 11d%d", plev); break; case SPELL_CHAOS_STRIKE: strnfmt(p, len, " dam 13d%d", plev); break; case SPELL_RESIST_COLD: strnfmt(p, len, " dur 20+d20"); break; case SPELL_RESIST_FIRE: strnfmt(p, len, " dur 20+d20"); break; case SPELL_RESIST_POISON: strnfmt(p, len, " dur 20+d20"); break; case SPELL_RESISTANCE: strnfmt(p, len, " dur 20+d20"); break; case SPELL_SHIELD: strnfmt(p, len, " dur 30+d20"); break; case SPELL_FROST_BALL: strnfmt(p, len, " dam %d", 30 + plev); break; case SPELL_ACID_BALL: strnfmt(p, len, " dam %d", 40 + plev); break; case SPELL_FIRE_BALL: strnfmt(p, len, " dam %d", 55 + plev); break; case SPELL_ICE_STORM: strnfmt(p, len, " dam %d", 50 + (plev * 2)); break; case SPELL_METEOR_SWARM: strnfmt(p, len, " dam %dx%d", 30 + plev / 2, 2 + plev / 20); break; case SPELL_RIFT: strnfmt(p, len, " dam 40+%dd7", plev); break; case SPELL_MANA_STORM: strnfmt(p, len, " dam %d", 300 + plev * 2); break; } } /* Priest spells */ if (tval == TV_PRAYER_BOOK) { int plev = p_ptr->lev; /* Analyze the spell */ switch (spell) { case PRAYER_CURE_LIGHT_WOUNDS: my_strcpy(p, " heal 15%", len); break; case PRAYER_BLESS: my_strcpy(p, " dur 12+d12", len); break; case PRAYER_CALL_LIGHT: strnfmt(p, len, " dam 2d%d", (plev / 2)); break; case PRAYER_PORTAL: strnfmt(p, len, " range %d", 3 * plev); break; case PRAYER_CURE_SERIOUS_WOUNDS: my_strcpy(p, " heal 20%", len); break; case PRAYER_CHANT: my_strcpy(p, " dur 24+d24", len); break; case PRAYER_RESIST_HEAT_COLD: my_strcpy(p, " dur 10+d10", len); break; case PRAYER_ORB_OF_DRAINING: strnfmt(p, len, " %d+3d6", plev + (player_has(PF_ZERO_FAIL) ? (plev / 2) : (plev / 4))); break; case PRAYER_CURE_CRITICAL_WOUNDS: my_strcpy(p, " heal 25%", len); break; case PRAYER_SENSE_INVISIBLE: my_strcpy(p, " dur 24+d24", len); break; case PRAYER_PROTECTION_FROM_EVIL: strnfmt(p, len, " dur %d+d25", 3 * plev); break; case PRAYER_CURE_MORTAL_WOUNDS: my_strcpy(p, " heal 30%", len); break; case PRAYER_PRAYER: my_strcpy(p, " dur 48+d48", len); break; case PRAYER_DISPEL_UNDEAD: strnfmt(p, len, " dam d%d", 3 * plev); break; case PRAYER_HEAL: my_strcpy(p, " heal 35%", len); break; case PRAYER_DISPEL_EVIL: strnfmt(p, len, " dam d%d", 3 * plev); break; case PRAYER_HOLY_WORD: my_strcpy(p, " heal 1000", len); break; case PRAYER_CURE_SERIOUS_WOUNDS2: my_strcpy(p, " heal 20%", len); break; case PRAYER_CURE_MORTAL_WOUNDS2: my_strcpy(p, " heal 30%", len); break; case PRAYER_HEALING: my_strcpy(p, " heal 2000", len); break; case PRAYER_DISPEL_UNDEAD2: strnfmt(p, len, " dam d%d", 4 * plev); break; case PRAYER_DISPEL_EVIL2: strnfmt(p, len, " dam d%d", 4 * plev); break; case PRAYER_ANNIHILATION: my_strcpy(p, " dam 200", len); break; case PRAYER_BLINK: my_strcpy(p, " range 10", len); break; case PRAYER_TELEPORT_SELF: strnfmt(p, len, " range %d", 8 * plev); break; } } return; } static int beam_chance(void) { int plev = p_ptr->lev; return (player_has(PF_BEAM) ? plev : (plev / 2)); } static void spell_wonder(int dir) { /* This spell should become more useful (more controlled) as the player gains experience levels. Thus, add 1/5 of the player's level to the die roll. This eliminates the worst effects later on, while keeping the results quite random. It also allows some potent effects only at high level. */ effect_wonder(dir, randint1(100) + p_ptr->lev / 5, beam_chance()); } bool spell_needs_aim(int tval, int spell) { if (tval == TV_MAGIC_BOOK) { switch (spell) { case SPELL_MAGIC_MISSILE: case SPELL_STINKING_CLOUD: case SPELL_CONFUSE_MONSTER: case SPELL_LIGHTNING_BOLT: case SPELL_SLEEP_MONSTER: case SPELL_SPEAR_OF_LIGHT: case SPELL_FROST_BOLT: case SPELL_TURN_STONE_TO_MUD: case SPELL_WONDER: case SPELL_POLYMORPH_OTHER: case SPELL_FIRE_BOLT: case SPELL_SLOW_MONSTER: case SPELL_FROST_BALL: case SPELL_TELEPORT_OTHER: case SPELL_BEDLAM: case SPELL_FIRE_BALL: case SPELL_ACID_BOLT: case SPELL_CLOUD_KILL: case SPELL_ACID_BALL: case SPELL_ICE_STORM: case SPELL_METEOR_SWARM: case SPELL_MANA_STORM: case SPELL_SHOCK_WAVE: case SPELL_EXPLOSION: case SPELL_RIFT: case SPELL_REND_SOUL: case SPELL_CHAOS_STRIKE: return TRUE; default: return FALSE; } } else { switch (spell) { case PRAYER_SCARE_MONSTER: case PRAYER_ORB_OF_DRAINING: case PRAYER_ANNIHILATION: case PRAYER_TELEPORT_OTHER: return TRUE; default: return FALSE; } } } static bool cast_mage_spell(int spell, int dir) { int py = p_ptr->py; int px = p_ptr->px; int plev = p_ptr->lev; /* Hack -- chance of "beam" instead of "bolt" */ int beam = beam_chance(); /* Spells. */ switch (spell) { case SPELL_MAGIC_MISSILE: { fire_bolt_or_beam(beam-10, GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5), 4)); break; } case SPELL_DETECT_MONSTERS: { (void)detect_monsters_normal(TRUE); break; } case SPELL_PHASE_DOOR: { teleport_player(10); break; } case SPELL_LIGHT_AREA: { (void)light_area(damroll(2, (plev / 2)), (plev / 10) + 1); break; } case SPELL_TREASURE_DETECTION: { (void)detect_treasure(TRUE); break; } case SPELL_CURE_LIGHT_WOUNDS: { heal_player(15, 15); player_dec_timed(p_ptr, TMD_CUT, 20, TRUE); player_dec_timed(p_ptr, TMD_CONFUSED, 20, TRUE); player_clear_timed(p_ptr, TMD_BLIND, TRUE); break; } case SPELL_FIND_TRAPS_DOORS: { (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); break; } case SPELL_STINKING_CLOUD: { fire_ball(GF_POIS, dir, 10 + (plev / 2), 2); break; } case SPELL_CONFUSE_MONSTER: { (void)confuse_monster(dir, plev, TRUE); break; } case SPELL_LIGHTNING_BOLT: { fire_beam(GF_ELEC, dir, damroll(3+((plev-5)/6), 6)); break; } case SPELL_TRAP_DOOR_DESTRUCTION: { (void)destroy_doors_touch(); break; } case SPELL_SLEEP_MONSTER: { (void)sleep_monster(dir, TRUE); break; } case SPELL_CURE_POISON: { (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); break; } case SPELL_TELEPORT_SELF: { teleport_player(plev * 5); break; } case SPELL_SPEAR_OF_LIGHT: { msg("A line of blue shimmering light appears."); light_line(dir); break; } case SPELL_FROST_BOLT: { fire_bolt_or_beam(beam-10, GF_COLD, dir, damroll(5+((plev-5)/4), 8)); break; } case SPELL_TURN_STONE_TO_MUD: { (void)wall_to_mud(dir); break; } case SPELL_SATISFY_HUNGER: { player_set_food(p_ptr, PY_FOOD_MAX - 1); break; } case SPELL_RECHARGE_ITEM_I: { return recharge(2 + plev / 5); } case SPELL_WONDER: { (void)spell_wonder(dir); break; } case SPELL_POLYMORPH_OTHER: { (void)poly_monster(dir); break; } case SPELL_IDENTIFY: { return ident_spell(); } case SPELL_MASS_SLEEP: { (void)sleep_monsters(TRUE); break; } case SPELL_FIRE_BOLT: { fire_bolt_or_beam(beam, GF_FIRE, dir, damroll(6+((plev-5)/4), 8)); break; } case SPELL_SLOW_MONSTER: { (void)slow_monster(dir); break; } case SPELL_FROST_BALL: { fire_ball(GF_COLD, dir, 30 + (plev), 2); break; } case SPELL_RECHARGE_ITEM_II: /* greater recharging */ { return recharge(50 + plev); } case SPELL_TELEPORT_OTHER: { (void)teleport_monster(dir); break; } case SPELL_BEDLAM: { fire_ball(GF_OLD_CONF, dir, plev, 4); break; } case SPELL_FIRE_BALL: { fire_ball(GF_FIRE, dir, 55 + (plev), 2); break; } case SPELL_WORD_OF_DESTRUCTION: { destroy_area(py, px, 15, TRUE); break; } case SPELL_BANISHMENT: { return banishment(); break; } case SPELL_DOOR_CREATION: { (void)door_creation(); break; } case SPELL_STAIR_CREATION: { (void)stair_creation(); break; } case SPELL_TELEPORT_LEVEL: { (void)teleport_player_level(); break; } case SPELL_EARTHQUAKE: { earthquake(py, px, 10); break; } case SPELL_WORD_OF_RECALL: { set_recall(); break; } case SPELL_ACID_BOLT: { fire_bolt_or_beam(beam, GF_ACID, dir, damroll(8+((plev-5)/4), 8)); break; } case SPELL_CLOUD_KILL: { fire_ball(GF_POIS, dir, 40 + (plev / 2), 3); break; } case SPELL_ACID_BALL: { fire_ball(GF_ACID, dir, 40 + (plev), 2); break; } case SPELL_ICE_STORM: { fire_ball(GF_ICE, dir, 50 + (plev * 2), 3); break; } case SPELL_METEOR_SWARM: { fire_swarm(2 + plev / 20, GF_METEOR, dir, 30 + plev / 2, 1); break; } case SPELL_MANA_STORM: { fire_ball(GF_MANA, dir, 300 + (plev * 2), 3); break; } case SPELL_DETECT_INVISIBLE: { (void)detect_monsters_normal(TRUE); (void)detect_monsters_invis(TRUE); break; } case SPELL_DETECT_ENCHANTMENT: { (void)detect_objects_magic(TRUE); break; } case SPELL_SHOCK_WAVE: { fire_ball(GF_SOUND, dir, 10 + plev, 2); break; } case SPELL_EXPLOSION: { fire_ball(GF_SHARD, dir, 20 + (plev * 2), 2); break; } case SPELL_MASS_BANISHMENT: { (void)mass_banishment(); break; } case SPELL_RESIST_FIRE: { (void)player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(20) + 20, TRUE, TRUE); break; } case SPELL_RESIST_COLD: { (void)player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(20) + 20, TRUE, TRUE); break; } case SPELL_ELEMENTAL_BRAND: /* elemental brand */ { return brand_ammo(); } case SPELL_RESIST_POISON: { (void)player_inc_timed(p_ptr, TMD_OPP_POIS, randint1(20) + 20, TRUE, TRUE); break; } case SPELL_RESISTANCE: { int time = randint1(20) + 20; (void)player_inc_timed(p_ptr, TMD_OPP_ACID, time, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_ELEC, time, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_FIRE, time, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_COLD, time, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_POIS, time, TRUE, TRUE); break; } case SPELL_HEROISM: { int dur = randint1(25) + 25; (void)hp_player(10); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_HERO, dur, TRUE, TRUE); break; } case SPELL_SHIELD: { (void)player_inc_timed(p_ptr, TMD_SHIELD, randint1(20) + 30, TRUE, TRUE); break; } case SPELL_BERSERKER: { int dur = randint1(25) + 25; (void)hp_player(30); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_SHERO, dur, TRUE, TRUE); break; } case SPELL_HASTE_SELF: { if (!p_ptr->timed[TMD_FAST]) { (void)player_set_timed(p_ptr, TMD_FAST, randint1(20) + plev, TRUE); } else { (void)player_inc_timed(p_ptr, TMD_FAST, randint1(5), TRUE, TRUE); } break; } case SPELL_RIFT: { fire_beam(GF_GRAVITY, dir, 40 + damroll(plev, 7)); break; } case SPELL_REND_SOUL: /* rend soul */ { fire_bolt_or_beam(beam / 4, GF_NETHER, dir, damroll(11, plev)); break; } case SPELL_CHAOS_STRIKE: /* chaos strike */ { fire_bolt_or_beam(beam, GF_CHAOS, dir, damroll(13, plev)); break; } case SPELL_RUNE_OF_PROTECTION: /* rune of protection */ { warding_glyph_spell(); break; } case SPELL_ENCHANT_ARMOR: /* enchant armor */ { return enchant_spell(0, 0, randint0(3) + plev / 20); } case SPELL_ENCHANT_WEAPON: /* enchant weapon */ { return enchant_spell(randint0(4) + plev / 20, randint0(4) + plev / 20, 0); } } /* Success */ return (TRUE); } static bool cast_priest_spell(int spell, int dir) { int py = p_ptr->py; int px = p_ptr->px; int plev = p_ptr->lev; int amt; switch (spell) { case PRAYER_DETECT_EVIL: { (void)detect_monsters_evil(TRUE); break; } case PRAYER_CURE_LIGHT_WOUNDS: { (void)heal_player(15, 15); (void)player_dec_timed(p_ptr, TMD_CUT, 20, TRUE); (void)player_dec_timed(p_ptr, TMD_CONFUSED, 20, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); break; } case PRAYER_BLESS: { (void)player_inc_timed(p_ptr, TMD_BLESSED, randint1(12) + 12, TRUE, TRUE); break; } case PRAYER_REMOVE_FEAR: { (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); break; } case PRAYER_CALL_LIGHT: { (void)light_area(damroll(2, (plev / 2)), (plev / 10) + 1); break; } case PRAYER_FIND_TRAPS_DOORS: { (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); break; } case PRAYER_SLOW_POISON: { (void)player_set_timed(p_ptr, TMD_POISONED, p_ptr->timed[TMD_POISONED] / 2, TRUE); break; } case PRAYER_SCARE_MONSTER: { (void)fear_monster(dir, plev, TRUE); break; } case PRAYER_PORTAL: { teleport_player(plev * 3); break; } case PRAYER_CURE_SERIOUS_WOUNDS: { (void)heal_player(20, 25); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); break; } case PRAYER_CHANT: { (void)player_inc_timed(p_ptr, TMD_BLESSED, randint1(24) + 24, TRUE, TRUE); break; } case PRAYER_SANCTUARY: { (void)sleep_monsters_touch(TRUE); break; } case PRAYER_SATISFY_HUNGER: { player_set_food(p_ptr, PY_FOOD_MAX - 1); break; } case PRAYER_REMOVE_CURSE: { remove_curse(); break; } case PRAYER_RESIST_HEAT_COLD: { (void)player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(10) + 10, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(10) + 10, TRUE, TRUE); break; } case PRAYER_NEUTRALIZE_POISON: { (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); break; } case PRAYER_ORB_OF_DRAINING: { fire_ball(GF_HOLY_ORB, dir, (damroll(3, 6) + plev + (player_has(PF_ZERO_FAIL) ? (plev / 2) : (plev / 4))), ((plev < 30) ? 2 : 3)); break; } case PRAYER_CURE_CRITICAL_WOUNDS: { (void)heal_player(25, 30); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); break; } case PRAYER_SENSE_INVISIBLE: { (void)player_inc_timed(p_ptr, TMD_SINVIS, randint1(24) + 24, TRUE, TRUE); break; } case PRAYER_PROTECTION_FROM_EVIL: { (void)player_inc_timed(p_ptr, TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE, TRUE); break; } case PRAYER_EARTHQUAKE: { earthquake(py, px, 10); break; } case PRAYER_SENSE_SURROUNDINGS: { map_area(); break; } case PRAYER_CURE_MORTAL_WOUNDS: { (void)heal_player(30, 50); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); break; } case PRAYER_TURN_UNDEAD: { (void)turn_undead(TRUE); break; } case PRAYER_PRAYER: { (void)player_inc_timed(p_ptr, TMD_BLESSED, randint1(48) + 48, TRUE, TRUE); break; } case PRAYER_DISPEL_UNDEAD: { (void)dispel_undead(randint1(plev * 3)); break; } case PRAYER_HEAL: { amt = (p_ptr->mhp * 35) / 100; if (amt < 300) amt = 300; (void)hp_player(amt); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); break; } case PRAYER_DISPEL_EVIL: { (void)dispel_evil(randint1(plev * 3)); break; } case PRAYER_GLYPH_OF_WARDING: { warding_glyph_spell(); break; } case PRAYER_HOLY_WORD: { (void)dispel_evil(randint1(plev * 4)); (void)hp_player(1000); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); break; } case PRAYER_DETECT_MONSTERS: { (void)detect_monsters_normal(TRUE); break; } case PRAYER_DETECTION: { (void)detect_all(TRUE); break; } case PRAYER_PERCEPTION: { return ident_spell(); } case PRAYER_PROBING: { (void)probing(); break; } case PRAYER_CLAIRVOYANCE: { wiz_light(); break; } case PRAYER_CURE_SERIOUS_WOUNDS2: { (void)heal_player(20, 25); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); break; } case PRAYER_CURE_MORTAL_WOUNDS2: { (void)heal_player(30, 50); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); break; } case PRAYER_HEALING: { (void)hp_player(2000); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); break; } case PRAYER_RESTORATION: { (void)do_res_stat(A_STR); (void)do_res_stat(A_INT); (void)do_res_stat(A_WIS); (void)do_res_stat(A_DEX); (void)do_res_stat(A_CON); (void)do_res_stat(A_CHR); break; } case PRAYER_REMEMBRANCE: { (void)restore_level(); break; } case PRAYER_DISPEL_UNDEAD2: { (void)dispel_undead(randint1(plev * 4)); break; } case PRAYER_DISPEL_EVIL2: { (void)dispel_evil(randint1(plev * 4)); break; } case PRAYER_BANISH_EVIL: { if (banish_evil(100)) { msg("The power of your god banishes evil!"); } break; } case PRAYER_WORD_OF_DESTRUCTION: { destroy_area(py, px, 15, TRUE); break; } case PRAYER_ANNIHILATION: { drain_life(dir, 200); break; } case PRAYER_UNBARRING_WAYS: { (void)destroy_doors_touch(); break; } case PRAYER_RECHARGING: { return recharge(15); } case PRAYER_DISPEL_CURSE: { (void)remove_all_curse(); break; } case PRAYER_ENCHANT_WEAPON: { return enchant_spell(randint0(4) + 1, randint0(4) + 1, 0); } case PRAYER_ENCHANT_ARMOUR: { return enchant_spell(0, 0, randint0(3) + 2); } case PRAYER_ELEMENTAL_BRAND: { brand_weapon(); break; } case PRAYER_BLINK: { teleport_player(10); break; } case PRAYER_TELEPORT_SELF: { teleport_player(plev * 8); break; } case PRAYER_TELEPORT_OTHER: { (void)teleport_monster(dir); break; } case PRAYER_TELEPORT_LEVEL: { (void)teleport_player_level(); break; } case PRAYER_WORD_OF_RECALL: { set_recall(); break; } case PRAYER_ALTER_REALITY: { msg("The world changes!"); /* Leaving */ p_ptr->leaving = TRUE; break; } } /* Success */ return (TRUE); } bool cast_spell(int tval, int index, int dir) { if (tval == TV_MAGIC_BOOK) { return cast_mage_spell(index, dir); } else { return cast_priest_spell(index, dir); } } angband-v3.3.2/src/store.c0000644000175000017500000020400611651552410014700 0ustar chriscchrisc/* * File: store.c * Purpose: Store stocking and UI * * Copyright (c) 1997 Robert A. Koeneke, James E. Wilson, Ben Harrison * Copyright (c) 2007 Andrew Sidwell, who rewrote a fair portion * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "game-event.h" #include "history.h" #include "init.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "object/object.h" #include "spells.h" #include "squelch.h" #include "target.h" #include "textui.h" #include "ui-menu.h" #include "z-debug.h" /*** Constants and definitions ***/ /* Easy names for the elements of the 'scr_places' arrays. */ enum { LOC_PRICE = 0, LOC_OWNER, LOC_HEADER, LOC_MORE, LOC_HELP_CLEAR, LOC_HELP_PROMPT, LOC_AU, LOC_WEIGHT, LOC_MAX }; /* Places for the various things displayed onscreen */ static unsigned int scr_places_x[LOC_MAX]; static unsigned int scr_places_y[LOC_MAX]; /* State flags */ #define STORE_GOLD_CHANGE 0x01 #define STORE_FRAME_CHANGE 0x02 #define STORE_SHOW_HELP 0x04 /* Compound flag for the initial display of a store */ #define STORE_INIT_CHANGE (STORE_FRAME_CHANGE | STORE_GOLD_CHANGE) /* Some local constants */ #define STORE_TURNOVER 9 /* Normal shop turnover, per day */ #define STORE_OBJ_LEVEL 5 /* Magic Level for normal stores */ /** Variables to maintain state XXX ***/ /* Flags for the display */ static u16b store_flags; /*** Utilities ***/ /* Randomly select one of the entries in an array */ #define ONE_OF(x) x[randint0(N_ELEMENTS(x))] /*** Flavour text stuff ***/ /* * Shopkeeper welcome messages. * * The shopkeeper's name must come first, then the character's name. */ static const char *comment_welcome[] = { "", "%s nods to you.", "%s says hello.", "%s: \"See anything you like, adventurer?\"", "%s: \"How may I help you, %s?\"", "%s: \"Welcome back, %s.\"", "%s: \"A pleasure to see you again, %s.\"", "%s: \"How may I be of assistance, good %s?\"", "%s: \"You do honour to my humble store, noble %s.\"", "%s: \"I and my family are entirely at your service, glorious %s.\"" }; static const char *comment_hint[] = { /* "%s tells you soberly: \"%s\".", "(%s) There's a saying round here, \"%s\".", "%s offers to tell you a secret next time you're about."*/ "\"%s\"" }; /* * Messages for reacting to purchase prices. */ static const char *comment_worthless[] = { "Arrgghh!", "You bastard!", "You hear someone sobbing...", "The shopkeeper howls in agony!", "The shopkeeper wails in anguish!", "The shopkeeper beats his head against the counter." }; static const char *comment_bad[] = { "Damn!", "You fiend!", "The shopkeeper curses at you.", "The shopkeeper glares at you." }; static const char *comment_accept[] = { "Okay.", "Fine.", "Accepted!", "Agreed!", "Done!", "Taken!" }; static const char *comment_good[] = { "Cool!", "You've made my day!", "The shopkeeper sniggers.", "The shopkeeper giggles.", "The shopkeeper laughs loudly." }; static const char *comment_great[] = { "Yipee!", "I think I'll retire!", "The shopkeeper jumps for joy.", "The shopkeeper smiles gleefully.", "Wow. I'm going to name my new villa in your honour." }; /* * Staple definitions. */ typedef enum { MAKE_SINGLE, MAKE_NORMAL, MAKE_MAX } create_mode; static struct staple_type { int tval, sval; create_mode mode; } staples[] = { { TV_FOOD, SV_FOOD_RATION, MAKE_NORMAL }, { TV_LIGHT, SV_LIGHT_TORCH, MAKE_NORMAL }, { TV_SCROLL, SV_SCROLL_WORD_OF_RECALL, MAKE_NORMAL }, { TV_SCROLL, SV_SCROLL_PHASE_DOOR, MAKE_NORMAL }, { TV_FLASK, 0, MAKE_NORMAL }, { TV_SPIKE, 0, MAKE_NORMAL }, { TV_SHOT, SV_AMMO_NORMAL, MAKE_MAX }, { TV_ARROW, SV_AMMO_NORMAL, MAKE_MAX }, { TV_BOLT, SV_AMMO_NORMAL, MAKE_MAX }, { TV_DIGGING, SV_SHOVEL, MAKE_SINGLE }, { TV_DIGGING, SV_PICK, MAKE_SINGLE }, { TV_CLOAK, SV_CLOAK, MAKE_SINGLE } }; static struct store *store_new(int idx) { struct store *s = mem_zalloc(sizeof *s); s->sidx = idx; s->stock = mem_zalloc(sizeof(*s->stock) * STORE_INVEN_MAX); s->stock_size = STORE_INVEN_MAX; return s; } /* * Get rid of stores at cleanup. Gets rid of everything. */ void free_stores(void) { struct owner *o; struct owner *next; int i; /* Free the store inventories */ for (i = 0; i < MAX_STORES; i++) { /* Get the store */ struct store *store = &stores[i]; /* Free the store inventory */ mem_free(store->stock); mem_free(store->table); for (o = store->owners; o; o = next) { next = o->next; string_free(o->name); mem_free(o); } } mem_free(stores); } static enum parser_error parse_s(struct parser *p) { struct store *h = parser_priv(p); struct store *s; unsigned int idx = parser_getuint(p, "index") - 1; unsigned int slots = parser_getuint(p, "slots"); if (idx < STORE_ARMOR || idx > STORE_MAGIC) return PARSE_ERROR_OUT_OF_BOUNDS; s = store_new(parser_getuint(p, "index") - 1); s->table = mem_zalloc(sizeof(*s->table) * slots); s->table_size = slots; s->next = h; parser_setpriv(p, s); return PARSE_ERROR_NONE; } static enum parser_error parse_i(struct parser *p) { struct store *s = parser_priv(p); unsigned int slots = parser_getuint(p, "slots"); int tval = tval_find_idx(parser_getsym(p, "tval")); int sval = lookup_sval(tval, parser_getsym(p, "sval")); object_kind *kind = lookup_kind(tval, sval); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; if (s->table_num + slots > s->table_size) return PARSE_ERROR_TOO_MANY_ENTRIES; while (slots--) { s->table[s->table_num++] = kind; } /* XXX: get rid of this table_size/table_num/indexing thing. It's * stupid. Dynamically allocate. */ return PARSE_ERROR_NONE; } testonly struct parser *store_parser_new(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "S uint index uint slots", parse_s); parser_reg(p, "I uint slots sym tval sym sval", parse_i); return p; } struct owner_parser_state { struct store *stores; struct store *cur; }; static enum parser_error parse_own_n(struct parser *p) { struct owner_parser_state *s = parser_priv(p); unsigned int index = parser_getuint(p, "index"); struct store *st; for (st = s->stores; st; st = st->next) { if (st->sidx == index) { s->cur = st; break; } } return st ? PARSE_ERROR_NONE : PARSE_ERROR_OUT_OF_BOUNDS; } static enum parser_error parse_own_s(struct parser *p) { struct owner_parser_state *s = parser_priv(p); unsigned int maxcost = parser_getuint(p, "maxcost"); char *name = string_make(parser_getstr(p, "name")); struct owner *o; if (!s->cur) return PARSE_ERROR_MISSING_RECORD_HEADER; o = mem_zalloc(sizeof *o); o->oidx = (s->cur->owners ? s->cur->owners->oidx + 1 : 0); o->next = s->cur->owners; o->name = name; o->max_cost = maxcost; s->cur->owners = o; return PARSE_ERROR_NONE; } testonly struct parser *store_owner_parser_new(struct store *stores) { struct parser *p = parser_new(); struct owner_parser_state *s = mem_zalloc(sizeof *s); s->stores = stores; s->cur = NULL; parser_setpriv(p, s); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index", parse_own_n); parser_reg(p, "S uint maxcost str name", parse_own_s); return p; } /* * The greeting a shopkeeper gives the character says a lot about his * general attitude. * * Taken and modified from Sangband 1.0. */ static void prt_welcome(const owner_type *ot_ptr) { char short_name[20]; const char *owner_name = ot_ptr->name; int j; if (one_in_(2)) return; /* Extract the first name of the store owner (stop before the first space) */ for (j = 0; owner_name[j] && owner_name[j] != ' '; j++) short_name[j] = owner_name[j]; /* Truncate the name */ short_name[j] = '\0'; if (one_in_(3)) { size_t i = randint0(N_ELEMENTS(comment_hint)); msg(comment_hint[i], random_hint()); } else if (p_ptr->lev > 5) { const char *player_name; /* We go from level 1 - 50 */ size_t i = ((unsigned)p_ptr->lev - 1) / 5; i = MIN(i, N_ELEMENTS(comment_welcome) - 1); /* Get a title for the character */ if ((i % 2) && randint0(2)) player_name = p_ptr->class->title[(p_ptr->lev - 1) / 5]; else if (randint0(2)) player_name = op_ptr->full_name; else player_name = (p_ptr->psex == SEX_MALE ? "sir" : "lady"); /* Balthazar says "Welcome" */ prt(format(comment_welcome[i], short_name, player_name), 0, 0); } } /* * Let a shop-keeper React to a purchase * * We paid "price", it was worth "value", and we thought it was worth "guess" */ static void purchase_analyze(s32b price, s32b value, s32b guess) { /* Item was worthless, but we bought it */ if ((value <= 0) && (price > value)) msgt(MSG_STORE1, "%s", ONE_OF(comment_worthless)); /* Item was cheaper than we thought, and we paid more than necessary */ else if ((value < guess) && (price > value)) msgt(MSG_STORE2, "%s", ONE_OF(comment_bad)); /* Item was a good bargain, and we got away with it */ else if ((value > guess) && (value < (4 * guess)) && (price < value)) msgt(MSG_STORE3, "%s", ONE_OF(comment_good)); /* Item was a great bargain, and we got away with it */ else if ((value > guess) && (price < value)) msgt(MSG_STORE4, "%s", ONE_OF(comment_great)); } /*** Check if a store will buy an object ***/ /* * Determine if the current store will purchase the given object * * Note that a shop-keeper must refuse to buy "worthless" objects */ static bool store_will_buy(struct store *store, const object_type *o_ptr) { /* Switch on the store */ switch (store->sidx) { /* General Store */ case STORE_GENERAL: { /* Accept lights (inc. oil), spikes and food */ if (o_ptr->tval == TV_LIGHT || o_ptr->tval == TV_FOOD || o_ptr->tval == TV_FLASK || o_ptr->tval == TV_SPIKE) break; else return FALSE; } /* Armoury */ case STORE_ARMOR: { /* Analyze the type */ switch (o_ptr->tval) { case TV_BOOTS: case TV_GLOVES: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: break; default: return (FALSE); } break; } /* Weapon Shop */ case STORE_WEAPON: { /* Analyze the type */ switch (o_ptr->tval) { case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: break; default: return (FALSE); } break; } /* Temple */ case STORE_TEMPLE: { /* Analyze the type */ switch (o_ptr->tval) { case TV_PRAYER_BOOK: case TV_SCROLL: case TV_POTION: case TV_HAFTED: break; case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { /* Known blessed blades are accepted too */ if (object_is_known_blessed(o_ptr)) break; } default: return (FALSE); } break; } /* Alchemist */ case STORE_ALCHEMY: { /* Analyze the type */ switch (o_ptr->tval) { case TV_SCROLL: case TV_POTION: break; default: return (FALSE); } break; } /* Magic Shop */ case STORE_MAGIC: { /* Analyze the type */ switch (o_ptr->tval) { case TV_MAGIC_BOOK: case TV_AMULET: case TV_RING: case TV_STAFF: case TV_WAND: case TV_ROD: case TV_SCROLL: case TV_POTION: break; default: return (FALSE); } break; } /* Home */ case STORE_HOME: { return TRUE; } } /* Ignore "worthless" items */ if (object_value(o_ptr, 1, FALSE) <= 0) return (FALSE); /* Assume okay */ return (TRUE); } /* Get the current store or NULL if there isn't one */ static struct store *current_store(void) { int n = STORE_NONE; /* If we're displaying store knowledge whilst not in a store, * override the value returned */ if (store_knowledge != STORE_NONE) n = store_knowledge; else if ((cave->feat[p_ptr->py][p_ptr->px] >= FEAT_SHOP_HEAD) && (cave->feat[p_ptr->py][p_ptr->px] <= FEAT_SHOP_TAIL)) n = cave->feat[p_ptr->py][p_ptr->px] - FEAT_SHOP_HEAD; if (n != STORE_NONE) return &stores[n]; else return NULL; } /*** Basics: pricing, generation, etc. ***/ /* * Determine the price of an object (qty one) in a store. * * store_buying == TRUE means the shop is buying, player selling * == FALSE means the shop is selling, player buying * * This function takes into account the player's charisma, but * never lets a shop-keeper lose money in a transaction. * * The "greed" value should exceed 100 when the player is "buying" the * object, and should be less than 100 when the player is "selling" it. * * Hack -- the black market always charges twice as much as it should. */ s32b price_item(const object_type *o_ptr, bool store_buying, int qty) { int adjust; s32b price; struct store *store = current_store(); owner_type *ot_ptr; if (!store) return 0L; ot_ptr = store->owner; /* Get the value of the stack of wands, or a single item */ if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) price = object_value(o_ptr, qty, FALSE); else price = object_value(o_ptr, 1, FALSE); /* Worthless items */ if (price <= 0) return (0L); /* Add in the charisma factor */ if (store->sidx == STORE_B_MARKET) adjust = 150; else adjust = adj_chr_gold[p_ptr->state.stat_ind[A_CHR]]; /* Shop is buying */ if (store_buying) { /* Set the factor */ adjust = 100 + (100 - adjust); if (adjust > 100) adjust = 100; /* Shops now pay 2/3 of true value */ price = price * 2 / 3; /* Black market sucks */ if (store->sidx == STORE_B_MARKET) price = price / 2; /* Check for no_selling option */ if (OPT(birth_no_selling)) return (0L); } /* Shop is selling */ else { /* Fix the factor */ if (adjust < 100) adjust = 100; /* Black market sucks */ if (store->sidx == STORE_B_MARKET) price = price * 2; } /* Compute the final price (with rounding) */ price = (price * adjust + 50L) / 100L; /* Now convert price to total price for non-wands */ if (!(o_ptr->tval == TV_WAND) && !(o_ptr->tval == TV_STAFF)) price *= qty; /* Now limit the price to the purse limit */ if (store_buying && (price > ot_ptr->max_cost * qty)) price = ot_ptr->max_cost * qty; /* Note -- Never become "free" */ if (price <= 0L) return (qty); /* Return the price */ return (price); } /* * Special "mass production" computation. */ static int mass_roll(int times, int max) { int i, t = 0; assert(max > 1); for (i = 0; i < times; i++) t += randint0(max); return (t); } /* * Some cheap objects should be created in piles. */ static void mass_produce(object_type *o_ptr) { int size = 1; s32b cost = object_value(o_ptr, 1, FALSE); /* Analyze the type */ switch (o_ptr->tval) { /* Food, Flasks, and Lights */ case TV_FOOD: case TV_FLASK: case TV_LIGHT: { if (cost <= 5L) size += mass_roll(3, 5); if (cost <= 20L) size += mass_roll(3, 5); break; } case TV_POTION: case TV_SCROLL: { if (cost <= 60L) size += mass_roll(3, 5); if (cost <= 240L) size += mass_roll(1, 5); break; } case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: { if (cost <= 50L) size += mass_roll(2, 3); if (cost <= 500L) size += mass_roll(1, 3); break; } case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_SHIELD: case TV_GLOVES: case TV_BOOTS: case TV_CLOAK: case TV_HELM: case TV_CROWN: case TV_SWORD: case TV_POLEARM: case TV_HAFTED: case TV_DIGGING: case TV_BOW: { if (o_ptr->ego) break; if (cost <= 10L) size += mass_roll(3, 5); if (cost <= 100L) size += mass_roll(3, 5); break; } case TV_SPIKE: case TV_SHOT: case TV_ARROW: case TV_BOLT: { if (cost <= 5L) size = randint1(3) * 20; /* 20-60 in 20s */ else if (cost > 5L && cost <= 50L) size = randint1(4) * 10; /* 10-40 in 10s */ else if (cost > 50 && cost <= 500L) size = randint1(4) * 5; /* 5-20 in 5s */ else size = 1; break; } } /* Save the total pile size */ o_ptr->number = size; } /* * Allow a store object to absorb another object */ static void store_object_absorb(object_type *o_ptr, object_type *j_ptr) { int total = o_ptr->number + j_ptr->number; /* Combine quantity, lose excess items */ o_ptr->number = (total > 99) ? 99 : total; /* Hack -- if rods are stacking, add the charging timeouts */ if (o_ptr->tval == TV_ROD) o_ptr->timeout += j_ptr->timeout; /* Hack -- if wands/staves are stacking, combine the charges */ if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) { o_ptr->pval[DEFAULT_PVAL] += j_ptr->pval[DEFAULT_PVAL]; } if ((o_ptr->origin != j_ptr->origin) || (o_ptr->origin_depth != j_ptr->origin_depth) || (o_ptr->origin_xtra != j_ptr->origin_xtra)) { int act = 2; if ((o_ptr->origin == ORIGIN_DROP) && (o_ptr->origin == j_ptr->origin)) { monster_race *r_ptr = &r_info[o_ptr->origin_xtra]; monster_race *s_ptr = &r_info[j_ptr->origin_xtra]; bool r_uniq = rf_has(r_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; bool s_uniq = rf_has(s_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; if (r_uniq && !s_uniq) act = 0; else if (s_uniq && !r_uniq) act = 1; else act = 2; } switch (act) { /* Overwrite with j_ptr */ case 1: { o_ptr->origin = j_ptr->origin; o_ptr->origin_depth = j_ptr->origin_depth; o_ptr->origin_xtra = j_ptr->origin_xtra; } /* Set as "mixed" */ case 2: { o_ptr->origin = ORIGIN_MIXED; } } } } /* * Check to see if the shop will be carrying too many objects * * Note that the shop, just like a player, will not accept things * it cannot hold. Before, one could "nuke" objects this way, by * adding them to a pile which was already full. */ static bool store_check_num(struct store *store, const object_type *o_ptr) { int i; object_type *j_ptr; /* Free space is always usable */ if (store->stock_num < store->stock_size) return TRUE; /* The "home" acts like the player */ if (store->sidx == STORE_HOME) { /* Check all the objects */ for (i = 0; i < store->stock_num; i++) { /* Get the existing object */ j_ptr = &store->stock[i]; /* Can the new object be combined with the old one? */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) return (TRUE); } } /* Normal stores do special stuff */ else { /* Check all the objects */ for (i = 0; i < store->stock_num; i++) { /* Get the existing object */ j_ptr = &store->stock[i]; /* Can the new object be combined with the old one? */ if (object_similar(j_ptr, o_ptr, OSTACK_STORE)) return (TRUE); } } /* But there was no room at the inn... */ return (FALSE); } /* * Add an object to the inventory of the Home. * * In all cases, return the slot (or -1) where the object was placed. * * Note that this is a hacked up version of "inven_carry()". * * Also note that it may not correctly "adapt" to "knowledge" becoming * known: the player may have to pick stuff up and drop it again. */ static int home_carry(object_type *o_ptr) { int i, slot; u32b value, j_value; object_type *j_ptr; struct store *store = &stores[STORE_HOME]; /* Check each existing object (try to combine) */ for (slot = 0; slot < store->stock_num; slot++) { /* Get the existing object */ j_ptr = &store->stock[slot]; /* The home acts just like the player */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) { /* Save the new number of items */ object_absorb(j_ptr, o_ptr); /* All done */ return (slot); } } /* No space? */ if (store->stock_num >= store->stock_size) return (-1); /* Determine the "value" of the object */ value = object_value(o_ptr, 1, FALSE); /* Check existing slots to see if we must "slide" */ for (slot = 0; slot < store->stock_num; slot++) { /* Get that object */ j_ptr = &store->stock[slot]; /* Hack -- readable books always come first */ if ((o_ptr->tval == p_ptr->class->spell_book) && (j_ptr->tval != p_ptr->class->spell_book)) break; if ((j_ptr->tval == p_ptr->class->spell_book) && (o_ptr->tval != p_ptr->class->spell_book)) continue; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; if (o_ptr->tval < j_ptr->tval) continue; /* Can happen in the home */ if (!object_flavor_is_aware(o_ptr)) continue; if (!object_flavor_is_aware(j_ptr)) break; /* Objects sort by increasing sval */ if (o_ptr->sval < j_ptr->sval) break; if (o_ptr->sval > j_ptr->sval) continue; /* Objects in the home can be unknown */ if (!object_is_known(o_ptr)) continue; if (!object_is_known(j_ptr)) break; /* Objects sort by decreasing value */ j_value = object_value(j_ptr, 1, FALSE); if (value > j_value) break; if (value < j_value) continue; } /* Slide the others up */ for (i = store->stock_num; i > slot; i--) { /* Hack -- slide the objects */ object_copy(&store->stock[i], &store->stock[i-1]); } /* More stuff now */ store->stock_num++; /* Hack -- Insert the new object */ object_copy(&store->stock[slot], o_ptr); /* Return the location */ return (slot); } /* * Add an object to a real stores inventory. * * If the object is "worthless", it is thrown away (except in the home). * * If the object cannot be combined with an object already in the inventory, * make a new slot for it, and calculate its "per item" price. Note that * this price will be negative, since the price will not be "fixed" yet. * Adding an object to a "fixed" price stack will not change the fixed price. * * In all cases, return the slot (or -1) where the object was placed */ static int store_carry(struct store *store, object_type *o_ptr) { unsigned int i; unsigned int slot; u32b value, j_value; object_type *j_ptr; object_kind *kind = o_ptr->kind; /* Evaluate the object */ value = object_value(o_ptr, 1, FALSE); /* Cursed/Worthless items "disappear" when sold */ if (value <= 0) return (-1); /* Erase the inscription & pseudo-ID bit */ o_ptr->note = 0; /* Some item types require maintenance */ switch (o_ptr->tval) { /* Refuel lights to the standard amount */ case TV_LIGHT: { bitflag f[OF_SIZE]; object_flags(o_ptr, f); if (!of_has(f, OF_NO_FUEL)) { if (o_ptr->sval == SV_LIGHT_TORCH) o_ptr->timeout = DEFAULT_TORCH; else if (o_ptr->sval == SV_LIGHT_LANTERN) o_ptr->timeout = DEFAULT_LAMP; } break; } /* Recharge rods */ case TV_ROD: { o_ptr->timeout = 0; break; } /* Possibly recharge wands and staves */ case TV_STAFF: case TV_WAND: { bool recharge = FALSE; /* Recharge without fail if the store normally carries that type */ for (i = 0; i < store->table_num; i++) { if (store->table[i] == o_ptr->kind) recharge = TRUE; } if (recharge) { int charges = 0; /* Calculate the recharged number of charges */ for (i = 0; i < o_ptr->number; i++) charges += randcalc(kind->charge, 0, RANDOMISE); /* Use recharged value only if greater */ if (charges > o_ptr->pval[DEFAULT_PVAL]) o_ptr->pval[DEFAULT_PVAL] = charges; } break; } } /* Check each existing object (try to combine) */ for (slot = 0; slot < store->stock_num; slot++) { /* Get the existing object */ j_ptr = &store->stock[slot]; /* Can the existing items be incremented? */ if (object_similar(j_ptr, o_ptr, OSTACK_STORE)) { /* Absorb (some of) the object */ store_object_absorb(j_ptr, o_ptr); /* All done */ return (slot); } } /* No space? */ if (store->stock_num >= store->stock_size) { return (-1); } /* Check existing slots to see if we must "slide" */ for (slot = 0; slot < store->stock_num; slot++) { /* Get that object */ j_ptr = &store->stock[slot]; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; if (o_ptr->tval < j_ptr->tval) continue; /* Objects sort by increasing sval */ if (o_ptr->sval < j_ptr->sval) break; if (o_ptr->sval > j_ptr->sval) continue; /* Evaluate that slot */ j_value = object_value(j_ptr, 1, FALSE); /* Objects sort by decreasing value */ if (value > j_value) break; if (value < j_value) continue; } /* Slide the others up */ for (i = store->stock_num; i > slot; i--) { /* Hack -- slide the objects */ object_copy(&store->stock[i], &store->stock[i-1]); } /* More stuff now */ store->stock_num++; /* Hack -- Insert the new object */ object_copy(&store->stock[slot], o_ptr); /* Return the location */ return (slot); } /* * Increase, by a 'num', the number of an item 'item' in store 'st'. * This can result in zero items. */ static void store_item_increase(struct store *store, int item, int num) { int cnt; object_type *o_ptr; /* Get the object */ o_ptr = &store->stock[item]; /* Verify the number */ cnt = o_ptr->number + num; if (cnt > 255) cnt = 255; else if (cnt < 0) cnt = 0; /* Save the new number */ o_ptr->number = cnt; } /* * Remove a slot if it is empty, in store 'st'. */ static void store_item_optimize(struct store *store, int item) { int j; object_type *o_ptr; /* Get the object */ o_ptr = &store->stock[item]; /* Must exist */ if (!o_ptr->kind) return; /* Must have no items */ if (o_ptr->number) return; /* One less object */ store->stock_num--; /* Slide everyone */ for (j = item; j < store->stock_num; j++) { store->stock[j] = store->stock[j + 1]; } /* Nuke the final slot */ object_wipe(&store->stock[j]); } /* * Delete an object from store 'st', or, if it is a stack, perhaps only * partially delete it. */ static void store_delete_index(struct store *store, int what) { int num; object_type *o_ptr; /* Paranoia */ if (store->stock_num <= 0) return; /* Get the object */ o_ptr = &store->stock[what]; /* Determine how many objects are in the slot */ num = o_ptr->number; /* Deal with stacks */ if (num > 1) { /* Special behaviour for arrows, bolts &tc. */ switch (o_ptr->tval) { case TV_SPIKE: case TV_SHOT: case TV_ARROW: case TV_BOLT: { /* 50% of the time, destroy the entire stack */ if (randint0(100) < 50 || num < 10) num = o_ptr->number; /* 50% of the time, reduce the size to a multiple of 5 */ else num = randint1(num / 5) * 5 + (num % 5); break; } default: { /* 50% of the time, destroy a single object */ if (randint0(100) < 50) num = 1; /* 25% of the time, destroy half the objects */ else if (randint0(100) < 50) num = (num + 1) / 2; /* 25% of the time, destroy all objects */ else num = o_ptr->number; /* Hack -- decrement the total charges of staves and wands. */ if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND) { o_ptr->pval[DEFAULT_PVAL] -= num * o_ptr->pval[DEFAULT_PVAL] / o_ptr->number; } } } } if (o_ptr->artifact) history_lose_artifact(o_ptr->artifact); /* Delete the item */ store_item_increase(store, what, -num); store_item_optimize(store, what); } /* * Delete a random object from store 'st', or, if it is a stack, perhaps only * partially delete it. * * This function is used when store maintainance occurs, and is designed to * imitate non-PC purchasers making purchases from the store. */ static void store_delete_random(struct store *store) { int what; if (store->stock_num <= 0) return; /* Pick a random slot */ what = randint0(store->stock_num); store_delete_index(store, what); } /* * Delete a percentage of a store's inventory */ static void store_prune(struct store *store, int chance_in_1000) { int i; for (i = 0; i < store->stock_num; i++) { if (randint0(1000) < chance_in_1000) store_delete_index(store, i); } } /* * This makes sure that the black market doesn't stock any object that other * stores have, unless it is an ego-item or has various bonuses. * * Based on a suggestion by Lee Vogt . */ static bool black_market_ok(const object_type *o_ptr) { int i, j; /* Ego items are always fine */ if (o_ptr->ego) return (TRUE); /* Good items are normally fine */ if (o_ptr->to_a > 2) return (TRUE); if (o_ptr->to_h > 1) return (TRUE); if (o_ptr->to_d > 2) return (TRUE); /* No cheap items */ if (object_value(o_ptr, 1, FALSE) < 10) return (FALSE); /* Check the other stores */ for (i = 0; i < MAX_STORES; i++) { /* Skip home and black market */ if (i == STORE_B_MARKET || i == STORE_HOME) continue; /* Check every object in the store */ for (j = 0; j < stores[i].stock_num; j++) { object_type *j_ptr = &stores[i].stock[j]; /* Compare object kinds */ if (o_ptr->kind == j_ptr->kind) return (FALSE); } } /* Otherwise fine */ return (TRUE); } /* * Get a choice from the store allocation table, in tables.c */ static object_kind *store_get_choice(struct store *store) { /* Choose a random entry from the store's table */ int r = randint0(store->table_num); /* Return it */ return store->table[r]; } /* * Creates a random object and gives it to store 'st' */ static bool store_create_random(struct store *store) { int tries, level; object_type *i_ptr; object_type object_type_body; int min_level, max_level; /* Decide min/max levels */ if (store->sidx == STORE_B_MARKET) { min_level = p_ptr->max_depth + 5; max_level = p_ptr->max_depth + 20; } else { min_level = 1; max_level = STORE_OBJ_LEVEL + MAX(p_ptr->max_depth - 20, 0); } if (min_level > 55) min_level = 55; if (max_level > 70) max_level = 70; /* Consider up to six items */ for (tries = 0; tries < 6; tries++) { object_kind *kind; /* Work out the level for objects to be generated at */ level = rand_range(min_level, max_level); /* Black Markets have a random object, of a given level */ if (store->sidx == STORE_B_MARKET) kind = get_obj_num(level, FALSE); else kind = store_get_choice(store); /*** Pre-generation filters ***/ /* No chests in stores XXX */ if (kind->tval == TV_CHEST) continue; /*** Generate the item ***/ /* Get local object */ i_ptr = &object_type_body; /* Create a new object of the chosen kind */ object_prep(i_ptr, kind, level, RANDOMISE); /* Apply some "low-level" magic (no artifacts) */ apply_magic(i_ptr, level, FALSE, FALSE, FALSE); /* Reject if item is 'damaged' (i.e. negative mods) */ switch (i_ptr->tval) { case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOW: case TV_SHOT: case TV_ARROW: case TV_BOLT: { if ((i_ptr->to_h < 0) || (i_ptr->to_d < 0)) continue; } case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_SHIELD: case TV_HELM: case TV_CROWN: case TV_CLOAK: case TV_GLOVES: case TV_BOOTS: { if (i_ptr->to_a < 0) continue; } default: { /* nothing to do */ } } /* The object is "known" and belongs to a store */ i_ptr->ident |= IDENT_STORE; i_ptr->origin = ORIGIN_STORE; /*** Post-generation filters ***/ /* Black markets have expensive tastes */ if ((store->sidx == STORE_B_MARKET) && !black_market_ok(i_ptr)) continue; /* No "worthless" items */ if (object_value(i_ptr, 1, FALSE) < 1) continue; /* Mass produce and/or apply discount */ mass_produce(i_ptr); /* Attempt to carry the object */ (void)store_carry(store, i_ptr); /* Definitely done */ return TRUE; } return FALSE; } /* * Helper function: create an item with the given tval,sval pair, add it to the * store st. Return the slot in the inventory. */ static int store_create_item(struct store *store, object_kind *kind) { object_type object = { 0 }; /* Create a new object of the chosen kind */ object_prep(&object, kind, 0, RANDOMISE); /* Item belongs to a store */ object.ident |= IDENT_STORE; object.origin = ORIGIN_STORE; /* Attempt to carry the object */ return store_carry(store, &object); } /* * Create all staple items. */ static void store_create_staples(void) { struct store *store = &stores[STORE_GENERAL]; size_t i; /* Make sure there's enough room for staples */ while (store->stock_num >= STORE_INVEN_MAX - N_ELEMENTS(staples)) store_delete_random(store); /* Iterate through staples */ for (i = 0; i < N_ELEMENTS(staples); i++) { struct staple_type *staple = &staples[i]; /* Create the staple and combine it into the store inventory */ int idx = store_create_item(store, lookup_kind(staple->tval, staple->sval)); object_type *o_ptr = &store->stock[idx]; assert(o_ptr); /* Tweak the quantities */ switch (staple->mode) { case MAKE_SINGLE: o_ptr->number = 1; break; case MAKE_NORMAL: mass_produce(o_ptr); break; case MAKE_MAX: o_ptr->number = 99; break; } } } /* * Maintain the inventory at the stores. */ void store_maint(struct store *store) { int j; unsigned int stock; int restock_attempts = 100000; /* Ignore home */ if (store->sidx == STORE_HOME) return; /* General Store gets special treatment */ if (store->sidx == STORE_GENERAL) { /* Sell off 30% of the inventory */ store_prune(store, 300); store_create_staples(); return; } /* Prune the black market */ if (store->sidx == STORE_B_MARKET) { /* Destroy crappy black market items */ for (j = store->stock_num - 1; j >= 0; j--) { object_type *o_ptr = &store->stock[j]; /* Destroy crappy items */ if (!black_market_ok(o_ptr)) { /* Destroy the object */ store_item_increase(store, j, 0 - o_ptr->number); store_item_optimize(store, j); } } } /*** "Sell" various items */ /* Sell a few items */ stock = store->stock_num; stock -= randint1(STORE_TURNOVER); /* Keep stock between specified min and max slots */ if (stock > STORE_MAX_KEEP) stock = STORE_MAX_KEEP; if (stock < STORE_MIN_KEEP) stock = STORE_MIN_KEEP; /* Destroy objects until only "j" slots are left */ while (store->stock_num > stock) store_delete_random(store); /*** "Buy in" various items */ /* Buy a few items */ stock = store->stock_num; stock += randint1(STORE_TURNOVER); /* Keep stock between specified min and max slots */ if (stock > STORE_MAX_KEEP) stock = STORE_MAX_KEEP; if (stock < STORE_MIN_KEEP) stock = STORE_MIN_KEEP; /* For the rest, we just choose items randomlyish */ /* The (huge) restock_attempts will only go to zero (otherwise * infinite loop) if stores don't have enough items they can stock! */ while (store->stock_num < stock && --restock_attempts) store_create_random(store); if (!restock_attempts) quit_fmt("Unable to (re-)stock store %d. Please report this bug", store->sidx); } struct owner *store_ownerbyidx(struct store *s, unsigned int idx) { struct owner *o; for (o = s->owners; o; o = o->next) { if (o->oidx == idx) return o; } notreached; } static struct owner *store_choose_owner(struct store *s) { struct owner *o; unsigned int n = 0; for (o = s->owners; o; o = o->next) { n++; } n = randint0(n); return store_ownerbyidx(s, n); } static struct store *parse_stores(void) { struct parser *p = store_parser_new(); struct store *stores; /* XXX ignored */ parse_file(p, "store"); stores = parser_priv(p); parser_destroy(p); return stores; } static struct store *add_builtin_stores(struct store *stores) { struct store *s0, *s1, *s2; s0 = store_new(STORE_GENERAL); s1 = store_new(STORE_B_MARKET); s2 = store_new(STORE_HOME); s0->next = stores; s1->next = s0; s2->next = s1; return s2; } static void parse_owners(struct store *stores) { struct parser *p = store_owner_parser_new(stores); parse_file(p, "shop_own"); mem_free(parser_priv(p)); parser_destroy(p); } static struct store *flatten_stores(struct store *store_list) { struct store *s; struct store *stores = mem_zalloc(MAX_STORES * sizeof(*stores)); for (s = store_list; s; s = s->next) { /* XXX bounds-check */ memcpy(&stores[s->sidx], s, sizeof(*s)); } while (store_list) { s = store_list->next; /* No need to free the sub-allocated memory, as this is passed on * to the array of stores */ mem_free(store_list); store_list = s; } return stores; } void store_init(void) { struct store *store_list; store_list = parse_stores(); store_list = add_builtin_stores(store_list); parse_owners(store_list); stores = flatten_stores(store_list); } void store_reset(void) { int i, j; struct store *s; for (i = 0; i < MAX_STORES; i++) { s = &stores[i]; s->stock_num = 0; store_shuffle(s); for (j = 0; j < s->stock_size; j++) object_wipe(&s->stock[j]); if (i == STORE_HOME) continue; for (j = 0; j < 10; j++) store_maint(s); } } /* * Shuffle one of the stores. */ void store_shuffle(struct store *store) { struct owner *o = store->owner; while (o == store->owner) o = store_choose_owner(store); store->owner = o; } /*** Display code ***/ /* * This function sets up screen locations based on the current term size. * * Current screen layout: * line 0: reserved for messages * line 1: shopkeeper and their purse / item buying price * line 2: empty * line 3: table headers * * line 4: Start of items * * If help is turned off, then the rest of the display goes as: * * line (height - 4): end of items * line (height - 3): "more" prompt * line (height - 2): empty * line (height - 1): Help prompt and remaining gold * * If help is turned on, then the rest of the display goes as: * * line (height - 7): end of items * line (height - 6): "more" prompt * line (height - 4): gold remaining * line (height - 3): command help */ static void store_display_recalc(menu_type *m) { int wid, hgt; region loc; struct store *store = current_store(); Term_get_size(&wid, &hgt); /* Clip the width at a maximum of 104 (enough room for an 80-char item name) */ if (wid > 104) wid = 104; /* Clip the text_out function at two smaller than the screen width */ text_out_wrap = wid - 2; /* X co-ords first */ scr_places_x[LOC_PRICE] = wid - 14; scr_places_x[LOC_AU] = wid - 26; scr_places_x[LOC_OWNER] = wid - 2; scr_places_x[LOC_WEIGHT] = wid - 14; /* Add space for for prices */ if (store->sidx != STORE_HOME) scr_places_x[LOC_WEIGHT] -= 10; /* Then Y */ scr_places_y[LOC_OWNER] = 1; scr_places_y[LOC_HEADER] = 3; /* If we are displaying help, make the height smaller */ if (store_flags & (STORE_SHOW_HELP)) hgt -= 3; scr_places_y[LOC_MORE] = hgt - 3; scr_places_y[LOC_AU] = hgt - 1; loc = m->boundary; /* If we're displaying the help, then put it with a line of padding */ if (store_flags & (STORE_SHOW_HELP)) { scr_places_y[LOC_HELP_CLEAR] = hgt - 1; scr_places_y[LOC_HELP_PROMPT] = hgt; loc.page_rows = -5; } else { scr_places_y[LOC_HELP_CLEAR] = hgt - 2; scr_places_y[LOC_HELP_PROMPT] = hgt - 1; loc.page_rows = -2; } menu_layout(m, &loc); } /* * Redisplay a single store entry */ static void store_display_entry(menu_type *menu, int oid, bool cursor, int row, int col, int width) { object_type *o_ptr; s32b x; odesc_detail_t desc = ODESC_PREFIX; char o_name[80]; char out_val[160]; byte colour; struct store *store = current_store(); assert(store); /* Get the object */ o_ptr = &store->stock[oid]; /* Describe the object - preserving insriptions in the home */ if (store->sidx == STORE_HOME) desc = ODESC_FULL; else desc = ODESC_FULL | ODESC_STORE; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | desc); /* Display the object */ c_put_str(tval_to_attr[o_ptr->tval & 0x7F], o_name, row, col); /* Show weights */ colour = curs_attrs[CURS_KNOWN][(int)cursor]; strnfmt(out_val, sizeof out_val, "%3d.%d lb", o_ptr->weight / 10, o_ptr->weight % 10); c_put_str(colour, out_val, row, scr_places_x[LOC_WEIGHT]); /* Describe an object (fully) in a store */ if (store->sidx != STORE_HOME) { /* Extract the "minimum" price */ x = price_item(o_ptr, FALSE, 1); /* Make sure the player can afford it */ if ((int) p_ptr->au < (int) x) colour = curs_attrs[CURS_UNKNOWN][(int)cursor]; /* Actually draw the price */ if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) && (o_ptr->number > 1)) strnfmt(out_val, sizeof out_val, "%9ld avg", (long)x); else strnfmt(out_val, sizeof out_val, "%9ld ", (long)x); c_put_str(colour, out_val, row, scr_places_x[LOC_PRICE]); } } /* * Display store (after clearing screen) */ static void store_display_frame(void) { char buf[80]; struct store *store = current_store(); owner_type *ot_ptr = store->owner; /* Clear screen */ Term_clear(); /* The "Home" is special */ if (store->sidx == STORE_HOME) { /* Put the owner name */ put_str("Your Home", scr_places_y[LOC_OWNER], 1); /* Label the object descriptions */ put_str("Home Inventory", scr_places_y[LOC_HEADER], 1); /* Show weight header */ put_str("Weight", scr_places_y[LOC_HEADER], scr_places_x[LOC_WEIGHT] + 2); } /* Normal stores */ else { const char *store_name = f_info[FEAT_SHOP_HEAD + store->sidx].name; const char *owner_name = ot_ptr->name; /* Put the owner name */ put_str(owner_name, scr_places_y[LOC_OWNER], 1); /* Show the max price in the store (above prices) */ strnfmt(buf, sizeof(buf), "%s (%ld)", store_name, (long)(ot_ptr->max_cost)); prt(buf, scr_places_y[LOC_OWNER], scr_places_x[LOC_OWNER] - strlen(buf)); /* Label the object descriptions */ put_str("Store Inventory", scr_places_y[LOC_HEADER], 1); /* Showing weight label */ put_str("Weight", scr_places_y[LOC_HEADER], scr_places_x[LOC_WEIGHT] + 2); /* Label the asking price (in stores) */ put_str("Price", scr_places_y[LOC_HEADER], scr_places_x[LOC_PRICE] + 4); } } /* * Display help. */ static void store_display_help(void) { int help_loc = scr_places_y[LOC_HELP_PROMPT]; struct store *store = current_store(); bool is_home = (store->sidx == STORE_HOME) ? TRUE : FALSE; /* Clear */ clear_from(scr_places_y[LOC_HELP_CLEAR]); /* Prepare help hooks */ text_out_hook = text_out_to_screen; text_out_indent = 1; Term_gotoxy(1, help_loc); text_out("Use the "); text_out_c(TERM_L_GREEN, "movement keys"); text_out(" to navigate, or "); text_out_c(TERM_L_GREEN, "Space"); text_out(" to advance to the next page. '"); if (OPT(rogue_like_commands)) text_out_c(TERM_L_GREEN, "x"); else text_out_c(TERM_L_GREEN, "l"); text_out("' examines"); if (store_knowledge == STORE_NONE) { text_out(" and '"); text_out_c(TERM_L_GREEN, "p"); if (is_home) text_out("' picks up"); else text_out("' purchases"); } text_out(" the selected item. '"); if (store_knowledge == STORE_NONE) { text_out_c(TERM_L_GREEN, "d"); if (is_home) text_out("' drops"); else text_out("' sells"); } else { text_out_c(TERM_L_GREEN, "I"); text_out("' inspects"); } text_out(" an item from your inventory. "); text_out_c(TERM_L_GREEN, "ESC"); if (store_knowledge == STORE_NONE) { text_out(" exits the building."); } else { text_out(" exits this screen."); } text_out_indent = 0; } /* * Decides what parts of the store display to redraw. Called on terminal * resizings and the redraw command. */ static void store_redraw(void) { if (store_flags & (STORE_FRAME_CHANGE)) { store_display_frame(); if (store_flags & STORE_SHOW_HELP) store_display_help(); else prt("Press '?' for help.", scr_places_y[LOC_HELP_PROMPT], 1); store_flags &= ~(STORE_FRAME_CHANGE); } if (store_flags & (STORE_GOLD_CHANGE)) { prt(format("Gold Remaining: %9ld", (long)p_ptr->au), scr_places_y[LOC_AU], scr_places_x[LOC_AU]); store_flags &= ~(STORE_GOLD_CHANGE); } } /*** Higher-level code ***/ static bool store_get_check(const char *prompt) { struct keypress ch; /* Prompt for it */ prt(prompt, 0, 0); /* Get an answer */ ch = inkey(); /* Erase the prompt */ prt("", 0, 0); if (ch.code == ESCAPE) return (FALSE); if (strchr("Nn", ch.code)) return (FALSE); /* Success */ return (TRUE); } /* * Return the quantity of a given item in the pack (include quiver). */ static int find_inven(const object_type *o_ptr) { int i, j; int num = 0; /* Similar slot? */ for (j = 0; j < QUIVER_END; j++) { object_type *j_ptr = &p_ptr->inventory[j]; /* Check only the inventory and the quiver */ if (j >= INVEN_WIELD && j < QUIVER_START) continue; /* Require identical object types */ if (o_ptr->kind != j_ptr->kind) continue; /* Analyze the items */ switch (o_ptr->tval) { /* Chests */ case TV_CHEST: { /* Never okay */ return 0; } /* Food and Potions and Scrolls */ case TV_FOOD: case TV_POTION: case TV_SCROLL: { /* Assume okay */ break; } /* Staves and Wands */ case TV_STAFF: case TV_WAND: { /* Assume okay */ break; } /* Rods */ case TV_ROD: { /* Assume okay */ break; } /* Weapons and Armor */ case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* Fall through */ } /* Rings, Amulets, Lights */ case TV_RING: case TV_AMULET: case TV_LIGHT: { /* Require both items to be known */ if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) continue; /* Fall through */ } /* Missiles */ case TV_BOLT: case TV_ARROW: case TV_SHOT: { /* Require identical knowledge of both items */ if (object_is_known(o_ptr) != object_is_known(j_ptr)) continue; /* Require identical "bonuses" */ if (o_ptr->to_h != j_ptr->to_h) continue; if (o_ptr->to_d != j_ptr->to_d) continue; if (o_ptr->to_a != j_ptr->to_a) continue; /* Require identical "pval" codes */ for (i = 0; i < MAX_PVALS; i++) if (o_ptr->pval[i] != j_ptr->pval[i]) continue; if (o_ptr->num_pvals != j_ptr->num_pvals) continue; /* Require identical "artifact" names */ if (o_ptr->artifact != j_ptr->artifact) continue; /* Require identical "ego-item" names */ if (o_ptr->ego != j_ptr->ego) continue; /* Lights must have same amount of fuel */ else if (o_ptr->timeout != j_ptr->timeout && o_ptr->tval == TV_LIGHT) continue; /* Require identical "values" */ if (o_ptr->ac != j_ptr->ac) continue; if (o_ptr->dd != j_ptr->dd) continue; if (o_ptr->ds != j_ptr->ds) continue; /* Probably okay */ break; } /* Various */ default: { /* Require knowledge */ if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) continue; /* Probably okay */ break; } } /* Different flags */ if (!of_is_equal(o_ptr->flags, j_ptr->flags)) continue; /* They match, so add up */ num += j_ptr->number; } return num; } /* * Buy the item with the given index from the current store's inventory. */ void do_cmd_buy(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type *o_ptr; object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[80]; int price, item_new; struct store *store = current_store(); if (!store) { msg("You cannot purchase items when not in a store."); return; } /* Get the actual object */ o_ptr = &store->stock[item]; /* Get desired object */ object_copy_amt(i_ptr, o_ptr, amt); /* Ensure we have room */ if (!inven_carry_okay(i_ptr)) { msg("You cannot carry that many items."); return; } /* Describe the object (fully) */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Extract the price for the entire stack */ price = price_item(i_ptr, FALSE, i_ptr->number); if (price > p_ptr->au) { msg("You cannot afford that purchase."); return; } /* Spend the money */ p_ptr->au -= price; /* Update the display */ store_flags |= STORE_GOLD_CHANGE; /* ID objects on buy */ object_notice_everything(i_ptr); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER | PN_SQUELCH); /* The object no longer belongs to the store */ i_ptr->ident &= ~(IDENT_STORE); /* Message */ if (one_in_(3)) msgt(MSG_STORE5, "%s", ONE_OF(comment_accept)); msg("You bought %s for %ld gold.", o_name, (long)price); /* Erase the inscription */ i_ptr->note = 0; /* Give it to the player */ item_new = inven_carry(p_ptr, i_ptr); /* Message */ object_desc(o_name, sizeof(o_name), &p_ptr->inventory[item_new], ODESC_PREFIX | ODESC_FULL); msg("You have %s (%c).", o_name, index_to_label(item_new)); /* Hack - Reduce the number of charges in the original stack */ if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF) { o_ptr->pval[DEFAULT_PVAL] -= i_ptr->pval[DEFAULT_PVAL]; } /* Handle stuff */ handle_stuff(p_ptr); /* Remove the bought objects from the store */ store_item_increase(store, item, -amt); store_item_optimize(store, item); /* Store is empty */ if (store->stock_num == 0) { int i; /* Shuffle */ if (one_in_(STORE_SHUFFLE)) { /* Message */ msg("The shopkeeper retires."); /* Shuffle the store */ store_shuffle(store); store_flags |= STORE_FRAME_CHANGE; } /* Maintain */ else { /* Message */ msg("The shopkeeper brings out some new stock."); } /* New inventory */ for (i = 0; i < 10; ++i) store_maint(store); } event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Retrieve the item with the given index from the home's inventory. */ void do_cmd_retrieve(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type *o_ptr; object_type picked_item; char o_name[80]; int item_new; struct store *store = current_store(); if (store->sidx != STORE_HOME) { msg("You are not currently at home."); return; } /* Get the actual object */ o_ptr = &store->stock[item]; /* Get desired object */ object_copy_amt(&picked_item, o_ptr, amt); /* Ensure we have room */ if (!inven_carry_okay(&picked_item)) { msg("You cannot carry that many items."); return; } /* Distribute charges of wands, staves, or rods */ distribute_charges(o_ptr, &picked_item, amt); /* Give it to the player */ item_new = inven_carry(p_ptr, &picked_item); /* Describe just the result */ object_desc(o_name, sizeof(o_name), &p_ptr->inventory[item_new], ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You have %s (%c).", o_name, index_to_label(item_new)); /* Handle stuff */ handle_stuff(p_ptr); /* Remove the items from the home */ store_item_increase(store, item, -amt); store_item_optimize(store, item); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Buy an object from a store */ static bool store_purchase(int item) { int amt, num; object_type *o_ptr; object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[80]; s32b price; struct store *store = current_store(); if (!store) { msg("You cannot purchase items when not in a store."); return FALSE; } /* Get the actual object */ o_ptr = &store->stock[item]; if (item < 0) return FALSE; /* Clear all current messages */ msg_flag = FALSE; prt("", 0, 0); if (store->sidx == STORE_HOME) { amt = o_ptr->number; } else { /* Price of one */ price = price_item(o_ptr, FALSE, 1); /* Check if the player can afford any at all */ if ((u32b)p_ptr->au < (u32b)price) { /* Tell the user */ msg("You do not have enough gold for this item."); /* Abort now */ return FALSE; } /* Work out how many the player can afford */ amt = p_ptr->au / price; if (amt > o_ptr->number) amt = o_ptr->number; /* Double check for wands/staves */ if ((p_ptr->au >= price_item(o_ptr, FALSE, amt+1)) && (amt < o_ptr->number)) amt++; } /* Find the number of this item in the inventory */ if (!object_flavor_is_aware(o_ptr)) num = 0; else num = find_inven(o_ptr); strnfmt(o_name, sizeof o_name, "%s how many%s? (max %d) ", (store->sidx == STORE_HOME) ? "Take" : "Buy", num ? format(" (you have %d)", num) : "", amt); /* Get a quantity */ amt = get_quantity(o_name, amt); /* Allow user abort */ if (amt <= 0) return FALSE; /* Get desired object */ object_copy_amt(i_ptr, o_ptr, amt); /* Ensure we have room */ if (!inven_carry_okay(i_ptr)) { msg("You cannot carry that many items."); return FALSE; } /* Describe the object (fully) */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Attempt to buy it */ if (store->sidx != STORE_HOME) { u32b price; bool response; /* Extract the price for the entire stack */ price = price_item(i_ptr, FALSE, i_ptr->number); screen_save(); /* Show price */ prt(format("Price: %d", price), 1, 0); /* Confirm purchase */ response = store_get_check(format("Buy %s? [ESC, any other key to accept]", o_name)); screen_load(); /* Negative response, so give up */ if (!response) return FALSE; cmd_insert(CMD_BUY); cmd_set_arg_choice(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } /* Home is much easier */ else { cmd_insert(CMD_RETRIEVE); cmd_set_arg_choice(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } /* Not kicked out */ return TRUE; } /* * Determine if the current store will purchase the given object */ static bool store_will_buy_tester(const object_type *o_ptr) { struct store *store = current_store(); if (store) return store_will_buy(store, o_ptr); return FALSE; } /* * Sell an item to the current store. */ void do_cmd_sell(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type sold_item; struct store *store = current_store(); int price, dummy, value; char o_name[120]; /* Get the item */ object_type *o_ptr = object_from_item_idx(item); /* Cannot remove cursed objects */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("Hmmm, it seems to be cursed."); return; } /* Check we are somewhere we can sell the items. */ if (!store) { msg("You cannot sell items when not in a store."); return; } /* Check the store wants the items being sold */ if (!store_will_buy(store, o_ptr)) { msg("I do not wish to purchase this item."); return; } /* Get a copy of the object representing the number being sold */ object_copy_amt(&sold_item, o_ptr, amt); /* Check if the store has space for the items */ if (!store_check_num(store, &sold_item)) { msg("I have not the room in my store to keep it."); return; } price = price_item(&sold_item, TRUE, amt); /* Get some money */ p_ptr->au += price; /* Update the display */ store_flags |= STORE_GOLD_CHANGE; /* Update the auto-history if selling an artifact that was previously un-IDed. (Ouch!) */ if (o_ptr->artifact) history_add_artifact(o_ptr->artifact, TRUE, TRUE); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Get the "apparent" value */ dummy = object_value(&sold_item, amt, FALSE); /* msg("Dummy is %d", dummy); */ /* Identify original object */ object_notice_everything(o_ptr); /* Take a new copy of the now known-about object. */ object_copy_amt(&sold_item, o_ptr, amt); /* The item belongs to the store now */ sold_item.ident |= IDENT_STORE; /* * Hack -- Allocate charges between those wands, staves, or rods * sold and retained, unless all are being sold. */ distribute_charges(o_ptr, &sold_item, amt); /* Get the "actual" value */ value = object_value(&sold_item, amt, FALSE); /* msg("Value is %d", value); */ /* Get the description all over again */ object_desc(o_name, sizeof(o_name), &sold_item, ODESC_PREFIX | ODESC_FULL); /* Describe the result (in message buffer) */ msg("You sold %s (%c) for %ld gold.", o_name, index_to_label(item), (long)price); /* Analyze the prices (and comment verbally) */ purchase_analyze(price, value, dummy); /* Set squelch flag */ p_ptr->notice |= PN_SQUELCH; /* Take the object from the player */ inven_item_increase(item, -amt); inven_item_optimize(item); /* Handle stuff */ handle_stuff(p_ptr); /* The store gets that (known) object */ store_carry(store, &sold_item); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Stash an item in the home. */ void do_cmd_stash(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type dropped_item; object_type *o_ptr = object_from_item_idx(item); struct store *store = current_store(); char o_name[120]; /* Check we are somewhere we can stash items. */ if (store->sidx != STORE_HOME) { msg("You are not in your home."); return; } /* Cannot remove cursed objects */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("Hmmm, it seems to be cursed."); return; } /* Get a copy of the object representing the number being sold */ object_copy_amt(&dropped_item, o_ptr, amt); if (!store_check_num(store, &dropped_item)) { msg("Your home is full."); return; } /* Distribute charges of wands/staves/rods */ distribute_charges(o_ptr, &dropped_item, amt); /* Describe */ object_desc(o_name, sizeof(o_name), &dropped_item, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You drop %s (%c).", o_name, index_to_label(item)); /* Take it from the players inventory */ inven_item_increase(item, -amt); inven_item_optimize(item); /* Handle stuff */ handle_stuff(p_ptr); /* Let the home carry it */ home_carry(&dropped_item); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Sell an object, or drop if it we're in the home. */ static bool store_sell(void) { int amt; int item; int get_mode = USE_EQUIP | USE_INVEN | USE_FLOOR; object_type *o_ptr; object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[120]; const char *reject = "You have nothing that I want. "; const char *prompt = "Sell which item? "; struct store *store = current_store(); if (!store) { msg("You cannot sell items when not in a store."); return FALSE; } /* Clear all current messages */ msg_flag = FALSE; prt("", 0, 0); if (store->sidx == STORE_HOME) { prompt = "Drop which item? "; } else { item_tester_hook = store_will_buy_tester; get_mode |= SHOW_PRICES; } /* Get an item */ p_ptr->command_wrk = USE_INVEN; if (!get_item(&item, prompt, reject, CMD_DROP, get_mode)) return FALSE; /* Get the item */ o_ptr = object_from_item_idx(item); /* Hack -- Cannot remove cursed objects */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { /* Oops */ msg("Hmmm, it seems to be cursed."); /* Nope */ return FALSE; } /* Get a quantity */ amt = get_quantity(NULL, o_ptr->number); /* Allow user abort */ if (amt <= 0) return FALSE; /* Get a copy of the object representing the number being sold */ object_copy_amt(i_ptr, object_from_item_idx(item), amt); if (!store_check_num(store, i_ptr)) { if (store->sidx == STORE_HOME) msg("Your home is full."); else msg("I have not the room in my store to keep it."); return FALSE; } /* Get a full description */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Real store */ if (store->sidx != STORE_HOME) { /* Extract the value of the items */ u32b price = price_item(i_ptr, TRUE, amt); screen_save(); /* Show price */ prt(format("Price: %d", price), 1, 0); /* Confirm sale */ if (!store_get_check(format("Sell %s? [ESC, any other key to accept]", o_name))) { screen_load(); return FALSE; } screen_load(); cmd_insert(CMD_SELL); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } /* Player is at home */ else { cmd_insert(CMD_STASH); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } return TRUE; } /* * Examine an item in a store */ static void store_examine(int item) { struct store *store = current_store(); object_type *o_ptr; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; if (item < 0) return; /* Get the actual object */ o_ptr = &store->stock[item]; /* Show full info in most stores, but normal info in player home */ tb = object_info(o_ptr, (store->sidx != STORE_HOME) ? OINFO_FULL : OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, header); textblock_free(tb); /* Hack -- Browse book, then prompt for a command */ if (o_ptr->tval == p_ptr->class->spell_book) textui_book_browse(o_ptr); } static void store_menu_set_selections(menu_type *menu, bool knowledge_menu) { if (knowledge_menu) { if (OPT(rogue_like_commands)) { /* These two can't intersect! */ menu->cmd_keys = "?Ieilx"; menu->selections = "abcdfghjkmnopqrstuvwyz134567"; } /* Original */ else { /* These two can't intersect! */ menu->cmd_keys = "?Ieil"; menu->selections = "abcdfghjkmnopqrstuvwxyz13456"; } } else { /* Roguelike */ if (OPT(rogue_like_commands)) { /* These two can't intersect! */ menu->cmd_keys = "\x04\x05\x10?={}~CEIPTdegilpswx"; /* \x10 = ^p , \x04 = ^D, \x05 = ^E */ menu->selections = "abcfmnoqrtuvyz13456790ABDFGH"; } /* Original */ else { /* These two can't intersect! */ menu->cmd_keys = "\x05\x010?={}~CEIbdegiklpstwx"; /* \x05 = ^E, \x10 = ^p */ menu->selections = "acfhjmnoqruvyz13456790ABDFGH"; } } } static void store_menu_recalc(menu_type *m) { struct store *store = current_store(); menu_setpriv(m, store->stock_num, store->stock); } /* * Process a command in a store * * Note that we must allow the use of a few "special" commands in the stores * which are not allowed in the dungeon, and we must disable some commands * which are allowed in the dungeon but not in the stores, to prevent chaos. */ static bool store_process_command_key(struct keypress kp) { int cmd = 0; /* Process the keycode */ switch (kp.code) { case 'T': /* roguelike */ case 't': cmd = CMD_TAKEOFF; break; case KTRL('D'): /* roguelike */ case 'k': textui_cmd_destroy(); break; case 'P': /* roguelike */ case 'b': textui_spell_browse(); break; case '~': textui_browse_knowledge(); break; case 'I': textui_obj_examine(); break; case 'w': cmd = CMD_WIELD; break; case '{': cmd = CMD_INSCRIBE; break; case '}': cmd = CMD_UNINSCRIBE; break; case 'e': do_cmd_equip(); break; case 'i': do_cmd_inven(); break; case KTRL('E'): toggle_inven_equip(); break; case 'C': do_cmd_change_name(); break; case KTRL('P'): do_cmd_messages(); break; case ')': do_cmd_save_screen(); break; default: return FALSE; } if (cmd) cmd_insert_repeated(cmd, 0); return TRUE; } /* * */ static bool store_menu_handle(menu_type *m, const ui_event *event, int oid) { bool processed = TRUE; if (event->type == EVT_SELECT) { /* Nothing for now, except "handle" the event */ return TRUE; /* In future, maybe we want a display a list of what you can do. */ } else if (event->type == EVT_KBRD) { bool storechange = FALSE; switch (event->key.code) { case 's': case 'd': storechange = store_sell(); break; case 'p': case 'g': storechange = store_purchase(oid); break; case 'l': case 'x': store_examine(oid); break; /* XXX redraw functionality should be another menu_iter handler */ case KTRL('R'): { Term_clear(); store_flags |= (STORE_FRAME_CHANGE | STORE_GOLD_CHANGE); break; } case '?': { /* Toggle help */ if (store_flags & STORE_SHOW_HELP) store_flags &= ~(STORE_SHOW_HELP); else store_flags |= STORE_SHOW_HELP; /* Redisplay */ store_flags |= STORE_INIT_CHANGE; break; } case '=': { do_cmd_options(); store_menu_set_selections(m, FALSE); break; } default: processed = store_process_command_key(event->key); } /* Let the game handle any core commands (equipping, etc) */ process_command(CMD_STORE, TRUE); if (storechange) store_menu_recalc(m); if (processed) { event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* Notice and handle stuff */ notice_stuff(p_ptr); handle_stuff(p_ptr); /* Display the store */ store_display_recalc(m); store_menu_recalc(m); store_redraw(); return processed; } return FALSE; } static region store_menu_region = { 1, 4, -1, -2 }; static const menu_iter store_menu = { NULL, NULL, store_display_entry, store_menu_handle, NULL }; static const menu_iter store_know_menu = { NULL, NULL, store_display_entry, NULL, NULL }; /* * Display contents of a store from knowledge menu * * The only allowed actions are 'I' to inspect an item */ void do_cmd_store_knowledge(void) { menu_type menu; screen_save(); clear_from(0); /* Init the menu structure */ menu_init(&menu, MN_SKIN_SCROLL, &store_menu); menu_layout(&menu, &store_menu_region); /* Calculate the positions of things and redraw */ store_menu_set_selections(&menu, TRUE); store_flags = STORE_INIT_CHANGE; store_display_recalc(&menu); store_menu_recalc(&menu); store_redraw(); menu_select(&menu, 0, FALSE); /* Flush messages XXX XXX XXX */ message_flush(); screen_load(); } /* * Enter a store, and interact with it. */ void do_cmd_store(cmd_code code, cmd_arg args[]) { /* Take note of the store number from the terrain feature */ struct store *store = current_store(); menu_type menu; /* Verify that there is a store */ if (!store) { msg("You see no store here."); return; } /* Check if we can enter the store */ if (OPT(birth_no_stores)) { msg("The doors are locked."); return; } /* Shut down the normal game view - it won't be updated - and start up the store state. */ event_signal(EVENT_LEAVE_GAME); event_signal(EVENT_ENTER_STORE); /* Forget the view */ forget_view(); /* Reset the command variables */ p_ptr->command_arg = 0; /*** Display ***/ /* Save current screen (ie. dungeon) */ screen_save(); /*** Inventory display ***/ /* Wipe the menu and set it up */ menu_init(&menu, MN_SKIN_SCROLL, &store_menu); menu_layout(&menu, &store_menu_region); store_menu_set_selections(&menu, FALSE); store_flags = STORE_INIT_CHANGE; store_display_recalc(&menu); store_menu_recalc(&menu); store_redraw(); /* Say a friendly hello. */ if (store->sidx != STORE_HOME) prt_welcome(store->owner); msg_flag = FALSE; menu_select(&menu, 0, FALSE); msg_flag = FALSE; /* Switch back to the normal game view. */ event_signal(EVENT_LEAVE_STORE); event_signal(EVENT_ENTER_GAME); /* Take a turn */ p_ptr->energy_use = 100; /* Flush messages XXX XXX XXX */ message_flush(); /* Load the screen */ screen_load(); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw entire screen */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA); /* Redraw map */ p_ptr->redraw |= (PR_MAP); } angband-v3.3.2/src/death.c0000644000175000017500000002213411651552410014631 0ustar chriscchrisc/* * File: death.c * Purpose: Handle the UI bits that happen after the character dies. * * Copyright (c) 1987 - 2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "files.h" #include "history.h" #include "savefile.h" #include "ui-menu.h" #include "wizard.h" /* * Hack - save the time of death */ static time_t death_time = (time_t)0; /* * Write formatted string `fmt` on line `y`, centred between points x1 and x2. */ static void put_str_centred(int y, int x1, int x2, const char *fmt, ...) { va_list vp; char *tmp; size_t len; int x; /* Format into the (growable) tmp */ va_start(vp, fmt); tmp = vformat(fmt, vp); va_end(vp); /* Centre now */ len = strlen(tmp); x = x1 + ((x2-x1)/2 - len/2); put_str(tmp, y, x); } /* * Display the tombstone */ static void print_tomb(void) { ang_file *fp; char buf[1024]; int line = 0; Term_clear(); /* Open the death file */ path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "dead.txt"); fp = file_open(buf, MODE_READ, -1); if (fp) { while (file_getl(fp, buf, sizeof(buf))) put_str(buf, line++, 0); file_close(fp); } line = 7; put_str_centred(line++, 8, 8+31, "%s", op_ptr->full_name); put_str_centred(line++, 8, 8+31, "the"); if (p_ptr->total_winner) put_str_centred(line++, 8, 8+31, "Magnificent"); else put_str_centred(line++, 8, 8+31, "%s", p_ptr->class->title[(p_ptr->lev - 1) / 5]); line++; put_str_centred(line++, 8, 8+31, "%s", p_ptr->class->name); put_str_centred(line++, 8, 8+31, "Level: %d", (int)p_ptr->lev); put_str_centred(line++, 8, 8+31, "Exp: %d", (int)p_ptr->exp); put_str_centred(line++, 8, 8+31, "AU: %d", (int)p_ptr->au); put_str_centred(line++, 8, 8+31, "Killed on Level %d", p_ptr->depth); put_str_centred(line++, 8, 8+31, "by %s.", p_ptr->died_from); line++; put_str_centred(line++, 8, 8+31, "by %-.24s", ctime(&death_time)); } /* * Know inventory and home items upon death */ static void death_knowledge(void) { struct store *st_ptr = &stores[STORE_HOME]; object_type *o_ptr; int i; for (i = 0; i < ALL_INVEN_TOTAL; i++) { o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) continue; object_flavor_aware(o_ptr); object_notice_everything(o_ptr); } for (i = 0; i < st_ptr->stock_num; i++) { o_ptr = &st_ptr->stock[i]; if (!o_ptr->kind) continue; object_flavor_aware(o_ptr); object_notice_everything(o_ptr); } history_unmask_unknown(); /* Hack -- Recalculate bonuses */ p_ptr->update |= (PU_BONUS); handle_stuff(p_ptr); } /* * Display the winner crown */ static void display_winner(void) { char buf[1024]; ang_file *fp; int wid, hgt; int i = 2; int width = 0; path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "crown.txt"); fp = file_open(buf, MODE_READ, -1); Term_clear(); Term_get_size(&wid, &hgt); if (fp) { /* Get us the first line of file, which tells us how long the */ /* longest line is */ file_getl(fp, buf, sizeof(buf)); sscanf(buf, "%d", &width); if (!width) width = 25; /* Dump the file to the screen */ while (file_getl(fp, buf, sizeof(buf))) put_str(buf, i++, (wid/2) - (width/2)); file_close(fp); } put_str_centred(i, 0, wid, "All Hail the Mighty %s!", p_ptr->sex->winner); flush(); pause_line(Term); } /* * Menu command: dump character dump to file. */ static void death_file(const char *title, int row) { char buf[1024]; char ftmp[80]; strnfmt(ftmp, sizeof(ftmp), "%s.txt", op_ptr->base_name); if (get_file(ftmp, buf, sizeof buf)) { errr err; /* Dump a character file */ screen_save(); err = file_character(buf, FALSE); screen_load(); /* Check result */ if (err) msg("Character dump failed!"); else msg("Character dump successful."); /* Flush messages */ message_flush(); } } /* * Menu command: view character dump and inventory. */ static void death_info(const char *title, int row) { int i, j, k; object_type *o_ptr; struct store *st_ptr = &stores[STORE_HOME]; screen_save(); /* Display player */ display_player(0); /* Prompt for inventory */ prt("Hit any key to see more information: ", 0, 0); /* Allow abort at this point */ (void)anykey(); /* Show equipment and inventory */ /* Equipment -- if any */ if (p_ptr->equip_cnt) { Term_clear(); item_tester_full = TRUE; show_equip(OLIST_WEIGHT); prt("You are using: -more-", 0, 0); (void)anykey(); } /* Inventory -- if any */ if (p_ptr->inven_cnt) { Term_clear(); item_tester_full = TRUE; show_inven(OLIST_WEIGHT); prt("You are carrying: -more-", 0, 0); (void)anykey(); } /* Home -- if anything there */ if (st_ptr->stock_num) { /* Display contents of the home */ for (k = 0, i = 0; i < st_ptr->stock_num; k++) { /* Clear screen */ Term_clear(); /* Show 12 items */ for (j = 0; (j < 12) && (i < st_ptr->stock_num); j++, i++) { byte attr; char o_name[80]; char tmp_val[80]; /* Get the object */ o_ptr = &st_ptr->stock[i]; /* Print header, clear line */ strnfmt(tmp_val, sizeof(tmp_val), "%c) ", I2A(j)); prt(tmp_val, j+2, 4); /* Get the object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Get the inventory color */ attr = tval_to_attr[o_ptr->tval % N_ELEMENTS(tval_to_attr)]; /* Display the object */ c_put_str(attr, o_name, j+2, 7); } /* Caption */ prt(format("Your home contains (page %d): -more-", k+1), 0, 0); /* Wait for it */ (void)anykey(); } } screen_load(); } /* * Menu command: peruse pre-death messages. */ static void death_messages(const char *title, int row) { screen_save(); do_cmd_messages(); screen_load(); } /* * Menu command: see top twenty scores. */ static void death_scores(const char *title, int row) { screen_save(); show_scores(); screen_load(); } /* * Menu command: examine items in the inventory. */ static void death_examine(const char *title, int row) { int item; const char *q, *s; /* Get an item */ q = "Examine which item? "; s = "You have nothing to examine."; while (get_item(&item, q, s, 0, (USE_INVEN | USE_EQUIP | IS_HARMLESS))) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; object_type *o_ptr = &p_ptr->inventory[item]; tb = object_info(o_ptr, OINFO_FULL); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, area, format("%^s", header)); textblock_free(tb); } } /* * Menu command: view character history. */ static void death_history(const char *title, int row) { history_display(); } /* * Menu command: allow spoiler generation (mainly for randarts). */ static void death_spoilers(const char *title, int row) { do_cmd_spoilers(); } /* Menu command: toggle birth_keep_randarts option. */ static void death_randarts(const char *title, int row) { if (p_ptr->randarts) option_set(option_name(OPT_birth_keep_randarts), get_check("Keep randarts for next game? ")); else msg("You are not playing with randarts!"); } /* * Menu structures for the death menu. Note that Quit must always be the * last option, due to a hard-coded check in death_screen */ static menu_type *death_menu; static menu_action death_actions[] = { { 0, 'i', "Information", death_info }, { 0, 'm', "Messages", death_messages }, { 0, 'f', "File dump", death_file }, { 0, 'v', "View scores", death_scores }, { 0, 'x', "Examine items", death_examine }, { 0, 'h', "History", death_history }, { 0, 's', "Spoilers", death_spoilers }, { 0, 'r', "Keep randarts", death_randarts }, { 0, 'q', "Quit", NULL }, }; /* * Handle character death */ void death_screen(void) { bool done = FALSE; const region area = { 51, 2, 0, N_ELEMENTS(death_actions) }; /* Retire in the town in a good state */ if (p_ptr->total_winner) { p_ptr->depth = 0; my_strcpy(p_ptr->died_from, "Ripe Old Age", sizeof(p_ptr->died_from)); p_ptr->exp = p_ptr->max_exp; p_ptr->lev = p_ptr->max_lev; p_ptr->au += 10000000L; display_winner(); } /* Get time of death */ (void)time(&death_time); print_tomb(); death_knowledge(); enter_score(&death_time); /* Flush all input and output */ flush(); message_flush(); /* Display and use the death menu */ if (!death_menu) { death_menu = menu_new_action(death_actions, N_ELEMENTS(death_actions)); death_menu->flags = MN_CASELESS_TAGS; } menu_layout(death_menu, &area); while (!done) { ui_event e = menu_select(death_menu, EVT_KBRD, FALSE); if (e.type == EVT_KBRD) { if (e.key.code == KTRL('X')) break; } else if (e.type == EVT_SELECT) { done = get_check("Do you want to quit? "); } } /* Save dead player */ if (!savefile_save(savefile)) { msg("death save failed!"); message_flush(); } } angband-v3.3.2/src/win/0000755000175000017500000000000011651552410014173 5ustar chriscchriscangband-v3.3.2/src/win/lib/0000755000175000017500000000000011651552410014741 5ustar chriscchriscangband-v3.3.2/src/win/lib/libpng.lib0000644000175000017500000014524611651552410016720 0ustar chriscchrisc! / 1244148923 0 11905 ` À]È_øa0b†b†bòcZcÂd*d’d’e erereìfTfTfÀfÀg.g.gžgžhhhŽhŽiiiziziðiðjhjhjÞjÞkVkVkÄkÄl:l:l°l°m(m(mmmømøndndnÔo<o<o¨o¨pppˆpˆpøpøqdqdqÔqÔr@r@r²r²s"s"s”s”tttŠtŠtútúujujuÜuÜvHvHvºvºw&w&w˜w˜xxxzxzxîxîy`y`yÎyÎzDzDz²z²{${${’{’|||„|„}}}n}n}Ú}Ú~F~F~À~À88®®€(€(€˜€˜ppÜÜ‚H‚H‚´‚´ƒ$ƒ$ƒƒƒüƒü„h„h„Ö„Ö…D…D…²…²†(†(†ž†ž‡‡‡Ž‡Žˆˆˆpˆpˆèˆè‰^‰^‰Ø‰ØŠPŠPŠÆŠÆ‹@‹¨‹¨ŒŒ„ŒìŒìXXÆÆŽ0ŽžŽžzzèèXXÈÈ‘6‘ž’’n’Þ“J“¶”$””þ”þ•r•r•è•è–X–X–Ò–Ò—B—B—®—®˜˜˜ˆ˜ˆ˜ô˜ô™b™b™Ð™Ðš<š<š¨š¨›››ˆ›ˆ›øœ`œÈ0˜˜žžžvžvžæžæŸRŸRŸ¾Ÿ¾ . . ž ž¡ ¡ ¡|¡|¡æ¡æ¢R¢R¢Ä¢Ä£B£B£º£º¤6¤6¤°¤°¥,¥,¥ª¥ª¦¦¦Š¦Š¦ú¦ú§h§h§æ§æ¨T¨T¨Â¨Â©:©:©¦©¦ªªª„ª„ªðªð«f«f«Ø«Ø¬D¬D¬°¬°­*­*­˜­˜® ® ®~®~®ø®ø¯f¯f¯Ü¯Ü°H°H°´°´± ± ±Ž±Ž±þ±þ²t²t²î²î³\³\³Ò³Ò´L´L´Ê´Êµ<µ<µ´µ´¶ ¶ ¶Œ¶Œ¶ø¶ø·d·d·Ð·Ð¸J¸J¸¶¸¶¹&¹&¹–¹–ººº‚º‚ºîºî»`»`»Ì»Ì¼8¼8¼¬¼¬½½½–½–¾ ¾ ¾~¾~¾ø¾ø¿h¿h¿Þ¿ÞÀ\ÀÂÀÂÁ,Á,Á ÂÂpÂØÂØÃBÃBððÄ$Ä$Ä–Ä–Å Å ÅzÅzſſÆTÆTÆÂÆÂÇ0Ç0ǪǪÈÈÈˆÈˆÈøÈøÉdÉdÉÐÉÐÊ>__IMPORT_DESCRIPTOR_libpng12__NULL_IMPORT_DESCRIPTORlibpng12_NULL_THUNK_DATA_DllGetVersion__imp__DllGetVersion__imp__png_IDAT__imp__png_IEND__imp__png_IHDR__imp__png_PLTE__imp__png_access_version_number_png_access_version_number__imp__png_bKGD__imp__png_build_grayscale_palette_png_build_grayscale_palette__imp__png_cHRM__imp__png_check_sig_png_check_sig__imp__png_chunk_error_png_chunk_error__imp__png_chunk_warning_png_chunk_warning__imp__png_convert_from_struct_tm_png_convert_from_struct_tm__imp__png_convert_from_time_t_png_convert_from_time_t__imp__png_convert_to_rfc1123_png_convert_to_rfc1123__imp__png_create_info_struct_png_create_info_struct__imp__png_create_read_struct_png_create_read_struct__imp__png_create_read_struct_2_png_create_read_struct_2__imp__png_create_write_struct_png_create_write_struct__imp__png_create_write_struct_2_png_create_write_struct_2__imp__png_data_freer_png_data_freer__imp__png_destroy_info_struct_png_destroy_info_struct__imp__png_destroy_read_struct_png_destroy_read_struct__imp__png_destroy_write_struct_png_destroy_write_struct__imp__png_error_png_error__imp__png_free_png_free__imp__png_free_data_png_free_data__imp__png_free_default_png_free_default__imp__png_gAMA__imp__png_get_IHDR_png_get_IHDR__imp__png_get_PLTE_png_get_PLTE__imp__png_get_asm_flagmask_png_get_asm_flagmask__imp__png_get_asm_flags_png_get_asm_flags__imp__png_get_bKGD_png_get_bKGD__imp__png_get_bit_depth_png_get_bit_depth__imp__png_get_cHRM_png_get_cHRM__imp__png_get_cHRM_fixed_png_get_cHRM_fixed__imp__png_get_channels_png_get_channels__imp__png_get_color_type_png_get_color_type__imp__png_get_compression_buffer_size_png_get_compression_buffer_size__imp__png_get_compression_type_png_get_compression_type__imp__png_get_copyright_png_get_copyright__imp__png_get_error_ptr_png_get_error_ptr__imp__png_get_filter_type_png_get_filter_type__imp__png_get_gAMA_png_get_gAMA__imp__png_get_gAMA_fixed_png_get_gAMA_fixed__imp__png_get_hIST_png_get_hIST__imp__png_get_header_ver_png_get_header_ver__imp__png_get_header_version_png_get_header_version__imp__png_get_iCCP_png_get_iCCP__imp__png_get_image_height_png_get_image_height__imp__png_get_image_width_png_get_image_width__imp__png_get_int_32_png_get_int_32__imp__png_get_interlace_type_png_get_interlace_type__imp__png_get_io_ptr_png_get_io_ptr__imp__png_get_libpng_ver_png_get_libpng_ver__imp__png_get_mem_ptr_png_get_mem_ptr__imp__png_get_mmx_bitdepth_threshold_png_get_mmx_bitdepth_threshold__imp__png_get_mmx_flagmask_png_get_mmx_flagmask__imp__png_get_mmx_rowbytes_threshold_png_get_mmx_rowbytes_threshold__imp__png_get_oFFs_png_get_oFFs__imp__png_get_pCAL_png_get_pCAL__imp__png_get_pHYs_png_get_pHYs__imp__png_get_pixel_aspect_ratio_png_get_pixel_aspect_ratio__imp__png_get_pixels_per_meter_png_get_pixels_per_meter__imp__png_get_progressive_ptr_png_get_progressive_ptr__imp__png_get_rgb_to_gray_status_png_get_rgb_to_gray_status__imp__png_get_rowbytes_png_get_rowbytes__imp__png_get_rows_png_get_rows__imp__png_get_sBIT_png_get_sBIT__imp__png_get_sCAL_png_get_sCAL__imp__png_get_sPLT_png_get_sPLT__imp__png_get_sRGB_png_get_sRGB__imp__png_get_signature_png_get_signature__imp__png_get_tIME_png_get_tIME__imp__png_get_tRNS_png_get_tRNS__imp__png_get_text_png_get_text__imp__png_get_uint_16_png_get_uint_16__imp__png_get_uint_31_png_get_uint_31__imp__png_get_uint_32_png_get_uint_32__imp__png_get_unknown_chunks_png_get_unknown_chunks__imp__png_get_user_chunk_ptr_png_get_user_chunk_ptr__imp__png_get_user_height_max_png_get_user_height_max__imp__png_get_user_transform_ptr_png_get_user_transform_ptr__imp__png_get_user_width_max_png_get_user_width_max__imp__png_get_valid_png_get_valid__imp__png_get_x_offset_microns_png_get_x_offset_microns__imp__png_get_x_offset_pixels_png_get_x_offset_pixels__imp__png_get_x_pixels_per_meter_png_get_x_pixels_per_meter__imp__png_get_y_offset_microns_png_get_y_offset_microns__imp__png_get_y_offset_pixels_png_get_y_offset_pixels__imp__png_get_y_pixels_per_meter_png_get_y_pixels_per_meter__imp__png_hIST__imp__png_handle_as_unknown_png_handle_as_unknown__imp__png_iCCP__imp__png_iTXt__imp__png_info_init_png_info_init__imp__png_info_init_3_png_info_init_3__imp__png_init_io_png_init_io__imp__png_libpng_ver__imp__png_malloc_png_malloc__imp__png_malloc_default_png_malloc_default__imp__png_malloc_warn_png_malloc_warn__imp__png_memcpy_check_png_memcpy_check__imp__png_memset_check_png_memset_check__imp__png_mmx_support_png_mmx_support__imp__png_oFFs__imp__png_pCAL__imp__png_pHYs__imp__png_pass_dsp_mask__imp__png_pass_inc__imp__png_pass_mask__imp__png_pass_start__imp__png_pass_yinc__imp__png_pass_ystart__imp__png_permit_empty_plte_png_permit_empty_plte__imp__png_permit_mng_features_png_permit_mng_features__imp__png_process_data_png_process_data__imp__png_progressive_combine_row_png_progressive_combine_row__imp__png_read_destroy_png_read_destroy__imp__png_read_end_png_read_end__imp__png_read_image_png_read_image__imp__png_read_info_png_read_info__imp__png_read_init_png_read_init__imp__png_read_init_2_png_read_init_2__imp__png_read_init_3_png_read_init_3__imp__png_read_png_png_read_png__imp__png_read_row_png_read_row__imp__png_read_rows_png_read_rows__imp__png_read_update_info_png_read_update_info__imp__png_reset_zstream_png_reset_zstream__imp__png_sBIT__imp__png_sCAL__imp__png_sPLT__imp__png_sRGB__imp__png_save_int_32_png_save_int_32__imp__png_save_uint_16_png_save_uint_16__imp__png_save_uint_32_png_save_uint_32__imp__png_set_IHDR_png_set_IHDR__imp__png_set_PLTE_png_set_PLTE__imp__png_set_add_alpha_png_set_add_alpha__imp__png_set_asm_flags_png_set_asm_flags__imp__png_set_bKGD_png_set_bKGD__imp__png_set_background_png_set_background__imp__png_set_bgr_png_set_bgr__imp__png_set_cHRM_png_set_cHRM__imp__png_set_cHRM_fixed_png_set_cHRM_fixed__imp__png_set_compression_buffer_size_png_set_compression_buffer_size__imp__png_set_compression_level_png_set_compression_level__imp__png_set_compression_mem_level_png_set_compression_mem_level__imp__png_set_compression_method_png_set_compression_method__imp__png_set_compression_strategy_png_set_compression_strategy__imp__png_set_compression_window_bits_png_set_compression_window_bits__imp__png_set_crc_action_png_set_crc_action__imp__png_set_dither_png_set_dither__imp__png_set_error_fn_png_set_error_fn__imp__png_set_expand_png_set_expand__imp__png_set_expand_gray_1_2_4_to_8_png_set_expand_gray_1_2_4_to_8__imp__png_set_filler_png_set_filler__imp__png_set_filter_png_set_filter__imp__png_set_filter_heuristics_png_set_filter_heuristics__imp__png_set_flush_png_set_flush__imp__png_set_gAMA_png_set_gAMA__imp__png_set_gAMA_fixed_png_set_gAMA_fixed__imp__png_set_gamma_png_set_gamma__imp__png_set_gray_1_2_4_to_8_png_set_gray_1_2_4_to_8__imp__png_set_gray_to_rgb_png_set_gray_to_rgb__imp__png_set_hIST_png_set_hIST__imp__png_set_iCCP_png_set_iCCP__imp__png_set_interlace_handling_png_set_interlace_handling__imp__png_set_invalid_png_set_invalid__imp__png_set_invert_alpha_png_set_invert_alpha__imp__png_set_invert_mono_png_set_invert_mono__imp__png_set_keep_unknown_chunks_png_set_keep_unknown_chunks__imp__png_set_mem_fn_png_set_mem_fn__imp__png_set_mmx_thresholds_png_set_mmx_thresholds__imp__png_set_oFFs_png_set_oFFs__imp__png_set_pCAL_png_set_pCAL__imp__png_set_pHYs_png_set_pHYs__imp__png_set_packing_png_set_packing__imp__png_set_packswap_png_set_packswap__imp__png_set_palette_to_rgb_png_set_palette_to_rgb__imp__png_set_progressive_read_fn_png_set_progressive_read_fn__imp__png_set_read_fn_png_set_read_fn__imp__png_set_read_status_fn_png_set_read_status_fn__imp__png_set_read_user_chunk_fn_png_set_read_user_chunk_fn__imp__png_set_read_user_transform_fn_png_set_read_user_transform_fn__imp__png_set_rgb_to_gray_png_set_rgb_to_gray__imp__png_set_rgb_to_gray_fixed_png_set_rgb_to_gray_fixed__imp__png_set_rows_png_set_rows__imp__png_set_sBIT_png_set_sBIT__imp__png_set_sCAL_png_set_sCAL__imp__png_set_sPLT_png_set_sPLT__imp__png_set_sRGB_png_set_sRGB__imp__png_set_sRGB_gAMA_and_cHRM_png_set_sRGB_gAMA_and_cHRM__imp__png_set_shift_png_set_shift__imp__png_set_sig_bytes_png_set_sig_bytes__imp__png_set_strip_16_png_set_strip_16__imp__png_set_strip_alpha_png_set_strip_alpha__imp__png_set_strip_error_numbers_png_set_strip_error_numbers__imp__png_set_swap_png_set_swap__imp__png_set_swap_alpha_png_set_swap_alpha__imp__png_set_tIME_png_set_tIME__imp__png_set_tRNS_png_set_tRNS__imp__png_set_tRNS_to_alpha_png_set_tRNS_to_alpha__imp__png_set_text_png_set_text__imp__png_set_unknown_chunk_location_png_set_unknown_chunk_location__imp__png_set_unknown_chunks_png_set_unknown_chunks__imp__png_set_user_limits_png_set_user_limits__imp__png_set_user_transform_info_png_set_user_transform_info__imp__png_set_write_fn_png_set_write_fn__imp__png_set_write_status_fn_png_set_write_status_fn__imp__png_set_write_user_transform_fn_png_set_write_user_transform_fn__imp__png_sig__imp__png_sig_cmp_png_sig_cmp__imp__png_start_read_image_png_start_read_image__imp__png_tEXt__imp__png_tIME__imp__png_tRNS__imp__png_warning_png_warning__imp__png_write_chunk_png_write_chunk__imp__png_write_chunk_data_png_write_chunk_data__imp__png_write_chunk_end_png_write_chunk_end__imp__png_write_chunk_start_png_write_chunk_start__imp__png_write_destroy_png_write_destroy__imp__png_write_end_png_write_end__imp__png_write_flush_png_write_flush__imp__png_write_image_png_write_image__imp__png_write_info_png_write_info__imp__png_write_info_before_PLTE_png_write_info_before_PLTE__imp__png_write_init_png_write_init__imp__png_write_init_2_png_write_init_2__imp__png_write_init_3_png_write_init_3__imp__png_write_png_png_write_png__imp__png_write_row_png_write_row__imp__png_write_rows_png_write_rows__imp__png_zTXt / 1244148923 0 11973 ` ðÈ]ø_0a†bòbZcÂc*d’d ereìeTfÀf.gžghŽhiziðihjÞjVkÄk:l°l(mmømdnÔnÊÀ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïð !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_adefhijklmwxyz{|}~€‚ƒ„…†‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÚÛßàáâãäåæçèéêëìíîï_DllGetVersion__IMPORT_DESCRIPTOR_libpng12__NULL_IMPORT_DESCRIPTOR__imp__DllGetVersion__imp__png_IDAT__imp__png_IEND__imp__png_IHDR__imp__png_PLTE__imp__png_access_version_number__imp__png_bKGD__imp__png_build_grayscale_palette__imp__png_cHRM__imp__png_check_sig__imp__png_chunk_error__imp__png_chunk_warning__imp__png_convert_from_struct_tm__imp__png_convert_from_time_t__imp__png_convert_to_rfc1123__imp__png_create_info_struct__imp__png_create_read_struct__imp__png_create_read_struct_2__imp__png_create_write_struct__imp__png_create_write_struct_2__imp__png_data_freer__imp__png_destroy_info_struct__imp__png_destroy_read_struct__imp__png_destroy_write_struct__imp__png_error__imp__png_free__imp__png_free_data__imp__png_free_default__imp__png_gAMA__imp__png_get_IHDR__imp__png_get_PLTE__imp__png_get_asm_flagmask__imp__png_get_asm_flags__imp__png_get_bKGD__imp__png_get_bit_depth__imp__png_get_cHRM__imp__png_get_cHRM_fixed__imp__png_get_channels__imp__png_get_color_type__imp__png_get_compression_buffer_size__imp__png_get_compression_type__imp__png_get_copyright__imp__png_get_error_ptr__imp__png_get_filter_type__imp__png_get_gAMA__imp__png_get_gAMA_fixed__imp__png_get_hIST__imp__png_get_header_ver__imp__png_get_header_version__imp__png_get_iCCP__imp__png_get_image_height__imp__png_get_image_width__imp__png_get_int_32__imp__png_get_interlace_type__imp__png_get_io_ptr__imp__png_get_libpng_ver__imp__png_get_mem_ptr__imp__png_get_mmx_bitdepth_threshold__imp__png_get_mmx_flagmask__imp__png_get_mmx_rowbytes_threshold__imp__png_get_oFFs__imp__png_get_pCAL__imp__png_get_pHYs__imp__png_get_pixel_aspect_ratio__imp__png_get_pixels_per_meter__imp__png_get_progressive_ptr__imp__png_get_rgb_to_gray_status__imp__png_get_rowbytes__imp__png_get_rows__imp__png_get_sBIT__imp__png_get_sCAL__imp__png_get_sPLT__imp__png_get_sRGB__imp__png_get_signature__imp__png_get_tIME__imp__png_get_tRNS__imp__png_get_text__imp__png_get_uint_16__imp__png_get_uint_31__imp__png_get_uint_32__imp__png_get_unknown_chunks__imp__png_get_user_chunk_ptr__imp__png_get_user_height_max__imp__png_get_user_transform_ptr__imp__png_get_user_width_max__imp__png_get_valid__imp__png_get_x_offset_microns__imp__png_get_x_offset_pixels__imp__png_get_x_pixels_per_meter__imp__png_get_y_offset_microns__imp__png_get_y_offset_pixels__imp__png_get_y_pixels_per_meter__imp__png_hIST__imp__png_handle_as_unknown__imp__png_iCCP__imp__png_iTXt__imp__png_info_init__imp__png_info_init_3__imp__png_init_io__imp__png_libpng_ver__imp__png_malloc__imp__png_malloc_default__imp__png_malloc_warn__imp__png_memcpy_check__imp__png_memset_check__imp__png_mmx_support__imp__png_oFFs__imp__png_pCAL__imp__png_pHYs__imp__png_pass_dsp_mask__imp__png_pass_inc__imp__png_pass_mask__imp__png_pass_start__imp__png_pass_yinc__imp__png_pass_ystart__imp__png_permit_empty_plte__imp__png_permit_mng_features__imp__png_process_data__imp__png_progressive_combine_row__imp__png_read_destroy__imp__png_read_end__imp__png_read_image__imp__png_read_info__imp__png_read_init__imp__png_read_init_2__imp__png_read_init_3__imp__png_read_png__imp__png_read_row__imp__png_read_rows__imp__png_read_update_info__imp__png_reset_zstream__imp__png_sBIT__imp__png_sCAL__imp__png_sPLT__imp__png_sRGB__imp__png_save_int_32__imp__png_save_uint_16__imp__png_save_uint_32__imp__png_set_IHDR__imp__png_set_PLTE__imp__png_set_add_alpha__imp__png_set_asm_flags__imp__png_set_bKGD__imp__png_set_background__imp__png_set_bgr__imp__png_set_cHRM__imp__png_set_cHRM_fixed__imp__png_set_compression_buffer_size__imp__png_set_compression_level__imp__png_set_compression_mem_level__imp__png_set_compression_method__imp__png_set_compression_strategy__imp__png_set_compression_window_bits__imp__png_set_crc_action__imp__png_set_dither__imp__png_set_error_fn__imp__png_set_expand__imp__png_set_expand_gray_1_2_4_to_8__imp__png_set_filler__imp__png_set_filter__imp__png_set_filter_heuristics__imp__png_set_flush__imp__png_set_gAMA__imp__png_set_gAMA_fixed__imp__png_set_gamma__imp__png_set_gray_1_2_4_to_8__imp__png_set_gray_to_rgb__imp__png_set_hIST__imp__png_set_iCCP__imp__png_set_interlace_handling__imp__png_set_invalid__imp__png_set_invert_alpha__imp__png_set_invert_mono__imp__png_set_keep_unknown_chunks__imp__png_set_mem_fn__imp__png_set_mmx_thresholds__imp__png_set_oFFs__imp__png_set_pCAL__imp__png_set_pHYs__imp__png_set_packing__imp__png_set_packswap__imp__png_set_palette_to_rgb__imp__png_set_progressive_read_fn__imp__png_set_read_fn__imp__png_set_read_status_fn__imp__png_set_read_user_chunk_fn__imp__png_set_read_user_transform_fn__imp__png_set_rgb_to_gray__imp__png_set_rgb_to_gray_fixed__imp__png_set_rows__imp__png_set_sBIT__imp__png_set_sCAL__imp__png_set_sPLT__imp__png_set_sRGB__imp__png_set_sRGB_gAMA_and_cHRM__imp__png_set_shift__imp__png_set_sig_bytes__imp__png_set_strip_16__imp__png_set_strip_alpha__imp__png_set_strip_error_numbers__imp__png_set_swap__imp__png_set_swap_alpha__imp__png_set_tIME__imp__png_set_tRNS__imp__png_set_tRNS_to_alpha__imp__png_set_text__imp__png_set_unknown_chunk_location__imp__png_set_unknown_chunks__imp__png_set_user_limits__imp__png_set_user_transform_info__imp__png_set_write_fn__imp__png_set_write_status_fn__imp__png_set_write_user_transform_fn__imp__png_sig__imp__png_sig_cmp__imp__png_start_read_image__imp__png_tEXt__imp__png_tIME__imp__png_tRNS__imp__png_warning__imp__png_write_chunk__imp__png_write_chunk_data__imp__png_write_chunk_end__imp__png_write_chunk_start__imp__png_write_destroy__imp__png_write_end__imp__png_write_flush__imp__png_write_image__imp__png_write_info__imp__png_write_info_before_PLTE__imp__png_write_init__imp__png_write_init_2__imp__png_write_init_3__imp__png_write_png__imp__png_write_row__imp__png_write_rows__imp__png_zTXt_png_access_version_number_png_build_grayscale_palette_png_check_sig_png_chunk_error_png_chunk_warning_png_convert_from_struct_tm_png_convert_from_time_t_png_convert_to_rfc1123_png_create_info_struct_png_create_read_struct_png_create_read_struct_2_png_create_write_struct_png_create_write_struct_2_png_data_freer_png_destroy_info_struct_png_destroy_read_struct_png_destroy_write_struct_png_error_png_free_png_free_data_png_free_default_png_get_IHDR_png_get_PLTE_png_get_asm_flagmask_png_get_asm_flags_png_get_bKGD_png_get_bit_depth_png_get_cHRM_png_get_cHRM_fixed_png_get_channels_png_get_color_type_png_get_compression_buffer_size_png_get_compression_type_png_get_copyright_png_get_error_ptr_png_get_filter_type_png_get_gAMA_png_get_gAMA_fixed_png_get_hIST_png_get_header_ver_png_get_header_version_png_get_iCCP_png_get_image_height_png_get_image_width_png_get_int_32_png_get_interlace_type_png_get_io_ptr_png_get_libpng_ver_png_get_mem_ptr_png_get_mmx_bitdepth_threshold_png_get_mmx_flagmask_png_get_mmx_rowbytes_threshold_png_get_oFFs_png_get_pCAL_png_get_pHYs_png_get_pixel_aspect_ratio_png_get_pixels_per_meter_png_get_progressive_ptr_png_get_rgb_to_gray_status_png_get_rowbytes_png_get_rows_png_get_sBIT_png_get_sCAL_png_get_sPLT_png_get_sRGB_png_get_signature_png_get_tIME_png_get_tRNS_png_get_text_png_get_uint_16_png_get_uint_31_png_get_uint_32_png_get_unknown_chunks_png_get_user_chunk_ptr_png_get_user_height_max_png_get_user_transform_ptr_png_get_user_width_max_png_get_valid_png_get_x_offset_microns_png_get_x_offset_pixels_png_get_x_pixels_per_meter_png_get_y_offset_microns_png_get_y_offset_pixels_png_get_y_pixels_per_meter_png_handle_as_unknown_png_info_init_png_info_init_3_png_init_io_png_malloc_png_malloc_default_png_malloc_warn_png_memcpy_check_png_memset_check_png_mmx_support_png_permit_empty_plte_png_permit_mng_features_png_process_data_png_progressive_combine_row_png_read_destroy_png_read_end_png_read_image_png_read_info_png_read_init_png_read_init_2_png_read_init_3_png_read_png_png_read_row_png_read_rows_png_read_update_info_png_reset_zstream_png_save_int_32_png_save_uint_16_png_save_uint_32_png_set_IHDR_png_set_PLTE_png_set_add_alpha_png_set_asm_flags_png_set_bKGD_png_set_background_png_set_bgr_png_set_cHRM_png_set_cHRM_fixed_png_set_compression_buffer_size_png_set_compression_level_png_set_compression_mem_level_png_set_compression_method_png_set_compression_strategy_png_set_compression_window_bits_png_set_crc_action_png_set_dither_png_set_error_fn_png_set_expand_png_set_expand_gray_1_2_4_to_8_png_set_filler_png_set_filter_png_set_filter_heuristics_png_set_flush_png_set_gAMA_png_set_gAMA_fixed_png_set_gamma_png_set_gray_1_2_4_to_8_png_set_gray_to_rgb_png_set_hIST_png_set_iCCP_png_set_interlace_handling_png_set_invalid_png_set_invert_alpha_png_set_invert_mono_png_set_keep_unknown_chunks_png_set_mem_fn_png_set_mmx_thresholds_png_set_oFFs_png_set_pCAL_png_set_pHYs_png_set_packing_png_set_packswap_png_set_palette_to_rgb_png_set_progressive_read_fn_png_set_read_fn_png_set_read_status_fn_png_set_read_user_chunk_fn_png_set_read_user_transform_fn_png_set_rgb_to_gray_png_set_rgb_to_gray_fixed_png_set_rows_png_set_sBIT_png_set_sCAL_png_set_sPLT_png_set_sRGB_png_set_sRGB_gAMA_and_cHRM_png_set_shift_png_set_sig_bytes_png_set_strip_16_png_set_strip_alpha_png_set_strip_error_numbers_png_set_swap_png_set_swap_alpha_png_set_tIME_png_set_tRNS_png_set_tRNS_to_alpha_png_set_text_png_set_unknown_chunk_location_png_set_unknown_chunks_png_set_user_limits_png_set_user_transform_info_png_set_write_fn_png_set_write_status_fn_png_set_write_user_transform_fn_png_sig_cmp_png_start_read_image_png_warning_png_write_chunk_png_write_chunk_data_png_write_chunk_end_png_write_chunk_start_png_write_destroy_png_write_end_png_write_flush_png_write_image_png_write_info_png_write_info_before_PLTE_png_write_init_png_write_init_2_png_write_init_3_png_write_png_png_write_row_png_write_rowslibpng12_NULL_THUNK_DATA libpng12.dll/ 1244148923 0 499 ` L»4(J.debug$SCŒ@B.idata$2Ïã@0À.idata$6ã@ À libpng12.dll(vMicrosoft (R) LINK libpng12.dll@comp.idv{ÿÿ.idata$2@Àh.idata$6.idata$4@Àh.idata$5@Àh!:T__IMPORT_DESCRIPTOR_libpng12__NULL_IMPORT_DESCRIPTORlibpng12_NULL_THUNK_DATA libpng12.dll/ 1244148923 0 252 ` L»4(J».debug$SCd@B.idata$3§@0À libpng12.dll(vMicrosoft (R) LINK@comp.idv{ÿÿ__NULL_IMPORT_DESCRIPTORlibpng12.dll/ 1244148923 0 281 ` L»4(J×.debug$SCŒ@B.idata$5Ï@0À.idata$4Ó@0À libpng12.dll(vMicrosoft (R) LINK@comp.idv{ÿÿlibpng12_NULL_THUNK_DATA libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J_DllGetVersionlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_IDATlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_IENDlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_IHDRlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_PLTElibpng12.dll libpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(_png_access_version_numberlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_bKGDlibpng12.dll libpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*_png_build_grayscale_palettelibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J _png_check_siglibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J _png_chunk_errorlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J _png_chunk_warninglibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J) _png_convert_from_struct_tmlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J& _png_convert_from_time_tlibpng12.dlllibpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%_png_convert_to_rfc1123libpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%_png_create_info_structlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%_png_create_read_structlibpng12.dll libpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'_png_create_read_struct_2libpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&_png_create_write_structlibpng12.dlllibpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(_png_create_write_struct_2libpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J_png_data_freerlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&_png_destroy_info_structlibpng12.dlllibpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&_png_destroy_read_structlibpng12.dlllibpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'_png_destroy_write_structlibpng12.dll libpng12.dll/ 1244148923 0 44 ` ÿÿL»4(J_png_errorlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J_png_freelibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J_png_free_datalibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J_png_free_defaultlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_gAMAlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J_png_get_IHDRlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J_png_get_PLTElibpng12.dll libpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#_png_get_asm_flagmasklibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J _png_get_asm_flagslibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J!_png_get_bKGDlibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J "_png_get_bit_depthlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J#_png_get_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!$_png_get_cHRM_fixedlibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J%_png_get_channelslibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!&_png_get_color_typelibpng12.dll libpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.'_png_get_compression_buffer_sizelibpng12.dlllibpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'(_png_get_compression_typelibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J )_png_get_copyrightlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J *_png_get_error_ptrlibpng12.dlllibpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"+_png_get_filter_typelibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J,_png_get_gAMAlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!-_png_get_gAMA_fixedlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J._png_get_hISTlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!/_png_get_header_verlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%0_png_get_header_versionlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J1_png_get_iCCPlibpng12.dll libpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#2_png_get_image_heightlibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"3_png_get_image_widthlibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J4_png_get_int_32libpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%5_png_get_interlace_typelibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J6_png_get_io_ptrlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!7_png_get_libpng_verlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J8_png_get_mem_ptrlibpng12.dlllibpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-9_png_get_mmx_bitdepth_thresholdlibpng12.dll libpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#:_png_get_mmx_flagmasklibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-;_png_get_mmx_rowbytes_thresholdlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J<_png_get_oFFslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J=_png_get_pCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J>_png_get_pHYslibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)?_png_get_pixel_aspect_ratiolibpng12.dll libpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'@_png_get_pixels_per_meterlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&A_png_get_progressive_ptrlibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)B_png_get_rgb_to_gray_statuslibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(JC_png_get_rowbyteslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JD_png_get_rowslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JE_png_get_sBITlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JF_png_get_sCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JG_png_get_sPLTlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JH_png_get_sRGBlibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J I_png_get_signaturelibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JJ_png_get_tIMElibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JK_png_get_tRNSlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JL_png_get_textlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JM_png_get_uint_16libpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JN_png_get_uint_31libpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JO_png_get_uint_32libpng12.dlllibpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%P_png_get_unknown_chunkslibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%Q_png_get_user_chunk_ptrlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&R_png_get_user_height_maxlibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)S_png_get_user_transform_ptrlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%T_png_get_user_width_maxlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(JU_png_get_validlibpng12.dlllibpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'V_png_get_x_offset_micronslibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&W_png_get_x_offset_pixelslibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)X_png_get_x_pixels_per_meterlibpng12.dll libpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'Y_png_get_y_offset_micronslibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&Z_png_get_y_offset_pixelslibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)[_png_get_y_pixels_per_meterlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J\ _png_hISTlibpng12.dll libpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$]_png_handle_as_unknownlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J^ _png_iCCPlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J_ _png_iTXtlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J`_png_info_initlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Ja_png_info_init_3libpng12.dlllibpng12.dll/ 1244148923 0 46 ` ÿÿL»4(Jb_png_init_iolibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jc _png_libpng_verlibpng12.dll libpng12.dll/ 1244148923 0 45 ` ÿÿL»4(Jd_png_malloclibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!e_png_malloc_defaultlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jf_png_malloc_warnlibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jg_png_memcpy_checklibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jh_png_memset_checklibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Ji_png_mmx_supportlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jj _png_oFFslibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jk _png_pCALlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jl _png_pHYslibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J m _png_pass_dsp_masklibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(Jn _png_pass_inclibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jo _png_pass_masklibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jp _png_pass_startlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jq _png_pass_yinclibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jr _png_pass_ystartlibpng12.dlllibpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$s_png_permit_empty_pltelibpng12.dlllibpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&t_png_permit_mng_featureslibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Ju_png_process_datalibpng12.dll libpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*v_png_progressive_combine_rowlibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jw_png_read_destroylibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(Jx_png_read_endlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jy_png_read_imagelibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jz_png_read_infolibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J{_png_read_initlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J|_png_read_init_2libpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J}_png_read_init_3libpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J~_png_read_pnglibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J_png_read_rowlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J€_png_read_rowslibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#_png_read_update_infolibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J ‚_png_reset_zstreamlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jƒ _png_sBITlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J„ _png_sCALlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J… _png_sPLTlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J† _png_sRGBlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J‡_png_save_int_32libpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jˆ_png_save_uint_16libpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J‰_png_save_uint_32libpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JŠ_png_set_IHDRlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J‹_png_set_PLTElibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J Œ_png_set_add_alphalibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J _png_set_asm_flagslibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JŽ_png_set_bKGDlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!_png_set_backgroundlibpng12.dll libpng12.dll/ 1244148923 0 46 ` ÿÿL»4(J_png_set_bgrlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J‘_png_set_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!’_png_set_cHRM_fixedlibpng12.dll libpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.“_png_set_compression_buffer_sizelibpng12.dlllibpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(”_png_set_compression_levellibpng12.dlllibpng12.dll/ 1244148923 0 64 ` ÿÿL»4(J,•_png_set_compression_mem_levellibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)–_png_set_compression_methodlibpng12.dll libpng12.dll/ 1244148923 0 63 ` ÿÿL»4(J+—_png_set_compression_strategylibpng12.dll libpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.˜_png_set_compression_window_bitslibpng12.dlllibpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!™_png_set_crc_actionlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jš_png_set_ditherlibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J›_png_set_error_fnlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jœ_png_set_expandlibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-_png_set_expand_gray_1_2_4_to_8libpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jž_png_set_fillerlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(JŸ_png_set_filterlibpng12.dll libpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J( _png_set_filter_heuristicslibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J¡_png_set_flushlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¢_png_set_gAMAlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!£_png_set_gAMA_fixedlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J¤_png_set_gammalibpng12.dlllibpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&¥_png_set_gray_1_2_4_to_8libpng12.dlllibpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"¦_png_set_gray_to_rgblibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J§_png_set_hISTlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¨_png_set_iCCPlibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)©_png_set_interlace_handlinglibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jª_png_set_invalidlibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#«_png_set_invert_alphalibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"¬_png_set_invert_monolibpng12.dlllibpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*­_png_set_keep_unknown_chunkslibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J®_png_set_mem_fnlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%¯_png_set_mmx_thresholdslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J°_png_set_oFFslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J±_png_set_pCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J²_png_set_pHYslibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J³_png_set_packinglibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J´_png_set_packswaplibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%µ_png_set_palette_to_rgblibpng12.dll libpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*¶_png_set_progressive_read_fnlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J·_png_set_read_fnlibpng12.dlllibpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%¸_png_set_read_status_fnlibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)¹_png_set_read_user_chunk_fnlibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-º_png_set_read_user_transform_fnlibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"»_png_set_rgb_to_graylibpng12.dlllibpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(¼_png_set_rgb_to_gray_fixedlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J½_png_set_rowslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¾_png_set_sBITlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¿_png_set_sCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÀ_png_set_sPLTlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÁ_png_set_sRGBlibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)Â_png_set_sRGB_gAMA_and_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(JÃ_png_set_shiftlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J Ä_png_set_sig_byteslibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(JÅ_png_set_strip_16libpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"Æ_png_set_strip_alphalibpng12.dlllibpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*Ç_png_set_strip_error_numberslibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÈ_png_set_swaplibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!É_png_set_swap_alphalibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÊ_png_set_tIMElibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JË_png_set_tRNSlibpng12.dll libpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$Ì_png_set_tRNS_to_alphalibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÍ_png_set_textlibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-Î_png_set_unknown_chunk_locationlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%Ï_png_set_unknown_chunkslibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"Ð_png_set_user_limitslibpng12.dlllibpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*Ñ_png_set_user_transform_infolibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(JÒ_png_set_write_fnlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&Ó_png_set_write_status_fnlibpng12.dlllibpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.Ô_png_set_write_user_transform_fnlibpng12.dlllibpng12.dll/ 1244148923 0 42 ` ÿÿL»4(JÕ _png_siglibpng12.dlllibpng12.dll/ 1244148923 0 46 ` ÿÿL»4(JÖ_png_sig_cmplibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#×_png_start_read_imagelibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(JØ _png_tEXtlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(JÙ _png_tIMElibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(JÚ _png_tRNSlibpng12.dll libpng12.dll/ 1244148923 0 46 ` ÿÿL»4(JÛ_png_warninglibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JÜ_png_write_chunklibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#Ý_png_write_chunk_datalibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"Þ_png_write_chunk_endlibpng12.dlllibpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$ß_png_write_chunk_startlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J à_png_write_destroylibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Já_png_write_endlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jâ_png_write_flushlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jã_png_write_imagelibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jä_png_write_infolibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)å_png_write_info_before_PLTElibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jæ_png_write_initlibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jç_png_write_init_2libpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jè_png_write_init_3libpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jé_png_write_pnglibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jê_png_write_rowlibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jë_png_write_rowslibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jì _png_zTXtlibpng12.dll angband-v3.3.2/src/win/lib/zlib.lib0000644000175000017500000003467211651552410016405 0ustar chriscchrisc! / 1121874615 0 2848 ` ÔÖ \\Æ,””úúffÊÊ66œœ l l Ð Ð!6!6! ! """l"l"Ð"Ð#8#8# # $$$p$p$Ø$Ø%B%B%ª%ª&&&‚&‚&î&î'V'Ä'Ä(.(.(”(”(ø(ø)\)\)À)À*"*"*†*†*ê*ê+L+L+®+®,,,t,t,Ö,Ö-8-8-š-š-þ-þ.`.`.È.È/*/*/Ž/Ž/ò/ò0V0V0¾0¾1(1(1”1”1ü1ü2b2b2Î2Î38383 3 444p4p4à4à5H5H5´6"6"6Š6Š6ô6ô7Z7Z7¼8 8 8„8„8æ8æ9R9R__IMPORT_DESCRIPTOR_zlib1__NULL_IMPORT_DESCRIPTORzlib1_NULL_THUNK_DATA_DllGetVersion__imp__DllGetVersion__imp___dist_code__imp___length_code__imp___tr_align__tr_align__imp___tr_flush_block__tr_flush_block__imp___tr_init__tr_init__imp___tr_stored_block__tr_stored_block__imp___tr_tally__tr_tally__imp__adler32_adler32__imp__adler32_combine_adler32_combine__imp__compress_compress__imp__compress2_compress2__imp__compressBound_compressBound__imp__crc32_crc32__imp__crc32_combine_crc32_combine__imp__deflate_deflate__imp__deflateBound_deflateBound__imp__deflateCopy_deflateCopy__imp__deflateEnd_deflateEnd__imp__deflateInit2__deflateInit2___imp__deflateInit__deflateInit___imp__deflateParams_deflateParams__imp__deflatePrime_deflatePrime__imp__deflateReset_deflateReset__imp__deflateSetDictionary_deflateSetDictionary__imp__deflateSetHeader_deflateSetHeader__imp__deflateTune_deflateTune__imp__deflate_copyright__imp__get_crc_table_get_crc_table__imp__gzclearerr_gzclearerr__imp__gzclose_gzclose__imp__gzdirect_gzdirect__imp__gzdopen_gzdopen__imp__gzeof_gzeof__imp__gzerror_gzerror__imp__gzflush_gzflush__imp__gzgetc_gzgetc__imp__gzgets_gzgets__imp__gzopen_gzopen__imp__gzprintf_gzprintf__imp__gzputc_gzputc__imp__gzputs_gzputs__imp__gzread_gzread__imp__gzrewind_gzrewind__imp__gzseek_gzseek__imp__gzsetparams_gzsetparams__imp__gztell_gztell__imp__gzungetc_gzungetc__imp__gzwrite_gzwrite__imp__inflate_inflate__imp__inflateBack_inflateBack__imp__inflateBackEnd_inflateBackEnd__imp__inflateBackInit__inflateBackInit___imp__inflateCopy_inflateCopy__imp__inflateEnd_inflateEnd__imp__inflateGetHeader_inflateGetHeader__imp__inflateInit2__inflateInit2___imp__inflateInit__inflateInit___imp__inflatePrime_inflatePrime__imp__inflateReset_inflateReset__imp__inflateSetDictionary_inflateSetDictionary__imp__inflateSync_inflateSync__imp__inflateSyncPoint_inflateSyncPoint__imp__inflate_copyright__imp__inflate_fast_inflate_fast__imp__inflate_table_inflate_table__imp__uncompress_uncompress__imp__zError_zError__imp__z_errmsg__imp__zcalloc_zcalloc__imp__zcfree_zcfree__imp__zlibCompileFlags_zlibCompileFlags__imp__zlibVersion_zlibVersion/ 1121874615 0 2868 ` LÔÖ \Æ,”úfÊ6œ l Ð 6! !"l"Ð"8# #$p$Ø$B%ª%&‚&î&V'Ä'.(”(ø(\)À)"*†*ê*L+®+,t,Ö,8-š-þ-`.È.*/Ž/ò/V0¾0(1”1ü1b2Î283 34p4à4H5´5"6Š6ô6Z7¼7 8„8æ8R9  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL  !"#$%&'()*+,-./0123456789:;<=>?@ABDEFGIJKL_DllGetVersion__IMPORT_DESCRIPTOR_zlib1__NULL_IMPORT_DESCRIPTOR__imp__DllGetVersion__imp___dist_code__imp___length_code__imp___tr_align__imp___tr_flush_block__imp___tr_init__imp___tr_stored_block__imp___tr_tally__imp__adler32__imp__adler32_combine__imp__compress__imp__compress2__imp__compressBound__imp__crc32__imp__crc32_combine__imp__deflate__imp__deflateBound__imp__deflateCopy__imp__deflateEnd__imp__deflateInit2___imp__deflateInit___imp__deflateParams__imp__deflatePrime__imp__deflateReset__imp__deflateSetDictionary__imp__deflateSetHeader__imp__deflateTune__imp__deflate_copyright__imp__get_crc_table__imp__gzclearerr__imp__gzclose__imp__gzdirect__imp__gzdopen__imp__gzeof__imp__gzerror__imp__gzflush__imp__gzgetc__imp__gzgets__imp__gzopen__imp__gzprintf__imp__gzputc__imp__gzputs__imp__gzread__imp__gzrewind__imp__gzseek__imp__gzsetparams__imp__gztell__imp__gzungetc__imp__gzwrite__imp__inflate__imp__inflateBack__imp__inflateBackEnd__imp__inflateBackInit___imp__inflateCopy__imp__inflateEnd__imp__inflateGetHeader__imp__inflateInit2___imp__inflateInit___imp__inflatePrime__imp__inflateReset__imp__inflateSetDictionary__imp__inflateSync__imp__inflateSyncPoint__imp__inflate_copyright__imp__inflate_fast__imp__inflate_table__imp__uncompress__imp__zError__imp__z_errmsg__imp__zcalloc__imp__zcfree__imp__zlibCompileFlags__imp__zlibVersion__tr_align__tr_flush_block__tr_init__tr_stored_block__tr_tally_adler32_adler32_combine_compress_compress2_compressBound_crc32_crc32_combine_deflate_deflateBound_deflateCopy_deflateEnd_deflateInit2__deflateInit__deflateParams_deflatePrime_deflateReset_deflateSetDictionary_deflateSetHeader_deflateTune_get_crc_table_gzclearerr_gzclose_gzdirect_gzdopen_gzeof_gzerror_gzflush_gzgetc_gzgets_gzopen_gzprintf_gzputc_gzputs_gzread_gzrewind_gzseek_gzsetparams_gztell_gzungetc_gzwrite_inflate_inflateBack_inflateBackEnd_inflateBackInit__inflateCopy_inflateEnd_inflateGetHeader_inflateInit2__inflateInit__inflatePrime_inflateReset_inflateSetDictionary_inflateSync_inflateSyncPoint_inflate_fast_inflate_table_uncompress_zError_zcalloc_zcfree_zlibCompileFlags_zlibVersionzlib1_NULL_THUNK_DATAzlib1.dll/ 1121874615 0 710 ` L·rÞBèà .debug$S@l@B.idata$2¬À@0À.idata$6 ÞÀ@ À zlib1.dll(ÿ Microsoft (R) LINK zlib1.dll@comp.idÿ ÿÿ.idata$2@Àh.idata$6.idata$4@Àh.idata$5@Àh7N__IMPORT_DESCRIPTOR_zlib1__NULL_IMPORT_DESCRIPTORzlib1_NULL_THUNK_DATAzlib1.dll/ 1121874615 0 249 ` L·rÞB¸.debug$S@d@B.idata$3¤@0À zlib1.dll(ÿ Microsoft (R) LINK@comp.idÿ ÿÿ__NULL_IMPORT_DESCRIPTOR zlib1.dll/ 1121874615 0 275 ` L·rÞBÔ.debug$S@Œ@B.idata$5Ì@0À.idata$4Ð@0À zlib1.dll(ÿ Microsoft (R) LINK@comp.idÿ ÿÿzlib1_NULL_THUNK_DATA zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_DllGetVersionzlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB__dist_codezlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB__length_codezlib1.dllzlib1.dll/ 1121874615 0 41 ` ÿÿL·rÞB__tr_alignzlib1.dll zlib1.dll/ 1121874615 0 47 ` ÿÿL·rÞB__tr_flush_blockzlib1.dll zlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB__tr_initzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB__tr_stored_blockzlib1.dllzlib1.dll/ 1121874615 0 41 ` ÿÿL·rÞB__tr_tallyzlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB _adler32zlib1.dll zlib1.dll/ 1121874615 0 47 ` ÿÿL·rÞB _adler32_combinezlib1.dll zlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB _compresszlib1.dllzlib1.dll/ 1121874615 0 41 ` ÿÿL·rÞB _compress2zlib1.dll zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB _compressBoundzlib1.dll zlib1.dll/ 1121874615 0 37 ` ÿÿL·rÞB_crc32zlib1.dll zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_crc32_combinezlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB_deflatezlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflateBoundzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB_deflateCopyzlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB_deflateEndzlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_deflateInit2_zlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflateInit_zlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_deflateParamszlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflatePrimezlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflateResetzlib1.dllzlib1.dll/ 1121874615 0 52 ` ÿÿL·rÞB _deflateSetDictionaryzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB_deflateSetHeaderzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB_deflateTunezlib1.dll zlib1.dll/ 1121874615 0 49 ` ÿÿL·rÞB_deflate_copyrightzlib1.dll zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_get_crc_tablezlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB_gzclearerrzlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB_gzclosezlib1.dll zlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB _gzdirectzlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB!_gzdopenzlib1.dll zlib1.dll/ 1121874615 0 37 ` ÿÿL·rÞB"_gzeofzlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB#_gzerrorzlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB$_gzflushzlib1.dll zlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB%_gzgetczlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB&_gzgetszlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB'_gzopenzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB(_gzprintfzlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB)_gzputczlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB*_gzputszlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB+_gzreadzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB,_gzrewindzlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB-_gzseekzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB._gzsetparamszlib1.dll zlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB/_gztellzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB0_gzungetczlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB1_gzwritezlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB2_inflatezlib1.dll zlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB3_inflateBackzlib1.dll zlib1.dll/ 1121874615 0 46 ` ÿÿL·rÞB4_inflateBackEndzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB5_inflateBackInit_zlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB6_inflateCopyzlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB7_inflateEndzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB8_inflateGetHeaderzlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB9_inflateInit2_zlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB:_inflateInit_zlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB;_inflatePrimezlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB<_inflateResetzlib1.dllzlib1.dll/ 1121874615 0 52 ` ÿÿL·rÞB =_inflateSetDictionaryzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB>_inflateSynczlib1.dll zlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB?_inflateSyncPointzlib1.dllzlib1.dll/ 1121874615 0 49 ` ÿÿL·rÞB@_inflate_copyrightzlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞBA_inflate_fastzlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞBB_inflate_tablezlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞBC_uncompresszlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞBD_zErrorzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞBE_z_errmsgzlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞBF_zcalloczlib1.dll zlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞBG_zcfreezlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞBH_zlibCompileFlagszlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞBI_zlibVersionzlib1.dll angband-v3.3.2/src/win/angband.ico0000644000175000017500000000137711651552410016271 0ustar chriscchrisc è( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿° ûûðûûûð¿¿¿¿¿¿¿¿Ìϰûûñûû üüÌÌû¿°¿±¿¿¿ÌÌÌÏ ðûñûûðûÌÌÌ𱿿¼ÌÏ¿°° ðûûûûüûûûûð¿¿¿±¿¿¿¿¿¿ûûûñûûû+ûû¿¿¿¿²"//¿ ðð ò""ûûð¿ÿ""ûññðÿ""!ðð°ÿ"ûñññ!!ññññ¿°ûûñññññññññ¿¿¿ûûûðññ ññð¿¿¿¿¿ ûûû ñ ûðñðñð¿¿¿¿°¿°ûûûû û ûûûûð¿¿¿°¿¿¿¿¿¿°¿¿° ûûûû ûûûûû¿¿¿¿¿ÿÿÿÿà?ÿÃÀü€€€€ÀÀÀàààààààààààÀÀÀ€€€ÿøÿÿÿÿÿÿÿÿ angband-v3.3.2/src/win/include/0000755000175000017500000000000011651552410015616 5ustar chriscchriscangband-v3.3.2/src/win/include/pngconf.h0000644000175000017500000013050611651552410017426 0ustar chriscchrisc /* pngconf.h - machine configurable file for libpng * * libpng version 1.2.37 - June 4, 2009 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ /* Any machine specific code is near the front of this file, so if you * are configuring libpng for a machine, you may want to read the section * starting here down to where it starts to typedef png_color, png_text, * and png_info. */ #ifndef PNGCONF_H #define PNGCONF_H #define PNG_1_2_X /* * PNG_USER_CONFIG has to be defined on the compiler command line. This * includes the resource compiler for Windows DLL configurations. */ #ifdef PNG_USER_CONFIG # ifndef PNG_USER_PRIVATEBUILD # define PNG_USER_PRIVATEBUILD # endif #include "pngusr.h" #endif /* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ #ifdef PNG_CONFIGURE_LIBPNG #ifdef HAVE_CONFIG_H #include "config.h" #endif #endif /* * Added at libpng-1.2.8 * * If you create a private DLL you need to define in "pngusr.h" the followings: * #define PNG_USER_PRIVATEBUILD * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." * #define PNG_USER_DLLFNAME_POSTFIX * e.g. // private DLL "libpng13gx.dll" * #define PNG_USER_DLLFNAME_POSTFIX "gx" * * The following macros are also at your disposal if you want to complete the * DLL VERSIONINFO structure. * - PNG_USER_VERSIONINFO_COMMENTS * - PNG_USER_VERSIONINFO_COMPANYNAME * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS */ #ifdef __STDC__ #ifdef SPECIALBUILD # pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") #endif #ifdef PRIVATEBUILD # pragma message("PRIVATEBUILD is deprecated.\ Use PNG_USER_PRIVATEBUILD instead.") # define PNG_USER_PRIVATEBUILD PRIVATEBUILD #endif #endif /* __STDC__ */ #ifndef PNG_VERSION_INFO_ONLY /* End of material added to libpng-1.2.8 */ /* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble Restored at libpng-1.2.21 */ #if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ !defined(PNG_WARN_UNINITIALIZED_ROW) # define PNG_WARN_UNINITIALIZED_ROW 1 #endif /* End of material added at libpng-1.2.19/1.2.21 */ /* This is the size of the compression buffer, and thus the size of * an IDAT chunk. Make this whatever size you feel is best for your * machine. One of these will be allocated per png_struct. When this * is full, it writes the data to the disk, and does some other * calculations. Making this an extremely small size will slow * the library down, but you may want to experiment to determine * where it becomes significant, if you are concerned with memory * usage. Note that zlib allocates at least 32Kb also. For readers, * this describes the size of the buffer available to read the data in. * Unless this gets smaller than the size of a row (compressed), * it should not make much difference how big this is. */ #ifndef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 8192 #endif /* Enable if you want a write-only libpng */ #ifndef PNG_NO_READ_SUPPORTED # define PNG_READ_SUPPORTED #endif /* Enable if you want a read-only libpng */ #ifndef PNG_NO_WRITE_SUPPORTED # define PNG_WRITE_SUPPORTED #endif /* Enabled by default in 1.2.0. You can disable this if you don't need to support PNGs that are embedded in MNG datastreams */ #if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) # ifndef PNG_MNG_FEATURES_SUPPORTED # define PNG_MNG_FEATURES_SUPPORTED # endif #endif #ifndef PNG_NO_FLOATING_POINT_SUPPORTED # ifndef PNG_FLOATING_POINT_SUPPORTED # define PNG_FLOATING_POINT_SUPPORTED # endif #endif /* If you are running on a machine where you cannot allocate more * than 64K of memory at once, uncomment this. While libpng will not * normally need that much memory in a chunk (unless you load up a very * large file), zlib needs to know how big of a chunk it can use, and * libpng thus makes sure to check any memory allocation to verify it * will fit into memory. #define PNG_MAX_MALLOC_64K */ #if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) # define PNG_MAX_MALLOC_64K #endif /* Special munging to support doing things the 'cygwin' way: * 'Normal' png-on-win32 defines/defaults: * PNG_BUILD_DLL -- building dll * PNG_USE_DLL -- building an application, linking to dll * (no define) -- building static library, or building an * application and linking to the static lib * 'Cygwin' defines/defaults: * PNG_BUILD_DLL -- (ignored) building the dll * (no define) -- (ignored) building an application, linking to the dll * PNG_STATIC -- (ignored) building the static lib, or building an * application that links to the static lib. * ALL_STATIC -- (ignored) building various static libs, or building an * application that links to the static libs. * Thus, * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and * this bit of #ifdefs will define the 'correct' config variables based on * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but * unnecessary. * * Also, the precedence order is: * ALL_STATIC (since we can't #undef something outside our namespace) * PNG_BUILD_DLL * PNG_STATIC * (nothing) == PNG_USE_DLL * * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent * of auto-import in binutils, we no longer need to worry about * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes * to __declspec() stuff. However, we DO need to worry about * PNG_BUILD_DLL and PNG_STATIC because those change some defaults * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. */ #if defined(__CYGWIN__) # if defined(ALL_STATIC) # if defined(PNG_BUILD_DLL) # undef PNG_BUILD_DLL # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # if !defined(PNG_STATIC) # define PNG_STATIC # endif # else # if defined (PNG_BUILD_DLL) # if defined(PNG_STATIC) # undef PNG_STATIC # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # else # if defined(PNG_STATIC) # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # else # if !defined(PNG_USE_DLL) # define PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # endif # endif # endif #endif /* This protects us against compilers that run on a windowing system * and thus don't have or would rather us not use the stdio types: * stdin, stdout, and stderr. The only one currently used is stderr * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will * prevent these from being compiled and used. #defining PNG_NO_STDIO * will also prevent these, plus will prevent the entire set of stdio * macros and functions (FILE *, printf, etc.) from being compiled and used, * unless (PNG_DEBUG > 0) has been #defined. * * #define PNG_NO_CONSOLE_IO * #define PNG_NO_STDIO */ #if defined(_WIN32_WCE) # include /* Console I/O functions are not supported on WindowsCE */ # define PNG_NO_CONSOLE_IO /* abort() may not be supported on some/all Windows CE platforms */ # define PNG_ABORT() exit(-1) # ifdef PNG_DEBUG # undef PNG_DEBUG # endif #endif #ifdef PNG_BUILD_DLL # ifndef PNG_CONSOLE_IO_SUPPORTED # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # endif #endif # ifdef PNG_NO_STDIO # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # ifdef PNG_DEBUG # if (PNG_DEBUG > 0) # include # endif # endif # else # if !defined(_WIN32_WCE) /* "stdio.h" functions are not supported on WindowsCE */ # include # endif # endif /* This macro protects us against machines that don't have function * prototypes (ie K&R style headers). If your compiler does not handle * function prototypes, define this macro and use the included ansi2knr. * I've always been able to use _NO_PROTO as the indicator, but you may * need to drag the empty declaration out in front of here, or change the * ifdef to suit your own needs. */ #ifndef PNGARG #ifdef OF /* zlib prototype munger */ # define PNGARG(arglist) OF(arglist) #else #ifdef _NO_PROTO # define PNGARG(arglist) () # ifndef PNG_TYPECAST_NULL # define PNG_TYPECAST_NULL # endif #else # define PNGARG(arglist) arglist #endif /* _NO_PROTO */ #endif /* OF */ #endif /* PNGARG */ /* Try to determine if we are compiling on a Mac. Note that testing for * just __MWERKS__ is not good enough, because the Codewarrior is now used * on non-Mac platforms. */ #ifndef MACOS # if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) # define MACOS # endif #endif /* enough people need this for various reasons to include it here */ #if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) # include #endif #if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) # define PNG_SETJMP_SUPPORTED #endif #ifdef PNG_SETJMP_SUPPORTED /* This is an attempt to force a single setjmp behaviour on Linux. If * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. * * You can bypass this test if you know that your application uses exactly * the same setjmp.h that was included when libpng was built. Only define * PNG_SKIP_SETJMP_CHECK while building your application, prior to the * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK * while building a separate libpng library for general use. */ # ifndef PNG_SKIP_SETJMP_CHECK # ifdef __linux__ # ifdef _BSD_SOURCE # define PNG_SAVE_BSD_SOURCE # undef _BSD_SOURCE # endif # ifdef _SETJMP_H /* If you encounter a compiler error here, see the explanation * near the end of INSTALL. */ __pngconf.h__ in libpng already includes setjmp.h; __dont__ include it again.; # endif # endif /* __linux__ */ # endif /* PNG_SKIP_SETJMP_CHECK */ /* include setjmp.h for error handling */ # include # ifdef __linux__ # ifdef PNG_SAVE_BSD_SOURCE # ifndef _BSD_SOURCE # define _BSD_SOURCE # endif # undef PNG_SAVE_BSD_SOURCE # endif # endif /* __linux__ */ #endif /* PNG_SETJMP_SUPPORTED */ #ifdef BSD # include #else # include #endif /* Other defines for things like memory and the like can go here. */ #ifdef PNG_INTERNAL #include /* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which * aren't usually used outside the library (as far as I know), so it is * debatable if they should be exported at all. In the future, when it is * possible to have run-time registry of chunk-handling functions, some of * these will be made available again. #define PNG_EXTERN extern */ #define PNG_EXTERN /* Other defines specific to compilers can go here. Try to keep * them inside an appropriate ifdef/endif pair for portability. */ #if defined(PNG_FLOATING_POINT_SUPPORTED) # if defined(MACOS) /* We need to check that hasn't already been included earlier * as it seems it doesn't agree with , yet we should really use * if possible. */ # if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) # include # endif # else # include # endif # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) /* Amiga SAS/C: We must include builtin FPU functions when compiling using * MATH=68881 */ # include # endif #endif /* Codewarrior on NT has linking problems without this. */ #if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) # define PNG_ALWAYS_EXTERN #endif /* This provides the non-ANSI (far) memory allocation routines. */ #if defined(__TURBOC__) && defined(__MSDOS__) # include # include #endif /* I have no idea why is this necessary... */ #if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) # include #endif /* This controls how fine the dithering gets. As this allocates * a largish chunk of memory (32K), those who are not as concerned * with dithering quality can decrease some or all of these. */ #ifndef PNG_DITHER_RED_BITS # define PNG_DITHER_RED_BITS 5 #endif #ifndef PNG_DITHER_GREEN_BITS # define PNG_DITHER_GREEN_BITS 5 #endif #ifndef PNG_DITHER_BLUE_BITS # define PNG_DITHER_BLUE_BITS 5 #endif /* This controls how fine the gamma correction becomes when you * are only interested in 8 bits anyway. Increasing this value * results in more memory being used, and more pow() functions * being called to fill in the gamma tables. Don't set this value * less then 8, and even that may not work (I haven't tested it). */ #ifndef PNG_MAX_GAMMA_8 # define PNG_MAX_GAMMA_8 11 #endif /* This controls how much a difference in gamma we can tolerate before * we actually start doing gamma conversion. */ #ifndef PNG_GAMMA_THRESHOLD # define PNG_GAMMA_THRESHOLD 0.05 #endif #endif /* PNG_INTERNAL */ /* The following uses const char * instead of char * for error * and warning message functions, so some compilers won't complain. * If you do not want to use const, define PNG_NO_CONST here. */ #ifndef PNG_NO_CONST # define PNG_CONST const #else # define PNG_CONST #endif /* The following defines give you the ability to remove code from the * library that you will not be using. I wish I could figure out how to * automate this, but I can't do that without making it seriously hard * on the users. So if you are not using an ability, change the #define * to and #undef, and that part of the library will not be compiled. If * your linker can't find a function, you may want to make sure the * ability is defined here. Some of these depend upon some others being * defined. I haven't figured out all the interactions here, so you may * have to experiment awhile to get everything to compile. If you are * creating or using a shared library, you probably shouldn't touch this, * as it will affect the size of the structures, and this will cause bad * things to happen if the library and/or application ever change. */ /* Any features you will not be using can be undef'ed here */ /* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS * on the compile line, then pick and choose which ones to define without * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED * if you only want to have a png-compliant reader/writer but don't need * any of the extra transformations. This saves about 80 kbytes in a * typical installation of the library. (PNG_NO_* form added in version * 1.0.1c, for consistency) */ /* The size of the png_text structure changed in libpng-1.0.6 when * iTXt support was added. iTXt support was turned off by default through * libpng-1.2.x, to support old apps that malloc the png_text structure * instead of calling png_set_text() and letting libpng malloc it. It * was turned on by default in libpng-1.3.0. */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) # ifndef PNG_NO_iTXt_SUPPORTED # define PNG_NO_iTXt_SUPPORTED # endif # ifndef PNG_NO_READ_iTXt # define PNG_NO_READ_iTXt # endif # ifndef PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_iTXt # endif #endif #if !defined(PNG_NO_iTXt_SUPPORTED) # if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) # define PNG_READ_iTXt # endif # if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) # define PNG_WRITE_iTXt # endif #endif /* The following support, added after version 1.0.0, can be turned off here en * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility * with old applications that require the length of png_struct and png_info * to remain unchanged. */ #ifdef PNG_LEGACY_SUPPORTED # define PNG_NO_FREE_ME # define PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_NO_READ_USER_CHUNKS # define PNG_NO_READ_iCCP # define PNG_NO_WRITE_iCCP # define PNG_NO_READ_iTXt # define PNG_NO_WRITE_iTXt # define PNG_NO_READ_sCAL # define PNG_NO_WRITE_sCAL # define PNG_NO_READ_sPLT # define PNG_NO_WRITE_sPLT # define PNG_NO_INFO_IMAGE # define PNG_NO_READ_RGB_TO_GRAY # define PNG_NO_READ_USER_TRANSFORM # define PNG_NO_WRITE_USER_TRANSFORM # define PNG_NO_USER_MEM # define PNG_NO_READ_EMPTY_PLTE # define PNG_NO_MNG_FEATURES # define PNG_NO_FIXED_POINT_SUPPORTED #endif /* Ignore attempt to turn off both floating and fixed point support */ #if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ !defined(PNG_NO_FIXED_POINT_SUPPORTED) # define PNG_FIXED_POINT_SUPPORTED #endif #ifndef PNG_NO_FREE_ME # define PNG_FREE_ME_SUPPORTED #endif #if defined(PNG_READ_SUPPORTED) #if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_TRANSFORMS) # define PNG_READ_TRANSFORMS_SUPPORTED #endif #ifdef PNG_READ_TRANSFORMS_SUPPORTED # ifndef PNG_NO_READ_EXPAND # define PNG_READ_EXPAND_SUPPORTED # endif # ifndef PNG_NO_READ_SHIFT # define PNG_READ_SHIFT_SUPPORTED # endif # ifndef PNG_NO_READ_PACK # define PNG_READ_PACK_SUPPORTED # endif # ifndef PNG_NO_READ_BGR # define PNG_READ_BGR_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP # define PNG_READ_SWAP_SUPPORTED # endif # ifndef PNG_NO_READ_PACKSWAP # define PNG_READ_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT # define PNG_READ_INVERT_SUPPORTED # endif # ifndef PNG_NO_READ_DITHER # define PNG_READ_DITHER_SUPPORTED # endif # ifndef PNG_NO_READ_BACKGROUND # define PNG_READ_BACKGROUND_SUPPORTED # endif # ifndef PNG_NO_READ_16_TO_8 # define PNG_READ_16_TO_8_SUPPORTED # endif # ifndef PNG_NO_READ_FILLER # define PNG_READ_FILLER_SUPPORTED # endif # ifndef PNG_NO_READ_GAMMA # define PNG_READ_GAMMA_SUPPORTED # endif # ifndef PNG_NO_READ_GRAY_TO_RGB # define PNG_READ_GRAY_TO_RGB_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP_ALPHA # define PNG_READ_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT_ALPHA # define PNG_READ_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_STRIP_ALPHA # define PNG_READ_STRIP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_USER_TRANSFORM # define PNG_READ_USER_TRANSFORM_SUPPORTED # endif # ifndef PNG_NO_READ_RGB_TO_GRAY # define PNG_READ_RGB_TO_GRAY_SUPPORTED # endif #endif /* PNG_READ_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_PROGRESSIVE_READ) && \ !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ # define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ #endif /* about interlacing capability! You'll */ /* still have interlacing unless you change the following line: */ #define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ #ifndef PNG_NO_READ_COMPOSITE_NODIV # ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ # define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ # endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, will be removed from version 2.0.0. Use PNG_MNG_FEATURES_SUPPORTED instead. */ #ifndef PNG_NO_READ_EMPTY_PLTE # define PNG_READ_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_READ_SUPPORTED */ #if defined(PNG_WRITE_SUPPORTED) # if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_TRANSFORMS) # define PNG_WRITE_TRANSFORMS_SUPPORTED #endif #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED # ifndef PNG_NO_WRITE_SHIFT # define PNG_WRITE_SHIFT_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACK # define PNG_WRITE_PACK_SUPPORTED # endif # ifndef PNG_NO_WRITE_BGR # define PNG_WRITE_BGR_SUPPORTED # endif # ifndef PNG_NO_WRITE_SWAP # define PNG_WRITE_SWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACKSWAP # define PNG_WRITE_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT # define PNG_WRITE_INVERT_SUPPORTED # endif # ifndef PNG_NO_WRITE_FILLER # define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ # endif # ifndef PNG_NO_WRITE_SWAP_ALPHA # define PNG_WRITE_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT_ALPHA # define PNG_WRITE_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_USER_TRANSFORM # define PNG_WRITE_USER_TRANSFORM_SUPPORTED # endif #endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ !defined(PNG_WRITE_INTERLACING_SUPPORTED) #define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant encoders, but can cause trouble if left undefined */ #endif #if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ !defined(PNG_WRITE_WEIGHTED_FILTER) && \ defined(PNG_FLOATING_POINT_SUPPORTED) # define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED #endif #ifndef PNG_NO_WRITE_FLUSH # define PNG_WRITE_FLUSH_SUPPORTED #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ #ifndef PNG_NO_WRITE_EMPTY_PLTE # define PNG_WRITE_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_WRITE_SUPPORTED */ #ifndef PNG_1_0_X # ifndef PNG_NO_ERROR_NUMBERS # define PNG_ERROR_NUMBERS_SUPPORTED # endif #endif /* PNG_1_0_X */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) # ifndef PNG_NO_USER_TRANSFORM_PTR # define PNG_USER_TRANSFORM_PTR_SUPPORTED # endif #endif #ifndef PNG_NO_STDIO # define PNG_TIME_RFC1123_SUPPORTED #endif /* This adds extra functions in pngget.c for accessing data from the * info pointer (added in version 0.99) * png_get_image_width() * png_get_image_height() * png_get_bit_depth() * png_get_color_type() * png_get_compression_type() * png_get_filter_type() * png_get_interlace_type() * png_get_pixel_aspect_ratio() * png_get_pixels_per_meter() * png_get_x_offset_pixels() * png_get_y_offset_pixels() * png_get_x_offset_microns() * png_get_y_offset_microns() */ #if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) # define PNG_EASY_ACCESS_SUPPORTED #endif /* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 * and removed from version 1.2.20. The following will be removed * from libpng-1.4.0 */ #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) # ifndef PNG_OPTIMIZED_CODE_SUPPORTED # define PNG_OPTIMIZED_CODE_SUPPORTED # endif #endif #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) && defined(__i386__) # ifndef PNG_ASSEMBLER_CODE_SUPPORTED # define PNG_ASSEMBLER_CODE_SUPPORTED # endif # if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) /* work around 64-bit gcc compiler bugs in gcc-3.x */ # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if defined(__APPLE__) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_MMX_CODE_SUPPORTED # endif #endif /* end of obsolete code to be removed from libpng-1.4.0 */ #if !defined(PNG_1_0_X) #if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) # define PNG_USER_MEM_SUPPORTED #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.2.6 */ #if !defined(PNG_1_0_X) #ifndef PNG_SET_USER_LIMITS_SUPPORTED #if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) # define PNG_SET_USER_LIMITS_SUPPORTED #endif #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter * how large, set these limits to 0x7fffffffL */ #ifndef PNG_USER_WIDTH_MAX # define PNG_USER_WIDTH_MAX 1000000L #endif #ifndef PNG_USER_HEIGHT_MAX # define PNG_USER_HEIGHT_MAX 1000000L #endif /* Added at libpng-1.2.34 and 1.4.0 */ #ifndef PNG_STRING_NEWLINE #define PNG_STRING_NEWLINE "\n" #endif /* These are currently experimental features, define them if you want */ /* very little testing */ /* #ifdef PNG_READ_SUPPORTED # ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # endif #endif */ /* This is only for PowerPC big-endian and 680x0 systems */ /* some testing */ /* #ifndef PNG_READ_BIG_ENDIAN_SUPPORTED # define PNG_READ_BIG_ENDIAN_SUPPORTED #endif */ /* Buggy compilers (e.g., gcc 2.7.2.2) need this */ /* #define PNG_NO_POINTER_INDEXING */ /* These functions are turned off by default, as they will be phased out. */ /* #define PNG_USELESS_TESTS_SUPPORTED #define PNG_CORRECT_PALETTE_SUPPORTED */ /* Any chunks you are not interested in, you can undef here. The * ones that allocate memory may be expecially important (hIST, * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info * a bit smaller. */ #if defined(PNG_READ_SUPPORTED) && \ !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_ANCILLARY_CHUNKS) # define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #endif #if defined(PNG_WRITE_SUPPORTED) && \ !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) # define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #endif #ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_READ_TEXT # define PNG_NO_READ_iTXt # define PNG_NO_READ_tEXt # define PNG_NO_READ_zTXt #endif #ifndef PNG_NO_READ_bKGD # define PNG_READ_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED #endif #ifndef PNG_NO_READ_cHRM # define PNG_READ_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED #endif #ifndef PNG_NO_READ_gAMA # define PNG_READ_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED #endif #ifndef PNG_NO_READ_hIST # define PNG_READ_hIST_SUPPORTED # define PNG_hIST_SUPPORTED #endif #ifndef PNG_NO_READ_iCCP # define PNG_READ_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED #endif #ifndef PNG_NO_READ_iTXt # ifndef PNG_READ_iTXt_SUPPORTED # define PNG_READ_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_READ_oFFs # define PNG_READ_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED #endif #ifndef PNG_NO_READ_pCAL # define PNG_READ_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED #endif #ifndef PNG_NO_READ_sCAL # define PNG_READ_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED #endif #ifndef PNG_NO_READ_pHYs # define PNG_READ_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED #endif #ifndef PNG_NO_READ_sBIT # define PNG_READ_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED #endif #ifndef PNG_NO_READ_sPLT # define PNG_READ_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED #endif #ifndef PNG_NO_READ_sRGB # define PNG_READ_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED #endif #ifndef PNG_NO_READ_tEXt # define PNG_READ_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED #endif #ifndef PNG_NO_READ_tIME # define PNG_READ_tIME_SUPPORTED # define PNG_tIME_SUPPORTED #endif #ifndef PNG_NO_READ_tRNS # define PNG_READ_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED #endif #ifndef PNG_NO_READ_zTXt # define PNG_READ_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED #endif #ifndef PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif #endif #if !defined(PNG_NO_READ_USER_CHUNKS) && \ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) # define PNG_READ_USER_CHUNKS_SUPPORTED # define PNG_USER_CHUNKS_SUPPORTED # ifdef PNG_NO_READ_UNKNOWN_CHUNKS # undef PNG_NO_READ_UNKNOWN_CHUNKS # endif # ifdef PNG_NO_HANDLE_AS_UNKNOWN # undef PNG_NO_HANDLE_AS_UNKNOWN # endif #endif #ifndef PNG_NO_READ_OPT_PLTE # define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ #endif /* optional PLTE chunk in RGB and RGBA images */ #if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ defined(PNG_READ_zTXt_SUPPORTED) # define PNG_READ_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED #endif #endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ #ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_WRITE_TEXT # define PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_tEXt # define PNG_NO_WRITE_zTXt #endif #ifndef PNG_NO_WRITE_bKGD # define PNG_WRITE_bKGD_SUPPORTED # ifndef PNG_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_cHRM # define PNG_WRITE_cHRM_SUPPORTED # ifndef PNG_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_gAMA # define PNG_WRITE_gAMA_SUPPORTED # ifndef PNG_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_hIST # define PNG_WRITE_hIST_SUPPORTED # ifndef PNG_hIST_SUPPORTED # define PNG_hIST_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iCCP # define PNG_WRITE_iCCP_SUPPORTED # ifndef PNG_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iTXt # ifndef PNG_WRITE_iTXt_SUPPORTED # define PNG_WRITE_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_oFFs # define PNG_WRITE_oFFs_SUPPORTED # ifndef PNG_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pCAL # define PNG_WRITE_pCAL_SUPPORTED # ifndef PNG_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sCAL # define PNG_WRITE_sCAL_SUPPORTED # ifndef PNG_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pHYs # define PNG_WRITE_pHYs_SUPPORTED # ifndef PNG_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sBIT # define PNG_WRITE_sBIT_SUPPORTED # ifndef PNG_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sPLT # define PNG_WRITE_sPLT_SUPPORTED # ifndef PNG_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sRGB # define PNG_WRITE_sRGB_SUPPORTED # ifndef PNG_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tEXt # define PNG_WRITE_tEXt_SUPPORTED # ifndef PNG_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tIME # define PNG_WRITE_tIME_SUPPORTED # ifndef PNG_tIME_SUPPORTED # define PNG_tIME_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tRNS # define PNG_WRITE_tRNS_SUPPORTED # ifndef PNG_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_zTXt # define PNG_WRITE_zTXt_SUPPORTED # ifndef PNG_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif # endif #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ defined(PNG_WRITE_zTXt_SUPPORTED) # define PNG_WRITE_TEXT_SUPPORTED # ifndef PNG_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED # endif #endif #endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ /* Turn this off to disable png_read_png() and * png_write_png() and leave the row_pointers member * out of the info structure. */ #ifndef PNG_NO_INFO_IMAGE # define PNG_INFO_IMAGE_SUPPORTED #endif /* need the time information for reading tIME chunks */ #if defined(PNG_tIME_SUPPORTED) # if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ # include # endif #endif /* Some typedefs to get us started. These should be safe on most of the * common platforms. The typedefs should be at least as large as the * numbers suggest (a png_uint_32 must be at least 32 bits long), but they * don't have to be exactly that size. Some compilers dislike passing * unsigned shorts as function parameters, so you may be better off using * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may * want to have unsigned int for png_uint_32 instead of unsigned long. */ typedef unsigned long png_uint_32; typedef long png_int_32; typedef unsigned short png_uint_16; typedef short png_int_16; typedef unsigned char png_byte; /* This is usually size_t. It is typedef'ed just in case you need it to change (I'm not sure if you will or not, so I thought I'd be safe) */ #ifdef PNG_SIZE_T typedef PNG_SIZE_T png_size_t; # define png_sizeof(x) png_convert_size(sizeof(x)) #else typedef size_t png_size_t; # define png_sizeof(x) sizeof(x) #endif /* The following is needed for medium model support. It cannot be in the * PNG_INTERNAL section. Needs modification for other compilers besides * MSC. Model independent support declares all arrays and pointers to be * large using the far keyword. The zlib version used must also support * model independent data. As of version zlib 1.0.4, the necessary changes * have been made in zlib. The USE_FAR_KEYWORD define triggers other * changes that are needed. (Tim Wegner) */ /* Separate compiler dependencies (problem here is that zlib.h always defines FAR. (SJT) */ #ifdef __BORLANDC__ # if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) # define LDATA 1 # else # define LDATA 0 # endif /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ # if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) # define PNG_MAX_MALLOC_64K # if (LDATA != 1) # ifndef FAR # define FAR __far # endif # define USE_FAR_KEYWORD # endif /* LDATA != 1 */ /* Possibly useful for moving data out of default segment. * Uncomment it if you want. Could also define FARDATA as * const if your compiler supports it. (SJT) # define FARDATA FAR */ # endif /* __WIN32__, __FLAT__, __CYGWIN__ */ #endif /* __BORLANDC__ */ /* Suggest testing for specific compiler first before testing for * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, * making reliance oncertain keywords suspect. (SJT) */ /* MSC Medium model */ #if defined(FAR) # if defined(M_I86MM) # define USE_FAR_KEYWORD # define FARDATA FAR # include # endif #endif /* SJT: default case */ #ifndef FAR # define FAR #endif /* At this point FAR is always defined */ #ifndef FARDATA # define FARDATA #endif /* Typedef for floating-point numbers that are converted to fixed-point with a multiple of 100,000, e.g., int_gamma */ typedef png_int_32 png_fixed_point; /* Add typedefs for pointers */ typedef void FAR * png_voidp; typedef png_byte FAR * png_bytep; typedef png_uint_32 FAR * png_uint_32p; typedef png_int_32 FAR * png_int_32p; typedef png_uint_16 FAR * png_uint_16p; typedef png_int_16 FAR * png_int_16p; typedef PNG_CONST char FAR * png_const_charp; typedef char FAR * png_charp; typedef png_fixed_point FAR * png_fixed_point_p; #ifndef PNG_NO_STDIO #if defined(_WIN32_WCE) typedef HANDLE png_FILE_p; #else typedef FILE * png_FILE_p; #endif #endif #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * png_doublep; #endif /* Pointers to pointers; i.e. arrays */ typedef png_byte FAR * FAR * png_bytepp; typedef png_uint_32 FAR * FAR * png_uint_32pp; typedef png_int_32 FAR * FAR * png_int_32pp; typedef png_uint_16 FAR * FAR * png_uint_16pp; typedef png_int_16 FAR * FAR * png_int_16pp; typedef PNG_CONST char FAR * FAR * png_const_charpp; typedef char FAR * FAR * png_charpp; typedef png_fixed_point FAR * FAR * png_fixed_point_pp; #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * FAR * png_doublepp; #endif /* Pointers to pointers to pointers; i.e., pointer to array */ typedef char FAR * FAR * FAR * png_charppp; #if defined(PNG_1_0_X) || defined(PNG_1_2_X) /* SPC - Is this stuff deprecated? */ /* It'll be removed as of libpng-1.3.0 - GR-P */ /* libpng typedefs for types in zlib. If zlib changes * or another compression library is used, then change these. * Eliminates need to change all the source files. */ typedef charf * png_zcharp; typedef charf * FAR * png_zcharpp; typedef z_stream FAR * png_zstreamp; #endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ /* * Define PNG_BUILD_DLL if the module being built is a Windows * LIBPNG DLL. * * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. * It is equivalent to Microsoft predefined macro _DLL that is * automatically defined when you compile using the share * version of the CRT (C Run-Time library) * * The cygwin mods make this behavior a little different: * Define PNG_BUILD_DLL if you are building a dll for use with cygwin * Define PNG_STATIC if you are building a static library for use with cygwin, * -or- if you are building an application that you want to link to the * static library. * PNG_USE_DLL is defined by default (no user action needed) unless one of * the other flags is defined. */ #if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) # define PNG_DLL #endif /* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. * When building a static lib, default to no GLOBAL ARRAYS, but allow * command-line override */ #if defined(__CYGWIN__) # if !defined(PNG_STATIC) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # if !defined(PNG_USE_LOCAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif # else # if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # endif # endif # if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif #endif /* Do not use global arrays (helps with building DLL's) * They are no longer used in libpng itself, since version 1.0.5c, * but might be required for some pre-1.0.5c applications. */ #if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # if defined(PNG_NO_GLOBAL_ARRAYS) || \ (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) # define PNG_USE_LOCAL_ARRAYS # else # define PNG_USE_GLOBAL_ARRAYS # endif #endif #if defined(__CYGWIN__) # undef PNGAPI # define PNGAPI __cdecl # undef PNG_IMPEXP # define PNG_IMPEXP #endif /* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", * you may get warnings regarding the linkage of png_zalloc and png_zfree. * Don't ignore those warnings; you must also reset the default calling * convention in your compiler to match your PNGAPI, and you must build * zlib and your applications the same way you build libpng. */ #if defined(__MINGW32__) && !defined(PNG_MODULEDEF) # ifndef PNG_NO_MODULEDEF # define PNG_NO_MODULEDEF # endif #endif #if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) # define PNG_IMPEXP #endif #if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ (( defined(_Windows) || defined(_WINDOWS) || \ defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) # ifndef PNGAPI # if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) # define PNGAPI __cdecl # else # define PNGAPI _cdecl # endif # endif # if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) # define PNG_IMPEXP # endif # if !defined(PNG_IMPEXP) # define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol # define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol /* Borland/Microsoft */ # if defined(_MSC_VER) || defined(__BORLANDC__) # if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) # define PNG_EXPORT PNG_EXPORT_TYPE1 # else # define PNG_EXPORT PNG_EXPORT_TYPE2 # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __export # else # define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in VC++ */ # endif /* Exists in Borland C++ for C++ classes (== huge) */ # endif # endif # if !defined(PNG_IMPEXP) # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __declspec(dllexport) # else # define PNG_IMPEXP __declspec(dllimport) # endif # endif # endif /* PNG_IMPEXP */ #else /* !(DLL || non-cygwin WINDOWS) */ # if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) # ifndef PNGAPI # define PNGAPI _System # endif # else # if 0 /* ... other platforms, with other meanings */ # endif # endif #endif #ifndef PNGAPI # define PNGAPI #endif #ifndef PNG_IMPEXP # define PNG_IMPEXP #endif #ifdef PNG_BUILDSYMS # ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END # endif # ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT # endif # endif #endif #ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol #endif #ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type # endif #endif /* User may want to use these so they are not in PNG_INTERNAL. Any library * functions that are passed far data must be model independent. */ #ifndef PNG_ABORT # define PNG_ABORT() abort() #endif #ifdef PNG_SETJMP_SUPPORTED # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #else # define png_jmpbuf(png_ptr) \ (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) #endif #if defined(USE_FAR_KEYWORD) /* memory model independent fns */ /* use this to make far-to-near assignments */ # define CHECK 1 # define NOCHECK 0 # define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) # define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) # define png_snprintf _fsnprintf /* Added to v 1.2.19 */ # define png_strlen _fstrlen # define png_memcmp _fmemcmp /* SJT: added */ # define png_memcpy _fmemcpy # define png_memset _fmemset #else /* use the usual functions */ # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # ifndef PNG_NO_SNPRINTF # ifdef _MSC_VER # define png_snprintf _snprintf /* Added to v 1.2.19 */ # define png_snprintf2 _snprintf # define png_snprintf6 _snprintf # else # define png_snprintf snprintf /* Added to v 1.2.19 */ # define png_snprintf2 snprintf # define png_snprintf6 snprintf # endif # else /* You don't have or don't want to use snprintf(). Caution: Using * sprintf instead of snprintf exposes your application to accidental * or malevolent buffer overflows. If you don't have snprintf() * as a general rule you should provide one (you can get one from * Portable OpenSSH). */ # define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) # define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) # define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) # endif # define png_strlen strlen # define png_memcmp memcmp /* SJT: added */ # define png_memcpy memcpy # define png_memset memset #endif /* End of memory model independent support */ /* Just a little check that someone hasn't tried to define something * contradictory. */ #if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) # undef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 65536L #endif /* Added at libpng-1.2.8 */ #endif /* PNG_VERSION_INFO_ONLY */ #endif /* PNGCONF_H */ angband-v3.3.2/src/win/include/zlib.h0000644000175000017500000020121411651552410016727 0ustar chriscchrisc/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.3, July 18th, 2005 Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.3" #define ZLIB_VERNUM 0x1230 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumualte before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early because Z_BLOCK is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() will decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically. Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(). This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called immediately after inflateInit2() or inflateReset() and before any call of inflate() to set the dictionary. The application must insure that the dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the paramaters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). The number of uncompressed bytes written is limited to 4095. The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read again later. Only one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if a character has been pushed but not read yet, or if c is -1. The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns 1 if file is being read directly without decompression, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); /* Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is NULL, this function returns the required initial value for the for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ angband-v3.3.2/src/win/include/zconf.h0000644000175000017500000002251011651552410017106 0ustar chriscchrisc/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define deflatePrime z_deflatePrime # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define zError z_zError # define alloc_func z_alloc_func # define free_func z_free_func # define in_func z_in_func # define out_func z_out_func # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 1 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ angband-v3.3.2/src/win/include/png.h0000644000175000017500000045435711651552410016575 0ustar chriscchrisc/* png.h - header file for PNG reference library * * libpng version 1.2.37 - June 4, 2009 * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.2.37 - June 4, 2009: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: * * Due to various miscommunications, unforeseen code incompatibilities * and occasional factors outside the authors' control, version numbering * on the library has not always been consistent and straightforward. * The following table summarizes matters since version 0.89c, which was * the first widely used release: * * source png.h png.h shared-lib * version string int version * ------- ------ ----- ---------- * 0.89c "1.0 beta 3" 0.89 89 1.0.89 * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] * 0.97c 0.97 97 2.0.97 * 0.98 0.98 98 2.0.98 * 0.99 0.99 98 2.0.99 * 0.99a-m 0.99 99 2.0.99 * 1.00 1.00 100 2.1.0 [100 should be 10000] * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] * 1.0.1 png.h string is 10001 2.1.0 * 1.0.1a-e identical to the 10002 from here on, the shared library * 1.0.2 source version) 10002 is 2.V where V is the source code * 1.0.2a-b 10003 version, except as noted. * 1.0.3 10003 * 1.0.3a-d 10004 * 1.0.4 10004 * 1.0.4a-f 10005 * 1.0.5 (+ 2 patches) 10005 * 1.0.5a-d 10006 * 1.0.5e-r 10100 (not source compatible) * 1.0.5s-v 10006 (not binary compatible) * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) * 1.0.6d-f 10007 (still binary incompatible) * 1.0.6g 10007 * 1.0.6h 10007 10.6h (testing xy.z so-numbering) * 1.0.6i 10007 10.6i * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) * 1.0.7 1 10007 (still compatible) * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 * 1.0.8rc1 1 10008 2.1.0.8rc1 * 1.0.8 1 10008 2.1.0.8 * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 * 1.0.9rc1 1 10009 2.1.0.9rc1 * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 * 1.0.9rc2 1 10009 2.1.0.9rc2 * 1.0.9 1 10009 2.1.0.9 * 1.0.10beta1 1 10010 2.1.0.10beta1 * 1.0.10rc1 1 10010 2.1.0.10rc1 * 1.0.10 1 10010 2.1.0.10 * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 * 1.0.11rc1 1 10011 2.1.0.11rc1 * 1.0.11 1 10011 2.1.0.11 * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 * 1.0.12rc1 2 10012 2.1.0.12rc1 * 1.0.12 2 10012 2.1.0.12 * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 * 1.2.0rc1 3 10200 3.1.2.0rc1 * 1.2.0 3 10200 3.1.2.0 * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 * 1.2.1 3 10201 3.1.2.1 * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 * 1.0.13 10 10013 10.so.0.1.0.13 * 1.2.2 12 10202 12.so.0.1.2.2 * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 * 1.2.3 12 10203 12.so.0.1.2.3 * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 * 1.0.14 10 10014 10.so.0.1.0.14 * 1.2.4 13 10204 12.so.0.1.2.4 * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 * 1.0.15 10 10015 10.so.0.1.0.15 * 1.2.5 13 10205 12.so.0.1.2.5 * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 * 1.0.16 10 10016 10.so.0.1.0.16 * 1.2.6 13 10206 12.so.0.1.2.6 * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 * 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 * 1.0.17 10 10017 10.so.0.1.0.17 * 1.2.7 13 10207 12.so.0.1.2.7 * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 * 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 * 1.0.18 10 10018 10.so.0.1.0.18 * 1.2.8 13 10208 12.so.0.1.2.8 * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 * 1.2.9beta4-11 13 10209 12.so.0.9[.0] * 1.2.9rc1 13 10209 12.so.0.9[.0] * 1.2.9 13 10209 12.so.0.9[.0] * 1.2.10beta1-8 13 10210 12.so.0.10[.0] * 1.2.10rc1-3 13 10210 12.so.0.10[.0] * 1.2.10 13 10210 12.so.0.10[.0] * 1.2.11beta1-4 13 10211 12.so.0.11[.0] * 1.0.19rc1-5 10 10019 10.so.0.19[.0] * 1.2.11rc1-5 13 10211 12.so.0.11[.0] * 1.0.19 10 10019 10.so.0.19[.0] * 1.2.11 13 10211 12.so.0.11[.0] * 1.0.20 10 10020 10.so.0.20[.0] * 1.2.12 13 10212 12.so.0.12[.0] * 1.2.13beta1 13 10213 12.so.0.13[.0] * 1.0.21 10 10021 10.so.0.21[.0] * 1.2.13 13 10213 12.so.0.13[.0] * 1.2.14beta1-2 13 10214 12.so.0.14[.0] * 1.0.22rc1 10 10022 10.so.0.22[.0] * 1.2.14rc1 13 10214 12.so.0.14[.0] * 1.0.22 10 10022 10.so.0.22[.0] * 1.2.14 13 10214 12.so.0.14[.0] * 1.2.15beta1-6 13 10215 12.so.0.15[.0] * 1.0.23rc1-5 10 10023 10.so.0.23[.0] * 1.2.15rc1-5 13 10215 12.so.0.15[.0] * 1.0.23 10 10023 10.so.0.23[.0] * 1.2.15 13 10215 12.so.0.15[.0] * 1.2.16beta1-2 13 10216 12.so.0.16[.0] * 1.2.16rc1 13 10216 12.so.0.16[.0] * 1.0.24 10 10024 10.so.0.24[.0] * 1.2.16 13 10216 12.so.0.16[.0] * 1.2.17beta1-2 13 10217 12.so.0.17[.0] * 1.0.25rc1 10 10025 10.so.0.25[.0] * 1.2.17rc1-3 13 10217 12.so.0.17[.0] * 1.0.25 10 10025 10.so.0.25[.0] * 1.2.17 13 10217 12.so.0.17[.0] * 1.0.26 10 10026 10.so.0.26[.0] * 1.2.18 13 10218 12.so.0.18[.0] * 1.2.19beta1-31 13 10219 12.so.0.19[.0] * 1.0.27rc1-6 10 10027 10.so.0.27[.0] * 1.2.19rc1-6 13 10219 12.so.0.19[.0] * 1.0.27 10 10027 10.so.0.27[.0] * 1.2.19 13 10219 12.so.0.19[.0] * 1.2.20beta01-04 13 10220 12.so.0.20[.0] * 1.0.28rc1-6 10 10028 10.so.0.28[.0] * 1.2.20rc1-6 13 10220 12.so.0.20[.0] * 1.0.28 10 10028 10.so.0.28[.0] * 1.2.20 13 10220 12.so.0.20[.0] * 1.2.21beta1-2 13 10221 12.so.0.21[.0] * 1.2.21rc1-3 13 10221 12.so.0.21[.0] * 1.0.29 10 10029 10.so.0.29[.0] * 1.2.21 13 10221 12.so.0.21[.0] * 1.2.22beta1-4 13 10222 12.so.0.22[.0] * 1.0.30rc1 10 10030 10.so.0.30[.0] * 1.2.22rc1 13 10222 12.so.0.22[.0] * 1.0.30 10 10030 10.so.0.30[.0] * 1.2.22 13 10222 12.so.0.22[.0] * 1.2.23beta01-05 13 10223 12.so.0.23[.0] * 1.2.23rc01 13 10223 12.so.0.23[.0] * 1.2.23 13 10223 12.so.0.23[.0] * 1.2.24beta01-02 13 10224 12.so.0.24[.0] * 1.2.24rc01 13 10224 12.so.0.24[.0] * 1.2.24 13 10224 12.so.0.24[.0] * 1.2.25beta01-06 13 10225 12.so.0.25[.0] * 1.2.25rc01-02 13 10225 12.so.0.25[.0] * 1.0.31 10 10031 10.so.0.31[.0] * 1.2.25 13 10225 12.so.0.25[.0] * 1.2.26beta01-06 13 10226 12.so.0.26[.0] * 1.2.26rc01 13 10226 12.so.0.26[.0] * 1.2.26 13 10226 12.so.0.26[.0] * 1.0.32 10 10032 10.so.0.32[.0] * 1.2.27beta01-06 13 10227 12.so.0.27[.0] * 1.2.27rc01 13 10227 12.so.0.27[.0] * 1.0.33 10 10033 10.so.0.33[.0] * 1.2.27 13 10227 12.so.0.27[.0] * 1.0.34 10 10034 10.so.0.34[.0] * 1.2.28 13 10228 12.so.0.28[.0] * 1.2.29beta01-03 13 10229 12.so.0.29[.0] * 1.2.29rc01 13 10229 12.so.0.29[.0] * 1.0.35 10 10035 10.so.0.35[.0] * 1.2.29 13 10229 12.so.0.29[.0] * 1.0.37 10 10037 10.so.0.37[.0] * 1.2.30beta01-04 13 10230 12.so.0.30[.0] * 1.0.38rc01-08 10 10038 10.so.0.38[.0] * 1.2.30rc01-08 13 10230 12.so.0.30[.0] * 1.0.38 10 10038 10.so.0.38[.0] * 1.2.30 13 10230 12.so.0.30[.0] * 1.0.39rc01-03 10 10039 10.so.0.39[.0] * 1.2.31rc01-03 13 10231 12.so.0.31[.0] * 1.0.39 10 10039 10.so.0.39[.0] * 1.2.31 13 10231 12.so.0.31[.0] * 1.2.32beta01-02 13 10232 12.so.0.32[.0] * 1.0.40rc01 10 10040 10.so.0.40[.0] * 1.2.32rc01 13 10232 12.so.0.32[.0] * 1.0.40 10 10040 10.so.0.40[.0] * 1.2.32 13 10232 12.so.0.32[.0] * 1.2.33beta01-02 13 10233 12.so.0.33[.0] * 1.2.33rc01-02 13 10233 12.so.0.33[.0] * 1.0.41rc01 10 10041 10.so.0.41[.0] * 1.2.33 13 10233 12.so.0.33[.0] * 1.0.41 10 10041 10.so.0.41[.0] * 1.2.34beta01-07 13 10234 12.so.0.34[.0] * 1.0.42rc01 10 10042 10.so.0.42[.0] * 1.2.34rc01 13 10234 12.so.0.34[.0] * 1.0.42 10 10042 10.so.0.42[.0] * 1.2.34 13 10234 12.so.0.34[.0] * 1.2.35beta01-03 13 10235 12.so.0.35[.0] * 1.0.43rc01-02 10 10043 10.so.0.43[.0] * 1.2.35rc01-02 13 10235 12.so.0.35[.0] * 1.0.43 10 10043 10.so.0.43[.0] * 1.2.35 13 10235 12.so.0.35[.0] * 1.2.36beta01-05 13 10236 12.so.0.36[.0] * 1.2.36rc01 13 10236 12.so.0.36[.0] * 1.0.44 10 10044 10.so.0.44[.0] * 1.2.36 13 10236 12.so.0.36[.0] * 1.2.37beta01-03 13 10237 12.so.0.37[.0] * 1.2.37rc01 13 10237 12.so.0.37[.0] * 1.2.37 13 10237 12.so.0.37[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be * used for changes in backward compatibility, as it is intended. The * PNG_LIBPNG_VER macro, which is not used within libpng but is available * for applications, is an unsigned integer of the form xyyzz corresponding * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public * release number plus "betaNN" or "rcNN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled * application is loaded with a different version of the library. * * DLLNUM will change each time there are forward or backward changes * in binary compatibility (e.g., when a new feature is added). * * See libpng.txt or libpng.3 for more information. The PNG specification * is available as a W3C Recommendation and as an ISO Specification, * defines should NOT be changed. */ #define PNG_INFO_gAMA 0x0001 #define PNG_INFO_sBIT 0x0002 #define PNG_INFO_cHRM 0x0004 #define PNG_INFO_PLTE 0x0008 #define PNG_INFO_tRNS 0x0010 #define PNG_INFO_bKGD 0x0020 #define PNG_INFO_hIST 0x0040 #define PNG_INFO_pHYs 0x0080 #define PNG_INFO_oFFs 0x0100 #define PNG_INFO_tIME 0x0200 #define PNG_INFO_pCAL 0x0400 #define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ #define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ #define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ #define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using * the routines for other purposes. */ typedef struct png_row_info_struct { png_uint_32 width; /* width of row */ png_uint_32 rowbytes; /* number of bytes in row */ png_byte color_type; /* color type of row */ png_byte bit_depth; /* bit depth of row */ png_byte channels; /* number of channels (1, 2, 3, or 4) */ png_byte pixel_depth; /* bits per pixel (depth * channels) */ } png_row_info; typedef png_row_info FAR * png_row_infop; typedef png_row_info FAR * FAR * png_row_infopp; /* These are the function types for the I/O functions and for the functions * that allow the user to override the default I/O functions with his or her * own. The png_error_ptr type should match that of user-supplied warning * and error functions, while the png_rw_ptr type should match that of the * user read/write data functions. */ typedef struct png_struct_def png_struct; typedef png_struct FAR * png_structp; typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, int)); typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, int)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, png_uint_32, int)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, png_row_infop, png_bytep)); #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); #endif /* Transform masks for the high-level interface */ #define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ #define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ #define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ #define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ #define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ #define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ #define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ #define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ #define PNG_TRANSFORM_BGR 0x0080 /* read and write */ #define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ #define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ #define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ #define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only, deprecated */ /* Added to libpng-1.2.34 */ #define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* WRITE only */ #define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* WRITE only */ /* Flags for MNG supported features */ #define PNG_FLAG_MNG_EMPTY_PLTE 0x01 #define PNG_FLAG_MNG_FILTER_64 0x04 #define PNG_ALL_MNG_FEATURES 0x05 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); /* The structure that holds the information to read and write PNG files. * The only people who need to care about what is inside of this are the * people who will be modifying the library for their own special needs. * It should NOT be accessed directly by an application, except to store * the jmp_buf. */ struct png_struct_def { #ifdef PNG_SETJMP_SUPPORTED jmp_buf jmpbuf; /* used in png_error */ #endif png_error_ptr error_fn; /* function for printing errors and aborting */ png_error_ptr warning_fn; /* function for printing warnings */ png_voidp error_ptr; /* user supplied struct for error functions */ png_rw_ptr write_data_fn; /* function for writing output data */ png_rw_ptr read_data_fn; /* function for reading input data */ png_voidp io_ptr; /* ptr to application struct for I/O functions */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr read_user_transform_fn; /* user read transform */ #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr write_user_transform_fn; /* user write transform */ #endif /* These were added in libpng-1.0.2 */ #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_voidp user_transform_ptr; /* user supplied struct for user transform */ png_byte user_transform_depth; /* bit depth of user transformed pixels */ png_byte user_transform_channels; /* channels in user transformed pixels */ #endif #endif png_uint_32 mode; /* tells us where we are in the PNG file */ png_uint_32 flags; /* flags indicating various things to libpng */ png_uint_32 transformations; /* which transformations to perform */ z_stream zstream; /* pointer to decompression structure (below) */ png_bytep zbuf; /* buffer for zlib */ png_size_t zbuf_size; /* size of zbuf */ int zlib_level; /* holds zlib compression level */ int zlib_method; /* holds zlib compression method */ int zlib_window_bits; /* holds zlib compression window bits */ int zlib_mem_level; /* holds zlib compression memory level */ int zlib_strategy; /* holds zlib compression strategy */ png_uint_32 width; /* width of image in pixels */ png_uint_32 height; /* height of image in pixels */ png_uint_32 num_rows; /* number of rows in current pass */ png_uint_32 usr_width; /* width of row at start of write */ png_uint_32 rowbytes; /* size of row in bytes */ png_uint_32 irowbytes; /* size of current interlaced row in bytes */ png_uint_32 iwidth; /* width of current interlaced row in pixels */ png_uint_32 row_number; /* current row in interlace pass */ png_bytep prev_row; /* buffer to save previous (unfiltered) row */ png_bytep row_buf; /* buffer to save current (unfiltered) row */ #ifndef PNG_NO_WRITE_FILTER png_bytep sub_row; /* buffer to save "sub" row when filtering */ png_bytep up_row; /* buffer to save "up" row when filtering */ png_bytep avg_row; /* buffer to save "avg" row when filtering */ png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ #endif png_row_info row_info; /* used for transformation routines */ png_uint_32 idat_size; /* current IDAT size for read */ png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ png_uint_16 num_trans; /* number of transparency values */ png_byte chunk_name[5]; /* null-terminated name of current chunk */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ png_byte pass; /* current interlace pass (0 - 6) */ png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ png_byte color_type; /* color type of file */ png_byte bit_depth; /* bit depth of file */ png_byte usr_bit_depth; /* bit depth of users row */ png_byte pixel_depth; /* number of bits per pixel */ png_byte channels; /* number of channels in file */ png_byte usr_channels; /* channels at start of write */ png_byte sig_bytes; /* magic bytes read/written from start of file */ #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) #ifdef PNG_LEGACY_SUPPORTED png_byte filler; /* filler byte for pixel expansion */ #else png_uint_16 filler; /* filler bytes for pixel expansion */ #endif #endif #if defined(PNG_bKGD_SUPPORTED) png_byte background_gamma_type; # ifdef PNG_FLOATING_POINT_SUPPORTED float background_gamma; # endif png_color_16 background; /* background color in screen gamma space */ #if defined(PNG_READ_GAMMA_SUPPORTED) png_color_16 background_1; /* background normalized to gamma 1.0 */ #endif #endif /* PNG_bKGD_SUPPORTED */ #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_flush_ptr output_flush_fn;/* Function for flushing output */ png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ png_uint_32 flush_rows; /* number of rows written since last flush */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ #ifdef PNG_FLOATING_POINT_SUPPORTED float gamma; /* file gamma value */ float screen_gamma; /* screen gamma value (display_exponent) */ #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep gamma_table; /* gamma table for 8-bit depth files */ png_bytep gamma_from_1; /* converts from 1.0 to screen */ png_bytep gamma_to_1; /* converts from file to 1.0 */ png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) png_color_8 sig_bit; /* significant bits in each available channel */ #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) png_color_8 shift; /* shift for significant bit tranformation */ #endif #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep trans; /* transparency values for paletted files */ png_color_16 trans_values; /* transparency values for non-paletted files */ #endif png_read_status_ptr read_row_fn; /* called after each row is decoded */ png_write_status_ptr write_row_fn; /* called after each row is encoded */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_progressive_info_ptr info_fn; /* called after header data fully read */ png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ png_progressive_end_ptr end_fn; /* called after image is complete */ png_bytep save_buffer_ptr; /* current location in save_buffer */ png_bytep save_buffer; /* buffer for previously read data */ png_bytep current_buffer_ptr; /* current location in current_buffer */ png_bytep current_buffer; /* buffer for recently used data */ png_uint_32 push_length; /* size of current input chunk */ png_uint_32 skip_length; /* bytes to skip in input data */ png_size_t save_buffer_size; /* amount of data now in save_buffer */ png_size_t save_buffer_max; /* total size of save_buffer */ png_size_t buffer_size; /* total amount of available input data */ png_size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ # if defined(PNG_TEXT_SUPPORTED) png_size_t current_text_size; /* current size of text input data */ png_size_t current_text_left; /* how much text left to read in input */ png_charp current_text; /* current text chunk buffer */ png_charp current_text_ptr; /* current location in current_text */ # endif /* PNG_TEXT_SUPPORTED */ #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* for the Borland special 64K segment handler */ png_bytepp offset_table_ptr; png_bytep offset_table; png_uint_16 offset_table_number; png_uint_16 offset_table_count; png_uint_16 offset_table_count_free; #endif #if defined(PNG_READ_DITHER_SUPPORTED) png_bytep palette_lookup; /* lookup table for dithering */ png_bytep dither_index; /* index translation for palette files */ #endif #if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) png_uint_16p hist; /* histogram */ #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_byte heuristic_method; /* heuristic for row filter selection */ png_byte num_prev_filters; /* number of weights for previous rows */ png_bytep prev_filters; /* filter type(s) of previous row(s) */ png_uint_16p filter_weights; /* weight(s) for previous line(s) */ png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ png_uint_16p filter_costs; /* relative filter calculation cost */ png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) png_charp time_buffer; /* String to hold RFC 1123 time text */ #endif /* New members added in libpng-1.0.6 */ #ifdef PNG_FREE_ME_SUPPORTED png_uint_32 free_me; /* flags items libpng is responsible for freeing */ #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) png_voidp user_chunk_ptr; png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) int num_chunk_list; png_bytep chunk_list; #endif /* New members added in libpng-1.0.3 */ #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) png_byte rgb_to_gray_status; /* These were changed from png_byte in libpng-1.0.6 */ png_uint_16 rgb_to_gray_red_coeff; png_uint_16 rgb_to_gray_green_coeff; png_uint_16 rgb_to_gray_blue_coeff; #endif /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ #if defined(PNG_MNG_FEATURES_SUPPORTED) || \ defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* changed from png_byte to png_uint_32 at version 1.2.0 */ #ifdef PNG_1_0_X png_byte mng_features_permitted; #else png_uint_32 mng_features_permitted; #endif /* PNG_1_0_X */ #endif /* New member added in libpng-1.0.7 */ #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_fixed_point int_gamma; #endif /* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ #if defined(PNG_MNG_FEATURES_SUPPORTED) png_byte filter_type; #endif #if defined(PNG_1_0_X) /* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ png_uint_32 row_buf_size; #endif /* New members added in libpng-1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) # if !defined(PNG_1_0_X) # if defined(PNG_MMX_CODE_SUPPORTED) png_byte mmx_bitdepth_threshold; png_uint_32 mmx_rowbytes_threshold; # endif png_uint_32 asm_flags; # endif #endif /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ #ifdef PNG_USER_MEM_SUPPORTED png_voidp mem_ptr; /* user supplied struct for mem functions */ png_malloc_ptr malloc_fn; /* function for allocating memory */ png_free_ptr free_fn; /* function for freeing memory */ #endif /* New member added in libpng-1.0.13 and 1.2.0 */ png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ #if defined(PNG_READ_DITHER_SUPPORTED) /* The following three members were added at version 1.0.14 and 1.2.4 */ png_bytep dither_sort; /* working sort array */ png_bytep index_to_palette; /* where the original index currently is */ /* in the palette */ png_bytep palette_to_index; /* which original index points to this */ /* palette color */ #endif /* New members added in libpng-1.0.16 and 1.2.6 */ png_byte compression_type; #ifdef PNG_SET_USER_LIMITS_SUPPORTED png_uint_32 user_width_max; png_uint_32 user_height_max; #endif /* New member added in libpng-1.0.25 and 1.2.17 */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* storage for unknown chunk that the library doesn't recognize. */ png_unknown_chunk unknown_chunk; #endif /* New members added in libpng-1.2.26 */ png_uint_32 old_big_row_buf_size, old_prev_row_size; /* New member added in libpng-1.2.30 */ png_charp chunkdata; /* buffer for reading chunk data */ }; /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ typedef png_structp version_1_2_37; typedef png_struct FAR * FAR * png_structpp; /* Here are the function definitions most commonly used. This is not * the place to find out how to use libpng. See libpng.txt for the * full explanation, see example.c for the summary. This just provides * a simple one line description of the use of each function. */ /* Returns the version number of the library */ extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); /* Tell lib we have already handled the first magic bytes. * Handling more than 8 bytes from the beginning of the file is an error. */ extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, int num_bytes)); /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a * PNG file. Returns zero if the supplied bytes match the 8-byte PNG * signature, and non-zero otherwise. Having num_to_check == 0 or * start > 7 will always fail (ie return non-zero). */ extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, png_size_t num_to_check)); /* Simple signature checking function. This is the same as calling * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). */ extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); /* Allocate and initialize png_ptr struct for reading, and any other memory. */ extern PNG_EXPORT(png_structp,png_create_read_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); /* Allocate and initialize png_ptr struct for writing, and any other memory */ extern PNG_EXPORT(png_structp,png_create_write_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(void,png_set_compression_buffer_size) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* Reset the compression stream */ extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_structp,png_create_read_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); extern PNG_EXPORT(png_structp,png_create_write_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); #endif /* Write a PNG chunk - size, type, (optional) data, CRC. */ extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length)); /* Write the start of a PNG chunk - length and chunk name. */ extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_uint_32 length)); /* Write the data of a PNG chunk started with png_write_chunk_start(). */ extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Finish a chunk started with png_write_chunk_start() (includes CRC). */ extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); /* Allocate and initialize the info structure */ extern PNG_EXPORT(png_infop,png_create_info_struct) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize the info structure (old interface - DEPRECATED) */ extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); #undef png_info_init #define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ png_sizeof(png_info)); #endif extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, png_size_t png_info_struct_size)); /* Writes all the PNG information before the image. */ extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the information before the actual image data. */ extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) PNGARG((png_structp png_ptr, png_timep ptime)); #endif #if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ #if defined(PNG_WRITE_tIME_SUPPORTED) /* convert from a struct tm to png_time */ extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, struct tm FAR * ttime)); /* convert from time_t to png_time. Uses gmtime() */ extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, time_t ttime)); #endif /* PNG_WRITE_tIME_SUPPORTED */ #endif /* _WIN32_WCE */ #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated */ extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* Use blue, green, red order for pixels. */ extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* Expand the grayscale to 24-bit RGB if necessary. */ extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) /* Reduce RGB to grayscale. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, int error_action, double red, double green )); #endif extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, int error_action, png_fixed_point red, png_fixed_point green )); extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, png_colorp palette)); #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) /* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); /* The values of the PNG_FILLER_ defines should NOT be changed */ #define PNG_FILLER_BEFORE 0 #define PNG_FILLER_AFTER 1 /* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); #endif #endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swap bytes in 16-bit depth files. */ extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* Swap packing order of pixels in bytes. */ extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) /* Converts files to legal bit depths. */ extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, png_color_8p true_bits)); #endif #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) /* Have the code handle the interlacing. Returns the number of passes. */ extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) /* Invert monochrome files */ extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) /* Handle alpha and tRNS by replacing with a background color. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, png_color_16p background_color, int background_gamma_code, int need_expand, double background_gamma)); #endif #define PNG_BACKGROUND_GAMMA_UNKNOWN 0 #define PNG_BACKGROUND_GAMMA_SCREEN 1 #define PNG_BACKGROUND_GAMMA_FILE 2 #define PNG_BACKGROUND_GAMMA_UNIQUE 3 #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) /* strip the second byte of information from a 16-bit depth file. */ extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) /* Turn on dithering, and reduce the palette to the number of colors available. */ extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, png_colorp palette, int num_palette, int maximum_colors, png_uint_16p histogram, int full_dither)); #endif #if defined(PNG_READ_GAMMA_SUPPORTED) /* Handle gamma correction. Screen_gamma=(display_exponent) */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, double screen_gamma, double default_file_gamma)); #endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ /* Deprecated and will be removed. Use png_permit_mng_features() instead. */ extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, int empty_plte_permitted)); #endif #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) /* Set how many lines between output flushes - 0 for no flushing */ extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); /* Flush the current PNG output buffer */ extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); #endif /* optional update palette with requested transformations */ extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read one or more rows of image data. */ extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read a row of data. */ extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, png_bytep row, png_bytep display_row)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the whole image into memory at once. */ extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, png_bytepp image)); #endif /* write a row of image data */ extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, png_bytep row)); /* write a few rows of image data */ extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_uint_32 num_rows)); /* write the image data */ extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, png_bytepp image)); /* writes the end of the PNG file. */ extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the end of the PNG file. */ extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* free any memory associated with the png_info_struct */ extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, png_infopp info_ptr_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); /* free all memory used by the read (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_read_destroy) PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_write_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); /* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_write_destroy) PNGARG((png_structp png_ptr)); /* set the libpng method of handling chunk CRC errors */ extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, int crit_action, int ancil_action)); /* Values for png_set_crc_action() to say how to handle CRC errors in * ancillary and critical chunks, and whether to use the data contained * therein. Note that it is impossible to "discard" data in a critical * chunk. For versions prior to 0.90, the action was always error/quit, * whereas in version 0.90 and later, the action for CRC errors in ancillary * chunks is warn/discard. These values should NOT be changed. * * value action:critical action:ancillary */ #define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ #define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ #define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ #define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ #define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ #define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ /* These functions give the user control over the scan-line filtering in * libpng and the compression methods used by zlib. These functions are * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library * header file (zlib.h) for an explination of the compression functions. */ /* set the filtering method(s) used by libpng. Currently, the only valid * value for "method" is 0. */ extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, int filters)); /* Flags for png_set_filter() to say which filters to use. The flags * are chosen so that they don't conflict with real filter types * below, in case they are supplied instead of the #defined constants. * These values should NOT be changed. */ #define PNG_NO_FILTERS 0x00 #define PNG_FILTER_NONE 0x08 #define PNG_FILTER_SUB 0x10 #define PNG_FILTER_UP 0x20 #define PNG_FILTER_AVG 0x40 #define PNG_FILTER_PAETH 0x80 #define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ PNG_FILTER_AVG | PNG_FILTER_PAETH) /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. * These defines should NOT be changed. */ #define PNG_FILTER_VALUE_NONE 0 #define PNG_FILTER_VALUE_SUB 1 #define PNG_FILTER_VALUE_UP 2 #define PNG_FILTER_VALUE_AVG 3 #define PNG_FILTER_VALUE_PAETH 4 #define PNG_FILTER_VALUE_LAST 5 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ /* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ * defines, either the default (minimum-sum-of-absolute-differences), or * the experimental method (weighted-minimum-sum-of-absolute-differences). * * Weights are factors >= 1.0, indicating how important it is to keep the * filter type consistent between rows. Larger numbers mean the current * filter is that many times as likely to be the same as the "num_weights" * previous filters. This is cumulative for each previous row with a weight. * There needs to be "num_weights" values in "filter_weights", or it can be * NULL if the weights aren't being specified. Weights have no influence on * the selection of the first row filter. Well chosen weights can (in theory) * improve the compression for a given image. * * Costs are factors >= 1.0 indicating the relative decoding costs of a * filter type. Higher costs indicate more decoding expense, and are * therefore less likely to be selected over a filter with lower computational * costs. There needs to be a value in "filter_costs" for each valid filter * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't * setting the costs. Costs try to improve the speed of decompression without * unduly increasing the compressed image size. * * A negative weight or cost indicates the default value is to be used, and * values in the range [0.0, 1.0) indicate the value is to remain unchanged. * The default values for both weights and costs are currently 1.0, but may * change if good general weighting/cost heuristics can be found. If both * the weights and costs are set to 1.0, this degenerates the WEIGHTED method * to the UNWEIGHTED method, but with added encoding time/computation. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs)); #endif #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ /* Heuristic used for row filter selection. These defines should NOT be * changed. */ #define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ #define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ #define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ /* Set the library compression level. Currently, valid values range from * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 * for PNG images, and do considerably fewer caclulations. In the future, * these values may not correspond directly to the zlib compression levels. */ extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, int level)); extern PNG_EXPORT(void,png_set_compression_mem_level) PNGARG((png_structp png_ptr, int mem_level)); extern PNG_EXPORT(void,png_set_compression_strategy) PNGARG((png_structp png_ptr, int strategy)); extern PNG_EXPORT(void,png_set_compression_window_bits) PNGARG((png_structp png_ptr, int window_bits)); extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, int method)); /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, * and call standard C I/O routines such as fread(), fwrite(), and * fprintf(). These functions can be made to use other I/O routines * at run time for those applications that need to handle I/O in a * different manner by calling png_set_???_fn(). See libpng.txt for * more information. */ #if !defined(PNG_NO_STDIO) /* Initialize the input/output for the PNG file to the default functions. */ extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); #endif /* Replace the (error and abort), and warning functions with user * supplied functions. If no messages are to be printed you must still * write and use replacement functions. The replacement error_fn should * still do a longjmp to the last setjmp location if you are using this * method of error handling. If error_fn or warning_fn is NULL, the * default function will be used. */ extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); /* Return the user pointer associated with the error functions */ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); /* Replace the default data output functions with a user supplied one(s). * If buffered output is not used, then output_flush_fn can be set to NULL. * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time * output_flush_fn will be ignored (and thus can be NULL). * It is probably a mistake to use NULL for output_flush_fn if * write_data_fn is not also NULL unless you have built libpng with * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's * default flush function, which uses the standard *FILE structure, will * be used. */ extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); /* Replace the default data input function with a user supplied one. */ extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn)); /* Return the user pointer associated with the I/O functions */ extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, png_read_status_ptr read_row_fn)); extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, png_write_status_ptr write_row_fn)); #ifdef PNG_USER_MEM_SUPPORTED /* Replace the default memory allocation functions with user supplied one(s). */ extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); /* Return the user pointer associated with the memory functions */ extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr read_user_transform_fn)); #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr write_user_transform_fn)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp png_ptr, png_voidp user_transform_ptr, int user_transform_depth, int user_transform_channels)); /* Return the user pointer associated with the user transform functions */ extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_USER_CHUNKS_SUPPORTED extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_PROGRESSIVE_READ_SUPPORTED /* Sets the function callbacks for the push reader, and a pointer to a * user-defined structure available to the callback functions. */ extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, png_voidp progressive_ptr, png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); /* returns the user pointer associated with the push read functions */ extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) PNGARG((png_structp png_ptr)); /* function to be called when data becomes available */ extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); /* function that combines rows. Not very much different than the * png_combine_row() call. Is this even used????? */ extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, png_bytep old_row, png_bytep new_row)); #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, png_uint_32 size)); #if defined(PNG_1_0_X) # define png_malloc_warn png_malloc #else /* Added at libpng version 1.2.4 */ extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* frees a pointer allocated by png_malloc() */ extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); #if defined(PNG_1_0_X) /* Function to allocate memory for zlib. */ extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); #endif /* Free data that was allocated internally */ extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); #ifdef PNG_FREE_ME_SUPPORTED /* Reassign responsibility for freeing existing data, whether allocated * by libpng or by the application */ extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); #endif /* assignments for png_data_freer */ #define PNG_DESTROY_WILL_FREE_DATA 1 #define PNG_SET_WILL_FREE_DATA 1 #define PNG_USER_WILL_FREE_DATA 2 /* Flags for png_ptr->free_me and info_ptr->free_me */ #define PNG_FREE_HIST 0x0008 #define PNG_FREE_ICCP 0x0010 #define PNG_FREE_SPLT 0x0020 #define PNG_FREE_ROWS 0x0040 #define PNG_FREE_PCAL 0x0080 #define PNG_FREE_SCAL 0x0100 #define PNG_FREE_UNKN 0x0200 #define PNG_FREE_LIST 0x0400 #define PNG_FREE_PLTE 0x1000 #define PNG_FREE_TRNS 0x2000 #define PNG_FREE_TEXT 0x4000 #define PNG_FREE_ALL 0x7fff #define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, png_uint_32 size)); extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, png_voidp ptr)); #endif extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 size)); extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, png_voidp s1, int value, png_uint_32 size)); #if defined(USE_FAR_KEYWORD) /* memory model conversion function */ extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, int check)); #endif /* USE_FAR_KEYWORD */ #ifndef PNG_NO_ERROR_TEXT /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); /* The same, but the chunk name is prepended to the error string. */ extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); #else /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); #endif #ifndef PNG_NO_WARNINGS /* Non-fatal error in libpng. Can continue, but may have a problem. */ extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #ifdef PNG_READ_SUPPORTED /* Non-fatal error in libpng, chunk name is prepended to message. */ extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #endif /* PNG_READ_SUPPORTED */ #endif /* PNG_NO_WARNINGS */ /* The png_set_ functions are for storing values in the png_info_struct. * Similarly, the png_get_ calls are used to read values from the * png_info_struct, either storing the parameters in the passed variables, or * setting pointers into the png_info_struct where the data is stored. The * png_get_ functions return a non-zero value if the data was available * in info_ptr, or return zero and do not change any of the parameters if the * data was not available. * * These functions should be used instead of directly accessing png_info * to avoid problems with future changes in the size and internal layout of * png_info_struct. */ /* Returns "flag" if chunk data is valid in info_ptr. */ extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)); /* Returns number of bytes needed to hold a transformed row. */ extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* Returns row_pointers, which is an array of pointers to scanlines that was returned from png_read_png(). */ extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Set row_pointers, which is an array of pointers to scanlines for use by png_write_png(). */ extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)); #endif /* Returns number of color channels in image. */ extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_EASY_ACCESS_SUPPORTED /* Returns image width in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image height in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image bit_depth. */ extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image color_type. */ extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image filter_type. */ extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image interlace_type. */ extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image compression_type. */ extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image resolution in pixels per meter, from pHYs chunk data. */ extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns pixel aspect ratio, computed from pHYs chunk data. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* PNG_EASY_ACCESS_SUPPORTED */ /* Returns pointer to signature string read from PNG header */ extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p *background)); #endif #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p background)); #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double *white_x, double *white_y, double *red_x, double *red_y, double *green_x, double *green_y, double *blue_x, double *blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)); #endif #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double *file_gamma)); #endif extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_file_gamma)); #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double file_gamma)); #endif extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_file_gamma)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)); #endif extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method)); extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_method, int compression_method, int filter_method)); #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); #endif #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, int unit_type)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, png_charp *units, png_charpp *params)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); #endif extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette)); extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette)); #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)); #endif #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p sig_bit)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int *intent)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charpp name, int *compression_type, png_charpp profile, png_uint_32 *proflen)); /* Note to maintainer: profile should be png_bytepp */ #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp name, int compression_type, png_charp profile, png_uint_32 proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tpp entries)); #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tp entries, int nentries)); #endif #if defined(PNG_TEXT_SUPPORTED) /* png_get_text also returns the number of text chunks in *num_text */ extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, int *num_text)); #endif /* * Note while png_set_text() will accept a structure whose text, * language, and translated keywords are NULL pointers, the structure * returned by png_get_text will always contain regular * zero-terminated C strings. They might be empty strings but * they will never be NULL pointers. */ #if defined(PNG_TEXT_SUPPORTED) extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep mod_time)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) #endif #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, double *width, double *height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED */ #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* provide a list of chunks and how they are to be handled, if the built-in handling or default unknown chunk handling is not desired. Any chunks not listed will be handled in the default manner. The IHDR and IEND chunks must not be listed. keep = 0: follow default behaviour = 1: do not keep = 2: keep only if safe-to-copy = 3: keep even if unsafe-to-copy */ extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp png_ptr, int keep, png_bytep chunk_list, int num_chunks)); extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); extern PNG_EXPORT(void, png_set_unknown_chunk_location) PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); #endif #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep chunk_name)); #endif /* Png_free_data() will turn off the "valid" flag for anything it frees. If you need to turn it off for a chunk that your application has freed, you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, png_infop info_ptr, int mask)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* The "params" pointer is currently not used and is for future expansion. */ extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); #endif /* Define PNG_DEBUG at compile time for debugging information. Higher * numbers for PNG_DEBUG mean more debugging information. This has * only been added since version 0.95 so it is not implemented throughout * libpng yet, but more support will be added as needed. */ #ifdef PNG_DEBUG #if (PNG_DEBUG > 0) #if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) #include #if (PNG_DEBUG > 1) #ifndef _DEBUG # define _DEBUG #endif #ifndef png_debug #define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) #endif #ifndef png_debug1 #define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) #endif #ifndef png_debug2 #define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) #endif #endif #else /* PNG_DEBUG_FILE || !_MSC_VER */ #ifndef PNG_DEBUG_FILE #define PNG_DEBUG_FILE stderr #endif /* PNG_DEBUG_FILE */ #if (PNG_DEBUG > 1) /* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on * non-ISO compilers */ # ifdef __STDC__ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ } # endif # else /* __STDC __ */ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1,p2); \ } # endif # endif /* __STDC __ */ #endif /* (PNG_DEBUG > 1) */ #endif /* _MSC_VER */ #endif /* (PNG_DEBUG > 0) */ #endif /* PNG_DEBUG */ #ifndef png_debug #define png_debug(l, m) #endif #ifndef png_debug1 #define png_debug1(l, m, p1) #endif #ifndef png_debug2 #define png_debug2(l, m, p1, p2) #endif extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); #ifdef PNG_MNG_FEATURES_SUPPORTED extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp png_ptr, png_uint_32 mng_features_permitted)); #endif /* For use in png_set_keep_unknown, added to version 1.2.6 */ #define PNG_HANDLE_CHUNK_AS_DEFAULT 0 #define PNG_HANDLE_CHUNK_NEVER 1 #define PNG_HANDLE_CHUNK_IF_SAFE 2 #define PNG_HANDLE_CHUNK_ALWAYS 3 /* Added to version 1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) #define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ #define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ #define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 #define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 #define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 #define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 #define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 #define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 #define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ #define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ | PNG_ASM_FLAG_MMX_READ_INTERLACE \ | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) #define PNG_MMX_WRITE_FLAGS ( 0 ) #define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ | PNG_MMX_READ_FLAGS \ | PNG_MMX_WRITE_FLAGS ) #define PNG_SELECT_READ 1 #define PNG_SELECT_WRITE 2 #endif /* PNG_MMX_CODE_SUPPORTED */ #if !defined(PNG_1_0_X) /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) PNGARG((int flag_select, int *compilerID)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) PNGARG((int flag_select)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flags) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) PNGARG((png_structp png_ptr)); /* pngset.c */ extern PNG_EXPORT(void,png_set_asm_flags) PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); /* pngset.c */ extern PNG_EXPORT(void,png_set_mmx_thresholds) PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, png_uint_32 mmx_rowbytes_threshold)); #endif /* PNG_1_0_X */ #if !defined(PNG_1_0_X) /* png.c, pnggccrd.c, or pngvcrd.c */ extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); #endif /* PNG_1_0_X */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ /* Strip the prepended error numbers ("#nnn ") from error and warning * messages before passing them to the error or warning handler. */ #ifdef PNG_ERROR_NUMBERS_SUPPORTED extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp png_ptr, png_uint_32 strip_mode)); #endif /* Added at libpng-1.2.6 */ #ifdef PNG_SET_USER_LIMITS_SUPPORTED extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp png_ptr)); #endif /* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED /* With these routines we avoid an integer divide, which will be slower on * most machines. However, it does take more operations than the corresponding * divide method, so it may be slower on a few RISC systems. There are two * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. * * Note that the rounding factors are NOT supposed to be the same! 128 and * 32768 are correct for the NODIV code; 127 and 32767 are correct for the * standard method. * * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] */ /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ # define png_composite(composite, fg, alpha, bg) \ { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + (png_uint_16)(bg)*(png_uint_16)(255 - \ (png_uint_16)(alpha)) + (png_uint_16)128); \ (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } # define png_composite_16(composite, fg, alpha, bg) \ { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + (png_uint_32)(bg)*(png_uint_32)(65535L - \ (png_uint_32)(alpha)) + (png_uint_32)32768L); \ (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } #else /* standard method using integer division */ # define png_composite(composite, fg, alpha, bg) \ (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ (png_uint_16)127) / 255) # define png_composite_16(composite, fg, alpha, bg) \ (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ (png_uint_32)32767) / (png_uint_32)65535L) #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ /* Inline macros to do direct reads of bytes from the input buffer. These * require that you are using an architecture that uses PNG byte ordering * (MSB first) and supports unaligned data storage. I think that PowerPC * in big-endian mode and 680x0 are the only ones that will support this. * The x86 line of processors definitely do not. The png_get_int_32() * routine also assumes we are using two's complement format for negative * values, which is almost certainly true. */ #if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) # define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) # define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) # define png_get_int_32(buf) ( *((png_int_32p) (buf))) #else extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); #endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ extern PNG_EXPORT(png_uint_32,png_get_uint_31) PNGARG((png_structp png_ptr, png_bytep buf)); /* No png_get_int_16 -- may be added if there's a real need for it. */ /* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ extern PNG_EXPORT(void,png_save_uint_32) PNGARG((png_bytep buf, png_uint_32 i)); extern PNG_EXPORT(void,png_save_int_32) PNGARG((png_bytep buf, png_int_32 i)); /* Place a 16-bit number into a buffer in PNG byte order. * The parameter is declared unsigned int, not png_uint_16, * just to avoid potential problems on pre-ANSI C compilers. */ extern PNG_EXPORT(void,png_save_uint_16) PNGARG((png_bytep buf, unsigned int i)); /* No png_save_int_16 -- may be added if there's a real need for it. */ /* ************************************************************************* */ /* These next functions are used internally in the code. They generally * shouldn't be used unless you are writing code to add or replace some * functionality in libpng. More information about most functions can * be found in the files where the functions are located. */ /* Various modes of operation, that are visible to applications because * they are used for unknown chunk location. */ #define PNG_HAVE_IHDR 0x01 #define PNG_HAVE_PLTE 0x02 #define PNG_HAVE_IDAT 0x04 #define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ #define PNG_HAVE_IEND 0x10 #if defined(PNG_INTERNAL) /* More modes of operation. Note that after an init, mode is set to * zero automatically when the structure is created. */ #define PNG_HAVE_gAMA 0x20 #define PNG_HAVE_cHRM 0x40 #define PNG_HAVE_sRGB 0x80 #define PNG_HAVE_CHUNK_HEADER 0x100 #define PNG_WROTE_tIME 0x200 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400 #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ /* flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001 #define PNG_INTERLACE 0x0002 #define PNG_PACK 0x0004 #define PNG_SHIFT 0x0008 #define PNG_SWAP_BYTES 0x0010 #define PNG_INVERT_MONO 0x0020 #define PNG_DITHER 0x0040 #define PNG_BACKGROUND 0x0080 #define PNG_BACKGROUND_EXPAND 0x0100 /* 0x0200 unused */ #define PNG_16_TO_8 0x0400 #define PNG_RGBA 0x0800 #define PNG_EXPAND 0x1000 #define PNG_GAMMA 0x2000 #define PNG_GRAY_TO_RGB 0x4000 #define PNG_FILLER 0x8000L #define PNG_PACKSWAP 0x10000L #define PNG_SWAP_ALPHA 0x20000L #define PNG_STRIP_ALPHA 0x40000L #define PNG_INVERT_ALPHA 0x80000L #define PNG_USER_TRANSFORM 0x100000L #define PNG_RGB_TO_GRAY_ERR 0x200000L #define PNG_RGB_TO_GRAY_WARN 0x400000L #define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ /* 0x800000L Unused */ #define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ #define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ /* flags for png_create_struct */ #define PNG_STRUCT_PNG 0x0001 #define PNG_STRUCT_INFO 0x0002 /* Scaling factor for filter heuristic weighting calculations */ #define PNG_WEIGHT_SHIFT 8 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) #define PNG_COST_SHIFT 3 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) /* flags for the png_ptr->flags rather than declaring a byte for each one */ #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 #define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 #define PNG_FLAG_ZLIB_FINISHED 0x0020 #define PNG_FLAG_ROW_INIT 0x0040 #define PNG_FLAG_FILLER_AFTER 0x0080 #define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 #define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 #define PNG_FLAG_CRC_CRITICAL_USE 0x0400 #define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 #define PNG_FLAG_FREE_PLTE 0x1000 #define PNG_FLAG_FREE_TRNS 0x2000 #define PNG_FLAG_FREE_HIST 0x4000 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L #define PNG_FLAG_LIBRARY_MISMATCH 0x20000L #define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L #define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L #define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L #define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ #define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ /* 0x800000L unused */ /* 0x1000000L unused */ /* 0x2000000L unused */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ PNG_FLAG_CRC_ANCILLARY_NOWARN) #define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ PNG_FLAG_CRC_CRITICAL_IGNORE) #define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ PNG_FLAG_CRC_CRITICAL_MASK) /* save typing and make code easier to understand */ #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ abs((int)((c1).green) - (int)((c2).green)) + \ abs((int)((c1).blue) - (int)((c2).blue))) /* Added to libpng-1.2.6 JB */ #define PNG_ROWBYTES(pixel_bits, width) \ ((pixel_bits) >= 8 ? \ ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) /* PNG_OUT_OF_RANGE returns true if value is outside the range ideal-delta..ideal+delta. Each argument is evaluated twice. "ideal" and "delta" should be constants, normally simple integers, "value" a variable. Added to libpng-1.2.6 JB */ #define PNG_OUT_OF_RANGE(value, ideal, delta) \ ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) /* place to hold the signature string for a PNG file. */ #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; #else #endif #endif /* PNG_NO_EXTERN */ /* Constant strings for known chunk types. If you need to add a chunk, * define the name here, and add an invocation of the macro in png.c and * wherever it's needed. */ #define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} #define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} #define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} #define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} #define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} #define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} #define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} #define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} #define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} #define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} #define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} #define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} #define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} #define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} #define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} #define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} #define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} #define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} #define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} #define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} #define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; #endif /* PNG_USE_GLOBAL_ARRAYS */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for reading, and allocate any other memory. * (old interface - DEPRECATED - use png_create_read_struct instead). */ extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); #undef png_read_init #define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for writing, and allocate any other memory. * (old interface - DEPRECATED - use png_create_write_struct instead). */ extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); #undef png_write_init #define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); /* Allocate memory for an internal libpng struct */ PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); /* Free memory from internal libpng struct */ PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)); PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr)); /* Free any memory that info_ptr points to and reset struct. */ PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_1_0_X /* Function to allocate memory for zlib. */ PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); #ifdef PNG_SIZE_T /* Function to convert a sizeof an item to png_sizeof item */ PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); #endif /* Next four functions are used internally as callbacks. PNGAPI is required * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) #if !defined(PNG_NO_STDIO) PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); #endif #endif #else /* PNG_1_0_X */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif #endif /* PNG_1_0_X */ /* Reset the CRC variable */ PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); /* Write the "data" buffer to whatever output you are using. */ PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read data from whatever input you are using into the "data" buffer */ PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read bytes into buf, and update png_ptr->crc */ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, png_size_t length)); /* Decompress data in a chunk that uses compression */ #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, int comp_type, png_size_t chunklength, png_size_t prefix_length, png_size_t *data_length)); #endif /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); /* Read the CRC from the file and compare it to the libpng calculated CRC */ PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); /* Calculate the CRC over a section of data. Note that we are only * passing a maximum of 64K on systems that have this as a memory limit, * since this is the maximum buffer size we can specify. */ PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); #endif /* simple function to write the signature */ PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); /* write various chunks */ /* Write the IHDR chunk, and update the png_struct with the necessary * information. */ PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_method, int filter_method, int interlace_method)); PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)); PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); #if defined(PNG_WRITE_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point file_gamma)); #endif #endif #if defined(PNG_WRITE_sBIT_SUPPORTED) PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, int color_type)); #endif #if defined(PNG_WRITE_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_WRITE_sRGB_SUPPORTED) PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, int intent)); #endif #if defined(PNG_WRITE_iCCP_SUPPORTED) PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, png_charp name, int compression_type, png_charp profile, int proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, png_sPLT_tp palette)); #endif #if defined(PNG_WRITE_tRNS_SUPPORTED) PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, png_color_16p values, int number, int color_type)); #endif #if defined(PNG_WRITE_bKGD_SUPPORTED) PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, png_color_16p values, int color_type)); #endif #if defined(PNG_WRITE_hIST_SUPPORTED) PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, int num_hist)); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, png_charp key, png_charpp new_key)); #endif #if defined(PNG_WRITE_tEXt_SUPPORTED) PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len)); #endif #if defined(PNG_WRITE_zTXt_SUPPORTED) PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len, int compression)); #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, int compression, png_charp key, png_charp lang, png_charp lang_key, png_charp text)); #endif #if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_WRITE_oFFs_SUPPORTED) PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, int unit_type)); #endif #if defined(PNG_WRITE_pCAL_SUPPORTED) PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_WRITE_pHYs_SUPPORTED) PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, int unit_type)); #endif #if defined(PNG_WRITE_tIME_SUPPORTED) PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, png_timep mod_time)); #endif #if defined(PNG_WRITE_sCAL_SUPPORTED) #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, int unit, png_charp width, png_charp height)); #endif #endif #endif /* Called when finished processing a row of data */ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); /* Internal use only. Called before first row of data */ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); #endif /* combine a row of data, dealing with alpha, etc. if requested */ PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, int mask)); #if defined(PNG_READ_INTERLACING_SUPPORTED) /* expand an interlaced row */ /* OLD pre-1.0.9 interface: PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass, png_uint_32 transformations)); */ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); #endif /* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* grab pixels out of a row for an interlaced pass */ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass)); #endif /* unfilter a row */ PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); /* Choose the best filter to use and filter the row data */ PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, png_row_infop row_info)); /* Write out the filtered row. */ PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, png_bytep filtered_row)); /* finish a row while reading, dealing with interlacing passes, etc. */ PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); /* initialize the row buffers, etc. */ PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, png_infop info_ptr)); /* these are the functions that do the transformations */ #if defined(PNG_READ_FILLER_SUPPORTED) PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 filler, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACK_SUPPORTED) PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p sig_bits)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); # if defined(PNG_CORRECT_PALETTE_SUPPORTED) PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, png_colorp palette, int num_palette)); # endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p bit_depth)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background, png_color_16p background_1, png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, png_uint_16pp gamma_16_to_1, int gamma_shift)); #else PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background)); #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, png_bytep gamma_table, png_uint_16pp gamma_16_table, int gamma_shift)); #endif #if defined(PNG_READ_EXPAND_SUPPORTED) PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_value)); #endif /* The following decodes the appropriate chunks, and does error correction, * then calls the appropriate callback for the chunk if it is valid. */ /* decode the IHDR chunk */ PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #if defined(PNG_READ_bKGD_SUPPORTED) PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_iCCP_SUPPORTED) extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_iCCP_SUPPORTED */ #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sPLT_SUPPORTED) extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_sPLT_SUPPORTED */ #if defined(PNG_READ_sRGB_SUPPORTED) PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_bytep chunk_name)); /* handle the transformations for reading and writing */ PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, png_uint_32 length)); PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #ifdef PNG_MNG_FEATURES_SUPPORTED PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) /* png.c */ /* PRIVATE */ PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_pHYs_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif /* PNG_pHYs_SUPPORTED */ #endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ /* Read the chunk header (length + type name) */ PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); /* Added at libpng version 1.2.34 */ #if defined(PNG_cHRM_SUPPORTED) PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ #endif /* PNG_INTERNAL */ #ifdef __cplusplus } #endif #endif /* PNG_VERSION_INFO_ONLY */ /* do not put anything past this line */ #endif /* PNG_H */ angband-v3.3.2/src/win/include/libpng12/0000755000175000017500000000000011651552410017234 5ustar chriscchriscangband-v3.3.2/src/win/include/libpng12/pngconf.h0000644000175000017500000013050611651552410021044 0ustar chriscchrisc /* pngconf.h - machine configurable file for libpng * * libpng version 1.2.37 - June 4, 2009 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ /* Any machine specific code is near the front of this file, so if you * are configuring libpng for a machine, you may want to read the section * starting here down to where it starts to typedef png_color, png_text, * and png_info. */ #ifndef PNGCONF_H #define PNGCONF_H #define PNG_1_2_X /* * PNG_USER_CONFIG has to be defined on the compiler command line. This * includes the resource compiler for Windows DLL configurations. */ #ifdef PNG_USER_CONFIG # ifndef PNG_USER_PRIVATEBUILD # define PNG_USER_PRIVATEBUILD # endif #include "pngusr.h" #endif /* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ #ifdef PNG_CONFIGURE_LIBPNG #ifdef HAVE_CONFIG_H #include "config.h" #endif #endif /* * Added at libpng-1.2.8 * * If you create a private DLL you need to define in "pngusr.h" the followings: * #define PNG_USER_PRIVATEBUILD * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." * #define PNG_USER_DLLFNAME_POSTFIX * e.g. // private DLL "libpng13gx.dll" * #define PNG_USER_DLLFNAME_POSTFIX "gx" * * The following macros are also at your disposal if you want to complete the * DLL VERSIONINFO structure. * - PNG_USER_VERSIONINFO_COMMENTS * - PNG_USER_VERSIONINFO_COMPANYNAME * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS */ #ifdef __STDC__ #ifdef SPECIALBUILD # pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") #endif #ifdef PRIVATEBUILD # pragma message("PRIVATEBUILD is deprecated.\ Use PNG_USER_PRIVATEBUILD instead.") # define PNG_USER_PRIVATEBUILD PRIVATEBUILD #endif #endif /* __STDC__ */ #ifndef PNG_VERSION_INFO_ONLY /* End of material added to libpng-1.2.8 */ /* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble Restored at libpng-1.2.21 */ #if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ !defined(PNG_WARN_UNINITIALIZED_ROW) # define PNG_WARN_UNINITIALIZED_ROW 1 #endif /* End of material added at libpng-1.2.19/1.2.21 */ /* This is the size of the compression buffer, and thus the size of * an IDAT chunk. Make this whatever size you feel is best for your * machine. One of these will be allocated per png_struct. When this * is full, it writes the data to the disk, and does some other * calculations. Making this an extremely small size will slow * the library down, but you may want to experiment to determine * where it becomes significant, if you are concerned with memory * usage. Note that zlib allocates at least 32Kb also. For readers, * this describes the size of the buffer available to read the data in. * Unless this gets smaller than the size of a row (compressed), * it should not make much difference how big this is. */ #ifndef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 8192 #endif /* Enable if you want a write-only libpng */ #ifndef PNG_NO_READ_SUPPORTED # define PNG_READ_SUPPORTED #endif /* Enable if you want a read-only libpng */ #ifndef PNG_NO_WRITE_SUPPORTED # define PNG_WRITE_SUPPORTED #endif /* Enabled by default in 1.2.0. You can disable this if you don't need to support PNGs that are embedded in MNG datastreams */ #if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) # ifndef PNG_MNG_FEATURES_SUPPORTED # define PNG_MNG_FEATURES_SUPPORTED # endif #endif #ifndef PNG_NO_FLOATING_POINT_SUPPORTED # ifndef PNG_FLOATING_POINT_SUPPORTED # define PNG_FLOATING_POINT_SUPPORTED # endif #endif /* If you are running on a machine where you cannot allocate more * than 64K of memory at once, uncomment this. While libpng will not * normally need that much memory in a chunk (unless you load up a very * large file), zlib needs to know how big of a chunk it can use, and * libpng thus makes sure to check any memory allocation to verify it * will fit into memory. #define PNG_MAX_MALLOC_64K */ #if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) # define PNG_MAX_MALLOC_64K #endif /* Special munging to support doing things the 'cygwin' way: * 'Normal' png-on-win32 defines/defaults: * PNG_BUILD_DLL -- building dll * PNG_USE_DLL -- building an application, linking to dll * (no define) -- building static library, or building an * application and linking to the static lib * 'Cygwin' defines/defaults: * PNG_BUILD_DLL -- (ignored) building the dll * (no define) -- (ignored) building an application, linking to the dll * PNG_STATIC -- (ignored) building the static lib, or building an * application that links to the static lib. * ALL_STATIC -- (ignored) building various static libs, or building an * application that links to the static libs. * Thus, * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and * this bit of #ifdefs will define the 'correct' config variables based on * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but * unnecessary. * * Also, the precedence order is: * ALL_STATIC (since we can't #undef something outside our namespace) * PNG_BUILD_DLL * PNG_STATIC * (nothing) == PNG_USE_DLL * * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent * of auto-import in binutils, we no longer need to worry about * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes * to __declspec() stuff. However, we DO need to worry about * PNG_BUILD_DLL and PNG_STATIC because those change some defaults * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. */ #if defined(__CYGWIN__) # if defined(ALL_STATIC) # if defined(PNG_BUILD_DLL) # undef PNG_BUILD_DLL # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # if !defined(PNG_STATIC) # define PNG_STATIC # endif # else # if defined (PNG_BUILD_DLL) # if defined(PNG_STATIC) # undef PNG_STATIC # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # else # if defined(PNG_STATIC) # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # else # if !defined(PNG_USE_DLL) # define PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # endif # endif # endif #endif /* This protects us against compilers that run on a windowing system * and thus don't have or would rather us not use the stdio types: * stdin, stdout, and stderr. The only one currently used is stderr * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will * prevent these from being compiled and used. #defining PNG_NO_STDIO * will also prevent these, plus will prevent the entire set of stdio * macros and functions (FILE *, printf, etc.) from being compiled and used, * unless (PNG_DEBUG > 0) has been #defined. * * #define PNG_NO_CONSOLE_IO * #define PNG_NO_STDIO */ #if defined(_WIN32_WCE) # include /* Console I/O functions are not supported on WindowsCE */ # define PNG_NO_CONSOLE_IO /* abort() may not be supported on some/all Windows CE platforms */ # define PNG_ABORT() exit(-1) # ifdef PNG_DEBUG # undef PNG_DEBUG # endif #endif #ifdef PNG_BUILD_DLL # ifndef PNG_CONSOLE_IO_SUPPORTED # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # endif #endif # ifdef PNG_NO_STDIO # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # ifdef PNG_DEBUG # if (PNG_DEBUG > 0) # include # endif # endif # else # if !defined(_WIN32_WCE) /* "stdio.h" functions are not supported on WindowsCE */ # include # endif # endif /* This macro protects us against machines that don't have function * prototypes (ie K&R style headers). If your compiler does not handle * function prototypes, define this macro and use the included ansi2knr. * I've always been able to use _NO_PROTO as the indicator, but you may * need to drag the empty declaration out in front of here, or change the * ifdef to suit your own needs. */ #ifndef PNGARG #ifdef OF /* zlib prototype munger */ # define PNGARG(arglist) OF(arglist) #else #ifdef _NO_PROTO # define PNGARG(arglist) () # ifndef PNG_TYPECAST_NULL # define PNG_TYPECAST_NULL # endif #else # define PNGARG(arglist) arglist #endif /* _NO_PROTO */ #endif /* OF */ #endif /* PNGARG */ /* Try to determine if we are compiling on a Mac. Note that testing for * just __MWERKS__ is not good enough, because the Codewarrior is now used * on non-Mac platforms. */ #ifndef MACOS # if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) # define MACOS # endif #endif /* enough people need this for various reasons to include it here */ #if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) # include #endif #if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) # define PNG_SETJMP_SUPPORTED #endif #ifdef PNG_SETJMP_SUPPORTED /* This is an attempt to force a single setjmp behaviour on Linux. If * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. * * You can bypass this test if you know that your application uses exactly * the same setjmp.h that was included when libpng was built. Only define * PNG_SKIP_SETJMP_CHECK while building your application, prior to the * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK * while building a separate libpng library for general use. */ # ifndef PNG_SKIP_SETJMP_CHECK # ifdef __linux__ # ifdef _BSD_SOURCE # define PNG_SAVE_BSD_SOURCE # undef _BSD_SOURCE # endif # ifdef _SETJMP_H /* If you encounter a compiler error here, see the explanation * near the end of INSTALL. */ __pngconf.h__ in libpng already includes setjmp.h; __dont__ include it again.; # endif # endif /* __linux__ */ # endif /* PNG_SKIP_SETJMP_CHECK */ /* include setjmp.h for error handling */ # include # ifdef __linux__ # ifdef PNG_SAVE_BSD_SOURCE # ifndef _BSD_SOURCE # define _BSD_SOURCE # endif # undef PNG_SAVE_BSD_SOURCE # endif # endif /* __linux__ */ #endif /* PNG_SETJMP_SUPPORTED */ #ifdef BSD # include #else # include #endif /* Other defines for things like memory and the like can go here. */ #ifdef PNG_INTERNAL #include /* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which * aren't usually used outside the library (as far as I know), so it is * debatable if they should be exported at all. In the future, when it is * possible to have run-time registry of chunk-handling functions, some of * these will be made available again. #define PNG_EXTERN extern */ #define PNG_EXTERN /* Other defines specific to compilers can go here. Try to keep * them inside an appropriate ifdef/endif pair for portability. */ #if defined(PNG_FLOATING_POINT_SUPPORTED) # if defined(MACOS) /* We need to check that hasn't already been included earlier * as it seems it doesn't agree with , yet we should really use * if possible. */ # if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) # include # endif # else # include # endif # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) /* Amiga SAS/C: We must include builtin FPU functions when compiling using * MATH=68881 */ # include # endif #endif /* Codewarrior on NT has linking problems without this. */ #if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) # define PNG_ALWAYS_EXTERN #endif /* This provides the non-ANSI (far) memory allocation routines. */ #if defined(__TURBOC__) && defined(__MSDOS__) # include # include #endif /* I have no idea why is this necessary... */ #if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) # include #endif /* This controls how fine the dithering gets. As this allocates * a largish chunk of memory (32K), those who are not as concerned * with dithering quality can decrease some or all of these. */ #ifndef PNG_DITHER_RED_BITS # define PNG_DITHER_RED_BITS 5 #endif #ifndef PNG_DITHER_GREEN_BITS # define PNG_DITHER_GREEN_BITS 5 #endif #ifndef PNG_DITHER_BLUE_BITS # define PNG_DITHER_BLUE_BITS 5 #endif /* This controls how fine the gamma correction becomes when you * are only interested in 8 bits anyway. Increasing this value * results in more memory being used, and more pow() functions * being called to fill in the gamma tables. Don't set this value * less then 8, and even that may not work (I haven't tested it). */ #ifndef PNG_MAX_GAMMA_8 # define PNG_MAX_GAMMA_8 11 #endif /* This controls how much a difference in gamma we can tolerate before * we actually start doing gamma conversion. */ #ifndef PNG_GAMMA_THRESHOLD # define PNG_GAMMA_THRESHOLD 0.05 #endif #endif /* PNG_INTERNAL */ /* The following uses const char * instead of char * for error * and warning message functions, so some compilers won't complain. * If you do not want to use const, define PNG_NO_CONST here. */ #ifndef PNG_NO_CONST # define PNG_CONST const #else # define PNG_CONST #endif /* The following defines give you the ability to remove code from the * library that you will not be using. I wish I could figure out how to * automate this, but I can't do that without making it seriously hard * on the users. So if you are not using an ability, change the #define * to and #undef, and that part of the library will not be compiled. If * your linker can't find a function, you may want to make sure the * ability is defined here. Some of these depend upon some others being * defined. I haven't figured out all the interactions here, so you may * have to experiment awhile to get everything to compile. If you are * creating or using a shared library, you probably shouldn't touch this, * as it will affect the size of the structures, and this will cause bad * things to happen if the library and/or application ever change. */ /* Any features you will not be using can be undef'ed here */ /* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS * on the compile line, then pick and choose which ones to define without * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED * if you only want to have a png-compliant reader/writer but don't need * any of the extra transformations. This saves about 80 kbytes in a * typical installation of the library. (PNG_NO_* form added in version * 1.0.1c, for consistency) */ /* The size of the png_text structure changed in libpng-1.0.6 when * iTXt support was added. iTXt support was turned off by default through * libpng-1.2.x, to support old apps that malloc the png_text structure * instead of calling png_set_text() and letting libpng malloc it. It * was turned on by default in libpng-1.3.0. */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) # ifndef PNG_NO_iTXt_SUPPORTED # define PNG_NO_iTXt_SUPPORTED # endif # ifndef PNG_NO_READ_iTXt # define PNG_NO_READ_iTXt # endif # ifndef PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_iTXt # endif #endif #if !defined(PNG_NO_iTXt_SUPPORTED) # if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) # define PNG_READ_iTXt # endif # if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) # define PNG_WRITE_iTXt # endif #endif /* The following support, added after version 1.0.0, can be turned off here en * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility * with old applications that require the length of png_struct and png_info * to remain unchanged. */ #ifdef PNG_LEGACY_SUPPORTED # define PNG_NO_FREE_ME # define PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_NO_READ_USER_CHUNKS # define PNG_NO_READ_iCCP # define PNG_NO_WRITE_iCCP # define PNG_NO_READ_iTXt # define PNG_NO_WRITE_iTXt # define PNG_NO_READ_sCAL # define PNG_NO_WRITE_sCAL # define PNG_NO_READ_sPLT # define PNG_NO_WRITE_sPLT # define PNG_NO_INFO_IMAGE # define PNG_NO_READ_RGB_TO_GRAY # define PNG_NO_READ_USER_TRANSFORM # define PNG_NO_WRITE_USER_TRANSFORM # define PNG_NO_USER_MEM # define PNG_NO_READ_EMPTY_PLTE # define PNG_NO_MNG_FEATURES # define PNG_NO_FIXED_POINT_SUPPORTED #endif /* Ignore attempt to turn off both floating and fixed point support */ #if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ !defined(PNG_NO_FIXED_POINT_SUPPORTED) # define PNG_FIXED_POINT_SUPPORTED #endif #ifndef PNG_NO_FREE_ME # define PNG_FREE_ME_SUPPORTED #endif #if defined(PNG_READ_SUPPORTED) #if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_TRANSFORMS) # define PNG_READ_TRANSFORMS_SUPPORTED #endif #ifdef PNG_READ_TRANSFORMS_SUPPORTED # ifndef PNG_NO_READ_EXPAND # define PNG_READ_EXPAND_SUPPORTED # endif # ifndef PNG_NO_READ_SHIFT # define PNG_READ_SHIFT_SUPPORTED # endif # ifndef PNG_NO_READ_PACK # define PNG_READ_PACK_SUPPORTED # endif # ifndef PNG_NO_READ_BGR # define PNG_READ_BGR_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP # define PNG_READ_SWAP_SUPPORTED # endif # ifndef PNG_NO_READ_PACKSWAP # define PNG_READ_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT # define PNG_READ_INVERT_SUPPORTED # endif # ifndef PNG_NO_READ_DITHER # define PNG_READ_DITHER_SUPPORTED # endif # ifndef PNG_NO_READ_BACKGROUND # define PNG_READ_BACKGROUND_SUPPORTED # endif # ifndef PNG_NO_READ_16_TO_8 # define PNG_READ_16_TO_8_SUPPORTED # endif # ifndef PNG_NO_READ_FILLER # define PNG_READ_FILLER_SUPPORTED # endif # ifndef PNG_NO_READ_GAMMA # define PNG_READ_GAMMA_SUPPORTED # endif # ifndef PNG_NO_READ_GRAY_TO_RGB # define PNG_READ_GRAY_TO_RGB_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP_ALPHA # define PNG_READ_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT_ALPHA # define PNG_READ_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_STRIP_ALPHA # define PNG_READ_STRIP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_USER_TRANSFORM # define PNG_READ_USER_TRANSFORM_SUPPORTED # endif # ifndef PNG_NO_READ_RGB_TO_GRAY # define PNG_READ_RGB_TO_GRAY_SUPPORTED # endif #endif /* PNG_READ_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_PROGRESSIVE_READ) && \ !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ # define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ #endif /* about interlacing capability! You'll */ /* still have interlacing unless you change the following line: */ #define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ #ifndef PNG_NO_READ_COMPOSITE_NODIV # ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ # define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ # endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, will be removed from version 2.0.0. Use PNG_MNG_FEATURES_SUPPORTED instead. */ #ifndef PNG_NO_READ_EMPTY_PLTE # define PNG_READ_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_READ_SUPPORTED */ #if defined(PNG_WRITE_SUPPORTED) # if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_TRANSFORMS) # define PNG_WRITE_TRANSFORMS_SUPPORTED #endif #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED # ifndef PNG_NO_WRITE_SHIFT # define PNG_WRITE_SHIFT_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACK # define PNG_WRITE_PACK_SUPPORTED # endif # ifndef PNG_NO_WRITE_BGR # define PNG_WRITE_BGR_SUPPORTED # endif # ifndef PNG_NO_WRITE_SWAP # define PNG_WRITE_SWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACKSWAP # define PNG_WRITE_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT # define PNG_WRITE_INVERT_SUPPORTED # endif # ifndef PNG_NO_WRITE_FILLER # define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ # endif # ifndef PNG_NO_WRITE_SWAP_ALPHA # define PNG_WRITE_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT_ALPHA # define PNG_WRITE_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_USER_TRANSFORM # define PNG_WRITE_USER_TRANSFORM_SUPPORTED # endif #endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ !defined(PNG_WRITE_INTERLACING_SUPPORTED) #define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant encoders, but can cause trouble if left undefined */ #endif #if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ !defined(PNG_WRITE_WEIGHTED_FILTER) && \ defined(PNG_FLOATING_POINT_SUPPORTED) # define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED #endif #ifndef PNG_NO_WRITE_FLUSH # define PNG_WRITE_FLUSH_SUPPORTED #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ #ifndef PNG_NO_WRITE_EMPTY_PLTE # define PNG_WRITE_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_WRITE_SUPPORTED */ #ifndef PNG_1_0_X # ifndef PNG_NO_ERROR_NUMBERS # define PNG_ERROR_NUMBERS_SUPPORTED # endif #endif /* PNG_1_0_X */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) # ifndef PNG_NO_USER_TRANSFORM_PTR # define PNG_USER_TRANSFORM_PTR_SUPPORTED # endif #endif #ifndef PNG_NO_STDIO # define PNG_TIME_RFC1123_SUPPORTED #endif /* This adds extra functions in pngget.c for accessing data from the * info pointer (added in version 0.99) * png_get_image_width() * png_get_image_height() * png_get_bit_depth() * png_get_color_type() * png_get_compression_type() * png_get_filter_type() * png_get_interlace_type() * png_get_pixel_aspect_ratio() * png_get_pixels_per_meter() * png_get_x_offset_pixels() * png_get_y_offset_pixels() * png_get_x_offset_microns() * png_get_y_offset_microns() */ #if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) # define PNG_EASY_ACCESS_SUPPORTED #endif /* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 * and removed from version 1.2.20. The following will be removed * from libpng-1.4.0 */ #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) # ifndef PNG_OPTIMIZED_CODE_SUPPORTED # define PNG_OPTIMIZED_CODE_SUPPORTED # endif #endif #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) && defined(__i386__) # ifndef PNG_ASSEMBLER_CODE_SUPPORTED # define PNG_ASSEMBLER_CODE_SUPPORTED # endif # if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) /* work around 64-bit gcc compiler bugs in gcc-3.x */ # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if defined(__APPLE__) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_MMX_CODE_SUPPORTED # endif #endif /* end of obsolete code to be removed from libpng-1.4.0 */ #if !defined(PNG_1_0_X) #if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) # define PNG_USER_MEM_SUPPORTED #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.2.6 */ #if !defined(PNG_1_0_X) #ifndef PNG_SET_USER_LIMITS_SUPPORTED #if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) # define PNG_SET_USER_LIMITS_SUPPORTED #endif #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter * how large, set these limits to 0x7fffffffL */ #ifndef PNG_USER_WIDTH_MAX # define PNG_USER_WIDTH_MAX 1000000L #endif #ifndef PNG_USER_HEIGHT_MAX # define PNG_USER_HEIGHT_MAX 1000000L #endif /* Added at libpng-1.2.34 and 1.4.0 */ #ifndef PNG_STRING_NEWLINE #define PNG_STRING_NEWLINE "\n" #endif /* These are currently experimental features, define them if you want */ /* very little testing */ /* #ifdef PNG_READ_SUPPORTED # ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # endif #endif */ /* This is only for PowerPC big-endian and 680x0 systems */ /* some testing */ /* #ifndef PNG_READ_BIG_ENDIAN_SUPPORTED # define PNG_READ_BIG_ENDIAN_SUPPORTED #endif */ /* Buggy compilers (e.g., gcc 2.7.2.2) need this */ /* #define PNG_NO_POINTER_INDEXING */ /* These functions are turned off by default, as they will be phased out. */ /* #define PNG_USELESS_TESTS_SUPPORTED #define PNG_CORRECT_PALETTE_SUPPORTED */ /* Any chunks you are not interested in, you can undef here. The * ones that allocate memory may be expecially important (hIST, * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info * a bit smaller. */ #if defined(PNG_READ_SUPPORTED) && \ !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_ANCILLARY_CHUNKS) # define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #endif #if defined(PNG_WRITE_SUPPORTED) && \ !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) # define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #endif #ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_READ_TEXT # define PNG_NO_READ_iTXt # define PNG_NO_READ_tEXt # define PNG_NO_READ_zTXt #endif #ifndef PNG_NO_READ_bKGD # define PNG_READ_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED #endif #ifndef PNG_NO_READ_cHRM # define PNG_READ_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED #endif #ifndef PNG_NO_READ_gAMA # define PNG_READ_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED #endif #ifndef PNG_NO_READ_hIST # define PNG_READ_hIST_SUPPORTED # define PNG_hIST_SUPPORTED #endif #ifndef PNG_NO_READ_iCCP # define PNG_READ_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED #endif #ifndef PNG_NO_READ_iTXt # ifndef PNG_READ_iTXt_SUPPORTED # define PNG_READ_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_READ_oFFs # define PNG_READ_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED #endif #ifndef PNG_NO_READ_pCAL # define PNG_READ_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED #endif #ifndef PNG_NO_READ_sCAL # define PNG_READ_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED #endif #ifndef PNG_NO_READ_pHYs # define PNG_READ_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED #endif #ifndef PNG_NO_READ_sBIT # define PNG_READ_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED #endif #ifndef PNG_NO_READ_sPLT # define PNG_READ_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED #endif #ifndef PNG_NO_READ_sRGB # define PNG_READ_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED #endif #ifndef PNG_NO_READ_tEXt # define PNG_READ_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED #endif #ifndef PNG_NO_READ_tIME # define PNG_READ_tIME_SUPPORTED # define PNG_tIME_SUPPORTED #endif #ifndef PNG_NO_READ_tRNS # define PNG_READ_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED #endif #ifndef PNG_NO_READ_zTXt # define PNG_READ_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED #endif #ifndef PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif #endif #if !defined(PNG_NO_READ_USER_CHUNKS) && \ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) # define PNG_READ_USER_CHUNKS_SUPPORTED # define PNG_USER_CHUNKS_SUPPORTED # ifdef PNG_NO_READ_UNKNOWN_CHUNKS # undef PNG_NO_READ_UNKNOWN_CHUNKS # endif # ifdef PNG_NO_HANDLE_AS_UNKNOWN # undef PNG_NO_HANDLE_AS_UNKNOWN # endif #endif #ifndef PNG_NO_READ_OPT_PLTE # define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ #endif /* optional PLTE chunk in RGB and RGBA images */ #if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ defined(PNG_READ_zTXt_SUPPORTED) # define PNG_READ_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED #endif #endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ #ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_WRITE_TEXT # define PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_tEXt # define PNG_NO_WRITE_zTXt #endif #ifndef PNG_NO_WRITE_bKGD # define PNG_WRITE_bKGD_SUPPORTED # ifndef PNG_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_cHRM # define PNG_WRITE_cHRM_SUPPORTED # ifndef PNG_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_gAMA # define PNG_WRITE_gAMA_SUPPORTED # ifndef PNG_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_hIST # define PNG_WRITE_hIST_SUPPORTED # ifndef PNG_hIST_SUPPORTED # define PNG_hIST_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iCCP # define PNG_WRITE_iCCP_SUPPORTED # ifndef PNG_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iTXt # ifndef PNG_WRITE_iTXt_SUPPORTED # define PNG_WRITE_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_oFFs # define PNG_WRITE_oFFs_SUPPORTED # ifndef PNG_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pCAL # define PNG_WRITE_pCAL_SUPPORTED # ifndef PNG_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sCAL # define PNG_WRITE_sCAL_SUPPORTED # ifndef PNG_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pHYs # define PNG_WRITE_pHYs_SUPPORTED # ifndef PNG_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sBIT # define PNG_WRITE_sBIT_SUPPORTED # ifndef PNG_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sPLT # define PNG_WRITE_sPLT_SUPPORTED # ifndef PNG_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sRGB # define PNG_WRITE_sRGB_SUPPORTED # ifndef PNG_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tEXt # define PNG_WRITE_tEXt_SUPPORTED # ifndef PNG_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tIME # define PNG_WRITE_tIME_SUPPORTED # ifndef PNG_tIME_SUPPORTED # define PNG_tIME_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tRNS # define PNG_WRITE_tRNS_SUPPORTED # ifndef PNG_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_zTXt # define PNG_WRITE_zTXt_SUPPORTED # ifndef PNG_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif # endif #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ defined(PNG_WRITE_zTXt_SUPPORTED) # define PNG_WRITE_TEXT_SUPPORTED # ifndef PNG_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED # endif #endif #endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ /* Turn this off to disable png_read_png() and * png_write_png() and leave the row_pointers member * out of the info structure. */ #ifndef PNG_NO_INFO_IMAGE # define PNG_INFO_IMAGE_SUPPORTED #endif /* need the time information for reading tIME chunks */ #if defined(PNG_tIME_SUPPORTED) # if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ # include # endif #endif /* Some typedefs to get us started. These should be safe on most of the * common platforms. The typedefs should be at least as large as the * numbers suggest (a png_uint_32 must be at least 32 bits long), but they * don't have to be exactly that size. Some compilers dislike passing * unsigned shorts as function parameters, so you may be better off using * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may * want to have unsigned int for png_uint_32 instead of unsigned long. */ typedef unsigned long png_uint_32; typedef long png_int_32; typedef unsigned short png_uint_16; typedef short png_int_16; typedef unsigned char png_byte; /* This is usually size_t. It is typedef'ed just in case you need it to change (I'm not sure if you will or not, so I thought I'd be safe) */ #ifdef PNG_SIZE_T typedef PNG_SIZE_T png_size_t; # define png_sizeof(x) png_convert_size(sizeof(x)) #else typedef size_t png_size_t; # define png_sizeof(x) sizeof(x) #endif /* The following is needed for medium model support. It cannot be in the * PNG_INTERNAL section. Needs modification for other compilers besides * MSC. Model independent support declares all arrays and pointers to be * large using the far keyword. The zlib version used must also support * model independent data. As of version zlib 1.0.4, the necessary changes * have been made in zlib. The USE_FAR_KEYWORD define triggers other * changes that are needed. (Tim Wegner) */ /* Separate compiler dependencies (problem here is that zlib.h always defines FAR. (SJT) */ #ifdef __BORLANDC__ # if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) # define LDATA 1 # else # define LDATA 0 # endif /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ # if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) # define PNG_MAX_MALLOC_64K # if (LDATA != 1) # ifndef FAR # define FAR __far # endif # define USE_FAR_KEYWORD # endif /* LDATA != 1 */ /* Possibly useful for moving data out of default segment. * Uncomment it if you want. Could also define FARDATA as * const if your compiler supports it. (SJT) # define FARDATA FAR */ # endif /* __WIN32__, __FLAT__, __CYGWIN__ */ #endif /* __BORLANDC__ */ /* Suggest testing for specific compiler first before testing for * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, * making reliance oncertain keywords suspect. (SJT) */ /* MSC Medium model */ #if defined(FAR) # if defined(M_I86MM) # define USE_FAR_KEYWORD # define FARDATA FAR # include # endif #endif /* SJT: default case */ #ifndef FAR # define FAR #endif /* At this point FAR is always defined */ #ifndef FARDATA # define FARDATA #endif /* Typedef for floating-point numbers that are converted to fixed-point with a multiple of 100,000, e.g., int_gamma */ typedef png_int_32 png_fixed_point; /* Add typedefs for pointers */ typedef void FAR * png_voidp; typedef png_byte FAR * png_bytep; typedef png_uint_32 FAR * png_uint_32p; typedef png_int_32 FAR * png_int_32p; typedef png_uint_16 FAR * png_uint_16p; typedef png_int_16 FAR * png_int_16p; typedef PNG_CONST char FAR * png_const_charp; typedef char FAR * png_charp; typedef png_fixed_point FAR * png_fixed_point_p; #ifndef PNG_NO_STDIO #if defined(_WIN32_WCE) typedef HANDLE png_FILE_p; #else typedef FILE * png_FILE_p; #endif #endif #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * png_doublep; #endif /* Pointers to pointers; i.e. arrays */ typedef png_byte FAR * FAR * png_bytepp; typedef png_uint_32 FAR * FAR * png_uint_32pp; typedef png_int_32 FAR * FAR * png_int_32pp; typedef png_uint_16 FAR * FAR * png_uint_16pp; typedef png_int_16 FAR * FAR * png_int_16pp; typedef PNG_CONST char FAR * FAR * png_const_charpp; typedef char FAR * FAR * png_charpp; typedef png_fixed_point FAR * FAR * png_fixed_point_pp; #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * FAR * png_doublepp; #endif /* Pointers to pointers to pointers; i.e., pointer to array */ typedef char FAR * FAR * FAR * png_charppp; #if defined(PNG_1_0_X) || defined(PNG_1_2_X) /* SPC - Is this stuff deprecated? */ /* It'll be removed as of libpng-1.3.0 - GR-P */ /* libpng typedefs for types in zlib. If zlib changes * or another compression library is used, then change these. * Eliminates need to change all the source files. */ typedef charf * png_zcharp; typedef charf * FAR * png_zcharpp; typedef z_stream FAR * png_zstreamp; #endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ /* * Define PNG_BUILD_DLL if the module being built is a Windows * LIBPNG DLL. * * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. * It is equivalent to Microsoft predefined macro _DLL that is * automatically defined when you compile using the share * version of the CRT (C Run-Time library) * * The cygwin mods make this behavior a little different: * Define PNG_BUILD_DLL if you are building a dll for use with cygwin * Define PNG_STATIC if you are building a static library for use with cygwin, * -or- if you are building an application that you want to link to the * static library. * PNG_USE_DLL is defined by default (no user action needed) unless one of * the other flags is defined. */ #if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) # define PNG_DLL #endif /* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. * When building a static lib, default to no GLOBAL ARRAYS, but allow * command-line override */ #if defined(__CYGWIN__) # if !defined(PNG_STATIC) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # if !defined(PNG_USE_LOCAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif # else # if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # endif # endif # if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif #endif /* Do not use global arrays (helps with building DLL's) * They are no longer used in libpng itself, since version 1.0.5c, * but might be required for some pre-1.0.5c applications. */ #if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # if defined(PNG_NO_GLOBAL_ARRAYS) || \ (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) # define PNG_USE_LOCAL_ARRAYS # else # define PNG_USE_GLOBAL_ARRAYS # endif #endif #if defined(__CYGWIN__) # undef PNGAPI # define PNGAPI __cdecl # undef PNG_IMPEXP # define PNG_IMPEXP #endif /* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", * you may get warnings regarding the linkage of png_zalloc and png_zfree. * Don't ignore those warnings; you must also reset the default calling * convention in your compiler to match your PNGAPI, and you must build * zlib and your applications the same way you build libpng. */ #if defined(__MINGW32__) && !defined(PNG_MODULEDEF) # ifndef PNG_NO_MODULEDEF # define PNG_NO_MODULEDEF # endif #endif #if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) # define PNG_IMPEXP #endif #if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ (( defined(_Windows) || defined(_WINDOWS) || \ defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) # ifndef PNGAPI # if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) # define PNGAPI __cdecl # else # define PNGAPI _cdecl # endif # endif # if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) # define PNG_IMPEXP # endif # if !defined(PNG_IMPEXP) # define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol # define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol /* Borland/Microsoft */ # if defined(_MSC_VER) || defined(__BORLANDC__) # if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) # define PNG_EXPORT PNG_EXPORT_TYPE1 # else # define PNG_EXPORT PNG_EXPORT_TYPE2 # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __export # else # define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in VC++ */ # endif /* Exists in Borland C++ for C++ classes (== huge) */ # endif # endif # if !defined(PNG_IMPEXP) # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __declspec(dllexport) # else # define PNG_IMPEXP __declspec(dllimport) # endif # endif # endif /* PNG_IMPEXP */ #else /* !(DLL || non-cygwin WINDOWS) */ # if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) # ifndef PNGAPI # define PNGAPI _System # endif # else # if 0 /* ... other platforms, with other meanings */ # endif # endif #endif #ifndef PNGAPI # define PNGAPI #endif #ifndef PNG_IMPEXP # define PNG_IMPEXP #endif #ifdef PNG_BUILDSYMS # ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END # endif # ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT # endif # endif #endif #ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol #endif #ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type # endif #endif /* User may want to use these so they are not in PNG_INTERNAL. Any library * functions that are passed far data must be model independent. */ #ifndef PNG_ABORT # define PNG_ABORT() abort() #endif #ifdef PNG_SETJMP_SUPPORTED # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #else # define png_jmpbuf(png_ptr) \ (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) #endif #if defined(USE_FAR_KEYWORD) /* memory model independent fns */ /* use this to make far-to-near assignments */ # define CHECK 1 # define NOCHECK 0 # define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) # define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) # define png_snprintf _fsnprintf /* Added to v 1.2.19 */ # define png_strlen _fstrlen # define png_memcmp _fmemcmp /* SJT: added */ # define png_memcpy _fmemcpy # define png_memset _fmemset #else /* use the usual functions */ # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # ifndef PNG_NO_SNPRINTF # ifdef _MSC_VER # define png_snprintf _snprintf /* Added to v 1.2.19 */ # define png_snprintf2 _snprintf # define png_snprintf6 _snprintf # else # define png_snprintf snprintf /* Added to v 1.2.19 */ # define png_snprintf2 snprintf # define png_snprintf6 snprintf # endif # else /* You don't have or don't want to use snprintf(). Caution: Using * sprintf instead of snprintf exposes your application to accidental * or malevolent buffer overflows. If you don't have snprintf() * as a general rule you should provide one (you can get one from * Portable OpenSSH). */ # define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) # define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) # define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) # endif # define png_strlen strlen # define png_memcmp memcmp /* SJT: added */ # define png_memcpy memcpy # define png_memset memset #endif /* End of memory model independent support */ /* Just a little check that someone hasn't tried to define something * contradictory. */ #if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) # undef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 65536L #endif /* Added at libpng-1.2.8 */ #endif /* PNG_VERSION_INFO_ONLY */ #endif /* PNGCONF_H */ angband-v3.3.2/src/win/include/libpng12/png.h0000644000175000017500000045435711651552410020213 0ustar chriscchrisc/* png.h - header file for PNG reference library * * libpng version 1.2.37 - June 4, 2009 * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.2.37 - June 4, 2009: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: * * Due to various miscommunications, unforeseen code incompatibilities * and occasional factors outside the authors' control, version numbering * on the library has not always been consistent and straightforward. * The following table summarizes matters since version 0.89c, which was * the first widely used release: * * source png.h png.h shared-lib * version string int version * ------- ------ ----- ---------- * 0.89c "1.0 beta 3" 0.89 89 1.0.89 * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] * 0.97c 0.97 97 2.0.97 * 0.98 0.98 98 2.0.98 * 0.99 0.99 98 2.0.99 * 0.99a-m 0.99 99 2.0.99 * 1.00 1.00 100 2.1.0 [100 should be 10000] * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] * 1.0.1 png.h string is 10001 2.1.0 * 1.0.1a-e identical to the 10002 from here on, the shared library * 1.0.2 source version) 10002 is 2.V where V is the source code * 1.0.2a-b 10003 version, except as noted. * 1.0.3 10003 * 1.0.3a-d 10004 * 1.0.4 10004 * 1.0.4a-f 10005 * 1.0.5 (+ 2 patches) 10005 * 1.0.5a-d 10006 * 1.0.5e-r 10100 (not source compatible) * 1.0.5s-v 10006 (not binary compatible) * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) * 1.0.6d-f 10007 (still binary incompatible) * 1.0.6g 10007 * 1.0.6h 10007 10.6h (testing xy.z so-numbering) * 1.0.6i 10007 10.6i * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) * 1.0.7 1 10007 (still compatible) * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 * 1.0.8rc1 1 10008 2.1.0.8rc1 * 1.0.8 1 10008 2.1.0.8 * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 * 1.0.9rc1 1 10009 2.1.0.9rc1 * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 * 1.0.9rc2 1 10009 2.1.0.9rc2 * 1.0.9 1 10009 2.1.0.9 * 1.0.10beta1 1 10010 2.1.0.10beta1 * 1.0.10rc1 1 10010 2.1.0.10rc1 * 1.0.10 1 10010 2.1.0.10 * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 * 1.0.11rc1 1 10011 2.1.0.11rc1 * 1.0.11 1 10011 2.1.0.11 * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 * 1.0.12rc1 2 10012 2.1.0.12rc1 * 1.0.12 2 10012 2.1.0.12 * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 * 1.2.0rc1 3 10200 3.1.2.0rc1 * 1.2.0 3 10200 3.1.2.0 * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 * 1.2.1 3 10201 3.1.2.1 * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 * 1.0.13 10 10013 10.so.0.1.0.13 * 1.2.2 12 10202 12.so.0.1.2.2 * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 * 1.2.3 12 10203 12.so.0.1.2.3 * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 * 1.0.14 10 10014 10.so.0.1.0.14 * 1.2.4 13 10204 12.so.0.1.2.4 * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 * 1.0.15 10 10015 10.so.0.1.0.15 * 1.2.5 13 10205 12.so.0.1.2.5 * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 * 1.0.16 10 10016 10.so.0.1.0.16 * 1.2.6 13 10206 12.so.0.1.2.6 * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 * 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 * 1.0.17 10 10017 10.so.0.1.0.17 * 1.2.7 13 10207 12.so.0.1.2.7 * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 * 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 * 1.0.18 10 10018 10.so.0.1.0.18 * 1.2.8 13 10208 12.so.0.1.2.8 * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 * 1.2.9beta4-11 13 10209 12.so.0.9[.0] * 1.2.9rc1 13 10209 12.so.0.9[.0] * 1.2.9 13 10209 12.so.0.9[.0] * 1.2.10beta1-8 13 10210 12.so.0.10[.0] * 1.2.10rc1-3 13 10210 12.so.0.10[.0] * 1.2.10 13 10210 12.so.0.10[.0] * 1.2.11beta1-4 13 10211 12.so.0.11[.0] * 1.0.19rc1-5 10 10019 10.so.0.19[.0] * 1.2.11rc1-5 13 10211 12.so.0.11[.0] * 1.0.19 10 10019 10.so.0.19[.0] * 1.2.11 13 10211 12.so.0.11[.0] * 1.0.20 10 10020 10.so.0.20[.0] * 1.2.12 13 10212 12.so.0.12[.0] * 1.2.13beta1 13 10213 12.so.0.13[.0] * 1.0.21 10 10021 10.so.0.21[.0] * 1.2.13 13 10213 12.so.0.13[.0] * 1.2.14beta1-2 13 10214 12.so.0.14[.0] * 1.0.22rc1 10 10022 10.so.0.22[.0] * 1.2.14rc1 13 10214 12.so.0.14[.0] * 1.0.22 10 10022 10.so.0.22[.0] * 1.2.14 13 10214 12.so.0.14[.0] * 1.2.15beta1-6 13 10215 12.so.0.15[.0] * 1.0.23rc1-5 10 10023 10.so.0.23[.0] * 1.2.15rc1-5 13 10215 12.so.0.15[.0] * 1.0.23 10 10023 10.so.0.23[.0] * 1.2.15 13 10215 12.so.0.15[.0] * 1.2.16beta1-2 13 10216 12.so.0.16[.0] * 1.2.16rc1 13 10216 12.so.0.16[.0] * 1.0.24 10 10024 10.so.0.24[.0] * 1.2.16 13 10216 12.so.0.16[.0] * 1.2.17beta1-2 13 10217 12.so.0.17[.0] * 1.0.25rc1 10 10025 10.so.0.25[.0] * 1.2.17rc1-3 13 10217 12.so.0.17[.0] * 1.0.25 10 10025 10.so.0.25[.0] * 1.2.17 13 10217 12.so.0.17[.0] * 1.0.26 10 10026 10.so.0.26[.0] * 1.2.18 13 10218 12.so.0.18[.0] * 1.2.19beta1-31 13 10219 12.so.0.19[.0] * 1.0.27rc1-6 10 10027 10.so.0.27[.0] * 1.2.19rc1-6 13 10219 12.so.0.19[.0] * 1.0.27 10 10027 10.so.0.27[.0] * 1.2.19 13 10219 12.so.0.19[.0] * 1.2.20beta01-04 13 10220 12.so.0.20[.0] * 1.0.28rc1-6 10 10028 10.so.0.28[.0] * 1.2.20rc1-6 13 10220 12.so.0.20[.0] * 1.0.28 10 10028 10.so.0.28[.0] * 1.2.20 13 10220 12.so.0.20[.0] * 1.2.21beta1-2 13 10221 12.so.0.21[.0] * 1.2.21rc1-3 13 10221 12.so.0.21[.0] * 1.0.29 10 10029 10.so.0.29[.0] * 1.2.21 13 10221 12.so.0.21[.0] * 1.2.22beta1-4 13 10222 12.so.0.22[.0] * 1.0.30rc1 10 10030 10.so.0.30[.0] * 1.2.22rc1 13 10222 12.so.0.22[.0] * 1.0.30 10 10030 10.so.0.30[.0] * 1.2.22 13 10222 12.so.0.22[.0] * 1.2.23beta01-05 13 10223 12.so.0.23[.0] * 1.2.23rc01 13 10223 12.so.0.23[.0] * 1.2.23 13 10223 12.so.0.23[.0] * 1.2.24beta01-02 13 10224 12.so.0.24[.0] * 1.2.24rc01 13 10224 12.so.0.24[.0] * 1.2.24 13 10224 12.so.0.24[.0] * 1.2.25beta01-06 13 10225 12.so.0.25[.0] * 1.2.25rc01-02 13 10225 12.so.0.25[.0] * 1.0.31 10 10031 10.so.0.31[.0] * 1.2.25 13 10225 12.so.0.25[.0] * 1.2.26beta01-06 13 10226 12.so.0.26[.0] * 1.2.26rc01 13 10226 12.so.0.26[.0] * 1.2.26 13 10226 12.so.0.26[.0] * 1.0.32 10 10032 10.so.0.32[.0] * 1.2.27beta01-06 13 10227 12.so.0.27[.0] * 1.2.27rc01 13 10227 12.so.0.27[.0] * 1.0.33 10 10033 10.so.0.33[.0] * 1.2.27 13 10227 12.so.0.27[.0] * 1.0.34 10 10034 10.so.0.34[.0] * 1.2.28 13 10228 12.so.0.28[.0] * 1.2.29beta01-03 13 10229 12.so.0.29[.0] * 1.2.29rc01 13 10229 12.so.0.29[.0] * 1.0.35 10 10035 10.so.0.35[.0] * 1.2.29 13 10229 12.so.0.29[.0] * 1.0.37 10 10037 10.so.0.37[.0] * 1.2.30beta01-04 13 10230 12.so.0.30[.0] * 1.0.38rc01-08 10 10038 10.so.0.38[.0] * 1.2.30rc01-08 13 10230 12.so.0.30[.0] * 1.0.38 10 10038 10.so.0.38[.0] * 1.2.30 13 10230 12.so.0.30[.0] * 1.0.39rc01-03 10 10039 10.so.0.39[.0] * 1.2.31rc01-03 13 10231 12.so.0.31[.0] * 1.0.39 10 10039 10.so.0.39[.0] * 1.2.31 13 10231 12.so.0.31[.0] * 1.2.32beta01-02 13 10232 12.so.0.32[.0] * 1.0.40rc01 10 10040 10.so.0.40[.0] * 1.2.32rc01 13 10232 12.so.0.32[.0] * 1.0.40 10 10040 10.so.0.40[.0] * 1.2.32 13 10232 12.so.0.32[.0] * 1.2.33beta01-02 13 10233 12.so.0.33[.0] * 1.2.33rc01-02 13 10233 12.so.0.33[.0] * 1.0.41rc01 10 10041 10.so.0.41[.0] * 1.2.33 13 10233 12.so.0.33[.0] * 1.0.41 10 10041 10.so.0.41[.0] * 1.2.34beta01-07 13 10234 12.so.0.34[.0] * 1.0.42rc01 10 10042 10.so.0.42[.0] * 1.2.34rc01 13 10234 12.so.0.34[.0] * 1.0.42 10 10042 10.so.0.42[.0] * 1.2.34 13 10234 12.so.0.34[.0] * 1.2.35beta01-03 13 10235 12.so.0.35[.0] * 1.0.43rc01-02 10 10043 10.so.0.43[.0] * 1.2.35rc01-02 13 10235 12.so.0.35[.0] * 1.0.43 10 10043 10.so.0.43[.0] * 1.2.35 13 10235 12.so.0.35[.0] * 1.2.36beta01-05 13 10236 12.so.0.36[.0] * 1.2.36rc01 13 10236 12.so.0.36[.0] * 1.0.44 10 10044 10.so.0.44[.0] * 1.2.36 13 10236 12.so.0.36[.0] * 1.2.37beta01-03 13 10237 12.so.0.37[.0] * 1.2.37rc01 13 10237 12.so.0.37[.0] * 1.2.37 13 10237 12.so.0.37[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be * used for changes in backward compatibility, as it is intended. The * PNG_LIBPNG_VER macro, which is not used within libpng but is available * for applications, is an unsigned integer of the form xyyzz corresponding * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public * release number plus "betaNN" or "rcNN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled * application is loaded with a different version of the library. * * DLLNUM will change each time there are forward or backward changes * in binary compatibility (e.g., when a new feature is added). * * See libpng.txt or libpng.3 for more information. The PNG specification * is available as a W3C Recommendation and as an ISO Specification, * defines should NOT be changed. */ #define PNG_INFO_gAMA 0x0001 #define PNG_INFO_sBIT 0x0002 #define PNG_INFO_cHRM 0x0004 #define PNG_INFO_PLTE 0x0008 #define PNG_INFO_tRNS 0x0010 #define PNG_INFO_bKGD 0x0020 #define PNG_INFO_hIST 0x0040 #define PNG_INFO_pHYs 0x0080 #define PNG_INFO_oFFs 0x0100 #define PNG_INFO_tIME 0x0200 #define PNG_INFO_pCAL 0x0400 #define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ #define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ #define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ #define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using * the routines for other purposes. */ typedef struct png_row_info_struct { png_uint_32 width; /* width of row */ png_uint_32 rowbytes; /* number of bytes in row */ png_byte color_type; /* color type of row */ png_byte bit_depth; /* bit depth of row */ png_byte channels; /* number of channels (1, 2, 3, or 4) */ png_byte pixel_depth; /* bits per pixel (depth * channels) */ } png_row_info; typedef png_row_info FAR * png_row_infop; typedef png_row_info FAR * FAR * png_row_infopp; /* These are the function types for the I/O functions and for the functions * that allow the user to override the default I/O functions with his or her * own. The png_error_ptr type should match that of user-supplied warning * and error functions, while the png_rw_ptr type should match that of the * user read/write data functions. */ typedef struct png_struct_def png_struct; typedef png_struct FAR * png_structp; typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, int)); typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, int)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, png_uint_32, int)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, png_row_infop, png_bytep)); #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); #endif /* Transform masks for the high-level interface */ #define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ #define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ #define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ #define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ #define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ #define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ #define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ #define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ #define PNG_TRANSFORM_BGR 0x0080 /* read and write */ #define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ #define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ #define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ #define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only, deprecated */ /* Added to libpng-1.2.34 */ #define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* WRITE only */ #define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* WRITE only */ /* Flags for MNG supported features */ #define PNG_FLAG_MNG_EMPTY_PLTE 0x01 #define PNG_FLAG_MNG_FILTER_64 0x04 #define PNG_ALL_MNG_FEATURES 0x05 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); /* The structure that holds the information to read and write PNG files. * The only people who need to care about what is inside of this are the * people who will be modifying the library for their own special needs. * It should NOT be accessed directly by an application, except to store * the jmp_buf. */ struct png_struct_def { #ifdef PNG_SETJMP_SUPPORTED jmp_buf jmpbuf; /* used in png_error */ #endif png_error_ptr error_fn; /* function for printing errors and aborting */ png_error_ptr warning_fn; /* function for printing warnings */ png_voidp error_ptr; /* user supplied struct for error functions */ png_rw_ptr write_data_fn; /* function for writing output data */ png_rw_ptr read_data_fn; /* function for reading input data */ png_voidp io_ptr; /* ptr to application struct for I/O functions */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr read_user_transform_fn; /* user read transform */ #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr write_user_transform_fn; /* user write transform */ #endif /* These were added in libpng-1.0.2 */ #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_voidp user_transform_ptr; /* user supplied struct for user transform */ png_byte user_transform_depth; /* bit depth of user transformed pixels */ png_byte user_transform_channels; /* channels in user transformed pixels */ #endif #endif png_uint_32 mode; /* tells us where we are in the PNG file */ png_uint_32 flags; /* flags indicating various things to libpng */ png_uint_32 transformations; /* which transformations to perform */ z_stream zstream; /* pointer to decompression structure (below) */ png_bytep zbuf; /* buffer for zlib */ png_size_t zbuf_size; /* size of zbuf */ int zlib_level; /* holds zlib compression level */ int zlib_method; /* holds zlib compression method */ int zlib_window_bits; /* holds zlib compression window bits */ int zlib_mem_level; /* holds zlib compression memory level */ int zlib_strategy; /* holds zlib compression strategy */ png_uint_32 width; /* width of image in pixels */ png_uint_32 height; /* height of image in pixels */ png_uint_32 num_rows; /* number of rows in current pass */ png_uint_32 usr_width; /* width of row at start of write */ png_uint_32 rowbytes; /* size of row in bytes */ png_uint_32 irowbytes; /* size of current interlaced row in bytes */ png_uint_32 iwidth; /* width of current interlaced row in pixels */ png_uint_32 row_number; /* current row in interlace pass */ png_bytep prev_row; /* buffer to save previous (unfiltered) row */ png_bytep row_buf; /* buffer to save current (unfiltered) row */ #ifndef PNG_NO_WRITE_FILTER png_bytep sub_row; /* buffer to save "sub" row when filtering */ png_bytep up_row; /* buffer to save "up" row when filtering */ png_bytep avg_row; /* buffer to save "avg" row when filtering */ png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ #endif png_row_info row_info; /* used for transformation routines */ png_uint_32 idat_size; /* current IDAT size for read */ png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ png_uint_16 num_trans; /* number of transparency values */ png_byte chunk_name[5]; /* null-terminated name of current chunk */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ png_byte pass; /* current interlace pass (0 - 6) */ png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ png_byte color_type; /* color type of file */ png_byte bit_depth; /* bit depth of file */ png_byte usr_bit_depth; /* bit depth of users row */ png_byte pixel_depth; /* number of bits per pixel */ png_byte channels; /* number of channels in file */ png_byte usr_channels; /* channels at start of write */ png_byte sig_bytes; /* magic bytes read/written from start of file */ #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) #ifdef PNG_LEGACY_SUPPORTED png_byte filler; /* filler byte for pixel expansion */ #else png_uint_16 filler; /* filler bytes for pixel expansion */ #endif #endif #if defined(PNG_bKGD_SUPPORTED) png_byte background_gamma_type; # ifdef PNG_FLOATING_POINT_SUPPORTED float background_gamma; # endif png_color_16 background; /* background color in screen gamma space */ #if defined(PNG_READ_GAMMA_SUPPORTED) png_color_16 background_1; /* background normalized to gamma 1.0 */ #endif #endif /* PNG_bKGD_SUPPORTED */ #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_flush_ptr output_flush_fn;/* Function for flushing output */ png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ png_uint_32 flush_rows; /* number of rows written since last flush */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ #ifdef PNG_FLOATING_POINT_SUPPORTED float gamma; /* file gamma value */ float screen_gamma; /* screen gamma value (display_exponent) */ #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep gamma_table; /* gamma table for 8-bit depth files */ png_bytep gamma_from_1; /* converts from 1.0 to screen */ png_bytep gamma_to_1; /* converts from file to 1.0 */ png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) png_color_8 sig_bit; /* significant bits in each available channel */ #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) png_color_8 shift; /* shift for significant bit tranformation */ #endif #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep trans; /* transparency values for paletted files */ png_color_16 trans_values; /* transparency values for non-paletted files */ #endif png_read_status_ptr read_row_fn; /* called after each row is decoded */ png_write_status_ptr write_row_fn; /* called after each row is encoded */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_progressive_info_ptr info_fn; /* called after header data fully read */ png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ png_progressive_end_ptr end_fn; /* called after image is complete */ png_bytep save_buffer_ptr; /* current location in save_buffer */ png_bytep save_buffer; /* buffer for previously read data */ png_bytep current_buffer_ptr; /* current location in current_buffer */ png_bytep current_buffer; /* buffer for recently used data */ png_uint_32 push_length; /* size of current input chunk */ png_uint_32 skip_length; /* bytes to skip in input data */ png_size_t save_buffer_size; /* amount of data now in save_buffer */ png_size_t save_buffer_max; /* total size of save_buffer */ png_size_t buffer_size; /* total amount of available input data */ png_size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ # if defined(PNG_TEXT_SUPPORTED) png_size_t current_text_size; /* current size of text input data */ png_size_t current_text_left; /* how much text left to read in input */ png_charp current_text; /* current text chunk buffer */ png_charp current_text_ptr; /* current location in current_text */ # endif /* PNG_TEXT_SUPPORTED */ #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* for the Borland special 64K segment handler */ png_bytepp offset_table_ptr; png_bytep offset_table; png_uint_16 offset_table_number; png_uint_16 offset_table_count; png_uint_16 offset_table_count_free; #endif #if defined(PNG_READ_DITHER_SUPPORTED) png_bytep palette_lookup; /* lookup table for dithering */ png_bytep dither_index; /* index translation for palette files */ #endif #if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) png_uint_16p hist; /* histogram */ #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_byte heuristic_method; /* heuristic for row filter selection */ png_byte num_prev_filters; /* number of weights for previous rows */ png_bytep prev_filters; /* filter type(s) of previous row(s) */ png_uint_16p filter_weights; /* weight(s) for previous line(s) */ png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ png_uint_16p filter_costs; /* relative filter calculation cost */ png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) png_charp time_buffer; /* String to hold RFC 1123 time text */ #endif /* New members added in libpng-1.0.6 */ #ifdef PNG_FREE_ME_SUPPORTED png_uint_32 free_me; /* flags items libpng is responsible for freeing */ #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) png_voidp user_chunk_ptr; png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) int num_chunk_list; png_bytep chunk_list; #endif /* New members added in libpng-1.0.3 */ #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) png_byte rgb_to_gray_status; /* These were changed from png_byte in libpng-1.0.6 */ png_uint_16 rgb_to_gray_red_coeff; png_uint_16 rgb_to_gray_green_coeff; png_uint_16 rgb_to_gray_blue_coeff; #endif /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ #if defined(PNG_MNG_FEATURES_SUPPORTED) || \ defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* changed from png_byte to png_uint_32 at version 1.2.0 */ #ifdef PNG_1_0_X png_byte mng_features_permitted; #else png_uint_32 mng_features_permitted; #endif /* PNG_1_0_X */ #endif /* New member added in libpng-1.0.7 */ #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_fixed_point int_gamma; #endif /* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ #if defined(PNG_MNG_FEATURES_SUPPORTED) png_byte filter_type; #endif #if defined(PNG_1_0_X) /* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ png_uint_32 row_buf_size; #endif /* New members added in libpng-1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) # if !defined(PNG_1_0_X) # if defined(PNG_MMX_CODE_SUPPORTED) png_byte mmx_bitdepth_threshold; png_uint_32 mmx_rowbytes_threshold; # endif png_uint_32 asm_flags; # endif #endif /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ #ifdef PNG_USER_MEM_SUPPORTED png_voidp mem_ptr; /* user supplied struct for mem functions */ png_malloc_ptr malloc_fn; /* function for allocating memory */ png_free_ptr free_fn; /* function for freeing memory */ #endif /* New member added in libpng-1.0.13 and 1.2.0 */ png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ #if defined(PNG_READ_DITHER_SUPPORTED) /* The following three members were added at version 1.0.14 and 1.2.4 */ png_bytep dither_sort; /* working sort array */ png_bytep index_to_palette; /* where the original index currently is */ /* in the palette */ png_bytep palette_to_index; /* which original index points to this */ /* palette color */ #endif /* New members added in libpng-1.0.16 and 1.2.6 */ png_byte compression_type; #ifdef PNG_SET_USER_LIMITS_SUPPORTED png_uint_32 user_width_max; png_uint_32 user_height_max; #endif /* New member added in libpng-1.0.25 and 1.2.17 */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* storage for unknown chunk that the library doesn't recognize. */ png_unknown_chunk unknown_chunk; #endif /* New members added in libpng-1.2.26 */ png_uint_32 old_big_row_buf_size, old_prev_row_size; /* New member added in libpng-1.2.30 */ png_charp chunkdata; /* buffer for reading chunk data */ }; /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ typedef png_structp version_1_2_37; typedef png_struct FAR * FAR * png_structpp; /* Here are the function definitions most commonly used. This is not * the place to find out how to use libpng. See libpng.txt for the * full explanation, see example.c for the summary. This just provides * a simple one line description of the use of each function. */ /* Returns the version number of the library */ extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); /* Tell lib we have already handled the first magic bytes. * Handling more than 8 bytes from the beginning of the file is an error. */ extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, int num_bytes)); /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a * PNG file. Returns zero if the supplied bytes match the 8-byte PNG * signature, and non-zero otherwise. Having num_to_check == 0 or * start > 7 will always fail (ie return non-zero). */ extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, png_size_t num_to_check)); /* Simple signature checking function. This is the same as calling * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). */ extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); /* Allocate and initialize png_ptr struct for reading, and any other memory. */ extern PNG_EXPORT(png_structp,png_create_read_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); /* Allocate and initialize png_ptr struct for writing, and any other memory */ extern PNG_EXPORT(png_structp,png_create_write_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(void,png_set_compression_buffer_size) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* Reset the compression stream */ extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_structp,png_create_read_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); extern PNG_EXPORT(png_structp,png_create_write_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); #endif /* Write a PNG chunk - size, type, (optional) data, CRC. */ extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length)); /* Write the start of a PNG chunk - length and chunk name. */ extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_uint_32 length)); /* Write the data of a PNG chunk started with png_write_chunk_start(). */ extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Finish a chunk started with png_write_chunk_start() (includes CRC). */ extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); /* Allocate and initialize the info structure */ extern PNG_EXPORT(png_infop,png_create_info_struct) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize the info structure (old interface - DEPRECATED) */ extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); #undef png_info_init #define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ png_sizeof(png_info)); #endif extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, png_size_t png_info_struct_size)); /* Writes all the PNG information before the image. */ extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the information before the actual image data. */ extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) PNGARG((png_structp png_ptr, png_timep ptime)); #endif #if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ #if defined(PNG_WRITE_tIME_SUPPORTED) /* convert from a struct tm to png_time */ extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, struct tm FAR * ttime)); /* convert from time_t to png_time. Uses gmtime() */ extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, time_t ttime)); #endif /* PNG_WRITE_tIME_SUPPORTED */ #endif /* _WIN32_WCE */ #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated */ extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* Use blue, green, red order for pixels. */ extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* Expand the grayscale to 24-bit RGB if necessary. */ extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) /* Reduce RGB to grayscale. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, int error_action, double red, double green )); #endif extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, int error_action, png_fixed_point red, png_fixed_point green )); extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, png_colorp palette)); #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) /* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); /* The values of the PNG_FILLER_ defines should NOT be changed */ #define PNG_FILLER_BEFORE 0 #define PNG_FILLER_AFTER 1 /* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); #endif #endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swap bytes in 16-bit depth files. */ extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* Swap packing order of pixels in bytes. */ extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) /* Converts files to legal bit depths. */ extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, png_color_8p true_bits)); #endif #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) /* Have the code handle the interlacing. Returns the number of passes. */ extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) /* Invert monochrome files */ extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) /* Handle alpha and tRNS by replacing with a background color. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, png_color_16p background_color, int background_gamma_code, int need_expand, double background_gamma)); #endif #define PNG_BACKGROUND_GAMMA_UNKNOWN 0 #define PNG_BACKGROUND_GAMMA_SCREEN 1 #define PNG_BACKGROUND_GAMMA_FILE 2 #define PNG_BACKGROUND_GAMMA_UNIQUE 3 #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) /* strip the second byte of information from a 16-bit depth file. */ extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) /* Turn on dithering, and reduce the palette to the number of colors available. */ extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, png_colorp palette, int num_palette, int maximum_colors, png_uint_16p histogram, int full_dither)); #endif #if defined(PNG_READ_GAMMA_SUPPORTED) /* Handle gamma correction. Screen_gamma=(display_exponent) */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, double screen_gamma, double default_file_gamma)); #endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ /* Deprecated and will be removed. Use png_permit_mng_features() instead. */ extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, int empty_plte_permitted)); #endif #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) /* Set how many lines between output flushes - 0 for no flushing */ extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); /* Flush the current PNG output buffer */ extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); #endif /* optional update palette with requested transformations */ extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read one or more rows of image data. */ extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read a row of data. */ extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, png_bytep row, png_bytep display_row)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the whole image into memory at once. */ extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, png_bytepp image)); #endif /* write a row of image data */ extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, png_bytep row)); /* write a few rows of image data */ extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_uint_32 num_rows)); /* write the image data */ extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, png_bytepp image)); /* writes the end of the PNG file. */ extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the end of the PNG file. */ extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* free any memory associated with the png_info_struct */ extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, png_infopp info_ptr_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); /* free all memory used by the read (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_read_destroy) PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_write_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); /* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_write_destroy) PNGARG((png_structp png_ptr)); /* set the libpng method of handling chunk CRC errors */ extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, int crit_action, int ancil_action)); /* Values for png_set_crc_action() to say how to handle CRC errors in * ancillary and critical chunks, and whether to use the data contained * therein. Note that it is impossible to "discard" data in a critical * chunk. For versions prior to 0.90, the action was always error/quit, * whereas in version 0.90 and later, the action for CRC errors in ancillary * chunks is warn/discard. These values should NOT be changed. * * value action:critical action:ancillary */ #define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ #define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ #define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ #define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ #define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ #define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ /* These functions give the user control over the scan-line filtering in * libpng and the compression methods used by zlib. These functions are * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library * header file (zlib.h) for an explination of the compression functions. */ /* set the filtering method(s) used by libpng. Currently, the only valid * value for "method" is 0. */ extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, int filters)); /* Flags for png_set_filter() to say which filters to use. The flags * are chosen so that they don't conflict with real filter types * below, in case they are supplied instead of the #defined constants. * These values should NOT be changed. */ #define PNG_NO_FILTERS 0x00 #define PNG_FILTER_NONE 0x08 #define PNG_FILTER_SUB 0x10 #define PNG_FILTER_UP 0x20 #define PNG_FILTER_AVG 0x40 #define PNG_FILTER_PAETH 0x80 #define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ PNG_FILTER_AVG | PNG_FILTER_PAETH) /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. * These defines should NOT be changed. */ #define PNG_FILTER_VALUE_NONE 0 #define PNG_FILTER_VALUE_SUB 1 #define PNG_FILTER_VALUE_UP 2 #define PNG_FILTER_VALUE_AVG 3 #define PNG_FILTER_VALUE_PAETH 4 #define PNG_FILTER_VALUE_LAST 5 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ /* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ * defines, either the default (minimum-sum-of-absolute-differences), or * the experimental method (weighted-minimum-sum-of-absolute-differences). * * Weights are factors >= 1.0, indicating how important it is to keep the * filter type consistent between rows. Larger numbers mean the current * filter is that many times as likely to be the same as the "num_weights" * previous filters. This is cumulative for each previous row with a weight. * There needs to be "num_weights" values in "filter_weights", or it can be * NULL if the weights aren't being specified. Weights have no influence on * the selection of the first row filter. Well chosen weights can (in theory) * improve the compression for a given image. * * Costs are factors >= 1.0 indicating the relative decoding costs of a * filter type. Higher costs indicate more decoding expense, and are * therefore less likely to be selected over a filter with lower computational * costs. There needs to be a value in "filter_costs" for each valid filter * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't * setting the costs. Costs try to improve the speed of decompression without * unduly increasing the compressed image size. * * A negative weight or cost indicates the default value is to be used, and * values in the range [0.0, 1.0) indicate the value is to remain unchanged. * The default values for both weights and costs are currently 1.0, but may * change if good general weighting/cost heuristics can be found. If both * the weights and costs are set to 1.0, this degenerates the WEIGHTED method * to the UNWEIGHTED method, but with added encoding time/computation. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs)); #endif #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ /* Heuristic used for row filter selection. These defines should NOT be * changed. */ #define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ #define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ #define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ /* Set the library compression level. Currently, valid values range from * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 * for PNG images, and do considerably fewer caclulations. In the future, * these values may not correspond directly to the zlib compression levels. */ extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, int level)); extern PNG_EXPORT(void,png_set_compression_mem_level) PNGARG((png_structp png_ptr, int mem_level)); extern PNG_EXPORT(void,png_set_compression_strategy) PNGARG((png_structp png_ptr, int strategy)); extern PNG_EXPORT(void,png_set_compression_window_bits) PNGARG((png_structp png_ptr, int window_bits)); extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, int method)); /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, * and call standard C I/O routines such as fread(), fwrite(), and * fprintf(). These functions can be made to use other I/O routines * at run time for those applications that need to handle I/O in a * different manner by calling png_set_???_fn(). See libpng.txt for * more information. */ #if !defined(PNG_NO_STDIO) /* Initialize the input/output for the PNG file to the default functions. */ extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); #endif /* Replace the (error and abort), and warning functions with user * supplied functions. If no messages are to be printed you must still * write and use replacement functions. The replacement error_fn should * still do a longjmp to the last setjmp location if you are using this * method of error handling. If error_fn or warning_fn is NULL, the * default function will be used. */ extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); /* Return the user pointer associated with the error functions */ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); /* Replace the default data output functions with a user supplied one(s). * If buffered output is not used, then output_flush_fn can be set to NULL. * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time * output_flush_fn will be ignored (and thus can be NULL). * It is probably a mistake to use NULL for output_flush_fn if * write_data_fn is not also NULL unless you have built libpng with * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's * default flush function, which uses the standard *FILE structure, will * be used. */ extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); /* Replace the default data input function with a user supplied one. */ extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn)); /* Return the user pointer associated with the I/O functions */ extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, png_read_status_ptr read_row_fn)); extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, png_write_status_ptr write_row_fn)); #ifdef PNG_USER_MEM_SUPPORTED /* Replace the default memory allocation functions with user supplied one(s). */ extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); /* Return the user pointer associated with the memory functions */ extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr read_user_transform_fn)); #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr write_user_transform_fn)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp png_ptr, png_voidp user_transform_ptr, int user_transform_depth, int user_transform_channels)); /* Return the user pointer associated with the user transform functions */ extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_USER_CHUNKS_SUPPORTED extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_PROGRESSIVE_READ_SUPPORTED /* Sets the function callbacks for the push reader, and a pointer to a * user-defined structure available to the callback functions. */ extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, png_voidp progressive_ptr, png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); /* returns the user pointer associated with the push read functions */ extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) PNGARG((png_structp png_ptr)); /* function to be called when data becomes available */ extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); /* function that combines rows. Not very much different than the * png_combine_row() call. Is this even used????? */ extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, png_bytep old_row, png_bytep new_row)); #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, png_uint_32 size)); #if defined(PNG_1_0_X) # define png_malloc_warn png_malloc #else /* Added at libpng version 1.2.4 */ extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* frees a pointer allocated by png_malloc() */ extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); #if defined(PNG_1_0_X) /* Function to allocate memory for zlib. */ extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); #endif /* Free data that was allocated internally */ extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); #ifdef PNG_FREE_ME_SUPPORTED /* Reassign responsibility for freeing existing data, whether allocated * by libpng or by the application */ extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); #endif /* assignments for png_data_freer */ #define PNG_DESTROY_WILL_FREE_DATA 1 #define PNG_SET_WILL_FREE_DATA 1 #define PNG_USER_WILL_FREE_DATA 2 /* Flags for png_ptr->free_me and info_ptr->free_me */ #define PNG_FREE_HIST 0x0008 #define PNG_FREE_ICCP 0x0010 #define PNG_FREE_SPLT 0x0020 #define PNG_FREE_ROWS 0x0040 #define PNG_FREE_PCAL 0x0080 #define PNG_FREE_SCAL 0x0100 #define PNG_FREE_UNKN 0x0200 #define PNG_FREE_LIST 0x0400 #define PNG_FREE_PLTE 0x1000 #define PNG_FREE_TRNS 0x2000 #define PNG_FREE_TEXT 0x4000 #define PNG_FREE_ALL 0x7fff #define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, png_uint_32 size)); extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, png_voidp ptr)); #endif extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 size)); extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, png_voidp s1, int value, png_uint_32 size)); #if defined(USE_FAR_KEYWORD) /* memory model conversion function */ extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, int check)); #endif /* USE_FAR_KEYWORD */ #ifndef PNG_NO_ERROR_TEXT /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); /* The same, but the chunk name is prepended to the error string. */ extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); #else /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); #endif #ifndef PNG_NO_WARNINGS /* Non-fatal error in libpng. Can continue, but may have a problem. */ extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #ifdef PNG_READ_SUPPORTED /* Non-fatal error in libpng, chunk name is prepended to message. */ extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #endif /* PNG_READ_SUPPORTED */ #endif /* PNG_NO_WARNINGS */ /* The png_set_ functions are for storing values in the png_info_struct. * Similarly, the png_get_ calls are used to read values from the * png_info_struct, either storing the parameters in the passed variables, or * setting pointers into the png_info_struct where the data is stored. The * png_get_ functions return a non-zero value if the data was available * in info_ptr, or return zero and do not change any of the parameters if the * data was not available. * * These functions should be used instead of directly accessing png_info * to avoid problems with future changes in the size and internal layout of * png_info_struct. */ /* Returns "flag" if chunk data is valid in info_ptr. */ extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)); /* Returns number of bytes needed to hold a transformed row. */ extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* Returns row_pointers, which is an array of pointers to scanlines that was returned from png_read_png(). */ extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Set row_pointers, which is an array of pointers to scanlines for use by png_write_png(). */ extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)); #endif /* Returns number of color channels in image. */ extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_EASY_ACCESS_SUPPORTED /* Returns image width in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image height in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image bit_depth. */ extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image color_type. */ extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image filter_type. */ extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image interlace_type. */ extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image compression_type. */ extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image resolution in pixels per meter, from pHYs chunk data. */ extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns pixel aspect ratio, computed from pHYs chunk data. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* PNG_EASY_ACCESS_SUPPORTED */ /* Returns pointer to signature string read from PNG header */ extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p *background)); #endif #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p background)); #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double *white_x, double *white_y, double *red_x, double *red_y, double *green_x, double *green_y, double *blue_x, double *blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)); #endif #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double *file_gamma)); #endif extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_file_gamma)); #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double file_gamma)); #endif extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_file_gamma)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)); #endif extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method)); extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_method, int compression_method, int filter_method)); #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); #endif #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, int unit_type)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, png_charp *units, png_charpp *params)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); #endif extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette)); extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette)); #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)); #endif #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p sig_bit)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int *intent)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charpp name, int *compression_type, png_charpp profile, png_uint_32 *proflen)); /* Note to maintainer: profile should be png_bytepp */ #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp name, int compression_type, png_charp profile, png_uint_32 proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tpp entries)); #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tp entries, int nentries)); #endif #if defined(PNG_TEXT_SUPPORTED) /* png_get_text also returns the number of text chunks in *num_text */ extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, int *num_text)); #endif /* * Note while png_set_text() will accept a structure whose text, * language, and translated keywords are NULL pointers, the structure * returned by png_get_text will always contain regular * zero-terminated C strings. They might be empty strings but * they will never be NULL pointers. */ #if defined(PNG_TEXT_SUPPORTED) extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep mod_time)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) #endif #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, double *width, double *height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED */ #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* provide a list of chunks and how they are to be handled, if the built-in handling or default unknown chunk handling is not desired. Any chunks not listed will be handled in the default manner. The IHDR and IEND chunks must not be listed. keep = 0: follow default behaviour = 1: do not keep = 2: keep only if safe-to-copy = 3: keep even if unsafe-to-copy */ extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp png_ptr, int keep, png_bytep chunk_list, int num_chunks)); extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); extern PNG_EXPORT(void, png_set_unknown_chunk_location) PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); #endif #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep chunk_name)); #endif /* Png_free_data() will turn off the "valid" flag for anything it frees. If you need to turn it off for a chunk that your application has freed, you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, png_infop info_ptr, int mask)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* The "params" pointer is currently not used and is for future expansion. */ extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); #endif /* Define PNG_DEBUG at compile time for debugging information. Higher * numbers for PNG_DEBUG mean more debugging information. This has * only been added since version 0.95 so it is not implemented throughout * libpng yet, but more support will be added as needed. */ #ifdef PNG_DEBUG #if (PNG_DEBUG > 0) #if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) #include #if (PNG_DEBUG > 1) #ifndef _DEBUG # define _DEBUG #endif #ifndef png_debug #define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) #endif #ifndef png_debug1 #define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) #endif #ifndef png_debug2 #define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) #endif #endif #else /* PNG_DEBUG_FILE || !_MSC_VER */ #ifndef PNG_DEBUG_FILE #define PNG_DEBUG_FILE stderr #endif /* PNG_DEBUG_FILE */ #if (PNG_DEBUG > 1) /* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on * non-ISO compilers */ # ifdef __STDC__ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ } # endif # else /* __STDC __ */ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1,p2); \ } # endif # endif /* __STDC __ */ #endif /* (PNG_DEBUG > 1) */ #endif /* _MSC_VER */ #endif /* (PNG_DEBUG > 0) */ #endif /* PNG_DEBUG */ #ifndef png_debug #define png_debug(l, m) #endif #ifndef png_debug1 #define png_debug1(l, m, p1) #endif #ifndef png_debug2 #define png_debug2(l, m, p1, p2) #endif extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); #ifdef PNG_MNG_FEATURES_SUPPORTED extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp png_ptr, png_uint_32 mng_features_permitted)); #endif /* For use in png_set_keep_unknown, added to version 1.2.6 */ #define PNG_HANDLE_CHUNK_AS_DEFAULT 0 #define PNG_HANDLE_CHUNK_NEVER 1 #define PNG_HANDLE_CHUNK_IF_SAFE 2 #define PNG_HANDLE_CHUNK_ALWAYS 3 /* Added to version 1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) #define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ #define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ #define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 #define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 #define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 #define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 #define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 #define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 #define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ #define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ | PNG_ASM_FLAG_MMX_READ_INTERLACE \ | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) #define PNG_MMX_WRITE_FLAGS ( 0 ) #define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ | PNG_MMX_READ_FLAGS \ | PNG_MMX_WRITE_FLAGS ) #define PNG_SELECT_READ 1 #define PNG_SELECT_WRITE 2 #endif /* PNG_MMX_CODE_SUPPORTED */ #if !defined(PNG_1_0_X) /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) PNGARG((int flag_select, int *compilerID)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) PNGARG((int flag_select)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flags) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) PNGARG((png_structp png_ptr)); /* pngset.c */ extern PNG_EXPORT(void,png_set_asm_flags) PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); /* pngset.c */ extern PNG_EXPORT(void,png_set_mmx_thresholds) PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, png_uint_32 mmx_rowbytes_threshold)); #endif /* PNG_1_0_X */ #if !defined(PNG_1_0_X) /* png.c, pnggccrd.c, or pngvcrd.c */ extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); #endif /* PNG_1_0_X */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ /* Strip the prepended error numbers ("#nnn ") from error and warning * messages before passing them to the error or warning handler. */ #ifdef PNG_ERROR_NUMBERS_SUPPORTED extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp png_ptr, png_uint_32 strip_mode)); #endif /* Added at libpng-1.2.6 */ #ifdef PNG_SET_USER_LIMITS_SUPPORTED extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp png_ptr)); #endif /* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED /* With these routines we avoid an integer divide, which will be slower on * most machines. However, it does take more operations than the corresponding * divide method, so it may be slower on a few RISC systems. There are two * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. * * Note that the rounding factors are NOT supposed to be the same! 128 and * 32768 are correct for the NODIV code; 127 and 32767 are correct for the * standard method. * * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] */ /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ # define png_composite(composite, fg, alpha, bg) \ { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + (png_uint_16)(bg)*(png_uint_16)(255 - \ (png_uint_16)(alpha)) + (png_uint_16)128); \ (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } # define png_composite_16(composite, fg, alpha, bg) \ { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + (png_uint_32)(bg)*(png_uint_32)(65535L - \ (png_uint_32)(alpha)) + (png_uint_32)32768L); \ (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } #else /* standard method using integer division */ # define png_composite(composite, fg, alpha, bg) \ (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ (png_uint_16)127) / 255) # define png_composite_16(composite, fg, alpha, bg) \ (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ (png_uint_32)32767) / (png_uint_32)65535L) #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ /* Inline macros to do direct reads of bytes from the input buffer. These * require that you are using an architecture that uses PNG byte ordering * (MSB first) and supports unaligned data storage. I think that PowerPC * in big-endian mode and 680x0 are the only ones that will support this. * The x86 line of processors definitely do not. The png_get_int_32() * routine also assumes we are using two's complement format for negative * values, which is almost certainly true. */ #if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) # define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) # define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) # define png_get_int_32(buf) ( *((png_int_32p) (buf))) #else extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); #endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ extern PNG_EXPORT(png_uint_32,png_get_uint_31) PNGARG((png_structp png_ptr, png_bytep buf)); /* No png_get_int_16 -- may be added if there's a real need for it. */ /* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ extern PNG_EXPORT(void,png_save_uint_32) PNGARG((png_bytep buf, png_uint_32 i)); extern PNG_EXPORT(void,png_save_int_32) PNGARG((png_bytep buf, png_int_32 i)); /* Place a 16-bit number into a buffer in PNG byte order. * The parameter is declared unsigned int, not png_uint_16, * just to avoid potential problems on pre-ANSI C compilers. */ extern PNG_EXPORT(void,png_save_uint_16) PNGARG((png_bytep buf, unsigned int i)); /* No png_save_int_16 -- may be added if there's a real need for it. */ /* ************************************************************************* */ /* These next functions are used internally in the code. They generally * shouldn't be used unless you are writing code to add or replace some * functionality in libpng. More information about most functions can * be found in the files where the functions are located. */ /* Various modes of operation, that are visible to applications because * they are used for unknown chunk location. */ #define PNG_HAVE_IHDR 0x01 #define PNG_HAVE_PLTE 0x02 #define PNG_HAVE_IDAT 0x04 #define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ #define PNG_HAVE_IEND 0x10 #if defined(PNG_INTERNAL) /* More modes of operation. Note that after an init, mode is set to * zero automatically when the structure is created. */ #define PNG_HAVE_gAMA 0x20 #define PNG_HAVE_cHRM 0x40 #define PNG_HAVE_sRGB 0x80 #define PNG_HAVE_CHUNK_HEADER 0x100 #define PNG_WROTE_tIME 0x200 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400 #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ /* flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001 #define PNG_INTERLACE 0x0002 #define PNG_PACK 0x0004 #define PNG_SHIFT 0x0008 #define PNG_SWAP_BYTES 0x0010 #define PNG_INVERT_MONO 0x0020 #define PNG_DITHER 0x0040 #define PNG_BACKGROUND 0x0080 #define PNG_BACKGROUND_EXPAND 0x0100 /* 0x0200 unused */ #define PNG_16_TO_8 0x0400 #define PNG_RGBA 0x0800 #define PNG_EXPAND 0x1000 #define PNG_GAMMA 0x2000 #define PNG_GRAY_TO_RGB 0x4000 #define PNG_FILLER 0x8000L #define PNG_PACKSWAP 0x10000L #define PNG_SWAP_ALPHA 0x20000L #define PNG_STRIP_ALPHA 0x40000L #define PNG_INVERT_ALPHA 0x80000L #define PNG_USER_TRANSFORM 0x100000L #define PNG_RGB_TO_GRAY_ERR 0x200000L #define PNG_RGB_TO_GRAY_WARN 0x400000L #define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ /* 0x800000L Unused */ #define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ #define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ /* flags for png_create_struct */ #define PNG_STRUCT_PNG 0x0001 #define PNG_STRUCT_INFO 0x0002 /* Scaling factor for filter heuristic weighting calculations */ #define PNG_WEIGHT_SHIFT 8 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) #define PNG_COST_SHIFT 3 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) /* flags for the png_ptr->flags rather than declaring a byte for each one */ #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 #define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 #define PNG_FLAG_ZLIB_FINISHED 0x0020 #define PNG_FLAG_ROW_INIT 0x0040 #define PNG_FLAG_FILLER_AFTER 0x0080 #define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 #define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 #define PNG_FLAG_CRC_CRITICAL_USE 0x0400 #define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 #define PNG_FLAG_FREE_PLTE 0x1000 #define PNG_FLAG_FREE_TRNS 0x2000 #define PNG_FLAG_FREE_HIST 0x4000 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L #define PNG_FLAG_LIBRARY_MISMATCH 0x20000L #define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L #define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L #define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L #define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ #define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ /* 0x800000L unused */ /* 0x1000000L unused */ /* 0x2000000L unused */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ PNG_FLAG_CRC_ANCILLARY_NOWARN) #define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ PNG_FLAG_CRC_CRITICAL_IGNORE) #define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ PNG_FLAG_CRC_CRITICAL_MASK) /* save typing and make code easier to understand */ #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ abs((int)((c1).green) - (int)((c2).green)) + \ abs((int)((c1).blue) - (int)((c2).blue))) /* Added to libpng-1.2.6 JB */ #define PNG_ROWBYTES(pixel_bits, width) \ ((pixel_bits) >= 8 ? \ ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) /* PNG_OUT_OF_RANGE returns true if value is outside the range ideal-delta..ideal+delta. Each argument is evaluated twice. "ideal" and "delta" should be constants, normally simple integers, "value" a variable. Added to libpng-1.2.6 JB */ #define PNG_OUT_OF_RANGE(value, ideal, delta) \ ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) /* place to hold the signature string for a PNG file. */ #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; #else #endif #endif /* PNG_NO_EXTERN */ /* Constant strings for known chunk types. If you need to add a chunk, * define the name here, and add an invocation of the macro in png.c and * wherever it's needed. */ #define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} #define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} #define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} #define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} #define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} #define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} #define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} #define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} #define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} #define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} #define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} #define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} #define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} #define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} #define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} #define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} #define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} #define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} #define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} #define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} #define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; #endif /* PNG_USE_GLOBAL_ARRAYS */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for reading, and allocate any other memory. * (old interface - DEPRECATED - use png_create_read_struct instead). */ extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); #undef png_read_init #define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for writing, and allocate any other memory. * (old interface - DEPRECATED - use png_create_write_struct instead). */ extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); #undef png_write_init #define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); /* Allocate memory for an internal libpng struct */ PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); /* Free memory from internal libpng struct */ PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)); PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr)); /* Free any memory that info_ptr points to and reset struct. */ PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_1_0_X /* Function to allocate memory for zlib. */ PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); #ifdef PNG_SIZE_T /* Function to convert a sizeof an item to png_sizeof item */ PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); #endif /* Next four functions are used internally as callbacks. PNGAPI is required * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) #if !defined(PNG_NO_STDIO) PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); #endif #endif #else /* PNG_1_0_X */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif #endif /* PNG_1_0_X */ /* Reset the CRC variable */ PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); /* Write the "data" buffer to whatever output you are using. */ PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read data from whatever input you are using into the "data" buffer */ PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read bytes into buf, and update png_ptr->crc */ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, png_size_t length)); /* Decompress data in a chunk that uses compression */ #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, int comp_type, png_size_t chunklength, png_size_t prefix_length, png_size_t *data_length)); #endif /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); /* Read the CRC from the file and compare it to the libpng calculated CRC */ PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); /* Calculate the CRC over a section of data. Note that we are only * passing a maximum of 64K on systems that have this as a memory limit, * since this is the maximum buffer size we can specify. */ PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); #endif /* simple function to write the signature */ PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); /* write various chunks */ /* Write the IHDR chunk, and update the png_struct with the necessary * information. */ PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_method, int filter_method, int interlace_method)); PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)); PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); #if defined(PNG_WRITE_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point file_gamma)); #endif #endif #if defined(PNG_WRITE_sBIT_SUPPORTED) PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, int color_type)); #endif #if defined(PNG_WRITE_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_WRITE_sRGB_SUPPORTED) PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, int intent)); #endif #if defined(PNG_WRITE_iCCP_SUPPORTED) PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, png_charp name, int compression_type, png_charp profile, int proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, png_sPLT_tp palette)); #endif #if defined(PNG_WRITE_tRNS_SUPPORTED) PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, png_color_16p values, int number, int color_type)); #endif #if defined(PNG_WRITE_bKGD_SUPPORTED) PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, png_color_16p values, int color_type)); #endif #if defined(PNG_WRITE_hIST_SUPPORTED) PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, int num_hist)); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, png_charp key, png_charpp new_key)); #endif #if defined(PNG_WRITE_tEXt_SUPPORTED) PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len)); #endif #if defined(PNG_WRITE_zTXt_SUPPORTED) PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len, int compression)); #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, int compression, png_charp key, png_charp lang, png_charp lang_key, png_charp text)); #endif #if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_WRITE_oFFs_SUPPORTED) PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, int unit_type)); #endif #if defined(PNG_WRITE_pCAL_SUPPORTED) PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_WRITE_pHYs_SUPPORTED) PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, int unit_type)); #endif #if defined(PNG_WRITE_tIME_SUPPORTED) PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, png_timep mod_time)); #endif #if defined(PNG_WRITE_sCAL_SUPPORTED) #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, int unit, png_charp width, png_charp height)); #endif #endif #endif /* Called when finished processing a row of data */ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); /* Internal use only. Called before first row of data */ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); #endif /* combine a row of data, dealing with alpha, etc. if requested */ PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, int mask)); #if defined(PNG_READ_INTERLACING_SUPPORTED) /* expand an interlaced row */ /* OLD pre-1.0.9 interface: PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass, png_uint_32 transformations)); */ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); #endif /* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* grab pixels out of a row for an interlaced pass */ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass)); #endif /* unfilter a row */ PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); /* Choose the best filter to use and filter the row data */ PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, png_row_infop row_info)); /* Write out the filtered row. */ PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, png_bytep filtered_row)); /* finish a row while reading, dealing with interlacing passes, etc. */ PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); /* initialize the row buffers, etc. */ PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, png_infop info_ptr)); /* these are the functions that do the transformations */ #if defined(PNG_READ_FILLER_SUPPORTED) PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 filler, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACK_SUPPORTED) PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p sig_bits)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); # if defined(PNG_CORRECT_PALETTE_SUPPORTED) PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, png_colorp palette, int num_palette)); # endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p bit_depth)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background, png_color_16p background_1, png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, png_uint_16pp gamma_16_to_1, int gamma_shift)); #else PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background)); #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, png_bytep gamma_table, png_uint_16pp gamma_16_table, int gamma_shift)); #endif #if defined(PNG_READ_EXPAND_SUPPORTED) PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_value)); #endif /* The following decodes the appropriate chunks, and does error correction, * then calls the appropriate callback for the chunk if it is valid. */ /* decode the IHDR chunk */ PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #if defined(PNG_READ_bKGD_SUPPORTED) PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_iCCP_SUPPORTED) extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_iCCP_SUPPORTED */ #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sPLT_SUPPORTED) extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_sPLT_SUPPORTED */ #if defined(PNG_READ_sRGB_SUPPORTED) PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_bytep chunk_name)); /* handle the transformations for reading and writing */ PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, png_uint_32 length)); PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #ifdef PNG_MNG_FEATURES_SUPPORTED PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) /* png.c */ /* PRIVATE */ PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_pHYs_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif /* PNG_pHYs_SUPPORTED */ #endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ /* Read the chunk header (length + type name) */ PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); /* Added at libpng version 1.2.34 */ #if defined(PNG_cHRM_SUPPORTED) PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ #endif /* PNG_INTERNAL */ #ifdef __cplusplus } #endif #endif /* PNG_VERSION_INFO_ONLY */ /* do not put anything past this line */ #endif /* PNG_H */ angband-v3.3.2/src/win/dll/0000755000175000017500000000000011651552410014746 5ustar chriscchriscangband-v3.3.2/src/win/readpng.c0000644000175000017500000001744611651552410015773 0ustar chriscchrisc/* File: readdib.c */ /* * This package provides a routine to read a DIB file and set up the * device dependent version of the image. * * This file has been modified for use with "Angband 2.9.2" * This file has been modified for use with "z+Angband 0.3.3" * * COPYRIGHT: * * (C) Copyright Microsoft Corp. 1993. All rights reserved. * * You have a royalty-free right to use, modify, reproduce and * distribute the Sample Files (and/or any modified version) in * any way you find useful, provided that you agree that * Microsoft has no warranty obligations or liability for any * Sample Application Files which are modified. */ #include #include "png.h" #include "readdib.h" /* * Extract the "WIN32" flag from the compiler */ #if defined(__WIN32__) || defined(__WINNT__) || defined(__NT__) # ifndef WIN32 # define WIN32 # endif #endif /* * Imports a DIB from a PNG file. Once * the DIB is loaded, the function also creates a bitmap * and palette out of the DIB for a device-dependent form. * * Returns TRUE if the DIB is loaded and the bitmap/palette created, in which * case, the DIBINIT structure pointed to by pInfo is filled with the appropriate * handles, and FALSE if something went wrong. */ BOOL ReadDIB2_PNG(HWND hWnd, LPSTR lpFileName, DIBINIT *pInfo, DIBINIT *pMask) { png_structp png_ptr; png_infop info_ptr; byte header[8]; png_bytep *row_pointers; BOOL noerror = TRUE; HBITMAP hBitmap; HPALETTE hPalette, hOldPal; BITMAPINFO bi, biSrc; HDC hDC; png_byte color_type; png_byte bit_depth; int width, height; int y, number_of_passes; BOOL update = FALSE; // open the file and test it for being a png FILE *fp = fopen(lpFileName, "rb"); if (!fp) { //plog_fmt("Unable to open PNG file."); return (FALSE); } fread(header, 1, 8, fp); if (png_sig_cmp(header, 0, 8)) { //plog_fmt("Unable to open PNG file - not a PNG file."); fclose(fp); return (FALSE); } // Create the png structure png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) { //plog_fmt("Unable to initialize PNG library"); fclose(fp); return (FALSE); } // create the info structure info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); //plog_fmt("Failed to create PNG info structure."); return FALSE; } // setup error handling for init png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); width = png_get_image_width(png_ptr, info_ptr); height = png_get_image_height(png_ptr, info_ptr); color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); number_of_passes = png_set_interlace_handling(png_ptr); if (color_type == PNG_COLOR_TYPE_PALETTE) { png_set_palette_to_rgb(png_ptr); update = TRUE; } if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { png_set_tRNS_to_alpha(png_ptr); update = TRUE; } if (bit_depth == 16) { png_set_strip_16(png_ptr); update = TRUE; } if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { png_set_gray_to_rgb(png_ptr); update = TRUE; } if (update) { png_read_update_info(png_ptr, info_ptr); color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); } png_set_bgr(png_ptr); // after these requests, the data should always be RGB or ARGB /* initialize row_pointers */ row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height); if (!row_pointers) return FALSE; for (y = 0; y < height; ++y) { row_pointers[y] = (png_bytep) malloc(png_get_rowbytes(png_ptr, info_ptr)); if (!row_pointers[y]) return FALSE; } /* read the image data into row_pointers */ png_read_image(png_ptr, row_pointers); /* we are done with the file pointer, so close it */ fclose(fp); /* create the DIB */ bi.bmiHeader.biWidth = (LONG)width; bi.bmiHeader.biHeight = -((LONG)height); bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; bi.bmiHeader.biBitCount = 24; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biSize = 40; // the size of the structure bi.bmiHeader.biXPelsPerMeter = 3424; // just a number I saw when testing this with a sample bi.bmiHeader.biYPelsPerMeter = 3424; // just a number I saw when testing this with a sample bi.bmiHeader.biSizeImage = width*height*3; biSrc.bmiHeader.biWidth = (LONG)width; biSrc.bmiHeader.biHeight = -((LONG)height); biSrc.bmiHeader.biPlanes = 1; biSrc.bmiHeader.biClrUsed = 0; biSrc.bmiHeader.biClrImportant = 0; biSrc.bmiHeader.biCompression = BI_RGB; biSrc.bmiHeader.biPlanes = 1; biSrc.bmiHeader.biSize = 40; // the size of the structure biSrc.bmiHeader.biXPelsPerMeter = 3424; // just a number I saw when testing this with a sample biSrc.bmiHeader.biYPelsPerMeter = 3424; // just a number I saw when testing this with a sample if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) { biSrc.bmiHeader.biBitCount = 32; biSrc.bmiHeader.biSizeImage = width*height*4; } else { biSrc.bmiHeader.biBitCount = 24; biSrc.bmiHeader.biSizeImage = width*height*3; } hDC = GetDC(hWnd); hPalette = GetStockObject(DEFAULT_PALETTE); // Need to realize palette for converting DIB to bitmap. hOldPal = SelectPalette(hDC, hPalette, TRUE); RealizePalette(hDC); // copy the data to the DIB hBitmap = CreateDIBitmap(hDC, &(bi.bmiHeader), 0, NULL, &biSrc, DIB_RGB_COLORS); if (hBitmap) { for (y = 0; y < height; ++y) { if (SetDIBits(hDC, hBitmap, height-y-1, 1, row_pointers[y], &biSrc, DIB_RGB_COLORS) != 1) { //plog_fmt("Failed to alloc temporary memory for PNG data."); DeleteObject(hBitmap); hBitmap = NULL; noerror = FALSE; break; } } } SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); if (!hBitmap) { DeleteObject(hPalette); noerror = FALSE; } else { pInfo->hBitmap = hBitmap; pInfo->hPalette = hPalette; pInfo->hDIB = 0; } if (pMask && (color_type == PNG_COLOR_TYPE_RGB_ALPHA)) { byte *pBits, v; int x; DWORD *srcrow; HBITMAP hBitmap2 = NULL; HPALETTE hPalette2 = GetStockObject(DEFAULT_PALETTE); BOOL have_alpha = FALSE; /* Need to realize palette for converting DIB to bitmap. */ hOldPal = SelectPalette(hDC, hPalette2, TRUE); RealizePalette(hDC); /* allocate the storage space */ pBits = (byte*)malloc(sizeof(byte)*width*height*3); if (!pBits) { noerror = FALSE; } if (noerror) { for (y = 0; y < height; ++y) { srcrow = (DWORD*)row_pointers[y]; for (x = 0; x < width; ++x) { /* get the alpha byte from the source */ v = (*((DWORD*)srcrow + x)>>24); v = 255 - v; if (v==255) { have_alpha = TRUE; } /* write the alpha byte to the three colors of the storage space */ *(pBits + (y*width*3) + (x*3)) = v; *(pBits + (y*width*3) + (x*3)+1) = v; *(pBits + (y*width*3) + (x*3)+2) = v; } } /* create the bitmap from the storage space */ if (have_alpha) { hBitmap2 = CreateDIBitmap(hDC, &(bi.bmiHeader), CBM_INIT, pBits, &bi, DIB_RGB_COLORS); } free(pBits); } SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); if (!hBitmap2) { DeleteObject(hPalette2); noerror = FALSE; } else { pMask->hBitmap = hBitmap2; pMask->hPalette = hPalette2; pMask->hDIB = 0; } } // release the image memory for (y = 0; y < height; ++y) { free(row_pointers[y]); } free(row_pointers); // release all the the PNG Structures if (info_ptr) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); info_ptr = NULL; png_ptr = NULL; } else if (png_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); png_ptr = NULL; } ReleaseDC(hWnd,hDC); if (!noerror) { return (FALSE); } return (TRUE); } angband-v3.3.2/src/win/readdib.c0000644000175000017500000002056711651552410015743 0ustar chriscchrisc/* File: readdib.c */ /* * This package provides a routine to read a DIB file and set up the * device dependent version of the image. * * This file has been modified for use with "Angband 2.9.2" * * COPYRIGHT: * * (C) Copyright Microsoft Corp. 1993. All rights reserved. * * You have a royalty-free right to use, modify, reproduce and * distribute the Sample Files (and/or any modified version) in * any way you find useful, provided that you agree that * Microsoft has no warranty obligations or liability for any * Sample Application Files which are modified. */ #if defined(USE_WIN) || defined(WINDOWS) || defined(WIN32) #include #include "readdib.h" /* * Needed for lcc-win32 */ #ifndef SEEK_SET #define SEEK_SET 0 #endif /* * Number of bytes to be read during each read operation */ #define MAXREAD 32768 /* * Private routine to read more than 64K at a time * * Reads data in steps of 32k till all the data has been read. * * Returns number of bytes requested, or zero if something went wrong. */ static DWORD PASCAL lread(HFILE fh, VOID FAR *pv, DWORD ul) { DWORD ulT = ul; BYTE *hp = pv; while (ul > (DWORD)MAXREAD) { if (_lread(fh, (LPSTR)hp, (WORD)MAXREAD) != MAXREAD) return 0; ul -= MAXREAD; hp += MAXREAD; } if (_lread(fh, (LPSTR)hp, (WORD)ul) != (WORD)ul) return 0; return ulT; } /* * Given a BITMAPINFOHEADER, create a palette based on the color table. * * Returns the handle of a palette, or zero if something went wrong. */ static HPALETTE PASCAL NEAR MakeDIBPalette(LPBITMAPINFOHEADER lpInfo) { PLOGPALETTE npPal; RGBQUAD FAR *lpRGB; HPALETTE hLogPal; DWORD i; /* * since biClrUsed field was filled during the loading of the DIB, * we know it contains the number of colors in the color table. */ if (lpInfo->biClrUsed) { npPal = (PLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) + (WORD)lpInfo->biClrUsed * sizeof(PALETTEENTRY)); if (!npPal) return (FALSE); npPal->palVersion = 0x300; npPal->palNumEntries = (WORD)lpInfo->biClrUsed; /* get pointer to the color table */ lpRGB = (RGBQUAD FAR *)((LPSTR)lpInfo + lpInfo->biSize); /* copy colors from the color table to the LogPalette structure */ for (i = 0; i < lpInfo->biClrUsed; i++, lpRGB++) { npPal->palPalEntry[i].peRed = lpRGB->rgbRed; npPal->palPalEntry[i].peGreen = lpRGB->rgbGreen; npPal->palPalEntry[i].peBlue = lpRGB->rgbBlue; npPal->palPalEntry[i].peFlags = PC_NOCOLLAPSE; } hLogPal = CreatePalette((LPLOGPALETTE)npPal); LocalFree((HANDLE)npPal); return (hLogPal); } /* * 24-bit DIB with no color table. return default palette. Another * option would be to create a 256 color "rainbow" palette to provide * some good color choices. */ else { return (GetStockObject(DEFAULT_PALETTE)); } } /* * Given a DIB, create a bitmap and corresponding palette to be used for a * device-dependent representation of the image. * * Returns TRUE on success (phPal and phBitmap are filled with appropriate * handles. Caller is responsible for freeing objects) and FALSE on failure * (unable to create objects, both pointer are invalid). */ static BOOL NEAR PASCAL MakeBitmapAndPalette(HDC hDC, HANDLE hDIB, HPALETTE * phPal, HBITMAP * phBitmap) { LPBITMAPINFOHEADER lpInfo; BOOL result = FALSE; HBITMAP hBitmap; HPALETTE hPalette, hOldPal; LPSTR lpBits; lpInfo = (LPBITMAPINFOHEADER) GlobalLock(hDIB); if ((hPalette = MakeDIBPalette(lpInfo)) != 0) { /* Need to realize palette for converting DIB to bitmap. */ hOldPal = SelectPalette(hDC, hPalette, TRUE); RealizePalette(hDC); lpBits = ((LPSTR)lpInfo + (WORD)lpInfo->biSize + (WORD)lpInfo->biClrUsed * sizeof(RGBQUAD)); hBitmap = CreateDIBitmap(hDC, lpInfo, CBM_INIT, lpBits, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS); SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); if (!hBitmap) { DeleteObject(hPalette); } else { *phBitmap = hBitmap; *phPal = hPalette; result = TRUE; } } return (result); } /* * Reads a DIB from a file, obtains a handle to its BITMAPINFO struct, and * loads the DIB. Once the DIB is loaded, the function also creates a bitmap * and palette out of the DIB for a device-dependent form. * * Returns TRUE if the DIB is loaded and the bitmap/palette created, in which * case, the DIBINIT structure pointed to by pInfo is filled with the appropriate * handles, and FALSE if something went wrong. */ BOOL ReadDIB(HWND hWnd, LPSTR lpFileName, DIBINIT *pInfo) { HFILE fh; LPBITMAPINFOHEADER lpbi; OFSTRUCT of; BITMAPFILEHEADER bf; WORD nNumColors; BOOL result = FALSE; DWORD offBits; HDC hDC; BOOL bCoreHead = FALSE; /* Open the file and get a handle to it's BITMAPINFO */ fh = OpenFile(lpFileName, &of, OF_READ); if (fh == -1) return (FALSE); pInfo->hDIB = GlobalAlloc(GHND, (DWORD)(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD))); if (!pInfo->hDIB) return (FALSE); lpbi = (LPBITMAPINFOHEADER)GlobalLock(pInfo->hDIB); /* read the BITMAPFILEHEADER */ if (sizeof (bf) != _lread(fh, (LPSTR)&bf, sizeof(bf))) goto ErrExit; /* 'BM' */ if (bf.bfType != 0x4d42) goto ErrExit; if (sizeof(BITMAPCOREHEADER) != _lread(fh, (LPSTR)lpbi, sizeof(BITMAPCOREHEADER))) goto ErrExit; if (lpbi->biSize == sizeof(BITMAPCOREHEADER)) { lpbi->biSize = sizeof(BITMAPINFOHEADER); lpbi->biBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount; lpbi->biPlanes = ((LPBITMAPCOREHEADER)lpbi)->bcPlanes; lpbi->biHeight = ((LPBITMAPCOREHEADER)lpbi)->bcHeight; lpbi->biWidth = ((LPBITMAPCOREHEADER)lpbi)->bcWidth; bCoreHead = TRUE; } else { /* get to the start of the header and read INFOHEADER */ _llseek(fh, sizeof(BITMAPFILEHEADER), SEEK_SET); if (sizeof(BITMAPINFOHEADER) != _lread(fh, (LPSTR)lpbi, sizeof(BITMAPINFOHEADER))) goto ErrExit; } if ((nNumColors = (WORD)lpbi->biClrUsed) == 0) { /* no color table for 24-bit, default size otherwise */ if (lpbi->biBitCount != 24) nNumColors = 1 << lpbi->biBitCount; } /* fill in some default values if they are zero */ if (lpbi->biClrUsed == 0) lpbi->biClrUsed = nNumColors; if (lpbi->biSizeImage == 0) { lpbi->biSizeImage = (((((lpbi->biWidth * (DWORD)lpbi->biBitCount) + 31) & ~31) >> 3) * lpbi->biHeight); } /* otherwise wouldn't work with 16 color bitmaps -- S.K. */ else if ((nNumColors == 16) && (lpbi->biSizeImage > bf.bfSize)) { lpbi->biSizeImage /= 2; } /* get a proper-sized buffer for header, color table and bits */ GlobalUnlock(pInfo->hDIB); pInfo->hDIB = GlobalReAlloc(pInfo->hDIB, lpbi->biSize + nNumColors * sizeof(RGBQUAD) + lpbi->biSizeImage, 0); /* can't resize buffer for loading */ if (!pInfo->hDIB) goto ErrExit2; lpbi = (LPBITMAPINFOHEADER)GlobalLock(pInfo->hDIB); /* read the color table */ if (!bCoreHead) { _lread(fh, (LPSTR)(lpbi) + lpbi->biSize, nNumColors * sizeof(RGBQUAD)); } else { signed int i; RGBQUAD FAR *pQuad; RGBTRIPLE FAR *pTriple; _lread(fh, (LPSTR)(lpbi) + lpbi->biSize, nNumColors * sizeof(RGBTRIPLE)); pQuad = (RGBQUAD FAR *)((LPSTR)lpbi + lpbi->biSize); pTriple = (RGBTRIPLE FAR *) pQuad; for (i = nNumColors - 1; i >= 0; i--) { pQuad[i].rgbRed = pTriple[i].rgbtRed; pQuad[i].rgbBlue = pTriple[i].rgbtBlue; pQuad[i].rgbGreen = pTriple[i].rgbtGreen; pQuad[i].rgbReserved = 0; } } /* offset to the bits from start of DIB header */ offBits = lpbi->biSize + nNumColors * sizeof(RGBQUAD); if (bf.bfOffBits != 0L) { _llseek(fh,bf.bfOffBits,SEEK_SET); } /* Use local version of '_lread()' above */ if (lpbi->biSizeImage == lread(fh, (LPSTR)lpbi + offBits, lpbi->biSizeImage)) { GlobalUnlock(pInfo->hDIB); hDC = GetDC(hWnd); if (!MakeBitmapAndPalette(hDC, pInfo->hDIB, &(pInfo->hPalette), &(pInfo->hBitmap))) { ReleaseDC(hWnd,hDC); goto ErrExit2; } else { ReleaseDC(hWnd,hDC); result = TRUE; } } else { ErrExit: GlobalUnlock(pInfo->hDIB); ErrExit2: GlobalFree(pInfo->hDIB); } _lclose(fh); return (result); } /* Free a DIB */ void FreeDIB(DIBINIT *dib) { /* Free the bitmap stuff */ if (dib->hPalette) DeleteObject(dib->hPalette); if (dib->hBitmap) DeleteObject(dib->hBitmap); if (dib->hDIB) GlobalFree(dib->hDIB); dib->hPalette = NULL; dib->hBitmap = NULL; dib->hDIB = NULL; } #endif /* USE_WIN || WINDOWS || WIN32 */ angband-v3.3.2/src/win/readdib.h0000644000175000017500000000123311651552410015735 0ustar chriscchrisc/* File: readdib.h */ #ifndef INCLUDED_READDIB_H #define INCLUDED_READDIB_H /* * This file has been modified for use with "Angband 2.8.2" * * Copyright 1991 Microsoft Corporation. All rights reserved. */ /* * Information about a bitmap */ typedef struct { HANDLE hDIB; HBITMAP hBitmap; HPALETTE hPalette; BYTE CellWidth; BYTE CellHeight; } DIBINIT; /* Read a DIB from a file */ extern BOOL ReadDIB(HWND, LPSTR, DIBINIT *); /* Free a DIB */ extern void FreeDIB(DIBINIT *dib); /* new png stuff */ extern BOOL ReadDIB_PNG(HWND, LPSTR, DIBINIT *); extern BOOL ReadDIB2_PNG(HWND, LPSTR, DIBINIT *, DIBINIT *); #endif /* !INCLUDED_READDIB_H */ angband-v3.3.2/src/win/angband.rc0000644000175000017500000000564111651552410016121 0ustar chriscchrisc/* File: angband.rc */ ANGBAND MENU { POPUP "&File" { MENUITEM "&New", 100 MENUITEM "&Open...", 101 MENUITEM SEPARATOR MENUITEM "&Save", 110 MENUITEM SEPARATOR MENUITEM "E&xit", 130 } POPUP "&Window" { POPUP "&Visibility" { MENUITEM "Term-0 window", 200 MENUITEM "Term-1 window", 201 MENUITEM "Term-2 window", 202 MENUITEM "Term-3 window", 203 MENUITEM "Term-4 window", 204 MENUITEM "Term-5 window", 205 MENUITEM "Term-6 window", 206 MENUITEM "Term-7 window", 207 } POPUP "&Font" { MENUITEM "Term-0 window", 210 MENUITEM "Term-1 window", 211 MENUITEM "Term-2 window", 212 MENUITEM "Term-3 window", 213 MENUITEM "Term-4 window", 214 MENUITEM "Term-5 window", 215 MENUITEM "Term-6 window", 216 MENUITEM "Term-7 window", 217 } MENUITEM SEPARATOR POPUP "Bizarre Display" { MENUITEM "Term-0 window", 230 MENUITEM "Term-1 window", 231 MENUITEM "Term-2 window", 232 MENUITEM "Term-3 window", 233 MENUITEM "Term-4 window", 234 MENUITEM "Term-5 window", 235 MENUITEM "Term-6 window", 236 MENUITEM "Term-7 window", 237 } POPUP "Increase Tile Width" { MENUITEM "Term-0 window", 240 MENUITEM "Term-1 window", 241 MENUITEM "Term-2 window", 242 MENUITEM "Term-3 window", 243 MENUITEM "Term-4 window", 244 MENUITEM "Term-5 window", 245 MENUITEM "Term-6 window", 246 MENUITEM "Term-7 window", 247 } POPUP "Decrease Tile Width" { MENUITEM "Term-0 window", 250 MENUITEM "Term-1 window", 251 MENUITEM "Term-2 window", 252 MENUITEM "Term-3 window", 253 MENUITEM "Term-4 window", 254 MENUITEM "Term-5 window", 255 MENUITEM "Term-6 window", 256 MENUITEM "Term-7 window", 257 } POPUP "Increase Tile Height" { MENUITEM "Term-0 window", 260 MENUITEM "Term-1 window", 261 MENUITEM "Term-2 window", 262 MENUITEM "Term-3 window", 263 MENUITEM "Term-4 window", 264 MENUITEM "Term-5 window", 265 MENUITEM "Term-6 window", 266 MENUITEM "Term-7 window", 267 } POPUP "Decrease Tile Height" { MENUITEM "Term-0 window", 270 MENUITEM "Term-1 window", 271 MENUITEM "Term-2 window", 272 MENUITEM "Term-3 window", 273 MENUITEM "Term-4 window", 274 MENUITEM "Term-5 window", 275 MENUITEM "Term-6 window", 276 MENUITEM "Term-7 window", 277 } } POPUP "&Options" { POPUP "&Graphics" { MENUITEM "&None", 400 MENUITEM "&Old tiles", 401 MENUITEM "&Adam Bolt's tiles", 402 MENUITEM "&David Gervais' tiles", 403 MENUITEM "&Nomad's tiles", 404 MENUITEM SEPARATOR MENUITEM "Enable nice &graphics", 405 MENUITEM SEPARATOR MENUITEM "&Triple tile mode", 407 MENUITEM "Do&uble tile mode", 408 MENUITEM SEPARATOR MENUITEM "&Bigtile mode", 409 } MENUITEM SEPARATOR MENUITEM "Low Priority", 420 MENUITEM "Activate Screensaver", 430 MENUITEM "&Map", 440 } POPUP "&Help" { MENUITEM "&Contents", 901 } } ANGBAND ICON "win/angband.ico" angband-v3.3.2/src/player/0000755000175000017500000000000011651552410014672 5ustar chriscchriscangband-v3.3.2/src/player/race.c0000644000175000017500000000047311651552410015754 0ustar chriscchrisc/* player/race.c * Copyright (c) 2011 elly+angband@leptoquark.net. See COPYING. */ #include "externs.h" #include "player/player.h" #include "player/types.h" struct player_race *player_id2race(guid id) { struct player_race *r; for (r = races; r; r = r->next) if (guid_eq(r->ridx, id)) break; return r; } angband-v3.3.2/src/player/Makefile0000644000175000017500000000010011651552410016321 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)extra.mk $(MKPATH)buildsys.mk angband-v3.3.2/src/player/timed.c0000644000175000017500000004150211651552410016142 0ustar chriscchrisc/* * File: player/timed.c * Purpose: Timed effects handling * * Copyright (c) 1997 Ben Harrison * Copyright (c) 2007 A Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" /* * The "stun" and "cut" statuses need to be handled by special functions of * their own, as they are more complex than the ones handled by the generic * code. */ static bool set_stun(struct player *p, int v); static bool set_cut(struct player *p, int v); typedef struct { const char *on_begin; const char *on_end; const char *on_increase; const char *on_decrease; u32b flag_redraw, flag_update; int msg; int resist; } timed_effect; static timed_effect effects[] = { { "You feel yourself moving faster!", "You feel yourself slow down.", NULL, NULL, 0, PU_BONUS, MSG_SPEED, 0 }, { "You feel yourself moving slower!", "You feel yourself speed up.", NULL, NULL, 0, PU_BONUS, MSG_SLOW, OF_FREE_ACT }, { "You are blind.", "You blink and your eyes clear.", NULL, NULL, PR_MAP, PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS, MSG_BLIND, OF_RES_BLIND }, { "You are paralysed!", "You can move again.", NULL, NULL, 0, 0, MSG_PARALYZED, OF_FREE_ACT }, { "You are confused!", "You are no longer confused.", "You are more confused!", "You feel a little less confused.", 0, 0, MSG_CONFUSED, OF_RES_CONFU }, { "You are terrified!", "You feel bolder now.", "You are more scared!", "You feel a little less scared.", 0, PU_BONUS, MSG_AFRAID, OF_RES_FEAR }, { "You feel drugged!", "You can see clearly again.", "You feel more drugged!", "You feel less drugged.", PR_MAP | PR_MONLIST | PR_ITEMLIST, 0, MSG_DRUGGED, OF_RES_CHAOS }, { "You are poisoned!", "You are no longer poisoned.", "You are more poisoned!", "You are less poisoned.", 0, 0, MSG_POISONED, OF_RES_POIS }, { NULL, NULL, NULL, NULL, 0, 0, 0, 0 }, /* TMD_CUT -- handled seperately */ { NULL, NULL, NULL, NULL, 0, 0, 0, OF_RES_STUN }, /* TMD_STUN -- handled seperately */ { "You feel safe from evil!", "You no longer feel safe from evil.", "You feel even safer from evil!", "You feel less safe from evil.", 0, 0, MSG_PROT_EVIL, 0 }, { "You feel invulnerable!", "You feel vulnerable once more.", NULL, NULL, 0, PU_BONUS, MSG_INVULN, 0 }, { "You feel like a hero!", "You no longer feel heroic.", "You feel more like a hero!", "You feel less heroic.", 0, PU_BONUS, MSG_HERO, 0 }, { "You feel like a killing machine!", "You no longer feel berserk.", "You feel even more berserk!", "You feel less berserk.", 0, PU_BONUS, MSG_BERSERK, 0 }, { "A mystic shield forms around your body!", "Your mystic shield crumbles away.", "The mystic shield strengthens.", "The mystic shield weakens.", 0, PU_BONUS, MSG_SHIELD, 0 }, { "You feel righteous!", "The prayer has expired.", "You feel more righteous!", "You feel less righteous.", 0, PU_BONUS, MSG_BLESSED, 0 }, { "Your eyes feel very sensitive!", "Your eyes no longer feel so sensitive.", "Your eyes feel more sensitive!", "Your eyes feel less sensitive.", 0, (PU_BONUS | PU_MONSTERS), MSG_SEE_INVIS, 0 }, { "Your eyes begin to tingle!", "Your eyes stop tingling.", "Your eyes' tingling intensifies.", "Your eyes tingle less.", 0, (PU_BONUS | PU_MONSTERS), MSG_INFRARED, 0 }, { "You feel resistant to acid!", "You are no longer resistant to acid.", "You feel more resistant to acid!", "You feel less resistant to acid.", PR_STATUS, 0, MSG_RES_ACID, OF_VULN_ACID }, { "You feel resistant to electricity!", "You are no longer resistant to electricity.", "You feel more resistant to electricity!", "You feel less resistant to electricity.", PR_STATUS, 0, MSG_RES_ELEC, OF_VULN_ELEC }, { "You feel resistant to fire!", "You are no longer resistant to fire.", "You feel more resistant to fire!", "You feel less resistant to fire.", PR_STATUS, 0, MSG_RES_FIRE, OF_VULN_FIRE }, { "You feel resistant to cold!", "You are no longer resistant to cold.", "You feel more resistant to cold!", "You feel less resistant to cold.", PR_STATUS, 0, MSG_RES_COLD, OF_VULN_COLD }, { "You feel resistant to poison!", "You are no longer resistant to poison.", "You feel more resistant to poison!", "You feel less resistant to poison.", 0, 0, MSG_RES_POIS, 0 }, { "You feel resistant to confusion!", "You are no longer resistant to confusion.", "You feel more resistant to confusion!", "You feel less resistant to confusion.", PR_STATUS, PU_BONUS, 0, 0 }, { "You feel your memories fade.", "Your memories come flooding back.", NULL, NULL, 0, 0, MSG_GENERIC, 0 }, { "Your mind expands.", "Your horizons are once more limited.", "Your mind expands further.", NULL, 0, PU_BONUS, MSG_GENERIC, 0 }, { "Your skin turns to stone.", "A fleshy shade returns to your skin.", NULL, NULL, 0, PU_BONUS, MSG_GENERIC, 0 }, { "You feel the need to run away, and fast!", "The urge to run dissipates.", NULL, NULL, 0, PU_BONUS, MSG_AFRAID, 0 }, { "You start sprinting.", "You suddenly stop sprinting.", NULL, NULL, 0, PU_BONUS, MSG_SPEED, 0 }, { "You feel bold.", "You no longer feel bold.", "You feel even bolder!", "You feel less bold.", 0, PU_BONUS, MSG_BOLD, 0 }, }; /* * Set a timed event (except timed resists, cutting and stunning). */ bool player_set_timed(struct player *p, int idx, int v, bool notify) { timed_effect *effect; /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; if ((idx < 0) || (idx > TMD_MAX)) return FALSE; /* No change */ if (p->timed[idx] == v) return FALSE; /* Hack -- call other functions */ if (idx == TMD_STUN) return set_stun(p, v); else if (idx == TMD_CUT) return set_cut(p, v); /* Don't mention effects which already match the player state. */ if (idx == TMD_OPP_ACID && check_state(p_ptr, OF_IM_ACID, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_ELEC && check_state(p_ptr, OF_IM_ELEC, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_FIRE && check_state(p_ptr, OF_IM_FIRE, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_COLD && check_state(p_ptr, OF_IM_COLD, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_CONF && of_has(p->state.flags, OF_RES_CONFU)) notify = FALSE; /* Find the effect */ effect = &effects[idx]; /* Turning off, always mention */ if (v == 0) { msgt(MSG_RECOVER, "%s", effect->on_end); notify = TRUE; } /* Turning on, always mention */ else if (p->timed[idx] == 0) { msgt(effect->msg, "%s", effect->on_begin); notify = TRUE; } else if (notify) { /* Decrementing */ if (p->timed[idx] > v && effect->on_decrease) msgt(effect->msg, "%s", effect->on_decrease); /* Incrementing */ else if (v > p->timed[idx] && effect->on_increase) msgt(effect->msg, "%s", effect->on_increase); } /* Use the value */ p->timed[idx] = v; /* Sort out the sprint effect */ if (idx == TMD_SPRINT && v == 0) player_inc_timed(p, TMD_SLOW, 100, TRUE, FALSE); /* Nothing to notice */ if (!notify) return FALSE; /* Disturb */ if (OPT(disturb_state)) disturb(p_ptr, 0, 0); /* Update the visuals, as appropriate. */ p->update |= effect->flag_update; p->redraw |= (PR_STATUS | effect->flag_redraw); /* Handle stuff */ handle_stuff(p); /* Result */ return TRUE; } /** * Increase the timed effect `idx` by `v`. Mention this if `notify` is TRUE. * Check for resistance to the effect if `check` is TRUE. */ bool player_inc_timed(struct player *p, int idx, int v, bool notify, bool check) { timed_effect *effect; /* Find the effect */ effect = &effects[idx]; /* Check we have a valid effect */ if ((idx < 0) || (idx > TMD_MAX)) return FALSE; /* Check that @ can be affected by this effect */ if (check) { wieldeds_notice_flag(p, effect->resist); if (check_state(p, effect->resist, p->state.flags)) return FALSE; } /* Paralysis should be non-cumulative */ if (idx == TMD_PARALYZED && p->timed[TMD_PARALYZED] > 0) return FALSE; /* Set v */ v = v + p->timed[idx]; return player_set_timed(p, idx, v, notify); } /** * Decrease the timed effect `idx` by `v`. Mention this if `notify` is TRUE. */ bool player_dec_timed(struct player *p, int idx, int v, bool notify) { /* Check we have a valid effect */ if ((idx < 0) || (idx > TMD_MAX)) return FALSE; /* Set v */ v = p->timed[idx] - v; return player_set_timed(p, idx, v, notify); } /** * Clear the timed effect `idx`. Mention this if `notify` is TRUE. */ bool player_clear_timed(struct player *p, int idx, bool notify) { return player_set_timed(p, idx, 0, notify); } /* * Set "p_ptr->timed[TMD_STUN]", notice observable changes * * Note the special code to only notice "range" changes. */ static bool set_stun(struct player *p, int v) { int old_aux, new_aux; bool notice = FALSE; /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; /* Knocked out */ if (p->timed[TMD_STUN] > 100) { old_aux = 3; } /* Heavy stun */ else if (p->timed[TMD_STUN] > 50) { old_aux = 2; } /* Stun */ else if (p->timed[TMD_STUN] > 0) { old_aux = 1; } /* None */ else { old_aux = 0; } /* Knocked out */ if (v > 100) { new_aux = 3; } /* Heavy stun */ else if (v > 50) { new_aux = 2; } /* Stun */ else if (v > 0) { new_aux = 1; } /* None */ else { new_aux = 0; } /* Increase cut */ if (new_aux > old_aux) { /* Describe the state */ switch (new_aux) { /* Stun */ case 1: { msgt(MSG_STUN, "You have been stunned."); break; } /* Heavy stun */ case 2: { msgt(MSG_STUN, "You have been heavily stunned."); break; } /* Knocked out */ case 3: { msgt(MSG_STUN, "You have been knocked out."); break; } } /* Notice */ notice = TRUE; } /* Decrease cut */ else if (new_aux < old_aux) { /* Describe the state */ switch (new_aux) { /* None */ case 0: { msgt(MSG_RECOVER, "You are no longer stunned."); if (OPT(disturb_state)) disturb(p_ptr, 0, 0); break; } } /* Notice */ notice = TRUE; } /* Use the value */ p->timed[TMD_STUN] = v; /* No change */ if (!notice) return (FALSE); /* Disturb */ if (OPT(disturb_state)) disturb(p_ptr, 0, 0); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw the "stun" */ p->redraw |= (PR_STATUS); /* Handle stuff */ handle_stuff(p_ptr); /* Result */ return (TRUE); } /* * Set "p_ptr->timed[TMD_CUT]", notice observable changes * * Note the special code to only notice "range" changes. */ static bool set_cut(struct player *p, int v) { int old_aux, new_aux; bool notice = FALSE; /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; /* Mortal wound */ if (p->timed[TMD_CUT] > 1000) { old_aux = 7; } /* Deep gash */ else if (p->timed[TMD_CUT] > 200) { old_aux = 6; } /* Severe cut */ else if (p->timed[TMD_CUT] > 100) { old_aux = 5; } /* Nasty cut */ else if (p->timed[TMD_CUT] > 50) { old_aux = 4; } /* Bad cut */ else if (p->timed[TMD_CUT] > 25) { old_aux = 3; } /* Light cut */ else if (p->timed[TMD_CUT] > 10) { old_aux = 2; } /* Graze */ else if (p->timed[TMD_CUT] > 0) { old_aux = 1; } /* None */ else { old_aux = 0; } /* Mortal wound */ if (v > 1000) { new_aux = 7; } /* Deep gash */ else if (v > 200) { new_aux = 6; } /* Severe cut */ else if (v > 100) { new_aux = 5; } /* Nasty cut */ else if (v > 50) { new_aux = 4; } /* Bad cut */ else if (v > 25) { new_aux = 3; } /* Light cut */ else if (v > 10) { new_aux = 2; } /* Graze */ else if (v > 0) { new_aux = 1; } /* None */ else { new_aux = 0; } /* Increase cut */ if (new_aux > old_aux) { /* Describe the state */ switch (new_aux) { /* Graze */ case 1: { msgt(MSG_CUT, "You have been given a graze."); break; } /* Light cut */ case 2: { msgt(MSG_CUT, "You have been given a light cut."); break; } /* Bad cut */ case 3: { msgt(MSG_CUT, "You have been given a bad cut."); break; } /* Nasty cut */ case 4: { msgt(MSG_CUT, "You have been given a nasty cut."); break; } /* Severe cut */ case 5: { msgt(MSG_CUT, "You have been given a severe cut."); break; } /* Deep gash */ case 6: { msgt(MSG_CUT, "You have been given a deep gash."); break; } /* Mortal wound */ case 7: { msgt(MSG_CUT, "You have been given a mortal wound."); break; } } /* Notice */ notice = TRUE; } /* Decrease cut */ else if (new_aux < old_aux) { /* Describe the state */ switch (new_aux) { /* None */ case 0: { msgt(MSG_RECOVER, "You are no longer bleeding."); if (OPT(disturb_state)) disturb(p_ptr, 0, 0); break; } } /* Notice */ notice = TRUE; } /* Use the value */ p->timed[TMD_CUT] = v; /* No change */ if (!notice) return (FALSE); /* Disturb */ if (OPT(disturb_state)) disturb(p_ptr, 0, 0); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw the "cut" */ p->redraw |= (PR_STATUS); /* Handle stuff */ handle_stuff(p_ptr); /* Result */ return (TRUE); } /* * Set "p_ptr->food", notice observable changes * * The "p_ptr->food" variable can get as large as 20000, allowing the * addition of the most "filling" item, Elvish Waybread, which adds * 7500 food units, without overflowing the 32767 maximum limit. * * Perhaps we should disturb the player with various messages, * especially messages about hunger status changes. XXX XXX XXX * * Digestion of food is handled in "dungeon.c", in which, normally, * the player digests about 20 food units per 100 game turns, more * when "fast", more when "regenerating", less with "slow digestion", * but when the player is "gorged", he digests 100 food units per 10 * game turns, or a full 1000 food units per 100 game turns. * * Note that the player's speed is reduced by 10 units while gorged, * so if the player eats a single food ration (5000 food units) when * full (15000 food units), he will be gorged for (5000/100)*10 = 500 * game turns, or 500/(100/5) = 25 player turns (if nothing else is * affecting the player speed). */ bool player_set_food(struct player *p, int v) { int old_aux, new_aux; bool notice = FALSE; /* Hack -- Force good values */ v = MIN(v, PY_FOOD_UPPER); v = MAX(v, 0); /* Fainting / Starving */ if (p->food < PY_FOOD_FAINT) { old_aux = 0; } /* Weak */ else if (p->food < PY_FOOD_WEAK) { old_aux = 1; } /* Hungry */ else if (p->food < PY_FOOD_ALERT) { old_aux = 2; } /* Normal */ else if (p->food < PY_FOOD_FULL) { old_aux = 3; } /* Full */ else if (p->food < PY_FOOD_MAX) { old_aux = 4; } /* Gorged */ else { old_aux = 5; } /* Fainting / Starving */ if (v < PY_FOOD_FAINT) { new_aux = 0; } /* Weak */ else if (v < PY_FOOD_WEAK) { new_aux = 1; } /* Hungry */ else if (v < PY_FOOD_ALERT) { new_aux = 2; } /* Normal */ else if (v < PY_FOOD_FULL) { new_aux = 3; } /* Full */ else if (v < PY_FOOD_MAX) { new_aux = 4; } /* Gorged */ else { new_aux = 5; } /* Food increase */ if (new_aux > old_aux) { /* Describe the state */ switch (new_aux) { /* Weak */ case 1: { msg("You are still weak."); break; } /* Hungry */ case 2: { msg("You are still hungry."); break; } /* Normal */ case 3: { msg("You are no longer hungry."); break; } /* Full */ case 4: { msg("You are full!"); break; } /* Bloated */ case 5: { msg("You have gorged yourself!"); break; } } /* Change */ notice = TRUE; } /* Food decrease */ else if (new_aux < old_aux) { /* Describe the state */ switch (new_aux) { /* Fainting / Starving */ case 0: { msgt(MSG_NOTICE, "You are getting faint from hunger!"); break; } /* Weak */ case 1: { msgt(MSG_NOTICE, "You are getting weak from hunger!"); break; } /* Hungry */ case 2: { msgt(MSG_HUNGRY, "You are getting hungry."); break; } /* Normal */ case 3: { msgt(MSG_NOTICE, "You are no longer full."); break; } /* Full */ case 4: { msgt(MSG_NOTICE, "You are no longer gorged."); break; } } /* Change */ notice = TRUE; } /* Use the value */ p->food = v; /* Nothing to notice */ if (!notice) return (FALSE); /* Disturb */ if (OPT(disturb_state)) disturb(p_ptr, 0, 0); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw hunger */ p->redraw |= (PR_STATUS); /* Handle stuff */ handle_stuff(p_ptr); /* Result */ return (TRUE); } angband-v3.3.2/src/player/class.c0000644000175000017500000000050211651552410016140 0ustar chriscchrisc/* player/class.c * Copyright (c) 2011 elly+angband@leptoquark.net. See COPYING. */ #include "externs.h" #include "player/player.h" #include "player/types.h" struct player_class *player_id2class(guid id) { struct player_class *c; for (c = classes; c; c = c->next) if (guid_eq(c->cidx, id)) break; return c; } angband-v3.3.2/src/player/player.c0000644000175000017500000000676211651552410016345 0ustar chriscchrisc/* player/player.c - player implementation * Copyright (c) 2011 elly+angband@leptoquark.net. See COPYING. */ #include "externs.h" /* player_exp */ #include "history.h" /* history_add */ #include "player/player.h" bool player_stat_inc(struct player *p, int stat) { int v = p->stat_cur[stat]; if (v >= 18 + 100) return FALSE; if (v < 18) { p->stat_cur[stat]++; } else if (v < 18 + 90) { int gain = (((18 + 100) - v) / 2 + 3) / 2; if (gain < 1) gain = 1; p->stat_cur[stat] += randint1(gain) + gain / 2; if (p->stat_cur[stat] > 18 + 99) p->stat_cur[stat] = 18 + 99; } else { p->stat_cur[stat] = 18 + 100; } if (p->stat_cur[stat] > p->stat_max[stat]) p->stat_max[stat] = p->stat_cur[stat]; p->update |= PU_BONUS; return TRUE; } bool player_stat_dec(struct player *p, int stat, bool permanent) { int cur, max, res = FALSE; cur = p->stat_cur[stat]; max = p->stat_max[stat]; if (cur > 18+10) cur -= 10; else if (cur > 18) cur = 18; else if (cur > 3) cur -= 1; res = (cur != p->stat_cur[stat]); if (permanent) { if (max > 18+10) max -= 10; else if (max > 18) max = 18; else if (max > 3) max -= 1; res = (max != p->stat_max[stat]); } if (res) { p->stat_cur[stat] = cur; p->stat_max[stat] = max; p->update |= (PU_BONUS); p->redraw |= (PR_STATS); } return res; } static void adjust_level(struct player *p, bool verbose) { if (p->exp < 0) p->exp = 0; if (p->max_exp < 0) p->max_exp = 0; if (p->exp > PY_MAX_EXP) p->exp = PY_MAX_EXP; if (p->max_exp > PY_MAX_EXP) p->max_exp = PY_MAX_EXP; if (p->exp > p->max_exp) p->max_exp = p->exp; p->redraw |= PR_EXP; handle_stuff(p); while ((p->lev > 1) && (p->exp < (player_exp[p->lev-2] * p->expfact / 100L))) p->lev--; while ((p->lev < PY_MAX_LEVEL) && (p->exp >= (player_exp[p->lev-1] * p->expfact / 100L))) { char buf[80]; p->lev++; /* Save the highest level */ if (p->lev > p->max_lev) p->max_lev = p->lev; if (verbose) { /* Log level updates */ strnfmt(buf, sizeof(buf), "Reached level %d", p->lev); history_add(buf, HISTORY_GAIN_LEVEL, 0); /* Message */ msgt(MSG_LEVEL, "Welcome to level %d.", p->lev); } /* Add to social class */ p->sc += randint1(2); if (p->sc > 150) p->sc = 150; do_res_stat(A_STR); do_res_stat(A_INT); do_res_stat(A_WIS); do_res_stat(A_DEX); do_res_stat(A_CON); do_res_stat(A_CHR); } while ((p->max_lev < PY_MAX_LEVEL) && (p->max_exp >= (player_exp[p->max_lev-1] * p->expfact / 100L))) p->max_lev++; p->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); p->redraw |= (PR_LEV | PR_TITLE | PR_EXP | PR_STATS); handle_stuff(p); } void player_exp_gain(struct player *p, s32b amount) { p->exp += amount; if (p->exp < p->max_exp) p->max_exp += amount / 10; adjust_level(p, TRUE); } void player_exp_lose(struct player *p, s32b amount, bool permanent) { if (p->exp < amount) amount = p->exp; p->exp -= amount; if (permanent) p->max_exp -= amount; adjust_level(p, TRUE); } byte player_hp_attr(struct player *p) { byte attr; if (p->chp >= p->mhp) attr = TERM_L_GREEN; else if (p->chp > (p->mhp * op_ptr->hitpoint_warn) / 10) attr = TERM_YELLOW; else attr = TERM_RED; return attr; } byte player_sp_attr(struct player *p) { byte attr; if (p->csp >= p->msp) attr = TERM_L_GREEN; else if (p->csp > (p->msp * op_ptr->hitpoint_warn) / 10) attr = TERM_YELLOW; else attr = TERM_RED; return attr; } angband-v3.3.2/src/player/util.c0000644000175000017500000000560211651552410016016 0ustar chriscchrisc/* player/util.c * Copyright (c) 2011 The Angband Developers. See COPYING. */ #include "angband.h" #include "cave.h" #include "object/tvalsval.h" /* * Modify a stat value by a "modifier", return new value * * Stats go up: 3,4,...,17,18,18/10,18/20,...,18/220 * Or even: 18/13, 18/23, 18/33, ..., 18/220 * * Stats go down: 18/220, 18/210,..., 18/10, 18, 17, ..., 3 * Or even: 18/13, 18/03, 18, 17, ..., 3 */ s16b modify_stat_value(int value, int amount) { int i; /* Reward */ if (amount > 0) { /* Apply each point */ for (i = 0; i < amount; i++) { /* One point at a time */ if (value < 18) value++; /* Ten "points" at a time */ else value += 10; } } /* Penalty */ else if (amount < 0) { /* Apply each point */ for (i = 0; i < (0 - amount); i++) { /* Ten points at a time */ if (value >= 18+10) value -= 10; /* Hack -- prevent weirdness */ else if (value > 18) value = 18; /* One point at a time */ else if (value > 3) value--; } } /* Return new value */ return (value); } /* Is the player capable of casting a spell? */ bool player_can_cast(void) { if (!p_ptr->class->spell_book) { msg("You cannot pray or produce magics."); return FALSE; } if (p_ptr->timed[TMD_BLIND] || no_light()) { msg("You cannot see!"); return FALSE; } if (p_ptr->timed[TMD_CONFUSED]) { msg("You are too confused!"); return FALSE; } return TRUE; } /* Is the player capable of studying? */ bool player_can_study(void) { if (!player_can_cast()) return FALSE; if (!p_ptr->new_spells) { const char *p = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); msg("You cannot learn any new %ss!", p); return FALSE; } return TRUE; } /* Determine if the player can read scrolls. */ bool player_can_read(void) { if (p_ptr->timed[TMD_BLIND]) { msg("You can't see anything."); return FALSE; } if (no_light()) { msg("You have no light to read by."); return FALSE; } if (p_ptr->timed[TMD_CONFUSED]) { msg("You are too confused to read!"); return FALSE; } if (p_ptr->timed[TMD_AMNESIA]) { msg("You can't remember how to read!"); return FALSE; } return TRUE; } /* Determine if the player can fire with the bow */ bool player_can_fire(void) { object_type *o_ptr = &p_ptr->inventory[INVEN_BOW]; /* Require a usable launcher */ if (!o_ptr->tval || !p_ptr->state.ammo_tval) { msg("You have nothing to fire with."); return FALSE; } return TRUE; } /* * Apply confusion, if needed, to a direction * * Display a message and return TRUE if direction changes. */ bool player_confuse_dir(struct player *p, int *dp, bool too) { int dir = *dp; if (p->timed[TMD_CONFUSED]) if ((dir == 5) || (randint0(100) < 75)) /* Random direction */ dir = ddd[randint0(8)]; if (*dp != dir) { if (too) msg("You are too confused."); else msg("You are confused."); *dp = dir; return TRUE; } return FALSE; } angband-v3.3.2/src/player/types.h0000644000175000017500000002434311651552410016215 0ustar chriscchrisc#ifndef INCLUDED_PLAYER_TYPES_H #define INCLUDED_PLAYER_TYPES_H #include "object/obj-flag.h" #include "object/object.h" #include "option.h" #include "ui-event.h" typedef struct { s16b speed; /* Current speed */ s16b num_blows; /* Number of blows x100 */ s16b num_shots; /* Number of shots */ byte ammo_mult; /* Ammo multiplier */ byte ammo_tval; /* Ammo variety */ s16b stat_add[A_MAX]; /* Equipment stat bonuses */ s16b stat_ind[A_MAX]; /* Indexes into stat tables */ s16b stat_use[A_MAX]; /* Current modified stats */ s16b stat_top[A_MAX]; /* Maximal modified stats */ s16b dis_ac; /* Known base ac */ s16b ac; /* Base ac */ s16b dis_to_a; /* Known bonus to ac */ s16b to_a; /* Bonus to ac */ s16b to_h; /* Bonus to hit */ s16b dis_to_h; /* Known bonus to hit */ s16b to_d; /* Bonus to dam */ s16b dis_to_d; /* Known bonus to dam */ s16b see_infra; /* Infravision range */ s16b skills[SKILL_MAX]; /* Skills */ u32b noise; /* Derived from stealth */ bool heavy_wield; /* Heavy weapon */ bool heavy_shoot; /* Heavy shooter */ bool icky_wield; /* Icky weapon shooter */ bitflag flags[OF_SIZE]; /* Status flags from race and items */ } player_state; /* * Most of the "player" information goes here. * * This stucture gives us a large collection of player variables. * * This entire structure is wiped when a new character is born. * * This structure is more or less laid out so that the information * which must be saved in the savefile precedes all the information * which can be recomputed as needed. */ typedef struct player { s16b py; /* Player location */ s16b px; /* Player location */ byte psex; /* Sex index */ byte oops; /* Unused */ const struct player_sex *sex; const struct player_race *race; const struct player_class *class; byte hitdie; /* Hit dice (sides) */ byte expfact; /* Experience factor */ s16b age; /* Characters age */ s16b ht; /* Height */ s16b wt; /* Weight */ s16b sc; /* Social Class */ s32b au; /* Current Gold */ s16b max_depth; /* Max depth */ s16b depth; /* Cur depth */ s16b max_lev; /* Max level */ s16b lev; /* Cur level */ s32b max_exp; /* Max experience */ s32b exp; /* Cur experience */ u16b exp_frac; /* Cur exp frac (times 2^16) */ s16b mhp; /* Max hit pts */ s16b chp; /* Cur hit pts */ u16b chp_frac; /* Cur hit frac (times 2^16) */ s16b msp; /* Max mana pts */ s16b csp; /* Cur mana pts */ u16b csp_frac; /* Cur mana frac (times 2^16) */ s16b stat_max[A_MAX]; /* Current "maximal" stat values */ s16b stat_cur[A_MAX]; /* Current "natural" stat values */ s16b timed[TMD_MAX]; /* Timed effects */ s16b word_recall; /* Word of recall counter */ s16b energy; /* Current energy */ s16b food; /* Current nutrition */ byte confusing; /* Glowing hands */ byte searching; /* Currently searching */ byte unignoring; /* Unignoring */ byte spell_flags[PY_MAX_SPELLS]; /* Spell flags */ byte spell_order[PY_MAX_SPELLS]; /* Spell order */ s16b player_hp[PY_MAX_LEVEL]; /* HP Array */ char died_from[80]; /* Cause of death */ char *history; u16b total_winner; /* Total winner */ u16b panic_save; /* Panic save */ u16b noscore; /* Cheating flags */ bool is_dead; /* Player is dead */ bool wizard; /* Player is in wizard mode */ /*** Temporary fields ***/ bool playing; /* True if player is playing */ bool leaving; /* True if player is leaving */ bool autosave; /* True if autosave is pending */ bool randarts; /* True if randarts have been loaded/generated */ bool create_up_stair; /* Create up stair on next level */ bool create_down_stair; /* Create down stair on next level */ s32b total_weight; /* Total weight being carried */ s16b inven_cnt; /* Number of items in inventory */ s16b equip_cnt; /* Number of items in equipment */ s16b health_who; /* Health bar trackee */ s16b monster_race_idx; /* Monster race trackee */ s16b object_idx; /* Object trackee */ s16b object_kind_idx; /* Object kind trackee */ s16b energy_use; /* Energy use this turn */ s16b resting; /* Resting counter */ s16b running; /* Running counter */ bool running_withpathfind; /* Are we using the pathfinder ? */ bool running_firststep; /* Is this our first step running? */ s16b run_cur_dir; /* Direction we are running */ s16b run_old_dir; /* Direction we came from */ bool run_unused; /* Unused (padding field) */ bool run_open_area; /* Looking for an open area */ bool run_break_right; /* Looking for a break (right) */ bool run_break_left; /* Looking for a break (left) */ s16b command_arg; /* Gives argument of current command (generally a repeat count) */ s16b command_wrk; /* Used by the UI to decide whether to start off showing equipment or inventory listings when offering a choice. See obj/obj-ui.c*/ s16b new_spells; /* Number of spells available */ bool cumber_armor; /* Mana draining armor */ bool cumber_glove; /* Mana draining gloves */ s16b cur_light; /* Radius of light (if any) */ u32b notice; /* Bit flags for pending "special" actions to carry out after the current "action", such as reordering inventory, squelching, etc. */ u32b update; /* Bit flags for recalculations needed after this "action", such as HP, or visible area */ u32b redraw; /* Bit flags for things that /have/ changed, and just need to be redrawn by the UI, such as HP, Speed, etc.*/ u32b total_energy; /* Total energy used (including resting) */ u32b resting_turn; /* Number of player turns spent resting */ /* Generation fields (for quick start) */ s32b au_birth; /* Birth gold when option birth_money is false */ s16b stat_birth[A_MAX]; /* Birth "natural" stat values */ s16b ht_birth; /* Birth Height */ s16b wt_birth; /* Birth Weight */ s16b sc_birth; /* Birth social class */ /* Variable and calculatable player state */ player_state state; /* "cached" quiver statistics*/ u16b quiver_size; u16b quiver_slots; u16b quiver_remainder; struct object *inventory; } player_type; /* * Player sex info */ typedef struct player_sex { const char *title; /* Type of sex */ const char *winner; /* Name of winner */ } player_sex; /* * Player racial info */ typedef struct player_race { struct player_race *next; const char *name; unsigned int ridx; s16b r_adj[A_MAX]; /* Racial stat bonuses */ s16b r_skills[SKILL_MAX]; /* racial skills */ byte r_mhp; /* Race hit-dice modifier */ byte r_exp; /* Race experience factor */ byte b_age; /* base age */ byte m_age; /* mod age */ byte m_b_ht; /* base height (males) */ byte m_m_ht; /* mod height (males) */ byte m_b_wt; /* base weight (males) */ byte m_m_wt; /* mod weight (males) */ byte f_b_ht; /* base height (females) */ byte f_m_ht; /* mod height (females) */ byte f_b_wt; /* base weight (females) */ byte f_m_wt; /* mod weight (females) */ byte infra; /* Infra-vision range */ byte choice; /* Legal class choices */ struct history_chart *history; bitflag flags[OF_SIZE]; /* Racial (object) flags */ bitflag pflags[PF_SIZE]; /* Racial (player) flags */ } player_race; struct start_item { object_kind *kind; byte min; /* Minimum starting amount */ byte max; /* Maximum starting amount */ struct start_item *next; }; /* * A structure to hold class-dependent information on spells. */ typedef struct { byte slevel; /* Required level (to learn) */ byte smana; /* Required mana (to cast) */ byte sfail; /* Minimum chance of failure */ byte sexp; /* Encoded experience bonus */ } magic_type; /* * Information about the player's "magic" * * Note that a player with a "spell_book" of "zero" is illiterate. */ typedef struct { magic_type info[PY_MAX_SPELLS]; /* The available spells */ } player_magic; /* * Player class info */ typedef struct player_class { struct player_class *next; const char *name; unsigned int cidx; const char *title[10]; /* Titles - offset */ s16b c_adj[A_MAX]; /* Class stat modifier */ s16b c_skills[SKILL_MAX]; /* class skills */ s16b x_skills[SKILL_MAX]; /* extra skills */ s16b c_mhp; /* Class hit-dice adjustment */ s16b c_exp; /* Class experience factor */ bitflag pflags[PF_SIZE]; /* Class (player) flags */ u16b max_attacks; /* Maximum possible attacks */ u16b min_weight; /* Minimum weapon weight for calculations */ u16b att_multiply; /* Multiplier for attack calculations */ byte spell_book; /* Tval of spell books (if any) */ u16b spell_stat; /* Stat for spells (if any) */ u16b spell_first; /* Level of first spell */ u16b spell_weight; /* Weight that hurts spells */ u32b sense_base; /* Base pseudo-id value */ u16b sense_div; /* Pseudo-id divisor */ struct start_item *start_items; /**< The starting inventory */ player_magic spells; /* Magic spells */ } player_class; /* Histories are a graph of charts; each chart contains a set of individual * entries for that chart, and each entry contains a text description and a * successor chart to move history generation to. * For example: * chart 1 { * entry { * desc "You are the illegitimate and unacknowledged child"; * next 2; * }; * entry { * desc "You are the illegitimate but acknowledged child"; * next 2; * }; * entry { * desc "You are one of several children"; * next 3; * }; * }; * * History generation works by walking the graph from the starting chart for * each race, picking a random entry (with weighted probability) each time. */ struct history_entry { struct history_entry *next; struct history_chart *succ; int isucc; int roll; int bonus; char *text; }; struct history_chart { struct history_chart *next; struct history_entry *entries; unsigned int idx; }; /* * Some more player information * * This information is retained across player lives */ typedef struct { char full_name[32]; /* Full name */ char base_name[32]; /* Base name */ bool opt[OPT_MAX]; /* Options */ u32b window_flag[ANGBAND_TERM_MAX]; /* Window flags */ byte hitpoint_warn; /* Hitpoint warning (0 to 9) */ byte delay_factor; /* Delay factor (0 to 9) */ byte name_suffix; /* numeric suffix for player name */ } player_other; #endif /* INCLUDED_PLAYER_TYPES_H */ angband-v3.3.2/src/player/spell.c0000644000175000017500000002137111651552410016161 0ustar chriscchrisc/* * File: player/spell.c * Purpose: Spell and prayer casting/praying * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "object/tvalsval.h" #include "game-cmd.h" #include "spells.h" /* * Stat Table (INT/WIS) -- Minimum failure rate (percentage) */ static const byte adj_mag_fail[STAT_RANGE] = { 99 /* 3 */, 99 /* 4 */, 99 /* 5 */, 99 /* 6 */, 99 /* 7 */, 50 /* 8 */, 30 /* 9 */, 20 /* 10 */, 15 /* 11 */, 12 /* 12 */, 11 /* 13 */, 10 /* 14 */, 9 /* 15 */, 8 /* 16 */, 7 /* 17 */, 6 /* 18/00-18/09 */, 6 /* 18/10-18/19 */, 5 /* 18/20-18/29 */, 5 /* 18/30-18/39 */, 5 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 4 /* 18/60-18/69 */, 4 /* 18/70-18/79 */, 4 /* 18/80-18/89 */, 3 /* 18/90-18/99 */, 3 /* 18/100-18/109 */, 2 /* 18/110-18/119 */, 2 /* 18/120-18/129 */, 2 /* 18/130-18/139 */, 2 /* 18/140-18/149 */, 1 /* 18/150-18/159 */, 1 /* 18/160-18/169 */, 1 /* 18/170-18/179 */, 1 /* 18/180-18/189 */, 1 /* 18/190-18/199 */, 0 /* 18/200-18/209 */, 0 /* 18/210-18/219 */, 0 /* 18/220+ */ }; /* * Stat Table (INT/WIS) -- failure rate adjustment */ static const int adj_mag_stat[STAT_RANGE] = { -5 /* 3 */, -4 /* 4 */, -3 /* 5 */, -3 /* 6 */, -2 /* 7 */, -1 /* 8 */, 0 /* 9 */, 0 /* 10 */, 0 /* 11 */, 0 /* 12 */, 0 /* 13 */, 1 /* 14 */, 2 /* 15 */, 3 /* 16 */, 4 /* 17 */, 5 /* 18/00-18/09 */, 6 /* 18/10-18/19 */, 7 /* 18/20-18/29 */, 8 /* 18/30-18/39 */, 9 /* 18/40-18/49 */, 10 /* 18/50-18/59 */, 11 /* 18/60-18/69 */, 12 /* 18/70-18/79 */, 15 /* 18/80-18/89 */, 18 /* 18/90-18/99 */, 21 /* 18/100-18/109 */, 24 /* 18/110-18/119 */, 27 /* 18/120-18/129 */, 30 /* 18/130-18/139 */, 33 /* 18/140-18/149 */, 36 /* 18/150-18/159 */, 39 /* 18/160-18/169 */, 42 /* 18/170-18/179 */, 45 /* 18/180-18/189 */, 48 /* 18/190-18/199 */, 51 /* 18/200-18/209 */, 54 /* 18/210-18/219 */, 57 /* 18/220+ */ }; /** * Compare function for sorting spells into book order */ static int cmp_spell(const void *s1, const void *s2) { int spell1 = *(int*)s1 + (p_ptr->class->spell_book == TV_MAGIC_BOOK ? 0 : PY_MAX_SPELLS); int spell2 = *(int*)s2 + (p_ptr->class->spell_book == TV_MAGIC_BOOK ? 0 : PY_MAX_SPELLS); int pos1 = s_info[spell1].snum; int pos2 = s_info[spell2].snum; if (pos1 < pos2) return -1; if (pos1 > pos2) return 1; return 0; } /** * Collect spells from a book into the spells[] array. */ int spell_collect_from_book(const object_type *o_ptr, int *spells) { struct spell *sp; int n_spells = 0; for (sp = o_ptr->kind->spells; sp; sp = sp->next) { spells[n_spells++] = sp->spell_index; } sort(spells, n_spells, sizeof(int), cmp_spell); return n_spells; } /** * Return the number of castable spells in the spellbook 'o_ptr'. */ int spell_book_count_spells(const object_type *o_ptr, bool (*tester)(int spell)) { struct spell *sp; int n_spells = 0; for (sp = o_ptr->kind->spells; sp; sp = sp->next) if (tester(sp->spell_index)) n_spells++; return n_spells; } /** * True if at least one spell in spells[] is OK according to spell_test. */ bool spell_okay_list(bool (*spell_test)(int spell), const int spells[], int n_spells) { int i; bool okay = FALSE; for (i = 0; i < n_spells; i++) { if (spell_test(spells[i])) okay = TRUE; } return okay; } /** * True if the spell is castable. */ bool spell_okay_to_cast(int spell) { return (p_ptr->spell_flags[spell] & PY_SPELL_LEARNED); } /** * True if the spell can be studied. */ bool spell_okay_to_study(int spell) { const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; return (s_ptr->slevel <= p_ptr->lev) && !(p_ptr->spell_flags[spell] & PY_SPELL_LEARNED); } /** * True if the spell is browsable. */ bool spell_okay_to_browse(int spell) { const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; return (s_ptr->slevel < 99); } /* * Returns chance of failure for a spell */ s16b spell_chance(int spell) { int chance, minfail; const magic_type *s_ptr; /* Paranoia -- must be literate */ if (!p_ptr->class->spell_book) return (100); /* Get the spell */ s_ptr = &p_ptr->class->spells.info[spell]; /* Extract the base spell failure rate */ chance = s_ptr->sfail; /* Reduce failure rate by "effective" level adjustment */ chance -= 3 * (p_ptr->lev - s_ptr->slevel); /* Reduce failure rate by INT/WIS adjustment */ chance -= adj_mag_stat[p_ptr->state.stat_ind[p_ptr->class->spell_stat]]; /* Not enough mana to cast */ if (s_ptr->smana > p_ptr->csp) { chance += 5 * (s_ptr->smana - p_ptr->csp); } /* Extract the minimum failure rate */ minfail = adj_mag_fail[p_ptr->state.stat_ind[p_ptr->class->spell_stat]]; /* Non mage/priest characters never get better than 5 percent */ if (!player_has(PF_ZERO_FAIL) && minfail < 5) { minfail = 5; } /* Priest prayer penalty for "edged" weapons (before minfail) */ if (p_ptr->state.icky_wield) { chance += 25; } /* Fear makes spells harder (before minfail) */ /* Note that spells that remove fear have a much lower fail rate than * surrounding spells, to make sure this doesn't cause mega fail */ if (check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) chance += 20; /* Minimal and maximal failure rate */ if (chance < minfail) chance = minfail; if (chance > 50) chance = 50; /* Stunning makes spells harder (after minfail) */ if (p_ptr->timed[TMD_STUN] > 50) chance += 25; else if (p_ptr->timed[TMD_STUN]) chance += 15; /* Amnesia doubles failure change */ if (p_ptr->timed[TMD_AMNESIA]) chance = 50 + chance / 2; /* Always a 5 percent chance of working */ if (chance > 95) chance = 95; /* Return the chance */ return (chance); } /* Check if the given spell is in the given book. */ bool spell_in_book(int spell, int book) { struct spell *sp; object_type *o_ptr = object_from_item_idx(book); for (sp = o_ptr->kind->spells; sp; sp = sp->next) if (spell == sp->spell_index) return TRUE; return FALSE; } /* * Learn the specified spell. */ void spell_learn(int spell) { int i; const char *p = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Learn the spell */ p_ptr->spell_flags[spell] |= PY_SPELL_LEARNED; /* Find the next open entry in "spell_order[]" */ for (i = 0; i < PY_MAX_SPELLS; i++) { /* Stop at the first empty space */ if (p_ptr->spell_order[i] == 99) break; } /* Add the spell to the known list */ p_ptr->spell_order[i] = spell; /* Mention the result */ msgt(MSG_STUDY, "You have learned the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, spell)); /* One less spell available */ p_ptr->new_spells--; /* Message if needed */ if (p_ptr->new_spells) { /* Message */ msg("You can learn %d more %s%s.", p_ptr->new_spells, p, PLURAL(p_ptr->new_spells)); } /* Redraw Study Status */ p_ptr->redraw |= (PR_STUDY | PR_OBJECT); } /* Cas the specified spell */ bool spell_cast(int spell, int dir) { int chance; /* Get the spell */ const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; /* Spell failure chance */ chance = spell_chance(spell); /* Failed spell */ if (randint0(100) < chance) { flush(); msg("You failed to concentrate hard enough!"); } /* Process spell */ else { /* Cast the spell */ if (!cast_spell(p_ptr->class->spell_book, spell, dir)) return FALSE; /* A spell was cast */ sound(MSG_SPELL); if (!(p_ptr->spell_flags[spell] & PY_SPELL_WORKED)) { int e = s_ptr->sexp; /* The spell worked */ p_ptr->spell_flags[spell] |= PY_SPELL_WORKED; /* Gain experience */ player_exp_gain(p_ptr, e * s_ptr->slevel); /* Redraw object recall */ p_ptr->redraw |= (PR_OBJECT); } } /* Sufficient mana */ if (s_ptr->smana <= p_ptr->csp) { /* Use some mana */ p_ptr->csp -= s_ptr->smana; } /* Over-exert the player */ else { int oops = s_ptr->smana - p_ptr->csp; /* No mana left */ p_ptr->csp = 0; p_ptr->csp_frac = 0; /* Message */ msg("You faint from the effort!"); /* Bypass free action */ (void)player_inc_timed(p_ptr, TMD_PARALYZED, randint1(5 * oops + 1), TRUE, FALSE); /* Damage CON (possibly permanently) */ if (randint0(100) < 50) { bool perm = (randint0(100) < 25); /* Message */ msg("You have damaged your health!"); /* Reduce constitution */ player_stat_dec(p_ptr, A_CON, perm); } } /* Redraw mana */ p_ptr->redraw |= (PR_MANA); return TRUE; } angband-v3.3.2/src/player/player.h0000644000175000017500000000452411651552410016344 0ustar chriscchrisc/* player/player.h - player interface */ #ifndef PLAYER_PLAYER_H #define PLAYER_PLAYER_H #include "guid.h" #include "object/obj-flag.h" #include "object/object.h" #include "player/types.h" /* calcs.c */ extern const byte adj_chr_gold[STAT_RANGE]; extern const byte adj_str_blow[STAT_RANGE]; extern const byte adj_dex_safe[STAT_RANGE]; extern const byte adj_con_fix[STAT_RANGE]; extern const byte adj_str_hold[STAT_RANGE]; void calc_bonuses(object_type inventory[], player_state *state, bool id_only); int calc_blows(const object_type *o_ptr, player_state *state, int extra_blows); void notice_stuff(struct player *p); void update_stuff(struct player *p); void redraw_stuff(struct player *p); void handle_stuff(struct player *p); int weight_remaining(void); /* class.c */ extern struct player_class *player_id2class(guid id); /* player.c */ extern bool player_stat_inc(struct player *p, int stat); extern bool player_stat_dec(struct player *p, int stat, bool permanent); extern void player_exp_gain(struct player *p, s32b amount); extern void player_exp_lose(struct player *p, s32b amount, bool permanent); extern byte player_hp_attr(struct player *p); extern byte player_sp_attr(struct player *p); /* race.c */ extern struct player_race *player_id2race(guid id); /* spell.c */ int spell_collect_from_book(const object_type *o_ptr, int *spells); int spell_book_count_spells(const object_type *o_ptr, bool (*tester)(int spell)); bool spell_okay_list(bool (*spell_test)(int spell), const int spells[], int n_spells); bool spell_okay_to_cast(int spell); bool spell_okay_to_study(int spell); bool spell_okay_to_browse(int spell); bool spell_in_book(int spell, int book); s16b spell_chance(int spell); void spell_learn(int spell); bool spell_cast(int spell, int dir); /* timed.c */ bool player_set_timed(struct player *p, int idx, int v, bool notify); bool player_inc_timed(struct player *p, int idx, int v, bool notify, bool check); bool player_dec_timed(struct player *p, int idx, int v, bool notify); bool player_clear_timed(struct player *p, int idx, bool notify); bool player_set_food(struct player *p, int v); /* util.c */ s16b modify_stat_value(int value, int amount); bool player_can_cast(void); bool player_can_study(void); bool player_can_read(void); bool player_can_fire(void); bool player_confuse_dir(struct player *p, int *dir, bool too); #endif /* !PLAYER_PLAYER_H */ angband-v3.3.2/src/player/calcs.c0000644000175000017500000015125311651552410016132 0ustar chriscchrisc/* * File: player/calcs.c * Purpose: Player status calculation, signalling ui events based on status * changes. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "files.h" #include "game-event.h" #include "monster/mon-msg.h" #include "monster/mon-util.h" #include "object/tvalsval.h" #include "object/pval.h" #include "spells.h" #include "squelch.h" /* * Stat Table (CHR) -- payment percentages */ const byte adj_chr_gold[STAT_RANGE] = { 143 /* 3 */, 137 /* 4 */, 134 /* 5 */, 132 /* 6 */, 129 /* 7 */, 127 /* 8 */, 123 /* 9 */, 122 /* 10 */, 121 /* 11 */, 118 /* 12 */, 116 /* 13 */, 113 /* 14 */, 113 /* 15 */, 112 /* 16 */, 111 /* 17 */, 110 /* 18/00-18/09 */, 108 /* 18/10-18/19 */, 107 /* 18/20-18/29 */, 106 /* 18/30-18/39 */, 105 /* 18/40-18/49 */, 104 /* 18/50-18/59 */, 103 /* 18/60-18/69 */, 102 /* 18/70-18/79 */, 101 /* 18/80-18/89 */, 100 /* 18/90-18/99 */, 99 /* 18/100-18/109 */, 97 /* 18/110-18/119 */, 96 /* 18/120-18/129 */, 95 /* 18/130-18/139 */, 94 /* 18/140-18/149 */, 93 /* 18/150-18/159 */, 92 /* 18/160-18/169 */, 91 /* 18/170-18/179 */, 90 /* 18/180-18/189 */, 90 /* 18/190-18/199 */, 90 /* 18/200-18/209 */, 90 /* 18/210-18/219 */, 90 /* 18/220+ */ }; /* * Stat Table (INT) -- Magic devices */ static const byte adj_int_dev[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 2 /* 15 */, 2 /* 16 */, 2 /* 17 */, 3 /* 18/00-18/09 */, 3 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 3 /* 18/30-18/39 */, 3 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 4 /* 18/60-18/69 */, 5 /* 18/70-18/79 */, 5 /* 18/80-18/89 */, 6 /* 18/90-18/99 */, 6 /* 18/100-18/109 */, 7 /* 18/110-18/119 */, 7 /* 18/120-18/129 */, 8 /* 18/130-18/139 */, 8 /* 18/140-18/149 */, 9 /* 18/150-18/159 */, 9 /* 18/160-18/169 */, 10 /* 18/170-18/179 */, 10 /* 18/180-18/189 */, 11 /* 18/190-18/199 */, 11 /* 18/200-18/209 */, 12 /* 18/210-18/219 */, 13 /* 18/220+ */ }; /* * Stat Table (WIS) -- Saving throw */ static const byte adj_wis_sav[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 2 /* 15 */, 2 /* 16 */, 2 /* 17 */, 3 /* 18/00-18/09 */, 3 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 3 /* 18/30-18/39 */, 3 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 4 /* 18/60-18/69 */, 5 /* 18/70-18/79 */, 5 /* 18/80-18/89 */, 6 /* 18/90-18/99 */, 7 /* 18/100-18/109 */, 8 /* 18/110-18/119 */, 9 /* 18/120-18/129 */, 10 /* 18/130-18/139 */, 11 /* 18/140-18/149 */, 12 /* 18/150-18/159 */, 13 /* 18/160-18/169 */, 14 /* 18/170-18/179 */, 15 /* 18/180-18/189 */, 16 /* 18/190-18/199 */, 17 /* 18/200-18/209 */, 18 /* 18/210-18/219 */, 19 /* 18/220+ */ }; /* * Stat Table (DEX) -- disarming */ static const byte adj_dex_dis[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 0 /* 8 */, 0 /* 9 */, 0 /* 10 */, 0 /* 11 */, 0 /* 12 */, 1 /* 13 */, 1 /* 14 */, 1 /* 15 */, 2 /* 16 */, 2 /* 17 */, 4 /* 18/00-18/09 */, 4 /* 18/10-18/19 */, 4 /* 18/20-18/29 */, 4 /* 18/30-18/39 */, 5 /* 18/40-18/49 */, 5 /* 18/50-18/59 */, 5 /* 18/60-18/69 */, 6 /* 18/70-18/79 */, 6 /* 18/80-18/89 */, 7 /* 18/90-18/99 */, 8 /* 18/100-18/109 */, 8 /* 18/110-18/119 */, 8 /* 18/120-18/129 */, 8 /* 18/130-18/139 */, 8 /* 18/140-18/149 */, 9 /* 18/150-18/159 */, 9 /* 18/160-18/169 */, 9 /* 18/170-18/179 */, 9 /* 18/180-18/189 */, 9 /* 18/190-18/199 */, 10 /* 18/200-18/209 */, 10 /* 18/210-18/219 */, 10 /* 18/220+ */ }; /* * Stat Table (INT) -- disarming */ static const byte adj_int_dis[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 2 /* 15 */, 2 /* 16 */, 2 /* 17 */, 3 /* 18/00-18/09 */, 3 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 4 /* 18/30-18/39 */, 4 /* 18/40-18/49 */, 5 /* 18/50-18/59 */, 6 /* 18/60-18/69 */, 7 /* 18/70-18/79 */, 8 /* 18/80-18/89 */, 9 /* 18/90-18/99 */, 10 /* 18/100-18/109 */, 10 /* 18/110-18/119 */, 11 /* 18/120-18/129 */, 12 /* 18/130-18/139 */, 13 /* 18/140-18/149 */, 14 /* 18/150-18/159 */, 15 /* 18/160-18/169 */, 16 /* 18/170-18/179 */, 17 /* 18/180-18/189 */, 18 /* 18/190-18/199 */, 19 /* 18/200-18/209 */, 19 /* 18/210-18/219 */, 19 /* 18/220+ */ }; /* * Stat Table (DEX) -- bonus to ac (plus 128) */ static const byte adj_dex_ta[STAT_RANGE] = { 128 + -4 /* 3 */, 128 + -3 /* 4 */, 128 + -2 /* 5 */, 128 + -1 /* 6 */, 128 + 0 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 1 /* 15 */, 128 + 1 /* 16 */, 128 + 1 /* 17 */, 128 + 2 /* 18/00-18/09 */, 128 + 2 /* 18/10-18/19 */, 128 + 2 /* 18/20-18/29 */, 128 + 2 /* 18/30-18/39 */, 128 + 2 /* 18/40-18/49 */, 128 + 3 /* 18/50-18/59 */, 128 + 3 /* 18/60-18/69 */, 128 + 3 /* 18/70-18/79 */, 128 + 4 /* 18/80-18/89 */, 128 + 5 /* 18/90-18/99 */, 128 + 6 /* 18/100-18/109 */, 128 + 7 /* 18/110-18/119 */, 128 + 8 /* 18/120-18/129 */, 128 + 9 /* 18/130-18/139 */, 128 + 9 /* 18/140-18/149 */, 128 + 10 /* 18/150-18/159 */, 128 + 11 /* 18/160-18/169 */, 128 + 12 /* 18/170-18/179 */, 128 + 13 /* 18/180-18/189 */, 128 + 14 /* 18/190-18/199 */, 128 + 15 /* 18/200-18/209 */, 128 + 15 /* 18/210-18/219 */, 128 + 15 /* 18/220+ */ }; /* * Stat Table (STR) -- bonus to dam (plus 128) */ static const byte adj_str_td[STAT_RANGE] = { 128 + -2 /* 3 */, 128 + -2 /* 4 */, 128 + -1 /* 5 */, 128 + -1 /* 6 */, 128 + 0 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 0 /* 15 */, 128 + 1 /* 16 */, 128 + 2 /* 17 */, 128 + 2 /* 18/00-18/09 */, 128 + 2 /* 18/10-18/19 */, 128 + 3 /* 18/20-18/29 */, 128 + 3 /* 18/30-18/39 */, 128 + 3 /* 18/40-18/49 */, 128 + 3 /* 18/50-18/59 */, 128 + 3 /* 18/60-18/69 */, 128 + 4 /* 18/70-18/79 */, 128 + 5 /* 18/80-18/89 */, 128 + 5 /* 18/90-18/99 */, 128 + 6 /* 18/100-18/109 */, 128 + 7 /* 18/110-18/119 */, 128 + 8 /* 18/120-18/129 */, 128 + 9 /* 18/130-18/139 */, 128 + 10 /* 18/140-18/149 */, 128 + 11 /* 18/150-18/159 */, 128 + 12 /* 18/160-18/169 */, 128 + 13 /* 18/170-18/179 */, 128 + 14 /* 18/180-18/189 */, 128 + 15 /* 18/190-18/199 */, 128 + 16 /* 18/200-18/209 */, 128 + 18 /* 18/210-18/219 */, 128 + 20 /* 18/220+ */ }; /* * Stat Table (DEX) -- bonus to hit (plus 128) */ static const byte adj_dex_th[STAT_RANGE] = { 128 + -3 /* 3 */, 128 + -2 /* 4 */, 128 + -2 /* 5 */, 128 + -1 /* 6 */, 128 + -1 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 0 /* 15 */, 128 + 1 /* 16 */, 128 + 2 /* 17 */, 128 + 3 /* 18/00-18/09 */, 128 + 3 /* 18/10-18/19 */, 128 + 3 /* 18/20-18/29 */, 128 + 3 /* 18/30-18/39 */, 128 + 3 /* 18/40-18/49 */, 128 + 4 /* 18/50-18/59 */, 128 + 4 /* 18/60-18/69 */, 128 + 4 /* 18/70-18/79 */, 128 + 4 /* 18/80-18/89 */, 128 + 5 /* 18/90-18/99 */, 128 + 6 /* 18/100-18/109 */, 128 + 7 /* 18/110-18/119 */, 128 + 8 /* 18/120-18/129 */, 128 + 9 /* 18/130-18/139 */, 128 + 9 /* 18/140-18/149 */, 128 + 10 /* 18/150-18/159 */, 128 + 11 /* 18/160-18/169 */, 128 + 12 /* 18/170-18/179 */, 128 + 13 /* 18/180-18/189 */, 128 + 14 /* 18/190-18/199 */, 128 + 15 /* 18/200-18/209 */, 128 + 15 /* 18/210-18/219 */, 128 + 15 /* 18/220+ */ }; /* * Stat Table (STR) -- bonus to hit (plus 128) */ static const byte adj_str_th[STAT_RANGE] = { 128 + -3 /* 3 */, 128 + -2 /* 4 */, 128 + -1 /* 5 */, 128 + -1 /* 6 */, 128 + 0 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 0 /* 15 */, 128 + 0 /* 16 */, 128 + 0 /* 17 */, 128 + 1 /* 18/00-18/09 */, 128 + 1 /* 18/10-18/19 */, 128 + 1 /* 18/20-18/29 */, 128 + 1 /* 18/30-18/39 */, 128 + 1 /* 18/40-18/49 */, 128 + 1 /* 18/50-18/59 */, 128 + 1 /* 18/60-18/69 */, 128 + 2 /* 18/70-18/79 */, 128 + 3 /* 18/80-18/89 */, 128 + 4 /* 18/90-18/99 */, 128 + 5 /* 18/100-18/109 */, 128 + 6 /* 18/110-18/119 */, 128 + 7 /* 18/120-18/129 */, 128 + 8 /* 18/130-18/139 */, 128 + 9 /* 18/140-18/149 */, 128 + 10 /* 18/150-18/159 */, 128 + 11 /* 18/160-18/169 */, 128 + 12 /* 18/170-18/179 */, 128 + 13 /* 18/180-18/189 */, 128 + 14 /* 18/190-18/199 */, 128 + 15 /* 18/200-18/209 */, 128 + 15 /* 18/210-18/219 */, 128 + 15 /* 18/220+ */ }; /* * Stat Table (STR) -- weight limit in deca-pounds */ static const byte adj_str_wgt[STAT_RANGE] = { 5 /* 3 */, 6 /* 4 */, 7 /* 5 */, 8 /* 6 */, 9 /* 7 */, 10 /* 8 */, 11 /* 9 */, 12 /* 10 */, 13 /* 11 */, 14 /* 12 */, 15 /* 13 */, 16 /* 14 */, 17 /* 15 */, 18 /* 16 */, 19 /* 17 */, 20 /* 18/00-18/09 */, 22 /* 18/10-18/19 */, 24 /* 18/20-18/29 */, 26 /* 18/30-18/39 */, 28 /* 18/40-18/49 */, 30 /* 18/50-18/59 */, 30 /* 18/60-18/69 */, 30 /* 18/70-18/79 */, 30 /* 18/80-18/89 */, 30 /* 18/90-18/99 */, 30 /* 18/100-18/109 */, 30 /* 18/110-18/119 */, 30 /* 18/120-18/129 */, 30 /* 18/130-18/139 */, 30 /* 18/140-18/149 */, 30 /* 18/150-18/159 */, 30 /* 18/160-18/169 */, 30 /* 18/170-18/179 */, 30 /* 18/180-18/189 */, 30 /* 18/190-18/199 */, 30 /* 18/200-18/209 */, 30 /* 18/210-18/219 */, 30 /* 18/220+ */ }; /* * Stat Table (STR) -- weapon weight limit in pounds */ const byte adj_str_hold[STAT_RANGE] = { 4 /* 3 */, 5 /* 4 */, 6 /* 5 */, 7 /* 6 */, 8 /* 7 */, 10 /* 8 */, 12 /* 9 */, 14 /* 10 */, 16 /* 11 */, 18 /* 12 */, 20 /* 13 */, 22 /* 14 */, 24 /* 15 */, 26 /* 16 */, 28 /* 17 */, 30 /* 18/00-18/09 */, 30 /* 18/10-18/19 */, 35 /* 18/20-18/29 */, 40 /* 18/30-18/39 */, 45 /* 18/40-18/49 */, 50 /* 18/50-18/59 */, 55 /* 18/60-18/69 */, 60 /* 18/70-18/79 */, 65 /* 18/80-18/89 */, 70 /* 18/90-18/99 */, 80 /* 18/100-18/109 */, 80 /* 18/110-18/119 */, 80 /* 18/120-18/129 */, 80 /* 18/130-18/139 */, 80 /* 18/140-18/149 */, 90 /* 18/150-18/159 */, 90 /* 18/160-18/169 */, 90 /* 18/170-18/179 */, 90 /* 18/180-18/189 */, 90 /* 18/190-18/199 */, 100 /* 18/200-18/209 */, 100 /* 18/210-18/219 */, 100 /* 18/220+ */ }; /* * Stat Table (STR) -- digging value */ static const byte adj_str_dig[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 1 /* 5 */, 2 /* 6 */, 3 /* 7 */, 4 /* 8 */, 4 /* 9 */, 5 /* 10 */, 5 /* 11 */, 6 /* 12 */, 6 /* 13 */, 7 /* 14 */, 7 /* 15 */, 8 /* 16 */, 8 /* 17 */, 9 /* 18/00-18/09 */, 10 /* 18/10-18/19 */, 12 /* 18/20-18/29 */, 15 /* 18/30-18/39 */, 20 /* 18/40-18/49 */, 25 /* 18/50-18/59 */, 30 /* 18/60-18/69 */, 35 /* 18/70-18/79 */, 40 /* 18/80-18/89 */, 45 /* 18/90-18/99 */, 50 /* 18/100-18/109 */, 55 /* 18/110-18/119 */, 60 /* 18/120-18/129 */, 65 /* 18/130-18/139 */, 70 /* 18/140-18/149 */, 75 /* 18/150-18/159 */, 80 /* 18/160-18/169 */, 85 /* 18/170-18/179 */, 90 /* 18/180-18/189 */, 95 /* 18/190-18/199 */, 100 /* 18/200-18/209 */, 100 /* 18/210-18/219 */, 100 /* 18/220+ */ }; /* * Stat Table (STR) -- help index into the "blow" table */ const byte adj_str_blow[STAT_RANGE] = { 3 /* 3 */, 4 /* 4 */, 5 /* 5 */, 6 /* 6 */, 7 /* 7 */, 8 /* 8 */, 9 /* 9 */, 10 /* 10 */, 11 /* 11 */, 12 /* 12 */, 13 /* 13 */, 14 /* 14 */, 15 /* 15 */, 16 /* 16 */, 17 /* 17 */, 20 /* 18/00-18/09 */, 30 /* 18/10-18/19 */, 40 /* 18/20-18/29 */, 50 /* 18/30-18/39 */, 60 /* 18/40-18/49 */, 70 /* 18/50-18/59 */, 80 /* 18/60-18/69 */, 90 /* 18/70-18/79 */, 100 /* 18/80-18/89 */, 110 /* 18/90-18/99 */, 120 /* 18/100-18/109 */, 130 /* 18/110-18/119 */, 140 /* 18/120-18/129 */, 150 /* 18/130-18/139 */, 160 /* 18/140-18/149 */, 170 /* 18/150-18/159 */, 180 /* 18/160-18/169 */, 190 /* 18/170-18/179 */, 200 /* 18/180-18/189 */, 210 /* 18/190-18/199 */, 220 /* 18/200-18/209 */, 230 /* 18/210-18/219 */, 240 /* 18/220+ */ }; /* * Stat Table (DEX) -- index into the "blow" table */ static const byte adj_dex_blow[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 0 /* 8 */, 0 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 1 /* 15 */, 1 /* 16 */, 2 /* 17 */, 2 /* 18/00-18/09 */, 2 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 3 /* 18/30-18/39 */, 4 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 5 /* 18/60-18/69 */, 5 /* 18/70-18/79 */, 6 /* 18/80-18/89 */, 6 /* 18/90-18/99 */, 7 /* 18/100-18/109 */, 7 /* 18/110-18/119 */, 8 /* 18/120-18/129 */, 8 /* 18/130-18/139 */, 8 /* 18/140-18/149 */, 9 /* 18/150-18/159 */, 9 /* 18/160-18/169 */, 9 /* 18/170-18/179 */, 10 /* 18/180-18/189 */, 10 /* 18/190-18/199 */, 11 /* 18/200-18/209 */, 11 /* 18/210-18/219 */, 11 /* 18/220+ */ }; /* * Stat Table (DEX) -- chance of avoiding "theft" and "falling" */ const byte adj_dex_safe[STAT_RANGE] = { 0 /* 3 */, 1 /* 4 */, 2 /* 5 */, 3 /* 6 */, 4 /* 7 */, 5 /* 8 */, 5 /* 9 */, 6 /* 10 */, 6 /* 11 */, 7 /* 12 */, 7 /* 13 */, 8 /* 14 */, 8 /* 15 */, 9 /* 16 */, 9 /* 17 */, 10 /* 18/00-18/09 */, 10 /* 18/10-18/19 */, 15 /* 18/20-18/29 */, 15 /* 18/30-18/39 */, 20 /* 18/40-18/49 */, 25 /* 18/50-18/59 */, 30 /* 18/60-18/69 */, 35 /* 18/70-18/79 */, 40 /* 18/80-18/89 */, 45 /* 18/90-18/99 */, 50 /* 18/100-18/109 */, 60 /* 18/110-18/119 */, 70 /* 18/120-18/129 */, 80 /* 18/130-18/139 */, 90 /* 18/140-18/149 */, 100 /* 18/150-18/159 */, 100 /* 18/160-18/169 */, 100 /* 18/170-18/179 */, 100 /* 18/180-18/189 */, 100 /* 18/190-18/199 */, 100 /* 18/200-18/209 */, 100 /* 18/210-18/219 */, 100 /* 18/220+ */ }; /* * Stat Table (CON) -- base regeneration rate */ const byte adj_con_fix[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 0 /* 8 */, 0 /* 9 */, 0 /* 10 */, 0 /* 11 */, 0 /* 12 */, 0 /* 13 */, 1 /* 14 */, 1 /* 15 */, 1 /* 16 */, 1 /* 17 */, 2 /* 18/00-18/09 */, 2 /* 18/10-18/19 */, 2 /* 18/20-18/29 */, 2 /* 18/30-18/39 */, 2 /* 18/40-18/49 */, 3 /* 18/50-18/59 */, 3 /* 18/60-18/69 */, 3 /* 18/70-18/79 */, 3 /* 18/80-18/89 */, 3 /* 18/90-18/99 */, 4 /* 18/100-18/109 */, 4 /* 18/110-18/119 */, 5 /* 18/120-18/129 */, 6 /* 18/130-18/139 */, 6 /* 18/140-18/149 */, 7 /* 18/150-18/159 */, 7 /* 18/160-18/169 */, 8 /* 18/170-18/179 */, 8 /* 18/180-18/189 */, 8 /* 18/190-18/199 */, 9 /* 18/200-18/209 */, 9 /* 18/210-18/219 */, 9 /* 18/220+ */ }; /* * Stat Table (CON) -- extra 1/100th hitpoints per level */ static const int adj_con_mhp[STAT_RANGE] = { -250 /* 3 */, -150 /* 4 */, -100 /* 5 */, -75 /* 6 */, -50 /* 7 */, -25 /* 8 */, -10 /* 9 */, -5 /* 10 */, 0 /* 11 */, 5 /* 12 */, 10 /* 13 */, 25 /* 14 */, 50 /* 15 */, 75 /* 16 */, 100 /* 17 */, 150 /* 18/00-18/09 */, 175 /* 18/10-18/19 */, 200 /* 18/20-18/29 */, 225 /* 18/30-18/39 */, 250 /* 18/40-18/49 */, 275 /* 18/50-18/59 */, 300 /* 18/60-18/69 */, 350 /* 18/70-18/79 */, 400 /* 18/80-18/89 */, 450 /* 18/90-18/99 */, 500 /* 18/100-18/109 */, 550 /* 18/110-18/119 */, 600 /* 18/120-18/129 */, 650 /* 18/130-18/139 */, 700 /* 18/140-18/149 */, 750 /* 18/150-18/159 */, 800 /* 18/160-18/169 */, 900 /* 18/170-18/179 */, 1000 /* 18/180-18/189 */, 1100 /* 18/190-18/199 */, 1250 /* 18/200-18/209 */, 1250 /* 18/210-18/219 */, 1250 /* 18/220+ */ }; static const int adj_mag_study[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 10 /* 5 */, 20 /* 6 */, 30 /* 7 */, 40 /* 8 */, 50 /* 9 */, 60 /* 10 */, 70 /* 11 */, 80 /* 12 */, 85 /* 13 */, 90 /* 14 */, 95 /* 15 */, 100 /* 16 */, 105 /* 17 */, 110 /* 18/00-18/09 */, 115 /* 18/10-18/19 */, 120 /* 18/20-18/29 */, 130 /* 18/30-18/39 */, 140 /* 18/40-18/49 */, 150 /* 18/50-18/59 */, 160 /* 18/60-18/69 */, 170 /* 18/70-18/79 */, 180 /* 18/80-18/89 */, 190 /* 18/90-18/99 */, 200 /* 18/100-18/109 */, 210 /* 18/110-18/119 */, 220 /* 18/120-18/129 */, 230 /* 18/130-18/139 */, 240 /* 18/140-18/149 */, 250 /* 18/150-18/159 */, 250 /* 18/160-18/169 */, 250 /* 18/170-18/179 */, 250 /* 18/180-18/189 */, 250 /* 18/190-18/199 */, 250 /* 18/200-18/209 */, 250 /* 18/210-18/219 */, 250 /* 18/220+ */ }; /* * Stat Table (INT/WIS) -- extra 1/100 mana-points per level */ static const int adj_mag_mana[STAT_RANGE] = { 0 /* 3 */, 10 /* 4 */, 20 /* 5 */, 30 /* 6 */, 40 /* 7 */, 50 /* 8 */, 60 /* 9 */, 70 /* 10 */, 80 /* 11 */, 90 /* 12 */, 100 /* 13 */, 110 /* 14 */, 120 /* 15 */, 130 /* 16 */, 140 /* 17 */, 150 /* 18/00-18/09 */, 160 /* 18/10-18/19 */, 170 /* 18/20-18/29 */, 180 /* 18/30-18/39 */, 190 /* 18/40-18/49 */, 200 /* 18/50-18/59 */, 225 /* 18/60-18/69 */, 250 /* 18/70-18/79 */, 300 /* 18/80-18/89 */, 350 /* 18/90-18/99 */, 400 /* 18/100-18/109 */, 450 /* 18/110-18/119 */, 500 /* 18/120-18/129 */, 550 /* 18/130-18/139 */, 600 /* 18/140-18/149 */, 650 /* 18/150-18/159 */, 700 /* 18/160-18/169 */, 750 /* 18/170-18/179 */, 800 /* 18/180-18/189 */, 800 /* 18/190-18/199 */, 800 /* 18/200-18/209 */, 800 /* 18/210-18/219 */, 800 /* 18/220+ */ }; /* * This table is used to help calculate the number of blows the player can * make in a single round of attacks (one player turn) with a normal weapon. * * This number ranges from a single blow/round for weak players to up to six * blows/round for powerful warriors. * * Note that certain artifacts and ego-items give "bonus" blows/round. * * First, from the player class, we extract some values: * * Warrior --> num = 6; mul = 5; div = MAX(30, weapon_weight); * Mage --> num = 4; mul = 2; div = MAX(40, weapon_weight); * Priest --> num = 4; mul = 3; div = MAX(35, weapon_weight); * Rogue --> num = 5; mul = 4; div = MAX(30, weapon_weight); * Ranger --> num = 5; mul = 4; div = MAX(35, weapon_weight); * Paladin --> num = 5; mul = 5; div = MAX(30, weapon_weight); * (all specified in p_class.txt now) * * To get "P", we look up the relevant "adj_str_blow[]" (see above), * multiply it by "mul", and then divide it by "div", rounding down. * * To get "D", we look up the relevant "adj_dex_blow[]" (see above). * * Then we look up the energy cost of each blow using "blows_table[P][D]". * The player gets blows/round equal to 100/this number, up to a maximum of * "num" blows/round, plus any "bonus" blows/round. */ static const byte blows_table[12][12] = { /* P */ /* D: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */ /* DEX: 3, 10, 17, /20, /40, /60, /80, /100,/120,/150,/180,/200 */ /* 0 */ { 100, 100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23 }, /* 1 */ { 100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23, 21 }, /* 2 */ { 95, 85, 75, 60, 50, 42, 35, 30, 26, 23, 21, 20 }, /* 3 */ { 85, 75, 60, 50, 42, 36, 32, 28, 25, 22, 20, 19 }, /* 4 */ { 75, 60, 50, 42, 36, 33, 28, 25, 23, 21, 19, 18 }, /* 5 */ { 60, 50, 42, 36, 33, 30, 27, 24, 22, 21, 19, 17 }, /* 6 */ { 50, 42, 36, 33, 30, 27, 25, 23, 21, 20, 18, 17 }, /* 7 */ { 42, 36, 33, 30, 28, 26, 24, 22, 20, 19, 18, 17 }, /* 8 */ { 36, 33, 30, 28, 26, 24, 22, 21, 20, 19, 17, 16 }, /* 9 */ { 35, 32, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16 }, /* 10 */ { 34, 30, 27, 25, 23, 22, 21, 20, 19, 18, 17, 16 }, /* 11+ */ { 33, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16, 15 }, /* DEX: 3, 10, 17, /20, /40, /60, /80, /100,/120,/150,/180,/200 */ }; /* * Calculate number of spells player should have, and forget, * or remember, spells until that number is properly reflected. * * Note that this function induces various "status" messages, * which must be bypasses until the character is created. */ static void calc_spells(void) { int i, j, k, levels; int num_allowed, num_known; int percent_spells; const magic_type *s_ptr; s16b old_spells; const char *p = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Hack -- must be literate */ if (!p_ptr->class->spell_book) return; /* Hack -- wait for creation */ if (!character_generated) return; /* Hack -- handle "xtra" mode */ if (character_xtra) return; /* Save the new_spells value */ old_spells = p_ptr->new_spells; /* Determine the number of spells allowed */ levels = p_ptr->lev - p_ptr->class->spell_first + 1; /* Hack -- no negative spells */ if (levels < 0) levels = 0; /* Number of 1/100 spells per level */ percent_spells = adj_mag_study[p_ptr->state.stat_ind[p_ptr->class->spell_stat]]; /* Extract total allowed spells (rounded up) */ num_allowed = (((percent_spells * levels) + 50) / 100); /* Assume none known */ num_known = 0; /* Count the number of spells we know */ for (j = 0; j < PY_MAX_SPELLS; j++) { /* Count known spells */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { num_known++; } } /* See how many spells we must forget or may learn */ p_ptr->new_spells = num_allowed - num_known; /* Forget spells which are too hard */ for (i = PY_MAX_SPELLS - 1; i >= 0; i--) { /* Get the spell */ j = p_ptr->spell_order[i]; /* Skip non-spells */ if (j >= 99) continue; /* Get the spell */ s_ptr = &p_ptr->class->spells.info[j]; /* Skip spells we are allowed to know */ if (s_ptr->slevel <= p_ptr->lev) continue; /* Is it known? */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { /* Mark as forgotten */ p_ptr->spell_flags[j] |= PY_SPELL_FORGOTTEN; /* No longer known */ p_ptr->spell_flags[j] &= ~PY_SPELL_LEARNED; /* Message */ msg("You have forgotten the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, j)); /* One more can be learned */ p_ptr->new_spells++; } } /* Forget spells if we know too many spells */ for (i = PY_MAX_SPELLS - 1; i >= 0; i--) { /* Stop when possible */ if (p_ptr->new_spells >= 0) break; /* Get the (i+1)th spell learned */ j = p_ptr->spell_order[i]; /* Skip unknown spells */ if (j >= 99) continue; /* Forget it (if learned) */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { /* Mark as forgotten */ p_ptr->spell_flags[j] |= PY_SPELL_FORGOTTEN; /* No longer known */ p_ptr->spell_flags[j] &= ~PY_SPELL_LEARNED; /* Message */ msg("You have forgotten the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, j)); /* One more can be learned */ p_ptr->new_spells++; } } /* Check for spells to remember */ for (i = 0; i < PY_MAX_SPELLS; i++) { /* None left to remember */ if (p_ptr->new_spells <= 0) break; /* Get the next spell we learned */ j = p_ptr->spell_order[i]; /* Skip unknown spells */ if (j >= 99) break; /* Get the spell */ s_ptr = &p_ptr->class->spells.info[j]; /* Skip spells we cannot remember */ if (s_ptr->slevel > p_ptr->lev) continue; /* First set of spells */ if (p_ptr->spell_flags[j] & PY_SPELL_FORGOTTEN) { /* No longer forgotten */ p_ptr->spell_flags[j] &= ~PY_SPELL_FORGOTTEN; /* Known once more */ p_ptr->spell_flags[j] |= PY_SPELL_LEARNED; /* Message */ msg("You have remembered the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, j)); /* One less can be learned */ p_ptr->new_spells--; } } /* Assume no spells available */ k = 0; /* Count spells that can be learned */ for (j = 0; j < PY_MAX_SPELLS; j++) { /* Get the spell */ s_ptr = &p_ptr->class->spells.info[j]; /* Skip spells we cannot remember or don't exist */ if (s_ptr->slevel > p_ptr->lev || s_ptr->slevel == 0) continue; /* Skip spells we already know */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { continue; } /* Count it */ k++; } /* Cannot learn more spells than exist */ if (p_ptr->new_spells > k) p_ptr->new_spells = k; /* Spell count changed */ if (old_spells != p_ptr->new_spells) { /* Message if needed */ if (p_ptr->new_spells) { /* Message */ msg("You can learn %d more %s%s.", p_ptr->new_spells, p, (p_ptr->new_spells != 1) ? "s" : ""); } /* Redraw Study Status */ p_ptr->redraw |= (PR_STUDY | PR_OBJECT); } } /* * Calculate maximum mana. You do not need to know any spells. * Note that mana is lowered by heavy (or inappropriate) armor. * * This function induces status messages. */ static void calc_mana(void) { int msp, levels, cur_wgt, max_wgt; object_type *o_ptr; bool old_cumber_glove = p_ptr->cumber_glove; bool old_cumber_armor = p_ptr->cumber_armor; /* Hack -- Must be literate */ if (!p_ptr->class->spell_book) { p_ptr->msp = 0; p_ptr->csp = 0; p_ptr->csp_frac = 0; return; } /* Extract "effective" player level */ levels = (p_ptr->lev - p_ptr->class->spell_first) + 1; if (levels > 0) { msp = 1; msp += adj_mag_mana[p_ptr->state.stat_ind[p_ptr->class->spell_stat]] * levels / 100; } else { levels = 0; msp = 0; } /* Process gloves for those disturbed by them */ if (player_has(PF_CUMBER_GLOVE)) { bitflag f[OF_SIZE]; /* Assume player is not encumbered by gloves */ p_ptr->cumber_glove = FALSE; /* Get the gloves */ o_ptr = &p_ptr->inventory[INVEN_HANDS]; /* Examine the gloves */ object_flags(o_ptr, f); /* Normal gloves hurt mage-type spells */ if (o_ptr->kind && !of_has(f, OF_FREE_ACT) && !of_has(f, OF_SPELLS_OK) && !(of_has(f, OF_DEX) && (o_ptr->pval[which_pval(o_ptr, OF_DEX)] > 0))) { /* Encumbered */ p_ptr->cumber_glove = TRUE; /* Reduce mana */ msp = (3 * msp) / 4; } } /* Assume player not encumbered by armor */ p_ptr->cumber_armor = FALSE; /* Weigh the armor */ cur_wgt = 0; cur_wgt += p_ptr->inventory[INVEN_BODY].weight; cur_wgt += p_ptr->inventory[INVEN_HEAD].weight; cur_wgt += p_ptr->inventory[INVEN_ARM].weight; cur_wgt += p_ptr->inventory[INVEN_OUTER].weight; cur_wgt += p_ptr->inventory[INVEN_HANDS].weight; cur_wgt += p_ptr->inventory[INVEN_FEET].weight; /* Determine the weight allowance */ max_wgt = p_ptr->class->spell_weight; /* Heavy armor penalizes mana */ if (((cur_wgt - max_wgt) / 10) > 0) { /* Encumbered */ p_ptr->cumber_armor = TRUE; /* Reduce mana */ msp -= ((cur_wgt - max_wgt) / 10); } /* Mana can never be negative */ if (msp < 0) msp = 0; /* Maximum mana has changed */ if (p_ptr->msp != msp) { /* Save new limit */ p_ptr->msp = msp; /* Enforce new limit */ if (p_ptr->csp >= msp) { p_ptr->csp = msp; p_ptr->csp_frac = 0; } /* Display mana later */ p_ptr->redraw |= (PR_MANA); } /* Hack -- handle "xtra" mode */ if (character_xtra) return; /* Take note when "glove state" changes */ if (old_cumber_glove != p_ptr->cumber_glove) { /* Message */ if (p_ptr->cumber_glove) { msg("Your covered hands feel unsuitable for spellcasting."); } else { msg("Your hands feel more suitable for spellcasting."); } } /* Take note when "armor state" changes */ if (old_cumber_armor != p_ptr->cumber_armor) { /* Message */ if (p_ptr->cumber_armor) { msg("The weight of your armor encumbers your movement."); } else { msg("You feel able to move more freely."); } } } /* * Calculate the players (maximal) hit points * * Adjust current hitpoints if necessary */ static void calc_hitpoints(void) { long bonus; int mhp; /* Get "1/100th hitpoint bonus per level" value */ bonus = adj_con_mhp[p_ptr->state.stat_ind[A_CON]]; /* Calculate hitpoints */ mhp = p_ptr->player_hp[p_ptr->lev-1] + (bonus * p_ptr->lev / 100); /* Always have at least one hitpoint per level */ if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1; /* New maximum hitpoints */ if (p_ptr->mhp != mhp) { /* Save new limit */ p_ptr->mhp = mhp; /* Enforce new limit */ if (p_ptr->chp >= mhp) { p_ptr->chp = mhp; p_ptr->chp_frac = 0; } /* Display hitpoints (later) */ p_ptr->redraw |= (PR_HP); } } /* * Calculate and set the current light radius. * * The brightest wielded object counts as the light source; radii do not add * up anymore. * * Note that a cursed light source no longer emits light. */ static void calc_torch(void) { int i; s16b old_light = p_ptr->cur_light; bool burn_light = TRUE; s16b new_light = 0; int extra_light = 0; /* Ascertain lightness if in the town */ if (!p_ptr->depth && ((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2))) burn_light = FALSE; /* Examine all wielded objects, use the brightest */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { bitflag f[OF_SIZE]; int amt = 0; object_type *o_ptr = &p_ptr->inventory[i]; /* Skip empty slots */ if (!o_ptr->kind) continue; /* Extract the flags */ object_flags(o_ptr, f); /* Cursed objects emit no light */ if (of_has(f, OF_LIGHT_CURSE)) amt = 0; /* Examine actual lights */ else if (o_ptr->tval == TV_LIGHT) { int flag_inc = of_has(f, OF_LIGHT) ? 1 : 0; /* Artifact lights provide permanent bright light */ if (o_ptr->artifact) amt = 3 + flag_inc; /* Non-artifact lights and those without fuel provide no light */ else if (!burn_light || o_ptr->timeout == 0) amt = 0; /* All lit lights provide at least radius 2 light */ else { amt = 2 + flag_inc; /* Torches below half fuel provide less light */ if (o_ptr->sval == SV_LIGHT_TORCH && o_ptr->timeout < (FUEL_TORCH / 4)) amt--; } } else { /* LIGHT flag on an non-cursed non-lights always increases radius */ if (of_has(f, OF_LIGHT)) extra_light++; } /* Alter p_ptr->cur_light if reasonable */ if (new_light < amt) new_light = amt; } /* Add bonus from LIGHT flags */ new_light += extra_light; /* Limit light */ new_light = MIN(new_light, 5); new_light = MAX(new_light, 0); /* Notice changes in the "light radius" */ if (old_light != new_light) { /* Update the visuals */ p_ptr->cur_light = new_light; p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); } } /* * Calculate the blows a player would get. * * \param o_ptr is the object for which we are calculating blows * \param state is the player state for which we are calculating blows * \param extra_blows is the number of +blows available from this object and * this state * * N.B. state->num_blows is now 100x the number of blows. */ int calc_blows(const object_type *o_ptr, player_state *state, int extra_blows) { int blows; int str_index, dex_index; int div; int blow_energy; /* Enforce a minimum "weight" (tenth pounds) */ div = ((o_ptr->weight < p_ptr->class->min_weight) ? p_ptr->class->min_weight : o_ptr->weight); /* Get the strength vs weight */ str_index = adj_str_blow[state->stat_ind[A_STR]] * p_ptr->class->att_multiply / div; /* Maximal value */ if (str_index > 11) str_index = 11; /* Index by dexterity */ dex_index = MIN(adj_dex_blow[state->stat_ind[A_DEX]], 11); /* Use the blows table to get energy per blow */ blow_energy = blows_table[str_index][dex_index]; blows = MIN((10000 / blow_energy), (100 * p_ptr->class->max_attacks)); /* Require at least one blow */ return MAX(blows + (100 * extra_blows), 100); } /* * Computes current weight limit. */ static int weight_limit(player_state *state) { int i; /* Weight limit based only on strength */ i = adj_str_wgt[state->stat_ind[A_STR]] * 100; /* Return the result */ return (i); } /* * Computes weight remaining before burdened. */ int weight_remaining(void) { int i; /* Weight limit based only on strength */ i = 60 * adj_str_wgt[p_ptr->state.stat_ind[A_STR]] - p_ptr->total_weight - 1; /* Return the result */ return (i); } /* * Calculate the players current "state", taking into account * not only race/class intrinsics, but also objects being worn * and temporary spell effects. * * See also calc_mana() and calc_hitpoints(). * * Take note of the new "speed code", in particular, a very strong * player will start slowing down as soon as he reaches 150 pounds, * but not until he reaches 450 pounds will he be half as fast as * a normal kobold. This both hurts and helps the player, hurts * because in the old days a player could just avoid 300 pounds, * and helps because now carrying 300 pounds is not very painful. * * The "weapon" and "bow" do *not* add to the bonuses to hit or to * damage, since that would affect non-combat things. These values * are actually added in later, at the appropriate place. * * If id_only is true, calc_bonuses() will only use the known * information of objects; thus it returns what the player _knows_ * the character state to be. */ void calc_bonuses(object_type inventory[], player_state *state, bool id_only) { int i, j, hold; int extra_blows = 0; int extra_shots = 0; int extra_might = 0; object_type *o_ptr; bitflag f[OF_SIZE]; bitflag collect_f[OF_SIZE]; /*** Reset ***/ memset(state, 0, sizeof *state); /* Set various defaults */ state->speed = 110; state->num_blows = 100; /*** Extract race/class info ***/ /* Base infravision (purely racial) */ state->see_infra = p_ptr->race->infra; /* Base skills */ for (i = 0; i < SKILL_MAX; i++) state->skills[i] = p_ptr->race->r_skills[i] + p_ptr->class->c_skills[i]; /*** Analyze player ***/ /* Extract the player flags */ player_flags(collect_f); /*** Analyze equipment ***/ /* Scan the equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { o_ptr = &inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Extract the item flags */ if (id_only) object_flags_known(o_ptr, f); else object_flags(o_ptr, f); of_union(collect_f, f); /* Affect stats */ if (of_has(f, OF_STR)) state->stat_add[A_STR] += o_ptr->pval[which_pval(o_ptr, OF_STR)]; if (of_has(f, OF_INT)) state->stat_add[A_INT] += o_ptr->pval[which_pval(o_ptr, OF_INT)]; if (of_has(f, OF_WIS)) state->stat_add[A_WIS] += o_ptr->pval[which_pval(o_ptr, OF_WIS)]; if (of_has(f, OF_DEX)) state->stat_add[A_DEX] += o_ptr->pval[which_pval(o_ptr, OF_DEX)]; if (of_has(f, OF_CON)) state->stat_add[A_CON] += o_ptr->pval[which_pval(o_ptr, OF_CON)]; if (of_has(f, OF_CHR)) state->stat_add[A_CHR] += o_ptr->pval[which_pval(o_ptr, OF_CHR)]; /* Affect stealth */ if (of_has(f, OF_STEALTH)) state->skills[SKILL_STEALTH] += o_ptr->pval[which_pval(o_ptr, OF_STEALTH)]; /* Affect searching ability (factor of five) */ if (of_has(f, OF_SEARCH)) state->skills[SKILL_SEARCH] += (o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] * 5); /* Affect searching frequency (factor of five) */ if (of_has(f, OF_SEARCH)) state->skills[SKILL_SEARCH_FREQUENCY] += (o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] * 5); /* Affect infravision */ if (of_has(f, OF_INFRA)) state->see_infra += o_ptr->pval[which_pval(o_ptr, OF_INFRA)]; /* Affect digging (factor of 20) */ if (of_has(f, OF_TUNNEL)) state->skills[SKILL_DIGGING] += (o_ptr->pval[which_pval(o_ptr, OF_TUNNEL)] * 20); /* Affect speed */ if (of_has(f, OF_SPEED)) state->speed += o_ptr->pval[which_pval(o_ptr, OF_SPEED)]; /* Affect blows */ if (of_has(f, OF_BLOWS)) extra_blows += o_ptr->pval[which_pval(o_ptr, OF_BLOWS)]; /* Affect shots */ if (of_has(f, OF_SHOTS)) extra_shots += o_ptr->pval[which_pval(o_ptr, OF_SHOTS)]; /* Affect Might */ if (of_has(f, OF_MIGHT)) extra_might += o_ptr->pval[which_pval(o_ptr, OF_MIGHT)]; /* Modify the base armor class */ state->ac += o_ptr->ac; /* The base armor class is always known */ state->dis_ac += o_ptr->ac; /* Apply the bonuses to armor class */ if (!id_only || object_is_known(o_ptr)) state->to_a += o_ptr->to_a; /* Apply the mental bonuses to armor class, if known */ if (object_defence_plusses_are_visible(o_ptr)) state->dis_to_a += o_ptr->to_a; /* Hack -- do not apply "weapon" bonuses */ if (i == INVEN_WIELD) continue; /* Hack -- do not apply "bow" bonuses */ if (i == INVEN_BOW) continue; /* Apply the bonuses to hit/damage */ if (!id_only || object_is_known(o_ptr)) { state->to_h += o_ptr->to_h; state->to_d += o_ptr->to_d; } /* Apply the mental bonuses tp hit/damage, if known */ if (object_attack_plusses_are_visible(o_ptr)) { state->dis_to_h += o_ptr->to_h; state->dis_to_d += o_ptr->to_d; } } /*** Update all flags ***/ for (i = 0; i < OF_MAX; i++) if (of_has(collect_f, i)) of_on(state->flags, i); /*** Handle stats ***/ /* Calculate stats */ for (i = 0; i < A_MAX; i++) { int add, top, use, ind; /* Extract modifier */ add = state->stat_add[i]; /* Maximize mode */ if (OPT(birth_maximize)) { /* Modify the stats for race/class */ add += (p_ptr->race->r_adj[i] + p_ptr->class->c_adj[i]); } /* Extract the new "stat_top" value for the stat */ top = modify_stat_value(p_ptr->stat_max[i], add); /* Save the new value */ state->stat_top[i] = top; /* Extract the new "stat_use" value for the stat */ use = modify_stat_value(p_ptr->stat_cur[i], add); /* Save the new value */ state->stat_use[i] = use; /* Values: n/a */ if (use <= 3) ind = 0; /* Values: 3, 4, ..., 18 */ else if (use <= 18) ind = (use - 3); /* Ranges: 18/00-18/09, ..., 18/210-18/219 */ else if (use <= 18+219) ind = (15 + (use - 18) / 10); /* Range: 18/220+ */ else ind = (37); assert((0 <= ind) && (ind < STAT_RANGE)); /* Save the new index */ state->stat_ind[i] = ind; } /*** Temporary flags ***/ /* Apply temporary "stun" */ if (p_ptr->timed[TMD_STUN] > 50) { state->to_h -= 20; state->dis_to_h -= 20; state->to_d -= 20; state->dis_to_d -= 20; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 8 / 10; } else if (p_ptr->timed[TMD_STUN]) { state->to_h -= 5; state->dis_to_h -= 5; state->to_d -= 5; state->dis_to_d -= 5; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 9 / 10; } /* Invulnerability */ if (p_ptr->timed[TMD_INVULN]) { state->to_a += 100; state->dis_to_a += 100; } /* Temporary blessing */ if (p_ptr->timed[TMD_BLESSED]) { state->to_a += 5; state->dis_to_a += 5; state->to_h += 10; state->dis_to_h += 10; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 105 / 100; } /* Temporary shield */ if (p_ptr->timed[TMD_SHIELD]) { state->to_a += 50; state->dis_to_a += 50; } /* Temporary stoneskin */ if (p_ptr->timed[TMD_STONESKIN]) { state->to_a += 40; state->dis_to_a += 40; state->speed -= 5; } /* Temporary "Hero" */ if (p_ptr->timed[TMD_HERO]) { state->to_h += 12; state->dis_to_h += 12; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 105 / 100; } /* Temporary "Berserk" */ if (p_ptr->timed[TMD_SHERO]) { state->to_h += 24; state->dis_to_h += 24; state->to_a -= 10; state->dis_to_a -= 10; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 9 / 10; } /* Temporary "fast" */ if (p_ptr->timed[TMD_FAST] || p_ptr->timed[TMD_SPRINT]) state->speed += 10; /* Temporary "slow" */ if (p_ptr->timed[TMD_SLOW]) state->speed -= 10; /* Temporary infravision boost */ if (p_ptr->timed[TMD_SINFRA]) state->see_infra += 5; /* Terror - this is necessary because TMD_AFRAID already occupies the * of_ptr->timed slot for OF_AFRAID */ if (p_ptr->timed[TMD_TERROR] > p_ptr->timed[TMD_AFRAID]) p_ptr->timed[TMD_AFRAID] = p_ptr->timed[TMD_TERROR]; if (p_ptr->timed[TMD_TERROR]) state->speed += 5; /* Fear can come from item flags too */ if (check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) { state->to_h -= 20; state->dis_to_h -= 20; state->to_a += 8; state->dis_to_a += 8; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 95 / 100; } /* Confusion */ if (p_ptr->timed[TMD_CONFUSED]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 75 / 100; /* Amnesia */ if (p_ptr->timed[TMD_AMNESIA]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 8 / 10; /* Poison */ if (p_ptr->timed[TMD_POISONED]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 95 / 100; /* Hallucination */ if (p_ptr->timed[TMD_IMAGE]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 8 / 10; /*** Analyze weight ***/ /* Extract the current weight (in tenth pounds) */ j = p_ptr->total_weight; /* Extract the "weight limit" (in tenth pounds) */ i = weight_limit(state); /* Apply "encumbrance" from weight */ if (j > i / 2) state->speed -= ((j - (i / 2)) / (i / 10)); /* Bloating slows the player down (a little) */ if (p_ptr->food >= PY_FOOD_MAX) state->speed -= 10; /* Searching slows the player down */ if (p_ptr->searching) state->speed -= 10; /* Sanity check on extreme speeds */ if (state->speed < 0) state->speed = 0; if (state->speed > 199) state->speed = 199; /*** Apply modifier bonuses ***/ /* Actual Modifier Bonuses (Un-inflate stat bonuses) */ state->to_a += ((int)(adj_dex_ta[state->stat_ind[A_DEX]]) - 128); state->to_d += ((int)(adj_str_td[state->stat_ind[A_STR]]) - 128); state->to_h += ((int)(adj_dex_th[state->stat_ind[A_DEX]]) - 128); state->to_h += ((int)(adj_str_th[state->stat_ind[A_STR]]) - 128); /* Displayed Modifier Bonuses (Un-inflate stat bonuses) */ state->dis_to_a += ((int)(adj_dex_ta[state->stat_ind[A_DEX]]) - 128); state->dis_to_d += ((int)(adj_str_td[state->stat_ind[A_STR]]) - 128); state->dis_to_h += ((int)(adj_dex_th[state->stat_ind[A_DEX]]) - 128); state->dis_to_h += ((int)(adj_str_th[state->stat_ind[A_STR]]) - 128); /*** Modify skills ***/ /* Affect Skill -- stealth (bonus one) */ state->skills[SKILL_STEALTH] += 1; /* Affect Skill -- disarming (DEX and INT) */ state->skills[SKILL_DISARM] += adj_dex_dis[state->stat_ind[A_DEX]]; state->skills[SKILL_DISARM] += adj_int_dis[state->stat_ind[A_INT]]; /* Affect Skill -- magic devices (INT) */ state->skills[SKILL_DEVICE] += adj_int_dev[state->stat_ind[A_INT]]; /* Affect Skill -- saving throw (WIS) */ state->skills[SKILL_SAVE] += adj_wis_sav[state->stat_ind[A_WIS]]; /* Affect Skill -- digging (STR) */ state->skills[SKILL_DIGGING] += adj_str_dig[state->stat_ind[A_STR]]; /* Affect Skills (Level, by Class) */ for (i = 0; i < SKILL_MAX; i++) state->skills[i] += (p_ptr->class->x_skills[i] * p_ptr->lev / 10); /* Limit Skill -- digging from 1 up */ if (state->skills[SKILL_DIGGING] < 1) state->skills[SKILL_DIGGING] = 1; /* Limit Skill -- stealth from 0 to 30 */ if (state->skills[SKILL_STEALTH] > 30) state->skills[SKILL_STEALTH] = 30; if (state->skills[SKILL_STEALTH] < 0) state->skills[SKILL_STEALTH] = 0; /* Apply Skill -- Extract noise from stealth */ state->noise = (1L << (30 - state->skills[SKILL_STEALTH])); /* Obtain the "hold" value */ hold = adj_str_hold[state->stat_ind[A_STR]]; /*** Analyze current bow ***/ /* Examine the "current bow" */ o_ptr = &inventory[INVEN_BOW]; /* Assume not heavy */ state->heavy_shoot = FALSE; /* It is hard to hold a heavy bow */ if (hold < o_ptr->weight / 10) { /* Hard to wield a heavy bow */ state->to_h += 2 * (hold - o_ptr->weight / 10); state->dis_to_h += 2 * (hold - o_ptr->weight / 10); /* Heavy Bow */ state->heavy_shoot = TRUE; } /* Analyze launcher */ if (o_ptr->kind) { /* Get to shoot */ state->num_shots = 1; /* Analyze the launcher */ switch (o_ptr->sval) { /* Sling and ammo */ case SV_SLING: { state->ammo_tval = TV_SHOT; state->ammo_mult = 2; break; } /* Short Bow and Arrow */ case SV_SHORT_BOW: { state->ammo_tval = TV_ARROW; state->ammo_mult = 2; break; } /* Long Bow and Arrow */ case SV_LONG_BOW: { state->ammo_tval = TV_ARROW; state->ammo_mult = 3; break; } /* Light Crossbow and Bolt */ case SV_LIGHT_XBOW: { state->ammo_tval = TV_BOLT; state->ammo_mult = 3; break; } /* Heavy Crossbow and Bolt */ case SV_HEAVY_XBOW: { state->ammo_tval = TV_BOLT; state->ammo_mult = 4; break; } } /* Apply special flags */ if (o_ptr->kind && !state->heavy_shoot) { /* Extra shots */ state->num_shots += extra_shots; /* Extra might */ state->ammo_mult += extra_might; /* Hack -- Rangers love Bows */ if (player_has(PF_EXTRA_SHOT) && (state->ammo_tval == TV_ARROW)) { /* Extra shot at level 20 */ if (p_ptr->lev >= 20) state->num_shots++; /* Extra shot at level 40 */ if (p_ptr->lev >= 40) state->num_shots++; } } /* Require at least one shot */ if (state->num_shots < 1) state->num_shots = 1; } /*** Analyze weapon ***/ /* Examine the "current weapon" */ o_ptr = &inventory[INVEN_WIELD]; /* Assume not heavy */ state->heavy_wield = FALSE; /* It is hard to hold a heavy weapon */ if (hold < o_ptr->weight / 10) { /* Hard to wield a heavy weapon */ state->to_h += 2 * (hold - o_ptr->weight / 10); state->dis_to_h += 2 * (hold - o_ptr->weight / 10); /* Heavy weapon */ state->heavy_wield = TRUE; } /* Non-object means barehanded attacks */ if (!o_ptr->kind) assert(o_ptr->weight == 0); /* Normal weapons */ if (!state->heavy_wield) { /* Calculate number of blows */ state->num_blows = calc_blows(o_ptr, state, extra_blows); /* Boost digging skill by weapon weight */ state->skills[SKILL_DIGGING] += (o_ptr->weight / 10); } /* Assume okay */ state->icky_wield = FALSE; /* Priest weapon penalty for non-blessed edged weapons */ if (player_has(PF_BLESS_WEAPON) && !check_state(p_ptr, OF_BLESSED, p_ptr->state.flags) && ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) { /* Reduce the real bonuses */ state->to_h -= 2; state->to_d -= 2; /* Reduce the mental bonuses */ state->dis_to_h -= 2; state->dis_to_d -= 2; /* Icky weapon */ state->icky_wield = TRUE; } return; } /* * Calculate bonuses, and print various things on changes. */ static void update_bonuses(void) { int i; player_state *state = &p_ptr->state; player_state old = p_ptr->state; /*** Calculate bonuses ***/ calc_bonuses(p_ptr->inventory, &p_ptr->state, FALSE); /*** Notice changes ***/ /* Analyze stats */ for (i = 0; i < A_MAX; i++) { /* Notice changes */ if (state->stat_top[i] != old.stat_top[i]) { /* Redisplay the stats later */ p_ptr->redraw |= (PR_STATS); } /* Notice changes */ if (state->stat_use[i] != old.stat_use[i]) { /* Redisplay the stats later */ p_ptr->redraw |= (PR_STATS); } /* Notice changes */ if (state->stat_ind[i] != old.stat_ind[i]) { /* Change in CON affects Hitpoints */ if (i == A_CON) { p_ptr->update |= (PU_HP); } /* Change in INT may affect Mana/Spells */ else if (i == A_INT) { if (p_ptr->class->spell_stat == A_INT) { p_ptr->update |= (PU_MANA | PU_SPELLS); } } /* Change in WIS may affect Mana/Spells */ else if (i == A_WIS) { if (p_ptr->class->spell_stat == A_WIS) { p_ptr->update |= (PU_MANA | PU_SPELLS); } } } } /* Hack -- Telepathy Change */ if (of_has(state->flags, OF_TELEPATHY) != of_has(old.flags, OF_TELEPATHY)) { /* Update monster visibility */ p_ptr->update |= (PU_MONSTERS); } /* Hack -- See Invis Change */ if (of_has(state->flags, OF_SEE_INVIS) != of_has(old.flags, OF_SEE_INVIS)) { /* Update monster visibility */ p_ptr->update |= (PU_MONSTERS); } /* Redraw speed (if needed) */ if (state->speed != old.speed) { /* Redraw speed */ p_ptr->redraw |= (PR_SPEED); } /* Redraw armor (if needed) */ if ((state->dis_ac != old.dis_ac) || (state->dis_to_a != old.dis_to_a)) { /* Redraw */ p_ptr->redraw |= (PR_ARMOR); } /* Hack -- handle "xtra" mode */ if (character_xtra) return; /* Take note when "heavy bow" changes */ if (old.heavy_shoot != state->heavy_shoot) { /* Message */ if (state->heavy_shoot) msg("You have trouble wielding such a heavy bow."); else if (p_ptr->inventory[INVEN_BOW].kind) msg("You have no trouble wielding your bow."); else msg("You feel relieved to put down your heavy bow."); } /* Take note when "heavy weapon" changes */ if (old.heavy_wield != state->heavy_wield) { /* Message */ if (state->heavy_wield) msg("You have trouble wielding such a heavy weapon."); else if (p_ptr->inventory[INVEN_WIELD].kind) msg("You have no trouble wielding your weapon."); else msg("You feel relieved to put down your heavy weapon."); } /* Take note when "illegal weapon" changes */ if (old.icky_wield != state->icky_wield) { /* Message */ if (state->icky_wield) msg("You do not feel comfortable with your weapon."); else if (p_ptr->inventory[INVEN_WIELD].kind) msg("You feel comfortable with your weapon."); else msg("You feel more comfortable after removing your weapon."); } } /*** Generic "deal with" functions ***/ /* * Handle "p_ptr->notice" */ void notice_stuff(struct player *p) { /* Notice stuff */ if (!p->notice) return; /* Deal with autoinscribe stuff */ if (p->notice & PN_AUTOINSCRIBE) { p->notice &= ~(PN_AUTOINSCRIBE); autoinscribe_pack(); autoinscribe_ground(); } /* Deal with squelch stuff */ if (p->notice & PN_SQUELCH) { p->notice &= ~(PN_SQUELCH); squelch_drop(); } /* Combine the pack */ if (p->notice & PN_COMBINE) { p->notice &= ~(PN_COMBINE); combine_pack(); } /* Reorder the pack */ if (p->notice & PN_REORDER) { p->notice &= ~(PN_REORDER); reorder_pack(); } /* Sort the quiver */ if (p->notice & PN_SORT_QUIVER) { p->notice &= ~(PN_SORT_QUIVER); sort_quiver(); } /* Dump the monster messages */ if (p->notice & PN_MON_MESSAGE) { p->notice &= ~(PN_MON_MESSAGE); /* Make sure this comes after all of the monster messages */ flush_all_monster_messages(); } } /* * Handle "p_ptr->update" */ void update_stuff(struct player *p) { /* Update stuff */ if (!p->update) return; if (p->update & (PU_BONUS)) { p->update &= ~(PU_BONUS); update_bonuses(); } if (p->update & (PU_TORCH)) { p->update &= ~(PU_TORCH); calc_torch(); } if (p->update & (PU_HP)) { p->update &= ~(PU_HP); calc_hitpoints(); } if (p->update & (PU_MANA)) { p->update &= ~(PU_MANA); calc_mana(); } if (p->update & (PU_SPELLS)) { p->update &= ~(PU_SPELLS); calc_spells(); } /* Character is not ready yet, no screen updates */ if (!character_generated) return; /* Character is in "icky" mode, no screen updates */ if (character_icky) return; if (p->update & (PU_FORGET_VIEW)) { p->update &= ~(PU_FORGET_VIEW); forget_view(); } if (p->update & (PU_UPDATE_VIEW)) { p->update &= ~(PU_UPDATE_VIEW); update_view(); } if (p->update & (PU_FORGET_FLOW)) { p->update &= ~(PU_FORGET_FLOW); cave_forget_flow(cave); } if (p->update & (PU_UPDATE_FLOW)) { p->update &= ~(PU_UPDATE_FLOW); cave_update_flow(cave); } if (p->update & (PU_DISTANCE)) { p->update &= ~(PU_DISTANCE); p->update &= ~(PU_MONSTERS); update_monsters(TRUE); } if (p->update & (PU_MONSTERS)) { p->update &= ~(PU_MONSTERS); update_monsters(FALSE); } if (p->update & (PU_PANEL)) { p->update &= ~(PU_PANEL); event_signal(EVENT_PLAYERMOVED); } } struct flag_event_trigger { u32b flag; game_event_type event; }; /* * Events triggered by the various flags. */ static const struct flag_event_trigger redraw_events[] = { { PR_MISC, EVENT_RACE_CLASS }, { PR_TITLE, EVENT_PLAYERTITLE }, { PR_LEV, EVENT_PLAYERLEVEL }, { PR_EXP, EVENT_EXPERIENCE }, { PR_STATS, EVENT_STATS }, { PR_ARMOR, EVENT_AC }, { PR_HP, EVENT_HP }, { PR_MANA, EVENT_MANA }, { PR_GOLD, EVENT_GOLD }, { PR_HEALTH, EVENT_MONSTERHEALTH }, { PR_DEPTH, EVENT_DUNGEONLEVEL }, { PR_SPEED, EVENT_PLAYERSPEED }, { PR_STATE, EVENT_STATE }, { PR_STATUS, EVENT_STATUS }, { PR_STUDY, EVENT_STUDYSTATUS }, { PR_DTRAP, EVENT_DETECTIONSTATUS }, { PR_BUTTONS, EVENT_MOUSEBUTTONS }, { PR_INVEN, EVENT_INVENTORY }, { PR_EQUIP, EVENT_EQUIPMENT }, { PR_MONLIST, EVENT_MONSTERLIST }, { PR_ITEMLIST, EVENT_ITEMLIST }, { PR_MONSTER, EVENT_MONSTERTARGET }, { PR_OBJECT, EVENT_OBJECTTARGET }, { PR_MESSAGE, EVENT_MESSAGE }, }; /* * Handle "p_ptr->redraw" */ void redraw_stuff(struct player *p) { size_t i; /* Redraw stuff */ if (!p->redraw) return; /* Character is not ready yet, no screen updates */ if (!character_generated) return; /* Character is in "icky" mode, no screen updates */ if (character_icky) return; /* For each listed flag, send the appropriate signal to the UI */ for (i = 0; i < N_ELEMENTS(redraw_events); i++) { const struct flag_event_trigger *hnd = &redraw_events[i]; if (p->redraw & hnd->flag) event_signal(hnd->event); } /* Then the ones that require parameters to be supplied. */ if (p->redraw & PR_MAP) { /* Mark the whole map to be redrawn */ event_signal_point(EVENT_MAP, -1, -1); } p->redraw = 0; /* * Do any plotting, etc. delayed from earlier - this set of updates * is over. */ event_signal(EVENT_END); } /* * Handle "p_ptr->update" and "p_ptr->redraw" */ void handle_stuff(struct player *p) { if (p->update) update_stuff(p); if (p->redraw) redraw_stuff(p); } angband-v3.3.2/src/main-crb.c0000644000175000017500000031207611651552410015243 0ustar chriscchrisc/* * File: main-crb.c * Purpose: Provide support for OS X, version 10.3 and later. * * Copyright (c) 2003 pelpel * Copyright (c) 2003,2004,2005 Robert Ruehlmann * Copyright (c) 2007,2008 pete mack * Copyright (c) 2008 Rowan Beentje * Copyright (c) 2010 Andi Sidwell * * Some excerpts quoted under fair use from works by Ben Harrison, * Keith Randall, Peter Ammon, and Ron Anderson. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "files.h" #include "init.h" /* * Notes: * * (pelpel) Characters in the ASCII mode are clipped by their bounding * rects to reduce redraw artefacts that were quite annoying in certain * font-point combos. * * * (pete mack) Nearly all quickdraw removed to improve performance from * interleaved Quickdraw and CGContext events. (Hence the really ugly * ATSU font metrics.) * IMPORTANT: If you need to use QuickDraw, make sure to call hibernate() * and SetPort() first. This will keep the graphics state consistent. * * (pete mack) If you wish to add additional heirarchical menus, the following * must hold: * All menus and submenus must have unique ids. * All menus must have IDs greater than 0 and less than MAX_MENU_ID * All submenus must have greater IDs than their parents. * * * Important Resources in the resource file: * * FREF 130 = ANGBAND_CREATOR / 'APPL' (application) * FREF 129 = ANGBAND_CREATOR / 'SAVE' (save file) * FREF 130 = ANGBAND_CREATOR / 'TEXT' (bone file, generic text file) * FREF 131 = ANGBAND_CREATOR / 'DATA' (binary image file, score file) * */ /* ------------------------------------------------------- * PORTING YOUR VARIANT * ------------------------------------------------------ * 0. Requires installation of XCode. The framework .h files are otherwise * absent. New changes also require use of NIB (xml) files, which * are most easily edited with Interface Builder. (XCode package.) * This reduces the amount of hand-coded menu creation by an order of magnitude. * * * 1. Compiling the binary * * You might wish to disable some SET_UID features for various reasons: * to have user folder within the lib folder, savefile names etc. * * 2. Installation * * The "angband" binary must be arranged this way for it to work: * * lib/ <- the lib folder * Angband (OS X).app/ * Contents/ * MacOS/ * angband <- the binary you've just compiled * Info.plist <- to be explained below * Resources/ * Angband.icns * Data.icns * Edit.icns * Save.icns * 8x8.png <- 8x8 tiles * 16x16.png <- 16x16 tiles * angband.rsrc <- see below * * Graphics resources are moved out of the resource fork and become ordinary * PNG files. Make sure to set its resolution to 72 dpi (<- VERY important) * while keeping vertical and horizontal scaling factor to 100% (<- VERY * important), when you convert tiles in any formats to PNG. This means * that the real size of an image must shrink or grow when you change it's dpi. * Graphics files must be of type png, because OSX 10.3 doesn't do * a good job with composited images. * * Transparency now uses the alpha channel, rather than a background color. * * ---(end of OS X + gcc porting note)-------------------------------------- * * Because the default font-size combination causes redraw artefact problem * (some characters, even in monospace fonts, have negative left bearings), * I [pelpel] introduced rather crude hack to clip all character drawings within * their bounding rects. If you don't like this, please comment out the line * #define CLIP_HACK * below. The alternative, #define OVERWRITE_HACK, is based on Julian Lighton's * brilliant suggestion, but it doesn't work as expected. This is because * DrawText can render the same character with _different_ pixel width, * depending on relative position of a character to the pen. Fonts do look * very nice on the Mac, but too nice I'd say, in case of Angband. * * The check for return values of AEProcessAppleEvent is intentionally ignored. * * Changes 2006 (pete mack) * - Removed conditional code. Removed non-quicktime sound. * - Reorganized event model to use Carbon events and dispatching. * - Removed old font menus & calculations; replaced with Apple font panel. * - Removed Quickdraw graphics; replaced with CGContext (Quartz) graphics. * - Removed Quickdraw text; replaced with CGFont. ATSUI is used for * finding fonts, font metrics, and Glyph information for fast rendering * of variable-width fonts. */ #ifdef MACH_O_CARBON #include #include #include #include #include #include "osx/osx_tables.h" /* Default creator signature */ #ifndef huge #define huge size_t #endif /* * Width in pixels of white borders around the black screen. */ #define BORDER_WID 1 static const bool show_events = 0; /* * A rather crude fix to reduce amount of redraw artifacts. * Some fixed width fonts (i.e. Monaco) has characters with negative * left bearings, so Term_wipe_mac or overwriting cannot completely * erase them. */ #define CLIP_HACK 0 /* */ static const int use_clip_hack = CLIP_HACK; /* * Minimum font size */ #define MIN_FONT 8 /* * Another redraw artifact killer, based on suggestion by Julian Lighton */ #define OVERWRITE_HACK (0) /* * These hacks should never be enabled at the same time. * Clip-hack renders overwrite-hack meaningless, and * it will cause use of an unitialized variable. - pete mack. */ static const int use_overwrite_hack = (OVERWRITE_HACK && !CLIP_HACK); /* * Maximum number of windows. */ #define MAX_TERM_DATA 8 /* graphics_modes index of current graphics mode */ static UInt32 graf_mode = 0; /* Tile dimensions of the current graphics mode */ static int graf_height = 0; static int graf_width = 0; /* * Use antialiasing. Without image differencing from * OSX 10.4 features, you won't want to use this. */ static bool antialias = false; typedef struct GlyphInfo GlyphInfo; typedef struct term_data term_data; /* * Extra "term" data */ struct term_data { term *t; WindowRef w; GlyphInfo *ginfo; Rect wr; /* Absolute bounds of window (for save/restore) */ Rect r; /* Canvas bounds of window (for mouse addressing &c) */ CGRect bounds; /* Relative bounds of border-clipped canvas. */ int spacing; /* Text padding (in pixels) for tiling wider than text */ char title[255]; /* Window title. */ s16b mapped; /* Active state. */ s16b rows; /* rows in picture */ s16b cols; /* columns in picture. */ char font_name[200]; /* Name of font for storage. */ ATSUFontID font_id; float font_size; /* Scaled ATSU font size. */ u16b font_wid; u16b font_hgt; u16b tile_wid; u16b tile_hgt; s16b size_wid; /* Window size in x. */ s16b size_hgt; /* Window size in y. */ }; struct GlyphInfo { UInt32 refcount; char psname[1000]; ATSUFontID font_id; CGFontRef fontRef; float font_size; ATSUStyle style; ATSUTextLayout layout; float font_wid; /* max character advance. */ s32b ascent; s32b descent; bool monospace; float offsets[256][3]; float heights[256][3]; float widths[256]; }; static GlyphInfo glyph_data[MAX_TERM_DATA+1]; static WindowRef aboutDialog; static bool CheckEvents(int wait); static OSStatus RevalidateGraphics(term_data *td, bool reset_tilesize); static char *locate_lib(char *buf, size_t size); static void graphics_aux(UInt32 op); static void Term_wipe_mac_aux(int x, int y, int n); inline static void term_data_color(int a); static void install_handlers(WindowRef w); static void graphics_tiles_nuke(void); static void play_sound(int num); static void redrawRecentItemsMenu(); /* * Available values for 'wait' */ #define CHECK_EVENTS_DRAIN -1 #define CHECK_EVENTS_NO_WAIT 0 #define CHECK_EVENTS_WAIT 1 /* * Delay handling of double-clicked savefiles */ bool open_when_ready = FALSE; /* * Delay handling of pre-emptive "quit" event */ bool quit_when_ready = FALSE; static long mac_os_version; /* Out-of-band color identifiers */ /* True black (TERM_BLACK may be altered) */ #define COLOR_BLACK (256) /* No current color */ #define COLOR_INVALID (-1) /* * Keeps track of who owns the QD CGContext, and it's current state. * Always use this to change the active graphics port. * (It is a parallel structure to the Term variable.) */ struct ActivePort { WindowRef active; CGContextRef ctx; int color; /* Current fill colorcode */ /* CGColorRef color_info[256+1]; */ float color_info[256+1][3]; }; static struct ActivePort focus; /* initialized to 0 */ /* * An array of term_data's */ static term_data data[MAX_TERM_DATA]; /* * Note when "open"/"new" become valid */ static bool initialized = FALSE; /* * A mutable array for Recent Items */ CFMutableArrayRef recentItemsArrayRef = NULL; /* * Support the improved game command handling */ #include "textui.h" static game_command cmd = { CMD_NULL, 0 }; static MenuRef MyGetMenuHandle_aux(int menuID, bool first) { static MenuRef menuRefs[MAX_MENU_ID]; if(menuID <= 0 || menuID >= MAX_MENU_ID) return 0; if(menuRefs[menuID]) return menuRefs[menuID]; MenuRef m = GetMenuHandle(menuID); if(m) { menuRefs[menuID] = m; return m; } /* * First heirarchical call, find and initialize all menu IDs. * Subsequent misses will attempt to update the menuRefs array. * This will work for any depth heirarchy, so long as child menus have * higher IDs than their parents. * * Invariant: all MenuRefs with ID < MenuID(tmp) have been initialized. */ for(int id = 1; id < MAX_MENU_ID; id++) { /* Recursion depth is 1 */ if(first) m = MyGetMenuHandle_aux(id, false); if(!m) continue; menuRefs[id] = m; for(size_t i = 0; i < N_ELEMENTS(menuRefs); i++) { MenuRef tmp = 0; GetMenuItemHierarchicalMenu (m, i, &tmp); if(tmp) { menuRefs[GetMenuID(tmp)] = tmp; } } } return menuRefs[menuID]; } /* * Provide a flat namespace for OS X menus and submenus. * It's a nuisance doing this via heirarchical calls all the time. */ inline static MenuRef MyGetMenuHandle(int menuID) { return MyGetMenuHandle_aux(menuID, true); } /* * Convert a pathname to a corresponding FSSpec. * Returns noErr on success. */ static OSErr path_to_spec(const char *path, FSSpec *spec) { OSErr err; FSRef ref; /* Convert pathname to FSRef ... */ err = FSPathMakeRef((byte*) path, &ref, NULL); if (err != noErr) return (err); /* ... then FSRef to FSSpec */ err = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL); /* Inform caller of success or failure */ return (err); } /* * Convert a FSSpec to a corresponding pathname. * Returns noErr on success. */ static OSErr spec_to_path(const FSSpec *spec, char *buf, size_t size) { OSErr err; FSRef ref; /* Convert FSSpec to FSRef ... */ err = FSpMakeFSRef(spec, &ref); if (err != noErr) return (err); /* ... then FSRef to pathname */ err = FSRefMakePath(&ref, (byte*)buf, size); /* Inform caller of success or failure */ return (err); } /* * [via path_to_spec] * Set creator and filetype of a file specified by POSIX-style pathname. * Returns 0 on success, -1 in case of errors. */ static void fsetfileinfo(const char *pathname, u32b fcreator, u32b ftype) { OSErr err; FSSpec spec; FInfo info; /* Convert pathname to FSSpec */ if (path_to_spec(pathname, &spec) != noErr) return; /* Obtain current finder info of the file */ if (FSpGetFInfo(&spec, &info) != noErr) return; /* Overwrite creator and type */ info.fdCreator = fcreator; info.fdType = ftype; err = FSpSetFInfo(&spec, &info); /* Done */ return; } static void osx_file_open_hook(const char *path, file_type ftype) { u32b mac_type = 'TEXT'; if (ftype == FTYPE_RAW) mac_type = 'DATA'; else if (ftype == FTYPE_SAVE) mac_type = 'SAVE'; fsetfileinfo(path, 'A271', mac_type); } /* * Activate a given window, if necessary. This should normally * be called by Term_activate, when the z-term is updating it's * state. It should also be called prior to any updates when * the window CGContext has been closed by hibernate() */ static void activate(WindowRef w) { /* Activate */ if(focus.active && focus.ctx) { CGContextSynchronize(focus.ctx); if(focus.active != w) { /* Change window context */ QDEndCGContext(GetWindowPort(focus.active), &focus.ctx); focus.ctx = 0; } } /* Activate */ if (w && focus.ctx == 0) { focus.color = COLOR_INVALID; term_data *td = (term_data*) GetWRefCon(w); /* Start queueing graphics events. */ /* and set up the context */ QDBeginCGContext(GetWindowPort(w), &focus.ctx); /* Shift the origin to inside the border, and use inverted y axis. */ CGAffineTransform m; m = CGAffineTransformMake(BORDER_WID, 0, 0, -1, BORDER_WID, BORDER_WID+td->bounds.size.height); CGContextConcatCTM (focus.ctx, m); CGContextClipToRect(focus.ctx, td->bounds); CGContextSetShouldAntialias (focus.ctx, antialias); CGContextSetInterpolationQuality(focus.ctx, kCGInterpolationNone); /* Invert the text so it's no longer mirrored in y. */ /* Origin is at still at the bottom of the line, so the ascent must */ /* be subtracted at display-time. (Not added, because the coordinate */ /* system is also flipped.) */ m = CGAffineTransformMake(1, 0, 0, -1, 0, 0); CGContextSetTextMatrix(focus.ctx, m); CFStringRef font_name = CFStringCreateWithCString( kCFAllocatorDefault, td->ginfo->psname, kCFStringEncodingISOLatin1); td->ginfo->fontRef = CGFontCreateWithFontName(font_name); CGContextSetFont(focus.ctx, td->ginfo->fontRef); CGContextSetFontSize(focus.ctx, td->font_size); CFRelease(font_name); if(td->ginfo->monospace) { CGContextSetCharacterSpacing(focus.ctx, td->tile_wid - td->ginfo->font_wid); } else { const ATSUAttributeTag itags[] = { kATSUCGContextTag, kATSUImposeWidthTag }; Fixed advance = (1<<16)*(td->tile_wid - td->font_wid); void *ivals[] = { &focus.ctx, &advance }; const ByteCount isizes[] = {sizeof(focus.ctx), sizeof(advance) }; ATSUSetAttributes(td->ginfo->style, 2, itags, isizes, ivals); } } /* Remember */ focus.active = w; } /* * Temporarily give up control of the Quickdraw port. * Call when the window becomes inactive. * Call when the graphics state changes in any way, to * invalidate the current CGContext and force an update. */ static void hibernate() { if(focus.ctx != 0) QDEndCGContext(GetWindowPort(focus.active), &focus.ctx); focus.ctx = 0; } /* * Display a warning message */ static void mac_warning(const char *warning) { CFStringRef msg; msg = CFStringCreateWithCString(NULL, warning, kCFStringEncodingISOLatin1); DialogRef dlg = 0; CreateStandardAlert(kAlertCautionAlert, msg, CFSTR(""), NULL, &dlg); DialogItemIndex itemIndex; RunStandardAlert(dlg, NULL, &itemIndex); /* DisposeDialog(dlg); // NO! */ CFRelease(msg); } /* * Notice fully up-to-date status of the main window */ static void validate_main_window(void) { WindowRef w; Rect r; /* Get the main window */ w = data[0].w; /* Get its rectangle */ GetPortBounds(GetWindowPort(w), &r); /* Validate it */ ValidWindowRect(w, &r); } /*** Some generic functions ***/ /* * Update color_info with the current values in angband_color_table */ static void update_color_info(void) { focus.color = COLOR_INVALID; focus.color_info[COLOR_BLACK][0] = 0; focus.color_info[COLOR_BLACK][1] = 0; focus.color_info[COLOR_BLACK][2] = 0; /* Update colors */ for (int i = 0; i < 256; i++) { float r = angband_color_table[i][1]; float g = angband_color_table[i][2]; float b = angband_color_table[i][3]; r = r == 255 ? 1 : r / 256; g = g == 255 ? 1 : g / 256; b = b == 255 ? 1 : b / 256; focus.color_info[i][0] = r; focus.color_info[i][1] = g; focus.color_info[i][2] = b; } } /* * Activate a color (0 to 256) * -1 is invalid, 256 is true black. */ inline static void term_data_color(int a) { if(!focus.ctx) activate(focus.active); if( a == COLOR_INVALID) { focus.color = a; } else if (focus.color != a) /* Assumes the window exists. */ { focus.color = a; /* CGContextSetFillColorWithColor(focus.ctx, focus.color_info[a]); */ CGContextSetRGBFillColor(focus.ctx, focus.color_info[a][0], focus.color_info[a][1], focus.color_info[a][2], 1); } } /* * Get font metrics */ static GlyphInfo *get_glyph_info(ATSUFontID fid, float size) { GlyphInfo *info; /* One extra, so a term_data can fetch before it frees. */ for(info = glyph_data; info <= glyph_data+MAX_TERM_DATA; info++) { if(info->font_id == fid && info->font_size == size) { info->refcount++; return info; } } /* One is always available. */ info = glyph_data; for (int c = 0; info->refcount != 0; info++, c++) assert(c <= MAX_TERM_DATA); info->style = 0; info->layout = 0; /* ICK */ info->font_size = size; info->font_id = fid; OSStatus err = ATSUCreateStyle(&info->style); require_noerr(err, CantInitialize); Fixed fsize = (Fixed)(size*(1<<16)); const ByteCount isizes[] = {sizeof(fid), sizeof(fsize) }; void *ivals[] = { &fid, &fsize }; const ATSUAttributeTag itags[] = { kATSUFontTag, kATSUSizeTag }; ATSUSetAttributes(info->style, 2, itags, isizes, ivals); err = ATSUCreateTextLayout(&info->layout); require_noerr(err, CantInitialize); /* Dummy text, required to initialize run style. */ UniChar text[1] = {'@'}; ATSUSetTextPointerLocation(info->layout, text, 0, 1, 1); ATSUSetRunStyle(info->layout, info->style, 0, 1); ByteCount oCount = 0; FontNameCode oCode; err = ATSUGetIndFontName(fid, 6, sizeof(info->psname), info->psname, &oCount, &oCode, 0, 0, 0); require_noerr(err, CantInitialize); if(oCount == 0 || strlen(info->psname) == 0) goto CantInitialize; info->psname[oCount] = 0; /* Is font mono-space? */ err = ATSUCreateTextLayout(&info->layout); require_noerr(err, CantInitialize); ATSUSetRunStyle(info->layout, info->style, 0, 0); info->monospace = true; info->font_wid = 0; info->ascent = 0; info->descent = 0; for(int i = 0; i < 256; i++) { OSStatus err; text[0] = i; Fixed start = 0, stop = 0, ascent = 0, descent = 0; ATSUSetTextPointerLocation(info->layout, text, 0, 1, 1); /* SetRunStyle doesn't honor runs in layouts of size 0. */ if(i == 0) ATSUSetRunStyle(info->layout, info->style, 0, 1); err = ATSUGetUnjustifiedBounds(info->layout, 0, 1, &start, &stop, &ascent, &descent); if(info->ascent < ascent) info->ascent = ascent; if(info->descent < descent) info->descent = descent; info->widths[i] = (stop - start)/(1<<16); if(info->font_wid == 0) info->font_wid = stop - start; else if((info->font_wid != stop - start) && (stop - start != 0)) { info->monospace = false; } if(info->font_wid < stop - start) { info->font_wid = stop - start; } } /* Scale the rough font metrics to screen dimensions. */ /* Assumes 72dpi resolution. */ info->ascent = (info->ascent + (1<<16)-1)>>16; info->descent = (info->descent + (1<<16)-1)>>16; info->font_wid = (info->font_wid)/(1<<16); info->refcount++; return info; CantInitialize: if(info->layout) ATSUDisposeTextLayout(info->layout); if(info->style) ATSUDisposeStyle(info->style); info->style = 0; info->layout = 0; return 0; } static void release_glyph_info(GlyphInfo *info) { if(!info) return; assert(info->refcount > 0); info->refcount--; if(0 == info->refcount) { ATSUDisposeStyle(info->style); info->style = 0; CGFontRelease(info->fontRef); info->fontRef = 0; } } /* * Hack -- Apply and Verify the "font" info * * This should usually be followed by "term_data_check_size()" * * XXX XXX To force (re)initialisation of td->tile_wid and td->tile_hgt * you have to reset them to zero before this function is called. * XXX XXX This is automatic when the program starts because the term_data * array is WIPE'd by term_data_hack, but isn't in the other cases, i.e. * font, font style and size changes. */ static void term_data_check_font(term_data *td) { GlyphInfo *info = get_glyph_info(td->font_id, td->font_size); if(!info) return; release_glyph_info(td->ginfo); td->ginfo = info; td->font_wid = (info->font_wid +.999); td->font_hgt = info->ascent + info->descent; my_strcpy(td->font_name, info->psname, sizeof(td->font_name)); /* Set default tile size */ if (td->tile_wid == 0) td->tile_wid = td->font_wid; if (td->tile_hgt == 0) td->tile_hgt = td->font_hgt; } /* * Hack -- Apply and Verify the "size" info */ static void term_data_check_size(term_data *td) { if (td == &data[0]) { /* Enforce minimal size for the main game window */ if (td->cols < 80) td->cols = 80; if (td->rows < 24) td->rows = 24; } else { /* Information windows can be much smaller */ if (td->cols < 10) td->cols = 10; if (td->rows < 5) td->rows = 5; } /* Enforce maximal sizes */ if (td->cols > 255) td->cols = 255; if (td->rows > 255) td->rows = 255; /* Minimal tile size */ bool dirty = false; if (td->tile_wid < td->font_wid) { td->tile_wid = td->font_wid; dirty = true; } if (td->tile_hgt < td->font_hgt) { td->tile_hgt = td->font_hgt; dirty = true; } if(dirty) graphics_tiles_nuke(); /* Calculate full window size */ td->size_wid = td->cols * td->tile_wid + BORDER_WID * 2; td->size_hgt = td->rows * td->tile_hgt + BORDER_WID; hibernate(); BitMap tScreen; /* Get current screen */ (void)GetQDGlobalsScreenBits(&tScreen); /* Verify the bottom */ if (td->r.top > tScreen.bounds.bottom - td->size_hgt) { td->r.top = tScreen.bounds.bottom - td->size_hgt; } /* Verify the top */ if (td->r.top < tScreen.bounds.top + 2*GetMBarHeight()) { td->r.top = tScreen.bounds.top + 2*GetMBarHeight(); } /* Verify the right */ if (td->r.left > tScreen.bounds.right - td->size_wid) { td->r.left = tScreen.bounds.right - td->size_wid; } /* Verify the left */ if (td->r.left < tScreen.bounds.left) { td->r.left = tScreen.bounds.left; } /* Calculate bottom right corner */ td->r.right = td->r.left + td->size_wid; td->r.bottom = td->r.top + td->size_hgt; td->bounds = (CGRect) {{0, 0}, {td->cols * td->tile_wid, td->rows * td->tile_hgt}}; /* Assume no graphics, monospace */ td->t->higher_pict = FALSE; td->t->always_pict = FALSE; /* Handle graphics */ if (!td->ginfo->monospace) { /* Draw every character */ td->t->always_pict = TRUE; } else if (use_graphics) { /* Use higher pict whenever possible */ td->t->higher_pict = TRUE; } } /* * resize a term_data * * This should normally be followed by "term_data_redraw()" */ static void term_data_resize(term_data *td) { /* Invalidate the current CGContext. */ hibernate(); /* * Actually resize the window * * ResizeWindow is the preferred API call, but it cannot * be used here. */ SizeWindow(td->w, td->size_wid, td->size_hgt, 0); /* Cheat a little -- can't use the active view to redraw its own border. */ CGContextRef tmpCtx; QDBeginCGContext(GetWindowPort(td->w), &tmpCtx); CGContextSetRGBStrokeColor(tmpCtx, 1, 1, 1, 1); CGRect wbounds = {{0, 0}, {td->bounds.size.width+2*BORDER_WID, td->bounds.size.height+BORDER_WID+2}}; CGContextStrokeRect(tmpCtx, wbounds); QDEndCGContext(GetWindowPort(td->w), &tmpCtx); } /* * Hack -- redraw a term_data * * Note that "Term_redraw()" calls "TERM_XTRA_CLEAR" */ static void term_data_redraw(term_data *td) { term *old = Term; /* Activate the term */ Term_activate(td->t); /* Redraw the contents */ Term_redraw(); /* Flush the output */ Term_fresh(); Term_activate(old); } /* * Graphics support */ /* * PICT id / file name of image tiles */ static const char *pict_id = NULL; /* * Frame * Wrapper for CGImages of the current tile set. * */ static struct { /* The reference image at the original scale. */ CGImageRef image; /* Numbers of rows and columns in a tileset, */ int cols; int rows; /* * Tile images. * These are generated once at each tile scaling. Since * there are many unused tiles, and since generating tiles takes * a long time, they are generated only on demand. * The tiles at the current scaling. * Foreground tiles are RGBA * Background tiles are RGB only. * This is detected by DrawTile--background images have the same * tile-id for both foreground and background. * Stride is number of columns. */ CGImageRef *tile_images; } frame = {0}; /* * Rendevous for font update events. */ static struct { WindowRef focus; /* The most recently focused window. (NOT the fontpanel.) */ } fontInfo; /* * Replacement for BitMap (from QD2Qz porting guide) */ void DrawSubimage (CGContextRef context, CGRect dst, CGImageRef image, CGRect src) { /* the default drawing rectangle */ float w = (float) CGImageGetWidth(image); float h = (float) CGImageGetHeight(image); CGRect drawRect = {{0, 0}, {w, h}}; if (!CGRectEqualToRect (src, dst)) { float sx = CGRectGetWidth(dst) / CGRectGetWidth(src); float sy = CGRectGetHeight(dst) / CGRectGetHeight(src); float dx = CGRectGetMinX(dst) - (CGRectGetMinX(src) * sx); float dy = CGRectGetMinY(dst) - (CGRectGetMinY(src) * sy); drawRect = (CGRect) {{dx, dy}, {w*sx, h*sy}}; } CGContextSaveGState (context); CGContextClipToRect (context, dst); /* Don't display images upside down. (Works like SetTextMatrix) */ HIViewDrawCGImage (context, &drawRect, image); /* CGContextDrawImage (context, &drawRect, image); */ CGContextRestoreGState (context); } /* * Copy an image with tiles of size src into a new one with * tiles of size dst. Interpolation will not cross tile borders. */ static CGImageRef GetTileImage(int row, int col, bool has_alpha) { /* Cache hit. */ assert(col < frame.cols && row < frame.rows); if (frame.tile_images[row*frame.cols + col] != 0) { return frame.tile_images[row*frame.cols+col]; } term_data *td = &data[0]; size_t tile_wid = td->tile_wid * tile_width; size_t tile_hgt = td->tile_hgt * tile_height; size_t nbytes = (tile_hgt * tile_wid) * 4; void *data = calloc(1, nbytes); CGContextRef map; map = CGBitmapContextCreate(data, tile_wid, tile_hgt, 8, nbytes / tile_hgt, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); CGAffineTransform m = {1, 0, 0, -1, 0, tile_hgt}; CGContextConcatCTM(map, m); /* Attempt to avoid interpolation across cell boundaries by clipping. */ /* It may be that we need a clip image first. */ CGRect src_r = {{ graf_width*col, graf_height*row }, { graf_width, graf_height }}; CGRect dst_r = {{ 0, 0 }, { tile_wid, tile_hgt }}; DrawSubimage(map, dst_r, frame.image, src_r); CGDataProviderRef prov; prov = CGDataProviderCreateWithData (NULL, data, nbytes, NULL); CGImageAlphaInfo alphaInfo = kCGImageAlphaPremultipliedLast; size_t pixelBits = 4 * 8; if(!has_alpha) { alphaInfo = kCGImageAlphaNone; pixelBits = 3 * 8; } CGImageRef timg = CGImageCreate(CGBitmapContextGetWidth(map), CGBitmapContextGetHeight(map), CGBitmapContextGetBitsPerComponent(map), CGBitmapContextGetBitsPerPixel(map), CGBitmapContextGetBytesPerRow(map), CGBitmapContextGetColorSpace(map), alphaInfo, prov, NULL, false, kCGRenderingIntentDefault); CGDataProviderRelease(prov); CGContextRelease(map); /* free(data); // Duplicate free? */ frame.tile_images[row*frame.cols+col] = timg; return timg; } static void DrawTile(int x, int y, byte a, byte c, byte ta, byte tc) { term_data *td = (term_data*) Term->data; int tile_wid = td->tile_wid * tile_width; int tile_hgt = td->tile_hgt * tile_height; CGRect dst_r = {{x*td->tile_wid, y*td->tile_hgt}, {tile_wid, tile_hgt}}; CGRect src_r = {{0, 0}, {tile_wid, tile_hgt}}; tc = (tc&0x7f) % frame.cols; ta = (ta&0x7f) % frame.rows; c = (c&0x7f) % frame.cols; a = (a&0x7f) % frame.rows; /* Requires alpha-masked foreground images */ /* Draw terrain. No alpha or rescaling, should just be a bitblt. */ if (!use_transparency) tc = c, ta = a; CGImageRef image = GetTileImage(ta, tc, false); DrawSubimage(focus.ctx, dst_r, image, src_r); /* Draw the foreground, if it is distinct from the background */ /* Use alpha. Rare, so it shouldn't take much time. */ if(use_transparency && (tc != c || ta != a)) { /* This doesn't preserve alpha. Don't know how to fix. */ image = GetTileImage(a, c, true); DrawSubimage(focus.ctx, dst_r, image, src_r); /* Use the original source instead. This is SLOW! */ /*src_r = (CGRect) {{ graf_width*c, graf_height*a }, */ /* { graf_width, graf_height }}; */ /* DrawSubimage(focus.ctx, dst_r, frame.image, src_r); */ } } static void ShowTextAt(int x, int y, int color, int n, const char *text ) { term_data *td = (term_data*) Term->data; GlyphInfo *info = td->ginfo; /* Overwite the text, unless it's being called recursively. */ if(use_overwrite_hack && color != COLOR_BLACK) { Term_wipe_mac_aux(x, y, n); } int c = *(unsigned char*) text; int xp = x * td->tile_wid + (td->tile_wid - (info->widths[c] + td->spacing))/2; /* Only round once. */ int yp = y * td->tile_hgt + info->ascent + (td->tile_hgt - td->font_hgt)/2; CGRect r; if(use_graphics || !use_overwrite_hack) { r = (CGRect) {{x*td->tile_wid, y*td->tile_hgt}, {n*td->tile_wid, td->tile_hgt}}; term_data_color(COLOR_BLACK); CGContextFillRect(focus.ctx, r); } if(use_clip_hack) { CGContextSaveGState (focus.ctx); CGContextClipToRect(focus.ctx, r); } term_data_color(color); /* Monospace; use preset text spacing when tiling is wider than text */ if(n == 1 || info->monospace) { /* See the Accessing Font Metrics section of Apple's Core Text * Programming Guide for the sample code that inspired this * block. */ UniChar *characters; CGGlyph *glyphs; CTFontRef font = CTFontCreateWithGraphicsFont( td->ginfo->fontRef, (CGFloat)td->font_size, NULL, NULL); CFStringRef text_str = CFStringCreateWithCString( kCFAllocatorDefault, text, kCFStringEncodingISOLatin1); characters = (UniChar *)mem_alloc(sizeof(UniChar) * n); assert(characters != NULL); glyphs = (CGGlyph *)mem_alloc(sizeof(CGGlyph) * n); assert(glyphs != NULL); CFStringGetCharacters(text_str, CFRangeMake(0, n), characters); CFRelease(text_str); CTFontGetGlyphsForCharacters(font, characters, glyphs, n); CGContextShowGlyphsAtPoint(focus.ctx, (CGFloat)xp, (CGFloat)yp, glyphs, n); mem_free(characters); mem_free(glyphs); if(use_clip_hack) CGContextRestoreGState(focus.ctx); return; } GlyphInfo *gi = td->ginfo; UniChar utext[n]; for(int i = 0; i < n; i++) utext[i] = text[i]; ATSUSetTextPointerLocation(gi->layout, utext, 0, n, n); ATSUSetRunStyle(gi->layout, info->style, 0, n); ATSUDrawText(info->layout, 0, n, xp*(1<<16), yp*(1<<16)); if(use_clip_hack) CGContextRestoreGState (focus.ctx); return; } /* * Init the graphics "frame" */ static errr graphics_init(void) { OSErr err; /* Get the tile resources */ char path[1024]; locate_lib(path, sizeof(path)); char *tail = path + strlen(path); FSSpec pict_spec; snprintf(tail, path+1024-tail, "xtra/graf/%s.png", pict_id); if(noErr != path_to_spec(path, &pict_spec)) return -1; /* Attempt to create a CGImage from FSSpec using Quicktime importer */ GraphicsImportComponent gi; if( (err = GetGraphicsImporterForFile(&pict_spec, &gi)) ) return err; Rect r; /* Retrieve the rect of the image */ err = GraphicsImportGetNaturalBounds(gi, &r); /* Calculate and set numbers of rows and columns */ frame.rows = (r.bottom-r.top) / graf_height; frame.cols = (r.right-r.left) / graf_width; frame.tile_images = calloc(frame.rows*frame.cols, sizeof(CGImageRef)); if(!frame.tile_images) { return -1; /* E_NO_MEM */ } CGImageRef tile_img; err = GraphicsImportCreateCGImage (gi, &tile_img, 0); CloseComponent(gi); if (err != noErr) { free(frame.tile_images); frame.tile_images = 0; return (err); } frame.image = tile_img; /* Success */ return (noErr); } static void graphics_tiles_nuke(void) { if(frame.tile_images) { for(int i = frame.rows*frame.cols; --i >= 0; ) { if(frame.tile_images[i]) CGImageRelease(frame.tile_images[i]); frame.tile_images[i] = 0; } } } /* * Nuke the graphics "frame" and contents. */ static errr graphics_nuke(void) { /* Dispose image */ if (frame.image) { /* Dispose of the tile image */ CGImageRelease(frame.image); frame.image = NULL; } if(frame.tile_images) { graphics_tiles_nuke(); free(frame.tile_images); frame.tile_images = 0; } /* Flush events */ if (initialized) FlushEventQueue(GetMainEventQueue()); /* Success */ return (0); } /* Arbitary limit on number of possible samples per event */ #define MAX_SAMPLES 8 /* Struct representing all data for a set of event samples */ typedef struct { int num; /* Number of available samples for this event */ NSSound *sound[MAX_SAMPLES]; } sound_sample_list; /* Array of event sound structs */ static sound_sample_list samples[MSG_MAX]; /* * Load sound effects based on sound.cfg within the xtra/sound directory; * bridge to Cocoa to use NSSound for simple loading and playback, avoiding * I/O latency by cacheing all sounds at the start. Inherits full sound * format support from Quicktime base/plugins. * pelpel favoured a plist-based parser for the future but .cfg support * improves cross-platform compatibility. */ static void load_sounds(void) { char path[2048]; char buffer[2048]; ang_file *fff; /* Build the "sound" path */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "sound"); ANGBAND_DIR_XTRA_SOUND = string_make(path); /* Find and open the config file */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); fff = file_open(path, MODE_READ, -1); /* Handle errors */ if (!fff) { mac_warning("The sound configuration file could not be opened."); return; } /* Instantiate an autorelease pool for use by NSSound */ NSAutoreleasePool *autorelease_pool; autorelease_pool = [[NSAutoreleasePool alloc] init]; /* * This loop may take a while depending on the count and size of samples * to load. */ /* Parse the file */ /* Lines are always of the form "name = sample [sample ...]" */ while (file_getl(fff, buffer, sizeof(buffer))) { char *msg_name; char *cfg_sample_list; char *search; char *cur_token; char *next_token; int event; /* Skip anything not beginning with an alphabetic character */ if (!buffer[0] || !isalpha((unsigned char)buffer[0])) continue; /* Split the line into two: message name, and the rest */ search = strchr(buffer, ' '); cfg_sample_list = strchr(search + 1, ' '); if (!search) continue; if (!cfg_sample_list) continue; /* Set the message name, and terminate at first space */ msg_name = buffer; search[0] = '\0'; /* Make sure this is a valid event name */ for (event = MSG_MAX - 1; event >= 0; event--) { if (strcmp(msg_name, angband_sound_name[event]) == 0) break; } if (event < 0) continue; /* Advance the sample list pointer so it's at the beginning of text */ cfg_sample_list++; if (!cfg_sample_list[0]) continue; /* Terminate the current token */ cur_token = cfg_sample_list; search = strchr(cur_token, ' '); if (search) { search[0] = '\0'; next_token = search + 1; } else { next_token = NULL; } /* * Now we find all the sample names and add them one by one */ while (cur_token) { int num = samples[event].num; /* Don't allow too many samples */ if (num >= MAX_SAMPLES) break; /* Build the path to the sample */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, cur_token); if (file_exists(path)) { /* Load the sound into memory */ samples[event].sound[num] = [[NSSound alloc] initWithContentsOfFile:[NSString stringWithUTF8String:path] byReference:NO]; if (samples[event].sound[num] != nil) { /* Imcrement the sample count */ samples[event].num++; } } /* Figure out next token */ cur_token = next_token; if (next_token) { /* Try to find a space */ search = strchr(cur_token, ' '); /* If we can find one, terminate, and set new "next" */ if (search) { search[0] = '\0'; next_token = search + 1; } else { /* Otherwise prevent infinite looping */ next_token = NULL; } } } } /* Release the autorelease pool */ [autorelease_pool release]; /* Close the file */ file_close(fff); /* Register the sound hook */ sound_hook = play_sound; } /* * Play sound effects asynchronously. Select a sound from any available * for the required event, and bridge to Cocoa to play it. */ static void play_sound(int event) { /* Paranoia */ if (event < 0 || event >= MSG_MAX) return; /* Check there are samples for this event */ if (!samples[event].num) return; /* Instantiate an autorelease pool for use by NSSound */ NSAutoreleasePool *autorelease_pool; autorelease_pool = [[NSAutoreleasePool alloc] init]; /* Choose a random event */ int s = randint0(samples[event].num); /* Stop the sound if it's currently playing */ if ([samples[event].sound[s] isPlaying]) [samples[event].sound[s] stop]; /* Play the sound */ [samples[event].sound[s] play]; /* Release the autorelease pool */ [autorelease_pool release]; } /*** Support for the "z-term.c" package ***/ /* * Initialize a new Term * * Note also the "window type" called "noGrowDocProc", which might be more * appropriate for the main "screen" window. * * Note the use of "srcCopy" mode for optimized screen writes. */ static void Term_init_mac(term *t) { term_data *td = (term_data*)(t->data); WindowAttributes wattrs; OSStatus err; wattrs = kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute | kWindowResizableAttribute; /* Make the window */ err = CreateNewWindow( kDocumentWindowClass, wattrs, &td->r, &td->w); Rect tmpR; GetWindowBounds((WindowRef)td->w, kWindowTitleBarRgn, &tmpR); int trueTop = td->r.top - (tmpR.bottom-tmpR.top); /* Enforce a minimum y position to avoid windows positioned vertically off screen */ if (trueTop < GetMBarHeight()) trueTop = GetMBarHeight(); MoveWindowStructure((WindowRef)td->w, td->r.left, trueTop); install_handlers(td->w); /* Fatal error */ if (err != noErr) ExitToShell(); /* Set refcon */ SetWRefCon(td->w, (long)td); /* Set window title */ SetWindowTitleWithCFString(td->w, CFStringCreateWithCString(NULL, td->title, kTextEncodingUS_ASCII)); InstallStandardEventHandler(GetWindowEventTarget(td->w)); /* Apply and Verify */ term_data_check_font(td); term_data_check_size(td); term_data_resize(td); /* assert(td->mapped) */ if (td->mapped) { WindowRef old_win = focus.active; ShowWindow(td->w); activate(td->w); term_data_color(COLOR_BLACK); CGContextFillRect(focus.ctx, td->bounds); activate(old_win); } /* Hack -- set "mapped" flag */ t->mapped_flag = td->mapped; } /* * Nuke an old Term */ static void Term_nuke_mac(term *t) { #pragma unused(t) } /* * React to changes */ static errr Term_xtra_mac_react(void) { /* Update colors */ update_color_info(); /* Success */ return (0); } /* * Do a "special thing" */ static errr Term_xtra_mac(int n, int v) { term_data *td = (term_data*)(Term->data); /* Analyze */ switch (n) { /* Make a noise */ case TERM_XTRA_NOISE: { /* Make a noise */ SysBeep(1); /* Success */ return (0); } /* Process random events */ case TERM_XTRA_BORED: { return (0); } /* Process pending events */ case TERM_XTRA_EVENT: { /* Process an event */ (void)CheckEvents(v); /* Success */ return (0); } /* Flush all pending input events (if any) */ case TERM_XTRA_FLUSH: { FlushEventsMatchingListFromQueue(GetMainEventQueue(), N_ELEMENTS(input_event_types), input_event_types); /* Success */ return (0); } /* Hack -- Change the "soft level" */ case TERM_XTRA_LEVEL: { /* Activate if requested */ if (v) activate(td->w); /* Success */ return (0); } /* Clear the screen */ case TERM_XTRA_CLEAR: { if(!focus.ctx) activate(td->w); term_data_color(COLOR_BLACK); CGContextFillRect(focus.ctx, td->bounds); CGContextSynchronize(focus.ctx); return (0); } /* React to changes */ case TERM_XTRA_REACT: { /* React to changes */ return (Term_xtra_mac_react()); } /* Delay (milliseconds) */ case TERM_XTRA_DELAY: { /* * WaitNextEvent relinquishes CPU as well as * induces a screen refresh on OS X */ /* If needed */ if (v > 0) { EventRecord tmp; UInt32 ticks; /* Convert millisecs to ticks */ ticks = (v * 60L) / 1000; /* * Hack? - Put the programme into sleep. * No events match ~everyEvent, so nothing * should be lost in Angband's event queue. * Even if ticks are 0, it's worth calling for * the above mentioned reasons. */ WaitNextEvent((EventMask)~everyEvent, &tmp, ticks, nil); } /* Success */ return (0); } case TERM_XTRA_FRESH: { assert(focus.active == td->w); if(focus.ctx) CGContextSynchronize(focus.ctx); return (0); } } /* Oops */ return (1); } /* * Low level graphics (Assumes valid input). * Draw a "cursor" at (x,y), using a "yellow box". * We are allowed to use "Term_what()" to determine * the current screen contents (for inverting, etc). */ static errr Term_curs_mac(int x, int y) { term_data *td = Term->data; if (!focus.active) activate(focus.active); CGContextSaveGState(focus.ctx); /* Temporarily set stroke color to yellow */ char c; byte a = TERM_YELLOW; CGContextSetRGBStrokeColor(focus.ctx, focus.color_info[a][0], focus.color_info[a][1], focus.color_info[a][2], 1); /* Frame the grid, staying within the boundary. */ int tile_wid = td->tile_wid; int tile_hgt = td->tile_hgt; if (tile_width != 1) { Term_what(x + 1, y, &a, &c); if (c == (char) 0xff) tile_wid *= tile_width; } if (tile_height != 1) { Term_what(x, y + 1, &a, &c); if (c == (char) 0xff) tile_hgt *= tile_height; } CGRect r = { { x * td->tile_wid + .5, y * td->tile_hgt + .5 }, { tile_wid - 1, tile_hgt - 1 } }; CGContextStrokeRectWithWidth(focus.ctx, r, 1.0); CGContextRestoreGState(focus.ctx); /* Success */ return (0); } /* * Low level graphics helper (Assumes valid input) * * Based on suggestion by Julian Lighton * * Overwrite "n" old characters starting at (x,y) * with the same ones in the background colour */ static void Term_wipe_mac_aux(int x, int y, int n) { /* Use old screen image kept inside the term package */ const char *cp = &(Term->old->c[y][x]); /* And write it in the background color */ ShowTextAt(x, y, COLOR_BLACK, n, cp); } /* * Low level graphics (Assumes valid input) * * Erase "n" characters starting at (x,y) */ static errr Term_wipe_mac(int x, int y, int n) { /* * Hack - overstrike the leftmost character with * the background colour. This doesn't interfere with * the graphics modes, because they set always_pict. */ if (use_overwrite_hack) Term_wipe_mac_aux(x, y, n); term_data_color(COLOR_BLACK); term_data *td = Term->data; assert(td); CGRect r = { { x * td->tile_wid, y * td->tile_hgt }, { n * td->tile_wid, -td->tile_hgt } }; CGContextFillRect(focus.ctx, r); /* Success */ return (0); } /* * Given a position in the ISO Latin-1 character set, return * the correct character on this system. */ static byte Term_xchar_mac(byte c) { /* The Mac port uses the Latin-1 standard */ return (c); } /* * Low level graphics. Assumes valid input. * * Draw several ("n") chars, with an attr, at a given location. */ static errr Term_text_mac(int x, int y, int n, byte a, const char *cp) { if(!focus.ctx) activate(focus.active); /* Draw the string */ ShowTextAt(x, y, a, n, cp); /* Success */ return (0); } static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) { if(!focus.ctx) activate(focus.active); /* Scan the input */ for (int i = 0; i < n; i++) { byte a = *ap++; char c = *cp++; byte ta = *tap++; char tc = *tcp++; /* Hack -- a filler for tiles */ if (a == 255 && (tile_height != 1 || tile_width != 1)) continue; /* TODO: background should be overridden with neutral color */ /* if unavailable. */ /* Graphics -- if Available and Needed */ if (use_graphics && (a & 0x80) && (c & 0x80)) { DrawTile(x+i, y, a, c, ta, tc); } /* * Deal with these cases: * (1) the player changed tile width / height, or * (2) fake fixed-width for proportional font */ else { ShowTextAt(x+i, y, a, 1, &c); } } /* Success */ return (0); } /* * Create and initialize window number "i" */ static void term_data_link(int i) { term *old = Term; term_data *td = &data[i]; /* Only once */ if (td->t) return; /* Require mapped */ if (!td->mapped) return; /* Allocate */ td->t = ZNEW(term); /* Initialize the term */ term_init(td->t, td->cols, td->rows, td == &data[0] ? 100 : 1); /* Use a "software" cursor */ td->t->soft_cursor = TRUE; /* * We have an "icky" lower right corner, since * the window resize control is placed there */ td->t->icky_corner = TRUE; /* Erase with "white space" */ td->t->attr_blank = TERM_WHITE; td->t->char_blank = ' '; /* Prepare the init/nuke hooks */ td->t->init_hook = Term_init_mac; td->t->nuke_hook = Term_nuke_mac; /* Prepare the function hooks */ td->t->xtra_hook = Term_xtra_mac; td->t->wipe_hook = Term_wipe_mac; td->t->curs_hook = Term_curs_mac; td->t->bigcurs_hook = Term_curs_mac; td->t->text_hook = Term_text_mac; td->t->pict_hook = Term_pict_mac; td->t->xchar_hook = Term_xchar_mac; td->t->never_bored = TRUE; td->t->never_frosh = TRUE; /* Link the local structure */ td->t->data = (void *)(td); /* Activate it */ Term_activate(td->t); /* Global pointer */ angband_term[i] = td->t; /* Activate old */ Term_activate(old); } /* * (Carbon, Bundle) * Return a POSIX pathname of the lib directory, or NULL if it can't be * located. Caller must supply a buffer along with its size in bytes, * where returned pathname will be stored. */ static char *locate_lib(char *buf, size_t size) { CFURLRef main_url; bool success; /* Obtain the URL of the main bundle */ main_url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); /* Oops */ if (!main_url) return (NULL); /* Get the URL in the file system's native string representation */ success = CFURLGetFileSystemRepresentation(main_url, TRUE, (byte*)buf, size); /* Free the url */ CFRelease(main_url); /* Oops */ if (!success) return (NULL); /* Append "/Contents/Resources/lib/" */ my_strcat(buf, "/Contents/Resources/lib/", size); return (buf); } /* * Using Core Foundation's Preferences services -- pelpel * * Requires OS 8.6 or greater with CarbonLib 1.1 or greater. Or OS X, * of course. * * Without this, we can support older versions of OS 8 as well * (with CarbonLib 1.0.4). * * Frequent allocation/deallocation of small chunks of data is * far from my liking, but since this is only called at the * beginning and the end of a session, I hope this hardly matters. */ /* * Store "value" as the value for preferences item name * pointed by key */ static void save_preference(const char *key, type_union value) { CFStringRef cf_key; CFPropertyListRef cf_value = 0; /* allocate and initialise the key */ cf_key = CFStringCreateWithCString(NULL, key, kTextEncodingUS_ASCII); /* allocate and initialise the value */ if(value.t == T_INT) cf_value = CFNumberCreate(NULL, kCFNumberIntType, &value.u.i); else if(value.t == T_STRING) cf_value = CFStringCreateWithCString(NULL, value.u.s, kTextEncodingUS_ASCII); else quit(format("Unrecognized save type %d\n", value.t)); if ((cf_key != NULL) && (cf_value != NULL)) { /* Store the key-value pair in the applications preferences */ CFPreferencesSetAppValue( cf_key, cf_value, kCFPreferencesCurrentApplication); } /* * Free CF data - the reverse order is a vain attempt to * minimise memory fragmentation. */ if (cf_value) CFRelease(cf_value); if (cf_key) CFRelease(cf_key); } /* * Load preference value for key, returns TRUE if it succeeds with * vptr updated appropriately, FALSE otherwise. */ static bool load_preference(const char *key, type_union *vptr, size_t maxlen ) { CFStringRef cf_key; CFPropertyListRef cf_value; /* allocate and initialise the key */ cf_key = CFStringCreateWithCString(NULL, key, kTextEncodingUS_ASCII); /* Oops */ if (cf_key == NULL) return (FALSE); /* Retrieve value for the key */ cf_value = CFPreferencesCopyAppValue( cf_key, kCFPreferencesCurrentApplication); /* Value not found */ if (cf_value == NULL) { CFRelease(cf_key); return (FALSE); } /* Convert the value to appropriate type */ if(vptr->t == T_INT) CFNumberGetValue( cf_value, kCFNumberIntType, &vptr->u.i); else if(vptr->t == T_STRING) { CFRange range = { 0, 200}; (void) CFStringGetBytes (cf_value, range, kCFStringEncodingISOLatin1, 0, 0, (UInt8*)vptr->u.s, maxlen, 0); } /* Free CF data */ CFRelease(cf_value); CFRelease(cf_key); /* Success */ return (TRUE); } /* Convenience wrappers for commonly used type short */ static void save_pref_short(const char *key, short value) { type_union u = i2u(value); save_preference(key, u); } static bool load_pref_short(const char *key, short *vptr) { bool ret; type_union u = { T_INT }; ret = load_preference(key, &u, 0); if( ret == TRUE ) *vptr = u.u.i; return ret; } static void save_pref_ushort(const char *key, unsigned short value) { type_union u = i2u((int)value); save_preference(key, u); } static bool load_pref_ushort(const char *key, unsigned short *vptr) { bool ret; type_union u = { T_INT }; ret = load_preference(key, &u, 0); if( ret == TRUE ) *vptr = (unsigned short)u.u.i; return ret; } /* XXX Version number for pref file */ #define VERSION_MAJOR 3 #define VERSION_MINOR 0 #define VERSION_PATCH 14 #define VERSION_EXTRA 0 /* * Save preferences to preferences file for current host+current user+ * current application. */ static void cf_save_prefs() { /* Version stamp */ save_pref_short("version.major", VERSION_MAJOR); save_pref_short("version.minor", VERSION_MINOR); save_pref_short("version.patch", VERSION_PATCH); save_pref_short("version.extra", VERSION_EXTRA); /* Gfx settings */ /* tile width/height */ save_pref_ushort("arg.tile_wid", tile_width); save_pref_ushort("arg.tile_hgt", tile_height); /* graphics mode */ save_pref_ushort("graf_mode", graf_mode); /* text antialiasing */ save_pref_ushort("arg.use_antialiasing", antialias); /* Windows */ for (int i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; save_pref_short(format("term%d.mapped", i), td->mapped); save_pref_ushort(format("term%d.tile_wid", i), td->tile_wid); save_pref_ushort(format("term%d.tile_hgt", i), td->tile_hgt); save_pref_short(format("term%d.cols", i), td->cols); save_pref_short(format("term%d.rows", i), td->rows); save_pref_short(format("term%d.left", i), td->r.left); save_pref_short(format("term%d.top", i), td->r.top); /* Integer font sizes only */ save_preference(format("term%d.font_size", i), i2u((int)td->font_size)); save_preference(format("term%d.font_name", i), s2u(td->font_name)); } /* * Save the recent items array - directly. */ CFPreferencesSetAppValue( CFSTR("recent_items"), recentItemsArrayRef, kCFPreferencesCurrentApplication); /* * Make sure preferences are persistent */ CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); } /* * Load preferences from preferences file for current host+current user+ * current application. */ static void cf_load_prefs() { short pref_major, pref_minor, pref_patch, pref_extra; short valid; /* Assume nothing is wrong, yet */ bool ok = TRUE; /* Load version information */ ok &= load_pref_short("version.major", &pref_major); ok &= load_pref_short("version.minor", &pref_minor); ok &= load_pref_short("version.patch", &pref_patch); ok &= load_pref_short("version.extra", &pref_extra); /* Any of the above failed */ if (!ok) { #if 0 /* This may be the first run */ mac_warning("Preferences are not found."); #endif /* 0 */ /* Ignore the rest */ return; } /* Check version */ if ((pref_major != VERSION_MAJOR) || (pref_minor != VERSION_MINOR) || (pref_patch != VERSION_PATCH) || (pref_extra != VERSION_EXTRA)) { /* Version 3.0.8 rewrote the preference file format - don't attempt to load previous versions. */ if ((pref_major < 3) || ((pref_major == 3) && (pref_minor == 0) && (pref_patch < 8))) { /* Message */ mac_warning( format("Ignoring %d.%d.%d.%d preferences.", pref_major, pref_minor, pref_patch, pref_extra)); /* Ignore */ return; } else { FSRef fsRef; char prefpath[1024]; CFStringRef bundleid = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleIdentifierKey); CFIndex bufferlength = CFStringGetMaximumSizeForEncoding(CFStringGetLength(bundleid), kCFStringEncodingASCII) + 1; char bundlename[bufferlength]; CFStringGetCString(bundleid, bundlename, bufferlength, kCFStringEncodingASCII); FSFindFolder(kOnAppropriateDisk, kPreferencesFolderType, kDontCreateFolder, &fsRef); FSRefMakePath(&fsRef, (UInt8 *)prefpath, 1024); mac_warning(format("Preference file has changed. If you have display problems, delete %s/%s.plist and restart.", prefpath, bundlename)); CFRelease(bundleid); } } /* HACK - Check for broken preferences */ load_pref_short("term0.mapped", &valid); /* Ignore broken preferences */ if (!valid) { /* mac_warning("Ignoring broken preferences."); */ /* Ignore */ return; } /* Gfx settings */ unsigned short pref_tmp; if (load_pref_ushort("arg.tile_wid", &pref_tmp)) tile_width = pref_tmp; if (load_pref_ushort("arg.tile_hgt", &pref_tmp)) tile_height = pref_tmp; /* anti-aliasing */ if(load_pref_ushort("arg.use_antialiasing", &pref_tmp)) antialias = pref_tmp; if(load_pref_ushort("graf_mode", &pref_tmp)) graf_mode = pref_tmp; /* Windows */ for (int i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; load_pref_short(format("term%d.mapped", i), &td->mapped); CheckMenuItem(MyGetMenuHandle(kWindowMenu), kAngbandTerm+i, td->mapped); load_pref_ushort(format("term%d.tile_wid", i), &td->tile_wid); load_pref_ushort(format("term%d.tile_hgt", i), &td->tile_hgt); load_pref_short(format("term%d.cols", i), &td->cols); load_pref_short(format("term%d.rows", i), &td->rows); load_pref_short(format("term%d.left", i), &td->r.left); load_pref_short(format("term%d.top", i), &td->r.top); type_union u = {T_INT}; if(load_preference(format("term%d.font_size", i), &u, sizeof(int))) td->font_size = (float) u.u.i; u = s2u(td->font_name); if(load_preference(format("term%d.font_name", i), &u, sizeof(td->font_name))) { ATSUFontID fid = 0; ATSUFindFontFromName(td->font_name, strlen(td->font_name), kFontPostscriptName, kFontMacintoshPlatform, kFontNoScriptCode, kFontNoLanguageCode, &fid); if(fid) td->font_id = fid; /* Use the default */ else my_strcpy(td->font_name, "Monaco", sizeof(td->font_name)); } } /* * Load the recent items array, if present, directly */ CFArrayRef recentItemsLoaded = (CFArrayRef)CFPreferencesCopyAppValue( CFSTR("recent_items"), kCFPreferencesCurrentApplication); if (recentItemsLoaded != NULL) { CFRelease(recentItemsArrayRef); recentItemsArrayRef = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, recentItemsLoaded); CFRelease(recentItemsLoaded); redrawRecentItemsMenu(); } } /* * Hack -- default data for a window */ static void term_data_hack(term_data *td) { /* Default to Monaco font */ ATSUFontID fid = 0; ATSUFindFontFromName("Monaco", strlen("Monaco"), kFontPostscriptName, kFontMacintoshPlatform, kFontNoScriptCode, kFontNoLanguageCode, &fid); if(!fid) quit("Failed to find font 'Monaco'"); /* Wipe it */ WIPE(td, term_data); /* Start hidden */ td->mapped = FALSE; /* Default font */ td->font_id = fid; my_strcpy(td->font_name, "Monaco", sizeof(td->font_name)); /* Default font size - was 12 */ td->font_size = 14; /* Default size */ td->rows = 24; td->cols = 80; /* Default position */ td->r.left = 10; td->r.top = 40; } /* * Read the preference file, Create the windows. * * We attempt to use "FindFolder()" to track down the preference file. */ static void init_windows(void) { term_data *td; /*** Default values ***/ /* Initialize (backwards) */ for (int b = 0, i = MAX_TERM_DATA; i-- > 0; ) { /* Obtain */ td = &data[i]; /* Defaults */ term_data_hack(td); /* Copy the title */ my_strcpy((char *)(td->title), angband_term_name[i], sizeof(td->title)); /* Tile the windows */ td->r.left += (b * 30); td->r.top += (b * 30); /* Tile */ b++; } /*** Load preferences ***/ cf_load_prefs(); /*** Instantiate ***/ /* Main window */ td = &data[0]; /* Start visible */ td->mapped = TRUE; /* Link (backwards, for stacking order) */ for (int i = MAX_TERM_DATA; i-- > 0; ) { term_data_link(i); } /* Main window */ td = &data[0]; /* Main window */ Term_activate(td->t); } /* Set up the contents of the about dialog */ static void init_aboutdialogcontent() { HIViewRef aboutDialogViewRef; OSStatus err; /* Set the application name from the constants set in defines.h */ char *applicationName = format("%s", buildid); CFStringRef cfstr_applicationName = CFStringCreateWithBytes(NULL, (byte *)applicationName, strlen(applicationName), kCFStringEncodingASCII, false); HIViewFindByID(HIViewGetRoot(aboutDialog), aboutDialogName, &aboutDialogViewRef); SetControlData(aboutDialogViewRef, kControlEntireControl, kControlStaticTextCFStringTag, sizeof(cfstr_applicationName), &cfstr_applicationName); CFRelease(cfstr_applicationName); /* Set the application copyright as set up in variable.c */ HIViewFindByID(HIViewGetRoot(aboutDialog), aboutDialogCopyright, &aboutDialogViewRef); CFStringRef cfstr_applicationCopyright = CFStringCreateWithBytes(NULL, (byte *)copyright, strlen(copyright), kCFStringEncodingASCII, false); SetControlData(aboutDialogViewRef, kControlEntireControl, kControlStaticTextCFStringTag, sizeof(cfstr_applicationCopyright), &cfstr_applicationCopyright); CFRelease(cfstr_applicationCopyright); /* Use a small font for the copyright text */ TXNObject txnObject = HITextViewGetTXNObject(aboutDialogViewRef); TXNTypeAttributes typeAttr[1]; typeAttr[0].tag = kTXNQDFontSizeAttribute; typeAttr[0].size = kTXNFontSizeAttributeSize; typeAttr[0].data.dataValue = FloatToFixed(10); err = TXNSetTypeAttributes(txnObject, 1, typeAttr, kTXNStartOffset, kTXNEndOffset); /* Get the application icon and draw it */ ProcessSerialNumber psn = { 0, kCurrentProcess }; ControlRef iconControl; FSRef ref; FSSpec appSpec; IconRef iconRef; ControlButtonContentInfo cInfo; err = GetProcessBundleLocation(&psn, &ref); if(err == noErr) err = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, &appSpec, NULL); if( err == noErr ) err = GetIconRefFromFile((const FSSpec *)&appSpec, &iconRef, nil); if(err == noErr) err = GetControlByID(aboutDialog, &aboutDialogIcon, &iconControl); if( err == noErr ) { cInfo.contentType = kControlContentIconRef; cInfo.u.iconRef = iconRef; err = SetControlData(iconControl, 0, kControlIconContentTag, sizeof(cInfo), (Ptr)&cInfo); } } /* * Save preferences */ static void save_pref_file(void) { cf_save_prefs(); } /* * Prepare savefile dialogue and set the variable * savefile accordingly. Returns true if it succeeds, false (or * aborts) otherwise. If all is false, only allow files whose type * is 'SAVE'. * Originally written by Peter Ammon */ static bool select_savefile(bool all) { OSErr err; FSSpec theFolderSpec; FSSpec savedGameSpec; NavDialogOptions dialogOptions; NavReplyRecord reply; /* Used only when 'all' is true */ NavTypeList types = {'A271', 1, 1, {'SAVE'}}; NavTypeListHandle myTypeList; AEDesc defaultLocation; /* Look for the "Angband/save/" sub-folder */ char path[1024]; path_build(path, sizeof(path), ANGBAND_DIR_USER, "save"); err = path_to_spec(path, &theFolderSpec); if (err != noErr) quit_fmt("Unable to find the savefile folder! (Error %d)", err); /* Get default Navigator dialog options */ err = NavGetDefaultDialogOptions(&dialogOptions); /* Clear preview option */ dialogOptions.dialogOptionFlags &= ~kNavAllowPreviews; /* Disable multiple file selection */ dialogOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles; /* Make descriptor for default location */ err = AECreateDesc(typeFSS, &theFolderSpec, sizeof(FSSpec), &defaultLocation); /* Oops */ if (err != noErr) quit("Unable to allocate descriptor"); /* We are indifferent to signature and file types */ if (all) { myTypeList = (NavTypeListHandle)nil; } /* Set up type handle */ else { err = PtrToHand(&types, (Handle *)&myTypeList, sizeof(NavTypeList)); /* Oops */ if (err != noErr) quit("Error in PtrToHand. Try enlarging heap"); } /* Call NavGetFile() with the types list */ err = NavChooseFile(&defaultLocation, &reply, &dialogOptions, NULL, NULL, NULL, myTypeList, NULL); /* Free type list */ if (!all) DisposeHandle((Handle)myTypeList); /* Error */ if (err != noErr) { /* Nothing */ } /* Invalid response -- allow the user to cancel */ else if (!reply.validRecord) { /* Hack -- Fake error */ err = -1; } /* Retrieve FSSpec from the reply */ else { AEKeyword theKeyword; DescType actualType; Size actualSize; /* Get a pointer to selected file */ (void)AEGetNthPtr(&reply.selection, 1, typeFSS, &theKeyword, &actualType, &savedGameSpec, sizeof(FSSpec), &actualSize); /* Dispose NavReplyRecord, resources and descriptors */ (void)NavDisposeReply(&reply); } /* Dispose location info */ AEDisposeDesc(&defaultLocation); /* Error */ if (err != noErr) return (FALSE); /* Convert FSSpec to pathname and store it in variable savefile */ (void)spec_to_path(&savedGameSpec, savefile, sizeof(savefile)); /* Success */ return (TRUE); } /* * Initialize the menus * * Fixed top level menus are now loaded all at once by GetNewMBar(). * Although this simplifies the function a bit, we have to make sure * that resources have all the expected entries defined XXX XXX */ static void init_menubar(void) { /* Boilerplate nib stuff */ IBNibRef nib; OSStatus err; if((err = CreateNibReference(CFSTR("main"), &nib))) quit("Cannot find the main nib bundle!"); if((err = SetMenuBarFromNib(nib, CFSTR("MenuBar")))) quit("Cannot prepare menu bar!"); /* Load the about dialog and set its contents */ (void) CreateWindowFromNib(nib, CFSTR("DLOG:about"), &aboutDialog); init_aboutdialogcontent(); DisposeNibReference(nib); MenuRef m = MyGetMenuHandle(kGraphicsMenu); for (int i = 1; i <= CountMenuItems(m); i++) { /* Invalid entry */ SetMenuItemRefCon(m, i, -1); } for (size_t i = 0; i < N_ELEMENTS(graphics_modes); i++) { SetMenuItemRefCon(m, graphics_modes[i].menuItem, i); } /* Set up bigtile menus */ m = MyGetMenuHandle(kBigtileWidthMenu); for (size_t i = 1; i <= CountMenuItems(m); i++) { SetMenuItemRefCon(m, i, i); } m = MyGetMenuHandle(kBigtileHeightMenu); for (size_t i = 1; i <= CountMenuItems(m); i++) { SetMenuItemRefCon(m, i, i); } for(int j = kTileWidMenu; j <= kTileHgtMenu; j++) { m = MyGetMenuHandle(j); for(UInt32 i = MIN_FONT; i <= 32; i++) { char buf[15]; /* Tile size */ strnfmt((char*)buf, 15, "%d", i); CFStringRef cfstr = CFStringCreateWithBytes ( NULL, (byte*) buf, strlen(buf), kCFStringEncodingASCII, false); AppendMenuItemTextWithCFString(m, cfstr, 0, j, NULL); SetMenuItemRefCon(m, i-MIN_FONT+1, i); CFRelease(cfstr); } } } /* Install the handlers from the Commands table. */ static void install_handlers(WindowRef w) { EventHandlerRef prevRef; for(size_t i = 0; i < N_ELEMENTS(event_defs) ; i++) { const CommandDef *def = &event_defs[i]; /* Install window handlers only for kWINDOW events */ if ((!w) == (def->targetID == kWINDOW)) continue; EventHandlerUPP evtUPP = NewEventHandlerUPP( def->handler ); const EventTypeSpec eventSpec = { def->evtClass, def->evtType }; EventTargetRef target = GetApplicationEventTarget(); if(def->targetID == kWINDOW) target = GetWindowEventTarget(w); else if(def->targetID) target = GetMenuEventTarget(MyGetMenuHandle(def->targetID)); OSStatus err = InstallEventHandler(target, evtUPP, 1, &eventSpec, def->userData, &prevRef); if(err == eventHandlerAlreadyInstalledErr) { err = AddEventTypesToHandler(prevRef, 1, &eventSpec); } } } static int funcGTE(int a, int b) { return a >= b; } static int funcConst(int a, int c) {return c; } /* This initializes all the menus with values that change unpredictably. * This function is called on every menu draw and therefore should be kept * light and fast; menus that change rarely are done at the time of change */ static void validate_menus(void) { WindowRef w = GetFrontWindowOfClass(kDocumentWindowClass, true); if (!w || !initialized) return; term_data *td = (term_data *) GetWRefCon(w); if (!td) return; struct { int menu; /* Radio-style Menu ID to validate */ URefCon cur; /* Value in use (Compare to RefCon) */ int limit; /* Constraint value */ int (*cmp) (int, int); /* Filter function */ } funcs [] = { { kTileWidMenu, td->tile_wid, td->font_wid, funcGTE }, { kTileHgtMenu, td->tile_hgt, td->font_hgt, funcGTE }, { kGraphicsMenu, graf_mode, 1, funcConst }, { kBigtileWidthMenu, tile_width, 1, funcGTE }, { kBigtileHeightMenu, tile_height, 1, funcGTE }, }; MenuHandle m; if (cmd.command != CMD_NULL) { EnableAllMenuItems(MyGetMenuHandle(kGraphicsMenu)); } for(size_t i = 0; i < N_ELEMENTS(funcs); i++) { m = MyGetMenuHandle(funcs[i].menu); int n = CountMenuItems(m); for (int j = 1; j <= n; j++) { URefCon value; GetMenuItemRefCon(m, j, &value); CheckMenuItem(m, j, funcs[i].cur == value); if (funcs[i].cmp(value, funcs[i].limit)) EnableMenuItem(m, j); else DisableMenuItem(m, j); } } if (cmd.command != CMD_NULL && character_generated) EnableMenuItem(MyGetMenuHandle(kFileMenu), kSave); else DisableMenuItem(MyGetMenuHandle(kFileMenu), kSave); m = MyGetMenuHandle(kFontMenu); CheckMenuItem(m, kAntialias, antialias); } static OSStatus ValidateMenuCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { validate_menus(); return noErr; } /* Populate the recent items menu */ static void redrawRecentItemsMenu() { DeleteMenuItems(MyGetMenuHandle(kOpenRecentMenu), 1, CountMenuItems(MyGetMenuHandle(kOpenRecentMenu))); if (!recentItemsArrayRef || CFArrayGetCount(recentItemsArrayRef) == 0) { AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), CFSTR("No recent items"), kMenuItemAttrDisabled, kOpenRecentMenu, NULL); } else { for (int i = 0; i < CFArrayGetCount(recentItemsArrayRef); i++) { OSErr err; FSRef recentFileRef; CFDataRef recentFileData; Boolean updateAlias = FALSE; MenuItemIndex item; recentFileData = CFArrayGetValueAtIndex(recentItemsArrayRef, i); if (CFDataGetTypeID() != CFGetTypeID(recentFileData)) continue; AliasHandle recentFileAlias = (AliasHandle)NewHandle(CFDataGetLength(recentFileData)); CFDataGetBytes(recentFileData, CFRangeMake(0, CFDataGetLength(recentFileData)), (UInt8 *) *recentFileAlias); err = FSResolveAlias(NULL, recentFileAlias, &recentFileRef, &updateAlias); if (err != noErr) continue; HFSUniStr255 recentFileName; err = FSGetCatalogInfo(&recentFileRef, kFSCatInfoNone, NULL, &recentFileName, NULL, NULL); if (err != noErr) continue; CFStringRef cfstr = CFStringCreateWithCharacters(kCFAllocatorDefault, recentFileName.unicode, recentFileName.length); AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), cfstr, 0, i, &item); /* Add a shortcut key -- command-alt-number */ if (i < 9) { SetMenuItemCommandKey(MyGetMenuHandle(kOpenRecentMenu), item, false, 0x31+i); SetMenuItemModifiers(MyGetMenuHandle(kOpenRecentMenu), item, kMenuOptionModifier); } CFRelease(cfstr); } AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), CFSTR("-"), kMenuItemAttrSeparator, FOUR_CHAR_CODE('Rsep'), NULL); AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), CFSTR("Clear menu"), 0, FOUR_CHAR_CODE('Rclr'), NULL); } } /* Add a savefile to the recent items list, or update its existing status */ static void updateRecentItems(char *savefile) { OSErr err; FSRef recentFileRef; AliasHandle recentFileAlias; CFDataRef newRecentFileData; CFDataRef recentFileData; /* Convert the save path to an FSRef, then an Alias, and convert to data ready for storage */ err = FSPathMakeRef((byte *)savefile, &recentFileRef, NULL); if (err != noErr) return; err = FSNewAlias(NULL, &recentFileRef, &recentFileAlias); if (err != noErr) return; newRecentFileData = CFDataCreate(kCFAllocatorDefault, (UInt8 *) *recentFileAlias, GetHandleSize((Handle)recentFileAlias)); /* Loop through the recent items array, and delete any matches */ for (int i = CFArrayGetCount(recentItemsArrayRef) - 1; i >= 0; i--) { Boolean updateAlias = FALSE; char recentFilePath[1024]; /* Retrieve the recent item, resolve the alias, and extract a path */ recentFileData = CFArrayGetValueAtIndex(recentItemsArrayRef, i); if (CFDataGetTypeID() != CFGetTypeID(recentFileData)) continue; AliasHandle recentFileAlias = (AliasHandle)NewHandle(CFDataGetLength(recentFileData)); CFDataGetBytes(recentFileData, CFRangeMake(0, CFDataGetLength(recentFileData)), (UInt8 *) *recentFileAlias); /* If resolving an alias fails, don't delete it - the array is size-limited * anyway, and this allows network shares or removeable drives to come back later */ err = FSResolveAlias(NULL, recentFileAlias, &recentFileRef, &updateAlias); if (err != noErr) continue; err = FSRefMakePath(&recentFileRef, (byte *)recentFilePath, 1024); if (err != noErr) continue; /* Remove the item from the array if the paths match */ if (strcmp(recentFilePath, savefile) == 0) { CFArrayRemoveValueAtIndex(recentItemsArrayRef, i); continue; } /* If performing a file search via the alias updated it, save changes */ if (updateAlias) { recentFileData = CFDataCreate(kCFAllocatorDefault, (UInt8 *) *recentFileAlias, GetHandleSize((Handle)recentFileAlias)); CFArraySetValueAtIndex(recentItemsArrayRef, i, newRecentFileData); } } /* Insert the encoded alias at the start of the recent items array */ CFArrayInsertValueAtIndex(recentItemsArrayRef, 0, newRecentFileData); /* Limit to ten items */ if (CFArrayGetCount(recentItemsArrayRef) > 10) CFArrayRemoveValueAtIndex(recentItemsArrayRef, 10); /* Redraw the menu */ redrawRecentItemsMenu(); } /* Handle a selection in the recent items menu */ static OSStatus OpenRecentCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; command.commandID = 0; GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); /* If the 'Clear menu' command was selected, flush the recent items array */ if (command.commandID == FOUR_CHAR_CODE('Rclr')) { CFArrayRemoveAllValues(recentItemsArrayRef); /* Otherwise locate the correct filepath and open it. */ } else { if (cmd.command != CMD_NULL || command.commandID >= (UInt32)CFArrayGetCount(recentItemsArrayRef)) return eventNotHandledErr; OSErr err; FSRef recentFileRef; AliasHandle recentFileAlias; CFDataRef recentFileData; Boolean updateAlias = FALSE; recentFileData = CFArrayGetValueAtIndex(recentItemsArrayRef, command.commandID); if (CFDataGetTypeID() != CFGetTypeID(recentFileData)) return eventNotHandledErr; recentFileAlias = (AliasHandle)NewHandle(CFDataGetLength(recentFileData)); CFDataGetBytes(recentFileData, CFRangeMake(0, CFDataGetLength(recentFileData)), (UInt8 *) *recentFileAlias); err = FSResolveAlias(NULL, recentFileAlias, &recentFileRef, &updateAlias); if (err != noErr) return eventNotHandledErr; err = FSRefMakePath(&recentFileRef, (byte *)savefile, 1024); if (err != noErr) return eventNotHandledErr; cmd.command = CMD_LOADFILE; } /* Redraw the menu */ redrawRecentItemsMenu(); return noErr; } static OSStatus AngbandGame(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { UInt32 i; /* Only enabled options are Fonts, Open/New/Import and Quit. */ DisableAllMenuItems(MyGetMenuHandle(kTileWidMenu)); DisableAllMenuItems(MyGetMenuHandle(kTileHgtMenu)); SetFontInfoForSelection(kFontSelectionATSUIType, 0, 0, 0); for(i = kNew; i <= kImport; i++) EnableMenuItem(MyGetMenuHandle(kFileMenu), i); /* Validate graphics, after bootstrapped opening of terminals */ for(i = 0; i < N_ELEMENTS(data); i++) { if(data[i].mapped) RevalidateGraphics(&data[i], FALSE); } /* Flush the prompt */ Term_fresh(); Term_flush(); play_game(); quit(0); /* Not reached */ return noErr; } /* * "New" / "Open" / "Import" */ static OSStatus openGame(int op) { /* If a game is in progress, do not proceed */ if (cmd.command != CMD_NULL) return noErr; /* Let the player to choose savefile */ if (op != kNew && 0 == select_savefile(op == kImport)) { /* Failed to open */ return noErr; } /* Disable the file-handling options in the file menu */ for(int i = kNew; i <= kImport; i++) DisableMenuItem(MyGetMenuHandle(kFileMenu), i); /* Wait for a keypress */ pause_line(Term); /* Set the game status */ if (op == kNew) cmd.command = CMD_NEWGAME; else cmd.command = CMD_LOADFILE; return noErr; } /* * Run the event loop and return a gameplay status to init_angband */ static errr get_cmd_init() { EventTargetRef target = GetEventDispatcherTarget(); OSStatus err; EventRef event; /* Prompt the user */ prt("[Choose 'New', 'Open' or 'Import' from the 'File' menu]", 23, 11); Term_fresh(); while (cmd.command == CMD_NULL) { err = ReceiveNextEvent(0, 0, kEventDurationForever, true, &event); if(err == noErr) { SendEventToEventTarget (event, target); ReleaseEvent(event); } } /* Push the command to the game. */ cmd_insert_s(&cmd); /* A game is starting - update status and tracking as appropriate. */ term_data *td0 = &data[0]; ChangeWindowAttributes(td0->w, kWindowNoAttributes, kWindowCloseBoxAttribute); DisableMenuItem(MyGetMenuHandle(kFileMenu), kClose); /* Disable the file-handling options in the file menu. * This has to be done separately for new/open due to messages/prompts * which may delay open while the menus are still accessibile. */ for(int i = kNew; i <= kImport; i++) DisableMenuItem(MyGetMenuHandle(kFileMenu), i); /* If supplied with a savefile, update the Recent Items list */ if (savefile[0]) { updateRecentItems(savefile); redrawRecentItemsMenu(); } return 0; } static errr crb_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_cmd_init(); else return textui_get_cmd(context, wait); } static OSStatus QuitCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { if (cmd.command == CMD_NULL && !character_generated) quit(0); else Term_key_push(KTRL('x')); return noErr; } static OSStatus CommandCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; command.commandID = 0; GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); UInt32 attrib; GetEventParameter( inEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(attrib), NULL, &attrib); switch(command.commandID) { default: return eventNotHandledErr; case 'save': if(cmd.command != CMD_NULL && character_generated) Term_key_push(KTRL('S')); break; case 'open': openGame(command.menu.menuItemIndex); break; case 'font': { if(!FPIsFontPanelVisible()) { WindowRef w = FrontWindow(); if (w) { term_data *td = (term_data*) GetWRefCon(w); SetFontInfoForSelection(kFontSelectionATSUIType, 1, &td->ginfo->style, NULL); } } CFStringRef tags[] = {CFSTR("Show Fonts"), CFSTR("Hide Fonts")}; FPShowHideFontPanel(); SetMenuItemTextWithCFString(command.menu.menuRef, kFonts, tags[FPIsFontPanelVisible()] ); break; } } return noErr; } static OSStatus CloseCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { WindowRef w = 0; term_data *td; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); td = (term_data*) GetWRefCon(w); if(cmd.command == CMD_NULL && !character_generated && td == &data[0]) quit(0); hibernate(); /* Track the go-away box */ if (td && td != &data[0]) { /* Not Mapped */ td->mapped = FALSE; /* Not Mapped */ td->t->mapped_flag = FALSE; /* Hide the window */ TransitionWindow(td->w, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL); /* Update the menu status */ CheckMenuItem(MyGetMenuHandle(kWindowMenu), kAngbandTerm+(td - &data[0]), FALSE); } return noErr; } static OSStatus ResizeCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { int x, y; WindowRef w = 0; unsigned flags; term_data *td; term *old = Term; int err ; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); err = GetEventParameter(inEvent, kEventParamAttributes, typeUInt32, NULL, sizeof(flags), NULL, &flags); td = (term_data*) GetWRefCon(w); /* Oops */ if (!td) return noErr; /* Obtain geometry of resized window */ Rect tmpR; GetWindowBounds((WindowRef)td->w, kWindowContentRgn, &tmpR); td->r = tmpR; if(td->r.top < 40) td->r.top = 40; /* Extract the new ClipRect size in pixels */ y = tmpR.bottom - tmpR.top - BORDER_WID; x = tmpR.right - tmpR.left - BORDER_WID * 2; /* Ignore drag effects, other than for moving the mouse origin */ if(td->rows * td->tile_hgt == y && td->cols * td->tile_wid == x) return noErr; /* Extract a "close" approximation */ td->rows = y / td->tile_hgt; td->cols = x / td->tile_wid; /* Apply and Verify */ term_data_check_size(td); /* Activate */ Term_activate(td->t); /* Resize the term to correspond to new count. */ Term_resize(td->cols, td->rows); Term_activate(old); /* Close the old (different size) CGContext */ hibernate(); /* Resize and Redraw */ term_data_resize(td); /* Since we don't know what view needs to be updated, recalculate */ /* and redraw them all. (term_data_redraw() is not sufficient) */ Term_key_push(KTRL('R')); return eventNotHandledErr; } static void graphics_aux(UInt32 op) { graf_mode = op; use_transparency = graphics_modes[op].trans; pict_id = graphics_modes[op].file; graf_width = graf_height = graphics_modes[op].size; use_graphics = (op != 0); graf_mode = op; ANGBAND_GRAF = graphics_modes[op].name; arg_graphics = op; graphics_nuke(); /* load tiles and setup GWorlds if tiles are requested */ if (use_graphics && (graphics_init() != 0)) { /* Oops */ plog("Cannot initialize graphics!"); /* reset graphics flags */ use_graphics = 0; graf_mode = 0; ANGBAND_GRAF = 0; /* reset transparency mode */ use_transparency = false; } /* Reset visuals, without updating the screen */ if (initialized && cmd.command != CMD_NULL) { reset_visuals(TRUE); } RevalidateGraphics(&data[0], FALSE); Term_key_push(KTRL('R')); } static OSStatus TileSizeCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { term_data *td = Term->data; assert(td); HICommand cmd; GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd); UInt32 newSize = 0; GetMenuItemRefCon(cmd.menu.menuRef, cmd.menu.menuItemIndex, &newSize); if (GetMenuID(cmd.menu.menuRef) == kTileWidMenu) { if (td->font_wid > newSize || newSize == td->tile_wid) return noErr; else td->tile_wid = newSize; } else if (GetMenuID(cmd.menu.menuRef) == kTileHgtMenu) { if (td->font_hgt > newSize || newSize == td->tile_hgt) return noErr; else td->tile_hgt = newSize; } else { return eventNotHandledErr; } RevalidateGraphics(td, FALSE); return noErr; } static OSStatus RestoreCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { WindowRef w = 0; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); term_data *td = (term_data*) GetWRefCon(w); if (!td) return eventNotHandledErr; /* Mapped */ td->mapped = TRUE; int i = td - &data[0]; /* Link */ term_data_link(i); /* Mapped (?) */ td->t->mapped_flag = TRUE; /* Bring to the front */ SelectWindow(td->w); /* Update menu states */ if (td == &data[0] && cmd.command != CMD_NULL) DisableMenuItem(MyGetMenuHandle(kFileMenu), kClose); else EnableMenuItem(MyGetMenuHandle(kFileMenu), kClose); return noErr; } static OSStatus TerminalCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &command); /* Offset of Angband term in Window menu. */ int i = command.menu.menuItemIndex - kAngbandTerm; /* Check legality of choice */ if ((i < 0) || (i >= MAX_TERM_DATA)) return eventNotHandledErr; /* Obtain the window */ term_data *td = &data[i]; /* Mapped */ td->mapped = TRUE; /* Link */ term_data_link(i); /* Mapped (?) */ td->t->mapped_flag = TRUE; /* Show the window */ TransitionWindow(td->w, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL); /* Update the menu status */ CheckMenuItem(MyGetMenuHandle(kWindowMenu), kAngbandTerm+i, TRUE); term_data_check_font(td); term_data_check_size(td); term_data_resize(td); Term_resize(td->cols, td->rows); term_data_redraw(td); /* Bring to the front */ SelectWindow(td->w); return noErr; } static OSStatus RevalidateGraphics(term_data *td, bool reset_tilesize) { if (!td) return noErr; /* * Reset the tilesize on graphics changes; term_data_check_font recalculates * this after it's been reset. However, only reset the tilesize for default * and font events (not startup - 'Play' 'Band' - or manual changes) */ if (reset_tilesize) { td->tile_wid = td->tile_hgt = 0; } /* Clear the graphics tile cache. */ graphics_tiles_nuke(); /* Sanity check for rows, columns, tilesize. */ term_data_check_font(td); term_data_check_size(td); /* Window size changes */ term_data_resize(td); term_data_redraw(td); return noErr; } static OSStatus UpdateCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { WindowRef w = 0; term_data *td; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); if(!w) return noErr; /* Clear window's update region and clip drawings with it */ BeginUpdate(w); td = (term_data*) GetWRefCon(w); if (td) term_data_redraw(td); EndUpdate(w); return noErr; } static void toggle_antialias(HICommand *command, void *data) { antialias = !antialias; } static void set_graphics_mode(HICommand *command, void *data) { /* Index in graphics_modes[] */ UInt32 op; GetMenuItemRefCon(command->menu.menuRef, command->menu.menuItemIndex, &op); if (graf_mode != op) graphics_aux(op); } static void set_tile_width(HICommand *command, void *data) { UInt32 op; GetMenuItemRefCon(command->menu.menuRef, command->menu.menuItemIndex, &op); assert(op != 0); tile_width = op; } static void set_tile_height(HICommand *command, void *data) { UInt32 op; GetMenuItemRefCon(command->menu.menuRef, command->menu.menuItemIndex, &op); assert(op != 0); tile_height = op; } static void reset_wid_hgt(HICommand *command, void *data) { term_data *td = Term->data; assert(td); td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; } static void seek_graphics_size(term_data *td, int seek_wid, int seek_hgt) { td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; tile_width = MAX(seek_wid / td->font_wid, 1); tile_height = MAX(seek_hgt / td->font_hgt, 1); td->tile_wid += (seek_wid - (tile_width * td->font_wid)) / tile_width; td->tile_hgt += (seek_hgt - (tile_height * td->font_hgt)) / tile_height; } static void set_nice_graphics_fit(HICommand *command, void *data) { term_data *td = Term->data; assert(td); seek_graphics_size(td, graf_width, graf_height); } static void set_nice_graphics_square(HICommand *command, void *data) { term_data *td = Term->data; assert(td); int max_dimension = MAX(td->font_wid, td->font_hgt); seek_graphics_size(td, max_dimension, max_dimension); } static OSStatus ToggleCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { HICommand command; GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); for (size_t i = 0; i < N_ELEMENTS(menu_commands); i++) { if (command.commandID != menu_commands[i].id) continue; menu_commands[i].handler(&command, menu_commands[i].data); if (menu_commands[i].refresh == true) { RevalidateGraphics(&data[0], FALSE); Term_key_push(KTRL('R')); } return noErr; } return eventNotHandledErr; } static void FontChanged(UInt32 fontID, float size) { if (size < MIN_FONT || fontID == 0) return; ATSUStyle fontStyle; term_data *td = (term_data *) GetWRefCon(fontInfo.focus); assert(td); /* No change. */ if (td->font_id == fontID && td->font_size == size) return; const ATSUAttributeTag tags[] = {kATSUFontTag, kATSUSizeTag}; Fixed fsize = (Fixed)(size*(1<<16)); const ByteCount sizes[] = {sizeof(fontID), sizeof(fsize)}; void * values[] = { &fontID, &fsize }; ATSUCreateStyle(&fontStyle); ATSUSetAttributes(fontStyle, 2, tags, sizes, values); /* Reject italics &c */ const ATSUAttributeTag badtags[] = {kATSUQDItalicTag, kATSUQDUnderlineTag, kATSUQDCondensedTag }; for (size_t i = 0; i < N_ELEMENTS(badtags); i++) { bool ital = false; ByteCount ssize = sizeof(ital); ATSUGetAttribute(fontStyle, badtags[i], ssize, &ital, 0); if(ital) { ATSUDisposeStyle(fontStyle); return; } } ATSUDisposeStyle(fontStyle); td->font_id = fontID; td->font_size = size; RevalidateGraphics(td, TRUE); } /* * Bookkeeping for font-related events. */ static OSStatus FontCommand(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData) { int class = GetEventClass(inEvent); int type = GetEventKind(inEvent); if(class == 'font' && type == kEventFontSelection) { UInt32 fid = 0; Fixed size = 0; (void) GetEventParameter (inEvent, kEventParamATSUFontSize, typeATSUSize, NULL, sizeof (size), NULL, &size); (void) GetEventParameter (inEvent, kEventParamATSUFontID, typeATSUFontID, NULL, sizeof(fid), NULL, &fid); if(size > 32*(1<<16)) size = 32*(1<<16); float fsize = 1.0*size/(1<<16); FontChanged(fid, fsize); return noErr; } else if(class == 'appl' && type == kEventAppActiveWindowChanged) { WindowRef w = 0; GetEventParameter(inEvent, kEventParamCurrentWindow, typeWindowRef, NULL, sizeof(w), NULL, &w); if(!GetWRefCon(w)) { /* Window is Font Panel. */ w = 0; GetEventParameter(inEvent, kEventParamPreviousWindow, typeWindowRef, NULL, sizeof(w), NULL, &w); } if(w) fontInfo.focus = w; return noErr; } else if(class == 'font' && type == kEventFontPanelClosed) { SetMenuItemTextWithCFString(GetMenuHandle(kFontMenu), kFonts, CFSTR("Show Fonts")); return noErr; } return eventNotHandledErr; } static OSStatus MouseCommand (EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { WindowRef w = 0; GetEventParameter(inEvent, kEventParamWindowRef, typeWindowRef, NULL, sizeof(w), NULL, &w); /* Relevant "term_data" */ term_data *td = (term_data *) GetWRefCon(w); if(&data[0] != td) return eventNotHandledErr; short button = 0; GetEventParameter(inEvent, kEventParamMouseButton, typeMouseButton, NULL, sizeof(button), NULL, &button); UInt32 modifiers = 0; GetEventParameter(inEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers); HIPoint p = {0, 0}; GetEventParameter(inEvent, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(p), NULL, &p); if(button == -1) button = 1; if(button == 1 && modifiers & cmdKey) button = 2; else if(button == 1 && modifiers & shiftKey) button = 3; /* X coordinate relative to left side of window exclusive of border. */ p.x -= (BORDER_WID+td->r.left); /* Y coordinate relative to top of window content region. */ p.y -= td->r.top; Term_mousepress(p.x/td->tile_wid, p.y/td->tile_hgt, button); return noErr; } static OSStatus KeyboardCommand ( EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { /* Don't handle keyboard events in open/save dialogs, to prevent a 10.4 keyboard interaction bug */ UInt32 windowClass; GetWindowClass(GetUserFocusWindow(), &windowClass); if (windowClass == kMovableModalWindowClass) return eventNotHandledErr; UInt32 evt_mods; UInt32 evt_keycode; /* Get various aspects of the keycode */ GetEventParameter(inEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &evt_mods); GetEventParameter(inEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &evt_keycode); /* Extract some modifiers */ bool mc = (evt_mods & controlKey) ? TRUE : FALSE; bool ms = (evt_mods & shiftKey) ? TRUE : FALSE; bool mo = (evt_mods & optionKey) ? TRUE : FALSE; bool mx = (evt_mods & cmdKey) ? TRUE : FALSE; bool kp = FALSE; byte mods = (mo ? KC_MOD_ALT : 0) | (mx ? KC_MOD_META : 0); keycode_t ch = 0; /* Command + "normal key" -> menu action */ if (mx && evt_keycode < 64) return eventNotHandledErr; /* Hide the mouse pointer */ hibernate(); ObscureCursor(); /* see http://www.classicteck.com/rbarticles/mackeyboard.php */ switch (evt_keycode) { /* top number keys */ case 18: if (!ms || mo) ch = '1'; break; case 19: if (!ms || mo) ch = '2'; break; case 20: if (!ms || mo) ch = '3'; break; case 21: if (!ms || mo) ch = '4'; break; case 23: if (!ms || mo) ch = '5'; break; case 22: if (!ms || mo) ch = '6'; break; case 26: if (!ms || mo) ch = '7'; break; case 28: if (!ms || mo) ch = '8'; break; case 25: if (!ms || mo) ch = '9'; break; case 29: if (!ms || mo) ch = '0'; break; /* keypad keys */ case 65: ch = '.'; kp = TRUE; break; case 67: ch = '*'; kp = TRUE; break; case 69: ch = '+'; kp = TRUE; break; case 75: ch = '/'; kp = TRUE; break; case 76: ch = '\n'; kp = TRUE; break; case 78: ch = '-'; kp = TRUE; break; case 81: ch = '='; kp = TRUE; break; case 82: ch = '0'; kp = TRUE; break; case 83: ch = '1'; kp = TRUE; break; case 84: ch = '2'; kp = TRUE; break; case 85: ch = '3'; kp = TRUE; break; case 86: ch = '4'; kp = TRUE; break; case 87: ch = '5'; kp = TRUE; break; case 88: ch = '6'; kp = TRUE; break; case 89: ch = '7'; kp = TRUE; break; case 91: ch = '8'; kp = TRUE; break; case 92: ch = '9'; kp = TRUE; break; /* main keyboard but deal with here */ case 48: ch = KC_TAB; break; case 36: ch = KC_RETURN; break; case 51: ch = KC_BACKSPACE; break; /* middle bit */ case 114: ch = KC_HELP; break; case 115: ch = KC_HOME; break; case 116: ch = KC_PGUP; break; case 117: ch = KC_DELETE; break; case 119: ch = KC_END; break; case 121: ch = KC_PGDOWN; break; case 123: ch = ARROW_LEFT; break; case 124: ch = ARROW_RIGHT; break; case 125: ch = ARROW_DOWN; break; case 126: ch = ARROW_UP; break; /* function keys */ case 122: ch = KC_F1; break; case 120: ch = KC_F2; break; case 99: ch = KC_F3; break; case 118: ch = KC_F4; break; case 96: ch = KC_F5; break; case 97: ch = KC_F6; break; case 98: ch = KC_F7; break; case 100: ch = KC_F8; break; case 101: ch = KC_F9; break; case 109: ch = KC_F10; break; case 103: ch = KC_F11; break; case 111: ch = KC_F12; break; case 105: ch = KC_F13; break; case 107: ch = KC_F14; break; case 113: ch = KC_F15; break; } if (ch) { mods |= (mc ? KC_MOD_CONTROL : 0) | (ms ? KC_MOD_SHIFT : 0) | (kp ? KC_MOD_KEYPAD : 0); Term_keypress(ch, mods); } else if (evt_keycode < 64) { /* Keycodes under 64 = main part of the keyboard, printables (mostly) */ char ch; GetEventParameter(inEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &ch); if (mc && MODS_INCLUDE_CONTROL(ch)) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(ch)) mods |= KC_MOD_SHIFT; Term_keypress(ch, mods); } return noErr; } /* About angband... */ static OSStatus AboutCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; command.commandID = 0; GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); if(command.commandID != 'abou') return eventNotHandledErr; /* Move it to the middle of the screen */ RepositionWindow(aboutDialog, NULL, kWindowCenterOnMainScreen); /* Show the dialog */ TransitionWindow(aboutDialog, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL); /* wait for user input */ for(;;) { EventTargetRef target = GetEventDispatcherTarget(); EventRef event; OSStatus err = ReceiveNextEvent(0, 0, kEventDurationForever, true, &event); EventClass evc = GetEventClass(event); EventType evt = GetEventKind(event); if(err == noErr) { SendEventToEventTarget (event, target); ReleaseEvent(event); } if(evc == 'keyb' || (evc == 'mous' && evt == kEventMouseDown)) break; } /* Hide the dialogue */ TransitionWindow(aboutDialog, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL); return noErr; } static OSStatus ResumeCommand (EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { term_data *td; hibernate(); Cursor tempCursor; SetCursor(GetQDGlobalsArrow(&tempCursor)); /* Redraw all visible terms */ for (int i = 0; i < MAX_TERM_DATA; i++ ) { /* Obtain */ td = &data[i]; /* Redraw if mapped */ if (td->mapped) term_data_redraw(td); } return noErr; } static OSErr AEH_Open(const AppleEvent *theAppleEvent, AppleEvent* reply, SInt32 handlerRefCon) { FSSpec myFSS; AEDescList docList; long fileindex; long filecount; OSErr err; FInfo myFileInfo; /* If a game is in progress, do not proceed */ if (cmd.command != CMD_NULL) return noErr; /* Put the direct parameter (a descriptor list) into a docList */ err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList); if (err) return err; err = AECountItems(&docList, &filecount); if (err) return err; /* Only open one file, but check for the first valid file in the list */ for (fileindex = 1; fileindex <= filecount; fileindex++) { err = AEGetNthPtr(&docList, fileindex, typeFSS, NULL, NULL, &myFSS, sizeof(myFSS), NULL); if (err) continue; err = FSpGetFInfo(&myFSS, &myFileInfo); if (err) continue; if (myFileInfo.fdType == 'SAVE') { /* Extract the filename and delay the open */ (void)spec_to_path(&myFSS, savefile, sizeof(savefile)); cmd.command = CMD_LOADFILE; break; } } /* Dispose */ err = AEDisposeDesc(&docList); /* Success */ return noErr; } /* * Handle quit_when_ready, by Peter Ammon, * slightly modified to check inkey_flag. */ static void quit_calmly(void) { /* Quit immediately if game's not started */ if (cmd.command == CMD_NULL || !character_generated) quit(NULL); /* Save the game and Quit (if it's safe) */ if (inkey_flag) { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ #ifndef ZANG_AUTO_SAVE save_game(); #else do_cmd_save_game(FALSE); #endif /* !ZANG_AUTO_SAVE */ /* Quit */ quit(NULL); } /* Wait until inkey_flag is set */ } /* * Macintosh modifiers (event.modifier & ccc): * cmdKey, optionKey, shiftKey, alphaLock, controlKey * * * Macintosh Keycodes (0-63 normal, 64-95 keypad, 96-127 extra): * * Return:36 * Delete:51 * * Period:65 * Star:67 * Plus:69 * Clear:71 * Slash:75 * Enter:76 * Minus:78 * Equal:81 * 0-7:82-89 * 8-9:91-92 * * backslash/vertical bar (Japanese keyboard):93 * * F5: 96 * F6: 97 * F7: 98 * F3:99 * F8:100 * F10:101 * F11:103 * F13:105 * F14:107 * F9:109 * F12:111 * F15:113 * Help:114 * Home:115 * PgUp:116 * Del:117 * F4: 118 * End:119 * F2:120 * PgDn:121 * F1:122 * Lt:123 * Rt:124 * Dn:125 * Up:126 */ /* * optimize non-blocking calls to "CheckEvents()" * idea from "maarten hazewinkel " * * was: 6. the value of one (~ 60 fps) seems to work better with the borg, * and so should be for other cpu-intensive features like the autoroller. */ #define event_ticks 1 /* * check for events, return true if we process any */ static bool CheckEvents(int wait) { static EventTimeout lastticks; EventTimeout curticks; /* access the clock */ curticks = TickCount(); EventTimeout sleep_ticks; EventRef event; OSStatus err; /* hack -- allow efficient checking for non-pending events */ if ((wait == CHECK_EVENTS_NO_WAIT) && (curticks < lastticks + event_ticks)) return (false); /* timestamp last check */ lastticks = curticks; /* handles the quit_when_ready flag */ if (quit_when_ready) quit_calmly(); /* blocking call to waitnextevent - should use max_int xxx xxx */ if (wait == CHECK_EVENTS_WAIT) sleep_ticks = kEventDurationForever; /* non-blocking */ else sleep_ticks = 0l; EventTargetRef target = GetEventDispatcherTarget(); /* get an event (or null) */ do { err = ReceiveNextEvent(0, 0, wait ? kEventDurationForever : 0, true, &event); if(show_events) { EventClass evc = GetEventClass(event); EventType evt = GetEventKind(event); if(evc != 'mous' || evt != kEventMouseDragged ) printf("%d (%4s) %d\n", (int)evc, (char*)&evc, (int)evt); } if(err == noErr) { err = SendEventToEventTarget (event, target); ReleaseEvent(event); } else if(err != eventNotHandledErr && sleep_ticks >= 0) { curticks = TickCount(); sleep_ticks -= curticks - lastticks; lastticks = curticks; if(sleep_ticks <= 0) return false; } } while(err != eventNotHandledErr && err); /* DurationForever is -1 */ return true; } /*** Some Hooks for various routines ***/ /* * Hook to tell the user something important */ static void hook_plog(const char *str) { /* Warning message */ mac_warning(str); } /* * Hook to tell the user something, and then quit */ static void hook_quit(const char *str) { /* Warning if needed */ if (str) mac_warning(str); /* Update the Recent Items list - inserts newly created characters */ if (savefile[0]) updateRecentItems(savefile); /* Dispose of graphic tiles */ if(frame.image) graphics_nuke(); /* Write a preference file */ if (initialized) save_pref_file(); /* All done */ ExitToShell(); } /*** Main program ***/ /* * Initialize and verify file and dir paths * */ static void init_paths(void) { char path[1024]; /* Hook in to the file_open routine */ file_open_hook = osx_file_open_hook; /* Default to the "lib" folder with the application */ if (locate_lib(path, sizeof(path)) == NULL) { quit("unable to find 'lib' dir"); } /* Prepare the paths */ init_file_paths(path, path, path); /* Create any missing directories */ create_needed_dirs(); /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news.txt"); /* Attempt to open and close that file */ if (!file_exists(path)) { /* Warning */ plog_fmt("Unable to open the '%s' file.", path); quit("The Angband 'lib' folder is probably missing or misplaced."); } } /* * Macintosh Main loop */ int main(void) { /* Initialise the cursor and turn it into an "arrow" */ InitCursor(); /* * Remember Mac OS version, in case we have to cope with version-specific * problems */ (void)Gestalt(gestaltSystemVersion, &mac_os_version); /* Initiliases Cocoa */ NSApplicationLoad(); /* Hooks in some "z-util.c" hooks */ plog_aux = hook_plog; quit_aux = hook_quit; /* Initialize colors */ update_color_info(); /* Show the "watch" cursor */ SetCursor(*(GetCursor(watchCursor))); /* Prepare the menubar */ init_menubar(); /* Ensure that the recent items array is always an array and start with an empty menu */ recentItemsArrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); redrawRecentItemsMenu(); /* Initialize */ init_paths(); /* Prepare the windows */ init_windows(); /* Install the 'Apple Event' handler hook (ignore error codes) */ (void)AEInstallEventHandler( kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerUPP(AEH_Open), 0L, FALSE); /* Install menu and application handlers */ install_handlers(0); /* Reset the cursor */ Cursor tempCursor; SetCursor(GetQDGlobalsArrow(&tempCursor)); /* Quicktime -- Load sound effect resources */ load_sounds(); /* Note the "system" */ ANGBAND_SYS = "mac"; /* Validate the contents of the main window */ validate_main_window(); /* Flush input commands from the event queue */ FlushEventsMatchingListFromQueue(GetMainEventQueue(), N_ELEMENTS(input_event_types), input_event_types); /* Set command hook */ cmd_get_hook = crb_get_cmd; /* Set up the display handlers and things. */ init_display(); if(graf_mode) graphics_aux(graf_mode); /* We are now initialized */ initialized = TRUE; validate_menus(); /* Start playing! */ EventRef newGameEvent = nil; CreateEvent ( nil, 'Play', 'Band', GetCurrentEventTime(), kEventAttributeNone, &newGameEvent ); PostEventToQueue(GetMainEventQueue(), newGameEvent, kEventPriorityLow); RunApplicationEventLoop(); /* Quit */ quit(NULL); /* Since it's an int function */ return (0); } #endif /* MACH_O_CARBON */ angband-v3.3.2/src/externs.h0000644000175000017500000002013011651552410015233 0ustar chriscchrisc#ifndef INCLUDED_EXTERNS_H #define INCLUDED_EXTERNS_H #include "monster/constants.h" #include "monster/monster.h" #include "object/object.h" #include "player/types.h" #include "store.h" #include "types.h" #include "x-char.h" #include "z-file.h" #include "z-msg.h" #include "spells.h" /* This file was automatically generated. It is now obsolete (it was never a * good idea to begin with; you should include only what you use instead of * including everything everywhere) and is being slowly destroyed. Do not add * new entries to this file. */ #ifdef ALLOW_BORG /* Screensaver variables for the borg. apw */ extern bool screensaver; #endif /* ALLOW_BORG */ /* tables.c */ extern const s16b ddd[9]; extern const s16b ddx[10]; extern const s16b ddy[10]; extern const s16b ddx_ddd[9]; extern const s16b ddy_ddd[9]; extern const byte extract_energy[200]; extern const s32b player_exp[PY_MAX_LEVEL]; extern const player_sex sex_info[MAX_SEXES]; extern const byte chest_traps[64]; extern const char *stat_names[A_MAX]; extern const char *stat_names_reduced[A_MAX]; extern const char *window_flag_desc[32]; extern const char *inscrip_text[]; extern const byte char_tables[256][CHAR_TABLE_SLOTS]; /* variable.c */ extern const char *copyright; extern bool arg_wizard; extern bool arg_rebalance; extern int arg_graphics; extern bool arg_graphics_nice; extern bool character_generated; extern bool character_existed; extern bool character_dungeon; extern bool character_saved; extern s16b character_icky; extern s16b character_xtra; extern u32b seed_randart; extern u32b seed_flavor; extern u32b seed_town; extern s16b num_repro; extern s32b turn; extern int use_graphics; extern bool use_graphics_nice; extern s16b signal_count; extern bool msg_flag; extern bool inkey_xtra; extern u32b inkey_scan; extern bool inkey_flag; extern s16b o_max; extern s16b o_cnt; extern char savefile[1024]; extern term *angband_term[ANGBAND_TERM_MAX]; extern char angband_term_name[ANGBAND_TERM_MAX][16]; extern byte angband_color_table[MAX_COLORS][4]; extern color_type color_table[MAX_COLORS]; extern const char *angband_sound_name[MSG_MAX]; extern u16b *temp_g; extern maxima *z_info; extern monster_lore *l_list; extern quest *q_list; extern struct store *stores; extern int store_knowledge; extern const char *** name_sections; extern s16b alloc_ego_size; extern alloc_entry *alloc_ego_table; extern s16b alloc_race_size; extern alloc_entry *alloc_race_table; extern byte gf_to_attr[GF_MAX][BOLT_MAX]; extern char gf_to_char[GF_MAX][BOLT_MAX]; extern byte tval_to_attr[128]; extern player_other *op_ptr; extern player_type *p_ptr; extern feature_type *f_info; extern object_base *kb_info; extern object_kind *k_info; extern artifact_type *a_info; extern ego_item_type *e_info; extern monster_base *rb_info; extern monster_race *r_info; extern monster_pain *pain_messages; extern struct player_race *races; extern struct player_class *classes; extern struct flavor *flavors; extern struct vault *vaults; extern struct object_kind *objkinds; extern spell_type *s_info; extern struct hint *hints; extern struct pit_profile *pit_info; extern const char *ANGBAND_SYS; extern const char *ANGBAND_GRAF; extern char *ANGBAND_DIR_APEX; extern char *ANGBAND_DIR_EDIT; extern char *ANGBAND_DIR_FILE; extern char *ANGBAND_DIR_HELP; extern char *ANGBAND_DIR_INFO; extern char *ANGBAND_DIR_SAVE; extern char *ANGBAND_DIR_PREF; extern char *ANGBAND_DIR_USER; extern char *ANGBAND_DIR_XTRA; extern char *ANGBAND_DIR_XTRA_FONT; extern char *ANGBAND_DIR_XTRA_GRAF; extern char *ANGBAND_DIR_XTRA_SOUND; extern char *ANGBAND_DIR_XTRA_ICON; extern bool item_tester_full; extern byte item_tester_tval; extern bool (*item_tester_hook)(const object_type *); extern bool (*get_mon_num_hook)(int r_idx); extern ang_file *text_out_file; extern void (*text_out_hook)(byte a, const char *str); extern int text_out_wrap; extern int text_out_indent; extern int text_out_pad; extern bool use_transparency; extern void (*sound_hook)(int); extern u16b daycount; /* util.c */ extern struct keypress *inkey_next; /* birth.c */ extern void player_birth(bool quickstart_allowed); /* cmd1.c */ extern bool search(bool verbose); extern byte py_pickup(int pickup); extern void move_player(int dir, bool disarm); /* cmd2.c */ int count_feats(int *y, int *x, bool (*test)(struct cave *cave, int y, int x), bool under); int count_chests(int *y, int *x, bool trapped); int coords_to_dir(int y, int x); /* death.c */ void death_screen(void); /* dungeon.c */ extern void dungeon_change_level(int dlev); extern void play_game(void); extern int value_check_aux1(const object_type *o_ptr); extern void idle_update(void); /* melee2.c */ extern bool make_attack_spell(int m_idx); /* pathfind.c */ extern bool findpath(int y, int x); extern void run_step(int dir); /* randart.c */ extern errr do_randart(u32b randart_seed, bool full); /* score.c */ extern void enter_score(time_t *death_time); extern void show_scores(void); extern void predict_score(void); /* signals.c */ extern void signals_ignore_tstp(void); extern void signals_handle_tstp(void); extern void signals_init(void); /* store.c */ void do_cmd_store_knowledge(void); /* util.c */ extern char *find_roman_suffix_start(const char *buf); extern int roman_to_int(const char *roman); extern int int_to_roman(int n, char *roman, size_t bufsize); extern void flush(void); extern void flush_fail(void); extern struct keypress inkey(void); extern ui_event inkey_ex(void); extern void anykey(void); extern void bell(const char *reason); extern void sound(int val); extern void msg(const char *fmt, ...); extern void msgt(unsigned int type, const char *fmt, ...); extern void message_flush(void); extern void screen_save(void); extern void screen_load(void); extern void c_put_str(byte attr, const char *str, int row, int col); extern void put_str(const char *str, int row, int col); extern void c_prt(byte attr, const char *str, int row, int col); extern void prt(const char *str, int row, int col); extern void text_out_to_file(byte attr, const char *str); extern void text_out_to_screen(byte a, const char *str); extern void text_out(const char *fmt, ...); extern void text_out_c(byte a, const char *fmt, ...); extern void text_out_e(const char *fmt, ...); extern void clear_from(int row); extern bool askfor_aux_keypress(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime); extern bool askfor_aux(char *buf, size_t len, bool keypress_h(char *, size_t, size_t *, size_t *, struct keypress, bool)); extern bool get_string(const char *prompt, char *buf, size_t len); extern s16b get_quantity(const char *prompt, int max); extern char get_char(const char *prompt, const char *options, size_t len, char fallback); extern bool get_check(const char *prompt); extern bool (*get_file)(const char *suggested_name, char *path, size_t len); extern bool get_com(const char *prompt, struct keypress *command); extern bool get_com_ex(const char *prompt, ui_event *command); extern void grid_data_as_text(grid_data *g, byte *ap, char *cp, byte *tap, char *tcp); extern void pause_line(struct term *term); extern bool is_a_vowel(int ch); extern int color_char_to_attr(char c); extern int color_text_to_attr(const char *name); extern const char *attr_to_text(byte a); #ifdef SUPPORT_GAMMA extern void build_gamma_table(int gamma); extern byte gamma_table[256]; #endif /* SUPPORT_GAMMA */ /* x-char.c */ extern void xstr_trans(char *str, int encoding); extern char xchar_trans(byte c); /* xtra2.c */ bool modify_panel(term *t, int wy, int wx); bool adjust_panel(int y, int x); bool change_panel(int dir); void verify_panel(void); void center_panel(void); int motion_dir(int y1, int x1, int y2, int x2); int target_dir(struct keypress ch); bool get_rep_dir(int *aim); /* xtra3.c */ byte monster_health_attr(void); void cnv_stat(int val, char *out_val, size_t out_len); void toggle_inven_equip(void); void subwindows_set_flags(u32b *new_flags, size_t n_subwindows); char* random_hint(void); /* wiz-spoil.c */ bool make_fake_artifact(object_type *o_ptr, struct artifact *artifact); /* borg.h */ #ifdef ALLOW_BORG extern void do_cmd_borg(void); #endif /* ALLOW_BORG */ extern u16b lazymove_delay; #endif /* !INCLUDED_EXTERNS_H */ angband-v3.3.2/src/cave.c0000644000175000017500000030424511651552410014470 0ustar chriscchrisc/* * File: cave.c * Purpose: Lighting and update functions * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "game-event.h" #include "game-cmd.h" #include "monster/mon-util.h" #include "object/tvalsval.h" #include "squelch.h" #include "cmds.h" static int view_n; static u16b view_g[VIEW_MAX]; /* * Approximate distance between two points. * * When either the X or Y component dwarfs the other component, * this function is almost perfect, and otherwise, it tends to * over-estimate about one grid per fifteen grids of distance. * * Algorithm: hypot(dy,dx) = max(dy,dx) + min(dy,dx) / 2 */ int distance(int y1, int x1, int y2, int x2) { /* Find the absolute y/x distance components */ int ay = abs(y2 - y1); int ax = abs(x2 - x1); /* Approximate the distance */ return ay > ax ? ay + (ax>>1) : ax + (ay>>1); } /* * A simple, fast, integer-based line-of-sight algorithm. By Joseph Hall, * 4116 Brewster Drive, Raleigh NC 27606. Email to jnh@ecemwl.ncsu.edu. * * This function returns TRUE if a "line of sight" can be traced from the * center of the grid (x1,y1) to the center of the grid (x2,y2), with all * of the grids along this path (except for the endpoints) being non-wall * grids. Actually, the "chess knight move" situation is handled by some * special case code which allows the grid diagonally next to the player * to be obstructed, because this yields better gameplay semantics. This * algorithm is totally reflexive, except for "knight move" situations. * * Because this function uses (short) ints for all calculations, overflow * may occur if dx and dy exceed 90. * * Once all the degenerate cases are eliminated, we determine the "slope" * ("m"), and we use special "fixed point" mathematics in which we use a * special "fractional component" for one of the two location components * ("qy" or "qx"), which, along with the slope itself, are "scaled" by a * scale factor equal to "abs(dy*dx*2)" to keep the math simple. Then we * simply travel from start to finish along the longer axis, starting at * the border between the first and second tiles (where the y offset is * thus half the slope), using slope and the fractional component to see * when motion along the shorter axis is necessary. Since we assume that * vision is not blocked by "brushing" the corner of any grid, we must do * some special checks to avoid testing grids which are "brushed" but not * actually "entered". * * Angband three different "line of sight" type concepts, including this * function (which is used almost nowhere), the "project()" method (which * is used for determining the paths of projectables and spells and such), * and the "update_view()" concept (which is used to determine which grids * are "viewable" by the player, which is used for many things, such as * determining which grids are illuminated by the player's torch, and which * grids and monsters can be "seen" by the player, etc). */ bool los(int y1, int x1, int y2, int x2) { /* Delta */ int dx, dy; /* Absolute */ int ax, ay; /* Signs */ int sx, sy; /* Fractions */ int qx, qy; /* Scanners */ int tx, ty; /* Scale factors */ int f1, f2; /* Slope, or 1/Slope, of LOS */ int m; /* Extract the offset */ dy = y2 - y1; dx = x2 - x1; /* Extract the absolute offset */ ay = ABS(dy); ax = ABS(dx); /* Handle adjacent (or identical) grids */ if ((ax < 2) && (ay < 2)) return (TRUE); /* Directly South/North */ if (!dx) { /* South -- check for walls */ if (dy > 0) { for (ty = y1 + 1; ty < y2; ty++) { if (!cave_floor_bold(ty, x1)) return (FALSE); } } /* North -- check for walls */ else { for (ty = y1 - 1; ty > y2; ty--) { if (!cave_floor_bold(ty, x1)) return (FALSE); } } /* Assume los */ return (TRUE); } /* Directly East/West */ if (!dy) { /* East -- check for walls */ if (dx > 0) { for (tx = x1 + 1; tx < x2; tx++) { if (!cave_floor_bold(y1, tx)) return (FALSE); } } /* West -- check for walls */ else { for (tx = x1 - 1; tx > x2; tx--) { if (!cave_floor_bold(y1, tx)) return (FALSE); } } /* Assume los */ return (TRUE); } /* Extract some signs */ sx = (dx < 0) ? -1 : 1; sy = (dy < 0) ? -1 : 1; /* Vertical "knights" */ if (ax == 1) { if (ay == 2) { if (cave_floor_bold(y1 + sy, x1)) return (TRUE); } } /* Horizontal "knights" */ else if (ay == 1) { if (ax == 2) { if (cave_floor_bold(y1, x1 + sx)) return (TRUE); } } /* Calculate scale factor div 2 */ f2 = (ax * ay); /* Calculate scale factor */ f1 = f2 << 1; /* Travel horizontally */ if (ax >= ay) { /* Let m = dy / dx * 2 * (dy * dx) = 2 * dy * dy */ qy = ay * ay; m = qy << 1; tx = x1 + sx; /* Consider the special case where slope == 1. */ if (qy == f2) { ty = y1 + sy; qy -= f1; } else { ty = y1; } /* Note (below) the case (qy == f2), where */ /* the LOS exactly meets the corner of a tile. */ while (x2 - tx) { if (!cave_floor_bold(ty, tx)) return (FALSE); qy += m; if (qy < f2) { tx += sx; } else if (qy > f2) { ty += sy; if (!cave_floor_bold(ty, tx)) return (FALSE); qy -= f1; tx += sx; } else { ty += sy; qy -= f1; tx += sx; } } } /* Travel vertically */ else { /* Let m = dx / dy * 2 * (dx * dy) = 2 * dx * dx */ qx = ax * ax; m = qx << 1; ty = y1 + sy; if (qx == f2) { tx = x1 + sx; qx -= f1; } else { tx = x1; } /* Note (below) the case (qx == f2), where */ /* the LOS exactly meets the corner of a tile. */ while (y2 - ty) { if (!cave_floor_bold(ty, tx)) return (FALSE); qx += m; if (qx < f2) { ty += sy; } else if (qx > f2) { tx += sx; if (!cave_floor_bold(ty, tx)) return (FALSE); qx -= f1; ty += sy; } else { tx += sx; qx -= f1; ty += sy; } } } /* Assume los */ return (TRUE); } /* * Returns true if the player's grid is dark */ bool no_light(void) { return (!player_can_see_bold(p_ptr->py, p_ptr->px)); } /* * Determine if a given location may be "destroyed" * * Used by destruction spells, and for placing stairs, etc. */ bool cave_valid_bold(int y, int x) { object_type *o_ptr; /* Forbid perma-grids */ if (cave_perma_bold(y, x)) return (FALSE); /* Check objects */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Forbid artifact grids */ if (o_ptr->artifact) return (FALSE); } /* Accept */ return (TRUE); } /* * Hack -- Hallucinatory monster */ static void hallucinatory_monster(byte *a, char *c) { while (1) { /* Select a random monster */ monster_race *r_ptr = &r_info[randint0(z_info->r_max)]; /* Skip non-entries */ if (!r_ptr->name) continue; /* Retrieve attr/char */ *a = r_ptr->x_attr; *c = r_ptr->x_char; return; } } /* * Hack -- Hallucinatory object */ static void hallucinatory_object(byte *a, char *c) { while (1) { /* Select a random object */ object_kind *k_ptr = &k_info[randint0(z_info->k_max - 1) + 1]; /* Skip non-entries */ if (!k_ptr->name) continue; /* Retrieve attr/char (HACK - without flavors) */ *a = k_ptr->x_attr; *c = k_ptr->x_char; /* HACK - Skip empty entries */ if (*a == 0 || *c == 0) continue; return; } } /* * Translate text colours. * * This translates a color based on the attribute. We use this to set terrain to * be lighter or darker, make metallic monsters shimmer, highlight text under the * mouse, and reduce the colours on mono colour or 16 colour terms to the correct * colour space. * * TODO: Honour the attribute for the term (full color, mono, 16 color) but ensure * that e.g. the lighter version of yellow becomes white in a 16 color term, but * light yellow in a full colour term. */ byte get_color(byte a, int attr, int n) { /* Accept any graphical attr (high bit set) */ if (a & (0x80)) return (a); /* TODO: Honour the attribute for the term (full color, mono, 16 color) */ if (!attr) return(a); /* Translate the color N times */ while (n > 0) { a = color_table[a].color_translate[attr]; n--; } /* Return the modified color */ return (a); } /* * Checks if a square is at the (inner) edge of a trap detect area */ bool dtrap_edge(int y, int x) { /* Check if the square is a dtrap in the first place */ if (!(cave->info2[y][x] & CAVE2_DTRAP)) return FALSE; /* Check for non-dtrap adjacent grids */ if (in_bounds_fully(y + 1, x ) && (!(cave->info2[y + 1][x ] & CAVE2_DTRAP))) return TRUE; if (in_bounds_fully(y , x + 1) && (!(cave->info2[y ][x + 1] & CAVE2_DTRAP))) return TRUE; if (in_bounds_fully(y - 1, x ) && (!(cave->info2[y - 1][x ] & CAVE2_DTRAP))) return TRUE; if (in_bounds_fully(y , x - 1) && (!(cave->info2[y ][x - 1] & CAVE2_DTRAP))) return TRUE; return FALSE; } static bool feat_is_known_trap(int feat) { return feat >= FEAT_TRAP_HEAD && feat <= FEAT_TRAP_TAIL; } static bool feat_is_treasure(int feat) { return feat == FEAT_MAGMA_K || feat == FEAT_QUARTZ_K; } /** * Apply text lighting effects */ static void grid_get_text(grid_data *g, byte *a, char *c) { /* Trap detect edge, but don't colour traps themselves, or treasure */ if (g->trapborder && !feat_is_known_trap(g->f_idx) && !feat_is_treasure(g->f_idx)) { if (g->in_view) *a = TERM_L_GREEN; else *a = TERM_GREEN; } else if (g->f_idx == FEAT_FLOOR) { if (g->lighting == FEAT_LIGHTING_BRIGHT) { if (*a == TERM_WHITE) *a = TERM_YELLOW; } else if (g->lighting == FEAT_LIGHTING_DARK) { if (*a == TERM_WHITE) *a = TERM_L_DARK; } } else if (g->f_idx > FEAT_INVIS) { if (g->lighting == FEAT_LIGHTING_DARK) { if (*a == TERM_WHITE) *a = TERM_SLATE; } } } /* * This function takes a pointer to a grid info struct describing the * contents of a grid location (as obtained through the function map_info) * and fills in the character and attr pairs for display. * * ap and cp are filled with the attr/char pair for the monster, object or * floor tile that is at the "top" of the grid (monsters covering objects, * which cover floor, assuming all are present). * * tap and tcp are filled with the attr/char pair for the floor, regardless * of what is on it. This can be used by graphical displays with * transparency to place an object onto a floor tile, is desired. * * Any lighting effects are also applied to these pairs, clear monsters allow * the underlying colour or feature to show through (ATTR_CLEAR and * CHAR_CLEAR), multi-hued colour-changing (ATTR_MULTI) is applied, and so on. * Technically, the flag "CHAR_MULTI" is supposed to indicate that a monster * looks strange when examined, but this flag is currently ignored. * * NOTES: * This is called pretty frequently, whenever a grid on the map display * needs updating, so don't overcomplicate it. * * The "zero" entry in the feature/object/monster arrays are * used to provide "special" attr/char codes, with "monster zero" being * used for the player attr/char, "object zero" being used for the "pile" * attr/char, and "feature zero" being used for the "darkness" attr/char. * * TODO: * The transformations for tile colors, or brightness for the 16x16 * tiles should be handled differently. One possibility would be to * extend feature_type with attr/char definitions for the different states. * This will probably be done outside of the current text->graphics mappings * though. */ void grid_data_as_text(grid_data *g, byte *ap, char *cp, byte *tap, char *tcp) { feature_type *f_ptr = &f_info[g->f_idx]; byte a = f_ptr->x_attr[g->lighting]; char c = f_ptr->x_char[g->lighting]; /* Check for trap detection boundaries */ if (use_graphics == GRAPHICS_NONE || use_graphics == GRAPHICS_PSEUDO) grid_get_text(g, &a, &c); /* Save the terrain info for the transparency effects */ (*tap) = a; (*tcp) = c; /* If there's an object, deal with that. */ if (g->first_kind) { if (g->hallucinate) { /* Just pick a random object to display. */ hallucinatory_object(&a, &c); } else if (g->multiple_objects) { /* Get the "pile" feature instead */ a = object_kind_attr(&k_info[0]); c = object_kind_char(&k_info[0]); } else { /* Normal attr and char */ a = object_kind_attr(g->first_kind); c = object_kind_char(g->first_kind); } } /* If there's a monster */ if (g->m_idx > 0 && !is_mimicking(g->m_idx)) { if (g->hallucinate) { /* Just pick a random monster to display. */ hallucinatory_monster(&a, &c); } else { monster_type *m_ptr = cave_monster(cave, g->m_idx); monster_race *r_ptr = &r_info[m_ptr->r_idx]; byte da; char dc; /* Desired attr & char */ da = r_ptr->x_attr; dc = r_ptr->x_char; /* Special attr/char codes */ if ((da & 0x80) && (dc & 0x80)) { /* Use attr */ a = da; /* Use char */ c = dc; } /* Turn uniques purple if desired (violet, actually) */ else if (OPT(purple_uniques) && rf_has(r_ptr->flags, RF_UNIQUE)) { /* Use (light) violet attr */ a = TERM_VIOLET; /* Use char */ c = dc; } /* Multi-hued monster */ else if (rf_has(r_ptr->flags, RF_ATTR_MULTI) || rf_has(r_ptr->flags, RF_ATTR_FLICKER) || rf_has(r_ptr->flags, RF_ATTR_RAND)) { /* Multi-hued attr */ a = m_ptr->attr ? m_ptr->attr : da; /* Normal char */ c = dc; } /* Normal monster (not "clear" in any way) */ else if (!flags_test(r_ptr->flags, RF_SIZE, RF_ATTR_CLEAR, RF_CHAR_CLEAR, FLAG_END)) { /* Use attr */ a = da; /* Desired attr & char */ da = r_ptr->x_attr; dc = r_ptr->x_char; /* Use char */ c = dc; } /* Hack -- Bizarre grid under monster */ else if ((a & 0x80) || (c & 0x80)) { /* Use attr */ a = da; /* Use char */ c = dc; } /* Normal char, Clear attr, monster */ else if (!rf_has(r_ptr->flags, RF_CHAR_CLEAR)) { /* Normal char */ c = dc; } /* Normal attr, Clear char, monster */ else if (!rf_has(r_ptr->flags, RF_ATTR_CLEAR)) { /* Normal attr */ a = da; } /* Store the drawing attr so we can use it elsewhere */ m_ptr->attr = a; } } /* Handle "player" */ else if (g->is_player) { monster_race *r_ptr = &r_info[0]; /* Get the "player" attr */ a = r_ptr->x_attr; if ((OPT(hp_changes_color)) && !(a & 0x80)) { switch(p_ptr->chp * 10 / p_ptr->mhp) { case 10: case 9: { a = TERM_WHITE; break; } case 8: case 7: { a = TERM_YELLOW; break; } case 6: case 5: { a = TERM_ORANGE; break; } case 4: case 3: { a = TERM_L_RED; break; } case 2: case 1: case 0: { a = TERM_RED; break; } default: { a = TERM_WHITE; break; } } } /* Get the "player" char */ c = r_ptr->x_char; } /* Result */ (*ap) = a; (*cp) = c; } /* * This function takes a grid location (x, y) and extracts information the * player is allowed to know about it, filling in the grid_data structure * passed in 'g'. * * The information filled in is as follows: * - g->f_idx is filled in with the terrain's feature type, or FEAT_NONE * if the player doesn't know anything about the grid. The function * makes use of the "mimic" field in terrain in order to allow one * feature to look like another (hiding secret doors, invisible traps, * etc). This will return the terrain type the player "Knows" about, * not necessarily the real terrain. * - g->m_idx is set to the monster index, or 0 if there is none (or the * player doesn't know it). * - g->first_kind is set to the object_kind of the first object in a grid * that the player knows about, or NULL for no objects. * - g->muliple_objects is TRUE if there is more than one object in the * grid that the player knows and cares about (to facilitate any special * floor stack symbol that might be used). * - g->in_view is TRUE if the player can currently see the grid - this can * be used to indicate field-of-view, such as through the OPT(view_bright_light) * option. * - g->lighting is set to indicate the lighting level for the grid: * FEAT_LIGHTING_DARK for unlit grids, FEAT_LIGHTING_LIT for those lit by the player's * light source, and FEAT_LIGHTING_BRIGHT for inherently light grids (lit rooms, etc). * Note that lighting is always FEAT_LIGHTING_BRIGHT for known "interesting" grids * like walls. * - g->is_player is TRUE if the player is on the given grid. * - g->hallucinate is TRUE if the player is hallucinating something "strange" * for this grid - this should pick a random monster to show if the m_idx * is non-zero, and a random object if first_kind is non-zero. * * NOTES: * This is called pretty frequently, whenever a grid on the map display * needs updating, so don't overcomplicate it. * * Terrain is remembered separately from objects and monsters, so can be * shown even when the player can't "see" it. This leads to things like * doors out of the player's view still change from closed to open and so on. * * TODO: * Hallucination is currently disabled (it was a display-level hack before, * and we need it to be a knowledge-level hack). The idea is that objects * may turn into different objects, monsters into different monsters, and * terrain may be objects, monsters, or stay the same. */ void map_info(unsigned y, unsigned x, grid_data *g) { object_type *o_ptr; byte info; assert(x < DUNGEON_WID); assert(y < DUNGEON_HGT); info = cave->info[y][x]; /* Default "clear" values, others will be set later where appropriate. */ g->first_kind = NULL; g->multiple_objects = FALSE; g->lighting = FEAT_LIGHTING_DARK; g->f_idx = cave->feat[y][x]; if (f_info[g->f_idx].mimic) g->f_idx = f_info[g->f_idx].mimic; g->in_view = (info & CAVE_SEEN) ? TRUE : FALSE; g->is_player = (cave->m_idx[y][x] < 0) ? TRUE : FALSE; g->m_idx = (g->is_player) ? 0 : cave->m_idx[y][x]; g->hallucinate = p_ptr->timed[TMD_IMAGE] ? TRUE : FALSE; g->trapborder = (dtrap_edge(y, x)) ? TRUE : FALSE; if (g->in_view) { g->lighting = FEAT_LIGHTING_LIT; if (!(info & CAVE_GLOW) && OPT(view_yellow_light)) g->lighting = FEAT_LIGHTING_BRIGHT; } else if (!(info & CAVE_MARK)) { g->f_idx = FEAT_NONE; } /* Objects */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Memorized objects */ if (o_ptr->marked && !squelch_item_ok(o_ptr)) { /* First item found */ if (!g->first_kind) { g->first_kind = o_ptr->kind; } else { g->multiple_objects = TRUE; /* And we know all we need to know. */ break; } } } /* Monsters */ if (g->m_idx > 0) { /* If the monster isn't "visible", make sure we don't list it.*/ monster_type *m_ptr = cave_monster(cave, g->m_idx); if (!m_ptr->ml) g->m_idx = 0; } /* Rare random hallucination on non-outer walls */ if (g->hallucinate && g->m_idx == 0 && g->first_kind == 0) { if (one_in_(128) && g->f_idx < FEAT_PERM_SOLID) g->m_idx = 1; else if (one_in_(128) && g->f_idx < FEAT_PERM_SOLID) /* if hallucinating, we just need first_kind to not be NULL */ g->first_kind = k_info; else g->hallucinate = FALSE; } assert(g->f_idx <= FEAT_PERM_SOLID); if (!g->hallucinate) assert((int)g->m_idx < cave->mon_max); /* All other g fields are 'flags', mostly booleans. */ } /* * Move the cursor to a given map location. */ static void move_cursor_relative_map(int y, int x) { int ky, kx; term *old; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if (!(op_ptr->window_flag[j] & (PW_MAP))) continue; /* Location relative to panel */ ky = y - t->offset_y; if (tile_height > 1) { ky = tile_height * ky; } /* Verify location */ if ((ky < 0) || (ky >= t->hgt)) continue; /* Location relative to panel */ kx = x - t->offset_x; if (tile_width > 1) { kx = tile_width * kx; } /* Verify location */ if ((kx < 0) || (kx >= t->wid)) continue; /* Go there */ old = Term; Term_activate(t); (void)Term_gotoxy(kx, ky); Term_activate(old); } } /* * Move the cursor to a given map location. * * The main screen will always be at least 24x80 in size. */ void move_cursor_relative(int y, int x) { int ky, kx; int vy, vx; /* Move the cursor on map sub-windows */ move_cursor_relative_map(y, x); /* Location relative to panel */ ky = y - Term->offset_y; /* Verify location */ if ((ky < 0) || (ky >= SCREEN_HGT)) return; /* Location relative to panel */ kx = x - Term->offset_x; /* Verify location */ if ((kx < 0) || (kx >= SCREEN_WID)) return; /* Location in window */ vy = ky + ROW_MAP; /* Location in window */ vx = kx + COL_MAP; if (tile_width > 1) { vx += (tile_width - 1) * kx; } if (tile_height > 1) { vy += (tile_height - 1) * ky; } /* Go there */ (void)Term_gotoxy(vx, vy); } /* * Display an attr/char pair at the given map location * * Note the inline use of "panel_contains()" for efficiency. * * Note the use of "Term_queue_char()" for efficiency. */ static void print_rel_map(char c, byte a, int y, int x) { int ky, kx; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if (!(op_ptr->window_flag[j] & (PW_MAP))) continue; /* Location relative to panel */ ky = y - t->offset_y; if (tile_height > 1) { ky = tile_height * ky; if (ky + 1 >= t->hgt) continue; } /* Verify location */ if ((ky < 0) || (ky >= t->hgt)) continue; /* Location relative to panel */ kx = x - t->offset_x; if (tile_width > 1) { kx = tile_width * kx; if (kx + 1 >= t->wid) continue; } /* Verify location */ if ((kx < 0) || (kx >= t->wid)) continue; /* Hack -- Queue it */ Term_queue_char(t, kx, ky, a, c, 0, 0); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(Term, kx, ky, a, c, 0, 0); } } /* * Display an attr/char pair at the given map location * * Note the inline use of "panel_contains()" for efficiency. * * Note the use of "Term_queue_char()" for efficiency. * * The main screen will always be at least 24x80 in size. */ void print_rel(char c, byte a, int y, int x) { int ky, kx; int vy, vx; /* Print on map sub-windows */ print_rel_map(c, a, y, x); /* Location relative to panel */ ky = y - Term->offset_y; /* Verify location */ if ((ky < 0) || (ky >= SCREEN_HGT)) return; /* Location relative to panel */ kx = x - Term->offset_x; /* Verify location */ if ((kx < 0) || (kx >= SCREEN_WID)) return; /* Get right position */ vx = COL_MAP + (tile_width * kx); vy = ROW_MAP + (tile_height * ky); /* Hack -- Queue it */ Term_queue_char(Term, vx, vy, a, c, 0, 0); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(Term, vx, vy, a, c, 0, 0); } /* * Memorize interesting viewable object/features in the given grid * * This function should only be called on "legal" grids. * * This function will memorize the object and/or feature in the given grid, * if they are (1) see-able and (2) interesting. Note that all objects are * interesting, all terrain features except floors (and invisible traps) are * interesting, and floors (and invisible traps) are interesting sometimes * (depending on various options involving the illumination of floor grids). * * The automatic memorization of all objects and non-floor terrain features * as soon as they are displayed allows incredible amounts of optimization * in various places, especially "map_info()" and this function itself. * * Note that the memorization of objects is completely separate from the * memorization of terrain features, preventing annoying floor memorization * when a detected object is picked up from a dark floor, and object * memorization when an object is dropped into a floor grid which is * memorized but out-of-sight. * * This function should be called every time the "memorization" of a grid * (or the object in a grid) is called into question, such as when an object * is created in a grid, when a terrain feature "changes" from "floor" to * "non-floor", and when any grid becomes "see-able" for any reason. * * This function is called primarily from the "update_view()" function, for * each grid which becomes newly "see-able". */ void cave_note_spot(struct cave *c, int y, int x) { object_type *o_ptr; /* Require "seen" flag */ if (!(c->info[y][x] & CAVE_SEEN)) return; for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) o_ptr->marked = TRUE; if (c->info[y][x] & CAVE_MARK) return; /* Memorize this grid */ cave->info[y][x] |= (CAVE_MARK); } /* * Redraw (on the screen) a given map location * * This function should only be called on "legal" grids. */ void cave_light_spot(struct cave *c, int y, int x) { event_signal_point(EVENT_MAP, x, y); } static void prt_map_aux(void) { byte a; char c; byte ta; char tc; grid_data g; int y, x; int vy, vx; int ty, tx; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if (!(op_ptr->window_flag[j] & (PW_MAP))) continue; /* Assume screen */ ty = t->offset_y + (t->hgt / tile_height); tx = t->offset_x + (t->wid / tile_width); /* Dump the map */ for (y = t->offset_y, vy = 0; y < ty; vy++, y++) { if (vy + tile_height - 1 >= t->hgt) continue; for (x = t->offset_x, vx = 0; x < tx; vx++, x++) { /* Check bounds */ if (!in_bounds(y, x)) continue; if (vx + tile_width - 1 >= t->wid) continue; /* Determine what is there */ map_info(y, x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); Term_queue_char(t, vx, vy, a, c, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(t, vx, vy, 255, -1, 0, 0); } } } } /* * Redraw (on the screen) the current map panel * * Note the inline use of "light_spot()" for efficiency. * * The main screen will always be at least 24x80 in size. */ void prt_map(void) { byte a; char c; byte ta; char tc; grid_data g; int y, x; int vy, vx; int ty, tx; /* Redraw map sub-windows */ prt_map_aux(); /* Assume screen */ ty = Term->offset_y + SCREEN_HGT; tx = Term->offset_x + SCREEN_WID; /* Dump the map */ for (y = Term->offset_y, vy = ROW_MAP; y < ty; vy++, y++) { for (x = Term->offset_x, vx = COL_MAP; x < tx; vx++, x++) { /* Check bounds */ if (!in_bounds(y, x)) continue; /* Determine what is there */ map_info(y, x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); /* Hack -- Queue it */ Term_queue_char(Term, vx, vy, a, c, ta, tc); if ((tile_width > 1) || (tile_height > 1)) { Term_big_queue_char(Term, vx, vy, a, c, TERM_WHITE, ' '); if (tile_width > 1) { vx += tile_width - 1; } } } if (tile_height > 1) vy += tile_height - 1; } } /* * Display a "small-scale" map of the dungeon in the active Term. * * Note that this function must "disable" the special lighting effects so * that the "priority" function will work. * * Note the use of a specialized "priority" function to allow this function * to work with any graphic attr/char mappings, and the attempts to optimize * this function where possible. * * If "cy" and "cx" are not NULL, then returns the screen location at which * the player was displayed, so the cursor can be moved to that location, * and restricts the horizontal map size to SCREEN_WID. Otherwise, nothing * is returned (obviously), and no restrictions are enforced. */ void display_map(int *cy, int *cx) { int py = p_ptr->py; int px = p_ptr->px; int map_hgt, map_wid; int dungeon_hgt, dungeon_wid; int row, col; int x, y; grid_data g; byte ta; char tc; byte tp; /* Large array on the stack */ byte mp[DUNGEON_HGT][DUNGEON_WID]; monster_race *r_ptr = &r_info[0]; /* Desired map height */ map_hgt = Term->hgt - 2; map_wid = Term->wid - 2; dungeon_hgt = (p_ptr->depth == 0) ? TOWN_HGT : DUNGEON_HGT; dungeon_wid = (p_ptr->depth == 0) ? TOWN_WID : DUNGEON_WID; /* Prevent accidents */ if (map_hgt > dungeon_hgt) map_hgt = dungeon_hgt; if (map_wid > dungeon_wid) map_wid = dungeon_wid; /* Prevent accidents */ if ((map_wid < 1) || (map_hgt < 1)) return; /* Nothing here */ ta = TERM_WHITE; tc = ' '; /* Clear the priorities */ for (y = 0; y < map_hgt; ++y) { for (x = 0; x < map_wid; ++x) { /* No priority */ mp[y][x] = 0; } } /* Draw a box around the edge of the term */ window_make(0, 0, map_wid + 1, map_hgt + 1); /* Analyze the actual map */ for (y = 0; y < dungeon_hgt; y++) { for (x = 0; x < dungeon_wid; x++) { row = (y * map_hgt / dungeon_hgt); col = (x * map_wid / dungeon_wid); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the attr/char at that map location */ map_info(y, x, &g); /* Get the priority of that attr/char */ tp = f_info[g.f_idx].priority; /* Save "best" */ if (mp[row][col] < tp) { /* Hack - make every grid on the map lit */ g.lighting = FEAT_LIGHTING_BRIGHT; grid_data_as_text(&g, &ta, &tc, &ta, &tc); /* Add the character */ Term_putch(col + 1, row + 1, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col + 1, row + 1, ta, tc); /* Save priority */ mp[row][col] = tp; } } } /*** Display the player ***/ /* Player location */ row = (py * map_hgt / dungeon_hgt); col = (px * map_wid / dungeon_wid); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the "player" tile */ ta = r_ptr->x_attr; tc = r_ptr->x_char; /* Draw the player */ Term_putch(col + 1, row + 1, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col + 1, row + 1, ta, tc); /* Return player location */ if (cy != NULL) (*cy) = row + 1; if (cx != NULL) (*cx) = col + 1; } /* * Display a "small-scale" map of the dungeon. * * Note that the "player" is always displayed on the map. */ void do_cmd_view_map(void) { int cy, cx; const char *prompt = "Hit any key to continue"; /* Save screen */ screen_save(); /* Note */ prt("Please wait...", 0, 0); /* Flush */ Term_fresh(); /* Clear the screen */ Term_clear(); /* Display the map */ display_map(&cy, &cx); /* Show the prompt */ put_str(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Highlight the player */ Term_gotoxy(cx, cy); /* Get any key */ (void)anykey(); /* Load screen */ screen_load(); } /* * Some comments on the dungeon related data structures and functions... * * Angband is primarily a dungeon exploration game, and it should come as * no surprise that the internal representation of the dungeon has evolved * over time in much the same way as the game itself, to provide semantic * changes to the game itself, to make the code simpler to understand, and * to make the executable itself faster or more efficient in various ways. * * There are a variety of dungeon related data structures, and associated * functions, which store information about the dungeon, and provide methods * by which this information can be accessed or modified. * * Some of this information applies to the dungeon as a whole, such as the * list of unique monsters which are still alive. Some of this information * only applies to the current dungeon level, such as the current depth, or * the list of monsters currently inhabiting the level. And some of the * information only applies to a single grid of the current dungeon level, * such as whether the grid is illuminated, or whether the grid contains a * monster, or whether the grid can be seen by the player. If Angband was * to be turned into a multi-player game, some of the information currently * associated with the dungeon should really be associated with the player, * such as whether a given grid is viewable by a given player. * * One of the major bottlenecks in ancient versions of Angband was in the * calculation of "line of sight" from the player to various grids, such * as those containing monsters, using the relatively expensive "los()" * function. This was such a nasty bottleneck that a lot of silly things * were done to reduce the dependancy on "line of sight", for example, you * could not "see" any grids in a lit room until you actually entered the * room, at which point every grid in the room became "illuminated" and * all of the grids in the room were "memorized" forever. Other major * bottlenecks involved the determination of whether a grid was lit by the * player's torch, and whether a grid blocked the player's line of sight. * These bottlenecks led to the development of special new functions to * optimize issues involved with "line of sight" and "torch lit grids". * These optimizations led to entirely new additions to the game, such as * the ability to display the player's entire field of view using different * colors than were used for the "memorized" portions of the dungeon, and * the ability to memorize dark floor grids, but to indicate by the way in * which they are displayed that they are not actually illuminated. And * of course many of them simply made the game itself faster or more fun. * Also, over time, the definition of "line of sight" has been relaxed to * allow the player to see a wider "field of view", which is slightly more * realistic, and only slightly more expensive to maintain. * * Currently, a lot of the information about the dungeon is stored in ways * that make it very efficient to access or modify the information, while * still attempting to be relatively conservative about memory usage, even * if this means that some information is stored in multiple places, or in * ways which require the use of special code idioms. For example, each * monster record in the monster array contains the location of the monster, * and each cave grid has an index into the monster array, or a zero if no * monster is in the grid. This allows the monster code to efficiently see * where the monster is located, while allowing the dungeon code to quickly * determine not only if a monster is present in a given grid, but also to * find out which monster. The extra space used to store the information * twice is inconsequential compared to the speed increase. * * Some of the information about the dungeon is used by functions which can * constitute the "critical efficiency path" of the game itself, and so the * way in which they are stored and accessed has been optimized in order to * optimize the game itself. For example, the "update_view()" function was * originally created to speed up the game itself (when the player was not * running), but then it took on extra responsibility as the provider of the * new "special effects lighting code", and became one of the most important * bottlenecks when the player was running. So many rounds of optimization * were performed on both the function itself, and the data structures which * it uses, resulting eventually in a function which not only made the game * faster than before, but which was responsible for even more calculations * (including the determination of which grids are "viewable" by the player, * which grids are illuminated by the player's torch, and which grids can be * "seen" in some way by the player), as well as for providing the guts of * the special effects lighting code, and for the efficient redisplay of any * grids whose visual representation may have changed. * * Several pieces of information about each cave grid are stored in various * two dimensional arrays, with one unit of information for each grid in the * dungeon. Some of these arrays have been intentionally expanded by a small * factor to make the two dimensional array accesses faster by allowing the * use of shifting instead of multiplication. * * Several pieces of information about each cave grid are stored in the * "cave->info" array, which is a special two dimensional array of bytes, * one for each cave grid, each containing eight separate "flags" which * describe some property of the cave grid. These flags can be checked and * modified extremely quickly, especially when special idioms are used to * force the compiler to keep a local register pointing to the base of the * array. Special location offset macros can be used to minimize the number * of computations which must be performed at runtime. Note that using a * byte for each flag set may be slightly more efficient than using a larger * unit, so if another flag (or two) is needed later, and it must be fast, * then the two existing flags which do not have to be fast should be moved * out into some other data structure and the new flags should take their * place. This may require a few minor changes in the savefile code. * * The "CAVE_ROOM" flag is saved in the savefile and is used to determine * which grids are part of "rooms", and thus which grids are affected by * "illumination" spells. This flag does not have to be very fast. * * The "CAVE_ICKY" flag is saved in the savefile and is used to determine * which grids are part of "vaults", and thus which grids cannot serve as * the destinations of player teleportation. This flag does not have to * be very fast. * * The "CAVE_MARK" flag is saved in the savefile and is used to determine * which grids have been "memorized" by the player. This flag is used by * the "map_info()" function to determine if a grid should be displayed. * This flag is used in a few other places to determine if the player can * "know" about a given grid. This flag must be very fast. * * The "CAVE_GLOW" flag is saved in the savefile and is used to determine * which grids are "permanently illuminated". This flag is used by the * "update_view()" function to help determine which viewable flags may * be "seen" by the player. This flag is used by the "map_info" function * to determine if a grid is only lit by the player's torch. This flag * has special semantics for wall grids (see "update_view()"). This flag * must be very fast. * * The "CAVE_WALL" flag is used to determine which grids block the player's * line of sight. This flag is used by the "update_view()" function to * determine which grids block line of sight, and to help determine which * grids can be "seen" by the player. This flag must be very fast. * * The "CAVE_VIEW" flag is used to determine which grids are currently in * line of sight of the player. This flag is set by (and used by) the * "update_view()" function. This flag is used by any code which needs to * know if the player can "view" a given grid. This flag is used by the * "map_info()" function for some optional special lighting effects. The * "player_has_los_bold()" macro wraps an abstraction around this flag, but * certain code idioms are much more efficient. This flag is used to check * if a modification to a terrain feature might affect the player's field of * view. This flag is used to see if certain monsters are "visible" to the * player. This flag is used to allow any monster in the player's field of * view to "sense" the presence of the player. This flag must be very fast. * * The "CAVE_SEEN" flag is used to determine which grids are currently in * line of sight of the player and also illuminated in some way. This flag * is set by the "update_view()" function, using computations based on the * "CAVE_VIEW" and "CAVE_WALL" and "CAVE_GLOW" flags of various grids. This * flag is used by any code which needs to know if the player can "see" a * given grid. This flag is used by the "map_info()" function both to see * if a given "boring" grid can be seen by the player, and for some optional * special lighting effects. The "player_can_see_bold()" macro wraps an * abstraction around this flag, but certain code idioms are much more * efficient. This flag is used to see if certain monsters are "visible" to * the player. This flag is never set for a grid unless "CAVE_VIEW" is also * set for the grid. Whenever the "CAVE_WALL" or "CAVE_GLOW" flag changes * for a grid which has the "CAVE_VIEW" flag set, the "CAVE_SEEN" flag must * be recalculated. The simplest way to do this is to call "forget_view()" * and "update_view()" whenever the "CAVE_WALL" or "CAVE_GLOW" flags change * for a grid which has "CAVE_VIEW" set. This flag must be very fast. * * The "CAVE_TEMP" flag is used for a variety of temporary purposes. This * flag is used to determine if the "CAVE_SEEN" flag for a grid has changed * during the "update_view()" function. This flag is used to "spread" light * or darkness through a room. This flag is used by the "monster flow code". * This flag must always be cleared by any code which sets it, often, this * can be optimized by the use of the special "temp_g" array. This flag must * be very fast. * * Note that the "CAVE_MARK" flag is used for many reasons, some of which * are strictly for optimization purposes. The "CAVE_MARK" flag means that * even if the player cannot "see" the grid, he "knows" about the terrain in * that grid. This is used to "memorize" grids when they are first "seen" by * the player, and to allow certain grids to be "detected" by certain magic. * Note that most grids are always memorized when they are first "seen", but * "boring" grids (floor grids) are only memorized if the "OPT(view_torch_grids)" * option is set, or if the "OPT(view_perma_grids)" option is set, and the grid * in question has the "CAVE_GLOW" flag set. * * Objects are "memorized" in a different way, using a special "marked" flag * on the object itself, which is set when an object is observed or detected. * This allows objects to be "memorized" independant of the terrain features. * * The "update_view()" function is an extremely important function. It is * called only when the player moves, significant terrain changes, or the * player's blindness or torch radius changes. Note that when the player * is resting, or performing any repeated actions (like digging, disarming, * farming, etc), there is no need to call the "update_view()" function, so * even if it was not very efficient, this would really only matter when the * player was "running" through the dungeon. It sets the "CAVE_VIEW" flag * on every cave grid in the player's field of view, and maintains an array * of all such grids in the global "view_g" array. It also checks the torch * radius of the player, and sets the "CAVE_SEEN" flag for every grid which * is in the "field of view" of the player and which is also "illuminated", * either by the players torch (if any) or by any permanent light source. * It could use and help maintain information about multiple light sources, * which would be helpful in a multi-player version of Angband. * * The "update_view()" function maintains the special "view_g" array, which * contains exactly those grids which have the "CAVE_VIEW" flag set. This * array is used by "update_view()" to (only) memorize grids which become * newly "seen", and to (only) redraw grids whose "seen" value changes, which * allows the use of some interesting (and very efficient) "special lighting * effects". In addition, this array could be used elsewhere to quickly scan * through all the grids which are in the player's field of view. * * Note that the "update_view()" function allows, among other things, a room * to be "partially" seen as the player approaches it, with a growing cone * of floor appearing as the player gets closer to the door. Also, by not * turning on the "memorize perma-lit grids" option, the player will only * "see" those floor grids which are actually in line of sight. And best * of all, you can now activate the special lighting effects to indicate * which grids are actually in the player's field of view by using dimmer * colors for grids which are not in the player's field of view, and/or to * indicate which grids are illuminated only by the player's torch by using * the color yellow for those grids. * * The old "update_view()" algorithm uses the special "CAVE_EASY" flag as a * temporary internal flag to mark those grids which are not only in view, * but which are also "easily" in line of sight of the player. This flag * is actually just the "CAVE_SEEN" flag, and the "update_view()" function * makes sure to clear it for all old "CAVE_SEEN" grids, and then use it in * the algorithm as "CAVE_EASY", and then clear it for all "CAVE_EASY" grids, * and then reset it as appropriate for all new "CAVE_SEEN" grids. This is * kind of messy, but it works. The old algorithm may disappear eventually. * * The new "update_view()" algorithm uses a faster and more mathematically * correct algorithm, assisted by a large machine generated static array, to * determine the "CAVE_VIEW" and "CAVE_SEEN" flags simultaneously. See below. * * It seems as though slight modifications to the "update_view()" functions * would allow us to determine "reverse" line-of-sight as well as "normal" * line-of-sight", which would allow monsters to have a more "correct" way * to determine if they can "see" the player, since right now, they "cheat" * somewhat and assume that if the player has "line of sight" to them, then * they can "pretend" that they have "line of sight" to the player. But if * such a change was attempted, the monsters would actually start to exhibit * some undesirable behavior, such as "freezing" near the entrances to long * hallways containing the player, and code would have to be added to make * the monsters move around even if the player was not detectable, and to * "remember" where the player was last seen, to avoid looking stupid. * * Note that the "CAVE_GLOW" flag means that a grid is permanently lit in * some way. However, for the player to "see" the grid, as determined by * the "CAVE_SEEN" flag, the player must not be blind, the grid must have * the "CAVE_VIEW" flag set, and if the grid is a "wall" grid, and it is * not lit by the player's torch, then it must touch a grid which does not * have the "CAVE_WALL" flag set, but which does have both the "CAVE_GLOW" * and "CAVE_VIEW" flags set. This last part about wall grids is induced * by the semantics of "CAVE_GLOW" as applied to wall grids, and checking * the technical requirements can be very expensive, especially since the * grid may be touching some "illegal" grids. Luckily, it is more or less * correct to restrict the "touching" grids from the eight "possible" grids * to the (at most) three grids which are touching the grid, and which are * closer to the player than the grid itself, which eliminates more than * half of the work, including all of the potentially "illegal" grids, if * at most one of the three grids is a "diagonal" grid. In addition, in * almost every situation, it is possible to ignore the "CAVE_VIEW" flag * on these three "touching" grids, for a variety of technical reasons. * Finally, note that in most situations, it is only necessary to check * a single "touching" grid, in fact, the grid which is strictly closest * to the player of all the touching grids, and in fact, it is normally * only necessary to check the "CAVE_GLOW" flag of that grid, again, for * various technical reasons. However, one of the situations which does * not work with this last reduction is the very common one in which the * player approaches an illuminated room from a dark hallway, in which the * two wall grids which form the "entrance" to the room would not be marked * as "CAVE_SEEN", since of the three "touching" grids nearer to the player * than each wall grid, only the farthest of these grids is itself marked * "CAVE_GLOW". * * * Here are some pictures of the legal "light source" radius values, in * which the numbers indicate the "order" in which the grids could have * been calculated, if desired. Note that the code will work with larger * radiuses, though currently yields such a radius, and the game would * become slower in some situations if it did. * * Rad=0 Rad=1 Rad=2 Rad=3 * No-Light Torch,etc Lantern Artifacts * * 333 * 333 43334 * 212 32123 3321233 * @ 1@1 31@13 331@133 * 212 32123 3321233 * 333 43334 * 333 * * * Here is an illustration of the two different "update_view()" algorithms, * in which the grids marked "%" are pillars, and the grids marked "?" are * not in line of sight of the player. * * * Sample situation * * ##################### * ############.%.%.%.%# * #...@..#####........# * #............%.%.%.%# * #......#####........# * ############........# * ##################### * * * New Algorithm Old Algorithm * * ########????????????? ########????????????? * #...@..#????????????? #...@..#????????????? * #...........????????? #.........??????????? * #......#####.....???? #......####?????????? * ########?????????...# ########????????????? * * ########????????????? ########????????????? * #.@....#????????????? #.@....#????????????? * #............%??????? #...........????????? * #......#####........? #......#####????????? * ########??????????..# ########????????????? * * ########????????????? ########?????%??????? * #......#####........# #......#####..??????? * #.@..........%??????? #.@..........%??????? * #......#####........# #......#####..??????? * ########????????????? ########????????????? * * ########??????????..# ########????????????? * #......#####........? #......#####????????? * #............%??????? #...........????????? * #.@....#????????????? #.@....#????????????? * ########????????????? ########????????????? * * ########?????????%??? ########????????????? * #......#####.....???? #......####?????????? * #...........????????? #.........??????????? * #...@..#????????????? #...@..#????????????? * ########????????????? ########????????????? */ /* * Maximum number of grids in a single octant */ #define VINFO_MAX_GRIDS 161 /* * Maximum number of slopes in a single octant */ #define VINFO_MAX_SLOPES 126 /* * Mask of bits used in a single octant */ #define VINFO_BITS_3 0x3FFFFFFF #define VINFO_BITS_2 0xFFFFFFFF #define VINFO_BITS_1 0xFFFFFFFF #define VINFO_BITS_0 0xFFFFFFFF /* * Forward declare */ typedef struct vinfo_type vinfo_type; /* * The 'vinfo_type' structure */ struct vinfo_type { s16b grid[8]; u32b bits_3; u32b bits_2; u32b bits_1; u32b bits_0; vinfo_type *next_0; vinfo_type *next_1; byte y; byte x; byte d; byte r; }; /* * The array of "vinfo" objects, initialized by "vinfo_init()" */ static vinfo_type vinfo[VINFO_MAX_GRIDS]; /* * Slope scale factor */ #define SCALE 100000L /* * The actual slopes (for reference) */ /* Bit : Slope Grids */ /* --- : ----- ----- */ /* 0 : 2439 21 */ /* 1 : 2564 21 */ /* 2 : 2702 21 */ /* 3 : 2857 21 */ /* 4 : 3030 21 */ /* 5 : 3225 21 */ /* 6 : 3448 21 */ /* 7 : 3703 21 */ /* 8 : 4000 21 */ /* 9 : 4347 21 */ /* 10 : 4761 21 */ /* 11 : 5263 21 */ /* 12 : 5882 21 */ /* 13 : 6666 21 */ /* 14 : 7317 22 */ /* 15 : 7692 20 */ /* 16 : 8108 21 */ /* 17 : 8571 21 */ /* 18 : 9090 20 */ /* 19 : 9677 21 */ /* 20 : 10344 21 */ /* 21 : 11111 20 */ /* 22 : 12000 21 */ /* 23 : 12820 22 */ /* 24 : 13043 22 */ /* 25 : 13513 22 */ /* 26 : 14285 20 */ /* 27 : 15151 22 */ /* 28 : 15789 22 */ /* 29 : 16129 22 */ /* 30 : 17241 22 */ /* 31 : 17647 22 */ /* 32 : 17948 23 */ /* 33 : 18518 22 */ /* 34 : 18918 22 */ /* 35 : 20000 19 */ /* 36 : 21212 22 */ /* 37 : 21739 22 */ /* 38 : 22580 22 */ /* 39 : 23076 22 */ /* 40 : 23809 22 */ /* 41 : 24137 22 */ /* 42 : 24324 23 */ /* 43 : 25714 23 */ /* 44 : 25925 23 */ /* 45 : 26315 23 */ /* 46 : 27272 22 */ /* 47 : 28000 23 */ /* 48 : 29032 23 */ /* 49 : 29411 23 */ /* 50 : 29729 24 */ /* 51 : 30434 23 */ /* 52 : 31034 23 */ /* 53 : 31428 23 */ /* 54 : 33333 18 */ /* 55 : 35483 23 */ /* 56 : 36000 23 */ /* 57 : 36842 23 */ /* 58 : 37142 24 */ /* 59 : 37931 24 */ /* 60 : 38461 24 */ /* 61 : 39130 24 */ /* 62 : 39393 24 */ /* 63 : 40740 24 */ /* 64 : 41176 24 */ /* 65 : 41935 24 */ /* 66 : 42857 23 */ /* 67 : 44000 24 */ /* 68 : 44827 24 */ /* 69 : 45454 23 */ /* 70 : 46666 24 */ /* 71 : 47368 24 */ /* 72 : 47826 24 */ /* 73 : 48148 24 */ /* 74 : 48387 24 */ /* 75 : 51515 25 */ /* 76 : 51724 25 */ /* 77 : 52000 25 */ /* 78 : 52380 25 */ /* 79 : 52941 25 */ /* 80 : 53846 25 */ /* 81 : 54838 25 */ /* 82 : 55555 24 */ /* 83 : 56521 25 */ /* 84 : 57575 26 */ /* 85 : 57894 25 */ /* 86 : 58620 25 */ /* 87 : 60000 23 */ /* 88 : 61290 25 */ /* 89 : 61904 25 */ /* 90 : 62962 25 */ /* 91 : 63636 25 */ /* 92 : 64705 25 */ /* 93 : 65217 25 */ /* 94 : 65517 25 */ /* 95 : 67741 26 */ /* 96 : 68000 26 */ /* 97 : 68421 26 */ /* 98 : 69230 26 */ /* 99 : 70370 26 */ /* 100 : 71428 25 */ /* 101 : 72413 26 */ /* 102 : 73333 26 */ /* 103 : 73913 26 */ /* 104 : 74193 27 */ /* 105 : 76000 26 */ /* 106 : 76470 26 */ /* 107 : 77777 25 */ /* 108 : 78947 26 */ /* 109 : 79310 26 */ /* 110 : 80952 26 */ /* 111 : 81818 26 */ /* 112 : 82608 26 */ /* 113 : 84000 26 */ /* 114 : 84615 26 */ /* 115 : 85185 26 */ /* 116 : 86206 27 */ /* 117 : 86666 27 */ /* 118 : 88235 27 */ /* 119 : 89473 27 */ /* 120 : 90476 27 */ /* 121 : 91304 27 */ /* 122 : 92000 27 */ /* 123 : 92592 27 */ /* 124 : 93103 28 */ /* 125 : 100000 13 */ /* * Forward declare */ typedef struct vinfo_hack vinfo_hack; /* * Temporary data used by "vinfo_init()" * * - Number of grids * * - Number of slopes * * - Slope values * * - Slope range per grid */ struct vinfo_hack { int num_slopes; long slopes[VINFO_MAX_SLOPES]; long slopes_min[MAX_SIGHT+1][MAX_SIGHT+1]; long slopes_max[MAX_SIGHT+1][MAX_SIGHT+1]; }; static int cmp_longs(const void *a, const void *b) { long x = *(const long *)a; long y = *(const long *)b; if (x < y) return -1; if (x > y) return 1; return 0; } /* * Save a slope */ static void vinfo_init_aux(vinfo_hack *hack, int y, int x, long m) { int i; /* Handle "legal" slopes */ if ((m > 0) && (m <= SCALE)) { /* Look for that slope */ for (i = 0; i < hack->num_slopes; i++) { if (hack->slopes[i] == m) break; } /* New slope */ if (i == hack->num_slopes) { /* Paranoia */ if (hack->num_slopes >= VINFO_MAX_SLOPES) { quit_fmt("Too many slopes (%d)!", VINFO_MAX_SLOPES); } /* Save the slope, and advance */ hack->slopes[hack->num_slopes++] = m; } } /* Track slope range */ if (hack->slopes_min[y][x] > m) hack->slopes_min[y][x] = m; if (hack->slopes_max[y][x] < m) hack->slopes_max[y][x] = m; } /* * Initialize the "vinfo" array * * Full Octagon (radius 20), Grids=1149 * * Quadrant (south east), Grids=308, Slopes=251 * * Octant (east then south), Grids=161, Slopes=126 * * This function assumes that VINFO_MAX_GRIDS and VINFO_MAX_SLOPES * have the correct values, which can be derived by setting them to * a number which is too high, running this function, and using the * error messages to obtain the correct values. */ errr vinfo_init(void) { int i, g; int y, x; long m; vinfo_hack *hack; int num_grids = 0; int queue_head = 0; int queue_tail = 0; vinfo_type *queue[VINFO_MAX_GRIDS*2]; /* Make hack */ hack = ZNEW(vinfo_hack); /* Analyze grids */ for (y = 0; y <= MAX_SIGHT; ++y) { for (x = y; x <= MAX_SIGHT; ++x) { /* Skip grids which are out of sight range */ if (distance(0, 0, y, x) > MAX_SIGHT) continue; /* Default slope range */ hack->slopes_min[y][x] = 999999999; hack->slopes_max[y][x] = 0; /* Paranoia */ if (num_grids >= VINFO_MAX_GRIDS) { quit_fmt("Too many grids (%d >= %d)!", num_grids, VINFO_MAX_GRIDS); } /* Count grids */ num_grids++; /* Slope to the top right corner */ m = SCALE * (1000L * y - 500) / (1000L * x + 500); /* Handle "legal" slopes */ vinfo_init_aux(hack, y, x, m); /* Slope to top left corner */ m = SCALE * (1000L * y - 500) / (1000L * x - 500); /* Handle "legal" slopes */ vinfo_init_aux(hack, y, x, m); /* Slope to bottom right corner */ m = SCALE * (1000L * y + 500) / (1000L * x + 500); /* Handle "legal" slopes */ vinfo_init_aux(hack, y, x, m); /* Slope to bottom left corner */ m = SCALE * (1000L * y + 500) / (1000L * x - 500); /* Handle "legal" slopes */ vinfo_init_aux(hack, y, x, m); } } /* Enforce maximal efficiency */ if (num_grids < VINFO_MAX_GRIDS) { quit_fmt("Too few grids (%d < %d)!", num_grids, VINFO_MAX_GRIDS); } /* Enforce maximal efficiency */ if (hack->num_slopes < VINFO_MAX_SLOPES) { quit_fmt("Too few slopes (%d < %d)!", hack->num_slopes, VINFO_MAX_SLOPES); } sort(hack->slopes, hack->num_slopes, sizeof(*hack->slopes), cmp_longs); /* Enqueue player grid */ queue[queue_tail++] = &vinfo[0]; /* Process queue */ while (queue_head < queue_tail) { int e; /* Index */ e = queue_head++; /* Main Grid */ g = vinfo[e].grid[0]; /* Location */ y = GRID_Y(g); x = GRID_X(g); /* Compute grid offsets */ vinfo[e].grid[0] = GRID(+y,+x); vinfo[e].grid[1] = GRID(+x,+y); vinfo[e].grid[2] = GRID(+x,-y); vinfo[e].grid[3] = GRID(+y,-x); vinfo[e].grid[4] = GRID(-y,-x); vinfo[e].grid[5] = GRID(-x,-y); vinfo[e].grid[6] = GRID(-x,+y); vinfo[e].grid[7] = GRID(-y,+x); /* Analyze slopes */ for (i = 0; i < hack->num_slopes; ++i) { m = hack->slopes[i]; /* Memorize intersection slopes (for non-player-grids) */ if ((e > 0) && (hack->slopes_min[y][x] < m) && (m < hack->slopes_max[y][x])) { switch (i / 32) { case 3: vinfo[e].bits_3 |= (1L << (i % 32)); break; case 2: vinfo[e].bits_2 |= (1L << (i % 32)); break; case 1: vinfo[e].bits_1 |= (1L << (i % 32)); break; case 0: vinfo[e].bits_0 |= (1L << (i % 32)); break; } } } /* Default */ vinfo[e].next_0 = &vinfo[0]; /* Grid next child */ if (distance(0, 0, y, x+1) <= MAX_SIGHT) { g = GRID(y,x+1); if (queue[queue_tail-1]->grid[0] != g) { vinfo[queue_tail].grid[0] = g; queue[queue_tail] = &vinfo[queue_tail]; queue_tail++; } vinfo[e].next_0 = &vinfo[queue_tail - 1]; } /* Default */ vinfo[e].next_1 = &vinfo[0]; /* Grid diag child */ if (distance(0, 0, y+1, x+1) <= MAX_SIGHT) { g = GRID(y+1,x+1); if (queue[queue_tail-1]->grid[0] != g) { vinfo[queue_tail].grid[0] = g; queue[queue_tail] = &vinfo[queue_tail]; queue_tail++; } vinfo[e].next_1 = &vinfo[queue_tail - 1]; } /* Hack -- main diagonal has special children */ if (y == x) vinfo[e].next_0 = vinfo[e].next_1; /* Extra values */ vinfo[e].y = y; vinfo[e].x = x; vinfo[e].d = ((y > x) ? (y + x/2) : (x + y/2)); vinfo[e].r = ((!y) ? x : (!x) ? y : (y == x) ? y : 0); } /* Verify maximal bits XXX XXX XXX */ if (((vinfo[1].bits_3 | vinfo[2].bits_3) != VINFO_BITS_3) || ((vinfo[1].bits_2 | vinfo[2].bits_2) != VINFO_BITS_2) || ((vinfo[1].bits_1 | vinfo[2].bits_1) != VINFO_BITS_1) || ((vinfo[1].bits_0 | vinfo[2].bits_0) != VINFO_BITS_0)) { quit("Incorrect bit masks!"); } /* Kill hack */ FREE(hack); /* Success */ return (0); } /* * Forget the "CAVE_VIEW" grids, redrawing as needed */ void forget_view(void) { int i, g; int fast_view_n = view_n; u16b *fast_view_g = view_g; /* XXX: this is moronic. It's not 'fast'. */ byte *fast_cave_info = &cave->info[0][0]; /* None to forget */ if (!fast_view_n) return; /* Clear them all */ for (i = 0; i < fast_view_n; i++) { int y, x; /* Grid */ g = fast_view_g[i]; /* Location */ y = GRID_Y(g); x = GRID_X(g); /* Clear "CAVE_VIEW" and "CAVE_SEEN" flags */ fast_cave_info[g] &= ~(CAVE_VIEW | CAVE_SEEN); /* Clear "CAVE_LIGHT" flag */ /* fast_cave->info[g] &= ~(CAVE_LIGHT); */ /* Redraw */ cave_light_spot(cave, y, x); } /* None left */ fast_view_n = 0; /* Save 'view_n' */ view_n = fast_view_n; } /* * Calculate the complete field of view using a new algorithm * * If "view_g" and "temp_g" were global pointers to arrays of grids, as * opposed to actual arrays of grids, then we could be more efficient by * using "pointer swapping". * * Note the following idiom, which is used in the function below. * This idiom processes each "octant" of the field of view, in a * clockwise manner, starting with the east strip, south side, * and for each octant, allows a simple calculation to set "g" * equal to the proper grids, relative to "pg", in the octant. * * for (o2 = 0; o2 < 8; o2++) * ... * g = pg + p->grid[o2]; * ... * * * Normally, vision along the major axes is more likely than vision * along the diagonal axes, so we check the bits corresponding to * the lines of sight near the major axes first. * * We use the "temp_g" array (and the "CAVE_TEMP" flag) to keep track of * which grids were previously marked "CAVE_SEEN", since only those grids * whose "CAVE_SEEN" value changes during this routine must be redrawn. * * This function is now responsible for maintaining the "CAVE_SEEN" * flags as well as the "CAVE_VIEW" flags, which is good, because * the only grids which normally need to be memorized and/or redrawn * are the ones whose "CAVE_SEEN" flag changes during this routine. * * Basically, this function divides the "octagon of view" into octants of * grids (where grids on the main axes and diagonal axes are "shared" by * two octants), and processes each octant one at a time, processing each * octant one grid at a time, processing only those grids which "might" be * viewable, and setting the "CAVE_VIEW" flag for each grid for which there * is an (unobstructed) line of sight from the center of the player grid to * any internal point in the grid (and collecting these "CAVE_VIEW" grids * into the "view_g" array), and setting the "CAVE_SEEN" flag for the grid * if, in addition, the grid is "illuminated" in some way. * * This function relies on a theorem (suggested and proven by Mat Hostetter) * which states that in each octant of a field of view, a given grid will * be "intersected" by one or more unobstructed "lines of sight" from the * center of the player grid if and only if it is "intersected" by at least * one such unobstructed "line of sight" which passes directly through some * corner of some grid in the octant which is not shared by any other octant. * The proof is based on the fact that there are at least three significant * lines of sight involving any non-shared grid in any octant, one which * intersects the grid and passes though the corner of the grid closest to * the player, and two which "brush" the grid, passing through the "outer" * corners of the grid, and that any line of sight which intersects a grid * without passing through the corner of a grid in the octant can be "slid" * slowly towards the corner of the grid closest to the player, until it * either reaches it or until it brushes the corner of another grid which * is closer to the player, and in either case, the existanc of a suitable * line of sight is thus demonstrated. * * It turns out that in each octant of the radius 20 "octagon of view", * there are 161 grids (with 128 not shared by any other octant), and there * are exactly 126 distinct "lines of sight" passing from the center of the * player grid through any corner of any non-shared grid in the octant. To * determine if a grid is "viewable" by the player, therefore, you need to * simply show that one of these 126 lines of sight intersects the grid but * does not intersect any wall grid closer to the player. So we simply use * a bit vector with 126 bits to represent the set of interesting lines of * sight which have not yet been obstructed by wall grids, and then we scan * all the grids in the octant, moving outwards from the player grid. For * each grid, if any of the lines of sight which intersect that grid have not * yet been obstructed, then the grid is viewable. Furthermore, if the grid * is a wall grid, then all of the lines of sight which intersect the grid * should be marked as obstructed for future reference. Also, we only need * to check those grids for whom at least one of the "parents" was a viewable * non-wall grid, where the parents include the two grids touching the grid * but closer to the player grid (one adjacent, and one diagonal). For the * bit vector, we simply use 4 32-bit integers. All of the static values * which are needed by this function are stored in the large "vinfo" array * (above), which is machine generated by another program. XXX XXX XXX * * Hack -- The queue must be able to hold more than VINFO_MAX_GRIDS grids * because the grids at the edge of the field of view use "grid zero" as * their children, and the queue must be able to hold several of these * special grids. Because the actual number of required grids is bizarre, * we simply allocate twice as many as we would normally need. XXX XXX XXX */ void update_view(void) { int py = p_ptr->py; int px = p_ptr->px; int pg = GRID(py,px); int i, j, k, g, o2; int radius; int fast_view_n = view_n; u16b *fast_view_g = view_g; int fast_temp_n = 0; u16b *fast_temp_g = temp_g; /* XXX: also moronic. Optimizers exist. */ byte *fast_cave_info = &cave->info[0][0]; byte info; /*** Step 0 -- Begin ***/ /* Save the old "view" grids for later */ for (i = 0; i < fast_view_n; i++) { /* Grid */ g = fast_view_g[i]; /* Get grid info */ info = fast_cave_info[g]; /* Save "CAVE_SEEN" grids */ if (info & (CAVE_SEEN)) { /* Set "CAVE_TEMP" flag */ info |= (CAVE_TEMP); /* Save grid for later */ fast_temp_g[fast_temp_n++] = g; } /* Clear "CAVE_VIEW" and "CAVE_SEEN" flags */ info &= ~(CAVE_VIEW | CAVE_SEEN); /* Clear "CAVE_LIGHT" flag */ /* info &= ~(CAVE_LIGHT); */ /* Save cave info */ fast_cave_info[g] = info; } /* Reset the "view" array */ fast_view_n = 0; /* Extract "radius" value */ radius = p_ptr->cur_light; /* Handle real light */ if (radius > 0) ++radius; /* Scan monster list and add monster lights */ for (k = 1; k < z_info->m_max; k++) { /* Check the k'th monster */ monster_type *m_ptr = cave_monster(cave, k); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Access the location */ int fx = m_ptr->fx; int fy = m_ptr->fy; bool in_los = los(p_ptr->py, p_ptr->px, fy, fx); /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Skip monsters not carrying light */ if (!rf_has(r_ptr->flags, RF_HAS_LIGHT)) continue; /* Light a 3x3 box centered on the monster */ for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { int sy = fy + i; int sx = fx + j; /* If the monster isn't visible we can only light open tiles */ if (!in_los && !cave_floor_bold(sy, sx)) continue; /* If the tile is too far away we won't light it */ if (distance(p_ptr->py, p_ptr->px, sy, sx) > MAX_SIGHT) continue; /* If the tile itself isn't in LOS, don't light it */ if (!los(p_ptr->py, p_ptr->px, sy, sx)) continue; g = GRID(sy, sx); /* Mark the square lit and seen */ fast_cave_info[g] |= (CAVE_VIEW | CAVE_SEEN); /* Save in array */ fast_view_g[fast_view_n++] = g; } } } /*** Step 1 -- player grid ***/ /* Player grid */ g = pg; /* Get grid info */ info = fast_cave_info[g]; /* Assume viewable */ info |= (CAVE_VIEW); /* Torch-lit grid */ if (0 < radius) { /* Mark as "CAVE_SEEN" */ info |= (CAVE_SEEN); /* Mark as "CAVE_LIGHT" */ /* info |= (CAVE_LIGHT); */ } /* Perma-lit grid */ else if (info & (CAVE_GLOW)) { /* Mark as "CAVE_SEEN" */ info |= (CAVE_SEEN); } /* Save cave info */ fast_cave_info[g] = info; /* Save in array */ fast_view_g[fast_view_n++] = g; /*** Step 2 -- octants ***/ /* Scan each octant */ for (o2 = 0; o2 < 8; o2++) { vinfo_type *p; /* Last added */ vinfo_type *last = &vinfo[0]; /* Grid queue */ int queue_head = 0; int queue_tail = 0; vinfo_type *queue[VINFO_MAX_GRIDS*2]; /* Slope bit vector */ u32b bits0 = VINFO_BITS_0; u32b bits1 = VINFO_BITS_1; u32b bits2 = VINFO_BITS_2; u32b bits3 = VINFO_BITS_3; /* Reset queue */ queue_head = queue_tail = 0; /* Initial grids */ queue[queue_tail++] = &vinfo[1]; queue[queue_tail++] = &vinfo[2]; /* Process queue */ while (queue_head < queue_tail) { /* Dequeue next grid */ p = queue[queue_head++]; /* Check bits */ if ((bits0 & (p->bits_0)) || (bits1 & (p->bits_1)) || (bits2 & (p->bits_2)) || (bits3 & (p->bits_3))) { /* Extract grid value XXX XXX XXX */ g = pg + p->grid[o2]; /* Get grid info */ info = fast_cave_info[g]; /* Handle wall */ if (info & (CAVE_WALL)) { /* Clear bits */ bits0 &= ~(p->bits_0); bits1 &= ~(p->bits_1); bits2 &= ~(p->bits_2); bits3 &= ~(p->bits_3); /* Newly viewable wall */ if (!(info & (CAVE_VIEW))) { /* Mark as viewable */ info |= (CAVE_VIEW); /* Torch-lit grids */ if (p->d < radius) { /* Mark as "CAVE_SEEN" */ info |= (CAVE_SEEN); /* Mark as "CAVE_LIGHT" */ /* info |= (CAVE_LIGHT); */ } /* Perma-lit grids */ else if (info & (CAVE_GLOW)) { int y = GRID_Y(g); int x = GRID_X(g); /* Hack -- move towards player */ int yy = (y < py) ? (y + 1) : (y > py) ? (y - 1) : y; int xx = (x < px) ? (x + 1) : (x > px) ? (x - 1) : x; /* Check for "simple" illumination */ if (cave->info[yy][xx] & (CAVE_GLOW)) { /* Mark as seen */ info |= (CAVE_SEEN); } } /* Save cave info */ fast_cave_info[g] = info; /* Save in array */ fast_view_g[fast_view_n++] = g; } } /* Handle non-wall */ else { /* Enqueue child */ if (last != p->next_0) { queue[queue_tail++] = last = p->next_0; } /* Enqueue child */ if (last != p->next_1) { queue[queue_tail++] = last = p->next_1; } /* Newly viewable non-wall */ if (!(info & (CAVE_VIEW))) { /* Mark as "viewable" */ info |= (CAVE_VIEW); /* Torch-lit grids */ if (p->d < radius) { /* Mark as "CAVE_SEEN" */ info |= (CAVE_SEEN); /* Mark as "CAVE_LIGHT" */ /* info |= (CAVE_LIGHT); */ } /* Perma-lit grids */ else if (info & (CAVE_GLOW)) { /* Mark as "CAVE_SEEN" */ info |= (CAVE_SEEN); } /* Save cave info */ fast_cave_info[g] = info; /* Save in array */ fast_view_g[fast_view_n++] = g; } } } } } /*** Step 3 -- Complete the algorithm ***/ /* Handle blindness */ if (p_ptr->timed[TMD_BLIND]) { /* Process "new" grids */ for (i = 0; i < fast_view_n; i++) { /* Grid */ g = fast_view_g[i]; /* Grid cannot be "CAVE_SEEN" */ fast_cave_info[g] &= ~(CAVE_SEEN); } } /* Process "new" grids */ for (i = 0; i < fast_view_n; i++) { /* Grid */ g = fast_view_g[i]; /* Get grid info */ info = fast_cave_info[g]; /* Was not "CAVE_SEEN", is now "CAVE_SEEN" */ if ((info & (CAVE_SEEN)) && !(info & (CAVE_TEMP))) { int y, x; /* Location */ y = GRID_Y(g); x = GRID_X(g); /* Handle feeling squares */ if (cave->info2[y][x] & CAVE2_FEEL) { cave->feeling_squares++; /* Erase the square so you can't 'resee' it */ cave->info2[y][x] &= ~(CAVE2_FEEL); /* Display feeling if necessary */ if (cave->feeling_squares == FEELING1) display_feeling(TRUE); } cave_note_spot(cave, y, x); cave_light_spot(cave, y, x); } } /* Process "old" grids */ for (i = 0; i < fast_temp_n; i++) { /* Grid */ g = fast_temp_g[i]; /* Get grid info */ info = fast_cave_info[g]; /* Clear "CAVE_TEMP" flag */ info &= ~(CAVE_TEMP); /* Save cave info */ fast_cave_info[g] = info; /* Was "CAVE_SEEN", is now not "CAVE_SEEN" */ if (!(info & (CAVE_SEEN))) { int y, x; /* Location */ y = GRID_Y(g); x = GRID_X(g); /* Redraw */ cave_light_spot(cave, y, x); } } /* Save 'view_n' */ view_n = fast_view_n; } /* * Size of the circular queue used by "update_flow()" */ #define FLOW_MAX 2048 /* * Hack -- provide some "speed" for the "flow" code * This entry is the "current index" for the "when" field * Note that a "when" value of "zero" means "not used". * * Note that the "cost" indexes from 1 to 127 are for * "old" data, and from 128 to 255 are for "new" data. * * This means that as long as the player does not "teleport", * then any monster up to 128 + MONSTER_FLOW_DEPTH will be * able to track down the player, and in general, will be * able to track down either the player or a position recently * occupied by the player. */ static int flow_save = 0; /* * Hack -- forget the "flow" information */ void cave_forget_flow(struct cave *c) { int x, y; /* Nothing to forget */ if (!flow_save) return; /* Check the entire dungeon */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { /* Forget the old data */ c->cost[y][x] = 0; c->when[y][x] = 0; } } /* Start over */ flow_save = 0; } /* * Hack -- fill in the "cost" field of every grid that the player can * "reach" with the number of steps needed to reach that grid. This * also yields the "distance" of the player from every grid. * * In addition, mark the "when" of the grids that can reach the player * with the incremented value of "flow_save". * * Hack -- use the local "flow_y" and "flow_x" arrays as a "circular * queue" of cave grids. * * We do not need a priority queue because the cost from grid to grid * is always "one" (even along diagonals) and we process them in order. */ void cave_update_flow(struct cave *c) { int py = p_ptr->py; int px = p_ptr->px; int ty, tx; int y, x; int n, d; int flow_n; int flow_tail = 0; int flow_head = 0; byte flow_y[FLOW_MAX]; byte flow_x[FLOW_MAX]; /*** Cycle the flow ***/ /* Cycle the flow */ if (flow_save++ == 255) { /* Cycle the flow */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { int w = c->when[y][x]; c->when[y][x] = (w >= 128) ? (w - 128) : 0; } } /* Restart */ flow_save = 128; } /* Local variable */ flow_n = flow_save; /*** Player Grid ***/ /* Save the time-stamp */ c->when[py][px] = flow_n; /* Save the flow cost */ c->cost[py][px] = 0; /* Enqueue that entry */ flow_y[flow_head] = py; flow_x[flow_head] = px; /* Advance the queue */ ++flow_tail; /*** Process Queue ***/ /* Now process the queue */ while (flow_head != flow_tail) { /* Extract the next entry */ ty = flow_y[flow_head]; tx = flow_x[flow_head]; /* Forget that entry (with wrap) */ if (++flow_head == FLOW_MAX) flow_head = 0; /* Child cost */ n = c->cost[ty][tx] + 1; /* Hack -- Limit flow depth */ if (n == MONSTER_FLOW_DEPTH) continue; /* Add the "children" */ for (d = 0; d < 8; d++) { int old_head = flow_tail; /* Child location */ y = ty + ddy_ddd[d]; x = tx + ddx_ddd[d]; /* Ignore "pre-stamped" entries */ if (c->when[y][x] == flow_n) continue; /* Ignore "walls" and "rubble" */ if (c->feat[y][x] >= FEAT_RUBBLE) continue; /* Save the time-stamp */ c->when[y][x] = flow_n; /* Save the flow cost */ c->cost[y][x] = n; /* Enqueue that entry */ flow_y[flow_tail] = y; flow_x[flow_tail] = x; /* Advance the queue */ if (++flow_tail == FLOW_MAX) flow_tail = 0; /* Hack -- Overflow by forgetting new entry */ if (flow_tail == flow_head) flow_tail = old_head; } } } /* * Light up the dungeon using "claravoyance" * * This function "illuminates" every grid in the dungeon, memorizes all * "objects", and memorizes all grids as with magic mapping. */ void wiz_light(void) { int i, y, x; /* Memorize objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Memorize */ o_ptr->marked = TRUE; } /* Scan all normal grids */ for (y = 1; y < DUNGEON_HGT-1; y++) { /* Scan all normal grids */ for (x = 1; x < DUNGEON_WID-1; x++) { /* Process all non-walls */ if (cave->feat[y][x] < FEAT_SECRET) { /* Scan all neighbors */ for (i = 0; i < 9; i++) { int yy = y + ddy_ddd[i]; int xx = x + ddx_ddd[i]; /* Perma-light the grid */ cave->info[yy][xx] |= (CAVE_GLOW); /* Memorize normal features */ if (cave->feat[yy][xx] > FEAT_INVIS) cave->info[yy][xx] |= (CAVE_MARK); } } } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw whole map, monster list */ p_ptr->redraw |= (PR_MAP | PR_MONLIST | PR_ITEMLIST); } /* * Forget the dungeon map (ala "Thinking of Maud..."). */ void wiz_dark(void) { int i, y, x; /* Forget every grid */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { /* Process the grid */ cave->info[y][x] &= ~(CAVE_MARK); cave->info2[y][x] &= ~(CAVE2_DTRAP); } } /* Forget all objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Forget the object */ o_ptr->marked = FALSE; } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw map, monster list */ p_ptr->redraw |= (PR_MAP | PR_MONLIST | PR_ITEMLIST); } /* * Light or Darken the town */ void cave_illuminate(struct cave *c, bool daytime) { int y, x, i; /* Apply light or darkness */ for (y = 0; y < c->height; y++) { for (x = 0; x < c->width; x++) { /* Interesting grids */ if (c->feat[y][x] > FEAT_INVIS) { /* Illuminate the grid */ c->info[y][x] |= (CAVE_GLOW); /* Memorize the grid */ c->info[y][x] |= (CAVE_MARK); } /* Boring grids (light) */ else if (daytime) { /* Illuminate the grid */ c->info[y][x] |= (CAVE_GLOW); /* Memorize grids */ c->info[y][x] |= (CAVE_MARK); } /* Boring grids (dark) */ else { /* Darken the grid */ c->info[y][x] &= ~(CAVE_GLOW); /* Forget grids */ c->info[y][x] &= ~(CAVE_MARK); } } } /* Handle shop doorways */ for (y = 0; y < c->height; y++) { for (x = 0; x < c->width; x++) { /* Track shop doorways */ if ((c->feat[y][x] >= FEAT_SHOP_HEAD) && (c->feat[y][x] <= FEAT_SHOP_TAIL)) { for (i = 0; i < 8; i++) { int yy = y + ddy_ddd[i]; int xx = x + ddx_ddd[i]; /* Illuminate the grid */ c->info[yy][xx] |= (CAVE_GLOW); /* Memorize grids */ c->info[yy][xx] |= (CAVE_MARK); } } } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw map, monster list */ p_ptr->redraw |= (PR_MAP | PR_MONLIST | PR_ITEMLIST); } void cave_set_feat(struct cave *c, int y, int x, int feat) { assert(c); assert(y >= 0 && y < DUNGEON_HGT); assert(x >= 0 && x < DUNGEON_WID); /* XXX: Check against c->height and c->width instead, once everywhere * honors those... */ c->feat[y][x] = feat; if (feat >= FEAT_DOOR_HEAD) c->info[y][x] |= CAVE_WALL; else c->info[y][x] &= ~CAVE_WALL; if (character_dungeon) { cave_note_spot(c, y, x); cave_light_spot(c, y, x); } } bool cave_in_bounds(struct cave *c, int y, int x) { return x >= 0 && x < c->width && y >= 0 && y < c->height; } bool cave_in_bounds_fully(struct cave *c, int y, int x) { return x > 0 && x < c->width - 1 && y > 0 && y < c->height - 1; } /* * Determine the path taken by a projection. * * The projection will always start from the grid (y1,x1), and will travel * towards the grid (y2,x2), touching one grid per unit of distance along * the major axis, and stopping when it enters the destination grid or a * wall grid, or has travelled the maximum legal distance of "range". * * Note that "distance" in this function (as in the "update_view()" code) * is defined as "MAX(dy,dx) + MIN(dy,dx)/2", which means that the player * actually has an "octagon of projection" not a "circle of projection". * * The path grids are saved into the grid array pointed to by "gp", and * there should be room for at least "range" grids in "gp". Note that * due to the way in which distance is calculated, this function normally * uses fewer than "range" grids for the projection path, so the result * of this function should never be compared directly to "range". Note * that the initial grid (y1,x1) is never saved into the grid array, not * even if the initial grid is also the final grid. XXX XXX XXX * * The "flg" flags can be used to modify the behavior of this function. * * In particular, the "PROJECT_STOP" and "PROJECT_THRU" flags have the same * semantics as they do for the "project" function, namely, that the path * will stop as soon as it hits a monster, or that the path will continue * through the destination grid, respectively. * * The "PROJECT_JUMP" flag, which for the "project()" function means to * start at a special grid (which makes no sense in this function), means * that the path should be "angled" slightly if needed to avoid any wall * grids, allowing the player to "target" any grid which is in "view". * This flag is non-trivial and has not yet been implemented, but could * perhaps make use of the "vinfo" array (above). XXX XXX XXX * * This function returns the number of grids (if any) in the path. This * function will return zero if and only if (y1,x1) and (y2,x2) are equal. * * This algorithm is similar to, but slightly different from, the one used * by "update_view_los()", and very different from the one used by "los()". */ int project_path(u16b *gp, int range, int y1, int x1, int y2, int x2, int flg) { int y, x; int n = 0; int k = 0; /* Absolute */ int ay, ax; /* Offsets */ int sy, sx; /* Fractions */ int frac; /* Scale factors */ int full, half; /* Slope */ int m; /* No path necessary (or allowed) */ if ((x1 == x2) && (y1 == y2)) return (0); /* Analyze "dy" */ if (y2 < y1) { ay = (y1 - y2); sy = -1; } else { ay = (y2 - y1); sy = 1; } /* Analyze "dx" */ if (x2 < x1) { ax = (x1 - x2); sx = -1; } else { ax = (x2 - x1); sx = 1; } /* Number of "units" in one "half" grid */ half = (ay * ax); /* Number of "units" in one "full" grid */ full = half << 1; /* Vertical */ if (ay > ax) { /* Start at tile edge */ frac = ax * ax; /* Let m = ((dx/dy) * full) = (dx * dx * 2) = (frac * 2) */ m = frac << 1; /* Start */ y = y1 + sy; x = x1; /* Create the projection path */ while (1) { /* Save grid */ gp[n++] = GRID(y,x); /* Hack -- Check maximum range */ if ((n + (k >> 1)) >= range) break; /* Sometimes stop at destination grid */ if (!(flg & (PROJECT_THRU))) { if ((x == x2) && (y == y2)) break; } /* Always stop at non-initial wall grids */ if ((n > 0) && !cave_floor_bold(y, x)) break; /* Sometimes stop at non-initial monsters/players */ if (flg & (PROJECT_STOP)) { if ((n > 0) && (cave->m_idx[y][x] != 0)) break; } /* Slant */ if (m) { /* Advance (X) part 1 */ frac += m; /* Horizontal change */ if (frac >= half) { /* Advance (X) part 2 */ x += sx; /* Advance (X) part 3 */ frac -= full; /* Track distance */ k++; } } /* Advance (Y) */ y += sy; } } /* Horizontal */ else if (ax > ay) { /* Start at tile edge */ frac = ay * ay; /* Let m = ((dy/dx) * full) = (dy * dy * 2) = (frac * 2) */ m = frac << 1; /* Start */ y = y1; x = x1 + sx; /* Create the projection path */ while (1) { /* Save grid */ gp[n++] = GRID(y,x); /* Hack -- Check maximum range */ if ((n + (k >> 1)) >= range) break; /* Sometimes stop at destination grid */ if (!(flg & (PROJECT_THRU))) { if ((x == x2) && (y == y2)) break; } /* Always stop at non-initial wall grids */ if ((n > 0) && !cave_floor_bold(y, x)) break; /* Sometimes stop at non-initial monsters/players */ if (flg & (PROJECT_STOP)) { if ((n > 0) && (cave->m_idx[y][x] != 0)) break; } /* Slant */ if (m) { /* Advance (Y) part 1 */ frac += m; /* Vertical change */ if (frac >= half) { /* Advance (Y) part 2 */ y += sy; /* Advance (Y) part 3 */ frac -= full; /* Track distance */ k++; } } /* Advance (X) */ x += sx; } } /* Diagonal */ else { /* Start */ y = y1 + sy; x = x1 + sx; /* Create the projection path */ while (1) { /* Save grid */ gp[n++] = GRID(y,x); /* Hack -- Check maximum range */ if ((n + (n >> 1)) >= range) break; /* Sometimes stop at destination grid */ if (!(flg & (PROJECT_THRU))) { if ((x == x2) && (y == y2)) break; } /* Always stop at non-initial wall grids */ if ((n > 0) && !cave_floor_bold(y, x)) break; /* Sometimes stop at non-initial monsters/players */ if (flg & (PROJECT_STOP)) { if ((n > 0) && (cave->m_idx[y][x] != 0)) break; } /* Advance (Y) */ y += sy; /* Advance (X) */ x += sx; } } /* Length */ return (n); } /* * Determine if a bolt spell cast from (y1,x1) to (y2,x2) will arrive * at the final destination, assuming that no monster gets in the way, * using the "project_path()" function to check the projection path. * * Note that no grid is ever "projectable()" from itself. * * This function is used to determine if the player can (easily) target * a given grid, and if a monster can target the player. */ bool projectable(int y1, int x1, int y2, int x2, int flg) { int y, x; int grid_n = 0; u16b grid_g[512]; /* Check the projection path */ grid_n = project_path(grid_g, MAX_RANGE, y1, x1, y2, x2, flg); /* No grid is ever projectable from itself */ if (!grid_n) return (FALSE); /* Final grid */ y = GRID_Y(grid_g[grid_n-1]); x = GRID_X(grid_g[grid_n-1]); /* May not end in a wall grid */ if (!cave_floor_bold(y, x)) return (FALSE); /* May not end in an unrequested grid */ if ((y != y2) || (x != x2)) return (FALSE); /* Assume okay */ return (TRUE); } /* * Standard "find me a location" function * * Obtains a legal location within the given distance of the initial * location, and with "los()" from the source to destination location. * * This function is often called from inside a loop which searches for * locations while increasing the "d" distance. * * Currently the "m" parameter is unused. */ void scatter(int *yp, int *xp, int y, int x, int d, int m) { int nx, ny; /* Unused parameter */ (void)m; /* Pick a location */ while (TRUE) { /* Pick a new location */ ny = rand_spread(y, d); nx = rand_spread(x, d); /* Ignore annoying locations */ if (!in_bounds_fully(ny, nx)) continue; /* Ignore "excessively distant" locations */ if ((d > 1) && (distance(y, x, ny, nx) > d)) continue; /* Require "line of sight" */ if (los(y, x, ny, nx)) break; } /* Save the location */ (*yp) = ny; (*xp) = nx; } void health_track(struct player *p, int m_idx) { p->health_who = m_idx; p->redraw |= PR_HEALTH; } /* * Hack -- track the given monster race */ void monster_race_track(int r_idx) { /* Save this monster ID */ p_ptr->monster_race_idx = r_idx; /* Window stuff */ p_ptr->redraw |= (PR_MONSTER); } /* * Hack -- track the given object kind */ void track_object(int item) { p_ptr->object_idx = item; p_ptr->object_kind_idx = NO_OBJECT; p_ptr->redraw |= (PR_OBJECT); } void track_object_kind(int k_idx) { p_ptr->object_idx = NO_OBJECT; p_ptr->object_kind_idx = k_idx; p_ptr->redraw |= (PR_OBJECT); } bool tracked_object_is(int item) { return (p_ptr->object_idx == item); } /* * Something has happened to disturb the player. * * The first arg indicates a major disturbance, which affects search. * * The second arg is currently unused, but could induce output flush. * * All disturbance cancels repeated commands, resting, and running. */ void disturb(struct player *p, int stop_search, int unused_flag) { /* Unused parameter */ (void)unused_flag; /* Cancel repeated commands */ cmd_cancel_repeat(); /* Cancel Resting */ if (p->resting) { p->resting = 0; p->redraw |= PR_STATE; } /* Cancel running */ if (p->running) { p_ptr->running = 0; /* Check for new panel if appropriate */ if (OPT(center_player)) verify_panel(); p->update |= PU_TORCH; } /* Cancel searching if requested */ if (stop_search && p->searching) { p->searching = FALSE; p->update |= PU_BONUS; p->redraw |= PR_STATE; } /* Flush input */ flush(); } bool is_quest(int level) { int i; /* Town is never a quest */ if (!level || !q_list) return FALSE; for (i = 0; i < MAX_Q_IDX; i++) if (q_list[i].level == level) return TRUE; return FALSE; } struct cave *cave = NULL; struct cave *cave_new(void) { struct cave *c = mem_zalloc(sizeof *c); c->info = C_ZNEW(DUNGEON_HGT, byte_256); c->info2 = C_ZNEW(DUNGEON_HGT, byte_256); c->feat = C_ZNEW(DUNGEON_HGT, byte_wid); c->cost = C_ZNEW(DUNGEON_HGT, byte_wid); c->when = C_ZNEW(DUNGEON_HGT, byte_wid); c->m_idx = C_ZNEW(DUNGEON_HGT, s16b_wid); c->o_idx = C_ZNEW(DUNGEON_HGT, s16b_wid); c->monsters = C_ZNEW(z_info->m_max, struct monster); c->mon_max = 1; c->created_at = 1; return c; } void cave_free(struct cave *c) { mem_free(c->info); mem_free(c->info2); mem_free(c->feat); mem_free(c->cost); mem_free(c->when); mem_free(c->m_idx); mem_free(c->o_idx); mem_free(c->monsters); mem_free(c); } /** * FEATURE PREDICATES * * These functions are used to figure out what kind of square something is, * via c->feat[y][x]. All direct testing of c->feat[y][x] should be rewritten * in terms of these functions. * * It's often better to use feature behavior predicates (written in terms of * these functions) instead of these functions directly. For instance, * cave_isrock() will return false for a secret door, even though it will * behave like a rock wall until the player determines it's a door. * * Use functions like cave_isdiggable, cave_iswall, etc. in these cases. */ /** * True if the square is normal open floor. */ bool cave_isfloor(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_FLOOR; } /** * True if the square is a normal granite rock wall. * * FEAT_WALL_SOLID is the normal feature type. The others are weird byproducts * of cave generation (and should be avoided). */ bool cave_isrock(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_WALL_EXTRA: case FEAT_WALL_INNER: case FEAT_WALL_OUTER: case FEAT_WALL_SOLID: return TRUE; default: return FALSE; } } /** * True if the square is a permanent wall. * * FEAT_PERM_SOLID is the normal feature type. The others are weird byproducts * of cave generation (and should be avoided). */ bool cave_isperm(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_PERM_EXTRA: case FEAT_PERM_INNER: case FEAT_PERM_OUTER: case FEAT_PERM_SOLID: return TRUE; default: return FALSE; } } /** * True if the square is a magma wall. */ bool cave_ismagma(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_MAGMA: case FEAT_MAGMA_H: case FEAT_MAGMA_K: return TRUE; default: return FALSE; } } /** * True if the square is a quartz wall. */ bool cave_isquartz(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_QUARTZ: case FEAT_QUARTZ_H: case FEAT_QUARTZ_K: return TRUE; default: return FALSE; } } /** * True if the square is a mineral wall (magma/quartz). */ bool cave_ismineral(struct cave *c, int y, int x) { return cave_isrock(c, y, x) || cave_ismagma(c, y, x) || cave_isquartz(c, y, x); } /** * True if the square is rubble. */ bool cave_isrubble(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_RUBBLE; } /** * True if the square is a hidden secret door. * * These squares appear as if they were granite--when detected a secret door * is replaced by a closed door. */ bool cave_issecretdoor(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_SECRET; } /** * True if the square is an open door. */ bool cave_isopendoor(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_OPEN; } /** * True if the square is a closed door (possibly locked or jammed). */ bool cave_iscloseddoor(struct cave *c, int y, int x) { int feat = c->feat[y][x]; return feat >= FEAT_DOOR_HEAD && feat <= FEAT_DOOR_TAIL; } /** * True if the square is a closed, locked door. */ bool cave_islockeddoor(struct cave *c, int y, int x) { int feat = c->feat[y][x]; return feat >= FEAT_DOOR_HEAD + 0x01 && feat <= FEAT_DOOR_TAIL; } /** * True if the square is a closed, jammed door. */ bool cave_isjammeddoor(struct cave *c, int y, int x) { int feat = c->feat[y][x]; return feat >= FEAT_DOOR_HEAD + 0x08 && feat <= FEAT_DOOR_TAIL; } /** * True if the square is a door. * * This includes open, closed, and hidden doors. */ bool cave_isdoor(struct cave *c, int y, int x) { return (cave_isopendoor(c, y, x) || cave_issecretdoor(c, y, x) || cave_iscloseddoor(cave, y, x)); } /** * True if the square is an unknown trap (it will appear as a floor tile). */ bool cave_issecrettrap(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_INVIS; } /** * True if the square is a known trap. */ bool cave_isknowntrap(struct cave *c, int y, int x) { int feat = c->feat[y][x]; return feat >= FEAT_TRAP_HEAD && feat <= FEAT_TRAP_TAIL; } /** * True if the square contains a trap, known or unknown. */ bool cave_istrap(struct cave *c, int y, int x) { return cave_issecrettrap(cave, y, x) || cave_isknowntrap(cave, y, x); } /** * SQUARE BEHAVIOR PREDICATES * * These functions define how a given square behaves, e.g. whether it is * passable by the player, whether it is diggable, contains items, etc. * * These functions use the FEATURE PREDICATES (as well as c->info) to make * the determination. */ /** * True if the square is open (a floor square not occupied by a monster). */ bool cave_isopen(struct cave *c, int y, int x) { return cave_isfloor(c, y, x) && !c->m_idx[y][x]; } /** * True if the square is empty (an open square without any items). */ bool cave_isempty(struct cave *c, int y, int x) { return cave_isopen(c, y, x) && !c->o_idx[y][x]; } /** * True if the square is a floor square without items. */ bool cave_canputitem(struct cave *c, int y, int x) { return cave_isfloor(c, y, x) && !c->o_idx[y][x]; } /** * True if the square can be dug: this includes rubble and non-permanent walls. */ bool cave_isdiggable(struct cave *c, int y, int x) { return (cave_ismineral(c, y, x) || cave_issecretdoor(c, y, x) || cave_isrubble(c, y, x)); } /** * True if the square is passable by the player. * * This function is the logical negation of cave_iswall(). */ bool cave_ispassable(struct cave *c, int y, int x) { return !(c->info[y][x] & CAVE_WALL); } /** * True if the square is a wall square (impedes the player). * * This function is the logical negation of cave_ispassable(). */ bool cave_iswall(struct cave *c, int y, int x) { return c->info[y][x] & CAVE_WALL; } /** * True if the square is a permanent wall or one of the "stronger" walls. * * The stronger walls are granite, magma and quartz. This excludes things like * secret doors and rubble. */ bool cave_isstrongwall(struct cave *c, int y, int x) { return cave_ismineral(c, y, x) || cave_isperm(c, y, x); } /** * True if the square is part of a vault. * * This doesn't say what kind of square it is, just that it is part of a vault. */ bool cave_isvault(struct cave *c, int y, int x) { return c->info[y][x] & CAVE_ICKY; } /** * True if the square is part of a room. */ bool cave_isroom(struct cave *c, int y, int x) { return c->info[y][x] & CAVE_ROOM; } /** * True if cave square is a feeling trigger square */ bool cave_isfeel(struct cave *c, int y, int x){ return c->info2[y][x] & CAVE2_FEEL; } /** * Get a monster on the current level by its index. */ struct monster *cave_monster(struct cave *c, int idx) { return &c->monsters[idx]; } /** * The maximum number of monsters allowed in the level. */ int cave_monster_max(struct cave *c) { return c->mon_max; } /** * The current number of monsters present on the level. */ int cave_monster_count(struct cave *c) { return c->mon_cnt; } /** * Add visible treasure to a mineral square. */ void upgrade_mineral(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_MAGMA: cave_set_feat(c, y, x, FEAT_MAGMA_K); break; case FEAT_QUARTZ: cave_set_feat(c, y, x, FEAT_QUARTZ_K); break; } } angband-v3.3.2/src/debug.c0000644000175000017500000000231411651552410014630 0ustar chriscchrisc/* * File: debug.c * Purpose: Simple debugging functions * * Copyright (c) 2007 Andrew Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "debug.h" typedef void debug_hook(const char *); static void to_stderr(const char *out); static debug_hook *d_out = to_stderr; /* * Simple printing to stderr */ static void to_stderr(const char *out) { fputs(out, stderr); fputs("\n", stderr); } /* * Output some text. * * Amongst other things, this should use the z-msg package so that ports can * display e.g. a debugging window, or send the output to file. */ void debug(const char *fmt, ...) { va_list vp; char buffer[1024] = ""; va_start(vp, fmt); vstrnfmt(buffer, sizeof(buffer), fmt, vp); va_end(vp); d_out(buffer); /* We are done */ return; } angband-v3.3.2/src/savefile.c0000644000175000017500000003024111651552410015340 0ustar chriscchrisc/* * File: savefile.c * Purpose: Savefile loading and saving main routines * * Copyright (c) 2009 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "angband.h" #include "savefile.h" /** * The savefile code. * * Savefiles since ~3.1 have used a block-based system. Each savefile * consists of an 8-byte header, the first four bytes of which mark this * as a savefile, the second four bytes provide a variant ID. * * After that, each block has the format: * - 16-byte string giving the type of block * - 4-byte block version * - 4-byte block size * - 4-byte block checksum * ... data ... * padding so that block is a multiple of 4 bytes * * The savefile deosn't contain the version number of that game that saved it; * versioning is left at the individual block level. The current code * keeps a list of savefile blocks to save in savers[] below, along with * their current versions. * * For each block type and version, there is a loading function to load that * type/version combination. For example, there may be a loader for v1 * and v2 of the RNG block; these must be different functions. It has been * done this way since it allows easier maintenance; after each release, you * need simply remove old loaders and you will not have to disentangle * lots of code with "if (version > 3)" and its like everywhere. * * Savefile loading and saving is done by keeping the current block in * memory, which is accessed using the wr_* and rd_* functions. This is * then written out, whole, to disk, with the appropriate header. * * * So, if you want to make a savefile compat-breaking change, then there are * a few things you should do: * * - increment the version in 'savers' below * - add a loading function that accepts the new version (in addition to * the previous loading function) to 'loaders' * - and watch the magic happen. * * * TODO: * - wr_ and rd_ should be passed a buffer to work with, rather than using * the rd_ and wr_ functions with a universal buffer * - */ /** Magic bits at beginning of savefile */ static const byte savefile_magic[4] = { 83, 97, 118, 101 }; static const byte savefile_name[4] = "VNLA"; /** Savefile saving functions */ static const struct { char name[16]; void (*save)(void); u32b version; } savers[] = { { "rng", wr_randomizer, 1 }, { "options", wr_options, 2 }, { "messages", wr_messages, 1 }, { "monster memory", wr_monster_memory, 2 }, { "object memory", wr_object_memory, 1 }, { "quests", wr_quests, 1 }, { "artifacts", wr_artifacts, 2 }, { "player", wr_player, 2 }, { "squelch", wr_squelch, 1 }, { "misc", wr_misc, 2 }, { "player hp", wr_player_hp, 1 }, { "player spells", wr_player_spells, 1 }, { "randarts", wr_randarts, 2 }, { "inventory", wr_inventory, 4 }, { "stores", wr_stores, 4 }, { "dungeon", wr_dungeon, 1 }, { "objects", wr_objects, 4 }, { "monsters", wr_monsters, 6 }, { "ghost", wr_ghost, 1 }, { "history", wr_history, 1 }, }; /** Savefile loading functions */ static const struct { char name[16]; int (*load)(void); u32b version; } loaders[] = { { "rng", rd_randomizer, 1 }, { "options", rd_options_1, 1 }, { "options", rd_options_2, 2 }, { "messages", rd_messages, 1 }, { "monster memory", rd_monster_memory_1, 1 }, { "monster memory", rd_monster_memory_2, 2 }, { "object memory", rd_object_memory, 1 }, { "quests", rd_quests, 1 }, { "artifacts", rd_artifacts, 2 }, { "player", rd_player, 2 }, { "squelch", rd_squelch, 1 }, { "misc", rd_misc, 1 }, { "misc", rd_misc_2, 2}, { "player hp", rd_player_hp, 1 }, { "player spells", rd_player_spells, 1 }, { "randarts", rd_randarts_1, 1 }, { "randarts", rd_randarts_2, 2 }, { "inventory", rd_inventory_1, 1 }, { "inventory", rd_inventory_2, 2 }, { "inventory", rd_inventory_3, 3 }, { "inventory", rd_inventory_4, 4 }, { "stores", rd_stores_1, 1 }, { "stores", rd_stores_2, 2 }, { "stores", rd_stores_3, 3 }, { "stores", rd_stores_4, 4 }, { "dungeon", rd_dungeon, 1 }, { "objects", rd_objects_1, 1 }, { "objects", rd_objects_2, 2 }, { "objects", rd_objects_3, 3 }, { "objects", rd_objects_4, 4 }, { "monsters", rd_monsters_1, 1 }, { "monsters", rd_monsters_2, 2 }, { "monsters", rd_monsters_3, 3 }, { "monsters", rd_monsters_4, 4 }, { "monsters", rd_monsters_5, 5 }, { "monsters", rd_monsters_6, 6 }, { "ghost", rd_ghost, 1 }, { "history", rd_history, 1 }, }; /* Buffer bits */ static byte *buffer; static u32b buffer_size; static u32b buffer_pos; static u32b buffer_check; #define BUFFER_INITIAL_SIZE 1024 #define BUFFER_BLOCK_INCREMENT 1024 #define SAVEFILE_HEAD_SIZE 28 /** Utility **/ /* * Hack -- Show information on the screen, one line at a time. * * Avoid the top two lines, to avoid interference with "note()". */ void note(const char *message) { static int y = 2; /* Draw the message */ prt(message, y, 0); pause_line(Term); /* Advance one line (wrap if needed) */ if (++y >= 24) y = 2; /* Flush it */ Term_fresh(); } /** Base put/get **/ static void sf_put(byte v) { assert(buffer != NULL); assert(buffer_size > 0); if (buffer_size == buffer_pos) { buffer_size += BUFFER_BLOCK_INCREMENT; buffer = mem_realloc(buffer, buffer_size); } assert(buffer_pos < buffer_size); buffer[buffer_pos++] = v; buffer_check += v; } static byte sf_get(void) { assert(buffer != NULL); assert(buffer_size > 0); assert(buffer_pos < buffer_size); buffer_check += buffer[buffer_pos]; return buffer[buffer_pos++]; } /* accessor */ void wr_byte(byte v) { sf_put(v); } void wr_u16b(u16b v) { sf_put((byte)(v & 0xFF)); sf_put((byte)((v >> 8) & 0xFF)); } void wr_s16b(s16b v) { wr_u16b((u16b)v); } void wr_u32b(u32b v) { sf_put((byte)(v & 0xFF)); sf_put((byte)((v >> 8) & 0xFF)); sf_put((byte)((v >> 16) & 0xFF)); sf_put((byte)((v >> 24) & 0xFF)); } void wr_s32b(s32b v) { wr_u32b((u32b)v); } void wr_string(const char *str) { while (*str) { wr_byte(*str); str++; } wr_byte(*str); } void rd_byte(byte *ip) { *ip = sf_get(); } void rd_u16b(u16b *ip) { (*ip) = sf_get(); (*ip) |= ((u16b)(sf_get()) << 8); } void rd_s16b(s16b *ip) { rd_u16b((u16b*)ip); } void rd_u32b(u32b *ip) { (*ip) = sf_get(); (*ip) |= ((u32b)(sf_get()) << 8); (*ip) |= ((u32b)(sf_get()) << 16); (*ip) |= ((u32b)(sf_get()) << 24); } void rd_s32b(s32b *ip) { rd_u32b((u32b*)ip); } void rd_string(char *str, int max) { byte tmp8u; int i = 0; do { rd_byte(&tmp8u); if (i < max) str[i] = tmp8u; if (!tmp8u) break; } while (++i); str[max - 1] = '\0'; } void strip_bytes(int n) { byte tmp8u; while (n--) rd_byte(&tmp8u); } void pad_bytes(int n) { while (n--) wr_byte(0); } /*** Savefile saving functions ***/ static bool try_save(ang_file *file) { byte savefile_head[SAVEFILE_HEAD_SIZE]; size_t i, pos; /* Start off the buffer */ buffer = mem_alloc(BUFFER_INITIAL_SIZE); buffer_size = BUFFER_INITIAL_SIZE; for (i = 0; i < N_ELEMENTS(savers); i++) { buffer_pos = 0; buffer_check = 0; savers[i].save(); /* 16-byte block name */ pos = my_strcpy((char *)savefile_head, savers[i].name, sizeof savefile_head); while (pos < 16) savefile_head[pos++] = 0; #define SAVE_U32B(v) \ savefile_head[pos++] = (v & 0xFF); \ savefile_head[pos++] = ((v >> 8) & 0xFF); \ savefile_head[pos++] = ((v >> 16) & 0xFF); \ savefile_head[pos++] = ((v >> 24) & 0xFF); SAVE_U32B(savers[i].version); SAVE_U32B(buffer_pos); SAVE_U32B(buffer_check); assert(pos == SAVEFILE_HEAD_SIZE); file_write(file, (char *)savefile_head, SAVEFILE_HEAD_SIZE); file_write(file, (char *)buffer, buffer_pos); /* pad to 4 byte multiples */ if (buffer_pos % 4) file_write(file, "xxx", 4 - (buffer_pos % 4)); } mem_free(buffer); return TRUE; } /* * Attempt to save the player in a savefile */ bool savefile_save(const char *path) { ang_file *file; int count = 0; char new_savefile[1024]; char old_savefile[1024]; /* New savefile */ strnfmt(old_savefile, sizeof(old_savefile), "%s%u.old", path,Rand_simple(1000000)); while (file_exists(old_savefile) && (count++ < 100)) { strnfmt(old_savefile, sizeof(old_savefile), "%s%u%u.old", path,Rand_simple(1000000),count); } count = 0; /* Make sure that the savefile doesn't already exist */ /*safe_setuid_grab(); file_delete(new_savefile); file_delete(old_savefile); safe_setuid_drop();*/ /* Open the savefile */ safe_setuid_grab(); strnfmt(new_savefile, sizeof(new_savefile), "%s%u.new", path,Rand_simple(1000000)); while (file_exists(new_savefile) && (count++ < 100)) { strnfmt(new_savefile, sizeof(new_savefile), "%s%u%u.new", path,Rand_simple(1000000),count); } file = file_open(new_savefile, MODE_WRITE, FTYPE_SAVE); safe_setuid_drop(); if (file) { file_write(file, (char *) &savefile_magic, 4); file_write(file, (char *) &savefile_name, 4); character_saved = try_save(file); file_close(file); } if (character_saved) { bool err = FALSE; safe_setuid_grab(); if (file_exists(savefile) && !file_move(savefile, old_savefile)) err = TRUE; if (!err) { if (!file_move(new_savefile, savefile)) err = TRUE; if (err) file_move(old_savefile, savefile); else file_delete(old_savefile); } safe_setuid_drop(); return err ? FALSE : TRUE; } /* Delete temp file if the save failed */ if (file) { /* file is no longer valid, but it still points to a non zero * value if the file was created above */ safe_setuid_grab(); file_delete(new_savefile); safe_setuid_drop(); } return FALSE; } /*** Savefiel loading functions ***/ static bool try_load(ang_file *f) { byte savefile_head[SAVEFILE_HEAD_SIZE]; u32b block_version, block_size; char *block_name; while (TRUE) { size_t i; int (*loader)(void) = NULL; /* Load in the next header */ size_t size = file_read(f, (char *)savefile_head, SAVEFILE_HEAD_SIZE); if (!size) break; if (size != SAVEFILE_HEAD_SIZE || savefile_head[15] != 0) { note("Savefile is corrupted -- block header mangled."); return FALSE; } #define RECONSTRUCT_U32B(from) \ ((u32b) savefile_head[from]) | \ ((u32b) savefile_head[from+1] << 8) | \ ((u32b) savefile_head[from+2] << 16) | \ ((u32b) savefile_head[from+3] << 24); block_name = (char *) savefile_head; block_version = RECONSTRUCT_U32B(16); block_size = RECONSTRUCT_U32B(20); /* pad to 4 bytes */ if (block_size % 4) block_size += 4 - (block_size % 4); /* Find the right loader */ for (i = 0; i < N_ELEMENTS(loaders); i++) { if (streq(block_name, loaders[i].name) && block_version == loaders[i].version) { loader = loaders[i].load; } } if (!loader) { /* No loader found */ note("Savefile too old. Try importing it into an older Angband first."); return FALSE; } /* Allocate space for the buffer */ buffer = mem_alloc(block_size); buffer_pos = 0; buffer_check = 0; buffer_size = file_read(f, (char *) buffer, block_size); if (buffer_size != block_size) { note("Savefile is corrupted -- not enough bytes."); mem_free(buffer); return FALSE; } /* Try loading */ if (loader() != 0) { note("Savefile is corrupted."); mem_free(buffer); return FALSE; } mem_free(buffer); } /* Still alive */ if (p_ptr->chp >= 0) { /* Reset cause of death */ my_strcpy(p_ptr->died_from, "(alive and well)", sizeof(p_ptr->died_from)); } return TRUE; } /** * Load a savefile. */ bool savefile_load(const char *path) { byte head[8]; bool ok = TRUE; ang_file *f = file_open(path, MODE_READ, -1); if (f) { if (file_read(f, (char *) &head, 8) == 8 && memcmp(&head[0], savefile_magic, 4) == 0 && memcmp(&head[4], savefile_name, 4) == 0) { if (!try_load(f)) { ok = FALSE; note("Failed loading savefile."); } } else { ok = FALSE; note("Savefile is corrupted -- incorrect file header."); } file_close(f); } else { ok = FALSE; note("Couldn't open savefile."); } return ok; } angband-v3.3.2/src/z-rand.c0000644000175000017500000003336711651552410014751 0ustar chriscchrisc/* * File: z-rand.c * Purpose: A Random Number Generator for Angband * * Copyright (c) 1997 Ben Harrison, Randy Hutson * * See below for copyright on the WELL random number generator. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "z-rand.h" /** * This file provides a pseudo-random number generator. * * This code provides both a "quick" random number generator (4 bytes of * state), and a "complex" random number generator (128 + 4 bytes of state). * * The complex RNG (used for most game entropy) is provided by the WELL102a * algorithm, used with permission. See below for copyright information * about the WELL implementation. * * To use of the "simple" RNG, activate it via "Rand_quick = TRUE" and * "Rand_value = seed". After that it will be automatically used instead of * the "complex" RNG. When you are done, you can de-activate it via * "Rand_quick = FALSE". You can also choose a new seed. */ /* begin WELL RNG * ************************************************************************* * Copyright: Francois Panneton and Pierre L'Ecuyer, University of Montreal * Makoto Matsumoto, Hiroshima University * ************************************************************************* * Code was modified slightly by Erik Osheim to work on unsigned integers. */ #define M1 3 #define M2 24 #define M3 10 #define MAT0POS(t, v) (v ^ (v >> t)) #define MAT0NEG(t, v) (v ^ (v << (-(t)))) #define Identity(v) (v) u32b state_i = 0; u32b STATE[RAND_DEG] = {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}; u32b z0, z1, z2; #define V0 STATE[state_i] #define VM1 STATE[(state_i + M1) & 0x0000001fU] #define VM2 STATE[(state_i + M2) & 0x0000001fU] #define VM3 STATE[(state_i + M3) & 0x0000001fU] #define VRm1 STATE[(state_i + 31) & 0x0000001fU] #define newV0 STATE[(state_i + 31) & 0x0000001fU] #define newV1 STATE[state_i] static u32b WELLRNG1024a (void){ z0 = VRm1; z1 = Identity(V0) ^ MAT0POS (8, VM1); z2 = MAT0NEG (-19, VM2) ^ MAT0NEG(-14,VM3); newV1 = z1 ^ z2; newV0 = MAT0NEG (-11,z0) ^ MAT0NEG(-7,z1) ^ MAT0NEG(-13,z2); state_i = (state_i + 31) & 0x0000001fU; return STATE[state_i]; } /* end WELL RNG */ /* * Simple RNG, implemented with a linear congruent algorithm. */ #define LCRNG(X) ((X) * 1103515245 + 12345) /** * Whether to use the simple RNG or not. */ bool Rand_quick = TRUE; /** * The current "seed" of the simple RNG. */ u32b Rand_value; static bool rand_fixed = FALSE; static u32b rand_fixval = 0; /** * Initialize the complex RNG using a new seed. */ void Rand_state_init(u32b seed) { int i, j; /* Seed the table */ STATE[0] = seed; /* Propagate the seed */ for (i = 1; i < RAND_DEG; i++) STATE[i] = LCRNG(STATE[i - 1]); /* Cycle the table ten times per degree */ for (i = 0; i < RAND_DEG * 10; i++) { /* Acquire the next index */ j = (state_i + 1) % RAND_DEG; /* Update the table, extract an entry */ STATE[j] += STATE[state_i]; /* Advance the index */ state_i = j; } } /** * Extract a "random" number from 0 to m - 1, via division. * * This method selects "random" 28-bit numbers, and then uses division to drop * those numbers into "m" different partitions, plus a small non-partition to * reduce bias, taking as the final value the first "good" partition that a * number falls into. * * This method has no bias, and is much less affected by patterns in the "low" * bits of the underlying RNG's. However, it is potentially non-terminating. */ u32b Rand_div(u32b m) { u32b r, n; /* Division by zero will result if m is larger than 0x10000000 */ assert(m <= 0x10000000); /* Hack -- simple case */ if (m <= 1) return (0); if (rand_fixed) return (rand_fixval * 1000 * (m - 1)) / (100 * 1000); /* Partition size */ n = (0x10000000 / m); if (Rand_quick) { /* Use a simple RNG */ /* Wait for it */ while (1) { /* Cycle the generator */ r = (Rand_value = LCRNG(Rand_value)); /* Mutate a 28-bit "random" number */ r = ((r >> 4) & 0x0FFFFFFF) / n; /* Done */ if (r < m) break; } } else { /* Use a complex RNG */ while (1) { /* Get the next pseudorandom number */ r = WELLRNG1024a(); /* Mutate a 28-bit "random" number */ r = ((r >> 4) & 0x0FFFFFFF) / n; /* Done */ if (r < m) break; } } /* Use the value */ return (r); } /** * The number of entries in the "Rand_normal_table" */ #define RANDNOR_NUM 256 /** * The standard deviation of the "Rand_normal_table" */ #define RANDNOR_STD 64 /** * The normal distribution table for the "Rand_normal()" function (below) */ static s16b Rand_normal_table[RANDNOR_NUM] = { 206, 613, 1022, 1430, 1838, 2245, 2652, 3058, 3463, 3867, 4271, 4673, 5075, 5475, 5874, 6271, 6667, 7061, 7454, 7845, 8234, 8621, 9006, 9389, 9770, 10148, 10524, 10898, 11269, 11638, 12004, 12367, 12727, 13085, 13440, 13792, 14140, 14486, 14828, 15168, 15504, 15836, 16166, 16492, 16814, 17133, 17449, 17761, 18069, 18374, 18675, 18972, 19266, 19556, 19842, 20124, 20403, 20678, 20949, 21216, 21479, 21738, 21994, 22245, 22493, 22737, 22977, 23213, 23446, 23674, 23899, 24120, 24336, 24550, 24759, 24965, 25166, 25365, 25559, 25750, 25937, 26120, 26300, 26476, 26649, 26818, 26983, 27146, 27304, 27460, 27612, 27760, 27906, 28048, 28187, 28323, 28455, 28585, 28711, 28835, 28955, 29073, 29188, 29299, 29409, 29515, 29619, 29720, 29818, 29914, 30007, 30098, 30186, 30272, 30356, 30437, 30516, 30593, 30668, 30740, 30810, 30879, 30945, 31010, 31072, 31133, 31192, 31249, 31304, 31358, 31410, 31460, 31509, 31556, 31601, 31646, 31688, 31730, 31770, 31808, 31846, 31882, 31917, 31950, 31983, 32014, 32044, 32074, 32102, 32129, 32155, 32180, 32205, 32228, 32251, 32273, 32294, 32314, 32333, 32352, 32370, 32387, 32404, 32420, 32435, 32450, 32464, 32477, 32490, 32503, 32515, 32526, 32537, 32548, 32558, 32568, 32577, 32586, 32595, 32603, 32611, 32618, 32625, 32632, 32639, 32645, 32651, 32657, 32662, 32667, 32672, 32677, 32682, 32686, 32690, 32694, 32698, 32702, 32705, 32708, 32711, 32714, 32717, 32720, 32722, 32725, 32727, 32729, 32731, 32733, 32735, 32737, 32739, 32740, 32742, 32743, 32745, 32746, 32747, 32748, 32749, 32750, 32751, 32752, 32753, 32754, 32755, 32756, 32757, 32757, 32758, 32758, 32759, 32760, 32760, 32761, 32761, 32761, 32762, 32762, 32763, 32763, 32763, 32764, 32764, 32764, 32764, 32765, 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32767, }; /** * Generate a random integer number of NORMAL distribution * * The table above is used to generate a psuedo-normal distribution, in a * manner which is much faster than calling a transcendental function to * calculate a true normal distribution. * * Basically, entry 64 * N in the table above represents the number of times * out of 32767 that a random variable with normal distribution will fall * within N standard deviations of the mean. That is, about 68 percent of the * time for N=1 and 95 percent of the time for N=2. * * The table above contains a "faked" final entry which allows us to pretend * that all values in a normal distribution are strictly less than four * standard deviations away from the mean. This results in "conservative" * distribution of approximately 1/32768 values. * * Note that the binary search takes up to 16 quick iterations. */ s16b Rand_normal(int mean, int stand) { s16b tmp, offset; // foo s16b low = 0; s16b high = RANDNOR_NUM; /* Paranoia */ if (stand < 1) return (mean); /* Roll for probability */ tmp = (s16b)randint0(32768); /* Binary Search */ while (low < high) { int mid = (low + high) >> 1; /* Move right if forced */ if (Rand_normal_table[mid] < tmp) { low = mid + 1; } else { high = mid; } } /* Convert the index into an offset */ offset = (long)stand * (long)low / RANDNOR_STD; /* One half should be negative */ if (one_in_(2)) return (mean - offset); /* One half should be positive */ return (mean + offset); } /** * Generates damage for "2d6" style dice rolls */ int damroll(int num, int sides) { int i; int sum = 0; if (sides <= 0) return 0; for (i = 0; i < num; i++) sum += randint1(sides); return sum; } /** * Calculation helper function for damroll */ int damcalc(int num, int sides, aspect dam_aspect) { switch (dam_aspect) { case MAXIMISE: case EXTREMIFY: return num * sides; case RANDOMISE: return damroll(num, sides); case MINIMISE: return num; case AVERAGE: return num * (sides + 1) / 2; } return 0; } /** * Generates a random signed long integer X where `A` <= X <= `B`. * The integer X falls along a uniform distribution. * * Note that "rand_range(0, N-1)" == "randint0(N)". */ int rand_range(int A, int B) { if (A == B) return A; assert(A < B); return A + (s32b)Rand_div(1 + B - A); } /** * Perform division, possibly rounding up or down depending on the size of the * remainder and chance. */ static int simulate_division(int dividend, int divisor) { int quotient = dividend / divisor; int remainder = dividend % divisor; if (randint0(divisor) < remainder) quotient++; return quotient; } /** * Help determine an "enchantment bonus" for an object. * * To avoid floating point but still provide a smooth distribution of bonuses, * we simply round the results of division in such a way as to "average" the * correct floating point value. * * This function has been changed. It uses "Rand_normal()" to choose values * from a normal distribution, whose mean moves from zero towards the max as * the level increases, and whose standard deviation is equal to 1/4 of the * max, and whose values are forced to lie between zero and the max, inclusive. * * Since the "level" rarely passes 100 before Morgoth is dead, it is very * rare to get the "full" enchantment on an object, even a deep levels. * * It is always possible (albeit unlikely) to get the "full" enchantment. * * A sample distribution of values from "m_bonus(10, N)" is shown below: * * N 0 1 2 3 4 5 6 7 8 9 10 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07 */ s16b m_bonus(int max, int level) { int bonus, stand, value; /* Make sure level is reasonable */ if (level >= MAX_DEPTH) level = MAX_DEPTH - 1; /* The bonus approaches max as level approaches MAX_DEPTH */ bonus = simulate_division(max * level, MAX_DEPTH); /* The standard deviation is 1/4 of the max */ stand = simulate_division(max, 4); /* Choose a value */ value = Rand_normal(bonus, stand); /* Return, enforcing the min and max values */ if (value < 0) return 0; else if (value > max) return max; else return value; } /** * Calculation helper function for m_bonus */ s16b m_bonus_calc(int max, int level, aspect bonus_aspect) { switch (bonus_aspect) { case EXTREMIFY: case MAXIMISE: return max; case RANDOMISE: return m_bonus(max, level); case MINIMISE: return 0; case AVERAGE: return max * level / MAX_DEPTH; } return 0; } /** * Calculation helper function for random_value structs */ int randcalc(random_value v, int level, aspect rand_aspect) { if (rand_aspect == EXTREMIFY) { int min = randcalc(v, level, MINIMISE); int max = randcalc(v, level, MAXIMISE); return abs(min) > abs(max) ? min : max; } else { int dmg = damcalc(v.dice, v.sides, rand_aspect); int bonus = m_bonus_calc(v.m_bonus, level, rand_aspect); return v.base + dmg + bonus; } } /** * Test to see if a value is within a random_value's range */ bool randcalc_valid(random_value v, int test) { if (test < randcalc(v, 0, MINIMISE)) return FALSE; else if (test > randcalc(v, 0, MAXIMISE)) return FALSE; else return TRUE; } /** * Test to see if a random_value actually varies */ bool randcalc_varies(random_value v) { return randcalc(v, 0, MINIMISE) != randcalc(v, 0, MAXIMISE); } void rand_fix(u32b val) { rand_fixed = TRUE; rand_fixval = val; } /* * Another simple RNG that does not use any of the above state * (so can be used without disturbing the game's RNG state) */ int getpid(void); u32b Rand_simple(u32b m) { static time_t seed; time_t v; v = time(NULL); seed = LCRNG(seed) + ((v << 16) ^ v ^ getpid()); return (seed%m); } angband-v3.3.2/src/z-queue.c0000644000175000017500000000262411651552410015141 0ustar chriscchrisc/* * File: z-queue.c * Purpose: Simple circular integer queue. * * Copyright (c) 2011 Erik Osheim * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "z-queue.h" struct queue *q_new(size_t size) { struct queue *q = (struct queue*)malloc(sizeof(struct queue)); q->data = (uintptr_t*)malloc(sizeof(uintptr_t) * size); q->size = size; q->head = 0; q->tail = 0; return q; } int q_len(struct queue *q) { int len; if (q->tail >= q->head) { len = q->tail - q->head; } else { len = q->size - q->head + q->tail; } return len; } void q_push(struct queue *q, uintptr_t item) { q->data[q->tail] = item; q->tail = (q->tail + 1) % q->size; if (q->tail == q->head) abort(); } uintptr_t q_pop(struct queue *q) { uintptr_t item = q->data[q->head]; if (q->head == q->tail) abort(); q->head = (q->head + 1) % q->size; return item; } void q_free(struct queue *q) { free(q->data); free(q); } angband-v3.3.2/src/load.c0000644000175000017500000016011011651552410014460 0ustar chriscchrisc/* * File: load.c * Purpose: Savefile loading functions * * Copyright (c) 1997 Ben Harrison, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "history.h" #include "monster/mon-make.h" #include "monster/mon-spell.h" #include "object/tvalsval.h" #include "savefile.h" #include "squelch.h" /* Shorthand function pointer for rd_item version */ typedef int (*rd_item_t)(object_type *o_ptr); /** * Find an ego item from its index */ static struct ego_item *lookup_ego(int idx) { if (idx > 0 && idx < z_info->e_max) return &e_info[idx]; return NULL; } /* * Read an object, version 4 (added mimicking_o_idx) * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. */ static int rd_item_4(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); of_wipe(o_ptr->known_flags); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->pval_flags[j][i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); rd_s16b(&o_ptr->mimicking_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(o_ptr->kind->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(o_ptr->kind->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(o_ptr->kind->to_a, o_ptr->origin_depth, RANDOMISE); /* Get the correct fields */ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; /* Get the correct weight */ o_ptr->weight = o_ptr->kind->weight; /* All done */ return (0); } /* Get the standard fields */ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; /* Get the standard weight */ o_ptr->weight = o_ptr->kind->weight; /* Artifacts */ if (o_ptr->artifact) { /* Get the new artifact "pvals" */ for (i = 0; i < MAX_PVALS; i++) o_ptr->pval[i] = o_ptr->artifact->pval[i]; o_ptr->num_pvals = o_ptr->artifact->num_pvals; /* Get the new artifact fields */ o_ptr->ac = o_ptr->artifact->ac; o_ptr->dd = o_ptr->artifact->dd; o_ptr->ds = o_ptr->artifact->ds; /* Get the new artifact weight */ o_ptr->weight = o_ptr->artifact->weight; } /* Ego items */ if (o_ptr->ego) { /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) /* Keep old boosted damage dice */ o_ptr->dd = old_dd; ego_min_pvals(o_ptr); } /* Success */ return (0); } /* * Read an object, version 3 * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. */ static int rd_item_3(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); of_wipe(o_ptr->known_flags); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->pval_flags[j][i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(o_ptr->kind->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(o_ptr->kind->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(o_ptr->kind->to_a, o_ptr->origin_depth, RANDOMISE); /* Get the correct fields */ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; /* Get the correct weight */ o_ptr->weight = o_ptr->kind->weight; /* All done */ return (0); } /* Get the standard fields */ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; /* Get the standard weight */ o_ptr->weight = o_ptr->kind->weight; /* Artifacts */ if (o_ptr->artifact) { /* Get the new artifact "pvals" */ for (i = 0; i < MAX_PVALS; i++) o_ptr->pval[i] = o_ptr->artifact->pval[i]; o_ptr->num_pvals = o_ptr->artifact->num_pvals; /* Get the new artifact fields */ o_ptr->ac = o_ptr->artifact->ac; o_ptr->dd = o_ptr->artifact->dd; o_ptr->ds = o_ptr->artifact->ds; /* Get the new artifact weight */ o_ptr->weight = o_ptr->artifact->weight; } /* Ego items */ if (o_ptr->ego) { /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) /* Keep old boosted damage dice */ o_ptr->dd = old_dd; ego_min_pvals(o_ptr); } /* Success */ return (0); } /* * Read an object, version 2 - remove after 3.3 * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. It also copies flags * and pval_flags properly, now that they are canonical. */ static int rd_item_2(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); of_wipe(o_ptr->known_flags); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->pval_flags[j][i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(o_ptr->kind->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(o_ptr->kind->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(o_ptr->kind->to_a, o_ptr->origin_depth, RANDOMISE); } /* Get the standard fields and flags*/ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; o_ptr->weight = o_ptr->kind->weight; of_union(o_ptr->flags, o_ptr->kind->base->flags); of_union(o_ptr->flags, o_ptr->kind->flags); for (i = 0; i < o_ptr->kind->num_pvals; i++) of_union(o_ptr->pval_flags[i], o_ptr->kind->pval_flags[i]); /* Artifacts */ if (o_ptr->artifact) copy_artifact_data(o_ptr, o_ptr->artifact); /* Ego items */ if (o_ptr->ego) { bitflag pval_mask[OF_SIZE]; of_union(o_ptr->flags, o_ptr->ego->flags); /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) /* Keep old boosted damage dice */ o_ptr->dd = old_dd; create_mask(pval_mask, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); /* Hack -- enforce legal pval, and apply pval flags */ for (i = 0; i < MAX_PVALS; i++) { if (of_is_inter(o_ptr->ego->pval_flags[i], pval_mask)) { of_union(o_ptr->pval_flags[i], o_ptr->ego->pval_flags[i]); if (!o_ptr->pval[i]) o_ptr->pval[i] = o_ptr->ego->min_pval[i]; } } } /* Success */ return (0); } /** * Read an object - remove for the version after 3.3 */ static int rd_item_1(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; u16b tmp16u; byte art_idx; byte ego_idx; size_t i; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); rd_s16b(&o_ptr->pval[DEFAULT_PVAL]); if (o_ptr->pval[DEFAULT_PVAL]) o_ptr->num_pvals = 1; else o_ptr->num_pvals = 0; /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (i = 0; i < 12 && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < 12) strip_bytes(12 - i); of_wipe(o_ptr->known_flags); /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (i = 0; i < 12 && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < 12) strip_bytes(12 - i); /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); rd_string(buf, sizeof(buf)); /* Save the inscription */ if (buf[0]) o_ptr->note = quark_add(buf); o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(o_ptr->kind->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(o_ptr->kind->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(o_ptr->kind->to_a, o_ptr->origin_depth, RANDOMISE); } /* Get the standard fields and flags*/ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; o_ptr->weight = o_ptr->kind->weight; of_union(o_ptr->flags, o_ptr->kind->base->flags); of_union(o_ptr->flags, o_ptr->kind->flags); for (i = 0; i < o_ptr->kind->num_pvals; i++) of_union(o_ptr->pval_flags[DEFAULT_PVAL], o_ptr->kind->pval_flags[i]); /* Artifacts */ if (o_ptr->artifact) copy_artifact_data(o_ptr, o_ptr->artifact); /* Ego items */ if (o_ptr->ego) { bitflag pval_mask[OF_SIZE]; of_union(o_ptr->flags, o_ptr->ego->flags); /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) /* Keep old boosted damage dice */ o_ptr->dd = old_dd; create_mask(pval_mask, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); /* Hack -- enforce legal pval, and apply pval flags */ for (i = 0; i < MAX_PVALS; i++) { if (of_is_inter(o_ptr->ego->pval_flags[i], pval_mask)) { of_union(o_ptr->pval_flags[DEFAULT_PVAL], o_ptr->ego->pval_flags[i]); if (o_ptr->pval[DEFAULT_PVAL] < o_ptr->ego->min_pval[i]) o_ptr->pval[DEFAULT_PVAL] = o_ptr->ego->min_pval[i]; } } } /* Success */ return (0); } /** * Read RNG state * * There were originally 64 bytes of randomizer saved. Now we only need * 32 + 5 bytes saved, so we'll read an extra 27 bytes at the end which won't * be used. */ int rd_randomizer(void) { int i; u32b noop; /* current value for the simple RNG */ rd_u32b(&Rand_value); /* state index */ rd_u32b(&state_i); /* for safety, make sure state_i < RAND_DEG */ state_i = state_i % RAND_DEG; /* RNG variables */ rd_u32b(&z0); rd_u32b(&z1); rd_u32b(&z2); /* RNG state */ for (i = 0; i < RAND_DEG; i++) rd_u32b(&STATE[i]); /* NULL padding */ for (i = 0; i < 59 - RAND_DEG; i++) rd_u32b(&noop); Rand_quick = FALSE; return 0; } /* * Read options, version 2. */ int rd_options_2(void) { int i, n; byte b; u16b tmp16u; u32b window_flag[ANGBAND_TERM_MAX]; u32b window_mask[ANGBAND_TERM_MAX]; /*** Special info */ /* Read "delay_factor" */ rd_byte(&b); op_ptr->delay_factor = b; /* Read "hitpoint_warn" */ rd_byte(&b); op_ptr->hitpoint_warn = b; /* Read lazy movement delay */ rd_u16b(&tmp16u); lazymove_delay = (tmp16u < 1000) ? tmp16u : 0; /*** Normal Options ***/ while (1) { byte value; char name[20]; rd_string(name, sizeof name); if (!name[0]) break; rd_byte(&value); option_set(name, !!value); } /*** Window Options ***/ for (n = 0; n < ANGBAND_TERM_MAX; n++) rd_u32b(&window_flag[n]); for (n = 0; n < ANGBAND_TERM_MAX; n++) rd_u32b(&window_mask[n]); /* Analyze the options */ for (n = 0; n < ANGBAND_TERM_MAX; n++) { /* Analyze the options */ for (i = 0; i < 32; i++) { /* Process valid flags */ if (window_flag_desc[i]) { /* Blank invalid flags */ if (!(window_mask[n] & (1L << i))) { window_flag[n] &= ~(1L << i); } } } } /* Set up the subwindows */ subwindows_set_flags(window_flag, ANGBAND_TERM_MAX); return 0; } static const struct { int num; const char *text; } num_to_text[] = { { 0, "rogue_like_commands" }, { 2, "use_sound" }, { 4, "use_old_target" }, { 5, "pickup_always" }, { 6, "pickup_inven" }, { 15, "show_flavors" }, { 20, "disturb_move" }, { 21, "disturb_near" }, { 22, "disturb_detect" }, { 23, "disturb_state" }, { 60, "view_yellow_light" }, { 64, "easy_open" }, { 66, "animate_flicker" }, { 68, "center_player" }, { 69, "purple_uniques" }, { 70, "xchars_to_file" }, { 71, "auto_more" }, { 74, "hp_changes_color" }, { 77, "mouse_movement" }, { 78, "mouse_buttons" }, { 79, "notify_recharge" }, { 161, "cheat_hear" }, { 162, "cheat_room" }, { 163, "cheat_xtra" }, { 164, "cheat_know" }, { 165, "cheat_live" }, { 192, "birth_maximize" }, { 193, "birth_randarts" }, { 195, "birth_ironman" }, { 196, "birth_no_stores" }, { 197, "birth_no_artifacts" }, { 198, "birth_no_stacking" }, { 199, "birth_no_preserve" }, { 200, "birth_no_stairs" }, { 201, "birth_no_feelings" }, { 202, "birth_no_selling" }, { 205, "birth_ai_sound" }, { 206, "birth_ai_smell" }, { 207, "birth_ai_packs" }, { 208, "birth_ai_learn" }, { 209, "birth_ai_cheat" }, { 210, "birth_ai_smart" }, { 225, "score_hear" }, { 226, "score_room" }, { 227, "score_xtra" }, { 228, "score_know" }, { 229, "score_live" }, }; static const char *lookup_option(int opt) { size_t i; for (i = 0; i < N_ELEMENTS(num_to_text); i++) { if (num_to_text[i].num == opt) return num_to_text[i].text; } return NULL; } /* * Read options * * XXX Remove this for the next release after 3.2. */ int rd_options_1(void) { int i, n; byte b; u16b tmp16u; u32b flag[8]; u32b mask[8]; u32b window_flag[ANGBAND_TERM_MAX]; u32b window_mask[ANGBAND_TERM_MAX]; /*** Oops ***/ /* Ignore old options */ strip_bytes(16); /*** Special info */ /* Read "delay_factor" */ rd_byte(&b); op_ptr->delay_factor = b; /* Read "hitpoint_warn" */ rd_byte(&b); op_ptr->hitpoint_warn = b; /* Read lazy movement delay */ rd_u16b(&tmp16u); lazymove_delay = (tmp16u < 1000) ? tmp16u : 0; /*** Normal Options ***/ /* Read the option flags */ for (n = 0; n < 8; n++) rd_u32b(&flag[n]); /* Read the option masks */ for (n = 0; n < 8; n++) rd_u32b(&mask[n]); /* Analyze the options */ /* 256 is the old OPT_MAX */ for (i = 0; i < 256; i++) { int os = i / 32; int ob = i % 32; /* Process saved entries */ if (mask[os] & (1L << ob)) { const char *name = lookup_option(i); if (name) option_set(name, flag[os] & (1L << ob) ? TRUE : FALSE); } } /*** Window Options ***/ /* Read the window flags */ for (n = 0; n < ANGBAND_TERM_MAX; n++) rd_u32b(&window_flag[n]); /* Read the window masks */ for (n = 0; n < ANGBAND_TERM_MAX; n++) rd_u32b(&window_mask[n]); /* Analyze the options */ for (n = 0; n < ANGBAND_TERM_MAX; n++) { /* Analyze the options */ for (i = 0; i < 32; i++) { /* Process valid flags */ if (window_flag_desc[i]) { /* Blank invalid flags */ if (!(window_mask[n] & (1L << i))) { window_flag[n] &= ~(1L << i); } } } } /* Set up the subwindows */ subwindows_set_flags(window_flag, ANGBAND_TERM_MAX); return 0; } /* * Read the saved messages */ int rd_messages(void) { int i; char buf[128]; u16b tmp16u; s16b num; /* Total */ rd_s16b(&num); /* Read the messages */ for (i = 0; i < num; i++) { /* Read the message */ rd_string(buf, sizeof(buf)); /* Read the message type */ rd_u16b(&tmp16u); /* Save the message */ message_add(buf, tmp16u); } return 0; } /* Read monster memory, version 2 */ int rd_monster_memory_2(void) { int r_idx; u16b tmp16u; /* Monster Memory */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->r_max) { note(format("Too many (%u) monster races!", tmp16u)); return (-1); } /* Read the available records */ for (r_idx = 0; r_idx < tmp16u; r_idx++) { size_t i; monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Count sights/deaths/kills */ rd_s16b(&l_ptr->sights); rd_s16b(&l_ptr->deaths); rd_s16b(&l_ptr->pkills); rd_s16b(&l_ptr->tkills); /* Count wakes and ignores */ rd_byte(&l_ptr->wake); rd_byte(&l_ptr->ignore); /* Count drops */ rd_byte(&l_ptr->drop_gold); rd_byte(&l_ptr->drop_item); /* Count spells */ rd_byte(&l_ptr->cast_innate); rd_byte(&l_ptr->cast_spell); /* Count blows of each type */ for (i = 0; i < MONSTER_BLOW_MAX; i++) rd_byte(&l_ptr->blows[i]); /* Memorize flags */ for (i = 0; i < RF_BYTES && i < RF_SIZE; i++) rd_byte(&l_ptr->flags[i]); if (i < RF_BYTES) strip_bytes(RF_BYTES - i); for (i = 0; i < RF_BYTES && i < RSF_SIZE; i++) rd_byte(&l_ptr->spell_flags[i]); if (i < RF_BYTES) strip_bytes(RF_BYTES - i); /* Read the "Racial" monster limit per level */ rd_byte(&r_ptr->max_num); /* XXX */ strip_bytes(3); /* Repair the spell lore flags */ rsf_inter(l_ptr->spell_flags, r_ptr->spell_flags); } return 0; } /* Read monster memory - remove after 3.3 */ int rd_monster_memory_1(void) { int r_idx; u16b tmp16u; /* Monster Memory */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->r_max) { note(format("Too many (%u) monster races!", tmp16u)); return (-1); } /* Read the available records */ for (r_idx = 0; r_idx < tmp16u; r_idx++) { size_t i; monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Count sights/deaths/kills */ rd_s16b(&l_ptr->sights); rd_s16b(&l_ptr->deaths); rd_s16b(&l_ptr->pkills); rd_s16b(&l_ptr->tkills); /* Count wakes and ignores */ rd_byte(&l_ptr->wake); rd_byte(&l_ptr->ignore); /* Count drops */ rd_byte(&l_ptr->drop_gold); rd_byte(&l_ptr->drop_item); /* Count spells */ rd_byte(&l_ptr->cast_innate); rd_byte(&l_ptr->cast_spell); /* Count blows of each type */ for (i = 0; i < MONSTER_BLOW_MAX; i++) rd_byte(&l_ptr->blows[i]); /* Memorize flags */ /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (i = 0; i < 12 && i < RF_SIZE; i++) rd_byte(&l_ptr->flags[i]); if (i < 12) strip_bytes(12 - i); /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (i = 0; i < 12 && i < RSF_SIZE; i++) rd_byte(&l_ptr->spell_flags[i]); if (i < 12) strip_bytes(12 - i); /* Read the "Racial" monster limit per level */ rd_byte(&r_ptr->max_num); /* XXX */ strip_bytes(3); /* Repair the spell lore flags */ rsf_inter(l_ptr->spell_flags, r_ptr->spell_flags); } return 0; } int rd_object_memory(void) { int i; u16b tmp16u; /* Object Memory */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->k_max) { note(format("Too many (%u) object kinds!", tmp16u)); return (-1); } /* Read the object memory */ for (i = 0; i < tmp16u; i++) { byte tmp8u; object_kind *k_ptr = &k_info[i]; rd_byte(&tmp8u); k_ptr->aware = (tmp8u & 0x01) ? TRUE : FALSE; k_ptr->tried = (tmp8u & 0x02) ? TRUE : FALSE; k_ptr->everseen = (tmp8u & 0x08) ? TRUE : FALSE; if (tmp8u & 0x04) kind_squelch_when_aware(k_ptr); if (tmp8u & 0x10) kind_squelch_when_unaware(k_ptr); } return 0; } int rd_quests(void) { int i; u16b tmp16u; /* Load the Quests */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > MAX_Q_IDX) { note(format("Too many (%u) quests!", tmp16u)); return (-1); } /* Load the Quests */ for (i = 0; i < tmp16u; i++) { byte tmp8u; rd_byte(&tmp8u); q_list[i].level = tmp8u; rd_byte(&tmp8u); rd_byte(&tmp8u); rd_byte(&tmp8u); } return 0; } int rd_artifacts(void) { int i; u16b tmp16u; /* Load the Artifacts */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->a_max) { note(format("Too many (%u) artifacts!", tmp16u)); return (-1); } /* Read the artifact flags */ for (i = 0; i < tmp16u; i++) { byte tmp8u; rd_byte(&tmp8u); a_info[i].created = tmp8u; rd_byte(&tmp8u); a_info[i].seen = tmp8u; rd_byte(&tmp8u); a_info[i].everseen = tmp8u; rd_byte(&tmp8u); } return 0; } /* * Read the "extra" information */ int rd_player(void) { int i; byte num; rd_string(op_ptr->full_name, sizeof(op_ptr->full_name)); rd_string(p_ptr->died_from, 80); p_ptr->history = mem_zalloc(250); rd_string(p_ptr->history, 250); /* Player race */ rd_byte(&num); p_ptr->race = player_id2race(num); /* Verify player race */ if (!p_ptr->race) { note(format("Invalid player race (%d).", num)); return -1; } /* Player class */ rd_byte(&num); p_ptr->class = player_id2class(num); if (!p_ptr->class) { note(format("Invalid player class (%d).", num)); return -1; } /* Player gender */ rd_byte(&p_ptr->psex); p_ptr->sex = &sex_info[p_ptr->psex]; /* Numeric name suffix */ rd_byte(&op_ptr->name_suffix); /* Special Race/Class info */ rd_byte(&p_ptr->hitdie); rd_byte(&p_ptr->expfact); /* Age/Height/Weight */ rd_s16b(&p_ptr->age); rd_s16b(&p_ptr->ht); rd_s16b(&p_ptr->wt); /* Read the stat info */ for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_max[i]); for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_cur[i]); for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_birth[i]); rd_s16b(&p_ptr->ht_birth); rd_s16b(&p_ptr->wt_birth); rd_s16b(&p_ptr->sc_birth); rd_s32b(&p_ptr->au_birth); strip_bytes(4); rd_s32b(&p_ptr->au); rd_s32b(&p_ptr->max_exp); rd_s32b(&p_ptr->exp); rd_u16b(&p_ptr->exp_frac); rd_s16b(&p_ptr->lev); /* Verify player level */ if ((p_ptr->lev < 1) || (p_ptr->lev > PY_MAX_LEVEL)) { note(format("Invalid player level (%d).", p_ptr->lev)); return (-1); } rd_s16b(&p_ptr->mhp); rd_s16b(&p_ptr->chp); rd_u16b(&p_ptr->chp_frac); rd_s16b(&p_ptr->msp); rd_s16b(&p_ptr->csp); rd_u16b(&p_ptr->csp_frac); rd_s16b(&p_ptr->max_lev); rd_s16b(&p_ptr->max_depth); /* Hack -- Repair maximum player level */ if (p_ptr->max_lev < p_ptr->lev) p_ptr->max_lev = p_ptr->lev; /* Hack -- Repair maximum dungeon level */ if (p_ptr->max_depth < 0) p_ptr->max_depth = 1; /* More info */ strip_bytes(8); rd_s16b(&p_ptr->sc); p_ptr->sc_birth = p_ptr->sc; strip_bytes(2); /* Read the flags */ rd_s16b(&p_ptr->food); rd_s16b(&p_ptr->energy); rd_s16b(&p_ptr->word_recall); rd_s16b(&p_ptr->state.see_infra); rd_byte(&p_ptr->confusing); rd_byte(&p_ptr->searching); /* Find the number of timed effects */ rd_byte(&num); if (num <= TMD_MAX) { /* Read all the effects */ for (i = 0; i < num; i++) rd_s16b(&p_ptr->timed[i]); /* Initialize any entries not read */ if (num < TMD_MAX) C_WIPE(p_ptr->timed + num, TMD_MAX - num, s16b); } else { /* Probably in trouble anyway */ for (i = 0; i < TMD_MAX; i++) rd_s16b(&p_ptr->timed[i]); /* Discard unused entries */ strip_bytes(2 * (num - TMD_MAX)); note("Discarded unsupported timed effects"); } /* Total energy used so far */ rd_u32b(&p_ptr->total_energy); /* # of turns spent resting */ rd_u32b(&p_ptr->resting_turn); /* Future use */ strip_bytes(32); return 0; } /* * Read squelch and autoinscription submenu for all known objects */ int rd_squelch(void) { size_t i; byte tmp8u = 24; u16b file_e_max; u16b inscriptions; /* Read how many squelch bytes we have */ rd_byte(&tmp8u); /* Check against current number */ if (tmp8u != squelch_size) { strip_bytes(tmp8u); } else { for (i = 0; i < squelch_size; i++) rd_byte(&squelch_level[i]); } /* Read the number of saved ego-item */ rd_u16b(&file_e_max); for (i = 0; i < file_e_max; i++) { if (i < z_info->e_max) { byte flags; /* Read and extract the flag */ rd_byte(&flags); e_info[i].everseen |= (flags & 0x02); } } /* Read the current number of auto-inscriptions */ rd_u16b(&inscriptions); /* Read the autoinscriptions array */ for (i = 0; i < inscriptions; i++) { char tmp[80]; s16b kidx; struct object_kind *k; rd_s16b(&kidx); k = objkind_byid(kidx); if (!k) quit_fmt("objkind_byid(%d) failed", kidx); rd_string(tmp, sizeof(tmp)); k->note = quark_add(tmp); } return 0; } int rd_misc(void) { byte tmp8u; /* Read the randart version */ strip_bytes(4); /* Read the randart seed */ rd_u32b(&seed_randart); /* Skip the flags */ strip_bytes(12); /* Hack -- the two "special seeds" */ rd_u32b(&seed_flavor); rd_u32b(&seed_town); /* Special stuff */ rd_u16b(&p_ptr->panic_save); rd_u16b(&p_ptr->total_winner); rd_u16b(&p_ptr->noscore); /* Read "death" */ rd_byte(&tmp8u); p_ptr->is_dead = tmp8u; /* Read "feeling" */ rd_byte(&tmp8u); cave->feeling = tmp8u; rd_s32b(&cave->created_at); /* Current turn */ rd_s32b(&turn); return 0; } int rd_misc_2(void) { byte tmp8u; u16b tmp16u; /* Read the randart version */ strip_bytes(4); /* Read the randart seed */ rd_u32b(&seed_randart); /* Skip the flags */ strip_bytes(12); /* Hack -- the two "special seeds" */ rd_u32b(&seed_flavor); rd_u32b(&seed_town); /* Special stuff */ rd_u16b(&p_ptr->panic_save); rd_u16b(&p_ptr->total_winner); rd_u16b(&p_ptr->noscore); /* Read "death" */ rd_byte(&tmp8u); p_ptr->is_dead = tmp8u; /* Read "feeling" */ rd_byte(&tmp8u); cave->feeling = tmp8u; rd_u16b(&tmp16u); cave->feeling_squares = tmp16u; rd_s32b(&cave->created_at); /* Current turn */ rd_s32b(&turn); return 0; } int rd_player_hp(void) { int i; u16b tmp16u; /* Read the player_hp array */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > PY_MAX_LEVEL) { note(format("Too many (%u) hitpoint entries!", tmp16u)); return (-1); } /* Read the player_hp array */ for (i = 0; i < tmp16u; i++) rd_s16b(&p_ptr->player_hp[i]); return 0; } int rd_player_spells(void) { int i; u16b tmp16u; int cnt; /* Read the number of spells */ rd_u16b(&tmp16u); if (tmp16u > PY_MAX_SPELLS) { note(format("Too many player spells (%d).", tmp16u)); return (-1); } /* Read the spell flags */ for (i = 0; i < tmp16u; i++) rd_byte(&p_ptr->spell_flags[i]); /* Read the spell order */ for (i = 0, cnt = 0; i < tmp16u; i++, cnt++) rd_byte(&p_ptr->spell_order[cnt]); /* Success */ return (0); } /* * Read the random artifacts, version 2 */ int rd_randarts_2(void) { size_t i, j, k; byte tmp8u; s16b tmp16s; u16b tmp16u; u16b artifact_count; s32b tmp32s; if (!OPT(birth_randarts)) { p_ptr->randarts = FALSE; return 0; } /* Read the number of artifacts */ rd_u16b(&artifact_count); /* Alive or cheating death or re-using randarts */ if (!p_ptr->is_dead || arg_wizard || (OPT(birth_randarts) && OPT(birth_keep_randarts))) { /* Incompatible save files */ if (artifact_count > z_info->a_max) { note(format("Too many (%u) random artifacts!", artifact_count)); return (-1); } /* Read the artifacts */ for (i = 0; i < artifact_count; i++) { artifact_type *a_ptr = &a_info[i]; u16b time_base, time_dice, time_sides; rd_byte(&a_ptr->tval); rd_byte(&a_ptr->sval); for (j = 0; j < MAX_PVALS; j++) rd_s16b(&a_ptr->pval[j]); rd_byte(&a_ptr->num_pvals); rd_s16b(&a_ptr->to_h); rd_s16b(&a_ptr->to_d); rd_s16b(&a_ptr->to_a); rd_s16b(&a_ptr->ac); rd_byte(&a_ptr->dd); rd_byte(&a_ptr->ds); rd_s16b(&a_ptr->weight); rd_s32b(&a_ptr->cost); for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) rd_byte(&a_ptr->flags[j]); if (j < OF_BYTES) strip_bytes(OF_BYTES - j); for (k = 0; k < MAX_PVALS; k++) { for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) rd_byte(&a_ptr->pval_flags[k][j]); if (j < OF_BYTES) strip_bytes(OF_BYTES - j); } rd_byte(&a_ptr->level); rd_byte(&a_ptr->rarity); rd_byte(&a_ptr->alloc_prob); rd_byte(&a_ptr->alloc_min); rd_byte(&a_ptr->alloc_max); rd_u16b(&a_ptr->effect); rd_u16b(&time_base); rd_u16b(&time_dice); rd_u16b(&time_sides); a_ptr->time.base = time_base; a_ptr->time.dice = time_dice; a_ptr->time.sides = time_sides; } /* Initialize only the randart names */ do_randart(seed_randart, FALSE); p_ptr->randarts = TRUE; /* Mark any stray old artifacts as "empty" */ if (artifact_count < z_info->a_max) { for (i = artifact_count; i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; a_ptr->name = 0; a_ptr->tval = 0; a_ptr->sval = 0; } } } else { /* Read the artifacts */ for (i = 0; i < artifact_count; i++) { rd_byte(&tmp8u); /* a_ptr->tval */ rd_byte(&tmp8u); /* a_ptr->sval */ for (j = 0; j < MAX_PVALS; j++) rd_s16b(&tmp16s); /* a_ptr->pval */ rd_s16b(&tmp16s); /* a_ptr->to_h */ rd_s16b(&tmp16s); /* a_ptr->to_d */ rd_s16b(&tmp16s); /* a_ptr->to_a */ rd_s16b(&tmp16s); /* a_ptr->ac */ rd_byte(&tmp8u); /* a_ptr->dd */ rd_byte(&tmp8u); /* a_ptr->ds */ rd_s16b(&tmp16s); /* a_ptr->weight */ rd_s32b(&tmp32s); /* a_ptr->cost */ for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) rd_byte(&tmp8u); if (j < OF_BYTES) strip_bytes(OF_BYTES - j); for (k = 0; k < MAX_PVALS; k++) { for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) rd_byte(&tmp8u); if (j < OF_BYTES) strip_bytes(OF_BYTES - j); } rd_byte(&tmp8u); /* a_ptr->level */ rd_byte(&tmp8u); /* a_ptr->rarity */ rd_byte(&tmp8u); /* a_ptr->alloc_prob */ rd_byte(&tmp8u); /* a_ptr->alloc_min */ rd_byte(&tmp8u); /* a_ptr->alloc_max */ rd_u16b(&tmp16u); /* a_ptr->effect */ rd_u16b(&tmp16u); /* a_ptr->time_base */ rd_u16b(&tmp16u); /* a_ptr->time_dice */ rd_u16b(&tmp16u); /* a_ptr->time_sides */ } p_ptr->randarts = FALSE; } return (0); } /* * Read the random artifacts - remove after 3.3 */ int rd_randarts_1(void) { size_t i, j; byte tmp8u; s16b tmp16s; u16b tmp16u; u16b artifact_count; s32b tmp32s; u32b tmp32u; if (!OPT(birth_randarts)) return 0; /* Read the number of artifacts */ rd_u16b(&artifact_count); /* Alive or cheating death */ if (!p_ptr->is_dead || arg_wizard) { /* Incompatible save files */ if (artifact_count > z_info->a_max) { note(format("Too many (%u) random artifacts!", artifact_count)); return (-1); } /* Read the artifacts */ for (i = 0; i < artifact_count; i++) { artifact_type *a_ptr = &a_info[i]; u16b time_base, time_dice, time_sides; rd_byte(&a_ptr->tval); rd_byte(&a_ptr->sval); rd_s16b(&a_ptr->pval[DEFAULT_PVAL]); rd_s16b(&a_ptr->to_h); rd_s16b(&a_ptr->to_d); rd_s16b(&a_ptr->to_a); rd_s16b(&a_ptr->ac); rd_byte(&a_ptr->dd); rd_byte(&a_ptr->ds); rd_s16b(&a_ptr->weight); rd_s32b(&a_ptr->cost); /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (j = 0; j < 12 && j < OF_SIZE; j++) rd_byte(&a_ptr->flags[j]); if (j < 12) strip_bytes(OF_SIZE - j); rd_byte(&a_ptr->level); rd_byte(&a_ptr->rarity); rd_byte(&a_ptr->alloc_prob); rd_byte(&a_ptr->alloc_min); rd_byte(&a_ptr->alloc_max); rd_u16b(&a_ptr->effect); rd_u16b(&time_base); rd_u16b(&time_dice); rd_u16b(&time_sides); a_ptr->time.base = time_base; a_ptr->time.dice = time_dice; a_ptr->time.sides = time_sides; } /* Initialize only the randart names */ do_randart(seed_randart, FALSE); /* Mark any stray old artifacts as "empty" */ if (artifact_count < z_info->a_max) { for (i = artifact_count; i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; a_ptr->name = 0; a_ptr->tval = 0; a_ptr->sval = 0; } } } else { /* Read the artifacts */ for (i = 0; i < artifact_count; i++) { rd_byte(&tmp8u); /* a_ptr->tval */ rd_byte(&tmp8u); /* a_ptr->sval */ rd_s16b(&tmp16s); /* a_ptr->pval */ rd_s16b(&tmp16s); /* a_ptr->to_h */ rd_s16b(&tmp16s); /* a_ptr->to_d */ rd_s16b(&tmp16s); /* a_ptr->to_a */ rd_s16b(&tmp16s); /* a_ptr->ac */ rd_byte(&tmp8u); /* a_ptr->dd */ rd_byte(&tmp8u); /* a_ptr->ds */ rd_s16b(&tmp16s); /* a_ptr->weight */ rd_s32b(&tmp32s); /* a_ptr->cost */ rd_u32b(&tmp32u); /* a_ptr->flags1 */ rd_u32b(&tmp32u); /* a_ptr->flags2 */ rd_u32b(&tmp32u); /* a_ptr->flags3 */ rd_byte(&tmp8u); /* a_ptr->level */ rd_byte(&tmp8u); /* a_ptr->rarity */ rd_byte(&tmp8u); /* a_ptr->alloc_prob */ rd_byte(&tmp8u); /* a_ptr->alloc_min */ rd_byte(&tmp8u); /* a_ptr->alloc_max */ rd_u16b(&tmp16u); /* a_ptr->effect */ rd_u16b(&tmp16u); /* a_ptr->time_base */ rd_u16b(&tmp16u); /* a_ptr->time_dice */ rd_u16b(&tmp16u); /* a_ptr->time_sides */ } } return (0); } /** * Read the player inventory * * Note that the inventory is re-sorted later by dungeon(). */ static int rd_inventory(rd_item_t rd_item_version) { int slot = 0; object_type *i_ptr; object_type object_type_body; /* Read until done */ while (1) { u16b n; /* Get the next item index */ rd_u16b(&n); /* Nope, we reached the end */ if (n == 0xFFFF) break; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Read the item */ if ((*rd_item_version)(i_ptr)) { note("Error reading item"); return (-1); } /* Hack -- verify item */ if (!i_ptr->kind) continue; /* Verify slot */ if (n >= ALL_INVEN_TOTAL) return (-1); /* Wield equipment */ if (n >= INVEN_WIELD) { /* Copy object */ object_copy(&p_ptr->inventory[n], i_ptr); /* Add the weight */ p_ptr->total_weight += (i_ptr->number * i_ptr->weight); /* One more item */ p_ptr->equip_cnt++; } /* Warning -- backpack is full */ else if (p_ptr->inven_cnt == INVEN_PACK) { /* Oops */ note("Too many items in the inventory!"); /* Fail */ return (-1); } /* Carry inventory */ else { /* Get a slot */ n = slot++; /* Copy object */ object_copy(&p_ptr->inventory[n], i_ptr); /* Add the weight */ p_ptr->total_weight += (i_ptr->number * i_ptr->weight); /* One more item */ p_ptr->inven_cnt++; } } save_quiver_size(p_ptr); /* Success */ return (0); } /* * Read the player inventory - wrapper functions */ int rd_inventory_4(void) { return rd_inventory(rd_item_4); } int rd_inventory_3(void) { return rd_inventory(rd_item_3); } int rd_inventory_2(void) { return rd_inventory(rd_item_2); } /* remove post-3.3 */ int rd_inventory_1(void) { return rd_inventory(rd_item_1); } /* remove post-3.3 */ /* Read store contents */ static int rd_stores(rd_item_t rd_item_version) { int i; u16b tmp16u; /* Read the stores */ rd_u16b(&tmp16u); for (i = 0; i < tmp16u; i++) { struct store *st_ptr = &stores[i]; int j; byte own, num; /* XXX */ strip_bytes(6); /* Read the basic info */ rd_byte(&own); rd_byte(&num); /* XXX */ strip_bytes(4); /* XXX: refactor into store.c */ st_ptr->owner = store_ownerbyidx(st_ptr, own); /* Read the items */ for (j = 0; j < num; j++) { object_type *i_ptr; object_type object_type_body; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Read the item */ if ((*rd_item_version)(i_ptr)) { note("Error reading item"); return (-1); } if (i != STORE_HOME) i_ptr->ident |= IDENT_STORE; /* Accept any valid items */ if (st_ptr->stock_num < STORE_INVEN_MAX && i_ptr->kind) { int k = st_ptr->stock_num++; /* Accept the item */ object_copy(&st_ptr->stock[k], i_ptr); } } } return 0; } /* * Read the stores - wrapper functions */ int rd_stores_4(void) { return rd_stores(rd_item_4); } int rd_stores_3(void) { return rd_stores(rd_item_3); } int rd_stores_2(void) { return rd_stores(rd_item_2); } /* remove post-3.3 */ int rd_stores_1(void) { return rd_stores(rd_item_1); } /* remove post-3.3 */ /* * Read the dungeon * * The monsters/objects must be loaded in the same order * that they were stored, since the actual indexes matter. * * Note that the size of the dungeon is now hard-coded to * DUNGEON_HGT by DUNGEON_WID, and any dungeon with another * size will be silently discarded by this routine. * * Note that dungeon objects, including objects held by monsters, are * placed directly into the dungeon, using "object_copy()", which will * copy "iy", "ix", and "held_m_idx", leaving "next_o_idx" blank for * objects held by monsters, since it is not saved in the savefile. * * After loading the monsters, the objects being held by monsters are * linked directly into those monsters. */ int rd_dungeon(void) { int i, y, x; s16b depth; s16b py, px; s16b ymax, xmax; byte count; byte tmp8u; u16b tmp16u; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /*** Basic info ***/ /* Header info */ rd_s16b(&depth); rd_u16b(&daycount); rd_s16b(&py); rd_s16b(&px); rd_s16b(&ymax); rd_s16b(&xmax); rd_u16b(&tmp16u); rd_u16b(&tmp16u); /* Ignore illegal dungeons */ if ((depth < 0) || (depth >= MAX_DEPTH)) { note(format("Ignoring illegal dungeon depth (%d)", depth)); return (0); } cave->width = xmax; cave->height = ymax; /* Ignore illegal dungeons */ if ((px < 0) || (px >= DUNGEON_WID) || (py < 0) || (py >= DUNGEON_HGT)) { note(format("Ignoring illegal player location (%d,%d).", py, px)); return (1); } /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < DUNGEON_HGT; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Extract "info" */ cave->info[y][x] = tmp8u; /* Advance/Wrap */ if (++x >= DUNGEON_WID) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= DUNGEON_HGT) break; } } } /* Load the dungeon data */ for (x = y = 0; y < DUNGEON_HGT; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Extract "info" */ cave->info2[y][x] = tmp8u; /* Advance/Wrap */ if (++x >= DUNGEON_WID) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= DUNGEON_HGT) break; } } } /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < DUNGEON_HGT; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Extract "feat" */ cave_set_feat(cave, y, x, tmp8u); /* Advance/Wrap */ if (++x >= DUNGEON_WID) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= DUNGEON_HGT) break; } } } /*** Player ***/ /* Load depth */ p_ptr->depth = depth; /* Place player in dungeon */ player_place(cave, p_ptr, py, px); /*** Success ***/ /* The dungeon is ready */ character_dungeon = TRUE; #if 0 /* Regenerate town in old versions */ if (p_ptr->depth == 0) character_dungeon = FALSE; #endif return 0; } /* Read the floor object list */ static int rd_objects(rd_item_t rd_item_version) { int i; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the item count */ rd_u16b(&limit); /* Verify maximum */ if (limit > z_info->o_max) { note(format("Too many (%d) object entries!", limit)); return (-1); } /* Read the dungeon items */ for (i = 1; i < limit; i++) { object_type *i_ptr; object_type object_type_body; s16b o_idx; object_type *o_ptr; /* Get the object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Read the item */ if ((*rd_item_version)(i_ptr)) { note("Error reading item"); return (-1); } /* Make an object */ o_idx = o_pop(); /* Paranoia */ if (o_idx != i) { note(format("Cannot place object %d!", i)); return (-1); } /* Get the object */ o_ptr = object_byid(o_idx); /* Structure Copy */ object_copy(o_ptr, i_ptr); /* Dungeon floor */ if (!i_ptr->held_m_idx) { int x = i_ptr->ix; int y = i_ptr->iy; /* ToDo: Verify coordinates */ /* Link the object to the pile */ o_ptr->next_o_idx = cave->o_idx[y][x]; /* Link the floor to the object */ cave->o_idx[y][x] = o_idx; } } return 0; } /* * Read the object list - wrapper functions */ int rd_objects_4(void) { return rd_objects(rd_item_4); } int rd_objects_3(void) { return rd_objects(rd_item_3); } int rd_objects_2(void) { return rd_objects(rd_item_2); } /* remove post-3.3 */ int rd_objects_1(void) { return rd_objects(rd_item_1); } /* remove post-3.3 */ /** * Read monsters (old version - before MON_TMD_FOO) * - remove after 3.3 */ int rd_monsters_1(void) { int i; u16b limit; byte tmp; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&m_ptr->r_idx); rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_s16b(&m_ptr->m_timed[MON_TMD_SLEEP]); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); rd_byte(&tmp); m_ptr->m_timed[MON_TMD_STUN] = tmp; rd_byte(&tmp); m_ptr->m_timed[MON_TMD_CONF] = tmp; rd_byte(&tmp); m_ptr->m_timed[MON_TMD_FEAR] = tmp; strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Ignore dungeon objects */ if (!o_ptr->held_m_idx) continue; /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } return 0; } /** * Read monsters (MON_TMD_MAX = 4) */ int rd_monsters_2(void) { int i, j; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&m_ptr->r_idx); rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); for (j = 0; j < 4; j++) rd_s16b(&m_ptr->m_timed[j]); strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Ignore dungeon objects */ if (!o_ptr->held_m_idx) continue; /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } return 0; } /** * Read monsters (MON_TMD_MAX = 4, new "unaware" setting) */ int rd_monsters_3(void) { int i, j; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; byte flags; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&m_ptr->r_idx); rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); for (j = 0; j < 4; j++) rd_s16b(&m_ptr->m_timed[j]); /* Read and extract the flag */ rd_byte(&flags); m_ptr->unaware = (flags & 0x01) ? TRUE : FALSE; strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Ignore dungeon objects */ if (!o_ptr->held_m_idx) continue; /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } return 0; } /** * Read monsters (MON_TMD_MAX = variable) */ int rd_monsters_4(void) { int i, j; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; byte flags; byte tmp8u; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&m_ptr->r_idx); rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); rd_byte(&tmp8u); for (j = 0; j < tmp8u; j++) rd_s16b(&m_ptr->m_timed[j]); /* Read and extract the flag */ rd_byte(&flags); m_ptr->unaware = (flags & 0x01) ? TRUE : FALSE; strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Ignore dungeon objects */ if (!o_ptr->held_m_idx) continue; /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } return 0; } /** * Read monsters (added m_ptr->known_pflags) */ int rd_monsters_5(void) { int i; size_t j; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; byte flags; byte tmp8u; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&m_ptr->r_idx); rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); rd_byte(&tmp8u); for (j = 0; j < tmp8u; j++) rd_s16b(&m_ptr->m_timed[j]); /* Read and extract the flag */ rd_byte(&flags); m_ptr->unaware = (flags & 0x01) ? TRUE : FALSE; for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) rd_byte(&m_ptr->known_pflags[j]); if (j < OF_BYTES) strip_bytes(OF_BYTES - j); strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Ignore dungeon objects */ if (!o_ptr->held_m_idx) continue; /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } return 0; } /** * Read monsters (added m_ptr->mimicked_o_idx) */ int rd_monsters_6(void) { int i; size_t j; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; byte flags; byte tmp8u; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&m_ptr->r_idx); rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); rd_byte(&tmp8u); for (j = 0; j < tmp8u; j++) rd_s16b(&m_ptr->m_timed[j]); /* Read and extract the flag */ rd_byte(&flags); m_ptr->unaware = (flags & 0x01) ? TRUE : FALSE; for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) rd_byte(&m_ptr->known_pflags[j]); if (j < OF_BYTES) strip_bytes(OF_BYTES - j); strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Check for mimics */ if (o_ptr->mimicking_m_idx) { /* Verify monster index */ if (o_ptr->mimicking_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->mimicking_m_idx); /* Link the monster to the object */ m_ptr->mimicked_o_idx = i; } else if (o_ptr->held_m_idx) { /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } else continue; } return 0; } int rd_ghost(void) { char buf[64]; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* XXX */ /* Strip name */ rd_string(buf, 64); /* Strip old data */ strip_bytes(60); return 0; } int rd_history(void) { u32b tmp32u; size_t i; history_clear(); rd_u32b(&tmp32u); for (i = 0; i < tmp32u; i++) { s32b turn; s16b dlev, clev; u16b type; byte art_name; char text[80]; rd_u16b(&type); rd_s32b(&turn); rd_s16b(&dlev); rd_s16b(&clev); rd_byte(&art_name); rd_string(text, sizeof(text)); history_add_full(type, &a_info[art_name], dlev, clev, turn, text); } return 0; } angband-v3.3.2/src/gtk/0000755000175000017500000000000011651552410014163 5ustar chriscchriscangband-v3.3.2/src/gtk/main-gtk.h0000644000175000017500000003150311651552410016045 0ustar chriscchrisc/* * File: main-gtk.h * Purpose: Header file for the GTK port for Angband * * Copyright (c) 2000-2007 Robert Ruehlmann, Shanoah Alkire * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/tvalsval.h" #ifndef INCLUDED_MAIN_GTK_H #define INCLUDED_MAIN_GTK_H #define USE_PANGO #define USE_CAIRO_UTILS #include "main.h" #include "cairo-utils.h" #include "game-cmd.h" #include "game-event.h" #include "option.h" #include #include #include #include #define MAX_TERM_DATA 8 #define MAX_XTRA_WIN_DATA 6 #define USE_GRAPHICS #define MAIN_WINDOW(td) (td == &data[0]) #define GENERAL_PREFS 0 #define TERM_PREFS 1 #define XTRA_WIN_PREFS 2 /*#define USE_GUI_SELECTION*/ typedef struct term_data term_data; typedef struct xtra_win_data xtra_win_data; /* * Extra data to associate with each "window" * * Each "window" is represented by a "term_data" structure, which * contains a "term" structure, which contains a pointer (t->data) * back to the term_data structure. */ struct term_data { term t; const char *name; int number; bool visible, initialized; int rows; int cols; point location; measurements size; /* of the window */ measurements tile, actual; cairo_surface_t *surface; cairo_matrix_t matrix; font_info font; GtkWidget *win; GtkWidget *drawing_area; GtkWidget *menu_item; }; struct xtra_win_data { int x; const char *name, *win_name, *text_view_name, *item_name, *drawing_area_name, *font_button_name; bool visible; font_info font; GtkWidget *win, *text_view, *menu, *drawing_area; GtkTextBuffer *buf; cairo_t *cr; cairo_surface_t *surface; measurements size; point location; game_event_type event; }; static game_event_type xtra_events[]= { EVENT_MESSAGE, EVENT_INVENTORY, EVENT_EQUIPMENT, EVENT_MONSTERLIST, 0, EVENT_PLAYERTITLE }; GdkColor black = { 0, 0x0000, 0x0000, 0x0000 }; GdkColor white = { 0, 0xffff, 0xffff, 0xffff }; char xtra_names[MAX_XTRA_WIN_DATA][20] = { "Messages", "Inventory", "Equipment", "Monster List", "Debug", "Status" }; char xtra_win_names[MAX_XTRA_WIN_DATA][20] = { "message_window", "inv_window", "equip_window", "monst_list_window", "debug_window", "status_window" }; char xtra_text_names[MAX_XTRA_WIN_DATA][20] = { "message_text", "inv_text", "equip_text", "monst_list_text", "debug_text", "status_text" }; char xtra_drawing_names[MAX_XTRA_WIN_DATA][24] = { "message_drawing_area", "inv_drawing_area", "equip_drawing_area", "monst_list_drawing_area", "debug_drawing_area", "status_drawing_area" }; char xtra_menu_names[MAX_XTRA_WIN_DATA][20] = { "message_item", "inv_item", "equip_item", "monst_list_item", "debug_item", "status_item" }; char xtra_font_button_names[MAX_XTRA_WIN_DATA][20] = { "message_font", "inv_font", "equip_font", "monst_list_font", "debug_font", "status_font" }; char sidebar_text[24][20] = { "","","","","Level:", "XP: ", "Gold:", "", "STR:", "INT:", "WIS:", "DEX:", "CON:", "CHR:", "", "AC:", "HP:", "", "SP:", "", "","", "", "" }; /* * An array of "term_data" structures, one for each "sub-window" */ static term_data data[MAX_TERM_DATA]; /* * A similar array for my extra, non-term windows. */ static xtra_win_data xdata[MAX_XTRA_WIN_DATA]; /* An array of graphic menu items */ /*static GtkWidget *graphics_item[4];*/ static GtkWidget *big_tile_item; /* * There are a few functions installed to be triggered by several * of the basic player events. For convenience, these have been grouped * in this list that I swiped from xtra3.c. These really should be in one of the * headers, shouldn't they? */ static game_event_type my_player_events[] = { EVENT_RACE_CLASS, EVENT_PLAYERTITLE, EVENT_EXPERIENCE, EVENT_PLAYERLEVEL, EVENT_GOLD, EVENT_EQUIPMENT, /* For equippy chars */ EVENT_STATS, EVENT_HP, EVENT_MANA, EVENT_AC, EVENT_MONSTERHEALTH, EVENT_PLAYERSPEED, EVENT_DUNGEONLEVEL, }; static game_event_type my_statusline_events[] = { EVENT_STUDYSTATUS, EVENT_STATUS, EVENT_DETECTIONSTATUS, EVENT_STATE, }; /* Various variables */ static void save_prefs(void); static bool ignore_prefs = FALSE; static bool game_in_progress = FALSE; static int num_term = 8; /* Command line help */ const char help_gtk[] = "GTK for X11, subopts -n, -i to ignore prefs, and standard GTK options"; /* Path to the Gtk settings file */ static char settings[1024]; bool game_saved; static GtkWidget *toolbar; static GtkWidget *toolbar_items[12]; static int toolbar_size; static unsigned char toolbar_keypress[12]; /* Abstracted out for future changes */ static int max_win_width(term_data *td); static int max_win_height(term_data *td); /* * Find the square a particular pixel is part of. */ static void pixel_to_square(int * const x, int * const y, const int ox, const int oy); void set_term_matrix(term_data *td); /* Cairo's rect type to Gdks */ static GdkRectangle cairo_rect_to_gdk(cairo_rectangle_t *r); /* And vice-versa */ static cairo_rectangle_t gdk_rect_to_cairo(GdkRectangle *r); /* Mark part of a window as invalid, so it gets redrawn */ static void invalidate_drawing_area(GtkWidget *widget, cairo_rectangle_t r); /* Get the position of a term window when it changes */ gboolean configure_event_handler(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data); /* Get the position of an extra window when it changes */ gboolean xtra_configure_event_handler(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data); /* Set the window geometry */ static void set_window_defaults(term_data *td); /* Set the term window size */ static void set_window_size(term_data *td); /* Set the extra window size */ static void set_xtra_window_size(xtra_win_data *xd); /* If a term window is shown, do a few checks */ gboolean show_event_handler(GtkWidget *widget, GdkEventExpose *event, gpointer user_data); /* Erase the whole term. */ static errr Term_clear_gtk(void); /* Erase some characters. */ static errr Term_wipe_gtk(int x, int y, int n); /* Draw some textual characters. */ static errr Term_text_gtk(int x, int y, int n, byte a, const char *s); /* Draw pretty pictures instead. */ static errr Term_pict_gtk(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp); /* Do gtk things */ static errr Term_flush_gtk(void); /* Refresh things */ static errr Term_fresh_gtk(void); /* Handle a "special request" */ static errr Term_xtra_gtk(int n, int v); /* Draw the cursor */ static errr Term_curs_gtk(int x, int y); /* * Hack -- redraw a term_data * * Note that "Term_redraw()" calls "TERM_XTRA_CLEAR" */ static void term_data_redraw(term_data *td); /* Check for events - Traditional */ static errr CheckEvent(bool wait); /* Save the game */ static bool save_game_gtk(void); /* Quit the game - from Angband */ static void hook_quit(const char *str); /* Quit the game - from Gtk */ gboolean quit_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data); /* Kill the Kin... err... the game */ gboolean destroy_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data); /* Hide away, term windows */ gboolean hide_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data); /* Hide away, extra windows */ gboolean xtra_hide_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data); /* Huzzah! A new game. */ gboolean new_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data); /* Given a term window and font, load the font */ static void load_font_by_name(term_data *td, const char *font_name); /* Set the name of a font for a term window and load it. */ void set_term_font(GtkFontButton *widget, gpointer user_data); /* Set the name of a font for an extra window and load it. */ void set_xtra_font(GtkFontButton *widget, gpointer user_data); /* Filter function for the savefile list */ static gboolean file_open_filter(const GtkFileFilterInfo *filter_info, gpointer data); /* Open/Save Dialog box */ static bool save_dialog_box(bool save); /* Open a saved game */ void open_event_handler(GtkButton *was_clicked, gpointer user_data); /* Save the game */ gboolean save_event_handler(GtkWidget *widget, GdkEvent *event, gpointer user_data); /* Save the game before deleting? */ gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, gpointer user_data); /* Register keypresses */ gboolean keypress_event_handler(GtkWidget *widget, GdkEventKey *event, gpointer user_data); /* Prefs - copied straight from main-x11.c and hacked. */ static void save_prefs(void); /* Util functions for prefs */ static int check_env_i(char* name, int i, int dfault); static int get_value(const char *buf); static void load_term_prefs(); /* Load the prefs */ static void load_prefs(); /* Register a mouse click */ gboolean on_mouse_click(GtkWidget *widget, GdkEventButton *event, gpointer user_data); /* Redraw a term window */ gboolean expose_event_handler(GtkWidget *widget, GdkEventExpose *event, gpointer user_data); /* Hide the options window */ gboolean hide_options(GtkWidget *widget, GdkEvent *event, gpointer user_data); /* Toggle the appropriate checkmark for a term menu */ gboolean toggle_term_window(GtkWidget *widget, GdkEvent *event, gpointer user_data); /* Toggle the appropriate checkmark for the exra menu */ gboolean toggle_xtra_window(GtkWidget *widget, GdkEvent *event, gpointer user_data); /* Set up graphics */ static void init_graf(int g); /* Initially choose arg_graphics */ static void setup_graphics_menu(); /* Hooks for graphics menu items */ gboolean on_graphics_activate(GtkWidget *widget, GdkEventExpose *event, gpointer user_data); /* Make text views "Angbandy" */ static void white_on_black_textview(xtra_win_data *xd); /* Init data for extra windows */ static void xtra_data_init(xtra_win_data *xd, int i); /* Init the windows themselves */ static void init_xtra_windows(void); /* Init the rest of the windows */ static void init_gtk_windows(void); /* Show everything */ static void show_windows(); /* Init the term window data */ static errr term_data_init(term_data *td, int i); /* Stubs */ static void handle_map(game_event_type type, game_event_data *data, void *user); static void handle_moved(game_event_type type, game_event_data *data, void *user); static void handle_mons_target(game_event_type type, game_event_data *data, void *user); /* Set up color tags for all the angband colors. */ static void init_color_tags(xtra_win_data *xd); /* Put text in a textview without a \n */ static void text_view_put(xtra_win_data *xd, const char *str, byte color); /* Put text in a textview with a \n */ static void text_view_print(xtra_win_data *xd, const char *str, byte color); /* plog_fmt reborn */ void gtk_log_fmt(byte c, const char *fmt, ...); /* Update our own personal message window. */ static void handle_message(game_event_type type, game_event_data *data, void *user); /* Return the last inventory slot. */ static int last_inv_slot(void); /* Return an inventory slot */ static void inv_slot(char *str, size_t len, int i, bool equip); /* Print the inventory */ static void handle_inv(game_event_type type, game_event_data *data, void *user); /* Print the equipment list */ static void handle_equip(game_event_type type, game_event_data *data, void *user); /* Print the monster window */ static void handle_mons_list(game_event_type type, game_event_data *data, void *user); /* Print the sidebar */ static void handle_sidebar(game_event_type type, game_event_data *data, void *user); static void glog(const char *fmt, ...); /* More Stubs */ static void handle_init_status(game_event_type type, game_event_data *data, void *user); static void handle_birth(game_event_type type, game_event_data *data, void *user); static void handle_game(game_event_type type, game_event_data *data, void *user); static void handle_store(game_event_type type, game_event_data *data, void *user); static void handle_death(game_event_type type, game_event_data *data, void *user); static void handle_end(game_event_type type, game_event_data *data, void *user); static void handle_splash(game_event_type type, game_event_data *data, void *user); static void handle_statusline(game_event_type type, game_event_data *data, void *user); /* init the handlers */ static void init_handlers(); /* Init gtk */ errr init_gtk(int argc, char **argv); /* Nuke things */ static void xtra_data_destroy(xtra_win_data *xd); static void term_data_destroy(term_data *td); static void release_memory(); static void force_redraw(); /* From xtra3.h */ extern byte monster_health_attr(); #endif /* INCLUDED_MAIN_GTK_H */ angband-v3.3.2/src/gtk/Makefile0000644000175000017500000000005711651552410015625 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk angband-v3.3.2/src/gtk/cairo-utils.h0000644000175000017500000000516411651552410016575 0ustar chriscchrisc/* * File: main-cairo.h * Purpose: Cairo calls header for use in Angband ports * (Currently for the Gtk port, but should be reusable.) * * Copyright (c) 2000-2007 Robert Ruehlmann, Shanoah Alkire * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #ifndef INCLUDED_CAIRO_UTILS_H #define INCLUDED_CAIRO_UTILS_H #include "cairo.h" #include typedef struct font_info font_info; typedef struct loc point; typedef struct measurements measurements; struct font_info { char name[256], family[256]; int w,h, descent, size; }; struct measurements { int w,h; }; cairo_surface_t* graphical_tiles; cairo_pattern_t *tile_pattern; cairo_matrix_t matrix; /* Set the current color */ extern void set_foreground_color(cairo_t *cr, byte a); /* Set up a cairo rectangle easily */ extern void init_cairo_rect(cairo_rectangle_t *r, int x, int y, int w, int h); /* Use it as a cairo rectangle */ extern void c_rect(cairo_t *cr, cairo_rectangle_t r); extern cairo_matrix_t cairo_font_scaling(cairo_surface_t *surface, double tile_w, double tile_h, double font_w, double font_h); extern void cairo_clear(cairo_surface_t *surface, cairo_rectangle_t r, byte c); extern void cairo_cursor(cairo_surface_t *surface, cairo_rectangle_t r, byte c); extern void draw_tile(cairo_t *cr, cairo_matrix_t m, cairo_rectangle_t r, int tx, int ty); extern void draw_tiles( cairo_surface_t *surface, int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp, font_info *font, measurements *actual, measurements *tile); extern void cairo_draw_from_surface(cairo_t *cr, cairo_surface_t *surface, cairo_rectangle_t r); extern void init_cairo(cairo_t *cr, cairo_surface_t *surface, measurements size); extern void get_font_size(font_info *font); extern void draw_text(cairo_surface_t *surface, font_info *font, measurements *actual, int x, int y, int n, byte a, const char *s); extern void drawn_progress_bar(cairo_surface_t *surface, font_info *font, int x, int y, float curr, float max, byte color, int size); extern void get_toy_font_size(font_info *font); extern void draw_toy_text(cairo_t *cr, font_info *font, measurements *actual, int x, int y, int n, byte a, const char *s); #endif /* INCLUDED_CAIRO_UTILS_H*/ angband-v3.3.2/src/gtk/main-gtk.c0000644000175000017500000020137411651552410016045 0ustar chriscchrisc/* * File: main-gtk.c * Purpose: GTK port for Angband * * Copyright (c) 2000-2007 Robert Ruehlmann, Shanoah Alkire * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "player/player.h" #ifdef USE_GTK #include "main-gtk.h" #include "textui.h" #include "files.h" #include "init.h" /* this is used to draw the various terrain characters */ static unsigned int graphics_table[32] = { 000, '*', '#', '?', '?', '?', '?', '.', '+', '?', '?', '+', '+', '+', '+', '+', '~', '-', '-', '-', '_', '+', '+', '+', '+', '|', '?', '?', '?', '?', '?', '.', }; iconv_t conv; /* *Add a bunch of debugger message, to trace where problems are. */ /*#define GTK_DEBUG*/ /* *Write all debugger messages to the command line, as well as the debugger window. */ #define VERBOSE_DEBUG #ifdef GTK_DEBUG static void surface_status(const char *function_name, term_data *td) { if (td->surface == NULL) glog("No Surface for %s in '%s'", function_name, td->name); else if (cairo_surface_status(td->surface) != CAIRO_STATUS_SUCCESS) glog("%s: Surface status for '%s': %s",function_name,td->name, cairo_status_to_string(cairo_surface_status(td->surface))); } #endif /*#define USE_GTK_BUILDER*/ #ifdef USE_GTK_BUILDER #define GTK_XML "angband.xml" static GtkWidget *get_widget(GtkBuilder *xml, const char *name) { return GTK_WIDGET(gtk_builder_get_object(xml, name)); } static GtkBuilder *get_gtk_xml(const char *buf, const char *secondary) { GtkBuilder *xml; int e = 0; xml = gtk_builder_new(); e = gtk_builder_add_from_file (xml, buf, NULL); return xml; } #else #define GTK_XML "angband.glade" static GtkWidget *get_widget(GladeXML *xml, const char *name) { return GTK_WIDGET(glade_xml_get_widget(xml, name)); } static GladeXML *get_gtk_xml(const char *buf, const char *secondary) { return glade_xml_new(buf, secondary, NULL); } #endif static void recreate_surface(term_data *td) { if ((td->drawing_area != NULL) && (cairo_surface_get_reference_count(td->surface) > 0)) { cairo_surface_destroy(td->surface); } td->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, td->size.w, td->size.h); set_term_matrix(td); } static void set_term_menu(int number, bool value) { term_data *td = &data[number]; if (td->menu_item != NULL) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(td->menu_item), value); } static bool get_term_menu(int number) { bool value = FALSE; term_data *td = &data[number]; if (td->menu_item != NULL) value = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(td->menu_item)); return value; } static int xtra_window_from_name(const char *s) { xtra_win_data *xd; int i = 0,t = -1; for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { xd = &xdata[i]; if (GTK_IS_WIDGET(xd->win) && (xd->win != NULL) && (s == gtk_widget_get_name(xd->win)) ) t = i; } return(t); } static int xtra_window_from_drawing_area(const char *s) { xtra_win_data *xd; int i = 0,t = -1; for (i = 0; i < MAX_XTRA_WIN_DATA; i ++) { xd = &xdata[i]; if ((xd->drawing_area != NULL) && (s == gtk_widget_get_name(xd->drawing_area))) t = i; } return(t); } static int xtra_window_from_widget(GtkWidget *widget) { return xtra_window_from_name(gtk_widget_get_name(widget)); } static int td_from_name(const char *s, const char *pattern) { int t = -1; sscanf(s, pattern, &t); return(t); } static int term_window_from_name(const char *s) { return td_from_name(s, "term_window_%d"); } static int td_from_widget(GtkWidget *widget, const char *pattern) { return td_from_name(gtk_widget_get_name(widget), pattern); } static int term_window_from_widget(GtkWidget *widget) { return term_window_from_name(gtk_widget_get_name(widget)); } static int max_win_width(term_data *td) { return (255 * td->font.w); } static int max_win_height(term_data *td) { return(255 * td->font.h); } static int row_in_pixels(term_data *td, int x) { return(x * td->font.w); } static int col_in_pixels(term_data *td, int y) { return(y * td->font.h); } /* * Find the square a particular pixel is part of. */ static void pixel_to_square(int * const x, int * const y, const int ox, const int oy) { term_data *td = (term_data*)(Term->data); (*x) = (ox / td->font.w); (*y) = (oy / td->font.h); } void set_term_matrix(term_data *td) { /* Get a matrix set up to scale the graphics. */ if ((td->surface != NULL) && (td->visible)) matrix = cairo_font_scaling(td->surface, td->tile.w, td->tile.h, td->actual.w, td->actual.h); } gboolean on_big_tiles(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { term_data *td = &data[0]; if ((widget != NULL) && (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))) tile_width = 1; else tile_width = 2; load_font_by_name(td, td->font.name); term_data_redraw(td); return(TRUE); } static GdkRectangle cairo_rect_to_gdk(cairo_rectangle_t *r) { GdkRectangle s; s.x = r->x; s.y = r->y; s.width = r->width; s.height = r->height; return(s); } static cairo_rectangle_t gdk_rect_to_cairo(GdkRectangle *r) { cairo_rectangle_t s; s.x = r->x; s.y = r->y; s.width = r->width; s.height = r->height; return(s); } static void invalidate_drawing_area(GtkWidget *widget, cairo_rectangle_t r) { GdkRectangle s; s = cairo_rect_to_gdk(&r); if (widget->window != NULL) { gdk_window_invalidate_rect(widget->window, &s, TRUE); } } void set_row_and_cols(term_data *td) { int cols = td->cols; int rows = td->rows; td->cols = td->size.w / td->font.w; td->rows= td->size.h / td->font.h; if (MAIN_WINDOW(td)) { if (td->cols < 80) td->cols = cols; if (td->rows < 24) td->rows = rows; } if ((cols != td->cols) || (rows != td->rows)) { recreate_surface(td); term_data_redraw(td); } } static void redraw_term(term_data *td) { set_window_size(td); recreate_surface(td); term_data_redraw(td); force_redraw(); } gboolean set_term_row(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { int t = td_from_widget(widget, "row_%d"); if (t != -1) { term_data *td = &data[t]; td->rows = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); redraw_term(td); } return(FALSE); } gboolean set_term_col(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { int t = td_from_widget(widget, "col_%d"); if (t != -1) { term_data *td = &data[t]; td->cols = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); redraw_term(td); } return(FALSE); } /* * Get the position of the window and save it. */ gboolean configure_event_handler(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { int t = -1; term_data *td; t = term_window_from_widget(widget); if (t != -1) { td = &data[t]; if (td->initialized) { int x = 0, y = 0, w = 0, h = 0; GdkRectangle r; gdk_window_get_frame_extents(td->win->window, &r); x = r.x; y = r.y; gtk_window_get_size(GTK_WINDOW(td->win), &w, &h); td->location.x = x; td->location.y = y; if (w != 0) td->size.w = w; if (h != 0) td->size.h = h; } } return(FALSE); } gboolean xtra_configure_event_handler(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { xtra_win_data *xd; int t; t = xtra_window_from_widget(widget); if (t != -1) { int x = 0, y = 0, w = 0, h = 0; GdkRectangle r; xd = &xdata[t]; if (GTK_WIDGET_VISIBLE(xd->win)) { gdk_window_get_frame_extents(xd->win->window, &r); x = r.x; y = r.y; gtk_window_get_size(GTK_WINDOW(xd->win), &w, &h); xd->location.x = x; xd->location.y = y; if (w != 0) xd->size.w = w; if (h != 0) xd->size.h = h; xd->visible = TRUE; } else xd->visible = FALSE; } return(FALSE); } static void set_window_defaults(term_data *td) { GdkGeometry geo; geo.width_inc = td->font.w; geo.height_inc = td->font.h; geo.max_width =(td->font.w * td->cols); geo.max_height = (td->font.h * td->rows); if (MAIN_WINDOW(td)) { geo.min_width = geo.max_width; geo.min_height = geo.max_height; } else { geo.min_width = td->font.w; geo.min_height = td->font.h; } gtk_window_set_geometry_hints(GTK_WINDOW(td->win), td->drawing_area, &geo, GDK_HINT_RESIZE_INC | GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE); } static void set_window_size(term_data *td) { set_window_defaults(td); gtk_window_set_position(GTK_WINDOW(td->win),GTK_WIN_POS_NONE); if MAIN_WINDOW(td) { gtk_widget_set_size_request(GTK_WIDGET(td->drawing_area), td->size.w, td->size.h); } gtk_window_resize(GTK_WINDOW(td->win), td->size.w, td->size.h); gtk_window_move(GTK_WINDOW(td->win), td->location.x, td->location.y); gtk_window_get_size(GTK_WINDOW(td->win), &td->size.w, &td->size.h); } static void set_xtra_window_size(xtra_win_data *xd) { gtk_window_set_position(GTK_WINDOW(xd->win),GTK_WIN_POS_NONE); if ((xd->size.w > 0) && (xd->size.h > 0)) gtk_window_resize(GTK_WINDOW(xd->win), xd->size.w, xd->size.h); gtk_window_move(GTK_WINDOW(xd->win), xd->location.x, xd->location.y); } int button_add_gui(const char *label, unsigned char keypress) { int i=0; bool assigned = FALSE; GtkWidget *widget; int length = strlen(label); /*static GtkWidget *toolbar; static GtkWidget *toolbar_items[12]; static int toolbar_size; static unsigned char toolbar_keypress[12];*/ /* Check we haven't already got a button for this keypress */ for (i=0; i < toolbar_size; i++) { if (toolbar_keypress[i] == keypress) assigned = TRUE; } /* Make the button */ if (!assigned) { widget = gtk_button_new_with_label(label); toolbar_size++; toolbar_keypress[toolbar_size]=keypress; toolbar_items[toolbar_size] = widget; /*gtk_container_add(toolbar, widget);*/ } /* Return the size of the button */ return (length); } int button_kill_gui(unsigned char keypress) { /*int length;*/ /* Find the button */ /* No such button */ if (0) { return 0; } /* Find the length */ /* Move each button up one */ /* Wipe the data */ /* Redraw */ p_ptr->redraw |= (PR_BUTTONS); redraw_stuff(p_ptr); /* Return the size of the button */ return 0 /*(length)*/; } /* * Erase the whole term. */ static errr Term_clear_gtk(void) { term_data *td = (term_data*)(Term->data); cairo_rectangle_t r; init_cairo_rect(&r, 0, 0, max_win_width(td), max_win_height(td)); cairo_clear(td->surface, r, TERM_DARK); invalidate_drawing_area(td->drawing_area, r); return (0); } /* * Erase some characters. */ static errr Term_wipe_gtk(int x, int y, int n) { term_data *td = (term_data*)(Term->data); cairo_rectangle_t r; init_cairo_rect(&r, (td->actual.w * x), (td->actual.h * y), (td->actual.w * n), (td->actual.h)); cairo_clear(td->surface, r, TERM_DARK); invalidate_drawing_area(td->drawing_area, r); return (0); } static byte Term_xchar_gtk(byte c) { /* Can't translate Latin-1 to UTF-8 here since we have to return a byte. */ return c; } char *process_control_chars(int n, const char *s) { char *s2 = (char *)malloc(sizeof(char) * n); int i; for (i = 0; i < n; i++) { unsigned char c = s[i]; if (c < 32) { s2[i] = graphics_table[c]; } else if (c == 127) { s2[i] = '#'; } else { s2[i] = c; } } return s2; } char *latin1_to_utf8(int n, const char *s) { size_t inbytes = n; char *s2 = process_control_chars(n, s); char *p2 = s2; size_t outbytes = 4 * n; char *s3 = (char *)malloc(sizeof(char) * outbytes); char *p3 = s3; size_t result = iconv(conv, &p2, &inbytes, &p3, &outbytes); if (result == (size_t)(-1)) { printf("iconv() failed: %d\n", errno); free(s3); return s2; } else { free(s2); return s3; } } /* * Draw some textual characters. */ static errr Term_text_gtk(int x, int y, int n, byte a, const char *s) { term_data *td = (term_data*)(Term->data); cairo_rectangle_t r; char *s2; if (conv == NULL) s2 = process_control_chars(n, s); else s2 = latin1_to_utf8(n, s); init_cairo_rect(&r, (td->font.w * x), (td->font.h * y), (td->font.w * n), td->font.h); draw_text(td->surface, &td->font, &td->actual, x, y, n, a, s2); invalidate_drawing_area(td->drawing_area, r); free(s2); return (0); } static errr Term_pict_gtk(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) { term_data *td = (term_data*)(Term->data); cairo_rectangle_t r; init_cairo_rect(&r, (td->actual.w * x), (td->actual.h * y), (td->actual.w * n), (td->actual.h)); draw_tiles(td->surface, x, y, n, ap, cp, tap, tcp, &td->font, &td->actual, &td->tile); invalidate_drawing_area(td->drawing_area, r); return (0); } static errr Term_flush_gtk(void) { gdk_flush(); return (0); } static errr Term_fresh_gtk(void) { term_data *td = (term_data*)(Term->data); cairo_rectangle_t r; init_cairo_rect(&r, 0, 0, max_win_width(td), max_win_height(td)); invalidate_drawing_area(td->drawing_area, r); gdk_window_process_updates(td->win->window, 1); return (0); } /* * Handle a "special request" */ static errr Term_xtra_gtk(int n, int v) { /* Handle a subset of the legal requests */ switch (n) { /* Make a noise */ case TERM_XTRA_NOISE: return (0); /* Flush the output */ case TERM_XTRA_FRESH: return (Term_fresh_gtk()); /* Process random events */ case TERM_XTRA_BORED: return (CheckEvent(0)); /* Process Events */ case TERM_XTRA_EVENT: return (CheckEvent(v)); /* Flush the events */ case TERM_XTRA_FLUSH: return (Term_flush_gtk()); /* Handle change in the "level" */ case TERM_XTRA_LEVEL: return (0); /* Clear the screen */ case TERM_XTRA_CLEAR: return (Term_clear_gtk()); /* Delay for some milliseconds */ case TERM_XTRA_DELAY: if (v > 0) usleep(1000 * v); return (0); /* React to changes */ case TERM_XTRA_REACT: return (0); } /* Unknown */ return (1); } static errr Term_curs_gtk(int x, int y) { term_data *td = (term_data*)(Term->data); cairo_rectangle_t r; init_cairo_rect(&r, row_in_pixels(td, x)+1, col_in_pixels(td, y) + 1, (td->actual.w) - 2, (td->actual.h) - 2); cairo_cursor(td->surface, r, TERM_SLATE); invalidate_drawing_area(td->drawing_area, r); return (0); } /* * Hack -- redraw a term_data. * Note that "Term_redraw()" calls "TERM_XTRA_CLEAR" */ static void term_data_redraw(term_data *td) { term *old = Term; /* Activate the term passed to it, not term 0! */ Term_activate(&td->t); Term_resize(td->cols, td->rows); Term_redraw(); Term_fresh(); Term_activate(old); } static void force_redraw() { if (game_in_progress) { reset_visuals(TRUE); Term_key_push(KTRL('R')); } } static errr CheckEvent(bool wait) { if (wait) gtk_main_iteration(); else while (gtk_events_pending()) gtk_main_iteration(); return (0); } static bool save_game_gtk(void) { if (game_in_progress && character_generated) { if (!inkey_flag) { glog( "You may not do that right now."); return(FALSE); } /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } return(TRUE); } static void hook_quit(const char *str) { gtk_log_fmt(TERM_RED,"%s", str); save_prefs(); release_memory(); exit(0); } gboolean quit_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (save_game_gtk()) { save_prefs(); quit(NULL); exit(0); return(FALSE); } else return(TRUE); } gboolean destroy_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { quit(NULL); exit(0); return(FALSE); } gboolean new_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (game_in_progress) { glog( "You can't start a new game while you're still playing!"); return(TRUE); } else { /* We'll return NEWGAME to the game. */ cmd_insert(CMD_NEWGAME); gtk_widget_set_sensitive(widget, FALSE); return(FALSE); } } static void load_font_by_name(term_data *td, const char *font_name) { PangoFontDescription *temp_font; char buf[80]; unsigned int i, j = 0; my_strcpy(td->font.name, font_name, sizeof(td->font.name)); for (i = 0; i < strlen(font_name); i++) if (font_name[i] == ' ') j = i; for (i = j; i < strlen(font_name); i++) buf[i - j] = font_name[i]; temp_font = pango_font_description_from_string(font_name); my_strcpy(td->font.family, pango_font_description_get_family(temp_font), sizeof(td->font.family)); td->font.size = atof(buf); if (td->font.size == 0) td->font.size = 12; get_font_size(&td->font); td->actual.w = td->font.w * tile_width; td->actual.h = td->font.h; td->size.w = td->cols * td->font.w; td->size.h = td->rows * td->font.h; if ((td->initialized == TRUE) && (td->win != NULL) && (td->visible)) { /* Get a matrix set up to scale the graphics. */ set_term_matrix(td); gtk_widget_hide(td->win); set_window_size(td); gtk_widget_show(td->win); term_data_redraw(td); } } void set_term_font(GtkFontButton *widget, gpointer user_data) { term_data *td; const char *font_name; const char *s; int t; s = gtk_widget_get_name(GTK_WIDGET(widget)); sscanf(s, "term_font_%d", &t); td = &data[t]; font_name = gtk_font_button_get_font_name(widget); load_font_by_name(td, font_name); } void set_xtra_font(GtkFontButton *widget, gpointer user_data) { const char *temp, *s; int i, t = 0; xtra_win_data *xd; s = gtk_widget_get_name(GTK_WIDGET(widget)); for (i = 0; i < MAX_XTRA_WIN_DATA; i ++) { xtra_win_data *xd = &xdata[i]; if (s == xd->font_button_name) t = i; } xd=&xdata[t]; temp = gtk_font_button_get_font_name(widget); my_strcpy(xd->font.name, temp, sizeof(xd->font.name)); get_font_size(&xd->font); if (xd->text_view != NULL) gtk_widget_modify_font(GTK_WIDGET(xd->text_view), pango_font_description_from_string(xd->font.name)); if ((xd->surface != NULL) && (xd->event != 0)) { event_signal(xd->event); } } /*** Callbacks: savefile opening ***/ /* Filter function for the savefile list */ static gboolean file_open_filter(const GtkFileFilterInfo *filter_info, gpointer data) { const char *name = filter_info->display_name; (void)data; /* Count out known non-savefiles */ if (!strcmp(name, "Makefile") || !strcmp(name, "delete.me")) { return FALSE; } /* Let it pass */ return TRUE; } /* * Open/Save Dialog box */ static bool save_dialog_box(bool save) { GtkFileFilter *filter; GtkWidget *selector_wid; GtkFileChooser *selector; bool accepted; char buf[1024]; const char *filename; /* Forget it if the game is in progress */ /* XXX Should disable the menu entry XXX */ if (game_in_progress && !save) { glog( "You can't open a new game while you're still playing!"); return(FALSE); } if ((!game_in_progress || !character_generated) && save) { glog( "You can't save a new game unless you're still playing!"); return(FALSE); } if (!inkey_flag && save) { glog( "You may not do that right now."); return(FALSE); } /* Create a new file selector dialogue box, with no parent */ if (!save) { selector_wid = gtk_file_chooser_dialog_new("Select a savefile", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); } else { selector_wid = gtk_file_chooser_dialog_new("Save your game", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (selector_wid), op_ptr->full_name); } /* For convenience */ selector = GTK_FILE_CHOOSER(selector_wid); gtk_file_chooser_set_do_overwrite_confirmation (selector, TRUE);; /* Get the current directory (so we can find lib/save/) */ filename = gtk_file_chooser_get_current_folder(selector); path_build(buf, sizeof buf, filename, ANGBAND_DIR_SAVE); gtk_file_chooser_set_current_folder(selector, buf); /* Restrict the showing of pointless files */ filter = gtk_file_filter_new(); gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_DISPLAY_NAME, file_open_filter, NULL, NULL); gtk_file_chooser_set_filter(selector, filter); accepted = (gtk_dialog_run(GTK_DIALOG(selector_wid)) == GTK_RESPONSE_ACCEPT); /* Run the dialogue */ if (accepted) { /* Get the filename, copy it into the savefile name */ filename = gtk_file_chooser_get_filename(selector); my_strcpy(savefile, filename, sizeof(savefile)); game_saved = TRUE; } /* Destroy it now that we're done with it */ gtk_widget_destroy(selector_wid); /* Done */ return accepted; } void open_event_handler(GtkButton *was_clicked, gpointer user_data) { bool accepted; accepted = save_dialog_box(FALSE); /* Set the command now so that we skip the "Open File" prompt. */ if (accepted) cmd_insert(CMD_LOADFILE); /* Done */ return; } gboolean save_as_event_handler(GtkWidget *widget, GdkEvent *event, gpointer user_data) { bool accepted; accepted = save_dialog_box(TRUE); if (accepted) { Term_flush(); save_game_gtk(); } /* Done */ return(FALSE); } gboolean save_event_handler(GtkWidget *widget, GdkEvent *event, gpointer user_data) { bool accepted; if (game_saved) save_game(); else { accepted = save_dialog_box(TRUE); if (accepted) { Term_flush(); save_game_gtk(); } } /* Done */ return(FALSE); } gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, gpointer user_data) { save_game_gtk(); return (FALSE); } gboolean keypress_event_handler(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { byte mods; int ch = 0; guint modifiers = gtk_accelerator_get_default_mod_mask(); /* Extract four "modifier flags" */ int mc = ((event->state & modifiers) == GDK_CONTROL_MASK) ? TRUE : FALSE; int ms = ((event->state & modifiers) == GDK_SHIFT_MASK) ? TRUE : FALSE; int mo = ((event->state & modifiers) == GDK_MOD1_MASK) ? TRUE : FALSE; int mx = ((event->state & modifiers) == GDK_MOD3_MASK) ? TRUE : FALSE; int kp = FALSE; /* see gdk/gdkkeysyms.h */ // http://www.koders.com/c/fidD9E5E78FD91FE6ABDD6D3F78DA5E4A0FADE79933.aspx switch (event->keyval) { case GDK_Shift_L: case GDK_Shift_R: case GDK_Control_L: case GDK_Control_R: case GDK_Caps_Lock: case GDK_Shift_Lock: case GDK_Meta_L: case GDK_Meta_R: case GDK_Alt_L: case GDK_Alt_R: case GDK_Super_L: case GDK_Super_R: case GDK_Hyper_L: case GDK_Hyper_R: /* ignore things that are just modifiers */ return TRUE; case GDK_BackSpace: ch = KC_BACKSPACE; break; case GDK_Tab: ch = KC_TAB; break; case GDK_Return: ch = KC_RETURN; break; case GDK_Escape: ch = ESCAPE; break; case GDK_Delete: ch = KC_DELETE; break; case GDK_Home: ch = KC_HOME; break; case GDK_Left: ch = ARROW_LEFT; break; case GDK_Up: ch = ARROW_UP; break; case GDK_Right: ch = ARROW_RIGHT; break; case GDK_Down: ch = ARROW_DOWN; break; case GDK_Page_Up: ch = KC_PGUP; break; case GDK_Page_Down: ch = KC_PGDOWN; break; case GDK_End: ch = KC_END; break; case GDK_Insert: ch = KC_INSERT; break; /* keypad */ case GDK_KP_Insert: case GDK_KP_End: case GDK_KP_Down: case GDK_KP_Page_Down: case GDK_KP_Left: case GDK_KP_Right: case GDK_KP_Home: case GDK_KP_Up: case GDK_KP_Page_Up: case GDK_KP_Decimal: case GDK_KP_Divide: case GDK_KP_Multiply: case GDK_KP_Subtract: case GDK_KP_Add: case GDK_KP_Enter: case GDK_KP_Equal: switch(event->keyval) { case GDK_KP_Insert: ch = '0'; break; case GDK_KP_End: ch = '1'; break; case GDK_KP_Down: ch = '2'; break; case GDK_KP_Page_Down: ch = '3'; break; case GDK_KP_Left: ch = '4'; break; case GDK_KP_Right: ch = '6'; break; case GDK_KP_Home: ch = '7'; break; case GDK_KP_Up: ch = '8'; break; case GDK_KP_Page_Up: ch = '9'; break; case GDK_KP_Decimal: ch = '.'; break; case GDK_KP_Divide: ch = '/'; break; case GDK_KP_Multiply: ch = '*'; break; case GDK_KP_Subtract: ch = '-'; break; case GDK_KP_Add: ch = '+'; break; case GDK_KP_Enter: ch = '\n';break; case GDK_KP_Equal: ch = '='; break; } /* intentional fall-though */ case GDK_KP_0: case GDK_KP_1: case GDK_KP_2: case GDK_KP_3: case GDK_KP_4: case GDK_KP_5: case GDK_KP_6: case GDK_KP_7: case GDK_KP_8: case GDK_KP_9: kp = TRUE; break; case GDK_F1: ch = KC_F1; break; case GDK_F2: ch = KC_F2; break; case GDK_F3: ch = KC_F3; break; case GDK_F4: ch = KC_F4; break; case GDK_F5: ch = KC_F5; break; case GDK_F6: ch = KC_F6; break; case GDK_F7: ch = KC_F7; break; case GDK_F8: ch = KC_F8; break; case GDK_F9: ch = KC_F9; break; case GDK_F10: ch = KC_F10; break; case GDK_F11: ch = KC_F11; break; case GDK_F12: ch = KC_F12; break; case GDK_F13: ch = KC_F13; break; case GDK_F14: ch = KC_F14; break; case GDK_F15: ch = KC_F15; break; } mods = (mo ? KC_MOD_ALT : 0) | (mx ? KC_MOD_META : 0) | (kp ? KC_MOD_KEYPAD : 0); if (ch) { mods |= (mc ? KC_MOD_CONTROL : 0) | (ms ? KC_MOD_SHIFT : 0); Term_keypress(ch, mods); } else if (event->length == 1) { keycode_t code = event->string[0]; if (mc && MODS_INCLUDE_CONTROL(code)) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(code)) mods |= KC_MOD_SHIFT; Term_keypress(code, mods); /* Control keys get passed along to menus, are not "handled" */ return !mc; } return TRUE; } static void save_prefs(void) { ang_file *fff; int i; #ifdef GTK_DEBUG glog( "Saving Prefs."); #endif /* Open the settings file */ fff = file_open(settings, MODE_WRITE, FTYPE_TEXT); if (!fff) return; /* Header */ file_putf(fff, "# %s GTK preferences\n\n", VERSION_NAME); file_putf(fff, "[General Settings]\n"); /* Graphics setting */ file_putf(fff,"Tile set=%d\n", arg_graphics); file_putf(fff,"Tile Width=%d\n", tile_width); file_putf(fff,"Tile Height=%d\n", tile_height); /* New section */ file_putf(fff, "\n"); /* Save window prefs */ for (i = 0; i < num_term; i++) { term_data *td = &data[i]; if (!td->t.mapped_flag) continue; /* Header */ file_putf(fff, "[Term window %d]\n", i); /* Term window specific preferences */ file_putf(fff, "font=%s\n", td->font.name); file_putf(fff, "visible=%d\n", GTK_WIDGET_VISIBLE(td->win)); file_putf(fff, "x=%d\n", td->location.x); file_putf(fff, "y=%d\n", td->location.y); file_putf(fff, "width=%d\n", td->size.w); file_putf(fff, "height=%d\n", td->size.h); file_putf(fff, "cols=%d\n", td->cols); file_putf(fff, "rows=%d\n", td->rows); file_putf(fff, "tile width=%d\n", td->tile.w); file_putf(fff, "tile height=%d\n", td->tile.h); /* Footer */ file_putf(fff, "\n"); } for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { xtra_win_data *xd = &xdata[i]; /* Header */ file_putf(fff, "[Extra window %d]", i); file_putf(fff, "# %s\n",xd->name); file_putf(fff, "font=%s\n", xd->font.name); file_putf(fff, "visible=%d\n", GTK_WIDGET_VISIBLE(xd->win)); file_putf(fff, "x=%d\n", xd->location.x); file_putf(fff, "y=%d\n", xd->location.y); file_putf(fff, "width=%d\n", xd->size.w); file_putf(fff, "height=%d\n\n", xd->size.h); } /* Close */ file_close(fff); } static int check_env_i(char* name, int i, int dfault) { const char *str; int val; char buf[1024]; strnfmt(buf, -1, name, i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val <= 0) val = dfault; return val; } static int get_value(const char *buf) { const char *str; int i; str = strstr(buf, "="); i = (str != NULL) ? atoi(str + 1) : -1; return i; } static void load_term_prefs() { int t = 0, x = 0, line = 0, val = 0, section = 0; const char *str; char buf[1024]; ang_file *fff; term_data *td = &data[0]; xtra_win_data *xd = &xdata[0]; if (ignore_prefs) return; /* Build the filename and open the file */ path_build(settings, sizeof(settings), ANGBAND_DIR_USER, "gtk-settings.prf"); fff = file_open(settings, MODE_READ, -1); /* File doesn't exist */ if (!fff) return; /* Process the file */ while (file_getl(fff, buf, sizeof(buf))) { /* Count lines */ line++; /* Skip "empty" lines, "blank" lines, and comments */ if (!buf[0]) continue; if (isspace((unsigned char)buf[0])) continue; if (buf[0] == '#') continue; if (buf[0] == '[') { if (prefix(buf, "[General Settings]")) { section = GENERAL_PREFS; } else if (prefix(buf,"[Term window")) { section = TERM_PREFS; sscanf(buf, "[Term window %d]", &t); td = &data[t]; } else if (prefix(buf,"[Extra window")) { section = XTRA_WIN_PREFS; sscanf(buf, "[Extra window %d]", &x); xd = &xdata[x]; } continue; } if (section == GENERAL_PREFS) { if (prefix(buf, "Tile set=")) { val = get_value(buf); sscanf(buf, "Tile set=%d", &val); arg_graphics = val; continue; } if (prefix(buf, "Tile Width=")) { val = get_value(buf); sscanf(buf, "Tile Width=%d", &val); tile_width = val; continue; } } if (section == TERM_PREFS) { if (prefix(buf, "visible=")) { sscanf(buf, "visible=%d", &val); td->visible = val; } else if (prefix(buf, "font=")) { str = my_stristr(buf, "="); if (str != NULL) { if (str[0] == '=') str++; my_strcpy(td->font.name, str, strlen(str) + 1); } } else if (prefix(buf, "x=")) sscanf(buf, "x=%d", &td->location.x); else if (prefix(buf, "y=")) sscanf(buf, "y=%d",&td->location.y); else if (prefix(buf, "width=")) sscanf(buf, "width=%d", &td->size.w); else if (prefix(buf, "height=")) sscanf(buf, "height=%d", &td->size.h); else if (prefix(buf, "cols=")) sscanf(buf, "cols=%d", &td->cols); else if (prefix(buf, "rows=")) sscanf(buf, "rows=%d", &td->rows); else if (prefix(buf, "tile_width=")) sscanf(buf, "tile_width=%d", &td->tile.w); else if (prefix(buf, "tile_height=")) sscanf(buf, "tile_height=%d", &td->tile.h); continue; } if (section == XTRA_WIN_PREFS) { if (prefix(buf, "visible=")) { sscanf(buf, "visible=%d", &val); xd->visible = val; } else if (prefix(buf, "font=")) { str = my_stristr(buf, "="); if (str != NULL) { if (str[0] == '=') str++; my_strcpy(xd->font.name, str, strlen(str) + 1); } } else if (prefix(buf, "x=")) sscanf(buf, "x=%d", &xd->location.x); else if (prefix(buf, "y=")) sscanf(buf, "y=%d",&xd->location.y); else if (prefix(buf, "width=")) sscanf(buf, "width=%d", &xd->size.w); else if (prefix(buf, "height=")) sscanf(buf, "height=%d", &xd->size.h); } } file_close(fff); } static void load_prefs() { int i; load_term_prefs(); for (i = 0; i < num_term; i++) { term_data *td = &data[i]; /* deal with env vars */ td->location.x = check_env_i("ANGBAND_X11_AT_X_%d", i, td->location.x); td->location.y = check_env_i("ANGBAND_X11_AT_Y_%d", i,td->location.y); td->cols = check_env_i("ANGBAND_X11_COLS_%d", i, td->cols); td->rows = check_env_i("ANGBAND_X11_ROWS_%d", i, td->rows); td->initialized = FALSE; if ((td->font.name == NULL) || (strlen(td->font.name)<2)) my_strcpy(td->font.name, "Monospace 12", sizeof(td->font.name)); load_font_by_name(td, td->font.name); /* Set defaults if not initialized, or if funny values are there */ if (td->size.w <= 0) td->size.w = (td->rows * td->actual.h); if (td->size.h <= 0) td->size.h = (td->cols * td->actual.w); if (td->tile.w <= 0) td->tile.w = td->font.w; if (td->tile.h <= 0) td->tile.h = td->font.h; /* The main window should always be visible */ if (i == 0) td->visible = 1; /* Discard the old cols & rows values, and recalculate. */ set_row_and_cols(td); } for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { xtra_win_data *xd = &xdata[i]; if ((xd->font.name == NULL) || (strlen(xd->font.name)<2)) my_strcpy(xd->font.name, "Monospace 10", sizeof(xd->font.name)); get_font_size(&xd->font); if ((xd->size.w <=0 ) || (xd->size.h <= 0)) { if (i == 5) { xd->size.h = 430; xd->size.w = 130; } else { xd->size.h = 130; xd->size.w = 430; } } } } gboolean on_mouse_click(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { int z = 0; /* Where is the mouse? */ int x = event->x; int y = event->y; z = event->button; /* The co-ordinates are only used in Angband format. */ pixel_to_square(&x, &y, x, y); Term_mousepress(x, y, z); return FALSE; } gboolean expose_event_handler(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { cairo_t *cr; cairo_rectangle_t s; GdkRectangle *rects; int n_rects; int i; term_data *td; int t = -1; const char *str; str = gtk_widget_get_name(widget); sscanf(str, "term_drawing_area_%d", &t); if (t != -1) { td = &data[t]; g_assert(td->drawing_area->window != 0); if (td->win) { g_assert(widget->window != 0); cr = gdk_cairo_create(td->drawing_area->window); gdk_region_get_rectangles (event->region, &rects, &n_rects); for (i = 0; i < n_rects; i++) { s = gdk_rect_to_cairo(&rects[i]); cairo_draw_from_surface(cr, td->surface, s); } g_free (rects); cairo_destroy(cr); } } return (TRUE); } gboolean xtra_expose_event_handler(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { cairo_t *cr; cairo_rectangle_t s; GdkRectangle *rects; int n_rects; int i,t; xtra_win_data *xd; t = xtra_window_from_drawing_area(gtk_widget_get_name(widget)); if (t != -1) { xd = &xdata[t]; if ((xd->win) && (xd->drawing_area != NULL)) { cr = gdk_cairo_create(xd->drawing_area->window); gdk_region_get_rectangles (event->region, &rects, &n_rects); for (i = 0; i < n_rects; i++) { s = gdk_rect_to_cairo(&rects[i]); cairo_draw_from_surface(cr, xd->surface, s); } g_free (rects); cairo_destroy(cr); } } return (TRUE); } gboolean hide_options(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(widget); return TRUE; } gboolean show_event_handler(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { term_data *td; measurements size; int t; t = term_window_from_widget(widget); if (t != -1) { td = &data[t]; if (td->drawing_area != NULL) { size.w = max_win_width(td); size.h = max_win_height(td); td->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, size.w, size.h); set_term_matrix(td); } } return(TRUE); } gboolean xtra_show_event_handler(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { xtra_win_data *xd; cairo_rectangle_t r; int t; t = xtra_window_from_widget(widget); if (t != -1) { xd = &xdata[t]; if (xd->drawing_area != NULL) { xd->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 255 * xd->font.w, 255 * xd->font.h); init_cairo_rect(&r, 0, 0, 255 * xd->font.w, 255 * xd->font.h); cairo_clear(xd->surface, r, TERM_DARK); } if ((game_in_progress) && (character_generated) && (xd->event != 0)) { event_signal(xd->event); } } return(TRUE); } gboolean xtra_hide_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { xtra_win_data *xd; int t; t = xtra_window_from_widget(widget); if (t != -1) { xd = &xdata[t]; xd->visible = FALSE; if (xd->menu != NULL) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(xd->menu), FALSE); if ((xd->drawing_area != NULL) && (cairo_surface_get_reference_count(xd->surface) > 0)) { cairo_surface_destroy(xd->surface); } } return(TRUE); } gboolean hide_event_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { term_data *td; int t; t = term_window_from_widget(widget); if (t > 0) { td = &data[t]; if ((td != NULL) && (td->win == widget)) set_term_menu(td->number, FALSE); if ((td->drawing_area != NULL) && (td->surface != NULL)) { int count = cairo_surface_get_reference_count(td->surface); if (count > 0) cairo_surface_destroy(td->surface); } } return(TRUE); } gboolean toggle_term_window(GtkWidget *widget, GdkEvent *event, gpointer user_data) { term_data *td; int t; const char *s; s = gtk_widget_get_name(widget); sscanf(s, "term_menu_item_%d", &t); td = &data[t]; if (widget != NULL) td->visible = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); if (td->visible) { gtk_widget_show(td->win); term_data_redraw(td); } else { gtk_widget_hide(td->win); } return td->visible; } gboolean toggle_xtra_window(GtkWidget *widget, GdkEvent *event, gpointer user_data) { int i; const char *item_name = gtk_widget_get_name(widget); for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { if (streq(item_name, xtra_menu_names[i])) { xtra_win_data *xd = &xdata[i]; if (widget != NULL) xd->visible = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); if (xd->visible) gtk_widget_show(xd->win); else gtk_widget_hide(xd->win); } } return(TRUE); } static void init_graf(int g) { char buf[1024]; term_data *td= &data[0]; int i = 0; arg_graphics = g; switch(arg_graphics) { case GRAPHICS_NONE: { ANGBAND_GRAF = "none"; use_transparency = FALSE; td->tile.w = td->font.w; td->tile.h = td-> font.h; break; } case GRAPHICS_ORIGINAL: { ANGBAND_GRAF = "old"; path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, "8x8.png"); use_transparency = FALSE; td->tile.w = td->tile.h = 8; break; } case GRAPHICS_ADAM_BOLT: { ANGBAND_GRAF = "new"; path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, "16x16.png"); use_transparency = TRUE; td->tile.w = td->tile.h =16; break; } case GRAPHICS_NOMAD: { ANGBAND_GRAF = "nomad"; path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, "8x16.png"); use_transparency = TRUE; td->tile.w = td->tile.h =16; break; } case GRAPHICS_DAVID_GERVAIS: { ANGBAND_GRAF = "david"; path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, "32x32.png"); use_transparency = FALSE; td->tile.w = td->tile.h =32; break; } } /* Free up old graphics */ if (graphical_tiles != NULL) cairo_surface_destroy(graphical_tiles); if (tile_pattern != NULL) cairo_pattern_destroy(tile_pattern); graphical_tiles = cairo_image_surface_create_from_png(buf); tile_pattern = cairo_pattern_create_for_surface(graphical_tiles); g_assert(graphical_tiles != NULL); g_assert(tile_pattern != NULL); /* All windows have the same tileset */ for (i = 0; i < num_term; i++) { term_data *t = &data[i]; t->tile.w = td->tile.w; t->tile.h = td->tile.h; } set_term_matrix(td); /* Force redraw */ force_redraw(); } #ifdef USE_GTK_BUILDER static void setup_graphics_menu(GtkBuilder *xml) #else static void setup_graphics_menu(GladeXML *xml) #endif { GtkWidget *menu; char s[12]; int i; // FIXME: we should be using a numerical constant here for (i = 0; i < 5; i++) { bool checked = (i == arg_graphics); strnfmt(s, sizeof(s), "graphics_%d", i); menu = get_widget(xml, s); if (checked && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu))) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), TRUE); } } /* Hooks for graphics menu items */ gboolean on_graphics_activate(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { int g; const char *s; s = gtk_widget_get_name(widget); sscanf(s, "graphics_%d", &g); init_graf(g); return FALSE; } /* * Make text views "Angbandy" */ static void white_on_black_textview(xtra_win_data *xd) { gtk_widget_modify_base(xd->text_view, GTK_STATE_NORMAL, &black); gtk_widget_modify_text(xd->text_view, GTK_STATE_NORMAL, &white); } static void xtra_data_init(xtra_win_data *xd, int i) { xd->x = i; xd->name = xtra_names[i]; xd->win_name = xtra_win_names[i]; xd->text_view_name = xtra_text_names[i]; xd->item_name = xtra_menu_names[i]; xd->font_button_name = xtra_font_button_names[i]; xd->drawing_area_name = xtra_drawing_names[i]; xd->event = xtra_events[i]; } static void init_xtra_windows(void) { int i = 0; term_data *main_term = &data[0]; GtkWidget *font_button; #ifdef USE_GTK_BUILDER GtkBuilder *xml; #else GladeXML *xml; #endif char buf[1024]; path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA, GTK_XML); xml = get_gtk_xml(buf, NULL); for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { xtra_win_data *xd = &xdata[i]; font_button = get_widget(xml, xd->font_button_name); xd->win = get_widget(xml, xd->win_name); xd->text_view = get_widget(xml, xd->text_view_name); xd->drawing_area = get_widget(xml, xd->drawing_area_name); gtk_font_button_set_font_name(GTK_FONT_BUTTON(font_button), xd->font.name); gtk_widget_realize(xd->win); gtk_window_set_title(GTK_WINDOW(xd->win), xd->name); if (xd->text_view != NULL) { white_on_black_textview(xd); gtk_widget_modify_font(GTK_WIDGET(xd->text_view), pango_font_description_from_string(xd->font.name)); } if (xd->drawing_area != NULL) { cairo_rectangle_t r; gtk_widget_realize(xd->drawing_area); gtk_widget_modify_bg(xd->win, GTK_STATE_NORMAL, &black); gtk_widget_modify_bg(xd->drawing_area, GTK_STATE_NORMAL, &black); xd->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 255 * main_term->font.w, 255 * main_term->font.h); init_cairo_rect(&r, 0, 0, 255 * main_term->font.w, 255 * main_term->font.h); cairo_clear(xd->surface, r, TERM_DARK); } } #ifdef USE_GTK_BUILDER gtk_builder_connect_signals(xml, NULL); #else glade_xml_signal_autoconnect(xml); #endif g_object_unref(G_OBJECT(xml)); } static void init_gtk_windows(void) { GtkWidget *options, *temp_widget; #ifdef USE_GTK_BUILDER GtkBuilder *gtk_xml; #else GladeXML *gtk_xml; #endif char buf[1024], logo[1024], temp[20]; int i = 0; /* Build the paths */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA, GTK_XML); gtk_xml = get_gtk_xml(buf, NULL); if (gtk_xml == NULL) { gtk_log_fmt(TERM_RED, "%s is Missing. Unrecoverable error. Aborting!", buf); quit(NULL); exit(0); } path_build(logo, sizeof(logo), ANGBAND_DIR_XTRA_ICON, "att-256.png"); gtk_window_set_default_icon_from_file(logo, NULL); for (i = 0; i < num_term; i++) { term_data *td = &data[i]; if (!MAIN_WINDOW(td)) { #ifdef USE_GTK_BUILDER GtkBuilder *xml; #else GladeXML *xml; #endif /* Set up the Glade file */ xml = get_gtk_xml(buf, "term_window"); td->win = get_widget(xml, "term_window"); td->drawing_area = get_widget(xml, "term_drawing"); strnfmt(temp, sizeof(temp), "term_menu_item_%i", i); td->menu_item = get_widget(gtk_xml, temp); #ifdef USE_GTK_BUILDER gtk_builder_connect_signals(xml, NULL); #else glade_xml_signal_autoconnect(xml); #endif g_object_unref (xml); } else { td->win = get_widget(gtk_xml, "main_window"); td->drawing_area = get_widget(gtk_xml, "main_drawing"); options = get_widget(gtk_xml, "option_window"); toolbar = get_widget(gtk_xml, "main_toolbar"); g_signal_connect(options, "delete_event", GTK_SIGNAL_FUNC(hide_options), NULL); } /* Set title and name */ strnfmt(temp, sizeof(temp), "term_window_%d", i); gtk_widget_set_name(td->win, temp); strnfmt(temp, sizeof(temp), "term_drawing_area_%d", i); gtk_widget_set_name(td->drawing_area, temp); gtk_window_set_title(GTK_WINDOW(td->win), td->name); } for(i = 0; i < MAX_XTRA_WIN_DATA; i++) { xtra_win_data *xd = &xdata[i]; xd->menu = get_widget(gtk_xml, xd->item_name); } /* connect signal handlers that aren't passed data */ #ifdef USE_GTK_BUILDER gtk_builder_connect_signals(gtk_xml, NULL); #else glade_xml_signal_autoconnect(gtk_xml); #endif setup_graphics_menu(gtk_xml); big_tile_item = get_widget(gtk_xml, "big_tile_item"); /* Initialize the windows */ for (i = 0; i < num_term; i++) { term_data *td = &data[i]; gtk_widget_realize(td->win); gtk_widget_realize(td->drawing_area); gtk_widget_modify_bg(td->win, GTK_STATE_NORMAL, &black); gtk_widget_modify_bg(td->drawing_area, GTK_STATE_NORMAL, &black); strnfmt(temp, sizeof(temp), "term_font_%d", i); temp_widget = get_widget(gtk_xml, temp); gtk_widget_realize(temp_widget); gtk_font_button_set_font_name(GTK_FONT_BUTTON(temp_widget), td->font.name); strnfmt(temp, sizeof(temp), "row_%d", i); temp_widget = get_widget(gtk_xml, temp); gtk_widget_realize(temp_widget); gtk_spin_button_set_value(GTK_SPIN_BUTTON(temp_widget), td->rows); strnfmt(temp, sizeof(temp), "col_%d", i); temp_widget = get_widget(gtk_xml, temp); gtk_widget_realize(temp_widget); gtk_spin_button_set_value(GTK_SPIN_BUTTON(temp_widget), td->cols); td->initialized = TRUE; set_window_size(td); } g_object_unref(G_OBJECT(gtk_xml)); } static void show_windows(void) { int i; /* Initialize the windows */ for (i = 0; i < num_term; i++) { term_data *td = &data[i]; bool active; /* Activate the window screen */ Term_activate(&data[i].t); if (td->visible) { gtk_widget_show(td->win); term_data_redraw(td); } if (i !=0) { active = get_term_menu(td->number); if ( active != td->visible) set_term_menu(td->number, td->visible); } Term_clear_gtk(); } for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { xtra_win_data *xd = &xdata[i]; set_xtra_window_size(xd); if ((xd->visible) && (xd->menu != NULL)) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(xd->menu),TRUE); } if ((tile_width == 2) && (big_tile_item != NULL)) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(big_tile_item), TRUE); } static void xtra_data_destroy(xtra_win_data *xd) { if (GTK_IS_WIDGET(xd->text_view)) gtk_widget_destroy(xd->text_view); if (GTK_IS_WIDGET(xd->drawing_area)) gtk_widget_destroy(xd->drawing_area); if (GTK_IS_WIDGET(xd->win)) gtk_widget_destroy(xd->win); if (cairo_surface_get_reference_count(xd->surface) > 0) cairo_surface_destroy(xd->surface); } static void term_data_destroy(term_data *td) { if (GTK_IS_WIDGET(td->drawing_area)) gtk_widget_destroy(td->drawing_area); if (GTK_IS_WIDGET(td->win)) gtk_widget_destroy(td->win); if (cairo_surface_get_reference_count(td->surface) > 0) cairo_surface_destroy(td->surface); } static void release_memory() { int i; if (cairo_pattern_get_reference_count(tile_pattern) > 0) cairo_pattern_destroy(tile_pattern); if (cairo_surface_get_reference_count(graphical_tiles) > 0) cairo_surface_destroy(graphical_tiles); for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { xtra_win_data *xd = &xdata[i]; xtra_data_destroy(xd); } for (i = num_term; i > 0; i--) { term_data *td = &data[i]; term_data_destroy(td); } } static errr term_data_init(term_data *td, int i) { term *t = &td->t; conv = iconv_open("UTF-8", "ISO-8859-1"); if (conv == (iconv_t)(-1)) { printf("iconv_open() failed: %d\n", errno); conv = NULL; } td->cols = 80; td->rows = 24; /* Initialize the term */ term_init(t, td->cols, td->rows, 1024); /* Store the name of the term */ td->name = angband_term_name[i]; td->number = i; strnfmt(td->font.name, sizeof(td->font.name), "Monospace 12"); /* Use a "soft" cursor */ t->soft_cursor = TRUE; /* Erase with "dark space" */ t->attr_blank = TERM_DARK; t->char_blank = ' '; t->higher_pict = TRUE; t->xtra_hook = Term_xtra_gtk; t->text_hook = Term_text_gtk; t->wipe_hook = Term_wipe_gtk; t->curs_hook = Term_curs_gtk; t->pict_hook = Term_pict_gtk; if (conv != NULL) t->xchar_hook = Term_xchar_gtk; /* Save the data */ t->data = td; /* Activate (important) */ Term_activate(t); /* Success */ return (0); } static errr get_init_cmd(bool wait) { Term_fresh(); /* Prompt the user */ prt("[Choose 'New' or 'Open' from the 'File' menu]", 23, 17); CheckEvent(wait); return 0; } static void handle_leave_init(game_event_type type, game_event_data *data, void *user) { /* Disable New and Open menu items - to do */ game_in_progress = TRUE; } /* * Set up color tags for all the angband colors. */ static void init_color_tags(xtra_win_data *xd) { int i; char colorname[10] = "color-00"; char str[10] = "#FFFFFF"; GtkTextTagTable *tags; tags = gtk_text_buffer_get_tag_table(xd->buf); for (i = 0; i <= MAX_COLORS; i++) { strnfmt(colorname, sizeof(colorname), "color-%d", i); strnfmt(str, sizeof(str), "#%02x%02x%02x", angband_color_table[i][1], angband_color_table[i][2], angband_color_table[i][3]); if (gtk_text_tag_table_lookup(tags, colorname) != NULL) gtk_text_tag_table_remove(tags, gtk_text_tag_table_lookup(tags, colorname)); if (gtk_text_tag_table_lookup(tags, colorname) == NULL) gtk_text_buffer_create_tag(xd->buf, colorname, "foreground", str, NULL); } } static void text_view_put(xtra_win_data *xd, const char *str, byte color) { char colorname[10] = "color-00"; GtkTextIter start, end; /* Get the color tag ready, and tack a line feed on the line we're printing */ strnfmt(colorname, sizeof(colorname), "color-%d", color); /* Print it at the end of the window */ gtk_text_buffer_get_bounds(xd->buf, &start, &end); gtk_text_buffer_insert_with_tags_by_name(xd->buf, &end, str, strlen(str), colorname, NULL); } static void text_view_print(xtra_win_data *xd, const char *str, byte color) { text_view_put(xd, str, color); text_view_put(xd, "\n", color); } void gtk_log_fmt(byte c, const char *fmt, ...) { xtra_win_data *xd = &xdata[4]; char str[80]; va_list vp; if (GTK_IS_TEXT_VIEW(xd->text_view)) { xd->buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(xd->text_view)); if (!GTK_IS_TEXT_BUFFER(xd->buf)) { xd->buf = gtk_text_buffer_new(NULL); gtk_text_view_set_buffer(GTK_TEXT_VIEW (xd->text_view), xd->buf); } init_color_tags(xd); } va_start(vp, fmt); (void)vstrnfmt(str, sizeof(str), fmt, vp); va_end(vp); #ifdef VERBOSE_DEBUG if (GTK_IS_TEXT_VIEW(xd->text_view)) plog(str); #endif if (GTK_IS_TEXT_VIEW(xd->text_view)) text_view_print(xd, str, c); else plog(str); } static void glog(const char *fmt, ...) { xtra_win_data *xd = &xdata[4]; char str[80]; va_list vp; if (GTK_IS_TEXT_VIEW(xd->text_view)) { xd->buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(xd->text_view)); if (!GTK_IS_TEXT_BUFFER(xd->buf)) { xd->buf = gtk_text_buffer_new(NULL); gtk_text_view_set_buffer(GTK_TEXT_VIEW (xd->text_view), xd->buf); } init_color_tags(xd); } va_start(vp, fmt); (void)vstrnfmt(str, sizeof(str), fmt, vp); va_end(vp); #ifdef VERBOSE_DEBUG if (GTK_IS_TEXT_VIEW(xd->text_view)) plog(str); #endif if (GTK_IS_TEXT_VIEW(xd->text_view)) text_view_print(xd, str, TERM_WHITE); else plog(str); } static void reinitialize_text_buffer(xtra_win_data *xd) { if (!GTK_IS_TEXT_BUFFER(xd->buf)) xd->buf = gtk_text_buffer_new(NULL); else gtk_text_buffer_set_text(xd->buf, "", 0); gtk_text_view_set_buffer(GTK_TEXT_VIEW(xd->text_view), xd->buf); init_color_tags(xd); } /* * Update our own personal message window. */ static void handle_message(game_event_type type, game_event_data *data, void *user) { xtra_win_data *xd = &xdata[0]; u16b num; int i; if (!xd) return; reinitialize_text_buffer(xd); num = messages_num(); for (i = 0; i < num; i++) text_view_print(xd, message_str(i), message_color(i)); } /* * Return the last inventory slot. */ static int last_inv_slot(void) { register int i, z = 0; object_type *o_ptr; /* Find the "final" slot */ for (i = 0; i < INVEN_PACK; i++) { o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Track */ z = i + 1; } return z; } static void inv_slot(char *str, size_t len, int i, bool equip) { object_type *o_ptr; char o_name[80], label[5]; int name_size = 80; /* Examine the item */ o_ptr = &p_ptr->inventory[i]; /* Is this item "acceptable"? */ if (item_tester_okay(o_ptr) || equip) { /* Obtain an item description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Obtain the length of the description */ strnfmt(label, sizeof(label), "%c) ", index_to_label(i)); if (equip) name_size = name_size - 19; /* Display the weight if needed */ if (o_ptr->weight) { int wgt = o_ptr->weight * o_ptr->number; name_size = name_size - 4 - 9 - 9 - 5; if (equip) strnfmt(str, len, "%s%-*s %3d.%1d lb <-- %s", label, name_size, o_name, wgt / 10, wgt % 10, mention_use(i)); else strnfmt(str, len, "%s%-*s %3d.%1d lb", label, name_size, o_name, wgt / 10, wgt % 10); } else { name_size = name_size - 4 - 9 - 5; if (equip) strnfmt(str, len, "%s%-*s <-- %s", label, name_size, o_name, mention_use(i)); else strnfmt(str, len, "%s%-*s", label, name_size, o_name); } } } static void handle_inv(game_event_type type, game_event_data *data, void *user) { xtra_win_data *xd = &xdata[1]; char str[80]; register int i, z; byte attr; if (!xd) return; reinitialize_text_buffer(xd); z = last_inv_slot(); /* Display the pack */ for (i = 0; i < z; i++) { /* Examine the item */ object_type *o_ptr = &p_ptr->inventory[i]; /* Is this item "acceptable"? */ if (item_tester_okay(o_ptr)) { /* Get inventory color */ attr = tval_to_attr[o_ptr->tval % N_ELEMENTS(tval_to_attr)]; inv_slot(str, sizeof(str), i, FALSE); text_view_print(xd, str, attr); } } } static void handle_equip(game_event_type type, game_event_data *data, void *user) { xtra_win_data *xd = &xdata[2]; register int i; byte attr; char str[80]; if (!xd) return; reinitialize_text_buffer(xd); /* Display the pack */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; attr = tval_to_attr[o_ptr->tval % N_ELEMENTS(tval_to_attr)]; inv_slot(str, sizeof(str), i, TRUE); text_view_print(xd, str, attr); } } /* * Display visible monsters in a window */ static void handle_mons_list(game_event_type type, game_event_data *data, void *user) { xtra_win_data *xd = &xdata[3]; int i; int line = 1; unsigned total_count = 0, disp_count = 0; byte attr; char *m_name; char buf[80]; char str[80]; monster_type *m_ptr; monster_race *r_ptr; u16b *race_count; if (!xd) return; reinitialize_text_buffer(xd); /* Allocate the array */ race_count = C_ZNEW(z_info->r_max, u16b); /* Scan the monster list */ for (i = 1; i < cave_monster_max(cave); i++) { m_ptr = cave_monster(cave, i); /* Only visible monsters */ if (!m_ptr->ml) continue; /* Bump the count for this race, and the total count */ race_count[m_ptr->r_idx]++; total_count++; } /* Note no visible monsters */ if (!total_count) { /* Print note */ strnfmt(str, sizeof(str), "You see no monsters."); text_view_print(xd, str, TERM_SLATE); /* Free up memory */ FREE(race_count); /* Done */ return; } strnfmt(str, sizeof(str), "You can see %d monster%s:", total_count, PLURAL(total_count)); text_view_print(xd, str, 1); /* Go over in reverse order (so we show harder monsters first) */ for (i = 1; i < z_info->r_max; i++) { monster_lore *l_ptr = &l_list[i]; /* No monsters of this race are visible */ if (!race_count[i]) continue; /* Note that these have been displayed */ disp_count += race_count[i]; /* Get monster race and name */ r_ptr = &r_info[i]; m_name = r_ptr->name; /* Display uniques in a special colour */ if (rf_has(r_ptr->flags, RF_UNIQUE)) attr = TERM_VIOLET; /* If the player has never killed it (ever) AND it is out of depth */ else if ((!l_ptr->tkills) && (r_ptr->level > p_ptr->depth)) attr = TERM_RED; else attr = TERM_WHITE; /* Build the monster name */ if (race_count[i] == 1) my_strcpy(buf, m_name, sizeof(buf)); else strnfmt(buf, sizeof(buf), "%s (x%d) ", m_name, race_count[i]); text_view_print(xd, buf, attr); line++; } /* Free the race counters */ FREE(race_count); } static void draw_xtra_cr_text(xtra_win_data *xd, int x, int y, byte color, const char *str) { measurements size; cairo_rectangle_t r; int n = strlen(str); /* Prevent gcc warnings */ r.width = 0; r.height = 0; r.x = 0; r.y = 0; /* Set dimensions */ size.w = xd->font.w; size.h = xd->font.h; draw_text(xd->surface, &xd->font, &size, x, y, n, color, str); invalidate_drawing_area(xd->drawing_area, r); } static void cr_aligned_text_print(xtra_win_data *xd, int x, int y, const char *str, byte color, const char *str2, byte color2, int length) { int x2; x2 = x + length - strlen(str2) + 1; if (x2 > 0) { draw_xtra_cr_text(xd, x, y, color, str); draw_xtra_cr_text(xd, x2, y, color2, str2); } else { draw_xtra_cr_text(xd, x, y, color, str); draw_xtra_cr_text(xd, x + strlen(str) + 1, y, color2, str2); } } /* * Equippy chars */ static void cr_print_equippy(xtra_win_data *xd, int y) { int i, j = 0; byte a; char c[6]; object_type *o_ptr; /* No equippy chars if we're in bigtile mode or creating a char */ if ((tile_width == 2) || (arg_graphics != 0) || (!character_generated)) { return; } /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { /* Object */ o_ptr = &p_ptr->inventory[i]; if (o_ptr->kind) { a = object_attr(o_ptr); strnfmt(c, sizeof(c), "%c",object_char(o_ptr)); } else { c [0]= ' '; a = TERM_WHITE; } /* Dump */ draw_xtra_cr_text(xd, j, y, a, c); j++; } strnfmt(c, sizeof(c), " "); draw_xtra_cr_text(xd, j + 1, y, a, c); } static void xtra_drawn_progress_bar(xtra_win_data *xd, int x, int y, float curr, float max, byte color, int size) { cairo_rectangle_t r; init_cairo_rect(&r, (xd->font.w * x)+ 1, (xd->font.h) * y + 1, (xd->font.w * size) - 1, xd->font.h - 2); drawn_progress_bar(xd->surface, &xd->font, x, y, curr, max, color, size); invalidate_drawing_area(xd->drawing_area, r); } static void handle_sidebar(game_event_type type, game_event_data *data, void *user) { char str[80]/*, str2[80]*/; cairo_rectangle_t r; xtra_win_data *xd = &xdata[5]; long xp = (long)p_ptr->exp; monster_type *m_ptr = cave_monster(cave, p_ptr->health_who); int i = 0, sidebar_length = 12; /* Calculate XP for next level */ if (p_ptr->lev != 50) xp = (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp; if ((xd->surface != NULL) && (xd->visible == TRUE)) { /* Clear the window */ init_cairo_rect(&r, 0, 0, xd->font.w * 255, xd->font.h * 255); cairo_clear(xd->surface, r, TERM_DARK); /* Char Name */ strnfmt(str, sizeof(str), "%s", op_ptr->full_name); draw_xtra_cr_text(xd, 0, 0, TERM_L_BLUE, str); /* Char Race */ strnfmt(str, sizeof(str), "%s", p_ptr->race->name); draw_xtra_cr_text(xd, 0, 1, TERM_L_BLUE, str); /* Char Title*/ strnfmt(str, sizeof(str), "%s", p_ptr->class->title[(p_ptr->lev - 1) / 5], TERM_L_BLUE); draw_xtra_cr_text(xd, 0, 2, TERM_L_BLUE, str); /* Char Class */ strnfmt(str, sizeof(str), "%s", p_ptr->class->name); draw_xtra_cr_text(xd, 0, 3, TERM_L_BLUE, str); /* Char Level */ strnfmt(str, sizeof(str), "%i", p_ptr->lev); cr_aligned_text_print(xd, 0, 4, sidebar_text[4], TERM_WHITE, str, TERM_L_GREEN, sidebar_length); /* Char xp */ if (p_ptr->lev != 50) strnfmt(sidebar_text[5], sizeof(str), "Next: "); else strnfmt(sidebar_text[5], sizeof(str), "XP: "); strnfmt(str, sizeof(str), "%ld", xp); cr_aligned_text_print(xd, 0, 5, sidebar_text[5], TERM_WHITE, str, TERM_L_GREEN, sidebar_length); /* Char Gold */ strnfmt(str, sizeof(str), "%ld", p_ptr->au); cr_aligned_text_print(xd, 0, 6, sidebar_text[6], TERM_WHITE, str, TERM_L_GREEN, sidebar_length); /* Equippy chars is 0,7 */ cr_print_equippy(xd, 7); /* Char Stats */ for (i = A_STR; i <= A_CHR; i++) { cnv_stat(p_ptr->state.stat_use[i], str, sizeof(str)); cr_aligned_text_print(xd, 0, i+8, sidebar_text[i+8], TERM_WHITE, str, TERM_L_GREEN, sidebar_length); } /* 14 is a blank row */ /* Char AC */ strnfmt(str, sizeof(str), "%i", p_ptr->state.dis_ac + p_ptr->state.dis_to_a); cr_aligned_text_print(xd, 0, 15, sidebar_text[15], TERM_WHITE, str, TERM_L_GREEN, sidebar_length); /* Char HP */ strnfmt(str, sizeof(str), "%4d/%4d", p_ptr->chp, p_ptr->mhp); cr_aligned_text_print(xd, 0, 16, sidebar_text[16], TERM_WHITE, str, player_hp_attr(p_ptr), sidebar_length); xtra_drawn_progress_bar(xd, 0, 17, p_ptr->chp, p_ptr->mhp, player_hp_attr(p_ptr), 13); /* Char MP */ strnfmt(str, sizeof(str), "%4d/%4d", p_ptr->csp, p_ptr->msp); cr_aligned_text_print(xd, 0, 18,sidebar_text[18], TERM_WHITE, str, player_sp_attr(p_ptr), sidebar_length); xtra_drawn_progress_bar(xd, 0, 19, p_ptr->csp, p_ptr->msp, player_sp_attr(p_ptr), 13); /* 20 is blank */ xtra_drawn_progress_bar(xd, 0, 21, m_ptr->hp, m_ptr->maxhp, monster_health_attr(), 13); /* Print the level */ strnfmt(str, sizeof(str), "%d' (L%d)", p_ptr->depth * 50, p_ptr->depth); strnfmt(sidebar_text[22], sizeof(sidebar_text[22]), "%-*s", sidebar_length, str); draw_xtra_cr_text(xd, 0, 22, TERM_WHITE, sidebar_text[22]); invalidate_drawing_area(xd->drawing_area, r); } } static void handle_map(game_event_type type, game_event_data *data, void *user) { if (use_graphics != arg_graphics) { use_graphics = arg_graphics; init_graf(arg_graphics); } } static void handle_game(game_event_type type, game_event_data *data, void *user) { init_graf(arg_graphics); } /* These don't do anything right now, but I like having the hooks ready. */ static void handle_moved(game_event_type type, game_event_data *data, void *user) {} static void handle_mons_target(game_event_type type, game_event_data *data, void *user) {} static void handle_init_status(game_event_type type, game_event_data *data, void *user) {} static void handle_birth(game_event_type type, game_event_data *data, void *user) {} static void handle_store(game_event_type type, game_event_data *data, void *user){} static void handle_death(game_event_type type, game_event_data *data, void *user){} static void handle_end(game_event_type type, game_event_data *data, void *user){} static void handle_splash(game_event_type type, game_event_data *data, void *user){} static void handle_statusline(game_event_type type, game_event_data *data, void *user) {} /* Command dispatcher for gtk builds */ static errr gtk_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_init_cmd(wait); else return textui_get_cmd(context, wait); } void init_handlers() { /* Activate hooks */ quit_aux = hook_quit; /* Set command hook */ cmd_get_hook = gtk_get_cmd; /* I plan to put everything on the sidebar together, as well as the statusline, so... */ event_add_handler_set(my_player_events, N_ELEMENTS(my_player_events), handle_sidebar, NULL); event_add_handler_set(my_statusline_events, N_ELEMENTS(my_statusline_events), handle_statusline, NULL); event_add_handler(EVENT_MAP, handle_map, NULL); event_add_handler(EVENT_INVENTORY, handle_inv, NULL); event_add_handler(EVENT_EQUIPMENT, handle_equip, NULL); event_add_handler(EVENT_MONSTERLIST, handle_mons_list, NULL); event_add_handler(EVENT_MESSAGE, handle_message, NULL); event_add_handler(EVENT_ENTER_GAME, handle_game, NULL); event_add_handler(EVENT_PLAYERMOVED, handle_moved, NULL); event_add_handler(EVENT_MONSTERTARGET, handle_mons_target, NULL); event_add_handler(EVENT_INITSTATUS, handle_init_status, NULL); event_add_handler(EVENT_LEAVE_INIT, handle_leave_init, NULL); event_add_handler(EVENT_ENTER_BIRTH, handle_birth, NULL); event_add_handler(EVENT_ENTER_STORE, handle_store, NULL); event_add_handler(EVENT_ENTER_DEATH, handle_death, NULL); event_add_handler(EVENT_END, handle_end, NULL); event_add_handler(EVENT_ENTER_INIT, handle_splash, NULL); } errr init_gtk(int argc, char **argv) { int i, ok; game_saved = FALSE; toolbar_size = 0; /* Initialize the environment */ ok = gtk_init_check(&argc, &argv); if (ok == FALSE) return -1; /* Parse args */ for (i = 1; i < argc; i++) { if (prefix(argv[i], "-n")) { num_term = atoi(&argv[i][2]); if (num_term > MAX_TERM_DATA) num_term = MAX_TERM_DATA; else if (num_term < 1) num_term = 1; continue; } if (prefix(argv[i], "-i")) { gtk_log_fmt(TERM_VIOLET, "Ignoring preferences."); ignore_prefs = TRUE; continue; } gtk_log_fmt(TERM_VIOLET, "Ignoring option: %s", argv[i]); } /* Load Extra Windows */ for (i = 0; i < MAX_XTRA_WIN_DATA; i++) { xtra_win_data *xd = &xdata[i]; xtra_data_init(xd, i); } /* Initialize the windows */ for (i = 0; i < num_term; i++) { term_data *td = &data[i]; /* Initialize the term_data */ term_data_init(td, i); /* Save global entry */ angband_term[i] = Term; } /* Init dirs */ create_needed_dirs(); /* Load Preferences */ load_prefs(); /* Init the windows */ init_gtk_windows(); /* Init "Extra" windows */ init_xtra_windows(); /* Show them all */ show_windows(); /* Initialise hooks and handlers */ init_handlers(); Term_activate(&data[0].t); /* Set the system suffix */ ANGBAND_SYS = "gtk"; /* Catch nasty signals, unless we want to see them */ #ifndef GTK_DEBUG signals_init(); #endif /* Prompt the user */ prt("[Choose 'New' or 'Open' from the 'File' menu]", 23, 17); Term_fresh(); game_in_progress = FALSE; /* Set up the display handlers and things. */ init_display(); /* Let's play */ play_game(); /* Do all the things main() in main.c already does */ cleanup_angband(); quit(NULL); exit(0); /* just in case */ /* Success */ return (0); } #endif /* USE_GTK */ angband-v3.3.2/src/gtk/cairo-utils.c0000644000175000017500000002142211651552410016563 0ustar chriscchrisc/* * File: cairo_utils.c * Purpose: Cairo calls for use in Angband ports * (Currently for the Gtk port, but should be reusable.) * * Copyright (c) 2000-2007 Robert Ruehlmann, Shanoah Alkire * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #ifdef USE_GTK #include "cairo-utils.h" #define USE_PANGO void set_foreground_color(cairo_t *cr, byte a) { cairo_set_source_rgb(cr, (double)angband_color_table[a][1] / 256, (double)angband_color_table[a][2] / 256, (double)angband_color_table[a][3] / 256); } void init_cairo_rect(cairo_rectangle_t *r, int x, int y, int w, int h) { r->x = x; r->y = y; r->width = w; r->height = h; } void c_rect(cairo_t *cr, cairo_rectangle_t r) { if (cr !=NULL) cairo_rectangle (cr, r.x, r.y, r.width, r.height); } /* * Erase the whole term. */ void cairo_clear(cairo_surface_t *surface, cairo_rectangle_t r, byte c) { cairo_t *cr = NULL; if ((surface != NULL) &&(cairo_surface_status(surface) == CAIRO_STATUS_SUCCESS)) { cr = cairo_create(surface); if (cr !=NULL) { cairo_save(cr); c_rect(cr, r); set_foreground_color(cr, c); cairo_fill(cr); cairo_close_path(cr); cairo_restore(cr); } cairo_destroy(cr); } } void cairo_cursor(cairo_surface_t *surface, cairo_rectangle_t r, byte c) { cairo_t *cr; if (surface != NULL) { cr = cairo_create(surface); if (cr !=NULL) { cairo_save(cr); c_rect(cr, r); set_foreground_color(cr, c); cairo_set_operator(cr, CAIRO_OPERATOR_ADD); cairo_fill(cr); cairo_close_path(cr); cairo_restore(cr); } cairo_destroy(cr); } } void drawn_progress_bar(cairo_surface_t *surface, font_info *font, int x, int y, float curr, float max, byte color, int len) { cairo_t *cr; int temp; cairo_rectangle_t r; float percent; measurements size; size.w = font->w; size.h = font->h; if (surface != NULL) { cr = cairo_create(surface); if (max > 0) percent = curr / max; else percent = 0; init_cairo_rect(&r, (size.w * x)+ 1, (size.h) * y + 1, (size.w * len) - 1, size.h - 2); cairo_clear(surface, r, TERM_DARK); temp = cairo_get_line_width(cr); set_foreground_color(cr, color); if (percent > 0) { cairo_set_line_width(cr, size.h); cairo_move_to(cr, r.x, r.y + (r.height * 0.5)); cairo_line_to(cr, (size.w * ((len * percent) + x)), r.y + (r.height * 0.5)); cairo_stroke(cr); } if (max > 0) { cairo_set_line_width(cr, 1); set_foreground_color(cr, TERM_SLATE); c_rect(cr, r); cairo_stroke(cr); cairo_set_line_width(cr, temp); } cairo_destroy(cr); } } void draw_tile(cairo_t *cr, cairo_matrix_t m, cairo_rectangle_t r, int tx, int ty) { if (cr !=NULL) { cairo_save(cr); /* Use the rect and pattern */ c_rect(cr, r); cairo_set_source (cr, tile_pattern); /* Pull the tile we need */ cairo_surface_set_device_offset(graphical_tiles, tx - r.x, ty - r.y); /* Use transparency */ cairo_set_operator(cr, CAIRO_OPERATOR_ADD); /* Use the matrix with our pattern */ cairo_pattern_set_matrix(tile_pattern, &m); /* Draw it */ cairo_fill(cr); cairo_restore(cr); } } cairo_matrix_t cairo_font_scaling(cairo_surface_t *surface, double tile_w, double tile_h, double font_w, double font_h) { cairo_t *cr; cairo_matrix_t m; double sx, sy; if (surface != NULL) { cr = cairo_create(surface); if (cr !=NULL) { /* Get a matrix set up to scale the graphics. */ cairo_get_matrix(cr, &m); sx = (tile_w)/(font_w); sy = (tile_h)/(font_h); cairo_matrix_scale(&m, sx, sy); } cairo_destroy(cr); } return(m); } void cairo_draw_from_surface(cairo_t *cr, cairo_surface_t *surface, cairo_rectangle_t r) { if ((cr !=NULL) && (surface != NULL)) { cairo_save(cr); c_rect(cr, r); cairo_set_source_surface(cr, surface, 0, 0); cairo_fill(cr); cairo_restore(cr); } } /* * Main reason for the lengthy header is strictly so we don't rely on the font size and tile size * having one particular naming convention in term data. That should probably be standardized * across the board, honestly. */ void draw_tiles( cairo_surface_t *surface, int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp, font_info *font, measurements *actual, measurements *tile) { cairo_t *cr; cairo_rectangle_t char_rect, r; int i; /* Tile & Current Position */ int tx, ty; int cx, cy; if (surface != NULL) { cr = cairo_create(surface); if (cr !=NULL) { init_cairo_rect(&r, x * font->w, y * font->h, actual->w * n, actual->h); cairo_clear(surface, r, TERM_DARK); /* Get the current position, Minus cx, which changes for each iteration */ cx = 0; cy = (y * font->h); for (i = 0; i < n; i++) { /* Increment x 1 step; use the font width because of equippy chars and the gap between * the status bar and the map. */ cx += x * font->w; init_cairo_rect(&char_rect, cx, cy, actual->w, actual->h); cairo_clear(surface, char_rect, TERM_DARK); /* Get the terrain tile, scaled to the font size */ tx= (tcp[i] & 0x7F) * actual->w; ty = (tap[i] & 0x7F) * actual->h; draw_tile(cr, matrix, char_rect, tx, ty); /* If foreground is the same as background, we're done */ if ((tap[i] == ap[i]) && (tcp[i] == cp[i])) continue; /* Get the foreground tile size, scaled to the font size */ tx = (cp[i] & 0x7F) * actual->w; ty = (ap[i] & 0x7F) * actual->h; draw_tile(cr, matrix, char_rect, tx, ty); } } cairo_destroy(cr); } } void get_font_size(font_info *font) { #ifndef USE_PANGO get_toy_font_size(font); #else PangoRectangle r; PangoLayout *temp; PangoFontDescription *temp_font; cairo_t *cr; cairo_surface_t *surface; surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 200, 200); cr = cairo_create(surface); temp = pango_cairo_create_layout(cr); temp_font = pango_font_description_from_string(font->name); /* Draw an @, and measure it */ pango_layout_set_font_description(temp, temp_font); pango_layout_set_text(temp, "@", 1); pango_cairo_show_layout(cr, temp); pango_layout_get_pixel_extents(temp, NULL, &r); font->w = r.width; font->h = r.height; pango_font_description_free(temp_font); cairo_destroy(cr); cairo_surface_destroy(surface); g_object_unref(temp); #endif } void draw_text(cairo_surface_t *surface, font_info *font, measurements *actual, int x, int y, int n, byte a, const char *s) { cairo_t *cr; if (surface != NULL) { cairo_rectangle_t r; PangoLayout *layout; PangoFontDescription *temp_font; cr = cairo_create(surface); #ifndef USE_PANGO draw_toy_text(cr, font, actual, x, y, n, a, s); #else if (cr !=NULL) { init_cairo_rect(&r, x * font->w, y * font->h, actual->w * n, actual->h); cairo_clear(surface, r, TERM_DARK); /* Create a PangoLayout, set the font and text */ layout = pango_cairo_create_layout(cr); temp_font = pango_font_description_from_string(font->name); set_foreground_color(cr, a); pango_layout_set_text(layout, s, n); pango_layout_set_font_description(layout, temp_font); /* Draw the text to the pixmap */ cairo_move_to(cr, x * font->w, y * font->h); pango_cairo_show_layout(cr, layout); g_object_unref(G_OBJECT(layout)); } #endif cairo_destroy(cr); } } /* Experimental - Currently messes up the display if larger then 12 point Monospace */ void set_cairo_font_size(cairo_t *cr, font_info *font) { double size; cairo_font_extents_t extents; cairo_text_extents_t text_extents; cairo_select_font_face(cr, font->family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); size = font->size * (96.0/72.0); cairo_set_font_size(cr, size); cairo_font_extents(cr, &extents); cairo_text_extents(cr, "@", &text_extents); font->w = extents.max_x_advance; font->h = extents.height; font->descent = extents.descent; } void get_toy_font_size(font_info *font) { cairo_t *cr; cairo_surface_t *surface; surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 200, 200); cr = cairo_create(surface); set_cairo_font_size(cr, font); cairo_destroy(cr); cairo_surface_destroy(surface); } void draw_toy_text(cairo_t *cr, font_info *font, measurements *actual, int x, int y, int n, byte a, const char *s) { char str[255]; cairo_rectangle_t r; set_cairo_font_size(cr, font); init_cairo_rect(&r, x * font->w, y * font->h, font->w * n, font->h); c_rect(cr,r); cairo_stroke(cr); my_strcpy(str, s, n + 1); if (cr !=NULL) { set_foreground_color(cr, a); cairo_move_to(cr, x * (font->w), (y + 1) * font->h - font->descent); cairo_show_text(cr, str); } } #endif /*USE_GTK */ angband-v3.3.2/src/util.c0000644000175000017500000012735411651552410014533 0ustar chriscchrisc/* * File: util.c * Purpose: Gamma correction, some high-level UI functions, inkey() * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "button.h" #include "cmds.h" #include "game-event.h" #include "randname.h" /* * Find the start of a possible Roman numerals suffix by going back from the * end of the string to a space, then checking that all the remaining chars * are valid Roman numerals. * * Return the start position, or NULL if there isn't a valid suffix. */ char *find_roman_suffix_start(const char *buf) { const char *start = strrchr(buf, ' '); const char *p; if (start) { start++; p = start; while (*p) { if (*p != 'I' && *p != 'V' && *p != 'X' && *p != 'L' && *p != 'C' && *p != 'D' && *p != 'M') { start = NULL; break; } ++p; } } return (char *)start; } /*----- Roman numeral functions ------*/ /* * Converts an arabic numeral (int) to a roman numeral (char *). * * An arabic numeral is accepted in parameter `n`, and the corresponding * upper-case roman numeral is placed in the parameter `roman`. The * length of the buffer must be passed in the `bufsize` parameter. When * there is insufficient room in the buffer, or a roman numeral does not * exist (e.g. non-positive integers) a value of 0 is returned and the * `roman` buffer will be the empty string. On success, a value of 1 is * returned and the zero-terminated roman numeral is placed in the * parameter `roman`. */ int int_to_roman(int n, char *roman, size_t bufsize) { /* Roman symbols */ char roman_symbol_labels[13][3] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; int roman_symbol_values[13] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; /* Clear the roman numeral buffer */ roman[0] = '\0'; /* Roman numerals have no zero or negative numbers */ if (n < 1) return 0; /* Build the roman numeral in the buffer */ while (n > 0) { int i = 0; /* Find the largest possible roman symbol */ while (n < roman_symbol_values[i]) i++; /* No room in buffer, so abort */ if (strlen(roman) + strlen(roman_symbol_labels[i]) + 1 > bufsize) break; /* Add the roman symbol to the buffer */ my_strcat(roman, roman_symbol_labels[i], bufsize); /* Decrease the value of the arabic numeral */ n -= roman_symbol_values[i]; } /* Ran out of space and aborted */ if (n > 0) { /* Clean up and return */ roman[0] = '\0'; return 0; } return 1; } /* * Converts a roman numeral (char *) to an arabic numeral (int). * * The null-terminated roman numeral is accepted in the `roman` * parameter and the corresponding integer arabic numeral is returned. * Only upper-case values are considered. When the `roman` parameter * is empty or does not resemble a roman numeral, a value of -1 is * returned. * * XXX This function will parse certain non-sense strings as roman * numerals, such as IVXCCCVIII */ int roman_to_int(const char *roman) { size_t i; int n = 0; char *p; char roman_token_chr1[] = "MDCLXVI"; const char *roman_token_chr2[] = {0, 0, "DM", 0, "LC", 0, "VX"}; int roman_token_vals[7][3] = {{1000}, {500}, {100, 400, 900}, {50}, {10, 40, 90}, {5}, {1, 4, 9}}; if (strlen(roman) == 0) return -1; /* Check each character for a roman token, and look ahead to the character after this one to check for subtraction */ for (i = 0; i < strlen(roman); i++) { char c1, c2; int c1i, c2i; /* Get the first and second chars of the next roman token */ c1 = roman[i]; c2 = roman[i + 1]; /* Find the index for the first character */ p = strchr(roman_token_chr1, c1); if (p) { c1i = p - roman_token_chr1; } else { return -1; } /* Find the index for the second character */ c2i = 0; if (roman_token_chr2[c1i] && c2) { p = strchr(roman_token_chr2[c1i], c2); if (p) { c2i = (p - roman_token_chr2[c1i]) + 1; /* Two-digit token, so skip a char on the next pass */ i++; } } /* Increase the arabic numeral */ n += roman_token_vals[c1i][c2i]; } return n; } /* * Flush all pending input. * * Actually, remember the flush, using the "inkey_xtra" flag, and in the * next call to "inkey()", perform the actual flushing, for efficiency, * and correctness of the "inkey()" function. */ void flush(void) { /* Do it later */ inkey_xtra = TRUE; } /* * Helper function called only from "inkey()" */ static ui_event inkey_aux(int scan_cutoff) { int w = 0; ui_event ke; /* Wait for a keypress */ if (scan_cutoff == SCAN_OFF) { (void)(Term_inkey(&ke, TRUE, TRUE)); } else { w = 0; /* Wait only as long as macro activation would wait*/ while (Term_inkey(&ke, FALSE, TRUE) != 0) { /* Increase "wait" */ w++; /* Excessive delay */ if (w >= scan_cutoff) { ui_event empty = EVENT_EMPTY; return empty; } /* Delay */ Term_xtra(TERM_XTRA_DELAY, 10); } } return (ke); } /* * Mega-Hack -- special "inkey_next" pointer. XXX XXX XXX * * This special pointer allows a sequence of keys to be "inserted" into * the stream of keys returned by "inkey()". This key sequence cannot be * bypassed by the Borg. We use it to implement keymaps. */ struct keypress *inkey_next = NULL; #ifdef ALLOW_BORG /* * Mega-Hack -- special "inkey_hack" hook. XXX XXX XXX * * This special function hook allows the "Borg" (see elsewhere) to take * control of the "inkey()" function, and substitute in fake keypresses. */ struct keypress (*inkey_hack)(int flush_first) = NULL; #endif /* ALLOW_BORG */ /* * Get a keypress from the user. * * This function recognizes a few "global parameters". These are variables * which, if set to TRUE before calling this function, will have an effect * on this function, and which are always reset to FALSE by this function * before this function returns. Thus they function just like normal * parameters, except that most calls to this function can ignore them. * * If "inkey_xtra" is TRUE, then all pending keypresses will be flushed. * This is set by flush(), which doesn't actually flush anything itself * but uses that flag to trigger delayed flushing. * * If "inkey_scan" is TRUE, then we will immediately return "zero" if no * keypress is available, instead of waiting for a keypress. * * If "inkey_flag" is TRUE, then we are waiting for a command in the main * map interface, and we shouldn't show a cursor. * * If we are waiting for a keypress, and no keypress is ready, then we will * refresh (once) the window which was active when this function was called. * * Note that "back-quote" is automatically converted into "escape" for * convenience on machines with no "escape" key. * * If "angband_term[0]" is not active, we will make it active during this * function, so that the various "main-xxx.c" files can assume that input * is only requested (via "Term_inkey()") when "angband_term[0]" is active. * * Mega-Hack -- This function is used as the entry point for clearing the * "signal_count" variable, and of the "character_saved" variable. * * Mega-Hack -- Note the use of "inkey_hack" to allow the "Borg" to steal * control of the keyboard from the user. */ ui_event inkey_ex(void) { bool cursor_state; ui_event kk; ui_event ke = EVENT_EMPTY; bool done = FALSE; term *old = Term; /* Delayed flush */ if (inkey_xtra) { Term_flush(); inkey_next = NULL; inkey_xtra = FALSE; } /* Hack -- Use the "inkey_next" pointer */ if (inkey_next && inkey_next->code) { /* Get next character, and advance */ ke.key = *inkey_next++; /* Cancel the various "global parameters" */ inkey_flag = FALSE; inkey_scan = 0; /* Accept result */ return (ke); } /* Forget pointer */ inkey_next = NULL; #ifdef ALLOW_BORG /* Mega-Hack -- Use the special hook */ if (inkey_hack && ((ke.key = (*inkey_hack)(inkey_xtra)) != 0)) { /* Cancel the various "global parameters" */ inkey_flag = FALSE; inkey_scan = 0; ke.type = EVT_KBRD; /* Accept result */ return (ke); } #endif /* ALLOW_BORG */ /* Get the cursor state */ (void)Term_get_cursor(&cursor_state); /* Show the cursor if waiting, except sometimes in "command" mode */ if (!inkey_scan && (!inkey_flag || character_icky)) (void)Term_set_cursor(TRUE); /* Hack -- Activate main screen */ Term_activate(term_screen); /* Get a key */ while (ke.type == EVT_NONE) { /* Hack -- Handle "inkey_scan == SCAN_INSTANT */ if (inkey_scan == SCAN_INSTANT && (0 != Term_inkey(&kk, FALSE, FALSE))) break; /* Hack -- Flush output once when no key ready */ if (!done && (0 != Term_inkey(&kk, FALSE, FALSE))) { /* Hack -- activate proper term */ Term_activate(old); /* Flush output */ Term_fresh(); /* Hack -- activate main screen */ Term_activate(term_screen); /* Mega-Hack -- reset saved flag */ character_saved = FALSE; /* Mega-Hack -- reset signal counter */ signal_count = 0; /* Only once */ done = TRUE; } /* Get a key (see above) */ ke = inkey_aux(inkey_scan); /* Handle mouse buttons */ if ((ke.type == EVT_MOUSE) && (OPT(mouse_buttons))) { /* Check to see if we've hit a button */ /* Assuming text buttons here for now - this would have to * change for GUI buttons */ char key = button_get_key(ke.mouse.x, ke.mouse.y); if (key) { /* Rewrite the event */ /* XXXmacro button implementation needs updating */ ke.type = EVT_BUTTON; ke.key.code = key; ke.key.mods = 0; /* Done */ break; } } /* Treat back-quote as escape */ if (ke.key.code == '`') ke.key.code = ESCAPE; } /* Hack -- restore the term */ Term_activate(old); /* Restore the cursor */ Term_set_cursor(cursor_state); /* Cancel the various "global parameters" */ inkey_flag = FALSE; inkey_scan = 0; /* Return the keypress */ return (ke); } /* * Get a keypress or mouse click from the user. */ void anykey(void) { ui_event ke = EVENT_EMPTY; /* Only accept a keypress or mouse click */ while (ke.type != EVT_MOUSE && ke.type != EVT_KBRD) ke = inkey_ex(); } /* * Get a "keypress" from the user. */ struct keypress inkey(void) { ui_event ke = EVENT_EMPTY; /* Only accept a keypress */ while (ke.type != EVT_ESCAPE && ke.type != EVT_KBRD) ke = inkey_ex(); /* Paranoia */ if (ke.type == EVT_ESCAPE) { ke.type = EVT_KBRD; ke.key.code = ESCAPE; ke.key.mods = 0; } return ke.key; } /* * Flush the screen, make a noise */ void bell(const char *reason) { /* Mega-Hack -- Flush the output */ Term_fresh(); /* Hack -- memorize the reason if possible */ if (character_generated && reason) { message_add(reason, MSG_BELL); /* Window stuff */ p_ptr->redraw |= (PR_MESSAGE); redraw_stuff(p_ptr); } /* Flush the input (later!) */ flush(); } /* * Hack -- Make a (relevant?) sound */ void sound(int val) { /* No sound */ if (!OPT(use_sound) || !sound_hook) return; sound_hook(val); } /* * Hack -- flush */ static void msg_flush(int x) { byte a = TERM_L_BLUE; /* Pause for response */ Term_putstr(x, 0, -1, a, "-more-"); if (!OPT(auto_more)) anykey(); /* Clear the line */ Term_erase(0, 0, 255); } static int message_column = 0; /* * Output a message to the top line of the screen. * * Break long messages into multiple pieces (40-72 chars). * * Allow multiple short messages to "share" the top line. * * Prompt the user to make sure he has a chance to read them. * * These messages are memorized for later reference (see above). * * We could do a "Term_fresh()" to provide "flicker" if needed. * * The global "msg_flag" variable can be cleared to tell us to "erase" any * "pending" messages still on the screen, instead of using "msg_flush()". * This should only be done when the user is known to have read the message. * * We must be very careful about using the "msg("%s", )" functions without * explicitly calling the special "msg("%s", NULL)" function, since this may * result in the loss of information if the screen is cleared, or if anything * is displayed on the top line. * * Hack -- Note that "msg("%s", NULL)" will clear the top line even if no * messages are pending. */ static void msg_print_aux(u16b type, const char *msg) { int n; char *t; char buf[1024]; byte color; int w, h; if (!Term) return; /* Obtain the size */ (void)Term_get_size(&w, &h); /* Hack -- Reset */ if (!msg_flag) message_column = 0; /* Message Length */ n = (msg ? strlen(msg) : 0); /* Hack -- flush when requested or needed */ if (message_column && (!msg || ((message_column + n) > (w - 8)))) { /* Flush */ msg_flush(message_column); /* Forget it */ msg_flag = FALSE; /* Reset */ message_column = 0; } /* No message */ if (!msg) return; /* Paranoia */ if (n > 1000) return; /* Memorize the message (if legal) */ if (character_generated && !(p_ptr->is_dead)) message_add(msg, type); /* Window stuff */ p_ptr->redraw |= (PR_MESSAGE); /* Copy it */ my_strcpy(buf, msg, sizeof(buf)); /* Analyze the buffer */ t = buf; /* Get the color of the message */ color = message_type_color(type); /* Split message */ while (n > w - 1) { char oops; int check, split; /* Default split */ split = w - 8; /* Find the rightmost split point */ for (check = (w / 2); check < w - 8; check++) if (t[check] == ' ') split = check; /* Save the split character */ oops = t[split]; /* Split the message */ t[split] = '\0'; /* Display part of the message */ Term_putstr(0, 0, split, color, t); /* Flush it */ msg_flush(split + 1); /* Restore the split character */ t[split] = oops; /* Insert a space */ t[--split] = ' '; /* Prepare to recurse on the rest of "buf" */ t += split; n -= split; } /* Display the tail of the message */ Term_putstr(message_column, 0, n, color, t); /* Remember the message */ msg_flag = TRUE; /* Remember the position */ message_column += n + 1; /* Send refresh event */ event_signal(EVENT_MESSAGE); } /* * Display a formatted message, using "vstrnfmt()" and "msg("%s", )". */ void msg(const char *fmt, ...) { va_list vp; char buf[1024]; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format the args, save the length */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Display */ msg_print_aux(MSG_GENERIC, buf); } void msgt(unsigned int type, const char *fmt, ...) { va_list vp; char buf[1024]; va_start(vp, fmt); vstrnfmt(buf, sizeof(buf), fmt, vp); va_end(vp); sound(type); msg_print_aux(type, buf); } /* * Print the queued messages. */ void message_flush(void) { /* Hack -- Reset */ if (!msg_flag) message_column = 0; /* Flush when needed */ if (message_column) { /* Print pending messages */ if (Term) msg_flush(message_column); /* Forget it */ msg_flag = FALSE; /* Reset */ message_column = 0; } } /* * Save the screen, and increase the "icky" depth. * * This function must match exactly one call to "screen_load()". */ void screen_save(void) { /* Hack -- Flush messages */ message_flush(); /* Save the screen (if legal) */ Term_save(); /* Increase "icky" depth */ character_icky++; } /* * Load the screen, and decrease the "icky" depth. * * This function must match exactly one call to "screen_save()". */ void screen_load(void) { /* Hack -- Flush messages */ message_flush(); /* Load the screen (if legal) */ Term_load(); /* Decrease "icky" depth */ character_icky--; /* Mega hack -redraw big graphics - sorry NRM */ if (character_icky == 0 && (tile_width > 1 || tile_height > 1)) Term_redraw(); } /* * Display a string on the screen using an attribute. * * At the given location, using the given attribute, if allowed, * add the given string. Do not clear the line. */ void c_put_str(byte attr, const char *str, int row, int col) { /* Position cursor, Dump the attr/text */ Term_putstr(col, row, -1, attr, str); } /* * As above, but in "white" */ void put_str(const char *str, int row, int col) { /* Spawn */ Term_putstr(col, row, -1, TERM_WHITE, str); } /* * Display a string on the screen using an attribute, and clear * to the end of the line. */ void c_prt(byte attr, const char *str, int row, int col) { /* Clear line, position cursor */ Term_erase(col, row, 255); /* Dump the attr/text */ Term_addstr(-1, attr, str); } /* * As above, but in "white" */ void prt(const char *str, int row, int col) { /* Spawn */ c_prt(TERM_WHITE, str, row, col); } /* * Print some (colored) text to the screen at the current cursor position, * automatically "wrapping" existing text (at spaces) when necessary to * avoid placing any text into the last column, and clearing every line * before placing any text in that line. Also, allow "newline" to force * a "wrap" to the next line. Advance the cursor as needed so sequential * calls to this function will work correctly. * * Once this function has been called, the cursor should not be moved * until all the related "text_out()" calls to the window are complete. * * This function will correctly handle any width up to the maximum legal * value of 256, though it works best for a standard 80 character width. */ void text_out_to_screen(byte a, const char *str) { int x, y; int wid, h; int wrap; const char *s; char buf[1024]; /* We use either ascii or system-specific encoding */ int encoding = (OPT(xchars_to_file)) ? SYSTEM_SPECIFIC : ASCII; /* Obtain the size */ (void)Term_get_size(&wid, &h); /* Obtain the cursor */ (void)Term_locate(&x, &y); /* Copy to a rewriteable string */ my_strcpy(buf, str, 1024); /* Translate it to 7-bit ASCII or system-specific format */ xstr_trans(buf, encoding); /* Use special wrapping boundary? */ if ((text_out_wrap > 0) && (text_out_wrap < wid)) wrap = text_out_wrap; else wrap = wid; /* Process the string */ for (s = buf; *s; s++) { char ch; /* Force wrap */ if (*s == '\n') { /* Wrap */ x = text_out_indent; y++; /* Clear line, move cursor */ Term_erase(x, y, 255); x += text_out_pad; Term_gotoxy(x, y); continue; } /* Clean up the char */ ch = (my_isprint((unsigned char)*s) ? *s : ' '); /* Wrap words as needed */ if ((x >= wrap - 1) && (ch != ' ')) { int i, n = 0; byte av[256]; char cv[256]; /* Wrap word */ if (x < wrap) { /* Scan existing text */ for (i = wrap - 2; i >= 0; i--) { /* Grab existing attr/char */ Term_what(i, y, &av[i], &cv[i]); /* Break on space */ if (cv[i] == ' ') break; /* Track current word */ n = i; } } /* Special case */ if (n == 0) n = wrap; /* Clear line */ Term_erase(n, y, 255); /* Wrap */ x = text_out_indent; y++; /* Clear line, move cursor */ Term_erase(x, y, 255); x += text_out_pad; Term_gotoxy(x, y); /* Wrap the word (if any) */ for (i = n; i < wrap - 1; i++) { /* Dump */ Term_addch(av[i], cv[i]); /* Advance (no wrap) */ if (++x > wrap) x = wrap; } } /* Dump */ Term_addch(a, ch); /* Advance */ if (++x > wrap) x = wrap; } } /* * Write text to the given file and apply line-wrapping. * * Hook function for text_out(). Make sure that text_out_file points * to an open text-file. * * Long lines will be wrapped at text_out_wrap, or at column 75 if that * is not set; or at a newline character. Note that punctuation can * sometimes be placed one column beyond the wrap limit. * * You must be careful to end all file output with a newline character * to "flush" the stored line position. */ void text_out_to_file(byte a, const char *str) { const char *s; char buf[1024]; /* Current position on the line */ static int pos = 0; /* Wrap width */ int wrap = (text_out_wrap ? text_out_wrap : 75); /* We use either ascii or system-specific encoding */ int encoding = OPT(xchars_to_file) ? SYSTEM_SPECIFIC : ASCII; /* Unused parameter */ (void)a; /* Copy to a rewriteable string */ my_strcpy(buf, str, 1024); /* Translate it to 7-bit ASCII or system-specific format */ xstr_trans(buf, encoding); /* Current location within "buf" */ s = buf; /* Process the string */ while (*s) { char ch; int n = 0; int len = wrap - pos; int l_space = -1; /* If we are at the start of the line... */ if (pos == 0) { int i; /* Output the indent */ for (i = 0; i < text_out_indent; i++) { file_writec(text_out_file, ' '); pos++; } } /* Find length of line up to next newline or end-of-string */ while ((n < len) && !((s[n] == '\n') || (s[n] == '\0'))) { /* Mark the most recent space in the string */ if (s[n] == ' ') l_space = n; /* Increment */ n++; } /* If we have encountered no spaces */ if ((l_space == -1) && (n == len)) { /* If we are at the start of a new line */ if (pos == text_out_indent) { len = n; } /* HACK - Output punctuation at the end of the line */ else if ((s[0] == ' ') || (s[0] == ',') || (s[0] == '.')) { len = 1; } else { /* Begin a new line */ file_writec(text_out_file, '\n'); /* Reset */ pos = 0; continue; } } else { /* Wrap at the newline */ if ((s[n] == '\n') || (s[n] == '\0')) len = n; /* Wrap at the last space */ else len = l_space; } /* Write that line to file */ for (n = 0; n < len; n++) { /* Ensure the character is printable */ ch = (my_isprint((unsigned char) s[n]) ? s[n] : ' '); /* Write out the character */ file_writec(text_out_file, ch); /* Increment */ pos++; } /* Move 's' past the stuff we've written */ s += len; /* If we are at the end of the string, end */ if (*s == '\0') return; /* Skip newlines */ if (*s == '\n') s++; /* Begin a new line */ file_writec(text_out_file, '\n'); /* Reset */ pos = 0; /* Skip whitespace */ while (*s == ' ') s++; } /* We are done */ return; } /* * Output text to the screen or to a file depending on the selected * text_out hook. */ void text_out(const char *fmt, ...) { char buf[1024]; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Output now */ text_out_hook(TERM_WHITE, buf); } /* * Output text to the screen (in color) or to a file depending on the * selected hook. */ void text_out_c(byte a, const char *fmt, ...) { char buf[1024]; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Output now */ text_out_hook(a, buf); } /* * Given a "formatted" chunk of text (i.e. one including tags like {red}{/}) * in 'source', with starting point 'init', this finds the next section of * text and any tag that goes with it, return TRUE if it finds something to * print. * * If it returns TRUE, then it also fills 'text' with a pointer to the start * of the next printable section of text, and 'len' with the length of that * text, and 'end' with a pointer to the start of the next section. This * may differ from "text + len" because of the presence of tags. If a tag * applies to the section of text, it returns a pointer to the start of that * tag in 'tag' and the length in 'taglen'. Otherwise, 'tag' is filled with * NULL. * * See text_out_e for an example of its use. */ static bool next_section(const char *source, size_t init, const char **text, size_t *len, const char **tag, size_t *taglen, const char **end) { const char *next; *tag = NULL; *text = source + init; if (*text[0] == '\0') return FALSE; next = strchr(*text, '{'); while (next) { const char *s = next + 1; while (*s && isalpha((unsigned char) *s)) s++; /* Woo! valid opening tag thing */ if (*s == '}') { const char *close = strstr(s, "{/}"); /* There's a closing thing, so it's valid. */ if (close) { /* If this tag is at the start of the fragment */ if (next == *text) { *tag = *text + 1; *taglen = s - *text - 1; *text = s + 1; *len = close - *text; *end = close + 3; return TRUE; } /* Otherwise return the chunk up to this */ else { *len = next - *text; *end = *text + *len; return TRUE; } } /* No closing thing, therefore all one lump of text. */ else { *len = strlen(*text); *end = *text + *len; return TRUE; } } /* End of the string, that's fine. */ else if (*s == '\0') { *len = strlen(*text); *end = *text + *len; return TRUE; } /* An invalid tag, skip it. */ else { next = next + 1; } next = strchr(next, '{'); } /* Default to the rest of the string */ *len = strlen(*text); *end = *text + *len; return TRUE; } /* * Output text to the screen or to a file depending on the * selected hook. Takes strings with "embedded formatting", * such that something within {red}{/} will be printed in red. * * Note that such formatting will be treated as a "breakpoint" * for the printing, so if used within words may lead to part of the * word being moved to the next line. */ void text_out_e(const char *fmt, ...) { char buf[1024]; char smallbuf[1024]; va_list vp; const char *start, *next, *text, *tag; size_t textlen, taglen = 0; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); start = buf; while (next_section(start, 0, &text, &textlen, &tag, &taglen, &next)) { int a = -1; memcpy(smallbuf, text, textlen); smallbuf[textlen] = 0; if (tag) { char tagbuffer[11]; /* Colour names are less than 11 characters long. */ assert(taglen < 11); memcpy(tagbuffer, tag, taglen); tagbuffer[taglen] = '\0'; a = color_text_to_attr(tagbuffer); } if (a == -1) a = TERM_WHITE; /* Output now */ text_out_hook(a, smallbuf); start = next; } } /* * Clear part of the screen */ void clear_from(int row) { int y; /* Erase requested rows */ for (y = row; y < Term->hgt; y++) { /* Erase part of the screen */ Term_erase(0, y, 255); } } /* * The default "keypress handling function" for askfor_aux, this takes the * given keypress, input buffer, length, etc, and does the appropriate action * for each keypress, such as moving the cursor left or inserting a character. * * It should return TRUE when editing of the buffer is "complete" (e.g. on * the press of RETURN). */ bool askfor_aux_keypress(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime) { switch (keypress.code) { case ESCAPE: { *curs = 0; return TRUE; break; } case '\n': case '\r': { *curs = *len; return TRUE; break; } case ARROW_LEFT: { if (firsttime) *curs = 0; if (*curs > 0) (*curs)--; break; } case ARROW_RIGHT: { if (firsttime) *curs = *len - 1; if (*curs < *len) (*curs)++; break; } case 0x7F: case '\010': { /* If this is the first time round, backspace means "delete all" */ if (firsttime) { buf[0] = '\0'; *curs = 0; *len = 0; break; } /* Refuse to backspace into oblivion */ if (*curs == 0) break; /* Move the string from k to nul along to the left by 1 */ memmove(&buf[*curs - 1], &buf[*curs], *len - *curs); /* Decrement */ (*curs)--; (*len)--; /* Terminate */ buf[*len] = '\0'; break; } default: { bool atnull = (buf[*curs] == 0); if (!my_isprint((unsigned char)keypress.code)) { bell("Illegal edit key!"); break; } /* Clear the buffer if this is the first time round */ if (firsttime) { buf[0] = '\0'; *curs = 0; *len = 0; atnull = 1; } if (atnull) { /* Make sure we have enough room for a new character */ if ((*curs + 1) >= buflen) break; } else { /* Make sure we have enough room to add a new character */ if ((*len + 1) >= buflen) break; /* Move the rest of the buffer along to make room */ memmove(&buf[*curs+1], &buf[*curs], *len - *curs); } /* Insert the character */ buf[(*curs)++] = (char)keypress.code; (*len)++; /* Terminate */ buf[*len] = '\0'; break; } } /* By default, we aren't done. */ return FALSE; } /* * Get some input at the cursor location. * * The buffer is assumed to have been initialized to a default string. * Note that this string is often "empty" (see below). * * The default buffer is displayed in yellow until cleared, which happens * on the first keypress, unless that keypress is Return. * * Normal chars clear the default and append the char. * Backspace clears the default or deletes the final char. * Return accepts the current buffer contents and returns TRUE. * Escape clears the buffer and the window and returns FALSE. * * Note that 'len' refers to the size of the buffer. The maximum length * of the input is 'len-1'. * * 'keypress_h' is a pointer to a function to handle keypresses, altering * the input buffer, cursor position and suchlike as required. See * 'askfor_aux_keypress' (the default handler if you supply NULL for * 'keypress_h') for an example. */ bool askfor_aux(char *buf, size_t len, bool keypress_h(char *, size_t, size_t *, size_t *, struct keypress, bool)) { int y, x; size_t k = 0; /* Cursor position */ size_t nul = 0; /* Position of the null byte in the string */ struct keypress ch = { 0 }; bool done = FALSE; bool firsttime = TRUE; if (keypress_h == NULL) { keypress_h = askfor_aux_keypress; } /* Locate the cursor */ Term_locate(&x, &y); /* Paranoia */ if ((x < 0) || (x >= 80)) x = 0; /* Restrict the length */ if (x + len > 80) len = 80 - x; /* Truncate the default entry */ buf[len-1] = '\0'; /* Get the position of the null byte */ nul = strlen(buf); /* Display the default answer */ Term_erase(x, y, (int)len); Term_putstr(x, y, -1, TERM_YELLOW, buf); /* Process input */ while (!done) { /* Place cursor */ Term_gotoxy(x + k, y); /* Get a key */ ch = inkey(); /* Let the keypress handler deal with the keypress */ done = keypress_h(buf, len, &k, &nul, ch, firsttime); /* Update the entry */ Term_erase(x, y, (int)len); Term_putstr(x, y, -1, TERM_WHITE, buf); /* Not the first time round anymore */ firsttime = FALSE; } /* Done */ return (ch.code != ESCAPE); } /* * A "keypress" handling function for askfor_aux, that handles the special * case of '*' for a new random "name" and passes any other "keypress" * through to the default "editing" handler. */ static bool get_name_keypress(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime) { bool result; switch (keypress.code) { case '*': { *len = randname_make(RANDNAME_TOLKIEN, 4, 8, buf, buflen, name_sections); buf[0] = toupper((unsigned char) buf[0]); *curs = 0; result = FALSE; break; } default: { result = askfor_aux_keypress(buf, buflen, curs, len, keypress, firsttime); break; } } return result; } /* * Gets a name for the character, reacting to name changes. * * If sf is TRUE, we change the savefile name depending on the character name. * * What a horrible name for a global function. XXX XXX XXX */ bool get_name(char *buf, size_t buflen) { bool res; /* Paranoia XXX XXX XXX */ message_flush(); /* Display prompt */ prt("Enter a name for your character (* for a random name): ", 0, 0); /* Save the player name */ my_strcpy(buf, op_ptr->full_name, buflen); /* Ask the user for a string */ res = askfor_aux(buf, buflen, get_name_keypress); /* Clear prompt */ prt("", 0, 0); /* Revert to the old name if the player doesn't pick a new one. */ if (!res) { my_strcpy(buf, op_ptr->full_name, buflen); } return res; } /* * Prompt for a string from the user. * * The "prompt" should take the form "Prompt: ". * * See "askfor_aux" for some notes about "buf" and "len", and about * the return value of this function. */ bool get_string(const char *prompt, char *buf, size_t len) { bool res; /* Paranoia XXX XXX XXX */ message_flush(); /* Display prompt */ prt(prompt, 0, 0); /* Ask the user for a string */ res = askfor_aux(buf, len, NULL); /* Translate it to 8-bit (Latin-1) */ xstr_trans(buf, LATIN1); /* Clear prompt */ prt("", 0, 0); /* Result */ return (res); } /* * Request a "quantity" from the user * * Allow "p_ptr->command_arg" to specify a quantity */ s16b get_quantity(const char *prompt, int max) { int amt = 1; /* Use "command_arg" */ if (p_ptr->command_arg) { /* Extract a number */ amt = p_ptr->command_arg; /* Clear "command_arg" */ p_ptr->command_arg = 0; } /* Prompt if needed */ else if ((max != 1)) { char tmp[80]; char buf[80]; /* Build a prompt if needed */ if (!prompt) { /* Build a prompt */ strnfmt(tmp, sizeof(tmp), "Quantity (0-%d, *=all): ", max); /* Use that prompt */ prompt = tmp; } /* Build the default */ strnfmt(buf, sizeof(buf), "%d", amt); /* Ask for a quantity */ if (!get_string(prompt, buf, 7)) return (0); /* Extract a number */ amt = atoi(buf); /* A star or letter means "all" */ if ((buf[0] == '*') || isalpha((unsigned char)buf[0])) amt = max; } /* Enforce the maximum */ if (amt > max) amt = max; /* Enforce the minimum */ if (amt < 0) amt = 0; /* Return the result */ return (amt); } /* * Verify something with the user * * The "prompt" should take the form "Query? " * * Note that "[y/n]" is appended to the prompt. */ bool get_check(const char *prompt) { struct keypress ke; char buf[80]; bool repeat = FALSE; /* Paranoia XXX XXX XXX */ message_flush(); /* Hack -- Build a "useful" prompt */ strnfmt(buf, 78, "%.70s[y/n] ", prompt); /* Hack - kill the repeat button */ if (button_kill('n')) repeat = TRUE; /* Make some buttons */ button_add("[y]", 'y'); button_add("[n]", 'n'); redraw_stuff(p_ptr); /* Prompt for it */ prt(buf, 0, 0); ke = inkey(); /* Kill the buttons */ button_kill('y'); button_kill('n'); /* Hack - restore the repeat button */ if (repeat) button_add("[Rpt]", 'n'); redraw_stuff(p_ptr); /* Erase the prompt */ prt("", 0, 0); /* Normal negation */ if ((ke.code != 'Y') && (ke.code != 'y')) return (FALSE); /* Success */ return (TRUE); } /* TODO: refactor get_check() in terms of get_char() */ /* * Ask the user to respond with a character. Options is a constant string, * e.g. "yns"; len is the length of the constant string, and fallback should * be the default answer if the user hits escape or an invalid key. * * Example: get_char("Study? ", "yns", 3, 'n') * This prompts "Study? [yns]" and defaults to 'n'. * */ char get_char(const char *prompt, const char *options, size_t len, char fallback) { size_t i; struct keypress key; char button[4], buf[80]; bool repeat = FALSE; /* Paranoia XXX XXX XXX */ message_flush(); /* Hack -- Build a "useful" prompt */ strnfmt(buf, 78, "%.70s[%s] ", prompt, options); /* Hack - kill the repeat button */ if (button_kill('n')) repeat = TRUE; /* Make some buttons */ for (i = 0; i < len; i++) { strnfmt(button, 4, "[%c]", options[i]); button_add(button, options[i]); } redraw_stuff(p_ptr); /* Prompt for it */ prt(buf, 0, 0); /* Get an acceptable answer */ key = inkey(); /* Lowercase answer if necessary */ if (key.code >= 'A' && key.code <= 'Z') key.code += 32; /* See if key is in our options string */ if (!strchr(options, (char)key.code)) key.code = fallback; /* Kill the buttons */ for (i = 0; i < len; i++) button_kill(options[i]); /* Hack - restore the repeat button */ if (repeat) button_add("[Rpt]", 'n'); redraw_stuff(p_ptr); /* Erase the prompt */ prt("", 0, 0); /* Success */ return key.code; } /** * Text-native way of getting a filename. */ static bool get_file_text(const char *suggested_name, char *path, size_t len) { char buf[160]; /* Get filename */ my_strcpy(buf, suggested_name, sizeof buf); if (!get_string("File name: ", buf, sizeof buf)) return FALSE; /* Make sure it's actually a filename */ if (buf[0] == '\0' || buf[0] == ' ') return FALSE; /* Build the path */ path_build(path, len, ANGBAND_DIR_USER, buf); /* Check if it already exists */ if (file_exists(buf)) { char buf2[160]; strnfmt(buf2, sizeof(buf2), "Replace existing file %s?", buf); if (get_check(buf2) == FALSE) return FALSE; } return TRUE; } /** * Get a pathname to save a file to, given the suggested name. Returns the * result in "path". */ bool (*get_file)(const char *suggested_name, char *path, size_t len) = get_file_text; /* * Prompts for a keypress * * The "prompt" should take the form "Command: " * * Returns TRUE unless the character is "Escape" */ bool get_com(const char *prompt, struct keypress *command) { ui_event ke; bool result; result = get_com_ex(prompt, &ke); *command = ke.key; return result; } bool get_com_ex(const char *prompt, ui_event *command) { ui_event ke; /* Paranoia XXX XXX XXX */ message_flush(); /* Display a prompt */ prt(prompt, 0, 0); /* Get a key */ ke = inkey_ex(); /* Clear the prompt */ prt("", 0, 0); /* Save the command */ *command = ke; /* Done */ if (ke.type == EVT_KBRD && ke.key.code == ESCAPE) return FALSE; return TRUE; } /* * Pause for user response * * This function is stupid. XXX XXX XXX */ void pause_line(struct term *term) { prt("", term->hgt - 1, 0); put_str("[Press any key to continue]", term->hgt - 1, 23); (void)anykey(); prt("", term->hgt - 1, 0); } /* * Check a char for "vowel-hood" */ bool is_a_vowel(int ch) { switch (tolower((unsigned char) ch)) { case 'a': case 'e': case 'i': case 'o': case 'u': { return (TRUE); } } return (FALSE); } /* * Accept a color index character; if legal, return the color. -LM- * * Unlike Sangband, we don't translate these colours here. */ /* XXX: having color_{char,text}_to_attr() separately is moronic. */ int color_char_to_attr(char c) { int a; /* Is negative -- spit it right back out */ if (c < 0) return (c); /* Is a space or '\0' -- return black */ if (c == '\0' || c == ' ') return (TERM_DARK); /* Search the color table */ for (a = 0; a < BASIC_COLORS; a++) { /* Look for the index */ if (color_table[a].index_char == c) break; } /* If we don't find the color, we assume white */ if (a == BASIC_COLORS) return (TERM_WHITE); /* Return the color */ return (a); } /* * Converts a string to a terminal color byte. */ int color_text_to_attr(const char *name) { int a; for (a = 0; a < MAX_COLORS; a++) { if (my_stricmp(name, color_table[a].name) == 0) return (a); } /* Default to white */ return (TERM_WHITE); } /* * Extract a textual representation of an attribute */ const char *attr_to_text(byte a) { if (a < BASIC_COLORS) return (color_table[a].name); else return ("Icky"); } #ifdef SUPPORT_GAMMA /* * XXX XXX XXX Important note about "colors" XXX XXX XXX * * The "TERM_*" color definitions list the "composition" of each * "Angband color" in terms of "quarters" of each of the three color * components (Red, Green, Blue), for example, TERM_UMBER is defined * as 2/4 Red, 1/4 Green, 0/4 Blue. * * These values are NOT gamma-corrected. On most machines (with the * Macintosh being an important exception), you must "gamma-correct" * the given values, that is, "correct for the intrinsic non-linearity * of the phosphor", by converting the given intensity levels based * on the "gamma" of the target screen, which is usually 1.7 (or 1.5). * * The actual formula for conversion is unknown to me at this time, * but you can use the table below for the most common gamma values. * * So, on most machines, simply convert the values based on the "gamma" * of the target screen, which is usually in the range 1.5 to 1.7, and * usually is closest to 1.7. The converted value for each of the five * different "quarter" values is given below: * * Given Gamma 1.0 Gamma 1.5 Gamma 1.7 Hex 1.7 * ----- ---- ---- ---- --- * 0/4 0.00 0.00 0.00 #00 * 1/4 0.25 0.27 0.28 #47 * 2/4 0.50 0.55 0.56 #8f * 3/4 0.75 0.82 0.84 #d7 * 4/4 1.00 1.00 1.00 #ff */ /* Table of gamma values */ byte gamma_table[256]; /* Table of ln(x / 256) * 256 for x going from 0 -> 255 */ static const s16b gamma_helper[256] = { 0, -1420, -1242, -1138, -1065, -1007, -961, -921, -887, -857, -830, -806, -783, -762, -744, -726, -710, -694, -679, -666, -652, -640, -628, -617, -606, -596, -586, -576, -567, -577, -549, -541, -532, -525, -517, -509, -502, -495, -488, -482, -475, -469, -463, -457, -451, -455, -439, -434, -429, -423, -418, -413, -408, -403, -398, -394, -389, -385, -380, -376, -371, -367, -363, -359, -355, -351, -347, -343, -339, -336, -332, -328, -325, -321, -318, -314, -311, -308, -304, -301, -298, -295, -291, -288, -285, -282, -279, -276, -273, -271, -268, -265, -262, -259, -257, -254, -251, -248, -246, -243, -241, -238, -236, -233, -231, -228, -226, -223, -221, -219, -216, -214, -212, -209, -207, -205, -203, -200, -198, -196, -194, -192, -190, -188, -186, -184, -182, -180, -178, -176, -174, -172, -170, -168, -166, -164, -162, -160, -158, -156, -155, -153, -151, -149, -147, -146, -144, -142, -140, -139, -137, -135, -134, -132, -130, -128, -127, -125, -124, -122, -120, -119, -117, -116, -114, -112, -111, -109, -108, -106, -105, -103, -102, -100, -99, -97, -96, -95, -93, -92, -90, -89, -87, -86, -85, -83, -82, -80, -79, -78, -76, -75, -74, -72, -71, -70, -68, -67, -66, -65, -63, -62, -61, -59, -58, -57, -56, -54, -53, -52, -51, -50, -48, -47, -46, -45, -44, -42, -41, -40, -39, -38, -37, -35, -34, -33, -32, -31, -30, -29, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1 }; /* * Build the gamma table so that floating point isn't needed. * * Note gamma goes from 0->256. The old value of 100 is now 128. */ void build_gamma_table(int gamma) { int i, n; /* * value is the current sum. * diff is the new term to add to the series. */ long value, diff; /* Hack - convergence is bad in these cases. */ gamma_table[0] = 0; gamma_table[255] = 255; for (i = 1; i < 255; i++) { /* * Initialise the Taylor series * * value and diff have been scaled by 256 */ n = 1; value = 256L * 256L; diff = ((long)gamma_helper[i]) * (gamma - 256); while (diff) { value += diff; n++; /* * Use the following identiy to calculate the gamma table. * exp(x) = 1 + x + x^2/2 + x^3/(2*3) + x^4/(2*3*4) +... * * n is the current term number. * * The gamma_helper array contains a table of * ln(x/256) * 256 * This is used because a^b = exp(b*ln(a)) * * In this case: * a is i / 256 * b is gamma. * * Note that everything is scaled by 256 for accuracy, * plus another factor of 256 for the final result to * be from 0-255. Thus gamma_helper[] * gamma must be * divided by 256*256 each itteration, to get back to * the original power series. */ diff = (((diff / 256) * gamma_helper[i]) * (gamma - 256)) / (256 * n); } /* * Store the value in the table so that the * floating point pow function isn't needed. */ gamma_table[i] = ((long)(value / 256) * i) / 256; } } #endif /* SUPPORT_GAMMA */ angband-v3.3.2/src/config.h0000644000175000017500000000702611651552410015021 0ustar chriscchrisc#ifndef INCLUDED_CONFIG_H #define INCLUDED_CONFIG_H /*** Some really important things you ought to change ***/ /* * Defines the default paths to the Angband directories, for ports that use * the main.c file. * * "config path" is for per-installation configurable data, like the game's * edit files and system-wide preferences. * * "lib path" is for static data, like sounds, graphics and fonts. * * "data path" is for variable data, like save files and scores. On single- * user systems, this also includes user preferences and dumps (on multi- * user systems these go under the user's home directory). * * The configure script overrides these values. Check the "--prefix=" * option of the configure script. * * These values will be over-ridden by the "ANGBAND_PATH" environment * variable, if that variable is defined and accessible. The final * "slash" is required if the value supplied is in fact a directory. * * Using the value "./lib/" below tells Angband that, by default, * the user will run "angband" from the same directory that contains * the "lib" directory. This is a reasonable (but imperfect) default. * * If at all possible, you should change this value to refer to the * actual location of the folders, for example, "/etc/angband/" * or "/usr/share/angband/", or "/var/games/angband/". In fact, if at all * possible you should use a packaging system which does this for you. * * N.B. The data path is only used if USE_PRIVATE_PATHS is not defined. * The other two are always used. */ #ifndef DEFAULT_CONFIG_PATH # define DEFAULT_CONFIG_PATH "." PATH_SEP "lib" PATH_SEP #endif #ifndef DEFAULT_LIB_PATH # define DEFAULT_LIB_PATH "." PATH_SEP "lib" PATH_SEP #endif #ifndef DEFAULT_DATA_PATH # define DEFAULT_DATA_PATH "." PATH_SEP "lib" PATH_SEP #endif /* * OPTION: Create and use a hidden directory in the users home directory * for storing pref files and character dumps. */ #ifdef SET_UID # ifndef PRIVATE_USER_PATH # define PRIVATE_USER_PATH "~/.angband" # endif /* PRIVATE_USER_PATH */ #endif /* SET_UID */ /* * OPTION: Create and use hidden directories in the users home directory * for storing save files and high-scores */ #ifdef PRIVATE_USER_PATH /* # define USE_PRIVATE_PATHS */ #endif /* PRIVATE_USER_PATH */ /*** Some no-brainer defines ***/ /* Allow the game to make noises correlating to what the player does in-game */ #define USE_SOUND /* Allow the use of graphics rather than only having a text-mode */ #define USE_GRAPHICS /* Compile in support for debug commands */ #define ALLOW_DEBUG /* Compile in support for spoiler generation */ #define ALLOW_SPOILERS /* Allow changing colours at runtime */ #define ALLOW_COLORS /* Allow changing "visuals" at runtime */ #define ALLOW_VISUALS /*** Borg ***/ /* Compile in support for the borg. */ /* #define ALLOW_BORG */ /* Allow borgs to yield "high scores"? */ /* #define SCORE_BORGS */ /* * Allow the Borg to use graphics. */ #if defined(ALLOW_BORG) && defined(USE_GRAPHICS) # define ALLOW_BORG_GRAPHICS #endif /*** X11 settings ***/ /* * OPTION: Gamma correct colours (with X11) */ #define SUPPORT_GAMMA /* * OPTION: Default font (when using X11). */ #define DEFAULT_X11_FONT "9x15" /* * OPTION: Default fonts (when using X11) */ #define DEFAULT_X11_FONT_0 "10x20" #define DEFAULT_X11_FONT_1 "9x15" #define DEFAULT_X11_FONT_2 "9x15" #define DEFAULT_X11_FONT_3 "5x8" #define DEFAULT_X11_FONT_4 "5x8" #define DEFAULT_X11_FONT_5 "5x8" #define DEFAULT_X11_FONT_6 "5x8" #define DEFAULT_X11_FONT_7 "5x8" #endif /* !INCLUDED_CONFIG_H */ angband-v3.3.2/src/z-form.c0000644000175000017500000004163711651552410014767 0ustar chriscchrisc/* * File: z-form.c * Purpose: Low-level text formatting (snprintf() replacement) * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" /* * Here is some information about the routines in this file. * * In general, the following routines take a "buffer", a "max length", * a "format string", and some "arguments", and use the format string * and the arguments to create a (terminated) string in the buffer * (using only the first "max length" bytes), and return the "length" * of the resulting string, not including the (mandatory) terminator. * * The format strings allow the basic "sprintf()" format sequences, though * some of them are processed slightly more carefully or portably, as well * as a few "special" sequences, including the "capilitization" sequences of * "%C" and "%S". * * Note that some "limitations" are enforced by the current implementation, * for example, no "format sequence" can exceed 100 characters, including any * "length" restrictions, and the result of combining and "format sequence" * with the relevent "arguments" must not exceed 1000 characters. * * These limitations could be fixed by stealing some of the code from, * say, "vsprintf()" and placing it into my "vstrnfmt()" function. * * Note that a "^" inside a "format sequence" causes the first non-space * character in the string resulting from the combination of the format * sequence and the argument(s) to be "capitalized" if possible. Note * that the "^" character is removed before the "standard" formatting * routines are called. Likewise, a "*" inside a "format sequence" is * removed from the "format sequence", and replaced by the textual form * of the next argument in the argument list. See examples below. * * Legal format characters: %,b,n,p,c,s,d,i,o,u,X,x,E,e,F,f,G,g,r,v. * * Format("%%") * Append the literal "%". * No legal modifiers. * * Format("%n", size_t *np) * Save the current length into (*np). * No legal modifiers. * * Format("%p", void *v) * Append the pointer "v" (implementation varies). * No legal modifiers. * * Format("%E", double r) * Format("%F", double r) * Format("%G", double r) * Format("%e", double r) * Format("%f", double r) * Format("%g", double r) * Append the double "r", in various formats. * * Format("%ld", long int i) * Append the long integer "i". * * Format("%d", int i) * Append the integer "i". * * Format("%lu", unsigned long int i) * Append the unsigned long integer "i". * * Format("%u", unsigned int i) * Append the unsigned integer "i". * * Format("%lo", unsigned long int i) * Append the unsigned long integer "i", in octal. * * Format("%o", unsigned int i) * Append the unsigned integer "i", in octal. * * Format("%lX", unsigned long int i) * Note -- use all capital letters * Format("%lx", unsigned long int i) * Append the unsigned long integer "i", in hexidecimal. * * Format("%X", unsigned int i) * Note -- use all capital letters * Format("%x", unsigned int i) * Append the unsigned integer "i", in hexidecimal. * * Format("%c", char c) * Append the character "c". * Do not use the "+" or "0" flags. * * Format("%s", const char *s) * Append the string "s". * Do not use the "+" or "0" flags. * Note that a "NULL" value of "s" is converted to the empty string. * * Format("%y", type_union *y). Use any of the above patterns; * z is interpreted as one of c, d, f, or s in the patterns above, * as appropriate for the type of the corresponding argument. * (There is currently no way to render a typeunion in octal or hex.) * * For examples below, assume "int n = 0; int m = 100; char buf[100];", * plus "char *s = NULL;", and unknown values "char *txt; int i;". * * For example: "n = strnfmt(buf, -1, "(Max %d)", i);" will have a * similar effect as "sprintf(buf, "(Max %d)", i); n = strlen(buf);". * * For example: "(void)strnfmt(buf, 16, "%s", txt);" will have a similar * effect as "strncpy(buf, txt, 16); buf[15] = '\0';". * * For example: "if (strnfmt(buf, 16, "%s", txt) < 16) ..." will have * a similar effect as "strcpy(buf, txt)" but with bounds checking. * * For example: "s = buf; s += vstrnfmt(s, -1, ...); ..." will allow * multiple "appends" to "buf" (at the cost of losing the max-length info). * * For example: "s = buf; n = vstrnfmt(s+n, 100-n, ...); ..." will allow * multiple bounded "appends" to "buf", with constant access to "strlen(buf)". * * For example: "format("%^-.*s", i, txt)" will produce a string containing * the first "i" characters of "txt", left justified, with the first non-space * character capitilized, if reasonable. */ /* * Basic "vararg" format function. * * This function takes a buffer, a max byte count, a format string, and * a va_list of arguments to the format string, and uses the format string * and the arguments to create a string to the buffer. The string is * derived from the format string and the arguments in the manner of the * "sprintf()" function, but with some extra "format" commands. Note that * this function will never use more than the given number of bytes in the * buffer, preventing messy invalid memory references. This function then * returns the total number of non-null bytes written into the buffer. * * Method: Let "str" be the (unlimited) created string, and let "len" be the * smaller of "max-1" and "strlen(str)". We copy the first "len" chars of * "str" into "buf", place "\0" into buf[len], and return "len". * * In English, we do a sprintf() into "buf", a buffer with size "max", * and we return the resulting value of "strlen(buf)", but we allow some * special format commands, and we are more careful than "sprintf()". * * Typically, "max" is in fact the "size" of "buf", and thus represents * the "number" of chars in "buf" which are ALLOWED to be used. An * alternative definition would have required "buf" to hold at least * "max+1" characters, and would have used that extra character only * in the case where "buf" was too short for the result. This would * give an easy test for "overflow", but a less "obvious" semantics. * * Note that if the buffer was "too short" to hold the result, we will * always return "max-1", but we also return "max-1" if the buffer was * "just long enough". We could have returned "max" if the buffer was * too short, not written a null, and forced the programmer to deal with * this special case, but I felt that it is better to at least give a * "usable" result when the buffer was too long instead of either giving * a memory overwrite like "sprintf()" or a non-terminted string like * "strncpy()". Note that "strncpy()" also "null-pads" the result. * * Note that in most cases "just long enough" is probably "too short". * * We should also consider extracting and processing the "width" and other * "flags" by hand, it might be more "accurate", and it would allow us to * remove the limit (1000 chars) on the result of format sequences. * * Also, some sequences, such as "%+d" by hand, do not work on all machines, * and could thus be correctly handled here. * * Error detection in this routine is not very graceful, in particular, * if an error is detected in the format string, we simply "pre-terminate" * the given buffer to a length of zero, and return a "length" of zero. * The contents of "buf", except for "buf[0]", may then be undefined. */ size_t vstrnfmt(char *buf, size_t max, const char *fmt, va_list vp) { const char *s; /* The argument is "long" */ bool do_long; /* The argument needs to be uppercased */ bool titlecase; /* Bytes used in buffer */ size_t n; /* Bytes used in format sequence */ size_t q; /* Format sequence */ char aux[128]; /* Resulting string */ char tmp[1024]; assert(max); assert(fmt); /* Begin the buffer */ n = 0; /* Begin the format string */ s = fmt; /* Scan the format string */ while (TRUE) { type_union tval = END; /* All done */ if (!*s) break; /* Normal character */ if (*s != '%') { /* Check total length */ if (n == max-1) break; /* Save the character */ buf[n++] = *s++; /* Continue */ continue; } /* Skip the "percent" */ s++; /* Pre-process "%%" */ if (*s == '%') { /* Check total length */ if (n == max-1) break; /* Save the percent */ buf[n++] = '%'; /* Skip the "%" */ s++; /* Continue */ continue; } /* Pre-process "%n" */ if (*s == 'n') { size_t *arg; /* Get the next argument */ arg = va_arg(vp, size_t *); /* Save the current length */ (*arg) = n; /* Skip the "n" */ s++; /* Continue */ continue; } /* Begin the "aux" string */ q = 0; /* Save the "percent" */ aux[q++] = '%'; do_long = FALSE; titlecase = FALSE; /* Build the "aux" string */ while (TRUE) { /* Error -- format sequence is not terminated */ if (!*s) { /* Terminate the buffer */ buf[0] = '\0'; /* Return "error" */ return (0); } /* Error -- format sequence may be too long */ if (q > 100) { /* Terminate the buffer */ buf[0] = '\0'; /* Return "error" */ return (0); } /* Handle "alphabetic" chars */ if (isalpha((unsigned char)*s)) { /* Hack -- handle "long" request */ if (*s == 'l') { /* Save the character */ aux[q++] = *s++; /* Note the "long" flag */ do_long = TRUE; } /* Handle normal end of format sequence */ else { /* Save the character */ aux[q++] = *s++; /* Stop processing the format sequence */ break; } } /* Handle "non-alphabetic" chars */ else { /* Hack -- Handle 'star' (for "variable length" argument) */ if (*s == '*') { int arg; /* Get the next argument */ arg = va_arg(vp, int); /* Hack -- append the "length" */ sprintf(aux + q, "%d", arg); /* Hack -- accept the "length" */ while (aux[q]) q++; /* Skip the "*" */ s++; } else if (*s == '^') { titlecase = TRUE; s++; } /* Collect "normal" characters (digits, "-", "+", ".", etc) */ else { /* Save the character */ aux[q++] = *s++; } } } /* Terminate "aux" */ aux[q] = '\0'; /* Clear "tmp" */ tmp[0] = '\0'; /* Parse a type_union */ if (aux[q-1] == 'y') { tval = va_arg(vp, type_union); if (do_long) { /* Error -- illegal type_union argument */ buf[0] = '\0'; /* Return "error" */ return (0); } /* Replace aux terminator with proper printf char */ if (tval.t == T_CHAR) aux[q-1] = 'c'; else if (tval.t == T_INT) aux[q-1] = 'd'; else if (tval.t == T_FLOAT) aux[q-1] = 'f'; else if (tval.t == T_STRING) aux[q-1] = 's'; else { buf[0] = '\0'; return (0); } } /* Process the "format" symbol */ switch (aux[q-1]) { /* Simple Character -- standard format */ case 'c': { int arg; /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, int) : tval.u.c; /* Format the argument */ sprintf(tmp, aux, arg); /* Done */ break; } /* Signed Integers -- standard format */ case 'd': case 'i': { if (do_long) { long arg; /* Get the next argument */ arg = va_arg(vp, long); /* Format the argument */ sprintf(tmp, aux, arg); } else { int arg; /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, int) : tval.u.i; /* Format the argument */ sprintf(tmp, aux, arg); } /* Done */ break; } /* Unsigned Integers -- various formats */ case 'u': case 'o': case 'x': case 'X': { if (do_long) { unsigned long arg; /* Get the next argument */ arg = va_arg(vp, unsigned long); /* Format the argument */ sprintf(tmp, aux, arg); } else { unsigned int arg; /* Get the next argument */ arg = va_arg(vp, unsigned int); /* Format the argument */ sprintf(tmp, aux, arg); } /* Done */ break; } /* Floating Point -- various formats */ case 'f': case 'e': case 'E': case 'g': case 'G': { double arg; /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, double) : tval.u.f; /* Format the argument */ sprintf(tmp, aux, arg); /* Done */ break; } /* Pointer -- implementation varies */ case 'p': { void *arg; /* Get the next argument */ arg = va_arg(vp, void*); /* Format the argument */ sprintf(tmp, aux, arg); /* Done */ break; } /* String */ case 's': { const char *arg; char arg2[1024]; /* XXX There is a big bug here: if one * passes "%.0s" to strnfmt, then really we * should not dereference the arg at all. * But it does. See bug #666. */ /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, const char *) : tval.u.s; /* Hack -- convert NULL to EMPTY */ if (!arg) arg = ""; /* Prevent buffer overflows */ (void)my_strcpy(arg2, arg, sizeof(arg2)); /* Translate it to 8-bit (Latin-1) */ xstr_trans(arg2, LATIN1); /* Format the argument */ sprintf(tmp, aux, arg2); /* Done */ break; } /* Oops */ default: { /* Error -- illegal format char */ buf[0] = '\0'; /* Return "error" */ return (0); } } if (titlecase) { for (q = 0; tmp[q]; q++) { /* Notice first non-space */ if (!my_isspace((unsigned char)tmp[q])) { /* Capitalize if possible */ if (my_islower((unsigned char)tmp[q])) tmp[q] = my_toupper((unsigned char)tmp[q]); /* Done */ break; } } } /* Now append "tmp" to "buf" */ for (q = 0; tmp[q]; q++) { /* Check total length */ if (n == max-1) break; /* Save the character */ buf[n++] = tmp[q]; } } /* Terminate buffer */ buf[n] = '\0'; /* Return length */ return (n); } /* * Add a formatted string to the end of a string */ void strnfcat(char *str, size_t max, size_t *end, const char *fmt, ...) { size_t len; va_list vp; /* Paranoia */ if (*end >= max) return; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Build the string */ len = vstrnfmt(&str[*end], max - *end, fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Change the end value */ *end += len; } static char *format_buf = NULL; static size_t format_len = 0; /* * Do a vstrnfmt (see above) into a (growable) static buffer. * This buffer is usable for very short term formatting of results. */ char *vformat(const char *fmt, va_list vp) { /* Initial allocation */ if (!format_buf) { format_len = 1024; format_buf = mem_zalloc(format_len); format_buf[0] = 0; } /* Null format yields last result */ if (!fmt) return (format_buf); /* Keep going until successful */ while (1) { va_list args; size_t len; /* Build the string */ VA_COPY(args, vp); len = vstrnfmt(format_buf, format_len, fmt, args); va_end(args); /* Success */ if (len < format_len-1) break; /* Grow the buffer */ format_len = format_len * 2; format_buf = mem_realloc(format_buf, format_len); } /* Return the new buffer */ return (format_buf); } void vformat_kill(void) { FREE(format_buf); } /* * Do a vstrnfmt (see above) into a buffer of a given size. */ size_t strnfmt(char *buf, size_t max, const char *fmt, ...) { size_t len; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ len = vstrnfmt(buf, max, fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Return the number of bytes written */ return (len); } /* * Do a vstrnfmt() into (see above) into a (growable) static buffer. * This buffer is usable for very short term formatting of results. * Note that the buffer is (technically) writable, but only up to * the length of the string contained inside it. */ char *format(const char *fmt, ...) { char *res; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format the args */ res = vformat(fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Return the result */ return (res); } /* * Vararg interface to plog() */ void plog_fmt(const char *fmt, ...) { char *res; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format the args */ res = vformat(fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Call plog */ plog(res); } /* * Vararg interface to quit() */ void quit_fmt(const char *fmt, ...) { char *res; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format */ res = vformat(fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Call quit() */ quit(res); } angband-v3.3.2/src/doc/0000755000175000017500000000000011651552410014143 5ustar chriscchriscangband-v3.3.2/src/doc/doxygen.conf0000644000175000017500000015141111651552410016472 0ustar chriscchrisc# Doxyfile 1.5.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file that # follow. The default is UTF-8 which is also the encoding used for all text before # the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into # libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of # possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Angband # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, # Italian, Japanese, Japanese-en (Japanese with English messages), Korean, # Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, # Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be extracted # and appear in the documentation as a namespace called 'anonymous_namespace{file}', # where file will be replaced with the base name of the file that contains the anonymous # namespace. By default anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text " # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default # input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. # See http://www.gnu.org/software/libiconv for the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.h \ *.c # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = tests/* # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. # The symbol name can be a fully qualified name, a word, or if the wildcard * is used, # a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH # then you must also enable this option. If you don't then doxygen will produce # a warning and turn it on anyway SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = doc # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to # produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to # specify the directory where the mscgen tool resides. If left empty the tool is assumed to # be found in the default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the number # of direct children of the root node in a graph is already larger than # MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO angband-v3.3.2/src/types.h0000644000175000017500000001404511651552410014717 0ustar chriscchrisc#ifndef INCLUDED_TYPES_H #define INCLUDED_TYPES_H /* * This file contains various defined types used by the game. * * TODO: Most of these should be elsewhere, in their own header files. * For example, the object structs should be in object.h. * * Be careful when creating data structures; most of these are designed * to be serialised to file, so be careful to use exact-size data types * (like u32b and s32b) and not just "int"s. */ #include "z-term.h" /**** Available Types ****/ /** An array of 256 bytes */ typedef byte byte_256[256]; /** An array of DUNGEON_WID bytes */ typedef byte byte_wid[DUNGEON_WID]; /** An array of DUNGEON_WID s16b's */ typedef s16b s16b_wid[DUNGEON_WID]; /** Function hook types **/ /** Function prototype for the UI to provide to create native buttons */ typedef int (*button_add_f)(const char *, unsigned char); /** Function prototype for the UI to provide to remove native buttons */ typedef int (*button_kill_f)(unsigned char); /**** Available Structs ****/ typedef struct alloc_entry alloc_entry; typedef struct quest quest; typedef struct spell spell_type; typedef struct history_info history_info; typedef struct color_type color_type; /** * Information about maximal indices of certain arrays. * * These are actually not the maxima, but the maxima plus one, because of * 0-based indexing issues. */ typedef struct maxima { u16b f_max; /**< Maximum number of terrain features */ u16b k_max; /**< Maximum number of object base kinds */ u16b a_max; /**< Maximum number of artifact kinds */ u16b e_max; /**< Maximum number of ego-item kinds */ u16b r_max; /**< Maximum number of monster races */ u16b mp_max; /**< Maximum number of monster pain message sets */ u16b s_max; /**< Maximum number of magic spells */ u16b pit_max; /**< Maximum number of monster pit types */ u16b o_max; /**< Maximum number of objects on a given level */ u16b m_max; /**< Maximum number of monsters on a given level */ } maxima; /** * Information about terrain features. * * At the moment this isn't very much, but eventually a primitive flag-based * information system will be used here. */ typedef struct feature { char *name; int fidx; struct feature *next; byte mimic; /**< Feature to mimic */ byte priority; /**< Display priority */ byte locked; /**< How locked is it? */ byte jammed; /**< How jammed is it? */ byte shopnum; /**< Which shop does it take you to? */ byte dig; /**< How hard is it to dig through? */ u32b effect; /**< Effect on entry to grid */ u32b flags; /**< Terrain flags */ byte d_attr; /**< Default feature attribute */ char d_char; /**< Default feature character */ byte x_attr[3]; /**< Desired feature attribute (set by user/pref file) */ char x_char[3]; /**< Desired feature character (set by user/pref file) */ } feature_type; /* * Information about "vault generation" */ typedef struct vault { struct vault *next; unsigned int vidx; char *name; char *text; byte typ; /* Vault type */ byte rat; /* Vault rating */ byte hgt; /* Vault height */ byte wid; /* Vault width */ } vault_type; /* * An entry for the object/monster allocation functions * * Pass 1 is determined from allocation information * Pass 2 is determined from allocation restriction * Pass 3 is determined from allocation calculation */ struct alloc_entry { s16b index; /* The actual index */ byte level; /* Base dungeon level */ byte prob1; /* Probability, pass 1 */ byte prob2; /* Probability, pass 2 */ byte prob3; /* Probability, pass 3 */ u16b total; /* Unused for now */ }; /* * Structure for the "quests" * * Hack -- currently, only the "level" parameter is set, with the * semantics that "one (QUEST) monster of that level" must be killed, * and then the "level" is reset to zero, meaning "all done". Later, * we should allow quests like "kill 100 fire hounds", and note that * the "quest level" is then the level past which progress is forbidden * until the quest is complete. Note that the "QUESTOR" flag then could * become a more general "never out of depth" flag for monsters. */ struct quest { byte level; /* Dungeon level */ int r_idx; /* Monster race */ int cur_num; /* Number killed (unused) */ int max_num; /* Number required (unused) */ }; /* * And here's the structure for the "fixed" spell information */ struct spell { struct spell *next; unsigned int sidx; char *name; char *text; byte realm; /* 0 = mage; 1 = priest */ byte tval; /* Item type for book this spell is in */ byte sval; /* Item sub-type for book (= book number) */ byte snum; /* Position of spell within book */ byte spell_index; /* Index into player_magic array */ }; /** * Defines a (value, name) pairing. Variable names used are historical. */ typedef struct { byte tval; const char *name; } grouper; struct history_info { u16b type; /* Kind of history item */ s16b dlev; /* Dungeon level when this item was recorded */ s16b clev; /* Character level when this item was recorded */ byte a_idx; /* Artifact this item relates to */ s32b turn; /* Turn this item was recorded on */ char event[80]; /* The text of the item */ }; enum grid_light_level { FEAT_LIGHTING_BRIGHT = 0, FEAT_LIGHTING_LIT, FEAT_LIGHTING_DARK, FEAT_LIGHTING_MAX }; typedef struct { u32b m_idx; /* Monster index */ u32b f_idx; /* Feature index */ struct object_kind *first_kind; /* The "kind" of the first item on the grid */ bool multiple_objects; /* Is there more than one item there? */ enum grid_light_level lighting; /* Light level */ bool in_view; /* TRUE when the player can currently see the grid. */ bool is_player; bool hallucinate; bool trapborder; } grid_data; /* * A game color. */ struct color_type { char index_char; /* Character index: 'r' = red, etc. */ char name[32]; /* Color name */ byte color_translate[MAX_ATTR]; /* Index for various in-game translations */ }; /* * A hint. */ struct hint { char *hint; struct hint *next; }; #endif /* !INCLUDED_TYPES_H */ angband-v3.3.2/src/signals.c0000644000175000017500000001542511651552410015211 0ustar chriscchrisc/* * File: signals.c * Purpose: Handle various OS signals * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "files.h" #include "savefile.h" #ifndef WINDOWS #include #ifdef SET_UID # include #endif typedef void (*Signal_Handler_t)(int); /* * Wrapper around signal() which it is safe to take the address * of, in case signal itself is hidden by some some macro magic. */ static Signal_Handler_t wrap_signal(int sig, Signal_Handler_t handler) { return signal(sig, handler); } /* Call this instead of calling signal() directly. */ Signal_Handler_t (*signal_aux)(int, Signal_Handler_t) = wrap_signal; /* * Handle signals -- suspend * * Actually suspend the game, and then resume cleanly */ static void handle_signal_suspend(int sig) { /* Protect errno from library calls in signal handler */ int save_errno = errno; /* Disable handler */ (void)(*signal_aux)(sig, SIG_IGN); #ifdef SIGSTOP /* Flush output */ Term_fresh(); /* Suspend the "Term" */ Term_xtra(TERM_XTRA_ALIVE, 0); /* Suspend ourself */ (void)kill(0, SIGSTOP); /* Resume the "Term" */ Term_xtra(TERM_XTRA_ALIVE, 1); /* Redraw the term */ Term_redraw(); /* Flush the term */ Term_fresh(); #endif /* Restore handler */ (void)(*signal_aux)(sig, handle_signal_suspend); /* Restore errno */ errno = save_errno; } /* * Handle signals -- simple (interrupt and quit) * * This function was causing a *huge* number of problems, so it has * been simplified greatly. We keep a global variable which counts * the number of times the user attempts to kill the process, and * we commit suicide if the user does this a certain number of times. * * We attempt to give "feedback" to the user as he approaches the * suicide thresh-hold, but without penalizing accidental keypresses. * * To prevent messy accidents, we should reset this global variable * whenever the user enters a keypress, or something like that. */ static void handle_signal_simple(int sig) { /* Protect errno from library calls in signal handler */ int save_errno = errno; /* Disable handler */ (void)(*signal_aux)(sig, SIG_IGN); /* Nothing to save, just quit */ if (!character_generated || character_saved) quit(NULL); /* Count the signals */ signal_count++; /* Terminate dead characters */ if (p_ptr->is_dead) { /* Mark the savefile */ my_strcpy(p_ptr->died_from, "Abortion", sizeof(p_ptr->died_from)); close_game(); /* Quit */ quit("interrupt"); } /* Allow suicide (after 5) */ else if (signal_count >= 5) { /* Cause of "death" */ my_strcpy(p_ptr->died_from, "Interrupting", sizeof(p_ptr->died_from)); /* Commit suicide */ p_ptr->is_dead = TRUE; /* Stop playing */ p_ptr->playing = FALSE; /* Leaving */ p_ptr->leaving = TRUE; /* Close stuff */ close_game(); /* Quit */ quit("interrupt"); } /* Give warning (after 4) */ else if (signal_count >= 4) { /* Make a noise */ Term_xtra(TERM_XTRA_NOISE, 0); /* Clear the top line */ Term_erase(0, 0, 255); /* Display the cause */ Term_putstr(0, 0, -1, TERM_WHITE, "Contemplating suicide!"); /* Flush */ Term_fresh(); } /* Give warning (after 2) */ else if (signal_count >= 2) { /* Make a noise */ Term_xtra(TERM_XTRA_NOISE, 0); } /* Restore handler */ (void)(*signal_aux)(sig, handle_signal_simple); /* Restore errno */ errno = save_errno; } /* * Handle signal -- abort, kill, etc */ static void handle_signal_abort(int sig) { /* Disable handler */ (void)(*signal_aux)(sig, SIG_IGN); /* Nothing to save, just quit */ if (!character_generated || character_saved) quit(NULL); /* Clear the bottom line */ Term_erase(0, 23, 255); /* Give a warning */ Term_putstr(0, 23, -1, TERM_RED, "A gruesome software bug LEAPS out at you!"); /* Message */ Term_putstr(45, 23, -1, TERM_RED, "Panic save..."); /* Flush output */ Term_fresh(); /* Panic Save */ p_ptr->panic_save = 1; /* Panic save */ my_strcpy(p_ptr->died_from, "(panic save)", sizeof(p_ptr->died_from)); /* Forbid suspend */ signals_ignore_tstp(); /* Attempt to save */ if (savefile_save(savefile)) Term_putstr(45, 23, -1, TERM_RED, "Panic save succeeded!"); else Term_putstr(45, 23, -1, TERM_RED, "Panic save failed!"); /* Flush output */ Term_fresh(); /* Quit */ quit("software bug"); } /* * Ignore SIGTSTP signals (keyboard suspend) */ void signals_ignore_tstp(void) { #ifdef SIGTSTP (void)(*signal_aux)(SIGTSTP, SIG_IGN); #endif } /* * Handle SIGTSTP signals (keyboard suspend) */ void signals_handle_tstp(void) { #ifdef SIGTSTP (void)(*signal_aux)(SIGTSTP, handle_signal_suspend); #endif } /* * Prepare to handle the relevant signals */ void signals_init(void) { #ifdef SIGHUP (void)(*signal_aux)(SIGHUP, SIG_IGN); #endif #ifdef SIGTSTP (void)(*signal_aux)(SIGTSTP, handle_signal_suspend); #endif #ifdef SIGINT (void)(*signal_aux)(SIGINT, handle_signal_simple); #endif #ifdef SIGQUIT (void)(*signal_aux)(SIGQUIT, handle_signal_simple); #endif #ifdef SIGFPE (void)(*signal_aux)(SIGFPE, handle_signal_abort); #endif #ifdef SIGILL (void)(*signal_aux)(SIGILL, handle_signal_abort); #endif #ifdef SIGTRAP (void)(*signal_aux)(SIGTRAP, handle_signal_abort); #endif #ifdef SIGIOT (void)(*signal_aux)(SIGIOT, handle_signal_abort); #endif /* Set to 0 to suppress signal handlers when debugging */ #if 1 # ifdef SIGBUS (void)(*signal_aux)(SIGBUS, handle_signal_abort); # endif # ifdef SIGSEGV (void)(*signal_aux)(SIGSEGV, handle_signal_abort); # endif #endif #ifdef SIGTERM (void)(*signal_aux)(SIGTERM, handle_signal_abort); #endif #ifdef SIGPIPE (void)(*signal_aux)(SIGPIPE, handle_signal_abort); #endif #ifdef SIGEMT (void)(*signal_aux)(SIGEMT, handle_signal_abort); #endif /* * SIGDANGER: * This is not a common (POSIX, SYSV, BSD) signal, it is used by AIX(?) to * signal that the system will soon be out of memory. */ #ifdef SIGDANGER (void)(*signal_aux)(SIGDANGER, handle_signal_abort); #endif #ifdef SIGSYS (void)(*signal_aux)(SIGSYS, handle_signal_abort); #endif #ifdef SIGXCPU (void)(*signal_aux)(SIGXCPU, handle_signal_abort); #endif #ifdef SIGPWR (void)(*signal_aux)(SIGPWR, handle_signal_abort); #endif } #else /* !WINDOWS */ /* * Do nothing */ void signals_ignore_tstp(void) { } /* * Do nothing */ void signals_handle_tstp(void) { } /* * Do nothing */ void signals_init(void) { } #endif /* !WINDOWS */ angband-v3.3.2/src/z-util.c0000644000175000017500000001504111651552410014767 0ustar chriscchrisc/* * File: z-util.c * Purpose: Low-level string handling and other utilities. * * Copyright (c) 1997-2005 Ben Harrison, Robert Ruehlmann. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "z-util.h" /* * Convenient storage of the program name */ char *argv0 = NULL; /* * Case insensitive comparison between two strings */ int my_stricmp(const char *s1, const char *s2) { char ch1 = 0; char ch2 = 0; /* Just loop */ while (TRUE) { /* We've reached the end of both strings simultaneously */ if ((*s1 == 0) && (*s2 == 0)) { /* We're still here, so s1 and s2 are equal */ return (0); } ch1 = toupper((unsigned char) *s1); ch2 = toupper((unsigned char) *s2); /* If the characters don't match */ if (ch1 != ch2) { /* return the difference between them */ return ((int)(ch1 - ch2)); } /* Step on through both strings */ s1++; s2++; } } /* * Case insensitive comparison between the first n characters of two strings */ int my_strnicmp(const char *a, const char *b, int n) { const char *s1, *s2; char z1, z2; /* Scan the strings */ for (s1 = a, s2 = b; n > 0; s1++, s2++, n--) { z1 = toupper((unsigned char)*s1); z2 = toupper((unsigned char)*s2); if (z1 < z2) return (-1); if (z1 > z2) return (1); if (!z1) return (0); } return 0; } /* * An ANSI version of strstr() with case insensitivity. * * In the public domain; found at: * http://c.snippets.org/code/stristr.c */ char *my_stristr(const char *string, const char *pattern) { const char *pptr, *sptr; char *start; for (start = (char *)string; *start != 0; start++) { /* find start of pattern in string */ for ( ; ((*start != 0) && (toupper((unsigned char)*start) != toupper((unsigned char)*pattern))); start++) ; if (*start == 0) return NULL; pptr = (const char *)pattern; sptr = (const char *)start; while (toupper((unsigned char)*sptr) == toupper((unsigned char)*pptr)) { sptr++; pptr++; /* if end of pattern then pattern was found */ if (*pptr == 0) return (start); } } return NULL; } /* * The my_strcpy() function copies up to 'bufsize'-1 characters from 'src' * to 'buf' and NUL-terminates the result. The 'buf' and 'src' strings may * not overlap. * * my_strcpy() returns strlen(src). This makes checking for truncation * easy. Example: if (my_strcpy(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcpy() function in BSD. */ size_t my_strcpy(char *buf, const char *src, size_t bufsize) { size_t len = strlen(src); size_t ret = len; /* Paranoia */ if (bufsize == 0) return ret; /* Truncate */ if (len >= bufsize) len = bufsize - 1; /* Copy the string and terminate it */ (void)memcpy(buf, src, len); buf[len] = '\0'; /* Return strlen(src) */ return ret; } /* * The my_strcat() tries to append a string to an existing NUL-terminated string. * It never writes more characters into the buffer than indicated by 'bufsize' and * NUL-terminates the buffer. The 'buf' and 'src' strings may not overlap. * * my_strcat() returns strlen(buf) + strlen(src). This makes checking for * truncation easy. Example: * if (my_strcat(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcat() function in BSD. */ size_t my_strcat(char *buf, const char *src, size_t bufsize) { size_t dlen = strlen(buf); /* Is there room left in the buffer? */ if (dlen < bufsize - 1) { /* Append as much as possible */ return (dlen + my_strcpy(buf + dlen, src, bufsize - dlen)); } else { /* Return without appending */ return (dlen + strlen(src)); } } /* * Determine if string "a" is equal to string "b" */ #undef streq bool streq(const char *a, const char *b) { return (!strcmp(a, b)); } /* * Determine if string "t" is a suffix of string "s" */ bool suffix(const char *s, const char *t) { size_t tlen = strlen(t); size_t slen = strlen(s); /* Check for incompatible lengths */ if (tlen > slen) return (FALSE); /* Compare "t" to the end of "s" */ return (!strcmp(s + slen - tlen, t)); } /* * Determine if string "t" is a prefix of string "s" */ bool prefix(const char *s, const char *t) { /* Scan "t" */ while (*t) { /* Compare content and length */ if (*t++ != *s++) return (FALSE); } /* Matched, we have a prefix */ return (TRUE); } /* * Determine if string "t" is a prefix of string "s" - case insensitive. */ bool prefix_i(const char *s, const char *t) { /* Scan "t" */ while (*t) { if (toupper((unsigned char)*t) != toupper((unsigned char)*s)) return (FALSE); else { t++; s++; } } /* Matched, we have a prefix */ return (TRUE); } /* * Redefinable "plog" action */ void (*plog_aux)(const char *) = NULL; /* * Print (or log) a "warning" message (ala "perror()") * Note the use of the (optional) "plog_aux" hook. */ void plog(const char *str) { /* Use the "alternative" function if possible */ if (plog_aux) (*plog_aux)(str); /* Just do a labeled fprintf to stderr */ else (void)(fprintf(stderr, "%s: %s\n", argv0 ? argv0 : "?", str)); } /* * Redefinable "quit" action */ void (*quit_aux)(const char *) = NULL; /* * Exit (ala "exit()"). If 'str' is NULL, do "exit(EXIT_SUCCESS)". * Otherwise, plog() 'str' and exit with an error code of -1. * But always use 'quit_aux', if set, before anything else. */ void quit(const char *str) { /* Attempt to use the aux function */ if (quit_aux) (*quit_aux)(str); /* Success */ if (!str) (void)(exit(EXIT_SUCCESS)); /* Send the string to plog() */ plog(str); /* Failure */ (void)(exit(EXIT_FAILURE)); } /* Arithmetic mean of the first 'size' entries of the array 'nums' */ int mean(int *nums, int size) { int i, total = 0; for(i = 0; i < size; i++) total += nums[i]; return total / size; } /* Variance of the first 'size' entries of the array 'nums' */ int variance(int *nums, int size) { int i, avg, total = 0; avg = mean(nums, size); for(i = 0; i < size; i++) { int delta = nums[i] - avg; total += delta * delta; } return total / size; } void sort(void *base, size_t nmemb, size_t smemb, int (*comp)(const void *, const void *)) { qsort(base, nmemb, smemb, comp); } angband-v3.3.2/src/xtra2.c0000644000175000017500000003056511651552410014613 0ustar chriscchrisc/* * File: xtra2.c * Purpose: Targetting, sorting, panel update * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "keymap.h" #include "history.h" #include "object/tvalsval.h" #include "pathfind.h" #include "spells.h" #include "target.h" /* Private function that is shared by verify_panel() and center_panel() */ void verify_panel_int(bool centered); /* * Modify the current panel to the given coordinates, adjusting only to * ensure the coordinates are legal, and return TRUE if anything done. * * The town should never be scrolled around. * * Note that monsters are no longer affected in any way by panel changes. * * As a total hack, whenever the current panel changes, we assume that * the "overhead view" window should be updated. */ bool modify_panel(term *t, int wy, int wx) { int dungeon_hgt = (p_ptr->depth == 0) ? TOWN_HGT : DUNGEON_HGT; int dungeon_wid = (p_ptr->depth == 0) ? TOWN_WID : DUNGEON_WID; /* Verify wy, adjust if needed */ if (wy > dungeon_hgt - SCREEN_HGT) wy = dungeon_hgt - SCREEN_HGT; if (wy < 0) wy = 0; /* Verify wx, adjust if needed */ if (wx > dungeon_wid - SCREEN_WID) wx = dungeon_wid - SCREEN_WID; if (wx < 0) wx = 0; /* React to changes */ if ((t->offset_y != wy) || (t->offset_x != wx)) { /* Save wy, wx */ t->offset_y = wy; t->offset_x = wx; /* Redraw map */ p_ptr->redraw |= (PR_MAP); /* Redraw for big graphics */ if ((tile_width > 1) || (tile_height > 1)) redraw_stuff(p_ptr); /* Changed */ return (TRUE); } /* No change */ return (FALSE); } /* * Perform the minimum "whole panel" adjustment to ensure that the given * location is contained inside the current panel, and return TRUE if any * such adjustment was performed. */ bool adjust_panel(int y, int x) { bool changed = FALSE; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { int wx, wy; int screen_hgt, screen_wid; term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if ((j > 0) && !(op_ptr->window_flag[j] & PW_MAP)) continue; wy = t->offset_y; wx = t->offset_x; screen_hgt = (j == 0) ? SCREEN_HGT : t->hgt; screen_wid = (j == 0) ? SCREEN_WID : t->wid; /* Adjust as needed */ while (y >= wy + screen_hgt) wy += screen_hgt / 2; while (y < wy) wy -= screen_hgt / 2; /* Adjust as needed */ while (x >= wx + screen_wid) wx += screen_wid / 2; while (x < wx) wx -= screen_wid / 2; /* Use "modify_panel" */ if (modify_panel(t, wy, wx)) changed = TRUE; } return (changed); } /* * Change the current panel to the panel lying in the given direction. * * Return TRUE if the panel was changed. */ bool change_panel(int dir) { bool changed = FALSE; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { int screen_hgt, screen_wid; int wx, wy; term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if ((j > 0) && !(op_ptr->window_flag[j] & PW_MAP)) continue; screen_hgt = (j == 0) ? SCREEN_HGT : t->hgt; screen_wid = (j == 0) ? SCREEN_WID : t->wid; /* Shift by half a panel */ wy = t->offset_y + ddy[dir] * screen_hgt / 2; wx = t->offset_x + ddx[dir] * screen_wid / 2; /* Use "modify_panel" */ if (modify_panel(t, wy, wx)) changed = TRUE; } return (changed); } /* * Verify the current panel (relative to the player location). * * By default, when the player gets "too close" to the edge of the current * panel, the map scrolls one panel in that direction so that the player * is no longer so close to the edge. * * The "OPT(center_player)" option allows the current panel to always be centered * around the player, which is very expensive, and also has some interesting * gameplay ramifications. */ void verify_panel(void) { verify_panel_int(OPT(center_player)); } void center_panel(void) { verify_panel_int(TRUE); } void verify_panel_int(bool centered) { int wy, wx; int screen_hgt, screen_wid; int panel_wid, panel_hgt; int py = p_ptr->py; int px = p_ptr->px; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if ((j > 0) && !(op_ptr->window_flag[j] & (PW_MAP))) continue; wy = t->offset_y; wx = t->offset_x; screen_hgt = (j == 0) ? SCREEN_HGT : t->hgt; screen_wid = (j == 0) ? SCREEN_WID : t->wid; panel_wid = screen_wid / 2; panel_hgt = screen_hgt / 2; /* Scroll screen vertically when off-center */ if (centered && !p_ptr->running && (py != wy + panel_hgt)) wy = py - panel_hgt; /* Scroll screen vertically when 3 grids from top/bottom edge */ else if ((py < wy + 3) || (py >= wy + screen_hgt - 3)) wy = py - panel_hgt; /* Scroll screen horizontally when off-center */ if (centered && !p_ptr->running && (px != wx + panel_wid)) wx = px - panel_wid; /* Scroll screen horizontally when 3 grids from left/right edge */ else if ((px < wx + 3) || (px >= wx + screen_wid - 3)) wx = px - panel_wid; /* Scroll if needed */ modify_panel(t, wy, wx); } } /* * Given a "source" and "target" location, extract a "direction", * which will move one step from the "source" towards the "target". * * Note that we use "diagonal" motion whenever possible. * * We return "5" if no motion is needed. */ int motion_dir(int y1, int x1, int y2, int x2) { /* No movement required */ if ((y1 == y2) && (x1 == x2)) return (5); /* South or North */ if (x1 == x2) return ((y1 < y2) ? 2 : 8); /* East or West */ if (y1 == y2) return ((x1 < x2) ? 6 : 4); /* South-east or South-west */ if (y1 < y2) return ((x1 < x2) ? 3 : 1); /* North-east or North-west */ if (y1 > y2) return ((x1 < x2) ? 9 : 7); /* Paranoia */ return (5); } /* * Extract a direction (or zero) from a character */ int target_dir(struct keypress ch) { int d = 0; /* Already a direction? */ if (isdigit((unsigned char)ch.code)) { d = D2I(ch.code); } else if (isarrow(ch.code)) { switch (ch.code) { case ARROW_DOWN: d = 2; break; case ARROW_LEFT: d = 4; break; case ARROW_RIGHT: d = 6; break; case ARROW_UP: d = 8; break; } } else { int mode; const struct keypress *act; if (OPT(rogue_like_commands)) mode = KEYMAP_MODE_ROGUE; else mode = KEYMAP_MODE_ORIG; /* XXX see if this key has a digit in the keymap we can use */ act = keymap_find(mode, ch); if (act) { const struct keypress *cur; for (cur = act; cur->type == EVT_KBRD; cur++) { if (isdigit((unsigned char) cur->code)) d = D2I(cur->code); } } } /* Paranoia */ if (d == 5) d = 0; /* Return direction */ return (d); } int dir_transitions[10][10] = { /* 0-> */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* 1-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 2-> */ { 0, 0, 2, 0, 1, 0, 3, 0, 5, 0 }, /* 3-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4-> */ { 0, 0, 1, 0, 4, 0, 5, 0, 7, 0 }, /* 5-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 6-> */ { 0, 0, 3, 0, 5, 0, 6, 0, 9, 0 }, /* 7-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 8-> */ { 0, 0, 5, 0, 7, 0, 9, 0, 8, 0 }, /* 9-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; /* * Request a "movement" direction (1,2,3,4,6,7,8,9) from the user. * * Return TRUE if a direction was chosen, otherwise return FALSE. * * This function should be used for all "repeatable" commands, such as * run, walk, open, close, bash, disarm, spike, tunnel, etc, as well * as all commands which must reference a grid adjacent to the player, * and which may not reference the grid under the player. * * Directions "5" and "0" are illegal and will not be accepted. * * This function tracks and uses the "global direction", and uses * that as the "desired direction", if it is set. */ bool get_rep_dir(int *dp) { int dir = 0; ui_event ke; /* Initialize */ (*dp) = 0; /* Get a direction */ while (!dir) { /* Paranoia XXX XXX XXX */ message_flush(); /* Get first keypress - the first test is to avoid displaying the prompt for direction if there's already a keypress queued up and waiting - this just avoids a flickering prompt if there is a "lazy" movement delay. */ inkey_scan = SCAN_INSTANT; ke = inkey_ex(); inkey_scan = SCAN_OFF; if (ke.type == EVT_NONE || (ke.type == EVT_KBRD && target_dir(ke.key) == 0)) { prt("Direction or (Escape to cancel)? ", 0, 0); ke = inkey_ex(); } /* Check mouse coordinates */ if (ke.type == EVT_MOUSE) { /*if (ke.button) */ { int y = KEY_GRID_Y(ke); int x = KEY_GRID_X(ke); struct loc from = loc(p_ptr->px, p_ptr->py); struct loc to = loc(x, y); dir = pathfind_direction_to(from, to); } } /* Get other keypresses until a direction is chosen. */ else if (ke.type == EVT_KBRD) { int keypresses_handled = 0; while (ke.type == EVT_KBRD && ke.key.code != 0) { int this_dir; if (ke.key.code == ESCAPE) { /* Clear the prompt */ prt("", 0, 0); return (FALSE); } /* XXX Ideally show and move the cursor here to indicate the currently "Pending" direction. XXX */ this_dir = target_dir(ke.key); if (this_dir) dir = dir_transitions[dir][this_dir]; if (lazymove_delay == 0 || ++keypresses_handled > 1) break; inkey_scan = lazymove_delay; ke = inkey_ex(); } /* 5 is equivalent to "escape" */ if (dir == 5) { /* Clear the prompt */ prt("", 0, 0); return (FALSE); } } /* Oops */ if (!dir) bell("Illegal repeatable direction!"); } /* Clear the prompt */ prt("", 0, 0); /* Save direction */ (*dp) = dir; /* Success */ return (TRUE); } /* * Get an "aiming direction" (1,2,3,4,6,7,8,9 or 5) from the user. * * Return TRUE if a direction was chosen, otherwise return FALSE. * * The direction "5" is special, and means "use current target". * * This function tracks and uses the "global direction", and uses * that as the "desired direction", if it is set. * * Note that "Force Target", if set, will pre-empt user interaction, * if there is a usable target already set. */ bool get_aim_dir(int *dp) { /* Global direction */ int dir = 0; ui_event ke; const char *p; /* Initialize */ (*dp) = 0; /* Hack -- auto-target if requested */ if (OPT(use_old_target) && target_okay() && !dir) dir = 5; /* Ask until satisfied */ while (!dir) { /* Choose a prompt */ if (!target_okay()) p = "Direction ('*' or to target, \"'\" for closest, Escape to cancel)? "; else p = "Direction ('5' for target, '*' or to re-target, Escape to cancel)? "; /* Get a command (or Cancel) */ if (!get_com_ex(p, &ke)) break; if (ke.type == EVT_MOUSE) { if (target_set_interactive(TARGET_KILL, KEY_GRID_X(ke), KEY_GRID_Y(ke))) dir = 5; } else if (ke.type == EVT_KBRD) { if (ke.key.code == '*') { /* Set new target, use target if legal */ if (target_set_interactive(TARGET_KILL, -1, -1)) dir = 5; } else if (ke.key.code == '\'') { /* Set to closest target */ if (target_set_closest(TARGET_KILL)) dir = 5; } else if (ke.key.code == 't' || ke.key.code == '5' || ke.key.code == '0' || ke.key.code == '.') { if (target_okay()) dir = 5; } else { /* Possible direction */ int keypresses_handled = 0; while (ke.key.code != 0) { int this_dir; /* XXX Ideally show and move the cursor here to indicate the currently "Pending" direction. XXX */ this_dir = target_dir(ke.key); if (this_dir) dir = dir_transitions[dir][this_dir]; else break; if (lazymove_delay == 0 || ++keypresses_handled > 1) break; /* See if there's a second keypress within the defined period of time. */ inkey_scan = lazymove_delay; ke = inkey_ex(); } } } /* Error */ if (!dir) bell("Illegal aim direction!"); } /* No direction */ if (!dir) return (FALSE); /* Save direction */ (*dp) = dir; /* A "valid" direction was entered */ return (TRUE); } angband-v3.3.2/src/birth.c0000644000175000017500000006533111651552410014662 0ustar chriscchrisc/* * File: birth.c * Purpose: Character creation * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "files.h" #include "game-event.h" #include "game-cmd.h" #include "history.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "object/object.h" #include "squelch.h" #include "ui-menu.h" /* * Overview * ======== * This file contains the game-mechanical part of the birth process. * To follow the code, start at player_birth towards the bottom of * the file - that is the only external entry point to the functions * defined here. * * Player (in the Angband sense of character) birth is modelled as a * a series of commands from the UI to the game to manipulate the * character and corresponding events to inform the UI of the outcomes * of these changes. * * The current aim of this section is that after any birth command * is carried out, the character should be left in a playable state. * In particular, this means that if a savefile is supplied, the * character will be set up according to the "quickstart" rules until * another race or class is chosen, or until the stats are reset by * the UI. * * Once the UI signals that the player is happy with the character, the * game does housekeeping to ensure the character is ready to start the * game (clearing the history log, making sure options are set, etc) * before returning control to the game proper. */ /* * Maximum amount of starting equipment, and starting gold */ #define STARTING_GOLD 600 /* * Forward declare */ typedef struct birther /*lovely*/ birther; /*sometimes we think she's a dream*/ /* * A structure to hold "rolled" information, and any * other useful state for the birth process. * * XXX Demand Obama's birth certificate */ struct birther { byte sex; const struct player_race *race; const struct player_class *class; s16b age; s16b wt; s16b ht; s16b sc; s32b au; s16b stat[A_MAX]; char *history; }; /* * Save the currently rolled data into the supplied 'player'. */ static void save_roller_data(birther *player) { int i; /* Save the data */ player->sex = p_ptr->psex; player->race = p_ptr->race; player->class = p_ptr->class; player->age = p_ptr->age; player->wt = p_ptr->wt_birth; player->ht = p_ptr->ht_birth; player->sc = p_ptr->sc_birth; player->au = p_ptr->au_birth; /* Save the stats */ for (i = 0; i < A_MAX; i++) player->stat[i] = p_ptr->stat_birth[i]; player->history = p_ptr->history; } /* * Load stored player data from 'player' as the currently rolled data, * optionally placing the current data in 'prev_player' (if 'prev_player' * is non-NULL). * * It is perfectly legal to specify the same "birther" for both 'player' * and 'prev_player'. */ static void load_roller_data(birther *player, birther *prev_player) { int i; /* The initialisation is just paranoia - structure assignment is (perhaps) not strictly defined to work with uninitialised parts of structures. */ birther temp; WIPE(&temp, birther); /*** Save the current data if we'll need it later ***/ if (prev_player) save_roller_data(&temp); /*** Load the previous data ***/ /* Load the data */ p_ptr->psex = player->sex; p_ptr->race = player->race; p_ptr->class = player->class; p_ptr->age = player->age; p_ptr->wt = p_ptr->wt_birth = player->wt; p_ptr->ht = p_ptr->ht_birth = player->ht; p_ptr->sc = p_ptr->sc_birth = player->sc; p_ptr->au_birth = player->au; p_ptr->au = STARTING_GOLD; /* Load the stats */ for (i = 0; i < A_MAX; i++) { p_ptr->stat_max[i] = p_ptr->stat_cur[i] = p_ptr->stat_birth[i] = player->stat[i]; } /* Load the history */ p_ptr->history = player->history; /*** Save the current data if the caller is interested in it. ***/ if (prev_player) *prev_player = temp; } /* * Adjust a stat by an amount. * * This just uses "modify_stat_value()" unless "maximize" mode is false, * and a positive bonus is being applied, in which case, a special hack * is used. */ static int adjust_stat(int value, int amount) { /* Negative amounts or maximize mode */ if ((amount < 0) || OPT(birth_maximize)) { return (modify_stat_value(value, amount)); } /* Special hack */ else { int i; /* Apply reward */ for (i = 0; i < amount; i++) { if (value < 18) { value++; } else if (value < 18+70) { value += randint1(15) + 5; } else if (value < 18+90) { value += randint1(6) + 2; } else if (value < 18+100) { value++; } } } /* Return the result */ return (value); } /* * Roll for a characters stats * * For efficiency, we include a chunk of "calc_bonuses()". */ static void get_stats(int stat_use[A_MAX]) { int i, j; int bonus; int dice[18]; /* Roll and verify some stats */ while (TRUE) { /* Roll some dice */ for (j = i = 0; i < 18; i++) { /* Roll the dice */ dice[i] = randint1(3 + i % 3); /* Collect the maximum */ j += dice[i]; } /* Verify totals */ if ((j > 42) && (j < 54)) break; } /* Roll the stats */ for (i = 0; i < A_MAX; i++) { /* Extract 5 + 1d3 + 1d4 + 1d5 */ j = 5 + dice[3*i] + dice[3*i+1] + dice[3*i+2]; /* Save that value */ p_ptr->stat_max[i] = j; /* Obtain a "bonus" for "race" and "class" */ bonus = p_ptr->race->r_adj[i] + p_ptr->class->c_adj[i]; /* Variable stat maxes */ if (OPT(birth_maximize)) { /* Start fully healed */ p_ptr->stat_cur[i] = p_ptr->stat_max[i]; /* Efficiency -- Apply the racial/class bonuses */ stat_use[i] = modify_stat_value(p_ptr->stat_max[i], bonus); } /* Fixed stat maxes */ else { /* Apply the bonus to the stat (somewhat randomly) */ stat_use[i] = adjust_stat(p_ptr->stat_max[i], bonus); /* Save the resulting stat maximum */ p_ptr->stat_cur[i] = p_ptr->stat_max[i] = stat_use[i]; } p_ptr->stat_birth[i] = p_ptr->stat_max[i]; } } static void roll_hp(void) { int i, j, min_value, max_value; /* Minimum hitpoints at highest level */ min_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 3) / 8; min_value += PY_MAX_LEVEL; /* Maximum hitpoints at highest level */ max_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 5) / 8; max_value += PY_MAX_LEVEL; /* Roll out the hitpoints */ while (TRUE) { /* Roll the hitpoint values */ for (i = 1; i < PY_MAX_LEVEL; i++) { j = randint1(p_ptr->hitdie); p_ptr->player_hp[i] = p_ptr->player_hp[i-1] + j; } /* XXX Could also require acceptable "mid-level" hitpoints */ /* Require "valid" hitpoints at highest level */ if (p_ptr->player_hp[PY_MAX_LEVEL-1] < min_value) continue; if (p_ptr->player_hp[PY_MAX_LEVEL-1] > max_value) continue; /* Acceptable */ break; } } static void get_bonuses(void) { /* Calculate the bonuses and hitpoints */ p_ptr->update |= (PU_BONUS | PU_HP); /* Update stuff */ update_stuff(p_ptr); /* Fully healed */ p_ptr->chp = p_ptr->mhp; /* Fully rested */ p_ptr->csp = p_ptr->msp; } /* * Get the racial history, and social class, using the "history charts". */ char *get_history(struct history_chart *chart, s16b *sc) { int roll, social_class; struct history_entry *entry; char *res = NULL; social_class = randint1(4); while (chart) { roll = randint1(100); for (entry = chart->entries; entry; entry = entry->next) if (roll <= entry->roll) break; assert(entry); res = string_append(res, entry->text); social_class += entry->bonus - 50; chart = entry->succ; } if (social_class > 75) social_class = 75; else if (social_class < 1) social_class = 1; if (sc) *sc = social_class; return res; } /* * Computes character's age, height, and weight */ static void get_ahw(struct player *p) { /* Calculate the age */ p->age = p->race->b_age + randint1(p->race->m_age); /* Calculate the height/weight for males */ if (p->psex == SEX_MALE) { p->ht = p->ht_birth = Rand_normal(p->race->m_b_ht, p->race->m_m_ht); p->wt = p->wt_birth = Rand_normal(p->race->m_b_wt, p->race->m_m_wt); } /* Calculate the height/weight for females */ else if (p->psex == SEX_FEMALE) { p->ht = p->ht_birth = Rand_normal(p->race->f_b_ht, p->race->f_m_ht); p->wt = p->wt_birth = Rand_normal(p->race->f_b_wt, p->race->f_m_wt); } } /* * Get the player's starting money */ static void get_money(void) { /* if (OPT(birth_money)) { p_ptr->au_birth = 200; p_ptr->au = 500; } else { */ p_ptr->au = p_ptr->au_birth = STARTING_GOLD; } void player_init(struct player *p) { int i; bool keep_randarts = FALSE; if (p->inventory) mem_free(p->inventory); /* Preserve p_ptr->randarts so that players can use loaded randarts even * if they create a completely different character */ if (p->randarts) keep_randarts = TRUE; /* Wipe the player */ (void)WIPE(p, struct player); if (keep_randarts) p->randarts = TRUE; /* Start with no artifacts made yet */ for (i = 0; z_info && i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; a_ptr->created = FALSE; a_ptr->seen = FALSE; } /* Start with no quests */ for (i = 0; q_list && i < MAX_Q_IDX; i++) { q_list[i].level = 0; } if (q_list) { q_list[0].level = 99; q_list[1].level = 100; } for (i = 1; z_info && i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; k_ptr->tried = FALSE; k_ptr->aware = FALSE; } for (i = 1; z_info && i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; monster_lore *l_ptr = &l_list[i]; r_ptr->cur_num = 0; r_ptr->max_num = 100; if (rf_has(r_ptr->flags, RF_UNIQUE)) r_ptr->max_num = 1; l_ptr->pkills = 0; } /* Hack -- no ghosts */ if (z_info) r_info[z_info->r_max-1].max_num = 0; /* Always start with a well fed player (this is surely in the wrong fn) */ p->food = PY_FOOD_FULL - 1; /* None of the spells have been learned yet */ for (i = 0; i < PY_MAX_SPELLS; i++) p->spell_order[i] = 99; p->inventory = C_ZNEW(ALL_INVEN_TOTAL, struct object); /* First turn. */ turn = 1; p_ptr->total_energy = 0; p_ptr->resting_turn = 0; /* XXX default race/class */ p_ptr->race = races; p_ptr->class = classes; } /** * Try to wield everything wieldable in the inventory. */ static void wield_all(struct player *p) { object_type *o_ptr; object_type *i_ptr; object_type object_type_body; int slot; int item; int num; bool is_ammo; /* Scan through the slots backwards */ for (item = INVEN_PACK - 1; item >= 0; item--) { o_ptr = &p->inventory[item]; is_ammo = obj_is_ammo(o_ptr); /* Skip non-objects */ if (!o_ptr->kind) continue; /* Make sure we can wield it */ slot = wield_slot(o_ptr); if (slot < INVEN_WIELD) continue; i_ptr = &p->inventory[slot]; if (i_ptr->kind && (!is_ammo || (is_ammo && !object_similar(o_ptr, i_ptr, OSTACK_PACK)))) continue; /* Figure out how much of the item we'll be wielding */ num = is_ammo ? o_ptr->number : 1; /* Get local object */ i_ptr = &object_type_body; object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = num; /* Decrease the item (from the pack) */ inven_item_increase(item, -num); inven_item_optimize(item); /* Get the wield slot */ o_ptr = &p->inventory[slot]; /* Wear the new stuff */ object_copy(o_ptr, i_ptr); /* Increase the weight */ p->total_weight += i_ptr->weight * i_ptr->number; /* Increment the equip counter by hand */ p->equip_cnt++; } save_quiver_size(p); return; } /* * Init players with some belongings * * Having an item identifies it and makes the player "aware" of its purpose. */ static void player_outfit(struct player *p) { const struct start_item *si; object_type object_type_body; /* Give the player starting equipment */ for (si = p_ptr->class->start_items; si; si = si->next) { /* Get local object */ struct object *i_ptr = &object_type_body; /* Prepare the item */ object_prep(i_ptr, si->kind, 0, MINIMISE); i_ptr->number = (byte)rand_range(si->min, si->max); i_ptr->origin = ORIGIN_BIRTH; object_flavor_aware(i_ptr); object_notice_everything(i_ptr); inven_carry(p, i_ptr); si->kind->everseen = TRUE; /* Deduct the cost of the item from starting cash */ p->au -= object_value(i_ptr, i_ptr->number, FALSE); } /* Sanity check */ if (p->au < 0) p->au = 0; /* Now try wielding everything */ wield_all(p); } /* * Cost of each "point" of a stat. */ static const int birth_stat_costs[18 + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 4 }; /* It was feasible to get base 17 in 3 stats with the autoroller */ #define MAX_BIRTH_POINTS 24 /* 3 * (1+1+1+1+1+1+2) */ static void recalculate_stats(int *stats, int points_left) { int i; /* Process stats */ for (i = 0; i < A_MAX; i++) { /* Variable stat maxes */ if (OPT(birth_maximize)) { /* Reset stats */ p_ptr->stat_cur[i] = p_ptr->stat_max[i] = p_ptr->stat_birth[i] = stats[i]; } /* Fixed stat maxes */ else { /* Obtain a "bonus" for "race" and "class" */ int bonus = p_ptr->race->r_adj[i] + p_ptr->class->c_adj[i]; /* Apply the racial/class bonuses */ p_ptr->stat_cur[i] = p_ptr->stat_max[i] = p_ptr->stat_birth[i] = modify_stat_value(stats[i], bonus); } } /* Gold is inversely proportional to cost */ p_ptr->au_birth = STARTING_GOLD + (50 * points_left); /* Update bonuses, hp, etc. */ get_bonuses(); /* Tell the UI about all this stuff that's changed. */ event_signal(EVENT_GOLD); event_signal(EVENT_AC); event_signal(EVENT_HP); event_signal(EVENT_STATS); } static void reset_stats(int stats[A_MAX], int points_spent[A_MAX], int *points_left) { int i; /* Calculate and signal initial stats and points totals. */ *points_left = MAX_BIRTH_POINTS; for (i = 0; i < A_MAX; i++) { /* Initial stats are all 10 and costs are zero */ stats[i] = 10; points_spent[i] = 0; } /* Use the new "birth stat" values to work out the "other" stat values (i.e. after modifiers) and tell the UI things have changed. */ recalculate_stats(stats, *points_left); event_signal_birthpoints(points_spent, *points_left); } static bool buy_stat(int choice, int stats[A_MAX], int points_spent[A_MAX], int *points_left) { /* Must be a valid stat, and have a "base" of below 18 to be adjusted */ if (!(choice >= A_MAX || choice < 0) && (stats[choice] < 18)) { /* Get the cost of buying the extra point (beyond what it has already cost to get this far). */ int stat_cost = birth_stat_costs[stats[choice] + 1]; if (stat_cost <= *points_left) { stats[choice]++; points_spent[choice] += stat_cost; *points_left -= stat_cost; /* Tell the UI the new points situation. */ event_signal_birthpoints(points_spent, *points_left); /* Recalculate everything that's changed because the stat has changed, and inform the UI. */ recalculate_stats(stats, *points_left); return TRUE; } } /* Didn't adjust stat. */ return FALSE; } static bool sell_stat(int choice, int stats[A_MAX], int points_spent[A_MAX], int *points_left) { /* Must be a valid stat, and we can't "sell" stats below the base of 10. */ if (!(choice >= A_MAX || choice < 0) && (stats[choice] > 10)) { int stat_cost = birth_stat_costs[stats[choice]]; stats[choice]--; points_spent[choice] -= stat_cost; *points_left += stat_cost; /* Tell the UI the new points situation. */ event_signal_birthpoints(points_spent, *points_left); /* Recalculate everything that's changed because the stat has changed, and inform the UI. */ recalculate_stats(stats, *points_left); return TRUE; } /* Didn't adjust stat. */ return FALSE; } /* * This picks some reasonable starting values for stats based on the * current race/class combo, etc. For now I'm disregarding concerns * about role-playing, etc, and using the simple outline from * http://angband.oook.cz/forum/showpost.php?p=17588&postcount=6: * * 0. buy base STR 17 * 1. if possible buy adj DEX of 18/10 * 2. spend up to half remaining points on each of spell-stat and con, * but only up to max base of 16 unless a pure class * [mage or priest or warrior] * 3. If there are any points left, spend as much as possible in order * on DEX, non-spell-stat, CHR. */ static void generate_stats(int stats[A_MAX], int points_spent[A_MAX], int *points_left) { int step = 0; int maxed[A_MAX] = { 0 }; bool pure = FALSE; /* Determine whether the class is "pure" */ if (p_ptr->class->spell_stat == 0 || p_ptr->class-> max_attacks < 5) { pure = TRUE; } while (*points_left && step >= 0) { switch (step) { /* Buy base STR 17 */ case 0: { if (!maxed[A_STR] && stats[A_STR] < 17) { if (!buy_stat(A_STR, stats, points_spent, points_left)) maxed[A_STR] = TRUE; } else { step++; } break; } /* Try and buy adj DEX of 18/10 */ case 1: { if (!maxed[A_DEX] && p_ptr->state.stat_top[A_DEX] < 18+10) { if (!buy_stat(A_DEX, stats, points_spent, points_left)) maxed[A_DEX] = TRUE; } else { step++; } break; } /* If we can't get 18/10 dex, sell it back. */ case 2: { if (p_ptr->state.stat_top[A_DEX] < 18+10) { while (stats[A_DEX] > 10) sell_stat(A_DEX, stats, points_spent, points_left); maxed[A_DEX] = FALSE; } step++; } /* * Spend up to half remaining points on each of spell-stat and * con, but only up to max base of 16 unless a pure class * [mage or priest or warrior] */ case 3: { int points_trigger = *points_left / 2; if (p_ptr->class->spell_stat) { while (!maxed[p_ptr->class->spell_stat] && (pure || stats[p_ptr->class->spell_stat] < 16) && points_spent[p_ptr->class->spell_stat] < points_trigger) { if (!buy_stat(p_ptr->class->spell_stat, stats, points_spent, points_left)) { maxed[p_ptr->class->spell_stat] = TRUE; } if (points_spent[p_ptr->class->spell_stat] > points_trigger) { sell_stat(p_ptr->class->spell_stat, stats, points_spent, points_left); maxed[p_ptr->class->spell_stat] = TRUE; } } } while (!maxed[A_CON] && (pure || stats[A_CON] < 16) && points_spent[A_CON] < points_trigger) { if (!buy_stat(A_CON, stats, points_spent,points_left)) { maxed[A_CON] = TRUE; } if (points_spent[A_CON] > points_trigger) { sell_stat(A_CON, stats, points_spent, points_left); maxed[A_CON] = TRUE; } } step++; break; } /* * If there are any points left, spend as much as possible in * order on DEX, non-spell-stat, CHR. */ case 4: { int next_stat; if (!maxed[A_DEX]) { next_stat = A_DEX; } else if (!maxed[A_INT] && p_ptr->class->spell_stat != A_INT) { next_stat = A_INT; } else if (!maxed[A_WIS] && p_ptr->class->spell_stat != A_WIS) { next_stat = A_WIS; } else if (!maxed[A_CHR]) { next_stat = A_CHR; } else { step++; break; } /* Buy until we can't buy any more. */ while (buy_stat(next_stat, stats, points_spent, points_left)); maxed[next_stat] = TRUE; break; } default: { step = -1; break; } } } } /* * This fleshes out a full player based on the choices currently made, * and so is called whenever things like race or class are chosen. */ void player_generate(struct player *p, const player_sex *s, const struct player_race *r, const struct player_class *c) { if (!s) s = &sex_info[p->psex]; if (!c) c = p->class; if (!r) r = p->race; p->sex = s; p->class = c; p->race = r; /* Level 1 */ p->max_lev = p->lev = 1; /* Experience factor */ p->expfact = p->race->r_exp + p->class->c_exp; /* Hitdice */ p->hitdie = p->race->r_mhp + p->class->c_mhp; /* Initial hitpoints */ p->mhp = p->hitdie; /* Pre-calculate level 1 hitdice */ p->player_hp[0] = p->hitdie; /* Roll for age/height/weight */ get_ahw(p); p->history = get_history(p->race->history, &p->sc); p->sc_birth = p->sc; } /* Reset everything back to how it would be on loading the game. */ static void do_birth_reset(bool use_quickstart, birther *quickstart_prev) { /* If there's quickstart data, we use it to set default character choices. */ if (use_quickstart && quickstart_prev) load_roller_data(quickstart_prev, NULL); player_generate(p_ptr, NULL, NULL, NULL); /* Update stats with bonuses, etc. */ get_bonuses(); } /* * Create a new character. * * Note that we may be called with "junk" leftover in the various * fields, so we must be sure to clear them first. */ void player_birth(bool quickstart_allowed) { int i; game_command blank = { CMD_NULL, 0, {{0}} }; game_command *cmd = ␣ int stats[A_MAX]; int points_spent[A_MAX]; int points_left; char *buf; int success; bool rolled_stats = FALSE; /* * The last character displayed, to allow the user to flick between two. * We rely on prev.age being zero to determine whether there is a stored * character or not, so initialise it here. */ birther prev = { 0 }; /* * If quickstart is allowed, we store the old character in this, * to allow for it to be reloaded if we step back that far in the * birth process. */ birther quickstart_prev = { 0 }; /* * If there's a quickstart character, store it for later use. * If not, default to whatever the first of the choices is. */ if (quickstart_allowed) save_roller_data(&quickstart_prev); else { p_ptr->psex = 0; /* XXX default race/class */ p_ptr->class = classes; p_ptr->race = races; player_generate(p_ptr, NULL, NULL, NULL); } /* Handle incrementing name suffix */ buf = find_roman_suffix_start(op_ptr->full_name); if (buf) { /* Try to increment the roman suffix */ success = int_to_roman((roman_to_int(buf) + 1), buf, (sizeof(op_ptr->full_name) - (buf - (char *)&op_ptr->full_name))); if (!success) msg("Sorry, could not deal with suffix"); } /* We're ready to start the interactive birth process. */ event_signal_flag(EVENT_ENTER_BIRTH, quickstart_allowed); /* * Loop around until the UI tells us we have an acceptable character. * Note that it is possible to quit from inside this loop. */ while (cmd->command != CMD_ACCEPT_CHARACTER) { /* Grab a command from the queue - we're happy to wait for it. */ if (cmd_get(CMD_BIRTH, &cmd, TRUE) != 0) continue; if (cmd->command == CMD_BIRTH_RESET) { player_init(p_ptr); reset_stats(stats, points_spent, &points_left); do_birth_reset(quickstart_allowed, &quickstart_prev); rolled_stats = FALSE; } else if (cmd->command == CMD_CHOOSE_SEX) { p_ptr->psex = cmd->arg[0].choice; player_generate(p_ptr, NULL, NULL, NULL); } else if (cmd->command == CMD_CHOOSE_RACE) { player_generate(p_ptr, NULL, player_id2race(cmd->arg[0].choice), NULL); reset_stats(stats, points_spent, &points_left); generate_stats(stats, points_spent, &points_left); rolled_stats = FALSE; } else if (cmd->command == CMD_CHOOSE_CLASS) { player_generate(p_ptr, NULL, NULL, player_id2class(cmd->arg[0].choice)); reset_stats(stats, points_spent, &points_left); generate_stats(stats, points_spent, &points_left); rolled_stats = FALSE; } else if (cmd->command == CMD_FINALIZE_OPTIONS) { /* Reset score options from cheat options */ for (i = OPT_CHEAT; i < OPT_CHEAT + N_OPTS_CHEAT; i++) { op_ptr->opt[OPT_SCORE + (i - OPT_CHEAT)] = op_ptr->opt[i]; } } else if (cmd->command == CMD_BUY_STAT) { /* .choice is the stat to buy */ if (!rolled_stats) buy_stat(cmd->arg[0].choice, stats, points_spent, &points_left); } else if (cmd->command == CMD_SELL_STAT) { /* .choice is the stat to sell */ if (!rolled_stats) sell_stat(cmd->arg[0].choice, stats, points_spent, &points_left); } else if (cmd->command == CMD_RESET_STATS) { /* .choice is whether to regen stats */ reset_stats(stats, points_spent, &points_left); if (cmd->arg[0].choice) generate_stats(stats, points_spent, &points_left); rolled_stats = FALSE; } else if (cmd->command == CMD_ROLL_STATS) { int i; save_roller_data(&prev); /* Get a new character */ get_stats(stats); /* Update stats with bonuses, etc. */ get_bonuses(); /* There's no real need to do this here, but it's tradition. */ get_ahw(p_ptr); p_ptr->history = get_history(p_ptr->race->history, &p_ptr->sc); p_ptr->sc_birth = p_ptr->sc; event_signal(EVENT_GOLD); event_signal(EVENT_AC); event_signal(EVENT_HP); event_signal(EVENT_STATS); /* Give the UI some dummy info about the points situation. */ points_left = 0; for (i = 0; i < A_MAX; i++) { points_spent[i] = 0; } event_signal_birthpoints(points_spent, points_left); /* Lock out buying and selling of stats based on rolled stats. */ rolled_stats = TRUE; } else if (cmd->command == CMD_PREV_STATS) { /* Only switch to the stored "previous" character if we've actually got one to load. */ if (prev.age) { load_roller_data(&prev, &prev); get_bonuses(); } event_signal(EVENT_GOLD); event_signal(EVENT_AC); event_signal(EVENT_HP); event_signal(EVENT_STATS); } else if (cmd->command == CMD_NAME_CHOICE) { /* Set player name */ my_strcpy(op_ptr->full_name, cmd->arg[0].string, sizeof(op_ptr->full_name)); string_free((void *) cmd->arg[0].string); /* Don't change savefile name. If the UI wants it changed, they can do it. XXX (Good idea?) */ process_player_name(FALSE); } /* Various not-specific-to-birth commands. */ else if (cmd->command == CMD_HELP) { char buf[80]; strnfmt(buf, sizeof(buf), "birth.txt"); screen_save(); show_file(buf, NULL, 0, 0); screen_load(); } else if (cmd->command == CMD_QUIT) { quit(NULL); } } roll_hp(); squelch_birth_init(); /* Clear old messages, add new starting message */ history_clear(); history_add("Began the quest to destroy Morgoth.", HISTORY_PLAYER_BIRTH, 0); /* Reset message prompt (i.e. no extraneous -more-s) */ msg_flag = TRUE; /* Note player birth in the message recall */ message_add(" ", MSG_GENERIC); message_add(" ", MSG_GENERIC); message_add("====================", MSG_GENERIC); message_add(" ", MSG_GENERIC); message_add(" ", MSG_GENERIC); /* Give the player some money */ get_money(); /* Outfit the player, if they can sell the stuff */ if (!OPT(birth_no_selling)) player_outfit(p_ptr); /* Initialise the stores */ store_reset(); /* Now we're really done.. */ event_signal(EVENT_LEAVE_BIRTH); } angband-v3.3.2/src/main-xxx.c0000644000175000017500000005142011651552410015315 0ustar chriscchrisc/* * File: main-xxx.c * Purpose: Outline how to make a new "main-xxx" file. * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" /* * This file helps Angband work on non-existant computers. * * To use this file, use "Makefile.xxx", which defines USE_XXX. * * * This file is intended to show one way to build a "visual module" * for Angband to allow it to work with a new system. It does not * actually work, but if the code near "XXX XXX XXX" comments were * replaced with functional code, then it probably would. * * See "z-term.c" for info on the concept of the "generic terminal", * and for more comments about what this file must supply. * * There are two basic ways to port Angband to a new system. The * first involves modifying the "main-gcu.c" and/or "main-x11.c" * files to support some version of "curses" and/or "X11" on your * machine, and to compile with the "USE_GCU" and/or "USE_X11" * compilation flags defined. The second involves creating a * new "main-xxx.c" file, based on this sample file (or on any * existing "main-xxx.c" file), and comes in two flavors, based * on whether it contains a "main()" function (as in "main-mac.c" * and "main-win.c") or not (as in "main-gcu.c" or "main-x11.c"). * * If the "main-xxx.c" file includes its own "main()" function, * then you should NOT link in the "main.c" file, and your "main()" * function must process any command line arguments, initialize the * "visual system", and call "play_game()" with appropriate arguments. * * If the "main-xxx.c" file does not include its own "main()" * function, then you must add some code to "main.c" which, if * the appropriate "USE_XXX" compilation flag is defined, will * attempt to call the "init_xxx()" function in the "main-xxx.c" * file, which should initialize the "visual system" and return * zero if it was successful. The "main()" function in "main.c" * will take care of processing command line arguments and then * calling "play_game()" with appropriate arguments. * * Note that the "util.c" file often contains functions which must * be modified in small ways for various platforms, even if you are * able to use the existing "main-gcu.c" and/or "main-x11.c" files, * in particular, the "file handling" functions may not work on all * systems. * * When you complete a port to a new system, you should email any * newly created files, and any changes made to existing files, * including "h-config.h", "config.h", and any of the "Makefile" * files, to "rr9@thangorodrim.net" for inclusion in the next version. * * Always choose a "three letter" naming scheme for "main-xxx.c" * and "Makefile.xxx" and such for consistency and simplicity. * * * Initial framework (and all code) by Ben Harrison (benh@phial.com). */ #ifdef USE_XXX #include "main.h" /* * Extra data to associate with each "window" * * Each "window" is represented by a "term_data" structure, which * contains a "term" structure, which contains a pointer (t->data) * back to the term_data structure. */ typedef struct term_data term_data; struct term_data { term t; /* Other fields if needed XXX XXX XXX */ }; /* * Number of "term_data" structures to support XXX XXX XXX * * You MUST support at least one "term_data" structure, and the * game will currently use up to eight "term_data" structures if * they are available. * * Actually, MAX_TERM_DATA is now defined as eight in 'defines.h'. * * If only one "term_data" structure is supported, then a lot of * the things that would normally go into a "term_data" structure * could be made into global variables instead. */ #define MAX_XXX_TERM 1 /* * An array of "term_data" structures, one for each "sub-window" */ static term_data data[MAX_XXX_TERM]; #if 0 /* * Often, it is helpful to create an array of "color data" containing * a representation of the "angband_color_table" array in some "local" form. * * Often, the "Term_xtra(TERM_XTRA_REACT, 0)" hook is used to initialize * "color_data" from "angband_color_table". XXX XXX XXX */ static local_color_data_type color_data[MAX_COLORS]; #endif /*** Function hooks needed by "Term" ***/ /* * Init a new "term" * * This function should do whatever is necessary to prepare a new "term" * for use by the "z-term.c" package. This may include clearing the window, * preparing the cursor, setting the font/colors, etc. Usually, this * function does nothing, and the "init_xxx()" function does it all. */ static void Term_init_xxx(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Nuke an old "term" * * This function is called when an old "term" is no longer needed. It should * do whatever is needed to clean up before the program exits, such as wiping * the screen, restoring the cursor, fixing the font, etc. Often this function * does nothing and lets the operating system clean up when the program quits. */ static void Term_nuke_xxx(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Do a "special thing" to the current "term" * * This function must react to a large number of possible arguments, each * corresponding to a different "action request" by the "z-term.c" package, * or by the application itself. * * The "action type" is specified by the first argument, which must be a * constant of the form "TERM_XTRA_*" as given in "z-term.h", and the second * argument specifies the "information" for that argument, if any, and will * vary according to the first argument. * * In general, this function should return zero if the action is successfully * handled, and non-zero if the action is unknown or incorrectly handled. */ static errr Term_xtra_xxx(int n, int v) { term_data *td = (term_data*)(Term->data); /* Analyze */ switch (n) { case TERM_XTRA_EVENT: { /* * Process some pending events XXX XXX XXX * * Wait for at least one event if "v" is non-zero * otherwise, if no events are ready, return at once. * When "keypress" events are encountered, the "ascii" * value corresponding to the key should be sent to the * "Term_keypress()" function. Certain "bizarre" keys, * such as function keys or arrow keys, may send special * sequences of characters, such as control-underscore, * plus letters corresponding to modifier keys, plus an * underscore, plus carriage return, which can be used by * the main program for "macro" triggers. This action * should handle as many events as is efficiently possible * but is only required to handle a single event, and then * only if one is ready or "v" is true. * * This action is required. */ return (0); } case TERM_XTRA_FLUSH: { /* * Flush all pending events XXX XXX XXX * * This action should handle all events waiting on the * queue, optionally discarding all "keypress" events, * since they will be discarded anyway in "z-term.c". * * This action is required, but may not be "essential". */ return (0); } case TERM_XTRA_CLEAR: { /* * Clear the entire window XXX XXX XXX * * This action should clear the entire window, and redraw * any "borders" or other "graphic" aspects of the window. * * This action is required. */ return (0); } case TERM_XTRA_SHAPE: { /* * Set the cursor visibility XXX XXX XXX * * This action should change the visibility of the cursor, * if possible, to the requested value (0=off, 1=on) * * This action is optional, but can improve both the * efficiency (and attractiveness) of the program. */ return (0); } case TERM_XTRA_FROSH: { /* * Flush a row of output XXX XXX XXX * * This action should make sure that row "v" of the "output" * to the window will actually appear on the window. * * This action is optional, assuming that "Term_text_xxx()" * (and similar functions) draw directly to the screen, or * that the "TERM_XTRA_FRESH" entry below takes care of any * necessary flushing issues. */ return (0); } case TERM_XTRA_FRESH: { /* * Flush output XXX XXX XXX * * This action should make sure that all "output" to the * window will actually appear on the window. * * This action is optional, assuming that "Term_text_xxx()" * (and similar functions) draw directly to the screen, or * that the "TERM_XTRA_FROSH" entry above takes care of any * necessary flushing issues. */ return (0); } case TERM_XTRA_NOISE: { /* * Make a noise XXX XXX XXX * * This action should produce a "beep" noise. * * This action is optional, but convenient. */ return (0); } case TERM_XTRA_BORED: { /* * Handle random events when bored XXX XXX XXX * * This action is optional, and normally not important */ return (0); } case TERM_XTRA_REACT: { /* * React to global changes XXX XXX XXX * * For example, this action can be used to react to * changes in the global "angband_color_table[MAX_COLORS][4]" array. * * This action is optional, but can be very useful for * handling "color changes" and the "arg_sound" and/or * "arg_graphics" options. */ return (0); } case TERM_XTRA_ALIVE: { /* * Change the "hard" level XXX XXX XXX * * This action is used if the program changes "aliveness" * by being either "suspended" (v=0) or "resumed" (v=1) * This action is optional, unless the computer uses the * same "physical screen" for multiple programs, in which * case this action should clean up to let other programs * use the screen, or resume from such a cleaned up state. * * This action is currently only used by "main-gcu.c", * on UNIX machines, to allow proper "suspending". */ return (0); } case TERM_XTRA_LEVEL: { /* * Change the "soft" level XXX XXX XXX * * This action is used when the term window changes "activation" * either by becoming "inactive" (v=0) or "active" (v=1) * * This action can be used to do things like activate the proper * font / drawing mode for the newly active term window. This * action should NOT change which window has the "focus", which * window is "raised", or anything like that. * * This action is optional if all the other things which depend * on what term is active handle activation themself, or if only * one "term_data" structure is supported by this file. */ return (0); } case TERM_XTRA_DELAY: { /* * Delay for some milliseconds XXX XXX XXX * * This action is useful for proper "timing" of certain * visual effects, such as breath attacks. * * This action is optional, but may be required by this file, * especially if special "macro sequences" must be supported. */ return (0); } } /* Unknown or Unhandled action */ return (1); } /* * Display the cursor * * This routine should display the cursor at the given location * (x,y) in some manner. On some machines this involves actually * moving the physical cursor, on others it involves drawing a fake * cursor in some form of graphics mode. Note the "soft_cursor" * flag which tells "z-term.c" to treat the "cursor" as a "visual" * thing and not as a "hardware" cursor. * * You may assume "valid" input if the window is properly sized. * * You may use the "Term_what(x, y, &a, &c)" function, if needed, * to determine what attr/char should be "under" the new cursor, * for "inverting" purposes or whatever. */ static errr Term_curs_xxx(int x, int y) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /* * Erase some characters * * This function should erase "n" characters starting at (x,y). * * You may assume "valid" input if the window is properly sized. */ static errr Term_wipe_xxx(int x, int y, int n) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /* * Given a position in the ISO Latin-1 character set, return * the correct character on this system. */ static byte Term_xchar_xxx(byte c) { /* The xxx port uses the Latin-1 standard */ return (c); } /* * Draw some text on the screen * * This function should actually display an array of characters * starting at the given location, using the given "attribute", * and using the given string of characters, which contains * exactly "n" characters and which is NOT null-terminated. * * You may assume "valid" input if the window is properly sized. * * You must be sure that the string, when written, erases anything * (including any visual cursor) that used to be where the text is * drawn. On many machines this happens automatically, on others, * you must first call "Term_wipe_xxx()" to clear the area. * * In color environments, you should activate the color contained * in "color_data[a & BASIC_COLORS]", if needed, before drawing anything. * * You may ignore the "attribute" if you are only supporting a * monochrome environment, since this routine is normally never * called to display "black" (invisible) text, including the * default "spaces", and all other colors should be drawn in * the "normal" color in a monochrome environment. * * Note that if you have changed the "attr_blank" to something * which is not black, then this function must be able to draw * the resulting "blank" correctly. * * Note that this function must correctly handle "black" text if * the "always_text" flag is set, if this flag is not set, all the * "black" text will be handled by the "Term_wipe_xxx()" hook. */ static errr Term_text_xxx(int x, int y, int n, byte a, const char *cp) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /* * Draw some attr/char pairs on the screen * * This routine should display the given "n" attr/char pairs at * the given location (x,y). This function is only used if one * of the flags "always_pict" or "higher_pict" is defined. * * You must be sure that the attr/char pairs, when displayed, will * erase anything (including any visual cursor) that used to be at * the given location. On many machines this is automatic, but on * others, you must first call "Term_wipe_xxx(x, y, 1)". * * With the "higher_pict" flag, this function can be used to allow * the display of "pseudo-graphic" pictures, for example, by using * the attr/char pair as an encoded index into a pixmap of special * "pictures". * * With the "always_pict" flag, this function can be used to force * every attr/char pair to be drawn by this function, which can be * very useful if this file can optimize its own display calls. * * This function is often associated with the "arg_graphics" flag. * * This function is only used if one of the "higher_pict" and/or * "always_pict" flags are set. */ static errr Term_pict_xxx(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /*** Internal Functions ***/ /* * Instantiate a "term_data" structure * * This is one way to prepare the "term_data" structures and to * "link" the various informational pieces together. * * This function assumes that every window should be 80x24 in size * (the standard size) and should be able to queue 256 characters. * Technically, only the "main screen window" needs to queue any * characters, but this method is simple. One way to allow some * variation is to add fields to the "term_data" structure listing * parameters for that window, initialize them in the "init_xxx()" * function, and then use them in the code below. * * Note that "activation" calls the "Term_init_xxx()" hook for * the "term" structure, if needed. */ static void term_data_link(int i) { term_data *td = &data[i]; term *t = &td->t; /* Initialize the term */ term_init(t, 80, 24, 256); /* Choose "soft" or "hard" cursor XXX XXX XXX */ /* A "soft" cursor must be explicitly "drawn" by the program */ /* while a "hard" cursor has some "physical" existance and is */ /* moved whenever text is drawn on the screen. See "z-term.c". */ /* t->soft_cursor = TRUE; */ /* Avoid the "corner" of the window XXX XXX XXX */ /* t->icky_corner = TRUE; */ /* Use "Term_pict()" for all attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ /* t->always_pict = TRUE; */ /* Use "Term_pict()" for some attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ /* t->higher_pict = TRUE; */ /* Use "Term_text()" even for "black" text XXX XXX XXX */ /* See the "Term_text_xxx()" function above. */ /* t->always_text = TRUE; */ /* Ignore the "TERM_XTRA_BORED" action XXX XXX XXX */ /* This may make things slightly more efficient. */ /* t->never_bored = TRUE; */ /* Ignore the "TERM_XTRA_FROSH" action XXX XXX XXX */ /* This may make things slightly more efficient. */ /* t->never_frosh = TRUE; */ /* Erase with "white space" XXX XXX XXX */ /* t->attr_blank = TERM_WHITE; */ /* t->char_blank = ' '; */ /* Prepare the init/nuke hooks */ t->init_hook = Term_init_xxx; t->nuke_hook = Term_nuke_xxx; /* Prepare the template hooks */ t->xtra_hook = Term_xtra_xxx; t->curs_hook = Term_curs_xxx; t->wipe_hook = Term_wipe_xxx; t->text_hook = Term_text_xxx; t->pict_hook = Term_pict_xxx; t->xchar_hook = Term_xchar_xxx; /* Remember where we came from */ t->data = td; /* Activate it */ Term_activate(t); /* Global pointer */ angband_term[i] = t; } /* * Help message. * 1st line = max 68 chars. * Start next lines with 11 spaces */ const char help_xxx[] = "Describe XXX, subopts -describe suboptions here"; /* * Initialization function */ errr init_xxx(int argc, char **argv) { int i; /* Initialize globals XXX XXX XXX */ /* Initialize "term_data" structures XXX XXX XXX */ /* Initialize the "color_data" array XXX XXX XXX */ /* Create windows (backwards!) */ for (i = MAX_XXX_TERM; i-- > 0; ) { /* Link */ term_data_link(i); } /* Success */ return (0); } #ifdef INTERNAL_MAIN /* * Some special machines need their own "main()" function, which they * can provide here, making sure NOT to compile the "main.c" file. * * These systems usually have some form of "event loop", run forever * as the last step of "main()", which handles things like menus and * window movement, and calls "play_game(FALSE)" to load a game after * initializing "savefile" to a filename, or "play_game(TRUE)" to make * a new game. The event loop would also be triggered by "Term_xtra()" * (the TERM_XTRA_EVENT action), in which case the event loop would not * actually "loop", but would run once and return. */ /* * An event handler XXX XXX XXX * * You may need an event handler, which can be used by both * by the "TERM_XTRA_BORED" and "TERM_XTRA_EVENT" entries in * the "Term_xtra_xxx()" function, and also to wait for the * user to perform whatever user-interface operation is needed * to request the start of a new game or the loading of an old * game, both of which should launch the "play_game()" function. */ static bool CheckEvents(bool wait) { /* XXX XXX XXX */ return (0); } /* * Make a sound. * * This action should produce sound number "v", where the * "name" of that sound is "sound_names[v]". * * This action is optional, and not very important. */ static void xxx_sound(int v) { return; } /* * Init some stuff * * This function is used to keep the "path" variable off the stack. */ static void init_stuff(void) { char path[1024]; /* Prepare the path XXX XXX XXX */ /* This must in some way prepare the "path" variable */ /* so that it points at the "lib" directory. Every */ /* machine handles this in a different way... */ my_strcpy(path, "XXX XXX XXX", sizeof(path)); /* Prepare the filepaths */ init_file_paths(path, path, path); /* Set up sound hook */ sound_hook = xxx_sound; } /* * Main function * * This function must do a lot of stuff. */ int main(int argc, char *argv[]) { /* Initialize the machine itself XXX XXX XXX */ /* Process command line arguments XXX XXX XXX */ /* Initialize the windows */ if (init_xxx(argc, argv) != 0) quit("Oops!"); /* XXX XXX XXX */ ANGBAND_SYS = "xxx"; /* Initialize some stuff */ init_stuff(); /* Initialize */ init_angband(); /* Allow auto-startup XXX XXX XXX */ /* Event loop forever XXX XXX XXX */ while (TRUE) CheckEvents(TRUE); } #endif /* INTERNAL_MAIN */ #endif /* USE_XXX */ angband-v3.3.2/src/angband.h0000644000175000017500000000417011651552410015143 0ustar chriscchrisc/* File: angband.h */ /* * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_ANGBAND_H #define INCLUDED_ANGBAND_H /* * Include the low-level includes. */ #include "h-basic.h" /* * Include the mid-level includes. */ #include "z-bitflag.h" #include "z-file.h" #include "z-form.h" #include "z-util.h" #include "z-virt.h" #include "z-rand.h" #include "z-term.h" #include "z-quark.h" #include "z-msg.h" /* * Include the high-level includes. */ #include "config.h" #include "defines.h" #include "option.h" #include "types.h" #include "game-cmd.h" #include "object/obj-flag.h" #include "object/object.h" #include "monster/constants.h" #include "monster/monster.h" #include "player/types.h" #include "player/player.h" #include "store.h" #include "x-char.h" #include "ui.h" #include "z-type.h" #include "externs.h" /***** Some older copyright messages follow below *****/ /* * Note that these copyright messages apply to an ancient version * of Angband, as in, from pre-2.4.frog-knows days, and thus the * references to version numbers may be rather misleading... */ /* * UNIX ANGBAND Version 5.0 */ /* Original copyright message follows. */ /* * ANGBAND Version 4.8 COPYRIGHT (c) Robert Alan Koeneke * * I lovingly dedicate this game to hackers and adventurers * everywhere... * * Designer and Programmer: * Robert Alan Koeneke * University of Oklahoma * * Assistant Programmer: * Jimmey Wayne Todd * University of Oklahoma * * Assistant Programmer: * Gary D. McAdoo * University of Oklahoma * * UNIX Port: * James E. Wilson * UC Berkeley * wilson@ernie.Berkeley.EDU * ucbvax!ucbernie!wilson */ /* * ANGBAND may be copied and modified freely as long as the above * credits are retained. No one who-so-ever may sell or market * this software in any form without the expressed written consent * of the author Robert Alan Koeneke. */ #endif angband-v3.3.2/src/Makefile.inc0000644000175000017500000020303011651552410015604 0ustar chriscchrisc# # File: Makefile.inc # # Includes Makefile.src and contains dependency info # include Makefile.src BASEOBJS := $(ANGFILES) $(ZFILES) depgen: head -n 19 Makefile.inc > Makefile.new @for i in $(BASEOBJS:.o=.c); do \ DIR=`echo ./$$i | sed 's|/[^/]*$$||'`; \ gcc -MM -I. $$i | \ sed "s|^\\([^ ]\\)|$$DIR/\\1|" >> Makefile.new; \ done; # Dependencies ./attack.o: attack.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h attack.h cave.h cmds.h object/slays.h \ object/list-slays.h object/tvalsval.h target.h ./birth.o: birth.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cmds.h files.h game-event.h history.h object/inventory.h \ object/tvalsval.h squelch.h ui-menu.h ./button.o: button.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h button.h ./cave.o: cave.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h game-event.h object/tvalsval.h squelch.h ./cmd0.o: cmd0.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h cmds.h files.h keymap.h ui-menu.h wizard.h ./cmd1.o: cmd1.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h attack.h cave.h cmds.h game-event.h generate.h history.h \ object/inventory.h object/tvalsval.h squelch.h trap.h ./cmd2.o: cmd2.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h attack.h cave.h cmds.h files.h game-event.h generate.h \ object/tvalsval.h squelch.h trap.h ./cmd3.o: cmd3.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h button.h cave.h cmds.h object/inventory.h \ object/tvalsval.h squelch.h ui-menu.h target.h ./cmd4.o: cmd4.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h buildid.h cave.h cmds.h files.h history.h \ object/tvalsval.h prefs.h squelch.h ui-menu.h ./cmd-misc.o: cmd-misc.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h cmds.h wizard.h ./cmd-obj.o: cmd-obj.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h cmds.h effects.h list-effects.h \ object/inventory.h object/tvalsval.h target.h ./death.o: death.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cmds.h files.h history.h savefile.h ui-menu.h wizard.h ./debug.o: debug.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h debug.h ./dungeon.o: dungeon.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h button.h cave.h cmds.h files.h game-event.h generate.h \ init.h monster/mon-spell.h angband.h monster/list-spell-effects.h \ object/tvalsval.h prefs.h savefile.h target.h ./effects.o: effects.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h effects.h list-effects.h monster/mon-spell.h \ angband.h monster/list-spell-effects.h ./files.o: files.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h buildid.h cave.h cmds.h history.h object/tvalsval.h \ object/pval.h angband.h savefile.h ui-menu.h ./game-cmd.o: game-cmd.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cmds.h target.h ./game-event.o: game-event.c z-virt.h h-basic.h game-event.h ./generate.o: generate.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h files.h generate.h monster/mon-spell.h angband.h \ monster/list-spell-effects.h object/tvalsval.h trap.h z-queue.h ./guid.o: guid.c guid.h ./history.o: history.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h history.h ./init2.o: init2.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h buildid.h button.h cave.h cmds.h game-event.h generate.h \ keymap.h init.h monster/mon-power.h monster/monster.h \ monster/mon-spell.h angband.h monster/list-spell-effects.h \ object/slays.h object/list-slays.h object/tvalsval.h prefs.h randname.h \ squelch.h object/list-object-flags.h list-effects.h \ monster/list-mon-flags.h monster/list-mon-spells.h \ monster/list-blow-methods.h monster/list-blow-effects.h ./keymap.o: keymap.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h keymap.h ./load.o: load.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h history.h monster/mon-spell.h angband.h \ monster/list-spell-effects.h object/tvalsval.h savefile.h squelch.h ./monster/melee1.o: monster/melee1.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h monster/monster.h \ object/tvalsval.h spells.h ./monster/melee2.o: monster/melee2.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h monster/mon-spell.h \ monster/list-spell-effects.h object/slays.h object/list-slays.h \ object/tvalsval.h spells.h squelch.h ./monster/monster1.o: monster/monster1.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h monster/mon-spell.h \ monster/list-spell-effects.h object/tvalsval.h ./monster/monster2.o: monster/monster2.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h generate.h history.h \ monster/mon-spell.h monster/list-spell-effects.h object/tvalsval.h \ target.h z-term.h ./monster/mon-power.o: monster/mon-power.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h monster/mon-power.h monster/monster.h \ monster/mon-spell.h monster/list-spell-effects.h ./monster/mon-spell.o: monster/mon-spell.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h spells.h effects.h list-effects.h \ monster/mon-spell.h monster/list-spell-effects.h \ monster/list-mon-spells.h monster/list-spell-effects.h ./object/identify.o: object/identify.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h game-event.h history.h object/slays.h \ object/list-slays.h object/tvalsval.h object/pval.h spells.h squelch.h ./object/obj-desc.o: object/obj-desc.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h squelch.h object/tvalsval.h \ object/pval.h ./object/obj-flag.o: object/obj-flag.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/list-object-flags.h ./object/obj-info.o: object/obj-info.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h effects.h list-effects.h \ cmds.h object/tvalsval.h object/slays.h object/list-slays.h \ object/pval.h ./object/obj-make.o: object/obj-make.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/tvalsval.h object/pval.h ./object/obj-power.o: object/obj-power.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/slays.h object/list-slays.h \ object/tvalsval.h object/pval.h init.h effects.h list-effects.h \ monster/mon-power.h monster/monster.h ./object/obj-ui.o: object/obj-ui.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h button.h object/tvalsval.h cmds.h ./object/obj-util.o: object/obj-util.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h effects.h list-effects.h generate.h \ history.h object/inventory.h prefs.h spells.h squelch.h randname.h \ object/tvalsval.h z-queue.h ./object/pval.o: object/pval.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h z-type.h object/list-object-flags.h object/object.h \ monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/pval.h object/tvalsval.h ./object/randart.o: object/randart.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h \ z-bitflag.h game-cmd.h cave.h z-type.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/slays.h object/list-slays.h \ object/tvalsval.h object/pval.h init.h effects.h list-effects.h \ randname.h ./object/slays.o: object/slays.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h z-type.h object/list-object-flags.h object/object.h \ monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/slays.h object/list-slays.h \ object/list-slays.h ./option.o: option.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h ./parser.o: parser.c parser.h h-basic.h z-rand.h defines.h \ list-player-flags.h z-util.h z-virt.h ./randname.o: randname.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h randname.h ./pathfind.o: pathfind.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h squelch.h ./prefs.o: prefs.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h keymap.h prefs.h squelch.h ./player/calcs.o: player/calcs.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h z-type.h object/list-object-flags.h object/object.h \ monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h files.h game-event.h \ object/tvalsval.h object/pval.h spells.h squelch.h ./player/class.o: player/class.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h list-player-flags.h \ h-basic.h z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h \ cave.h types.h z-term.h ui-event.h z-type.h player/types.h \ object/obj-flag.h z-file.h z-textblock.h z-file.h z-quark.h game-cmd.h \ object/list-object-flags.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h object/object.h player/types.h store.h \ object/obj-flag.h parser.h z-rand.h x-char.h z-msg.h spells.h \ list-gf-types.h player/player.h guid.h ./player/player.o: player/player.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h list-player-flags.h \ h-basic.h z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h \ cave.h types.h z-term.h ui-event.h z-type.h player/types.h \ object/obj-flag.h z-file.h z-textblock.h z-file.h z-quark.h game-cmd.h \ object/list-object-flags.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h object/object.h player/types.h store.h \ object/obj-flag.h parser.h z-rand.h x-char.h z-msg.h spells.h \ list-gf-types.h history.h player/player.h guid.h ./player/race.o: player/race.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h list-player-flags.h \ h-basic.h z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h \ cave.h types.h z-term.h ui-event.h z-type.h player/types.h \ object/obj-flag.h z-file.h z-textblock.h z-file.h z-quark.h game-cmd.h \ object/list-object-flags.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h object/object.h player/types.h store.h \ object/obj-flag.h parser.h z-rand.h x-char.h z-msg.h spells.h \ list-gf-types.h player/player.h guid.h ./player/spell.o: player/spell.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h z-type.h object/list-object-flags.h object/object.h \ monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/tvalsval.h spells.h ./player/timed.o: player/timed.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h z-type.h object/list-object-flags.h object/object.h \ monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./player/util.o: player/util.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h z-type.h object/list-object-flags.h object/object.h \ monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/tvalsval.h ./score.o: score.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h buildid.h ./signals.o: signals.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h files.h savefile.h ./save.o: save.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h history.h savefile.h squelch.h ./savefile.o: savefile.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h savefile.h ./spells1.o: spells1.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h generate.h object/tvalsval.h monster/mon-spell.h \ angband.h monster/list-spell-effects.h squelch.h trap.h ./spells2.o: spells2.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h generate.h history.h object/slays.h \ object/list-slays.h object/tvalsval.h squelch.h target.h trap.h ./squelch.o: squelch.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cmds.h ui-menu.h object/tvalsval.h object/pval.h \ angband.h squelch.h ./store.o: store.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h cmds.h game-event.h history.h init.h \ object/inventory.h object/tvalsval.h squelch.h target.h textui.h \ ui-menu.h z-debug.h ./tables.o: tables.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h object/tvalsval.h ./target.o: target.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h squelch.h ./trap.o: trap.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h attack.h cave.h ./ui.o: ui.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h defines.h \ list-player-flags.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h config.h option.h types.h game-cmd.h object/obj-flag.h \ z-rand.h z-file.h z-textblock.h z-file.h defines.h z-quark.h z-bitflag.h \ game-cmd.h cave.h types.h z-type.h h-basic.h object/list-object-flags.h \ object/object.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h player/types.h object/obj-flag.h object/object.h \ option.h ui-event.h monster/list-mon-spells.h player/types.h \ player/player.h guid.h store.h parser.h x-char.h ui.h z-textblock.h \ z-type.h externs.h spells.h list-gf-types.h ./ui-birth.o: ui-birth.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h button.h cmds.h files.h game-event.h object/tvalsval.h \ ui-birth.h ui-menu.h ./ui-event.o: ui-event.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h ./ui-knowledge.o: ui-knowledge.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h \ defines.h z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h \ h-basic.h object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h history.h object/tvalsval.h squelch.h ui-menu.h ./ui-menu.o: ui-menu.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h ui-menu.h ./ui-options.o: ui-options.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h \ defines.h z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h \ h-basic.h object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cmds.h keymap.h squelch.h prefs.h object/tvalsval.h \ ui-menu.h files.h ./ui-spell.o: ui-spell.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h object/tvalsval.h ui-menu.h ./util.o: util.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h button.h cmds.h game-event.h randname.h ./variable.o: variable.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h buildid.h ./wiz-spoil.o: wiz-spoil.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h \ defines.h z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h \ h-basic.h object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h buildid.h cmds.h object/tvalsval.h ui-menu.h wizard.h ./wiz-stats.o: wiz-stats.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h list-player-flags.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h config.h option.h types.h \ game-cmd.h object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h \ defines.h z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h \ h-basic.h object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h cmds.h wizard.h object/tvalsval.h effects.h \ list-effects.h generate.h ./wizard.o: wizard.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h cmds.h files.h object/tvalsval.h ui-menu.h \ target.h wizard.h ./x-char.o: x-char.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h ./x-spell.o: x-spell.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cave.h effects.h list-effects.h object/tvalsval.h ./xtra2.o: xtra2.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h cmds.h keymap.h history.h object/tvalsval.h target.h ./xtra3.o: xtra3.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h buildid.h button.h cave.h files.h game-event.h \ object/tvalsval.h textui.h ui-birth.h ./buildid.o: buildid.c buildid.h ./z-bitflag.o: z-bitflag.c z-bitflag.h h-basic.h z-form.h z-virt.h \ defines.h list-player-flags.h ./z-file.o: z-file.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h ./z-form.o: z-form.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h ./z-msg.o: z-msg.c z-virt.h h-basic.h z-term.h ui-event.h z-msg.h ./z-quark.o: z-quark.c z-virt.h h-basic.h z-quark.h ./z-queue.o: z-queue.c z-queue.h ./z-rand.o: z-rand.c z-rand.h h-basic.h defines.h list-player-flags.h ./z-term.o: z-term.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h list-player-flags.h z-file.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h config.h option.h types.h game-cmd.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h types.h z-type.h h-basic.h \ object/list-object-flags.h object/object.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ player/types.h object/obj-flag.h object/object.h option.h ui-event.h \ monster/list-mon-spells.h player/types.h player/player.h guid.h store.h \ parser.h x-char.h ui.h z-textblock.h z-type.h externs.h spells.h \ list-gf-types.h ./z-type.o: z-type.c h-basic.h z-form.h z-term.h ui-event.h ui.h \ z-textblock.h z-file.h defines.h list-player-flags.h z-type.h ./z-util.o: z-util.c z-util.h h-basic.h ./z-virt.o: z-virt.c z-virt.h h-basic.h z-util.h ./z-textblock.o: z-textblock.c z-term.h h-basic.h ui-event.h z-textblock.h \ z-file.h defines.h list-player-flags.h z-virt.h z-form.h angband-v3.3.2/src/Makefile.osx0000644000175000017500000001402311651552410015646 0ustar chriscchrisc# File: Makefile.osx # This is a (rather crude) Makefile for Mac OS X Carbon port of Angband. # # Based on Makefile.std, made separate because this port does not uses # main.c. # default target all: install # settings CC = gcc LD = ld OPT ?= -O2 NAME = Angband APPNAME = $(NAME).app EXE = angband ARCH = -arch i386 -arch ppc WARNINGS = -W -Wall -Wno-unused-parameter -Wno-missing-field-initializers JUST_C = -std=c99 -Wdeclaration-after-statement OBJ_CFLAGS = -std=c99 -x objective-c -mmacosx-version-min=10.4 CFLAGS = -I. $(WARNINGS) $(OPT) -DMACH_O_CARBON -DHAVE_MKSTEMP \ -DPRIVATE_USER_PATH=\"~/Library/Preferences\" -DUSE_PRIVATE_PATHS \ -fno-stack-protector $(ARCH) LIBS = -framework CoreFoundation -framework QuickTime -framework Carbon \ -framework Cocoa # Import user prefs # If you don't want to edit this file, put your module redefinitions # and build flags in "./config" -include config # # Provide a CFLAGS override so that older versions of OS X can continue to # compile their own builds. The default CFLAGS provide a backwards-compatible # binary, but will error when building on <10.3.9. # ppc: CFLAGS = \ -Wall -std=gnu99 $(OPT) -DMACH_O_CARBON -DHAVE_MKSTEMP \ -DPRIVATE_USER_PATH=\"~/Library/Preferences\" -DUSE_PRIVATE_PATHS ppc: OBJ_CFLAGS = -std=c99 -x objective-c -mmacosx-version-min=10.0 # -DALLOW_BORG is required for all .o files in a borg build ifneq (,$(findstring borg, $(MAKECMDGOALS))) CFLAGS += -DALLOW_BORG endif # Check for autoconf.h; do not warn on nonexistence autoconf= $(wildcard autoconf.h) ifneq ($(autoconf),) CFLAGS += -DHAVE_CONFIG_H endif # Note that Makefile.inc sets VERSION, and so we must run version.sh after # including Makefile.inc include Makefile.inc VERSION := $(shell ../scripts/version.sh) CFLAGS += -DBUILD_ID=${VERSION} BOBJS = borg1.o borg2.o borg3.o borg4.o borg5.o borg6.o borg7.o borg8.o borg9.o OBJS = $(BASEOBJS) OSX_OBJS = main-crb.o # # Build the "Angband" program # $(EXE).o: $(OBJS) $(LD) -r -arch ppc -o $@.ppc $(OBJS) $(LD) -r -arch i386 -o $@.i386 $(OBJS) lipo -arch ppc $@.ppc -arch i386 $@.i386 -create -output angband.o $(EXE): $(EXE).o $(OSX_OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(EXE).o $(OSX_OBJS) $(LIBS) ppc: $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(OBJS) $(LIBS) borg: $(OBJS) $(BOBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(OBJS) $(BOBJS) $(LIBS) # # Clean up old junk # clean: -rm -f $(OBJS) $(EXE) $(EXE).o.ppc $(EXE).o.i386 $(EXE).o $(OSX_OBJS) # # Basic build rules and dependencies # main-crb.o : main-crb.c @printf "%10s %-20s (objective-c)\n" CC $< @$(CC) $(CFLAGS) $(OBJ_CFLAGS) -c -o $@ $< %.o : %.c @printf "%10s %-20s\n" CC $< @$(CC) $(JUST_C) $(CFLAGS) -c -o $@ $< main-crb.o: osx/osx_tables.h # # Installation. # Application bundle -- a directory looking like an ordinary application # # Bundle of the game (it must be a directory whose name ends in ".app") APPBNDL = ../$(APPNAME) # A bundle must have these subdirectories APPCONT = $(APPBNDL)/Contents APPBIN = $(APPCONT)/MacOS APPRES = $(APPCONT)/Resources # Auxiliary files. Please note that it still uses resouce fork based # resources for menus, dialogues and sounds, so that it isn't safe to use # utilities that doesn't understand them (virtually all Un*x commands) to # copy or archive the application. # # The graphics tiles have been moved out of the resource fork, but, again, # it isn't generally safe just to convert GIF or BMP files to PNG, because # the Mac OS takes dpi values stored in various images quite seriously. # Almost all tilesets for *band requires adjustment, with the sole exception # of 8x8.png for Vanilla. Make sure setting dpi to 72, *not* preserving # the actual size of image. When you have them ready, put them in # the lib/xtra/graf directory and rebuild. ICONFILES = osx/Angband.icns osx/Save.icns osx/Edit.icns osx/Data.icns PLIST = osx/Angband.xml GRAPHSRC=../lib/xtra/graf/ TILES = $(GRAPHSRC)8x8.png $(GRAPHSRC)8x16.png $(GRAPHSRC)16x16.png $(GRAPHSRC)32x32.png LIBFILES = \ ../lib/edit/*.txt \ ../lib/file/*.txt \ ../lib/help/*.txt \ ../lib/help/*.hlp \ ../lib/pref/*.prf \ install: $(EXE) $(ICONFILES) $(PLIST) $(LIBFILES) @echo making directories... @mkdir -p $(APPBNDL) @mkdir -p $(APPCONT) @mkdir -p $(APPBIN) @mkdir -p $(APPRES) @mkdir -p $(APPRES)/English.lproj/main.nib @mkdir -p $(APPRES)/lib/edit @mkdir -p $(APPRES)/lib/file @mkdir -p $(APPRES)/lib/help @mkdir -p $(APPRES)/lib/pref @mkdir -p $(APPRES)/lib/script @mkdir -p $(APPRES)/lib/xtra/graf @mkdir -p $(APPRES)/lib/xtra/sound @echo copying files... @cp ../lib/edit/*.txt $(APPRES)/lib/edit @cp ../lib/file/*.txt $(APPRES)/lib/file @cp ../lib/help/*.txt $(APPRES)/lib/help @cp ../lib/help/*.hlp $(APPRES)/lib/help @cp ../lib/pref/*.prf $(APPRES)/lib/pref # 'optionally' install sound and graphics tiles, if present -cp $(TILES) $(APPRES)/lib/xtra/graf -cp ../lib/xtra/sound/*.wav $(APPRES)/lib/xtra/sound -cp ../lib/xtra/sound/sound.cfg $(APPRES)/lib/xtra/sound install -m 755 $(EXE) $(APPBIN) install -m 644 $(ICONFILES) $(APPRES) cp osx/English.lproj/main.nib/*ib $(APPRES)/English.lproj/main.nib sed -e 's/\$$VERSION\$$/$(VERSION)/' -e 's/\$$COPYRIGHT\$$/$(COPYRIGHT)/' \ -e 's/\$$NAME\$$/$(NAME)/' -e 's/\$$EXECUTABLE\$$/$(EXE)/' \ $(PLIST) > $(APPCONT)/Info.plist SetFile -a B $(APPBNDL) vars: @echo LDFLAGS = $(LDFLAGS) @echo CFLAGS = $(CFLAGS) @echo BASEOBJS = $(BASEOBJS) PACKAGE_NAME = $(NAME)-$(VERSION) # In the unlikely event that tar+zip isn't enough... dist: install @rm -rf disttemp* mkdir -p disttemp/Docs cp ../changes.txt ../copying.txt ../faq.txt ../readme.txt disttemp/Docs cp -R -p "$(APPBNDL)" disttemp SetFile -a B disttemp/$(APPNAME) @-rm ../"$(PACKAGE_NAME)-osx.dmg" hdiutil create -quiet -fs HFS+ -volname $(PACKAGE_NAME) -srcfolder disttemp disttemp.dmg hdiutil convert disttemp.dmg -quiet -format UDZO -imagekey zlib-level=6 -o ../"$(PACKAGE_NAME)-osx.dmg" rm -rf disttemp* tests: $(MAKE) -C tests all CFLAGS="-I.. $(CFLAGS)" LDFLAGS="$(LIBS)" DEFAULT_CONFIG_PATH=../lib test-clean: $(MAKE) -C tests clean .PHONY : tests test-clean angband-v3.3.2/src/list-gf-types.h0000644000175000017500000001436211651552410016264 0ustar chriscchrisc/* * File: src/list-gf-types.h * Purpose: Spell types used by project() and related functions. * * Fields: * name - type index (GF_THIS) * desc - text description of attack if blind * resist - object flag for resistance * num - numerator for resistance * denom - denominator for resistance (random_value) * opp - timed flag for temporary resistance ("opposition") * immunity - object flag for total immunity * side_immune - whether immunity protects from *all* side-effects * vuln - object flag for vulnerability * mon_res - monster flag for resistance * mon_vuln - monster flag for vulnerability * obj_hates - object flag for object vulnerability * obj_imm - object flag for object immunity */ /* name desc resist num denom opp immunity side_im vuln mon_resist mon_vuln obj_hates obj_imm */ GF(ARROW, "something sharp", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MISSILE, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MANA, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(HOLY_ORB, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(LIGHT_WEAK, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, RF_HURT_LIGHT, 0, 0) GF(DARK_WEAK, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(WATER, "water", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, RF_IM_WATER,0, 0, 0) GF(PLASMA, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, RF_RES_PLAS,0, 0, 0) GF(METEOR, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(ICE, "something sharp", OF_RES_COLD, 1, RV(3,0,0,0), TMD_OPP_COLD, OF_IM_COLD, FALSE, OF_VULN_COLD, RF_IM_COLD, RF_HURT_COLD, OF_HATES_COLD, OF_IGNORE_COLD) GF(GRAVITY, "something strange",0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(INERTIA, "something strange",0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(FORCE, "something hard", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TIME, "something strange",0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(ACID, "acid", OF_RES_ACID, 1, RV(3,0,0,0), TMD_OPP_ACID, OF_IM_ACID, TRUE, OF_VULN_ACID, RF_IM_ACID, 0, OF_HATES_ACID, OF_IGNORE_ACID) GF(ELEC, "lightning", OF_RES_ELEC, 1, RV(3,0,0,0), TMD_OPP_ELEC, OF_IM_ELEC, TRUE, OF_VULN_ELEC, RF_IM_ELEC, 0, OF_HATES_ELEC, OF_IGNORE_ELEC) GF(FIRE, "fire", OF_RES_FIRE, 1, RV(3,0,0,0), TMD_OPP_FIRE, OF_IM_FIRE, TRUE, OF_VULN_FIRE, RF_IM_FIRE, RF_HURT_FIRE, OF_HATES_FIRE, OF_IGNORE_FIRE) GF(COLD, "cold", OF_RES_COLD, 1, RV(3,0,0,0), TMD_OPP_COLD, OF_IM_COLD, TRUE, OF_VULN_COLD, RF_IM_COLD, RF_HURT_COLD, OF_HATES_COLD, OF_IGNORE_COLD) GF(POIS, "poison", OF_RES_POIS, 1, RV(3,0,0,0), TMD_OPP_POIS, 0, TRUE, 0, RF_IM_POIS, 0, 0, 0) GF(LIGHT, "something", OF_RES_LIGHT, 4, RV(6,1,6,0), 0, 0, TRUE, 0, 0, RF_HURT_LIGHT, 0, 0) GF(DARK, "something", OF_RES_DARK, 4, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(CONFU, "something", OF_RES_CONFU, 6, RV(6,1,6,0), TMD_OPP_CONF, 0, TRUE, 0, 0, 0, 0, 0) GF(SOUND, "noise", OF_RES_SOUND, 5, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(SHARD, "something sharp", OF_RES_SHARD, 6, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(NEXUS, "something strange",OF_RES_NEXUS, 6, RV(6,1,6,0), 0, 0, TRUE, 0, RF_RES_NEXUS,0, 0, 0) GF(NETHER, "something cold", OF_RES_NETHR, 6, RV(6,1,6,0), 0, 0, TRUE, 0, RF_RES_NETH,0, 0, 0) GF(CHAOS, "something strange",OF_RES_CHAOS, 6, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISEN, "something strange",OF_RES_DISEN, 6, RV(6,1,6,0), 0, 0, TRUE, 0, RF_RES_DISE,0, 0, 0) GF(KILL_WALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(KILL_DOOR, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(KILL_TRAP, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAKE_WALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAKE_DOOR, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAKE_TRAP, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(AWAY_UNDEAD, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(AWAY_EVIL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(AWAY_ALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TURN_UNDEAD, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TURN_EVIL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TURN_ALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISP_UNDEAD, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISP_EVIL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISP_ALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_CLONE, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_POLY, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_HEAL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_SPEED, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_SLOW, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_CONF, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_SLEEP, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_DRAIN, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAX, NULL, 0, 0, RV(0,0,0,0), 0, 0, FALSE, 0, 0, 0, 0, 0) angband-v3.3.2/src/buildid.c0000644000175000017500000000016411651552410015157 0ustar chriscchrisc#include "buildid.h" const char *buildid = VERSION_NAME " " VERSION_STRING; const char *buildver = VERSION_STRING; angband-v3.3.2/src/main-sdl.c0000644000175000017500000025000711651552410015252 0ustar chriscchrisc/* * File: main-sdl.c * Purpose: Angband SDL port * * Copyright (c) 2007 Ben Harrison, Gregory Velichansky, Eric Stevens, * Leon Marrick, Iain McFall, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cmds.h" #include "files.h" /* * Comments and suggestions are welcome. The UI probably needs some * adjustment, and I need comments from you. * perhaps also something like "Angband 3.0.8 by Andrew Sidwell and others; * SDL port by Iain McFall an others, please see the accompanying documentation * for credits" or something */ /* * This file helps Angband work with at least some computers capable of running * SDL, a set of simple and quite popular game development libraries that work * on many different operating systems, including Windows, most flavours of * UNIX or similar, and Mac OS X. It requires a 32-bit (or higher) machine * capable of displaying at least 640x480 in 256 colors. A Pentium or better * is strongly recommended (for speed reasons treated more fully below). * * To use this file, use an appropriate "Makefile" or "Project File", install * the required libraries (described below), make sure that "USE_SDL" is * defined somewhere, and obtain various extra files (described below). If * you are new to all this, read "makefile.sdl". * * This port uses the following libraries: SDL (v1.2+) and SDL_ttf. * All are available as source code, pre-compiled libs for developers, * and libs (or dlls) for players from www.libsdl.org * * * Other files used by this port: * - The game must have a collection of bitmap .fon files in /lib/xtra/font. * * - If "USE_GRAPHICS" is defined, then it also needs some bitmapped (.bmp) * graphics files in /lib/xtra/graf, such as "16x16.bmp" and "16x16m.bmp". * * - The "lib/pref/pref-sdl.prf" file contains keymaps, macro definitions, * and/or color redefinitions. * - The "lib/pref/font-sdl.prf" contains attr/char mappings for use with the * normal "*.fon" font files in the "lib/xtra/font/" directory. * * * * "Term" framework by Ben Harrison (benh@phial.com). * * Original Sangband SDL port and the "intrface" module by Leon Marrick * (www.runegold.org/sangband). * * Additional helpful ideas by: * 2001 Gregory Velichansky , creator of the first Angband SDL * port. * 2006 Eric Stevens , main author of the TOME SDL port. */ /* * Comments on using SDL with Angband: * * The good news: * - SDL is cross-platform. Really. No joke. If this port doesn't work on * your system, it probably isn't SDL's fault. * - SDL is relatively easy to use, allowing you you to cobble up feature-rich * apps that look half-way decent without too much fuss and bother. It's * wonderful for prototyping. * - SDL does most of what *band developers are likely to need, plus a whole * lot more we haven't realized we want yet. * - SDL is a cleanly written open-source API; it is much less painful to get * the straight word then it is with most other libraries. Also, the SDL * community offers active discussion boards, solid documentation, and * numerous code examples relating to almost any question you might have * occasion to ask. * * The bad news: * - SDL can be tedious to install. Each individual library is straightforward * enough, but *band development work requires several, the number growing as * you get more sophisticated. * - SDL (as a stand-alone lib, without the assistance of OpenGL) can be very * sluggish if you aren't careful. It is poor at detecting, let alone making * fullest use of, available video hardware, which cripples speed. So, * getting half-way decent performance in a game like Angband takes some * skill and vast amounts of effort. Speed - the lack thereof - is this * port's biggest problem. More comments below. * - SDL is not a complete game development library (although the add-ons help * tremendously). Much-needed functionality - text output, blit stretching, * and video refresh synching being three examples - were either missing * altogether or covered by functions that proved too slow or delicate for * production use. I ended up having to spend at least as much time, and * write at least as much low-level code, as I did using the Win32 API. * - SDL, like Allegro but to a lesser extent, is falling behind current tech- * nology. Development progresses, but obsolescence looms, especially on * Windows machines. */ #ifdef USE_SDL #include "main.h" #include "SDL.h" #include "SDL_ttf.h" #include "SDL_image.h" /* SDL flags used for the main window surface */ static Uint32 vflags = SDL_ANYFORMAT; /* Current screen dimensions */ static int screen_w = 800; static int screen_h = 600; /* Fullscreen dimensions */ static int full_w; static int full_h; /* Want fullscreen? */ static bool fullscreen = FALSE; /* XXXXXXXXX */ static char *ANGBAND_DIR_USER_SDL; /* * Used as 'system' font */ static const char *DEFAULT_FONT_FILE = "6x10x.fon"; #define MAX_FONTS 40 char *FontList[MAX_FONTS]; static int num_fonts = 0; /* * A font structure * Note that the data is only valid for a surface with matching * values for pitch & bpp. If a surface is resized the data _must_ be * recalculated. */ typedef struct sdl_Font sdl_Font; struct sdl_Font { int width; /* The dimensions of this font (in pixels)*/ int height; char name[32]; /* The name of this font */ Uint16 pitch; /* Pitch of the surface this font is made for */ Uint8 bpp; /* Bytes per pixel of the surface */ Uint8 something; /* Padding */ int *data; /* The data */ }; static sdl_Font SystemFont; #define NUM_GLYPHS 256 /* * Window information * Each window has its own surface and coordinates */ typedef struct term_window term_window; struct term_window { term term_data; SDL_Surface *surface; /* The surface for this window */ #ifdef USE_GRAPHICS SDL_Surface *tiles; /* The appropriately sized tiles for this window */ #endif byte Term_idx; /* Index of term that relates to this */ int top; /* Window Coordinates on the main screen */ int left; int keys; /* Size of keypress storage */ sdl_Font font; /* Font info */ char *req_font; /* Requested font */ int rows; /* Dimension in tiles */ int cols; int border; /* Border width */ int title_height; /* Height of title bar */ int width; /* Dimension in pixels == tile_wid * cols + 2 x border*/ int height; int tile_wid; /* Size in pixels of a char */ int tile_hgt; bool visible; /* Can we see this window? */ SDL_Rect uRect; /* The part that needs to be updated */ }; typedef struct mouse_info mouse_info; struct mouse_info { int left; /* Is it pressed? */ int right; int leftx; /* _IF_ left button is pressed these */ int lefty; /* show where it was pressed */ int rightx; int righty; int x; /* Current position of mouse */ int y; }; #define WINDOW_DRAW (SDL_USEREVENT + 1) typedef struct sdl_ButtonBank sdl_ButtonBank; typedef struct sdl_Button sdl_Button; typedef struct sdl_Window sdl_Window; typedef void (*button_press_func)(sdl_Button *sender); struct sdl_Button { SDL_Rect pos; /* Position & Size */ bool selected; /* Selected? */ bool visible; /* Visible? */ button_press_func activate; /* A function to call when pressed */ sdl_ButtonBank *owner; /* Which bank is this in? */ char caption[50]; /* Text for this button */ Uint32 unsel_colour; /* Button unselected colour */ Uint32 sel_colour; /* Selected colour*/ Uint32 cap_colour; /* Caption colour */ void *data; /* Something */ int tag; /* Something */ }; struct sdl_ButtonBank { sdl_Button *buttons; /* A collection of buttons */ bool *used; /* What buttons are available? */ sdl_Window *window; /* The window that these buttons are on */ bool need_update; }; /* * Other 'windows' (basically a surface with a position and buttons on it) * Currently used for the top status bar and popup windows */ typedef void (*sdl_WindowCustomDraw)(sdl_Window *window); struct sdl_Window { int top; /* Position on main window */ int left; int width; /* Dimensions */ int height; bool visible; /* Visible? */ SDL_Surface *surface; /* SDL surface info */ sdl_ButtonBank buttons; /* Buttons */ sdl_Font font; /* Font */ SDL_Surface *owner; /* Who shall I display on */ sdl_WindowCustomDraw draw_extra; /* Stuff to draw on the surface */ bool need_update; }; /* * The main surface of the application */ static SDL_Surface *AppWin; /* * The status bar */ static sdl_Window StatusBar; /* * The Popup window */ static sdl_Window PopUp; static bool popped; /* * Term windows */ static term_window windows[ANGBAND_TERM_MAX]; static int Zorder[ANGBAND_TERM_MAX]; /* Keep track of the mouse status */ static mouse_info mouse; /* * The number pad consists of 10 keys, each with an SDL identifier */ #define is_numpad(k) \ ((k == SDLK_KP0) || (k == SDLK_KP1) || (k == SDLK_KP2) || (k == SDLK_KP3) || \ (k == SDLK_KP4) || (k == SDLK_KP5) || (k == SDLK_KP6) || \ (k == SDLK_KP7) || (k == SDLK_KP8) || (k == SDLK_KP9) || (k == SDLK_KP_ENTER)) static int SnapRange = 5; /* Window snap range (pixels) */ static int StatusHeight; /* The height in pixels of the status bar */ static int SelectedTerm; /* Current selected Term */ static int AboutSelect; /* About button */ static int TermSelect; /* Term selector button */ static int FontSelect; /* Font selector button */ static int VisibleSelect; /* Hide/unhide window button*/ static int MoreSelect; /* Other options button */ static int QuitSelect; /* Quit button */ /* For saving the icon for the About Box */ static SDL_Surface *mratt = NULL; /* Buttons on the 'More' panel */ static int MoreOK; /* Accept changes */ static int MoreFullscreen; /* Fullscreen toggle button */ static int MoreSnapPlus; /* Increase snap range */ static int MoreSnapMinus; /* Decrease snap range */ static bool Moving; /* Moving a window */ static bool Sizing; /* Sizing a window */ static SDL_Rect SizingSpot; /* Rect to descibe the sizing area */ static bool Sizingshow = FALSE; /* Is the resize thingy displayed? */ static SDL_Rect SizingRect; /* Rect to describe the current resize window */ #ifdef USE_GRAPHICS typedef struct GfxInfo GfxInfo; struct GfxInfo { const char *name; /* Name to show on button */ const char *gfxfile; /* The file with tiles */ int width; /* Width of a tile */ int height; /* Height of a tile */ const char *pref; /* Preference file to use */ bool avail; /* Are the appropriate files available? */ }; static SDL_Surface *GfxSurface = NULL; /* A surface for the graphics */ #define GfxModes 5 static GfxInfo GfxDesc[GfxModes] = { {"None", NULL, -1, -1, NULL, TRUE}, {"8x8", "8x8.png", 8, 8, "old", TRUE}, {"16x16", "16x16.png", 16, 16, "new", TRUE}, {"32x32", "32x32.png", 32, 32, "david", TRUE}, {"8x16", "8x16.png", 16, 16, "nomad", TRUE}, /* XXX (GRAPHICS_PSEUDO ???) */ }; static int MoreWidthPlus; /* Increase tile width */ static int MoreWidthMinus; /* Decrease tile width */ static int MoreHeightPlus; /* Increase tile height */ static int MoreHeightMinus; /* Decrease tile height */ static int GfxButtons[GfxModes]; /* Graphics mode buttons */ static int SelectedGfx; /* Current selected gfx */ #endif /* * The basic angband text colours in an sdl friendly form */ static u32b text_colours[MAX_COLORS]; u32b back_colour; /* Background colour */ /* * Fill in an SDL_Rect structure. * Note it also returns the value adjusted */ static SDL_Rect *RECT(int x, int y, int w, int h, SDL_Rect *rect) { rect->x = x; rect->y = y; rect->w = w; rect->h = h; return rect; } /* * Is a point(x, y) in a rectangle? */ static bool point_in(SDL_Rect *rect, int x, int y) { if (x < rect->x) return (FALSE); if (y < rect->y) return (FALSE); if (x >= rect->x + rect->w) return (FALSE); if (y >= rect->y + rect->h) return (FALSE); /* Must be inside */ return (TRUE); } /* * Draw an outline box * Given the top, left, width & height */ static void sdl_DrawBox(SDL_Surface *surface, SDL_Rect *rect, Uint32 colour, int width) { SDL_Rect rc; int left = rect->x; int right = rect->x + rect->w - width; int top = rect->y; int bottom = rect->y + rect->h - width; /* Top left -> Top Right */ RECT(left, top, rect->w, width, &rc); SDL_FillRect(surface, &rc, colour); /* Bottom left -> Bottom Right */ RECT(left, bottom, rect->w, width, &rc); SDL_FillRect(surface, &rc, colour); /* Top left -> Bottom left */ RECT(left, top, width, rect->h, &rc); SDL_FillRect(surface, &rc, colour); /* Top right -> Bottom right */ RECT(right, top, width, rect->h, &rc); SDL_FillRect(surface, &rc, colour); } /* * Get the width and height of a given font file */ static errr sdl_CheckFont(const char *fontname, int *width, int *height) { char buf[1024]; TTF_Font *ttf_font; /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, fontname); /* Attempt to load it */ ttf_font = TTF_OpenFont(buf, 0); /* Bugger */ if (!ttf_font) return (-1); /* Get the size */ if (TTF_SizeText(ttf_font, "M", width, height)) return (-1); /* Finished with the font */ TTF_CloseFont(ttf_font); return (0); } /* * The sdl_Font routines */ /* * Free any memory assigned by Create() */ static void sdl_FontFree(sdl_Font *font) { /* The only memory reserved is the data */ FREE(font->data); } /* * Create new font data with font fontname, optimizing the data * for the surface given */ static errr sdl_FontCreate(sdl_Font *font, const char *fontname, SDL_Surface *surface) { char buf[1024]; int i; TTF_Font *ttf_font; /* Our temporary glyph will be rendered in white */ SDL_Color white = { 255, 255, 255, 0 }; int *temp_array; /* The first pixel data is stored immediately after the character indexes */ /* But we need an extra space to store the total pixel count */ int num_pixels = NUM_GLYPHS + 1; /* Free any old data */ if (font->data) sdl_FontFree(font); /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, fontname); /* Attempt to load it */ ttf_font = TTF_OpenFont(buf, 0); /* Bugger */ if (!ttf_font) return (-1); /* Get the size */ if (TTF_SizeText(ttf_font, "M", &font->width, &font->height)) return (-1); /* Fill in some of the font struct */ my_strcpy(font->name, fontname, 30); font->pitch = surface->pitch; font->bpp = surface->format->BytesPerPixel; /* Make a very large temporary holding bin for pixel offset data XXX */ temp_array = C_ZNEW(NUM_GLYPHS * 1000, int); /* Render and encode all the characters */ for (i = 0; i < NUM_GLYPHS; i++) { SDL_Surface *temp_glyph; int x, y, v; Uint8 *p; /* Render this glyph, in white, onto an 8-bit surface */ temp_glyph = TTF_RenderGlyph_Solid(ttf_font, i, white); /* Remember the current pixel array location */ temp_array[i] = num_pixels; /* If glyph does not exist, no pixels get plotted */ if (!temp_glyph) { fprintf(stderr, "char:%d : %s\n", i, TTF_GetError()); continue; } /* Store this glyph into our temporary array */ for (x = 0; x < temp_glyph->w; x++) { for (y = 0; y < temp_glyph->h; y++) { /* Access this pixel. "pitch" is the pixel width in bytes of an SDL surface */ p = (Uint8 *)temp_glyph->pixels + (y * temp_glyph->pitch) + (x * temp_glyph->format->BytesPerPixel); /* Ignore pixels without color data */ if (!*p) continue; /* Precalculate some of the math needed to access this pixel on screen */ v = (y * font->pitch) + (x * font->bpp); /* And store it */ temp_array[num_pixels++] = v; } } /* Free the temporary surface */ SDL_FreeSurface(temp_glyph); } /* Calculate and store access position data for the final character */ temp_array[NUM_GLYPHS] = num_pixels; /* Make a pixel access array for this font */ font->data = C_ZNEW(num_pixels, int); /* Save the data gathered in our temporary array */ for (i = 0; i < num_pixels; i++) font->data[i] = temp_array[i]; /* Free the temporary pixel data */ FREE(temp_array); /* Finished with the font */ TTF_CloseFont(ttf_font); /* Success */ return (0); } /* * Draw some text onto a surface * The surface is first checked to see if it is compatable with * this font, if it isn't the the font will be 're-precalculated' * * You can, I suppose, use one font on many surfaces, but it is * definately not recommended. One font per surface is good enough. */ static errr sdl_FontDraw(sdl_Font *font, SDL_Surface *surface, Uint32 colour, int x, int y, int n , const char *s) { Uint8 bpp = surface->format->BytesPerPixel; Uint16 pitch = surface->pitch; int i, j; int start, end; Uint8 *pd0; int *data; if ((bpp != font->bpp) || (pitch != font->pitch)) sdl_FontCreate(font, font->name, surface); data = font->data; /* Lock the window surface (if necessary) */ if (SDL_MUSTLOCK(surface)) { if (SDL_LockSurface(surface) < 0) return (-1); } /* Point to the left-top corner of the screen pixel data for this tile */ pd0 = (Uint8 *)surface->pixels + (y * pitch) + (x * bpp); /* Advance along the string. Adjust pixel pointer one tile per character. */ for (i = 0; i < n; i++, pd0 += (font->width * bpp)) { /* Translate the character */ byte c = *(s + i); /* Get the first and last pixel locator we need to plot */ start = data[c]; end = data[c + 1]; /* Handle all of the legal bit depths */ switch (bpp) { /* 256 colors -- pixel data is 8-bit */ case 1: { /* * Use entries in the pixel location array to jump to and * change pixels to our desired color. */ for (j = start; j < end; j++) *(Uint8*)(pd0 + data[j]) = (Uint8)colour; break; } /* 15 and 16-bit color (SDL handles the details) */ case 2: { for (j = start; j < end; j++) *(Uint16*)(pd0 + data[j]) = (Uint16)colour; break; } /* 32-bit color is easy. 24-bit color needs more testing. */ case 3: case 4: default: { for (j = start; j < end; j++) *(Uint32*)(pd0 + data[j]) = colour; break; } } } /* Unlock the surface */ if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface); /* Success */ return (0); } /* * Draw a button on the screen */ static void sdl_ButtonDraw(sdl_Button *button) { SDL_Surface *surface = button->owner->window->surface; sdl_Font *font = &button->owner->window->font; Uint32 colour = button->selected ? button->sel_colour : button->unsel_colour; if (!button->visible) return; SDL_FillRect(surface, &button->pos, colour); if (strlen(button->caption)) { size_t len = strlen(button->caption); unsigned max = button->pos.w / font->width; int n = MIN(len, max); int l = n * font->width / 2; int x = button->pos.x + ((button->pos.w) / 2) - l; sdl_FontDraw(font, surface, button->cap_colour, x, button->pos.y + 1, n, button->caption); } } /* * Adjust the position of a button */ static void sdl_ButtonMove(sdl_Button *button, int x, int y) { button->pos.x = x; button->pos.y = y; button->owner->need_update = TRUE; } /* * Adjust the size of a button */ static void sdl_ButtonSize(sdl_Button *button, int w, int h) { button->pos.w = w; button->pos.h = h; button->owner->need_update = TRUE; } /* * Set the caption */ static void sdl_ButtonCaption(sdl_Button *button, const char *s) { my_strcpy(button->caption, s, sizeof(button->caption)); button->owner->need_update = TRUE; } /* * Set the visibility of a button */ static void sdl_ButtonVisible(sdl_Button *button, bool visible) { if (button->visible != visible) { button->visible = visible; button->owner->need_update = TRUE; } } /* Maximum amount of buttons in a bank */ #define MAX_BUTTONS 40 /* * The button_bank package */ /* * Initialize it */ static void sdl_ButtonBankInit(sdl_ButtonBank *bank, sdl_Window *window) { bank->window = window; bank->buttons = C_ZNEW(MAX_BUTTONS, sdl_Button); bank->used = C_ZNEW(MAX_BUTTONS, bool); bank->need_update = TRUE; } /* * Clear the bank */ static void sdl_ButtonBankFree(sdl_ButtonBank *bank) { FREE(bank->buttons); FREE(bank->used); } /* * Draw all the buttons on the screen */ static void sdl_ButtonBankDrawAll(sdl_ButtonBank *bank) { int i; for (i = 0; i < MAX_BUTTONS; i++) { sdl_Button *button = &bank->buttons[i]; if (!bank->used[i]) continue; if (!button->visible) continue; sdl_ButtonDraw(button); } bank->need_update = FALSE; } /* * Get a new button index */ static int sdl_ButtonBankNew(sdl_ButtonBank *bank) { int i = 0; sdl_Button *new_button; while (bank->used[i] && (i < MAX_BUTTONS)) i++; if (i == MAX_BUTTONS) { /* Bugger! */ return (-1); } /* Get the button */ new_button = &bank->buttons[i]; /* Mark the button as used */ bank->used[i] = TRUE; /* Clear it */ WIPE(new_button, sdl_Button); /* Mark it as mine */ new_button->owner = bank; /* Default colours */ new_button->unsel_colour = SDL_MapRGB(bank->window->surface->format, 160, 160, 60); new_button->sel_colour = SDL_MapRGB(bank->window->surface->format, 210, 210, 110); new_button->cap_colour = SDL_MapRGB(bank->window->surface->format, 0, 0, 0); /* Success */ return (i); } /* * Retrieve button 'idx' or NULL */ static sdl_Button *sdl_ButtonBankGet(sdl_ButtonBank *bank, int idx) { /* Check the index */ if ((idx < 0) || (idx >= MAX_BUTTONS)) return (NULL); if (!bank->used[idx]) return (NULL); /* Return it */ return &bank->buttons[idx]; } #if 0 /* * Remove a Button by its index */ static void sdl_ButtonBankRemove(sdl_ButtonBank *bank, int idx) { sdl_Button *button; /* Check the index */ if ((idx < 0) || (idx >= MAX_BUTTONS)) return; if (!bank->used[idx]) return; /* Grab it */ button = &bank->buttons[idx]; /* Hide it */ button->visible = FALSE; /* Draw it */ bank->need_update = TRUE; /* Forget */ bank->used[idx] = FALSE; } #endif /* * Examine and respond to mouse presses * Return if we 'handled' the click */ static bool sdl_ButtonBankMouseDown(sdl_ButtonBank *bank, int x, int y) { int i; /* Check every button */ for (i = 0; i < MAX_BUTTONS; i++) { sdl_Button *button = &bank->buttons[i]; /* Discard some */ if (!bank->used[i]) continue; if (!button->visible) continue; /* Check the coordinates */ if (point_in(&button->pos, x, y)) { button->selected = TRUE; /* Draw it */ bank->need_update = TRUE; return (TRUE); } } return (FALSE); } /* * Respond to a mouse button release */ static bool sdl_ButtonBankMouseUp(sdl_ButtonBank *bank, int x, int y) { int i; /* Check every button */ for (i = 0; i < MAX_BUTTONS; i++) { sdl_Button *button = &bank->buttons[i]; /* Discard some */ if (!bank->used[i]) continue; if (!button->visible) continue; /* Check the coordinates */ if (point_in(&button->pos, x, y)) { /* Has this butoon been 'selected'? */ if (button->selected) { /* Activate the button (usually) */ if (button->activate) (*button->activate)(button); /* Now not selected */ button->selected = FALSE; /* Draw it */ bank->need_update = TRUE; return (TRUE); } } else { /* This button was 'selected' but the release of the */ /* mouse button was outside the area of this button */ if (button->selected) { /* Now not selected */ button->selected = FALSE; /* Draw it */ bank->need_update = TRUE; } } } return (FALSE); } /* * sdl_Window functions */ static void sdl_WindowFree(sdl_Window* window) { if (window->surface) { SDL_FreeSurface(window->surface); sdl_ButtonBankFree(&window->buttons); sdl_FontFree(&window->font); WIPE(window, sdl_Window); } } /* * Initialize a window */ static void sdl_WindowInit(sdl_Window* window, int w, int h, SDL_Surface *owner, const char *fontname) { sdl_WindowFree(window); window->owner = owner; window->width = w; window->height = h; window->surface = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, owner->format->BitsPerPixel, owner->format->Rmask, owner->format->Gmask, owner->format->Bmask, owner->format->Amask); sdl_ButtonBankInit(&window->buttons, window); sdl_FontCreate(&window->font, fontname, window->surface); window->visible = TRUE; window->need_update = TRUE; } static void sdl_WindowBlit(sdl_Window* window) { SDL_Rect rc; if (!window->visible) return; RECT(window->left, window->top, window->width, window->height, &rc); SDL_BlitSurface(window->surface, NULL, window->owner, &rc); SDL_UpdateRects(window->owner, 1, &rc); } static void sdl_WindowText(sdl_Window* window, Uint32 c, int x, int y, const char *s) { sdl_FontDraw(&window->font, window->surface, c, x, y, strlen(s), s); } static void sdl_WindowUpdate(sdl_Window* window) { if ((window->need_update || window->buttons.need_update) && (window->visible)) { SDL_Event Event; SDL_FillRect(window->surface, NULL, back_colour); if (window->draw_extra) (*window->draw_extra)(window); sdl_ButtonBankDrawAll(&window->buttons); window->need_update = FALSE; WIPE(&Event, SDL_Event); Event.type = WINDOW_DRAW; Event.user.data1 = (void*)window; SDL_PushEvent(&Event); } } static void term_windowFree(term_window* win) { if (win->surface) { SDL_FreeSurface(win->surface); win->surface = NULL; #ifdef USE_GRAPHICS /* Invalidate the gfx surface */ if (win->tiles) { SDL_FreeSurface(win->tiles); win->tiles = NULL; } #endif term_nuke(&win->term_data); } sdl_FontFree(&win->font); } static errr save_prefs(void); static void hook_quit(const char *str) { int i; save_prefs(); string_free(ANGBAND_DIR_USER_SDL); /* Free the surfaces of the windows */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_windowFree(&windows[i]); string_free(windows[i].req_font); } #ifdef USE_GRAPHICS /* Free the graphics surface */ if (GfxSurface) SDL_FreeSurface(GfxSurface); #endif /* Free the 'System font' */ sdl_FontFree(&SystemFont); /* Free the statusbar window */ sdl_WindowFree(&StatusBar); /* free the popup window */ sdl_WindowFree(&PopUp); /* Free the main surface */ SDL_FreeSurface(AppWin); /* Shut down the font library */ TTF_Quit(); /* Shut down SDL */ SDL_Quit(); for (i = 0; i < MAX_FONTS; i++) string_free(FontList[i]); } static void BringToTop(void) { int i, idx; for (idx = 0; idx < ANGBAND_TERM_MAX; idx++) { if (Zorder[idx] == SelectedTerm) break; } if (idx == ANGBAND_TERM_MAX) return; for (i = idx; i < ANGBAND_TERM_MAX - 1; i++) { Zorder[i] = Zorder[i + 1]; } Zorder[ANGBAND_TERM_MAX - 1] = SelectedTerm; } /* * Validate a file */ static void validate_file(const char *s) { if (!file_exists(s)) quit_fmt("Cannot find required file:\n%s", s); } /* * Find a window that is under the points x,y on * the main screen */ static int sdl_LocateWin(int x, int y) { int i; for (i = ANGBAND_TERM_MAX - 1; i >= 0; i--) { term_window *win = &windows[Zorder[i]]; SDL_Rect rc; if (!win->visible) continue; if (!point_in(RECT(win->left, win->top, win->width, win->height, &rc), x, y)) continue; return (Zorder[i]); } return (-1); } static void draw_statusbar(sdl_Window *window) { char buf[128]; term_window *win = &windows[SelectedTerm]; int fw = window->font.width; int x = 1; sdl_Button *button; SDL_Rect rc; u32b c = SDL_MapRGB(window->surface->format, 160, 160, 60); RECT(0, StatusBar.height - 1, StatusBar.width, 1, &rc); SDL_FillRect(StatusBar.surface, &rc, c); button = sdl_ButtonBankGet(&StatusBar.buttons, AboutSelect); x += button->pos.w + 20; sdl_WindowText(&StatusBar, c, x, 1, "Term:"); x += 5 * fw; button = sdl_ButtonBankGet(&StatusBar.buttons, TermSelect); button->pos.x = x; x += button->pos.w + 10; my_strcpy(buf, format("(%dx%d)", win->cols, win->rows), sizeof(buf)); sdl_WindowText(&StatusBar, c, x, 1, buf); x += strlen(buf) * fw + 20; sdl_WindowText(&StatusBar, c, x, 1, "Visible:"); x += 8 * fw; button = sdl_ButtonBankGet(&StatusBar.buttons, VisibleSelect); button->pos.x = x; x += button->pos.w + 20; button = sdl_ButtonBankGet(&StatusBar.buttons, FontSelect); if (button->visible) sdl_WindowText(&StatusBar, c, x, 1, "Font:"); x += 5 * fw; button->pos.x = x; x += button->pos.w + 20; button = sdl_ButtonBankGet(&StatusBar.buttons, MoreSelect); button->pos.x = x; x += button->pos.w + 20; } static void sdl_BlitWin(term_window *win) { SDL_Rect rc; if (!win->surface) return; if (!win->visible) return; if (win->uRect.x == -1) return; /* Select the area to be updated */ RECT(win->left + win->uRect.x, win->top + win->uRect.y, win->uRect.w, win->uRect.h, &rc); SDL_BlitSurface(win->surface, &win->uRect, AppWin, &rc); SDL_UpdateRects(AppWin, 1, &rc); /* Mark the update as complete */ win->uRect.x = -1; } static void sdl_BlitAll(void) { SDL_Rect rc; sdl_Window *window = &StatusBar; int i; Uint32 colour = SDL_MapRGB(AppWin->format, 160, 160, 60); /* int32 ccolour = SDL_MapRGB(AppWin->format, 160, 40, 40); */ SDL_FillRect(AppWin, NULL, back_colour); for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[Zorder[i]]; if (!win->surface) continue; if (!win->visible) continue; RECT(win->left, win->top, win->width, win->height, &rc); SDL_BlitSurface(win->surface, NULL, AppWin, &rc); if (Zorder[i] == SelectedTerm) { SizingSpot.w = 10; SizingSpot.h = 10; SizingSpot.x = win->left + win->width - 10; SizingSpot.y = win->top + win->height - 10; /* SDL_FillRect(AppWin, &SizingSpot, ccolour); */ if (Sizing) { int width = 2; int grabsize = 10; rc = SizingRect; SizingSpot.w = grabsize; SizingSpot.h = grabsize; SizingSpot.x = SizingRect.x + SizingRect.w - grabsize; SizingSpot.y = SizingRect.y + SizingRect.h - grabsize; sdl_DrawBox(AppWin, &rc, colour, width); } } } RECT(window->left, window->top, window->width, window->height, &rc); SDL_BlitSurface(window->surface, NULL, AppWin, &rc); SDL_UpdateRect(AppWin, 0, 0, AppWin->w, AppWin->h); } static void RemovePopUp(void) { PopUp.visible = FALSE; popped = FALSE; sdl_BlitAll(); } static void QuitActivate(sdl_Button *sender) { SDL_Event Event; Event.type = SDL_QUIT; SDL_PushEvent(&Event); } static void SetStatusButtons(void) { term_window *win = &windows[SelectedTerm]; sdl_Button *button = sdl_ButtonBankGet(&StatusBar.buttons, TermSelect); sdl_Button *fontbutton = sdl_ButtonBankGet(&StatusBar.buttons, FontSelect); sdl_Button *visbutton = sdl_ButtonBankGet(&StatusBar.buttons, VisibleSelect); sdl_ButtonCaption(button, angband_term_name[SelectedTerm]); if (!win->visible) { sdl_ButtonVisible(fontbutton, FALSE); sdl_ButtonCaption(visbutton, "No"); } else { sdl_ButtonVisible(fontbutton, TRUE); sdl_ButtonCaption(fontbutton, win->font.name); sdl_ButtonCaption(visbutton, "Yes"); } } static void TermFocus(int idx) { if (SelectedTerm == idx) return; SelectedTerm = idx; BringToTop(); SetStatusButtons(); sdl_BlitAll(); } static void AboutDraw(sdl_Window *win) { SDL_Rect rc; SDL_Rect icon; /* Wow - a different colour! */ Uint32 colour = SDL_MapRGB(win->surface->format, 160, 60, 60); RECT(0, 0, win->width, win->height, &rc); /* Draw a nice box */ SDL_FillRect(win->surface, &win->surface->clip_rect, SDL_MapRGB(win->surface->format, 255,255,255)); sdl_DrawBox(win->surface, &win->surface->clip_rect, colour, 5); if (mratt) { RECT((win->width - mratt->w) / 2, 5, mratt->w, mratt->h, &icon); SDL_BlitSurface(mratt, NULL, win->surface, &icon); } sdl_WindowText(win, colour, 20, 150, format("You are playing %s", buildid)); sdl_WindowText(win, colour, 20, 160, "See http://www.rephial.org"); } static void AboutActivate(sdl_Button *sender) { int width = 350; int height = 200; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = (AppWin->w / 2) - width / 2; PopUp.top = (AppWin->h / 2) - height / 2; PopUp.draw_extra = AboutDraw; popped = TRUE; } static void SelectTerm(sdl_Button *sender) { RemovePopUp(); TermFocus(sender->tag); } static void TermActivate(sdl_Button *sender) { int i, maxl = 0; int width, height = ANGBAND_TERM_MAX * (StatusBar.font.height + 1); for (i = 0; i < ANGBAND_TERM_MAX; i++) { int l = strlen(angband_term_name[i]); if (l > maxl) maxl = l; } width = maxl * StatusBar.font.width + 20; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = sender->pos.x; PopUp.top = sender->pos.y; for (i = 0; i < ANGBAND_TERM_MAX; i++) { int h = PopUp.font.height; int b = sdl_ButtonBankNew(&PopUp.buttons); sdl_Button *button = sdl_ButtonBankGet(&PopUp.buttons, b); sdl_ButtonSize(button, width - 2 , h); sdl_ButtonMove(button, 1, i * (h + 1)); sdl_ButtonCaption(button, angband_term_name[i]); sdl_ButtonVisible(button, TRUE); button->tag = i; button->activate = SelectTerm; } popped = TRUE; } static void ResizeWin(term_window* win, int w, int h); static void term_data_link_sdl(term_window *win); static void VisibleActivate(sdl_Button *sender) { term_window *window = &windows[SelectedTerm]; if (SelectedTerm == 0) return; if (window->visible) { window->visible = FALSE; term_windowFree(window); angband_term[SelectedTerm] = NULL; } else { window->visible = TRUE; ResizeWin(window, window->width, window->height); } SetStatusButtons(); sdl_BlitAll(); } static void SelectFont(sdl_Button *sender) { term_window *window = &windows[SelectedTerm]; int w, h; sdl_FontFree(&window->font); string_free(window->req_font); window->req_font = string_make(sender->caption); sdl_CheckFont(window->req_font, &w, &h); #ifdef USE_GRAPHICS /* Invalidate the gfx surface */ if (window->tiles) { SDL_FreeSurface(window->tiles); window->tiles = NULL; } #endif ResizeWin(window, (w * window->cols) + (2 * window->border), (h * window->rows) + window->border + window->title_height); SetStatusButtons(); RemovePopUp(); } static void FontActivate(sdl_Button *sender) { int i, maxl = 0; int width, height = num_fonts * (StatusBar.font.height + 1); for (i = 0; i < num_fonts; i++) { int l = strlen(FontList[i]); if (l > maxl) maxl = l; } width = maxl * StatusBar.font.width + 20; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = sender->pos.x; PopUp.top = sender->pos.y; for (i = 0; i < num_fonts; i++) { int h = PopUp.font.height; int b = sdl_ButtonBankNew(&PopUp.buttons); sdl_Button *button = sdl_ButtonBankGet(&PopUp.buttons, b); sdl_ButtonSize(button, width - 2 , h); sdl_ButtonMove(button, 1, i * (h + 1)); sdl_ButtonCaption(button, FontList[i]); sdl_ButtonVisible(button, TRUE); button->activate = SelectFont; } popped = TRUE; } #ifdef USE_GRAPHICS static errr load_gfx(void); static bool do_update = FALSE; static void SelectGfx(sdl_Button *sender) { SelectedGfx = sender->tag; } #endif static void AcceptChanges(sdl_Button *sender) { sdl_Button *button; bool do_video_reset = FALSE; #ifdef USE_GRAPHICS if (use_graphics != SelectedGfx) { do_update = TRUE; use_graphics = SelectedGfx; } if (use_graphics) { arg_graphics = TRUE; load_gfx(); } else { arg_graphics = FALSE; tile_width = 1; tile_height = 1; reset_visuals(TRUE); } /* Invalidate all the gfx surfaces */ if (do_update) { int i; for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[i]; if (win->tiles) { SDL_FreeSurface(win->tiles); win->tiles = NULL; } } } #endif button = sdl_ButtonBankGet(&PopUp.buttons, MoreFullscreen); if (button->tag != fullscreen) { fullscreen = !fullscreen; do_video_reset = TRUE; } SetStatusButtons(); RemovePopUp(); if (do_update) { if (character_dungeon) do_cmd_redraw(); } if (do_video_reset) { SDL_Event Event; WIPE(&Event, SDL_Event); Event.type = SDL_VIDEORESIZE; Event.resize.w = screen_w; Event.resize.h = screen_h; SDL_PushEvent(&Event); } do_update = FALSE; } static void FlipTag(sdl_Button *sender) { if (sender->tag) { sender->tag = 0; sdl_ButtonCaption(sender, "Off"); } else { sender->tag = 1; sdl_ButtonCaption(sender, "On"); } } static void SnapChange(sdl_Button *sender) { SnapRange += sender->tag; if (SnapRange < 0) SnapRange = 0; if (SnapRange > 20) SnapRange = 20; PopUp.need_update = TRUE; } #ifdef USE_GRAPHICS static void WidthChange(sdl_Button *sender) { tile_width += sender->tag; if (tile_width < 1) tile_width = 1; if (tile_width > 6) tile_width = 6; do_update = TRUE; } static void HeightChange(sdl_Button *sender) { tile_height += sender->tag; if (tile_height < 1) tile_height = 1; if (tile_height > 3) tile_height = 3; do_update = TRUE; } #endif static void MoreDraw(sdl_Window *win) { SDL_Rect rc; sdl_Button *button; int y = 20, i; /* Wow - a different colour! */ Uint32 colour = SDL_MapRGB(win->surface->format, 160, 60, 60); RECT(0, 0, win->width, win->height, &rc); /* Draw a nice box */ sdl_DrawBox(win->surface, &rc, colour, 5); #ifdef USE_GRAPHICS button = sdl_ButtonBankGet(&win->buttons, MoreWidthMinus); if (SelectedGfx) { sdl_WindowText(win, colour, 20, y, format("Tile width is %d.", tile_width)); sdl_ButtonMove(button, 200, y); sdl_ButtonVisible(button, TRUE); } else { sdl_ButtonVisible(button, FALSE); } button = sdl_ButtonBankGet(&win->buttons, MoreWidthPlus); if (SelectedGfx) { sdl_ButtonMove(button, 230, y); sdl_ButtonVisible(button, TRUE); y += 20; } else { sdl_ButtonVisible(button, FALSE); } button = sdl_ButtonBankGet(&win->buttons, MoreHeightMinus); if (SelectedGfx) { sdl_WindowText(win, colour, 20, y, format("Tile height is %d.", tile_height)); sdl_ButtonMove(button, 200, y); sdl_ButtonVisible(button, TRUE); } else { sdl_ButtonVisible(button, FALSE); } button = sdl_ButtonBankGet(&win->buttons, MoreHeightPlus); if (SelectedGfx) { sdl_ButtonMove(button, 230, y); sdl_ButtonVisible(button, TRUE); y += 20; } else { sdl_ButtonVisible(button, FALSE); } sdl_WindowText(win, colour, 20, y, "Selected Graphics:"); sdl_WindowText(win, SDL_MapRGB(win->surface->format, 210, 110, 110), 200, y, GfxDesc[SelectedGfx].name); y += 20; sdl_WindowText(win, colour, 20, y, "Available Graphics:"); for (i = 0; i < GfxModes; i++) { if (!GfxDesc[i].avail) continue; button = sdl_ButtonBankGet(&win->buttons, GfxButtons[i]); sdl_ButtonMove(button, 200, y); y += 20; } #endif button = sdl_ButtonBankGet(&win->buttons, MoreFullscreen); sdl_WindowText(win, colour, 20, y, "Fullscreen is:"); sdl_ButtonMove(button, 200, y); y+= 20; sdl_WindowText(win, colour, 20, y, format("Snap range is %d.", SnapRange)); button = sdl_ButtonBankGet(&win->buttons, MoreSnapMinus); sdl_ButtonMove(button, 200, y); button = sdl_ButtonBankGet(&win->buttons, MoreSnapPlus); sdl_ButtonMove(button, 230, y); } static void MoreActivate(sdl_Button *sender) { int width = 300; int height = 300; int i; sdl_Button *button; Uint32 ucolour; Uint32 scolour; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = (AppWin->w / 2) - width / 2; PopUp.top = (AppWin->h / 2) - height / 2; PopUp.draw_extra = MoreDraw; ucolour = SDL_MapRGB(PopUp.surface->format, 160, 60, 60); scolour = SDL_MapRGB(PopUp.surface->format, 210, 110, 110); #ifdef USE_GRAPHICS MoreWidthPlus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreWidthPlus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "+"); button->tag = 1; sdl_ButtonVisible(button, TRUE); button->activate = WidthChange; MoreWidthMinus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreWidthMinus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "-"); button->tag = -1; sdl_ButtonVisible(button, TRUE); button->activate = WidthChange; MoreHeightPlus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreHeightPlus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "+"); button->tag = 1; sdl_ButtonVisible(button, TRUE); button->activate = HeightChange; MoreHeightMinus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreHeightMinus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "-"); button->tag = -1; sdl_ButtonVisible(button, TRUE); button->activate = HeightChange; SelectedGfx = use_graphics; for (i = 0; i < GfxModes; i++) { if (!GfxDesc[i].avail) continue; GfxButtons[i] = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, GfxButtons[i]); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 50 , PopUp.font.height + 2); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, GfxDesc[i].name); button->tag = i; button->activate = SelectGfx; } #endif MoreFullscreen = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreFullscreen); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 50 , PopUp.font.height + 2); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, fullscreen ? "On" : "Off"); button->tag = fullscreen; button->activate = FlipTag; MoreSnapPlus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreSnapPlus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "+"); button->tag = 1; sdl_ButtonVisible(button, TRUE); button->activate = SnapChange; MoreSnapMinus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreSnapMinus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "-"); button->tag = -1; sdl_ButtonVisible(button, TRUE); button->activate = SnapChange; MoreOK = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreOK); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 50 , PopUp.font.height + 2); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, "OK"); sdl_ButtonMove(button, width / 2 - 25, height - 40); button->activate = AcceptChanges; popped = TRUE; } static errr Term_xtra_sdl_clear(void); /* * Make a window with size (x,y) pixels * Note: The actual size of the window may end up smaller. * This may be called when a window wants resizing, * is made visible, or the font has changed. * This function doesn't go in for heavy optimization, and doesn't need it- * it may initialize a few too many redraws or whatnot, but everything gets done! */ static void ResizeWin(term_window* win, int w, int h) { /* Don't bother */ if (!win->visible) return; win->border = 2; win->title_height = StatusHeight; /* No font - a new font is needed -> get dimensions */ if (!win->font.data) { /* Get font dimensions */ sdl_CheckFont(win->req_font, &win->tile_wid, &win->tile_hgt); /* Oops */ if (!win->tile_wid || !win->tile_hgt) quit(format("Unable to find font '%s'.\n" "Note that there are new extended font files ending in 'x' in %s.\n" "Please check %s and edit if necessary.", win->req_font, ANGBAND_DIR_XTRA_FONT, ANGBAND_DIR_USER_SDL)); } /* Get the amount of columns & rows */ win->cols = (w - (win->border * 2)) / win->tile_wid; win->rows = (h - win->border - win->title_height) / win->tile_hgt; /* Calculate the width & height */ win->width = (win->cols * win->tile_wid) + (win->border * 2); win->height = (win->rows * win->tile_hgt) + win->border + win->title_height; /* Delete the old surface */ if (win->surface) SDL_FreeSurface(win->surface); /* Create a new surface */ win->surface = SDL_CreateRGBSurface(SDL_SWSURFACE, win->width, win->height, AppWin->format->BitsPerPixel, AppWin->format->Rmask, AppWin->format->Gmask, AppWin->format->Bmask, AppWin->format->Amask); /* Fill it */ SDL_FillRect(win->surface, NULL, SDL_MapRGB(AppWin->format, 160, 160, 60)); /* Label it */ sdl_FontDraw(&SystemFont, win->surface, back_colour, 1, 1, strlen(angband_term_name[win->Term_idx]), angband_term_name[win->Term_idx]); /* Mark the whole window for redraw */ RECT(0, 0, win->width, win->height, &win->uRect); /* Create the font if we need to */ if (!win->font.data) { sdl_FontCreate(&win->font, win->req_font, win->surface); } /* This window was never visible before */ if (!angband_term[win->Term_idx]) { term *old = Term; /* Initialize the term data */ term_data_link_sdl(win); /* Make it visible to angband */ angband_term[win->Term_idx] = &win->term_data; /* Activate it */ Term_activate((term*)&win->term_data); /* Redraw */ Term_redraw(); /* Restore */ Term_activate(old); } /* Resize the term */ else { term *old = Term; /* Activate it */ Term_activate((term*)&win->term_data); /* Resize */ Term_resize(win->cols, win->rows); /* Redraw */ Term_redraw(); /* Restore */ Term_activate(old); } /* Calculate the hotspot */ if (win->Term_idx == SelectedTerm) { SizingSpot.w = 10; SizingSpot.h = 10; SizingSpot.x = win->left + win->width - 10; SizingSpot.y = win->top + win->height - 10; } StatusBar.need_update = TRUE; /* HACK - Redraw all windows */ if (character_dungeon) do_cmd_redraw(); } static errr load_prefs(void) { char buf[1024]; ang_file *fff; term_window *win; int i; /* Initialize the windows with crappy defaults! */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { win = &windows[i]; /* Clear the data */ WIPE(win, term_window); /* Who? */ win->Term_idx = i; win->req_font = string_make(DEFAULT_FONT_FILE); if (i == 0) { win->top = StatusHeight; win->width = 600; win->height = 380; win->keys = 1024; win->visible = TRUE; } else { win->top = 400 + (i * 10); win->left = (i - 1) * 10; win->width = 400; win->height = 200; win->keys = 32; win->visible = FALSE; } } /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "sdlinit.txt"); /* XXXXX */ ANGBAND_DIR_USER_SDL = string_make(buf); /* Open the file */ fff = file_open(buf, MODE_READ, -1); /* Check it */ if (!fff) return (1); /* Process the file */ while (file_getl(fff, buf, sizeof(buf))) { char *s; if (!buf[0]) continue; if (buf[0] == '#') continue; s = strchr(buf, '='); s++; while (!isalnum(*s)) s++; if (strstr(buf, "Resolution")) { screen_w = atoi(s); s = strchr(buf, 'x'); screen_h = atoi(s + 1); } else if (strstr(buf, "Fullscreen")) { fullscreen = atoi(s); } else if (strstr(buf, "Graphics")) { use_graphics = atoi(s); if (use_graphics) arg_graphics = TRUE; } else if (strstr(buf, "TileWidth")) { tile_width = atoi(s); } else if (strstr(buf, "TileHeight")) { tile_height = atoi(s); } else if (strstr(buf, "Bigtile")) { tile_width += atoi(s); } else if (strstr(buf, "Dbltile")) { tile_width += tile_width * atoi(s); tile_height += tile_height * atoi(s); } else if (strstr(buf, "Trptile")) { tile_width += 2 * tile_width * atoi(s); tile_height += 2 * tile_height * atoi(s); } else if (strstr(buf, "Window")) { win = &windows[atoi(s)]; } else if (strstr(buf, "Visible")) { win->visible = atoi(s); } else if (strstr(buf, "Left")) { win->left = atoi(s); } else if (strstr(buf, "Top")) { win->top = atoi(s); } else if (strstr(buf, "Width")) { win->width = atoi(s); } else if (strstr(buf, "Height")) { win->height = atoi(s); } else if (strstr(buf, "Keys")) { win->keys = atoi(s); } else if (strstr(buf, "Font")) { win->req_font = string_make(s); } } if (screen_w < 640) screen_w = 640; if (screen_h < 480) screen_h = 480; file_close(fff); return (0); } static errr save_prefs(void) { ang_file *fff; int i; /* Open the file */ fff = file_open(ANGBAND_DIR_USER_SDL, MODE_WRITE, FTYPE_TEXT); /* Check it */ if (!fff) return (1); file_putf(fff, "Resolution = %dx%d\n", screen_w, screen_h); file_putf(fff, "Fullscreen = %d\n", fullscreen); file_putf(fff, "Graphics = %d\n", use_graphics); file_putf(fff, "TileWidth = %d\n\n", tile_width); file_putf(fff, "TileHeight = %d\n\n", tile_height); for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[i]; file_putf(fff, "Window = %d\n", i); file_putf(fff, "Visible = %d\n", (int)win->visible); file_putf(fff, "Left = %d\n", win->left); file_putf(fff, "Top = %d\n", win->top); file_putf(fff, "Width = %d\n", win->width); file_putf(fff, "Height = %d\n", win->height); file_putf(fff, "Keys = %d\n", win->keys); file_putf(fff, "Font = %s\n\n", win->req_font); } file_close(fff); /* Done */ return (0); } static void set_update_rect(term_window *win, SDL_Rect *rc); static void DrawSizeWidget(void) { Uint32 colour = SDL_MapRGB(AppWin->format, 30, 160, 70); SDL_FillRect(AppWin, &SizingSpot, colour); SDL_UpdateRects(AppWin, 1, &SizingSpot); } static int Movingx; static int Movingy; /* * Is What within Range units of Origin */ #define closeto(Origin, What, Range) \ ((ABS((Origin) - (What))) < (Range)) /* * This function keeps the 'mouse' info up to date, * and reacts to mouse buttons appropriately. */ static void sdl_HandleMouseEvent(SDL_Event *event) { term *old = Term; term_window *win; switch (event->type) { /* Mouse moved */ case SDL_MOUSEMOTION: { mouse.x = event->motion.x; mouse.y = event->motion.y; win = &windows[SelectedTerm]; /* We are moving a window */ if (Moving) { int i; /* Move the window */ win->left = (mouse.x - Movingx); win->top = (mouse.y - Movingy); /* Left bounds check */ if (win->left < 0) { win->left = 0; Movingx = mouse.x; } /* Right bounds check */ if ((win->left + win->width) > AppWin->w) { win->left = AppWin->w - win->width; Movingx = mouse.x - win->left; } /* Top bounds check */ if (win->top < StatusHeight) { win->top = StatusHeight; Movingy = mouse.y - win->top; } /* Bottom bounds check */ if ((win->top + win->height) > AppWin->h) { win->top = AppWin->h - win->height; Movingy = mouse.y - win->top; } for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *snapper = &windows[i]; /* Can't snap to self... */ if (i == SelectedTerm) continue; /* Can't snap to the invisible */ if (!snapper->visible) continue; /* Check the windows are across from each other */ if ((snapper->top < win->top + win->height) && (win->top < snapper->top + snapper->height)) { /* Lets try to the left... */ if (closeto(win->left, snapper->left + snapper->width, SnapRange)) { win->left = snapper->left + snapper->width; Movingx = mouse.x - win->left; } /* Maybe to the right */ if (closeto(win->left + win->width, snapper->left, SnapRange)) { win->left = snapper->left - win->width; Movingx = mouse.x - win->left; } } /* Check the windows are above/below each other */ if ((snapper->left < win->left + win->width) && (win->left < snapper->left + snapper->width)) { /* Lets try to the top... */ if (closeto(win->top, snapper->top + snapper->height, SnapRange)) { win->top = snapper->top + snapper->height; Movingy = mouse.y - win->top; } /* Maybe to the bottom */ if (closeto(win->top + win->height, snapper->top, SnapRange)) { win->top = snapper->top - win->height; Movingy = mouse.y - win->top; } } } /* Show on the screen */ sdl_BlitAll(); } /* A window is being re-sized */ else if (Sizing) { /* Adjust the sizing rectangle */ SizingRect.w = win->width - win->left + (mouse.x - Movingx); SizingRect.h = win->height - win->top + (mouse.y - Movingy); /* XXX - The main window can't be too small */ if (SelectedTerm == 0) { int minwidth = (win->tile_wid * 80) + 2 * win->border; int minheight = (win->tile_hgt * 24) + win->border + win->title_height; if (SizingRect.w < minwidth) SizingRect.w = minwidth; if (SizingRect.h < minheight) SizingRect.h = minheight; } /* Show on the screen */ sdl_BlitAll(); } else if (!popped) { /* Have a look for the corner stuff */ if (point_in(&SizingSpot, mouse.x, mouse.y)) { if (!Sizingshow) { /* Indicate the hotspot */ Sizingshow = TRUE; DrawSizeWidget(); } } else if (Sizingshow) { SDL_Rect rc; Sizingshow = FALSE; RECT(win->width - 10, win->height - 10, 10, 10, &rc); set_update_rect(win, &rc); sdl_BlitWin(win); } } break; } /* A button has been pressed */ case SDL_MOUSEBUTTONDOWN: { sdl_Window *window; bool res; int idx = sdl_LocateWin(mouse.x, mouse.y); if (event->button.button == SDL_BUTTON_LEFT) { bool just_gained_focus = FALSE; mouse.left = 1; mouse.leftx = event->button.x; mouse.lefty = event->button.y; /* Pop up window gets priority */ if (popped) window = &PopUp; else window = &StatusBar; /* React to a button press */ res = sdl_ButtonBankMouseDown(&window->buttons, mouse.x - window->left, mouse.y - window->top); /* If pop-up window active and no reaction then cancel the popup */ if (popped && !res) { RemovePopUp(); break; } /* Has this mouse press been handled */ if (res) break; /* Is the mouse press in a term_window? */ if (idx < 0) break; /* The 'focused' window has changed */ if (idx != SelectedTerm) { TermFocus(idx); just_gained_focus = TRUE; } /* A button press has happened on the focused term window */ win = &windows[idx]; /* Check for mouse press in the title bar */ if (mouse.y < win->top + win->title_height) { /* Let's get moving */ Moving = TRUE; /* BringToTop(idx); */ /* Remember where we started */ Movingx = mouse.x - win->left; Movingy = mouse.y - win->top; } /* Check for the little hotspot in the botton right corner */ else if (point_in(&SizingSpot, mouse.x, mouse.y)) { /* Let's get sizing */ Sizing = TRUE; /* Create the sizing rectangle */ RECT(win->left, win->top, win->width, win->height, &SizingRect); /* Remember where we started */ Movingx = mouse.x - win->left; Movingy = mouse.y - win->top; } /* Signal a mouse press to angband (only if the window is already focused) */ else if (!just_gained_focus) { if (win->visible) { /* Calculate the 'cell' coords */ int x = (mouse.x - win->left - win->border) / win->tile_wid; int y = (mouse.y - win->top - win->title_height) / win->tile_hgt; /* Send the mousepress to the appropriate term */ Term_activate(angband_term[idx]); Term_mousepress(x, y, 1); Term_activate(old); } } } /* Process right mouse button */ else if (event->button.button == SDL_BUTTON_RIGHT) { mouse.right = 1; mouse.rightx = event->button.x; mouse.righty = event->button.y; /* Right-click always cancels the popup */ if (popped) { popped = FALSE; } /* See if it's inside a term_window */ else if (idx != -1) { int x, y; win = &windows[idx]; /* Calculate the 'cell' coords */ x = (mouse.x - win->left - win->border) / win->tile_wid; y = (mouse.y - win->top - win->title_height) / win->tile_hgt; /* Bounds check */ if ((x >= 0) && (y >= 0) && (x < win->cols) && (y < win->rows)) { /* Send the mousepress to the appropriate term */ Term_activate(angband_term[idx]); Term_mousepress(x, y, 2); Term_activate(old); } } } break; } case SDL_MOUSEBUTTONUP: { /* Handle release of left button */ if (event->button.button == SDL_BUTTON_LEFT) { sdl_Window *window; bool res; mouse.left = 0; /* Pop up window gets priority */ if (popped) window = &PopUp; else window = &StatusBar; /* React to a button release */ res = sdl_ButtonBankMouseUp(&window->buttons, mouse.x - window->left, mouse.y - window->top); /* Cancel popup */ if (popped && !res) { RemovePopUp(); } /* Finish moving */ if (Moving) { Moving = FALSE; /* Update */ sdl_BlitAll(); } /* Finish sizing */ if (Sizing) { /* Sort out the window */ ResizeWin(&windows[SelectedTerm], SizingRect.w, SizingRect.h); Sizing = FALSE; /* Update */ sdl_BlitAll(); } } else if (event->button.button == SDL_BUTTON_RIGHT) { mouse.right = 0; } break; } } } /* * Handle keypresses. * * We treat left and right modifier keys as equivalent. * We ignore any key without a valid SDLK index. */ static void sdl_keypress(SDL_keysym keysym) { u16b key_code = keysym.unicode; SDLKey key_sym = keysym.sym; int ch = 0; /* Store the value of various modifier keys */ bool mc = (keysym.mod & KMOD_CTRL) > 0; bool ms = (keysym.mod & KMOD_SHIFT) > 0; bool ma = (keysym.mod & KMOD_ALT) > 0; bool mm = (keysym.mod & KMOD_META) > 0; bool kp = FALSE; byte mods = (ma ? KC_MOD_ALT : 0) | (mm ? KC_MOD_META : 0); /* Ignore if main term is not initialized */ if (!Term) return; /* Handle all other valid SDL keys */ switch (key_sym) { /* keypad */ case SDLK_KP0: ch = '0'; kp = TRUE; break; case SDLK_KP1: ch = '1'; kp = TRUE; break; case SDLK_KP2: ch = '2'; kp = TRUE; break; case SDLK_KP3: ch = '3'; kp = TRUE; break; case SDLK_KP4: ch = '4'; kp = TRUE; break; case SDLK_KP5: ch = '5'; kp = TRUE; break; case SDLK_KP6: ch = '6'; kp = TRUE; break; case SDLK_KP7: ch = '7'; kp = TRUE; break; case SDLK_KP8: ch = '8'; kp = TRUE; break; case SDLK_KP9: ch = '9'; kp = TRUE; break; case SDLK_KP_PERIOD: ch = '.'; kp = TRUE; break; case SDLK_KP_DIVIDE: ch = '/'; kp = TRUE; break; case SDLK_KP_MULTIPLY: ch = '*'; kp = TRUE; break; case SDLK_KP_MINUS: ch = '-'; kp = TRUE; break; case SDLK_KP_PLUS: ch = '+'; kp = TRUE; break; case SDLK_KP_ENTER: ch = '\n'; kp = TRUE; break; case SDLK_KP_EQUALS: ch = '='; kp = TRUE; break; /* have have these to get consistent ctrl-shift behaviour */ case SDLK_0: if (!ms || mc || ma) ch = '0'; break; case SDLK_1: if (!ms || mc || ma) ch = '1'; break; case SDLK_2: if (!ms || mc || ma) ch = '2'; break; case SDLK_3: if (!ms || mc || ma) ch = '3'; break; case SDLK_4: if (!ms || mc || ma) ch = '4'; break; case SDLK_5: if (!ms || mc || ma) ch = '5'; break; case SDLK_6: if (!ms || mc || ma) ch = '6'; break; case SDLK_7: if (!ms || mc || ma) ch = '7'; break; case SDLK_8: if (!ms || mc || ma) ch = '8'; break; case SDLK_9: if (!ms || mc || ma) ch = '9'; break; case SDLK_UP: ch = ARROW_UP; break; case SDLK_DOWN: ch = ARROW_DOWN; break; case SDLK_RIGHT: ch = ARROW_RIGHT; break; case SDLK_LEFT: ch = ARROW_LEFT; break; case SDLK_INSERT: ch = KC_INSERT; break; case SDLK_HOME: ch = KC_HOME; break; case SDLK_PAGEUP: ch = KC_PGUP; break; case SDLK_DELETE: ch = KC_DELETE; break; case SDLK_END: ch = KC_END; break; case SDLK_PAGEDOWN: ch = KC_PGDOWN; break; case SDLK_F1: ch = KC_F1; break; case SDLK_F2: ch = KC_F2; break; case SDLK_F3: ch = KC_F3; break; case SDLK_F4: ch = KC_F4; break; case SDLK_F5: ch = KC_F5; break; case SDLK_F6: ch = KC_F6; break; case SDLK_F7: ch = KC_F7; break; case SDLK_F8: ch = KC_F8; break; case SDLK_F9: ch = KC_F9; break; case SDLK_F10: ch = KC_F10; break; case SDLK_F11: ch = KC_F11; break; case SDLK_F12: ch = KC_F12; break; case SDLK_F13: ch = KC_F13; break; case SDLK_F14: ch = KC_F14; break; case SDLK_F15: ch = KC_F15; break; default: break; } if (ch) { if (kp) mods |= KC_MOD_KEYPAD; if (mc) mods |= KC_MOD_CONTROL; if (ms) mods |= KC_MOD_SHIFT; Term_keypress(ch, mods); } else if (key_code) { /* If the keycode is 7-bit ASCII (except numberpad) send * directly to the game. */ if (mc && (key_sym == SDLK_TAB || key_sym == SDLK_RETURN || key_sym == SDLK_BACKSPACE || MODS_INCLUDE_CONTROL(key_code))) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(key_code)) mods |= KC_MOD_SHIFT; Term_keypress(key_code, mods); } } static void init_windows(void); static void init_morewindows(void); /* * Handle a single message sent to the application. * * Functions that are either called from a separate thread or which need to * create a separate thread (such as sounds) need to pass messages to this * function in order to execute most operations. See the useage of * "SDL_USEREVENT". */ static errr sdl_HandleEvent(SDL_Event *event) { /* Handle message */ switch (event->type) { /* Keypresses */ case SDL_KEYDOWN: { /* Handle keypress */ sdl_keypress(event->key.keysym); break; } case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { /* Handle mouse stuff */ sdl_HandleMouseEvent(event); break; } case SDL_MOUSEMOTION: { int i; SDL_Event events[10]; /* * If there are a bundle of mouse movements pending, * we'll just take every tenth one - this makes a * simple approach to dragging practical, for instance. */ i = SDL_PeepEvents(events, 10, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)); if (i > 0) { *event = events[i - 1]; } /* Handle mouse stuff */ sdl_HandleMouseEvent(event); break; } /* Shut down the game */ /* XXX - check for stuck inside menu etc... */ case SDL_QUIT: { /* We are playing a game with an active character */ if (character_generated && inkey_flag) { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } save_prefs(); quit(NULL); break; } /* Resize the application */ case SDL_VIDEORESIZE: { /* Free the surface */ SDL_FreeSurface(AppWin); if (!fullscreen) { /* Make sure */ vflags &= ~(SDL_FULLSCREEN); vflags |= SDL_RESIZABLE; screen_w = event->resize.w; screen_h = event->resize.h; if (screen_w < 640) screen_w = 640; if (screen_h < 480) screen_h = 480; /* Resize the application surface */ AppWin = SDL_SetVideoMode(screen_w, screen_h, 0, vflags); } else { /* Make sure */ vflags |= SDL_FULLSCREEN; vflags &= ~(SDL_RESIZABLE); AppWin = SDL_SetVideoMode(full_w, full_h, 0, vflags); } init_morewindows(); init_windows(); break; } case WINDOW_DRAW: { /* Redraw window that have asked */ sdl_Window *window = (sdl_Window*)event->user.data1; sdl_WindowBlit(window); break; } default: { /* Do nothing */ break; } } sdl_WindowUpdate(&StatusBar); sdl_WindowUpdate(&PopUp); return (0); } /* * Update the redraw rect * A simple but effective way to keep track of what * parts of a window need to updated. * Any new areas that are updated before a blit are simply combined * into a new larger rectangle to encompass all changes. */ static void set_update_rect(term_window *win, SDL_Rect *rc) { /* No outstanding update areas yet? */ if (win->uRect.x == -1) { /* Simple copy */ win->uRect = *rc; } else { /* Combine the old update area with the new */ int x = MIN(win->uRect.x, rc->x); int y = MIN(win->uRect.y, rc->y); int x2 = MAX(win->uRect.x + win->uRect.w, rc->x + rc->w); int y2 = MAX(win->uRect.y + win->uRect.h, rc->y + rc->h); RECT(x, y, x2 - x, y2 - y, &win->uRect); } } /* * Clear a terminal window */ static errr Term_xtra_sdl_clear(void) { term_window *win = (term_window*)(Term->data); SDL_Rect rc; /* Oops */ if (!win->surface) return (1); /* Create the fill area */ RECT(win->border, win->title_height, win->width - (2 * win->border), win->height - win->border - win->title_height, &rc); /* Fill the rectangle */ SDL_FillRect(win->surface, &rc, back_colour); /* Rectangle to update */ set_update_rect(win, &rc); /* Success */ return (0); } /* * Process at least one event */ static errr Term_xtra_sdl_event(int v) { SDL_Event event; errr error = 0; /* Wait for an event */ if (v) { /* Wait in 0.02s increments while updating animations every 0.2s */ int i = 0; while (!SDL_PollEvent(&event)) { if (i == 0) idle_update(); usleep(20000); i = (i + 1) % 10; } /* Handle it */ error = sdl_HandleEvent(&event); } /* Check for an event */ else { /* Get a single pending event */ if (SDL_PollEvent(&event)) { /* Handle it */ error = sdl_HandleEvent(&event); } } /* Note success or failure */ return (error); } /* * Process all pending events */ static errr Term_xtra_sdl_flush(void) { SDL_Event event; /* Get all pending events */ while (SDL_PollEvent(&event)) { /* Handle them (ignore errors) */ (void)sdl_HandleEvent(&event); } /* Done */ return (0); } /* * Delay for "x" milliseconds */ static errr Term_xtra_sdl_delay(int v) { /* Sleep */ if (v > 0) { Term_xtra_sdl_event(0); SDL_Delay(v); } /* Success */ return (0); } static errr Term_bigcurs_sdl(int col, int row) { term_window *win = (term_window*)(Term->data); Uint32 colour = text_colours[TERM_YELLOW]; SDL_Rect rc; /* Make a rectangle */ RECT(col * win->tile_wid, row * win->tile_hgt, win->tile_wid * tile_width, win->tile_hgt * tile_height, &rc); /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Draw it */ sdl_DrawBox(win->surface, &rc, colour, 1); /* Update area */ set_update_rect(win, &rc); /* Success */ return (0); } static errr Term_curs_sdl(int col, int row) { term_window *win = (term_window*)(Term->data); Uint32 colour = text_colours[TERM_YELLOW]; SDL_Rect rc; /* Make a rectangle */ RECT(col * win->tile_wid, row * win->tile_hgt, win->tile_wid, win->tile_hgt, &rc); /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Draw it */ sdl_DrawBox(win->surface, &rc, colour, 1); /* Update area */ set_update_rect(win, &rc); /* Success */ return (0); } static errr Term_xtra_sdl(int n, int v) { switch (n) { /* Process an event */ case TERM_XTRA_EVENT: { return (Term_xtra_sdl_event(v)); } /* Flush all events */ case TERM_XTRA_FLUSH: { return (Term_xtra_sdl_flush()); } /* Clear the screen */ case TERM_XTRA_CLEAR: { return (Term_xtra_sdl_clear()); } /* Show or hide the cursor */ case TERM_XTRA_SHAPE: { int x, y; /* Obtain the cursor */ (void)Term_locate(&x, &y); /* Show or hide the cursor */ Term_curs_sdl(x, y); return (0); } case TERM_XTRA_FRESH: { /* Get the current window data */ term_window *win = (term_window*)(Term->data); /* Blat it! */ sdl_BlitWin(win); /* Done */ return (0); } case TERM_XTRA_DELAY: { return (Term_xtra_sdl_delay(v)); } case TERM_XTRA_REACT: { int i; /* Re-initialize the colours */ for (i = 0; i < MAX_COLORS; i++) { text_colours[i] = SDL_MapRGB(AppWin->format, angband_color_table[i][1], angband_color_table[i][2], angband_color_table[i][3]); } } } return (1); } static errr Term_wipe_sdl(int col, int row, int n) { term_window *win = (term_window*)(Term->data); SDL_Rect rc; /* Build the area to black out */ rc.x = col * win->tile_wid; rc.y = row * win->tile_hgt; rc.w = win->tile_wid * n; rc.h = win->tile_hgt; /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Wipe it */ SDL_FillRect(win->surface, &rc, back_colour); /* Update */ set_update_rect(win, &rc); return (0); } /* * Given a position in the ISO Latin-1 character set, return * the correct character on this system. */ static byte Term_xchar_sdl(byte c) { /* The Sdl port uses the Latin-1 standard */ return (c); } /* * Draw some text to a window */ static errr Term_text_sdl(int col, int row, int n, byte a, const char *s) { term_window *win = (term_window*)(Term->data); Uint32 colour = text_colours[a]; int x = col * win->tile_wid; int y = row * win->tile_hgt; /* Translate */ x += win->border; y += win->title_height; /* Not much point really... */ if (!win->visible) return (0); /* Clear the way */ Term_wipe_sdl(col, row, n); /* Draw it */ return (sdl_FontDraw(&win->font, win->surface, colour, x, y, n, s)); } #ifdef USE_GRAPHICS /* * Do a 'stretched blit' * SDL has no support for stretching... What a bastard! * */ static void sdl_StretchBlit(SDL_Surface *src, SDL_Rect *srcRect, SDL_Surface *dest, SDL_Rect *destRect) { int x, y; int sx, sy, dx, dy; Uint8 *ps, *pd; for (y = 0; y < destRect->h; y++) { for (x = 0; x < destRect->w; x++) { /* Actual source coords */ sx = (srcRect->w * x / (destRect->w)) + srcRect->x; sy = (srcRect->h * y / (destRect->h)) + srcRect->y; /* Find a source pixel */ ps = (Uint8 *)src->pixels + (sx * src->format->BytesPerPixel) + (sy * src->pitch); #if 0 /* Do we need to draw it? */ switch (src->format->BytesPerPixel) { case 1: { if (*ps == src->format->colorkey) continue; break; } case 2: { Uint16 *ps16 = (Uint16*) ps; if (*ps16 == src->format->colorkey) continue; break; } case 3: case 4: { Uint32 *ps32 = (Uint32*) ps; if (*ps32 == src->format->colorkey) continue; break; } } #endif /* Actual destination pixel coords */ dx = x + destRect->x; dy = y + destRect->y; /* Destination pixel */ pd = (Uint8 *)dest->pixels + (dx * dest->format->BytesPerPixel) + (dy * dest->pitch); switch (dest->format->BytesPerPixel) { case 1: { *pd = *ps; break; } case 2: { Uint16 *ps16 = (Uint16*) ps; Uint16 *pd16 = (Uint16*) pd; *pd16 = *ps16; break; } case 3: case 4: { Uint32 *ps32 = (Uint32*) ps; Uint32 *pd32 = (Uint32*) pd; *pd32 = *ps32; } } } } } /* * Make the 'pre-stretched' tiles for this window * Assumes the tiles surface was freed elsewhere */ static errr sdl_BuildTileset(term_window *win) { int x, y; int ta, td; int xx, yy; GfxInfo *info = &GfxDesc[use_graphics]; if (!use_graphics) return (1); /* Calculate the number of tiles across & down*/ ta = GfxSurface->w / info->width; td = GfxSurface->h / info->height; /* Calculate the size of the new surface */ x = ta * win->tile_wid * tile_width; y = td * win->tile_hgt * tile_height; /* Make it */ win->tiles = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, GfxSurface->format->BitsPerPixel, GfxSurface->format->Rmask, GfxSurface->format->Gmask, GfxSurface->format->Bmask, GfxSurface->format->Amask); /* Bugger */ if (!win->tiles) return (1); /* For every tile... */ for (xx = 0; xx < ta; xx++) { for (yy = 0; yy < td; yy++) { SDL_Rect src, dest; int dwid = win->tile_wid * tile_width; int dhgt = win->tile_hgt * tile_height; /* Source rectangle (on GfxSurface) */ RECT(xx * info->width, yy * info->height, info->width, info->height, &src); /* Destination rectangle (win->tiles) */ RECT(xx * dwid, yy * dhgt, dwid, dhgt, &dest); /* Do the stretch thing */ sdl_StretchBlit(GfxSurface, &src, win->tiles, &dest); } } return (0); } #endif /* * Put some gfx on the screen * XXX - This function _never_ seems to get called with n > 1 ? * This needs improvement... */ static errr Term_pict_sdl(int col, int row, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) { #ifdef USE_GRAPHICS /* Get the right window */ term_window *win = (term_window*)(Term->data); SDL_Rect rc, src; int i, j; /* First time a pict is requested we load the tileset in */ if (!win->tiles) { sdl_BuildTileset(win); if (!win->tiles) return (1); } /* Make the destination rectangle */ RECT(col * win->tile_wid, row * win->tile_hgt, win->tile_wid, win->tile_hgt, &rc); /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Stretch for bigtile mode */ rc.w *= tile_width; rc.h *= tile_height; /* Get the dimensions of the graphic surface */ src.w = rc.w; src.h = rc.h; /* Clear the way */ for (i = 0; i < tile_width; i++) for (j = 0; j < tile_height; j++) Term_wipe_sdl(col + i, row + j, n); /* Blit 'em! (it) */ for (i = 0; i < n; i++) { /* Get the terrain tile */ src.x = (tcp[i] & 0x7F) * src.w; src.y = (tap[i] & 0x7F) * src.h; SDL_BlitSurface(win->tiles, &src, win->surface, &rc); /* If foreground is the same as background, we're done */ if ((tap[i] == ap[i]) && (tcp[i] == cp[i])) continue; /* Get the foreground tile */ src.x = (cp[i] & 0x7F) * src.w; src.y = (ap[i] & 0x7F) * src.h; SDL_BlitSurface(win->tiles, &src, win->surface, &rc); } /* Update area */ set_update_rect(win, &rc); #endif return (0); } /* * Create and initialize the Term contined within this window. */ static void term_data_link_sdl(term_window *win) { term *t = &win->term_data; /* Initialize the term */ term_init(t, win->cols, win->rows, win->keys); t->higher_pict = TRUE; /* Use a "software" cursor */ t->soft_cursor = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; /* Never refresh one row */ t->never_frosh = TRUE; /* Ignore the init/nuke hooks */ /* Prepare the template hooks */ t->xtra_hook = Term_xtra_sdl; t->curs_hook = Term_curs_sdl; t->bigcurs_hook = Term_bigcurs_sdl; t->wipe_hook = Term_wipe_sdl; t->text_hook = Term_text_sdl; t->pict_hook = Term_pict_sdl; t->xchar_hook = Term_xchar_sdl; /* Remember where we came from */ t->data = win; } /* * Initialize the status bar: * Populate it with some buttons * Set the custom draw function for the bar */ static void init_morewindows(void) { char buf[128]; sdl_Button *button; int x; popped = FALSE; /* Make sure */ sdl_WindowFree(&PopUp); /* Initialize the status bar */ sdl_WindowInit(&StatusBar, AppWin->w, StatusHeight, AppWin, DEFAULT_FONT_FILE); /* Cusom drawing function */ StatusBar.draw_extra = draw_statusbar; AboutSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, AboutSelect); my_strcpy(buf, format("%s %s", VERSION_NAME, VERSION_STRING), sizeof(buf)); /* Initialize the 'about' button */ sdl_ButtonSize(button, StatusBar.font.width * strlen(buf) + 5, StatusHeight - 2); sdl_ButtonMove(button, 1, 1); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, buf); button->activate = AboutActivate; /* New button */ TermSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, TermSelect); /* Initialize the 'term' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); x = 100 + (StatusBar.font.width * 5); sdl_ButtonMove(button, x, 1); sdl_ButtonVisible(button, TRUE); button->activate = TermActivate; /* Another new button */ VisibleSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, VisibleSelect); /* Initialize the 'visible' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); x = 200 + (StatusBar.font.width * 8); sdl_ButtonMove(button, x, 1); sdl_ButtonVisible(button, TRUE); button->activate = VisibleActivate; /* Another new button */ FontSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, FontSelect); /* Initialize the 'font_select' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); sdl_ButtonMove(button, 400, 1); button->activate = FontActivate; /* Another new button */ MoreSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, MoreSelect); /* Initialize the 'more' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); sdl_ButtonMove(button, 400, 1); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, "Options"); button->activate = MoreActivate; /* Another new button */ QuitSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, QuitSelect); /* Initialize the 'quit' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); sdl_ButtonMove(button, AppWin->w - 61, 1); sdl_ButtonCaption(button, "Quit"); button->activate = QuitActivate; sdl_ButtonVisible(button, TRUE); SetStatusButtons(); TermFocus(0); } #ifdef USE_GRAPHICS /* * The new streamlined graphics loader. * Only uses colour keys. * Much more tolerant of different bit-planes */ static errr load_gfx(void) { char buf[1024]; const char *filename = GfxDesc[use_graphics].gfxfile; SDL_Surface *temp; /* This may be called when GRAPHICS_NONE is set */ if (!filename) return (0); /* Free the old surface */ if (GfxSurface) SDL_FreeSurface(GfxSurface); /* Find and load the file into a temporary surface */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, filename); temp = IMG_Load(buf); if (!temp) return (1); /* Change the surface type to the current video surface format */ GfxSurface = SDL_DisplayFormatAlpha(temp); /* Make sure we know what pref file to use */ ANGBAND_GRAF = GfxDesc[use_graphics].pref; /* Reset the graphics mapping for this tileset */ if (character_dungeon) reset_visuals(TRUE); /* All good */ return (0); } #endif /* * Initialize the graphics */ static void init_gfx(void) { #ifndef USE_GRAPHICS /* User requested gfx but USE_GRAPHICS not defined... */ if (arg_graphics) { arg_graphics = FALSE; } /* Make sure */ use_graphics = GRAPHICS_NONE; tile_width = 1; tile_height = 1; #else GfxInfo *info = &GfxDesc[use_graphics]; int i; /* Check for existence of required files */ for (i = 0; i < GfxModes; i++) { char path[1024]; /* Check the graphic file */ if (GfxDesc[i].gfxfile) { path_build(path, sizeof(path), ANGBAND_DIR_XTRA_GRAF, GfxDesc[i].gfxfile); if (!file_exists(path)) { plog_fmt("Can't find file %s - graphics mode '%s' will be disabled.", path, GfxDesc[i].name); GfxDesc[i].avail = FALSE; } } } /* Check availability (default to no graphics) */ if (!info->avail) { use_graphics = GRAPHICS_NONE; arg_graphics = FALSE; tile_width = 1; tile_height = 1; } /* Load the graphics stuff in */ load_gfx(); #endif } /* * Create the windows * Called sometime after load_prefs() */ static void init_windows(void) { int i; for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[i]; /* Only bother with visible windows */ if (win->visible) { /* Don't crowd out the status bar... */ if (win->top < StatusHeight) win->top = StatusHeight; #ifdef USE_GRAPHICS /* Invalidate the gfx surface */ if (win->tiles) { SDL_FreeSurface(win->tiles); win->tiles = NULL; } #endif /* This will set up the window correctly */ ResizeWin(win, win->width, win->height); } else { /* Doesn't exist */ angband_term[i] = NULL; } /* Term 0 is at the top */ Zorder[i] = ANGBAND_TERM_MAX - i - 1; } /* Good to go... */ Term_activate(term_screen); } /* * Set up some SDL stuff * */ static void init_sdl_local(void) { const SDL_VideoInfo *VideoInfo; int i; int h, w; char path[1024]; /* Get information about the video hardware */ VideoInfo = SDL_GetVideoInfo(); /* Require at least 256 colors */ if (VideoInfo->vfmt->BitsPerPixel < 8) quit(format("This %s port requires lots of colors.", VERSION_NAME)); full_w = VideoInfo->current_w; full_h = VideoInfo->current_h; /* Use a software surface - A tad inefficient, but stable... */ vflags |= SDL_SWSURFACE; /* Set fullscreen flag */ if (fullscreen) vflags |= SDL_FULLSCREEN; /* otherwise we make this surface resizable */ else vflags |= SDL_RESIZABLE; /* Create the main window */ AppWin = SDL_SetVideoMode(fullscreen ? full_w : screen_w,fullscreen ? full_h : screen_h, 0, vflags); /* Handle failure */ if (!AppWin) quit(format("Failed to create %dx%d window at %d bpp!", screen_w, screen_h, VideoInfo->vfmt->BitsPerPixel)); /* Set the window caption */ SDL_WM_SetCaption(VERSION_NAME, NULL); /* Enable key repeating; use defaults */ (void)SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); /* Enable Unicode (so we can read key codes) */ (void)SDL_EnableUNICODE(1); /* Build a color for "black" that matches the pixel depth of this surface */ back_colour = SDL_MapRGB(AppWin->format, angband_color_table[TERM_DARK][1], angband_color_table[TERM_DARK][2], angband_color_table[TERM_DARK][3]); /* Initialize the colours */ for (i = 0; i < MAX_COLORS; i++) { text_colours[i] = SDL_MapRGB(AppWin->format, angband_color_table[i][1], angband_color_table[i][2], angband_color_table[i][3]); } /* Get the height of the status bar */ sdl_CheckFont(DEFAULT_FONT_FILE, &w, &h); StatusHeight = h + 3; /* Font used for window titles */ sdl_FontCreate(&SystemFont, DEFAULT_FONT_FILE, AppWin); /* Get the icon for display in the About box */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_ICON, "att-128.png"); if (file_exists(path)) mratt = IMG_Load(path); } /** * Font sorting function * * Orders by width, then height, then face */ static int cmp_font(const void *f1, const void *f2) { const char *font1 = *(const char **)f1; const char *font2 = *(const char **)f2; int height1, height2; int width1, width2; char face1[5], face2[5]; sscanf(font1, "%dx%d%4s.", &width1, &height1, face1); sscanf(font2, "%dx%d%4s.", &width2, &height2, face2); if (width1 < width2) return -1; else if (width1 > width2) return 1; else { if (height1 < height2) return -1; else if (height1 > height2) return 1; else return strcmp(face1, face2); } } /** * This function is now mis-named as paths are set correctly by init_stuff() * in main.c before init_sdl calls this. But it still does some other stuff. */ static void init_paths(void) { int i; char path[1024]; char buf[1024]; ang_dir *dir; /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT_FILE); /* Hack -- Validate the basic font */ validate_file(path); for (i = 0; i < MAX_FONTS; i++) FontList[i] = NULL; /** Scan for fonts **/ /* Open the directory */ dir = my_dopen(ANGBAND_DIR_XTRA_FONT); if (!dir) return; /* Read every font to the limit */ while (my_dread(dir, buf, sizeof buf)) { /* Check for file extension */ if (suffix(buf, ".fon")) FontList[num_fonts++] = string_make(buf); /* Don't grow to long */ if (num_fonts == MAX_FONTS) break; } sort(FontList, num_fonts, sizeof(FontList[0]), cmp_font); /* Done */ my_dclose(dir); } const char help_sdl[] = "SDL frontend"; /* * The SDL port's "main()" function. */ int init_sdl(int argc, char *argv[]) { /* Initialize SDL: Timer, video, and audio functions */ if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); return (2); } /* Initialize the TTF library */ if (TTF_Init() < 0) { fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError()); SDL_Quit(); return (2); } /* Init some extra paths */ init_paths(); /* Load prefs */ load_prefs(); /* Get sdl going */ init_sdl_local(); /* Prepare the windows */ init_windows(); /* Prepare the gfx */ init_gfx(); /* Prepare some more windows(!) */ init_morewindows(); /* Activate quit hook */ quit_aux = hook_quit; /* Paranoia */ return (0); } #endif /* USE_SDL */ angband-v3.3.2/src/trap.h0000644000175000017500000000036311651552410014517 0ustar chriscchrisc/* trap.h - trap interface */ #ifndef TRAP_H #define TRAP_H bool trap_check_hit(int power); extern void hit_trap(int y, int x); extern void pick_trap(int y, int x); extern void place_trap(struct cave *c, int y, int x); #endif /* !TRAP_H */ angband-v3.3.2/src/trap.c0000644000175000017500000000552611651552410014520 0ustar chriscchrisc/* * File: trap.c * Purpose: Trap triggering, selection, and placement * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "effects.h" #include "spells.h" #include "trap.h" /* * Determine if a trap affects the player. * Always miss 5% of the time, Always hit 5% of the time. * Otherwise, match trap power against player armor. */ bool trap_check_hit(int power) { return test_hit(power, p_ptr->state.ac + p_ptr->state.to_a, TRUE); } /* * Hack -- instantiate a trap * * XXX XXX XXX This routine should be redone to reflect trap "level". * That is, it does not make sense to have spiked pits at 50 feet. * Actually, it is not this routine, but the "trap instantiation" * code, which should also check for "trap doors" on quest levels. */ void pick_trap(int y, int x) { int feat; static const int min_level[] = { 2, /* Trap door */ 2, /* Open pit */ 2, /* Spiked pit */ 2, /* Poison pit */ 3, /* Summoning rune */ 1, /* Teleport rune */ 2, /* Fire rune */ 2, /* Acid rune */ 2, /* Slow rune */ 6, /* Strength dart */ 6, /* Dexterity dart */ 6, /* Constitution dart */ 2, /* Gas blind */ 1, /* Gas confuse */ 2, /* Gas poison */ 2, /* Gas sleep */ }; /* Paranoia */ if (cave->feat[y][x] != FEAT_INVIS) return; /* Pick a trap */ while (1) { /* Hack -- pick a trap */ feat = FEAT_TRAP_HEAD + randint0(16); /* Check against minimum depth */ if (min_level[feat - FEAT_TRAP_HEAD] > p_ptr->depth) continue; /* Hack -- no trap doors on quest levels */ if ((feat == FEAT_TRAP_HEAD + 0x00) && is_quest(p_ptr->depth)) continue; /* Hack -- no trap doors on the deepest level */ if ((feat == FEAT_TRAP_HEAD + 0x00) && (p_ptr->depth >= MAX_DEPTH-1)) continue; /* Done */ break; } /* Activate the trap */ cave_set_feat(cave, y, x, feat); } /* Places a trap. All traps are untyped until discovered. */ void place_trap(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); assert(cave_isempty(c, y, x)); /* Place an invisible trap */ cave_set_feat(c, y, x, FEAT_INVIS); } /* * Handle player hitting a real trap */ void hit_trap(int y, int x) { bool ident; struct feature *trap = &f_info[cave->feat[y][x]]; /* Disturb the player */ disturb(p_ptr, 0, 0); /* Run the effect */ effect_do(trap->effect, &ident, FALSE, 0, 0, 0); } angband-v3.3.2/src/cmd1.c0000644000175000017500000004047211651552410014375 0ustar chriscchrisc/* * File: cmd1.c * Purpose: Searching, movement, and pickup * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke, * Copyright (c) 2007 Leon Marrick * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "game-event.h" #include "generate.h" #include "history.h" #include "monster/mon-util.h" #include "monster/mon-timed.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "object/object.h" #include "squelch.h" #include "trap.h" /* * Search for hidden things. Returns true if a search was attempted, returns * false when the player has a 0% chance of finding anything. Prints messages * for negative confirmation when verbose mode is requested. */ bool search(bool verbose) { int py = p_ptr->py; int px = p_ptr->px; int y, x, chance; bool found = FALSE; object_type *o_ptr; /* Start with base search ability */ chance = p_ptr->state.skills[SKILL_SEARCH]; /* Penalize various conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) chance = chance / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) chance = chance / 10; /* Prevent fruitless searches */ if (chance <= 0) { if (verbose) { msg("You can't make out your surroundings well enough to search."); /* Cancel repeat */ disturb(p_ptr, 0, 0); } return FALSE; } /* Search the nearby grids, which are always in bounds */ for (y = (py - 1); y <= (py + 1); y++) { for (x = (px - 1); x <= (px + 1); x++) { /* Sometimes, notice things */ if (randint0(100) < chance) { /* Invisible trap */ if (cave->feat[y][x] == FEAT_INVIS) { found = TRUE; /* Pick a trap */ pick_trap(y, x); /* Message */ msg("You have found a trap."); /* Disturb */ disturb(p_ptr, 0, 0); } /* Secret door */ if (cave->feat[y][x] == FEAT_SECRET) { found = TRUE; /* Message */ msg("You have found a secret door."); /* Pick a door */ place_closed_door(cave, y, x); /* Disturb */ disturb(p_ptr, 0, 0); } /* Scan all objects in the grid */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Skip non-chests */ if (o_ptr->tval != TV_CHEST) continue; /* Skip disarmed chests */ if (o_ptr->pval[DEFAULT_PVAL] <= 0) continue; /* Skip non-trapped chests */ if (!chest_traps[o_ptr->pval[DEFAULT_PVAL]]) continue; /* Identify once */ if (!object_is_known(o_ptr)) { found = TRUE; /* Message */ msg("You have discovered a trap on the chest!"); /* Know the trap */ object_notice_everything(o_ptr); /* Notice it */ disturb(p_ptr, 0, 0); } } } } } if (verbose && !found) { if (chance >= 100) msg("There are no secrets here."); else msg("You found nothing."); } return TRUE; } /*** Pickup ***/ /* * Pickup all gold at the player's current location. */ static void py_pickup_gold(void) { int py = p_ptr->py; int px = p_ptr->px; s32b total_gold = 0L; byte *treasure; s16b this_o_idx = 0; s16b next_o_idx = 0; object_type *o_ptr; int sound_msg; bool verbal = FALSE; /* Allocate an array of ordinary gold objects */ treasure = C_ZNEW(SV_GOLD_MAX, byte); /* Pick up all the ordinary gold objects */ for (this_o_idx = cave->o_idx[py][px]; this_o_idx; this_o_idx = next_o_idx) { /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Ignore if not legal treasure */ if ((o_ptr->tval != TV_GOLD) || (o_ptr->sval >= SV_GOLD_MAX)) continue; /* Note that we have this kind of treasure */ treasure[o_ptr->sval]++; /* Remember whether feedback message is in order */ if (!squelch_item_ok(o_ptr)) verbal = TRUE; /* Increment total value */ total_gold += (s32b)o_ptr->pval[DEFAULT_PVAL]; /* Delete the gold */ delete_object_idx(this_o_idx); } /* Pick up the gold, if present */ if (total_gold) { char buf[1024]; char tmp[80]; int i, count, total; object_kind *kind; /* Build a message */ (void)strnfmt(buf, sizeof(buf), "You have found %ld gold pieces worth of ", (long)total_gold); /* Count the types of treasure present */ for (total = 0, i = 0; i < SV_GOLD_MAX; i++) { if (treasure[i]) total++; } /* List the treasure types */ for (count = 0, i = 0; i < SV_GOLD_MAX; i++) { /* Skip if no treasure of this type */ if (!treasure[i]) continue; /* Get this object index */ kind = lookup_kind(TV_GOLD, i); if (!kind) continue; /* Get the object name */ object_kind_name(tmp, sizeof tmp, kind, TRUE); /* Build up the pickup string */ my_strcat(buf, tmp, sizeof(buf)); /* Added another kind of treasure */ count++; /* Add a comma if necessary */ if ((total > 2) && (count < total)) my_strcat(buf, ",", sizeof(buf)); /* Add an "and" if necessary */ if ((total >= 2) && (count == total-1)) my_strcat(buf, " and", sizeof(buf)); /* Add a space or period if necessary */ if (count < total) my_strcat(buf, " ", sizeof(buf)); else my_strcat(buf, ".", sizeof(buf)); } /* Determine which sound to play */ if (total_gold < 200) sound_msg = MSG_MONEY1; else if (total_gold < 600) sound_msg = MSG_MONEY2; else sound_msg = MSG_MONEY3; /* Display the message */ if (verbal) msgt(sound_msg, "%s", buf); /* Add gold to purse */ p_ptr->au += total_gold; /* Redraw gold */ p_ptr->redraw |= (PR_GOLD); } /* Free the gold array */ FREE(treasure); } /* * Determine if the object can be picked up automatically. */ static bool auto_pickup_okay(const object_type *o_ptr) { if (!inven_carry_okay(o_ptr)) return FALSE; if (OPT(pickup_always) || check_for_inscrip(o_ptr, "=g")) return TRUE; if (OPT(pickup_inven) && inven_stack_okay(o_ptr)) return TRUE; return FALSE; } /* * Carry an object and delete it. */ static void py_pickup_aux(int o_idx, bool domsg) { int slot, quiver_slot = 0; char o_name[80]; object_type *o_ptr = object_byid(o_idx); /* Carry the object */ slot = inven_carry(p_ptr, o_ptr); /* Handle errors (paranoia) */ if (slot < 0) return; /* If we have picked up ammo which matches something in the quiver, note * that it so that we can wield it later (and suppress pick up message) */ if (obj_is_ammo(o_ptr)) { int i; for (i = QUIVER_START; i < QUIVER_END; i++) { if (!p_ptr->inventory[i].kind) continue; if (!object_similar(&p_ptr->inventory[i], o_ptr, OSTACK_QUIVER)) continue; quiver_slot = i; break; } } /* Get the new object */ o_ptr = &p_ptr->inventory[slot]; /* Set squelch status */ p_ptr->notice |= PN_SQUELCH; /* Automatically sense artifacts */ object_sense_artifact(o_ptr); /* Log artifacts if found */ if (o_ptr->artifact) history_add_artifact(o_ptr->artifact, object_is_known(o_ptr), TRUE); /* Optionally, display a message */ if (domsg && !quiver_slot) { /* Describe the object */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You have %s (%c).", o_name, index_to_label(slot)); } /* Update object_idx if necessary */ if (tracked_object_is(0 - o_idx)) { track_object(slot); } /* Delete the object */ delete_object_idx(o_idx); /* If we have a quiver slot that this ammo matches, use it */ if (quiver_slot) wield_item(o_ptr, slot, quiver_slot); } int do_autopickup(void) { int py = p_ptr->py; int px = p_ptr->px; s16b this_o_idx, next_o_idx = 0; object_type *o_ptr; /* Objects picked up. Used to determine time cost of command. */ byte objs_picked_up = 0; size_t floor_num = 0; int floor_list[MAX_FLOOR_STACK + 1]; /* Nothing to pick up -- return */ if (!cave->o_idx[py][px]) return (0); /* Always pickup gold, effortlessly */ py_pickup_gold(); /* Scan the remaining objects */ for (this_o_idx = cave->o_idx[py][px]; this_o_idx; this_o_idx = next_o_idx) { /* Get the object and the next object */ o_ptr = object_byid(this_o_idx); next_o_idx = o_ptr->next_o_idx; /* Ignore all hidden objects and non-objects */ if (squelch_item_ok(o_ptr) || !o_ptr->kind) continue; /* XXX Hack -- Enforce limit */ if (floor_num >= N_ELEMENTS(floor_list)) break; /* Hack -- disturb */ disturb(p_ptr, 0, 0); /* Automatically pick up items into the backpack */ if (auto_pickup_okay(o_ptr)) { /* Pick up the object with message */ py_pickup_aux(this_o_idx, TRUE); objs_picked_up++; continue; } /* Tally objects and store them in an array. */ /* Remember this object index */ floor_list[floor_num] = this_o_idx; /* Count non-gold objects that remain on the floor. */ floor_num++; } return objs_picked_up; } /* * Pick up objects and treasure on the floor. -LM- * * Called with pickup: * 0 to act according to the player's settings * 1 to quickly pickup single objects or present a menu for more * 2 to force a menu for any number of objects * * Scan the list of objects in that floor grid. Pick up gold automatically. * Pick up objects automatically until backpack space is full if * auto-pickup option is on, Otherwise, store objects on * floor in an array, and tally both how many there are and can be picked up. * * If not picking up anything, indicate objects on the floor. Show more * details if the "OPT(pickup_detail)" option is set. Do the same thing if we * don't have room for anything. * * [This paragraph is not true, intentional?] * If we are picking up objects automatically, and have room for at least * one, allow the "OPT(pickup_detail)" option to display information about objects * and prompt the player. Otherwise, automatically pick up a single object * or use a menu for more than one. * * Pick up multiple objects using Tim Baker's menu system. Recursively * call this function (forcing menus for any number of objects) until * objects are gone, backpack is full, or player is satisfied. * * We keep track of number of objects picked up to calculate time spent. * This tally is incremented even for automatic pickup, so we are careful * (in "dungeon.c" and elsewhere) to handle pickup as either a separate * automated move or a no-cost part of the stay still or 'g'et command. * * Note the lack of chance for the character to be disturbed by unmarked * objects. They are truly "unknown". */ byte py_pickup(int pickup) { int py = p_ptr->py; int px = p_ptr->px; s16b this_o_idx = 0; size_t floor_num = 0; int floor_list[MAX_FLOOR_STACK + 1]; size_t i; int can_pickup = 0; bool call_function_again = FALSE; bool domsg = TRUE; /* Objects picked up. Used to determine time cost of command. */ byte objs_picked_up = 0; /* Always pickup gold, effortlessly */ py_pickup_gold(); /* Nothing else to pick up -- return */ if (!cave->o_idx[py][px]) return objs_picked_up; /* Tally objects that can be picked up.*/ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), py, px, 0x03); for (i = 0; i < floor_num; i++) { can_pickup += inven_carry_okay(object_byid(floor_list[i])); } if (!can_pickup) { /* Can't pick up, but probably want to know what's there. */ event_signal(EVENT_SEEFLOOR); return objs_picked_up; } /* Use a menu interface for multiple objects, or pickup single objects */ if (pickup == 1) { if (floor_num > 1) pickup = 2; else this_o_idx = floor_list[0]; } /* Display a list if requested. */ if (pickup == 2) { const char *q, *s; int item; /* Restrict the choices */ item_tester_hook = inven_carry_okay; /* Get an object or exit. */ q = "Get which item?"; s = "You see nothing there."; if (!get_item(&item, q, s, CMD_PICKUP, USE_FLOOR)) return (objs_picked_up); this_o_idx = 0 - item; call_function_again = TRUE; /* With a list, we do not need explicit pickup messages */ domsg = FALSE; } /* Pick up object, if legal */ if (this_o_idx) { /* Pick up the object */ py_pickup_aux(this_o_idx, domsg); /* Indicate an object picked up. */ objs_picked_up = 1; } /* * If requested, call this function recursively. Count objects picked * up. Force the display of a menu in all cases. */ if (call_function_again) objs_picked_up += py_pickup(2); /* Indicate how many objects have been picked up. */ return (objs_picked_up); } /* * Move player in the given direction. * * This routine should only be called when energy has been expended. * * Note that this routine handles monsters in the destination grid, * and also handles attempting to move into walls/doors/rubble/etc. */ void move_player(int dir, bool disarm) { int py = p_ptr->py; int px = p_ptr->px; int y = py + ddy[dir]; int x = px + ddx[dir]; int m_idx = cave->m_idx[y][x]; /* Attack monsters */ if (m_idx > 0) { /* Mimics surprise the player */ if (is_mimicking(m_idx)) { become_aware(m_idx); /* Mimic wakes up */ mon_clear_timed(m_idx, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); } else { py_attack(y, x); } } /* Optionally alter traps/doors on movement */ else if (disarm && (cave->info[y][x] & CAVE_MARK) && (cave_isknowntrap(cave, y, x) || cave_iscloseddoor(cave, y, x))) { /* Auto-repeat if not already repeating */ if (cmd_get_nrepeats() == 0) cmd_set_repeat(99); do_cmd_alter_aux(dir); } /* Cannot walk through walls */ else if (!cave_floor_bold(y, x)) { /* Disturb the player */ disturb(p_ptr, 0, 0); /* Notice unknown obstacles */ if (!(cave->info[y][x] & CAVE_MARK)) { /* Rubble */ if (cave->feat[y][x] == FEAT_RUBBLE) { msgt(MSG_HITWALL, "You feel a pile of rubble blocking your way."); cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } /* Closed door */ else if (cave->feat[y][x] < FEAT_SECRET) { msgt(MSG_HITWALL, "You feel a door blocking your way."); cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } /* Wall (or secret door) */ else { msgt(MSG_HITWALL, "You feel a wall blocking your way."); cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } } /* Mention known obstacles */ else { if (cave->feat[y][x] == FEAT_RUBBLE) msgt(MSG_HITWALL, "There is a pile of rubble blocking your way."); else if (cave->feat[y][x] < FEAT_SECRET) msgt(MSG_HITWALL, "There is a door blocking your way."); else msgt(MSG_HITWALL, "There is a wall blocking your way."); } } /* Normal movement */ else { /* See if trap detection status will change */ bool old_dtrap = ((cave->info2[py][px] & (CAVE2_DTRAP)) != 0); bool new_dtrap = ((cave->info2[y][x] & (CAVE2_DTRAP)) != 0); /* Note the change in the detect status */ if (old_dtrap != new_dtrap) p_ptr->redraw |= (PR_DTRAP); /* Disturb player if the player is about to leave the area */ if (OPT(disturb_detect) && p_ptr->running && !p_ptr->running_firststep && old_dtrap && !new_dtrap) { disturb(p_ptr, 0, 0); return; } /* Move player */ monster_swap(py, px, y, x); /* New location */ y = py = p_ptr->py; x = px = p_ptr->px; /* Searching */ if (p_ptr->searching || (p_ptr->state.skills[SKILL_SEARCH_FREQUENCY] >= 50) || one_in_(50 - p_ptr->state.skills[SKILL_SEARCH_FREQUENCY])) search(FALSE); /* Handle "store doors" */ if ((cave->feat[p_ptr->py][p_ptr->px] >= FEAT_SHOP_HEAD) && (cave->feat[p_ptr->py][p_ptr->px] <= FEAT_SHOP_TAIL)) { /* Disturb */ disturb(p_ptr, 0, 0); cmd_insert(CMD_ENTER_STORE); } /* All other grids (including traps) */ else { /* Handle objects (later) */ p_ptr->notice |= (PN_PICKUP); } /* Discover invisible traps */ if (cave->feat[y][x] == FEAT_INVIS) { /* Disturb */ disturb(p_ptr, 0, 0); /* Message */ msg("You found a trap!"); /* Pick a trap */ pick_trap(y, x); /* Hit the trap */ hit_trap(y, x); } /* Set off an visible trap */ else if (cave_isknowntrap(cave, y, x)) { /* Disturb */ disturb(p_ptr, 0, 0); /* Hit the trap */ hit_trap(y, x); } } p_ptr->running_firststep = FALSE; } angband-v3.3.2/src/ui-birth.h0000644000175000017500000000023211651552410015267 0ustar chriscchrisc#ifndef INCLUDED_UI_BIRTH_H #define INCLUDED_UI_BIRTH_H extern void ui_init_birthstate_handlers(void); extern errr get_birth_command(bool wait); #endif angband-v3.3.2/src/.splintrc0000644000175000017500000000014511651552410015235 0ustar chriscchrisc-I . -weak +top-use -warnposixheaders -macrovarprefixexclude -predboolothers -DUSE_GCU -DUSE_NCURSES angband-v3.3.2/src/game-event.c0000644000175000017500000000664011651552410015600 0ustar chriscchrisc/* * File: game-event.c * Purpose: Allows the registering of handlers to be told about game events. * * Copyright (c) 2007 Antony Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "z-virt.h" #include "game-event.h" struct event_handler_entry { struct event_handler_entry *next; game_event_handler *fn; void *user; }; struct event_handler_entry *event_handlers[N_GAME_EVENTS]; static void game_event_dispatch(game_event_type type, game_event_data *data) { struct event_handler_entry *this = event_handlers[type]; /* * Send the word out to all interested event handlers. */ while (this) { /* Call the handler with the relevant data */ this->fn(type, data, this->user); this = this->next; } } void event_add_handler(game_event_type type, game_event_handler *fn, void *user) { struct event_handler_entry *new; assert(fn != NULL); /* Make a new entry */ new = mem_alloc(sizeof *new); new->fn = fn; new->user = user; /* Add it to the head of the appropriate list */ new->next = event_handlers[type]; event_handlers[type] = new; } void event_remove_handler(game_event_type type, game_event_handler *fn, void *user) { struct event_handler_entry *prev = NULL; struct event_handler_entry *this = event_handlers[type]; /* Look for the entry in the list */ while (this) { /* Check if this is the entry we want to remove */ if (this->fn == fn && this->user == user) { if (!prev) { event_handlers[type] = this->next; } else { prev->next = this->next; } mem_free(this); return; } prev = this; this = this->next; } } void event_remove_all_handlers(void) { int type; struct event_handler_entry *handler, *next; for (type = 0; type < N_GAME_EVENTS; type++) { handler = event_handlers[type]; while (handler) { next = handler->next; mem_free(handler); handler = next; } event_handlers[type] = NULL; } } void event_add_handler_set(game_event_type *type, size_t n_types, game_event_handler *fn, void *user) { size_t i; for (i = 0; i < n_types; i++) event_add_handler(type[i], fn, user); } void event_remove_handler_set(game_event_type *type, size_t n_types, game_event_handler *fn, void *user) { size_t i; for (i = 0; i < n_types; i++) event_remove_handler(type[i], fn, user); } void event_signal(game_event_type type) { game_event_dispatch(type, NULL); } void event_signal_flag(game_event_type type, bool flag) { game_event_data data; data.flag = flag; game_event_dispatch(type, &data); } void event_signal_point(game_event_type type, int x, int y) { game_event_data data; data.point.x = x; data.point.y = y; game_event_dispatch(type, &data); } void event_signal_string(game_event_type type, const char *s) { game_event_data data; data.string = s; game_event_dispatch(type, &data); } void event_signal_birthpoints(int stats[6], int remaining) { game_event_data data; data.birthstats.stats = stats; data.birthstats.remaining = remaining; game_event_dispatch(EVENT_BIRTHPOINTS, &data); } angband-v3.3.2/src/z-term.h0000644000175000017500000002353311651552410014773 0ustar chriscchrisc/* File: z-term.h */ /* * Copyright (c) 1997 Ben Harrison * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. */ #ifndef INCLUDED_Z_TERM_H #define INCLUDED_Z_TERM_H #include "h-basic.h" #include "ui-event.h" /* * A term_win is a "window" for a Term * * - Cursor Useless/Visible codes * - Cursor Location (see "Useless") * * - Array[h] -- Access to the attribute array * - Array[h] -- Access to the character array * * - Array[h*w] -- Attribute array * - Array[h*w] -- Character array * * - next screen saved * - hook to be called on screen size change * * Note that the attr/char pair at (x,y) is a[y][x]/c[y][x] * and that the row of attr/chars at (0,y) is a[y]/c[y] */ typedef struct term_win term_win; struct term_win { bool cu, cv; byte cx, cy; byte **a; char **c; byte *va; char *vc; byte **ta; char **tc; byte *vta; char *vtc; term_win *next; }; /* * An actual "term" structure * * - Extra "user" info (used by application) * * - Extra "data" info (used by implementation) * * * - Flag "user_flag" * An extra "user" flag (used by application) * * * - Flag "data_flag" * An extra "data" flag (used by implementation) * * * - Flag "active_flag" * This "term" is "active" * * - Flag "mapped_flag" * This "term" is "mapped" * * - Flag "total_erase" * This "term" should be fully erased * * - Flag "fixed_shape" * This "term" is not allowed to resize * * - Flag "icky_corner" * This "term" has an "icky" corner grid * * - Flag "soft_cursor" * This "term" uses a "software" cursor * * - Flag "always_pict" * Use the "Term_pict()" routine for all text * * - Flag "higher_pict" * Use the "Term_pict()" routine for special text * * - Flag "always_text" * Use the "Term_text()" routine for invisible text * * - Flag "unused_flag" * Reserved for future use * * - Flag "never_bored" * Never call the "TERM_XTRA_BORED" action * * - Flag "never_frosh" * Never call the "TERM_XTRA_FROSH" action * * * - Value "attr_blank" * Use this "attr" value for "blank" grids * * - Value "char_blank" * Use this "char" value for "blank" grids * * * - Ignore this pointer * * - Keypress Queue -- various data * * - Keypress Queue -- pending keys * * * - Window Width (max 255) * - Window Height (max 255) * * - Minimum modified row * - Maximum modified row * * - Minimum modified column (per row) * - Maximum modified column (per row) * * * - Displayed screen image * - Requested screen image * * - Temporary screen image * - Memorized screen image * * * - Hook for init-ing the term * - Hook for nuke-ing the term * * - Hook for extra actions * * - Hook for placing the cursor * * - Hook for drawing some blank spaces * * - Hook for drawing a string of chars using an attr * * - Hook for drawing a sequence of special attr/char pairs */ typedef struct term term; struct term { void *user; void *data; bool user_flag; bool data_flag; bool active_flag; bool mapped_flag; bool total_erase; bool fixed_shape; bool icky_corner; bool soft_cursor; bool always_pict; bool higher_pict; bool always_text; bool unused_flag; bool never_bored; bool never_frosh; byte attr_blank; char char_blank; ui_event *key_queue; u16b key_head; u16b key_tail; u16b key_xtra; u16b key_size; byte wid; byte hgt; byte y1; byte y2; byte *x1; byte *x2; /* Offsets used by the map subwindows */ byte offset_x; byte offset_y; term_win *old; term_win *scr; term_win *tmp; term_win *mem; /* Number of times saved */ byte saved; void (*init_hook)(term *t); void (*nuke_hook)(term *t); errr (*xtra_hook)(int n, int v); errr (*curs_hook)(int x, int y); errr (*bigcurs_hook)(int x, int y); errr (*wipe_hook)(int x, int y, int n); errr (*text_hook)(int x, int y, int n, byte a, const char *s); errr (*pict_hook)(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp); byte (*xchar_hook)(byte c); }; /**** Available Constants ****/ /* * Definitions for the "actions" of "Term_xtra()" * * These values may be used as the first parameter of "Term_xtra()", * with the second parameter depending on the "action" itself. Many * of the actions shown below are optional on at least one platform. * * The "TERM_XTRA_EVENT" action uses "v" to "wait" for an event * The "TERM_XTRA_SHAPE" action uses "v" to "show" the cursor * The "TERM_XTRA_FROSH" action uses "v" for the index of the row * The "TERM_XTRA_ALIVE" action uses "v" to "activate" (or "close") * The "TERM_XTRA_LEVEL" action uses "v" to "resume" (or "suspend") * The "TERM_XTRA_DELAY" action uses "v" as a "millisecond" value * * The other actions do not need a "v" code, so "zero" is used. */ #define TERM_XTRA_EVENT 1 /* Process some pending events */ #define TERM_XTRA_FLUSH 2 /* Flush all pending events */ #define TERM_XTRA_CLEAR 3 /* Clear the entire window */ #define TERM_XTRA_SHAPE 4 /* Set cursor shape (optional) */ #define TERM_XTRA_FROSH 5 /* Flush one row (optional) */ #define TERM_XTRA_FRESH 6 /* Flush all rows (optional) */ #define TERM_XTRA_NOISE 7 /* Make a noise (optional) */ #define TERM_XTRA_BORED 9 /* Handle stuff when bored (optional) */ #define TERM_XTRA_REACT 10 /* React to global changes (optional) */ #define TERM_XTRA_ALIVE 11 /* Change the "hard" level (optional) */ #define TERM_XTRA_LEVEL 12 /* Change the "soft" level (optional) */ #define TERM_XTRA_DELAY 13 /* Delay some milliseconds (optional) */ /*** Color constants ***/ /* * Angband "attributes" (with symbols, and base (R,G,B) codes) * * The "(R,G,B)" codes are given in "fourths" of the "maximal" value, * and should "gamma corrected" on most (non-Macintosh) machines. */ #define TERM_DARK 0 /* d */ /* 0 0 0 */ #define TERM_WHITE 1 /* w */ /* 4 4 4 */ #define TERM_SLATE 2 /* s */ /* 2 2 2 */ #define TERM_ORANGE 3 /* o */ /* 4 2 0 */ #define TERM_RED 4 /* r */ /* 3 0 0 */ #define TERM_GREEN 5 /* g */ /* 0 2 1 */ #define TERM_BLUE 6 /* b */ /* 0 0 4 */ #define TERM_UMBER 7 /* u */ /* 2 1 0 */ #define TERM_L_DARK 8 /* D */ /* 1 1 1 */ #define TERM_L_WHITE 9 /* W */ /* 3 3 3 */ #define TERM_L_PURPLE 10 /* P */ /* ? ? ? */ #define TERM_YELLOW 11 /* y */ /* 4 4 0 */ #define TERM_L_RED 12 /* R */ /* 4 0 0 */ #define TERM_L_GREEN 13 /* G */ /* 0 4 0 */ #define TERM_L_BLUE 14 /* B */ /* 0 4 4 */ #define TERM_L_UMBER 15 /* U */ /* 3 2 1 */ #define TERM_PURPLE 16 /* p */ #define TERM_VIOLET 17 /* v */ #define TERM_TEAL 18 /* t */ #define TERM_MUD 19 /* m */ #define TERM_L_YELLOW 20 /* Y */ #define TERM_MAGENTA 21 /* i */ #define TERM_L_TEAL 22 /* T */ #define TERM_L_VIOLET 23 /* V */ #define TERM_L_PINK 24 /* I */ #define TERM_MUSTARD 25 /* M */ #define TERM_BLUE_SLATE 26 /* z */ #define TERM_DEEP_L_BLUE 27 /* Z */ /* The following allow color 'translations' to support environments with a limited color depth * as well as translate colours to alternates for e.g. menu highlighting. */ #define ATTR_FULL 0 /* full color translation */ #define ATTR_MONO 1 /* mono color translation */ #define ATTR_VGA 2 /* 16 color translation */ #define ATTR_BLIND 3 /* "Blind" color translation */ #define ATTR_LIGHT 4 /* "Torchlit" color translation */ #define ATTR_DARK 5 /* "Dark" color translation */ #define ATTR_HIGH 6 /* "Highlight" color translation */ #define ATTR_METAL 7 /* "Metallic" color translation */ #define ATTR_MISC 8 /* "Miscellaneous" color translation - see misc_to_attr */ #define MAX_ATTR 9 /* * Maximum number of colours, and number of "basic" Angband colours */ #define MAX_COLORS 256 #define BASIC_COLORS 28 /* sketchy key logging pt. 1 */ #define KEYLOG_SIZE 8 extern int log_i; extern int log_size; struct keypress keylog[KEYLOG_SIZE]; /**** Available Variables ****/ extern term *Term; extern byte tile_width; extern byte tile_height; extern bool bigcurs; extern bool smlcurs; /**** Available Functions ****/ extern errr Term_xtra(int n, int v); extern void Term_queue_char(term *t, int x, int y, byte a, char c, byte ta, char tc); extern void Term_big_queue_char(term *t, int x, int y, byte a, char c, byte a1, char c1); extern void Term_queue_chars(int x, int y, int n, byte a, const char *s); extern errr Term_fresh(void); extern errr Term_set_cursor(bool v); extern errr Term_gotoxy(int x, int y); extern errr Term_draw(int x, int y, byte a, char c); extern errr Term_addch(byte a, char c); extern errr Term_addstr(int n, byte a, const char *s); extern errr Term_putch(int x, int y, byte a, char c); extern void Term_big_putch(int x, int y, byte a, char c); extern errr Term_putstr(int x, int y, int n, byte a, const char *s); extern errr Term_erase(int x, int y, int n); extern errr Term_clear(void); extern errr Term_redraw(void); extern errr Term_redraw_section(int x1, int y1, int x2, int y2); extern errr Term_get_cursor(bool *v); extern errr Term_get_size(int *w, int *h); extern errr Term_locate(int *x, int *y); extern errr Term_what(int x, int y, byte *a, char *c); extern errr Term_flush(void); extern errr Term_mousepress(int x, int y, char button); extern errr Term_keypress(keycode_t k, byte mods); extern errr Term_key_push(int k); extern errr Term_event_push(const ui_event *ke); extern errr Term_inkey(ui_event *ch, bool wait, bool take); extern errr Term_save(void); extern errr Term_load(void); extern errr Term_resize(int w, int h); extern errr Term_activate(term *t); extern errr term_nuke(term *t); extern errr term_init(term *t, int w, int h, int k); extern bool panel_contains(unsigned int y, unsigned int x); #endif /* INCLUDED_Z_TERM_H */ angband-v3.3.2/src/cave.h0000644000175000017500000001061111651552410014464 0ustar chriscchrisc/* cave.h - cave interface */ #ifndef CAVE_H #define CAVE_H #include "defines.h" #include "types.h" #include "z-type.h" struct player; extern int distance(int y1, int x1, int y2, int x2); extern bool los(int y1, int x1, int y2, int x2); extern bool no_light(void); extern bool cave_valid_bold(int y, int x); extern byte get_color(byte a, int attr, int n); extern void map_info(unsigned x, unsigned y, grid_data *g); extern void move_cursor_relative(int y, int x); extern void print_rel(char c, byte a, int y, int x); extern void prt_map(void); extern void display_map(int *cy, int *cx); extern void do_cmd_view_map(void); extern errr vinfo_init(void); extern void forget_view(void); extern void update_view(void); extern void map_area(void); extern void wiz_light(void); extern void wiz_dark(void); extern int project_path(u16b *gp, int range, int y1, int x1, int y2, int x2, int flg); extern bool projectable(int y1, int x1, int y2, int x2, int flg); extern void scatter(int *yp, int *xp, int y, int x, int d, int m); extern void health_track(struct player *p, int m_idx); extern void monster_race_track(int r_idx); extern void track_object(int item); extern void track_object_kind(int k_idx); extern bool tracked_object_is(int item); extern void disturb(struct player *p, int stop_search, int unused_flag); extern bool is_quest(int level); extern bool dtrap_edge(int y, int x); struct cave { s32b created_at; int depth; byte feeling; u32b obj_rating; u32b mon_rating; bool good_item; int height; int width; u16b feeling_squares; /* Keep track of how many feeling squares the player has visited */ byte (*info)[256]; byte (*info2)[256]; byte (*feat)[DUNGEON_WID]; byte (*cost)[DUNGEON_WID]; byte (*when)[DUNGEON_WID]; s16b (*m_idx)[DUNGEON_WID]; s16b (*o_idx)[DUNGEON_WID]; struct monster *monsters; int mon_max; int mon_cnt; }; /* XXX: temporary while I refactor */ extern struct cave *cave; extern struct cave *cave_new(void); extern void cave_free(struct cave *c); extern void cave_set_feat(struct cave *c, int y, int x, int feat); extern void cave_note_spot(struct cave *c, int y, int x); extern void cave_light_spot(struct cave *c, int y, int x); extern void cave_update_flow(struct cave *c); extern void cave_forget_flow(struct cave *c); extern void cave_illuminate(struct cave *c, bool daytime); /** * cave_predicate is a function pointer which tests a given square to * see if the predicate in question is true. */ typedef bool (*cave_predicate)(struct cave *c, int y, int x); /* FEATURE PREDICATES */ extern bool cave_isfloor(struct cave *c, int y, int x); extern bool cave_isrock(struct cave *c, int y, int x); extern bool cave_isperm(struct cave *c, int y, int x); extern bool cave_ismagma(struct cave *c, int y, int x); extern bool cave_isquartz(struct cave *c, int y, int x); extern bool cave_ismineral(struct cave *c, int y, int x); extern bool cave_issecretdoor(struct cave *c, int y, int x); extern bool cave_isopendoor(struct cave *c, int y, int x); extern bool cave_iscloseddoor(struct cave *c, int y, int x); extern bool cave_islockeddoor(struct cave *c, int y, int x); extern bool cave_isjammeddoor(struct cave *c, int y, int x); extern bool cave_isdoor(struct cave *c, int y, int x); extern bool cave_issecrettrap(struct cave *c, int y, int x); extern bool cave_isknowntrap(struct cave *c, int y, int x); extern bool cave_istrap(struct cave *c, int y, int x); /* BEHAVIOR PREDICATES */ extern bool cave_isopen(struct cave *c, int y, int x); extern bool cave_isempty(struct cave *c, int y, int x); extern bool cave_canputitem(struct cave *c, int y, int x); extern bool cave_isdiggable(struct cave *c, int y, int x); extern bool cave_ispassable(struct cave *c, int y, int x); extern bool cave_iswall(struct cave *c, int y, int x); extern bool cave_isstrongwall(struct cave *c, int y, int x); extern bool cave_isvault(struct cave *c, int y, int x); extern bool cave_isroom(struct cave *c, int y, int x); extern bool cave_isrubble(struct cave *c, int y, int x); extern bool cave_isfeel(struct cave *c, int y, int x); extern void cave_generate(struct cave *c, struct player *p); extern bool cave_in_bounds(struct cave *c, int y, int x); extern bool cave_in_bounds_fully(struct cave *c, int y, int x); extern struct monster *cave_monster(struct cave *c, int idx); extern int cave_monster_max(struct cave *c); extern int cave_monster_count(struct cave *c); void upgrade_mineral(struct cave *c, int y, int x); #endif /* !CAVE_H */ angband-v3.3.2/src/squelch.c0000644000175000017500000003100611651552410015206 0ustar chriscchrisc/* * File: squelch.c * Purpose: Item destruction * * Copyright (c) 2007 David T. Blackston, Iain McFall, DarkGod, Jeff Greene, * David Vestal, Pete Mack, Andrew Sidwell. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "ui-menu.h" #include "object/tvalsval.h" #include "object/pval.h" #include "squelch.h" typedef struct { squelch_type_t squelch_type; int tval; int min_sval; int max_sval; } quality_squelch_struct; static quality_squelch_struct quality_mapping[] = { { TYPE_WEAPON_POINTY, TV_SWORD, 0, SV_UNKNOWN }, { TYPE_WEAPON_POINTY, TV_POLEARM, 0, SV_UNKNOWN }, { TYPE_WEAPON_BLUNT, TV_HAFTED, 0, SV_UNKNOWN }, { TYPE_SHOOTER, TV_BOW, 0, SV_UNKNOWN }, { TYPE_MISSILE_SLING, TV_SHOT, 0, SV_UNKNOWN }, { TYPE_MISSILE_BOW, TV_ARROW, 0, SV_UNKNOWN }, { TYPE_MISSILE_XBOW, TV_BOLT, 0, SV_UNKNOWN }, { TYPE_ARMOR_ROBE, TV_SOFT_ARMOR, SV_ROBE,SV_ROBE }, { TYPE_ARMOR_BODY, TV_DRAG_ARMOR, 0, SV_UNKNOWN }, { TYPE_ARMOR_BODY, TV_HARD_ARMOR, 0, SV_UNKNOWN }, { TYPE_ARMOR_BODY, TV_SOFT_ARMOR, 0, SV_UNKNOWN }, { TYPE_ARMOR_CLOAK, TV_CLOAK, SV_CLOAK, SV_FUR_CLOAK }, { TYPE_ARMOR_CLOAK, TV_CLOAK, SV_ETHEREAL_CLOAK, SV_ETHEREAL_CLOAK }, /* XXX Eddie need to assert SV_CLOAK < SV_FUR_CLOAK < SV_ELVEN_CLOAK */ { TYPE_ARMOR_ELVEN_CLOAK, TV_CLOAK, SV_ELVEN_CLOAK, SV_ELVEN_CLOAK }, { TYPE_ARMOR_SHIELD, TV_SHIELD, 0, SV_UNKNOWN }, { TYPE_ARMOR_HEAD, TV_HELM, 0, SV_UNKNOWN }, { TYPE_ARMOR_HEAD, TV_CROWN, 0, SV_UNKNOWN }, { TYPE_ARMOR_HANDS, TV_GLOVES, 0, SV_UNKNOWN }, { TYPE_ARMOR_FEET, TV_BOOTS, 0, SV_UNKNOWN }, { TYPE_DIGGER, TV_DIGGING, 0, SV_UNKNOWN }, { TYPE_RING, TV_RING, 0, SV_UNKNOWN }, { TYPE_AMULET, TV_AMULET, 0, SV_UNKNOWN }, { TYPE_LIGHT, TV_LIGHT, 0, SV_UNKNOWN }, }; quality_name_struct quality_choices[TYPE_MAX] = { { TYPE_WEAPON_POINTY, "Pointy Melee Weapons" }, { TYPE_WEAPON_BLUNT, "Blunt Melee Weapons" }, { TYPE_SHOOTER, "Missile weapons" }, { TYPE_MISSILE_SLING, "Shots and Pebbles" }, { TYPE_MISSILE_BOW, "Arrows" }, { TYPE_MISSILE_XBOW, "Bolts" }, { TYPE_ARMOR_ROBE, "Robes" }, { TYPE_ARMOR_BODY, "Body Armor" }, { TYPE_ARMOR_CLOAK, "Cloaks" }, { TYPE_ARMOR_ELVEN_CLOAK, "Elven Cloaks" }, { TYPE_ARMOR_SHIELD, "Shields" }, { TYPE_ARMOR_HEAD, "Headgear" }, { TYPE_ARMOR_HANDS, "Handgear" }, { TYPE_ARMOR_FEET, "Footgear" }, { TYPE_DIGGER, "Diggers" }, { TYPE_RING, "Rings" }, { TYPE_AMULET, "Amulets" }, { TYPE_LIGHT, "Lights" }, }; /* * The names for the various kinds of quality */ quality_name_struct quality_values[SQUELCH_MAX] = { { SQUELCH_NONE, "no squelch" }, { SQUELCH_BAD, "bad" }, { SQUELCH_AVERAGE, "average" }, { SQUELCH_GOOD, "good" }, { SQUELCH_EXCELLENT_NO_HI, "excellent with no high resists" }, { SQUELCH_EXCELLENT_NO_SPL, "excellent but not splendid" }, { SQUELCH_ALL, "non-artifact" }, }; byte squelch_level[TYPE_MAX]; const size_t squelch_size = TYPE_MAX; /* * Initialise the squelch package (currently just asserts). */ void squelch_init(void) { } /* * Reset the player's squelch choices for a new game. */ void squelch_birth_init(void) { int i; /* Reset squelch bits */ for (i = 0; i < z_info->k_max; i++) k_info[i].squelch = FALSE; /* Clear the squelch bytes */ for (i = 0; i < TYPE_MAX; i++) squelch_level[i] = SQUELCH_NONE; } /*** Autoinscription stuff ***/ const char *get_autoinscription(object_kind *kind) { return kind ? quark_str(kind->note) : NULL; } /* Put the autoinscription on an object */ int apply_autoinscription(object_type *o_ptr) { char o_name[80]; const char *note = get_autoinscription(o_ptr->kind); /* Don't inscribe unaware objects */ if (!note || !object_flavor_is_aware(o_ptr)) return 0; /* Don't re-inscribe if it's already inscribed */ if (o_ptr->note) return 0; /* Get an object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); if (note[0] != 0) o_ptr->note = quark_add(note); else o_ptr->note = 0; msg("You autoinscribe %s.", o_name); return 1; } int remove_autoinscription(s16b kind) { struct object_kind *k = objkind_byid(kind); if (!k || !k->note) return 0; k->note = 0; return 1; } int add_autoinscription(s16b kind, const char *inscription) { struct object_kind *k = objkind_byid(kind); if (!k) return 0; if (!inscription) return remove_autoinscription(kind); k->note = quark_add(inscription); return 1; } void autoinscribe_ground(void) { int py = p_ptr->py; int px = p_ptr->px; s16b this_o_idx, next_o_idx = 0; /* Scan the pile of objects */ for (this_o_idx = cave->o_idx[py][px]; this_o_idx; this_o_idx = next_o_idx) { /* Get the next object */ next_o_idx = object_byid(this_o_idx)->next_o_idx; /* Apply an autoinscription */ apply_autoinscription(object_byid(this_o_idx)); } } void autoinscribe_pack(void) { int i; /* Cycle through the inventory */ for (i = INVEN_PACK; i >= 0; i--) { /* Skip empty items */ if (!p_ptr->inventory[i].kind) continue; /* Apply the inscription */ apply_autoinscription(&p_ptr->inventory[i]); } return; } /*** Squelch code ***/ /* * Squelch the flavor of an object */ void object_squelch_flavor_of(const object_type *o_ptr) { if (object_flavor_is_aware(o_ptr)) o_ptr->kind->squelch |= SQUELCH_IF_AWARE; else o_ptr->kind->squelch |= SQUELCH_IF_UNAWARE; } /* * Find the squelch type of the object, or TYPE_MAX if none */ squelch_type_t squelch_type_of(const object_type *o_ptr) { size_t i; /* Find the appropriate squelch group */ for (i = 0; i < N_ELEMENTS(quality_mapping); i++) { if ((quality_mapping[i].tval == o_ptr->tval) && (quality_mapping[i].min_sval <= o_ptr->sval) && (quality_mapping[i].max_sval >= o_ptr->sval)) return quality_mapping[i].squelch_type; } return TYPE_MAX; } /** * Small helper function to see how an object trait compares to the one * in its base type. * * If the base type provides a positive bonus, we'll use that. Otherwise, we'll * use zero (players don't consider an item with a positive bonus to be bad * even if the base kind has a higher positive bonus). */ static int cmp_object_trait(int bonus, random_value base) { int amt = randcalc(base, 0, MINIMISE); if (amt > 0) amt = 0; return CMP(bonus, amt); } /** * Small helper function to see if an item seems good, bad or average based on * to_h, to_d and to_a. * * The sign of the return value announces if the object is bad (negative), * good (positive) or average (zero). */ static int is_object_good(const object_type *o_ptr) { int good = 0; good += 4 * cmp_object_trait(o_ptr->to_d, o_ptr->kind->to_d); good += 2 * cmp_object_trait(o_ptr->to_h, o_ptr->kind->to_h); good += 1 * cmp_object_trait(o_ptr->to_a, o_ptr->kind->to_a); return good; } /* * Determine the squelch level of an object, which is similar to its pseudo. * * The main point is when the value is undetermined given current info, * return the maximum possible value. */ byte squelch_level_of(const object_type *o_ptr) { byte value; bitflag f[OF_SIZE], f2[OF_SIZE]; int i; object_flags_known(o_ptr, f); /* Deal with jewelry specially. */ if (object_is_jewelry(o_ptr)) { /* CC: average jewelry has at least one known positive pval */ for (i = 0; i < o_ptr->num_pvals; i++) if ((object_this_pval_is_visible(o_ptr, i)) && (o_ptr->pval[i] > 0)) return SQUELCH_AVERAGE; if ((o_ptr->to_h > 0) || (o_ptr->to_d > 0) || (o_ptr->to_a > 0)) return SQUELCH_AVERAGE; if ((object_attack_plusses_are_visible(o_ptr) && ((o_ptr->to_h < 0) || (o_ptr->to_d < 0))) || (object_defence_plusses_are_visible(o_ptr) && o_ptr->to_a < 0)) return SQUELCH_BAD; return SQUELCH_AVERAGE; } /* And lights */ if (o_ptr->tval == TV_LIGHT) { create_mask(f2, TRUE, OFID_WIELD, OFT_MAX); if (of_is_inter(f, f2)) return SQUELCH_ALL; if ((o_ptr->to_h > 0) || (o_ptr->to_d > 0) || (o_ptr->to_a > 0)) return SQUELCH_GOOD; if ((o_ptr->to_h < 0) || (o_ptr->to_d < 0) || (o_ptr->to_a < 0)) return SQUELCH_BAD; return SQUELCH_AVERAGE; } /* CC: we need to redefine "bad" with multiple pvals * At the moment we use "all pvals known and negative" */ for (i = 0; i < o_ptr->num_pvals; i++) { if (!object_this_pval_is_visible(o_ptr, i) || (o_ptr->pval[i] > 0)) break; if (i == (o_ptr->num_pvals - 1)) return SQUELCH_BAD; } if (object_was_sensed(o_ptr)) { obj_pseudo_t pseudo = object_pseudo(o_ptr); switch (pseudo) { case INSCRIP_AVERAGE: { value = SQUELCH_AVERAGE; break; } case INSCRIP_EXCELLENT: { /* have to assume splendid until you have tested it */ if (object_was_worn(o_ptr)) { if (object_high_resist_is_possible(o_ptr)) value = SQUELCH_EXCELLENT_NO_SPL; else value = SQUELCH_EXCELLENT_NO_HI; } else { value = SQUELCH_ALL; } break; } case INSCRIP_SPLENDID: value = SQUELCH_ALL; break; case INSCRIP_NULL: case INSCRIP_SPECIAL: value = SQUELCH_MAX; break; /* This is the interesting case */ case INSCRIP_STRANGE: case INSCRIP_MAGICAL: { value = SQUELCH_GOOD; if ((object_attack_plusses_are_visible(o_ptr) || randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h) || randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) && (object_defence_plusses_are_visible(o_ptr) || randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a))) { int isgood = is_object_good(o_ptr); if (isgood > 0) { value = SQUELCH_GOOD; } else if (isgood < 0) { value = SQUELCH_BAD; } else { value = SQUELCH_AVERAGE; } } break; } default: /* do not handle any other possible pseudo values */ assert(0); } } else { if (object_was_worn(o_ptr)) value = SQUELCH_EXCELLENT_NO_SPL; /* object would be sensed if it were splendid */ else if (object_is_known_not_artifact(o_ptr)) value = SQUELCH_ALL; else value = SQUELCH_MAX; } return value; } /* * Remove any squelching of a particular flavor */ void kind_squelch_clear(object_kind *k_ptr) { k_ptr->squelch = 0; p_ptr->notice |= PN_SQUELCH; } bool kind_is_squelched_aware(const object_kind *k_ptr) { return (k_ptr->squelch & SQUELCH_IF_AWARE) ? TRUE : FALSE; } bool kind_is_squelched_unaware(const object_kind *k_ptr) { return (k_ptr->squelch & SQUELCH_IF_UNAWARE) ? TRUE : FALSE; } void kind_squelch_when_aware(object_kind *k_ptr) { k_ptr->squelch |= SQUELCH_IF_AWARE; p_ptr->notice |= PN_SQUELCH; } void kind_squelch_when_unaware(object_kind *k_ptr) { k_ptr->squelch |= SQUELCH_IF_UNAWARE; p_ptr->notice |= PN_SQUELCH; } /* * Determines if an object is eligible for squelching. */ bool squelch_item_ok(const object_type *o_ptr) { byte type; if (p_ptr->unignoring) return FALSE; /* Don't squelch artifacts unless marked to be squelched */ if (o_ptr->artifact || check_for_inscrip(o_ptr, "!k") || check_for_inscrip(o_ptr, "!*")) return FALSE; /* Do squelch individual objects that marked ignore */ if (o_ptr->ignore) return TRUE; /* Auto-squelch dead chests */ if (o_ptr->tval == TV_CHEST && o_ptr->pval[DEFAULT_PVAL] == 0) return TRUE; /* Do squelching by kind */ if (object_flavor_is_aware(o_ptr) ? kind_is_squelched_aware(o_ptr->kind) : kind_is_squelched_unaware(o_ptr->kind)) return TRUE; type = squelch_type_of(o_ptr); if (type == TYPE_MAX) return FALSE; /* Squelch items known not to be special */ if (object_is_known_not_artifact(o_ptr) && squelch_level[type] == SQUELCH_ALL) return TRUE; /* Get result based on the feeling and the squelch_level */ if (squelch_level_of(o_ptr) <= squelch_level[type]) return TRUE; else return FALSE; } /* * Drop all {squelch}able items. */ void squelch_drop(void) { int n; /* Scan through the slots backwards */ for (n = INVEN_PACK - 1; n >= 0; n--) { object_type *o_ptr = &p_ptr->inventory[n]; /* Skip non-objects and unsquelchable objects */ if (!o_ptr->kind) continue; if (!squelch_item_ok(o_ptr)) continue; /* Check for !d (no drop) inscription */ if (!check_for_inscrip(o_ptr, "!d") && !check_for_inscrip(o_ptr, "!*")) { /* We're allowed to drop it. */ inven_drop(n, o_ptr->number); } } /* Combine/reorder the pack */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); } angband-v3.3.2/src/z-form.h0000644000175000017500000000316611651552410014767 0ustar chriscchrisc#ifndef INCLUDED_Z_FORM_H #define INCLUDED_Z_FORM_H #include "h-basic.h" /* * This file provides functions very similar to "sprintf()", but which * not only parse some additional "format sequences", but also enforce * bounds checking, and allow repeated "appends" to the same buffer. * * See "z-form.c" for more detailed information about the routines, * including a list of the legal "format sequences". * * This file makes use of both "z-util.c" and "z-virt.c" */ /* MSVC doesn't have va_copy (which is C99) or an alternative, so we'll just * copy the SRC pointer. In other cases we'll use va_copy() as we should. */ #ifdef _MSC_VER #define VA_COPY(DST, SRC) (DST) = (SRC) #else #define VA_COPY(DST, SRC) va_copy(DST, SRC) #endif /**** Available Functions ****/ /* Format arguments into given bounded-length buffer */ extern size_t vstrnfmt(char *buf, size_t max, const char *fmt, va_list vp); /* Simple interface to "vstrnfmt()" */ extern size_t strnfmt(char *buf, size_t max, const char *fmt, ...); /* Format arguments into a static resizing buffer */ extern char *vformat(const char *fmt, va_list vp); /* Free the memory allocated for the format buffer */ extern void vformat_kill(void); /* Append a formatted string to another string */ extern void strnfcat(char *str, size_t max, size_t *end, const char *fmt, ...); /* Simple interface to "vformat()" */ extern char *format(const char *fmt, ...); /* Vararg interface to "plog()", using "format()" */ extern void plog_fmt(const char *fmt, ...); /* Vararg interface to "quit()", using "format()" */ extern void quit_fmt(const char *fmt, ...); #endif /* INCLUDED_Z_FORM_H */ angband-v3.3.2/src/z-util.h0000644000175000017500000000441711651552410015001 0ustar chriscchrisc#ifndef INCLUDED_Z_UTIL_H #define INCLUDED_Z_UTIL_H #include "h-basic.h" /**** Available variables ****/ /** * The name of the program. */ extern char *argv0; /* Aux functions */ extern void (*plog_aux)(const char *); extern void (*quit_aux)(const char *); /**** Available Functions ****/ /** * Case insensitive comparison between two strings */ extern int my_stricmp(const char *s1, const char *s2); /** * Case insensitive comparison between two strings, up to n characters long. */ extern int my_strnicmp(const char *a, const char *b, int n); /** * Case-insensitive strstr */ extern char *my_stristr(const char *string, const char *pattern); /** * Copy up to 'bufsize'-1 characters from 'src' to 'buf' and NULL-terminate * the result. The 'buf' and 'src' strings may not overlap. * * Returns: strlen(src). This makes checking for truncation * easy. Example: * if (my_strcpy(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcpy() function in BSD. */ extern size_t my_strcpy(char *buf, const char *src, size_t bufsize); /** * Try to append a string to an existing NULL-terminated string, never writing * more characters into the buffer than indicated by 'bufsize', and * NULL-terminating the buffer. The 'buf' and 'src' strings may not overlap. * * my_strcat() returns strlen(buf) + strlen(src). This makes checking for * truncation easy. Example: * if (my_strcat(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcat() function in BSD. */ extern size_t my_strcat(char *buf, const char *src, size_t bufsize); /* Test equality, prefix, suffix */ extern bool streq(const char *s, const char *t); extern bool prefix(const char *s, const char *t); extern bool prefix_i(const char *s, const char *t); extern bool suffix(const char *s, const char *t); #define streq(s, t) (!strcmp(s, t)) /* Print an error message */ extern void plog(const char *str); /* Exit, with optional message */ extern void quit(const char *str); /* Sorting functions */ extern void sort(void *array, size_t nmemb, size_t smemb, int (*comp)(const void *a, const void *b)); /* Mathematical functions */ int mean(int *nums, int size); int variance(int *nums, int size); #endif /* INCLUDED_Z_UTIL_H */ angband-v3.3.2/src/z-file.h0000644000175000017500000001444611651552410014746 0ustar chriscchrisc#ifndef INCLUDED_Z_FILE_H #define INCLUDED_Z_FILE_H #include "h-basic.h" /*** Permissions code ***/ /** * Player's user ID and group ID, respectively. * * Only relevant to POSIX systems that use main.c, and set there. */ extern int player_uid; extern int player_egid; /** * Drop or grab privileges. * * This is used on multiuser systems, where the game wants to gain access to * system-wide files like the scores, raw files, or savefiles. Reading from * these locations is permitted by anyone, but writing to them requires a call * to safe_setuid_grab() before opening the file for writing. * * safe_setuid_drop() should be called immediately after the file has been * opened, to prevent security risks, and restores the game's rights so that it * cannot write to the system-wide files. */ void safe_setuid_grab(void); void safe_setuid_drop(void); /*** Path building code ***/ /** * Concatenates "leaf" onto the end of "base", using system-specific path * separators, and places the result in buf[], truncated to "len" bytes. * * On Unixes, deals with the tilde as representing home directories. */ size_t path_build(char *buf, size_t len, const char *base, const char *leaf); /*** File access code ***/ /** Data types **/ /** * An opaque file handle for Angband file handling. */ typedef struct ang_file ang_file; /** * Specifies what kind of access is required to a file. See file_open(). */ typedef enum { MODE_WRITE, MODE_READ, MODE_APPEND } file_mode; /** * Specifies what kind of thing a file is, when writing. See file_open(). */ typedef enum { FTYPE_TEXT = 1, FTYPE_SAVE, FTYPE_RAW, FTYPE_HTML } file_type; /** Utility functions **/ /** * Returns TRUE if `fname` exists (and is a file), FALSE otherwise. */ bool file_exists(const char *fname); /** * Tries to delete `fname`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_delete(const char *fname); /** * Moves the file `fname` to `newname`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_move(const char *fname, const char *newname); /** * Returns TRUE if the file `first` is newer than `second`. */ bool file_newer(const char *first, const char *second); /** File handle creation **/ /** * Open file `buf`, returning a file handler representing that file. * * The file mode specifies what kind of access is required to the file: * - MODE_WRITE will overwrite the current contents of the file * - MODE_READ will allow read-only access to the file * - MODE_APPEND will allow write-only access, but will not overwrite the * current contents of the file. * * The file type is specified to allow systems which don't use file extensions * to set the type of the file appropriately. When reading, pass -1 as ftype; * when writing, use whichever filetype seems most appropriate. * * On any kind of error, this function returns NULL. */ ang_file *file_open(const char *buf, file_mode mode, file_type ftype); /** * Platform hook for file_open. Used to set filetypes. */ extern void (*file_open_hook)(const char *path, file_type ftype); /** * Attempt to close the file handle `f`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_close(ang_file *f); /** File locking **/ /** * Lock or unlock the file represented by `f` for writing. * If the file is not open for writing, this call will fail. * * If `f` is closed, the file is automatically unlocked. */ void file_lock(ang_file *f); void file_unlock(ang_file *f); /** Line-based IO **/ /** * Get a line of text from the file represented by `f`, placing it into `buf` * to a maximum length of `n`. * * This expands tabs, replaces non-printables with '?', and deals with differing * line endings. * * Returns TRUE when data is returned; FALSE otherwise. */ bool file_getl(ang_file *f, char *buf, size_t n); /** * Write the string pointed to by `buf` to the file represented by `f`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_put(ang_file *f, const char *buf); /** * Format (using strnfmt) the given args, and then call file_put(). */ bool file_putf(ang_file *f, const char *fmt, ...); bool file_vputf(ang_file *f, const char *fmt, va_list vp); /** * Format and translate a string, then print it out to file. */ bool x_file_putf(ang_file *f, int encoding, const char *fmt, ...); /** Byte-based IO */ /** * Seek to position `pos` in the file represented by `f`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_seek(ang_file *f, u32b pos); /** * Reads n bytes from file 'f' into buffer 'buf'. * \returns Number of bytes read; -1 on error */ int file_read(ang_file *f, char *buf, size_t n); /** * Write the first `n` bytes following the pointer `buf` to the file represented * by `f`. Do not mix with calls to file_writec(). * * Returns TRUE if successful, FALSE otherwise. */ bool file_write(ang_file *f, const char *buf, size_t n); /** * Read a byte from the file represented by `f` and place it at the location * specified by 'b'. * * Returns TRUE if successful, FALSE otherwise. */ bool file_readc(ang_file *f, byte *b); /** * Write the byte `b` to the file represented by `f`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_writec(ang_file *f, byte b); /*** Directory code ***/ /** * Return whether or not a directory exists. */ bool dir_exists(const char *dirname); /** * Create's the given directory, creating intermediate directories if * needed and possible. Returns whether or not the directory was created * successfully. */ bool dir_create(const char *dirname); /** * An opaque file handle for Angband directory handling. */ typedef struct ang_dir ang_dir; /** * Opens a directory handle. * * `dirname` must be a system-specific pathname to the directory * you want scanned. * * Returns a valid directory handle on success, NULL otherwise. */ ang_dir *my_dopen(const char *dirname); /** * Reads a directory entry. * * `dir` must point to a directory handle previously returned by my_dopen(). * `fname` must be a pointer to a writeable chunk of memory `len` long. * * Returns TRUE on successful reading, FALSE otherwise. * (FALSE generally indicates that there are no more files to be read.) */ bool my_dread(ang_dir *dir, char *fname, size_t len); /** * Close a directory handle. */ void my_dclose(ang_dir *dir); #endif /* INCLUDED_Z_FILE_H */ angband-v3.3.2/src/main-stats.c0000644000175000017500000014106311651552410015627 0ustar chriscchrisc/* * File: main-stats.c * Purpose: Pseudo-UI for stats generation (borrows heavily from main-test.c) * * Copyright (c) 2010-11 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #ifdef USE_STATS #include "birth.h" #include "buildid.h" #include "init.h" #include "monster/mon-make.h" #include "object/pval.h" #include "object/tvalsval.h" #include "stats/db.h" #include "stats/structs.h" #include #include #define OBJ_FEEL_MAX 11 #define MON_FEEL_MAX 10 #define LEVEL_MAX 101 #define TOP_DICE 21 /* highest catalogued values for wearables */ #define TOP_SIDES 11 #define TOP_AC 146 #define TOP_PLUS 56 #define TOP_POWER 999 #define TOP_PVAL 25 #define RUNS_PER_CHECKPOINT 10000 /* For ref, e_max is 128, a_max is 136, r_max is ~650, ORIGIN_STATS is 14, OF_MAX is ~120 */ /* There are 416 kinds, of which about 150-200 are wearable */ static int randarts = 0; static int no_selling = 0; static u32b num_runs = 1; static bool quiet = FALSE; static int nextkey = 0; static int running_stats = 0; static char *ANGBAND_DIR_STATS; static int *consumables_index; static int *wearables_index; static int *pval_flags_index; static int wearable_count = 0; static int consumable_count = 0; static int pval_flags_count = 0; struct wearables_data { u32b count; u32b dice[TOP_DICE][TOP_SIDES]; u32b ac[TOP_AC]; u32b hit[TOP_PLUS]; u32b dam[TOP_PLUS]; /* u32b power[TOP_POWER]; not enough memory - add it later in bands */ u32b *egos; u32b flags[OF_MAX]; u32b *pval_flags[TOP_PVAL]; }; static struct level_data { u32b *monsters; /* u32b *vaults; Add these later - requires passing into generate.c u32b *pits; */ u32b obj_feelings[OBJ_FEEL_MAX]; u32b mon_feelings[MON_FEEL_MAX]; long long gold[ORIGIN_STATS]; u32b *artifacts[ORIGIN_STATS]; u32b *consumables[ORIGIN_STATS]; struct wearables_data *wearables[ORIGIN_STATS]; } level_data[LEVEL_MAX]; static void create_indices() { int i; consumables_index = C_ZNEW(z_info->k_max, int); wearables_index = C_ZNEW(z_info->k_max, int); pval_flags_index = C_ZNEW(OF_MAX, int); for (i = 0; i < z_info->k_max; i++) { object_type object_type_body; object_type *o_ptr = &object_type_body; object_kind *kind = &k_info[i]; o_ptr->tval = kind->tval; if (! kind->name) continue; if (wearable_p(o_ptr)) wearables_index[i] = ++wearable_count; else consumables_index[i] = ++consumable_count; } for (i = 0; i < OF_MAX; i++) if (flag_uses_pval(i)) pval_flags_index[i] = ++pval_flags_count; } static void alloc_memory() { int i, j, k, l; for (i = 0; i < LEVEL_MAX; i++) { level_data[i].monsters = C_ZNEW(z_info->r_max, u32b); /* level_data[i].vaults = C_ZNEW(z_info->v_max, u32b); level_data[i].pits = C_ZNEW(z_info->pit_max, u32b); */ for (j = 0; j < ORIGIN_STATS; j++) { level_data[i].artifacts[j] = C_ZNEW(z_info->a_max, u32b); level_data[i].consumables[j] = C_ZNEW(consumable_count + 1, u32b); level_data[i].wearables[j] = C_ZNEW(wearable_count + 1, struct wearables_data); for (k = 0; k < wearable_count + 1; k++) { level_data[i].wearables[j][k].egos = C_ZNEW(z_info->e_max, u32b); for (l = 0; l < TOP_PVAL; l++) level_data[i].wearables[j][k].pval_flags[l] = C_ZNEW(pval_flags_count + 1, u32b); } } } } static void free_stats_memory(void) { int i, j, k, l; for (i = 0; i < LEVEL_MAX; i++) { mem_free(level_data[i].monsters); /* mem_free(level_data[i].vaults); mem_free(level_data[i].pits); */ for (j = 0; j < ORIGIN_STATS; j++) { mem_free(level_data[i].artifacts[j]); mem_free(level_data[i].consumables[j]); for (k = 0; k < wearable_count + 1; k++) { for (l = 0; l < TOP_PVAL; l++) { mem_free(level_data[i].wearables[j][k].pval_flags[l]); } mem_free(level_data[i].wearables[j][k].egos); } mem_free(level_data[i].wearables[j]); } } mem_free(consumables_index); mem_free(wearables_index); mem_free(pval_flags_index); string_free(ANGBAND_DIR_STATS); } /* Copied from birth.c:generate_player() */ static void generate_player_for_stats() { OPT(birth_randarts) = randarts; OPT(birth_no_selling) = no_selling; OPT(birth_no_stacking) = FALSE; OPT(auto_more) = TRUE; p_ptr->wizard = 1; /* Set wizard mode on */ p_ptr->psex = 0; /* Female */ p_ptr->race = races; /* Human */ p_ptr->class = classes; /* Warrior */ /* Level 1 */ p_ptr->max_lev = p_ptr->lev = 1; /* Experience factor */ p_ptr->expfact = p_ptr->race->r_exp + p_ptr->class->c_exp; /* Hitdice */ p_ptr->hitdie = p_ptr->race->r_mhp + p_ptr->class->c_mhp; /* Initial hitpoints -- high just to be safe */ p_ptr->mhp = p_ptr->chp = 2000; /* Pre-calculate level 1 hitdice */ p_ptr->player_hp[0] = p_ptr->hitdie; /* Set age/height/weight */ p_ptr->ht = p_ptr->ht_birth = 66; p_ptr->wt = p_ptr->wt_birth = 150; p_ptr->age = 14; /* Set social class and (null) history */ p_ptr->history = get_history(p_ptr->race->history, &p_ptr->sc); p_ptr->sc_birth = p_ptr->sc; } static void initialize_character(void) { u32b seed; if (!quiet) { printf(" [I ]\b\b\b\b\b\b"); fflush(stdout); } seed = (time(NULL)); Rand_quick = FALSE; Rand_state_init(seed); player_init(p_ptr); generate_player_for_stats(); seed_flavor = randint0(0x10000000); seed_town = randint0(0x10000000); seed_randart = randint0(0x10000000); if (randarts) { do_randart(seed_randart, TRUE); } store_reset(); flavor_init(); p_ptr->playing = TRUE; p_ptr->autosave = FALSE; cave_generate(cave, p_ptr); } static void kill_all_monsters(int level) { int i; for (i = cave_monster_max(cave) - 1; i >= 1; i--) { const monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; level_data[level].monsters[m_ptr->r_idx]++; monster_death(i, TRUE); if (rf_has(r_ptr->flags, RF_UNIQUE)) r_ptr->max_num = 0; } } static void unkill_uniques(void) { int i; if (!quiet) { printf(" [U ]\b\b\b\b\b\b"); fflush(stdout); } for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (rf_has(r_ptr->flags, RF_UNIQUE)) r_ptr->max_num = 1; } } static void reset_artifacts(void) { int i; if (!quiet) { printf(" [R ]\b\b\b\b\b\b"); fflush(stdout); } for (i = 0; i < z_info->a_max; i++) a_info[i].created = FALSE; } static void log_all_objects(int level) { int x, y, i; for (y = 1; y < DUNGEON_HGT - 1; y++) { for (x = 1; x < DUNGEON_WID - 1; x++) { object_type *o_ptr = get_first_object(y, x); if (o_ptr) do { /* u32b o_power = 0; */ /* Mark object as fully known */ object_notice_everything(o_ptr); /* o_power = object_power(o_ptr, FALSE, NULL, TRUE); */ /* Capture gold amounts */ if (o_ptr->tval == TV_GOLD) level_data[level].gold[o_ptr->origin] += o_ptr->pval[DEFAULT_PVAL]; /* Capture artifact drops */ if (o_ptr->artifact) level_data[level].artifacts[o_ptr->origin][o_ptr->artifact->aidx]++; /* Capture kind details */ if (wearable_p(o_ptr)) { struct wearables_data *w = &level_data[level].wearables[o_ptr->origin][wearables_index[o_ptr->kind->kidx]]; w->count++; w->dice[MIN(o_ptr->dd, TOP_DICE - 1)][MIN(o_ptr->ds, TOP_SIDES - 1)]++; w->ac[MIN(MAX(o_ptr->ac + o_ptr->to_a, 0), TOP_AC - 1)]++; w->hit[MIN(MAX(o_ptr->to_h, 0), TOP_PLUS - 1)]++; w->dam[MIN(MAX(o_ptr->to_d, 0), TOP_PLUS - 1)]++; /* Capture egos */ if (o_ptr->ego) w->egos[o_ptr->ego->eidx]++; /* Capture object flags */ for (i = of_next(o_ptr->flags, FLAG_START); i != FLAG_END; i = of_next(o_ptr->flags, i + 1)) { w->flags[i]++; if (flag_uses_pval(i)) { int p = o_ptr->pval[which_pval(o_ptr, i)]; w->pval_flags[MIN(MAX(p, 0), TOP_PVAL - 1)][pval_flags_index[i]]++; } } } else level_data[level].consumables[o_ptr->origin][consumables_index[o_ptr->kind->kidx]]++; } while ((o_ptr = get_next_object(o_ptr))); } } } static void descend_dungeon(void) { int level; u16b obj_f, mon_f; clock_t last = 0; clock_t wait = CLOCKS_PER_SEC / 5; for (level = 1; level < LEVEL_MAX; level++) { if (!quiet) { clock_t now = clock(); if (now - last > wait) { printf(" [%3d]\b\b\b\b\b\b", level); fflush(stdout); last = now; } } dungeon_change_level(level); cave_generate(cave, p_ptr); /* Store level feelings */ obj_f = cave->feeling / 10; mon_f = cave->feeling - (10 * obj_f); level_data[level].obj_feelings[MIN(obj_f, OBJ_FEEL_MAX - 1)]++; level_data[level].mon_feelings[MIN(mon_f, MON_FEEL_MAX - 1)]++; kill_all_monsters(level); log_all_objects(level); } } static void prep_output_dir(void) { size_t size = strlen(ANGBAND_DIR_USER) + strlen(PATH_SEP) + 6; ANGBAND_DIR_STATS = mem_alloc(size); strnfmt(ANGBAND_DIR_STATS, size, "%s%sstats", ANGBAND_DIR_USER, PATH_SEP); if (dir_create(ANGBAND_DIR_STATS)) { return; } else { quit("Couldn't create stats directory!"); } } /** * Caller is responsible for prepping and finalizing flags_stmt, which * should have two parameters. */ static int stats_dump_oflags(sqlite3_stmt *flags_stmt, int idx, bitflag flags[OF_SIZE]) { int err, flag; err = sqlite3_bind_int(flags_stmt, 1, idx); if (err) return err; for (flag = of_next(flags, FLAG_START); flag != FLAG_END; flag = of_next(flags, flag + 1)) { err = sqlite3_bind_int(flags_stmt, 2, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } return SQLITE_OK; } static int stats_dump_artifacts(void) { int err, idx, i, flag; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *pval_flags_stmt; strnfmt(sql_buf, 256, "INSERT INTO artifact_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO artifact_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO artifact_pval_flags_map VALUES (?,?,?);"); err = stats_db_stmt_prep(&pval_flags_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->a_max; idx++) { artifact_type *a_ptr = &a_info[idx]; if (!a_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, a_ptr->name, strlen(a_ptr->name), SQLITE_STATIC); if (err) return err; err = stats_db_bind_ints(info_stmt, 14, 2, a_ptr->tval, a_ptr->sval, a_ptr->weight, a_ptr->cost, a_ptr->alloc_prob, a_ptr->alloc_min, a_ptr->alloc_max, a_ptr->ac, a_ptr->dd, a_ptr->ds, a_ptr->to_h, a_ptr->to_d, a_ptr->to_a, a_ptr->effect); STATS_DB_STEP_RESET(info_stmt) err = stats_dump_oflags(flags_stmt, idx, a_ptr->flags); if (err) return err; for (i = 0; i < a_ptr->num_pvals; i++) { for (flag = of_next(a_ptr->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(a_ptr->pval_flags[i], flag + 1)) { err = stats_db_bind_ints(pval_flags_stmt, 3, 0, idx, flag, a_ptr->pval[i]); if (err) return err; STATS_DB_STEP_RESET(pval_flags_stmt) } } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(pval_flags_stmt) return SQLITE_OK; } static int stats_dump_egos(void) { int err, idx, flag, i; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *pval_flags_stmt, *type_stmt; strnfmt(sql_buf, 256, "INSERT INTO ego_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO ego_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO ego_pval_flags_map VALUES (?,?,?,?);"); err = stats_db_stmt_prep(&pval_flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO ego_type_map VALUES (?,?,?,?);"); err = stats_db_stmt_prep(&type_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->e_max; idx++) { ego_item_type *e_ptr = &e_info[idx]; if (!e_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, e_ptr->name, strlen(e_ptr->name), SQLITE_STATIC); if (err) return err; err = stats_db_bind_rv(info_stmt, 3, e_ptr->to_h); if (err) return err; err = stats_db_bind_rv(info_stmt, 4, e_ptr->to_d); if (err) return err; err = stats_db_bind_rv(info_stmt, 5, e_ptr->to_a); if (err) return err; err = stats_db_bind_ints(info_stmt, 9, 5, e_ptr->cost, e_ptr->level, e_ptr->rarity, e_ptr->rating, e_ptr->num_pvals, e_ptr->min_to_h, e_ptr->min_to_d, e_ptr->min_to_a, e_ptr->xtra); if (err) return err; STATS_DB_STEP_RESET(info_stmt) err = stats_dump_oflags(flags_stmt, idx, e_ptr->flags); if (err) return err; for (i = 0; i < e_ptr->num_pvals; i++) { for (flag = of_next(e_ptr->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(e_ptr->pval_flags[i], flag + 1)) { err = stats_db_bind_ints(pval_flags_stmt, 3, 0, idx, flag, e_ptr->min_pval[i]); if (err) return err; err = stats_db_bind_rv(pval_flags_stmt, 4, e_ptr->pval[i]); if (err) return err; STATS_DB_STEP_RESET(pval_flags_stmt) } } for (i = 0; i < EGO_TVALS_MAX; i++) { err = stats_db_bind_ints(type_stmt, 4, 0, idx, e_ptr->tval[i], e_ptr->min_sval[i], e_ptr->max_sval[i]); if (err) return err; STATS_DB_STEP_RESET(type_stmt) } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(pval_flags_stmt) STATS_DB_FINALIZE(type_stmt) return SQLITE_OK; } static int stats_dump_objects(void) { int err, idx, i, flag; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *pval_flags_stmt; strnfmt(sql_buf, 256, "INSERT INTO object_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO object_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO object_pval_flags_map VALUES (?,?,?);"); err = stats_db_stmt_prep(&pval_flags_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->k_max; idx++) { object_kind *k_ptr = &k_info[idx]; if (!k_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, k_ptr->name, strlen(k_ptr->name), SQLITE_STATIC); if (err) return err; err = stats_db_bind_ints(info_stmt, 14, 2, k_ptr->tval, k_ptr->sval, k_ptr->level, k_ptr->weight, k_ptr->cost, k_ptr->ac, k_ptr->dd, k_ptr->ds, k_ptr->alloc_prob, k_ptr->alloc_min, k_ptr->alloc_max, k_ptr->effect, k_ptr->gen_mult_prob, k_ptr->stack_size); if (err) return err; err = stats_db_bind_rv(info_stmt, 17, k_ptr->to_h); if (err) return err; err = stats_db_bind_rv(info_stmt, 18, k_ptr->to_d); if (err) return err; err = stats_db_bind_rv(info_stmt, 19, k_ptr->to_a); if (err) return err; err = stats_db_bind_rv(info_stmt, 20, k_ptr->charge); if (err) return err; err = stats_db_bind_rv(info_stmt, 21, k_ptr->time); if (err) return err; STATS_DB_STEP_RESET(info_stmt) err = stats_dump_oflags(flags_stmt, idx, k_ptr->flags); if (err) return err; for (i = 0; i < k_ptr->num_pvals; i++) { for (flag = of_next(k_ptr->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(k_ptr->pval_flags[i], flag + 1)) { err = stats_db_bind_ints(pval_flags_stmt, 2, 0, idx, flag); if (err) return err; err = stats_db_bind_rv(pval_flags_stmt, 3, k_ptr->pval[i]); if (err) return err; STATS_DB_STEP_RESET(pval_flags_stmt) } } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(pval_flags_stmt) /* Handle object_base */ strnfmt(sql_buf, 256, "INSERT INTO object_base_info VALUES (?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO object_base_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; idx = 0; for (idx = 0; idx < TV_MAX; idx++) { object_base *kb_ptr = &kb_info[idx]; if (!kb_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, kb_ptr->name, strlen(kb_ptr->name), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(info_stmt) for (flag = of_next(kb_ptr->flags, FLAG_START); flag != FLAG_END; flag = of_next(kb_ptr->flags, flag + 1)) { err = stats_db_bind_ints(flags_stmt, 2, 0, idx, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) return SQLITE_OK; } static int stats_dump_monsters(void) { int err, idx, flag; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *spell_flags_stmt; monster_base *rb_ptr; strnfmt(sql_buf, 256, "INSERT INTO monster_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO monster_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO monster_spell_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&spell_flags_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->r_max; idx++) { monster_race *r_ptr = &r_info[idx]; /* Skip empty entries */ if (!r_ptr->name) continue; err = stats_db_bind_ints(info_stmt, 10, 0, idx, r_ptr->ac, r_ptr->sleep, r_ptr->speed, r_ptr->mexp, r_ptr->avg_hp, r_ptr->freq_innate, r_ptr->freq_spell, r_ptr->level, r_ptr->rarity); if (err) return err; err = sqlite3_bind_text(info_stmt, 11, r_ptr->name, strlen(r_ptr->name), SQLITE_STATIC); if (err) return err; err = sqlite3_bind_text(info_stmt, 12, r_ptr->base->name, strlen(r_ptr->base->name), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(info_stmt) for (flag = rf_next(r_ptr->flags, FLAG_START); flag != FLAG_END; flag = rf_next(r_ptr->flags, flag + 1)) { err = stats_db_bind_ints(flags_stmt, 2, 0, idx, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } for (flag = rsf_next(r_ptr->spell_flags, FLAG_START); flag != FLAG_END; flag = rsf_next(r_ptr->spell_flags, flag + 1)) { err = stats_db_bind_ints(spell_flags_stmt, 2, 0, idx, flag); if (err) return err; STATS_DB_STEP_RESET(spell_flags_stmt) } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(spell_flags_stmt) /* Handle monster bases */ strnfmt(sql_buf, 256, "INSERT INTO monster_base_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO monster_base_spell_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&spell_flags_stmt, sql_buf); if (err) return err; for (rb_ptr = rb_info, idx = 0; rb_ptr; rb_ptr = rb_ptr->next, idx++) { for (flag = rf_next(rb_ptr->flags, FLAG_START); flag != FLAG_END; flag = rf_next(rb_ptr->flags, flag + 1)) { err = sqlite3_bind_text(flags_stmt, 1, rb_ptr->name, strlen(rb_ptr->name), SQLITE_STATIC); if (err) return err; err = sqlite3_bind_int(flags_stmt, 2, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } for (flag = rsf_next(rb_ptr->spell_flags, FLAG_START); flag != FLAG_END; flag = rsf_next(rb_ptr->spell_flags, flag + 1)) { err = sqlite3_bind_text(spell_flags_stmt, 1, rb_ptr->name, strlen(rb_ptr->name), SQLITE_STATIC); if (err) return err; err = sqlite3_bind_int(spell_flags_stmt, 2, flag); if (err) return err; STATS_DB_STEP_RESET(spell_flags_stmt) } } STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(spell_flags_stmt) return SQLITE_OK; } static int stats_dump_lists(void) { int err, idx; char sql_buf[256]; sqlite3_stmt *sql_stmt; /* Note: these lists are sometimes different from the ones the core * game uses, insofar as we put the name of the flag in a * description field. */ info_entry effects[] = { #define EFFECT(x, y, r, z) { EF_##x, y, r, #x }, #include "list-effects.h" #undef EFFECT }; char *r_info_flags[] = { #define RF(a, b) #a, #include "monster/list-mon-flags.h" #undef RF NULL }; struct mon_spell mon_spell_table[] = { #define RSF(a, b, c, d, e, f, g, h, i, j, k, l, m) \ { RSF_##a, b, #a, d, e, f, g, h, i, j, k, l, m }, #define RV(b, x, y, m) {b, x, y, m} #include "monster/list-mon-spells.h" #undef RV #undef RSF }; struct object_flag object_flag_table[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) \ { OF_##a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, #a }, #include "object/list-object-flags.h" #undef OF }; struct slay slay_table[] = { #define SLAY(a, b, c, d, e, f, g, h, i, j) \ { SL_##a, b, c, d, e, f, g, h, #a, j}, #include "object/list-slays.h" #undef SLAY }; err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO effects_list VALUES(?,?,?,?);"); if (err) return err; for (idx = 1; idx < EF_MAX; idx++) { if (! effects[idx].desc) continue; err = stats_db_bind_ints(sql_stmt, 3, 0, idx, effects[idx].aim, effects[idx].power); if (err) return err; err = sqlite3_bind_text(sql_stmt, 4, effects[idx].desc, strlen(effects[idx].desc), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO monster_flags_list VALUES(?,?);"); if (err) return err; for (idx = 0; r_info_flags[idx] != NULL; idx++) { err = sqlite3_bind_int(sql_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(sql_stmt, 2, r_info_flags[idx], strlen(r_info_flags[idx]), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO monster_spell_flags_list VALUES(?,?,?,?);"); if (err) return err; for (idx = 1; idx < RSF_MAX; idx++) { if (! mon_spell_table[idx].desc) continue; err = stats_db_bind_ints(sql_stmt, 3, 0, idx, mon_spell_table[idx].cap, mon_spell_table[idx].div); if (err) return err; err = sqlite3_bind_text(sql_stmt, 4, mon_spell_table[idx].desc, strlen(mon_spell_table[idx].desc), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO object_flags_list VALUES(?,?,?,?,?,?);"); if (err) return err; for (idx = 1; idx < OF_MAX; idx++) { struct object_flag *of_ptr = &object_flag_table[idx]; if (! of_ptr->message) continue; err = stats_db_bind_ints(sql_stmt, 5, 0, idx, of_ptr->pval, of_ptr->type, of_ptr->power, of_ptr->pval_mult); if (err) return err; err = sqlite3_bind_text(sql_stmt, 6, of_ptr->message, strlen(of_ptr->message), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO object_slays_list VALUES(?,?,?,?,?,?);"); if (err) return err; for (idx = 1; idx < SL_MAX; idx++) { struct slay *s_ptr = &slay_table[idx]; if (! s_ptr->desc) continue; err = stats_db_bind_ints(sql_stmt, 5, 0, idx, s_ptr->object_flag, s_ptr->monster_flag, s_ptr->resist_flag, s_ptr->mult); if (err) return err; err = sqlite3_bind_text(sql_stmt, 6, s_ptr->desc, strlen(s_ptr->desc), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) /* Hack, until we refactor origin kinds into a header */ #define STATS_ORIGIN(idx,name) \ strnfmt(sql_buf, 256, "INSERT INTO origin_flags_list VALUES(%d,'%s');", idx, #name); \ err = stats_db_exec(sql_buf);\ if (err) return err; STATS_ORIGIN(0,NONE) STATS_ORIGIN(1,FLOOR) STATS_ORIGIN(2,DROP) STATS_ORIGIN(3,CHEST) STATS_ORIGIN(4,DROP_SPECIAL) STATS_ORIGIN(5,DROP_PIT) STATS_ORIGIN(6,DROP_VAULT) STATS_ORIGIN(7,SPECIAL) STATS_ORIGIN(8,PIT) STATS_ORIGIN(9,VAULT) STATS_ORIGIN(10,LABYRINTH) STATS_ORIGIN(11,CAVERN) STATS_ORIGIN(12,RUBBLE) STATS_ORIGIN(13,MIXED) #undef STATS_ORIGIN return SQLITE_OK; } static int stats_dump_info(void) { int err; char sql_buf[256]; /* Wrap entire write into a transaction */ err = stats_db_exec("BEGIN TRANSACTION;"); if (err) return err; /* Metadata */ strnfmt(sql_buf, 256, "INSERT INTO metadata VALUES('version','%s');", buildver); err = stats_db_exec(sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO metadata VALUES('randarts',%d);", randarts); err = stats_db_exec(sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO metadata VALUES('no_selling',%d);", no_selling); err = stats_db_exec(sql_buf); if (err) return err; err = stats_dump_artifacts(); if (err) return err; err = stats_dump_egos(); if (err) return err; err = stats_dump_monsters(); if (err) return err; err = stats_dump_objects(); if (err) return err; err = stats_dump_lists(); if (err) return err; /* Commit transaction */ return stats_db_exec("COMMIT;"); } /** * Open the database connection and create the database tables. * All count tables will contain a level column (INTEGER) and a * count column (INTEGER). Some tables will include other INTEGER columns * for object origin, feeling, attributes, indices, or object flags. * Note that random_value types are stored as either A+BdC+Md or A. * Tables: * metadata -- key-value pairs describing the stats run * artifact_info -- dump of artifact.txt * artifact_flags_map -- map between artifacts and object flags * artifact_pval_flags_map -- map between artifacts and pval flags, with pvals * ego_info -- dump of ego_item.txt * ego_flags_map -- map between egos and object flags * ego_pval_flags_map -- map between egos and pval flags, with pvals and minima * ego_type_map -- map between egos and tvals/svals * monster_base_flags_map -- map between monster bases and monster flags * monster_base_spell_flags_map -- map between monster bases and monster spell flags * monster_info -- dump of monsters.txt * monster_flags_map -- map between monsters and monster flags * monster_spell_flags_map -- map between monsters and monster spell flags * object_base_info -- dump of object_base.txt * object_base_flags_map -- map between object templates and object flags * object_info -- dump of objects.txt * object_flags_map -- map between artifacts and object flags * object_pval_flags_map -- map between artifacts and pval flags, with pvals * effects_list -- dump of list-effects.h * monster_flags_list -- dump of list-mon-flags.h * monster_spell_flags_list -- dump of list-mon-spells.h * object_flags_list -- dump of list-object-flags.h * object_slays_list -- dump of list-object-slays.h * origin_flags_list -- dump of origin enum * Count tables: * monsters * obj_feelings * mon_feelings * gold * artifacts * consumables * wearables_count * wearables_dice * wearables_ac * wearables_hit * wearables_dam * wearables_egos * wearables_flags * wearables_pval_flags */ static bool stats_prep_db(void) { bool status; int err; /* Open the database connection */ status = stats_db_open(); if (!status) return status; /* Create some tables */ err = stats_db_exec("CREATE TABLE metadata(field TEXT UNIQUE NOT NULL, value TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifact_info(idx INT PRIMARY KEY, name TEXT, tval INT, sval INT, weight INT, cost INT, alloc_prob INT, alloc_min INT, alloc_max INT, ac INT, dd INT, ds INT, to_h INT, to_d INT, to_a INT, effect INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifact_flags_map(a_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifact_pval_flags_map(a_idx INT, pval_flag INT, pval INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_info(idx INT PRIMARY KEY, name TEXT, to_h TEXT, to_d TEXT, to_a TEXT, cost INT, level INT, rarity INT, rating INT, num_pvals INT, min_to_h INT, min_to_d INT, min_to_a INT, xtra INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_flags_map(e_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_pval_flags_map(e_idx INT, pval_flag INT, min_pval INT, pval TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_type_map(e_idx INT, tval INT, min_sval INT, max_sval INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_base_flags_map(rb_idx INT, r_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_base_spell_flags_map(rb_idx INT, rs_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_info(idx INT PRIMARY KEY, ac INT, sleep INT, speed INT, mexp INT, hp INT, freq_innate INT, freq_spell INT, level INT, rarity INT, name TEXT, base TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_flags_map(r_idx INT, r_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_spell_flags_map(r_idx INT, rs_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_base_info(idx INT PRIMARY KEY, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_base_flags_map(kb_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_info(idx INT PRIMARY KEY, name TEXT, tval INT, sval INT, level INT, weight INT, cost INT, ac INT, dd INT, ds INT, alloc_prob INT, alloc_min INT, alloc_max INT, effect INT, gen_mult_prob INT, stack_size INT, to_h TEXT, to_d TEXT, to_a TEXT, charge TEXT, recharge_time TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_flags_map(k_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_pval_flags_map(k_idx INT, pval_flag INT, pval TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE effects_list(idx INT PRIMARY KEY, aim INT, rating INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_flags_list(idx INT PRIMARY KEY, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_spell_flags_list(idx INT PRIMARY KEY, cap INT, div INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_flags_list(idx INT PRIMARY KEY, pval INT, type INT, power INT, pval_mult INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_slays_list(idx INT PRIMARY KEY, object_flag INT, monster_flag INT, resist_flag INT, mult INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE origin_flags_list(idx INT PRIMARY KEY, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monsters(level INT, count INT, k_idx INT, UNIQUE (level, k_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE obj_feelings(level INT, count INT, feeling INT, UNIQUE (level, feeling) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE mon_feelings(level INT, count INT, feeling INT, UNIQUE (level, feeling) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE gold(level INT, count INT, origin INT, UNIQUE (level, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifacts(level INT, count INT, a_idx INT, origin INT, UNIQUE (level, a_idx, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE consumables(level INT, count INT, k_idx INT, origin INT, UNIQUE (level, k_idx, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_count(level INT, count INT, k_idx INT, origin INT, UNIQUE (level, k_idx, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_dice(level INT, count INT, k_idx INT, origin INT, dd INT, ds INT, UNIQUE (level, k_idx, origin, dd, ds) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_ac(level INT, count INT, k_idx INT, origin INT, ac INT, UNIQUE (level, k_idx, origin, ac) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_hit(level INT, count INT, k_idx INT, origin INT, to_h INT, UNIQUE (level, k_idx, origin, to_h) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_dam(level INT, count INT, k_idx INT, origin INT, to_d INT, UNIQUE (level, k_idx, origin, to_d) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_egos(level INT, count INT, k_idx INT, origin INT, e_idx INT, UNIQUE (level, k_idx, origin, e_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_flags(level INT, count INT, k_idx INT, origin INT, of_idx INT, UNIQUE (level, k_idx, origin, of_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_pval_flags(level INT, count INT, k_idx INT, origin INT, pval INT, of_idx INT, UNIQUE (level, k_idx, origin, pval, of_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_dump_info(); if (err) return false; return true; } /** * Find the offset of the given member of the level_data struct. Not elegant. */ static int stats_level_data_offsetof(const char *member) { if (streq(member, "monsters")) return offsetof(struct level_data, monsters); else if (streq(member, "obj_feelings")) return offsetof(struct level_data, obj_feelings); else if (streq(member, "mon_feelings")) return offsetof(struct level_data, mon_feelings); else if (streq(member, "gold")) return offsetof(struct level_data, gold); else if (streq(member, "artifacts")) return offsetof(struct level_data, artifacts); else if (streq(member, "consumables")) return offsetof(struct level_data, consumables); else if (streq(member, "wearables")) return offsetof(struct level_data, wearables); /* We should not get to this point. */ assert(0); } /** * Find the offset of the given member of the wearables_data struct. Not * elegant. */ static int stats_wearables_data_offsetof(const char *member) { if (streq(member, "count")) return offsetof(struct wearables_data, count); else if (streq(member, "dice")) return offsetof(struct wearables_data, dice); else if (streq(member, "ac")) return offsetof(struct wearables_data, ac); else if (streq(member, "hit")) return offsetof(struct wearables_data, hit); else if (streq(member, "dam")) return offsetof(struct wearables_data, dam); else if (streq(member, "egos")) return offsetof(struct wearables_data, egos); else if (streq(member, "flags")) return offsetof(struct wearables_data, flags); else if (streq(member, "pval_flags")) return offsetof(struct wearables_data, pval_flags); /* We should not get to this point. */ assert(0); } /** * Given a pointer to a dynamically allocated array and a value, look up * the index with that value; e.g. given wearables_index[k_idx], return k_idx. * If not found, return -1 * value. */ static int stats_lookup_index(const int *index, int max_idx, int value) { int idx; for (idx = 0; idx < max_idx; idx ++) { if (index[idx] == value) return idx; } return -1 * value; } static int stats_write_db_level_data(const char *table, int max_idx) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, i, offset; strnfmt(sql_buf, 256, "INSERT INTO %s VALUES(?,?,?);", table); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_level_data_offsetof(table); for (level = 1; level < LEVEL_MAX; level++) { for (i = 0; i < max_idx; i++) { /* This arcane expression finds the value of * level_data[level].[i] */ u32b count; if (streq(table, "gold")) { count = *((long long *)((byte *)&level_data[level] + offset) + i); } else { count = *((u32b *)((byte *)&level_data[level] + offset) + i); } if (!count) continue; err = stats_db_bind_ints(sql_stmt, 3, 0, level, count, i); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } return sqlite3_finalize(sql_stmt); } static int stats_write_db_level_data_items(const char *table, int max_idx, bool translate_consumables) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, origin, i, offset; strnfmt(sql_buf, 256, "INSERT INTO %s VALUES(?,?,?,?);", table); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_level_data_offsetof(table); for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (i = 0; i < max_idx; i++) { /* This arcane expression finds the value of * level_data[level].
[origin][i] */ u32b count = ((u32b **)((byte *)&level_data[level] + offset))[origin][i]; if (!count) continue; err = stats_db_bind_ints(sql_stmt, 4, 0, level, count, translate_consumables ? stats_lookup_index(consumables_index, z_info->k_max, i) : i, origin); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } return sqlite3_finalize(sql_stmt); } static int stats_write_db_wearables_count(void) { sqlite3_stmt *sql_stmt; int err, level, origin, k_idx, idx; err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO wearables_count VALUES(?,?,?,?);"); if (err) return err; for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (idx = 0; idx < wearable_count + 1; idx++) { u32b count = level_data[level].wearables[origin][idx].count; /* Skip if object did not appear */ if (!count) continue; k_idx = stats_lookup_index(wearables_index, z_info->k_max, idx); /* Skip if pile */ if (! k_idx) continue; err = stats_db_bind_ints(sql_stmt, 4, 0, level, count, k_idx, origin); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } return sqlite3_finalize(sql_stmt); } /** * Unfortunately, the arcane expression used to find the value of an array * member of a struct differs depending on whether the member is declared * as an array or as a pointer. Pass in true if the member is an array, and * false if the member is a pointer. */ static int stats_write_db_wearables_array(const char *field, int max_val, bool array_p) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, origin, idx, k_idx, i, offset; strnfmt(sql_buf, 256, "INSERT INTO wearables_%s VALUES(?,?,?,?,?);", field); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_wearables_data_offsetof(field); for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (idx = 0; idx < wearable_count + 1; idx++) { k_idx = stats_lookup_index(wearables_index, z_info->k_max, idx); /* Skip if pile */ if (! k_idx) continue; for (i = 0; i < max_val; i++) { /* This arcane expression finds the value of * level_data[level].wearables[origin][idx].[i] */ u32b count; if (array_p) { count = ((u32b *)((byte *)&level_data[level].wearables[origin][idx] + offset))[i]; } else { count = ((u32b *)*((u32b **)((byte *)&level_data[level].wearables[origin][idx] + offset)))[i]; } if (!count) continue; err = stats_db_bind_ints(sql_stmt, 5, 0, level, count, k_idx, origin, i); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } } return sqlite3_finalize(sql_stmt); } /** * Unfortunately, the arcane expression used to find the value of an array * member of a struct differs depending on whether the member is declared * as an array or as a pointer. Pass in true if the member is an array, and * false if the member is a pointer. */ static int stats_write_db_wearables_2d_array(const char *field, int max_val1, int max_val2, bool array_p, bool translate_pval_flags) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, origin, idx, k_idx, i, j, offset; strnfmt(sql_buf, 256, "INSERT INTO wearables_%s VALUES(?,?,?,?,?,?);", field); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_wearables_data_offsetof(field); for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (idx = 0; idx < wearable_count + 1; idx++) { k_idx = stats_lookup_index(wearables_index, z_info->k_max, idx); /* Skip if pile */ if (! k_idx) continue; for (i = 0; i < max_val1; i++) { for (j = 0; j < max_val2; j++) { /* This arcane expression finds the value of * level_data[level].wearables[origin][idx].[i][j] */ u32b count; int real_j = translate_pval_flags ? stats_lookup_index(pval_flags_index, OF_MAX, j) : j; if (i == 0 && real_j == 0) continue; if (array_p) { count = ((u32b *)((byte *)&level_data[level].wearables[origin][idx] + offset))[i * max_val2 + j]; } else { count = *(*((u32b **)((byte *)&level_data[level].wearables[origin][idx] + offset) + i) + j); } if (!count) continue; err = stats_db_bind_ints(sql_stmt, 6, 0, level, count, k_idx, origin, i, real_j); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } } } return sqlite3_finalize(sql_stmt); } static int stats_write_db(u32b run) { char sql_buf[256]; int err; /* Wrap entire write into a transaction */ err = stats_db_exec("BEGIN TRANSACTION;"); if (err) return err; strnfmt(sql_buf, 256, "INSERT OR REPLACE INTO metadata VALUES('runs', %d);", run); err = stats_db_exec(sql_buf); if (err) return err; err = stats_write_db_level_data("monsters", z_info->r_max); if (err) return err; err = stats_write_db_level_data("obj_feelings", OBJ_FEEL_MAX); if (err) return err; err = stats_write_db_level_data("mon_feelings", MON_FEEL_MAX); if (err) return err; err = stats_write_db_level_data("gold", ORIGIN_STATS); if (err) return err; err = stats_write_db_level_data_items("artifacts", z_info->a_max, false); if (err) return err; err = stats_write_db_level_data_items("consumables", consumable_count + 1, true); if (err) return err; err = stats_write_db_wearables_count(); if (err) return err; err = stats_write_db_wearables_2d_array("dice", TOP_DICE, TOP_SIDES, true, false); if (err) return err; err = stats_write_db_wearables_array("ac", TOP_AC, true); if (err) return err; err = stats_write_db_wearables_array("hit", TOP_PLUS, true); if (err) return err; err = stats_write_db_wearables_array("dam", TOP_PLUS, true); if (err) return err; err = stats_write_db_wearables_array("egos", z_info->e_max, false); if (err) return err; err = stats_write_db_wearables_array("flags", OF_MAX, true); if (err) return err; err = stats_write_db_wearables_2d_array("pval_flags", TOP_PVAL, pval_flags_count + 1, false, true); if (err) return err; /* Commit transaction */ err = stats_db_exec("COMMIT;"); if (err) return err; return SQLITE_OK; } /** * Call with the number of runs that have been completed. */ #define STATS_PROGRESS_BAR_LEN 30 void progress_bar(u32b run, time_t start) { u32b i; u32b n = (run * STATS_PROGRESS_BAR_LEN) / num_runs; u32b p10 = ((long long)run * 1000) / num_runs; time_t delta = time(NULL) - start; u32b togo = num_runs - run; u32b expect = delta ? ((long long)delta * (long long)togo) / run : 0; int h = expect / 3600; int m = (expect % 3600) / 60; int s = expect % 60; printf("\r|"); for (i = 0; i < n; i++) printf("*"); for (i = 0; i < STATS_PROGRESS_BAR_LEN - n; i++) printf(" "); printf("| %d/%d (%5.1f%%) %3d:%02d:%02d ", run, num_runs, p10/10.0, h, m, s); fflush(stdout); } /** * Clean up memory after each run. Should only affect character and * dungeon structs allocated during normal initialization, not persistent * data like *_info. */ static void stats_cleanup_angband_run(void) { if (p_ptr->history) FREE(p_ptr->history); } static errr run_stats(void) { u32b run; artifact_type *a_info_save; unsigned int i; int err; bool status; time_t start; prep_output_dir(); create_indices(); alloc_memory(); if (randarts) { a_info_save = mem_zalloc(z_info->a_max * sizeof(artifact_type)); for (i = 0; i < z_info->a_max; i++) { if (!a_info[i].name) continue; memcpy(&a_info_save[i], &a_info[i], sizeof(artifact_type)); } } if (!quiet) printf("Creating the database and dumping info...\n"); status = stats_prep_db(); if (!status) quit("Couldn't prepare database!"); if (!quiet) { printf("Beginning %d runs...\n", num_runs); fflush(stdout); } start = time(NULL); for (run = 1; run <= num_runs; run++) { if (!quiet) progress_bar(run - 1, start); if (randarts) { for (i = 0; i < z_info->a_max; i++) { memcpy(&a_info[i], &a_info_save[i], sizeof(artifact_type)); } } initialize_character(); unkill_uniques(); reset_artifacts(); descend_dungeon(); stats_cleanup_angband_run(); /* Checkpoint every so many runs */ if (run % RUNS_PER_CHECKPOINT == 0) { err = stats_write_db(run); if (err) { stats_db_close(); quit_fmt("Problems writing to database! sqlite3 errno %d.", err); } } if (quiet && run % 1000 == 0) { printf("Finished %d runs.\n", run); fflush(stdout); } } if (!quiet) { progress_bar(num_runs, start); printf("\nSaving the data...\n"); fflush(stdout); } err = stats_write_db(run); stats_db_close(); if (err) quit_fmt("Problems writing to database! sqlite3 errno %d.", err); free_stats_memory(); cleanup_angband(); if (!quiet) printf("Done!\n"); quit(NULL); exit(0); } typedef struct term_data term_data; struct term_data { term t; }; static term_data td; typedef struct { int key; errr (*func)(int v); } term_xtra_func; static void term_init_stats(term *t) { return; } static void term_nuke_stats(term *t) { return; } static errr term_xtra_clear(int v) { return 0; } static errr term_xtra_noise(int v) { return 0; } static errr term_xtra_fresh(int v) { return 0; } static errr term_xtra_shape(int v) { return 0; } static errr term_xtra_alive(int v) { return 0; } static errr term_xtra_event(int v) { if (nextkey) { Term_keypress(nextkey, 0); nextkey = 0; } if (running_stats) { return 0; } running_stats = 1; return run_stats(); } static errr term_xtra_flush(int v) { return 0; } static errr term_xtra_delay(int v) { return 0; } static errr term_xtra_react(int v) { return 0; } static term_xtra_func xtras[] = { { TERM_XTRA_CLEAR, term_xtra_clear }, { TERM_XTRA_NOISE, term_xtra_noise }, { TERM_XTRA_FRESH, term_xtra_fresh }, { TERM_XTRA_SHAPE, term_xtra_shape }, { TERM_XTRA_ALIVE, term_xtra_alive }, { TERM_XTRA_EVENT, term_xtra_event }, { TERM_XTRA_FLUSH, term_xtra_flush }, { TERM_XTRA_DELAY, term_xtra_delay }, { TERM_XTRA_REACT, term_xtra_react }, { 0, NULL }, }; static errr term_xtra_stats(int n, int v) { int i; for (i = 0; xtras[i].func; i++) { if (xtras[i].key == n) { return xtras[i].func(v); } } return 0; } static errr term_curs_stats(int x, int y) { return 0; } static errr term_wipe_stats(int x, int y, int n) { return 0; } static errr term_text_stats(int x, int y, int n, byte a, const char *s) { return 0; } static void term_data_link(int i) { term *t = &td.t; term_init(t, 80, 24, 256); /* Ignore some actions for efficiency and safety */ t->never_bored = TRUE; t->never_frosh = TRUE; t->init_hook = term_init_stats; t->nuke_hook = term_nuke_stats; t->xtra_hook = term_xtra_stats; t->curs_hook = term_curs_stats; t->wipe_hook = term_wipe_stats; t->text_hook = term_text_stats; t->data = &td; Term_activate(t); angband_term[i] = t; } const char help_stats[] = "Stats mode, subopts -q(uiet) -r(andarts) -n(# of runs) -s(no selling)"; /* * Usage: * * angband -mstats -- [-q] [-r] [-nNNNN] [-s] * * -q Quiet mode (turn off progress messages) * -r Turn on randarts * -nNNNN Make NNNN runs through the dungeon (default: 1) * -s Turn on no-selling */ errr init_stats(int argc, char *argv[]) { int i; /* Skip over argv[0] */ for (i = 1; i < argc; i++) { if (streq(argv[i], "-r")) { randarts = 1; continue; } if (streq(argv[i], "-q")) { quiet = TRUE; continue; } if (prefix(argv[i], "-n")) { num_runs = atoi(&argv[i][2]); continue; } if (prefix(argv[i], "-s")) { no_selling = 1; continue; } printf("init-stats: bad argument '%s'\n", argv[i]); } term_data_link(0); return 0; } #endif /* USE_STATS */ angband-v3.3.2/src/randname.c0000644000175000017500000001121511651552410015327 0ustar chriscchrisc/* * File: randname.c * Purpose: Random name generation * * Copyright (c) 2007 Antony Sidwell, Sheldon Simms * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "randname.h" /* Markers for the start and end of words. */ #define S_WORD 26 #define E_WORD S_WORD #define TOTAL 27 typedef unsigned short name_probs[S_WORD+1][S_WORD+1][TOTAL+1]; /* * This function builds probability tables from a list of purely alphabetical * lower-case words, and puts them into the supplied name_probs object. * The array of names should have a NULL entry at the end of the list. * It relies on the ASCII character set (through use of A2I). */ static void build_prob(name_probs probs, const char **learn) { int c_prev, c_cur, c_next; const char *ch; int i; /* Build raw frequencies */ for (i = 0; learn[i] != NULL; i++) { c_prev = c_cur = S_WORD; ch = learn[i]; /* Iterate over the next word */ while (*ch != '\0') { c_next = A2I(tolower((unsigned char)*ch)); probs[c_prev][c_cur][c_next]++; probs[c_prev][c_cur][TOTAL]++; /* Step on */ c_prev = c_cur; c_cur = c_next; ch++; } probs[c_prev][c_cur][E_WORD]++; probs[c_prev][c_cur][TOTAL]++; } } /* * Use W. Sheldon Simms' random name generator algorithm (Markov Chain stylee). * * Generate a random word using the probability tables we built earlier. * Relies on the A2I and I2A macros (and so the ASCII character set) and * is_a_vowel (so the basic 5 English vowels). */ size_t randname_make(randname_type name_type, size_t min, size_t max, char *word_buf, size_t buflen, const char ***sections) { size_t lnum = 0; bool found_word = FALSE; static name_probs lprobs; static randname_type cached_type = RANDNAME_NUM_TYPES; assert(name_type > 0 && name_type < RANDNAME_NUM_TYPES); /* To allow for a terminating character */ assert(buflen > max); /* We cache one set of probabilities, only regenerate when the type changes. It's as good a way as any for now. Frankly, we could probably regenerate every time. */ if (cached_type != name_type) { const char **wordlist = NULL; wordlist = sections[name_type]; build_prob(lprobs, wordlist); cached_type = name_type; } /* Generate the actual word wanted. */ while (!found_word) { char *cp = word_buf; int c_prev = S_WORD; int c_cur = S_WORD; int tries = 0; bool contains_vowel = FALSE; lnum = 0; /* We start the word again if we run out of space or have had to have 10 goes to find a word that satisfies the minimal conditions. */ while (tries < 10 && lnum <= max && !found_word) { /* Pick the next letter based on a simple weighting of which letters can follow the previous two */ int r; int c_next = 0; assert(c_prev >= 0 && c_prev <= S_WORD); assert(c_cur >= 0 && c_cur <= S_WORD); r = randint0(lprobs[c_prev][c_cur][TOTAL]); while (r >= lprobs[c_prev][c_cur][c_next]) { r -= lprobs[c_prev][c_cur][c_next]; c_next++; } assert(c_next <= E_WORD); assert(c_next >= 0); if (c_next == E_WORD) { /* If we've reached the end, we check if we've met the simple conditions, otherwise have another go at choosing a letter for this position. */ if (lnum >= min && contains_vowel) { *cp = '\0'; found_word = TRUE; } else { tries++; } } else { /* Add the letter to the word and move on. */ *cp = I2A(c_next); if (is_a_vowel(*cp)) contains_vowel = TRUE; cp++; lnum++; assert(c_next <= S_WORD); assert(c_next >= 0); c_prev = c_cur; c_cur = c_next; } } } return lnum; } /* * To run standalone tests, #define RANDNAME_TESTING and link with * with just z-rand.c from Angband. */ #ifdef RANDNAME_TESTING #include #include bool is_a_vowel(int ch) { switch (ch) { case 'a': case 'e': case 'i': case 'o': case 'u': return (TRUE); } return (FALSE); } int main(int argc, char *argv[]) { int i; char name[256]; Rand_value = time(NULL); for (i = 0; i < 20; i++) { randname_make(RANDNAME_TOLKIEN, 5, 9, name, 256, name_sections); name[0] = toupper((unsigned char) name[0]); printf("%s\n", name); } return 0; } #endif angband-v3.3.2/scripts/0000755000175000017500000000000011651552410014276 5ustar chriscchriscangband-v3.3.2/scripts/pkg_src0000755000175000017500000000150511651552410015655 0ustar chriscchrisc#!/bin/sh if [ $# -ne 0 ]; then echo "Simple packaging file for the source." echo "" echo "Use in the root directory of the game, like so:" echo " scripts/pkg_src" echo "The script will output a tarball angband-[git describe].tar.gz" exit 1 fi TAG=angband-`git describe` OUT=$TAG.tar.gz # Error checking if [ -e $OUT ]; then cat < $TAG/version && cd $TAG && ./autogen.sh && rm -rf autogen.sh autom4te.cache && cd .. && tar --exclude .gitignore --exclude *.dll -czvf $OUT $TAG && rm -rf $TAG angband-v3.3.2/scripts/pkg_win0000755000175000017500000000342211651552410015663 0ustar chriscchrisc#!/bin/bash if [ $# -ne 1 ] && [ $# -ne 2 ]; then echo "Simple packaging file for the Windows port. Only really useful when" echo "cross-compiling, or using Cygwin. Originally by Robert Ruehlmann." echo "" echo "Use in the root directory of the game, like so:" echo " scripts/pkg_win []" echo "" exit 1 fi DIR=$1 if [ $# -eq 1 ]; then OUT=$1.zip else OUT=$2 fi function cp_unix2dos { # Just in case they're already DOS_format, we strip them to UNIX first. :) awk '{ sub("\r$", ""); sub("$", "\r"); print }' $1 > $2 } mkdir -p $DIR cd $DIR mkdir lib mkdir lib/apex mkdir lib/bone mkdir lib/data mkdir lib/edit mkdir lib/file mkdir lib/help mkdir lib/info mkdir lib/pref mkdir lib/save mkdir lib/script mkdir lib/user mkdir lib/xtra mkdir lib/xtra/font mkdir lib/xtra/graf mkdir lib/xtra/sound touch lib/apex/delete.me lib/bone/delete.me lib/data/delete.me \ lib/info/delete.me lib/user/delete.me lib/save/delete.me cp ../*.exe . cp ../*.dll . # Copy the readmes and suchlike, converting to DOS line endings on the way cp_unix2dos ../changes.txt ./changes.txt cp_unix2dos ../thanks.txt ./thanks.txt cp_unix2dos ../copying.txt ./copying.txt cp_unix2dos ../readme.txt ./readme.txt cp_unix2dos ../faq.txt ./faq.txt cp ../lib/edit/*.txt lib/edit cp ../lib/file/*.txt lib/file cp ../lib/help/*.txt lib/help cp ../lib/help/*.hlp lib/help cp ../lib/pref/*.prf lib/pref cp ../lib/xtra/font/*.fon lib/xtra/font cp ../lib/xtra/graf/8x8.png lib/xtra/graf cp ../lib/xtra/graf/8x16.png lib/xtra/graf cp ../lib/xtra/graf/16x16.png lib/xtra/graf cp ../lib/xtra/graf/32x32.png lib/xtra/graf cp ../lib/xtra/sound/sound.cfg lib/xtra/sound cp ../lib/xtra/sound/*.wav lib/xtra/sound cd .. zip -9 -r $OUT $DIR rm -rf $DIR angband-v3.3.2/scripts/warning-blame.sh0000755000175000017500000000446611651552410017372 0ustar chriscchrisc#!/bin/sh # Copyright 2007 Vincent Sanders # All rights reserved. # Taken from the NetSurf SVN repository: # http://source.netsurf-browser.org/trunk/netsurf/utils/warning-blame.sh # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the Author nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # where to store the processed list of warnings WARNING_LIST=/tmp/warning-list if [ $# != 1 ]; then echo "Syntax: $0 " exit 1 fi if [ -f $1 ]; then cp $1 ${WARNING_LIST} else echo "Need a valid warning file" exit 1 fi for blamefile in $(cat ${WARNING_LIST} | cut -f 1 -d ':' | sort | uniq ); do if [ -f ${blamefile} ]; then svn blame ${blamefile} >/tmp/blame cat ${WARNING_LIST} | grep "^${blamefile}" >/tmp/blame-warnings while read warning; do echo ${warning} lineno=$(echo ${warning} | cut -f 2 -d ':' ; ) cat /tmp/blame | head -n ${lineno} | tail -n 1 done < /tmp/blame-warnings rm /tmp/blame-warnings else echo "Unable to find ${blamefile}" fi done angband-v3.3.2/scripts/version.sh0000755000175000017500000000164211651552410016325 0ustar chriscchrisc#!/bin/sh # # This scripts adds local version information from git. # # Copied from Linux 2.6.32 scripts/setlocalversion and modified # slightly to work better for OpenOCD, then taken and ripped to # pieces for angband # usage() { echo "Usage: $0 [srctree]" >&2 exit 1 } cd "${1:-.}" || usage # Check for git and a git repo. if head=$(git rev-parse --verify --short HEAD 2>/dev/null); then # If we are past a tagged commit (like "v3.2.0-64-g72357d5"), # we pretty print it. if atag="$(git describe 2>/dev/null)"; then printf "$atag" # If we don't have a tag at all we print -g{commitish}. else printf '%s%s' -g $head fi # Check for uncommitted changes if git diff-index --name-only HEAD \ | read dummy; then printf '%s' -dirty fi # All done with git exit fi # There's no recognized repository; we must be a snapshot, and should have a # version file generated by the snapshot process cat ../version angband-v3.3.2/scripts/pkg_deb0000755000175000017500000000160011651552410015614 0ustar chriscchrisc#!/bin/sh if [ $# -ne 0 ]; then echo "Simple packaging file for the source." echo "" echo "Use in the root directory of the game, like so:" echo " scripts/pkg_src" echo "The script will output a tarball angband_[git describe].orig.tar.gz" exit 1 fi TAG1=angband-`git describe` TAG2=angband_`git describe` OUT=$TAG2.orig.tar.gz # Error checking if [ -e $OUT ]; then cat < $TAG1/version && cd $TAG1 && ./autogen.sh && rm -rf autogen.sh autom4te.cache && cd .. && tar --exclude .gitignore --exclude *.dll --exclude *.wav -czvf $OUT $TAG1 && rm -rf $TAG1 angband-v3.3.2/doc/0000755000175000017500000000000011651552410013354 5ustar chriscchriscangband-v3.3.2/doc/Makefile0000644000175000017500000000007511651552410015016 0ustar chriscchriscMKPATH=../mk/ include $(MKPATH)buildsys.mk SUBDIRS = manual angband-v3.3.2/doc/manual/0000755000175000017500000000000011651552410014631 5ustar chriscchriscangband-v3.3.2/doc/manual/customize.tex0000644000175000017500000003600611651552410017402 0ustar chriscchrisc\section{Customization --- customize.txt} \paragraph{}Angband supports multiple customizations. These can vary from alternative methods for selecting objects, keymaps for different commands, changing the visuals (using graphical tiles), creating subwindows, and saving customizations for use on future characters. \subsection{Special Keys} \paragraph{}Certain special keys may be intercepted by the operating system or the host machine, causing unexpected results. In general, these special keys are control keys, and often, you can disable their special effects. \paragraph{}If you are playing on a UNIX or similar system, then Ctrl-C will interrupt Angband. The second and third interrupt will induce a warning bell, and the fourth will induce both a warning bell and a special message, since the fifth will quit the game, after killing your character. Also, Ctrl-Z will suspend the game, and return you to the original command shell, until you resume the game with the "fg" command. There is now a compilation option to force the game to prevent the "double ctrl-z escape death trick". The Ctrl-\ and Ctrl-D and Ctrl-S keys should not be intercepted. \paragraph{}It is often possible to specify "control-keys" without actually pressing the control key, by typing a caret ("\^{}") followed by the key. This is useful for specifying control-key commands which might be caught by the operating system as explained above. \paragraph{}Pressing backslash ("\textbackslash ") before a command will bypass all keymaps, and the next keypress will be interpreted as an "underlying command" key, unless it is a caret ("\^{}"), in which case the keypress after that will be turned into a control-key and interpreted as a command in the underlying angband keyset. For example, the sequence "\textbackslash " + "." + "6" will always mean "run east", even if the "." key has been mapped to a different underlying command. \paragraph{}The "0" and "\^{}" and "\textbackslash " keys all have special meaning when entered at the command prompt, and there is no "useful" way to specify any of them as an "underlying command", which is okay, since they would have no effect. \paragraph{}For many input requests or queries, the special character ESCAPE will abort the command. The "[y/n]" prompts may be answered with "y" or "n", or ESCAPE. The "-more-" message prompts may be cleared (after reading the displayed message) by pressing ESCAPE, SPACE, RETURN, LINEFEED, or by any keypress, if the "quick\_messages" option is turned on. \subsection{Command Counts} \paragraph{}Some commands can be executed a fixed number of times by preceding them with a count. Counted commands will execute until the count expires, until you type any character, or until something significant happens, such as being attacked. Thus, a counted command doesn't work to attack another creature. While the command is being repeated, the number of times left to be repeated will flash by on the line at the bottom of the screen. \paragraph{}To give a count to a command, type 0, the repeat count, and then the command. If you want to give a movement command and you are using the original command set (where the movement commands are digits), press space after the count and you will be prompted for the command. \paragraph{}Counted commands are very useful for time consuming commands, as they automatically terminate on success, or if you are attacked. You may also terminate any counted command (or resting or running), by typing any character. This character is ignored, but it is safest to use a SPACE or ESCAPE which are always ignored as commands in case you type the command just after the count expires. \subsection{Squelch settings} \paragraph{}Angband allows you to ignore specific items that you don't want to see anymore. These items are 'squelched' and any similar items are hidden from view. There are several ways to squelch an item. The easiest way is to choose the 's' option when destroying an object. Whenever you destroy an object you are forced to confirm the destruction. One of the options is 's'. If you use this option, the object is dropped and then hidden from view. \paragraph{}Weapons and armor have quality squelch options. These allow you to specify what types of weapons and armor you are no longer interested in seeing. There is a quality setting for each weapon and armor type. Squelching weapons and armor by destroying the object will prompt you with a question about whether you wish to squelch all of that type of armor with a certain quality setting. These quality settings are described below: \begin{description} \item[bad] the weapon/armor has negative AC, to-hit or to-dam. It may or may not be cursed \item[average] The weapon/armor has no pluses no minuses. It is non-magical. \item[good] The weapon/armor has positive AC, to-hit or to-dam. However it does not have any special abilities, brands, slays, stat-boosts, resistances \item[excellent, with no high resists] Weapons will have some slays. Armor will have resistances, but these are limited to rfire, rcold, racid and relec. \item[excellent but not splendid] Weapons and armor may have high resists but they do not have any stat boosts or brands. \item[Splendid] Squelching all splendid items only leaves artifacts unsquelched. \end{description} \subsection{Using Inscriptions} \paragraph{}You can inscribe items to change the selection process. Normally when you select an item from your inventory you must enter a letter that corresponds to the item. Since the order of your inventory changes as items get added and removed, you may want to inscribe alternate methods of item selection. Instead of entering letters, you can enter numbers, and automatically assign certain items to specific numbers. The way to do this is by using the inscribe "\{" command, which will add an inscription to the item. You can add an inscription directly to an item or by using the "$\sim$" memory list you can add an auto-inscription. Then every similar item you find from then on will have that inscription placed on this item. \paragraph{}If you enter a number between 0 and 9, the first item engraved with "@\#" where "\#" is the number you entered will be selected. For example, if you have a shovel engraved with "@0" and you type "w" (for wield) and then 0, you will wield the shovel. This is very useful for keymaps (see below), since you can use this to select an object regardless of its location in your pack. For example, Angband automatically defines a keymap for the key "X" to do "w0". If you then engrave both your digging instrument and your primary weapon with @0, pressing X will wield whichever one is not being currently wielded (letting you quickly switch between them). Multiple numbers can be engraved on the same object; for example, if a sword is engraved with @1@0, then either "w1" or "w0" will wield it. Since you may want different items defined with @0 you can also make an inscription "@x\#" will act like "@\#" but only when the current "Angband command" is "x". Thus you can put "@z4" on a rod and "@u4" on a staff, and then use both "z4" and "u4" as desired. \paragraph{}Perhaps the most commonly inscribed items are spellbooks. Casting spells often takes at least 3 commands. The cast commmand (m or p) the book selection and the spell selection. Then you may need to select a target. For example, if you are a make and the beginner's spellbook is the first in your inventory, casting maa will cast magic missile. However, if you lose your spellbook, casting maa will cast the first spell in whatever new book is in the top of your inventory. This can be a waste in the best case scenario and exceedingly dangerous in the worst. To avoid this, it's very useful to inscribe your spellbooks with "@m1, @m2, @m3" etc. Then if you lose your first spellbook and attempt to cast magic missile by using "m1a", you will not accidentally select the wrong spellbook, if the first spellbook is not in your inventory. \paragraph{}You can also use inscriptions to force the game to prompt you on whether or not you want to use that object. Any object containing "!x" in its inscription, where "x" is the current "angband command" (or containing "!*" for all commands) will induce "verification" whenever that object is "selected". Thus, inscribing, say, "!v!k!d" on an object will greatly reduce the odds of you "losing" it by accident, and inscribing "!*" on an object will allow you to be very paranoid about using the object. Note that "selling" and "dropping" both use the "d" command. \subsection{User Pref Files} \paragraph{}Angband allows you to change various aspects of the game to suit your tastes. You may define keymaps (changing the way Angband maps your keypresses to underlying commands), modify the visuals (allowing you to change the appearance of monsters, objects, or terrain features), change the colors (allowing you to make a given color brighter, darker, or even completely different), or set options (turning them off or on). \paragraph{}Angband stores your preferences in files called "user pref files", which contain comments and "user pref commands", which are simple strings describing one aspect of the system about which the user has a preference. There are many ways to load a user pref file, and in fact, some of these files are automatically loaded for you by the game. All of the files are kept in the "lib/user/" directory, though you may have to use one of the command line arguments to redirect this directory, especially on multiuser systems. You may also enter single user pref commands directly, using the special "Enter a user pref command" command, activated by "double quote". You may have to use the "redraw" command (\^{}R) after changing certain of the aspects of the game, to allow Angband to adapt to your changes. \paragraph{}When the game starts up, after you have loaded an old character, or created a new character, some user pref files are loaded automatically. First, the "pref.prf" file is loaded. This file contains some user pref commands which will work on all platforms. Then one of "font-xxx.prf" (for normal usage) or "graf-xxx.prf" (for bitmap usage) is loaded. These files contain attr/char changes to allow the monsters, objects, and/or terrain features to look "better" on your system. Then the "pref-xxx.prf" file is loaded. This file contains pre-defined system specific stuff (keymaps, color definitions, etc). Then, the "user-xxx.prf" file is loaded. This file contains user-defined system specific stuff. The "user-xxx.prf" file is used as the "default" user pref file in many places. The "xxx" is the "system suffix" for your system, taken from the "main-xxx.c" file which was used to generate your executable. Finally, the "Race.prf", "Class.prf", and "Name.prf" files are loaded, where "Race", "Class", and "Name" are replaced by the actual race, class, and name of the current character. \paragraph{}Several options menu items allow you to load existing user pref files, create new user pref files, append information to existing user pref files, and/or interact with various of the user preferences. \subsubsection{Subwindows} \paragraph{} In addition to the main window, you can create additional window displays that have other secondary information on them. You can access the subwindow menu by using ``='' then ``w''. You can select what windows to display. You may then need to make the window visible using the ``window'' pull down menu from the menu bar. There are a variety of subwindow choices and you should experiment to see which ones are the most useful for you. \subsubsection{Keymaps} \paragraph{} The ``Interact with keymaps'' menu allows you to define ``keymaps'', which maps a single keypress to a series of keypresses. Keymaps are not recursive; i.e. keypresses in the action field do not get expanded again. Angband uses keymaps to map the original and the roguelike keysets to the underlying command set, and allows the user to modify or add keymaps of their own. Note that all keymap actions must be specified using underlying commands, not keypresses from the original or roguelike keysets. The original keyset is almost identical to the underlying keyset, except that ``numbers'' are mapped to ``;'' plus a direction, ``5'' is mapped to ``,'', and a few control-keys are mapped to various things. See ``command.txt'' for the full set of underlying commands. Some uses for keymaps include the ability to ``disable'' a command by mapping it to ``\textbackslash{}x00''. \paragraph{} Keymaps can be specified in user pref files as lines of the form ``\verb+A:+'' and ``\verb+C::+'', where \verb++ is the keyset (0/1 for original/roguelike), \verb++ is the encoded keypress, and \verb++ is the encoded keymap action. \paragraph{} Note that any keys that are not required for access to the underlying command set may be used by the user to extend the ``keyset'' which is being used, by defining new ``keymaps''. To avoid the use of any ``keymaps'', press backslash (``\textbackslash ") plus the ``underlying command'' key. You may enter ``control-keys'' as a caret (``\^{}'') plus the key (so ``\^{}'' + ``p'' yields ``\^{}P''). \subsubsection{Visuals} \paragraph{}You can use the "Interact with visuals" menu to change various visual information, currently including the choice of what attr/char values are used to represent various monsters, objects, or terrain features. Note that in combination appropriate support in "main-xxx.c", and with the use of the "use\_graphics" flag, you may be able to specify that "graphic bitmaps" should be used instead of normal "colored characters" for various things. \paragraph{}When interactively modifying the attr/char values for monsters, objects, or terrain features, pressing "n" or "N" will change which entry you are changing, pressing "a" or "A" will rotate through the available attr values, and pressing "c" or "C" will rotate though the available char values. Note that attr/char values with the "high bit" set may induce the display of special "graphic" pictures if the "use\_graphics" flag is set, and your system supports the "use\_graphics" flag. \paragraph{}Note that this menu can be abused in various ways, and if you must do so, remember that you are only cheating yourself. \paragraph{}Visuals can be specified in user pref files as lines of the form "\verb+R::/+" or "\verb+K::/+" or "\verb+F::/+" or "\verb+U::/+". \subsubsection{Colors} \paragraph{}The "Interact with colors" menu allows you to change the actual internal values used to display various colors. This command may or may not have any effect on your machine. Advanced machines may allow you to change the actual RGB values used to represent each of the 16 colors used by Angband, and perhaps even allow you to define new colors which are not currently used by Angband. \paragraph{}Colors can be specified in user pref files as lines of the form \\ "\verb+V:::::+". \subsubsection{Options} \paragraph{}The "Interact with options" command allows you to turn options on or off. You may turn options off or on using the user pref commands of the form "\verb+X:/+'' or ``\verb+K::/+'' or ``\verb+F::/+'' or ``\verb+U::/+''. \subsubsection{User Pref Files (Colors)} \paragraph{}The ``Interact with colors'' menu allows you to change the actual internal values used to display various colors. This command may or may not have any effect on your machine. Advanced machines may allow you to change the actual RGB values used to represent each of the 16 colors used by Angband, and perhaps even allow you to define new colors which are not currently used by Angband. \paragraph{}Colors can be specified in user pref files as lines of the form\\ ``\verb+V:::::+''. \subsubsection{User Pref Files (Options)} \paragraph{}The ``Interact with options'' menu allows you to turn options on or off. You may also turn options off or on using user pref file lines of the form ``\verb+X:

ó!aûN øÇMÙˆ›å›£îš—¿:ZIÜൠÉ5ix´Ü+þíY1Ô÷H8Aê7ââ‚›p†Œ¢^¦SÀN¶øü¼ÍÉyq•AoøÚCe¤|¸Þ’@©éRÈ„Î\¤É2l6GJ q%ZàÝ÷ú¯¢þþuÚ®úÌ.›-Λè†9{®i¬t‹NšÃS‘uö_È ÑXœü4ï ¦û MŽ›Ë}! (F¶Ø¾º¤S.wH‹È‚A•ÚeèÔcóe!™j1‘NÒ›9M@9WOD㆞¯–š=LÙyåãó¯ŠÙWR=H~éj ÷’bH|ŒÄ$øNרDç\»é‰Ï9¸¼vU#glG͉›56uoʱ9ƒçô•éoŽ&{‡D„"&,Ò{Þ°ÁNº¥ ’<=ÿb5ÝË7” Ú…bƒ~àœ?`áÖªZýnÿa¹› åpü/ãœÙ¥œ4X6&Þר[WZ¤ÓêPý½xPCë+}êþ‹)ë°³vÚŽª¬Ë5~?Z#R.ÆÎú¢“¥7Ì'ì=ÊȺFPš/Ó K »_ÛÿSr“¶ö§ú ÿ Y ãÝ7Ô,ðÏÿ$À¬¾{àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=ž!ib†Îã,ªÔ¾£¬Žö.ý¼““V0›ÄÓÏVÃ+É—ÐE d…l\ËPÜÿc*ª)fg²ÒrÁ-u#Þ½6¨ °ySùÀ]ȹ5–šRZ†$È©æóVçCVv"¦1„ç/Ûó”[ô¸‹ýãûbÓÒwÿ>iàåòœ1ìÙwbBºwqÍ_µasôi‡>èG™*¶‹oÓÖNduÖ鼋D¦aVÜ›—NÏeÂ*)¸È8±ºî)S„II¹Ô{uG±ã ‹hm)§sÛå#¢BcÍ‚¾—àú‘CÁÖýÞ=IJ¤þòÏ.]àóÌ΋zÅV Ï!é{µ™<Ó >»Ïbõ$Ñ 嵯€Rs*e_RÕ_ô¡¿šúÿwzA:}•Ó®SÍæ,‚ó˜ ˜°$$‘Üf˦) o˜×![BóN½Æe‘'@nÄBÚ™ïOì(¦J^VÓäëÖáSàÌ3^~[ Êì!ÆÅ…ŽåöøºÁ¢‡‘)6ôW”<Óµ/ò9*ΓҧÐîÇ$ôëC&ãæŠ_÷ßñC€Ùë=×qe%vBÒÑÛíN:¯Í|PgYõGÙ{uè­bˆè€Ð¦PjÛ!\=ÿc¯¥èfxÞ'R—.xÖ®k‚0ÉéÆ „îv3.©€¢¬©Û̓©A|†ÔW´’ øá¡“¯4vÔ®*pªÑ¼gî2.Í"Ï ÕaD&iG#A¸ô&. &:‰ Vcwmxä÷¢ö®iVíš[<ÅöbZ×'*!ÎR8i§¶Ä|#ì®k¹T¨ëo\R}ó#-äxÐZ4Q¢ÌGꘋ‡ 7¯h¢¸üå<^TÝŽ5}El”b™oñÇâQÕkFìýkŒeªð;xžµã/!qw3Y•|3O/k•ÙÀƒõÁq°ž"j’èvÊ §§=ÀÓ†ÏTgêWMÌ­âæMèRövÊ:¾æ»T%%‹t5}¡MàËDÝy»ãˆ‡§>/¶ˆÛäÝi¨y[nHú ¢…–¡ƒè¿tÆù´G]›+æb²j"ÜÌÉ´4?Ëíéä%T•ÚœÿxØí¾wžóà™ revzíÂâQW±» å'ö#– Ù¯ó7R’~ö„yÔÁz›1¦§3 fž9¥®SX;àÑExåQwqx.h›f}ˆ#lͬpDûJ?Ö(í Ž,^YÁcï=&Y¡Œ¦‡¦øÍb¡at[3·Ÿ £BOCž'zvV]2ìÈBÒµ|8íÆ¢Þq‘ßT¿Zµ;Ëzp?kWªö0 ËëŸ ­W~6·±n u)î¨Ç©iž7sÜ‚¾Äteö™è-æ1M¼š=n¦Å~z×Sð=kyöǹsqÏ F2µHŒh@¹·Ë ÔÑ5É´Tè…„6¤¥£(¾m£~s¤æ{ˆ)C¦RÖºEð­–Èxêovón·}N]ðPÛ‘¥óáþ¢ô+7sHðüôA[}^½â$öjæK‡M=8öéE/eªÇø¨Ø m–l6}S%…&ß;lR[9Å‘Œ ˜lrå2#’rËìÙmÇ´ïö´ÅPoÞUÿ%'ÿ2CÕCwœ£(ªÊ,MVË?æd¼ôpvÉ ‰-Éœs™Ý­O_ø®“°¹nûÅ× 4çH†©Yˆ¯RôÔWàäñ'úÅÔLÛµOVÙsjø`|š›ä›ß Õ¿®õ´*ò4LP Kœ¤fÏ;cyÀSÛ‡_Ú:_ðò/äÄŸì2¿OkT@mk}àý®„”è†ëÂSÌÁª41ú|ËÁÞ}ÿ/“¼Hv82ží>¯Râo¹-?×Ó©ÅÂY"iËÉB€¾~DR–v›èÓlÌM‚ó´ákQÖérÜO ·‘T¼#_´TiÚSpi=ô˜ê aZ±¢)r°YÐÇBx>"œ½¤`Õ\¾ø•ü˼â‘*Ýrö³;–V’F#ƒeÊïü¿òˆŸ=«'‡GídíHV2#óê£Ò"0ÖDª¼µg8b_ÏëÏßñ›k–ô憻ønõ3È·!(âmÎ- Ïñ/Æð äëPÖïº;ÿÃóÂ꟱ _#ޔ̊A;]mfQÖj¶”?>Jwל;ó›Mg¥a¦÷+ö2¥ë¤ôfþ^K:.x·™zNsâ&ÆÆ¯Wóã3…pA(ƒNYTëÆ½L'©µ³—é5ß-Ò{ßdÝõ!¦Z¢@±É¼/é|/:_¨*Ÿö ¡½µ^-÷ý•Þ‡jû´3“o²K(ÿ,ÝŒœq)íg@ýÓ G/EáiCÕnÓZú¤dó0tõWß ´ÜÿOšµŠ`çlJÂ Ž¾ Ý+Ÿ ®²ãg~kàpmšÓÕ^'!‰­¢ vœ-Øîà·}Ž™ÚëüË.²?½Sф㬽*å‡ei~Çw"c–¢ªk% œ泉›è½noÃ'EEû4Ú°ëLcÊ3Ð6;x?=E½æ/§ª¾›id›_³¿¡^úç!Û?ɳÝhfñ†ðxçW±ÁÏØ®äÉåsf¢ð]3]¦|έ½hçâSÛðGv‰ÄÐlÙ6Ùí;‘Þ:1ûèíjÓ$Ò†ö„x© gîà*‹ž:ø)6CWBm¸QMÁ£(†¾Ä@Þp™’@޵¢VÈ"ý¾åÞï-”Ü¢½×ÉH„ÔÌå9¾…φÖí€ýõ4;5p[Œ[¯ºµ1¥ Aß’½”(ôî`@K4ˆÃ#·‹´uMy)ÌÚ£RŒ.â:¼ÖdÖp(û€÷ÍÓôJÛÈ>¾õú$kÁÏoý£h|Û,÷7gYÔ¢ûç¯4>¶í´7MžšÕŽ‹ºeì©ÖÉó v>¼¼D5fƒjбÑÂWR±G€›JCãµÐL™[v@?½,j#m'6s*˜9W£É­r-³Î¬ÌàžçGXÀ¸º°†ç„(èIÞŽ‰Š7ï“·¹Ò.×XhOâXØ1ŒÑzR ôŠÏÑÊøMBå ÜB˜oˆMù«õÙøþŒ·›æ§Ì”»cÿ¿ÏåTÊÌ¡Zu»=p)\‡¬–ÊŸÊŒ’Y® ˜SÊ0y¹ºÏó Ái1œ·SuËŽÀØ’…ÊËKþfòç5“»RŸ{QàÛzQJ•ZzÍ.*Ò1nP¸*ªâ•Œæõê ¹8[¯ÁL­<(yNJ„¬Ÿ^z>ÐK2Áÿ½t.±Z¤Ò_$œ¡¥tXóÓæwÈRÃdØ/A€ýš<…m#Ô0.ÉË® í$Ÿ¥†Ôò˜ …ÔaÖÅ~ŒDâžcÝ2—x¶O#¹X%¨À¥æÛïÛ”=W®’¿å¢¬íS2Í&YËõQÄxNÐüîfWg¸âd˜™t{w•vÍ€Kãáñw©m£ÉÞœ)NêaÏ+Uóß7U3;¹‰nd†¢¨–$cï£éÒèÉÓïë߈rÖ¹ ð/]4Fy@1À®TèA®2æJ4å<ƒo(&_ *¿gÌ…‹Wˆ…Oó¼WO&žz¦Ç³&ÏÖØï U8Aú]§T ºé5"w,%Åÿ@ò§Z+P>ˆ)uZ²þ‘„íñ sø—² *ÖõTÌç'o ªõÑ-×S¶>®C顲¯!ý¼äÃݱUÊ]Y|H²ÉEMé|Ð×ùÐé EQœ?½©‰w^xLèûZû¨Á;‡®z¦}E«lƒ2Ò1áY·' <$¼›õj¾mNÍuŸhc[…'o™Ý{î;Rr}³­æãºXÈ®TMXWûd³t'B$àl;\gøiíú¶F+7pyˆy¯·Òß˜ÙÆÚã'5Ô1U]@EÂéSîj®Ò ȱÌ×n¡…·Á~·Íyà&'³¸ù³çDxCàxäZaÞ™Ó25W“Jþ§~‘uü€tPÉ•m8¾Äs8©ã›ºŠÌW—ëŒ84æ×í1×I8 Ä&™ìÝŸ¢%ˆ(Bôñ-ÀvWƒxÈà\qzì£%x]I^[9‚Õ.nÃTëqµ\nû,Ü&ñ&H i-˜ß^‚óƒ(å*ÅkL¥L L$OVÝ4èŠ^ìê­Ýè-‚oÎñ•îréž’®5ÅuÆî§BÅ8ˆ-†—ÚÚùî&fÂó ìÿ)B–rIï¯|9IIþ³ú"¦y³­’#Ü43Àãõ/Øá’¦ˆÌÛ„ÞâÎÓIî)³h]mÊÏ”W~+\ÙJ+×ic®ôCÍdYd7Í 6òÕ¼¡rD²/Ör:° H3‹©#âª/2jëÝr¶áè“ÿ`Ž}!Zeß7,Â_çk–zñžݳñúkæ­ŸUvõ’@kÐОÑvaì£~--Sù „„®À‹Ì$$2sþÓí7P l³\¤“YÙk4²(ó×ÒÇŠºz&ÞS0M¿<Ó×åTº£ä‚´]Ä^HÈh4Vfo}KÂg9ÄŽiš1¬7C‹¼bÇxÊ=rñÅeQ¦©4ét|Þ¨Ý^ELàÈp@&]fg2RÔþ‹Ã1Òñž0ý” ž¤(fA:Ò “•>ªg …¨v³=“ßIâ(¨òC¿Ù9R,Áªô䆸X38’9‰†Z4é) –Ò%ƒ 7ŽÃë“-ó‰­ ƒ>}M`›¶Rã[nš¿júȉ—2ª£QýÕ¤ˆO­Â~ÿN ç!,Må/°'\¥ËO°BXx7ËGµ›Ì%¡ýž]rÉ¿ËÉ:ÆÛ°ºK“wu$”ÚL}¢\&¶¤xQc8"naà6/,˼E@ïmÊ©ÂçC&ÕUcÁùñ³­úæ¹ôEâÖ’(˜£ÄÔ”O£xß¡®æÝÖ¦G TdÒŽ<¤[ÑeðE I–oŸtùŸ Þva»Bµ‡ìsS êO¸`{tV ¢Àv8ŽÞþ"3~zÈ¿¸Æºp8ñm‹æÞŸìO¾HÕN‡óHØÝk=JØz@‰Ñõ¿žÒ½O0ا°8ºù0J\KfeÐwl{6·â“¥ÂÂoùè'#×qΆŷ™¯¬gm£ý2Ç0¡aÙ!DlÉlQ´€d*:EªßüÂåØyÎöyÌŒÍÅxçpg&×»€h¸Lî-ßTDK7¤£ðw7fãDµÛ•[ÜX räìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#[á;×Àܯ@”½MÈ €ž<°eð"É&&•™PÛÉZlnºJsHû­)G³®P£p¨ÖŒ¯©,f‚©®Ó]Ö¼CGPÌ`‘;}o€'A²¤ø´ƒñý9ÊiÖ–Õœ€Áú,Ͳ«D4jàzï‰Ëô×nïf󌌭­Ïæ›x;±ù\Ü„ÕwÝ7”uÎlÁ%È[Y¾`9<ÐRР¡¯)ÿMx§“”}B—•‹§X¶J ¸ â¹ö‚m)Ãto`£âŽ'cÛîlºµGÔ-Kžixy|jm?ÒžµE‚¥ëS«…¬rÝD‚!º¶é²ËIX¥÷¹!;Éx€|/oKvëm¡]ãY›.6×¶õÁ=_̤%´ÛØ|ûâLíuVÔÇ£àÍ£‘Œ /ÿ^0©…<û¦$¹Ž¨¢Sª«‘4œ”½¹ñÈçîq Y@þcöWuc´\7­ˆ­q•Ú!–§ ´ª L—žÐ j~Sëói¥UMLó•,ž[ÕOl2üǶÇcÖeOÅÔgÿap‘óká—°w)N~ù$ÈÖß©f6OÖ@Ñ´ÏUíúˆ”ý[޾ .à3AMé#pTJm„ôÅ`fûáÉZ ”ÅÔW™è—==`ÌXXlŠä·bõ|›B‰m®RšÑù†‡•vóè[u&,]i釄€ïkC„Í>š Þ†7.i+ˆ‹KŽá¸K ÄØo¶ï{ßõAÏ Ýwæ ïó+ëÄÊ v;ó\üÙ‚q€÷#ÿ4êºÀZV}õ*‘Khú,Sd¾áÂéz*ú]”!µYËËïQÑíй—Ž+<ò7öù@õÓ*ŒR•ÏC©ïëž›îûÉÄ"Má^|~®=E'ºCIüóTÁœyÉ:uÚR ”>p¤ÓNù ã³"àžå.ðYe…–Ú@ =…Ov3ÇùÞñH¼«XµuÐ…ä4~ËìÈB—2öiÊæ#KfÑ\%¶‡ÞYxÖ23ß™~%q¹VHßÿk%FÜÖœzäcXÊðJ«÷=nrÝ8Y5 €?MŦgÐáEÄDùIUŽŠ)eç&É‘¿e¬‰@Ú¤É#½G”x?áÒaQíoÜh³vÿLšr³JºÃí_¹C™»«qÎb/÷‚ññ¿L¥§@óqO|ÙaÏ«r…£7á¹®š®x.‘Ýè“MájŸñ»½î›½:⽕ r;žü«v¦¢€~×=ߦ#åû˜ÃGÛ1^t×CÁØÕ×ͨަjÝù‚Âù®~3<-žLý‘í(Që|¢†\ÈCaŽ&nË Ã…¨Ï½‘|Z#Ÿ.ñ<¾†8–÷´x2˼r°çâšÄ ºKb=©MC5·åiÀ܆üÅ@«9mÑnÓ۷јë1㕯a‡ŸyâMÎfÌ»÷8æ\„³­ƒ-–ó¢ä8s‡\a±8âP k9\±ÓésÎàÜoF~œ˜–ç_’úÿ^ªŽ@ì¿àr•q{aQ÷ÁG}ÌÏP}%½6Ó±Geqˆ{Í ¨!•6˜èwŠL>{ù"¢ˆí2àôNvÔäD‘t±Á•íByòß¹(i{ÒdNósÁž׋¦¸P ±Iï¿©´¬ç$ЀT\Íò¤ýÍXe1àüþÿ÷çõ-ùÔ`~Nÿ?#ÉèÊøi0??§;äùýY_"€ÓÇÝ…¦ŸM†ÊJ÷ü‹ãjQ‘•‹Ù^héwÏÑ¥Rèìn’8jJGm{y ²d½Ë -€X®/jÝ"ÔÐ]Sd« ± Í4¦Š€4ð¼Ñ…ÊQqbËñûd9UW.(=ˆ¦L.oV…âŒËtÂ÷qíû0 µ¶|ÑÒ‰<:“ÉŒúllüX±4Ò¨ùVÇ»&1ðèê¶`ýÕÑû ÑqEA§Ö¦DAË73bÅ5O0H›WŠLÒHÖtãj þCh¯¼%γA—¦mã—³Ð&Ò×dPå¯Ç>Þ’2`plâßT–Pp¤}~›_MKÏ5ïIÃjw•+¿(»Äï1]EªíØ›!3Ï׊}wÚ#õ×ðA–A.ñmcïj¡gˆml^-Í Â}z; _ò¶QîW»8å{\E±%]× Zp” Zzü mB¶ÑX¥!ß”¸΢äè&´y­wªÉÈ<‰à_½ ßÒ,[ÒAÖ<:+)»âÀß}É–?ÿc &ˆI§²nW1ÈS¢pH¨"ÿ‚X±;hYÂ\AF¦Óÿ#ùù\Ý3ÒÙΗ`ÞKº'1ö·íÒÆéX·]ªwý¸OEÖ¨“*ñþ§I‡ ÊÚöSR«­Y7ürbóå–{¥ë,ÀöU65’¹OO5aN6òXÉßNDÑ ¤§ò‚’¤K»‹ÛAj<Ô~ñžaTÅ@ oì¯ yË*÷’®Éç e?3J6Jr(]^P_tÞ¨.¤Iôdñ:uV‡H ‘ËGçÃ%fÑzM×àí6„oM6…vñïx0V‚دc(@MIõ&üÂ@àÚ‡±È8AZšc"ò™–‰"ö~ûâð 8Ò ]A»”œ1d(]GKU¸ÿM PÍHÖ“ù;3¸šõlß…·6 ®¼duµìÄâM9­âò_j½;ºÈIl•=~tX¨Mî¡ð5·Û\1ÕIÀ¥r3D°ïrÄêœ#¶2ƒ•¾Åã *CŸ6ÑIÑ]È M—Æ¢ R¼6ÃøQ ºS,Öí…€/9.ôD'¦Õª9)~Èå_a?ä»Ê%+„•Uì=‘^ÀýùÁíBpó^g†©ô³ÆnëúÕúªèÀSV¯Æ ^F6ðH©'€uJµ@+[ªdæ¾[&æ–tM¶ÝJ`,¢ROWÀ °Eýþn«ýáöÁªäí¶´è,ÄP‚(JVöšŒ•ŠÅKˆy{¶­ þb½å›u4\ÛÞ?Õ äìýG…º¼¨ÿ;o…ÿi‚ùøØ'ð4¹0­oLyc©“®Œ5ç«zUØŠh³ÿ1Ó%£²É›yiÕWùÜž ·Ì~|ím4ÝÍ(V½ÆW;¯PýXŒIx&/Ž‹‰ à,ã3ûáqþõf3œ‹ã¼ÌÔ°'')öë}+ä…B°Ü‘j ‰•i&³*_å]èõ¥ª%7 â"‘|ñ?lå}ÖѺˆÐÄ"Ñz1èþx ì4Ó÷Ó!×]e 6…`NfkkeKŒ£ˆá·ûE¾Ì*X*McÛƒ›Š ¬ó,¿wX¿ú#ð8ЍQ¹-H…¶ˆ*¹TGÈ4„¼>MŸGïp> |œºåeÚ{vòy­Éͦ (ë¸?ÀE„ÆÐd$Œ T{<ѹٿny™ïª#‡ï!´Œ_Zú|…Žk#,w2?qÌxí }'v¥FÞ™Eb_έ`¿“5Ð å`¸úAò†±åE@OX?ß^oy_Mð‰Ô⨌uÛ /kœºY€„æ”NÈrú “JˆÖ› @f5ŽGb¶¶Œ¹ª¦qÌÛî^2ƒþY„Bx†OY‰‚)U™iõȼI´9±‹/0\¬åN­K ÞQ\Uh˜s²j2 Úlwc{NF¤ÎÑ-lRć”ªw¢ÿe#›ä‚Ò@[¹@¦¸¼P@¾”k<Ô{9ÎÉ$&\ZVVôQ}s%&ß}ƒÌÛ&*lãFï“+EMÜ¥W%„f´©Áº[.~Nœ|‘âêÿpG¥<Ý•–5Y´˜·Ì¿%ßþ…(J[QUQ”¾x|WK¨¡M ¢°u7¹‚¥,M¬Î®@u£J·Þnõ8> ùµàưR[øÒ“üòÖ¼H{BM5×Z+gP ü[ïç¸+°–™àNZé‘\øþ[·(|cP=úZÚô$C,1ä w°²Òu¯†bª_kŒÒ¨¡|vϘ6)º«-ÂdR^枎ì»ÆÊF×Ò:±ÂFö‘-ä·s‚Ÿ¢}<ÅÂhÿhâSñF¤®Ìl~C¯Z mîzD¿çkq] ƒ®/ìz&QÖ ¦Ê)Øt›ã³ßýÅÌeEÐô*¼«/%81C­•ÿ/ „CÃabñçÂŽmþ‘Úv‘²ñ=!+Båô/ÕàÒØ%¯0£å—yº€¬&ÖÍu˜ÚÏí˜>­¤xjujz³áÇ\Éúy˵&¢,(?5dÑÔÝc9Ž×¤;öÛÒŽÅ®ýïñ°’G„½pŒæB¬—²ƒô8Ã4#ì,ÇãÓAki·¬l}}Ò6Ðeö„ùÌ"®¸>„O Ô× ðóEž¥9ê?¡MúSüÝ1VK¦‹ÈŒüGŠ{r¡äSìCqÃ!d16‘°£ÿa”³~„4™ÿb$‹›<õÜó’ñ…öŠm\‹Ôï°÷dîiŠÔ-¬Î"Ú(íͽD.mÇùH½u˜Ç,Â!†8Vö¿KS¬œŸiY¹li£*»è? Ì LO·ÍB~wJ¤p‹Ò2‚Ç·¥| þ­GS³á"ú+Ô*þ˜òݱ½,¢]V^º÷ªý kÊç±Ü#"ŸžD¯Q¾õej¼ ’ŠLo\SËæHQÎX”}^äažëm­“¡fŸyE·=³?¡P¼,DJÀ~\q¼?‹!Ñ%•e«O­Àæ ¦\ý"·b˜Ò6ÖƒBÅ^ººéÜ-ªߨõÎpÇ oé#oYSMENš¼©A©öÁ~Jß÷3ü,ù˜­R"Ê·AÀTûäkN­õ°*X_öZ&ôÂì_zw¶Zã·µ•nÖæq?À¬†Ï/Ë jÉS+­4÷WÜËMRœ,B‚ÆöŠàuÕ¥øèƒî6•åºq7ò¯C ucåɤœƒo«&h‚²¼¸vÈÞ&O(±4¹PÔƒH7n€,’ylÙÊ@¢´»ÃH]Þ®5s¹r–› †'Ù]y^¼èoèlçF%…’|§Þ–sô»Ë¥Ô“|ßwm›¿µÞá2êfŠìÞmM(‡8ú+×lûgC„¥$‹.;&|ó•¥Ý›ØªÛ܉–}Ø“ P1ò߉CBnö l’¡fÌ£´†êžb"Òy±“gÆÏVo\ˆ%'a{Ö:ÐÀÃ`Ä%¥úP%ÓàäáÈg;œ-¶±pÌkÕLcÌ ëAã°pu­ÀºDíu¼?˜½2ZÛméÞF¯å<-âÿ(Š—˜^i ÐQ VÈ›x16;¥Öüe=e3Úö”‰[,"$¹Šä+ÔnåFêÅ ÷û\a¨=þ*ëô€7Aq꟒ ²⣖â\¼…ÁKt cÀõ‡'9DÔ×®«Ûåä)SZ[®`eC݈ÚCƒÅ #ž¶t; Ê­§k˜FþBÕÒ¼qæ+ÛêÊ€ý;pLÔ‰'Àè0{m7R}[Mï/~vɸhÁ¤ Ÿß£)¼Å¦û`£L5,ÝÕÀçHóðOª(®T÷0ÌóÂR1wúXˆXÖèÅ¿ ¦lò\–æ^#äåAÚaYø>FàÊ$,%Z\Ï.ÇNïýýì¨9y‡Œ¡°†„ƒ€€üÓú¡Ú, –&I†î§^W~øª~•Þ¨Ñ@1 ݘßý_•:åÆEîoSš+¡ŠdëÌÂÕm°¹[3Y["õ*ô¡‡.«†$uun!¦+ó7Êõâ¼c BWâ¢ê×å8Ö®éFâ+À‘/!³kÄ3ÃYŠÙ¹Fõ‚œV£Ú´8–ÔSì›åa«}WÀ%ûì¾ 9äaøV—~‚KS“Ù›‹#ÿMõø#Rô£H<²6Û(ñ4BS=¡=– ÿnºð qÝ @«c tùJŽ«5‡¨~»ùÃ2Ÿ5ÿ¥Ñ"“µêTF}¤ ô«Ieö^zH٘숂í®)ÈŸLÚÚGî 5v›£Œ¤E±â70?[wc%¦Ç…Qd«RþtÜ‚C>[áLëËÓ4m¬|Uθ]S~Š• m.¹8³aW;‘F t-Â{ аkAoÂÏR ò\2‘5ÜX À¥R«‹é£8…~©±MtdñšRZ|íUN¯|hXaå‹ö•¬UÍ7ŠåùÓÍ€H$––º˜€›zµAŒnÒÀm“/Ø{hèy Œ“`!ôVÄÛ•÷”›§§¸"v– èHÕ½Ä šb¼®±†½ïÀ´°ãoèSÛWPw9ýÉ’ñnÓ öJ´÷ʾy;lÛÑUÆÒL}zä)ÎCõÅàž»"ãy#Ûu? ;¤àªu3´ÕÿU2—OAh¤ŠýçQ·éÝÉÓè[6ޤþŽ¿¡±ó—Afñ¾FîÍsÑé¾”ªç•eîâöÉK—Ž÷Ü–(snOöXZÉÊ9`#æ­êü·ð¿oŒ¥6V—&û Tc› M·¯ÜšN‘ockà¬Q¿Ë,à!ñ¯Lõ†!¶ÈŽ´³>}g¿tmdÕ¥2錷Ý?玣åøçOU; ÊÕ]Ö;à´‘†/¶E˜K·_˜\‰{dUÓ[†8#¼Ó¿‘[lžaR`ΗoVB™úöè=\掞ªõÖÉÙB#HV™µôH‘‚ÖïÛ4[:bêò­Ã}Êéi7%κExm˨ä«tv†@¸*¯ÑŠbeÃuÎ/ì±ð΢¡1)ì÷á¢Í[BBb¬ˆ·„s5vÖÌŸ÷ýÔR>|¬Ë ®´Òâ![non ŽªÛОWÊ€[VÛXžy-Xþâí~mI…Í%ª#Úy›™ Q D¿a@éÏeRÔ<ÏìF7Ÿ-˜Çð=85`Õ•&IÞº„.Dåj‡™¾' 9\Rs8úιRÒÖ7V…iV–ÂYàüþ‘¯‘ÏçõAùÓà¾OA—È×óú@¾EŸÓò=üþ«¯‘0á~®AkÖ™åuÀW9ºÞ¾ùÃU7CqD¾¹ô±ÈÚUÐè×U§‚;FhÖ­B†”’<’"%b¡…+SËC©–" „ò¾%lº*£Òøî£ßSœÒÛjrv°Fz­Þ/=4`üÀ©Y02Þîÿéèù@ýÕj.XFO“½~cÞF.Àg3e«Ë²ì[@Í–6@bXñ§ÊÚ®‰ž g¥Ðó­®YŒâñ³D„2I™ )WLXUèÃ¥(±´K̃˜0qî8eW#8E{zyÞ0Ùó^ú¤_ˆT¢´6ì´ÿAPl“þ^ñ/•ˆ ì0Ym~W²ö:éh@}X!ˆ¥=éyíöíb•ÿzàðI~HÉQH)÷á¶ 9C½zÖs«ÌƒÒ^£ƒ!Eû?q¬Ì”VfX·u%Æ0ä’O Ä3AûwTú¸Ëkr»8tDz š«ÀeÝŽ¬Gìœ;0òÇŽ2CÞDA9€:Uö©&Û *êiLª˜§ú¬¦àxÛo;ˆ¬²ÚŠDBlfÝš uad,ÆÚ½‡ 1&¾Õ24fíú+ð 85;WõÇ}²7±¶vöwÜ2¡]?Ç ÉVq§;ä„IÔÉòRx*VF €'ÓW’J”Þ6«üšQS*­¿ÄùQFV,îÔÉc/~tÜ;ÿ`¡–Þ,)Ú³~ÒâŸÓ èÞFÕ‹ÔGùäe\ÆíW˜¥[ jZsV¼HêèÞ¹¼fŠ“9Ÿ&¤1økÆyuØ1V ñ; æp’Fž»yçÿe¢ŽŒ4˜Úª:÷tW4 ·Pœ:*ÌÌýgP˜ÎÀ *80V-¹¬~tbø”5b‰¢¡Š‰®j.5ª5„Zú7€ª6T°ŠÅ€É‘Þ‹Xù¹yBžܔaôÉ̾KáÜÝpÅŠŒcù¨ ËëÜÛò.Ñ'6L˺Å'¾d D¯ç|ŠÕû€ŸfèyV² \ê Ì)ç¥Ð‰íÛz!×î}L²&!¡W3•+Ž6€-œü#Úì¯ Á‡?Ü›éíĨ c‰¤màUâ!ÿ0§Ô¬—)s(~’Ô—9N{JÃëµ®WEÀEW¦Рɰ"ž¥g9K"7P(«Ê@MWN>³É%˜ßް#HcZ>"b©ëi¨.ä"AôÙmz Då¨Á9Õ–Íd­V:@èã¶…êoÒ¶7Éî‰f°6ª? CäÕ¤žþt”å=ZùF;ÜÔÉýl=|þ¶äoäb›OË1“*<\1™¾¶‹.f€ÔIþ‚&WÎËþMž.ò~p_ˆ¡z­]ùË’C:þØüC¢¼ád¶ùr(Ûp¾·4È)#Ty\nUú7¶¬ÙãþêŒÏ)(-O Æ ªÄÍV¬²õH[=|å‚ô[îÛÛ}‰BÀ; š‰IX)L=£.źEë[j”kh^­ ã,D £‡7‹©ûè/lŠÙ vŒ|ÖmƒÿƒkŠB¦¥!àG6 £Š€(8â(i" j(žù¼-'<¹Y6˜¾´ñèÒûû[‰1)àMž÷]~Û”iN³  Í¨4)OZêç’# œ»‰+Ò· › L«#ãC‘áÿn¡²ÝX !4À^òKM kIJŽ ¢gÔ±žØ*ÃJ€Èlä«Ì«ÒåßÀ;ŸL´4þw±„à!'2å_¹þ+(vg+ð<°Õ©?ˆ{G€M-.¨&*_À=Î&+hƒ•m˜câ2S¡Æ?)\©„L,âæsBô”PéÝbÍŠ˜±v¯F¹6 ˆL¦Þ·0Èç5 ¤j”¨Þåf‘þ×ÀÞ}!óhˆùÚý‚ „»-wy-T%SNNŲû995‚SQ°u³ú޹ P¡œT¾"T%î`ÈK¯—ö® Ò|  Ò}ßüþ0Dc·~!ûý³6q"¨…u-Å™ÁüùŽs ðÒkû_%uJƒ¸•í3âeݦ{‡Îz1GY»75 ‹W¢N®;YM‹ ½µ#!KMéªìš7m£ÌäïÓÍ–ÄN…°Wç¨@ á8|z°åö…xê~?™Ûø –'—Sj:× â+»ŒWy™ûâåéÅì7Ùë@]Çdg’³ë­¨’ú0U¨…x[˜‹Tæh #Eí®7õ¿t]‘ƒùÏÜwû­«DÿtŒvQWã—º›µ»Šˆî¢ã#xwþ­‘Uéê…µÌóŠŠp2 ò€q&-L”02 =¸œYS핲@Ê Ý‡#F‹×ñ¡0³’vй“ÒÝÝÁ›ê¶æ"GŽ;0:n‹^™" [Ü.L:ñ`ÑÊô~熪Žg=†EªpÐûùeׂðSÛU[Œ;KP“Ó]b#©¶‰¨¥Û)¸’s”°BN;+cÕV:A<Îs'å8k6Ê‹ ,ùÝŒ{–]äólW1qRvÿ#@˜|6 LyûÛ’:#×;iY޹I„;ÀQ.ʽÉÁ6$åý0Û‹÷[wt¡²éO¢ 1˜ÍŒÒ.·¥/3òwàô f(ËÓb¶o¶—£e(÷ÃÀëŽò.ê¾ß‹¤"O ³Ãóʼn™ThBÔÔ^Ôÿk®gx³w¼ƒp,ƒsê›X·Ê;æaçgß±{é5½l’Dð©4E ó~žª—|ðE+8ÉÓÿ1Ý…£#8È#ºbW^ÌS]žô~Vêg S‘8eQa@ëIÄ÷)4ò8ç‚"[掑râBÑ@*²€õaSuk¡[H*F„ØÉšH¾Ò†Æ•%lÍ}ôñ®2‡EéÂS¤öè“€]lÉ,ø>þ-¾WOe2 ‘“n·é¿)dTÃå‰)Tb,•Ôôt$¢U~¯h‹Ö"މöÞ¯Ô6r6fî‘bž6;Ñ=K×4~ëÚ’èÈÎòàš³<ÞÓ–tð8”ht~"¡>Ñ”.g*Šc¬ü ¢]Æ‘unvŠªgçNöùË:88'oa³É¥ÛÎ…-ªB¢{©“x··Ò¯×ôyïïù+ýo†Ò_‹™D,Ý¿ì)šæC‹`AnÛoi€ù¨åž¿hs`Êß7€ÞD·”í9b%f)m˜<&–Rz[žGyÔýUB‘f"<¿ åkŒú“˜w®ZÇ›ItB?ÄœY ¢éux‚“¢&u­™a^aBüÚ(Öõºc7qy6´íùSƒàeF¹O•îBÙK†–ƒ¥)ëíÒ‘è÷¾dæŽ-lLµÐü†¡?Œ1¨Cˆ¾òBÏF¢FîûéÐëtaMy]é]¶C9“ýX(±ü'¯QâS®‹ô?)`š‹¸­ÌuœŸV‰4Íœ"ŒæidB*ŠÖ >ˆáX2»G¢KMž@MQþÔ`R/ä*é ƒõþk«áåó+ã<䇅ºœ+çVDb´Xïɤ”‹®©曬C@X'é~°r»Ô–¶ø] š½ßRÏì”ûˇ¤¤¼ÿG6ž¾7ÿ1û?Ue­•ÕÚ oôÔ0Ñŷµ'‰4Ù- y‡|ƒ/+ö…ú!F(êÐyAjoôYô¾‘QB]‹²râËö…V“ŒÊV¿@ÞljiŽ9f˜‚L½”…fû†&tö¾‹p¢Þ#ì#kÐhñå».¤Z™Õ „ŽîS1!¤æÙBZà“g\Î  !÷Ó ã”ùm–ÈoÐVýà1Šö›8–ÚƒùžÌ~€•«¢ÍîíáÏã[ö³}®žÕôXþ•þú­û+5’—¢®Ž×¼ ™;ÅÖZŠ)óÐ$»³dႃÄAä?3!ãö¬~ÛOö§~ÝÇíLýµÝõ'þÝ'Â|çÿ6¬Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ ä*°bҘϩýA¤@Ðÿ ƒÂ™l~–õÔòà<›ý&®=L¢Ä¼Ôl޼‡ýáé {Ð|DmLË›')Ÿ¬\bA€rê3åòé †·)l»©+ñe´ìäiæ:‘i!ŸAê.‰½h!•Ó Ý8N~ŠvV_-%¸T¬9Ÿu(d’¢½Ëº|)ù¨AÉk¾Èú;_šTY¯ÄÁ踼:Qп•N\X!iu}ÞäHÿ~5 z”ëåð‘}\´[jûçlx“³n÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüálÁÎ&W‰1‰±.t»§s€­Ù¡ûCö97G°…³Æ‹¹ ïï×Ro§P1{#Ló4áþq_Ž~õ Áow“)±æ#^’¢ì® ¥ÄåÔ•û¯`àKOú RÆ¡ý|éRçcÐ&ê (ÙP ùpªíœ¤¬„)Óà\6 ¤ש y¾ïÙ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥`†¦%a0ÃÖβ*pY¨ø§$VYL‘ûµ(Ju9™Ý.%[êßD,uîGýé&ÏÞ ¯ä^ÔÄ¢LSŸlãôšI$ÿ6¬@‘Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09’o jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ‘‚ÿ“ÏÂñ^ÝoZ¸„ iÊܡ܌m¢“¾( dçïW¼ê¯ Ú»µh©®¥²NÎþ³&)ÇW/žf~p5áezMŽi —Àd4?3$ ]vIŒ|¶¡Ò/ç°N7W–—¯2Øf2½„ŠlÄ¿y‘b¢öÐâ¦;EºÜLlMP÷6l ™×ýÉådä¬L AžÌ ¾×ft_¤K&D@²&M¾üÁÕ·€×~=Gôšwð®bH†½øÃ ÊJa¶êkœWÌݾǕ¼ÏplðŦ”PmT›(°4ál½è.ÒêäVœs±ü9TⵤTŒ5t ¶œh-=À|4`(*Ù‚ ‚F‹+ 0w-ýèºGþIëñ”SÚÝ2um›PÁ´À|4@(€ÿ;¿úØGfI ÉødSõRw_­Úàaàyñ󬎌šÑÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…bŽè.Í Aj)R"ÆŒècŒz^çÓ³ì Äà¡4£Me÷U&•úá u¤lŒÏλ´ή©7[K”é4 P,J}è2³2%裓ž -‚ZÃa´VRºP/tD±<Ó+¡…×óã!¥•kvNx Í~©.©«³jg8ÖŽ;ê¸èDP€€¦ŽÔ-ŽX3xÞeVüèaºbÔ«S/É­q¯¡®*ï~~Ù¿^¯”)‚öC×"c³nBèúzõ¹H) Þéá¡Jª [ògQÒù7q·§% x3¢þãíŒ0ß Oñ*.ü?uˆ‰«†õðû+:û^ª5[˜’3ĉ‰udÊtWúJM 9â©:‘à2 hƒÎœp¸–÷îî˜Që¡Sf ëÓ¦}¨í\}pí•\µžË;‹¡Õލã¿ÑÜíòY¾MÌ}‘v¾ªd¥®Þʦt\ÕPäÑŠÃç_ùsr¤i}¦A—KïjÈš QcI8…°Wvˆªè­ÉÛñÀR :EŸC¾•ØýÙªb÷¬y, ôs6ÏL0£.}]xìå§f¦õz«˜F Ëü‘'[R®Il£ÆRJÄðz™òßÜ ÂcÂ-±Æ@ØŽŽÃþ )à¾Aô÷Ï5¦þÜÞÅVpô 55lQ¥ ¤5룢‰¥Åœ‹™óI´H>鱉þL‘=«Þ;H!ºüQ^)¡À>ÃC|4àÐæio­mלŠêt0nñbvù A/Ù劻¡‘Ù!AÇfLMöšÔ¥¶B#¾™ÍZXNº”ò¿C“LYÉe&zÌ~½ö^lù5›eTËp¥¤†XÆt4Ìß$Y½`m·½sÙ5ˆÀ>8¯À (.h€F–™—ìu^×ÜgãpB¹X9RgÒgFI°YÚSÿ„k+'œ£Ã9¡kÿx‘žAýCå¡ër½çÚV°n|¿ ˜˜)Go7|we^,N ò*±‘{ú,Õ:‘÷ñÔÁ9Õë ¶Þ½'T//ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4v6Åro^$¬W;*YNŸÃ:è壷«æeè(nkb"¹gÏ`ºƒZ< "c³nq!'ó J®Sý÷É!y¹„Šw8tŸ€¡‡£{|émy’-I¤·…ËÛo£pþè…0«2·7GàŒr˜>ýÀy¿/ <Ç*ηºÉ$A”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœï,ñRžZû-Rmë^R¡Pí³Á²ñ0)•wÆå®bwáØ2Š:v¾ÏÏ¢)ùôŸB ฮwm¬i";`n†UPlvæ™ä¨ËGN¹Ö·PéÚ'úJLK}ã:n¯q´ x¨³¢3ó)ijÎäÇØ[fÄì‹.34ÝÕ)–X‹âÍ‹©¾ÑÐgŽ&YÉvìÿ2£æNþšRÀ%äSS¸°çï?¹š²`‰*X%!tàœD_=³ à ¬ñ®¯‘ Q"¢Î-H³ û'3ÀQ3úa¼ëÎè%Ê÷äžYu×%G²×òK.ÇãÃq› ²röÚï0€½U,>žøWÀßD*Uÿhêÿc'ôItt‰ò»2»×kê#¯FüP‰¢p÷wŒ]æejÀ×3êûI,ΔæŒTaÆ¥ªO`b‚퟽¹Ê7)„аͦ¢w:ÃÆ`Q×Ef‹å¤º#~˜ä)–á*•ä`¹mL[¡+á /ƒ7ô\rTÝ3œ®M6ænê×^VÆ5ßTk“ èÙÎTòY{üÎ2Æ7©–;SêYæKÑÆ ÇJ0R.r)b£‘ršHò%Ÿµ…TÆ 7yÃQìÁÜ}b~·òÁÂH–yêÏ' # -ú¥žÂ¬ý¢ðx™ß<ÈÕK³%ó‚c°ql <Öòïû`‰Ö££­J ‘áz]7UU%ÿ_qU„ˆawxûc›nþ"¸ÕÃ`d‰5öföýØ,‹k€A¸!Ÿýñ¬1ýÝϲP…€cÕ‰BGñíGpÚégx‚Û²azm;ã‘cö‹dâÌß ×aø£ Ô :…|³ÜLg¶¡7ŽÅn­-õ 4ô·ïÃÞd¦ 7A …ü4RMàã c½ÞÂltÍ?[Ê\%é ¬12åaˆ²$T9éÊâ j» FØ>e «~QÀ¸‰êÀ“O£˜oP³â¶l¨"\2T‘AÒ«XÓQ#—IÞUüL5ÅÂÚ¡Ën„À~}npB³–ž’Pº<˶šGü"%ÖðäÕe›«òw:|§"g,\fÆ«ß`Ù >¼Z!ÖMUïr¦.ÁPH¾  Ä»¸Ò Û=(å¬eég24¬ !¶:þ/§4 œ²J-µ˜ŠN yÅ^%£6ÝÐüö9,wUoå1¯èü`ÃGó›{¸Àk Iœ¾žFø®øº{Êc§"û¸KS‚«¶%%䜪’œJ;dí¢/Ÿ&Ë4Ð /çZ§ÎÓÓîÁ1)9Sé@tzµFL°»ñ×ãæî)ij>‡»–Œ–Lá¿l:CQHΞ)Ó&Íugƒâ\ù—¬Â´jøOQ%ÚV•Û}&J¦Ã¤>§rèùþ*8†‚?¬Ÿd¼·Žâz84[‚û“³' ¾5µyNœùx~Íy ÑP_Î ÉŒ·ŽŸŠÕ{_†gOéMSHèBCóÁM¸hÚ«Õé«ñÄò–¹0V&»5ßÙ,.`Î òÇñqŽæÓ.¡wâÔ|ž‡«)þ±­Ô´õìbç)Aqê-hB?õ¯Ô -#”¯»´]ʇ=[VÓBчí‰^­!ÃȵÒ)w‰ /v|e»’B6I‹­NÈî¥ä&$FÔbÚ<óáÏÏ‚öXs¶ñk4-ã¬>*5çmrªeç„6€v¾Óc[ïTV¿ü-;5ëŸíç¯è}¬"/²NuaŽ?ÞÒY­ÃSXðÜâЖá@@aÚƒ…ØM 4º;÷«"ªfks¦!ncúfbäýS4ýbáäÖ¦"ZtšÙ­žÚb¹ê—Dêc2Fu••¹0£¸”ÞæáÉÌßc.)Ýæ±¸/­¤² ÙæxÀ>¦äµÀ>M—…—ß!Šä ·J GX|_&©S({ûóT’Wõz<ÜÚ²o=Tn­ÐdÕ¸¤á{ÆMôòô‘È*W¤ÕS[²ÁLùþ ìaÛåBë±¹žqœÛPêÝaÉîlŠoÆÒq–¤DÏØV…×N§-…àúò¨@.ò¢,Ç¥ÇÎK§Æß©/a³óÛþU-¥[¡¥£þ´ÀàsIÄ=@’[ŒUÈo"¢>w¦/?œ „hÀ@V‡°Ô`,=*Öê£`Ú«K5¹=é‚ú«ýÀ|—8’ÙóèºýÙÌë±) ÍÖÇöÖü×à¡°]ÑD´kÑ¢9ÿ—ûX 5Ûëüï ï^ž ©3MMlÐT1 wš5v*‡•D—,(±± ×¾ôTE9ï×ý ®½èÈ"ý"5j;KoS(¾EûS¹êÒ¶„ÑÄÒŽ³òã(ú;‡€¥û÷¦ßšSsú.0^ùñäQMðQluôì^Ç©^{³?‹³+'âìZuzWœIò¯n¹6ø‡82YóµgD¸ã¿pk€œ<Ú e°î_%z˨XžA/L™"Åôï ²­¶Q\ȶÔøóŒÎ‚¨85y üTr%ÊN$÷Œ¶qðárHe58QÇÃæ•_xD¸f1C…E3dòŽÊ À2áWC’ºWƒ}§u¢¤èÌm-üa&‰fÀÛ¨ •hÀæeäc :¹ÆÚ²Xc2QBɹ ¦÷W™—ëîß”TêÇáYOη‡áD€%h|Âs>×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨ÝcÂÈÌ àcc[Ûø®ûoÿ2°‘÷ËrdHf?üýã/îŠË\sZ ÊKL"Ó?Í Éç7’ænþkï$K8'¼ô©*Bj°´W‡îŽpƒâÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞ“ÑY•†äªûŒ\¬‡ôF e,ïª$AH*^Éq9©×PL‘÷#¡tgR…Ä&Ùñ|Û_Hüûêu$“…’@;w`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/¹î}tî‚÷O4 ø4^®Ð›^ 7…°÷"›u¥ËqA Ò]ʧŸÂ…>ºø ÀŽ;§û’öc7áÙ'$¼ó™ý¿tRC¨#ª“úÌ-°2(?‘§Ùæ¤ÏÏÙ&~~αùû€óI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿnÉ`:_B³wÏ”£bn¢âC9_íµIÂ¥?¢\â©•i½)Ÿç% ð&¯ä\:{$¼û—S8UVþg¬p³Cí2.YÕk„¾­cX;ÊDAdE«m;\8t©Œ6wø’j߈$®ìJëE&M ~ ¨—èMÚãМ£7KCIŸo£ªAÚ˜t—ed{÷­EÔ±-ä*i³È· 5ã Åso®7¤§ˆ!å–xX·eÚtUÑu¬>ÎÀ~»ÕëKOÿC U¸Rô³æLô…B1¡ßºaþÙùHü߉GE¦ØžA?)AÊ~Ω ;`….6ŠÀ WÐÝ‘|1$ñKaö*e*¨ÈdÛœ+…ó;ß#ÝþÀ…›²7áÔp4ò¾ˆì{—ùHúõ ï³5¿ò‰ cÿ€üGá“k¬>п>Ø;Âø~€¬§sìs¯?ׂ‰&·ßL&¯¸ã­þCì%3%¼Y“ÝÕo…ÌrNìhØ•Ým¬Ð_¾[Ð/ ÂP×’ÇeÊç6P~…˜O0¦¸TWNÎδA¾µŽñ07RñG „Ø»7Cˆf8‘i!ÞÙÓÿ~Äóš°ý‚øQÃÂëÒìg3ÀôíIÀù Ôé s)¼…‡Ëe7?f3¥GHzJ/Qª„öw”ÜìN$`ßÕï«Dq$0ˆÈL/™Ÿ@ù™§Î$ÜÐÃñsÉHI¤ÂíÎ*è6àûXÒ™Ù0åÝ>'b˜óž—8+åˆ}²xÂ’†Cë.Ì:b-êTa¡Ý®Ì]cØn«]¡‘ôÛ*Pн1OaA>ñ–ÝÝ{*ãÿôįŽYðã*C`®‹C~‰©¨GüÚ:,Žf0ø]}NÜ3?õ¡ìµNÉ %[` ]É%¥!W¢ÿ@ óÕI¿@?ªÎÕZù:˜~é‹ R+…Ý@ªÙâÅ ˆª'dWÖuV zíCxGr‹ñçŸóЉ‡»¢æoœXâžpß®…5 ügŸl7Ö¿·IøÅQ‰Ã1pÈGqC´µs•æJàøtŒ(}99«g5ù„$TÈ ¿b¸´5—vs…•“oÏ2Riw?äG‘6©úüñ[íz#F« ~½âÅl*á/QÖuJ&Lòÿ9=dá«ý¥²*˜YÌIy›|²Ÿ/Ub’ņÜ6?+bNMü›8ø2^\ï¶;‹‹a!‚&•|ˆ³Î+>>êRLjšGÇLlÆMÎyæ;7­YJm«tÏŸ“õìè~› )[¬[Ëç—Û㕱:ŽfÃ¥k¢F<£¬˜¸¬T8¨GÝó†%b¹^Š}8_©\Ù³i¿¤®'øÅ„uÀF]ž‘¬mX-`ó¬·í3-×vÐÈ`tq…øþ£;G”v”gD›³!£óÏu50DµNfãàÓMàƒ úÃP{4éÒUÐG ¹/M„;‚[TJ¬w÷+Fð´‘ð¯v8O²W™kÇSßTÇMœËÛ2vxžæ5x¼¤þ‡9 22§iy;#´ÜnH?(9¡½ÁÂNÅÈæÇޖЉAè5Z FƒoÓÝu/2§p{À»‹ FK×Ã/e§Î+¹bòš…6¬ÏaJ(®€•õª-ˆ[Ö®§í ¢FЃÓ'Û„ï¥Ñè4å ýÝ» CêØwÊùÔP;hµªFwtŠxŠk OÉì}sãúœËqÞM Q3hù»óf(oò¾/¿ˆ\¦J`ú aÃgõðOLXÃkH›P…M»”7kÃWõVn á1EÜn½åä ûKíyK6Ŧj6*nj}ª§RT)^fî:a/︽àžMµpgœ4—8«)N&oézÊÜl‹Ô‹¹~žj¬OD)}ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡vRn²°aRQU÷ŽE™è‹È¨ÒIS•3ïæŠ–ÿ‡r’Vþ?nPi'çCJWneû ’HâôQï”l——Tôƒ±ëµöeJèîQæä&䨭(E©ÁÄ,Q¯ÈiHO‰-Ú- _ï‘ÆEwxÍtŒkÿ ÁX¾8Ý=£‘¦<¿K¿O ÞŸ"ÿ<;0´ÐWžO$©Ñî¢J[wÙµ'F“Xûتtà}ñ·)¼énÝâ„k.tx£Â<~­wh Owµºq‘o‹ÿEàT ‡sÐ!Y£“¹b8๖z¿šˆ6A'œ\› U‘Ïgó‰"–àÌÐ-$u‚ªwÕÁã@’x™ãr>¬ 7@ Õü› J¸5cÖ’ò‚%0‰¦˜À(Zšb¿·<”Ý~AüÖä%Ìû•fc.¢»»±ìØpñ5ýâ«—P¬É½™a©í&x*†j;ËMAÙ mQ.¼ÿKTòÇ,mˆ£ÙÇ<ª7<=â£mÄ>ÂÚáH—°Â‘±›› ÇÑ¥J…–Ù©Þà÷”©´øâOÈmrê ÷ºô•¦6ÜûK‘ƒuª4êž‚ÄZá°rrW¦p\=7l‹^/çL› 2Âxc¶+z@±q^¦ö Äu):ÓYû«Ÿ’+AÓŸ&6%+[Ó£mID|i¡}9o¢¹³c:›ÛÝ„$OqvFþ=¼èãgªFå1 ø1l ?}±l¢©ÓV¨$>P&· ñzŒü^n±Äw)‚öBªXæ\äꛨqð¸6†œæJ½ú6} >ƒ@vè^þ¬iÆ¿…ü$»eб;tVÚ ¯…39-bè™èR^8ûS ‰,gMd'öð4È2Å ÷×H!|.šœ"ˆL(›éÏÏäËjç@Ìç‡Ú (tr›dT Hx“âœa€,-õ°ò ]Aq,b“zÿCäíÁ_vL/s0˜ä …ÝZ¼y»S¿´½ÛÒe“O,€­2ðDã̽è Nm“Æê¡Öì´±³b$:(èDta;Ô"x¤ØP¥%ÊM ÔHæ›ÃA÷¼Qm]‰»RÖñ¸oªO¤1Ûñð—É‹<¯e­ÔMþDÅJâ½É JjNA6±¼»>µ[oy…AL‰q „y®aüäÕå]ÁWO’ì1ßÜYN­PM˜Êh1hÁ·(¤»{Ï4X ù­¬OfáBoéé´ó £’¶ùëæóqLLhÙÿ>ÎDœ¢P˜ë§Õ{×<¨ÀæÿÿB;ÿ&1×cÄa¨Àb­,ÖVÒgü%‹§¡fÍçÍÕýºÆEêÜÕ÷ºhÞCȃ¢û\HV\ú ?óa«7í«bÕâî!WA»QÔpc͔ܺŹ}VýwÝEZªàþa·ËÄÆ™}LÎñ Ü¿“sUë òÉAlÌöŒ`@kRœÔ€ $yZ$}b¬xþ®G¯$BbqAî­éZ9<¸<Ó~.ÜàÖ@ÀÉOCÐÍ ™“¤5‰ŠöùÁ· #>dC4zIµÈâ0¡$*Êé¡i¹¥lËëûô²¬'t/WÇê‡UÙ¥¤òÆ }\äs셱˾*ô!F3UŽÎ ÓÞäuÕBÞoœÚ¬öÖ6_kÛ“×–žêø~1öôEqúŠ6 þY‰«í¡”tX‚´SçÚ¾ÕÖVŠC—R%<±~O›òjVÇWeƒ»zØ*Ô“‡f»@ýR.U¸NVA"\tñEÑ“¼}\TèVئi¿aÅ=ÜZ1¡£ätˆR©eÍr€ j¹®Ä ‰U¦=Ð[¼‚Ÿil˜g€gúÈÃOÎôgñbé“ÿGÝ-ªG¡³n/ è/ç>†2òÆ¿&~•ÿO«¶ ’}• µ…½0h7Ã?@ÄK(¹Îï=A8Rde“=€—û¹žŒòî;T%¨BÁKX³·›è¨qÜ[3S$@!áóŽ}ûžsXå¡ÒÉtÊŸ:Ôå=qeÚo—«ËØB°Í%0Po|ѣÚsE8 ­›éØw²Ä~ª™q$nfFŸ/4>é{¡^C‘2é1Î)ÿ} œÙVw†éL¼+§Óš 4âCæ«à©JŠW²úšg=[1Ü’”i7LÃ'õ»sƒxµ}s²VÊY¿LŒ‚áÔ’ß-qÜ´_W”ZŸ˜…°’ÀtxWûè ßhUVøæªÑþç˜ö!Œ[CRÌ‚„ŽWs”'=Ç^ö,m`Ò÷!P§óùóæîË{ÐMV¦ZfÕøØ5O­¡HyŒo¿ö(ÍÑÑÞ³…]©ÕDsjrÄ?GR¢Rð©k.åïô8¨+üÑ«øb'%ȵ‘*#õÈ¿D}}C „‹iÐÉÝi}áá`ã_t#ÊÓNåytú'O›à ¤û;?æÔ÷’&më[•_UÃõ©£Dè]2àã ~ReÄî—ÖìTRèÀĘÇØsHs_%å_ã§z¸Ÿ >e¼P˃Õc1×O•f™ÄÒ,4á9½¢£$¬ÖMçhOÑhüߎà@„šÂfž±òÒã­‡ž²-„ EK[k@Ç(ãì²äJ©B‚xªÛ[rXxg͘¼F€Kãw颸‹ë(¦*j!C›çÝpô”ö×GIÝÿPºð­Ãwè®X&±^!M+Ø®â-†À|¹¹rŒåºöQº fœ úžþ7£³Èj®½!Ñì¼{ L•¯ÈNkJä‰3Ï4k3>ÇSîš%œ¶”mP§ÅìD©Ì,ÊÏó¨ gßÍ®…¤cøª£„Ž{T‹gúÈTD¾¥/ѯ¯¼ö÷úÊXeiž´ù˜=^ dYšgçþÝŸ v—èn|E>!y%ʶ3£€dá/Ó—e EùÀÇ•QÁ8°DUmgßD›¦5Ÿe%:PD<ôja½…91`͹¥°Aª¯p\¹ñ+Œò·°"»M¢þ?¸`’»åb)ñ$›¼+(bŸÇÅpi× C3 CO16³ÊKÏGš÷øó–¾ÆŠ%©'Ÿ(^òE ä,»éZÏêy%0U_ÈgÝ‘z“›¢ :k’NÑö °:ÏyA4¯Õ? %Ç«³>l—v/Au5²tr²¨Z>úâÖpU`¼jOå‡Ï•Jó0‹"B»”´žƒå‘3(ø(©múdìüñ—Ä €– õ·cË˾§þ×ìÌÔMŽLÃð`;¨»ô g 2»TÔš6"”=f=ÙRˆÚ:Æ”·™¥ŽºªAÎ Ü‚š§j?¯”P-#³ž­‚2ç‡άLÎ…#ŒòX2„õÀùû+çì,ÏÝàð`Ó\¢!_éïÂ2{ME)kšcz³zÍ9'¬6)Õ[|ùA°¢ËP+\bp¸çz2Ë[ªɆ¶ú+r<Á ŽÉè2žm—o²ñU¹V_ê5Ö}†éKš»BQL™Mõ£yU˜ý–>Zf™X­1é¨Qß‹°Ï“ôj‰ÄT îKVˆQûõÂK-Û°h¿ÝŒB·W.~ß ~ À*3à·ï-'z‡²úhù»Í4Á}qCy±œgÅäe—Í 7±Ð^¼P¤ˆ§’–ü±ó4{W- ”• tq;\†XŒvvöÛ*š{XÐ×À»pÖ€;ü‡ënTrÌ2JgK•ÛÛŠ«í› €W4æV® ÿ-ùRÏ$âeb’4ìÛƒÿoPÂà±£øŒ\p†‰¤}Ž ~-iœÇO‡ÍßÞ‰.ÑÔ¯ <?ot»]ì.Ϲ·#s|b«ˆ“ô”ÜÑF3ki8£ë›V€ƒ;àÌDÁ¢éO\…í«CnoT'nÙ5 ~[ôX~1^¥0ñäëˆ*£S0NK›©z=,TŒ ÑÉ›‘j-uÚ œâSOJpè´è8k!W8Fìau–šCoÜ7tÃ$®Zó%(óäÚ†`Ñ‹B†>"’ÍÀ]ðÝà˜šÒÁõ›Z*7â‘*ôÚÔ6b Ãuï¾Ûfn7À¸cµh~â#é³r 1}ÿ(–"0¯Ä}Ÿk¯™L/Î ?*ÀËåŠgèÁšÍàÜ¿áÍ ¡‹pmþ&5ÀýqdõÝÅ]a%óÔu@ÓO³ØØòmBë[ƒxMËÿ+)ýú!at×»˜2’$QcŠ&„òH™UöìÄ炤æ÷XõöÒ-„\'‚ÝŒxl%o Ö—–ÑÕÕ²)#f £M°mpéâ Ç)Gß±mè’z<2Øu×’Z¼¶ûCݾpÅÝ>þÀÌ“öpÏz0ÄÚbó)cO`Sé*½¤ÃUŠ«L:×] 4£ø3ˆ×‹Ê!3—-ÄEøM¬Lü(ë¶M²ÁýݲW¼ÚAOĨŠJÇ=kÿJÑ9ev‰RùŽM”µ:¢;ÃGe¥å zGѰ¾DÓXNj¬ho›o`}K ?ö8'©`i+MéˆÝä^?}`£J&/Oî[ÚL³(H|l).Ø­å6‡Ì@ âÔ’?æD=ÊÃZw'¢HâTH'ˆ#a RÅ÷yà0¬5æ—„~A$ @Öå5Ãyzh·,žA²ò­… íEƒ ¤£¨£-‰šÇ¶±àcÝÈ6eZmƒ0ñÞDeê»ø"=<ÐyYÙÒþ7(˜d_OòS>Œ+&Gq&VlƒGîwq7“ðØLªˆÜ81) üqaáàÔÉé/ׯzÛžîÕ–A&’2#£Ã\ÆŠe8¨ù«3¨¬ÎSÕ¿FVžÁk,•TØÝO{À÷¯Â½¾}jؾ)t°üŽóýЬœdøjÝÀ6pïþ^üöÇ ž\*ÈâÌ{&KT¼€¾PB˜€µ‘ø,Ë0¿J\"´M”éHOÖØmÆï{7ñ6 ^$švÄv(„¡ã×eŒÙå TÙ.ž4{×è(€è†ß†Ò's•<-û à›QˆP\J鉑5HµåZ=»:껄®®iâÆHºmXõÂKÉSñ§ZH©7\‡GÑ·ÀùûIçëÌÏÞ ä´,  YX €X* 뮿/ ü¸“zè΂Q ÅÙÝñ¹OR!—oTäŠÿOÖvèÕœñÊp{;QŠ´øÑ/Wj²ÐUl–@eòJí;yH:@°+|ämr{n½þÒû£!kƒ-ÀnÉë’|xŸÈ/ú@‰¦í\ŠÍ6F@ÄîÝÂϰáP vxÌóišìü]/doà{ ÿ@„é‰îÔ¾ý}ÅœZµnŽh3å;ÑŠ¤— y5“‚_Åb<ë’‚ìUï½CÌåÕ¿q 4©¢"³6/çaÅn¸À2!jàGƒ9ÏçxçðRîwzG ‰ Mî}Õk#_òjŒk'äÛ[Æ ÕÔðHÌÃÓû@…{êåcpRݲ…|’({Ê?C»ºh€Ñdv}ß±aST½eõQÆ3°Sm¥¤Ëã÷(d˜µÎÑþnªa¯Ùféî½ lLáôTm`–adÃJ*1B hüª¿ñã´FRÈeÝ¡·„[#%¨:xNbàÆ%½£û‡3ÜÚÂÀá»}3áÕ~›zLBöC‡£ L fC†bã¹p½ÒÖõ#¬M€EjK×ð¾9T£ÄˆÅOÝ“5gò¾Àrw4øçŒ>j‰d†:ãj<¹ã¯!tåAS!5lJñzM«¦‘tjÚP]ë-Òòó˜$@‹VGü³„ýZZÏdÊ“#Î[TÈL|{P< ¯¤í0¸~czalÀ]d$/w'JmêÔÁa"0~)±›%A4T« 'J¦®?ÿ{”ð ³C1`oí­Ê ka¯¯¼ãvç.š#^jª†‚ûÏ%ÎWU¨t ï‰/˜Ò¨ÂlR2ZÎZY¶Åü÷tç»n·VÌ´õ":$I›ó)ÕOèÂ…s@ ë&² ™Ë¾ßÕ¢Tøc„&/ƒ²Âº„p”+ýï nlÀ·MNp·*f £¡Û‹ÓIDx18‚LðFù„Iw{ž°+ŸZˆ;Q·ã’ÔÆÑ®É;Žù`26hö¢5:ð†5¾êá‚pØ.‚ðeò794coÞ06þ½n­ƒ™ çdÛÓ+ªdhJÊKN­[ìÆ d?ûÜݿϢ5¶çœ¢Ðh/¦¿åñ6f™=|ìœeòÅÿ‡H"ƧèC5TÈ‹{ÞGW7ÿ ££ º5§7ü½Ë6Æšâ(¹]zLK"ÉYöc)êic.Ç’™ºÙ581iùYœÿhƒòwB+lx×A8DÑZôƒò‘vÏ¿§ŒÐ@‘y«¸e;~â_…ŠÓÈä„g—o¶œª xɧ]ˆ<V ’_2L¹ˆì9ÔáÃÀ¨Ö¸ýíÑä⊪Á/ˆ‘à¼ùœ×¨v«íúÐÚ|•ô&N=ž0v¶¬‘Õì“'9dí´ë#¼Š S3Ôæƒ¦pŽ8|~¡ãœ×³¤ hí±°nâ™:æ>4`“½¡Ì1;´KDËA$bèx%‰ 35dÏPÆ6…fÿ6 W7m‰\ÒB˜ÇâP~]t±ðlz’Œk!dž|¡(ÙÉ”›Ø`Ò.”Š¥ç/n¸qQïZ§Çá±Qøk4? Øõ²k {˜©Ô£åÜÞ<”=ÃŽCƒ Ðl7Ìù±…œ®÷%R6¢…ùTüðè¡U¬o]`‹[¯žæ¾É1ÉE´s›‚¯QÐi‹ž:=š·Øêʪ>âQ´è.Šó{KóÆÀZוXZÝ~Ä©\al´Øû7¥¸U`r¡õF§LÂè4gMWÎF£!•¬à„éÛÍó~Ä[ÎFAMOÿ(R•¦‚gœ·; Ò!ü ¯ æYÍ&^:‹K¤¢Óò¥H¨fu_JìÈãý·T%Fè‚9–ŽX͈¼¼SÈ@½ˆÀå_,Á?§dA£“Âr²‘¿ÊBk>E¾û\wÚú¤µãc7Ng  w”%]¢t(°ÖÞôˆz¬è–Ç82‘½¥-#7cX×÷ÖÀ­‹ùŠŒÐÚøÆi$9j=ÐÎS žà;)‰+h :Ç¢Ó¾¾\t¼-É)G[掻,×e‚+Œø=v@9o~Û‡IP@Š­»‚”•ÂM»Úm ±RiLv°3A}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•feÎm.Éê7§ægz8^Õ\eï*_Îû±éJ"À¸ål¬ÔV»K¥¬. g¼9šM3FyO¤žÎ<2d@ôX¨MI â‰w¾ª 6J€LÝmËÿMwhâ ÇžAqîˆÅçßn‚œÚÊ`_L ¬!IóÝ>BšÙÛÿyÐk™<€í±O0¢Òì|)d¢ƒÕ+*Ѥ¡ÆŠ÷$xy <»†Ã.}ÇêØwÝÌ ],’²«i0vJdÑÞ/R&xϽU€6@_ÄæxÚ݉$ýû¾ œâ^<1|O ñ‘¿Ü“m¶Û7ÈEk6SÉeÄ0R<S”A}Žõžƒe¶ðqæ}0MC46²‰#§Äd—±ŸGÍd!vÍF¹pé#±×à è“2æâû} /·£Oáé‡ü=ޱü=?‡B¿ÃÑoø{9ãøz‚‡£ðöuqÒÄC'˜ÐðøÏ,ÚW33;'|R B˜jðòŽÑ`ïÕ¿ Z¬ý>ÖI¦^O§×P¦Ë¾aé'¾“8“†@œËŠú×jÜÎö¨÷Õ“K­dÈQ¤“\ BèmÞµBòȲw€‡Ï–»Å´Æk‚PñËó9È¿@/.f"­ê˜ûÞà\&_†£RŒ+ÔÈP.,ôÒJ>o7$63JHÿ·êÍ»Q…äXï²—CÇ2ÐZ‚¶Tm2üဵeiÐ#í„—Ÿt\ÍMv_¿|o³g x¼±ÃºÄMÄЪ4Ç¿ Œ¯/Ù¼DÓ¥Å̱'nr”÷:3t™æÉÓuÃYt28’QÏ­ñ›%‘Šöp²Ç‡V$Q­8˜'†Fz'œ6º×²,…Ø0Iîí ©‰ õ7%"IäÇ{2ôŽ¥ÿ>QMÎŽù¤ç-è.ùbôû¯öArœ.0|Ø}½§Ÿ?<šÊèSÒSü1 œïÁêÆsÀS!ã#–À½å^¡ å®ÊmŠ{5c÷˜h9WoÇ4¥klŽx= …<)¤D3 hõ¿§à‹™oã²ëL×ãöÝ;ðh„] H Yﲿ³$ä #EåÀ”þèÕ ®ÛJŠ…âm…u|æã.°º¨E¤å3”ì™/™ýëÞÑí/ä,Ò€­[]س/BŸa ³?G*ðñËúóJkÓ3OåÍ&«ŒúˆÌÕíBfîÄù ìû2Ðþ*ÚϳÎÛé'aÕc}ñÏ<%mxÿk u3ZñîüIÌþˆSs½8§ÞÍSÜ÷)°DÑ£oÉÓßïƒ ¹:V—vqÌ¡ «„írh™ E-xcµå-þ[»Ø¯ÈAÚ¥íלê/³?8E´B¡æªbË?§ôL~ÍÛ㲯ß{Šõ“T¢èä:|õÅLrB½`¯eÍu]‚—ÝÅÈŠŽ4ôömEÛá '¬ãêo •\©*³k{< ¯a„R»?‡…¾NMÚ³9×Åü!–a¢æ7h &X± `µj7“„ã„ó¡Oó¢\9~'Ïo¥˜sá“6ÍP`*Ä’Q®½ÛªM­;JÊ_`¬ñÔr-‹óXÔ‹$<^†×þtýJ\ AÛ<Œˆd=þ >Ì”„¼GÏoQ§/n3Oò£2þ`-þÑ©<øà=/¨MöRŸ´çœùÊ_flÊl–)è1}pÎ^4 ‹uíz ÎÍÅÔ—-Ê05ÚŒáñ 3É™e‰H]´@ìÔÿ8êšUzHn…ü° ¥«·”@1‚rpDtví^Á‰[ËÜã ƒ«^î>p!ã×Å`kf§ÙE‘DöþÛ¥ïá9OëÎLM¹±Ñ) DÞ”ðàDÑ'^ä8‹â=Q, U„ìü f6Ëx÷3¸<#Fëcf X]^œ’Íx?œ?[=Ë#l²æ-WR{àÞÐIulA©eÔj{2˜Õí–¢«Z½¿Má‘bzf—?(~¤Ô…Ù'ð( DME0jßËPáÙb,kË}!÷à»äŒ¾Møà{,UýróòÙïÓT_¬ÊLn'¦ÍHVgTÄ~$ª¾Örb$Wþ«+êBdEÔ§êJ½ñ˵ë\×ípq'A¾U÷™ªçpmãSÛõŒÒÀg€Ž  5zYeGµæsiEa?£f¢/1cˆú¼_?ë0˜Ç—6“„¯gt¯V怖¿vËÀØø ¡KÔhA*yZ“| ¤Å ††”q6Y ^¹syæ Bß­; ñçÕþÔSVX빋yk‹L AOkÙ_ºjÓûšÛœ$n|¢Ó{[š0‹¸  ;Í©¢E;$TRµ° ÎUVÊæè³Åmʆ¹ƒy¶»s_büŒ;ç"`ÇÕ°¸­ùܦáH”€ê'[4Aè$âìåû‡Qعa„æV7ÈÃL ½*lî%«‰a’zÀpî&>¬Ñ‘7Ó&¨b~hÌVxú>^/ºñí0ùƒYhÑ#0x s1ÈJ«q`ßVü© -S$Ø¿k®Òçô¡¨‰0À9í¨Ó­Š†ÙF¡¯é1JÕ/A°jGßÈ)q÷>Å%sRŽgÈõ ­E{ºÐÙ»Él5¬„6R?‘²¼€è»EÈÌTüõîN½Ló^!&¹hÛÝÊЫI/žÛ/{ÀºÜ¿Ñ´G¿ª’¶Ñ&:¤‰ãI¸³óvØGû†2BËHŽ<Ôíl¹sõ㦑ðú*+Ø— 6‘”Ý;ó‡Xƒ˜•ÖítOÙŽëoo¸7Þ^ØÅØ™cÒ(b@yÌ$Š]S¹ä³•Öâ)Mrà^o"Nè«×ÜÉÁp1Dtg{#Lˆ¯?˾ã5xF*¬îc;~jŠ=é]H`1Óßâ\%èIíƒ-ã3'¡ìçäÑSQêVýO† ‹CŽHpL,Ú´½`,”Š:¶Á¶0ý |l,çm³O7þ ©˜­Øÿ"’„6ANp*^ »iɨ;!ÂSs%ÌT„S?ª^mÔ5K¾Z&žÁû“*km-:Ÿï³ÈÑÔ×-åsÐ)LŸ)Ê<ÑœJÝdPÈ»X»LÁÃ;z ©¾¥ÔäÙ V=ÞÍ)¢`ÅÁ9uÇ»²Oœâø¦ÊX:iwÙÕ²ÈöÄ›Gþ…yð ä?ÎAðWP¼þ¿ç0©0©a-aï¦á\?Žq¹jõ Ž÷ˆß®V Twà •mK$%Š&ÒØCÃp±bš3õ@}úX²g«±òmµ_ ,oÎP›Ý´ëfrMÜO™T\zL|Ჩ»#„Š‰ÔˆâKÚ}’œáònÁ—· \[îÛ,‹[M)f¾·")­Ù™öã‰Oî‘k9Äú¾g~Ôõ ‚¯Mêfº¬x‘Qk‰ðK¢3pÇöæ¥õÀ\4CÖ"…F;CÓ”ÆâAúþ s­Ÿ.,~jz iÓà…Y,ùÞý{9Œ­3 “`v‰û‰ƒr&Õ|+È©w}ÖÞÁ¢ÝÛU«,ûN£àx€AÈ5ÀÓE€G„óœ³^«ÅSEšDú+o;„»'¥Œ0†Zá R<e“†PfjéVw6þÔoš “UïØä×*>Âzž²]¼FçÏÇ4Ràûà à‡Úû¥ÜCá–{3"–QB`¢g8çõ«?A¬öR¼®›£¼³?ÿS[Yæ²9Q±'vhÞ °'²¬ÐYoÙ„Ã4m†+jL­‡Ä~ÀÊ“DœÏ&ì”Ï$XÛ^RÚ1¯2û°J¥†w¿Šã¡ØÔã• 0¸3ÏRÿ}ɦ’~8çIî%'ï,:Wc®Q™»2ÏhÔ«tþL次ª¶o‘<ž0' u¯’ è’ª¥Ø×%4 ¹t¥qÄPö¹Ÿ>~Ú1W¡Á‰×û,¿Æ£TË/Bk#Ã[4ÿ=yª>POj áDÚªœ¾Ð/ ˆw‰Èñ‘Ù&†ã¡Â}¨÷‘ϼðä!ÖÆÄöBâ¯Ò²¯Sû!.ƒG¥˜'ö³'3•õHúñJR噿æÚ~^n~‹• PYU9œ¨ý¿YR¤i-±®Bì€ÛYÓ‚ nuÁàtþpÙ¬—m¿‹Ý*Hž»PÄʼnÇ3àßíÕÖá –hä¶t‹4ÐrBŸ™Ð»ýžB‡ƒß~H®_P¢æ$++N¸kÈ”]îÀÙ?%ƒÖŸ þ”ÈC×}ý_ëŒÂ$$Á³(?ú„Ð÷¸Í‚Ï×¼±­ÀÂ!€¾ýǵR&’¡P <°£!ßÝÓ2±ùñLb"ëe÷ý°6¢~±­{öŶmŠz˜{ÅÈTæS™ÿp'@v©ÅÝR×oôôêÓyyå‘w'ѽ[põsO*âάý£¿`†|%'!;ƒ Ö…Ù÷­4TûJ²'\¶Z÷ Rm–þñýLb°Y¾Ã–­/%ˆûÇfssªrÉç›!ËÁ\ÝÔîŸ8ÆÚpêzmšÙOzKx*]f< ³a.—F.km4¤ÎåÃHBB ™*Ér¯< šLÂCK±à"YÛç7Ô—ëtƒ—«áµFh“«%ýŸržgNïæ´:B4ýB‡ -˜÷Nøz Ø fÊQh®ü ­µØÍ•I|õw>-'@ÍøÜŒ¥@ô°U:ªï‹ƒ9‘aß¿Ì}0€¸måŒXîˆ,Ú•ºúpŽ¿\EÅTéÛ› QÆFø$¡AÃä•iòuZÁs¤nsˆððÖ½ÓLßm6më8zÀóy±r…µÂð²o^V˜Ô¾â滸V–Ë7°jÖG -ZP;´¼8 Ô½/Îñ ¯ ù÷ãUtî[ÅÎiù,GÔÀ:_ÂUzM?mèÏ®Äñwá±erd)>kúuÄÁ¿Y±ËHU‰%ñÒ¥—ÓÈÚ&ò‰ôÇ(f Çåô…ÓúJ>Û›a×ÒjÒ›ÙÈö±5@<åa ÄE'…KÂâ$Çä8þ˜vþ7¿ñ6àŽõx>SzÜ,°Œ¥KFækþxبEµF1ÎM„t¿[]~•ÀÙA=î[tæ>Â×H­}°QCŒUÄÂé×¹œ·ƒûïrXöuøŒC¶ùfìöE­…³;­™UxWm5X²eîA»Ëßä«äô­õ –DNXi7ýxå Äö[öaçÝUãuv@„öíug [,°¼ÏÙìPsûòøõ<kêì<ŽI ¡ǃ¿&“=öébuíuU"§áH:€ªÍò«’ªä¨¬ìbL/x؆·3Úÿ-ÁÊz_Ê?ñ~n,­ýÃOD (œŠ•–—S´Ãf8Õ‹æì¢,.•nC;È7“ wÆsë!þ Œ¸6¢§s)“bô¨›2á§³µÿ Eö®K0âk5|…i Œ‚¿Ë‰Yš¬Û/>Ó®!j/túÇŸ³¾©ÇïüÒ,`ô^wÞøÀ“ÛÍäÖ`}ìäfôÒªæÄY·´ #DŒ–¥maÖÔâÎ3&:Àß±ò¾gdÀ,æëÈzÒ³ï¨ò¸‚êhcÀ õ°0Ò ¸ëp"_K`ðNÿ€UB(jp í²áQv™„ØÂÉ{ïÈᔢyþÄh¥±áúÅ㜞ýÜ ¸¨qn„»èd¥¸ç(ÿw4\©R?FçùVE¥huÛN!…ã²ÏF6ÿ@¤iôÃÒ0t…ycÛ´3ÌAí›n#0Ê›k¾„¢îm/G-ÚÒø5ç=ë¿ÜZ¤¶ï:zYõwc¿þ¶2]³ÈéòçSŒÁˆ |Ž´ïw>Z#f-B”Ð~c†à]"Ýv ®’EÊà‚zw7ì_þ­ í'aWM³ÜÚ?æÁ*'<$ÿš¢ó4úé©;bûq‹›ÞA ížxç§NÞVĬZþzmJ8¤°™ç¼iq@aÕ½<ÊxFÐOUt±Ì_}Àûû‘ÊÓyü²)´jŠç+±ó Ýó¸3Lu©£VÖ./<Ý ®yýùð'pÛ¨IŸ‚-¥üÙ›rÊâ(]X†xöû3 “ŒÔé*àü òF¤ŠõET•U‹ðÌ6ÿ4àNÆ>Ød©PÉ]<ú+3ƒ¸Ô5Íç“–3LPYhÏ ÏMòúû¾ašá]g¡4-bs’Ò­ë"M…ŠêC.‘òÅéãÈžeã ¥ë—úx¾}ºˆ2}øq»®A¬Íê©“7ên‘9–èLöÞm Šé±¶M¹G°³ä v{Â#>íD?ÿ;«£@/æÜ!ÿŠ›sñäAEž…¬æRð_‘gU¼[½T˜ÿV‘DµóP¥;õ1b넨XáN¢IR%†4Zâ½$´åßo:Ñ(º¢@ƒñ‹œU”(ii-rZý ÉÁÛAFw£±c¿ƒ3›GÆobЏ!àƒp%|ç§:²>µ…‚œUáñZúÒ=ölÐ3µpg³XêªMÜ,Ñú6}4w4-Å`8Aóäݯ…”៞ÕÅm7¢~™úÛ YdägšÁ™¤/`wt¼Gw±ê9užŠ9"ÁI¶Òÿ/äp‰•sûôŠD¸ƒ3οyçÓ%ÿ3)Wǵfæóä¹bæˆNŽ> ’D¾ÁÔ 09òì®&drƒ—e œ™È(I©õs8NGøDØ…H_`^7·òL% ¯ôûg_Tmû†Õ'µ2Ë|ý~ZnÖþ¨Á`m/ªµç²|e ¨…G&÷Kö,÷D€<‹$y4¢q¢bµ®·˜o$] ,¯Z lå:¯Yö8¨ZhÏ…ž@C&oš[.WË´^öL©+g]ñêÕU4¥ ÐºÇ‰à^¢+ð´”o—ÉïàÛ•&¥ç”î™öt!>ËkAu©ø‰zG±}‡¯iƒØ·Õ,~?“áZê>íLJ%6=z„îÀ&ùS1|i=Šüû¶_çšÉVy 2zÐǾÅqcm1 ˆEAú}¾=êÚTfš6ñ™”ߛඵç?ÌýÎD×Y³Jï8HsÍ"Ioô–»0—QêßV5Ô%|™¿à&W¶³ùç->[³CEQ‰à×$òQÞJí…C¥¶¯Åe³Åhjå|óÎÞòám N˜Í‡)X‰7Gî¤Va\Ú_•®³¬ßk1À%€fæšóË ø†TÓÊA )'’ìi˜XÓj«Ýxvÿwx¾˜×ª}à?·½,«õj[Uëœ¤ðƒ°²È)ZÓŒ*¶0¶yë鍊uFþ0!ŽÂ(1¤¤l‚ãŸâLÒ5ù`;¦4héñ€è8’ŠÂøZBw÷ªâ% „àžÀ /÷C@yÓŸ-ŸCãµ6OõUpl{Ér²bÑI¿(œ¯ •Ft¡â°ƒ%3Ú“kÅ;Ôô=Tˆ•;[¼aŸvòVõŠÓœÃ„§I%ÇŠB¸©f©V%`À2@z£!l”£ª’B Ä›9ÑH­¡YÑ›ïå3Üü¹$³‡`÷;«®ÎÂÆã)‘,-cµÛ·þÕi%TeK-åFzªó=xØø¢ço5‡R³ÛˆÞ­°¤ŸÛÀðV’WkPy—íQE¡ºáT!üûWcúLþ— Vß‚#;÷VØòc®O çVŽÐ,Öég‰Ò0¤ÛØ1J²¥¤²¡”jÙþ7(%ê'óâZD¡{W÷ùړà Uóqâ‰âO—«v“u»YDÏ ‰ZÅQ=‰w²‚ݹÝb•OlÅhÍ«ŸÀz©š+Ɣɓ¡âŠÇ#T¢øŒi‹ŠONdZVµ PÜmõ‘‰”ξ±Ø*Ñvè­ü·Ñ‘©Ë©:rÓ›ì¯]Á#”º‚4|l¸sÌ*Ì[¯ØMJ $ªYg„0µaxkO·MxÚP5œÊÇjñ6ÔDÇ_ ˆTè0… Æ uÀãgÅ‘ebòlgwˆ5˼¬˜Ff^ëÚg)_¬HÔ/†ˆ¡ë“¶WØé%¹ï•c>mþ·=˜hÉá]ö$‡ûˆp^VÜhQ3òs«vˆDMµE³xŸ09h£‹µÄXŸ„_DVby±TQ3µ°=£i¨¬&ðäOßæ&þ;[ògt¢z^ÛPlq¨ò$JÌs†öG­}<& QÂèñÄÁ¯é‚!ñÄXÿÈÿ)ĹÚ|3¹”"C:e&ò+šr¨E:qto)$øÏØL¸v‰…Úçwh8Ï-éØ}J·(g.o6a²fodÔ’ÒͦâvooNuÁÞN±Q\>Øî]‘]¨Í'ÌàâÍù©?g1vUÜÌûSÙ7J7 l(îÍ®Ž,°œyª®ûg¢;\iÓovM@k2B(éÆÝQh€Kª-àá6µ$0Ö®çºú® T¥Åó“<†€•Úv,W¯iíª×qOÌøê@K£Då2‘‘›ðü•þ§x‹ƒ¡6FãìV¡lÃÇ,UÄЈ¼¾ßtë­p}K¾š½üËõV,Ξ!wÒŽ´þ71Ì#‡†áëü ¹ôþqL,Öm{ÔZ;ã8î̳åþÿUŠI`A Oá/\ŸWÈ­hô„-'ä;šKv1?´v^v{‰ÏGYxÖÜrýÜ¡ÒÑr `=· X·ë.NU"g$NþýHÚ„Hçz#˵lK¡ç‰–uD”_3.t]Jµšæ¿îA 'R?s¬Ë.õzFéêÉím4D,Éã1í‹>ƒ» .gàæÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qr÷´b [øÑ®w-¹¾нŸÈ¬)Ä,p¦"]ˆH6@¦ÄåÑ¢Ö::Y±ÝwÝ.f¦ÃšŽOh\4{t× frxì1zT³-4 ɲ¾ÅýŒ?‚´ë³BXFÇ ÒA'¥b¦?ýJª,<‹Só§–/yÑê ®!!]}^§2ÎÇ}¢âÓ¼-°ëÒýj³\aÅÙ5uœA½l£Ö(0gÄÖãÈÎx3à(Ø,‹x1uRîlسôÇä¿Ük*|Gö ±Bò‚yl„ßš¿7p²ÇÝü|r€f kZ‘1¿Ns±€P°bxBä¥5èm0‡m‡xµ@Ûa@®ÉÕ §ká’‚‰Ouüûd9ÇÙi 4‰Ù»;yKÀÍàp‘f)a¹ ·…hA[š|ÔÜ0 nÕŠo;cˆÕ]´Ê;úU2f5[dQI¾‹¬ƒâ1óGŽØ¤æX)o\ê²,¿Î.!Zß…XA–™«?Ï—/Óf5¨¹V(Ó4:RAâL¯¢ÚÄN‹éÅy(êÍŒ^§ÂVb¯Ïeˆ*tÅià,tA©ºÜÖBJ°®”‡A7á’Éq…Ùäý®Ö'ß :-ódÝçìç=7[CŒÐ”‰ò5³R„ Ñ*`@ca* ÇŠ¡c(Dð?b0‡‚äì †Hoq±/å=Ö¶‰ÓôÊ^B>c`Mx9Ï àôÚ`H\?¼å¦›d8ÌÿFÛ6ùÔ-jŽGÙµU[²xªGœ§¤ÆZø‡!¾ß ÇCÑ|:œsº sµÆkŠü~}cG/ët¥°*9¡io…«ÜŒ¤Æ p@XÄ99fe×ÒþÁ•@öZ'¤®Ê ÈŽ±YmÐ…!ä*kûÈTÇš3L䜄õ.¤XP‹FÆœå c‚éŸu[RäK·ƒÍ!Œ®fª@n‹Aó/c ŠHùw\lØ;ÒDI|àBp²CÜnnÇZRµ7íd CäÕÿ!ÊíñËkU­F”ó;kœ}ÔéˆÍŽšHRB_ÛnÒÂðræÄ*piwƒ&z?ÂV 6yý{dz­/¯²?$Ä5ƨC\zž=ÿ>šp·©xØL\Bˆ×ÆÜ"z »lØc¡f¯ š~´cÙ•–6CÙo·zlpøÄ:ï¥ÅÓ» žÆØ;o1цßç-èë‰EýÓ&íIžØjE/cQx:2òÞ§üUmùÐs«‰"NjZÄ•À;l5°äv+uÛ{„ƒÒÎÈ‚,¢œ“Ðv帎ƒBöW‚©ã1+Iˆ,‘Ǧ[‰ÿq¹~“Ú5Æöh âñ*J ó’Õ(8·á¿x!= ½?=|º¤¹d`¦%¡§ÛÙ?{šÛ9¯ 8ƒŒc¯#(8éT¾>F¦S M Bú¿Ñ‡sK¤†OÈû8IRÚïªYYížø¢ðøÔP¿P’½zñA¬ŽÒËÐq\Ð_XÅØ€ÞT²Q$Åo»§Í‚îÔ´H)Ù­ãɧ¿ó?ÙÚabц²„M!zuÓcd;„R0Êýì»'naDSòX°9[˜Ë( Ðf÷š´ý ÐkúîF.{~TÉè$ôcÅŸë¢údÚ)Ê’¶.¡ê¡ -ƒN šÿDÒ/ÄíȘN}ŒC¯Æèžà¼#ÀþX2x“ëT)[ú³_ëIJڶÎE´*×®mán¡j¢= ü™JļÔÓ<Ð0c²r?öÁ‡xÜý Ï¡ò0KÂæ]üç‚O\/ü ì§O¶¢>Í&jtò©¦}¾ù7P›5VR.,EüIAl1Ïæ¢V W1Ð&óPëJËS~éLÓmÑe?ÿ 6rÌSdv®t¦*Š‚ÀvùBQ-ªo@²Î(\¦{ LNûv‰@r„Kɦ2Ó¶t •x7 ÙØïY9PíÓ'[ªKOhME@=ê…2,?ÓÇØ_Û¨\gé¥4«Ž«WG Î7æÒcI•(g°%óµÁþïdä?ùînÌR¡ã9þ%«ªb;×ñ쨜ëý4cÌÓoªgìÀGظ9±„‡MÏLÆÈ›Gj Ñv¿ræD]e3w¢?ÿYÙÍV¿ü¯õávw–ÿXšs¬¤’]e^&(?yýÎrO%öþ›»ƒ},zÍ2PѶ8TöÞì·V®òIâî$(Õd çÁ‡?ï9ºÑŽIrº¼Ùÿ,/ò{%zhÊ:á$3ËÕCÄ}Ò#ø2aà§­ !kß0ŽË Õ.DõiêµÜ;ÀÅÔOâúö\Úë(Á4l¤`}ò«H{xßÿQꘞÿ_BbËw™!ƒ-;æÚÚék3ÌÛ~òßi>.?.¸UjnchéHe(ð;gw:G;Á유ìôÊYRi©«hû …`ü-^ø+I¾5dû‚ö7}ã¥vͬL3¡á©Ìªn ­D«w<Õ`­js%ÃÁ¼œ+JÜBÐÕ–e³!?¢âEOÇê°j¾`CÿAVoéNâW}°²¡w%*7·-_ô¹‰K¨tÿ†›ˆ£ŒEèo´U’æRæQ?ýécÑÙ\ØôÕÙ:ŠØ _¤»ý ‹~¿gx-m[ëÓ÷w‹Äaq^rø4ŽDÈ’iІz‹®„´Ö~í’H†§q~ö¢Q-ª’Üæb¡yZš%sXå8K²ÍD–]‰ýò Õºñì­šüc¦ç¡`T?Œ}:Öáh:~Yg«äàÜê8¶šIdã.&ék œà‹»Ú7üXY«D Ê ýtLjÃ/×ÄÂñãKQåQ¢G%ë¥Í?|ò¾f”c^ˆyj]ç’äµÕg;Éà®óÁ¿wÉ*ìr|ŽiÃ7$WþÌ¥Ÿ„ gý$†•9Í4Âïöи…IÀÎLp™Lë:9['¨Ñ–ô —Jž_'¶Ï-ŠªjŽ¥rwE<Wž&Q癀ó¢PG½ÊÈÁĆ_ò³Òy‰;sã9æ4¡·>2~”†×™ZKØñP5¹‡C>=L41;ÁY¢ÆŽv,’áö@P-ó?…ÙRè Z{lˆ#¾¦:GÈü!Ö«©ð˜¶¿kš«Ù½ã>=“Ž™$µu((# údýŸ¯oÛ7´zõÚÇæzl·ôÛ*Ün¶Ç×ÎGkDR@Ýäõ­DyyYÞºDRÚxsÏ9©«ô8«ùµ½Ú|>”Arÿ)¦~¢sþï‰&êVx{}n»ðH‚°¹ò{‡¹ÊŠ;˜øüÉ!¡ÞÓ?]Á,;†¬0Ö<°\x(ÐWšMéAH!jÕŹ’Nˆ“³ †p9ï+¤¨Å6Åïb’iiÐßýFKþk»©b«¥Ò/ÿ#«²JˆæäO|ø¤¨'ãOáš‚÷ìñ˜Çø’(”çô(ª \ÊMÐòé•Kÿ7]5– G¸@òó) sæÊsÎ7ù#µó ®‘Çæ Ö;uë—¼g ¿DJ‡k8Pû1 x.ÏÛy‚„ Q˜+Ò™ÔÞï“Ñ›¥ë^Î…¤J]ÛN”)ó Kð ÿ~¯’`Ó¦«`ï©E²w©G|JˆNè’HOýý­bPë—DO#¶ZÉvø´Juš)Ò·Xâ~õ@çŠNˆ k 5ÙüJ•AäÅÿ…ÇQ¦¯~·©$ÔjKðÝ(€{ š–/úHUTpµ¨n­aHÝ!×-?QƒàAŸD›¤ð`7£Â@WõödoÄ[‚’T÷&@².ºÒË¿XxÒZðUÏÇf/h¾2](ÑõÒ\Mg‘WðaÒìÁ¬«AHWÔ|wwæOtåÁª®Gž‘É]¸²(Ú0ì+3¶ÚœOÕµN6P¢{«"ËP‹wªN`Ý&¿¡·íçê#»ìô&¾éd[-» †£æ³feT9~Ó §²‘©OÝñžùñû<éU!MzŒ-û8*öÇp^RÉæ°DDéÔÙ¾4ΩÝ-&&ì Kl#N11ì}b´ ¡qé¾—ÃÝÊBWÙy ܺž–6£”¯í€ ð‹YtŠ‚Kí¶úÖa.jŠ=1ä×ZFžÓõx¯‘ªd[TJ‡†÷²(Õ!‡ò"´q(×Áü2ãÛi‰Ð…¶MqŠkvŒ[áä ÕÖÁLÙ V`‹\O´líŸO-Æ%]þˆœí àÈJf}°@?L+Þ„Ç9Ê1`ºß>ÜÅRœÏmÒ+üf—´äŸà+ì@ò…Мr9_qÕ^ dj\ÄTñ;µƒ`C»v}–;±NWç¬2WŸ|ö%Йö«g‹dA¥R" æk|¾¿ØÓ™ÆwþYºôV]Ø|ÔŸÔi:˜ü~¤E[ý¡­ÈžTFyð aoèð¯ôêÆÖ¥ðÁYSÓubê1#A/hÓ4Ç|PGøµ÷«>c¤÷ÕnÕÛôAYüOвÑ~ůáSõ!nó‚D,r„QåèrÄ4¦ÉÌšž<*„I´øÃn…kR#9Ò?Á”ŒèH,`„ê<˜¥—aNtƒÈ0˜"/’‰þæߺÀÇï!Þ‚Æ!ÑcØB~jÅiêÏ”_ÞËÏÍÔf.9‚ók•÷µÙe³ôükoFÞ¶p`“Øqê_¿žE±ÐJ€èR•*L[`‹&“Þšm¤Wö?|þù¾Ð/?üŽ?‹³¢Ä™H­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ7)Ö úÜop¾²\‰-Îó¢ÅQŽ‘®ôñâ 7Bز2ªÛ-!Y`}& ‚¡t‹¼= Fùö †#?žœì‘s ³ÿT AòŸ¢2öÚ?Ô¢&xÞý m¬?PáÝ„#$/ˆ›ÞbW †K-ÝzŠùc±†ìa‹bÈü‘vb–D@f³9¿‹0ßË{4ƒi(ò¡‹ÖÈL“‰Þƒ,¾•ßì d²¹k©ÿqÞ ¨Gê"ÙþÃfØ!>…Á/ÀÏp <·œ$rN&­Qð>ýë,  2J_ˆ¥–Åw ±Â‡ÍXöRIxm¼äÍÌê÷Õh¯(C[&¼·*ËDfCõ J=~s­[ãÿ;UÄ$ÆkŪëQYq3”ÚßÇüÝ«@] ¨t¯¶×°²‹½@òq> Ò,ýèMÍèçPˆu+ò…6Äï/ï^šï·ô¤|–L¬] A9g˰Mùï5,ª†é><ß½ÿc!ÿ>ØaAcÅ)ÿ<ÿv• ù8¹¢Hê×yÚDQ"ø))à º2'Ãg$«ª‚õA“š2¬Ð‚ô¿œŽî<š£šmÑžÍý‰ï’ ‰2Yà5Tn¥ öÆPsçb5`JDÜ!õBÒ4ãâr «‰…6(²R(Í-“˜GЕá•y~ê´åþ[Ԥʑ*–6ˆŸ9HtYLyÖüïØU³*(,ù­Z,ÐÒM̃•- ô·ÉÅ8Ö%CCOç¨Ò”"Q¶v7›S,²»écs =ÿ ”“‹ú‹i-7€;œøæè Õ¤µ8ÝDïrå²¢ÔÒ67oðX5ˆvŽ;+Ççrt’><Úßedåsåÿj¤Bø‹'h­;kš^<Šº¶Úõ4V`ÅšºV°åµ‹Ï9TÍzojž“YÉv«öÂni*ëP=Œ¢Ï[tˆYA|—ÿE<ô[õ4à&ÆÎòŒàÞðö;˜‡mê!ÀµkPpA`®Ï*ƒ\ÍWp9] eÎÏ¡g«í¶RØ@B«7â!‰f‚­—0дȇæi¿!Ëî »qÝÞ ɼ¡:‰×šò³ÛÍBæóÞ ¾À:¬‚óHÜ$ºãÃ'ÊNniˆ?1;Ò›ß\»Ì€Ä“°âgyŒ_ž¬yk³s(P8Zó‡6ÈQAH}çð5íÄÞŽúƒ‚4ÿ~Ôi”ÖÃеuöçÚR­•Œ"¨¾@EaÅp» ](¬¦‚‘!(uçö,˜‰EÀ£F|ÄZ,_fçK´3Š^U˜iÄÆnf²òRñ‘,4Å蟻‹×Š`°NŸTÞTT­ó"µ ‰d!XâL;¦Nñ@gA_N¤^Pß»)Ÿ]DÎ:0ãmø»oª1»vx,t"å•îÛ7°6î^üÜÊ {Ìy=MKð›ä²£è­¨1:‚µ„×J8ÒÚN}5æBK- ?¡>£SBß3‰4Ñ‹]17Š@.åo=h)sŒ!Ÿ;2GÂD6•4ä;î‘2ë€ùøßµŒÐã$™É®fŽÙ½îuæ/’ÿtÜuDR6[™y8˜×pI$ê åߥt.^V™"“V±ZvµÑK&àý]Jþ¤¯ÕØ?ê.ÀüþŽ¿;ÏÏéêùa}]oßR?ííú‹ÀòJu:ŸØÖç Ö'‰_[%_{#–ÌÁ‹ñgj¨Ù™Î‘'Òn7Â?GAÚA‹, ÇðQ/6ÙîÒ01iq£Ï}À]ˆ)7jWâ&Žãþ˜¡BøÂ4B½!âFåB¦ë#!¶lj….TYÞÄQ(!‡±Ò›MÑeö«0/Þ‰vEt…¯-ùä}†K5ßþíòH/ù§´ˆÉ*¿(˜~rlưQis+vBÉe.ÉÏë¿Æ<í”æì”WÛš£&a•ˆƒyD-ÙšFxK H +\!f¬éhš˜–ßpþ=mžZR©ý^H`’¦|‰ôÏCWÃDa/:‚º&—ØËwž«Ã cù¦AüKبo²Œ µ®£ÍÞñVD€E2šBNC̽Ÿâ&kÓF£ñÀÖ=1?ÊèôiÏÕÔ‚åø§“]ž}çtfªëZoÒŸ \éH åÄ0Ìø=Èó‹Ì>Ø×@ðçóVu°9ÚH’šRScÔ¾æ<ñ\84œÄo.v!ÔåfÇx÷QZ—1Ž]õ¶aÔù=l[i+¬ÆëÝá+[Ò°ò2óK ·ÄF\vŸcÀMtÕ• ~ÃU^û<~ÖÜ>v„ô.©P¿(t¸2øñ±°¦šÅÔsœjzêAEjòµ»Î^·Ò8žóRé³?±…Z:z˜³¢øxÈËBhVß[ñ;oðVÏ¿D—Õþ™*vDOçªZoOGÊ= ïïêÛÖM5hÑè~ÅžúÁ¨#C부ኒÊÇs×ü×)ùôiÂ͘¥þ!øŽ‹éìÝ+Ë(Ä‚@3$/Í(Þ_GÜî)Â\@Bƒê\¤œØß~U^Nt»V˜I¸«^ —¨µââ¨x^ØãR“Ú!EÐOæÍ¹lþ›©¾àê5ÊŽeHS”0š`DÌOÈ)œ÷8†DC¤÷l‘ÔcƒÞAàj…‡”% ™´nX–YÍc9Á=}ëf«Xh³ ­ÏÐåE´½,ªÞk'¢ oHÁ4&]×âËyåÑ4ZþSô)6zÃGlR¬bñ±Úæ„b§{’E5÷´9U„ûqˆá/Â×"ýN¼kñ&žÍàà¬áV!ƒÁJŸDHˆlq¥PÓú¡Î‚SûÖAðÕ«sbÖ1"`Õs_¦\Cc¨cªj?ü³¬§á”“¼]¬ÿEí²SÞœƒU’U†›å—=@hæÙ 6é8Öí")]T³ŒŸJn³—å¾p}þZš^Ǩ<.»Üá*-½F¸ˆØsâIUYÁ´ÎvÐ'Œ«–Ÿ†üGÖñqaŠlóÌ+<¹©•…E. ùqbÚô}Žš¢bl£V×Ú«XsÁ®ty¤>Rsh£ýzh€Y÷£¤àS–qÚÍ%@ Pë¢oÐd+IÄäc.ö=>N,¸ï^۳ͦRTš˜tòÓQæfêáôë·ME¡¤!hñ¤½^ž×Š Í6( Ò>è"©žl2ÄÂ]ird†A‚äÃÍqœ3¬"{7öžC4š6RžÖ22-yI&¼Y”“"¦<0\NM¡‘¶Á;@ûð${xÉwÈ„åV<ê30Gó‰48fÒ´›t6GÜ|x¨³é,ô¤ l^îÝUL·ý4 wñ.»^Õ¼wK·x$‡ž˜‘ö’ðäØ*³q k*œX¼6«uøŠTùœÌJjåuµ«i†h+…pÃYøº ˆ¸ˆ«¿ä7¬µ¡Š‡Q‚Mоy¾ü2¼“+sIõ,óÚ:µòi- úG½uôš¨°'¬ÿWLãéš™ÀÌ&q{Rya!v ûg˜êê¯Àbë+f)Ì Öš¶4Z3qSÖ“äÕFÏ'è ª¦Kõ,æt@sÂÀáð•÷&ô(?h×F[ƒ/ôœµ¯ÁrФ‚‘bkñMеeé÷±;æê8ÂhÈça7ú•üo)!*‹Ù¥íîèï•V³¢ ýTõ½7 ÌR]—~¨ š†ã±«³Àx“% …@ètrFrÚ4›‚Ñ„ÌHÖ¢Ë ³akKRU±AU²@Md{ž&’QCvaÖ‚侄sH.ü1`Óïµ6¾TýáÍéF¼»OÔ뢸à¥mTvÊÜ…}#1ˆÿ1RI²Eñ=”ñ¢Ž§Í#—OŒI,­ÁCîö¯kÕŽ#«ß‚èÄÏ[IJ%jføgn½ü:‘Û³ !JŸI—ÚXî(˜ ;—™M’6aÄ `Óô´”P” ¦ì ² ”%‰eJ'ºÇÞ½ß1|DËÇWՎ٤ĵ‹ß‚7D[Q0ŸãÇê_ÑÔ·J™·¾”m9E~{‰_“µ±; Â߬uü6W–ëy¿Ñd—zì -3?K†9Ï’øGr‚(”èyºÖû×ìuöÉþQ:qî/Ê$;«iª= ˈÝäO8KOàÛ"…-*.‰‰~ˆ=\—Ž?]¬Å p ÕÄJ‹žYŽ}Þ±ç·ݲÔËm·áøã/‹6ÄÇÕO¯…!^Ô÷|æ` Å_öJd.Zb×/½9ÉvK‘Øñf1Èfüœ:€ñ› >ˆF¶ ¯Ý£ý'¿}ôžp¡_e˜[qdk?²¾ÎôT5am´™íÐ%SÞKiNšäƒh= ¦Y‰±¹´ 42GV³;>iØxHýA™´ðT0~ ¤íÛÓIÇN¯Qøˆ>€ëáa·hfÒöêÉ–RGùæKšÕÝŒC=hIÅ^Óˆ~ÞM›S;³èp2ÂqÚ…†°ßóÞ±úº5ÜÔýºŽÉþý2Š Í±¥!2‹ÞgÇÁ:ˆ™²ÕÜdÄÞªbÐÁ 9—Ìñ1=ø'?ÿc¶'P¿”å~ò•Á·a†#é²O*ÕÊ2 í+>™íþùp鉇´¿#ËŽÍÑ;`cz[!~XWvjº­4PI½?á«¿ÛC'ç.?UB QpÁê}4(ŽÆ>b tÔÿ0îUØ ü K2ã'~:´ÓÏ­v ¸ÐÏ@gœPãF|$5ÕFÚb„ ¤á¡¹cšVÙdã{7—ÀmUɉ¶•qùš5éï²IÑ+£ì¤ª #é´LÔ’¶SE¨?<æN5Pý¨!,äRÍ×Df÷TØÇEá¼ýôÉPù¾U•,`ýõE|3û#m©Hûsb†þãÕ„W•4Rç 0íî$ñ†? ¯4¶P|ø*uµµuf PE9ÚzJYÜÐ3àêчæ‡Â|¾º£3¶­ä+iÍÇ߬ÙË¢4÷‘GÜvüæúC«Òb 37ÓIHÇ¡hb·(†‡.&ä² !”ön…õüÔ‹!,ý8 JÒøYs¨¾ ÓÞŒùìò" •‹/vNáF­Ú„þѤcQÂÀZÖêÓI'oÚKÎnžè-XÛT‚SÃû'ôšÐUíèl/Þ³wÝ©¤Î¡çÙ|ÜbÑnî~ÀÓ3’RKÙ#xwô?¤ yë£B-òqn«  ø›°é9¹‘$Åñ4åU7Ž^„nñzy/ ”žR+(D3ÅUÚ€D2)Lñª7yƒQ4 e%bÞ÷  ³_‘Œõ/~DuÍðF(s%y5~TöcÄqR¤,73Kb¿@/1yöÀ ö>XËÉŠ,žå9!;øéŒ³ÂÜRl— Uùöì(c´Ãì<@–ã_<æI®EšXƒò-»ÁÜã›}¾¡¡ty*Á2Þ°è5FK°›J§˜gˉ’Àªíæ£fk•|RsF ài ^$Õ6ãÑæK+ é=^%¿)n&¹`€$ŸèV‡ùDí~á ðpg³ÊÿMÓ— º87›¹ãŽ@)‡Ó Ë/²¬ö¯ q50ðì¡æZà׋—צ¢:Æ:àßK ‚1(ÒtÕ *¾Û&ÞÄ” Ò¿†×$à¿áHNdÀ)ÃáKwAùD·4žJ>û{.Ή-GÒºdfã‹Äõ/'&âð”–\¬RÅORãÚÀÜ—òDÒƒ)SqYdðn/S¤šQÒ•ž5sÎëˆI­sŸ"*ç©«{ûç±ÐªB”"爾ÎÔ¼¸&šS—‹ òP‰ˆÆj8Yj‰®/ù¤*ôH‡ÁÎ{ÚÙç T>ªjí™SS¤‚LwŽ›†)¡áw=³?w¼ªéÏŒ>kËͪã±l1Õ®ŸÊ€õx¯©Jãuì—rt}m3,Mü?Á7|WC²r¨i xÈh9™íäh‘¿0zòUÚÉ“ç®,¡4uÈ7,Kœi¸ïÈÊ¢ÃW®}]gÙéï@-±Ñ¤ú…~)èö‚äbøÒðæØ&•[¼…uÏžÈ+e}]6‹RjŸá¬º§ÛÆDcï ¹XYÐóüÖˆMÚƒv X¾9†`å7ˆ…ûaYÜȽ¼•†çÌ->™ï“·Â?£m³»–A}$»Õ(ÇÀ—Sö'öM‹÷€8fv„ðß°•r7Î_,¼9àAxÿYbyRAp W0›M‚Ü®äyJOŠPÀ ažmÆÕ`Îr+ò%Å…±xís¼¯ð)b\æ|+¯j¢CRi”ë Tîò¡yçÁmªÄøE~š1r€$¾Ãs‚·¢òÝ?^hÖ›Ç ëš*€…|ëœÁÇã2C—13Þ*ó›OÔÂ¥ÛãA-òyP|]ŒBNÏÕ<©]¸Ö™$ä±¥øãØq® BYc:»Âð ´â“ÝÏ€±§UíÖ6,®&+ñˆ…[¹ÿ:aÊþùh}µ‘Ø(åÞ'¨Zb<¹}k ¿ÌǨvªéCå"+éÀòO9¬5ëƒÇ1l°­ êЫ´eÙâæÀk»?VKpˉfZ/8Q£ª¦®yGo3½òcì>˜l£ðI?Ïß©o•Å~Íè Á‹Ó˜JSÝâb6ýgDŽ¢á:“þÌ™·Ï¬–Õ˜‚ôãö Âñîxp/j6EùÌ•ÈmäÁBo’Q¿Çº^yËCq R‡s(sè:¦…à[Ó6éèù%ʺl%;è¶L& ã©â›¤ö!TîEUƒN)T¾i6myñ4 ƒžYîuVwß«â/´3T'ñu ¯~ÁâH øhð!¶@•;~‡DYT‰,ßþ‚£Y£?ñìQ~$Ù*•“qD#•¤?°ÞèúàF®âÛ§ýe=WþÏsÌD•ÂCOá;PÜ£·aÀDÆ(Æ/’Y2çNµm‚o+SüFEBÝäd^JK´«;´×¸kÒ/S[ëç‹Ãü¥.ºqn6&8"E´Qö>îU©”R÷–GÔã•-£F×´˜¤_æÔeÿ¢QÌOg%®³š`"›uñéia!{æ² miGb('ScæÿJ… }JÐŽlëÉL wÖ#u`p%´Ò£vbžYÖ=öŒ´N Ä@–àWúœµóÇð{ᢧÆŒhÜ3BŠX‘Qêµ+õ–2_Ê…i×>‰ó6}/ó¢F·ÝÝy‰b6ž²¤mô¶ÌiEaÎù)j3&'ÿiªxÒ\ÌÓMêfÇ “ÑØ°d‘¾í×6¾©d…g9ËqcXte„W=^ ßv—£Ñ‘$ºKº°#XÓJ³Ü€£âù2Úg§×t›¦G_ÜMk'' • G¢A3þ†šôO×·Þíó²°ÿmägÔsÕ7Áâc夥4 K»+¯.•0,ÿ!ÆÚ/ÏÜVVDÅ¿vncúåñ–™vÊöc`ÖæÊDû5H{%JndG¨#noŽ«ô|Iö°8 \*9°êTT(wÔjŠC¬<™Bå¶¿(Ðh¢\â‹d±gÍô¨r·¦”þÁ›I®ªÀb"Kè2‹hg«·€·ôîñ· \:¦Üœ¨‡â_Ù§!flá ±+BÎÝÅé~&]'cÀD+Ú à>¨’¦HÆ ýÕ¤ÂÀÅaä%ù ÒâÄÞ¨ñfÎÀm Ž+¬^„K>œ¦n> Œ§p.I ©”]F°¬¡†å Çþl\?Wþ± ÝÆ¡{rèÒ£â{þv6N/iÀ€Ò6FF'oºÎÚÿOY°–Ç6ÍðÍê1«'_2ù’ŠVøÐs ØñÅ,»Rm¿Ñ¹…Vmƒ•cÒ€æQ¤É êÞ²Í#ÛNßHsÐ-.¥P¡Þ)-ý…ÊNKe§•ÀçAÕóxA¾‘3ÀEÑ .”&çr_æÅ–îú³…l² ëfª]).ŠPCG4o× YyÐÄœ2&;¾7Àºc€£ 6+Þé†Ò&F ,K_¡ÔÓ.øÁ›óË¢rÁ›Ä ª=/é˜ý‹ÿ.A Uql:rÆñ¤æX6ܢѯ¢¯L7ë’’ç(U±€$m|¸½¹®ÿo»!ÍÐÊØáÊã>eÌÌ)¿Ë®e†À1ñmy±v\`Ö `ï¨`¾·«÷&ì’&Ýá­c5ä÷¥Ù[݉¯ëCÈç™Î®d·N<ËHæÑ³U±7BöW¥Îv¦ „n±Œ©Ï©¥Ž‡‰)¤1ö~Q›®ª4rîñøÇþú : 1€t¸axÍò¦É›Šß-8 c_pn=žB˜¶Þ­PXº¹‹Éß¼Bž*–çÀ#Kü\Nÿ8×®lÅxœ×¡bF’k„äVV8Št7T©¿sŠâßÿe°Øspèmn®'ŒX#¦ÎÈ *{ø©ߌ&?‡” ¦š3LŸ´¹ùh(¸þ“ïpö=dS¡zݨ)åËÌQ“ß@Ш.d)(s×i=ýFì˜ØÃ­,*dâïö˜¦•/«æÕ D•ýÕ¢h[®5È~ÝŘ—«²º;ZLöÁ4m´|qÝœÁåØœ1e×H¥;\ï¢Ll1¼hÚ¹š¨Qåú¡•äz5“Å8c|‡ÌœD_;ˆRR±UÓcÙ¾#J€™·Õ˜£µÕ•XÁ¯)ñ4Éém[XjF•iM°•¡¼ÚE [Á•þ#~'³¥«§ÜêFÿNpFÓ¦ž†8LÕMzÅÇ‘n]U˜Ùû„ÀÛÈÊ3÷O<Ÿ`š»Kn^¬‘%KÉ™lÔÊË„9fåýGÜläð5ç4ca¶9^F=e ú’iî\ÒЯŒ”@Í/ U7˜-À½ÿ Ø|ž2§× 5%µJ+ùk‚fLBUÕ‰TºÉõð;ÉRŸž}' :/ÐR<ëòhÞ†ëâ0l·1â¿ÿfÙÊYk¬ê8âÈ)~tZ]$8 ‘:tÏr“(H·ó–â$ϳÐýi™Ï& ޼+&ÝVÌãR,¿ù¥(p³';ù݆¾Y‘œCŒƒºß×~zJŠÿS§þx<®Ü#ùïÿDL[Ld"Àô†pÜÝнælW“¶¾R³ù—‹Å–sÒÞ4>…ôž‰ŽfóùƒûóÐÃLò ™8Ð4Xä»À[ʪԿÝz›A#!Z”ßíèõÌ‹äõÖn$ùô–ý¸p¤®7Þþ×øæ{hëÅ|€þ¦Ö ²"ÿ\Ä÷¶ttXT|¯ïú‡úìÞrGoQ S•ÿ/}žrh/òHöæ*ÿ6M¼b2R” ;?‹N÷0œÃ¼ÀÊ‚ƒ[Sw?þ߬cGz¾å®ÏYß.jc\›ˆn‰Oh醨ÌÍu×£h>šG°#ón±pUãµL0©¨}Û^çLZF^ùŸωP|.ï’öP²î¨0búC{^c`«!  ›wˆ€Ü ÑT‘tꢠ·a|RglNmÿ?BkÕC7e˜ðG«*1ÇCM·Ýt…ì”I¬jY¿ýœ-Ä=ôXè éx}Zmy[±ü¯„ÌPgù¹Æ·j[ì|]!@ú"“5"½.OG;íMÏÄÍp-5nÈ/ž|Ȱ­ŽîN"À•£É?}â–Vµê y[v;ljÊöCDf!Ø^Òkj¿Ö¡•ƒ>58m×Åœ£ØOÈ x´ø(5ájäoCþ¿8‹Ñšè!£ ½#nPšä^B¿Á;ᨮ~KnC¶«_%Y=je9ËÝNØÑ&\ucº(ó«8ÿkf_°Ì’Öò¬gnûkᨎ½(ƒÿTfp LœÈ.¶ã¬×7/6Ù–NàO‘x«>œµ\+‚°„ÂßÚ!p/ÈöÎïíÛÑlyW4ÏulLl—ãRÖÿLP­>UK`S¡›l¤”ÓS–å=F½"Ï võ4@¹ ¥« äJéùßMý§ÆÌ¸šÄHtJ¶ÈfN6º®˜¢’u ,fäÍç凿¾¡†bú _ÖmD<¨ª&˜w03ï½ÔΠHÕÓò±4‹²{ÔÆx–¾z6̺Þó×~ÝŽFF|¯+®ÜV\·í²Ükgß·ÿ=ž^#˜ËSÏ%Êa&„‚öV…é‹'Šv|¶Û:y‘Ä$œôXJI¼'Rà!ìI¹í§}ãGnÇ,TäuŽØiµ!¢1õ x“›e)­~„ó}MiÈùÔNýiÕZ (Ç Lʧ¯ô¬8ÇØç~£šA=­ñA[\.GÊÆð5‚¦X'CŒ(y=Cò„tÕŽMžûáD_Àh%¥Ð}>WýÃåŒÔ1|ª‰ªªöÉ ŠÖ™¹5 z8Èš"î%=ÞÊax½TFLu€ ·*õë¥}$Éá-j:ù}÷0 'z߆Lî8cçw®ÏW·{ìî¶z©áׯõ —´©¸áö‘ÞŸ»Ýè5N:Ò²Þ±Yöì=ÔTCóÞ¸ê ß+fÓm Ä1X#œŸ~`##gæëÓŸRÏÊ{qmiܺzíM¦l9]ß $|¥xì°ºÒœm¾ÊÝìª$|hO´„|MB8 ŠÇZŠÝ¸Ÿ‘uR²Ì)ˆ ©Š-ßõ;ÔòmRÎËkúç5'e‹Ä_lÓ—ãÕ6íywºËà&ŒŽ¼¾HM2Í¡A/ÍaumxJ£¨Bý˜‹(fß¼’ØðJ‡b˜c WÊÃð(ÍtÇÙÞ-FEÒdH^‚ÚxÝÅ*\î•_ŒÐy–_ˆ†Ì˜Ê rz?ŸŠ›Q;ü*Œ©uíþ¼ÔÆj¦Ss Èò>áFÃ1¸Ä–UW¯¯É·”æ¤Úz“ÞC:ÃØ»¸™ìãjgh4 +Ö¨Ë9¶be0!ÂMÏé$'¸é`gAI2AC{çë³l$™Ñ×ëSò‘ ì3ÖöýF”Æp‡•¶ÉÞ”N€¹]0ˆÍ¿óõšú¸ç-·%O É×>)6F†­0—Íh‹’«mu‹€¤¶&#I}f Ôæ·Ð×UŠ•¯ÃÅ€Tß1÷ûrÞ3¤ÈXz‘]„•¼>±zÝÀ8ÿN²¸°•¡‡é\¹ï‹Ñm3gU½¥* ÇnQEH¯=tëX¹éþ\÷n Íw½†jܧq¼ŒrúØŽÓ”¹.†Y4}1FŠ#“!ãÆyoI‚œx¯a—'iXïªhwBA.Bk¥¤ÂSX`D&>ä¯ (Pg-5-Õúyëj¶RßIkvn­˜ìû‡úØŽÞßÈVü,mËôLZEóuÎ]ËjzÞɬÚõgUWAØ;pýtúþ$ò8s rÒÏ Ð;ä§$#NÁgf•û1èrÓ*¶VH|1‚÷%Wu´#Š*:†xTÏ­LyˆÙ=ýyêi ËwcRÈçgHþ´39…I°»QSó |šŠG®¯ŒaòEÿ¨ 1¾m%8§¢ˆäž–Û¼».¬{ŒZï\,­Q Î4|îÔâûQï¶ë¾Ôá¥øþ Â˾Ôïá¥ØŸQöÙ3ê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ ˆ¿ 3ÈNF/ÿ`³Å t–*{[£+#±X®;%ÚUÌO®½L^ô÷ßžS´Š„1Z# N¢"y©(Ž˜CÏyLÁM¹ÈÕ)GPŸ»Ù™y”>Ih<¸Ãâ«\š`Qî;sÐÅŸ˜ZI§ëƒ œrDA—ü™uŸþH4Ýø]^¸Û´ÁK!Trð‚Ëkô,Þž/×°$¨;\v>Z윧~Y*¡Ü@6­ÐÆ÷<¬|¥©â°Oˆ ˆì/Є4ÝrKâhˆ·Z¸šG|ƒûEœ6G‰´½µV´ç9Kt*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dí–DçÙe6¬ˆaúê·ž$%Tj`ð\¢§"†¤çú< ¦Ó®œ\…¦gCÂÀñW¼‹¹q{‡þzýl·Ö çÑÚÃ*c¼ n ݃ïF)9ƒ{Î`Êz'DÈæ¢Ïfïç?ZÎo¤<^&mõ¶k-C <›pÌ쮀@îÜ©¾iÛmP~.ñ¬ý¶V»fë·©ïxš@ÿ)öR”³ å+cŒ19^ô6X§±“²·U< 7µf÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄó}»‰ü;×ÕÓÕõ6€ÿCÓcöìOíµûíèŸø{ÃÑ{øu5ü6øvI}¾ßì¾o·`ï·´ûz`ŸU)}»mü=7?†ÚOªºÿCw‡¯g}¾çïá¨ÿaØßðôÕ¾Þµøßn¹_o`ûöô½ûhá¶¿ÃÒköìí©ÿpÝ_áë}¿o ×íéûtæûzØý¾ƒ·§°Å¸kC¦H]©Ï0q¨Ö"ë¾ö—H û®ã¶ïJèÓ­Ö}%ÈCû÷Ý‹¦Ýâ¢p;vV«öøou,ý)þ2 ÎrƒÔOŠ?½;¥ûÜ FÎC9!œr‘:Ð…¾þ~Áú£nG¯G·¼îÐÀ ‰,’”‘•¥=%ó† ‹™™½Ï‡’^Ö$4“ð>Ódìì„;-í ã:«úó+]±^–k£¢­É+;®E‡€\dÀò¬Ê¿3Éü[Ì a5™;_vtXDÈ’›'ÅûÝèjÊOHe“¯ÿYƒä3gí\¬ìÄn`!€­`7§–$źì>’ÐQýØýÇVeÙÑ'OùÕ£ý¢m©™ Js¸$€éÏÚù¾õÊQ™ ñ(—«¡ªÁ¢ü:ñ ¿FšMb¦6—AñZÄ•ù¬ˆ•†”`læôÖ`—ý¿J .å}¯ö[+Ä“ÚÔ|3»«Ü&uÊzOª-.…|?¥óÆl[u%,ÆôÖ X4N·‰ý?ûëé.d—POpâÜIÌÌ{°›'KBrÜ¿O¦é.L¿ÁN˜ŠÉ8ËL¡8÷ÃÔ7}ç„m£¶ ÏÃJtŒ±ð{0M7¤ôä0½,ª›BV˜>b_êû*¿¬ø °4³T¡XÏÐ%&|Ÿ§³­EÑ,ðT/sâ1àè½õš¢ 'kÔwº‰«Û·Ù熴•RÌõ|uÒ}H‚D!²Ò-NâfªÞjäâêh%óÿtÒ@B±ŠY5kYH™MŠ`‹ŽIÙ‘b >3køf«¦]ôÚ°°þ©9ðx\ß1SÛHO™ô$)MŒ8ü"™®ë‹å¬ì=#"à²ý –oà÷ü.‡Ÿ~âãÖY°<‰FÎæ&'T Gñ¦Ag¸êåDâg@ì‡/‹73hþ•Õ`VcìÓi6sÊ~qY‚hçKÜ‘36tf gQ¼ÁÀžæÄÚ0}¾U²Ó  bŠ!¯÷ndýLG) À•ÆÞx-$ž Cz’ÕÆØJ L¤£ƒë%¹ *MRÿ«ÃW_—ô™Ùî‹ç ´ì)ÄBb¶ç(V0iíîó3bÄ].rø]3“ú§Ñ¸Ï9ýï4#YææÓ§z4ŽQÀ`öw˜dI CP2¥,œ-¶—¬Ê"y½Ç&÷¾fÞ§vå§`£§î¡àìpQ„…È¡gƒsÑ®½ÙÙ1ýÉx ©ýˆx`c%'—žo—.h`ü2uˆ}M%Š'Æõàð–,ÚÓóaóÁ¯A’5“Omä%ˆ;a+#Íÿ&ÕöˆL;]5¾)Å»uìWÆ“cΛêÃà4peÑ/wïç{zO_bV§}ßÙN5¢‚=¹œ6”lÆ3‚ c\ôJ ÜžOÑÕsËtÂò&¿Kl e<¦:òW𝽂Mò=:(ãgZEƒÎÇòþ.aœÚ•g3/Ð †ÆàÁ£›å45ÙÏl5{ËYSmö:‡…:fëg%äœÕVØWðP×D3>ê¡ ¦ŠÜÀéŠL/Á0kÌJús›½¦lŸ+; §±¹'›?†Y¡ ‹?KG d$ù²€ä<£a#÷^òó ŽŽT«»[€  é±&ïѹ•¶“˜v1x¡¤…f·<^q¬@ z g¿¾Âøw¯.·ðZ†öCX†•¿Ý§+ssZ¶"uÞÌ q¶½"¼âœ’ mÚScu-õôÑ›öÌE{*âÚˆÅÔ[MäO[µ±²©ÒmùÆ&æ:â$,Šöê8Hv tÛÍÍWågò¸X4&[Rccø¤[¥kÙ ¦f¦Ìc¾¤4©\\1ò·kUž4¥Ñvp3Ëâ|{žÌe£’b”TSÖ ›Ûr½“-n·ˆM²mTü0¨ˆ[D¥[Á¡a‹Éñ–²Ó÷ò€CZùõ2‹ÕfÆ'(t¸( 2ÝÞLr]~Êò¸fÈÆ{^@Qoƒ+éÿPõ®}=MÅ'¼€¸â(ã ‘™Òô ŸØáçÆ-ÌmÅÔÿ|¦ÿ P§£Çáp•$‹Ã)>§¯ Ýimå°~*òý=‰—é˪ÕF5‡zÝ,˜&ó çÛsžl™lf>¡Sƒ·ùQ¥TŸrÎ ;é:ÚŸlbÖ\:8“(åÀ1† ›)~LÞ•[(©;oæÙÓäÊå^˜c¨½‚ì¶ õcëÛ8xy«T–©lóF ÉéÂ#ÌPÞ*ô¶j„Æý>q¢õýÁ:4ޝ‹Xþƒ†½^Æò ­/ƒ¹ ÓUy šÁ#ød w|ÿ'þ²Á™q! á³å8péäÍ'ìÉöÍ ˜nŽqûÛ4}cøIªÊ\ý0¬%–Eo€šêƒ?kÌdü©…8¨Y "È@†hT®.©Ë8…‰PP"ô$Ûq#_`ED»…jZ•®Hÿuúƒ»#uu\ÿ3ªï³ Ùíõ{PÝíîŒÆ<·^ú½Â½Üx]Ò"NH!#²­ªV¢bá'ò×w9<¿,“œÍrÚy|B1ü‘/é_ù]¥r’‘}cÿ!µ~ß…=©Ã⎠òo4«%ñ÷TeS›¥éS@”µö=ujÇöLÛ)+»:çó_8ªhö“€"-Ûà„¦ ºkƲóìó+psúa©zW PK„}Økh -öšßÀ•£F¹ÖÕwê‘¥]O2X’6?zAà¦]…£¥‡Eà«3þí.»{2¿y“:¶UÈû—½úfnIZÆÖvgHµ1÷;Ù%à2ÇlÝÏe9B•3þÖ »ìÞ? B Q?LœU£Np}ìgŽ"ÐCÀ ÝZ®¹»)úüèòÍÞœR¼&á<¼Iž{p˜‰§¼Â,¾²Ó¬ädo”õòI®ÀxÕæX—–£p0 ¬ÖŠkv%uaXÙ<²%õ#7ÔÝî¿ôCŽ/joò =O³,@?’i¢‚ú'‘œÈ—¥…—‘Ó×§‚›IúŒnݸÏÇìŒó°VØn“!çÅjÈ“ÀO+‚ᬭeî¨Hž`%ŒZ}‚Ð9•æN»•ÝáÔ²“žš¥Ú}Í&手ãÐâ}B¤÷Ý« 4ŒzËê,/|U¿OêíÞÚ_= ãA~µÆB,~ÛñSs’2^7ÛT]™¾ŽGø¢oß’¬¬ˆ‹JóÙ{‰)' °Œ¥ü€+·á/äB¡úTóÏîí›ÙÎ2„©OuÌkÜ0Eaˆ 1`ßWd-ÁÎzDp•ùL"#þ!•3ÿoxÇçJWˆgbZoœ…„³:øÕbÙ·—öcjû‰=¼âÄ Ÿ G(ËÍÆÈµ8$!È­„­ ñ¤ød¥¢B[Oˆ#KÑ!ï&bŠVøZVh sàä3jÇŸTÏ¿28‚ì §w*›]2EFp6Ou¸û™ àÒAãkOï0<éŽý§NXçNQLòz:ÊÅ…_‹„¿ïâgù-Ä6QØ“tð%ÐHs/§ßásX´þë·êb MÛlìÎA¥Ò²;½5ÐÈ1îl¢#æÉú“ˆC}á ž¶‚ö%È5Ê÷3gP)2F¯^äÕ_‰†Â“Â`WÁ,Ö8U?ÆÎM5ËÙÇÌ*Ft¥¸æá…\ö whÆ@¡o˜¸’Æ,Ei£YÅØ$ü+Áoþ¼eÜžL.˜`™ª~S®ÅO;¸Xß%ƒ|ô «HqsÔKPßqLôf¾ô¼çqbYW×ÌqÌRŽjüÀëzÝð'TyÍë/ùCôý›'|hÝHøÐ´žC‹)Åà|q³}xêÀ²)i: vZ¢‘uC—ã.’yÝ6„oç™fªÊaFòx³é]B„â/eJ]öløòMfÍ¡‰s´O›)_ÔêD©+³‚·7 ¶TO7rMé2)Ü%m*rr(¦¢0ŸӊHz‰Fûë©ÿL€<›à¾cz8ƒ6TÀ&<ä^ÁIFnh·Û^ Ô;]‚—ø6ö¶6ԫ<Èöëªü ^¥ÆÅ ŸÝB%z4‘JlvÙÌÓnn’Ì% Ý£nÉ;¨{›­HµjC¾°l¸»ïm¢/ êsz`|†òO{Ž´ÐÉ‘Äy÷ÑMÔÒ/oË"ÜœŸÏ£«<ò%Ë”CÝ{ÊÅûµ9ÛÍ ¬¯ŸõÝ$W¢Ë ‡>£‚ÔŒ_&êÚÅ ñã¾ßÿlüXÞ±myÓ0ÚðagŠ~œzBs¹aÞŽÇS§OzxߡÙî§m!/3Ü++#5c‘lÝ9®„ìL¶p@y._öcLù´8‘"²£…ÔùµÈ—?Øöt˜Åm•è!F_µž °ýBgÒvA*v#å‰8Ósi&XËR’»ÔÕôBgÁ<$˜`pÍ;ø=’WƒU8\Y)øÛ®qz?š2/ˆ$ޢ޼‚LVkƒÝ„ïPßðAôUîfê~žQ¹y!JÚG¤R*üÊ·ÿsNóùm°UBäNðÇ}¢© ÒKg9|Oöj5Å÷‘’©5O5ýnCã‡â„uÛ`Ó͘RöeRÇA3•ª*•°ù¶ê (.ZåÛ0PcF° 9àwV.QÕÉn“µHr⃜ܰ`ªÈ„`Ú.Îë‹f5LžQšäOLçͯ$7…ï9ÇýÜjûË’Å~=EF}ƒMgÕPAà?xÁû„[Çó^NÜkŒ¾$À±D±SEWeEÇ™²ÓÕh¸±ùçû³ÖŸú`©/#LœèŽù”¨[¤ë~_[©é’I¶¾q‡<2è@¡Zü"¥ÀsO¨ÆKKlKè÷ó€]ÆŸ£–B^<¶än.Ðäeú…Œ ¹MHÈSצËÄÒ@~ÙÝâoMdhf¯FW@Š¢Ör¼.¢Wˆ=зƒÛ!2G‡n¨ÀS‚’Š}T’Àû»h3oŒ¿(£&‰!´%;n梳Ƶ’¹Å‰·wRÉvþó§ì%Ín1ÆøýÈžêþŠ?ËÌ‹ÖhìþHÅÆZͬfÉ´ÃÂÉØE p>}ö—ÉpÛÞ23ñu[ 4”‘è\‘-C! ´Cÿ\Ó0&­0²r&ô§å’q%‘ƒ#º±.ki¿‚"«ušô¦ùAìx‰5 :ÌCö†Ã‰Cm8^$4’×*=“²¼‹pA¥œZ-“„TÞÞºb;˜{½hßu$äy@®ð¡Ð¾« G½àö.AW€Ìÿ_†roý4¢jÆ–Ž6%‹ãž§Æ]F®]p¢»îtDco=½XlSÈä}  ÓoÎ䬩£¸ã’Å~î•éYL-L‹`ª÷ÏŽv—<(V¡ž1ö§øø¦D`v~&Á·JŸQ2À‰1¢Kc݃tÉ9XNm™¯îX±€†20±ÍLI–¤Oå‘þ”“ù˜cçjn¸òd/:Z½BÆôûŠ"àV’Ò¿ïZ#ãŠx¶»—ëæÏH‰}Vô>ìÜL%1¶ù+áxxà*SÑÞµI++œˆ¦|FÀ&™#l{Cß~v—*`è&’ ƒW¡t{"UG”ÇAôQš“Óø6,a) E»]ºÂQÅUgžâ5m­.ûþÑàÿ„5ÒÕúùaÙ*{@” slœw×V ˆÒv¤åNêüê$¯9ü±FXôÕ»U‘ßjš·wÆä,Øáq¡ž¼Pz.?ÁYÓëÚoCÿYÍÊÞ*s`%Ý`ÊT…P+`fUg0¢„õ’T®R6zcІAW×Z²e›Å_üô’ŽUø4wB›+/‚#P¨‡[n]õ>æÙ(Z²w9"!žþô}Ú£§\ɧ^ƒB¬ü“~N°K~G-_ºs‹f²ä+ÊΫîß0¹Ë6T—‚OeA=ðJeöû¹‘ç¨x‰ÙÔVW8‡Íèi;e+¬ð ˜Jë™Yϯy‰TÑai7Ò¹8I7‹}ÜÔµC¸/¾znµöŸä+ŸÄá–ý="MpQÿ ªa8ùÛÆßŽM'³F’B~«t PøCÞ’ NÛi½”—Ê{ØP§^JÀ#¸Ç°,µQÆâ=Ý[Íä’ûŒl p„¥óoMÜñFc0x¤c[™ † M;[EÄœTÑì‚݆FÞˆ€ÒÕØäAâOq°qÁÓ“µCY ‹Ñûi¬L†$Ìxt®L„'tnú[†s‚5›&¾»VÓ´š7¨…c…Áv:Þ•ö õÒû`Á‡zÆ×Î7GEÏØ¿‹ƒÉ_†_«ÞA5þà]ä+Íû´æå8ÎqÇ÷}W¶{ï^sQãÓú©ò[…z·GΚór y´»É;«¾òðQ¯Gó5$ˆb›gç¹?÷o@ß—l”a©I%C€Œ³¢£Š4d~ïÛ Ä…Ÿ¨/Ó×òÿ 9¯@Ý'¨•á÷Ã÷`ÓIƒƒ Ýz ”2"öWyn¬ ˜Ë£g€Ü¯E0¥0Á²½\23?{7ë¨bWZ"¤ìÑ5àº`BÛoX3Ã`ðÙèa镎Õ!œ€uEfkî.Q­”±=¼Ähs[Ô˜µFz$(IÆ îìm ]„mѳڨ)Û0={T¶Ä|&c壵),owι؄±ïõþ-^Äź͂óEYG½tù%Æx5’ù3¨Á¼§ÒGÇÀìxô=e?¹ú2èL4*Ëíô{œ:X5½¬]ÒËŽØCêÚæfÿo<ó´íÄÆôIœ, >–Þ*õbÁ¿ølÇk·”õäúdÊÝY0±½iމšËý4(½"_¶ûÎêõo¡ÌF7øBnR¾³r.×Ö¦læ~/HÉ Ò¡ïàƒøéMúpvóvfç^[‰U—×õ”"dð¿uÒ¾$õ9ñPìzà/ŠäaS-&ÖÂn@TU¢&kü,ÈsƒÓycáò-´ k⇊?#}uø×ÉŒt<¾Ú…+K>ÙµWaôž{nH˜Ã¢As$¶êœÚ÷BŸÈOÉ>›“' ³ñ%ÒŽïô·'´Hö_RxÄÊìƒlo1ÖîŸSÉu‰b)XþÁÆbüð‚ð´dsžZž,{ù-‰Ýj vr)\Œ0þ4Š›b)Cé(Åz¸Ä  c›˜zbíÚI lKåJ鼕COÉö… ºšÿ<"œ]ÜfÀâáú[÷U4‡½r5G mb8IÛFQº$À«ëóœl%Z£é߬t-?CÆø1ÑŠG0æâzÌÉwâÚOK4‹êÓ<:Öµh1õ¢55ý']DÆ%»Ò…ܽ-ÊÏ\'jÝnQ÷'ÖÀý[ ´œ¡!MØÙNY×ÓX^B)ehÑæñ9“ž©Îô ©%ä^YfAAfª¹qÄy*¨Ô ¯¬zFrwÍüÉ#JÛ®kÃôø³¯™È9»Ó¨ƒ‡D;­@'4½š¬{°±°z™á™'Ô0Ôb7½Š<4 o3Ó²æ'TIÒö¤ÖØlÏ2ªþñ¸-y‘Œç œ‘ÆÞ6Üìì,{³Ï;L ¹“m!TFôVÇÙ‰¬s~éPîã(Ë›¨åç-4xpÛHåK­owDpmºŸu,Æ•°£;Ò‰·&¢7zæ‹û‘ö؉ Z"§>o¦šÈÚmrÇüy4›»ñåܵžÌ–épÁòÓo™·É­«ö˾V’Þ íÊá-}EoYÚ;ÍÉE夑e@7Hi_.Õ0­¡0 p`¬p#bwj+t¸„;æÑX˜au-K…Åõþà埢%v¿À¬¹Ù‡ QwGºùíâyÌw˜®UÌÅ[©ík;8AE?Ьß Ò–µÖ’;_õÑщŽK.½ÁJ; H¿%‹ÝŠwéâcG¾a·¥“Êï“èe¼Ä–€*Ž®$IŠt§½Bþk˦ºç>-d€”T:§·ó>Þ\ã"Ùîœêðœ‹\¾‡7 ³ÇåÙ’ßÁºñ Y}NT˜j)ÿ?¾9ØF#«õÍå~I´ÝYóÁIñ‰8û˜KÜÌò¾'õ¥…¶À¨]ÐÞ×¾¼:{YªÀ¿qÑH– ¢¸¿Ô$d7I$2²ÌM?Ñ¿1™Fµ3;÷Kh·YââY’‡_‰0»I uË@Έ€Ù„šµ)Ô¹ötg9kÉ9²Ã±þ^ô¬˜Zw·n,B‹Á\¹ÝôÑÃEÆw\¤áÆ¥÷ÅuáhõË*ݰÊd]ݬ²œ +©Îäù€èÕíÈô$-a¢nðœ7ä7&Y7mï—î5D+»Ñ›àÿN['ب,èXкýˆð%ê­Èõ­™+}þm¸iTWñøÀ ?‚ä}ð»î¥CGìÀNWx¬ÔTÿm8NîÎ\Ü5Fí±Ì®Å[7¦ZÌi×7Ÿ»s8oÀ êûÀÓ‡™õ³9™šÉ8™9›{}L¯¨dŽ(çö(Ç×-'w°>dA©ØY\ˆäÛ ËfäÛÛ~Htž¢@ùyFËäݶ´´î€eŠ;(é7Z(¹‘­ÔÃ’ßÚ‡ø}õôL˜Ö&»;Ô¨0íN>I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†øTì;ˆ ¦aѺ£0(i{^w€ý°²¾U’Íô†„"‚]ko7ÆØ˜Q³ ËóÙÝ{Ï×xŒÒÓôdy*\Y6£òM9ÿ6Ä óc­Ë:E^=z:ºã¸t]+FÔ¿‘ªØ´ VÖXÆn-=.` Èi]}ò@¾lËΉ_H //ÅqY$×vÈ÷´Ç.ÿ7s*9÷¥IØææ‰%ÙH°Â˜èÊaý”øž¢Úð•þ±{íuQcŒE:—¶ 1*²w;t¡'Ûq—‚e³’§FЙ?h}}àu}¨Q§%xJÂ]v¬ÑA4ïK±âuC5åÿ{t/öF½N9î Ñ–²Jç°ªÞÅÙ7»¨• SPý @Õ ÿ›@²eS"ÈE}ËUã¸k¶°‰jÐCOF¾Ødnˆv³b{ãðËìz“q>Rp¶—ü[1Á?¢#A‚?^×ó!‘Æàâžlð(0}8‚Bø‚ëãP±ÑYÄ9Pó(1ÍñÐó·éK ³´[¯žŒiï#ô$}íÞ‡)¡Z‰±F%ÞêµbŒà™ÍyñSçEeäÕ*óÿTq£‡Zë$š g$â‹à"d6ž»Ejóq8I–ÙYmÂÜn°êÛJ´ÏÕ¬ˆ÷]ΤDªõê éÙ¶üR¶]³H¡½ÈÖƒ ý¢é0hþÆ-Ê&oŸ¶ÒñT…Ámš{ëUær^=ó\„Ä¢wC·Ô—D8hÕÂY´lmzª³ÛhèmÊDwŠ“fCÅ߯“/<Óã^†£ìûÖí€dgù$`ñ`µÛô¡)E·ýD;¢G›ˆ«‹Žì"C$êþ´ŒXðY÷®ž{”O@¼svë(q;¿a˶qý9)«0ÖŠ¬9Ü!´øÛaž`£²c:•ÑD}¢7$©¼<)–­Ï~ÈËNEp4Ï®T`¾p¿““³S*#KqoÒ&0LSWÖ;‡\Êãù§§| xÙ3y^ØX$wsèß|! Ï' y¿J¬mz±oð]ˆ Ûü·!ø·Â;6à4³T=Õ|¬9Åà‚#–EIØÕŽÔR õ®Ÿu,Å­"Áä}•åµJ´tŠL«ÕîU6úǸVÂî{~­ÀæR?f“½ÎýºþËôËǦ²ùF÷SlATìLœZܹ#Ÿtm²Aà+\fˆHZ ^{MžM}$b6SÁ×­¢A™ò¼–ÏÙ|‘š¡.Õ\'ËûU«3Ia`œæ{i"z= æ>x3‘ƒ]›ÆWÍ”ñµü+3—iÙÏl TìZ”J‹1uÃo+º\ »›û¶Ö:¼Yíuì÷,mL½{¬a«xSunT/× O~³ÉløFfã ¶¿ÿe,A¦Á{¬›Ñ5“#ðŸ4Ý4” –T…“ù©I‘œKí¹ëÑB Û±.åæÉ!娂Wv„Âj¼CÞÂ'šsÝ=qXXÞí–œ˜¬Û›£Bþoñ?åç`Jñɧæ`Ø_®Ÿ3¸°–'KúD}6ì6ùÀe ˜mˆxÄ,å¯ GJ¥xßÿƒšæCpñ‰0Ü»êÈŸ×Jì{Ý6â°«`ÊËU2Ls„æw®ÿ €úsâíã1K–¥cST'aÚ§Œ ù‹;`•~ÓÚµHNè©Pzï¥ù*4øøÕ¼ïÛŽëJ÷W2ZIͧÔÉÍÌÒDWx'q¥ï ïl¾‚y×µKmB:BuÑ]G6¦î=ÀÌPXós¥ !˜Wè9O?[çÊÍ—º×­*2Oåü×U›äÁæTËû?0CÚž3ê{¡jf³CU^ˆŒGRǧX/”_­Ìù׌EçÉ™¦d ¨TdWs±T¤§Ó9ØfXÐàÅ#ÁDŠ{kî­¦ÕOl ©´Â4#bw˜–²JnÐt­­|yÔÝ|é‹z}T!‰¡.§éÔ€ äô ·Õçöã~ýrUV9xãºx_mU©¹(æý¨ŠïƒÇÔ†Ø4Ð#’Qy„tEJQw% åm Ø‚Boñ[ah¨%ä‡O=.ÉNâóÉ}DÌÚ#ëÉ[á)`-ÉÈ9r^ÎÙ‘ ;$ä¸f¬Û¹[ÍeF‚:¶D9ÀqÄÿéèR¶YP…„>56Ù»Býcø²cœóÆôn§±~»`'b>Ê‹yE¦¯Ášˆ‚z~½ƒá-c™XÐ…µB3Ó/ð̦ '‚°á²IL¤¿êa´!ÊxJ…äY–rò?+Ô˜k ¿Í ÈÏëÏÜ¿ç ­‰½„\ÿbÓÍ÷X—ízÓÑWÃô`d3–4¿¬lS7­t,‘¦4Wž/þX«¶%HùqõÌþWÁ¯Xß9ÇìïfÝaPE[]UnûA²äIúKM¤„>DHš‰+Ö¼2wÇÂm3­ï®Š„òØÏmU !5(i /ÒN{¹ªë3±´ó\ ¯ ë‘‰ÊŸžEáC¥8å5®ç%«ÄŽùRóIòïñ ¹“É(5?ª%l¸¥ŠYK¼+Ó‚xÀˆx®.6ZᧈEðûV舻•îå˜ãß7·ëÔ°º.Œá^í`hçÉ Ø«…{qNtœ»cr‰ÁŸNP÷$¤êï JZ)ã`9§ií„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*Aé5¤Ÿ@©êãÊXìxäxò]À,ÄäLlM:¯¼ñf òØ–\õÌ´€RJu_¥(„m¨xêdv£Ì7£Å@9ˆ6Ì«°Ö8Á[ª´ CM@ZÞÞ¤þ‰>@ŠÚ {TÌaXzA[KǬ.â‡sèžmÕ/QqS8ð>žJ¬Z\Ìmh¨º¾ë ´›½Ÿ,rCyx¸¤àøJ2’IÄ#k¡›GkHc€û®ø8¯¼·s T9]–°*¿:tíÖ˜1•¬žÈÑÓ—¯åyöµ(Ä2@W˜â.8Ê™ÁqI¶šÞWn=ô¸˜¿=zˆ&{Ñ>,ίdõA“yK8¬•d¡hî£ùí„e/ë&F”d€­{qûÙí–3'WkÄ`†¾QE{¯‹í£Ù0q¸Î©\^ðÈòçõ¬A—âò…ÀuIÆ»òý_ÑGÁ®™?5êÖk³¦èOnzªYi-BÐ-Àä°úo¢@q½ä~LE4°!}îËÕ Ñy#˜ðF„ÍÌ8ªÛÆ €ù áAnÕê c½„,d»·O(pC/w¥wmei4žì+UI„޶tø_ÖA‡ûâ3Z„iªý—B$mGBÿ~ü(ù…#([Íý…ºraò¸nšŸ5o%æ ø&~rKV\l‘Ž‹­ó °€31B0&#ÐÙÓ¡ò…F»Ò"]EŠc×nÄJ\$ç"š[l'¸2 \"zå*Óg|Ø|ΚĦ¾¹TѲ¾ýˆÄبáMÇj»×Ŧ›T²Ï¼å"½š9ÔÚ_RÍAÿD^ šú™ƒFLÍ(@)>õe‚õ8y 6‘Uúð˜¯JžWuž—µGí$"2ÿ<©â&ÃÒ•7Ä€¥\7|·ž%N¶Ÿð1&‚à ä¸z·û‰\wI+¬fYf—Òc_8‡ÿ0Ôe¡"u6±Æjæ6¹†LÙDß„Ânt¡N¼}‹8CVW’…ïÅ K´g§¨Jk’è»>?àÇ—þf"ìÕáüÁJhö!‰ÂJ[n&«’㪧¸ríZQá°‘ñð7ðWí ƒ¹Ô2Ìö.ñðÊ£p_ÏsV-9¤›U̧ômµ ®Ö©Û*ìF$ .y… n:0ËçùÒ¥Áøµ'ßö-U]³Ie¹2Ð)Ì)çè¿aФzN‡¿å×ôË }ªð"'š©ˆÐC5‰0•ÉcLf=1÷+T7Î30dëÅhL4óùbf<« @ÝØ—žä炉 À¹Ò­Ø>&‘| )©§˜JÈn¸_lÀÕ¾åàGC=ñTû@¢cvY—JÊûÔÜîýŠüyÑ€‹'Gñð?”ÌFhw²ÃÇÁ4ܨì]ÙlÀˆãACÏ%'©ªzPáM‰]tK²w1HdU!ÅV^lJ/OÒï oLøSà}òKÿu€ë¿ b"òÄ 3#|ÅJ¤r¨ Áϸ[i:Š|ófÿe¯ÜŒŠØ¢çÆúMßYÐ[¹Rª‡ON6~å«•(†²è{Qç/)ØÏ²Ý3ût˜h-¶$ÃÎØ(=½C™ÐïšÖÓÞ-} Ë€©y9ˆøàµ@j”¢k\.ŠjþÿHØÔãÒ‡Ô\¶X™.; žy“†Y x‚ðƒ*’âYb€$úц¢ÔŽv KOPË¡Á¢}—ÜY€k,ÌÜI¨¡Åï(‹VŠ8³ºT´¼‡RfÔÖ‘1 ».Á,´šLœµªi>zŸÅÈÏcqîzÛ­Ö\\ò—Únzý¤gîÒ°˜ Ì¢—lö0WEÝ¢7\ ŽuþÉñËN¸q =È?q›8°€waßMR>¡‘¼¿k+N¸0¿%ú…$p0TB– ó;v°éUp%lU|sÕ±mÆ”;j襕…Üë3¸™å9~l>„Ô„2qþZ¯®ùÌÎÀs“ÆWžzþñ,UPÕ ]RÑðaè1?IÞ˜mqhúÁº_ûCRÞ º¹&àCû,õXÖå@„Ç+5ÑÛ\3º$ĵíj ËabÂvoÈEÊØÿM|÷î¶%Ú­þr+qÍmþoN<nËU`Ù ÿ1Î-š‘R6j‘ÄìXCcÕìXZC|Þ¸E؇›ž·°ºJ^%=ƒÜ. w÷&XÈeÓsg£¨U ×,ùÏJܤQÆ¢9FŠÑ†:þ¼yɾ€LÕûPý=$ƒÿ€yú£Ñ çcüUÀ@¨š\.,öš+iéY÷ o FÈùÂùéNg»Q4TßÕû:ãÐ9ÂAÞ»{•_¶ØT”“}Ov¶ÆÏ·¨÷¾t k¬öͦIª­ÂFG0% $QÅâ0p¤LúØz]a¿ÓyJ }iõ¿5 '2‚9†G”£D™4¿è›Ø[Vù6Døñ­ì&˜ÕÛ-W/á ·c¢»×Õ¬ü£ù{Çþºƒ}àÞƒs\çÀD7ò¿u y\¥t=Òß]І¾r{žC½1f .:ô)˜a,áôžKïð-¤IމÆç‘q*ÐÔˆ,«‹Ë¶ü¦~ÓÕ÷Í’_à"DÏÓ‹/…$6'm‡ÿiÿ8Æ–lÄ*òÔ¯ñ¦K÷ˆ«í“—²ïã¤=ˆ/¶)€>"ðâOi¡,Îí–ªÍß,n†Ii¨þmEƒR¹m1¿v`|ÙÉÞIùÕŠ2!³vö͇hüñYAm©šµKΡ?9«Ü<¬W Ä;¬KÜ«PWNÐòKdKým´3¢ê†Ô6—ó…¼ÓgS[ºÃ9šŽ®KÁQ#á'ÁH­<×@ðz{]Ž]P¦¸U0´xцºœm ƒ‰$d»ùûõ)лn›ZrzÈJ¿^]qòq)A‚»Ô`Û:›iݘ.uû;]‚…*ĺ¶åxhÈÌ7ðÉb­ÂŒRšpç‘qo~³Ç&d0>`Í?ê»~Ø™ÝdJbm«Ô|uÏó{H^ÓÛ®zÓ¬ø¦ÜRl=2Ô lS™¯é ®¡៮‡£é Ž\1¾(Qž \1ò“4ƒ{Tþ¶âß¹‚¸—Eñኂ &ä¤ÎÊ>ôxŽBHºIÌ—Áž”ã*«,è°=0yá±+­#J=‘œÀ[KI§DÿvÞ¼ÿ@xÖ ÎJ† ô%L"pÁá&fƱ“˜Pº¸@_7ª¹NcÎøf} bÏs®ÜÓ®G9í)$>xˆ$ý†³?”­7©ç º,.ý?Š"Ù{z}<]M¼@BÛû!Ñq¯ô§d!ýB}…àd{N6ç*‘y—9¦‘ Û&.ä{ÑéÖ&·B>á'H±s‰Àd{Oq˜å@LJÍêd°' ixû$ÿƒë=ÿЫëË Ž‚ÞvÉs…Œ¡¶»:íäÚ«Ó­5$AíµÇI^¾ï§‘ ؆ÐrҠУªÚYï4÷µØþ‰Z }~vv¡w̤$ˆ›%ð}ébˆ™¾¶®bbŒ1¸ýïÌÆŒ[!?ÿ|$êà÷>UíLÛ/*¶#>(-bÊ:¸Ð'¬³ž€„ÿ,½C0µ±²Ì2„-~Ðþ]Ì|Nw™ iÃM@à[ÃŒòÇ$;”‹”s!ã $œ›Íí¤‹À"‡g••½üµÎ‡>]Ë@A;T_vº§BmíËv‰å¦í`ØÜTq¨Žg¡d:êp2¡½Cƒ¼dD¼öc,襲/ÖˆˆÚ¡4ûã¯@f“Â+çÚŒé[wzɰߔ {ê9X_˜¿Ãé@-:øªà›âÔ]k9޾o2¸¦Áöëwô¤SeùU:‰gmú…‚A¡Özƒ æXÆðV&ŽÍ{ RP`a'0àÂCÉ ÁšËF3º—&ôD4Ô»¬ÉÌ%oÒ®ê|çC±ÃŒQ-NÿYøJ”EIÕĽÓBËâ僊GÄ5¥B…2•Dìö7é)[Õ 9éœZØ(ò;'ã ÁzÄä lÐ@µçe3;IƒF(G÷Ƨ@ÂfŠº|5À}!D0ò…"‚ŒŒ,CÒíÕŒf}Y>KBÖÎW:ö.¡üÀc¶f[ˆ,¡·Wm| \ÕXFd€ +0'Gk,œ¬Þ}½ªü³‘ëíÙø¢DÊp©«žUgqòVoèŽî\D…œQŸŽë…wK;½(á€:’¥ã róªÆ¸˜’•”äQ¤ 9{çpä6º?f~ gº''í;77ì`᎛ö‘˜—#™¨iÄ÷Jšå Z‹Ÿò—o«É޹sÙn­% $¾2+³ä´à¡ìñæïay¨NRôl˜¢ý Ü0q˜±vÈ´Mpý&§ –ïe(=D›•ã o½éP¤ CCRƒ÷ÕÓ„mæ±Â*.ÞbûÈëS´7_ÛÞ%"dÌe:YܵÂ{?/nùå®>š9• ÕYÞ‡ÈBß^£Ð»ÚÇ §å£ïØ‘~ Éú!öÈ9‰nVñ1ò ÆÁôðNÉÜÉ>|…±üù2*Pöiµþà±Uø•š šö?ºåH἗缤­¿åu9CÌÊP0»Îÿz'¢1ÓŒüºÇ«òÚOX~†“Úh`< ð}zSÑß?ßÉŒd›Ä2¦˜ç,ë`……ÒÁdç¬êÝ÷eö£úá"jUÇI> 36½Ò AP¡Kh«`º<¼O—l …aßEþF>0&›`âêcôT ]IÁû—˜2Qó£PÕ²³#¹½^̯D²ÅΗöw;£x`ªëTÙs*BÓ³¥°Ú©¡æ‘w]]²»ƒÌÒ? ‘³3²²i ®¶…tö;õ:¦ÓhªÙb™í¢¤_Ærj¡æA$ 3În¨ÃUÈ‹?äÖ6×,©´m!u佸U7öð ÕbÆ¢W0•i¥Ö  ð3 –ã?쳎ÉßwðŸÅ41(«Ó ê©Y„þ\h6þ«ù­‘³3lêìm-r^ÿzãŠ1 ;§hB‡`†Å a$²CãEZ?ymÓ±¤110cäó!‚Õ6éÏÑEuêÒKlνêžzª¨^ëßÓ:»co€1üÏVFÔä•€CJ‰Lr5Úۄ܌ے²eœ'®¦ ÎNê!Y!ˆYÆCGB«¹{‹ðˆc6j·Àº•=nI[<`Õhvø¤]= ïéá=u0Æpºw³àϾŒü\‡iÉ|…AÌ’4ï[¯o´í›CÞm<ÿÝÝy£•ÒwéàÀbcV--'TíOzg× 1ÏA…cP™œÜ'ÑŰ®b…Š%Gµ ¬Ç{B2Ц{i«ÖB×dT?ø>îð¾÷²’y¿½=ÐA低+ƶ*R­ð/ÿÿ| ;*?yaz*b³îï׽ȉûÇÖ¨¸­V,»jÜúS¥û¤9´\Xïy-FñpO©Ó.yO‰±áŠœÄ•ÕË=Þ&è™X"P·;_݈â¢[- rG‚šÓì*Ã-ª–ÊÙqé¨o¼ mhMøÇ<, ØDè…]E»aaáXéû˜‰øbòrC^4â-ìø0 Ë IÏ[<çM•~Ý‘îÿP…喴ކ¿’ž|-b»~Z†».ò¿bÚòD}Ô4}gpÅ¢Ÿºex@Žo4¯ñŽÍ>ëEé¦èpæðåÏîóv0«ÊÊdΫ=pçë]>…©¾Ÿpë “ã½;(›^LÜT¼ÒÚC’åµ™´Ü¥å=¼Ÿ à°´éþ>zÔVóiÝH£.6#R©tû8ýfX3W±e3à»RVÇó>ã÷·"ßµ9Hï²÷NðxQ€CÜÁG [Ù73:^¹üìaC^üiÿx¬%ÕÕì…ƒ§~š}:!EÁ£0;XËô¨O]* •!ØTæ¼…7'¡yӢй‡Z£ÑvFî…„x-ZpýwÅ"˜Ñè)sY™öysȧ­{ Cüáxjlöóé‘097ƾ9‹k³)¥ÖT¼”¿÷ØÁÀ¯Ê·ñPê˜ø».kôluÇ/žQ¿'qXµ!'­Wì`Hê™’`@®é¡§3zv¬µd»Ó»A]“_Þ"<; %vy/Û…n2·Ó€°VœjåÿT@‡;€ß2ÿYuGâ{ÙxpÚ²Â]ÜëRÅfҨ̇Bª^Î]°Î=¥ëN2h s’™Œ˜†5îûÅ:Hæá-hÇÍû{`#!›V0õX¶1TS/>‹8Åb´%—ÊñR¡£ƒÃ‚>úÍ‹%ª„×÷êîJ eïˆMË[ÅäÔ¦ËÈàü9ÚÝ$ÿWU^<Çüþ33nßD}þêÑÎüÌ­qJ<¡l=ˆ9Êdf¥G´‹"}}ÞÜûæiúiY[çølw®Cõ™€”$LCºÔ‘Pvùbù©ÅÕ•l·@ÏÐOóO€À %Æùeÿcl =O•Æí}³^DK©ÿV½GB F'FbOÓVI *–é¬Øà†’%ÔŸú»õååFFA У^8>'4Œ‚“­6Þ“Îéã¢1Z¼×ÝBßF .®‡8™às‡yÎÆã¸tC) 0¿°‘‡øÕGñ=ƒ¨‡µLÓåJ£áØAy,À‚"*&†¦ÒRõ÷|qO§hçÔxÍûøóÓIßͽk²Ù¼Ž€V‡ 2¾R®À¢O˜¨¨,¸ €Ú19læžZø_þâîïXÌðŠU‚M}ÿfé9 T©Û¢ÔB˜•&¾u3ß„u8üÃÄBz(¤rn±uý À!Œa#Ö‘J£ð‰ùÛ5ߣš¼øÎ<*ëÎ4€}–em »¨Ḛ̀[ócr3>ð2l1§õdNC-íØ|ʸÒã?E `Pb¤É¦ÞPùÔÀ@wRGfª~¶„!=+`øzQé”0ˆŽ†%ßÒ°¤?·þœ/ÿƒûVY>$â5¿ÍzJAž°À´u^}±lÛ~Ä»±öü(5"ãH78*±×ô™¬µyô˾7VRÿ , ~¦Iß:‘³G…{L#ºKÔ•ŠM&³¥·æ@À±Ñ¸¸Ïé$Y„¶sÔîPsÂ1’±z&>àŠ¤3Âk;þÉçvçÒ"Ø{ö_v%uI4$$Dö_þü`Ó·N~+îªW`þaD å2vkð¨E"Q²·ú7RˆþXçî*0p?µå{’4 _IÀ3’–¡°g¾¢b[Û¯ŸˆmÌ1ø7•úaû_¼@êüª\%`yÆŽ%Ö£Äc¼êçµÕOÖŒî4ÐCx©Èãê”E?*oiÖQÆ"ì³õ!½0¬´H±€WvøŠ€|× ¹ŸÇ q Ï÷.q¤^]s·ÃHHk¡?nÉŠi{Ü€ðqÕ†oŸ@ŠéŸq¡2Šÿ"Q•¼z4ãßËÀŒŠV ƒ£_"0á‚ö¬Vͦ)ĺәs~?ègŇò@ MËÅÙS«f‚38™EqÄ;À»‘*…`7Šå± -+en iüÃ1y¡¸FÔ;ˆ8lt(ü#\žDgû!;)a†tð@©! ÎØýáÔ‹fË+·×ã-^± “sw •ñ~ðÍý:; ¬ÓTÞl„ˆØ ýÜ"RÞ$‘n#°9­Âi’èÝÇYÞ¹žðCB:F˜´œùœït,œ*Ø=œ¯yß »¦™þÏôë!ùsà ­6{”îÛÊð`5>.…:} õùIíyi5ëž¾‹¢°L f¥;М¬_ˆá—ˆ/î2É{Þ" ýWH”DvB¼`óÙã\ îmï¤FÎ@êLG¾*ÐF— @S:ÿ9ˆWh aÉ—ü4§ÝHÒ=LÐÏSþ·!ÜŒ âž³/+ÄE6ÅTwj?§-¼ƒ‰¢:\äY|W­JEù.Pm¡”‘>H¢Êó’ôeØ3² >.õÏøáˆ4¦êç‚Cªy Óv;oÚhåW_é½µH! %bU®ï'D·°ÓûF?gø/)®u<¼5î*ÙÉÞ{f±+žzËA32ä(&kñÑapé˜Ãþ®-,-äv3‡…@˜F#>H¶e˜š&иÔKtûÃag—‚t”â¨ešöí±Û^¾fu–}:--²)Uöa!ÇNn1¸»¦»I¥<Ü%ã5)º{9ßY3™D™CDT%¶rKP;ԟ‘—Ø di/%øV61vSŠ>y<ñ~Vª÷Qlùn\b7~êØ H5y‘5Ø^R «à»HY†ä|êWè³þ ÄúJàPß+üà SŸªÜåÿ‰¤ ΊGÌtPdUÄ˵Pá‹2ýÞ"‚3Y¥Y>9¶“™’ôkç–Š€_¸Ìéè·¢OØ‘ë/4z¢¹ñd{øÌÄ=XÌ8®%äÊÏÊ“U©ìÞO4>G§DTdñÄÇ/@W­+‹„UIEòÒHcæã"gå£.°ÚáÅKzéîʘÕ~P¦¬˜ŸuDbr¸«ÛÝNý‰qb‚ÌBwrq’|Y#£{N_¯Ñ×^ ]i$ƒM“µ’þ⮟ Ñ2r¿5L1hóC ÂŽ±CSl×"ñçbº_‡§þ”{×9Hóc¤=ulQpê«Ç9)¨rÈÃFÝÚÃõ=ôz ¡l.Í…½ñ¿þi5†Ík*öHh2̓–ûkLúËuk:"³|¦Uºû¼!ù÷ñ[ól„*u‹%ŒèÒKD$‚;göÿXÞ–Lx ;EÒUÅ|˜ˆv§åëa·V«J '“¼ˆÐ¤Çü*Â5FÿQP× n@"´ºr”ê¢ÿEá2öŸ[óŽÙ“‰Ëh† `â¥A… êBL9GMzçRÇž»äùš#qðbŠ4£®V€v[A*¸(˜îfShD%WëLÍPÏš{éq¼Ž'ËÛÙda(ïÀ'*%(yÕžn@dg$—¾T ÔêxÒgðÕ]ùmYÏåó#×ÃJ‚ Ùýõ¿E?ƒ_Ù¥ø&–ï–|ÅÀ‹½†Y>²Ñ`¿»¾lEÔp>hm¤Œ±Ëɶú³?nÅN~íA” —H÷f2£Áµð4•1ߨýLÆj¥øO]6£°=eÞž¶ ]Y@@´Ïc­Ï¦Š(mÌHƒx³$X£"ÖÜ9]R2sGšïâ^Ù‹#ÐVŠy£U,»êµà‚£Å`‰$ñIlòDݬÜÞ”sÿ6ê 2ŸË ·GúºÀéö9·ž`µŽ´ã“…Dg#\¸´ù=H~Q¤—<ûÝ¢´}Þn .ë\rЂð)ÅìŠ|ÊÇm~&¥6’flÚ- ]ˆM€È,éï;þHÕæ>8¥±uX!³í|±Ií?q1¸häHGË ÚVÒ`}µ·è©“Ut O&mæEÓÿw˜êEE›þóë$¹Ýž’ˆEæwœ¹l8 ÇmYj¥Ä®Êi¥È°ª3Ì Ñfñ-¿"`k=”¹´ŸÈ‹˜÷a•I9BêHÙD]×VóObW#Ð`Å—;È+[/ â?wlA·¸Þ Œ€ÃVUNxé›*¬œU;4·åÉ™åÓhzY¹ñÉc —<ZÅa.cÞ1xã5µAFñÌ4“¬O£Œ¼)î‘]±hç çüRì ôáØx3d2x’x´8Nhî[ Ó(7î$1»hƒãÒ2=û|+ÅÓN–t 3¸Þð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡Mõšñ‘ÕÉxùHs,o€{„³ôy"—nM”Þ?AaŽÜ„ZéMüšQ>~D·¸„«º6¼‘™=2 W ðBDðñ'ÏsO/ýùvÔð¦G3ÃÓíí[}z„ASí_\ºVåkŸ8mUÄ}Fr ä ¥üÀ ê Íú=l“ôr Fó5¡YŠ‚r-„Û ¥æ Òk×&•pë½›}è(콃ȲÏÐ’áŽ>1þ/®mòµ‹#Ö˜€ƒÍÛDÉ>ì0»Z*ÿå5Œ¹‘…V"UÄ)óžMyð1”ðhã‘»Ñk\"kñšÔBÚÑ §G?òˆ’¨a%\>sB5¶]Î ÷ ö«n3¸|&®V®TÉåzü/ç“ÃZÜ'¦S07Õ%¿Èoè=€&i!„S.;6Â~Öp+˜˜©”€ÄLñ^íâX0MCý4D?,â ˜ö8abÎqÎ'5VT¬ãÊ ò·“½*ØÅ€yŽNBö+Ö™¤ÿbBKËño‚cÃËháçÂGúp|?.©oáµig)7^-ÒšœO'À}zSSŸ ‘2Iºõ{èŒ?ù ñ¡$í…h¢©^vÂñ÷Sˆÿ{…PC¬‡åX„DÈ#ˆVܸi²ôÈÛ1ç"L™Ä¾°Ü—q<Ɖ!Ê¢á ¨GapñCE¾â_XB²¡7v0$O–àûc°2&êÀÆØØ$3#]»ÄŠ—Ê¨ô·éå·žq;¦‡ þš¼bB’A»‰B^6ø‰˜GËÝ0Â?(ä}ôœ®š­ÚÁÑ2RÝ‚ÎP=0²ÌÂ%¬Xj:‰©´"w×fîÅ=@ŸÈõNsUï[WMÅMñÃvú2KЗïz¼ÚÖÄ%[Ü£«ÝŒÓZ—Îï÷ê¯s5c‡³}œÚ óRè(wÑl`!ê•<Ïö¡¨êJçâöQKÉØç™–”„äY6÷ªŸZªSć·2ÆAœ¡…s9}výK½fƒ²IÅÓùl0Ú °‰H<¨ƒÄD—ÖØÓ¤côö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯ÐX¨@ü‰+a—À])};@&Ê$†’þ&ëóÁMTFã®FÎ¥=ñß#JÝŸ›¢åð;Ï2e–ü{eD©[€ÇPKÂRÙJIpåšOž{înºØ!ÞèÖ¯æeì}Œ$ºS÷$1IµGžì¼rá½P0©¯”¶qô¦ùhŸ¤t‡[•̤€5&ï´ c;ÜKÉ]ò“~ônåC Íö–àµÌb¨+ékµ¸˜u.f^eŸÛÉáÛ±˜ñAÉõø?_YÖŠN„ÃôÌ«glêûWþ'Ì÷øß‰/#t[êiEÁY!néR—|v„{=G!ºy¦îw9çd³¿ ©—‚ÿv‹dÀXóz~ñ)ºá»Öü*0Œàò‚ðÇEBØ—ªêx>føÌÀQRËj#ÝA§lyu5R¿>,øÀ±ÒC0ÎNÉ50–×ð17É&^í·]3Ó’ç…0f’ó˜ow#HÄê^µy*%bz¬Srª¯v›]^›I[ ]y’d“îκÇZÑr'Õw5…UZ+±mi‹Ø‹¾¢ó<šp Ákä•öp¬é~Äø4`ýjimÿ@"öœhEá£1s¨ír‘©nÝ„ØéÌŒAi*¥+°y]q9Ù{K¨‹)¬ä§èòµó\Ÿ=‚@X=zÆpÈFDïtZð³çð~ŸE@”È—ŒÚi( D×î¬ßê±½ ìC+ÊóÌVNoDBêrøCD@RÀz^"ÓÒ%ú—p¯vÝ5HäÖ:]ñ}Jèö/î8g–Q8X!‚ØnKW"BDuƒR…ÜÒ‡¥‹`¨Æ£­¥J3Ã8ßfý×{þ ©Ï'âø —Þ ®'Zj ºŒ¶¬ÖÝÞ>0ZÕΘdÈ&Úo]6S4ˆàoßçæl…9±ò€¢5ÌÏqH´œN¢“B§ºyÔÔé[¼èïKDÂ"rqò¯ˆÑµ™ïR¤ñ.Ûm­\òäiĤú,¡±þâ³ü~ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcË•ÔtÆ6µT†€ÈcÚQÖ0g^ˆœ Ò û€æxûö"æXÚ*Úñ|îPôóÁŠÀˆõlq&”¡¢%ÚÕ6ÇTã¢~š³G²Ê=ü3æ<‡£¸¡òÎ¥< Ô1Œª{`%ü™ÃdNÓ‰OnÛ¼Pßå3û6¥_ …ÐB}³Ö¸·ÐŸÁQ¦}©©H ›¿º*F‘fBíbŸ³H¨Ï1§ï™š¦z8˜#Ï4!b¬D: o”?¾ù©y¬ì‰ª±ä¨ ìœÑe“Æ…¢O5Zl ”_ÅÖ^— MCÖð¥è‡ˆâ–^ƒ%â¯G3Lj}–  `@ËÔ6©|¢èZªøÝ¸‡I9*¾î•·”î%iO¥É=“ŠÔ†èà^Á`P%ý)Ñ0)ž}ŒzK‹¹óNí„Ú< _C ¿? ¸ŒWZ„Õ<@ÏýhÑt¦sñ74Y9de·^¹¢á-[-õ±¹i†¨jRÛVš… ç‹BúÄ»zQä|êT'h’0þ—¿IRØ›P#òÙc8ø**¸¨tlã äaòÜ‚tG!Y3Ùâi%+¯´ýUOF:¯¤qÂf(ß\Ò!3u‹ UfHHŽÿuß„T«#ñóüº¼*ZPyà€CÄ´Kìpß[(Á³æ%ˆëš}á¤oÀP½r¢b}‚æ³Ó$Oh~>gÕ1ãúÊþ ¼8 gxw"Sq9µéÍ$˜½çùÈcõDx9l´˜N)ò\‡ºÿ»¶ÜÕ:ñbX2 ­*¿’òÐ ïPTBÂ'­DÙõ[Š"Âux‚¯Š¦þßg›l·éɃ .ƒ˜Ý”<•Å…”¨V®eƒg4‰s}#Å´Å^Ikaå«¡ o™I8,ÝËœ?f/#).µß€]ƒ|“îx7ä[V cw×(KLØÞ;ØòÚB°ÔH¸êíô­£¶ZƒÄÆðÃS×5Nµ“²åPí™zP£½°É à ê,u¸‘®]͆DT‡djh¦¯í‡e‘×0ÔõÜ_T,¥×+mÄäU߃*ø þd{ëW)ÆyóPêÏïÓª|©e®?j_Tº\ÎÂ×ê©“ÊÇvÿZsôo³ÚîŒÒbdS^Æ1ÅàLh®öÚÈøí!X¡™´ ®·*l<Õ/È?Î(-eì³çŠ'Ó}ë™}æ/ì=ZPµPâYvÅ+n˜DÑH•_ÅÄŠ£Ûûƒ}¾Â8 ƒ,‘í®ÎÂ`³>;ë¸gKf-ÿsÙõ~+K!'s)k'+H4À˜•Á•žsžèˆè+Ubd˜ù·Þž¿UžI’ˆÎ1Žñ-àŒR£C-ÔA£ú­„að“a›Ú0:;o1 åÐÏS“C!•âö™ÖÝ¿…ªÕâ%Mc‘ôy/ÒÖó÷“im†H÷{ççX]Vч†W·+Q‡F¶®Ÿæyé?øVSu¦ Kbó—s, ¯ e5:4D;i´‡“#rl€'Æ¡á 0Øú;6Ýd¨Žøy)a÷++МŠÖXñ9×N÷g:¹¬òÏuYR´ôé[R ™®¤&I\ÈÏvUê5Ù>ÇŽ‚!”l…h“é ¨ 494 ·B@´mºiÐï«7ôÛ ¬l }üxê‹:Xîú„&³d}$›õpfÒ×uÕôG;¨S£Àu8O.$ÚŒ2­-(FÌó{·i)¢ ùmjoTÞ–š& ÄtÕMlœfÿOLB_€­YÖÿ{úºE0Âç㌸Ïè'ˆ‚,|Âu®üÿ?¡$q›ö¥žÐ¬òµ/ÅšÕW•A<ôéKôÇaØð{ÛàL[ñAAÙP Àù¤RÙÀßÔÏ©Í@­q“}ñî¥v øÕÆ÷øœPŒõþ's°6a£-+…?½{ö4‹J¸bïVùw²þ¾i3eRïÐ5"Ö‡µxC®EE-í¤¾íï2`éc¸=–³9š€=מ8It ÐA˜"aXÇT¬wfS?%EŸƒ±m¢—U3êœØµ“–ªÁÉ—ÔH,!¼sûme9¦2•.ök´‡Êá!>E {Þ¢ Š$þÆ#!>H…¬UæLÌjN¬wX 6hŒÜH»/â\c¡T”¶õï¬G‚Ë(ʜÿk³H¯ ñþ_6þ³ûp¡ˆëe\CªÞ©#íl‚sÉɺpE³¿¸€NŒž…²£-ÒfKnåý“ó¡#ù˜×ˆôñmÐKÀùuñ“ ¹ÛËòjÈϸ 7ä\e6B¯6Ú»)‡xoÀÞœÉ\3•NˆIJð^Ôó!d>ÖÄX’8¤æI!kÎ5½dª÷EŠ%ò“uÞ£ ]OÞb¥{uFxbbÓP¼§¡E‘ÐÉSz𗻥^ÄÐPpKŒsOã—±`P|Î Òu´utZ£§ ôvVLk*TL¹µbì fõgœ„ß3IðNËÑ` é!4y1„‘eµ}ê«ëL€Ë´A¿t[«DþG–>ÙSjúBÈ14:Y1O?yõѧCm™ ÈPÖì‚߉ŸºxŽsZR¾¤.(qR0Xïìý¡æýtÙnvØP”G~/ê@ãÚù¯Ç¥s>Œ×vø1\îOòb†¢£vBåû™é·—ÙA('"·Yw×us‹CÍüƒmA-iyˆe(ccLE\NzŽJJ K‘ÉTI‹ÝS´óqÛűc¬÷'?òБ¢œ'ɶãÿ?u¹-ži|Ph¶èIšïÿ5Ö†uÎ=ó塾yÐáÊ*…PG5ùÔe—C…( ÇåaÕÙh1YHøðêx{¢¥ åM¹n¼y 4yÁÄÖω %[ß|Oìχ³… èö.€3Ž‹–G÷Æ´(iVh$‘³ºä¼ß"’©65'!Ñ÷Kªc|¡æ;éo?[Þí%ÎþyHˆMH’å6s;'õ73¶óN«ƒ̪ù{P2ˆCŸüÙ W¿š{2\èȽ—Pýo!°ÆMxZáÂg–šèª¬Õqò‡-Ä ¬óL ‚AŠgÇñ+v7gŽëp¬3‚/-È®eŸÃr•¤ÅywERQd Ï>ÓtHñŒ¢Vj.AüÈyâ¥/öŠvn@)Ç´Û"õ6[Øü­†‡gß €5óX¿¬¯Cö ÇÁhéñeÌŸÖÅi5 œ8ríUtÔùØ¡T%Vþäï^Kg½”p§t[èSǽ7/Œ%Òºé]¶èÅg/tø~ô!ŸäÁpÑ?Å¢/Z@[Š6…Û ¹Ï\6~89Ôá²]ÿpCe$0AÙéšÊ ¦Ö§Âs}%P§‹H&ê °Æ^;°`ÎùÝt0®DÜ£ÇL‘±«8ç“e¿ ð=¤ÁLŠãêègEá€ÓÇšWÓ̶£™ iFhEÒnðó0GÝêèQ”¢¡Óá< Ñãö¥^[À›ú–Ò†]Y&¢ S% <¾1.Š7*9A&¿g`ƒß2Æ­Ÿ¹àØj '6z«nt_, R-qÜ@MîZY R¸aRI¯Ë&Ø=1ô–èB1r€*Îhcè äÞX\‚Ò›‰J›¯¥Êસöaœë¸M%£¡‚`å!¿˜¨U¯ 3Å+â`¤2 öyÎW/²`%ËR=¼ü•š™U‡Ü¾iž1ÝN$åzÁ:Û…O„ÏN0c¿¯À^Ÿ¨½{ï£ûE˜*É °´M.{mÙ0¶³S<¾¥H‡â»È£Ÿ»Îý›9ÊúS©ÀäTê–³hË[ þN" ß3W¨PªÞi‘ã Ô€YfÆ Èþ>iŠþy ÷Ýɦ’gÞ\K1_¿'dWn¥òú¡aÜxG_w'²‚w‹u³cR4ŠÜ80ÓX`p€Ûq.ÙúŸ7ËZh‡ÎiÈ\/‰Â7ŠÒû´Ø ¸“¾Wç"éé}.³)„xä6ÁÎM?Æ©Í^m¦ÈëÅ‹ûÛZµ²Hî7´Þ—k%Ú‡aO/vU¼á²žƒQL›uõrx׿?IÖmPô´§‘ͰªòîäW É áGüü+$ ƒ°z5ͼÐ9La„ª…õí·,õnèñ5vÒ_²ânð•ÿŽÖˆ…çޛӭør,KOk#Æ‹3qž»téO4e·ƒ?Dc“ÊŽwÓøJC÷™‚ö‰)ñc%…±ÑL§Âˆxo/q3³ïMxÊ+ÎûÁذÃ%Aœ Ѽë7¢ÐöÛZÀmÞáíe5¾DhÛkPœ(ü‚¤jîOëã$’Ýá_‡ õ=F«{\ɾçýà2†Hëöî C E`³QgT…7?´˜È?¤Fòýº'ïµ ¸Ýz÷a'",‘`ü&½Ä:|GOÇú§‰0yÛþ!Å‚Qsß@H¾33¡Äd}wÞtû4«þQvSlÌ4øaïxLÔÒXäŸÏ ®æ—FE•ãÆ“Î3$ZB&Þ‚ä°eôՙĔ´VAx²Ê¤>•q-ÛOûðÛú.ã3yšºòS ½S8³àÀ¹ñi´I*ðª¿ãrÓ€ÂîxŒe–è+ÿlëkí?LÄÏ]=8ßbÀýݤ×ò>¤Û1`+Õý·[9\˜¥ÔGý=†”fÀÂÓ ¦Í ¯±ÞÿRíD`X Ø­äV—N-ßÐÜ%º Lr’­”RÆPÛú7â9øŽ¹IR»=Ul”°V—ÎË'DÔHìÇï6GÖ×]üžª¹÷‚ø™º7éYuØoïç¹ðnîaÜᎩ…[ /Œ·ÅðØbÏ&®:}™ûô‰>ŽP`Y7,…¨ôŽWÃÄzðuâ–º5›³n.‡ôéxKÍuýíÊç7;ÌAì{÷Ìϰ*Q»‹£ +ýÀš¿îèy4ßeêÆ&=ªè{²Sý?_:BÆ|å9ëkw+„ñ·« À•¥Çºµ3‚U2à_¦R¿O/R…ló#â¹:l낇/Å «°Æ­¥”ÈSTúÅȶÂr0 »«ìš0ÐX0#Ȇ7ÀÿQÅkc6áH¨ÐÈ“b±ÌOlhVÜSÖë·¿gxi¥Êå›ÅùqhBÐ!:å¥áð„Wjë6Æ=¹½C¤‹9²T…Íöˆï4^-`Î,‘²ëÔ#%ÚMB÷§ü±ÛŠlï¶ ÈXêôâú˜ÜW9æ “*üL|m”vG^œâHâ¹4)¦‚rå3ÙÓämybÊU5bÊÇÍoR¼!ÓÞX%9CFpâ#¨9·¹¡ãPcúÒ‰O¡jÈu)Bw¡m²Ý/Fùe}rsÄÊ®*²«qèA³W’`áëÿF¡ïÁIž½L¶P$fi#–8w#u! V‹ áéB&=Ñrì:1ĺBy"_’¹ x´¥†³ú„!f2‚¾f9H DÍ‚ð-›Ø†gˆw‡ï¥í˜nÓ@ö}4_^™À@îô›¡±;Þ†$ Ó¤zã¨ÁâxtíEeÔ™]Á¸kÚPRxÌÛôÔ"–µ*—gq3}¾+8ÒšÁ;`¼Rø JM`noÖ…¡ŸMS¡µ¨ùs»¶ôØq» áØ=ί7;cÂeÕ¨$bCP4Áý$ÔXBQÐÁq…:€ÎáÞø?[˳ÿn‘Ÿº? cÚµR²ò©Fù2ÂÏ <"þ}ÅC-ˆË ·«D/}Xí­"R,wüßf'¹)'Ìt^5dg÷Ï‹Ê÷³ÇìElÏñ)«v½w™“Û¯ß8Ñüaé=V}߈7ÄηGcoJ.±™¨ˆ"g¬ÇW@¤~SHqe±’:Ê„“ÓâîÍ£µ;ñ·€¿—Ê¡›B;wÆŠc”ï–91²Ódô™™]¢Mª'V£bH‹7-a¹%’Ÿ,냽’f&£é½D-Mè›he“ «àö[à-Ï­¼•ÜUÉ©-;N,Í÷>¤²TóŸKVWwõyÐǨo LEâiR…䕟½9˜N%~á‹sSŸøH,Úh‹—šOÑøÊ4û!‡£ÏjÔÉúW’Õz9ÃT”Ü<™©Ì°ÿ64þOú;üö}þlÒoŠCžØn3÷¹§²T› Àýü z¢Ý^Dê9æüŽ(yÇåÄc~+oéñ±SÇÚ9,ØMeçLo‡°bí"†‚¸ã†Üëø¶JâË·‹uv°ÕYQ´¦TZ¹\ˆ­Ýa*§,’§Ú¼¼ä•hƸL׿Œ5¬_‡à¯g¢Ðzá9¬ˆ= Xý¨yO.´B^?,rxqäË1ð]jì§9 Mbr´ƒ³ü+¢qifH|ZXæåËç´±r”W£Øû+ʓ䜽çU)2Á(ŽMÞ÷—ož–:«¼k3LúR€ëïs b€ú܉¼D`4Ý^ã’àsþ,D,hS6ÚÙó¾-‰KZ¨n 4Ó«è’bu¹ß³ª¼­pàhÙ_ÕëA Ì…aB‚5 »`÷#BIÓ¡ÀĤvš[ 'ghmG·ð›"Ï9Bôðn­{BY‚-'‡I©4CnsèÜxþ꿉`Ž÷Xb`8G‚N f¶mu½ï[¦ÒRHñ;w°Æ!<¬iFŠ¥ð~±³ãtL]ð\)¡pòÀÈG† ÍG-QCt_p9åu§·JVz½@féSÞ.èQEÅíûÀ*¦€B—çA'uáô:ƒSÝ*¿)ÍÝìÜÉó²…ÜÝï"ÿJÎ T•熶¤2öÖß7¥Jìð†G Æh£¸l±zC™»f¸ñ»ÔX»œf8Ç’ƒ$λMåw& &*´A**Lul]Ðj!À’‡£Äè°:6qö…d–ºÕîØ7RûΩ‰QÒ( „fÈu+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É‘—fV§ØÕ¸TJê8^ÔÆ3LÏAnÀ»JNÝgÿ#R©R©sá€AÇ#mSÚ!åø#ã︻¯,1™è•ÓÑæâS%¤w ¤ þ“u͸<#‘ñ3G£²ñŒÙïzœô{›å&´ºÀÔ5“¸%ÚuG]§~ ¬qÍ—)ef¿œ# ìŽ[° +ø×YÚêÒJ]e‘¢8À£à–»_4u,G(’À¿Æ½'€²Í¸¶8öQËp‡ã¸ºëvV+dt%8N—þ=ø>Š~MÔ÷ðNS#2²€j†¡*øÊ 7^"g“LL“WRýß”a÷] b`_ÿ !Îb&½Ž"àRgGë»þ¦¹uÙ€Î+ÏTVô¾^.—61JÏ\`H53–N áà¢3f,7¹šøyÒÜÜ9å¿V{œ÷$J[¥(Ùiö² ÖT¾ËuÏ?­–­{†õÅ3i3hЇŽ$ä2ÃÖÿ 7ÜVq. u¼[9Å2ß ÿ(wïpÒ‰Ù¢ê3A4^qf€Ád•”¹¥÷ï„ã®ÖiÚÆ_Øvªî›Î]7š¨=DT “=q¨Ý¨©­R°áñ—Óæq깚CòP &?âŽPéOò”ÒDKEö{ïñ8çem.èEèÞ‚¯Ð©v2Zá©q4ƒHb—xxXž62oÉ?4]«šAÐŒZÑŸ >¸\L J¯ÁŽ f¨š6®†ªXsgú>Álì–Aå9x¾ÒÜ>JÄ!ænÞï– =Á1ö$hg\æ~–а=Áô<>Ž©µ¸½z5[±ƒƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨Íªð÷ ƒº–œ ®j V«)7ƒÉ,¬yükh™Lª[næ¥NË_Ï^Œ¿æßM ¬±Ÿ”2¢fUM¦o†Á&íI—^-’aX|=g°Ou‰ÇŸþÑ UÏ`ÏnÌyƒhÌ6$r÷ÿlýt =¹žNŸ$õÏAD>Þ1šcC´X^Åoe¬h!`¥Íæk zÌJ¥ÛÜÕáõ¼ âLÅÁÿ„RoMkÕ!E«áƒwÊ7älH¡9óhµ]Œ ’ûê÷u<>Ý8®j?€šË²Ëbö*E_‘Uä:ª°0‚ŠqTÊ«n˜Ëj›kßNdÑ÷2æÌD~¦%ìWao¤–/•w舦{”E’Ió!æó׿¤ñ“^ýƒª3’üuãÔ°ö9)» XjW2µâ²ÅÞ>ïQôë~]›2 úfÜ4öS¡»˜Zì Z¹Ñ ©ì¡ú™ eêÛ$[ ã#¾N®‹Ç…+ž´N1šºˆ215ÌîSñÐn p™èlôìØà—Á£CTÕ$6Øg³*ëŽ:ycÝïfÊÑ%²òšU{²ð%÷_Jâ“ ÆHQµÍŠO¨ñ˜½«ˆUeÊ­®Ô‚Ø’ë(=ÑÕ©fS£ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­xñ¾­4¾®ž¸|%/«[o í±ŸíØÏÛéÇþ×µõhOíê0áýW—êèoGI~­ý]žþ}<ÿ+MW Oú™Wϲ?WAÇ õieõt÷¯œbúµ£ö÷Óú«7}[û}3ÿmq_Uûûz`çSæE³BC,ªªímH-ç4lšä¤Y[–Kkú\rP¦‚[ Õ_ú}òjlO¥ÓêU"N”''¿íÄÅ Õá÷Æ‚õG œŠxÉÞ ùåáFóûû¿:\ìcÈtØœ®ÂT·,7+3›…¦oÿ~i¦| r]ú~AþÀ`°ηßꜯÑt£š÷ȃ.bÄ æ¶_; •Ç/JáVR¤4á|­”«±«™OMOŽÄá4»ÎI;xÄèCÓ Ø!÷ p‚l6Äw­Qq™ÿe¾‚;½ªIY·¿(è@4à†Æ £ _e³JºãÅêÕÑžO º?´û˜†ÂŸ/ÿp¿E9 r£^œÃÕ¨ 1SããÇAa­`áNJ?³ÞÎ`x…·÷ÝMçºqÐÓ"—Hà)Íøµ’Ùeœð@mö Ëiw?¾F;Ð<îl`K/Þp0ÚèÌ–ãíTF3µ & ºM©‡Cóó½ã°ÖÈvúW½:F—9*’2èàð¬ïµeÏsJDN-9GD™à(F× Ú§i¹ Þ4yíCçÛ5b×ïc®îÞKÑ)GĪa­ßTÆW”Ãòפvþi}4ø-{¾([§Vr·—ÆÒrtGdϰwÉ8÷LÁ}ø²LìØáäl/Ídµë‚ŽÈ2ö(Xg˜ßïØ6[½õôÞWKòJ©€KˆŠïtQ<âôÀ΄#øDñ ŽR‡˜Ò?Àò_[@g®r…úSª/-ÒÁwÿS€˜´¨@V4 Û–ƒ²»?³‚ÐT©Ypz ¢E]x½0€u’qä¿i×éÀœ(WšÔ¸=R<Á(²Ö íÊMlŘE‹ét]Ú@T§€Y+Îb1¦µ×ógÓ¨51ÉŒ Cm£Ê¬}˜ZzYñµÐŧØp.mŠÎžÎSðää\ÂF©°¾œRQ‰5;¶ÅOLN…ð”åY’ŽÂ¯NGõ„öèþi}ú²@say¨©«üeE£‡³* €€b¸›Ñ|yÒöwIŽþ³4Ь§ìçGÚ—÷†”$­Ðw§pv²ôZ.`º&¤zópo­ õ5¡š› ‹|Qýˆ~Âð|føöÖôª2è3‡–©1€HÃâK÷Ÿ'Kj·ñoÛY /±†Ÿ ÌÑqõ~éª÷ë¯Ù´ƒܼ‡øQS¯íU/uO¥K«Wšä+•”íÚtsiS$&ÕzÙLb ,ƒÄ[ü —§‚DaB:ªf„é7ìt“$/nkÿJ› ßÅË¡@ÏJ¨q$HË9C6¤AÝQB6ö/¶o¶1ƒ˜XC€‘ººÌd*%iã:â×þû£ƒSE9³Ô!ËþÀ¥Ma™åÒù /G ø¬óÞpþÔˬ]àŸÑ:7ŒᎺ|ÓÔ§¦€…âýâÊxLŠí,Ã[ÓNÀ¼aß©`7ýçÜŸTªüUc Î÷ñc0wÇïEëçû7¸4F8#Ü`Gç3­M"€gOíRR†ykÚb„z¨±‡VQW7‚ÖœC3–•›1œ8?®Cå˜ .Æ|+hV­gT‰'XDå.ålŽM]¸OH˜Ìõ&·Q¹_w…¢%oÙ(¹¡¶òý!¯Ñ] Ô8ìÆ?Zãm0÷»7ÙÕhÿ€iNÉÒ^sX`¡ ò€ÎWkgƒà[Å3ðÄàX7?³nà|y…‘·¤^©6$ìq ÷½ùñ#»wD}HL¿2 ó¤6+°Ùp+ϳP÷öŒjE9’÷âÖî©Ç2«_êyü·­û¯û­ÑV)Q$Yi¶ D–˜Ð¼]`—ç:ú÷ýq˜løxŽ¡¿(ñò-¿ S™sÀ)'&ÀœÂšD…J`žÌ‰àWªæ[ðÞM ³ÍÓéT\Ò` òP(¸’™rM,¹lGÈŸ^UD•öQr­×¤²¥¿W†p}_Ãø'Tvë:”à°ª2õ ü´°f8ÍR€H•äÚ¨¨¸X„ ÙçEõxã©g?MÒœ÷®W òGQºéåc '½ÑµÕÉúÞá¬dÒ’É’ºÑê#^oÝ`‹A3 1ÃhìO»öîê$lF]üˆ¸RÊGóæB>ß_X„©_£:r2!ÆQpjcöPNÖqâu1íFã¯}pA˜’œ;ÉŠl¬„Íy¿Ä•Üßâ ÔËßÏö;[c z€äR6yÌ[þßgžîsix8÷IûZ$y§Ð°oâXöâ)Xugµƒ©xB<ÀFI¯‹ÎøÐÇâßãÞjo+šQ¥ï mH…靨èKô‘lÛCóÔ‘ÓPÊphÔ¥Š7 jÔi1(?ŽÏÆín-«v§8w7–å2€ ©]?I<§`qrÝ$¡ÑÝÊÙoÕ —-¯[I9ˆVÜ褰eOPx¦ÃBŽˆt!©Uää§ê.ôÿ ’gà¿„¤ \óNÞmiû šâ@ÿ å+ýƒÂ™ÁA^.Éqyû‰ kÅ»†Ë5ŽO]4A¥~ˆêÏIhiéŠÁ£0H« çTºãõ­ˆ¾ðwùÚ.šÓfç†YfÆ5€D0|Ãýãº+׳7ÒçÄ‘2š#ýEÄÎfBÖª>Ì"¬"p”õŸE‚ ûç‰â0””Lb¬'ór ¬#žÞÿhHÆÑsÓ#áÿmÉVÊgÑÒ«1µLmD‘äMÆ%ÄÕ»-™y4h„U¼G–[Ó$Ç<§¶46ŠO¾âßtMÓòò£m¶|Ù+P&‹Ê`'{'ÚPÃǰaƒAŒêµíS2ŠNý4€D^wOQ[04&Hõ”×å {ññ)Ën'Òêl·;“º8îÂAjh'k¸½Ä%?@x³¤èäýó 1Œ=X̾v¡l$€ˆ¢‡¼ZÃx‰ýÀ†Êÿ-*S‡È@YFi½Ìç3HwÜSÙ¯+lìÝê¸<÷M—‰¿»h4ÕNü„! —'ýÝ6»ÿ2ìq*t³ÂÞík=¡ñÚk³EdIÀ?þÇ%–iTˆ‘挚)«$¤kóþ&`Oüa<ÍáP§g`¤¯N3c \UÛñ${14´ÕúÊ1ò Ûe¶Y»JY̽aÐ݃H¾,V ЂsCOiÍzØWq3qbÈzÝ-u÷›v|¬)´‰™â“"!áÙœî—_±–€2cƒZ#H[—ò¨ ,÷(·œÇF¶‚*Á®§¿æÞ¾™ü½½m«~˜-üè{g¬m—"3®b„±Ã%eÝ€ëôå⌠D]ùüYÊ1 `Æ ñ˱MS=Qf°”6ú2!~Eu‹j½ïbÚ/AÎt9„6_0†éUiµ%¸+ÛYÙSÔ.X݇ÅÖŒkÁ¤™ž±—Ç ó“ˆ*’ßPÙM"ÿWª ·/µtÔGqó‰úG»Ëå©Tè˜rsŸE?‡ÿtPšºÃ\Äê‚É9ýÉ¢QO1©·T >eN~ßmX!gÁ‹ø ;ï²Jð¯Ê¦lJdû(èL°¨d©éuÉú©_ká4€‡ |³—™ ìÒ¨øGÙ™â¦ï ëÅ0oxO‰D[—Íáp²“’j•®"J¼yîÔ&ò­nÐ~41ö&wœ]c<Þ¶¤?çzˆ§ ˆy ¸à¢Ì5Èû¾6—kDy#¬OíŠA@V=ªPîó»& æh8ØÜ-œÔZþqó!Ê,$â¢8pï&Øö²¿Jìl¶«¡~Ê–;­†ìß­èô,7Åxlj?Ü*ˆ`¯(súc;A*‰Ú}æ<-Cvñlv²„G%ÙôL}h 7qˆõnÞ á¶Š ‘c¥oê`:’_ ZÀ¼µmüZ´V”ç7 iÒhÛÔP£>·‘Åf "TïoW€ †& DÃ7Íd6 |T¯¢ƒ2¨‹´N_¶æ?Ç.Óˆ·{ ‚CM3½VU8Ÿ¹±Ýepñµb©·VÞ1X¥:|Åõ]£ðÔ¶,äü=ü¡ÕZ‡†+xÁPòý_h£!'4y¥O0AÎ+q¡µ´?ò3é¸îË„ñAÔ¶Nµ3x*È 8d{]¥oÂX޳ügy‰¼?{(ž)QdƒÕ_²¶ r¹™¬‡£á¦yQIÃs¾-ÓÙ­åv5c½è`¿ùÖÑ_]ß$ÑÜÜÓ;šÇªûzz"mHèî o[qU þņ<ÓoK,;/ºÌ­yv.?Ñ÷ôE'ÜÙsþóË „åÚp¤r«E+ï7´¢ò¨îj)‰O |ÍóÐä¡D½ß—Aó&švצE‹un\;Ü–o줽䑼ڼ rÔ6ÐÀ:».a: 4±Áàýâýù§šº“¶8Ö? 5'£ÓTØ@Œi¢ˆ§‘#NuFÚ“ˆÝ„­Õ`ž¾Ž@å- ÚU™nˆÈw<®"ßÃ}¹ML!•xºLy$úPe 8NyÙÅïÖ8²&:ŒYÜ3Ÿ0“ÕÝcë´ƒg½s(rÓÿVö8 E|…¸ïs¯“K"¡R{´G™7‹ßO°’a%s â)àRSÓ÷#8¶ü•3zºE•úëiLbu’*X—åèÀ ?åKn:PŠQP€ß®Éœ>’œ 0 €Ì°£É»lÁQPÝ6R\*ìÉ›ð€k”튤”™º)¿Ã|ß§Ùw|…¥M‚«÷ÀPX6deºy±¢Š€æx=ÛŸgfÖ 5Fºç:óSkº©3(m7—â!{z2 Að"ÐXþ©5øH£6Õ!»ö0µ¼ÿ.:ÝÖCß9á©î_«öqÓÔà×û0™§\ÊÐLªÚ4–’êÖ–pÐj%PCw9¸šbq¹Î}NÐqƒSNBLSч½;‚4ÎìÈOµ@;ѧ7¦Ò^µæã¾ÏKœƒÿG¼ ™<2×èçNhaŽp,¨ª•”Ù‹KÚ®Ëø(˜×\®¨¤€£i»ƒÖ h¤â…ër$â ¾Ä~·@VÖš»(}Þ–e1óŽȸÑ+úÀµ˜þóuön¯f à­[Ùrgp}­Å} Ϧeu'Myv¤<Ù1ífÜwJxn¨þ8¹‚ÈH¦%þZÒhÂI:؆Íågï nº|I?`ŒÉ5ˆŸM ò£ýž™¬=‚"É‘±Zéà&‡ïË4$r¤”4¾j–ó̲âI¤ŸÂØll­¤6½Í­œ~–©AX€\³h©œéÄ›(mÿ ï×ËŠËÐ;,‘ŸVêDŒwÕ­¢5ºÿ\8ªS¬²îx;“l¿YY=žµ»,òGýå0«â÷Õ«›±{¯ûŸaÍî}ßb–jå¯Ù!–™OKüwS«“?Ù:£”šªËÖ®…`Ï#Гìœo‚ åÇñõêóJ’ú¢záŽÚ&5d¿˺è^eaCfK>òžkGm*A`ÇÖÛâF_·ã1šÕ.àt8³#–ýr;JcGÝÎéú°º¬r{ׄçƒÿ,éÂõª`ëJ£G»îåYù«=øª$?1Ù^¤¾KŠ<e£wÞ!ˆÿj+IMú·ÛKÀýVäª4,ÞÇíèP™ãœÀo&W)ŒØQK½XD'ô¤g’àÌË›ìi€F1÷:UZ2oOz¾ÃþEÙ{l0.(Î#‚“:uÓ¢ ÛøÔ&‘˜‹ÜÕ”«"‡’«Ì·.ÍND³V\K@Q¸Ì¦›š$¯S)Ì•û³‹`°Ýzøáy害n€ûtŸDP› _ dü˜äÑDÀêÒg«ëÅ•¢’ËŽnãŒx¯SBØn£éîÊL©ú{³D ]ŒÒž± þÀ(]f™ iŠÔÐnL˾9¸›#xKÝF#?ÜšÆ"€*Zóµ0[Âi„à *`[³ðƒÆuÞH†´ÏùLNO-Vñ ¹…Éš½™•9Ö£‘H}œ•¿Æœ†ÿdb+DW„‚<­‘øûÐÈÈmZ`ÿb…oÜ>ˆÜÈ«%déø‰b¼Q¬“ƒ~\ö¥t0#}XR½¹{`¡ƒK(ã)·–Áò”¹~Œe^Fý|[3}|ãƒqí RšGö×n;@Ù¨ˆ³TZgdÝfü…ñÑYû´Û†*CuKiQQÜC¦Pd˜æížˆ15>Ýäkc˜ü['F÷@ŠÍêÒ±\€Æ««%Žnr-˜ŽÅ¨ÞX[LèœÄnQû­Ò>ËçQôàë60Ùy ¹Ê8¢µ'%ÍÉs(Ûßâ áå C» á±OZ—¡8Íâlµ¢ÖèõÜšc¯O÷¸>³9y°NÞç Ó£€ ñ`Û;MÊû¤í´}pÜy7ÍoY’$碂äEUÂ^3…Jrõ€ÖRMéÌ÷ùÔ?ýoä Qí7LíéÅVÐßÅŒÚ µŸZärÑšÒ˜èÝù”†™óÏ£þ¨{™™¤FK+¡ˆ)çãÔ‚1Cf±äû.@-(•¶¾Ê…Xå%JÍ‘N6•ÇëÖÛW¼d©¿Õ0ìÊc›„íÞJ\Ãz_2¥NÂŒíùXÀ*28¢©!w#£¡¡ô;¾üeÌZQ#;`û³¦¢WXg„†Ê=]ä}’>2ÞÍ턌§4s(rE ØÃ÷T$w)± siœ¢+oƱ„£7U‘@Ï€ßAðò¡Û!«p¡Ó¢iï'o’ô=kϬV]PÝ.¸òc¿ B7Ug5 \œQûEE.††ÌGAxê$˜X}Uzá½ð>dT"«qñ7 ›ö E%ÉJÙ¹ºZŠo'qk\  HD5ÊXç‘*ïôyÌÚ) ËAtü¶êí|I°‡x,…æzäÌÃã<"¶ˆHhR¯‘ µ†|¼ai½ë±a¸H„ÜßP–Ýõ¥eN¿W VA6ècc9—]$ß]ÿ³ÿxBš»áÈ—û.ªoæÅÝç³Uk ;Wõ:–n†U¤Æ<"÷Fi¤Ç”!–¹¬ý^gþÇ–_"Á5ÀX)9ïi*¦Ž­‚¡–içøD¸„R-JMã$7­ RO; u/>cÐ.5‹vÿEòÆ9£UùØèÎT{Ýÿ„\óz`½ƒÏõX Ï]-6ª±)ÚÆ-_} ‡nÆpfþ§y~2yky~ºž}ŽŽ·ø¦nÄ×RÁ’M-àpmÈ6г,íir¢„=Z0lÈæiq&¡[—]iþ9ËÛåeO L‰¸^ª·' È`*øe¯G¹v³+” ¼@o÷yÁ¿KdŠë›ö¸[òFp‹íO¼-6÷X5ªh×ìì@q”ãÞ%StT|y[ësqùeÈá0ÀbþwÅœì2¾—8÷]EÕœo¬¥í¥Ð¡G¹ç+¢¤áúÚfãK†¬ý$i½¦gz ÂÁ„ñRøqÃù[šÜÙÀöʪMëÇÂÀºÏ¶Ã)ŠÂµDD–ÝxmM졟¾Œu0ïüE«)2ؼõ«÷ŒµtfiË‚Ç Ýyp}^÷¯Í¡‚œË¥ ¨ãÍ"óïf|b&DzAV¨ ØNîÔÓ`eß,XÂö.+kycÈ9Žì¥þ9?¤AìɱK_YHÆ@$QÐ@3è³äy-Á¤VP^›±¯Û…:ÿBú%ÉicÆL8%mÈÃóQd×åÓ·]’ŠÕà%«=åæ¶³;/¡÷PÌ}x˜€ðb@bq¾¸Ç“õ̆fŽmjÝ…ç̤œÛAÅráÜÒõ,ÅGTwÓ@ý®ÍÍ=¼[¸J°åsÉc¦¡$ФYÊÝqJur¡ôœÏ\ºÅîû¾K;©ŸJ zßš³Ôthe°Âµ*¶|‹QÜ]û•mIoG·˜'AƒÈh` Þ©À˜±'¸é F™ŸŒíšé »¬á+Ú† pcU¥þÔTÚ 4RÙ85  ˶÷I&çvj›y-w9îYã¥0¹ÈœÙ]uÄßG #(¸©ý¨nÅÁ©’Äì#Ïõ:ÏïŽs¥\зàþ 0£uçæ]ò÷NAÔÌ_óáðÏ 7îˆinè#'YÁÆ×³ÅÚVŠÑ²MsT‡Ìɕà {v E>›öÎt‘º+%`UXòò›ÊÁD"«Ûævª'O“ùû„°¦$Àpf† ¦xމâJ2(]ˆ;­õR“ ÑAE|ÂsR5zÝ( YùŸäõ™Ï´í5ÈÑDÀ^ð-ÿ {û1sq^¥Î›¼Tþº‘BñÇþÔÿ2çü÷–vŒüà™t3œ …žNxç“SLËÏ[¢ ׯá¦þ0ÛÞ1†‹«Gi £/*Æþ[,NÆU]³§¯(GºV9Áî#c’J¨ÏeÓ÷^,啟Ÿiîô–¤—vy/ôC© ”Þg‡Y 3úñ"»lù®àøD¥m¸§0¾›16ÕQX©€y”ÁãÊõ(²æ—Ùé£I‹þÈ«¬yø­g7¤Ok³+ÿ×Q\ØÕÓ FS6dµGÝ!/Œ!›ffS€m&•6âݬR˜Ë©„•¹`Ø7è'5x¯žœÚU#Êb¡@fÉ,Lq¿­³u4µ’aa4Fñ§§E{±\6E”£hÿ|w9éKd9´Î뎫êûoÔ¦º›H›a@µo ƒ¿QªÒµ/]+Á}9õµtÎÁuèT\`逴áŠ+ØRÌÞËÞÔnÓC¦Òg‰'”fvá]ÙíÑ-2 øä¯¶wPJ‘¿Øû»Ë¶+ãvéi:IeaÔ>®W„öÒôø µ[ ¯›È §W& ßèG£O:›Š9SíótV¸¸©_Ž4«ZjÞ™áë-+íßübçLEDîh›†]Øh=L6äÊ^ì¾(N5Æ`¤Ñx¯oøØÕÜŒ0J2Ç!¸¦§kNØ<÷E“ª™©×#ôp_‚º<ào4a‹ÌÓcG,µ¶ÅL«}öÛcVœö!4Žqð–ŒMåwJZN²YÌ÷X³É'JÓÿ*×.Ós =ðh-×(ë]ýˆðc»ˆlml¼ucXrW*¸¾A#EÿdÇ«ãIOf¶F¶W™O!Ùç?”•£]Øg?Ú©¤¹úÆ<â,™WÐÊ^¼žÍd¯û•ðІiŸq^ê]*¦\‚À N‘oûšÖnÚtô ª¡.w‹“ÛR:S›¯˜ûžxÒߘlöˆÛK°‰1ªQæ@'1‡ó˜|aZ¯zï©/½Ó"|ã¯Pg»ÄªÁ(Z»I΀KëÛõAl[øEº¶íæïš‘,Ýñ–?2üçÖ“{8x vlÝâ(’y‡{èvë.6F_p×^÷Ê4«'¶c^†rçtÚŠÕÚ§X®ür8”¾[ïW‡LqõÕeAàe‡“ †ŸÑ¨,`e„m}ym“Å Ép½µ-óVp欱fË?¼¥ç~ÀùiE¼‡°·ÈIL‹ˆ»û¹]$’OHîŽÉ¥©w¢XÍbâåcî8Ê?î ™p¹±˜³A?Ï¡À‰ß}RQÏòçY÷æmñ…,Ò´,-ú¿ÅŸÿ;驳>¾0o‡Dž8ÙïT‹u6ê·%¾B ‚?t>+ZËBLf™‚•ë°Ñ¾[™ùÜbé’ÿqžu€üUĽvÁ‚½;è' ÏU åYg“žï¦º”1:j³˜¯„íʶœ‡A¨rkTm¿,œN¯ÏáI+òý-õQé:ß[×Ëe<ÆÊaè×Lx4 o§bPk@Nš¬YböAóÉãÜ"âY•ŠïO»6uˆ–žL\¸Ñê³\Y6@X”—Çè,³ùùÜ ­P1&¸Ñ J^­Föž½c" ¾×§T ¤×ïäW8ª@9&Ó•œ³¡'Z‹K‚ôê^vÂ[ `öüÀÑíLˆJÖÖJOkwrBïØÀ›,§«~ Ù'ûŒ«·`µ À®5Ҧ쌴kº±ÃcþÂA±ÜÒŸÞ¯ƒÖDÆÕê2l½]÷YÇÇ 6²Àî§a•C éP[À„ –N†§àðF!ö­À¢c†âxW$µ§þ/C^ò~ý—z®µóŒ³¥IùÃ$CÿQ¸0wÓÚäA9$]$b®'‘8s†c¼c€épl¤LçhS¾R)X~=¤èû£è6ƒkC×p3w³ ÷–ƒÂƒ!u ËuœÀ`K:ÕûØ&€%9 ˜niLWŽ^pÍ òY¨œ4Î=?°CÒIÀM¯càǛЊ²¡Éš˜]ô†9;:žEJoB¨üxêëæ«ÍU·Ó&=Å@L+\ÜŸªÒ¼ûÉ1ÿsL̵*sbäÅñ ¿LÖbßù粘­r¥ãBVäøÊiªÁAp#‡0Y;ÿ9Þ#%fŒ8LÄýäíö· Óµþû^µ@Áœ1´ã¢Ÿµ¡L¶Ó}ÞðNõ¹>~FÂlÌÐϼ£9 tlR@êµÉP‰N®µ rƒ8ÐfŒ„ßXL‡ÜíÍËð^rݲ©+8Ó®1‡«jxýÚ^T$£‰ÎÒãJtÓ?Ò-«ZÈoÔüDHQVÆµÜÆ3Y\ìW}¡<’”.é>¿ÕÈ+4Ò„‹—6‰¤ÅoÊ1¼z|E8vU4ª‚ÚØôÙn•ë¦é]U‡Ës›>–¨¤„ a† ½jyt_…_qŵê^BM]C’¨Xé©T(Ve ÎhUž¿IÿD÷“ây>Šv‰Ú¤»”ÖEºSŸ_»ûã&Õ¡üxQ¸jýOL#2*÷òí?½Z‘Aªˆ¨&ؽÛ'd#›]ä¿T“»¬†¸‡Á4µ©ÜÂ4b{ç2J¢Ôú^hvŠ‘ƒëõOÕ5f¼UýÌv «¤ƒ ¥"k81±OX,+].Ê–µÈÏ£H2ßCd8ì2×zôï’“ gÝHÇ]÷aCsÐGþAJ£IÀšpÀÝéYÛãceÖôYã~{ÃzLžD ‰5ÓFí%°À”˜êK†t FEùÏ‹¼pÌHC©¡_ÜÞ’rÉëâŠg²Ð2…YxÌ&r­7=ÓªÖ‡»I†¹ù%øyžÂ" Ù‹é\•—Xèò„.m¾YêF=dTÆ®þ[«hÿxI-RÒ,jùK­\z”ÕöP±±+jgÛ0ºúÿJFg´À«Éö†Jš]®€ ¡±ÍëÐWÔè~û/î"ðrõÈÅ~®qÄÜTyÔFr¤Ö÷äÜû2å5ó’â~nñM`é \z]ƒÓÄ¿­ô8«QÖŽó½EÊÛ»ÄR>%YÊΚ͢öœÕ6§¦‘Ÿ øË“i0ŽŽ‹Áþ0V#ne’/ à yU×*-£ší¦ @ÛØIÕâx*ée¨ÒrŽãvR1Cê&º †y+‚¨oSmér?Y´÷j”ªùܳxi%ð ì†Î Iäï [‡ž?„~éÓ_¸‹+6Y§9v~*´¡JLFvÉJ Axxq•nHÖvÏN¨‰s¯,èËE׋m rj‹¼-Y×ί—W¬ßÌÏ?tó<“Ù3ÀìøÈ¢þr‹­lKŠÈo²‰ÉÍTRñK5»®ÿ9Ç ê‚„²šdôrXø°‚Ý«m{Øv)à  Ç¾„ãåÈ3¨å_¤qmzÖe‰}‡±ìm¢L¤ª¦óo¨1W' *@#ù–áS쿚Æýÿ„1W~ÏI2Ž·°?fù»DGG´4¬Y«hà¯IÙ»›Qì*“$𥉽í½ôêDN3gm¾$×¼„~JôñT7Ø¿Ü`QÉ'äá*W›TKP±òÉƭ’?0_ÃÎ$ÖŽ[ëAŠ/o3&d¼ýô­­Š[Âp¤—ÏrÓ_ý~"Ôèž™‡AÆeXA-Ÿ4à>rèÐfé"ø@ç±ï7–²³”Íì?Œï$”… Üs¹šÎä u¯h(ëaèÅØÂFT‡0ö‡ôôÓªº÷J°ŽFÎ2ÊæBÞGYÅZö óÏpÚdJj u&&ã&¦äd& cír‹­Y›gÏÒ@ï | µ²ºû¨taÊp^Jw“ëSQ4æ]†IŽˆ±“¼»]µÙ9—l€Ü š…ùü´9ÂÃ[Özl•žk§>GH±ñ¡yÿ9’èz(¶‘ö“G¹àÕ&W¶BU3ï¹é/¼»£R?ûýNË/S®„ÙòÌï­õžVj4–¸ºŠxWV\lÆ0|U+¶„"âd3FQiCÍ´Åâ+÷¡P¶¿"uк«MóÆ;ªëÌG€ÇµòØ^³*ƒy›B§-‘D€jíq$ö€q? ßs¼bRËßöJ~:°;z¤0= FåwáeN¼Ûøy²MÐTóJuh0sIl´ZUŸm®¿ÁP-ò õ¥úGܼ'ŒqVEÊ‚R>Ÿkzv¡4Ti eŽ|k´ì‹ æ#ŒÇÇ¿¤Lû¿6þOªc·ØdȆӱþµ›u}aG»øQS·©¹¨ ·cSÌ m”™i³o³FÌ( \Âv&V‹’¹\Ïm /l¼âcaçWàNKÑÒe‡÷˱†Æƒó’æÚŒòWüsd¹…ÛÑñGwõ@íÀT9ªõ§*.ΨáÊi¾Om7?R¬òl #¡/Z‘é"e TtÓºÃÑT„4­aé¨L”ïÓÿ3=W–‹¾ñÓ[€¾éš§yX²ƒ†„Ã[žMx£žx=ç°á‚§$¥6±’£-Ï”5@ù‰z®b}óÖ¸GäÎlͽü¢nX\×0uÚÍ|ߟ¿@QÉÆ|Ÿ51uÃ+WÙê®T>… ½0¼rDªËIkä`;PùÙ6cˆ„n¶*Oõ‚H¸UÄ”s>ƒàizkob¶ÒœÅ!bÞPã®›mb¢¯M0­iœ–$òc° 0ÀínÁhÿm³wF³Ën`TxoˆSUÌåx?ÿWó4˜ƒö½×*0SjbÏ‹§c¢ÛRh)Ò¦ŸîÒ]ƒ¹Äê] ÀË?[µU–xŸ]ɵC{€vK#UG•X夶¢ à ˜¶!³€©D}ËÝÀƒ^ÎÊ@ÿg‹èÞW¶¬Qõ‹¼d:€Ç‰”aY±Ñ­»A°3’¤¢š¼? ÎVÑŒ0Ô_޲úqÓ$‰°V$뢯×wÊ^U%ªóµ p è¼lˆ,ºÑ¯â$J  Ü™T4ýsH$æØØÀn6êäð$ƒÌ¶Âi¯øo̬#½ýÅ|ŒÃ¿€”²U†×§˜X÷0`=À!.6 buCí¢>—k[hí ŽÎÃŽ&*G:ùL ŒìQßzúÕš˜Êgro›²Æ×C­#ÇÁ4õÒQ_:K\Cv¢Ã.¹ê™ô¦S€Tdâ wC¢ï §³á¥øüw'°Ö åzBÞé“NªÏQ€-0— sgä,p2ù^Q$Žz*Ön€•îšVëhb¸H ƒ’o›|!äÔmo2ÂùHIa-Ÿ{óSŽ"<å轩QçŽèßÞN9KY•T&ŠƒØñUƒ'Ý© ®³¿"ÒStŠos(Dÿ ¢i!^‹q'k'ó“£'ú¢š1c‘½Á•`Þè¤$.ºŠdøü`$Q=Iýš$s\yH´46`‰)ý$¸h1oµu·×4aÉ´»žÇ§ý˜qÌ?–`>´Æ,éa‡Øƒ)Zï KÙ±‰Ñ_ÒØ‚‚&(Ï@œã‡o¯¶ÏÃp3zZu¹¡;—gdÌñ ÀKË?åDÏÐd•ÔhìUj‹ÍƒßJhí¯6é#"šsÞSÝmKÍõh4Ø2‹Ëx-¤heàúwkŸºï.hšæYï¯""§ŒÝP"°¦räFUY±‹Á@Å„aE’MáOø?UCº˜¤EµËÿ,ÉDÝfÙÇÂA;Nú»Ä =.æž6¼ã•«Û,LYhÿ]fñÜá~éïòµ [Ü-Š|ˆõ´*~(Y]‘==¸lÞÜŸL·a¡'À ¥.à:‘õÄÚÓ!ãÐã?¨³ÚŒš°Æ­úTàÅ«UZÞG|†Tò!rÛ•x— ÛMòIõÎÁ ÎH`BX3°áe!âíþDáÀêäüÊ;’‡s²9ÞkÏd†MæåX_†ÿ#‘Äø)]{%tÄ‹›¼-gú±¬ùsà (X΋¯EœÅ›{ì— œG‰µ—Ê©^GÄ#(§_Ã8ð³Ë%‹Ã"Ëßßû$yÛ¾ê˜Û‡ž«¹Züér4Õ< ©äèóÚ´ÒbH㜾ü>÷é:/=g»ÖÄÐx³´³ÒŽ„ª,²6ðñõ¼¤ÖO Y…à?wZ¡ƒë¦ø«UŒ±€ä±-³hÛUÍ•†+Û³„ºbnr'ð u)³°öJ»] ÚZV‰ÁâpëhÜVb*ôLrÜ1\Ñ»%G¿zìEò]ª°.–  ²;v°Æ8ûúÇèÚœjÒbèElMˆÎ+‹]túÐ&\TEÊÚoÝãÞÉbJ@ž¨2°7:¢&”ˆ_ªDIq›Yg×IŸ˜&ï‘2’UïN AÔGÛ4ÅKœeM¢ Ñ;d^âý,½ÂRÖ(þ¤l»0‹&ØeFØíÌÌ4kRàgf²Ð`/™–œµb*¾^X<¶wé™O8K4<œ-p¶|XS°åæœ}Ø Æ2Ç×€ÜÒ¿õÐïɱ¯¾ÜkdUÁ¦ƒ³ÕVLœ °DØ"†g+~`Ì­ÝÚÅØµ(âî-¡s1O=”ýr§úÂçy QD±"b%C‰1•þLéãqöúFmk€qÓ:?Ò¸`Ï<›—Vå›2HZ7ÇÎ!ñ¶çŸðß¾"ùZ½esÜÌðÿ4ãÌ뜑·Tœ*LLœÀq —‡¯³db7á…3Ý„YαWâ)ív–3ó¿krOñ¡ß¤¸F“?•WE>ÖõãŸyÐd`ÒÎ.mn'±÷ç+é±ÉôŠ2ß·$Ö&ℵéw?ÇE—QCK)¨þô®ØKþUJc=4Oú¬ý_Ò˜ö.¨Ö4Ýq"Ko GËiÊõñ\Cfè­ ƒáoXï;/ízndÈšÁÀyÕlÏYBm¼!½oI¯TL •„³íx|ŒY£ƒ1ÉÿÔdïì1[‰¶fzo v[ù]Õø.ı=JW„ë¼}‡ÖL üÐA9Ô Gõ®1è·Ôî„Düg<æ³Á71ENr‚>ɨ¢é1¹e–®‹;.‚Ýß ]6Opö—¢|›¿!yWMäß™æ–<Ì#žãþèGyý<㣱_É u.´ Ò®a¸÷-n¥·%ÎÚÜﬡ =òâÝ+vÜÆ í¹`wiK H:Cÿ͌ٳŸÑ1²F±cð* Â[êC´Dòú?ιòZ²ç‚êÏɤŽb\šÞ›ß2˜kÊbfÍý¶YN³®IÕÑ<Ø›ú|Ë>V ƒ„Ý|Þ‚QwH¿ñ£JA´ i…n®ýÅØïJò溕S®úY"v¥¤kDÍ‚éó¬¼>õt ÚÓœïÅä 8a9Ûõ 7=“0>Ó^}7–ôÌÒ\¶Q>SQÙ´#5àÝ<9£i¸öâû‡îÅìsžÅŽ 6maÓiÂq·*N¿ðj—•LQCAñÝ‚.B;’'î´´åpU†Â°X^{©Mí÷áNmÅI>Ú(ógïwò¨ÈSÚŽ—Ýzòfâb °yܨüm;²Ñ6~ª ªÌ)ùï²bÉFzdÝý*t‚‹B¿¡¶G²0Oòéºn ,¢,Z{5nðŠiUƒ`qÓОŽòD蟗o!%Œ ¢l ë;äÚ:wç-ÆIíŽ!pœú0Z$ŽKn{‚«ÚXùì\§¹Àî°è§ØZtŒJzTÓÌ ÔéãJ‡2N|²+±EuJ(·þº‡Ág‹+fgc€äiq:– ÏäüPžTDر•°i= •Ï6¼Ö¸Ýmeoéþž` g‰õ*f×›ÜÚÃäË ›™/$j˜xxÃvÿo1l½QÑÂÅ3>¡ ¢ÿ'ÁyTk‚òAšÀ2Qî ÜÞáÚ›ðá&ƒQàƒÄ—Ã`Föž‡ |ŸÌ<åŠí“/¾ â_›‘ÀL…´Jºþ;B…Ö Û£•Á1mi"ìÑ4‰žøl¬£'Ç3Ö%š¦âu';S܆¹ÀŠi=•ûa¹³YksÈÄX³uÖ³lm@@Õ=S{ýr¥AÒl°ý¬sïØCcÛz®a‘°2yÀ,Z$Éfˆä'ž®µ[˜´Á‘_B@À§¨k“§RUÆæªŠÑ¡Ø%—xdF -m„a»QŸØÏNÿŒu¤jƒxìåü,ÝÛ 90‚Ú [µÌFÂÉ +uÂzCÿ ´äº4&‰b»ZK17‡VÃByth¯ø£-²d`¬¬ïŠýd#.|HŸ–JKô/N-»¬Ýn:Î هçp|ø§–°cÎÿm¾ÈW&ªómªhO \›W¬!øÅ6¯f,Q¾ ©ÝHɼ~rÐsêŽe¢b¡‘ÞÓÔñ60=¥ØHÈ•ÂAs\LRóYÚ*ñ¶Â-ð4D‹pð|Wd÷»2ÖC<îâÄUªækeV1‹ÛbÓTïVòVìsq•…*ÿ3)ˆ#‚‰’r«C6n…å+û-­šg9.Î ²ÿ3³¿[£ŽôŽI*û}“z8¡é´oP`p˜ìñß#ñðF6t-Éo:a^§_ôÔ½^yÉLª8‘ø­Èw¢ÿ)ÕÚ'ÓZÞ\ójÉ`ÈþÊÑoæeUÛ½ÄËg‘p"`a‹àû¥âƒ˜5õ„ÀO!Lkº PܱŒëh`Ö4ðÁ zÏ9¯;5ýM…ãM[× ÏíÐûO×ÿ.ž_š«™¶C<ß,ü¨Ëé¹Þ¾«eç“~Þ-'À»¤˜Ø•‰+nõ§g\þ_ìßöÁ5#¦2÷û[H;¥pJf~XНësÐâÐ{¦¸±9Ó˧2¹hlèWQ½‡ ÔбÜEÒUS䈱J“®­@P¨Èß AwYD³¡Ž/T‰•Uõø ª3 vGË8«ošÐX•X°2J”h/Œ;§ &øǽ•WÚ%Ôƒ¸éü)> —Áœn›IIasƒ7YyàºNÕB.fìàFùæúž|zéN4·…ŒÐ/­ƒ^ Û—Ø\o:ñèÒ¤­©÷XÕ|L8³þ¹¢l®¿G,ؽ š<µn)£k‘(¢ËÅinpáñýºi}]CèøL_V¸þß@/Õa?Û²Ÿ·Ô~§WíÑÛÔ™Ã|ûËõt1§Âjùú=|þп>œwÏÓÕèþ¦…óì;çô pßV—~ÞžuóŽ~Ýiý½ðþªÍßVÂþßM=úœÕ~~Þ›@øMsšâ#]ëÑt?_•°‹¸i¹'ëÔOxX€ãŠÝ@ž1ðÓ1Áüðøv.0ìYO™Ó—E¼n¦ô"©½;¥ácˆBó;!ê>  vSþ¼å…†%©Ã¬¿¸Š|O¾ZÇÑš4p)þ?§öªù &¡¨Ä*…·‹åÖùÏvò¯×"î\ˆ0¨íÑÒœñGy4áé>á#Ê Š]ÌÞu;‹ø¶èˆœ@l÷¤Ø@ðÔ¿—*cŽî÷vóFð®v²{k´<³òûÞ” ¶Õã3ä- _ïà ã–V†rBrN˜À3ÂS«Ð~äo iÀÚùO—á¾l6/N°H?â;U¦> ZÆñ߆šŠÈ˜ ±Hg­"zkÃï‡p‰# Q.;—¨§ J/îXµ|йz–ãâoPø„=à@Œï9…*ˆW–ß*j;̘>šaìßSß'Î×E‚è`Z£Ø“7×"Øîÿtoµ% 4¹4³gÄÿÑ?ù i›N¥ üx^îx ü“ÍZ*åä—R7]÷Ç/øÜ+cK“SÆÐZ ÜBœþH¾f`4¢2e+µ´%†JSèEߟþl¦±‹;I)Fa*¡hÁ‰ÉÃ(Lë§Öá#5‰Ú=×]þmâ (±‡‹‰íßZ®Z¦ãH¼vôŒ¨þë>|žõ–1ÿƒå,³Œg÷bȘ9{Ìoè_äà{Y½tªrvY2+€q7>I™ÁÜÖ•¬X¾ [š´‹Äò¹l ôî›,ÍJVMFýûÕ2¼Ý²bPWN+â„Æ>hÈ~§uüá0ûPquÏ QõîY&xž®M.{Îá.­÷ÕlþîÔ>"©+'£Äê ©Z,PXËísV”š%Á7 a_? ÍßÊÆ2{¾X¡Ü üœày£§Vód*#B‡œ: ¥û³: þg0¿œt-TZ4z8ª<;³5”š¼¶:Ñ䬆9E¤¯RX‡Š…÷x³ˆøõ‚¼3szî#F•L«Äö¹=Ý×r3‡ÁSpE?ßN¸ ¬ŸÀ^Ï}¸”XÓ’¢¼.v÷—XK@;rÄp;œÓÑv_Ü„ò:¯u»ìrÞ[R_ßЧÖÝÈi8Þï£CO ¾{ÄïDÜ]]×HÓŠÃZõòO‚âû™yÙYx#Ù¤‘T}ØšcU°ŒWBx`ÂLß‘óпôØG|šÑË¥E$0¥ú„`íàW^wcøQhRÛ¬X’Ð/¥==÷([8G+|NÑzäQŒd‘ÚLiP†|" bÚÞõG¸ºzO·ÞF öô„µ+ÃsѾFy'äïšê»k[/°h(pñLWS?§ ·/æ%w°AF§CûOmŦéSït# ¨J£aÞ{¡Ñ3(ÀfX Û –)º61p™Ì6ì^9jÁ˜ ä,®†$ÙVƒ×/€)O)¸¸(mÃÓ}uÄLQƒ"ƒìkÅõPcK“Ž‘“W?ê¶üª«ga$'¼?PB PW²‰X²É%¡•EYÄÊaê1™C×_G1·ùÁõc3v( hLH§eùzG”ýëpa•sz¶ÂäkWÚûŠ\táúf-¤Ñ¨ŸÚ¡0’% Í3X>»Ì4^ã¡)®‡åŠ5Ý¢¹ ±^ÈrÁ3W¾SµììÅ̃4±*‡¤wÖ…È+>ŽMÐÜ7lÔë“Cwtöо6Éõè,ÖÏ‚˜1¶á±û¾‘Ò䈃zË ‹J.hµ Fv¦:y@­6ƒ $jfjíNAõ¥´úiŒý*¿ÿ]MXµSet=~2Q”¬yTU‰ÿ‚ÙËP†»sgõ£½=®Ú©»6-ôqQìò2L‹XÙBˆ‰syè3„%Ÿœ¾¶ªÏã€U~å.ðɘˆ•YYM¬ÉJœáiµëg]lÞ`HW±(Éé£m-áA.2#*æN¿šù71é…QZqÞžÂGÌë§ãîï÷KP†掜ìpg¿Š?\X Ge¿fuÁÚåÒ%éÝöÿ @„½q¯ôꓦ yctŒ0Í஽:KR3=äöà9âì"½Vœ ÏÍMã.»C QsŠ˜/ÌP)ff <ö ÖÕ <ÌH@Pr•ƒ§Öz”PV¹çJDä~\ñ?ÇrÞñ[j³ý–.þCcá,{“´õpþ°Ž¥£==Y4r€hMoP‚þ ¡þlbÛ ÂC¥l-Ô³ÁÍÜ¥ºüVc&1¶Ìè³lærwÈiç"ƒ‘š3º +§¥d&6/i½=t7v8WÈ“ÖðßQU0ÈùE)èUo(Ž”ˆ™«oØ =We|«!nJÉ >(£ñM{Cà¿Ë@ׂÚÎA£þ»=Øj¦,eG(P`U6UÎ^®ÐBXrFQ­œÉ1Õ®,8¾ã}5îøm©£Ï!ò ÇN\Nž©> ýŒ¤~!ÇÔYˆ;5³%8{ÐnÚ1–Ç‚Ð(Oc®]Š¢¥tÎßO‚TŠìåþ´‰9Üóíl¥p8evv‹ ø›># ätME€Þæ»yŸ½ù0@Ü*}Ïä;í´;©6ãjÀ§?6h”ª‡´L^µ1ØG§r"}Â9Kd×2‹M­ÍâÎÄ¥Ÿí£Ó|m£K2\Ÿ¹ƒ·b¸à9Ë7“ß­¯F…|=Hñû•X®xZ=•ÂN|Hð]×Ò‡³ì° DÐ} äÖ{¶\Êï©”_pDØË¬cah§[É-*èSxJ•›´Ô>EþÓÓKØ¿ÿ5™®°ƒ³™$T@J²ûΘd€RÌIoØT†ïÚ- 0æu¼˜íåäʹ+•4l¸!¤ÌÊ¿ÔØ$Ç w)bîU…EÆt:DõK\Ë–ùT5¶`Ø’£E r¯èŒJ Jú_oK¸_:òmVA«¼¯!Åbòr—–y`Ï¿tH'9“x‚‘9!½-DXÕàI¥š€ ݉eM9à"ÆúéÿZ\+€#¸âü>†|[ŽË…"5ŸúxÖ%]ý¤Š:crWáEªŠ­|Mž¡C¡_òRáy—çï2aŸ)h7D1ö¿p3spž®în¬ÐÕD)9ÄÔd†qͪj•±ÿR–recÑ»2òváÿG/ýqs@ÉhbcyîžØ¼a44 ×9ñÞBÝšð«4¸ðäÍu“¹‘Þ bäzÈÒøó²¼?%ŠJ‡^â*âõn¿Ût97uer ?jÜS1Æ6+÷‚„›í¿m€ËO¹ÛdE}w!|}ø ¬XI9¦ú FqÜÅ¢'¥$“YòFŒBƒúªàYÿ‚cE@õ±¿'æ8gi±ZÃZø’rêº22B€Öè°)J-QžÒÁa_Àxño#W6iór4žÀ8d˜ùeð¢÷k˜ZΤ™ xÿ9_=’Šx¾¶ÅÙ¾MCʾr}ÖÛ„/®Ò=²ÕädÆ¥Ê:̹É㵛˾º¥>÷]¢Ë·¾[êÌ $>çµF•DÀm¢’œZáÎÅŒè ÀP³2¶^ú(63pZj%Ì^çÊ›ÿ#}’c| ì!¨"ß Ö†ö"jbÇÂß@þ3‹Bø#Ê,[’ØaPŽÛzÙœG,¹4Ÿ‘d;‰àrQ_‘õ5òVèY]q}Ú¨Æi'îÎ5iѳfhv[ 1AöFÏVüƒ÷†OÌ)niöãI›h.S vcÇ:,IG''\”;ߤ¦8_ºã¡¢Ë‡Ñš˜Ûbß—Ê6ÏüWÈ#ô¤É!OwûšF ×k ¢ê‚ÛZl¾«ÔOk¾\#@;韌֌§&ŸÌe,sWAu }é…/£ß¾ñc„ó ËxÓqŽDŸ‚°'-#öE'RsĵËÝþ^xwz ƒêÍgl|x±ldMÛtá_u$Áà¬IÓ%ósSß"._×ö2F%YãN6 òE)Õ°b†O§ÑKp°ÑŒ eP¯ 1E@‡™Ï§sžp5ƒüÝ+lú[[Ón-Ô“[{ôœÖ l´¿;W‡ýÓ\{\ò«L¢vz¼…Ü>`ë!Sé¡Ù?y6JŒBˆÏ¶ï Á3´‚*ipKW»zy}:h>YMœ?‡Ç!² ÑðÒ3õì£\·!•FZ}wO¢}z$h—¦jìg-¦vNTWÅ ¡½xøR×ÌPIŸ¹“T0wò! O¥ ù:éYûä}üØ™] Ä×ÛæuG/MMêíó@ŸZì4”:î% Ç1‡Š¬?s“¤'m€Ð\Çvßû¡(D:ð@ÞÆÒ­×˜K®ÚSðý)=ã6Ÿ½Çð%¼Aáf7ŠFQ‰xu7S2ô¨Ïuk2<¢QxÔ}Nƒ¡¾Kü‡À€‚¼•F´†Ï§ÏÆ!h¶o&Ë—I£Ð ºbÚ}äòTàÐYˆÊåÁò]#¬§µ±#›Kd#Öþ65vº}Ú´`…%7â[‘CdnILvôžÚ&¸øÿ$*Ýsûõ ¾àªÇcÔœly"À;·Š‡Y–‘È’ÈfÂDPQÚû©öç©'0båV÷²äí׊gxc\ÓdÕ,:Ãtoè äìL×ÞÙ4gIð÷ÏúÅim­DÆŽ”ë°`>Ãa¼6\Á|wëPmZõ¦xµó!Ž41’;:wž¯t©¿¢Øú(Ýl¹tQ>ä»(\™g:¯E}]˜ipˆ›Ð鄚ðlmîãèöÕ?¡07¨›ZùKЧ…àÞFƒ˜XJ ùY±jL²ÏL=?kžtÁí(“³×ëøAb2ÅÇnÞË)6ÜK+$ÔV‚Ë¿‘?:¹lÉΘÎɬÌ|ŸSª÷hÿj;› ÅÈã*ÇŠ •»ÕÏŒ÷žîñ˜™ü¶í<ú_ñŸ®ÿ®èR·†ì¸nœä=P/ÕØO×ÅJn ßÆÆÍEŸ‰O‰p†Nœo’!«]È®ÅSå\¢_(¤Ê`¬¿2»㨮ÊÐxéó{9L[g"¾sƒ¤Š—`ýõ×\fi?Ý0˜cÆC™â¶IçgŠ —G}1‚é¨ôØÚÜB᫬OL~¬¥ïµó_fcpÌè! $4V«¨å¢d—P+ÓZpt[¤ÄÝůÜq˜Á[7–­xÐۅ͆ޓ—ø…¹0žN r àÁüûhUÇay"áêˆô=iU?˜ü·°ÿIöJ9U‡ðƒq}!ÌïP*° äBD§TëßãÄRY ?ås8ZŽ¿üß̼¬"¥O2‚’-NË!¾& 3ÎPPÅùÌ´°[àۜűÂày•”ôr‰n?ë¡UН„£J—B¿Z{¿ãç Å³v;>Š|µOKüVù¼èòl3x¬×+$³åEq6Òsµp@`>z›‹GMuYˆ³1ƒïR¡p‡‹»8€`2ðƒtàU5iïÈ.²bQ+³röÂB8c7Q5?rH0Ö œú®üÔZ¨'ºNM¸N}¬Ñ÷Ì,¼×péJ¡é]9ïᢜòˆrÉ?ˆ‚4Ý“Û$¨1A-¨»û;Ÿå<ß·¦¶¢^Õ=YVÝÉM]yG\dÊ'8^Ñj¶R¨)¬aƒÌ©å©þ„\i‘½X>ù-?úeùC!²à÷ÉÓ$<(ê:—®çµÐ‡¥71:C‘ïÀ/czcïT¦‡VDZСƴٟ+ a4Vãx^ L‚¿ežªór7]â4f^ñÁúåoy[¨2EþDöbôïuŽç^Ú?GeÕ›ÿAcaß"4yâ™#ŠðݯJ÷sg•[Î]{¸ÂY@:茬):n«ÊÁ;íw©$M1²]ÃË“kž¯²©Ú• ¤å ‡K1š%D¸nq£@rþßIçþÙíî*žë¿ÜjyØ…†±B‘`±9Æå·ïÒñ$Þ¼|’«&]µˆÅc8!a-λÖƒX&4¦/ï­ßœè i†ºCE fåÓ? uÝ4t Çs!3Y]}n‚/E(ÌùT03£ÞO÷ÆJê=€ö<öø^÷f¥ý\&+@ã¦e—ˆ°[¶©©tÞÑ_Ä>¥•Š¿!H#”Bx]ïÆÄl7çó·ê˜ád OHG騆%Ê)Š×Ôÿ>q¾M ŽÂè8‘\u¯É?W‡Dm•0%‹ƒ®”Å›ý›Pº¤Åôñ8¹ÎÙn w9e’d©Çu HÀX›Œñ}né X\^†Q2—ÁÆ­ ÆC}gË­†Dóàµ@WŠ˜°y…—úsXÄ- ±ùô0ÿc l“†ùx€?V§´¯àõ™Ì¾.º…!,ÀÙPak$J‰ž?!üEò3ºd'ñÇݸõgÔvc^a_³Ó÷Á/vVÄV¾A Âò÷Ãö#<* Ï´Ä¡j×S!)ìp„kÏ·Ww“XÜ=Ä^D%YêùÌ?>©ü×¼^ÞQÃ]¶ZnNº{†U®2_>t_8rcšwDÑ!qÍ`•.ØFa¼G—®Óù®Ï°*ù-¬©w÷•ˆüs_NgÜàŒO,gšÿP«l¶Fš€lÿ@.:M]}\„óS;Z¦‘àQr 9=ª¤òa^ ö»Ÿ£ôŒ,7[랦ÞI\½30éÑÆ˜âm O}‘)YæúÂæ£’*”´«†Åo S&ƒ#Óš[¬ƒµÔ>Æð}$ƒÞã¡:=á„yñ Ùtvÿ·ð¹ûâ†Ñä=ëÒ8@{ã8aÈ®°ç¿ú¿žð{Œä?¿¦ì¿LÐc9 úÉ­æÕüXŠm·ÚŨâºï æ–çjtßç,zÉp ”œh+ 2 KU´ÒEŸuaëò”¢ÕIÀ[ÒMx³òß„!A1ÜýÎ< ø–¿ZÔJ\é5f×7ÈÁAH/à?‚IižiAÃ/ÍFäT2zS#Æ"óÐI²Ò^œ`0èqIá€üÙGvé‹?mCœ0¶½ß ðI°¥~+né]+ƯY4ŽL’á/ÍBµ¹ÆÁì\§™\•wIÞ,òm¡zÄE5ýC$•(#3øør 4 dËkÓ šÿ~Pl`-ð*]ràñêÆ´…2‘òh§/.ćÖÄ; N˜>¨eã\Cx“Du„T‘+•kZ#)vˆÞ¼­|zµ,óYÑ(¤O¢RÚõ…úÀÏ£D¢9¿-û!–-íë׫ΩRæE}WiT¼Ö+I4‡iAÓðñæÇù &„…iQWy{Ó—rÃZîÖ[ÎÎp «¡¼Ìóê‹~À¬]bIŶѮÀÜÄEÇöÄ• 6컫n/”„È q„žI#¶¿ŒiÏ M¤€‰ôÌÔ?ñuWS$5õÔ‰3òœ¼8O\û¨¯±®®üùDÌ6]áYãæ"l1®<+ Ï…ö®+ì}r™ ŽÞ‹ìy•m«ä¥&«”‰»¹ŽáîÒTÀP„zœÿ"¨¼Æ&KšG<·ÁdõÕ”"y®~øëŽœÓéƒÒn †;$yƒÏrlý8=1nú…¿õÑÝ3°ô$'OÿLÌòcÓ•)f—¿id%iWÍ Ñëi;•þ‚y PP¨×IraÜ ù²ÇdÈ0ÿöâ=½7Xà[0Q08³Ç¡dž±Õ9:_‹,Vg¾ãRšŠM¯@£Ç¢Õ¨z¿Y_lV»¿"ôîV7ò‡îTw ´ý3¾âHq)´rÑ}®=ÖÄU¿߬Š M•Ñè‰[¯ÎˆGèÏiê4÷àl¤½à”®&:Õ*ÄÔqZ±OËÀU^\Înì9§®Ðpûµ“ ÙE¸ïšÉ€T‚ûØ9?´ÁÏä~Së,‡&z‚¿™¯n“ö»!0ŒA å «{¼"å Ð$¼ßNЏ\LZaV‡ÌÄޑζ ý‰Ã½=T~¦)­Â·Tâ•ÝŠŠ9TÉ]¿Ë5-uAOHBö7ˆ~––n¹»D(3Ë ”ù­3†,âw¡–Ó†¯È"wÝ8±e£ÏQÄÿ+kX™QùófÓ:NaÁ áêèåëΞÛDQxs¡•˜7‚ª>áƒg§®ݾ“1½Vàùβòt>ƒJÔD ‘óv¸‚ Î÷¹Ò¾6ÛèhÂNnUTÅS!Z½Ùž“ÆÌˆíLRL®šR¸F0­±7–¤HTjv ; ƒ˜;íë´·ô"æxÀæá÷Dœ`/5%Ó^tã!ƒÃçÖ[M¾´éÞ.ç¡õšt4™ ÷O±óéÀ¨^QHë¿éF@¦ß²'Ѱ¤ó2Æ·¼åÞ@¤¬˜ùíçöµÉjs=V£bŸ$e‘,üÆ»»!n:²C;Û1¸|PJeWð i=ï’™UvuJ_oyéŠ>‰[bV¯-ÂHšUË¢wþsü‹~Ã,RæyúnßbtéÔÅó´ˆë¿»(РÆF…Ÿ'˜=–­9ÇOÝ\d=o­2Ý28c¸„ŸDï»%\1er>£W/¾Tà´¿rXÕÞX’xG§9Ö¥µmúŽ¥`!‡$é¸õòp?^íßüœ×CKºz%NÙ¡Ék4ÑüZM.¿D!Îf ºph4yÆþ3B`­¼(¤H á(RÍ#yžo䣓aPÎ×ÇgÂdäŠáV©¼"_’í¥[S,ÇšX8Œ9Ûòè¶ o·Ë!CŒÿ T y²Ð³u#M÷*Ê_ŸÈ 1WÅúx)KÿÍnG0œHq‚£ô›ÏìJ]à ƒ*Šu2tùŸBiA I!WMrîÕþk+ÏÜe˜©…†0ðœ\]ö×Vò“£¢‘G˜9nsÐMa$ð±Àñ%%‡|6G‹çñŸ6)’ú÷á‰ÑÕ¦¨Qý•ÌÚ’¯®ºP§|eÞI6”«dà$67i"½õ?­›`"y)¾Ý{'áši q5î¹€ÒÜ’hÅ~4ÀyÆÐ3{I­ÀËÅ5ÍZD`Y$Süâ¿ÌªkNì?­nø~ôoÌÑ«g˜8äïÑݾCô‡S²K‘Ìó®¸ÊJ´.LÀ4ß²ƒ¤/yѦ¶ˆmwËCÕ9j4;ÜJSYh¿´“—ÎU^ça‚y-Aw¥ëù!²¿?âñ~¼¦(ú²“nð9q™†À}Öæ oëtKúÍ{´$34:DÛžk’è1Jœ;ôtVOˆž¸½” µzªä*Zà¡¢m n6»lÕžZ›qÿZ7ÏgÀ¤bàÎãŒÏæ•ìN~T›£K.‰·:}Û%]ã=ZK ²»‚2e„/7ÅEWÁåœàE" ˆ4&’„†¦E¾Aˆ:’Ý‚µnž¿,=ùî…$×¾Kq5±F ÿê?„C3ß\¼,—à6 |±tAÌ;ï2"9×Wª¾HÖ*þª©"íV óÀ0UˆÔ>ù ÎPB´¿Ž·²NÂ)²ƒÙ»÷þ°-*áKüãfßò,èɦ—›À ~7'N‡7È¢c²Øu6ä¸zÿz»éAÌ¢ U¤î>)G Â)V=(жٰìe9ºý“ùË_ÕšÛf$Dfo3ZÆo³ÄK“çפZö®8Ôé ‚njñQ^^åÚ´:¶•NŽEa­3'ҥ¾KŽÁtX<µμO°ÇŒ0õwQÌ–»_Å%I×2%¹Ï•€9¾/+¢O³»“H=Ó Õ'6=ø)à¯Ýž¶á’ú#Wì†0q!†¦m ;Õ®PÃÀ»&Qc~Æcš'h7¬$.*êðM`ž8©›,É»W©h,må3]=‹ øÿ‹ïn*)´€ø¤òAWy8Á=(_½Ò?ìß=|`>•üóUaü,º0®p#üûôã òhBcÅ íÒïs'õíÔ ²°'ÇêzèÎ:4&ŠVú”Fª“ÆvV͉æDC¨šwý/¸MíˆÔÒý)mÿóÈ[èÑXqš5¯2ÔAÿÚ•YÕ7¡C¦}»}ƒúÂ¥_Š€0;»™g”y&¦im.ýÊ0l~Å—Jýg2²GB uS¶·¶ÓÚ{²ÄÅã£ã«ÍàêȹÚð›†J8üUn/Þn$ôIàorCô‘`×øÇuÆÉ¢;`¯‚˜™jÚ3×V²¿›ÂÖêHPù˜$©wn¶Úel].·ÉÆN "ûÆ>@æIx¢=u^ß¹õˆi/ó£X™ÚŸlA·â“poù?Z²c‡ë¥# ©°dJ«ÛY­;úƃîêCmñËù/€ÝΔxy<ÅèµJ/Ó¬ctòT‘F@=6 åô»|b¸}AÓ\Dž¡cÄ×0¦ˆÉ§wÝ’”–Š+Ž…2~é‡^ÅCÌG-C5T¥Ö¥{DX*½ãŒ¢í˜K}ßÔ"µŠÞÉ8g±Ó¼Òz¯Bmn~¯öÑ"´¼œ¸AíA6¥þÆÂêg’cxï}üÖ þ­/3#²¿oÿM?µvHl÷G{àXÕâ& §ˆÿpmZðÊ—¥=öªˆ¥ZN9Í…?¶€ Îš©òí´ßV‡9G?Ï£ûXÁ«#—EôhjØß?“ßt†ôuÝAùŸ3PÃÜihÏ´ItÖèÛTPó{˜2¡_ñq³ÐçHÿ} ]ûïþ2Lu£(ÜY6íy0€õûVEVJ¸F†:€‰Èæó(#‡Œî†¼ VúÁ—$nß M— ;œV¼øQhRÜ÷a·`L=©#øM GÿuœˆKtRˆ•*œµ¿HýT¼ŒÞ#8=ûB`– ë±øWñ¤x&yòS$?JrÙe9K;· qáë‚mÀÄU¾[±«Ó *dC-qÏœã-séÁæ­WqÂ[:h“¶QõãJ H¾3ÿ'^Á­úÿ:ô¶fn+8uþ1DÃÊï=ì—‰ºZò(”4’OðæGRbºÌ0R~²ÈÜB«¦äß&û׸3¥0Xmæ–ת\hn½X{·š3ÂY™t.mЉ¸7+ˆØüÖØ~9ò»6<9e .jF´Ò#ÄO‡ƒelà%›ýßæ_n¦?‘äü ú¹ €¬cÇ&¾ÔñÁ€ ö=¸£ZÈŽZàŸ>݈ì’f>n{Õ¡æŠé ¶]crãñ1:3¶öüòdb[ ²§mÀº¯õßÔùH tÁÄ ØiÌÓÿ ·¬jÍÇkãºU\F†‹]_QDu' …¹Ó€ƒ™³·1óÖшc„‚²tgZ8ÜæݧsYrÞhÄHêá2‹þ?nÁÆšBô¼o ¤aÛДû]>˜~§Xñ€_Ý,!ÍgâÕŸ;±Ø´i„MãÇzH9ö G$ëc(“㚤åäx³µ`ÐyžýYÖþsEÞ·èEîý¶‹u1(MÉh”yÐ ö|m;Ïo—ú²¾W­Ô|å{š<ðÒµP@˜Æ+#÷8V6·•‚E<å‘u’=Y³ä…¶me^ý·ÃžVöÕ½œo'ÖOît£Áü–Z µ‚¡¹{̽8ˆ€zw²XG|×_¨%}GPПÿO.ÒoèùãÒi'R—”‰'Ê)"ÎæIƒLYÿ~.¹ìC„â4Y[iŒ0œpû­Ž=¸üÝ„þ °83(Çè‹áNÊ}®ÔoŒ]GŸx¤”`óz§ÊOoÅLìrTFs ÉH^À°\»±xCÅ·WÔˆ÷aæ¼ áº%”qÛK„à*¼3ËénPQ!£pÙ5,7ºaúÆ>«`Ší+‘ߘ µqD½yU©7ÔÞ.u|*‹AJþ~ÖU:…°%UôÉ ëå3"²a³…ç–ÈVBJê~À‡¡™aÎ¥ÿ-/R§è|DçêE¦0r;–åï•ka [ÿÉý(4¥´xùi:ÇîËX,ûÑײ5:#e8{qñNPŠ‚Úü*5ÁÃ<^™2ø²“  !C+Oõ}»ª6ƦZ¯¨ÔˆÔ“5ÏOœbGôû\„ø-ÁiSòÞ[´ú’Œ‡´¡\Ø^¡•‚†˜Xß …žNFþ2åÞòAé2¬º.J>± ¦g»j*õܰ.°Øztml|ñîlµ¾ù(éè»zXóðK+-yÞ@ŽŠS®s‚üs9jœ)ôÄ…šfAfɇpe>M©?gêpº¶,JmúXòi „Ø®ÖÛUíßW/2ìÇn2¦Ùn#vÕŠ"Û2MgˆL«¥ §) „¥r*‡ùW°Þ±¸ZÔ”Q.÷šÃjH²sà$­2uF»WîèÚ€º±›ƒDt× •ஂ%Å·ˆ)¶Iz*£MD$µr?üž§M%ï–¢î ”/bPTæ%åy0tµõ™jKÃèþÎ MrRh6f~5âÒßÁ/DK¡Ÿ¨ÁØä–çûÌäJo)Nû¥ïAŒQ³·†´Un™y¼`Î-X¤bö°×‘P ÷î9š˜É ]nHcRüø†,ï¡ÞDÅ+Õz¸ÿ-Ä­ÊÑ&^\O<'{N4ð˜ÀîÍ27@ ‡¿nÊ‚™iApÄÛ‰c× Î>ÂeqÓÿ"'œì &$&ŒèyŒÍV|fZxp²ÊÞ2’¾r Cv‹<ý=ó=‰ÞŽLÞßÕ§;Ö,,t‹u"ärÙaÁh8\È« ü²uQö©¤g~òn½¼K…ð¼ _6îÄLr¦HÐqI¹G“"·ÇâØ¯¡vÖ!‰…ô÷NÒHofû£E–ÍëB§ *‹i‚Zßq®ïÆk²L.öǘÿ ê:¸®¦¶*>]ÊZÝŸÉXÔ¾:;…þØE{e¢Õ 1/|êó!P ¢D‚¹J8y0ugŒC«ÐéihVÑ!‰¾cFƒ‡!¦EŸÓh-°ÉýAË<½÷Lkq±“Žu¹´âšé?j]ç׎¾†R¾µtËJIÁú û ¦h_I92¡¸OÂäqhý»óÁ^ÕÙ()‘ôEÄ×ã V®Ü7ÑYçf]À&Á›7ÏÉŸÛÄñµËÿJkd++溂UhÕ±4go‡¬n*Ç<îÊi ŒÈÝ3ÙžS@˜+ï'Ò9åz÷)F’Qëß4ßRæ®`çÏs¹<˜Ÿc“ÁoܱìY10cÆwM–ºAô½ë¯¹<ÞŒlÉ7˜‚PÁíl³’g˜×¶†» ŒÃ.é6Ò?ÖkäX^.…å9ü‹¶;F´Äç‰ôXŠfuÝ/öýhw¬o0ã Ý‚q›9^EX`^¨Ü}hüQ&‰)ZÚÇ(WùþKùNu|›„fþ“‹ì­žkX½±¯ÃÞã‘;jÍ“ösV.Ý’´i²uÜì3˜„D.Áׂ0ÕóráœÙr¬tx`ùœñ‡khw.øÔ?‰ü/·œÃ5ˆ47¿¢…ã]'e.Tÿ4E'»_£øj˜ÊųÂÙóskܵw‡µŸ@€ÿ.½â`A_,—r¹Y É¿Øüp6Q”ꤣJzy™½ê™ñêá å-DêÓ980“F,=5C¹+¯…!‚8þ_©ÕSPô¬š Ñ"$"½ºÙnÚÎ’:ç× yö”·È1ª€œÙU¥>Ì!vC•@:<¨Ü.[¦ÖÎÖ.Š_‚§‚jùÒ™òË6L¹6.9GžPZNýãe¶CªªËÀ&ü0¤¼ÿ|Mýèž1“ŠƒÈ°·áÁѼ"5¬ä0ž³Û®IâH‰†'·f•<•‚ñÅÞÊ#¼¸´ f+µ«dØâéOQ)ˆ¾–¤AMËå2ÓÅÒ¿m'RiÓ™»PqhÏþƒøÖߪµF˜ÌÐÆ"·Ìýò~eç×b9¦»'!Ø0‡«4ù9úf'R¯Ã³Xdóî¬Nó®I.-¬;'ÆLPËù 1iû¹ò¾¾ú™@µ²DœË(sÝÓÆuD4IŸÜoÀª„\Ôö£îç-t*Èz‘[Ö…“–.dš¨•vQµG]ÆE<ì@Ÿ:[Á‹ú7ƒ,‡ÈܸóT±»Š ŸCcFËåbw][` ¡Ð‰°*Zª9d†»ÕKQ¤[Z7׫Á2Þí-CFÇ‹8N‡oåÁ¨Å5èKyyW®ïÖœÄ-‡¾“ÅèÛúÏëFÇuCKÅ#è¦/øòÛO.ÜE«tÅa$|˜)÷y€<`êÅ2‡äpPÖXÀ§ÁÖhGoO‚Õ`¿3ügeºYéU(¹…#»ÉÔ@ˆvÐÓûpg-|¸¯’â*îÕ}HFoâ žAÅŠœhúnñçD¨mßU&«É?Áà ݘË9‚†¸éµÂbëܘ‡‹7êÇ#YBZÂO…bÖ¦®ýÞòÑÌÉpV !Û/ê .Äk2ožíÅøOYOαÈ&P.(ráõÆä”˜Cè-Mºç‡úZîŽ úÝmå`™–ê$¿d¨ŠtÎŒ&á²Ü;ŠiËX0Âê! ao¾zµh6"GüJY¾Aʈ*º£8çhö»-^Ud÷Òo°8ÄdØh!{†vbþÆí[PŠ_Š&Þ'öHÌ•°ÅǼcmÔvœ¶ð^xBHÍøò°'‹Û†Wâ—‹:ºØ|”Tk«j  !ö™¡ÝZ‹Rº ¢ÅÎh"ÅêU~ÆUì/¦s•Ðh=]àu¦oˆ³“ñý¬+»ê³ï©®ú†ÛPoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßSp¾¤Ùk½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5¸_RT¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸKáÎÙ&‘ä,i»÷™‚-Ü;+¥åʃÒ/ÿ('qðq¤œ+¤™–å†ÇŸQ#˜ŒYYÉl!ˆ¯M+ÛšÞ[‡LÅSjÅìkž‘¤¼YæãGÉØÆ…Ÿsø‘ÔxŒcÃÙ¯DÐ’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù\zéý( ð€ŠÄç¾ ݧjp`·0*]¾ÿek.¸T1)+§{4Æ?~$(Ô)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp5K˜4é$æZ…N'›È¸Oadz§5†Ÿ”ÊWq3 p6 îáCÙõ­I„„Jû;ð¯üžâºÐÃøÐYòó^8¢5Ô ùÐuÓË2]¯ ª©˜+V 1;›JÆp‚}E’ÜrÍ›¹):ŸµØíÔgeõ¨Y,š‚ÀÎáó'šï]è¹Êèñƒcg®êÏŒ´<éè{+óþ)‡rÜ‚÷Ú~£Höñ¦\ìVõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ð‚µVD˜êÅ.~…#D°CoÛé˜4™Æ‹‰ã¼e Qn¨Ž¥QWa:XJÎi¹Cð¼+‘>#·ð»¥òßù²‡'e ½­…>?ËZðæµ:0i’§æ-Yÿg8-EhÍxòx×Î/ÄÒvŸä ;ÃYo…Ÿ§§pÁ©ƒ.•K]goËLÇ´˜¯{ Ž—D¹hlLñbT¶·Ñ8ØaÅ+^²¡ÝoéÇè4uD/öÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘ Terminal 4 4 TRUE wnd Reset Width/Height TRUE rewh DLOG 1 4 2 0 173 20 96 96 20 173 116 269 Save s TRUE save Font TRUE TRUE Font 103 TRUE Show Fonts t TRUE font Antialias TRUE anti TRUE TRUE TRUE Tile Width TRUE Tile Width 104 Tile Height TRUE Tile Height 105 Game TRUE Game 101 New n TRUE open Open… o TRUE open Open Recent TRUE TRUE Open Recent 102 Import... i TRUE open TRUE Close w TRUE clos Nice graphics TRUE Nice graphics 110 Fit tiles exactly TRUE ngfi Just get 'em square TRUE ngsq 16x16 tiles TRUE TRUE graf Arrange in Front f TRUE 1572864 frnt FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE 3 -2 1 -5 0 0 443 360 DLOG 2 4 Angband 1 20 124 403 21 124 20 145 423 DLOG 3 7 TRUE 20 170 403 190 DLOG 4 7 1 1 2 2 TRUE TRUE TRUE TRUE TRUE TRUE TRUE 0 0 403 190 170 20 360 423 170 20 360 423 0 0 360 443 134 467 494 910 0 0 768 1024 Minimize Window m mini Terminal 3 3 TRUE wnd Angband TRUE Angband 100 _NSAppleMenu About Angband 0 abou Window 109 Minimize All Windows m 1572864 mina TRUE Angband 0 TRUE TRUE wnd Terminal 1 1 TRUE wnd Terminal 2 2 TRUE wnd Terminal 5 5 TRUE wnd Terminal 6 6 TRUE wnd Terminal 7 7 TRUE wnd TRUE TRUE Bring All to Front f TRUE bfrt 8x8 tiles TRUE TRUE graf 8x16 tiles TRUE TRUE graf 32x32 tiles TRUE TRUE graf Single TRUE TRUE thgt Bigtile height 108 Double TRUE thgt Triple TRUE thgt ASCII Graphics TRUE TRUE graf Bigtile height TRUE Bigtile width TRUE Bigtile width 107 Single TRUE TRUE twid Double TRUE twid Triple TRUE twid Graphics 106 TRUE TRUE Item TRUE TRUE Window TRUE main _NSMainMenu Graphics TRUE DLOG:about File's Owner MenuBar IBCarbonFramework 472 angband-v3.3.2/src/osx/English.lproj/main.nib/info.nib0000644000175000017500000000073211651552410022047 0ustar chriscchrisc IBFramework Version 762 IBOldestOS 6 IBOpenObjects 29 IBSystem Version 10D573 targetFramework IBCarbonFramework angband-v3.3.2/src/osx/English.lproj/main.nib/classes.nib0000644000175000017500000000034611651552410022552 0ustar chriscchrisc IBVersion 1 angband-v3.3.2/src/osx/Angband.icns0000644000175000017500000044337711651552410016441 0ustar chriscchriscicnsFÿis32ÿ×Va]c`_``__cX†ÿÿÀ„AÿÿÀ}p  aiÿÿ¿Æ…ÉÇ‹9½‹9ÿÿ¿Gåÿþþÿé‡>ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿÿ×Va]c`_``__cX†ÿÿÀ„AÿÿÀ}p  aiÿÿ¿Æ…ÉÇ‹9½‹9ÿÿ¿Gåÿþþÿé‡>ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿÿ×Va]c`_``__cX†ÿÿÀ„AÿÿÀ}p  aiÿÿ¿Æ…ÉÇ‹9½‹9ÿÿ¿Gåÿþþÿé‡>ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿs8mkh‚cèºD77:Õ’bÿøâõøÔ¿ýåÃÿýýýþÿùI1÷ÿþÿÿÿÿü2Åü¸ÊÐÕµÿ…¬ÿQA£vi[™ÿ5Aÿ}pý¾åÿÿ’”ü5ÿ‡ÿ?æ³ÂÝžö’ï#ÿ{»ê£ÿ)-ü¶¹ózÿK0ýñòí÷òøPçöP<|H u‚):ÚÿÌ‹ˆŸ×Ro½åëÕªEil32 ì€ÿ€€€Š€€ƒÿ—ƒÿ Š ƒÿ " € 1ƒÿ€¶¯>‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_l‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_l‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_líþÿÑW#IX[rzjiO+¤ÿýûI×ÿüÍ3 Nz„XWpi³ÿþÖÿøë0 XÀÿÿÿÿ½ÿÿñ ìüÿWëüÿx eîÿÿ»ÉÿÿúùŸÿý¤^ÿþãHöÿïn!0ÌûúÿM`ÿÿ̤ýÿÜÿÿvwÿþíSÿÿÓÑÿÿQhÿþÒgÿÿ³lÿþ· æÿÿ5¶ýÿ‡ •ÿÿn ¶ÿÿzìÿÿ5Òÿÿsäÿö/<÷üô$ßÿÿRÃýÿ« žÿÿÓ.Îûÿ‘½þÿž~ÿøóqU¡ÿÿúädoÉÿÿÑ~ÿûï,"ãÿþýïÿÿòÿÿþÿÿÿÔ4&öøÿÄKÏÿÿÿè–XÓÿÿÿç§7‹ÿõÿ¹Ee}sO)ayyO ¶ÿøÿÞH $H^¡ÿÿÿÿîħœ› ¬Ìõø8jÁÿÿÿÿÿÿÿÿÿÿÿÿ…$j£Éçøÿÿøç̪}90OaiiaP4it32P=ÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿt8mk@ còd†ÿÿ‰0 8ÿûÿ°”ÿÏÿùÿ×/»ÿÿ|xÿûüÿôa3Ûÿüú+"óÿþýýÿœ _õÿùÿ¿¢ÿüÿþûÿ×:—ÿýüüÿe9ÿþÿÿÿüÿû‡ .Îÿûýþÿç³ÿüÿÿÿýüÿÖMnôÿûÿÿûÿ¾)@ÿþÿÿÿÿþüþÿºJ*¼ÿýýÿÿþÿö(ÿìI¬ÿüÿÿÿÿÿýýÿÿæ¶m&46. †õÿûþÿÿÿûÿœóÿýi/øÿþÿÿÿÿÿÿüýÿþÿìm?vªÑê÷þÿûñà¿‘[&8~æÿýüÿÿÿÿþÿ÷+ÕÿûÿxŠÿûÿÿÿÿÿÿÿÿþüüýÿ¥B ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÉ{(@¨çþÿÿüþÿÿÿÿÿûÿ’ŸÿüüÿyÙÿýÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿþûüýþþþÿþþýüûüÿÿÿ÷·E§ÿÿÿþûþÿÿÿÿÿÿþÿçgÿüþüÿlJÿýÿÿÿÿÿÿÿÿÿÿÿÿýýûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýûþÿúëÿýûþÿÿÿÿÿÿÿÿÿüÿlBÿýÿþýÿRŽÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿüÿÿÿÿÿÿÿÿÿÿÿüÿ¾&úÿþÿýÿò3Äÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþÿó.âÿýÿÿüÿØ áÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿjÂÿüÿÿÿûÿ«5ïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿŸ—ÿûÿÿÿÿûÿo9äÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÁ bÿüÿÿÿÿþÿ÷5®ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÐ3ÿÿÿÿÿÿÿüÿÉiÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÅ âÿýÿÿÿÿÿûÿ‚ëÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ;°ÿüÿÿÿÿÿþÿû8’ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ©uÿûÿÿÿÿÿÿüÿÂìÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿü.6ÿÿÿÿÿÿÿÿÿûÿo_ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‚ÚÿýÿÿÿÿÿÿþÿëÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÁœÿûÿÿÿÿÿÿÿüÿœÈÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿåSÿýÿÿÿÿÿÿÿÿþÿ>ßÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû&íÿþÿÿÿÿÿÿÿüÿ¾{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÙ±ÿüÿÿÿÿÿÿÿÿýÿX ©ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¨ Fh{}pQ, `ÿüÿÿÿÿÿÿÿÿýÿÔÅÿûÿÿÿÿÿÿÿÿüûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüþÿÿÿÿÿÿÿýÿ…B‘Îõÿÿÿÿÿÿÿúݦ[ðÿþÿÿÿÿÿÿÿÿüÿkÔÿûÿÿÿÿÿÿÿýýÿÿÿÿÿýûüüýþþÿÿÿÿÿÿÿÿÿþþþýüûüÿÿÿþýÿÿÿÿÿÿÿýÿj dÒÿÿÿÿýüûûûûýÿÿþÿ舰ÿüÿÿÿÿÿÿÿÿýÿßÓÿûÿÿÿÿÿÿÿüþÿµu±ßúÿÿÿÿÿÿÿÿýýýýýýýþÿÿÿÿÿÿÿýä¾ñÿüÿÿÿÿÿÿþýüDJÖÿþýûýþÿÿÿÿÿÿÿþýüýþÿðwZÿüÿÿÿÿÿÿÿÿÿüÿz ÃÿûÿÿÿÿÿÿþûÿäW -U§ÅàîúÿÿÿÿÿÿÿÿÿüðãÊ­†\34Óÿûÿÿÿÿÿÿýÿâ ŸÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿË.èÿþÿÿÿÿÿÿÿÿþÿå¢ÿûÿÿÿÿÿÿþüÿ­ -:FQWYVPF;0 ­ÿûÿÿÿÿÿÿüÿ·Åÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûÿô[ ÿüÿÿÿÿÿÿÿÿÿüÿ€oÿûÿÿÿÿÿÿþýþyŸÿüÿÿÿÿÿÿþþÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿuFÿýÿÿÿÿÿÿÿÿÿþÿé1öÿþÿÿÿÿÿýÿ÷V,AF:ªÿüÿÿÿÿÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûÿuÕÿýÿÿÿÿÿÿÿÿÿüÿ€ÂÿüÿÿÿÿÿþÿõG[«ßøÿÿþîÃlÀÉÆÇÇÇÄÔq Ìÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿ^€ÿûÿÿÿÿÿÿÿÿÿþÿçnÿûÿÿÿÿÿÿþÿQ|äÿþÿÿþýÿÿþÿÝLdÿüÿÿÿÿüÿU0ôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõ6(øÿþÿÿÿÿÿÿÿÿÿüÿ{èÿþÿÿÿÿÿûÿ€Vßÿþüûýþÿÿÿþüüÿÿe¯ÿùüüüûÿë}ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÏ ±ÿüÿÿÿÿÿÿÿÿÿþÿâŠÿûÿÿÿÿÿüÿ¾¥ÿþüýÿÿÿÿÿÿÿÿÿÿýþûúÿÿÿÿÿüÿ¸Þÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ…Uÿýÿÿÿÿÿÿÿÿÿÿüÿpíÿþÿÿÿÿþÿõ/.Øÿûýÿÿÿÿÿÿþþÿÿÿÿÿþýþÿÿÿÿÿûÿrrÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷, ÚÿýÿÿÿÿÿÿÿÿÿýÿÚ€ÿûÿÿÿÿÿüÿ‚Dïÿûÿÿÿÿÿþüþÿÿüýÿÿÿÿÿÿÿÿÿÿþÿý1`ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¦~ÿûÿÿÿÿÿÿÿÿÿÿüÿcßÿýÿÿÿÿýÿßAõÿüÿÿÿÿÿýþÿüïõÿþþÿÿÿÿÿÿÿÿÿýÿÒÎÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû0%õÿþÿÿÿÿÿÿÿÿÿýÿÄUÿýÿÿÿÿÿüÿp-íÿüÿÿÿÿþüÿæ‚8"_àÿýÿÿÿÿÿÿÿÿûÿ’Kÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ“¦ÿüÿÿÿÿÿÿÿÿÿÿÿùäÿÿÿÿÿÿýÿÜ×ÿüÿÿÿÿþüÿ#ãÿýÿÿÿÿÿÿÿýÿL¦ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿäAÿþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿüÿ¹©ÿûÿÿÿÿÿýÿu [ÿýÿÿÿÿÿÿþÿëéÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿOÇÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿüÿƒdÿüÿÿÿÿÿüÿ} Þÿýÿÿÿÿÿüÿ´Kÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ–aÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿåéÿþÿÿÿÿüÿ¦«ÿüÿÿÿÿÿûÿp‰ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÎ Ýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿq–ÿûÿÿÿÿýÿà„ÿûÿÿÿÿþÿý.½ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿòÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿØ (÷ÿþÿÿÿÿüÿ_uÿûÿÿÿÿýÿÐâÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿBðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ`ÿûÿÿÿÿýÿÑwÿûÿÿÿÿûÿŽ$÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿe—ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÌ Ýÿýÿÿÿÿûÿt‹ÿûÿÿÿÿýÿJ;ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ„/úÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿOAÿþÿÿÿÿþÿú,±ÿüÿÿÿþÿêHÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ”­ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº{ÿûÿÿÿÿýÿÕáÿýÿÿÿüÿ²Rÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ7ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüÿ@­ÿüÿÿÿÿüÿºCÿþÿÿÿÿüÿkSÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿVïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿûÿ›Ëÿüÿÿÿÿüÿªœÿüÿÿÿþÿú,Jÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ–OšäÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÖÀÀLÕÿýÿÿÿÿüÿ¬#òÿþÿÿÿýÿÎ>ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‡„¼íÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿò¤Y#Òÿýÿÿÿÿüÿ¾—ÿüÿÿÿÿûÿ‹'÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿjxÿûÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÆÆÿüÿÿÿÿýÿÜ  DÿþÿÿÿÿÿýÿEïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿG7üüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé¤ÿûÿÿÿÿÿþÿ9 ßÿýÿÿÿÿýÿß›ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿö!±ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿArÿûÿÿÿÿÿüÿ£  ÒÿýÿÿÿÿÿüÿÆ™ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕFÿþÿÿÿÿÿÿÿÿýüÿÿÿÿÿÿÿÿÿÿûÿ‰5ÿÿÿÿÿÿÿÿþÿYGäÿüÿÿÿÿÿÿþÿê;ÊÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŸÃÿüÿÿÿÿÿýüÿÿþÿÿÿÿÿÿÿÿÿýÿØ Ëÿýÿÿÿÿÿþÿ÷r<§üþýÿÿÿÿÿÿÿÿýÿÅG)2^¸üÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿYXÿüÿÿÿÿüþÿχúÿÿÿÿÿÿÿÿÿÿýÿVfÿüÿÿÿÿÿÿþýÿèÎàýÿýýÿÿÿÿÿÿÿÿÿÿþÿÿøüÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìÒÿýÿþüÿél ¿ÿüÿÿÿÿÿÿÿÿýÿÇÔÿýÿÿÿÿÿÿþüÿÿÿþüÿÿÿÿÿþþÿÿÿÿÿÿüýÿÿüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŸgÿüþüÿ¦RÿýÿÿÿÿÿÿÿÿÿüÿdSÿüÿÿÿÿÿÿÿÿþýýÿÿÿÿÿÿýþþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ<ÞÿüûiÏÿýÿÿÿÿÿÿÿÿþÿé!˜ÿúþÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿßçÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿµyÿöOdÿüÿÿÿÿÿÿÿÿÿüÿ¿²ÿûýÿÿÿÿÿÿÿÿÿÿþüüÿÎSÿýüÿÿÿÿÿÿÿÿÿÿÿýüÿÿÏÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ<žU Ûÿýÿÿÿÿÿÿÿÿÿüÿ¢˜ÿÿýûýþþÿþþüûþÿûŒ hýÿüüþþÿÿþþüûþþÿÔISÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ˜vÿüÿÿÿÿÿÿÿÿÿÿûÿMÔÿþÿÿÿÿÿÿÿÿú²4?ÔÿþÿÿþþÿÿÿÿÿÒd ¤ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿßèÿþÿÿÿÿÿÿÿÿÿÿûÿ² Q Õòýÿøä¼}. ]´åûÿÿýëÆŒBÛÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿH‰ÿüÿÿÿÿÿÿÿÿÿÿÿüÿØ;37(/BB28ôÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿv#ôÿþÿÿÿÿÿÿÿÿÿÿÿüÿúOûþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿŽšÿüÿÿÿÿÿÿÿÿÿÿÿÿýüÿê…"D+Sùÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿbÿûÿÿÿÿÿÿÿÿÿÿÿÿÿþüþÿó­T3|Êÿ¥Aèÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿÿxtÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿé¯u@9gŸÖüÿþÿö)»ÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿâG\ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿÿÿþðÓ»£’‡‚‚‡’£»ÒîþÿÿÿþûýûÿŒjêÿþüüþÿÿÿÿÿÿÿÿÿþüüþÿû™%÷ÿþÿÿÿÿÿÿýûþÿÿÿÿÿÿÿÿÿÿþüûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûýþÿÿþÿç†èÿþÿþüûûüüûüýÿþÿöª3¡ÿùÿÿÿþüüÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿþýüüûûûûûûüüýþÿÿÿÿÿÿÿÿüÿpa²çþÿÿÿÿÿÿÿÿñÆ|%ÜÿüüüþþÿË€ëÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÔ9c„˜£‹oE!½ÿþÿüÒn —öÿþüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüüÿ];cX/'”íÿþÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê0pÈûÿÿÿÿÿýüýþþÿÿÿÿÿÿþþýýüûýÿÿÿÿî²a0vÞÿþÿÿÿÿÿÿþýýýýþÿÿÿÿÿÿþÿüÿŸ ¶ÿûÿØÀãòüÿÿÿÿÿÿüòãÉ«sÆÿúÿ Ýÿúÿa/=FJJF_G:€€€ÏÁ Œp²ÜòŽÎJ-½ò1ú3aÅéQõ$^`€OÏ#´Ãò‚÷³MAÕbNºCÕš“l@|›DÙöÈ*Jí`'¥CðÏÍ?ˆ~à ‹Ø+LŠÿMÂ+±’ XÚöù“«}ç)“Ú”TЬ·ÜeNaf:˲ $u\ô Œ£óºÓWiOxpTZ†§¢Í^»R”—¶c¹¸ Ø­Ð xâñrpî;±oå.(•NsNh†!àb–ÑR`¾ÿtjÚÌ2`ü¡/‚2„+„óSMSÕŽ*c Åh¶Ë5!J&<:Æ[·>2©‡\ÿH)ЭÌÖSÝr(’Ö§2Âf2úºÖÖÐt¾~+Dw+¯LÏÎáŸûÎ.̧þ¾|ÞÆüä,å;Ô÷rhÉéØ\°OÏWŸ8¥ô J ÆÏu~º;¤†Ý믃¥Ñ‰A÷§“œ*bÏsø°D¥6(\wmõ­¿Ôü-¡Aq Zc$_°™ôPŒ?ä ,‹û|V;RJêÆKëPH#bF")ëž–æÖf=W:‰¦©,mº¬ KU“Õã—tx»¤MN³q¼kòÁ9÷R¿×ýQ‹ñδœ<Œ<ñû˧¶DeíßN r5«Uà¶ž~ù¯”ì)|òf'´è¤Q\`ò{Ž›ü¾¤_ymÀ/{'¼4ªüòØŽøDbáßÈÏ¡©ïØiQ˜¶¥n]ÔìoA°Cs½»É4{XDÂÓ5 \òï ¼‡5ºo7­döXËòrÉžYC«ÑÃÀ$_dkÉ‘p—J¡l£ÄOù&\®¬wr¨…ïGwý¥$Ðe=¹PWàê"Û¦$Çr*MØj_eVa CƒDàúÚìÖä<‰‰Á{|,—‚¬BÁªçØÌÊ5&yÁò.ˆlO0)„A¤æäY÷¿/·@¾<àÜbB’? 1ˆžÈ‘¶ üw®«;p }•¥ʼnñ`´oàÈ( ¾˜ÎøÍ”¬îmÝwD$š~7YìNä×ù¨ÔHØ¿83À¾>ÑÑOæÔ!¬–ªÜû¶bI•Î"~ EÉ1ñŽïÃsó±Ã3ŠˆK#»£MŒ(”ùÅïzzùY‰GW‰¨Ãì9Küqõ˰ß]ípXµ  ^`Œ—Ù¡þeK´ ’Ÿ¨ÑV ΂½ó×ÍL{"{\xàVþø…芤'fJ‚z‚bÅÒN¼À›UâÞm†•Ndϰ'öPWpV&Â7=š°Û³ß~¯hlª0¹«e_4O¸ x $å‘o kp%%õï~CÜöS9±I·ûW½]/™€¬qÆ^!Úlht¹f8¨Õ,þ |¥dC8p ù[Û…ˆ0É‘{u-7š™’ø‘1ŠOò{uož¨+¾+…øDÈì.œtoMxÜ }:/ ÿ-‡½ål²nòæ–jø‰/î>Mîb¶œR3x‡RŸr |‹Üt‰:ô†ø)*œwJ4Nº÷4@“¥VxâÖûß)¯/9yþé›L&_/ &Ѻ:ö‡¿P…¨DeëZÞØxEVƒÚc”ÿ~óÕŒ2Çâà ‡K7ÐXì•ö—¹„¡mâ,Ñs+¤€6Ï ²0·ï ;gØñ7£‰»¡.䟊ÄÊŒÄq¢·9w._¥“­6»Mª‡¿œƒ.ÁÊ‹¹ÅPèº/"B"ÉÉZæÛ$ïÌÁˆ\Âã- "ÿt·Ö}-ñœål2±4b"Íë|½$7Ù1u†À æž* #%¾ó\ˆ2nmšY”Ëô¿¼á]¤:‘Zx׆pwÂ=øÄ‚"Ê" ¬sÓ)dÞÏϧ ùõ›ŸOàůÔ4;Ôú}î$°¸ÀK«À½ñn êÞ’àf*¯(V LgÃ+à†‹´ŸX[ÓôDs‹”B­XækÝÃÖá®ä⬽^Øü³ ¤)÷Nú(YÖ5SÚÁmMó!(i·åtVm%QêÖ•FýîãóÉèb>ÄÖìd‰§âæ4꡾²˜ºJãð™¶@‡e×l2ÆÖëY$n nE,w©Š<"ÝÑÆ§æô»6ü¿C$"Re›£&ÛìCwôXæc,«ÍùpÒÀ ÎÍ4Š‚…W/\-óņÌü'ÂÁ_3¦ ‡Qƒå5†aô£„o #¹Øš¿kÿ.u.ý™¸¯0âî'š©ôuú oY[Q®·–…ëÝ;fù‹¬î‹÷8ªÓ:¥`©C³»²7iv%›ìžlJsúDè=§à8¶7ŒgRGiÙÎÐê xZ šà0 ®<" ç¨v›"³`@ ‡hí€[çðL1{*ôó”[Z'ï•IgªK Ó?÷¸ÖuðÀiÇ\{Šy¹Ò0’\ø×jÕ¥ÞúÍXÙö<¯Kç¼ç]X7•h’S ƒ]o­qW ~qB·Q(º{iè{ΧIg4O½¾‹ÞÊbR¹"àæV_XP]É´e:#Ò€Ùë»  ¤ºUü'$⃋gÒø‡…MµjÊ„Š_xZW'„¯méEÖ©Ù„¸*Âb+¦*á1ñN£y&Ñ΀‰'G’r¹|làáôÌ#Ö YꌌŸ?ÕZ; †õ¡:OÊÞýÜW$AˬÕ,ÞP„\š|¼˜EWŒBs•ÇSÔѽ±Ú$?˜¿µ°žžùíÆ ¿• >HÙÖÍ€ð¾fhJ+!v p7lpŠþê#‚ ü=JAkñíõòX¬iQaÂØsÓ2Y—þÜ@¶©÷´ÍHç~/ßÓŒçNBM–gлt†¦¡Ûˆ%U@wè¾3øAŸ¾E*·èíR¹„o,°Ù¥ž"¡OÀšnÁåÆ7ß û1\ Œ»¦ÌiñÆvöbîJ2|§H+o0c¿–¼(²ÑüdJóK lãÍ¿»€3ÏöQç–TOœt»Ì›fV5 j³b¬µÇÄn›j'=“L\pù\”åK ¢K²V@'6Ü¿rî©g÷ò€í9í× äȘDȵÖ-´×ÔÕ_&R{ùCŸN¥AÿUÿe.ó{g[ÞDèW³â"0 ”/€®7ìÃÖ~ßV耛C¬m{ B1/sÎkD}• ïΖ¨^L,ƒH¢L˜†‘™rÛÁ tÇê’ pæ/Ȥ¡O°žïŠ©!òkˆayng< žËF×à~Âܨ»a¡Ðê@<h¨Ý½ã®ì‚QùPD¥p¹™ºð¬ÿtƒ à°Ž"¨ ¢cí·LTNÊøµp,jv’Æn%KÜs‚ÜrT'ÔæÄ×Ëô¦Ó0!DºÖn1Ç©ôÌN'Z Ì;ž<—Ù-#ËÍÙ‡å9Ö =•æUß)Û¸Û’æUS³ŽI¼QÑÖÉ´‡X"ð1è™|:˜èIˆ®þ#¦¾·&½þ£Q‰2*Þ6½‰`8Š¡ˆeM³&éEÆðR÷¾³Pàý X7§ûA÷•¾F-!³ó@:Èßô¼xz«\8Š/}Õk_‚åvöÿq„*؃”‘H³Û,4,!00Ÿ¡äèÝ´?/Ò ößJ+E– ›…ÖÄçCæî™í£¹°9ðô¥¤„—E²Qäºfœöâ¹ig2F‡“oÆÓ9ô˜å Ôž§^uÑ'V­,%¼G„3/`f8÷ÎOT jü|ñ6‚P›«U)ß ÏÞY³ù¯g»³Ë—ãØ%íð›šhÆAË•Ôï $¥)g°ˆíéfâ­#GjX]£Ät¯Kè [5ÚeD[,gj Cs˜öW`£‹z‘¾¢íÕkz®½Ì gîŒÃߺž‹œÌ2ï@ …®ú-0új¢©¸F^qó0H‚Õdí¼%{ ®Ÿ¶$œ$|.6µ3twr·‹–†$Â˜å Æÿ\IˆGèšföw]Èd|û6Ÿ.<ÃÉÿ‘xÓ ´¸FsÁ$y¼]¼ø“˜¢&ǽK ø¾•åÃV—~лÜé¢pÎ6ážÛÜl˜I6ÄOå‡ F_MÏ\M¶EêÇ’4u/ßÖç„Åãn˜i§S2〶Aóå¹:fœ³×€&àenéOQjj´`ŽI6^a`Y¿Ú˜,f’Ø{öY9¼k¡€!)§©­ÆNðÆͬOQÐñku@€+ˆ©x²îúb$#{öõ¡÷›áp=¤KN{ÙË_M¢O¸ì`¬dr‰›Ý1>83?4ÌÓª'çŽÚ·åÜnÃÆ*€€ÏÏ¥ˆü:g‡áÒàÌO ® Žd€ð´*\‰dËnÛ\šö臠í><ð2Þ>[éÙ†_±ÙÊZMΑלžFýëk3CdÂ_Yt³ȾÄÒµÈN•,˜:ÆÛV5·NG¦@ìvµŒû Õ0µÞ:ë­SK£ØM$,Èë9΂ÛÏaGĬ{#˜MrC‰¹¾>÷ÞÊÍõ'1·oÚ;‰€ãL Ûg½‡ó K«räôA·8&“”ÜaO›3„Ùq³cÕÍ?%ª°}ö9¶¹n²yÏ¡¦ç:;5˜àׄ(i2kNÇŽ{÷{á0þôä»Ç…ÃÙò$lD`y0º‹áf þfV¥Û–*“ꤊ$^¬~p3ù>‡.°äϤGÈeZƒRŸC_F¶"æ›ÐŠÞ‰š½H9Ã/{ÐÞhd1ÝX¡©%½48?¼¤`«QP§ÖJÒp™}ߟ¦ñ2c65¥#އç#Ï0ÀPå·âR÷··Ÿv{5fT?ìyQ^€ƒPàÝÕCSÒ` ¿õ/C-³OTNw bÏ:`•œQ1cWçm™RKãQù#Ÿ©—•Bë‚¡Ÿª*!º*#ÆË~Í]U̽é£Á¤‘žíÓ©ÓÕ}·òÝáj‰C”næÇ(EËݼµLnÞ£e¸!IV7G¡ó‚⸡ãL“Š[3™‡ÂqNä|—7•ãÝ ¼Y¾îN[®hèÆEadv¯ÁtDÊzéþž‰Gã‚ÊîœÑ†-~UiDï–ó¢Øj(3›é mìY©×ïˆ9ßÅ‘ZI®O[ö8ÐN¯b–G!ãHJ®J¸ˆ­®Š=»rF›œ7a5usÿ ݲcÜAHàbKÿaƹN à§Dï6S“½Ç©…¼)íŒE[0~f²Ö]Ð[Fç¡ôÛÕ"~PÅm¥7;@&f™[ó-&Æ÷‹ü/ kko“ªn ¢M—"9Ëíÿ@M‡±¬Ž…±Ò ©³+ÑOÚWæ½á¦‘ËêrÓ—C¦±ŸÆVö]¢?%çêÉb8‹70Y͈ºò)nñÇó'˜·Š¯1ƈ {ÿj—âˆ5¤We8Ì·/©‹ëžoä™Îô¯09ÀeÝŸo¬íë ØûAðí0TÆZs¶ø6—œHòº(;ˆ¦4gâN<Ä4’,é|ÇܦK α +îê©f-}­<Òo×Zœÿ7gªÛ(0>J‰´LVE—y|ÓÑy qx}÷èÄ1Ç_òª .S’’^XƧÕEy!<Á™Íñ€@âr+âWfŒ àòfþû°\¢—J&ÁÃú‡¨¦¨ÌEo,$Ä<;™ÂfØÄ–;ûžòýú¿Áèñ•ŽÔŠø1ˆÛüž'¼35?ê}_Žª€¥ ™Ÿ¾@Ä( Fæ¤Ït'AxµšÏù­ª×|.«QG9ðÒØ‚XM-}s`‰±zOFûáÑÙ§DoNÎÛ…UV! a4HïÁ0®ñ·cgâå<ó:ùªZ¬÷‡ôN5æÏ©.Î8Òò·»©v ÂÈîä6»¥¸óoíJZç¿€ÁWäóÝDÍ@ fËK§µ„62x¨Â›Ù÷Ò=2ˆ7oíñöñ$ZÉ÷…\Ĉ;k⬕3%(ÿûX_”­Ì|Ÿ¤*"œ­ ·|ð=Ö·h™8,f²jt#ßW"Tl¦¾ÊclO‚ÿ$°y´aç¡ÌÉqÅ8QTZÿ Ä€»3ûì/pÿ<:³W%–°±ÉÜ[:«Ñ|^PÁ‚”ÓQ墸ø¯ÂR2ƒW³ŠR¿U¶Í_D B%—‚å%a>%ìTŠbpê<72«0»4VÄòÁã ^!QíÔøˆÞsMÛJ#^Å{>}§çUÈôKæ'DU­ëG8È ¶3Ä¢oy¹ûgA§ö)%°ÈwfŒg÷ƒ¿ GLnè÷.×Î;eNk@ÿ=Ø*«²þs`ŸpÉJ6›d)~R5øpßøµ”ã8{/™ÊðãAN+fØô]ƒ#Ëzu½ã±-=Kýôµoàn²iׇìäsDÍvÛmæÍÀ  ³KË£g?¦$moÇÇ#L»²‰²ôGÇrßâ`6…æD(¤HOI¼÷•ôñ\ãW¹aÄŽ 'm±Ê ‹Ær'Qº¹Fõ(ZcÁ³Àº˜¥è èP 'Â…ÐØsøêš‹>ʵi\ÖÁáÞhÁàh;½VÏÏ×¶~~ÒsóõöêsM°Û@tà að¤øÃ׿»;‹ãDäþÈüŸ5 P\Üs§å‰tFs§T¤\ìV šÔA1§å KŸ’‰öˆ9h0’{DŒq"ìgÝêpîr¹t¼Öwê»MžŠê[aåÜhÜÿMÛ]ˆô·°PA¯C ¢Û†7!Kb 8®r-}Ä,MÜ«Ý{yWœ¡\OtÀa•VÉÚO”ßï(rð-¸¬ ÙŸ†°ESºá‘=/wö4½ª8F»ÏöŶKž‹Ìá“s«ó|Ê5­º¨3ãÆ«KƒWcþÄ«n&œvÛ° ?èݵïb#*©ƒÔú¾g ÕÇ«~ø†ZY¸ÍèîNüU¥èBèÐÒÜŸH¤«ÄÐA¦ÏK P«FŒ›gm=?dÆXæD<É¡3°[ƒe'..ïx¶¬º+ެ7ð9Y‰FT¯M›¸bpS-aÒöŽãŒ¯uÕóÛÝðªVY¦ýXb¤n4ê?š-L|Ù)éË‚Å%Ô€õiÔŽ6¨ù(ð“•òfLM9Ñ‚+{¯ÛçW±@þ§6×m¨l=sºG‘BÕÖ]ɩǠ}Ï|χ{ªT<­úÄ¥íPÐ--5¨,IKÚSÇP²Ðmü-uZ¨¬ÅkAGàÆ²øµ³c ò¯÷"ÊÜd®÷“Ð2ûvÊe5§÷´‚òô³nÇ܉_ž*^]×Ø'.RyÀac ›~BÝ4Iæ/<‘³¯Ð|̧H${‡~pA4Тqà§_£à¨ÇRJ˜m“S º]§¨Htl¨ïü§q£ŸÔ_¶‹NÁþgCrq›&( qœŽb˦”ÀþáÁš-kí êÿ.ä¡ðû›˜Ó~®SëßågüK¹8bˆ¡$hÄvy@@v‚·!¹ýZ»â*^1¨v–q7Nï-C—‡ÛkÞ=‚JöÊóËPJèÄpÛxËS Û´p^QçE?÷Ï óIèš553¢ 7´üÁ3ÒÄGÀõw¨¦å\u°-„õ’]ÇDÇ"­ÔA™fZ&0ÁêŒY^¥¿§r“2`eÞÆþz?ú¸dxg±}ÍAÍÕÝò„¨çKB)àà/Ôù{¶Ý õ*ÖÿLã•Pö_¹¯!9¿,¬†kü:¾ ÕµZªšh]öQppæ…ój5ò®°ð”~á1 $am2ö÷ìþ…&OQ1Õ%ÃЦ!!cL1ŠoºˆDjî×™/ÎÂ.ÒZ1ⱪÂO´Î‚Š‚þ–_(ãjJé®îü ´ˆøOV0dÂ|–!Ûèô``Êmͯ—雿=2´è8)ðÕÀH#\eâ² ðe]vÙOÁÃty’/ Þ«|©×½¬gP,ªŸ1È“qÍ=ÛÚxo1ÈÊp}‚àÍ]pž–=´ïc²Sÿ*ÃöʱðŽ3V¬Ìi”’†@øƒñB%hšácy°PuÃ_Ó¸Àl®¢ƒý%ì{û»–ã„þ`y¢¬(ÀýOóšýº¸Kät¢ãÑe TÐÓå5\{µG‘u¯µ÷Ó‡!ÜrÃËCׯm \Ÿ”.ÿuÊç>»]h©§Å(#¬ êë†0NwÚoÓ¼2j=k8¼®Oó¹@Zæ>x;~oöFOhÊ6,Ñî8Ñ›d²y`1»†éò â!™Ôþ^Àè :§rÿ^`%Ü£ƒò˜ãÍhY›xͧ*X€íI \_)žÓù³s©éФØ`ÂBN¿«`Cþ0½ånäÛ»öXòóøt˜-p·ö‰Ê¤;ˆ ô ™U5¤g)H×N¹íª½)£õ‘Å6;ƒvp±`^7܆>6RÄÒ;¸nïZ“Oå}Ä¡è‡f´/R¸œvƒÕЯBñÚ­9k3kßiaéÅ~*£…Q«ï’çÙþò-íÿC[èûÖ¯=á©ÆœùY•^4½èäìÏv.ì[7˜w§Ìé¥~â\$°áŽ¿1Ó3º\PID@úa OÛY¿e–”³H&ˆ™¦§O "À³z•«¶ÂHšK€©Û² 9¯øÝµ6&Oã¶“¯X¹ßæå\}÷ ˜h kˆÔåo!à<­$êÚÍ“=âŵ,ñ„Ò+r2Mô8’Opþt±\½r•*]p29ínØ5n6gíˆqÉKðMµèYU´Ì@2}0=´‰Ä,ÚuÙ¦/Ô É1ÞU\©„«êýÁþ³ÜèPœP,QŒ{”!÷àš8ň-€ˆÃ`óMNûo3‡xõ·<ðéCp¢·>Z܈jKîÐˬ5Ÿ-ö&^Z!®kp® Ò¹Ñ±¨Âvƒ3&ŠNÕ«æl»x ¯p û…±ivÎYû×[  [ȸ•ˆaÅ®%OÄò¢Á¿NbnO…± îJÓjä9'Ò&þ˜;Û0^Á1[0BM”ì–œ*ŸÓÕÛB‚Ȉø«o~=×¹¶Çñs¯0KYŽ!krÒ­8ó µ¯ZÈnQêf›±uçuXÿy”%µRsQiê®×ŒÊÅ+‚þøç)#‡0! ÿBÀ»ÇF€y(8²phèí"Të"bª/Ç*˜f¦â±«;TD1IÿRâÆü µÊP»´ af̬3‘>lûÓe }sÚPhÓ ðX³UEdä2·CÎ7ð0íV5O5Ȧ~E-1#mÐ[jò— Ö4Øx{@I© ¨…‚é 3£DhG¹5ã–U¥:3'¬‹‘-’fÖêü™#M.ÅyøÐôYG*CuÞø€cRÙEãë%*ON3 ‡{Ic!×Þ§|y=;“¯ÖO™¼§\ÍůcüMºŠs´ÖåÃÓf6Æ} œ"‰3{ÞF #õ¦Þ>ÿ‡mCªô¤ºL¾ ¢¿zB“\>ƒ1÷¢1 ¸½¼²'¨KÿМ­çÿwˆ.)FÝ¢ïyñèûÂnÍv#‘C=ÞÆüäH^R­U­óžÛ&–WØ}ãR¬r “y€Ã’6¾ž°¨R8nͧ€ZSïß6¾3î1Óso´\Ë¿©­Ârwù«isóè€\d×^¬{,_Å‹£§ŽYi¿ÿ{ùS¢²ýÐ -k;¿¶èžð€çÝôÜ”·.#.M³ul.ÑÌ…–“áxWJdzX(J¯@ºÎÃj;QøMZÃõ༖g!ç{†6Q—³ )\/^‚=d¶!Ô{–Å7²m†j`—Êq*vòúµ H°ÛM[Ì]½c«º½ï¤uyÂs/ØÑ옚˜Êõ&ʇŠÕÑ­úüpïT)§œÔ»}Õ9³¶ÇŒ``~Ð45‡[›7€¬Q¹LÍ:N7ÑòØ5P¤.­’ÀJO@ÊÒØÕ?©HÆD²PÖâN!¾)#kvv8™ÞHXüjÐö‚¶þqmÿpZpõ7ß™'-\¶Ù¾{›,×E²K’ƒ)ng³½.Œ,{Lþ{"ccæ2ËÂÖ÷IBÍéé9†yž²lxvÑ?Âm€)/Ðé®”YéciÕj¤¢ºê•ý'}w Œ5(‚“9gµ›|ILbA}%’œU­ê9u Í“OÛpÖ0Ác°À_²¦ô6¿ ¶åaéy5 ›M5ÌZTàCg#úLÍ[íàuedÕ§ÆC™³ö¤Ìÿ\ÅnÕÉJ+³XÒwMº$’Ëïõ&t5xOîl½Ç¥ßšL`;/ñÇl”ì¨ópð#»œëì~Ñ3¼Ýõ/N‚Èž„+âå[M¿<6ãIÚ³ÃX˜',–Õì¶¿¼žÊ¬˜Ó±9ÜOŽL7 ßK\Ð×ýŸÅÜ,¬«ãº]—âMá ¡AÔò¶Â'¹N|À/–ë‰Õ–øÌsX\w5ëýûEÝ<ìÝv¯û€€ÏÏÔJ?TXü=A€ñ.]…ÒöŠÿl•¨ÿTd½2NÇÛî+P—pçñb±ÕŹ ùN_ ¯ Ðäa дŽÊÑRС”WÎOîרgïŠÐ™zD;°¿ŒÈ½z²21 lÊoÆoOP­”¨òíÚzŠ!·¼9qÒ¹¿ŸÌ-Vù·Î´Ôa‡ƒÙ©Èúh5%\™ùWÎp˜}Çÿse„Ëë7Ò«Ûûsâ1þf‘•ÆG)™æd³1Ñ©Én‹»Ðåfå×(ô!3_Îuµcì|JÅÆÕ7hÄ(Búš! $Û®Þ£ÁPïña8†ïL#¿¶ÊS±À!LêX˜p]E:‘€xª’‚¶XècŒëg0—ž'?³£C-à‡{^01õ | ¹­žLÓ/ÏKº<¯¯ç#øßÈD©Fl7̮Ҷôþ€¶[SC*T ·ÃR ËÎC;"¢´¥‡hÿ£Ô›·tñ‹ÈªÚÒQG¯¤¡’n]uzmÙ\±–oç¬äŒŒ3œa½tè£ìwvÆô§ž·YkfÐEéÞ;£ß0Mž?ÖuØBEä4|KÿT“wØ^‚t#åÜsùù%æ6#Q¡{ø÷;ÉSidJÇ(%U|ú;‹àß}äñ\B œñŸèŽÍOplìH9Õ=÷Ò$â«?p[}¡(>5’ïæ££ÊOvvyîþ¯FÃÊ-ǃ1ônž Pã¸(†¨yŸªPœ¨Såhi²Ô[G؃Á¿ñŸf1ÿ–BÏ“û+uÿ+“ÑGT)î‹àÁ8¶c°#C(+ ¶pÑzê‹=à–¼zɑ۳ã¬RÏe”4ÑÙx^Æc …¨Î¨ÖþžËǶ iYW|?șΪZâ!_ÕFÝ—ÚÎ`|¹mŒ?Ñ7„L!Ç HT}ØÓÇÏÏÅ‹?lÔ$w@ë‰Cù+_P}`¼+ò]sšo"ÿO–‘Djÿ€qõ"s,¤"%0ÌwUºùžÿ˜^.sWº˜²Ï^e×Ò‘Ÿ{Q@3<ÊQ§›5¸+ê°SAb\»„ £ˆëù‰ì?^Šô[2‡×/¸1mÔÝ2 ½XzIŽœ_²fʇۀþ…¨w[„Ó_KU*zã1Бñ3« ¿1Æ›¸Ž„ʆ—™ëá¢%þ1MÜ€tM%ÖF$l µ‡¾ÿQN›ŒÐQcÙ¦gÕõüѾ^©¶Xß²…û}Ö¾ÊEä4ý4›7ÃøöÐ…Eõ9ùtEþ-}FC¡¿Nàøj.H•„Fú q‘ч—°±Æ\Çržp²&Nˆ4bÐ)¨Å9ú]²?Š=O0©fKþ…) R»6ÜÐBÿØÛ§bå8aAŠ†Ç½4Ң˭ncZÍ Á‡F?m‰&\*ƒÔÂÐg •„ ª€Ä¾9[Š2À(DË^c¼ ! œ¬†V•Æ”–`\Y~¹wÿö{作T‰Iˆ 'f×2³NuQº}öÁ–üKs.€æºÐ²+`Þ£²›7™Þ[|„¼fÆU8”¸tµTô $Á'@vò.qU«9žt/ƒy[&á$ä_$§xæ]rÀ=Z¬öûçPÖp¦(@¾ß´†f/·<½ãdMJHíš"ê÷Ǫ^œ{mÑ7<½«(BD_ ý=²Ÿ\ÊO¦j¤—º’С½ü:Æc› ›¼ÀÝ᫳]…€™«þ–œ™(àèœÜ¨°8ž÷u¼ç’fÑ ýÛ™ kÝ‘Nnâ¤Ð;€!L _¢ÅIŒ:aWY€Jc¬ü67¬ ¬¥86ݱ*™ûïº?“X 4÷|}„"CãÓ044JˆCoá•ùêŠq çrªØ¥Y¶âõ4 `~iùm¡;£¤ò­‰S}­E͹Ô!`Xn42áóh0Ù2T̉ö÷yQ«°ØCÝfÒlìú‡©åZœxò›-ÏÌ´&îƒ@A5sÙ ¾‰Œé…P¬ÜÚÛ¡¹Íþ·i“¢P`–qù‡j„FÊêM7C)‡¿{ÚIhî§lk {by„Ï)h” 8„{øÒú㦠Ø2Áu†Rÿ8•ÄËQ0ÁO‘~ˆ£0Mÿ{ÞÖB7ãn2Á'k1NpXæÜÏš\AصUçºQ‹ÁŸÉ§õþ&¡6u¼A }ï;Öo˜SdcÎû­ô%÷EK"²A-flåK´gñ8§2¿šG/Ë®À8Ct¸gvó‹fV¶gî{q+ÇÒh½µr6,áBþÌ}ëk³É-ÊA,E„;É/S"zNgaõ螫Θ_f犀߱‚”,hl´X¥Ì`I­ý€ìXD†–è½M øõ'³ {¹ábŠ.°"¥ãòÁÊ\F˜´"˜¨ga•c^Qc=Êðâï/û ³œv‡X…bUNˆN¹<¸|ý¼‘ˆIÙ`R_,¥O͵JaJ°¶ÉMê&#G]%}óÑJÇJ`ªƒ“µF™0+ñWFcŒ‚G(—¢`½[¬@gá0ú(UHªa<5bïô(‰ùp¼Æ“¢¥åp§+(ƒ´·JãÜL¤0 ”fÚÙ I”‚ý©Ì"ýøËPþ.]&b[TšPdɇy×Nú ®®»ìF† KÿP>z]÷÷65ÍžÒ%œe&%1üÕª;Ë)"¸›Öh‚2_V¶à“€ˆT$ÇÓÅdáÉ!½+öçP®òMá€FP̋ܥiÒ8 WœV¼OmŽ0a®_¤â õ«D¢Ïª‡"9²ÓÈùå7©lÖNi)/&;[7JÀsùj­Xü5í î—•çÓÍ… …VRíÄ• ”j6åýM†Â‹ßu‡UIó4x —­Â…î6º –ëø1O*6ù3F¬ÅSŽ®²Õ !éuëAf´Ïá§>ÍêÛ+äí3k GL¾‡%Qšö&ypÐt±±–b³p•ÂÓØ1ô]ÔTø=6mÈÖÜHIZ p´¡Ö>7”×ÞK;?å\ ®P0º¹n_I|5 ßéfWºx&ƒ@JœǘÄrȘrQN­Ù¢Ä¤Jí:Éþ…7>1¥ å3d™»+·µ¥ÿ3Ð%4Þ9‹„+'Ê å_Ôótç ÂÜ\þ\®Dn/ï¹uitC·жØ,”í:.¯¹“ª¾ëÊ$v4?NûP§´vߥ]xJ½‰¥Œ˜],qšÕ¸ù«óܳŽ@`ŠËðå•ú>Mû~×­ü´,äGæãŒc W÷œûè~=ýþ¬À?­£ê½4Ym„žTÝry©Ù2Òð¹ƒÏˆßœ^R¢º: ¡l‚j´~âIøÅн‹— @A Ó{Cx §‡K3lÜF{$³aåʲTb:Àoޝ0¨@1P€¥ÉŸŠâ~Œú·[ÀAÑEàÔõàâêåÉ´`R£FîÖ ëRy¤ƒB0zæsbÝOVQ¥ ys!7äݘ:3fÆ·9éJNɶհêaEIä*ˆqöÌ«›ŠŸ­‘ñÑJD'ñ §sD£ºóÀÇfM¦4O±<œ•ÝÙˆrÎ Îy‰r7—x÷„#ŒÙ&ІOê$+B»FâR­M=i4q`=_‰ë¦é€pëÁ9ý»IweþÇ9Äþw~njíϼª“‘ýp}Æ 9˜ï’/¤iA\ZùejoêGÂüOº†-­O¼5‹°S˜Ì•º‘lNȲ(ÅSþ=‰7x©=7§Ö-GJ5¿½µ¹e! Wýƒ)ggVôã•$(%¤0¨­ƒ&è¼û2Ø2«’”iÕ=œ¼¤¦ŸSÎ9´øë†Ú4$ò# ]€‚/{ù—±ôca/(éôG¨8Du®[.Ásxá͆þÙ·®YŒŒÖÛ !-M:Ã(ØSEø2çDk×½ŽÑ%ï&óbCR|e¸ CšØDSîP.ÊUÆE22yÒ¦Ó厃S{÷€Ùª´ê@YÄ@5S·gJ£Þwè-1þ?ù|cÍð×ÙÖ=ëˆÀZñ–»ú©¡-“¡©ò‰<Ì1f´îÁíÃ\µÄ»,’+îCdžnÜÙ!‡ag*"’±Zº'î„ÅUiµ{RNÒqVlˆüœúyjØw&û¶p£ok ÑrB¿×½P\ ˆjD=°Lˆ¬Õ2øWÞs§9Ò+"å6ðÝŒkw]–ý^_19Æ`…Ì|«žZ·¡x-Ê.:Fú#ªÁT@ñ7µÌK¥Ç ¡7ùÏÑ]”Ÿd×êÜ\*áàê{äso\‰9zû‹ì õ–ƒR¸ÜûÖOû^³ËÚ—SôI*›Í5 ’úeô5Šã…DöFÖ¹+¶å[2"ñIÖí(ý îè3–}ÏÒEHÈ…î#] ¶É©é +õHÈpï«êÞN ðèwÞc»'Èè¨Þñ­yѯ<¯®¹ªÕŸÑVýû¿æ8ø¶Ô™VGAÒÜÎW‚‘Äø}ð§”t”bWÜØÅóyt*0X¼J÷6ÕÑ÷ùÞõŒ 5*²ä0Ndo°×¼Yâðº†ÿbr?;›,&àBñRûµýÝÁ.ñ¾MbŒ±&x^ó'Á½¨žoiÈkTvP*Yã§°œæH gÐ3ã"çðïøuù}½¿ÿ]ù}½òÇ/·¾+íí#ÛÝÇíë›öö›ûz­çâÜà¶œ¯ ž÷và ”nˆóìĘ6[¨}¢êTÿƒ»uИ5k…ëبYØŽIIÖq‰Â?d¨¯ lclsÞ‡Ñk*ç-ÿpýÀÖf}ýië¤f¯i<‘Mñó{ã–Sðñ·[>.0ˆèg‡{É“+Í?j Vž-I5ðÑÖrréø‘v,¢P¾òÞ­»Ü—aуBùíê¤\ÁN„á5~¸˜cáa#[UjÕùŠ [ÆN©Òl,…Ê1t½&XT>îÙªšCT0¼C´ÙÕ×®7{f3÷˜ƒµ^X51V&*¿su‰¡:f›¯Ö*èƒå`ë·ü§ps¾#lÒQ¨ CEͧœ'v†]r_ÄdNG|³æÅÔ°“f((Èž6Ó(9_¸Wvž°Òþô!÷A̤jé±³¢Nº>Z˜Ìùë8ùº—pQÑÄ—ÉóëË;Ó„²ÇÑ÷×ðÏ^;±1ßë\aÜÇd©&+Ò²bäbM“¸œš5‘é€wTºutnO]%}%Õ&ŒŽÍ>¦ÌkF{º6AŠËP²[•ûÈqœB jEŠ_= }¯ iÚÆ®|?e‚ÕIþ\:’?—Y‰&űؠ\DOJW LCãIY@jgmu ôLmz‰À…‚fjŸŸ£ëWú}Ú^þ·üžmºëD~«NK;|/ò(nØÅâ~cƒ™¦íg|:\MË»ÕuE;£»ªK‹pSi·g+:UWu@Hœwµ­É1û¡ã^$àHmMÏS¼ç½igcB”âÕc3—Û—ËS89ehÃö}ÑÈýŒ¬½Ò³r=dæm¤›‰w|i` Á_kž®#*tÒøÐ¯ú¦ú²,Ã:Oè<ó<ù5¡ÿhê‡ô†*Ǻz\Aò3 _¤ß/ýAî׸ilãg!™Y "¯Q«GÜÈ¡|“¦—áž9‡³¡U¤Cæƒ+,X‘ÃØc„‹ˆÜô±ÿŠUºþ)µûèÊÈWC5˜²Ûºú  î@õ¢ûK 'H[†¸;M†›‘!?„kh$tk} oòÍÐ{Ág-N"…PoFèêr0pž&±ß9Ú¤{sÅÄn*§ôÆ<\I×ÂÕ„…?÷Ý¢˜ƒ«zyUŸ,†—Ko±j,鬸G ^/Fo¬Ž:½œÓÝAs•‹üÉòÿt Bp8vÂÄéN³™Ð p±­–“‹FúÒãCü²µtåúnkAxØâšN°;`à½bÓ†7ªáG”ND}ÉŸ>C¹vÌuÿVHùö‰Ý•ŠVß¼¹7Þ®øu)3<ÞlmÒ@©×fcˆàÒ͉Æü{¼cíÒ°%µE*°õ’Ä$ç²XÉ“zǦÁÓÈ™MyÃäíhÁm?›Žã±Ørœ Û³—×3ž@bê*™£ýÌ &ã ØÝ@‰—óxA óLÈ÷š` Ä×XÔè¶°©½rh†.‚&ëXú‘‚yôWR¢Ýjù«Ej¤œcÝTýó!Œ%è ›2­" |ô²çh‰އ)[¼X5•Hö÷EìW£oÛ¯®k„_;c?s¤S°Ñú‹ IÛB,–FüU]€#ç€X'ýÝ•ÊÉfzå5œ|æú1ÔË~KM3êžÖ8341ƒìÔœ)øž (ŸÿuíëyOü|Uc?M ò·îEòêæôÔˆÖÒæ•âöäÄ>úå´ÓúVâ1½X$·´<‚é?ü øòá‡,}«’k³» f —²Gh#Сj7;)– ¸ªé#ËöÚèþ$R¿Ù¢´4q“U‰¿å/Ö^Qb¯ÉÙ‚ä?•µí„ìö=§é\~ â¤dºíí0ñ{•ÛO]j‡þ•?®­æHH¨èlÂVÔdÀ-ƒ!Äf‡‘çÆ¸ëMTÑÿ5$­°ÏF 0Û ÷»â }@|,á>\„Gx0Édä뿦 ­¬’Q¢|y÷s;òYç…ƒê:î5Ù<e@1„¤’МâCŠ'Y¼I`ÚôgDB 4¶iêÎÎQßLgPà 0³sØf±Êds›:›j ÀÀGL¢Çâ#å}W ÷égÿ3 4\(T³ < TJ× +ß¹¨bjºFOè%„@j¯­1ý(úµœ.—µU[% d]›¥Þ¶ž»$©ÄZ£îº…T¿¦´Mƒ Ý5¡Ÿ¢~h¶$OžG)¦M¿û*Ùµ27ýëY€Tõs›°MXß©óó÷zëØÔ¦èÀí‰ÎÁÿ1µ‰%w¹S†W“­kx ÷e!ä·Pv³ÚH«cèt3õjÿtÙèÞ@EAÑ™mxz¬€Lào—¿Á¸<†ºHˆr)  2úÄf2V$ÃT£—Ò!j«CÑôÌ7÷>#+·ƒKA¶k§Áî¾×ØnËÜ™ní1 ¦ë¾R#Ê –Bÿ¨@È‹ÃhtÿG—ÈÖ*µÜÿ³í·‘SžîvÓÿi_ÄÓ]!aù}´ô5ìR\ >ÚìUÒ^ê|@¬=°îsx<ÛŸ–òû3 ­š×#ëSçäRg“Z£†q¼ 3\é\´Ÿ5íÆŽ-…“²Þ{°ž|‰MÍ)é©KTÑÚÓb¦ÑûK™¬ ¸ô,™›” ã©s WvØ´ÒÄÎDät€î½GIº×v15w‘§{ùNÙ ã Dú0=5ú(k$³wÝœ˜z`Ô2È6bÖ‡òú¨ô]ÿ_4Êb˜S¿mz~‹î]ºl³abžö2aÄà?Eð·æü§3:Õq<;'Sá]ås®€¡ƒrâÜ0t”q¾©¾û"äPW¨Œ„¯©L ƒ=­3ü,':RCNàá½E·Wtž&-]¾‚ËG³·QÖ:ï±’žÓÈš£ ÎD³+Z¹¢HµÆbNz™=Œ1gkÛÕ†çÜež_ßã«Àñÿ ‘ÚOöž¹¢$ÜŸÕð•H?'~%²&ÍÈnæb-?¥ÓÆ>µ95õG„À5 )¶2wwJA1Øas[rÅ•hÒG#èTì®t I|éæÄĤ'kìƒ<È·|U®êzxçÕ1×\°^$Ãü|—w“|úÿwh%6 ¥DçJåaòª‹„–>íð&ì$A;/Kð{*cÇ]´O”©ÍóèûJ Fy]ž…«Ã;=tãBù$1?ôC^ï]KˆÞé;@{ÒÛcê>œþO{Mi7¦ÏàœŠ-¡ÜüÜ¥ÈRB.'¢ûoš%B?Å_‹½wcƒÒ?¨7Îw3·Í+±RAÑå¼S+/”œ''”6×ÃÕêhªGÉĨž„'DÈMÅèªëƒ`Yß·ÛÒpƒ0g.2Д|®8XßUeÁ놩Å=üÛZìmJÐX-ýÃà÷zeQwø ö:&(WuU}@š­ Ó¨žæNúW=Vyææd+`¸Ö­žù¯Þ?_GVãP®<}Ÿaôÿ+K‘B—†0CI¦³ìlEæÆmÝà åÍ8?@ ¿)m¿Ï| Þ·öüB[]PI`Àæ2ŒÒ%bðÁGØd Dubn"¶Û¢Ñ‡ÇÁf·C¦$ÞTËgämTdÈqUtFJ¿T«H=1ñì¿êªŠ_×±\õ>:@¶kŸÿÿÿEk~Ûå §mXi K† ~e@§q&Üï6”಄†”¹’¢Õ¥¢lw xŠ.”V0ƒt—ÖƒÍÙÆ”ÅLºáÃiÌãôð{‹Ç,'Ý [à|bV_N'rnúÊE¡—h“·%Vt¨ñ}]4—+\8ø#Å«äÁÕ¦ïÃç쬞÷ÌyLHŠBjäè¤s¸ï¢7wµ¥^Æ—Qu$ï¥|lýãú“dÊÈ"ݲ—s©Lö3(È>ù¦Îظ†4ÌÒ…e•†ßŒ¾c›ˆ)P¶5pR51Îã¿ÐY4°ó1Äô˜9ÅKAˆÊð ?ÖSçCÕUÌ{ —¶ýò{ÍF÷ÖCAé7¼S9)‡…[I¦½õNm€ÿÄm¨§¥Y´¡ \%± ‚z7Â1çþê†?ÓyþÃk$>¸‡éUõóòÃ`¿!Î’qHÚAõEÃ/Mè ŠWnÀÞ”Z;M•a#ƒŸøë`\w1´àÕðè•‘eF÷HGˆBž ©ñª„AN}u÷3Û‹F¨ƒkq—ýÊ–™úö<“)©x¤Ú - 6¶ö:XÀnìÉò_*§¶k'©­o(>†Ïx*®Ãa ¢Ø$h`;»®ÎÁþÍŒkV dmà<ÎÞð“ZFy,À¿U‚ߟê>$JkA=Ûájp¸µf·Iµx* {÷)¾y|…™Ñ˜:_Ü M]‰MBÙ7åXhëR4æ¡]2Sx Ý8í𩽨2\ÜÊ_¹d7Óû‡ú‚´C`„tÖuQ¼sð»î©§ötxGÜê^åÍ„ï” ~L¼0|…¹x^ÀSÊP–|1ã#Çû“X])R‹¹3»6ðÁÙj}¼F·ü8(ÙKÌõC.Ôü˜vº»ÝÀ/±Á[àëßþ¹Mo#ÁN±ÇÁÿ;áêÔ|J€â!ó}‘‡W·6uûÌ+ž—Ú¹l|~=5FúNï ,›Ê4­~aD–‡§©ÚÂ^ó0Y©›qþýžJ'Qv†M)¯?j¾QîúÕ²'±‘+å\Ž;Æ4çj‹ÿ“–£KùŠŽ§Ú^ó Ÿ×feôâX¾zƒÜèöë畾7/LDäµnmÝ]ñÑó`"|İ֮ƎÎÔbÖ°äènKiÔz~if×ÌP+¸;©©…$ŸÖh«ÒUZ:û$¾ÅŒ_‡C°aÕýÉ~äéœ,š! À»Š/AÐA†K¥á¿â{pµƒÁ³ˆg/«ë?€®#@¡9£›À+rOÕŠÓ«"…€Ñð½ß sª×îÜ;•n3ӂʪt!ËR¤É¦Hجhƒ ˆ lOú‚¨ü8Ä_Àgþ7x‡„íxS­9OËò±GJÀ°@ÇÌ+øzãz‰*ÅdSd·$÷†&<Å8‘ú}çáZ%‡Ý[\ )Í£ÔZiÊv®‘0épÎáÃ»Ž°¿†%ÁW?"ÈÎØú]ÇHYÉZDÁ¦ »±1 ´=æ,oOÕ²ÅçÕÔsÄ„® ƃÙ}Ðþe @¬ÜJþ ¯ r¢—2àgoËt«¹ƒY½Wº_S¤ôŽJ¬ña{Œ¦”e¨»~ª¦gþ°û=”1oF}+LkP‘^¾žMá­ñ&¶I)S(€J§xÃë$šiK¡G•D*UøØÊvçCÉ€/„8%Jåö L<òc€_".ÑòdFëÙF'5r]j±0 tšàÈçKÒÚ¾ÂqàwÂ4á‚äðŸb ½ˆáÍd+kKvßì,¨Ùºfù~F—ÿA‰ÁúçÀ÷âêç ×ñ p8E:æVB_ ) °—‹KnqÆûi¸Ð3ïx'¾f«hú:uš` –ÙÂãY_°2X(¤é~]¯~•·N¹ßƒx‰ƒ{øÀ­ g¤ÞšÜWг¡û4Ñÿô½v¼ˆÞl£Mðá3¤ÍsaŒ–›¯,ØEoå™ê•’~£cÞ›…(ΖTÕá·vSÌ€%¶°>$Ytþ}žÚÍ}vˆ¸½tÅÞt”,A¬\ÜP¿þ)“ªª©ød˜'È(Õ‰‡/÷‘.Ý$¼~?*‚š`°v}ÓT¥nšHꆈ®íF¢PÊ6ÉÏ y<À RÕ×µsg lÀH'ñ«™Ú\ùµAVnNŸÖT¡àÿH±®Ü|I¤‰‡Žý‡½cS_]}Á1óEÖÄú׿dÒÞ{¨ÐˆÚ;|Ù‚ }ÏÙ×3]ìk«ˆ˜Ê8HTÃöý†4ªèB{ŽLLdjüBÔvè%élº B& Œ*ZÍ‚‚ab ¡§Þzǃ¸‡.ÌÂÍêÕ Ê}7*E®×¨^G«ª…çn»~¶S§lãSÇ2›ïi·ÀÒÛwËÚëXè]„5 (BÒýÁ¿ßv•ó.ӌѲGÚF( ÆšFªà©„†äŸSï—8]áõÜòÞ€… ö ³éeF7êág]\àfwœ-è[×ÊM¤Z«/ѵTžÉÕ‚\øJ£Å¸1Î+×döbÛ0Cº§‹oñ™+Õ”.å\aà¦j³¨ú}{¦/ÅjÕ–-€˜Ñ5xÃ/Ô­iÝd„…ìàïÑÑ5è¶@–öS&ÑtJlŸÏ92ëkÀb$‰—9(èì.&AU7Ȉä×S¸9hÖïmô px¬êN:1 ¨ÇLY8¦Œü§¶EÄì.ˆ#žºæPé•V¼^µ]âóu¦òQRÀÔò„- D¼!B_eÓÏqpl­Ea5*ÊÌ`NÝM­ÆªS&XMY»AQ%q.OÛCûzSË W]°ìr­'­ëÀ¿À @_YÊõZ=ÍùQƒÎ#%Ÿ¹SÔE†=l•¤- Šo \°èbmQÍP¢Í‹}­çÿW èégJ{úeCïöÙ)Ÿ¶ãóó…ŒK%A—ÆâxkxïgÒ6‚M\ÔËiü ·¨™7t}ä1ýŒ.„,î@{ãnA©Wv÷šç‰¾Ç¯Ðu`6¢ˆÈrFW ž“fj"HD<Ù2KªŽ5OTÏr wü"à-ê2éŠèÙÃ|EšŒÈMÍðñE[2ÆB –èvPc/HÇbªhÞT$fÿ©¼É)ʬˆñÕO¢¹¡°¡ò0oH*'Ÿ1V’¼ ç¹¢„ãä2ˆÍ™&©ë.ñ øÊÒûΟJç˜Ö”áïä²I‰ eæýÑ÷"*œÈ-ËÝW]S-%,øpõªöÄ›TEñhÃXʇgz~Â2á³qÎÚh1)ûpÚ§9¡›eëq“òÅ}7NÉ㣇5‡ØwðPÃ>„ir…‘Åæ×KÖÆ¼ú$íôÄ4J3ü9 Ýî§`Ô äMÆ=G÷|DÊÄ€ö÷Å= í*pýÄ·0ù†â2æ¹YT·ŸRS\j‚UK|>­%ZçA~LàæµT~¤»ò߬Õeê¿G1ÿ1:p}oV‘çƒ!f²6ØÜ/èƒmLÛ‡ZÙ^ØÍ²š‰Ê™ÒŠH‚_ÃÛ4É5É2zI~;MØX…ÇAzp¼‰{U sgÊúÂâUʯÆ\éliµ6gâ·¡Rt­ú³ŠÓIEé@ò¾¾¬§Š×^Z“Wv%êrÍxe° çâzkD|d替›"WÔ‚³H»ýê¢êaƒ7—ì}Å{5sIdL8u 6`.†‰ÏìA8E1o¤0' Z¡­Z{×1´™Iš£=x“,¹ÓòÞ0]›mô½½«mQz1lÿN3vñ°(–Û…ûVבFÊ[Î6Å»›+ClÁrŸÖ8ý¶¯föËßçaâÏÖ¾?@rRŠÓó›õ__î‹¥1óà¯ø³ÁT¼t]¢.*W©0^¸PíBfH¦Ö¢õ-+â“’"›cÐÐ{+u.ã¦üÀìæãTàU07lÍ9ìàËþä¯I*–ߨAL5Ë z£Î:ÏåääÓj=0‰,5¸R‡(Êß¹'N£§œHWŦ¼%cÝ€ÖT Z#@àÔz·ê[("®)º±yã|‹Vð`@T·úqOù®®rïç“÷S¼$ƒ_™9Æë¿K÷&Ê5FûM¤T[DFÛÔlú¡´É:\ªAÎáuJÛ[¨Dáò) ‡â—ÃWÄmä¤ÎúçëÚUÚqÄËoŽ3mý PÕÉqml}y%ŽòH9ý¯Æ¿ÉaßR½ç@¨àдih‘Ù«çYzc¡´Èô»sìP=öùü =h;u˜ˆŸ]æù©rðKÖÀ‡Cê×Õ_´©Ø«~Ò Ëæ2”¡\IS±6Íþ}£ös{G`®èYëóÚ®`cÊM*ú£'ãW nBnÕäòD+!“®VNVô,Yq8_i$–”«Ýßà?Hdón' ²‰ˆÍ«ûTæ{ _“»sµþ†H) Å7­¨2¥-ùQà ?]©k<!±‚D."u£údEv1ºJð½ ¯—3M6AIÝXÀhþG\¶H%wÁ+àÑ(@GØá%†ä3ú`»ÎR°`Ãþ»ôÇë…°¡êÙ4‡H€Ã±<úÚyyö‘±³OÏëÉ+yªŒ5Yß_ù¿G8üãíâçoèû²Õ'²„£ý‰÷õIGÓÕ€`°0ÏÁ }³$-%ÔËcNzuË6ÙŒƒJ.î“Zè8k.óéteyÀ£…r>&uÔ V1„|°²1§;RºAëeG4T”ŠXy»]ç¡5GúûÈ*žºÖÒ¿ÇN¸_ºÖa4a’Kˆ6˜Ã¯”¸¹`¶ÈjMÓ¸Îý³u°d?R ×÷Ðxê€:¯= kìD’þ‰B¦Ò(óé9‚Öœì –¤+ü £Â2þ²ãG£Âp§@T‡áêéqƒfÍïY‘²yÐa½™â\']h;Çø×Þ#S]È?®‹`I©ÃÑÛᾂ»U!ú#9€úµ¡(…œ@x6=Ü ˆ‚Ê?Ü>¿Z^/!«EÔxÖ l÷øÌæi=°´¢áW_†!×!¯ Þ·oV7z¦NÍÌŸŠŸßñ©’n½ŒG-.½AZAòðÁ6S OÍ,Ñð\—–rRßK<··°'˜h" PK¦øËíV%3G¬¤ ÌàýŠÇI'þ ³+¡h²;ÀJŒg'òÏžÆ? žódŽºúäN=†Y&ʽ&hIQ†9ð;~ºÒw}O“sO±ÐöåÝ;q…‰¼}´Á3¤`ÿYuõzdLµ8æ;¿ë›3º¢È£¿#A{ÖIŠ2=cF Qí‚Ø·ózWþå•©˜PúÍVᤘ[Ñ" ¬G¶yÔÒ̱Šàªìár é]+xð‹ï@*¢1ž•XÄä1’Ú0qÑãÎïþO#-`Ú|®IÔÕ®“+ÙD=ýˆ9¼ØälR…¾cÄ]š¼žA*œgõ]ºsþÚ^¸çÜòãÊÐ;nï ×SuE‘]A4zµb¶¥ó¸‚SÇ¡.õ!®>ôÇ0Ú&¤Q»½Ê«qt²¬L™¸|ÝÎDWIšðs”;ÔFSTMÎc¾¨l²¾ô½oå+—ÍXü29vª„,Ǿ@º¤­Ãdˆ×oë«2ýí©Ú0t×¡ÝæÕÅâ“Ê)ûMÚJObà•3üñmê:ݜ׺ÆWÆ|= /LŽ¥…ù´ Þ&YX'\£/"×ó †D>KE‘;ÖNN“b€­N[´m€€åööü:>¾Þ»?‡H8ý½þÞŽobß·§ ?o^·¡OÛÕßíèlîaøÂ¯eÇ?;v:qÔŠŒUdJš­ÄŸË\kƒŸ8B n¥5óQõ¼ª‚#XR‘»þò©«±”ð£ÔÊ- p¦{]D&E5ICMu è픹ÖåµK»˜"Ózþîº-—……öÆÈýîцDÎ>úé/ž×ÌJŒM×DUØK±$O-;–àiõBÓx]Ì Œçµ ·á2F±„îÕ¸tžONC'àv-ØñLÊåþ%# Yo=Ö©ùÀìºTóø`õ¿¶d"×£½<»¿¬µ½@£#AyÿGÉ{U89¦œšÍ•Kã®tm¸¯Ö›§…ÿ?%Q—˜OÕú`øøF€nŽû&# N3„À†oôA^eõý[’Ï8>œÒ˜ÛV.¸c)3 ŒºŒÒ7,Åö°K¤ÊØŽº­¬O´°¯_êØi¡½¶„rï°¢7Fö³’<¥ûJºM&y¢ˆØ‰ÃzÅ®%ñ Öƒ’‰ŠðŒ‘²5ÑG¯pr…{÷2¢ý½¡6…ÅžVäÎË[»-Õ‚™n{êü÷X4n¸¤%Dì‘¢É׸ãµ{íÚM° òÝ, !»R›lÝ>QV¡ÕÈ¿äâ­õ fˆœíƒý¶ÖòExÁFó…\ûÿÛ~B\0ÞW§Q<ílîP‘kƒªn½ "áxmÈAÕ à1…Û¬ï¿Sì#›R<t'ÀVªæQïå82ÃêUñ!]ðÛ*‡ûóŸJi…3;Lý–(uç>ãÀüè«w²H¬]¸iÂìc&ÝßÛôø:Úc$~õkMàbP²d#ÍjØŒb桵âÅÄŸzׯßJ•ÆHHünç‚X ½{Íf‰DȦfRH6<´™X6»‰ðÕ‹…rO´u ]ílÅêf&ÜúSÕ>RYçJì[ßÏÿKð;Z=@©A[)^a`– ÆþÅ¥¶ /Ê1;ô±þYwä"ýÕ.ÅÑ{â+ ñEyèeq =I6ºSçëSoÞNl;ù–y²Ô Oˆý]è5¢3ÃêüÑ~L²†‚îÖ!ŽôÙ¹ªw/°U‹û«˜íܪÈ,+Mªj`n4ƒÏ(sëM ¨W§ƒGÊ^lÕ‡ÎЄ¹-Ÿ„³CEÀØV•§T3J±7N§OÌŸ;Âà@sŽó†wMCäÖ‘_4ÓQùðu®žk]åèMê9Ž$96ÆkKX¶ù3£èò-ík!W†éRᔑsE¬nì`K3À (BHiHrT‚ܘZXóˆx6.3?°Å Ú*k,Ñ‚RŽTË\ÚëæU6%‚ïÇ S*(1¸(c¬‘8¬ú­o³‡ï ¥!auW@%¨ù®ã3xEh·¦ íßÕîifk=ø)ëaP•Íâ›çf›É™@©/{²‰°ÍO|›Ë3úŽÓ µÆ~«*Œ•õÂGÙ¯‚ùÓÅZ¤B%õë&˜œ4ZíŒöºhgA•ù±#™…×€gЦ!Ñþ¡…Bwtr:D½g2›(r²-ýþ;qлVfØ´BT–.YÅÄ(]`]Bi—Ÿ?º=œå£¨ûݼŒ£9³°p3*©.x}¼‚Hs‚ÇU‹¦Ú¶a¾PEh´u®,Ô›¦ƒØhúÞç7~ÚÐi ÅpèE4ƒrÕ¤‡žÖ¢X†_å½ç1˜,XýŸp‚ä›U³ç­(¢8û†ö à'V³&‚Z –!CG–XøÅ¤F¶Gõä›6'Ö8°â}Ø™Òïö²¥•9†j*wœU}îàFjÙðmèÂ>ÁýŒèä{T.;ov2$û’´EüŸü íDà‹k_ÉdÄE`TÖ¯ÛOWxã«Öþ+ÙÁh¢¿Âª¾û‰Õ°ñ%(±Þ_5MiöÉéσÊ4t-v¸År(b¾•ØKãð ñHfy¢ÂÆ“ÁaŸ%N¾¦Z›“~8Œôʼnùä„ïþýÄ+—Ð`=\¤¬BùÆ=±"¬°™cì󉽈,~‘FÆ#-póÒmAóHl’w½Øùßl<8õÒàn–´yüÚ_µ´‰u(š–R$‘7Ò² ŒÆ³“ƒ €Ò¹G—6L0oŸuØ“‹&g»ÁV½w{EÇd„ØPx³ìº;= ÇÀ`Út'ï\;ѱíh ¸}xo• #Ð×{ep9Sjähá[qÊþ¹ÔºP_’p;&D’Bßèç©•30`Òl6#xþ!'冾ƒ^„”æëøƒ0ÚƒÙTñàg³mPî¿QÝÂMx@„aÓ<‡”ØŽ—0ÔJ]‡þ75kð¦è·¬²hÊJ„ðb~<ß6glá@½\-A¯jà÷®£ŽŸ}×=€8á´Bœ^sh+Z#ÆöõtÍ~v'º™P~HÛÍã¿øª-èû¡ ◾əï;š¹ø»!e4zâ.l¥H6€‘`­?}-…1 `òÒyÞjà;¼!Ï>;­G/Ø6=‹>×þ–³,g-ocêaô_ŒÅ߃5`D?úAtÚÕf¤ÿyêǃª¨WMC4ªëɧCïsâ²'Y$€7ÙÙpû0  ÊøSœŠZÖIk$ì\ašÑàNˆCŸÃp@Ñ{ä?~:{_Ï¿ð’vDʸyžbߢұ¢Â8ˆµ=-Q¸=E@1èœmùaš^B)K±×ËöÇŒB•oÕlbƒ1ç­8¾U+“#·Y̹リ„¥Ã¾:J[ç9»3–W~Ø’õ”_¬ÊÁ¤Eè„–ù~p;vº÷%ÿpó‹§S±á½›vBc1Ô-ÞHÈN%s¶“&3U£7֌シ §„tiÙóá{;_ýTÀ‰­rÈ5€ÂH†ŸF‹eB=pÇG”ÂÍ¿%hÈUqIî˜r"n Ã0ÍãzŽ7©—›»ÁÇlD›5×d á#ëN™ÔuÉ!’àÆÂîín÷ÌÑ»ó×¼O½œøXfAÀ‡# ÜUƒÈ‚¿Tyð´ÖåÇ5X]ðçôg7ÊÚ ®—?*½ ½LîÞ!³AØß— T,ýS(¢óÉí:ñs³Õ¤ÃÄ;!¬µ|3¼è)–%¸, ÿ/¨søÅš¸y:ÆÇ@™ ¬Öµâ—ÖèZ*”ÌÎçâ>S®n½6áYq£^kï˜ZÔrU)Á &8_û)L_˜ðÐC"ðLT8”ri„jTH'}¼8«ûÚd–0‹þ€Tùù$ù]ÎpHtƒhCðàÍ¥à~á¦rð›M¹bVzP×8éZyã KÄ‚íÏm+w¯ õ˜”™µôJ•ÆÑ9öÅeRHíw örd¨‚ÕnX£ÃIÇ.Wcê…jí¼½‚ &µNsÔüGž5™¥ðcÊ̈üÏ7.`†jEð8Ÿ"‰ú»£ÿ;Óp âRÙ<ˆÄ@K?Ôžwâ­u¾u  ƒÖ9‚Ó¾ˆ¹ÐëN‘<2_ ³`]qcÒ­âÝ'LÛ$‹\A§«£”ñÄmÎë¦ü¢‰Ÿ!Zm-X,Ü` ôPõõÍf %i‚”ÁzÔ°%*g™±a9‡®^µÐ¶æÐ}Üd¯»Äû„n±qQ­÷@ú=¬$²ÂWO(˜:Eð)AôcT¶ùnïðÊ9Ò­äù"óÙñ]›ìwý¹j}ˆ,8¢©  5C€©É£³’g!†(>\:4ÂóYë|÷sâI1û»·L[²Ûá×ø8 âô>Yd‘O«g3Ô«‘qr¿ó^Lú™¯¦•Œ®iÒã'ï¬0&¢½¹Zž-b鈈`À1t÷ŒêžN¥ÈU§YRzeÉÜÿvþ~›7]áqh/X¹ßÉÔÚx íSô£˜ÑÔÑxì¾ð·u©1¸m2©*MC™u OwËÖðŦӘ÷7î#>ù=~lGf@Ó® 3[«Ê•D¯¿É*Ÿø*ÜÄ»¼L¦ËË訠¹¥"ÐłÔ—&(bwA62--Ýîíô 7ë›8ƒL½mAtÜ¥MÞ‡©´èV3ƒ‘Éï–]åCɽm>3;[hçѲ]º6Ô‹¾a†\dï×ïHQU„c´ãè*]«-˜iêÝÁKLÇ`@¶áXéßN!e¾X:þ– 5OiAc‚S\“ÝÜ÷ç|³défâCjIL£@©Œè|áç±6‡kÙO²ça²…zÛºA±)΄e>ñ¢_h³¹ŸnÒŸ>™b¾èY7íú>‰¸0cdדמ +ƒ‰èsã÷=áÃ|Ï-çõ}k ‚g¯ëôjÝ‹TïÊø¹Œ³ÊÝÀ=?Ðoí_Ý-3AÌE,ú2&sðËà44q 7¾”`ŠQg¯S~,Š"ÄŽcÀ…ÿH»‰c(Yú6—R Ù!=ŸÌ·³8šÞ^¯¹‰, Ze¥n)º zëUtŽc<2Ü! –YèÕÖ¾núÓ‚¯Ž-j/Y§z#5J-€° °Û¢,–àdÄU¤Ë­9pÜdUÝ]¿÷r-+Hý§He#a}h½¦Ÿ>8ž y’Þq=BÜ~ɵFЬ·<¡qp¤:| ÎR2˜Aᜩˆ)äJÉ×Qª €à5þÅh|C_ÌGšªo™y WL—Êæß15Þ3–çeË YzÁšÏy…FŽÔã¢W{È`ů«æìúî®K(g¼‡…½,8(1£vôÏJU½ñà:(C¹\i!¹fž }º¿âó÷Ð*:Àέ´œqÁ`†[Ð-ôH–ß96b’’ƒ‹Þ‰”Å—’(D¦8æ…ƒC®èŽ` -W+ciÌ9^˜ô½÷@ƒVíDù“ @ÂøTZLÈ#ʽô,vt­”NÇŸ)ï¸ä¦bO‘Ùp›¤Šî«¡Rhßl4þà êCàf¬¡ÙÇ:ð¤ JËQá‡Q6M Ë~ídì“zËV»ËßüfDûq[të:qjF§NíjΦÿj[ÚšæžÖ'œ 0Z?Q&߆·=‡Ï,L"ÚU>¾þ'(nØ:5ÖüêzË,¼Ô²¶¹È k½?x‹¼Î5›Öd Zk<•Î&5*B톥T8%dhÑ`R“Øð½œ wlQR ‹ÇÍ=½#Íÿ.P½tãÇA¥Pg6”5¬ÿiÙd¶fökÖ‘Ñ#q¢nl[º¢íg3Ӽϔ“¨þ§¬]Éwl¬Gbܯ$Ûá“c"î­>øÂ/&›œxj¬Ö¾GÂkÑýzK•ƒ±…î & ‡@Ãâ‘NsÅ@°“våß%mxœ°Ð‰3 ?Ŭ«ý@©N¾ Äòµ%sûÝDxð**Í„}ôÞ8Cè){x‰‚kuÜzo#׋s¡wò4Æy%Uª¢©3cöh±B_™‡€W¼~^ihõ–#(Øy`“ÀF|kû!š¬Ç¯7ÆÝÄs¤¨÷ël¨žPP/­ ÐE¾H1˵£~§œz†Œmõl²àãT’·xlÙ<áÆ-*õu؉ŽiJDÉñ¤¼ˆž¨ëHµ3aó¹Õyvëúß.lŒ¨‡È¨ iÒÇ«ÑÃ,°Æq¥XP]Öüúås•A&µ\¡,<…}<ѧwWªñ&œ EøÕعJ§ò¹ÕEÁhŠ/Ç`ϵ$_'3)A ܤtõÇ dÇýÓ© ¸Õ½ëö³#âö骰Æõ•xdä}_Öîÿb1¼øA-ÏB!¸u Ìál®êdš)ãYìÜß¼57ŠMŒÿ{»õ])})*ì=–œÍ¬øsì°¹Û'¡ ö»bøð¥o òw” Žàù™n¯EüÚÅfÁ¹9*A„NîIJv£âÚŒo´ùž^(9ÙØÑ\2—]R}Â24êêá䌷3’y; Ý¨"øvX‘J6±ßYÈNI©œ¨DË—îÎ3£«,Õ®OäÏsæLJ‰Ë››$á´ƒËÀÈ äg ³"ìkX4WlVºË=¨°/ôÃã±$Ö»2ôØA’!~Ø…À-õ¯Õ=°Ã£%ü;Ô¼ÿ]|ã§ŽEçÚtãvØ3%Ö9%ß-_&zæ”öòVȧÇÅo[ÿs§]êÄÞOØ:ÆFq÷Ç-L1é4p¼˜—и¤Ù©E”MdÎ’HdE‡Ûä}GóXƒ³÷‹Ø]J£¶Z#>¹Jr}-ýCwŒruÈ-òôVñ/€Óm©Ý›—œCäàÿTHžK ku×›L2Û{ù ÑOZ…çd«'/MÖ5vˆÜÎsšN@aƒ.9+øÒË.[«“w>¸úó#÷÷ᢸa8$8©8ü¾® ñ¸¥ÇÿG›ª1üÆâ»úv-ìú+GKâIŠÖ§"‚Î"ó&âÄBêè*ÁsÖÕ9†ÊŒ’‹d?ú©˜^Fÿ]ç2–´ ®ôâ×K[D£üwœ4Tªû4¿3Д9U_9s-Tzh•1Å€”«ìtP2§¡Xâ{š7XJÈ7¦¹ýý 0EE­9%É–v Š [¥˜žøÁ‹|™BÃ9»Žqœ¬?ÝdŒ‘‘iå² 5G —°yHÚ&àâŸ5tMÜ–°žcªN©áð1AF?ŠÌ" «¥ßhÜLûûû0ƒ2ÍÉGpZXåŠ{áfwÔ¤@£˜\qÛ.G‡“Ò“Ô–ð=v݆ÅùŽ[Q†ÔÙ¢yaÛÊé^Õ5äP$HkMª’´¥Æ}aÕÇg„> ŸG„ðªbÓOÉÌ´Ä¢I.+¯@þ†"d7œ4¿`xW¿"N)—|Æg§=«KS6íL„„¤-óÁ񠯿²¶À¶›¤tóóà?¸ü ³r &¿‚-ÞÓ§n‘Íhjºy›ä™¸ÚFòÉ,šÅ6ØÌ`Üüß}/}ŽbÈ \Ýe à¨Ís8K ~3‰¡c½ç›x™kéÒØ­¥;«…äa¶ë?ŽõU¨ð–Æ5ŸÒ2D¨4Áå‹+®òeÒAñª¼2‡+õ ×ŸG¶þ§dÞ´Œ\lè;j¿x¶®¢Ë?FA@%Ül’‹XÄåz‘ÉfÀâT4a{çñí`÷ÂëÀ}×›SRL\#"ljAXö™BTïýû…Rìè§÷yú½elBK˜hwP•u<éå ]KÃfqâ®ãrÿlñ›-Ö×…ÿ ïSDÔT¹±àÁU — ¹H Av4ÿv…­™‚ß@×ô!ÊÀö1™@ô8± \¥¢,µ+œ?™0ÛÏÔß‘Ÿ­rÅQtZꥎ0•hìˆQÞ¦¦¦gûŒQÆ—ýØB¹1ç«|øCXcå¥öVhÓ(—í³–ÆvUÞ§ßÞwVj»ínTz~–Y¦îÎcê£#èµçO^„þßß÷Êጼ!¤r xß-.nb ¾ã¸øè Ç–Yý¨Žºv >qDÁ85jÝõ‚Õ@žt[.¢ïU5‘{éÄ‚òG±wϼâ YêÍnʺ€$"©ò8§ú!MˆÒA-5ÔÕ¤¬«bHwÐÅH@¸ÖÙÂÓ{¡Uß1 Ñ 'Ô«pç…ÇJpq½r`bÉçÎA•ï" ò¦ÏÇB’žúRöÖC%-÷ígJQÏ®“úH±§½lTµ F8ï­2æ;1¿ðDØÞGá”kJòs´ãH±ï1ÃqBJv¡Õ$JÊęͱÀ¿ÏÊ7ó¤¾ÔBÕv6Ña= pÕÌoäèïâ[êL6ÇX¨j÷0?^^’gÆ'O]ÒÞá %=^9"™§¶Së¸ï “Д÷êÖIÖ§™~ýWL„4¤F+kšT§­rçbB9¡?0ÞÇ’äš×—$ã´ùO8rýñ”¤=/kÑ÷¨\_÷ãÓÈ64”±@ÿz½Vº|œ¤xW ¾Å÷íOÍìˆ/é‰ðÚVº¤¾ ,&–ûfóšÇ"áÒ‚[ñsR_ƒ*W™ñâ’$cX¤÷æ®ôT(-6 aC¬î!~$åŽpP*Ð|òÌÚÃ˃¬€giPÞÌgâÔ’L´q"}y×™rŽvÒ$»<™@ƒ¦NpmzóJ…ÑälìsîKE‘ºæô)vŒÓrg“a~o™êÁWþq啞òçÒÅŽ˜Û#ßÙnsÜwû³Ï…•T¤ˆEÕÈñÇŠňê¼ÜÂÄ©<%Lg% µÃÏߦEŒNyR`µwËaoÉÍÃ&äB®E¢¶¸ Ùœ3«Ø"‡R€âº?ÓЗMs¥‘§¶ÏÃæFàW}•.Þ[]òßÊ—ÛcmÌþº\°‰£·ë‹ÍŽ{Hñg¥“ñÏo‚¶£öqÜ7#y¢›™ÚÍi<ƒa±À9 SÈRA¬èô^.˜'[È›ókJÑb2S”ŽSƒ€»)¶0,iexÿfíçZRô¨¡ò‰ ÐË‚êxx„÷8 /Zw€OS¿Ï4xl [ ÁPK<Û› `©çE™É/;¶R‡|¾d(R] -àVtNmëMІú˜d>X•ü‘Ðþ7“ä•îyßÖ¸IÂþ¶j[Uo±!ê‹k'Ò“F‡S›–¶kð±?XÔ\²p»Œ:³ Aç¿ æ9šQ€¨åÃwræ¾Aû|‰¨2oÉd)ؘùa¹Þ ÃÆ³–üÜFf Í|vCúGQÚfUfl„^ÒŠJ\ˆ*‹Øs€±U¨‚›ó®6ú‚¦hÎ’›s‚‡¿hÝ üõÃñ1ZÃ2ä@j®Y4íìÿb”5¹âael&(ýã8÷oÅìù¨^0à+}¬ÛÀÓð³ËIçÀüÑqb-¨ÏŒM%%,ܦ–ŸZ°LEû‚ÑÇâlîm%ù {+0㊠™è}cêO½1W¿@æB!zÏ »¬p ßŒ7ÅàŽ§{ÝëKÓ,Mö~Z™t}Ö¿dT btœ›"س¸W‹œº8«øOÉÅJqòÃbÁ^nüúy>Ìm™sVvŸ¢…A¦ÿT®Ó·%Úßî,\M R)è¾>d4Òj·æ@—‹ºît/I¿"—2^ ˆõ௿ÐNT-±MlOõQé¡T’Ÿkk>ÕiÆ€´>·Õ!}Ø~J«§ä8Z¢*|°4õó"×›û¬)š¸'Gå5@ç*=‘È;c˜mK ]µ.k:K¶]"Ô÷( 1ãx7¥Ã*%ü½V’÷< ÿÙic09# jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ "’ÿ“ÏÃC@+ÝÌ¥? ån«F‘t H"$ Ô̬M6ZŒA¨x=gOï{Í ÖÀëQm~ư[)ñZÈ#…"_ÄÆûÚü…nj:Rcm2pàÁ³C6 ÆíÑÜM÷^ɯãæQfMº×hãs˜(7‰I÷ãó¿µ&ï$ÁeÖ§§fzºë?ÔôÙm Zæ^/¿± dÏãÌ `x’7bû÷ûzŸâûmñ QmÄj… ³s)Áº«Uaû… &Å<z¬9ô`7ôÖ|¬û¥ËÆz« j|,!¶>¶À8ÿÇr‹|é<( ÏC•”¨m<7xè=½3_¶<.ØÖ ¬KÎé¹Ìê e´¼‘Ÿqºn€€ÏÃE€Þ”;2©'|ªþ"ÈfÅ-v¾áGÁ³P±žÐ5ܨr$Iï ŠÕKí†T •Ú(¡ûý!R_ì•ÓO­ªûã(”»›£<ö*ZE·¹*½`ÝÜÎ ÎçoòZŸ ˜þ³ ´£“k@¨=ezò ?ƒ\¯¦#kð”Ãà2SFá ã €Ó!ýHÓ9,™ÑÉ„Êr\Ùæ¨ÌÙPÅÚâëWvjõ‚¬ÛßjÆ+1½Õyè¾¥?Ç–¾ÃéÊZr5ø Rš¶õ’Š5Egÿ5‰3ˆÚ9!¸ZFrx­Ýwg_NhI–A¾ú©i´¢+P´ä}¨d§[L:„\7b»² >1ijœ3æ`«ÏÎàŸûÔ.̧þ¾|ÞÆüä,å;Ô÷rhÉéØ\°OÏß cåL÷>‚Þë{«µÑÎzöËoS^J q‹®uV“ƒŸ¶WàˆïãàhŒóm™6o‰¡byÖ¬*Œ¹öx«D½ú‡u Êݨ„Dqý#2ÃçF]Q%¥c…ÊÐNzŽIé¿1Ö:%õs¸}¡ëq2’°ë c®!šßòg+ú¹”D´*Æq3ʦî´ÖæKÜæùšã•]Œ>ï'?×±¡áÈì•'iÇZDÅG\~®!8_¨s-È>ÑD–=c¸¨Ž›ü¾¤_ymZ@†{C\þÒɯxòé¥=ÃQë1£IV=G«¹ó<ÿE —MÎtd×U@h_£Ëæ [ëXÃp4ƒÄ†Rr»µó0ö]ìÈ·Ó/zÇ“yïâE¬wÿ$¼wñú2iæ`ß,ãϪÀTÓºô‚Э$¤Õl;¹…Å3ÔN¢¾T;Æñ!ÑaàÅÁR³¬©–¼¢që\:¨ ZÓ“|¯û!2mLäïg…(²í|jÛwl{Üco–Ù˜@"cÙ/ÌÔc©Y!_{ò"]ä ƒáàN¾FpÐ'§ëT&—Óf‡ ƒV{4²ˆ·( ¾˜ÎøÍ”¬îmÝwDý¢"ÀýQ/5^‚~E#*>½¹?gžíVþ‹€U\Õ“¤4îääT”EÿH^Ø‚5ó%ö˜xæ<'ÇeQ—ýbñ1´XçÅ—ÂìïL…Ø©”ºà¢kï_*‘L™ˆ”ÎéªsáïÑQËÎE¬.XÉøA/ayR€€ÏÎåŸÝÔ‹µ]LÙ×?©þ½ ’£Ö¸`ŠÌ‡LGL Vçµ:  §5NS õž çªLDÀwS!©]*á¯ää_¥À¢+ñÔ"Ó9–?}÷‡^\¾ Î0S“y<àãçê^Z²<­~èûI‰xµQ–Çj¦>‡ÝºrM˜_1DÁ.êZâcKgå2ëøa‚qÞé3§ 'çÿkŒ}R=F°X¸òÒ+d| [h$Ø"X£¥%7%[U[1Zs_… ör7g'æÂ¨Ø+èWþöáñOøXYb?ÊkDð¡pƳŒßín‚bÅÒ;CS$¶¡+ƒYdVfDáìáiŸÝò²%bXžéüý(;ºE–Ñš)"èwe¦é Y)ææƒŠ3Þl»>º O0ÙS+ÜÏÑö08­’UÐ$žeŸ„B‰ïvÑÚ« øº'#77u–Zc­Q¡Â¶ì-3Y"bÔ˜ØXÌ®~Ÿ#Ðv³P Ö×xà}%@¬ªÆajn‚ÆÃýUë7ºØè’lÑ-l`s°UÜS혞ÐáïsÂAÆœ˜&dGzC©{3«6gñæ/ŠøÉâ —ŽéÝûÝð À=Pç2·f+í»`Á“… l?n‚ÑÈÞHKéΊ١ ¿cºuøzÒ5øE'Ž šj+J®‡·©²Qý.Œ»fñ¬KÊ’—¯ùòƒŠƒ†oòàÀˆÂ·©Ñ¯I»æ8û¼á,‘'!Þõž\7µQFùÇÖ5œfM'ŽéUŠ„ªH#Òç¬&báýõ¿’§w÷¡&9B…â¸Î{UFIø=¸>ñĸ%­õýŠÐôö²žÎïD–—5¨où§úÜÜAéõ׫5N-;»j¶ÂÃ$ÅlOïÏdA$¥T¨ßµ.'+ò3Ê[Í oÛñ‘áÃË—Îb[Ñ¢:ñÚÏϧ‰ùõ¿ŸRůÔ0Ç3(ÅÁ!U&œAª˜®4“mËwˆÛ¡NC: Me½sª0cÒÀßSlFD›Lƒû¨wc‘¨çÒñ›l“ˆ¤€¯î’ý1O"8èv£™.—‰ä‚‰6s—Ëz-D;m#©O‰Óqve— ›Q 6ƒØnsgÉù{„ÙïÉV{ ûµk GoÕ«iˆ$áÇL¹ÿ.¤ó ¦¶m-×O©Sá$*{¯‘vUåE”Èvúà÷ðúÕî½=} +Štð‚E.íuiÔß#Û=Øj8[%ƒî 靖õL×ZÜ?ƒâÀf[™’ »Š¤òìZUÂô– Ì5C|²¹Ï°éÞ×Ñ”ÈñúP-öÜî§_HÂgy &ïb•™IGN  ù«^çÈÁWÌY{ Àì.Y`ðí³‚KÛ"´½%¨ã‰>÷ý†º±Aù€JÚpìbVMŠ-~e½¹w ãañ ´f"ÚI¹î+&ý9â›Ú5#©[!Wµo†ÔˆQHýèäÓ EŸà~0\É`n\tf»§f›Þ‹²BŽ^ 3 ’f¬XïüÓ)X$|àë”k ðüÖÚ¼a+ŠY©vKÌíö5„ŸÌ¡É_$7ùóN®´dX>Æ.s8ôKbêêU¿vö(ܱú ß `6 ËJµ«®Û¶•4¤9¬Ð3dó,¯ ƒ^‚C`Ű”+®ñù© °Ý‰õgê‚ñD›i.["±_Éd8Èã&ÅØ\¼¦k»9çN޵п¹5Cg[A ¤º~“M ¤Àâ:dáÿ];)YÇÓ¼vø®Z•>¯ d~ #r³¹Þsf­Æð¬ÃÞy¾z<à5]aiâ XJË)úÌd8|l™QúéEÑ•Ò< UWŠÔÿ)]`dh§ÑE<ý¤X'`sC¥žŽ·ÿE°÷?»;÷%/õƺQ.kè‰(³`_0ò ”´4ôÂÆÏ&wxî°,},Ñc¼.óóË6#nÐï#ZÂm¹f"SgË >I'懥d$ÁÞ¦ Ĺ &A¨xc”ÛÅÓsþ‰ýŠä'ÙÙô‡ØoÕ4¦NÔ[•Z¤ëÓÒؤ8T•°$ä€:ÚtjˆÈùãÀìÈtëÌ…%N܈–%.µl:g–‚=NÑ¿ºî0c¡lÄ ì!償;çÐPvô‹Ìfàñß+e_hòEnô~inoFËçãâ^ðŒ˜Â³̧þ]ùÛžl‚-ô×X'X Üã;làé¤÷AWimÄ [ÎNÛÄ‹i£µ2Æ3x8Ÿ"¦ÊE¬Uª§n?iø¨ºµ½ž¹Œ?O­€…hè–€ÄלÌ ‘.es”Ƙý?JžiŸèÿ…y4Ðz#ìCŽ¡‡…v¸µ 6“frMœZb­Jí¿ÿ2ÚmsÄPæ#C‡Ñáæ,ZV„1~¯Œ ¸3B ñCÚñ’(ÓÓê®õ=€U%„³gï‘` µãB£ýmIUó¦lÄïh'ßõýZ~AG€ÆµX¹ÏlAê£+nF8C²~C®Œ`¨›e“`A‹Ùô7n¿œm•Ä” ÍÑ @W‹ˆÉjÂÃûî%ø:z*Ú;gŸÅÏκ|Æ\OçK0§Í«˜7§OÛöI¿ù ÷]Í#ÞY4ž`D-•Ò³a˸ò˜cÖ)0>Ÿ›öœÜà§’¹ûlu„woàÞ>òkSƒŸÅ#ÏF ÛšÖnô͈åpÅ*Ú¹ªWÈŽàšg}_Ÿó“ÑÎ kGdÇç'^_Űf‘`g¬2w-µp`Åàøýª™–f=‹OwŽâí¡7xã0¯kÖz ¨gÆ7;)i=¯¢•˜ãÙËçN«ÏÀ!iók¼·EkoÉ”­gDCØóH,¾ÇŸ²Þ}9®2I‚SEIª FÙdÂù&Í\gˆÁØ9Å*åWHïáD%B«€€ÏÏ¥øü:kϦÌO ® Žd€ð´*\‰dËnÛ\š×æ'¯Óe@m™ƒç¨rè—^îxë…p9œ»£û®£a l¼ýɲÂtƒíð`¼_ß&FÊàBÀÕ×ÙµÚð¼½ dy7OàçI&’qç‹ñýag¾¤mÉ6‹kxÒ©Î Rû£â «,¾Ñû@Ò2ŽTYø™·æ ƒyµ¬X*öÃqÏqwwf¼:÷ðùy3PÎ_Á ÆQÀ¹Y6E««·o¥}ëÚ¢ï¤QP’ff$ô;‡’²AL©b§Á ¼: Ò­®²dbD¡»p·°I*ÜWýIe$¦ X½ ªœQ”F©lßÊþýʘa‘uŽƒUEÂ8¤æuæ%" ºj.šoª ðž6Þkjf0¤V2D­É¹Ó“®­xÞ`éT´ÿP‚ÁD¥ü¸©ÃíŠSj74¦ §Õ»ŸiVÙé÷=½Ï"|ñ3£×«J²&Üç÷ìÆ•Öîª/Ô(¦|È?ë Ó=KÙJ<Ø×Ï‚l²ÆIêžSS7°ú«ž˜6jp¥ §PŒ6(0È3˜‡l¿a9=ïu,ö>P"3Pœ³!/Õšµ®/Gl5Gרm­X<•š5»4ˆ N>{ƒp8ñïÿ=øCoÍ1oÞæzn¸×¨ûËgD:RIgÔ‰r5󃃪*ºåœIs;yY$¿öÜÙLY=I­)$@Hk/Hyû»„¶ü³¬¤š½v­¬`~ÛÁ\UöL„5Ó½¤Åå–ý(„Ù¹»0ÁÌéŸÕ#iþ)À9ßÅ‘ZI®O[ö8ÐN¯b–G!ãHJ®JTD6³:šoÎÿ%QÌ=(àšÓ±ñHœs^ù9ùUï6È ÂRû^€.-¯®À?Q6߬ï.‘±Œ(À•ÝéœÏÞCÙ¯Öp•Á9—M¸5q8À'Õ¥ì&-Óœ€ŠÎ,¡ZçÀ¤ÒÈGðRHéCŽ"z¦í¢~Т¯¯ì&õk…^ÈP¿\XÞâ?GÛÐWfÐáYNM‰¼FJi°î‹“ɼkÈÊÞ¼Ï=þÁæ< OG¸Æ ý×xÇ•HöÞÛ!S?¸  „l &Çãh$½[©x³ˆ¨üWÉŒéÇĸ!…|Ì,|Þ ‡AP‡&^2S6W¿X#ד,¨ƒY[êdúJ[–$ÆãϽ1*î…¯ SL®Š4.oé9Muã⨟eÈ8Õ=#ÝÄ5:¨íçØ}c»]›¤¡µCÀ×NÊR ¥øiýÐ}¤ÂÏPÑZ4tKœ½lx\Õ5Wr©x ÅEh¦„ì£myKØ¿dI›Ab5 8²WRMm\sÓYïoÈ3fRA,,頶Ƽw€ü²B[–J1°vËŸTx—štµT æí£)‚^‰Ûbc¡Ó?*¿Q±ÅÈõjõOp7¶Ê2Ç#x¿8Cj6ó¿ÁcƃE'+y§}þa55Tþá‚ÎÅ3<»Ê.æ’.Ìš­¶Éâ£ßym€áè-$ˆ/±i<£Rg(áÇœ3¡KJíÈÚª`÷içižËܼ À¬3OJ(/*¼aûý[žþ~âlíäÍ£,²0=ºŸ÷ u€,À;FÓ@š×%U'TmwÒ‚à évôñ !Çð£mô¡³SðÄ68ßйäÉâ7—>±õã‚©)W[Šh£žª<Òz(Fbä,ms„8¥ e`Nuf¼/ð&1պܓ˜f/IA¬ärè²ì)þÄôŠbŽ6£ýfÅä¿]èkË”úÇŒ Ìž™U œˆ!;x²(·ûÿa~‡³ÕìÈDùò´ 0]‡"k,æ`…®oó0v™úÂÓø! Î\ÑH›Ä¯£bÏ‚)Ò9žÚx®è$býtR ˆªœÓ;œî¥Î̬8ã® ™Óôé™;¼.nž˜Ç-ÊÂ1@ׄ³ÇÁ­;Ë(Y˜²ª¨ÕDq}éšÂÂ8)?Ü“f:–ž}÷´ÝêêåR«ß0uÆ…QySMj+#ûv^Õãí×äb~«Xkg½<·»KtÁTdf6<Ó+Mb|]1*~–Ã%p£’¿vPR¤#æï4Ká?Ö,'•\_MÞÌâGA–³ e\O€©×ã”q¨1°Çeþ+qUJ¬˜ê>¦iwQùýx @  ’Á®–’w°JÑÛé^Øë…SöߟR+Þ³Ÿ© ]û«ú«60_8¥È3¸?„1¥a-ÏÏØB~~ÙQùûêsFÛ%SãɯÏbµ‹âŒ)åŽ[ý<ÒŒ§ ®ýÄË€YG¿±êËo.ÒùÝ9žiD} v¶$fì·M¹òHµÆX‡}ñÚBüv¬ÆÜÎ(8µß¿b=¨–òª{s¿¥;iý#t½ Ní(z=ñý4Q¨¢2_b”Õ `ðo÷çRÐÕû "•¹éRGÍj$ÞîIZñZ.sCWjSR \['}ûFÖ÷’+èýk¢êÛògÿqÍÏ‹Xø@5*YõÖòˆ®¢CÆÇÙÓM-R¨×xˆµÏônÍÞâèrFÁ²/ÚûEˆ£KKjP¶ u˜Už÷n´‰oË¿g^Û3‘ Ì™>jÔøðL>MžSt¿¶ÚÃ6Û‰·oÉÏšÞ[ùDRu•MUŠò@{îîZÂ¥ Ì.)ˆa* `ÑòGý¢à9˜šD#çw+†ê/ ~e iðų¹#~maÐS”A"ZÛÕ[Ê ŠÜî^ÇlK/ìêœ$h",Y¾­ÜéìK~1¨VºÇ,=‘: ¾Íl\âB—pð/V0?éWÞºB‰k€‹Æ †g¶þ5–þà4xâ–9òP¹ê/8*ŨIè‡ÀŽBvIU“ý_—ú@â#™ ¿‰M¢ô9n £æ;mðÅÐ@×XÎûþÉX]•Ô`ø±—¬ä7JÐíì-6§xmY %Å{°6Cªà±zËÙÖÉ×~ûq²¾=ð$¼å(³ö¶Øô.äÕþtîí|­Ô,¼õ€=um·¬ Ù¨~)n<+â¨ù+8m¡Éi[/x,œ¹~vÅõ¿SfÓÆ^ŒN·q#Äh^š«h±¥ ¿4¡¡³DY¾¿mK4þ&ST¶Ñhv]¢~–ÓkUšÔ]£¤QÛo†8Ø‹àe z~T}«‹"ân1ÏŠÌÑ'š‘Y7Åd¶jc›B˜ß¶ Xé9mc’hVÕìmÊ_ ‡óîyÝ‘¸6ä÷§ ¹×ª’$Úþ2Í´44\Þªy*礨Á ¡Í}O¸îÝub‹ïßg-š±Ä$ÑI¸¤–T”÷-cø_,°ü¡¨Üw??hØÝv˜ z‹B(;RÄlXC1ÎJÊÕÜÎôµRÙ P“I²´Ò¹G舠üR37âÆ ‹Âxq— ú*¿(g ®îl]MeÞL„p*N#–•ÈalqO¯NЄbÏÊ’û¹Z,’~æ¼+G08»ß`ª±@<æ¼è¯a4³Ê‡ùºÕÁ®¦ Ÿq/˜ev×ú[bÖŽœLn -îûul•HSË# ðmP? Ü”ÁadËôÁŸ+†)eø/ÖVRhÂSàŠ¢pÔ´Ïâ™È¦ÙÛm)­3•¶!6!hHÊwK³¾W¢A³ÁLßÌ;ô 12`Dg³#sÛþF¯á<:Šû.1ùƒ[n¹¡85~®ÀµëÔïä¾@Ùd“‡®BqwëÑ,ìì »~³•G̋䂦•¿Û„±B`ÚåÍÉñMqvÚ“þ˜-d±;¼ãDû©9Ø14ôAÜ…Y_‡õW_‹y8o ÁuZîæ!üNòåŒÏ1)Y ë¿X˜“qZ Ù<ÞeKùÍ>û–ÍõTÁ¼©ÿ Ÿj§pÉJ²6ŲøfÉÐzû,_;…°ÏIâˆ^‚Ûäà´n€&RƒøFôéâ¤`y I#JЛÈ;+ŠÍ¬WDŒ?K,SI6fÍQ¹«nËêÅ8D 'ÊEÒ(jbPÔÈ—ê›b)|jÄ%Þ-]Îá—ͳ ÒéÇÅ5aÆ5‚S`Næ|Þ)í®Ï$ñjqyÔîMœ¦«QC×ùïÇÕ.äÑ‹ÁíQË®ÝÓ!å×°¨È2׃)_]óß2Ú³ü:Q ¾PkoÆ1süd½w‹ë%éœ\ÉÎ\vG‘Í),DúÓ,(íàüî€,8 Õ´]ç}0 ÄK)È⊑½ß™ú/_ "êé4{^ó¯²×x×åžZA;IzTqÄÎŒ·¦½TPÂ-Amtx J?EKL&ºƒ!ÿÿGß@:˜ÔÖ£ÒVIg-gê6Æüb®å§Éq•Í8I'yà 5hT“,‚¹–MÒMZzåDZ‹Ç²Ûò›ŠŸ)åÌšt¹Ë?»ÍÊÙa„y‘6™"eØp~[‚˜ô^Ý›ãA¾òzdÝž ñšÝºÈ­˜I8ß’ä`ü&4h&YøÖ¬=ä8‚Dêþ<»QÎ78þôó¡e‡*‚‹–u:xš FqSS&BÖ6Å2wnÚAMïù?”àJ½ßHEü±Ø‹º«m³õØóskÃá2$’m[¯êžÓ/êÉ¿?7¢Éýä#mk4"=žPÈ‚|t°/;˜ÿ\êÔ9r^ÒnÌxývÕfq¸»ê¢» ¡"ðÿ´4¬™”xÚ§Í`½LÕ?öË ÊNË\¯Ü!ÌÇ Å”nà©R[JÁƒ`)Ì0Ùv½Þ,àô¦†vjÑñr"’/£Q½/ï¡A+ÈòÏ‚¸8üZ ®°ÊÙðwâåq4R“K±D.ݰz.@VÓKAì-2¾³#Ñ=M±<ßwùq‘qõ2ûGHS Ú`¦oÓŸ!«p™›žŽa€gËCîwž¡DÝ>Yy棟]Z1 u'ô€þÂgô£§bõ0@-à)»³aIj~w„Í]]¿>U8|"$gWk‹!³E*<´ç÷hÙhލL‘W‘—ž†¤©9b‚s„÷Ad9l)/fÚµ§m¡›SI/]HW ç°ý.C”™F¼ U€Þ€0 ÆÞè}¯_w7ÎP¹d®áë$‰Hñå|°q(N6aÏ=oz02ô»mŸ$M]õòz  ;ù)g€Ž" E^ZôAí‹Z¦m¦ün{µþʻՃ×áÓ´`QÂ<¦, Rìò}.%m|K§k明L/ÇNò/‚ Oé½`¤ÒŒ­ìt u'C@pÄ’'õ2#[ÁA¡zq-õ5óÿ3üI^,ßp¯,²$Çcö˜Ý×ÞD63?[j¡«rɾ ”ͳ6Pæ.…Ù n'®ÊoÌ µSª…æôÖr·K|’ÒW’‰øU›}á€ÂŠüsbrËUÃ3áÂ(á —ˆ®`!˜*°ªby`BY.û떠Å ‡a¨(PíßjóZ –†"„ˆ€×ïèl«ér­e <-WÓ¶š¤<Õ„Ó b·.' ͦ7×Àìñ0ÖËí}“fsY¡e‡­2 –oð~]6užèïô;¢HJ,Õ”öl5ZpJ,?¢=Ë' ]z²%£69æâ[DÓß6e0\S ŸúáS÷0üæzÏ”vXUµ¦‰ìÏk‹hÒ§Ø´åë—ŸFˆ{éû?âÂ:ÎÁúÚ(òE“ý8¯b|ÃTf¦[ÅJÀïõ[=¾ó—¬8žEÜõ…Ë›È›Ž¥˜]74[füu:Û™ð¢K¯Ä™é.ÑÉíHwb¬Ã ¬èËæï1ÄzÞ÷vöY¥¢Ó´ábvÂi!7ݨÝûK(½áI¹ÊkDÌÎsŸ<7× xî±a/¯ ^Þ—Coá {Û“³ù„™˜ŒtÌrFŽû7&Å¥U ¸ŠU<_p™ÐF8L~PµGÜQn£(ºÏÁ­1è£4ý » ø"©í¡&'Ÿ­èÄ/ú©žJ·ô]‚Fß)q!žÜÑÿNÝz…I}<…°ôùÇŒŽ«|;rTô鯠m´Ôê‡ïÖ’+ -bl>ðUDõWÁãDµaÖ1  .Ž“hA9¦1*êö ½"tÚQ±tziÛq3h1~çf!)òV¥ÈÐÊÒèø%£ëƹs,€´sCÑ÷”UËŠ"p½!“±:ULªu/â…&ÂìUq$ˆBçùwþWä|­??蘤û -œV‹òöòXâÛö¶ ¼h,kÂÐ#ø¢Ö# *eó¯Þe¡fû[9ˆ¨ßRh$„ÏOú  ˜eá/¿]‚Ýùá} Ú[õ’먴0„”¾“4yÕ×t§üé½Yzÿ VËNE¤F±obÆ&²Ž¬Bl*b›Eïý3ZPØ$9*ÓÚ•aAoõ<)³[EKư¿¹ŽÞÔÿ4³ýhóü’²OÆQn;qGkOxn“»g>¾@ +MÕôf»úkÈ7W ”ùMƒ†Ú¬òRÔ)Ýo̘Š+ã{дš©3šß‡Õmÿ>Èv}A©SFÇB*X9Qâ¸Î"ô/é¾+^ÌGb*Žù(ņhӓص80ÃßcÄ~%WUc²›)5Ka2 i©hÅ“OÁãþ7•3H·’d€Ñ<±Ÿ¡ïõ^¹à¼íQ‰†Ze:-GïRò`hDÍêg(6äY!y·vÙùÁAýðÈiKYåDçÂ`À7ÐÀ—BU_Ò¾qAø·Ùªý9œ¹—Ò§Úsˆ°nGc¦à¿k†¤¢«@Ù³Û¼Ùî´ŽìÏÊc_Ÿ®µÐ°I}öû¨¾ÜµExÑò †2tš8K¯Ú›Uôx™¸'sMŒ€>ºO? ’sxj[rîLèL©æ›02fÒðoëÍâ¤\íl;ŠzÉ8Ú=ŠâOê€ÏvÖbˆ8»+ôŒºÃ ö¬A< ‹8¯ÐÀìú Z}_~:x­¯²¼rX³ŸˆÜ¡ γ9q9“.†[ÌŽFînFÖ à–ü"‹Y å¦ÃžÑ åáB›NÍž n鸷9n $2R‚¥|ú!!gáõdŒi¹æ}ŒòØÍaô¾"eeϮ뉭P¥rî×7$Ð8¿‰f¹†Ø[ƒja»M:ÈÇžˆr³Xbì$Ë1i†Ýu·Xö †Ýd»üâØaá1î?Í!.zêOr¢bŸÚ;,ÏF±±©ÔbªëZc^5Ê1)´¿ª—°§,ØYþCοÌEâJÀyÅ(Üq+QO#rN6é´Õ¶³`³¥`èíË3#úx®˜.pÑ«)¦6žk±qñßmPrZhì:ŸERˆ¢E=4 /F"Iß3PdôºŸäØ.¬7´ä¹   r¡*ªUˈŒðç´¥²ßõ8zêSÕ`†‘$cæà?Õ¹gŽÿ°­È@N yšæ<).ÝæKØ3YŸ‘µ“7«—ýtX‚ /Û6‘‚€ÐŠDPñ%‰Ób¡!bž€Ÿw“y};<1Æ$YÃ`y!b`â¿lM´N†öv<³T|í A”Φh$ÓEÓðRjŠ?0æ~hàM N¤Œ§üŠÌyŽá±C~ÉR%Œ·H?|æADu¤þçÈVº2©@PѬ•V[9æÌVáÌ)ˉ˜§Cð§P¾Tœ[T³{têÌí÷‡æ­ÿ-Y§¬£™£ÝøÍ%è@?/£¸õÌåêÅ÷÷ÿ0KƒMK³·é»p/äØOý¬ÿT‘üHîÃ쪒Ê@·ˆœK›ÿ†WBp×½à‹IÜUƒu• -±KÜSˆçÃFîΉ €@Åû“gˆ{~× ê¼ÚFŒ»Æ|Õ¾E\T‰€r¯2Þ`gÖví=§ñ6u_ˆ‘3å–iOøšÄÒ®ZúdðØ,¸DD—°<œ2¬w+K$`ºÛL=$-)ðTÈ&hÔÎþµŸþ±8”*©I•dû¢ÿaÞBñ¤37ð䃕s£b~Þ|\pÕo¶_§Ä,Rö?{…¥ð–Û¯ -Y„áãÝ8>5‡p.Õ’(ÙtD‹Ç¨Æf’÷'¶úç胵"œœöuŽ ù·\?5`¶âËé~š4ÝæËŒ¬s„ô‡ÙÛAÒ°IãBÖù áϯ‰5?Ö¨‚Ûywã-ÍÁ6“Ü0ï-|jŸàG\/~ßqÔ჆«vƒjã9RöÆ¡iÇÂf´¿T¨Â¿ÐjðI@/•¡cá>_ ÑlúÁñÃOkgðƒoÅyâoÔ2ìhHÎù{GzË®Äɧõ˜ÞQ¥á[€»Öá»õ§Þ¶Òþ0¨¢uæi 1p~Å\Œ=,?'H·Â¾Æ;"Í3Q“ZP&@vÁf$ŽQÙ¤ÍÚAÆâ—vG8T./èBçUóIVù¶ûÎ71€¿tz¥Élôn½YÚ–)eùµW‘vl˜LƱ¶¯}gßÔ·ýŠwíбkÝ‚tT ÔK—Å{†(«úŸ, ƒxç–² Zw{Ó­g’Ë€ÛI™Ê&²ì„è¯?‘m ÉR–Ø439l®W;7~ªW¦ªb¡¦žXûÐl$q÷7Å|“ç-i(óœãÉ^¶Ñ²´ÜNi­(¹«_fº`c ñítNذˆ\AI_.E×ÐîXãËlä­ÉR> ð 0§ñÆ­h›¨‰IÄÑåÿ;×¶²uŽÅ°®#É¥`Fúöp¨ƒb˜ÂqÍ~ÁínÚ*ZOŽXw–‚”=Rœ ƒdüE¿±­ WV½†· ÷àú5Ê&-y ÔëY6)@e¿„ѵ" 2~Ö‡f :«ò[pdX,(ßR´—î6­ý·ÖWSK‰~$qñjsŽûú„QzúEÃ*A ™“KïLZ/ÉKÓj‘¸Ó¨;n?¯ø(dãïq8î8Ñß3B›?ô Õ¿ô|¬d¼–5€"\ºÅª‘ÕJ ¶¹RÕÞ0>g,JDø³{¤«7ÿF TÐææ’Ó$à ú+’³ÕÁhõ\g”Û:B¦*rË2d7Éð²ÝµþÂKS«ÁýDô£Ë(%}×mmñþ`ø¼è3¨DC¢|·ÈRc2«7Hãé’¥Æ5}W‡N­ÀJëÏF–Ù¼L|»ceE5Úö¸Å`bMÂ: É’=‰ó†ˆŸ…•ÔØ2iÜ@°e3šøí“(i ¡5?i£§Á8yGx–­ËwQÀ,’àÍæúʰCeìÞ|ðŽ DDÎî}d»–ÉÒJ=9ßÁå6Õ²Ø'!UЖö†6HÂÀÏí^«ÁLÛNÈL€u ñä'i ~«W‡“‘ÞËð±”t[øiO&upáÝ™XƒÍ–EÔ0>àå’ßô)-ŠÅíbZ§S«Åƒ;ô)ÚuRÇó0lÚÁ!UH ‹NZÄÐ.sN®EfäæÀåmG5tcäü>¦ KšG±¹yZ–ð~®¤|Ú2’·²¥çêTdA/ßh¯‘Ýâ5•›æ:í]M =P»§!ŽZ“xþv†¼~L@`÷¯Þõ\@¾—3Øó9"«ÜÀô}ÈÇKâ€?(¯t¹¨–—“¯¯dgûÕÖ^ÚFb­ˆ©„Ê C MMk˜N6õѾÿì:äSF¶?jnB€-ÿ,Â<@ˆqT|ŸóKœÌß·‘Tâ4ÌgZµî¦ 0$‰ÿªÛ¬ðzÿbÖƒ€®F¯÷rïZ;k;ɈÜ:Á¦ön²C£y”õóÕÅdA"I>S1CI\°y‚°&DABÿ-0¿f´C2€v@ø½£“~*Œ¡Êy&Œ^ÁO^ùBT4½ÈÁ§M*"uÐ¥ÃWkýÔ{¼œ¬â ³ŠÖŒÅ«rÏ>, ‰c]%Ókp=Éuœ°(¤Ýßì±ÕÂ|mÃÎ×6¬9 "«¢W ºÇ/˜ôtD{È× C¦5ef÷}éUŽ&˜dÉ?ãV êj(Â?…e~®çv¤™õ¹ È수3Õ¢2÷âw8ÃGd Ž“çª&9æ±erfÏuÆîm5ãûc‹^D;§êc^RP—kA¬S N²êF뉅ÔÎuÒ]ä›Gáóu½zô|ßöti5äáþc)EÈbâõÕ¢\^ŸCµç0 “ÿz›áu«ü±×»%¿ÓŠ_vZätèÁ‡ã8Ó`c ×ô~]¾ßÔ (Š^å·éªú b*`™w9ðúzZ‡…Àé:òò¾:2²·E=Q^ZŸ+R}83+¢Ï³P›a ÜdUÉêÂÓêÞ‰²jãluÒâÅe,á®~·º0®°æ“+$(+_ÔXôÔüÊ;"ô—?5w8±;ñ–ƒi Æ õ/Hj¢BFju¹XʬH Â9y#œCU0þÎ}’€nÇsnôèt.eú¿´™;Í„œ_/tfòè,ä^h;AFkÄ®ÇrNÌ:¸úöv çŸ-Ï ÛO˜»Ú»„ÑDüøì ‘„òÚ¾ì6zËšÚ²[u§õ¹7I«Ê ¬‹_ÇñÎó-‘Í6xÖ‚O`½W°ö™™ô½¨ô„yæWðcRÙâ"ju˱k<%êÎ:h$ ÒÖ—$5Ç•°9Ìã_mb+Dv×ZˆhN ØAwp¬J•^ N¯ì9Þþ¨R1 >æ\jM§[3Wp*;ºu¨= ’Ƹb¹q]§c^ÀYRôYšÛ³ÕVØ$éÓe šT ä¡Þ$E{Ýö·y…,¼¦ß+åxð5Šö/rõzÑÞ…㫤çx&Ó‚S÷oü hR+€­ô¬B ž&WÊ©»¢Ñu™­QÒ+ß¶MJýz¡ó >µ êzeÊÛ×¾€˜Rþ¨±?•i¼ØyöçNô×li©]ןa¶`O5´XŽCóëE¶FÉÝå`¤lï[/smø’Ͳ­'½ŽŠs¼6“8¯>¢'ëÜá`½Å}î§–Ù<~.Ø‹™  ÀÅê®7#"/*wÉ6÷x²ä°ä_ù²¦V1ž¨V]Šqv{Ök»’\p£˜¿™Wjb‚\9[YRUš Pl¡¯˜êl¼TŸ dåAƒ¢Ý·Ç¼Þ½Û´¨je´}&x(Õ’à–IgqÎL¡”k{³‰í;E#a)˜YbbÊG‹4·fi:¶úÑmpÿ/ùûÍDÇz­ù8 ¦ôrc¤s$qãdl@ÆÚ=[Cka9CcQ¸t/6³áêÎ…ð]á™ ¨JƒãOãøw­ü; þѾqü=‡i_ÃÐ#øv»áßðì_øw-ü:êÕ‹‘dF¸ÕÒ!º}Çä9ãécïøjSd/­fj†q¤Ê¨­_醽gžÎîÛBˆ_wQÎûæ¯@To«¾s ]ŠPWW>mÉ SÌê°Æ2#°ÂÿTÒgÙìô l}àþ²¢¶À QÖ¾0ÉÏC^³[þư·Äß bØ<ø§r­FOF%ÃÜôùTͲ;¯Å`mö=)ÿ”EifðæÇz}ZåKQ›Hxš3®©Pc¾å•)“É µø „™« zº`s{”®§6€ÁžnHÞS²Hž±úp¢¯ñ·m±FËŒ‚ûst÷w†]Ç*¾P Ÿg§x‚½Ô<–÷µšœ+Bf@VJŠ‘¡¢¾Â¿ N&~5ff¼Å‹FFSÀ5áyBiqñ½?xv¾ŒEÇøõœ¿˜DÑkÀCY¯;jÚe^ŸÐx¦šzQ³3â¼®§.ˆ³çFYV95ܱ‚¥´+«¤«ÏcÃ?(Y3Å.$\’W<¾ߤsÆX3Œ{«Ñ€[°pÿ€Ø£9à99A“.·`‘•NÑeÍk6mõ;( =QSÞ“V‡ò<¾›¸+Š\Íä7> ‰G¥u‡Î"a o¾½&XH½x·°ó=O8ÚÁÉj^Š|4½F»©¶¨ã 'xPýætE,\Òê]+7†óªƒò›e»ÒP¨ÝlS»69äðp8zÿsÒ—[ %> =«Ž“*ŠM1 ×¹ËôVXhÿ»f@«!½"LÅ«t­h+<ê¥è8Æéê\Þtä1\ô¤K@,‘GÔÀo\É“è¯_ãDätxE»û×oº±™ÙØÚ"Ïji‘=YÓ^㺤¾z2æå¤.©"ö:}.„‡k[‹ºK¤B’óë/)ðEb­3\5 Ãò„PÑÞfƒòÑ+\áx5l¸ ï¨$ì“zå_’ûæs¼ùuTˆeyK¯J-´ò#óøÁÛ=öÄ⢄;‚öw‰Ï‚Ýæ¾z³K^ÐAW>žzÞ5Â$+ƒ•œÆx5h­€GÿØ•þ.¶Ó§öøn1Ê­Ì/——x×cPb¶d¹¬¼£¹„fäÎÆü§È À—ôŠÆá&Ô¡4Ö.vZB%ðµÜÞô,Y7ÕÓV,I*Â¥B³a¸k¡5:K›¡ƒ­´Òl$Î}Š-mÃz?Z|}¤¢1,ï|VOcAYƃbäWã÷åhøÔâÎkB:—W½âÍ0ìÆ¾"uÛÄ/(Í3`3ÉvÔ[=Ûù+Îï/žÁ€…–ãƒÐߘ7Ïá9æòÔçVÛeäxŸiErÉÃ:-“µ1ª+xyLFÖé&ètñ¾]”£Ì5ÐGÞ #®#IÁ—ûCm ÍÓÞ³\Þ^b¬„îÿ2h† h[â‘3ÖšQÍŸJsh1 “*š3Ð!ž—»^ïÈ®éBª"º’œfï©d±;øç˜¦Ý0á.Ïr«é|Ú¾Ö¤a·$CÃqðÛl8½h/E[™™#þêy6Íqwêœáו¢cmXÌmë¹ëT¼´x`óöÿsHÄÇO^î2x>ZŽ+uîG˵Jãv¼£Lj5¾Á"g¹*Bðu9ÍD*ä´ªiNþ\XuN„}Å"Ä2ùjÒ_]·ß9ª%2  5 ’½V–Maa·Èn“ƒÃHPu\rÕ—.wèü›§Öˆ«fJO·9¹²'(¡¡ó¦¶ ïé"Œš{Ë€ç§ó³Z›žñÙ ò¥33ÖÒYÏ#UÓD&ía²‰ôζ«°õ\w—Ò6P½||¶hØd °áOш¡÷â§@m.×4Ûöô;_ÓɆàâ¶)ãƒ6{ Ÿøn‹ÿ K_ÿYrCµ”¸sžC—¹â?Ÿdàuv_Ç-›ÀÞ;ůÕS]v¦½RØ=Zl}RÀÇS¦,»eºýËטV¹VÁ8‚lžn¹”äè¾Ê™º‚<î{ð‡ñÂöLåÞ‹Ìiaê[©(sÊ0– ›A¦"ÅZ04Zç·¶7)åYdz¿õ—¾*(|/¿ÿÁWȽA(h2¶ÏÖ_(Ò£œ¦ºµfœ¾ž7v,ŽâšÁ]3 ‹ü/¶/+ÒS#Oëp1':öS+¦ÒÙÃöÊý0ÖWÙ°øð67¢J\…µ‰iƈšÄnVºF¢ªøÇ}Ӡ´L›Ÿ™™Fu\­‘Di[éx‡ÕˆÂ]°&Ç¥ «G =&|GS’JÄfüÀfëK¨-Â÷%#Ä Õ8c`å‡>déÏã{“Pcy­Då΢=»ù6»Å:ž°®î`˜ÎD&váýîôplÛ’º ·Ðáí¯D Ò‹|(ùþxG™Gçæ£7µÖ<ÄÊ1ÀîÆÎÚ»âÂÎTɆêxNuÀZ/oœ>‡9ñä™Ê¦TŒÇ'.™dÖ^žý½t™?À£T¥Í=—RìMÀFgÈ-j˜´±£Ô'è]V¿éœÐ5­Û?ªê”œ )»K„¯ ®{]è*Qß«œÐb›Äu„â .¾1BEjn»v9[÷Á0ô“ö*û…¿‡·"9v´—Þºá².nl%<ÀR¨zÖ6ºaêI¡ê ¶Ú#¿?ç \ÓøüM¬JsN d³«Å£hþþª¾LéIð «²zÊv0*ßü/™WnJ@½aøçÑÂIƒ¨hÂ|&Ò¿Ëø>ú!ñ¼3ØU €h êìO­‰4™2*›àoîËY)é; ¹gFrûrLÑæï`'Ãრ’ð܉ä\øûž¡9ÇSÒª]kx(¾]Ë4 †¡5d’Õ‰–áNÇg #l6QïùÌ/‚2}½ôÄëëW±¢vúu÷|0¿f '1´lPƒõ‚r=Õ¾l âDØ~5P&t ®Ù&iø•ÜPÀYö Zh¨`²‡Âç=Ý·´×¨øŽ¡¡âæ8*ŵ—¹ÖoµC2ôUôÐs#(ÞK½¶UGÌOÂýR¤á:38Cìý±ñž}ÌbIwjp§AԆ왅ÜcyˆÅ D²a4 ð8§ÉÚÒÒËL=õK|R1díâ4~ É’È\PSÍÿjYýð÷aŠ?j¹+ò;f6S;3q¾3¼F<޲ÖèmŒf,ÛÛ²PtcJS6¨ ÇQ`7ÎÛVs8µcà`›ŸŒWF»ü ‡1æåÜN½æNïÞŽØ£}”c+xMŸ·)Ë«:‘Qnëj4J!4^`›7nLC©R û¡PXlñµ‡J+ªü†Ýá ½sb¡'Gˆ]ÞÇ¿›ª ¤0'°è,<Ë ³^«º~yL7£¶E ®©o’Rö ðJH¦=ô-¥^¢à3—ª\]žp¯®æÎÛ>Ú¨ìû° ÎŽÎD'öeÖög«a1«sà,þÂkï`kBpº%û8Í52‘N ¸IÿiEÁ±nx)Žw_Èg‰ÂÜpøéᬫž5c,‚U{Ÿ\ eá™Ðu;Ø1’fç~ADûz8Q­…¶,ã&ÃåÞ¤Éi¹>]ÝU€¤P©È’h!í ÊC–yÉ噇ºpm<—gK¤Ü®–憗Az/dâxól ñSÒàëÒLZÞöyþÖM„ÀÒb¸ £l—fW¸Hk@#ÇðÏ qw,B‡cz“yï¼ñ'夿A˜êí9$“ Ã;b¸™ê6ñÕе u´i½^Õhƒvëñyæ8Êñ0‘¨˜znPö4Žœ©?spfyÉÓP=§õˆ~6ðõqKTè"¾ ö‘ðQ üýC œG’8Þb°®2g‚ëp8ï¨ [½½Išx‹Lq_CàQyõRvb»7Ñú|íöÛûb¸dc•¤ÎÖš ³ûݪ§}qt‹|e"’Æ»mlæoÞ á*4tª2é;MüæБÑ,‹HGUüf8Ã4¶zÜô‰Oò&ék…Ãq'“æÎÙßv͈ƒPѰ›ÌØK A#êcaƒ«´jEa„¨×vj™œ}å§ZäùÛóÄÎ1MEtuߘá”:å Î4™ Dµ)?–p)1ˆ b°ø›g;+EÍÏ¡2ØŸp(½ r#“W½ð{X€ÆŸyFœÖ6ᎄÌýªšÍQi¦ ‹þDß.x… Ñi_ÚÉO«E倹Ðñt*!Sù'‹sBÉW ËÙÑà»AÏ!-¿h…d<\-½ünpýFÞ¤mÿ~”{òe:ÃM»øl]•:ÍK.¨c,@ŒAN²ºE µê=“)ÚÞ’ þ÷@öI<ž2õ-2{¤·ôõœÿVÊ hïQ#ô‡îÔ¿]ùîfsgkr³)DI£Ë5ÇÞ­‚š·ëz¡œ’ôô>Úp¤ô*ŽÐ!QîŸiÀI’÷Üÿ[WU¿¨r(žk ¶Ò^ƒÂãÁT ÌÅMùÒ„ÈÝRF“AŠnö99X vb­•ìóÞ8×…Šâ‡³›¨î?ê‰Ù‹<ÿ,¢ZvŸsäþÖ¢Hrgÿ]FXlóéu|Ñc=Š6¨´.âû"ðxå— [wê]jþÕþfjøË2«A4‚›t©~`£‹Ôéë“}¨s•N_eHýÀ»>‰žäœÒ HÁ¦;÷»lÊŽKDTuþY@µìÉÎ_ î)ÝjþÒ¶]xçˆn”ÙþÐ|$xtgø×3…Ê“Xç~¾ß£•f—Ô6lòÚÉfÞ»Õ.!7ÏÏžÑ^‹§r7½/XFéi–-îJü(fð‘K³»VجEòä\ÕZxvÓ}Å·_PÂùL²5 zÏÒçð$gaÔÁ]OÕ,®m¾wƒ³væ5·i:8Ý¢³BšƒPÎQΓ,ógxîhñÒ³Zˆ_BÊèÎÃÿx$Ô"Æ Þj‡éfÝ6„1êv%_&&h)…"ââaùJ+ÑgµŒ°ð¹à2Mö^zÃ{S¡Ñ‚‰æøã¼s @<û5häÎ@KþÚâHŒù¯‰ÔþdîÙ¥ñ•>oþIG®¬“å—ÿ{â¶4¹×ÆÍcø€Û#®èåCC ht7–Jsó{I/Ð\?軽Ïÿÿÿq ÅüÙ3»‘p¢(sb±°è÷Ä:Éèνuß<É^zþ!ØFû–ï²§7¤“CU„Zy×`*ÿt©À¼æ|PˆïbE?ÎðÝÉÖÁ3È×\‰Ï³Î YJÓNœF<ÕNg)m¥Iº3*ª–%PÿmË Èø#¼éY%ñ¼ïÅ@øÆœþmjÁ 6é=$ñðÓŠRÓcÔ @Ûk kþ%ÿ: GzŸNÍ:±»òô P;½ÓÜÝ’“òµ`;’ÚØJpl¿øšã¸U“·wP¡<é5â½V|x¬èÏ7"ôh|3h"Û¡°é^{5FA«xð»Í`[Á"±v ¬´À{â,E®½äùU¯)x”b,ui«•®D‚ 8±q޽¦ŸkšƒSËdq› -˜ð÷à·Ã¥i‘V4Ä"Â*va@*A¼]HïüKÈ3Æ:ú…£Ä~ Fä"uR «„ƒ<ãQ¥î¾€ Óaç†ü$”ƒÁ¹›œÞ×YÃÏK•^æïк}Ò8'lõÀÕ³£y¦¬b\¼ÖðÝJšfðÀsaæV k9Ž\¥%eMèék”ñE³ôL|E xeŠfn ’VKŸÿh&¿)è n5±0ºFÀ¨ÖqÑ-œë‹‰¿9Á#TÏäöÁ䦵ыh•+¬Ê 4ļ ªx$(%g!³Âú¿¹õ$#QìÓÜØ¡ä?Îr/fÝÁ T€z… ’ôú`2x¬è§ù²—ºªáô˜£ïú U,˜âqÖ‰Nf¶vëM2„å¢/Lj‡9} EÌV…±³ ÙÃWiü>UäxGøžïÈ}HžðA„„•“TKÀ †ˆ»-Í,ÊiÊ`Ÿ UvŽ8ÁT»æšÖ‡Më߬›£ÿf§z?“Vä ¯7_O=™*â~§«_Ä×@=t1_FDÄ9 “žeænYºå½ E•ãèÆÁ, 5×dïi)t ü$IkÆ»é€ËÓþì‚Ú3÷þ5Xµ4AÌ俨ˆKéÕ.¬ÊÅ»¥µºc~6T”òÄËWˆðö¾@HI¢Ÿ·þ8q·l‹qUs5w¹™ØŸüx¨Ñ0Ì#ôïÎl‡P¸–Ûª¥4På°<$!:¹ZqÛE²ê‹BÑô•*7‡OjÞÖ¦ö²>Þ~l’m©ui”“šñGefD ¦S¿ä# ¶üȆï× puŠ;$k¿Ë׈÷ä¨& Ò&T8öä}ô/€S¿E»'´Ib.“Ñ›h‰|$$Ú0 3{ëç<õœ;ȯðœ^™86Ék¥óh|­ 2òGm6æhµz[Á± ªt,–¥¯çA½àékÖ‚MÛO~FŸã»üµ¸ù—â<ÙMó˜‰r5ÊÑ”G›Èœ-n^@ bçç¢ÂZ%ØÜk[ý‚×e¶Kà ‘ æÓHö£ÁÅ È@ˆ¦¼—ëë^[…ZZ5)‘wSµ‘CO ËPÈ0޲(?`¢Úb ¦ÐP:}2î˶?¥â¸ˆD&k Cp› #4·‚>op J&v‘ûìõ Î@‡H¾ìîú v¾qm;§å@ÎlðÄÕÕ˜uRrÿ÷˜Ù(IFnø>kêþR¨ÜóÐñ%(åXXoW‡!öÇÌÌà×A°–KÈzHÉU"ðmù»Z0‹šˆÀ˜òR¿grÓ”@qºö×~ýxbKƒB‰ÓVN¶láâ› IrºpØ]œ`¿l #:²hÏÜT8f”ú£»,BôÓ8o"£1º®šÈ¾ª¢ˆÓŽvÊ—Èž¤Ç!šÜ>0îûE.ß±[¿ÏÊ^ÄÜcÁ`2* ¨öÒš”Ñë}O7Í¿ÛÞ4Þñ'W¸¾¹" \ëôîÓH#ïÇ1ëm‘*d˜èH¢Xÿ"o~nm®Í|ši ¡…óì 0ìù¾» 4«ÀqiýJWVñˆV—;múŒŸ–´Bâ61T‚D;ø½S…Êh‘.d…¸(³ mò:óÜÎÈfoPP.8ÊäÜ1úFš.m9ƒ̣ơ„ÁÉã½ö¶Ì5Æšiýµa.ög§o¡ˆgÃÔ ’ýªÁ5™f5A¦Ëþ‚4¦š×Xd#vKí€é>ª)áÿOOà¥gàõ²ße Ö€Œ—œ’ÄcäÇ&,¬nU ¼Ž8k·FM†ÁY™¶9RߢŒß¶Â*VU¯ ¤ß׺R¬íÝ ¤³€·fÏD%  ]‘|œ}}o bI”‹Ê\t€Ö³†X!ª\ZzlûefBV]©(/Sæ¹bôí®ØsHÜÖ¶æ ~É¡¥QH¬AÃz‚öHÀ[·¼÷LºN„Wöþ°ÕEÿ}ezb©;“Ó?ÀºÏMHkD6I8í`ðF=3´eé‰ÔÚW=Þ÷SCïy-G£†¥°Óâð—ÇËÄ$}3€,ѧ ¾“Ä¢«:d‘”DMÍÜv]*!¶Ô{»Žd ¼€&I²ÕÏÀ‰TMçz?†d§?T|_þ’h٘ۺȑÝ+©ß)ÿr¨'Jƒ1.2ø²@LÁAâ-wÕÆÚFÞÀº:5VnÉë£ Rÿo#Åpâ gô˜¥÷ª#Ò=yCYöÓ½hÕæ8Î!t\ºy„׈´Ÿji‡&(-f |f ªþ,§ÖÞ›@+Å­Rvùbô×S‚°¸ ¹ôíC{8Á÷=™’&Ì^=*“†X äéÿRC,®Dÿ/šÇÿÿ.!eô¦¬½Õh’Oçâ˜ê´Ü?»ìt »ÏŒ«-KVãR¡Ï lwÂ’=ç¼BÏk._e.f[¢_î¾ Â³‰† 3q7@4·|T§Îw×.W‚ªI$’I$’g|ú»ÕÊ“‡ù¸`ÃÐxñå“‚"a÷¦xu‘ÕHiSèt¼¥!оrõ€à¸±¯EÆ’ò€è%݃ú¹"à%¶½Â±ÇÍ“ ”-Á-ñßBy+,ßœ!z2øéèEçi?ÉÓ÷ÿuºFIÏ=Tä1}Ýá®ó5”7Se#SŒ>Æœz!P.Ïäíè÷³d½Å+AV=¸ˆúîá,rŸ”Køl5wÙ43<PQ«p“}TÍòÁ~í, raÜCiE× ƒió4 {«–¤·Yzzy \{ó8­ÿ—úø‘Áœsò• &è4Rô&õãwÃd…Õøh8! µ•+géØ¿’Gn/µª›{í„#+ýéYÆû^E‹ JZ„Õû9„ÎnÏ–­å†¹ˆÂƒ–7©n)Ò´X„á-ÚDÍ‚H: h’?˜}½·n«¾²õÐ1lèlÜ4VÁµd7øb¾×ã¨ì%°CºŠöA%¬ÇpÌçm3x7€£æO§ŠÉí¨¹ýgT®HÌn:‹ÔÀC©¹+i¯[f³º†j]YFS ­é»,àGåúiwåo»ì‹ü YkÖŽ2Õ¡, €ùøKUuÜURê¤ë½*”Â'%°ÐÙš¸GóL; ŠÂ¾®…øÖ¬r,›¸lñ¤£-#œÅwpü8¼ékÞHGª—eó“Vϯ{Á]x‹sÞóä0,'hµiÚ†N_–&!Û/ÒwøóYM,áGçžÍ¦vWh™ÌÖ‰V ›§èëù…€Ó@/£ÊƯëÔ´£ÉÑô«&Å`·3¶’MçVYÉ8Ôªy£Ÿ{ÑõäÃoþu²wUáãrg,ï@“Wu‡ZzGwÛûì DVòÉž„ó_S„ÊýT㼞¥ƨn}ìƒÄûÃE$ŽÐNÓRù3¼–ý¾þäÁæ._c亦¿ïIšíç]å)=¥“T1vg-žÐJ_†g*¾™ëiÂöN·Û+œ=ÆÇåÓЮ¦á¥ú)L!Á-ç5â’f†Ò¾¡o—k2TÒ€µÁmFÊ%¤Î ý”XÙïg•uÏ‘WNwµ-{ö#F܆È"Ã(®v*·iz„>¾ODoù> (Ó2ž¦Ó![NbæÆ&ã€fmße²n žÀà”)Ôy¹¦áÞ{Š9´Øê¤G`wðÑß8Ä‚r·–G’8l$ÚÜO•?­îoÛ£z¹yfعC}_þØüx}ëÙmhu%>diòæHæ¨uÈfÕQ`å!Õ]”G®d"¤ª ÿmÔMI ÅB¡]‚zgø HÚò}GT_á >%zú:WmסWs ,+—sòkuh˜$f:œ;ñDë}»‰qÔKûÞjRÿ'“Ý3‹ÄJ×|þ#‚8 ÄU Çrj ÁkÜ% m…íœ0X×”§c*h¾œØt/ú ‚üó@¥s”‹bqXŽú¥D2”ˆ§OÓx?çe38ãBš×Gȯ"kÿ…>Œˆ(ðÚ`€j‚-úÕm‚Ñ~4¶Mô €\¶ƒ•êìòU$”·çÅG*_Ú®s N(2CøU±9[W–ëØ#¦®@Ž`²’^N< P÷ÐOu°%~Îñ¹Éi×¢é'9³°âå—ç$à†åV8O.†Æ$}xѾð SËx¾·—ÜÏéDZVÒöxUg” KŽ>£-@‚Ÿ·ï͹â‰O¡•#Na9x.6me.ç§ëàMø`xHÏ Y :•y~ÊÙñ1t÷[ç?ŽÅcLÔ¥Ó< A뇩Ø"D-OU «Ž·#šq·iÞbaUŽÆ«6·Ýw€!mNwZ×»#.O×’.R çР½J‹aBÊ.=õ×½;+©Ä[Ö*鎶óu»$°]ì’•¥¦Åô–Ù™d¤#ª`ETKêzÔ»µ®ß¡›…V’[œ‹Ü¯¹É„'`Y“y´‰¡Cq›…‚ò¾ÉÓ±q¤ÓÑ(G|¹9GH×8QAMz &V7ÂìIòð•*¯­Tæßô5ò}­Ðr½¸s4§~34³Ž†zû~!Ûˆ@l+Ü }N ŠýâéÄÂ@øž-ý™[`膮&>„“üïfA>ñ¡-nÅr,çþÔá—•¥_mtV)âNS ‘‘2ï-(%Mý´«¨°“NCèH‰)c—ì‰Ñ˜YÚwß’¡{êÐæGE(ߤ†ª*êR¨5pÆ„aýh¥†Û=ú^“ëà,µ¤Oº> ¨á®¿Dµ¯\ µi†_,dˆçšoúKÈÚ«æ·¶ÞÎ÷¢¹4™â$¿g[ˆG0Ζ\‘em«mQz1 ‘¡8V5²FC8Uy…î¼ f¢>‡“>”†æÞƒŽŠ0 ¤Íön˜Œ=ÎÜvÓ†YØÁxü~jöWÜ€zÆÆk‰Ÿ,Úî5`÷¨pד—ªqÓÂÕÍyS\OÆê—τҥcΠd,c‰n4À#†à’Ãk¾Ší¶ö†Ã¸ÞœÔ—Pžp¯3ß&Òv•;åÿA˜ÑàA|c­–Pù)R;z$?ã¨kzÏL~ü†O6ÓŽ‚rRâ¬Sìs&ðÏ‘×k¸=kt¢œE‘—g;ßöyÉëKE:)8ø1Eš>=wÍ4fص¢2±GyBØœ‡õ/v|KL­qt0ùâÖùt¸Ù ø£qU–øk¡å\K*•¹ô¾c€¬¶ïã¡ÌX¼Šž¤®9ö=^àdNbç´“žÃ—lN¦5§Ó}ßžJ»(´3†²OÕá휠¼ò÷ívìéUê¨ÒB;Î K bNœ|PÞ,ª uíš#ïˆ)ÞdÅÜ´KüN1÷y¹Ù©ù0ÞŠUÆ0¡j]z„nœwnÃf4¬õ{Hr„Mÿ7„Ÿ»´XÞЇ^#»û8¶‰)< €œb„wD»†¨GÏ3 Zù;ål•0uw6‹ô߆0rÇøôlצR/ÙnÉ·®)Ít2Ó ‹Ô´êÌtÂ<<ùðÝ`ˆ–N“ ¡ÀÝ%& hЇÉþ,pslse–ªéïR«bwÊar<–ºFlõBÿt°·*¿ŠÑoº0Cd4Ûíÿpår>©&½—e$&ö\·EþÉGyót"{TRk"â{îÑwo, Ô«Á°“Ià‚dh“¥ŠÈˆØ¹ÏÜÎB2o¹Múîú¿.âvø&Ë^Ðg‰’£y=ÖÁÉ5ó!& ½‘¨B-RÄö&+l|Ÿ¥Wyý|ÈW6Þçɯ°1 ›äÎ\Ìh;™´Ç©CíæF?QP42ëé6cÀ½k¶ÀŸüöÕ‘]mX¿+K sÉDXßó=Áô" = ¡ß~îÚk½ìkaÝÆW°t·?>ötƒTe!~b¿ê% ëYÙBÄrW+áèÌ#Aͪi×%çÍ2ûÁ7šâàöò&fRGçÒ÷0åóct‡Ž|*„/³KîÃÛ±T4ÅÈïâªd‡C–¼Ì˜ ß;¶Ë¦‡,¹£Q1#ÝË[’Ú.kìD’þ‰B¦Ü ÎþŒf«Çõ´0þ–‹7kï[ù'-‚ö3Ÿ¨æéÔA6áo?cXÃsœ¾º«œnå|9¥&¦,Œ‡}ä6Ÿ•èÂeN\jíœN]Ö¬wjòs¹/Bk©Ÿ¨š„ÃJ +×WJ¹ãÞEà Õüç àD[Å#uGÄ´Òh\ü1Jmâ’ÿéãØÅAÕâŸÜuØ3~AP øxˆkö'ÍG+ Ø\$ãZâTjçÕajkÈEþêýbÐ] 8öŸsjS-hñum&ýמ×n8,üt±°oŒ1zý|ÆÄã¢(Ñ™SéxÙ ?†ŠnA)=âEô6›E =ù3~m ¢ã´ôO¨ÂªƒôTº6V¥¦iéžvì«–½v62¦ì¼Î¨pFrªH÷7F”X‰Å¼ìD‡¿’D‹{ƒðœ}`¯’»(+¦@còOAV¹ëöIž³* °ÙL<µ¬ûþZ´µ›%Úª÷ªjžaàÏÈ=¾F{pS˜ „²¤ˆß)Ç $K¦,ÙÑ-¸ω ¸ Øm–7{:b–oPÿN™ÆGÊæ€ißõ»'iåSX;ÞoÇÕ]¥øxîøøóƒ¾¬ábqHÀHq5fv,pUzÀ=.ŽÞJ!ÿ*Ë#æ®ÑDZ}çrÖ˜Ù“4tÚDéž=4NTˆô™‰—‰0oíö´|/¥v¶.LEôZP1A¸>0wœ$9›©¤ÎÇ"¬vÇû%àÊïHþÄ¢¶îÀa|¬Åk€ÖFë»vÈËZ¾4«Z\²7ÕÚgF¶ØÐ\R?Ýß?v•ÛS‘n4[å¿^––|ÖÈVœ›¿ eËvô4Æwk8,9Y$wÖnôÕ Ÿ‡:M°j*) éñ¦aÄ8 |d?ÏíÏû­ï2eÞ¸«{!¨ý¤¸gx;ò’ª\ŒÂîõÀTšHa:T6–°öÏå/…˜rqiNÕƒ0'˜€€ãøv)ü:=þyqü;þ%LJP˜þÿF?îOáÑÀÔžB~â*$t‘ìµ^êöR0“ï/í¼åI3¬>%ÏÅéGÚ¤N šÃÉÂ8DRN9™ Žx£¡…%U9ÚNÕEÄÄÐ"ÝskR)muË—/üL(ÃÈF‹mŸ††©wÅÀ{inMW±sýºùüodÄ¥tac´âd1ìTPñˆ+Ú[¿ñõõÞåE…±,¯Ä?vŒU¿ ‡&àã`@¿žäeȉIu%çabQ:rR`ÂP‚/öáÑ„¤ýyŒÿ6y°¦Åבê±ÏYK9ñÄ ‡Ê’_E÷ªê¯^_1Æf"š¹" vœàÖX´ÊÔÛÜO.=+ƒ•Uü[c0í'äk?ëšFŒ-Ø,⿱ª†X°GÝs¤é¸p'–"*pRľ'6kWÝ…Çzñ…÷ýrKz]Fó]ð†“6˜d¤x¼‘`‚MÜAÃ[®ÑþB0¯ zïð;$:à‚HÌ©^M¹+c¹Ù2µ9JÆp²ö¯±ùcŒ!ñdZä;£¤…ò˜ÒFÖöDG<ß0´6M"G}€óù7æ£Xñžûúƒ_ÍÝêI56ºR1œY,Å5×ã ‡À–hqb ­·>®Çš›ÛåðÅûëä³\'å½(3J7ýbz[1ÖX·FáÛ– È‹ž/<;ˆ®µ×V- ¬²¸fቢ\VŠa<¬xaP¿W€ùuTLYõTÌgSGA#b8YáˇG–”·ÐO¯’÷á´(^k¿ý@Br`\·šI°oÍ€©óh–·߃Hc»P—•¬|ŽÞ+ã½DE”;¹r`Yþyì÷luQ„å9jÀÂÁ¯ä¾ 0'O-vûtæ,p¥½ìDÃïÕTf~'}7à”§nW)Þz`¯ð Z¬®,ªÁ9£òwl&…0;'¼J}ZÚB1—ºøY 4è‘eìÈ0ÉDRîâ¹x<†>D•ݽlÖ?SØ 5T…‹ q™økã^\mƒ–ª°5â¼eKŽÐAádw$ä\!Õ–ºÍ§´«ÔG(ù|ÂÔÔÝ5T.LÚYb®ªŸ1‘Jo\<î ?6wô|³&y®`}y¬Ss°%›Uyhí|µF;IäÉ|,À¤§T(Dê3õQ'º¹RW-›×ZsË*ÖÍfŽò@½nªûY¯§+h822²‰;·á+Š ´Ùtn·Q‘‚·_ÿ#”ˆ³ÿWýlIeÂ…kœ¸´Q´ðŽßcm*U·Ndgì/À`Œ‹À1%HM¸Ç5”„TÔw}˜y\à¯yÀ„ù,×A¯íצ?§ïÊøtîg®ë˜ o‰ÚŒÆÆŽÝ9èó”þNN½?l‚ÆÀ´š¥«Ñ$.áå±¼‡±ƪÞÔ㨲¾i¶+FkŽçÁ½uׇCÜH°l0Å$9û}ï­Fž]8!ÌÌzd@V}”ŽcX%ÊQ¥ê=¬?oAƺmÃÁ…çr1á! 5ö?- ™nþdüG1o‘ n"¯;à䮊hÀ½ È…:r6Z"ðÕŠPߥ>?ß(©ßÒ+ïO„@=i‘õ¸[ }Ò»5 LÕQà9pë[Ç£kJµs.#ܲօbVË-;®oK~ꟓÂê ëbð¾¬%ÖG²ÇÔFŸ´¨œ½¸£¥ëÉ!é”#x!ÈW- É÷c®2Ãå0Ø×¨híÊT& ýQJ»§†ðE¿–i7ÙZÀïðè°@ÄïG.»æ—_>ÞR%•sƒÛ;PV9Œë©öXÔ"î^ÚÌߘŒQ“?e5“3áÝì—Üã»ý ÷îiÀE<ÀhœÅ7ù˜,NÝÖ„w3.9{/õ—£¸©d‡¥2õó—]ßßö ¢/÷vQ0élj<†UÈð×8(¦æ,´ Ò/ ›ô!ò¶<•ðYŠÐé‹P[(*Ò5‹¹yØ/âß‹Ë'é(÷åø­ªùFŽøÍ¨O&Óh ;pÁ‹†+rôJt’À…¨¸W[0¬üÓrf:Z@îÕAÚ°ükUôÁ‡Zè2mü_uÕFˆ÷í÷ dBÛíu 2dH 킵o<$HZGkZ|•‘5£¿#|c§=G®ô«ˆKÅç‰ËhdÖ¹Þòšð5 ‡»`—È?!½îÏ¥;;¾&y1±мÿúY¸4ÛÓ ô:*ƒ×MÞ6À{ÑI¢7ó—Ñp BùZÖ„5V›Á¤S@Ú|"*ŠÑ˜*¥þã—Ȱ_EØLv“òE~줙lŸÜyp5i°ÆàLUX€¥N¶. .I’}+·áH&µÐzÕuv…ZEb<<òB¢âD™_Báñåw-ÖVú!î½{$ˆ@MÀäD~N>ËÜḜœÃeàj oYùÈ]ÁPŸËتëMK(Þiçx¼kX˜•'y£sØFsm«c´¤/ɾØ^*Óv¨p Ý ·sÓ‡\f†ÅæÎª¯ÈLͯ¸×O¦[7÷†IL/ äG(/‚mïÇÇÆ+À5­'ùI*Ôèí*rÙn 2x÷FTÿQ–â"<}Aúp;Kùƒ¤Ù'IL¨¦ ¸h7WîRoc޵[ò¯)€,éþ³-ÖCQaSª®äh˜¥" ‡°«ì1q¤0Î[Þ_NÍ÷øªd/¶¨éQ–#EYß”´ û l¥»jé²îÒº—ŒÐñ†¢€Ã¨„^þE;¦­'Ä0IÔühf]¢;&ujsyZ¿X„<–P·h™¥ ä@yýTŽ3Ñôè"Ä!NBbº686õ‚ @ùd­ëÅÀó.èåp¯õ½ÄÛ2ð³ ¹^Î>NÜÕ„ö–rL‡YaèF!uLå£Nâ¾2µÂ®ü»ä]RǑ߻¶Y¶ÉÐËÂË#¼Ž¥ÿ†T¥Ò:ð0ô5§¯ º‹Ô¯Žýä#rHaï–Ýÿ'å§˹ˆ*RDNIoÃg0ÿR>k—oQ-¬(ßÎ~AàgÆã‰ežøÊ·ÒpmØl1îóñ2„ëÝî'ÜXªŽg'ƒQÄÆŠÇ%j©Q•ѿĒÀèó:ÐQtµ³™‹¥®øXW`Ç-«óëßåV³_–&òå-.ªE±, ú¤«y^G?5›ýÀCÚ–FM‡ ·åX Ù¨‡‘Éåí,œt³œƒíú®òø¾¿~A„æÐÅ4ï52øÍ 0ïŠüã5²ýˆ¹ëÓMw>Þæs„_ÂäÂcH€žÇmxª•º->T燄M5ìþŒ¬Ào´ƒÜ¡-Z §,oή𺑠¨ÛˆáÒbŒ T¼6ékÄ”]).aëÿ1À%ºßºÙ^Nå­O“ÎÞæœ?Ùq².ìÊ5ÔøËœÿ7e‡NÁ%¶’½a-É»rÌŽÄ4Cæob,ƒ)"P3$ŠÉÊÎ ž0\͸=â´â¢ FŒ=Bß®ñF.JÓíqÊ/¶êäËa¹­¢~é†é¯tbŸ¶I & 7Q+’“@[y'zÉ£Àò«ªb]!̹F÷T؈ðe ›MtÝám 9SåÐÕ*ðµvëîéý–QñšIÐÂl÷Ÿòg~še†§$? ‘ëóq›Óª æI1áigná•É·TþË®RGÄ욈îëm’4jr†ÎmP€±ºÔÄæAgUz¦Elþ'WX­fz¹"ÙÊýz¸»Ë”ñ1oâÆšÂÚö6h ág a¦N>¤óI\Õ ‚*¦¹ŸÝ×åky2ÛŸúSVà÷‹²&}ݪ©áæ/›-qÖÿUm²†E»aNCZz›1!zËžßÜêm|ñõCŸ¦µnš*”b~jiËæ)e„`œàôô?>z Íq0¸ÄÎKg²¤&¾Zݧc˜oaÄÉiyÈÅ fÇk¾ì,CzÆ_“ü¤yŠèðs£¯HܱM8~Œ« p´é›¯Û}u*U:É”~‚‚¶a}3ÃZ÷ ¸‘£ê£êv„‹Q%L8~ž6±å†òsŽ­7g¹W½–™'hˆÎ’¬‹b&ùˆ4,b!}}³¤;Éá“—aQŠÔÀ2ÐíçÏŸ±›Å¡Új(u›µ·ÓÛ?aÖv{à­ãKwûX½0®UaÎ7ÿF2.úà”>þô´ZFz¹ìϽø¶v©¾çpÏåãf.}TƒBõI ø­»Ÿ“Í,Ê”kÊô­4 ¹9#?Á“C{þ‚@GLjC‡,µ¸5vµ€xîlƒËŒÁÍfGÛ´z5S‘¬„{gÖ³¾ÐŠqƒµç¿ÿ £‹wà7m«ëú/pN¹¯K‚›Ús•Ø*%“ÕâÔ%Åÿ*Ä/?¿4p¶ó˜1gþÂ~Adv’à¤};oIJƒQd?8®Š±äE›1ty9ú^[Úp;–L‚¢ì€Llâ)—Z·Í«k½Ññ(iÂS¢WrQg¬FkØŸÜœN¬k¶kC£Ëš >»ÜÛúä6 öjã¬É@sÕKvwVäP2!1¸·Æ©iÂÙKÑ7ãäF4z¹oÍ@ÅÙå”Ã*4–DÖe|ÙÏ¥LÌi4Û³#ó9În½F“WŠ`1w~­¦ÛqX:p‹­¥gÔõüì ;§L4Skð™‹þ݇0AUÚ.¹ùÚlì~™muæë·ìe£}LÍÀu T•Î K—³j±ì9Ø¢€>¶Eì"ýåB@tƒ¦©UÇÿÿ¦EßRÝ âÍ|rMñ=èÒPGjiå”·€1Ìè9X›½ìC0Á¯˜÷â”w°ØÀ—GãÐण '¨Ó½@âš÷™z‘©M¯YÉ„K÷»þ*óÂK2qüàó/íýr<ÐU\®{ó^j:qpĪSÔ ï]FÏÖޤ¦æ#ADì€ózÁø”’]It‹0×È:À—ß9â„ÝóΊaº…ؾöíeìu²@Œ’…í}Që¤àÅdÈ„“óR7yA´Â¿j!O5œÈ›LÞf½‡yµõʇ'ptKq’-ŸëPzÞ¼ÒH±öd9Ä5€œQ—ò­¦ÙcëJÃ^]}ªq+CÂì ‚Xú )‡nî›ì7úAƒY*†¢øÚ¶Õ]¹ØÚ)U …‚!{Ù=–›£N=m;¯5C£Ðr3o•Øj`u<œ›ÃŽd»î¸I\•7ù¡Ïµš7n ÄZ ó'ÄöÔ–û¾²ã¯.G¸B1L&Îá¤ió»›-ò´ô3Ê9Õ¬ûÜhn2^N`•$GœÕq²LeàÆG!IKùlAÚX”½ùÕ@µó¾’Ý|qf;ðb|À%–p±ÅI•jþ.Ž(÷縙jÈŠÅ_ˆ}ë=šè²È\nÈH”{ !7 ©#‡#ð­ÏKº¼Õîù9E骨~ 4hö؇>Ç4 SýÄ„NUlù¹e÷¢ËŒ ºæáÂô<­Ü¯ yT °Ý³q™Ìõݨ[&œSaaN~öѳ ]¼±½àªk¹ ý–È–=”Ä4þ™®ab mÉF‘Ž‚3÷8”ùiÿ+Êžr±ÿ%BÛ°ü|xPª;.!‘¶Ÿ‘£†¬F|Í“à«&ß@Yj/i$ð'9¹–—‚`1ÐL΂6A'vy-Áq>²BsÎè[1¬P5q5ôðØ±Œ¸,4ô™ˆŠôµ #Â)Ð/þ’a_eÔ›ŠaÃúÙ pع¾_»DÜvŸ1qÑh6¯wÞ˜½}¢_áEt”Xù¬Ô™_û[ÒLï͈}R‚ |BHþøNyÀ0ƒcY‹[®?_™þ‡ý“¹Ÿ*tÝ8¼hIš56#LàÛ䄪N&îJ %cȽ]÷RVj%ÿxÀQ\0Âl·>øäêhJ¢Ÿ³Ïa)^Ž?ð\Ð!٧ئ _=züs~Ãó…¢QWF…óø¯aü—Ñ)Ô½¦4`¹²ÕøÆÎ¿O[]§[¼4xÂ/zýK¥!lžÓGíãñÅ 5ÓµW^f 'm…û©Á/0g£{ëò¯—¶5›Õ®Oæ)wRàAÔ/”8jÑÀ7—û,2´œC|A¥“5ë¯Q˽Ï8ÜjZâW (*R¸'*¶(P‘씚ï'nwžèxìÿtŽV„àÈ®³#ôŽð눾¶ð0§Îú_Ô±¡•¤áw¸ìâÚISŠ! “EK)Wò.»›Z+ÂÆèÀJpCFšæg[9bèí‹qߨÔÖÖHTØh­+ʤM1’Ÿ Åzvú\¿UîˆÃ2 /±àß_“¸‚½_0œB+:ý¼éUe²}ÿ%Kf6ŒÀ(PAW=Ô‹Bv£k¥îtÞí—ô¢`¹JA]º9/>Â4…ùG›l^g™÷Ę›FòÑÊꈉóe£–£Ï€LXGÑ”û€ƒð™tXʈ¥¶¾’`ÁPj³¸Šadûÿ|D¢Ð¹‹&e¢ühÓ„Ù΀é8-±UŠ„k â²Cü¾5 C9LQV¾_ó]L}ôbVý¥ˆ£òô‚_5*Ø(›ó%¨vÛ—¶ý þ¥úLwÓîNDÌ+n~3ˆž:áòÊ}gŒíLçõ¹Ïøèê„PQö¥À‰J‰VîÊÚ´¸Gî3n”uL/C[ÜüÃSßÌM8sßµR1Æ¿wÃúØ"™N¯âÀØÔ^›lö^„Œ²ši{ªá{ÏüG•O_¯ï@àÀ©½m(¿F¿ ÛˆÔÁÙÈ ÑOöéR5yÅÍ0£Ô‡ #ÊVuú&7çµ¹V›ó ¸L”‡N뺛ŸÐæÔÏ%AÝ_}ðó*J&A'l0ga*ÖÃ8Ú˜k§ Ø£1‹ÈÌ>øÌ+¾3{t"Ûqœ¢_Ôd'¨ÅL‹­†‘L%¨¡¥a¢}QctÎÇŽ4ÃŒó.›±/¾ÊDdÛâæ½…õA5©éW¶+‚NÉùdå² ­ÕdJ;÷ƒƒI ôthͺ Ÿå¬Ú´{f‹·¶<â5(§¦ï!`¨žh¶Ié‡;c% Šžè2Οaá±sYnû08½Ò~I¤-´-ŽÛºF^R3Î`›¤×0Ó§n‘Íh|šéäë_ Üø@g¨ÄÞvõ7~ÄA+z)}£Ì¸2Á̹Å:ÆŸ„ñ®ãt;®(_ÚíêÃØž˜rí©Âì:@ÿoÅŽ,l­àv˜AïÈ&T\°KÙ'з®¸(ÊA®&,MedUõÚç²ê ­ëë¼þÕ©Zè½’Ò딃%eë²G º7ùLa“`a€zÐäŒu÷v0L’s´ºb}QÆ·ýÿ{5-¶ù[U–W"›^Smí£ i¸Ž-Ìul¡Ówã*4cÐðÿaá>Ộý5L^ª^(fÅÓçhyg’'À-¹-#ÙDQIrr¿J蠻ƞüâAÑ$ÿ .çÆ}ó11éS¶¸’ß»ˆÂ×öýxŒ(®[àÜ) ÒÑôj­Lã>ˆÁ˜Ï–jÉÊ %ŸYŠ»6kÒ•¡î{Ê9V¦0°­œ¿ççR1Ìê°¢8•N Yû¢stÉï4öïS_ÿEÁÙùåå¢Lçõ37åÉ›§+,á[ˆ:o·)QX˜~yj*°Ð 蹜6^¼ŠN{ÐKŒVôÃ?5‹ªX ªèÄ‘‰jú­¯¯JûãÑ,q…ϳÖb€¡/†¢¨¯V€Çõd¡"Ë× ¬Øs~ëÍå=Åþ.黈p 8„¿«)YRÕÚÅ"*Æn &ç”·Ùï;9»Ê¢d_RVHƒEOwù-NT«Ý°0 !ÁÑw‡àÜÉ’lX:d„‹[x|'­è¾Ì¥íÀ~=î6ÂÔ¦Œõ~<õ˜;¬€h’07ÀYwØ"¸^ì~ бjk˜ú-4ò1Êêd:Ê‚5â<ê½ON­™•û_öSæ¬}ØÔ]ò»6ÈýFC©±ÞôÛÌI€©Å–¬ÕÝ;*³ú”]·1QAí÷®pƒ¼QÁ³gÈ~Ûçê2B0u™èXdÑǃ Jó„hKì{¡+Jx¼µ¦Êò ©‡´RyK·õ†–b!$Ÿiñ>Ù-Ý?r ¥Ò$Ýá ‡ ðÌn×:Ã……SnÜpûN@”‘¨2°TYæà;åS¹[ü÷Q ö2q7þ«ÎËõTLÒº-šûe¡i£ë©T€¤À6&ââ”´°Éµtðÿ.Ó~Ùï3¸º ÀÑQxuÏg’›-í¬edÉO ^€(s¶æ¦DhkfS¶7•W&šëJB¾á\Ýe8S+x–t¼þÛ ‡±ñ ~bÝ&,CK·,ÒGwÚeNì¸RNýrCY;óDìž[ïJåºð±…^`FhƒUå9'Ýûdt5«ç:f‚^pÉA]Åó~ú¢½Â)*ÿ.|$ÎAgm`›Vzô â\÷Ú£¬É Z$».aêj]D»¾^¿® p®iwY û8• u€VÖÛË;‡šîæ1~zž·ïѯøŽ°‡¹õ.ˆЙä¯oFÆÃqŠÏ8 sƒûŸNÇøɈ@ƒ1ëEò¨mÁÞ;¸Ç $2×ï1[á±ÑC;BÍö¹G×ßÅS@)þ7æ5ó¬ÿÀIYD#Y¸ ZýÜé¶7—·çÏ@ß΃$Iñ>@ä‡;Âêú“uÓ·)•‰ó› Í«éË8N|-aÝÆŒ°Q¦š.sÞ}‹›µŸ„užø §pw¢n—ÔÑÜÓ«ž°# ò÷Eawfº8¢#Ú ©<@Y´y¸¶R‡|¾dJHR4¼Ã˺ürHáöD‚l”o¿á º”~N}ì­AUãÇzº„o{Ñ¥u—)õ›ˆ}ýË €â”[uíÞòf—=`ïŒÃÔ…ÃH€p§t²²8p¼m|CNé½;S‡—Ú¹· KƒÆ©Þ]S²RYVI®çø¾ýËâ·Ñ†!3çPu~£¡äº–+jª]Eä%%ö»I©o_Æ^1•ÊË^ˆŸ´¡Zl«ê*%Uâê¶§»ï¸ð÷nC;ÂrÖehªÀY¤Ò*¡JV ™ãê  Ðä,m ùº5“Ù8m2!4jÎÛöM³Súßß1«Åƪºæ”Ox9–ûÿtŒ…\\”Å:g×èRVøÊ^Ô¨¸¶ØèZT#ÅÎl_îáÕ1YbóÈ =‡6-ñ<‹Zj‰´z¯!VF&»ÛêÎÓØ»k¨sÙu±xØ(ûÑµŠ Y—ZÂHÌÕóž°ÆuâR¼ÃÎOK¤šða Pr‚—fŸJ/•ƒOõÓfšìób æ(äzÝC}îo3ƒ¬ðÒa±2; É{,ªiö:ÔHiÀM=µc­›É&a8Éú€h›jFpß,&x~róÞüVZ_Ö?P¨{r%;åÄZ£(càš-=°†f±7…7ýòÄN²¹7 Ë3Úy­‚çé ._Ë`Ñr¶ýSÑ… ±ý´ä!°y3O§6 ËQ€µSvþs[Òà.‡å²U’ÖŽ°…˜+¸sÑ)ŒÜrxi}šýÖü–¶ƒ±8©æ’#q~¬4¤tçNK`¯ëž3îä\R@Oï^w}>¬Vχvfs­›}]#Cþ —³þl_CAREíX}e×^zöEü Ý2U9›“VçZÙ¥åfk\FѼ&³ Á=gdüâ¨<‰L++ðq ä@l¬ËëŽÍ,ˆËZµ?õ#6ç#·&ù~<7tÌHðé+¶a¾¨±AæÖ‘? ä.d 1²¥ø¤BàýêX{LÃ7¯þÕ5Ÿ® €øeI-7†Ô˜Èèx?-0G͙ݸ£—÷’¤׫‡*Ïþz@`ÝN^#üì€:xždÚìbç·«™?uBÐ:R«Û%\ÙP{çSÇC$ݱ¿Kbpè·<ÑÜŸY-Fk{L–&S|boKX!¬óJê^tr« ÿ,3B0X$q¸³j€5رUéñUú]>Œ€%[3äEÀ±M>=d·¸yf]ý Z)§mu@3ØS¡Œæ!<B£Í§`ùb7§€]>‘µžWs~Žcd¨¯ýF…ÒBq_e6É „Xµc¼XVH£ oûãûÜö•Á³ð´/¯C;É™Á¤üÏðXÖÓìæŽ³®'É÷¬¸£e8èEœ˜»úsï&³ßz©füÛ‹ýTº$°¬ñíC)®ÃÅp#—¡âÕrxPué_¡z&œ³Ò?çkô: íêäÿoú컚Ýk•‚Z›J›E¡¾>xM¾2J9^Ó¿Ýœ&˜•!!nÓµëá¾: føª´@û’GMö”{^ðï¿Ç2T ‚é2`c¹R*·X´[íY0¼¿þ9øgíŸYÞW”®yìÙŸ·D‚G6Ãà‡&hã0îä—Íã©ûªÈj=eؘsbòë³H ¢¬Â¶øÁü ØéhªOÆk‡ÆŒGDéÝ•Îîš§}È‹>½¡Èmb¦ƒÈi(çÈ%syxd+ù6üòE/¡übÉÞïEò$·]ÚÎw)-ç‰Ü¯@ëØ$7·+Ñg€´QÏŸ8ÿÍFÊX¸{ÿ3ExÚVá:ûòÆïÆìŽƒè&Ä)¶‡¤f8ÉàüÛɦ< YºÖ¡Œ²Ä¼¶Hµ¼‘½k˜ˆ£3èÃB Û/íÁq7 à3¬µ+|ø„,²7¶å“å÷ Ÿ…v^öÞ›6®•c‰(–Þf_§¥“œTu ×â¦pÏv$3ÓzÂKF Ý`Ç–®ô.ÐDòÃÜ÷#Y9m·îÒt| /d­¬Ó×ô„b¡ÑÄÀàçèþu!•çò$ÑsO\—!/‘ý•z…óÄ_êØ_ïrŒ„»Y5øv¶\Up˺P¸t7Ëâ±MçO‡'.­1üלB;9ɹx8ÃÈDIuV¦± 3o·¬ˆo¶ñ[múS;ιâ‰8o‘ïv J„b»:{IÇæÙò­úZå÷rÚqéÐ*½°…ë[ß•h×,ˆÛ~o*ýäOø0^ñÄ®À(X°8ÓŸ@¹êáÖWwßH]¡î#–„µêM£-ŽÐGoR¦P|¥rŠÙöÊ›µ\Ü}}„-ÞÍ%0sŽõt¬Ï÷KÃf£/P…¢š‡1XmšGëŽàdÅYñô•¶@97H‹#õþ™ÖÜwÛ ›èïHŠü›EÄ“ƒ@[ÆAö²•$v~8Z|Ÿm´ëÅ@Ê®…[âôË“Þí=⎭Bf RýIñ]¡#ýµin¼z³XåÛl½ª _Ôè~¹•éÛ†0Ö«£GQíì¹–*ù¼´ßYAƒÍ 0;*$Øãk^ ]ÿ!¦·Rœ]’º^` I—öB5•b¸Ü–M:ÈüG`pù)L cd:Jc¿vÿ:j¿˜EüJó‚1[ AKbèJ³Ä–¨´ã’ã0ÂPWCzÍú5­»•'eª”eefÚF»Öè+H_ɵ0Cñ±¬ö‡cÌÑÃàÆ5ØýÜš!Òâ6^·Éò²˜N~ð°Ìj©æU¬ûx,¤|ç¨ÔY"µ1oŸ­ºÓøÐ€Û âÞ— ÏlhuÐa¦çMû…ÛæoºVÀËšñÜÅBƒ~›àXr½Ý9Ÿ¤ÿ†%(XÒ‡,?uè%™¢ªUÈl§[I'†ãéüÅ/R¾Ù¹ÉX¢‰½|¢\¿ó×wèÒ e­r¿ØàUÎ<½_ê•5š‹/Ršq£µ0Å,†ô<Õÿ\Nµ)ÙaË<ÙÚÕ¤Bݤ®ò¹%¹ç$Ó…r¬1‰ì!&í°–<“ àÍ¿×ÉD2tä=è;ªˆ… 37¾u½’¹ÄØ|¿#_jè§>‡>¨ Œö¿M5öÊÈ%ÊxSíüyrÍQHl £â£¯3Lë¼ý¤¾Ôvuã ¸«§Mî90=ï¶Xq‹6'VÁË·Mšy® ãy˜õzÃõì 'ý¤ó’c™ “&ß]Ê£òiÙ—\ð굎RšÉǪdŒ}{ÌùÄj‹À0DŸ"çBEâ?Î+ðÒ[:JDGùÁWÐèq»`è!;Dañ+=DÖ¿88ÒÆ>· J$¨é¹«d0ŽÈÑhÓ’’}¾ÈÝùðŸ Ý] 7 ,·U﯂À%$á—é.u!.4óÚ‘2o¶ñXýƵ’&ù?&‹»ÐÈÈø 7Ó8O!?o ¼7å…ÛêºXBñ£Mµ’Œ/TMJãŒ1GŠXTPÓh:÷Üóˆ&‰<íº‚ç ¬6Åhø‰ Ûç'ÚlFäU-ÄÁêbÞÃÉ!ìr%±cVVn‚&…I¼Ì!]’sW IÕdskLPÒ,¢~ äïSyHf‡˜wIŠÆîœ(ðùš¾1©q7\k¦FQÃÚå´U?Òˆ’×Ydq¶ò¬±â*NïÞûµ´÷!:íüÉIüÁ0ž«l".=SûŒŠX ñ4Ý §$ gNÓÚ˳U÷…ÍþÌá<“]RÖ ]«ƒq áùrB%›FWpUžÓ·çÝõ¶_ßÑÀ¶ØëÚ¦d>V+…¤RùU˜OT«C"3Éñÿ€JmËZ§J¢3Äþ€V&½JÁ‹±íšJ‡và83¿c\"©¡< ‚-/Õ±gª(Éê#”R;r12‰¨°;>¤7ÄÛɤHÑÄðNßìaGLOj+ׯç&*–¡àÞO3þr¦Z'vò‡ù²œ³ . Z¾þT 5®íNûŸÊžyUÐlD»¦$°G8ðìE'WÝ‘Šúïõ»¯Ì9?pÄÁyLx…Nì#°›§¦_$V@ïô¶:H=…Ã#!jeP—ê)¹ö¿ÿTï©DM‹Žþµ?¯I¢² ) Tt3'Ä.¹·ÓI)Ó\¥òY8êèªa¤J ë°5â£OÕV×üQŒ"ÕÂÃ5îÖóKm"%y+õmZbÑ@÷Õ³M¯ ‹K#\倻ƿR”ž{.Ž ÂÎð5“ÄýMn.P•$yŒXú~þSh,&€fKÝ,8È(m1ɤ†ŠBý¿$- ‚=7ýitAA "S2Û³Þ°ò˜fÃcBÁé ò¸Íá°ø/Ζ„Ä@>)„SIƒÑ/ÙH çTn ‰lÕÆ¥íGäګD˜bY0]Jr”k«²"×ͧÔÍú}ÝOnÐÆÃÛ4€××ö§4¹J©f=š ×ƒXwâŸfYÞÎ&ðé¸Â›{Æm€ÊO¤5]Âi²¬Šµo“ `¥#Û:,ûºb/ànã j Ï!z"—íPÁ5£‘±å {9ò…ÿEJU™ ‡ëgžÏGH;Íð®ä@žºð:ÁŒ+Ã&š-}ÏñžKIji¡ë5þªhÃ_0`L›\7RIÞÖ£KŸ7ètÌtH‡”Þ×]©˜òñW‡#Lš¹}ÖA¬â—šò°Ã®º½¹DL‡ŽU”Ô¯]†wú¦¼‚-“4*œH¢2Yûßkô=}­ñœfn¨V&4Éí^F‚íDyÇ$lÓù=ÏújÔžCÌŽ³¤ÞQ\Ѷ\ó¸ t‡×±&>êk"Î3 þšª!i,zí*®AÚIŸÀÒ€A¬=gEµ<±K™wÿ ²ok³ýéwC…hü³§{:Âð²-¥Ó¨ ÚR2ÑE+á•ÇMC?Wºo"Ñ5âˈš6J?-´[ðmÆ+¸ÍOÏõi™x<èQ_Ö ô™w\åj’¹)‰þnîfOAŠ8dY´í¿ã ´Ÿ¯î«-wµéï„4¥2“¢ù­…ª~D»}€óO3²òÍÛFs}J+}‚^ùéñëBÝ9‹H ÁÀÚ³Q%×ÎVǯåK4­²èuá¹y•’£—›5vzƒ% º­™èŽÃœá(ÑT¥ëÂ5(y;¥cL¦©TÔ€Ðë˜ã›ÄÉPÕ숸¹¯èb¹ò#¼>5¢I‚›Ó –!¸Ó}RNðk ütíÜ(N·`%ëWCJgO ﬞ‡;rŸ+$‡&'©hÒX©¾žÞa‚ƒ]q—‹ºk±L1©¯ŸLqp®À^ý°Y¬úHfÃ]°5·vÛ³M—Ƀ9 2“B¼võñ.šÀsšÍÈ#É|¥’bo¶’{"Î@vF´5ïÉ-§4ÑÃ@ý#•G5v­ÓÓewÐCÿ}mÉ)Â-”¢‹ºYvøíÝyÛÃrÄÌäƒMk ‡¥¸T‚A¤XŠ¿Å¥×­‚˜ŠPvÛ{ÁeÆ7Å[ßÔ;Áa륇Ù[4¨Xb4îæ”ǃ,£€n5": «‹“$ú'æÓ9$S]V+¶øÌ?72ÿWÉ–ìô5›vË´ëI ÿ%Áx±Vwg£¥¦ÍÃ7/%‘˜àÚ ÌÒcä/—Aÿl“›+ ´ÄM±d®4Oiv4òƒÈ™`A׺ !«ÈNynV½!¤)£?•;‡±cG²û}E“jœ†Ür^ có îx´Þ•IøÛ£â|l¯?/Ÿúu­ÀàÖ)ßïÊZHá¼ $³pE5¼`6@~ÉàDœ($‡6þ¯jvÁí>=d6»«YTúþêÄã¼}–Ž`Z î"£“í«*%ºn%€\ *Ò¥8¥[‚Õ€ ë@2¢ìnH¿¦Å3ÆÈ"g ®êƒ°•J]íÿ{hUmD²_¡P ÃoOÅôãožÂÒS~kÅ9úñiðGÙr1ˆ÷ÜÀ]yžn`&M¬ìC0 ÍJyÐ)QÛ²G뾌 Í·c®´ÇŸé_/Þ¢$³è&ôåRbv¶ø!üÇ ~ä]{)¿|e”Í®åôó›ïº6y‡/îºl‰éê$Ÿ¥WU³ >eêçÈ¥}|]¤l"´X?1í²ÊŠÿ*“‰Sgƒ'xáîÆ§a×/¾ífW¹@À²úÃmTzséAú äShÄýºˆ“ÓgÆE”é8hoâ܊‹*íWëÖäÛ ëߋǂ[a¯W‘ÿ([€ŒîãÎaŸkѤ?@ÿ€å^Ò·FR•¤3Ð ÆÆâöd§Y¼Ñ|å¦Ná{ÛOÜ$ï a*°ü¢Ÿ§ øO܉a–JmPZŠÓ/TȃS¼2¬ð:ë>>kŠY{rÇ3Ð^”ûh®Hk×So«l“™補çêŒïtéJ,ZÓñùê‘d_U+7ްm'üùMV’ù&È—;wuyvŒòÃz8`ãvË![^¨[n°õ¹µÔM¾(J ' ØÖí/-+POóúµ¿äܨŒ&ø(ž[kjôèݲÆ ÷-JÚDÄ̹*–³YîÆ8ÂZ«Y©ƒkhŽÉE¼ª$æ{I_¨ºRþÌžlH›Œ¦ Î¥dqœZ©h¼^¿|õ Ýt¬‚A>"kéÎ>\\`ƺþé0üÁx§BgDà&œŽ1~©40Ž5‹©ƒ] ©ýc.m©}ä]à×Ï D±ÁAÁD(†z}™Hf¯ñ j"ŒiÕ÷ ›²7Eµµk@WŸ; ëòBä×\üð¢År«§vûq“76Ä}°‰âv»ü€‚¢×Æ;à=°Ã} é_sî„ðÊÕ¥è:¶S¡0¥º0Ù€CT”Ä“ÕWØPߨ÷¹'.½ÊU§ùÊð‡lIb4ÖeˆYY¤­öèÅN©ö8§©újê¤ìÍ´á¿ëžÕ%»l<ˆ½š—c…õ'ÕÁ@ØÁŠð…[¿‚ÜóJÿ)Cyß{Ø™kÿ`áxìÊþèîA…:åòÏ®À W§=Ì^³¾½µmIÆ`Uˆ q®LzdsÍ"à÷Í{PüÄ?âŽh‚T ”ctIYŸ!îÁFÉûà˜#­‹ÖHŒ’Xâ¹2C8³bÕö’ÎÏlÿÆ8iÇý»–•"ŸäÌè’BUP·ñxàu6Žà%û "S0EFrêÀØshÓqLòá¶Ã?|â¦Ì)Døv5oyr@¡»8¥bL³.Sb¨ŸÖ*¤ÑJºÔØÎŽ5ÒtÂúÞ®2©L¿ÆHÚçÞ-³Ò—EÃV–?~ Ó†;u%Å˹GÂ3åÀ›Ž”Ò÷äéSJS*‰M4?µiY,‘ç# Ö ¹Å‰«îr Y8ˆÎ‹²éõ¦o[ƒÐÄxó¼ùk*‘ÎßîTzëó óRò˜ô|îµX°Hý¥¡CËnמ+Mõ¶i.©ª°î5üȉìYò*=Y³a ƒŠ 5}ýõ!óî_ŒàV'eÀSèƒ-n˜³Ž6yT§%0KY?—0`”sEQ7éø-pÑ»Ã脘?D>£9˜0ÐPË¢ÇT_a0õJ]gǤ¤È(;™´nM5¢0Bå-êr/Vê¬ׯrH|,F}+ku‘n·–b2»NîˆïÞ‡×Àʓư§Æ®úìÞûV …ŸÓkïÅŒÏt–ňBsДŒon QvŠÉWY‡FŽ’¾)›ý¾ŠÒÒRäFŒwnÔì×R‡Æ’q8åÂà)ÂgϨ+$,©höÇO[³ 4ç³jDWMc™U8ÏyŒÅȲ[¯jªƒÚ’$ æQFÚ)$}¤ïä—üö}GáåÉþ–áMŒ"Ķ*;ÓŽl}ýB9Ûýe2g¿ç¿_XvJ½7+Tá¿DlÎúU`–¾a+‚Í~;§fQ;ÖŽ’O²YV­ü\Œÿ­î=+wÅÈ-7¶<S¤–XGʼnòjPSa8otú¡%è(û!⃗a7†}h;¦ð¥ 4r{&Eé«ÿHhm>Ÿ:S%ÊýKC€ù H¹£ebè¦ÞC»ßcâW´ä^óô=€yÍ=Wzã³FtUUUUUUUUUUUUUU´˜²A¼Îs™q;â]¯Ë„‰ƒ»íg\|©…3DÊ€u…Ÿ^²~cî¦YT—HݼÀ¡¯ÿÿ~î@~[­ãÀÂB_n»r!Xý&Å}UUUUUUUUUUW÷Ç;®…^²Ó~7Vó¡c=¨”Hß­Þ*ÝÀ\*&´pB¿.œlö ¡¼DXŒY[ Ñãk²Ú¬ÿ(’z-Àˆ¿R%¼]; ßÇܤ.3c21Ãp<®kÉ{=ô#“ã@2Œ‚¹9ìe^ªÿÎ,}/ãèþ…53Æ@©“"A îÀz)&^k%“èÍÇ×J郳ó䞨 CÔº -³ÆýÓ ¾3CÆï«[¡À &üÖû¯³Gp˜~:‡~ÑTóàqN¦P޹[Vª¬¡óW£•ߣRD“—odèÈy‰å5âµç÷m—_h§<-¿/m¾T‘uNõ ~SÊîâ"’ü6’ÔÒ6þ³ª‹çš:­3tô]ä8ÌqŽy:»Lw[R=ì $î±S 3a¥L‘‚+ßÄNàÈýÅÇoÂcßô+\Lî]êDN¯@zÅZ`a¤ a½ˆÎvކbØÄÃã5IÖüoöUj™6íÁ;3‹Þù>ªXÜ%a@§Ø¦¯n­ýe¥Ÿ•„ÀkQâh‹±ibƒõyh(›Óà9Â-qfE˜féFø,Å×3æM–qèCÐ$"× @6y™æ¾Å +£i] Ë ð[â}µH•¼§-b3Î]Ú,2矎3æl<%w˜ÙoCÓÿw‡e–ÄY+œñ¾Î>ªX4d—â—štM/ƒtöð `5†æ¼¥#Œëÿ-NÐ<!Ç{ß!V™¨}bâ£.Fmƒ¹k™Ä…‘hD_‡Æc±‡›™±k“¨©¡ltý6›²çB0Ýqp9ûÒ(p·­’ÍÒ4yƒÀÙ·±w»Í9·zi¨öŠŒÌí¦?½Ý2·Ô2~aíS,c½&åêI°›KËÓ1ø\¤[n2§ü§8×Lƾ ‘Ùô÷haÂWYÌÞ™}ºãÖ=«ýÈœ[{tѲý ¢ìì" ÓîØ<±PRqtˆ%i—÷_ZÈ›Þ/Oá4+Q^‚gè}Ocí|Q9áó† 2n‰1¾N(Ÿ»Z/%ã}“vÞNܰ‡àH±‘VˆÓc}qÆ’@“!Ï÷GœNÂ_õZ×~õ™ëüU‘ùÑzp5´…ïJI÷íë6+Î!ñ1À^ŠM-AÒA¬CYŠ )x³¨•žr¸šp¯O“ó¹Ç©Aùl‚w'Ô¢ýí-8"÷Üâü¤–¯ý=Râ¾m*?²ëË@Ü)]rI#ƒ0àý¯©´ïÓ1qÏðn]\O­w)ú¥®Ô ¤ÿ[¾È•5†G–„X%‡Ö(Æ ÄŒH´ø†à÷è"ß_fMþub:ZQþwDbüÒÖ¨RJB ÏÕ ºãúÐz³Griä‘J;ø ŸÆTUÁ‚y{QQÜE”°‡ lÑì¦ÂôšŸ–A¨‡^÷O¨;Â$ÎÐ!0E-}1À[Ë·ˆ¹[šëÃvªxÁúö»ÌO6ÍȻ홒Xª÷g?6¯ÕCI}í#žÆ*Š/4î;A§U:P”ˆorÛBvÓ øVí[Á HÀaì£2éê ôŠ2³vqº±û¨£«VÖÊ9LHÒ9àZû4¯ÝIrqÄ*ÊDî!‡DõØ åæÀoT:tH} ÄSW£®ÁŒ³>äs8º1Âd¨LNñò‚p4„~ÄYÍâ)*oSxÁÛD%^ZH‘ä¼õ˜ÞQä·m«ú_¢È¢ÿ/d»uÖõx.zæT2ÉÁ~f°jÜŒÛðÜ+/Oì6­”Vp­ÿ§†çs¬Í¢°§ÐÙÜÃ:Œ¯EÄ5ßå€ußñÖË· ‡ýjÍÓstkBmÖ%ÔÆè_fLm UË=ë-7 âHsAåÿw¥vŽ-6Xñ¨üZÃÒI‘zpÍóyMï€eg]!¬¸ÌÀ  ;GHw±ŸyÜé`vµ(‚ò!fÍÕ©îCøÅe56‘ä'WuèI5J‡Ò©>bç#M› O°ì²Ú"¼ãUE6@ÆB·+ÇDp1;ógKÌ\ ¯§€ì4lj~Bï@º»ÒØšR*:A—BdlïЫâÈÌ[Ï?¹‰™€°ß<æP?ì”w Ú{YǤ¿m¡ûeÒhI~“5Ô&º–…M޾ˆ‚F'<\‡Ö´¼wF§€]ª¬µÌJµ´Çž¡Û€W¢À)€óÜlXaÙJ´,Ûóm} 2´„1-ëéú‡ hPœÇ6ç¢ ££h9ÖâdÙ:[ö¬7Ç!òXp”sš“_vÝÓŠmñ̸o™XUÚ›R±V¶ä”y$ʳ¿ ñ…A×ÃKûÆÞм3˜ci`æPqHáKÝÔ4|7Öm’×Oêk•qXgNYÓW’vÁ²NÍj¨‰æ>°°ÂµyÎqØ%,€Bœ K01ýù¢\<ÜY°Pñ›ÿrÙ®aï¦7yOÑunÇ ØB.OðIBúú†Ãó“ºuØk^qÒg¦\…ñ=Ê2¾û!H7’ÝkÏueŽ‘f.Y†¸/¥;?3¬x, †scDAPÙ;Ï3ƒ/u¤’)ïíyÔBœì{E]±…*Ÿñ£Ö|_7Ö_W8ô×tyW 󋪈wŠW?n E÷Sæ¬Ø^I´•1vÝAµÚjí…Ày¾•—/¢þr+ò²ïî¼6äÀS\¼Öè;|sz};ž‹´Ž]Á‹`$ãÂâŽàlæ³Ò«¬òQk~öWÝ>Ôø ®0dpœª>\C£<´z¿*¦Ì·ñû·×òY2äN¨ÞRÿS;‹8…'HÓäBßò÷èÈ™g¸\kéÀyNát4éÐãr•‡8q? ül´Lž½D¿g­iLÜûÆc$iÔxÈàúðÉMÈÖpe òOÖkí¤›Á‡ò½ˆ+Â=eˆbNl•ðÍ7‚ ²ªõÐSŸ`á8 vušÝç2g|…‚…Ôw"ûWDÿ  íZÅ?h½"n bzƒªž ª^þ5f®íäóÆèö°‘åò§võqn—Å8”¾®&áL¦)0ÊÓ^8ÌÕ M»—'T…åB@¸ð•´Ø#pçÛšK!bºâÈFa˜kÁçç‹ÒaØÒ Ç~HÇl]+*ÉBëOo`"j2Jv4êD·QâJÿ,ßèèE‡iN9áEC¢t›kfæ+¯ÔG…8tCó­£üà}k1#)–fÚ¦Šò£”Ú~ŸT-Ö¢#öà-%.Èû%Îó‚bå|Êz'¬^À9]Ë·ÈÙsÑn(ÙxÉ)j êWIhžw$·oý6”ŠBtc3dÔTM-šº5b‚¥Õ†ÖƒÚIYä¾'ÊW­UÌ•¡¥jî!“d ßÞXAdñK€&~MˆR·<þo ØöïeÆù%¥“Ùè¡øQüñ Kd6ŽþU"9šµd¼E.ÔØö…QšçUð[™Ò£6HäÓçõÊÞ›zÒ{ÃÈ'YpÃþj …£ÕÚU¯{¯âÍn&0Iq@B)Ö,C•èZŠá‰ššTPH©øU—øÉ ’ ï2JAÔÛíøÆÚežM³{Aæ8­KÔÂůvg•¹Ì@…§¼Cn2Ë6²®Ó‰/…çÎNœ8²·ü¯MùUâ_½ÔàcöÙ'O☀œA…íé–2“ëkÍCÈLí'‹Ù\]‰¾kquïz“ç_[®"4€[qì#ß„õ~ÓzVئ„¢yè"÷ØRå¼ÞvÅ&Ø6# s¾]sà\åA+QqÉ?'-ÕÖ–à-ñ«°¶?³£Ô: ­XiÊ©ì~•O¶4ô«á3¸ áaáŒ{‹²ñð6:ˆk¤ˆ×ôµ° “XÔçÃÝ$ããþÜè W«äb¼a©í«@j¥§ÊqN6Õwñš )‹$ˆ)œ²VÐ;³PºWÓQU&–SüÁ\–ÍX’ù‹Ý˵!· ÌÛ/ãÙ¬AyuGj…ìÇ^ o‚ñöϯi1–ß5êLßÓ]|E³Êb¿QW­Êl™ßl¼ecÇÀ-ê*rCWIPK'Ó»=;œÚ%™êï ôãæ†6A͘Ïl(.!Zê™ÅŽ.b]îÙzg”ÑîÐHkðÅŒØv§ç㟠ä3l_ÂY:™ôi·|pQøƒ:jÙæ½?ÍM7ên8T0º2‹”Þ¥Z×P¸Æcû.AQ·mî%È<£ÚÅMûõ"•êܯbgåÒ's&3ž¶›0 )À úÐ;ìàÍ!s,ÁžÎ‡EçgŒüJAóÓ |/`vשN™À]kÇÇæX)aÃj²èI¸7`†BÞÏû@w‘^þi0X<|a©Ü£á?&4‘^¤k¢„‹¨Â¤dDøI(ȧ©=¿˜àåõGëãàþsqJRJºND˜Æ˜d¹f€ë¹qÅCi²Î–À©ŽŒ#ý]­|ؾæÊúg¶ SÍç6ñÀ6Lñƒš½IËÞ )Ë(C MŦ èžm9ÅP\Y‹yqÇÑìw'>HJlÀ0S |XèYøX*õ`’•„?6ˆØ醪‚;Á” oûÛõLLÌWŽÏà[¢&ö0†±€«ÏZ¨½åª«€€#µ«q#2þ25¸PJÏ ³ï„ ùC-$°=ÝL0 Ÿ¥®>š`ì5ßaÙ‹´úèŽ ÀšQ-“Ò¥§¡º…çÒÊÏL”ÀX¼RȦOìì’ª_fcÈoàó@°@#Kùù¾E‚i×b_PŽ5szßÙÛò¤Æwr‹tì³åä"ü![1CûD Ò…@ºÐQUˆý€Fd¹òîLj¹O0ä½¹‚׆Ñ!ï/H¨—m±ÚÆ_vtÀgrHYF¬F£êûnÑq¬Ц.ñ7æ_ ÏoûâN[º¼}ôûjöŸiw£ñ>E~s®Á¼žªáÍŸ5#€Uôna+XQ­ lºv$Æ“XZ÷k¯¿ÿ_>*ÍÜ@þQz³DR“J†8ÙÕÅ.z‚óš7L gý ‘†J² !^‡ÖÎVÅÿ!nõ,BuDZkaÐò W?yCM”!fÔÛxãEPè8ì[b¼} ‘†J²Äïô4ÄqÀVw¬!T´uš*.æÊ¨ÆÕy Ø?m¨§%Qõpø:’¬h´ñÌ”äKŽ «ÆoÅÂ³âÆ°ÔºØ8ìØéÌG¶O/#›Ÿ„º ØU’[œ¢­ÈÑÇÔè"Á©í¡ÌBñÚm )%RޝáÖvyÁo­O2eñãf& :ºlÇÔÍÆæ–EóÖ© î8ßå ÿÿü>ëý䆵ַ´ü½ží²°ŽµÈtÌTœN×gHQí&ZºütÍ-çÀ8Ëí%?Œ+%fŸ¿ÿt-×ÍŽf™ÒÎ'[—ª¨ÂÿµåäwúÉøƒ†J€HKÿU~Z>ÉÀ¶ôûgµsHc,ôøÉq±Æ§{ÀEÑÙ:)¡ä ¨˜Ó=©*Fƒ«tÌž¯ÛÊ RáÝZnš)Û±ÀìÜV„'¹Ûر›qƒ§aw ËɈ‘÷Ù_A5[d»ýjLªòd#\í¦@1;Ó_váàÄ/4Èæ ‡dj‹¢¢¿6€¾¤È}ÉÃÃìsƒåìÓ²|¦(»á*v¥ê‡õÿÄ©ÐnJO†Ëöý©k³Ûèõˆ‚ûóL$”BñÉÇ’7>`Vx™3dš‡Ý| ågOWÎk´*€°c;1矩ÕÙÃÊž£ãoªBæa ×vÅmÿÊ^ó7S<ÆÏ„»<‹@hSm7zɯmAݳÄgõ- ·?ïþ®o®¾ª.õâ¿Ï+—þÞTÀç;ŒvE[¤'”,QË£xýdêºXœ_÷§]f% }Ý?ÿÿye|ЂM9+fc'²Sp4½Ø $7£ÌÌ2õ¿U†­­‡§((î G"÷à JG»ôÖB¶íÜŽ«ÿe@tìD_fË ¥fWÁ ×sg.ŠæI€­€”Š”*.T"bϨ›º±Úµaw¦ÍjEÅú3 nêEôÄ„ ¨B÷‰Ò•s1±c½Ñ¹»Ö¯ˆ40 ]×V) †=ý{UÏëy}—©¸>;WðBn”!¸ú5Îr F£°‹êÁêíÿpÌÊ ~Àó|“™nÈ8£{¸b©¹ºK}hôÛÒ9˜†³ÂÁ·ÿÿÿý£I"ÝR…>t¨Ö¹%ÿóµD’ãÝ×Z¬z‘îCˆ>ôΛÆN3’¼Q¨4é}»†"$3fÎ!è»×>Ë>;‡úÈãC A"p‚õwæ¦ÞÅË8¡†G0=nþSÉ"«ƒf¹hÊZÎ8m”Ë…9g!ä¶e„ÛëÆ¶µDD ¨ö =±iN¾Ç 3œåJÊwò4ÜhÁ Ñ\Dg)?€>{,­ÇW¾½hm*NîjKlÈÚgZà ó¸P²VDE@­æz®7¯ƒÓÐo†©LèÖ‚Åý Dd±tAߣ À‡ŠN“ñ¼À>5mbé†Wã+Ô­NÎÜ™½ª}¬J)°ƒãâŸá…#?Cw¢çpÔ™ Öx@3â]YäD·Ìø,$‰›Êè‡k—È«fFèògù¯v,D” µÎ(,n¿¯:¢<×–< eìèìÏ{U‡ôЇZ:êqñÓ%gƒƒÃ¬òZGd¿\77$x¥§"rê<%=¾Ýíç'·²XÌÔÝ/¹”MSK!›i¬E+é’Å+L•WKL8»:ðÂ$›ÉDAñCQþÎzI=z‘c +dd§¶ofµ²IÅê…'÷ƒ£âËs¸"lO:!‚ÑÐQ8E‰wôš#v Jºsa]PÜ(tZœà œÒS«Ê‚»¿NC ­üû5{jËö­@‹=à ¡XÑ]ãP)­LÊ–Ž=s¢ä›¢± nktˆ€R_¹èÉr‘ê•仵E¶g1Ø€¯Ú;Ý?œor\PTͰ½}bŪóAµÍŸWGß ploñÂ-ûŒÐ‡Rå#5 (iý†e:<¼• áiáõ¢Ú!¡ jW§!X?XåWAfŠ;U¹ö€¼Ã†%`ÈO6ì÷]8ã¸KíçHË~1ýRK{¤Ù ÷ÎIÁ^[7ÏÝÿSÙù•×'‚Èâ€Ê4¿Æ$§þ9ÁçI h`ŠÏŽ÷á0ö«Qz-`ʶYµ3È;6(ó#s€ÊêOÒ&=àlKÒ2ÔZ56DoïQñ6i¯hëGqçg(½’Öúê:É/Œ×e£—D­ÁVН¹&xwº‚3á¨p=™2ñÆ’x?ÖkF!7FÊ•­ÿBo䪫N¹³ÇR«Ð`¥Á :3IVû…zô&³o¸gV)7zJNÔj¡ª€«R:‹tv§ÌbâÒ[À8Ùç|WêÏw©¼ ™ŒÓì-a‹·$é¢Cä (ºˆ–mIB:Ï’Ð#Ç[v›âÌÄR­+çï÷s§žBmgßZsf:Ðy¢–³›¦âIÖi-iD]Ôf…£UÈä÷>>5ÿ{Ä¡B©Ä(ºE6M8’ÁYz2)„ù¶ª‡´e¸uo¬ßDæ^ ½n¨„ ¯öÎKD †vÓE¨š¤ªÂæ6¿vC ^4òŸO)³¿ørM㉯®”‡‡·'‰ø.EÔº$øbhžúÃ!€tö¥À_ Ðå 19fvÊÎ÷Weå*†hývÇRÆ¥” ß3>·Ü…ó,s±-,HÎ`µ—¥TkF7,%gÑ—©º'dÄ}aߘÏ\“Èfšÿbo`±6Eú¬I÷Bk«F)à‹ú¹`;ôØyu$"ñ0Ã0’R{mÎ{ç^n°JLÚ/ÑK›ß!ŠLYšB!DµÒÑ…w½ —Ô’:ž—3wS¼¢‘8VHæÚ-¶| ÜÐДcûŸt‡M/FùùéÝ ÎÍ@"l¬.i“jò [F\^"+[°âBÙ¬–e4©-?QŒwWÚ¹Ê _Ø?¤ƒË¸¼¼)ÚH’ª,òp?rË~oÚg`k »Â MawYÉ?¶Å Þ1Ëzrþçç6bšbªð-e;Ê%%ƒ6ÄDU+³.>ÞQ RG‹³ÆX"3q{ ùËõS[)d`5|­¶`5Jå‚"Z×cüçÑ1‘ŽM°þñr<*¦jÙò4Fïk$Ô/FlË5(væTÖâæðO±Ø¹Ñ?~À=§ù1ß­Ê>vÙÈ, *ü€ž‰a 6 EÉ¥¾>qÓo">ð¦ Ñ"C%병2‰8¥”ÿûŸó@7t¹6“]û(‚òHvSÖÓo¹] XMH¢/h£Î­Þî:Û‰`˜Á$¦Zƒf®/Ÿ MT†¢ÊBªT¯svᔿ ¤ôÚ«TœBÒìÖ±âØº@ZßÐÆôk¤EsÍgÃ<¹©1&Èá>,²_´òK6 Õ•ç³µ|”G7»g¤yâI‰«q³èÎ.»BckçHŒÑÿVméÙT wà8b+¹§@L6_Dô«qQÝh—±‹"Xé)<éjŽÛûÔø9ÐüÿNã÷ê† ­}. §Ä£jšÇ˜SÐG¾Ã>]^e'Y¡hªià@Ã"(ç)´ŒeOàÜûBž$¬F2¶$úÆú{˜ |Æÿ`ÄF—±±Ø£'Ï¿©J3Ø÷MòÕÞ½²³þ8ó|ŒVq*Oa;ˆý¦^-ŸDçé´ ‚ÇmuHÏ‹[9m$ÅþãŽl‘H¡Sƒ^óÓ¤ñ=@²×úrnâý†ÍÆwW&—r˜ïF™ƒóÙ]¦i…b‚­•ph^¬Qƒ6‘h†¢³0°SDgÂâã¾òŸï´+!óÌÌNÓqPÿ ZíßaU ìg;ŸÂ÷_ÒÒ_]†©¶™îaV FдÂVl £v\OâîÚI‰Z æŒ1‚è£üÙ3FÄ.ÆÕÿõ:ç‰I·ºwPÆÀ µx"¨ ¥Ua×&ç^q³ÃÕÑ:4!;›î.éåMÉ5¶ÆûYp‘‡å|+N@œ½[ãÝÿ)ú˜„Tå@›:>É|<¾Ct"D•°½aEÞS±¹”œ©± }là7<²e¸&Ÿt‘?fô•æÍ»±Ã"?õ·Â+@4É—¨’ÿK‘ˆÌ¥ŸP…Sk«x§:Gÿ,ÌNe• nL{¤Þ £Š{Þ(Ø©ùþÌðø.Ý¢º¶ÄÍç'x¨Â’&YÅÏ ÚÕxñ $¿ZgDÞª‰pò¢xìW¤vä„mžò¥áI'Þ^¶Ò{|õ&júCÖÚÃoÓ¨ ¢ùŠ\’lrdÕ}MÞž1*àžÎfo ÝŽû~äxÊPúÕ%Û)ÚøÆ #@º”Ý·ŽïóœOùràëX†“}‘ç:R û±g7YÇ…õÒ¼Ô¥¬HºP›§Hƒ—_‡•?DO”ÂMrHÂÖ ùŠ›¹¥Ç—6ôp¦&WqÄf¨±ÙÇì‘Û*^_<nb2ÙâÊóLÈKDO, ×TîA¯ÂÑÃe,Jbß*[;î‡å\—(Úoö±üHüm»`ÛŠz_>²,Ô'1Ë–V Z`b&Ê×JC$"zn+¼SÂÍgö .»ôfõJŸ™®×ërÓõ©{>ŸrMS/1®ÑÒ,RÄË=ã?¬v¡pyñÇØm݉샹Æè3ŠóÉEËM SRÈÎá¿Åå©ÏN¥c,?Šdû@›Ö pŠð®ïÿh¾š]-ËŽ“WoˆÊöC• Ö X÷:uÀÙS¯N$ë¼Ða…!±Æ+óÚå9÷䢃&ãœðÙð$‹ºJ¯.Lhç*Ó´S uس/° Ù2˜€ò”Â[Þ°OS"+£¼Pû×aØ™þ—jsºZèº#Q•ngY9½t× Àd±Ê¾ˆt,îårP=³Þi‰Ïåíc7·ZÄ´®ßV)(.þ¸NxþÄæsi¹šŒÝ¡.ÍÒ6Òïê>aݦ¿¢Ã®öï7ßBŽ`Àr:îžD'¿Ë”EÞ&w}a‘.D'%³û/ÇêK_¥)orHå"<¨l¿5î0Åú0‚_½id9U&‚t¸>›õ‚ší àÒ#>óT'Ÿ/+ÂT— µîiªøãgL²hš¢0+‰B4'zÙÕ ú§T†Ñ±3s-›aÌéGb9¼=q¡¤±…àõ›và‹|¸VMìîØK Ä`IÓo!<&.6dîQp8WµÃ“ôGa Þ¦„:/[úÎ$«àzt÷+ôâüÏ«ÔÿWŸ”a´I1VÔÖz aš%›¬Î±”Q8ÿt½°F…h«¦¯Q)µ²ÄT°›¤8{ ¶6¢»Çótï÷ŠBøÔuFZ«¹¦ LºŠØK¿fx ³8Q±CeJ38sÂÝ£úYqزPI®â4îԚ×hgáy<ÑTàz ÇSÛYj?щqYùÞ4 7XCØ’&MFœTcȼ=ÏÖLy¿Zq yï~ 2f‰·Žbá jº _ùÌM0—st–<Ú`ò8Ò‰ª†ïGÜ0‘’˜ÿP”Ç.™ØžA?)KS­ˆlïXn￘´õ‡þŸ¸ÑmÕ•ò3ÍÒ‰mZ‹Õ˰ý‰¡Eºe¥3qS[±A”Mz›½-í†ñ;«íöA"ŸªÇ¡¼ÓΣ£! ŠNýeÃ-·õqH™T½ÁR Xy¸-wk+;?' Y„"…„˜®Ý$jˆÄ* ÛYúšêqðq¸¬]ßTà8³Ò<†­ˆ§R`§V7tºJ£BÙ²T[Ø¡¸,jþKÍvý33¹zxI|¿}øÙ¥Óó쟧ÚF$²¢$”Ƽz"W íÀëÕ¤‡P!o¾)5»ð –·À `ós?1ÿ_'Ìè: äcŠ;ŸlwBšçÃaY˜é"­ˆ l9ù …@]$T‡?Ϋ¼”…ei#«:í, ˜]øZ^£í·× c‘Jù¸—ÁX-_%e®ÚñËë™ 5Ÿ¨K$y•‡šíR´àÁ8ï"­^è !­âþÌúŸƒÂ§„ûÞt3°¹‚*D=ãlÔ£8i qÀ"ÿO³5¬fÎ À°éÌL­:7 X ­NÀ»CyÕ+yì Ji~:¨Hõ8áÆ2Åž¥Éº×`U=2WT¡|Ñ/9ŽsRæ~ɘ]àweä[¸Z¬ ›Ð6𛺤…ð¿¸ÀÉs‰š2Üh¿éñ­ëcH()þ£·{e*ã.s^ØÕ‚ï³5ˆ®5@š™@rÊÐö³L8sjg>¿Û»ç>¹4OF]ž°Ùß-C¬U êJhhÃ"»ýSdËÈÓ‰š%ÑÀ™vö©jhºhv{´…RßšøF^'Z€yÚ G}Êäˆ[yXJCbÄ0=cc•€ÞB7¢ëtY¦ÆƒèÑ'õHÉÜ•ýõ®Ÿ¼¢{G—ãŽo•w—76á×çD}æÙDw †u(ËîÖhâ;Ör´ßwM?q£ß‡Q£ÞNæ™)a)‡ MéØY}}A½& GIúªY–[“Š›vôRü“<»j--ê”±aâU™tˆ_O0{«ê¨›íÔÆÚ¼./Y!mëj'àYNY4[ßîNö‚l*Iä¸ ó} ¬1mgñûƒ_±vÏ>+Ñ{ÛéÒà¾hGäs?¨±,ÎŽ(W…>è]"%Ì‘‰54‘}œË‚Ù¥»d,Y7‡3œüH×óŠxÿ7O›ìz2,qñS.çH4¿7$xÏÓ%g?‚8D>nÖ¼Áцal’ÇAæÆù éÙÜŸ–ž‚cb½Aráqï% ³So•ŲËmPXßy…v2)áôlÀ€']+ÿ)ó™¥Ïsü{ÂU) )Š»ÄìmEë&uîëjÀÌC§Uù©4-è ~ÜèÕ >¾ÿ"|¤vÉÊÏho'%j*Rÿ*1ÇcQ0iÍ%<óŸÛ– ‘$¾*è›faˆz=ÿIP˜¼}cŒiž©¯c*bç/¿O ôÃÑ¡öZ›õõÑFGňޣrÀ­¶öy»CÈe· QL* Ptœ iÏúb7‡ä°u#Níó¤Úòda“/š<Áá•«“9M¬<g+„2ÿ\KVpiXÆþ"Þ¬÷Ö88׃}<»Ó(`]©ïÕ‰˜‹”p«ðPƒPXMTUšÿCŒeÒ¬Tuð±øŸ~ccngéj['z•ev }bïu'éó½0s¸‚|Q’Í×]c-olÃY"‚…Å]|¸|l=\Ù…ŒZ긂T€¢w’ŽÀ²[rx ˆ&Þ]¬ØÛ®$Ë (é0Uër®‹A¾EôXC¤•gEH?é°˜½û\~òÌ83ε·³3ÙyC>¹^ï$”mä—ªJK»zDi¯T¢nM˜mÆ3«ØsTÕ<¸œ¶¿IM¦ 3dφºdÛJqIOy3äêó_ù5«ŠM´ ëSs8Ë,v1‚¯Ü{ŽÙÊ4·rvò‰|q?ËžâËáB‰À—QîFQæ¯3þz‰º!ÖS‹5¬Ü7Ì]4s’•(ÔnF³¬Wíaký’væŽV#‘Á-÷Øc&²:€Ká ½‹ô91- ºE:ã"|Ibp û¢ š6PLL̯çUYMýß• \âV ϤÓ±j"]s½ß;iöª…¶Î z®¡£zv{0üx®ãHPt¼ˆÃùÍ_ÑA=Fâ‡;æ© ¾E<í}."Ó¡fä«ù9ÎçiêCdKMT:Žpj[3}Yâçå ô;–\1ßb5%Þ´®Ã'Яšd¶Ó;Pú|!ÜM̘ýØ v‹‰ˆ±«=ßc\»øF"çÐyÕ÷OÊFwÍ޳Žåò ÁÀŸñÓ»5\‚WÄuë{â ·X¡£ï~•Öå#ÃÚ˜1Ö‰±ƒ| ÉZ}VB¥ªfpNêÚ]zN±É0'gJsxlÉÇb>*º., kbÏâA(þ) š»Ió¹¿ëœ[ÚÔïPèAí ÍЮ+Åsì.8Г׮ÂãÉEÖŠÿy4:TU+šñ“½¶#©ÉÇj¼‹Tû¨ñ˜6õAÛc £^¸QrÀv¶øcÇ*³UçL °+äÌxÈeÈ$ŸÏkàFûXâŒj¯eWº—'T+‹]°„õIîÒD,À»à¤ú÷Oµ‹]  ¯Í`X›¶)~ÆŸ|ðå÷Þ¸òZ¢PVÇiU|X¯¿_"Å8›4²ÈójTi#œKÕÆp§ŽBÆç! KÎ/£èÁ%•~( 꽃:Üɇô+{Y­ÂŽ˜Ž-BD±+™l®!.Ó¼W¶bS­Qˆ˜ï Þž!¿¡Îål^d\Ñé[ `. q)9c¬ÉÚ­êí·ôdbô¬ìœlü Öñøë?öìfmò^…8=“¶„µ«™âÉæ‚©€ŸðÙƒêÈ@Yüms ß.©g¾(‰ðka“ ï0Dƃ;ET`÷î£8V-‰¤PzYDÑ•Ž„:é¤üg™CÑÛ—ô;h @”q²Ñ÷nàÙl¥¤ }ÁÊÊ_ÛÏmXçA*¶ÒÞhc §t ž› i]踴Hý´øK ˆý†bšËiA—fhÂÁÆ2Íj·Ã¶h3ÿ?¿ª’ÞÙfÌ…MS'R)ç«_,I„38C7ÙDà^X{t‹RÇÖS1Âæu¹‚JwF.4~ÀA¸Oi̶–o ¤œ É–4ýå°ÝD®V3ÎJoñBç´ÉÈ{-Ñ–€§c?ȱ9÷Wßbˆ£ÂcYŘvßäïfäGÄÔ+JÔzËžî>G›kMmT`&x‰5J]KÐÁÖ+J\{_C‰X6Ë$KíÎÔ¬\'øž÷[x†X½rÚ_Ûß‚%,ãÕ]såFaVÉ»C4øh4E$ü`sv†‰#ÕĖ΃{«ˆ]yØ Éñç>t¥ÔÉ:êŇ5Ü 8QhÏ–6*1ÿ@7Úà#ßÀ-N‚Ž‚òÇD ”­¦ìÞ×ÞÓØvG“ÀI†Ä ¦ÕBJøÁËë9é*èã`)Ѳg ašt.bØèÚu6ÚÖ…,dÕ .x`¬7:bi\P Èçb7I]axƆgÍÈ +Dc}›:&I­SfÏÐ!‘‚;™o‹ñ<š–ÂÆùõzu¥u³h4¨1¡×¸4óú†+™’/,Ðð×CNrƒ”na¼¤¦)²9·Ëš:f4`¹}aÅ_ÜCJŠ*Iexï: ™„˜ÉñÅíÀtëœÃÁ †xË¡ÂEçÉ÷$çƒZÓ®³@ã Ä:þœîpòz¦â1{ë+èGgO`Œ?Ϲ¹Sg1ˆÀeЍ6ù‘â ë/¤.ÿ {Ž[3 Ã6f{é8õU:ÿw˜éÔüûÄUcBÒÂÑÝ/>Õ(ÑbV¶Ìn纰@€R,Ĩ•ó]!E“Œmºï%†6Š1 «”:Áfc/mÚ ø¨"3òGÆÁ$¬QP3É™ãCæõ¾$ÚwÓZaýôð'&6£ì¤V2ë:KJÒrè$®Q:“©˜sŒÛ];0¬ Òbµy9d ºã6ë_F ªoCuEÏ©»¼ýaŽ\˜iÚô dìýê:QÞepÇ'‹û1uÄ?–ÑS¦ßŸ¯œf÷¼±S5(‰Å2ë]º/A—AVѰMÍ!µj&tiýQçŠÒžïðÌÓâŽKj6¨ì¾çûëcê=3u­pG{ÒI”¿‡D.Œ÷AþjñÛ4¡ªÆðaxcT”Eé’@Ši]R:€Pâݶº´Åí ¼±L 8“¥z³`Ï\>.4Èßi„âÙCNÜÙz[=˜ˆüæ_ºE±þnÓ0|U>XI¼,C–I›X©—(x³þÝ”;ó{¼´ÇT<2gßwVŽkö2t ‡Åy @ûžûš®(VÏÙÚœ€€ó}º}º¿n®~ÐßáµÛÓ‡íè×öè&ýºûz±ß·¡Û|~Ú—öëíÑ¿ÚÕÇöÚÿ[®?í×ióýº¯ûzªý½ þÝÿ7LogŸíéSöègí«?n´~Ý}ýª\?¶ðýº“þÝcŸ8ïÛ°Ÿ·¦Û¼¿¶ôÿ7K?oT¿íèköÝ_¶Œýºk}WÇíVãMZn÷9³º|hDiG¼Þ€¶‘º¥´8J¯*\Õ¿÷Ê_2ÑúeZù”Å{–o|“ ´Ö¢ºÒÌýWkOy¼n›¨%lPJŒ‘I8$µ¦Ü^¯a¼XbëÅÚäýºøø¼a2^»[Lª )7ÝQkÐ~+¥/¸?‚Bî)ü ÃÖ÷[=ÙjSÌ~y¡Ðòf«§‚÷(¤îº’)…±ÌÍV¦ÑE‹GJsß.ð-Šº·‰B'@φΩê:ð-ŽóŸZ‚Mþ qd-Jîä£é*]Éš×B=ä€FÔ>ÄÓ¼›@&° XvxEjPL¯< M7­-„fFëñ (ÉHüRQÛ`wßþ©LøER¹dˆ$´–R6¶f‰L´xƒ ×%ä%¢+yjGŒ¹Ô ÈIì)õÜ­ò:¼!WºrK`¿øi4žòçNhóÜóÿ{Âp^—o†S*¨SŠÙ‚¡ýÚ'rù!ò‘õܪ»;ªÎ̵O.ý?Tg£Š­Ò¢m ‘›ž¨GCÊ5om#¦‰II¢<:DË(È»¾-ÝŸO‘¹žSb†CÙ|Û$·÷±‘Æ8L^GÑ h¹Ñ+‰ño^û@‡1yÆÞÃ|Úé#eüW`•aò#Ô½šà hXGvK+?\ñ¥(GƘÁÖ&Û/V7Œë#WFö#a"bÓ1 Á«ìcÚUO³·S×îÜc†-ï¸ïÚ†9¬Ä§YÎéF…ªµx+¢ëÏÀä Ç–ü[XQ^Í)‘-!ÇðU¹CQÚõÜ0äleÃLC‡3?›ÑQ•p?Ù Øœ/+î4I“Gó4Àq0d—g¢|v¾'TíÞ¡žŽêÛÍ‹ ê±H¸ìšÈ€½ÁW©Ð4Öªå$ì׃ÃiƒËƒ¤rþ¼øeèõö·ýòM –Ô§Â*†ÓXÌC$Ã¥ì”ÊŒuÁ!4ór°€m¦ï BV¸4”¬›8¶Á«õ+©&jeŠ×ƒÁ9J-xTWK΂< xz]ŒôvSZÿ€?ª‰ÖMB~½rîŽPYÊr¥)½·‹™/¨í‚3¤@k"B&ˆt ²(Ž#ÛÏ–òVàÅð´«| i S±ìmëLˆ*_KîÃ_~+Õ·ë1®©¿mÍÏ,O€ønÆVÇž¼ØülÎy„ØásHøîd…µ©Š×»!ÎØ…ˆa"…|wú5 F ŠvžAÍEIQ’Gfö•ig‹E9]Öò&c ÜWæD†´:ølš ?Ùp{=‹š4Êú¸¢¦s¼«Ìýñöp!#¿•fµÝá6+TSyÎǽÓî (_B_mmj|òH¯)D7ÌäÁxpáÃ)Î>¡Ñé娞âcé+ Oï¶ „ê&®»@Ñ×"¢-”Ý~#`zHy™M=\nh7Á^ç?@²/j@c>)õ>Yo}tû"Õµ™9F¸YÁXUl°ó€ŒõðíËP6¿jª&Èêz™ß²…0Ñ! 'Ÿì~Ûcþ‰…{ Šë×%õ¬„Pæ\a÷Ñô &bª{x=–Ίgœ³¬<¦‰ƒk›a ¹¸™±¡(€âŒ=µd`R“S&" Á\¸£A"À‘Ü™GfÕåâ7óEE5ekcHkÇ~;8â‡d¹òð<¹u(Rìdt™OŠÌ~^ÿ”ïVƒû1e_ÓW'¦õz+`¶v¾}µÁJÕÞ'ü°%™çöˈáó‡€ÂêÃÄÕsêdZϦø=òz°¸]+î…ß•¹¹æ$*¾ÆDêï‚åKo5&~Fª8Å3×@–Ï8=pÄîw+Á‘¬v|ÊÞ.à•x(¢¡‰‘Êì$ šÅÿ/sÌ©†|:ZÎY&š.Ÿ—§Þ¼îžQKóÎke 3wco?yé›sbLý\>ÆÑ²ÿhß³<§²Ø«ª/¥Æ¨rs±µ7Ê¢ L%+„ÛXã&s:Ê" p;¨JÕ­uMÊur"ºP4T´4÷“(üœPÒ'BEžîuF˜7ÎÖù-wgi¥& Ý[Ïr¦]­V££ØÞ°òúH=c¤¾÷ÃØ¢vô_Š ŸÆSêh¹(˵Ë}T~Q X’ˆ«/wï)^G£Ö* skJ£ßM‹zrYiT&þSzKÖ ¢1çÆ9©Æ ³Ô õ ?v"?d:ñckŠÚ!Ž‚yÀÛêfÛÑšsõ¹¬ò‚É?‚Îz@óÕ£i 1êFããk°G*ÁÕûì>ˆeÉŸs.ä,–íJ\‰ŽÊç½–³(êQ7Û8ý¥JÛ&ù]2uð}VI@4°I£"„ì‰mž´ñÕgºRšOP\à~ï(·9å•«Èâ6x”Ž©’ò±åËaËì£[Ê&(ëÍk†ðö•àü r,\ufÐüR×ûªEGD¥¤­Äo}£kÖLÚkúuL²þ¢%<£€øö ¡ش:ÚŒKó4î%ÊÕ(¯Y, ~“›q´ö9)ý½vÐV”4|i=UEÁ|1C'ÓëëÓWùd-(ÛlÜði×¢v|}…(âðD‡FwÚ=„ñ(1’pÐRʤ·[(Ê:öäA}pÇj½;Ê0´€˜›w‹%Ýç­/ÕµFe³† s$ÿb:üÄ[‰cÞ›èÅëY…9-L߯öûq!çø3¯øq‚?™t²l/“Ï] þEx›„…ÑÑZñC`“¼§uÆ£D2° 7Èâ½'Û8L5ÏÈÞìëÍ7FoL’?LŽ~Ûe¦t0ø¬öÅLòÞlÝø5;–'‚®„CXißV¹ô^¯Y›Ee©º“ù* Ò!ɲF¹ê†çæ—?.¨lÝnå «ÒU7Œ¨œ'åR¥6£ÍHþhß©—¹¨7Ã~!{o5Byx¬::ÌÉÿYîæ˜“Œ8Tûø^²r´ÞØîWÝ/P>­ÏREÁâi‚f»ó¼¬M5Jî|hçßX¨j×:J³%¥š„vó*©pF.CE¶H/ÇÇ ¿$Ýù³žhØIx}q•€íôV‹lã+»grWÙˆÁÁ[¢#Éqe¥¤ë‚Y¼e´¬•C}ñO>:ï>t lþŒÚŒÂ¨õª2µpnÇÒPlT¶úDÞ¹Èà¬Gy›Ä® ^ÄR—ÕvOÁ‰öiÚ|°ŒÍŸ¨ŽÄn:”£Bm­e‹Ô'¶Ãh[l<=nÄ‘i+G™…ýqVa…tI:–°2©¨P SjÍ_Q *- %§ã—&A*G×÷ôóéá›è—š‚ÄÁž+ü‹ˆÆ }Ï´Åc‡°~ä þ¬ÚÒ:.y˜ Ç® ‹lÙHkl]nå $XüønËäÍðñ†sñ¸fó;ûtµDéÈy äÿr´´MXÑh3‡§[ÓôR™P¹“B2> k¤¡‹æ0°^¤°ä®„ÕJÙáòg`Å£°¯Jp»I>­Ò2n Œ_¿¥î³ì?Ðâ9€y2–ø ÿ/ù†“ÿ6ÔZZ_ŠÈ<Ȱx°fœîŒûÚê„ÝÀ. ç¹÷êlH@M÷¹uhSîŽÔdW#ðd%”%—°GC%•q“÷9ÎÐú±,%Ì–ú#XÜÁ3ßÞ27Ajcˆ–ž³{`7 ¶$°¾Ò@´ÏuÒ»8w-Øe^&a%I aw÷9ìžš'W CO7· ”•=œƒÁÕÄD<ÊÔéˆá˜æ{تÇa0ð~=>ï¹Êì6T¾ø·tü|o#žf‚Á$å¤öýüŸ:¾VìÚ¤ˆ¯‰v–/ûÎý.Ó+ìÎ'¿ùY -v¥;ž–™MJ…Å1`s}"Iyv;Ë2jF¥ÊA#à“nîW£•›æJiìç©¢œ+úZÉ®ì^èB0Œ€‘˺¦õ*uÓÛ@žøØDù€ÕbÒƒJR¬gRÔa‚òϹló}WÚ°I(ØSã uŒŠ  £Â*á†HGWÔYÿWr r½+91d“"¶cHF`L¢¤°éúdX©–•²ÿC£ö÷_[D¸è >~7 x½S°Ovâ;„Ò °©Ü·æÈ{©]9áØ6W;öŸì19 b¹¯­úU7 ÇäÏe_n_ciÑ,ZÉnp=TwÏ›z ˆæàÅôæFëÉK·l°¬_°¤ÆLЉ òò¾“q`’¹î0‚H­¹±ÿDr0ïôúøX[Õž¥§DVMôºm±,Aö¬/º³Úù–'œjKk½M,£+'Æ¥eߪºðHȆi°æn N Ü¿±üJ„qûÑþBÕˆ.¨Û锨C 7µæŒ/5¢K´U>ÛýÍËÉ>mX玹-SÐ3³æÊnÍ—‚ò¡°[hx«ÒÇPäÉ2ŒNë56_׬A²”Ï'êÉ{YguX6à7aeS-µÄÉÓ3™©˜ 4á+hD¶êÄ¡’H¸]\©a…¼ˆ&¾î4ÍËi,Tlˆ8Êòq$C™üÌ{ãyæUas%žf—4»Lu‡¾•Î Ê ²°s›{ir=O:tï\2ËWq"« Ãq$‡K>ñ®ØÊ*Єö~³2è{‹–¥/]‚4t­£ r»«Íç;\ÎJŸÙÐ ìñÂÿ5£,¶Ilý°†È/=VŒ©Š¸sð|Y©» ½· 2Ô÷Y[ (GØu§]“?a;«|I\tß ÎêÒ÷¡´ËšUö×\¢jEöXüºñ³zÃÅa8I¥öÊKÍpáÞ `dÚ7áÿ§4‘©Î0T L¸†øw H›»PÖéE>$ðàÌW1©é±ë›†í9 E£ûMˆ² ‰)ʲ—s§lŒù·Dº¶­)/‘]yÕ²¦ò?ø—Ä4¶òßYt³@éöH&(\`΄?*½L ·) À3û7cÆ7PÔ½ ÍvÌ…´FƒK禈š/Ù¬¨H”LËì¬îÕh·¯¼9ùßÈ!piÔá¼+3xIªvè“…’ ÙlCø"•}\T–_µèîgqÑîpæ'6Ü(ªêÊÆ?_²l㎌¸`×î•Z1§A¾»ðæ?%[èVl?ƒ`­Âb:(˜;§j9<¬:Ž<3 ú=bœ-~“qùÃ*XÔ– /ê]:ùJ4€¤¸¨|:“$H9ˆ'i’¸/§ dƒ/Í9a™ñ¡·i* î^·.û`–SÏ510å¤çä8gH5ÓúfÉÂn½?0÷s'J†„tÏæ{öy“ AF&úuñ6²àÑ#³OÐRãÖÎGd/¶\ÍÑÂÆ»ŒœÇ¹ø)~‹2 x×”µO\ª„l‹'uÉlþàª-dùøèb¦Ž*é¶ßCU@@žr6ùÜ¿¾ZÐbÕu¼\¢ŽÛ¶™{»PoŠãÓJA›œO åg&q‘­vvìÀAk(a…›Q…zéÓï:ã bÍâÒCþXc¼XÏ44†(V‰÷}¢0øS`M¨É á` |9àçšÉ;ÀÌQY°ÀzU(‘¥LX:àGëùA ¶…h´»y”kLÕà²ÔÖä;/__J`R¾y4 œUÏÊ}êI.6—ÿbž\#TXm"Ö0ZqˆEP©ZšiІ`8è5x9Tí ºÔ1SˆpIH"ÿ|ºe¶çäÝÅëg\±q£—³×oÀD-qL%­çNÏ´ß;’ùÀ¥ÆÍõK |)Ï“­åæØ5ûkŒG’õ±O(–§rU+¹ø.Ã]»¾3Vfp溮øk(GRùôOšeâ`" ·D5#Ë °v¦ (w=÷Bþý¸ÀA°']!ú¿Å°í‡€úAõÉœ&âÜ/úŠø!û«:„­OÜs”Qd÷}t½D/T3§:¸¨øtW3)ڥѣµþÓbÚS5éIMþÑ·=äÆ}¹7qbeHÈ{=R_Ÿ)®<Áá=²fƒ²‹´%ü_.W˜!Tˆ‡• ƪO+Åøÿ=}ù, ÌÌ|Zh?C=L׳cFžâÿu=`üý5t·"5 •)¯1êxÔ´snÁ½tD[/ 4"°$åp÷Àkߘÿ$swÑÖMFM¬˜uBb¦m΂,àNÆÔ :÷ôÑþîYý³0ÍáPFúLóø6©Þº¨RDkèâþ¼:â¶Ö‡ÏÞ€©+Œnßá”ZÕªmÏUÇÿ<>í‚CÛž債®+ ­¦Ò¦)óŽÁ&qè}6ãÊ¡ L’yfPï…<õp†å˜MyWP(5„!›à»")­È Ne7wˆ„‘Ó{ðr§w¾lÂÄ\¢¢'¨¦·`0]Ô²'Ùëdtvå’é\Ðbç¤ßŽ‚=Tb`¡FY&ÇþŠSªëTç}ƒ_cZIb­È’"MÁ–imkÇADùÔ }_Þf=MK©A%-vÎs®yäW„7 |§ô^ß}€~ùˆ_*6⇬oêϸ Y !9)^å¨1Ñ*“=EËö@¶0Ò9–X_à ¹ìçµx1_º¸r¨ M knpÞAT õHÿ òØf.Z-ëÈÀBtêîcé;AåA­Ýh-6*BfÁeŠSÊl?$_sOjDT™0·]vŽ—RT!jG]`O&’|%:g-l=;¯‰Zµ§Ã/?2Åý%WÇá ¯ò3Óf¢é§éô·v…1¦kk/9GŸ›¬ ÀS#=b¨ç×ð$ò}ïL±Ip!Ç Î ú>R¯1„ ¡ £vœ3UÉ‚ß̆½§ïÇ0vVw$Ø—I¦«ÿKô‰p„yWêäi%p®Ëˆ9•a~ `•bçÄO®é@a…Ç70&øq¶Ë+ŽVãx–$g_D‚*w†\ÝnoÃ4=Yz˜c©sŸ¹±AŽ L³ð6ü±Ÿ¯ã‚Øq%D¾{ø™¢9ï°Ù|IO´xsÙ§sNŠÅu^-q)]õ·ÕsÏàÇ(G®ãZü¶ À®ç‚¤mj©¹0ì)p&gGæÐkz{0T–koÁW@úU‹PX×ñ¥·U"„KâeëÉ!ˆ…Ý|ážÚCy>Ã2¨½½š5÷æ’ý‹,³ó‡LþXß}µ„#– GÅÙ}ïº Õ Rdˆ1_Ý}È;‚Öºšâ³ý°*o¨' Ó0èŠk5—-)Á¯"à?tDžJm:Ü&èD=œŒd­†Œ™'Ë»$f™8ï'µ >=zäèrÛ¦Ë v]*ƒf£¸ áuoø‘kú„v‚0Ê{VqGJl‘PÂ,%æTºMQª@ù4Û×cèd—ã£P™³ýCuÿôw¾§Õ’ÞÕTS¡Á äõ!Oã+ƾ‡ ñÃKzO“Pð'o“7ËiVÀ™áº6v¨Ù¯(窵•æK #-þ¡¨«ÍÉñ’ai§NZ‰ZsÂ-°ˆIíÌËÀ/]XypZïA#òû ûk’ VZ'voÏc H%à(çÂ\ˆyØô¢?Ëz` z£Å8êúD¶i€Í9h°!¥“¢:â‡é¸ûÔäèÞ8ßR[UYX2¿YÛIïr²ÎSÝl‡Wü+¢OK”Rî䦭¼!>…tcGdpÉ`Ììç(À¶àÔÏWAP¤`"2L9±šaà:LBﶺâ8à6)ÅÆShzÙ¶Ø Ó W€ûzÝŸ‡Óh ‡}êáÕv¶‚.c³¸¦gŸd [•ŒmZm&C[Î}©¹¥­°‚É'øgäOZ¨SB ùŒPý$gs§r¢ 7ŒTùrÝË¿WD. « s€óâüœ¥!Þ*1¢o‰êj×fë¹›JÄà»3ëH±|pÓ­:ŠÊŽtâÆX-±È4ƒˆ´¸‹Ëuz5=ïk¢Ë3 ÜÙòPîñc¡æÌT )ïüPàZ¦¬â[¶èÁš$…¥¨Yžå +Gß Öûj_wƒ±³gFŠa’ §6@%¥€Ã/WßxyUÇÉäï÷¬¬{ÿ[=Œ‹::Î?­doP  l>õò•¯½ÜOž'ü€’M|\3èàUC–ÛuF‘¢“vŽÒôʯ t÷Ð9ÿM¨°Òtù5ÁE xkþÜ!ž!jô¢—hÑ8YF=\ ½»÷ž½›Á 0ˆæ:›o¸ âlŽ&üXx†uò‰<$L@t›JÛ/({ÕöM¬èlG 6µÇqkÅñ3ÄÄÄF#YÅŠ»•2ÖDÞÿƒ ð˜CÁõûº.Óœ˜?Zqg ºmÕ ¦†îYyÿp¹r¡è nd(ƒ³Ò¥$°–è‡Ì´@n£(­/ÛÚNÐä Nã=–‚A‰°¼mÿ)@|Õ¦òÚ%Ï{jèHÇóÚ!`EÚ¸ Èñ\ӬȃþÁV…AV¿[C$Vƒ34L–Îp‚jÒHF^¨L2 æÀåò°ù¹ò¬•»B_à ülW!ÂBßþ&àÀLðßieC9Ôþž,æß3KJ;Þ¢ˆÉ4†!ž÷7[ã3“µÔ5Kÿ„…‡Ï#Ĩ®†Œ•0F%’¹cðŠø*U>w!önûØ—âNKû1‘œêUŠE%¬ÒÔt¨v|ãõU°HÊŽ­æ0=T4LX¤—¿ªWb7 iYö:^¬hDz8i>Â0=åC¤ƒ¸FRˈOXÚ!üÈÊ,´¢+GéÓÆ1z¥^_¶2N›žæ%RI)L\”yÃjt=–¥ r }ó½ÖÀ’6-ž¾j§{@œxèé©7oTÕyD=¥I|·µÿX' ƒ³çÇÖ•s½ž5ŸØ}žHcãÈx}›ùËnEÍ¥lï{²ÍcëÉædb+CŒŽŠ/–zGgr­”Å/ˆý»:iãH € UÈö8}d  §LáÔÚXŸÿ].)œUzå q'Á)4«Ö§Qš„ lÙÓ››¶N˜DðTL“ë*Í8Ü(³¤E'MOÏÔ ‘]Õ žR%Z´fŒ»÷f9Þ(ÖÄ”>!ÂújïE¥-'*EÇô÷œ{´ÕbΚ‚¼Dkî V`l“§_wï(|éžfh“èÆÌ§<Ÿt}°ìéÏžž¤-uaºé)MÓ¤þ=€šÒiˆøç‰Šj×úuôuñ“² ¦P­«óÅ‚•:…`t ÒˆìNq@~ïvB÷|䄤û‰ø ãT ?›Ä_˜Fqâà,Ž^‡ÑPî·ÊæskÓA{S “´JÌQ¨p‹™¨8Êg©*TTƧ¯„¯(„¤ÐKMÁ’>Ò0‰ùœ®h#€˜Ÿø%ol+f]6v˜Õç'7ˆª=é¬<.Ç¥ò­ÐZÁüÛ ïPN‹xÄ£­ì£™PÅ=>Q9ô\ÒxZ¦óÄz€“ïp«&fñ/'‡Ÿ¯ö»eh`êx½#˜?:R_Lßr]Ç*(ái: b¥QžZ„òÂêÖþí]´eåó,î“ _)|õTYòeQYÑ`–¦ ”_ZħñKS!1,:ýL¶IÄNÞz#ÖŠ3ùkÁ¬O:à0ôò“0ûªÂKÑSÌ«»›O~ºX/Žª|… ¬&Â/H28—ƒDEqü² ç$täÃûªDõk90ãÁÔF&#ALHÛIޤó{}`¿ ÉôKܳuƒaÀͬ§7Ð|Ãn‡#;òº±ÿXìyX`h£äª,'×âÁôñì"¾Äm÷½Œæž#"ШKþ™3e, %þn’¡©âPtV¼c9çòŒ>šàjÝé©å¡D¶­[SËÙÔÁiõZÿsP¹Žj fÒMó­°Ž©Z‡$´Èñ™0½[ëaÀÑ9Ú„6GEä32–¨š<ÀãU’ö{•n ªúæÄdjš½Â @‘e¼é&|bõIXW8’fÍLˆêý]¯ûبõzÀH M@Üv™VhG‹|uêïßo­+º·IEÎVÁµo-óîaY´àL(÷(ó©Úc’#‰Ùöj$ûšÖ98KjQê¢dbÐ1µ&d«ö9þNÓ¾µV¥ý”CW;Bá\¥MN@ÈŸ¡‹“äDz|‘`9ÿÿ~š²æñ5[cÊRr¬œvysT+ÍN¬.î ë0 {³ŒÕåÖ½o†鎽ã1CÇ(¥Nˆ3”ìLšò»<”ò ߆¡DqþgC¾iëÊî=¨f§2Ã]ï¦dª?ïíûà§Ï7W¡#wKáK²Î¯v³R‘"¬$GmGØ7·‹§¯ÞËÿoÕ '¼c„jŠ%ñ¶ä1 Ò¹kÇ,œ°­ç¹¬Š!iÔƒN/ÌÃÙ°*.%ÿj46;Úìòè=cÑA$Ê Ç0S4R¶À9&ëǬûs ŸoÐqF4ª;4¡×ø³…6Oü5ÕÍSdîêÛ¨¢Â”Õcdæ´›”¦ ì«NKºY•ÿh÷»¶˜ç}5®”°^0½ÊžØÇÁ§!/2Q ¸í€c]³–9¥ý…7¹­Ç6I74†*œóß²eõ´XRÿ’ï÷âøï°Àªgo¯ã}R›÷~…o<ºê@ºN¢#jÙY9gà,âð ¼xsµË¯ã;€ûýÍ;eaw[ÃÄÞÄÔn\ãWiîµ/tpõÚ"9@RÁRýµYÿú³9¨HV•F±EM¢)XXoå&ã‚3>×I z|þ¡x®<ÅøX¢tûîüŽÊíLaZÃX/åokxŸóð­ÿwè˱çßurëÕÇX,œ’ÃE:¢d á÷(}ÍéÔà H+I$’I$’I$’I$’I$’I$“7:õÇI£Ý*½ËXY¢8TU } ×FIeÏKÁÙ™ ‡R+ß‚`4ÒÉ…5݇¥ýc ˆ‘ÕV‘F;«Ì7"]Ìró›˜å^†W)󳻯N2ÝÑž¹–Óaû¨‚]¸£ßŽ…7²ÁY‰Ê÷W,@_kÐK£RÞí_$FO ËËÝ›YÔõžpù`4gW1Õ>oÏÏßQ|Ž=ÂAiÚ–s0m!ØS!¢1ÍÛ5b`ÖÆðƒP&í ŠlKùÝ5î©XH]:BëW¸Çã)”¿Âq:ìŽ B‹ v74BœQý{sê³ÁébH[>Ç(3ü¤=͵ Ön¡*«Ñ³k¡@mãxzó›Í.Â\{)©Ê£bÃGÂ4,?È;Õ\šngãûލÔ(m¡‡àØ‹òt ;üÌ{vŒj52÷Mu Ñým0YX­…¨­ »jôƒ3f@[kã-ûA¤£ðô^ÞyH¯å uCŠOO~×ã ün@¬Êc5òNˆÔ¼·Ç_9”‡l.©È*JåÛ LÒevÓ\Žò…’Úšíò/küêtV3kÒV«( ›ŸÑÒŽN‡Ã1A—D&x$D3}mÁä zòAà®A*8%°äÌšÐ9Õ`(HÍZ–‚”ÂÕB<¤³M<°uJGûýáCÕ5žo{Nâ‰Óið[ä‰/hÑȈîWÕI,A ‚¦ž9-úZäóx%“u§˜ ® åþGÃ*¤þØá°¶ ÅYúÒ¿-Já+‡sÓxcðèµ’ -ÓFÕ®…UðÂiãµh’®Š¬ëŒE޴ή­õ„kU0‡ƒ­Ârô6‚ëgF«×8ÓOŒðT§}:/ÄÁ¦…Â[Ÿ§u§Ñu˜Ug<ç´={¶àg´1Üg¹óÆ×é1åÉÐ\"rp»òƒY´jÓ*,Ø>¶×EìMÇe¤P)ø}WÕ]­t{Ã`ž‚K‰^%ä]Ÿ?Wø‹%Ëç/µ™R¾]t$^æè/V£^,š+ÇÌKh?}Ïrlž #•Q‹o^®Ë®ßÈL "FXR3Áøe*ÑÙ!4¼Ÿb­" Ð’b©Ý{’x¬ì)U¹ÎŸ—½Ê·ã[N¥,Õ?:À¡ëyøãüSÝ—yÖî Øj‰®r)w+®’§ îCxãh;ç--Á b;í:waî#ËNËÛ ÀÛVˆÊí$FoÑ_iKÎ@²õ.OM&b` 3üÌ`žW(„ÅÏœûwY8§Cð³ùÉ®-Jü“X‰ŽÉã \e’䆻ofç”lÄ21 ¸º®ë-h0Ö4&(ÉžíêHª)(KÚ·xPæ3–¸¤Yñ­í+Ø HB0UQ«¬øíW[ð€«×KoâfY#V‚£Dfsj|#–pNyÛ 8Àü¬Ni‡z“j‰†Ô`Úw––ÿ(‘  qäÈé¿J9U‚0ákúÿL=ˆé³§E_ö ØIý~~*U§† Tyé #øôÕÃÐc¤[®)m\©¯U 4 +ÄXih=¶®RPaòEVy2Žáñ£•ú|†£à„îÏÌ‚«µ0RëB4ÜÅÞL‘áüãP¥y˜¥/*x +&©œª’ jŸÑ‘f =JJòŽj‡C`öŒmM¬w·ÑLÆÀ¨w´quží§ž@":që3BOdaß–Q1èþ‰ ¤ †nIPJQ—¯öÜÛIeãÄ"—{²:k>E|à1ŒÜê!,­®£^bèÏ­$÷£ZÉx¯´qÞ¥+å®wƒzØîË-Î_~NŒÜ8aå,Ò­ûYI•8.ÖÓ&òðÞ4Ô§kmõ³ù ’m&ßýÓîŽ;ÝápÍüË|ÍkL[ÎNWr£Àÿ®¶T(ƺ°ºÉ­>r´ÅóL‡u-ÚéöÔ? ÙSEŸƒíÃÏdw­÷Z˜l†ÈßbÕŠB³ä.aºû¿Z½pt,võÕ‡¨w¾**V_Ã6xsÿs]ðË4‹ã ¾…¤ô¢n»C’éli+|j+XWÈá¾zÞbê(áK̲y’XíBwt,$A!K¢A†€ðÜñl˜ "vÁâ‡g‚äîÝ)åÎD1÷Ãñ»Íæ{î¾é#êÜXŽŸvTÓ·E´ç·wRíQìÆd0&î»ÕA²ebó¦çIƒºÔ2~ù×äì®°À]öŒ*æ¼›èOh†Àè& Tl[A °Uvc¥›ÍÈ jƒëjË¿Önibß[{ †¯È_·i7Ð8]ÁÿxãðÓ¿ûñéÊ®—>mžÃæúsDìÙÐ}Ýa'V‘ïdlà¿Úb~á™F^èâØÔâ«à\”£0J+6,– WÊ.ʉ/’¾ö~w‡–‚ÃE§ÆŸG l(ÿYq”µüÉÍ%Ðý-¬‘ìX@ºjÚ ± 't;+¬¼¥äà'AJx¾:5m…&âÙ¸§÷¨Ønæ«òTƒHéÎ(2¦¥d©KÐÃaRâ\Â5cÑ’‘œäÍd}Â^Ç`3З7Ždv7ZXX—Ò¯÷\F‘d S0}Ô¥ØH,˜ÚŸãxZâ™9dµ$÷xrã}¶Á¾¸Ò“\Í|Þåß¼2¿D:ÓBÄršqÆäù'§êåXÌ ÷îÍÔdc…ó¥W%füî1a6ñ.Î$2éôüY#ô7.¿¬RïNEƒt–, ï¸õ·¸Üz¯²:‰t⪾ß)r"N' ŽK‘#MK=ü3ARÛ€GT«¾@mÀŒ›ƒiÒhá'ŒëY´÷òó'ªQ:&‡ž×·“4…{uë)äÕ_бøò-’ñØ´e»³É+ë0'0àC_>gÄ-Âþþ»4-D‚¢BrŽUË@ŽénË“-‰¾í.z1徊eƒñí7¼#²™Ð#d`žP>ú¾Bj1Ú‡Q?,¥B…cÈ<<ðÏ ‡ []t'[ÔÎÂÆŒC¬˜D²yí(ˆFÛÕª¯p¡÷‘ÛÍÁËxvŠ ¥Rpÿ"$ïrp{øT¡½¨º‹àù$üBIîë¬4ß3g»'a=ÔÀ|êÛØyçÚX¨™ŠN†1^{¥~ ýà5zŸ/gáU¤NbC1‰œ ­¤»Åç®k…˜´^ ÝcɇÂ<{¹¶è¯#Y]¼hÎuÃÑ%j-º®âZ¨»¹ÜJŒ‘JÓ¯55ææ•¨¯ð"!LŠ7h“*_ï))?—1‘[a’ëb¶ˆï2dœíÍ 9?S3e½B˜Ç¯L"†??@A¹é;³ó‰(fõÑÄ2´ðXñ¡¼„öa|¡·‚8±ãN …%$áRvEp)‹=Í.uØõ£½Ø€ó¶Ëݲ©"?ç¾ÅVo2V9zÉrŠÉ9$®˜É#1™GIÆ_>á#•zm!?nJzHÀšh ße¢Á¢æ@wCЭ¡É ç µY½µñIf+?ø„7»É³h]¦S`›ƒè¿æwk !¦‘c; NèŸÐ.6Ϯҧl¤‰:™©¿ Çç|ò1QþÊPšÞ«8.A\Š´µlÐKV¤ƒ˜ö•îyÙWVãŸ'ŸžîN‰V§4â ¾öOp'&åký}#%¡M{KšƒH¼Â1Ú T¼ÙûŒÄ¿7ewÒOüËî—ñ! Ì¨›ðL_‡Y6}"‹Y#q%q\xLÌü»:2¬Hˆó*Ú瘥Y4™R´xZ~}v9M<ÏvΤtZšf¨¾†"L=’õÔpN@ï÷MJõ[ÕqÄÇ¥a^5¼œìã.i ÓØ‚£¾Ô}C@íø„þ(ñõÈ-’ŠêüLÆQ6¿«K%$·(’f~"¶H¾¯õÚÈÑ?ÿï{Ï4 ÆR?®*ÄÀ»Ž”¢²ï€·ÂG²ßã¨o®ìÞØ\Ùâ$5Ò¦Œ[ÓXÅ£åB¡4·FKX˜ÑPã1Tž¶>‡VG Å=5¢ÀåÂÚ§áŒ!•K²6{»b(Õ_Dz@à±À>øtwuœ’ïaG«ñ¾÷‘†.ødt“Ûåî ã_¤/Xïþƃ yá¤'ð‰õè;H0œËŒpÜU¼‚²|G€GÂÛ!7‹›G»KT(PQñX¡„ÕM5¥i l;"=·42쫼P(óÌ¢4ÍbÚ­2¦¯(|KVN ¬|Ëó&"ØwäÉ€°6ËL_}M¥=séxÆÒ°øtn„ƒÍ\ ¶`£·¾÷y‹AÃ+_zTB4Z~øîž Ô§(CJû%éiͳnQ|äõvÅGkÖ_¥Ã¼°n°g3þ#+|œêtØûàÔœB—?Ó–'IïÐÅÿ_ ’¬øÍ†Ì>Ú2‚QŸ ˆöí³ê°ð|¥X©‚†Ýiä…4‹4Ð lBISç²ò- 2 þ’,z‚Æ´&›^¦B¸%Ñk* ˆ—_H;iò]È0ÌDþVAMÑ`ª¹`¬×‰õy9ªŠªÐKVQ¡UpzЕ˹2>„ÉÝô;˻cR›Ã2é¾±‚ïU#7¡—›S¹eÉR×…ô±„o½û¨‰#í Ïé¹÷-UEm¦¬ú6¶Šøž©&ºš4´œwñk!bÓÅn 5Õ“­’d9NrÕÇ¤Úø·d´<_Î?¸mŒÕ¯rõyt§Èé Å÷sløÇ†Â´æyf5-|®=ñ€Bš'ìRЀ"Ô¼@»ÖdNëmbf<‘ç¿rÁ¾«öíʉ^ØÂ'r΀s¯¢²,@HÉÚ`\ UÊ¢eÖï+û‡Ñ_¬Ä*§8”?gnr*øêKæ³y*ÊFwšÆGx;LÐì,áÑ^Òn‰CܱàÉzï EÜÉ (5Å×ÐC­ņª0HÓø¡¼ŠÑ®Àƒó™8n’%–bñœìCúäZÛalçw‡'_½/8­øöe?ʶlë<8„ÔaÚRni/¤T «í;ÐWJMZÎ:N\jÄŒ[:`n³I«.eÀr1dâ.”8°¾ÙûaŸk·ö~5@¦peyýe …¸¥J_ôxÏ£/3-óÛiQlõ›éÂâaUë®uúpý…r—Þ·’GO׳càê‚Ë7wÒ¥Ðø)œÜû4¬F³Ú[GÍ¥Xƒsñ÷%ž¦Rrw´páÄ/ß]Ü rã =7ݵ4ÿ_&&îæúèY±&NÕœ] âÃjñþQ¬ìæfC)ÎôœþQ_6PçqáIk•>¾iYb'A½íß±£|_2kDÂ=;_† {ý]ÿÙicnV Bðangband-v3.3.2/src/osx/Angband.xml0000644000175000017500000000417611651552410016273 0ustar chriscchrisc CFBundleName$NAME$ CFBundleDisplayName$NAME$ (OS X) CFBundleExecutable$EXECUTABLE$ CFBundlePackageTypeAPPL CFBundleSignatureA271 CFBundleVersion$VERSION$ CFBundleShortVersionString$VERSION$ CFBundleIconFile$NAME$ CFBundleIdentifiernet.thangorodrim.$NAME$ CFBundleInfoDictionaryVersion6.0 CFBundleLongVersionString $VERSION$, Copyright $COPYRIGHT$ NSHumanReadableCopyright Copyright © $COPYRIGHT$ CFBundleGetInfoString $VERSION$, © $COPYRIGHT$ CFBundleDocumentTypes CFBundleTypeExtensions* CFBundleTypeIconFileSave CFBundleTypeNameAngband saved game CFBundleTypeOSTypesSAVE CFBundleTypeRoleEditor CFBundleTypeExtensions* CFBundleTypeIconFileEdit CFBundleTypeNameAngband game data CFBundleTypeOSTypesTEXT CFBundleTypeRoleEditor CFBundleTypeExtensions* CFBundleTypeIconFileData CFBundleTypeNameAngband game data CFBundleTypeOSTypesDATA CFBundleTypeRoleEditor angband-v3.3.2/src/defines.h0000644000175000017500000006107411651552410015174 0ustar chriscchrisc#ifndef INCLUDED_DEFINES_H #define INCLUDED_DEFINES_H /* * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ /* * Do not edit this file unless you know *exactly* what you are doing. * * Some of the values in this file were chosen to preserve game balance, * while others are hard-coded based on the format of old save-files, the * definition of arrays in various places, mathematical properties, fast * computation, storage limits, or the format of external text files. * * Changing some of these values will induce crashes or memory errors or * savefile mis-reads. Most of the comments in this file are meant as * reminders, not complete descriptions, and even a complete knowledge * of the source may not be sufficient to fully understand the effects * of changing certain definitions. * * Lastly, note that the code does not always use the symbolic constants * below, and sometimes uses various hard-coded values that may not even * be defined in this file, but which may be related to definitions here. * This is of course bad programming practice, but nobody is perfect... * * You have been warned. */ /* * Number of grids in each block (vertically) * Probably hard-coded to 11, see "generate.c" */ #define BLOCK_HGT 11 /* * Number of grids in each block (horizontally) * Probably hard-coded to 11, see "generate.c" */ #define BLOCK_WID 11 /** * Number of grids in each panel (vertically) */ #define PANEL_HGT ((int)(BLOCK_HGT / tile_height)) /** * Number of grids in each panel (horizontally) */ #define PANEL_WID ((int)(BLOCK_WID / tile_width)) /** * Number of text rows in each map screen, regardless of tile size */ #define SCREEN_ROWS (Term->hgt - ROW_MAP - 1) /** * Number of grids in each screen (vertically) */ #define SCREEN_HGT ((int) (SCREEN_ROWS / tile_height)) /** * Number of grids in each screen (horizontally) */ #define SCREEN_WID ((int)((Term->wid - COL_MAP - 1) / tile_width)) #define ROW_MAP 1 #define COL_MAP 13 /* * Number of grids in each dungeon (vertically) * Must be a multiple of SCREEN_HGT * Must be less or equal to 256 */ #define DUNGEON_HGT 66 /* * Number of grids in each dungeon (horizontally) * Must be a multiple of SCREEN_WID * Must be less or equal to 256 */ #define DUNGEON_WID 198 #define TOWN_WID 66 #define TOWN_HGT 22 /* * Maximum amount of Angband windows. */ #define ANGBAND_TERM_MAX 8 /* The fixed amount of energy a player should have at the start of a new level */ #define INITIAL_DUNGEON_ENERGY 100 /* * Maximum number of player "sex" types (see "table.c", etc) */ #define MAX_SEXES 3 /* * Number of tval/min-sval/max-sval slots per ego_item */ #define EGO_TVALS_MAX 3 /* * Hack -- Maximum number of quests */ #define MAX_Q_IDX 4 /* * Maximum dungeon level. The player can never reach this level * in the dungeon, and this value is used for various calculations * involving object and monster creation. It must be at least 100. * Setting it below 128 may prevent the creation of some objects. */ #define MAX_DEPTH 128 /* * Maximum size of the "view" array (see "cave.c") * Note that the "view radius" will NEVER exceed 20, and even if the "view" * was octagonal, we would never require more than 1520 entries in the array. */ #define VIEW_MAX 1536 /* * Maximum size of the "temp" array (see "cave.c") * Note that we must be as large as "VIEW_MAX" for proper functioning * of the "update_view()" function, and we must also be as large as the * largest illuminatable room, but no room is larger than 800 grids. We * must also be large enough to allow "good enough" use as a circular queue, * to calculate monster flow, but note that the flow code is "paranoid". */ #define TEMP_MAX 1536 /* History message types */ #define HISTORY_PLAYER_BIRTH 0x0001 /* Player was born */ #define HISTORY_ARTIFACT_UNKNOWN 0x0002 /* Player found but not IDd an artifact */ #define HISTORY_ARTIFACT_KNOWN 0x0004 /* Player has IDed an artifact */ #define HISTORY_ARTIFACT_LOST 0x0008 /* Player had an artifact and lost it */ #define HISTORY_PLAYER_DEATH 0x0010 /* Player has been slain */ #define HISTORY_SLAY_UNIQUE 0x0020 /* Player has slain a unique monster */ #define HISTORY_USER_INPUT 0x0040 /* User-added note */ #define HISTORY_SAVEFILE_IMPORT 0x0080 /* Added when an older version savefile is imported */ #define HISTORY_GAIN_LEVEL 0x0100 /* Player gained a level */ #define HISTORY_GENERIC 0x0200 /* Anything else not covered here (unused) */ /* * Misc constants */ #define TOWN_DAWN 10000 /* Number of turns from dawn to dawn */ #define TOWN_DUSK 5000 /* Number of turns from dawn to dusk */ #define BREAK_GLYPH 550 /* Rune of protection resistance */ #define BTH_PLUS_ADJ 3 /* Adjust BTH per plus-to-hit */ #define MON_MULT_ADJ 8 /* High value slows multiplication */ #define MON_DRAIN_LIFE 2 /* Percent of player exp drained per hit */ /* * There is a 1/50 (2%) chance of inflating the requested monster level * during the creation of a monsters (see "get_mon_num()" in "monster.c"). * Lower values yield harder monsters more often. */ #define NASTY_MON 25 /* 1/chance of inflated monster level */ #define MON_OOD_MAX 10 /* maximum out-of-depth amount */ /* * Refueling constants */ #define FUEL_TORCH 5000 /* Maximum amount of fuel in a torch */ #define FUEL_LAMP 15000 /* Maximum amount of fuel in a lantern */ #define DEFAULT_TORCH FUEL_TORCH /* Default amount of fuel in a torch */ #define DEFAULT_LAMP (FUEL_LAMP / 2) /* Default amount of fuel in a lantern */ /* * More maximum values */ #define MAX_SIGHT 20 /* Maximum view distance */ #define MAX_RANGE 20 /* Maximum range (spells, etc) */ /* * There is a 1/160 chance per round of creating a new monster */ #define MAX_M_ALLOC_CHANCE 160 /* * Normal levels get at least 14 monsters */ #define MIN_M_ALLOC_LEVEL 14 /* * The town starts out with 4 residents during the day */ #define MIN_M_ALLOC_TD 4 /* * The town starts out with 8 residents during the night */ #define MIN_M_ALLOC_TN 8 /* * A monster can only "multiply" (reproduce) if there are fewer than 100 * monsters on the level capable of such spontaneous reproduction. This * is a hack which prevents the "mon_list[]" array from exploding due to * reproducing monsters. Messy, but necessary. */ #define MAX_REPRO 100 /* * Player constants */ #define PY_MAX_EXP 99999999L /* Maximum exp */ #define PY_MAX_GOLD 999999999L /* Maximum gold */ #define PY_MAX_LEVEL 50 /* Maximum level */ /* * Player "food" crucial values */ #define PY_FOOD_UPPER 20000 /* Upper limit on food counter */ #define PY_FOOD_MAX 15000 /* Food value (Bloated) */ #define PY_FOOD_FULL 10000 /* Food value (Normal) */ #define PY_FOOD_ALERT 2000 /* Food value (Hungry) */ #define PY_FOOD_WEAK 1000 /* Food value (Weak) */ #define PY_FOOD_FAINT 500 /* Food value (Fainting) */ #define PY_FOOD_STARVE 100 /* Food value (Starving) */ /* * Player regeneration constants */ #define PY_REGEN_NORMAL 197 /* Regen factor*2^16 when full */ #define PY_REGEN_WEAK 98 /* Regen factor*2^16 when weak */ #define PY_REGEN_FAINT 33 /* Regen factor*2^16 when fainting */ #define PY_REGEN_HPBASE 1442 /* Min amount hp regen*2^16 */ #define PY_REGEN_MNBASE 524 /* Min amount mana regen*2^16 */ /* * Maximum number of players spells */ #define PY_MAX_SPELLS 64 /* * Flags for player_type.spell_flags[] */ #define PY_SPELL_LEARNED 0x01 /* Spell has been learned */ #define PY_SPELL_WORKED 0x02 /* Spell has been successfully tried */ #define PY_SPELL_FORGOTTEN 0x04 /* Spell has been forgotten */ /* * Maximum number of "normal" pack slots, and the index of the "overflow" * slot, which can hold an item, but only temporarily, since it causes the * pack to "overflow", dropping the "last" item onto the ground. Since this * value is used as an actual slot, it must be less than "INVEN_WIELD" (below). * Note that "INVEN_PACK" is probably hard-coded by its use in savefiles, and * by the fact that the screen can only show 23 items plus a one-line prompt. */ #define INVEN_PACK 23 /* * Like the previous but takes into account the (variably full quiver). */ #define INVEN_MAX_PACK (INVEN_PACK - p_ptr->quiver_slots) /* * Indexes used for various "equipment" slots (hard-coded by savefiles, etc). */ #define INVEN_WIELD 24 #define INVEN_BOW 25 #define INVEN_LEFT 26 #define INVEN_RIGHT 27 #define INVEN_NECK 28 #define INVEN_LIGHT 29 #define INVEN_BODY 30 #define INVEN_OUTER 31 #define INVEN_ARM 32 #define INVEN_HEAD 33 #define INVEN_HANDS 34 #define INVEN_FEET 35 /* * Total number of inventory slots (hard-coded). */ #define INVEN_TOTAL 36 /* *Quiver */ #define QUIVER_START 37 #define QUIVER_SIZE 10 #define QUIVER_END 47 #define ALL_INVEN_TOTAL 47 /* Since no item index can have this value, use it to mean * "no object", so that 0 can be a valid index. */ #define NO_OBJECT (ALL_INVEN_TOTAL+1) /* * A "stack" of items is limited to less than 100 items (hard-coded). */ #define MAX_STACK_SIZE 100 /* * An item's pval (for charges, amount of gold, etc) is limited to s16b */ #define MAX_PVAL 32767 /* * Maximum number of objects allowed in a single dungeon grid. * * The main-screen has a minimum size of 24 rows, so we can always * display 23 objects + 1 header line. */ #define MAX_FLOOR_STACK 23 /*** Constants for accessing the player struct ***/ /* * Timed effects */ enum { TMD_FAST = 0, TMD_SLOW, TMD_BLIND, TMD_PARALYZED, TMD_CONFUSED, TMD_AFRAID, TMD_IMAGE, TMD_POISONED, TMD_CUT, TMD_STUN, TMD_PROTEVIL, TMD_INVULN, TMD_HERO, TMD_SHERO, TMD_SHIELD, TMD_BLESSED, TMD_SINVIS, TMD_SINFRA, TMD_OPP_ACID, TMD_OPP_ELEC, TMD_OPP_FIRE, TMD_OPP_COLD, TMD_OPP_POIS, TMD_OPP_CONF, TMD_AMNESIA, TMD_TELEPATHY, TMD_STONESKIN, TMD_TERROR, TMD_SPRINT, TMD_BOLD, TMD_MAX }; /* * Skill indexes */ enum { SKILL_DISARM, /* Skill: Disarming */ SKILL_DEVICE, /* Skill: Magic Devices */ SKILL_SAVE, /* Skill: Saving throw */ SKILL_STEALTH, /* Skill: Stealth factor */ SKILL_SEARCH, /* Skill: Searching ability */ SKILL_SEARCH_FREQUENCY, /* Skill: Searching frequency */ SKILL_TO_HIT_MELEE, /* Skill: To hit (normal) */ SKILL_TO_HIT_BOW, /* Skill: To hit (shooting) */ SKILL_TO_HIT_THROW, /* Skill: To hit (throwing) */ SKILL_DIGGING, /* Skill: Digging */ SKILL_MAX }; /* * Indexes of the various "stats" (hard-coded by savefiles, etc). */ enum { A_STR = 0, A_INT, A_WIS, A_DEX, A_CON, A_CHR, A_MAX }; /* * The range of possible indexes into tables based upon stats. * Currently things range from 3 to 18/220 = 40. */ #define STAT_RANGE 38 /* * Player sex constants (hard-coded by save-files, arrays, etc) */ #define SEX_FEMALE 0 #define SEX_MALE 1 /* * Special values for the number of turns to rest, these need to be * negative numbers, as postive numbers are taken to be a turncount, * and zero means "not resting". */ enum { REST_COMPLETE = -2, REST_ALL_POINTS = -1, REST_SOME_POINTS = -3 }; /*** General index values ***/ /*** Feature Indexes (see "lib/edit/terrain.txt") ***/ /* Nothing */ #define FEAT_NONE 0x00 /* Various */ #define FEAT_FLOOR 0x01 #define FEAT_INVIS 0x02 #define FEAT_GLYPH 0x03 #define FEAT_OPEN 0x04 #define FEAT_BROKEN 0x05 #define FEAT_LESS 0x06 #define FEAT_MORE 0x07 /* Shops */ #define FEAT_SHOP_HEAD 0x08 #define FEAT_SHOP_TAIL 0x0F /* Traps */ #define FEAT_TRAP_HEAD 0x10 #define FEAT_TRAP_TAIL 0x1F /* Doors */ #define FEAT_DOOR_HEAD 0x20 #define FEAT_DOOR_TAIL 0x2F /* Secret door */ #define FEAT_SECRET 0x30 /* Rubble */ #define FEAT_RUBBLE 0x31 /* Mineral seams */ #define FEAT_MAGMA 0x32 #define FEAT_QUARTZ 0x33 #define FEAT_MAGMA_H 0x34 #define FEAT_QUARTZ_H 0x35 #define FEAT_MAGMA_K 0x36 #define FEAT_QUARTZ_K 0x37 /* Walls */ #define FEAT_WALL_EXTRA 0x38 #define FEAT_WALL_INNER 0x39 #define FEAT_WALL_OUTER 0x3A #define FEAT_WALL_SOLID 0x3B #define FEAT_PERM_EXTRA 0x3C #define FEAT_PERM_INNER 0x3D #define FEAT_PERM_OUTER 0x3E #define FEAT_PERM_SOLID 0x3F /*** Important artifact indexes (see "lib/edit/artifact.txt") ***/ #define ART_POWER 13 #define ART_MORGOTH 34 #define ART_GROND 111 #define ART_PALANTIR 7 /* * Hack -- first "normal" artifact in the artifact list. All of * the artifacts with indexes from 1 to 15 are "special" (lights, * rings, amulets), and the ones from 16 to 127 are "normal". */ #define ART_MIN_NORMAL 16 /*** Function flags ***/ /* * Bit flags for the "target_set" function * * KILL: Target monsters * LOOK: Describe grid fully * XTRA: Currently unused flag (NOT USED) * GRID: Select from all grids (NOT USED) * QUIET: Prevent targeting messages. */ #define TARGET_KILL 0x01 #define TARGET_LOOK 0x02 #define TARGET_XTRA 0x04 #define TARGET_GRID 0x08 #define TARGET_QUIET 0x10 /* * Bit flags for the "monster_desc" function */ #define MDESC_OBJE 0x01 /* Objective (or Reflexive) */ #define MDESC_POSS 0x02 /* Possessive (or Reflexive) */ #define MDESC_IND1 0x04 /* Indefinites for hidden monsters */ #define MDESC_IND2 0x08 /* Indefinites for visible monsters */ #define MDESC_PRO1 0x10 /* Pronominalize hidden monsters */ #define MDESC_PRO2 0x20 /* Pronominalize visible monsters */ #define MDESC_HIDE 0x40 /* Assume the monster is hidden */ #define MDESC_SHOW 0x80 /* Assume the monster is visible */ /* * Bit flags for the "get_item" function */ #define USE_EQUIP 0x01 /* Allow equip items */ #define USE_INVEN 0x02 /* Allow inven items */ #define USE_FLOOR 0x04 /* Allow floor items */ #define CAN_SQUELCH 0x08 /* Allow selection of all squelched items */ #define IS_HARMLESS 0x10 /* Ignore generic warning inscriptions */ #define SHOW_PRICES 0x20 /* Show item prices in item lists */ #define SHOW_FAIL 0x40 /* Show device failure in item lists */ #define QUIVER_TAGS 0x80 /* 0-9 are quiver slots when selecting */ /*** Player flags ***/ /* * Bit flags for the "p_ptr->notice" variable */ #define PN_COMBINE 0x00000001L /* Combine the pack */ #define PN_REORDER 0x00000002L /* Reorder the pack */ #define PN_AUTOINSCRIBE 0x00000004L /* Autoinscribe items */ #define PN_PICKUP 0x00000008L /* Pick stuff up */ #define PN_SQUELCH 0x00000010L /* Squelch stuff */ #define PN_SORT_QUIVER 0x00000020L /* Sort the quiver */ #define PN_MON_MESSAGE 0x00000040L /* flush monster pain messages */ /* xxx (many) */ /* * Bit flags for the "p_ptr->update" variable */ #define PU_BONUS 0x00000001L /* Calculate bonuses */ #define PU_TORCH 0x00000002L /* Calculate torch radius */ /* xxx (many) */ #define PU_HP 0x00000010L /* Calculate chp and mhp */ #define PU_MANA 0x00000020L /* Calculate csp and msp */ #define PU_SPELLS 0x00000040L /* Calculate spells */ /* xxx (many) */ #define PU_FORGET_VIEW 0x00010000L /* Forget field of view */ #define PU_UPDATE_VIEW 0x00020000L /* Update field of view */ /* xxx (many) */ #define PU_FORGET_FLOW 0x00100000L /* Forget flow data */ #define PU_UPDATE_FLOW 0x00200000L /* Update flow data */ /* xxx (many) */ #define PU_MONSTERS 0x10000000L /* Update monsters */ #define PU_DISTANCE 0x20000000L /* Update distances */ /* xxx */ #define PU_PANEL 0x80000000L /* Update panel */ /* * Bit flags for the "p_ptr->redraw" variable */ #define PR_MISC 0x00000001L /* Display Race/Class */ #define PR_TITLE 0x00000002L /* Display Title */ #define PR_LEV 0x00000004L /* Display Level */ #define PR_EXP 0x00000008L /* Display Experience */ #define PR_STATS 0x00000010L /* Display Stats */ #define PR_ARMOR 0x00000020L /* Display Armor */ #define PR_HP 0x00000040L /* Display Hitpoints */ #define PR_MANA 0x00000080L /* Display Mana */ #define PR_GOLD 0x00000100L /* Display Gold */ #define PR_HEALTH 0x00000800L /* Display Health Bar */ #define PR_SPEED 0x00001000L /* Display Extra (Speed) */ #define PR_STUDY 0x00002000L /* Display Extra (Study) */ #define PR_DEPTH 0x00004000L /* Display Depth */ #define PR_STATUS 0x00008000L #define PR_DTRAP 0x00010000L /* Trap detection indicator */ #define PR_STATE 0x00020000L /* Display Extra (State) */ #define PR_MAP 0x00040000L /* Redraw whole map */ #define PR_INVEN 0x00080000L /* Display inven/equip */ #define PR_EQUIP 0x00100000L /* Display equip/inven */ #define PR_MESSAGE 0x00200000L /* Display messages */ #define PR_MONSTER 0x00400000L /* Display monster recall */ #define PR_OBJECT 0x00800000L /* Display object recall */ #define PR_MONLIST 0x01000000L /* Display monster list */ #define PR_BUTTONS 0x02000000L /* Display mouse buttons */ #define PR_ITEMLIST 0x04000000L /* Display item list */ /* Display Basic Info */ #define PR_BASIC \ (PR_MISC | PR_TITLE | PR_STATS | PR_LEV |\ PR_EXP | PR_GOLD | PR_ARMOR | PR_HP |\ PR_MANA | PR_DEPTH | PR_HEALTH | PR_SPEED) /* Display Extra Info */ #define PR_EXTRA \ (PR_STATUS | PR_STATE | PR_STUDY) /* * Bit flags for the "p_ptr->window" variable. */ #define PW_INVEN 0x00000001L /* Display inven/equip */ #define PW_EQUIP 0x00000002L /* Display equip/inven */ #define PW_PLAYER_0 0x00000004L /* Display player (basic) */ #define PW_PLAYER_1 0x00000008L /* Display player (extra) */ #define PW_PLAYER_2 0x00000010L /* Display player (compact) */ #define PW_MAP 0x00000020L /* Display dungeon map */ #define PW_MESSAGE 0x00000040L /* Display messages */ #define PW_OVERHEAD 0x00000080L /* Display overhead view */ #define PW_MONSTER 0x00000100L /* Display monster recall */ #define PW_OBJECT 0x00000200L /* Display object recall */ #define PW_MONLIST 0x00000400L /* Display monster list */ #define PW_STATUS 0x00000800L /* Display status */ #define PW_ITEMLIST 0x00001000L /* Display item list */ /* xxx */ #define PW_BORG_1 0x00004000L /* Display borg messages */ #define PW_BORG_2 0x00008000L /* Display borg status */ #define PW_MAX_FLAGS 16 /*** Cave flags ***/ /* * Special cave grid flags */ #define CAVE_MARK 0x01 /* memorized feature */ #define CAVE_GLOW 0x02 /* self-illuminating */ #define CAVE_ICKY 0x04 /* part of a vault */ #define CAVE_ROOM 0x08 /* part of a room */ #define CAVE_SEEN 0x10 /* seen flag */ #define CAVE_VIEW 0x20 /* view flag */ #define CAVE_TEMP 0x40 /* temp flag */ #define CAVE_WALL 0x80 /* wall flag */ #define CAVE2_DTRAP 0x01 /* trap detected grid */ #define CAVE2_FEEL 0x02 /* hidden points to trigger feelings*/ /* * Information for Feelings */ #define FEELING_TOTAL 100 /* total number of feeling squares per level */ #define FEELING1 10 /* Squares needed to see in order to trigger first feeling */ /* * Chest trap flags (see "tables.c") */ #define CHEST_LOSE_STR 0x01 #define CHEST_LOSE_CON 0x02 #define CHEST_POISON 0x04 #define CHEST_PARALYZE 0x08 #define CHEST_EXPLODE 0x10 #define CHEST_SUMMON 0x20 /* * Player race and class flags */ enum { #define PF(a,b) PF_##a, #include "list-player-flags.h" #undef PF PF_MAX }; #define PF_SIZE FLAG_SIZE(PF_MAX) #define pf_has(f, flag) flag_has_dbg(f, PF_SIZE, flag, #f, #flag) #define pf_next(f, flag) flag_next(f, PF_SIZE, flag) #define pf_is_empty(f) flag_is_empty(f, PF_SIZE) #define pf_is_full(f) flag_is_full(f, PF_SIZE) #define pf_is_inter(f1, f2) flag_is_inter(f1, f2, PF_SIZE) #define pf_is_subset(f1, f2) flag_is_subset(f1, f2, PF_SIZE) #define pf_is_equal(f1, f2) flag_is_equal(f1, f2, PF_SIZE) #define pf_on(f, flag) flag_on_dbg(f, PF_SIZE, flag, #f, #flag) #define pf_off(f, flag) flag_off(f, PF_SIZE, flag) #define pf_wipe(f) flag_wipe(f, PF_SIZE) #define pf_setall(f) flag_setall(f, PF_SIZE) #define pf_negate(f) flag_negate(f, PF_SIZE) #define pf_copy(f1, f2) flag_copy(f1, f2, PF_SIZE) #define pf_union(f1, f2) flag_union(f1, f2, PF_SIZE) #define pf_comp_union(f1, f2) flag_comp_union(f1, f2, PF_SIZE) #define pf_inter(f1, f2) flag_inter(f1, f2, PF_SIZE) #define pf_diff(f1, f2) flag_diff(f1, f2, PF_SIZE) #define player_has(flag) (pf_has(p_ptr->race->pflags, (flag)) || pf_has(p_ptr->class->pflags, (flag))) /*** Terrain flags ***/ enum { FF_PWALK = 0x00000001, FF_PPASS = 0x00000002, FF_MWALK = 0x00000004, FF_MPASS = 0x00000008, FF_LOOK = 0x00000010, FF_DIG = 0x00000020, FF_DOOR = 0x00000040, FF_EXIT_UP = 0x00000080, FF_EXIT_DOWN = 0x00000100, FF_PERM = 0x00000200, FF_TRAP = 0x00000400, FF_SHOP = 0x00000800, FF_HIDDEN = 0x00001000, FF_BORING = 0x00002000 }; /*** Macro Definitions ***/ /* * Hack -- The main "screen" */ #define term_screen (angband_term[0]) /* * Convert a "location" (Y,X) into a "grid" (G) */ #define GRID(Y,X) \ (256 * (Y) + (X)) /* * Convert a "grid" (G) into a "location" (Y) */ #define GRID_Y(G) \ ((int)((G) / 256U)) /* * Convert a "grid" (G) into a "location" (X) */ #define GRID_X(G) \ ((int)((G) % 256U)) /* * Convert a "key event" into a "location" (Y) */ #define KEY_GRID_Y(K) \ ((int) (((K.mouse.y - ROW_MAP) / tile_height) + Term->offset_y)) /* * Convert a "key event" into a "location" (X) */ #define KEY_GRID_X(K) \ ((int) (((K.mouse.x - COL_MAP) / tile_width) + Term->offset_x)) /* * Determines if a map location is "meaningful" */ #define in_bounds(Y,X) \ (((unsigned)(Y) < (unsigned)(DUNGEON_HGT)) && \ ((unsigned)(X) < (unsigned)(DUNGEON_WID))) /* * Determines if a map location is fully inside the outer walls * This is more than twice as expensive as "in_bounds()", but * often we need to exclude the outer walls from calculations. */ #define in_bounds_fully(Y,X) \ (((Y) > 0) && ((Y) < DUNGEON_HGT-1) && \ ((X) > 0) && ((X) < DUNGEON_WID-1)) /* * Determine if a "legal" grid is a "floor" grid * * Line 1 -- forbid doors, rubble, seams, walls * * Note the use of the new "CAVE_WALL" flag. */ #define cave_floor_bold(Y,X) \ (!(cave->info[Y][X] & (CAVE_WALL))) /* * Determine if a "legal" grid is a "clean" floor grid * * Line 1 -- forbid non-floors * Line 2 -- forbid normal objects */ #define cave_clean_bold(Y,X) \ ((cave->feat[Y][X] == FEAT_FLOOR) && \ (cave->o_idx[Y][X] == 0)) /* * Determine if a "legal" grid is an "empty" floor grid * * Line 1 -- forbid doors, rubble, seams, walls * Line 2 -- forbid player/monsters */ #define cave_empty_bold(Y,X) \ (cave_floor_bold(Y,X) && \ (cave->m_idx[Y][X] == 0)) /* * Determine if a "legal" grid is an "naked" floor grid * * Line 1 -- forbid non-floors * Line 2 -- forbid normal objects * Line 3 -- forbid player/monsters */ #define cave_naked_bold(Y,X) \ ((cave->feat[Y][X] == FEAT_FLOOR) && \ (cave->o_idx[Y][X] == 0) && \ (cave->m_idx[Y][X] == 0)) /* * Determine if a "legal" grid is "permanent" * * Line 1 -- perma-walls * Line 2-3 -- stairs * Line 4-5 -- shop doors */ #define cave_perma_bold(Y,X) \ ((cave->feat[Y][X] >= FEAT_PERM_EXTRA) || \ ((cave->feat[Y][X] == FEAT_LESS) || \ (cave->feat[Y][X] == FEAT_MORE)) || \ ((cave->feat[Y][X] >= FEAT_SHOP_HEAD) && \ (cave->feat[Y][X] <= FEAT_SHOP_TAIL))) /* * Determine if a "legal" grid is within "los" of the player * * Note the use of comparison to zero to force a "boolean" result */ #define player_has_los_bold(Y,X) \ ((cave->info[Y][X] & (CAVE_VIEW)) != 0) /* * Determine if a "legal" grid can be "seen" by the player * * Note the use of comparison to zero to force a "boolean" result */ #define player_can_see_bold(Y,X) \ ((cave->info[Y][X] & (CAVE_SEEN)) != 0) /* * Say whether it's daytime or not */ #define is_daytime() \ (((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2)) ? FALSE : TRUE) /* * Maximum number of macro trigger names */ #define MAX_MACRO_TRIGGER 200 #define MAX_MACRO_MOD 12 /*** Hack ***/ /* * Available graphic modes */ #define GRAPHICS_NONE 0 #define GRAPHICS_ORIGINAL 1 #define GRAPHICS_ADAM_BOLT 2 #define GRAPHICS_DAVID_GERVAIS 3 #define GRAPHICS_PSEUDO 4 #define GRAPHICS_NOMAD 5 /* player_type.noscore flags */ #define NOSCORE_WIZARD 0x0002 #define NOSCORE_DEBUG 0x0008 #define NOSCORE_BORG 0x0010 #define SCAN_INSTANT ((u32b) -1) #define SCAN_OFF 0 #define SCAN_MACRO 45 #define MAX_ITEMLIST 2560 /** * Maximum number of rvals (monster templates) that a pit can specify. */ #define MAX_RVALS 4 /* * Monster Timed Effects */ enum { MON_TMD_SLEEP = 0, MON_TMD_STUN, MON_TMD_CONF, MON_TMD_FEAR, MON_TMD_SLOW, MON_TMD_FAST, MON_TMD_MAX }; #endif /* !INCLUDED_DEFINES_H */ angband-v3.3.2/src/x-char.c0000644000175000017500000002037311651552410014731 0ustar chriscchrisc/* * File: x-char.c * Purpose: Enable Latin-1 encodings for supported platforms. * * Copyright (c) 2007 Leon Marrick, Hugo Cornelius, Diego Gonzalez, Jeff Greene * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "z-util.h" #include "z-term.h" #include "x-char.h" /* * Translate from encodes to extended 8-bit characters and back again. */ static const xchar_type latin1_encode[] = { { "`A", 192 }, { "'A", 193 }, { "^A", 194 }, { "~A", 195 }, { "\"A", 196 }, { "*A", 197 }, { ",C", 199 }, { "`E", 200 }, { "'E", 201 }, { "^E", 202 }, { "\"E", 203 }, { "`I", 204 }, { "'I", 205 }, { "^I", 206 }, { "\"I", 207 }, { "~N", 209 }, { "`O", 210 }, { "'O", 211 }, { "^O", 212 }, { "~O", 213 }, { "\"O", 214 }, { "/O", 216 }, { "`U", 217 }, { "'U", 218 }, { "^U", 219 }, { "\"U", 220 }, { "'Y", 221 }, { "`a", 224 }, { "'a", 225 }, { "^a", 226 }, { "~a", 227 }, { "\"a", 228 }, { "*a", 229 }, { ",c", 231 }, { "`e", 232 }, { "'e", 233 }, { "^e", 234 }, { "\"e", 235 }, { "`i", 236 }, { "'i", 237 }, { "^i", 238 }, { "\"i", 239 }, { "~n", 241 }, { "`o", 242 }, { "'o", 243 }, { "^o", 244 }, { "~o", 245 }, { "\"o", 246 }, { "/o", 248 }, { "`u", 249 }, { "'u", 250 }, { "^u", 251 }, { "\"u", 252 }, { "'y", 253 }, { "\"y", 255 }, { "iexcl", 161 }, { "euro", 162 }, { "pound", 163 }, { "curren", 164 }, { "yen", 165 }, { "brvbar", 166 }, { "sect", 167 }, { "Agrave", 192 }, { "Aacute", 193 }, { "Acirc", 194 }, { "Atilde", 195 }, { "Auml", 196 }, { "Aring", 197 }, { "Aelig", 198 }, { "Ccedil", 199 }, { "Egrave", 200 }, { "Eacute", 201 }, { "Ecirc", 202 }, { "Euml", 203 }, { "Igrave", 204 }, { "Iacute", 205 }, { "Icirc", 206 }, { "Iuml", 207 }, { "ETH", 208 }, { "Ntilde", 209 }, { "Ograve", 210 }, { "Oacute", 211 }, { "Ocirc", 212 }, { "Otilde", 213 }, { "Ouml", 214 }, { "Oslash", 216 }, { "Ugrave", 217 }, { "Uacute", 218 }, { "Ucirc", 219 }, { "Uuml", 220 }, { "Yacute", 221 }, { "THORN", 222 }, { "szlig", 223 }, { "agrave", 224 }, { "aacute", 225 }, { "acirc", 226 }, { "atilde", 227 }, { "auml", 228 }, { "aring", 229 }, { "aelig", 230 }, { "ccedil", 231 }, { "egrave", 232 }, { "eacute", 233 }, { "ecirc", 234 }, { "euml", 235 }, { "igrave", 236 }, { "iacute", 237 }, { "icirc", 238 }, { "iuml", 239 }, { "eth", 240 }, { "ntilde", 241 }, { "ograve", 242 }, { "oacute", 243 }, { "ocirc", 244 }, { "otilde", 245 }, { "ouml", 246 }, { "oslash", 248 }, { "ugrave", 249 }, { "uacute", 250 }, { "ucirc", 251 }, { "uuml", 252 }, { "yacute", 253 }, { "thorn", 254 }, { "yuml", 255 }, { "\0", 0 } }; /* * Translate from ISO Latin-1 characters 128+ to 7-bit ASCII. * * We use this table to maintain compatibility with systems that cannot * display 8-bit characters. We also use it whenever we wish to suppress * accents or ensure that a character is 7-bit. */ static const char seven_bit_translation[128] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'A', 'A', 'A', 'A', 'A', 'A', ' ', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', ' ', 'O', 'U', 'U', 'U', 'U', 'Y', ' ', ' ', 'a', 'a', 'a', 'a', 'a', 'a', ' ', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', ' ', 'o', 'u', 'u', 'u', 'u', 'y', ' ', 'y' }; /* * Link to the xchar_trans function. */ static void xchar_trans_hook(char *s, int encoding) { /* Option to translate into ASCII */ if (encoding == ASCII) { if (*s < 0) *s = seven_bit_translation[128 + *s]; } /* Option to translate into system-specific character set */ else if (encoding == SYSTEM_SPECIFIC) { if (*s < 0) *s = xchar_trans(*s); } } /* * Given what we think is an encode, return a Latin-1 character position. */ static byte encode_to_xchar(char *encode) { int i; /* Scan until we hit the end-of-table marker */ for (i = 0; latin1_encode[i].c; i++) { /* We found the encode; return the character */ if (streq(encode, latin1_encode[i].tag)) return (latin1_encode[i].c); } /* This encode is not recognized */ return (0); } /* * Read an encode. Return the Latin-1 character position if successful. */ bool get_encode(char *str, char *c) { int n = 0; char *s; char encode[80]; /* Assume empty char */ *c = '\0'; /* An encode must start with a '[' */ if (str[0] != '[') return (FALSE); /* Copy the encode (between brackets) */ for (s = str + 1; ((n < 80) && (*s) && (*s != ']')); n++) { encode[n] = *s++; } /* End the encode */ encode[n] = '\0'; /* We have a trailing bracket */ if (*s == ']') { /* Look up extended character */ *c = (char)encode_to_xchar(encode); /* Encode is legal -- return the char */ if (*c) return (TRUE); } /* Illegal encode */ return (FALSE); } /* * Take a 7-bit ASCII string and use any encodes in it to insert 8-bit * characters. Use the Latin-1 (ISO) standard by default. -LM- * * Optionally, translate into 7-bit ASCII or a system-specific character set. * * The input string must be '\0'-terminated, and should not be greater than * 1024 character in length (we check this). */ void xstr_trans(char *str, int encoding) { /* Assume no encodes in this string */ bool flag = FALSE; int n, c; char *s, *b; char buf[1024]; char encode[80]; /* Require a string */ if (!str) return; /* Start at the beginning */ s = str; b = buf; /* Scan the string */ for (; *s;) { /* Paranoia -- check bounds */ if (b - buf > 1022) break; /* Character is a [ */ if (*s == '[') { /* Remember where we are */ char *s_old = s; /* Assume illegal */ c = 0; /* Skip past the open bracket */ s += 1; /* Copy the encode (between brackets) */ for (n = 0; ((n < 79) && (*s) && (*s != ']')); n++) { encode[n] = *s++; } /* End the encode */ encode[n] = '\0'; /* We have a trailing bracket */ if (*s == ']') { /* Go to next character */ s++; /* Look up extended character */ c = (char)encode_to_xchar(encode); } /* Encode is legal */ if (c) { /* Note the encode */ flag = TRUE; /* Save it */ *b++ = c; } /* Encode is illegal */ else { /* Return to start of encode */ s = s_old; /* Copy the '[', go to the next character */ *b++ = *s++; } } /* No encoding recognized */ else { /* Copy the character */ *b++ = *s++; } } /* End the string */ *b = '\0'; /* Copy the edited string back, if we've found encodes */ if (flag) strcpy(str, buf); /* Translate the string if we don't want standard Latin-1 */ if (encoding != LATIN1) { for (s = str; *s; s++) xchar_trans_hook(s, encoding); } } /* * Given a position in the ISO Latin-1 character set (which Angband uses * internally), return the correct display character on this system. * Assume ASCII-only if no special hook is available. -LM- */ char xchar_trans(byte c) { char s; /* Use the hook, if available */ if (Term->xchar_hook) return ((char)(Term->xchar_hook)(c)); /* 7-bit characters are not translated */ if (c < 128) return (c); /* Translate to 7-bit (strip accent or convert to space) */ s = seven_bit_translation[c - 128]; if (s == 0) return (c); else return (s); } angband-v3.3.2/src/randname.h0000644000175000017500000000075111651552410015337 0ustar chriscchrisc#ifndef RANDNAME_H #define RANDNAME_H /* * The different types of name randname.c can generate * which is also the number of sections in names.txt */ typedef enum { RANDNAME_TOLKIEN = 1, RANDNAME_SCROLL, /* End of type marker - not a valid name type */ RANDNAME_NUM_TYPES } randname_type; /* * Make a random name. */ extern size_t randname_make(randname_type name_type, size_t min, size_t max, char *word_buf, size_t buflen, const char ***wordlist); #endif /* RANDNAME_H */ angband-v3.3.2/src/effects.h0000644000175000017500000000214011651552410015163 0ustar chriscchrisc/* * File: effects.h * Purpose: List of effect types * * Copyright (c) 2007 Andrew Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_EFFECTS_H #define INCLUDED_EFFECTS_H /* Types of effect */ typedef enum { #define EFFECT(x, y, r, z) EF_##x, #include "list-effects.h" #undef EFFECT EF_MAX } effect_type; /*** Functions ***/ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam, int boost); bool effect_aim(effect_type effect); const char *effect_desc(effect_type effect); int effect_power(effect_type effect); bool effect_obvious(effect_type effect); bool effect_wonder(int dir, int die, int beam); #endif /* INCLUDED_EFFECTS_H */ angband-v3.3.2/src/dungeon.c0000644000175000017500000011615311651552410015210 0ustar chriscchrisc/* * File: dungeon.c * Purpose: The game core bits, shared across platforms. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "button.h" #include "cave.h" #include "cmds.h" #include "files.h" #include "game-event.h" #include "generate.h" #include "init.h" #include "monster/monster.h" #include "monster/mon-make.h" #include "monster/mon-spell.h" #include "monster/mon-util.h" #include "object/tvalsval.h" #include "prefs.h" #include "savefile.h" #include "spells.h" #include "target.h" /* * Change dungeon level - e.g. by going up stairs or with WoR. */ void dungeon_change_level(int dlev) { /* New depth */ p_ptr->depth = dlev; /* If we're returning to town, update the store contents according to how long we've been away */ if (!dlev && daycount) { if (OPT(cheat_xtra)) msg("Updating Shops..."); while (daycount--) { int n; /* Maintain each shop (except home) */ for (n = 0; n < MAX_STORES; n++) { /* Skip the home */ if (n == STORE_HOME) continue; /* Maintain */ store_maint(&stores[n]); } /* Sometimes, shuffle the shop-keepers */ if (one_in_(STORE_SHUFFLE)) { /* Message */ if (OPT(cheat_xtra)) msg("Shuffling a Shopkeeper..."); /* Pick a random shop (except home) */ while (1) { n = randint0(MAX_STORES); if (n != STORE_HOME) break; } /* Shuffle it */ store_shuffle(&stores[n]); } } daycount = 0; if (OPT(cheat_xtra)) msg("Done."); } /* Leaving */ p_ptr->leaving = TRUE; /* Save the game when we arrive on the new level. */ p_ptr->autosave = TRUE; } /* * Regenerate hit points */ static void regenhp(int percent) { s32b new_chp, new_chp_frac; int old_chp; /* Save the old hitpoints */ old_chp = p_ptr->chp; /* Extract the new hitpoints */ new_chp = ((long)p_ptr->mhp) * percent + PY_REGEN_HPBASE; p_ptr->chp += (s16b)(new_chp >> 16); /* div 65536 */ /* check for overflow */ if ((p_ptr->chp < 0) && (old_chp > 0)) p_ptr->chp = MAX_SHORT; new_chp_frac = (new_chp & 0xFFFF) + p_ptr->chp_frac; /* mod 65536 */ if (new_chp_frac >= 0x10000L) { p_ptr->chp_frac = (u16b)(new_chp_frac - 0x10000L); p_ptr->chp++; } else { p_ptr->chp_frac = (u16b)new_chp_frac; } /* Fully healed */ if (p_ptr->chp >= p_ptr->mhp) { p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; } /* Notice changes */ if (old_chp != p_ptr->chp) { /* Redraw */ p_ptr->redraw |= (PR_HP); wieldeds_notice_flag(p_ptr, OF_REGEN); wieldeds_notice_flag(p_ptr, OF_IMPAIR_HP); } } /* * Regenerate mana points */ static void regenmana(int percent) { s32b new_mana, new_mana_frac; int old_csp; old_csp = p_ptr->csp; new_mana = ((long)p_ptr->msp) * percent + PY_REGEN_MNBASE; p_ptr->csp += (s16b)(new_mana >> 16); /* div 65536 */ /* check for overflow */ if ((p_ptr->csp < 0) && (old_csp > 0)) { p_ptr->csp = MAX_SHORT; } new_mana_frac = (new_mana & 0xFFFF) + p_ptr->csp_frac; /* mod 65536 */ if (new_mana_frac >= 0x10000L) { p_ptr->csp_frac = (u16b)(new_mana_frac - 0x10000L); p_ptr->csp++; } else { p_ptr->csp_frac = (u16b)new_mana_frac; } /* Must set frac to zero even if equal */ if (p_ptr->csp >= p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; } /* Redraw mana */ if (old_csp != p_ptr->csp) { /* Redraw */ p_ptr->redraw |= (PR_MANA); wieldeds_notice_flag(p_ptr, OF_REGEN); wieldeds_notice_flag(p_ptr, OF_IMPAIR_MANA); } } /* * Regenerate the monsters (once per 100 game turns) * * XXX XXX XXX Should probably be done during monster turns. */ static void regen_monsters(void) { int i, frac; /* Regenerate everyone */ for (i = 1; i < cave_monster_max(cave); i++) { /* Check the i'th monster */ monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Allow regeneration (if needed) */ if (m_ptr->hp < m_ptr->maxhp) { /* Hack -- Base regeneration */ frac = m_ptr->maxhp / 100; /* Hack -- Minimal regeneration rate */ if (!frac) frac = 1; /* Hack -- Some monsters regenerate quickly */ if (rf_has(r_ptr->flags, RF_REGENERATE)) frac *= 2; /* Hack -- Regenerate */ m_ptr->hp += frac; /* Do not over-regenerate */ if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; /* Redraw (later) if needed */ if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH); } } } /* * If player has inscribed the object with "!!", let him know when it's * recharged. -LM- * Also inform player when first item of a stack has recharged. -HK- * Notify all recharges w/o inscription if notify_recharge option set -WP- */ static void recharged_notice(const object_type *o_ptr, bool all) { char o_name[120]; const char *s; bool notify = FALSE; if (OPT(notify_recharge)) { notify = TRUE; } else if (o_ptr->note) { /* Find a '!' */ s = strchr(quark_str(o_ptr->note), '!'); /* Process notification request */ while (s) { /* Find another '!' */ if (s[1] == '!') { notify = TRUE; break; } /* Keep looking for '!'s */ s = strchr(s + 1, '!'); } } if (!notify) return; /* Describe (briefly) */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Disturb the player */ disturb(p_ptr, 0, 0); /* Notify the player */ if (o_ptr->number > 1) { if (all) msg("Your %s have recharged.", o_name); else msg("One of your %s has recharged.", o_name); } /* Artifacts */ else if (o_ptr->artifact) { msg("The %s has recharged.", o_name); } /* Single, non-artifact items */ else msg("Your %s has recharged.", o_name); } /* * Recharge activatable objects in the player's equipment * and rods in the inventory and on the ground. */ static void recharge_objects(void) { int i; bool charged = FALSE, discharged_stack; object_type *o_ptr; /*** Recharge equipment ***/ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { /* Get the object */ o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Recharge activatable objects */ if (recharge_timeout(o_ptr)) { charged = TRUE; /* Message if an item recharged */ recharged_notice(o_ptr, TRUE); } } /* Notice changes */ if (charged) { /* Window stuff */ p_ptr->redraw |= (PR_EQUIP); } charged = FALSE; /*** Recharge the inventory ***/ for (i = 0; i < INVEN_PACK; i++) { o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; discharged_stack = (number_charging(o_ptr) == o_ptr->number) ? TRUE : FALSE; /* Recharge rods, and update if any rods are recharged */ if (o_ptr->tval == TV_ROD && recharge_timeout(o_ptr)) { charged = TRUE; /* Entire stack is recharged */ if (o_ptr->timeout == 0) recharged_notice(o_ptr, TRUE); /* Previously exhausted stack has acquired a charge */ else if (discharged_stack) recharged_notice(o_ptr, FALSE); } } /* Notice changes */ if (charged) { /* Combine pack */ p_ptr->notice |= (PN_COMBINE); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); } /*** Recharge the ground ***/ for (i = 1; i < o_max; i++) { /* Get the object */ o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Recharge rods on the ground */ if (o_ptr->tval == TV_ROD) recharge_timeout(o_ptr); } } static void play_ambient_sound(void) { /* Town sound */ if (p_ptr->depth == 0) { /* Hack - is it daytime or nighttime? */ if (turn % (10L * TOWN_DAWN) < TOWN_DAWN / 2) { /* It's day. */ sound(MSG_AMBIENT_DAY); } else { /* It's night. */ sound(MSG_AMBIENT_NITE); } } /* Dungeon level 1-20 */ else if (p_ptr->depth <= 20) { sound(MSG_AMBIENT_DNG1); } /* Dungeon level 21-40 */ else if (p_ptr->depth <= 40) { sound(MSG_AMBIENT_DNG2); } /* Dungeon level 41-60 */ else if (p_ptr->depth <= 60) { sound(MSG_AMBIENT_DNG3); } /* Dungeon level 61-80 */ else if (p_ptr->depth <= 80) { sound(MSG_AMBIENT_DNG4); } /* Dungeon level 80- */ else { sound(MSG_AMBIENT_DNG5); } } /* * Helper for process_world -- decrement p_ptr->timed[] fields. */ static void decrease_timeouts(void) { int adjust = (adj_con_fix[p_ptr->state.stat_ind[A_CON]] + 1); int i; /* Decrement all effects that can be done simply */ for (i = 0; i < TMD_MAX; i++) { int decr = 1; if (!p_ptr->timed[i]) continue; switch (i) { case TMD_CUT: { /* Hack -- check for truly "mortal" wound */ decr = (p_ptr->timed[i] > 1000) ? 0 : adjust; break; } case TMD_POISONED: case TMD_STUN: { decr = adjust; break; } } /* Decrement the effect */ player_dec_timed(p_ptr, i, decr, FALSE); } return; } /* * Handle certain things once every 10 game turns */ static void process_world(struct cave *c) { int i; int regen_amount; object_type *o_ptr; /* Every 10 game turns */ if (turn % 10) return; /*** Check the Time ***/ /* Play an ambient sound at regular intervals. */ if (!(turn % ((10L * TOWN_DAWN) / 4))) { play_ambient_sound(); } /*** Handle the "town" (stores and sunshine) ***/ /* While in town */ if (!p_ptr->depth) { /* Hack -- Daybreak/Nighfall in town */ if (!(turn % ((10L * TOWN_DAWN) / 2))) { bool dawn; /* Check for dawn */ dawn = (!(turn % (10L * TOWN_DAWN))); /* Day breaks */ if (dawn) msg("The sun has risen."); /* Night falls */ else msg("The sun has fallen."); /* Illuminate */ cave_illuminate(c, dawn); } } /* While in the dungeon */ else { /* Update the stores once a day (while in the dungeon). The changes are not actually made until return to town, to avoid giving details away in the knowledge menu. */ if (!(turn % (10L * STORE_TURNS))) daycount++; } /*** Process the monsters ***/ /* Check for creature generation */ if (one_in_(MAX_M_ALLOC_CHANCE)) { /* Make a new monster */ (void)pick_and_place_distant_monster(cave, loc(p_ptr->px, p_ptr->py), MAX_SIGHT + 5, FALSE, p_ptr->depth); } /* Hack -- Check for creature regeneration */ if (!(turn % 100)) regen_monsters(); /*** Damage over Time ***/ /* Take damage from poison */ if (p_ptr->timed[TMD_POISONED]) { /* Take damage */ take_hit(p_ptr, 1, "poison"); } /* Take damage from cuts */ if (p_ptr->timed[TMD_CUT]) { /* Mortal wound or Deep Gash */ if (p_ptr->timed[TMD_CUT] > 200) i = 3; /* Severe cut */ else if (p_ptr->timed[TMD_CUT] > 100) i = 2; /* Other cuts */ else i = 1; /* Take damage */ take_hit(p_ptr, i, "a fatal wound"); } /*** Check the Food, and Regenerate ***/ /* Digest normally */ if (p_ptr->food < PY_FOOD_MAX) { /* Every 100 game turns */ if (!(turn % 100)) { /* Basic digestion rate based on speed */ i = extract_energy[p_ptr->state.speed] * 2; /* Regeneration takes more food */ if (check_state(p_ptr, OF_REGEN, p_ptr->state.flags)) i += 30; /* Slow digestion takes less food */ if (check_state(p_ptr, OF_SLOW_DIGEST, p_ptr->state.flags)) i -= 10; /* Minimal digestion */ if (i < 1) i = 1; /* Digest some food */ player_set_food(p_ptr, p_ptr->food - i); } } /* Digest quickly when gorged */ else { /* Digest a lot of food */ player_set_food(p_ptr, p_ptr->food - 100); } /* Getting Faint */ if (p_ptr->food < PY_FOOD_FAINT) { /* Faint occasionally */ if (!p_ptr->timed[TMD_PARALYZED] && one_in_(10)) { /* Message */ msg("You faint from the lack of food."); disturb(p_ptr, 1, 0); /* Faint (bypass free action) */ (void)player_inc_timed(p_ptr, TMD_PARALYZED, 1 + randint0(5), TRUE, FALSE); } } /* Starve to death (slowly) */ if (p_ptr->food < PY_FOOD_STARVE) { /* Calculate damage */ i = (PY_FOOD_STARVE - p_ptr->food) / 10; /* Take damage */ take_hit(p_ptr, i, "starvation"); } /** Regenerate HP **/ /* Default regeneration */ if (p_ptr->food >= PY_FOOD_WEAK) regen_amount = PY_REGEN_NORMAL; else if (p_ptr->food < PY_FOOD_STARVE) regen_amount = 0; else if (p_ptr->food < PY_FOOD_FAINT) regen_amount = PY_REGEN_FAINT; else /* if (p_ptr->food < PY_FOOD_WEAK) */ regen_amount = PY_REGEN_WEAK; /* Various things speed up regeneration */ if (check_state(p_ptr, OF_REGEN, p_ptr->state.flags)) regen_amount *= 2; if (p_ptr->searching || p_ptr->resting) regen_amount *= 2; /* Some things slow it down */ if (check_state(p_ptr, OF_IMPAIR_HP, p_ptr->state.flags)) regen_amount /= 2; /* Various things interfere with physical healing */ if (p_ptr->timed[TMD_PARALYZED]) regen_amount = 0; if (p_ptr->timed[TMD_POISONED]) regen_amount = 0; if (p_ptr->timed[TMD_STUN]) regen_amount = 0; if (p_ptr->timed[TMD_CUT]) regen_amount = 0; /* Regenerate Hit Points if needed */ if (p_ptr->chp < p_ptr->mhp) regenhp(regen_amount); /** Regenerate SP **/ /* Default regeneration */ regen_amount = PY_REGEN_NORMAL; /* Various things speed up regeneration */ if (check_state(p_ptr, OF_REGEN, p_ptr->state.flags)) regen_amount *= 2; if (p_ptr->searching || p_ptr->resting) regen_amount *= 2; /* Some things slow it down */ if (check_state(p_ptr, OF_IMPAIR_MANA, p_ptr->state.flags)) regen_amount /= 2; /* Regenerate mana */ if (p_ptr->csp < p_ptr->msp) regenmana(regen_amount); /*** Timeout Various Things ***/ decrease_timeouts(); /*** Process Light ***/ /* Check for light being wielded */ o_ptr = &p_ptr->inventory[INVEN_LIGHT]; /* Burn some fuel in the current light */ if (o_ptr->tval == TV_LIGHT) { bitflag f[OF_SIZE]; bool burn_fuel = TRUE; /* Get the object flags */ object_flags(o_ptr, f); /* Turn off the wanton burning of light during the day in the town */ if (!p_ptr->depth && ((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2))) burn_fuel = FALSE; /* If the light has the NO_FUEL flag, well... */ if (of_has(f, OF_NO_FUEL)) burn_fuel = FALSE; /* Use some fuel (except on artifacts, or during the day) */ if (burn_fuel && o_ptr->timeout > 0) { /* Decrease life-span */ o_ptr->timeout--; /* Hack -- notice interesting fuel steps */ if ((o_ptr->timeout < 100) || (!(o_ptr->timeout % 100))) { /* Redraw stuff */ p_ptr->redraw |= (PR_EQUIP); } /* Hack -- Special treatment when blind */ if (p_ptr->timed[TMD_BLIND]) { /* Hack -- save some light for later */ if (o_ptr->timeout == 0) o_ptr->timeout++; } /* The light is now out */ else if (o_ptr->timeout == 0) { disturb(p_ptr, 0, 0); msg("Your light has gone out!"); } /* The light is getting dim */ else if ((o_ptr->timeout < 100) && (!(o_ptr->timeout % 10))) { disturb(p_ptr, 0, 0); msg("Your light is growing faint."); } } } /* Calculate torch radius */ p_ptr->update |= (PU_TORCH); /*** Process Inventory ***/ /* Handle experience draining */ if (check_state(p_ptr, OF_DRAIN_EXP, p_ptr->state.flags)) { if ((p_ptr->exp > 0) && one_in_(10)) player_exp_lose(p_ptr, 1, FALSE); wieldeds_notice_flag(p_ptr, OF_DRAIN_EXP); } /* Recharge activatable objects and rods */ recharge_objects(); /* Feel the inventory */ sense_inventory(); /*** Involuntary Movement ***/ /* Random teleportation */ if (check_state(p_ptr, OF_TELEPORT, p_ptr->state.flags) && one_in_(100)) { wieldeds_notice_flag(p_ptr, OF_TELEPORT); teleport_player(40); disturb(p_ptr, 0, 0); } /* Delayed Word-of-Recall */ if (p_ptr->word_recall) { /* Count down towards recall */ p_ptr->word_recall--; /* Activate the recall */ if (!p_ptr->word_recall) { /* Disturbing! */ disturb(p_ptr, 0, 0); /* Determine the level */ if (p_ptr->depth) { msgt(MSG_TPLEVEL, "You feel yourself yanked upwards!"); dungeon_change_level(0); } else { msgt(MSG_TPLEVEL, "You feel yourself yanked downwards!"); /* New depth - back to max depth or 1, whichever is deeper */ dungeon_change_level(p_ptr->max_depth < 1 ? 1: p_ptr->max_depth); } } } } /* * Hack -- helper function for "process_player()" * * Check for changes in the "monster memory" */ static void process_player_aux(void) { int i; bool changed = FALSE; static int old_monster_race_idx = 0; static bitflag old_flags[RF_SIZE]; static bitflag old_spell_flags[RSF_SIZE]; static byte old_blows[MONSTER_BLOW_MAX]; static byte old_cast_innate = 0; static byte old_cast_spell = 0; /* Tracking a monster */ if (p_ptr->monster_race_idx) { /* Get the monster lore */ monster_lore *l_ptr = &l_list[p_ptr->monster_race_idx]; for (i = 0; i < MONSTER_BLOW_MAX; i++) { if (old_blows[i] != l_ptr->blows[i]) { changed = TRUE; break; } } /* Check for change of any kind */ if (changed || (old_monster_race_idx != p_ptr->monster_race_idx) || !rf_is_equal(old_flags, l_ptr->flags) || !rsf_is_equal(old_spell_flags, l_ptr->spell_flags) || (old_cast_innate != l_ptr->cast_innate) || (old_cast_spell != l_ptr->cast_spell)) { /* Memorize old race */ old_monster_race_idx = p_ptr->monster_race_idx; /* Memorize flags */ rf_copy(old_flags, l_ptr->flags); rsf_copy(old_spell_flags, l_ptr->spell_flags); /* Memorize blows */ memmove(old_blows, l_ptr->blows, sizeof(byte)*MONSTER_BLOW_MAX); /* Memorize castings */ old_cast_innate = l_ptr->cast_innate; old_cast_spell = l_ptr->cast_spell; /* Redraw stuff */ p_ptr->redraw |= (PR_MONSTER); redraw_stuff(p_ptr); } } } /* * Process the player * * Notice the annoying code to handle "pack overflow", which * must come first just in case somebody manages to corrupt * the savefiles by clever use of menu commands or something. * * Notice the annoying code to handle "monster memory" changes, * which allows us to avoid having to update the window flags * every time we change any internal monster memory field, and * also reduces the number of times that the recall window must * be redrawn. * * Note that the code to check for user abort during repeated commands * and running and resting can be disabled entirely with an option, and * even if not disabled, it will only check during every 128th game turn * while resting, for efficiency. */ static void process_player(void) { int i; /*** Check for interrupts ***/ /* Complete resting */ if (p_ptr->resting < 0) { /* Basic resting */ if (p_ptr->resting == REST_ALL_POINTS) { /* Stop resting */ if ((p_ptr->chp == p_ptr->mhp) && (p_ptr->csp == p_ptr->msp)) { disturb(p_ptr, 0, 0); } } /* Complete resting */ else if (p_ptr->resting == REST_COMPLETE) { /* Stop resting */ if ((p_ptr->chp == p_ptr->mhp) && (p_ptr->csp == p_ptr->msp) && !p_ptr->timed[TMD_BLIND] && !p_ptr->timed[TMD_CONFUSED] && !p_ptr->timed[TMD_POISONED] && !p_ptr->timed[TMD_AFRAID] && !p_ptr->timed[TMD_TERROR] && !p_ptr->timed[TMD_STUN] && !p_ptr->timed[TMD_CUT] && !p_ptr->timed[TMD_SLOW] && !p_ptr->timed[TMD_PARALYZED] && !p_ptr->timed[TMD_IMAGE] && !p_ptr->word_recall) { disturb(p_ptr, 0, 0); } } /* Rest until HP or SP are filled */ else if (p_ptr->resting == REST_SOME_POINTS) { /* Stop resting */ if ((p_ptr->chp == p_ptr->mhp) || (p_ptr->csp == p_ptr->msp)) { disturb(p_ptr, 0, 0); } } } /* Check for "player abort" */ if (p_ptr->running || cmd_get_nrepeats() > 0 || (p_ptr->resting && !(turn & 0x7F))) { ui_event e; /* Do not wait */ inkey_scan = SCAN_INSTANT; /* Check for a key */ e = inkey_ex(); if (e.type != EVT_NONE) { /* Flush and disturb */ flush(); disturb(p_ptr, 0, 0); msg("Cancelled."); } } /*** Handle actual user input ***/ /* Repeat until energy is reduced */ do { /* Notice stuff (if needed) */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff (if needed) */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff (if needed) */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Place the cursor on the player */ move_cursor_relative(p_ptr->py, p_ptr->px); /* Refresh (optional) */ Term_fresh(); /* Hack -- Pack Overflow */ pack_overflow(); /* Assume free turn */ p_ptr->energy_use = 0; /* Dwarves detect treasure */ if (player_has(PF_SEE_ORE)) { /* Only if they are in good shape */ if (!p_ptr->timed[TMD_IMAGE] && !p_ptr->timed[TMD_CONFUSED] && !p_ptr->timed[TMD_AMNESIA] && !p_ptr->timed[TMD_STUN] && !p_ptr->timed[TMD_PARALYZED] && !p_ptr->timed[TMD_TERROR] && !p_ptr->timed[TMD_AFRAID]) detect_close_buried_treasure(); } /* Paralyzed or Knocked Out */ if ((p_ptr->timed[TMD_PARALYZED]) || (p_ptr->timed[TMD_STUN] >= 100)) { /* Take a turn */ p_ptr->energy_use = 100; } /* Picking up objects */ else if (p_ptr->notice & PN_PICKUP) { p_ptr->energy_use = do_autopickup() * 10; if (p_ptr->energy_use > 100) p_ptr->energy_use = 100; p_ptr->notice &= ~(PN_PICKUP); /* Appropriate time for the player to see objects */ event_signal(EVENT_SEEFLOOR); } /* Resting */ else if (p_ptr->resting) { /* Timed rest */ if (p_ptr->resting > 0) { /* Reduce rest count */ p_ptr->resting--; /* Redraw the state */ p_ptr->redraw |= (PR_STATE); } /* Take a turn */ p_ptr->energy_use = 100; /* Increment the resting counter */ p_ptr->resting_turn++; } /* Running */ else if (p_ptr->running) { /* Take a step */ run_step(0); } /* Repeated command */ else if (cmd_get_nrepeats() > 0) { /* Hack -- Assume messages were seen */ msg_flag = FALSE; /* Clear the top line */ prt("", 0, 0); /* Process the command */ process_command(CMD_GAME, TRUE); } /* Normal command */ else { /* Check monster recall */ process_player_aux(); /* Place the cursor on the player */ move_cursor_relative(p_ptr->py, p_ptr->px); /* Get and process a command */ process_command(CMD_GAME, FALSE); /* Mega hack - redraw if big graphics - sorry NRM */ if ((tile_width > 1) || (tile_height > 1)) p_ptr->redraw |= (PR_MAP); } /*** Clean up ***/ /* Significant */ if (p_ptr->energy_use) { /* Use some energy */ p_ptr->energy -= p_ptr->energy_use; /* Increment the total energy counter */ p_ptr->total_energy += p_ptr->energy_use; /* Hack -- constant hallucination */ if (p_ptr->timed[TMD_IMAGE]) { p_ptr->redraw |= (PR_MAP); } /* Shimmer multi-hued monsters */ for (i = 1; i < cave_monster_max(cave); i++) { struct monster_race *race; struct monster *mon = cave_monster(cave, i); if (!mon->r_idx) continue; race = &r_info[mon->r_idx]; if (!rf_has(race->flags, RF_ATTR_MULTI)) continue; cave_light_spot(cave, mon->fy, mon->fx); } /* Clear NICE flag, and show marked monsters */ for (i = 1; i < cave_monster_max(cave); i++) { struct monster *mon = cave_monster(cave, i); mon->mflag &= ~MFLAG_NICE; if (mon->mflag & MFLAG_MARK) { if (!(mon->mflag & MFLAG_SHOW)) { mon->mflag &= ~MFLAG_MARK; update_mon(i, FALSE); } } } } /* Clear SHOW flag */ for (i = 1; i < cave_monster_max(cave); i++) { struct monster *mon = cave_monster(cave, i); mon->mflag &= ~MFLAG_SHOW; } /* HACK: This will redraw the itemlist too frequently, but I'm don't know all the individual places it should go. */ p_ptr->redraw |= PR_ITEMLIST; } while (!p_ptr->energy_use && !p_ptr->leaving); /* Notice stuff (if needed) */ if (p_ptr->notice) notice_stuff(p_ptr); } byte flicker = 0; byte color_flicker[MAX_COLORS][3] = { {TERM_DARK, TERM_L_DARK, TERM_L_RED}, {TERM_WHITE, TERM_L_WHITE, TERM_L_BLUE}, {TERM_SLATE, TERM_WHITE, TERM_L_DARK}, {TERM_ORANGE, TERM_YELLOW, TERM_L_RED}, {TERM_RED, TERM_L_RED, TERM_L_PINK}, {TERM_GREEN, TERM_L_GREEN, TERM_L_TEAL}, {TERM_BLUE, TERM_L_BLUE, TERM_SLATE}, {TERM_UMBER, TERM_L_UMBER, TERM_MUSTARD}, {TERM_L_DARK, TERM_SLATE, TERM_L_VIOLET}, {TERM_WHITE, TERM_SLATE, TERM_L_WHITE}, {TERM_L_PURPLE, TERM_PURPLE, TERM_L_VIOLET}, {TERM_YELLOW, TERM_L_YELLOW, TERM_MUSTARD}, {TERM_L_RED, TERM_RED, TERM_L_PINK}, {TERM_L_GREEN, TERM_L_TEAL, TERM_GREEN}, {TERM_L_BLUE, TERM_DEEP_L_BLUE, TERM_BLUE_SLATE}, {TERM_L_UMBER, TERM_UMBER, TERM_MUD}, {TERM_PURPLE, TERM_VIOLET, TERM_MAGENTA}, {TERM_VIOLET, TERM_L_VIOLET, TERM_MAGENTA}, {TERM_TEAL, TERM_L_TEAL, TERM_L_GREEN}, {TERM_MUD, TERM_YELLOW, TERM_UMBER}, {TERM_L_YELLOW, TERM_WHITE, TERM_L_UMBER}, {TERM_MAGENTA, TERM_L_PINK, TERM_L_RED}, {TERM_L_TEAL, TERM_L_WHITE, TERM_TEAL}, {TERM_L_VIOLET, TERM_L_PURPLE, TERM_VIOLET}, {TERM_L_PINK, TERM_L_RED, TERM_L_WHITE}, {TERM_MUSTARD, TERM_YELLOW, TERM_UMBER}, {TERM_BLUE_SLATE, TERM_BLUE, TERM_SLATE}, {TERM_DEEP_L_BLUE, TERM_L_BLUE, TERM_BLUE}, }; static byte get_flicker(byte a) { switch(flicker % 3) { case 1: return color_flicker[a][1]; case 2: return color_flicker[a][2]; } return a; } /* * This animates monsters and/or items as necessary. */ static void do_animation(void) { int i; for (i = 1; i < cave_monster_max(cave); i++) { byte attr; monster_type *m_ptr = cave_monster(cave, i); monster_race *r_ptr = &r_info[m_ptr->r_idx]; if (!m_ptr || !m_ptr->ml) continue; else if (rf_has(r_ptr->flags, RF_ATTR_MULTI)) attr = randint1(BASIC_COLORS - 1); else if (rf_has(r_ptr->flags, RF_ATTR_FLICKER)) attr = get_flicker(r_ptr->x_attr); else continue; m_ptr->attr = attr; p_ptr->redraw |= (PR_MAP | PR_MONLIST); } flicker++; } /* * This is used when the user is idle to allow for simple animations. * Currently the only thing it really does is animate shimmering monsters. */ void idle_update(void) { if (!character_dungeon) return; if (!OPT(animate_flicker)) return; /* Animate and redraw if necessary */ do_animation(); redraw_stuff(p_ptr); /* Refresh the main screen */ Term_fresh(); } /* * Interact with the current dungeon level. * * This function will not exit until the level is completed, * the user dies, or the game is terminated. */ static void dungeon(struct cave *c) { monster_type *m_ptr; int i; /* Hack -- enforce illegal panel */ Term->offset_y = DUNGEON_HGT; Term->offset_x = DUNGEON_WID; /* Not leaving */ p_ptr->leaving = FALSE; /* Reset the "command" vars */ p_ptr->command_arg = 0; /* Cancel the target */ target_set_monster(0); /* Cancel the health bar */ health_track(p_ptr, 0); /* Disturb */ disturb(p_ptr, 1, 0); /* Track maximum player level */ if (p_ptr->max_lev < p_ptr->lev) { p_ptr->max_lev = p_ptr->lev; } /* Track maximum dungeon level */ if (p_ptr->max_depth < p_ptr->depth) { p_ptr->max_depth = p_ptr->depth; } /* If autosave is pending, do it now. */ if (p_ptr->autosave) { /* The borg runs so quickly that this is a bad idea. */ #ifndef ALLOW_BORG save_game(); #endif p_ptr->autosave = FALSE; } /* Choose panel */ verify_panel(); /* Flush messages */ message_flush(); /* Hack -- Increase "xtra" depth */ character_xtra++; /* Clear */ Term_clear(); /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Calculate torch radius */ p_ptr->update |= (PU_TORCH); /* Update stuff */ update_stuff(p_ptr); /* Fully update the visuals (and monster distances) */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_DISTANCE); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Redraw dungeon */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP); /* Redraw "statusy" things */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP | PR_MONSTER | PR_MONLIST | PR_ITEMLIST); /* Update stuff */ update_stuff(p_ptr); /* Redraw stuff */ redraw_stuff(p_ptr); /* Hack -- Decrease "xtra" depth */ character_xtra--; /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Combine / Reorder the pack */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Make basic mouse buttons */ (void) button_add("[ESC]", ESCAPE); (void) button_add("[Ret]", '\r'); (void) button_add("[Spc]", ' '); (void) button_add("[Rpt]", 'n'); (void) button_add("[Std]", ','); /* Redraw buttons */ p_ptr->redraw |= (PR_BUTTONS); /* Notice stuff */ notice_stuff(p_ptr); /* Update stuff */ update_stuff(p_ptr); /* Redraw stuff */ redraw_stuff(p_ptr); /* Refresh */ Term_fresh(); /* Handle delayed death */ if (p_ptr->is_dead) return; /* Announce (or repeat) the feeling */ if (p_ptr->depth) display_feeling(FALSE); /* Give player minimum energy to start a new level, but do not reduce higher value from savefile for level in progress */ if (p_ptr->energy < INITIAL_DUNGEON_ENERGY) p_ptr->energy = INITIAL_DUNGEON_ENERGY; /*** Process this dungeon level ***/ /* Main loop */ while (TRUE) { /* Hack -- Compact the monster list occasionally */ if (cave_monster_count(cave) + 32 > z_info->m_max) compact_monsters(64); /* Hack -- Compress the monster list occasionally */ if (cave_monster_count(cave) + 32 < cave_monster_max(cave)) compact_monsters(0); /* Hack -- Compact the object list occasionally */ if (o_cnt + 32 > z_info->o_max) compact_objects(64); /* Hack -- Compress the object list occasionally */ if (o_cnt + 32 < o_max) compact_objects(0); /* Can the player move? */ while ((p_ptr->energy >= 100) && !p_ptr->leaving) { /* Do any necessary animations */ do_animation(); /* process monster with even more energy first */ process_monsters(c, (byte)(p_ptr->energy + 1)); /* if still alive */ if (!p_ptr->leaving) { /* Mega hack -redraw big graphics - sorry NRM */ if ((tile_width > 1) || (tile_height > 1)) p_ptr->redraw |= (PR_MAP); /* Process the player */ process_player(); } } /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Hack -- Highlight the player */ move_cursor_relative(p_ptr->py, p_ptr->px); /* Handle "leaving" */ if (p_ptr->leaving) break; /* Process all of the monsters */ process_monsters(c, 100); /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Hack -- Highlight the player */ move_cursor_relative(p_ptr->py, p_ptr->px); /* Handle "leaving" */ if (p_ptr->leaving) break; /* Process the world */ process_world(c); /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Hack -- Highlight the player */ move_cursor_relative(p_ptr->py, p_ptr->px); /* Handle "leaving" */ if (p_ptr->leaving) break; /*** Apply energy ***/ /* Give the player some energy */ p_ptr->energy += extract_energy[p_ptr->state.speed]; /* Give energy to all monsters */ for (i = cave_monster_max(cave) - 1; i >= 1; i--) { int mspeed; /* Access the monster */ m_ptr = cave_monster(cave, i); /* Ignore "dead" monsters */ if (!m_ptr->r_idx) continue; /* Calculate the net speed */ mspeed = m_ptr->mspeed; if (m_ptr->m_timed[MON_TMD_FAST]) mspeed += 10; if (m_ptr->m_timed[MON_TMD_SLOW]) mspeed -= 10; /* Give this monster some energy */ m_ptr->energy += extract_energy[mspeed]; } /* Count game turns */ turn++; } } /* * Process some user pref files */ static void process_some_user_pref_files(void) { char buf[1024]; /* Process the "user.prf" file */ (void)process_pref_file("user.prf", TRUE, TRUE); /* Get the "PLAYER.prf" filename */ (void)strnfmt(buf, sizeof(buf), "%s.prf", op_ptr->base_name, TRUE); /* Process the "PLAYER.prf" file */ (void)process_pref_file(buf, TRUE, TRUE); } /* * Actually play a game. * * This function is called from a variety of entry points, since both * the standard "main.c" file, as well as several platform-specific * "main-xxx.c" files, call this function to start a new game with a * new savefile, start a new game with an existing savefile, or resume * a saved game with an existing savefile. * * If the "new_game" parameter is true, and the savefile contains a * living character, then that character will be killed, so that the * player may start a new game with that savefile. This is only used * by the "-n" option in "main.c". * * If the savefile does not exist, cannot be loaded, or contains a dead * character, then a new game will be started. * * Several platforms (Windows, Macintosh, Amiga) start brand new games * with "savefile" and "op_ptr->base_name" both empty, and initialize * them later based on the player name. To prevent weirdness, we must * initialize "op_ptr->base_name" to "PLAYER" if it is empty. * * Note that we load the RNG state from savefiles (2.8.0 or later) and * so we only initialize it if we were unable to load it. The loading * code marks successful loading of the RNG state using the "Rand_quick" * flag, which is a hack, but which optimizes loading of savefiles. */ void play_game(void) { /* Initialize */ bool new_game = init_angband(); /*** Do horrible, hacky things, to start the game off ***/ /* Hack -- Increase "icky" depth */ character_icky++; /* Verify main term */ if (!term_screen) quit("main window does not exist"); /* Make sure main term is active */ Term_activate(term_screen); /* Verify minimum size */ if ((Term->hgt < 24) || (Term->wid < 80)) quit("main window is too small"); /* Hack -- Turn off the cursor */ (void)Term_set_cursor(FALSE); /*** Try to load the savefile ***/ p_ptr->is_dead = TRUE; if (savefile[0] && file_exists(savefile)) { if (!savefile_load(savefile)) quit("broken savefile"); if (p_ptr->is_dead && arg_wizard) { p_ptr->is_dead = FALSE; p_ptr->chp = p_ptr->mhp; p_ptr->noscore |= NOSCORE_WIZARD; } } /* No living character loaded */ if (p_ptr->is_dead) { /* Make new player */ new_game = TRUE; /* The dungeon is not ready */ character_dungeon = FALSE; } /* Hack -- Default base_name */ if (!op_ptr->base_name[0]) my_strcpy(op_ptr->base_name, "PLAYER", sizeof(op_ptr->base_name)); /* Init RNG */ if (Rand_quick) { u32b seed; /* Basic seed */ seed = (time(NULL)); #ifdef SET_UID /* Mutate the seed on Unix machines */ seed = ((seed >> 3) * (getpid() << 1)); #endif /* Use the complex RNG */ Rand_quick = FALSE; /* Seed the "complex" RNG */ Rand_state_init(seed); } /* Roll new character */ if (new_game) { /* The dungeon is not ready */ character_dungeon = FALSE; /* Start in town */ p_ptr->depth = 0; /* Hack -- seed for flavors */ seed_flavor = randint0(0x10000000); /* Hack -- seed for town layout */ seed_town = randint0(0x10000000); /* Hack -- seed for random artifacts */ seed_randart = randint0(0x10000000); /* Roll up a new character. Quickstart is allowed if ht_birth is set */ player_birth(p_ptr->ht_birth ? TRUE : FALSE); /* Randomize the artifacts if required */ if (OPT(birth_randarts) && (!OPT(birth_keep_randarts) || !p_ptr->randarts)) { do_randart(seed_randart, TRUE); p_ptr->randarts = TRUE; } } /* Initialize temporary fields sensibly */ p_ptr->object_idx = p_ptr->object_kind_idx = NO_OBJECT; p_ptr->monster_race_idx = 0; /* Normal machine (process player name) */ if (savefile[0]) process_player_name(FALSE); /* Weird machine (process player name, pick savefile name) */ else process_player_name(TRUE); /* Stop the player being quite so dead */ p_ptr->is_dead = FALSE; /* Flash a message */ prt("Please wait...", 0, 0); /* Allow big cursor */ smlcurs = FALSE; /* Flush the message */ Term_fresh(); /* Flavor the objects */ flavor_init(); /* Reset visuals */ reset_visuals(TRUE); /* Tell the UI we've started. */ event_signal(EVENT_ENTER_GAME); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP | PR_MONSTER | PR_MESSAGE); redraw_stuff(p_ptr); /* Process some user pref files */ process_some_user_pref_files(); /* React to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Generate a dungeon level if needed */ if (!character_dungeon) cave_generate(cave, p_ptr); /* Character is now "complete" */ character_generated = TRUE; /* Hack -- Decrease "icky" depth */ character_icky--; /* Start playing */ p_ptr->playing = TRUE; /* Save not required yet. */ p_ptr->autosave = FALSE; /* Hack -- Enforce "delayed death" */ if (p_ptr->chp < 0) p_ptr->is_dead = TRUE; /* Process */ while (TRUE) { /* Play ambient sound on change of level. */ play_ambient_sound(); /* Process the level */ dungeon(cave); /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Cancel the target */ target_set_monster(0); /* Cancel the health bar */ health_track(p_ptr, 0); /* Forget the view */ forget_view(); /* Handle "quit and save" */ if (!p_ptr->playing && !p_ptr->is_dead) break; /* XXX XXX XXX */ message_flush(); /* Accidental Death */ if (p_ptr->playing && p_ptr->is_dead) { /* XXX-elly: this does not belong here. Refactor or * remove. Very similar to do_cmd_wiz_cure_all(). */ if ((p_ptr->wizard || OPT(cheat_live)) && !get_check("Die? ")) { /* Mark social class, reset age, if needed */ if (p_ptr->sc) p_ptr->sc = p_ptr->age = 0; /* Increase age */ p_ptr->age++; /* Mark savefile */ p_ptr->noscore |= NOSCORE_WIZARD; /* Message */ msg("You invoke wizard mode and cheat death."); message_flush(); /* Cheat death */ p_ptr->is_dead = FALSE; /* Restore hit points */ p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; /* Restore spell points */ p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; /* Hack -- Healing */ (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_clear_timed(p_ptr, TMD_PARALYZED, TRUE); (void)player_clear_timed(p_ptr, TMD_IMAGE, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); /* Hack -- Prevent starvation */ player_set_food(p_ptr, PY_FOOD_MAX - 1); /* Hack -- cancel recall */ if (p_ptr->word_recall) { /* Message */ msg("A tension leaves the air around you..."); message_flush(); /* Hack -- Prevent recall */ p_ptr->word_recall = 0; } /* Note cause of death XXX XXX XXX */ my_strcpy(p_ptr->died_from, "Cheating death", sizeof(p_ptr->died_from)); /* New depth */ p_ptr->depth = 0; /* Leaving */ p_ptr->leaving = TRUE; } } /* Handle "death" */ if (p_ptr->is_dead) break; /* Make a new level */ cave_generate(cave, p_ptr); } /* Disallow big cursor */ smlcurs = TRUE; /* Tell the UI we're done with the game state */ event_signal(EVENT_LEAVE_GAME); /* Close stuff */ close_game(); } angband-v3.3.2/src/tests/0000755000175000017500000000000011651552410014540 5ustar chriscchriscangband-v3.3.2/src/tests/monster/0000755000175000017500000000000011651552410016227 5ustar chriscchriscangband-v3.3.2/src/tests/monster/attack.c0000644000175000017500000000557311651552410017654 0ustar chriscchrisc/* monster/attack */ #include "unit-test.h" #include "unit-test-data.h" #include "monster/monster.h" int setup_tests(void **state) { struct monster_race *r = &test_r_human; struct monster *m = mem_zalloc(sizeof *m); m->race = r; m->r_idx = r->ridx; r_info = r; *state = m; p_ptr = NULL; rand_fix(100); return 0; } NOTEARDOWN static int mdam(struct monster *m) { return m->race->blow[0].d_dice; } static int take1(struct player *p, struct monster *m, int blow, int eff) { int old, new; m->race->blow[0].effect = eff; m->race->blow[0].method = blow; p->chp = p->mhp; old = p->chp; testfn_make_attack_normal(m, p); new = p->chp; p->chp = p->mhp; return old - new; } static int test_blows(void *state) { struct monster *m = state; struct player *p = &test_player; int delta; flags_set(m->race->flags, RF_SIZE, RF_NEVER_BLOW, FLAG_END); delta = take1(p, m, RBM_HIT, RBE_HURT); flags_clear(m->race->flags, RF_SIZE, RF_NEVER_BLOW, FLAG_END); eq(delta, 0); delta = take1(p, m, RBM_HIT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_TOUCH, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_PUNCH, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_KICK, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_CLAW, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_BITE, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_STING, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_BUTT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_CRUSH, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_ENGULF, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_CRAWL, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_DROOL, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_SPIT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_GAZE, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_WAIL, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_SPORE, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_BEG, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_INSULT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_MOAN, RBE_HURT); eq(delta, mdam(m)); ok; } static int test_effects(void *state) { struct monster *m = state; struct player *p = &test_player; int delta; require(!p->timed[TMD_POISONED]); delta = take1(p, m, RBM_HIT, RBE_POISON); require(p->timed[TMD_POISONED]); delta = take1(p, m, RBM_HIT, RBE_ACID); require(delta > 0); delta = take1(p, m, RBM_HIT, RBE_ELEC); require(delta > 0); delta = take1(p, m, RBM_HIT, RBE_FIRE); require(delta > 0); delta = take1(p, m, RBM_HIT, RBE_COLD); require(delta > 0); require(!p->timed[TMD_BLIND]); delta = take1(p, m, RBM_HIT, RBE_BLIND); require(p->timed[TMD_BLIND]); ok; } const char *suite_name = "monster/attack"; const struct test tests[] = { { "blows", test_blows }, { "effects", test_effects }, { NULL, NULL }, }; angband-v3.3.2/src/tests/monster/suite.mk0000644000175000017500000000005411651552410017710 0ustar chriscchriscTESTPROGS += monster/attack monster/monster angband-v3.3.2/src/tests/monster/monster.c0000644000175000017500000000227411651552410020067 0ustar chriscchrisc/* monster/monster * * Tests for monster/monster?.c * * Created by: myshkin * 26 Apr 2011 */ #include "unit-test.h" #include "unit-test-data.h" #include "test-utils.h" #include "monster/mon-util.h" int setup_tests(void **state) { read_edit_files(); *state = 0; return 0; } int teardown_tests(void *state) { mem_free(state); return 0; } /* Regression test for #1409 */ int test_match_monster_bases(void *state) { struct monster_base *base; /* Scruffy little dog */ base = (&r_info[3])->base; require(match_monster_bases(base, "canine", NULL)); require(match_monster_bases(base, "zephyr hound", "canine", NULL)); require(!match_monster_bases(base, "angel", NULL)); require(!match_monster_bases(base, "lich", "vampire", "wraith", NULL)); /* Morgoth */ base = (&r_info[547])->base; require(!match_monster_bases(base, "canine", NULL)); require(!match_monster_bases(base, "lich", "vampire", "wraith", NULL)); require(match_monster_bases(base, "person", "Morgoth", NULL)); require(match_monster_bases(base, "Morgoth", NULL)); ok; } const char *suite_name = "monster/monster"; struct test tests[] = { { "match_monster_bases", test_match_monster_bases }, { NULL, NULL } }; angband-v3.3.2/src/tests/run-tests0000755000175000017500000000605411651552410016437 0ustar chriscchrisc#!/usr/bin/perl # # by Erik Osheim use warnings FATAL => 'all'; use strict; use File::Basename qw(dirname basename); use List::Util qw(first max); use Getopt::Long qw(:config bundling no_ignore_case); # some nice global variables my $quiet = 0; my $verbose = $ENV{VERBOSE}; my $usecolor = 1; sub usage { my $prog = basename($0); print < yellow >= 90% > red sub getcolor { my ($pass, $total) = @_; my $perc = $total ? ($pass * 100) / $total : 100; return $pass == $total ? \&green : $perc >= 90 ? \&yellow : \&red; } sub main { GetOptions( 'help|h' => sub { usage(0) }, 'color|c' => sub { $usecolor = 1 }, 'no-color|C' => sub { $usecolor = 0 }, 'verbose|v' => sub { $verbose = 1; $quiet = 0 }, 'quiet|q' => sub { $quiet = 1; $verbose = 0 }, ) || usage(1); my $dir = dirname($0) . '/bin'; my @paths = `find $dir -mindepth 2 -maxdepth 2 -type f -perm -u+x`; my $pass = 0; my $total = 0; my $maxpath = (max map { length($_) } @paths) - 3; my $len = $maxpath + 1 + 7; print "Running ", scalar(@paths), " suites:\n" unless $quiet; foreach my $path (sort @paths) { chomp $path; # actually run the test program here, getting the lines of output my @lines = $verbose ? `$path -v` : `$path`; if ($? != 0) { print red("$path: Suite died"), "\n"; next; } unless ($lines[-1] =~ m#^([^:]+) finished: (\d+)/(\d+) passed$#) { print red("$path: Malformed output"), "\n"; next; } # tally the results $pass += $2; $total += $3; next if $quiet; # print a one-line summary of what happened my $ns = "$2/$3"; my $pad = $len - length($1) - length($ns); my $color = getcolor($2, $3); if ($verbose) { print ' ', $_ for @lines[0..$#lines - 1]; print ' ', $1, ' finished: ', &$color($ns), " passed\n"; } else { print ' ', $1, ' ' x $pad, &$color($ns), " passed\n"; } } # print a summary of all the test results my $color = getcolor($pass, $total); my $ns = join('', &$color("$pass/$total")); my $ps = join('', &$color(sprintf("%.1f%%", ($total ? ($pass * 100) / $total : 100)))); printf("Total: %s passed (%s)\n", $ns, $ps); } main(); angband-v3.3.2/src/tests/Makefile0000644000175000017500000000127111651552410016201 0ustar chriscchrisc# Makefile for tests - builds unit-test binaries CFLAGS+=-I../ -I. -g LDFLAGS+=-lm -include config all : run SUITES := $(shell find . -maxdepth 1 -mindepth 1 -type d) SUITES := $(filter-out ./bin,$(SUITES)) include $(patsubst %,%/suite.mk,$(SUITES)) TESTOBJS := $(patsubst %,%.o,$(TESTPROGS)) TESTPROGS := $(patsubst %,bin/%,$(TESTPROGS)) TESTOBJS += test-utils.o unit-test.o build : $(TESTPROGS) run : build @./run-tests %.o : %.c @$(CC) $(CFLAGS) -c -o $@ $^ bin/% : %.o ../angband.o test-utils.o unit-test.o @mkdir -p $(shell echo "$$(dirname $@)") @$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) @echo " CC $@" clean : $(RM) $(TESTPROGS) $(TESTOBJS) .PHONY : all clean .PRECIOUS : %.o angband-v3.3.2/src/tests/test-utils.c0000644000175000017500000000164111651552410017023 0ustar chriscchrisc/* test-utils.c * * Utility functions for tests * * Created by: myshkin * 26 Apr 2011 */ #include "h-basic.h" #include "config.h" #include "init.h" #include "z-util.h" /* * Call this function to simulate init_stuff() and populate the *_info arrays */ void read_edit_files(void) { char configpath[512], libpath[512], datapath[512]; my_strcpy(configpath, DEFAULT_CONFIG_PATH, sizeof(configpath)); my_strcpy(libpath, DEFAULT_CONFIG_PATH, sizeof(libpath)); my_strcpy(datapath, DEFAULT_CONFIG_PATH, sizeof(datapath)); configpath[511] = libpath[511] = datapath[511] = '\0'; if (!suffix(configpath, PATH_SEP)) my_strcat(configpath, PATH_SEP, sizeof(configpath)); if (!suffix(libpath, PATH_SEP)) my_strcat(libpath, PATH_SEP, sizeof(libpath)); if (!suffix(datapath, PATH_SEP)) my_strcat(datapath, PATH_SEP, sizeof(datapath)); init_file_paths(configpath, libpath, datapath); init_arrays(); } angband-v3.3.2/src/tests/README0000644000175000017500000000253111651552410015421 0ustar chriscchriscelly/angband unit tests This directory contains the unit tests for the Angband engine. As we refactor the engine to be more modular, the number of tests will grow. A unit test is a C program which links against angband.o and tests the desired functions. To make writing these tests easier, there is a header file (at /src/tests/unit-test.h) which defines a particular main function which runs a set of specified tests in sequence. Using unit-test.h: To use this test template, your test needs to supply four things: static struct test tests[]: A list of all the tests to run, terminated by a test with a null name. static int setup(void **data): A function to set up this suite of tests; may do something like preallocate file handles and such. The `data` argument points to a pointer which is supplied to all unit test functions and the teardown function. static int teardown(void *data): Clean up after the test; close file handles, etc. static const char *suite_name: The test suite name. For examples, see the /src/tests/trivial. Using unit-test-data.h: Since we're testing a game engine, many times we will need dummy races, classes, etc to pass in to functions we'd like to test. Creating these is time-consuming since some of the structures involved are fairly large; unit-test-data.h defines test objects of most types to ease this pain. angband-v3.3.2/src/tests/unit-test-data.h0000644000175000017500000001676411651552410017572 0ustar chriscchrisc/* unit-test-data.h * Predefined data for tests */ #ifndef UNIT_TEST_DATA #define UNIT_TEST_DATA #ifndef TEST_DATA #ifdef __GNUC__ #define TEST_DATA __attribute__ ((unused)) #else #define TEST_DATA #endif #endif /* TEST_DATA */ #include "angband.h" #include "object/tvalsval.h" #include "player/types.h" static struct player_sex TEST_DATA test_sex = { .title = "Test Sex", .winner = "Test Winner", }; static struct object_base TEST_DATA sword_base = { .name = "Test Sword", .tval = TV_SWORD, .next = NULL, .break_perc = 50, }; static struct artifact TEST_DATA test_artifact_sword = { .name = "Test Artifact", .text = "A test artifact.", .aidx = 0, .next = NULL, .tval = TV_SWORD, .sval = SV_LONG_SWORD, .to_a = 1, .to_h = 2, .to_d = 3, .ac = 5, .dd = 2, .ds = 5, .weight = 16, .cost = 40, }; static struct object_kind TEST_DATA test_longsword = { .name = "Test Longsword", .text = "A test longsword [0].", .base = &sword_base, .kidx = 0, .tval = TV_SWORD, .sval = SV_LONG_SWORD, .pval = { { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 1, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 1, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 2, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 4, .ds = 6, .weight = 16, .cost = 20, .d_attr = 0, .d_char = '|', .alloc_prob = 20, .alloc_min = 1, .alloc_max = 10, .level = 0, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct object_kind TEST_DATA test_torch = { .name = "Test Torch", .text = "A test torch [1].", .kidx = 1, .tval = TV_LIGHT, .sval = SV_LIGHT_TORCH, .pval = { { .base = 5000, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 1, .ds = 1, .weight = 10, .cost = 1, .d_attr = 0, .d_char = '~', .alloc_prob = 10, .alloc_min = 1, .alloc_max = 10, .level = 0, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct object_kind TEST_DATA test_gold = { .name = "Test Gold", .text = "Test gold [2].", .kidx = 2, .tval = TV_GOLD, .sval = 0, .pval = { { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 1, .ds = 1, .weight = 1, .cost = 0, .d_attr = 0, .d_char = '$', .alloc_prob = 0, .alloc_min = 0, .alloc_max = 0, .level = 0, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct player_race TEST_DATA test_race = { .name = "TestRace", .r_adj = { [A_STR] = +2, [A_DEX] = +1, [A_CON] = +3, [A_INT] = -1, [A_WIS] = -2, [A_CHR] = +0, }, .r_skills = { [SKILL_DISARM] = 0, [SKILL_DEVICE] = 5, [SKILL_SAVE] = 10, [SKILL_STEALTH] = -5, [SKILL_SEARCH] = -10, [SKILL_SEARCH_FREQUENCY] = 10, [SKILL_TO_HIT_MELEE] = 0, [SKILL_TO_HIT_BOW] = 0, [SKILL_TO_HIT_THROW] = 0, [SKILL_DIGGING] = 0, }, .r_mhp = 10, .r_exp = 110, .b_age = 14, .m_age = 6, .m_b_ht = 72, .m_m_ht = 6, .f_b_ht = 66, .f_m_ht = 4, .m_b_wt = 180, .m_m_wt = 25, .f_b_wt = 150, .f_m_wt = 20, .infra = 40, .choice = 0xFF, .history = NULL, }; static struct start_item TEST_DATA start_torch = { .kind = &test_torch, .min = 3, .max = 5, .next = NULL, }; static struct start_item TEST_DATA start_longsword = { .kind = &test_longsword, .min = 1, .max = 1, .next = &start_torch, }; static struct player_class TEST_DATA test_class = { .name = "TestClass", .title = { "TestTitle0", "TestTitle1", "TestTitle2", "TestTitle3", "TestTitle4", "TestTitle5", "TestTitle6", "TestTitle7", "TestTitle8", "TestTitle9", }, .c_adj = { [A_STR] = +1, [A_DEX] = +2, [A_CON] = -1, [A_INT] = -2, [A_WIS] = +3, [A_CHR] = +0, }, .c_skills = { [SKILL_DISARM] = 25, [SKILL_DEVICE] = 18, [SKILL_SAVE] = 18, [SKILL_STEALTH] = 1, [SKILL_SEARCH] = 14, [SKILL_SEARCH_FREQUENCY] = 2, [SKILL_TO_HIT_MELEE] = 70, [SKILL_TO_HIT_BOW] = 55, [SKILL_TO_HIT_THROW] = 55, [SKILL_DIGGING] = 0, }, .x_skills = { [SKILL_DISARM] = 10, [SKILL_DEVICE] = 7, [SKILL_SAVE] = 10, [SKILL_STEALTH] = 0, [SKILL_SEARCH] = 0, [SKILL_SEARCH_FREQUENCY] = 0, [SKILL_TO_HIT_MELEE] = 45, [SKILL_TO_HIT_BOW] = 45, [SKILL_TO_HIT_THROW] = 45, [SKILL_DIGGING] = 0, }, .c_mhp = 9, .c_exp = 0, .max_attacks = 6, .min_weight = 30, .att_multiply = 5, .spell_book = 0, .spell_stat = 0, .spell_first = 0, .spell_weight = 0, .sense_base = 7000, .sense_div = 40, .start_items = &start_longsword, }; static struct monster_base TEST_DATA test_rb_info = { .next = NULL, .name = "townsfolk", .text = "Townsfolk", .flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .spell_flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .d_char = 116, .pain = NULL, }; #define _NOBLOW { .method = RBM_NONE, .effect = RBE_NONE, .d_dice = 0, .d_side = 0 } static struct monster_race TEST_DATA test_r_human = { .next = NULL, .ridx = 0, .name = "Human", .text = "A random test human", .base = &test_rb_info, .avg_hp = 10, .ac = 12, .sleep = 0, .aaf = 20, .speed = 110, .mexp = 50, .power = 1, .scaled_power = 1, .highest_threat = 5, .freq_innate = 0, .freq_spell = 0, .blow = { { .method = RBM_HIT, .effect = RBE_HURT, .d_dice = 3, .d_side = 1, }, _NOBLOW, _NOBLOW, _NOBLOW, }, .level = 1, .rarity = 1, .d_attr = 0, .d_char = 't', .x_attr = 0, .x_char = 't', .max_num = 100, .cur_num = 0, .drops = NULL, }; #undef _NOBLOW static struct maxima TEST_DATA test_z_info = { .f_max = 2, .k_max = 2, .a_max = 2, .e_max = 2, .r_max = 2, .mp_max = 2, .s_max = 2, .pit_max = 2, .o_max = 2, .m_max = 2, }; static struct object TEST_DATA test_inven[ALL_INVEN_TOTAL]; static struct player TEST_DATA test_player = { .py = 1, .px = 1, .psex = 0, .sex = &test_sex, .race = &test_race, .class = &test_class, .hitdie = 10, .expfact = 100, .age = 12, .ht = 40, .wt = 80, .sc = 100, .au = 500, .max_depth = 10, .depth = 6, .max_lev = 3, .lev = 3, .max_exp = 100, .exp = 80, .mhp = 20, .chp = 14, .msp = 12, .csp = 11, .stat_max = { [A_STR] = 14, [A_DEX] = 12, [A_CON] = 14, [A_WIS] = 10, [A_INT] = 8, [A_CHR] = 12, }, .stat_cur = { [A_STR] = 14, [A_DEX] = 11, [A_CON] = 14, [A_WIS] = 10, [A_INT] = 8, [A_CHR] = 8, }, .word_recall = 0, .energy = 100, .food = 5000, .player_hp = { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250 }, .history = "no history", .is_dead = 0, .wizard = 0, .inventory = &test_inven[0], }; #endif /* !UNIT_TEST_DATA */ angband-v3.3.2/src/tests/z-virt/0000755000175000017500000000000011651552410015773 5ustar chriscchriscangband-v3.3.2/src/tests/z-virt/suite.mk0000644000175000017500000000004611651552410017455 0ustar chriscchriscTESTPROGS += z-virt/mem z-virt/string angband-v3.3.2/src/tests/z-virt/mem.c0000644000175000017500000000106311651552410016715 0ustar chriscchrisc/* z-virt/mem */ #include "unit-test.h" #include "z-virt.h" NOSETUP NOTEARDOWN int test_alloc(void *state) { void *p1 = mem_alloc(16); void *p2 = mem_alloc(16); require(p1 != p2); memset(p1, 0x1, 16); memset(p2, 0x2, 16); mem_free(p1); mem_free(p2); return 0; } int test_realloc(void *state) { void *p1 = mem_realloc(NULL, 32); void *p2 = mem_realloc(p1, 64); memset(p2, 0x3, 64); mem_free(p2); return 0; } const char *suite_name = "z-virt/mem"; struct test tests[] = { { "alloc", test_alloc }, { "realloc", test_realloc }, { NULL, NULL } }; angband-v3.3.2/src/tests/z-virt/string.c0000644000175000017500000000254111651552410017447 0ustar chriscchrisc/* z-virt/string.c */ #include "unit-test.h" #include "z-virt.h" NOSETUP NOTEARDOWN int test_string_make(void *state) { char *s1 = string_make("foo"); require(s1); require(!strcmp(s1, "foo")); string_free(s1); ok; } int test_string_make_null(void *state) { char *s1 = string_make(NULL); require(!s1); ok; } int test_string_free_null(void *state) { string_free(NULL); ok; } int test_string_append(void *state) { char *s1 = string_make("foo"); char *s3 = string_append(s1, "bar"); require(s3); require(!strcmp(s3, "foobar")); string_free(s3); ok; } int test_string_append_null0(void *state) { char *r = string_append(NULL, "foo"); require(r); require(!strcmp(r, "foo")); string_free(r); ok; } int test_string_append_null1(void *state) { char *s = string_make("bar"); char *r = string_append(s, NULL); require(r); require(!strcmp(r, "bar")); string_free(r); ok; } int test_string_append_null2(void *state) { char *r = string_append(NULL, NULL); require(!r); ok; } const char *suite_name = "z-virt/string"; struct test tests[] = { { "make", test_string_make }, { "make-null", test_string_make_null }, { "free-null", test_string_free_null }, { "append", test_string_append }, { "append-null0", test_string_append_null0 }, { "append-null1", test_string_append_null1 }, { "append-null2", test_string_append_null2 }, { NULL, NULL } }; angband-v3.3.2/src/tests/trivial/0000755000175000017500000000000011651552410016212 5ustar chriscchriscangband-v3.3.2/src/tests/trivial/suite.mk0000644000175000017500000000003511651552410017672 0ustar chriscchriscTESTPROGS += trivial/trivial angband-v3.3.2/src/tests/trivial/trivial.c0000644000175000017500000000046011651552410020030 0ustar chriscchrisc/* trivial/trivial.c */ #include "unit-test.h" NOSETUP NOTEARDOWN int test_empty(void *state) { ok; } int test_require(void *state) { require(1); ok; } const char *suite_name = "trivial/trivial"; struct test tests[] = { { "empty", test_empty }, { "require", test_require }, { NULL, NULL }, }; angband-v3.3.2/src/tests/parse/0000755000175000017500000000000011651552410015652 5ustar chriscchriscangband-v3.3.2/src/tests/parse/names.c0000644000175000017500000000145511651552410017126 0ustar chriscchrisc/* parse/names */ #include "unit-test.h" #include "init.h" int setup_tests(void **state) { *state = init_parse_names(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { errr r = parser_parse(state, "N:1"); eq(r, 0); ok; } int test_d0(void *state) { errr r = parser_parse(state, "D:foo"); eq(r, 0); r = parser_parse(state, "D:bar"); eq(r, 0); ok; } int test_n1(void *state) { errr r = parser_parse(state, "N:2"); eq(r, 0); ok; } int test_d1(void *state) { errr r = parser_parse(state, "D:baz"); eq(r, 0); r = parser_parse(state, "D:quxx"); eq(r, 0); ok; } const char *suite_name = "parse/names"; struct test tests[] = { { "n0", test_n0 }, { "d0", test_d0 }, { "n1", test_n1 }, { "d1", test_d1 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/s-info.c0000644000175000017500000000210511651552410017207 0ustar chriscchrisc/* parse/s-info */ #include "unit-test.h" #include "init.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_s(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:Detect Monsters"); struct spell *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); eq(s->sidx, 1); require(streq(s->name, "Detect Monsters")); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:90:0:1"); struct spell *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); eq(s->tval, 90); eq(s->sval, 0); eq(s->snum, 1); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:Teleports you randomly."); struct spell *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); require(streq(s->text, "Teleports you randomly.")); ok; } const char *suite_name = "parse/s-info"; struct test tests[] = { { "n0", test_n0 }, { "i0", test_i0 }, { "d0", test_d0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/r-info.c0000644000175000017500000000644111651552410017215 0ustar chriscchrisc/* parse/r-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" #include "monster/constants.h" #include "monster/monster.h" #include "types.h" #include "externs.h" int setup_tests(void **state) { *state = init_parse_r(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:544:Carcharoth, the Jaws of Thirst"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->ridx, 544); require(streq(mr->name, "Carcharoth, the Jaws of Thirst")); ok; } int test_t0(void *state) { enum parser_error r; struct monster_race *mr; rb_info = &test_rb_info; r = parser_parse(state, "T:townsfolk"); eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(streq(mr->base->name, "townsfolk")); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:v"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->d_attr, TERM_VIOLET); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:7:500:80:22:3"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->speed, 7); eq(mr->avg_hp, 500); eq(mr->aaf, 80); eq(mr->ac, 22); eq(mr->sleep, 3); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:42:11:27:4"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->level, 42); eq(mr->rarity, 11); eq(mr->power, 27); eq(mr->mexp, 4); ok; } int test_b0(void *state) { enum parser_error r = parser_parse(state, "B:CLAW:FIRE:9d12"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(mr->blow[0].method); require(mr->blow[0].effect); eq(mr->blow[0].d_dice, 9); eq(mr->blow[0].d_side, 12); ok; } int test_b1(void *state) { enum parser_error r = parser_parse(state, "B:BITE:FIRE:6d8"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(mr->blow[1].method); require(mr->blow[1].effect); eq(mr->blow[1].d_dice, 6); eq(mr->blow[1].d_side, 8); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:UNIQUE | MALE"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(mr->flags); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:foo bar "); enum parser_error s = parser_parse(state, "D: baz"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); eq(s, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(streq(mr->text, "foo bar baz")); ok; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:1_IN_4 | BR_DARK | S_HOUND"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->freq_spell, 25); eq(mr->freq_innate, 25); require(mr->spell_flags); ok; } const char *suite_name = "parse/r-info"; struct test tests[] = { { "n0", test_n0 }, { "c0", test_c0 }, { "t0", test_t0 }, { "i0", test_i0 }, { "w0", test_w0 }, { "b0", test_b0 }, { "b1", test_b1 }, { "f0", test_f0 }, { "d0", test_d0 }, { "s0", test_s0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/suite.mk0000644000175000017500000000056511651552410017342 0ustar chriscchriscTESTPROGS += parse/a-info \ parse/c-info \ parse/e-info \ parse/f-info \ parse/flavor \ parse/h-info \ parse/names \ parse/parser \ parse/k-info \ parse/owner \ parse/p-info \ parse/r-info \ parse/s-info \ parse/store \ parse/v-info \ parse/z-info angband-v3.3.2/src/tests/parse/p-info.c0000644000175000017500000000650611651552410017215 0ustar chriscchrisc/* parse/p-info */ #include "unit-test.h" #include "init.h" #include "player/types.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_p(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:Half-Elf"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->ridx, 1); require(streq(pr->name, "Half-Elf")); ok; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:1:-1:2:-2:3:-3"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->r_adj[A_STR], 1); eq(pr->r_adj[A_INT], -1); eq(pr->r_adj[A_WIS], 2); eq(pr->r_adj[A_DEX], -2); eq(pr->r_adj[A_CON], 3); eq(pr->r_adj[A_CHR], -3); ok; } int test_r0(void *state) { enum parser_error r = parser_parse(state, "R:1:3:5:7:9:2:4:6:8:10"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->r_skills[SKILL_DISARM], 1); eq(pr->r_skills[SKILL_DEVICE], 3); eq(pr->r_skills[SKILL_SAVE], 5); eq(pr->r_skills[SKILL_STEALTH], 7); eq(pr->r_skills[SKILL_SEARCH], 9); eq(pr->r_skills[SKILL_SEARCH_FREQUENCY], 2); eq(pr->r_skills[SKILL_TO_HIT_MELEE], 4); eq(pr->r_skills[SKILL_TO_HIT_BOW], 6); eq(pr->r_skills[SKILL_TO_HIT_THROW], 8); eq(pr->r_skills[SKILL_DIGGING], 10); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:10:20:80"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->r_mhp, 10); eq(pr->r_exp, 20); eq(pr->infra, 80); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:0:10:3"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); ptreq(pr->history, NULL); eq(pr->b_age, 10); eq(pr->m_age, 3); ok; } int test_h0(void *state) { enum parser_error r = parser_parse(state, "H:10:2:11:3"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->m_b_ht, 10); eq(pr->m_m_ht, 2); eq(pr->f_b_ht, 11); eq(pr->f_m_ht, 3); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:80:10:75:7"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->m_b_wt, 80); eq(pr->m_m_wt, 10); eq(pr->f_b_wt, 75); eq(pr->f_m_wt, 7); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:SUST_DEX"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); require(pr->flags); ok; } int test_y0(void *state) { enum parser_error r = parser_parse(state, "Y:KNOW_ZAPPER"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); require(pr->pflags); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:1|3|5"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->choice, (1 << 5) | (1 << 3) | (1 << 1)); ok; } const char *suite_name = "parse/p-info"; struct test tests[] = { { "n0", test_n0 }, { "s0", test_s0 }, { "r0", test_r0 }, { "x0", test_x0 }, { "i0", test_i0 }, { "h0", test_h0 }, { "w0", test_w0 }, { "f0", test_f0 }, { "y0", test_y0 }, { "c0", test_c0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/c-info.c0000644000175000017500000001055511651552410017177 0ustar chriscchrisc/* parse/c-info */ #include "unit-test.h" #include "init.h" #include "object/obj-flag.h" #include "object/object.h" #include "object/tvalsval.h" #include "player/types.h" int setup_tests(void **state) { *state = init_parse_c(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:4:Ranger"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->cidx, 4); require(streq(c->name, "Ranger")); ok; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:3:-3:2:-2:1:-1"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->c_adj[A_STR], 3); eq(c->c_adj[A_INT], -3); eq(c->c_adj[A_WIS], 2); eq(c->c_adj[A_DEX], -2); eq(c->c_adj[A_CON], 1); eq(c->c_adj[A_CHR], -1); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:30:32:28:3:24:16:56:72:72:0"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->c_skills[SKILL_DISARM], 30); eq(c->c_skills[SKILL_DEVICE], 32); eq(c->c_skills[SKILL_SAVE], 28); eq(c->c_skills[SKILL_STEALTH], 3); eq(c->c_skills[SKILL_SEARCH], 24); eq(c->c_skills[SKILL_SEARCH_FREQUENCY], 16); eq(c->c_skills[SKILL_TO_HIT_MELEE], 56); eq(c->c_skills[SKILL_TO_HIT_BOW], 72); eq(c->c_skills[SKILL_TO_HIT_THROW], 72); eq(c->c_skills[SKILL_DIGGING], 0); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:8:10:10:0:0:0:30:45:45:0"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->x_skills[SKILL_DISARM], 8); eq(c->x_skills[SKILL_DEVICE], 10); eq(c->x_skills[SKILL_SAVE], 10); eq(c->x_skills[SKILL_STEALTH], 0); eq(c->x_skills[SKILL_SEARCH], 0); eq(c->x_skills[SKILL_SEARCH_FREQUENCY], 0); eq(c->x_skills[SKILL_TO_HIT_MELEE], 30); eq(c->x_skills[SKILL_TO_HIT_BOW], 45); eq(c->x_skills[SKILL_TO_HIT_THROW], 45); eq(c->x_skills[SKILL_DIGGING], 0); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:4:30:20000:40"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->c_mhp, 4); eq(c->c_exp, 30); eq(c->sense_base, 20000); eq(c->sense_div, 40); ok; } int test_a0(void *state) { enum parser_error r = parser_parse(state, "A:5:35:4"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->max_attacks, 5); eq(c->min_weight, 35); eq(c->att_multiply, 4); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:90:1:3:400"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->spell_book, 90); eq(c->spell_stat, 1); eq(c->spell_first, 3); eq(c->spell_weight, 400); ok; } int test_b0(void *state) { enum parser_error r = parser_parse(state, "B:8:23:25:90:3"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->spells.info[8].slevel, 23); eq(c->spells.info[8].smana, 25); eq(c->spells.info[8].sfail, 90); eq(c->spells.info[8].sexp, 3); ok; } int test_t0(void *state) { enum parser_error r0 = parser_parse(state, "T:Runner"); enum parser_error r1 = parser_parse(state, "T:Strider"); struct player_class *c; eq(r0, PARSE_ERROR_NONE); eq(r1, PARSE_ERROR_NONE); c = parser_priv(state); require(c); require(streq(c->title[0], "Runner")); require(streq(c->title[1], "Strider")); ok; } /* Causes segfault: lookup_sval() requires z_info/k_info */ int test_e0(void *state) { enum parser_error r = parser_parse(state, "E:magic book:2:2:5"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); ptreq(c->start_items[0].kind, objkind_get(TV_MAGIC_BOOK, 2)); eq(c->start_items[0].min, 2); eq(c->start_items[0].max, 5); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:CUMBER_GLOVE | CHOOSE_SPELLS"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); require(c->pflags); ok; } const char *suite_name = "parse/c-info"; struct test tests[] = { { "n0", test_n0 }, { "s0", test_s0 }, { "c0", test_c0 }, { "x0", test_x0 }, { "i0", test_i0 }, { "a0", test_a0 }, { "m0", test_m0 }, { "b0", test_b0 }, { "t0", test_t0 }, /* { "e0", test_e0 }, */ { "f0", test_f0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/f-info.c0000644000175000017500000000372111651552410017177 0ustar chriscchrisc/* parse/f-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_f(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:3:Test Feature"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); require(streq(f->name, "Test Feature")); eq(f->fidx, 3); eq(f->mimic, 3); ok; } int test_g0(void *state) { enum parser_error r = parser_parse(state, "G:::red"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->d_char, ':'); eq(f->d_attr, TERM_RED); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:11"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->mimic, 11); ok; } int test_p0(void *state) { enum parser_error r = parser_parse(state, "P:2"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->priority, 2); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:MWALK | LOOK"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); require(f->flags); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:3:5:9:2"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->locked, 3); eq(f->jammed, 5); eq(f->shopnum, 9); eq(f->dig, 2); ok; } int test_e0(void *state) { enum parser_error r = parser_parse(state, "E:TRAP_PIT"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); require(f->effect); ok; } const char *suite_name = "parse/f-info"; struct test tests[] = { { "n0", test_n0 }, { "g0", test_g0 }, { "m0", test_m0 }, { "p0", test_p0 }, { "f0", test_f0 }, { "x0", test_x0 }, { "e0", test_e0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/parser.c0000644000175000017500000002302111651552410017310 0ustar chriscchrisc/* parse/parser */ #include "unit-test.h" #include "parser.h" int setup_tests(void **state) { struct parser *p = parser_new(); if (!p) return 1; *state = p; return 0; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_blank(void *state) { eq(parser_parse(state, ""), PARSE_ERROR_NONE); ok; } int test_spaces(void *state) { eq(parser_parse(state, " "), PARSE_ERROR_NONE); ok; } int test_comment0(void *state) { eq(parser_parse(state, "# foo"), PARSE_ERROR_NONE); ok; } int test_comment1(void *state) { eq(parser_parse(state, " # bar"), PARSE_ERROR_NONE); ok; } int test_priv(void *state) { ptreq(parser_priv(state), 0); parser_setpriv(state, (void*)0x42); ptreq(parser_priv(state), (void*)0x42); ok; } int test_reg0(void *state) { errr r = parser_reg(state, "", ignored); eq(r, -EINVAL); ok; } int test_reg1(void *state) { errr r = parser_reg(state, " ", ignored); eq(r, -EINVAL); ok; } int test_reg2(void *state) { errr r = parser_reg(state, "abc int", ignored); eq(r, -EINVAL); ok; } int test_reg3(void *state) { errr r = parser_reg(state, "abc notype name", ignored); eq(r, -EINVAL); ok; } int test_reg4(void *state) { errr r = parser_reg(state, "abc int a ?int b int c", ignored); eq(r, -EINVAL); ok; } int test_reg5(void *state) { errr r = parser_reg(state, "abc str foo int bar", ignored); eq(r, -EINVAL); ok; } int test_reg_int(void *state) { errr r = parser_reg(state, "test-reg-int int foo", ignored); eq(r, 0); ok; } int test_reg_sym(void *state) { errr r = parser_reg(state, "test-reg-sym sym bar", ignored); eq(r, 0); ok; } int test_reg_str(void *state) { errr r = parser_reg(state, "test-reg-str str baz", ignored); eq(r, 0); ok; } static enum parser_error helper_sym0(struct parser *p) { const char *s = parser_getsym(p, "foo"); int *wasok = parser_priv(p); if (!s || strcmp(s, "bar")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_sym0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-sym0 sym foo", helper_sym0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-sym0:bar"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_sym1(struct parser *p) { const char *s = parser_getsym(p, "foo"); const char *t = parser_getsym(p, "baz"); int *wasok = parser_priv(p); if (!s || !t || strcmp(s, "bar") || strcmp(t, "quxx")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_sym1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-sym1 sym foo sym baz", helper_sym1); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-sym1:bar:quxx"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_int0(struct parser *p) { int s = parser_getint(p, "i0"); int t = parser_getint(p, "i1"); int *wasok = parser_priv(p); *wasok = (s == 42 && t == 81); return PARSE_ERROR_NONE; } int test_int0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-int0 int i0 int i1", helper_int0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-int0:42:81"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_int1(struct parser *p) { int v = parser_getint(p, "i0"); int *wasok = parser_priv(p); *wasok = (v == -3); return PARSE_ERROR_NONE; } int test_int1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-int1 int i0", helper_int1); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-int1:-3"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_str0(struct parser *p) { const char *s = parser_getstr(p, "s0"); int *wasok = parser_priv(p); if (!s || strcmp(s, "foo:bar:baz quxx...")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_str0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-str0 str s0", helper_str0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-str0:foo:bar:baz quxx..."); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } int test_syntax0(void *state) { struct parser_state s; int v; errr r = parser_reg(state, "test-syntax0 str s0", ignored); eq(r, 0); r = parser_parse(state, "test-syntax0"); eq(r, PARSE_ERROR_MISSING_FIELD); v = parser_getstate(state, &s); require(v); eq(s.line, 5); eq(s.col, 2); ok; } int test_syntax1(void *state) { struct parser_state s; int v; errr r = parser_reg(state, "test-syntax1 int i0", ignored); eq(r, 0); r = parser_parse(state, "test-syntax1:a"); eq(r, PARSE_ERROR_NOT_NUMBER); v = parser_getstate(state, &s); require(v); eq(s.line, 6); eq(s.col, 2); ok; } int test_syntax2(void *state) { struct parser_state s; int v; errr r = parser_reg(state, "test-syntax2 int i0 sym s1", ignored); eq(r, 0); r = parser_parse(state, "test-syntax2::test"); eq(r, PARSE_ERROR_NOT_NUMBER); v = parser_getstate(state, &s); require(v); eq(s.line, 7); eq(s.col, 2); ok; } int test_baddir(void *state) { errr r = parser_parse(state, "test-baddir"); eq(r, PARSE_ERROR_UNDEFINED_DIRECTIVE); ok; } static enum parser_error helper_rand0(struct parser *p) { struct random v = parser_getrand(p, "r0"); int *wasok = parser_priv(p); if (v.dice != 2 || v.sides != 3) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_rand0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-rand0 rand r0", helper_rand0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-rand0:2d3"); eq(r, 0); eq(wasok, 1); ok; } static enum parser_error helper_rand1(struct parser *p) { struct random v = parser_getrand(p, "r0"); struct random u = parser_getrand(p, "r1"); int *wasok = parser_priv(p); if (v.dice != 2 || v.sides != 3 || u.dice != 4 || u.sides != 5) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_rand1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-rand1 rand r0 rand r1", helper_rand1); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-rand1:2d3:4d5"); eq(r, 0); eq(wasok, 1); ok; } static enum parser_error helper_opt0(struct parser *p) { const char *s0 = parser_getsym(p, "s0"); const char *s1 = parser_hasval(p, "s1") ? parser_getsym(p, "s1") : NULL; int *wasok = parser_priv(p); if (!s0 || strcmp(s0, "foo")) return PARSE_ERROR_GENERIC; if (s1 && !strcmp(s1, "bar")) *wasok = 2; else *wasok = 1; return PARSE_ERROR_NONE; } int test_opt0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-opt0 sym s0 ?sym s1", helper_opt0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-opt0:foo"); eq(r, 0); eq(wasok, 1); require(parser_hasval(state, "s0")); require(!parser_hasval(state, "s1")); r = parser_parse(state, "test-opt0:foo:bar"); eq(r, 0); eq(wasok, 2); require(parser_hasval(state, "s0")); require(parser_hasval(state, "s1")); ok; } static enum parser_error helper_uint0(struct parser *p) { unsigned int a = parser_getuint(p, "u0"); int *wasok = parser_priv(p); if (a != 42) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_uint0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-uint0 uint u0", helper_uint0); enum parser_error e; eq(r, 0); parser_setpriv(state, &wasok); e = parser_parse(state, "test-uint0:42"); eq(e, PARSE_ERROR_NONE); eq(wasok, 1); ok; } int test_uint1(void *state) { errr r = parser_reg(state, "test-uint1 uint u0", ignored); enum parser_error e = parser_parse(state, "test-uint1:-2"); eq(r, 0); eq(e, PARSE_ERROR_NOT_NUMBER); ok; } static enum parser_error helper_char0(struct parser *p) { char c = parser_getchar(p, "c"); int *wasok = parser_priv(p); if (c != 'C') return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_char0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-char0 char c", helper_char0); enum parser_error e; eq(r, 0); parser_setpriv(state, &wasok); e = parser_parse(state, "test-char0:C"); eq(e, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_char1(struct parser *p) { char c0 = parser_getchar(p, "c0"); char c1 = parser_getchar(p, "c1"); int i0 = parser_getint(p, "i0"); const char *s = parser_getstr(p, "s"); int *wasok = parser_priv(p); if (c0 != ':' || c1 != ':' || i0 != 34 || !streq(s, "lala")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_char1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-char1 char c0 int i0 char c1 str s", helper_char1); enum parser_error e; eq(r, 0); parser_setpriv(state, &wasok); e = parser_parse(state, "test-char1:::34:::lala"); eq(e, PARSE_ERROR_NONE); eq(wasok, 1); ok; } const char *suite_name = "parse/parser"; struct test tests[] = { { "priv", test_priv }, { "reg0", test_reg0 }, { "reg1", test_reg1 }, { "reg2", test_reg2 }, { "reg3", test_reg3 }, { "reg4", test_reg4 }, { "reg5", test_reg5 }, { "reg-int", test_reg_int }, { "reg-sym", test_reg_sym }, { "reg-str", test_reg_str }, { "blank", test_blank }, { "spaces", test_spaces }, { "comment0", test_comment0 }, { "comment1", test_comment1 }, { "syntax0", test_syntax0 }, { "syntax1", test_syntax1 }, { "syntax2", test_syntax2 }, { "sym0", test_sym0 }, { "sym1", test_sym1 }, { "int0", test_int0 }, { "int1", test_int1 }, { "str0", test_str0 }, { "rand0", test_rand0 }, { "rand1", test_rand1 }, { "opt0", test_opt0 }, { "uint0", test_uint0 }, { "uint1", test_uint1 }, { "char0", test_char0 }, { "char1", test_char1 }, { "baddir", test_baddir }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/h-info.c0000644000175000017500000000165111651552410017201 0ustar chriscchrisc/* parse/h-info */ #include "unit-test.h" #include "init.h" #include "player/types.h" int setup_tests(void **state) { *state = init_parse_h(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:3:5:2"); struct history_chart *c; struct history_entry *e; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); e = c->entries; require(e); eq(c->idx, 1); ptreq(e->next, NULL); ptreq(e->roll, 5); ptreq(e->bonus, 2); eq(e->isucc, 3); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:hello there"); struct history_chart *h; eq(r, PARSE_ERROR_NONE); h = parser_priv(state); require(h); require(streq(h->entries->text, "hello there")); ok; } const char *suite_name = "parse/h-info"; struct test tests[] = { { "n0", test_n0 }, { "d0", test_d0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/e-info.c0000644000175000017500000000653711651552410017206 0ustar chriscchrisc/* parse/e-info */ #include "unit-test.h" #include "unit-test-data.h" #include "object/tvalsval.h" #include "init.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_e(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_order(void *state) { enum parser_error r = parser_parse(state, "X:3:4"); eq(r, PARSE_ERROR_MISSING_RECORD_HEADER); ok; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:5:of Resist Lightning"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->eidx, 5); require(streq(e->name, "of Resist Lightning")); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:2:4:6:8"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->level, 2); eq(e->rarity, 4); eq(e->cost, 8); return PARSE_ERROR_NONE; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:5:1"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->rating, 5); eq(e->xtra, 1); ok; } int test_t0(void *state) { enum parser_error r = parser_parse(state, "T:22:2:13"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->tval[0], 22); eq(e->min_sval[0], 2); eq(e->max_sval[0], 13); ok; } /* Broken: lookup_sval() requires k_info, z_info */ int test_t1(void *state) { enum parser_error r = parser_parse(state, "T:sword:dagger:scimitar"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->tval[1], TV_SWORD); eq(e->min_sval[1], SV_DAGGER); eq(e->max_sval[1], SV_SCIMITAR); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:1d2:3d4:5d6"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->to_h.dice, 1); eq(e->to_h.sides, 2); eq(e->to_d.dice, 3); eq(e->to_d.sides, 4); eq(e->to_a.dice, 5); eq(e->to_a.sides, 6); ok; } int test_l0(void *state) { enum parser_error r = parser_parse(state, "L:1+2d3M4:5:STR | INT"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->pval[0].base, 1); eq(e->pval[0].dice, 2); eq(e->pval[0].sides, 3); eq(e->pval[0].m_bonus, 4); eq(e->min_pval[0], 5); require(e->pval_flags[0]); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:10:13:4"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->min_to_h, 10); eq(e->min_to_d, 13); eq(e->min_to_a, 4); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:SEE_INVIS"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); require(e->flags); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:foo"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); r = parser_parse(state, "D: bar"); eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); require(streq(e->text, "foo bar")); ok; } const char *suite_name = "parse/e-info"; struct test tests[] = { { "order", test_order }, { "n0", test_n0 }, { "w0", test_w0 }, { "x0", test_x0 }, { "t0", test_t0 }, /* { "t1", test_t1 }, */ { "c0", test_c0 }, { "m0", test_m0 }, { "f0", test_f0 }, { "d0", test_d0 }, { "l0", test_l0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/k-info.c0000644000175000017500000000740711651552410017211 0ustar chriscchrisc/* parse/k-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_k(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { errr r = parser_parse(state, "N:3:Test Object Kind"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->kidx, 3); require(streq(k->name, "Test Object Kind")); ok; } int test_g0(void *state) { errr r = parser_parse(state, "G:~:red"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->d_char, '~'); eq(k->d_attr, TERM_RED); ok; } int test_g1(void *state) { errr r = parser_parse(state, "G:!:W"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->d_char, '!'); eq(k->d_attr, TERM_L_WHITE); ok; } int test_i0(void *state) { errr r = parser_parse(state, "I:4:2"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->tval, 4); eq(k->sval, 2); ok; } int test_i1(void *state) { errr r = parser_parse(state, "I:food:2"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->tval, TV_FOOD); eq(k->sval, 2); ok; } int test_w0(void *state) { errr r = parser_parse(state, "W:10:0:5:120"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->level, 10); eq(k->weight, 5); eq(k->cost, 120); ok; } int test_a0(void *state) { errr r = parser_parse(state, "A:3:4 to 6"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->alloc_prob, 3); eq(k->alloc_min, 4); eq(k->alloc_max, 6); ok; } int test_p0(void *state) { errr r = parser_parse(state, "P:3:4d8:1d4:2d5:7d6"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->ac, 3); eq(k->dd, 4); eq(k->ds, 8); eq(k->to_h.dice, 1); eq(k->to_h.sides, 4); eq(k->to_d.dice, 2); eq(k->to_d.sides, 5); eq(k->to_a.dice, 7); eq(k->to_a.sides, 6); ok; } int test_c0(void *state) { errr r = parser_parse(state, "C:2d8"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->charge.dice, 2); eq(k->charge.sides, 8); ok; } int test_m0(void *state) { errr r = parser_parse(state, "M:4:3d6"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->gen_mult_prob, 4); eq(k->stack_size.dice, 3); eq(k->stack_size.sides, 6); ok; } int test_f0(void *state) { errr r = parser_parse(state, "F:STR"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); require(k->flags); ok; } int test_l0(void *state) { errr r = parser_parse(state, "L:1+2d3M4:STR | INT"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->pval[0].base, 1); eq(k->pval[0].dice, 2); eq(k->pval[0].sides, 3); eq(k->pval[0].m_bonus, 4); require(k->pval_flags[0]); ok; } int test_e0(void *state) { errr r = parser_parse(state, "E:POISON:4d5"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); require(k->effect); eq(k->time.dice, 4); eq(k->time.sides, 5); ok; } int test_d0(void *state) { errr r = parser_parse(state, "D:foo bar"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); require(k->text); require(streq(k->text, "foo bar")); r = parser_parse(state, "D: baz"); eq(r, 0); ptreq(k, parser_priv(state)); require(streq(k->text, "foo bar baz")); ok; } const char *suite_name = "parse/k-info"; struct test tests[] = { { "n0", test_n0 }, { "g0", test_g0 }, { "g1", test_g1 }, { "i0", test_i0 }, { "i1", test_i1 }, { "w0", test_w0 }, { "a0", test_a0 }, { "p0", test_p0 }, { "c0", test_c0 }, { "m0", test_m0 }, { "f0", test_f0 }, { "e0", test_e0 }, { "d0", test_d0 }, { "l0", test_l0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/flavor.c0000644000175000017500000000271411651552410017313 0ustar chriscchrisc/* parse/flavor.c */ #include "unit-test.h" #include "init.h" #include "object/tvalsval.h" #include "object/obj-flag.h" #include "object/object.h" #include "z-term.h" int setup_tests(void **state) { *state = init_parse_flavor(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:3:5"); struct flavor *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->fidx, 1); eq(f->tval, 3); eq(f->sval, 5); ok; } int test_n1(void *state) { enum parser_error r = parser_parse(state, "N:2:light"); struct flavor *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->fidx, 2); eq(f->tval, TV_LIGHT); eq(f->sval, SV_UNKNOWN); ok; } int test_g0(void *state) { enum parser_error r = parser_parse(state, "G:!:y"); struct flavor *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->fidx, 2); eq(f->d_char, '!'); eq(f->d_attr, TERM_YELLOW); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:foo"); struct flavor *f; eq(r, PARSE_ERROR_NONE); r = parser_parse(state, "D: bar"); eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); require(streq(f->text, "foo bar")); eq(f->fidx, 2); ok; } const char *suite_name = "parse/flavor"; struct test tests[] = { { "n0", test_n0 }, { "n1", test_n1 }, { "g0", test_g0 }, { "d0", test_d0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/store.c0000644000175000017500000000150511651552410017153 0ustar chriscchrisc/* parse/store */ #include "unit-test.h" #include "store.h" int setup_tests(void **state) { *state = store_parser_new(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:2:33"); struct store *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); eq(s->sidx, 1); eq(s->table_size, 33); ok; } /* Causes segfault: lookup_name() requires z_info/k_info */ int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:2:3:5"); struct store *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); require(s->table[0]); require(s->table[1]); ok; } const char *suite_name = "parse/store"; struct test tests[] = { { "s0", test_s0 }, /* { "i0", test_i0 }, */ { NULL, NULL } }; angband-v3.3.2/src/tests/parse/a-info.c0000644000175000017500000000766111651552410017201 0ustar chriscchrisc/* parse/a-info */ #include "unit-test.h" #include "unit-test-data.h" #include "object/tvalsval.h" #include "init.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_a(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:3:of Thrain"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->aidx, 3); require(streq(a->name, "of Thrain")); ok; } int test_badtval0(void *state) { enum parser_error r = parser_parse(state, "I:badtval:6:3"); eq(r, PARSE_ERROR_UNRECOGNISED_TVAL); ok; } int test_badtval1(void *state) { enum parser_error r = parser_parse(state, "I:-1:6:3"); eq(r, PARSE_ERROR_UNRECOGNISED_TVAL); ok; } /* Causes segfault: lookup_sval() requires z_info/k_info */ int test_badsval(void *state) { errr r = parser_parse(state, "I:light:badsval:3"); eq(r, PARSE_ERROR_UNRECOGNISED_SVAL); ok; } int test_badsval1(void *state) { enum parser_error r = parser_parse(state, "I:light:-2:3"); eq(r, PARSE_ERROR_UNRECOGNISED_SVAL); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:light:6"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->tval, TV_LIGHT); eq(a->sval, 6); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:3:5:8:200"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->level, 3); eq(a->rarity, 5); eq(a->weight, 8); eq(a->cost, 200); ok; } int test_a0(void *state) { enum parser_error r = parser_parse(state, "A:3:5"); eq(r, PARSE_ERROR_GENERIC); ok; } int test_a1(void *state) { enum parser_error r = parser_parse(state, "A:3:5 to 300"); eq(r, PARSE_ERROR_OUT_OF_BOUNDS); ok; } int test_a2(void *state) { enum parser_error r = parser_parse(state, "A:3:5 to 10"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->alloc_prob, 3); eq(a->alloc_min, 5); eq(a->alloc_max, 10); ok; } int test_p0(void *state) { enum parser_error r = parser_parse(state, "P:3:4d5:8:2:1"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->ac, 3); eq(a->dd, 4); eq(a->ds, 5); eq(a->to_h, 8); eq(a->to_d, 2); eq(a->to_a, 1); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:SEE_INVIS | HOLD_LIFE"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); require(a->flags); ok; } int test_l0(void *state) { enum parser_error r = parser_parse(state, "L:17:STR | CON"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); eq(a->pval[0], 17); require(a->pval_flags[0]); ok; } int test_e0(void *state) { enum parser_error r = parser_parse(state, "E:DETECT_ALL:20+d30"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); require(a->effect); eq(a->time.base, 20); eq(a->time.sides, 30); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:foo"); struct artifact *a; eq(r, 0); r = parser_parse(state, "M:bar"); eq(r, 0); a = parser_priv(state); require(a); require(streq(a->effect_msg, "foobar")); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:baz"); struct artifact *a; eq(r, 0); r = parser_parse(state, "D: quxx"); eq(r, 0); a = parser_priv(state); require(a); require(streq(a->text, "baz quxx")); ok; } const char *suite_name = "parse/a-info"; struct test tests[] = { { "n0", test_n0 }, { "badtval0", test_badtval0 }, { "badtval1", test_badtval1 }, /* { "badsval0", test_badsval0 }, */ { "badsval1", test_badsval1 }, { "i0", test_i0 }, { "w0", test_w0 }, { "a0", test_a0 }, { "a1", test_a1 }, { "a2", test_a2 }, { "p0", test_p0 }, { "f0", test_f0 }, { "e0", test_e0 }, { "m0", test_m0 }, { "d0", test_d0 }, { "l0", test_l0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/v-info.c0000644000175000017500000000217411651552410017220 0ustar chriscchrisc/* parse/v-info */ #include "unit-test.h" #include "init.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_v(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:round"); struct vault *v; eq(r, PARSE_ERROR_NONE); v = parser_priv(state); require(v); eq(v->vidx, 1); require(streq(v->name, "round")); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:6:5:12:20"); struct vault *v; eq(r, PARSE_ERROR_NONE); v = parser_priv(state); require(v); eq(v->typ, 6); eq(v->rat, 5); eq(v->hgt, 12); eq(v->wid, 20); ok; } int test_d0(void *state) { enum parser_error r0 = parser_parse(state, "D: %% "); enum parser_error r1 = parser_parse(state, "D: % % "); struct vault *v; eq(r0, PARSE_ERROR_NONE); eq(r1, PARSE_ERROR_NONE); v = parser_priv(state); require(v); require(streq(v->text, " %% % % ")); ok; } const char *suite_name = "parse/v-info"; struct test tests[] = { { "n0", test_n0 }, { "x0", test_x0 }, { "d0", test_d0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/owner.c0000644000175000017500000000253611651552410017156 0ustar chriscchrisc/* parse/owner */ #include "unit-test.h" #include "store.h" struct store s0; struct store s1; int setup_tests(void **state) { s0.next = &s1; s1.next = NULL; s0.sidx = 0; s1.sidx = 1; *state = store_owner_parser_new(&s0); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:0"); eq(r, PARSE_ERROR_NONE); require(parser_priv(state)); ok; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:5000:Foo"); eq(r, PARSE_ERROR_NONE); eq(s0.owners->max_cost, 5000); require(streq(s0.owners->name, "Foo")); ok; } int test_s1(void *state) { enum parser_error r = parser_parse(state, "S:10000:Bar"); eq(r, PARSE_ERROR_NONE); eq(s0.owners->max_cost, 10000); require(streq(s0.owners->name, "Bar")); ok; } int test_n1(void *state) { enum parser_error r = parser_parse(state, "N:1"); eq(r, PARSE_ERROR_NONE); require(parser_priv(state)); ok; } int test_s2(void *state) { enum parser_error r = parser_parse(state, "S:15000:Baz"); eq(r, PARSE_ERROR_NONE); eq(s1.owners->max_cost, 15000); require(streq(s1.owners->name, "Baz")); ok; } const char *suite_name = "parse/owner"; struct test tests[] = { { "n0", test_n0 }, { "s0", test_s0 }, { "s1", test_s1 }, { "n1", test_n1 }, { "s2", test_s2 }, { NULL, NULL } }; angband-v3.3.2/src/tests/parse/z-info.c0000644000175000017500000000235311651552410017223 0ustar chriscchrisc/* parse/z-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" #include "types.h" int setup_tests(void **state) { *state = init_parse_z(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_negative(void *state) { errr r = parser_parse(state, "M:F:-1"); eq(r, PARSE_ERROR_INVALID_VALUE); ok; } int test_badmax(void *state) { errr r = parser_parse(state, "M:D:1"); eq(r, PARSE_ERROR_UNDEFINED_DIRECTIVE); ok; } #define TEST_MAX(l,u) \ int test_##l(void *s) { \ maxima *m = parser_priv(s); \ char buf[64]; \ errr r; \ snprintf(buf, sizeof(buf), "M:%c:%d", u, __LINE__); \ r = parser_parse(s, buf); \ eq(m->l, __LINE__); \ eq(r, 0); \ ok; \ } TEST_MAX(f_max, 'F') TEST_MAX(k_max, 'K') TEST_MAX(a_max, 'A') TEST_MAX(e_max, 'E') TEST_MAX(r_max, 'R') TEST_MAX(s_max, 'S') TEST_MAX(o_max, 'O') TEST_MAX(m_max, 'M') const char *suite_name = "parse/z-info"; struct test tests[] = { { "negative", test_negative }, { "badmax", test_badmax }, { "fmax", test_f_max }, { "kmax", test_k_max }, { "amax", test_a_max }, { "emax", test_e_max }, { "rmax", test_r_max }, { "smax", test_s_max }, { "omax", test_o_max }, { "mmax", test_m_max }, { NULL, NULL } }; angband-v3.3.2/src/tests/command/0000755000175000017500000000000011651552410016156 5ustar chriscchriscangband-v3.3.2/src/tests/command/lookup.c0000644000175000017500000000163111651552410017634 0ustar chriscchrisc/* command/lookup * * Tests for command lookup * * Created by: myshkin * 1 May 2011 */ #include "unit-test.h" #include "object/obj-flag.h" #include "object/object.h" #include "cmds.h" #include "ui-event.h" #include "z-virt.h" int setup_tests(void **state) { cmd_init(); *state = 0; return 0; } int teardown_tests(void *state) { mem_free(state); return 0; } /* Regression test for #1330 */ int test_cmd_lookup(void *state) { require(cmd_lookup('Z') == CMD_NULL); require(cmd_lookup('{') == CMD_INSCRIBE); require(cmd_lookup('u') == CMD_USE_STAFF); require(cmd_lookup('T') == CMD_TUNNEL); require(cmd_lookup('g') == CMD_PICKUP); require(cmd_lookup('G') == CMD_STUDY_BOOK); require(cmd_lookup(KTRL('S')) == CMD_SAVE); require(cmd_lookup('+') == CMD_ALTER); ok; } const char *suite_name = "command/lookup"; struct test tests[] = { { "cmd_lookup", test_cmd_lookup }, { NULL, NULL } }; angband-v3.3.2/src/tests/command/suite.mk0000644000175000017500000000003411651552410017635 0ustar chriscchriscTESTPROGS += command/lookup angband-v3.3.2/src/tests/unit-test.c0000644000175000017500000000237011651552410016642 0ustar chriscchrisc/* unit-test.c * * Framework for unit/regression testing harness */ #include #include #include #include "unit-test-types.h" #include "z-util.h" int verbose = 0; extern const char *suite_name; extern struct test tests[]; extern int setup_tests(void **data); extern int teardown_tests(void **data); int main(int argc, char *argv[]) { void *state; int i; int passed = 0; int total = 0; char *s = getenv("VERBOSE"); if (s && s[0]) { verbose = 1; } else if (argc > 1 && !strncmp(argv[1], "-v", 2)) { verbose = 1; } if (verbose) { printf("%s: starting...\n", suite_name); fflush(stdout); } if (setup_tests(&state)) { printf("ERROR: %s setup failed\n", suite_name); return 1; } for (i = 0; tests[i].name; i++) { if (verbose) printf(" %-16s ", tests[i].name); fflush(stdout); if (tests[i].func(state) == 0) passed++; total++; fflush(stdout); } if (teardown_tests(state)) { printf("ERROR: %s teardown failed\n", suite_name); return 1; } printf("%s finished: %d/%d passed\n", suite_name, passed, total); return 0; } int showpass(void) { if (verbose) printf("\033[01;32mPassed\033[00m\n"); return 0; } int showfail(void) { if (verbose) printf("\033[01;31mFailed\033[00m\n"); return 1; } angband-v3.3.2/src/tests/store/0000755000175000017500000000000011651552410015674 5ustar chriscchriscangband-v3.3.2/src/tests/store/suite.mk0000644000175000017500000000003211651552410017351 0ustar chriscchriscTESTPROGS += store/store angband-v3.3.2/src/tests/store/store.c0000644000175000017500000000377411651552410017207 0ustar chriscchrisc/* * store/store.c * * Created on: 22 Apr 2011 * Author: noz */ #include "unit-test.h" #include "unit-test-data.h" #include "test-utils.h" #include "init.h" #include "store.h" int setup_tests(void **state) { read_edit_files(); *state = 0; return 0; } int teardown_tests(void *state) { return 0; } static int number_distinct_items(int which) { struct store *s = &stores[which]; unsigned int i; u32b *kinds = mem_zalloc(sizeof(u32b) * s->table_num); u32b kind; int number_kinds = 0; /* Loop over available stock entries, counting unique kinds */ for (i = 0; i < s->table_num; i++) { unsigned int j; kind = s->table[i]->kidx; /* Loop over existing found kinds, and skip out early if it's * been seen already */ for (j = 0; j < i; j++) { if (kinds[j] == kind) break; } /* If we've run off the end of the loop, we've not seen it before, * so count it */ if (j == i) { kinds[j] = kind; number_kinds++; } } return number_kinds; } /* * Check that each shop stocks enough types of items to be able to fill up * if the RNG chooses the largest possible stock (STORE_MAX_KEEP). */ int test_enough_armor(void *state) { require(number_distinct_items(STORE_ARMOR) >= STORE_MAX_KEEP); ok; } int test_enough_weapons(void *state) { require(number_distinct_items(STORE_WEAPON) >= STORE_MAX_KEEP); ok; } int test_enough_temple(void *state) { require(number_distinct_items(STORE_TEMPLE) >= STORE_MAX_KEEP); ok; } int test_enough_alchemy(void *state) { require(number_distinct_items(STORE_ALCHEMY) >= STORE_MAX_KEEP); ok; } int test_enough_magic(void *state) { require(number_distinct_items(STORE_MAGIC) >= STORE_MAX_KEEP); ok; } const char *suite_name = "store/store"; struct test tests[] = { { "Enough items in Armoury", test_enough_armor }, { "Enough items in Weaponsmith", test_enough_weapons }, { "Enough items in Temple", test_enough_temple }, { "Enough items in Alchemists", test_enough_alchemy }, { "Enough items in Magicians", test_enough_magic }, { NULL, NULL } }; angband-v3.3.2/src/tests/test-utils.h0000644000175000017500000000033411651552410017026 0ustar chriscchrisc/* test-utils.h * * Function prototypes for test-utils * * Created by: myshkin * 26 Apr 2011 */ #ifndef TEST_UTILS_H #define TEST_UTILS_H extern void read_edit_files(void); #endif /* TEST_UTIL_H */ angband-v3.3.2/src/tests/object/0000755000175000017500000000000011651552410016006 5ustar chriscchriscangband-v3.3.2/src/tests/object/attack.c0000644000175000017500000000115411651552410017422 0ustar chriscchrisc/* object/attack */ #include "unit-test.h" #include "unit-test-data.h" #include "attack.h" #include "object/object.h" NOSETUP NOTEARDOWN int test_breakage_chance(void *state) { struct object obj; int c; object_prep(&obj, &test_longsword, 1, AVERAGE); c = breakage_chance(&obj, TRUE); eq(c, 50); c = breakage_chance(&obj, FALSE); eq(c, 25); obj.artifact = &test_artifact_sword; c = breakage_chance(&obj, TRUE); eq(c, 0); c = breakage_chance(&obj, FALSE); eq(c, 0); ok; } const char *suite_name = "object/attack"; struct test tests[] = { { "breakage-chance", test_breakage_chance }, { NULL, NULL } }; angband-v3.3.2/src/tests/object/suite.mk0000644000175000017500000000003311651552410017464 0ustar chriscchriscTESTPROGS += object/attack angband-v3.3.2/src/tests/player/0000755000175000017500000000000011651552410016034 5ustar chriscchriscangband-v3.3.2/src/tests/player/suite.mk0000644000175000017500000000012511651552410017514 0ustar chriscchriscTESTPROGS += player/birth \ player/history \ player/player angband-v3.3.2/src/tests/player/player.c0000644000175000017500000000304211651552410017473 0ustar chriscchrisc/* player/player */ #include "unit-test.h" #include "unit-test-data.h" #include "birth.h" #include "player/player.h" int setup_tests(void **state) { struct player *p = mem_zalloc(sizeof *p); player_init(p); *state = p; return 0; } int teardown_tests(void *state) { mem_free(state); return 0; } int test_stat_inc(void *state) { struct player *p = state; int v; p->stat_cur[A_STR] = 18 + 101; v = player_stat_inc(p, A_STR); require(!v); p->stat_cur[A_STR] = 15; player_stat_inc(p, A_STR); eq(p->stat_cur[A_STR], 16); player_stat_inc(p, A_STR); eq(p->stat_cur[A_STR], 17); player_stat_inc(p, A_STR); eq(p->stat_cur[A_STR], 18); player_stat_inc(p, A_STR); require(p->stat_cur[A_STR] > 18); ok; } int test_stat_dec(void *state) { struct player *p = state; int v; p->stat_cur[A_STR] = 3; p->stat_max[A_STR] = 3; v = player_stat_dec(p, A_STR, TRUE); require(!v); p->stat_cur[A_STR] = 15; p->stat_max[A_STR] = 15; player_stat_dec(p, A_STR, FALSE); eq(p->stat_cur[A_STR], 14); eq(p->stat_max[A_STR], 15); player_stat_dec(p, A_STR, TRUE); eq(p->stat_cur[A_STR], 13); eq(p->stat_max[A_STR], 14); p->stat_cur[A_STR] = 18+13; p->stat_max[A_STR] = 18+13; player_stat_dec(p, A_STR, FALSE); eq(p->stat_cur[A_STR], 18+03); eq(p->stat_max[A_STR], 18+13); p->stat_max[A_STR] = 18+03; player_stat_dec(p, A_STR, TRUE); eq(p->stat_cur[A_STR], 18); eq(p->stat_max[A_STR], 18); ok; } const char *suite_name = "player/player"; struct test tests[] = { { "stat-inc", test_stat_inc }, { "stat-dec", test_stat_dec }, { NULL, NULL } }; angband-v3.3.2/src/tests/player/history.c0000644000175000017500000000265311651552410017707 0ustar chriscchrisc/* player/history */ #include "birth.h" #include "player/types.h" #include "unit-test.h" NOTEARDOWN static struct history_chart ca; static struct history_chart cb; static struct history_chart cc; static struct history_entry ea0; static struct history_entry ea1; static struct history_entry eb0; static struct history_entry eb1; static struct history_entry ec0; static struct history_entry ec1; int setup_tests(void **state) { ca.entries = &ea0; cb.entries = &eb0; cc.entries = &ec0; ea0.next = &ea1; ea0.succ = &cb; ea0.roll = 50; ea0.bonus = 0; ea0.text = "A0"; ea1.next = NULL; ea1.succ = &cc; ea1.roll = 100; ea1.bonus = 0; ea1.text = "A1"; eb0.next = &eb1; eb0.succ = &cc; eb0.roll = 50; eb0.bonus = 0; eb0.text = "B0"; eb1.next = NULL; eb1.succ = NULL; eb1.roll = 100; eb1.bonus = 0; eb1.text = "B1"; ec0.next = &ec1; ec0.succ = NULL; ec0.roll = 50; ec0.bonus = 0; ec0.text = "C0"; ec1.next = NULL; ec1.succ = NULL; ec1.roll = 100; ec1.bonus = 0; ec1.text = "C1"; return 0; } int test_0(void *state) { int i; for (i = 0; i < 100; i++) { char *h = get_history(&ca, NULL); assert(h); eq(h[0], 'A'); require(isdigit(h[1])); require(h[2] == 'B' || h[2] == 'C'); require(isdigit(h[3])); if (h[2] == 'B' && h[4]) { require(h[4] == 'C'); require(isdigit(h[5])); } string_free(h); } ok; } const char *suite_name = "player/history"; struct test tests[] = { { "0", test_0 }, }; angband-v3.3.2/src/tests/player/birth.c0000644000175000017500000000115611651552410017313 0ustar chriscchrisc/* player/birth */ #include "unit-test.h" #include "unit-test-data.h" #include "birth.h" int setup_tests(void **state) { struct player *p = mem_alloc(sizeof *p); player_init(p); *state = p; return 0; } int teardown_tests(void *state) { mem_free(state); return 0; } int test_generate0(void *state) { struct player *p = state; player_generate(p, &test_sex, &test_race, &test_class); eq(p->lev, 1); ptreq(p->sex, &test_sex); ptreq(p->race, &test_race); ptreq(p->class, &test_class); ok; } const char *suite_name = "player/birth"; struct test tests[] = { { "generate0", test_generate0 }, { NULL, NULL } }; angband-v3.3.2/src/tests/unit-test.h0000644000175000017500000000327611651552410016655 0ustar chriscchrisc/* unit-test.h */ #ifndef UNIT_TEST_H #define UNIT_TEST_H #include "unit-test-types.h" #include "z-util.h" #define TEST extern int verbose; extern int showpass(void); extern int showfail(void); /* Forward declaration, since suite_names may be at the end of the test * file. */ const char *suite_name; #define NOSETUP int setup_tests(void **data) { return 0; } #define NOTEARDOWN int teardown_tests(void *data) { return 0; } #define ok return showpass(); #define eq(x,y) \ if ((x) != (y)) { \ if (verbose) { \ showfail(); \ printf(" %s:%d: requirement '%s' == '%s' failed\n", suite_name, \ __LINE__, #x, #y); \ printf(" %s: 0x%016lld\n", #x, (long long)x); \ printf(" %s: 0x%016lld\n", #y, (long long)y); \ } \ return 1; \ } #define require(x) \ do { \ if (!(x)) { \ if (verbose) \ showfail(); \ printf(" %s:%d: requirement '%s' failed\n", \ suite_name, __LINE__, #x); \ return 1; \ } \ } while (0) #if __WORDSIZE == 64 #define ptreq(x,y) \ if ((x) != (y)) { \ if (verbose) { \ showfail(); \ printf(" %s:%d: requirement '%s' == '%s' failed\n", suite_name, \ __LINE__, #x, #y); \ printf(" %s: 0x%016llx\n", #x, (unsigned long long)(x)); \ printf(" %s: 0x%016llx\n", #y, (unsigned long long)(y)); \ } \ return 1; \ } #else #define ptreq(x,y) \ if ((x) != (y)) { \ if (verbose) { \ showfail(); \ printf(" %s:%d: requirement '%s' == '%s' failed\n", suite_name, \ __LINE__, #x, #y); \ printf(" %s: 0x%08lx\n", #x, (unsigned long)(x)); \ printf(" %s: 0x%08lx\n", #y, (unsigned long)(y)); \ } \ return 1; \ } #endif #endif /* !UNIT_TEST_H */ angband-v3.3.2/src/tests/artifact/0000755000175000017500000000000011651552410016335 5ustar chriscchriscangband-v3.3.2/src/tests/artifact/suite.mk0000644000175000017500000000003711651552410020017 0ustar chriscchriscTESTPROGS += artifact/randname angband-v3.3.2/src/tests/artifact/randname.c0000644000175000017500000000133611651552410020271 0ustar chriscchrisc/* artifact/randname */ #include "unit-test.h" #include "object/obj-flag.h" #include "object/object.h" NOSETUP NOTEARDOWN #define NAMES_TRIES 100 const char *names[] = { "aaaaaa", "bbbbbb", "cccccc", "dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", NULL }; const char **p[] = { names, names }; int test_names(void *state) { struct artifact a; char *n; int i; a.aidx = 1; for (i = 0; i < NAMES_TRIES; i++) { n = artifact_gen_name(&a, p); if (strchr(n, '\'')) require(strchr(n, '\'') != strrchr(n, '\'')); else require(strstr(n, "of ")); mem_free(n); } ok; } const char *suite_name = "artifact/randname"; struct test tests[] = { { "names", test_names }, { NULL, NULL } }; angband-v3.3.2/src/tests/pathfind/0000755000175000017500000000000011651552410016335 5ustar chriscchriscangband-v3.3.2/src/tests/pathfind/suite.mk0000644000175000017500000000003711651552410020017 0ustar chriscchriscTESTPROGS += pathfind/pathfind angband-v3.3.2/src/tests/pathfind/pathfind.c0000644000175000017500000000166411651552410020305 0ustar chriscchrisc/* pathfind/pathfind */ #include "unit-test.h" #include "game-cmd.h" #include "pathfind.h" NOSETUP NOTEARDOWN int test_dir_to(void *state) { eq(pathfind_direction_to(loc(0,0), loc(0,1)), DIR_N); eq(pathfind_direction_to(loc(0,0), loc(1,0)), DIR_E); eq(pathfind_direction_to(loc(0,0), loc(1,1)), DIR_NE); eq(pathfind_direction_to(loc(0,0), loc(0,-1)), DIR_S); eq(pathfind_direction_to(loc(0,0), loc(-1,0)), DIR_W); eq(pathfind_direction_to(loc(0,0), loc(-1,-1)), DIR_SW); eq(pathfind_direction_to(loc(0,0), loc(-1,1)), DIR_NW); eq(pathfind_direction_to(loc(0,0), loc(1,-1)), DIR_SE); eq(pathfind_direction_to(loc(0,0), loc(0,0)), DIR_NONE); eq(pathfind_direction_to(loc(0,0), loc(1,10)), DIR_N); eq(pathfind_direction_to(loc(0,0), loc(8,10)), DIR_NE); eq(pathfind_direction_to(loc(0,0), loc(12,4)), DIR_E); ok; } const char *suite_name = "pathfind/pathfind"; struct test tests[] = { { "dir-to", test_dir_to }, { NULL, NULL }, }; angband-v3.3.2/src/tests/z-quark/0000755000175000017500000000000011651552410016132 5ustar chriscchriscangband-v3.3.2/src/tests/z-quark/suite.mk0000644000175000017500000000003311651552410017610 0ustar chriscchriscTESTPROGS += z-quark/quark angband-v3.3.2/src/tests/z-quark/quark.c0000644000175000017500000000177411651552410017432 0ustar chriscchrisc/* z-quark/quark.c */ #include "unit-test.h" #include "z-quark.h" int setup_tests(void **state) { quarks_init(); return 0; } int teardown_tests(void *state) { quarks_free(); return 0; } int test_alloc(void *state) { quark_t q1 = quark_add("0-foo"); quark_t q2 = quark_add("0-bar"); quark_t q3 = quark_add("0-baz"); require(quark_str(q1)); require(quark_str(q2)); require(quark_str(q3)); require(!strcmp(quark_str(q1), "0-foo")); require(!strcmp(quark_str(q2), "0-bar")); require(!strcmp(quark_str(q3), "0-baz")); ok; } int test_dedup(void *state) { quark_t q1 = quark_add("1-foo"); quark_t q2 = quark_add("1-foo"); quark_t q3 = quark_add("1-bar"); require(quark_str(q1)); require(quark_str(q2)); require(quark_str(q3)); require(q1 == q2); require(quark_str(q1) == quark_str(q2)); require(q1 != q3); require(quark_str(q1) != quark_str(q3)); ok; } const char *suite_name = "z-quark/quark"; struct test tests[] = { { "alloc", test_alloc }, { "dedup", test_dedup }, { NULL, NULL } }; angband-v3.3.2/src/tests/unit-test-types.h0000644000175000017500000000035011651552410020005 0ustar chriscchrisc/* unit-test-types.h * * Stub header for testing harness data structures * */ #ifndef UNIT_TEST_TYPES_H #define UNIT_TEST_TYPES_H struct test { const char *name; int (*func)(void *data); }; #endif /* !UNIT_TEST_TYPES_H */ angband-v3.3.2/src/tests/z-textblock/0000755000175000017500000000000011651552410017006 5ustar chriscchriscangband-v3.3.2/src/tests/z-textblock/suite.mk0000644000175000017500000000004311651552410020465 0ustar chriscchriscTESTPROGS += z-textblock/textblock angband-v3.3.2/src/tests/z-textblock/textblock.c0000644000175000017500000000274511651552410021161 0ustar chriscchrisc/* z-quark/quark.c */ #include "unit-test.h" #include "z-textblock.h" #include "z-term.h" int setup_tests(void **state) { ok; } int teardown_tests(void *state) { ok; } int test_alloc(void *state) { textblock *tb = textblock_new(); require(tb); textblock_free(tb); ok; } int test_append(void *state) { textblock *tb = textblock_new(); require(!strcmp(textblock_text(tb), "")); textblock_append(tb, "Hello"); require(!strcmp(textblock_text(tb), "Hello")); textblock_append(tb, "%d", 20); require(!strcmp(textblock_text(tb), "Hello20")); ok; } int test_colour(void *state) { textblock *tb = textblock_new(); const char text[] = "two"; const byte attrs[] = { TERM_L_GREEN, TERM_L_GREEN, TERM_L_GREEN }; textblock_append_c(tb, TERM_L_GREEN, text); require(!memcmp(textblock_attrs(tb), attrs, 3)); ok; } int test_length(void *state) { textblock *tb = textblock_new(); const char text[] = "1234567"; int i; const char *tb_text; /* Add it 32 times to make sure that appending definitely works */ for (i = 0; i < 32; i++) { textblock_append(tb, text); } /* Now make sure it's all right */ tb_text = textblock_text(tb); for (i = 0; i < 32; i++) { int n = N_ELEMENTS(text) - 1; int offset = i * n; require(!memcmp(tb_text + offset, text, n)); } ok; } const char *suite_name = "z-textblock/textblock"; struct test tests[] = { { "alloc", test_alloc }, { "append", test_append }, { "colour", test_colour }, { "length", test_length }, { NULL, NULL } }; angband-v3.3.2/src/ui-knowledge.c0000644000175000017500000013421311651552410016140 0ustar chriscchrisc/* * File: ui-knowledge.c * Purpose: Knowledge screen * * Copyright (c) 2000-2007 Eytan Zweig, Andrew Doull, Pete Mack. * Copyright (c) 2010 Peter Denison, Chris Carr. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "history.h" #include "monster/mon-lore.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "squelch.h" #include "store.h" #include "ui.h" #include "ui-menu.h" /* Flag value for missing array entry */ #define MISSING -17 static const grouper object_text_order[] = { {TV_RING, "Ring" }, {TV_AMULET, "Amulet" }, {TV_POTION, "Potion" }, {TV_SCROLL, "Scroll" }, {TV_WAND, "Wand" }, {TV_STAFF, "Staff" }, {TV_ROD, "Rod" }, {TV_FOOD, "Food" }, {TV_PRAYER_BOOK, "Priest Book" }, {TV_MAGIC_BOOK, "Magic Book" }, {TV_LIGHT, "Light" }, {TV_FLASK, "Flask" }, {TV_SWORD, "Sword" }, {TV_POLEARM, "Polearm" }, {TV_HAFTED, "Hafted Weapon" }, {TV_BOW, "Bow" }, {TV_ARROW, "Ammunition" }, {TV_BOLT, NULL }, {TV_SHOT, NULL }, {TV_SHIELD, "Shield" }, {TV_CROWN, "Crown" }, {TV_HELM, "Helm" }, {TV_GLOVES, "Gloves" }, {TV_BOOTS, "Boots" }, {TV_CLOAK, "Cloak" }, {TV_DRAG_ARMOR, "Dragon Scale Mail" }, {TV_HARD_ARMOR, "Hard Armor" }, {TV_SOFT_ARMOR, "Soft Armor" }, {TV_SPIKE, "Spike" }, {TV_DIGGING, "Digger" }, {TV_JUNK, "Junk" }, {0, NULL } }; typedef struct { int maxnum; /* Maximum possible item count for this class */ bool easy_know; /* Items don't need to be IDed to recognize membership */ const char *(*name)(int gid); /* Name of this group */ /* Compare, in group and display order (optional if already sorted) */ int (*gcomp)(const void *, const void *); /* Compares gids of two oids */ int (*group)(int oid); /* Returns gid for an oid */ /* Summary function for the "object" information. */ void (*summary)(int gid, const int *object_list, int n, int top, int row, int col); } group_funcs; typedef struct { /* Displays an entry at specified location, including kill-count and graphics */ void (*display_member)(int col, int row, bool cursor, int oid); void (*lore)(int oid); /* Displays lore for an oid */ /* Required only for objects with modifiable display attributes */ /* Unknown 'flavors' return flavor attributes */ char *(*xchar)(int oid); /* Get character attr for OID (by address) */ byte *(*xattr)(int oid); /* Get color attr for OID (by address) */ const char *(*xtra_prompt)(int oid); /* Returns optional extra prompt */ void (*xtra_act)(struct keypress ch, int oid); /* Handles optional extra actions */ bool is_visual; /* Does this kind have visual editing? */ } member_funcs; /* Helper class for generating joins */ typedef struct join { int oid; int gid; } join_t; /* A default group-by */ static join_t *default_join; #if 0 static int default_join_cmp(const void *a, const void *b) { join_t *ja = &default_join[*(int*)a]; join_t *jb = &default_join[*(int*)b]; int c = ja->gid - jb->gid; if (c) return c; return ja->oid - jb->oid; } #endif static int default_group(int oid) { return default_join[oid].gid; } static int *obj_group_order = NULL; /* * Description of each monster group. */ static struct { const char *chars; const char *name; } monster_group[] = { { (const char *)-1, "Uniques" }, { "A", "Angels" }, { "a", "Ants" }, { "b", "Bats" }, { "B", "Birds" }, { "C", "Canines" }, { "c", "Centipedes" }, { "uU", "Demons" }, { "dD", "Dragons" }, { "vE", "Elementals/Vortices" }, { "e", "Eyes/Beholders" }, { "f", "Felines" }, { "G", "Ghosts" }, { "OP", "Giants/Ogres" }, { "g", "Golems" }, { "H", "Harpies/Hybrids" }, { "h", "Hominids (Elves, Dwarves)" }, { "M", "Hydras" }, { "i", "Icky Things" }, { "lFI", "Insects" }, { "j", "Jellies" }, { "K", "Killer Beetles" }, { "k", "Kobolds" }, { "L", "Lichs" }, { "tp", "Men" }, { ".$!?=~_", "Mimics" }, { "m", "Molds" }, { ",", "Mushroom Patches" }, { "n", "Nagas" }, { "o", "Orcs" }, { "q", "Quadrupeds" }, { "Q", "Quylthulgs" }, { "R", "Reptiles/Amphibians" }, { "r", "Rodents" }, { "S", "Scorpions/Spiders" }, { "s", "Skeletons/Drujs" }, { "J", "Snakes" }, { "T", "Trolls" }, { "V", "Vampires" }, { "W", "Wights/Wraiths" }, { "w", "Worms/Worm Masses" }, { "X", "Xorns/Xarens" }, { "y", "Yeeks" }, { "Y", "Yeti" }, { "Z", "Zephyr Hounds" }, { "z", "Zombies" }, { NULL, NULL } }; /* * Description of each feature group. */ const char *feature_group_text[] = { "Floors", "Traps", "Doors", "Stairs", "Walls", "Streamers", "Obstructions", "Stores", "Other", NULL }; /* Useful method declarations */ static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left); static bool visual_mode_command(ui_event ke, bool *visual_list_ptr, int height, int width, byte *attr_top_ptr, byte *char_left_ptr, byte *cur_attr_ptr, byte *cur_char_ptr, int col, int row, int *delay); static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left); /* * Clipboard variables for copy&paste in visual mode */ static byte attr_idx = 0; static byte char_idx = 0; /* * Return a specific ordering for the features */ static int feat_order(int feat) { feature_type *f_ptr = &f_info[feat]; switch (f_ptr->d_char) { case '.': return 0; case '^': return 1; case '\'': case '+': return 2; case '<': case '>': return 3; case '#': return 4; case '*': case '%' : return 5; case ';': case ':' : return 6; default: { return 8; } } } /* Emit a 'graphical' symbol and a padding character if appropriate */ extern int big_pad(int col, int row, byte a, byte c) { Term_putch(col, row, a, c); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col, row, a, c); return tile_width; } /* Return the actual width of a symbol */ static int actual_width(int width) { return width * tile_width; } /* Return the actual height of a symbol */ static int actual_height(int height) { return height * tile_height; } /* From an actual width, return the logical width */ static int logical_width(int width) { return width / tile_width; } /* From an actual height, return the logical height */ static int logical_height(int height) { return height / tile_height; } static void display_group_member(menu_type *menu, int oid, bool cursor, int row, int col, int wid) { const member_funcs *o_funcs = menu->menu_data; byte attr = curs_attrs[CURS_KNOWN][cursor == oid]; (void)wid; /* Print the interesting part */ o_funcs->display_member(col, row, cursor, oid); #if 0 /* Debugging code */ c_put_str(attr, format("%d", oid), row, 60); #endif /* Do visual mode */ if (o_funcs->is_visual && o_funcs->xattr) { byte c = *o_funcs->xchar(oid); byte a = *o_funcs->xattr(oid); c_put_str(attr, format("%d/%d", a, c), row, 60); } } static const char *recall_prompt(int oid) { (void)oid; return ", 'r' to recall"; } #define swap(a, b) (swapspace = (void*)(a)), ((a) = (b)), ((b) = swapspace) /* * Interactive group by. * Recognises inscriptions, graphical symbols, lore */ static void display_knowledge(const char *title, int *obj_list, int o_count, group_funcs g_funcs, member_funcs o_funcs, const char *otherfields) { /* maximum number of groups to display */ int max_group = g_funcs.maxnum < o_count ? g_funcs.maxnum : o_count ; /* This could (should?) be (void **) */ int *g_list, *g_offset; const char **g_names; int g_name_len = 8; /* group name length, minumum is 8 */ int grp_cnt = 0; /* total number groups */ int g_cur = 0, grp_old = -1; /* group list positions */ int o_cur = 0; /* object list positions */ int g_o_count = 0; /* object count for group */ int oid = -1; /* object identifiers */ region title_area = { 0, 0, 0, 4 }; region group_region = { 0, 6, MISSING, -2 }; region object_region = { MISSING, 6, 0, -2 }; /* display state variables */ bool visual_list = FALSE; byte attr_top = 0; byte char_left = 0; int delay = 0; menu_type group_menu; menu_type object_menu; menu_iter object_iter = { NULL, NULL, display_group_member, NULL, NULL }; /* Panel state */ /* These are swapped in parallel whenever the actively browsing " */ /* changes */ int *active_cursor = &g_cur, *inactive_cursor = &o_cur; menu_type *active_menu = &group_menu, *inactive_menu = &object_menu; int panel = 0; void *swapspace; bool do_swap = FALSE; bool flag = FALSE; bool redraw = TRUE; int browser_rows; int wid, hgt; int i; int prev_g = -1; int omode = OPT(rogue_like_commands); ui_event ke; /* Get size */ Term_get_size(&wid, &hgt); browser_rows = hgt - 8; /* Disable the roguelike commands for the duration */ OPT(rogue_like_commands) = FALSE; if (g_funcs.gcomp) sort(obj_list, o_count, sizeof(*obj_list), g_funcs.gcomp); /* Sort everything into group order */ g_list = C_ZNEW(max_group + 1, int); g_offset = C_ZNEW(max_group + 1, int); for (i = 0; i < o_count; i++) { if (prev_g != g_funcs.group(obj_list[i])) { prev_g = g_funcs.group(obj_list[i]); g_offset[grp_cnt] = i; g_list[grp_cnt++] = prev_g; } } g_offset[grp_cnt] = o_count; g_list[grp_cnt] = -1; /* The compact set of group names, in display order */ g_names = C_ZNEW(grp_cnt, const char *); for (i = 0; i < grp_cnt; i++) { int len; g_names[i] = g_funcs.name(g_list[i]); len = strlen(g_names[i]); if (len > g_name_len) g_name_len = len; } /* Reasonable max group name len */ if (g_name_len >= 20) g_name_len = 20; object_region.col = g_name_len + 3; group_region.width = g_name_len; /* Leave room for the group summary information */ if (g_funcs.summary) object_region.page_rows = -3; /* Set up the two menus */ menu_init(&group_menu, MN_SKIN_SCROLL, menu_find_iter(MN_ITER_STRINGS)); menu_setpriv(&group_menu, grp_cnt, g_names); menu_layout(&group_menu, &group_region); menu_init(&object_menu, MN_SKIN_SCROLL, &object_iter); menu_setpriv(&object_menu, 0, &o_funcs); menu_layout(&object_menu, &object_region); o_funcs.is_visual = FALSE; /* Save screen */ screen_save(); clear_from(0); /* This is the event loop for a multi-region panel */ /* Panels are -- text panels, two menus, and visual browser */ /* with "pop-up menu" for lore */ while ((!flag) && (grp_cnt)) { bool recall = FALSE; if (redraw) { /* Print the title bits */ region_erase(&title_area); prt(format("Knowledge - %s", title), 2, 0); prt("Group", 4, 0); prt("Name", 4, g_name_len + 3); if (otherfields) prt(otherfields, 4, 46); /* Print dividers: horizontal and vertical */ for (i = 0; i < 79; i++) Term_putch(i, 5, TERM_WHITE, '='); for (i = 0; i < browser_rows; i++) Term_putch(g_name_len + 1, 6 + i, TERM_WHITE, '|'); /* Reset redraw flag */ redraw = FALSE; } if (g_cur != grp_old) { grp_old = g_cur; o_cur = 0; g_o_count = g_offset[g_cur+1] - g_offset[g_cur]; menu_set_filter(&object_menu, obj_list + g_offset[g_cur], g_o_count); group_menu.cursor = g_cur; object_menu.cursor = 0; } /* HACK ... */ if (!visual_list) { /* ... The object menu may be browsing the entire group... */ o_funcs.is_visual = FALSE; menu_set_filter(&object_menu, obj_list + g_offset[g_cur], g_o_count); object_menu.cursor = o_cur; } else { /* ... or just a single element in the group. */ o_funcs.is_visual = TRUE; menu_set_filter(&object_menu, obj_list + o_cur + g_offset[g_cur], 1); object_menu.cursor = 0; } oid = obj_list[g_offset[g_cur]+o_cur]; /* Print prompt */ { const char *pedit = (!o_funcs.xattr) ? "" : (!(attr_idx|char_idx) ? ", 'c' to copy" : ", 'c', 'p' to paste"); const char *xtra = o_funcs.xtra_prompt ? o_funcs.xtra_prompt(oid) : ""; const char *pvs = ""; if (visual_list) pvs = ", ENTER to accept"; else if (o_funcs.xattr) pvs = ", 'v' for visuals"; prt(format("