From 522f24f889ce5367a8441add6a977ff2f829988a Mon Sep 17 00:00:00 2001 From: Mehmet Cagri Aksoy Date: Tue, 24 Oct 2023 15:01:49 +0200 Subject: [PATCH] Release mode added Signed-off-by: Mehmet Cagri Aksoy --- README.md | 6 + img/icon.ico | Bin 0 -> 103327 bytes main.spec | 37 +++ src/__pycache__/main_window.cpython-311.pyc | Bin 20147 -> 0 bytes src/__pycache__/ui_main.cpython-310.pyc | Bin 8510 -> 0 bytes src/__pycache__/ui_main.cpython-311.pyc | Bin 13611 -> 0 bytes src/__pycache__/ui_main.cpython-312.pyc | Bin 16884 -> 0 bytes src/main.py | 18 +- src/ui_config.py | 245 ++++++++++++++++++++ src/ui_main.py | 45 ++-- ui/main_window.ui | 15 +- ui/qt.py:Zone.Identifier | 3 - ui/usage.txt | 6 - 13 files changed, 341 insertions(+), 34 deletions(-) create mode 100644 img/icon.ico create mode 100644 main.spec delete mode 100644 src/__pycache__/main_window.cpython-311.pyc delete mode 100644 src/__pycache__/ui_main.cpython-310.pyc delete mode 100644 src/__pycache__/ui_main.cpython-311.pyc delete mode 100644 src/__pycache__/ui_main.cpython-312.pyc create mode 100644 src/ui_config.py delete mode 100644 ui/qt.py:Zone.Identifier delete mode 100644 ui/usage.txt diff --git a/README.md b/README.md index 2d609ef..13c7b7c 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,12 @@ If you have any questions or feedback, please contact me.
view - Documentation +
+

Executable Command

+The following command have been used to create AFCOM.exe +``` +pyinstaller --noconfirm --onefile --windowed --icon "img/icon.ico" "src/main.py" +```

License

