From 4a841766e88ed50c6cde772548e04b993ba62113 Mon Sep 17 00:00:00 2001 From: arcan1s Date: Wed, 6 Nov 2013 01:33:21 +0400 Subject: [PATCH] Release 1.5.0 + added music player support + added copyright * edited README --- PKGBUILD | 15 ++- README | 36 ------ README.md | 89 ++++++++++++++ TODO | 6 - ext-sysmon-1.3.zip | Bin 0 -> 4291 bytes .../py-text-monitor-1.4.0.plasmoid | Bin py-text-monitor-1.5.0.plasmoid | Bin 0 -> 21692 bytes sources/contents/code/config.py | 16 +++ sources/contents/code/configdef.py | 26 +++- sources/contents/code/configwindow.py | 29 ++++- sources/contents/code/dataengine.py | 42 ++++++- sources/contents/code/main.py | 22 +++- .../code/plasma_applet_pytextmonitor.notifyrc | 5 + sources/contents/code/ptmnotify.py | 47 ++++++++ sources/contents/code/reinit.py | 30 +++++ sources/contents/code/util.py | 16 +++ sources/contents/ui/configwindow.ui | 114 ++++++++++++++++-- sources/metadata.desktop | 2 +- 18 files changed, 426 insertions(+), 69 deletions(-) delete mode 100644 README create mode 100644 README.md delete mode 100644 TODO create mode 100644 ext-sysmon-1.3.zip rename py-text-monitor-1.4.0.plasmoid => old_versions/py-text-monitor-1.4.0.plasmoid (100%) create mode 100644 py-text-monitor-1.5.0.plasmoid diff --git a/PKGBUILD b/PKGBUILD index 76cdd69..468ef20 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -3,24 +3,27 @@ pkgname=kdeplasma-applets-pytextmonitor _pkgname=py-text-monitor -pkgver=1.4.0 +pkgver=1.5.0 pkgrel=1 _dtengine=ext-sysmon -_dtver=1.2 +_dtver=1.3 pkgdesc="Minimalistic Plasmoid script written on Python2. It looks like widgets in awesome-wm" arch=('i686' 'x86_64') url="https://github.com/arcan1s/pytextmonitor" license=('GPL') -depends=('kdebase-workspace' 'kdebindings-python2' 'lm_sensors' 'net-tools') +depends=('kdebase-workspace' 'kdebindings-python2' 'lm_sensors' 'net-tools' 'sysstat') optdepends=("hddtemp: for HDD temperature monitor" "catalyst: for GPU monitor" - "nvidia-utils: for GPU monitor") + "nvidia-utils: for GPU monitor" + "amarok: for music player monitor" + "mpd: for music player monitor" + "qmmp: for music player monitor") makedepends=('automoc4' 'cmake') source=(https://github.com/arcan1s/pytextmonitor/releases/download/V.${pkgver}/${_pkgname}-${pkgver}.plasmoid https://github.com/arcan1s/pytextmonitor/releases/download/V.${pkgver}/${_dtengine}-${_dtver}.zip) install=${pkgname}.install -md5sums=('67f3e3b55992048bd519867a9e94da37' - '3182acdadb3b498be929b3cadad92206') +md5sums=('df8e9f6df8e7b3caee3a502315756d81' + 'f7fce53d5f616891b30beac1afd99728') build () { diff --git a/README b/README deleted file mode 100644 index 8b99435..0000000 --- a/README +++ /dev/null @@ -1,36 +0,0 @@ -py-text-monitor -============= - -PyTextMonitor is a minimalistic Plasmoid script written on Python2. It looks like widgets in awesome-wm. - -HOWTO -For edited output you must open Settings window and setup output format in lines: - label "$uptime" means uptime, ---d--h--m - label "$cpu" means total load cpu, % - label "$ccpu" means load CPU for each core, % - label "$cpucl" - average cpu clock, MHz - label "$ccpucl" - cpu clock for each core, MHz - label "$temp" - average temperature in system - label "$gpu" - GPU usage, %. `aticonfig` or `nvidia-smi` must be installed - label "$gputemp" - GPU temperature. `aticonfig` or `nvidia-smi` must be installed - label "$mem" - usage memory, % - label "$memmb" - usage memory, MB - label "$swap" - swap, % - label "$swapmb" - swap, MB - label "@@/@@" (in hdd label) - mount point ('/' in example) usage, %. Separator for mount points list is ';', for example "@@/;/home;/mnt/global@@". `hddtemp` must be installed - label "@@/dev/sda@@" (in hddtemp label) - HDD ('/dev/sda' in example) temperature - label "$net" - download and upload speed, KB/s. You may specify network device: something like @@eth0@@ - label "$netdev" - current network device - label "$bat" - battery charge, %. Battery device may be set below. File ("/sys/class/power_supply/BAT0/capacity" by default) must contain only battery charge in percent - label "$ac" - status AC device. Return (*) if AC device is online or ( ) if offline. AC device may be set below. FIle ("/sys/class/power_supply/AC/online" by default) must contain '1' if AC is online - -Label order will changed if you change slider position. HTML tags in label work normally. -Attention: you don't may set to show $cpu in swap label for example. $cpu will work only in cpu label. - - -Dependencies: - kdebindings-python2 - - ext-sysmon (for GPU, GPU temp and HDD temp labels) - lm_sensors (for definition temperature device) - net-tools (for definition network device) diff --git a/README.md b/README.md new file mode 100644 index 0000000..bcb305b --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +py-text-monitor +============= + +Information +----------- +PyTextMonitor is a minimalistic Plasmoid script written on Python2. It looks like widgets in awesome-wm. + +Configuration +------------- +For edited output you must open Settings window and setup output format in lines: +* label "$uptime" means uptime, ---d--h--m +* label "$cpu" means total load cpu, % +* label "$ccpu" means load CPU for each core, % +* label "$cpucl" - average cpu clock, MHz +* label "$ccpucl" - cpu clock for each core, MHz +* label "$temp" - average temperature in system +* label "$gpu" - GPU usage, %. `aticonfig` or `nvidia-smi` must be installed +* label "$gputemp" - GPU temperature. `aticonfig` or `nvidia-smi` must be installed +* label "$mem" - usage memory, % +* label "$memmb" - usage memory, MB +* label "$swap" - swap, % +* label "$swapmb" - swap, MB +* label "@@/@@" (in hdd label) - mount point ('/' in example) usage, %. Separator for mount points list is ';', for example "@@/;/home;/mnt/global@@". `hddtemp` must be installed +* label "@@/dev/sda@@" (in hddtemp label) - HDD ('/dev/sda' in example) temperature +* label "$net" - download and upload speed, KB/s. You may specify network device: something like @@eth0@@ +* label "$netdev" - current network device +* label "$bat" - battery charge, %. Battery device may be set below. File ("/sys/class/power_supply/BAT0/capacity" by default) must contain only battery charge in percent +* label "$ac" - status AC device. Return (*) if AC device is online or ( ) if offline. AC device may be set below. FIle ("/sys/class/power_supply/AC/online" by default) must contain '1' if AC is online +* label "$artist" - current song artist. One of supported music players must be installed +* label "$title" - current song title. One of supported music players must be installed + +Label order will changed if you change slider position. HTML tags in label work normally. +**NOTE** you don't may set to show $cpu in swap label for example. $cpu will work only in cpu label. + +TODO (wish) list +---------------- +* Tooltip (graphical information): +* * cpu, % +* * cpuclock, mhz +* * memory, % +* * swap, % +* * network, % + +Instruction +=========== + +Dependencies +------------ +* kdebase-workspace +* kdebindings-python2 +* lm_sensors (for definition temperature device) +* net-tools (for definition network device) +* sysstat (for notification) + +Optional dependencies +--------------------- +* ext-sysmon (for GPU, GPU temp, HDD temp and player labels) +* * proprietary video driver +* * hddtemp +* * music player (amarok, mpd or qmmp) + +Make dependencies +----------------- +* automoc4 +* cmake + +Installation +------------ +* download sources +* install dataengine + mkdir build && cd build + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=`kde4-config --localprefix` ../ + make && make install +Also you may install it to "/": + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` ../ + make && sudo make install +* install plasmoid + plasmapkg -i py-text-monitor-1.5.0.plasmoid +Also you may install it to "/" too: + plasmapkg -g -i py-text-monitor-1.5.0.plasmoid + +Additional information +====================== + +Links +----- +* Plasmoid on [kde-look](http://kde-look.org/content/show.php/Py+Text+Monitor?content=157124) +* DataEngine on [kde-look](http://kde-look.org/content/show.php/Extended+Systemmonitor+DataEngine?content=158773) +* Archlinux [AUR](https://aur.archlinux.org/packages/kdeplasma-applets-pytextmonitor/) package diff --git a/TODO b/TODO deleted file mode 100644 index f46f42f..0000000 --- a/TODO +++ /dev/null @@ -1,6 +0,0 @@ -1. Tooltip (graphical information): - a) cpu, % - b) cpuclock, mhz - c) memory, % - d) swap, % - e) network, % diff --git a/ext-sysmon-1.3.zip b/ext-sysmon-1.3.zip new file mode 100644 index 0000000000000000000000000000000000000000..403e0f05915d8e1b1a62c660eea7ead2ba233d79 GIT binary patch literal 4291 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 literal 0 HcmV?d00001 diff --git a/py-text-monitor-1.4.0.plasmoid b/old_versions/py-text-monitor-1.4.0.plasmoid similarity index 100% rename from py-text-monitor-1.4.0.plasmoid rename to old_versions/py-text-monitor-1.4.0.plasmoid diff --git a/py-text-monitor-1.5.0.plasmoid b/py-text-monitor-1.5.0.plasmoid new file mode 100644 index 0000000000000000000000000000000000000000..b30895eca7f74288c41c8dca3dbae901498bef41 GIT binary patch literal 21692 zcmWIWW@h1H0D&|SCua~1!<-B<49WREO#rmNkoD9qge%?Vn4wXTr72FJrEH9WD z7+6vm7#I*ntm+IyF@g`-h~)f~RERn6E7Ne9Bf`MMz`^i^HO<-d?^}^y+zbrYBN!OO zG0Z7S&CJUz(JQC~J1jf0GAJh!!(ne@YV&WK3IDgB-_$?bcG|RvZI{Y!Pc}c|Ir&<| ztX-YW3vV2SnP5a8PovmjM z6xCGA`<__wRXX?Pt*X{@O$Abx-)1b>+xJguuKkT0<;zyQeze~382<}_<89sl+t#aZ zOSf2;#&*x}!@>IIjlzo!xZa%jAW$RgDzVr?Vxqh9A@&R@p9z^iG!9J@o_s>mkHd}6 zu`PdVGe_luvl(0l7fe3t$|xEg>v(XYJJ29W{Qdg8i`8!)pC|~dH!6`8j(RpV?iq^5(@#8BXnEMfD9HBX#ST5GB$LjM8IRsEFU)9V% zKaYJy^;g!v7x(Ua7stC#hCx@7{X)0AfqT)O3#AMaY@(8OGn?KqeE9h1*Bj=7694My zdk>0BFzkB4yY5_m-i4#fv#+@RefM=id0F+%y>5SRzy7y;b}{clX`iWw4#X$j5u7cz zVL>aWPvsn*U)(+!Jgat!NlEids9ig9j#(qEA-gqrW@It*eKr*^rCBcOS@9-0N!pbKru$#F z*8N-R?!MhTHa9z4gjMd9zx`zMTj@n^>^#f(l$z?!mG7Nz;cdHrzjgiM)^&o_$JVSr zzi!(kZQ~E_eYU%~I@u2|=Hr(a=14ASmA5>;)bPld4Ga8*9zX9b-;}EtTV`Z=c}JV-G03V;`ZTxZ&6eUc_O^`DgbZVAS2Demp$(=5%`CGEj zM1Sjk6MOYs>$cOkl^zxC_Rs_pY!dO_h)PTxbT`wHES{E=pA zl^^Db6Z`>R0pU zS}R`A_;B*?i4QWL`A2+1b=$h<=2v)b+`^vl#ny7~nFFmU z5i7)AFN@myYJ>mIpp;jSl60>5Zv3P0=|D|tK>rNgn}-BH*)dcpr`Akx)l*!_5b@Zc z=flTDj>=mb|1RDyHDPO_-v2Ba`D2P}p7=OtxP|z2`=6}a+*ro-yqMi|7Ww-x`&t2ximFqxkA^tZyI(8(v}8~weq@XPi5duew&*S+s)xuz8vbJ~zIz1y_o z0cYRT);k`XS01WV>^3`Fa4977<;2X-8@68&vzK}pw78!$W9sqc@+-`ImzZqsGCk-u zr;y#$zquhzwq2KVW}^AD6;iu7-mc6FK6~=O1S50Zt&=Cus;fMz`S?!Ahsu~4U1vn} z&N~==7T8$joZ#R!>1b1A(k=PssMA-v&#_(+Khxg2ZtAz7lg(w-Z1FW<3L&76BMS7~lJX-RhRA7Sc1eOm+J4AVm z@*`6hrrr~peX)P{oSj;lO#ALFn*YoxX)^o8_gtbP?k|455_b~(W3GATz9!$XC;Ro4?-wUvHLW z@Uz$NY-jG0-f)Q|+?_M4Zg zA>Y2t{~vY3&SLlEi3fY#XJ&B)Omr1r)L_PWxY#dRXnqre#?*-}&yxzoK8sWoS7uDh z+WNI7Dahu#5M!jKgl1Z$$-ZfwZv54vO@b@D7pcBYJ;)R;p#35IpPmJ)hc2(~y?_@d zG}k`KHMsEoPrq|Ojeu`~sJiymRT+s|Xf(Ao6aGLiq0%hfJyS{CZr5nFzZ`NXFs-`&(+UhKWj71=*&`jWks z=BKN_2nosmb+`L`*6`BICBCdX^Zj%sKTJtH`)0e-=0z{Gk|&>QU{%<9+r^GMXxS>u z-j5zj{3;)>PyHnod^_gQ=5x6rXM0u6x#G&p7SDM4^6grms?UZiC){oLrS-x4Q}nck zREvxT7WVpj``qJ~H1)WRXJ48uoT!uTsk&G)V$yCG$%&K7FLy7SD08+?=IOn=!sc}? z$!$Alw}h{8kE~DHW?9y|SvmLUoENee8_Km3UYJT$E`2pglR4rZYyZEtGR7d+&2AdA z4wPnSK6l zV%}li9jD)R&3Y(4b5>$T$V$nET}u)?sw1~Dga_yzxIcdzZ*bOOkqpkhWhc+&HMa1u zieBzpUN~D;GpGHaa^JhhoEHDK)ZUUUxwTACYMJvgqeHyLj-q_JZ*?c%w9RI>`>Oc! z?n6c6RN2!_3iFqJ4xGVqXHC3xn$)K)wWTfGI}<$vqOy!Tm(`Rzp3uo;>aus8I%TfD zzxS>W|Cmzed0&%|TJmlVMM;@YLqMg^vW+cx~uhk zrIEqT_H)akzuYl89QZXyH2LlqMs2kv?}Ed$&rGRZr3YDL2bNc)5~M5Y z_Bgdp|CBJ3H`&>Lx@6hg=bPfrZPYRQCtqOZt@FKF_JWZ2`UQq`MPS-jH#d2%zvlbc+?-l>CT04+87I&EopCbFK5f(K zx-(mB^mcDMe4?pQ@5hqZ0)d;;EIM>PoDgDk<-gM%@rp}m_m>YJi#r9PUtK6%`e8%3 ztc96M^5RD`AGa*FaT7bo7Chbm9J~75sr?-4HM6^A4mRFdvQ?w$nysFW;+h3VqK`%< z2kf12`EchlX^wSQ(>vOY7|ph=;X25AMYVD2w@nM0R@askU9z*BXzw*$X^ln7q)R8| zX7Q@oy=3q6PYP++QgAG#tTJHJRK*Wx7BTMW_{|@%Z}Y|40<8pLb90gJlK)kvRNjAd z{-Lqn&S%Gzdw$JJdyp3V+x~$DPvNpCX{Wry(i4I{neP+ST-qAtF7kfw42`-=#cGC+ z+76Yi?cKIXvf8lo+wUg_kIp(UWeum6*j-Nd%G?bBCC=VKCC(EQ9=4a|NUEz(<$ljn z;oMs8_x7sm$z7`DD`zw%?VgeTe%-bORf?%)i!$$~mN7-k1x@quXjR~L7gg#qp289` zt>Nh9ZGwX8YAaf|bvnoF^bPJSdM|zN)9s^1wF(Y@o~`|q`H(}J>+BlFXYNyG@U}dh zxpckQTy52}X46}&eV*Pay(^Ty^n~n%B)>}`*KOucE#P+7SE+gCzIDgnSAGgIp=bB) zy2$VGthBx9yUDXhObWCT#WTg+!7C!je?qsL6`MIRoJL!})CO@>r z9)G)Fu>Y1|ZF1&f35E#&;9dM*o~3=0x}Yb2-rB}UEw9bvkI^oU%hPXbR;7!-lzo_e z{0zrsafc{2!wva|uN;qlB*-{->55y68S6fB*DhTc@kqv_`Q^uro@@s#cZacjDpr!| zulCcg^k1S>wR%ZJmXCt)7iRG}x7aNIgS#Y`xEoe!Q<+P0~+Cs)vD^HiOc7A!_r1e^|B z3DI)h*>Yu@>5FYa(vSX{`fujn=D%rq^d_B?x{>A`kCnu?pL_cHa{PR|yIFAu{@t_7 z=*zot`MSaK$$#rNO`AJcyx`3a?(;LwX~^(QnO^Y8Ky};3hJ~K*YMtaB#2*Rw{UrPU zcV5=Ywwsq_UhBSkcs?WT$AhYKSAum9{P(kQI#90mCGhJB=?IJB3n9`ri=^$o_UyJ) zO$Z3c-TS^GL2=eern3o`?_BF-FL7%SI{)e5%n$nV`gsqOH+C+cRbaW_n3wk)Z|@B| zMp4_%V)bq%JCf689MW_ykX333W`DctO2Hd*2cDXD2bn+C{NZEw7GJnm&qD6jixpE2 zemhV&b5=`)c*3fZr8kAkYp*)X^30B&XQ@|~-X^xOxxX#*kZj{lf3@Px-C_Y^|7@iH z{`;B6a=3f_hvy$&WmOpd`o)&|^31{IPa0XK@tij0HR+lADP*>ufVI?*lA_W-)>%CF z=g*zryDy3T!Izwp!lGK<<@47ka7;hE`r^%xXMcX+(#v0`XCFWR3&T22X4e3F^&P@? zHWH3=17wQq-+T#|36Nhn)9TC>_9o`lf{z&+S9<7{2c}%{IX-WZ>NVFXu}44fN(gU| zz18Y|-eFdNdb!Q+g0yT~v18#}Tr0or?F`(%OruZDua|R{y{YW+*N3W)FZX$PS%8hb z%jiaU9G}RJopRsG%GBm1AAI_V+xAWE!sBZWOJp5iykUCHm%_X?wm%;qKACvlH1vMZ z^z(W@x9>Rc$y4EZ_PmFeWdCIRxZBRJ73%+HW#Z)P)(!G=eG+WUa+>>&%g&!MS#QUU z{MlXyi@#-VjcPRFGWO(QGjr{q8Kxi5v^Ze4eazpZdoucRg?szv9I!2)R$?^swv_QX zx2E5LzK`uK1RDx^dFI>JKMYQaj=R#ISi4^6uvi|hv00wu=&mU*qGO8tERQKo ze4lf@GvVu@jk}MTEOnjuhW%L7-5p7fyw7hi?6qC7Yzn7Gck3o4DU*x*g1s`UW(cz@=pXJy7D^XG_;0i?HSIlL6f-5H+Dpjq&Ca7i z4f+8(vP^$2PbzeMVNgEl&MGM$M+KA17vD+CEK}6Wc{N4Gcyn)$2)l-a-q|x!8)h6U z>zx&5r}45u<&yu_i(a!YpLEvsxa@S<=2ZDhkA+pM*Zpq_JbCzl&y~Z8g4)c@4xi5a zD^Y(Ckyy8|bDwqekG5sAYOfxxT=>yz*`F!O%lv0C9n$({!t~{q;KCcyU*bH2oclKN zU90bSJm-S=m-%Y#|5xl{tvuo~TR~{EGS9=!8``Vu^PZ)Y?R>N%F?EJv#=&RleXJ&W z7M(f=r1WJ=9$fEGI291L?YHg(XLqA5zl857&f4+R__gZRlB3azJKNM=J>0;l+mQG! z>8Fn#$5B(>*RLG6X0g@UTHULizj)RPsgJ*R^r;_Qz#MZyQ%qoAYQU7&n-A^%^QV$2 z;Gx+ru0@WRW_3(i~ z&TVUpH%=FJod19Cs9Vi}f02ik?zu11dbc1jqVV`r<5OwE+c!^GtNKOhc(cm%3!!<} z4LZVCGM%_ql3|ci_>*(Gjk~kpw9lKnC#UM~VBfi*jiEZ`V#xarOFo8gHBON^Ry;vf zfno;HJEopfw0N9Q+O&B4gu83+hVL+W+g5VNXMda7b5-B{OHm`nBhdOuDnVFhPXD+&u&~-^9c#7JLMK;#KQ`V+;ZEDoIxlzMm zL6_&6iYeLw4>Q^RsrzvpymXR#!_{A!wbg%b=WglPlx+J=&A)xi4WVH9k1{M=8<&=G zU%T}wSs^WGWun6UPPVz*5>#aRWt5p`ehk@DpS;DZoOD}(USY~Seu_oZe<`W(-zl1VQnZvU)=6Xu=%>3rpx&ECpbz7Y@w?Fq1 zei9_5HvN*#&METldQYD#gfHGY)j;9vrL>bTu0J_Dx#&r{znQOi;=$_hOzo})FVzUK z-BN20@0hICy;17<3xDH~;_^4UTV9A}nYPTDb?AnYkJ-eOe~}uWCd(JLb);xKT6^kZ z+U~tm+h^QZD82oSWZKo~3jWUOcPqDSZx3MYJ#Bd7>$#K4>bFm==f820*Y$Y!)7^_E zL^ixJG?|ob|8h{r|o~VP&(L`b&@G(q z)267>`)TWS@}C-=eUQ73X>)nS!AGL|S-++%nf>zDWZBL7x%NlD@#Xg4j9Yy7-QTAY zWpO4`um3)^HY9iZ_Bz3m!&_ZKBtFM~v}*eEP~+w7`>(VgRNH0VD*j`%g2CZq_JKFe z{@wv%zap$RMcXrHUf!0PYV*jjPIp`1q6979#O_k{GxH|q>}1{^BW~obCmxdVszmqG zhO6w^9h*K0zP@$m!_Q^gI&W^=b#M2}Sw>uDGX=uJYq-xGowNE%w6&zVdlxYr_1h4ym9>WY}3ncjC*5kHNxBd zuj?)LG1fcbV;(a>aDwvj9Wsg2xL00TyMOu2=}Frb{+TDXgJ-j!T;1ILCXH@2&dO?m zy}Yq2_S#jP_DOLi9q)Y~zK3&#OlW*^gU@vHxsNLy z&-Tcyj9T^lPXEppgTPJv)-OI}u4{B~$xwWgY?iasCg=3k?1Z#ir3~^@*#G38F3MJT z_R4a?(T3p4`jz@8xC(#H(XNx7d}Hnb9_x*X_bcYBaNc|LZE?)R{ep{S+Me8g9sVc0 zIO_lJ-}~2I;W=x5Ddb_iL{@CcQlW%9yCw*x*%Y=uNmf38>vQma4`UmjXEM`|3N^{) zI?M4fZB6u^a(}}=Et79Ty*1Z6yeBi3hTgyb(;hU24QVj;?M!t(ydWhtmWhEOg$3K# zb8>!OT4p+|u_)tQ86@kB(OB%Aay##qgFxH+%C7iRt_n=zE3`rvu6^Y)K|!^_LgNva z?l+0`o8Cn2&JNmNo8B4i5#k#A^U%NaXR{~290C^_|qx^H%ZAmoj1=Toai( zb@!dc_uqaM)c)1FQfa#VWk)s3eVk!R#X)uNzB#SZF#IhqbMCs)biP(oYwd3jZl4i4 zIP=VY4sYg=WiCo4I!iBAYHwev?!mwCvj4H9^RB6)$q`zmUSf9Y6`QKrC(FveQ`5dP zQB7MU?P=Ia7Jehew;WBz>_?wYNs=~DOc2qExFVX6GDCZhNfpDSob479O8@lyn=fLz zo;P{sMG?Cxxrto@*B(V_YdrLycyWKUed!FRSIU;=tlK9WPn52i=#}WLA)C51%eb-j zqeo140FlB!?1#_xy?)5K>`CR* zb$L~1xl3bac}?tQ{+J{@iCxd3x_+}gTfi{WQTqO|?x}xfReXME zcU$7M3Rm)*1X5W{ZtUS3lecjd@IkK_;)oxE*|Jf$^D&HiH&CVm3o21b(ML79J{r$j2si&7ItLNTNW9c~Z``zxxwKkK!ao?!l$v^Ky zrA;OKOs;SBSCxB@aa#zTw0SytWz%)`x#k5nvlGrdzrg*`PwCtP^C>z<*sK233K`1n zn%8k}vix7(vejw?8`a~y} zn=HkP7B1BJX2@#l8Zg66$YsL*IdL(EHIL2MB(QE%;R#!d=W@q{8Us^om6pFa9C10L zU3l)n11SvZO%*dADcP|+N%2o?Te+mXVlPMHk6Q{sj|yg7%3Q7>^!D1KnCAjUTfdaN z4URu|fnDzTnc#^RN|qh*5Z?1Vkt4aqCuu@!Zjyq|ojJVradG?$%L}>9_txz%H{4^Z zvSt?7rbj&7YI3TI>PfRgP9>Qxztj2Pa^e3M%9UU2=FFYXo1e*4P-M2pLXPLblTG}# zJ6?TlPj|ome6L+h?DzG0?8o&EFq8&){OcDnKk;-S*RK^GMVV@~-c4R!x?d7crFk5x zI*~p_V)4?cXUYS0MLxF7_#(o&d(A_|4-82QZxzfhic<5kS(Pq*F6sQ$)IUp|6~ykh zhJ0;QvIv~>q2YzUlj0?_8iAn9c7I!oin}jm-jv^yDS1$Jp;)?CK~ym2to`ck@6t<` zsQWAxTiG-{^m67gbDjEsg@3O3I;knAeU9o$y%YU4f=9gXl6U1IsV^U2#0KdfW1N5I z!wvE8=blTy^AFg1&$PkLj?F;oV<&aqKCpVujT9c?p(dO-1*?2>~|s;@3d5w=QR19=B?-m_wk*Zc5HTTMpfk} z*O*Uv+ioQ+)XnJFRk1>9uVz(w^2dfr4F64z`wo z#%b)awl*>syn4jTbY;-R)rT}TGPkEFE?W6M`i;phFPHVv9Ve1HlzMc^q+(UOE{4sG zFn0*PXB^F9yT@yzs$gi!#EWtg3y;Q0gmq?Eo;Td;z{fqaJ*RJ@ZE@U=k`~?*GfrOn_8^VDGVIBn^z0{dc3jPvGWj}t{>-4l zfH1#13f;D~`(9~tAIp(Zij_Dnv2NaWx!9O5Gq=zBJ$+B?zFmUV4+6z3uiktnvMuWV z!F&NAbs|dLcIzUsDS>f@-cH)()1G>z&FkO%iyz`7$i=aU+rOb)}BMLG`FW)D|2u@==fKAm}Eu31pk)z)+U zCr)12-|m;IwyR^l&*oVZH2cc&*{_) z&o8Wu?W$h%Z|9}Vw+b^|cD4LcUVJ#|s?>k3pe3x2PG3J}zWT?S(5dPVHmNLpb4_Z~ z*CprHPRTf!kRRV%wWaX7_6+-w2h!6Yn$G{4G5cUpNTgK0`c6AKD*QcL0sDoau;N^Q)n4+=J7gfh`e3jBMCmUqIvFbkx?Lu6t?pyo%VLhvu|hTI|t9( z)s=ql#pE}hTi5e&^Ny^lL;c#bCNc`8J${d5G|Pr`2{Jk0AV z{+!WlwsPW)@Gr9z7O0-O=BgArsq6LLd;ja4Pi{(${-o>~e?ZDDX|nO*{`)-b&ZqV_ zem%l8+geU~i$c)4ukCp^Z~o-vtF#cim#|_%Wd56jAMZ98<@4muzvt!k{(-+%r~m#3 z$Lsl+9{miR&8{EFfB)`6bw!aH1rLTF7e%KuJy|Cu=oo)shI@iATa(qikVCKCyPB3a z7%V@=%F=O6cClnm*9>RY6^g8`t_qF2KTf~?+_u73QuIi>-<9vS()TLOQYSGToLJf| z6U6@OR!^A4MGif6jt4D^V;9++i(~k@A^w1@sL+0AW7(vn^DKH7+*&nwqZ#uktFTdMw!DwOm zcAk8E+@X`dxig%X*Iu->eX}<^-eGz9#mf517}gz2q(of*iay!3v3i1IyH?50IX=IX ztwNMc?l&s#T>K(pc2zk?PeMlPW8Xc`ip?CntGYC-AAex2&@)))Bf-gk*yZEYe*-uaFCOW9zUZg${Nltz+ImyNEV7;V-pshN_E_9r#=WP@O4E;v z+BBT|@%G}!&9Bxv=h~*K%;sjz=eMj&n6grN(TPPVPkf)A+xaQxd|%>QAF0Al7Kx`t z?D5O_q<8wFLSBb2Z>^I22**jycZq}l$9nb2ldfynBrE5tl$pxG)dpZ5claz{N zxyia3dNWeCP3_z@u{p<2@1ep}y_Q)o&NTKmUsbPtm7aLsQ|3&yChOOgb-7QpLR3SG z->pC6?z~iFQ8H7J^PvmNU#ZDxFHw1Lf>&I1@r{h@!FFq>SS9;Dj8y9XvRfuH)FT!96q7aoeHZb{UzusU=Bv@BE zA?xTH>td0w&tqC=-dGm&isRmaXil{)^Vv%jGB{H2JXpy;>%7sGEnjEJx)pAzZ&g&~ zi|D-+6?bmSL`mILjqv}6ZNog1*aYM6{a4D8;Z6EpYrqpp+I)t|5bwY+Rm`25eB#4K;)1#)W5q7K_r z1-_T)schOI7d)M9Vb0WPM;^U-Yq)ClGD{y-mt39Wv9l7l_=$dZT^@9(R^+M|+a8xP zu8<;umot7{S}(us4o7UP&yCKt={pS<=G81NZGY--ab(V0`F-ys?*&>Ox0gEHQZT=N#R>_|xv6E(E#)-VFDVvqGI z{Gu{#19mXTWgq6xIB@jG!`-ztciU#~J?iaN_B(o06SLc{99QdI3_f2zKCt*Ix{Fh1 z#gp=PiO(-H9eu9->)ZP4^Q+D!X+5%vDzUuno&D81{Thm^~qEYebX1XKQxr zW|M2qyJRMAV7PE3<+Igf{bf659o=D6@T{aas_y*WtiqOF_R`anob957`7Mpxl&hZK z{CLpK|K$t?u*QPn&BoZ%^$Ht-_cMZC0+w?(?6Txpjk3^`|NA};++OnP3e@_D0GZZS4Z#kS^mnK&b63+#8u5c)cMuDAIo0V|c` z!pEG`MDKH_t&6@~@3BZv@ymk!|M@O0-*NZ)YTv)9(#)%aTMxVI=*^wHR(ZGUo3l%e z?%03YtoKbapt-B<8;jJ}XPf6-5o>+TelypMLSa z_|d(nNl;$sgZ4uEFs@g^I@8V99GbSN;3BK;MrWII6ZU;y`z~YSzK?G%s3-5bsjDk^ zYVt>p=i!y51|NS12HaWu<#X4gJYHS(3BonzA6>1Q)``pHExYk)#-BG|laRDBkGBQ1GGblKyXp#^U|J%5;4 zq;dSyV4860&kKg6!`Tcfg4^!(_Wqs|xYG7Xz&7QDx?VkRw9|gaTq^4Ee2{qM(2^4? z*6RGtaJK)N*YNZd!?%LmA2a?LF#f!w_HV*sJf8E(BCQvp1^}(IpPdiJvy{dlq zO^>tgTON9=*l}-)ntJK^-3tm5WL>k5&pqKOAJshzWVc4sayeLq#dN#RIB zQq7XJFI}SUeZ6xkFXPef<9QpKC7=2xrKg%{NVLxQaW8AiRPTKWBB_t69|ww=t^KAV z`|8$$xldI8Zk(Ock>c$wVJ6IVhUKyH+hoiA>OYp0n;M7BW$j*|C8RS|>xZrLvzc4# zj`_NN49>p0|IeAK!qq-Z#{YOP9dwM#75l&Mfm-FiS;F(U?I)eEiJWi85P#|9%uK<< ziW5H_eDK!b7GLGF$`9um?Dn1eUz)z)eOi6&m*(7N_0IvH(;4>L{;H-C^0pna+w1%1;fLQYx$L!7+#e4w zRCoO`E!(tO`r`x1Kk|r{bIHzB=RaJD_pO*27{0PIFosi+Kki9EGf+uR%CXV1G4ncl@- zZ~c74?#p40!xP>;{xGLlbKl~{-`%Io2zm8XGStrcm#$0H+VYabQ@vA9-?{wK^Zk^h zqxWBiZ9E;mXPT$qer^|~&E0>t>a>IeCUx0g?7MF=z0WIqT9`=7@iRt~jc4u`pLRYo zS<9}-?U7{Brsv`%-MFYNt9ckNB9J(ph|7UPYZ-oxq^ z{lnq*Bu(dN_89XeE%!^^^u6zE`gp#QvNTtH^2DL#K=n!y-5FZPBbV-SaL}!l_F12w z9^BPl{zX@=|M9~w?_{>xnVu($8W}k`ee(m?a5u4BK^yoyKnm1EW4OvvukdQn~N~t5{bY0GiG0X+}NyH-E+ru(R+gc z_AITXF>557eIwR6`aEcvI{UwoY3dgt4@ae}a=Cev&v;1RUs|nQ=(DG?cwVg33l%Q2 zx;G0wUQBIzE!FeT$fwT6j$NYM(yL9TU%Zc*o%$JX^*{1VR)WqcciwSir zBljtA=Eco!%GRuA(fxfYD~46*y6E=(F`AnNw3wD8leJ%6@ow&rTT-&%+l8kVOO7`b9B0={*vGi@ z@Uh&<27U+X3NgDnc z=Y3!9Q+@UDc4oe7>38$`+7xlO^rD|73IF}ifAsvHvRnGd{8wN0BQoN~-KoyfH?l*O zxEL4?D`3lrxrv#1u#70@UKu3sj*$`fMrMcK_7M7eZvBc^b|-h|M&aet7&W6TTi}8t`WNOYSpgT_3QLJ`7>UB6#J>g z@%W|Q)0-);tLNRkQQ^R@75SpT>hz0~-_8YF?U{MXBIbg|r0XlEn15;ZaaFNT-eEtt z+u&1;X+59ipWSm>HC3a0x6Tl56V_E-nl)V|uNni`s~_q%^tThd!s$?Ej+z!#T2U!1m>s4rizz`KR$iE{k?u>$*+laJ?GB5 zFP|+VQ-JX9P4a)*_ zxiZx9RG40${=nA7xg>1Uk69~RwdOH(`m*FdJ)AD$rxA9uA+NN<J6=@27BwsxO@5qcriH>#NrW zC#9OE1#Fr-b9e6}KI!7Vy;GH@f3%mGc7bz zI<%|0^D@htB<>5Zj#YO)TqqgUZ?ZJ!k76SGy`5`n%8xtEDVrs_|B2(-b>;cT|4*oE zOIGPCEY*I;7%Q{iN_OrJ+kL6Of9|h4Lp?9WH6}kyrZj@_H3^3lS+rL&C#B*{)^SDaH$KgKc5U=d3OK0r`3mT zuI~MR_|;a~ojo1-b84atrYr2V|k+QZOxu$x9_rVSeIP*#?_VW zlef(?Njw$#_jmBN>wfGE=hpuZUUMq{S;Lnd#gY6e`dT~&8*e0SSZg%*;Wr*W-}XJz z_v`Is=MBEq`mj7_>Al$WsLE+;>~D2lNS#)xy1KhEWm&F~joV(H$;{b>yHAL{i7~t1 zVel;Oz}vYq=RG*P>Up$~_|F?07Jf%B$9(PWnE3ftvS)~=?(!A(LE>-Sp6~qL5PkLb zrF~gdx&~7;dDk@ZNlBIOtX+5E#{Q6uvZsu{?!G=eTPP{v)(_LEY6d}e-jUa;G$y=! z$u#ZU-Fv2Nmt$Tu$d$U?3t1C9ll9ZHc_(h)5}B?edkZYr>q|)sxa<>OnPqml z`;JU%ms&e#xXtvgbC`Ip-X;d2MdC!Rb|4 z?ONs^Uvw61`2I59K>DUw$3qdd??2t#K2>T$|*a&#zTo>z~;j2yu6(3)jA2EBz&zhcVg8Y;JWQ48^+wpPj%l6$h zSvK3BPX1hO6QU%w@)93!rOlVgHa+UAVw*RJ*ncf#Qtrsx>f|2&W5Jpkju~fKa!sG+ z6!V^%da3bB&kz6S=g+M(7Mp3Tkk0O`aq#f|8w>lx-p_jfzw7r(RZi<8b^ZmrS;~*i zn9s_%`A1pA1`Gc}>*>XEb?u6OP94rS^vQ31SkY8?@~`c&%0qWcne7gk_|0m)axPz1 zO!1w&*Ll~po}}iox$_HeF3tb&{h|4x|0yQTyb2GPnEu)Qxe}3*X;krSv;MT>{XH+P zbouqZC~@6V(wV9#7i}kJ%k|{T&Bn$=@kaLPvA6Eazk9#Ez-xcxJSO%YkE4lF9e@8y ziCIrIom#BZx?fkL%;d!V8!l|zZ1#I4mbqQqAs4c*>B#hH6)W8my-xQjxh%LXXz^wN zXHZMeRROERjULerT$?#+_HW&$+jq$H?}u5vXVPEP<`!HJ{!y!4c6Az0+MJafr4_fr zvY&ogDJN~K{QO(^$*t|j^gh|jcC4LRlA)Kg!{eu9eAe18@4^?(G-qmc+3(!gVY=Js z$*S|4UX^V#iEY|5FZ6Far&Em#*1qd?_6CTlF&EHXHM_cpZ5+g&+M0*)O|bcli0miWha*j-hZ>` zT}@OjOIVHepZ~YE9{R7mCn_ty<@*lJm+PI&?;Nj9Z`Iovdd)k~`_;UJUH034>~0GE zwZk~9ErMJ0{nVm-pEJiSR&JgzGhc36M%vo5zaz45Y*pg)opyEl^fxsII$D?iO3TjC zo?SD^Jus8wMflGpSEj!IQG9#S)T7@s(yM37UH=g*dEvr=EfUrI`!`3op4T{gKQu;w zZOi5N5uIPctgzX@EA`p*f( zRpxfRQSXl5++85W{U!R++mG(EzAvlh`tg``*Pn9nnQq-a{cI`fInQ_Oj;=kjF}doB z{=5py_pcm|YNt-kj{ju7vT@%m-N0>_MHt{uW9CKYVvHOmQg%4;<^}Vfn92~dY6nN0(6NQKO59?eKm5*xD+TQ_ z6BJC?vchSrvXWEEW{2ylA6MKexOH?{zD@}zztEGN90%uEDl|3n-}!u^Wn#pp%r{#Z z88c4CAHMir{=M6h{|}9SuC6b>{NLc$AEAt^F%H_%2E9lAUUbb zo;vovf3F|ze)z&z!eL$8V*csdw?BFHnD^!6*Z{v+7tDG-$uib}W6j|oOd^XfY(11ZcSWVr3`U_@99yL2 z_o>u)F)h6HMDfuD-zh74(r5E9A9pkVcZpd^>Q428uhFbe7z&RrXQ+S5DY*4ywxX!f zp7)dARj$8o`}*&lw-a~Y-d9^>)Z5~}Zu{l=K)*eq( zEcxiNbC1$xi-G{g9vR;g4lO|j_fPEc`*k;J-rCrUr!=zHuDmWkZ=yxZ3FAkc>{VBr z+~)Y%sCDOTtz>vy%9tX4JM5O>_S6&2*B=$`S+wb)d75svyQ{R_mNTL=Z|Y4+6wNXa zZItp~d48{|*1|<$jY=LS0{>hZ%(e-;pQvPgA2n@lWOUffAjvOt@h#dnXg#lgT-DhjOJoDUNcR>Jb`b~#1yNk8(vxQ6f-}n=yBWd>X6f# zvd2@qIuaYd-ON_B`LxPNqexTqb1mcN#T{>YpWJpyIDO%*Y;XFO;xl2ItK8MkNN1~k zIo4s@K6GEp})6b<^50c5!T8S)*9^jjfJC zOH>oS?w74djf&rO|HOVh55L_KUu#$2hdN_*$6l$+_Ckn$#qErYp1ZFveW-~8S+zk8Ss zvVUxHd9-cD-IHJcUpUU?*2Tx zTw~<=vag%%|Bk@7Z(cK(x^H3o_3-enh&RH=zV*MTz5ST$$D!r@A97u$>)vW#qIBYN zgi=$&Q?~P2OBENe&*1qcR+8pmz_%$c%rI9z>&}|2Q*Fm)eY}$_zepx0d9kC<$5Xjq zXWl<>ibZ2?!M-UnX3u1$4y}5m;%?HeU+cr>GAOCzn@poCqo6&?xl0x+%f(tluoJhcyjqYFkjsEnBL+NL6&!poz8@&O9%CZBMcsJ;=Tq4vr`IJMyk-Y;^PRUb zhV2YeRM@a$TimQYhF48u4jz21x3c5Iy{}CY={JwxNIiO0JMm`R-k5h9yvlE@w@q2A zo6UVqB*xQAVV{c8zK1pQE8aKFc=@j2_l8?Dji1*k$<6!|)ce(U@;$9pAKooc$*i<0 za$NF}vsK3;Yr33&!#7S3{s$)|UtYbzuzpeGrB6>;HJbNbZM4x{%Dn0Fz3%*}FJm1q z=zX}%7mIJ5SpR7gYW1{2B0g+g2^R zj~2H&|EKWV9jsN|XB{U#r>O4|i{$pND=ZTdWDUQ+>1kk@)bdo~6XUxLpQM9(o~XJA zT~}KWdvvwXY^$${D}#Gy?Ug?BdQYkCjQl(7Tf+*uQ~%agzq#_oMs3#bnECULOtnt0 zji0mR;LFmFE2ec%SbSqs$g7EEFQ3-WPo0(3WB%%B_`&Scm)@wJDM2fHrZ(cyWEaP3mdzn_Z(uM=I`m+_3qC~ z8@8wTsI<>`RNqOE)FP@FZo_c?eo^A8K?Dort0g;J8i6{9yei)zZ z`LxJrtJU+ndFI-yh3vySnI|;+81ikq8k84n7`!NEr@Yp~&8Y?}qJlU-d;ZtvJiUtL zSj{zGIS#M1fF+H(4`V~8u2~hn=8u}Yaeh~H*EX}MtftcMUv;V!8w3T(7YoF!4_k5R z)wER(YfneboBnn2@^>9-RrSR&n*z5u+vIUK%iVdC6tMEHNm|gJiMo?w%9AI5to>MH z*V?&e>YfdL)nU!i6CZ!RfAwEY`U{x}FZ0*haGL6{?<$ z&a7-(>8j7O#A|=#wYZO4tsNh3OZ~or;qs%uZtWM&??3%-dDZmIa{~&_)D_EG@89|| z&AKSe|Mxh!w%&D(LBgA52cxq zGc|afDuehiCmcYgK-M*bOxYp6PvkHs14F@Fw2g43nfj16EOeb{X(o7y4-P}$#zq(4 z-X>J{ef@!oOLj|_zBy9*=+r9x+(*W_=ay`pWLKsjG|fPba~eyoc5&UG$c7~qQyn6g zWKOQw$Xc+I`wi1?T|Jg#`)w@Db}836%&gv3|KV|lyx{c|vC`+uf5$JAudCSp|8z>e z%%v$WbOn6BUAVEOP{2oTX0`M4`rzwH-;krJ zIg7T*x0+{y^YxRPEED-2{tL2mNuEC==AYB!_LCVoHb**_dgwf6@p#gG^5VyfH#+Lv zZgM+4=eDz~VqWqw|Kw$l8GXGj6``I?zj|xZ%uFY5>frHDThRLB>~y&af4@CQ4A;n& zzZ?2gtu?XkK<%Nkts0eTqPAjMe)8!-ft|q@UlmzjS?c#9=CJn6rt861SFBj|B(&Az z&jO*!50^iF{P@su>zywTm0RwgK4!A?P8{cRyNtR|jX(JeI)zfr%;Gi~rYUKE+=li&Nee5Bvy!Y&{e5nr9J-=ns@BF`S{u7K{&Cv+&GmWdJ?GS~oiPHR z#eS&HIb#ufaJ8Gfx8~((^M!SH9eAj5{nzE^g{#k(@B6Yb@KNNZx>7^S$_Gn7dHz$M#jw{lrLp9-$l$UZj1R?z5J+n<%sbVOOwPDNePm=TnD%YKD--R6v2 z9*;_NFBfUNm{MhW<(pPgd!56>b6iKv=I-YE@^4big`@NTJb4l$@JChZ`2VnzEBiIC z&aYxj_GD?7oOgH#Fr%?tCs= zqwKmS`EQ!|J-K<4v;Fp%ojO~?b(XidgSYz)XTj9B-?%#V87|m#yzNX)kM!baZ_~vt zd~I4}R#9Zcdg?*Vv3DN1nWn!E+~`P9Yh7t`Fgft_mqTd^s}HPrUs3w==V^umUYS>P zCva6T`V_L=6}ZV0%@OiLs&@PLQ$6!kDqpny>_{kPe7M%X!6`YaEAv&{GRC*5%(rB> zId5wFxX|sC-^5E>W>(&oh?%y7m%;er(iL9}CTwo2-QMhfnQg|A@+0iul_v&yRrK1$ z)^-Pk2(6J5X%snOGUeHVEq?r0DsIKw)Gq$G#oDHI`<}E7TTZNeZ(-H?i;3gIh4&X* zUaA(S>15xvh&{fm|I!nM$CXNn3X9yLIUIjPoR9Wbt%ztixl&G-Pg1M? zQov2w5UV4ZY--#+zxXE3?>PMDDFZ`L=5^fzf)$Jg|4RR5nkL*4t~{qR|MyEL<`k|8 zulklA+_?Wi#hQZ~tqXYG6*@PcP+Gq4@MF^}GvL`2e)U0aX0 zcsx$!)Bno!WP#!5ge8uftuK^t=Cc`qESdIS_0PPY&Oby#GjHgsMK+2*SSgybPufO=tt$ah+q+zmyn7rCHrS_PtNqaXN9}-vQ+#<$%WVr!H`<#UhH;z0p z6g{*~)$fmxkx!L#r>Omf8?%$v?>e1z=dIzpSIv{Hj@*^Z<0$9u`PH{ud`9zonM2p) zmnLpM5c`0&z_Pof{S523$6tMOoc{e(UeUF1+Okhl zo|%945&vInd_wkIpPTFAK3C6n(=ol(lXv?2+5LXfb|B#RE#DiWtoOP5?l7I7Iq&72 z7JsWdqHh`lq%zDG95GH>&dVya_08W$hv%z2xmm|>yQ*eUNZnt7r@!l+kJXzsr3%O% z&aZeAm!rpJdp=G|{Q2dHiAfnQQ}mUCOoXL&9$a{~T5{W#r_mdKYFv-1@~ysRSA9+D zS>4Y*(POsf&n&+dP#vuI_0Oe*bpmVdzSMhnrTM=>Sx$=9@-wTy-!E)sGz|=S&p5~R z+Pp^hwbDBxUPhV4?~HnrFh6wtw6#++rntO|;5fe7O7GzQbFe(k=X$8a@s;q5uM z)$*PQ#`_yoC<#}u-*7(jz~nO;OV#BrcOH-Ob2@MPt>RtaeC^v#4&kONRLunYluxwg zn|_^{^*OsnJYr?p)Y98!4Uz9I6qc`hcUGEl|CQF&UJ+73&qSjyR38kQy}sb^JogR# zv6FLZJ8%Ddb=B-$e)Zz}^4 z?v1RU<6VR4@4KvAl?ZH zZ@GoXi5F*HuP|L_>wo)U?rh!o_U-;M_x9D_&&v62^UbWRGFfT!%>CNerp(}B%1Bvj z?Kn&7*ENI7B4_^8X>QS7d~?aw`(Df^MAK#O<~_}0+P9^gFW1|rP4IeGRQaR4tQXO{ zXCGU1YpZm0RQ9*`^SD z^JPMJ3onmxf4uj@DfajCKgKv$zl}R@QnF#fwNF-2+0z5d_I8CmUC>pxMZLQ2UfJfC z>eIdMpWZWhp~URO12ct}GJ8%x+gagp-t1&g-tmj#JQsrv&2A)$>ry)^)AY?{ace&{w>nkz(ulET^({Mr*3( zk~K>``V~S>uSlHN8}joppXjGMrFv@B8rR({*In{FyTR*NRM(dl9#i)2JDMF&%=5br zsl{{Teqo>8!6k2zv*xyUjS|l+QwA|fp976>2JA#r~M8a2<&;T{fSYfky*%TlZ&EeSH{9cPZbsU z@;3Q~7hXGdFXZd}$5XnzS{|P}Y;FDT#KEm=d}9Qn|4WL7yp&ogsJ}Y1NYwTe-;qPd zwQm<yI&EyM<-Bh01 zp>}h910DN+p~17%0lVcT>>tg z1wjYxI`U^F`f1A`Ff3{8W?(=ZAP6=S>C`?}2Ig$c0dk0gA%Xy=<{=xt zRT8`5(C!!LSVL9@X3#c0JXT=t^0Wnf-{xvK*?VlcNnAlqxEh+!|v z1_)LLX3z!*JpRI5X@_jSyf(V|@O5{r49uW)cX*86h_QAE+2|E|=tjd=60tHcgH{sZ zF&cB02-#>!OLU_lsR=e`#LB=7nlr*`KBPDR_1{669)@`sAm&4ggPG1q=7YxsSQ(f> z-FK`eLNXZ0MAQ)hh>4Kgdmqh2h +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from util import * diff --git a/sources/contents/code/configdef.py b/sources/contents/code/configdef.py index fef6d46..e8d8caa 100644 --- a/sources/contents/code/configdef.py +++ b/sources/contents/code/configdef.py @@ -1,5 +1,21 @@ # -*- coding: utf-8 -*- +# Copyright 2013 Evgeniy Alekseev +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from PyQt4.QtGui import * from PyKDE4.kdecore import * from PyKDE4.kdeui import * @@ -117,8 +133,11 @@ class ConfigDefinition: if (self.parent.batBool > 0): self.parent.label_bat.setText('') self.parent.layout.removeItem(self.parent.label_bat) + if (self.parent.playerBool > 0): + self.parent.label_player.setText('') + self.parent.layout.removeItem(self.parent.label_player) - self.parent.label_order = "------------" + self.parent.label_order = "-------------" for label in self.parent.dict_orders.keys(): exec ('self.parent.' + self.parent.dict_orders[label] + 'Bool = ' + str(self.configpage.checkboxes[self.parent.dict_orders[label]].checkState())) @@ -140,6 +159,9 @@ class ConfigDefinition: elif (self.parent.dict_orders[label] == 'temp'): self.parent.tempdev = str(self.configpage.ui.comboBox_temp.currentText()) settings.set('temp_device', self.parent.tempdev) + elif (self.parent.dict_orders[label] == 'player'): + self.parent.player_name = self.configpage.ui.comboBox_player.currentIndex() + settings.set('player_name', self.parent.player_name) self.parent.label_order = ''.join(self.parent.label_order.split('-')) settings.set('label_order', self.parent.label_order) @@ -186,6 +208,8 @@ class ConfigDefinition: self.configpage.ui.comboBox_temp.addItem(tempdev) except: pass + elif (self.parent.dict_orders[label] == 'player'): + self.configpage.ui.comboBox_player.setCurrentIndex(int(settings.get('player_name', 0))) # add config page page = parent.addPage(self.configpage, i18n(self.parent.name())) diff --git a/sources/contents/code/configwindow.py b/sources/contents/code/configwindow.py index e218dec..15e36d6 100644 --- a/sources/contents/code/configwindow.py +++ b/sources/contents/code/configwindow.py @@ -1,5 +1,21 @@ # -*- coding: utf-8 -*- +# Copyright 2013 Evgeniy Alekseev +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from PyQt4.QtCore import * from PyQt4.QtGui import * from PyKDE4.plasma import * @@ -19,19 +35,22 @@ class ConfigWindow(QWidget): 'gputemp':self.ui.checkBox_gpuTemp, 'hdd':self.ui.checkBox_hdd, 'hddtemp':self.ui.checkBox_hddTemp, 'mem':self.ui.checkBox_mem, 'net':self.ui.checkBox_net, 'swap':self.ui.checkBox_swap, - 'temp':self.ui.checkBox_temp, 'uptime':self.ui.checkBox_uptime} + 'temp':self.ui.checkBox_temp, 'uptime':self.ui.checkBox_uptime, + 'player':self.ui.checkBox_player} self.sliders = {'bat':self.ui.slider_bat, 'cpu':self.ui.slider_cpu, 'cpuclock':self.ui.slider_cpuclock, 'gpu':self.ui.slider_gpu, 'gputemp':self.ui.slider_gpuTemp, 'hdd':self.ui.slider_hdd, 'hddtemp':self.ui.slider_hddTemp, 'mem':self.ui.slider_mem, 'net':self.ui.slider_net, 'swap':self.ui.slider_swap, - 'temp':self.ui.slider_temp, 'uptime':self.ui.slider_uptime} + 'temp':self.ui.slider_temp, 'uptime':self.ui.slider_uptime, + 'player':self.ui.slider_player} self.lineedits = {'bat':self.ui.lineEdit_bat, 'cpu':self.ui.lineEdit_cpu, 'cpuclock':self.ui.lineEdit_cpuclock, 'gpu':self.ui.lineEdit_gpu, 'gputemp':self.ui.lineEdit_gpuTemp, 'hdd':self.ui.lineEdit_hdd, 'hddtemp':self.ui.lineEdit_hddTemp, 'mem':self.ui.lineEdit_mem, 'net':self.ui.lineEdit_net, 'swap':self.ui.lineEdit_swap, - 'temp':self.ui.lineEdit_temp, 'uptime':self.ui.lineEdit_uptime} + 'temp':self.ui.lineEdit_temp, 'uptime':self.ui.lineEdit_uptime, + 'player':self.ui.lineEdit_player} for item in self.checkboxes.values(): QObject.connect(item, SIGNAL("stateChanged(int)"), self.setStatus) @@ -51,6 +70,8 @@ class ConfigWindow(QWidget): self.ui.lineEdit_batdev.setEnabled(True) elif (label == 'temp'): self.ui.comboBox_temp.setEnabled(True) + elif (label == 'player'): + self.ui.comboBox_player.setEnabled(True) slider_label = 0 for slider in self.sliders.values(): if (slider.isEnabled() == True): @@ -69,6 +90,8 @@ class ConfigWindow(QWidget): self.ui.lineEdit_batdev.setDisabled(True) elif (label == 'temp'): self.ui.comboBox_temp.setDisabled(True) + elif (label == 'player'): + self.ui.comboBox_player.setDisabled(True) for slider in self.sliders.values(): if ((slider.value() == slider.maximum()) and (slider != self.sliders[label])): slider.setValue(self.sliders[label].value()) diff --git a/sources/contents/code/dataengine.py b/sources/contents/code/dataengine.py index b4b4669..8f5e924 100644 --- a/sources/contents/code/dataengine.py +++ b/sources/contents/code/dataengine.py @@ -1,5 +1,21 @@ # -*- coding: utf-8 -*- +# Copyright 2013 Evgeniy Alekseev +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from PyQt4.QtCore import * from PyQt4.QtGui import * from PyKDE4.plasma import Plasma @@ -16,7 +32,7 @@ class DataEngine: def connectToEngine(self): """function to initializate engine""" self.parent.systemmonitor = self.parent.dataEngine("systemmonitor") - if ((self.parent.gputempBool > 0) or (self.parent.gpuBool > 0) or (self.parent.hddtempBool > 0)): + if ((self.parent.gputempBool > 0) or (self.parent.gpuBool > 0) or (self.parent.hddtempBool > 0) or (self.parent.playerBool > 0)): self.parent.extsysmon = self.parent.dataEngine("ext-sysmon") if (self.parent.uptimeBool > 0): @@ -59,6 +75,8 @@ class DataEngine: self.parent.updateNetdev = 0 self.parent.systemmonitor.connectSource("network/interfaces/"+self.parent.netdev+"/transmitter/data", self.parent, self.parent.interval) self.parent.systemmonitor.connectSource("network/interfaces/"+self.parent.netdev+"/receiver/data", self.parent, self.parent.interval) + if (self.parent.playerBool > 0): + self.parent.extsysmon.connectSource("player", self.parent, self.parent.interval) def dataUpdated(self, sourceName, data): """function to update data""" @@ -231,6 +249,28 @@ class DataEngine: line = self.parent.hddtempFormat text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1] self.parent.label_hddtemp.setText(text) + elif (sourceName == "player"): + if (self.parent.player_name == 0): + title = str(data[QString(u'amarok_title')]) + artist = str(data[QString(u'amarok_artist')]) + elif (self.parent.player_name == 1): + title = str(data[QString(u'mpd_title')]) + artist = str(data[QString(u'mpd_artist')]) + elif (self.parent.player_name == 2): + title = str(data[QString(u'qmmp_title')]) + artist = str(data[QString(u'qmmp_artist')]) + if (self.parent.playerFormat.split('$artist')[0] != self.parent.playerFormat): + if ((len(artist) + len(title)) > 10): + line = self.parent.playerFormat.split('$artist')[0] + artist[:5] + u"…" + self.parent.playerFormat.split('$artist')[1] + else: + line = self.parent.playerFormat.split('$artist')[0] + artist + self.parent.playerFormat.split('$artist')[1] + else: + line = self.parent.playerFormat + if (line.split('$title') != line): + line = line.split('$title')[0] + title + line.split('$title')[1] + text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1] + self.parent.label_player.setText(text) + self.parent.update() except: diff --git a/sources/contents/code/main.py b/sources/contents/code/main.py index b7333d6..f5a2b8e 100644 --- a/sources/contents/code/main.py +++ b/sources/contents/code/main.py @@ -1,5 +1,21 @@ # -*- coding: utf-8 -*- +# Copyright 2013 Evgeniy Alekseev +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from PyQt4.QtCore import * from PyQt4.QtGui import * from PyKDE4.kdecore import * @@ -103,13 +119,15 @@ class pyTextWidget(plasmascript.Applet): # create dictionaries self.dict_orders = {'6':'bat', '1':'cpu', '7':'cpuclock', '9':'gpu', 'a':'gputemp', - 'b':'hdd', 'c':'hddtemp', '3':'mem', '5':'net', '4':'swap', '2':'temp', '8':'uptime'} + 'b':'hdd', 'c':'hddtemp', '3':'mem', '5':'net', '4':'swap', '2':'temp', '8':'uptime', + 'd':'player'} self.dict_defFormat = {'bat':'[bat: $bat%$ac]', 'cpu':'[cpu: $cpu%]', 'cpuclock':'[mhz: $cpucl]', 'gpu':'[gpu: $gpu%]', 'gputemp':'[gpu temp: $gputemp°C]', 'hdd':'[hdd: @@/@@%]', 'hddtemp':'[hdd temp: @@/dev/sda@@°C]', 'mem':'[mem: $mem%]', 'net':'[$netdev: $netKB/s]', 'swap':'[swap: $swap%]', - 'temp':'[temp: $temp°C]', 'uptime':'[uptime: $uptime]'} + 'temp':'[temp: $temp°C]', 'uptime':'[uptime: $uptime]', + 'player':'[$artist - $title]'} def showConfigurationInterface(self): """function to show configuration window""" diff --git a/sources/contents/code/plasma_applet_pytextmonitor.notifyrc b/sources/contents/code/plasma_applet_pytextmonitor.notifyrc index a6530d8..f62ff3a 100644 --- a/sources/contents/code/plasma_applet_pytextmonitor.notifyrc +++ b/sources/contents/code/plasma_applet_pytextmonitor.notifyrc @@ -42,3 +42,8 @@ Action=Popup Name=Graphical Information Comment=Graphical Information Action=Popup + +[Event/musicplayer] +Name=Now playing +Comment=Now playing +Action=Popup diff --git a/sources/contents/code/ptmnotify.py b/sources/contents/code/ptmnotify.py index 991a199..ba980c7 100644 --- a/sources/contents/code/ptmnotify.py +++ b/sources/contents/code/ptmnotify.py @@ -1,5 +1,21 @@ # -*- coding: utf-8 -*- +# Copyright 2013 Evgeniy Alekseev +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from PyKDE4.kdecore import KComponentData from PyKDE4.kdeui import KNotification import commands @@ -132,6 +148,31 @@ class PTMNotify: text = text + "%s" %(commands.getoutput("acpi -abi")) except: text = "Something wrong" + elif (type == "musicplayer"): + try: + artist = "N\\A" + album = "N\\A" + title = "N\\A" + if (self.parent.parent.player_name == 0): + artist = commands.getoutput("qdbus org.kde.amarok /Player GetMetadata 2> /dev/null | grep albumartist: | cut -c14-") + album = commands.getoutput("qdbus org.kde.amarok /Player GetMetadata 2> /dev/null | grep album: | cut -c8-") + title = commands.getoutput("qdbus org.kde.amarok /Player GetMetadata 2> /dev/null | grep title: | cut -c8-") + elif (self.parent.parent.player_name == 1): + output = commands.getoutput("echo 'currentsong\nclose' | curl --connect-timeout 1 -fsm 3 telnet://localhost:6600 2> /dev/null") + for line in output.split("\n"): + if (line.split(": ")[0] == "Artist"): + artist = line.split(": ")[1] + elif (line.split(": ")[0] == "Album"): + album = line.split(": ")[1] + elif (line.split(": ")[0] == "Title"): + title = line.split(": ")[1] + elif (self.parent.parent.player_name == 2): + artist = commands.getoutput("qmmp --nowplaying '%if(%p,%p,Unknown)' 2> /dev/null") + album = commands.getoutput("qmmp --nowplaying '%if(%a,%a,Unknown)' 2> /dev/null") + title = commands.getoutput("qmmp --nowplaying '%if(%t,%t,Unknown)' 2> /dev/null") + text = text + "Artist: %s\nAlbum: %s\nTitle: %s" %(artist, album, title) + except: + text = "Something wrong" content = [type, text] return content @@ -211,3 +252,9 @@ class PTMNotify: return content except: pass + try: + if (sender == self.parent.parent.label_player): + content = self.createText("musicplayer") + return content + except: + pass diff --git a/sources/contents/code/reinit.py b/sources/contents/code/reinit.py index 49bf25c..83aee8c 100644 --- a/sources/contents/code/reinit.py +++ b/sources/contents/code/reinit.py @@ -1,5 +1,21 @@ # -*- coding: utf-8 -*- +# Copyright 2013 Evgeniy Alekseev +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from PyQt4.QtCore import * from PyQt4.QtGui import * from PyKDE4.plasma import Plasma @@ -277,6 +293,20 @@ class Reinit(): text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1] self.parent.label_hddtemp.setText(text) self.parent.layout.addItem(self.parent.label_hddtemp) + elif (order == "d"): + if (self.parent.playerBool > 0): + self.parent.playerFormat = str(settings.get('playerFormat', '[$artist - $title]')) + self.parent.player_name = settings.get('player_name', 0).toInt()[0] + self.parent.label_player = NewPlasmaLabel(self.parent.applet, self.parent) + if (self.parent.playerFormat.split('$artist')[0] != self.parent.playerFormat): + line = self.parent.playerFormat.split('$artist')[0] + '----------' + self.parent.playerFormat.split('$artist')[1] + else: + line = self.parent.playerFormat + if (line.split('$title') != line): + line = line.split('$title')[0] + '----------' + line.split('$title')[1] + text = self.parent.formatLine.split('$LINE')[0] + line + self.parent.formatLine.split('$LINE')[1] + self.parent.label_player.setText(text) + self.parent.layout.addItem(self.parent.label_player) if not confAccept: self.parent.applet.setLayout(self.parent.layout) self.parent.theme = Plasma.Svg(self.parent) diff --git a/sources/contents/code/util.py b/sources/contents/code/util.py index c2ac27c..015af14 100644 --- a/sources/contents/code/util.py +++ b/sources/contents/code/util.py @@ -1,5 +1,21 @@ # -*- coding: utf-8 -*- +# Copyright 2012 Alex Oleshkevich +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + from shutil import copyfile from PyKDE4.kdecore import * import os diff --git a/sources/contents/ui/configwindow.ui b/sources/contents/ui/configwindow.ui index 968161b..62c6973 100644 --- a/sources/contents/ui/configwindow.ui +++ b/sources/contents/ui/configwindow.ui @@ -7,7 +7,7 @@ 0 0 575 - 500 + 530 @@ -82,7 +82,7 @@ 1 - 12 + 13 1 @@ -138,7 +138,7 @@ $ccpu - load CPU for each core, % 1 - 12 + 13 1 @@ -197,7 +197,7 @@ $ccpucl - CPU clock for each core, MHz 1 - 12 + 13 1 @@ -268,7 +268,7 @@ $ccpucl - CPU clock for each core, MHz 1 - 12 + 13 1 @@ -326,7 +326,7 @@ $ccpucl - CPU clock for each core, MHz 1 - 12 + 13 1 @@ -384,7 +384,7 @@ $ccpucl - CPU clock for each core, MHz 1 - 12 + 13 1 @@ -443,7 +443,7 @@ $memmb - RAM usage, MB 1 - 12 + 13 1 @@ -502,7 +502,7 @@ $swapmb - swap usage, MB 1 - 12 + 13 1 @@ -560,7 +560,7 @@ $swapmb - swap usage, MB 1 - 12 + 13 1 @@ -618,7 +618,7 @@ $swapmb - swap usage, MB 1 - 12 + 13 1 @@ -678,7 +678,7 @@ $netdev - current network device 1 - 12 + 13 1 @@ -737,7 +737,7 @@ $ac - AC status 1 - 12 + 13 1 @@ -841,6 +841,90 @@ $ac - AC status + + + + + + + 120 + 0 + + + + Music player + + + true + + + + + + + + 100 + 0 + + + + + amarok + + + + + mpd + + + + + qmmp + + + + + + + + $title - song title +$artist - song artist + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 120 + 16777215 + + + + 1 + + + 13 + + + 1 + + + 13 + + + Qt::Horizontal + + + QSlider::TicksAbove + + + + + @@ -1223,6 +1307,10 @@ $ac - AC status slider_bat lineEdit_batdev lineEdit_acdev + checkBox_player + comboBox_player + lineEdit_player + slider_player spinBox_interval fontComboBox spinBox_fontSize diff --git a/sources/metadata.desktop b/sources/metadata.desktop index 6b64ef9..6af43e4 100644 --- a/sources/metadata.desktop +++ b/sources/metadata.desktop @@ -12,7 +12,7 @@ X-Plasma-RequiredExtensions=LaunchApp,LocalIO,FileDialog X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis X-KDE-PluginInfo-Email=esalexeev@gmail.com X-KDE-PluginInfo-Name=py-text-monitor -X-KDE-PluginInfo-Version=1.4.0 +X-KDE-PluginInfo-Version=1.5.0 X-KDE-PluginInfo-Website=http://kde-look.org/ X-KDE-PluginInfo-Category=System Information X-KDE-PluginInfo-Depends=