wdgtHY̫ V6^H U -- BombSquad -- -- Copyright 2009, A.McBain, HRyba Redistribution and use, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- While this software is released "as is", that doesn't mean we won't mind getting bug reports. JU#*U_^PNG  IHDRuN5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FJUIDATx{xTչߵo3Ifr=bUc-Xm -SK=-k'hjK[jA Q@.-޸&p$3̾3kX =.Eɂ <˖-S֮]]\\LEpBM̴qmٲew߭*ׯn.//!v <=&wqq1-,,dڵʭޚQ2k֬444Hv۫۷˗/ﶻkoo'?SGlݺUַNjjj|Tpw{Bxn>.,,uuuwm+, ,y:{OMMMIrz<쳶sҤI&={wf24ϛ7~|[FMMMԮ]V+,Y0Aĉjl@({Nw| ǪU:=jjj"nYxqX|foٲ-g˪u=&M2^{ZuutҤI)=S{leN8dbg[;ٝ?q{VZMcǎ5q-;>Cmtꈭ3mhZXXH"{Wg k֬+Q@QQc?ydeԩSMV-[ttǎᚚ(;\ҥK{GwPYYiرC]zSS_:/HĒƧz*2i$NcK^{cla.3ɓ'CO=TdرdXC.&M2Ŷbɒ%]wK|;ֲkg@uڵk iSS3Ϩ,NkGcuv|x>cccc]v7fʙ3gN΋/rq("(HSvτn}IH' ;>vnҟ wy5 yFu$qLx766ڊz[[agD<>g]],ּgLxTg^x!.R9cCPԑ󔆆 4YWW'ua1 0dzw!񟳪*~Xd;?,";Eu8APG.\UUU{n{O?*;3шϧMde9dرcu])S&??u])5N=={{1?yy:[,YluVy9ʅcmGn[[H!{TTT-/,,K,IFr9s̙3'=&M2T`]]կ~5W\>vXkҥPWW'⋪xVJ_|QͤG~_moo'qj"=͋-X~zyРA> juVyv~v5mmω]R_~`vpG ]l>*g\~ V]k;>ӾSyAl |8[kgFoy]g30QK;$˷N O()L;J?˝2j+ϖsSF6^uI,{v.:k.κl϶ ,N}EN -]_ZM9nnwkkܬ%̹:]7_2Z˾y~/uϱɓiSuvmh}o|oz=W\^ku,Z:ҏk Eح.i;ZJsGߝ=u`OR}u{vmya*ܤ.z&)bYa_%mwv :vy?J,#@aҘ,;Wi5iR)/5Exc?=ӺmgR`][1.)&OgW役 13bGOpK[_Py@}\&[6`j7]!̦=C\ۻȳv{8I;IBRl_k4e Aܓ4wv|4 o<ν 1HlyS9.q L=^\:Ò"ZΨNnw*/{5:벱}a3#5(/}0~vYx޿lq*ߎd*e,")2idI8,<&_͝՟_{Y+w1QA}?ϙfkV<&=!:irxt3n"# ygw珮;s^S}A)> Iq;BҶC&wQh(|Ҙ&S'[a#L=* ͗_ޠͺlNvmc}sv_.# r)#YF/֫^Go|ҤN(9^\rX=H[pNpݘKM.]W194 bK y2ǤDJ#0!@l>]:pGoZ3pG!63wk\qqW\@gu$:kb\noP3-mLGՅÍ_eٽ:s˼[LGG.h^CyM!&Ls_(yG#T&\QhDrq)YG)X8sJ$5jbǒIU(c6N^$FYX7)5(bQ"O~ǻ[;C ,g619.[Q^9 U4wS)[3,E0L#\kwk͗c/: uFbcRec|,살q;ۢpA@S? 5];mW5 X] عYgM5qd쮇6&fog6m'7wHVl>*?qv/<*ek;>ɮQԑlC ,- g֥cKVĒ5&b#,]2joΙr7N4ī2&<_쪼m/}Ȃ岉p}bmftJ -NKr΂ rt'wئ߉RpJe}ة393w!:u9\z?b;?#뙊Aw~p/Qmp9zQVhqex3A JIOA&\.hK|'W0Z TE `X1.@tQ|w67$Oܙ˹ 2&vZDAR-2$}N֩efďQRE9IEuj# I9L( 7!GRT,ډ!ި/7aKх#(yŮDX.wrb"V"'Ol$JJn6W`"aX+JO 7`vCGPԑUyϲ]h@h ,Jo u36$*@grF%A M9 d *Bhv핒J9x%'>KE^^& pr Bd B{$<e}hh1#u:u^ v۷P8Մ 2t5H)wl +JҩFY (A&PT*{onlȢaAQG<HqQU J "ԅ F'E*H7Cڷk&?@k%f5O ߛķ#(Ȁr\43:Q3K}вL!V`wu}Xi(v7 Ώwy-k6ss9c{0SGbh_ `Y}0xD5F|LjU+\ 1 ryt"E  &/4NA\\lv|;g4CJ/GjcƮ}GH}xc&%r2_e˜AR㝔\]7vGPƝHVx(`z;ΏehY{yޮC*a;:2yϹ;)I{8Oj>GOJii0d(H2:lUw;?뒼ka^Vs?} J#o(0xcE!>еO - (>w=HQQdv4ؑ Z4d$d飭딃ֆ-ށMzR=(D?@ѿIԂz)94#wŽ# p|mr~m w@~a~KG]h $[H&)дS68OH#ǥoʥGQ}GV~_PDOU;;Kc*&}p_dEMA)xzd /kyz$؉ԡ(4AQGKPqZ%SQ()Vh0KV[dr hn^f?]Rk9pB:ּG2dTDN~h>HAQ=PX\O¡@ __)ɍ2L60 &[qa@> Q9SgKӢ#(@w]dߧ)qLS7j}А\S+>N2l5\vEF[H^!9ȉtKv &)OrA' 0$%>#Q퉎I!D>uAHJ#chI@Ɣ]h ɉx 璵!qG-yR dADY4>.S,W8xxT 刎:Cp!IwuXvLݥCb2iL(I\wV w\ ^1Bܤ6%gSu^Pdl#m'$JUf]XM+BOR"i&@1IQB !H܁).rN¥ [VQQdj'JǐaU+r=$N$iKބ{{^ S 1)aJ;F@-b.P RJ!r*KO :;Ӝ AQG J-u woH$Jo!zᄏȜK g{u#v5#*=B@b.<ő9ttE@mǏHnT_D}E'a&{)V,ި]B]HwVC- r^=GI,!W~ ͣ=kH$ҩ}z mD$d/vt`wgAAGЩ#ϩԴAg9Cv`A@)`E}*.A | ='I0R5k~SƝFZBu_鄝dQtu2l } t89֘*4Q$˕9c06+V8 < ;N`!7 ihqzd%cq!'!zY0Jlt C)RggE(c1bXC`L AI.IBxh^^7j5zO.ʥx5MMGS_RDAQGA({nJ[[d4|p(..P$IJ)X4Q(I i 2!$C[[|!׿Xȑ#/X'!Ԑ(5(:rب޽[;r\VV0dJ)C,]0 &E=Uo (B^^BII TTT@$`0(8qB:t萲yf綾^:ujW1Ln |#E9Gٽ{6x`/"|( PJ!1m$& 2رca˖-jNR;2%ǥ}|fPg<JKK\XXrf(Hz1=&)+Dx :u饘fS]iO=%:29rݻ#G@[[tvvBww7DQ0 #=AAA < #FѣGøq㠨(怒rj|Ӿ :2@8vlܸ !G\COF!‰'`TJ)|>5jAyy9\|PXXFL]>9(~Ϧ7+֟#(Eڹs'l߾>38y$5B 5س()r9f&eA4}޽{,(**rx<JKKT"vg" (bƍm۶Ɂ@$IJ֛ynEag ;g޲,Bc0MsLb^s5W\ae ۉ| #8WV֮]nٲEFw㼘NB9]$8zb wU/ӧOo]3a8 P(oi&0q;u'΋c]a_ٴivZoԿMQudgi{ァA",=-zazLݲqg iLӄ 6(uuu?Oc֬Y.BFPԑ[o߿_e4M!Cr1~=SE]yAg1 {eLӄp8Lz-O?o&??b"(yG}}+hk׮U-UUq~w<]. c'NnGA޽{n-VQQa᷌#dO?eYUUA.vt&n.n.V=qexQgn4d Î4MXjz![o]~:2-[Lmmm3Ξ=](v.t9v& ],k.E1APԑ~;h4JE`"΄.OwG&v[9J)Bz4aN;vLz饗2w(~:2`bƻ|rsEQzD.Lxʲ^;wILal41\(yW.iǀ#羠׿Wn^^yWn'ެf²|r4MrGPu7MR)rquʡm :/,a=(ɑ E'ϲ7xCe(AQGM|IϲeTy]\2E`7a_sND.nw[gfde9%Yl ?OPu_֖-[.^*^n,u&2f"Sgnd@J:QJoOaU tvHzj_W(Z9貳qqjW)2DQtRuhug߾}kJNٹ]#,Qt6<.n?.kzQ^ۇs:rv?IOdQbE8ƭ.wzsN۳sg4IQO/X #g/NB.,]-KOӹvu2ه:سم<^Z}WQucobL^xAq eyd#bC0?o޽u_$.̱@ϙ8޸u;W~:w;&.ͭE5[GPԑu)ׯWܪ@ftQLq.],dk׮U֭[0:rv[oDtcgS͒g[72v^N%Ib uswQ*n]L;eø gl ]걻I|;[GPԑϗUVhWvΝ]܄-Wm%^ٮ=իѭ#(dž ͛7Nsuuge*dܖń|LL7o,oذ:|>YF $ӨL 7.;dSGϟ q*>EAQG>eYEw)F0ޓNYtqq ͛@ :rfY~|ANSlb{:sfA)}w:tHZ~a:rFٸqbWsdY9t?tw^d00Blڴ #E9s477K|n-m(t"uO K;ёMgw?u䌹tرc$u>ȂBܢt1b^阜.l! 'wZ Xܹ]▷.Nͱg:u^ocщ;tʘ`0#K$!wN Swzt$zq:Onk\#:oDQe9E(v:X1|.ݭh:ǞCϴgi6qPlX,p:.6x)fqoFވu'nW40ݱ":稪 i:Pɧ80L6ވz&KLNm853vuu˲92߳Tq8įcVȳl_O)ɯ)xЪ#(Hh0$&/ 4FNFF.행 2D#(HRPP@[ZZzdp3i*7et2D=g <칠EAQGAQm qjfވQ=*֧ 2EAQG#FL`b.(u3i4͖әtD͵;1a#(H2j(.^]&[΄#λi\+zs2yUQFX:ҿ?rS!ۄ_tKAvniǣ#(H/|4 Q>bvޕ;fY&L_ɜv:[饗^j_+#Gʬ>HR FT9%(=]מm$bRVVf13uYVK,1>cQnnnzV{8uqni8^Ji#:uߩ4_}dvV7|[:(]̖lJz:xvM'O jzq/qzt+N~_Vdrm"n^KJJiPu0j(kĉի Y{TbkW5cflL{iIwJ4i:rFꪫ+W*$iɑ3Zg=L3rNi m1XhWsW#g3f=usq`h94\(|6žILo2v;w.u|;v5sLuE9̗eQe9sFs֧Onr-zww7(BEEQ,ˠ(JYEETNAPixAgb:{&`̚5Kojj#1:/vѥ3%dK.8v=h6vNǏo|FWWQU&TU%eYTePUdYNn^vau$H h4J ÀX,aÆ3f'M!2z/F,gBݰ]VUU`<QUTU0(x&Sg_|i&8p@b\)NH'9G !0zhŠF4MjJR˲y9|U΢nB)(:6qYy#bX% s1WVVf)vzN鎁61]س녡CZG(>,X,FDujfiope8b#SG LYgRKehii!PtĮvNnjfn"$b"?ѡCҡCD :s6;W# n؋iDA|@ j&(|{:Xt#N㑻BdWb?E3Gr8qD"OD3uv N-QbZRRBٱ'9;(L#:r (LGb4bzTu躞-0(!5#GHw|4SD[u* $Aqq12d|qS60%Pʆ`;N8rEI+vLPsBDQ( QUJ4MK8+]i±0@Q, PPP`?~\:viooOVވNO׭:(((( bcd|5,IgH=$lEh :cOt~!HiP<ߨz@&묹ui,DE>نo5j5bhiiZ[[I{{;1 #)]%6@~~>2d:t%F% :(Eн^/zzy{J8:[I-PqVfN^esGʪa,bSò,2n8 ;FI{{; Ä 'xBƮr%[gn#''aÆS)'%IJF.̩H0a?zAQGSAG!L,zdY>!H<buR,$D#?RJ '/ 3f tuu@ @Z[[vm;cUŮQBaa!2dUZZJ(˽YzBAUU$rx,vǓy=e벋$PqӉu1dI?NN-..N֗;^>7jWUQvQf7|Îe:Qu1]nB({Bel&$&)|̝e,˶EOGrv㮻!K2u&.byc"^5M>vQuVEQa*:J MӒJX@ z1kLPn]3ŝ5|&JCyL@APGI2&BLbD>8(_FgIس{ޚ,? d|.r#gQXx\rh=MEqaxag$I4ͤ!E0!od鬷8x88t[zSfիeuw*aDaGPԑ^ ;@⃹Pfaȇ 3D"8 ?')vltn)~qa8Qb#`/H@AGPԑ>v~+&4esr6h T4~9ᇬebWBϻq'An'r')!Ӷ{!I$(:']1Ah>rd燤vQ57AL7`؛/rEtݏ[/YlEPԑ>snΜib=ʹu4+Ttvb8qn Cn뮝";v/9 *WImUMNNݖv&n?#:g=FS"? )҉,_T(:r2v^QLEըї/gLOAQG nCNܝ%NNϲ\5ي68s"$.qN8LAPԑsFQ̀"# ( :   # ( yĶm{7_UU{sk_UUUŋkٶm[~@@ =z[VVWVVWYYu߻wosr->@ exsv[޽{e`0H͛+.?n]sxbownw'BQG>A/~;m46T[[/͟?ꫯ6ҭo?>}ӧ]]K.? ٳck֬ ^uUFMMMC=䭨jkkCPys=9r UVV='{;vÆ Ki]m۶M~饗<?p0~wG?Q.#g_3c }Μ91O~?>|Ŝmݖ'Ry'$=>`… s/s;wT~v[EK7i\p2,*?HǛ\sPQQaB!yڴiӦM3}eÆ ʴi OoFѣR >e̙1Oo[̙3'VYYi.i]sFLbfXBewh>`}mǾ;;}'le]bnw': >CyҤIș6mf͚iӌx 5k3fkjjr~?8qa`Æ ʌ3t+**0;ޙ3g;6leNW_;wn /_s=ٳK.0~ 7uuuryyEGC9z(i۷l]=h"o^^馛l3vN6ΝYfMҨ '|7ިֆ~K/ ܹs#k֬ tMq o۶MwNucP(D̙cn2 d+͜93+i~k_K(%~EEyQǿBF^[w^yʕٳcٜR?~~KyyYWW'#iᡇN8dN?cH`ǎ s3f,N2y- l**D^G֬Yuw?裏ACy+++Mno  ҧMflذA V̈́4}w~o}+f͚ {dQx9sĆ f=tߙM7ݤxzCCCa/^X w&Nh:_2R&JKKP(>ve?f̘/Zsϥ4 Kk׮...N' ʕ+@@;v쐫}>̙3gN(@ao[t6{o6?/m]=w_>PVX}g9 ䷿ʿtRmuwءTWWB?uʔ)W^is֙2eY^^nVWWm&gr\{~.\0e v_]ts*ܹs#bm6&;m;s+VP-Z䭭 a¾F)DmhbzgϞK'̕-\0:uHWA 2:f uAuAEAAQGAPAPAuAEAAQGAPA:=ڳgAsAs_APA?+9d*IENDB`k>K oU PNG  IHDRKFYgAMA abKGD pHYs  tIME% rtEXtCommentCreated with GIMPWIDATx{PW?tӴ<%_ .8S3Iyr2ƸMImf׵vu2lU2nf̴I9N|̘l:!81(h n~।ⷪ{=s=Z=NS(zk0iU I+ПaFIAz^b 8r;F=k֬!IOO===\r,*++Z4@CCfr>dl+WrJJJ vwwt:Q[\/18 _RR"r\(zBtبv'"Tu JfuD^SOOUU.+?Xb 䁪ST?ؒAlnx"WSk֬Y$xPJ?SZ-4ʋh4T*w댑A?57hT) w$P^!"--^麫.QHKK M"ΔQ]wwwSXXHWWV/^{CeeeȮ-QQQy+X$*/ߏg~iP6Y(Μ9InS[[DF5:&i h\m( ޓ{&T;FnY:8zeF"j;j~p}h4\+HMke)dƚbTDEEf`s4QydnjOgS:+++e'DOIIUi,V+&ɯ`[m- &IBNsH0V;۰al9qn.Z(9sLlL& ,XQ[RRشw/O:7O}!ØL&O^Y;|sdLL{/k;VЀNFOjj*RIll,ܭ鞟i ;/Vca+x鼲VV b'%o>h@s1[qՊϝRAT@s+/kpOx0!NK9ÇYbEЗąM4 =tMMM<n|wnih  22mFdeea41~u*Z-,밄bt;Xhc$ZmD N]g,ʋf.=?nyh^<֎Fa{]tvPE:hs;9jF^.DǀUqBK^UlJ%/TUy aZ5vc.I2AE Ѭ<rZ<o8_!]gΉ"sN|hNiUJ\[y{9[>Drw|c9;ŽWID1$m&;q2 ^cpKe0oH 8yU-M3A;OHxUӪKPv]MDdmH .tRB vp86T訠L,Q GÁ }76a*.%^l6vG>ѣnuY$b L{ %6!CqjJ/^k7suZ86aN쵠.@Mhxt*̈뺣kayN ΎENNx!//// (9"/cf6dgDAnwe{!ki!شwT锦_PTT%*k2ҥ }s4tNmmXTnqN=nf mlX}9%Qyee^mGGІ|A ɩZ:|b ڵA?=%~>*񼭭muՌT3Fw:3&ٳ3Q;9@|CCCPM}KMM^#33SGll,j"Ad2܌` nCj|gtvv~{Q2Z- qqam,2E(^Y=ַ\'+}"w,6O_햅>5_YT4+]}M+Mc91Ѷ[D1ls,ju0Wɰ&qӛK/v\T֧Fb6dw5 P(ɔ Jn; 4`a2 f"S 7xx>Ϋf\ ov2K̥6DQwmDoFCV T<&ǵ>HX%6f\wP\&'y6ʌQtYS{E h2?n/yǿ9SKY9rs6OvV9U=ȀiAZ =1Iݧ;|%[Ͻ C]ij/V͏%QFR85]CXVɫ le_gZىZpA~C*T*%of#V4 5 Hh4v4 n[ A ڈ4 w0k[AHKK H u.w0#gĽ= ~:onlxs(~ku)!kud$ ^tNLL Pw3yHӪUv>1z O$ww㌍Œ|k ZZxy>^w?xgX;m$y9ͪĐ0l̍bг{0 ի<;OYc(b)^(nQ"eVLg'.}WTC/^ 0) { var hours = Math.floor(time / 3600); var minutes = Math.floor((time - (hours * 3600)) / 60); var seconds = Math.floor(time - (hours * 3600) - (minutes * 60)); if(hours < 10) hours = "0" + hours; if(minutes < 10) minutes = "0" + minutes; if(seconds < 10) seconds = "0" + seconds; return hours + ":" + minutes + ":" + seconds; } else { return "--:--:--"; } } var frame = new Frame(); frame.hOffset = 17; frame.vOffset = 44; this.add(frame); var maxTextOffset = 0; var labels = {}; var vOffset = 0; var maxLabelWidth = 0; for(var i in winners) { var text = new Text(); text.data = i; text.size = 11; text.anchorStyle = "topLeft"; text.hAlign = "right"; text.vOffset = vOffset++ * (text.size + 5); frame.appendChild(text); labels[i] = text; if(text.width > maxLabelWidth) maxLabelWidth = text.width; maxTextOffset = text.vOffset + text.height; } for(var i in labels) { labels[i].hOffset = maxLabelWidth; } var times = {}; vOffset = 0; var maxTimeWidth = 0; for(var i in winners) { var text = new Text(); text.time = Number(winners[i][0]); text.data = Time(winners[i][0]); text.size = 11; text.anchorStyle = "topLeft"; text.hAlign = "left"; text.hOffset = maxLabelWidth + 10; text.vOffset = vOffset++ * (text.size + 5); frame.appendChild(text); times[i] = text; if(text.width > maxTimeWidth) maxTimeWidth = text.width; } maxTimeWidth = 43; var names = {}; vOffset = 0; var maxNameWidth = 0; for(var i in winners) { var text = new Text(); text.data = winners[i][1]; text.size = 11; text.truncation = "end"; text.anchorStyle = "topLeft"; text.hAlign = "left"; text.hOffset = maxLabelWidth + 10 + maxTimeWidth + 10; text.vOffset = vOffset++ * (text.size + 5); frame.appendChild(text); names[i] = text; if(text.width > maxNameWidth) maxNameWidth = text.width; } var editFrame = new Frame(); editFrame.hOffset = frame.hOffset; editFrame.vOffset = frame.vOffset - 2; editFrame.visible = false; this.add(editFrame); var editLevel = "Beginner"; var editBorder = new BackgroundCanvas(); editFrame.appendChild(editBorder.canvas); var editInput = new TextArea(); editInput.bgOpacity = 255; editInput.size = 11; editInput.hOffset = 1; editInput.vOffset = 1; editInput.width = 73; editInput.height = editInput.height; // Y!WE will change the height if you don't do this editInput.scrollbar = false; editInput.onKeyPress = function(e) { var event = e || system.event; var keyString = event.keyIdentifier || event.keyString; if(keyString.toLowerCase() === "return" || keyString.toLowerCase() === "enter") { this.rejectKeyPress(); if(editInput.data !== "") { okayBtn.click(); } } else if(isTab(keyString)) { this.rejectKeyPress(); } }; editInput.onGainFocus = function() { editBorder.style.backgroundColor = $this.style.inputborderfocus; }; editInput.onLoseFocus = function() { editBorder.style.backgroundColor = $this.style.inputborder; }; editFrame.appendChild(editInput); function isTab(value) { return value.toLowerCase() === "tab" || value === "U+0009"; } editBorder.width = editInput.width + 2; editBorder.height = editInput.height + 2; editBorder.borderWidth = 1 / editBorder.width * 100; editBorder.borderHeight = 1 / editBorder.height * 100; this.editScore = function(level, time) { editLevel = level; times[level].time = time; times[level].data = Time(time); names[level].visible = false; editInput.data = names[level].data; editFrame.hOffset = frame.hOffset + names[level].hOffset; editFrame.vOffset = frame.vOffset + names[level].vOffset - 2; editFrame.visible = true; editInput.focus(); }; this.isScoreBetter = function(level, time) { if(time > 3600 * 99) return false; if(!times[level]) return false; if(!times[level].time) return true; return (times[level].time > time); }; maxNameWidth = Math.min(Math.max(maxNameWidth, editFrame.width), 150); for(var i in names) { names[i].width = maxNameWidth; } frame.width = maxLabelWidth + 10 + maxTimeWidth + 10 + maxNameWidth; var okayBtn = new ImageButton(frame, "okay"); okayBtn.addEventListener("click", function() { if(editFrame.visible) { names[editLevel].data = editInput.data; //editFrame.visible = false; //editInput.data = ""; } $this.close(); }, true); this.addEventListener("restyle", function() { okayBtn.style = this.style; okayBtn.hOffset = frame.width / 2 - okayBtn.width / 2; okayBtn.vOffset = maxTextOffset + 10; this.width = 34 + frame.width; this.height = 61 + frame.height; for(var i in labels) { labels[i].color = this.style.labelcolor; if(this.style.labelshadow) { labels[i].style.KonShadow = "0px 1px " + this.style.labelshadow; } times[i].color = this.style.textcolor; names[i].color = this.style.textcolor; } editInput.color = this.style.textcolor; editInput.bgOpacity = 255; editInput.bgColor = this.style.backgroundcolor; editBorder.bgColor = this.style.inputborder; }, true); var count = 0; this.addEventListener("title", function() { if(++count > 42) { this.title = "Hoopy Froods"; } }, true); this.addEventListener("close", function() { editFrame.visible = false; names[editLevel].visible = true; this.visible = false; }, true); this.__defineGetter__("times", function() { var obj = {}; for(var i in times) { obj[i] = [times[i].time, names[i].data]; } return obj; }); } vx/* * The reason for this "button" scrollbar is to be an improvement * over the built in scrollbar. * * The built in scrollbar if given proper insets from the ends * which allows a button-like image to be placed there. However, * when the image is pressed it behaves like the rest of the * scrollbar track and only moves scrollbar's thumb by "1". This * results in having to click it multiple times to get it to * scroll in the direction desired. * * A more native scrollbar, on the other hand, will continue to * scroll as long as the mouse continues to hold down the button. * * [A native scrollbar when clicked on the track will attempt to * center the thumb at that location.] - not possible with the built-in scrollbar. * * Unlike the built-in scrollbar, this class cannot reasonably be * used as a slider component, as advertised by the scrollbar * upon which it is built. * * The "scrolledFrame" property allows setting the frame to which * this ButtonScrollBar applies. It will automatically set the * reciprocal property on the given frame. Setting it to null will * detach the item from this scrollbar. */ function ButtonScrollBar(window, scrolledFrame, orientation, width, height) { EventAdapter.call(this); var $this = this; if(!(scrolledFrame instanceof Frame)) { throw "ButtonScrollBar#constructor: scrolledFrame must be an instance of a Frame object"; } if(orientation !== "vertical" && orientation !== "horizontal") { throw "ButtonScrollBar#constructor: orientation must be one of: horizontal, vertical"; } var frame = new Frame(); if(window) window.appendChild(frame); this.__defineGetter__("width", function(value) { return frame.width; }); this.__defineSetter__("width", function(value) { if(orientation === "horizontal" && !isNaN(Number(value))) { frame.width = value; $this.restyle(); } return value; }); this.__defineGetter__("height", function(value) { return frame.height; }); this.__defineSetter__("height", function(value) { if(orientation === "vertical" && !isNaN(Number(value))) { frame.height = value; $this.restyle(); } return value; }); this.__defineGetter__("hOffset", function(value) { return frame.hOffset; }); this.__defineSetter__("hOffset", function(value) { frame.hOffset = value; return value; }); this.__defineGetter__("vOffset", function(value) { return frame.vOffset; }); this.__defineSetter__("vOffset", function(value) { frame.vOffset = value; return value; }); this.__defineGetter__("visible", function(value) { return frame.visible; }); this.__defineSetter__("visible", function(value) { frame.visible = value; return value; }); // Which way to scroll var type = ""; var topButton = new Image(); if(orientation === "horizontal") { topButton.rotation = -90; } topButton.onMouseEnter = function() { if(timer.active) { timer.ticking = true; } }; topButton.onMouseExit = function() { timer.ticking = false; }; topButton.onMouseDown = function() { if(scrolledFrame !== undefined) { type = (scrollbar.orientation === "horizontal")? "left" : "up"; timer.ticking = true; } }; topButton.onMouseUp = function() { timer.ticking = false; }; frame.appendChild(topButton); var scrollbar = new ScrollBar(); scrollbar.autoHide = false; scrollbar.orientation = orientation; frame.appendChild(scrollbar); this.__defineGetter__("orientation", function() { return orientation; }); var botButton = new Image(); if(orientation === "horizontal") { botButton.rotation = -90; } botButton.onMouseEnter = topButton.onMouseEnter; botButton.onMouseExit = topButton.onMouseExit; botButton.onMouseDown = function() { if(scrolledFrame !== null) { type = (scrollbar.orientation === "horizontal")? "right" : "down"; timer.ticking = true; } }; botButton.onMouseUp = topButton.onMouseUp; frame.appendChild(botButton); this.__defineGetter__("scrolledFrame", function(value) { return scrolledFrame; }); this.__defineSetter__("scrolledFrame", function(value) { if(value instanceof Frame) { if(orientation === "horizontal") { scrolledFrame.hScrollBar = scrollbar; } else { scrolledFrame.vScrollBar = scrollbar; } scrolledFrame = value; } else if(value === null) { scrolledFrame = value; } return value; }); this.scrolledFrame = scrolledFrame; // This might have a better chance as a custom animation? var timer = new ExtTimer(); timer.interval = .1; timer.onTimerFired = function() { if(type === "left") { scrolledFrame.lineLeft(); } else if(type === "right") { scrolledFrame.lineRight(); } else if(type === "up") { scrolledFrame.lineUp(); } else if(type === "down") { scrolledFrame.lineDown(); } }; var style = {}; this.__defineGetter__("style", function() { return style; }); this.__defineSetter__("style", function(value) { if(typeof value !== "undefined" && value !== null) { style = value; $this.restyle(); } return value; }, true); this.addEventListener("restyle", function() { if(this.style.scrollthumb) { scrollbar.setThumbInfo(0, this.style.scrollthumb); scrollbar.setTrackInfo(0, 0, 0, [this.style.scrolltrackendtop, this.style.scrolltrackmid, this.style.scrolltrackendbot]); } topButton.src = this.style.scrollbtnup; botButton.src = this.style.scrollbtndown; if(scrollbar.orientation === "horizontal") { frame.height = Math.max(topButton.width, botButton.width); scrollbar.hOffset = topButton.height; scrollbar.vOffset = 0; scrollbar.width = this.width - topButton.height - botButton.height; topButton.hOffset = 0; topButton.vOffset = topButton.height + 2; botButton.hOffset = scrollbar.hOffset + scrollbar.width; botButton.vOffset = topButton.height + 2; } else { frame.width = Math.max(topButton.width, botButton.width); scrollbar.hOffset = 0; scrollbar.vOffset = topButton.height; scrollbar.height = this.height - topButton.height - botButton.height; botButton.hOffset = 0; botButton.vOffset = scrollbar.vOffset + scrollbar.height; } }, true); this.height = height; this.width = width; this.restyle(); } ]function CustomSetupWindow(titleText, lastColumns, lastRows, lastBombs) { DecoratedWindow.call(this); var $this = this; this.title = titleText; var frame = new Frame(); frame.hOffset = 17; frame.vOffset = 44; this.add(frame); var fields = {"Columns": {min: 9, max: 30, value: lastColumns, length: 2}, "Rows": {min: 9, max: 24, value: lastRows, length: 2}, "Bombs": { value: lastBombs, length: 3}}; var firstInput = null; var lastInput = null; var vOffset = 0; var maxInputWidth = 30; var maxLabelWidth = 0; for(var i in fields) { var textLabel = new Text(); textLabel.data = i; textLabel.size = 11; textLabel.hAlign = "right"; textLabel.anchorStyle = "topLeft"; textLabel.vOffset = vOffset++ * (textLabel.size + 5) + 2; frame.appendChild(textLabel); fields[i].label = textLabel; if(textLabel.width > maxLabelWidth) maxLabelWidth = textLabel.width; var editBorder = new BackgroundCanvas(); editBorder.bgOpacity = 255; editBorder.vOffset = textLabel.vOffset - 2; frame.appendChild(editBorder.canvas); fields[i].border = editBorder; var editInput = new TextArea(); editInput.bgColor = "white"; editInput.bgOpacity = 255; editInput.size = 11; editInput.hOffset = 1; editInput.vOffset = editBorder.vOffset + 1; editInput.width = maxInputWidth; editInput.height = editInput.height; // Y!WE will change the height if you don't do this editInput.scrollbar = false; editInput.data = fields[i].value; editInput.length = fields[i].length; editInput.onKeyPress = function(e) { var event = e || system.event; var sr = this.getSelectionRange(); var keyString = event.keyIdentifier || event.keyString; var keyCode = event.keyCode; if(keyString === "U+0008") return; if(keyString.toLowerCase() === "return" || keyString.toLowerCase() === "enter") { this.rejectKeyPress(); submit(); } else if(isTab(keyString)) { this.rejectKeyPress(); if(this.tabTo && this.tabTo.focus instanceof Function) { this.tabTo.focus(); } } else if(keyString === "U+0056" || keyString === "0x56") { // No pastes! (well, at least no standard metakey+v pastes ... Windows still has Shift+Ins) this.rejectKeyPress(); } else if(sr[0] - sr[1] === 0 && (this.data.length + 1 > this.length || !isNumber(keyString, keyCode, event.shiftKey))) { this.rejectKeyPress(); } else if(sr[0] - sr[1] !== 0 && !isNumber(keyString, keyCode, event.shiftKey)) { this.rejectKeyPress(); } }; editInput.border = editBorder; editInput.onGainFocus = function() { this.border.bgColor = $this.style.inputborderfocus; }; editInput.onLoseFocus = function() { this.border.bgColor = $this.style.inputborder; }; editInput.min = fields[i].min; editInput.max = fields[i].max; editInput.__defineGetter__("value", function() { if(this.max && this.min) { return Math.min(this.max, Math.max(this.min, Number(this.data))); } else { return Number(this.data); } }); frame.appendChild(editInput); fields[i].input = editInput; if(!firstInput) firstInput = editInput; if(lastInput) lastInput.tabTo = editInput; lastInput = editInput; editBorder.width = editInput.width + 2; editBorder.height = editInput.height + 2; editBorder.borderWidth = 1 / editBorder.width * 100; editBorder.borderHeight = 1 / editBorder.height * 100; } lastInput.tabTo = firstInput; for(var i in fields) { fields[i].label.hOffset = maxLabelWidth; fields[i].border.hOffset = maxLabelWidth + 10; fields[i].input.hOffset = maxLabelWidth + 11; } frame.width = maxLabelWidth + 10 + maxInputWidth + 2; var okayBtn = new ImageButton(frame, "okay"); okayBtn.vOffset = lastInput.vOffset + lastInput.height + 10; okayBtn.addEventListener("click", function() { submit(); }, true); function isTab(value) { return value.toLowerCase() === "tab" || value === "U+0009"; } function isNumber(value, code, shift) { if(!shift && (value.indexOf("0x") === 0 || value.indexOf("U+") === 0)) { if(value === "32") return false; value = Number(value.substring(2)); if(!isNaN(value)) { return value >= 30 && value <= 39; } } return code > 95 && code < 106; } function isNumberCode(value) { } function submit() { var values = []; for(var i in fields) { if(i !== "Bombs") { values.push(fields[i].input.data = fields[i].input.value); } else { // Max bombs is (cols - 1) * (rows - 1) values.push(fields[i].input.data = Math.min((values[0] - 1) * (values[1] - 1), Math.max(10, fields[i].input.value))); } } $this.visible = false; $this.submit(values[0], values[1], values[2]); } this.addEventListener("restyle", function() { okayBtn.style = this.style; okayBtn.hOffset = frame.width / 2 - okayBtn.width / 2; this.width = 34 + frame.width; this.height = 61 + frame.height; for(var i in fields) { fields[i].label.color = this.style.labelcolor; fields[i].input.color = this.style.textcolor; fields[i].input.bgOpacity = 255; fields[i].input.bgColor = this.style.backgroundcolor; fields[i].border.bgColor = this.style.inputborder; if(this.style.labelshadow) { fields[i].label.style.KonShadow = "0px 1px " + this.style.labelshadow; } } }, true); this.addEventListener("title", function() { // No easter egg here! }, true); var oldValues = {}; for(var i in fields) { oldValues[i] = fields[i].input.value; } this.addEventListener("focus", function() { for(var i in fields) { oldValues[i] = fields[i].input.value; } fields["Columns"].input.focus(); fields["Columns"].border.bgColor = this.style.inputborderfocus; }, true); this.addEventListener("close", function() { this.visible = false; for(var i in fields) { fields[i].input.data = oldValues[i]; } }, true); } function DecoratedWindow() { EventAdapter.call(this); var $this = this; var window = this.window = new Window(); window.title = widget.name; window.shadow = true; window.onLoseFocus = function() { try { $this.loseFocus(); } catch(e) {} }; this.__defineGetter__("width", function() { return window.width; }); this.__defineSetter__("width", function(value) { var number = Number(value); if(!isNaN(number)) { if(window.width !== number) { window.width = number; this.restyle(); } } return value; }); this.__defineGetter__("height", function() { return window.height; }); this.__defineSetter__("height", function(value) { var number = Number(value); if(!isNaN(number)) { if(window.height !== number) { window.height = number; this.restyle(); } } return value; }); this.__defineGetter__("hOffset", function() { return window.hOffset; }); this.__defineSetter__("hOffset", function(value) { if(!isNaN(Number(value))) { window.hOffset = value; } return value; }); this.__defineGetter__("vOffset", function() { return window.vOffset; }); this.__defineSetter__("vOffset", function(value) { if(!isNaN(Number(value))) { window.vOffset = value; } return value; }); this.__defineGetter__("menu", function() { return window.contextMenuItems; }); this.__defineSetter__("menu", function(value) { if(!(value instanceof Array)) { window.contextMenuItems = [value]; } else { window.contextMenuItems = value; } return value; }); this.__defineGetter__("visible", function() { return window.visible; }); this.__defineSetter__("visible", function(value) { window.visible = !!value; if(window.visible) { window.focus(); } return value; }); this.focus = function() { window.focus(); }; var topLeft = new Image(window); var topCenter = new Image(window); var topRight = new Image(window); var centerLeft = new Image(window); var center = new Image(window); var centerRight = new Image(window); var bottomLeft = new Image(window); var bottomCenter = new Image(window); var bottomRight = new Image(window); var title = new Text(window); title.size = 11; title.anchorStyle = "topLeft"; title.hAlign = "center"; title.vOffset = 7; title.onClick = function() {try { $this.title(); } catch(e) {}}; this.__defineGetter__("title", function() { return title.data; }); this.__defineSetter__("title", function(value) { title.data = value; window.recalcShadow(); return value; }); var close = new Image(window); close.tracking = "rectangle"; close.vOffset = 7; close.onClick = function() {try { $this.close(); } catch(e) {}}; var style = {}; this.__defineGetter__("style", function() { return style; }); this.__defineSetter__("style", function(value) { if(typeof value !== "undefined" && value !== null) { style = value; this.restyle(); } return value; }); this.addEventListener("restyle", function() { // ARRGGHHH! Layout managers make this kind of stuff *so* much easier! topLeft.src = style.topleftimg; topRight.src = style.toprightimg; topRight.hOffset = window.width - topRight.width; topCenter.src = style.topcenterimg; topCenter.hOffset = topLeft.width; topCenter.width = topRight.hOffset - topCenter.hOffset; bottomLeft.src = style.bottomleftimg; bottomLeft.vOffset = window.height - bottomLeft.height; centerLeft.src = style.centerleftimg; centerLeft.vOffset = topLeft.height; centerLeft.height = bottomLeft.vOffset - centerLeft.vOffset; bottomRight.src = style.bottomrightimg; bottomRight.vOffset = window.height - bottomRight.height; bottomRight.hOffset = window.width - bottomRight.width; centerRight.src = style.centerrightimg; centerRight.hOffset = topRight.hOffset; centerRight.vOffset = topRight.height; centerRight.height = bottomRight.vOffset - centerRight.vOffset; bottomCenter.src = style.bottomcenterimg; bottomCenter.hOffset = bottomLeft.width; bottomCenter.vOffset = window.height - bottomCenter.height; bottomCenter.width = bottomRight.hOffset - bottomCenter.hOffset; center.src = style.centerimg; center.hOffset = topCenter.hOffset; center.vOffset = topCenter.height; center.width = topCenter.width; center.height = bottomCenter.vOffset - center.vOffset; title.color = style.titlecolor; if(style.titleshadow) { title.style.KonShadow = "0px 1px " + style.titleshadow; } close.src = style.closeimg; close.hOffset = window.width - close.width - 7; window.recalcShadow(); }, true); this.restyle(); this.add = function(obj) { if(obj instanceof DOMNode || obj.tagName) { window.appendChild(obj); } else { throw new Error("DecoratedWindow.add: Illegal argument, DOMNode expected"); } }; } 79]function Dialog(titleText, errorMessage) { DecoratedWindow.call(this); var $this = this; this.title = titleText; this.visible = false; var frame = new Frame(); frame.width = 283 - 34; frame.hOffset = 17; frame.vOffset = 44; this.add(frame); var text = new Text(); text.data = errorMessage; text.wrap = true; text.anchorStyle = "topLeft"; text.width = frame.width; frame.appendChild(text); var okayBtn = new ImageButton(frame, "okay"); okayBtn.addEventListener("click", function() { $this.close(); }, true); this.addEventListener("restyle", function() { okayBtn.style = this.style; text.color = this.style.textcolor; text.width = frame.width; frame.height = text.height + 10 + okayBtn.height; okayBtn.hOffset = frame.width / 2 - okayBtn.width / 2; okayBtn.vOffset = frame.height - okayBtn.height; this.width = frame.width + 34; this.height = frame.height + 61; }, true); this.addEventListener("close", function() { $this.visible = false; }, true); } 30lEventAdapter = (function() { function refSeq(name) { if(!refSeq[name]) { refSeq[name] = 0; } return ++refSeq[name]; } return function(error, auto) { if(typeof error === "undefined") error = true; if(typeof auto === "undefined") auto = true; var refNum = refSeq(this.constructor.name); var events = {}; this.addEventListener = function(event, listener, capture) { if(arguments.length !== 3) { throw "addEventListener: Wrong number of parameters"; } // Only handle events via capture (for now) if(capture) { event = (event + "").toLowerCase(); if(!(events[event] instanceof Array)) events[event] = []; events[event].push(listener); } }; function dispatchEvent(event, args) { if(events[event]) { var count = events[event].length; for(var i = 0; i < count; i++) { events[event][i].apply(this, args); } } } this.__noSuchMethod__ = function(id, args) { var lid = (id + "").toLowerCase(); if(error && !events[lid]) { // Restyle the stack. The error isn't here, it's where this was called! var err = new Error(id + " is not a function"); err.stack = err.stack.substring(err.stack.indexOf("EventAdapter")); err.stack = err.stack.substring(err.stack.indexOf("@") + 1); err.fileName = err.stack.substring(0, err.stack.indexOf(":")); err.lineNumber = err.stack.substring(err.stack.indexOf(":") + 1, err.stack.indexOf("\n")); throw err; } else if(auto) { (this[id] = function() { dispatchEvent.call(this, lid, arguments); }).apply(this, args); } else { dispatchEvent.call(this, lid, args); } }; this.toString = function() { return "[object " + this.constructor.name + "#" + refNum + "]"; }; }; })(); wRW9function GameButton(window, width, height, hOffset, vOffset) { EventAdapter.call(this); var $this = this; const DEFAULT = "button"; const FLAGGED = "flagged"; const BLANK = GameButton.BLANK; const NUMBER = GameButton.NUMBER; const BOMB = GameButton.BOMB; const BOOM = GameButton.BOOM; const BAD = "bad"; var frame = new Frame(); frame.width = width; frame.height = height; frame.hOffset = hOffset; frame.vOffset = vOffset; if(window) window.appendChild(frame); var image = new Image(); image.onMouseDown = function(e) { var event = e || system.event; if(enabled && state === DEFAULT && !event.altKey) { this.down = true; image.src = $this.style.down; } this.altKey = event.altKey; }; image.onMouseUp = function() { if(enabled && state === DEFAULT && this.down) { this.down = false; image.src = $this.style.button; } }; image.onMouseEnter = function() { if(enabled && state === DEFAULT && this.down) { this.src = $this.style.down; } }; image.onMouseExit = function() { if(enabled && state === DEFAULT && this.down) { this.src = $this.style.button; } }; image.onClick = function(e) { var event = e || system.event; if(enabled) { if(!$this.marked && !this.altKey) { $this.click(event); } else if((state === DEFAULT || state === FLAGGED) && this.altKey) { $this.marked = !$this.marked; } } }; frame.appendChild(image); var enabled = true; this.__defineGetter__("enabled", function() { return enabled; }); this.__defineSetter__("enabled", function(value) { enabled = !!value; return value; }); var text = new Text(); text.data = 0; text.size = 10; text.anchorStyle = "topLeft"; text.hOffset = width / 2 + 1; text.vOffset = height / 2 + 1; text.hAlign = "center"; text.vAlign = "center"; text.visible = false; frame.appendChild(text); var state = DEFAULT; this.__defineGetter__("marked", function() { return state === FLAGGED; }); this.__defineSetter__("marked", function(value) { if(!revealed) { state = (value)? FLAGGED : DEFAULT; image.src = this.style[state]; $this.mark(value); } return value; }); var revealed = false; this.reveal = function() { if(!revealed) { revealed = true; if(state === FLAGGED && type !== BOMB) { state = BAD; } else if(state !== FLAGGED && type !== BOOM) { state = (type === BLANK || type === NUMBER)? BLANK : BOMB; } else if(state !== FLAGGED) { state = type; } image.src = this.style[state]; if(type === NUMBER && state !== BAD) text.visible = true; } }; this.__defineGetter__("revealed", function() { return revealed; }); this.reset = function() { type = BLANK; state = DEFAULT; enabled = true; revealed = false; this.number = 0; text.visible = false; image.src = this.style[state]; }; var type = BLANK; this.__defineGetter__("type", function() { return type; }); this.__defineSetter__("type", function(value) { if(!revealed && (value === BLANK || value === NUMBER || value === BOMB || value === BOOM)) { type = value; } return value; }); this.__defineGetter__("number", function() { return Number(text.data); }); this.__defineSetter__("number", function(value) { if(!isNaN(Number(value))) { text.data = value; text.color = this.style[text.data + "color"]; } return value; }); var style = {}; this.__defineGetter__("style", function() { return style; }); this.__defineSetter__("style", function(value) { if(typeof value !== "undefined" && value !== null) { style = value; image.src = this.style[state]; text.color = this.style[text.data + "color"]; } return value; }); } GameButton.BLANK = "blank"; GameButton.NUMBER = "number"; GameButton.BOMB = "bomb"; GameButton.BOOM = "boom"; r lfunction GameGrid(frame, columns, rows, bombs, wrap) { EventAdapter.call(this); var $this = this; var gridFrame = new Frame(); if(frame) frame.appendChild(gridFrame); var style = {}; this.__defineGetter__("style", function() { return style; }); this.__defineSetter__("style", function(value) { if(typeof value !== "undefined" && value !== null) { style = value; if(grid.length) { for(var i = 0; i < grid.length; i++) { grid[i].style = style; } } } return value; }); this.__defineGetter__("wrap", function() { return wrap; }); this.__defineSetter__("wrap", function(value) { wrap = !!value; return value; }); var grid = []; var nrev = {}; var spots = []; var initialized = false; this.initialize = function() { if(!initialized) { var tileWidth = this.style.tilewidth; var tileHeight = this.style.tileheight; var tileHGap = this.style.tilehgap; var tileVGap = this.style.tilevgap; for(var y = 0; y < rows; y++) { for(var x = 0; x < columns; x++) { // FIXME Button creation is SLOW var button = new GameButton(gridFrame, tileWidth, tileHeight, (tileWidth * x) + (tileHGap * x), (tileHeight * y) + (tileVGap * y)); button.x = x; button.y = y; button.style = this.style; button.addEventListener("click", function(event) { $this.click(this.x, this.y, event); }, true); button.addEventListener("mark", function(marked) { $this.mark(this.x, this.y, marked); }, true); grid.push(button); nrev[x + "," + y] = button; spots.push({x: x, y: y, rand: Math.random()}); } } } initialized = true; }; this.__defineGetter__("initialized", function() { return initialized; }); function sort(a, b) { return a.rand - b.rand; } function incr(x, y) { if(wrap) { // TODO should corners wrap diagonally to diagonally opposite corner? if(x < 0 && y >= 0 && y < rows) x = columns - 1; if(y < 0 && x >= 0 && x < columns ) y = rows - 1; if(x >= columns && y >= 0 && y < rows) x = 0; if(y >= rows && x >= 0 && x < columns ) y = 0; } if(x >= 0 && x < columns && y >= 0 && y < rows) { var button = grid[y * columns + x]; if(button && button.type !== GameButton.BOMB) { button.type = GameButton.NUMBER; button.number++; } } } var setup = false; this.setupBombs = function(x, y) { if(!initialized) this.initialize(); spots.sort(sort); var tbombs = bombs; for(var i = 0; i < tbombs; i++) { var sx = spots[i].x; var sy = spots[i].y; if(!(sx === x && sy === y)) { grid[sy * columns + sx].type = GameButton.BOMB; incr(sx - 1, sy - 1); incr(sx , sy - 1); incr(sx + 1, sy - 1); incr(sx - 1, sy ); incr(sx + 1, sy ); incr(sx - 1, sy + 1); incr(sx , sy + 1); incr(sx + 1, sy + 1); } else { tbombs++; } } setup = true; }; this.__defineGetter__("setup", function() { return setup; }); this.isMarked = function(x, y) { return grid[y * columns + x] && grid[y * columns + x].marked; }; this.isBomb = function(x, y) { return grid[y * columns + x] && grid[y * columns + x].type === GameButton.BOMB; }; this.valueAt = function(x, y) { return (grid[y * columns + x])? grid[y * columns + x].number : 0; }; function revealInternal(x, y) { if(wrap || (x >= 0 && x < columns && y >= 0 && y < rows)) { var button = grid[y * columns + x]; if(button && !button.revealed && !button.marked) { var queue = [button]; var count = 0; for(var i = 0; i < queue.length; i++) { var button = queue[i]; if(!button.revealed && !button.marked) { count++; button.reveal(); delete nrev[button.x + "," + button.y]; if(button.type !== GameButton.NUMBER) { if(button.x > 0) { var btn = grid[button.y * columns + (button.x - 1)]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } if(button.x < columns - 1) { var btn = grid[button.y * columns + (button.x + 1)]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } if(button.y > 0) { var btn = grid[(button.y - 1) * columns + button.x]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } if(button.y < rows - 1) { var btn = grid[(button.y + 1) * columns + button.x]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } // Under straight flood-fill algorithms, diagonals would "leak" // However, numbers aren't processed beyond revealing themselves if(button.y > 0 && button.x < columns - 1) { var btn = grid[(button.y - 1) * columns + (button.x + 1)]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } if(button.y > 0 && button.x > 0) { var btn = grid[(button.y - 1) * columns + (button.x - 1)]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } if(button.x > 0 && button.y < rows - 1) { var btn = grid[(button.y + 1) * columns + (button.x - 1)]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } if(button.x < columns - 1 && button.y < rows - 1) { var btn = grid[(button.y + 1) * columns + (button.x + 1)]; if(btn.type !== GameButton.BOMB && !btn.revealed) { queue.push(btn); } } } } } return count; } } return 0; } this.reveal = function(x, y) { var button = grid[y * columns + x]; if(button && !button.revealed) { if(button.type === GameButton.BOMB) { this.lose(); button.type = GameButton.BOOM; button.reveal(); delete nrev[button.x + "," + button.y]; return this.revealAll(true) + 1; } else if(button.type === GameButton.NUMBER) { button.reveal(); delete nrev[button.x + "," + button.y]; return 1; } else { return revealInternal(x, y); } } return 0; }; this.revealAll = function(lose) { var count = 0; for(var i in nrev) { count++; if(!lose) nrev[i].marked = true; if(nrev[i].type === GameButton.BOMB || nrev[i].marked) { nrev[i].reveal(); } nrev[i].enabled = false; } nrev = {}; return count; }; this.reset = function() { for(var i = 0; i < grid.length; i++) { grid[i].reset(); spots[i].rand = Math.random(); nrev[grid[i].x + "," + grid[i].y] = grid[i]; } setup = false; }; this.dispose = function() { if(frame) { gridFrame.visible = false; frame.removeChild(gridFrame); } }; } _#?#.function GameWindow(titleText, columns, rows, lastBombs, wrap, winMsgs, sadMsgs) { DecoratedWindow.call(this); var $this = this; this.title = titleText; lastBombs = lastBombs || 10; var menu = (function() { var menu = []; var start = 0; var end = 0; var wrapBoard = null; var level = ""; function check(item) { for(var i = start; i <= end; i++) { if(menu[i].checked = menu[i] === item) { level = menu[i].title; } } } var i = 0; menu[i] = new MenuItem(); menu[i].title = "Version " + widget.version; menu[i++].enabled = false; menu[i] = new MenuItem(); menu[i++].title = "-"; menu[i] = new MenuItem(); menu[i].title = "Instructions..."; menu[i++].onSelect = function() { $this.instructions(); }; menu[i] = new MenuItem(); menu[i].title = "New Game"; menu[i++].onSelect = function() { $this.newGame(); }; menu[i] = new MenuItem(); menu[i++].title = "-"; menu[start = i] = new MenuItem(); menu[i].title = "Beginner"; if(menu[i].checked = columns === 9 && rows === 9 && lastBombs === 10) level = menu[i].title; menu[i++].onSelect = function() { check(this); $this.newGame(9, 9, 10); }; menu[i] = new MenuItem(); menu[i].title = "Intermediate"; if(menu[i].checked = columns === 16 && rows === 16 && lastBombs === 40) level = menu[i].title; menu[i++].onSelect = function() { check(this); $this.newGame(16, 16, 40); }; menu[i] = new MenuItem(); menu[i].title = "Advanced"; if(menu[i].checked = columns === 30 && rows === 16 && lastBombs === 99) level = menu[i].title; menu[i++].onSelect = function() { check(this); $this.newGame(30, 16, 99); }; menu[i] = new MenuItem(); menu[i].title = "Insane"; if(menu[i].checked = columns === 30 && rows === 24 && lastBombs === 300) level = menu[i].title; menu[i++].onSelect = function() { check(this); $this.newGame(30, 24, 300); }; menu[end = i] = new MenuItem(); menu[i].title = "Custom..."; menu[i].checked = (function() { for(var i in menu) { if(menu[i].checked) return false; } return true; })(); menu[i++].onSelect = function() { check(this); $this.customSetup(); }; menu[i] = new MenuItem(); menu[i++].title = "-"; menu[i] = wrapBoard = new MenuItem(); menu[i].title = "Wrap Board"; menu[i].checked = wrap; menu[i++].onSelect = function() { this.checked = wrap = !this.checked; $this.newGame(); }; menu[i] = new MenuItem(); menu[i++].title = "-"; menu[i] = new MenuItem(); menu[i].title = "Best Times..."; menu[i++].onSelect = function() { $this.bestTimes(); }; menu[i] = new MenuItem(); menu[i].title = "Themes..."; menu[i++].onSelect = function() { $this.themeSetup(); }; return { menuItems: menu, shouldWrapBoard: function() { return wrapBoard.checked; }, getLevel: function() { return level; } }; })(); this.menu = menu.menuItems; var bombs = new Text(); bombs.number = 10; bombs.data = "10 bombs"; bombs.size = 11; bombs.anchorStyle = "topLeft"; bombs.hOffset = 17; bombs.vOffset = 33 - 7; this.add(bombs); var time = new Text(); time.data = "00:00:00"; time.size = 11; time.anchorStyle = "topLeft"; time.vOffset = bombs.vOffset; this.add(time); var frame = new Frame(); frame.hOffset = 17; frame.vOffset = 44; this.add(frame); var elapsed = 0; var timer = new Timer(); timer.interval = 1; timer.onTimerFired = function() { elapsed++; var hours = Math.floor(elapsed / 3600); var minutes = Math.floor(elapsed / 60); var seconds = Math.floor(elapsed - (hours * 3600) - (minutes * 60)); if(hours < 10) hours = "0" + hours; if(minutes < 10) minutes = "0" + minutes; if(seconds < 10) seconds = "0" + seconds; time.data = hours + ":" + minutes + ":" + seconds; }; var grid = null; var defused = 0; var unclicked = 0; this.newGame = function(w, h, b) { elapsed = 0; timer.ticking = false; time.data = "00:00:00"; defused = 0; this.title = titleText; if(grid && ((!w && !h && !b) || (w === columns && h === rows && b === lastBombs))) { unclicked = columns * rows; bombs.number = lastBombs; bombs.data = lastBombs + " bombs"; grid.wrap = menu.shouldWrapBoard(); grid.reset(); } else { if(grid) { columns = w; rows = h; lastBombs = b; } unclicked = columns * rows; bombs.number = lastBombs; bombs.data = lastBombs + " bombs"; /// FIXME this is ugly, button creation should be faster suppressUpdates(); if(grid) grid.dispose(); grid = new GameGrid(frame, columns, rows, lastBombs, wrap); grid.style = $this.style; grid.addEventListener("click", function(x, y, event) { if(!this.setup) { this.setupBombs(x, y); timer.ticking = true; } var count = 0; if(event.shiftKey) { count = Number(this.isMarked(x - 1, y - 1)) + Number(this.isMarked(x, y - 1)) + Number(this.isMarked(x + 1, y - 1)) + Number(this.isMarked(x - 1, y )) + Number(this.isMarked(x + 1, y )) + Number(this.isMarked(x - 1, y + 1)) + Number(this.isMarked(x, y + 1)) + Number(this.isMarked(x + 1, y + 1)); if(count === 0) return; } if(event.shiftKey && count === this.valueAt(x, y)) { if(!this.isMarked(x - 1, y - 1)) unclicked -= grid.reveal(x - 1, y - 1); if(!this.isMarked(x, y - 1)) unclicked -= grid.reveal(x, y - 1); if(!this.isMarked(x + 1, y - 1)) unclicked -= grid.reveal(x + 1, y - 1); if(!this.isMarked(x - 1, y )) unclicked -= grid.reveal(x - 1, y ); if(!this.isMarked(x + 1, y )) unclicked -= grid.reveal(x + 1, y ); if(!this.isMarked(x - 1, y + 1)) unclicked -= grid.reveal(x - 1, y + 1); if(!this.isMarked(x, y + 1)) unclicked -= grid.reveal(x, y + 1); if(!this.isMarked(x - 1, y + 1)) unclicked -= grid.reveal(x + 1, y + 1); } else { unclicked -= grid.reveal(x, y); if(unclicked === lastBombs || (defused > 0 && unclicked + defused === lastBombs)) { this.win(); this.revealAll(); } else if(unclicked === 0 && defused === lastBombs) { this.win(); this.revealAll(); } } }, true); grid.addEventListener("mark", function(x, y, v) { bombs.data = ((v)? --bombs.number : ++bombs.number) + " bombs"; if(this.isBomb(x, y)) { defused += (v)? 1 : -1; } }, true); grid.addEventListener("win", function() { if(timer.ticking) { if(!winMsgs || winMsgs.length === 0) { $this.title.data = "Win"; } else { $this.title = winMsgs[Math.floor(Math.random() * winMsgs.length)]; } timer.ticking = false; $this.win(); } }, true); grid.addEventListener("lose", function() { if(timer.ticking) { if(!sadMsgs || sadMsgs.length === 0) { $this.title = "Lose"; } else { $this.title = sadMsgs[Math.floor(Math.random() * sadMsgs.length)]; } timer.ticking = false; } }, true); grid.initialize(); this.restyle(); // See above suppress resumeUpdates(); } }; this.addEventListener("restyle", function() { var tileWidth = this.style.tilewidth; var tileHeight = this.style.tileheight; var tileHGap = this.style.tilehgap; var tileVGap = this.style.tilevgap; var minWidth = (tileWidth * columns) + (tileHGap * (columns - 1)); var minHeight = (tileHeight * rows ) + (tileVGap * (rows - 1)); this.width = 34 + minWidth; this.height = 61 + minHeight; frame.width = minWidth; frame.height = minHeight; time.color = this.style.labelcolor; if(this.style.labelshadow) { time.style.KonShadow = "0px 1px " + this.style.labelshadow; } bombs.color = this.style.labelcolor; if(this.style.labelshadow) { bombs.style.KonShadow = "0px 1px " + this.style.labelshadow; } time.hOffset = frame.hOffset + frame.width - time.width; if(!grid) { this.newGame(); } else { grid.style = this.style; } }, true); this.addEventListener("close", function() { closeWidget(); }, true); this.addEventListener("title", function() { this.newGame(); }, true); this.__defineGetter__("elapsed", function() { return elapsed; }); this.__defineGetter__("level", function() { return menu.getLevel(); }); this.__defineGetter__("columns", function() { return columns; }); this.__defineGetter__("rows", function() { return rows; }); this.__defineGetter__("bombs", function() { return lastBombs; }); this.__defineGetter__("wrap", function() { return wrap; }); this.__defineGetter__("title", function() { return titleText; }); this.winMsgs = winMsgs; this.sadMsgs = sadMsgs; } 4 function ImageButton(frame, styleName, tooltip) { EventAdapter.call(this); var $this = this; var button = new Image(); if(tooltip) button.tooltip = tooltip; button.onMouseDown = function() { this.src = $this.style[styleName + "btndown"]; this.down = true; }; button.onMouseUp = function() { this.src = $this.style[styleName + "btnup"]; this.down = false; }; button.onMouseExit = function() { this.src = $this.style[styleName + "btnup"]; }; button.onMouseEnter = function() { if(this.down) { this.src = $this.style[styleName + "btndown"]; } else { this.src = $this.style[styleName + "btnover"]; } }; button.onClick = function() { $this.click(); }; if(frame) frame.appendChild(button); this.__defineGetter__("width", function() { return button.width; }); this.__defineGetter__("height", function() { return button.height; }); this.__defineGetter__("hOffset", function() { return button.hOffset; }); this.__defineSetter__("hOffset", function(value) { if(!isNaN(Number(value))) { button.hOffset = value; } return value; }); this.__defineGetter__("vOffset", function() { return button.vOffset; }); this.__defineSetter__("vOffset", function(value) { if(!isNaN(Number(value))) { button.vOffset = value; } return value; }); var style = {}; this.__defineGetter__("style", function() { return style; }); this.__defineSetter__("style", function(value) { if(typeof value !== "undefined" && value !== null) { style = value; button.src = (button.down)? this.style[styleName + "btndown"] : this.style[styleName + "btnup"]; } return value; }); } C./* -- ExtTimer aka Extended Timer -- -- Copyright 2009, A.McBain Redistribution and use, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- While this software is released "as is", that doesn't mean I won't mind getting bug reports. */ /* * An extended Timer class to several features. * * The first is "fire once", which means the timer * will always do the onTimerFired specified action * at least once. * * The second is a bit more complicated. The * property "interval count" sets the number of * times the timer must be fired before it calls a * separate function, onIntervalFired, to perform * an action. This can be used to decrease the * timer's interval, for example. An interval-count * value of zero is special, it disables the feature. * *** * * Fire-once is on by default, interval-count is off * by default. * */ function ExtTimer() { var $this = this; var timer = new Timer(); timer.onTimerFired = function() { fired = true; if($this.onTimerFired instanceof Function) { $this.onTimerFired(); } if(intervalCount !== 0) { var pcount = count; count = (count + 1) % intervalCount; if(count < pcount && $this.onIntervalFired instanceof Function) { $this.onIntervalFired(); } } }; this.__defineGetter__("interval", function() { return timer.interval; }); this.__defineSetter__("interval", function(value) { if(!isNaN(Number(value))) { timer.interval = Number(value); } return value; }); this.__defineGetter__("ticking", function() { return timer.ticking; }); this.__defineSetter__("ticking", function(value) { if(value instanceof Boolean || typeof value === "boolean") { if(!(timer.ticking = value) && !fired && fireOnce) { this.onTimerFired(); } fired = false; } return value; }); var fired = false; var fireOnce = true; this.__defineGetter__("fireOnce", function() { return fireOnce; }); this.__defineSetter__("fireOnce", function(value) { if(value instanceof Boolean || typeof value === "boolean") { fireOnce = value; } return value; }); var count = 0; var intervalCount = 0; this.__defineGetter__("intervalCount", function() { return intervalCount; }); this.__defineSetter__("intervalCount", function(value) { if(!isNaN(Number(value))) { intervalCount = Number(value); if(intervalCount < 0) throw new Error("ExtTimer::intervalCount must be a positive number!"); count = 0; } return value; }); } %%bi4/* * /////////////////// * // PUBLIC DOMAIN // * /////////////////// * Author: A.McBain * * * This is a very simplistic implementation of the properties file format. * It should be minimally compatible with the Java properties implementation. * All comments are ignored on reading a properties file, and comments are * not saved when a map is written to a file. This implementation properly * escapes output before writing to a file and unescapes input from a file. * Therefore it is not necessary to do so by hand before giving data to this * implementation. * * Example usage: * * // Writing * var props = { * names: ["john","linda","bob"] * }; * Properties.write("path/to/file.properties", props); * * // Reading * var props = Properties.read("path/to/file.properties"); * props.names = props.names.split(","); * * // Reading with defaults (if a property is not found in the file, the * // default value is returned instead) * var props = { * names: ["john","linda","bob"] * foo: bar * }; * props = Properties.read("path/to/file.properties", props); * * Some may prefer not to have the defaults stored in the returned * properties object (as that same object may later be saved back out to * a file and they may prefer not to save defaults in the file). In which * case there are shown two (of possibly several) solutions below: * * False/Undefined check: * * var props = Properties.read("path/to/file.properties"); * var value = props.foo || "bar"; * * (This will return the default if the property foo evaluates to false, * so the following is preferred: * * var value = (typeof props.foo === "undefined)? "bar" : props.foo; * ) * * Wrapper: * * var props = Properties.wrap(Properties.read("path/to/file.properties")); * var value = props.get("foo", "bar"); * * (This will destroy any property named "get", so the previous method should * be used if a property name of "get" must be used) * * --- * * The following only needs to be read and understood by anyone changing the * implementation in this file or writing their own. The following tests may * be run by calling Properties.test(); and checking the output in the debug * window. * * --- * * Example properties file: * * # this is a comment * ! this is also a comment * key=value * key2=value that has\ * multiple\ * line breaks in it * \#key=value for a key with a pound sign * key\!=value for a key with an exclamation point * \=key=value with a \# symbol for a key with an equals sign * * The following is invalid properties syntax. However most properties * implementations will read it correctly, depending on their design. * * key#=a key with a pound sign * key=a value with a # symbol * k!ey=a key with punctation * key=a value with a ! symbol * * (All of the above relates to improperly escaping values) * * The following is broken properties syntax which will most likely be read * wrong by any properties implementation. * * =key=should result in a value with an empty key * #key=is a comment * !key=also a comment * key=value that has * multiple * line breaks in it * * (this implementation will add lines without an = in them to the previous * key's value, assuming the previous item was a key, and not a comment. This * is due to the problem that most who edit a properties file may not know a * backslash is required to indicate multiline values. Just ignoring the * extra lines is also an option, however, this means any line without an * equals is now equivalent to a comment) * * Multiline keys are also bad syntax, and will also be read incorrectly by * this implementation. As such, line breaks from keys are removed when * writing an object out to a file. * * akey=avalue * multi * line * key=another value * key2=value * with line breaks and a * # symbol in the * middle * * (the last key's value could be made correct by escaping the # symbol) * */ const Properties = { escape: function(value) { var windows = system.platform === "windows"; return (value + "").replace(/\\/g, "\\\\").replace(/!/g, "\\!").replace(/#/g, "\\#").replace(/=/g, "\\=").replace(/\n/g, (windows)? "\\\r\n" : "\\\n"); }, unescape: function(value) { var windows = system.platform === "windows"; return (value + "").replace((windows)? /\\\r\n/g : /\\\n/g, "\n").replace(/\\=/g, "=").replace(/\\#/g, "#").replace(/\\!/g, "!").replace(/\\\\/g, "\\"); }, stripEndings: function(value) { return value.replace("\n", "").replace("\r",""); }, read: function(path, defaults) { var lines = filesystem.readFile(path, true); if(!lines) throw "Properties.read: file '" + path + "' does not exist or is not readable"; if(!defaults) defaults = {}; var map = {}; var pkey = ""; for(var i = 0; i < lines.length; i++) { var line = lines[i]; if((line.indexOf("#") === -1 || line.indexOf("#") > 0) && (line.indexOf("!") === -1 || line.indexOf("!") > 0)) { if(line.charAt(0) !== "=") { var index = 0; while(index !== -1 && line.charAt((index = line.indexOf("=", index + 1)) - 1) === "\\"); if(index !== -1) { var key = pkey = line.substring(0, index); var value = line.substring(index + 1); map[Properties.unescape(key)] = Properties.unescape(value); } else if(pkey !== "") { map[pkey] = map[pkey].replace(/\\$/, "") + "\n" + line; } } else { map[""] = line.substring(1); } } else { pkey = ""; } } for(var i in defaults) { if(!map[i]) { map[i] = defaults[i]; } } return map; }, write: function(path, map, comment) { var output = ["# " + (new Date()), "# " + ((typeof comment === "undefined")? "" : comment)]; for(var i in map) { output.push(Properties.stripEndings(Properties.escape(i)) + "=" + Properties.escape(map[i])); } filesystem.writeFile(path, output); }, wrap: function(value) { value.get = function(prop, defaultValue) { return (prop in this)? this[prop] : defaultValue; }; return value; }, test: function() { // First implementation test var output = []; output.push("# this is a comment"); output.push("! this is also a comment"); output.push("key=value"); output.push("key2=value that has\\"); output.push("multiple\\"); output.push("line breaks in it"); output.push("\\#key=value for a key with a pound sign"); output.push("key\\!=value for a key with an exclamation point"); output.push("\\=key=value with a \\# symbol for a key with an equals sign"); filesystem.writeFile(system.widgetDataFolder + "/test1.properties", output); print(); print("Standard Implementation Test"); _dump(Properties.read(system.widgetDataFolder + "/test1.properties")); // First implementation test with defaults print(); print("Standard Implementation Test w/ Defaults"); _dump(Properties.read(system.widgetDataFolder + "/test1.properties", { foo: "bar" })); // First implementation test with defaults, wrapper method print(); print("Standard Implementation Test w/ Defaults, Wrapper Method"); var props = Properties.read(system.widgetDataFolder + "/test1.properties"); _dump(props); props = Properties.wrap(props); print(" foo: " + props.get("foo", "bar")); // Second implementation test Properties.write(system.widgetDataFolder + "/test2.properties", { "key#": "a key with a pound sign", "key": "a value with a # symbol", "k!ey": "a key with punctation", "key2": "value that has\nmultiple\nline breaks in it", }); print(); print("Lax Implementation Test"); _dump(Properties.read(system.widgetDataFolder + "/test2.properties")); // First bad input test output = []; output.push("=key=should result in a value with an empty key"); output.push("#key=is a comment"); output.push("!key=also a comment"); output.push("key=value that has"); output.push("multiple"); output.push("line breaks in it"); filesystem.writeFile(system.widgetDataFolder + "/test1b.properties", output); print(); print("Bad Input Test"); _dump(Properties.read(system.widgetDataFolder + "/test1b.properties")); // Second bad input test output = []; output.push("akey=avalue"); output.push("multi"); output.push("line"); output.push("key=another value"); filesystem.writeFile(system.widgetDataFolder + "/test2b.properties", output); print(); print("Bad Input Test 2"); _dump(Properties.read(system.widgetDataFolder + "/test2b.properties")); // Third bad input test output = []; output.push("multi"); output.push("line"); output.push("key=another value"); filesystem.writeFile(system.widgetDataFolder + "/test3b.properties", output); print(); print("Bad Input Test 3"); _dump(Properties.read(system.widgetDataFolder + "/test3b.properties")); // Fourth bad input test output = []; output.push("key2=value"); output.push("with line breaks and a"); output.push("# symbol in the"); output.push("middle"); output.push("loon=bird"); filesystem.writeFile(system.widgetDataFolder + "/test4b.properties", output); print(); print("Bad Input Test 4"); _dump(Properties.read(system.widgetDataFolder + "/test4b.properties")); } }; O/mC/* * PUBLIC DOMAIN * Author: Laurent Cozic, 2008 */ TextArea.prototype.getSelectedText = function() { var uniqueString = "00ee0a50-105f-11dc-9622-0090F5401186"; // For optimization, it could be set once as a global variable var initialText = this.data; if (initialText == "") return ""; this.replaceSelection(uniqueString); var si = this.data.indexOf(uniqueString); var ei = initialText.length - (this.data.length - (si + uniqueString.length)); var output = initialText.substring(si, ei); this.data = initialText; this.select(si, ei); return output; }; TextArea.prototype.getSelectionRange = function() { var uniqueString = "00ee0a50-105f-11dc-9622-0090F5401186"; var initialText = this.data; if (initialText == "") return [0,0]; this.replaceSelection(uniqueString); var si = this.data.indexOf(uniqueString); var ei = initialText.length - (this.data.length - (si + uniqueString.length)); this.data = initialText; this.select(si, ei); return [si, ei]; }; ?bifunction List(window) { EventAdapter.call(this); var $this = this; var frame = new Frame(); if(window) window.appendChild(frame); this.__defineGetter__("width", function() { return frame.width; }); this.__defineSetter__("width", function(value) { if(!isNaN(Number(value))) { frame.width = value; $this.restyle(); } return value; }); this.__defineGetter__("height", function() { return frame.height; }); this.__defineSetter__("height", function(value) { if(!isNaN(Number(value))) { frame.height = value; $this.restyle(); } return value; }); this.__defineGetter__("hOffset", function() { return frame.hOffset; }); this.__defineSetter__("hOffset", function(value) { if(!isNaN(Number(value))) { frame.hOffset = value; } return value; }); this.__defineGetter__("vOffset", function() { return frame.vOffset; }); this.__defineSetter__("vOffset", function(value) { if(!isNaN(Number(value))) { frame.vOffset = value; } return value; }); var border = new BackgroundCanvas(); frame.appendChild(border.canvas); var iborder = new BackgroundCanvas(); iborder.hOffset = 1; iborder.vOffset = 1; frame.appendChild(iborder.canvas); var sframe = new Frame(); sframe.hOffset = 1; sframe.vOffset = 1; frame.appendChild(sframe); var vScroller = new ButtonScrollBar(frame, sframe, "vertical", 1, 1); var hScroller = new ButtonScrollBar(frame, sframe, "horizontal", 1, 1); var items = []; var softSelectedIndex = -1; var softSelected = null; var selectedIndex = -1; var selected = null; var maxWidth = 0; this.addItem = function(value) { var text = new Text(); text.size = 12; text.data = " " + value; text.color = this.style.textcolor; text.bgOpacity = 255; text.bgColor = this.style.backgroundcolor; text.anchorStyle = "topLeft"; text.vOffset = items.length * text.height; text.onClick = function() { if(this !== selected) { if(selected) { selected.bgOpacity = 255; selected.bgColor = (selected === softSelected)? $this.style.softselectioncolor : $this.style.backgroundcolor; } selected = this; selected.bgOpacity = 255; selected.bgColor = $this.style.selectioncolor; selectedIndex = this.index; $this.selectionChanged(); } }; text.index = items.length; text._width = text.width; maxWidth = Math.max(text.width, maxWidth); text.width = Math.max(sframe.width, maxWidth); sframe.appendChild(text); items.push(text); }; this.removeItem = function(value) { value = " " + value; for(var i = 0; i < items.length; i++) { var item = items[i]; if(item.data === value) { if(item === selected) { selectedIndex = -1; selected = null; } if(item === softSelected) { softSelectedIndex = -1; softSelected = null; } var offset = item.vOffset; var max = item.width === maxWidth; sframe.removeChild(item); items = items.slice(0, i).concat(items.slice(i + 1)); for(var j = i; j < items.length; j++) { items[j].vOffset = j * items[j].height; } if(max) { maxWidth = 0; for(var j = 0; j < items.length; j++) { item[j].index--; maxWidth = Math.max(items[j]._width, maxWidth); } $this.restyle(); } return; } } }; this.__defineGetter__("selectedIndex", function() { return selectedIndex; }); this.__defineSetter__("selectedIndex", function(value) { var number = Number(value); if(!isNaN(number)) { if(number < 0 || number >= items.length) throw "List.selectedIndex: index out of bounds"; if(selected !== selected) { selected.bgOpacity = 255; selected.bgColor = this.style.backgroundcolor; } selected = items[number]; selected.bgOpacity = 255; selected.bgColor = this.style.selectioncolor; selectedIndex = number; } return value; }); this.__defineGetter__("selectedItem", function() { return (selected)? selected.data.substring(1) : null; }); this.__defineSetter__("selectedItem", function(value) { if(selected) { selected.bgOpacity = 255; selected.bgColor = this.style.backgroundcolor; } if(value !== null && typeof value !== "undefined") { var val = " " + value; for(var i = 0; i < items.length; i++) { if(items[i].data === val) { selected = items[i]; selected.bgOpacity = 255; selected.bgColor = this.style.selectioncolor; return value; } } } else { selectedIndex = -1; selected = null; } return value; }); this.__defineGetter__("softSelectedIndex", function() { return softSelectedIndex; }); this.__defineSetter__("softSelectedIndex", function(value) { var number = Number(value); if(!isNaN(number)) { if(number < 0 || number >= items.length) throw "List.softSelectedIndex: index out of bounds"; if(softSelected !== selected) { softSelected.bgOpacity = 255; softSelected.bgColor = this.style.backgroundcolor; } softSelected = items[number]; softSelected.bgOpacity = 255; softSelected.bgColor = this.style.softselectioncolor; softSelectedIndex = number; } return value; }); this.__defineGetter__("softSelectedItem", function() { return (softSelected)? softSelected.data.substring(1) : null; }); this.__defineSetter__("softSelectedItem", function(value) { if(softSelected) { softSelected.bgOpacity = 255; softSelected.bgColor = this.style.backgroundcolor; } if(value !== null && typeof value !== "undefined") { var val = " " + value; for(var i = 0; i < items.length; i++) { if(items[i].data === val) { softSelected = items[i]; if(softSelected !== selected) { softSelected.bgOpacity = 255; softSelected.bgColor = this.style.softselectioncolor; } return value; } } } else { softSelectedIndex = -1; softSelected = null; } return value; }); this.__defineGetter__("length", function() { return items.length; }); this.getItems = function() { var itms = []; for(var i = 0; i < items.length; i++) { itms.push(items[i].data.substring(1)); } return itms; }; var style = {}; this.__defineGetter__("style", function() { return style; }); this.__defineSetter__("style", function(value) { if(typeof value !== "undefined" && value !== null) { style = value; $this.restyle(); } return value; }); this.addEventListener("restyle", function() { hScroller.style = this.style; vScroller.style = this.style; hScroller.vOffset = frame.height - hScroller.height; vScroller.hOffset = frame.width - vScroller.width; sframe.width = vScroller.hOffset - 3; sframe.height = hScroller.vOffset - 3; var width = Math.max(sframe.width, maxWidth); for(var i = 0; i < items.length; i++) { items[i].color = this.style.textcolor; items[i].bgOpacity = 255; items[i].bgColor = (items[i] === selected)? this.style.selectioncolor : (items[i] === softSelected)? this.style.softselectioncolor : this.style.backgroundcolor; items[i].width = width; } hScroller.width = sframe.width + 2; vScroller.height = sframe.height + 2; border.width = sframe.width + 2; border.height = sframe.height + 2; border.borderWidth = 1 / border.width * 100; border.borderHeight = 1 / border.height * 100; border.bgColor = this.style.inputborder; iborder.width = border.width - 2; iborder.height = border.height - 2; iborder.bgColor = this.style.backgroundcolor; }, true); } .Y.m/** * This widget structure was automatically * generated by Hunter Ryba's 'Structure' * widget on 2009-08-20T16:34:00Z. * * Developers, please feel free to remove * this header. It does not need to be * kept for any reason. */ widget.setDockItem(XMLDOM.parse(filesystem.readFile("dock.xml"))); include("Resources/Scripts/lib/ExtTimer.js"); include("Resources/Scripts/lib/TextArea Utils.js"); include("Resources/Scripts/lib/Properties.js"); include("Resources/Scripts/BackgroundCanvas.js"); include("Resources/Scripts/ButtonScrollBar.js"); include("Resources/Scripts/ImageButton.js"); include("Resources/Scripts/List.js"); include("Resources/Scripts/EventAdapter.js"); include("Resources/Scripts/DecoratedWindow.js"); include("Resources/Scripts/GameButton.js"); include("Resources/Scripts/GameGrid.js"); include("Resources/Scripts/GameWindow.js"); include("Resources/Scripts/BestTimesWindow.js"); include("Resources/Scripts/CustomSetupWindow.js"); include("Resources/Scripts/ThemeWindow.js"); include("Resources/Scripts/Dialog.js"); var dataPath = system.widgetDataFolder + "/bombsquad.properties"; var timePath = system.widgetDataFolder + "/bombsquad-times.properties"; var themePath = system.widgetDataFolder + "/themes/"; var defaultThemes = ["Matte", "Black Crystal"]; var defaultThemePath = themePath + "Matte/"; // Setup themes (function() { if(!filesystem.itemExists(themePath)) { filesystem.createDirectory(themePath); } for(var i = 0; i < defaultThemes.length; i++) { var theme = defaultThemes[i] + ".zip"; if(!filesystem.itemExists(themePath + theme)) { widget.extractFile("Resources/Themes/" + theme); filesystem.move(system.widgetDataFolder + "/" + theme, themePath); } if(!filesystem.itemExists(themePath + theme.substring(0, theme.length - 3) + "/Theme.properties")) { filesystem.unzip(themePath + theme, themePath); } } })(); // Set up properties var firstRun = !filesystem.itemExists(dataPath); var props = (function() { var defaults = { winmsgs: "Rad,Gnarly,Boss,Awesome,Sweet,Victory,Success,Cool,K.O.!,: )", sadmsgs: "Bummer,Awkward,Sorry,Try Again,Fail,Boom,: (", maintitle: "BombSquad", timetitle: "Best Times", custtitle: "Custom Game", themetitle: "Themes", themes: defaultThemes.join(","), theme: "Matte" }; return (!firstRun)? Properties.read(dataPath, defaults) : defaults; })(); props.themes = props.themes.split(","); props.wrap = (props.wrap === "true")? true : false; props.columns = Number(props.columns) || 9; props.rows = Number(props.rows) || 9; // The code will work with grids down to 2x2, but 5x4 (and 4x5) is the smallest board // which still calcuates a default minimum of 10 bombs. The max size of 30x24 was to // avoid the "too much recursion" error caused by the original (recursive) solution // when run on larger boards. props.columns = Math.min(30, Math.max(5, props.columns)); props.rows = Math.min(24, Math.max(4, props.rows)); props.bombs = Math.min((props.columns - 1) * (props.rows - 1), Math.max(10, Number(props.bombs) || 10)); if(!filesystem.itemExists(themePath + props.theme + "/Theme.properties")) { props.theme = "Matte"; } function readTheme(theme) { // Yay! My guessing game as to what properties are images and what are not, instead of listing them all :P var exts = { ".png": 1, ".jpg": 1, "jpeg": 1, ".tif": 1, "tiff": 1, ".bmp": 1, ".gif": 1 }; // Defaults in case a theme's properties file is incomplete var themeProps = Properties.read(themePath + theme + "/Theme.properties", { "titlecolor": "#222222", "titleshadow": "#ebebeb", "labelcolor": "#2282af", "labelshadow": "#ebebeb", "textcolor": "black", "selectioncolor": "#2282af", "prevselectioncolor": "#e0e0e0", "backgroundcolor": "white", "inputborder": "gray", "inputborderfocus": "black", "okaybtnover": defaultThemePath + "OKBtn/ok_over.png", "okaybtnup": defaultThemePath + "OKBtn/ok_inactive.png", "okaybtndown": defaultThemePath + "OKBtn/ok_down.png", "refreshbtnover": defaultThemePath + "RefreshBtn/refresh_over.png", "refreshbtnup": defaultThemePath + "RefreshBtn/refresh_inactive.png", "refreshbtndown": defaultThemePath + "RefreshBtn/refresh_down.png", "addbtnover": defaultThemePath + "AddBtn/add_over.png", "addbtnup": defaultThemePath + "AddBtn/add_inactive.png", "addbtndown": defaultThemePath + "AddBtn/add_down.png", "removebtnover": defaultThemePath + "RemoveBtn/remove_over.png", "removebtnup": defaultThemePath + "RemoveBtn/remove_inactive.png", "removebtndown": defaultThemePath + "RemoveBtn/remove_down.png", "scrollbtnup": defaultThemePath + "Scroll/scroll_03.png", "scrollbtndown": defaultThemePath + "Scroll/scroll_12.png", "scrolltrackendtop": defaultThemePath + "Scroll/scroll_10.png", "scrolltrackendbot": defaultThemePath + "Scroll/scroll_10.png", "scrolltrackmid": defaultThemePath + "Scroll/scroll_08.png", "scrollthumb": defaultThemePath + "Scroll/scroll_06.png", "topleftimg": defaultThemePath + "Board/top_left.png", "topcenterimg": defaultThemePath + "Board/top_center.png", "toprightimg": defaultThemePath + "Board/top_right.png", "centerleftimg": defaultThemePath + "Board/center_left.png", "centerimg": defaultThemePath + "Board/center.png", "centerrightimg": defaultThemePath + "Board/center_right.png", "bottomleftimg": defaultThemePath + "Board/bottom_left.png", "bottomcenterimg": defaultThemePath + "Board/bottom_center.png", "bottomrightimg": defaultThemePath + "Board/bottom_right.png", "closeimg": defaultThemePath + "Board/close.png", "tilewidth": 16, "tileheight": 16, "tilehgap": 2, "tilevgap": 2, "button": defaultThemePath + "Tiles/inactive.png", "flagged": defaultThemePath + "Tiles/pennant.png", "down": defaultThemePath + "Tiles/down.png", "blank": defaultThemePath + "Tiles/blank.png", "bomb": defaultThemePath + "Tiles/bomb.png", "boom": defaultThemePath + "Tiles/boom.png", "bad": defaultThemePath + "Tiles/bad.png", "1color": "blue", "2color": "rgb(0, 128, 0)", "3color": "red", "4color": "rgb(0, 0, 128)", "5color": "rgb(128, 0, 0)", "6color": "rgb(96, 96, 219)", "7color": "black", "8color": "rgb(96, 96, 96)" }); for(var i in themeProps) { var prop = themeProps[i]; if(exts[prop.substring(prop.length - 4)]) { themeProps[i] = themePath + theme + "/" + prop; } } return themeProps; } var window = new GameWindow(props.maintitle, props.columns, props.rows, props.bombs, props.wrap, props.winmsgs.split(","), props.sadmsgs.split(",")); window.style = readTheme(props.theme); var times = (function() { if(!filesystem.itemExists(timePath) || (filesystem.itemExists(timePath) && filesystem.getMD5(timePath) !== props.sign)) { return new BestTimesWindow(props.timetitle, {"Beginner": [0, "Nobody"], "Intermediate": [0, "Nobody"], "Advanced": [0, "Nobody"], "Insane": [0, "Nobody"]}); } var tprops = Properties.read(timePath, { Beginner: "0,Nobody", Intermediate: "0,Nobody", Adnvaced: "0,Nobody", Insane: "0,Nobody" }); return new BestTimesWindow(props.timetitle, { Beginner: tprops.Beginner.split(","), Intermediate: tprops.Intermediate.split(","), Advanced: tprops.Advanced.split(","), Insane: tprops.Insane.split(",") }); })(); times.visible = false; times.style = window.style; var instructions = new Dialog("Instructions", "- Start a new game by clicking on the window\n title, or right clicking on the game window\n and selecting \"New Game\"\n\n- Hold alt or command then click to set a flag\n\n- Reveal the board without clicking on any\n bombs to win. Numbered squares indicate\n the number of bombs around that square."); instructions.style = window.style; instructions.show = function() { instructions.hOffset = window.hOffset + window.width / 2 - instructions.width / 2; instructions.vOffset = window.vOffset + window.height / 2 - instructions.height / 2; instructions.visible = true; }; widget.onLoad = function() { if(firstRun) { instructions.show(); } }; window.addEventListener("instructions", function() { instructions.show(); }, true); window.addEventListener("besttimes", function() { times.hOffset = window.hOffset + window.width / 2 - times.width / 2; times.vOffset = window.vOffset + window.height / 2 - times.height / 2; times.visible = true; }, true); window.addEventListener("win", function() { if(times.isScoreBetter(window.level, window.elapsed)) { times.hOffset = window.hOffset + window.width / 2 - times.width / 2; times.vOffset = window.vOffset + window.height / 2 - times.height / 2; times.visible = true; times.editScore(window.level, window.elapsed); } }, true); var custom = new CustomSetupWindow(props.custtitle, window.columns, window.rows, window.bombs); custom.visible = false; custom.style = window.style; custom.addEventListener("submit", function(columns, rows, bombs) { window.newGame(columns, rows, bombs); }, true); window.addEventListener("customsetup", function() { custom.hOffset = window.hOffset + window.width / 2 - custom.width / 2; custom.vOffset = window.vOffset + window.height / 2 - custom.height / 2; custom.visible = true; }, true); var dialog = new Dialog("Error", "This theme no longer exists on the hard-disk Thank you for pressing the self destruct button"); dialog.style = window.style; dialog.show = function() { this.hOffset = themes.hOffset + themes.width / 2 - this.width / 2; this.vOffset = themes.vOffset + themes.height / 2 - this.height / 2; this.visible = true; }; var themes = new ThemeWindow(props.themetitle, themePath, (function() { var actualThemes = []; for(var i = 0; i < props.themes.length; i++) { if(filesystem.itemExists(themePath + props.themes[i] + "/Theme.properties")) { actualThemes.push(props.themes[i]); } } return actualThemes; })(), props.theme, defaultThemes); themes.addEventListener("themechange", function(theme) { if(!filesystem.itemExists(themePath + theme + "/Theme.properties")) { dialog.show(); return; } var style = readTheme(theme); window.style = style; times.style = style; custom.style = style; dialog.style = style; themes.style = style; instructions.style = style; }, true); themes.visible = false; themes.style = window.style; themes.hOffset = window.hOffset + window.width / 2 - themes.width / 2; themes.vOffset = window.vOffset + window.height / 2 - themes.height / 2; window.addEventListener("themesetup", function() { themes.hOffset = window.hOffset + window.width / 2 - themes.width / 2; themes.vOffset = window.vOffset + window.height / 2 - themes.height / 2; themes.visible = true; }, true); // I seem to have more success in my Widgets doing things in a function // called from onUnload than doing that same stuff in onUnload itself. (function() { function unload() { Properties.write(timePath, times.times, "Do not edit, or risk losing your best times"); Properties.write(dataPath, { title: window.title, columns: window.columns, rows: window.rows, bombs: window.bombs, wrap: window.wrap, winmsgs: window.winMsgs, sadmsgs: window.sadMsgs, timetitle: times.title, custtitle: custom.title, themetitle: themes.title, themes: themes.themes, theme: themes.theme, sign: filesystem.getMD5(timePath) || "" }, "Edit at your own risk"); } widget.onUnload = function() { unload(); }; })(); s'function ThemeWindow(titleText, themePath, themes, theme, defaults) { DecoratedWindow.call(this); var $this = this; this.title = titleText; var frame = new Frame(); frame.hOffset = 17; frame.vOffset = 44; this.add(frame); var list = new List(frame); list.addEventListener("selectionchanged", function() { $this.themeChange(list.selectedItem); }, true); if(themes instanceof Array) { for(var i = 0; i < themes.length; i++) { list.addItem(themes[i]); if(themes[i] === theme) { list.softSelectedItem = theme; list.selectedItem = theme; } } } var refreshBtn = new ImageButton(frame, "refresh", "Refresh selected theme"); refreshBtn.addEventListener("click", function() { $this.themeChange(list.selectedItem); }, true); var addBtn = new ImageButton(frame, "add", "Add new theme"); addBtn.addEventListener("click", function() { var files = chooseFile(".zip", true); if(!files) return; for(var i = 0; i < files.length; i++) { var file = files[i]; if(file.substring(file.length - 4) === ".zip" && filesystem.itemExists(file)) { filesystem.copy(file, themePath); if(file.indexOf("/") !== -1) { file = file.substring(file.lastIndexOf("/") + 1); } else if(file.indexOf("\\") !== -1) { file = file.substring(file.lastIndexOf("\\") + 1); } filesystem.unzip(themePath + file, themePath); if(filesystem.itemExists(themePath + file.substring(0, file.length - 4) + "/Theme.properties")) { list.addItem(file.substring(0, file.length - 4)); } } } }, true); var dialogOne = new Dialog("Error", "The last theme cannot be removed"); var dialogCurr = new Dialog("Error", "The currently active theme cannot be removed"); var dialogDflt = new Dialog("Error", "Default themes cannot be removed"); var removeBtn = new ImageButton(frame, "remove", "Remove selected theme"); removeBtn.addEventListener("click", function() { var dialog = null; var found = false; for(var i = 0; i < defaultThemes.length && !found; i++) { found = defaultThemes[i] === list.selectedItem; } if(list.length === 1) { dialog = dialogOne; } else if(list.softSelectedItem === list.selectedItem) { dialog = dialogCurr; } else if(found) { dialog = dialogDflt; } else { var index = list.selectedIndex; list.removeItem(list.selectedItem); list.selectedIndex = (index === 0)? 0 : (index === list.length)? index - 1 : index; $this.themeChange(list.selectedItem); } if(dialog) { dialog.hOffset = $this.hOffset + $this.width / 2 - dialog.width / 2; dialog.vOffset = $this.vOffset + $this.height / 2 - dialog.height / 2; dialog.visible = true; } }, true); var okayBtn = new ImageButton(frame, "okay"); okayBtn.addEventListener("click", function() { list.softSelectedItem = list.selectedItem; $this.close(); }, true); this.addEventListener("restyle", function() { frame.width = this.width - 34; frame.height = this.height - 61; okayBtn.style = this.style; okayBtn.hOffset = frame.width / 2 - okayBtn.width / 2; okayBtn.vOffset = frame.height - okayBtn.height; refreshBtn.style = this.style; refreshBtn.hOffset = frame.width - refreshBtn.width; refreshBtn.vOffset = okayBtn.vOffset - refreshBtn.height - 10; addBtn.style = this.style; addBtn.hOffset = refreshBtn.hOffset - addBtn.width - 10; addBtn.vOffset = refreshBtn.vOffset; removeBtn.style = this.style; removeBtn.hOffset = addBtn.hOffset - removeBtn.width - 10; removeBtn.vOffset = refreshBtn.vOffset; this.style.softselectioncolor = this.style.prevselectioncolor; list.style = this.style; list.width = frame.width; list.height = frame.height - okayBtn.height - refreshBtn.height - 20; dialogOne.style = this.style; dialogCurr.style = this.style; dialogDflt.style = this.style; }, true); this.width = 175; this.height = this.width * 1.61803399; this.addEventListener("visible", function() { list.softSelectedItem = $this.theme; list.selectedItem = $this.theme; }, true); this.addEventListener("close", function() { list.selectedItem = list.softSelectedItem; $this.themeChange(list.selectedItem); $this.visible = false; }, true); this.__defineGetter__("theme", function() { return list.softSelectedItem; }); this.__defineGetter__("themes", function() { return list.getItems(); }); }'N`PK ֕4;Black Crystal/AddBtn/PK 0;x!Black Crystal/AddBtn/add_down.pngPNG  IHDR2tEXtSoftwareAdobe ImageReadyqe<XIDATxڤSR0  @'%NL9П!bpL-Y]_I}_ueԬ~O:x^͉pt@X@Ӂe " LK $[Jd!J-J7٫(ZQZr ll3DP@\6An`,c:۔\1۟e x *hP`rKym-۔}ZOp Zтgх +DoANϡR Ja77cKNR/O2:ں@#}!gS<%IJ"IENDB`PK 0;I%Black Crystal/AddBtn/add_inactive.pngPNG  IHDR2tEXtSoftwareAdobe ImageReadyqe<jIDATxڜSAn1 Aʕ&TAEg|cNKW* M=oRz~jX!y8<#+H4$:6ϭΓ<Ԛ}w]Whl6}\X)F2pi Gn7)Z{ןIENDB`PK 0;^!Black Crystal/AddBtn/add_over.pngPNG  IHDR2tEXtSoftwareAdobe ImageReadyqe<vIDATxڜSKn0H]AeYt-'(W*g8t]$r$w~vJ c7Mܽ Snײ/6c{뚦٤?-42{O`Ey? 5:}oHZumԆrog3Cm)G$y>g^ pnߓH7P#}FƈY WJ?Xt*1_G]l65`H*I۶&Ժ0wDUgɁ%sk> m%y!j7\.Iyb)Zu1 "R/KNه',6g2K9\>#GQ&}<3MŤ1o? 12{nݿIENDB`PK ֕4;Black Crystal/Board/PK0;4 Dns%Black Crystal/Board/bottom_center.png sb``p Ҍ@$-:)׈ĢTǔTԠĔ“6@E.!"H|f`dc㧏@ ~.PK0;k(U#Black Crystal/Board/bottom_left.png sb``p  $R,鎾 $%%i%E )I A)'Sm=]C4S"؎TY4)g¹ *= d)Ȫ:FIDo.Fw5e) PK0;#$Black Crystal/Board/bottom_right.png sb``p  $R,鎾 $%%i%E )I A)'Sm=]C4S"؎T0z0X"<̉S\~@YQWR5NsBbo&Ue3?h:&PK0;1GgmBlack Crystal/Board/center.png sb``p Ҍ $Et)׈ĢTǔTԠĔ“6@E.!"V3,jc+PeSBPK0;qkXkp#Black Crystal/Board/center_left.png sb``p @$3wR%%i%E )I A)'Sm<]C*n%$$Dk`g```Xbm*PeSBPK0;qkXkp$Black Crystal/Board/center_right.png sb``p @$3wR%%i%E )I A)'Sm<]C*n%$$Dk`g```Xbm*PeSBPK /;U  Black Crystal/Board/close.pngPNG  IHDRRW pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F8T8YC8Kv{2R?v8ftIENDB`PK y0;g] "Black Crystal/Board/top_center.pngPNG  IHDR8A pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxb```XƤ9d׮YWIENDB`PK 1;Iں'd d Black Crystal/Board/top_left.pngPNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxl10| a@ 5y 5OᩉhH`ۙ g #"Ѷ)1 "ȧ-86MS- x5Ms!0 ff|n^Us^A̿"kaPJ+Y<\ԚRmIENDB`PK 0;)mx x !Black Crystal/Board/top_right.pngPNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxl!n@v# Uϒ{aa=AQQQqL,;/$%M i 8_rdža8Kb]ט٧i N.}ql~>3jZ%RJVJZO5_$y.w$mקAkMwKVi2IENDB`PK ֕4;Black Crystal/OKBtn/PK x0;IIBlack Crystal/OKBtn/ok_down.pngPNG  IHDRUn|tEXtSoftwareAdobe ImageReadyqe<IDATxXO\Ug{FMkHWbaK]!V5bn YAHUE1.-&,{>5&Fs9瞯9o_?FIJ۫twv{スǁ[|~OSG(Dx"F>S4ʍ^h&}8C""X3>H-{ciZV;T@'6WKi58M9 dD 4# sVJ#GIՠgZ!ֻ|N @8 1M]_JG>+["(zyIX%g"\1 mʥ~O6z<:zY׋,O>Y #14tvFIFcH^,z@sszp9azzz||٦pظˤWrz_F}?fĔ\DBuQ)D.//V۪MNNޝUq㧍;w:0CH"#Ո0Z?៾nqq}}baaavvlZ-׫^3Yϱ Mo8 W{)-C NxUTwl$p,(qis_JBiB+ùX+^<@=a/#Jb>|yu |J4Kuof9M[Nlt4N 2οle|9<woY9GEyegde/@Xc0Fhz2M1VUǞdY:U;lll/LNNfUW޿(0rBҀ*{2P+/!;+WVk5<<=}on,Ki6=.={vO:NcWK&M-聁aX&2aŕQAV;rve퟇^Xӑ3ݽno/\TV!!V1 }GbU/T KpsW:K3!$1a?,-.,ZNW]]\Xex677fhqp]W^3/ȗ<]߄T՝=Շ2[B'ʳ 9OZ_ӁjS#ijDB/EV 9-n njj=}t+,?Fv4TS`Z&@RiK%u!T"M:;ņER!0aK,7r!\ K)RJZª܆L"5*J p|MH_L e%OS0e R- B}*Svmҧ24):Bbwr(FFԾ{?T}k Zq}9v!eؑ~>0,@=0IIENDB`PK x0;ZDDBlack Crystal/OKBtn/ok_over.pngPNG  IHDRUn|tEXtSoftwareAdobe ImageReadyqe<IDATxWo\E];e,tdY\C>)B`uCbKvH$b)H.XL,7A%X `ݽݻ۝} +)<337y/͛_gXK`mf-p Blݚ:k9ebdXтaE\$|50\æxk7}eSśp&l$t݃")bFQ8oߌ u.gDFVÑ͝޷NZYYk6>1>{-$?@̞>)ӅqΟ```ffKv~mxxx{{ɓ_.||Ox $U3m} !@f!HOL;6l6Ij C(&`Z-hx?}V=7{ _fg4=LLW[(D=´El1dTKGfR  80fhh4uii7z529誓ņryZHSj!M(J1:rh;d؄hL 8Mj$kGbAO|p WKQacʋz `9XA?WUL0:Jg d8Sd<<1xiWm+g `Vi*]񱰡cTUN F]C3WEAg8ϒJAM ʱ׏]|vl_kkk}y9lI^YP _/Akй{<)x`aTYux˟]C޹A붐޾{?V*o^}$|p .9a`&''+s Br+MmT7(@zQhH!йY^CjglHʽTrό 3LpǕýS l)DRP=r4R` qH REaKM0)RF6Zj49H Lk rhdÃfiR_, eCkVKdqIܟh9AJ\|nw6U+W?, ~qi;ʎ;|zl`Bc f^%g(Igdqt:yu6e;򐉠j];z 4I43,g%F1 t"rԐQ C:8)eR(4J9}fu4(v760Jp~_~Lv>`~$ !^kRJ7aw[o6eCrX4D 5VGw^.XV:q& B߷a:eu8 At:LUC=5M!%aź /y8~UPR44JIQU5 y*bzPdP 5D%- M3uqq)m\CJ Ifl+Kw_ S. ~R1F v{ΞEGisD>_~ 0IENDB`PK ֕4;Black Crystal/RemoveBtn/PK 12; P 'Black Crystal/RemoveBtn/remove_down.pngPNG  IHDR2 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڤKR0C䜃+@a1EljaMRKGrI $$$'=d]@z^B!BP8 `/t]L+!g$mHvcS]giNR]tWۚw}0ӿwYx rl")R}8R[Gzz|zIdQA |>"[3GiG?ikA6O,oC!TNK^"Z,$B]8ݾxSзHݝN{٪ZPs]ȑIENDB`PK 12;ѭ3 +Black Crystal/RemoveBtn/remove_inactive.pngPNG  IHDR2 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F5IDATxڜm@'q h)TC 813/ݵMBPZ{ϼ«%p8x0wqD|xxX )ɶ F%":2"24 HAq4+wRҴ Eͪ툜f>[ߙ2sBFfH6:~c{$nCz^.vO4PV%c\$ԦTj7ncX>TY5ty5^1 hYwS,kut3 Y{=]tgҺ4_u&ڻIENDB`PK 12;%1  'Black Crystal/RemoveBtn/remove_over.pngPNG  IHDR2 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FJIDATxڜKr1 D_Wyeg/#h->neDgΌJ: ~|r nAWCxy`0,rRN`$uW<~mJ) )ɶj0 v亮eYHd|}?oږ`,nC|޶}@> />T{:,F뿘ϨIԎ,,-1MґXd̶ֈOTe F4V#l7sRdj8ҳ_,j-Yg6O]Hnӭod#٦6Ƒ=jTwIIENDB`PK ֕4;Black Crystal/Scroll/PK 4;>$Black Crystal/Scroll/scroll_down.pngPNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<)IDATxڔQ1r013i85ax3hyO+/8I'^F: (97;u]_+u|)'APNOO [PBgF3jc(+˝QJP+F=o Rk)'tJ+z?yCKe͚0<i|AmۙTUŲ}8Z+amf4 0P4x%\$0 o4G"^ Ų( qLvYrb&(~^IENDB`PK 4;W?jj"Black Crystal/Scroll/scroll_up.pngPNG  IHDR |tEXtSoftwareAdobe ImageReadyqe< IDATxڔQN0/ne.HԄ/\AtqtffhD`E!" n|A4-y.$ :41ȈpU8H=A#ahΆ6_^@iuq@?g_]LjT}뺞#]oy0y"VLjm/nO4] ˲{X}磘 v]ש#F+x%7#N8$WۍdNKU{;Ž#ԒM3u:Q)I$ˁ<Էoo>&ܿz[c[y,OJ&aa}q:Bk$n"zxip'hHs,ĹGC?n@64g<|" g3m, blrB_oAb 9tqfP! ˻?31gf߾[l8 FTeIENDB`PK/;Black Crystal/Tiles/down.png sb``p  $?OR%%i%E )I A)'Sm=]C*n%$$8@G@'Q̓_^^͛'X]`17bHKHMU3%-(|@<]\9%4PK /;"V2$$ Black Crystal/Tiles/inactive.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڤ1 E*S[dꒃ =@su $(&Y-,cpOl }XFN) PK ֕4;Black Crystal/AddBtn/PK 0;x! 3Black Crystal/AddBtn/add_down.pngPK 0;I% (Black Crystal/AddBtn/add_inactive.pngPK 0;^! 3Black Crystal/AddBtn/add_over.pngPK ֕4;FBlack Crystal/Board/PK 0;4 Dns% xBlack Crystal/Board/bottom_center.pngPK 0;k(U# )Black Crystal/Board/bottom_left.pngPK 0;#$ Black Crystal/Board/bottom_right.pngPK 0;1Ggm Black Crystal/Board/center.pngPK 0;qkXkp# Black Crystal/Board/center_left.pngPK 0;qkXkp$ J Black Crystal/Board/center_right.pngPK /;U   Black Crystal/Board/close.pngPK y0;g] " CBlack Crystal/Board/top_center.pngPK 1;Iں'd d w!Black Crystal/Board/top_left.pngPK 0;)mx x ! -Black Crystal/Board/top_right.pngPK ֕4;8Black Crystal/OKBtn/PK x0;II 9Black Crystal/OKBtn/ok_down.pngPK y0;### >Black Crystal/OKBtn/ok_inactive.pngPK x0;ZDD CBlack Crystal/OKBtn/ok_over.pngPK ֕4;mIBlack Crystal/RefreshBtn/PK [0;lKHH) IBlack Crystal/RefreshBtn/refresh_down.pngPK \0;;gg- 3LBlack Crystal/RefreshBtn/refresh_inactive.pngPK Z0;6Lkk) NBlack Crystal/RefreshBtn/refresh_over.pngPK ֕4;QBlack Crystal/RemoveBtn/PK 12; P ' QBlack Crystal/RemoveBtn/remove_down.pngPK 12;ѭ3 + ^Black Crystal/RemoveBtn/remove_inactive.pngPK 12;%1  ' YjBlack Crystal/RemoveBtn/remove_over.pngPK ֕4;vBlack Crystal/Scroll/PK 4;>$ vBlack Crystal/Scroll/scroll_down.pngPK 4;W?jj" xBlack Crystal/Scroll/scroll_up.pngPK 4;5oKK czBlack Crystal/Scroll/thumb.pngPK 4;Lpu# |Black Crystal/Scroll/track_fill.pngPK I4;e]W }Black Crystal/Theme.propertiesPK ֕4;Black Crystal/Tiles/PK /;eÚ "Black Crystal/Tiles/bad.pngPK /;iFy~ Black Crystal/Tiles/blank.pngPK /;#}Y Black Crystal/Tiles/bomb.pngPK /;Y: Black Crystal/Tiles/boom.pngPK /; QBlack Crystal/Tiles/down.pngPK /;"V2$$ 5Black Crystal/Tiles/inactive.pngPK /;v9$K Black Crystal/Tiles/pennant.pngPK))v {ܧ*'PK /;Dark Glass/AddBtn/PK ,; Dark Glass/AddBtn/add_down.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F(IDATxڬ=N17*='@2%͊R@q*ʭ"E_6Ҍ3ceY9Sb@R9# 1hV<'ɉW9%fvF4d\̤3xNbV~"j4aND*e68nkUJ0̏˷ھͦC23Bl&ڈ '0 H/(tWc;)؛iF&Il6ֵCbl֫_^5nIENDB`PK ,;=Y "Dark Glass/AddBtn/add_inactive.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڴ0?@фr``Á'sr1q#6ګ5/~($̈q8VajR8~&H)9VQQ|Ό&I)'ypYa}oՅ tm)lvՇ繝gLg֏wVum&veYZQdY?u~' QmAL#iM%_ n|dIENDB`PK ,;T Dark Glass/AddBtn/add_over.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڴ= @o`xt))Ҥ3]34D fRј¾y1̮ K98PJY^3#"vPU\8ܶbٰiց*6u]~^9}$)ᙝW_NX G㾽y|Y0f6 H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F8T8YC8Kv{2R?v8ftIENDB`PK/;8tyDark Glass/Board/top_center.png sb``p Ҍ@$-:)׈ĢTǔTԠĔ“6@EҞ.!:R>~&a`\8_C@,P:&PK /;}4Dark Glass/Board/top_left.pngPNG  IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxt EoE;Y:\L#":(jMH!Ãw7Gg;e1lťbMJ) J)9J)a1FRVABB8`=5~ʯpK){ۃ9ZO(jIENDB`PK /;*ADark Glass/Board/top_right.pngPNG  IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxl OڅɄA $)ԟKriIzngbiya:5t!Ŧ60ж-RRBk c̕Όc)˻y]_|7%>ZR؝0L+#JEUp"* *DUWQ6i4 ~l0 CT"y_אH$DQBр~X , t:(˄n#99d28ԈʗPjDE׵Z-F`4aXdBu$o<l6+LS0/%4N|>>f3wqx`0yΩ(W_ / [VzzA{PTpv]2Nj/ Ntj|P׉vdAx`afl6_8ثDZB*"c^dU(\Pr8tT9U²9Ps5Q(tn* VCaJ%5`bϩnb($i~sOT" 군yܣc#3U*`IJIENDB`PK !;D Dark Glass/OKBtn/ok_inactive.pngPNG  IHDRUA+tEXtSoftwareAdobe ImageReadyqe<nIDATxX;k*A|We Ig' "XDD $`)F@Z[>Pķ{c489{89gSqB^іI?4O`eBV0 .1v$D"sn6 +GBO^pP( c2@Vvl6l"Z2z$IjHI% V;fP(Ʉrh4 ߏt?R~;RIEA F#X,t:wYdp{{ BAUrRL&T*iRJ}D>3'H 19buYޤKٌڕտ jKT^M5{}}χ;:d+ߑ}PI*c.7C]R IENDB`PK !; iDark Glass/OKBtn/ok_over.pngPNG  IHDRUA+tEXtSoftwareAdobe ImageReadyqe<lIDATxX=k"Q=FcԐ2  Im#Xh؊VINXX؉h`MvẂ<\o ]!"C#(8ۼmECLfc߄RdWj]LMݱ\xzzh4BN'&":=q,R.˽!ȴ[\\\T*L&C:нYI1 nnn`0rn xF2 2oqdjb>KYy~~r,;fhb෦ťChp8Px`0L&vmZbHFQR)66u߻Jf;v;^^^PTH$vjm0D8FX7f*_?)@"Lg^X,,H'|x||dLUt:\th4Wt:eF~F|||`x<@VZw&HloSm7%~4gׯpwb}O1k;y wW?tO>xIENDB`PK /;Dark Glass/RefreshBtn/PK ,;K5 J J &Dark Glass/RefreshBtn/refresh_down.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FuIDATxڬ=OA9 &K8@DD$Dhh QGïɸ˗D] !bq{>IVZ;̼s:8Evvv|mm @DvNEApHONGr+af SEU Gr` q@.; UzSCECQTpvUԬHƌMO}C$ q[[[6 x0 F>b8QU)JZ-H˃`)ݤO4 jTVi5[u...( Ti~z"+++@ZnsrrSSSufgg309??aW#c2T*oxw,JJT^W"#.&{izTȌ.SԢTcAOZ-wJ>әb1Xdrr$I%2̈Ԉ40iEXJ:$)yddY.//$>3f,04TZ-\@-(Bk2wGE\ VSg!!i?+nIENDB`PK ,;.з *Dark Glass/RefreshBtn/refresh_inactive.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬ])QñR("IwJ >/s(7.rF)7F^FJf̾8-{V3k={5(ej,QFCQͦUm e!v_rpxr|u|7{6 r`ir^f!lldBi˅vd20 R)#~zN4t~I)MFt:< Á$X,vj9v3If&pHX$YVF#v.^G.#ciJb|>'S.QUp8zf:I$ 2kfP(lB!* ht:m4Mt]GUUTU}RDZHɬl:zB<b7  \.9h_,ixL Lr:n;v0V,N^g5:~~2:pIENDB`PK ,;͙ &Dark Glass/RefreshBtn/refresh_over.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬ?OPm,M;P C# OhF]ptab!( D[ Nm^Sy;Ο{ՔR(~)+!DN8._iE}u d*˲8PJ!1LJq~iNEs&aRjBx+񘫫+>EQ `2p{{mۼ:www|>g82 `Ir|| ɄzaF#h$I9lX0t:t]rt:eprr=aiϖ%ir~~eY^kj^u<!D&Ƞ8N%~]sL)E$qiضM$Ez=7Rx~~fR.:* a!eT*h4(0 gt]ZvQet)%V J\24R[?yCIENDB`PK /;Dark Glass/Scroll/PK `,;Dark Glass/Scroll/scroll_03.pngPNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATxڔ !EYmDB l A ^d79||sqYk-1o%ּ9u*|f{_ܣүR_';cjSJd !f6QF>dfco{Jؤq&fu!-vBAvIENDB`PK `,; WNDark Glass/Scroll/scroll_06.pngPNG  IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxڌT@I؂ i)b3; q! x-muL'?)6}u^Kzd^jIwt8cE^^dhc1FMh~xhL)e RcNתHy3u!i[d 3YVZ&D rEd% dI\t8 #TWiu6Y>Pi㱩s|>٣۠/aأ")8YmqJ=z5|^˰鼅aF 6*ݑl@ wBmEXqor ťC1bqlISTכSsC0e #\Vb3},hPIMt iۑT}[2~`49PIENDB`PK`,;d.puDark Glass/Scroll/scroll_08.png sb``p @$%)׈ĢTǔTԠĔ“6@E.!r226lڔ$c]ƣp!KS]@% ~.PK`,;zRBjoDark Glass/Scroll/scroll_10.png sb``p @$%)׈ĢTǔTԠĔ“6@E.!r22X$b5J2xsJhPK `,;׆"Dark Glass/Scroll/scroll_12.pngPNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATxڜ wMbGV`V`B ]l7ZcR{8UJ1RJGo[k4ѵVt+d۶AB!c Ns`B\Mɠ‚{{!dи46s?0IENDB`PK /;Dark Glass/Tiles/PK/;eÚDark Glass/Tiles/bad.png sb``p  $?OR%%i%E )I A)'Sm|=]C*n%$$8@'}z$%$%+e3ltL*V3Qlõ+o}1Pql p]CG@<]\9%4PK/;iFy~Dark Glass/Tiles/blank.png sb``p  $?OR%%i%E )I A)'Sm<]C*n%$$8@G {[W2xsJhPK /;#}YDark Glass/Tiles/bomb.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxbd``@`b R$njpAb2f3 baUUUCCC7o||.VqH]=#z4,""ƒ͹@|]I@'hHs,ĹGC?n@64g<|" g3m, blrB_oAb 9tqfP! ˻?31gf߾[l8 FTeIENDB`PK/;Dark Glass/Tiles/down.png sb``p  $?OR%%i%E )I A)'Sm=]C*n%$$8@G@'Q̓_^^͛'X]`17bHKHMU3%-(|@<]\9%4PK /;"V2$$Dark Glass/Tiles/inactive.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڤ1 E*S[dꒃ =@su $(&Y-,cpOl }XFN) PK 1;G} $Dark Glass/RemoveBtn/remove_down.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬ;r0D_p \7hDZ{q $C2ݚ:Pm[$;Ү٣# P$%Χ fUd jY fR2pIBäbsiFvm~޳ly'e{ϟC8sc(3#n`߷!l\Y0#P]*BM48i7 gӗZJ= MӬswɮ#|\e;6#*IENDB`PK 1;v (Dark Glass/RemoveBtn/remove_inactive.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx̔A EuzYxzwFg'dViLݨBOBŤigqOfNo#x#\mQ6LraZFDض-4VLr2oUdsʮzZ$,Vv5M}^w0T-f^'ILT͟38ZoIENDB`PK 1;s $Dark Glass/RemoveBtn/remove_over.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx̔10 E$nбh0"qH; !U-ӷeu pUUQ%9y_$4M HbhKy2#a$0}ɴya6$eYUm{ ۯƳNa8$0 {vgim vh?DQ.+ ji0}Kv7=}IENDB`PKk1;KUDark Glass/Theme.propertiesM0 HJUaCWzRcQ C0up$p_?QLJ/L_41P)t198[-4|3As:zЍc=li3F\vxC#x7*?@%{Us1HnTJe ;P;eLAԦE1(\+t!kڨ"@pBgG&ʨ!!!!vsoJRd89&𦲩/[M[O`ӆENtk-Xwd ;c7읺^x*aDaDq(:'MnXiNV  P.9M|ZO2iw49_PK /;Dark Glass/AddBtn/PK ,;  0Dark Glass/AddBtn/add_down.pngPK ,;=Y " i Dark Glass/AddBtn/add_inactive.pngPK ,;T  gDark Glass/AddBtn/add_over.pngPK /;c$Dark Glass/Board/PK /;Iqns" $Dark Glass/Board/bottom_center.pngPK /;+ @%Dark Glass/Board/bottom_left.pngPK /;u=! &Dark Glass/Board/bottom_right.pngPK /;I+^(gm &Dark Glass/Board/center.pngPK /;iikp 'Dark Glass/Board/center_left.pngPK /;iikp! 9(Dark Glass/Board/center_right.pngPK /;U   (Dark Glass/Board/close.pngPK /;8ty ,4Dark Glass/Board/top_center.pngPK /;}4 4Dark Glass/Board/top_left.pngPK /;*A 5Dark Glass/Board/top_right.pngPK /;/7Dark Glass/OKBtn/PK !;4H ^7Dark Glass/OKBtn/ok_down.pngPK !;D =:Dark Glass/OKBtn/ok_inactive.pngPK !; i G=Dark Glass/OKBtn/ok_over.pngPK /;K@Dark Glass/RefreshBtn/PK ,;K5 J J & @Dark Glass/RefreshBtn/refresh_down.pngPK ,;.з * NDark Glass/RefreshBtn/refresh_inactive.pngPK ,;͙ & [Dark Glass/RefreshBtn/refresh_over.pngPK /; hDark Glass/Scroll/PK `,; ;hDark Glass/Scroll/scroll_03.pngPK `,; WN viDark Glass/Scroll/scroll_06.pngPK `,;d.pu kDark Glass/Scroll/scroll_08.pngPK `,;zRBjo GlDark Glass/Scroll/scroll_10.pngPK `,;׆" lDark Glass/Scroll/scroll_12.pngPK /;.nDark Glass/Tiles/PK /;eÚ ]nDark Glass/Tiles/bad.pngPK /;iFy~ ;oDark Glass/Tiles/blank.pngPK /;#}Y oDark Glass/Tiles/bomb.pngPK /;Y: ;qDark Glass/Tiles/boom.pngPK /; rDark Glass/Tiles/down.pngPK /;"V2$$ asDark Glass/Tiles/inactive.pngPK /;v9$K tDark Glass/Tiles/pennant.pngPK 1;G} $ uDark Glass/RemoveBtn/remove_down.pngPK 1;v ( Dark Glass/RemoveBtn/remove_inactive.pngPK 1;s $ Dark Glass/RemoveBtn/remove_over.pngPK k1;KU RDark Glass/Theme.propertiesPK)) /YN`PK |%-; Matte/AddBtn/PK ,; Matte/AddBtn/add_down.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F(IDATxڬ=N17*='@2%͊R@q*ʭ"E_6Ҍ3ceY9Sb@R9# 1hV<'ɉW9%fvF4d\̤3xNbV~"j4aND*e68nkUJ0̏˷ھͦC23Bl&ڈ '0 H/(tWc;)؛iF&Il6ֵCbl֫_^5nIENDB`PK ,;=Y Matte/AddBtn/add_inactive.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڴ0?@фr``Á'sr1q#6ګ5/~($̈q8VajR8~&H)9VQQ|Ό&I)'ypYa}oՅ tm)lvՇ繝gLg֏wVum&veYZQdY?u~' QmAL#iM%_ n|dIENDB`PK ,;T Matte/AddBtn/add_over.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڴ= @o`xt))Ҥ3]34D fRј¾y1̮ K98PJY^3#"vPU\8ܶbٰiց*6u]~^9}$)ᙝW_NX G㾽y|Y0f67T˽h_??>*wXu+-z{^ˆ*Bϔ.ϟ9W.yooFP:N.80q9402][~h#:&PKv;IgmMatte/Board/center.png sb``p Ҍ $'R%%i%E )I A)'Sm=]C*n%U}xô/W:&PKv;+ڬ{mrMatte/Board/center_left.png sb``p @$f*R%%i%E )I A)'SmD<]C*n%ʹݵ|:Q,Res ~.PKv;wnsMatte/Board/center_right.png sb``p @$f*R%%i%E )I A)'SmD=]C*n%U~xȬuc_C#)b@ ~.PKv;+=Matte/Board/close.png sb``p  $_R%%i%E )I A)'Sm<]C*n%U|xs^rAV]]SS;eM $c\U/Q6fs;lNH^) PKv;qw{Matte/Board/top_center.png sb``p Ҍ@$6R%%i%E )I A)'Smd=]C*n%ͳz՞>r@C#e%@ ~.PKv; wMatte/Board/top_left.png sb``p  $_R%%i%E )I A)'Smr<]C*n%ͱbG-)SlӧOgeghæMFTϜ=k,***OOרhҥvu:rXOn+at%}xu^^OW?uN MPK v;L9& Matte/Board/top_right.pngPNG  IHDRRWtEXtSoftwareAdobe ImageReadyqe<IDATxb>}@|(`߿3iW2<|?2}˗/ @N&?_~1|AZZANN.(ĀΠbfbH JB?@z,"#IENDB`PK ۪,; Matte/OKBtn/PK !;4HMatte/OKBtn/ok_down.pngPNG  IHDRUA+tEXtSoftwareAdobe ImageReadyqe<GIDATxX?qQ~q2 e(I B6`,2f$ead`ڐdQ=u_?u:s9yq%,7(p rD"y^>˻y]_|7%>ZR؝0L+#JEUp"* *DUWQ6i4 ~l0 CT"y_אH$DQBр~X , t:(˄n#99d28ԈʗPjDE׵Z-F`4aXdBu$o<l6+LS0/%4N|>>f3wqx`0yΩ(W_ / [VzzA{PTpv]2Nj/ Ntj|P׉vdAx`afl6_8ثDZB*"c^dU(\Pr8tT9U²9Ps5Q(tn* VCaJ%5`bϩnb($i~sOT" 군yܣc#3U*`IJIENDB`PK !;DMatte/OKBtn/ok_inactive.pngPNG  IHDRUA+tEXtSoftwareAdobe ImageReadyqe<nIDATxX;k*A|We Ig' "XDD $`)F@Z[>Pķ{c489{89gSqB^іI?4O`eBV0 .1v$D"sn6 +GBO^pP( c2@Vvl6l"Z2z$IjHI% V;fP(Ʉrh4 ߏt?R~;RIEA F#X,t:wYdp{{ BAUrRL&T*iRJ}D>3'H 19buYޤKٌڕտ jKT^M5{}}χ;:d+ߑ}PI*c.7C]R IENDB`PK !; iMatte/OKBtn/ok_over.pngPNG  IHDRUA+tEXtSoftwareAdobe ImageReadyqe<lIDATxX=k"Q=FcԐ2  Im#Xh؊VINXX؉h`MvẂ<\o ]!"C#(8ۼmECLfc߄RdWj]LMݱ\xzzh4BN'&":=q,R.˽!ȴ[\\\T*L&C:нYI1 nnn`0rn xF2 2oqdjb>KYy~~r,;fhb෦ťChp8Px`0L&vmZbHFQR)66u߻Jf;v;^^^PTH$vjm0D8FX7f*_?)@"Lg^X,,H'|x||dLUt:\th4Wt:eF~F|||`x<@VZw&HloSm7%~4gׯpwb}O1k;y wW?tO>xIENDB`PK ;%-;Matte/RefreshBtn/PK ,;K5 J J !Matte/RefreshBtn/refresh_down.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FuIDATxڬ=OA9 &K8@DD$Dhh QGïɸ˗D] !bq{>IVZ;̼s:8Evvv|mm @DvNEApHONGr+af SEU Gr` q@.; UzSCECQTpvUԬHƌMO}C$ q[[[6 x0 F>b8QU)JZ-H˃`)ݤO4 jTVi5[u...( Ti~z"+++@ZnsrrSSSufgg309??aW#c2T*oxw,JJT^W"#.&{izTȌ.SԢTcAOZ-wJ>әb1Xdrr$I%2̈Ԉ40iEXJ:$)yddY.//$>3f,04TZ-\@-(Bk2wGE\ VSg!!i?+nIENDB`PK ,;.з %Matte/RefreshBtn/refresh_inactive.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬ])QñR("IwJ >/s(7.rF)7F^FJf̾8-{V3k={5(ej,QFCQͦUm e!v_rpxr|u|7{6 r`ir^f!lldBi˅vd20 R)#~zN4t~I)MFt:< Á$X,vj9v3If&pHX$YVF#v.^G.#ciJb|>'S.QUp8zf:I$ 2kfP(lB!* ht:m4Mt]GUUTU}RDZHɬl:zB<b7  \.9h_,ixL Lr:n;v0V,N^g5:~~2:pIENDB`PK ,;͙ !Matte/RefreshBtn/refresh_over.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬ?OPm,M;P C# OhF]ptab!( D[ Nm^Sy;Ο{ՔR(~)+!DN8._iE}u d*˲8PJ!1LJq~iNEs&aRjBx+񘫫+>EQ `2p{{mۼ:www|>g82 `Ir|| ɄzaF#h$I9lX0t:t]rt:eprr=aiϖ%ir~~eY^kj^u<!D&Ƞ8N%~]sL)E$qiضM$Ez=7Rx~~fR.:* a!eT*h4(0 gt]ZvQet)%V J\24R[?yCIENDB`PK ,; Matte/Scroll/PK 4; Matte/Tiles/PK ;^5%%Matte/Tiles/bad.pngPNG  IHDRXgAMA a pHYs  tIME$WtIDAT(ϕP9 1 C`6?Joȝpϸ)lcELcF26!{!DDD@@U4vEpmY. )龦朳]6K`G\X֞*+LqwC23[-."JՏ,KtPǯ-ҏϺ/t@kr4IENDB`PK;NBMatte/Tiles/blank.png sb``p  $'L0R%%i%E )I A)'SmL=]C*n%1ɼDCN^ߒW&Np3:091sB/#w"A ~.PK ; 6D||Matte/Tiles/bomb.pngPNG  IHDRXgAMA abKGD pHYs  tIME9g8IDAT(ύR; 7z@MsaH>eY,cdcLr1Jmۊ( (!$(ixWuvᜫJ)uVP5iH)OWu=\m{i5 O+5G\C!4MC)}u] {u8O7bIJ)9s. e,mJ_kaY#IENDB`PK ;ĵMatte/Tiles/boom.pngPNG  IHDRhgAMA abKGD pHYs  tIMEV2IDAT8˝rP0y&FwU< 2 }pTDpq5 b[C(iH:Q;9Z @`:b ͦ1Zɉg|/W5g4&Cx:1qc@ĘKPajaVzJ;:W]@ :,հKZ18.vȃ U]\x,ۼ6G|¿Ca K쒄Cz(*ҔAWʽV CzJ_}zJl[ɕK\dWqB6 IENDB`PK ;A7Matte/Tiles/down.pngPNG  IHDRagAMA atEXtSoftwareAdobe ImageReadyqe<IDAT8OAP3=ąТ.#0\AYVC\( ܜ*5L@yEvBPvH8B^,R$irr>-.~q)t:tR<4p\y,-,˰^TUni>( l6)ܒin_i-Y>EF۶lF]8R%^ >-MS)}ߋţjU/T6 ^/-.o"F'x:IENDB`PK o;.,s''Matte/Tiles/flagged_.pngPNG  IHDRhgAMA abKGD pHYs  tIME 9R(IDAT8˕@E.`!!_@l**ݞ!(j%$ $@hf L gHͼxX.ضe^۶j tEjۺ^c>&@EH)R ܥ8q#d|xyAJ p HERAko|5tټZ6t:QJq:,P*PJ%Q}zJI&W`2\ !IqMR)(w6!p(2VB`0H)?28#2ofb<f\)`KbIENDB`PK ;FTMatte/Tiles/inactive.pngPNG  IHDRh6tEXtSoftwareAdobe ImageReadyqe<IDATxڴR ln)R%H)1U^GD\ZLh`+Lvl[B-)'tK$3l%p8ۖhB3 !#J9``FgIENDB`PK o;8ǵ&&Matte/Tiles/pennant.pngPNG  IHDRhgAMA abKGD pHYs  tIME 9' IDAT8˕jP1YN# /0 40Y::}BB,cWB_.pFsU,bvۜ?;߹3|tiI2Mnz/+Vc>fXb1-lZVi#gBZ%J%r0 Ð+qr0dbZ-h4.*T*zM\Fkp@k;@/ٌnC)œdR !DLRup])%ByLCAE'[dɊeWTI>L0zn6yG~{^۶RVx< Cۭ(8w` -/Ap2v1|i!N(>t:)/@JI1ZEpIENDB`PK 1;G} Matte/RemoveBtn/remove_down.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڬ;r0D_p \7hDZ{q $C2ݚ:Pm[$;Ү٣# P$%Χ fUd jY fR2pIBäbsiFvm~޳ly'e{ϟC8sc(3#n`߷!l\Y0#P]*BM48i7 gӗZJ= MӬswɮ#|\e;6#*IENDB`PK 1;v #Matte/RemoveBtn/remove_inactive.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx̔A EuzYxzwFg'dViLݨBOBŤigqOfNo#x#\mQ6LraZFDض-4VLr2oUdsʮzZ$,Vv5M}^w0T-f^'ILT͟38ZoIENDB`PK 1;s Matte/RemoveBtn/remove_over.pngPNG  IHDRrP6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx̔10 E$nбh0"qH; !U-ӷeu pUUQ%9y_$4M HbhKy2#a$0}ɴya6$eYUm{ ۯƳNa8$0 {vgim vh?DQ.+ ji0}Kv7=}IENDB`PK @2;kkMatte/Scroll/scroll_down.pngPNG  IHDR |tEXtSoftwareAdobe ImageReadyqe< IDATxڌRAr0 ǘp`>L{sOS$K])EX6ZuMO[,jQRR|_h5|_RD%Æs܀#F!$/6A:۶yf]WՊ`пY ~6'bG uk 1Mˎ C+5% %.8u<%d ]f"0QM/" (].owKk[m7\ѧɟJc& ί.IENDB`PK @2;XqppMatte/Scroll/scroll_up.pngPNG  IHDR |tEXtSoftwareAdobe ImageReadyqe<IDATxڌRIn0 !?ձ'J)"-2,Jh4li) 'bDfHu|9+:I]oXcH6v0G߈C8ɀ uR~_Q9CWXeTuA˲*JsT*ZPSK#Ԫ`m۔7f44jBjCO_M7rAywQ-)wVMƁ#?aLAP[ѹ56ֹ=i#Uny>~O~!MBoIENDB`PK@2;0DpuMatte/Scroll/track_fill.png sb``p @$%)׈ĢTǔTԠĔ“6@E.!r228x9SmR8s eSBPK @2;GMatte/Scroll/thumb.pngPNG  IHDR$tEXtSoftwareAdobe ImageReadyqe<IDATxڌUAr0 frQE/GG'&,N%!jzy./ X(۬w`i` ^3Xh53LL)7&kDJ#Vl!:(UVrB5b %-E2n$„g4J:@(5p %t.,ah &ќjG{s-|>;~8Z,ܴ*Kϟmj Mr]Rw<5=pZcLS}"]wvBY?P8l's{CWR9VUfu)](2Z`3ݰeb5)j)J=3"[}:>N|YbQySU?c> J~RCA; ,$\FX&oБCS+ۛ"߹,&Kaԭ!+їi$kY+yV?e.iEx UD\e0uX$^;8 |g1$XפvC;%Lg.Y\Z2~ 7 hX0x1ZJ[Ӑ՚X+fKFHy M=]`搼o'M ۂpvRpeY-m]PKr$tH|KYݯ}PK|P.]N'S4|!`:ދiKb:4nm9 +ETŸ;y+H]y/8A)Z "xR9\abZf,>k;CO oL9t:PK |%-; Matte/AddBtn/PK ,;  +Matte/AddBtn/add_down.pngPK ,;=Y  _ Matte/AddBtn/add_inactive.pngPK ,;T  XMatte/AddBtn/add_over.pngPK ; O$Matte/Board/PK v;0zqv y$Matte/Board/bottom_center.pngPK v;˞6 %%Matte/Board/bottom_left.pngPK v;X &Matte/Board/bottom_right.pngPK v;Igm 'Matte/Board/center.pngPK v;+ڬ{mr 'Matte/Board/center_left.pngPK v;wns Z(Matte/Board/center_right.pngPK v;+= )Matte/Board/close.pngPK v;qw{ )Matte/Board/top_center.pngPK v; w ~*Matte/Board/top_left.pngPK v;L9&  }+Matte/Board/top_right.pngPK ۪,; ,Matte/OKBtn/PK !;4H ,Matte/OKBtn/ok_down.pngPK !;D /Matte/OKBtn/ok_inactive.pngPK !; i 2Matte/OKBtn/ok_over.pngPK ;%-;5Matte/RefreshBtn/PK ,;K5 J J ! 5Matte/RefreshBtn/refresh_down.pngPK ,;.з % [CMatte/RefreshBtn/refresh_inactive.pngPK ,;͙ ! UPMatte/RefreshBtn/refresh_over.pngPK ,; O]Matte/Scroll/PK 4; z]Matte/Tiles/PK ;^5%% ]Matte/Tiles/bad.pngPK ;NB ^Matte/Tiles/blank.pngPK ; 6D|| _Matte/Tiles/bomb.pngPK ;ĵ iaMatte/Tiles/boom.pngPK ;A7 PcMatte/Tiles/down.pngPK o;.,s'' eMatte/Tiles/flagged_.pngPK ;FT ggMatte/Tiles/inactive.pngPK o;8ǵ&& ~hMatte/Tiles/pennant.pngPK 1;G}  jMatte/RemoveBtn/remove_down.pngPK 1;v # vMatte/RemoveBtn/remove_inactive.pngPK 1;s  Matte/RemoveBtn/remove_over.pngPK @2;kk {Matte/Scroll/scroll_down.pngPK @2;Xqpp Matte/Scroll/scroll_up.pngPK @2;0Dpu ȑMatte/Scroll/track_fill.pngPK @2;G qMatte/Scroll/thumb.pngPK 4;)" Matte/Theme.propertiesPK))6 ÖsS* BombSquad 0.1.0 ε 35097280-8da7-11de-8647-001cdf3539a1 A classic game now available in Widget format. hCH^#U >_X o~vx]09Rlr .4Cbi?mYs'N`*Y hCBombSquad.kondock.xmllicense.txtResources/Images/about.pngResources/Images/dock.pngResources/Scripts/BackgroundCanvas.jsResources/Scripts/BestTimesWindow.jsResources/Scripts/ButtonScrollBar.jsResources/Scripts/CustomSetupWindow.jsResources/Scripts/DecoratedWindow.jsResources/Scripts/Dialog.jsResources/Scripts/EventAdapter.jsResources/Scripts/GameButton.jsResources/Scripts/GameGrid.jsResources/Scripts/GameWindow.jsResources/Scripts/ImageButton.jsResources/Scripts/lib/ExtTimer.jsResources/Scripts/lib/Properties.jsResources/Scripts/lib/TextArea Utils.jsResources/Scripts/List.jsResources/Scripts/main.jsResources/Scripts/ThemeWindow.jsResources/Themes/Black Crystal.zipResources/Themes/Dark Glass.zipResources/Themes/Matte.zipwidget.xml