pico-8 cartridge // http://www.pico-8.com version 39 __lua__ -- setup modules={} real_modules={} frame=0 function _init() -- printh("restarting") _doall("init") end function _update() frame+=1 if (frame%1==0) _doall("update") end function _draw() _doall("draw") end mnames={} function names(root) local n=mnames[root] if(n)return all(n) n={root.."0", root, root.."2", root.."3"} mnames[root]=n return all(n) end function _doall(x) for n in names(x) do for mod in all(modules) do local f=mod[n] if (f) f(mod) end end end -- source: https://www.lexaloffle.com/bbs/?pid=78990 gaps=split"57,23,10,4,1" --{701,301,132,57,23,10,4,1} function shellsort(a) for gap in all(gaps) do for i=gap+1,#a do local x,j=a[i],i-gap while j>=1 and a[j].key>x.key do a[j+gap]=a[j] j-=gap end a[j+gap]=x end end end function linefill(ax,ay,bx,by,r,c) if(c) color(c) local dx,dy=bx-ax,by-ay -- avoid overflow -- credits: https://www.lexaloffle.com/bbs/?tid=28999 local n,d=_mnmx(abs(dx),abs(dy)) n/=d d*=sqrt(n*n+1) if(d<0.001) return local ca,sa=dx/d,-dy/d -- polygon points local spans={} local function calcxy(u,v) return ax+u*ca+v*sa,ay-u*sa+v*ca end local x0,y0=calcxy(0,r) for s in all{{0,-r},{d,-r},{d,r},{0,r}} do local x1,y1=calcxy(unpack(s)) local _x1,_y1=x1,y1 if(y0>y1) x0,y0,x1,y1=x1,y1,x0,y0 local dx=(x1-x0)/(y1-y0) if(y0<0) x0-=y0*dx y0=-1 local cy0=y0\1+1 -- sub-pix shift x0+=(cy0-y0)*dx for y=y0\1+1,min(y1\1,127) do -- open span? local span=spans[y] if (span) rectfill(x0,y,span,y) spans[y]=x0 x0+=dx end x0,y0=_x1,_y1 end end function _apply(x,ts,a) local t=deli(ts,1) for k,v in pairs(t) do if (k!="update") x[k]=v end if (t and t.update and not t.update(x,a)) add(ts,t,1) end function sgn0(x) return x!=0 and sgn(x) or 0 end function _mnmx(x,y) if (x>y)return y,x return x,y end function _rast( xs,ys,x0,y0,x1,y1 ) local function _add() local n=#xs if (n==0 or xs[n]!=x0 or ys[n]!=y0) add(xs,x0) add(ys,y0) end local dx,dy=abs(x1-x0),abs(y1-y0) local sx=-1 local sy=-1 if (x0dy then err=dx/2.0 while x0!=x1 do _add() err-=dy if (err<0) y0+=sy err+=dx x0+=sx end else err=dy/2.0 while y0!=y1 do _add() err-=dx if (err<0) x0+=sx err+=dy y0+=sy end end _add() end -->8 -- input kbd={} add(real_modules,kbd) function kbd:init() self.real=btn() self.state={btn=0} end function kbd:update() -- figure out what keys are _really_ pressed local now_real,was_real=btn(),self.real self.real=now_real -- add keys that are really pressed -- if they weren't really pressed before -- (they may have been force- -- released by :release()) local real_pressed=~was_real&now_real local state=self.state local now_down=state.btn&now_real|real_pressed local was_down=state.btn -- deduce pressed/released by changes in down state.btn,state.btnp,state.btnr= now_down, ~was_down&now_down, ~now_down&was_down end for _kbdi in all(split"btn,btnp,btnr") do kbd[_kbdi]=function(self,i,t) return 1<"..tostring(v).." " end return str.."}" end return tostr(any) end -->8 -- title screen title={} add(modules,title) blinkcol=10 function title:draw() cls(0) -- this is right for 72x32 spr(96,28,56,9,2) print("pyrex",32,73,7) print("[nyeogmi]",62,73,7) print("kistaro",32,79,7) local lvlstr = "⬅️ "..start_level.." ➡️" print(lvlstr,50,91,1) print(lvlstr,51,90,blinkcol) end start_level=0 max_level=31 function title:update() blinkcol=9 if (time()*4\1%2==0) blinkcol=10 if (btnp"0") start_level-=1 if (btnp"1") start_level+=1 start_level%=max_level if (btnp"4" or btnp"5") modules=real_modules _init() music(0) end -->8 --level behaviors level={} add(real_modules,level) function level:init() level:reinit(start_level) end function level:reinit(n) self.ix=n self.todo={} self.bigx,self.bigy=n%8,n\8 self:load_dynobjs() self:recollide() self:reanchor(true) self:spawn_exit() end function level:restart() self:reinit(self.ix) end function level:advance() self:reinit(self.ix+1) end normpal = {[1]=0,[8]=0,[14]=0} pitpal = {[8]=0,[13]=3,[4]=3,[7]=3} function level:draw() fillp(0b1111111110111111) rectfill(0,0,127,127,0x55) fillp() pal(normpal) map( self.bigx*16,self.bigy*16, 0,0,16,16, 64 -- flag 6: visible ) for _,pit in pairs(self._pits) do local px,py=pit.px,pit.py local pr=self._pits[_mix(px+1,py)] spr(pit.s,px,py) if pit.contents then pal(pitpal) palt(0,false) --spr(pit.contents,pit.px,pit.py) spr(79,pit.px,pit.py) pal() pal(normpal) end palt(8,true) spr(pit.s,px,py) palt() end for _,crate in pairs(self._crates) do spr(crate.s,crate.px,crate.py) end pal() end function level:busy() for _,crate in pairs(self._crates) do if (#crate.todo>0) return true end return false end function level:update() _apply(self, self.todo) local remove={} for cix,crate in pairs(self._crates) do _apply(crate, crate.todo) if #crate.todo==0 then local pit=self._pits[_mix(crate.mx,crate.my)] if pit and not pit.contents then add(remove,cix) crate.dead=true pit.contents=crate.s end end end for cix in all(remove) do self._crates[cix]=nil end if #remove>0 then self:recollide() self:reanchor() end end function level:load_dynobjs() self._crates={} self._pits={} local crate_id=1 for mx=0,15,1 do for my=0,15,1 do local mxy=_mix(mx,my) local px,py=mx*8,my*8 local s=self:_mget(mx,my) local def=self:_get_cratedef(s) if def then self._crates[mxy]={ s=s,def=def, id=crate_id, mx=mx,my=my, px=px,py=py, todo={} } crate_id+=1 end -- pit if (fget(s,5)) self._pits[mxy]={s=s,mx=mx,my=my,px=px,py=py} end end end function level:recollide() self._coll={} for mx=0,15 do for my=0,15 do local mxy=_mix(mx,my) self._coll[mxy]= fget(self:_mget(mx,my),7) or self._crates[mxy]!=nil end end end function level:reanchor() local anch_new={} for dxy in all{{-1,-1},{1,-1},{-1,1},{1,1}} do local dx,dy=unpack(dxy) assert(dx!=0 and dy!=0) for mx0=0,15 do for my0=0,15 do local mx1,my1=mx0+dx,my0+dy if ( self:mcoll(mx0,my0) and not self:get_crate(mx0,my0) and not self:mcoll(mx0,my1) and not self:mcoll(mx1,my0) and not self:mcoll(mx1,my1) ) then local key="GEOM"..mx0..","..my0..","..dx..","..dy anch_new[key]= { ax=max(mx0,mx1),ay=max(my0,my1),adx=-dx,ady=-dy } end end end for _,cr in pairs(self._crates) do local key="CRATE"..cr.id..","..dx..","..dy local mx0,my0=cr.mx,cr.my local mx1,my1=mx0+dx,my0+dy anch_new[key]={ ax=max(mx0,mx1),ay=max(my0,my1),adx=-dx,ady=-dy } end end local anch_old=self._anch if (anch_old==nil) anch_old={} for _,old in pairs(anch_old) do old.dropped=true end for k,new in pairs(anch_new) do local old=anch_old[k] if old then anch_new[k]=old old.ax_old,old.ay_old,old.ax,old.ay,old.adx,old.ady=old.ax,old.ay,new.ax,new.ay,new.adx,new.ady old.dropped=nil end end self._anch=anch_new self._anch_keys={} for k,_ in pairs(self._anch) do add(self._anch_keys,{key=k}) end shellsort(self._anch_keys) for point in self:anchor_points() do if point.ax_old and player.rope and (point.ax_old != point.ax or point.ay_old != point.ay) then -- printh("moving: "..tostring({point.ax_old,point.ay_old}).."=>"..tostring({point.ax,point.ay})) player.rope:be_pushed_by(point,point.ax_old,point.ay_old) end point.ax_old,point.ay_old=nil,nil end if (player.rope) player.rope:relax() end function level:win_at(mx,my) return self._wins[_mix(mx,my)] end function level:anchor_points() keys=all(self._anch_keys) return function() local k=keys() if (k==nil) return nil return self._anch[k.key] end end function level:get_open_pit(mx,my) local pit=self._pits[_mix(mx,my)] if (pit and pit.contents==nil) return pit end function level:spawn_exit() self._wins={} local spawned=false local spawn_at=function(x,y) if (self:_mget(x,y)!=1) return assert(not spawned,x..","..y) spawned=true player:reinit(x,y) player.orientx=-1 if (x<8) player.orientx=1 end local win_at=function(x,y) if (self:_mget(x,y)!=18) return for nx=x-1,x+1 do for ny=y-1,y+1 do -- next check: is at least one of -- nx or ny out of range [0, 15]? if (nx | ny) & 0xFFF0 ~= 0 then self._wins[_mix(nx,ny)]=true end end end end for f in all{spawn_at,win_at} do for x=1,14 do f(x,0) f(x,15) end for y=0,15 do f(0,y) f(15,y) end end assert(spawned) end function level:mcoll(mx,my) return self._coll[_mix(mx,my)]!=false end function level:pcoll(px,py) return self:mcoll(px\8,py\8) end function level:get_crate(mx,my) return self._crates[_mix(mx,my)] end function level:_mget(mx,my) return mget( self.bigx*16+mx, self.bigy*16+my ) end function _amix(ax,ay) return ax..","..ay end function _mix(mx,my) return mx..","..my end -- crate spec: -- "up" == 1 -- "right" == 2 -- "down" == 4 -- "left" == 8 -- -- +1+ -- 8 2 -- +4+ function level:_get_cratedef(s) if (s<64 or s>=80) return return s & 0x000F end function level:get_latch(dx,dy,px,py) local mx,my=px\8,py\8 local mxy=_mix(mx,my) local crate=self._crates[mxy] local dx1,dy1=-sgn0(dx),-sgn0(dy) if crate then if crate.def & dy1*dy1*(2.5+1.5*dy1)+dx1*dx1*(5-3*dx1) ~= 0 then return { el="crate", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec=crate } end end local m=self:_mget(mx,my) if (m==60 and dy1<0) or (m==61 and dx1>0) or (m==62 and dy1>0) or (m==63 and dx1<0) then return { el="eyehook", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec={mx=mx,my=my,px=mx*8,py=my*8}, } end end ropecheck=split"-0.6,0.4,0.4" function level:can_move( is_player, mx0,my0,dmx,dmy,exclude_src,exclude_dst ) local mx1,my1=mx0+dmx,my0+dmy if (is_player and self:win_at(mx1,my1)) return true if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned() if (self:mcoll(mx1,my1) or player.x==mx1 and player.y==my1) return false if player.rope then local w,h=1.2,0.2 if (dmx==0) w,h=0.2,1.2 if (player.rope:collide_mrect(mx0+ropecheck[dmx+2],my0+ropecheck[dmy+2],w,h,exclude_src,exclude_dst)) return false end return true end function level:tug_crate(mx0,my0,dmx,dmy) local mxy0=_mix(mx0,my0) local existing=self._crates[mxy0] if (not existing) return self._crates[mxy0]=nil local mx1,my1=mx0+dmx,my0+dmy local px1,py1=mx1*8,my1*8 existing.todo={ {px=px1+dmx,py=py1+dmy,mx=mx1,my=my1,update=function() self:recollide() self:reanchor() return true end}, {px=px1,py=py1} } self._crates[_mix(mx1,my1)]=existing end -->8 --player handling player={} add(real_modules,player) function player:init() -- don't change this on reinit: -- it stays the same when the level is changed or reloaded self.vanish_frame=0 end function player:reinit(x,y) self.x,self.y=x,y self.px,self.py=0,0 self.todo={} self.cooldown=4 self.rope=nil self.fall_frame=0 self.orientx,self.orienty=-1,0 end function player:update() -- this is a non-gameplay action that takes precedence over -- all gameplay actions self:_vanish_if_requested() if not (#self.todo>0 or level:busy()) then if level:win_at(self.x,self.y) then level:advance() return end if level:get_open_pit(self.x,self.y) then self.todo={{update=self._fall}} return end if kbd:btn(0) then self.orientx=-1 self.orienty=0 elseif kbd:btn(1) then self.orientx=1 self.orienty=0 elseif kbd:btn(2) then self.orienty=-1 elseif kbd:btn(3) then self.orienty=1 end function btncd(x) return (kbd:btn(x) and self.cooldown==0) or kbd:btnp(x) end if kbd:btn(4) then if kbd:btnp(4) and self.rope then self.rope:destroy() kbd:release(4) end -- wait for user to release it else local x,y=self.x,self.y local function try_move(dx,dy,f) if level:can_move(true,x,y,dx,dy,0,2) then self.todo=f self.cooldown=3 local t=f[#f] t.x=x+dx t.y=y+dy return end wrongbleep:bleep() end if btncd(0) then try_move(-1,0,{{orientx=-1,orienty=0,px=-2,py=0},{px=1}}) elseif btncd(1) then try_move(1,0,{{orientx=1,orienty=0,px=2,py=0},{px=-1}}) elseif btncd(2) then try_move(0,-1,{{orienty=-1,px=0,py=-2},{py=1}}) elseif btncd(3) then try_move(0,1,{{orienty=1,px=0,py=2},{py=-1}}) elseif not self.rope and kbd:btnr(4) then local dx,dy=self.orientx,self.orienty if (dy!=0) dx=0 while not level:mcoll(x,y) do x+=dx y+=dy end self.rope=rope:new( x+0.5-dx*0.5,y+0.5-dy*0.5, self.x+0.5,self.y+0.5, level:get_latch(dx,dy,x*8,y*8) ) self.todo={{ update=function() return not self.rope or self.rope:latched() end }} elseif kbd:btnp(5) then if (self.rope and not self.rope:tug()) wrongbleep:bleep(9) end end end if (#self.todo==0) self.px=0 self.py=0 _apply(self,self.todo) if (self.cooldown>0) self.cooldown-=1 if self.rope then self.rope:update() if self.rope:done_reeling() then local latch=self.rope.latch self.x=latch.rec.mx+latch.dx self.y=latch.rec.my+latch.dy end self.rope:drag_dst( self.x+self.px/8+0.5, self.y+self.py/8+0.5 ) local tdx,tdy=self.rope:tug_orientxy() if (tdx) self.orientx=tdx if (tdy) self.orienty=tdy if (self.rope:done()) self.rope=nil end end function player:_vanish_if_requested() if kbd:btn(5) then self.vanish_frame+=1 if (self.fall_frame>0 or self.vanish_frame>20) then self.rope=nil level:restart() kbd:release(5) self.vanish_frame=20 end else self.vanish_frame-=1 end self.vanish_frame=max(self.vanish_frame,0) end function player:_fall() if (self.fall_frame<10) self.fall_frame+=1 end function player:draw() local px=self.x*8+self.px+wrongbleep:vibrate() local py=self.y*8+self.py+wrongbleep:vibrate() local head=1-self.orienty local vanish_level=max((self.vanish_frame-4)/16,0) local invis_level=max(self.fall_frame/10,4*(vanish_level-0.75)) if (invis_level>=1.0) return --[[ local HEAD=14--3 local BODY=12--12 local TAIL=14--14 local IRIS=7--9 local PUPIL=0--0 ]] -- in order: head,body,iris,pupil,body again,tail local palette=split"-1,14,14,12,12,-1,-1,-1,7,0,-1,12,14,14,14" local function setpal() --[[ -- head nil,14,14, --body [2]=HEAD, [3]=HEAD, [4]=BODY, [5]=BODY, [9]=IRIS, [10]=PUPIL, [12]=BODY, [13]=TAIL, [14]=TAIL, [15]=TAIL, ]] pal(palette) -- vanish colors local vanish=split"13,15,14,5,4,12,2,3,9,10" for i,ilc in ipairs(vanish) do if (vanish_level>i/#vanish) pal(ilc,5) end if (self.fall_frame>3) local zc=@0x5f00&0xf0 for i=0x5f00,0x5f0c,4 do poke4(i,0x0101.0101) end poke(0x5f00,zc|0x01) end local rx,ry=self.x*8+self.px+1,self.y*8+self.py+2 if (self.orientx==1) rx+=6 if self.rope then local rx_adj,ry_adj=self.rope:affected_src_xy(rx,ry) if rx_adj then local drx,dry=rx_adj-rx,ry_adj-ry rx,ry=rx+drx,ry+dry px,py=px+drx,py+dry end end if self.orientx==-1 then setpal() spr(16,px+6,py-2,1,1) spr(17,px+1,py,1,1) if (self.rope and invis_level<=0.25) pal() self.rope:draw(self.x*8+self.px+1,self.y*8+self.py+2) setpal() spr(head,px-3,py-3,1,1) else setpal() spr(16,px-6,py-2,1,1,true) spr(17,px-1,py,1,1,true) if (self.rope and invis_level<=0.25) pal() self.rope:draw(self.x*8+self.px+7,self.y*8+self.py+2) setpal() spr(head,px+3,py-3,1,1,true) end pal() end -->8 -- rope physics rope={} rope.__index=rope function rope:new( src_ax,src_ay,dst_ax,dst_ay,latch ) local r={ id=0, anchors={ {ax=src_ax,ay=src_ay}, {ax=dst_ax,ay=dst_ay} }, state={name="cast",frame=0}, latch=latch, } r.src=r.anchors[1] r.dst=r.anchors[2] r.src.next=r.dst r.dst.prev=r.src setmetatable(r,rope) return r end function rope:latched() return self.state.name=="latched" end function rope:done() return self.state.name=="done" end function rope:done_reeling() return self.state.name=="done" and self.state.reelin end function rope:update() if self.state.name=="cast" then self.state.frame+=1 if (self.state.frame>=3) self.state={name="latched"} elseif self.state.name=="latched" then if (self.latch==nil) wrongbleep:bleep(5) self:destroy() return if self.latch and self.latch.rec then self:drag_src( self.latch.rec.mx+0.5+self.latch.ax_offset, self.latch.rec.my+0.5+self.latch.ay_offset ) if self.latch.rec.dead==true then self:destroy() end end if (not self:_check_sane()) self:destroy() elseif self.state.name=="destroy" then -- destroy self.state.frame+=1 if (self.state.frame>=4) self.state={name="done",reelin=self.state.reelin} else -- done state end end function rope:destroy(reelin) if (self.state.name=="destroy" or self.state.name=="done") return self.state={name="destroy",frame=0,reelin=reelin} end function rope:affected_src_xy(artificial_px,artificial_py) -- this is the loop from :draw but simplified if (not self.state.reelin) return perc_to_show=(1.0-self.state.frame/8)^2 local points=self:_anchors_simplified() points[#points]={x=artificial_px,y=artificial_py} local len=0 for i=1,#points-1 do len+=distance(points[i],points[i+1]) end local len_to_show=perc_to_show*len local len_cumulative=0 for i=1,#points-1 do local src=points[i] local dst=points[i+1] local x,y=dst.x,dst.y local dx,dy=src.x-x,src.y-y local len_here=len_to_show-len_cumulative local dist_base=distance_dxy(dx,dy) len_cumulative+=dist_base if len_here>0 and dist_base>0 then local coef=min(len_here/dist_base,1.0) return x+dx-dx*coef,y+dy-dy*coef end end return points[1] end function rope:draw(artificial_px,artificial_py) local points,highlight=self:_tug(true) local n,perc_to_show,from_end = self.state.name,1.0,false if (n=="done") return if (n=="cast") perc_to_show=self.state.frame/2 if (n=="destroy") perc_to_show=(1.0-self.state.frame/4)^2 if (self.state.reelin) from_end=true points[#points]={x=artificial_px,y=artificial_py} local len=0 for i=1,#points-1 do len+=distance(points[i],points[i+1]) end local len_to_show=perc_to_show*len local len_cumulative=0 local ia,iz,istep=#points-1,1,-1 if (from_end) ia,iz,istep=1,#points-1,1 local function colorh(ix) color(8) if (highlight==ix) color(12) end for i=ia,iz,istep do local src=points[i] local dst=points[i+1] local x,y=dst.x,dst.y local dx,dy=src.x-x,src.y-y local len_here=len_to_show-len_cumulative local dist_base=distance_dxy(dx,dy) len_cumulative+=dist_base if len_here>0 and dist_base>0 then local coef=min(len_here/dist_base,1.0) if from_end then x,y=x+dx-dx*coef,y+dy-dy*coef dx,dy=dx*coef,dy*coef else dx,dy=dx*coef,dy*coef end colorh(i) linefill(x,y,x+0.25*dx,y+0.25*dy,1.0) linefill(x+0.25*dx,y+0.25*dy,x+1*dx,y+1*dy,0.5) linefill(x+0.9*dx,y+0.9*dy,x+dx,y+dy,1.0) circfill(x+dx+0.5,y+dy+0.5,1.0) end end -- draw latch local l=self.latch if l and l.rec and (perc_to_show>=1.0 or from_end) then local function rfsplit(x) rectfill(unpack(split(x))) end local ldx,ldy=l.dx,l.dy colorh(0) camera(-l.rec.px,-l.rec.py) if (ldx==-1) rfsplit"0,3,2,4" if (ldx==1) rfsplit"5,3,7,4" if (ldy==-1) rfsplit"3,0,4,2" if (ldy==1) rfsplit"3,5,4,7" camera() color() end -- debug --[[ local n1=self.src local sy=0 while true do if (n1==nil) break local x=n1.ax*8 local y=n1.ay*8 if n1.associated_with then if (n1.associated_with.adx>0) x-=1 if (n1.associated_with.ady>0) y-=1 end rectfill(x-1,y-1,x+1,y+1,12) print("ax="..n1.ax..",ay="..n1.ay,72,sy) print(tostring(n1.associated_with and (not n1.associated_with.dropped and n1.associated_with.ax==n1.ax and n1.associated_with.ay==n1.ay)),76,sy+7) sy+=14 local n0=n1.prev local n2=n1.next if n0!=nil and n2!=nil then if n1.associated_with then local _,_,_,adx,ady=would_stick(n0.ax,n0.ay,n1.associated_with,n2.ax,n2.ay) assert(adx==-1 or adx==0 or adx==1) assert(ady==-1 or ady==0 or ady==1) --assert(not (adx==0 and ady==0)) local c=3 if (n1.associated_with.dropped) c=4 rectfill(x+2,y+2,x+4,y+4,c) pset(x+adx*2,y,9) pset(x,y+ady*2,9) else rectfill(x+2,y+2,x+4,y+4,2) end else rectfill(x+2,y+2,x+4,y+4,4) end n1=n1.next end for _,p in pairs(level._anch) do local x,y=p.ax*8,p.ay*8 if (p.adx>0) x-=1 if (p.ady>0) y-=1 pset(x,y,11) pset(x+p.adx,y,11) pset(x,y+p.ady,11) end ]] end function rope:drag_dst(x,y) self:drag(self.dst,x,y) end function rope:drag_src(x,y) self:drag(self.src,x,y) end function rope:drag(n1,ax_new,ay_new) self:relax() self:_drag(n1,ax_new,n1.ay) self:_drag(n1,ax_new,ay_new) self:relax() end function rope:relax() local n0=self.src while true do if (n0==nil) break if n0.associated_with and n0.associated_with.dropped then for i in level:anchor_points() do if i.ax==n0.ax and i.ay==n0.ay then n0.associated_with=i break end end end n0=n0.next end local n0=self.src while true do local n1=n0.next if (n1==nil) break local n2=n1.next if n0.ax==n1.ax and n0.ay==n1.ay then n0.next=n2 if (n2!=nil) n2.prev=n0 else n0=n0.next end end local n0=self.src while true do if (n0==nil) return local n1=n0.next if (n1==nil) return local n2=n1.next if (n2==nil) return if n1.associated_with!=nil then local x0,y0=n0.ax,n0.ay local x1,y1=n1.ax,n1.ay local x2,y2=n2.ax,n2.ay if x1!=n1.associated_with.ax or y1!=n1.associated_with.ay then -- printh("dragging home: "..tostring{n1.ax,n1.ay}.."->"..tostring(n1.associated_with)) self:_drag(n1,n1.associated_with.ax,n1.associated_with.ay) end local would,x1_new,y1_new=would_stick(x0,y0,n1.associated_with,x2,y2) if not would and not (n1.ax==x1_new and n1.ay==y1_new) then -- printh("dragging: "..tostring{n1.associated_with, {x1_new, y1_new}}) -- printh("relaxing: "..tostring(n0.associated_with).."->"..tostring(n1.associated_with).."->"..tostring(n2.associated_with)) self:_drag(n1,x1_new,y1_new,n1.ax,n1.ay) n0=n1.prev n2=n1.next n0.next=n2 n2.prev=n0 n1.next=nil n1.prev=nil else n0=n0.next end else n0=n0.next end end end function rope:_check_sane() if (not self:latched()) return true if (level:busy()) return true local n0=self.src local qxs,qys={},{} while true do local n1=n0.next if (n1==nil) break _rast(qxs,qys,flr(n0.ax*2),flr(n0.ay*2),flr(n1.ax*2),flr(n1.ay*2)) n0=n1 end local function _possible_tiles(qx,qy) local mx0=(qx-1)\2 local mx1=qx\2 local my0=(qy-1)\2 local my1=qy\2 local poss={} for mx=mx0,mx1 do for my=my0,my1 do add(poss,{mx=mx,my=my}) end end return poss end local function _blocked(qx,qy) for i in all(_possible_tiles(qx,qy)) do if (not level:mcoll(i.mx,i.my)) return false end return true end -- find cases where i move through an impassable zone for i=1,#qxs do if (_blocked(qxs[i],qys[i])) return false end -- find cases where i am cut off diagonally for i=3,#qxs do local qx1,qy1=qxs[i-1],qys[i-1] if qx1%2==0 and qy1%2==0 then local ok=false for m0 in all(_possible_tiles(qxs[i-2],qys[i-2])) do for m2 in all(_possible_tiles(qxs[i],qys[i])) do local mx0,my0=m0.mx,m0.my local mx2,my2=m2.mx,m2.my if not (level:mcoll(mx0,my0) or level:mcoll(mx2,my2)) then local dmx,dmy=abs(mx2-mx0),abs(my2-my0) if dmx==1 and dmy==1 and level:mcoll(mx0,my2) and level:mcoll(mx2,my0) then else --printh("ok! "..tostring({qxs[i-2],qys[i-2]})..tostring({qxs[i],qys[i]})..tostring(m0)..tostring(m2)) ok=true end end end end if (not ok) return false end end return true end function would_stick(x0,y0,anchor,x2,y2) local x1,y1=anchor.ax,anchor.ay local dx=x2-x0 local dy=y2-y0 if (x1==x0 and y1==y0) return false if (x1==x2 and y1==y2) return false local adx,ady local x1_new,y1_new if abs(dx)>abs(dy) then if (x0>x2) dx,x0,y0,x2,y2=-dx,x2,y2,x0,y0 local dprop=(x1-x0)/dx x1_new,y1_new=x1,y0+dprop*(y2-y0) ady=sgn0(y1_new-y1) adx=0 if (y0>y2) adx=ady if (y0y2) dy,x0,y0,x2,y2=-dy,x2,y2,x0,y0 local dprop=(y1-y0)/dy x1_new,y1_new=x0+dprop*(x2-x0),y1 adx=sgn0(x1_new-x1) ady=0 if (x0>x2) ady=adx if (x0"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) else n0=n0.next end end end function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing) local function _sweep_radar(ax_lhs,ay_lhs,ax_rhs,ay_rhs,ax_pivot,ay_pivot,ax_far0,ay_far0,ax_far1,ay_far1) local function _uncreatable(anchor) return (anchor.ax==ax_lhs and anchor.ay==ay_lhs) or (anchor.ax==ax_rhs and anchor.ay==ay_rhs) or (anchor.ax==ax_removing and anchor.ay==ay_removing) end if (ax_far0==ax_far1 and ay_far0==ay_far1) return nil if ax_far0==ax_far1 then local ax_far=ax_far0 local ax0,ax1=_mnmx(ax_pivot,ax_far) ay_far_old=ay_far0 for ay_far_new in _stepfrom(ay_far0,ay_far1) do for anchor in level:anchor_points() do if not _uncreatable(anchor) and (ax0<=anchor.ax and anchor.ax<=ax1) and would_stick(ax_pivot,ay_pivot,anchor,ax_far,ay_far_new) and ( _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_old) != _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_new) ) then return anchor end end ay_far_old=ay_far_new end elseif ay_far0==ay_far1 then local ay_far=ay_far0 local ay0,ay1=_mnmx(ay_pivot,ay_far) ax_far_old=ax_far0 for ax_far_new in _stepfrom(ax_far0,ax_far1) do for anchor in level:anchor_points() do if not _uncreatable(anchor) and (ay0<=anchor.ay and anchor.ay<=ay1) and would_stick(ax_pivot,ay_pivot,anchor,ax_far_new,ay_far) and ( _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_old,ay_far) != _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_new,ay_far) ) then return anchor end end ax_far_old=ax_far_new end end end local ax1_old,ay1_old=n1.ax,n1.ay n1.ax=ax1_new n1.ay=ay1_new local n0=n1.prev while true do if (n0==nil) break local anch=_sweep_radar( n0.ax,n0.ay,n1.ax,n1.ay, n0.ax,n0.ay,ax1_old,ay1_old,ax1_new,ay1_new ) if (anch==nil) break local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1} -- printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) n0.next=n05 n1.prev=n05 n0=n05 end local n2=n1.next while true do if (n2==nil) break local anch=_sweep_radar( n1.ax,n1.ay,n2.ax,n2.ay, n2.ax,n2.ay,ax1_old,ay1_old,ax1_new,ay1_new ) if (anch==nil) break local n15={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n1,next=n2} -- printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with)) n1.next=n15 n2.prev=n15 n2=n15 end end function _stepfrom(x0,x1) local done=false if x0==x1 then return function() if (done) return done=true return x0 end end local mul=0.5 x0*=2 x1*=2 if (x0>x1) x0,x1,mul=-x0,-x1,-mul local i=flr(x0) local top=flr(x1) return function() if (done) return nil i+=1 if i>top then done = true if (x1!=flr(x1)) return mul*x1 return nil end return mul*i end end function _which_side(x,y,x0,y0,x1,y1) return sgn0((x1-x0)*(y-y0) - (y1-y0)*(x-x0)) end function distance_dxy(dx,dy) return sqrt(dx*dx+dy*dy) end function distance(p1,p2) local dx=p2.x-p1.x local dy=p2.y-p1.y return sqrt(dx*dx+dy*dy) end function rope:collide_mrect(mx0,my0,mw,mh,exclude_src,exclude_dst) local mx1,my1=mx0+mw,my0+mh local n0=self.src while true do local n1=n0.next if (n1==nil) return false local nd=n0 for i=1,exclude_dst do nd=nd.next if (nd==nil) return false end local x1,y1,x2,y2=n0.ax,n0.ay,n1.ax,n1.ay local function _line_line(x3,y3,x4,y4) local denom=((y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)) local ua= ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/denom if (ua<0 or ua>1) return false local ub= ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom if (ub<0 or ub>1) return false return true end if exclude_src<=0 then if (_line_line(mx0,my0,mx1,my0) or _line_line(mx0,my0,mx0,my1) or _line_line(mx0,my1,mx1,my1) or _line_line(mx1,my0,mx1,my1)) return true end exclude_src-=1 n0=n1 end end -->8 -- moved here because it's complicated function rope:tug_orientxy() local a1=self.dst local a0=self.dst.prev local dx=a0.ax-a1.ax local tdx=nil if (dx>3/8) tdx=1 if (dx<-3/8) tdx=-1 local dy=a0.ay-a1.ay local tdy=nil if abs(dy)>abs(dx)/2 then if (dy>3/8) tdy=1 if (dy<-3/8) tdy=-1 end return tdx,tdy end function rope:tug() if (not self:latched()) return return self:_tug() end function rope:_tug(hypothetically) local ancs=self:_anchors_simplified() local touched={} for i=#ancs-1,2,-1 do local ops_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2]) local ops_to_do,corners={} if #ops_before_trash>0 then ops_to_do=ops_before_trash else local ops_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1]) ops_to_do=ops_after_trash end local ops=ops_to_do if #ops>0 then if (hypothetically) return ancs,i-1 local dmx,dmy=ops[1].dmx,ops[1].dmy for o in all(ops) do level:tug_crate(o.mx,o.my,o.dmx,o.dmy) end return true end end local latch=self.latch if latch!=nil and latch.el=="eyehook" then if (hypothetically) return ancs,0 player.todo={{ update=function(s) if s.rope==nil or s.rope:done() then return true end end }} self:destroy(true) return true end if latch!=nil and latch.el=="crate" then local dmx,dmy= sgn0(latch.dx), sgn0(latch.dy) local obj_anc=ancs[1] local pull_anc=ancs[2] local pull_dx=pull_anc.x-obj_anc.x local pull_dy=pull_anc.y-obj_anc.y local mx0=latch.rec.mx local my0=latch.rec.my local mxa=(pull_anc.x+dmx)\8 local mya=(pull_anc.y+dmy)\8 local invalid_move=false if (dmx!=0 and sgn0(pull_dx)!=dmx) or (dmy!=0 and sgn0(pull_dy)!=dmy) or sgn0(mx0-mxa)!= sgn0(mx0+dmx-mxa) or sgn0(my0-mya)!= sgn0(my0+dmy-mya) then invalid_move=true end if not invalid_move and level:can_move(false,mx0,my0,dmx,dmy,1,0) then if (hypothetically) return ancs,0 level:tug_crate(mx0,my0,dmx,dmy) return true end end if (hypothetically) return ancs,nil return false end function rope:_calc_push( an,a0,a1,af ) local ops={} if (an==nil) return ops if a0.x==a1.x then -- no far side applying pressure? local y0,y1=_mnmx(a0.y,a1.y) local my0,my1,smy=(y0+1)\8,(y1-1)\8,1 if a0.y>a1.y then my0,my1=my1,my0 smy=-smy end local mx,dmx if a0.x%8==0 and a0.x>an.x+7 then -- push left mx=(a0.x-1)\8 dmx=-1 elseif a0.x%8==7 and a0.xa1.x then mx0,mx1=mx1,mx0 smx=-smx end local my,dmy if a0.y%8==0 and a0.y>an.y+6 then -- push up my=(a0.y-1)\8 dmy=-1 elseif a0.y%8==7 and a0.y8 --wrongbleeps wrongbleep={} add(real_modules,wrongbleep) function wrongbleep:init() self.duration=0 self.continuous=0 end function wrongbleep:update() if (self.duration>5) self.duration=5 if self.duration>0 then sfx(63,3) self.continuous+=1 else self.continuous=0 end self.duration=max(self.duration-1,-4) end function wrongbleep:bleep(duration) self.duration+=duration or 2 end function wrongbleep:vibrate(duration) if (self.continuous<10) return 0 return (rnd()*2-1)*min(self.continuous/10,2) end function wrongbleep:adequately_warned(duration) return self.continuous>45 end -->8 -- text level_text={by_lvl={}} add(real_modules,level_text) level_text_raw={ "0`9`11`\f7\#0press 🅾️ to mlem & unmlem", "0`33`17`\f7\#0❎ to yoink" } function level_text:init() for i=0,32 do level_text.by_lvl[i]={} end for row in all(level_text_raw) do if row then lvlxys=split(row,"`") add(level_text.by_lvl[lvlxys[1]],lvlxys) end end end function level_text:draw() for xys in all(level_text.by_lvl[level.ix]) do print(xys[4],xys[2],xys[3],6) end end __gfx__ 000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000 003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000 099333990039932009333339effeeeeeeeeeeeeeeeeeeffee5eeeeeeeeeeee5eff1ff1ffff111111ff1111ff111111ffdddddddd111111110000000000000000 09a333a9033a932009333339efee33e3333e333e3333eefee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111115005005000000000 023333323333320000222220efe333e3333e333e33333efee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111110500500500000000 002222200000220000222220efe33eeeeeeeeeeeeee33efeeee33eeeeee33eeeff1111ffff111111ff1ff1ff111111ffdddddddd111111110000000000000000 000222c002222c0000022200efeeee555e555e55e5eeeefee5eeeeffffeeee5effffffffffffffffff1ff1ffffffffffdddddddd111111110005000000000000 00000cc00000cc0000000cc0efe33e5eeeeeeeeee5e33efee5e33efeefe33e5e1ffffff11fffffffff1ff1fffffffff1dddddddd111111110000500000000000 0000ff000000000000000000efe33e5e11111111e5e33efee5e33efeefe33e5eff1ff1ffffffffffffffffffffffffff88888888555555555555555588888888 000f00f0000000000aa00aa0efe33eee11ffff11eee33efeeee33effffe33e5eff1ff1ffffffffffffffffffffffffff88888888558855885588558888888888 00d0000f000000000aaaaaa0efe33e5e1ff11ff1e5e33efee5e33eeeeee33eeeff1ff1fffff11111ffffffff11111fff88888888888888888888888888888888 00d0d00f00c040500aaaaaa0efeeee5e1f1111f1e5eeeefee5e333e333333e5eff1ff1fffff1ffffff1111ffffff1fff88888888888888888888888888888888 00dd00ee00c4455000999900efe33e5e1f1111f1e5e33efee5e333e333333e5eff1111fffff1ffffff1ff1ffffff1fff88888888888888888888888888888888 00000ee00c44455500aaaa00efe33eee1ff11ff1eee33efeeeeeeeeeeeeeee5efffffffffff11111ff1ff1ff11111fff88888888888888888888888888888888 00eeee000c004005000aa000efe33e5e11ffff11e5e33efee5555e555e555e5effffffffffffffffff1ff1ffffffffff88888888888888888855885588558855 eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffffff1ff1ffffffffff88888888888888885555555555555555 00000000000a90005bbbbbb3efe33eeeeeeeeeeeeee33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 00000aaaaaaa9100bbbbbbbbefe33e5555e555e555e33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 0000aaaaaa1a9110bbb7aabbefe33eeeeeeeeeeeeee33efeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000 0aaaaaaaaa1a9111bbbaabbbefe333e3333e333e33333efeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000 0aaaaaaaa41a91a1bbaaabbbefee33e3333e333e3333eefeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000 0a000aa4441a91a1bbabbbbbeffeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000 00a0044449a110a1bbbbbbbbeeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 00000000991000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111 00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999 00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999 00000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999 00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999 00044444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991111111111111111111111111 44444444444004444444444444400444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444 477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 477dd774477dd774477dd774477dd77447711774477117744771177447711774477dd774477dd774477dd774477dd77447711774477117744771177447711774 44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000cc0cc0cccccccccccccccccccccccccccccccc0bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb000000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 88888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000 0088000000088000000000000000000000000aa00000000000000000aa0000000000000000000000000000000000000000000000000000000000000000000000 00880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa000000000000000000000000000000000000000000000000000000000 00880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000 00880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000 00880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a00000000000000000000000000000000000000000000000000000000 00880888880880888880880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000888888800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c100c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c1002400c1c100c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c00000e300c00000c0c0c0c0c0c0c0c0c0c0c10000c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c000000000c000c0c0c0c0c0c0c0c0c0c000000000c100c100f3c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001000340000c000c0c0c0c0c0c0c0c0c01000c034c1c1c1c100c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c000000000c100f3c0c0c0c0c0c0c0c0c00000000000000000c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000212000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000313000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0100000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 __label__ 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000008000000000000000080000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000088888888888888888888000000000000007777777700000000777777770000000077777777 77777777000000000000000000000000000000000000000000000088888877777778888888800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777788880000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777708888000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088877667777776677700888800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088777667777776677700088880000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088777777777777777700008888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000008880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000888000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000088800000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000008880000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088777667777776677700000000000888000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088877667777776677700000000000088800000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000008880000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000888000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000088800000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088880000000000000000000000000000008880000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088888800000000000000000000000000000888000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000088888000000000000000000000000000088800000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000088880000000000000000000000000000888000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000088880000000000000000000000000888800000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000888880000000000000000000000088880000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888880000000000000000000008888000000033000000000000077777777 777777770000000000000000000000000000000000000000000000000000000000000888880000000000000000000008883330003bb300000000000077777777 777777770000000077777777000000007777777700000000000000007777777777777778880000000000000077777777833b33003ab337770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777888800000000000007777777733333300331137770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777788800000000000007777777700883330711337770000000077777777 77766777000000007776677700000000777667770000000000000000777667777776677788800000000000007776677703333333733367770000000077766777 77766777000000007776677700000000777667770000000000000000777667777776677708880000000000007776677700333330333667770000000077766777 77777777000000007777777700000000777777770000000000000000777777777777777700880000000000007777777700033133311777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700888000000000007777777700003100317777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700088000000000007777777700033103317777770000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700008888000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700088800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700880000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777708800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777788000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777778880000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 __gff__ 000000c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c0c0c0c0202020200040c0c0c0c0c0c0c008080800000000404000000808080808080808c0c0c0c000000000080808080808080800000008000000000808080808080808000000000008080808080808080808080000000000080808080808080808080800000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __map__ 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1203040404050d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d03043e0a040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0d0d0d0d0a0d0304040405140013004f00150d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d0304040404040417000026000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d030404043e050d0d0d0d0d0d033e0404040404050d0d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d03042604040404260417000000151400001e0000150304040400040404050d0d0d0d0d03040404050003040404050d1300000000000000000018000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0304041700000000150d0d0d0d0d0d134400000000001514140d0d0d0d0d 0d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d14130018000000001800000000001514141300000015130000000000000015030404040513000000160017000000150d1300000000000000421e00000000150d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d0d1300000000000000150d0d0d0d0d12001d0000000000000003040404050d 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d010000001e0000004f000000000000150d031700000015130000000000000015130000001513004200001e43000000150d130000000000000000001a000041150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d13000000001d1d00150d0d0d0d0d0d131c0000000000150013000000150d 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413001a000000001a0000000000150d13000000001513000000000000001513001d1d0000000000000000000000150d232424002424240700002600001e150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1346062407471c00150d0d0d0d0d0d231c24241d2424250000000000150d 0d0d0d0d03040404042604050d0d0d0d0d0d232426242424242624071e001e150d13000000001513000000000000001513001f481523242424070006242424250d0304040004040523242408242400250d0d0d0d03040404041804050d0d0d0d0d0d1346150d131c1f0016040404050d0d031f04051c0d030404170000001605 0d14141413000000001800151414140d0d0d0d0d080d0d0d0d080d23240024250d23240000242513000000000000001513000000150d0d0d0d2324250d0d0d0d0d3d001c001c003f03040404040400050d1414141300001d1d1d003f1414140d0d0d13441604171f1a0000000000150d0d130000161f053d44001d1d001d0015 0100000000000000004f0000000000120d0d0304040404050d0d0d0d1400140d0d030400000405130000004f000000151300000015030404050d0d0d030404050d13001c1d1c00151300000000000015010000000000001c1c1c0000000000120d0d13001c000000181d1a1d1a1d150d0d131d1d0000151342001c1c001c003f 0d14141413000000001a00151414140d0d0d1300000000150d0304040400050d0d13001e1e4f15130000001e00000015130000001513000016040404170000150d13001f401f00151300481e000000150d1414141300001f1f1f003f1414140d0d0d13001f0043003f1f181c181f150d0d131f1f0000151300001c1c1d1c4915 0d0d0d0d23242424242624250d0d0d0d0d0d1300000000150d1300000000150d0d130000000015130000150013000015130000431513000000000000000000150d1300000000001523242400242424250d0d0d0d23242424241a24250d0d0d0d0d0d13001a001a1d1a00001f0000150d0d230747000015131e1e1f1f1f1f3e15 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d091b00191b00192727271b1e19270b0d2324240024252324242500232424251300000000004d0000000000000000150d1300000000001503040000040514140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d131e1800181f18001a00063c250d0d0d2324243c25130040000000000015 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1300001e4f1e000000004f00150d0d0d03040004050d0d0d1400140d0d0d232424242513000000000000000000150d130000000000151300001d1d0000140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413000000000000001800000000120d140304040405130000000000000015 0d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0d0d230024242425141300000000150d0d0d134f1e00151414141400140d0d0d0d0d0d0d0d13000006240024070000150d2324240024242513000040441500140d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0100000000000000062424242514140d0100001d1d483f230024242424242425 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d2324242424250d0d0d13000000000000000000140d0d0d0d0d0d0d0d23242425140014232424250d0d0d1400140d0d13000000001500120d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1423242424243c250d0d0d0d0d0d0d0d14131f1f00000000140d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414141414140d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d010d0d0d232424242425140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414140d0d0d0d0d0d 0d0d0d0d0d0d0d0d030404040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d03040404040405133d00001c00150d0d0d0d0d0d0d0d0d0304043e0404050d0d0d0d0d030404000404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d130000000000151300001d1f00150d0d0d0d0d0d0d0d0d150000000000150d0d0d0d0317420000004816050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001d1d1e4f000000001c000000010d03040404040405150000000000150d0d0d141300191b1d191b0015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001f1f000015131e1e1f1d1d150d0d13460044004c15150000000000150d0d3d001e0042001f0048001e003f0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13000000000015130000001c1c150d0d131d1d1e1d1d152324241d2424250d0d140023240700410006242500140d0d0d0d0d0d030404040404050d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0927271b1e1e0015130014001c1c150d0d131c3d001c1c000000001f040404050d1400000023243c2425000000140d0d0d0d0d0d130000001c000000000d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131c1c00000000000000001c1c150d0d131f1f1e1f1f1514141300280000150d14000000001f1f1f00000000140d0d0d141414130028001c4516050014140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131c1c0014001513001e1e1927270b0d1300004100001514141300000000010d144f47411400000014000000140d0d01000000000000001f0000150000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131c1c00000015130000000000150d0927271b001927270b031741280000150d14434b491400000014000000140d0d0d14141413002800000000151414140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131f1f1d1e1e151300001d1d00150d0d131f1c001c1c151f130000004900150d03040404040000000304040405140d0d0d0d0d13000000000006250d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 120000001c000000004f1e1f1f00150d0d13001f001f1f0000131d1d000000150d1300000000000003170000000000120d0d0d0d232424242424250d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001d1f000015130000000000150d0d1300000000001500232424242424250d13000000001d1d1d0000000015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001c00003f15232424242424250d0d1300000000001500140d0d0d0d0d0d0d130000000625031700000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d232424242424250d0d0d0d0d0d0d0d0d2324242424242500140d0d0d0d0d0d0d130000062503170000000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d232424250d23242424242424250d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __sfx__ 00110000250002500025030250302503000000230350000023030230302303023030230302303023030230302103021030210302103021030210300000000000177401774017740177311e7501e7501e7501e750 00110000290202a0212a0202a0202a0202a02025030250052503025030250302503025030250302503025030250302503025030250302503225030230322504526030260302a040000002d0402d0402d0402d040 001100001e7401e7401e7401e74010730107301073010730157301573015730157301573015730157301573015730157301573015730000000000000000000000000000000000000000019030190300000000000 001100002d0422d0402a0302a0302c0302c0302c0322c0322d0402d0312d0302d0302d0302d0302d0302d0302d0302d0302d0322d03200000000000000000000000000000000000000002b0402c0410000000000 001100001274012740127401274012740127401274012740177301773017730177301773017730177301773014730147301474014740107401074010740000001573015730157301573009720097300973009730 001100002a0402a0412a0412a0402a0402a0402a042290412a0412a0402a0402a0402a0402a0402a0422903128041280402804028040280402804226032000002504025040250402603026030260322803200000 001100000e0300e0300e0300e0300e0300e0300000000000000000000000000000000000000000150301503014030140301403014030120301203012030120300d0200d0200d0200d0200d0200d0200d0200d020 001100002804028040280402804028040280402104000000210402104021040210402104021040150001500014000140001400014000120001200012000240342503125030250302503025030250322503225032 00110000150301503015030150301503015030150301503015030150301503015030150301503015030150300b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b02000000000000000000000 001100002501425010250102501025010250102501025010250212502025020250202502125020250202502027540275402754027540275402754027540275402703027030270302703027030270302703027030 001100002312023120231202312023120231202312023120231202312023120231202312023120231202212123141231402314023140231402314021140201401e1401e1401e1401e1401c140001001e14020140 00110000000000000006322063250d3320d33209320093200932009325093200932509320000001703017030170300b0200b0200b0200b02017030170300b0301403014030140301403514030140300000014330 0011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b0301b0301b030000001b0301b0301b030000001b0301b0301b03000000 0011000020140201402013020130201302013020130201301d1401e1411e1401e1401c140002001b2401b2401b240000000000022554235512355023550235402354023540235402354023540235402314023140 0011000000000150301503000000000000e0300e0300e0300e0320e0320e0320e0320e0300e0300e030000000d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d030 00110000190331903019030000001a0331a0301a0301a0301a0301a0301a0301a0301a0301a0301a0300000027320273202732027320000000000027320273202732027320273202732000000000000000000000 00110000211402d1402d145000002a1302a1302a1302a1302a1322a1322a1322a1322a1322a13000100000002c3202c3202d3202d3202f320003002d3302d3302d3302d3302c3312c3302a3302a3302833000000 001100000b0300b0300b0000b0000b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001100002704027040000000000027040270402704027040270402704027040270402704027040000000000028020280202a020000002c030000002a0202a02000000000002c0302c0302c0302c0300000000000 001100002a3302a3302c330003002a3302a3302a3302a3302a3302a3322a3322a3322a3322a332283322a3322c3302c3302d330003002f3302f3052d3302d33000300003002f3302f3302f3302f3302804028045 00110000000000000015310153101531015310153101531000000000001032010320103201032010320103200e3200e3200e3200e3200e3200e3200e3200e32000000000000d3200d3200d3200d3200d3200d320 001100003102031022310223102231022310222f0322d0302c030000002a0400000028030000002603026030260302603026030260302603026030000000000029040000002a040000002c040000002d0502d050 0111000034040340403404034042340423404232042310422f040000002d040000002c040000002a0402a0402a0402a0402a0422a0422a0422a042290402a0402c040000002d040000002f040000003104031040 001100001203012030120351230010030100301003010030020200202002020020200202002020020200202002020020200202002020020220202202022020220b0400b040000000000010040100400000000000 0011000000000000002c0402c04000000000002a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a030000002604026040000000000028040280400000000000 0011000000000000002f0402f04000000000002d0402d0402d0422d0422d0422d0422d0422d0422d0402d0402d0402d0402d0402d0402d0402d0402d040000002a0402a04000000000002c0302c0300000000000 001100000932209322093220932209322093220932209322043220432204322043220432204322023220232202322023220232202322023120231204312023120131000000033100000005310000000632006320 00110000250402504025040250402504025040230402104020040000001e040000001c040000001a0401a0401a0401a0401a0401a0401a0400000000000000000000000000000000000000000000000000000000 0011000028030280302803028030280302803026030250402304000000210400000020040000001e0401e0401e0401e0401e0401e0401e040000001d0401e0402004000000210400000023040000002504025040 00110000063200632012310123100431004310103101031002310023100231002310023150200002745017450b7351770017735060001274506000107550400004000107550b7550400004755010000172001722 00110000250502505023040230402304023040250402303021050210502105221050210502105021050210502a030000002d030000003203000000310403104031040310402f0302d0402f0502f0502d0402c040 001100000e7450e7050000012745000000070010740107401074210742107421074210740000000e7400e7400d7450d00500000117450000000000127401274012742127421e7421e7421c7401c7451074010745 001100002a05512005000003205500000000002f0502f0502f0502f0502f0502f0502f050000002c0402a0502905500000000003105500000000002d0402d0402d0402d0402d0402d0402c0402c0402c0402c040 001100000e0400e0400e0400e0400e0400e0400d040000000b0400b0400b0400b0400b0400b040020400000004040040400404004040040400404504040000000404004040040300400001000010000104001030 001100002a0402a0402a0402a0400000000000260302503023030230302303023030320503205232052320523104031040310403104031040310402f040000002f0402f0402f0402f0002a0402c0402a04028040 001100001731517310173151731517020170251033010330103301033010330103300233002325023300232501330013300133501335013300133506330063300633006330063300633004040040400404004040 00110000173601733023030233300b6630b3352a66317330173302a6532c230282302c230282302a6531a230190301903025030250330b6650b6702a6231e0302a7001e7302a6231e730287301c7302a6231c730 001100002634026340263403234032340323402f3402f3402f3422f3422f3422f3422f3422f34228342263402533025330253303135031350313502d3402d3402d3422d3422d3422b3412c3412c3422c34229341 001100000e7300e7300e7300e7300e7300e7300d7300d7300b7400b7400b7400e7400e7400e740100401004010030100300403004030040300403004030040300403004030040300403004030040300403000000 00110000260301a030260301a030260301a03000000000002304017040230402603017030260302a0401c0402a0401c0402a0401c0402a0401c0402a0401c040280401c040280401c04028040000001c04000000 00110000293402a3412a3422a3422a3422a34228350000002634026340263403234032340323402f3502f3502f3522f3522f3522f3422f3422f3422f3422f3422f3422f3422f3422f3422f340000002d3402d345 001100001004010040100401004010040100401004010040100301003010030100301003010030100301003010020100201000010000100051000010000100000000000000000000000000000000000000000000 001100002604028040260302803026040280402603028030260202802026020280202601028010260102801025010250152500028000250052800025000340000d5100d0300d0300000000000125140603006030 001100002d3322d3322d3322d3322d3322d3322d3322d3322d3222d3222d3222d3222d3222d3222d3222d3222d4122d4122d4022d4052d4002d4002d400000003843038430384303843500000000003473034730 001100000601006015000000000000000000000000000000215401a030210400000000000000001c540150301c0400000000000000001e540170301e040000000000000000195401203019040120300d0350d005 0011000034720347203472034720347250000000000001003173031730317302f7352d735001002c7402c7402c7402d7452f745007002d7502d7502d7502c7452a74500700287402874028740007002574500100 001100001a0302a0321a0301a0351a0001a00000000000000000000000000000000000000000000000000000000000000000000000002f0401c0222f04000000000001c0202d0422502019040190401904019040 00110000217302173021710217102171021715217002170021000210002100021000210002100021000210000000000000000001c700387303873038730387300000000000347303473034730347303473034730 0111000025020250202d0402c0402a140022150e0251202012020151250d2152502019020280351a030230251702026030260301703023030200001c000200301c02023040040200402004020040200000000000 001100003403034030317302f7302d7302d7302d7202f72031720001002f7402f7402f740007002d740007002a7502a75032750327502f7402f7402f7402f7422f7422f7422f7422f74500700007001c75000700 00110000253401c34009360093600936009340093401734004340043400434004340043401734002340023400234002340023401a340023400434002340023400134000300033400030005340003000635006350 001100001c567285303453034540345403454032540315402f540255402d540255402c540255402a5402a5402a5402a54021540215402154021540295302a5302c540235402d540255402f540255403155031550 00110000000000000000000000000000000000000000000021440204401e4401e4401e4401e4401e4401e4401a44000000174401a000174401a00012440124401224012240102401024010240102400d0000d000 001100000635006350123401234004350043501034010340023400234002340023400234002340023400234017340230001a3402a0001a340000002d3402d3402d3402d3402c3402a3402c3402c3402d0352c035 0011000031560255602f5602f5602f56025560315602f5602d5602f5602d5602d5602d5602d5602d5602c5601e16000100211500000026130000002514025140251402514023130211402315023155201001e100 011100002804026040280402604028030260302803026030280302603028030260302802026020280202602028020250202802025020280102501028010250102801025010280102501028010250102802025020 001120002d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3112d3102d3102d3102d3102d3102d310014000140001400014000140001400014000140001400 0111000034530345323453234532345323453232532315302f540005002d540005002c540005002a5402a5402a5402a5402a5402a5402a5402a540295402a5402c540005002d540005002f540001003104031040 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 010300000015000250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __music__ 01 00014140 00 02034340 00 04054540 00 06074740 00 08090a40 00 0b0c0d40 00 0e0f1040 00 11121340 00 14151640 00 17181940 00 1a1b1c40 00 1d1e5e40 00 1f206040 00 21226240 00 23242540 00 26272840 00 292a2b40 00 2c2d6d40 00 2e2f6f40 00 30317140 00 14153940 00 17181940 00 32335472 00 34353640 00 1f204040 00 21224040 00 23242561 00 26272840 02 37387840