Released under MIT by @mcagriaksoy. diff --git a/img/icon.ico b/img/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ac30a27b64c977a694af18fe3215a790849eae6f GIT binary patch literal 103327 zcmeI52|!KRAIEQ6geZHNDEpqB>>+EBEJI`&*_Z!BmLhrfy)c9}YZ%KIWhsoZW-a?N zqDW#asSHI^|L?Ef<<6b^o?d%7znM>GKj(LTzjMyL_iZ>%jnm>t)Hq|VNhyvSi?~dd zp01;<#%)BNnVCG@nd5>gsBw)Or>FPSv5c$iyEhgkop_1!EvqJ)VSq+ z`*bf^yi##=U9x8n^L|uHXrr9_FlXc&FLk7Zd&Ii{{K*Q#*OXQx~yqFY{AZMl|xqe z8~3Om(C5a5u7)t1KY&Wlehjhg#}h6noFhE@*iks8se(bGp^ zff0c*Ua74=7GI>-S-YyTKjC9FE<3(0>FoMx+Bh?Vr0%6Qd@f^bd%@vYg7uIq-fCl> zou4*>Gy6TfqVeUG8jW4E`2UDlO%0n~{vmUZYj0?qG-gZ_qgrn#xb@W9^xR#)Z*sh6xYiR53`ZL1fL{zakq5srN9TDCChhWn( zx$?iu-0F2g2bz4EIq>i1?zP+Y3f9n@^RDiX}(J~yfW<(9u?cszm!q?w@HIHeEvN1Zs!jz!a~|yE)(>#*Iq8F zN5TAm(aMe*ob~WpZ>Mgtvm9r0E9`XB=gWgmu4^%3cDvp2I#JPmT)(X2|BWaTeM(m5 zMyR3N9LuS-CXM{7)P;jRM%GgsvM2O-%g~Y+;ti{s?+dBFve{+x%Mn)ZYF9b(q%6cQc`duqLdVm@w!!0J=Ju>w} z+(+B14g(Wx{(9*Zb$esAId7eljY{r+uIAyeU-x&{JF_M~j5>ODo>~R}`eD|u636Vl z>}@}_M5<=M(zhoczTWyrc(IDd-VK%2n|afH*1kJ?HR@>wX}%b#yY}SJBYv&Acei$y zCDu2S9ca*S>*PU)HaJE1InD)X?it&vq=Ci3E_^7uko4m;7UW;4rXZ!q8=iMNg@zBBR54~?c+p%#MS-qqE!)CaR3%KNv zY<%VT9*s>UU5a17_>W2X;JS}TE(={1ZM5r`R_z}jHnskrOK|JyOQUvkR{|UDD6;J4 zS#EClFE{?&6IJ!o|5iRU*uHk`U(582FPFSvU{`J5akae@wk@Byz_RIuIjxT#;F8OY z^tWhj6f>|}>r0kPIJKh*&12o$s!uDk&3pA^yA~zJZ>zBBY5U)rnj1B`es)#$u16X? zb!qAEHM3GN`-N3Q3 zu-k3goGEI0wra}!W6O3mJQx-AdRl9T_4^DhoLVkP)OI_e-T3UWB(?F`l;?Ep zmzahGKC2d7jj+|cYpJYRZU)NkG|u#rS{;MHW#eV_Bwt)WKd$CPS+kc z_8dQ|PSULQuPj>4e7cdV`gV79yO+)XuvIs?b;V;9XI-*w;@DoD6UzSNIqBIbkF%$K ztkv6jK_kDNk>L}b=qA}ck6E^N(crTqu3zfEs)GGVlM1_^SrpyZtD@;g3z^o3K#f_o zofb}r)C##D8}A&ja*U70o|q;bqWzo~StZpm+vFD4)xF}$xr@}Dmn?QVTD<8ND~AOO zEuXi4+WEL+d+XL(gD)rFEEYMahJDSU!(3;~Z?#EnyWz~ai48{{+r3kBkME7>dy&=d zO)mEP%CHm7$N9%Z_URB)Ce?n&hA{s>WaV1f5!(_PKkgLz9ygVv5gj33HC`F4LNM-1Tkc z-gh0Vd+ltt!%OS_xz3;J@2Rafs@2D~)5a`0>%6eK?Z_f~c5g8GP^+71k;!A+>^}P^ zSMK<<`0tClJFVKae#TE94*6`f4QTY|X*w%%A==^wn`s>!oM|WK96W{(+@PnN@qjYYBRGqj>!`)VjOQV4umWEt>>a3M%{B>W7gVU+HWq zp;ODhVW{VCx~Ceqz1gcrpv~!SOE0%io^tukye;}s=jQuPo;Eo(;^d~AM=D31aJ}@r z>e1upEQ~|VdPQ`+`rQ0U_?iX@)xG|n_t@X4Nb^G>M~XOZ?D^-qpp~``kLEP9NbYlc zf3e>m-|+H$zS*mKh5D5T8AXLm_{YPvwqfbBoW+D$PQ#bz_j*}P>wb^2eXo5Q{n%&h z)tZI_YMdXWrq9zzW`CanUQHg43{REyjVoe)|4o|` zje~7xny!1%t>hfXTCpcOA6w>dw#9p=JG&i6t?_j=4D@Q&r}Su_>I18r%=bxf-M4T1 zjU)99^TkHp=GGu4+Tel(>KT(t>*P>$;pyNEz3;)R`)F_S7FTKTPq+QthNS+|vi{8$I@j0kj(BtX=!2RQ@2xF8$lg=4^e&%U zIy)QKTxoi@#t_bWwn5#l3s#oj>iv0z%Zf#To~|n#t&BtW?AUQ+&H2_x-I~0IF) z_+a$1b0IHgY4~~eU(ht4Lkg+~3J>)-ZYd~^|a*3jX-iSzb=$!_n= z)MC}5cYDnBHGEfRlYU6$R?RP}Rhc$nZqc&W&i~>yYk$(+j#nBjlh7ASw%mNed*yf=G>k5Qf+K~AD(F!=CJ6W+M!b)Pdz-L zjnleU$*Vk?BSv^U%acWGO9Z`MMi?9-4$gQbb)Lpt0|nEJuq+jvUz);_bkBu@%;v$KqAQ`W#v z^X!DxT}IU1Rr2~(_1}t|H;8=Hz+HD*=nN-WL#LSA&U)usUp{7AZ-@4j>3-`>D)imx zKB>C%h7R5Lb+9b@X#dvpYlCh%Z`|_i)@V9oBaRYs>SzEMS9@li<`OOPllkHMGES!$Eu?p(4TfcTdzrD{whvO=NttvQkUX9(U=rzw^|)52oyRKf3o=uN^j8E%x2-HuQ0PTqnJl<|Cf!xcSu!8Kl$C z;$_KF(|kf6^xijVt;f>_5s?w5BV+@bxHk5<>!9D;@<794{uM`-7-n<#q<6Dz;~bX; z{x<3Ep%qukUoRWb;`7`3Cxg2?n%eznbk5*u!<1HUc3H-C^ct-jbb4lp;o}Ljo#w|T z3_0zaSfk=ijer4{dph_ZoKexQxrJuatG^mH8?^UDsNT+uQ#UUfc5judmH^U!(+PLrN4X^M%Q(!64P{{?{eM8Debz3M;&Z*#gkJzbGxsV zddb`UyVUskL|yY1e>d-I)o|^K@%Nu^ZR#;>gQeG=kPeBK?s2D9>@2fnq`ARb?t-HK ze|^{E@BJ^wZVqW*%kkRT=6XsWsFwL9%qv!O<GVe?jq7&gjYfpEGt9_F4{!$`a@!kG`FvNOVvj)sFHs<&E%_8Ob{M^iqZ-yZo<> z(P{xpFa*#u0=~M#l?GCCB>k%b3t$8AbsvuGp$^1C?F|5Li?Z?xlwV1ZPjP-MvCZiV zL3t%^7+C5a`z7*ql_<4bLA!UzFE4NBq@d0=dHJ`3toon)I1+?`WFVgBU&!kOcqxJi zrB8q)Agmvc^e#{v2!-~+6TsJ{IwXeRE#UKG5vMgkvLEpIDToiG%si4d7+10cKe?`?^LX(78}*}5F0_jx|Mx|`e*}F| zoX!)H{N(?l(B~cy+lA7zft1i$_zFn1`AN_qFa1xx6t8RAYqXE?JxlHbpfvCQ4u~fJ z;hYkYrak;gl>Z26V?ZM1e_BhfK-d?>mjaUfNSx=`RQ5YCDGJ_A$-bp34%7J^QI&WZpatp5;cy6#s1bUusM`wHZdNco@cH!cCb zKmHszjXVvI-~4Y1ooKD|`err^l+O=An&g%LTVwPjz|VvB`Okp%rC8LFQ3J#RzCML% zpTkE;LhW1t^~2W*N4yx2@_#kt$I0u`KDjQB(>;{|$Z!6qYe1M>M}B^)hGd(GKqz_T z|DjMq=quX0w2u`@Hxvl36?7fY7gcVFv~W#*K)NcB@;|K|etf!qtdgf`Eznr`&Hqp- zZGEfib76ftU+HWWiX#92j!JbU;O~$5J~Dg%KLQ;Hb-RzWvS%zylnebIjdUp>6x!3| zbG~1?C#Vm^{`WxMMnS!ch<6A4J;Z#(^P~S8K`-I__<7Qrj{uM5(7h91CJcj-PiLu6 z6#1WQO=F317dA#bv;L=hI{unVI=%q>b2*~_5gJG6f4YyUAga|AY2p5->t$^q_P-bM zZUNplYY?vpNC(P00S?OJl%{hcFQ5M~e41$BFRfKxZ$9L&S#+%<)=Si(x<3Q4DDpqw zw>b0^b&y&A*FisY9`XH?jfaT(7AEN&7q4sDvqG7I1b?PezhoC(Aof4)?Y{xlq59T< zo|jJnzMa23&ezEg{)b9w_s67@5ZXtrs1QQ?`!W!gQ~V>S0mPD5{-^u-<3OnAbEL@^ zdVpRRBHy(Dq&KAx17UsI3$*~<8#M+Gfw25nq{**h|6fHOzfNc!R01T60kx-l0II|H zMRoIw|LZ{)sns~{g&Q%f%z^@Boo&4l~+6Tda*PjoMB9Hvr z2k>*?%P5=)q(qVb$pDL^L1M|T`Fd6g&rGQw-r=7r5uo%#}&<)T% zgIH)Sn1LQ5Xx)_rLTQ48xE`hTg_ZI+u7UB70r5Irk36~_iu30pPmw6{|8_K>am0`< zY0vVK)&0-+!$Q?8FdEgx*MLam(K#UWKi$VP1ByhE|6icNISGQ1R|D|E{Lfn=cSA!A z_YMesEfo(%onlH!>ne{#Rz5{9QH- z>hXS-3h91W+1XFCWBw;A6ilfAwVwdG4oE@IGTK0yOhchmTSa-VP`{y|Lw5cPjFAV? z;uw>jg``k+-RD)+QqWeaKR%DHJ-pOGgq}N8fu8A@FbgmXFbgmXFbgmXFbgmXWXu8@ zsOAsus6Zg<76nqW8JVi|m7nX<`yW!$5t*v$Z70=HKFHIA4tIgn^S+|I$EdI9SwQN2 z1V#Pi_x%0}{6p{StExM_f1DqM`CqXwng6A2!}h(Z2zlnGiCP7jWV|XrG3Ws zzqDPHtx2~3RkxWkd*((N+yBx&WBXs)F3Q#<+yAQDOqo4%qm1o;X`iwEFKriPYm)7M z)orHCp1D!R_P?~x*#4Kci?TJz_P^>jQ)bWHC}aCy+GlM4OWQ@+nq>Q5b(<-(XKs|S z{V(k^w*RH=qHImF{ja*sl-V;k%Gmyw_8Hs%(sog{CfWX1-Db+{nHyzn|4aLf?SE;z zC|i?k|Eq2@W%kUCGPeJvea7~`v|W^~Nw)u0x0y0~=0+LY|I$8V`(N5F%GM;?|Ek+e znLTr(jO~AEpRxTfZ5L&0lI?%hZKlkgxlzXUzqHTT{+G6kvNg%}zv?zqX3yLxWBXs) zXKepV+eO)$Wcy!rn<=wrZj`b8FYPn7|E2AsY)$6Z{ZHRXrr)g9Qvv$@T;XrFBKbv* zA*Rd@1*uHY{-^Iut70#ztLXOts0^_P2QIz>V zN6cDaI%WPZFs@2dl>Yq%N8pxCM4+F7bdRr0SO09X3E8#_$d8hl-+xkOGgcKjwet|NM9fVCR4CtV_24bH~ovbzWz8Kg|Ek|Lpw# ze%Aoo|KG3g=~}}4&-~BM|L=DVu>Jr2`ktNt-?#6X|C#^U`Tu>d0p@?^e|G=>{jLGF z|G!_~=jZ!B`uvwOQ03p--j4d80nO`sBtk`dk!`zz!Xni$kq_W|^gYe_aA9#|Cg;KY zpGm_Nl4i{Rg~XAWoCfoMCJk3enlb+u5=Ulo8qEKhG+ZHR#{6GM9GS^!F#l)LaD}89 z^M4_6WG1J<{GUm~6_RGm|AoYnnVbgme`X@$sG5ubc#G} zS_D;4&Zk}IpZ1|iaGWXrh4ef1f7kz3n&zApkzsym;>_t%KP>%y+XGuPeLc+MS5?;1 zvh?2QuY7%d$zbWU{ifU=bONS}+#dx!%`dA$5!Qig%zzB2amM%yG2^)DWztDYvp>uN z%mT~;%mT~;Id1_&3~^ln&2oPDJRhMNG*I-L7#;ImyPQ{`AkN<&W^t8cE;7+%L0K=v zX?}d&>7u%n{MP*G-%RcUJi%VD5|jocW?(be1*U-FfTS~^F-<^Ed7Q$=^7wFsS&_wP z%&*z~f{wHhe;$1J@a*GpNr*N^Ph(Xc-17WkBJRK+hJG{sd@@AfOFq z%G30D^P}=O{r(Dl_MGbd3bG<(M;e#Je;es?a`-i@%>T5e zsqc4yY{^RvM99v61Afh~L!9c;znjO;pY{snZ3nbgmdVpuojYq&Z$|VwKE$}@ct(%4G?KmT*`ybcIyy_}Y( zvt#~s&==X1#@q|&1x;FOl#T_wUxf4LZA0NTK%#8^W+*=asQy)84`_Z>z;QtNN5Ne1 z0gygz06%|PHw5YC4@fU+lO6M?bNPzAzvl?s$>Y@jF2IX${t?LRC#SQ#g0lH{L>=;b zFrc+VeG_#7+2A7J^JyqRNiqxY?XzS4)F-WZ>XUTXE{{{XKj1|;|Le#s zB7o|AYyMP++SCS}0G)ptfP{XBt^w!($^%~LY@suP;PZ6^dHRTFhZv(1+JiJ_T7MMA z0bRh0aQ?K9pU8l)(E@ZP-ve}CDQ2QT;Q=`B3d_&8mMc^QfbpP!Q<-4pP_-wTSzJHc1ThLFvl`Jb(S>AlVN|JMVCoqy76 zM0_@9HO zzdlQK@?!p)5;~ENTBJ}eOJ2-Bm#3(7xWYPry8hF9D`yC#o**!&gW|K){mGcqRgfA(zvw*J}rSM>aok-eA~b=dyT-u)kl z?xfzkjzNB2_?I6uT!CKevv2xJds>yp^Bz_W? zRzD9Be*RF|I%Q?d0?Y!;0?Y!;0{^l=CVuQ7xMO;we}&2V>cM!WG&MyVA?^uMI6mae zwDj+?WTwH$h|4_rrK08&V!YaVq2Eh<*`e`WHhjg7*jYQ9_XB z`{l>t(?UH^{hLDHt9uT@fR?=WV0qqSga+WIJT3gL9kMtn{q>N)1JL&~-vC-;9l$L> z-&Z>Ys)D|N-mj+bP)39C-~dqddlQY&hOSVAJ6Hkebz)i%!9Wwd1eB(=E)*&KXQKku zT?{Nh3-A<>eMo0oV~2qahzIoDs*iwl4+cR%6(PToZD>sTp4w-5oYGSOts7o{dacJ2 zm;e$f{dXb%J>Y%$1L9;G86Y7&pM&Ax9XJKZ=274RP*s04`SShbBZzkZG>>FZ83^^K zIT0R!L`r|MKj};MCEcq4vUwn=4(Rpv%U}qgdBy@-m(&-nqs-_}w;-f1wYLMLBYnPs zM5sU6iTq7IAd%9)4Dtg2+29ix4rng4R>-%nKxaUCG)^Kg0Ndp0%;-;N5UqK#8~Kp> zrF~5z)PEMz^jZ4 z1lg%3AQ9@%m(yM(QKWx*Y3}}|weAgkz%oESAyEfw0Oj+@5GSF}^xPA09&xJAL^TUk zKy`Z&w8u#39Gncq<(W;>Iwxrf#C_17$&55bBYti3AzjNzXuJ=A&(CUTM4dvMfw(XJ zTuZBxZo$+8^xv`MM6+`Tx}x{Mkt%J3s$>epW)(Vi8vI zYB_cP&`C5NjZe=}*)2Jxe|GAriO%RbNQ#=sr`HFBYd9-$dObpF9Lg&SG9yjUh@O8H zkrjQ#Z553{`Pq5?i^t84G}Ax()_G?9#q3{j?N6^=iOI|wP^FD{yv(j2I{)c&SVHKv zHdS;{wXU0JJQ_Q*=RcbMM^b9(c!LcgMp?{pa> zouW-21N$2C<0Vu1JhaQ9#%ndCEur>r0M#X3NN4K%Jy;4_0pa+5NGAb$k6jm#&Ny|_e#cyfkor3Yu7Zq= z?~HoSz$!p`7XdUry)Lx}m;>SXWPe`}3g|wI>d;vCKrcY=&rb&QS%Zv>Ula9G0NHN? zAffT&!8FhTh{vbT6wvFMI)LIo08K!j2Ph+tQyJMOBeE5hf1TTX(OE3+OWvizzyu|BBCa8w(S6U?vlsR8BhncW z;r{3Q%8oEI=TCNw%lE;?&xrRqj_w!7$Z;#Jsc$h#P$qeC7k~{sSH;=&NaI z2*<1g+t34}G5GR21+G}R_&P;Z3_Tsx0N)aNmYD;_0=h=h^HmQ(`+XI#1=QCNFc;7@ zP%IabaRUqoA%LD|sQpPm*GO+b&##oGXF9P=MFy331p(lHARf^7ABuybfbJo*mdCH%2;;^~AjC2!AUbi0sg~%_;^fy8|J!6^zu`EEw zA#fFl=gp@N%j@(;C>EMOU+-I?l>KOYS{usRCZL?29i_%ccG`Cel(oN0m6QmrGg@zo dpw|epRp_6~O^VOqTYSGMl9EUbpOQ>bqDa{eR|zv>jijN69J;4zn~WCl z$8KO48|;4U!UVDbCV-?&AUl|keDE&@k^l~pkFG%hT691lK=Q+%K#3Cs@JEnaJyX?P z^Oh(eHsF@jRb74Wx%XDxs;;VAqrWIEEmGk6hd=lqe7jpw{*^uOt012Fb{H~WC|JP` zzp~+2actzR&iWBDptkWpC z=Ue?yTg$U?BgixP-#Qx@^AktN_R`8?$8!+#f{Ridj8Z&VbP8C8^Phu+7eb0jE1vAM z+Hvb?-O2NsS-Y{P^<%trUC_#!$WNv$W>eCIor#p%8H;FL$b6Du=@VtOnA1H`)xH$Gl*4xz7;m28EAk;;D5dzs8`x8p zgFQlSMtjP+G8x;a!bT8NV717nvFB_Gdn}&Z``nK_ z_PWl!-rm%A?0rGheMaBOtuNHrd`INd_|CZ$zLU+Kbl+3EJwk3qdunZ(iW!%z5zJ)j zY*Zqj#-8&scfuSd_57ebP2aZLBjjeZC%3-sve_f@Y3!*;VUNX=yN~|JqpW|Q>mXa7 zyO4vA3i~qpXl`Rjy%N9R`y=upUMQuwGKG)6sXg{NxsaRD9%}`eX>A9q?AQhNi2Q4< z?bsTr3RlZ(q!gB0=v<_f;+jMrX~opYiS2sI955m_*{DSRwbynQCx??#Tr11XuoeDVF>#~iVb zqK!)ALv6g&o?=%Dtt}oqsmSB{6g=526{z@34wmNDFWR|MP#+@yTK(b}Zoq}OF>AlD z(78w{#Z8HIBDI@XwcGWSIl$XGI3!Ss{A>3Mi<84iDQ=eKCU}^Ad=)m!9H40@hXhSU zKEw;96t~FSX1}m>Og*PbH%GINuR?Cd@ijMly12?CWl#FYZ;ig{kv2->uVzX2+df6cyh5x3#?tbNHs=OU#PcgVUWcxW#tw(BW# zfHi$KDv^KfzGQK7I4Q-QvfKns?Y<{$mN`Jvehvxth6q>tBTy5$ zr7>!Ni+T>37yJSCdshef186AnAzmn@xI3c^`-&-jjSO)}kSFqKI5o>HTQTMkVs0%e>T{;(k1k6n|3IEiOB;$m798EpxI_ zpeAxlHrnTU>218il>x~jAL4~liiZ;A<)p1ZP2`rewfB|u-vT^imzp~CO1#J#v#EPk$){~+~8@GIap(%bCFVtr!rcTo2R)s zBv>QzuVu|NSTmD@r&;J+q?F>>L~9_TKPi#KA3)PIzLqdcn&R9kV(8Q2ow6?SAzmn@ zcrJxzGZIPs0W=d>i9FJnHp{tFXf`L_DeEF1;)PO*ufMUB>l_Gl7Wp(%ZX`;1qJ(a6 zetVi|4YY??AwY!rCZ`R(!*ljDnHwu`OyuT*k@unIW2aJl|LIVaM=_pP6GrKpcT-b6 z{*TQ=D87HoQVWT$f$@;7SdG(`A+e)4U`L5n zW?41Jp@t6s8W<1%p56YDL7e@_t7^VAk6%*agj_0A?=?<84yeA}z^2AIm`I!H{YH`X z#HEfH1s{3*+ulPK+cb)|)W9Rv8w^f*R0DCtd=FTq{1vlphiS*Ql_caL-*4ch?{67J z9eWvXx>4VMLy@h9`hEY)XuOF41HOL;5r==m$_vbPGYW&6N81iQ07c3?Ynm^x>E86L z&U~PHHjScK!F8{Ht8LyW4SKcP57xbF+Ja}pYa9dpeY;)&@M=@rYA~RxW|JRZj6azz zp0}tO#cov%d>kt^P6GLRzD*qX`1Y1(&8O|CY)8&Gz8GshmHDsA4$c_GKso0PY)}!T5&e-7pGgeO^B{37MCvEPSKJT5j=RasO^WuH&b za8CHM${I;^vEo92=2|Q+$30oCXRpqI1@3JvFzfUCCp~K)JW>POn^#*#2MI<-zZtU zWBH@XR;y;^L*W*5jUAP(OjWiBQrYT2Ws_``&0SSCc`{pcDmDwn&vl;YzH19nhD1XbVd1B6HoL&oTZbIWP`2$*Ta)&uz zTb|(zdi@X8LSPQEA<5$}%x%cbee>VJd zls1l#bEEX!C_!Tsjp=C21geUns=XX#X^E%~012Bd#%tYhI$ZC~Etv<;%`UaDVda{I8ct z`wiNDgP@xf-PF-dPSz1c9eU?DK@${B=xE}gvXNHyM4YsDhE&ed%GuAHzbFIZUzEK> z?NQVo?hAV&ry_2GhAA4>(Qy1-a}+g)`~(e9G@zq_gK`%wZw))?#jB)zoR*IRObH_` zd5IdLs38QE&_z*~j=JIi^-)wGs(JV1f~G&FZ44E|f=5BSnomYW#tgCe?3%pm!;HS4Z#uSidNB8)vGsih5dcF?^P` zjgyKAS}_4`RLWeV^d)MHqQ=lof_fm<_N0-fSL7JhmD~h_pUV;WG8r0EX+$mEJpk}i)J?)9X z@58raoT70ZjUP00(1wA?G##8J4Rf?%j`@9^SwVHN3i@jH%lZ8?`)gkhe3M5y-=UrF z5HwHGypHBM8Pi1Xo+N0BqA49sS)J(yslG|8Z%Uo1Gm1LHi!oCP8lh-JMtDYGJjR@0Y4S3k2P!=(dh-bF!W& z3|qaH!yeSO(ps~XZjssrTD!nNVR8eYRWDI@6m^F`jMPUK_Z_y0P3$F`gy`*KmPd(R zI7up|XvI{r$XYKo$!(0gGR-1{i%(@`IP(Go>1p`Q{oMA49r zhIoT=9f!pi$NHSikcwGa!RCbNzjbyUZLKCganq!FhE|)CRq=^qGM_zs>W>WU=fjZM zKw4&K%M3xY6wT^r)>JK1{~RObmudNBTiv;$$o1^})9UbpNF$p9lllo-KS9tnimvJC z8X%_VVb*|mja0g6rQ6ojtY<%)eL5dG9a-9M+*e7{ByF-r9R>(rpah4o#-g`q^|@Ml zt~rEhOME#2N)|EkuqdgGqS`#Ok86Yykf1%JpRg(G*^mn3NJU3RDvl$S92u!J zj&$P4NM&)PlSf866-PRKWTZ23q_amxIu}Pee`KWcI8sGcq+;%j89n?$0uGEA($6sM zKjJ&8hnEPAQX_E>uT0P>xvykH;vQagWF+q4)kj9+9$s@~B<|t0M@HfvUY8XKzAdpU zqc^z{aFV@A{D?FoPJLD!wsC1*M;>>xA#ty4NYE+SE3+YSugvb>*^szbX7}%GNZczM zk8BIA?Rh>Bx%1LRsdO(XP&{IN~S78F9L@;)owbWyI;uio*hP+3o7d zio?Qr*>QTa;#B5@)0Y)T{A@I1{q$$Wsm@8CghP5s>kws~1v$+tqdtR~^)Zh$3@wvgfBt$?bzut)Q_%(&n~uj*PesoHi=-|{|&ps>q~ z^10j}1Oq#}J+TO%ON#Kh;?X@<3WlOPx9={ySS)dDw`kI{ja_#k^f+doj@T_+^77YnL-@$Q*;7Gk2V+gmI&8XN}J`xM>R(S5eR1Dh<>QB=LRvbPd;hW(`GGOe-pLUW^leX!U* zcxX4Y8)@1vCau%7b()|Vie_{)!%z}wj*-?0+A43*{eRLNC#~0L>otPh6uEWePNnnP zqCuq9OGD*>-jwX|9d4tqkp*7Z~St@OEspWja;u4v0-WH9Mv|gpH)=qaSo!^v( zM=aO(*28DRK~g&a5eg9@07+(`#Ed(&huXu-kzvv>MjNa^1XBh;VgbX@N@ykGjC??v zCuy_1rJG2zM%eL$%sAgS8cdom(`LC7C)#xc8Z$^7YluH0wU=qFEJ+$r^zJ*PW|7t` z5_FfMyE?kd8bTror}A}~B0y@!X^nkYGaJ)VMDLjWay@$&tpC_&n>KYMejNq6N{8fGMIa+8dFwpAiCQO}HSK*Vkx)H$J zewHs;UHx#|jAM+2}Un(YF>`TYyLMpqlZH*xN`OT-|&#SyUc?JEi6x$s;dke;1 zDap4OBm-J#J7yHz*;&+v%-Mr^2r+i1@L0e+t!RoSa5!F_R~#L>(w^?`t7B974$vy~{j=HsFyH)Fn)jv>{|94sI@sgTZULyW~<5CC!>l$*@9@Ts`723N3P%tFR)1q;_Rmu$(C@dUkif z0S4?DkX!^?s(5M3<;3O0N>+?wNW<+)dH02idk&x7xXSu5H)tcD|lhX&xgew2Sp(yHqc=%k^@5u0AK) zGr@`We0^S3K2Vs+vX2#(^{fNEzJR*La;WFLBI=9GX8FfT{Up;iluDuh=1p(6?ZwV& zV~6|B)q7F6=bU$T{CKywRc(gt3+*O7Y0!fwU`MG{j3j&K)>g}F#wcv=a<9P>ySsNk z-tc!ijUcf^IS6C)%-^}$@H=}%6fW5r%{NNSRE(_+E6=GXpaYqt1|`Twb~|F z%S64d$9Wz-6U%k|jvu>jl6{Do{m#x8YGOoQu#J1pb(=vWid^>#<>}Q6yJ6d#+|>&k z9`-jlzZ$mNy-vD2=Rf%P#`)Vk+~JM(g@`vV^nACCove2EcoAxaq^7(7(>)sDureRTl5-qZQHI5SWWR8@)1 zVV3EKC}FHM%ni_2l$A(Fi#^PV9iqK4YW++v-ah}$MA`Z4zoOqieXEk^wBAIIJf4_- zbgS!i5{qyX_#H1Xnb!=Nmt?x!@5G4_`)yRB!1KC^g_e)daW65vwjU?fHugE%^;kvY zb2O(xQ}6{8C0P`WbO_WIQPor}bxt)jOS4p4EvV*ymh%04x@FX}lBWagG};~x(01K+ z$a(>l3$A;=*9hbjPTS32r}_0L=KNKvW{A*%@MU^XOpm(h1%c~MEb9byp~VQikot%U zAeLC1p_SA*Lp*r~@pO9cQ}>^Pj1W(H0*KaAWE(8QOw=n*$Fm}d!8+@McfPQBs+zBku9;)xR=;V>}A}`>=kwf_c`_|dkyy!>~-eg zKF^lf*Kl88XK~`^k~|^PeJF%{3VI`v63`5w|JqqxCiHweRSQW8Dm&T87pS`E8<>j9KunO-rCIPu1_Xpac! zHe}M&On}Y=;QEV`OFdRZY3+2-VxI^XG1LtSUaD^T#SgJ0XMKcymA{Nm$1Nl&(&F8b zlvL3zqL~Y7|E0-gO!b;NGabEY6UAC!Pn7-wgJOu4mWnge2y#Es8+xn{je$DM9E#Jt zt8~t)P?Dr74wQXuph00|gp$yP7Bkb5P!mF7SS%~rNO|O$IO|UYw{hWskWh?E;$BAY z;&2YMoc1rbP7LR%wY8A86kCg;XW#nU-SfOxjXz$uZ@l zmf@>oC6}uus_iSkQk5qHc50F(r4{z#etGrQP3LyVW9K^OAz$vVZFm8&IS*h5w)dQP*E{N3>$SH$UVU1uq5G2WTK0b4?)(6Ia>H5&JOQ2BX=4UD}H8!_ZJBc`wDQu&+h zy_gnlwxb<54zofD-%PoLD`1}O6r4O zA@UxPZxNA)*bG7(^KrUo4V^y16^xP$NrET*SKc1n|Tlq31t@@SDUHGcdwo83=7wv_aTK+mFx}O5mQxe~c2mhC`tk zSoR*6V^(Yrv;%cX+1ERUEbqgfp=W+rI8>IDfxZNv6?akqC2CcAMDkcwvj z1JRnNx$&Mp%EoYk<p)TQKcER`EaNq_eFv8iLJPu0PFP7Z zwbQVYBzl&14*pL`m*Qxk$D(HZyP;d=v=AOCkSQS~uZ(~%K>TMY;6N2_33pvu6gavA zcoJl}4h?c{qeVJkf;7v#gmCFV`{_JvRtoKX9oEYn2!Xwe84UanbXDnCmz3z@LkI)? zKfxtNWEo&j^8lb$3ZWd}Cf;4KYwP_}(gHX^C?g*y4xJC-*$YHvzEQ==3GXFQANEUl z;A}J=z+Ctp=W<^w+M5-NlLF(!Wm4XOLdJ87ooZ0=i4nq^=C`TCCq(E_6SL7pE2|jt zoZvO5z18g`+um~ti8BY4EQK9+LNULCphdVxk1(N#he&gh4mAWNPx{Q4rwuqbXD3z7 zb7q-3vnj<%ZakeC6pm0ebT$aF`pyPSLf2!a-R;v{)u|^^#)#WkT zah9!>5nDeZwn!V!y^w)%|0xD&905;&j$+YS(4h|4NejSqxKC5=5`&|g0we<~KtK?x zVzXk(qZY?0EC4D0BSHN_Mm@&~T5^JRe#>1A_=v?n#aQ8x%9AVT2E@(Q`mfHO*VL#f zMs-XvX7ry?nPrsZ>M;W4mevA`hsv6A0B;d8cA6PGRDwqjX%Z45)UqfwQkfBk;uB#! zEcAq@2;*>lfLEfN{T(>PF16=|Ha$(%y66?Hpd}9zG-@rNoJ)HYhDBymnPvAimLG3+ zp|(E7-RKxMXrs=6?0~=T+51Q<4AhqLK;bZeE%h(7`;;tE6aC|jYd{@5lBmi3u1I4b zdVSzGJv3|8i;3Eu6)XF_08Sn%TL57UTG2bc)sYNO1(w z6%@b z3k1_ri6L$DEYm<25;4v;u+{hM%`Y+%UH?~R=cV#m$M6xKzXG4XA%B=cX|g#fpRdgx z@|HU}Y>LGxLqmvs-U;(XJOO)BV|UE7CJhoLA>`@mwe?LnKf)Z7(%_p!J|*%;M2<5+ z#9Hdljad5^^qn|D8~#s01Ab>&n;AC6+DLa1c=`81ka}D1m&7UbI-_&o2lV(jcrC~s z|CqXt*7dK{`3E5V*Pq?wsh-bWO0_RKxrl<0npG{sjP=9QF+B;}GgNfW^p~451zXEQC8p-X}H$fs{<7 ziu~4Cee~y2e{s#{NF0QGZ|oM3r!U>WMYw_2DSH4tKkkPt#G}|nRVeCFh7^%SfUtj7 zy`&O%jfW3M8}c8tA>@utdU^n+`V27PXG{*9+7fb8$6NAmsLY~agazc7wdfRTI%T4% z##dqk=_67(nKa*wC^I%%GFhY|m1L0W!E>2$rl?bF+-R14Ew*DskORct2kM&gz3Qjh zzP@h^bm3auWZAel&_&#tLEI_I`8l*f%J_kQZY}}3zf3eP~V{^A}IJVl_>GUe-A`tdu|}< zndEPDWZa1lGSa&LK0VKQ2@kbB*BlUl=f9@y|f*Q;F z6ad)SbP279k{v}Esdg@n-~EfpcN6%J87trW50md@U-`}nAt{Z5ouA++`d42h7hfR? z&w{@wEFaQ{5Vh9j{ygPhR^EE|EobHJw^y7M=aS9;5O3wTh>(XSeCEojSy35F3I8c| z`g0;85)+akGc$OJF#O-9hj)nx$*`KcE`nAr^R7ox8}d23E`2_juv_FPr)d-^LL@z$ zWail5F4fi>@oG2{mn9%LqLoQ)jg-oaxQx;(BslO8^>d)}nr%>i)7BlL#|qHoOKO!x z{xw?ESt93%6p36Ua-PTfJn{JDQ z4(Xqfc$4_zD<}k*va`aqr4)o(gA1RW23ohbDd?H_`gCi@6uSC#j^D6&)ngj_#*KPFT-H_wcA;pUP zXGBDRW<6~14s3nIUqM^4Bs2b15w=w)qPD{Ay*u%{)jPlmU`XuCOg(La_*j{gM?LO} z#YXar8SyDR3;B5P`EizO+B;C+Y4Kmu`qQ zq#L7+=|D6<(mbhPx+&U3Q<)QcD6x4jB^`;jI4H4IU;(y?Eg!>JK7l_ow^gMOVd6}B0p(ZoaQL6bdL_R5fP|+<@RJ2p@-K3&h z9n>jG@ZY2aPGmoJLMiw&Lv$O-Yk<5)v9T&|yAXidI|Sz_6$<7Ko)xFlqQVcvr=%p` ze?`t-=fnI|QkkBch$OP<-gE+U;+T=+M@5LH_^|@l=XerbS*7-=O6&yDyrG&juL2%kj3{v*Jy+LLE;kkNb?Cr_Bo~yRYUR!EYyyaQV zFr~QQwwHrZ4m?*s9((-_`(f?npr3%^FO33LuZn_xN>5QY=mlz!dVBna!%Ha*<+3x@ zsxLUIT6HcsSJ-mNa?HLLG_^plRIEq2Ty={ywcNjlQd-L;6s{bfv1Tyo050OBsms*z z_Ty1wi$z1fN$j+4&4Vn~E!wSt%`B<@+R2nUgZIy@h_D4_V=}lZ0q01|;+G ztMOziK9Lf6pm`)I`MRu#Y0{wKoKI#F7KOn4k&;^A@99neA5c@&0`<1<1}(t43N-S| zoSUNFb1eH|1sploz`3*gWC<7U0el;d$YFy{%1CHD|MkW3@p(BFNo5o9)O1!>#^0Kl z%P4c>)7i8*UcsNnO{NpJv8OPwr*M%yjmuJEd@dPF14D_-UjN$n3eFa|-0Z8lJyW6* zGbbFw^^3eh`jcOUNU0DHA zX6CLL?!@&eSfpH2uOMFSRg~*L=nqHZ;oRFjhFgeBnB^;FMS60rZ&hq$Y4<{$;e=HO zW?9@$!v`ErQsjBy*M>`qXQo7hnM!3Rj9@jU7;bZNhTB{v!<9&7WzlfQXJ^HXV0g}r z5{#0N{{g#p;UdU}TN35DlwvUWY0$Eai~(^?!re6jRjVe2AQfeo+zoSIr2Z#JvHqJ2 ztDc>C&(3>unrENx*|$!yuHyx=fWIAjwCBO=4_}9c(}KtK;PEBbl55S&EpK1-@_8@6 z(xG`nx;L~=xn0M9JNj^ZH9VLP4}Nw@3yy*=Vd<{$9JER4>^i>MpU<8>d*W|eJS#WDg8iZ6yMt|xKen|GMqGak(*SLf33mm< zQwhM&fTBbSbRY`!A3Ewpjls^pqApAmt9Wz3Ej{`b zs;xwIWpdm33!p{vLR^XSlTtQqlb=TW(1i=9| z4Y4>PgE*J-7m*1+UWIJ=_W%~DCymX^sddWh?OJzu8uqPq>|X8Y&UbWc9U;9VbcZRl zZu#K!FHgVs`rX&>(1l>D9^_Yp`|`nkD{(D&Ko1^J$@6TjWj8Ri2H>P6@T8)!y8l%z z_?jMkO%1+Q*tPc#bCLy<@mVk#Ajg=pyrq{_%gzGspvQaK^@qnI%V07$g- zD=?iZ(^&{~F6C}5EH5mcE;Mhy({pe1z23XMi^ES`4U3n461^E+cQ{RPA12@q;0<4C{|tWaWjPe&lh&Zp5L0J{`9t4m-2x&;?NkKhK#3Lb!7fd%Lj zya4^g&g0O=i#7-xFuMlBS2l)n4LpAErfIYRA9fJFQ^|$Ph79mv$o-@=V9-{S3QmE% z*3P3L-%_k=I1UIApm~eukT0t>;32s2BvjCUT}2$qT8ek|_#lrs3b3ISOSLxJHQ_>) z8HT(F7S5U5!k+=50M=_VC)(C6*BXg{QaFxEVGPtTFf$`_$&nBz;V?|R#IA^HW4IO5 zc6B3Vi;}?+1uQl(rzqKs;YonmdPM|nDv`}((AYH^1n*HYwdm~jdt(~ATW5Ex?C#ImMm5lV zzg1%+IvY{h$mhXbTChtGb}hM{v~LAb~VHEfoq+~`Rwh$O==#{Wcql6@i89v8e zj7u3%K)Oak9tknmXp}|8B-pW}k`fIMe4hbiF&F|p#R?>SOuPn)w|GrVSRzNkBxhQl zvJ0J#SsY2MIEq*{6O+jZa=Rou$SpTT4~O$3y00 znCU0hY;Sl37jR~Gj^~GfiB5o(JzY}afKgUB7{5Sl0dF5O0bV@`w>{*Ry5VK86Y)7g ziYq`zN-`~G=M+e~u81-)dBZ&mem>>8!OBW@b|R_B$kX4zYW~EWB!LTs5LlTjA2HYx zhpyn&FI2>jR>WVDcxX%NLeP(`I)MZY*Cev)Za(Ia?G`HUkuQngdHy_lR!+LXg$x~=*ySr<(=}^Aukk%B@ zn<7i@dP%iyt+j8zoBnOf{jmp~4?EYwhaYYE%%O${wD5o)9#}hcP7qqCyOJ}e(FUk#~xtj(n11Cs|;TOb|sEBWX(2>CH zgo|Ks7r-A4@`pH3AJByN6NA<2TIT)waz%bS7>k#u5!J3 zu2Qu2T^alJ53CMJI=C`dx$ZpIeV=*g*AIM0<4)+@ z36(nmy)F;y+@4kLV4gd8e^5VkQsYkP+$ohig*DGrS~YEI49e*|y<=ohHjxf)&eF z9ytu&d~oGXkw1*$W}LlV7u#Fe?f`AdEzafw;C< zG!upd@LY{S>k@iMD$#KkzH_ZMbSxtJ&#@%33D6dH?m=4-{GDhEHmtHc^6ZX#Ga4Jx z*^pX#YHdNJMzRcj0Le1YS1DR5`x2DngV zWmMsUMQWuP;#;UXlCG*#AAhQjr%9c%>SC!Vwtl=TmcXw}ueQ&sRR+Y&kUzJdzXVta{!pU6IAo|o##i3{LD@;Wqk({rhELSW$g-(u~=QwaqOl*F8)yUzW`5#%($#^QJssbToeV*8><|j2M2oB5siC6=Uz}b zEQ`te^W6TG1&uqZb4S(EgOUt9??mLjrEv#!?x4yY#2V*{HRd!ftaD+N3;z{Ub#8l6 zxVtniqH__Ii$Hfex1%VY+cd6M=XzDHw>aXiJlCb}eo5nw>D)1uJ64<|&V6NjWgFJi ze`G5Q(=*kDe;xkK@TY$55aQoKwlw*DsA6{z^Ij| z3}OCdp;4bv)Cd{@>V;gn7Jd{kv`AEn0yHA?#4(YBi%-RGEFpB|wihoWfxAJJ2<`Fl zjKIsYA`#n8gT6+vyRN7<+R>F)CI&dYB>v@GSB3PhU*rK|GO7e1%Kd@mV|UKqetGF- z+%~{Jb2neCkDO*^S^EM744&G}K`BT!=LtmYUSEM+&jXJS%U#;|)$cYtJvCBvYza`L?$RlHY|tyAKRg(MUQ%$;`aNyoiTp4-G%dPi1ZT)p%+S zZsQc$@z|v?eiAI5obTM6GCQY46mZhg^Eua?G8z63IIdVRlgJ8yB_ko1!DQjSh4dpB zpy5}tWd`P&M{Y0ehK!QCm!32{>FY6Mdv<^C*3zCsPendyp~k*Cs8L(&5p*N}1^{?{ z8=CGMT5;Z=QX7tG4af9`V{okKZU3|j&I#^jSKE)|+mC4NFY4_tE}bgge7JK;-P{+c&%_{X!2X$oz;&VmRcyi>+0ZT-E;GG%DU&~ z>y&lRP1Y$IL(OGlXjaN5;QWP`=3z!-BO!kULrp-Ew18kEZ9}?&xkSsTGL(!qAhWVp zz@o59EuwCTe}fif6#($wy2ew{q$0;_a8g&gNn#$l?as5iSB`4z0i8XdvImMsaes|e zo!zp^?#Z)zR^afaXxBk^aEfEzaan<5#U7pQQAlp+#xn=?kze0)TM?&rjrSt^}wG_BGhi7qy zoA7**c=)ATkWo75b*JHg0vI}K9Hnb?+mN3lrV+1{d6;aW+x{wszCpP^KzlNt3U1#2bg64&vsLW-*4!w)A%hmJ$2{!CeGF1b7@}o^TIh3;}w`-T7MQcbxgg820s}EZAAg33T}i4ub13_S?AU$d z8_pBRWiV{NCfMl(u5I85ilHoYz$Ie|lTt3e?X~UW0cFUfina>>FWmnhgd?}93=o7z zLTZ$@0x+1kGNyhTHpamJL3sw;&I0Huso|ba3UGzgMhpSdI|}!71=6bY zk5J)1;7=X`0Q!or{eAiFHOy|Md>{(*^l5Jf-VGjd?<||2q8F#U=RT=SrxH;&Awt@ z&U#h)HRPh{Bfk$29G)~?Xy{w?6`GGO2Egp4{fj>Q6)68A`K>cvI#^)fsw(~p%x<;x z6qx<0{V6a5>bE@w=Cr!;Q($n;#=AJA`uaZ`_-x?M^y8C%JgNC! z*O+0Q8CIF$0>dp101BM{$?(nL#fl&3na|c;&=S6VRABqkkMddp0dP|mYJHwk6$z-TZe;7^Ow6r`C$Z6sk8 z;ceMG&r`hFTXweW+A;O_5`BrfY<`})M0<)7&Buk2h#+y@{$Vl59l8*YjdQKsa8Mc< zJKq+FMcN|)Oz~qvf*TMZ8s@rVk;qsy81PHMSd=?_`Y3l&j17za$fwweeh;m<)ttST z1Hvd~@|cx^Qzy=cgn*>jN5@~327<#;e^_BjJRFlejN&|XXmm83sa0{D>I;U29%wE$ z3=hZs!RVP_l#gA)2O%E!4+~wf%g~fH9P{(1gNe?gkAp6KE-KOs6g)QW!8zh?}fMDfjuNpuzx7nJG9pf zGtRt|$?dh^lVH{6+FJn6td=@O4Z*H^Nq_d*cr&c9eTuqFdmRH54B2`nCSDN4L?729 z3kH?|ceu=vjg#M2T;!sSCka0v{E;z{_zre+Y$cs^R_PIc2kC5)+ zDDdz8J|M5t^OQthBauv6bb@->0sATQ2>X_vpnTf+sd1CXoM_SdhEo`b!F-Bi0VyVO zux&|T*xYfyS(|S|~FXL4}zPLhtW~FR}*M??!ncbFTo6;4Vr}f-tJE!Km~MbFuAEpkQ6jWf#?opa3HimF-WuDf(r{BGh-QQ5qG&c3kwHFp}Kt~pn#XscYb zb#YI!Xva!19+_W3-tSPpOFD0QAB z<0m{%NHr#aYNoz;iTap1`LVm|>co{J@Uzfx_4lqE`6r9(54`tHW=qX|Gi5DW!Psx? zPD?H6IjJE4h4r8bw)>;-YPCQH5leX)B3dmx192;F0b0OYfwFu7P#ezzwevQh4&Dyb ziAve);+;SXc~He(H(v;}h$!J=z6jzad@<0{@e)s|V$bTIL@9?4AeK=ZWd!vqA;CZ& ziR8UQIxA_Nr$V~i)dvPFm}N&v7Zxao-^t_#sSLTYQkgtq8zcbB5iF!VtG`B!A3}kg z7oc=e-Ya;__J}t@%ewgC&G4kRHVzuBKT+1!);<<&M@j2br=)Ex*e7D&Jq{6zs{03J zl46xckmVGs%Buhc#^NJgW0Dk$Dg^=1{TBotBC%+c00mIpqT~z5Vx!8YVBCk9edkGT z&>U)JTOc+%?i&jGhi}q^DameBxltASrP-y^MgLytO#E3OSEx_e(iB@Gvo#BYNp|ZU zws6VaxF{vrmb;s(r3rn_y2y~tT&`D3y>u(H6Ut$EN?=l)t^qVE*N)n7T!vr1D<-e9M zt8=nT3rmkonioPfc`x8GgrXoXKxr=T6+Eu0ee2rv&^Cj2#1;bhka@wUrMx_wC)JP(nJN&V_^v_ z927+WNI4WR+ymMkq<&6QB2E=xRQ9}oj2HcqpcEh`h>b}JclU|o+{vtsk?0u^!XT&s zr(g=PKKPgr=b|x*6D|kiQk!OmTm-{uXq+^zXYC)0oEOBl2d;j|-mS_!fq!5R#KJLg zKUgb#zo$a6#)-|P6so^IumXHzB3Mo*Pdqc&f9QCxi1VOWE{Q?tt5t|1jzK9yi72VD zoTM5~gFz__qk-o^;j#pn=CTk_3c~*LLfF@-xZwSOG#(ZPMg&1poLR~2+a*4R)pcNX zwzw1=$4j!gN5}t;M69GrzlzYr7TCzsQC2Y7L5+C-Rk6n&q zCpj)7t9QXeqC7`dXN7+^B*j}mi(a8ttS(z=y1Z(t?~{_sRLOR^Wc$19`+Gm^NR}L* z>b~Q2&m5gTIy*EUnTxy{OFElYDnV?g*eaQ=O0o4aTc2V*GV8gq?Y*{}ZAtcPcUk9* zW7?r=fE2q8;Q!*_56`}RHr3cEH+Cl3z3b#SAU7UJvS0u59BHi;?8j|(^B12rQbl$5 zDArbbXH)&Fk*ULJXKBj0Rd#M&YS@!>cHVWC&YYM&u~c(D=?p;H%+u3PU+Yghi!hRM zaD=?Nvt*?h>U|JLR{i}$bk9EO7yAx9(YM$9%T5~TDz$_w zfPeRY0t9>|fI31D%MU&s!9cpMma@4*2F43-%Ch1^O6j;FTT`xaBH{ieA%s{yFJy%Z zF(9@8djl7vjT$lF?mlrploy`>((fryw=PbQ*n^}CNiPzWmjdA!a9bz5$VC%};W<&Z zYKLZ6!G}4qZov3k8m1WBQb~3*F1vHunSmF+B-^UL*($SJ7h&@}c87J$*rshSJ5|nFny0|NqtU*brNv(uFH;DYGB5BZBMUTZ&8=D_9am&4F+v#H)I(3cWsEkm z%g8gtCN1DC03G%EA5u!!Bx)(B|2T|P*In6O@sM%;1G$RNOq4}2=LTGd41+7i2al(w0w~;s%s?5s@kD<+L-{sc8 z+eyzDNyli0$czcqKfIot^#*7kGQvCt*1y&ZoOLk(<@A-zwiIg2#~C%<-kG~^c>Cm6H2QJZLw1fQ+Yc=U`^ADYpB>A%OZ(?3OmN)s)e;AB#W)uOADHSO zC9a5s>31g|*n=@}p^c7nq5Yr!Cj*!AA7*G1z+SuV0B8hqxwDN ziXByFFAtuy-HIEWnt~{u41>)@RJj#hgMQGgfeXGvV*}laEg0_}5r{R#fYX8(_dsO; zCC>W*bSRdK{_vO}BAQlg(q-xBsUdK+Dh?@@t&$C#_w|Uui|{%yCW=CofCeHT#cx1C z@kvrzt+6i{CHR4~2`~$Qh#lZWZ`6N23}gaN5fuEHOeL!Ci-Q)^zo8RE3~2Q_g1D*?gnty<<0zy-&Z> zpL9Nv1~19P^hCb4zD^sk0;U*^$&) zNj@trpS>v8UR)ZVlxrtv`|gxg%paXQx-j%s4&Xvw|>9UumS;yXd7-&x(rz zKa+)Wmaa8vQ3Md|@GL9?s3$|@AhN`x3|ZAMZjy8*WrQRq;H-jY!05=J40LP8X(**5 z3{Zns)Y5!`<{#;#K%`S4R%;{syPhFDX$E7(09Q=pxJSY8hJRW+#C$PoMK`9hE%U6_ z&#chTiVxlnLQT&+Zfc-90BKw@(bV%44gaonX3l3EiCS*Je^DT~Ml}FbGee4TgU=0e zef^0|stp20Oy)QSlAeac7#v!{va=2Nn>b?>`ck405=ebKoQrV#6DF5^(8G$mA*+Z3 zQ{2N~1VDRu^wJNGLxlk;78OrphTlPgtgl%8qwtpZFe*2LTQrlK9s+Pb?n6-(#|6xC zb0situKT7_bKoQzasbuCGQ9+K#s3rt;46naMEYyvCuKsybxb@HLOr3TkYbD;MJLr&BaoiI^<0q z%bRv10(Z?Eo<2N#IO(kU+ya?aSl#2ZMP|1w)wSQ+@qWjTn&rB$e_)mC`jYJ7bkoi$ z<~G~#xdZcK%@5)Z=;lvby6Vh7ud{URC@_ZG`ytcASjG^=<#^x8p-e>Ms3ILg32?eFjH9&BrC>qpyGQzk0%%>%kh{$lOg$YSZ4UdP2MR~HKaFmX%Q z%53e@mM3qsht|pw+$cnj{A8U;Su00?<8#3>l*M2KcC%m@ zco+e#+9*(16lxM%|F`rrY1Dg_dBr1K-V^tZBFjW_n%~Ps3)x!l60;U%L8BfxH&}k#5_(gE;K#GAq zF=x8Ag#k4J>c$iY1vE?(m9jz00`VcLr0nL<-uP`=EMo`#h}c28VGEnsz>?st#5#Fu z0uG7|(+d(H-22TsL~v59H_}vlC!U0F`pjjQkeb|{k=qEe#%4j zDnc*r@k@U0upitDB6tizj3(?Ek=ol+pKxYecEh3|L*!F0^FgcyPB|i@=vU(v2RZDA3lLp? zQ6xQ#V>f${^a9bmZS<&OA+4-(vniYMbZq7vB~hOzN!A{<{25dp$2&E~;^Z?swW((Q z+}ycTd5c`$k}B_%%R86LAODSoDYoA&Do(r07U;KJ*IfX@0a3aNXO3JwvSNnBDa#54 zKmX>WiptaFn`e(q^`c8nR~!q%;-Tv!Np?F(tg@KAv*c%g*|xt({5dUfsb)Ty8ZUehQwGTpN&>&xg5K7mx>@!P-ZPi z@gnZ3TrHOmK6dNMZXKkkXZj^phmJbqO$z#LzHY8ARoo&Mw=5U8-71rdJB>7+hV0gA zJbfWwf>t)J@pv;V367HlBbWl3NjGw|d`9PX{Mseit}aO*h@S-B(TPO-utG+Q1ELDA z84Zz~_Q9KsDyqJ0QA$+kfeq-(QJW_*&iitc{~m@AM_~D|h2S1-+L3n%|NIL?Ha_j3 zLi9<8f|+16{Tly>4Nyi$h*}9imIeT16|%&$aXtGuTBIATB?sJ-6ZV{1JPe@9Lt~(< z0N0B`dpA0d`~e9ZGk_`w!J$Hox96aU_&gFnk^mB%{2ceSf@_%Z4?S!R^ODn81Dbut zYY3*;%z^0xDM!8Rs82c?P%`#U_otkVva@lKPdb~ygxU@V<6t47#4pZC6_U;tO>X}G z;4u$(n#jG=QI&Zf%4TSk7ZNTT%Vf0=idS((*2ub2m90pX`kHK6!&j@)e~pW>9%F5N zG{(~9*#}VZ#uV?6#Uby~3s&=njyLY*EpIp4}{XKH=Hy&+K zQSuOJ`Iivc_@ZWgbJ?3nMp6vDbedO81Kyga4&cvxdKOVx7g!P5vC3j`ssGUffTL%U(OH;^JHU(t-Zv@)OI& zC#S3*yUW2%g^)LUSomy`-S%({qFdd6101;V<$ZKz$eZ!RCtmvyWrqF83z`~LONs$W zSDRW2ZWJTOEYE0L2^_7ok!x1cHT9^_Gs=+7TV~}iPl5dj@H%N@zKXWX_Csd zsgWwQn9-?U_S{h$K@asph@#HH+D@7$nF({wX{CNbm~~SVd1`^vN`tgXkdKcFfF{UU zmwHY)X$AiUIdz;+<#vJoY$felbH-+1;ZGDyST#WbZtXC$W@bH(L^bz}K=>LtJdU1e zFf0f^YL2r9Mg1`p0qBctj(sS8)NyL)O_pNft z!KvruJL^`;p*grrl!3GBK-TYpP~5Oc z##6IL1W|CwA9f4~R^3?C#1;{(y10d%kqNn0im~X;@rWBZM>VlT#In&@*J{CSAbPbP zf?!<@*l_$t9}MWCQyW9p5Qa-1Ux!i~ba!eklS?0}Th+}MlH%KnBt*|-+d`i!M`C(^HQ>_)q#S!+4_3(C!fEobM=V80rux%Do+irv5M zKFFxx|GgdH|7~{w|9@uf^ViQ)*x#p~#a)MWP8?bfMSKZxSPKHy}P+xd-m+&c5xkc@g%e=4kCFR2})bfrhH(bV+!#N%=9LbE+hm;sF!@85#sMT zi|@}NAvl5!jQEJBD9?6*@}+{jS@2VxC^Fbpr`WRS&x)E!#~S>z@+ zAhO^$l{SvgfHp*=0i{f_@i|H)NSxjl~v9kn>&^&Yn00xm&>+K^{$T` z0EZNn%}h>Drrb@kyD913k*?ZtW6ygBZyroF_sY$^%gu-7s>2^{ldJldP7TRbL$lU9 zMWyq$Iom?hTdmhy-)K)3?Nn>g?;j=I+tXEz@Zm_|&BD}EvMQ9K2 znYayiU?URL8sc^&SKx4*37>Uyc*7de zDcC6EafR`V!xzaU!*{ANNSNB0HRc=$HZ;q zAh!*zHuW5rd}E(_{gjf=al+k9142Hre+!o z21ExwJJj#k$!F{e4IiV9!jZE?#Jl(&)_)KQaZMr^Co@YXNBnbqtU!Wz=K*^_{o?bW z_}B1=TPu$GWW`L=blSE5ialMj=ZgEjm7?vxqTs({g|X8`zha7i#ccftrs*G<{W7!v za}#aZf1d*KYld5KQqICFY}#tSV*bopLDx>5`HX^}&vw1Q(9N@(Kcn#X{FE zx1C~3?@=bY=wrsVWIyz??hom|?UU_KC7EMs#(AZitk5Z3u>V-GK(+^Q?EEV`4^>k? UtG0AG%|EMa=qfP(ya40>1(WI|L;wH) diff --git a/src/main.py b/src/main.py index 5db10ea..95d7991 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,17 @@ -__author__ = 'Mehmet Cagri Aksoy - github.com/mcagriaksoy' -from ui_main import start_ui_design +# -*- coding: utf-8 -*- +""" +AFCOM - Serial Communication GUI Program +Usage: python main.py +""" +__author__ = "Mehmet Cagri Aksoy - github.com/mcagriaksoy" +__copyright__ = "Copyright 2023, The AFCOM Project" +__credits__ = ["Mehmet Cagri Aksoy"] +__license__ = "MIT" +__version__ = "1.0.1" +__maintainer__ = "Mehmet Cagri Aksoy" +__status__ = "Production" + +from ui_main import start_ui_design if __name__ == "__main__": - start_ui_design() \ No newline at end of file + start_ui_design() diff --git a/src/ui_config.py b/src/ui_config.py new file mode 100644 index 0000000..75a811f --- /dev/null +++ b/src/ui_config.py @@ -0,0 +1,245 @@ +# Form implementation generated from reading ui file 'main_window.ui' +# +# Created by: PyQt6 UI code generator 6.5.2 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_main_window(object): + def setupUi(self, main_window): + main_window.setObjectName("main_window") + main_window.resize(939, 486) + main_window.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor)) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap("icon.ico"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + main_window.setWindowIcon(icon) + main_window.setWindowOpacity(1.0) + self.centralwidget = QtWidgets.QWidget(parent=main_window) + self.centralwidget.setObjectName("centralwidget") + self.formLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) + self.formLayoutWidget.setGeometry(QtCore.QRect(740, 10, 191, 211)) + self.formLayoutWidget.setObjectName("formLayoutWidget") + self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget) + self.formLayout.setContentsMargins(0, 0, 0, 0) + self.formLayout.setObjectName("formLayout") + self.label_2 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_2.setObjectName("label_2") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_2) + self.label_6 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_6.setObjectName("label_6") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_6) + self.comboBox_1 = QtWidgets.QComboBox(parent=self.formLayoutWidget) + self.comboBox_1.setObjectName("comboBox_1") + self.comboBox_1.addItem("") + self.comboBox_1.addItem("") + self.comboBox_1.addItem("") + self.comboBox_1.addItem("") + self.comboBox_1.addItem("") + self.comboBox_1.addItem("") + self.comboBox_1.addItem("") + self.comboBox_1.addItem("") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.comboBox_1) + self.label_7 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_7.setObjectName("label_7") + self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_7) + self.comboBox_2 = QtWidgets.QComboBox(parent=self.formLayoutWidget) + self.comboBox_2.setObjectName("comboBox_2") + self.comboBox_2.addItem("") + self.comboBox_2.addItem("") + self.comboBox_2.addItem("") + self.comboBox_2.addItem("") + self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.comboBox_2) + self.comboBox = QtWidgets.QComboBox(parent=self.formLayoutWidget) + self.comboBox.setObjectName("comboBox") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.FieldRole, self.comboBox) + self.label_12 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_12.setObjectName("label_12") + self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_12) + self.comboBox_3 = QtWidgets.QComboBox(parent=self.formLayoutWidget) + self.comboBox_3.setObjectName("comboBox_3") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.comboBox_3) + self.label_13 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_13.setObjectName("label_13") + self.formLayout.setWidget(4, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_13) + self.comboBox_4 = QtWidgets.QComboBox(parent=self.formLayoutWidget) + self.comboBox_4.setObjectName("comboBox_4") + self.comboBox_4.addItem("") + self.comboBox_4.addItem("") + self.comboBox_4.addItem("") + self.comboBox_4.addItem("") + self.comboBox_4.addItem("") + self.formLayout.setWidget(4, QtWidgets.QFormLayout.ItemRole.FieldRole, self.comboBox_4) + self.label_14 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_14.setObjectName("label_14") + self.formLayout.setWidget(5, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_14) + self.save_button = QtWidgets.QPushButton(parent=self.formLayoutWidget) + self.save_button.setObjectName("save_button") + self.formLayout.setWidget(6, QtWidgets.QFormLayout.ItemRole.FieldRole, self.save_button) + self.comboBox_5 = QtWidgets.QComboBox(parent=self.formLayoutWidget) + self.comboBox_5.setObjectName("comboBox_5") + self.comboBox_5.addItem("") + self.comboBox_5.addItem("") + self.comboBox_5.addItem("") + self.formLayout.setWidget(5, QtWidgets.QFormLayout.ItemRole.FieldRole, self.comboBox_5) + self.gridLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) + self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 731, 411)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.label_3 = QtWidgets.QLabel(parent=self.gridLayoutWidget) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) + self.textEdit_3 = QtWidgets.QTextEdit(parent=self.gridLayoutWidget) + self.textEdit_3.setAutoFillBackground(False) + self.textEdit_3.setObjectName("textEdit_3") + self.gridLayout.addWidget(self.textEdit_3, 2, 0, 1, 1) + self.formLayoutWidget_2 = QtWidgets.QWidget(parent=self.centralwidget) + self.formLayoutWidget_2.setGeometry(QtCore.QRect(740, 240, 191, 21)) + self.formLayoutWidget_2.setObjectName("formLayoutWidget_2") + self.formLayout_2 = QtWidgets.QFormLayout(self.formLayoutWidget_2) + self.formLayout_2.setContentsMargins(0, 0, 0, 0) + self.formLayout_2.setObjectName("formLayout_2") + self.label_4 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_4.setFont(font) + self.label_4.setObjectName("label_4") + self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_4) + self.label_5 = QtWidgets.QLabel(parent=self.formLayoutWidget_2) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(9) + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setStyleSheet("") + self.label_5.setObjectName("label_5") + self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.label_5) + self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(736, 270, 201, 141)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.label_10 = QtWidgets.QLabel(parent=self.verticalLayoutWidget) + self.label_10.setObjectName("label_10") + self.verticalLayout.addWidget(self.label_10) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.end_button = QtWidgets.QPushButton(parent=self.verticalLayoutWidget) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(True) + font.setWeight(75) + self.end_button.setFont(font) + self.end_button.setLocale(QtCore.QLocale(QtCore.QLocale.Language.English, QtCore.QLocale.Country.UnitedStates)) + self.end_button.setObjectName("end_button") + self.horizontalLayout_2.addWidget(self.end_button) + self.start_button = QtWidgets.QPushButton(parent=self.verticalLayoutWidget) + font = QtGui.QFont() + font.setPointSize(9) + font.setBold(True) + font.setWeight(75) + self.start_button.setFont(font) + self.start_button.setObjectName("start_button") + self.horizontalLayout_2.addWidget(self.start_button) + self.verticalLayout.addLayout(self.horizontalLayout_2) + self.textEdit = QtWidgets.QTextEdit(parent=self.verticalLayoutWidget) + self.textEdit.setObjectName("textEdit") + self.verticalLayout.addWidget(self.textEdit) + self.save_txt_button = QtWidgets.QPushButton(parent=self.centralwidget) + self.save_txt_button.setGeometry(QtCore.QRect(600, 430, 121, 31)) + self.save_txt_button.setObjectName("save_txt_button") + self.label_9 = QtWidgets.QLabel(parent=self.centralwidget) + self.label_9.setGeometry(QtCore.QRect(0, 400, 451, 31)) + self.label_9.setObjectName("label_9") + self.textEdit_2 = QtWidgets.QTextEdit(parent=self.centralwidget) + self.textEdit_2.setGeometry(QtCore.QRect(0, 430, 501, 31)) + self.textEdit_2.setObjectName("textEdit_2") + self.send_data_button = QtWidgets.QPushButton(parent=self.centralwidget) + self.send_data_button.setGeometry(QtCore.QRect(500, 430, 101, 31)) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.send_data_button.setFont(font) + self.send_data_button.setObjectName("send_data_button") + self.label = QtWidgets.QLabel(parent=self.centralwidget) + self.label.setGeometry(QtCore.QRect(770, 430, 141, 31)) + self.label.setObjectName("label") + main_window.setCentralWidget(self.centralwidget) + self.actionAna_Ekran = QtGui.QAction(parent=main_window) + self.actionAna_Ekran.setObjectName("actionAna_Ekran") + self.actionHelp = QtGui.QAction(parent=main_window) + self.actionHelp.setObjectName("actionHelp") + + self.retranslateUi(main_window) + QtCore.QMetaObject.connectSlotsByName(main_window) + + def retranslateUi(self, main_window): + _translate = QtCore.QCoreApplication.translate + main_window.setWindowTitle(_translate("main_window", "AFCOM Client (A free COM port data transfer client)")) + main_window.setStatusTip(_translate("main_window", "Mehmet Cagri Aksoy")) + main_window.setWhatsThis(_translate("main_window", "Serial Communication Program Mehmet Cagri Aksoy")) + self.label_2.setText(_translate("main_window", "Selected Port:")) + self.label_6.setText(_translate("main_window", "Baud Rate:")) + self.comboBox_1.setItemText(0, _translate("main_window", "9600")) + self.comboBox_1.setItemText(1, _translate("main_window", "1200")) + self.comboBox_1.setItemText(2, _translate("main_window", "2400")) + self.comboBox_1.setItemText(3, _translate("main_window", "4800")) + self.comboBox_1.setItemText(4, _translate("main_window", "19200")) + self.comboBox_1.setItemText(5, _translate("main_window", "38400")) + self.comboBox_1.setItemText(6, _translate("main_window", "57600")) + self.comboBox_1.setItemText(7, _translate("main_window", "115200")) + self.label_7.setText(_translate("main_window", "Length (B):")) + self.comboBox_2.setItemText(0, _translate("main_window", "5")) + self.comboBox_2.setItemText(1, _translate("main_window", "6")) + self.comboBox_2.setItemText(2, _translate("main_window", "7")) + self.comboBox_2.setItemText(3, _translate("main_window", "8")) + self.comboBox.setItemText(0, _translate("main_window", "2")) + self.comboBox.setItemText(1, _translate("main_window", "3")) + self.comboBox.setItemText(2, _translate("main_window", "4")) + self.comboBox.setItemText(3, _translate("main_window", "5")) + self.comboBox.setItemText(4, _translate("main_window", "10")) + self.comboBox.setItemText(5, _translate("main_window", "30")) + self.comboBox.setItemText(6, _translate("main_window", "50")) + self.comboBox.setItemText(7, _translate("main_window", "100")) + self.label_12.setText(_translate("main_window", "Timeout:")) + self.label_13.setText(_translate("main_window", "Parity:")) + self.comboBox_4.setItemText(0, _translate("main_window", "None")) + self.comboBox_4.setItemText(1, _translate("main_window", "Even")) + self.comboBox_4.setItemText(2, _translate("main_window", "Odd")) + self.comboBox_4.setItemText(3, _translate("main_window", "Mark")) + self.comboBox_4.setItemText(4, _translate("main_window", "Space")) + self.label_14.setText(_translate("main_window", "StopBits:")) + self.save_button.setText(_translate("main_window", "Save")) + self.comboBox_5.setItemText(0, _translate("main_window", "1")) + self.comboBox_5.setItemText(1, _translate("main_window", "1.5")) + self.comboBox_5.setItemText(2, _translate("main_window", "2")) + self.label_3.setText(_translate("main_window", "Gathering / Sending Data (Rx/Tx)")) + self.label_4.setText(_translate("main_window", "Port Status :")) + self.label_5.setText(_translate("main_window", "Not Connected")) + self.label_10.setText(_translate("main_window", "Connection Options:")) + self.end_button.setText(_translate("main_window", "STOP")) + self.start_button.setText(_translate("main_window", "START")) + self.save_txt_button.setText(_translate("main_window", "Save as .txt")) + self.label_9.setText(_translate("main_window", "Send DATA:")) + self.send_data_button.setText(_translate("main_window", "SEND")) + self.label.setText(_translate("main_window", "github.com/mcagriaksoy")) + self.actionAna_Ekran.setText(_translate("main_window", "Ana Ekran")) + self.actionHelp.setText(_translate("main_window", "Help")) diff --git a/src/ui_main.py b/src/ui_main.py index 65dcc71..a48920d 100644 --- a/src/ui_main.py +++ b/src/ui_main.py @@ -1,18 +1,32 @@ +# -*- coding: utf-8 -*- +""" +AFCOM - Serial Communication GUI Program +Cannot be used directly, it is a part of main.py +""" + __author__ = 'Mehmet Cagri Aksoy - github.com/mcagriaksoy' -__annotations__ = 'Serial Communication GUI Program' +__annotations__ = 'AFCOM - Serial Communication GUI Program' # IMPORTS import sys import glob import os +# Runtime Type Checking +PROGRAM_TYPE_DEBUG = 1 +PROGRAM_TYPE_RELEASE = 0 + try: import serial import serial.tools.list_ports from serial import SerialException from PyQt6.QtCore import QObject, QThread, pyqtSignal, pyqtSlot - from PyQt6.QtWidgets import (QApplication, QMainWindow, QMessageBox) - from PyQt6.uic import loadUi + from PyQt6.QtWidgets import QApplication, QMainWindow, QMessageBox + + if (PROGRAM_TYPE_DEBUG): + from PyQt6.uic import loadUi + else: # PROGRAM_TYPE_RELEASE + from ui_config import Ui_main_window except ImportError as e: print("Import Error! Please install the required libraries: " + str(e)) sys.exit(1) @@ -79,14 +93,6 @@ def __init__(self): """ Initialize Main Window """ QMainWindow.__init__(self) - file_path = os.path.join("../ui/main_window.ui") - - if not os.path.exists(file_path): - print("UI File Not Found!") - sys.exit(1) - - loadUi(file_path, self) - PORTS = get_serial_port() self.thread = None @@ -209,6 +215,17 @@ def on_send_data_button_clicked(self): def start_ui_design(): """ Start the UI Design """ app = QApplication(sys.argv) - widget = MainWindow() - widget.show() - sys.exit(app.exec()) + window_object = QMainWindow() + + if PROGRAM_TYPE_RELEASE: + ui = Ui_main_window() + ui.setupUi(window_object) + elif PROGRAM_TYPE_DEBUG: + file_path = os.path.join("../ui/main_window.ui") + if not os.path.exists(file_path): + print("UI File Not Found!") + sys.exit(1) + loadUi(file_path, window_object) + + window_object.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/ui/main_window.ui b/ui/main_window.ui index 20d6132..929952d 100644 --- a/ui/main_window.ui +++ b/ui/main_window.ui @@ -1,7 +1,7 @@ - qt - + main_window + 0 @@ -328,10 +328,10 @@ - 740 - 290 - 197 - 121 + 736 + 270 + 201 + 141 @@ -440,7 +440,7 @@ - 750 + 770 430 141 31 @@ -451,7 +451,6 @@ - Ana Ekran diff --git a/ui/qt.py:Zone.Identifier b/ui/qt.py:Zone.Identifier deleted file mode 100644 index 1bf0b28..0000000 --- a/ui/qt.py:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -HostUrl=https://github.com/ diff --git a/ui/usage.txt b/ui/usage.txt deleted file mode 100644 index 3b67173..0000000 --- a/ui/usage.txt +++ /dev/null @@ -1,6 +0,0 @@ -I do not prefer text version of ui file on the python code. -Instead I am calling pyuic tool to convert it for python usage. - -pip install pyuic5-tool - -pyuic5 input.ui -o output.py \ No newline at end of file