ZXTape! 0Created with Ramsoft MakeTZXvampire j j^ j@!345 !@345  23802\32 1:1:1:58623:"":get=5+23635S\+256*23636T\:put=get+21:6:#0;0,8;"V L A D S D O R F":0*put 23802\,254:0:0:5::6,8;"VAMPIRE VILLAGE";13 ,8;" 1983 Docimodus":90Z "Prologue"'''" Vladsdorf is a village just"''"south of the River Ripple."''"It is plagued by a vampire."''"As mayor YOU must hire, equip"''"and direct volunteers who"''"offer to help rid the village"''"of this scourge.":90Z 2''" The vampire sleeps during the"''"day in the castle on top of the"''"Red Cliffs. At night he wakes"''"and glides over the village and"''"farms seeking blood. He is"''"silent and invisible but for"''"his eyes. It is said that he may"''"be killed by driving a wooden"''"stake into his heart.":90Z '''" From your position at the top"''"of a hill to the south of"''"the village, you can see the"''"whole scenario. You can signal"''"to your volunteers giving them"''"directions and commands."''"The acoustic properties of the"''"valley allow your volunteers to"''"shout back at you.":90Z ''" You must also make sure that"''"the farmers, who live to the"''"north of the river Ripple, know"''"which of the four fields need"''"tending. The village depends on"''"these four crops.":90Z " A building can be entered"''"when the inhabitant has opened"''"the door."''" When the game starts press"''"""v"" to see the signal keys."''''" Press ""s"" if you want to start"''"or any other key if you want to"''"repeat the prologue." #90Z:m$"s"m$"S"11 [f$(502,16):f(502,9 ):10 ,7;"The game begins":502  Doors .001wn,40(:x=l(l,1)+(l$(l,1)="E")-(l$(l,1)="W"):y=l(l,2)+(l$(l,1)="N")-(l$(l,1)="S") ^x1=x+(l$(l,1)="E")-(l$(l,1)="W"):y1=y+(l$(l,1)="N")-(l$(l,1)="S"):  Open ,0*get:(x,y)=11;x,y 0(x1,y1)=11;x1,y1:0*put !0*put: #Close nh $E0:0*get:l$(l,12 )"h"x,y:x1,y1:0*put % ( Close )10:0*get:x,y:x1,y1:0*put * - Open nh .l$(l,12 )"u" /,0*get:(x,y)=11;x,y 00(x1,y1)=11;x1,y1:0*put 10*put: 2nextime=4000 3gameloop=1000 4doors=20 5open=30 6closenh=35# 7close=40( 8opennh=45- 9kill=800  :locheck=2000 ;reverse=3200 <undead=6000p =delay=80P >abandon=3000 ?lose=3100 @hold=3300 Aask=400 Bsleep=420 Creport=430 Dlook=450 Eunlook=460 Fhide=500 Gseek=600X Hfeed=700 Ivocab=900 O 100d P Delay R8.3,*20-20:w=0300,:w: Z""90Z [421,0;" Press a key to turn the page" \.m$="":z=13000 :m$=:m$"": ]z:: dInitialise fpf=1502:f$(f,1)" "0*get:1;8;f(f,7),f(f,8):0*put gf h8fi=1:f$(502,16):f(502,9 ) i Play n12 ,10 ,150,222,1000,1000,1000,1000,100d,999,0,0,0,0,0,0,0,0,0,0 s,:p(20):p=120:p(p):p xaba=0:cas=0:slp=0:ht=0:y$="nnxsssxnx":x$="xeeexwwwx":vv=p(3):vh=p(4):hv=p(1):hh=p(2) z4baf=0:laf=0:taf=0:daf=0 }/c$(5,16):c(5,9 ):ib=0:bh=164:bv=35#:rp=0:gh=0:bar=*3+3:oat=*3+3:cor=*3+3:whe=*3+3:lt=0:s$="n":np=0:op=0:dy=1:h=108l:m=100d:d=(*8+1) Time 8,9 ,10 ,12 ,13 ,14,16,17,18,20,21,22,23,4,7 jt(15,2):t=115:t(t,1):t(t,2)=4000+t*100d:t:t=1 Locations "SCHURCH",21,23,"SHOUSE",19,502,"WJOINER",47/,13 ,"SHOUSE",60<,16,"NHOUSE",62>,6,"WTAKE AWAY",74J,19,"NHOUSE",84T,9 ,"NHOUSE",104h,13 "WHOUSE",120x,9 ,"EGROCER",139,14,"WJEWELLER",147,17,"EBOATHOUSE",163,16,"WSTORE",171,11 ,"NHOUSE",183,8,"SHOUSE",179,27,"WINN",213,14 "WTOWER",125},46.,"NTOWER",114r,41),"ETOWER",105i,41),"SFARM",568,74J,"EFARM",14,123{,"NFARM",546,142 "SFARM",107k,114r,"SFARM",119w,163,"NFARM",164,78N,"EFARM",180,75K,"SFARM",198,62>,"SCASTLE",216,145 zl$(28,12 ):l(28,2):l=128:l$(l):l(l,1):l(l,2):l$(l,12 )="h":l Items 7carry source Item,wgt,nut,cost,defence,life,quantity "dcCHHoly Water",1,0,5,700,5,3,"bcJEWatch",1,0,10 ,0,20,2,"snBOBoat",20,0,10 ,0,20,2,"gcGRGarlic",1,10 ,1,500,10 ,3 "icJOStake",1,0,1,0,99999CO,3,"icSTHammer",5,0,2,0,99999CO,2,"icJECrucifix",1,0,20,1000,99999CO,2 "icSTGrapnel",5,0,3,0,99999CO,2,"icSTLadder",10 ,0,3,0,99999CO,2,"icSTRope",3,0,2,0,99999CO,3 "rcTAFish",1,200,1,0,1,5,"rcTAPies",1,150,1,0,1,5,"rcTAChips",1,100d,1,0,1,5 "rcGRBananas",1,150,3,0,1,5,"rcGROranges",1,100d,2,0,2,5,"rcGRApples",1,502,1,0,3,5 "inINDinner",0,400,3,0,0,0,"inINTea",0,100d,1,0,0,0,"inINLunch",0,200,2,0,0,0,"inINBreakfast",0,100d,1,0,0,0 hi$(20,15):i(20,9 ):i=120:i$(i):z=16:i(i,z):z:i ,:3110&  Ask ""401 -a$="":w=0150:""405 .1}L,-20:w: "a$=:a$<"a"a$=(a$+32 ) ""410   Sleep #p(5)<10000'425 A''"I'm not tired !":d=d+4:delay:d>8d=d-8  (slp=(*10 +p(12 )+10 )   Report ?0:0:6::5;"CURRENT PLAYER STATUS" 7c=15:c$(c,6)="bcJEWa"435 c:437 [2,0;"Time";2,15;h;m;2,15;" ";2,18;":" 4'"Energy",p(5);(" Tired"p(5)<1000)''"Nutrition",p(6);(" Hungry"p(6)<200)''"Total Weight",p(12 )''"Defences",p(11 );(" Poor"p(11 )<500);(" Medium"p(11 )>500p(11 )<701);(" Good"p(11 )>700)''"Money","`";p(9 ) M'" I have :-":c=15:,(c$(c,5)(c$(c,1)" ")):c ""444 0:gameloop  Look 3''"I'm looking around.":z=1200:z:  Unlook 6''"I've finished looking.":z=1200:z:  Hide ""502 $6:0::'''"I have :-" ecar=0:c=15:c$(c,1)" "car=1:'(96`+c);". ";c$(c,5) :c:car=0''" nothing to hide !":delay:gameloop >''"Which item shall I hide ?":ask:a$"a"a$"e"520 .''"Give the item letter !":delay:500 .c=a$-96`:c$(c,1)=" "517  @at32 ''"I can't find a hiding place.":delay:gameloop  50*get:1;8;hh,hv:0*put  f(fi,7)=hh:f(fi,8)=hv:f$(fi)=c$(c):z=16:f(fi,z)=c(c,z):z:fi=fi+1:fi>502fi=1 _c$(c,1)=" ":p(12 )=p(12 )-c(c,1):p(11 )=p(11 )-c(c,4) 0 gameloop X Seek Z0:6::'''"I've started searching":f=1502:f$(f,1)" "f(f,7)hh-5f(f,8)hv-5610b [ f:gameloop bT6:0::'''"I have found :-"''',f$(f,5):ask:a$"g"603[ g1c=15:c$(c,1)=" "625q l3c::''''"I can't carry anymore":delay:gameloop qp(11 )=p(11 )+f(f,4):p(12 )=p(12 )+f(f,1):c$(c)=f$(f):z=16:c(c,z)=f(f,z):z:f$(f,1)=" " xo0*get:(f(f,7),f(f,8))=11;8;f(f,7),f(f,8):0*put { 603[  Feed "2:7::"I have :-" ifood=0:c=15:c$(c,1)" "c(c,2)>0food=1:''c$(c,5) /c:food=0''"No food":delay:gameloop Ƃ''"What should I eat ?":ask:c=15:c$(c,1)" "c(c,2)>0c$(c,5)=(a$-32 )720  c:gameloop Ђc$(c,1)=" ":p(12 )=p(12 )-c(c,1):p(6)=p(6)+c(c,2):''"That was good.":delay:gameloop  Kill "4k$="I can't kill the vampire ":0:7: %<cas1'''k$''"outside his castle.":delay:gameloop *9dy1'''k$''"during the night.":delay:gameloop /7c=15:c$(c,6)="icJOSt"8259 46c:'''k$''"without a wooden stake.":delay:gameloop 97c=15:c$(c,6)="icSTHa"835C >bc:'''k$''"without a hammer to drive the"''"wooden stake through his"''"heart.":delay:gameloop C7c=15:c$(c,6)="dcCHHo"845M HNc:'''k$''"without Holy Water to pour over"''"his remains.":delay:gameloop M7c=15:c$(c,6)="icJECr"855W R]c:'''k$''"without a Crucifix to stop the"''"undead reaching his remains.":delay:gameloop W''"I have driven my wooden stake"''"into the vampires heart and"''"poured Holy Water over him."''"I am leaving my Crucifix to stop"''"the undead tampering."''''"The vampire is dead......." \)z=16:delay:z:3150N  Vocab >1:7::4;" KEYS AND THEIR MEANINGS " '" 0 .. Turn clockwise."''" 1 .. Turn anti-clockwise."''" 5 .. Go west."''" 6 .. Go south."''" 7 .. Go north."''" 8 .. Go east." h'''" Buy, Eat, Get, Hide, Ignore,"''" Kill, Look, Sleep, Wake" *''" Player status, Vocabulary" ""920 Game loop  1:8:0*get *hh=vhhv=vvp(11 )<1000lose Nm=m+1:m=160m=100d:h=h+1:h=124|h=100d #h-100d=t(t,1)nextime slp>01015 =""1014 >="0".01z# =,30:d=d+1:d>8d=1 >="1".01z# =,30:d=d-1:d<1d=8 ="5"d=7 ="6"d=5 ="7"d=1 ="8"d=3 v$=y$(d):h$=x$(d) bhh=hh+(h$="e"hh<254)-(h$="w"hh>1):hv=hv+(v$="n"hv<174)-(v$="s"hv>1) dy=11022 :ht=1vv=vv+(vvhv):vh=vh+(vhhh) ht=0vv=vv+(vvtv):vh=vh+(vhth):vv=tvvh=thl$(bt,12 )="u":lt=01,-20:5120 Lvh+1,vv:vh-1,vv:vh+1,vv+1:vh-1,vv+1 <hh,hv+1:hh,hv-1:hh+1,hv:hh-1,hv Dpv=(22-(hv+1)/8):ph=(hh/8):at=(pv,ph) np=(hh,hv):npoplocheck p(5)=p(5)-p(12 )+slp:p(6)=p(6)-1:p(5)<0p(6)<0#0;"Food and Sleep would have been nice !":delay:lose =""1040 ="e"Ŧ="E"feed  #="w"Ŧ="W"slp=0:reverse  ="k"Ŧ="K"kill  ="v"Ŧ="V"vocab  ="h"Ŧ="H"hide  ="l"Ŧ="L"seek ="p"Ŧ="P"report @p(5)<1000p(6)<100d.01z# =,40(  gameloop  Locheck !op=np:s$="y"s$="n":gameloop s$="y" 1l=128:l(l,1)hh2010 l(l,2)=hvundead l aba=12050 bar=bar-(at=37%) oat=oat-(at=35#) cor=cor-(at=38&) whe=whe-(at=39') m$=" crop has failed.." 7bar<0#0;"The barley";m$:delay:abandon 4oat<0#0;"The oat";m$:delay:abandon 5cor<0#0;"The corn";m$:delay:abandon 6whe<0#0;"The wheat";m$:delay:abandon at34"2070  bclm=0:c=15:c$(c,6)="icSTGr"c$(c,6)="icSTRo"clm=clm+1 c:clm<2reverse  gameloop at33!reverse 6c=15:c$(c,6)="snBOBo"gameloop c  ,#0;"Help, I'm drowning":delay:lose Abandon 3l=128:l$(l,12 )="h"l$(l)=" " Kl:aba=1:#0;"The village has been abandoned":delay:reverse  Lose !P4:0:0::3,6;" Your hero is dead.":delay "2c=15:c$(c,1)=" "3109% #f(fi,7)=hh:f(fi,8)=hv:f$(fi)=c$(c):z=16:f(fi,z)=c(c,z):z:fi=fi+1:fi>502fi=1 %c: &!p(10 )<13150N +pcas=0:c$(5,16):4:0:0:6,9 ;"You have `";p(10 ):delay . ll=(*10 +2):l=ll /$l=l+1:l=29l=1 0;l$(l,23)="HO"l$(l,12 )="h"3130: 5Zl=ll9 ,0;"There are no volunteers to fightthe vampire.":delay:3150N 8 3119/ :l$(l,12 )=" ":9 ,3;"You have a volunteer !"''"He will need some money to buy"''"materials for his adventure."''"How much are you offering ?" ;"20,17;"` ":m$="" <(z=11000:""3137A >Mz::'''"He will try without money.":delay:p(9 )=0:3145I @""3136@ A=""3137A B!j$=:j$<"0"j$>"9"3141E C:m$=m$+j$:20,18;m$:m$>23141E D 3136@ Em$<13135? F-m$(1)<"0"m$(1)>"9"3135? Hdp(9 )=m$:p(9 )>p(10 )20,0;"You have not got ":delay::3115+ Ip(12 )=10 :p(10 )=p(10 )-p(9 ):hh=l(l,1):hv=l(l,2):p(5)=10000':p(11 )=0:p(6)=1000 Jod$=l$(l,1):d=(d$="N")+3*(d$="E")+5*(d$="S")+7*(d$="W"):h$=x$(d):v$=y$(d):gameloop N69400$::"Replay starts soon.":delay:502 Reverse 2d=d+5-(*2):d>8d=d-8 z=12:v$=y$(d):h$=x$(d):hh=hh+(h$="e"hh<254)-(h$="w"hh>1):hv=hv+(v$="n"hv<174)-(v$="s"hv>1) .01z# =,3:z:gameloop Hold 2c=15:c$(c,1)=" "3315 +c::''''"I can't carry anymore":delay: ?p(9 )15t=1 thistime:gameloop  08:00  O5:#0;"8 a.m. The village awakes":delay:ht=0:dy=1 =l=115:l$(l,2)="H"doors:open:closenh 3l:l=2027:doors:open:closenh:l: h 09:00 m>#0;"9 a.m. The Shops are opening":delay:baf=0 r=l=128:l$(l,24)="TAK"4225 wdoors yopen z closenh l   10:00 Em$=" needs tending !":bar<1#0;"The barley";m$:delay -whe<1#0;"The wheat";m$:delay ,cor<1#0;"The corn";m$:delay ;oat<1#0;"The oats need";m$(7):delay abar<3oat<3whe<3cor<3#0;"The farmers need your help !":delay / 0 12:00 5 laf=1 :#l=6:doors:open:closenh:   13:00  laf=0   14:00 Dbar=bar-1:whe=whe-1:oat=oat-1:cor=cor-1 [ \ 16:00 ataf=1:4305  17:00 =#0;"The Shops are closing":delay:l=128 (l$(l,23)="HO"4820 (l$(l,23)="FA"4820 Cl$(l,23)="IN"l$(l,23)="TO"4820 El$(l,24)="CHU"l$(l,24)="CAS"4820 doors:close l # $ 18:00 ) taf=0   20:00  daf=1   21:00 H0:lt=0: dy=0:#0;"9 p.m. Night falls":delay fl=128:l$(l,23)="IN"l$(l,23)="TO"doors:opennh:5117 doors:close:opennh l Bbt=(*29+1):bt=29bt=28:ht=1: !l$(bt,12 )"h"5120 $tv=l(bt,2):th=l(bt,1) O P 22:00 U daf=0 Z.l=16:doors:l$(l,12 )="h"close _  23:00 jc=15:c(c,5)=c(c,5)-1:c$(c,1)" "c(c,5)<15305 c: c$(c,1)="r"#0;"My ";c$(c,5);"are rotten":p(12 )=p(12 )-c(c,1):c$(c,1)=" ":delay: c$(c,1)="g"#0;"My garlic is rotten":p(12 )=p(12 )-c(c,1):c$(c,1)=" ":p(11 )=p(11 )-500:delay: {c$(c,1)="s"#0;"My canoe is full of holes":c$(c,1)=" ":p(12 )=p(12 )-c(c,1):delay: c$(c,1)="d"#0;"My Holy Water has dried up":p(12 )=p(12 )-c(c,1):c$(c,1)=" ":p(11 )=p(11 )-700:delay: tc$(c,1)="b"#0;"My watch is broken":p(12 )=p(12 )-c(c,1):c$(c,1)=" ":delay:  5303   04:00 4lt=1:ht=0:tv=150:th=222 { | 07:00 &l=16:doors:open:baf=1  p Undead u!0:dy=06020 z l$(l,12 )"h"6025 6000p+100d*l ,l$(l,12 )="h"6000p+100d*l Ql$(l,12 )"u"#0;"This building has been abandoned":delay:reverse +#0;"There is an Undead here":delay ^p(11 )>1000#0;"I have destroyed it !":l$(l,12 )="h":delay:reverse Sp(11 )500#0;"My defences are holding it back":delay:reverse -#0;"It's attacking me !":delay:lose  Church *1:7::"I'm in the Church." Ji(1,6)<1'''"There is nothing here !":delay:reverse z=1i(1,6):z*40(,502:8,0,5.50:0,15:2,2:-12 ,0:2,-2:0,-15:z:'''"A man is offering to sell me"'"Holy Water at `5 a bottle.":ask 6a$"b"'''"I'm leaving the Church.":delay:reverse i=1:hold  reverse 8 House 9[6:0::"I'm in a House."'''"The owner says I can sleep here"''"for `5.":ask :a$"s"reverse >Dp(9 )5p(9 )=p(9 )-5:sleep:gameloop B2''"I have not got `5 to spare !":delay:reverse  Joiners 76:1::"I've entered the joiners.":look i=5:z=1i(i,6):z*40(,35#:0,-25:3,-3:3,3:0,25:-5,0:z:i(i,6)>0''"The joiner sells wooden stakes"''"for `1 each.":ask:a$="b"hold unlook:reverse  62008 d 62008 Take away +5:0::"I'm in a Take away." look Oi=11 :i(i,6)>0''"They have fish at `1":ask:a$="b"hold Oi=12 :i(i,6)>0''"They have pies at `1":ask:a$="b"hold Pi=13 :i(i,6)>0''"They have chips at `1":ask:a$="b"hold unlook:reverse , 62008  62008  62008 X Grocer ]+4:0::"I'm in the Grocers." _look bOi=14:i(i,6)>0''"He has Bananas at `3":ask:a$="b"hold dOi=15:i(i,6)>0''"He has Oranges at `2":ask:a$="b"hold fNi=16:i(i,6)>0''"He has Apples at `1":ask:a$="b"hold hMi=4:i(i,6)>0''"He has Garlic at `1":ask:a$="b"hold junlook:reverse Jeweller 53:0::"I have entered the Jewellers." look Ɩ:i=7:z=1i(i,6):z*40(,30:0,15:5,0:0,3:-5,0:0,5:-3,0:0,-5:-5,0:0,-3:5,0:0,-15:3,0:z:i(i,6)>0''"He has Crucifix for sale. He"''"claims they are Vampire proof"''"and a bargain at `20.":ask:a$="b"hold Ȩi=2::z=1i(i,6):z*502+22,31:0,4:0,-3:5,2:z*502+22,31,7:z*502,30:15,0:0,3:-15,0:0,-3:z*502+30,30:15,0:0,3:-15,0:0,-3:z:i(i,6)>0''"He has watches at `10.":ask:a$="b"hold unlook:reverse  Boathouse ",1:7::"I'm at the Boathouse" %look *i=3:z=1i(i,6):z*557,20:30,0:6,6:-42*,0:7,-6:z:i(i,6)>0''"There are old canoes for sale"''"at `10.":ask:a$="b"hold /unlook:reverse  Store 85:0::"I am in the general store.":look :i=10 :z=1i(i,6):z*40(,20:10 ,10 ,5:9 ,-9 ,4:-5,1,3:-5,0,-3:z:i(i,6)>0''"The storekeeper has some long"'"ropes at `2":ask:a$="b"hold :i=9 :z=1i(i,6):z*40(,20:0,30:z*40(+7,20:0,30:y=17:z*40(,y*4+20:6,0:y:z:i(i,6)>0''"He has good strong ladders"'"at `3.":ask:a$="b"hold  :i=8:z=1i(i,6):z*40(,30:20,0:0,10 ,4:z*40(+20,30:0,-10 ,-4:z:i(i,6)>0''"He says he can let me have a"'"grapnel hook for `3":ask:a$="b"hold G:i=6:z=1i(i,6):z*40(+15,30:0,4,1:z*40(,30:15,0:0,-4:4,0:0,12 :-4,0:0,-4:-15,0:0,-4:z:i(i,6)>0''"He has hammers at `2":ask:a$="b"hold unlook:reverse  62008 L 62008  Inn 07:1::"I've arrived at the Inn." look baf17615 ;''"Breakfast is available at `1.":i=20:7625 laf17617 7''"Lunch is available at `2.":i=19:7625 taf17620 5''"Tea is available at `1.":i=18:7625 daf17650 ,''"Dinner is available at `3.":i=17 ask:a$"e"a$"b"reverse Bp(9 )1000''"I can't eat anymore !":delay:reverse Hp(9 )=p(9 )-i(i,3):p(6)=p(6)+i(i,2) unlook:reverse  Tower B3:0::"I have entered one of the three"''"towers." I''"An inscription on the wall says,"''"""You may sleep here - once !""" #ask:a$"s"reverse (%sleep:l$(l,12 )="u":gameloop  7700 @ Farm Eg4:0::"I'm in a farm."'''"The farmer would like to know"''"which field he should tend." J(''"Barley, wheat, oats or corn ?":ask Oa$="b"bar=bar+1 Pa$="w"whe=whe+1 Qa$="o"oat=oat+1 Ra$="c"cor=cor+1 T%bar<3''"Barley needs care." U$whe<3''"Wheat needs care." V"oat<3''"Oats need care." W#cor<3''"Corn needs care." Xdelay Ydoors:close ^ reverse ! 8000@ "` Castle "bT2:0::"I am in the Vampires Castle."''"The door has shut behind me." "js$="n":delay:delay "o'cas=1:l=28:doors:close "tgameloop #( #$i=1502:f$(i):i: #9l=128:l$(l);l(l,1);l(l,2) #l: $40:l=128:doors:close:l: %l0:23760\:8:x=0255:x,0:x,1:x,174:x,175:x %!^0:8:x=0175:0,x:1,x:254,x:255,x:x %#Y1:1,1:1,174:254,1:254,174 %& %,x=100d:y=100d:plot=0 % get %4(x,y)=11;8;8;x,y %Zx=x+(="8"x<255)-(="5"x>0):y=y+(="7"y<175)-(="6"y>0) %)plot=08;1;x,y %="q"plot=1 %!="a"plot=0 %plot=1put %9601% & &u23802\,32 ::"vampire"10 :0*23760\:4:" "::"Replay to verify":"" ' 10 ' Finder ' 'a=23635S\+256*23636T\ ' <a*256+(a+1);5;¾(a+4),a+5 ' 1a=a+4+(a+2)+256*(a+3) '3a*256+(a+1)<10000'9996 ' '  @׀V<?????|??|??|??h|?|~x???~????~~???~~?????@~?_~`~??~???????~~???|?~~?????~~?~~?~???~?@?~???~~ """" &&&& %%%% """" &&&& %%%%% """ &&&& %%%%% '''' """ &&&& %%%%% '''' """ &&& %%%%% '''' """" " ## '''' """"" ""! ##### '''' """"""""""!! ###### '''' """"""""!!! ###### """""" !!! ###### !!!! #### !!!!! ## !! !!!!!! !!!!!!! ! !!!! !!!! !!!!! !!!!!!!!! !!!! !!!! !!!!!! !!!!!!!!!!!!!! !!!!!! !!!!!!!!!!!!! !! !!!!!!!! !!!!