From ebd7e84601eb60fcf53b15a34a8937caf6784d33 Mon Sep 17 00:00:00 2001 From: Aleksey Lobanov Date: Sat, 30 May 2015 18:07:04 +0300 Subject: [PATCH] First commit --- .gitignore | 45 ++++ CrossGen.workspace | 12 + CrossGen.wxg | 101 +++++++++ Makefile | 8 + bad1.cross | 1 + bad2.cross | 1 + grid1.cross | 17 ++ grid1.jpg | Bin 0 -> 28335 bytes grid2.cross | 17 ++ grid2.jpg | Bin 0 -> 35656 bytes grid3.cross | 19 ++ grid3.jpg | Bin 0 -> 36764 bytes simplegrid1.cross | 1 + simplegrid2.cross | 4 + simplegrid3.cross | 4 + simplegrid4.cross | 8 + wxCrossGen/main.cpp | 401 ++++++++++++++++++++++++++++++++++ wxCrossGen/wxCrossGen.mk | 106 +++++++++ wxCrossGen/wxCrossGen.project | 94 ++++++++ wxCrossGen/wxCrossGen.txt | 1 + wxCrossGen/wxgui.hpp | 84 +++++++ 21 files changed, 924 insertions(+) create mode 100644 .gitignore create mode 100644 CrossGen.workspace create mode 100644 CrossGen.wxg create mode 100644 Makefile create mode 100644 bad1.cross create mode 100644 bad2.cross create mode 100644 grid1.cross create mode 100644 grid1.jpg create mode 100644 grid2.cross create mode 100644 grid2.jpg create mode 100644 grid3.cross create mode 100644 grid3.jpg create mode 100644 simplegrid1.cross create mode 100644 simplegrid2.cross create mode 100644 simplegrid3.cross create mode 100644 simplegrid4.cross create mode 100644 wxCrossGen/main.cpp create mode 100644 wxCrossGen/wxCrossGen.mk create mode 100644 wxCrossGen/wxCrossGen.project create mode 100644 wxCrossGen/wxCrossGen.txt create mode 100644 wxCrossGen/wxgui.hpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5f8dbb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# Created by https://www.gitignore.io + +### C++ ### +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + + +### Linux ### +*~ + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +#CodeLite +.clang +.codelite \ No newline at end of file diff --git a/CrossGen.workspace b/CrossGen.workspace new file mode 100644 index 0000000..b5e8e66 --- /dev/null +++ b/CrossGen.workspace @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/CrossGen.wxg b/CrossGen.wxg new file mode 100644 index 0000000..935586f --- /dev/null +++ b/CrossGen.wxg @@ -0,0 +1,101 @@ + + + + + + + Генератор кроссвордов + + wxSize(220,180) + + 433, 401 + + wxVERTICAL + + wxEXPAND + 0 + + + wxHORIZONTAL + + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 0 + + + 1 + + + + + 0 + + + + + + 0 + + + + + wxID_PATH + + OnbtnPathClick + + + + + + + wxEXPAND + 0 + + + wxHORIZONTAL + + wxEXPAND + 0 + + + + + + + 0 + + + 0 + + + + + + wxEXPAND + 0 + + + wxHORIZONTAL + + 0 + + + 0 + 0 + + + + 0 + + + + wxID_GENERATE + + OnbtnGenerateClick + + + + + + + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2ec856c --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +.PHONY: clean All + +All: + @echo "----------Building project:[ wxCrossGen - Debug ]----------" + @cd "wxCrossGen" && $(MAKE) -f "wxCrossGen.mk" +clean: + @echo "----------Cleaning project:[ wxCrossGen - Debug ]----------" + @cd "wxCrossGen" && $(MAKE) -f "wxCrossGen.mk" clean diff --git a/bad1.cross b/bad1.cross new file mode 100644 index 0000000..9b26e9b --- /dev/null +++ b/bad1.cross @@ -0,0 +1 @@ ++ \ No newline at end of file diff --git a/bad2.cross b/bad2.cross new file mode 100644 index 0000000..7c4b30d --- /dev/null +++ b/bad2.cross @@ -0,0 +1 @@ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \ No newline at end of file diff --git a/grid1.cross b/grid1.cross new file mode 100644 index 0000000..4594e3a --- /dev/null +++ b/grid1.cross @@ -0,0 +1,17 @@ +---------+--------- +-------+++++------- +---------+--------- +------+++++++------ +---+-----+-----+--- +---+-+++++++++-+--- +-+-+--+--+--+--+-+- +-+-+--+-----+--+-+- +++++++++---++++++++ +-+-+--+-----+--+-+- +-+-+--+--+--+--+-+- +---+-+++++++++-+--- +---+-----+-----+--- +------+++++++------ +---------+--------- +-------+++++------- +---------+--------- \ No newline at end of file diff --git a/grid1.jpg b/grid1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8cb0b01cd667d9342a041fdcaaf54a8fbfc038fc GIT binary patch literal 28335 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

