From 0f392017747c3ef3b93c18d6ea8fe6815f2f50aa Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Sat, 6 Jan 2018 22:27:49 -0800 Subject: [PATCH] Initial newsletter support --- data/interfaces/default/css/tautulli.css | 35 +- .../images/logo-tautulli-newsletter.png | Bin 0 -> 30989 bytes data/interfaces/default/js/jquery-cron-min.js | 1 + .../interfaces/default/newsletter_config.html | 306 ++++++ .../interfaces/default/newsletters_table.html | 42 + data/interfaces/default/notifier_config.html | 10 +- data/interfaces/default/settings.html | 97 +- .../newsletters/recently_added.html | 978 ++++++++++++++++++ plexpy/__init__.py | 8 + plexpy/helpers.py | 10 +- plexpy/newsletters.py | 537 ++++++++++ plexpy/notification_handler.py | 6 +- plexpy/notifiers.py | 38 +- plexpy/pmsconnect.py | 273 +++-- plexpy/webserve.py | 236 +++++ 15 files changed, 2454 insertions(+), 123 deletions(-) create mode 100644 data/interfaces/default/images/logo-tautulli-newsletter.png create mode 100644 data/interfaces/default/js/jquery-cron-min.js create mode 100644 data/interfaces/default/newsletter_config.html create mode 100644 data/interfaces/default/newsletters_table.html create mode 100644 data/interfaces/newsletters/recently_added.html create mode 100644 plexpy/newsletters.py diff --git a/data/interfaces/default/css/tautulli.css b/data/interfaces/default/css/tautulli.css index 78fa8014..fbfc9bff 100644 --- a/data/interfaces/default/css/tautulli.css +++ b/data/interfaces/default/css/tautulli.css @@ -2973,6 +2973,9 @@ a .home-platforms-list-cover-face:hover .stacked-configs > li.new-notification-agent, .stacked-configs > li.notification-agent, .stacked-configs > li.add-notification-agent, +.stacked-configs > li.new-newsletter-agent, +.stacked-configs > li.newsletter-agent, +.stacked-configs > li.add-newsletter-agent, .stacked-configs > li.mobile-device, .stacked-configs > li.add-mobile-device { cursor: pointer; @@ -3657,38 +3660,58 @@ a:hover .overlay-refresh-image:hover { } #plexpy-notifiers-table .friendly_name, #notifier-config-modal span.notifier_id, +#plexpy-newsletters-table .friendly_name, +#newsletter-config-modal span.newsletter_id, #plexpy-mobile-devices-table .friendly_name, #mobile-device-config-modal span.notifier_id { color: #777; } -#notifier-config-modal .nav-tabs { +#notifier-config-modal .nav-tabs, +#newsletter-config-modal .nav-tabs { margin-bottom: 10px; padding-left: 15px; border-bottom: 1px solid #444; } -#notifier-config-modal .nav-tabs > li { +#notifier-config-modal .nav-tabs > li, +#newsletter-config-modal .nav-tabs > li { margin: 0 0 -1px 0; } -#notifier-config-modal .nav-tabs > li > a { +#notifier-config-modal .nav-tabs > li > a, +#newsletter-config-modal .nav-tabs > li > a { padding: 5px 10px; color: #737373; } -#notifier-config-modal .nav-tabs > li > a:hover { +#notifier-config-modal .nav-tabs > li > a:hover, +#newsletter-config-modal .nav-tabs > li > a:hover { border-color: #444; background: #222; } #notifier-config-modal .nav-tabs > li.active > a, #notifier-config-modal .nav-tabs > li.active > a:hover, -#notifier-config-modal .nav-tabs > li.active > a:focus { +#notifier-config-modal .nav-tabs > li.active > a:focus, +#newsletter-config-modal .nav-tabs > li.active > a, +#newsletter-config-modal .nav-tabs > li.active > a:hover, +#newsletter-config-modal .nav-tabs > li.active > a:focus { color: #fff; background: #222; } #notifier-config-modal .nav-tabs > li.active > a, #notifier-config-modal .nav-tabs > li.active > a:hover, -#notifier-config-modal .nav-tabs > li.active > a:focus { +#notifier-config-modal .nav-tabs > li.active > a:focus, +#newsletter-config-modal .nav-tabs > li.active > a, +#newsletter-config-modal .nav-tabs > li.active > a:hover, +#newsletter-config-modal .nav-tabs > li.active > a:focus { border: 1px solid #444; border-bottom-color: transparent; } +#newsletter-config-modal #cron-widget select.cron-select { + width: initial; + display: inline; +} +#newsletter-config-modal #cron-widget select.cron-select[name=cron-period] option[value=minute], +#newsletter-config-modal #cron-widget select.cron-select[name=cron-period] option[value=hour] { + display: none; +} .git-group input.form-control { width: 50%; } diff --git a/data/interfaces/default/images/logo-tautulli-newsletter.png b/data/interfaces/default/images/logo-tautulli-newsletter.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ec4923b6709e9231d491b570649bc4361a9d19 GIT binary patch literal 30989 zcmeAS@N?(olHy`uVBq!ia0y~yU`u0QVASDYV_;yod5>p40|SF(iEBhjaDG}zd16s2 zgJVj5QmTSyZen_BP-(W?7foiE9sgtZX#-|H1LN5Lb!~ZXR<3-$a`Ecjt9RSKzrH%|ZtUIQ*soVE z2VedA_IYIs!_WZ@=4`GEQ{JRsTVlZoakavBjx+|l`I;=I5I)0%R2E}~`JUD-CNKe3 z7GsBpwPMD9@63v>fj|GQ zdC4Sx`049CMzMFwKi|l-gGwG~N?<#2KHW!j%MQ-8J#8kt8dN9$K6JDOD(xWEB&qOy zzW(w9uBEGYzi$h^k+iGAPeX3?GpO$wE(x4r*!er>CvVCfHdCv-CW+#BPu{%i32J{g z-Y!gC^RQcyZF`^Kv{cEi=-0ah&Oz0JeI&7~;fOD{69X(w+w)D#BK9z$l9|B{iLmlyW4$i^Hvy^ zdbAo|HE@}GeX6PN#hv;4cRt+z|9VZ;BlGWnV_rDV*ij&V&7#-RIRX~TO$lrqzl@)l zP1(quqEyzO?yt9g{_mTgUbkP9y8fFpIV8p7^Zx3y?bB^bKRlee-{ywmmxVpS9?C}^ zgqgy9mEdT=%<}zbV5`x~?^79j?*6^6w|=I4i9+&Hj*Lsq5?5=tuT5`xWC(Tr6qzPT zg&F7jr*BMo(=>x|yZ!F1zvlFtxlMOfPD)v4woG4d+y8BQ^Up08-}isd4~2$}_k`fV z%*K({kYH!MOYh8`7Nhp}r^AfguStIXyfv}<+e~f0zmM+CKKdZx*h^N2QIDdah;8Dx!@7>GeYnQ)o zNSeKOnjqA@pyX8dqDgYOVd|R3GYJOfzfKO4g>X(M^4GXyyrP?X2q|M~?j1kXPV8|Hicn-|Ned9N3t4>G+(D_o9x^ z+;}hQJv0&>PId&aG~}1XmM+~sX``K-$=;6+XAc>)8%@eNIXU9Ib?YwC33pR;#Y1nx zoaU)GgRv>``XsljOC$e(xg5Rv{L1xa>-1ZCz1KW1m3}W(v{2%X=xnWyk5+PU2eLFt z9>O+CRHTPkTx4{||)|Q;YVtI%_NVS_)o(dPt*^#kj$K*SlRZ z&E1ysb@$sz2`Y1EHS-3RU+(#|o}>Kkbjwx~CxI(4<&G@I4$tneiTu4>dp)GjYSXnD z@g34yyG^{;{P%cRn$X4l78^3luIo%&Ium|x<%)bO&=wVn+*#*REt13^XEy_>B3yTp{* z=kNaZ=SGNSnD;{Q1LAr*|Mvv62lyqQUU5nYs<=xIl!Idfj1#27@?!#cq-#><8U}Bk zTlO^RJIsY%dOHe;6I|TpdQ3ccp-g19iDiyCBP>oL1kNzr zldzljKHoJcR&iF>N`)+~-j6SDKi@b9YQ_Q;!7~j1B&Xf}^0Rr@*DeXS+Q7e`J36Y) zmT|k@gsO4yRGz_T^w_FGLtog{^q7y1)-0BT+)&91Cj;guZHW?#`jQk*z=HM`M_R)J zi5zpN8i)1-Hiu3Wc5sx0s&5cG$TLB5yJK_Z0{0xfWxVgZyWhU4gR1_} zmcaI5{gUYVFW^+VK*iq)o?)12Ec*G(m*?NgX1iWZN~`bR>AP|7GKC3HV;Q1Z zj2q0C^}Mn|`Uw>O`^qs5U3HQ|78ljMP!FO%l2tjzuY=l>t)``41Rrij;F z-+t45C)5lFPh$C_ir;+cPBc3e`h{FENA^HpE9KYYyQuh;v-hwOSh=P!Tt?rbKk))LWel2j;OxBKa@sMr7AzLz)P zwwhykLD}s7j-vnbTWe1%T=unuddy*^(hNqU#o4k+x98rxW`A5>^9gTVa`kk zmKK5!rN6%U0~E{k?FOdwYmPFxOgvlQXN zj7OQ1GmG#0dP_M;gLE=5FsQbQ88?)tEvw)C>wdM^5#NiE8PfkAMep6t@%zHjZKVNX zr(xwI7pOL_ex}bCP(NSP zdB^KhI;HknIlD}MA3nTw_3BeccWlV7ftGVBh8unxg_@`NC7y>1 zWNrP*=kkZG?)C7b-rDvpZqKLb?B6^14~Z==NIRgUvmI&)sL){ZdOwM)AUgfcyXe#=R0cCppCM;BW9GH|7;ZdvOl7I*$=`YXRzm50+~ zjpL)^ioIQZ<_In0z1Cv1%Hi0%&j)T8K`luLJfoY&Gx4vO!OjZ)mi2L*5B1g*uCccN zll67S;#WO46K@@uXSeZf=l>ToOP)S@cc1HbfSc$g4##Xsr~wzWwuu?Lb=;fZeR*m4 z@;6cER;U%ewA{F>*ss%0W?Apu&F5nZUx|Oer^8kr`Rq#4F{u+5qF{+4N5r{XQeQW$ zr$J5sb?c+0tHjrR`+K)OexpWG$1a1M6OD2kD<8k!J9+X#pF3%r+KkE=dj+=4fQBi< zTBkh2WR@RRce8!O*PF-c%jtlgK5Nlx()K{9RMFVvtJn3ncOO=U`*f`RBE4qMR^z(kPiBAr`{Q5z z8k?s*7cUmNUz2=%>U59b)6_>HSMPuM(v`cn_Sv^u_9NS_|G%nyjndHPP=a=YX1W8KqPc~W8dcb=p# z{Z=-6zs1l0@Ak&Mh+aLT|LoeVT~(Ri!;XG_`T0(Z@va0n(Nl=<5$R!ybJuU|d6--| zX|}`Bx2&0mW*++Eb7NbTXSIyrtAsQMjm`g_z4|C`ulZ}q{Hd?r3R^#0d&j=??6Y~c zPO_^w7QPQVbN2pBy?McV`!B;L=g#Cio%Ckr zp#@UOYJc|??Rpiw@t3ii`}AM6pYQLvTYh=gSzFmdmKK6an%P+AxEO8>ufyiIoG_pn6yV@vGCob1o_d@$&L_XC=F6}k_JoO$6SxqWRi z&sm$hMQ^S-n(ph-ny`^gH_us0kt69)$oo5e+K(;vZrhVq=jzk*eRI(7>Lc9g_qOD> zN=O`dvCF9V@+;TU`=>uU37mo&+K`_J>S!6|9hSISeC_*{t#dvaRqTpYc)U!t_wH+s z?4tPhJk!5kTFGtvxY|6d*K*al9VgFwozy#%_y6F($U}Bh3XRY8++92Wx8He7co#2X zN^8m9KP^UnlkeVNe*e`9C&}Gm#;drWy*zEC^PMyOP~`uX4`Tnm`s+?k;(cy5RrmAn zXZi1Y&i~vV|Fxv!pkvRgeFE=x8y0`Qae9a06@REpKPd1V?71Dry^8yZ;6uYXkvof? zuILn2@3VikV)3!#NgF3Vefl(6Y2t|mg$|ECRy;r0%)VW1+1vMfzu$Z2JKN0GzWUpn zw@$V%s$Mni6ppn>4!4W>b1ru8XQ@A~YrgLp_Zt_g&|H+O95n?92?q$G>*%+Qq%-;tP-c+IOyB z-@bSA=Fcxpv#;6Iyxn^JU*rn*lyc*Ej_1?(%K9h%u1e=kP@4Ah@8`PG>l0S0^Y^d$ zv^mIjZ_@21`8WG_eBJ4|HuX-6QQhka*A3c!aX@`9$&qa^xo~ysl`ogP_2(Af%3OYS z{hBp0@?TE9zrVl!bN2eZ+cNI#C_K;owYAv1c{{hGh48eh<*TZ9B`o{D@6Dk%=d`us z&3FQzr!SpXy|(;QsQ0ezU5$=DF+W}(^9fBi%4Bqwg|?p>cw9gIxaZhnv`zfP)3>Ll zYWKf?_b#sb+068HC*3rZPd=SjdMz^h$#0uaCzOw?r@3CfcKFsJr|WNLt+NT~pE$Ql zy`^6)vS`=W&r?_bX)}6XI;%U^Nm769`Z-Z4E00+R*`|NDg8Ip!t!KiX^;%Or_vi0b zkPEycwY%)?uTvWm4?lZe)cmBvr2gmWc(Gmy!$*n>-_@OZZK1ej)=B@pmsyRrIX=+# z&RS>xj3asB{HazKl+F70t$Up`+X~cU&&}4}|F!)WtaM=PZYh|1XG_cm-qgGu58K#o zR;gZJ=u_|Lrc`>koj+dVe*C(2i5o?3l1iMluO*|-rYw)Eth~4J>9y~9Yov-xnjfw{ zH*?vGn9okaXZ<)^ zYcKvychw`M9UD_iRs=%>X@YWMw&7ywn%L5fd+euJzTfltTASjOiAftHE`)J@ES4@mt+b&f9$Usn<~6EyNvqQ0?0DKcCOXD_{5L$;*7G zy1=pQ)tpxw1@xR}&A$^=>-SgSv6a2{RdMm#|9_rj-p=*Du}9#ZGorV}(P^-C#>YEJ zj(ty!GA}K;wxQLio!fk4oUpoI%siQ5x7(kbRxmRua%61^y?^K0UdP6$(@P@$N-kc! z`p>?f`L};RTT``dx$_S0l#;b+Eoc9JsceB|K>;NRXS zd^qmJ`~Cm_U3PBc$rP0DkxZI5)U$J7@)>Vgg960Z__j;zD z-QTvo-?{$Ya9&lV*iy?a<@gsGA`Kr-r*=yoerUP-n)0bI9_z9sQlU z>+(4LJ6pMerb@3(Gg_U$D!|R+s%c`T>E@sJ6pjD38QIn*MH@}IxOIx>eD#)H(#Efg z%g)1^drm6%V`oav`gyA1*+qAG+0r)~kDt?D(q#8+M)EWDYt>5%_)^z=pLn~w=&Z_6TRU$22F`N_+@A&M=fI{dfu z&U|}&`}>TX)}V~myH~Gn-L-DrJGO^+=FYs!TBW!{;QjWv^h>Qb8!F#wXV33;b)7ta z>aWY|e%$#OfA_od?Amu}|D#_s+?@_>p*S#}3hkCWeDw3WD8oHpE_pu}NzzchdhOb| znrAc9k8#vyOYZ)(h_(0su4iUb3g^`A-jlZPe!#Nd4L?hwG?J}+4n5l_@asWq04yJJ zIoRzsDt>iL=kLFVnP+AgUKcHDoL~Fx=B|xtElIZ@uJ@DFdo}0r45Lr~%JbJq6{pO7 zxcaxv&DNW-_ErY&JKpa)lRZ7P1(xLk6g~-_*}<7|NuFOKdfBdBRauJSJ911P8(iyI z*E6AVZgG~R@Wyl5GeuUwGk4%9TV%q zRwd8h`RFqD{rft1wokcOn&_qhi)L0mp-o>evhnir@&X)`v$L# z96a9StevXp+-agHLYK}R(Ac(v_n$mUyq+o z4z-Mq&XK&odt=raLw5=8ziXyscAc{hdp}?GO6>HPha?nV9O7YMP*`8K?b<1)1Hj)}wLFa=}iQSKS-_^zzJa-*@KCA-!DhnbSNswiVAlRZ~9m`|tmK z=Oe%7^uNiz^Tm?WQ9O--fuV9DPe>T+h83ZZ!O)N*+haZN9_=Vy)Bi;?Yu2;>+Pe;! z_aqCM*B-iUVeE9_X{cK4jFrcxyxhP4?Y~*pQf(5~p^cSg`tSC--so3dyld;ba3@Jn zSa_5`vstSe}3KJd)2MA9FNr|Xx_5oV_*p2DBE_ePxNM{ z?qsFtvnD~8K)wh%ByuK0-|zdEFFD%Fn(Qk+JTTjSoA3VJot9A?H3{XFPLUnTY6Yv~~NQcwQQ)haPKd$at`QZ1jUvsv(U)?I& z^!kuaQC{%O_j+gU-IJVe{Qu(L+pXWH8I>fmF)#?o^;%Z&H-R&A`%~i?7q==&e2Ga< zfBq~<>qqVHZ@G(q?Gy?TPZNCo_xiN!XZpcK@+-RpyT2=Ef6oNNCpOm z2BFEX6OMiPSo8nro7mlDqM;Ke-k7&G#NNH_`0L4ny2&}*1{{psb0nLj^0t*)x7>RNQwr@Z_- zH^1GF1of-_+L!gtD6M*)w{J~Sq=}N-ugI0(tDw4f$E0|LYy~$Md-)z?^v)m`}(@8M+071m%XV_I_xUp8mE7^&FIjl8-`16*1VrE zGgR~#YhBo?<^DO=;QG5>H@RiQ`)i=?+s~_ED(^v+*8+zp)-wXPs%^;jOsM;P`~JVg zh2j-9a_{#%pI1Gv@MBQ6M4%QA|9R;{wcJvV??p~kc9#|1c{tqF)b)A&o{QPC;c9us z_Ihs)OD?}=$YKV{s|I_Pu8vLF?s|IHk?N8FNSgX2cxJ||pM7^{mX?-^maLw6?%cWb zuyrvr@Ab}{{ots;Qt=BBr;mGcOWuBWMo&^cI!$8Hx$|Cs_VX2AoZ7v6JJ<7dr&|(Y zK-tx4^BRZgpn=&13{N*7?RjZ%|J$MO{q=tyySBzW=(qc|LZ&3{YUuP=8z(1m<{HU{ zyIKA%t33M$Qqb<=pW$C$bMIceXz8WQ8p-9q_&^1K^u0@0wKiS88xfs!Gk1ysDD{-= z|UD;jdcGs0CTy32hdp&iRfg8sz17-#W4Ux}6!4qQpPNtq+6afnMh^MQM z_Pl&#nQBq|`KhAH$)BC}F^s&?0=Dghoo3Dvx*BajYb$wQ< zY3MPZ`1{Mg&(xl^Z^!p(TmA}czq5V!R_W|z5#K}^7#uF%z8Ph0Td2H0-Q-7%i`JBz zPMM(A)`rQa#fgWp9vAs@Q(}jez4p$JU+Djr(kKFpqE$%*CYIG*jY|qlwy+NQN;=z#|NJ&5jW5D}77w>=zgP9T_+)$8 z!RD-eT1UM0pEce6_4B84r;W00r!yTYzTcHzee4Hss!wo<-k*p6B0-hFvhH82t3gEz z$PNv|pB!l+;;Yx{^37Ss=;*68=jE$cQL!AX|0nj>JlPlj|JU_&b@^SqiY*)Xjqlj; zd8s+}#40>iow9M;G|7Vh|4pXqe%>7j>gr|Iu1oK~u)V90D-+zZ0GZCPAf@F=ZK?RH zscV&69wq&~wl-Sd=INB+X|75WcNvJ+*~q>BbMt&%*~xVK-#6DDioG7W>!Z)6yS38< zA7q!_y?OI(d8mPL!v6f-`=9l-DIP1WGt0~0zVp|U|GUfk7M+>x-~Ds8;Wxj{hXe9u@9+K1e|)TW^_o?ye%;<6wl7gaRQ}(G_T~S-uCM=l zPka5IB83B=cs4!lnLW+W@9xah)mzUzybbCIp5t_PfA?{7V{PHazvtBX&fNOsSF?XZ z{?w(f_xW%T^qiYIVe< zRhuU)2#eWP1}dAr|9=|)FZJBY<@2J#V`FPqt!MIBbNT1<`Su^{|2?n2_WybPzvqn0 z-+qdiH&gF)!N)xdXXa;oTYBB|s*~0wP(60E<C z{=UC6cfa5FdwRe9zl!uM+3#;}e{Vigbo^)RJJ48DXh?{U*txsuk;m->57l}snDu;V zoCM>!(@VH_AKnff&3u?We;>T(SspvR^6jA>cn8U#LGVy%LGi|Wzak`0toZkA>GU|M z`!{Y_?Ax@dD5bLUr-!9};r};Rq~G7)|DUz8`oV$5w|DQ}wXXaB`~Ln9C;jU_u`cB3 zU$^Jesa@`Jl_{mJu18naaWC4u`E%#5UsbOy)cp?j1baMConu(@PTjn}HK2U^vt`o8 zw*#KpzhAxc-HnCEoa~?8y{x{?H14wL$%Sj~PTL;4QwSbXYz9ud3H>xNbZ7nf7dK;a?v*KpiZ48-T%5+R?ds*CPa*zN!sfkQ%Wn(6z8}X>8oQO(QvZJnhw|&g zEQK09C!Z86od5qc{p;2zfA{>W-^4lN)33kUDf6c~J&361`t!d`;ktlE^Mil-B9A}X z9saytLF7o`&EmVFu z0as8*A(I+?NCgMs3i8;}-tMyN)c|r}akP=Onj=ddr@9I-YmV=q@P^ z;D365R>c2E%ZmSPPrf%~M*guY*x}ddtax_WlmDyxWTtKYbYnvQ`}oQg>7QoQMKk6% zJ^ueM=wIHXRfnfI#+{dRuHSS1!yj$wCx!~5I=No9dRyKnPBi$tzI;adUX69L-so+q zp8IQ3@UP^nui4JdH%vZuZTtPY>NvI5!b6Dx%*8Fcr@1dH;EUx*ZFnPBaa^r_Au9vJrtGRm zGpy$(HMp?e6rv_v}%9`x<}UlizRa z*2_$r5p`(ad{yiT(+`ew7mX9pI6tUPDQ-m&71YB z<@beSA4}Ee*L-^Q_V)JQ|6Cj2aJ>Z$z->-E+}6)k`r~0*j;!LB#-4{Cq?Q+`DSdh9 zBXIfQ_uVy4YaS-6yG{S4dtLYax3jsR%B6tsheSAA!S|(WTvPUQ?-cWrVrZBXan#kX zVoTiTnBtD}iPEjb;wFjv7cADkzfEUqwDYE~M|Phq{!;UA|AgP_wo4Qv*cdvVe2m@J z5j&eFE39?v>U|y@*EKt)8JFFywPZD!xn;w~*n2Ai7l)OUmDxS4e(s`FI$6y(>f2KN zTF-fJELs)(7<*$GlEe9HdcP|faVIb8`rW*Yb$Yl?r`r(@`=>WIo{#x>)B0Y0+z@%1wU7Ce6#z3C!<{ij9K z-dO4O#73PAaEoiGp6;*8aA1+EOqTEGyidoEE({dA#I#v@id}8oE2SM1&F+`%^toHa zHYYjinWWkK%)Rru)Kw(UNqqhKwfNhco64_Vz0&&}EU+^3r){5nlnfBDCxlE+^ydifux{mi?!zP_r;@#_>t(PJX^Pj6h--ey``_9gNxCFa~lSM~xMX$IGO@Vh`c2;q zmF<~f9orp4_vJ=fypLD-!)jC%drSE8{7L<{Cr?g!+m+jN*2exlJ43@rJ7gXu z#Yr4ntjS%Nxbl#sA{)E5QtrN$k$qZI3WQJHV3jO;yyZx%>XM(!>whheo~9RjOT}5t zo>lSxyLr{`BEQXjU$b0w=b0VP!nU7#`T6a!>4IIkTk_UF{4nQ3!Ro5{jHhEil#43Q z>g&Jv{Jlz0$-m#*?p@hoRJThvIY!dqZ>ni{%4$haKeouZE;IM^(+9Uy7lqaoG+M2> zRr}|x+R@5H=Z^ZA%Woc;E{y%35}wmL>#yLI-zOHhe7k-B(I@|uNLw{NUahyw?p)Kn z7v5%EWM#W^{hc<`(?857fBrAtFM6WND)aP5tCLo_*F_WD<@SFMVv~8lIdZ#^t(otK zLYeDVZErTEWj=~9)t_&@Q0K|iBYF`VX20Kd)kp2Lcv1nkY^-^FP<_Iu1I+v<41M+D zc9p!8+W*j}wDc=$^|v>XYS9mttPR)d*=V;dFSsgOa`!ZoYYHygbNv?f%nmd5Tbs^y zcYjgR&sss}D?c@N|G%E7w=2u@d)UDpMh+K>ZrZl~*<|0Z#Ll3g9uzz4>;es@uMrY; zb7!*V@;xtDxa+{QHo+q+5$Ml=K&EQ(KnmSh{c;PwBRZ zYp(CQIZsCK{=2HD4iZJW*`UiGpXB=l}aM zM>BZYnu*EBe`vPs+O=!u?d|#Z&5E9!Xg_*@;h5fpjpsJscFX>r_Of2PWp{y_V%`ev zw}LuFp^EmJ;Ssw4XE zMCPfw-wTZI-|CHA)xGiGbGb+5dUSKUaNj$tC{Q;^}F- zO8w%$cPy=W6Lr|7rQ6}z$Jwin%`vq4_4Acia*d9bOf-Awv7XIO-?mFFdbIes`_VNg zpIU!=XC7bk_U=A){rD??FYW*1{B-4UUejkkG*|D?w95Z~u(2}p_S>bcJpv_(Y%hGy zAFlS}{&8B3f#JepZ{r=R`aN52oXMXi?&%cP{>F*-=A}ikJbX&WPRXmVUKLVtINSBJ zu_Sq#Ot4$|KK<{{duskF*+@#P_g?dS&y%XSxihYxIxfKA6>QCdu*RrIHU^ z#5qjbpEVs?7=NiRbj|-|8`jqsNryZ(^2lY>iO+kVJ8Sw0f!93-C6|@;7o2oh#<9zm ziGiiQXTn|Gb6$6B4<7v(C>K5bNtLWJYt*(~4QhWYgN^UM{hY@%dq?V}HjCtAJvTp` zvwoi8Up^EUUr|yWlN#(sU1J1V=XS%S3l}hUw3bB^>?oO)_OuKt^fb| zd>u4zy11oQBl-F**Q=&8^(J)Q(yjhzI`#Pe&5O$3y0^K9ftIt*&^mfBZsXf`^0GVp zEBGIjtiNu{=H+Xre=f%NBQt}*4z_mv)vG7z@-kd?<(GVu%lUBU;;C9Hw%O(V(8}GfR;`ZO|7EHENqx_}U8dry=|-YUi{8=G|sp)^XKR1=U=^idGlF0YpTWO z^z-vl57|xW3t1I=rPeRKn;*PqnWf6nHLtsL zFY6sEd4A*ciiZphN=E*lW0KcJotic^pz*cdDrvdtiA!wFbUv?rugpB7Ip*5uUq7=j z>$chNbEUrW&h~8r^4hzTxeqS*zUuSruaPlj?wekVGca^Lt=X34S)98R12w7=FkNzCG;bdV|NG#WO)&RTSn-OLV42oZ8Jlo}1tQV$m$nL`Y`5dL*T(PIQU*A90 z+O2mMT*aNY`F!T+%rzf6)#vT_@^<_Ed75vIPw(6@gRRH(^B-I1G_#f+zc(GeUF-A2 z=IpqPp zSD&11)kDz4siBkozB3C9Q`UTbw{KO^l@5=T7)~ zZ{6uT&uqlkCx_=qUYHx6zc7uNq3gq(rH3C%+?w&WRAI))W9z>5%r^A)(Z37|k*eqC z=5DWwv;2JF_Q`b@^maUGQlDS-N>lP&MD*z!tVV*TKmT1nvobFy^N2uc>!xBqd&ONZ zE)^%0^8N0c!203y`ST{J(?w?fGcxaa-KsN%SZ0x zhxdE47PXq+x*Xen=O1M<(TH2!Yo^1alVCT&G&umjjpb$+Ge?~ zBlEsP+W$WMD{H7x-NzcGf}m ztNaC@1anNZpIOiC-c}hCXSXde*x~f`(x->gr5OUIOuGB#IqyNAXFg|bc1OpqmQ1zy z{ATm{bDhT@&s`UGV%b+8XXnGu@6~?4JNw9iY0AyJjDFwq4Naf!%DsK7{<{oOsQ zI9WdMzq{Z%P2o^~sTunLK0%-Iw6kwC85oSL=k5CO$ZLAqhef`hW6qtsYqECdtx3-p zSuK=ESF2oi`@!NldoN67jb&$Mn83#N#R+UQ3@>`7CMsL!Voo zcOJgHk=#G`cl`ga@zXmS*QT)D>9bX=@-%!iK{=}@#9(o@sdKl~fk=UcXT;>0S64Zf zr!g=*VT+x0aO#nr@w1n$dr~w<@@jSNsRZd+#W8bMeJ>W)+i4en-KN~iREnYDf#4aI zwn|^+CNHTHebBRkmlE!I=t>5o4b`M_2 zb|-576i@(Y??9eZPV zcKU&D418t0f1Jb_8tyFcHm=wZSNv|;*LNEyCEql;Wpnl6LjRw8%F?IV$cIn8x~t*- zI^WMS&u=j_1Z`Hoo$p{UxwTkb{Jdpptk`widT;}9Yxea;PdaD4Q^`9}QnB1!snj_A zT+N@?@&A8ud~{qr^F(F(l)0fk){jm^J4MKk%{$(mS+;RE1H%c) zT_(-axwD?nD*o{Aa_ySwx38N$U%@lm*y8v%uj@?D%~lyREZ}%qr*UcCTXXdpC;5Uu z-^jK|uCD%a(Ov)5n>R6UE02QOtLe|q&Ha7g%F5u^lfEhh#pm{DESoE!ZS2O?B(5Or z*mHN2-h%5EnG3sF85oM1_0B$6IB$#gymLn_j8}b+cwZ>}hH1jalVX-XZ?%<1R_O2a z34L&D#*KTbSF#u!CSL4ad<|l`ocTkaSNpC{SXRGk{rdU4>;L~d+b+K3<*_rr_RP`J z((;Skm~^y!^49|vtIk<$o>AuD>eI7aiplPOqwKFmk}l%HeepGu_kZJl)Np)#F(bnX z!CfZJ-mgDZ+!J%@mc09V_U9eEvp0R1Ic=fO>SwCO!uJKER$O9eP`b3nQg2)8@3Wj~ zn@&TDq4HVvk9*C}*@5Q!vn7(>9`g~s6%rQq@9ed;(eM54^s3F%x^_*~ZCV_+$mRw6 zbavZLVEwq-ewQ&bgTnR~mw5c9Fg6`-*gdmWFkHXddy{C7c%@{zo3UHp^x~ZLdDm-} zEe&lkW@t!yP%tNUdUvV9jFX4!!fn1?&3bl_UH;7s>+*N1wY9akCr|YXf5>-#S-a`s zHs0CWQcq8_zG=#EiRDsnIsNJN+cOWpV`flz{^Amk)hdIO95cN)ua9~8{F6ArA6lL! zyeT5@tlVj1595~45)(cZ|J7TY&cMLxA-6l^xx!kxs``^02YudE@TOmqUv8g&d+E$M zdi#Dn%FW;Z_gimX)QJ^`W-7T_Fjoj4IXbyaK30e2qiS)^r_&Y;3@5IhG>e_(m>)as zy!F~ywQJfZZSsjQzxyJ+V4<&G^01Hy(xs0xJC*w`ax` zRj<3&nxJ<4cbxJ0bz6P@TTVP%liGFZ%9SsR@Be*QZocx6#N9ti`sK>awJcL^F|IN^ z9e<$t&+Iw1j%*AJStXflzISgZT@nAW`Qjs&tE@Mc@oZaYTe$h?vz5nm{%WkSJpKH1 z-uK&*U2o+=_#Oo?Xfw}ZW!cEkVBjS;zvTInwKt`XpXEE~BloJI`*}(7xf^Gt4d#~J z%Cx_=xB7ek-X6ot_4_~VSfur0-;Nu3n%+_87|u1lI+nAyU%!5r-HFc|c^McENbfRf z?s_G&-je(M)i;H*Mt9qCuDm{QSk-=#_;NL_@3n8uyPWqsO=CQ}>Pi1T28I*6Q#3XQ zt~eet?fHh!MLYdc-%R^+h1JkNWrLkxzN)g$=h#-`<8sw+{>WOFN$~RWPCs!$Rj%K< z-FWJ8(a@rcx7EvTOxayv$gh#A%c!$h`J?K&_u}`zGS)awzdN(n_unag28Jgcdpc%Y zu$_JpM26POfh*IIg8-uun;YdU)I^B&)1mFRVxw_SCb>Urh2QQ2GA zKgb!0Y?StQ-S#U|s-SY^x%S(iKJ1)US{Ak_=c!$c>Xq70%e{G5-I?^mI`Z9Vq0763 z{=E^`{<$|hxuf4x_@?WF3i}g#g7$+G z?%%%I9LeJ6j=Z*y3u(QzPy1if2eW-V0k4)l{oTEH+5f!tFSJ-08vZQwHoh_U@mB45 ze4zUM=bK**)AFk?sy(n;d#i1mz#I3QMsa1Ii<&-sPhKKkMuwW6@NfZYhNw2FjP?C0RZ$-8@mhih<$DOYUdE3p6PvnwP#eZAVZ z*)siUje8o7xw9|`9QfJrM{q)p;^%eU#XU_H&n8 z#V_y9{28hL`1bvO-_9MEt6sBo`}Xap*DdY2@mD(V+ar;{Z_C+RU%b`olHK{f;b)KU z%&61X)}49#jk8ojweW$^L6c10MfZOkXS%g!_07#7moK?u@MMN`ZrAeQ*jWp==btagjODO@9z98XOA5Et&zawY&-FeE_?}_3AW}LYmVsePN6P6L z(^9<8+AhEd8;oJoo?VpDhx14xK2uQJ==}d&iB}23_F+if+g5 zx}4CjINA8gh_~xWV};yqF@}ac6UB4lLuD@i-ffb+rc>yb(>l4uu32I;w`a|qu=exi zEx8%~InKK+MAVi{7H^fBy!NQk#O?x3>EB^_-}ksk-kEo&&GOKF3GU02|4Tpllv4kH zZA}rwf(O16bd{Oop1nNu-y-}|O>&&w@mz1sX9>qN7JUD3OG`~@PPE$+`|I`9H&dtQ z#%#~KyLSGMBkE$atgm;RxP4!1mYC7Ys^3TYKIh;4-u=XR``!JLN;QhEcCQQ^eL21U z8R_fXov~DZx$5CmlY)cn3=KB(&dBZR(AB@97r4je-=>YaXT;|)n;C9go2we9`{bMX z?K9IKuhKbDaP#u!nz~v0_U!EX9zW~hrpQuXJx4AuNO>8 zut?sstLj-a`|WeT^B?!-i==8O@BMuJhtTP5%kOXRQ=k0r#sa>}qEVe(T2nIlAA~nK z*8iMy>>VqELcjXRUW4@8bwt(J>^&YSi3 zQQ^;|OD|Km?%$Vw!amM^X-#S6`EQTAzD`z)KJD}8*gkdL)Qk1&^w`*qwmtu%8r1&x zO0dZK1&6v1)b&avXitCnCXRvOlV4fpvRw++wwBjqy_{!1+xbjq&S%zpMN!4`W(C^% zZ8ON+Qn_mJh5E|5GTm-%ChjV7=LFiLu2x)>f24NmMd+~wj0`&_WF53L>}mAzQe-!- z(@WW1**o#!{T-ES@0v;I$+=(3Q$7^CT598`wpGUAbvs|3yy)(}FW}AmUDxlu-EI8$ z&b2iAi1*Udu1l!~weMvyWifHpd60L;jCD_yW6i|82iHp(7@qv>zP(UvE2!AentV-2 zW5q6o==Cd{cKOulm?*kGUw-TJ6&`1|tM|8wM#@G^pOF%w?JQ*}m$JLve!A{rGqv3o z%nS$m-u(N-QMrcmH@`HO>5Pv>jZxp{Oz*x_r(f}UmsWAq@-G5z8uP;UZvXM>sOaJQ zH4C0Ka@&P{%im~ZxaWp_>D>3T&)0oB_q|?|ZCjtA?qt)Bi(4lccJJZSe%*JtC?F<^ zDay}X>{!u4Yhwn6E|%C?ioLJqY`l5?(4>X)Ugh83w1xNPi*q{H9|rCFuYTe^zxU+W zxxQa^tbe8!eO}-N6T_M)uBSf&G7k3KKKO3!=Q}Klb-NmiswdugUFBl(`AwekweNNR z<|%I8|7Yf>`By@vCwo5>7Vqy~CmsIo|19UbFYWWU+sGC8t*=}s@p{ATsr=4DN0@ty^S(}Ebl{V&HLR^Hx|@AmA;3OjRO=)sTnu$wQ=t-1NQT9o%^ z_p>JopNy7dmi|ot^yh2rxnxF#FL~xnYJ6LFg~&b*emuD~E>cl;b?iCwm_M;*dOEY^ zu3x=yCyH58@yo+A4}bI5uUz$V&&Jg6Q>S+Zd%qO^_hZ?-)#iIH?YE8liXWmr-TJ&7h9x9zbdS}T(ietp!DWDo2~XSpQJcc53}z6 zyz!e(oA<&$@)LK=ocgW)kmid?scO5;X3uz|#?KHSb-cUp$p5;Vvd^N9dZ(N|m6~YZ zCgx-y?4pqTBO>nq&p@&5uA(QF-1oQb<0v&x`@4O*f5+9omzRo~^R6{rr@58?@$C1q zwdb$P|2{lh?|XQa<*ZrzIinSXQ)JC#w%yKdaJ2~D(ex+u)tx6IVV}6GwRg)fH0-IL z7&q(3BAx!zXU+VV?=qR~=qXw%J7Hnlo{qfl%!)VXPQRY8EYh&PcA9zW+(&<|`|mJ` z{Vb;%>Hg$@;}ibsVP^x?oEC#z;3^7 z*Z;Z~S|8ls3o6@x-s~Uos!{VzGtcV^Vf*uX8qMi_a$7FXt&Xc>IiMLvXh6-3r}Z+;?_8FBL!0%#~8I-rlD6^{P{W z^)Z3JpR8Q0q^;bxg1d_SNdHW=s$;g7>$S7|1#OqxORXw!YcskyaeCK6=k~f+Q^Vta zHvLeTP-uLvUr$1iul{{V{@p(10*jg{|H5A{WUC}$j;DU zP;=4x%j$2pP4y#>{wQ$u7qu{{cq147^;W6nisO!b#*1(Dnf;5GknQwr+qqdL&dMyX zT;^NOdsC6N0VbeJT&FGxHTp)_Dxx_;N6$`A>udq z^Pgv*&VKg)?~xn&+R2aJEa2Y1z2?ZhAIGCwD_`AJ3X0QLn&|OA<;q;8s`LL^4YL2K z?cch1ji1Xg`>XP&PJEpAWLK}8?Jw{9|NnhIFLZC$)l*AUd)7_ue3##{=$_TphaL>2 z5!>e|M4w+^5OdaynW4d^ZsN4~MYlyjY0LTJyZYFIOK%bbSA9$^x_aqInf0DOPT`-U zjzvpFq(`+DTNF#LeZsil$qD)2EBdB?njvs2@B3kiGdnm_gSOZ0s{Ujxd8pc9@oToT zFY|MjgO>u%mtXt$Y+&gzU$+BmQ+_>K^t#;oQNK+6&)LuamVfV@r>~ZM;2xU2L226cL6gS2jA%^M19jN-sO9DQ&85yq&i*uSxOx z>q|zO*FId^e@*B2jn0eeivp0)tDz@OL5x6_kv^u72<^TH`r5dwe{<+W4Fv-R&=i=Ppw!*!KMb5m? zdsij9{pkCnuQP6?e4jJ_z%g%!l-<6w-^&_(25kXdx6&w$E%pU__0jtLn!V-kG~;hn zzg?AHU8a_HR55<5eEE~sJoNeh_g8T1$Ika$7r(6i_drGa)T@@lOVeF%TH3#S zzw68{zn8jcPfE@h9zV0|^}5|{(XRqrRvZ>neB&&B_-Kv!-I+UiQ|26N=3KkaGdR_$Udxhy(Ipv5#X>{NV6 zOs(g+r4!cpE6aBW+!jix)!r6AVOyYW!yASeIgw`9k#n))`%={Ct^lLl6R`iL8 zW{KB-7CN`bRUH)#zrtO+BT3xqMcnhW$W>1*{`O8!Fq~|)X4QVb_sehFDRQK9d3`$M zmfR`sd?V^?%R{H19~t#l&-IUb&?NK2oX1f?+?yd{zsKoh_Sjidmzf>?lh$5*%k8Y; zTHWKf7jQM*>6v=?htWUX%Qn}2J~B9X&RYKSpHBUX-3mV1(PC|%3#Rvninrh83#y?cMydZd=_q-){Fm?f$c${qOGU z@om)+JQ;2L_s@kQZIjzcyL0V#F0K0WQr%^GTC&W{9hz4Ew`lMCb7%eAY~Skh6~A`X zypFzawR73BXDN~e7IQfGciBJqc0==!&9gs@>kW6`6Iryp_&|}8d!P4zr?MZ{s_vgw zxm)#m?R2|;KOSpO{;Irn{-xJVnJcrGaoD*S$h_JpaBtU3>p$k&;p=2f3m+Z%$ji%{ zylT~|SxFmjoX9Y-+QIkzYwr7(FK^zvdv|Z{_jh-r&2w*k`Sa%H=IzU;c5c<1omuJ> z&3ftDaUbpAP|F!I(oV@zt{48FK2j;Ex7hZ;*G#dW|F703H=NE|-qjkV{F*_bCuMqC z=X;*ZEq__BhD=X0)>yennYlx3_Rpd@Gu_Tc7@qC=nS1h@$j&8J{gdx5GqG6XzxjCT zqvrpT(LzseE550Ja%3kP!<1(m7b+L#OgQ*Aw`=+tPn-L*4sU$1<&!Mv9D@Dg>vNl> zB#+H0uey0=m*TN25g{f!BP}KSPOMZ)>&cf$>Igin^yt#Zjk)hjXRfaQ8uk8ieD2-< z&!2d|Ws(fuytg^;|Ib&a0;l)r@7}xX&<+J@*1hHXe|E38FH87$OT22=rBj-!^P;Ao zuX$!X-*>BBVUqL-j^7uS{jaN?{PnQWi+$G%j=ihQ{PE%8eD6DJwygAj`Bi1!w)K~o zXD@iYefGN_GU}4Yd}bP@zG}DovT)|ch%>RWeQv**XP-KC>Z7|%VT*)q)s`KfPHAs1 zEh)*Vc(rnQSbX){t@UEf&NDkw=V`48Y&B*veCQUg&|ar{aZb*&SJ&q=#mv9#9H4eK z1eBW}*qzF*_5Sy0ui=ADi~%+&)6>>-{pMc#H+Gh4-~E!0Au&(>#Vob7&kVI$o|U=D z&R@LomdNo}X$xNzY2Tc?_O4-}cZ8mV=qJlbI`PL|GB#YA{Nw(9g+iVkQH4EIpU?1i z@u+(v{B7Ntpzn8E47XiApSRZTJ3s$*n{Pk=3s?UHZOpkH;HDa;HmlF}P(+1m@f-8~ zzpu}F`g(t4?YaWF&xft9xmPuaRQ}vI>$ULd->GI!Gw<1LO#VE(*4Y2w@x9mA)-H4} zi=I}u(6;u~{PHt~$7{T<_s*Q{dGl&yQr)j7={K(l9JA8@$tW^)>eS_WQCl*W1n}qO zhv&bUS8jZ*>vcoGi{phG=f+jNTv}{xZ9V<`Jlo$-A0BSkFOfc_@w(vAd(f`e|Fg2! zRaU;gx3_=qk4N3lxxPPEez~iB^KQ|u<0qO^%+pGki#(Ryoyqz$wK8YkYuDlf>W;Y~ z>kqu;EQmZ?d2iZ+*U{`(nKf4FU;6aJYkJz!t>>TqFT8s6GpAjj`cEtVKvt*ATp7|_ z6W5(K{};~S@N(AD%Dk!z*B$?yN;g>idXrA+YqJTGCH0`CHK!fY-n@7*Yt^SWTbx#| zHPZY2qkXY`-RH(xspWrbpME@4_lNK45Bb&4LTb1Cop>u=&iu*_+oX0M_FCDb zoS49U&g%6V)8F6TR==6(E@v6H;`sbRt~n+1Gp{B;k-Ix%sceVwpWojYt}iwG*?lr; zh4|Z$wQD#&F`d1Uvj5M~fcv*rNI86*7&|M|?*2->vjI}aEpKXHD;_$WiSMJpPlT6(|LARhOZvJ1}N3F-_y_WpGac8yo z+JF6WKe?BD5i_ba`~G|We4ENoC$D`t3_45Y%tz~$Oj4oS(^lSI+-J4QbA_|b@&=c$ zR>#HkobG>8dz5x-WAbtPEnBwOOkeA8Y!zsuedOjeTlM?l!D6eXxvaWo%rWuFdhckB zPJX>ND$xR|MHBch%~4t@ULrnG)^U0^_g7wr6DQ*>S4AE1J^w_aFCb{ES!T$e84g?j zf4+7$)<_`h`v%^i%}J3Z*V!2yo|PnXpMLzgsb+nG#BQVF%e^z-vVO@vr=34xZAzcz zp@@u>g{)oM6olWKKU#63X}jE-$jXyHBANqY3hr-MQ1xo>X03ReMaOoSy(sONz3B7Z z{l}iqt%$v@djH3}y4N=puf03Xc2?dr>&pEVO#<296U){{G;w5Hau$ERR%=3FtFfu6 zsjt)h-iRZIQ@)$~-F=nG?2>qS(<|=yA5Mqw?X8YZou1m6dp1|rZ_oUi`|sYp+iHHN zz`40VKI&!E`3qTUHai*&BbM#I!~bc~hc7mzXD=x=y?xdgUy=4a$-kXro9U%FHdnXr zWYq8f#U}FpzwJ-^e!a6^>Gj(yZQ6OWy(gP(zda#GH#fYUGnIki#Mz%u=G4shpZ0Wd zj7b08KJDb{gTKKmB8#(be)2g!;be&K(!zg>BB!qYpXT!97ig)Bvg!Y4r?uR+`1I+n z(lS4m`nY!YuCwaz{#|U0{{J?-{rJQ}A#r)0OZVd2++_-nXuf20k8<5M&xLQs{C^Sm z{Ok9A-T3Tq((fBD!_3#OTJ=iAdv9m7Tr~Su|EcYz3e}0h%a&be=ZV|>tQ$0owK(nU ztgjiBm6dU?3sO^`{&4LUTf6tgqVBvIMyaP>XQob%YrA%SO=fT($Mgle`A=OJzh5PI z=V+{C+nLh|JzSA|j-`%j{%m=|zv4?+v?`g3q7QUGO>+8n;@35ygxbmT7qeQf$?uI^ zk)IpFybP6M^^r~ z*!t)Bahb%Je^1-L?f>|x*0fmYdwOcJ%uLW>U0=WLi?%Oz|8HTmvisq(Wi`R)m!H!A zdZXuPQt7pXV|pQ;tOjNMZx2an$3`r!%8yl8ylZ|=;Uccophh391)loW*_Khx63YYJ zIQkEs3HG-&1+9XrGP=GtB}AxnVdkeNC$r6SZWMgHvNAZ{|6JegDa%W%FQ3-6y`!|_ z!44cIgJ*zqRRt?)+Ev7j89(@78M$5OsJsA%04HsLc9byG<6~UcP9fXW_nEIhM;- zM9s?KJXq*h>XW-|ruo6gMhWjLx)>N1D4pkh!e3;1-#uFBy#2K9_eaZ$?oORK`)4DkIh-&EO}XEF6clR>GdyXO%Xe_VwbMB ze6ZTzri!ZRX&+rwP4<>Zr@g)BbN%kjcU$A`>Hl1~Y47~1Hv!X2V!JEf-qV@z^55_G z@}kQEo)yUYtvUbm`TYIQW~R@RRK5~>@FkOai~EFyKGk;4GnXjnANY~yImM=cy_PW{ z^iz{_nCiXcsTcU&ULQ}cx$>!Kqq=Z*ap3(U3*!}8|JuD?DdgZ;Gc!;8-!7BvqBoyDJ@Bc{;^4rmk?+Mvi=Js$8;Ry?8%yNprz+g5>M&PW|L?z)PM^I{?5vly4kuajY|A-5w?vg* zs@=ccGEisT-&CRSn7H!Uu1(EFW*1 z+H; z)wwI*xcSWBFPMLE<-&!D(d&*+*{HnR^!G#l`Wq^0YAZw%@2Aeb`>p@X{0$)-`RhZz zAHLeL$?4kZX<9Esyv)-Q1dnUYOkr{@Z_U`XF+h5MWqif$Car~?d1p2~I>~c%cF)$k za>s91>E1KCsMMZ!rr}R;`o{P1Ggq=0Z(4Ws$0@Tobw3OzqkGH#axOetdc3zyXKoKil5FxVU(&t*z}|Q&ZF2liiPu z?)fHL{`;Hl1?*0_KAgm!=Eg!yYsZ> zO4XOxB845xM9SaE7R}*%Si3!;vs7Js_LEJgT4uaHm9cjAs;P%+HdwFENen)H>R^g@ z&D>MWr+iebpL|pKeLeTmqqV9>E27sPjj=m^JF9#3!p&<{-KS2ye(ZF@X8%(TWxQ98 z*n2$q|NqIqu)N=CvA%Dv9XqR(DV>w{cx7nz@0nba|9W@#Cw&d5v9soRW?Z?yVC~V5 zx_4v`&sIFi%3xsCKjpZj8|Mt8w-%fAW*di0c+6CIDa!4CL}iKZ$2r}nruhC8FjP)= z{r!K-{MhpA+l-AY6RtgS?da^3Qar|gNU!95aEoKN9UXVh0R_;B9y|uNq`8@pm-{q{!*8KhO@Nn$+JH`If zeRHIbeUL4`W0?Ey&Q9qjk#6Jkb9c66Utjn9_3PKxt(8e`qK}15RFePH9(okk-9PPh z=)>5gWl{59EWh|Dx%-4ql3LkEb3(!@r14>ihoR zNGP<^)ep%z^Q>cWnKFot6y~&%d`2~vf)LY&dW;0 zW9qR&{jQgayT08!^0)B5v5n20sUBWCa#uc5OMINveDXwfu;T8|UH-|s?oS?j>+N*W ziQ5x#r}q0@rMSGe8za`NU%otDC-d^nn>XuTTv(W#eSMv6n%Mc<+w<#BtbcrJ#>CIN zv#zeHU$=gJeC~$WRlD9^_Y7)V;`_`$Ld)gEF2l=nb1EY(b%o`5HUEWgP1$g@=N?n; zC-3RHo0uA}8QrvSX-aaqq-xXgT_&FcU&k#8OH8_E zbR}#4l}DRh4Re1A$M2Jy{Nt`a%Z?<|fMRZOUPcC;bIY$s$^@VId%E=Itob>rX(H_F zt-UV%d1O6#y`FAZSgWN6TiX@p=y`ItHY|Tyvpsd&BQmT{`Q* zhS$e*=AN(qIn&3ZN6@(V*_n+?uFbJ5K4N-3MtR@I-u#Y=ng8laO18Xza&mJ1vE}@a z`%25pzx&U(`>XBPbN1w9b$!ro@x3J%7rCzI{`{mTFsSX_nWE&m$L~L%-NpCzNbJ0p z@aiv9H!a$&*n2)YRHQXhS$&`7M#t{$HJe*kcQ)>^pILTgsidlC#&2IO?#F{pOm_8<&?I{oP1ii_2}niYtx>^ z%5dfeJ4n!PFaCId$vte^(fn(-W%L84F)*zDyXB6*N#vf? z+1FaLjy+W}e5|54`A@~28%Bw_x}TTJmELCF%|89^uja=9{(xmLOHDK2p{inv`xZv2hzKDo2KTAiJmBmV4j$&hYaD=Tp*>mUqIt^)K!IOoG60w2# zR@=^O4P`Y=>~1nX{A#xUpX(p4)^GiHW%1edbMsY`r{oxV9ovzsnp{?YCb{4Cnl}4R z|K+0IR-RL0RO=qx+mw1bPwd&+#50qO!``=k53BxDyU*JqV{OQuH8Z{~Y7LxwqW{#V z*Dns8k$-*gQG$`qu}KXjiEIZRNE}$jRA#$WBtw_&eCUiLhc+`tv1xjoRJ|V%TDp0I z|0xsDaj6eJL&Jwpt4>^+mH0kT3<;&ZaZ}ssJt#$7^`tM;^wO?)N>C4Ws zhjxAKj{KhL7kyIYo_@)B{~5b>@BUsT@noGE%kft6xE)^G@6IZXb~92d-}C0!n#0GZ zeu$e_6S`#g1iU*eC6h!E@XJKE@oQno4ka}j0`(&gy(O&8J>Uoi_H&B!(^*< zJr{NvYWH-V+OX!&@p;n!F7f`asG7ea@9Cs0?wN(j$5sC3e0uJB>GgAATm5}M9&zW) z+7KKO5wY_1IiLNy+G70^e+o;?oU-!62kpOiY^Pt3U9q2-I%$=ap7XnIIkaef7Tk z>$z8j-l~dJ+s{r15sfuqsw3YyFZZvLPDXMciEXTiGbeC+vO zf8VHE&z2+kq;SI$_Q{@2n>J}VW=rhWHPQO`7oWW+To| z)`fbRWhc68w}#!^>TtU*|KdCAzR<#VPJMIof>(t(*ll-xz3F&1_m*|f{^T)>|7rNU zH~;(heLwmyd~Q($%?ZNrg6d#Gc#*p<)dp zC-XG!aUJ-7k11?w@_MeweQRw3QH6;Qbjs@ z-tIZP<<@!m^Gggl@2*``?I(C_ZF)%a@yE-S&#TIcjg7sV-xRj0{>NeYeYfx2xifi> zj|CmO0Prqo= z-ssn)w)@jE>CH>#zSt}mzd~(tbgA6=WbYce^_R3HuCYFNvcPlBYL(|H<}=u*70u4z z^w@J!Vlw+d-XqctCjKi@r>EW4=)I7^`O7ftQq8Q;3tL+f?oZ#7b2akEUcR>yUn9)~ z85-JC4#oFb#w32)wdcdd&mYey*=aGHem8+@u~NudX)m?8`G(3ZpILfhy=TraSjS@i zYt7U5r#7bT+PzzzFK8wo56_;+(9o~OAD>TbPVFWfIL_x}%S z=tpyNafuz{|B@zWQSjiH`Td&D+UkCDDxN$!IoUczd(r0f^JO37m*!4xZJpYbcjnKD z*NrEmm^R&sn>S}_YEpxF<)gKwiUlhzuFLPc?{}nnOY=nU$DcjJgBZmpRNP*4^mf`K z-Ujyn)x3;Wd5z6~XPo`TbJ+0J>NT0ykMo94oWjVE@?yu~RoUBL`CJiZU3k=IhIZXt zmAE-&@ynwAv<04)Tv%Oq=>3@)hL0aUeE3jmEz`a0DdK6?Wp8e1^z5$PtfjtL@4kz# z@7de8KJUMDbdgf@ttr!|pYNO=m|9p^_;ZQpUU0TW$PlWtCm$N-R>O#sZe%H|K z*5h|)u&&q?64(3Uso$l`@6Pa){h0l9$=c1)E#Em!w~Mm3BMd z!Qt8W_Re|gt9MPf-q(s|9rVLEQ>XQ~RXnPk*?{^ew&vip-IE~lNDXIq^W zzCP~nru)Ktpq0^WUteFZSGd!AcybJ%+tbN&TqMftk9LXXevG!de5g*+TLE? z-pkLBrleNoFUQ*6%jtz7$%cD_1}N`Q4c_-~5>U$lUkVf#scE zpI`CJ7f@g4pei{zo_%JKt@@+2PJb#V+|4<1d-JXToFCZ~F8?nr$rRHo`k#2^{_lSb zdhToM{=Zm$@Wj?IjiO1(S9LG+dE3u#eaxaP+nF31b)11=lg~Bgz4@PJ+4N7l+nWC^ z=l|^9+C2wr7dIYK_S}9lIOJa4jV~)7Cq`f1oc%lfc)nY!Z+Uc5lD2^2o9I&#Q+H0@ zG=BphpNvI7>1AJY+sD_B9I}4DXYgXK$BB06>yC*c;uxxGFhL^5; zPP&{?d;~fbMqWKcMOJ=F=5cPNmxWeOSf$%7$`}})ELKoSJ2uH!(f3S@&biR2*`Ybo zs;O_Zw)RHVzc?MsG5JYjp6s0c_pes+szBC+m$%OPM;%85kyRuu_8ks)HV?LbD^Wc*+M$mjpMi8*)ww1n(2$VKDne;x$G7V4GldnZ&9$| zvcGORXk*gX&(F@@)?OnVu~IGVOY*{qty2Pz{&4Z}DX)K1R#5Qa`($(}1LTYchaa;sFg$QjQTV*_SkfZ%mZ$mV$9e?5JwDCReB94& zag>i?^X(g-o}Ru9nlsYx@9Qgjy6HmF#)$jX@As-tHadG~m$b!twW|kTuX5KU+1O zFaOStk8O>Ojm$eWwm*FM@SAvi&Btrn>vlZKe5ki_QGRIh^b|v{Q!5TtE=oI;|Lyzt z?d_UvzkmJuVwfWayDx&lcbl+r7T5az&|h_Tmba}6`aL-~Yqo*kgcqj|tqSdp-N`xm zz3`#Ppfd)N8*6`mn+G~~Aum6F{pqmRk~h7c9qAPA7ZDY`8xS1)d0WA>35Kz3iE}4x z@;Y^6>mtM2`yU@4cNRT-_wL=dnnzTj{(7=CMXv(5uC)tgPJrb1Xh?@R^gcYR#`-zrL-D-k$f+RXp~Ka-!XZ zJ&{dE*BtGcb*OxXYWbWkTLSCil!&?U-v& z`sU9SeeT7Jj9#?b8EM_pzV_w5!kWoEX=|-o3e4NulQ!$Exz>L3mtoDjz2EOemwr4d zzFtdDFK$+zpPO@2Tz|f5 zWB>-nGN+{M)ZxxgsO>QZ@OK=b0C$J!VXqo)qXO_%fZ2s<*#NRstr=R>-9Ed*K?yN`!G+5 zqfe~gB>8ULQ97xk@KTW5SA({$RAqVdDK=$MSC8*>+~5mh$Dwth_wF5}xYUFbz;ra z>pLR;J(=vkulyjZ_#N3T5@k1|)PfCRhw?Rwo_&;W`SzR-$Lw{B&hd1bulm0!Ve6uf zMGHi>tm@kL{(sJoZ`=F&__&_0P1V_d>2T@7dcVStx81(q-EyGtvX`rc#(EzfyZK&~ zk;gu)3|?NhyXNPo3Lfpo&W8~?*S;TM=D$<-;en&M;hHp!Ht?xr3=9errpWx878&Gb zU$HB3^-S|^em`H$;a2W-)O=BH*K;-Y``gRsxxef3ww&;p9^f~b*Dr5v)X5#4hF2d) zuRnFlQ&RQ*_O6GYzu&%fD{tMJHFspENPvz$+;v)i{~pU;iDg@%UTfI1{K<#!m!uqG z?Zl_(o%I2oYf#y`?QX+MxBk6R|GT=srj}-l#&>Oy`|QT?I%Ue`mZ`IzTA0mNN-Ml` z`}S>%(pMq(k8ki4Ppj*IU2DWKC1YCsdC%37t~a)ONmT3XHrc&w(}Q0bE@wVuGxqm% zeUtxF^CPZV@5~yu)#6Iku@0Jg*CrPj_?N9!>3J6a-)=jn)aLhJ7X1-nKW{BN-A(>* zQbNLmUg`WjAAe<-yt*$TCz)CQ;UN2a(-()%=p&*?@a)0-sI7-KRQ+#JIT!8j-u~-+ z$KN{Nb0?OZ`97cCI`U78H?Q^|CDVsfp*~Z`-f%Oq&=xz2=Z! z+uvDpCVI}C9$&Y!?Cq_sa~V5f;rGFIziOJ$_OiA7$9T8>o4+>Q|HsOwJ)S|w@)}Au z=PlS|tLJXTDYf{#)!cZ~qt7?pjh#06Nzdf-ecg%sRnt?xr*2x>qo?`U#B%a$3D7~9 zp!|Km>)DI)xm#2={JPU}+huzix4raS!<7yzPlYzllM4BM$}p8@lF`bt=c+ZE`rgC^ z2mO#+etJ#ShkriPdqYp_yBp5&I2TiV*3`JGtE))t@ZZ0GtM`9hn}2uqmD-uF45s}R zI}Eaffq~(Hb(eqL^)0H6d0jW|$nUOw`a3vpUU}h?z`!F{a&#xG>e~1Jx5l=2yYlDP z#YKdtv9Da(IO*8ymB+$%af+Mr7~X+3Q;5WhS(Fl+n)>v!*+%bdNvJIz zfhO(y-)`|XR-Z3f{{Lir-=5pWQGZGTr$wFrGB2$B&*}5++1KAn*yyYgHgsHjA>dg3px9~To76!hu(%s7FYUe6A)%kTNSZudK`Y#z`NrJ$2+ z^)>8%*Y0k-a&}qA&ByN7M9%-bbg0R9>CsbK>(k@PqQBkAKbLoRM{z*k;fXPpvYRV& z!e+ir+wfcANcZjUt0n8|6_P8SpPO5pxBKlj-{56FD?jdH?e#hF=Jxjd?AqGe<&H7C zIv+1M0y;DoL+2Z^5>YmeIM@g>lN$LQ=b+&Z8W(mDJLbk zw*FP;+rQhz-QzACn`pRtMVZmMo=EOyg^-NrMr9%L)0;0#gylS{IFy}zecjw`iHF-} zMQ%=8tEH#sXW7Qi&K_<5@5f{2=mKbKz@kF(tyvT{z4$|@zn)GWu4DelUPY(5@dYETrUUQr7(g8!}$M>Dy}e z`PfY}T}kDYaz0Kii=C{c3zx8E{Ct}f!6D8mx%m7^m9ulp??r|N25#K4Wy=4Blm( z>Iz)C`QN_TTsh{Vx6;nH+HSidpp$ zBWrK}cH3SyMGxL!-CAXI``zY4&n#Qg zZ*zI^Snu5075)eomp&Sdv(1k_**MuNZ}snA&*y|#Sg+h*_Ih2<5}$v0@s7QTtAE2& zp2ZTDl7DwX@}lpSN3n%sj*d=M(F1M+YR&uz(dm)29fWT|enqao&ndo99nVpS(A7 zhXsJc2~EYh`KsKfXM1@|Xl-_ci^~OnO87U`WZ&sb)h(|sRv$3)fJ=2~R_>6A)7d<0 z;rFK8iLgShK_EC{Ue5w0X}Hf4m|9am^N8M5fO&;sn#eTM)R3fRm>zJX4QisH=IehZ Z9)|h$7r*f=Q2z^ZtEa1<%Q~loCIBeGr-1+f literal 0 HcmV?d00001 diff --git a/data/interfaces/default/js/jquery-cron-min.js b/data/interfaces/default/js/jquery-cron-min.js new file mode 100644 index 00000000..87aa765a --- /dev/null +++ b/data/interfaces/default/js/jquery-cron-min.js @@ -0,0 +1 @@ +!function(e){function t(e){return"undefined"==typeof e?!1:!0}function n(e){return!t(e)||"object"==typeof e}function s(n,s){if(t(s.customValues))for(key in s.customValues)if(n==s.customValues[key])return key;var a=/^((\d{1,2}|\*)\s){4}(\d{1,2}|\*)$/;if("string"!=typeof n||!a.test(n))return void e.error("cron: invalid initial value");for(var i=n.split(" "),r=[0,0,1,1,0],l=[59,23,31,12,6],c=0;c=r[c]))return void e.error("cron: invalid value found (col "+(c+1)+") in "+o.initial)}for(var u in k)if(k[u].test(n))return u;return void e.error("cron: valid but unsupported cron format. sorry.")}function a(o,a){if(!t(s(a.initial,a)))return!0;if(!n(a.customValues))return!0;if(t(a.customValues))for(key in a.customValues)if(k.hasOwnProperty(key))return e.error("cron: reserved keyword '"+key+"' should not be used as customValues key."),!0;return!1}function i(e){var t=e.data("block"),o=hour=day=month=dow="*",n=t.period.find("select").val();switch(n){case"minute":break;case"hour":o=t.mins.find("select").val();break;case"day":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val();break;case"week":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val(),dow=t.dow.find("select").val();break;case"month":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val(),day=t.dom.find("select").val();break;case"year":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val(),day=t.dom.find("select").val(),month=t.month.find("select").val();break;default:return n}return[o,hour,day,month,dow].join(" ")}for(var r={initial:"* * * * *",minuteOpts:{minWidth:100,itemWidth:30,columns:4,rows:void 0,title:"Minutes Past the Hour"},timeHourOpts:{minWidth:100,itemWidth:20,columns:2,rows:void 0,title:"Time: Hour"},domOpts:{minWidth:100,itemWidth:30,columns:void 0,rows:10,title:"Day of Month"},monthOpts:{minWidth:100,itemWidth:100,columns:2,rows:void 0,title:void 0},dowOpts:{minWidth:100,itemWidth:void 0,columns:void 0,rows:void 0,title:void 0},timeMinuteOpts:{minWidth:100,itemWidth:20,columns:4,rows:void 0,title:"Time: Minute"},effectOpts:{openSpeed:400,closeSpeed:400,openEffect:"slide",closeEffect:"slide",hideOnMouseOut:!0},url_set:void 0,customValues:void 0,onChange:void 0,useGentleSelect:!1},l="",c=0;60>c;c++){var d=10>c?"0":"";l+="\n"}for(var u="",c=0;24>c;c++){var d=10>c?"0":"";u+="\n"}for(var m="",c=1;32>c;c++){if(1==c||21==c||31==c)var h="st";else if(2==c||22==c)var h="nd";else if(3==c||23==c)var h="rd";else var h="th";m+="\n"}for(var p="",v=["January","February","March","April","May","June","July","August","September","October","November","December"],c=0;c"+v[c]+"\n";for(var f="",y=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=0;c"+y[c]+"\n";for(var g="",b=["minute","hour","day","week","month","year"],c=0;c"+b[c]+"\n";var O={minute:[],hour:["mins"],day:["time"],week:["dow","time"],month:["dom","time"],year:["dom","month","time"]},k={minute:/^(\*\s){4}\*$/,hour:/^\d{1,2}\s(\*\s){3}\*$/,day:/^(\d{1,2}\s){2}(\*\s){2}\*$/,week:/^(\d{1,2}\s){2}(\*\s){2}\d{1,2}$/,month:/^(\d{1,2}\s){3}\*\s\*$/,year:/^(\d{1,2}\s){4}\*$/},w={init:function(o){var n=o?o:{},s=e.extend([],r,n),i=e.extend({},r.effectOpts,n.effectOpts);if(e.extend(s,{minuteOpts:e.extend({},r.minuteOpts,i,n.minuteOpts),domOpts:e.extend({},r.domOpts,i,n.domOpts),monthOpts:e.extend({},r.monthOpts,i,n.monthOpts),dowOpts:e.extend({},r.dowOpts,i,n.dowOpts),timeHourOpts:e.extend({},r.timeHourOpts,i,n.timeHourOpts),timeMinuteOpts:e.extend({},r.timeMinuteOpts,i,n.timeMinuteOpts)}),a(this,s))return this;var c=[],d="",h=s.customValues;if(t(h))for(var v in h)d+="\n";c.period=e("Every ").appendTo(this).data("root",this);var y=c.period.find("select");return y.bind("change.cron",S.periodChanged).data("root",this),s.useGentleSelect&&y.gentleSelect(i),c.dom=e(" on the ").appendTo(this).data("root",this),y=c.dom.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.domOpts),c.month=e(" of ").appendTo(this).data("root",this),y=c.month.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.monthOpts),c.mins=e(" at minutes past the hour ").appendTo(this).data("root",this),y=c.mins.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.minuteOpts),c.dow=e(" on ").appendTo(this).data("root",this),y=c.dow.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.dowOpts),c.time=e(" at : Enable the newsletter + + + +
+ +
+
+
+ +
+
+

Set the schedule for the newsletter

+
+ +
+ + + % for item in newsletter['config_options']: + % if item['input_type'] == 'help': +
+ +

${item['description'] | n}

+
+ % elif item['input_type'] == 'text' or item['input_type'] == 'password': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % elif item['input_type'] == 'number': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % elif item['input_type'] == 'button': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % elif item['input_type'] == 'checkbox': +
+ +

${item['description'] | n}

+ +
+ % elif item['input_type'] == 'select': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % endif + % endfor +
+
+
+ +
+
+ +
+
+

Optional: Enter a description to help identify this newsletter in the newsletters list.

+
+
+ + +
+ +

+ Preview the ${newsletter['agent_label']} newsletter. +

+
+
+
+ +
+
+
+ +

+ Test if the ${newsletter['agent_label']} newsletter is working. Check the logs for troubleshooting. +

+
+
+
+ +
+
+
+
+ + + + + + + + + + +% else: + +% endif diff --git a/data/interfaces/default/newsletters_table.html b/data/interfaces/default/newsletters_table.html new file mode 100644 index 00000000..0ef4883f --- /dev/null +++ b/data/interfaces/default/newsletters_table.html @@ -0,0 +1,42 @@ +<%doc> +USAGE DOCUMENTATION :: PLEASE LEAVE THIS AT THE TOP OF THIS FILE + +For Mako templating syntax documentation please visit: http://docs.makotemplates.org/en/latest/ + +Filename: newsletters_table.html +Version: 0.1 + +DOCUMENTATION :: END + + +
    + % for newsletter in sorted(newsletters_list, key=lambda k: (k['agent_label'], k['friendly_name'], k['id'])): + + % endfor +
  • + + Add a new newsletter agent + + +
  • +
+ + \ No newline at end of file diff --git a/data/interfaces/default/notifier_config.html b/data/interfaces/default/notifier_config.html index a70fc5d4..955e97af 100644 --- a/data/interfaces/default/notifier_config.html +++ b/data/interfaces/default/notifier_config.html @@ -7,8 +7,6 @@ sorted(user_emails, key=lambda u: u['user']) %> % if notifier: - -