制作一款打飞机游戏30:动画系统
动画系统构想
动画系统的基本想法是,我们有一系列像“火焰R”、“射击R”、“鼠标R”这样的动画,我们需要创建一个数据库来存放所有这些动画,这样每次引入新动画时,就不必定义新的数组了。这个系统相对简单,但实现过程可能会有点复杂。
整合动画元素
首先,我们要考虑游戏中所有动画的元素。我们知道飞船有点像是动画的,但它并不真的是通过一系列帧来移动的。我们还有枪口闪光、子弹击中敌人时的溅射效果、敌人、子弹和射击效果,这些都是动画的一部分。
我的目标是让这些动画元素尽可能以相同的方式工作,使用相同的系统。如果发现有些元素可以合并,那就合并它们。
动画系统实现细节
- 变量重命名:首先,我想把现有的动画变量名(如Zani、Si)改得更有意义,比如改成Annie和H。
- 动画速度:我计划引入一个动画速度变量(anise),用它来根据年龄(age)计算动画帧。
- 粒子系统:我打算把枪口闪光和溅射效果转换成粒子系统。这样,我们就可以重用已经写好的粒子代码了。
具体实施步骤
- 替换变量名:首先,我把所有的Zani替换成了Annie。
- 创建辅助函数:我创建了一个名为
psych
的辅助函数,用于根据年龄和动画数组计算当前应该显示的动画帧。 - 应用新系统:我把这个新系统应用到了敌人、子弹和射击效果上,并且都工作得很好。
- 转换枪口闪光和溅射效果:接着,我把枪口闪光和溅射效果转换成了新的粒子系统。为了处理枪口闪光需要附着在飞船上的问题,我引入了一个
p_lock
变量。
调试与优化
在实施过程中,我遇到了一些问题,比如动画帧显示不正确、动画开始时间太早等。通过逐步调试,我解决了这些问题。最后,我还创建了一个快捷方式函数draw_obj
,用于简化绘制代码。
pico-8 cartridge // http://www.pico-8.com
version 41
__lua__-- goals
-- - animation system
-- - animation library
-- - animation library editor-- - collision system
-- - enemy database system
-- - schedule/spawn system
-- - enemy brain system
-- - bullet pattern system-- smol things
-- - playert dies if they get hit by bullet
-- - xscroll big pita
-- - enemy scrolling in sync with bg
-- - maybe our ship needs to be an object?
-- - merge splash system?
-- - maybe update splash and muzz in draw?function _init()t=0debug={}#include shmup_myspr.txtbutarr=split "1,2,3,1,4,6,7,4,5,9,8,5,1,2,3,1"dirx=split "0,-1,1, 0,0, -0.7, 0.7,0.7,-0.7"diry=split "0, 0,0,-1,1, -0.7,-0.7,0.7,0.7"flamearr=split "15,16,17,16"shotarr=split "8,9,10"muzzarr=split "11,12,13,14"pal_flash=split "8,8,8,8,8,14,7,14,15,7,7,8,8,14,7"pal_wflash=split "7,7,7,7,7,7,7,7,7,7,7,7,7,7,7"mapsegs=split "3,3,3,3,3,2,1,0,1,7,6,5,10,4,11,6,11,11,5,9,10,8,1,0,15,14,1,13,12,19,19,18,17,16,18,17,16,17,16,19,22,21,20,27,26,25,23,24,3,3"_upd=upd_menu_drw=drw_menu
endfunction startgame()px,py=64,64spd=1.4--spd=0.1lastdir=0shipspr=0scroll=300xscroll=0mapsegi=0cursegs={}boss=falseparts={}shots={}shotwait=0enemies={}buls={}_upd=upd_game_drw=drw_gamespawnen()endfunction _draw() _drw()--★cursor(4,4)color(7)for txt in all(debug) doprint(txt)end
endfunction _update60()if slowmo thenfor i=0,60 doflip()endendt+=1_upd()
end-->8
--drawfunction drw_game()camera(-xscroll,0)for seg in all(cursegs) domap(seg.x,seg.y,0,scroll-seg.o,18,8)endfor e in all(enemies) doif e.flash>0 thene.flash-=1pal(pal_flash)enddrawobj(e) --mspr(cyc(e.age,e.ani,e.anis),e.x,e.y)pset(e.x,e.y,8)pal()endfor s in all(shots) dodrawobj(s) --mspr(cyc(s.age,s.ani,s.anis),s.x,s.y)if s.delme thendel(shots,s)endendfor p in all(parts) doif p.age>=0 then--animate colorif p.ctab thenp.ctabv=p.ctabv or 0local i=(p.age+p.ctabv)/p.maxagei=mid(1,flr(1+i*#p.ctab),#p.ctab)p.c=p.ctab[i]endp.draw(p)endendcamera()--shipmspr(flr(shipspr*2.4+3.5),px,py)pset(px,py,8)local fframe=flamearr[t\3%4+1]mspr(fframe,px-1,py+8)mspr(fframe,px+2,py+8)camera(-xscroll,0)for s in all(buls) dodrawobj(s) --mspr(cyc(s.age,s.ani,s.anis),s.x,s.y)endcamera()debug[1]=scrolldebug[2]=#enemiesdebug[3]=#buls
endfunction drw_menu()map(19,8)
end
-->8
--updatefunction upd_game()--scrollingscroll+=0.2if #cursegs<1 or scroll>cursegs[#cursegs].o thenif boss thenscroll-=64for seg in all(cursegs) doseg.o-=64endelsemapsegi+=1 endlocal segnum=mapsegs[mapsegi]add(cursegs,{x=segnum\4*18,y=segnum%4*8,o=#cursegs<1 and -64 or cursegs[#cursegs].o+64})--★if #cursegs>2 and scroll-cursegs[1].o>=128 thendeli(cursegs,1)endend--movementlocal dir=butarr[1+btn()&0b1111]if lastdir!=dir and dir>=5 then--anti-cobblestonepx=flr(px)+0.5py=flr(py)+0.5endpx+=dirx[dir]*spdpy+=diry[dir]*spdlocal dshipspr=mysgn(dirx[dir])shipspr+=mysgn(dshipspr-shipspr)*0.15shipspr=mid(-1,shipspr,1)lastdir=dir--xscroll=mid(0,(px-10)/100,1)*-16--2441xscroll=mid(0,(px-10)/108,1)\-0.0625if shotwait>0 thenshotwait-=1elseif btn(❎) thenshoot() endendif btnp(🅾️) thenexplode(64,64)endboss=btn(🅾️)if t%60==0 then--spawnen()enddobuls(shots)dobuls(buls)doenemies()-- shots vs enemiesfor e in all(enemies) dofor s in all(shots) doif not s.delme and col(flr(xscroll+s.x-3),flr(s.y),8,16,flr(xscroll+e.x-7),flr(e.y-7),16,16) thene.flash=2s.delme=trueadd(parts,{draw=sprite,x=s.x,y=s.y+4,maxage=5,age=-1,ani={23,24,25,26}}) e.hp-=1if e.hp<=0 thendel(enemies,e)explode(e.x,e.y)end endendend -- ship vs enemiesfor e in all(enemies) doif col(flr(px-7),flr(py-7),16,16,flr(xscroll+e.x-7),flr(e.y-7),16,16) thenendend-- ship vs bulletsfor b in all(buls) doif col(flr(px-7),flr(py-7),16,16,flr(xscroll+b.x-3),flr(b.y-3),7,7) thenendendfor p in all(parts) dodopart(p)endendfunction upd_menu()if btnp(❎) or btnp(🅾️) thenstartgame()end
end
-->8
--toolsfunction mysgn(v) return v==0 and 0 or sgn(v)
endfunction rndrange(low,high)return flr(rnd(high+1-low)+low)
endfunction mspr(si,sx,sy)local _x,_y,_w,_h,_ox,_oy,_fx,_nx=unpack(myspr[si])sspr(_x,_y,_w,_h,sx-_ox,sy-_oy,_w,_h,_fx==1)if _fx==2 thensspr(_x,_y,_w,_h,sx-_ox+_w,sy-_oy,_w,_h,true)endif _nx thenmspr(_nx,sx,sy)end
endfunction split2d(s)local arr=split(s,"|",false)--for k, v in pairs(arr) dofor k, v in inext, arr doarr[k] = split(v)endreturn arr
endfunction col(x1,y1,w1,h1,x2,y2,w2,h2)local a_left=x1local a_top=y1local a_right=x1+w1-1local a_bottom=y1+h1-1local b_left=x2local b_top=y2local b_right=x2+w2-1local b_bottom=y2+h2-1if a_top>b_bottom then return false endif b_top>a_bottom then return false endif a_left>b_right then return false endif b_left>a_right then return false endreturn true
endfunction cyc(age,arr,anis)local anis=anis or 1return arr[(age\anis-1)%#arr+1]
endfunction drawobj(obj)mspr(cyc(obj.age,obj.ani,obj.anis),obj.x,obj.y)
end
-->8
--gameplayfunction spawnen()add(enemies,{x=64,y=24,--x=10+rnd(128),--y=16-rnd(32),ani={18,19,20},anis=6,si=1,sx=0,sy=0,brain=2,age=0,flash=0,hp=10015})add(buls,{x=90,y=64,sx=0,sy=0,ani={22},age=1})endfunction doenemies()for e in all(enemies) doif e.brain==1 then-- flyin and out brainif e.age<15 then-- fly downe.sy=2elseif e.age<120 thenif e.age==60 thenadd(buls,{x=e.x,y=e.y,sx=0,sy=2,ani={22},si=1})end-- staye.sy=max(0,e.sy-0.03)--e.sy=0else-- fly upe.sy-=0.04if e.y < -16 thendel(enemies,e)endendende.x+=e.sxe.y+=e.sye.age+=1end
endfunction dobuls(arr)for s in all(arr) dos.age+=1s.x+=s.sxs.y+=s.syif s.y<-16 or s.y>130 thendel(arr,s)endend
endfunction shoot()--slowmo=truelocal shotspd=-6shotwait=2add(shots,{x=px-4-xscroll,y=py-14,sx=0,sy=shotspd,ani=shotarr,anis=2,age=(t\2)%3+1})add(shots,{x=px+4-xscroll,y=py-14,sx=0,sy=shotspd,ani=shotarr,anis=2,age=(t\2)%3+1})add(parts,{draw=sprite,maxage=5,x=-4,y=-4,ani=muzzarr,plock=true})add(parts,{draw=sprite,maxage=5,x=4,y=-4,ani=muzzarr,plock=true})sfx(0)
end
-->8
--particlesfunction explode(ex,ey)sfx(1)add(parts,{draw=blob,x=ex,y=ey,r=17,maxage=2,ctab={119,167} --★})sparkblast(ex,ey,2)sparkblast(ex,ey,8)grape(ex,ey,2,13,1,"return",{119,167,167,154},0)grape(rndrange(ex-5,ex+5),ey-5,10,20,1,"return",{167,154,169},-0.2)grape(rndrange(ex-5,ex+5),ey-10,25,25,0.8,"fade",{167,167,154,169,141,93},-0.3)
end--1855function dopart(p)-- age and waitp.age=p.age or 0if p.age==0 thenp.ox=p.xp.oy=p.yp.r=p.r or 1p.spd=p.spd or 1endp.age+=1if p.age<=0 then return end--particle code--movementif p.tox thenp.x+=(p.tox-p.x)/(4/p.spd)p.y+=(p.toy-p.y)/(4/p.spd) endif p.sx thenp.x+=p.sxp.y+=p.syif p.tox thenp.tox+=p.sxp.toy+=p.syendif p.drag thenp.sx*=p.dragp.sy*=p.dragendend--sizeif p.tor thenp.r+=(p.tor-p.r)/(5/p.spd)--★ spdendif p.sr thenp.r+=p.srendif p.age>=p.maxage or p.r<0.5 thenif p.onend=="return" then p.tox=p.oxp.toy=p.oyp.tor=nilp.sr=-0.3elseif p.onend=="fade" thenp.tor=nilp.sr=-0.1-rnd(0.3)elsedel(parts,p)endp.ctab=nilp.onend=nilp.maxage=32000end
endfunction grape(ex,ey,ewait,emaxage,espd,eonend,ectab,edrift)local spokes=6local ang=rnd()local step=1/spokesfor i=1,spokes do--spawn blobslocal myang=ang+step*ilocal dist=7+rnd(3)local dist2=dist/2add(parts,{draw=blob,x=ex+sin(myang)*dist2,y=ey+cos(myang)*dist2,r=2,tor=rndrange(4,7),tox=ex+sin(myang)*dist,toy=ey+cos(myang)*dist,sx=0,sy=edrift,age=-ewait,maxage=emaxage,onend=eonend,spd=espd,ctab=ectab,ctabv=rnd(5)}) endadd(parts,{draw=blob,x=ex,y=ey,r=2,tor=7,sx=0,sy=edrift,age=-ewait,maxage=emaxage,onend=eonend,spd=espd,ctab=ectab})
endfunction sparkblast(ex,ey,ewait)local ang=rnd()for i=1,6 dolocal ang2=ang+rnd(0.5)local spd=rndrange(4,8)add(parts,{draw=spark,x=ex,y=ey,ctab={7,10},sx=sin(ang2)*spd,sy=cos(ang2)*spd,drag=0.8,age=-ewait,maxage=rndrange(8,13)})end
endfunction blob(p)local myr=flr(p.r)local thk={0,myr*0.05,myr*0.15,myr*0.3}local pat={0b1111111111111111,0b1011010010101101,0b1000000000000000,0,}--★if myr<=2 then pat={0b1111111111111111}thk={0}elseif myr<=5 thendeli(thk,4)deli(thk,2)pat={0b1111111111111111,0}elseif myr<=8 then deli(thk,myr<=6 and 3 or 4)deli(pat,3)pat[2]=0b1010101010101010endfor i=1,#thk dofillp(pat[i])circfill(flr(p.x),flr(p.y)-thk[i],myr-thk[i],p.c)endfillp()--★if myr==1 thenline(p.x,p.y-1,p.x,p.y,p.c)elseif myr==2 thenrectfill(p.x-1,p.y-2,p.x+1,p.y,p.c)endendfunction spark(p)--47for i=0,1 doline(p.x+i,p.y,p.x+p.sx*2+i,p.y+p.sy*2,p.c)endendfunction sprite(p)if p.age<=0 thenreturnendlocal _x,_y=p.x,p.yif p.plock then_x+=px-xscroll_y+=pyendmspr(cyc(p.age,p.ani,p.anis),_x,_y)
end
__gfx__
000000cc0000000000000cc00000000000000c0009009090000700000700070000000700000fff0000a00009000000900900000eeeeeeeee000000000e070070
00000c11c00000000000c11c000000000000c1000900909007770000070007000000000000f888f00a790909000000900000000eeeeeeeee000000000e777777
0000c1671c000000000c1671c0000000000c1600970090907777000007000000000000000f88e88f0a79099a000090900000000eeeeeeeee000000000e7c7777
0000c111d1c00000000c111d1c00000000c111009709a0907777007007000000700000000f8efe8fa77009a7090090000000000eeeeeeeee000000000e7c77c7
000c1ccc11c0000000c1ccc11c00000000c1cc09770970977777077077000000700000000f88e88f77790a77090000990000000eeeeeeeee000000000e0707c7
00c1c77cc11c00000c1c77cc11c000000c1c7709770979a777770770777000007700000000f888f0777a0777009009a00000000eeeeeeeee000000000e000070
00c1c7c1c11c00000c1c7c1c11c00000cc1c7c97a79a7977777700777707000770000000000fff000777777790909a700000000eeeeeeeee000000000e070070
00c1c111c111c000c11c111c111c000c111c1197a79a797077777077770000777000000000000000eee077779000a7000000000eeeeeeeee000000000eeee070
00c1c111c171c000c11c111c171c000c171c119aa79a79a007777777770000777000000000000000eee007779000a0000000000eeeeeeeee000000000eeee777
0c11cc171161c00c161cc117161c000c1611719aa799a9a000770777770700777070000070000000eeeeeeee000000009000000eeeeeeeee000000000eeee7c7
0c1d1c711d6d1c0c16d1c77116d1c0c1d6d1179a9a99a9aeeeee0077770000777000000070000000eeeeeeee090000000000000eeeeeeeee000000000eeee070
c1ddd111d6d7d1c1dddd1111dd671c176d6d11999a99999eeeee0077770000077000000770000000eeeeeeee009000000000000eeeeeeeee000000000eeee000
c1dd6ddd6d66d1c1dd66dddd6d661c1666d6dd999a99999eeeee0007770000007000000770000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000eeee070
c1d676676d6dd1c1d6676676d6dd1c1dd6d676909999999eeeee000077eeeeeee000000070000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000eeeeeee
0c176d167d111c0c117dd1171111c0c1111716900990909eeeeeeeeeeeeeeeeeeeeeeeeee0000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000
00c151155d11c000c1655155d11c000cc16151000900909eeeeeeeeeeeeeeeeeeeeeeeeee0000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000
000c1111111c00000c11111111c000000c1111000000000eeeeeeeeeeeeeeeeeeeeeeeeee0000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000
0000ccccccc0000000cccccccc00000000cccc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
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
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee44
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e44ff
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4ffff
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4ff77f
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e14f777f
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e124f77ff
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1824ffff9
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1824fff99
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e18824f9999
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e182e4f7999
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e11e1e247777
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1d1888824477
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1d611888f2244
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e16d1188eeff22
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1d11128e2def7
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e111912822ee7
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee1111288ee7
00ee00ee0000000eeee00000000000000ee000000000000000000000000000000000000000000000000000000000000000000000000000000000e1d1111228ff
0e11ee440000eee4444e00000000000ee44000000000000000000000000000000000000000000000000000000000000000000000000000000000e1d7d1111288
e16d14ff000e114ffff4eeee000000e14ff00000000000000000000000000000000000000000000000000000000000000000000000000000000e1d776d111911
e1d14ff7000e14ff7fff4111e0000e14ff700000000000000000000000000000000000000000000000000000000000000000000000000000000e1676d116d11d
e1124f7f00e124f7ff9f42161e00e124f7f0000000000000000000000000000000000000000000000000000000000000000000000000000000e1dd66d11dd167
0e184fff00e184fff99f481d1e00e184fff0000000000000000000000000000000000000000000000000000000000000000000000000000000e167dd1ee111d1
e12e4f990e12e4f9999f4e211e0e12e4f9900000000000000000000000000000000000000000000000000000000000000000000000000000000e166d1e0eee11
e18847990e18847999974881e0e16884799000000000000000000000000000000000000000000000000000000000000000000000000000000000e111e00000ee
e12e84770e12e84777748e21e0e1d2e84770000000000000000000000000000000000000000000000000000000000000000000000000000000000eee00000000
e128ef440e128ef4444fe821e0e1128ef44000000000000000000000000000000000000000000000000000000000000000000000cccccccccccccccc111ccc11
e11282fee161282feef2821e000e11282fe0000000000000000000000000000000000000000000000000000000000000000000001c1c1c1ccccccccc1111ccc1
0e112effe1d112effffe211e000ee112eff000000000000000000000000000000000000000000000000000000000000000000000cccccccccccccccc11111ccc
e16d1228e111e122882211e000000e11221000000000000000000000000000000000000000000000000000000000000000000000ccccccccccccccccc11111cc
e1d111220eee0e122221d61e000000ee116000000000000000000000000000000000000000000000000000000000000000000000cccccccccccccccccc11111c
e111ee11000000e111111d1e00000000e1d000000000000000000000000000000000000000000000000000000000000000000000ccccccccccccccccccc11111
0eee00ee0000000eeeee11e0000000000e1000000000000000000000000000000000000000000000000000000000000000000000ccccccccc1c1c1c11ccc1111
00000000000000000000ee000000000000e000000000000000000000000000000000000000000000000000000000000000000000cccccccccccccccc11ccc111
bbbbbbb111bbbbbbbbbbbbbb11111111dd5555dddd5555ddb9999999999999bbbbbbbbbbbbbbbbbbbbbbbbbbdddddddddddddddddddddddd5d55d55d88888888
bbb1111161111bbbbbbbbbbb17777761d566665dd56ddd5db9999999999999bbbbbb4444bbbb44444444bbbbdddd5d55dddd55d555d5ddddd55d5d6588888888
bbb16dd1611661bbbbbbbbbb17777761d565565dd5655d5db9999999999999bbbb44999944449999999944bbddd5151155d5115111515ddddd55d65588888888
bbb16dd1611661bbb9abb9ab17777761d566665dd56ddd5db9999999999999bbbb49999999999999999994bbdd51515111515151515115dd5dd5d55d88888888
bbb16666666661bbb9a999ab17777761d57ccc5dd57ccc5dbb9999999999999bb4999999999999999999994bdd115111515151511151115ddd5d556588888888
bbb1d11ddd11d1bbb9abb9ab17777761d57dd55dd566665dbb9999999999999bb9999999999999999999999bd551111151111111111151dd5dd6565d88888888
bbb31111111113bbb9a333ab17777761d576655dd555555dbb9999999999999bb9999999999999999999999bd1511111111111111111515d5d5555dd88888888
bbbbbbbbbbbbbbbbbbbbbbbb17666661d576655ddd55555dbb9999999999999bb9999999999999999999999bd1111111111111111111111ddd5ddd5d88888888
11111111111111111111111116ddddd1d57dd55db3333333333333bb99999999b9999999999999999999999bd1111111111111111111111d8888888888888888
111111116111111111777777176666d1d57dd55d333b3b3b3bbb333399999999b9999999999999999999999bd5111111111111111111115d8888888888888888
11116dd16116611111777777176666d1d576655d3bbbbbbbbbbb3b3b99999999b9999999999999999999999bd1111111111111111111111d8888888888888888
11116dd161166111116666661dddddd1d576655dbbbbbbbbbbbbbbbb99999999b9999999999999999999999bd111111111111111111115dd8888888888888888
1111666666666111116666661cccccc1d57dd55dbbbbbbbbbbbbbbbb99999999bb99999999999999999999bbdd51111111111111111111dd8888888888888888
1111d00ddd00d11111d00ddd1d5665d1d57dd555bbbbbbbbbbbbbbbb99999999bb99999999999999999999bbdd111111111111511115d1dd8888888888888888
11110000000001111110000010d55d01d5555555bbbbbbbbbbbbbbbb99999999bbbb99999999bbbb9999bbbbdddd15111511dddd1511dddd8888888888888888
11111111111111111111111110000001dd555555bbbbbbbbbbbbbbbb99999999bbbbbbbbbbbbbbbbbbbbbbbbdddddddddddddddddddddddd8888888888888888
bbbbbbbbbbbbbbbb31111111111113bbbbbbbbbbbbbbbbbbbbbbbbbbbbb533bbbbbbbbbbbbbbbbbbbbb3b3bbb3bbbbb3bbbbbbb5555555555bbbbbbb11111111
bbbbbbbbbbbbbbbbb31111171111113bbbbbbbbbbbbbbbbbbbbbbbbbbbbd3bbbbbbbbbbbbbbbbbbbb3b3333333bbbbb3bbbbbb5cccccccccd5bbbbbb11111111
bbbbbbbbbbbbbbbb31111117111113bbbbbbbbbbbbbbbbb11bbbbbbbbbbd3bbbbbbbbbbbbbbbbbbb33355553533b3b33bbbbb57ddddddddddd5bbbbb15151515
bbbbbbbbbb3b3bbbb3111111111113bbbbb5bbb5bbb5bb1331b5bbb5bbb53bbbbbb5bbb5bbb5bbbb5554454545333335bbbb5d6dddddddddd5d5bbbb51515151
bbbbbbbb3b3b3b3bb31111171111113bddd5ddd5ddd5d13bb315ddd5bbb533bbbbb5ddd5ddd5bbbb4544454444555552bbb55d6dddddddddd55d5bbb55555555
bbbbbbbbbbbbbbbb31111117111113bbbbb5bbb5bbb5b13b3315bbb5bbbd3bbbbbbd3bb5bbbdbbbb4444444444222222bb5ddd6dddddddddd555d5bb55555555
bbbbbbbbbbbbbbbbb3111117111113bb3335333533353133b3153335bbbd3bbbbbbd3335333d3bbb4242424244422222b5dd5d6dddddddddd5555d5b33333333
bbbbbbbbbbbbbbbbb31111171111113bbbbbbbbbbbbbb13bb31bbbbbbbb53bbbbbb53bbbbbb53bbb44444444444422245d5d5d6dddddddddd55555d533333333
bb3bb3b3111111111111111111111111bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb53bbbbbb53bbb24242424242424245ddd5d6dddddddddd5555555dddddddd
33133131111111111111111111111111bbbbbbbbb111bbbbbbbbbbbbbbbb111bbbbd3bbbbbbd3bbb42424242444242425d5d5d6dddddddddd5555555d55d5ddd
11111111111111111111111331111111b11111bbb1711bbbbb11111bbbb1171bbbbd3bbbbbbd3bbb24242424222665245d5ddd6dddddddddd5555555dddddddd
111111111111111111111133331111111711771bb17111bbb1771171bb11171bbbb53bb5bbb53bbb42424242426555225ddd5d6dddddddddd5555555dddddddd
11111111111111111111113bb311111117177111b117171b11177171b171711bbbb5ddd5ddd53bbb24242424225555245d5d5d6dddddddddd5555555dddddddd
11111111133133131331313b3311331331111111b131711b11111113b117131bbbbd3bb5bbbd3bbb42424242422552225d5ddd6dddddddddd5555555dddddddd
111111113bb3bb3b3bb3b133b313b33b31331311bb31111111313313111113bbbbbd3335333d3bbb22222222242222425ddd5d6dddddddddd5555555dddddddd
77771771bbbbbbbbbbbbb13bb31bbbbbbbbbbbbbbbb1311bbbbbbbbbb1131bbbbbbbbbbbbbbbbbbb24242424242222245d5d5d6dddddddddd5555555dddddddd
b333333bbbbbbbbbbbbbbbbb3333333333333333bbbbbbbbcccccccccccccccccccccccc1111111122222222222442225d5ddd7ccccccccc75555555cccccccc
3b3bb3b3bbbbbbbbbbbbbbbb133333313b3bb3b3bbbbbbbbcccccccccccccccccccccccc1111111122222222244444225ddd5655555555555555555555555555
3bbbbbb3bbbbbbb11bbbbbbb131313113bbbbbb33bbbbbb3cccccccccccccccccccccccc1111111122222222244222225d5d65dddddddddddd555555dddddddd
bbbbbbbbbbbbbb1331bbbbbb31111113bbbbbbbb33bbbb33ccccccccc777c7cccccccccc1111111111111111142222215d565d666666666666d55555666dd666
3bbbbbb3bbbbb13bb31bbbbbb314413b3bbbbbb3b3bbbb3bccccccccccccccccc7c777cc11111111ccccccccc122221c5d65d66666666666666d555566d66d66
b3bbbbbbbbbbb13b331bbbbbb3122133b3bbbbbbb3bbbb33cccccccccccccccccccccccc11111111111111111cccccc1565d6666666666666666d55566d66d66
3b33b3b3bbbbb133b31bbbbb3312213b3b33b3b3333bb33bcccccccccccccccccccccccc11111111ccccccccc111111c55d666666666666666666d5566dddd66
333b3b33bbbbb13bb31bbbbbb313313b333b3b33b333333bcccccccccccccccccccccccc11111111111111111cccccc15d66666666666666666666d566666666
33333333bbbbb133331bbbbb33133133333333333333333333333333333333332222222211111111b3b3bbbb11122211b5666666666666666666665b66666666
13333331bbbbbb1331bbbbbb313333131333333113333331133333313333333322222222111111113333b3b311242211b5666666666666666666665b66dddd66
13131311bbbbbbb11bbbbbbb1333333113131311131313111313131133333333222222221111111135553333c242222cb5666666666666666666665b66d66d66
31111113bbbbbb3223bbbbbb2333333241111114411111133111111433333333322333221111111154445555c222222cb5666666666666666666665b66dddd66
b311313bbbbbbb3223bbbbbb23333332222442222224413bb3144222b333333b3333333311111111444445441c2222c1b5666666666666666666665b66666666
3313113bbbbbbbb33bbbbbbb33bbbb33332222333322213b33122233b3333333333333331111111144444444c1cccc1cb5555555555555555555555b55555555
b3113133bbbbbbbbbbbbbbbb3bbbbbb33332233333322133b31223333333333b3333333317777771424242421c1111c1b3333333333333333333333b33333333
b313113bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb333313bb313333bb333333b33333333111111114444444411cccc11b3333333333333333333333b33333333
__map__
e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f09dc0c0c0c0c0c0c0c0c0c0c1c0c0c0c0c09d9df0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0c0c0c1c0c0c0c0c0c2c3c0c0c0c0c0c0c0c0c0c1c0c0c0c0c0c0c2c3c0c0c0c0c1c0c0c0c0e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9c0e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e60000
f5e4f6f3f5e4f6f3f4f3f5e4e3e4e3e4e3e4c0c0c0c1c0d7c0c0c0c0c0c0e1e0e5e0e5e0f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4c4c4c4c4c5e0c6c4c2c3c4c4c4c4c4c4c4c4c0cccdcdcdcdcec0c2c3c0cccdcdcdcdcec0c0e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9c0e6e6e7e6e6e6e6e6e6e6e6e6e6e6e6e6e6e60000
f1f4f2c1f1f4f2c0c0c1f1f4f3f4f3f4f3f4e0e2c0d4c0c0c0c0c0c0c0e1e0f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0c0c1c0c0f1f4f2c0c2c3c0c0c1e1e0e2c0c0c0dcdfdddddddec0c2c3c0dcdfdddddfdec0c0c4c4c2c3c0c0c1c0c0c0c0c0c2c3c4c4c4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e8e6e60000
d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0f0e0e5e0e5e0e2c0c0c0c1f1f5e4f0e4f0e4f0e4f6f3f4f3f4f3f5e4e3e4f0e4f0e4f0e4c0c0c0c0c0c0c1c0c2c3c1c0c0f1f4f2c0c0c0dcdda5a5dfdec0c2c3c0dcdda5a5dfdec0d0d0d0e9e9d0d0d0d0d0d0d0d0e9e9d0d0d0b5b6b6b5b6b6b6b5b6b5b5b6b6b5b6b5b6b50000
d1d2e4d3d1d1d1d2e4d3d1d2e4d3d1d1d1d2e4f0e4f0e4f6f2c0c0c0c0e1e0f0e4f0e4f0e4f6f2c0c1c0c0c0f1f4f3f5e4f0e4f0e4f0c0c0c0c0c1c0c0c0c2c3c0c0c0c0c0c0c0c1c0dcdddfdddfdec0c2c3c0dcdddfdddfdec1d1d1d1d1d1d1d1d1e9e9d1d1d1d1d1d1d1d1c0c1c0c0e1e4e2c0c0c0c0c0c0c0c1c0c1c00000
e5e0f0e0e5e0e5e0f0e0e5e0f0e0e5e0e5e0f0e4f0e4f6f2c0c0c0d4e1e0f0e4f0e4f0e4f0e4e2c0c0c0c1c0c0c0c0f1f5e4f0e4f0e4b5b6b5b6b5b6b5b6b5b6b6b5b6b6b6b6b5b6c0dcdddfdddfdec1c2c3c0dcdfdddddfdec0c0c0c0c0c0c0c0c0c2c3c0c0c0c0c0c0c1c0c0c0c0c0f1f4f2c0c0c0c1c0c0c0c0c0c0c00000
e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f6f2c0c0d7c0c0f1f5e4f0e4f0e4f0e4f6f2c0c0c0c0c0c0c1c0e1e4f0e4f0e4f0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0dcdfdddddddec0c2c3c0dcdfdddddddec0c0c0c0c1c0c0c0c0c2c3c0c0c1c0c0c0c0c0c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c40000
f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e49ee4f0e0e2c1c0c0c0c0c0f1f5e4f0e4f09e9ee4e5e0e2c0c0c0c0c0c0f1f5e4f0e4f09e9ec0c0c0c1c0c0c0c0c0c0e1e0e2c0c1c09ec0dcdddddfdddec0c2c3c0dcdddddddfdec09ec0c0c0c0c0c0c0c2c3c0c0c0c0c0c0c09ec0c0c0a8aac0c0c0c0c0c0c0c0c0c0c0c0c00000
e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f09de3e4f6f2c0c0c0c0c0c0e1e0f0e4f0e49d9df0e4f0e0e2c0c0c1c0c0e1e0f0e4f0e49d9dc0c0c0e1e0e2c0c0c0c0f1f4f2c0c0c09dc0dcdfdddddddec0c2c3c1dcdddddddfdec0c4c4c4c4c4c4c4c4c2c3c4c4c4c4c4c4c4c4c0c0a8b7b7a9a9a9aac0cccdcdcdcec0c09d0000
f0e4f0e4f0e4e3e4f0e4f0e4f0e4f0e4f0e4f4f3f4f2c0d5c0c0c0c1c0f1f5e4f0e4f0e4f0e4f0e4f6f2e1e0e2c0e1e0f0e4f0e4f0e4c0c1c0c0f1f4f2c0c0c1c0c0c0c0c0c1c0c0c0dcdddddddfdec0c2c3c0dcdfdddddddec0e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9c0cccdcdcdcdcdcdcdcddcabacaddecdcec00000
e4f0e4f0e4f0e4f0e4f0e4f0e4e3e4f0e4f0c0c0c1c0d4c0c0c0c0c0c0c0f1f5e4e3e4e3e4f0e4f0e0e2f1f4f2c0f1f5e4f0e4f0e4f0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c1dcdfa5a5dddec0c2c3c0dcdfa5a5dfdec0f9f9e9e9f9b0b1e9e9e9e9f9b0b1b0b1f9e9c0dcdda5a5dfdddddddfdcbbbcbddedddec10000
f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4c0c0c0c0c0c0d6c0c0c0c0c0c0f1f4f3f4f3f0e4f0e4f0e0e2c0c0c1e1e0f0e4f0e4f0e4cafacbfacacbcacafafafacbfafafacbfacac0dcdddddddfdec0c2c3c0dcdddddddfdec0f9b2b1e9f9f9e9e9e9e9e9f9f9e9b2b1f9e9c1dcddddddddddaedddddcaedddddedddec00000
e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0c0c0c0c0d7c0c0c0c0c1c0cccdcee1e0e2c0e4f0e4f0e4f6f2c0c0c0f1f5e4f0e4f0e4f0dadadadadadbdadadadbdadadadadadadbdac0dcdfdddddfdec0c2c3c0dcdfdddddfdec0f9b0b1e9f9b2b1e9e9e9b0b1f9e9e9f9b0b1c0dcddaeddabacacadaedcdddddddedddec00000
f0e4e3e4f0e4f0e4f0e4f0e4f0e4e3e4f0e4c0c0c0c1c0c0c0c0c0c0c0dcdddef1f4f2c0f0e4f0e4f6e0e2c0e1e0e2f1f5e4f0e4f0e4f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8c0ecededededeec0c2c3c0ecededededeec0f9f9e9e9f9b0b1e9e9e9e9f9b0b1b0b1f9e9c0dcdfa5abe9e9e9e9addcdddfdfdedddec00000
e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0c4c4c4c4c4c4c4c5e0c6c4ecefeec0c0c0c0e4f0e4f0e4f6f2c0f1f4f2e1e0f0e4f0e4f0e4f7e4f7e4f7e4f7e4f7e4f7e4f7e4f7e4f7c0fcffcfcffffec1c2c3c0fcffcfcffffec0f9b0b1e9f9f9e9e9e9e9b2b1f9e9b0b1f9e9c0dcdda5bbe9e9e9e9bddcdddfdddedddec00000
f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e49ec0c0c0c0c0c1f1f4f2c0fccffea0a1c09e9ee4e3e0f6f2c0c1c0c0c0f1f5e4e3e4e39ef0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f09ec0c1c0b8bac0c0c0c2c3c0c0c0b8bac0c1c0f9b2b1e9f9b0b1e9e9e9b0b1f9e9e9f9b0b19edcdfddaebbbcbcbddddcdddddfdeddde9e0000
e4e3e4e3e4f6f3f4f3f4f3f4f3f5e4e3e4e39dc1c0c0c0c0c0c0c0c0c0c0c0c0c0c0c09d9df4f3f4f2c0c0c0c1c0c0c0f1f4f3f4f39d9df0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e49dc8c4c4c4c4c4c4c9c2c3c0c0a8a9a9aac0c0f9f9e9e9f9b0b1e9e9e9e9f9b0b1b2b1f9e99ddcdddddfddddaedfa5dcdddddddeddde9d0000
f4f3f4f3f4f2c0c0c1c0c0c0c0f1f4f3f4f3d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0f0e4f0e4e3e4f0e4f0e4f0e4e3e4f0e4f0e4c7c0c0c0c0c0c0c7c2c3c0c0b8b9b9bac0c0f9b0b1e9f9f9e9e9e9e9b0b1f9e9b0b1f9e9c0dcdda5a5dda5a5dddddcdda5dfdedfdec00000
c0c0c0c1c0c0c0c0c0c0c0c0c1c0c0c0c0c0d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d2e4d3d1d1d1d1d1d1d1d2e4d3d1d2e4d3e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0d8c4c4c4c4c4c4d9c2c3c0c0c0c0c0c0c0c0f9b0b1e9f9b2b1e9e9e9b0b1f9e9e9f9b0b1c0dcdda5a5dfa5a5dddfdcdfdfdddedddec00000
cacafacacbcafacafafacacbcafacacbfacac4c4c4c4c4c4c4c4c4c5e0c6c4c4c4c4c4c4e5e4f0e4e5e0c6c4c4c4c5e0f0e4e5e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4a9a9a9a9a9a9a9aac2c3a8a9a9a9a9a9a9a9d1d1d1d1d1d1d1d1e9e9d1d1d1d1d1d1d1d1c1dcdddddddddddddddddcdda5dfdedddec00000
dadbdadadadadadadbdadadadbdadadadadbc0c0d7c0c0c0c0d6c0f1f4f2c0c0c1d5c0c0e4f0e4f0e4f6f2e1e0e2f1f5e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4e3e4f0b9b9b9b9b9b9b9bac2c3b8b9b9b9b9b9b9b9c4c4c4c4c4c4c4c4c2c3c4c4c4c4c4c4c4c4c0dcdddfdddddfdddddddcdda5dddedddec00000
eaeaebeaeaeaeaeaeaeaeaebeaebeaeaeaeac0c1c0c0c0d4c0c0c0c0c1c0c0c0c0c0d7c0f0e4f0e4f6e0e2f1f4f2c0f1f5e4f0e4f0e4f0e4e3e4f0e4f6f3f4f3f4f3f5e4f0e4f0e4c0a8a9aac0c1c0c0c2c3c0c0c0c0c0c1c0c0c0c1c0c0c0c0c1c0c2c3c0c0c0c0c1c0c0c0c0dcdfa5a5dda5dddddddcdddfdfdedfdec10000
e9e9e9e9e9e9fbe9e9e9e9e9e9e9e9fbe9e9c0c0c0c0c0c0c1c0c0c0d5e1e0e2c0c0c0c0e4f0e4f0e4f6f2c0c0c0c1e1e0f0e4f0e4f0e4f0e4f0e4f6f2a8a9a9aac1f1f5e4f0e4f0c0b8b9bac0c0a8aac2c3c0c1c0c0c0c0c0c0c0c0c0c0c0c0c0c0c2c3c0c1c0c0c0c0c1c0c0dcdda5a5dda5a5ddddecefefefeedddec00000
e9e9fbe9e9e9e9e9e9e9e9e9e9e9e9e9e9e99ec0c1c0c0c0c0c0c0c0c0f1f4f2c0c1c09e9ee4f0e4f6f2c0c0c0c0c0f1f5e4f0e4f09e9ee4f0e4f6f2a8b7b7b7b7aae1e4f0e4f09ec0c1c0c0c0c0b8bac2c3c0c0c0c0c0c0c0c0c0c0c0c1c0c0c0c0c2c3c0c0c0c0c0c0c0c09edcdfdddfdddddddddddfdfdfddddddde9e0000
e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e69de2c0c0c0e1e0e2c0c0c0c0c0c0c0c0c09d9dc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c09d9df0e4f0e0e2b8b7b7b7b7baf1f5e4f0e49dc8c4c4c4c4c4c4c9c2c3c8c4c4c4c4c4c4c9c8c4c9a6a7c8c4c9c8c4c9c8c4c9c8c4c9c89ddcdda5a5dda5a5dddda4dda4dda4dfde9d0000
e6e6e7e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f6f2c0c0c0f1f4f2c0c0c0c1d6c0c0c1e1e0c0c0c0c0c0c0c0c0c0d7c0c0c0c1c0c0c0c0f0e4f0e4f0e0e2b8b7b7bac0e1e0f0e4f0e4c7d4c0c0c0d6c0c7c2c3c7d5d7d5c0d7c0c7c7d7c7a6a7c7d4c7c7d6c7c7d6c7c7d6c7c7c0dcdfa5a5dda5a5dddfb4ddb4ddb4dfdec00000
e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e8e6e6e0e2c0c1c0c0d6c0c0e1e0e2c0c0d5c0f1f5c0c0c1c0e1e0e2d6c0c0c0c0c0c0c0c0c0c0e4f0e4f0e4f6f2a2c0c0c0c1f1f5e4f0e4f0c7c0d7d6d5c0d7c7c2c3c7c0c0d4c0d6c0c7c7d6c7a6a7c7d7c7c7d5c7c7d7c7c7d6c7c7c0dcdddddddfdddddddddddddfdddfdddec00000
e6e6e6e6e6e6e6e6e8e6e6e6e6e6e6e6e6e6f0e0e2c0d4c0c0c0c0f1f4f2c0c0c0d6e1e0c0c0c0c0f1f4f2c0d5c0c0c1c0c0c1c0c0c0f0e4f0e4f0e4c1c0a2a2c0a2e1e0f0e4f0e4d8c4c4c4c4c4c4d9c2c3d8c4c4c4c4c4c4d9d8c4d9a6a7d8c4d9d8c4d9d8c4d9d8c4d9d8c0ecededededededededededededededeec00000
e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e4f0e0e2c0c0d7c0c0c1c0c0c0d7c0e1e0f0c0c0c0d5c0c0c0c0c0c0c0c0d4c0c0d5c0c0e4f0e4e3e4f0e0e2a0a1c1e1e4f0e4f0e4f0c8c4c4c4c4c4c4c9c2c3c8c4c4c4c4c4c4c9c8c4c9a6a7c8c4c9c8c4c9c8c4c9c8c4c9c8c0fccfcffdcfa3fdcfcffdfdffffffcffec10000
e6e6e6e6e6e6e6e6e6e6e6e6e7e6e6e6e6e6f0e4f0e0e2c0c0c0c0c0c0c1c0c0e1e0f0e4c0c0d4c0c0c0c1c0c0c0c0c0e1e0e2c0c0c0f0e4f0e4f0e4f0e0e2a0a1f1f4e4e3e4f0e4c7d7c0d4c0d7c0c7c2c3c7c0d4d5c0d7c0c7c7d5c7a6a7c7d6c7c7d5c7c7d4c7c7d4c7c7c0e9e9a3e9e9b3e9e9b2b1a3a3e9e9b0b1c00000
e6e6e6e8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e4f0e4f0e0e2c0e1e0e2c0e1e0e5e0f0e4f0c0c0c0c0c0c0c0c0c0c0c1c0f1f4f2c0c0c0e4f0e4f0e4f0e4f0e0e5e0e5e0f0e4f0e4f0c7d5d6c0d5c0c0c7c2c3c7d5c0c0d6c0d6c7c7d4c7a6a7c7d4c7c7d4c7c7d5c7c7d7c7c7c1e9e9b3e9e9e9e9e9e9e9b3b3a3e9b2b1c00000
e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f0e4f0e4f0e0e5e0f0e0e5e0f0e4f0e4f09e9ec0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c09ef0e4f0e4f0e4f0e4f0e4f0e4f0e4f0e4f09ed8c4c4c4c4c4c4d9c2c3d8c4c4c4c4c4c4d9d8c4d9a6a7d8c4d9d8c4d9d8c4d9d8c4d9d8c0e9e9e9e9e9e9e9e9e9e9e9e9b3e9e9e9c00000
__sfx__
a2010000070401f6401f6300e6200d610050100301001050000100201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
12030000256402c6602f6602f65027640206401a630136300e6500d650106401866022620106400b6300a65010630146101062001620006100061000000000000000000000000000000000000000000000000000