q3Hd==*ieWNkazw7i{d9F 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 pf7kcUzV2U@6Pf*4* zzM(#Ziwgod4E{jaB*^JQNT&-Bh_Nwb8w3Jb4q3*v2Eq+qae+UOU?&LA;%f+GGx!$* z;eO2Zjy>hwR#KXw1X;Ht<+{y=n2~ z>K2(h9T-R!&&V}_2jjH;{_GNn$a1bZt~qY5jgVy`T-+jD>~aVcoDnbA;$!jGz+YU; zxOsT__?HW;5Ck8{T@6m1n|m1#H!m;eFkF7%=MWwd-Zg*i*vGf_#5w+rZlXJ{-+QuL zZhvN}m}w(fUd{H(4S^Nw#MetmZrZG{W$QL|4Na|GyR{D-Jfv@M*zm~7Q)cECr!B4Q z&f8ybaCCBZ_we-cM*3V0xEUA}eCu{dMCARb=$Ho&W1l8IOM0ICA|*8|J0~|U|8>Ee zGD3MpW!1atnx^KK*0%PK9i629flq@&!=Fb+Dbq8vbJQ=i`325(f${u$S>W%lSN6+w ziGb@`#>2zS!_T=cu4Uew3m4(x{c8u`ntdnu&$+GLxbymQ(f#+HWR?oZshN_+Y_Bw~ zSSPPe+C<@8+TxY{dlz=&e{^O4T-cB6>Vh1AEL(hVF9Uapn;YCI9`NAh=jA;3m-8<^ zmVbM!SbPX_9zy>-*x*aJz;}RO<^%r;3GfU2^Rs{Z1-l1?qWFf7cN_1B=0UntVWoAslW37;3((Md z-1S0lpX8C^jW>3`lw|1;SH9d7dsqeaXll!a)8{=5E-LypQ|nPrDAp$Vt!#*+Dz}rj ziSFfIBzINbbWwVFUiQl?qq5@WI~p!ktM7#PTW++!cWlM04U*Gpo#6>^tEaw)So&sc zNKk_aZ3kJW4|4~#sxvvXSPZp0(mbb)VequO_BrxcO;a0U+}QSuv7xDee+$JYvr92b z%`ixTe?5-#%eKr|{O3rT6dNK?q{W8ZOUtLB$zx^sl^&K1Sl?`Mcx69p*fa_;r`ThD z((@|Im2ew3{QAC6R`!v;?I#uA-Ye>fE5Maf3Mw~x4r`0q*AU-MS+gORbS+PLf3cj8 zBxjSL1Zy;p|9hA-&63>Dh8R-v0-v28{Sw2H&3oH+X=;#MPfcyUee}dLYnxK7LadW- zq|T?k=Y(J%iR3zTHk`Qz&5b5$J!eCv_xMzm-~w${QM^kr*KIW0gHkr9kZ^o7tFfc& z7TS`X9C#>BAx{t3yLyT}%Tjl*U7K?^Gg?AYL0O^;Zr%PQ;XBzY_&Cp@{zH0(?T7pEjZ{!nhAD6gaPi}^N(AS z9`>_RcKceQPS8zRmNy;rEMDNrb?~2u5!sec*Jd>|vOd_XY?7nd^|drlqGbB%4=2P4 z)MWw=`7OHIcWWrOG}Z4ZO{eaVI3ag!uN^kmg^a+Kxt z4Ko3*CZS`Tc>C+TWS7wr{O7j;2zXW&)#=U)u6CRl{ zantQY3Cl+uCa;SyTpxYG)=)me9qw!q>|Y0;cEt*S+p!-O#D>gv@uEDH8pP)eYddTE zF`Y5fb)W7G*UX8tBtoe!Y{*lSJ_KX)ERkh^lWYS=g?B8#It5E(529D1BxC&=0t(^o zd!Ew#OZF*I7lMOLC2V%^RYq(|Fw>XYCVzSPN_T2H(hJXqC@A#7=pqd8jmfGjO>1X# z&!oO>jUm8tRX^Q5`Di}>x8vz2{(1)bxXVvpvmv=V@G}c=n&@q6rcjyKKr?GqzBP^Y)f_yWPra=L7jX$J5Sh$|K{R zc#0Z*fil#fKTqK^s^d&@6$y9Se>qB=g1yC1crx0%p$R2Kf{!z;z8uScjnAd;xvzHU z(-}i4Bk?Fjag2*lhSAEku?wk1FK4tf#@=|O8eS=YCwI=Nr=6H_YzWE4gL~zVq23_d z+{J=%djrM|^)JWm%5CXo+|qQ_-_Fbs$A(l_)7G-e(UM^P)DpxdH7Y{tD9%yqQfo;p zC$#SE`-3&Px(8Si80tkCy|q7hN9>%vyp1=zf1 z!%Z4ECX|3(aJ^AfiHFuvJfc-nJ#3jHXxI$;)^yUQ_p^HH_!gL>?^LH;>8)ZxvaPdW zUxWDkYIGUg-?g`!NON!S#1mrYy!!=9suTs)={=3eYs<%b9wF3qLLm!lK&mK6AfFMVukU5&o?I$cZw=fi;@s~U; zH@+hBO{oh8?TCNSIlR0JjBcS;I?aMKk?^oz5S{I;26yg^Do1QIylj1{MFnx7cYUZe z^UaA}zKzcQ@ACBzUR!m93=4sa79vP6X{23=9v8VXs$b|pxwd)!OG6c0dPCwq1Yf9L z+@+dy#Pd;OrHH&|&z5BdiX<3ruqa+T0hdDgll|i;{QX~ob-B}x+*V=xO@d$|IiUrv z4^2I8u%-x_)9OdZHm2RYaw_W;zXXq)jhDl1Bue?nNJj-6-*?FHN@-T`b(kaZ4s@-u zr}BXkmJnGp$t4L?eGX^d7w>E(-KujXz0nVRPQGu8+?@Y9$nnx&Gk?Wy6&vs}74n9Y zGto}_*bwz8Q1zV|g)?f}g~?idLpbu)naWo^$RIxlqqaF~!LW@2e>YDACMAX6vrE2q zt~rOk+!ob2zfbPu^8BD>saX=WOfGoz0BuIfWc5Ih+kKDE^sBgcGn?+D_zA&pvb4c% zdP2@G#jjxzm=8fsf9ZOX3*L67kPXRVL!7Lt+&|67$<65E)h8e>D2t6qbVU$=lYBnp>m&~{@_T3H>^ zU8U-jS>~xJRdf92JIVVW^?drjo{a`E%k5XhC5`(LEq&(av-HxAv}I1?W9X(JNiRux zc(TQWksn22KP?cPE9Tl-`q~3+vxrQvY&fJ~b?COkM_R?PZ`X?J@&L`8g$Iv+|;n`mZ>t`{1NX;=56TZ)aPJ0?c=LCHQubtj2 z=X1_v)%(oD)i>T{9Txq>|MyP6NV+dI5-cujK`>c6!x?p^{&i?hg+}32Xu&X0p!tUR z!yfjJD4jj^xq{xrLJzSaB7;Ya;y|j)reF-YxPb`G>4R>!P9K)2_Sll9PzX}1Dx9_t1&aT`O0Zp-EZQZQniDc7QSLn8z%oNy?RGmA@hVT@Mr!q8X zJNlr(R-f*gq#&&clA57D%86=S)o#g_6$r(H@9$;aDLkKY-c)}lSAUTSG+v@gY|iI` z(T&>q;^b8}E^u>dmlr+$RLXvANiawrW6`1~4ne*@(d@RL%8lXy5`ir%eO@;i3bQ9Gel&Vi+&6gRc#%>wI$()h7 zlYzO8V3^yC{4XvVK!|SEx6>D-v@mEdhI+kq6 zEpn>9R#ANpSc{&KwLm)D1=1ll&}B3sYCbK)|2;8#7M&w}W7Y#K$E^U9NiAZsy{}dq z?J0gjY6-HqvoG`6ZHK56w`%?=_dRN2kEWV7CN-xs*pN3abDuk@up=zz-SsGUHe_WLT?0G+jKv2g6vCJd z`Q%JVM^HVP*r&|LDDlK9fIm`_dyrZcUru(aT>pDRw6E&{Ldr_q`T#q_H4WPmMWPm= z_7++|K$?o#F>9^n@w6|ZZjFAzP54+$Z1L_t!JHR=dNU11yG2u-pHpSTFbHGhalbpl zB!hZ*EH)cIK0$}Mz(I{bka0K-M!k!uT=mjU+ z921znFOCm6uU*;8AP z>>$Z`!Q-k$DL(g7Fe%---yv{{Vc6#jy@e-Z7`te*(8Rw;ZR9I(w^zKayIF>{t^+yYzQ@3{ELB6DGW;`NJ`GcTL-L&<70H#A^KjL zssRQZTmMg&i0OlIT=={Zd*#F9K(ixvk=iGWNKl$Z zv1p^ND)UL7utaFXxT|)T3Ekjc3eB!|#=k)tRMSP&$@f~)o*G}EHtz7O%Qv29h3Hj} z;8^z=9b@N|$M22;c=G7;iY-sCEq%h+?SEeX`Wia&ONs^XfH-!jis^+mP3jsyr*RYV z@~m3gju$7oay#7%5Vbh^+;L!|6PMZFFl0BX3TE71fzHmzr|+%etP_~SWQTx^oLTav zYk85~H2m?rgwwn?muW?dlE=qH?>tZnRl0s`uNSvM2P_}&1X~c%<$#Dh4v45g>sZ^3jnh5YcY^skIz;38Mq>XWLGd#^rRUYWGsP5JBZ?Xfi6>hGSaEl z1tY1o^wABdemPz&L=>nb%M;)a2PeCVG9R6vODC0fydfOJW_>A0Y}=DG%lM9 zb^T6o{kT~3$%f9zB?YA788A(6;GK=8ZflE|tAb-fupeV(^Ar6r0FWP@Cw7Tz+gHU6 zq03Y>=iwc1y(V-Dy9d2UcZB(dW=D4)i|L3tJ$EPOa`>9`DZ9^|inae;ff~s)e2*S( zV3`QdD2#ggu7_p|GvXY|5Ok5kMQ#}o+QX{<<~YRsG7cG^6()|Lhkiiy+;&Xgc<=Mg z=|?<@I*y#RBetZFw&nHQkwLSL8I@qEaO@4K$Ct`CfC&g<0s{zO40ta=<_+D}qD^5A>{qG_BZMn={ zq@q`%N3uGLiG-KxDSmcwG2;_kYUlCyCrS)r9xU*MY{4~~?A`J-1hVw0I3#=vKYaze z3LHhB(!hFDs0=r0uf$4E=_2gudl?#$C055`UOEf)5v5+fa$b0}a8!W5i?Q9Z%~45X zofCH;*UG)C4SScb=+#5>>*f_&Oyl3x;K?21(Xkie&$;<{+BxwScHZe9qMo)r<@>O0 zOW&F!HC*?~w^yydP(3|h_Fk0BzYz8-a5(WRccnPb9Gpv{9D&iKVe@k3)GKSL=N2^v zP{7%01uc@lzG0|9`YtrVAb*@fF33^kLv9>1)>}!YWF<^hYKP^P=dmFjWFHfy9W-ap z5dEX#hhmQhZ_wd-O+RkZc^}OGA0TWblOYw?Qr?T;Hw-K$h_c zdmT1zK*52b+F>&Q-|ftqf~v)v9O0|cBoXp5w5{XS-Y_bRc63f{7=7`~NQ^83Ebhxo zx(3k~Cc1JaXWXN@f+q9)Tkx|RX`n0@3e=9q*ENqUoYZ&hQC zMf879k18xgK4L=}u#5!gkV(rZbvx{WDu>WyL%_TQC4=!RkeMss+0XOo`wsnB3p{4Q zn%UOmixqcXH&Y9FbxnV|EI}sT_Fg3KJ^Qj+UCOGUO?Q0MfBlRuF~=zu z5tT2PkBGx7=y-(@-TbsI#tY?+oth5W5rf5c`eCdEq)bDgheR!!S4ecWzZ7&wF?d4^Sv037y6ZCUH*R$A~a*t78<5RkR&`)v(#q5MuxrvU7d#lx?1rn%~JF7{16f4y_k%)3-p@d9Q2g-~$>kKWRlp14^mekeX z-*05Jb#jxSpwa^#2cCchSVGjaLM3L^M`YSS`?Xn_W7eNtGYW+U;5&^qSyM)Dr8M9x zUUzufsf&wTc`OqlR2y|MWyAc#bbAAS)115zwU-lo4casW9maakk|UePzl1aP(A+c5 z9#dFr$gVlPW1E)yB_9?rCm_{NjfhwAtXpQ zqBcG4LZbKP)0M;WrbEsS-TU;gF49P;XM;C;dCf=(`tPfn|%CMW6G z%K~%-fODUbmlB7%2icJGQ}Y^_05mAH0WWLp)jG?IVngT(=<1g!Q0;%!t6cJMj};dV zFK`dQ!u`3)2IbIBK~f$DBpP8Sn@!DqWJK8H)121v$M_q&+mDmWl+t9%v~MqaSF?WQ zwQ>iZ7VK}X1W%X<`qQAE3})e8A>cidRRt{)+Xv2ghn0V*yYFONaV4Yp;g$^AxYirm!K`JXOVM)<-B8x6=^int9Q&#dkeFDo<%3RwH3X;gpMO zv|>k%&LNwYZ|Kq};p6exc?p`Bh#iA(WH^$CZuhex7(H$>V5pRfTkYNZ5R%bm_el5T zL(Ry~?isCYydNz=iduL2!tLnO_GS^97G~$Z_#`p9K4Pw0Y=it5BAl?eu~>~)ER%1IZ?MD0sYBhPjj^4!f)$tu`<@B(C+=v5OA znbHQrIMDc?K`|v0gVo{7Kj-zzl9~A(FI~N(PRiBGRjWPR6zlX%S*f{RF(=ztQ9b)e zy-S`OqCj$ZCJ${cAw4v-g1vVi<9xf${ z`fJhn39{-f=Jw{?a~gA84lAiM^_EYhD=XWb{yYDMn1J*N z{c9WbLzbn!0RF@Exa!yKTDYJJ6X9cU(R0(Sy*(#s{uYxy$eM69Ct09503J?r6;|K} z6rcP2jUQ?NjQ=W=iw+X4xI(i5n`I6+<~u z8cGtD(*i)vs@YiRN19MAf8&P_Kq1`4p5yF!86w>(Pe?Z{&2?^iuHp4MUUHsKZrA4G znr_7*Km+|!0K1fnZCaUE_;`FC{>ihQCAAyyTtDRoNzAWr6qSWAxalXsbcQ9dA=eL6 z_B^BiCwKWMbg%yHKWq8Gy~lO2nW8DWUEp8OP;D=&K%>bk@}dF zbJlR+E%N2Ff)ma$YyNt3&UIMw9Zj4p)%QI287qpOEb05lS%2!bJ^DTut152QXP!`SVJucJ$vL@!G)xH-_Usw>zM0#s_ zi;KGWYGX9XBYNw`%O@IJqU`_P$8%%H+4dlY8VSz_CW16MDAMl9h-QLAM-Ef7Q^)8u zs%od+yK`n?-iPa|AojNvB3!03wCacTvk50J?QCSh+KGb>Lw4J&ybPiNz4;scr?r@5 za>?!>$t>cTH?f20MZq7tDEM9E1ih>%33ac$Oc#Im{vXjNzs6j7If5 za^=uYN}`wo&x>8}#76J`yzG8of}!mH-iOGQjCH1|Qd4LFX(&}%DS4*ijZM5=%Djyj z#s1MN;u&HoHh)ZZZSJ+bZ!X28oi)+THzlk&Ad|0mPA8}vTBPlX3qm^)1z_QNN=OAl zrqg8?HN!rl*x7wfZZCUjek-ZkQ#Vzf+;z4>om|XlFB@|X8{QK$ghb2QxQ-VmpX^F2 z>s;{X^Gts?sY9@VF`wvKJneE>a3Fw)DRuS4pT8P&+p}Kfv(KgDQ@KUt`{FyUJPV_Q z)drnO;h91s{F~6T8<8N)1zkZA@i1gkPukIc6L~m5eF9nmhPhMwzO0Xv?#QLWTjyg9 z@^k2?NDhT`>6Ot$mw0m*oMJ=N!HDfL75==p%Sj}w6Uq9zg+wAqj2Mw>xZNjWM}8GL zM+`GQLC&hxCo2S8nx*NAlRmquTq?ACVb!26ki1te;_yj=`%BZEeK{^lPXrbLoC8A% z(RnhTfCsSJ9l&bkGs)u>4dY#8EGYd}p-1voe34wJL&ywyxTz(HN$Hy;vLR~EPj}wV zL81GJ>sTMGFu-T$V^4+!*tYydM%-D~+k-miPd4Nx(k|Cc?I8E-UeO;}eNbfAU7bkz z3mTStIFR-JMBhI+UcVSUAkSD18~q0v+H7`vq-&jYtK2j+4)Z0tDPm;P$I2udmm`PC zQydZie|-t_@9pw z!Y;53A{Z*3sx14oQj~Q+u~YB_^KqfDQZGOGqV`QaAO&G=3(hgK!gN&AJ882YS`F4;r~fd{#+PEi=hTn z_-_~Ppb$#5zXYYLE8epMmbz|d;eO={XIGWAl}Qm-7Pbp{%0#hriyq%?e0s6Fa$mks z7;w~uK%pqt=Z2}DiNdb^5s`x2-*(~X_VSP#^nv>_DREl@jNQgKJ;Yk{+@0F`MY}>dqnr|R*}>&U9H19 zQ8`m)uzJvRg_#mQ&ShSMsq7ubD1@uR9vW~k>(q}BwDF^BBB!X=vzYPz>nt5v++^2Y zEdPzdJwi$K4R>+{orbQff963bZ6y`7ZI!rer4fDn=3SX<-Tqm)RlmX)`0n3B=s{D) zz`8z9hkn%wg>XF?8Yc|%gRVO3_a74mQ|9Cn-pqjdWnwFkl@)-|HLnFf{{ZLqwAf_K13wH{Q#9-7 z@DS$z+jK(L{a=($K;AV;W^7nGqo7n1dH>q4Pfg7SZ|y?lG0i~Vmn-f<7~Hi8*lgVF(aSgHyJ z?r^RjtUZL*Jb=BfD?;I?-k`ZA(&&Uv_-%EXuGE0Q-t z%zO~cutSug&>zA`4IH>mg75UNBW7!j6LGA1uoQasc#}+SXvi3yAR7d$OsT3cbdpWn z+}!lyFHP4f;kbO{?^OfADHAxJzsS+I_}3m_ISvC~NlY_rUJ`$_0_l-v9*=m5GDVQs zkO|EG(}HhjWD$!w6ZwSNSKQ`@B$~yd=Lb?K)gA?diHgdn?=(=snp@ZxNP$X+;)5+^mtQu)yX9(9U+D0crr(z3lXE-340 ze~wPVy+7e+KtOfqu#D~ch~GS2XLJ3y;LZFWpxb|!glDgkiQx%6i%^@N1GT4wo%}a7 zKjt89+kcI;oBt@VxrCE~d_t(%5i#57TEIk7w6>;lnr?#pvVuI-5zNu{fUlw#aAD0C zMS&F^&2hdX{%Ih%f(4ORPuChFW~0mEz0cB4_JtXoXhDgPy582-;#Z9{cc1AtNwzM` zs+H@Ci7=D~E@-1QhPyLtWJsO6lO$VG%p!6g&jkbMP+U#;V7Ar}Yup~}GQiqtQsTgR z_T6I(?k8AWvp$ZIy@BV{Xavg$GXy~F30)c8C=Kk2Yb6~x!fWHXLhVyY^>di)P2kR` zpFuz9-L(py<9W(Lap|YmEPz^E?!@nJnL{Z;;!GY8Em&p&3^35Wy2DgkC?yQP=mgUG z>I4eBLZF&3qw$}^7bDY8l@pn;tl;q+*wDAPIKi5RvIut0b!uCvs@TkevOZoZIZJ#n zD0v1m?RP`3spp2sYc{3b!P+I9Ay1xdQ<80Ah$W8~%u2waD(X zpDT{uO`M|LzwXv^PsrCP5_=(T@wenCfM(k#=j!J{$AkP@sTAOKQ;`%gI~|E zC(o2GKm!>PBp2wKGox2!@%@6)#Vu1xx}j(JjI|XG|MjXV*Cn)INIPUaWLJR9O_d>g zD~d@lHrKlX8e-LcOIM2o<))p;MX!)jors5>q=?^|4SlORAsS%>-zj5In%Cq{-PI8! z%6P576{D*``FM5fo9ry>d3eFjwDpq>MW1mGU?f{s6L$6(ho$)DG`*6*LmLDv!#=V} zaG`G^N|WqbjO{Uk7 zQ{}pvC;h_tuFl~eeqS4*bKkjhFra~<^dnwNEA+zuszSeE^e>951am}OpW80UkElJ4 z1+QyrA9~?WYPUYwqW+M|D+bmiP=jNCs=+b8D3kCI;2||*0i%20Wez}->v%Vd>DYy? zRANZM=Ki5F`K=gKW*nG%`%bgo69tt#(94jTQzrRjc<_^)f;W`tC$735HpfH42CwUC zX;;Xp2$Kv@B z@nFHpb_fS;a#GNaE|PsTrq6`0XN1c7j@J2f$YuMeU{P7;87nAsD0VMt z?}0Tp1awLvU^M_xQm=Q(@YC95NZU@;oq9SzP9I!9hpuZ-kXkqD=o|Q})vVTe=GXYP z`I@8Czf$l7D5qn@?icC2i%Zt#YmPSF^WCNSum0u!rHSN^pX20c^snXcpX4jbE)46C z834%NQ*a`X-WZ>d{Hp(c-P6k71l`Wihf*Sz%KN9`JpQs{c;UjWUM%(EfK!y<+qp&! zBFJcJ<7Di6V|`lcEoI*B>?6_9=9&8(F6}G`;;{{>2)y*C0*YacaTAlnM6I9LQboSP zDxR#03_};b`lmH((Yr$YYGnN#WBz5te2?xAW<{#S!npTT7V3a{0`w|Em-Z_D-rINQ zEiDU#2hiwluSghv4Tfd-VZtA@wm%UgzF}7-^67&J3dovA)MF|eR<(oFHmJ)FxD%}~ zJTMA|e34ufzfYE+fuPy-&FqmV#@GhqB+a4S6RUqm%YPF4Lg16`Y=|gq_Tf!`KHsqK z#+o0UV?e9^9sNppQ|wt1Krvk-wx_`jh?5O!yMg)dw~`jdswPgmKmmjDT`B#%g7rf0 z?tE~+7UL0)&;Z;q;P8u@kHsT~J{Z_2nh)nHzuF;Zof!wpq4SbBGOj*BUyF7fh&xXJ zHu}oD3NE%ZzDXTK+Y5hhwBqotUab=}CpKgUj5^Hfc8Osoe%=Pkms5K-{HYvS@*elU zFg*V>MR2;5_A*Q$R#Xqv4uYzso&2HbY~86$^d%>+H!&TB%mhRv^}#dXUQpI@t(-`E z)MxReajz^Fhy^TN30Ma?73`0i^w;++@Qr&Vt{#g_`Yd@iA^1s0X|hwShlrJBN9Vy; z)?L;mPd0{ZxyyTa;JBFCUZ7u8I0M7B&v1CLC`yU;gbJlu`mg$+Yt4K(>=#ORH_B}( zt{)zsL1A+$6k>*aoZep2ay>J=>@{o=e>t#jEn>k%{8hvXfsloNe;@PvTmSz@|HBce zZSsg$-P<%iyJyvVA)TYmk3*W?zi--fqqnn{S3vZ{!E4(LB(J5Wg8Rv*Xd1GGyFu5J zoJex05C*GPSuNS?dOvZzL1!G^6?--#iHd+Z#C>8u-wOIrYK^^Uvim#uf`|ldUum3{-g;#Rv)Zx-@e~*?Z-burfs&41Ngpe)=KjcCuWCY7) zH@0X9i?~dGUMJ~^2_9@td>HFEJ7M58H6dnuTL0d&i$)fWxs>FpDdE!ohEO2pr1xU^ z()qHhr5=WmFYF2qE_MkPuFJ!AiTD0RU)Lq2yvLT++EQj? zbIJNI%@H|F%?v7#ccTRYfdh1rFDBXQ1Yx>H4@)-LdAc*^Lo3Z>07tWe3ZkSas^hQ@ zEIInKr1@K_s!ju4l^XTZThHWS7EG;nMsxDx+sydHq^mOj0-sP1wCUN=<|tifX$Mk9 z+9WlvCpq6WBsHu-rkyHo1Fc8f1ckH+#>wfWW;soBh8gnbUhpl?TqU=w`>fHycw%sNR-0Vh`mGWSo0hk5>Rogyk=*XHlB8x!`ZL>A+TVt>+NQJfUPbRArYYf zBnTBs@hycx@9)A(Vnkl1Cak}A@cJ3P6?I(i1*F>xIHkd&t+j!9n6*fUh)w6vrglb4 zdb-M<@6Yq|DFiJW?tWfL8J-4!Y2Jb!S_%(Ho(-LH1HnOzbBRbbYqIe5bd}s%!P+sG zhlSq0VlU`2L-Buaa6qq2nVD4aG(z_6O|G-G_$x1HfoBFT%4$Tf)PRNHrHjR!uBtpq za?%b8OmgX!%Png4h;HLi`@GN|n2|UwqB0&UvB^Wka9eGpt9;|Nm2oi_lf!qkQnn?? zMeoRNYj|coseQU8!pot+5iZHnqQy-N6Z}`x+*5(Y25y`*3bh5@lWtTU`bD3%?0Nt7 zh;7JxAxfUam7RPpzN~dx6I+QSBH*nH0B;?gak6i!6h|}Lcqqn#)kfC~eo8xevsGU=r8=+<=#@~Wv8@)4WR#&YA z4TjWF^_I9ftT;YH+wuybgWLtnmjO)I-!Zd=1z4& z2hf3q#!jRnbcr5c7TrAfB`w5wKU$`jaL(o2lUh5O<}=0$K^C=DT?2m~?#Miot-?2% z3JW3Th`xEWpl-uY<{n*lcb_Ndy{9r7M8%D_9gwTkRV^^JxB*)4SK3_`*yaXmuN-fJ z3GGbr?k1Kv^J!TvYmG^;o>nH^JQ098=L0T7&i?E4u6FsfbtEVu^3mIUPVz(wWjoCw zcu~p}g&=<=T1}Z)^fL$E&w5Y^zx}H)(zR&5UkC?$J2ejUy|p z4-H}einZx*d%kVgF0=dn&-;4{;4_x~;`G8=WWn^znNiS71%~VwUcjG+HVk-y{eUn= z`6V(m$rmNjw>{n}+cYWSq(%j`_o0`a(a%an+8$cNdwIR$cK%)R?lyxQn;2lo^B4-S zIXT+bp%&BAsY?oqw>EgVD;;ZtfKA?;>x?dF{R2uHRAGTxsA;pS3B{{Gfb+#4uxy$$ zwh^$XTnN5<*GcW8bzMdkfvfyZ=bb|k)8!V`Jdj>+$VDD{N%y_z-?TBcloORlbc_<| zI}oo)VK3gNvDT?_B$k8UdqZmh)%P1JZTy^ppxxS??8t0jR4>dOu=pQf#2HY<#{a&b zMi=JHeC>cjrO8^97De+m2`A(jyY8umj3At{?#T;eC_IKh)%FYy{F+6FEuu#R&PI8(@)+ zQlPXmK(QOxD@2Q;s*acT_i!7v>s1Vc+WrEoDK~t$ddACO$jARe4_(|#Eyv?!4RBA8 zVWj9E4jMBuVzq6yhV_{F7a!O2ZC}`szxu}BC(UCxJ0s8|UoN$W|LOI=u%j-mNFaaa zBLAQ3KJNb+9mzc;d@B)}lT5%bfm3bC;r?qG$^aCsrTkkch4(8%ZpS+OT_BPzmb$e| zi*B-Z4(nR|)O@h`J+raeT3|w3nvrcJXAEPY%&W05^?gXIV>Vb5j$z@GE|#GY4MTu;1~cv5WJmykO-pQhH~ zv30=#r<&s%UOM80|J3vdT&$ekoqpa0CJm$jhZ`&(be{;o4eq) z+6j9Z_Yigg(Gf>Q0LXp;%mD4lx8&qf$?&8XG&w?ycT9}GOmp(<*RQe1@_p>1Ev^+t z9R39MBs$IMjJ(IZ53>jOR^9!(?g4*pTc~Z8b}YY5Z>ttiIjB`nlz4mQFbPfVSU|wrc@*1A}pW52m-wn?nlTuAL5j1}m zcgOqF)K=K=%x;&aFs*kTlVZTW{ZDtxZqCk0ThWW{T=)g~UXER2v0?QpSe?I)1b*p2 zByt8K|NB4`d>aUZd{y~~-AZ-k(O}n{vnU-xj{6af6w|a#PW#4$DQt*eOz`8>&5?R> zxK-^{jPuxQoWcy8GH0u(rmq&^%=W&i@6u)@OX9$yHo1FIo8*MfQv%W>#VBqJdclaq za(oT=fx^quc*oHf85T=FylEB)nP4ZJAHTl%&P!Oor0N0~?`jzR3Obt&0ldv0yx8V8 zk#!%suxxlDJp@R}V5P;ZA-)WVaI|A&g- z;P(w`IF4VtMc!nXn`+05<2Sj<`f(RQS0{{R47xh;*S^^u=NQ^y>t7mV-p3LOT^YpQ zd(XLJdNXH*fF7SLd+Wc|&@|8r)uJL_&wlajeDl*kcEn+48`c9u zRd1Zr%g-!fGA|2@=CLr(_v+n^j}^SN`8cIo^foCXBmCLUtcc|s0zy9gK}TXu*ED`P z4`}|SIufV>*JqP2vLP+scjA(9ndzdsQiv10c61$-Qf4DVps%Y)k67w28`Ly3R%sQO zGqX3=12q5fkh?+i-)m*b`YrnpuPV8u*ZPNA=F7sP1JV1Bt-(p*)P4N{VLsAyWefkZ zVnNz%x*5ZqcGBY>5LioX_?ndPujb&ZjbGFcgdG^a+c_dG>6i23Be@_dIr{7o-Wyv6 zyrQxahqvI~lJK1h1MrYSBOLO8A*O$b7(WC7H$6K9g{Gj&M1Yhvr-L zMvH*p>l$HgY8ub=J)BX9c%eio{X^AhnX#evj1RNWbu@5d$wDCtHxM`X)`=NZa(!Z~x&Y|Vk?AyeKeCv9vlD~A1XWv=@ z?gCYbFmn?{t$OmVM?x3%WOL4R+uPT@g{QS*#V^t8df@lRI`{!}nx|LC6v&RSF{MU)MxJhIerxw7n1{)$ z5m`P;dFP$p4Xu~dLr=THa!@LQ^3k3CNlMu{&v*4-|GP&~Z*@#3#$-ROo)S>*FW;iO z=_$>kqDO?XArnyk6(@gfP z!tApRvMxhV+G+gH;9dn!Kfpkc^KZNAYT=OlC2er04|5n1y(ex1wI44kU-a00G4YMd zZ7e}?aA1P+O8(-<49gg9Z(?)9^k~FjAd=WBlO|$PK&=;>77MP#g-brqPDQ#OB?lAY zir@$6Fly3G=xSWjn@qZ`gfgpn1?}%@;YZhUd`o%@GY%pCfOAayrSo87Nap9oY02hJc%7O$sS^i45EJhwt{>6`*|c(Iy)$8^=9G zdi{(;FiHe^)nd7{*biwF28Yt}EATn%5NAH+Q{iSop-q}6ol zP`fbF_ud>70nMJPJ{5j9iAF9liNd2P_t&Y(NbAdB}PkZ>OEyoWdVY- z7`QANSJp4?df-#_+cYrv)|3In=M;r z4Zkw~NjRT>Yq3yUp)bXt1T;Q$&0D>poh-i^jaBW6JT{#%ixoj?9S>wRZpNlozLn1x z3eJ9bzOqbIbB_KFY$RGm5eKb=OZD4#@5i)vt!Pc8p1fezlahBFI3v%xfGxh>ng}5= zCs=K*&+x6eE_D3e$+vBuQt3zRiPD;xwS$HpC+n?!J!39Wc(@9m%~@^14Ie$^W1hCH znf7cFsoc{Ij5hyPJ6zg7-EfCMGh7W`5+&e7f%QKRCeIviLFA;ViZFIl+8+9NK4(5U z8)_79KoHRWs~~9Tuc30QjYsWoWNtAldo_y=B=Rd2uXFa_*y^f#Aa(2{?I|*2%6vgc z<-Ks8+|j02f77yX{Pzt63tbmC5Ck%ijhu|tu5G7J z9;E3NO-oyaJ%&4vvW#4Q~0Oi~0A9tp2W|ZO4=}xPdBev4G_$TK^QV z-`Y8WqV=tPIZ=hBgeSn58}}y{Osbza(AL@#0SxvG$*|d0y1p&TlPDY=8B#RrnQT${2EC_i4aP zmw~3*N-E5`#RDu-hh0(iCS_F()(AbKT16Oj+9#mqf&2s4IFpZaUqM#Pb^ag4^O@M3 z&$eb(zLh&&1|?QRX2029EXv@<(_ATv73j4HhP@vSj%=!YzsKsmwc=srdS+35Pig!n zkzCRZu{WC3o4EFq|6F`CYoCtT4`3^LT$wsv8?=l$P|J3YB!2jM9 z+g9+8=(!CprMsxJ-skA7y#}fL7`u((fKE*oObOTH}4tDENGL#=GYT&p$L5w}+AgM(t^z09N%`&(9 zam|kn;5zcDUYWq8FPLbFQX-#{^dknK?A+a)#DjA_-Ef-l6c&26rqC9G1G@pINv%F2 zaAp~|rk~*Aekb4%|Mc}`B=@T_9wiep!Im@MrQoX!mvGAKSc!#I%ij7jp|>3Sv1rG_7{6K?#+{W*c#;;eJ6$VBp1 zln$OEWj~FG1ttGtr)mb+=7j-*@oVc&>r8Su{sOV1vx<71ygAICoLy?Zz!?F1PxtR5 zko%_*K=1cn0VMIoOJ2g^bh`2WpZ3l?9O}LAP9 zc0xkNI;Em4iNc9cAqmZ0V=0VD!ig9}M9hqR&5UIXGv++sv1RK%^*nd?bzjeQ|5aC4 z*ERg+w|(B9_xttMP~DB)xgTygD(VUZiE@(#gw{owt%N1)>LL(9@4}FEVMrTz$9LQ{ zIWE-AEN3dj7rvEUf#ONWKp38yv^{ZLAf)ChI2lqa&-VA@w>a^czxs&K;i-@s@Pzr9 z%~wo%k{N*$;pSdU^^B{AAl#Dc@Ux$Jyr#o{zer&5;=q0vhwm=>K22 zYvWxtLp-RHIDBQUnsX}VPq7~D%&^U8UsNeHMuUY{Xm~j3^ZMiF!ea*q`0xPG0Lg$} z1`64)TvIIF$6__~T;)Hii!G{Y`jNT)3?+hU7N1UeRJ14{No3pZ&9rO(YsnW}=6d$m zahbcPaG9r!jKrDUhxTpH3oGB1wCW{olZSqnX0SdQU$`?_TD}c44_d6##;zvK2AOD% zJqZ{k&PGa#$Nit+whD|6_ZCkmh{LDHF0FFGn;mmpg>JOCVpti#|cc0A@KN_ zL0KBcv){Ice4NBpOb%$S`lS;tECd&L>l52JF|>J#iRuTjpOvmIrZhw|8yl2fAp%uN zIhJ{jj4U!Xzz}4{a<|d=C{JVV+k#iEY{>O=yM_bKhS`25o?B_>(Hpfl~4(sm8bh2g`RzB zZPs_Ilw>1=!es)E6di;aKG9M0HmdS!pgHEF1h8xgv}&_t!KwWRfsFRd1;KA!o9WSx zb&Ut3%h`@2F9J@OXTEoZ%3IOT1^hV$#SRAN2_8dPIYULx7(Oyqp`L*@3gNY=>ki12 zifQYvZLPf1sTZ9aI`9}dmpWyN1#D!G88))U1RGg4-a0F+UjD%1Y~*U%XyrX86N|fh z)}E(ehXW%CcD2`U47((2VFG=RfAel(I`L%9=XA^{_sOn} z{94=*^$v;c=h$VTMw=(E>}LS8JrC5KmkcppO~HJeyYbIRgGV^TS|cW3-LJIxH@qt6qE%=OmYp*MD@* z-%e*Y@pGPGe<=k}pvelI(Wss5s?`ng3ju|}Am5aKq zeF4wkPTZ)714|w*FMS5#G0VC#PZZ58fQwY5H|iA#vop42!!z8{PHH(NG<6Aer`8HP z{Bf%ockIGJqac4r*%jN7kC9uMwI$D-n7RxR#LyRt-{n4(eZk$}-!Gm*3L1Hq0~e3o z(EjtoTe^~Et98^oA3d1I&*A!tbD0Aex{fJQ@{$Arg&Dw7bJo>7NM}6R@8!?_RN}AI zu4p(fTHJt|*3Xj4s>vPqX)i(c2{KV1cZBHW#cHHBlnrwKG8&!ed&thid|c{10u(Pq z8oakxG(ldC<+&+RxBW%%p4?qlb}GeEemWBP!USj4tz7Ll^^F8t<$PCTUk&Cyy|#8R zMK=N8g?QElZD)^A#0!$OB`=nzAzHgQA?mZ!55%NIAKRWd0F4B_Da*-t(K)>-6*4P+ zB04@syKVy+pmR1L19beX+(Y#xmx|$~U{N<8(OCPw4R-2k=`RB3pUOo9H@$UKcE>%5 z-6KGL@UMqfDs~sorB+6bdnn;U08sX(GYVLGIFpza+XgY!>LQ$LXEGjxvFapPLsoXu zSh7@Gn-NnUns+rl@cxO_60r@(sNJg4MO*8te#4bKeq-_5&816kYQndYyGz6MBFcuC zQsaeNTu`b**!K8#>`ky^Bv^tKz{xjJ^_oE%{}PwI5;z(lr1N zn$+7r0jjL+1x*!`q)MPG092*JWmh*>*ZVdz6&`=iuJACOI_j8N&`*OGA?wfIu`Lfu zE}>oQVxOi}9{r#a$BBUGQR@1^Ti?vk%1ALDk0Edl0d$o$&1>QizQVbIB&8=1?q1wS+i*?8IhORl%zEj4Pu6QGUfZj1fk@i* z=`2A3C@-EQ9&3-Mp)Js#(4Mbj!B*rdic%bsVGl1Z(kc8ooX)_qpaMH?Y>#y5YyX2B zd=WOV?~=yGXuMY{iLZ~UzY`;8*Ut>sn z{k^y|o)iL)O|r}eRP@^&=`Z2l_ah>EmUodWLX>9i-Kw|)=x2J##CTc#4w!miB- z3fO!nV2t81tgB9z?xOEc0o&hZO{qOqR^WZ)V-0-Q?X|*)6{4#({$nl#m+fF$5r{8d3l44s=}2$pEe@i4VkL!sxPkl z)M^;_C5%T&?9Um9D4D^#+q@i%X_uO z2u?B)NJLT7hx_nMa}BhfE8hb)*<4c#8d!jPu2TqfBxNqvkrWnkeV@wnw&QI$Z+Hp8 zNnLbf#kln7 z#E0akQqC#ysja^To;+TNdAEQ$Ek34Y6AlTb*|&h&j?FPJ$q(Iw3e|L+m*(y(D4DpVzVmPW^zx=0hkD7nA6l!zp$yreC@}jb=+|l3#S!U$KAGJi@+!S zkN}heq>L?|AFk~DOcA8Rl@ZG@(=}K4qC5p)@U9mdq5D(MLVa1Avcu5wh3wxT)JW2J zOdmM9{;&~ups8*76ed2pU19w{Zpnvr>KGu=ADQ6${89s8_x`UX`hzkCV!^+|_PjLB zrLx`Kqhu5{z@Yns5tNR+yk#GRUB)BvWn$0zpoo6KVa?2pkof6VuP?uC)h^slPqjrcf!fI?xW5VvlJS07onF@_iFqP z3{-Kn=9mYwR3*&SI1)7 zZ$Gmg7e>3I15H^7^ci%9#R;nE#v7?=sOuB?+HZfh&<(12NId`4gpLG)lkp@YaU#?_ zxuTxkF(eJNc$(vRIxG1Ty%cfKS21f;`?wC;l4xM?7JF;cx>a$CHk5UgB&;}XG zZ5hpk@F{bO^TTf<%>p!^3U*NauO-XD>SG5ww)|J0cL+|61)=xw^!@G@!HSPzO&^bi zZ&bQQCaySTlawDTrli-%DAvh*5kX?Y`F6GWA$X2*3NkuD;1v{P?1k8ZK`L%E)C&mP zQ)Lz2N{B1Y9)Cn-?5Y~E*yS36(R+y2Ov^IknvBBDsqO37t(uR@kQjNBwyv3vwH>|$ z*{jWGQkhrGLA*Zl>hBATk!vX%#85Vgcwu`Rb1ud-Ib6s&-}r%8A2}P~d|2`d&Rs8Y zQx(Ik2~sBcN$jVz2>&0;n|`=OG&)tGiwX6NI$&0BifQ6|qMwoKEwa#wESQ6%1Ht=C zDON2HhK#KbV>TbXMq9_`hb)n#|LmXENdmsAt3*Ax8@;gnu2cJH95paF&yeoWm~*s$ zukxuEX3O(m;#F?yCDJWE959pkBz`r;vu;c&V1V?u`c*5~jX1}R4uX@g0C<{XOpCY{ zS;R6@=q?|C*?uPh)Yi#%iE&e1%VT4CsAKg==jOg&o7_(etzX@ALazV^P*ta&%RFCs z?o#h6B=8h3U}%xw4U9c6tZ@q|gl6#p!H)l4a%oI-=sXN4@(_xbA$g2(+Z)V#>TDsQ zYY#eeU`tyNV3%WNXQ)yf69b-gR?+ledF_Er%Ei7xx7H4a%AC*8B+c>2t2QOEI)~*3 z2bsucJ!iyibyPba28=o1pKtK}O5AACr`=-f$N#csXNb4|-&wPB%ZHaH;eBk_O(Q;= zD;2%Pi^L?T{nubRU}7T_gg|To;W#KhKzk>t5JN#zc4!FXBsnS+udsX85&CA?iQLAX zu@l}s?FbHu5yJ}{sMA^hlCmD=7E$9eR5&WD+3Hk%v{f-=nb$U^GRufYc(Yro;T2)^ zaG6L!t&o+bJzs%`R{3tMB;j~ib8}U{etML$S!T%F{b>%*cgTNih(BmP=C*MDbCeXw zV8Hjn3Jp@bb??QC9%yoehBm7_cT{c0f>&BlijolmiuZ2fQo)dE&whX*H!kb`{JG=c z`}Wvo_jHDs#*R?(?j2#Wz+($u?%VMI-xEj&>h8?e^>D%$yw>!4g8toh^qxD>dbOt(^c{K^?=fjJLM^Fqf{tHFS%K9?>+bu%rI2;;*}eU z^u#ar3dGQqRHUONUpTINf&QEkPfujwR+oEWbrw!o9#iEz@nE;TIYE7P@eI_z_iKU; z!gi7DviUfkXh)?xbNQUin+I7uR+$qcY6D? zg-}=0`GkN)-JNun{i&+Y6^e6b!bp;RvYdWGV~2*|21DgnPx%&X|FM{dmtdffZk{Os zYxi9l*Ew+i>6^Rs_vc|c^$@2Aq1jUIl{MfvUxtZm_&P< zAzvbeM|o@``|VOvPCOMyx8?X&86|ACzIyCNlBM~L2e%`~qgW6svPBr(iq0WB zUP%`r@G?SrGYy;>8<;<%)1yoGn>6g}R~vp>RQ*unqeH|hSzp15O%lE~K1EYo^I1sn z&f!r*kq+K#ZhnuVZfiBQdo#r>cgj>m0sX&d6E#0+A#M5Q5IJoz=Jp6h3SZ%qA#thmZ6h!hBLW;<0qnZ z9^|VfT;nOzZ&zO!jRMbE#Enu#jId3QlWkIGjXdK5W#EELXgR)e;p7m}0*@yH+8KdW#S2QyAod-9xti9!*#{#)y3=Q{WQ!|G=lb`*bKj4jF^!Q&-K z9pSu#+ajnz)*crF>G>^lJ6I6_hTxgmZ~w9gY5bY9W|}>CppM^;RnawTN>6#cSxqx6 zSw)4Q4A^2qw?7mY)Uqd9GkGR6ca2ErG{} z8_h-ekR!99+f;~}7yQsv%d(t4a1um_O-d@|6V91IH%l1_ga%zgV~>N$0GBZR@c6qw zN3)tqzInS)EKREa8>C%R`+6{_)oSQMaijvG=23 z=+tIg1T3sQfO5AESl}ibf4f76?}yk@abjCapVbJS)8AiOgMAynt0HNyyLcO?z!Ne! zyEKL3vxy-|Ph>b#8(w4hIQ=WDz!G|Okv}klfTReR5U=z>KGG`zj@6JQ{*ycCtjckq zH-HKxpaSZ;wZAl*(-0i;pZh&}DN+ma5gE{eIKR9N41iPx)u4(H#$km6`_-7IX>&VX zAfS~T-{6+{33R-;nWFl%X4?cn>!}7&beC+uu|8-EP1HCZBZ|65c;~oIqsNQ_q$N;= zJg3#g<$&G1D&%+I$WB!uPqn(Z?MKXOw({1?SI_~~$P$~1j{88A-3U(O2H+e%Hor#( zj{;_d;b}9%$*>7Cg4y9pM~QUHub2^%TL$CzHRHMGZ0U!z<^|N8TAA5r?Kfb# x=Y*tYk!$`{|GxZN46Z-mb7%kj-vkl-;XlLNruErB-@ohc-$Wz&;m6_Q{{VC00v!MV literal 0 HcmV?d00001 diff --git a/grid3.cross b/grid3.cross new file mode 100644 index 0000000..6fee2f3 --- /dev/null +++ b/grid3.cross @@ -0,0 +1,19 @@ +-----+-------+----- +-----+-------+----- ++----+-------+----+ ++++++++-----+++++++ ++--+-----+-----+--+ ++--+++++++++++++--+ ++--+-----+-----+--+ +---+-+++++++++-+--- +---+-----+-----+--- +-------+++++------- +---+-----+-----+--- +---+-+++++++++-+--- ++--+-----+-----+--+ ++--+++++++++++++--+ ++--+-----+-----+--+ ++++++++-----+++++++ ++----+-------+----+ ++----+-------+----+ +-----+-------+----- diff --git a/grid3.jpg b/grid3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d7528a72da1e00b5b9aeab3cf20ae290fdaf392 GIT binary patch literal 36764 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 +#include +#include +#include +#include + +#include +#include +#include +#include "wxgui.hpp" + +#define wxID_PATH 1079 +#define wxID_GENERATE 1080 + +const wxChar CELL_CLEAR = wxT('+'); + +MainFrame::MainFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): + wxFrame(parent, id, title, pos, size, wxDEFAULT_FRAME_STYLE) +{ + // begin wxGlade: MainFrame::MainFrame + label_1 = new wxStaticText(this, wxID_ANY, _("Путь к сетке:")); + tPath = new wxTextCtrl(this, wxID_ANY, wxEmptyString); + btnPath = new wxButton(this, wxID_PATH, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); + tOutput = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxTE_WORDWRAP); + btnGenerate = new wxButton(this, wxID_GENERATE, _("Генерировать кроссворд")); + + set_properties(); + do_layout(); + // end wxGlade +} + + +void MainFrame::set_properties() +{ + // begin wxGlade: MainFrame::set_properties + SetTitle(_("Генератор кроссвордов")); + SetSize(wxSize(700, 500)); + SetMinSize(wxSize(600,340)); + // end wxGlade +} + + +void MainFrame::do_layout() +{ + // begin wxGlade: MainFrame::do_layout + wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* sizer_4 = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* sizer_3 = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* sizer_2 = new wxBoxSizer(wxHORIZONTAL); + sizer_2->Add(label_1, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0); + sizer_2->Add(tPath, 1, 0, 0); + sizer_2->Add(btnPath, 0, 0, 0); + sizer_1->Add(sizer_2, 0, wxEXPAND, 0); + sizer_3->Add(tOutput, 1, wxEXPAND, 0); + bPreview = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap); + sizer_3->Add(bPreview, 0, 0, 0); + sizer_1->Add(sizer_3, 1, wxEXPAND, 0); + sizer_4->Add(0, 0, 1, 0, 0); + sizer_4->Add(btnGenerate, 0, 0, 0); + sizer_1->Add(sizer_4, 0, wxEXPAND, 0); + SetSizer(sizer_1); + Layout(); + // end wxGlade +} + + +BEGIN_EVENT_TABLE(MainFrame, wxFrame) + // begin wxGlade: MainFrame::event_table + EVT_BUTTON(wxID_PATH, MainFrame::OnbtnPathClick) + EVT_BUTTON(wxID_GENERATE, MainFrame::OnbtnGenerateClick) + // end wxGlade +END_EVENT_TABLE(); + + + +void readDict(wxString path, DictType &dict){ + wxTextFile f; + f.Open(path); + for ( wxString str = f.GetFirstLine(); !f.Eof(); str = f.GetNextLine() ) { + wxString key,val; + int del_ind = str.Index('-'); + key = str.Left(del_ind-1); + val = str.Right(str.size() - del_ind - 2); + dict[key] = val; + } + wxLogDebug(wxString::Format(wxT("Прочитан словарь размером %d записей"), + static_cast(dict.size()))); + f.Close(); +}; + +void readGrid(wxString path, GridType &grid){ + wxTextFile f; + f.Open(path); + wxString str = f.GetFirstLine(); + + grid.resize(str.size()); + for (unsigned int i = 0; i < grid.size(); ++i) + grid.at(i).resize(f.GetLineCount()); + + wxLogDebug(wxT("Total lines: %d. First line is %s and size = %d"),f.GetLineCount(), str.c_str(),str.size()); + unsigned int i = 0; + for ( ; !f.Eof(); str = f.GetNextLine() ) { + wxLogDebug(str); + for (unsigned int j = 0; j < str.size(); ++j) + grid.at(j).at(i) = str.at(j); + i++; + } + wxLogDebug(wxT("Прочитана сетка размером %d x %d"), + static_cast(grid.size()), static_cast(grid.at(0).size())); + f.Close(); +} + +void generateWordInfo(GridType &grid, std::vector &winfos){ + wxLogDebug(wxT("Printing grid: ")); + for (size_t i = 0; i < grid.size(); ++i){ + wxString st; + for (size_t j = 0; j < grid.at(0).size(); ++j) + st+= grid.at(i).at(j); + wxLogDebug(st); + } + size_t cur_ind = 1; + bool exist = false; + for (size_t i = 0; i < grid.size(); ++i){ + for (size_t j = 0; j < grid.at(0).size(); ++j){ + if (grid.at(i).at(j) == CELL_CLEAR){ + if (((j ==0) || (grid.at(i).at(j - 1) != CELL_CLEAR)) && + (j != grid.at(0).size() - 1)) + if (grid.at(i).at(j+1) == CELL_CLEAR){ + size_t cur_len = 1; + bool cont = true; + while ((j + cur_len < grid.at(0).size()) && cont){ + cur_len++; + if (grid.at(i).at(j+cur_len-1) != CELL_CLEAR){ + cont = false; + cur_len--; + } + } + exist = true; + WordInfo t; + t.x = i; + t.y = j; + t.len = cur_len; + t.ind = cur_ind; + t.direct = false; + winfos.push_back(t); + } + + if (((i ==0) || (grid.at(i - 1).at(j) != CELL_CLEAR)) && + (i != grid.size() - 1)) + if (grid.at(i + 1).at(j) == CELL_CLEAR){ + size_t cur_len = 1; + bool cont = true; + while ((i + cur_len < grid.size()) && cont){ + cur_len++; + if (grid.at(i+cur_len-1).at(j) != CELL_CLEAR){ + cont = false; + cur_len--; + } + } + exist = true; + WordInfo t; + t.x = i; + t.y = j; + t.len = cur_len; + t.ind = cur_ind; + t.direct = true; + winfos.push_back(t); + } + if (exist){ + exist = false; + cur_ind++; + } + } + } + } +} + +bool procCross(UsedWords used, AllWordsType &words, CurGridType grid, + std::vector &winfos, size_t cur_word_ind, std::vector &out){ + if (cur_word_ind == winfos.size()) + return true; + WordInfo cur_wi = winfos.at(cur_word_ind); + size_t rand_add = rand() % 100000; + size_t cur_len = cur_wi.len; + size_t cur_words_size = words.at(cur_len).size(); + for (size_t i = 0; i < cur_words_size; ++i){ + wxString cur_word = words.at(cur_len).at((i + rand_add) % cur_words_size); + if (used.find(cur_word) != used.end()) + continue; + // Показывает, можно ли записать это слово в сетку + bool can_write = true; + if (cur_wi.direct == false){ + for (size_t j = 0; j < cur_wi.len; ++j) + if ((grid.at(cur_wi.x).at(j + cur_wi.y) != CELL_CLEAR) && + (grid.at(cur_wi.x).at(j + cur_wi.y) != cur_word.at(j))) + can_write = false; + } + + if (cur_wi.direct == true){ + for (size_t j = 0; j < cur_wi.len; ++j) + if ((grid.at(cur_wi.x + j).at(cur_wi.y) != CELL_CLEAR) && + (grid.at(cur_wi.x + j).at(cur_wi.y) != cur_word.at(j))) + can_write = false; + } + + if (can_write) { + UsedWords t_used(used); + t_used.insert(cur_word); + + CurGridType t_grid(grid); + + if (cur_wi.direct == false){ + for (size_t j = 0; j < cur_wi.len; ++j) + t_grid.at(cur_wi.x).at(j + cur_wi.y) = cur_word.at(j); + } + + if (cur_wi.direct == true){ + for (size_t j = 0; j < cur_wi.len; ++j) + t_grid.at(cur_wi.x + j).at(cur_wi.y) = cur_word.at(j); + } + + if (procCross(t_used, words, t_grid, winfos, cur_word_ind + 1, out)){ + //wxLogDebug(wxT("Word at (%d,%d) with len = %d and index = %d and dir = %d and word is ") + cur_word, + // cur_wi.x,cur_wi.y,cur_wi.len, cur_wi.ind, int(cur_wi.direct)); + wxLogDebug(cur_word); + out.push_back(cur_word); + return true; + } + } + } + return false; +} + +void generateCross(GridType &grid, DictType &dict, std::vector &words_out){ + AllWordsType words; + for (DictType::iterator i = dict.begin(); i != dict.end(); ++i){ + if (words.size() <= i->first.size()) + words.resize(i->first.size() + 4); + words.at(i->first.size()).push_back(i->first); + } + for (size_t i = 2; i < words.size(); ++i){ + wxLogDebug(wxT("Number of words with length %d is %d"), i, words.at(i).size()); + } + std::vector winfos; + generateWordInfo(grid, winfos); + for (size_t i = 0; i < winfos.size(); ++i) + wxLogDebug(wxT("Word at (%d,%d) with len = %d and index = %d and dir = %d"), + winfos.at(i).x,winfos.at(i).y,winfos.at(i).len, winfos.at(i).ind, int(winfos.at(i).direct)); + + UsedWords t_used; + srand(time(NULL)); + procCross(t_used, words, grid, winfos, 0, words_out); + std::reverse(words_out.begin(), words_out.end()); +} + +void MainFrame::OnbtnPathClick(wxCommandEvent &event) { + event.Skip(); + wxFileDialog dlgOpen(this, wxT("Open XYZ file"), wxEmptyString, wxEmptyString, + wxT("Файлы кроссворда (*.cross)|*.cross"), wxFD_OPEN|wxFD_FILE_MUST_EXIST); + + if (dlgOpen.ShowModal() == wxID_CANCEL) + return; + // proceed loading the file chosen by the user; + // this can be done with e.g. wxWidgets input streams: + wxFileInputStream input_stream(dlgOpen.GetPath()); + if (!input_stream.IsOk()) { + wxLogError(wxT("Cannot open file ")+dlgOpen.GetPath()); + return; + } + tPath->SetValue(dlgOpen.GetPath()); + GridType grid; + readGrid(tPath->GetValue(), grid); + SetGridImage(grid); +} + +void MainFrame::SetGridImage(GridType &grid, size_t w) { + size_t h = static_cast(w) / grid.size() * grid.at(0).size(); + wxBitmap bmp(w, h); + wxMemoryDC dc; + dc.SelectObject(bmp); + dc.Clear(); + + std::vector winfos; + generateWordInfo(grid, winfos); + + float sq_w = static_cast(static_cast(w) / grid.size()); + float sq_h = static_cast(static_cast(h) / grid.at(0).size()); + + wxFont cur_f = dc.GetFont(); + cur_f.SetPointSize(sq_h/3); + + dc.SetBrush(wxBrush(wxColour(217,231,200))); + dc.SetFont(cur_f); + + for (size_t i = 0; i < grid.size(); ++i){ + for (size_t j = 0; j < grid.at(0).size(); ++j){ + if (grid.at(i).at(j) == CELL_CLEAR) + dc.DrawRectangle(sq_w*i,sq_h*j,sq_w+1,sq_h+1); + } + } + + for (size_t i = 0; i < winfos.size(); ++i){ + dc.DrawText(wxString::Format(wxT("%d"),winfos.at(i).ind), sq_w*winfos.at(i).x, sq_h*winfos.at(i).y); + } + + if (_words.size() > 0) { + cur_f = dc.GetFont(); + cur_f.SetPointSize(sq_h*0.6); + dc.SetFont(cur_f); + for (size_t i = 0; i < winfos.size(); ++i){ + if (winfos.at(i).direct == true){ + for (size_t j = 0; j < winfos.at(i).len; ++j) + dc.DrawText(_words.at(i).at(j),sq_w*(winfos.at(i).x+j)+sq_w*0.24, sq_h*winfos.at(i).y); + } else { + for (size_t j = 0; j < winfos.at(i).len; ++j) + dc.DrawText(_words.at(i).at(j),sq_w*winfos.at(i).x+sq_w*0.24, sq_h*(winfos.at(i).y+j)); + } + + } + } + + bPreview->SetBitmap(bmp); + + dc.SelectObject( wxNullBitmap ); + + this->Refresh(); +} + +void MainFrame::OnbtnGenerateClick(wxCommandEvent &event) { + event.Skip(); + DictType dict; + std::vector words_out; + readDict(wxT("fdict.txt"), dict); + GridType grid; + if (tPath->GetValue() == wxEmptyString){ + wxMessageBox( wxT("Не указана путь к сетке"), wxT("Инфо"), wxICON_INFORMATION); + return; + } + readGrid(tPath->GetValue(), grid); + try{ + generateCross(grid,dict,words_out); + + _words.clear(); + _words = words_out; + + std::vector winfos; + generateWordInfo(grid, winfos); + + tOutput->Clear(); + + tOutput->AppendText(wxT("По вертикали:\n")); + + for (size_t i = 0; i < words_out.size(); ++i){ + if (winfos.at(i).direct == false) + tOutput->AppendText(wxString::Format(wxT("%d. "), winfos.at(i).ind) + + dict[words_out.at(i)] +wxT("\n")); + } + + tOutput->AppendText(wxT("По горизонтали:\n")); + + for (size_t i = 0; i < words_out.size(); ++i){ + if (winfos.at(i).direct == true) + tOutput->AppendText(wxString::Format(wxT("%d. "), winfos.at(i).ind) + + dict[words_out.at(i)]+wxT("\n")); + } + if (winfos.size() == 0) + throw 42; + SetGridImage(grid); + _words.clear(); + } + catch (...){ + tOutput->Clear(); + this->Refresh(); + wxMessageBox( wxT("Не могу создать кроссворд"), wxT("Ошибка"), wxICON_ERROR); + } +} + + +class MyApp: public wxApp { +public: + bool OnInit(); +protected: + wxLocale m_locale; // locale we'll be using +}; + +IMPLEMENT_APP(MyApp) + +bool MyApp::OnInit() +{ + m_locale.Init(); +#ifdef APP_LOCALE_DIR + m_locale.AddCatalogLookupPathPrefix(wxT(APP_LOCALE_DIR)); +#endif + m_locale.AddCatalog(wxT(APP_CATALOG)); + + wxInitAllImageHandlers(); + MainFrame* fMain = new MainFrame(NULL, wxID_ANY, wxEmptyString); + SetTopWindow(fMain); + fMain->Show(); + return true; +} diff --git a/wxCrossGen/wxCrossGen.mk b/wxCrossGen/wxCrossGen.mk new file mode 100644 index 0000000..4bf9de1 --- /dev/null +++ b/wxCrossGen/wxCrossGen.mk @@ -0,0 +1,106 @@ +## +## Auto Generated makefile by CodeLite IDE +## any manual changes will be erased +## +## Debug +ProjectName :=wxCrossGen +ConfigurationName :=Debug +WorkspacePath := "/data/Sync/SyncProjects/CrossGen" +ProjectPath := "/data/Sync/SyncProjects/CrossGen/wxCrossGen" +IntermediateDirectory :=./Debug +OutDir := $(IntermediateDirectory) +CurrentFileName := +CurrentFilePath := +CurrentFileFullPath := +User :=Aleksey Lobanov +Date :=30/05/15 +CodeLitePath :="/home/alex/.codelite" +LinkerName :=/usr/bin/g++-4.8 +SharedObjectLinkerName :=/usr/bin/g++-4.8 -shared -fPIC +ObjectSuffix :=.o +DependSuffix :=.o.d +PreprocessSuffix :=.i +DebugSwitch :=-g +IncludeSwitch :=-I +LibrarySwitch :=-l +OutputSwitch :=-o +LibraryPathSwitch :=-L +PreprocessorSwitch :=-D +SourceSwitch :=-c +OutputFile :=$(IntermediateDirectory)/$(ProjectName) +Preprocessors := +ObjectSwitch :=-o +ArchiveOutputSwitch := +PreprocessOnlySwitch :=-E +ObjectsFileList :="wxCrossGen.txt" +PCHCompileFlags := +MakeDirCommand :=mkdir -p +LinkOptions := $(shell wx-config --debug=yes --libs --unicode=yes) +IncludePath := $(IncludeSwitch). +IncludePCH := +RcIncludePath := +Libs := +ArLibs := +LibPath := $(LibraryPathSwitch). + +## +## Common variables +## AR, CXX, CC, AS, CXXFLAGS and CFLAGS can be overriden using an environment variables +## +AR := /usr/bin/ar rcu +CXX := /usr/bin/g++-4.8 +CC := /usr/bin/gcc-4.8 +CXXFLAGS := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +CFLAGS := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +ASFLAGS := +AS := /usr/bin/as + + +## +## User defined environment variables +## +CodeLiteDir:=/usr/share/codelite +Objects0=$(IntermediateDirectory)/main.cpp$(ObjectSuffix) + + + +Objects=$(Objects0) + +## +## Main Build Targets +## +.PHONY: all clean PreBuild PrePreBuild PostBuild +all: $(OutputFile) + +$(OutputFile): $(IntermediateDirectory)/.d $(Objects) + @$(MakeDirCommand) $(@D) + @echo "" > $(IntermediateDirectory)/.d + @echo $(Objects0) > $(ObjectsFileList) + $(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions) + +$(IntermediateDirectory)/.d: + @test -d ./Debug || $(MakeDirCommand) ./Debug + +PreBuild: + + +## +## Objects +## +$(IntermediateDirectory)/main.cpp$(ObjectSuffix): main.cpp $(IntermediateDirectory)/main.cpp$(DependSuffix) + $(CXX) $(IncludePCH) $(SourceSwitch) "/data/Sync/SyncProjects/CrossGen/wxCrossGen/main.cpp" $(CXXFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/main.cpp$(ObjectSuffix) $(IncludePath) +$(IntermediateDirectory)/main.cpp$(DependSuffix): main.cpp + @$(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/main.cpp$(ObjectSuffix) -MF$(IntermediateDirectory)/main.cpp$(DependSuffix) -MM "main.cpp" + +$(IntermediateDirectory)/main.cpp$(PreprocessSuffix): main.cpp + @$(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/main.cpp$(PreprocessSuffix) "main.cpp" + + +-include $(IntermediateDirectory)/*$(DependSuffix) +## +## Clean +## +clean: + $(RM) -r ./Debug/ + + diff --git a/wxCrossGen/wxCrossGen.project b/wxCrossGen/wxCrossGen.project new file mode 100644 index 0000000..54cb64f --- /dev/null +++ b/wxCrossGen/wxCrossGen.project @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + diff --git a/wxCrossGen/wxCrossGen.txt b/wxCrossGen/wxCrossGen.txt new file mode 100644 index 0000000..6716386 --- /dev/null +++ b/wxCrossGen/wxCrossGen.txt @@ -0,0 +1 @@ +./Debug/main.cpp.o diff --git a/wxCrossGen/wxgui.hpp b/wxCrossGen/wxgui.hpp new file mode 100644 index 0000000..b455ec8 --- /dev/null +++ b/wxCrossGen/wxgui.hpp @@ -0,0 +1,84 @@ +// -*- C++ -*- +// +// generated by wxGlade 0.6.8 on Wed May 20 12:40:03 2015 +// +// Example for compiling a single file project under Linux using g++: +// g++ MyApp.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp +// +// Example for compiling a multi file project under Linux using g++: +// g++ main.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp Dialog1.cpp Frame1.cpp +// + +#ifndef WXGUI_HPP +#define WXGUI_HPP + +#include +#include +#include + +#include +#include +#include "wx/intl.h" + +typedef std::map DictType; +typedef std::vector< std::vector > GridType; +typedef std::vector< std::vector > CurGridType; +// Первый индекс -- длина слова +typedef std::vector< std::vector > AllWordsType; +typedef std::set< wxString > UsedWords; + +struct WordInfo { + size_t x; + size_t y; + size_t len; + size_t ind; + //true for vertical and false for horisontal + bool direct; +}; + +#ifndef APP_CATALOG +#define APP_CATALOG "app" // replace with the appropriate catalog name +#endif + + +// begin wxGlade: ::dependencies +// end wxGlade + +// begin wxGlade: ::extracode +// end wxGlade + + +class MainFrame: public wxFrame { +public: + // begin wxGlade: MainFrame::ids + // end wxGlade + + MainFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE); + +private: + // begin wxGlade: MainFrame::methods + void set_properties(); + void do_layout(); + // end wxGlade + +protected: + // begin wxGlade: MainFrame::attributes + wxStaticText* label_1; + wxTextCtrl* tPath; + wxButton* btnPath; + wxTextCtrl* tOutput; + wxButton* btnGenerate; + wxStaticBitmap* bPreview; + std::vector _words; + // end wxGlade + + DECLARE_EVENT_TABLE(); + +public: + virtual void OnbtnPathClick(wxCommandEvent &event); + virtual void OnbtnGenerateClick(wxCommandEvent &event); + void SetGridImage(GridType &grid, size_t w=400); +}; // wxGlade: end class + + +#endif // WXGUI_H